From bc17acfa5d58b3584c16b9f4303c8831791b4eb0 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Tue, 15 Sep 2026 04:22:56 -0700 Subject: [PATCH 001/191] refactor(errors): unify semantic error classification (#14395) Signed-off-by: Biswa Panda --- lib/backend-common/src/adapter.rs | 2 +- .../tests/cancellation/test_cancellation.py | 4 +- lib/llm/src/http/service/anthropic.rs | 45 +- lib/llm/src/http/service/openai.rs | 92 +- lib/llm/src/migration.rs | 255 ++- .../src/protocols/openai/chat_completions.rs | 4 +- lib/llm/src/protocols/openai/validate.rs | 6 +- lib/llm/tests/http-service.rs | 1 + lib/runtime/src/error.rs | 1430 ++++++++++++++--- lib/runtime/src/pipeline/network.rs | 73 +- .../network/egress/addressed_router.rs | 51 +- .../src/pipeline/network/egress/route_span.rs | 34 +- .../pipeline/network/ingress/push_handler.rs | 12 +- 13 files changed, 1651 insertions(+), 358 deletions(-) diff --git a/lib/backend-common/src/adapter.rs b/lib/backend-common/src/adapter.rs index ac5bc8af449b..e102949c0659 100644 --- a/lib/backend-common/src/adapter.rs +++ b/lib/backend-common/src/adapter.rs @@ -865,7 +865,7 @@ mod tests { let input = Context::new(make_request(vec![1])); let err = adapter.generate(input).await.unwrap_err(); let msg = err.to_string(); - assert!(msg.contains("BackendInvalidArgument"), "got: {msg}"); + assert!(msg.contains("InvalidRequest"), "got: {msg}"); assert!(msg.contains("bad param"), "got: {msg}"); } diff --git a/lib/bindings/python/tests/cancellation/test_cancellation.py b/lib/bindings/python/tests/cancellation/test_cancellation.py index 35a21ac581aa..9171e015b6ac 100644 --- a/lib/bindings/python/tests/cancellation/test_cancellation.py +++ b/lib/bindings/python/tests/cancellation/test_cancellation.py @@ -315,7 +315,7 @@ async def test_server_context_cancel(temp_file_store, server, client): # Verify the expected cancellation exception is received # TODO: Should this be a asyncio.CancelledError? assert str(e).startswith( - "Disconnected: Stream ended before generation completed" + "Unavailable: Stream ended before generation completed" ) # Verify server context cancellation status @@ -342,7 +342,7 @@ async def test_server_raise_cancelled(temp_file_store, server, client): # Verify the expected cancellation exception is received # TODO: Should this be a asyncio.CancelledError? assert "CancelledError" in str(e) - assert "BackendCancelled" in str(e) + assert str(e).startswith("Cancelled: CancelledError") # Verify server context cancellation status # TODO: Server to gracefully stop the stream? diff --git a/lib/llm/src/http/service/anthropic.rs b/lib/llm/src/http/service/anthropic.rs index 992ce1ff112f..ce7ce024a632 100644 --- a/lib/llm/src/http/service/anthropic.rs +++ b/lib/llm/src/http/service/anthropic.rs @@ -1229,22 +1229,16 @@ fn anthropic_sanitized_error_with_details( .into_response() } -/// Match `InvalidArgument` at top-level OR under `Backend()` anywhere in the -/// error chain. Request validation surfaces `InvalidArgument`, while backends -/// that reject bad input (e.g. Python `ValueError`/`TypeError` wrapped by -/// `py_err_to_dynamo`) surface `Backend(InvalidArgument)`; both are client -/// input errors and warrant an HTTP 400 rather than a generic 500. +/// Find a request or backend invalid-argument error anywhere in the chain. fn find_invalid_argument_in_chain<'a>( err: &'a (dyn std::error::Error + 'static), ) -> Option<&'a dynamo_runtime::error::DynamoError> { - use dynamo_runtime::error::{BackendError, ErrorType}; - let mut current = Some(err); while let Some(error) = current { if let Some(dynamo_error) = error.downcast_ref::() && matches!( - dynamo_error.error_type(), - ErrorType::InvalidArgument | ErrorType::Backend(BackendError::InvalidArgument) + dynamo_error.reason().as_str(), + "backend.invalid_argument" | "request.invalid_argument" ) { return Some(dynamo_error); @@ -1437,19 +1431,32 @@ mod tests { #[test] fn anthropic_invalid_argument_is_found_through_error_context() { - use dynamo_runtime::error::{DynamoError, ErrorType}; - - let error = anyhow::Error::new( - DynamoError::builder() - .error_type(ErrorType::InvalidArgument) - .message("invalid request") - .build(), - ) - .context("request validation failed"); + use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; + + let original = DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::InvalidArgument)) + .message("invalid request") + .build(); + let wire = serde_json::to_value(original).unwrap(); + let normalized: DynamoError = serde_json::from_value(wire).unwrap(); + assert_eq!( + normalized.error_type(), + ErrorType::Backend(BackendError::InvalidArgument) + ); + assert_eq!(normalized.class(), ErrorType::InvalidRequest); + let error = anyhow::Error::new(normalized).context("request validation failed"); assert_eq!( - find_invalid_argument_in_chain(error.as_ref()).map(|error| error.message()), + find_invalid_argument_in_chain(error.as_ref()).map(DynamoError::message), Some("invalid request") ); + + let private_error = anyhow::Error::new( + DynamoError::builder() + .error_type(ErrorType::InvalidRequest) + .message("private diagnostic") + .build(), + ); + assert!(find_invalid_argument_in_chain(private_error.as_ref()).is_none()); } } diff --git a/lib/llm/src/http/service/openai.rs b/lib/llm/src/http/service/openai.rs index a19c0ffec17f..c0e69c52a161 100644 --- a/lib/llm/src/http/service/openai.rs +++ b/lib/llm/src/http/service/openai.rs @@ -272,20 +272,20 @@ fn responses_error_code(status_code: StatusCode) -> &'static str { } } -/// Match `InvalidArgument` at top-level OR under `Backend()`. -/// `py_err_to_dynamo` wraps Python `ValueError`/`TypeError` as -/// `Backend(InvalidArgument)`; both variants are 400-worthy. +fn is_invalid_argument(error: &dynamo_runtime::error::DynamoError) -> bool { + matches!( + error.reason().as_str(), + "backend.invalid_argument" | "request.invalid_argument" + ) +} + pub(crate) fn find_invalid_argument_in_chain<'a>( err: &'a (dyn std::error::Error + 'static), ) -> Option<&'a dynamo_runtime::error::DynamoError> { - use dynamo_runtime::error::{BackendError, ErrorType}; let mut current = Some(err); while let Some(e) = current { if let Some(dynamo_err) = e.downcast_ref::() - && matches!( - dynamo_err.error_type(), - ErrorType::InvalidArgument | ErrorType::Backend(BackendError::InvalidArgument) - ) + && is_invalid_argument(dynamo_err) { return Some(dynamo_err); } @@ -2399,16 +2399,12 @@ fn extract_backend_error_if_present( if let Some(event_type) = &event.event && event_type == "error" { - use dynamo_runtime::error::{BackendError, ErrorType}; - // Classify only this event's error, not its causes. An inner invalid // argument must not override an outer unavailable or internal error. - let invalid_argument = event.error.as_ref().filter(|error| { - matches!( - error.error_type(), - ErrorType::InvalidArgument | ErrorType::Backend(BackendError::InvalidArgument) - ) - }); + let invalid_argument = event + .error + .as_ref() + .filter(|error| is_invalid_argument(error)); // Extract error string: prefer DynamoError field, fallback to legacy comment. // Use message() instead of to_string() for DynamoError to avoid prefixing @@ -5275,6 +5271,36 @@ mod tests { const BACKUP_ERROR_MESSAGE: &str = "Failed to generate completions"; + #[test] + fn wire_normalized_invalid_request_is_found_through_error_context() { + use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; + + let original = DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::InvalidArgument)) + .message("invalid request") + .build(); + let wire = serde_json::to_value(original).unwrap(); + let normalized: DynamoError = serde_json::from_value(wire).unwrap(); + assert_eq!( + normalized.error_type(), + ErrorType::Backend(BackendError::InvalidArgument) + ); + + let error = anyhow::Error::new(normalized).context("request validation failed"); + assert_eq!( + find_invalid_argument_in_chain(error.as_ref()).map(DynamoError::message), + Some("invalid request") + ); + + let private_error = anyhow::Error::new( + DynamoError::builder() + .error_type(ErrorType::InvalidRequest) + .message("private diagnostic") + .build(), + ); + assert!(find_invalid_argument_in_chain(private_error.as_ref()).is_none()); + } + fn binary_pooling_response() -> NvCreatePoolingResponse { NvCreatePoolingResponse { id: "pool-request".to_string(), @@ -7344,21 +7370,37 @@ mod tests { use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; use futures::stream; - for error_type in [ - ErrorType::InvalidArgument, - ErrorType::Backend(BackendError::InvalidArgument), + let wire = serde_json::to_value( + DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::InvalidArgument)) + .message("unsupported JSON schema keyword") + .build(), + ) + .unwrap(); + let normalized: DynamoError = serde_json::from_value(wire).unwrap(); + assert_eq!( + normalized.error_type(), + ErrorType::Backend(BackendError::InvalidArgument) + ); + assert_eq!(normalized.class(), ErrorType::InvalidRequest); + + for error in [ + DynamoError::builder() + .error_type(ErrorType::InvalidArgument) + .message("unsupported JSON schema keyword") + .build(), + DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::InvalidArgument)) + .message("unsupported JSON schema keyword") + .build(), + normalized, ] { let error_event = Annotated:: { data: None, id: None, event: Some("error".to_string()), comment: None, - error: Some( - DynamoError::builder() - .error_type(error_type) - .message("unsupported JSON schema keyword") - .build(), - ), + error: Some(error), }; let result = check_for_backend_error( diff --git a/lib/llm/src/migration.rs b/lib/llm/src/migration.rs index 2949e2a448df..bb13915d19ce 100644 --- a/lib/llm/src/migration.rs +++ b/lib/llm/src/migration.rs @@ -25,14 +25,12 @@ use crate::{ }; use dynamo_runtime::engine::Data; -use dynamo_runtime::error::{self, BackendError, DynamoError, ErrorType}; +use dynamo_runtime::error::{self, DynamoError, ErrorReason, ErrorType}; use dynamo_runtime::metrics::prometheus_names::frontend_service; use dynamo_runtime::pipeline::{ AsyncEngineContext, AsyncEngineContextProvider, Context, ManyOut, Operator, PipelineOperator, ResponseStream, ServerStreamingEngine, SingleIn, async_trait, attach_first_response_guard, - network::egress::route_span::{ - RouteTraceContext, attach_route_trace_context, error_type_from_chain, error_type_name, - }, + network::egress::route_span::{RouteTraceContext, attach_route_trace_context, error_type_name}, }; use dynamo_runtime::protocols::annotated::Annotated; @@ -72,39 +70,54 @@ impl HasTokenIds for LLMEngineOutput { } } -/// Error types that make a request non-migratable wherever they appear in the -/// chain. -/// -/// Module-level rather than local to [`is_migratable`] so that it can be -/// compared against `MIGRATION_SENSITIVE_ERROR_TYPES` in -/// `lib/runtime/src/pipeline/network/egress/addressed_router.rs`, which must -/// hold the same set: that module withholds exactly these types from the cause -/// it attaches to a pre-stream failure, so that attaching a cause cannot change -/// migration. `migration_sensitive_types_match_the_exclusion_set` in this file -/// fails if the two ever disagree. -const NON_MIGRATABLE: &[ErrorType] = &[ErrorType::Cancelled, ErrorType::ResourceExhausted]; +const MIGRATION_BLOCKING_REASONS: &[&str] = &[ + "request.cancelled", + "backend.cancelled", + "capacity.exhausted", + "capacity.pool_exhausted", +]; + +fn blocks_migration(reason: &ErrorReason) -> bool { + MIGRATION_BLOCKING_REASONS.contains(&reason.as_str()) +} + +fn is_migration_eligible(reason: &ErrorReason) -> bool { + matches!( + reason.as_str(), + "transport.cannot_connect" + | "transport.disconnected" + | "transport.connection_timeout" + | "backend.cannot_connect" + | "backend.disconnected" + | "backend.connection_timeout" + | "backend.response_timeout" + | "backend.engine_shutdown" + | "backend.stream_incomplete" + | "backend.worker_unavailable" + | "capacity.worker_overloaded" + ) +} + +fn migratable_error_in_chain<'a>(err: &'a (dyn StdError + 'static)) -> Option<&'a DynamoError> { + let mut migratable = None; + let mut current = Some(err); + while let Some(source) = current { + if let Some(error) = source.downcast_ref::() { + if blocks_migration(error.reason()) { + return None; + } + if is_migration_eligible(error.reason()) { + migratable.get_or_insert(error); + } + } + current = source.source(); + } + migratable +} /// Check if an error chain indicates the request should be migrated. fn is_migratable(err: &(dyn StdError + 'static)) -> bool { - const MIGRATABLE: &[ErrorType] = &[ - ErrorType::CannotConnect, - ErrorType::Disconnected, - ErrorType::ConnectionTimeout, - // a stalled/frozen worker's stream-inactivity timeout surfaces - // as ResponseTimeout (push_router fault detection quarantines the worker - // via the same signal); migrate instead of hanging to the stream timeout. - ErrorType::ResponseTimeout, - ErrorType::Backend(BackendError::EngineShutdown), - // A truncated stream from a departed worker is recoverable by failover. - ErrorType::Backend(BackendError::StreamIncomplete), - // One overloaded worker: another may have room. Pool-wide exhaustion is - // ResourceExhausted below and stays non-migratable. - ErrorType::WorkerOverloaded, - // One worker answered that it no longer serves this instance: another - // may. Pool-wide absence is Unavailable and is not a worker fault. - ErrorType::WorkerUnavailable, - ]; - error::match_error_chain(err, MIGRATABLE, NON_MIGRATABLE) + migratable_error_in_chain(err).is_some() } /// Whether a worker-scoped failure can be retried without violating an explicit route. @@ -408,17 +421,24 @@ where if let Some(err) = response.error.as_ref() && is_migratable_for_request(&self.request, err) { + let Some(migration_error) = migratable_error_in_chain(err) else { + tracing::warn!(error = %err, "Migration eligibility had no semantic error"); + continue; + }; if self.retries_left == 0 { let route_trace = self.active_route_trace.clone(); self.record_migration_exhausted(MigrationCause { - reason: err.error_type(), + reason: migration_error.error_type(), from_worker_id: route_trace .as_deref() .and_then(RouteTraceContext::selected_worker_id), attempt: self.failed_attempt(route_trace.as_deref()), }); } else { - self.queue_migration(err.error_type(), self.active_route_trace.clone()); + self.queue_migration( + migration_error.error_type(), + self.active_route_trace.clone(), + ); } tracing::warn!(error = %err, "Stream disconnected, recreating stream"); self.metrics.inc_migration_ongoing_request(&self.model_name); @@ -543,7 +563,11 @@ where return Ok(()); } Err(err) if is_migratable_for_request(&self.request, err.as_ref()) => { - let reason = error_type_from_chain(err.as_ref()); + let Some(migration_error) = migratable_error_in_chain(err.as_ref()) else { + tracing::warn!(error = %err, "Migration eligibility had no semantic error"); + return Err(err); + }; + let reason = migration_error.error_type(); if migration_event.is_none() { migration_event = Some(MigrationEvent::new( frontend_service::migration_type::NEW_REQUEST, @@ -721,7 +745,7 @@ mod tests { GuidedDecodingOptions, OutputOptions, SamplingOptions, StopConditions, preprocessor::RoutingHints, timing::RequestTracker, }; - use dynamo_runtime::error::{DynamoError, ErrorType}; + use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; use dynamo_runtime::pipeline::AsyncEngine; use dynamo_runtime::pipeline::context::Controller; use dynamo_runtime::protocols::maybe_error::MaybeError; @@ -760,24 +784,29 @@ mod tests { ); } - // is_migratable short-circuits on any chain member, so an attached cause - // decides. pre_stream_failure_error withholds these types, so this migrates. + // Migration short-circuits on any blocking semantic reason in the chain, so + // pre_stream_failure_error must withhold those reasons before attaching a cause. #[test] fn pre_stream_failure_with_migration_sensitive_cause_is_still_migratable() { use dynamo_runtime::pipeline::network::StreamPrologueError; - use dynamo_runtime::pipeline::network::egress::addressed_router::testing::{ - migration_sensitive_error_types, pre_stream_failure_error, - }; + use dynamo_runtime::pipeline::network::egress::addressed_router::testing::pre_stream_failure_error; - for &error_type in migration_sensitive_error_types() { + for &(error_type, reason) in &[ + (ErrorType::Cancelled, "request.cancelled"), + ( + ErrorType::Backend(BackendError::Cancelled), + "backend.cancelled", + ), + (ErrorType::ResourceExhausted, "capacity.pool_exhausted"), + (ErrorType::CapacityExhausted, "capacity.exhausted"), + ] { let worker_error = DynamoError::builder() .error_type(error_type) + .reason(ErrorReason::new(reason).unwrap()) .message("no capacity on the downstream worker") .build(); - // Sanity: the cause alone is genuinely non-migratable, so a naive - // attach really would flip the classification. - assert!(!is_migratable(&worker_error), "{error_type:?} setup"); + assert!(!is_migratable(&worker_error), "{reason} setup"); let err = pre_stream_failure_error(StreamPrologueError::new( format!("Generate Error: {worker_error}"), @@ -785,12 +814,14 @@ mod tests { )); assert!( is_migratable(&err), - "a {error_type:?} worker error must not make a pre-stream failure stop migrating" + "a {reason} worker error must not make a pre-stream failure stop migrating" + ); + assert!( + std::error::Error::source(&err).is_none(), + "a {reason} cause must be withheld" ); } - // The same holds one link down: match_error_chain walks the whole chain, - // so a nested excluded type short-circuits it just as an outer one does. let nested = DynamoError::builder() .error_type(ErrorType::Backend(BackendError::InvalidArgument)) .message("downstream worker rejected the request") @@ -805,36 +836,45 @@ mod tests { "Generate Error: downstream worker rejected the request", nested, )); - assert!( - is_migratable(&err), - "a nested ResourceExhausted must not make a pre-stream failure stop migrating" - ); + assert!(is_migratable(&err)); + assert!(std::error::Error::source(&err).is_none()); + + let worker_error = DynamoError::builder() + .error_type(ErrorType::WorkerOverloaded) + .reason(ErrorReason::new("capacity.worker_overloaded").unwrap()) + .message("selected worker is full") + .build(); + let err = pre_stream_failure_error(StreamPrologueError::new( + "Generate Error: selected worker is full", + worker_error, + )); + assert!(is_migratable(&err)); + let source = std::error::Error::source(&err) + .and_then(|source| source.downcast_ref::()) + .expect("worker-scoped cause must remain attached"); + assert_eq!(source.reason().as_str(), "capacity.worker_overloaded"); } - // dynamo-runtime cannot import NON_MIGRATABLE, so addressed_router.rs keeps - // a copy. This fails when the two drift, naming the missing entries. + // dynamo-runtime cannot import this module, so the addressed router keeps a copy. #[test] - fn migration_sensitive_types_match_the_exclusion_set() { - use dynamo_runtime::pipeline::network::egress::addressed_router::testing::migration_sensitive_error_types; + fn migration_sensitive_reasons_match_the_blocking_set() { + use dynamo_runtime::pipeline::network::egress::addressed_router::testing::migration_sensitive_error_reasons; - let router_types = migration_sensitive_error_types(); - let missing_from_router: Vec<_> = NON_MIGRATABLE + let router_reasons = migration_sensitive_error_reasons(); + let missing_from_router: Vec<_> = MIGRATION_BLOCKING_REASONS .iter() - .filter(|t| !router_types.contains(t)) + .filter(|reason| !router_reasons.contains(reason)) .collect(); - let missing_from_here: Vec<_> = router_types + let missing_from_here: Vec<_> = router_reasons .iter() - .filter(|t| !NON_MIGRATABLE.contains(t)) + .filter(|reason| !MIGRATION_BLOCKING_REASONS.contains(reason)) .collect(); assert!( missing_from_router.is_empty() && missing_from_here.is_empty(), - "NON_MIGRATABLE and MIGRATION_SENSITIVE_ERROR_TYPES must hold the same \ - set: a type excluded from migration but still attachable as a \ - pre-stream cause would stop that failure migrating. Missing from \ - MIGRATION_SENSITIVE_ERROR_TYPES in addressed_router.rs: \ - {missing_from_router:?}; missing from NON_MIGRATABLE here: \ - {missing_from_here:?}" + "MIGRATION_BLOCKING_REASONS and MIGRATION_SENSITIVE_ERROR_REASONS must match: \ + missing from addressed_router.rs: {missing_from_router:?}; \ + missing from migration.rs: {missing_from_here:?}" ); } @@ -1365,24 +1405,73 @@ mod tests { /// request that had a healthy worker available, or bounces a pool-wide /// rejection around until retries run out. #[test] - fn worker_overload_migrates_but_pool_exhaustion_does_not() { - let worker_busy = DynamoError::builder() - .error_type(ErrorType::WorkerOverloaded) - .message("Selected worker is overloaded, please retry later") + fn semantic_reasons_preserve_worker_scoped_migration() { + use dynamo_runtime::error::{ErrorClass, ErrorReason}; + + let cases = [ + ( + ErrorClass::CapacityExhausted, + "capacity.worker_overloaded", + true, + ), + ( + ErrorClass::CapacityExhausted, + "capacity.pool_exhausted", + false, + ), + (ErrorClass::Unavailable, "transport.disconnected", true), + (ErrorClass::Unavailable, "backend.unavailable", false), + ]; + + for (class, reason, expected) in cases { + let error = DynamoError::builder() + .class(class) + .reason(ErrorReason::new(reason).unwrap()) + .diagnostic("worker failure") + .build(); + assert_eq!(is_migratable(&error), expected, "reason: {reason}"); + } + } + + #[test] + fn migration_uses_inner_semantic_cause_and_preserves_exclusions() { + use dynamo_runtime::error::{ErrorClass, ErrorReason}; + + let disconnected = DynamoError::builder() + .class(ErrorClass::Unavailable) + .reason(ErrorReason::new("transport.disconnected").unwrap()) .build(); - assert!( - is_migratable(&worker_busy), - "one overloaded worker must fail over to another" + let wrapped = DynamoError::builder() + .error_type(ErrorType::Unknown) + .cause(disconnected) + .build(); + assert_eq!( + migratable_error_in_chain(&wrapped).map(DynamoError::error_type), + Some(ErrorClass::Unavailable) ); - let pool_exhausted = DynamoError::builder() - .error_type(ErrorType::ResourceExhausted) - .message("All workers are busy, please retry later") + let cancelled = DynamoError::builder() + .class(ErrorClass::Cancelled) + .reason(ErrorReason::new("request.cancelled").unwrap()) .build(); - assert!( - !is_migratable(&pool_exhausted), - "pool-wide exhaustion must not migrate; no worker has room" - ); + let conflicted = DynamoError::builder() + .class(ErrorClass::Unavailable) + .reason(ErrorReason::new("transport.disconnected").unwrap()) + .cause(cancelled) + .build(); + assert!(!is_migratable(&conflicted)); + + let exhausted = DynamoError::builder() + .class(ErrorClass::CapacityExhausted) + .reason(ErrorReason::new("capacity.exhausted").unwrap()) + .cause( + DynamoError::builder() + .class(ErrorClass::Unavailable) + .reason(ErrorReason::new("transport.disconnected").unwrap()) + .build(), + ) + .build(); + assert!(!is_migratable(&exhausted)); } /// Tests the normal case where the RetryManager successfully processes all responses diff --git a/lib/llm/src/protocols/openai/chat_completions.rs b/lib/llm/src/protocols/openai/chat_completions.rs index 392bcfdea157..24283c2b7796 100644 --- a/lib/llm/src/protocols/openai/chat_completions.rs +++ b/lib/llm/src/protocols/openai/chat_completions.rs @@ -976,7 +976,7 @@ mod tests { let err = ValidateRequest::validate(&request).expect_err("over-max stops must fail validation"); let expected = format!( - "InvalidArgument: Maximum of {} stop sequences allowed, got {}", + "InvalidRequest: Maximum of {} stop sequences allowed, got {}", MAX_STOP_SEQUENCES, MAX_STOP_SEQUENCES + 1 ); @@ -988,7 +988,7 @@ mod tests { let over_max_token_ids: Vec = (0..=MAX_STOP_SEQUENCES as u32).collect(); let expected_token_ids = format!( - "InvalidArgument: Maximum of {} stop token IDs allowed, got {}", + "InvalidRequest: Maximum of {} stop token IDs allowed, got {}", MAX_STOP_SEQUENCES, MAX_STOP_SEQUENCES + 1 ); diff --git a/lib/llm/src/protocols/openai/validate.rs b/lib/llm/src/protocols/openai/validate.rs index 233a6459cb32..1f5e04ba85d2 100644 --- a/lib/llm/src/protocols/openai/validate.rs +++ b/lib/llm/src/protocols/openai/validate.rs @@ -1069,7 +1069,7 @@ mod tests { assert_eq!( err.to_string(), format!( - "InvalidArgument: Maximum of {} stop sequences allowed, got {}", + "InvalidRequest: Maximum of {} stop sequences allowed, got {}", MAX_STOP_SEQUENCES, MAX_STOP_SEQUENCES + 1 ) @@ -1082,7 +1082,7 @@ mod tests { assert_eq!( err.to_string(), format!( - "InvalidArgument: Maximum of {} stop token IDs allowed, got {}", + "InvalidRequest: Maximum of {} stop token IDs allowed, got {}", MAX_STOP_SEQUENCES, MAX_STOP_SEQUENCES + 1 ) @@ -1098,7 +1098,7 @@ mod tests { assert_eq!( err.to_string(), format!( - "InvalidArgument: Maximum of {} stop token IDs allowed, got {}", + "InvalidRequest: Maximum of {} stop token IDs allowed, got {}", MAX_STOP_SEQUENCES, MAX_STOP_SEQUENCES + 1 ) diff --git a/lib/llm/tests/http-service.rs b/lib/llm/tests/http-service.rs index 1c4da582dae2..9f5e137fdf17 100644 --- a/lib/llm/tests/http-service.rs +++ b/lib/llm/tests/http-service.rs @@ -3208,6 +3208,7 @@ async fn test_images_worker_invalid_argument_maps_to_400_with_message() { let error = DynamoError::builder() .error_type(DynamoErrorType::InvalidArgument) .message("n must be in [1, 10], got 11") + .public_message("n must be in [1, 10], got 11") .build(); let engine: OpenAIImagesStreamingEngine = Arc::new(ErrorImagesEngine { error }); let (port, token, task) = start_images_service(engine).await; diff --git a/lib/runtime/src/error.rs b/lib/runtime/src/error.rs index b2f7fea43d00..87cbccd3595f 100644 --- a/lib/runtime/src/error.rs +++ b/lib/runtime/src/error.rs @@ -1,48 +1,106 @@ // SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -//! Dynamo Error System +//! Dynamo's shared semantic error contract. //! -//! This module provides a standardized error type for Dynamo with support for: -//! - Categorized error types via [`ErrorType`] enum -//! - Error chaining via the standard [`std::error::Error::source()`] method -//! - Serialization for network transmission via serde +//! A [`DynamoError`] describes **what failed**. It deliberately does not prescribe an HTTP status, retry action, stream action, or worker-health decision. Those decisions belong to the consumer that owns the relevant local state, such as response commitment, retry budget, replayability, deadline, and worker observations. //! -//! # DynamoError +//! The component closest to the cause classifies a failure once. Callers should propagate an existing [`DynamoError`] directly; internal transports preserve its semantic identity, and protocol boundaries render it for their clients. Generic conversion from an error chain recovers a typed non-internal semantic source, but it intentionally treats an unclassified or internal source as `Internal/runtime.unclassified`. See [DEP #14354](https://github.com/ai-dynamo/dynamo/issues/14354) for the architecture and rollout rationale. //! -//! [`DynamoError`] is the standardized error type for Dynamo. It can be created -//! directly or converted from any [`std::error::Error`]: +//! # Error identity //! -//! ```rust,ignore -//! use dynamo_runtime::error::{DynamoError, ErrorType}; +//! Every error has two identity fields: //! -//! // Simple error -//! let err = DynamoError::msg("something failed"); +//! - [`ErrorClass`] is the coarse, closed category used for exhaustive consumer policy. New producers should select a canonical class such as [`ErrorClass::InvalidRequest`] or [`ErrorClass::Unavailable`]. The older transport-specific variants are retained for compatibility and normalize through [`DynamoError::class`]. +//! - [`ErrorReason`] is a stable, bounded catalog key that identifies the specific cause. A reason belongs to exactly one normalized class. It is safe for low-cardinality policy and metric dimensions; arbitrary exception text and user input are not. //! -//! // Typed error with cause -//! let cause = std::io::Error::other("io error"); -//! let err = DynamoError::builder() -//! .error_type(ErrorType::Unknown) -//! .message("operation failed") -//! .cause(cause) +//! The builder and deserializer validate the class/reason pair. An unknown, malformed, or mismatched identity fails closed to `Internal/runtime.invalid_error`, and its public details are discarded. Consumers should therefore use [`DynamoError::class`], [`DynamoError::reason`], and [`DynamoError::public_details`] instead of reading the public fields directly. [`DynamoError::error_type`] exists for legacy policy only. +//! +//! ## Choosing a canonical class +//! +//! | Class | Use when | +//! |---|---| +//! | [`ErrorClass::InvalidRequest`] | The caller supplied malformed input or failed request-level validation. | +//! | [`ErrorClass::Unauthenticated`] | Authentication credentials are missing or invalid. | +//! | [`ErrorClass::PermissionDenied`] | The authenticated caller is not allowed to perform the operation. | +//! | [`ErrorClass::NotFound`] | A caller-visible resource does not exist. | +//! | [`ErrorClass::Conflict`] | The request conflicts with current resource state. | +//! | [`ErrorClass::PayloadTooLarge`] | The request exceeds an advertised size limit. | +//! | [`ErrorClass::UnsupportedMedia`] | The request uses an unsupported media type. | +//! | [`ErrorClass::RateLimited`] | A caller-specific admission or rate limit was exceeded. | +//! | [`ErrorClass::CapacityExhausted`] | Dynamo, a selected worker, or the eligible worker pool lacks capacity; the reason distinguishes worker overload from pool exhaustion. | +//! | [`ErrorClass::Cancelled`] | The request was cancelled, usually because the client disconnected. | +//! | [`ErrorClass::Unavailable`] | A service, worker, pool, or Dynamo-owned dependency is unavailable. | +//! | [`ErrorClass::BackendProtocol`] | A backend response violates the expected protocol. | +//! | [`ErrorClass::DeadlineExceeded`] | A request or attempt deadline expired. | +//! | [`ErrorClass::NotImplemented`] | A valid requested capability is unsupported. | +//! | [`ErrorClass::Internal`] | A defect, invalid classification, or otherwise unclassified failure occurred. | +//! +//! Similar symptoms do not necessarily have the same class. For example, malformed client input is [`ErrorClass::InvalidRequest`], invalid operator configuration is [`ErrorClass::Internal`], caller-specific throttling is [`ErrorClass::RateLimited`], and pool-wide capacity pressure is [`ErrorClass::CapacityExhausted`]. +//! +//! # Data visibility +//! +//! [`Diagnostic`] contains bounded operator-facing context. It may be used in logs and traces, but it must never be copied into a client response or metric label. Do not place secrets, credentials, prompts, generated text, or raw upstream response bodies in a diagnostic. +//! +//! [`PublicDetails`] is the only occurrence-specific channel available for client rendering, but the type does not sanitize its values. Producers must populate it only at a boundary that knows the value is safe. A [`PublicDetails::Message`] must contain fixed, cataloged, or explicitly allowlisted text; it must not contain user input, prompts, generated content, secrets, URLs, diagnostics, or raw upstream responses. Never derive public details from a diagnostic or arbitrary backend exception text. +//! +//! # Producer guidance +//! +//! 1. Classify at the boundary that understands the cause instead of relying on message parsing farther downstream. +//! 2. Select the canonical class for the failure's meaning, independent of the current transport. +//! 3. Use a registered reason that belongs to that class. Add new reasons to the catalog with class-consistency tests rather than emitting dynamic strings. +//! 4. Add a diagnostic only when it improves operator debugging, and add public details only when they are explicitly client-safe. +//! 5. Propagate an existing [`DynamoError`] directly whenever possible. If a generic wrapper is unavoidable, retain the typed error as its source and remember that generic conversion recovers only non-internal semantic classifications. +//! +//! [`DynamoError::msg`], conversion from an unclassified [`std::error::Error`], and conversion from a generic wrapper whose typed source is internal intentionally produce `Internal/runtime.unclassified`; use them as a fallback, not for failures whose meaning is known. +//! +//! ```rust,no_run +//! use dynamo_runtime::error::{DynamoError, ErrorClass, ErrorReason}; +//! +//! let error = DynamoError::builder() +//! .class(ErrorClass::InvalidRequest) +//! .reason(ErrorReason::new("request.invalid").expect("registered reason")) +//! .diagnostic("messages[2].role failed validation") +//! .public_message("The message role is invalid") //! .build(); //! -//! // Convert from any std::error::Error -//! let std_err = std::io::Error::other("io error"); -//! let dynamo_err = DynamoError::from(Box::new(std_err) as Box); +//! assert_eq!(error.class(), ErrorClass::InvalidRequest); +//! assert_eq!(error.reason().as_str(), "request.invalid"); +//! assert_eq!(error.public_message(), Some("The message role is invalid")); //! ``` +//! +//! Structured details are preferable when the protocol renderer needs machine-readable values: +//! +//! ```rust,no_run +//! use dynamo_runtime::error::{DynamoError, ErrorClass, ErrorReason, PublicDetails}; +//! +//! let error = DynamoError::builder() +//! .class(ErrorClass::PayloadTooLarge) +//! .reason(ErrorReason::new("request.payload_too_large").expect("registered reason")) +//! .public_details(PublicDetails::SizeLimit { +//! limit: 1_048_576, +//! actual: Some(1_250_000), +//! }) +//! .build(); +//! ``` +//! +//! # Consumer guidance +//! +//! Consumers apply their own policy to the validated semantic identity: +//! +//! - Protocol renderers map [`DynamoError::class`] to a status or legal terminal stream event and expose only approved [`PublicDetails`]. +//! - Retry and migration code owns its reason policy and combines it with locally owned budget, deadline, routing, replay, and continuation state. +//! - Worker-health code combines the reason with local worker and pool observations rather than inferring health from an HTTP status. +//! - Metrics use the normalized class and registered reason. Diagnostics, request identifiers, exception types, URLs, and user-controlled values must not become labels. +//! +//! A recovered internal attempt is not a final client failure. Terminal failure accounting belongs at the frontend rendering boundary so one propagated error is not counted by every subsystem it crosses. use serde::{Deserialize, Serialize}; use std::fmt; +use std::sync::{Arc, LazyLock}; -// ============================================================================ -// ErrorType Enum -// ============================================================================ - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum ErrorType { - /// Uncategorized or unknown error. - Unknown, +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +pub enum ErrorClass { /// The request contains invalid input (e.g., prompt exceeds context length). InvalidArgument, /// Failed to establish a connection to a remote worker. @@ -71,27 +129,203 @@ pub enum ErrorType { WorkerUnavailable, /// Error originating from a backend engine. Backend(BackendError), + /// The client request is malformed or fails request-level validation. + InvalidRequest, + /// Authentication credentials are missing or invalid. + Unauthenticated, + /// The authenticated caller is not permitted to perform the operation. + PermissionDenied, + /// The requested resource does not exist. + NotFound, + /// The request conflicts with current resource state. + Conflict, + /// The request body exceeds a configured size limit. + PayloadTooLarge, + /// The request uses an unsupported media type. + UnsupportedMedia, + /// The caller exceeded an admission or request-rate limit. + RateLimited, + /// The eligible worker pool has no capacity. + CapacityExhausted, + /// A backend response violates the expected protocol. + BackendProtocol, + /// The operation exceeded its deadline. + DeadlineExceeded, + /// The requested operation is not implemented. + NotImplemented, + /// An internal defect or unclassified failure occurred. + Internal, + /// Uncategorized or unknown error. + Unknown, +} + +#[derive(Deserialize)] +#[serde(untagged)] +#[allow(non_snake_case)] +enum ErrorClassWire { + Named(String), + Backend { Backend: BackendError }, +} + +impl ErrorClass { + fn from_wire_name(name: &str) -> Self { + match name { + "InvalidArgument" => Self::InvalidArgument, + "CannotConnect" => Self::CannotConnect, + "Disconnected" => Self::Disconnected, + "ConnectionTimeout" => Self::ConnectionTimeout, + "ResponseTimeout" => Self::ResponseTimeout, + "Cancelled" => Self::Cancelled, + "ResourceExhausted" => Self::ResourceExhausted, + "WorkerOverloaded" => Self::WorkerOverloaded, + "Unavailable" => Self::Unavailable, + "WorkerUnavailable" => Self::WorkerUnavailable, + "InvalidRequest" => Self::InvalidRequest, + "Unauthenticated" => Self::Unauthenticated, + "PermissionDenied" => Self::PermissionDenied, + "NotFound" => Self::NotFound, + "Conflict" => Self::Conflict, + "PayloadTooLarge" => Self::PayloadTooLarge, + "UnsupportedMedia" => Self::UnsupportedMedia, + "RateLimited" => Self::RateLimited, + "CapacityExhausted" => Self::CapacityExhausted, + "BackendProtocol" => Self::BackendProtocol, + "DeadlineExceeded" => Self::DeadlineExceeded, + "NotImplemented" => Self::NotImplemented, + "Internal" => Self::Internal, + _ => Self::Unknown, + } + } +} + +impl<'de> Deserialize<'de> for ErrorClass { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + Ok(match ErrorClassWire::deserialize(deserializer)? { + ErrorClassWire::Named(name) => Self::from_wire_name(&name), + ErrorClassWire::Backend { Backend: error } => Self::Backend(error), + }) + } } -impl fmt::Display for ErrorType { +impl fmt::Display for ErrorClass { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - ErrorType::Unknown => write!(f, "Unknown"), - ErrorType::InvalidArgument => write!(f, "InvalidArgument"), - ErrorType::CannotConnect => write!(f, "CannotConnect"), - ErrorType::Disconnected => write!(f, "Disconnected"), - ErrorType::ConnectionTimeout => write!(f, "ConnectionTimeout"), - ErrorType::ResponseTimeout => write!(f, "ResponseTimeout"), - ErrorType::Cancelled => write!(f, "Cancelled"), - ErrorType::ResourceExhausted => write!(f, "ResourceExhausted"), - ErrorType::WorkerOverloaded => write!(f, "WorkerOverloaded"), - ErrorType::Unavailable => write!(f, "Unavailable"), - ErrorType::WorkerUnavailable => write!(f, "WorkerUnavailable"), - ErrorType::Backend(sub) => write!(f, "Backend{sub}"), + ErrorClass::Unknown => write!(f, "Unknown"), + ErrorClass::InvalidArgument => write!(f, "InvalidArgument"), + ErrorClass::CannotConnect => write!(f, "CannotConnect"), + ErrorClass::Disconnected => write!(f, "Disconnected"), + ErrorClass::ConnectionTimeout => write!(f, "ConnectionTimeout"), + ErrorClass::ResponseTimeout => write!(f, "ResponseTimeout"), + ErrorClass::Cancelled => write!(f, "Cancelled"), + ErrorClass::ResourceExhausted => write!(f, "ResourceExhausted"), + ErrorClass::WorkerOverloaded => write!(f, "WorkerOverloaded"), + ErrorClass::Unavailable => write!(f, "Unavailable"), + ErrorClass::WorkerUnavailable => write!(f, "WorkerUnavailable"), + ErrorClass::Backend(sub) => write!(f, "Backend{sub}"), + ErrorClass::InvalidRequest => write!(f, "InvalidRequest"), + ErrorClass::Unauthenticated => write!(f, "Unauthenticated"), + ErrorClass::PermissionDenied => write!(f, "PermissionDenied"), + ErrorClass::NotFound => write!(f, "NotFound"), + ErrorClass::Conflict => write!(f, "Conflict"), + ErrorClass::PayloadTooLarge => write!(f, "PayloadTooLarge"), + ErrorClass::UnsupportedMedia => write!(f, "UnsupportedMedia"), + ErrorClass::RateLimited => write!(f, "RateLimited"), + ErrorClass::CapacityExhausted => write!(f, "CapacityExhausted"), + ErrorClass::BackendProtocol => write!(f, "BackendProtocol"), + ErrorClass::DeadlineExceeded => write!(f, "DeadlineExceeded"), + ErrorClass::NotImplemented => write!(f, "NotImplemented"), + ErrorClass::Internal => write!(f, "Internal"), } } } +impl ErrorClass { + /// Return the canonical semantic class for a legacy or backend-specific variant. + pub fn as_str(self) -> &'static str { + match self { + Self::Unknown => "Unknown", + Self::InvalidArgument => "InvalidArgument", + Self::CannotConnect => "CannotConnect", + Self::Disconnected => "Disconnected", + Self::ConnectionTimeout => "ConnectionTimeout", + Self::ResponseTimeout => "ResponseTimeout", + Self::Cancelled => "Cancelled", + Self::ResourceExhausted => "ResourceExhausted", + Self::WorkerOverloaded => "WorkerOverloaded", + Self::Unavailable => "Unavailable", + Self::WorkerUnavailable => "WorkerUnavailable", + Self::Backend(BackendError::Unknown) => "BackendUnknown", + Self::Backend(BackendError::InvalidArgument) => "BackendInvalidArgument", + Self::Backend(BackendError::CannotConnect) => "BackendCannotConnect", + Self::Backend(BackendError::Disconnected) => "BackendDisconnected", + Self::Backend(BackendError::ConnectionTimeout) => "BackendConnectionTimeout", + Self::Backend(BackendError::ResponseTimeout) => "BackendResponseTimeout", + Self::Backend(BackendError::Cancelled) => "BackendCancelled", + Self::Backend(BackendError::EngineShutdown) => "BackendEngineShutdown", + Self::Backend(BackendError::StreamIncomplete) => "BackendStreamIncomplete", + Self::InvalidRequest => "InvalidRequest", + Self::Unauthenticated => "Unauthenticated", + Self::PermissionDenied => "PermissionDenied", + Self::NotFound => "NotFound", + Self::Conflict => "Conflict", + Self::PayloadTooLarge => "PayloadTooLarge", + Self::UnsupportedMedia => "UnsupportedMedia", + Self::RateLimited => "RateLimited", + Self::CapacityExhausted => "CapacityExhausted", + Self::BackendProtocol => "BackendProtocol", + Self::DeadlineExceeded => "DeadlineExceeded", + Self::NotImplemented => "NotImplemented", + Self::Internal => "Internal", + } + } + + /// Map a legacy or backend-specific variant to its canonical semantic class. + /// + /// New producers should construct canonical classes directly. [`DynamoError::class`] applies this mapping after validating the class/reason identity and is the normal consumer entry point. Serialization also emits that validated canonical class, while retaining a compatible legacy representation during the migration window. + pub fn normalized(self) -> Self { + match self { + Self::Unknown => Self::Internal, + Self::InvalidArgument => Self::InvalidRequest, + Self::CannotConnect | Self::Disconnected | Self::WorkerUnavailable => Self::Unavailable, + Self::ConnectionTimeout | Self::ResponseTimeout => Self::DeadlineExceeded, + Self::ResourceExhausted | Self::WorkerOverloaded => Self::CapacityExhausted, + Self::Backend(error) => match error { + BackendError::Unknown => Self::Internal, + BackendError::InvalidArgument => Self::InvalidRequest, + BackendError::CannotConnect + | BackendError::Disconnected + | BackendError::EngineShutdown + | BackendError::StreamIncomplete => Self::Unavailable, + BackendError::ConnectionTimeout | BackendError::ResponseTimeout => { + Self::DeadlineExceeded + } + BackendError::Cancelled => Self::Cancelled, + }, + canonical @ (Self::Cancelled + | Self::Unavailable + | Self::InvalidRequest + | Self::Unauthenticated + | Self::PermissionDenied + | Self::NotFound + | Self::Conflict + | Self::PayloadTooLarge + | Self::UnsupportedMedia + | Self::RateLimited + | Self::CapacityExhausted + | Self::BackendProtocol + | Self::DeadlineExceeded + | Self::NotImplemented + | Self::Internal) => canonical, + } + } +} + +/// Backward-compatible name retained while callers migrate to ErrorClass. +pub type ErrorType = ErrorClass; + /// Categorizes errors into a fixed set of standard types. /// /// Consumers (e.g., the migration module) inspect the error type to decide @@ -135,33 +369,417 @@ impl fmt::Display for BackendError { } } +/// Stable, bounded catalog key for a specific failure cause. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ErrorReason(String); + +impl ErrorReason { + pub const MAX_BYTES: usize = 128; + + pub fn new(value: impl Into) -> Result { + let value = value.into(); + if value.is_empty() { + return Err(InvalidErrorReason::Empty); + } + if value.len() > Self::MAX_BYTES { + return Err(InvalidErrorReason::TooLong); + } + if !value.bytes().all(|byte| { + byte.is_ascii_lowercase() || byte.is_ascii_digit() || b"._-".contains(&byte) + }) { + return Err(InvalidErrorReason::InvalidCharacter); + } + if Self::catalog_class(&value).is_none() { + return Err(InvalidErrorReason::UnknownCatalogKey); + } + Ok(Self(value)) + } + + pub fn as_str(&self) -> &str { + &self.0 + } + + fn catalog_class(value: &str) -> Option { + match value { + "runtime.unclassified" | "runtime.invalid_error" | "runtime.internal" => { + Some(ErrorClass::Internal) + } + "request.invalid_argument" | "backend.invalid_argument" | "request.invalid" => { + Some(ErrorClass::InvalidRequest) + } + "transport.cannot_connect" + | "transport.disconnected" + | "backend.unavailable" + | "backend.worker_unavailable" + | "backend.cannot_connect" + | "backend.disconnected" + | "backend.engine_shutdown" + | "backend.stream_incomplete" => Some(ErrorClass::Unavailable), + "transport.connection_timeout" + | "backend.response_timeout" + | "backend.connection_timeout" + | "request.deadline_exceeded" => Some(ErrorClass::DeadlineExceeded), + "request.cancelled" | "backend.cancelled" => Some(ErrorClass::Cancelled), + "capacity.pool_exhausted" | "capacity.worker_overloaded" | "capacity.exhausted" => { + Some(ErrorClass::CapacityExhausted) + } + "backend.unknown" => Some(ErrorClass::Internal), + "backend.protocol" => Some(ErrorClass::BackendProtocol), + "request.unauthenticated" => Some(ErrorClass::Unauthenticated), + "request.permission_denied" => Some(ErrorClass::PermissionDenied), + "request.not_found" => Some(ErrorClass::NotFound), + "request.conflict" => Some(ErrorClass::Conflict), + "request.payload_too_large" => Some(ErrorClass::PayloadTooLarge), + "request.unsupported_media" => Some(ErrorClass::UnsupportedMedia), + "request.rate_limited" => Some(ErrorClass::RateLimited), + "runtime.not_implemented" => Some(ErrorClass::NotImplemented), + _ => None, + } + } + + fn from_static(value: &'static str) -> Self { + debug_assert!(!value.is_empty() && value.len() <= Self::MAX_BYTES); + debug_assert!(value.bytes().all(|byte| { + byte.is_ascii_lowercase() || byte.is_ascii_digit() || b"._-".contains(&byte) + })); + debug_assert!(Self::catalog_class(value).is_some()); + Self(value.to_owned()) + } + + fn for_class(class: ErrorClass) -> Self { + let value = match class { + ErrorClass::Unknown => "runtime.unclassified", + ErrorClass::InvalidArgument => "request.invalid_argument", + ErrorClass::CannotConnect => "transport.cannot_connect", + ErrorClass::Disconnected => "transport.disconnected", + ErrorClass::ConnectionTimeout => "transport.connection_timeout", + ErrorClass::ResponseTimeout => "backend.response_timeout", + ErrorClass::Cancelled => "request.cancelled", + ErrorClass::ResourceExhausted => "capacity.pool_exhausted", + ErrorClass::WorkerOverloaded => "capacity.worker_overloaded", + ErrorClass::Unavailable => "backend.unavailable", + ErrorClass::WorkerUnavailable => "backend.worker_unavailable", + ErrorClass::Backend(error) => match error { + BackendError::Unknown => "backend.unknown", + BackendError::InvalidArgument => "backend.invalid_argument", + BackendError::CannotConnect => "backend.cannot_connect", + BackendError::Disconnected => "backend.disconnected", + BackendError::ConnectionTimeout => "backend.connection_timeout", + BackendError::ResponseTimeout => "backend.response_timeout", + BackendError::Cancelled => "backend.cancelled", + BackendError::EngineShutdown => "backend.engine_shutdown", + BackendError::StreamIncomplete => "backend.stream_incomplete", + }, + ErrorClass::InvalidRequest => "request.invalid", + ErrorClass::Unauthenticated => "request.unauthenticated", + ErrorClass::PermissionDenied => "request.permission_denied", + ErrorClass::NotFound => "request.not_found", + ErrorClass::Conflict => "request.conflict", + ErrorClass::PayloadTooLarge => "request.payload_too_large", + ErrorClass::UnsupportedMedia => "request.unsupported_media", + ErrorClass::RateLimited => "request.rate_limited", + ErrorClass::CapacityExhausted => "capacity.exhausted", + ErrorClass::BackendProtocol => "backend.protocol", + ErrorClass::DeadlineExceeded => "request.deadline_exceeded", + ErrorClass::NotImplemented => "runtime.not_implemented", + ErrorClass::Internal => "runtime.internal", + }; + Self::from_static(value) + } +} + +static INVALID_ERROR_REASON: LazyLock = + LazyLock::new(|| ErrorReason::from_static("runtime.invalid_error")); + +impl fmt::Display for ErrorReason { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.0) + } +} + +impl Serialize for ErrorReason { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(&self.0) + } +} + +impl<'de> Deserialize<'de> for ErrorReason { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let value = String::deserialize(deserializer)?; + Self::new(value).map_err(serde::de::Error::custom) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum InvalidErrorReason { + Empty, + TooLong, + InvalidCharacter, + UnknownCatalogKey, +} + +impl fmt::Display for InvalidErrorReason { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Empty => f.write_str("error reason cannot be empty"), + Self::TooLong => write!(f, "error reason exceeds {} bytes", ErrorReason::MAX_BYTES), + Self::InvalidCharacter => f.write_str( + "error reason may contain only lowercase ASCII, digits, '.', '_', or '-'", + ), + Self::UnknownCatalogKey => f.write_str("error reason is not registered in the catalog"), + } + } +} + +impl std::error::Error for InvalidErrorReason {} + +/// Closed set of structured, client-safe details. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(tag = "type", rename_all = "snake_case")] +pub enum PublicDetails { + Message { + message: String, + }, + SizeLimit { + limit: u64, + actual: Option, + }, + ContextLength { + limit: u64, + actual: Option, + }, + RateLimit { + limit: Option, + remaining: Option, + }, +} + +impl PublicDetails { + /// Returns the client-safe rejection message when one was explicitly captured. + pub fn message(&self) -> Option<&str> { + match self { + Self::Message { message } => Some(message), + Self::SizeLimit { .. } | Self::ContextLength { .. } | Self::RateLimit { .. } => None, + } + } +} + +/// Bounded operator-only diagnostic text. +#[derive(Debug, Clone, Default)] +pub struct Diagnostic { + message: String, + source: Option>, +} + +impl Diagnostic { + pub const MAX_BYTES: usize = 4096; + pub const TRUNCATION_SUFFIX: &'static str = "...[truncated]"; + + pub fn new(value: impl Into) -> Self { + let mut message = value.into(); + if message.len() > Self::MAX_BYTES { + let mut end = Self::MAX_BYTES - Self::TRUNCATION_SUFFIX.len(); + while !message.is_char_boundary(end) { + end -= 1; + } + message.truncate(end); + message.push_str(Self::TRUNCATION_SUFFIX); + } + Self { + message, + source: None, + } + } + + fn with_source(mut self, source: impl std::error::Error + Send + Sync + 'static) -> Self { + self.source = Some(Arc::new(source)); + self + } + + pub fn as_str(&self) -> &str { + &self.message + } + + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + self.source + .as_deref() + .map(|source| source as &(dyn std::error::Error + 'static)) + } +} + +impl PartialEq for Diagnostic { + fn eq(&self, other: &Self) -> bool { + self.message == other.message + } +} + +impl Eq for Diagnostic {} + +impl Serialize for Diagnostic { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(&self.message) + } +} + +impl<'de> Deserialize<'de> for Diagnostic { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + Ok(Self::new(String::deserialize(deserializer)?)) + } +} + // ============================================================================ // DynamoError - The Standardized Error Type // ============================================================================ /// The standardized error type for Dynamo. /// -/// `DynamoError` is a serializable, chainable error that: -/// - Carries an [`ErrorType`] for categorization -/// - Supports error chaining via [`std::error::Error::source()`] +/// `DynamoError` is a serializable semantic error that: +/// - Carries an [`ErrorClass`] for categorization /// - Is serializable for network transmission via `Annotated` /// - Can be created from any [`std::error::Error`] /// /// # Display /// -/// `Display` shows only the current error (standard Rust convention). -/// Use `source()` to walk the cause chain: +/// `Display` shows the private diagnostic when present and otherwise the reason. /// /// ```rust,ignore /// let err = DynamoError::msg("outer"); -/// println!("{}", err); // "Unknown: outer" +/// println!("{}", err); // "Internal: outer" /// ``` -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct DynamoError { - error_type: ErrorType, - message: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - caused_by: Option>, + /// Coarse semantic category. This may retain a compatible legacy variant internally; use [`Self::class`] for validated consumer policy. + pub class: ErrorClass, + /// Registered, bounded cause key that must belong to the normalized class; use [`Self::reason`] for validated consumer policy. + pub reason: ErrorReason, + /// Optional bounded operator-only context. This is not client-safe and must not be used as a metric label. + pub diagnostic: Option, + /// Optional explicitly client-safe data. The producer remains responsible for ensuring every contained value is safe to expose. + pub public: Option, +} + +impl Serialize for DynamoError { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + + let public = self.public_details(); + let caused_by = self + .diagnostic + .as_ref() + .and_then(Diagnostic::source) + .and_then(|source| source.downcast_ref::()); + let mut state = serializer.serialize_struct( + "DynamoError", + 4 + usize::from(self.diagnostic.is_some()) + + usize::from(public.is_some()) + + usize::from(caused_by.is_some()), + )?; + state.serialize_field("error_type", &self.legacy_wire_error_type())?; + state.serialize_field("class", &self.class())?; + state.serialize_field("reason", self.reason())?; + state.serialize_field("message", &self.message())?; + if let Some(diagnostic) = &self.diagnostic { + state.serialize_field("diagnostic", diagnostic)?; + } + if let Some(public) = public { + state.serialize_field("public", public)?; + } + if let Some(caused_by) = caused_by { + state.serialize_field("caused_by", caused_by)?; + } + state.end() + } +} + +impl<'de> Deserialize<'de> for DynamoError { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + #[derive(Deserialize)] + struct Representation { + #[serde(default)] + class: Option, + #[serde(default)] + error_type: Option, + #[serde(default)] + reason: Option, + #[serde(default)] + diagnostic: Option, + #[serde(default)] + message: Option, + #[serde(default, rename = "public", alias = "public_details")] + public: Option, + #[serde(default)] + caused_by: Option>, + } + + let representation = Representation::deserialize(deserializer)?; + let declared_class = representation.class; + let invalid_declared_class = matches!(declared_class, Some(ErrorClass::Unknown)); + let legacy_error_type = representation.error_type; + let source_class = declared_class + .or(legacy_error_type) + .unwrap_or(ErrorClass::Unknown); + let canonical_class = match source_class { + ErrorClass::Unknown => ErrorClass::Internal, + class => class.normalized(), + }; + let reason = match representation.reason { + Some(reason) => ErrorReason::new(reason).ok(), + None => Some(ErrorReason::for_class( + legacy_error_type.unwrap_or(source_class), + )), + }; + let valid_reason = !invalid_declared_class + && reason + .as_ref() + .and_then(|reason| ErrorReason::catalog_class(reason.as_str())) + .is_some_and(|class| class == canonical_class); + let stored_class = legacy_error_type + .filter(|class| *class != ErrorClass::Unknown && class.normalized() == canonical_class) + .unwrap_or(canonical_class); + + let (class, reason, public) = match reason { + Some(reason) if valid_reason => (stored_class, reason, representation.public), + _ => ( + ErrorClass::Internal, + ErrorReason::from_static("runtime.invalid_error"), + None, + ), + }; + + let diagnostic = match ( + representation.diagnostic.or(representation.message), + representation.caused_by, + ) { + (Some(diagnostic), Some(caused_by)) => Some(diagnostic.with_source(*caused_by)), + (None, Some(caused_by)) => Some(Diagnostic::new("").with_source(*caused_by)), + (diagnostic, None) => diagnostic, + }; + + Ok(Self { + class, + reason, + diagnostic, + public, + }) + } } impl DynamoError { @@ -170,59 +788,162 @@ impl DynamoError { DynamoErrorBuilder::default() } - /// Shorthand to create an `Unknown` error with just a message and no cause. + /// Shorthand to create an internal error with a private diagnostic. pub fn msg(message: impl Into) -> Self { - Self::builder().message(message).build() + Self::builder() + .class(ErrorClass::Internal) + .reason(ErrorReason::from_static("runtime.unclassified")) + .diagnostic(message) + .build() } - /// Returns the error type. + /// Returns the validated legacy error type without normalization. + /// + /// Invalid public-field combinations fail closed so legacy policy callers + /// cannot bypass the canonical identity check. pub fn error_type(&self) -> ErrorType { - self.error_type + if self.has_valid_identity() { + self.class + } else { + ErrorClass::Internal + } + } + + fn has_valid_identity(&self) -> bool { + ErrorReason::catalog_class(self.reason.as_str()) + .is_some_and(|class| class == self.class.normalized()) + } + + /// Returns the canonical semantic error class. + pub fn class(&self) -> ErrorClass { + if self.has_valid_identity() { + self.class.normalized() + } else { + ErrorClass::Internal + } + } + + fn legacy_wire_error_type(&self) -> ErrorClass { + match self.error_type() { + ErrorClass::Unknown + | ErrorClass::Internal + | ErrorClass::Unauthenticated + | ErrorClass::PermissionDenied + | ErrorClass::NotFound + | ErrorClass::Conflict + | ErrorClass::BackendProtocol + | ErrorClass::NotImplemented => ErrorClass::Unknown, + ErrorClass::InvalidArgument + | ErrorClass::InvalidRequest + | ErrorClass::PayloadTooLarge + | ErrorClass::UnsupportedMedia => ErrorClass::InvalidArgument, + ErrorClass::CannotConnect => ErrorClass::CannotConnect, + ErrorClass::Disconnected => ErrorClass::Disconnected, + ErrorClass::ConnectionTimeout => ErrorClass::ConnectionTimeout, + ErrorClass::ResponseTimeout | ErrorClass::DeadlineExceeded => { + ErrorClass::ResponseTimeout + } + ErrorClass::Cancelled => ErrorClass::Cancelled, + ErrorClass::ResourceExhausted + | ErrorClass::WorkerOverloaded + | ErrorClass::CapacityExhausted + | ErrorClass::RateLimited => ErrorClass::ResourceExhausted, + ErrorClass::Unavailable => ErrorClass::Unavailable, + ErrorClass::WorkerUnavailable => ErrorClass::WorkerUnavailable, + ErrorClass::Backend(error) => ErrorClass::Backend(error), + } + } + + /// Returns the stable reason key. + pub fn reason(&self) -> &ErrorReason { + if self.has_valid_identity() { + &self.reason + } else { + &INVALID_ERROR_REASON + } + } + + /// Returns the optional private diagnostic. + pub fn diagnostic(&self) -> Option<&Diagnostic> { + self.diagnostic.as_ref() + } + + /// Returns structured client-safe details. + pub fn public_details(&self) -> Option<&PublicDetails> { + self.has_valid_identity() + .then_some(self.public.as_ref()) + .flatten() } - /// Returns the error message. + /// Returns the explicitly captured client-safe rejection message. + pub fn public_message(&self) -> Option<&str> { + self.public_details().and_then(PublicDetails::message) + } + + /// Returns the legacy error message view. pub fn message(&self) -> &str { - &self.message + self.diagnostic + .as_ref() + .map(Diagnostic::as_str) + .unwrap_or_default() } } impl fmt::Display for DynamoError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}: {}", self.error_type, self.message) + match self.diagnostic() { + Some(diagnostic) if !diagnostic.as_str().is_empty() => { + write!(f, "{}: {}", self.class(), diagnostic.as_str()) + } + _ => write!(f, "{}: {}", self.class(), self.reason()), + } } } impl std::error::Error for DynamoError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - self.caused_by - .as_deref() - .map(|e| e as &(dyn std::error::Error + 'static)) + self.diagnostic.as_ref().and_then(Diagnostic::source) } } /// Convert from a reference to any `std::error::Error`. -/// -/// If the error is already a `DynamoError`, it is cloned. Otherwise, it is -/// wrapped as `ErrorType::Unknown` with the display string as the message. -/// The source chain is recursively converted, preserving `DynamoError` instances. impl<'a> From<&'a (dyn std::error::Error + 'static)> for DynamoError { fn from(err: &'a (dyn std::error::Error + 'static)) -> Self { if let Some(dynamo_err) = err.downcast_ref::() { return dynamo_err.clone(); } + let diagnostic = Diagnostic::new(err.to_string()); + let Some(source) = err.source() else { + return Self { + class: ErrorClass::Internal, + reason: ErrorReason::from_static("runtime.unclassified"), + diagnostic: Some(diagnostic), + public: None, + }; + }; + + let source = DynamoError::from(source); + let diagnostic = diagnostic.with_source(source.clone()); + if source.has_valid_identity() && source.class() != ErrorClass::Internal { + return Self { + class: source.error_type(), + reason: source.reason().clone(), + diagnostic: Some(diagnostic), + public: source.public_details().cloned(), + }; + } + Self { - error_type: ErrorType::Unknown, - message: err.to_string(), - caused_by: err.source().map(|s| Box::new(DynamoError::from(s))), + class: ErrorClass::Internal, + reason: ErrorReason::from_static("runtime.unclassified"), + diagnostic: Some(diagnostic), + public: None, } } } /// Convert from an owned boxed `std::error::Error`. -/// -/// If the error is already a `DynamoError`, ownership is taken without cloning. -/// Otherwise, falls back to the reference-based conversion. impl From> for DynamoError { fn from(err: Box) -> Self { match err.downcast::() { @@ -241,50 +962,97 @@ impl From> for DynamoError { /// # Example /// ```rust,ignore /// let err = DynamoError::builder() -/// .error_type(ErrorType::Disconnected) +/// .error_type(ErrorClass::Disconnected) /// .message("worker lost") /// .cause(some_io_error) /// .build(); /// ``` #[derive(Default)] pub struct DynamoErrorBuilder { - error_type: Option, - message: Option, - caused_by: Option>, + class: Option, + reason: Option, + diagnostic: Option, + public: Option, } impl DynamoErrorBuilder { - /// Set the error type. + /// Set the legacy or canonical error class. pub fn error_type(mut self, error_type: ErrorType) -> Self { - self.error_type = Some(error_type); + self.class = Some(error_type); self } - /// Set the error message. - pub fn message(mut self, message: impl Into) -> Self { - self.message = Some(message.into()); + /// Set the canonical error class. + pub fn class(self, class: ErrorClass) -> Self { + self.error_type(class) + } + + /// Set the stable reason key. + pub fn reason(mut self, reason: ErrorReason) -> Self { + self.reason = Some(reason); self } - /// Set the cause from any `std::error::Error`. - /// - /// If the cause is already a `DynamoError`, it is preserved as-is. - /// Otherwise, it is converted to a `DynamoError` with `ErrorType::Unknown`. + /// Set the private bounded diagnostic. + pub fn diagnostic(mut self, diagnostic: impl Into) -> Self { + self.diagnostic = Some(Diagnostic::new(diagnostic)); + self + } + + /// Set the legacy error message view. + pub fn message(self, message: impl Into) -> Self { + self.diagnostic(message) + } + + /// Set a client-safe rejection message. + pub fn public_message(mut self, message: impl Into) -> Self { + self.public = Some(PublicDetails::Message { + message: message.into(), + }); + self + } + + /// Set structured client-safe details. + pub fn public_details(mut self, public: PublicDetails) -> Self { + self.public = Some(public); + self + } + + /// Preserve compatibility with existing builders while keeping native causes out of the semantic payload. pub fn cause(mut self, cause: impl std::error::Error + 'static) -> Self { - self.caused_by = Some(Box::new(DynamoError::from( - &cause as &(dyn std::error::Error + 'static), - ))); + let message = cause.to_string(); + let source = DynamoError::from(&cause as &(dyn std::error::Error + 'static)); + let diagnostic = self + .diagnostic + .take() + .unwrap_or_else(|| Diagnostic::new(message)); + self.diagnostic = Some(diagnostic.with_source(source)); self } - /// Build the `DynamoError`. - /// - /// Defaults: `error_type` → `Unknown`, `message` → `""`, `cause` → `None`. + /// Build the `DynamoError` and fail closed on a class/reason mismatch. pub fn build(self) -> DynamoError { - DynamoError { - error_type: self.error_type.unwrap_or(ErrorType::Unknown), - message: self.message.unwrap_or_default(), - caused_by: self.caused_by, + let raw_class = self.class.unwrap_or(ErrorClass::Internal); + let reason = self + .reason + .unwrap_or_else(|| ErrorReason::for_class(raw_class)); + let valid_reason = ErrorReason::catalog_class(reason.as_str()) + .is_some_and(|class| class == raw_class.normalized()); + + if valid_reason { + DynamoError { + class: raw_class, + reason, + diagnostic: self.diagnostic, + public: self.public, + } + } else { + DynamoError { + class: ErrorClass::Internal, + reason: ErrorReason::from_static("runtime.invalid_error"), + diagnostic: self.diagnostic, + public: None, + } } } } @@ -302,8 +1070,8 @@ impl DynamoErrorBuilder { /// in `match_set`. Errors that are not `DynamoError` are skipped. pub fn match_error_chain( err: &(dyn std::error::Error + 'static), - match_set: &[ErrorType], - exclude_set: &[ErrorType], + match_set: &[ErrorClass], + exclude_set: &[ErrorClass], ) -> bool { let mut found = false; let mut current: Option<&(dyn std::error::Error + 'static)> = Some(err); @@ -350,50 +1118,84 @@ mod tests { #[test] fn test_msg_constructor() { let err = DynamoError::msg("something failed"); - assert_eq!(err.error_type(), ErrorType::Unknown); + assert_eq!(err.error_type(), ErrorClass::Internal); + assert_eq!(err.reason().as_str(), "runtime.unclassified"); assert_eq!(err.message(), "something failed"); assert!(err.source().is_none()); } #[test] - fn test_new_constructor_with_cause() { - let cause = std::io::Error::other("io error"); + fn cause_is_preserved_for_legacy_wire_compatibility() { let err = DynamoError::builder() - .error_type(ErrorType::Unknown) - .message("operation failed") - .cause(cause) + .class(ErrorClass::Internal) + .reason(ErrorReason::new("runtime.internal").unwrap()) + .diagnostic("operation failed") + .cause(std::io::Error::other("io error")) .build(); - assert_eq!(err.error_type(), ErrorType::Unknown); assert_eq!(err.message(), "operation failed"); - assert!(err.source().is_some()); + assert_eq!(err.source().unwrap().to_string(), "Internal: io error"); + let value = serde_json::to_value(&err).unwrap(); + assert_eq!(value.as_object().unwrap().len(), 6); + assert!(value.get("caused_by").is_some()); + + let roundtrip: DynamoError = serde_json::from_value(value).unwrap(); + assert_eq!( + roundtrip.source().unwrap().to_string(), + "Internal: io error" + ); } #[test] - fn test_display_shows_only_current_error() { - let cause = std::io::Error::other("io error"); - let err = DynamoError::builder() - .error_type(ErrorType::Unknown) - .message("operation failed") - .cause(cause) + fn display_uses_diagnostic_or_reason() { + let with_diagnostic = DynamoError::builder() + .class(ErrorClass::Internal) + .reason(ErrorReason::new("runtime.internal").unwrap()) + .diagnostic("operation failed") + .build(); + let without_diagnostic = DynamoError::builder() + .class(ErrorClass::Internal) + .reason(ErrorReason::new("runtime.internal").unwrap()) .build(); - // Display should only show the current error, not the chain - assert_eq!(err.to_string(), "Unknown: operation failed"); + assert_eq!(with_diagnostic.to_string(), "Internal: operation failed"); + assert_eq!(without_diagnostic.to_string(), "Internal: runtime.internal"); } #[test] - fn test_source_chain() { - let cause = std::io::Error::other("io error"); - let err = DynamoError::builder() - .error_type(ErrorType::Unknown) - .message("operation failed") - .cause(cause) - .build(); + fn conversion_preserves_nested_semantic_source_locally() { + #[derive(Debug)] + struct OuterError { + source: DynamoError, + } + + impl fmt::Display for OuterError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("outer failure") + } + } + + impl std::error::Error for OuterError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + Some(&self.source) + } + } - // source() should return the cause - let source = err.source().unwrap(); - assert!(source.to_string().contains("io error")); + let outer = OuterError { + source: DynamoError::builder() + .error_type(ErrorType::InvalidArgument) + .diagnostic("invalid input") + .build(), + }; + let converted = DynamoError::from(&outer as &(dyn std::error::Error + 'static)); + + assert!(match_error_chain( + &converted, + &[ErrorType::InvalidArgument], + &[] + )); + let value = serde_json::to_value(converted).unwrap(); + assert!(value.get("caused_by").is_some()); } #[test] @@ -402,7 +1204,8 @@ mod tests { let boxed: Box = Box::new(std_err); let dynamo_err = DynamoError::from(boxed); - assert_eq!(dynamo_err.error_type(), ErrorType::Unknown); + assert_eq!(dynamo_err.class(), ErrorClass::Internal); + assert_eq!(dynamo_err.reason().as_str(), "runtime.unclassified"); assert_eq!(dynamo_err.message(), "io error"); } @@ -412,122 +1215,381 @@ mod tests { let boxed: Box = Box::new(inner); let dynamo_err = DynamoError::from(boxed); - // Should take ownership, not clone or wrap - assert_eq!(dynamo_err.error_type(), ErrorType::Unknown); + assert_eq!(dynamo_err.class(), ErrorClass::Internal); assert_eq!(dynamo_err.message(), "original"); } #[test] - fn test_from_boxed_with_source_chain() { - #[derive(Debug)] - struct OuterError { - source: std::io::Error, + fn semantic_metadata_roundtrips() { + let err = DynamoError::builder() + .class(ErrorClass::RateLimited) + .reason(ErrorReason::new("request.rate_limited").unwrap()) + .diagnostic("request rate exceeded") + .public_details(PublicDetails::RateLimit { + limit: Some(100), + remaining: Some(0), + }) + .build(); + + let json = serde_json::to_string(&err).unwrap(); + let deserialized: DynamoError = serde_json::from_str(&json).unwrap(); + + assert_eq!(deserialized.class(), ErrorClass::RateLimited); + assert_eq!(deserialized.reason().as_str(), "request.rate_limited"); + assert_eq!( + deserialized.diagnostic().map(Diagnostic::as_str), + Some("request rate exceeded") + ); + assert_eq!( + deserialized.public_details(), + Some(&PublicDetails::RateLimit { + limit: Some(100), + remaining: Some(0), + }) + ); + } + + #[test] + fn semantic_schema_includes_legacy_compatibility_fields() { + let err = DynamoError::builder() + .class(ErrorClass::RateLimited) + .reason(ErrorReason::new("request.rate_limited").unwrap()) + .diagnostic("request rate exceeded") + .public_details(PublicDetails::RateLimit { + limit: Some(100), + remaining: Some(0), + }) + .build(); + + let value = serde_json::to_value(err).unwrap(); + let object = value.as_object().unwrap(); + + assert_eq!(object.len(), 6); + assert_eq!(value["error_type"], "ResourceExhausted"); + assert_eq!(value["message"], "request rate exceeded"); + assert_eq!(value["class"], "RateLimited"); + assert_eq!(value["reason"], "request.rate_limited"); + assert_eq!(value["diagnostic"], "request rate exceeded"); + assert!(value.get("public").is_some()); + } + + #[test] + fn optional_semantic_fields_are_omitted() { + let err = DynamoError::builder() + .class(ErrorClass::InvalidRequest) + .reason(ErrorReason::new("request.invalid").unwrap()) + .build(); + + let value = serde_json::to_value(err).unwrap(); + let object = value.as_object().unwrap(); + + assert_eq!(object.len(), 4); + assert_eq!(value["error_type"], "InvalidArgument"); + assert_eq!(value["message"], ""); + assert_eq!(value["class"], "InvalidRequest"); + assert_eq!(value["reason"], "request.invalid"); + assert!(value.get("diagnostic").is_none()); + assert!(value.get("public").is_none()); + } + + #[test] + fn unknown_catalog_reason_fails_closed() { + let json = r#"{ + "class": "InvalidRequest", + "reason": "request.user_supplied_metric_label", + "diagnostic": "private details" + }"#; + let err: DynamoError = serde_json::from_str(json).unwrap(); + + assert_eq!(err.class(), ErrorClass::Internal); + assert_eq!(err.reason().as_str(), "runtime.invalid_error"); + assert_eq!( + err.diagnostic().map(Diagnostic::as_str), + Some("private details") + ); + } + + #[test] + fn public_fields_fail_closed_at_consumer_boundaries() { + let err = DynamoError { + class: ErrorClass::InvalidRequest, + reason: ErrorReason::new("request.rate_limited").unwrap(), + diagnostic: Some(Diagnostic::new("private details")), + public: Some(PublicDetails::RateLimit { + limit: Some(10), + remaining: Some(0), + }), + }; + + assert_eq!(err.class(), ErrorClass::Internal); + assert_eq!(err.error_type(), ErrorClass::Internal); + assert_eq!(err.reason().as_str(), "runtime.invalid_error"); + assert!(err.public_details().is_none()); + assert_eq!(err.to_string(), "Internal: private details"); + assert_eq!( + serde_json::to_value(err).unwrap(), + serde_json::json!({ + "error_type": "Unknown", + "message": "private details", + "class": "Internal", + "reason": "runtime.invalid_error", + "diagnostic": "private details" + }) + ); + } + + #[test] + fn diagnostic_is_bounded_at_utf8_boundary() { + let truncation_index = Diagnostic::MAX_BYTES - Diagnostic::TRUNCATION_SUFFIX.len(); + let diagnostic = Diagnostic::new( + "x".repeat(truncation_index - 1) + "é" + &"x".repeat(Diagnostic::MAX_BYTES), + ); + + assert!(diagnostic.as_str().len() <= Diagnostic::MAX_BYTES); + assert!( + diagnostic + .as_str() + .is_char_boundary(diagnostic.as_str().len()) + ); + assert!(diagnostic.as_str().ends_with(Diagnostic::TRUNCATION_SUFFIX)); + } + + #[test] + fn legacy_builder_derives_semantic_defaults() { + let legacy_type: ErrorType = ErrorType::InvalidArgument; + let err = DynamoError::builder() + .error_type(legacy_type) + .message("bad request") + .build(); + + assert_eq!(err.error_type(), ErrorType::InvalidArgument); + assert_eq!(err.class(), ErrorClass::InvalidRequest); + assert_eq!(err.reason().as_str(), "request.invalid_argument"); + assert_eq!(err.message(), "bad request"); + } + + #[test] + fn legacy_json_derives_semantic_defaults() { + let json = r#"{"error_type":"InvalidArgument","message":"bad request"}"#; + let err: DynamoError = serde_json::from_str(json).unwrap(); + + assert_eq!(err.class(), ErrorClass::InvalidRequest); + assert_eq!(err.reason().as_str(), "request.invalid_argument"); + assert_eq!( + err.diagnostic().map(Diagnostic::as_str), + Some("bad request") + ); + assert!(err.public_details().is_none()); + } + + #[test] + fn legacy_unknown_preserves_nested_classification_across_the_wire() { + let json = r#"{ + "error_type":"Unknown", + "message":"generate failed", + "caused_by":{"error_type":"InvalidArgument","message":"bad request"} + }"#; + let err: DynamoError = serde_json::from_str(json).unwrap(); + + assert_eq!(err.reason().as_str(), "runtime.unclassified"); + assert_eq!(err.class(), ErrorClass::Internal); + assert!(match_error_chain(&err, &[ErrorClass::InvalidArgument], &[])); + + let reserialized = serde_json::to_value(&err).unwrap(); + assert_eq!(reserialized["caused_by"]["error_type"], "InvalidArgument"); + } + + #[test] + fn backend_class_roundtrips_as_its_canonical_class() { + let error = DynamoError::builder() + .error_type(ErrorClass::Backend(BackendError::InvalidArgument)) + .build(); + + let serialized = serde_json::to_string(&error).unwrap(); + assert!(serialized.contains("\"class\":\"InvalidRequest\"")); + + let decoded: DynamoError = serde_json::from_str(&serialized).unwrap(); + assert_eq!( + decoded.error_type(), + ErrorClass::Backend(BackendError::InvalidArgument) + ); + assert_eq!(decoded.class(), ErrorClass::InvalidRequest); + assert_eq!(decoded.reason().as_str(), "backend.invalid_argument"); + } + + #[test] + fn transport_subtype_roundtrips() { + let error = DynamoError::builder() + .error_type(ErrorClass::CannotConnect) + .build(); + + let decoded: DynamoError = + serde_json::from_str(&serde_json::to_string(&error).unwrap()).unwrap(); + + assert_eq!(decoded.error_type(), ErrorClass::CannotConnect); + assert_eq!(decoded.class(), ErrorClass::Unavailable); + assert_eq!(decoded.reason().as_str(), "transport.cannot_connect"); + } + + #[test] + fn worker_unavailable_roundtrips_with_semantic_identity() { + let error = DynamoError::builder() + .error_type(ErrorClass::WorkerUnavailable) + .build(); + + let decoded: DynamoError = + serde_json::from_str(&serde_json::to_string(&error).unwrap()).unwrap(); + + assert_eq!(decoded.error_type(), ErrorClass::WorkerUnavailable); + assert_eq!(decoded.class(), ErrorClass::Unavailable); + assert_eq!(decoded.reason().as_str(), "backend.worker_unavailable"); + } + + #[test] + fn response_timeout_subtypes_roundtrip() { + for error_type in [ + ErrorClass::ResponseTimeout, + ErrorClass::Backend(BackendError::ResponseTimeout), + ] { + let error = DynamoError::builder().error_type(error_type).build(); + let decoded: DynamoError = + serde_json::from_str(&serde_json::to_string(&error).unwrap()).unwrap(); + + assert_eq!(decoded.error_type(), error_type); + assert_eq!(decoded.class(), ErrorClass::DeadlineExceeded); } + } - impl fmt::Display for OuterError { + #[test] + fn unknown_class_fails_closed_during_deserialization() { + let json = r#"{ + "class":"FutureErrorClass", + "reason":"runtime.internal", + "public":{"type":"message","message":"must not escape"} + }"#; + let error: DynamoError = serde_json::from_str(json).unwrap(); + + assert_eq!(error.error_type(), ErrorClass::Internal); + assert_eq!(error.class(), ErrorClass::Internal); + assert_eq!(error.reason().as_str(), "runtime.invalid_error"); + assert!(error.public_details().is_none()); + } + + #[test] + fn error_class_deserialization_preserves_backend_and_fails_closed() { + let backend: ErrorClass = serde_json::from_str(r#"{"Backend":"InvalidArgument"}"#).unwrap(); + assert_eq!(backend, ErrorClass::Backend(BackendError::InvalidArgument)); + + let unknown: ErrorClass = serde_json::from_str(r#""FutureErrorClass""#).unwrap(); + assert_eq!(unknown, ErrorClass::Unknown); + } + + #[test] + fn wrapping_preserves_the_semantic_head_across_the_wire() { + #[derive(Debug)] + struct Wrapper(DynamoError); + + impl fmt::Display for Wrapper { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "outer error occurred") + f.write_str("transport wrapper") } } - impl std::error::Error for OuterError { + impl std::error::Error for Wrapper { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - Some(&self.source) + Some(&self.0) } } - let inner = std::io::Error::new(std::io::ErrorKind::NotFound, "file not found"); - let outer = OuterError { source: inner }; - let boxed: Box = Box::new(outer); - let dynamo_err = DynamoError::from(boxed); - - assert_eq!(dynamo_err.message(), "outer error occurred"); - assert!(dynamo_err.source().is_some()); + let wrapped = Wrapper( + DynamoError::builder() + .class(ErrorClass::Unavailable) + .reason(ErrorReason::new("transport.disconnected").unwrap()) + .build(), + ); + let error = DynamoError::from(&wrapped as &(dyn std::error::Error + 'static)); - let cause = dynamo_err.source().unwrap(); - assert!(cause.to_string().contains("file not found")); + assert_eq!(error.class(), ErrorClass::Unavailable); + assert_eq!(error.reason().as_str(), "transport.disconnected"); + let value = serde_json::to_value(&error).unwrap(); + assert!(value.get("caused_by").is_some()); + let decoded: DynamoError = serde_json::from_value(value).unwrap(); + assert_eq!(decoded.class(), ErrorClass::Unavailable); + assert_eq!(decoded.reason().as_str(), "transport.disconnected"); } #[test] - fn test_serialization_roundtrip() { - let cause = DynamoError::msg("inner cause"); - let err = DynamoError::builder() - .error_type(ErrorType::Unknown) - .message("outer error") - .cause(cause) - .build(); - - let json = serde_json::to_string(&err).unwrap(); - let deserialized: DynamoError = serde_json::from_str(&json).unwrap(); - - assert_eq!(deserialized.error_type(), ErrorType::Unknown); - assert_eq!(deserialized.message(), "outer error"); - assert!(deserialized.source().is_some()); + fn malformed_semantic_reason_fails_closed() { + let json = r#"{ + "class": "InvalidRequest", + "reason": "INVALID REASON", + "diagnostic": "private details", + "public": {"type": "rate_limit", "limit": 10, "remaining": 0} + }"#; + let err: DynamoError = serde_json::from_str(json).unwrap(); - let cause = deserialized - .source() - .unwrap() - .downcast_ref::() - .unwrap(); - assert_eq!(cause.message(), "inner cause"); + assert_eq!(err.error_type(), ErrorClass::Internal); + assert_eq!(err.class(), ErrorClass::Internal); + assert_eq!(err.reason().as_str(), "runtime.invalid_error"); + assert!(err.public_details().is_none()); } #[test] fn test_error_type_display() { - assert_eq!(ErrorType::Unknown.to_string(), "Unknown"); - assert_eq!(ErrorType::InvalidArgument.to_string(), "InvalidArgument"); - assert_eq!(ErrorType::CannotConnect.to_string(), "CannotConnect"); - assert_eq!(ErrorType::Disconnected.to_string(), "Disconnected"); + assert_eq!(ErrorClass::Unknown.to_string(), "Unknown"); + assert_eq!(ErrorClass::InvalidArgument.to_string(), "InvalidArgument"); + assert_eq!(ErrorClass::CannotConnect.to_string(), "CannotConnect"); + assert_eq!(ErrorClass::Disconnected.to_string(), "Disconnected"); assert_eq!( - ErrorType::ConnectionTimeout.to_string(), + ErrorClass::ConnectionTimeout.to_string(), "ConnectionTimeout" ); - assert_eq!(ErrorType::ResponseTimeout.to_string(), "ResponseTimeout"); - assert_eq!(ErrorType::Cancelled.to_string(), "Cancelled"); + assert_eq!(ErrorClass::ResponseTimeout.to_string(), "ResponseTimeout"); + assert_eq!(ErrorClass::Cancelled.to_string(), "Cancelled"); assert_eq!( - ErrorType::ResourceExhausted.to_string(), + ErrorClass::ResourceExhausted.to_string(), "ResourceExhausted" ); - assert_eq!(ErrorType::WorkerOverloaded.to_string(), "WorkerOverloaded"); - assert_eq!(ErrorType::Unavailable.to_string(), "Unavailable"); + assert_eq!(ErrorClass::WorkerOverloaded.to_string(), "WorkerOverloaded"); + assert_eq!(ErrorClass::Unavailable.to_string(), "Unavailable"); assert_eq!( - ErrorType::WorkerUnavailable.to_string(), + ErrorClass::WorkerUnavailable.to_string(), "WorkerUnavailable" ); assert_eq!( - ErrorType::Backend(BackendError::Unknown).to_string(), + ErrorClass::Backend(BackendError::Unknown).to_string(), "BackendUnknown" ); assert_eq!( - ErrorType::Backend(BackendError::InvalidArgument).to_string(), + ErrorClass::Backend(BackendError::InvalidArgument).to_string(), "BackendInvalidArgument" ); assert_eq!( - ErrorType::Backend(BackendError::CannotConnect).to_string(), + ErrorClass::Backend(BackendError::CannotConnect).to_string(), "BackendCannotConnect" ); assert_eq!( - ErrorType::Backend(BackendError::Disconnected).to_string(), + ErrorClass::Backend(BackendError::Disconnected).to_string(), "BackendDisconnected" ); assert_eq!( - ErrorType::Backend(BackendError::ConnectionTimeout).to_string(), + ErrorClass::Backend(BackendError::ConnectionTimeout).to_string(), "BackendConnectionTimeout" ); assert_eq!( - ErrorType::Backend(BackendError::Cancelled).to_string(), + ErrorClass::Backend(BackendError::Cancelled).to_string(), "BackendCancelled" ); assert_eq!( - ErrorType::Backend(BackendError::EngineShutdown).to_string(), + ErrorClass::Backend(BackendError::EngineShutdown).to_string(), "BackendEngineShutdown" ); assert_eq!( - ErrorType::Backend(BackendError::StreamIncomplete).to_string(), + ErrorClass::Backend(BackendError::StreamIncomplete).to_string(), "BackendStreamIncomplete" ); assert_eq!( - ErrorType::Backend(BackendError::ResponseTimeout).to_string(), + ErrorClass::Backend(BackendError::ResponseTimeout).to_string(), "BackendResponseTimeout" ); } diff --git a/lib/runtime/src/pipeline/network.rs b/lib/runtime/src/pipeline/network.rs index 6c8a9a959135..40f892944fa8 100644 --- a/lib/runtime/src/pipeline/network.rs +++ b/lib/runtime/src/pipeline/network.rs @@ -16,7 +16,7 @@ pub mod quic_response; pub mod tcp; use crate::SystemHealth; -use crate::error::DynamoError; +use crate::error::{DynamoError, ErrorType}; use crate::traits::DistributedRuntimeProvider; use std::sync::{Arc, OnceLock}; @@ -269,8 +269,9 @@ pub struct ResponseStreamPrologue { /// convenience: worker and frontend are deployed independently, so during a /// rolling upgrade an old worker sends a prologue without this field and a /// new worker sends one an old frontend does not know. A required field - /// would break the handshake in both directions; an absent or unrecognized - /// field decodes to `None` and the frontend falls back to the untyped behavior. + /// would break the handshake in both directions; an absent field or unrecognized legacy + /// `error_type` decodes to `None` and the frontend falls back to the untyped behavior. + /// A payload with the semantic `class` field uses `DynamoError`'s fail-closed policy. #[serde( default, deserialize_with = "deserialize_typed_error", @@ -284,7 +285,21 @@ where D: serde::Deserializer<'de>, { let typed_error = Option::::deserialize(deserializer)?; - Ok(typed_error.and_then(|typed_error| serde_json::from_value(typed_error).ok())) + Ok(typed_error.and_then(|typed_error| { + // The legacy enum decoder rejected future variants. ErrorClass is tolerant, so + // compare the raw value with its canonical round trip to preserve that fallback. + if typed_error.get("class").is_none() + && let Some(wire_error_type) = typed_error.get("error_type") + { + let round_trip = serde_json::from_value::(wire_error_type.clone()) + .ok() + .and_then(|error_type| serde_json::to_value(error_type).ok()); + if round_trip.as_ref() != Some(wire_error_type) { + return None; + } + } + serde_json::from_value(typed_error).ok() + })) } /// A pre-stream failure as it reaches the requesting side of the transport. @@ -746,6 +761,56 @@ mod tests { ); } + #[test] + fn prologue_accepts_a_known_legacy_typed_error() { + let legacy = br#"{ + "error":"Generate Error: unsupported input", + "typed_error":{"error_type":"InvalidArgument","message":"unsupported input"} + }"#; + let prologue: ResponseStreamPrologue = + serde_json::from_slice(legacy).expect("a known legacy typed error must decode"); + let error = prologue + .typed_error + .expect("a known legacy typed error must remain typed"); + + assert_eq!(error.error_type(), ErrorType::InvalidArgument); + assert_eq!(error.class(), ErrorType::InvalidRequest); + assert_eq!(error.reason().as_str(), "request.invalid_argument"); + } + + #[test] + fn prologue_ignores_a_future_legacy_typed_error() { + let future = br#"{ + "error":"Generate Error: future failure", + "typed_error":{"error_type":"VariantFromTheFuture","message":"future failure"} + }"#; + let prologue: ResponseStreamPrologue = serde_json::from_slice(future) + .expect("a future legacy typed error must not reject the prologue"); + + assert!(prologue.typed_error.is_none()); + } + + #[test] + fn prologue_fails_closed_for_a_future_semantic_class() { + let future = br#"{ + "error":"Generate Error: future failure", + "typed_error":{ + "class":"FutureErrorClass", + "reason":"runtime.internal", + "public":{"type":"message","message":"must not escape"} + } + }"#; + let prologue: ResponseStreamPrologue = serde_json::from_slice(future) + .expect("a future semantic class must not reject the prologue"); + let error = prologue + .typed_error + .expect("semantic errors use the DynamoError fail-closed identity"); + + assert_eq!(error.class(), ErrorType::Internal); + assert_eq!(error.reason().as_str(), "runtime.invalid_error"); + assert!(error.public_details().is_none()); + } + #[test] fn response_plane_mode_parses_supported_values() { assert_eq!( diff --git a/lib/runtime/src/pipeline/network/egress/addressed_router.rs b/lib/runtime/src/pipeline/network/egress/addressed_router.rs index e5f662c60e12..2ee776e69cd9 100644 --- a/lib/runtime/src/pipeline/network/egress/addressed_router.rs +++ b/lib/runtime/src/pipeline/network/egress/addressed_router.rs @@ -12,7 +12,7 @@ use crate::component::Instance; use crate::discovery::EndpointInstanceId; use crate::dynamo_nvtx_range; use crate::engine::{AsyncEngine, AsyncEngineContextProvider, Data, EngineContextGuard}; -use crate::error::{DynamoError, ErrorType, match_error_chain}; +use crate::error::{DynamoError, ErrorType}; use crate::logging::inject_trace_headers_into_map; use crate::metrics::frontend_perf::STAGE_DURATION_SECONDS; use crate::metrics::request_plane::{ @@ -51,25 +51,29 @@ use tokio::sync::{OwnedSemaphorePermit, Semaphore}; use tokio_stream::{StreamExt, StreamNotifyClose, wrappers::ReceiverStream}; use tracing::Instrument; -/// Error types that must never be attached as the cause of a pre-stream +/// Error reasons that must never be attached as the cause of a pre-stream /// failure, because migration classification walks the whole cause chain. /// -/// Must hold the same set as `NON_MIGRATABLE` in `lib/llm/src/migration.rs`, -/// which cannot be reused directly because `dynamo-llm` depends on -/// `dynamo-runtime` and not the reverse. -/// `migration_sensitive_types_match_the_exclusion_set` there fails if the two -/// lists ever disagree. -pub(crate) const MIGRATION_SENSITIVE_ERROR_TYPES: &[ErrorType] = - &[ErrorType::Cancelled, ErrorType::ResourceExhausted]; - -/// Whether any link of `err`'s chain carries a migration-sensitive type. -/// -/// An empty exclude set reduces [`crate::error::match_error_chain`] to "does -/// any link match", and that is deliberately the same walk migration -/// classification runs: an excluded type nested one link down short-circuits it -/// just as an outer one does. +/// This must match `MIGRATION_BLOCKING_REASONS` in `lib/llm/src/migration.rs`. +pub(crate) const MIGRATION_SENSITIVE_ERROR_REASONS: &[&str] = &[ + "request.cancelled", + "backend.cancelled", + "capacity.exhausted", + "capacity.pool_exhausted", +]; + +/// Whether any link of `err`'s chain carries a migration-sensitive reason. fn is_migration_sensitive(err: &DynamoError) -> bool { - match_error_chain(err, MIGRATION_SENSITIVE_ERROR_TYPES, &[]) + let mut current: Option<&(dyn std::error::Error + 'static)> = Some(err); + while let Some(source) = current { + if let Some(error) = source.downcast_ref::() + && MIGRATION_SENSITIVE_ERROR_REASONS.contains(&error.reason().as_str()) + { + return true; + } + current = source.source(); + } + false } /// Build the error returned when the worker fails before any response bytes. @@ -77,10 +81,10 @@ fn is_migration_sensitive(err: &DynamoError) -> bool { /// The outer type stays [`ErrorType::CannotConnect`], so retry classification /// of the outer error is unchanged. A typed error from the worker's prologue is /// attached as the cause, which consumers reach with -/// [`crate::error::match_error_chain`]. +/// the semantic migration classifier. /// /// Because that walk covers the whole chain, an attached cause is as visible as -/// the outer type, so causes typed one of [`MIGRATION_SENSITIVE_ERROR_TYPES`] +/// the outer type, so causes typed one of [`MIGRATION_SENSITIVE_ERROR_REASONS`] /// are withheld rather than attached. The worker's text stays in the message /// either way; only the machine-readable type is withheld. pub(crate) fn pre_stream_failure_error(error: StreamPrologueError) -> DynamoError { @@ -101,12 +105,11 @@ pub(crate) fn pre_stream_failure_error(error: StreamPrologueError) -> DynamoErro #[cfg(any(test, feature = "testing"))] #[doc(hidden)] pub mod testing { - use super::{DynamoError, ErrorType, StreamPrologueError}; + use super::{DynamoError, StreamPrologueError}; - /// The set `migration_sensitive_types_match_the_exclusion_set` in - /// `lib/llm/src/migration.rs` pins against its `NON_MIGRATABLE`. - pub fn migration_sensitive_error_types() -> &'static [ErrorType] { - super::MIGRATION_SENSITIVE_ERROR_TYPES + /// The semantic reason set is pinned by a cross-crate test in `lib/llm/src/migration.rs`. + pub fn migration_sensitive_error_reasons() -> &'static [&'static str] { + super::MIGRATION_SENSITIVE_ERROR_REASONS } pub fn pre_stream_failure_error(error: StreamPrologueError) -> DynamoError { diff --git a/lib/runtime/src/pipeline/network/egress/route_span.rs b/lib/runtime/src/pipeline/network/egress/route_span.rs index 1280b2d5e23b..bef69fa506ca 100644 --- a/lib/runtime/src/pipeline/network/egress/route_span.rs +++ b/lib/runtime/src/pipeline/network/egress/route_span.rs @@ -172,18 +172,20 @@ where pub fn error_type_from_chain(err: &(dyn StdError + 'static)) -> ErrorType { let mut current = Some(err); - let mut first = None; + let mut fallback = None; while let Some(error) = current { if let Some(dynamo_error) = error.downcast_ref::() { let error_type = dynamo_error.error_type(); - first.get_or_insert(error_type); - if error_type != ErrorType::Unknown { + fallback.get_or_insert(error_type); + if error_type != ErrorType::Unknown + && dynamo_error.reason().as_str() != "runtime.unclassified" + { return error_type; } } current = error.source(); } - first.unwrap_or(ErrorType::Unknown) + fallback.unwrap_or(ErrorType::Unknown) } pub fn error_type_name(error_type: ErrorType) -> &'static str { @@ -208,6 +210,19 @@ pub fn error_type_name(error_type: ErrorType) -> &'static str { ErrorType::Backend(BackendError::Cancelled) => "backend_cancelled", ErrorType::Backend(BackendError::EngineShutdown) => "engine_shutdown", ErrorType::Backend(BackendError::StreamIncomplete) => "stream_incomplete", + ErrorType::InvalidRequest => "invalid_request", + ErrorType::Unauthenticated => "unauthenticated", + ErrorType::PermissionDenied => "permission_denied", + ErrorType::NotFound => "not_found", + ErrorType::Conflict => "conflict", + ErrorType::PayloadTooLarge => "payload_too_large", + ErrorType::UnsupportedMedia => "unsupported_media", + ErrorType::RateLimited => "rate_limited", + ErrorType::CapacityExhausted => "capacity_exhausted", + ErrorType::BackendProtocol => "backend_protocol", + ErrorType::DeadlineExceeded => "deadline_exceeded", + ErrorType::NotImplemented => "not_implemented", + ErrorType::Internal => "internal", } } @@ -238,6 +253,17 @@ fn error_outcome(error_type: ErrorType) -> &'static str { ErrorType::Unavailable | ErrorType::WorkerUnavailable => "unavailable", ErrorType::Cancelled | ErrorType::Backend(BackendError::Cancelled) => "cancelled", ErrorType::Unknown | ErrorType::Backend(BackendError::Unknown) => "error", + ErrorType::InvalidRequest + | ErrorType::Unauthenticated + | ErrorType::PermissionDenied + | ErrorType::NotFound + | ErrorType::Conflict + | ErrorType::PayloadTooLarge + | ErrorType::UnsupportedMedia + | ErrorType::RateLimited + | ErrorType::CapacityExhausted => "rejected", + ErrorType::DeadlineExceeded => "timeout", + ErrorType::BackendProtocol | ErrorType::NotImplemented | ErrorType::Internal => "error", } } diff --git a/lib/runtime/src/pipeline/network/ingress/push_handler.rs b/lib/runtime/src/pipeline/network/ingress/push_handler.rs index a0e9c3f65439..1dd9c3eb8228 100644 --- a/lib/runtime/src/pipeline/network/ingress/push_handler.rs +++ b/lib/runtime/src/pipeline/network/ingress/push_handler.rs @@ -1028,16 +1028,14 @@ mod tests { } /// The negative half: a failure that is not a worker's `generate()` error - /// has no type to recover, and must not acquire one. + /// has no worker classification and uses the canonical internal fallback. #[test] - fn non_generate_pipeline_error_stays_untyped() { + fn non_generate_pipeline_error_is_internal_unclassified() { let e = PipelineError::DeserializationError("bad request payload".to_string()); + let error = typed_error_from_pipeline_error(&e); - assert_eq!( - typed_error_from_pipeline_error(&e).error_type(), - ErrorType::Unknown, - "a transport-side failure must not be reported as a worker error" - ); + assert_eq!(error.class(), ErrorType::Internal); + assert_eq!(error.reason().as_str(), "runtime.unclassified"); } #[derive(Default)] From c52945c13eba34faa9437326b4377c474e2843f6 Mon Sep 17 00:00:00 2001 From: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> Date: Tue, 15 Sep 2026 12:19:50 +0000 Subject: [PATCH 002/191] docs: refresh community events Automated refresh from the public Dynamo Google Calendar. Generated by .github/workflows/community-events-refresh.yml. Signed-off-by: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> --- docs/fern/components/events.generated.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fern/components/events.generated.ts b/docs/fern/components/events.generated.ts index 626f2dc912ef..a5662e319e99 100644 --- a/docs/fern/components/events.generated.ts +++ b/docs/fern/components/events.generated.ts @@ -22,7 +22,7 @@ export interface DynamoEvent { } /** Generation date in Pacific, YYYY-MM-DD. The calendar grid treats this as "today". */ -export const GENERATED_ON = "2026-09-14"; +export const GENERATED_ON = "2026-09-15"; export const UPCOMING_EVENTS: DynamoEvent[] = []; From 055e989ef9c40db65fde34f92c622bf97471082f Mon Sep 17 00:00:00 2001 From: Yingge He <157551214+yinggeh@users.noreply.github.com> Date: Wed, 16 Sep 2026 00:25:39 +0800 Subject: [PATCH 003/191] feat(llm): carry KServe requested outputs on tensor requests (#14618) Signed-off-by: Yingge He --- lib/llm/src/grpc/service/tensor.rs | 99 +++++++++++++++++++++++++++++- lib/llm/src/protocols/tensor.rs | 13 ++++ 2 files changed, 111 insertions(+), 1 deletion(-) diff --git a/lib/llm/src/grpc/service/tensor.rs b/lib/llm/src/grpc/service/tensor.rs index f1d628fb0042..d488c1ea89c8 100644 --- a/lib/llm/src/grpc/service/tensor.rs +++ b/lib/llm/src/grpc/service/tensor.rs @@ -28,7 +28,7 @@ use crate::http::service::{ use crate::protocols::tensor; use crate::protocols::tensor::{ - NvCreateTensorRequest, NvCreateTensorResponse, Tensor, TensorMetadata, + NvCreateTensorRequest, NvCreateTensorResponse, RequestedOutput, Tensor, TensorMetadata, }; use crate::grpc::service::kserve::inference; @@ -303,10 +303,20 @@ impl TryFrom for NvCreateTensorRequest { }, model: request.model_name.clone(), tensors: Vec::new(), + outputs: Vec::with_capacity(request.outputs.len()), parameters, nvext: None, }; + // Requested outputs select which model outputs come back and how; their + // parameters (e.g. `classification`) are interpreted by the worker. + for output in &request.outputs { + tensor_request.outputs.push(RequestedOutput { + name: output.name.clone(), + parameters: convert_kserve_to_dynamo_params(&output.parameters)?, + }); + } + // iterate through inputs for (idx, input) in request.inputs.into_iter().enumerate() { // Extract per-tensor parameters @@ -853,6 +863,93 @@ impl FromStr for tensor::DataType { #[cfg(test)] mod tests { use super::*; + use inference::model_infer_request::InferRequestedOutputTensor; + use std::collections::HashMap; + + fn param(choice: Option) -> inference::InferParameter { + inference::InferParameter { + parameter_choice: choice, + } + } + + fn classification(k: i64) -> HashMap { + HashMap::from([( + "classification".to_string(), + param(Some(ParameterChoice::Int64Param(k))), + )]) + } + + fn requested_output( + name: &str, + parameters: HashMap, + ) -> InferRequestedOutputTensor { + InferRequestedOutputTensor { + name: name.to_string(), + parameters, + } + } + + fn infer_request(outputs: Vec) -> inference::ModelInferRequest { + inference::ModelInferRequest { + model_name: "classifier".to_string(), + outputs, + ..Default::default() + } + } + + #[test] + fn requested_outputs_keep_their_parameters() { + let converted = NvCreateTensorRequest::try_from(infer_request(vec![ + requested_output("OUTPUT0", classification(3)), + requested_output("OUTPUT1", HashMap::new()), + ])) + .unwrap(); + + assert_eq!( + converted.outputs, + vec![ + RequestedOutput { + name: "OUTPUT0".to_string(), + parameters: tensor::Parameters::from([( + "classification".to_string(), + tensor::ParameterValue::Int64(3), + )]), + }, + RequestedOutput { + name: "OUTPUT1".to_string(), + parameters: tensor::Parameters::new(), + }, + ] + ); + assert_eq!( + serde_json::to_value(&converted.outputs[0]).unwrap(), + serde_json::json!({"name": "OUTPUT0", "parameters": {"classification": {"int64": 3}}}) + ); + } + + #[test] + fn requested_outputs_empty_are_omitted_from_json() { + let converted = NvCreateTensorRequest::try_from(infer_request(vec![])).unwrap(); + assert!(converted.outputs.is_empty()); + assert!( + serde_json::to_value(&converted) + .unwrap() + .get("outputs") + .is_none() + ); + } + + #[test] + fn requested_outputs_valueless_parameter_is_rejected() { + let error = NvCreateTensorRequest::try_from(infer_request(vec![requested_output( + "OUTPUT0", + HashMap::from([("classification".to_string(), param(None))]), + )])) + .unwrap_err(); + + assert_eq!(error.code(), tonic::Code::InvalidArgument); + assert!(error.message().contains("classification")); + } // Golden bytes hardcoded (not derived from to_le_bytes) so a symmetric // break in both encode/decode still fires this test. diff --git a/lib/llm/src/protocols/tensor.rs b/lib/llm/src/protocols/tensor.rs index a3241973a623..38dd61c3fabd 100644 --- a/lib/llm/src/protocols/tensor.rs +++ b/lib/llm/src/protocols/tensor.rs @@ -154,6 +154,15 @@ pub struct Tensor { pub data: FlattenTensor, } +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +#[serde(deny_unknown_fields)] +pub struct RequestedOutput { + pub name: String, + + #[serde(skip_serializing_if = "HashMap::is_empty", default)] + pub parameters: Parameters, +} + impl validator::Validate for Tensor { fn validate(&self) -> Result<(), validator::ValidationErrors> { use validator::{ValidationError, ValidationErrors}; @@ -207,6 +216,10 @@ pub struct NvCreateTensorRequest { #[validate(nested)] pub tensors: Vec, + /// Outputs the client asked for. An empty list asks for every model output. + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub outputs: Vec, + /// Optional request-level parameters #[serde(skip_serializing_if = "HashMap::is_empty", default)] pub parameters: Parameters, From 5292fc96c7d27c8b6546452c11eceeb8e543a76e Mon Sep 17 00:00:00 2001 From: Xianlu Bird Date: Wed, 16 Sep 2026 00:39:27 +0800 Subject: [PATCH 004/191] test(operator): align DGDR goldens with current AIC backend slot (#14836) Signed-off-by: xianlubird --- .../testdata/dgdr/deployment/output.yaml | 12 ++++++------ .../controller/testdata/dgdr/grove/output.yaml | 8 ++++---- .../controller/testdata/dgdr/lws/output.yaml | 14 +++++++------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/deploy/operator/internal/controller/testdata/dgdr/deployment/output.yaml b/deploy/operator/internal/controller/testdata/dgdr/deployment/output.yaml index a65028026569..16f41d151ce1 100644 --- a/deploy/operator/internal/controller/testdata/dgdr/deployment/output.yaml +++ b/deploy/operator/internal/controller/testdata/dgdr/deployment/output.yaml @@ -39,7 +39,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -82,7 +82,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -139,7 +139,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -213,7 +213,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -498,7 +498,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -676,7 +676,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size diff --git a/deploy/operator/internal/controller/testdata/dgdr/grove/output.yaml b/deploy/operator/internal/controller/testdata/dgdr/grove/output.yaml index 349ccd249743..2d4655c400f2 100644 --- a/deploy/operator/internal/controller/testdata/dgdr/grove/output.yaml +++ b/deploy/operator/internal/controller/testdata/dgdr/grove/output.yaml @@ -41,7 +41,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -85,7 +85,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -245,7 +245,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -385,7 +385,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size diff --git a/deploy/operator/internal/controller/testdata/dgdr/lws/output.yaml b/deploy/operator/internal/controller/testdata/dgdr/lws/output.yaml index e9095eb616b7..0f3589e29a6e 100644 --- a/deploy/operator/internal/controller/testdata/dgdr/lws/output.yaml +++ b/deploy/operator/internal/controller/testdata/dgdr/lws/output.yaml @@ -41,7 +41,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -84,7 +84,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -143,7 +143,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -323,7 +323,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -459,7 +459,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -621,7 +621,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size @@ -799,7 +799,7 @@ spec: - --aic-backend - vllm - --aic-backend-version - - 0.14.0 + - current - --aic-system - h100_sxm - --aic-tp-size From 95cadce97dbcf3e2b0d79fdac05a2a2e03e1b1ff Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Tue, 15 Sep 2026 10:23:37 -0700 Subject: [PATCH 005/191] fix(vllm): support RL discovery with released vLLM 0.28 for dynamo release 1.5.0 (#14840) Signed-off-by: Biswa Panda --- lib/sidecar/vllm/README.md | 7 +- lib/sidecar/vllm/deploy/agg.yaml | 3 +- lib/sidecar/vllm/src/args.rs | 8 ++ lib/sidecar/vllm/src/engine.rs | 3 +- lib/sidecar/vllm/src/model.rs | 52 ++++++--- lib/sidecar/vllm/src/tests.rs | 174 ++++++++++++++++++++++++++++++- 6 files changed, 227 insertions(+), 20 deletions(-) diff --git a/lib/sidecar/vllm/README.md b/lib/sidecar/vllm/README.md index c2c4d87073a3..940b40ee65ac 100644 --- a/lib/sidecar/vllm/README.md +++ b/lib/sidecar/vllm/README.md @@ -105,7 +105,7 @@ provided through the environment. ### RL workflows -Start vLLM with the capabilities required by the workflow, then opt the sidecar into RL discovery: +Start vLLM with the capabilities required by the workflow, then opt the sidecar into RL discovery. This example targets vLLM 0.28: ```bash vllm-rs serve Qwen/Qwen3-0.6B \ @@ -118,15 +118,20 @@ vllm-rs serve Qwen/Qwen3-0.6B \ DYN_SYSTEM_PORT=8081 dynamo-vllm-sidecar \ --grpc-endpoint 127.0.0.1:50051 \ --vllm-http-endpoint http://rollout-0.rl.svc.cluster.local:8000 \ + --vllm-rl-world-size 1 \ --enable-rl ``` +For newer vLLM releases, use the same command without `--vllm-rl-world-size`; the nonzero value reported over gRPC is authoritative. + Replace `rollout-0.rl.svc.cluster.local` with a private address that the RL controller can route to. Binding vLLM to `0.0.0.0` exposes both its HTTP and gRPC listeners, so restrict both ports with host firewall rules, Kubernetes NetworkPolicy, or an equivalent trusted-network control. A colocated sidecar can continue to use loopback for `--grpc-endpoint`; the advertised HTTP URL must be routable from the controller, not merely from the worker. `--enable-rl` (or `DYN_ENABLE_RL=true`) requires the Dynamo system server (`DYN_SYSTEM_PORT=0` or a positive port) and registers `dyn://..rl`, which lets the Dynamo frontend discover this worker and its `/engine/control/*` and `/engine/update/*` routes through `/v1/rl/workers`. The sidecar advertises pause/resume, sleep-status, and weight-version controls when the vLLM server reports the RL gRPC API; mutating sleep/wake routes require `--enable-sleep-mode`, weight-transfer routes require `--weight-transfer-config`, and draft updates require speculative decoding support. The sidecar publishes `--vllm-http-endpoint` (or `VLLM_HTTP_ENDPOINT`) only as part of this RL worker metadata. Native vLLM lifecycle and weight-update operations use the typed gRPC Control service and do not require `--vllm-http-endpoint`. Configure the HTTP base URL only when an RL framework needs a compatibility operation that is not represented by the typed service, such as a custom `worker_extension_cls` method invoked through `/collective_rpc`. +vLLM 0.28 does not report its engine world size over production gRPC or HTTP routes. When RL is enabled against that release, pass `--vllm-rl-world-size` (or `DYN_VLLM_RL_WORLD_SIZE`) with the total process count across tensor, pipeline, prefill-context, and data parallelism (`TP * PP * PCP * DP`); the example uses the default one-rank topology. Do not substitute decode-context parallelism for PCP because those settings do not have a one-to-one relationship. Newer vLLM releases report the per-data-parallel engine value over gRPC, so omit the compatibility option for them. + The HTTP value must be a controller-routable `http://` or `https://` base URL. Path prefixes are preserved, so a reverse proxy can advertise a value such as `https://rollout.example.internal/vllm-admin`; downstream clients append the compatibility route beneath that prefix. User information, query strings, and fragments are rejected. Do not place credentials or tokens in the URL. The update request bodies match vLLM's RL HTTP schemas: `init_weight_transfer_engine` requires `{"init_info": {...}}`, `update_weights` requires `{"update_info": {...}}`, `finish_weight_update` accepts `{"weight_version": "..."}`, and `update_weight_version` requires `{"new_version": "..."}`. Weight tensors remain on the configured NCCL, IPC, or sparse-NCCL transport; only backend metadata crosses gRPC. diff --git a/lib/sidecar/vllm/deploy/agg.yaml b/lib/sidecar/vllm/deploy/agg.yaml index f7a5cd75a9f7..44f70c366b83 100644 --- a/lib/sidecar/vllm/deploy/agg.yaml +++ b/lib/sidecar/vllm/deploy/agg.yaml @@ -39,7 +39,8 @@ spec: spec: # vllm-engine as a native sidecar (initContainer, restartPolicy: Always): # it starts before `main` and stops after it. Stock multi-arch vLLM image - # (v0.28.0 ships vllm-rs; its gRPC matches the sidecar's pinned vllm-proto crate). + # (v0.28.0 ships vllm-rs; its base gRPC services match the sidecar's pinned + # vllm-proto crate, while RL requires the documented legacy world-size option). initContainers: - name: vllm-engine image: vllm/vllm-openai:v0.28.0 diff --git a/lib/sidecar/vllm/src/args.rs b/lib/sidecar/vllm/src/args.rs index 3a4e5757b4ad..e5aa3523ecbe 100644 --- a/lib/sidecar/vllm/src/args.rs +++ b/lib/sidecar/vllm/src/args.rs @@ -3,6 +3,8 @@ use dynamo_sidecar_common::{HttpEndpoint, SidecarArgs}; +use std::num::NonZeroU32; + fn parse_http_endpoint(raw: &str) -> Result { HttpEndpoint::parse(raw, "--vllm-http-endpoint").map_err(|error| error.to_string()) } @@ -23,4 +25,10 @@ pub(crate) struct Args { value_parser = parse_http_endpoint )] pub vllm_http_endpoint: Option, + + /// Optional total RL process world size for vLLM versions that omit it from gRPC metadata. + /// + /// The value includes tensor, pipeline, prefill-context, and data parallelism. + #[arg(long, env = "DYN_VLLM_RL_WORLD_SIZE")] + pub vllm_rl_world_size: Option, } diff --git a/lib/sidecar/vllm/src/engine.rs b/lib/sidecar/vllm/src/engine.rs index 8d739d94f541..66cba70f0a98 100644 --- a/lib/sidecar/vllm/src/engine.rs +++ b/lib/sidecar/vllm/src/engine.rs @@ -89,6 +89,7 @@ impl VllmSidecarEngine { let endpoint = args.sidecar.grpc_endpoint; let enable_rl = args.sidecar.common.enable_rl; + let vllm_rl_world_size = args.vllm_rl_world_size.map(|world_size| world_size.get()); let vllm_http_url = args .vllm_http_endpoint .map(|endpoint| { @@ -114,7 +115,7 @@ impl VllmSidecarEngine { ))); } let rl_metadata = enable_rl - .then(|| model.rl_worker_metadata(vllm_http_url)) + .then(|| model.rl_worker_metadata(vllm_http_url, vllm_rl_world_size)) .transpose()?; let engine = Self::new(endpoint, model.clone(), mode, transport); let config = WorkerConfig { diff --git a/lib/sidecar/vllm/src/model.rs b/lib/sidecar/vllm/src/model.rs index 41ec8599502b..74840a01c752 100644 --- a/lib/sidecar/vllm/src/model.rs +++ b/lib/sidecar/vllm/src/model.rs @@ -106,6 +106,7 @@ impl DiscoveredModel { pub(crate) fn rl_worker_metadata( &self, admin_base_url: Option, + configured_world_size: Option, ) -> Result { let parallelism = self.server.parallelism.as_ref().ok_or_else(|| { client::protocol_error("RL discovery requires vLLM parallelism metadata") @@ -116,21 +117,48 @@ impl DiscoveredModel { nonzero(parallelism.pipeline_parallel_size).ok_or_else(|| { client::protocol_error("vLLM reports a pipeline-parallel size of zero") })?; - let engine_world_size = u32::try_from(parallelism.world_size) - .ok() - .and_then(nonzero) - .ok_or_else(|| client::protocol_error("vLLM reports an invalid engine world size"))?; + let data_parallel_size = nonzero(parallelism.data_parallel_size) + .ok_or_else(|| client::protocol_error("vLLM reports a data-parallel size of zero"))?; let expected_minimum_world_size = tensor_parallel_size .checked_mul(pipeline_parallel_size) .ok_or_else(|| client::protocol_error("vLLM reports an invalid RL world size"))?; - if engine_world_size % expected_minimum_world_size != 0 { - return Err(client::protocol_error( - "vLLM reports an engine world size that is not divisible by TP * PP", - )); - } - let world_size = engine_world_size - .checked_mul(parallelism.data_parallel_size) - .ok_or_else(|| client::protocol_error("vLLM reports an invalid RL world size"))?; + let world_size = match u32::try_from(parallelism.world_size).ok().and_then(nonzero) { + Some(engine_world_size) => { + if engine_world_size % expected_minimum_world_size != 0 { + return Err(client::protocol_error( + "vLLM reports an engine world size that is not divisible by TP * PP", + )); + } + engine_world_size + .checked_mul(data_parallel_size) + .ok_or_else(|| { + client::protocol_error("vLLM reports an invalid RL world size") + })? + } + None if parallelism.world_size == 0 => { + let world_size = configured_world_size.ok_or_else(|| { + client::invalid_argument( + "--vllm-rl-world-size is required when vLLM omits engine world size from gRPC metadata", + ) + })?; + let expected_total_world_size = expected_minimum_world_size + .checked_mul(data_parallel_size) + .ok_or_else(|| { + client::protocol_error("vLLM reports an invalid RL world size") + })?; + if world_size % expected_total_world_size != 0 { + return Err(client::invalid_argument( + "--vllm-rl-world-size must be divisible by TP * PP * DP", + )); + } + world_size + } + None => { + return Err(client::protocol_error( + "vLLM reports an invalid engine world size", + )); + } + }; RlWorkerMetadata::new(world_size, admin_base_url) .map_err(|error| client::protocol_error(error.to_string())) } diff --git a/lib/sidecar/vllm/src/tests.rs b/lib/sidecar/vllm/src/tests.rs index c1d998c2e1b7..0528a3816d79 100644 --- a/lib/sidecar/vllm/src/tests.rs +++ b/lib/sidecar/vllm/src/tests.rs @@ -41,6 +41,7 @@ struct FakeVllm { data_parallel_rank_metadata: Arc>>>, peers: Arc>>, model_info_override: Arc>>, + server_info_override: Arc>>, reject: Arc, hang: Arc, hang_before_headers: Arc, @@ -276,7 +277,13 @@ impl pb::control_server::Control for FakeVllm { &self, _request: Request, ) -> Result, Status> { - Ok(Response::new(server_info())) + Ok(Response::new( + self.server_info_override + .lock() + .await + .clone() + .unwrap_or_else(server_info), + )) } async fn get_model_info( @@ -538,11 +545,26 @@ fn rl_worker_metadata_identifies_zero_parallelism_dimensions() { _ => unreachable!(), } let model = DiscoveredModel::from_proto(model_info(), server).expect("valid discovery"); - let error = model.rl_worker_metadata(None).unwrap_err(); + let error = model.rl_worker_metadata(None, None).unwrap_err(); assert!(error.to_string().contains(expected)); } } +#[test] +fn discovery_rejects_zero_data_parallelism() { + let mut server = server_info(); + server + .parallelism + .as_mut() + .expect("parallelism metadata") + .data_parallel_size = 0; + + let error = DiscoveredModel::from_proto(model_info(), server) + .expect_err("zero data parallelism must fail discovery"); + + assert!(error.to_string().contains("data-parallel size of zero")); +} + #[test] fn startup_compatibility_rejects_tensor_or_pipeline_parallelism_change() { let bootstrap = DiscoveredModel::from_proto(model_info(), server_info()) @@ -1121,12 +1143,35 @@ fn engine_with_server_info( async fn engine_from_args( endpoint: &str, ) -> (VllmSidecarEngine, dynamo_backend_common::WorkerConfig) { - let argv = vec![ + try_engine_from_args(endpoint, "http://worker:8120") + .await + .expect("bootstrap discovery") +} + +async fn try_engine_from_args( + endpoint: &str, + http_endpoint: &str, +) -> Result< + (VllmSidecarEngine, dynamo_backend_common::WorkerConfig), + dynamo_backend_common::DynamoError, +> { + try_engine_from_args_with_world_size(endpoint, http_endpoint, None).await +} + +async fn try_engine_from_args_with_world_size( + endpoint: &str, + http_endpoint: &str, + world_size: Option, +) -> Result< + (VllmSidecarEngine, dynamo_backend_common::WorkerConfig), + dynamo_backend_common::DynamoError, +> { + let mut argv = vec![ "dynamo-vllm-sidecar".to_string(), "--grpc-endpoint".to_string(), endpoint.to_string(), "--vllm-http-endpoint".to_string(), - "http://worker:8120".to_string(), + http_endpoint.to_string(), "--enable-rl".to_string(), "--grpc-connections".to_string(), "2".to_string(), @@ -1135,10 +1180,12 @@ async fn engine_from_args( "--grpc-connect-attempt-timeout-secs".to_string(), "1".to_string(), ]; + if let Some(world_size) = world_size { + argv.extend(["--vllm-rl-world-size".to_string(), world_size.to_string()]); + } tokio::task::spawn_blocking(move || VllmSidecarEngine::from_args(Some(argv))) .await .expect("bootstrap task") - .expect("bootstrap discovery") } async fn collect( @@ -1236,6 +1283,123 @@ async fn startup_rejects_model_identity_change_after_bootstrap() { assert!(engine.start(0).await.is_err()); } +#[tokio::test] +async fn rl_startup_uses_configured_v028_world_size() { + let service = FakeVllm::default(); + let mut legacy_server = server_info(); + legacy_server + .parallelism + .as_mut() + .expect("parallelism metadata") + .world_size = 0; + *service.server_info_override.lock().await = Some(legacy_server); + let grpc = FakeServer::start(service).await; + + let (_, worker) = + try_engine_from_args_with_world_size(&grpc.endpoint, "http://worker:8120", Some(8)) + .await + .expect("configured vLLM 0.28 world size should allow RL discovery"); + + assert_eq!( + worker.rl_metadata, + Some( + RlWorkerMetadata::new( + 8, + Some(RlAdminBaseUrl::parse("http://worker:8120/").expect("admin URL")), + ) + .expect("worker metadata") + ) + ); +} + +#[tokio::test] +async fn rl_startup_prefers_authoritative_grpc_world_size() { + let grpc = FakeServer::start(FakeVllm::default()).await; + + let (_, worker) = + try_engine_from_args_with_world_size(&grpc.endpoint, "http://worker:8120", Some(8)) + .await + .expect("nonzero gRPC world size should remain authoritative"); + + assert_eq!( + worker.rl_metadata, + Some( + RlWorkerMetadata::new( + 4, + Some(RlAdminBaseUrl::parse("http://worker:8120/").expect("admin URL")), + ) + .expect("worker metadata") + ) + ); +} + +#[tokio::test] +async fn rl_startup_requires_configured_v028_world_size() { + let service = FakeVllm::default(); + let mut legacy_server = server_info(); + legacy_server + .parallelism + .as_mut() + .expect("parallelism metadata") + .world_size = 0; + *service.server_info_override.lock().await = Some(legacy_server); + let grpc = FakeServer::start(service).await; + + let error = match try_engine_from_args(&grpc.endpoint, "http://worker:8120").await { + Ok(_) => panic!("missing configured vLLM 0.28 world size must fail"), + Err(error) => error, + }; + + assert!(error.to_string().contains("--vllm-rl-world-size")); +} + +#[tokio::test] +async fn rl_startup_rejects_incompatible_configured_v028_world_size() { + let service = FakeVllm::default(); + let mut legacy_server = server_info(); + legacy_server + .parallelism + .as_mut() + .expect("parallelism metadata") + .world_size = 0; + *service.server_info_override.lock().await = Some(legacy_server); + let grpc = FakeServer::start(service).await; + + let error = + match try_engine_from_args_with_world_size(&grpc.endpoint, "http://worker:8120", Some(7)) + .await + { + Ok(_) => panic!("configured world size must match the discovered topology"), + Err(error) => error, + }; + + assert_eq!( + error.error_type(), + ErrorType::Backend(BackendError::InvalidArgument) + ); + assert!( + error + .to_string() + .contains("must be divisible by TP * PP * DP") + ); +} + +#[tokio::test] +async fn rl_startup_rejects_zero_configured_world_size() { + let error = match try_engine_from_args_with_world_size( + "http://127.0.0.1:1", + "http://worker:8120", + Some(0), + ) + .await + { + Ok(_) => panic!("configured world size must be positive"), + Err(error) => error, + }; + + assert!(error.to_string().contains("--vllm-rl-world-size")); +} + #[tokio::test] async fn encode_startup_rejects_non_multimodal_engine() { let server = FakeServer::start(FakeVllm::default()).await; From a6fa367ed26a293e001770a81625eaa38eafe025 Mon Sep 17 00:00:00 2001 From: vanshil shah <49670736+vanshilshah97@users.noreply.github.com> Date: Tue, 15 Sep 2026 13:07:46 -0700 Subject: [PATCH 006/191] feat(recipes): add A.X-K2 NVFP4 B200 serving and benchmark recipes (#14635) Signed-off-by: Codex Signed-off-by: vanshil shah <49670736+vanshilshah97@users.noreply.github.com> Co-authored-by: Codex --- docs/fern/components/RecipeStyles.tsx | 2 + docs/fern/index.yml | 3 + docs/fern/pages/recipes/_catalog/index.yaml | 1 + .../pages/recipes/_catalog/recipes/ax-k2.yaml | 80 ++++ .../pages/recipes/model-recipes/ax-k2.mdx | 203 ++++++++++ .../pages/recipes/model-recipes/overview.mdx | 16 +- recipes/README.md | 3 +- recipes/ax-k2/README.md | 8 + recipes/ax-k2/model-cache/model-cache.yaml | 27 ++ recipes/ax-k2/model-cache/model-download.yaml | 75 ++++ recipes/ax-k2/perf/README.md | 121 ++++++ recipes/ax-k2/perf/perf.yaml | 96 +++++ recipes/ax-k2/perf/runner.configmap.yaml | 291 ++++++++++++++ .../vllm/agg-b200-chat/.kustomize-matrix.yaml | 21 + recipes/ax-k2/vllm/agg-b200-chat/README.md | 37 ++ .../vllm/agg-b200-chat/deploy-generic.yaml | 207 ++++++++++ .../agg-b200-chat/kustomize/base/deploy.yaml | 200 +++++++++ .../kustomize/base/kustomization.yaml | 21 + .../overlays/generic/kustomization.yaml | 13 + .../disagg-b200-chat/.kustomize-matrix.yaml | 21 + recipes/ax-k2/vllm/disagg-b200-chat/README.md | 60 +++ .../vllm/disagg-b200-chat/deploy-generic.yaml | 379 ++++++++++++++++++ .../kustomize/base/deploy.yaml | 379 ++++++++++++++++++ .../kustomize/base/kustomization.yaml | 21 + .../overlays/generic/kustomization.yaml | 13 + 25 files changed, 2295 insertions(+), 3 deletions(-) create mode 100644 docs/fern/pages/recipes/_catalog/recipes/ax-k2.yaml create mode 100644 docs/fern/pages/recipes/model-recipes/ax-k2.mdx create mode 100644 recipes/ax-k2/README.md create mode 100644 recipes/ax-k2/model-cache/model-cache.yaml create mode 100644 recipes/ax-k2/model-cache/model-download.yaml create mode 100644 recipes/ax-k2/perf/README.md create mode 100644 recipes/ax-k2/perf/perf.yaml create mode 100644 recipes/ax-k2/perf/runner.configmap.yaml create mode 100644 recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml create mode 100644 recipes/ax-k2/vllm/agg-b200-chat/README.md create mode 100644 recipes/ax-k2/vllm/agg-b200-chat/deploy-generic.yaml create mode 100644 recipes/ax-k2/vllm/agg-b200-chat/kustomize/base/deploy.yaml create mode 100644 recipes/ax-k2/vllm/agg-b200-chat/kustomize/base/kustomization.yaml create mode 100644 recipes/ax-k2/vllm/agg-b200-chat/kustomize/overlays/generic/kustomization.yaml create mode 100644 recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml create mode 100644 recipes/ax-k2/vllm/disagg-b200-chat/README.md create mode 100644 recipes/ax-k2/vllm/disagg-b200-chat/deploy-generic.yaml create mode 100644 recipes/ax-k2/vllm/disagg-b200-chat/kustomize/base/deploy.yaml create mode 100644 recipes/ax-k2/vllm/disagg-b200-chat/kustomize/base/kustomization.yaml create mode 100644 recipes/ax-k2/vllm/disagg-b200-chat/kustomize/overlays/generic/kustomization.yaml diff --git a/docs/fern/components/RecipeStyles.tsx b/docs/fern/components/RecipeStyles.tsx index a23ef3288da0..65e197c30450 100644 --- a/docs/fern/components/RecipeStyles.tsx +++ b/docs/fern/components/RecipeStyles.tsx @@ -193,6 +193,7 @@ main.fern-main:not(:has(> .fern-layout-content-wrapper ~ aside)) .fern-layout-gu #provider-moonshot:checked ~ .dynamo-recipe-browser label[for="provider-moonshot"], #provider-meta:checked ~ .dynamo-recipe-browser label[for="provider-meta"], #provider-openai:checked ~ .dynamo-recipe-browser label[for="provider-openai"], +#provider-skt:checked ~ .dynamo-recipe-browser label[for="provider-skt"], #provider-zai:checked ~ .dynamo-recipe-browser label[for="provider-zai"], #provider-thinkingmachines:checked ~ .dynamo-recipe-browser label[for="provider-thinkingmachines"], #runtime-all:checked ~ .dynamo-recipe-browser label[for="runtime-all"], @@ -667,6 +668,7 @@ main.fern-main:not(:has(> .fern-layout-content-wrapper ~ aside)) .fern-layout-gu #provider-moonshot:checked ~ .dynamo-model-grid [data-recipe-card]:not([data-provider~="moonshot"]), #provider-meta:checked ~ .dynamo-model-grid [data-recipe-card]:not([data-provider~="meta"]), #provider-openai:checked ~ .dynamo-model-grid [data-recipe-card]:not([data-provider~="openai"]), +#provider-skt:checked ~ .dynamo-model-grid [data-recipe-card]:not([data-provider~="skt"]), #provider-zai:checked ~ .dynamo-model-grid [data-recipe-card]:not([data-provider~="zai"]), #provider-thinkingmachines:checked ~ .dynamo-model-grid [data-recipe-card]:not([data-provider~="thinkingmachines"]), #runtime-vllm:checked ~ .dynamo-model-grid [data-recipe-card]:not([data-runtime~="vllm"]), diff --git a/docs/fern/index.yml b/docs/fern/index.yml index c51466d0200b..2ea7d84d905f 100644 --- a/docs/fern/index.yml +++ b/docs/fern/index.yml @@ -792,6 +792,9 @@ navigation: - page: GLM-5.3-Flash path: pages/recipes/model-recipes/glm-5-3-flash.mdx slug: glm-5-3-flash + - page: A.X-K2 + path: pages/recipes/model-recipes/ax-k2.mdx + slug: ax-k2 - page: Kimi-K3 path: pages/recipes/model-recipes/kimi-k3.mdx slug: kimi-k3 diff --git a/docs/fern/pages/recipes/_catalog/index.yaml b/docs/fern/pages/recipes/_catalog/index.yaml index f865c118a39e..5e628ac2a4e2 100644 --- a/docs/fern/pages/recipes/_catalog/index.yaml +++ b/docs/fern/pages/recipes/_catalog/index.yaml @@ -13,6 +13,7 @@ recipes: - gemma4-31b - deepseek-v4-1-flash - glm-5-3-flash +- ax-k2 - kimi-k3 - qwen-3-8-flash-next - qwen-3-8-2-4t-a95b-fp8 diff --git a/docs/fern/pages/recipes/_catalog/recipes/ax-k2.yaml b/docs/fern/pages/recipes/_catalog/recipes/ax-k2.yaml new file mode 100644 index 000000000000..bed3d1e7b1a0 --- /dev/null +++ b/docs/fern/pages/recipes/_catalog/recipes/ax-k2.yaml @@ -0,0 +1,80 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +id: ax-k2 +title: A.X-K2 +page: pages/recipes/model-recipes/ax-k2.mdx +provider: skt +model: + name: A.X-K2 + hf_id: skt/A.X-K2-NVFP4 + precision: NVFP4 weights, FP8 KV cache +status: experimental +targets: +- id: vllm-agg-b200 + recommended: false + hardware: + gpu: B200 + count: 8 + runtime: + framework: vllm + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + topology: aggregated + techniques: + - nvfp4 + - fp8-kv-cache + - kv-aware-routing + - eagle3 + workload: + type: chat + traffic: 8K/1K Mooncake chat, 15% trace subset, 70% KV reuse, concurrency 16 + deploy: + asset: recipes/ax-k2/vllm/agg-b200-chat/deploy-generic.yaml + expected_performance: + available: true + summary: 'C=16, chat 15%: 76.49 output toks/sec/GPU, 55.83 mean toks/sec/user, 0.525 s p50 TTFT. Historical + synthetic EAGLE3 AL=2.12 run; 1765/1765 successful requests, 0 failed, 20 warmup requests. Predates + the published NVCR runtime update.' + benchmark: + tool: aiperf + asset: recipes/ax-k2/perf/perf.yaml +- id: vllm-disagg-b200 + recommended: false + hardware: + gpu: B200 + count: 12 + runtime: + framework: vllm + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + topology: disaggregated + techniques: + - nvfp4 + - fp8-kv-cache + - kv-aware-routing + - eagle3 + workload: + type: chat + traffic: 8K/1K Mooncake chat, 15% trace subset, 70% KV reuse, concurrency 16 + deploy: + asset: recipes/ax-k2/vllm/disagg-b200-chat/deploy-generic.yaml + expected_performance: + available: true + summary: 'C=16, chat 15%: 61.97 output toks/sec/GPU, 83 mean toks/sec/user, 3.879 s p50 TTFT. Historical + synthetic EAGLE3 AL=2.12 run; 1755/1765 successful requests, 10 failed, 32 warmup requests. Predates + the published NVCR runtime update.' +related_benchmarks: [] +maintainer: Vanshil Shah +gaps: +- Published C16 short-trace results predate the published NVCR runtime; no measurements for this image. +- Disaggregated C16 run had 10 failed requests out of 1765; warmup differed between topologies. diff --git a/docs/fern/pages/recipes/model-recipes/ax-k2.mdx b/docs/fern/pages/recipes/model-recipes/ax-k2.mdx new file mode 100644 index 000000000000..d452f95c51e4 --- /dev/null +++ b/docs/fern/pages/recipes/model-recipes/ax-k2.mdx @@ -0,0 +1,203 @@ +--- +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +title: A.X-K2 +subtitle: Serve A.X-K2 with Dynamo and vLLM on B200, aggregated or disaggregated. +--- + +import { RecipeStyles } from "@/components/RecipeStyles"; + + + +Deploy SK Telecom's [A.X-K2](https://huggingface.co/skt/A.X-K2-NVFP4) with +NVIDIA Dynamo, NVFP4 weights, FP8 KV cache, KV-aware routing, and EAGLE3 +speculative decoding. Both topologies use four B200 GPUs per worker and +support text generation, reasoning, and tool calling. + +
+

Choose your deployment target

+
+Topology + + + + +
+
+Checkpoint skt/A.X-K2-NVFP4 +Hardware 8x B200, two TP4 aggregate workers +Precision NVFP4 weights, FP8 KV cache +Speculation EAGLE3, 3 tokens +FlashInfer autotuning Disabled +
+
+Checkpoint skt/A.X-K2-NVFP4 +Hardware 12x B200, two TP4 prefill workers and one TP4 decode worker +Precision NVFP4 weights, FP8 KV cache +Speculation EAGLE3, 3 tokens on both roles +FlashInfer autotuning Disabled on prefill and decode +
+
+ +## Prerequisites + +- A Kubernetes cluster with the [Dynamo platform](../../kubernetes/getting-started/quickstart.mdx) installed. +- Four B200 GPUs and 400 GiB of host memory per worker: eight GPUs total for + aggregated serving or twelve for disaggregated serving. +- A ReadWriteMany storage class for model weights. +- A Hugging Face token with access to `skt/A.X-K2-NVFP4` and `skt/A.X-K2-EAGLE3`. + +
+ +Disaggregated serving also requires InfiniBand with one `rdma/shared_ib` +device resource available per worker for NIXL/UCX KV transfer. + +
+ +## Deploy + +Run commands from the repository root. Set `CONTEXT` and `NAMESPACE` to your +cluster context and namespace, and set `HF_TOKEN` to your Hugging Face token. +Create the namespace and token secret: + +```bash +kubectl --context "${CONTEXT}" create namespace "${NAMESPACE}" +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" create secret generic hf-token-secret \ + --from-literal=HF_TOKEN="${HF_TOKEN}" +``` + +Set `storageClassName` in +[model-cache.yaml](https://github.com/ai-dynamo/dynamo/blob/main/recipes/ax-k2/model-cache/model-cache.yaml) +to your cluster's ReadWriteMany storage class. Create the PVC and download +both pinned checkpoints: + +```bash +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" apply -f recipes/ax-k2/model-cache/model-cache.yaml +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" apply -f recipes/ax-k2/model-cache/model-download.yaml +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" wait --for=condition=Complete \ + job/axk2-model-download --timeout=14400s +``` + +Both profiles and the download job mount `model-cache`. To use an existing +populated PVC, set `claimName` in the job and selected deployment source to +that PVC and skip creating a new claim. Regenerate the selected manifest +after editing its Kustomize source. + +
+ +Deploy two aggregate workers: + +```bash +export DGD=axk2-agg-b200-chat +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" apply \ + -f recipes/ax-k2/vllm/agg-b200-chat/deploy-generic.yaml +``` + +The manifest is generated from +[Kustomize sources](https://github.com/ai-dynamo/dynamo/tree/main/recipes/ax-k2/vllm/agg-b200-chat/kustomize). +To change a setting, edit `kustomize/base/deploy.yaml` and regenerate: + +```bash +python3 scripts/kustomize-matrix.py unfold recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml +python3 scripts/kustomize-matrix.py render recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml +``` + +
+ +
+ +Deploy two prefill workers and one decode worker: + +```bash +export DGD=axk2-disagg-b200-chat +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" apply \ + -f recipes/ax-k2/vllm/disagg-b200-chat/deploy-generic.yaml +``` + +The manifest is generated from +[Kustomize sources](https://github.com/ai-dynamo/dynamo/tree/main/recipes/ax-k2/vllm/disagg-b200-chat/kustomize). +To change a setting, edit `kustomize/base/deploy.yaml` and regenerate: + +```bash +python3 scripts/kustomize-matrix.py unfold recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml +python3 scripts/kustomize-matrix.py render recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml +``` + +
+ +## Smoke Test + +Wait for the selected deployment, then forward its frontend port: + +```bash +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" wait --for=condition=Ready \ + "dynamographdeployment/${DGD}" --timeout=7200s +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" port-forward \ + "service/${DGD}-frontend" 8000:8000 +``` + +In another terminal, verify model discovery and a completion: + +```bash +curl --fail http://localhost:8000/v1/models +curl --fail http://localhost:8000/v1/chat/completions \ + -H 'Content-Type: application/json' \ + -d '{"model":"skt/A.X-K2-NVFP4","messages":[{"role":"user","content":"What is 2 + 2?"}],"temperature":0,"max_tokens":4096,"stream":false}' +``` + +Model discovery should list `skt/A.X-K2-NVFP4`; the completion should contain +a `choices` array. Reasoning uses the `deepseek_v3` parser, and tool calling +uses the `hermes` parser. + +## Benchmark + +The [AIPerf workflow](https://github.com/ai-dynamo/dynamo/blob/main/recipes/ax-k2/perf/README.md) +replays an 8K-input / 1K-output chat trace with 70% KV reuse against the +aggregated profile at concurrency 32. It preserves expanded configurations, +raw reports, and frontend metrics. Keep the default real EAGLE3 acceptance +configuration for accuracy evaluation. + +Before starting the benchmark, follow the workflow's +[trace-staging instructions](https://github.com/ai-dynamo/dynamo/blob/main/recipes/ax-k2/perf/README.md#stage-the-trace) +to copy the Git LFS chat trace from your checkout onto the model-cache PVC. +The job reads it through `TRACE_FILE` and verifies its SHA-256 and request +counts before sending traffic. + +
+ +The checked-in benchmark job targets the aggregate frontend. To benchmark +the disaggregated profile, update its endpoint and frontend selector to this +deployment before applying the job. + +
+ +### Performance Results + +Benchmarking uses synthetic EAGLE3 acceptance length 2.12. + +| Workload | Framework | Recipe | SKU | Concurrency | System output tok/s/GPU | User output tok/s (mean) | TTFT P50 (seconds) | +| --- | --- | --- | --- | ---: | ---: | ---: | ---: | +| Chat (15% subset) | vLLM | Aggregated (2 workers) | B200 | 16 | 76.49 | 55.83 | 0.525 | +| Chat (15% subset) | vLLM | Disaggregated (2P1D) | B200 | 16 | 61.97 | 83 | 3.879 | + +## Compare All Targets + +| Setting | Aggregated | Disaggregated | +| --- | --- | --- | +| Workers | 2 aggregate | 2 prefill + 1 decode | +| Total GPUs | 8x B200 | 12x B200 | +| Parallelism | TP4, DP1, expert parallelism disabled | Same on both roles | +| Precision | NVFP4 weights, FP8 KV cache | Same on both roles | +| Attention | `FLASHINFER_MLA_SPARSE` | Same on both roles | +| FlashInfer autotuning | Disabled | Disabled on prefill and decode | +| EAGLE3 | 3 speculative tokens | 3 speculative tokens on both roles | +| Async scheduling | Enabled | Prefill disabled, decode enabled | +| Context length | 262,144 tokens | 262,144 tokens | +| Routing | KV-aware | KV-aware | +| KV transfer | N/A | NIXL/UCX over InfiniBand | + +## Source + +- [Recipe and configuration table](https://github.com/ai-dynamo/dynamo/tree/main/recipes/ax-k2) +- [Aggregated manifest](https://github.com/ai-dynamo/dynamo/blob/main/recipes/ax-k2/vllm/agg-b200-chat/deploy-generic.yaml) +- [Disaggregated manifest](https://github.com/ai-dynamo/dynamo/blob/main/recipes/ax-k2/vllm/disagg-b200-chat/deploy-generic.yaml) diff --git a/docs/fern/pages/recipes/model-recipes/overview.mdx b/docs/fern/pages/recipes/model-recipes/overview.mdx index 70bb5866b90d..a13d75e5e9ff 100644 --- a/docs/fern/pages/recipes/model-recipes/overview.mdx +++ b/docs/fern/pages/recipes/model-recipes/overview.mdx @@ -14,6 +14,7 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
+ @@ -38,17 +39,18 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor

Recipe catalog

-

20 model families

+

21 model families

Filter by provider, runtime, and hardware. Each card notes its serving technique and workload shape.

- 111 + 113 Deployable configurations
Provider
+ @@ -107,6 +109,16 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
vLLM4x/8x GB200 · 8x/16x H200Agentic · up to 1M context
Open recipe
+
+
+ +

A.X-K2

SK Telecom

+
+

B200 chat profiles with NVFP4 weights, FP8 KV cache, EAGLE3, and KV-aware routing. Choose two aggregate workers or two prefill workers and one decode worker.

+
vLLM8x / 12x B200Chat
+ Open recipe +
+
diff --git a/recipes/README.md b/recipes/README.md index 53a226feb4b5..9946c3935b1a 100644 --- a/recipes/README.md +++ b/recipes/README.md @@ -1,5 +1,5 @@ @@ -50,6 +50,7 @@ These recipes demonstrate aggregated or disaggregated serving: | **[Qwen3.5-122B-A10B-FP8](qwen3.5-122b/fp8/vllm/disagg-h200-agentic/)** | vLLM | Disaggregated | 3x H200 | ✅ | ✅ | Hybrid GDN+MoE, 1P2D over NIXL, KV-aware routing, no MTP; agentic profile | ❌ | | **[GLM-5-NVFP4](glm-5-nvfp4/sglang/disagg/)** | SGLang | Disagg Prefill/Decode | 20x GB200 | ✅ | ✅ | NVFP4, EAGLE speculative decoding, TP16 decode + TP4 prefill, stable SGLang runtime image | ❌ | | **[GLM-5.2](glm-5.2/)** | SGLang | Aggregated + Disaggregated | 16x/20x B200 or 24x/16x H200 | ✅ | ✅ | B200 NVFP4 or H200 FP8 with FP8 KV, KV-aware routing, EAGLE, B200 HiCache CPU offload, agentic trace profile | ❌ | +| **[A.X-K2](ax-k2/)** | vLLM | Aggregated / Disaggregated | 8x / 12x B200 | ✅ | ✅ | Two TP4 aggregate workers or 2P1D TP4 over NIXL; prefill async disabled in 2P1D, EAGLE3 k=3 on both roles, NVFP4 + FP8 KV, sparse MLA, FlashInfer autotuning disabled, KV-aware routing | ❌ | | **[DeepSeek-R1](deepseek-r1/sglang/disagg-8gpu/)** | SGLang | Disagg WideEP | 16x H200 | ✅ | ❌ | TP=8, single-node. Use `model-download-sglang.yaml` | ❌ | | **[DeepSeek-R1](deepseek-r1/sglang/disagg-16gpu/)** | SGLang | Disagg WideEP | 32x H200 | ✅ | ❌ | TP=16, multi-node. Use `model-download-sglang.yaml` | ❌ | | **[DeepSeek-R1](deepseek-r1/trtllm/disagg/wide_ep/gb200/)** | TensorRT-LLM | Disagg WideEP (GB200) | 36x GB200 | ✅ | ✅ | Multi-node: 8 decode + 1 prefill nodes | ❌ | diff --git a/recipes/ax-k2/README.md b/recipes/ax-k2/README.md new file mode 100644 index 000000000000..952fc12b8230 --- /dev/null +++ b/recipes/ax-k2/README.md @@ -0,0 +1,8 @@ + + +# A.X-K2 + +See the [Dynamo recipe documentation](https://docs.nvidia.com/dynamo/dev/recipes/). diff --git a/recipes/ax-k2/model-cache/model-cache.yaml b/recipes/ax-k2/model-cache/model-cache.yaml new file mode 100644 index 000000000000..01c6f8dfcf23 --- /dev/null +++ b/recipes/ax-k2/model-cache/model-cache.yaml @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: model-cache +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 600Gi + # Edit this to a ReadWriteMany storage class available on the target cluster. + storageClassName: "your-storage-class-name" diff --git a/recipes/ax-k2/model-cache/model-download.yaml b/recipes/ax-k2/model-cache/model-download.yaml new file mode 100644 index 000000000000..4bc038f727f7 --- /dev/null +++ b/recipes/ax-k2/model-cache/model-download.yaml @@ -0,0 +1,75 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: batch/v1 +kind: Job +metadata: + name: axk2-model-download + labels: + app.kubernetes.io/name: axk2-model-download + app.kubernetes.io/part-of: ax-k2 +spec: + backoffLimit: 3 + template: + metadata: + labels: + app.kubernetes.io/name: axk2-model-download + app.kubernetes.io/part-of: ax-k2 + spec: + restartPolicy: Never + containers: + - name: model-download + image: python:3.12-slim + imagePullPolicy: IfNotPresent + command: + - /bin/sh + - -c + args: + - | + set -eu + python3 -m pip install --no-cache-dir huggingface_hub==1.16.4 + hf download skt/A.X-K2-NVFP4 \ + --revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 + hf download skt/A.X-K2-EAGLE3 \ + --revision 24958e91737d760908f73a8af4b6e06080fc5c1d + env: + - name: HF_HOME + value: /model-cache + - name: HF_XET_HIGH_PERFORMANCE + value: "1" + envFrom: + - secretRef: + name: hf-token-secret + resources: + requests: + cpu: "4" + memory: 8Gi + limits: + cpu: "16" + memory: 32Gi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: model-cache + mountPath: /model-cache + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache diff --git a/recipes/ax-k2/perf/README.md b/recipes/ax-k2/perf/README.md new file mode 100644 index 000000000000..a8a3ea164b51 --- /dev/null +++ b/recipes/ax-k2/perf/README.md @@ -0,0 +1,121 @@ + + +# A.X-K2-NVFP4 KV-router benchmark + +This benchmark uses AIPerf 0.12.0 to replay the 8K-input / 1K-output, +70%-KV-reuse Mooncake no-schedule chat trace against the two-worker TP4 +aggregate recipe at concurrency 32. + +The source trace contains 12,031 requests and no timestamp fields, so AIPerf +uses concurrency timing rather than fixed-schedule replay. A.X-K2 supports a +262,144-token context. The benchmark applies `max_isl: 256000`, which removes +186 over-limit requests and leaves 11,845 requests; every retained request's +input plus requested output fits the model context. + +The trace is shared with the Nemotron-3-Ultra recipe: + +```text +recipes/nemotron-3-ultra/perf/traces/ + nim_turbo_8k_1k_70kv_chat_new_noschedule.jsonl +``` + +Its SHA-256 is +`5f369eb75ce639ad8b05cc209bb534bfedd627e9f7b923de32888155b4c9085a`. +The runner reads the staged Git LFS asset from `TRACE_FILE` on the model-cache +PVC. It verifies the checksum, line count, eligible-request count, and absence +of timestamps before sending any traffic. + +## Stage the trace + +Run these commands from the repository root after creating the model-cache +PVC. Set `CONTEXT` and `NAMESPACE` to your cluster context and namespace. If +you use an existing PVC, replace `model-cache` in the helper's `claimName` +and in `perf.yaml` with that PVC name. + +Materialize the trace from your checked-out Git revision, then copy it through +a helper pod that mounts the PVC: + +```bash +git lfs pull --include='recipes/nemotron-3-ultra/perf/traces/nim_turbo_8k_1k_70kv_chat_new_noschedule.jsonl' + +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" run axk2-trace-helper \ + --image=busybox:1.36 --restart=Never \ + --overrides='{"spec":{"containers":[{"name":"helper","image":"busybox:1.36","command":["sleep","3600"],"volumeMounts":[{"name":"model-cache","mountPath":"/model-cache"}]}],"volumes":[{"name":"model-cache","persistentVolumeClaim":{"claimName":"model-cache"}}]}}' \ + --command -- sleep 3600 +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" wait --for=condition=Ready \ + pod/axk2-trace-helper --timeout=300s + +TRACE_SOURCE="$(git rev-parse --show-toplevel)/recipes/nemotron-3-ultra/perf/traces/nim_turbo_8k_1k_70kv_chat_new_noschedule.jsonl" +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" exec axk2-trace-helper -- mkdir -p /model-cache/traces +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" cp "${TRACE_SOURCE}" \ + axk2-trace-helper:/model-cache/traces/nim_turbo_8k_1k_70kv_chat_new_noschedule.jsonl +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" delete pod axk2-trace-helper +``` + +The benchmark job sets `TRACE_FILE` to this PVC path. It does not download the +trace at runtime. + +## Run KV-aware routing + +Deploy the DGD as described in the +[A.X-K2 recipe](https://github.com/ai-dynamo/dynamo/blob/main/docs/fern/pages/recipes/model-recipes/ax-k2.mdx#deploy), then apply the +runner and Job from the repository root: + +For throughput-only speculative-decoding measurements at the measured +acceptance proxy, change the worker `SPECULATIVE_CONFIG` ConfigMap key in +`recipes/ax-k2/vllm/agg-b200-chat/kustomize/base/deploy.yaml` from +`speculative-config` to `speculative-config-synthetic`, then regenerate the +manifest before deploying as described in the +[aggregate instructions](../vllm/agg-b200-chat/README.md#edit-and-render). +This enables vLLM's +`rejection_sample_method: synthetic` with +`synthetic_acceptance_length: 2.12`. Keep the production key for functional or +quality validation because synthetic rejection sampling intentionally forces +acceptance behavior. + +```bash +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" apply -f recipes/ax-k2/perf/runner.configmap.yaml +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" apply -f recipes/ax-k2/perf/perf.yaml +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" logs -l job-name=axk2-kv-bench -f +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" wait --for=condition=Complete \ + job/axk2-kv-bench --timeout=21600s +``` + +The Job first replays the first 32 eligible trace records as a warm-cache +burst, then starts the measured replay from the beginning. Results and +frontend metric snapshots are written under: + +```text +/model-cache/perf/ax-k2/kv// +``` + +## Round-robin baseline + +A routing comparison must start from empty worker and router caches. Delete +the DGD pods, change the frontend command from `--router-mode kv` to +`--router-mode round_robin`, and wait for the replacement frontend and both +workers to become Ready. Then change `ROUTING_MODE` in `perf.yaml` to +`round_robin`, use a distinct Job name, and run the same benchmark unchanged. + +Do not compare a warm KV-aware run with a cold round-robin run. Preserve the +DGD manifest, pod logs, AIPerf expanded configs, raw reports, and frontend +`/metrics` snapshots for both runs. + +## AIPerf tokenizer workaround + +The AIPerf-side Transformers build does not recognize the custom `axk2` model +configuration. The runner therefore downloads only four tokenizer assets from +the same pinned model revision. It places them in an isolated, tokenizer-only +Hugging Face snapshot under `/tmp/axk2-tokenizer-hf` and points AIPerf at the +revision-pinned repo ID through that offline snapshot. + +The synthetic snapshot layout is necessary for AIPerf 0.12.0 Mooncake traces: +parallel prompt synthesis forces offline mode and resolves tokenizers through +the Hugging Face cache API, so an arbitrary absolute tokenizer path fails in +the child processes. Keeping `config.json` out of this isolated snapshot also +avoids the unsupported `axk2` model-type lookup. The snapshot exists only in +the benchmark container's `/tmp`; the server still loads the full model from +the shared Hugging Face cache. diff --git a/recipes/ax-k2/perf/perf.yaml b/recipes/ax-k2/perf/perf.yaml new file mode 100644 index 000000000000..2d750073f1c4 --- /dev/null +++ b/recipes/ax-k2/perf/perf.yaml @@ -0,0 +1,96 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: batch/v1 +kind: Job +metadata: + name: axk2-kv-bench + labels: + app.kubernetes.io/name: axk2-kv-bench + app.kubernetes.io/part-of: ax-k2 +spec: + backoffLimit: 0 + activeDeadlineSeconds: 21600 + template: + metadata: + labels: + app.kubernetes.io/name: axk2-kv-bench + app.kubernetes.io/part-of: ax-k2 + spec: + restartPolicy: Never + affinity: + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: nvidia.com/dynamo-component-type + operator: In + values: + - frontend + - key: nvidia.com/dynamo-graph-deployment-name + operator: In + values: + - axk2-agg-b200-chat + topologyKey: kubernetes.io/hostname + containers: + - name: perf + image: nvcr.io/nvidia/ai-dynamo/aiperf:0.12.0 + imagePullPolicy: IfNotPresent + command: + - /bin/bash + - /runner/run.sh + env: + - name: ENDPOINT + value: axk2-agg-b200-chat-frontend:8000 + - name: ROUTING_MODE + value: kv + - name: ROOT_ARTIFACT_DIR + value: /model-cache/perf/ax-k2 + - name: TRACE_FILE + value: /model-cache/traces/nim_turbo_8k_1k_70kv_chat_new_noschedule.jsonl + - name: AIPERF_HTTP_CONNECTION_LIMIT + value: "200" + - name: AIPERF_HTTP_SO_RCVTIMEO + value: "120" + - name: AIPERF_SERVICE_PROFILE_CONFIGURE_TIMEOUT + value: "3600" + - name: AIPERF_DATASET_CONFIGURATION_TIMEOUT + value: "3600" + - name: HF_HOME + value: /model-cache + envFrom: + - secretRef: + name: hf-token-secret + resources: + requests: + cpu: "4" + memory: 8Gi + limits: + cpu: "16" + memory: 32Gi + volumeMounts: + - name: runner + mountPath: /runner + readOnly: true + - name: model-cache + mountPath: /model-cache + volumes: + - name: runner + configMap: + name: axk2-aiperf-runner + defaultMode: 365 + - name: model-cache + persistentVolumeClaim: + claimName: model-cache diff --git a/recipes/ax-k2/perf/runner.configmap.yaml b/recipes/ax-k2/perf/runner.configmap.yaml new file mode 100644 index 000000000000..e0c0110c6a07 --- /dev/null +++ b/recipes/ax-k2/perf/runner.configmap.yaml @@ -0,0 +1,291 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: axk2-aiperf-runner + labels: + app.kubernetes.io/part-of: ax-k2 +data: + warmup.yaml: | + schemaVersion: "2.0" + randomSeed: 42 + benchmark: + model: skt/A.X-K2-NVFP4 + tokenizer: + name: skt/A.X-K2-NVFP4 + revision: 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 + trustRemoteCode: false + endpoint: + url: http://${ENDPOINT}/v1/chat/completions + type: chat + streaming: true + useServerTokenCount: true + extra: + ignore_eos: true + dataset: + type: file + path: ${TRACE_FILE} + format: mooncake_trace + sampling: sequential + entries: 32 + synthesis: + max_isl: 256000 + phases: + type: concurrency + concurrency: 32 + requests: 32 + artifacts: + dir: ${RESULT_DIR}/warmup + prefix: report + autoPlot: false + runtime: + ui: none + workers: 32 + profile.yaml: | + schemaVersion: "2.0" + randomSeed: 42 + benchmark: + model: skt/A.X-K2-NVFP4 + tokenizer: + name: skt/A.X-K2-NVFP4 + revision: 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 + trustRemoteCode: false + endpoint: + url: http://${ENDPOINT}/v1/chat/completions + type: chat + streaming: true + useServerTokenCount: true + extra: + ignore_eos: true + dataset: + type: file + path: ${TRACE_FILE} + format: mooncake_trace + sampling: sequential + synthesis: + max_isl: 256000 + phases: + type: concurrency + concurrency: 32 + requests: 11845 + artifacts: + dir: ${RESULT_DIR}/main + prefix: report + autoPlot: false + runtime: + ui: none + workers: 32 + run.sh: | + #!/usr/bin/env bash + set -Eeuo pipefail + + : "${ENDPOINT:?ENDPOINT is required}" + : "${ROOT_ARTIFACT_DIR:?ROOT_ARTIFACT_DIR is required}" + : "${ROUTING_MODE:?ROUTING_MODE is required}" + : "${TRACE_FILE:?TRACE_FILE must point to the trace staged on the model-cache PVC}" + + MODEL="skt/A.X-K2-NVFP4" + MODEL_REVISION="9e2e804e80f8d1b3afba5d7938173cec1ed46b49" + TRACE_SHA256="5f369eb75ce639ad8b05cc209bb534bfedd627e9f7b923de32888155b4c9085a" + RUN_ID="$(date -u +%Y%m%dT%H%M%SZ)" + RESULT_DIR="${ROOT_ARTIFACT_DIR}/${ROUTING_MODE}/${RUN_ID}" + export ENDPOINT MODEL MODEL_REVISION TRACE_FILE TRACE_SHA256 RESULT_DIR RUN_ID + + mkdir -p "${RESULT_DIR}" + ulimit -n 600000 || true + + python3 - <<'PY' + import hashlib + import json + import os + from pathlib import Path + + trace_path = Path(os.environ["TRACE_FILE"]) + if not trace_path.is_file(): + raise SystemExit( + f"TRACE_MISSING path={trace_path}. Stage the Git LFS trace on the " + "model-cache PVC as described in recipes/ax-k2/perf/README.md." + ) + with trace_path.open("rb") as handle: + actual = hashlib.file_digest(handle, "sha256").hexdigest() + if actual != os.environ["TRACE_SHA256"]: + raise SystemExit( + f"TRACE_SHA_MISMATCH expected={os.environ['TRACE_SHA256']} actual={actual}" + ) + + total = 0 + eligible = 0 + timestamped = 0 + with trace_path.open() as handle: + for line in handle: + total += 1 + record = json.loads(line) + eligible += record["input_length"] <= 256000 + timestamped += "timestamp" in record + if (total, eligible, timestamped) != (12031, 11845, 0): + raise SystemExit( + "TRACE_INVARIANT_MISMATCH " + f"total={total} eligible={eligible} timestamped={timestamped}" + ) + print( + f"TRACE_OK sha256={actual} total={total} eligible={eligible} " + f"timestamped={timestamped}" + ) + PY + + python3 - <<'PY' + import os + import shutil + from pathlib import Path + from huggingface_hub import snapshot_download + + tokenizer_files = Path("/tmp/axk2-tokenizer-files") + snapshot_download( + repo_id=os.environ["MODEL"], + revision=os.environ["MODEL_REVISION"], + local_dir=tokenizer_files, + allow_patterns=[ + "tokenizer.json", + "tokenizer_config.json", + "special_tokens_map.json", + "chat_template.jinja", + ], + ) + + tokenizer_snapshot = ( + Path("/tmp/axk2-tokenizer-hf/hub") + / "models--skt--A.X-K2-NVFP4" + / "snapshots" + / os.environ["MODEL_REVISION"] + ) + tokenizer_snapshot.mkdir(parents=True, exist_ok=True) + for name in ( + "tokenizer.json", + "tokenizer_config.json", + "special_tokens_map.json", + "chat_template.jinja", + ): + shutil.copy2(tokenizer_files / name, tokenizer_snapshot / name) + PY + + export HF_HOME=/tmp/axk2-tokenizer-hf + export HF_HUB_CACHE=/tmp/axk2-tokenizer-hf/hub + export HF_HUB_OFFLINE=1 + export TRANSFORMERS_OFFLINE=1 + + AIPERF_VERSION="$(python3 -c 'import importlib.metadata; print(importlib.metadata.version("aiperf"))')" + if [[ "${AIPERF_VERSION}" != "0.12.0" ]]; then + echo "AIPERF_VERSION_MISMATCH expected=0.12.0 actual=${AIPERF_VERSION}" >&2 + exit 40 + fi + export AIPERF_VERSION + + python3 - <<'PY' + import json + import os + import time + import urllib.request + + endpoint = os.environ["ENDPOINT"] + model = os.environ["MODEL"] + for attempt in range(1, 721): + try: + with urllib.request.urlopen( + f"http://{endpoint}/v1/models", timeout=10 + ) as response: + payload = json.load(response) + if any(item.get("id") == model for item in payload.get("data", [])): + body = json.dumps({ + "model": model, + "messages": [{"role": "user", "content": "Reply with OK."}], + "max_tokens": 1, + }).encode() + request = urllib.request.Request( + f"http://{endpoint}/v1/chat/completions", + data=body, + headers={"Content-Type": "application/json"}, + ) + with urllib.request.urlopen(request, timeout=120) as response: + completion = json.load(response) + if completion.get("choices"): + print(f"MODEL_READY endpoint={endpoint} attempt={attempt}") + break + except Exception as error: + if attempt % 12 == 0: + print(f"MODEL_WAIT endpoint={endpoint} attempt={attempt} error={error}") + time.sleep(5) + else: + raise SystemExit(f"MODEL_READY_TIMEOUT endpoint={endpoint}") + PY + + python3 - <<'PY' + import json + import os + import urllib.request + from pathlib import Path + + result_dir = Path(os.environ["RESULT_DIR"]) + manifest = { + "aiperf_version": os.environ["AIPERF_VERSION"], + "concurrency": 32, + "eligible_requests": 11845, + "endpoint": os.environ["ENDPOINT"], + "max_isl": 256000, + "model": os.environ["MODEL"], + "model_revision": os.environ["MODEL_REVISION"], + "routing_mode": os.environ["ROUTING_MODE"], + "timing_mode": "concurrency (trace has no timestamps)", + "trace_file": os.environ["TRACE_FILE"], + "trace_sha256": os.environ["TRACE_SHA256"], + "warmup_requests": 32, + } + (result_dir / "run_manifest.json").write_text( + json.dumps(manifest, indent=2) + "\n" + ) + try: + with urllib.request.urlopen( + f"http://{os.environ['ENDPOINT']}/metrics", timeout=30 + ) as response: + (result_dir / "frontend-metrics-before.prom").write_bytes(response.read()) + except Exception as error: + (result_dir / "frontend-metrics-before.error.txt").write_text(str(error) + "\n") + PY + + aiperf config validate /runner/warmup.yaml | tee "${RESULT_DIR}/warmup.validate.log" + aiperf config expand /runner/warmup.yaml --full > "${RESULT_DIR}/warmup.expanded.yaml" + aiperf profile --config /runner/warmup.yaml + + aiperf config validate /runner/profile.yaml | tee "${RESULT_DIR}/profile.validate.log" + aiperf config expand /runner/profile.yaml --full > "${RESULT_DIR}/profile.expanded.yaml" + aiperf profile --config /runner/profile.yaml + + python3 - <<'PY' + import os + import urllib.request + from pathlib import Path + + result_dir = Path(os.environ["RESULT_DIR"]) + try: + with urllib.request.urlopen( + f"http://{os.environ['ENDPOINT']}/metrics", timeout=30 + ) as response: + (result_dir / "frontend-metrics-after.prom").write_bytes(response.read()) + except Exception as error: + (result_dir / "frontend-metrics-after.error.txt").write_text(str(error) + "\n") + PY + + echo "RESULT_DIR=${RESULT_DIR}" diff --git a/recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml b/recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml new file mode 100644 index 000000000000..543702383ad1 --- /dev/null +++ b/recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source: kustomize/base +nameTemplate: "${variant}" +matrix: + variant: + - name: generic + components: [] diff --git a/recipes/ax-k2/vllm/agg-b200-chat/README.md b/recipes/ax-k2/vllm/agg-b200-chat/README.md new file mode 100644 index 000000000000..3a89f4c7c2ee --- /dev/null +++ b/recipes/ax-k2/vllm/agg-b200-chat/README.md @@ -0,0 +1,37 @@ + + +# A.X-K2 Aggregated Serving + +This variant uses two TP4 aggregate workers on eight B200 GPUs. Follow the +[A.X-K2 deployment guide](https://github.com/ai-dynamo/dynamo/blob/main/docs/fern/pages/recipes/model-recipes/ax-k2.mdx#deploy) +to prepare the model cache and credentials. + +## Deploy + +Set `CONTEXT` and `NAMESPACE` to your cluster context and namespace. From the +repository root, apply the generated manifest: + +```bash +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" apply \ + -f recipes/ax-k2/vllm/agg-b200-chat/deploy-generic.yaml +``` + +The same configuration can be applied through the generated overlay: + +```bash +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" apply \ + -k recipes/ax-k2/vllm/agg-b200-chat/kustomize/overlays/generic +``` + +## Edit and render + +Edit `kustomize/base/deploy.yaml`; `deploy-generic.yaml` is generated. From +the repository root, regenerate the overlay and manifest: + +```bash +python3 scripts/kustomize-matrix.py unfold recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml +python3 scripts/kustomize-matrix.py render recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml +``` diff --git a/recipes/ax-k2/vllm/agg-b200-chat/deploy-generic.yaml b/recipes/ax-k2/vllm/agg-b200-chat/deploy-generic.yaml new file mode 100644 index 000000000000..3b68fadd0a2a --- /dev/null +++ b/recipes/ax-k2/vllm/agg-b200-chat/deploy-generic.yaml @@ -0,0 +1,207 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Generated file. For repository contributors, do not edit this checked-in copy. +# Regenerate every public overlay and rendered manifest of this matrix (from the repository root): +# scripts/kustomize-matrix.py unfold recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml +# scripts/kustomize-matrix.py render recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml +# Inspect only this Kustomize overlay (from the repository root): +# kustomize build recipes/ax-k2/vllm/agg-b200-chat/kustomize/overlays/generic +# You may edit a copy before applying it. + +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/name: axk2-agg-b200-chat + app.kubernetes.io/part-of: ax-k2 + name: axk2-agg-b200-chat-specdec-config +data: + speculative-config: |- + { + "method": "eagle3", + "model": "skt/A.X-K2-EAGLE3", + "revision": "24958e91737d760908f73a8af4b6e06080fc5c1d", + "num_speculative_tokens": 3 + } + speculative-config-synthetic: |- + { + "method": "eagle3", + "model": "skt/A.X-K2-EAGLE3", + "revision": "24958e91737d760908f73a8af4b6e06080fc5c1d", + "num_speculative_tokens": 3, + "rejection_sample_method": "synthetic", + "synthetic_acceptance_length": 2.12 + } +--- +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + labels: + app.kubernetes.io/name: axk2-agg-b200-chat + app.kubernetes.io/part-of: ax-k2 + name: axk2-agg-b200-chat +spec: + backendFramework: vllm + components: + - name: Frontend + podTemplate: + metadata: + labels: + axk2.nvidia.com/role: frontend + axk2.nvidia.com/routing: kv-aware + spec: + containers: + - args: + - | + set -Eeuo pipefail + exec python3 -m dynamo.frontend \ + --router-mode kv \ + --router-kv-events \ + --kv-cache-block-size 64 \ + --http-host 0.0.0.0 \ + --http-port 8000 + command: + - /bin/bash + - -lc + env: + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + imagePullPolicy: IfNotPresent + name: main + ports: + - containerPort: 8000 + name: http + readinessProbe: + failureThreshold: 6 + httpGet: + path: /health + port: http + periodSeconds: 10 + timeoutSeconds: 3 + resources: + limits: + cpu: "16" + memory: 32Gi + requests: + cpu: "4" + memory: 16Gi + workingDir: /workspace + replicas: 1 + runtimeVersionOverride: 1.4.1 + type: frontend + - name: agg + podTemplate: + metadata: + labels: + axk2.nvidia.com/role: aggregate-worker + axk2.nvidia.com/routing: kv-aware + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nvidia.com/gpu.product + operator: In + values: + - NVIDIA-B200 + containers: + - args: + - | + set -Eeuo pipefail + ulimit -l unlimited + exec python3 -m dynamo.vllm \ + --model skt/A.X-K2-NVFP4 \ + --revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --tokenizer-revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --served-model-name skt/A.X-K2-NVFP4 \ + --tensor-parallel-size 4 \ + --data-parallel-size 1 \ + --attention-backend FLASHINFER_MLA_SPARSE \ + --kernel-config '{"enable_flashinfer_autotune": false}' \ + --kv-cache-dtype fp8 \ + --block-size 64 \ + --max-model-len 262144 \ + --enable-prefix-caching \ + --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20080","enable_kv_cache_events":true}' \ + --speculative-config="${SPECULATIVE_CONFIG}" \ + --async-scheduling \ + --dyn-tool-call-parser hermes \ + --dyn-reasoning-parser deepseek_v3 \ + --reasoning-parser deepseek_v3 + command: + - /bin/bash + - -lc + env: + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + - name: HF_HOME + value: /model-cache + - name: HF_HUB_OFFLINE + value: "1" + - name: SPECULATIVE_CONFIG + valueFrom: + configMapKeyRef: + key: speculative-config + name: axk2-agg-b200-chat-specdec-config + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + imagePullPolicy: IfNotPresent + name: main + resources: + limits: + nvidia.com/gpu: "4" + requests: + memory: 400Gi + nvidia.com/gpu: "4" + securityContext: + capabilities: + add: + - IPC_LOCK + - SYS_RESOURCE + runAsUser: 0 + startupProbe: + failureThreshold: 60 + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + volumeMounts: + - mountPath: /model-cache + name: model-cache + - mountPath: /tmp + name: runtime-tmp + workingDir: /workspace + tolerations: + - effect: NoSchedule + key: nvidia.com/gpu + operator: Equal + value: "true" + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + - emptyDir: {} + name: runtime-tmp + replicas: 2 + runtimeVersionOverride: 1.4.1 + sharedMemorySize: 64Gi + type: worker diff --git a/recipes/ax-k2/vllm/agg-b200-chat/kustomize/base/deploy.yaml b/recipes/ax-k2/vllm/agg-b200-chat/kustomize/base/deploy.yaml new file mode 100644 index 000000000000..e53a32f467ae --- /dev/null +++ b/recipes/ax-k2/vllm/agg-b200-chat/kustomize/base/deploy.yaml @@ -0,0 +1,200 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: axk2-agg-b200-chat-specdec-config + labels: + app.kubernetes.io/name: axk2-agg-b200-chat + app.kubernetes.io/part-of: ax-k2 +data: + speculative-config-synthetic: |- + { + "method": "eagle3", + "model": "skt/A.X-K2-EAGLE3", + "revision": "24958e91737d760908f73a8af4b6e06080fc5c1d", + "num_speculative_tokens": 3, + "rejection_sample_method": "synthetic", + "synthetic_acceptance_length": 2.12 + } + speculative-config: |- + { + "method": "eagle3", + "model": "skt/A.X-K2-EAGLE3", + "revision": "24958e91737d760908f73a8af4b6e06080fc5c1d", + "num_speculative_tokens": 3 + } +--- +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: axk2-agg-b200-chat + labels: + app.kubernetes.io/name: axk2-agg-b200-chat + app.kubernetes.io/part-of: ax-k2 +spec: + backendFramework: vllm + components: + - name: Frontend + type: frontend + runtimeVersionOverride: 1.4.1 + replicas: 1 + podTemplate: + metadata: + labels: + axk2.nvidia.com/role: frontend + axk2.nvidia.com/routing: kv-aware + spec: + containers: + - name: main + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + imagePullPolicy: IfNotPresent + workingDir: /workspace + command: + - /bin/bash + - -lc + args: + - | + set -Eeuo pipefail + exec python3 -m dynamo.frontend \ + --router-mode kv \ + --router-kv-events \ + --kv-cache-block-size 64 \ + --http-host 0.0.0.0 \ + --http-port 8000 + env: + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + ports: + - name: http + containerPort: 8000 + readinessProbe: + httpGet: + path: /health + port: http + periodSeconds: 10 + timeoutSeconds: 3 + failureThreshold: 6 + resources: + requests: + cpu: "4" + memory: 16Gi + limits: + cpu: "16" + memory: 32Gi + + - name: agg + type: worker + runtimeVersionOverride: 1.4.1 + replicas: 2 + sharedMemorySize: 64Gi + podTemplate: + metadata: + labels: + axk2.nvidia.com/role: aggregate-worker + axk2.nvidia.com/routing: kv-aware + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nvidia.com/gpu.product + operator: In + values: + - NVIDIA-B200 + containers: + - name: main + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + imagePullPolicy: IfNotPresent + workingDir: /workspace + command: + - /bin/bash + - -lc + args: + - | + set -Eeuo pipefail + ulimit -l unlimited + exec python3 -m dynamo.vllm \ + --model skt/A.X-K2-NVFP4 \ + --revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --tokenizer-revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --served-model-name skt/A.X-K2-NVFP4 \ + --tensor-parallel-size 4 \ + --data-parallel-size 1 \ + --attention-backend FLASHINFER_MLA_SPARSE \ + --kernel-config '{"enable_flashinfer_autotune": false}' \ + --kv-cache-dtype fp8 \ + --block-size 64 \ + --max-model-len 262144 \ + --enable-prefix-caching \ + --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20080","enable_kv_cache_events":true}' \ + --speculative-config="${SPECULATIVE_CONFIG}" \ + --async-scheduling \ + --dyn-tool-call-parser hermes \ + --dyn-reasoning-parser deepseek_v3 \ + --reasoning-parser deepseek_v3 + env: + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + - name: HF_HOME + value: /model-cache + - name: HF_HUB_OFFLINE + value: "1" + - name: SPECULATIVE_CONFIG + valueFrom: + configMapKeyRef: + name: axk2-agg-b200-chat-specdec-config + key: speculative-config # speculative-config-synthetic for benchmark-only AL=2.12 + resources: + requests: + nvidia.com/gpu: "4" + memory: 400Gi + limits: + nvidia.com/gpu: "4" + securityContext: + runAsUser: 0 + capabilities: + add: + - IPC_LOCK + - SYS_RESOURCE + startupProbe: + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + failureThreshold: 60 + volumeMounts: + - name: model-cache + mountPath: /model-cache + - name: runtime-tmp + mountPath: /tmp + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + - name: runtime-tmp + emptyDir: {} + tolerations: + - key: nvidia.com/gpu + operator: Equal + value: "true" + effect: NoSchedule diff --git a/recipes/ax-k2/vllm/agg-b200-chat/kustomize/base/kustomization.yaml b/recipes/ax-k2/vllm/agg-b200-chat/kustomize/base/kustomization.yaml new file mode 100644 index 000000000000..1122c96fe640 --- /dev/null +++ b/recipes/ax-k2/vllm/agg-b200-chat/kustomize/base/kustomization.yaml @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - deploy.yaml +components: + - ../../../../../kustomize/components/dynamo-openapi diff --git a/recipes/ax-k2/vllm/agg-b200-chat/kustomize/overlays/generic/kustomization.yaml b/recipes/ax-k2/vllm/agg-b200-chat/kustomize/overlays/generic/kustomization.yaml new file mode 100644 index 000000000000..6761cc4f2dcc --- /dev/null +++ b/recipes/ax-k2/vllm/agg-b200-chat/kustomize/overlays/generic/kustomization.yaml @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Generated file. For repository contributors, do not edit this checked-in copy. +# Regenerate this matrix's public overlays and template Components from the repository root: +# Regenerate: scripts/kustomize-matrix.py unfold recipes/ax-k2/vllm/agg-b200-chat/.kustomize-matrix.yaml + +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +sortOptions: + order: fifo +resources: + - "../../base" diff --git a/recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml b/recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml new file mode 100644 index 000000000000..543702383ad1 --- /dev/null +++ b/recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source: kustomize/base +nameTemplate: "${variant}" +matrix: + variant: + - name: generic + components: [] diff --git a/recipes/ax-k2/vllm/disagg-b200-chat/README.md b/recipes/ax-k2/vllm/disagg-b200-chat/README.md new file mode 100644 index 000000000000..80ff9c5c3c5e --- /dev/null +++ b/recipes/ax-k2/vllm/disagg-b200-chat/README.md @@ -0,0 +1,60 @@ + + +# A.X-K2 Disaggregated Serving + +This variant serves A.X-K2-NVFP4 through the Dynamo KV-aware router using +12 B200 GPUs: two TP4 prefill replicas and one TP4 decode replica. + +| Role | Replicas | TP per replica | Async scheduling | Speculation | +| --- | ---: | ---: | --- | --- | +| Prefill | 2 | 4 | Disabled (`--no-async-scheduling`) | EAGLE3, 3 tokens | +| Decode | 1 | 4 | Enabled (`--async-scheduling`) | EAGLE3, 3 tokens | + +Both roles use DP1, ordinary FP8 KV cache, `FLASHINFER_MLA_SPARSE`, prefix +caching, and the same pinned target and EAGLE3 revisions. Expert parallelism +is disabled. FlashInfer autotuning is disabled on both roles with +`--kernel-config '{"enable_flashinfer_autotune": false}'`. +EAGLE3 uses real acceptance on both roles. The frontend consumes +prefill KV events with a 64-token block size. NIXL transfers KV state using +CUDA buffers and UCX; each worker requests one `rdma/shared_ib` resource. + +## Deploy + +The namespace must contain the `model-cache` PVC with both pinned +model snapshots. +At least three groups of four B200 GPUs and 400 GiB of host memory per worker +must be schedulable. Set `CONTEXT` and `NAMESPACE` to your cluster context and +namespace, then run from this directory: + +```bash +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" apply -f deploy-generic.yaml +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" wait --for=condition=Ready pod \ + -l nvidia.com/dynamo-graph-deployment-name=axk2-disagg-b200-chat \ + --timeout=7200s +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" port-forward \ + service/axk2-disagg-b200-chat-frontend 8000:8000 +``` + +Call `/v1/models` and `/v1/chat/completions` through the forwarded port with +model `skt/A.X-K2-NVFP4`. Confirm both prefill replicas receive requests and +the decode replica generates tokens before benchmarking. The deployment and +ConfigMap have distinct names so this variant can coexist with the aggregate recipe. + +## Edit and render + +Edit `kustomize/base/deploy.yaml`; `deploy-generic.yaml` is generated. From +the repository root, regenerate it with: + +```bash +python3 scripts/kustomize-matrix.py unfold recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml +python3 scripts/kustomize-matrix.py render recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml +``` + +The same configuration can be applied through the generated overlay: + +```bash +kubectl --context "${CONTEXT}" -n "${NAMESPACE}" apply -k kustomize/overlays/generic +``` diff --git a/recipes/ax-k2/vllm/disagg-b200-chat/deploy-generic.yaml b/recipes/ax-k2/vllm/disagg-b200-chat/deploy-generic.yaml new file mode 100644 index 000000000000..4794921dbda5 --- /dev/null +++ b/recipes/ax-k2/vllm/disagg-b200-chat/deploy-generic.yaml @@ -0,0 +1,379 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Generated file. For repository contributors, do not edit this checked-in copy. +# Regenerate every public overlay and rendered manifest of this matrix (from the repository root): +# scripts/kustomize-matrix.py unfold recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml +# scripts/kustomize-matrix.py render recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml +# Inspect only this Kustomize overlay (from the repository root): +# kustomize build recipes/ax-k2/vllm/disagg-b200-chat/kustomize/overlays/generic +# You may edit a copy before applying it. + +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/name: axk2-disagg-b200-chat + app.kubernetes.io/part-of: ax-k2 + name: axk2-disagg-b200-chat-config +data: + kv-transfer-config-decode: |- + { + "kv_connector": "NixlConnector", + "kv_role": "kv_consumer", + "kv_buffer_device": "cuda", + "kv_connector_extra_config": { + "backends": ["UCX"], + "num_threads": 8 + } + } + kv-transfer-config-prefill: |- + { + "kv_connector": "NixlConnector", + "kv_role": "kv_producer", + "kv_buffer_device": "cuda", + "kv_connector_extra_config": { + "backends": ["UCX"], + "num_threads": 8 + } + } + speculative-config-decode: |- + { + "method": "eagle3", + "model": "skt/A.X-K2-EAGLE3", + "revision": "24958e91737d760908f73a8af4b6e06080fc5c1d", + "num_speculative_tokens": 3 + } + speculative-config-prefill: |- + { + "method": "eagle3", + "model": "skt/A.X-K2-EAGLE3", + "revision": "24958e91737d760908f73a8af4b6e06080fc5c1d", + "num_speculative_tokens": 3 + } +--- +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + labels: + app.kubernetes.io/name: axk2-disagg-b200-chat + app.kubernetes.io/part-of: ax-k2 + name: axk2-disagg-b200-chat +spec: + backendFramework: vllm + components: + - name: Frontend + podTemplate: + metadata: + labels: + axk2.nvidia.com/role: frontend + axk2.nvidia.com/routing: kv-aware + spec: + containers: + - args: + - | + set -Eeuo pipefail + exec python3 -m dynamo.frontend \ + --router-mode kv \ + --router-kv-events \ + --kv-cache-block-size 64 \ + --http-host 0.0.0.0 \ + --http-port 8000 + command: + - /bin/bash + - -lc + env: + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + imagePullPolicy: IfNotPresent + name: main + ports: + - containerPort: 8000 + name: http + readinessProbe: + failureThreshold: 6 + httpGet: + path: /health + port: http + periodSeconds: 10 + timeoutSeconds: 3 + resources: + limits: + cpu: "16" + memory: 32Gi + requests: + cpu: "4" + memory: 16Gi + workingDir: /workspace + schedulerName: default-scheduler + replicas: 1 + runtimeVersionOverride: 1.4.1 + type: frontend + - name: prefill + podTemplate: + metadata: + labels: + axk2.nvidia.com/role: prefill-worker + axk2.nvidia.com/routing: kv-aware + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nvidia.com/gpu.product + operator: In + values: + - NVIDIA-B200 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: nvidia.com/dynamo-graph-deployment-name + operator: In + values: + - axk2-disagg-b200-chat + topologyKey: kubernetes.io/hostname + weight: 100 + containers: + - args: + - | + set -Eeuo pipefail + ulimit -l unlimited + exec python3 -m dynamo.vllm \ + --model skt/A.X-K2-NVFP4 \ + --revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --tokenizer-revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --served-model-name skt/A.X-K2-NVFP4 \ + --tensor-parallel-size 4 \ + --data-parallel-size 1 \ + --attention-backend FLASHINFER_MLA_SPARSE \ + --kernel-config '{"enable_flashinfer_autotune": false}' \ + --kv-cache-dtype fp8 \ + --block-size 64 \ + --max-model-len 262144 \ + --enable-prefix-caching \ + --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20080","enable_kv_cache_events":true}' \ + --kv-transfer-config="${KV_TRANSFER_CONFIG}" \ + --disaggregation-mode prefill \ + --speculative-config="${SPECULATIVE_CONFIG}" \ + --no-async-scheduling \ + --dyn-tool-call-parser hermes \ + --dyn-reasoning-parser deepseek_v3 \ + --reasoning-parser deepseek_v3 + command: + - /bin/bash + - -lc + env: + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + - name: HF_HOME + value: /model-cache + - name: HF_HUB_OFFLINE + value: "1" + - name: KV_TRANSFER_CONFIG + valueFrom: + configMapKeyRef: + key: kv-transfer-config-prefill + name: axk2-disagg-b200-chat-config + - name: SPECULATIVE_CONFIG + valueFrom: + configMapKeyRef: + key: speculative-config-prefill + name: axk2-disagg-b200-chat-config + - name: NIXL_LOG_LEVEL + value: INFO + - name: UCX_RCACHE_MAX_UNRELEASED + value: "1024" + - name: UCX_TLS + value: rc_x,rc,cuda_copy,cuda_ipc + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + imagePullPolicy: IfNotPresent + name: main + resources: + limits: + nvidia.com/gpu: "4" + rdma/shared_ib: "1" + requests: + memory: 400Gi + nvidia.com/gpu: "4" + rdma/shared_ib: "1" + securityContext: + capabilities: + add: + - IPC_LOCK + - SYS_RESOURCE + runAsUser: 0 + startupProbe: + failureThreshold: 60 + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + volumeMounts: + - mountPath: /model-cache + name: model-cache + - mountPath: /tmp + name: runtime-tmp + workingDir: /workspace + schedulerName: default-scheduler + tolerations: + - effect: NoSchedule + key: nvidia.com/gpu + operator: Equal + value: "true" + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + - emptyDir: {} + name: runtime-tmp + replicas: 2 + runtimeVersionOverride: 1.4.1 + sharedMemorySize: 64Gi + type: prefill + - name: decode + podTemplate: + metadata: + labels: + axk2.nvidia.com/role: decode-worker + axk2.nvidia.com/routing: kv-aware + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nvidia.com/gpu.product + operator: In + values: + - NVIDIA-B200 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: nvidia.com/dynamo-graph-deployment-name + operator: In + values: + - axk2-disagg-b200-chat + topologyKey: kubernetes.io/hostname + weight: 100 + containers: + - args: + - | + set -Eeuo pipefail + ulimit -l unlimited + exec python3 -m dynamo.vllm \ + --model skt/A.X-K2-NVFP4 \ + --revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --tokenizer-revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --served-model-name skt/A.X-K2-NVFP4 \ + --tensor-parallel-size 4 \ + --data-parallel-size 1 \ + --attention-backend FLASHINFER_MLA_SPARSE \ + --kernel-config '{"enable_flashinfer_autotune": false}' \ + --kv-cache-dtype fp8 \ + --block-size 64 \ + --max-model-len 262144 \ + --enable-prefix-caching \ + --kv-transfer-config="${KV_TRANSFER_CONFIG}" \ + --disaggregation-mode decode \ + --speculative-config="${SPECULATIVE_CONFIG}" \ + --async-scheduling \ + --dyn-tool-call-parser hermes \ + --dyn-reasoning-parser deepseek_v3 \ + --reasoning-parser deepseek_v3 + command: + - /bin/bash + - -lc + env: + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + - name: HF_HOME + value: /model-cache + - name: HF_HUB_OFFLINE + value: "1" + - name: KV_TRANSFER_CONFIG + valueFrom: + configMapKeyRef: + key: kv-transfer-config-decode + name: axk2-disagg-b200-chat-config + - name: SPECULATIVE_CONFIG + valueFrom: + configMapKeyRef: + key: speculative-config-decode + name: axk2-disagg-b200-chat-config + - name: NIXL_LOG_LEVEL + value: INFO + - name: UCX_RCACHE_MAX_UNRELEASED + value: "1024" + - name: UCX_TLS + value: rc_x,rc,cuda_copy,cuda_ipc + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + imagePullPolicy: IfNotPresent + name: main + resources: + limits: + nvidia.com/gpu: "4" + rdma/shared_ib: "1" + requests: + memory: 400Gi + nvidia.com/gpu: "4" + rdma/shared_ib: "1" + securityContext: + capabilities: + add: + - IPC_LOCK + - SYS_RESOURCE + runAsUser: 0 + startupProbe: + failureThreshold: 60 + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + volumeMounts: + - mountPath: /model-cache + name: model-cache + - mountPath: /tmp + name: runtime-tmp + workingDir: /workspace + schedulerName: default-scheduler + tolerations: + - effect: NoSchedule + key: nvidia.com/gpu + operator: Equal + value: "true" + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + - emptyDir: {} + name: runtime-tmp + replicas: 1 + runtimeVersionOverride: 1.4.1 + sharedMemorySize: 64Gi + type: decode diff --git a/recipes/ax-k2/vllm/disagg-b200-chat/kustomize/base/deploy.yaml b/recipes/ax-k2/vllm/disagg-b200-chat/kustomize/base/deploy.yaml new file mode 100644 index 000000000000..0011942eab23 --- /dev/null +++ b/recipes/ax-k2/vllm/disagg-b200-chat/kustomize/base/deploy.yaml @@ -0,0 +1,379 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: axk2-disagg-b200-chat-config + labels: + app.kubernetes.io/name: axk2-disagg-b200-chat + app.kubernetes.io/part-of: ax-k2 +data: + kv-transfer-config-prefill: |- + { + "kv_connector": "NixlConnector", + "kv_role": "kv_producer", + "kv_buffer_device": "cuda", + "kv_connector_extra_config": { + "backends": ["UCX"], + "num_threads": 8 + } + } + kv-transfer-config-decode: |- + { + "kv_connector": "NixlConnector", + "kv_role": "kv_consumer", + "kv_buffer_device": "cuda", + "kv_connector_extra_config": { + "backends": ["UCX"], + "num_threads": 8 + } + } + speculative-config-prefill: |- + { + "method": "eagle3", + "model": "skt/A.X-K2-EAGLE3", + "revision": "24958e91737d760908f73a8af4b6e06080fc5c1d", + "num_speculative_tokens": 3 + } + speculative-config-decode: |- + { + "method": "eagle3", + "model": "skt/A.X-K2-EAGLE3", + "revision": "24958e91737d760908f73a8af4b6e06080fc5c1d", + "num_speculative_tokens": 3 + } +--- +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: axk2-disagg-b200-chat + labels: + app.kubernetes.io/name: axk2-disagg-b200-chat + app.kubernetes.io/part-of: ax-k2 +spec: + backendFramework: vllm + components: + - name: Frontend + type: frontend + runtimeVersionOverride: 1.4.1 + replicas: 1 + podTemplate: + metadata: + labels: + axk2.nvidia.com/role: frontend + axk2.nvidia.com/routing: kv-aware + spec: + schedulerName: default-scheduler + containers: + - name: main + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + imagePullPolicy: IfNotPresent + workingDir: /workspace + command: + - /bin/bash + - -lc + args: + - | + set -Eeuo pipefail + exec python3 -m dynamo.frontend \ + --router-mode kv \ + --router-kv-events \ + --kv-cache-block-size 64 \ + --http-host 0.0.0.0 \ + --http-port 8000 + env: + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + ports: + - name: http + containerPort: 8000 + readinessProbe: + httpGet: + path: /health + port: http + periodSeconds: 10 + timeoutSeconds: 3 + failureThreshold: 6 + resources: + requests: + cpu: "4" + memory: 16Gi + limits: + cpu: "16" + memory: 32Gi + + - name: prefill + type: prefill + runtimeVersionOverride: 1.4.1 + replicas: 2 + sharedMemorySize: 64Gi + podTemplate: + metadata: + labels: + axk2.nvidia.com/role: prefill-worker + axk2.nvidia.com/routing: kv-aware + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nvidia.com/gpu.product + operator: In + values: + - NVIDIA-B200 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: nvidia.com/dynamo-graph-deployment-name + operator: In + values: + - axk2-disagg-b200-chat + topologyKey: kubernetes.io/hostname + containers: + - name: main + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + imagePullPolicy: IfNotPresent + workingDir: /workspace + command: + - /bin/bash + - -lc + args: + - | + set -Eeuo pipefail + ulimit -l unlimited + exec python3 -m dynamo.vllm \ + --model skt/A.X-K2-NVFP4 \ + --revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --tokenizer-revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --served-model-name skt/A.X-K2-NVFP4 \ + --tensor-parallel-size 4 \ + --data-parallel-size 1 \ + --attention-backend FLASHINFER_MLA_SPARSE \ + --kernel-config '{"enable_flashinfer_autotune": false}' \ + --kv-cache-dtype fp8 \ + --block-size 64 \ + --max-model-len 262144 \ + --enable-prefix-caching \ + --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20080","enable_kv_cache_events":true}' \ + --kv-transfer-config="${KV_TRANSFER_CONFIG}" \ + --disaggregation-mode prefill \ + --speculative-config="${SPECULATIVE_CONFIG}" \ + --no-async-scheduling \ + --dyn-tool-call-parser hermes \ + --dyn-reasoning-parser deepseek_v3 \ + --reasoning-parser deepseek_v3 + env: + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + - name: HF_HOME + value: /model-cache + - name: HF_HUB_OFFLINE + value: "1" + - name: KV_TRANSFER_CONFIG + valueFrom: + configMapKeyRef: + name: axk2-disagg-b200-chat-config + key: kv-transfer-config-prefill + # Keep the EAGLE3 model and draft length identical to decode so + # the draft-model state and KV layout match across the NIXL handoff. + - name: SPECULATIVE_CONFIG + valueFrom: + configMapKeyRef: + name: axk2-disagg-b200-chat-config + key: speculative-config-prefill + - name: NIXL_LOG_LEVEL + value: INFO + # NIXL is imported before vLLM can set this UCX registration-cache + # safety limit, so make the recommended value explicit. + - name: UCX_RCACHE_MAX_UNRELEASED + value: "1024" + - name: UCX_TLS + value: rc_x,rc,cuda_copy,cuda_ipc + resources: + requests: + nvidia.com/gpu: "4" + rdma/shared_ib: "1" + memory: 400Gi + limits: + nvidia.com/gpu: "4" + rdma/shared_ib: "1" + securityContext: + runAsUser: 0 + capabilities: + add: + - IPC_LOCK + - SYS_RESOURCE + startupProbe: + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + failureThreshold: 60 + volumeMounts: + - name: model-cache + mountPath: /model-cache + - name: runtime-tmp + mountPath: /tmp + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + - name: runtime-tmp + emptyDir: {} + schedulerName: default-scheduler + tolerations: + - key: nvidia.com/gpu + operator: Equal + value: "true" + effect: NoSchedule + + - name: decode + type: decode + runtimeVersionOverride: 1.4.1 + replicas: 1 + sharedMemorySize: 64Gi + podTemplate: + metadata: + labels: + axk2.nvidia.com/role: decode-worker + axk2.nvidia.com/routing: kv-aware + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nvidia.com/gpu.product + operator: In + values: + - NVIDIA-B200 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: nvidia.com/dynamo-graph-deployment-name + operator: In + values: + - axk2-disagg-b200-chat + topologyKey: kubernetes.io/hostname + containers: + - name: main + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-a.x-k2-post.1 + imagePullPolicy: IfNotPresent + workingDir: /workspace + command: + - /bin/bash + - -lc + args: + - | + set -Eeuo pipefail + ulimit -l unlimited + exec python3 -m dynamo.vllm \ + --model skt/A.X-K2-NVFP4 \ + --revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --tokenizer-revision 9e2e804e80f8d1b3afba5d7938173cec1ed46b49 \ + --served-model-name skt/A.X-K2-NVFP4 \ + --tensor-parallel-size 4 \ + --data-parallel-size 1 \ + --attention-backend FLASHINFER_MLA_SPARSE \ + --kernel-config '{"enable_flashinfer_autotune": false}' \ + --kv-cache-dtype fp8 \ + --block-size 64 \ + --max-model-len 262144 \ + --enable-prefix-caching \ + --kv-transfer-config="${KV_TRANSFER_CONFIG}" \ + --disaggregation-mode decode \ + --speculative-config="${SPECULATIVE_CONFIG}" \ + --async-scheduling \ + --dyn-tool-call-parser hermes \ + --dyn-reasoning-parser deepseek_v3 \ + --reasoning-parser deepseek_v3 + env: + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + - name: HF_HOME + value: /model-cache + - name: HF_HUB_OFFLINE + value: "1" + - name: KV_TRANSFER_CONFIG + valueFrom: + configMapKeyRef: + name: axk2-disagg-b200-chat-config + key: kv-transfer-config-decode + - name: SPECULATIVE_CONFIG + valueFrom: + configMapKeyRef: + name: axk2-disagg-b200-chat-config + key: speculative-config-decode + - name: NIXL_LOG_LEVEL + value: INFO + # NIXL is imported before vLLM can set this UCX registration-cache + # safety limit, so make the recommended value explicit. + - name: UCX_RCACHE_MAX_UNRELEASED + value: "1024" + - name: UCX_TLS + value: rc_x,rc,cuda_copy,cuda_ipc + resources: + requests: + nvidia.com/gpu: "4" + rdma/shared_ib: "1" + memory: 400Gi + limits: + nvidia.com/gpu: "4" + rdma/shared_ib: "1" + securityContext: + runAsUser: 0 + capabilities: + add: + - IPC_LOCK + - SYS_RESOURCE + startupProbe: + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + failureThreshold: 60 + volumeMounts: + - name: model-cache + mountPath: /model-cache + - name: runtime-tmp + mountPath: /tmp + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + - name: runtime-tmp + emptyDir: {} + schedulerName: default-scheduler + tolerations: + - key: nvidia.com/gpu + operator: Equal + value: "true" + effect: NoSchedule diff --git a/recipes/ax-k2/vllm/disagg-b200-chat/kustomize/base/kustomization.yaml b/recipes/ax-k2/vllm/disagg-b200-chat/kustomize/base/kustomization.yaml new file mode 100644 index 000000000000..1122c96fe640 --- /dev/null +++ b/recipes/ax-k2/vllm/disagg-b200-chat/kustomize/base/kustomization.yaml @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - deploy.yaml +components: + - ../../../../../kustomize/components/dynamo-openapi diff --git a/recipes/ax-k2/vllm/disagg-b200-chat/kustomize/overlays/generic/kustomization.yaml b/recipes/ax-k2/vllm/disagg-b200-chat/kustomize/overlays/generic/kustomization.yaml new file mode 100644 index 000000000000..24ad893742fa --- /dev/null +++ b/recipes/ax-k2/vllm/disagg-b200-chat/kustomize/overlays/generic/kustomization.yaml @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Generated file. For repository contributors, do not edit this checked-in copy. +# Regenerate this matrix's public overlays and template Components from the repository root: +# Regenerate: scripts/kustomize-matrix.py unfold recipes/ax-k2/vllm/disagg-b200-chat/.kustomize-matrix.yaml + +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +sortOptions: + order: fifo +resources: + - "../../base" From c9a72999baa9be8d403fb33dea8e3d6de5eb8c3b Mon Sep 17 00:00:00 2001 From: jthomson04 Date: Tue, 15 Sep 2026 13:12:11 -0700 Subject: [PATCH 007/191] test(benchmarks): cover trace command regression (#14861) Signed-off-by: jthomson04 --- .../router/tests/test_aiperf_commands.py | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 benchmarks/router/tests/test_aiperf_commands.py diff --git a/benchmarks/router/tests/test_aiperf_commands.py b/benchmarks/router/tests/test_aiperf_commands.py new file mode 100644 index 000000000000..7e397a0680fe --- /dev/null +++ b/benchmarks/router/tests/test_aiperf_commands.py @@ -0,0 +1,109 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Regression coverage for trace command arguments (NVBug 6414352).""" + +import sys + +import pytest + +from benchmarks.router import common + +pytestmark = [ + pytest.mark.pre_merge, + pytest.mark.gpu_0, + pytest.mark.unit, + pytest.mark.parallel, +] + + +@pytest.fixture +def command_args(tmp_path): + return { + "model": "test-model", + "tokenizer": "test-tokenizer", + "input_dataset": str(tmp_path / "input trace.jsonl"), + "artifact_dir": str(tmp_path / "aiperf artifacts"), + "seed": 17, + "url": "http://router.test", + } + + +@pytest.fixture +def agent_command_builder(monkeypatch): + # The standalone script imports common by its unqualified module name. + # Import inside the fixture so the temporary alias exists first and is + # restored at teardown without changing imports for unrelated scripts. + monkeypatch.setitem(sys.modules, "common", common) + from benchmarks.router import agent_benchmark + + return agent_benchmark.get_aiperf_cmd + + +def assert_trace_command(cmd, args): + assert cmd[:2] == ["aiperf", "profile"] + flags = {token.split("=", 1)[0] for token in cmd if token.startswith("--")} + assert "--prompt-input-tokens-block-size" not in flags + assert "--isl-block-size" not in flags + assert not any(flag.startswith("--synthetic-input-tokens-") for flag in flags) + + expected_values = { + "--model": args["model"], + "--tokenizer": args["tokenizer"], + "--url": args["url"], + "--input-file": args["input_dataset"], + "--custom-dataset-type": "mooncake_trace", + "--random-seed": str(args["seed"]), + "--artifact-dir": args["artifact_dir"], + } + for flag, value in expected_values.items(): + assert cmd.count(flag) == 1 + index = cmd.index(flag) + assert cmd[index : index + 2] == [flag, value] + + # The block size is unused by the other controlled inputs. + assert str(args["block_size"]) not in cmd + assert "None" not in cmd + common_flags = common.get_common_aiperf_flags() + assert cmd[-len(common_flags) :] == common_flags + + +def test_fixed_schedule_trace_command_omits_block_size(command_args): + args = {**command_args, "block_size": 512} + cmd = common.get_aiperf_cmd_for_trace( + args["model"], + args["tokenizer"], + args["input_dataset"], + args["artifact_dir"], + args["seed"], + args["block_size"], + args["url"], + ) + + assert_trace_command(cmd, args) + assert cmd.count("--fixed-schedule") == 1 + assert cmd.count("--fixed-schedule-auto-offset") == 1 + + +def test_agent_trace_command_omits_block_size(command_args, agent_command_builder): + args = {**command_args, "block_size": 64, "concurrency": 3, "request_count": 23} + cmd = agent_command_builder( + args["model"], + args["tokenizer"], + args["input_dataset"], + args["artifact_dir"], + args["seed"], + args["concurrency"], + args["block_size"], + args["request_count"], + args["url"], + ) + + assert_trace_command(cmd, args) + for flag, value in ( + ("--concurrency", str(args["concurrency"])), + ("--request-count", str(args["request_count"])), + ): + assert cmd.count(flag) == 1 + index = cmd.index(flag) + assert cmd[index : index + 2] == [flag, value] From dbf505be2252d485f8dcd35ef37773f6b89273ea Mon Sep 17 00:00:00 2001 From: Julien Mancuso <161955438+julienmancuso@users.noreply.github.com> Date: Tue, 15 Sep 2026 14:19:24 -0600 Subject: [PATCH 008/191] fix(operator): preserve alpha service metadata precedence (#14855) Signed-off-by: Julien Mancuso --- deploy/operator/internal/dynamo/graph.go | 19 ++++-- deploy/operator/internal/dynamo/graph_test.go | 59 ++++++++++++++++++- 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/deploy/operator/internal/dynamo/graph.go b/deploy/operator/internal/dynamo/graph.go index 4d581f9c4378..6e36b3dce939 100644 --- a/deploy/operator/internal/dynamo/graph.go +++ b/deploy/operator/internal/dynamo/graph.go @@ -2176,8 +2176,8 @@ func applyDGDTemplateDefaults( applyKvTransferPolicyToWorkerComponent(component, dynamoDeployment.Spec.Experimental.KvTransferPolicy, groveClusterTopologyDomains) } + propagateDGDSpecMetadata(dynamoDeployment, component) propagateDGDAnnotations(dynamoDeployment.GetAnnotations(), component) - propagateDGDSpecMetadata(dynamoDeployment.Spec.Annotations, dynamoDeployment.Spec.Labels, component) } func shouldApplyKvTransferPolicyToWorkerComponent( @@ -2320,10 +2320,21 @@ func propagateDGDAnnotations(dgdAnnotations map[string]string, component *v1beta } } -// propagateDGDSpecMetadata merges DGD spec-level annotations and labels into -// the component as a low-priority base. Service-level values take precedence. -func propagateDGDSpecMetadata(annotations, labels map[string]string, component *v1beta1.DynamoComponentDeploymentSharedSpec) { +// propagateDGDSpecMetadata materializes graph and preserved v1alpha1 service +// metadata into the component with explicit pod-template metadata taking precedence. +func propagateDGDSpecMetadata(dgd *v1beta1.DynamoGraphDeployment, component *v1beta1.DynamoComponentDeploymentSharedSpec) { podTemplate := ensurePodTemplate(component) + + // Recover service metadata stored only in the alpha compatibility payload. + var serviceAnnotations, serviceLabels map[string]string + if alphaComponent := getDGDAlphaComponent(dgd, component.ComponentName); alphaComponent != nil { + serviceAnnotations = alphaComponent.Annotations + serviceLabels = alphaComponent.Labels + } + + // Compose graph < alpha service < explicit pod-template precedence. + annotations := mergeLowPriorityMetadata(maps.Clone(serviceAnnotations), dgd.Spec.Annotations) + labels := mergeLowPriorityMetadata(maps.Clone(serviceLabels), dgd.Spec.Labels) podTemplate.Annotations = mergeLowPriorityMetadata(podTemplate.Annotations, annotations) podTemplate.Labels = mergeLowPriorityMetadata(podTemplate.Labels, labels) } diff --git a/deploy/operator/internal/dynamo/graph_test.go b/deploy/operator/internal/dynamo/graph_test.go index c02c3ba4dbac..cfe07b82d131 100644 --- a/deploy/operator/internal/dynamo/graph_test.go +++ b/deploy/operator/internal/dynamo/graph_test.go @@ -10108,7 +10108,13 @@ func TestPropagateDGDSpecMetadata(t *testing.T) { Labels: tt.serviceLabels, } betaComponent := betaComponent(t, component) - propagateDGDSpecMetadata(tt.dgdAnnotations, tt.dgdLabels, betaComponent) + dgd := &v1beta1.DynamoGraphDeployment{ + Spec: v1beta1.DynamoGraphDeploymentSpec{ + Annotations: tt.dgdAnnotations, + Labels: tt.dgdLabels, + }, + } + propagateDGDSpecMetadata(dgd, betaComponent) annotations := GetPodTemplateAnnotations(betaComponent) labels := GetPodTemplateLabels(betaComponent) @@ -10128,6 +10134,57 @@ func TestPropagateDGDSpecMetadata(t *testing.T) { } } +func TestApplyDGDTemplateDefaultsPreservesAlphaServiceMetadataPrecedence(t *testing.T) { + t.Log("Convert a merged v1alpha1 DGD with conflicting DGD and service discovery annotations") + alpha := &v1alpha1.DynamoGraphDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + commonconsts.KubeAnnotationDynamoDiscoveryBackend: "etcd", + }, + }, + Spec: v1alpha1.DynamoGraphDeploymentSpec{ + Services: map[string]*v1alpha1.DynamoComponentDeploymentSharedSpec{ + "Frontend": { + ComponentType: "frontend", + Annotations: map[string]string{ + commonconsts.KubeAnnotationDynamoDiscoveryBackend: "kubernetes", + }, + }, + }, + }, + } + beta := &v1beta1.DynamoGraphDeployment{} + require.NoError(t, alpha.ConvertTo(beta)) + component := beta.GetComponentByName("Frontend") + require.NotNil(t, component) + + t.Log("Apply DGD defaults to the converted component") + applyDGDTemplateDefaults(component, beta, nil) + + t.Log("Verify runtime pod generation consumes the service-level discovery override") + podSpec, err := GenerateBasePodSpec( + component, + BackendFrameworkSGLang, + &mockSecretsRetriever{}, + "test-deployment", + "default", + RoleMain, + 1, + &configv1alpha1.OperatorConfiguration{ + Discovery: configv1alpha1.DiscoveryConfiguration{Backend: configv1alpha1.DiscoveryBackendEtcd}, + }, + commonconsts.MultinodeDeploymentTypeGrove, + "Frontend", + nil, + staticContainerGPUCount(0), + ) + require.NoError(t, err) + assert.Contains(t, podSpec.Containers[0].Env, corev1.EnvVar{ + Name: commonconsts.DynamoDiscoveryBackendEnvVar, + Value: "kubernetes", + }) +} + func TestGenerateGrovePodCliqueSet_SpecMetadataPropagation(t *testing.T) { dgd := &v1alpha1.DynamoGraphDeployment{ ObjectMeta: metav1.ObjectMeta{ From db6774e2d30b0ad5509f0dcc4bd3480c9b2182f1 Mon Sep 17 00:00:00 2001 From: Harrison Saturley-Hall Date: Tue, 15 Sep 2026 16:38:49 -0400 Subject: [PATCH 009/191] build(deps): bump AISimulate to 0.12.0.dev2 (#14831) --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- benchmarks/pyproject.toml | 2 +- container/deps/requirements.aisimulate.txt | 2 +- container/templates/wheel_builder.Dockerfile | 12 ------------ lib/bindings/kvbm/Cargo.lock | 4 ++-- lib/bindings/python/Cargo.lock | 4 ++-- lib/bindings/python/Cargo.toml | 2 +- pyproject.toml | 2 +- .../dependencies/test_aiconfigurator_consistency.py | 2 +- 10 files changed, 12 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd250b8af591..2756ad0b38a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "aisimulate-core" -version = "0.12.0-dev.1" +version = "0.12.0-dev.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4db6a085073ecb1c2569f796ba44742ed4681f8f4060daaed2456ef4ea9b652" +checksum = "ec87377a578ece6834d384b93bfba15f5809c754f5495efa452fe985cdb0edd5" dependencies = [ "anyhow", "bincode 1.3.3", diff --git a/Cargo.toml b/Cargo.toml index e76399a77681..edd7550cfa50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,7 +56,7 @@ keywords = ["llm", "genai", "inference", "nvidia", "distributed"] [workspace.dependencies] # Published separately by https://github.com/ai-dynamo/aisimulate. -aisimulate-core = { version = "=0.12.0-dev.1" } +aisimulate-core = { version = "=0.12.0-dev.2" } # Local crates dynamo-runtime = { path = "lib/runtime", version = "1.5.0" } diff --git a/benchmarks/pyproject.toml b/benchmarks/pyproject.toml index 221802fd115e..4fa3cd742c05 100644 --- a/benchmarks/pyproject.toml +++ b/benchmarks/pyproject.toml @@ -39,7 +39,7 @@ classifiers = [ ] dependencies = [ - "aisimulate==0.12.0.dev1; python_version >= '3.11' and python_version < '3.14'", + "aisimulate==0.12.0.dev2; python_version >= '3.11' and python_version < '3.14'", "aiperf==0.12.0", "matplotlib", "networkx", diff --git a/container/deps/requirements.aisimulate.txt b/container/deps/requirements.aisimulate.txt index 7d834b93a593..b6e21613076e 100644 --- a/container/deps/requirements.aisimulate.txt +++ b/container/deps/requirements.aisimulate.txt @@ -2,4 +2,4 @@ # SPDX-License-Identifier: Apache-2.0 # Published AISimulate wheel staged into planner and framework runtime wheelhouses. -aisimulate==0.12.0.dev1 +aisimulate==0.12.0.dev2 diff --git a/container/templates/wheel_builder.Dockerfile b/container/templates/wheel_builder.Dockerfile index 03372c8ca5a4..c81a67297659 100644 --- a/container/templates/wheel_builder.Dockerfile +++ b/container/templates/wheel_builder.Dockerfile @@ -639,22 +639,10 @@ COPY container/deps/requirements.aisimulate.txt /opt/dynamo/container/deps/requi # wheel consumed by ai-dynamo instead of rebuilding it from vendored source. # Download only this distribution; runtime images own dependency installation # through their requirements files and local wheels. -# AISimulate targets glibc 2.34+, which all consuming runtime images support. -# Select that target explicitly: the manylinux_2_28 builder only stages the -# wheel and must not filter it using the builder's older glibc version. RUN --mount=type=cache,id=uv-root-{{ context.dynamo.uv_version }},target=/root/.cache/uv,sharing=shared \ export UV_CACHE_DIR=/root/.cache/uv && \ source ${VIRTUAL_ENV}/bin/activate && \ - case "${TARGETARCH}" in \ - amd64) AISIMULATE_WHEEL_ARCH=x86_64 ;; \ - arm64) AISIMULATE_WHEEL_ARCH=aarch64 ;; \ - *) echo "Unsupported AISimulate target architecture: ${TARGETARCH}" >&2; exit 1 ;; \ - esac && \ python -m pip download \ - --platform "manylinux_2_34_${AISIMULATE_WHEEL_ARCH}" \ - --python-version "${PYTHON_VERSION}" \ - --implementation cp \ - --abi abi3 \ --only-binary=:all: \ --no-deps \ --dest /opt/dynamo/dist \ diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index bbb8ce02a133..170c8b52837f 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "aisimulate-core" -version = "0.12.0-dev.1" +version = "0.12.0-dev.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4db6a085073ecb1c2569f796ba44742ed4681f8f4060daaed2456ef4ea9b652" +checksum = "ec87377a578ece6834d384b93bfba15f5809c754f5495efa452fe985cdb0edd5" dependencies = [ "anyhow", "bincode 1.3.3", diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index fcf01abe3d0b..269910dc2c5f 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "aisimulate-core" -version = "0.12.0-dev.1" +version = "0.12.0-dev.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4db6a085073ecb1c2569f796ba44742ed4681f8f4060daaed2456ef4ea9b652" +checksum = "ec87377a578ece6834d384b93bfba15f5809c754f5495efa452fe985cdb0edd5" dependencies = [ "anyhow", "bincode 1.3.3", diff --git a/lib/bindings/python/Cargo.toml b/lib/bindings/python/Cargo.toml index 6836f8dab7a7..cab947a905ea 100644 --- a/lib/bindings/python/Cargo.toml +++ b/lib/bindings/python/Cargo.toml @@ -60,7 +60,7 @@ request-trace-s3 = ["dynamo-llm/request-trace-s3"] # former AIC crate surface. The `python` feature is required for # AicEngineBuilder; this extension supplies the interpreter, so the dependency # must not enable `extension-module`. -aisimulate-core = { version = "=0.12.0-dev.1", optional = true, features = ["python"] } +aisimulate-core = { version = "=0.12.0-dev.2", optional = true, features = ["python"] } dynamo-runtime = { path = "../../runtime" } dynamo-mocker = { path = "../../mocker" } dynamo-parsers = { version = "8.1.0" } diff --git a/pyproject.toml b/pyproject.toml index 50c0f3d73ccc..5f868ed6d030 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ license-files = ["LICENSE"] requires-python = ">=3.10" dependencies = [ "ai-dynamo-runtime==1.5.0", - "aisimulate==0.12.0.dev1; python_version >= '3.11' and python_version < '3.14'", + "aisimulate==0.12.0.dev2; python_version >= '3.11' and python_version < '3.14'", "aiohttp>=3.14.3,<4.0", "transformers>=4.56.0", "kubernetes>=32.0.1,<33.0.0", diff --git a/tests/dependencies/test_aiconfigurator_consistency.py b/tests/dependencies/test_aiconfigurator_consistency.py index 80c27c7c2358..daf90295d456 100644 --- a/tests/dependencies/test_aiconfigurator_consistency.py +++ b/tests/dependencies/test_aiconfigurator_consistency.py @@ -93,7 +93,7 @@ def test_no_manifest_installs_retired_aic_distributions() -> None: assert all(package["name"] != "aiconfigurator-core" for package in packages) assert features["aic-forward-pass"] == ["dep:aisimulate-core"] assert dependencies["aisimulate-core"] == { - "version": "=0.12.0-dev.1", + "version": "=0.12.0-dev.2", "optional": True, "features": ["python"], } From 165fca704e3059e4183044533ebb481a167f97df Mon Sep 17 00:00:00 2001 From: GLAMR Date: Tue, 15 Sep 2026 16:56:42 -0400 Subject: [PATCH 010/191] fix(vllm): stop the embedding worker pool crashing at startup (#14449) Signed-off-by: svc-glamr@nvidia.com --- .../dynamo/vllm/embedding_worker_processes.py | 52 +++++++++++++++- .../tests/test_embedding_worker_processes.py | 61 ++++++++++++++++++- 2 files changed, 108 insertions(+), 5 deletions(-) diff --git a/components/src/dynamo/vllm/embedding_worker_processes.py b/components/src/dynamo/vllm/embedding_worker_processes.py index 3dd3254668a3..06d0c2343d62 100644 --- a/components/src/dynamo/vllm/embedding_worker_processes.py +++ b/components/src/dynamo/vllm/embedding_worker_processes.py @@ -25,6 +25,7 @@ from concurrent.futures import ThreadPoolExecutor from typing import Any, Callable +import vllm from vllm.config import VllmConfig from vllm.usage.usage_lib import UsageContext from vllm.v1.engine.async_llm import AsyncLLM @@ -39,6 +40,10 @@ _ENGINE_ADDRESSES_ENV = "DYN_VLLM_EMBEDDING_ENGINE_ADDRESSES" _CHILD_ROLE = "child" _RPC_BASE_PATH_ENV = "VLLM_RPC_BASE_PATH" +# The two shapes _unpack_core_engine_launch accepts were read from these vLLM +# releases: 0.27.1, which container/context.yaml builds the XPU images on, and +# 0.28.0, the pin in pyproject.toml. Re-check that helper when either moves. +_VERIFIED_VLLM_VERSIONS = ("0.27.1", "0.28.0") def is_embedding_process_child() -> bool: @@ -372,6 +377,44 @@ def _short_rpc_directory() -> tempfile.TemporaryDirectory: return rpc_directory +def _unrecognized_launch_shape(detail: str) -> RuntimeError: + """Name the installed vLLM and the shape it yielded, not just the symptom.""" + return RuntimeError( + f"vLLM {vllm.__version__} yields {detail} from launch_core_engines. " + f"This unpacking was verified against vLLM " + f"{' and '.join(_VERIFIED_VLLM_VERSIONS)}; the result shape has most " + "likely changed upstream and _unpack_core_engine_launch needs " + "updating to match." + ) + + +def _unpack_core_engine_launch(launch: Any) -> tuple[Any, Any, Any, Any]: + """Normalize what ``launch_core_engines`` yields across vLLM releases. + + vLLM 0.28 and later yield a ``CoreEngineLaunch`` object defining no + ``__iter__``; earlier releases yield a plain 4-tuple. Duck-typing the + yielded object avoids importing ``CoreEngineLaunch``, a name that does not + exist before 0.28. + """ + if isinstance(launch, tuple): + if len(launch) != 4: + raise _unrecognized_launch_shape( + f"a {len(launch)}-tuple rather than the expected 4-tuple" + ) + return launch + try: + return ( + launch.engine_manager, + launch.coordinator, + launch.addresses, + launch.tensor_queue, + ) + except AttributeError as error: + raise _unrecognized_launch_shape( + f"a {type(launch).__name__} with no {error.name!r} attribute" + ) from error + + def create_shared_embedding_engine_client( *, vllm_config: VllmConfig, @@ -438,8 +481,13 @@ def create_shared_embedding_engine_client( executor_class, not disable_log_stats, addresses, - process_count, - ) as (engine_manager, coordinator, addresses, tensor_queue): + ) as core_engine_launch: + ( + engine_manager, + coordinator, + addresses, + tensor_queue, + ) = _unpack_core_engine_launch(core_engine_launch) if coordinator is not None or tensor_queue is not None: raise RuntimeError( "--embedding-worker-processes currently supports one " diff --git a/components/src/dynamo/vllm/tests/test_embedding_worker_processes.py b/components/src/dynamo/vllm/tests/test_embedding_worker_processes.py index 5b24a77bb134..d8a299df8ca4 100644 --- a/components/src/dynamo/vllm/tests/test_embedding_worker_processes.py +++ b/components/src/dynamo/vllm/tests/test_embedding_worker_processes.py @@ -36,6 +36,25 @@ def _vllm_config(): ) +def _core_engine_launch_object(engine_manager, addresses): + """The shape vLLM 0.28 yields: a ``CoreEngineLaunch`` dataclass. + + Reproduced locally rather than imported, because the name does not exist + in the vLLM releases that yield the tuple below. + """ + return SimpleNamespace( + engine_manager=engine_manager, + coordinator=None, + addresses=addresses, + tensor_queue=None, + ) + + +def _core_engine_launch_tuple(engine_manager, addresses): + """The shape vLLM yields before 0.28, including the 0.27.1 XPU images.""" + return (engine_manager, None, addresses, None) + + def test_child_environment_offsets_system_port_by_index(monkeypatch): monkeypatch.setenv("DYN_SYSTEM_PORT", "19401") env = processes._child_environment( @@ -193,7 +212,41 @@ def test_process_group_reports_unexpected_child_exit(): group._stopping.set() -def test_parent_launches_n_minus_one_children_and_one_engine(monkeypatch): +def _assert_names_verified_versions(message): + for version in processes._VERIFIED_VLLM_VERSIONS: + assert version in message + + +def test_unpack_core_engine_launch_names_a_renamed_field(): + """An upstream rename must say which field went missing.""" + launch = SimpleNamespace(engine_manager=Mock(), coordinator=None, addresses=Mock()) + + with pytest.raises(RuntimeError) as raised: + processes._unpack_core_engine_launch(launch) + + message = str(raised.value) + assert "tensor_queue" in message + _assert_names_verified_versions(message) + assert isinstance(raised.value.__cause__, AttributeError) + + +@pytest.mark.parametrize("size", [3, 5], ids=["short-tuple", "long-tuple"]) +def test_unpack_core_engine_launch_rejects_a_resized_tuple(size): + """A tuple of the wrong arity must not reach the caller's four-name unpack.""" + with pytest.raises(RuntimeError) as raised: + processes._unpack_core_engine_launch(tuple(range(size))) + + message = str(raised.value) + assert f"{size}-tuple" in message + _assert_names_verified_versions(message) + + +@pytest.mark.parametrize( + "make_launch", + [_core_engine_launch_object, _core_engine_launch_tuple], + ids=["core-engine-launch-object", "legacy-tuple"], +) +def test_parent_launches_n_minus_one_children_and_one_engine(monkeypatch, make_launch): process_count = 4 addresses = SimpleNamespace( inputs=[f"in{i}" for i in range(process_count)], @@ -210,9 +263,11 @@ def create_child(*_args, **_kwargs): children.append(child) return child + # Mirrors vLLM's launch_core_engines signature exactly: no *args, so a + # call with the wrong arity fails here instead of at startup. @contextmanager - def launch_context(*_args, **_kwargs): - yield engine_manager, None, addresses, None + def launch_context(vllm_config, executor_class, log_stats, addresses): + yield make_launch(engine_manager, addresses) parent_client = Mock() parent_config = _vllm_config() From 09497580bb6894b563f6d34bbedd84aaf70516dc Mon Sep 17 00:00:00 2001 From: William Arnold <7565007+Aphoh@users.noreply.github.com> Date: Wed, 16 Sep 2026 06:20:41 +0900 Subject: [PATCH 011/191] feat(rl): add Slime external rollout example (#12856) Signed-off-by: William Arnold <7565007+Aphoh@users.noreply.github.com> --- .github/codeowners/areas.yaml | 1 + CODEOWNERS | 1 + docs/fern/index.yml | 2 + .../integration-reference.md | 2 +- .../reinforcement-learning/overview.md | 6 +- .../use-cases/reinforcement-learning/slime.md | 150 +++++++++++++ examples/README.md | 3 +- examples/rl/slime/README.md | 160 ++++++++++++++ examples/rl/slime/deploy-dynamo.sh | 33 +++ examples/rl/slime/dynamo.yaml | 197 ++++++++++++++++++ examples/rl/slime/dynamo_generate.py | 62 ++++++ examples/rl/slime/launch-slime.sh | 37 ++++ 12 files changed, 650 insertions(+), 4 deletions(-) create mode 100644 docs/fern/pages/use-cases/reinforcement-learning/slime.md create mode 100644 examples/rl/slime/README.md create mode 100755 examples/rl/slime/deploy-dynamo.sh create mode 100644 examples/rl/slime/dynamo.yaml create mode 100644 examples/rl/slime/dynamo_generate.py create mode 100755 examples/rl/slime/launch-slime.sh diff --git a/.github/codeowners/areas.yaml b/.github/codeowners/areas.yaml index 552e7bd495ab..a95c20739bfc 100644 --- a/.github/codeowners/areas.yaml +++ b/.github/codeowners/areas.yaml @@ -459,6 +459,7 @@ areas: github_team: '@ai-dynamo/dynamo-rl-codeowners' path_globs: - components/src/dynamo/common/rl/ + - examples/rl/ - lib/rl/ - tests/rl/ - label: performance diff --git a/CODEOWNERS b/CODEOWNERS index e91a11f2a59a..e84a84e3205c 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -385,6 +385,7 @@ # === rl (@ai-dynamo/dynamo-rl-codeowners) === /lib/rl/ @ai-dynamo/dynamo-rl-codeowners +/examples/rl/ @ai-dynamo/dynamo-rl-codeowners # === performance (@ai-dynamo/dynamo-performance-codeowners) === /recipes/ @ai-dynamo/dynamo-performance-codeowners diff --git a/docs/fern/index.yml b/docs/fern/index.yml index 2ea7d84d905f..20250c1125ce 100644 --- a/docs/fern/index.yml +++ b/docs/fern/index.yml @@ -680,6 +680,8 @@ navigation: path: pages/use-cases/reinforcement-learning/verl.md - page: NeMo RL Integration path: pages/use-cases/reinforcement-learning/nemo-rl.md + - page: Slime Integration + path: pages/use-cases/reinforcement-learning/slime.md - page: External Trainer Integration path: pages/use-cases/reinforcement-learning/implementation-guide.md - page: RL Integration Reference diff --git a/docs/fern/pages/use-cases/reinforcement-learning/integration-reference.md b/docs/fern/pages/use-cases/reinforcement-learning/integration-reference.md index 2b7f6839752e..be27e0e8614f 100644 --- a/docs/fern/pages/use-cases/reinforcement-learning/integration-reference.md +++ b/docs/fern/pages/use-cases/reinforcement-learning/integration-reference.md @@ -179,7 +179,7 @@ Even two vLLM deployments can expose different route families because the Python |---|---|---|---| | [verl](verl.md) | Experimental | Shared Dynamo frontend with colocated vLLM rollout workers | The public recipe owns CUDA IPC updates through Ray/ZMQ control. Choose native Dynamo routing or ThunderAgent as distinct variants. | | [NeMo RL](nemo-rl.md) | Experimental | NeMo RL-managed Dynamo/vLLM fleet on Slurm and Ray | Fixed non-colocated fleet with framework-owned NCCL refit; not an external Dynamo deployment. | -| [SLIME](https://github.com/THUDM/slime) | Integration in progress | Proposed shared SGLang `/generate` path with direct engine control | No merged, maintained Dynamo recipe yet; discovery and update ownership remain unsettled. | +| [Slime](slime.md) | Experimental fixed worker set | Dynamo sidecars manage stock SGLang engines for [streaming external rollouts](https://github.com/THUDM/slime/pull/2272) | The [fixed-worker-set example](https://github.com/ai-dynamo/dynamo/blob/main/examples/README.md#integration-examples) sends generation through the Dynamo frontend. Slime uses static engine Services for control and weight updates. The example does not support elastic discovery or external-engine recovery. | | [Prime-RL](https://github.com/PrimeIntellect-ai/prime-rl) | Router available; full integration in progress | Prime-RL documents the Dynamo router as a drop-in option; a proposed Dynamo/vLLM sidecar adds worker discovery and external updates | Routing can be evaluated today, but the full adapter remains in upstream development and is not a released compatibility surface. | | [OpenRLHF](https://github.com/OpenRLHF/OpenRLHF), [Miles](https://github.com/fleet-ai/miles-fleet), [SkyRL](https://github.com/NovaSky-AI/SkyRL), and [Polar](https://github.com/NVIDIA-NeMo/ProRL-Agent-Server) | No Dynamo guide | No maintained Dynamo adapter was found in the reviewed public sources | Add a guide only after a maintained integration completes the same generation, update, failure, and ownership checks. | diff --git a/docs/fern/pages/use-cases/reinforcement-learning/overview.md b/docs/fern/pages/use-cases/reinforcement-learning/overview.md index c715987ec967..e2472e2ae996 100644 --- a/docs/fern/pages/use-cases/reinforcement-learning/overview.md +++ b/docs/fern/pages/use-cases/reinforcement-learning/overview.md @@ -13,7 +13,9 @@ Use Dynamo when rollout serving has become a distributed-systems problem: many w In production, [Cognition used Dynamo while training SWE-1.7](https://cognition.com/blog/swe-1-7) to manage inference-engine lifecycles and route inference across a multi-cluster RL system. When a replica failed, Dynamo rerouted inference to another worker and rescheduled the replica so the rollout pipeline could remain available while the latest policy state was restored. -Dynamo also connects to a growing RL framework ecosystem. [verl](https://github.com/verl-project/verl-recipe/tree/main/dynamo) publishes a Dynamo rollout recipe, [NeMo RL](https://github.com/NVIDIA-NeMo/RL/tree/main/nemo_rl/models/generation/dynamo) includes a managed Dynamo generation backend, and [Prime-RL](https://www.primeintellect.ai/blog/rl-at-1t-scale) supports the Dynamo router as a drop-in routing option. Integration work with [SLIME](integration-reference.md#framework-compatibility) extends the same serving capabilities to SGLang-based rollout stacks. Together, these paths demonstrate that Dynamo can support different training frameworks and deployment models while leaving RL semantics with the trainer. +Dynamo connects to these RL frameworks. [verl](https://github.com/verl-project/verl-recipe/tree/main/dynamo) publishes a Dynamo rollout recipe. [NeMo RL](https://github.com/NVIDIA-NeMo/RL/tree/main/nemo_rl/models/generation/dynamo) includes a managed Dynamo generation backend. [Prime-RL](https://www.primeintellect.ai/blog/rl-at-1t-scale) supports the Dynamo router as a drop-in routing option. The experimental [Slime integration](slime.md) runs stock SGLang engines with Dynamo sidecars. + +These integrations support different training frameworks and deployment models. The trainer retains ownership of RL semantics. ## Keep Rollouts Running Through Failures @@ -46,7 +48,7 @@ Start with a specific bottleneck and a baseline metric. Measure cache reuse, wor | Custom or external trainer | Experimental contract | [External Trainer Integration](implementation-guide.md) for generation, discovery, administration, and policy updates. | | verl | Experimental | [verl Integration](verl.md) for the public colocated Dynamo/vLLM recipe. | | NeMo RL | Experimental | [NeMo RL Integration](nemo-rl.md) for the managed Slurm/Ray Dynamo backend. | -| SLIME | Integration in progress | Review the current boundary in [Framework Compatibility](integration-reference.md#framework-compatibility). | +| Slime | Experimental fixed worker set | Use the [Slime Integration](slime.md) with the streaming external-rollout support from Slime. | | Prime-RL | Routing available; integration in progress | See [Prime-RL's routing overview](https://www.primeintellect.ai/blog/rl-at-1t-scale) and the current boundary in [Framework Compatibility](integration-reference.md#framework-compatibility). | Experimental guides have runnable upstream artifacts but do not make a general compatibility promise. Integrations in progress remain in the compatibility table until a maintained path lands. diff --git a/docs/fern/pages/use-cases/reinforcement-learning/slime.md b/docs/fern/pages/use-cases/reinforcement-learning/slime.md new file mode 100644 index 000000000000..342f8a4905ff --- /dev/null +++ b/docs/fern/pages/use-cases/reinforcement-learning/slime.md @@ -0,0 +1,150 @@ +--- +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +title: Slime Integration +subtitle: Run Slime external rollouts through Dynamo on Kubernetes +--- + +**Experimental.** This integration connects Slime to a fixed set of SGLang engines that a DynamoGraphDeployment manages. + +Slime sends rollout generation through the Dynamo frontend. It sends control and weight-update requests to each SGLang engine. + +## Integration Shape + +| Concern | Current path | +|---|---| +| Training and rollout orchestration | Slime | +| Generation | Dynamo frontend with SGLang workers | +| Routing | Dynamo routes rollout requests to the fixed worker set | +| Policy update | Slime calls the native SGLang APIs for each worker | +| Service discovery | Fixed Kubernetes Services | +| Deployment | DynamoGraphDeployment on Kubernetes | + +Slime starts an SGLang router to track the external engines. The custom generator sends rollout requests to the Dynamo frontend instead. + +The Slime external-engine support lives in the upstream Slime repository. The Dynamo-specific deployment files live in the Dynamo example. + +| Source | Files | +|---|---| +| Slime | [`slime/rollout/`](https://github.com/THUDM/slime/tree/4c1ab40203952b3dcc8582b653f3a83f2c6e8128/slime/rollout) | +| Dynamo | [`examples/rl/slime/`](https://github.com/ai-dynamo/dynamo/blob/main/examples/README.md#integration-examples) | + +## Prerequisites + +- Install the [Dynamo Kubernetes Platform](../../kubernetes/installation/install-dynamo.md) on a GPU cluster. +- Install the NVIDIA device plugin for the `nvidia.com/gpu` resource. +- Install `kubectl` and `envsubst` on the deployment host. +- Select matching Dynamo frontend and SGLang runtime image versions. +- Allocate two GPUs for the SGLang workers. +- Allocate the additional resources that the Slime training job requires. +- Use a Slime revision that includes [THUDM/slime#2272](https://github.com/THUDM/slime/pull/2272). + +## Prepare the Source + +Clone the Slime merge commit that added streaming external rollouts: + +```bash +git clone https://github.com/THUDM/slime.git +git -C slime checkout 4c1ab40203952b3dcc8582b653f3a83f2c6e8128 +test -f slime/slime/rollout/sglang_streaming_rollout.py +``` + +Install Slime with the [upstream instructions](https://github.com/THUDM/slime/blob/4c1ab40203952b3dcc8582b653f3a83f2c6e8128/README.md). Keep the checkout path for `SLIME_HOME`. + +Clone Dynamo to get the deployment example: + +```bash +git clone https://github.com/ai-dynamo/dynamo.git +cd dynamo +``` + +## Deploy the Worker Set + +Set the Dynamo images to the same version. The deployment uses `Qwen/Qwen3-0.6B` by default. + +```bash +export KUBE_CONTEXT= +export NAMESPACE= +export DYNAMO_FRONTEND_IMAGE=nvcr.io/nvidia/ai-dynamo/dynamo-frontend: +export SGLANG_RUNTIME_IMAGE=nvcr.io/nvidia/ai-dynamo/sglang-runtime: +export DYNAMO_RUNTIME_VERSION= +export MODEL_PATH=Qwen/Qwen3-0.6B +examples/rl/slime/deploy-dynamo.sh +``` + +Each worker Pod runs SGLang and loads `dynamo.sglang.sidecar` through the SGLang `--sidecar` option. + +The manifest creates these Services: + +- `slime-sglang-rollout:8000` exposes the Dynamo frontend. +- `slime-sglang-engine-0:30000` exposes the first native SGLang API. +- `slime-sglang-engine-1:30000` exposes the second native SGLang API. + +Each engine Service selects one worker component. Keep each worker component at one replica. + +Restrict access to the engine Services. These Services expose administrative and weight-update APIs. + +## Make Sure That the Engines Are Ready + +Run these commands from the Slime environment or another Pod in the deployment namespace: + +```bash +curl --fail-with-body http://slime-sglang-engine-0:30000/health_generate +curl --fail-with-body http://slime-sglang-engine-1:30000/health_generate +curl --fail-with-body http://slime-sglang-rollout:8000/health +``` + +The first two commands show that the SGLang engines are ready. The third command shows that the Dynamo frontend is ready. + +## Run Slime + +Set the fixed engine addresses and the Dynamo frontend address. Then add the arguments that your training workload requires. + +```bash +export SLIME_HOME= +export DYNAMO_ENGINE_ADDRS="slime-sglang-engine-0:30000 slime-sglang-engine-1:30000" +export DYNAMO_ROLLOUT_URL="http://slime-sglang-rollout:8000" +examples/rl/slime/launch-slime.sh \ + --hf-checkpoint Qwen/Qwen3-0.6B \ + --prompt-data \ + --input-key prompt \ + --rm-type random \ + --num-rollout 1 \ + --rollout-batch-size 2 \ + --n-samples-per-prompt 2 \ + --rollout-max-response-len 128 \ + --actor-num-nodes 1 \ + --actor-num-gpus-per-node 1 +``` + +The launcher passes the fixed worker list to Slime. It also enables incremental streaming output. + +The `dynamo_generate.generate_streaming` adapter sends generation to `DYNAMO_ROLLOUT_URL`. Slime calls each fixed engine for control operations and weight updates. + +## Make Sure That the Integration Works + +Complete these steps before you increase the workload size: + +1. Run one rollout with the selected model and weight transport. +2. Apply one policy update to both engines. +3. Run one rollout after the update. +4. Stop one worker during a test run. +5. Make sure that Slime stops or reports the worker failure. +6. Restart the Slime job after Kubernetes replaces the worker Pod. + +The integration does not recover a replaced external engine during a Slime job. + +## Current Limitations + +- The example uses a fixed worker set. +- The example does not support dynamic endpoint registration. +- Slime must restart after Kubernetes replaces an engine Pod. +- The native engine Services require network isolation. +- The example does not provide a fleet-wide policy-update transaction or automatic rollback. + +## Upstream Resources + +- [Dynamo Slime example](https://github.com/ai-dynamo/dynamo/blob/main/examples/README.md#integration-examples) +- [Slime streaming external-rollout change](https://github.com/THUDM/slime/pull/2272) +- [Slime external rollout engine guide](https://github.com/THUDM/slime/blob/4c1ab40203952b3dcc8582b653f3a83f2c6e8128/docs/en/advanced/external-rollout-engines.md) +- [Shared RL integration reference](integration-reference.md) diff --git a/examples/README.md b/examples/README.md index 620539feb215..73106589853f 100644 --- a/examples/README.md +++ b/examples/README.md @@ -58,7 +58,8 @@ Platform-specific manifests and templates for production environments. Deploymen End-to-end examples that connect Dynamo to adjacent inference services: -- **[llm-d Batch Gateway](deployments/llm-d-batch-gateway/README.md)** - Experimental OpenAI Batch lifecycle on a dedicated Dynamo worker pool +- **[llm-d Batch Gateway](deployments/llm-d-batch-gateway/README.md)** provides an experimental OpenAI Batch lifecycle on a dedicated Dynamo worker pool. +- **[Slime External Rollouts](rl/slime/README.md)** connects a fixed Slime worker set to stock SGLang engines and Dynamo sidecars. ## Runtime Examples diff --git a/examples/rl/slime/README.md b/examples/rl/slime/README.md new file mode 100644 index 000000000000..4de1ebb12cf8 --- /dev/null +++ b/examples/rl/slime/README.md @@ -0,0 +1,160 @@ + + +# Slime External Rollouts with Dynamo + +**Experimental.** This example runs Slime with two SGLang engines in a fixed +worker set. A DynamoGraphDeployment manages the engines. Each worker Pod runs +SGLang and the Dynamo sidecar in one runtime container. Slime connects through +stable Kubernetes Services. Slime uses the Dynamo frontend for incremental +streaming responses. + +This example uses the external-engine and streaming support from +[THUDM/slime#2272](https://github.com/THUDM/slime/pull/2272). Slime queries +`/server_info` on each engine. Slime registers the fixed addresses with its +SGLang router. Slime calls the native SGLang control and weight-update endpoints. +The included custom generator sends rollout requests to the Dynamo frontend. + +> [!IMPORTANT] +> Slime starts an SGLang router to track the external engines. The custom +> generator does not send rollout requests to that router. +> +> Keep each worker component at one replica. If you change the worker set, +> restart Slime. + +## Prerequisites + +- Install the Dynamo Kubernetes Platform on a GPU-capable Kubernetes cluster. +- Install the NVIDIA device plugin for the `nvidia.com/gpu` resource. +- Use a Dynamo SGLang runtime image that contains `dynamo.sglang.sidecar`. +- For a gated model, create an `hf-token-secret` secret that contains + `HF_TOKEN` in the deployment namespace. The public default model does not + require this secret. +- Use a Slime revision that contains + [THUDM/slime#2272](https://github.com/THUDM/slime/pull/2272). +- Run Slime in a location that can resolve and reach the worker Services. The + same Kubernetes namespace meets this requirement. +- Install `envsubst` on the machine that deploys the manifest. + +## Deploy the fixed worker set + +Set the Dynamo frontend image and the SGLang runtime image to the same Dynamo +version. Set `DYNAMO_RUNTIME_VERSION` to that version. + +The script uses `MODEL_PATH=Qwen/Qwen3-0.6B` by default. + +```bash +export KUBE_CONTEXT= +export NAMESPACE= +export DYNAMO_FRONTEND_IMAGE=nvcr.io/nvidia/ai-dynamo/dynamo-frontend: +export SGLANG_RUNTIME_IMAGE=nvcr.io/nvidia/ai-dynamo/sglang-runtime: +export DYNAMO_RUNTIME_VERSION= +export MODEL_PATH=Qwen/Qwen3-0.6B +examples/rl/slime/deploy-dynamo.sh +``` + +If you use an unreleased version, pin nightly tags from the same date. + +SGLang loads `dynamo.sglang.sidecar` through its `--sidecar` option. It passes +the local gRPC endpoint to the module through `--sidecar-args`. This path does +not require a separate Dynamo sidecar image. + +Each worker Pod requests one `nvidia.com/gpu` resource. The worker Pods also +tolerate the standard `nvidia.com/gpu=true:NoSchedule` GPU-node taint. + +Add only the node selectors and tolerations that your cluster administrator +assigns to your workload. + +The manifest creates three Services: + +- `slime-sglang-rollout:8000` exposes the Dynamo frontend for rollout requests. +- `slime-sglang-engine-0:30000` exposes the first native SGLang control API. +- `slime-sglang-engine-1:30000` exposes the second native SGLang control API. + +The `engine-*` names do not conflict with the operator-owned worker Services. +The operator uses those worker Services for Dynamo discovery on port 9090. + +Each engine Service selects one worker component with one replica. The Service +name stays stable after Kubernetes replaces its Pod. Slime does not recover an +external engine automatically. + +If Kubernetes restarts or replaces an engine Pod, restart the Slime job. + +The native engine Services expose administrative APIs and weight-update APIs. + +Restrict access to these Services to the training network. + +## Engine Readiness + +Run these commands from the Slime environment or another Pod in the deployment +namespace: + +```bash +curl --fail-with-body http://slime-sglang-engine-0:30000/health_generate +curl --fail-with-body http://slime-sglang-engine-1:30000/health_generate +curl --fail-with-body http://slime-sglang-rollout:8000/health +``` + +The first two commands make sure that both fixed engines are reachable. The +third command makes sure that the Dynamo frontend is ready. + +## Start Slime + +`launch-slime.sh` supplies the fixed external-engine list. It uses the streaming +generator from THUDM/slime#2272. + +Add the model, dataset, trainer, weight-update, and resource arguments that your +workload requires. + +```bash +export SLIME_HOME= +export DYNAMO_ENGINE_ADDRS="slime-sglang-engine-0:30000 slime-sglang-engine-1:30000" +export DYNAMO_ROLLOUT_URL="http://slime-sglang-rollout:8000" +examples/rl/slime/launch-slime.sh \ + --hf-checkpoint Qwen/Qwen3-0.6B \ + --prompt-data \ + --input-key prompt \ + --rm-type random \ + --num-rollout 1 \ + --rollout-batch-size 2 \ + --n-samples-per-prompt 2 \ + --rollout-max-response-len 128 \ + --actor-num-nodes 1 \ + --actor-num-gpus-per-node 1 +``` + +The launcher passes these integration arguments: + +```text +--rollout-external-engine-addrs +--rollout-function-path slime.rollout.sglang_rollout.generate_rollout +--custom-generate-function-path dynamo_generate.generate_streaming +--sglang-incremental-streaming-output +``` + +The `dynamo_generate.generate_streaming` adapter copies the Slime arguments. +Then the adapter sets the generation address to `DYNAMO_ROLLOUT_URL`. The +adapter calls the streaming generator from THUDM/slime#2272. Slime calls each +fixed engine for control operations and weight updates. + +The `--sglang-incremental-streaming-output` flag must match the +`--incremental-streaming-output` configuration in `dynamo.yaml`. + +Read the Slime +[external rollout engine guide](https://github.com/THUDM/slime/blob/main/docs/en/advanced/external-rollout-engines.md) +for NCCL updates, full-checkpoint disk updates, and delta disk updates. + +## Current Boundary + +This example uses a fixed worker set. It does not support elastic discovery, +dynamic endpoint registration, or external-engine fault recovery. + +Before you use the example for training, complete these tests: + +1. Run one rollout with the selected model and weight transport. +2. Apply one policy update. +3. Run one post-update rollout. +4. Simulate one worker failure. +5. Make sure that the system recovers. diff --git a/examples/rl/slime/deploy-dynamo.sh b/examples/rl/slime/deploy-dynamo.sh new file mode 100755 index 000000000000..9cd391974244 --- /dev/null +++ b/examples/rl/slime/deploy-dynamo.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Deploy the fixed Dynamo SGLang worker set used by the Slime example. + +set -euo pipefail + +: "${KUBE_CONTEXT:?Set KUBE_CONTEXT to the target Kubernetes context}" +: "${NAMESPACE:?Set NAMESPACE to the target Kubernetes namespace}" +: "${DYNAMO_FRONTEND_IMAGE:?Set DYNAMO_FRONTEND_IMAGE to a Dynamo frontend image}" +: "${SGLANG_RUNTIME_IMAGE:?Set SGLANG_RUNTIME_IMAGE to a Dynamo SGLang runtime image}" +: "${DYNAMO_RUNTIME_VERSION:?Set DYNAMO_RUNTIME_VERSION to the matching Dynamo version}" +: "${MODEL_PATH:=Qwen/Qwen3-0.6B}" + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +export DYNAMO_FRONTEND_IMAGE SGLANG_RUNTIME_IMAGE DYNAMO_RUNTIME_VERSION MODEL_PATH +SUBSTITUTIONS='${DYNAMO_FRONTEND_IMAGE} ${SGLANG_RUNTIME_IMAGE} ${DYNAMO_RUNTIME_VERSION} ${MODEL_PATH}' + +envsubst "${SUBSTITUTIONS}" <"${SCRIPT_DIR}/dynamo.yaml" | + kubectl --context="${KUBE_CONTEXT}" --namespace="${NAMESPACE}" apply -f - diff --git a/examples/rl/slime/dynamo.yaml b/examples/rl/slime/dynamo.yaml new file mode 100644 index 000000000000..cbe2e2fd2789 --- /dev/null +++ b/examples/rl/slime/dynamo.yaml @@ -0,0 +1,197 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Each engine Service must select exactly one engine. Slime uses this fixed +# worker set for control requests. +# +# Keep each worker component at one replica. +apiVersion: v1 +kind: Service +metadata: + name: slime-sglang-rollout +spec: + ports: + - name: http + port: 8000 + targetPort: 8000 + selector: + dynamo.nvidia.com/slime-role: frontend +--- +apiVersion: v1 +kind: Service +metadata: + name: slime-sglang-engine-0 +spec: + ports: + - name: sglang-http + port: 30000 + targetPort: 30000 + selector: + dynamo.nvidia.com/slime-role: worker-0 +--- +apiVersion: v1 +kind: Service +metadata: + name: slime-sglang-engine-1 +spec: + ports: + - name: sglang-http + port: 30000 + targetPort: 30000 + selector: + dynamo.nvidia.com/slime-role: worker-1 +--- +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: slime-sglang +spec: + backendFramework: sglang + components: + - name: frontend + type: frontend + replicas: 1 + runtimeVersionOverride: ${DYNAMO_RUNTIME_VERSION} + podTemplate: + metadata: + labels: + dynamo.nvidia.com/slime-role: frontend + spec: + containers: + - name: main + image: ${DYNAMO_FRONTEND_IMAGE} + env: + - name: DYN_SGLANG_ENABLE_GENERATE + value: "1" + - name: worker-0 + type: worker + replicas: 1 + runtimeVersionOverride: ${DYNAMO_RUNTIME_VERSION} + podTemplate: + metadata: + labels: + dynamo.nvidia.com/slime-role: worker-0 + spec: + tolerations: + - key: nvidia.com/gpu + operator: Equal + value: "true" + effect: NoSchedule + containers: + - name: main + image: ${SGLANG_RUNTIME_IMAGE} + startupProbe: + httpGet: + path: /health_generate + port: 30000 + periodSeconds: 5 + timeoutSeconds: 5 + failureThreshold: 60 + readinessProbe: + httpGet: + path: /health_generate + port: 30000 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + envFrom: + - secretRef: + name: hf-token-secret + optional: true + resources: + requests: + nvidia.com/gpu: "1" + limits: + nvidia.com/gpu: "1" + command: + - python3 + - -m + - sglang.launch_server + args: + - --model-path + - ${MODEL_PATH} + - --served-model-name + - ${MODEL_PATH} + - --host + - 0.0.0.0 + - --port + - "30000" + - --grpc-port + - "30001" + - --incremental-streaming-output + - --sidecar + - dynamo.sglang.sidecar + - --sidecar-args + - '["--grpc-endpoint","http://127.0.0.1:30001"]' + - name: worker-1 + type: worker + replicas: 1 + runtimeVersionOverride: ${DYNAMO_RUNTIME_VERSION} + podTemplate: + metadata: + labels: + dynamo.nvidia.com/slime-role: worker-1 + spec: + tolerations: + - key: nvidia.com/gpu + operator: Equal + value: "true" + effect: NoSchedule + containers: + - name: main + image: ${SGLANG_RUNTIME_IMAGE} + startupProbe: + httpGet: + path: /health_generate + port: 30000 + periodSeconds: 5 + timeoutSeconds: 5 + failureThreshold: 60 + readinessProbe: + httpGet: + path: /health_generate + port: 30000 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + envFrom: + - secretRef: + name: hf-token-secret + optional: true + resources: + requests: + nvidia.com/gpu: "1" + limits: + nvidia.com/gpu: "1" + command: + - python3 + - -m + - sglang.launch_server + args: + - --model-path + - ${MODEL_PATH} + - --served-model-name + - ${MODEL_PATH} + - --host + - 0.0.0.0 + - --port + - "30000" + - --grpc-port + - "30001" + - --incremental-streaming-output + - --sidecar + - dynamo.sglang.sidecar + - --sidecar-args + - '["--grpc-endpoint","http://127.0.0.1:30001"]' diff --git a/examples/rl/slime/dynamo_generate.py b/examples/rl/slime/dynamo_generate.py new file mode 100644 index 000000000000..393c035f41d0 --- /dev/null +++ b/examples/rl/slime/dynamo_generate.py @@ -0,0 +1,62 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Routes Slime streaming rollout requests through the Dynamo frontend.""" + +import copy +import os +from argparse import Namespace +from urllib.parse import urlsplit + + +def _frontend_args(args: Namespace) -> Namespace: + rollout_url = os.environ.get("DYNAMO_ROLLOUT_URL") + if not rollout_url: + raise ValueError("Set DYNAMO_ROLLOUT_URL to the Dynamo frontend base URL.") + + parsed = urlsplit(rollout_url) + if parsed.scheme != "http" or parsed.hostname is None: + raise ValueError("DYNAMO_ROLLOUT_URL must use http:// and include a host.") + if parsed.path not in ("", "/") or parsed.query or parsed.fragment: + raise ValueError( + "DYNAMO_ROLLOUT_URL must not include a path, query, or fragment." + ) + + try: + port = parsed.port + except ValueError as error: + raise ValueError("DYNAMO_ROLLOUT_URL contains an invalid port.") from error + if port is None: + raise ValueError("DYNAMO_ROLLOUT_URL must include a port.") + + host = parsed.hostname + if ":" in host: + host = f"[{host}]" + + frontend_args = copy.copy(args) + frontend_args.sglang_router_ip = host + frontend_args.sglang_router_port = port + return frontend_args + + +async def generate_streaming(args: Namespace, sample, sampling_params): + from slime.rollout.sglang_streaming_rollout import ( + generate_streaming as slime_generate_streaming, + ) + + return await slime_generate_streaming(_frontend_args(args), sample, sampling_params) + + +generate_streaming.abort_mode = "request" diff --git a/examples/rl/slime/launch-slime.sh b/examples/rl/slime/launch-slime.sh new file mode 100755 index 000000000000..5d65b8fbed60 --- /dev/null +++ b/examples/rl/slime/launch-slime.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Start Slime against a fixed set of SGLang engines managed by Dynamo. + +set -euo pipefail + +: "${SLIME_HOME:?Set SLIME_HOME to the Slime checkout or installed source tree}" +: "${DYNAMO_ENGINE_ADDRS:=slime-sglang-engine-0:30000 slime-sglang-engine-1:30000}" +: "${DYNAMO_ROLLOUT_URL:=http://slime-sglang-rollout:8000}" + +EXAMPLE_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +export DYNAMO_ROLLOUT_URL +export PYTHONPATH="${EXAMPLE_DIR}${PYTHONPATH:+:${PYTHONPATH}}" + +read -r -a ENGINE_ADDRS <<<"${DYNAMO_ENGINE_ADDRS}" + +exec python3 "${SLIME_HOME}/train.py" \ + --rollout-external-engine-addrs "${ENGINE_ADDRS[@]}" \ + --rollout-function-path slime.rollout.sglang_rollout.generate_rollout \ + --custom-generate-function-path \ + dynamo_generate.generate_streaming \ + --sglang-incremental-streaming-output \ + "$@" From 477d31d301112efa0a2283a517a78304bc9b0c93 Mon Sep 17 00:00:00 2001 From: Vinya Kestur Tumakuru Arun Kumar Date: Tue, 15 Sep 2026 14:28:09 -0700 Subject: [PATCH 012/191] feat(triton): drop FP16/BF16 input guard now that the tensor protocol supports them (#14835) Signed-off-by: Vinya567 --- components/src/dynamo/triton/handlers.py | 17 +------ .../triton/tests/test_triton_handlers.py | 51 ++++++++++++------- .../dynamo/triton/tests/test_triton_util.py | 20 ++++++++ components/src/dynamo/triton/util.py | 1 + .../backends/triton/overview.md | 1 - 5 files changed, 54 insertions(+), 36 deletions(-) diff --git a/components/src/dynamo/triton/handlers.py b/components/src/dynamo/triton/handlers.py index 2f1605bf76bf..abf5b77a67fe 100644 --- a/components/src/dynamo/triton/handlers.py +++ b/components/src/dynamo/triton/handlers.py @@ -20,10 +20,6 @@ logger = logging.getLogger(__name__) -# Dynamo's tensor protocol currently lacks Float16 / BFloat16 variants. -# Remove this guard once upstream support lands. -_UNSUPPORTED_INPUT_DTYPES = frozenset({"Float16", "BFloat16"}) - class RequestHandler: def __init__(self, server: TritonServer, model: TritonModel): @@ -99,23 +95,12 @@ async def generate(self, request: dict) -> AsyncGenerator[dict, None]: yield response def _validate_request(self, request: dict) -> None: - """Reject non-tensor requests and unsupported input dtypes early.""" + """Reject non-tensor requests early.""" if "tensors" not in request: raise ValueError( "dynamo.triton only accepts tensor requests; missing 'tensors' " f"key. Received keys: {sorted(request.keys())}" ) - bad_dtypes = sorted( - { - tensor["metadata"]["data_type"] - for tensor in request["tensors"] - if tensor["metadata"]["data_type"] in _UNSUPPORTED_INPUT_DTYPES - } - ) - if bad_dtypes: - raise ValueError( - f"dynamo does not support {' / '.join(bad_dtypes)} input tensors." - ) def _probe(self) -> dict: """Report readiness without invoking Triton inference. diff --git a/components/src/dynamo/triton/tests/test_triton_handlers.py b/components/src/dynamo/triton/tests/test_triton_handlers.py index db2cb5ef10ce..15f30e6749c2 100644 --- a/components/src/dynamo/triton/tests/test_triton_handlers.py +++ b/components/src/dynamo/triton/tests/test_triton_handlers.py @@ -10,6 +10,7 @@ from typing import Any from unittest.mock import MagicMock +import ml_dtypes import numpy as np import pytest @@ -49,7 +50,7 @@ async def _stream() -> AsyncIterator[Any]: def build_dynamo_request( - *tensor_specs: tuple[str, str, list[int], list[Any]] + *tensor_specs: tuple[str, str, list[int], list[Any]], ) -> dict[str, Any]: """Build a Dynamo request envelope from (name, data_type, shape, values) tensor specs.""" return { @@ -319,26 +320,38 @@ def test_generate_rejects_request_missing_tensors_key(): _run_generate(handler, {"prompt": "hello"}) -@pytest.mark.parametrize("bad_dtype", ["Float16", "BFloat16"]) -def test_generate_rejects_unsupported_input_dtype(bad_dtype): - """Half-precision input tensors are rejected upfront.""" - handler = _make_handler() - request = build_dynamo_request(("IN", bad_dtype, [1], [0.0])) - - with pytest.raises(ValueError, match=f"does not support {bad_dtype}"): - _run_generate(handler, request) - - -def test_generate_error_message_lists_all_unsupported_dtypes(): - """When multiple unsupported dtypes are present they're all named in the error.""" - handler = _make_handler() - request = build_dynamo_request( - ("IN0", "Float16", [1], [0.0]), - ("IN1", "BFloat16", [1], [0.0]), +@pytest.mark.parametrize( + "dynamo_dtype, expected_np_dtype", + [ + ("Float16", np.float16), + # BF16 is not a native NumPy dtype; ml_dtypes.bfloat16 is what + # tritonclient.utils.triton_to_np_dtype("BF16") returns, so it is what + # dynamo_tensor_to_numpy produces from a BFloat16 Dynamo tensor. + ("BFloat16", ml_dtypes.bfloat16), + ], + ids=["fp16", "bf16"], +) +def test_generate_accepts_half_precision_input(dynamo_dtype, expected_np_dtype): + """FP16 and BF16 input tensors are no longer rejected up front; they flow + through as the corresponding half-precision NumPy arrays into tritonserver. + + Regression guard for the input path, which became reachable once the tensor + protocol grew Float16 / BFloat16 variants.""" + values = [1.5, -2.25, 0.5] + # Use an int32 output so the response path (np.from_dlpack) stays out of + # scope of this test — the guard removal is on the input side only. + model, _ = run_handler_generate( + [{"name": "OUT", "datatype": "INT32"}], + [build_triton_response("req-id", "identity", {"OUT": np.array([0], np.int32)})], + build_dynamo_request(("IN", dynamo_dtype, [3], values)), ) - with pytest.raises(ValueError, match="BFloat16 / Float16"): - _run_generate(handler, request) + assert model.last_request is not None + triton_input = model.last_request.inputs["IN"] + assert triton_input.dtype == expected_np_dtype + np.testing.assert_array_equal( + triton_input, np.array(values, dtype=expected_np_dtype) + ) # --- Dtype cache --- diff --git a/components/src/dynamo/triton/tests/test_triton_util.py b/components/src/dynamo/triton/tests/test_triton_util.py index 59372e5a7614..2a009693dbfe 100644 --- a/components/src/dynamo/triton/tests/test_triton_util.py +++ b/components/src/dynamo/triton/tests/test_triton_util.py @@ -6,6 +6,7 @@ import re +import ml_dtypes import numpy as np import pytest @@ -102,6 +103,7 @@ def test_triton_to_dynamo_dtype_covers_supported_types(): "INT32", "INT64", "FP16", + "BF16", "FP32", "FP64", "BYTES", @@ -140,6 +142,24 @@ def test_dynamo_tensor_to_numpy_float32_preserves_shape(): np.testing.assert_array_equal(arr, np.array([[1.0, 2.0], [3.0, 4.0]], np.float32)) +def test_dynamo_tensor_to_numpy_float16(): + """Float16 goes to a native NumPy float16 array (DLPack-compatible on + the response side).""" + arr = dynamo_tensor_to_numpy(_tensor("IN", "Float16", [3], [1.5, -2.25, 0.5])) + assert arr.dtype == np.float16 + np.testing.assert_array_equal(arr, np.array([1.5, -2.25, 0.5], np.float16)) + + +def test_dynamo_tensor_to_numpy_bfloat16(): + """BFloat16 goes to an ml_dtypes.bfloat16 array. NumPy has no native + bfloat16, but tritonclient.utils.triton_to_np_dtype('BF16') returns + ml_dtypes.bfloat16, which is what tritonserver's Python bindings expect + for a BF16 input tensor.""" + arr = dynamo_tensor_to_numpy(_tensor("IN", "BFloat16", [3], [1.5, -2.25, 0.5])) + assert arr.dtype == ml_dtypes.bfloat16 + np.testing.assert_array_equal(arr, np.array([1.5, -2.25, 0.5], ml_dtypes.bfloat16)) + + def test_dynamo_tensor_to_numpy_bytes_yields_object_array(): """Bytes values arrive as lists of ints (per-string byte lists) and become an object-dtype array Triton accepts.""" diff --git a/components/src/dynamo/triton/util.py b/components/src/dynamo/triton/util.py index 0b4cf9dfbf21..335723bf140a 100644 --- a/components/src/dynamo/triton/util.py +++ b/components/src/dynamo/triton/util.py @@ -24,6 +24,7 @@ "INT32": "Int32", "INT64": "Int64", "FP16": "Float16", + "BF16": "BFloat16", "FP32": "Float32", "FP64": "Float64", "BYTES": "Bytes", diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/triton/overview.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/triton/overview.md index d11cca3fa220..8da130c7281c 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/triton/overview.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/triton/overview.md @@ -30,7 +30,6 @@ The Triton and KServe features below are not yet supported end-to-end through th | Limitation | Effect | | :------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| FP16 / BFloat16 tensors | Requests with half-precision input/output tensors are rejected (`unknown variant 'Float16'` / `Invalid data type`). The Dynamo tensor `DataType` enum has no `Float16`/`BFloat16` variant. | | Classification (`class_count` / top-K) | The KServe requested-output `classification` parameter is dropped, so models return raw output logits instead of the top-K `"::
Runtime +
+
+

K-EXAONE 2.0

LG AI Research

+
+

750B-A37B MoE in NVFP4 on B200, aggregated or disaggregated 1P1D, with MTP speculative decoding and KV-aware routing on an 8K/1K chat trace.

+
vLLM4x/8x B200Chat trace replay
+ Open recipe +
diff --git a/recipes/README.md b/recipes/README.md index 851671ee7dd8..f41753f0e640 100644 --- a/recipes/README.md +++ b/recipes/README.md @@ -65,6 +65,8 @@ These recipes demonstrate aggregated or disaggregated serving: | **[Nemotron-3-Super](nemotron-3-super/vllm/)** | vLLM | Aggregated | 4x B200 / 4x H200 | ✅ | ✅ | ~120B hybrid Mamba/Attention/MoE (~12B active), NVFP4 (B200) / FP8 (H200) + FP8 KV, TP4+EP, MTP, KV-aware routing; chat + agentic profiles | ❌ | | **[Nemotron-3-Ultra](nemotron-3-ultra/vllm/)** | vLLM | Agg + Disagg | B200 / GB200 / H200 | ✅ | ✅ | Optimized agentic profiles for native 256K and opt-in 1M context; NVFP4 + FP8, MTP, and KV-aware routing | | **[Qwen3.8-Flash-Next](qwen3.8-flash-next/)** | vLLM | Agg + Disagg | 4x B200 / 8x B200 / 12x B200 | ✅ | ✅ | Multimodal (text+image+video) ultra-sparse MoE (125B / 6B active) with GDN+QSA hybrid attention, 51B N-gram embedding offload to host RAM, Inferact NVFP4 weights, TP4+EP, MTP3 spec decode, KV-aware routing, reasoning + tool calling (`qwen3_coder`); agentic profile | ❌ | +| **[K-EXAONE 2.0 750B-A37B-NVFP4](k-exaone-2.0/vllm/agg-b200-chat/)** | vLLM | Aggregated | 4x B200 | ✅ | ✅ | 764.5B MoE (37B active), hybrid attention (20 full + 58 sliding), NVFP4 W4A4 + FP8 KV, TP4, MTP spec decode, FLASHINFER_CUTLASS MoE backend required for correctness | ❌ | +| **[K-EXAONE 2.0 750B-A37B-NVFP4](k-exaone-2.0/vllm/disagg-b200-chat/)** | vLLM | Disaggregated | 8x B200 | ✅ | ✅ | Same model, 1P1D over NIXL/UCX on InfiniBand RDMA, MTP on both roles, decode `--max-num-seqs` 256 | ❌ | **Legend:** - **Deployment**: ✅ = Complete `deploy.yaml` manifest available diff --git a/recipes/k-exaone-2.0/README.md b/recipes/k-exaone-2.0/README.md new file mode 100644 index 000000000000..ee96966ff0b1 --- /dev/null +++ b/recipes/k-exaone-2.0/README.md @@ -0,0 +1,291 @@ + + +# K-EXAONE 2.0 Recipes + +Serving recipes for LG AI Research's **K-EXAONE 2.0 750B-A37B** in NVFP4, on NVIDIA B200 +with vLLM via Dynamo. + +764.5 B total parameters, ~37 B active per token. 78 layers with **hybrid attention** — +20 `full_attention` and 58 `sliding_attention`. 256 experts, top-8 routing. Native context +262,144 tokens. The NVFP4 (W4A4) checkpoint is ~530 GB on disk. + +## Configurations + +Dynamo + vLLM deployment profiles for the B200 chat workload: + +| | B200 aggregated chat | B200 disaggregated chat | +| ------------------------ | -------------------------------------------- | ------------------------------------------------------------ | +| **Recipe** | [`vllm/agg-b200-chat`](vllm/agg-b200-chat/deploy-generic.yaml) | [`vllm/disagg-b200-chat`](vllm/disagg-b200-chat/deploy-generic.yaml) | +| **GPU** | 4x B200 | 4x B200 prefill + 4x B200 decode | +| **Mode** | Aggregated | Prefill/decode disaggregated, 1P1D | +| **Framework** | vLLM 0.28.0 | vLLM 0.28.0 | +| **Precision** | NVFP4 (W4A4) + FP8 KV | NVFP4 (W4A4) + FP8 KV | +| **Parallelism** | TP4 | TP4 prefill / TP4 decode | +| **MoE backend** | FLASHINFER_CUTLASS (mandatory) | FLASHINFER_CUTLASS (mandatory) | +| **Expert parallel** | Off (measured within noise at TP4) | Off | +| **Speculative decoding** | MTP, `exaone_moe_mtp` DL=2 | MTP, `exaone_moe_mtp` DL=2 — **both roles** | +| **Block size** | 64 | 64 | +| **Max num seqs** | 32 | 32 prefill / **256 decode** | +| **Max batched tokens** | 8,192 | 8,192 | +| **GPU memory util** | 0.93 | 0.93 | +| **Weight loading** | safetensors (engine default) | safetensors (engine default) | +| **Context length** | 262,144 (model native) | 262,144 (model native) | +| **Prefix caching** | On (vLLM default) | On (vLLM default) | +| **Routing** | KV-aware | KV-aware | +| **KV transfer** | N/A | NIXL/UCX over InfiniBand RDMA (`rc_x`/`rc`) | +| **KV cache offloading** | None | None | + +Spec-dec and block size **must match across prefill and decode** — a mismatch changes KV block +geometry and produces silent garbage output rather than an error. `--max-num-seqs` is the +deliberate exception. + +## Supported features + +| Feature | Supported | Notes | +|---|---|---| +| NVFP4 (W4A4) weights | ✅ | FLASHINFER_CUTLASS MoE backend is **mandatory** — see Configuration notes | +| FP8 KV cache | ✅ | the checkpoint declares `kv_cache_quant_algo: FP8`; it is the default path | +| Speculative decoding (MTP) | ✅ | `--spec-method exaone_moe_mtp --spec-tokens 2` | +| Prefix caching | ✅ | on by default | +| Reasoning parser | ✅ | `--dyn-reasoning-parser qwen3` | +| Tool calling | ✅ | `--dyn-tool-call-parser qwen3_coder` | +| Disaggregated serving | ✅ | NIXL over UCX; requires an RDMA device plugin — see Limitations | +| KV-aware routing | ✅ | wired end to end (`--router-kv-events` + worker `--kv-events-config`); inert at the shipped `replicas: 1`, correct when you scale out. See Limitations. | +| 262,144-token context | ✅ | the checkpoint's native window; served in full, no rope scaling | +| Expert parallel | ➖ | measured within noise on TP=4; not enabled | + +## Prerequisites + +- Kubernetes with the Dynamo operator installed +- **8× NVIDIA B200** (4 for the aggregated recipe) +- A `ReadWriteMany` storage class with ≥700 GB free +- For the disaggregated recipe: an **RDMA device plugin** exposing InfiniBand HCAs as a + Kubernetes extended resource + +## Quick Start + +### 1. Create the namespace and HF token secret + +```bash +export NAMESPACE=your-namespace +kubectl create namespace ${NAMESPACE} +kubectl create secret generic hf-token-secret \ + --from-literal=HF_TOKEN=${HF_TOKEN} -n ${NAMESPACE} +``` + +### 2. Create storage + +Edit `storageClassName` in [`model-cache/model-cache.yaml`](model-cache/model-cache.yaml) to +match your cluster, then: + +```bash +kubectl apply -f model-cache/model-cache.yaml -n ${NAMESPACE} +``` + +### 3. Download the model + +```bash +kubectl apply -f model-cache/model-download.yaml -n ${NAMESPACE} +kubectl wait --for=condition=complete job/model-download -n ${NAMESPACE} --timeout=6h +``` + +~530 GB. The Job requests 64 GB of RAM for XET download buffers; set +`HF_XET_HIGH_PERFORMANCE=0` on low-memory nodes. + +### 4. Deploy + +```bash +# 4-GPU aggregated +kubectl apply -f vllm/agg-b200-chat/deploy-generic.yaml -n ${NAMESPACE} + +# 8-GPU disaggregated (1P1D) -- edit the rdma/ resource name first, see Limitations +kubectl apply -f vllm/disagg-b200-chat/deploy-generic.yaml -n ${NAMESPACE} +``` + +First start takes **40–120 minutes**: 53 shards load, then autotune, then CUDA-graph capture. +Silence is not a hang — watch the worker log for shard progress. + +`deploy-generic.yaml` is a **generated** file: it is the render of +`kustomize/base` through the variant matrix in `.kustomize-matrix.yaml`. Apply it directly, or +edit a copy. Contributors edit `kustomize/base/deploy.yaml` and regenerate from the repo root: + +```bash +scripts/kustomize-matrix.py unfold recipes/k-exaone-2.0/vllm//.kustomize-matrix.yaml +scripts/kustomize-matrix.py render recipes/k-exaone-2.0/vllm//.kustomize-matrix.yaml +``` + +To bind either variant to a specific cluster — a different model-cache claim, node labels and +taints, a scheduler name, or the physical RDMA resource below — copy the cluster scaffold in +[`recipes/templates/kustomize`](../templates/kustomize) rather than editing the recipe. That +layer is where non-portable values belong, and it keeps this base applicable elsewhere. + +```bash +# aggregated +kubectl wait --for=condition=Ready dgd/k-exaone-2-agg -n ${NAMESPACE} --timeout=7200s +kubectl logs -f -l nvidia.com/dynamo-component=Worker -n ${NAMESPACE} + +# disaggregated +kubectl wait --for=condition=Ready dgd/k-exaone-2-disagg -n ${NAMESPACE} --timeout=7200s +kubectl logs -f -l nvidia.com/dynamo-component=DecodeWorker -n ${NAMESPACE} +``` + +### 5. Smoke test + +```bash +# k-exaone-2-disagg-frontend for the disaggregated deployment +kubectl port-forward svc/k-exaone-2-agg-frontend 8000:8000 -n ${NAMESPACE} + +curl -s localhost:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{ + "model": "LGAI-EXAONE/K-EXAONE-2.0-750B-A37B-NVFP4", + "messages": [{"role":"user","content":"In 2-3 sentences, explain why the daytime sky is blue."}], + "max_tokens": 2048, "temperature": 0.6, "top_p": 0.95 +}' | jq -r '.choices[0].message.content // .choices[0].message.reasoning_content' +``` + +> [!NOTE] +> This is a reasoning model. Use **temperature 0.6, not greedy** — `temperature=0` drives it into +> rumination. Give it a real token budget: reasoning consumes the budget before the final answer, +> so a 256-token smoke test prints `null` on a perfectly healthy deployment. Read +> `.content // .reasoning_content`. + +### 6. Benchmark + +```bash +kubectl apply -f perf/perf.yaml -n ${NAMESPACE} +``` + +See [`perf/README.md`](perf/README.md) for staging the trace, running a concurrency sweep, and +fetching artifacts. + +## Performance results + +8x B200, vLLM 0.28.0 / Dynamo 1.4.1. **Mooncake chat trace replay**, the 15% subset +(1,805 requests) shipped in [`perf/`](perf/) -- the same file the benchmark recipe runs. + +SLA gate is joint: **E2E >= 50 tok/s/user AND TTFT p50 < 5 s**, where +`E2E = OSL / (TTFT_p50 + OSL x ITL)`. Results are at the **highest concurrency meeting both +legs**, not peak throughput. + +| Configuration | Concurrency | tok/s/GPU | E2E tok/s/user | TTFT p50 | ITL | +|---|---|---|---|---|---| +| Aggregated (4 GPU) | 7 | **87** | 51.4 | 291 ms | 19.15 ms | +| Disaggregated (8 GPU) | 14 | **85** | 54.9 | 2,230 ms | 15.98 ms | + +Each row is that configuration's own operating point, which is why the concurrencies differ; +tok/s/GPU is what makes them comparable, not a matching concurrency. + +**The two topologies are level** -- 85 against 87 tok/s/GPU under the same gate. Disaggregation +is an SLA and scaling choice for this model, not a throughput win or loss: it buys per-token +latency (ITL 15.98 ms against 19.15) and lets prefill and decode scale independently, for twice +the GPUs. + +Concurrency is the latency/throughput knob within a target. Running the disaggregated recipe at +C=7 instead trades throughput for interactivity: 55 tok/s/GPU, but E2E 70.6 tok/s/user and +TTFT p50 1,018 ms. + +Aggregated on the **full** 12,031-request trace, for reference: **97 tok/s/GPU** at C=8, +E2E 51.1, TTFT 312 ms. + +Measured KV reuse is **8.8%** on the full trace. That is not a misconfiguration: the working set +is ~42x oversubscribed against TP=4's KV capacity, so blocks are evicted before they can be hit. +It is also why KV-aware routing shows no gain here (9.494% hit rate vs 9.458% round-robin) -- +the router cannot route to a block that is already gone. + +**38 of the trace's 1,805 requests are rejected, by design, in every run.** The trace is +multi-turn and its accumulated prompts reach 614,440 tokens, while this checkpoint declares +`max_position_embeddings` of 262,144, so those requests return HTTP 400 and are excluded from +the metrics. The count is a fixed property of the trace against this model, identical at every +concurrency, so the rows above remain comparable to each other -- but the throughput figures are +computed over the requests that a 262k-context model can actually serve. The C=14 run completed +1,733 of 1,805: 38 over-length, plus 34 that returned no content under load. + +> [!WARNING] +> Synthetic benchmarks with a shared system prompt report ~3x higher throughput for this model +> (68.2% achieved KV reuse vs the trace's 8.8%). Do not compare synthetic and trace numbers. + +## Configuration notes + +**`--kernel-config '{"moe_backend":"FLASHINFER_CUTLASS"}'` is mandatory.** vLLM's `auto` selects +`FLASHINFER_TRTLLM`, which on this checkpoint corrupted **32 of 40** long-form generations — +fluent, plausible, wrong, with no error and no crash. Pinning CUTLASS took that to 0/40. The +pinned kernel is slower, and that cost is included in the results above. + +**Use the `--dyn-*` parser flags.** Plain `--reasoning-parser` and `--tool-call-parser` configure +the engine only and never reach the Dynamo frontend, so tool calling silently does nothing. + +**TP=4 is the floor and the optimum.** ~530 GB of weights does not fit TP=2 on 180 GB B200s. TP=8 +has 5.7× the KV capacity (17.05 M vs 2.99 M tokens) and is still ~30% slower per GPU — this model +is communication-bound, not KV-capacity-bound. + +**`--block-size 64`.** Block size 16 is measurably worse. + +**Disaggregated: prefill and decode must agree** on spec-dec and block size. A mismatch changes KV +block geometry and produces silent garbage output, not an error. `--max-num-seqs` is the exception +and is deliberately different — 32 on prefill, 256 on decode. + +**Weight loading: do not add `--load-format fastsafetensors` without GPUDirect Storage.** It is +tempting on a 53-shard, ~530 GB checkpoint, but fastsafetensors' fast path is GDS, and where the +GDS pieces are missing it does not fall back cleanly — it stalls before opening a single shard. +Observed on a cluster whose `model-cache` PVC is NFS-backed, with no `/dev/nvidia-fs*` device and +no `libcufile.so` in the image: all four ranks spun at ~0.8 core for 13 minutes with zero file +descriptors open on the mount and only the CUDA context resident on the GPUs. Removing the flag — +the only variable changed — restored a normal start. Add it only where the nvidia-fs driver and +cuFile are both present and the filesystem supports GDS. + +**Evaluating this model.** Use temperature 0.6 / top_p 0.95, not greedy — `temperature=0` +drives this reasoning model into repetition. On `lm-eval`, GPQA needs `--system_instruction` to +repair an answer extractor that otherwise discards valid responses, and IFEval must **not** get +one: injecting "end your response with X" collides with IFEval's own instructions and corrupts +the measurement. Give a generous token budget — reasoning consumes it before the final answer, +so a short cap reads as a wrong answer rather than a truncated one. + +**`--enable-prompt-tokens-details` is a `vllm serve` flag** and is rejected by `dynamo.vllm`. Read +achieved KV reuse from the worker log instead: + +```bash +kubectl logs -n ${NAMESPACE} | grep -o 'Prefix cache hit rate: [0-9.]*%' +``` + +## Limitations + +- **The RDMA resource name is cluster-specific.** The disaggregated recipe requests + `rdma/shared_ib`; other clusters expose `rdma/ib` or `rdma/rdma_shared_device_a`. Edit it to + match your device plugin. Prefer a **shared** flavour: with an exclusive-mode resource, two + co-located workers each claiming HCAs can deadlock NCCL bootstrap in whichever initialises + second. A Kustomize `provider-networking` Component is the portable answer and is planned. +- **Verify the KV transport before trusting any disaggregated measurement.** `UCX_TLS` here + excludes `tcp` on purpose, but if the `rdma/` resource name does not match your cluster the + HCAs are never exposed to the pod and UCX has no fast transport to select. With `tcp` in the + list it will silently stage GPU memory through host RAM at roughly two orders of magnitude + lower bandwidth, and the only symptom is a large TTFT. Check: + ```bash + kubectl exec -n ${NAMESPACE} -- \ + curl -s localhost:9090/metrics | grep vllm:nixl_xfer_time_seconds + ``` + Divide `_sum` by `_count`: a ~1 GB KV transfer should take **milliseconds, not seconds**. To see + the transport UCX actually chose, redeploy with `UCX_PROTO_INFO=y` and look for `rc_mlx5` rather + than `tcp/eth0` in the worker log. +- **KV-aware routing does nothing until you scale out — but scaling out is now all it takes.** + The frontend ships `--router-mode kv --router-kv-events` and the worker (prefill, in the + disaggregated recipe) ships `--kv-events-config`, so the block index is published and consumed. + Both halves are still inert at `replicas: 1`, because one worker is one destination — the 8.8% + figure below is prefix caching, not routing. Raising `replicas` is sufficient; you do not need + to edit any flag. + Measured on a 2 x TP4 deployment on this workload, that is not worth doing for throughput: KV + routing reached a 9.494% prefix hit rate against round-robin's 9.458%, a 0.037 pp difference, + and aggregate throughput was identical (623 vs 623 tok/s, 847 vs 845). KV routing did show + 8-24% lower TTFT, but with equal hit rates that cannot be cache-driven, so it is not evidence + of prefix affinity -- and TTFT is not the binding SLA leg here (291 ms against a 5 s gate). + The working set is ~42x oversubscribed against TP4's KV capacity, so blocks are evicted before a + router could exploit them — a router cannot route to a block that is already gone. + +- **No cache-clearing endpoint.** `VLLM_SERVER_DEV_MODE` is a development flag and is not shipped, + so `POST /reset_prefix_cache` returns 404. To reproduce the benchmark numbers, restart the + deployment between measurement points rather than clearing the cache in place. + +## Model card + + diff --git a/recipes/k-exaone-2.0/model-cache/model-cache.yaml b/recipes/k-exaone-2.0/model-cache/model-cache.yaml new file mode 100644 index 000000000000..0e9e141f2c77 --- /dev/null +++ b/recipes/k-exaone-2.0/model-cache/model-cache.yaml @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: model-cache +spec: + accessModes: + - ReadWriteMany + resources: + requests: + # K-EXAONE-2.0-750B-A37B-NVFP4 is ~530 GB on disk (764.5 B params at 0.688 B/param). + # 700Gi leaves headroom for the HF blob/snapshot layout, which stores each shard once + # under blobs/ with a symlink from snapshots/. + storage: 700Gi + storageClassName: "your-storage-class-name" diff --git a/recipes/k-exaone-2.0/model-cache/model-download.yaml b/recipes/k-exaone-2.0/model-cache/model-download.yaml new file mode 100644 index 000000000000..b56d92b8f5ca --- /dev/null +++ b/recipes/k-exaone-2.0/model-cache/model-download.yaml @@ -0,0 +1,55 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +apiVersion: batch/v1 +kind: Job +metadata: + name: model-download +spec: + backoffLimit: 3 + completions: 1 + parallelism: 1 + template: + metadata: + labels: + app: model-download + spec: + restartPolicy: Never + containers: + - name: model-download + image: python:3.10-slim + securityContext: + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + command: ["sh", "-c"] + envFrom: + - secretRef: + name: hf-token-secret + env: + - name: MODEL_NAME + value: LGAI-EXAONE/K-EXAONE-2.0-750B-A37B-NVFP4 + - name: HF_HOME + value: /model-store + # Uses up to 64 GB RAM for XET buffers; set "0" on low-memory nodes (8 GB cap): https://huggingface.co/docs/hub/en/xet/using-xet-storage#download-buffers + - name: HF_XET_HIGH_PERFORMANCE + value: "1" + args: + - | + set -eux + pip install --no-cache-dir huggingface_hub==1.16.4 + hf download $MODEL_NAME + resources: + requests: + cpu: "2" + memory: "64Gi" + limits: + cpu: "8" + memory: "64Gi" + volumeMounts: + - name: model-cache + mountPath: /model-store + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache diff --git a/recipes/k-exaone-2.0/perf/README.md b/recipes/k-exaone-2.0/perf/README.md new file mode 100644 index 000000000000..ab55e5afb7e6 --- /dev/null +++ b/recipes/k-exaone-2.0/perf/README.md @@ -0,0 +1,164 @@ + + +# K-EXAONE 2.0 Benchmark Recipe + +A single [AIPerf](https://github.com/ai-dynamo/aiperf) trace-replay Job — +[`perf.yaml`](perf.yaml) — covers both K-EXAONE 2.0 DGDs. Set `ENDPOINT` and +`CONCURRENCY` for the target DGD. + +The Job waits for the target model on the DGD frontend, runs a short warmup, +replays the configured trace at one `CONCURRENCY` value, and writes raw +artifacts to the shared `model-cache` PVC. The benchmark pod is co-located with +a DGD frontend through `podAffinity`. + +## Targeting a variant + +Edit the `env` block in [`perf.yaml`](perf.yaml) and update the `podAffinity` `values` list to contain only the target DGD name, so the benchmark pod is co-located with the correct frontend: + +| Variant target | `ENDPOINT` | `TRACE_FILE` | +| --- | --- | --- | +| B200 aggregated (4 GPU) | `k-exaone-2-agg-frontend:8000` | `/model-cache/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl` | +| B200 disaggregated (8 GPU) | `k-exaone-2-disagg-frontend:8000` | `/model-cache/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl` | + +If you run more than one benchmark in the same namespace, also update +`metadata.name` and `labels.app` so Jobs and artifact directories stay +distinct. + +## Dataset + +The benchmark replays a +[Mooncake-format](https://github.com/kvcache-ai/Mooncake) trace through +`--custom-dataset-type mooncake_trace`. Each JSONL line describes one request +with `input_length`, `output_length`, and `hash_ids`. + +This recipe benchmarks the **8K-ISL / 1K-OSL chat trace**, designed for ~70% prefix +reuse. (The 64K / 400 / 90% shape is the *agentic* trace used by other recipes -- not +this one.) On this topology the achieved reuse is ~8.8%, because the working set is +~42x oversubscribed against TP4's KV capacity. The Git-LFS blob is shared with the +Kimi-K2.6 recipe rather than duplicated, and referenced via a symlink under +[`traces`](traces): + +```text +traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl + -> ../../../kimi-k2.6/perf/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl +``` + +The default 15% trace contains 1,805 requests. Its SHA-256 is +`b1221bca72b69f842897f339624306a84857f1b55ea0d866525f94d9ceb9b871`. + +> [!IMPORTANT] +> `CONCURRENCY` is **per variant**: `7` for `agg-b200-chat`, `14` for `disagg-b200-chat`. +> The shipped default is 7. Running the disaggregated target at 7 under-loads it and +> reproduces 55 tok/s/GPU rather than the published 85 -- set it to match the variant +> that `ENDPOINT` points at. + +## Workflow + +```bash +export NAMESPACE=your-namespace +``` + +### 1. Deploy the DGD + +See the deployment instructions in the [recipe README](../README.md). + +### 2. Stage the trace on the PVC + +Materialize the Git LFS trace files, then copy them through a helper pod that +mounts `model-cache`: + +```bash +git lfs pull --include='recipes/kimi-k2.6/perf/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl' + +kubectl run pvc-helper -n ${NAMESPACE} \ + --image=busybox:1.36 --restart=Never \ + --overrides='{"spec":{"containers":[{"name":"helper","image":"busybox:1.36","command":["sleep","3600"],"volumeMounts":[{"name":"model-cache","mountPath":"/model-cache"}]}],"volumes":[{"name":"model-cache","persistentVolumeClaim":{"claimName":"model-cache"}}]}}' \ + --command -- sleep 3600 + +TRACE_SOURCE="$(git rev-parse --show-toplevel)/recipes/kimi-k2.6/perf/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl" +kubectl exec -n "${NAMESPACE}" pvc-helper -- mkdir -p /model-cache/traces +kubectl cp "${TRACE_SOURCE}" \ + "${NAMESPACE}/pvc-helper:/model-cache/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl" +``` + +Keep `pvc-helper` for fetching artifacts, or delete it after staging. + +### 3. Run the benchmark + +```bash +kubectl apply -f perf.yaml -n ${NAMESPACE} +kubectl logs -n ${NAMESPACE} -l job-name=k-exaone-2-bench -f +kubectl wait --for=condition=Complete job/k-exaone-2-bench \ + -n ${NAMESPACE} --timeout=10800s +``` + +The Job runs `python:3.12-slim` and installs `aiperf==0.12.0` at start, together +with `transformers==5.15.1` -- 5.x is required, because this model's tokenizer_config +declares `tokenizer_class: TokenizersBackend`, which does not exist in the transformers +4.x line and makes aiperf fail before it issues a request. The exact version matches the +serving image, so the bench tokenizes the way the server does; aiperf uses the tokenizer +to synthesize the trace prompts, so a different one is a different workload. + +### 4. Fetch artifacts + +```bash +kubectl cp \ + ${NAMESPACE}/pvc-helper:/model-cache/perf/_k-exaone-2-bench \ + ./results +``` + +### 5. Cleanup + +```bash +kubectl delete job k-exaone-2-bench -n ${NAMESPACE} +kubectl delete pod pvc-helper -n ${NAMESPACE} +``` + +## Running a concurrency sweep + +`perf.yaml` runs one `CONCURRENCY` value. Restart the workers to clear engine KV +state and Dynamo frontend/router state between independent runs: + +```bash +kubectl delete job k-exaone-2-bench -n ${NAMESPACE} --ignore-not-found + +DGD=k-exaone-2-agg # or k-exaone-2-disagg +kubectl delete pods -n ${NAMESPACE} \ + -l nvidia.com/dynamo-graph-deployment-name=${DGD} +kubectl wait --for=condition=Ready pod -n ${NAMESPACE} \ + -l nvidia.com/dynamo-graph-deployment-name=${DGD} \ + --timeout=7200s + +# Update CONCURRENCY in perf.yaml before each run. +kubectl apply -f perf.yaml -n ${NAMESPACE} +kubectl wait --for=condition=Complete job/k-exaone-2-bench \ + -n ${NAMESPACE} --timeout=10800s +``` + +Do not compare partial runs. A completed run must account for successful, +errored, and unfinished requests before reporting aggregate throughput. + +## Tunable environment variables + +| Variable | Default | Notes | +| --- | --- | --- | +| `ENDPOINT` | `k-exaone-2-agg-frontend:8000` | Change per DGD variant | +| `TRACE_FILE` | `/model-cache/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl` | 1,805-request 15% chat trace | +| `CONCURRENCY` | `7` | per-variant operating point: **7 for `agg-b200-chat`, 14 for `disagg-b200-chat`**. Set it to match the variant `ENDPOINT` points at, or the result will not reproduce the published row. | +| `TARGET_MODEL` | `LGAI-EXAONE/K-EXAONE-2.0-750B-A37B-NVFP4` | Must match `--served-model-name` | + +## Artifacts + +Results are written to: + +```text +/model-cache/perf/_/ + warmup/ + K-EXAONE-2.0-750B-A37B-NVFP4_trace_c_/ + profile_export_aiperf.json + inputs.json + ... +``` diff --git a/recipes/k-exaone-2.0/perf/perf.yaml b/recipes/k-exaone-2.0/perf/perf.yaml new file mode 100644 index 000000000000..b28ff896d3c0 --- /dev/null +++ b/recipes/k-exaone-2.0/perf/perf.yaml @@ -0,0 +1,193 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# AIPerf trace-replay benchmark for K-EXAONE 2.0 DGDs. +# +# One Job covers both variants (aggregated and disaggregated, chat trace) — the +# benchmark itself is identical regardless of GPU SKU. To target a specific +# DGD, edit the env values below (and `metadata.name` / `labels.app` if you +# run multiple jobs in the same namespace). +# +# Runs a single concurrency value. To sweep concurrencies, restart the DGD +# workers between runs so KV cache and prefix-cache state are reset — see +# README.md "Running a concurrency sweep". +# +# Prerequisites: +# - Target DGD is Ready (see ../README.md) +# - model-cache PVC mounted in the namespace and contains TRACE_FILE +# +# Results: /model-cache/perf/_/ +apiVersion: batch/v1 +kind: Job +metadata: + name: k-exaone-2-bench +spec: + backoffLimit: 1 + activeDeadlineSeconds: 7200 # 2h hard cap on the Job + completions: 1 + parallelism: 1 + template: + metadata: + labels: + app: k-exaone-2-bench + spec: + # Co-locate the bench pod with the DGD frontend to minimise client/server + # network overhead. Update `values:` to the DGD you are benchmarking. + affinity: + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: nvidia.com/dynamo-component-type + operator: In + values: + - frontend + - key: nvidia.com/dynamo-graph-deployment-name + operator: In + values: + - k-exaone-2-agg + - k-exaone-2-disagg + topologyKey: kubernetes.io/hostname + # tolerations: # uncomment to populate any tolerations for the gpu nodes + containers: + - name: perf + image: python:3.12-slim + imagePullPolicy: IfNotPresent + workingDir: /workspace + command: + - /bin/bash + - -c + - | + set -euo pipefail + # Best-effort: raising the fd limit needs privileges the Job may not have, and + # under `set -e` a refusal would abort before the sweep ever starts. + ulimit -n 600000 || echo "note: could not raise fd limit; continuing" + apt-get update && apt-get install -y curl jq procps git build-essential && apt-get clean + # transformers 5.x is REQUIRED for this model, not a preference: K-EXAONE 2.0's + # tokenizer_config.json declares tokenizer_class "TokenizersBackend", which does + # not exist in the transformers 4.x line. With a 4.x pin aiperf raises + # TokenizerError before issuing a single request (nvbug 6778740). + # The version is pinned EXACTLY to the serving image's, read from the image itself + # rather than assumed: transformers 5.15.1 / tokenizers 0.22.2 on vLLM 0.28.0. This + # matters beyond reported token counts -- aiperf loads the tokenizer to synthesize + # the Mooncake prompts from input_length and hash_ids, so a different tokenizer + # generates a different workload. Verified that this pin resolves with aiperf + # 0.12.0 and yields tokenizers 0.22.2, matching the server. + pip install "aiperf==0.12.0" "protobuf==7.35.0" "transformers==5.15.1" "tiktoken==0.13.0" + sysctl -w net.ipv4.ip_local_port_range="1024 65000" 2>/dev/null || true + export COLUMNS=200 + EPOCH=$(date +%s) + wait_for_model_ready() { + local max_attempts=${WAIT_FOR_MODEL_MAX_ATTEMPTS:-720} # 720 * 5s = 1h default + local attempt=0 + echo "Waiting for model '$TARGET_MODEL' at $ENDPOINT/v1/models (max ${max_attempts} attempts) ..." + while ! curl -sf "http://$ENDPOINT/v1/models" | jq -e --arg m "$TARGET_MODEL" '.data[]? | select(.id == $m)' >/dev/null 2>&1; do + attempt=$((attempt + 1)) + if [ "$attempt" -ge "$max_attempts" ]; then + echo "ERROR: model '$TARGET_MODEL' did not become ready after ${max_attempts} attempts. Aborting." + exit 1 + fi + echo "[$(date '+%H:%M:%S')] not ready (attempt ${attempt}/${max_attempts}), sleeping 5s" + sleep 5 + done + curl -s "http://$ENDPOINT/v1/models" | jq . + } + if [ ! -f "${TRACE_FILE}" ]; then + echo "ERROR: trace file not found at ${TRACE_FILE}" + echo "Copy it onto the PVC via a helper pod, e.g.:" + echo " kubectl cp /:${TRACE_FILE}" + exit 1 + fi + wait_for_model_ready + ROOT_DIR="${ROOT_ARTIFACT_DIR}/${EPOCH}_${JOB_NAME}" + mkdir -p "$ROOT_DIR" + echo "==============================================" + echo "Trace Replay Benchmark (aiperf)" + echo "==============================================" + echo "Endpoint: http://${ENDPOINT}" + echo "Model: ${TARGET_MODEL}" + echo "Trace file: ${TRACE_FILE}" + echo "Concurrency: ${CONCURRENCY}" + echo "Artifact root:${ROOT_DIR}" + echo "==============================================" + # Warmup + WARMUP_DIR="${ROOT_DIR}/warmup" + mkdir -p "$WARMUP_DIR" + aiperf profile \ + -m "${TARGET_MODEL}" \ + --tokenizer "${TARGET_MODEL}" \ + --url "http://${ENDPOINT}" \ + --streaming \ + --ui simple \ + --isl 8000 \ + --osl 1000 \ + --concurrency 1 \ + --request-count 5 \ + --artifact-dir "${WARMUP_DIR}" + echo "Warmup complete" + MODEL_BASE="${TARGET_MODEL##*/}" + TS=$(date +'%Y%m%d_%H%M%S') + RUN_DIR="${ROOT_DIR}/${MODEL_BASE}_trace_c${CONCURRENCY}_${TS}" + mkdir -p "$RUN_DIR" + aiperf profile \ + -m "${TARGET_MODEL}" \ + --tokenizer "${TARGET_MODEL}" \ + --input-file "${TRACE_FILE}" \ + --custom-dataset-type mooncake_trace \ + --num-requests $(wc -l < "${TRACE_FILE}") \ + --prompt-input-tokens-block-size 512 \ + --url "http://${ENDPOINT}" \ + --streaming \ + --use-server-token-count \ + --extra-inputs ignore_eos:true \ + --concurrency "${CONCURRENCY}" \ + --random-seed 42 \ + --ui simple \ + --artifact-dir "${RUN_DIR}" \ + --request-timeout-seconds 1200 \ + --workers-max "${CONCURRENCY}" \ + --export-http-trace + echo "Concurrency ${CONCURRENCY} complete; artifacts in ${RUN_DIR}" + ls -la "${RUN_DIR}" || true + echo "" + echo "Done. Root: ${ROOT_DIR}" + env: + # --- Edit these to target the DGD + trace you want to benchmark --- + - name: ENDPOINT + value: k-exaone-2-agg-frontend:8000 + - name: TRACE_FILE + value: /model-cache/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl + # Operating point is per variant: 7 for agg-b200-chat, 14 for disagg-b200-chat. + # Set this to match the variant ENDPOINT points at. + - name: CONCURRENCY + value: "7" + # --- The remainder is shared across all variants --- + - name: TARGET_MODEL + value: LGAI-EXAONE/K-EXAONE-2.0-750B-A37B-NVFP4 + - name: AIPERF_HTTP_CONNECTION_LIMIT + value: "200" + - name: AIPERF_HTTP_SO_RCVTIMEO + value: "120" + - name: AIPERF_SERVICE_PROFILE_CONFIGURE_TIMEOUT + value: "3600" + - name: AIPERF_DATASET_CONFIGURATION_TIMEOUT + value: "3600" + - name: JOB_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['job-name'] + - name: ROOT_ARTIFACT_DIR + value: /model-cache/perf + - name: HF_HOME + value: /model-cache + - name: PYTHONUNBUFFERED + value: "1" + volumeMounts: + - name: model-cache + mountPath: /model-cache + restartPolicy: Never + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache diff --git a/recipes/k-exaone-2.0/perf/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl b/recipes/k-exaone-2.0/perf/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl new file mode 120000 index 000000000000..969fcaaeb8c0 --- /dev/null +++ b/recipes/k-exaone-2.0/perf/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl @@ -0,0 +1 @@ +../../../kimi-k2.6/perf/traces/8k_1k_70kv_chat_new_noschedule_short_15perc.jsonl \ No newline at end of file diff --git a/recipes/k-exaone-2.0/vllm/agg-b200-chat/.kustomize-matrix.yaml b/recipes/k-exaone-2.0/vllm/agg-b200-chat/.kustomize-matrix.yaml new file mode 100644 index 000000000000..140bca86f293 --- /dev/null +++ b/recipes/k-exaone-2.0/vllm/agg-b200-chat/.kustomize-matrix.yaml @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +source: kustomize/base +nameTemplate: "${variant}" +matrix: + variant: + - name: generic + components: [] diff --git a/recipes/k-exaone-2.0/vllm/agg-b200-chat/deploy-generic.yaml b/recipes/k-exaone-2.0/vllm/agg-b200-chat/deploy-generic.yaml new file mode 100644 index 000000000000..f55d684283f4 --- /dev/null +++ b/recipes/k-exaone-2.0/vllm/agg-b200-chat/deploy-generic.yaml @@ -0,0 +1,126 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Generated file. For repository contributors, do not edit this checked-in copy. +# Regenerate every public overlay and rendered manifest of this matrix (from the repository root): +# scripts/kustomize-matrix.py unfold recipes/k-exaone-2.0/vllm/agg-b200-chat/.kustomize-matrix.yaml +# scripts/kustomize-matrix.py render recipes/k-exaone-2.0/vllm/agg-b200-chat/.kustomize-matrix.yaml +# Inspect only this Kustomize overlay (from the repository root): +# kustomize build recipes/k-exaone-2.0/vllm/agg-b200-chat/kustomize/overlays/generic +# You may edit a copy before applying it. + +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: k-exaone-2-agg +spec: + backendFramework: vllm + components: + - minAvailable: 1 + name: Frontend + podTemplate: + spec: + containers: + - args: + - exec python3 -m dynamo.frontend --router-mode kv --router-kv-events --kv-cache-block-size + 64 --http-host 0.0.0.0 --http-port 8000 + command: + - /bin/bash + - -lc + image: nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.4.1 + name: main + ports: + - containerPort: 8000 + name: http + protocol: TCP + volumeMounts: + - mountPath: /model-cache + name: model-cache + readOnly: true + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + replicas: 1 + type: frontend + - minAvailable: 1 + name: Worker + podTemplate: + spec: + containers: + - args: + - | + ulimit -l unlimited + exec python3 -m dynamo.vllm --model "${MODEL_NAME}" --served-model-name "${MODEL_NAME}" \ + --tensor-parallel-size 4 \ + --gpu-memory-utilization 0.93 \ + --max-num-seqs 32 \ + --max-num-batched-tokens 8192 \ + --block-size 64 \ + --dyn-reasoning-parser qwen3 \ + --dyn-tool-call-parser qwen3_coder \ + --kernel-config '{"moe_backend":"FLASHINFER_CUTLASS"}' \ + --kv-events-config '{"enable_kv_cache_events":true,"publisher":"zmq"}' \ + --spec-method exaone_moe_mtp \ + --spec-tokens 2 + command: + - /bin/bash + - -lc + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-k-exaone-2.0-750b-post.1 + name: main + resources: + limits: + memory: 480Gi + nvidia.com/gpu: "4" + requests: + memory: 200Gi + nvidia.com/gpu: "4" + securityContext: + capabilities: + add: + - IPC_LOCK + - SYS_RESOURCE + runAsUser: 0 + startupProbe: + failureThreshold: 60 + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + volumeMounts: + - mountPath: /model-cache + name: model-cache + readOnly: true + - mountPath: /dev/shm + name: dshm + nodeSelector: + nvidia.com/gpu.product: NVIDIA-B200 + tolerations: + - effect: NoSchedule + key: nvidia.com/gpu + operator: Equal + value: "true" + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + - emptyDir: + medium: Memory + name: dshm + replicas: 1 + # digest-pinned image has no semver tag for the operator to parse + runtimeVersionOverride: 1.4.1 + sharedMemorySize: 40Gi + type: worker + env: + - name: HF_HOME + value: /model-cache + - name: HF_HUB_OFFLINE + value: "1" + - name: TRANSFORMERS_OFFLINE + value: "1" + - name: MODEL_NAME + value: LGAI-EXAONE/K-EXAONE-2.0-750B-A37B-NVFP4 + - name: VLLM_WORKER_MULTIPROC_METHOD + value: spawn diff --git a/recipes/k-exaone-2.0/vllm/agg-b200-chat/kustomize/base/deploy.yaml b/recipes/k-exaone-2.0/vllm/agg-b200-chat/kustomize/base/deploy.yaml new file mode 100644 index 000000000000..5d4d5f055a53 --- /dev/null +++ b/recipes/k-exaone-2.0/vllm/agg-b200-chat/kustomize/base/deploy.yaml @@ -0,0 +1,127 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# K-EXAONE 2.0 750B-A37B NVFP4 on vLLM via Dynamo, aggregated, B200 (TP=4, 4 GPUs), +# chat workload (8K ISL / 1K OSL). The trace is DESIGNED for 70% prefix reuse; the +# rate actually achieved on this topology is ~8.8%, because the working set is ~42x +# oversubscribed against TP4 KV capacity and blocks are evicted before reuse. +# +# Model: 764.5 B total params, ~37 B active per token. 78 layers, 256 experts top-8. +# Hybrid attention: 20 full_attention + 58 sliding_attention layers. Native context 262,144. +# Checkpoint: LGAI-EXAONE/K-EXAONE-2.0-750B-A37B-NVFP4 (~530 GB on disk, NVFP4 W4A4). +# +# Key model-specific requirements: +# - --kernel-config moe_backend=FLASHINFER_CUTLASS is MANDATORY, not a tuning choice. +# vLLM's 'auto' selects FLASHINFER_TRTLLM, which silently corrupts long-form output on +# this checkpoint: it produces fluent, plausible, wrong text with no error. The pin costs +# some throughput and that cost is included in the published numbers. +# - --spec-method exaone_moe_mtp --spec-tokens 2: the checkpoint ships MTP heads. +# Draft length 1 is statistically indistinguishable; 4 is worse. +# - --dyn-reasoning-parser / --dyn-tool-call-parser: the plain --reasoning-parser and +# --tool-call-parser flags configure the ENGINE only and never reach the Dynamo frontend. +# - --block-size 64: block-size 16 is measurably worse on this model. +# - --kv-events-config on the worker publishes the prefix-block index that the +# frontend's --router-kv-events consumes. Both halves are inert at replicas: 1 +# (one destination), but without them raising replicas silently gives round-robin +# under a --router-mode kv label. Measured at parity with round-robin on this +# workload; shipped so that scaling out behaves as labelled, not for throughput. +# - TP=4 is the floor: ~530 GB of weights does not fit TP=2 on 180 GB B200s. TP=8 is slower +# per GPU -- the model is communication-bound, not KV-capacity-bound. +# - --enable-prompt-tokens-details is a 'vllm serve' flag; 'dynamo.vllm' rejects it. Read the +# achieved KV reuse from the worker log instead: +# kubectl logs | grep -o 'Prefix cache hit rate: [0-9.]*%' +--- +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: k-exaone-2-agg +spec: + backendFramework: vllm + env: + - {name: HF_HOME, value: /model-cache} + - {name: HF_HUB_OFFLINE, value: "1"} + - {name: TRANSFORMERS_OFFLINE, value: "1"} + - {name: MODEL_NAME, value: LGAI-EXAONE/K-EXAONE-2.0-750B-A37B-NVFP4} + - {name: VLLM_WORKER_MULTIPROC_METHOD, value: spawn} + components: + - name: Frontend + minAvailable: 1 + replicas: 1 + type: frontend + podTemplate: + spec: + containers: + - name: main + # Public released frontend. CPU-only -- it routes traffic and loads no weights, + # so it takes the released frontend image rather than the model-specific + # vLLM runtime. Multi-arch: linux/amd64 and linux/arm64. + image: nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.4.1 + command: [/bin/bash, -lc] + args: + - exec python3 -m dynamo.frontend --router-mode kv --router-kv-events --kv-cache-block-size 64 --http-host 0.0.0.0 --http-port 8000 + ports: [{containerPort: 8000, name: http, protocol: TCP}] + volumeMounts: + - {mountPath: /model-cache, name: model-cache, readOnly: true} + volumes: + - name: model-cache + persistentVolumeClaim: {claimName: model-cache} + - name: Worker + # digest-pinned image has no semver tag for the operator to parse + runtimeVersionOverride: "1.4.1" + minAvailable: 1 + replicas: 1 + type: worker + sharedMemorySize: 40Gi + podTemplate: + spec: + nodeSelector: + nvidia.com/gpu.product: NVIDIA-B200 + tolerations: + - {key: nvidia.com/gpu, operator: Equal, value: "true", effect: NoSchedule} + containers: + - name: main + # Public released runtime for this model. Carries vLLM 0.28.0 plus the + # exaone_moe lm_head prefix fix (ai-dynamo/dynamo#14599); stock vLLM 0.28.0 + # cannot load this NVFP4 checkpoint without it. + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-k-exaone-2.0-750b-post.1 + command: [/bin/bash, -lc] + args: + - | + ulimit -l unlimited + exec python3 -m dynamo.vllm --model "${MODEL_NAME}" --served-model-name "${MODEL_NAME}" \ + --tensor-parallel-size 4 \ + --gpu-memory-utilization 0.93 \ + --max-num-seqs 32 \ + --max-num-batched-tokens 8192 \ + --block-size 64 \ + --dyn-reasoning-parser qwen3 \ + --dyn-tool-call-parser qwen3_coder \ + --kernel-config '{"moe_backend":"FLASHINFER_CUTLASS"}' \ + --kv-events-config '{"enable_kv_cache_events":true,"publisher":"zmq"}' \ + --spec-method exaone_moe_mtp \ + --spec-tokens 2 + securityContext: + runAsUser: 0 + capabilities: {add: [IPC_LOCK, SYS_RESOURCE]} + resources: + requests: {memory: 200Gi, nvidia.com/gpu: "4"} + limits: {memory: 480Gi, nvidia.com/gpu: "4"} + # 530 GB of weights over a shared PVC, then torch.compile and cudagraph + # capture: first start is tens of minutes. 60 x 60 s of grace, matching the + # other 1T-class recipes. Without an explicit probe the operator default is + # far shorter and kills the worker mid-load. + startupProbe: + failureThreshold: 60 + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + volumeMounts: + - {mountPath: /model-cache, name: model-cache, readOnly: true} + - {mountPath: /dev/shm, name: dshm} + volumes: + - name: model-cache + persistentVolumeClaim: {claimName: model-cache} + - name: dshm + emptyDir: {medium: Memory} diff --git a/recipes/k-exaone-2.0/vllm/agg-b200-chat/kustomize/base/kustomization.yaml b/recipes/k-exaone-2.0/vllm/agg-b200-chat/kustomize/base/kustomization.yaml new file mode 100644 index 000000000000..252f2bb7ec94 --- /dev/null +++ b/recipes/k-exaone-2.0/vllm/agg-b200-chat/kustomize/base/kustomization.yaml @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - deploy.yaml +components: + - ../../../../../kustomize/components/dynamo-openapi diff --git a/recipes/k-exaone-2.0/vllm/agg-b200-chat/kustomize/overlays/generic/kustomization.yaml b/recipes/k-exaone-2.0/vllm/agg-b200-chat/kustomize/overlays/generic/kustomization.yaml new file mode 100644 index 000000000000..c20287c3329a --- /dev/null +++ b/recipes/k-exaone-2.0/vllm/agg-b200-chat/kustomize/overlays/generic/kustomization.yaml @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Generated file. For repository contributors, do not edit this checked-in copy. +# Regenerate this matrix's public overlays and template Components from the repository root: +# Regenerate: scripts/kustomize-matrix.py unfold recipes/k-exaone-2.0/vllm/agg-b200-chat/.kustomize-matrix.yaml + +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +sortOptions: + order: fifo +resources: + - "../../base" diff --git a/recipes/k-exaone-2.0/vllm/disagg-b200-chat/.kustomize-matrix.yaml b/recipes/k-exaone-2.0/vllm/disagg-b200-chat/.kustomize-matrix.yaml new file mode 100644 index 000000000000..140bca86f293 --- /dev/null +++ b/recipes/k-exaone-2.0/vllm/disagg-b200-chat/.kustomize-matrix.yaml @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +source: kustomize/base +nameTemplate: "${variant}" +matrix: + variant: + - name: generic + components: [] diff --git a/recipes/k-exaone-2.0/vllm/disagg-b200-chat/deploy-generic.yaml b/recipes/k-exaone-2.0/vllm/disagg-b200-chat/deploy-generic.yaml new file mode 100644 index 000000000000..b09529c94213 --- /dev/null +++ b/recipes/k-exaone-2.0/vllm/disagg-b200-chat/deploy-generic.yaml @@ -0,0 +1,249 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Generated file. For repository contributors, do not edit this checked-in copy. +# Regenerate every public overlay and rendered manifest of this matrix (from the repository root): +# scripts/kustomize-matrix.py unfold recipes/k-exaone-2.0/vllm/disagg-b200-chat/.kustomize-matrix.yaml +# scripts/kustomize-matrix.py render recipes/k-exaone-2.0/vllm/disagg-b200-chat/.kustomize-matrix.yaml +# Inspect only this Kustomize overlay (from the repository root): +# kustomize build recipes/k-exaone-2.0/vllm/disagg-b200-chat/kustomize/overlays/generic +# You may edit a copy before applying it. + +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: k-exaone-2-disagg +spec: + backendFramework: vllm + components: + - minAvailable: 1 + name: Frontend + podTemplate: + spec: + containers: + - args: + - exec python3 -m dynamo.frontend --router-mode kv --router-kv-events --kv-cache-block-size + 64 --http-host 0.0.0.0 --http-port 8000 + command: + - /bin/bash + - -lc + image: nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.4.1 + name: main + ports: + - containerPort: 8000 + name: http + protocol: TCP + volumeMounts: + - mountPath: /model-cache + name: model-cache + readOnly: true + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + replicas: 1 + type: frontend + - minAvailable: 1 + name: PrefillWorker + podTemplate: + spec: + containers: + - args: + - | + ulimit -l unlimited + exec python3 -m dynamo.vllm --model "${MODEL_NAME}" --served-model-name "${MODEL_NAME}" \ + --disaggregation-mode=prefill \ + --kv-transfer-config "${KV_TRANSFER_CONFIG}" \ + --tensor-parallel-size 4 \ + --gpu-memory-utilization 0.93 \ + --max-num-seqs 32 \ + --max-num-batched-tokens 8192 \ + --block-size 64 \ + --dyn-reasoning-parser qwen3 \ + --dyn-tool-call-parser qwen3_coder \ + --kernel-config '{"moe_backend":"FLASHINFER_CUTLASS"}' \ + --kv-events-config '{"enable_kv_cache_events":true,"publisher":"zmq"}' \ + --spec-method exaone_moe_mtp \ + --spec-tokens 2 + command: + - /bin/bash + - -lc + env: + - name: VLLM_NIXL_SIDE_CHANNEL_PORT + value: "5560" + - name: KV_TRANSFER_CONFIG + value: '{"kv_connector":"NixlConnector","kv_role":"kv_producer","kv_buffer_device":"cuda","kv_connector_extra_config":{"num_threads":8}}' + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-k-exaone-2.0-750b-post.1 + name: main + resources: + limits: + memory: 480Gi + nvidia.com/gpu: "4" + rdma/shared_ib: "4" + requests: + memory: 200Gi + nvidia.com/gpu: "4" + rdma/shared_ib: "4" + securityContext: + capabilities: + add: + - IPC_LOCK + - SYS_PTRACE + - SYS_RESOURCE + runAsUser: 0 + startupProbe: + failureThreshold: 60 + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + volumeMounts: + - mountPath: /model-cache + name: model-cache + readOnly: true + - mountPath: /dev/shm + name: dshm + nodeSelector: + nvidia.com/gpu.product: NVIDIA-B200 + tolerations: + - effect: NoSchedule + key: nvidia.com/gpu + operator: Equal + value: "true" + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + - emptyDir: + medium: Memory + name: dshm + replicas: 1 + # digest-pinned image has no semver tag for the operator to parse + runtimeVersionOverride: 1.4.1 + sharedMemorySize: 40Gi + type: worker + - minAvailable: 1 + name: DecodeWorker + podTemplate: + spec: + # Pack decode onto prefill's node so the NIXL KV hop stays on one fabric. + # PREFERRED, not required: the operator schedules the deployment as a gang, so a + # required affinity on a peer that is not placed yet leaves the whole gang Pending + # forever -- neither role can go first. Co-location is an optimisation here, not a + # correctness requirement: KV moves over IB RDMA, which works cross-node, just slower. + affinity: + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: nvidia.com/dynamo-graph-deployment-name + operator: In + values: + - k-exaone-2-disagg + - key: nvidia.com/dynamo-component + operator: In + values: + - PrefillWorker + topologyKey: kubernetes.io/hostname + weight: 100 + containers: + - args: + - | + ulimit -l unlimited + exec python3 -m dynamo.vllm --model "${MODEL_NAME}" --served-model-name "${MODEL_NAME}" \ + --disaggregation-mode=decode \ + --kv-transfer-config "${KV_TRANSFER_CONFIG}" \ + --tensor-parallel-size 4 \ + --gpu-memory-utilization 0.93 \ + --max-num-seqs 256 \ + --max-num-batched-tokens 8192 \ + --block-size 64 \ + --dyn-reasoning-parser qwen3 \ + --dyn-tool-call-parser qwen3_coder \ + --kernel-config '{"moe_backend":"FLASHINFER_CUTLASS"}' \ + --spec-method exaone_moe_mtp \ + --spec-tokens 2 + command: + - /bin/bash + - -lc + env: + - name: VLLM_NIXL_SIDE_CHANNEL_PORT + value: "5558" + - name: KV_TRANSFER_CONFIG + value: '{"kv_connector":"NixlConnector","kv_role":"kv_consumer","kv_buffer_device":"cuda","kv_connector_extra_config":{"num_threads":8}}' + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-k-exaone-2.0-750b-post.1 + name: main + resources: + limits: + memory: 480Gi + nvidia.com/gpu: "4" + rdma/shared_ib: "4" + requests: + memory: 200Gi + nvidia.com/gpu: "4" + rdma/shared_ib: "4" + securityContext: + capabilities: + add: + - IPC_LOCK + - SYS_PTRACE + - SYS_RESOURCE + runAsUser: 0 + startupProbe: + failureThreshold: 60 + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + volumeMounts: + - mountPath: /model-cache + name: model-cache + readOnly: true + - mountPath: /dev/shm + name: dshm + nodeSelector: + nvidia.com/gpu.product: NVIDIA-B200 + tolerations: + - effect: NoSchedule + key: nvidia.com/gpu + operator: Equal + value: "true" + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: model-cache + - emptyDir: + medium: Memory + name: dshm + replicas: 1 + # digest-pinned image has no semver tag for the operator to parse + runtimeVersionOverride: 1.4.1 + sharedMemorySize: 40Gi + type: worker + env: + - name: HF_HOME + value: /model-cache + - name: HF_HUB_OFFLINE + value: "1" + - name: TRANSFORMERS_OFFLINE + value: "1" + - name: MODEL_NAME + value: LGAI-EXAONE/K-EXAONE-2.0-750B-A37B-NVFP4 + - name: VLLM_WORKER_MULTIPROC_METHOD + value: spawn + # rc_x/rc are the InfiniBand RDMA transports. tcp is omitted on purpose -- see the header. + - name: UCX_TLS + value: rc_x,rc,cuda_copy,cuda_ipc + - name: UCX_MEMTYPE_CACHE + value: "n" + - name: UCX_RCACHE_MAX_UNRELEASED + value: "1024" + - name: UCX_NET_DEVICES + value: all + # TP is intra-pod and belongs on NVLink. Exposing the HCAs makes NCCL probe IB for + # tensor-parallel traffic as well; pin it off so the two fabrics stay separated by role. + - name: NCCL_IB_DISABLE + value: "1" diff --git a/recipes/k-exaone-2.0/vllm/disagg-b200-chat/kustomize/base/deploy.yaml b/recipes/k-exaone-2.0/vllm/disagg-b200-chat/kustomize/base/deploy.yaml new file mode 100644 index 000000000000..17c1f4bee396 --- /dev/null +++ b/recipes/k-exaone-2.0/vllm/disagg-b200-chat/kustomize/base/deploy.yaml @@ -0,0 +1,224 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# K-EXAONE 2.0 750B-A37B NVFP4 on vLLM via Dynamo, disaggregated 1P1D, B200 +# (TP=4 per worker, 8 GPUs total), chat workload (8K ISL / 1K OSL). The trace is +# DESIGNED for 70% prefix reuse; achieved reuse on this topology is ~8.8% -- the working +# set is ~42x oversubscribed against KV capacity, so blocks are evicted before reuse. +# +# See ../agg-b200-chat/deploy.yaml for the model-level requirements (FLASHINFER_CUTLASS, +# MTP, the --dyn-* parsers). Everything below is disaggregation-specific. +# +# - Prefill and decode MUST carry identical spec-dec and block-size settings. A mismatch +# changes KV block geometry and produces silent garbage output, not an error. +# - Decode runs --max-num-seqs 256 while prefill keeps 32. Decode is the bottleneck on this +# workload; prefill idles. Leaving decode at 32 costs ~48% throughput to head-of-line +# blocking at ~10% KV utilisation. +# - KV transfer is NixlConnector over UCX. UCX_TLS deliberately EXCLUDES tcp: if a fast +# transport is unavailable UCX will silently fall back to TCP and stage GPU memory through +# host RAM, which is roughly two orders of magnitude slower and shows up only as a large +# TTFT. Verify the selected transport before trusting any number: +# kubectl exec -- curl -s localhost:9090/metrics \ +# | grep vllm:nixl_xfer_time_seconds +# A ~1 GB KV transfer should take milliseconds, not seconds. +# - InfiniBand RDMA requires a device plugin exposing the HCAs as a Kubernetes extended +# resource. THE RESOURCE NAME IS CLUSTER-SPECIFIC. This file requests +# 'rdma/shared_ib', which is what our validation cluster exposes; other clusters use +# 'rdma/ib' or 'rdma/rdma_shared_device_a'. Replace it to match your device plugin, and +# prefer a SHARED flavour: with an exclusive-mode resource, two co-located workers each +# claiming HCAs can deadlock NCCL bootstrap in whichever initialises second. +# - podAffinity packs decode onto prefill's node so the KV hop stays on one fabric. +# - --kv-events-config on the PREFILL worker publishes the prefix-block index that the +# frontend's --router-kv-events consumes; decode receives KV and does not publish. +# Both halves are inert at replicas: 1 (one destination), but without them raising +# replicas silently gives round-robin under a --router-mode kv label. Measured at +# parity with round-robin on this workload -- shipped so scaling behaves as labelled, +# not as a throughput claim. +# It is PREFERRED, not required: gang scheduling deadlocks on a required peer affinity. +--- +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: k-exaone-2-disagg +spec: + backendFramework: vllm + env: + - {name: HF_HOME, value: /model-cache} + - {name: HF_HUB_OFFLINE, value: "1"} + - {name: TRANSFORMERS_OFFLINE, value: "1"} + - {name: MODEL_NAME, value: LGAI-EXAONE/K-EXAONE-2.0-750B-A37B-NVFP4} + - {name: VLLM_WORKER_MULTIPROC_METHOD, value: spawn} + # rc_x/rc are the InfiniBand RDMA transports. tcp is omitted on purpose -- see the header. + - {name: UCX_TLS, value: "rc_x,rc,cuda_copy,cuda_ipc"} + - {name: UCX_MEMTYPE_CACHE, value: "n"} + - {name: UCX_RCACHE_MAX_UNRELEASED, value: "1024"} + - {name: UCX_NET_DEVICES, value: all} + # TP is intra-pod and belongs on NVLink. Exposing the HCAs makes NCCL probe IB for + # tensor-parallel traffic as well; pin it off so the two fabrics stay separated by role. + - {name: NCCL_IB_DISABLE, value: "1"} + components: + - name: Frontend + minAvailable: 1 + replicas: 1 + type: frontend + podTemplate: + spec: + containers: + - name: main + # Public released frontend. CPU-only -- it routes traffic and loads no weights, + # so it takes the released frontend image rather than the model-specific + # vLLM runtime. Multi-arch: linux/amd64 and linux/arm64. + image: nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.4.1 + command: [/bin/bash, -lc] + args: + - exec python3 -m dynamo.frontend --router-mode kv --router-kv-events --kv-cache-block-size 64 --http-host 0.0.0.0 --http-port 8000 + ports: [{containerPort: 8000, name: http, protocol: TCP}] + volumeMounts: + - {mountPath: /model-cache, name: model-cache, readOnly: true} + volumes: + - name: model-cache + persistentVolumeClaim: {claimName: model-cache} + - name: PrefillWorker + # digest-pinned image has no semver tag for the operator to parse + runtimeVersionOverride: "1.4.1" + minAvailable: 1 + replicas: 1 + type: worker + sharedMemorySize: 40Gi + podTemplate: + spec: + nodeSelector: + nvidia.com/gpu.product: NVIDIA-B200 + tolerations: + - {key: nvidia.com/gpu, operator: Equal, value: "true", effect: NoSchedule} + containers: + - name: main + # Public released runtime for this model. Carries vLLM 0.28.0 plus the + # exaone_moe lm_head prefix fix (ai-dynamo/dynamo#14599); stock vLLM 0.28.0 + # cannot load this NVFP4 checkpoint without it. + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-k-exaone-2.0-750b-post.1 + env: + - {name: VLLM_NIXL_SIDE_CHANNEL_PORT, value: "5560"} + - {name: KV_TRANSFER_CONFIG, value: '{"kv_connector":"NixlConnector","kv_role":"kv_producer","kv_buffer_device":"cuda","kv_connector_extra_config":{"num_threads":8}}'} + command: [/bin/bash, -lc] + args: + - | + ulimit -l unlimited + exec python3 -m dynamo.vllm --model "${MODEL_NAME}" --served-model-name "${MODEL_NAME}" \ + --disaggregation-mode=prefill \ + --kv-transfer-config "${KV_TRANSFER_CONFIG}" \ + --tensor-parallel-size 4 \ + --gpu-memory-utilization 0.93 \ + --max-num-seqs 32 \ + --max-num-batched-tokens 8192 \ + --block-size 64 \ + --dyn-reasoning-parser qwen3 \ + --dyn-tool-call-parser qwen3_coder \ + --kernel-config '{"moe_backend":"FLASHINFER_CUTLASS"}' \ + --kv-events-config '{"enable_kv_cache_events":true,"publisher":"zmq"}' \ + --spec-method exaone_moe_mtp \ + --spec-tokens 2 + securityContext: + runAsUser: 0 + capabilities: {add: [IPC_LOCK, SYS_PTRACE, SYS_RESOURCE]} + resources: + requests: {memory: 200Gi, nvidia.com/gpu: "4", rdma/shared_ib: "4"} + limits: {memory: 480Gi, nvidia.com/gpu: "4", rdma/shared_ib: "4"} + # 530 GB of weights over a shared PVC, then torch.compile and cudagraph + # capture: first start is tens of minutes. 60 x 60 s of grace, matching the + # other 1T-class recipes. Without an explicit probe the operator default is + # far shorter and kills the worker mid-load. + startupProbe: + failureThreshold: 60 + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + volumeMounts: + - {mountPath: /model-cache, name: model-cache, readOnly: true} + - {mountPath: /dev/shm, name: dshm} + volumes: + - name: model-cache + persistentVolumeClaim: {claimName: model-cache} + - name: dshm + emptyDir: {medium: Memory} + - name: DecodeWorker + # digest-pinned image has no semver tag for the operator to parse + runtimeVersionOverride: "1.4.1" + minAvailable: 1 + replicas: 1 + type: worker + sharedMemorySize: 40Gi + podTemplate: + spec: + nodeSelector: + nvidia.com/gpu.product: NVIDIA-B200 + # Pack decode onto prefill's node so the NIXL KV hop stays on one fabric. + # PREFERRED, not required: the operator schedules the deployment as a gang, so a + # required affinity on a peer that is not placed yet leaves the whole gang Pending + # forever -- neither role can go first. Co-location is an optimisation here, not a + # correctness requirement: KV moves over IB RDMA, which works cross-node, just slower. + affinity: + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + topologyKey: kubernetes.io/hostname + labelSelector: + matchExpressions: + - {key: nvidia.com/dynamo-graph-deployment-name, operator: In, values: [k-exaone-2-disagg]} + - {key: nvidia.com/dynamo-component, operator: In, values: [PrefillWorker]} + tolerations: + - {key: nvidia.com/gpu, operator: Equal, value: "true", effect: NoSchedule} + containers: + - name: main + # Public released runtime for this model. Carries vLLM 0.28.0 plus the + # exaone_moe lm_head prefix fix (ai-dynamo/dynamo#14599); stock vLLM 0.28.0 + # cannot load this NVFP4 checkpoint without it. + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.1-k-exaone-2.0-750b-post.1 + env: + - {name: VLLM_NIXL_SIDE_CHANNEL_PORT, value: "5558"} + - {name: KV_TRANSFER_CONFIG, value: '{"kv_connector":"NixlConnector","kv_role":"kv_consumer","kv_buffer_device":"cuda","kv_connector_extra_config":{"num_threads":8}}'} + command: [/bin/bash, -lc] + args: + - | + ulimit -l unlimited + exec python3 -m dynamo.vllm --model "${MODEL_NAME}" --served-model-name "${MODEL_NAME}" \ + --disaggregation-mode=decode \ + --kv-transfer-config "${KV_TRANSFER_CONFIG}" \ + --tensor-parallel-size 4 \ + --gpu-memory-utilization 0.93 \ + --max-num-seqs 256 \ + --max-num-batched-tokens 8192 \ + --block-size 64 \ + --dyn-reasoning-parser qwen3 \ + --dyn-tool-call-parser qwen3_coder \ + --kernel-config '{"moe_backend":"FLASHINFER_CUTLASS"}' \ + --spec-method exaone_moe_mtp \ + --spec-tokens 2 + securityContext: + runAsUser: 0 + capabilities: {add: [IPC_LOCK, SYS_PTRACE, SYS_RESOURCE]} + resources: + requests: {memory: 200Gi, nvidia.com/gpu: "4", rdma/shared_ib: "4"} + limits: {memory: 480Gi, nvidia.com/gpu: "4", rdma/shared_ib: "4"} + # 530 GB of weights over a shared PVC, then torch.compile and cudagraph + # capture: first start is tens of minutes. 60 x 60 s of grace, matching the + # other 1T-class recipes. Without an explicit probe the operator default is + # far shorter and kills the worker mid-load. + startupProbe: + failureThreshold: 60 + httpGet: + path: /live + port: 9090 + periodSeconds: 60 + timeoutSeconds: 20 + volumeMounts: + - {mountPath: /model-cache, name: model-cache, readOnly: true} + - {mountPath: /dev/shm, name: dshm} + volumes: + - name: model-cache + persistentVolumeClaim: {claimName: model-cache} + - name: dshm + emptyDir: {medium: Memory} diff --git a/recipes/k-exaone-2.0/vllm/disagg-b200-chat/kustomize/base/kustomization.yaml b/recipes/k-exaone-2.0/vllm/disagg-b200-chat/kustomize/base/kustomization.yaml new file mode 100644 index 000000000000..252f2bb7ec94 --- /dev/null +++ b/recipes/k-exaone-2.0/vllm/disagg-b200-chat/kustomize/base/kustomization.yaml @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - deploy.yaml +components: + - ../../../../../kustomize/components/dynamo-openapi diff --git a/recipes/k-exaone-2.0/vllm/disagg-b200-chat/kustomize/overlays/generic/kustomization.yaml b/recipes/k-exaone-2.0/vllm/disagg-b200-chat/kustomize/overlays/generic/kustomization.yaml new file mode 100644 index 000000000000..8cd671be06de --- /dev/null +++ b/recipes/k-exaone-2.0/vllm/disagg-b200-chat/kustomize/overlays/generic/kustomization.yaml @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Generated file. For repository contributors, do not edit this checked-in copy. +# Regenerate this matrix's public overlays and template Components from the repository root: +# Regenerate: scripts/kustomize-matrix.py unfold recipes/k-exaone-2.0/vllm/disagg-b200-chat/.kustomize-matrix.yaml + +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +sortOptions: + order: fifo +resources: + - "../../base" From dc0f53886b03e25bdc621431967a39b4faa97d6e Mon Sep 17 00:00:00 2001 From: Adit Ranadive Date: Thu, 17 Sep 2026 11:12:54 -0700 Subject: [PATCH 076/191] feat: KVCR Resiliency Deployment Example (#14695) Add two-node DynamoGraphDeployment examples for process-local KVCR and the KVCR memory service. Run one vLLM worker per GPU node, use stable Grove ordinals for cache-owner slots, and request GPU-local RDMA resources for engines and Guard services. Provide a deployment helper for rendering and selecting either variant. Run the KV state agent alongside vLLM for process-local host memory. In memory-service mode, keep KVCR and the state agent in a separate container so its Guard and shared-memory pool survive engine restarts. Document that restarting the services sidecar invalidates the MVP recovery contract and requires deployment-level replacement. Add manifest coverage and an opt-in two-host lifecycle test. Kill the source EngineCore, hold it offline, and verify that the promoted Guard serves its preserved cache to the surviving target. Correlate response equality and KVCR transfer metrics with transmit and receive counters from the selected active HCA to prove RDMA transport. Pin compatible KVCR and vLLM revisions and document the runtime, discovery, compatibility-digest, and recovery prerequisites. Signed-off-by: Adit Ranadive --- examples/backends/vllm/deploy/README.md | 6 + examples/backends/vllm/deploy/kvcr/README.md | 137 ++++ .../vllm/deploy/kvcr/agg-memory-service.yaml | 297 +++++++++ examples/backends/vllm/deploy/kvcr/agg.yaml | 199 ++++++ examples/backends/vllm/deploy/kvcr/deploy.sh | 76 +++ pyproject.toml | 1 + tests/conftest.py | 5 + tests/deploy/test_kvcr_guard.py | 631 ++++++++++++++++++ tests/deploy/test_kvcr_manifests.py | 293 ++++++++ 9 files changed, 1645 insertions(+) create mode 100644 examples/backends/vllm/deploy/kvcr/README.md create mode 100644 examples/backends/vllm/deploy/kvcr/agg-memory-service.yaml create mode 100644 examples/backends/vllm/deploy/kvcr/agg.yaml create mode 100755 examples/backends/vllm/deploy/kvcr/deploy.sh create mode 100644 tests/deploy/test_kvcr_guard.py create mode 100644 tests/deploy/test_kvcr_manifests.py diff --git a/examples/backends/vllm/deploy/README.md b/examples/backends/vllm/deploy/README.md index 4f280c42812a..a8982f4b1e28 100644 --- a/examples/backends/vllm/deploy/README.md +++ b/examples/backends/vllm/deploy/README.md @@ -59,6 +59,12 @@ Aggregated deployment that offloads KV cache to a per-node LMCache MP DaemonSet, - `worker`: Single worker, `hostIPC: true` + `runAsUser: 0` (required for cross-Pod CUDA IPC with the LMCache server) - `LMCacheEngine` (separate CR): per-node DaemonSet that imports the worker's KV-cache IPC handles and serves cache hits over ZMQ +### 8. **Aggregated KVCR Deployments** (`kvcr/`) + +Two-node aggregated deployments with a process-local KVCR tier or a resilient +KVCR memory-service sidecar. See [`kvcr/README.md`](./kvcr/README.md) for image, +RDMA, and lifecycle requirements. + ## CRD Structure All templates use the **DynamoGraphDeployment** CRD: diff --git a/examples/backends/vllm/deploy/kvcr/README.md b/examples/backends/vllm/deploy/kvcr/README.md new file mode 100644 index 000000000000..01220b0a7230 --- /dev/null +++ b/examples/backends/vllm/deploy/kvcr/README.md @@ -0,0 +1,137 @@ + + +# KVCR deployment examples + +These examples deploy two aggregated vLLM workers on separate GPU nodes and +use KVCR as a secondary KV-cache tier over RDMA. Both variants use one +KVCR-capable Dynamo vLLM runtime image for every process. + +## Prerequisites + +- Two Kubernetes nodes with one NVIDIA GPU each and the allocatable RDMA + resource shares described below. +- The Dynamo Kubernetes Platform and `nvidia.com/v1beta1` DGD API. +- The Dynamo operator's Grove workload provider and the Grove PodCliqueSet + API. The example uses the stable PodClique replica index to place one state + agent for the two engines. +- An operator-configured etcd endpoint for the process-local variant. +- An `hf-token-secret` in the target namespace. +- A runtime image containing mutually compatible Dynamo, vLLM, KVCR, NIXL, + and UCX builds. +- Linux 6.5 or a kernel with equivalent `SO_PEERPIDFD` support for the + memory-service variant. +- `envsubst` and `kubectl` on the deployment host. + +The manifests default to the `rdma/shared_ib` extended resource. The +process-local variant requests one share per GPU node; the memory-service +variant requests two shares per node because both `main` and `kvcr-services` +use RDMA. Set +`DYNAMO_RDMA_RESOURCE=rdma/ib` or another cluster-specific resource name when +required. `UCX_TLS=rc_x,cuda` prevents TCP fallback. Set +`DYNAMO_UCX_NET_DEVICES` to the GPU-local HCA and port exposed by the selected +RDMA resource, such as `mlx5_0:1`; do not copy that example device name without +checking the target nodes. + +The image tag must contain a Dynamo semantic release version. Pin the same +image by digest for every component, for example +`nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0@sha256:REPLACE_ME`. Until KVCR is +available in a Dynamo release image, build that image from matching Dynamo, +KVCR, and vLLM revisions. Use [KVCR tag +`v0.1.0`](https://github.com/ai-dynamo/kvcr/tree/v0.1.0). Until +[vLLM PR 53624](https://github.com/vllm-project/vllm/pull/53624) is merged, pin +vLLM to the PR's immutable head SHA; at the time of this update it is +[`7015687c`](https://github.com/vllm-project/vllm/commit/7015687c390442fae384b78fc62e6621b3bf6e56). +After the PR merges, pin the commit that lands on vLLM `main`. Record the exact +Dynamo, KVCR, and vLLM commit IDs with the image digest used for every qualified +deployment. + +`DYNAMO_KVCR_COMPATIBILITY_DIGEST` is an opaque layout version shared by the +engine and memory service. Change it whenever model, dtype, block layout, or +the KVCR integration changes. + +## Deploy a variant + +```bash +export DYNAMO_VLLM_IMAGE=nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0@sha256:REPLACE_ME +export DYNAMO_UCX_NET_DEVICES=REPLACE_WITH_GPU_LOCAL_HCA:1 +export DYNAMO_KVCR_COMPATIBILITY_DIGEST=qwen3-0.6b-example-v1 +export NAMESPACE=REPLACE_ME + +# In-process KVCR with process-local host memory. +KVCR_MEMORY_SERVICE_ENABLED=false ./deploy.sh + +# KVCR memory service with a pool and Guard that survive an engine restart. +KVCR_MEMORY_SERVICE_ENABLED=true ./deploy.sh +``` + +Run `./deploy.sh --render-only` to inspect the selected DGD. Both manifests +use required Pod anti-affinity, so the second worker remains Pending unless a +second eligible node is available. After apply, the script also verifies that +the operator materialized Grove as the DGD's workload provider. Each engine's +`KVCR_CACHE_SLOT` is populated from its stable Grove replica index in this +example. The slot identifies a logical DP slot in the cache pool, not a Pod or +process. Its assignment must remain unchanged when an engine is restarted or +replaced and must be unique among DP ranks sharing the pool. The startup command +validates the slot against `KVCR_CACHE_SLOT_COUNT` before constructing the +cache-owner ID, so a replacement Pod reclaims the same state-agent slot. + +## Understand the process lifecycle + +In `agg.yaml`, the state agent and `dynamo.vllm` run under one supervisor in +worker 0's `main` container. Both workers use etcd discovery because Kubernetes +container discovery permits one metadata writer per actual container. If the +state agent or its local vLLM process exits, the supervisor terminates worker +0's container and Kubernetes restarts both processes. The operator supplies +the standard HTTP probes for the `main` container. Worker 1 runs only vLLM. +KVCR uses process-local host memory, so this variant does not preserve its KV +pool across a restart. Because live state-agent host reselection is not yet +supported, restart both workers to restore state tracking after worker 0 +restarts. + +In `agg-memory-service.yaml`, `dynamo.vllm` runs in `main`. A regular +`kvcr-services` sidecar runs the KVCR memory service and state agent. Both +containers mount `/run/kvcr` and the memory-backed `/dev/shm/kvcr` volume. A +vLLM container restart leaves the service, Guard, and pool running. The +sidecar's probes check the KVCR Unix socket. The state agent runs in worker 0's +sidecar, and that sidecar's probe also checks state-agent health. Kubernetes +container discovery gives `main` and the real `kvcr-services` sidecar separate +metadata writers. The explicit sidecar supplies its own downward-API Pod UID; +the operator injects that identity only into its generated `main` container. +Kubernetes currently restarts a failed `kvcr-services` container independently. +In this MVP, any such restart invalidates the Guard-recovery guarantee and is +deployment-fatal: a replacement service cannot adopt the original Guard and +pool while vLLM remains alive. An external deployment controller must replace +the entire affected worker Pod instead of restarting only the sidecar. If +worker 0's sidecar restarts, recreate the worker group or DGD because its state +agent's routing state was also lost. + +The state agent carries routing and residency information; it does not move +KV payloads. KVCR uses NIXL and UCX for the remote payload transfer. + +## Verify Guard recovery + +Use the memory-service variant and the opt-in live-cluster test. The test adds +a fault gate to its temporary manifest; the deployment example itself contains +no test-only startup controls. + +```bash +export DYNAMO_UCX_NET_DEVICES=REPLACE_WITH_GPU_LOCAL_HCA:1 +export DYNAMO_KVCR_COMPATIBILITY_DIGEST=qwen3-0.6b-example-v1 +python3 -m pytest tests/deploy/test_kvcr_guard.py \ + -m framework_with_kvcr \ + --image="$DYNAMO_VLLM_IMAGE" \ + --namespace="$NAMESPACE" --skip-service-restart -v -s +``` + +The namespace must be empty of an earlier deployment with the same name. The +test requires read-only `hostPath` access to InfiniBand counters and captures +every worker container's current and previous logs at the before-failure, +failed, remote-delivery, and recovered phases under `DYN_TEST_OUTPUT_PATH` (or +the standard `test_output` directory). It verifies that the workers are on +separate hosts, one source engine restarts while its KVCR sidecar remains up, +the Guard serves the preserved cache to the other engine, the response matches, +the KVCR transfer metrics increase, and the selected active HCA carries the +transfer. diff --git a/examples/backends/vllm/deploy/kvcr/agg-memory-service.yaml b/examples/backends/vllm/deploy/kvcr/agg-memory-service.yaml new file mode 100644 index 000000000000..116f1157d6ba --- /dev/null +++ b/examples/backends/vllm/deploy/kvcr/agg-memory-service.yaml @@ -0,0 +1,297 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + annotations: + nvidia.com/dynamo-discovery-backend: kubernetes + nvidia.com/dynamo-kube-discovery-mode: container + name: vllm-agg-kvcr-memory-service +spec: + components: + - name: Frontend + podTemplate: + spec: + containers: + - env: + - name: DYN_ROUTER_MODE + value: kv + image: ${DYNAMO_VLLM_IMAGE} + name: main + replicas: 1 + type: frontend + - name: worker + podTemplate: + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: nvidia.com/dynamo-component + operator: In + values: + - worker + - key: nvidia.com/dynamo-graph-deployment-name + operator: In + values: + - vllm-agg-kvcr-memory-service + topologyKey: kubernetes.io/hostname + containers: + - args: + - | + set -euo pipefail + for _ in $(seq 1 60); do + if python3 -c "import socket; s=socket.socket(socket.AF_UNIX); s.settimeout(1); s.connect('/run/kvcr/memory.sock'); s.close()" >/dev/null 2>&1; then + break + fi + sleep 1 + done + if ! python3 -c "import socket; s=socket.socket(socket.AF_UNIX); s.settimeout(1); s.connect('/run/kvcr/memory.sock'); s.close()"; then + echo "KVCR memory service did not become ready" >&2 + exit 1 + fi + + kv_transfer_config=$( + python3 - <<'PY' + import json + import os + + def cache_owner_id(): + raw_slot = os.environ["KVCR_CACHE_SLOT"] + raw_count = os.environ["KVCR_CACHE_SLOT_COUNT"] + if not raw_slot.isdecimal() or not raw_count.isdecimal(): + raise SystemExit("KVCR cache slot and count must be decimal integers") + slot = int(raw_slot) + slot_count = int(raw_count) + if slot_count <= 0 or slot >= slot_count: + raise SystemExit( + f"KVCR cache slot {slot} is outside [0, {slot_count})" + ) + return ( + "01010101010101010101010101010101:" + "02020202020202020202020202020202/" + f"0303030303030303/{slot:032x}" + ) + + print(json.dumps({ + "kv_connector": "OffloadingConnector", + "kv_role": "kv_both", + "kv_connector_extra_config": { + "cpu_bytes_to_use": 2147483648, + "spec_name": "TieringOffloadingSpec", + "self_describing_kv_events": True, + "dynamo_state_agent": { + "raw_advertise_host": os.environ["POD_IP"], + "cache_owner_ids": {"0": cache_owner_id()}, + }, + "secondary_tiers": [{ + "type": "kvcr", + "kvcr_service_socket_path": "/run/kvcr/memory.sock", + "compatibility_digest": "${DYNAMO_KVCR_COMPATIBILITY_DIGEST}", + "router_capabilities": ["router_hint"], + "control_host": "0.0.0.0", + "control_ports": [23280], + "control_advertise_host": os.environ["POD_IP"], + "enable_telemetry": True, + }], + }, + })) + PY + ) + exec python3 -m dynamo.vllm \ + --model Qwen/Qwen3-0.6B \ + --kv-transfer-config "$kv_transfer_config" \ + --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:23080","enable_kv_cache_events":true}' + command: + - /bin/bash + - -c + env: + - name: CONTAINER_NAME + value: main + - name: DYN_KUBE_DISCOVERY_MODE + value: container + - name: DYN_SYSTEM_PORT + value: "9090" + - name: KVCR_CACHE_SLOT + valueFrom: + fieldRef: + fieldPath: metadata.labels['grove.io/podclique-pod-index'] + - name: KVCR_CACHE_SLOT_COUNT + value: "2" + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_INDEX + valueFrom: + fieldRef: + fieldPath: metadata.labels['grove.io/podclique-pod-index'] + - name: PYTHONHASHSEED + value: "0" + - name: UCX_TLS + value: rc_x,cuda + - name: UCX_NET_DEVICES + value: ${DYNAMO_UCX_NET_DEVICES} + envFrom: + - secretRef: + name: hf-token-secret + image: ${DYNAMO_VLLM_IMAGE} + name: main + resources: + limits: + ${DYNAMO_RDMA_RESOURCE}: "1" + nvidia.com/gpu: "1" + requests: + ${DYNAMO_RDMA_RESOURCE}: "1" + ephemeral-storage: 2Gi + nvidia.com/gpu: "1" + securityContext: + capabilities: + add: + - IPC_LOCK + volumeMounts: + - mountPath: /run/kvcr + name: kvcr-socket + - mountPath: /dev/shm/kvcr + name: kvcr-memory + workingDir: /workspace/examples/backends/vllm + - args: + - | + set -euo pipefail + state_namespace=$DYN_NAMESPACE + if [ -n "${DYN_NAMESPACE_WORKER_SUFFIX:-}" ]; then + state_namespace="${state_namespace}-${DYN_NAMESPACE_WORKER_SUFFIX}" + fi + + kvcr_pid= + state_agent_pid= + cleanup() { + [ -z "$kvcr_pid" ] || kill -TERM "$kvcr_pid" 2>/dev/null || true + [ -z "$state_agent_pid" ] || kill -TERM "$state_agent_pid" 2>/dev/null || true + [ -z "$kvcr_pid" ] || wait "$kvcr_pid" 2>/dev/null || true + [ -z "$state_agent_pid" ] || wait "$state_agent_pid" 2>/dev/null || true + } + trap cleanup EXIT INT TERM + + python3 -m kvcr.kvcr_service \ + --socket-path /run/kvcr/memory.sock \ + --pool-dir /dev/shm/kvcr \ + --guard-count 1 \ + --pool-sizes-gb 2 \ + --compatibility-digest "${DYNAMO_KVCR_COMPATIBILITY_DIGEST}" & + kvcr_pid=$! + if [ "$POD_INDEX" = "0" ]; then + env DYN_NAMESPACE="$state_namespace" \ + DYN_HEALTH_CHECK_ENABLED=false \ + python3 -m dynamo.kv_state_agent \ + --max-slots "$KVCR_CACHE_SLOT_COUNT" & + state_agent_pid=$! + wait -n "$kvcr_pid" "$state_agent_pid" + else + wait "$kvcr_pid" + fi + command: + - /bin/bash + - -c + env: + - name: CONTAINER_NAME + value: kvcr-services + - name: DYN_COMPONENT + value: kv_state_agent + - name: DYN_DISCOVERY_BACKEND + value: kubernetes + - name: DYN_KUBE_DISCOVERY_MODE + value: container + - name: DYN_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.labels['nvidia.com/dynamo-namespace'] + - name: DYN_NAMESPACE_WORKER_SUFFIX + valueFrom: + fieldRef: + fieldPath: metadata.labels['nvidia.com/dynamo-worker-hash'] + - name: DYN_SYSTEM_PORT + value: "9091" + - name: KVCR_CACHE_SLOT_COUNT + value: "2" + - name: POD_INDEX + valueFrom: + fieldRef: + fieldPath: metadata.labels['grove.io/podclique-pod-index'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + - name: UCX_TLS + value: rc_x,cuda + - name: UCX_NET_DEVICES + value: ${DYNAMO_UCX_NET_DEVICES} + image: ${DYNAMO_VLLM_IMAGE} + livenessProbe: + exec: + command: + - python3 + - -c + - import os,socket,urllib.request; s=socket.socket(socket.AF_UNIX); s.settimeout(1); s.connect('/run/kvcr/memory.sock'); s.close(); os.environ['POD_INDEX'] != '0' or urllib.request.urlopen('http://127.0.0.1:9091/live', timeout=1).read() + failureThreshold: 3 + periodSeconds: 5 + timeoutSeconds: 4 + name: kvcr-services + readinessProbe: + exec: + command: + - python3 + - -c + - import os,socket,urllib.request; s=socket.socket(socket.AF_UNIX); s.settimeout(1); s.connect('/run/kvcr/memory.sock'); s.close(); os.environ['POD_INDEX'] != '0' or urllib.request.urlopen('http://127.0.0.1:9091/live', timeout=1).read() + failureThreshold: 3 + periodSeconds: 5 + timeoutSeconds: 4 + resources: + limits: + ${DYNAMO_RDMA_RESOURCE}: "1" + memory: 4Gi + requests: + ${DYNAMO_RDMA_RESOURCE}: "1" + cpu: "1" + memory: 3Gi + securityContext: + capabilities: + add: + - IPC_LOCK + startupProbe: + exec: + command: + - python3 + - -c + - import os,socket,urllib.request; s=socket.socket(socket.AF_UNIX); s.settimeout(1); s.connect('/run/kvcr/memory.sock'); s.close(); os.environ['POD_INDEX'] != '0' or urllib.request.urlopen('http://127.0.0.1:9091/live', timeout=1).read() + failureThreshold: 60 + periodSeconds: 2 + timeoutSeconds: 4 + volumeMounts: + - mountPath: /run/kvcr + name: kvcr-socket + - mountPath: /dev/shm/kvcr + name: kvcr-memory + tolerations: + - effect: NoSchedule + key: nvidia.com/gpu + operator: Exists + volumes: + - emptyDir: {} + name: kvcr-socket + - emptyDir: + medium: Memory + sizeLimit: 3Gi + name: kvcr-memory + replicas: 2 + type: worker diff --git a/examples/backends/vllm/deploy/kvcr/agg.yaml b/examples/backends/vllm/deploy/kvcr/agg.yaml new file mode 100644 index 000000000000..94acb29e7411 --- /dev/null +++ b/examples/backends/vllm/deploy/kvcr/agg.yaml @@ -0,0 +1,199 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + annotations: + nvidia.com/dynamo-discovery-backend: etcd + name: vllm-agg-kvcr +spec: + components: + - name: Frontend + podTemplate: + spec: + containers: + - env: + - name: DYN_ROUTER_MODE + value: kv + image: ${DYNAMO_VLLM_IMAGE} + name: main + replicas: 1 + type: frontend + - name: worker + podTemplate: + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: nvidia.com/dynamo-component + operator: In + values: + - worker + - key: nvidia.com/dynamo-graph-deployment-name + operator: In + values: + - vllm-agg-kvcr + topologyKey: kubernetes.io/hostname + containers: + - args: + - | + set -euo pipefail + state_namespace=$DYN_NAMESPACE + if [ -n "${DYN_NAMESPACE_WORKER_SUFFIX:-}" ]; then + state_namespace="${state_namespace}-${DYN_NAMESPACE_WORKER_SUFFIX}" + fi + + state_agent_pid= + vllm_pid= + cleanup() { + [ -z "$state_agent_pid" ] || kill -TERM "$state_agent_pid" 2>/dev/null || true + [ -z "$vllm_pid" ] || kill -TERM "$vllm_pid" 2>/dev/null || true + [ -z "$state_agent_pid" ] || wait "$state_agent_pid" 2>/dev/null || true + [ -z "$vllm_pid" ] || wait "$vllm_pid" 2>/dev/null || true + } + trap cleanup EXIT INT TERM + + if [ "$POD_INDEX" = "0" ]; then + env -u DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS \ + DYN_COMPONENT=kv_state_agent \ + DYN_DISCOVERY_BACKEND=etcd \ + DYN_HEALTH_CHECK_ENABLED=false \ + DYN_NAMESPACE="$state_namespace" \ + DYN_SYSTEM_PORT=9091 \ + python3 -m dynamo.kv_state_agent \ + --max-slots "$KVCR_CACHE_SLOT_COUNT" & + state_agent_pid=$! + + state_agent_ready=false + for _ in $(seq 1 60); do + if python3 -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:9091/live', timeout=1).read()" >/dev/null 2>&1; then + state_agent_ready=true + break + fi + sleep 1 + done + if [ "$state_agent_ready" != true ]; then + echo "KV state agent did not become ready" >&2 + exit 1 + fi + fi + + kv_transfer_config=$( + python3 - <<'PY' + import json + import os + + def cache_owner_id(): + raw_slot = os.environ["KVCR_CACHE_SLOT"] + raw_count = os.environ["KVCR_CACHE_SLOT_COUNT"] + if not raw_slot.isdecimal() or not raw_count.isdecimal(): + raise SystemExit("KVCR cache slot and count must be decimal integers") + slot = int(raw_slot) + slot_count = int(raw_count) + if slot_count <= 0 or slot >= slot_count: + raise SystemExit( + f"KVCR cache slot {slot} is outside [0, {slot_count})" + ) + return ( + "01010101010101010101010101010101:" + "02020202020202020202020202020202/" + f"0303030303030303/{slot:032x}" + ) + + print(json.dumps({ + "kv_connector": "OffloadingConnector", + "kv_role": "kv_both", + "kv_connector_extra_config": { + "cpu_bytes_to_use": 2147483648, + "spec_name": "TieringOffloadingSpec", + "self_describing_kv_events": True, + "dynamo_state_agent": { + "raw_advertise_host": os.environ["POD_IP"], + "cache_owner_ids": {"0": cache_owner_id()}, + }, + "secondary_tiers": [{ + "type": "kvcr", + "secondary_g2_slots": 1024, + "router_capabilities": ["router_hint"], + "control_host": "0.0.0.0", + "control_ports": [23280], + "control_advertise_host": os.environ["POD_IP"], + "enable_telemetry": True, + }], + }, + })) + PY + ) + python3 -m dynamo.vllm \ + --model Qwen/Qwen3-0.6B \ + --kv-transfer-config "$kv_transfer_config" \ + --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:23080","enable_kv_cache_events":true}' & + vllm_pid=$! + if [ -n "$state_agent_pid" ]; then + wait -n "$state_agent_pid" "$vllm_pid" + else + wait "$vllm_pid" + fi + command: + - /bin/bash + - -c + env: + - name: DYN_DISCOVERY_BACKEND + value: etcd + - name: DYN_SYSTEM_PORT + value: "9090" + - name: KVCR_CACHE_SLOT + valueFrom: + fieldRef: + fieldPath: metadata.labels['grove.io/podclique-pod-index'] + - name: KVCR_CACHE_SLOT_COUNT + value: "2" + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_INDEX + valueFrom: + fieldRef: + fieldPath: metadata.labels['grove.io/podclique-pod-index'] + - name: PYTHONHASHSEED + value: "0" + - name: UCX_TLS + value: rc_x,cuda + - name: UCX_NET_DEVICES + value: ${DYNAMO_UCX_NET_DEVICES} + envFrom: + - secretRef: + name: hf-token-secret + image: ${DYNAMO_VLLM_IMAGE} + name: main + resources: + limits: + ${DYNAMO_RDMA_RESOURCE}: "1" + nvidia.com/gpu: "1" + requests: + ${DYNAMO_RDMA_RESOURCE}: "1" + ephemeral-storage: 2Gi + nvidia.com/gpu: "1" + securityContext: + capabilities: + add: + - IPC_LOCK + workingDir: /workspace/examples/backends/vllm + tolerations: + - effect: NoSchedule + key: nvidia.com/gpu + operator: Exists + replicas: 2 + type: worker diff --git a/examples/backends/vllm/deploy/kvcr/deploy.sh b/examples/backends/vllm/deploy/kvcr/deploy.sh new file mode 100755 index 000000000000..495903624fe3 --- /dev/null +++ b/examples/backends/vllm/deploy/kvcr/deploy.sh @@ -0,0 +1,76 @@ +#!/bin/sh +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +set -eu + +: "${DYNAMO_VLLM_IMAGE:?set DYNAMO_VLLM_IMAGE to a KVCR-capable image}" +: "${DYNAMO_UCX_NET_DEVICES:?set DYNAMO_UCX_NET_DEVICES to the GPU-local UCX device}" + +DYNAMO_RDMA_RESOURCE=${DYNAMO_RDMA_RESOURCE:-rdma/shared_ib} +KVCR_MEMORY_SERVICE_ENABLED=${KVCR_MEMORY_SERVICE_ENABLED:-false} +NAMESPACE=${NAMESPACE:-default} +export DYNAMO_KVCR_COMPATIBILITY_DIGEST DYNAMO_RDMA_RESOURCE +export DYNAMO_UCX_NET_DEVICES DYNAMO_VLLM_IMAGE + +script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +case "$KVCR_MEMORY_SERVICE_ENABLED" in + false) + manifest=$script_dir/agg.yaml + deployment_name=vllm-agg-kvcr + ;; + true) + manifest=$script_dir/agg-memory-service.yaml + deployment_name=vllm-agg-kvcr-memory-service + : "${DYNAMO_KVCR_COMPATIBILITY_DIGEST:?set a versioned KVCR compatibility value}" + case "$DYNAMO_KVCR_COMPATIBILITY_DIGEST" in + *[!A-Za-z0-9._:/-]*) + echo "DYNAMO_KVCR_COMPATIBILITY_DIGEST contains an unsupported character" >&2 + exit 2 + ;; + esac + ;; + *) + echo "KVCR_MEMORY_SERVICE_ENABLED must be true or false" >&2 + exit 2 + ;; +esac + +render() { + substitution_vars='${DYNAMO_VLLM_IMAGE} ${DYNAMO_RDMA_RESOURCE}' + substitution_vars="$substitution_vars "'${DYNAMO_UCX_NET_DEVICES}' + substitution_vars="$substitution_vars "'${DYNAMO_KVCR_COMPATIBILITY_DIGEST}' + envsubst "$substitution_vars" < "$manifest" +} + +case "${1:-}" in + --render-only) + render + ;; + "") + if ! kubectl api-resources --api-group=grove.io -o name 2>/dev/null \ + | grep -qx 'podcliquesets.grove.io'; then + echo "The KVCR examples require a Dynamo operator with Grove enabled" >&2 + exit 1 + fi + render | kubectl apply -n "$NAMESPACE" -f - + provider= + for _ in $(seq 1 20); do + provider=$(kubectl get dynamographdeployment "$deployment_name" \ + -n "$NAMESPACE" \ + -o jsonpath='{.metadata.annotations.nvidia\.com/workload-provider}' \ + 2>/dev/null || true) + [ -z "$provider" ] || break + sleep 1 + done + if [ "$provider" != grove ]; then + echo "The operator selected '${provider:-unknown}', not Grove;" \ + "DGD $NAMESPACE/$deployment_name remains applied" >&2 + exit 1 + fi + ;; + *) + echo "usage: $0 [--render-only]" >&2 + exit 2 + ;; +esac diff --git a/pyproject.toml b/pyproject.toml index ee0647c633ef..02aca2a7330d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -364,6 +364,7 @@ markers = [ "framework_only: marks standard framework deployment tests (vllm, sglang, trtllm, triton)", "framework_with_gaie: marks tests for GAIE (Gateway API Inference Extension) deployment", "framework_with_efa: marks deployment tests that require an EFA-capable cluster and an -efa image", + "framework_with_kvcr: marks deployment tests that require a KVCR-capable image and multi-host RDMA", "snapshot_restore: marks standalone Snapshot checkpoint/restore deployment tests", "unified: marks common backend-interface e2e tests (BaseEngine + Worker)", # Built-in markers diff --git a/tests/conftest.py b/tests/conftest.py index 58277b55dbeb..216658cf4c02 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -240,6 +240,11 @@ def pytest_configure(config: pytest.Config) -> None: "framework_with_efa: marks deployment tests that require an EFA-capable " "cluster and an -efa image", ) + config.addinivalue_line( + "markers", + "framework_with_kvcr: marks deployment tests that require a KVCR-capable " + "image and multi-host RDMA", + ) models_dir = config.getoption("--models-dir", default=None) if models_dir and not Path(models_dir).is_dir(): diff --git a/tests/deploy/test_kvcr_guard.py b/tests/deploy/test_kvcr_guard.py new file mode 100644 index 000000000000..81761b43c039 --- /dev/null +++ b/tests/deploy/test_kvcr_guard.py @@ -0,0 +1,631 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Live-cluster KVCR Guard resiliency verification. + +This test is intentionally outside the generic deployment matrix. It needs a +KVCR-capable image, two GPU nodes, and a real RDMA resource. Run it explicitly: + + DYNAMO_UCX_NET_DEVICES=mlx5_0:1 \ + DYNAMO_KVCR_COMPATIBILITY_DIGEST=qwen3-0.6b-example-v1 \ + python3 -m pytest tests/deploy/test_kvcr_guard.py \ + -m framework_with_kvcr --image= --namespace= \ + --skip-service-restart -v -s + +The test renders the supported memory-service example, preserves phase logs, +kills only one vLLM EngineCore, and proves that the surviving engine retrieves +the prefix from the failed engine's KVCR Guard over UCX RDMA. +""" + +import json +import logging +import os +import re +import shutil +import subprocess +import time +from pathlib import Path + +import pytest +import yaml + +from tests.deploy.dgd_utils import ( + DeploymentSpec, + ManagedDeployment, + validate_chat_response, +) +from tests.utils.client import send_request, wait_for_model_availability +from tests.utils.prometheus import sum_metric_samples + +logger = logging.getLogger(__name__) + +MODEL = "Qwen/Qwen3-0.6B" +WORKER = "worker" +MAIN = "main" +KVCR_SERVICES = "kvcr-services" +READINESS_TIMEOUT = 900 +FAILURE_TIMEOUT = 240 +KUBECTL_TIMEOUT = 60 +RENDER_TIMEOUT = 30 +TRANSFER_BLOCKS = "vllm:kvcr_transfer_blocks_total" +TIER_READ_BYTES = "vllm:kv_offload_tiering_read_bytes_total" +TIER_WRITE_BYTES = "vllm:kv_offload_tiering_write_bytes_total" +PROMPT_TOKENS = "vllm:prompt_tokens_by_source_total" +GUARD_INITIALIZED = "Initialized NIXL agent: KVCR-Guard-" +# Large enough to make the transfer visible, while remaining comfortably below +# the small model's context limit and the example's 2 GiB host-memory pool. +LONG_PREFIX = ( + "KVCR resiliency validation preserves this numbered cache prefix. " * 600 + + "Reply with one short sentence confirming that the prefix was received." +) + + +def _kubectl( + namespace: str, + *args: str, + check: bool = True, +) -> subprocess.CompletedProcess[str]: + return subprocess.run( + ["kubectl", "-n", namespace, *args], + check=check, + capture_output=True, + text=True, + timeout=KUBECTL_TIMEOUT, + ) + + +def _exec( + namespace: str, + pod_name: str, + container: str, + *command: str, + check: bool = True, +) -> subprocess.CompletedProcess[str]: + return _kubectl( + namespace, + "exec", + pod_name, + "-c", + container, + "--", + *command, + check=check, + ) + + +def _pod_json(namespace: str, pod_name: str) -> dict: + result = _kubectl(namespace, "get", "pod", pod_name, "-o", "json") + return json.loads(result.stdout) + + +def _container_status(namespace: str, pod_name: str, container: str) -> dict: + pod = _pod_json(namespace, pod_name) + statuses = {status["name"]: status for status in pod["status"]["containerStatuses"]} + return statuses[container] + + +def _metrics(namespace: str, pod_name: str, system_port: int) -> str: + snippet = ( + "import urllib.request;" + "print(urllib.request.urlopen(" + f"'http://127.0.0.1:{system_port}/metrics',timeout=10).read().decode())" + ) + return _exec(namespace, pod_name, MAIN, "python3", "-c", snippet).stdout + + +def _metric_delta( + before: str, + after: str, + name: str, + labels: dict[str, str] | None = None, +) -> float: + return sum_metric_samples(after, name, labels) - sum_metric_samples( + before, name, labels + ) + + +def _logs(namespace: str, pod_name: str, container: str) -> str: + return _kubectl( + namespace, + "logs", + pod_name, + "-c", + container, + "--tail=20000", + ).stdout + + +def _rdma_counter( + namespace: str, + pod_name: str, + container: str, + device_port: str, + counter: str, +) -> int: + device, port = device_port.split(":", 1) + port_path = f"/host/sys/class/infiniband/{device}/ports/{port}" + state_path = f"{port_path}/state" + counter_path = f"{port_path}/counters/{counter}" + state = _exec(namespace, pod_name, container, "cat", state_path).stdout.strip() + assert state == "4: ACTIVE", f"{device_port} is not active: {state}" + result = _exec(namespace, pod_name, container, "cat", counter_path) + return int(result.stdout.strip()) * 4 + + +def _wait_until(predicate, description: str, timeout: int) -> None: + deadline = time.monotonic() + timeout + last_error: subprocess.CalledProcessError | subprocess.TimeoutExpired | None = None + while time.monotonic() < deadline: + try: + if predicate(): + return + except (subprocess.CalledProcessError, subprocess.TimeoutExpired) as error: + last_error = error + time.sleep(2) + detail = "" + if last_error is not None: + stderr = last_error.stderr or "" + stdout = last_error.stdout or "" + detail = f": {stderr.strip() or stdout.strip() or last_error}" + raise AssertionError( + f"Timed out waiting for {description} after {timeout}s{detail}" + ) + + +def _capture_workers(deployment: ManagedDeployment, pods: list, suffix: str) -> None: + for pod in pods: + deployment.get_pod_manifest_logs_metrics(WORKER, pod, suffix) + + +def _render_manifest(tmp_path: Path, image: str) -> Path: + repo_root = Path(__file__).resolve().parents[2] + deploy_script = repo_root / "examples/backends/vllm/deploy/kvcr/deploy.sh" + env = os.environ.copy() + env["DYNAMO_VLLM_IMAGE"] = image + env["KVCR_MEMORY_SERVICE_ENABLED"] = "true" + result = subprocess.run( + [str(deploy_script), "--render-only"], + check=True, + capture_output=True, + env=env, + text=True, + timeout=RENDER_TIMEOUT, + ) + manifest = yaml.safe_load(result.stdout) + worker = next( + component + for component in manifest["spec"]["components"] + if component["name"] == WORKER + ) + pod_spec = worker["podTemplate"]["spec"] + main = next( + container for container in pod_spec["containers"] if container["name"] == MAIN + ) + config_start = "kv_transfer_config=$(" + assert main["args"][0].count(config_start) == 1 + hold_gate = """if [ -e /run/kvcr/hold-engine-start ]; then + echo "Waiting for the KVCR resiliency hold to be removed" +fi +while [ -e /run/kvcr/hold-engine-start ]; do + sleep 1 +done + +""" + main["args"][0] = main["args"][0].replace(config_start, hold_gate + config_start) + pod_spec["volumes"].append( + { + "name": "rdma-counters", + "hostPath": {"path": "/sys", "type": "Directory"}, + } + ) + for container in pod_spec["containers"]: + container["volumeMounts"].append( + { + "name": "rdma-counters", + "mountPath": "/host/sys", + "readOnly": True, + } + ) + manifest_path = tmp_path / "kvcr-memory-service.yaml" + manifest_path.write_text(yaml.safe_dump(manifest, sort_keys=False)) + return manifest_path + + +def _request(url: str) -> str: + payload = { + "model": MODEL, + "messages": [{"role": "user", "content": LONG_PREFIX}], + "max_tokens": 32, + "temperature": 0.0, + "stream": False, + } + response = send_request(url, payload, timeout=120, log_level=logging.DEBUG) + data = validate_chat_response(response, MODEL, min_content_length=1) + return data["choices"][0]["message"]["content"] + + +@pytest.mark.pre_merge +@pytest.mark.unit +@pytest.mark.gpu_0 +def test_rdma_counter_uses_configured_active_port(monkeypatch) -> None: + commands = [] + port_state = {"value": "4: ACTIVE"} + + def fake_exec(*args, **_kwargs): + commands.append(args) + stdout = port_state["value"] if args[-1].endswith("/state") else "1024" + return subprocess.CompletedProcess(args, 0, stdout=stdout, stderr="") + + monkeypatch.setattr(f"{__name__}._exec", fake_exec) + + value = _rdma_counter("test", "worker-0", "main", "mlx5_8:2", "port_rcv_data") + + assert value == 4096 + assert commands[0][-1] == "/host/sys/class/infiniband/mlx5_8/ports/2/state" + assert commands[1][-1] == ( + "/host/sys/class/infiniband/mlx5_8/ports/2/counters/port_rcv_data" + ) + + port_state["value"] = "5: ACTIVE_DEFER" + with pytest.raises(AssertionError, match="mlx5_8:2 is not active"): + _rdma_counter("test", "worker-0", "main", "mlx5_8:2", "port_rcv_data") + + +@pytest.mark.pre_merge +@pytest.mark.unit +@pytest.mark.gpu_0 +@pytest.mark.timeout(90) +@pytest.mark.skipif(shutil.which("envsubst") is None, reason="envsubst is unavailable") +def test_render_manifest_injects_test_only_fault_gate(monkeypatch, tmp_path) -> None: + monkeypatch.setenv("DYNAMO_RDMA_RESOURCE", "rdma/test") + monkeypatch.setenv("DYNAMO_UCX_NET_DEVICES", "mlx5_0:1") + monkeypatch.setenv("DYNAMO_KVCR_COMPATIBILITY_DIGEST", "qwen3-0.6b-example-v1") + + manifest = yaml.safe_load(_render_manifest(tmp_path, "runtime:test").read_text()) + worker = next( + component + for component in manifest["spec"]["components"] + if component["name"] == WORKER + ) + main = next( + container + for container in worker["podTemplate"]["spec"]["containers"] + if container["name"] == MAIN + ) + command = main["args"][0] + + assert command.count("/run/kvcr/hold-engine-start") == 2 + assert command.index("/run/kvcr/hold-engine-start") < command.index( + "kv_transfer_config=$(" + ) + + +@pytest.mark.framework_with_kvcr +@pytest.mark.k8s +@pytest.mark.deploy +@pytest.mark.fault_tolerance +# Nightly is the lifecycle budget. The test remains manual until a dedicated +# framework_with_kvcr two-host RDMA lane is provisioned. +@pytest.mark.nightly +@pytest.mark.e2e +# No framework marker: this is a manual, opt-in two-host RDMA test selected by +# framework_with_kvcr, not by the generic vLLM GPU lanes. +@pytest.mark.gpu_2 +@pytest.mark.slow +@pytest.mark.model(MODEL) +@pytest.mark.timeout(3600) +async def test_kvcr_memory_service_guard_serves_after_engine_restart( + image: str, + namespace: str, + skip_service_restart: bool, + request, + tmp_path: Path, +) -> None: + """Prove a Guard serves remote KV while its local vLLM engine is down.""" + assert image, "--image is required for the KVCR Guard test" + assert namespace, "--namespace is required for the KVCR Guard test" + assert skip_service_restart, ( + "--skip-service-restart is required; this test must not restart shared " + "Dynamo platform services" + ) + assert os.environ.get( + "DYNAMO_KVCR_COMPATIBILITY_DIGEST" + ), "DYNAMO_KVCR_COMPATIBILITY_DIGEST is required" + ucx_device = os.environ.get("DYNAMO_UCX_NET_DEVICES", "") + assert re.fullmatch( + r"mlx5_\d+:\d+", ucx_device + ), "DYNAMO_UCX_NET_DEVICES must name one device and port, e.g. mlx5_0:1" + + deployment_spec = DeploymentSpec(_render_manifest(tmp_path, image)) + deployment_spec.namespace = namespace + logger.info( + "KVCR_TEST start image=%s namespace=%s ucx_device=%s", + image, + namespace, + ucx_device, + ) + + async with ManagedDeployment( + log_dir=request.node.name, + deployment_spec=deployment_spec, + namespace=namespace, + skip_service_restart=skip_service_restart, + readiness_timeout=READINESS_TIMEOUT, + ) as deployment: + pods = deployment.get_pods([WORKER])[WORKER] + assert ( + len(pods) == 2 + ), f"Expected two worker Pods, found {[p.name for p in pods]}" + pods.sort( + key=lambda pod: int( + pod.raw["metadata"]["labels"]["grove.io/podclique-pod-index"] + ) + ) + indices = { + pod.raw["metadata"]["labels"]["grove.io/podclique-pod-index"] + for pod in pods + } + nodes = {pod.raw["spec"]["nodeName"] for pod in pods} + assert indices == {"0", "1"}, f"Unexpected Grove indices: {indices}" + assert len(nodes) == 2, f"Workers must run on separate hosts, found {nodes}" + + gpu_inventory = {} + for pod in pods: + gpu_inventory[pod.name] = _exec( + namespace, pod.name, MAIN, "nvidia-smi", "-L" + ).stdout.strip() + for container in (MAIN, KVCR_SERVICES): + _exec( + namespace, + pod.name, + container, + "bash", + "-c", + "compgen -G '/dev/infiniband/uverbs*' >/dev/null", + ) + logger.info( + "KVCR_TEST topology workers=%s gpus=%s", + {pod.name: pod.raw["spec"]["nodeName"] for pod in pods}, + gpu_inventory, + ) + + frontend = deployment.get_pods([deployment.frontend_service_name])[ + deployment.frontend_service_name + ][0] + port_forward = deployment.port_forward(frontend, deployment_spec.port) + assert port_forward is not None, "Could not port-forward the Dynamo frontend" + base_url = f"http://127.0.0.1:{port_forward.local_port}" + assert wait_for_model_availability( + url=base_url, + endpoint=deployment_spec.endpoint, + model=MODEL, + logger=logger, + max_attempts=30, + ) + request_url = f"{base_url}{deployment_spec.endpoint}" + + before_seed = { + pod.name: _metrics(namespace, pod.name, deployment_spec.system_port) + for pod in pods + } + baseline_content = _request(request_url) + seed_deltas: dict[str, dict[str, float]] = {} + + def source_cache_persisted() -> bool: + for pod in pods: + after = _metrics(namespace, pod.name, deployment_spec.system_port) + seed_deltas[pod.name] = { + "blocks": _metric_delta( + before_seed[pod.name], + after, + TRANSFER_BLOCKS, + {"operation": "local_fill"}, + ), + "bytes": _metric_delta( + before_seed[pod.name], + after, + TIER_WRITE_BYTES, + {"tier": "1:kvcr"}, + ), + } + persisted = [ + name + for name, deltas in seed_deltas.items() + if all(value > 0 for value in deltas.values()) + ] + return len(persisted) == 1 + + _wait_until(source_cache_persisted, "source KVCR cache persistence", 60) + source_name = next( + name + for name, deltas in seed_deltas.items() + if all(value > 0 for value in deltas.values()) + ) + source = next(pod for pod in pods if pod.name == source_name) + target = next(pod for pod in pods if pod.name != source.name) + assert seed_deltas[target.name] == {"blocks": 0.0, "bytes": 0.0}, ( + "The target was unexpectedly seeded by the first request: " f"{seed_deltas}" + ) + logger.info( + "KVCR_TEST seed source=%s target=%s blocks=%d bytes=%d", + source.name, + target.name, + int(seed_deltas[source.name]["blocks"]), + int(seed_deltas[source.name]["bytes"]), + ) + _capture_workers(deployment, pods, ".before-failure") + + main_before = _container_status(namespace, source.name, MAIN) + sidecar_before = _container_status(namespace, source.name, KVCR_SERVICES) + guard_initializations_before = _logs( + namespace, source.name, KVCR_SERVICES + ).count(GUARD_INITIALIZED) + _exec( + namespace, + source.name, + KVCR_SERVICES, + "touch", + "/run/kvcr/hold-engine-start", + ) + kill_result = _exec( + namespace, + source.name, + MAIN, + "pkill", + "-9", + "-f", + "[V]LLM::EngineCore", + check=False, + ) + assert kill_result.returncode == 0, ( + "Could not terminate the source EngineCore: " + f"{kill_result.stderr.strip()}" + ) + + def engine_restarted() -> bool: + return ( + _container_status(namespace, source.name, MAIN)["restartCount"] + >= main_before["restartCount"] + 1 + ) + + _wait_until( + engine_restarted, "the source vLLM container restart", FAILURE_TIMEOUT + ) + _wait_until( + lambda: _logs(namespace, source.name, KVCR_SERVICES).count( + GUARD_INITIALIZED + ) + > guard_initializations_before, + "KVCR Guard NIXL agent initialization", + FAILURE_TIMEOUT, + ) + sidecar_failed = _container_status(namespace, source.name, KVCR_SERVICES) + assert sidecar_failed["restartCount"] == sidecar_before["restartCount"] + assert sidecar_failed["ready"], "KVCR service sidecar became unready" + assert ( + _exec( + namespace, + source.name, + MAIN, + "pgrep", + "-f", + "[V]LLM::EngineCore", + check=False, + ).returncode + != 0 + ), "Source EngineCore restarted despite the hold marker" + _capture_workers(deployment, pods, ".source-failed") + + target_before = _metrics(namespace, target.name, deployment_spec.system_port) + xmit_before = _rdma_counter( + namespace, + source.name, + KVCR_SERVICES, + ucx_device, + "port_xmit_data", + ) + recv_before = _rdma_counter( + namespace, + target.name, + MAIN, + ucx_device, + "port_rcv_data", + ) + recovered_content = _request(request_url) + assert recovered_content == baseline_content + transfer_deltas: dict[str, float] = {} + + def target_metrics_published() -> bool: + target_after = _metrics(namespace, target.name, deployment_spec.system_port) + transfer_deltas.update( + blocks=_metric_delta( + target_before, + target_after, + TRANSFER_BLOCKS, + {"operation": "remote_deliver"}, + ), + tier_bytes=_metric_delta( + target_before, + target_after, + TIER_READ_BYTES, + {"tier": "1:kvcr"}, + ), + external_tokens=_metric_delta( + target_before, + target_after, + PROMPT_TOKENS, + {"source": "external_kv_transfer"}, + ), + ) + return all(value > 0 for value in transfer_deltas.values()) + + _wait_until(target_metrics_published, "target KVCR transfer metrics", 60) + blocks = transfer_deltas["blocks"] + tier_bytes = transfer_deltas["tier_bytes"] + external_tokens = transfer_deltas["external_tokens"] + + xmit_bytes = ( + _rdma_counter( + namespace, + source.name, + KVCR_SERVICES, + ucx_device, + "port_xmit_data", + ) + - xmit_before + ) + recv_bytes = ( + _rdma_counter( + namespace, + target.name, + MAIN, + ucx_device, + "port_rcv_data", + ) + - recv_before + ) + assert xmit_bytes >= tier_bytes, ( + "Source HCA transmit bytes did not cover the KVCR payload: " + f"hca={xmit_bytes}, kvcr={int(tier_bytes)}" + ) + assert recv_bytes >= tier_bytes, ( + "Target HCA receive bytes did not cover the KVCR payload: " + f"hca={recv_bytes}, kvcr={int(tier_bytes)}" + ) + logger.info( + "KVCR_TEST transfer source=%s target=%s blocks=%d bytes=%d " + "external_tokens=%d hca_xmit_bytes=%d hca_recv_bytes=%d", + source.name, + target.name, + int(blocks), + int(tier_bytes), + int(external_tokens), + xmit_bytes, + recv_bytes, + ) + _capture_workers(deployment, pods, ".remote-delivery") + + _exec( + namespace, + source.name, + KVCR_SERVICES, + "rm", + "-f", + "/run/kvcr/hold-engine-start", + ) + _wait_until( + lambda: _container_status(namespace, source.name, MAIN)["ready"], + "the source vLLM container to become ready", + READINESS_TIMEOUT, + ) + logger.info( + "KVCR_TEST result=PASS source_main_restarts=%d " + "source_sidecar_restarts=%d guard_blocks=%d guard_bytes=%d", + _container_status(namespace, source.name, MAIN)["restartCount"] + - main_before["restartCount"], + _container_status(namespace, source.name, KVCR_SERVICES)["restartCount"] + - sidecar_before["restartCount"], + int(blocks), + int(tier_bytes), + ) + _capture_workers(deployment, pods, ".source-recovered") diff --git a/tests/deploy/test_kvcr_manifests.py b/tests/deploy/test_kvcr_manifests.py new file mode 100644 index 000000000000..9e21e0d009fe --- /dev/null +++ b/tests/deploy/test_kvcr_manifests.py @@ -0,0 +1,293 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +import json +import os +import shutil +import subprocess +from pathlib import Path + +import pytest +import yaml + +pytestmark = [ + pytest.mark.unit, + pytest.mark.pre_merge, + pytest.mark.gpu_0, + pytest.mark.timeout(90), +] + +_REPO_ROOT = Path(__file__).resolve().parents[2] +_MANIFEST_DIR = _REPO_ROOT / "examples/backends/vllm/deploy/kvcr" +_MANIFESTS = ("agg.yaml", "agg-memory-service.yaml") + + +def _worker(manifest_name: str) -> dict: + manifest = yaml.safe_load((_MANIFEST_DIR / manifest_name).read_text()) + return next( + component + for component in manifest["spec"]["components"] + if component["name"] == "worker" + ) + + +def _kv_transfer_config_python(command: str) -> str: + marker = "python3 - <<'PY'\n" + start = command.index(marker) + len(marker) + end = command.index("\nPY\n", start) + return command[start:end] + + +@pytest.mark.parametrize("manifest_name", _MANIFESTS) +def test_kvcr_variants_require_two_gpu_rdma_nodes(manifest_name: str) -> None: + worker = _worker(manifest_name) + pod_spec = worker["podTemplate"]["spec"] + main = pod_spec["containers"][0] + + assert worker["replicas"] == 2 + anti_affinity = pod_spec["affinity"]["podAntiAffinity"] + assert anti_affinity["requiredDuringSchedulingIgnoredDuringExecution"] + assert "preferredDuringSchedulingIgnoredDuringExecution" not in anti_affinity + + for resource_class in ("requests", "limits"): + resources = main["resources"][resource_class] + assert resources["nvidia.com/gpu"] == "1" + assert resources["${DYNAMO_RDMA_RESOURCE}"] == "1" + + env = {item["name"]: item.get("value") for item in main["env"]} + assert env["UCX_TLS"] == "rc_x,cuda" + assert env["UCX_NET_DEVICES"] == "${DYNAMO_UCX_NET_DEVICES}" + assert all( + item["name"] != "UCX_PROTO_INFO" + for container in pod_spec["containers"] + for item in container["env"] + ) + assert env["KVCR_CACHE_SLOT_COUNT"] == "2" + slot = next(item for item in main["env"] if item["name"] == "KVCR_CACHE_SLOT") + assert slot["valueFrom"]["fieldRef"]["fieldPath"] == ( + "metadata.labels['grove.io/podclique-pod-index']" + ) + assert "IPC_LOCK" in main["securityContext"]["capabilities"]["add"] + + +@pytest.mark.parametrize("manifest_name", _MANIFESTS) +def test_kvcr_cache_slot_is_validated_and_formatted(manifest_name: str) -> None: + main = _worker(manifest_name)["podTemplate"]["spec"]["containers"][0] + script = _kv_transfer_config_python(main["args"][0]) + env = { + **os.environ, + "KVCR_CACHE_SLOT": "1", + "KVCR_CACHE_SLOT_COUNT": "2", + "POD_IP": "192.0.2.1", + } + + result = subprocess.run( + ["python3", "-c", script], + check=True, + capture_output=True, + env=env, + text=True, + timeout=30, + ) + config = json.loads(result.stdout) + owner = config["kv_connector_extra_config"]["dynamo_state_agent"][ + "cache_owner_ids" + ]["0"] + assert owner.endswith("/00000000000000000000000000000001") + + env["KVCR_CACHE_SLOT"] = "2" + result = subprocess.run( + ["python3", "-c", script], + check=False, + capture_output=True, + env=env, + text=True, + timeout=30, + ) + assert result.returncode != 0 + assert "outside [0, 2)" in result.stderr + + +def test_process_local_variant_couples_state_agent_and_vllm() -> None: + manifest = yaml.safe_load((_MANIFEST_DIR / "agg.yaml").read_text()) + assert ( + manifest["metadata"]["annotations"]["nvidia.com/dynamo-discovery-backend"] + == "etcd" + ) + pod_spec = _worker("agg.yaml")["podTemplate"]["spec"] + main = pod_spec["containers"][0] + command = main["args"][0] + + assert len(pod_spec["containers"]) == 1 + assert "initContainers" not in pod_spec + assert "python3 -m dynamo.kv_state_agent" in command + assert "python3 -m dynamo.vllm" in command + assert 'if [ "$POD_INDEX" = "0" ]' in command + assert "env -u DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS" in command + assert "DYN_DISCOVERY_BACKEND=etcd" in command + assert "DYN_SYSTEM_PORT=9091" in command + assert "DYN_HEALTH_CHECK_ENABLED=false" in command + assert '--max-slots "$KVCR_CACHE_SLOT_COUNT"' in command + assert 'wait -n "$state_agent_pid" "$vllm_pid"' in command + assert "kvcr.kvcr_service" not in command + assert 'case "$POD_INDEX" in' not in command + assert '"cache_owner_ids": {"0": cache_owner_id()}' in command + assert all(item["name"] != "POD_UID" for item in main["env"]) + + assert "startupProbe" not in main + assert "livenessProbe" not in main + assert "readinessProbe" not in main + + +def test_memory_service_variant_keeps_guard_in_sidecar() -> None: + manifest = yaml.safe_load((_MANIFEST_DIR / "agg-memory-service.yaml").read_text()) + assert ( + manifest["metadata"]["annotations"]["nvidia.com/dynamo-kube-discovery-mode"] + == "container" + ) + assert ( + manifest["metadata"]["annotations"]["nvidia.com/dynamo-discovery-backend"] + == "kubernetes" + ) + pod_spec = _worker("agg-memory-service.yaml")["podTemplate"]["spec"] + main, sidecar = pod_spec["containers"] + main_command = main["args"][0] + sidecar_command = sidecar["args"][0] + + assert sidecar["name"] == "kvcr-services" + assert "python3 -m kvcr.kvcr_service" in sidecar_command + assert "python3 -m dynamo.kv_state_agent" in sidecar_command + assert "--guard-count 1" in sidecar_command + assert "--pool-sizes-gb 2" in sidecar_command + assert 'if [ "$POD_INDEX" = "0" ]' in sidecar_command + assert "DYN_HEALTH_CHECK_ENABLED=false" in sidecar_command + assert "DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS" not in sidecar_command + assert all( + item["name"] != "DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS" + for item in sidecar["env"] + ) + assert '--max-slots "$KVCR_CACHE_SLOT_COUNT"' in sidecar_command + assert 'wait -n "$kvcr_pid" "$state_agent_pid"' in sidecar_command + assert '"kvcr_service_socket_path": "/run/kvcr/memory.sock"' in main_command + assert "/run/kvcr/hold-engine-start" not in main_command + assert 'case "$POD_INDEX" in' not in main_command + assert '"cache_owner_ids": {"0": cache_owner_id()}' in main_command + assert all(item["name"] != "POD_UID" for item in main["env"]) + pod_uid = next(item for item in sidecar["env"] if item["name"] == "POD_UID") + assert pod_uid["valueFrom"]["fieldRef"]["fieldPath"] == "metadata.uid" + + for resource_class in ("requests", "limits"): + assert sidecar["resources"][resource_class]["${DYNAMO_RDMA_RESOURCE}"] == "1" + assert "IPC_LOCK" in sidecar["securityContext"]["capabilities"]["add"] + + for container in (main, sidecar): + mounts = {mount["name"] for mount in container["volumeMounts"]} + assert mounts == {"kvcr-memory", "kvcr-socket"} + memory = next( + volume for volume in pod_spec["volumes"] if volume["name"] == "kvcr-memory" + ) + assert memory["emptyDir"]["medium"] == "Memory" + + for probe_name in ("startupProbe", "livenessProbe", "readinessProbe"): + probe = sidecar[probe_name]["exec"]["command"][-1] + assert "/run/kvcr/memory.sock" in probe + assert "9091/live" in probe + assert "os.environ['POD_INDEX'] != '0' or" in probe + + +@pytest.mark.skipif(shutil.which("envsubst") is None, reason="envsubst is unavailable") +@pytest.mark.parametrize("memory_service", ("false", "true")) +def test_deploy_script_renders_selected_variant(memory_service: str) -> None: + env = os.environ.copy() + env.update( + { + "DYNAMO_RDMA_RESOURCE": "rdma/test", + "DYNAMO_UCX_NET_DEVICES": "mlx5_test:1", + "DYNAMO_KVCR_COMPATIBILITY_DIGEST": "qwen3-0.6b-example-v1", + "DYNAMO_VLLM_IMAGE": "runtime:1.4.0@sha256:test", + "KVCR_MEMORY_SERVICE_ENABLED": memory_service, + } + ) + + result = subprocess.run( + [str(_MANIFEST_DIR / "deploy.sh"), "--render-only"], + check=True, + capture_output=True, + env=env, + text=True, + timeout=30, + ) + + rendered = yaml.safe_load(result.stdout) + assert rendered["kind"] == "DynamoGraphDeployment" + containers = [ + container + for component in rendered["spec"]["components"] + for container in component["podTemplate"]["spec"]["containers"] + ] + assert all( + container["image"] == "runtime:1.4.0@sha256:test" for container in containers + ) + worker = next( + component + for component in rendered["spec"]["components"] + if component["name"] == "worker" + ) + for container in worker["podTemplate"]["spec"]["containers"]: + env_by_name = {item["name"]: item.get("value") for item in container["env"]} + assert env_by_name["UCX_NET_DEVICES"] == "mlx5_test:1" + assert container["resources"]["limits"]["rdma/test"] == "1" + if memory_service == "true": + assert result.stdout.count("qwen3-0.6b-example-v1") == 2 + expected_name = ( + "vllm-agg-kvcr-memory-service" if memory_service == "true" else "vllm-agg-kvcr" + ) + assert f"name: {expected_name}" in result.stdout + + +def test_deploy_script_rejects_unknown_argument() -> None: + env = os.environ.copy() + env.update( + { + "DYNAMO_UCX_NET_DEVICES": "mlx5_test:1", + "DYNAMO_VLLM_IMAGE": "runtime:1.4.0@sha256:test", + "KVCR_MEMORY_SERVICE_ENABLED": "false", + } + ) + + result = subprocess.run( + [str(_MANIFEST_DIR / "deploy.sh"), "--render-onyl"], + check=False, + capture_output=True, + env=env, + text=True, + timeout=30, + ) + + assert result.returncode == 2 + assert "usage:" in result.stderr + + +def test_deploy_script_rejects_unsafe_compatibility_digest() -> None: + env = os.environ.copy() + env.update( + { + "DYNAMO_KVCR_COMPATIBILITY_DIGEST": "unsafe value", + "DYNAMO_UCX_NET_DEVICES": "mlx5_test:1", + "DYNAMO_VLLM_IMAGE": "runtime:1.4.0@sha256:test", + "KVCR_MEMORY_SERVICE_ENABLED": "true", + } + ) + + result = subprocess.run( + [str(_MANIFEST_DIR / "deploy.sh"), "--render-only"], + check=False, + capture_output=True, + env=env, + text=True, + timeout=30, + ) + + assert result.returncode == 2 + assert result.stdout == "" + assert "unsupported character" in result.stderr From bbc55cb4094144770009825cd38c7b32617b0fd0 Mon Sep 17 00:00:00 2001 From: Thanaji Rao Thakkalapelli Date: Thu, 17 Sep 2026 13:52:30 -0500 Subject: [PATCH 077/191] feat(omni): add Nemotron Audex speech synthesis to /v1/audio/speech (#12788) Signed-off-by: Thanaji Rao Thakkalapelli --- .../dynamo/common/protocols/audio_protocol.py | 7 + components/src/dynamo/vllm/omni/audex.py | 405 ++++++++++++++++++ .../src/dynamo/vllm/omni/audio_handler.py | 182 ++++---- .../src/dynamo/vllm/omni/engine_inputs.py | 44 ++ .../src/dynamo/vllm/omni/omni_handler.py | 50 +-- .../src/dynamo/vllm/omni/output_formatter.py | 43 +- components/src/dynamo/vllm/omni/utils.py | 89 +++- .../vllm/tests/omni/test_audio_handler.py | 316 ++++++++++++++ .../vllm/tests/omni/test_omni_handler.py | 221 +++++++++- .../vllm/tests/omni/test_output_formatter.py | 153 +++++++ .../fern/pages/recipes/cli-templates/vllm.mdx | 25 ++ .../diffusion/workflows/text-to-audio.md | 39 +- .../backends/vllm/launch/agg_omni_audio.sh | 45 +- lib/llm/src/protocols/openai/audios.rs | 30 ++ lib/llm/src/protocols/openai/audios/nvext.rs | 9 + tests/serve/test_vllm_omni.py | 53 +++ tests/utils/payloads.py | 64 ++- tests/utils/test_audio_speech_payload.py | 222 ++++++++++ 18 files changed, 1873 insertions(+), 124 deletions(-) create mode 100644 components/src/dynamo/vllm/omni/audex.py create mode 100644 components/src/dynamo/vllm/omni/engine_inputs.py create mode 100644 tests/utils/test_audio_speech_payload.py diff --git a/components/src/dynamo/common/protocols/audio_protocol.py b/components/src/dynamo/common/protocols/audio_protocol.py index 17ea95da55d0..9365c9c6dee2 100644 --- a/components/src/dynamo/common/protocols/audio_protocol.py +++ b/components/src/dynamo/common/protocols/audio_protocol.py @@ -27,6 +27,13 @@ class AudioNvExt(BaseModel): leaves the N-2 compatibility window in v1.7. """ + cfg_scale: Optional[float] = None + """Classifier-free guidance strength (Audex only, which is why it is an + extension rather than a top-level OpenAI field; vLLM-Omni likewise takes it + under ``extra_params``). 1.0 disables guidance; 1.5 is the recommended TTS + quality setting, and 3.0 the official TTA setting (applied by default for + text-to-audio).""" + class NvCreateAudioSpeechRequest(BaseModel): """Request for audio speech generation (/v1/audio/speech endpoint). diff --git a/components/src/dynamo/vllm/omni/audex.py b/components/src/dynamo/vllm/omni/audex.py new file mode 100644 index 000000000000..622c9c559053 --- /dev/null +++ b/components/src/dynamo/vllm/omni/audex.py @@ -0,0 +1,405 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Audex (nvidia/Nemotron-Labs-Audex-*) request preparation. + +Owns everything model-specific about an Audex ``/v1/audio/speech`` request so +that ``AudioGenerationHandler`` stays a modality dispatcher: stage detection, +parameter validation, the ChatML prompt that primes codec generation, and the +per-request CFG / RVQ-phase contracts written onto the stage-0 sampling params. + +vLLM-Omni does ship ``AudexAdapter`` / ``AudexTTAAdapter`` under +``entrypoints.openai.tts_adapters``, but they cover only prompt building plus +validation of an ``OpenAICreateSpeechRequest``, and they are constructed with a +``SpeechServingContext`` holding a back-reference to the running +``OmniOpenAIServingSpeech``. The CFG and RVQ contracts are not in the adapters +at all -- they live in ``serving_speech.py`` next to that server. Reusing them +would therefore couple Dynamo to upstream's HTTP protocol and serving objects +for the smaller half of the work. The parts that actually drift with the +checkpoint -- the prompt text, the RVQ phase table, and the snapshot layout -- +are model-owned code under ``model_executor.models.audex``, and this adapter +calls that code directly (see ``_prompt_builders``, ``_tta_rvq_contract``, +``tokenizer``). Revisit if upstream moves the contracts into the adapters. +""" + +import copy +import logging +import os +from dataclasses import dataclass +from typing import Any, Dict, Optional + +from transformers import AutoTokenizer + +try: + # Imported as modules, not symbols: the Audex helpers are looked up as + # attributes at call time so a test can substitute one. + from vllm_omni.model_executor.models.audex import checkpoint as audex_checkpoint + from vllm_omni.model_executor.models.audex import prompt as audex_prompt + from vllm_omni.model_executor.models.audex import tta as audex_tta +except ImportError: + # vllm_omni only ships these in Audex-capable builds. Missing support fails + # the Audex request path (see _require_audex) rather than the import, so + # every other audio model still serves on such a build. + audex_checkpoint = None # type: ignore[assignment] + audex_prompt = None # type: ignore[assignment] + audex_tta = None # type: ignore[assignment] + +from dynamo.common.protocols.audio_protocol import NvCreateAudioSpeechRequest +from dynamo.vllm.omni.utils import engine_model_stages, validate_audio_max_new_tokens + +logger = logging.getLogger(__name__) + +# Audex needs its own prompt format: the thinker consumes a literal ChatML +# prompt whose assistant turn is primed with ```` +# (TTS) or ```` (TTA). A plain text prompt makes the thinker +# emit a text/thinking continuation with zero ```` tokens, so +# stage 0 ships an empty codec payload and the request fails with "Audex thinker +# produced no codec tokens". +# Mirrors vLLM-Omni's Audex adapter ``stage_keys`` in tts_adapters/audex*.py. +TTS_MODEL_STAGES: frozenset = frozenset({"audex_thinker", "audex_omni"}) +TTA_MODEL_STAGES: frozenset = frozenset({"audex_tta_thinker"}) +# The audio-capable ``audex_omni`` thinker is only speech-capable when +# deployed WITH the speech decoder; the thinker-only deployment is text-final. +CODE2WAV_STAGE = "audex_code2wav" + +# The two Audex tasks, and the only values ``model_type()`` returns. Every +# branch below reads "not TTA" as TTS, so these are named rather than spelled +# inline: a typo'd literal would silently select the TTS prompt and codec space. +MODEL_TYPE_TTS = "audex" +MODEL_TYPE_TTA = "audex_tta" +MODEL_TYPES: frozenset = frozenset({MODEL_TYPE_TTS, MODEL_TYPE_TTA}) + +# Classifier-free guidance bounds, mirroring the vLLM-Omni Audex adapters. +# TTS guidance is optional (unguided is the official baseline); TTA guidance is +# effectively mandatory for quality, hence the 3.0 default. +CFG_SCALE_MIN = 1.0 +CFG_SCALE_MAX = 10.0 +TTA_DEFAULT_CFG_SCALE = 3.0 +# Official TTA generation cap, in codec tokens: 4000 tokens is 1000 frames at +# XCodec1's 4 RVQ codebooks per frame. Decode caps the result again — the +# XCodec1 stage keeps at most ``max_tta_frames`` (default 500, roughly 10 s), +# so this bound governs generation length, not output duration. +TTA_CODEC_CAP = 4000 + +# Guidance sharpens the distribution, so the unguided default temperature adds +# excess sampling noise (vLLM-Omni measures a CER win for 0.05 over 0.1 at +# cfg 1.5). +# +# That measurement is 2B-tuned: vLLM-Omni's audex_tts_30b.yaml records 0.1 as +# the 30B-A3B's best guided temperature. Applying 0.05 to both sizes matches +# vLLM-Omni's own behavior, which treats a size-aware value as a known +# follow-up rather than a defect. +GUIDED_TTS_TEMPERATURE = 0.05 + + +def _requested_cfg_scale(req: NvCreateAudioSpeechRequest) -> Optional[float]: + """Return the caller's guidance scale, or None when it was not requested. + + CFG is Audex-only, so it rides in ``nvext`` rather than as a top-level + OpenAI field (vLLM-Omni likewise takes it under ``extra_params``). + """ + return req.nvext.cfg_scale if req.nvext is not None else None + + +def _require_audex(module: Any, name: str) -> Any: + """Return an Audex submodule, or fail the request if the build lacks it. + + RuntimeError (not ImportError) so the handler reports it as a request + error instead of letting it escape as an unhandled exception. + """ + if module is None: + raise RuntimeError( + "This vLLM-Omni build has no Audex support: " + f"vllm_omni.model_executor.models.audex.{name} is unavailable" + ) + return module + + +@dataclass +class AudexPreparedRequest: + """What the handler needs to build ``EngineInputs`` for an Audex request. + + Plays the role of vLLM-Omni's ``tts_adapters.base.PreparedRequest`` without + importing it, and carries only what the handler actually consumes: the + adapter owns the prompt and the stage params, the handler owns the + response-format plumbing that is identical for every audio model. + """ + + prompt: str + sampling_params_list: Optional[list] + + +class AudexRequestAdapter: + """Prepares Audex TTS/TTA requests for the vLLM-Omni engine. + + Held by ``AudioGenerationHandler`` as ``self.audex``. ``model_type()`` + returns None on a non-Audex deployment, which is how the handler decides + whether this adapter owns the request at all. + """ + + def __init__(self, config: Any, engine_client: Any) -> None: + self.config = config + self.engine_client = engine_client + # Lazily-loaded, process-wide caches (see tokenizer/_tta_rvq_contract). + self._tokenizer: Any = None + self._tta_rvq: Optional[Dict[str, Any]] = None + + # -- deployment detection ------------------------------------------------- + + def model_type(self) -> str | None: + """Return ``"audex"``/``"audex_tta"`` for an Audex deployment, else None. + + Mirrors vLLM-Omni's Audex ``stage_serves_speech``: ``audex_omni`` only + serves speech when the code2wav decoder is also deployed (the + thinker-only pipeline is text-final). + + Recomputed per call rather than cached at construction: the engine's + stage list is the source of truth and this is a set build over a + handful of names. + """ + stages = engine_model_stages(self.engine_client) + if stages & TTA_MODEL_STAGES: + return MODEL_TYPE_TTA + for stage in stages & TTS_MODEL_STAGES: + if stage == "audex_omni" and CODE2WAV_STAGE not in stages: + continue + return MODEL_TYPE_TTS + return None + + # -- request preparation -------------------------------------------------- + + def prepare( + self, + req: NvCreateAudioSpeechRequest, + request_id: str | None, + model_type: str, + ) -> AudexPreparedRequest: + """Validate ``req`` and build the Audex prompt plus stage params. + + ``model_type`` is a non-None ``model_type()`` result, passed in by the + caller that already resolved it to decide this adapter owns the request. + It is re-checked against the known task types because every downstream + branch treats "not TTA" as TTS: an unrecognized value would otherwise be + served as TTS, answering with a phase-invalid or wrong-prompt waveform + rather than an error. + + ``request_id`` is the final Dynamo request id; Audex uses it as the CFG + pair id that binds a guided request to its unconditional companion. + """ + if model_type not in MODEL_TYPES: + raise ValueError( + f"unknown Audex model type {model_type!r}; " + f"expected one of {sorted(MODEL_TYPES)}" + ) + + self.validate(req, model_type) + + build_cond, _ = self._prompt_builders(model_type) + cond_prompt = build_cond(req.input) + + logger.info( + "Audex %s request: input='%s...', request_id=%s", + model_type, + req.input[:50], + request_id, + ) + return AudexPreparedRequest( + prompt=cond_prompt, + sampling_params_list=self.sampling_params_list( + req, model_type, cond_prompt, request_id + ), + ) + + def validate(self, req: NvCreateAudioSpeechRequest, model_type: str) -> None: + """Reject unsupported Audex parameters (mirrors the vLLM-Omni adapters). + + Audex has a single built-in voice and no voice cloning, so a caller + asking for a named voice or reference audio must get an explicit error + instead of silently synthesized different-sounding audio. + """ + voice = (req.voice or "").strip().lower() + if voice not in ("", "default"): + if model_type == MODEL_TYPE_TTA: + raise ValueError( + f"Audex TTA generates general audio and has no voices; " + f"got voice={req.voice!r}. Omit 'voice' or pass 'default'." + ) + raise ValueError( + f"Audex has a single built-in voice and no voice cloning; " + f"got voice={req.voice!r}. Omit 'voice' or pass 'default'." + ) + if req.ref_audio is not None or req.ref_text is not None: + raise ValueError( + "Audex does not support reference audio (no voice cloning)." + ) + + cfg_scale = _requested_cfg_scale(req) + if cfg_scale is not None and not (CFG_SCALE_MIN <= cfg_scale <= CFG_SCALE_MAX): + raise ValueError( + f"nvext.cfg_scale must be within [{CFG_SCALE_MIN}, {CFG_SCALE_MAX}]; " + f"got {cfg_scale}. 1.0 disables guidance." + ) + + validate_audio_max_new_tokens(req.max_new_tokens, self.config) + + def sampling_params_list( + self, + req: NvCreateAudioSpeechRequest, + model_type: str, + cond_prompt: str, + request_id: str | None, + ) -> list | None: + """Clone the engine's stage defaults and attach the Audex contracts. + + The engine's ``default_sampling_params_list`` entries are SHARED across + requests, so per-request CFG pair state is written onto deep copies — + mutating the shared defaults would leak one request's pair id into the + next. Returns ``None`` when there is nothing to override, which leaves + the engine on its own defaults; a request that does need an override + fails instead, since the defaults are the only channel for it. + """ + requested_cfg = _requested_cfg_scale(req) + defaults = list(self.engine_client.default_sampling_params_list or []) + if not defaults: + if ( + model_type == MODEL_TYPE_TTA + or req.max_new_tokens is not None + or (requested_cfg is not None and requested_cfg > CFG_SCALE_MIN) + ): + # Dropping the contract here would answer with different-sounding + # audio (unguided, or for TTA a phase-invalid codec stream that + # decode rejects) instead of reporting the broken engine contract. + raise RuntimeError( + "Audex: engine exposed no default_sampling_params_list, so " + "the per-request CFG/RVQ contract cannot be attached" + ) + return None + + params_list = copy.deepcopy(defaults) + stage0 = params_list[0] + + if req.max_new_tokens is not None: + stage0.max_tokens = req.max_new_tokens + + extra_args = getattr(stage0, "extra_args", None) + if extra_args is None: + extra_args = {} + stage0.extra_args = extra_args + + cfg_scale = requested_cfg + if model_type == MODEL_TYPE_TTA: + # The RVQ phase contract gates which codec ids are sampleable per + # position; without it the stream is phase-invalid and decode is + # rejected. TTA guidance defaults on (official setting 3.0). + extra_args["tta_rvq"] = self._tta_rvq_contract() + if cfg_scale is None: + cfg_scale = TTA_DEFAULT_CFG_SCALE + + if cfg_scale is None or cfg_scale <= CFG_SCALE_MIN: + extra_args.pop("cfg_scale", None) + return params_list + + if request_id is None: + # The pair id must be unique per request, and it is the final Dynamo + # request id, which every serving path has. Decoding unguided instead + # would answer a guided request with different-sounding audio, so a + # caller that reached here without an id gets the broken contract + # reported rather than silently downgraded output. + raise RuntimeError( + f"Audex: cfg_scale={cfg_scale} needs a request id to pair the " + "guided and unconditional sequences, but none was supplied" + ) + + _, build_null = self._prompt_builders(model_type) + null_prompt = build_null(cond_prompt, self.tokenizer(model_type)) + if model_type != MODEL_TYPE_TTA: + stage0.temperature = GUIDED_TTS_TEMPERATURE + + extra_args.update( + { + "cfg_scale": cfg_scale, + "cfg_role": "cond", + "cfg_pair_id": request_id, + "cfg_null_prompt": null_prompt, + } + ) + return params_list + + # -- model-owned vLLM-Omni helpers ---------------------------------------- + + @staticmethod + def _prompt_builders(model_type: str) -> tuple: + """Return the (conditional, null) ChatML prompt builders for a task. + + TTS and TTA prime different codec spaces, so each has its own pair of + model-owned builders. + """ + prompt = _require_audex(audex_prompt, "prompt") + + if model_type == MODEL_TYPE_TTA: + return prompt.build_tta_cond_prompt, prompt.build_tta_null_prompt + return prompt.build_cond_prompt, prompt.build_null_prompt + + def _tta_rvq_contract(self) -> Dict[str, Any]: + """Build (once per process) the TTA RVQ phase-mask contract. + + The same dict is handed to every request, unlike the surrounding + sampling params which are deep-copied. That is safe because the + contract is read-only downstream: vLLM-Omni's + ``TTARVQPhaseMaskLogitsProcessor`` copies the scalars into its own + per-sequence state and only reads ``phase_token_ids``. vLLM-Omni's own + adapter shares one cached dict the same way. + """ + if self._tta_rvq is None: + tta = _require_audex(audex_tta, "tta") + phase_token_ids, start_tid, end_tid = tta.build_tta_phase_token_ids( + self.tokenizer(MODEL_TYPE_TTA) + ) + self._tta_rvq = { + "phase_token_ids": phase_token_ids, + "start_tid": start_tid, + "end_tid": end_tid, + "codec_cap": TTA_CODEC_CAP, + # The TTA prompt already ends with . + "start_in_prompt": True, + } + return self._tta_rvq + + def tokenizer(self, model_type: str): + """Load (once per process) the Audex thinker tokenizer. + + Mirrors vLLM-Omni's ``_get_audex_tokenizer``: the checkpoint is a repo + of per-stage subfolders, and the stage's model_config may already point + at the resolved subfolder (joining again would yield a missing path that + transformers then mistakes for a repo id). + + The TTS and TTA thinkers both tokenize with + ``checkpoint_folder_audiogen`` — only the full ``audex_omni`` pipeline + uses ``checkpoint_folder_full``. The snapshot *profile* still differs + between TTS and TTA (it decides which stage weights are fetched), which + is why the two are not interchangeable even though the tokenizer folder + is shared. + """ + if self._tokenizer is None: + checkpoint = _require_audex(audex_checkpoint, "checkpoint") + + # The snapshot profile decides which subset is fetched: "tts" also + # pulls the speech decoder, so it is not interchangeable with "tta". + if "audex_omni" in engine_model_stages(self.engine_client): + profile, folder = "full", "checkpoint_folder_full" + else: + profile = "tta" if model_type == MODEL_TYPE_TTA else "tts" + folder = "checkpoint_folder_audiogen" + + model_path = os.path.normpath(self.engine_client.model_config.model) + if os.path.basename(model_path).startswith("checkpoint_folder"): + root = os.path.dirname(model_path) + else: + root = checkpoint.ensure_audex_snapshot(model_path, profile=profile) + # The checkpoint ships custom code; without trust_remote_code + # transformers prompts on stdin, which would hang the worker. + self._tokenizer = AutoTokenizer.from_pretrained( + os.path.join(root, folder), + trust_remote_code=self.config.engine_args.trust_remote_code, + ) + return self._tokenizer diff --git a/components/src/dynamo/vllm/omni/audio_handler.py b/components/src/dynamo/vllm/omni/audio_handler.py index b84534db8d08..5a81c3b843b6 100644 --- a/components/src/dynamo/vllm/omni/audio_handler.py +++ b/components/src/dynamo/vllm/omni/audio_handler.py @@ -8,7 +8,7 @@ """ import logging -from typing import Any, Dict +from typing import Any, Dict, Union from transformers import AutoTokenizer from vllm_omni.inputs.data import OmniTextPrompt @@ -25,6 +25,9 @@ from dynamo.common.protocols import sanitize_media_passthrough from dynamo.common.protocols.audio_protocol import NvCreateAudioSpeechRequest from dynamo.common.utils.output_modalities import RequestType +from dynamo.vllm.omni.audex import AudexRequestAdapter +from dynamo.vllm.omni.engine_inputs import EngineInputs +from dynamo.vllm.omni.utils import engine_model_stages, validate_audio_max_new_tokens logger = logging.getLogger(__name__) @@ -54,9 +57,21 @@ class AudioGenerationHandler: """Handles audio/TTS request processing for the vLLM-Omni backend. Instantiated by OmniHandler during initialization and held as a - composition attribute (``self._audio_handler``). This keeps + composition attribute (``self.audio``). This keeps audio-specific logic (validation, prompt building, encoding) out of the orchestrator. + + Model-specific request preparation lives outside this class: Audex in + ``omni.audex.AudexRequestAdapter`` (``self.audex``), Qwen3-TTS in the + ``_engine_inputs_tts`` path below. Everything else takes the generic + plain-text prompt. + + TODO: give the model-specific paths one common adapter abstraction — a + ``supports()``/``prepare()`` protocol the handler dispatches over, with + Qwen3-TTS and the generic prompt as implementations alongside Audex. + Detection and preparation are currently spread over ``_is_tts_model``, + ``self.audex.model_type()``, and the branches in ``build_engine_inputs``, + which does not scale to a fourth model family. """ def __init__(self, config, engine_client, media_output_fs, media_output_http_url): @@ -65,6 +80,7 @@ def __init__(self, config, engine_client, media_output_fs, media_output_http_url self.media_output_fs = media_output_fs self.media_output_http_url = media_output_http_url self._tts_tokenizer: Any = None + self.audex = AudexRequestAdapter(config, engine_client) # Cache TTS capabilities from model config at init. self._tts_supported_speakers: set = self._load_supported_speakers() @@ -128,32 +144,9 @@ def _is_tts_model(self) -> bool: Searches for a TTS model_stage in the engine's stage list, stage configs, or model config. Supports multiple vLLM-Omni versions. """ - # Try stage_list - stage_list = getattr(self.engine_client, "stage_list", None) - if stage_list: - for stage in stage_list: - ms = getattr(stage, "model_stage", None) - logger.debug("_is_tts_model: stage=%s model_stage=%s", stage, ms) - if ms in _TTS_MODEL_STAGES: - return True - - # Try stage_configs - stage_configs = getattr(self.engine_client, "stage_configs", None) - if stage_configs: - for cfg in stage_configs: - engine_args = ( - cfg.get("engine_args", {}) - if isinstance(cfg, dict) - else getattr(cfg, "engine_args", {}) - ) - ms = ( - engine_args.get("model_stage") - if isinstance(engine_args, dict) - else getattr(engine_args, "model_stage", None) - ) - logger.debug("_is_tts_model: stage_config model_stage=%s", ms) - if ms in _TTS_MODEL_STAGES: - return True + stages = engine_model_stages(self.engine_client) + if stages & _TTS_MODEL_STAGES: + return True # Try model_config.hf_config.model_type (universal fallback) try: @@ -165,59 +158,82 @@ def _is_tts_model(self) -> bool: logger.debug("_is_tts_model: hf_config fallback failed: %s", e) logger.warning( - "_is_tts_model: could not detect TTS model. " - "stage_list=%s, stage_configs=%s", - stage_list is not None, - stage_configs is not None, + "_is_tts_model: could not detect TTS model. engine model stages=%s", + sorted(stages), ) return False # -- Audio engine input construction -------------------------------------- - async def build_engine_inputs(self, req: NvCreateAudioSpeechRequest): + async def build_engine_inputs( + self, req: NvCreateAudioSpeechRequest, request_id: str | None = None + ) -> EngineInputs: """Build engine inputs for an audio/TTS request. - Two code paths (matching vLLM-Omni serving_speech.py): + Three code paths (matching vLLM-Omni serving_speech.py): * **TTS path** (Qwen3-TTS): ``prompt_token_ids`` + ``additional_information``. + * **Audex path** (delegated to ``self.audex``): literal ChatML prompt + priming codec generation, plus the CFG / RVQ-phase contracts on + stage-0 sampling params. * **Generic audio path** (MiMo-Audio, etc.): plain text prompt. - """ - # Import here to avoid circular dependency - from dynamo.vllm.omni.omni_handler import EngineInputs + Every path ends in ``_engine_inputs``, which owns the response-delivery + fields that are identical for every audio model. + + ``request_id`` is the final Dynamo request id; Audex uses it as the CFG + pair id that binds a guided request to its unconditional companion. + """ if not req.input or not req.input.strip(): raise ValueError("Input text cannot be empty") - output_format = (req.response_format or "wav").lower() + audex_model_type = self.audex.model_type() + if audex_model_type is not None: + # Everything model-specific (validation, ChatML prompt, CFG/RVQ + # contracts) belongs to the adapter; ``audex_model_type`` is the + # resolution made above, so it does not repeat the stage lookup. + # + # ``stream_audio`` stays off: per-payload chunk streaming has not + # been validated for the Audex pipeline, so its requests take the + # aggregate path and the response carries one complete waveform. + # Aggregation itself follows the resolved output kind, not the model + # (see ``utils.audio_output_is_cumulative``). + prepared = self.audex.prepare(req, request_id, audex_model_type) + return self._engine_inputs( + req, + OmniTextPrompt(prompt=prepared.prompt), + sampling_params_list=prepared.sampling_params_list, + ) - # URL delivery, whole-file encoders, and speed adjustment require the - # complete waveform before the worker can emit a response. A missing or - # false capability identifies a legacy frontend that also needs one - # aggregated item. TODO(v1.7): Remove this compatibility check after - # v1.4 leaves the N-2 window. - frontend_accepts_audio_chunks = bool( - req.nvext and req.nvext.frontend_accepts_audio_chunks - ) - returns_audio_bytes = req.data_source != "url" - supports_chunk_encoding = output_format in {"pcm", "wav"} - uses_default_speed = req.speed is None or req.speed == 1.0 - stream_audio = ( - frontend_accepts_audio_chunks - and returns_audio_bytes - and supports_chunk_encoding - and uses_default_speed - ) + stream_audio = self._chunk_streaming_allowed(req) if self._is_tts_model(): return await self._engine_inputs_tts(req, stream_audio=stream_audio) # Generic audio model – plain text prompt (same as image/video) - prompt = OmniTextPrompt(prompt=req.input) logger.info(f"Audio request (generic): input='{req.input[:50]}...'") + return self._engine_inputs( + req, OmniTextPrompt(prompt=req.input), stream_audio=stream_audio + ) + + def _engine_inputs( + self, + req: NvCreateAudioSpeechRequest, + prompt: Union[OmniTextPrompt, Dict[str, Any]], + *, + sampling_params_list: list | None = None, + stream_audio: bool = False, + ) -> EngineInputs: + """Attach the response-delivery fields shared by every audio model. + + The per-model paths above own the prompt and the sampling params; the + delivery contract (request type, data source, codec, speed, chunking) is + the same for all of them and is applied here once. + """ return EngineInputs( prompt=prompt, - sampling_params_list=None, + sampling_params_list=sampling_params_list, request_type=RequestType.AUDIO_GENERATION, response_format=req.data_source, output_format=req.response_format, @@ -225,14 +241,38 @@ async def build_engine_inputs(self, req: NvCreateAudioSpeechRequest): stream_audio=stream_audio, ) + @staticmethod + def _chunk_streaming_allowed(req: NvCreateAudioSpeechRequest) -> bool: + """Whether the worker may emit audio chunks instead of one waveform. + + URL delivery, whole-file encoders, and speed adjustment require the + complete waveform before the worker can emit a response. A missing or + false capability identifies a legacy frontend that also needs one + aggregated item. TODO(v1.7): Remove this compatibility check after + v1.4 leaves the N-2 window. + """ + frontend_accepts_audio_chunks = bool( + req.nvext and req.nvext.frontend_accepts_audio_chunks + ) + returns_audio_bytes = req.data_source != "url" + supports_chunk_encoding = (req.response_format or "wav").lower() in { + "pcm", + "wav", + } + uses_default_speed = req.speed is None or req.speed == 1.0 + return ( + frontend_accepts_audio_chunks + and returns_audio_bytes + and supports_chunk_encoding + and uses_default_speed + ) + # -- Qwen3-TTS-specific helpers ------------------------------------------- async def _engine_inputs_tts( self, req: NvCreateAudioSpeechRequest, *, stream_audio: bool - ): + ) -> EngineInputs: """Build engine inputs for Qwen3-TTS models.""" - from dynamo.vllm.omni.omni_handler import EngineInputs - self._validate_tts_request(req) if req.voice is not None: @@ -281,15 +321,7 @@ async def _engine_inputs_tts( f"task_type={task_type}, prompt_len={estimated_len}" ) - return EngineInputs( - prompt=prompt, - sampling_params_list=None, - request_type=RequestType.AUDIO_GENERATION, - response_format=req.data_source, - output_format=req.response_format, - speed=req.speed or 1.0, - stream_audio=stream_audio, - ) + return self._engine_inputs(req, prompt, stream_audio=stream_audio) def _validate_tts_request(self, req: NvCreateAudioSpeechRequest) -> None: """Validate Qwen3-TTS-specific request parameters.""" @@ -341,17 +373,7 @@ def _validate_tts_request(self, req: NvCreateAudioSpeechRequest) -> None: f"(max {self.config.tts_max_instructions_length} characters)" ) - if req.max_new_tokens is not None: - if req.max_new_tokens < self.config.tts_max_new_tokens_min: - raise ValueError( - f"max_new_tokens must be at least " - f"{self.config.tts_max_new_tokens_min}" - ) - if req.max_new_tokens > self.config.tts_max_new_tokens_max: - raise ValueError( - f"max_new_tokens cannot exceed " - f"{self.config.tts_max_new_tokens_max}" - ) + validate_audio_max_new_tokens(req.max_new_tokens, self.config) async def _resolve_ref_audio(self, ref_audio_str: str) -> tuple: """Download or decode reference audio for voice cloning (Base task).""" diff --git a/components/src/dynamo/vllm/omni/engine_inputs.py b/components/src/dynamo/vllm/omni/engine_inputs.py new file mode 100644 index 000000000000..2b94bb964d5b --- /dev/null +++ b/components/src/dynamo/vllm/omni/engine_inputs.py @@ -0,0 +1,44 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""The engine-input contract shared by every request-building path. + +Lives in its own module, not in ``omni_handler``, so the per-modality builders +(``audio_handler``, and the model-specific adapters behind them) can annotate +what they return without importing the handler that consumes it. +""" + +from dataclasses import dataclass +from typing import Any, Dict, Union + +from vllm.lora.request import LoRARequest +from vllm_omni.inputs.data import OmniTextPrompt + +from dynamo.common.utils.output_modalities import RequestType + + +@dataclass +class EngineInputs: + """Parsed engine inputs ready for AsyncOmni.generate(). + + Attributes: + prompt: OmniTextPrompt dict for the engine. + sampling_params_list: Per-stage sampling parameters, or None for defaults. + request_type: The resolved request type (may differ from the initial parse + when a chat completion request carries video params). + fps: Frames per second, only meaningful for video requests. + response_format: Desired response format (e.g. "url" or "b64_json" for + image requests). None means use the default for the request type. + output_format: The output format to use for the response. + None means use the default for the request type. + """ + + prompt: Union[OmniTextPrompt, Dict[str, Any]] + sampling_params_list: list | None = None + request_type: RequestType = RequestType.CHAT_COMPLETION + fps: int = 0 + speed: float = 1.0 + response_format: str | None = None + output_format: str | None = None + lora_request: LoRARequest | None = None + stream_audio: bool = False diff --git a/components/src/dynamo/vllm/omni/omni_handler.py b/components/src/dynamo/vllm/omni/omni_handler.py index e7dbee1b1bc8..287c921f124b 100644 --- a/components/src/dynamo/vllm/omni/omni_handler.py +++ b/components/src/dynamo/vllm/omni/omni_handler.py @@ -5,7 +5,6 @@ import logging import os import random -from dataclasses import dataclass from types import SimpleNamespace from typing import ( Any, @@ -48,12 +47,17 @@ from dynamo.vllm.handlers import get_lora_manager from dynamo.vllm.omni.audio_handler import AudioGenerationHandler from dynamo.vllm.omni.base_handler import BaseOmniHandler + +# Re-exported: EngineInputs moved to its own module so the per-modality +# builders can annotate it without importing this handler. +from dynamo.vllm.omni.engine_inputs import EngineInputs from dynamo.vllm.omni.output_formatter import ( AudioAggregateState, AudioStreamState, OutputFormatter, ) from dynamo.vllm.omni.utils import ( + audio_output_is_cumulative, build_image_generation_prompt, image_generation_negative_prompt_from_request, image_generation_sampling_overrides, @@ -96,33 +100,6 @@ def _apply_media_passthrough( ) -@dataclass -class EngineInputs: - """Parsed engine inputs ready for AsyncOmni.generate(). - - Attributes: - prompt: OmniTextPrompt dict for the engine. - sampling_params_list: Per-stage sampling parameters, or None for defaults. - request_type: The resolved request type (may differ from the initial parse - when a chat completion request carries video params). - fps: Frames per second, only meaningful for video requests. - response_format: Desired response format (e.g. "url" or "b64_json" for - image requests). None means use the default for the request type. - output_format: The output format to use for the response. - None means use the default for the request type. - """ - - prompt: Union[OmniTextPrompt, Dict[str, Any]] - sampling_params_list: list | None = None - request_type: RequestType = RequestType.CHAT_COMPLETION - fps: int = 0 - speed: float = 1.0 - response_format: str | None = None - output_format: str | None = None - lora_request: LoRARequest | None = None - stream_audio: bool = False - - class OmniHandler(BaseOmniHandler): """Unified handler for multi-stage pipelines using vLLM-Omni. @@ -377,7 +354,7 @@ async def _generate_openai_mode( try: inputs = await self.build_engine_inputs( - parsed_request, request_type, image=image + parsed_request, request_type, image=image, request_id=request_id ) except (ValueError, NotImplementedError, RuntimeError) as e: logger.error(f"Invalid request {request_id}: {e}") @@ -417,8 +394,14 @@ async def _generate_openai_mode( previous_text = "" audio_stream_state = AudioStreamState() if inputs.stream_audio else None + # Read the coerced params, not the request's: the coercion above is what + # decides whether the engine emits disjoint deltas or whole-waveform + # snapshots, so aggregation has to follow its result rather than the + # model's identity. audio_aggregate_state = ( - AudioAggregateState() + AudioAggregateState( + cumulative=audio_output_is_cumulative(inputs.sampling_params_list) + ) if inputs.request_type == RequestType.AUDIO_GENERATION and not inputs.stream_audio else None @@ -608,6 +591,7 @@ async def build_engine_inputs( ], request_type: RequestType, image: PIL.Image.Image | None = None, + request_id: str | None = None, ) -> EngineInputs: """Convert a parsed request into AsyncOmni engine inputs. @@ -616,6 +600,8 @@ async def build_engine_inputs( for image/video/audio requests, or a raw dict for chat completions. request_type: The RequestType determined by parse_request_type. image: Pre-loaded PIL Image for I2V requests (from input_reference). + request_id: Final request id, used by audio models (Audex) that bind + per-request state such as the CFG pair id to it. Returns: EngineInputs ready for engine_client.generate(). @@ -631,7 +617,9 @@ async def build_engine_inputs( return self._engine_inputs_from_video(parsed_request, image=image) elif request_type == RequestType.AUDIO_GENERATION: assert isinstance(parsed_request, NvCreateAudioSpeechRequest) - return await self.audio.build_engine_inputs(parsed_request) + return await self.audio.build_engine_inputs( + parsed_request, request_id=request_id + ) raise ValueError(f"Unknown request type: {request_type}") diff --git a/components/src/dynamo/vllm/omni/output_formatter.py b/components/src/dynamo/vllm/omni/output_formatter.py index 6edff65b0185..abbd5a2b8e7e 100644 --- a/components/src/dynamo/vllm/omni/output_formatter.py +++ b/components/src/dynamo/vllm/omni/output_formatter.py @@ -58,6 +58,16 @@ class AudioAggregateState: emitted_chunks: int = 0 num_channels: int | None = None channel_axis: int | None = None + cumulative: bool = False + """Each payload is a snapshot of the whole waveform decoded so far. + + Set from the output kind the engine was actually given, not from the model: + ``RequestOutputKind.CUMULATIVE`` consolidates the accumulated audio on every + step and drains nothing, so the snapshots must be de-duplicated to the + longest one rather than concatenated, while ``DELTA`` drains what it emits + and yields disjoint pieces that must all be kept. See + ``utils.audio_output_is_cumulative``, which the handler uses to fill this in. + """ class TextFormatter: @@ -325,11 +335,19 @@ async def format( try: start_time = time.time() + # A cumulative payload already carries the earlier frames, so it is + # taken whole and de-duplicated in _append_audio_chunk; tracking the + # newly appended entries would keep only the first snapshot. + chunk_state: AudioStreamState | AudioAggregateState | None + if stream_state is not None: + chunk_state = stream_state + elif aggregate_state is not None and not aggregate_state.cumulative: + chunk_state = aggregate_state + else: + chunk_state = None + audio_np, sample_rate = self._extract_audio_tensor( - mm_output, - chunk_state=( - stream_state if stream_state is not None else aggregate_state - ), + mm_output, chunk_state=chunk_state ) if audio_np.size == 0: return None @@ -420,7 +438,15 @@ def _append_audio_chunk( expected_channel_axis=state.channel_axis, ) self._validate_audio_metadata(state, sample_rate, num_channels, channel_axis) - state.chunks.append(audio_np) + if not state.cumulative: + state.chunks.append(audio_np) + return + + # Snapshots only grow, but keep the longest rather than the latest so a + # truncated trailing payload cannot drop already-decoded audio. + if state.chunks and state.chunks[0].shape[-1] >= audio_np.shape[-1]: + return + state.chunks = [audio_np] @staticmethod def _validate_audio_metadata( @@ -461,6 +487,13 @@ def _extract_audio_tensor( if isinstance(audio_val, list): if chunk_state is not None: + # Slicing by a running count assumes each list *extends* the + # previous one. That holds only while the engine does not drain + # what it emits: a draining (``DELTA``) stage restarts its list + # at index 0, and this would then keep just the tail. Audex + # takes the delta path but yields bare tensors, which skip this + # branch entirely. If a stage ever emits multi-entry lists under + # DELTA, the count has to be per-payload rather than running. new_audio = audio_val[chunk_state.emitted_chunks :] chunk_state.emitted_chunks = len(audio_val) audio_val = new_audio diff --git a/components/src/dynamo/vllm/omni/utils.py b/components/src/dynamo/vllm/omni/utils.py index 1bd27f61892a..b331dba9b816 100644 --- a/components/src/dynamo/vllm/omni/utils.py +++ b/components/src/dynamo/vllm/omni/utils.py @@ -10,7 +10,7 @@ import torch import vllm_omni.config as omni_config import vllm_omni.entrypoints.utils as omni_entrypoint_utils -from vllm.sampling_params import SamplingParams +from vllm.sampling_params import RequestOutputKind, SamplingParams from vllm_omni.distributed.omni_connectors.utils.serialization import OmniSerializer from vllm_omni.entrypoints.stage_utils import shm_read_bytes from vllm_omni.entrypoints.utils import coerce_param_message_types @@ -73,6 +73,93 @@ def streaming_sampling_params( return coerce_param_message_types(list(source or []), is_streaming=True) +def audio_output_is_cumulative(sampling_params_list: list[Any] | None) -> bool: + """Whether each audio payload repeats the whole waveform decoded so far. + + vLLM-Omni's output processor accumulates a stage's multimodal payload and + then branches on the stage's ``output_kind``: under ``DELTA`` it snapshots + and then drains the audio key, so consecutive yields carry *disjoint* + deltas; under ``CUMULATIVE`` it consolidates the accumulation on every step + and drains nothing, so every yield is a snapshot of the whole waveform. + ``FINAL_ONLY`` yields once, which either reading handles identically. + + Aggregation therefore has to follow the output kind actually sent to the + engine rather than the model's identity: concatenating snapshots multiplies + the duration, and de-duplicating deltas drops audio. The audio-producing + stage is the last one, so its params decide. + + With the currently pinned vLLM-Omni this always answers False, and that is + the correct answer: callers pass the list *after* + ``streaming_sampling_params``, whose coercion rewrites every + ``SamplingParams`` to ``DELTA``, and the only other member of + ``OmniSamplingParams`` is ``OmniDiffusionSamplingParams``, which has no + ``output_kind`` field at all. So every audio request is aggregated by + concatenation today. The check stays because it ties aggregation to the + engine's stated contract instead of re-hardcoding an assumption about that + coercion: if a later version stops forcing ``DELTA``, or adds a params type + that carries a kind through, aggregation follows without another audio-loss + bug. ``AudioAggregateState.cumulative`` and the de-duplicating branch it + selects in ``AudioFormatter._append_audio_chunk`` are reachable only through + this function. + """ + if not sampling_params_list: + return False + return ( + getattr(sampling_params_list[-1], "output_kind", None) + == RequestOutputKind.CUMULATIVE + ) + + +def engine_model_stages(engine_client: Any) -> set[str]: + """Collect every ``model_stage`` name the engine exposes. + + Reads the engine's stage list and stage configs, tolerating the several + shapes vLLM-Omni versions use (objects or dicts, ``engine_args`` nested or + flat). + """ + stages: set[str] = set() + + stage_list = getattr(engine_client, "stage_list", None) + if stage_list: + for stage in stage_list: + ms = getattr(stage, "model_stage", None) + if ms: + stages.add(ms) + + stage_configs = getattr(engine_client, "stage_configs", None) + if stage_configs: + for cfg in stage_configs: + engine_args = ( + cfg.get("engine_args", {}) + if isinstance(cfg, dict) + else getattr(cfg, "engine_args", {}) + ) + ms = ( + engine_args.get("model_stage") + if isinstance(engine_args, dict) + else getattr(engine_args, "model_stage", None) + ) + if ms: + stages.add(ms) + + logging.getLogger(__name__).debug("engine model stages: %s", sorted(stages)) + return stages + + +def validate_audio_max_new_tokens(max_new_tokens: int | None, config: Any) -> None: + """Bound a caller's generation length against the worker's audio limits.""" + if max_new_tokens is None: + return + if max_new_tokens < config.tts_max_new_tokens_min: + raise ValueError( + f"max_new_tokens must be at least {config.tts_max_new_tokens_min}" + ) + if max_new_tokens > config.tts_max_new_tokens_max: + raise ValueError( + f"max_new_tokens cannot exceed {config.tts_max_new_tokens_max}" + ) + + def shm_deserialize(shm_meta: dict) -> Any: """Read and deserialize an OmniRequestOutput from shared memory.""" return OmniSerializer.deserialize(shm_read_bytes(shm_meta)) diff --git a/components/src/dynamo/vllm/tests/omni/test_audio_handler.py b/components/src/dynamo/vllm/tests/omni/test_audio_handler.py index 0fbb81da0053..a0d35487e76f 100644 --- a/components/src/dynamo/vllm/tests/omni/test_audio_handler.py +++ b/components/src/dynamo/vllm/tests/omni/test_audio_handler.py @@ -15,11 +15,28 @@ NvCreateAudioSpeechRequest, ) from dynamo.common.utils.output_modalities import RequestType + from dynamo.vllm.omni import audex as audex_module from dynamo.vllm.omni import audio_handler as audio_handler_module from dynamo.vllm.omni.audio_handler import AudioGenerationHandler except ImportError: pytest.skip("vLLM omni dependencies not available", allow_module_level=True) +try: + import vllm_omni.model_executor.models.audex.prompt # noqa: F401 + import vllm_omni.model_executor.models.audex.tta # noqa: F401 + + _AUDEX_AVAILABLE = True +except ImportError: + _AUDEX_AVAILABLE = False + +# The Audex tests exercise vLLM-Omni's model-owned prompt and RVQ builders, +# which only ship in Audex-capable builds. Skip rather than fail on a build +# without them, matching the optional-dependency guard above. +requires_audex = pytest.mark.skipif( + not _AUDEX_AVAILABLE, + reason="vLLM-Omni build has no Audex support (model_executor.models.audex)", +) + pytestmark = [ pytest.mark.unit, pytest.mark.vllm, @@ -203,6 +220,18 @@ def test_tts_prompt_len_falls_back_when_builder_is_unavailable(monkeypatch): assert _make_audio_handler()._estimate_tts_prompt_len({}) == 2048 +def test_audex_request_fails_cleanly_without_audex_support(monkeypatch): + """A build without the Audex modules must report a request error. + + RuntimeError is one of the types the handler turns into an error response, + so the request fails instead of the exception escaping the generator. + """ + monkeypatch.setattr(audex_module, "audex_prompt", None) + + with pytest.raises(RuntimeError, match="no Audex support"): + audex_module.AudexRequestAdapter._prompt_builders(audex_module.MODEL_TYPE_TTS) + + def test_tts_prompt_len_propagates_estimator_errors(monkeypatch): estimator = MagicMock(side_effect=RuntimeError("estimator failed")) monkeypatch.setattr( @@ -294,6 +323,293 @@ async def test_non_streaming_eligibility(self, request_args): assert inputs.stream_audio is False +def _make_audex_handler(*stages, **config_overrides): + """Audio handler whose engine reports the given Audex ``model_stage`` names.""" + handler = _make_audio_handler(**config_overrides) + handler.engine_client.stage_list = [ + SimpleNamespace(model_stage=stage) for stage in stages + ] + handler.engine_client.stage_configs = [] + handler.engine_client.default_sampling_params_list = [ + SimpleNamespace(max_tokens=2048, temperature=0.1, extra_args=None), + SimpleNamespace(max_tokens=8192, temperature=0.0, extra_args=None), + ] + return handler + + +class TestAudexModelDetection: + """Tests for AudexRequestAdapter.model_type.""" + + def test_tts_pipeline_detected(self): + """thinker + code2wav is the speech pipeline.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + assert handler.audex.model_type() == "audex" + + def test_tta_pipeline_detected(self): + """tta_thinker + xcodec is the text-to-audio pipeline.""" + handler = _make_audex_handler("audex_tta_thinker", "audex_xcodec") + assert handler.audex.model_type() == "audex_tta" + + def test_s2s_pipeline_detected(self): + """audex_omni is speech-capable only alongside the code2wav decoder.""" + handler = _make_audex_handler("audex_omni", "audex_code2wav") + assert handler.audex.model_type() == "audex" + + def test_thinker_only_pipeline_is_not_speech(self): + """The thinker-only deployment is text-final: no speech path.""" + handler = _make_audex_handler("audex_omni") + assert handler.audex.model_type() is None + + def test_non_audex_pipeline(self): + """A non-Audex stage name must not take the Audex path.""" + handler = _make_audex_handler("qwen3_tts") + assert handler.audex.model_type() is None + + def test_stage_configs_shapes(self): + """model_stage is read from nested engine_args and from dict configs.""" + handler = _make_audio_handler() + handler.engine_client.stage_list = [] + handler.engine_client.stage_configs = [ + SimpleNamespace(engine_args={"model_stage": "audex_thinker"}), + {"engine_args": {"model_stage": "audex_code2wav"}}, + ] + assert handler.audex.model_type() == "audex" + + def test_prepare_rejects_an_unknown_model_type(self): + """An unrecognized task must fail, not fall through to the TTS branch. + + Every branch in the adapter reads "not TTA" as TTS, so a bad value would + otherwise be served with the wrong prompt and codec space -- audible + garbage rather than an error. + """ + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest(input="Hello world") + + with pytest.raises(ValueError, match="unknown Audex model type"): + handler.audex.prepare(req, "r1", "audex_tts") + + +@requires_audex +class TestAudexEngineInputs: + """Tests for the Audex prompt/param contract.""" + + @pytest.mark.asyncio + async def test_tts_prompt_primes_codec_generation(self): + """The ChatML prompt must prime , not pass raw text. + + A plain text prompt makes the thinker emit a text continuation with + zero codec tokens, which fails the request downstream. + """ + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest(input="Hello world") + inputs = await handler.build_engine_inputs(req, request_id="r1") + + prompt = inputs.prompt["prompt"] + assert prompt != "Hello world" + assert prompt.endswith("") + assert "Hello world" in prompt + assert "<|text to speech|>" in prompt + assert inputs.request_type == RequestType.AUDIO_GENERATION + + @pytest.mark.asyncio + async def test_tts_unguided_by_default(self): + """No cfg_scale means no CFG plumbing (the official TTS baseline).""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest(input="hello") + inputs = await handler.build_engine_inputs(req, request_id="r1") + + stage0 = inputs.sampling_params_list[0] + assert "cfg_scale" not in stage0.extra_args + assert "cfg_pair_id" not in stage0.extra_args + assert stage0.temperature == 0.1 + + @pytest.mark.asyncio + async def test_guided_request_fails_without_engine_sampling_defaults(self): + """The defaults are the only channel for the CFG contract. + + Attaching nothing would answer with unguided audio — a different-sounding + result rather than a reported failure. + """ + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + handler.engine_client.default_sampling_params_list = [] + req = NvCreateAudioSpeechRequest(input="hello", nvext=AudioNvExt(cfg_scale=1.5)) + + with pytest.raises(RuntimeError, match="no default_sampling_params_list"): + await handler.build_engine_inputs(req, request_id="r1") + + @pytest.mark.asyncio + async def test_unguided_request_needs_no_engine_sampling_defaults(self): + """Nothing to override, so the engine keeps its own defaults.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + handler.engine_client.default_sampling_params_list = [] + req = NvCreateAudioSpeechRequest(input="hello") + + inputs = await handler.build_engine_inputs(req, request_id="r1") + assert inputs.sampling_params_list is None + + @pytest.mark.asyncio + async def test_tts_cfg_scale_one_stays_unguided(self): + """cfg_scale=1.0 is a no-op scale, so it must not start a CFG pair.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest(input="hello", nvext=AudioNvExt(cfg_scale=1.0)) + inputs = await handler.build_engine_inputs(req, request_id="r1") + assert "cfg_scale" not in inputs.sampling_params_list[0].extra_args + + @pytest.mark.asyncio + async def test_tts_cfg_attaches_pair_contract(self, monkeypatch): + """Guided requests carry the pair id and a length-matched null prompt.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + monkeypatch.setattr(handler.audex, "tokenizer", lambda model_type: MagicMock()) + import vllm_omni.model_executor.models.audex.prompt as audex_prompt + + monkeypatch.setattr(audex_prompt, "build_null_prompt", lambda cond, tok: "NULL") + + req = NvCreateAudioSpeechRequest(input="hello", nvext=AudioNvExt(cfg_scale=1.5)) + inputs = await handler.build_engine_inputs(req, request_id="r1") + + stage0 = inputs.sampling_params_list[0] + assert stage0.extra_args["cfg_scale"] == 1.5 + assert stage0.extra_args["cfg_role"] == "cond" + assert stage0.extra_args["cfg_pair_id"] == "r1" + assert stage0.extra_args["cfg_null_prompt"] == "NULL" + # Guidance sharpens the distribution, so temperature drops. + assert stage0.temperature == 0.05 + + @pytest.mark.asyncio + async def test_guided_request_fails_without_request_id(self): + """A guided request needs a pair id; decoding unguided would answer it + with different-sounding audio instead of reporting the broken contract. + """ + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest(input="hello", nvext=AudioNvExt(cfg_scale=1.5)) + with pytest.raises(RuntimeError, match="needs a request id"): + await handler.build_engine_inputs(req) + + @pytest.mark.asyncio + async def test_shared_engine_defaults_not_mutated(self): + """Per-request CFG state must not leak into the engine's shared defaults.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + shared = handler.engine_client.default_sampling_params_list + + req = NvCreateAudioSpeechRequest(input="hello", max_new_tokens=64) + inputs = await handler.build_engine_inputs(req, request_id="r1") + + assert inputs.sampling_params_list[0].max_tokens == 64 + assert shared[0].max_tokens == 2048 + assert shared[0].extra_args is None + + @pytest.mark.asyncio + async def test_tta_prompt_and_rvq_contract(self, monkeypatch): + """TTA primes and always attaches the RVQ phase mask.""" + handler = _make_audex_handler("audex_tta_thinker", "audex_xcodec") + monkeypatch.setattr(handler.audex, "tokenizer", lambda model_type: MagicMock()) + import vllm_omni.model_executor.models.audex.prompt as audex_prompt + import vllm_omni.model_executor.models.audex.tta as audex_tta + + monkeypatch.setattr( + audex_tta, "build_tta_phase_token_ids", lambda tok: ([[1], [2]], 10, 11) + ) + monkeypatch.setattr( + audex_prompt, "build_tta_null_prompt", lambda cond, tok: "NULL" + ) + + req = NvCreateAudioSpeechRequest(input="a dog barking") + inputs = await handler.build_engine_inputs(req, request_id="r1") + + assert inputs.prompt["prompt"].endswith("") + assert "<|text to audio|>" in inputs.prompt["prompt"] + + extra = inputs.sampling_params_list[0].extra_args + assert extra["tta_rvq"]["start_tid"] == 10 + assert extra["tta_rvq"]["start_in_prompt"] is True + # TTA guidance is effectively mandatory; the official default is 3.0. + assert extra["cfg_scale"] == 3.0 + assert extra["cfg_pair_id"] == "r1" + + +class TestAudexValidation: + """Audex rejects parameters it cannot honor instead of ignoring them.""" + + @requires_audex + @pytest.mark.asyncio + @pytest.mark.parametrize("voice", [None, "", "default", "DEFAULT"]) + async def test_default_voice_accepted(self, voice): + """An omitted or ``default`` voice names the one built-in voice.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest(input="hello", voice=voice) + inputs = await handler.build_engine_inputs(req, request_id="r1") + assert inputs.prompt["prompt"].endswith("") + + @pytest.mark.asyncio + async def test_named_voice_rejected(self): + """Audex has one built-in voice; a named voice must not be silently ignored.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest(input="hello", voice="vivian") + with pytest.raises(ValueError, match="single built-in voice"): + await handler.build_engine_inputs(req, request_id="r1") + + @pytest.mark.asyncio + async def test_tta_voice_rejected(self): + """Text-to-audio has no voices at all, not even ``default``.""" + handler = _make_audex_handler("audex_tta_thinker", "audex_xcodec") + req = NvCreateAudioSpeechRequest(input="rain", voice="vivian") + with pytest.raises(ValueError, match="no voices"): + await handler.build_engine_inputs(req, request_id="r1") + + @pytest.mark.asyncio + async def test_ref_audio_rejected(self): + """Audex cannot clone a reference voice, so ref_audio is an error.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest( + input="hello", ref_audio="data:audio/wav;base64,AAAA" + ) + with pytest.raises(ValueError, match="reference audio"): + await handler.build_engine_inputs(req, request_id="r1") + + @pytest.mark.asyncio + async def test_cfg_scale_out_of_range_rejected(self): + """cfg_scale outside the supported range fails fast.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest( + input="hello", nvext=AudioNvExt(cfg_scale=50.0) + ) + with pytest.raises(ValueError, match="cfg_scale"): + await handler.build_engine_inputs(req, request_id="r1") + + @pytest.mark.asyncio + async def test_max_new_tokens_out_of_range_rejected(self): + """max_new_tokens above the codec cap fails fast.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest(input="hello", max_new_tokens=99999) + with pytest.raises(ValueError, match="max_new_tokens"): + await handler.build_engine_inputs(req, request_id="r1") + + @pytest.mark.asyncio + async def test_empty_input_rejected(self): + """Whitespace-only input is rejected before the prompt is built.""" + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest(input=" ") + with pytest.raises(ValueError, match="empty"): + await handler.build_engine_inputs(req, request_id="r1") + + @requires_audex + @pytest.mark.asyncio + async def test_audex_never_streams_chunks(self): + """Audex takes the aggregate path even when the frontend accepts chunks. + + Per-payload chunk streaming has not been validated for this pipeline, so + the response carries one complete waveform regardless of the frontend's + advertised capability. + """ + handler = _make_audex_handler("audex_thinker", "audex_code2wav") + req = NvCreateAudioSpeechRequest( + input="hello", + nvext=AudioNvExt(frontend_accepts_audio_chunks=True), + ) + inputs = await handler.build_engine_inputs(req, request_id="r1") + assert inputs.stream_audio is False + + class TestResolveRefAudio: """ref_audio is client-supplied, so every failure must be a clean rejection.""" diff --git a/components/src/dynamo/vllm/tests/omni/test_omni_handler.py b/components/src/dynamo/vllm/tests/omni/test_omni_handler.py index f82000e003d2..4d625589cd25 100644 --- a/components/src/dynamo/vllm/tests/omni/test_omni_handler.py +++ b/components/src/dynamo/vllm/tests/omni/test_omni_handler.py @@ -213,7 +213,11 @@ async def test_audio_generation_delegates_toaudio(self): request_type=RequestType.AUDIO_GENERATION, ) - async def mock_engine_inputs(req): + seen = {} + + async def mock_engine_inputs(req, request_id=None): + """Record the request id the handler forwarded to the audio handler.""" + seen["request_id"] = request_id return expected handler.audio = MagicMock() @@ -221,9 +225,224 @@ async def mock_engine_inputs(req): inputs = await handler.build_engine_inputs( NvCreateAudioSpeechRequest(input="Hello world"), RequestType.AUDIO_GENERATION, + request_id="req-1", ) assert inputs.request_type == RequestType.AUDIO_GENERATION assert inputs.prompt["prompt"] == "Hello world" + # Audex binds its CFG pair id to the final request id. + assert seen["request_id"] == "req-1" + + +def _cumulative_stage_params(): + """A stand-in for stage params that reach the engine asking for snapshots. + + Deliberately not a real ``SamplingParams``: the coercion in + ``streaming_sampling_params`` would rewrite that to ``DELTA``, and no params + type the pinned vLLM-Omni actually ships can carry ``CUMULATIVE`` past it + (see ``utils.audio_output_is_cumulative``). So this pins the *branch* -- + that a cumulative answer de-duplicates rather than concatenates -- not a + reachable deployment. The delta test below is the one guarding production. + """ + return [SimpleNamespace(output_kind=RequestOutputKind.CUMULATIVE)] + + +class TestAggregatedAudioFollowsOutputKind: + """Buffering must follow the output kind the engine was actually given. + + Under ``DELTA`` the output processor drains the audio it emits, so the + payloads are disjoint pieces that must all be kept; under ``CUMULATIVE`` + every payload repeats the whole waveform decoded so far, so they must be + de-duplicated to the longest. Reading the model's identity instead + truncated Audex — whose stages are coerced to ``DELTA`` — to one 100 ms + delta. + """ + + @staticmethod + def _audio_output(samples): + """One streamed audio stage output carrying the given samples.""" + import numpy as np + + return SimpleNamespace( + final_output_type="audio", + multimodal_output={ + "audio": np.asarray(samples, dtype=np.float32), + "sr": 24000, + }, + ) + + async def _run( + self, + handler, + stage_outputs, + *, + sampling_params_list=None, + reuse_formatter=False, + ): + """Drive the handler over ``stage_outputs`` and collect the responses. + + Uses a real OutputFormatter so the buffering path under test is the + production one; only the engine and the abort monitor are stubbed. + ``sampling_params_list`` is what the request carries into the handler, + so it goes through the same streaming coercion a real request does. + ``reuse_formatter`` keeps the formatter from a previous call, so a + second request runs against the state the first one left behind. + """ + from contextlib import asynccontextmanager + + from dynamo.vllm.omni.output_formatter import OutputFormatter + + if not reuse_formatter: + handler.output_formatter = OutputFormatter(model_name="test-model") + + async def fake_generate(**kwargs): + """Replay the scripted stage outputs as the engine's stream.""" + for so in stage_outputs: + yield so + + handler.engine_client.generate = fake_generate + + @asynccontextmanager + async def no_abort_monitor(context, request_id): + """Abort monitor that never fires.""" + yield None + + handler._abort_monitor = no_abort_monitor + handler.config.output_modalities = ["audio"] + handler.audio = MagicMock() + handler.audio.build_engine_inputs = _AsyncReturn( + EngineInputs( + prompt={"prompt": "hi"}, + request_type=RequestType.AUDIO_GENERATION, + sampling_params_list=sampling_params_list, + ) + ) + + return [ + c + async for c in handler._generate_openai_mode( + {"input": "hi"}, MagicMock(), "req-1" + ) + ] + + @staticmethod + def _decode(chunk): + """Read the response's base64 audio back as (samples, sample_rate).""" + import base64 + import io + + import soundfile as sf + + return sf.read(io.BytesIO(base64.b64decode(chunk["data"][0]["b64_json"]))) + + @pytest.mark.asyncio + async def test_delta_payloads_are_all_concatenated(self): + """Every delta must survive: the engine already drained what it emitted. + + This is the Audex shape — its code2wav stage never re-decodes left + context — and the regression the keep-longest branch caused: the client + used to receive only the longest single delta. + """ + handler = _make_handler(stage_types=("llm",)) + chunks = await self._run( + handler, + [ + self._audio_output([]), # streams can open with an empty payload + self._audio_output([0.1] * 1200), + self._audio_output([0.1] * 2400), + ], + sampling_params_list=[SamplingParams()], + ) + + assert len(chunks) == 1 + assert chunks[0]["status"] == "completed" + audio, sr = self._decode(chunks[0]) + assert len(audio) == 3600 + assert sr == 24000 + + @pytest.mark.asyncio + async def test_cumulative_payloads_are_deduplicated(self): + """Snapshots repeat the waveform, so concatenating them triples it.""" + handler = _make_handler(stage_types=("llm",)) + chunks = await self._run( + handler, + [ + self._audio_output([]), + self._audio_output([0.1] * 1200), + self._audio_output([0.1] * 2400), + ], + sampling_params_list=_cumulative_stage_params(), + ) + + assert len(chunks) == 1 + assert chunks[0]["status"] == "completed" + audio, sr = self._decode(chunks[0]) + # The final snapshot verbatim: not the partial one, and not 3600 samples + # of the snapshots concatenated. + assert len(audio) == 2400 + assert sr == 24000 + + @pytest.mark.asyncio + async def test_no_audio_at_all_reports_failure(self): + """Otherwise the client gets a valid but silent, header-only file.""" + handler = _make_handler() + chunks = await self._run(handler, [self._audio_output([])]) + + assert len(chunks) == 1 + assert chunks[0]["status"] == "failed" + + @pytest.mark.asyncio + async def test_missing_audio_stage_output_reports_failure(self): + """A buffered request must not end on an empty stream. + + A thinker-only stream yields no audio-typed output at all, so nothing + is ever buffered and there is no payload to report per chunk. + """ + handler = _make_handler() + chunks = await self._run( + handler, [SimpleNamespace(final_output_type="unknown")] + ) + + assert [c["status"] for c in chunks] == ["failed"] + + @pytest.mark.asyncio + async def test_audio_does_not_leak_into_the_next_request(self): + """The formatter is shared across requests, so its audio must not be. + + Buffering lives in a per-request AudioAggregateState the handler + creates, so a second request through the same formatter must answer + with its own waveform only. Both requests run cumulative with the longer + waveform first on purpose: that is the mode where keep-longest + de-duplication would let the first request's audio win on length alone, + so shared state would otherwise go unnoticed. + """ + import numpy as np + + handler = _make_handler(stage_types=("llm",)) + cumulative = dict(sampling_params_list=_cumulative_stage_params()) + await self._run(handler, [self._audio_output([0.2] * 2400)], **cumulative) + chunks = await self._run( + handler, + [self._audio_output([0.1] * 1200)], + reuse_formatter=True, + **cumulative, + ) + + assert len(chunks) == 1 + audio, _ = self._decode(chunks[0]) + assert len(audio) == 1200 + assert np.allclose(audio, 0.1, atol=1e-3) + + +class _AsyncReturn: + """Awaitable stub that ignores its arguments and returns a fixed value.""" + + def __init__(self, value): + """Store the value every call resolves to.""" + self._value = value + + async def __call__(self, *args, **kwargs): + """Return the fixed value, ignoring the arguments.""" + return self._value class TestI2VEngineInputs: diff --git a/components/src/dynamo/vllm/tests/omni/test_output_formatter.py b/components/src/dynamo/vllm/tests/omni/test_output_formatter.py index 5ea819739c91..104017174df2 100644 --- a/components/src/dynamo/vllm/tests/omni/test_output_formatter.py +++ b/components/src/dynamo/vllm/tests/omni/test_output_formatter.py @@ -736,6 +736,159 @@ async def encode(audio): assert len(channel_major_chunk) == 44 + 8 * 2 * 2 +class TestAudioFormatterCumulativeAggregate: + """A ``CUMULATIVE`` stage emits the waveform repeatedly, each payload a + snapshot of everything decoded so far and some of them empty, so an + ``AudioAggregateState(cumulative=True)`` request must answer from the + longest snapshot rather than from whichever payload arrived last, or from + all of them concatenated. Which requests are cumulative is the handler's + call (see ``utils.audio_output_is_cumulative``); these tests set the flag + directly.""" + + @pytest.fixture + def formatter(self): + """A bare AudioFormatter with no media sink configured.""" + return AudioFormatter(model_name="test", media_fs=None, media_http_url=None) + + @staticmethod + def _payload(samples, sr=24000): + """One streamed audio payload holding the given samples.""" + return {"audio": np.asarray(samples, dtype=np.float32), "sr": sr} + + async def _buffer(self, formatter, payloads, *, cumulative=True): + """Feed payloads through format() and return the aggregate state. + + Every buffering call must answer None: the aggregated path emits one + response at the end of the stream, from finish_aggregate. + """ + state = AudioAggregateState(cumulative=cumulative) + for payload in payloads: + response = await formatter.format( + payload, "req-1", audio_aggregate_state=state + ) + assert response is None + return state + + @staticmethod + async def _finish(formatter, state): + """Encode the buffered snapshots as raw PCM (2 bytes per sample).""" + response = await formatter.finish_aggregate("req-1", state, output_format="pcm") + return response, base64.b64decode(response["data"][0]["b64_json"]) + + @pytest.mark.asyncio + async def test_cumulative_snapshots_are_not_concatenated(self, formatter): + """Each payload already contains the earlier audio; joining repeats it.""" + state = await self._buffer( + formatter, [self._payload([0.1, 0.2]), self._payload([0.1, 0.2, 0.3])] + ) + + assert [chunk.shape for chunk in state.chunks] == [(3,)] + _, pcm = await self._finish(formatter, state) + assert len(pcm) == 3 * 2 + + @pytest.mark.asyncio + async def test_incremental_frames_are_still_concatenated(self, formatter): + """The de-duplication is scoped to the cumulative flag. + + Models that emit newly decoded frames keep the concatenating path; + de-duplicating those would silently drop audio. + """ + state = await self._buffer( + formatter, + [self._payload([0.1, 0.2]), self._payload([0.1, 0.2, 0.3])], + cumulative=False, + ) + + assert [chunk.shape for chunk in state.chunks] == [(2,), (3,)] + _, pcm = await self._finish(formatter, state) + assert len(pcm) == 5 * 2 + + @pytest.mark.asyncio + async def test_cumulative_list_payload_is_taken_whole(self, formatter): + """A cumulative list payload must not be sliced by emitted_chunks. + + Tracking the newly appended entries would keep only the first snapshot, + since every later snapshot's new entries are the tail of a waveform the + keep-longest rule then discards. + """ + first = torch.tensor([0.1, 0.2], dtype=torch.float32) + second = torch.tensor([0.3], dtype=torch.float32) + state = await self._buffer( + formatter, + [{"audio": [first], "sr": 24000}, {"audio": [first, second], "sr": 24000}], + ) + + assert state.emitted_chunks == 0 + assert [chunk.shape for chunk in state.chunks] == [(3,)] + + @pytest.mark.asyncio + async def test_empty_payload_does_not_discard_buffered_audio(self, formatter): + """Empty payloads occur mid-stream and carry no waveform.""" + state = await self._buffer( + formatter, [self._payload([0.1, 0.2]), self._payload([])] + ) + + assert [chunk.shape for chunk in state.chunks] == [(2,)] + + @pytest.mark.asyncio + async def test_leading_empty_payload_does_not_become_the_result(self, formatter): + """The first payload of a stream can be the empty one.""" + state = await self._buffer( + formatter, [self._payload([]), self._payload([0.1, 0.2])] + ) + + assert [chunk.shape for chunk in state.chunks] == [(2,)] + + @pytest.mark.asyncio + async def test_shorter_late_payload_cannot_truncate_the_result(self, formatter): + """Snapshots are kept by length, so a short late one cannot win.""" + state = await self._buffer( + formatter, [self._payload([0.1, 0.2, 0.3]), self._payload([0.1])] + ) + + assert [chunk.shape for chunk in state.chunks] == [(3,)] + _, pcm = await self._finish(formatter, state) + assert len(pcm) == 3 * 2 + + @pytest.mark.asyncio + async def test_payload_without_audio_reports_failure(self, formatter): + """A payload carrying no audio key is a broken engine contract.""" + state = AudioAggregateState(cumulative=True) + + response = await formatter.format( + {"sr": 24000}, "req-1", audio_aggregate_state=state + ) + + assert response["status"] == "failed" + assert "No audio data in multimodal_output" in response["error"] + assert state.chunks == [] + + @pytest.mark.asyncio + async def test_buffered_snapshots_encode_to_one_response(self, formatter): + """The buffered snapshots encode to a single completed WAV.""" + state = await self._buffer( + formatter, [self._payload([0.1] * 1200), self._payload([0.1] * 2400)] + ) + + response = await formatter.finish_aggregate("req-1", state, output_format="wav") + audio = base64.b64decode(response["data"][0]["b64_json"]) + + assert response["status"] == "completed" + assert len(response["data"]) == 1 + assert audio.count(b"RIFF") == 1 + assert len(audio) == 44 + 2400 * 2 + + @pytest.mark.asyncio + async def test_no_audio_at_all_is_an_error_not_a_silent_file(self, formatter): + """A header-only file would otherwise be reported as a success.""" + state = await self._buffer(formatter, [self._payload([])]) + + response = await formatter.finish_aggregate("req-1", state) + + assert response["status"] == "failed" + assert "No audio generated" in response["error"] + + # ── OutputFormatter dispatcher ───────────────────────────── diff --git a/docs/fern/pages/recipes/cli-templates/vllm.mdx b/docs/fern/pages/recipes/cli-templates/vllm.mdx index fb5db0dfff91..e17121e02f12 100644 --- a/docs/fern/pages/recipes/cli-templates/vllm.mdx +++ b/docs/fern/pages/recipes/cli-templates/vllm.mdx @@ -948,6 +948,7 @@ The default model is `Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice`. | --- | --- | --- | | `DYN_HTTP_PORT` | `8000` | HTTP port exposed by the Dynamo frontend. | | `DYN_SYSTEM_PORT` | `8081` | System and metrics port for the worker. | +| `MODEL` | `Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice` | Model identifier or path. | **Command-line flags:** `--model` sets the model identifier or path. @@ -957,6 +958,30 @@ The default model is `Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice`. ./launch/agg_omni_audio.sh ``` +The same script serves Nemotron Audex, which runs a two-stage pipeline: stage 0 is the thinker that +emits speech codec tokens, and stage 1 decodes those tokens to a 16 kHz mono waveform. + +```bash +./launch/agg_omni_audio.sh --model nvidia/Nemotron-Labs-Audex-2B +``` + +Audex serves a single built-in voice, so the request contract differs from Qwen3-TTS: the handler +accepts `voice` only when it is omitted or set to `default`, rejects `ref_audio` and `ref_text`, +and accepts an optional `nvext.cfg_scale` for classifier-free guidance. The printed curl example adapts to the selected model. See +[Text-to-Audio](../../use-cases/diffusion/workflows/text-to-audio.md) for the request format. + + +Both Audex checkpoints report the same model type, so the 30B-A3B needs an explicit stage +configuration. Otherwise auto-detection selects the 2B-tuned file. vLLM-Omni ships the +configuration, so resolve it from the installed package and pass it through to the worker: + +```bash +AUDEX_30B_CFG=$(python3 -c 'import pathlib, vllm_omni; print(pathlib.Path(vllm_omni.__file__).parent / "deploy/audex_tts_30b.yaml")') +./launch/agg_omni_audio.sh --model nvidia/Nemotron-Labs-Audex-30B-A3B \ + --stage-configs-path "$AUDEX_30B_CFG" +``` + + [View the launch script.](https://github.com/ai-dynamo/dynamo/blob/main/examples/backends/vllm/launch/agg_omni_audio.sh) diff --git a/docs/fern/pages/use-cases/diffusion/workflows/text-to-audio.md b/docs/fern/pages/use-cases/diffusion/workflows/text-to-audio.md index 77968dab882b..4225d1c7a916 100644 --- a/docs/fern/pages/use-cases/diffusion/workflows/text-to-audio.md +++ b/docs/fern/pages/use-cases/diffusion/workflows/text-to-audio.md @@ -13,6 +13,8 @@ Text-to-audio (TTS) generation runs a vLLM-Omni worker with `--output-modalities |---|---| | `Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice` | Default model; predefined speakers | | `Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign` | Describe a voice via `instructions` | +| `nvidia/Nemotron-Labs-Audex-2B` | Single built-in voice; optional `nvext.cfg_scale` guidance | +| `nvidia/Nemotron-Labs-Audex-30B-A3B` | Same contract as the 2B; needs an explicit stage config | ## Launch @@ -22,6 +24,21 @@ Launch using the provided script with `Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice`: bash examples/backends/vllm/launch/agg_omni_audio.sh ``` +The same script serves Nemotron Audex, which runs a two-stage pipeline: stage 0 is the thinker that emits speech codec tokens, and stage 1 decodes those tokens to a 16 kHz mono waveform. + +```bash +bash examples/backends/vllm/launch/agg_omni_audio.sh --model nvidia/Nemotron-Labs-Audex-2B +``` + +Both Audex checkpoints report the same model type, so the 30B-A3B needs an explicit stage configuration. Otherwise auto-detection selects the 2B-tuned file. vLLM-Omni ships the configuration, so resolve it from the installed package and pass it through to the worker: + +```bash +AUDEX_30B_CFG=$(python3 -c 'import pathlib, vllm_omni; print(pathlib.Path(vllm_omni.__file__).parent / "deploy/audex_tts_30b.yaml")') +bash examples/backends/vllm/launch/agg_omni_audio.sh \ + --model nvidia/Nemotron-Labs-Audex-30B-A3B \ + --stage-configs-path "$AUDEX_30B_CFG" +``` + ## Generate Speech @@ -65,12 +82,27 @@ curl -X POST http://localhost:8000/v1/audio/speech \ }' --output voicedesign.wav ``` + + + +```bash +curl -X POST http://localhost:8000/v1/audio/speech \ + -H "Content-Type: application/json" \ + -d '{ + "model": "nvidia/Nemotron-Labs-Audex-2B", + "input": "Hey, this is generated using Dynamo!", + "nvext": {"cfg_scale": 1.5} + }' --output audex.wav +``` + +Audex serves a single built-in voice, so it accepts `voice` only when omitted or set to `default`, and rejects `ref_audio` and `ref_text` instead of synthesizing a different-sounding result. The Qwen3-TTS fields `language`, `instructions`, and `task_type` do not apply. Omit `nvext.cfg_scale`, or set it to `1.0`, to decode without guidance. + ## Parameters -The `/v1/audio/speech` endpoint follows the [vLLM-Omni](https://docs.vllm.ai/projects/vllm-omni/en/latest/) API format. All TTS-specific parameters are top-level fields: +The `/v1/audio/speech` endpoint follows the [vLLM-Omni](https://docs.vllm.ai/projects/vllm-omni/en/latest/) API format. TTS-specific parameters are top-level fields, except single-model knobs, which ride in `nvext`: Text to synthesize. @@ -105,8 +137,11 @@ The `/v1/audio/speech` endpoint follows the [vLLM-Omni](https://docs.vllm.ai/pro Maximum tokens to generate (1–4096). + + Classifier-free guidance scale for Nemotron Audex (1.0–10.0). Model-specific, so it rides in `nvext` rather than at the top level (vLLM-Omni likewise takes it under `extra_params`). `1.0` disables guidance. Omitting the field decodes unguided on an Audex speech deployment, but an Audex text-to-audio (TTA) deployment falls back to its default of `3.0`. Ignored by other audio models. + -Available voices and languages are loaded dynamically from the model's `config.json` at startup. Non-Qwen3-TTS audio models (e.g., MiMo-Audio) use a generic text prompt and ignore TTS-specific parameters. +Available voices and languages are loaded dynamically from the model's `config.json` at startup. Nemotron Audex builds its own prompt and accepts only `input`, `model`, `response_format`, `speed`, `max_new_tokens`, and `nvext.cfg_scale`; speech models additionally tolerate `voice` when it is omitted or `default`, while an Audex TTA deployment rejects `voice` outright. Other non-Qwen3-TTS audio models (e.g., MiMo-Audio) use a generic text prompt and ignore TTS-specific parameters. > [!NOTE] > Audio streaming (`stream: true`) and the Base task (voice cloning) are not yet supported. diff --git a/examples/backends/vllm/launch/agg_omni_audio.sh b/examples/backends/vllm/launch/agg_omni_audio.sh index 092d8ac17aa5..ea198c39b211 100755 --- a/examples/backends/vllm/launch/agg_omni_audio.sh +++ b/examples/backends/vllm/launch/agg_omni_audio.sh @@ -1,6 +1,27 @@ #!/bin/bash # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 +# +# Aggregated vLLM-Omni text-to-speech. Defaults to Qwen3-TTS; --model also +# selects Nemotron Audex, which runs a 2-stage pipeline (stage 0 thinker emits +# tokens, stage 1 code2wav decodes them to a 16 kHz mono +# waveform): +# +# ./agg_omni_audio.sh --model nvidia/Nemotron-Labs-Audex-2B +# +# Audex has a single built-in voice, so it rejects `voice`/`ref_audio`/ +# `ref_text` rather than silently synthesizing something else, and it is the +# only audio model here that accepts `nvext.cfg_scale` (omit or 1.0 to decode +# unguided). The curl footer below adapts to the selected model. +# +# The 30B-A3B needs an explicit stage config, because both Audex checkpoints +# report model_type nemotron_labs_audex and auto-detection would otherwise pick +# the 2B-tuned yaml. vLLM-Omni ships that config, so resolve it from the +# installed package rather than hardcoding a site-packages path: +# +# AUDEX_30B_CFG=$(python3 -c 'import pathlib, vllm_omni; print(pathlib.Path(vllm_omni.__file__).parent / "deploy/audex_tts_30b.yaml")') +# ./agg_omni_audio.sh --model nvidia/Nemotron-Labs-Audex-30B-A3B \ +# --stage-configs-path "$AUDEX_30B_CFG" set -e trap 'echo Cleaning up...; kill 0' EXIT @@ -9,7 +30,7 @@ SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" source "$SCRIPT_DIR/../../../common/gpu_utils.sh" source "$SCRIPT_DIR/../../../common/launch_utils.sh" -MODEL="Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice" +MODEL="${MODEL:-Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice}" # Parse command line arguments EXTRA_ARGS=() @@ -29,6 +50,22 @@ done HTTP_PORT="${DYN_HTTP_PORT:-8000}" GPU_MEM_ARGS=$(build_vllm_gpu_mem_args) print_launch_banner --no-curl "Launching vLLM-Omni Audio/TTS (1 GPU)" "$MODEL" "$HTTP_PORT" +# Audex rejects 'voice', so print the request body it actually accepts: the +# Qwen3-TTS footer would hand the user a request that fails with HTTP 400. +# Matched case-insensitively: --model may be a local checkpoint path in any +# casing, not just the Hugging Face id. +if [[ "${MODEL,,}" == *audex* ]]; then +print_curl_footer <, + + /// Classifier-free guidance scale (Audex only, hence an extension rather + /// than a top-level OpenAI field). Unset or 1.0 decodes unguided; higher + /// values follow the prompt more closely. Declared here because serde drops + /// unknown `nvext` keys, so without the field the client's value never + /// reaches the worker and guidance is silently never applied. + #[serde(skip_serializing_if = "Option::is_none")] + #[builder(default, setter(strip_option))] + pub cfg_scale: Option, } impl Default for NvExt { diff --git a/tests/serve/test_vllm_omni.py b/tests/serve/test_vllm_omni.py index 7f520c22f237..a2dfec803d45 100644 --- a/tests/serve/test_vllm_omni.py +++ b/tests/serve/test_vllm_omni.py @@ -196,6 +196,59 @@ class VLLMOmniConfig(EngineConfig): ), ], ), + "omni_audex": VLLMOmniConfig( + name="omni_audex", + directory=vllm_dir, + # Audex shares the audio launch script; only the model differs. + script_name="agg_omni_audio.sh", + script_args=["--model", "nvidia/Nemotron-Labs-Audex-2B"], + marks=[ + pytest.mark.gpu_1, + pytest.mark.xpu_1, + pytest.mark.post_merge, + pytest.mark.timeout(1200), + # Profiled with tests/utils/profile_pytest.py on 1x H200: peak + # 117.6 GiB, unchanged at every probed KV cap (9-75 GiB). vLLM-Omni's + # audex_tts.yaml sizes each stage as a fraction of *total* device + # memory (0.4 for the thinker, 0.25 for code2wav) and the aggregated + # worker forwards no engine memory args to AsyncOmni, so neither + # --kv-cache-memory-bytes nor --gpu-memory-utilization can cap the + # footprint from the CLI. Both VRAM markers are therefore omitted: + # the H200 number is card-relative, not a portable requirement. + # Re-enable once per-stage memory overrides are plumbed through + # omni's _build_omni_kwargs, then re-profile on a 24 GiB card. + pytest.mark.skip( + reason="Audex peaked at 117.6 GiB on 1x H200; the shipped stage " + "config sizes stages as a fraction of total device memory and " + "the worker cannot cap it, so it exceeds CI capacity (24GB)" + ), + ], + model="nvidia/Nemotron-Labs-Audex-2B", + request_payloads=[ + AudioSpeechPayload( + body={ + "model": "nvidia/Nemotron-Labs-Audex-2B", + "input": "Hey, this is generated using Dynamo!", + # Audex is the only audio model that takes cfg_scale, so it + # travels in nvext rather than as an OpenAI field: unknown + # keys are dropped silently, so a plumbing regression would + # leave guidance unapplied without failing the request. + "nvext": {"cfg_scale": 1.5}, + }, + repeat_count=1, + # Stage 1 is a streaming causal decoder: it emits one ~100 ms + # delta per yield, the first of which is empty, and the worker + # concatenates them. Mis-assembling that stream yields a short + # or silent WAV that still parses, so check the waveform itself: + # this prompt decodes to ~2.3s at rms ~0.055. + min_duration_s=1.0, + min_rms=0.01, + expected_sample_rate=16000, + expected_response=[], + expected_log=[], + ), + ], + ), # Known flake (post-merge): URL check fails after 600s with "StageDiffusionProc # died during handshake (exit code 143)" — the diffusion child process is # SIGTERM'd before the handshake completes. Bumping the timeout will not fix this; diff --git a/tests/utils/payloads.py b/tests/utils/payloads.py index 29e8da61a490..4919cd5966cc 100644 --- a/tests/utils/payloads.py +++ b/tests/utils/payloads.py @@ -20,6 +20,7 @@ import re import struct import time +import wave from copy import deepcopy from dataclasses import dataclass, field from io import BytesIO @@ -2384,10 +2385,24 @@ def __post_init__(self): @dataclass class AudioSpeechPayload(BasePayload): - """Payload for /v1/audio/speech endpoint.""" + """Payload for /v1/audio/speech endpoint. + + The byte-count check alone passes on a WAV that carries a header and a + fraction of a second of silence, which is what a broken decoder or a + mis-assembled chunk stream produces. Set the waveform expectations below to + assert the audio is actually as long and as loud as the request implies; + they apply to WAV responses (binary or base64) and are skipped for URL + responses. + """ endpoint: str = "/v1/audio/speech" timeout: int = 300 + # Minimum decoded duration in seconds; 0 disables the check. + min_duration_s: float = 0.0 + # Minimum RMS amplitude, normalized to [0, 1]; 0 disables the check. + min_rms: float = 0.0 + # Expected sample rate in Hz; None disables the check. + expected_sample_rate: Optional[int] = None def response_handler(self, response: Any) -> str: response.raise_for_status() @@ -2398,6 +2413,7 @@ def response_handler(self, response: Any) -> str: f"Audio response too small ({len(audio_bytes)} bytes), " f"likely not valid audio" ) + self._validate_waveform(audio_bytes) return f"binary_audio_{len(audio_bytes)}_bytes" result = response.json() assert ( @@ -2411,4 +2427,50 @@ def response_handler(self, response: Any) -> str: if "url" in entry and entry["url"]: return entry["url"] assert entry.get("b64_json"), "Audio response b64_json is empty" + self._validate_waveform(base64.b64decode(entry["b64_json"])) return "b64_audio_returned" + + def _validate_waveform(self, audio_bytes: bytes) -> None: + """Assert the decoded WAV meets the configured expectations.""" + if ( + self.min_duration_s <= 0 + and self.min_rms <= 0 + and self.expected_sample_rate is None + ): + return + + with wave.open(BytesIO(audio_bytes), "rb") as wav: + sample_rate = wav.getframerate() + frame_count = wav.getnframes() + sample_width = wav.getsampwidth() + channels = wav.getnchannels() + frames = wav.readframes(frame_count) + + if self.expected_sample_rate is not None: + assert sample_rate == self.expected_sample_rate, ( + f"Expected {self.expected_sample_rate} Hz audio, " + f"got {sample_rate} Hz" + ) + + duration_s = frame_count / sample_rate if sample_rate else 0.0 + assert duration_s >= self.min_duration_s, ( + f"Audio is {duration_s:.3f}s, shorter than the expected minimum " + f"{self.min_duration_s:.3f}s ({frame_count} frames at {sample_rate} Hz)" + ) + + if self.min_rms <= 0: + return + + assert sample_width == 2, ( + f"RMS check supports 16-bit PCM only, got {sample_width * 8}-bit " + f"audio; drop min_rms for this payload" + ) + sample_count = len(frames) // 2 + assert sample_count > 0, "Decoded WAV carries no samples" + samples = struct.unpack(f"<{sample_count}h", frames[: sample_count * 2]) + rms = math.sqrt(sum(s * s for s in samples) / sample_count) / 32768.0 + assert rms >= self.min_rms, ( + f"Audio RMS {rms:.5f} is below the expected minimum {self.min_rms:.5f}; " + f"the waveform is silent or near-silent " + f"({duration_s:.3f}s, {channels}ch at {sample_rate} Hz)" + ) diff --git a/tests/utils/test_audio_speech_payload.py b/tests/utils/test_audio_speech_payload.py new file mode 100644 index 000000000000..86a4732d59f2 --- /dev/null +++ b/tests/utils/test_audio_speech_payload.py @@ -0,0 +1,222 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Unit tests for ``AudioSpeechPayload``'s waveform expectations. + +A byte-count check alone passes on a WAV carrying a header and a fraction of a +second of silence, which is exactly what a mis-assembled cumulative chunk +stream produces. These tests drive ``response_handler`` over synthesized WAVs +so the duration, RMS, and sample-rate assertions are exercised without a GPU or +a served model — the serve test that configures them is skipped on CI capacity. +""" + +import base64 +import math +import struct +import wave +from io import BytesIO +from typing import Any, Optional +from unittest.mock import MagicMock + +import pytest + +from tests.utils.payloads import AudioSpeechPayload + +pytestmark = [ + pytest.mark.unit, + pytest.mark.pre_merge, + pytest.mark.gpu_0, +] + + +def _wav_bytes( + *, + duration_s: float = 1.0, + sample_rate: int = 16000, + amplitude: float = 0.2, + lead_amplitude: Optional[float] = None, + channels: int = 1, + sample_width: int = 2, +) -> bytes: + """A PCM WAV holding one constant sample value, so its RMS == ``amplitude``. + + ``lead_amplitude`` overrides the first frame only. That makes the opening + frame unrepresentative of the waveform, which is what the whole-waveform + RMS checks need to distinguish a real measurement from a peek at the head. + """ + frame_count = int(duration_s * sample_rate) + buffer = BytesIO() + + def _frame(level: float) -> bytes: + if sample_width == 2: + return struct.pack(f"<{channels}h", *([int(level * 32767)] * channels)) + return bytes([128] * channels * sample_width) + + with wave.open(buffer, "wb") as wav: + wav.setnchannels(channels) + wav.setsampwidth(sample_width) + wav.setframerate(sample_rate) + if lead_amplitude is not None and frame_count: + wav.writeframes(_frame(lead_amplitude)) + frame_count -= 1 + wav.writeframes(_frame(amplitude) * frame_count) + return buffer.getvalue() + + +def _payload( + *, + min_duration_s: float = 0.0, + min_rms: float = 0.0, + expected_sample_rate: Optional[int] = None, +) -> AudioSpeechPayload: + return AudioSpeechPayload( + body={"input": "hi"}, + expected_response=[], + expected_log=[], + min_duration_s=min_duration_s, + min_rms=min_rms, + expected_sample_rate=expected_sample_rate, + ) + + +def _binary_response(audio_bytes: bytes) -> Any: + """A response delivering the WAV as ``audio/wav`` bytes.""" + response = MagicMock() + response.raise_for_status.return_value = None + response.headers = {"content-type": "audio/wav"} + response.content = audio_bytes + return response + + +def _b64_response(audio_bytes: bytes) -> Any: + """A response delivering the WAV as base64 in the JSON envelope.""" + response = MagicMock() + response.raise_for_status.return_value = None + response.headers = {"content-type": "application/json"} + response.json.return_value = { + "status": "completed", + "data": [ + { + "output_format": "wav", + "b64_json": base64.b64encode(audio_bytes).decode(), + } + ], + } + return response + + +@pytest.mark.parametrize( + "make_response", [_binary_response, _b64_response], ids=["binary", "b64"] +) +def test_waveform_meeting_every_expectation_passes(make_response): + """Both delivery shapes run the same checks.""" + payload = _payload(min_duration_s=1.0, min_rms=0.01, expected_sample_rate=16000) + + payload.response_handler(make_response(_wav_bytes())) + + +@pytest.mark.parametrize( + "make_response", [_binary_response, _b64_response], ids=["binary", "b64"] +) +def test_truncated_waveform_fails(make_response): + """A mis-assembled chunk stream yields a short but parseable WAV.""" + payload = _payload(min_duration_s=1.0) + audio = _wav_bytes(duration_s=0.2) + + with pytest.raises(AssertionError, match="shorter than the expected minimum"): + payload.response_handler(make_response(audio)) + + +@pytest.mark.parametrize( + "make_response", [_binary_response, _b64_response], ids=["binary", "b64"] +) +def test_silent_waveform_fails(make_response): + """A header plus silence is the other broken-decoder signature.""" + payload = _payload(min_rms=0.01) + + with pytest.raises(AssertionError, match="is below the expected minimum"): + payload.response_handler(make_response(_wav_bytes(amplitude=0.0))) + + +def test_wrong_sample_rate_fails(): + """Audex decodes at 16 kHz; another rate means the wrong decode path.""" + payload = _payload(expected_sample_rate=16000) + + with pytest.raises(AssertionError, match="Expected 16000 Hz audio, got 24000 Hz"): + payload.response_handler(_binary_response(_wav_bytes(sample_rate=24000))) + + +def test_rms_is_compared_against_the_configured_floor(): + """The floor has to be applied: above it passes, below it fails.""" + payload = _payload(min_rms=0.2) + + payload.response_handler(_binary_response(_wav_bytes(amplitude=0.25))) + with pytest.raises(AssertionError, match=r"Audio RMS \S+ is below the expected"): + payload.response_handler(_binary_response(_wav_bytes(amplitude=0.15))) + + +def test_a_loud_first_frame_does_not_pass_a_silent_waveform(): + """RMS over the whole signal, not a peek at the head of the buffer.""" + payload = _payload(min_rms=0.01) + audio = _wav_bytes(amplitude=0.0, lead_amplitude=0.5) + + with pytest.raises(AssertionError, match=r"Audio RMS \S+ is below the expected"): + payload.response_handler(_binary_response(audio)) + + +def test_a_silent_first_frame_does_not_fail_a_loud_waveform(): + """The converse: a quiet opening frame is not the whole signal either.""" + payload = _payload(min_rms=0.2) + + payload.response_handler( + _binary_response(_wav_bytes(amplitude=0.25, lead_amplitude=0.0)) + ) + + +def test_stereo_waveform_is_accepted(): + """Duration is frame-based, so channel count must not scale it.""" + payload = _payload(min_duration_s=1.0, min_rms=0.01, expected_sample_rate=16000) + + payload.response_handler(_binary_response(_wav_bytes(channels=2))) + + +def test_non_16_bit_audio_with_min_rms_is_reported_not_mismeasured(): + """The RMS unpack assumes 16-bit PCM, so anything else must fail loudly.""" + payload = _payload(min_rms=0.01) + + with pytest.raises(AssertionError, match="RMS check supports 16-bit PCM only"): + payload.response_handler(_binary_response(_wav_bytes(sample_width=1))) + + +def test_all_checks_disabled_skips_waveform_decoding(): + """The default payload must not require a decodable WAV.""" + payload = _payload() + + assert payload.response_handler(_binary_response(b"x" * 200)).startswith( + "binary_audio_" + ) + + +def test_url_response_skips_the_waveform_checks(): + """A URL response carries no bytes to decode.""" + payload = _payload(min_duration_s=1.0, min_rms=0.01) + response = MagicMock() + response.raise_for_status.return_value = None + response.headers = {"content-type": "application/json"} + response.json.return_value = { + "status": "completed", + "data": [{"url": "http://media/audios/req-1.wav"}], + } + + assert payload.response_handler(response) == "http://media/audios/req-1.wav" + + +def test_helper_rms_matches_its_amplitude(): + """Guards the fixture the RMS assertions above are calibrated against.""" + audio = _wav_bytes(amplitude=0.25, duration_s=0.5) + with wave.open(BytesIO(audio), "rb") as wav: + frames = wav.readframes(wav.getnframes()) + samples = struct.unpack(f"<{len(frames) // 2}h", frames) + rms = math.sqrt(sum(s * s for s in samples) / len(samples)) / 32768.0 + + assert rms == pytest.approx(0.25, abs=0.001) From a10a46a8a011609e444935d475a5554a18cbb87c Mon Sep 17 00:00:00 2001 From: MatejKosec Date: Thu, 17 Sep 2026 12:14:57 -0700 Subject: [PATCH 078/191] ci: allow glamr-agent to request CI on its own unsigned PRs (#14964) Signed-off-by: Matej Kosec --- .../workflows/trigger-ci-approval-flow.yml | 94 ++++++++----------- AGENTS.md | 16 ++-- 2 files changed, 49 insertions(+), 61 deletions(-) diff --git a/.github/workflows/trigger-ci-approval-flow.yml b/.github/workflows/trigger-ci-approval-flow.yml index f177ff8732a6..70aeb775219d 100644 --- a/.github/workflows/trigger-ci-approval-flow.yml +++ b/.github/workflows/trigger-ci-approval-flow.yml @@ -1,59 +1,43 @@ # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -# Intent -# ------ -# Safely approve trusted CI for the exact head commit of a pull request from a fork. Fork PRs do -# not receive this approval automatically because their code is external to the repository. This -# workflow evaluates who is responsible for the PR update, verifies every PR commit, and posts the -# `/ok to test ` command that starts the trusted CI flow only when all checks pass. +# Approve CI for a fork PR by posting `/ok to test `. +# Approval applies only to that commit. # -# When this workflow runs -# ----------------------- -# The workflow receives `pull_request_target` events when a fork PR is opened, synchronized by a -# new push, or reopened. The job is skipped for branches in this repository because those branches -# use the normal internal-contributor CI path. +# This workflow handles fork PRs when they are opened, pushed to, or reopened, +# and when glamr-agent posts a CI request. PRs from branches in this repository +# use the internal-contributor CI workflow instead. # -# A fork PR can reach the signature check through any of these approval paths: +# Automatic approval is allowed in these cases: # -# 1. The PR author has write, maintain, or admin access to this repository. This path applies when -# the PR is opened or reopened. A synchronized update must also be pushed by a maintainer. -# 2. The PR author is listed in the `APPROVED_EXTERNAL_CONTRIBUTORS` environment secret. This path -# applies when the PR is opened, synchronized, or reopened. -# 3. A user with write, maintain, or admin access to this repository synchronizes the PR branch. -# For example, a maintainer may merge `main` into a contributor's branch. This path approves -# only the head created by that synchronization; it does not make the PR or contributor trusted -# for later pushes. -# 4. `glamr-agent` posts `@dynamo-ops please run full CI for `, optionally -# preceded by a label and colon. The SHA must match the open fork PR's head when resolved. -# Set the repository Actions variable GLAMR_CI_REQUESTS_DISABLED=true to disable this path. +# 1. A maintainer opens or reopens a PR. Here, a maintainer is someone with write, +# maintain, or admin access to this repository. +# 2. A PR author listed in APPROVED_EXTERNAL_CONTRIBUTORS opens, updates, or +# reopens a PR. +# 3. A maintainer pushes to a PR branch, for example by merging main into it. +# Approval covers that head commit. Later pushes need a new approval. +# 4. glamr-agent posts `@dynamo-ops please run full CI for ` on +# its own PR. The request may start with a label and colon. The commenter, +# PR author, and head repository owner must all have GitHub account ID +# 282374502, and the SHA must match the PR's current head. This case does not +# require signed commits. +# Set the repository Actions variable GLAMR_CI_REQUESTS_DISABLED=true to +# disable these requests. # -# All paths require every commit in the captured base-to-head comparison to have a signature -# that GitHub reports as verified. If any commit is unsigned, the workflow does not post -# `/ok to test`. For PRs authored -# by maintainers, it explains which commits failed verification. Approved external contributors -# receive guidance for either signing the commits or requesting manual approval. Other external -# contributors wait for manual approval without receiving an unsigned-commit comment. Repository- -# permission lookup failures fail closed for the maintainer paths, and malformed contributor-list -# configuration fails closed for the approved-author path. +# Cases 1-3 require GitHub to verify the signature of every commit in the recorded +# base-to-head comparison. If verification fails, the workflow tells maintainer +# authors which commits failed. Authors on the approved list receive instructions +# for signing or getting manual approval. Other contributors receive no comment. +# Failed permission lookups cannot grant maintainer approval. An invalid approved +# contributor list cannot grant approval through that list. # -# Why a contributor's PR may not trigger trusted CI -# ------------------------------------------------- -# - A new contributor who is not on the approved list needs a maintainer to approve the current -# head, either by synchronizing the branch or by posting the approval command manually. -# - A contributor push after a maintainer synchronization creates a new head and removes the -# one-head approval. The new head must be approved again. -# - Every PR commit must be signed and verified, including commits added before a maintainer update. -# - Contributors must enable "Allow edits from maintainers" before a maintainer can update a branch -# in a user-owned fork. +# A maintainer can also approve CI manually with `/ok to test `. +# To let a maintainer push to a user-owned fork, the contributor must enable +# "Allow edits from maintainers" on the PR. # -# Desired state -# ------------- -# The workflow posts `/ok to test ` after checking its approval path and -# verifying every commit in the captured base-to-head comparison. The final read requires the -# PR to remain open with the same base and head, but that read and comment creation are separate -# operations. The PR may change before publication; the consumer must enforce the command's -# SHA when approval is required. Later heads require their own approval evaluation. +# Before posting approval, the workflow checks that the PR is still open and its +# base and head have not changed. A push can arrive after this check, so the CI +# trigger must also check the command's SHA when approval is required. name: Trigger CI Approval Flow @@ -73,7 +57,6 @@ permissions: jobs: ok-to-test: - # Authenticate glamr-agent by GitHub account ID, independent of login changes. if: >- (github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.fork) || (github.event_name == 'issue_comment' && github.event.issue.pull_request && @@ -96,16 +79,19 @@ jobs: id: request env: GH_TOKEN: ${{ github.token }} + GLAMR_USER_ID: "282374502" run: | pr=$(gh api "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER") [[ $(jq -r '.state == "open" and .head.repo.fork == true' <<< "$pr") == true ]] || exit 0 head=$(jq -r '.head.sha' <<< "$pr") if [[ "$GITHUB_EVENT_NAME" == issue_comment ]]; then + [[ $(jq -r '.user.id' <<< "$pr") == "$GLAMR_USER_ID" ]] || exit 0 + [[ $(jq -r '.head.repo.owner.id' <<< "$pr") == "$GLAMR_USER_ID" ]] || exit 0 body=$(jq -r '.comment.body' "$GITHUB_EVENT_PATH") pattern='^([^[:space:]]+:[[:blank:]]+)?@dynamo-ops please run full CI for ([0-9a-f]{40})[[:space:]]*$' [[ "$body" =~ $pattern ]] || exit 0 [[ "${BASH_REMATCH[2]}" == "$head" ]] || exit 0 - echo "is_approved=true" >> "$GITHUB_OUTPUT" + echo "glamr_request_approved=true" >> "$GITHUB_OUTPUT" else [[ $(jq -r '.pull_request.head.sha' "$GITHUB_EVENT_PATH") == "$head" ]] || exit 0 fi @@ -197,13 +183,13 @@ jobs: id: approval_check if: steps.request.outputs.current == 'true' env: - REQUEST_APPROVED: ${{ steps.request.outputs.is_approved }} + GLAMR_REQUEST_APPROVED: ${{ steps.request.outputs.glamr_request_approved }} AUTHOR_APPROVED: ${{ steps.author_check.outputs.is_approved }} AUTHOR_MAINTAINER: ${{ steps.author_permission_check.outputs.is_maintainer }} ACTOR_APPROVED: ${{ steps.actor_check.outputs.is_approved }} EVENT_ACTION: ${{ github.event.action }} run: | - if [[ "$REQUEST_APPROVED" == "true" || "$AUTHOR_APPROVED" == "true" ]]; then + if [[ "$GLAMR_REQUEST_APPROVED" == "true" || "$AUTHOR_APPROVED" == "true" ]]; then echo "is_approved=true" >> "$GITHUB_OUTPUT" elif [[ "$EVENT_ACTION" == "synchronize" && "$ACTOR_APPROVED" == "true" ]]; then echo "is_approved=true" >> "$GITHUB_OUTPUT" @@ -214,7 +200,7 @@ jobs: fi - name: Verify commit signatures id: signature_check - if: steps.approval_check.outputs.is_approved == 'true' + if: steps.approval_check.outputs.is_approved == 'true' && steps.request.outputs.glamr_request_approved != 'true' env: GH_TOKEN: ${{ github.token }} PR_BASE: ${{ steps.request.outputs.base }} @@ -317,7 +303,7 @@ jobs: --repo "$REPO_OWNER/$REPO_NAME" \ --body "$body" - name: Comment /ok to test - if: steps.approval_check.outputs.is_approved == 'true' && steps.signature_check.outputs.all_signed == 'true' + if: steps.approval_check.outputs.is_approved == 'true' && (steps.request.outputs.glamr_request_approved == 'true' || steps.signature_check.outputs.all_signed == 'true') env: GH_TOKEN: ${{ secrets.AUTO_VERIFIER_CI_TOKEN }} PR_BASE: ${{ steps.request.outputs.base }} @@ -335,8 +321,6 @@ jobs: echo "CI approval already posted for $PR_SHA." exit 0 fi - # This read can reject an already-stale request, but cannot prevent a later push. - # Keep the command below bound to the captured, verified PR_SHA. pr=$(gh api "repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER") jq -e --arg sha "$PR_SHA" --arg base "$PR_BASE" \ '.state == "open" and .head.sha == $sha and .base.sha == $base' <<< "$pr" > /dev/null || exit 0 diff --git a/AGENTS.md b/AGENTS.md index 30f9a229993f..fe9864409553 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -232,10 +232,14 @@ cargo fmt --all && cargo clippy --workspace `style`, and `build`. - PR descriptions must include `Summary` and `Validation`. - Sign every commit with DCO: `git commit -s`. -- For fork PRs that qualify for automatic trusted-CI approval, every commit must have a - cryptographic signature that GitHub reports as `Verified`; a DCO sign-off alone does not - satisfy this requirement. Signing commits does not itself qualify a PR for automatic approval; - a maintainer can manually approve the current head with `/ok to test `. +- For fork PRs that qualify for automatic CI approval, GitHub must report every commit's + signature as `Verified`. A DCO sign-off alone is not enough. Signing commits does not + grant automatic approval; a maintainer can approve the current head manually with + `/ok to test `. + The only signature exception is a full-CI request from `glamr-agent` on its own PR. + The commenter, PR author, and head repository owner must all be `glamr-agent`, + checked by GitHub account ID. The request's full SHA must match the PR's current + head. Other automatic approvals still require verified signatures. - Do not hand-edit a generated artifact — change its source and regenerate. A generated file says so in a `do not edit` marker, and its generator has a `--check` mode that fails when the committed output is stale. Resolve a @@ -256,8 +260,8 @@ cargo fmt --all && cargo clippy --workspace skill automates all of this. - Full CI on a PR runs only after a maintainer comments `/ok to test ` with the short SHA of the latest commit; copy-pr-bot then creates the `pull-request/N` branch that - triggers it. For an eligible fork PR, the automatic approval flow posts that command only - after every PR commit is GitHub-verified. Fix failures before requesting human review. + triggers it. For an eligible fork PR, automatic approval posts this command after the + checks above pass. Fix CI failures before requesting human review. - Architecture changes require a Dynamo Enhancement Proposal (DEP), filed as a GitHub issue on `ai-dynamo/dynamo` with `dep:*` labels (the `dep-create` skill automates this). From 2cd9c987ae5d00a6b4615bed9113ddb27e660a3b Mon Sep 17 00:00:00 2001 From: Keiven C <213854356+keivenchang@users.noreply.github.com> Date: Thu, 17 Sep 2026 12:34:07 -0700 Subject: [PATCH 079/191] fix(vllm): isolate multimodal worker ports (#14751) Signed-off-by: Keiven Chang Co-authored-by: Keiven Chang --- .../vllm/launch/agg_multimodal_router.sh | 15 +- .../agg_multimodal_router_chat_processor.sh | 9 +- .../vllm/launch/disagg_multimodal_epd.sh | 27 +- .../vllm/launch/disagg_multimodal_p_d.sh | 21 +- .../backends/vllm/launch/disagg_same_gpu.sh | 21 +- ...gg_multimodal_router_chat_processor_xpu.sh | 22 +- .../launch/xpu/agg_multimodal_router_xpu.sh | 18 +- .../launch/xpu/disagg_multimodal_epd_xpu.sh | 28 +- examples/common/launch_utils.sh | 42 +++ tests/conftest.py | 8 +- tests/serve/common.py | 46 ++-- tests/serve/multimodal_profiles/vllm.py | 10 + tests/serve/multimodal_profiles/vllm_xpu.py | 4 + tests/serve/test_port_contract.py | 257 ++++++++++++++++++ tests/serve/test_vllm.py | 6 +- tests/utils/multimodal.py | 4 + tests/utils/port_utils.py | 2 +- 17 files changed, 445 insertions(+), 95 deletions(-) create mode 100644 tests/serve/test_port_contract.py diff --git a/examples/backends/vllm/launch/agg_multimodal_router.sh b/examples/backends/vllm/launch/agg_multimodal_router.sh index 0397b555afe4..c3d002da87e7 100755 --- a/examples/backends/vllm/launch/agg_multimodal_router.sh +++ b/examples/backends/vllm/launch/agg_multimodal_router.sh @@ -135,8 +135,8 @@ GPU_MEM_ARGS=$(build_vllm_gpu_mem_args) # Under SINGLE_GPU=true, requires the KV-bytes cap (CI sets it via the # requested_vllm_kv_cache_bytes marker) — otherwise vLLM's 0.9 default races. for i in $(seq 1 "${NUM_WORKERS}"); do - WORKER_PORT=$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2)) - KV_EVENTS_PORT=$((KV_EVENTS_PORT_BASE + (i - 1))) + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))) + KV_EVENTS_PORT=$(dyn_port DYN_VLLM_KV_EVENT_PORT "$i" $((KV_EVENTS_PORT_BASE + (i - 1)))) if [[ "${SINGLE_GPU}" == "true" ]]; then GPU_ID=0; else GPU_ID=$((i - 1)); fi KV_EVENTS_CONFIG="{\"enable_kv_cache_events\":true,\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${KV_EVENTS_PORT}\"}" @@ -157,12 +157,13 @@ done # Phase 2: wait for all workers to be ready. for i in $(seq 1 "${NUM_WORKERS}"); do - WORKER_PORT=$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2)) + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))) wait_ready "http://127.0.0.1:${WORKER_PORT}/health" "vLLM backend $i" done echo "=== Starting frontend (KV router, MM-aware exact routing) ===" -env "${COMMON_ENV[@]}" \ +env -u DYN_SYSTEM_PORT -u DYN_SYSTEM_PORT1 -u DYN_SYSTEM_PORT2 -u DYN_SYSTEM_PORT3 \ + "${COMMON_ENV[@]}" \ "DYN_LOG=${DYN_LOG_VAL}" \ python -m dynamo.frontend \ --http-port "${HTTP_PORT}" \ @@ -185,8 +186,10 @@ echo echo "=== All services are ready ===" echo "Frontend: http://127.0.0.1:${HTTP_PORT}" for i in $(seq 1 "${NUM_WORKERS}"); do - echo "Worker $i health: http://127.0.0.1:$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))/health" - echo "Worker $i kv-events: tcp://*:$((KV_EVENTS_PORT_BASE + (i - 1)))" + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))) + KV_EVENTS_PORT=$(dyn_port DYN_VLLM_KV_EVENT_PORT "$i" $((KV_EVENTS_PORT_BASE + (i - 1)))) + echo "Worker $i health: http://127.0.0.1:${WORKER_PORT}/health" + echo "Worker $i kv-events: tcp://*:${KV_EVENTS_PORT}" done echo echo "Architecture: Rust frontend (MM-aware KV router) -> ${NUM_WORKERS}x vLLM workers" diff --git a/examples/backends/vllm/launch/agg_multimodal_router_chat_processor.sh b/examples/backends/vllm/launch/agg_multimodal_router_chat_processor.sh index e3ae8e3fddfb..c24bd2f2f095 100755 --- a/examples/backends/vllm/launch/agg_multimodal_router_chat_processor.sh +++ b/examples/backends/vllm/launch/agg_multimodal_router_chat_processor.sh @@ -174,8 +174,8 @@ COMMON_ENV=( # Under SINGLE_GPU=true, requires the KV-bytes cap (CI sets it via the # requested_vllm_kv_cache_bytes marker) — otherwise vLLM's 0.9 default races. for i in $(seq 1 "${NUM_WORKERS}"); do - WORKER_PORT=$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2)) - KV_EVENTS_PORT=$((KV_EVENTS_PORT_BASE + i - 1)) + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))) + KV_EVENTS_PORT=$(dyn_port DYN_VLLM_KV_EVENT_PORT "$i" $((KV_EVENTS_PORT_BASE + i - 1))) if [[ "${SINGLE_GPU}" == "true" ]]; then GPU_ID=0 @@ -201,7 +201,7 @@ done # Phase 2: wait for all workers to be ready. for i in $(seq 1 "${NUM_WORKERS}"); do - WORKER_PORT=$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2)) + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))) wait_ready "http://127.0.0.1:${WORKER_PORT}/health" "vLLM backend $i" 900 done @@ -271,7 +271,8 @@ for f in $(seq 1 "${NUM_FRONTENDS}"); do echo "Frontend ${f}: http://127.0.0.1:$((HTTP_PORT + f - 1))" done for i in $(seq 1 "${NUM_WORKERS}"); do - echo "Worker $i: http://127.0.0.1:$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))/health" + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))) + echo "Worker $i: http://127.0.0.1:${WORKER_PORT}/health" done echo echo "Architecture: ${NUM_FRONTENDS}x Frontend (vLLM processor + KvRouter) -> ${NUM_WORKERS}x vLLM backend" diff --git a/examples/backends/vllm/launch/disagg_multimodal_epd.sh b/examples/backends/vllm/launch/disagg_multimodal_epd.sh index 01cad5e18b24..20851156c1a7 100755 --- a/examples/backends/vllm/launch/disagg_multimodal_epd.sh +++ b/examples/backends/vllm/launch/disagg_multimodal_epd.sh @@ -114,10 +114,8 @@ print_launch_banner --multimodal "Launching Disaggregated Multimodal E/P/D ($GPU # Start frontend (no router mode) echo "Starting frontend..." # dynamo.frontend accepts either --http-port flag or DYN_HTTP_PORT env var (defaults to 8000) -python -m dynamo.frontend & - -# Each worker needs its own system port when tests inject DYN_SYSTEM_PORT{1,2,3}. -unset DYN_SYSTEM_PORT +env -u DYN_SYSTEM_PORT -u DYN_SYSTEM_PORT1 -u DYN_SYSTEM_PORT2 -u DYN_SYSTEM_PORT3 \ + python -m dynamo.frontend & EXTRA_ARGS="" PD_EXTRA_ARGS="" @@ -198,12 +196,15 @@ else DECODE_GPU_MEM_ARGS="--gpu-memory-utilization $DYN_DECODE_GPU_MEM" fi -VLLM_NIXL_SIDE_CHANNEL_PORT_ENCODE=${VLLM_NIXL_SIDE_CHANNEL_PORT_ENCODE:-20097} -VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL=${VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL:-20098} -VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE=${VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE:-20099} -VLLM_ZMQ_PORT_ENCODE=${VLLM_ZMQ_PORT_ENCODE:-20080} -VLLM_ZMQ_PORT_PREFILL=${VLLM_ZMQ_PORT_PREFILL:-20081} -VLLM_ZMQ_PORT_DECODE=${VLLM_ZMQ_PORT_DECODE:-20082} +VLLM_NIXL_SIDE_CHANNEL_PORT_ENCODE="$(dyn_port DYN_VLLM_NIXL_SIDE_CHANNEL_PORT 1 "${VLLM_NIXL_SIDE_CHANNEL_PORT_ENCODE:-20097}")" +VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL="$(dyn_port DYN_VLLM_NIXL_SIDE_CHANNEL_PORT 2 "${VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL:-20098}")" +VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE="$(dyn_port DYN_VLLM_NIXL_SIDE_CHANNEL_PORT 3 "${VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE:-20099}")" +VLLM_ZMQ_PORT_ENCODE="$(dyn_port DYN_VLLM_KV_EVENT_PORT 1 "${VLLM_ZMQ_PORT_ENCODE:-20080}")" +VLLM_ZMQ_PORT_PREFILL="$(dyn_port DYN_VLLM_KV_EVENT_PORT 2 "${VLLM_ZMQ_PORT_PREFILL:-20081}")" +VLLM_ZMQ_PORT_DECODE="$(dyn_port DYN_VLLM_KV_EVENT_PORT 3 "${VLLM_ZMQ_PORT_DECODE:-20082}")" +SYSTEM_PORT_ENCODE=$(dyn_port DYN_SYSTEM_PORT 1 8081) +SYSTEM_PORT_PREFILL=$(dyn_port DYN_SYSTEM_PORT 2 8082) +SYSTEM_PORT_DECODE=$(dyn_port DYN_SYSTEM_PORT 3 8083) # Start encode worker. # @@ -230,7 +231,7 @@ VLLM_ZMQ_PORT_DECODE=${VLLM_ZMQ_PORT_DECODE:-20082} # model load). Short-term workaround; drop it (set VLLM_USE_V2_MODEL_RUNNER=1) # once the V2 encoder-only path is fixed upstream. MoE VLMs are unaffected. echo "Starting encode worker on GPU $DYN_ENCODE_WORKER_GPU (--gpu-memory-utilization $DYN_ENCODE_GPU_MEM)..." -DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT1:-8081} \ +DYN_SYSTEM_PORT=$SYSTEM_PORT_ENCODE \ VLLM_USE_V2_MODEL_RUNNER=${VLLM_USE_V2_MODEL_RUNNER:-0} \ VLLM_NIXL_SIDE_CHANNEL_PORT=$VLLM_NIXL_SIDE_CHANNEL_PORT_ENCODE \ CUDA_VISIBLE_DEVICES=$DYN_ENCODE_WORKER_GPU \ @@ -238,13 +239,13 @@ python -m dynamo.vllm --enable-multimodal --disaggregation-mode encode --model $ # Start prefill worker (also handles encode routing via --route-to-encoder) echo "Starting prefill worker on GPU $DYN_PREFILL_WORKER_GPU (${PREFILL_GPU_MEM_ARGS})..." -DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT2:-8082} \ +DYN_SYSTEM_PORT=$SYSTEM_PORT_PREFILL \ VLLM_NIXL_SIDE_CHANNEL_PORT=$VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL \ CUDA_VISIBLE_DEVICES=$DYN_PREFILL_WORKER_GPU python -m dynamo.vllm --route-to-encoder --disaggregation-mode prefill --enable-multimodal --enable-mm-embeds --model $MODEL_NAME $PREFILL_GPU_MEM_ARGS $EXTRA_ARGS $PD_EXTRA_ARGS --kv-transfer-config "$KV_TRANSFER_CONFIG" --kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${VLLM_ZMQ_PORT_PREFILL}\"}" & # Start decode worker echo "Starting decode worker on GPU $DYN_DECODE_WORKER_GPU (${DECODE_GPU_MEM_ARGS})..." -DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT3:-8083} \ +DYN_SYSTEM_PORT=$SYSTEM_PORT_DECODE \ VLLM_NIXL_SIDE_CHANNEL_PORT=$VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE \ CUDA_VISIBLE_DEVICES=$DYN_DECODE_WORKER_GPU python -m dynamo.vllm --disaggregation-mode decode --enable-multimodal --enable-mm-embeds --model $MODEL_NAME $DECODE_GPU_MEM_ARGS $EXTRA_ARGS $PD_EXTRA_ARGS --kv-transfer-config "$KV_TRANSFER_CONFIG" --kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${VLLM_ZMQ_PORT_DECODE}\"}" & diff --git a/examples/backends/vllm/launch/disagg_multimodal_p_d.sh b/examples/backends/vllm/launch/disagg_multimodal_p_d.sh index ba99c31a103a..dde8016dfbc9 100755 --- a/examples/backends/vllm/launch/disagg_multimodal_p_d.sh +++ b/examples/backends/vllm/launch/disagg_multimodal_p_d.sh @@ -63,7 +63,8 @@ print_launch_banner --multimodal "Launching Disaggregated Multimodal P/D ($GPU_L # Start frontend echo "Starting frontend..." -python -m dynamo.frontend & +env -u DYN_SYSTEM_PORT -u DYN_SYSTEM_PORT1 -u DYN_SYSTEM_PORT2 \ + python -m dynamo.frontend & EXTRA_ARGS="" PD_EXTRA_ARGS="" @@ -101,9 +102,15 @@ else fi # Start prefill worker (handles image loading internally, no --route-to-encoder) +SYSTEM_PORT_PREFILL=$(dyn_port DYN_SYSTEM_PORT 1 "${DYN_SYSTEM_PORT:-8081}") +SYSTEM_PORT_DECODE=$(dyn_port DYN_SYSTEM_PORT 2 8082) +NIXL_PORT_PREFILL=$(dyn_port DYN_VLLM_NIXL_SIDE_CHANNEL_PORT 1 "${VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL:-20098}") +NIXL_PORT_DECODE=$(dyn_port DYN_VLLM_NIXL_SIDE_CHANNEL_PORT 2 "${VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE:-20099}") +KV_PORT_PREFILL=$(dyn_port DYN_VLLM_KV_EVENT_PORT 1 "${VLLM_ZMQ_PORT_PREFILL:-20081}") +KV_PORT_DECODE=$(dyn_port DYN_VLLM_KV_EVENT_PORT 2 "${VLLM_ZMQ_PORT_DECODE:-20082}") echo "Starting prefill worker on GPU $DYN_PREFILL_WORKER_GPU (${PREFILL_GPU_MEM_ARGS})..." -VLLM_NIXL_SIDE_CHANNEL_PORT=20098 \ -DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT1:-${DYN_SYSTEM_PORT:-8081}} \ +VLLM_NIXL_SIDE_CHANNEL_PORT=$NIXL_PORT_PREFILL \ +DYN_SYSTEM_PORT=$SYSTEM_PORT_PREFILL \ CUDA_VISIBLE_DEVICES=$DYN_PREFILL_WORKER_GPU \ python -m "$WORKER_MODULE" \ --disaggregation-mode prefill \ @@ -113,12 +120,12 @@ python -m "$WORKER_MODULE" \ $EXTRA_ARGS \ $PD_EXTRA_ARGS \ --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both"}' \ - --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20081"}' & + --kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${KV_PORT_PREFILL}\"}" & # Start decode worker echo "Starting decode worker on GPU $DYN_DECODE_WORKER_GPU (${DECODE_GPU_MEM_ARGS})..." -VLLM_NIXL_SIDE_CHANNEL_PORT=20099 \ -DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT2:-8082} \ +VLLM_NIXL_SIDE_CHANNEL_PORT=$NIXL_PORT_DECODE \ +DYN_SYSTEM_PORT=$SYSTEM_PORT_DECODE \ CUDA_VISIBLE_DEVICES=$DYN_DECODE_WORKER_GPU \ python -m "$WORKER_MODULE" \ --disaggregation-mode decode \ @@ -129,7 +136,7 @@ python -m "$WORKER_MODULE" \ $EXTRA_ARGS \ $PD_EXTRA_ARGS \ --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both"}' \ - --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20082"}' & + --kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${KV_PORT_DECODE}\"}" & echo "==================================================" echo "All components started. Waiting for initialization..." diff --git a/examples/backends/vllm/launch/disagg_same_gpu.sh b/examples/backends/vllm/launch/disagg_same_gpu.sh index 7b8a60ffb255..b0bdca703607 100755 --- a/examples/backends/vllm/launch/disagg_same_gpu.sh +++ b/examples/backends/vllm/launch/disagg_same_gpu.sh @@ -57,15 +57,22 @@ fi if [[ -n "${DYN_ROUTER_MODE:-}" ]]; then FRONTEND_ARGS+=(--router-mode "$DYN_ROUTER_MODE") fi -python3 -m dynamo.frontend "${FRONTEND_ARGS[@]}" & +env -u DYN_SYSTEM_PORT -u DYN_SYSTEM_PORT1 -u DYN_SYSTEM_PORT2 -u DYN_SYSTEM_PORT3 \ + python3 -m dynamo.frontend "${FRONTEND_ARGS[@]}" & + +SYSTEM_PORT_DECODE=$(dyn_port DYN_SYSTEM_PORT 1 "${DYN_SYSTEM_PORT:-8081}") +SYSTEM_PORT_PREFILL=$(dyn_port DYN_SYSTEM_PORT 2 8082) +NIXL_PORT_DECODE=$(dyn_port DYN_VLLM_NIXL_SIDE_CHANNEL_PORT 1 5600) +NIXL_PORT_PREFILL=$(dyn_port DYN_VLLM_NIXL_SIDE_CHANNEL_PORT 2 20097) +KV_PORT_PREFILL=$(dyn_port DYN_VLLM_KV_EVENT_PORT 1 "${DYN_VLLM_KV_EVENT_PORT:-20081}") # run decode worker with metrics on port 8081 # --enforce-eager is added for quick deployment. for production use, need to remove this flag # For disaggregated deployments we standardize on DYN_SYSTEM_PORT1/2 instead of # *_PREFILL/*_DECODE env names so test harnesses can set one simple pair. CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES \ -DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT1:-8081} \ -VLLM_NIXL_SIDE_CHANNEL_PORT=${DYN_VLLM_NIXL_SIDE_CHANNEL_PORT1:-5600} \ +DYN_SYSTEM_PORT=$SYSTEM_PORT_DECODE \ +VLLM_NIXL_SIDE_CHANNEL_PORT=$NIXL_PORT_DECODE \ python3 -m "$WORKER_MODULE" \ --model "$MODEL" \ --enforce-eager \ @@ -78,13 +85,13 @@ python3 -m "$WORKER_MODULE" \ # Both workers share one GPU; without this wait they compete for GPU memory # during model loading and the scheduler OOMs. # || true: don't let set -e kill the script on timeout (wait_for_ready returns 1). -DECODE_SYSTEM_PORT="${DYN_SYSTEM_PORT1:-8081}" +DECODE_SYSTEM_PORT=$SYSTEM_PORT_DECODE wait_for_ready "http://localhost:${DECODE_SYSTEM_PORT}/health" 45 || true # run prefill worker with metrics on port 8082 CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES \ -DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT2:-8082} \ -VLLM_NIXL_SIDE_CHANNEL_PORT=${DYN_VLLM_NIXL_SIDE_CHANNEL_PORT2:-20097} \ +DYN_SYSTEM_PORT=$SYSTEM_PORT_PREFILL \ +VLLM_NIXL_SIDE_CHANNEL_PORT=$NIXL_PORT_PREFILL \ DYN_WORKER_GRACEFUL_SHUTDOWN_TIMEOUT=${DYN_WORKER_GRACEFUL_SHUTDOWN_TIMEOUT:-60} \ python3 -m "$WORKER_MODULE" \ --model "$MODEL" \ @@ -93,7 +100,7 @@ python3 -m "$WORKER_MODULE" \ --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both"}' \ $GPU_MEM_ARGS \ --max-model-len "$MAX_MODEL_LEN" \ - --kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${DYN_VLLM_KV_EVENT_PORT:-20081}\",\"enable_kv_cache_events\":true}" & + --kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${KV_PORT_PREFILL}\",\"enable_kv_cache_events\":true}" & # Exit on first worker failure; kill 0 in the EXIT trap tears down the rest wait_any_exit diff --git a/examples/backends/vllm/launch/xpu/agg_multimodal_router_chat_processor_xpu.sh b/examples/backends/vllm/launch/xpu/agg_multimodal_router_chat_processor_xpu.sh index 8205021c4e49..75decd67e076 100755 --- a/examples/backends/vllm/launch/xpu/agg_multimodal_router_chat_processor_xpu.sh +++ b/examples/backends/vllm/launch/xpu/agg_multimodal_router_chat_processor_xpu.sh @@ -192,18 +192,17 @@ if (( NUM_WORKERS > 1 )); then done fi # Align single-worker fallback with VLLM_SYSTEM_PORT_BASE (18081). -DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT1:-18081} +DYN_SYSTEM_PORT=$(dyn_port DYN_SYSTEM_PORT 1 18081) # Phase 1: launch all workers in parallel. # Under SINGLE_GPU=true, requires the KV-bytes cap (CI sets it via the # requested_vllm_kv_cache_bytes marker) - otherwise vLLM's 0.9 default races. for i in $(seq 1 "${NUM_WORKERS}"); do if (( NUM_WORKERS > 1 )); then - SYSTEM_PORT_VAR="DYN_SYSTEM_PORT${i}" - WORKER_PORT="${!SYSTEM_PORT_VAR:-$((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))}" + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))) else WORKER_PORT="${DYN_SYSTEM_PORT}" fi - KV_EVENTS_PORT=$((KV_EVENTS_PORT_BASE + i - 1)) + KV_EVENTS_PORT=$(dyn_port DYN_VLLM_KV_EVENT_PORT "$i" $((KV_EVENTS_PORT_BASE + i - 1))) if (( NUM_WORKERS > 1 )); then GPU_ID="${ZE_AFFINITY_MASK_LIST[$((i - 1))]}" @@ -230,8 +229,7 @@ done # Phase 2: wait for all workers to be ready. for i in $(seq 1 "${NUM_WORKERS}"); do if (( NUM_WORKERS > 1 )); then - SYSTEM_PORT_VAR="DYN_SYSTEM_PORT${i}" - WORKER_PORT="${!SYSTEM_PORT_VAR:-$((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))}" + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))) else WORKER_PORT="${DYN_SYSTEM_PORT}" fi @@ -250,11 +248,8 @@ echo "=== Starting frontend (with vLLM processor + KV router) ===" # 2. Runs vLLM's process_inputs() → mm_features with hashes + placeholders # 3. Builds mm_routing_info from mm_features → passes to KvRouter # 4. Forwards mm_hashes to backend for hash consistency -FRONTEND_SYSTEM_PORT_BASE="${FRONTEND_SYSTEM_PORT_BASE:-9080}" - for f in $(seq 1 "${NUM_FRONTENDS}"); do FE_HTTP_PORT=$((HTTP_PORT + f - 1)) - FE_SYSTEM_PORT=$((FRONTEND_SYSTEM_PORT_BASE + f - 1)) # Enable replica sync when running multiple frontends. SYNC_ARGS="" @@ -263,10 +258,10 @@ for f in $(seq 1 "${NUM_FRONTENDS}"); do fi echo - echo "=== Starting frontend replica ${f} (HTTP ${FE_HTTP_PORT}, system ${FE_SYSTEM_PORT}) ===" - env "${COMMON_ENV[@]}" \ + echo "=== Starting frontend replica ${f} (HTTP ${FE_HTTP_PORT}) ===" + env -u DYN_SYSTEM_PORT -u DYN_SYSTEM_PORT1 -u DYN_SYSTEM_PORT2 -u DYN_SYSTEM_PORT3 \ + "${COMMON_ENV[@]}" \ "DYN_LOG=debug" \ - "DYN_SYSTEM_PORT=${FE_SYSTEM_PORT}" \ python -m dynamo.frontend \ --http-port "${FE_HTTP_PORT}" \ --dyn-chat-processor vllm \ @@ -305,8 +300,7 @@ for f in $(seq 1 "${NUM_FRONTENDS}"); do done for i in $(seq 1 "${NUM_WORKERS}"); do if (( NUM_WORKERS > 1 )); then - SYSTEM_PORT_VAR="DYN_SYSTEM_PORT${i}" - WORKER_PORT="${!SYSTEM_PORT_VAR:-$((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))}" + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))) else WORKER_PORT="${DYN_SYSTEM_PORT}" fi diff --git a/examples/backends/vllm/launch/xpu/agg_multimodal_router_xpu.sh b/examples/backends/vllm/launch/xpu/agg_multimodal_router_xpu.sh index f40c3a06c7f2..a0a02963a52a 100755 --- a/examples/backends/vllm/launch/xpu/agg_multimodal_router_xpu.sh +++ b/examples/backends/vllm/launch/xpu/agg_multimodal_router_xpu.sh @@ -155,18 +155,17 @@ fi # DYN_SYSTEM_PORT is expected to be provided by the caller. For multi-worker # launches, use numbered vars (for example: DYN_SYSTEM_PORT1=18081, # DYN_SYSTEM_PORT2=18083). -DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT1:-18081} +DYN_SYSTEM_PORT=$(dyn_port DYN_SYSTEM_PORT 1 18081) # Phase 1: launch all workers in parallel. # Under SINGLE_GPU=true, requires the KV-bytes cap (CI sets it via the # requested_vllm_kv_cache_bytes marker) - otherwise vLLM's 0.9 default races. for i in $(seq 1 "${NUM_WORKERS}"); do if (( NUM_WORKERS > 1 )); then - SYSTEM_PORT_VAR="DYN_SYSTEM_PORT${i}" - WORKER_PORT="${!SYSTEM_PORT_VAR:-$((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))}" + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))) else WORKER_PORT="${DYN_SYSTEM_PORT}" fi - KV_EVENTS_PORT=$((KV_EVENTS_PORT_BASE + (i - 1))) + KV_EVENTS_PORT=$(dyn_port DYN_VLLM_KV_EVENT_PORT "$i" $((KV_EVENTS_PORT_BASE + (i - 1)))) if (( NUM_WORKERS > 1 )); then GPU_ID="${ZE_AFFINITY_MASK_LIST[$((i - 1))]}" else @@ -192,8 +191,7 @@ done # Phase 2: wait for all workers to be ready. for i in $(seq 1 "${NUM_WORKERS}"); do if (( NUM_WORKERS > 1 )); then - SYSTEM_PORT_VAR="DYN_SYSTEM_PORT${i}" - WORKER_PORT="${!SYSTEM_PORT_VAR:-$((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))}" + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))) else WORKER_PORT="${DYN_SYSTEM_PORT}" fi @@ -201,7 +199,8 @@ for i in $(seq 1 "${NUM_WORKERS}"); do done echo "=== Starting frontend (KV router, lightseek MM exact routing) ===" -env "${COMMON_ENV[@]}" \ +env -u DYN_SYSTEM_PORT -u DYN_SYSTEM_PORT1 -u DYN_SYSTEM_PORT2 -u DYN_SYSTEM_PORT3 \ + "${COMMON_ENV[@]}" \ "DYN_LOG=${DYN_LOG_VAL}" \ python -m dynamo.frontend \ --http-port "${HTTP_PORT}" \ @@ -225,13 +224,12 @@ echo "=== All services are ready ===" echo "Frontend: http://127.0.0.1:${HTTP_PORT}" for i in $(seq 1 "${NUM_WORKERS}"); do if (( NUM_WORKERS > 1 )); then - SYSTEM_PORT_VAR="DYN_SYSTEM_PORT${i}" - WORKER_PORT="${!SYSTEM_PORT_VAR:-$((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))}" + WORKER_PORT=$(dyn_port DYN_SYSTEM_PORT "$i" $((VLLM_SYSTEM_PORT_BASE + ($i - 1) * 2))) else WORKER_PORT="${DYN_SYSTEM_PORT}" fi echo "Worker $i health: http://127.0.0.1:${WORKER_PORT}/health" - echo "Worker $i kv-events: tcp://*:$((KV_EVENTS_PORT_BASE + (i - 1)))" + echo "Worker $i kv-events: tcp://*:$(dyn_port DYN_VLLM_KV_EVENT_PORT "$i" $((KV_EVENTS_PORT_BASE + (i - 1))))" done echo echo "Architecture: Rust frontend + lightseek -> ${NUM_WORKERS}x vLLM workers" diff --git a/examples/backends/vllm/launch/xpu/disagg_multimodal_epd_xpu.sh b/examples/backends/vllm/launch/xpu/disagg_multimodal_epd_xpu.sh index b6f4f6206137..6206151afcba 100755 --- a/examples/backends/vllm/launch/xpu/disagg_multimodal_epd_xpu.sh +++ b/examples/backends/vllm/launch/xpu/disagg_multimodal_epd_xpu.sh @@ -82,7 +82,18 @@ print_launch_banner --multimodal "Launching Disaggregated Multimodal E/P/D ($GPU # Start frontend (no router mode) echo "Starting frontend..." # dynamo.frontend accepts either --http-port flag or DYN_HTTP_PORT env var (defaults to 8000) -python -m dynamo.frontend & +env -u DYN_SYSTEM_PORT -u DYN_SYSTEM_PORT1 -u DYN_SYSTEM_PORT2 -u DYN_SYSTEM_PORT3 \ + python -m dynamo.frontend & + +NIXL_PORT_ENCODE="$(dyn_port DYN_VLLM_NIXL_SIDE_CHANNEL_PORT 1 20097)" +NIXL_PORT_PREFILL="$(dyn_port DYN_VLLM_NIXL_SIDE_CHANNEL_PORT 2 20098)" +NIXL_PORT_DECODE="$(dyn_port DYN_VLLM_NIXL_SIDE_CHANNEL_PORT 3 20099)" +KV_PORT_ENCODE="$(dyn_port DYN_VLLM_KV_EVENT_PORT 1 20080)" +KV_PORT_PREFILL="$(dyn_port DYN_VLLM_KV_EVENT_PORT 2 20081)" +KV_PORT_DECODE="$(dyn_port DYN_VLLM_KV_EVENT_PORT 3 20082)" +SYSTEM_PORT_ENCODE="$(dyn_port DYN_SYSTEM_PORT 1 8081)" +SYSTEM_PORT_PREFILL="$(dyn_port DYN_SYSTEM_PORT 2 8082)" +SYSTEM_PORT_DECODE="$(dyn_port DYN_SYSTEM_PORT 3 8083)" EXTRA_ARGS="" PD_EXTRA_ARGS="" @@ -125,21 +136,24 @@ fi # Start encode worker echo "Starting encode worker on GPU $DYN_ENCODE_WORKER_GPU (GPU mem: $DYN_ENCODE_GPU_MEM)..." -VLLM_NIXL_SIDE_CHANNEL_PORT=20097 \ +DYN_SYSTEM_PORT=$SYSTEM_PORT_ENCODE \ +VLLM_NIXL_SIDE_CHANNEL_PORT=$NIXL_PORT_ENCODE \ env $DEVICE_AFFINITY_ENV=$DYN_ENCODE_WORKER_GPU \ -python -m dynamo.vllm --enable-multimodal --disaggregation-mode encode --enable-mm-embeds --model $MODEL_NAME --gpu-memory-utilization $DYN_ENCODE_GPU_MEM $EXTRA_ARGS --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device": "'"$DEVICE_PLATFORM"'"}' --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20080"}' & +python -m dynamo.vllm --enable-multimodal --disaggregation-mode encode --enable-mm-embeds --model $MODEL_NAME --gpu-memory-utilization $DYN_ENCODE_GPU_MEM $EXTRA_ARGS --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device": "'"$DEVICE_PLATFORM"'"}' --kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${KV_PORT_ENCODE}\"}" & # Start prefill worker (also handles encode routing via --route-to-encoder) echo "Starting prefill worker on GPU $DYN_PREFILL_WORKER_GPU (GPU mem: $DYN_PREFILL_GPU_MEM)..." -VLLM_NIXL_SIDE_CHANNEL_PORT=20098 \ +DYN_SYSTEM_PORT=$SYSTEM_PORT_PREFILL \ +VLLM_NIXL_SIDE_CHANNEL_PORT=$NIXL_PORT_PREFILL \ env $DEVICE_AFFINITY_ENV=$DYN_PREFILL_WORKER_GPU \ -python -m dynamo.vllm --route-to-encoder --disaggregation-mode prefill --enable-multimodal --enable-mm-embeds --model $MODEL_NAME --gpu-memory-utilization $DYN_PREFILL_GPU_MEM $EXTRA_ARGS $PD_EXTRA_ARGS --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device": "'"$DEVICE_PLATFORM"'"}' --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20081"}' & +python -m dynamo.vllm --route-to-encoder --disaggregation-mode prefill --enable-multimodal --enable-mm-embeds --model $MODEL_NAME --gpu-memory-utilization $DYN_PREFILL_GPU_MEM $EXTRA_ARGS $PD_EXTRA_ARGS --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device": "'"$DEVICE_PLATFORM"'"}' --kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${KV_PORT_PREFILL}\"}" & # Start decode worker echo "Starting decode worker on GPU $DYN_DECODE_WORKER_GPU (GPU mem: $DYN_DECODE_GPU_MEM)..." -VLLM_NIXL_SIDE_CHANNEL_PORT=20099 \ +DYN_SYSTEM_PORT=$SYSTEM_PORT_DECODE \ +VLLM_NIXL_SIDE_CHANNEL_PORT=$NIXL_PORT_DECODE \ env $DEVICE_AFFINITY_ENV=$DYN_DECODE_WORKER_GPU \ -python -m dynamo.vllm --disaggregation-mode decode --enable-multimodal --enable-mm-embeds --model $MODEL_NAME --gpu-memory-utilization $DYN_DECODE_GPU_MEM $EXTRA_ARGS $PD_EXTRA_ARGS --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device": "'"$DEVICE_PLATFORM"'"}' --kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20082"}' & +python -m dynamo.vllm --disaggregation-mode decode --enable-multimodal --enable-mm-embeds --model $MODEL_NAME --gpu-memory-utilization $DYN_DECODE_GPU_MEM $EXTRA_ARGS $PD_EXTRA_ARGS --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device": "'"$DEVICE_PLATFORM"'"}' --kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${KV_PORT_DECODE}\"}" & echo "==================================================" diff --git a/examples/common/launch_utils.sh b/examples/common/launch_utils.sh index f757f55a34e4..8bc26e61b215 100755 --- a/examples/common/launch_utils.sh +++ b/examples/common/launch_utils.sh @@ -40,6 +40,48 @@ fi EXAMPLE_PROMPT="Who is the tennis GOAT: Federer, Djokovic, or Nadal?" EXAMPLE_PROMPT_VISUAL="A golden retriever riding a skateboard through a neon-lit city" +# Resolve an indexed managed port, retaining a standalone fallback. +# Usage: dyn_port DYN_SYSTEM_PORT 1 8081 +dyn_port() { + local prefix="$1" + local index="$2" + local fallback="$3" + local variable="${prefix}${index}" + local value="${!variable:-}" + local minimum_port=1 + local maximum_port=65535 + + if [[ "${prefix}" == "DYN_SYSTEM_PORT" ]]; then + minimum_port=0 + maximum_port=32767 + fi + + local selected="${value:-${fallback}}" + + if [[ -n "${DYN_MANAGED_PORTS:-}" ]]; then + if [[ ! "${value}" =~ ^[0-9]+$ ]]; then + echo "Missing or invalid managed port ${variable}: ${value:-}" >&2 + return 1 + fi + if (( 10#${value} < minimum_port || 10#${value} > maximum_port )); then + echo "Managed port ${variable} is out of range: ${value}" >&2 + return 1 + fi + printf '%s\n' "${value}" + return 0 + fi + + if [[ -n "${value}" && ! "${value}" =~ ^[0-9]+$ ]]; then + echo "Invalid port ${variable}: ${value}" >&2 + return 1 + fi + if [[ ! "${selected}" =~ ^[0-9]+$ ]] || (( 10#${selected} < minimum_port || 10#${selected} > maximum_port )); then + echo "Port ${variable} is out of range: ${selected}" >&2 + return 1 + fi + printf '%s\n' "${selected}" +} + # wait_any_exit # # Waits for ANY backgrounded process to exit and propagates its exit code. diff --git a/tests/conftest.py b/tests/conftest.py index 216658cf4c02..f7973f6d27d7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1294,7 +1294,7 @@ def dynamo_dynamic_ports(num_system_ports) -> Generator[ServicePorts, None, None - frontend_port: OpenAI-compatible HTTP/gRPC ingress (dynamo.frontend) - system_ports: List of worker metrics/system ports (configurable count via num_system_ports) - - kv_event_port: ZMQ port for vLLM KV event publishing (avoids collisions under xdist) + - kv_event_ports: one ZMQ port per worker for vLLM KV event publishing """ # Track ports as they are allocated so a failure mid-sequence (e.g. NIXL # allocation raising) still cleans up earlier reservations via finally, @@ -1305,8 +1305,8 @@ def dynamo_dynamic_ports(num_system_ports) -> Generator[ServicePorts, None, None all_ports.append(frontend_port) system_port_list = allocate_ports(num_system_ports, DynamoPortRange.SERVE.value) all_ports.extend(system_port_list) - kv_event_port = allocate_port(DynamoPortRange.SERVE.value) - all_ports.append(kv_event_port) + kv_event_ports = allocate_ports(num_system_ports, DynamoPortRange.SERVE.value) + all_ports.extend(kv_event_ports) fpm_port = allocate_port(DynamoPortRange.FPM.value) all_ports.append(fpm_port) # One NIXL side-channel port per worker (avoids xdist collisions on shared hosts). @@ -1317,7 +1317,7 @@ def dynamo_dynamic_ports(num_system_ports) -> Generator[ServicePorts, None, None yield ServicePorts( frontend_port=frontend_port, system_ports=system_port_list, - kv_event_port=kv_event_port, + kv_event_ports=kv_event_ports, fpm_port=fpm_port, nixl_side_channel_ports=nixl_side_channel_ports, ) diff --git a/tests/serve/common.py b/tests/serve/common.py index e6e101fe055d..d4a1520d8fa6 100644 --- a/tests/serve/common.py +++ b/tests/serve/common.py @@ -128,7 +128,6 @@ class _PreparedDeployment: frontend_port: int system_ports: list disagg_bootstrap_port: Optional[int] - extra_allocated_ports: list[int] def _prepare_deployment( @@ -189,9 +188,6 @@ def _prepare_deployment( logger.info("Staggering startup by %ds (xdist %s)", stagger_s, worker_id) time.sleep(stagger_s) - # Track additional ports allocated for multi-GPU tests (for cleanup in finally) - extra_allocated_ports: list[int] = [] - if ports is not None: dynamic_frontend_port = int(ports.frontend_port) dynamic_system_ports = [int(p) for p in ports.system_ports] @@ -223,19 +219,33 @@ def _prepare_deployment( merged_env[f"DYN_SYSTEM_PORT{idx}"] = str(port) merged_env[f"DYN_SYSTEM_PORT_WORKER{idx}"] = str(port) - # Unique ZMQ port for vLLM KV event publishing (avoids xdist collisions). - if ports.kv_event_port: - merged_env["DYN_VLLM_KV_EVENT_PORT"] = str(ports.kv_event_port) - # For multi-worker scripts (xpu_2 router tests), allocate separate - # KV event ports for each worker to avoid ZMQ bind collisions. - if len(dynamic_system_ports) >= 2: - kv_port1 = ports.kv_event_port - kv_port2 = allocate_port(ports.kv_event_port + 1) - extra_allocated_ports.append(kv_port2) - merged_env["DYN_VLLM_KV_EVENT_PORT1"] = str(kv_port1) - merged_env["DYN_VLLM_KV_EVENT_PORT2"] = str(kv_port2) + if len(ports.kv_event_ports) != len(dynamic_system_ports): + raise ValueError( + "KV-event port count must match system port count: " + f"{len(ports.kv_event_ports)} != {len(dynamic_system_ports)}" + ) + for key in list(merged_env): + if key == "DYN_VLLM_KV_EVENT_PORT": + merged_env.pop(key) + continue + if key.startswith("DYN_VLLM_KV_EVENT_PORT"): + suffix = key.removeprefix("DYN_VLLM_KV_EVENT_PORT") + if suffix.isdigit(): + merged_env.pop(key) + for idx, port in enumerate(ports.kv_event_ports, start=1): + merged_env[f"DYN_VLLM_KV_EVENT_PORT{idx}"] = str(port) # Per-worker NIXL side-channel ports (avoids xdist collisions on 20097). + if len(ports.nixl_side_channel_ports) != len(dynamic_system_ports): + raise ValueError( + "NIXL side-channel port count must match system port count: " + f"{len(ports.nixl_side_channel_ports)} != {len(dynamic_system_ports)}" + ) + for key in list(merged_env): + if key.startswith("DYN_VLLM_NIXL_SIDE_CHANNEL_PORT"): + suffix = key.removeprefix("DYN_VLLM_NIXL_SIDE_CHANNEL_PORT") + if suffix.isdigit(): + merged_env.pop(key) for idx, port in enumerate(ports.nixl_side_channel_ports, start=1): merged_env[f"DYN_VLLM_NIXL_SIDE_CHANNEL_PORT{idx}"] = str(port) @@ -259,6 +269,9 @@ def _prepare_deployment( config = _with_endpoint_readiness_checks(config, dynamic_frontend_port) + if ports is not None: + merged_env["DYN_MANAGED_PORTS"] = "1" + # Disagg scripts need a unique bootstrap port so parallel runs don't collide. disagg_bootstrap_port: int | None = None if config.script_name and "disagg" in config.script_name: @@ -271,15 +284,12 @@ def _prepare_deployment( frontend_port=dynamic_frontend_port, system_ports=dynamic_system_ports, disagg_bootstrap_port=disagg_bootstrap_port, - extra_allocated_ports=extra_allocated_ports, ) def _cleanup_prepared_deployment(prep: _PreparedDeployment) -> None: if prep.disagg_bootstrap_port is not None: deallocate_port(prep.disagg_bootstrap_port) - for port in prep.extra_allocated_ports: - deallocate_port(port) @contextmanager diff --git a/tests/serve/multimodal_profiles/vllm.py b/tests/serve/multimodal_profiles/vllm.py index d7f67c2509a3..28b02db3a769 100644 --- a/tests/serve/multimodal_profiles/vllm.py +++ b/tests/serve/multimodal_profiles/vllm.py @@ -195,6 +195,7 @@ # Post_merge MM-routing coverage for the Qwen3-VL family — the # smaller Qwen3.5-0.8B (`agg_router` below) is the pre_merge gater. "agg_router": TopologyConfig( + health_check_workers=True, marks=[pytest.mark.post_merge], timeout_s=400, profiled_vram_gib=13.0, @@ -220,6 +221,7 @@ # SINGLE_GPU=true packs both workers onto GPU 0 to match the # single-GPU CI environment. "agg_router_chat_processor": TopologyConfig( + health_check_workers=True, marks=[pytest.mark.post_merge], timeout_s=400, profiled_vram_gib=13.0, @@ -265,6 +267,8 @@ ], ), "epd": TopologyConfig( + health_check_workers=True, + health_check_worker_count=3, marks=[pytest.mark.post_merge], timeout_s=300, single_gpu=True, @@ -282,6 +286,8 @@ ], ), "epd_video": TopologyConfig( + health_check_workers=True, + health_check_worker_count=3, # E/P/D regression gate: the decode handoff must retain both # the reconstructed image placeholder and reloaded video. marks=[ @@ -320,6 +326,7 @@ ], ), "p_d": TopologyConfig( + health_check_workers=True, marks=[pytest.mark.post_merge], timeout_s=300, single_gpu=True, @@ -342,6 +349,7 @@ short_name="qwen2.5-vl-3b", topologies={ "agg_router": TopologyConfig( + health_check_workers=True, marks=[pytest.mark.post_merge], timeout_s=500, profiled_vram_gib=19.0, @@ -371,6 +379,7 @@ short_name="qwen2-vl-2b", topologies={ "agg_router": TopologyConfig( + health_check_workers=True, marks=[pytest.mark.post_merge], timeout_s=500, profiled_vram_gib=16.0, @@ -421,6 +430,7 @@ # hit-rate ceiling (N-1)/N. Filler 120 → ~6 blocks → ceiling ≈0.83; # threshold 0.7 fires on real degradation, tolerates variance. "agg_router": TopologyConfig( + health_check_workers=True, marks=[pytest.mark.pre_merge], timeout_s=400, profiled_vram_gib=8.0, diff --git a/tests/serve/multimodal_profiles/vllm_xpu.py b/tests/serve/multimodal_profiles/vllm_xpu.py index 43ae69d59b56..65dc7047d4db 100644 --- a/tests/serve/multimodal_profiles/vllm_xpu.py +++ b/tests/serve/multimodal_profiles/vllm_xpu.py @@ -115,6 +115,7 @@ # assertions live in tests/mm_router/test_router_rust_mm_router_e2e.py # (post_merge). "agg_router": TopologyConfig( + health_check_workers=True, marks=[pytest.mark.pre_merge, pytest.mark.xpu_2], gpu_marker="xpu_2", timeout_s=400, @@ -133,6 +134,7 @@ # SINGLE_GPU=true packs both workers onto GPU 0 to match the # single-GPU CI environment. "agg_router_chat_processor": TopologyConfig( + health_check_workers=True, marks=[pytest.mark.post_merge, pytest.mark.xpu_2], gpu_marker="xpu_2", timeout_s=400, @@ -177,6 +179,7 @@ short_name="qwen2.5-vl-3b", topologies={ "agg_router": TopologyConfig( + health_check_workers=True, marks=[pytest.mark.post_merge], timeout_s=500, gpu_marker="xpu_2", @@ -192,6 +195,7 @@ short_name="qwen2-vl-2b", topologies={ "agg_router": TopologyConfig( + health_check_workers=True, marks=[pytest.mark.post_merge], timeout_s=500, gpu_marker="xpu_2", diff --git a/tests/serve/test_port_contract.py b/tests/serve/test_port_contract.py new file mode 100644 index 000000000000..4b320500a0db --- /dev/null +++ b/tests/serve/test_port_contract.py @@ -0,0 +1,257 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +import subprocess +from pathlib import Path + +import pytest + +from tests.serve.common import _cleanup_prepared_deployment, _prepare_deployment +from tests.utils.constants import DynamoPortRange +from tests.utils.engine_process import EngineConfig +from tests.utils.port_utils import ServicePorts, reserved_ports + +pytestmark = [pytest.mark.unit, pytest.mark.pre_merge, pytest.mark.gpu_0] + + +class _RequestNode: + def get_closest_marker(self, _name: str) -> None: + return None + + +class _Request: + node = _RequestNode() + + +def _config(directory: str) -> EngineConfig: + return EngineConfig( + name="port-contract", + directory=directory, + script_name="agg_multimodal_router.sh", + model="test-model", + marks=[], + request_payloads=[], + ) + + +def _prepare(ports: ServicePorts, directory: str): + """Build and clean up a deployment while returning its environment.""" + prepared = _prepare_deployment( + _config(directory), _Request(), ports=ports, extra_env=None + ) + try: + return dict(prepared.merged_env) + finally: + _cleanup_prepared_deployment(prepared) + + +def test_prepared_environment_exports_complete_worker_port_vectors( + tmp_path: Path, +) -> None: + """Export one managed system, KV-event, and NIXL port per worker.""" + with reserved_ports(10, DynamoPortRange.SERVE.value) as allocated: + frontend = allocated[0] + system_ports = allocated[1:4] + kv_event_ports = allocated[4:7] + nixl_ports = allocated[7:10] + ports = ServicePorts( + frontend_port=frontend, + system_ports=system_ports, + kv_event_ports=kv_event_ports, + nixl_side_channel_ports=nixl_ports, + ) + env = _prepare(ports, str(tmp_path)) + + assert env["DYN_MANAGED_PORTS"] == "1" + assert env["DYN_SYSTEM_PORT"] == str(system_ports[0]) + assert "DYN_VLLM_KV_EVENT_PORT" not in env + assert [env[f"DYN_SYSTEM_PORT{i}"] for i in range(1, 4)] == [ + str(port) for port in system_ports + ] + assert [env[f"DYN_VLLM_KV_EVENT_PORT{i}"] for i in range(1, 4)] == [ + str(port) for port in kv_event_ports + ] + assert [env[f"DYN_VLLM_NIXL_SIDE_CHANNEL_PORT{i}"] for i in range(1, 4)] == [ + str(port) for port in nixl_ports + ] + + +def test_dyn_port_accepts_managed_ephemeral_system_port() -> None: + """Allow zero for a managed system port so the runtime can bind ephemerally.""" + launch_utils = Path(__file__).parents[2] / "examples/common/launch_utils.sh" + with reserved_ports(1, DynamoPortRange.SERVE.value) as allocated: + result = subprocess.run( + [ + "bash", + "-c", + f"source {launch_utils}; dyn_port DYN_SYSTEM_PORT 1 {allocated[0]}", + ], + capture_output=True, + text=True, + check=False, + env={"DYN_MANAGED_PORTS": "1", "DYN_SYSTEM_PORT1": "0"}, + ) + + assert result.returncode == 0 + assert result.stdout.strip() == "0" + + +def test_dyn_port_requires_indexed_values_in_managed_mode() -> None: + """Reject a managed launch when a required indexed port is absent.""" + launch_utils = Path(__file__).parents[2] / "examples/common/launch_utils.sh" + with reserved_ports(2, DynamoPortRange.SERVE.value) as allocated: + command = ( + f"source {launch_utils}; " + "DYN_MANAGED_PORTS=1; " + f"dyn_port DYN_SYSTEM_PORT 1 {allocated[0]}; " + f"dyn_port DYN_SYSTEM_PORT 2 {allocated[1]}" + ) + result = subprocess.run( + ["bash", "-c", command], + capture_output=True, + text=True, + check=False, + env={"DYN_SYSTEM_PORT1": str(allocated[0])}, + ) + + assert result.returncode != 0 + assert result.stdout.splitlines() == [str(allocated[0])] + assert "DYN_SYSTEM_PORT2" in result.stderr + + +def test_dyn_port_keeps_standalone_fallback() -> None: + """Use the supplied fallback when a standalone launch has no override.""" + launch_utils = Path(__file__).parents[2] / "examples/common/launch_utils.sh" + with reserved_ports(1, DynamoPortRange.SERVE.value) as allocated: + result = subprocess.run( + [ + "bash", + "-c", + f"source {launch_utils}; dyn_port DYN_SYSTEM_PORT 1 {allocated[0]}", + ], + capture_output=True, + text=True, + check=False, + env={}, + ) + + assert result.returncode == 0 + assert result.stdout.strip() == str(allocated[0]) + + +def test_dyn_port_keeps_explicit_standalone_system_port() -> None: + """Preserve an explicit system-port override for standalone launches.""" + launch_utils = Path(__file__).parents[2] / "examples/common/launch_utils.sh" + with reserved_ports(1, DynamoPortRange.SERVE.value) as allocated: + result = subprocess.run( + [ + "bash", + "-c", + f"source {launch_utils}; dyn_port DYN_SYSTEM_PORT 1 {allocated[0]}", + ], + capture_output=True, + text=True, + check=False, + env={"DYN_SYSTEM_PORT1": str(allocated[0])}, + ) + + assert result.returncode == 0 + assert result.stdout.strip() == str(allocated[0]) + + +def test_dyn_port_rejects_invalid_explicit_value() -> None: + """Reject malformed standalone port overrides.""" + launch_utils = Path(__file__).parents[2] / "examples/common/launch_utils.sh" + with reserved_ports(1, DynamoPortRange.SERVE.value) as allocated: + result = subprocess.run( + [ + "bash", + "-c", + f"source {launch_utils}; dyn_port DYN_SYSTEM_PORT 1 {allocated[0]}", + ], + capture_output=True, + text=True, + check=False, + env={"DYN_SYSTEM_PORT1": "not-a-port"}, + ) + + assert result.returncode != 0 + assert "DYN_SYSTEM_PORT1" in result.stderr + + +def test_dyn_port_rejects_invalid_managed_value() -> None: + """Reject malformed managed port overrides.""" + launch_utils = Path(__file__).parents[2] / "examples/common/launch_utils.sh" + with reserved_ports(1, DynamoPortRange.SERVE.value) as allocated: + result = subprocess.run( + [ + "bash", + "-c", + f"source {launch_utils}; dyn_port DYN_SYSTEM_PORT 1 {allocated[0]}", + ], + capture_output=True, + text=True, + check=False, + env={"DYN_MANAGED_PORTS": "1", "DYN_SYSTEM_PORT1": "not-a-port"}, + ) + + assert result.returncode != 0 + assert "DYN_SYSTEM_PORT1" in result.stderr + + +def test_dyn_port_rejects_out_of_range_value() -> None: + """Reject numeric port overrides outside the runtime range.""" + launch_utils = Path(__file__).parents[2] / "examples/common/launch_utils.sh" + with reserved_ports(1, DynamoPortRange.SERVE.value) as allocated: + result = subprocess.run( + [ + "bash", + "-c", + f"source {launch_utils}; dyn_port DYN_SYSTEM_PORT 1 {allocated[0]}", + ], + capture_output=True, + text=True, + check=False, + env={"DYN_SYSTEM_PORT1": "65536"}, + ) + + assert result.returncode != 0 + assert "DYN_SYSTEM_PORT1" in result.stderr + + +def test_dyn_port_rejects_out_of_range_fallback() -> None: + """Reject a standalone fallback outside the runtime port range.""" + launch_utils = Path(__file__).parents[2] / "examples/common/launch_utils.sh" + result = subprocess.run( + [ + "bash", + "-c", + f"source {launch_utils}; dyn_port DYN_SYSTEM_PORT 1 65536", + ], + capture_output=True, + text=True, + check=False, + env={}, + ) + + assert result.returncode != 0 + assert "DYN_SYSTEM_PORT1" in result.stderr + + +def test_dyn_port_accepts_high_non_system_port() -> None: + """Allow valid TCP ports above the system-status server's signed range.""" + launch_utils = Path(__file__).parents[2] / "examples/common/launch_utils.sh" + result = subprocess.run( + [ + "bash", + "-c", + f"source {launch_utils}; dyn_port DYN_VLLM_KV_EVENT_PORT 1 20000", + ], + capture_output=True, + text=True, + check=False, + env={"DYN_VLLM_KV_EVENT_PORT1": "40000"}, + ) + + assert result.returncode == 0 + assert result.stdout.strip() == "40000" diff --git a/tests/serve/test_vllm.py b/tests/serve/test_vllm.py index c7f9a653f256..1eee3b045643 100644 --- a/tests/serve/test_vllm.py +++ b/tests/serve/test_vllm.py @@ -843,7 +843,7 @@ def vllm_config_test(request): @pytest.mark.vllm @pytest.mark.e2e -@pytest.mark.parametrize("num_system_ports", [2], indirect=True) +@pytest.mark.parametrize("num_system_ports", [3], indirect=True) def test_serve_deployment( vllm_config_test, request, @@ -856,9 +856,7 @@ def test_serve_deployment( """ Test dynamo serve deployments with different graph configurations. """ - assert ( - num_system_ports >= 2 - ), "serve tests require at least SYSTEM_PORT1 + SYSTEM_PORT2" + assert num_system_ports >= 3 config = dataclasses.replace( vllm_config_test, frontend_port=dynamo_dynamic_ports.frontend_port ) diff --git a/tests/utils/multimodal.py b/tests/utils/multimodal.py index 498327e26e27..8686700fc405 100644 --- a/tests/utils/multimodal.py +++ b/tests/utils/multimodal.py @@ -564,6 +564,8 @@ class TopologyConfig: gpu_marker: Optional[str] = None # override profile-level gpu_marker single_gpu: bool = False # append --single-gpu to script_args two_gpu: bool = False # append --two-gpu to script_args (epd only) + health_check_workers: bool = False + health_check_worker_count: int = 2 env: dict[str, str] = field(default_factory=dict) # extra env vars for subprocess tests: list[MmCase] = field(default_factory=list) @@ -673,6 +675,8 @@ def make_multimodal_configs( script_args=list(base_script_args) + list(case.extra_script_args), marks=marks, delayed_start=topo_cfg.delayed_start, + health_check_workers=topo_cfg.health_check_workers, + health_check_worker_count=topo_cfg.health_check_worker_count, request_payloads=[case.payload, *case.followup_payloads], env={**topo_env, **case.env}, ) diff --git a/tests/utils/port_utils.py b/tests/utils/port_utils.py index a3fa5344934d..175e4b23a68e 100644 --- a/tests/utils/port_utils.py +++ b/tests/utils/port_utils.py @@ -41,7 +41,7 @@ class ServicePorts: frontend_port: int system_ports: list[int] - kv_event_port: int = 0 + kv_event_ports: list[int] = field(default_factory=list) fpm_port: int = 0 # Per-worker VLLM_NIXL_SIDE_CHANNEL_PORT values; unique per deployment so # parallel (xdist) deployments on one host don't collide. From 5024ac90f4c9c130545db177aa5ac072b8008357 Mon Sep 17 00:00:00 2001 From: GLAMR Date: Thu, 17 Sep 2026 16:33:46 -0400 Subject: [PATCH 080/191] fix(runtime): reject invalid DYN_REQUEST_PLANE values (#12612) Signed-off-by: svc-glamr@nvidia.com Signed-off-by: Matej Kosec Signed-off-by: Coding Agent Signed-off-by: GLAMR Co-authored-by: MatejKosec --- .../system-architecture/architecture.md | 5 + lib/runtime/src/distributed.rs | 102 +++++++++++++++--- 2 files changed, 94 insertions(+), 13 deletions(-) diff --git a/docs/fern/pages/developer-guide/knowledge-base/concepts/system-architecture/architecture.md b/docs/fern/pages/developer-guide/knowledge-base/concepts/system-architecture/architecture.md index c762354a17c5..85a532593294 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/concepts/system-architecture/architecture.md +++ b/docs/fern/pages/developer-guide/knowledge-base/concepts/system-architecture/architecture.md @@ -69,6 +69,11 @@ The request plane carries RPC traffic between Dynamo components. `DYN_REQUEST_PL - `tcp` is the default and uses direct pooled connections. - `nats` uses brokered request transport. +When the runtime reads this setting from its environment, an absent value selects +`tcp`. Every present value, including an empty value, must be `tcp` or `nats` +(case-insensitive); any other value stops startup instead of silently selecting +`tcp`. + `DYN_REQUEST_PLANE_CODEC` selects `msgpack` or `json`. The destination endpoint advertises its codec, so one client can communicate with endpoints that use different codecs. ### Event Plane diff --git a/lib/runtime/src/distributed.rs b/lib/runtime/src/distributed.rs index 45e9bed1d07a..be0a139e3642 100644 --- a/lib/runtime/src/distributed.rs +++ b/lib/runtime/src/distributed.rs @@ -413,7 +413,7 @@ impl DistributedRuntime { } pub async fn from_settings(runtime: Runtime) -> Result { - let config = DistributedConfig::from_settings(); + let config = DistributedConfig::try_from_settings()?; Self::new(runtime, config).await } @@ -839,8 +839,11 @@ impl DistributedConfig { /// # Panics /// Panics if a discovery or transport setting is invalid. pub fn from_settings() -> DistributedConfig { + Self::try_from_settings().unwrap_or_else(|err| panic!("{err}")) + } + + pub fn try_from_settings() -> Result { Self::from_settings_with_overrides(None, None, None) - .unwrap_or_else(|error| panic!("{error}")) } /// Resolve per-worker options before environment defaults, without mutating @@ -852,7 +855,7 @@ impl DistributedConfig { ) -> Result { let request_plane = match request_plane { Some(value) => value.parse()?, - None => RequestPlaneMode::from_env(), + None => RequestPlaneMode::from_env()?, }; // Determine the discovery backend first — we need it to compute the NATS default below. @@ -919,11 +922,15 @@ impl DistributedConfig { } pub fn for_cli() -> DistributedConfig { + Self::try_for_cli().unwrap_or_else(|err| panic!("{err}")) + } + + pub fn try_for_cli() -> Result { let etcd_config = etcd::ClientOptions { attach_lease: false, ..Default::default() }; - let request_plane = RequestPlaneMode::from_env(); + let request_plane = RequestPlaneMode::from_env()?; let discovery_backend = DiscoveryBackend::KvStore(kv::Selector::Etcd(Box::new(etcd_config))); let event_transport_kind = discovery_backend.resolve_event_transport_kind(); @@ -933,7 +940,7 @@ impl DistributedConfig { event_transport_kind, crate::discovery::EventTransportKind::Nats ); - DistributedConfig { + Ok(DistributedConfig { discovery_backend, nats_config: if nats_enabled { Some(nats::ClientOptions::default()) @@ -943,7 +950,7 @@ impl DistributedConfig { request_plane, response_plane: None, event_transport_kind, - } + }) } /// A DistributedConfig that isn't distributed, for when the frontend and backend are in the @@ -1000,13 +1007,22 @@ impl std::str::FromStr for RequestPlaneMode { } impl RequestPlaneMode { - /// Get the request plane mode from environment variable (uncached) - /// Reads from `DYN_REQUEST_PLANE` environment variable. - fn from_env() -> Self { - std::env::var(crate::config::environment_names::request_plane::DYN_REQUEST_PLANE) - .ok() - .and_then(|s| s.parse().ok()) - .unwrap_or_default() + fn from_env() -> Result { + Self::from_env_result(std::env::var( + crate::config::environment_names::request_plane::DYN_REQUEST_PLANE, + )) + } + + fn from_env_result(value: std::result::Result) -> Result { + match value { + Err(std::env::VarError::NotPresent) => Ok(Self::default()), + Ok(s) => s.parse(), + Err(std::env::VarError::NotUnicode(raw)) => Err(anyhow::anyhow!( + "Invalid request plane mode: '{}' is not valid Unicode. \ + Valid options are: 'nats', 'tcp'", + raw.to_string_lossy() + )), + } } pub fn is_nats(&self) -> bool { @@ -1014,6 +1030,66 @@ impl RequestPlaneMode { } } +#[cfg(test)] +mod request_plane_env_tests { + use super::RequestPlaneMode; + + #[test] + fn absent_request_plane_defaults_to_tcp() { + let mode = RequestPlaneMode::from_env_result(Err(std::env::VarError::NotPresent)) + .expect("an absent DYN_REQUEST_PLANE must not be an error"); + assert_eq!(mode, RequestPlaneMode::Tcp); + } + + #[test] + fn empty_request_plane_is_an_error() { + RequestPlaneMode::from_env_result(Ok(String::new())) + .expect_err("an empty DYN_REQUEST_PLANE must not silently fall back to TCP"); + } + + #[test] + fn valid_request_plane_value_resolves() { + let mode = RequestPlaneMode::from_env_result(Ok("nats".to_string())) + .expect("DYN_REQUEST_PLANE=nats should resolve"); + assert_eq!(mode, RequestPlaneMode::Nats); + } + + #[test] + fn invalid_request_plane_is_an_error_naming_value_and_options() { + let err = RequestPlaneMode::from_env_result(Ok("nat".to_string())) + .expect_err("a misspelled DYN_REQUEST_PLANE must not silently fall back to TCP"); + let message = err.to_string(); + assert!( + message.contains("nat"), + "error should name the offending value, got: {message}" + ); + assert!( + message.contains("'nats'") && message.contains("'tcp'"), + "error should list the valid options, got: {message}" + ); + } + + #[cfg(unix)] + #[test] + fn non_unicode_request_plane_is_an_error_not_a_default() { + use std::ffi::OsString; + use std::os::unix::ffi::OsStringExt; + + let raw = OsString::from_vec(b"nat\xff".to_vec()); + let err = RequestPlaneMode::from_env_result(Err(std::env::VarError::NotUnicode(raw))) + .expect_err("a non-Unicode DYN_REQUEST_PLANE must not silently fall back to TCP"); + let message = err.to_string(); + assert!( + message.contains("not valid Unicode"), + "error should say the value was not valid Unicode, got: {message}" + ); + assert!( + message.contains("'nats'") && message.contains("'tcp'"), + "error should list the valid options, got: {message}" + ); + } +} + pub mod distributed_test_utils { //! Common test helper functions for DistributedRuntime tests From 0b787165127cf1ba97e1f4fd335fdb22be765ab5 Mon Sep 17 00:00:00 2001 From: Xianlu Bird Date: Fri, 18 Sep 2026 04:45:23 +0800 Subject: [PATCH 081/191] fix(responses): preserve text instead of inferring tool calls (#14846) Signed-off-by: xianlubird Co-authored-by: Ryan McCormick --- lib/llm/src/protocols/openai/responses/mod.rs | 276 ++---------------- lib/llm/tests/aggregators.rs | 46 +++ lib/llm/tests/tool_choice.rs | 34 +++ 3 files changed, 106 insertions(+), 250 deletions(-) diff --git a/lib/llm/src/protocols/openai/responses/mod.rs b/lib/llm/src/protocols/openai/responses/mod.rs index f58dcdfd0724..a95a237f6e1f 100644 --- a/lib/llm/src/protocols/openai/responses/mod.rs +++ b/lib/llm/src/protocols/openai/responses/mod.rs @@ -947,76 +947,6 @@ fn convert_top_logprobs(input: Option) -> Option { input.map(|x| x.min(20)) } -/// Parse `` blocks from model text output. -/// Returns a list of (name, arguments_json) tuples. -/// Returns an empty vec immediately if no `` tag is present. -fn parse_tool_call_text(text: &str) -> Vec<(String, String)> { - if !text.contains("") { - return Vec::new(); - } - let mut results = Vec::new(); - let mut search_start = 0; - while let Some(start) = text[search_start..].find("") { - let abs_start = search_start + start + "".len(); - if let Some(end) = text[abs_start..].find("") { - let block = text[abs_start..abs_start + end].trim(); - if let Ok(parsed) = serde_json::from_str::(block) { - let name = parsed - .get("name") - .and_then(|v| v.as_str()) - .unwrap_or("") - .to_string(); - let arguments = if let Some(args) = parsed.get("arguments") { - if args.is_string() { - args.as_str().unwrap_or("{}").to_string() - } else { - serde_json::to_string(args).unwrap_or_else(|_| "{}".to_string()) - } - } else { - "{}".to_string() - }; - if !name.is_empty() { - results.push((name, arguments)); - } - } - search_start = abs_start + end + "".len(); - } else { - break; - } - } - results -} - -/// Strip `...` blocks and any `...` blocks from text. -/// Returns the original string (no allocation) if no tags are present. -fn strip_tool_call_text(text: &str) -> std::borrow::Cow<'_, str> { - let has_tool = text.contains(""); - let has_think = text.contains(""); - if !has_tool && !has_think { - return std::borrow::Cow::Borrowed(text); - } - - fn strip_tag(input: &mut String, open: &str, close: &str) { - while let Some(start) = input.find(open) { - if let Some(end_offset) = input[start..].find(close) { - input.replace_range(start..start + end_offset + close.len(), ""); - } else { - input.truncate(start); - break; - } - } - } - - let mut result = text.to_string(); - if has_tool { - strip_tag(&mut result, "", ""); - } - if has_think { - strip_tag(&mut result, "", ""); - } - std::borrow::Cow::Owned(result) -} - // --------------------------------------------------------------------------- // Chat Completions -> Responses API response conversion // --------------------------------------------------------------------------- @@ -1151,18 +1081,6 @@ fn make_text_message(id: String, text: String) -> OutputItem { }) } -/// Build a function call output item with generated IDs. -fn make_function_call(name: String, arguments: String, namespace: Option) -> OutputItem { - OutputItem::FunctionCall(FunctionToolCall { - arguments, - call_id: format!("call_{}", Uuid::new_v4().simple()), - namespace, - name, - id: Some(format!("fc_{}", Uuid::new_v4().simple())), - status: Some(OutputStatus::Completed), - }) -} - /// Convert a ChatCompletion response into a Responses API response object, /// echoing back the actual request parameters from `params`. pub fn chat_completion_to_response( @@ -1213,8 +1131,6 @@ pub fn chat_completion_to_response( })); } } - // Handle text content -- also parse blocks from models - // that emit tool calls as text (e.g. Qwen3) let content_text = match choice.message.content { Some(dynamo_protocols::types::ChatCompletionMessageContent::Text(text)) => Some(text), Some(dynamo_protocols::types::ChatCompletionMessageContent::Parts(_)) => { @@ -1228,39 +1144,7 @@ pub fn chat_completion_to_response( if let Some(content_text) = content_text && !content_text.is_empty() { - let has_enabled_tools = params.tools.as_ref().is_some_and(|tools| { - tools.iter().any(|tool| match tool { - Tool::Function(_) => true, - Tool::Namespace(namespace) => namespace - .tools - .iter() - .any(|tool| matches!(tool, NamespaceToolParamTool::Function(_))), - _ => false, - }) - }) && !matches!( - params.tool_choice, - Some(ToolChoiceParam::Mode(ToolChoiceOptions::None)) - ); - let parsed_calls = if has_enabled_tools { - parse_tool_call_text(&content_text) - } else { - Vec::new() - }; - if !parsed_calls.is_empty() { - for (name, arguments) in parsed_calls { - let namespace = params.namespace_for_function(&name); - output.push(make_function_call(name, arguments, namespace)); - } - let remaining = strip_tool_call_text(&content_text); - if !remaining.trim().is_empty() { - output.push(make_text_message( - message_id.clone(), - remaining.into_owned(), - )); - } - } else { - output.push(make_text_message(message_id.clone(), content_text)); - } + output.push(make_text_message(message_id.clone(), content_text)); } if output.is_empty() { @@ -3028,117 +2912,12 @@ mod tests { } #[test] - fn test_parse_tool_call_text() { - // Standard Qwen3 format - let text = r#" -Let me check the weather. - - - -{"name": "get_weather", "arguments": {"location": "San Francisco"}} -"#; - let calls = parse_tool_call_text(text); - assert_eq!(calls.len(), 1); - assert_eq!(calls[0].0, "get_weather"); - let args: serde_json::Value = serde_json::from_str(&calls[0].1).unwrap(); - assert_eq!(args["location"], "San Francisco"); - } - - #[test] - fn test_parse_tool_call_text_multiple() { - let text = r#" -{"name": "func_a", "arguments": {"x": 1}} - - -{"name": "func_b", "arguments": {"y": 2}} -"#; - let calls = parse_tool_call_text(text); - assert_eq!(calls.len(), 2); - assert_eq!(calls[0].0, "func_a"); - assert_eq!(calls[1].0, "func_b"); - } - - #[test] - fn test_parse_tool_call_text_no_calls() { - let text = "Just a regular message with no tool calls."; - let calls = parse_tool_call_text(text); - assert!(calls.is_empty()); - } - - #[test] - fn test_text_tool_calls_preserved_when_tools_are_disabled() { - let text = r#"Example: reasoning{"name":"get_weather","arguments":{"city":"Beijing"}}"#; - let tools = vec![ - serde_json::from_value(serde_json::json!({ - "type": "function", "name": "get_weather", "parameters": {"type": "object"} - })) - .unwrap(), - ]; - for (tools, tool_choice) in [ - ( - Some(tools), - Some(ToolChoiceParam::Mode(ToolChoiceOptions::None)), - ), - (None, None), - ( - Some(serde_json::from_value(serde_json::json!([{ - "type": "namespace", "name": "weather", "description": "Weather tools", "tools": [] - }])).unwrap()), - Some(ToolChoiceParam::Mode(ToolChoiceOptions::Auto)), - ), - ] { - let params = ResponseParams { - tools, - tool_choice, - ..Default::default() - }; - let response = - chat_completion_to_response(make_chat_resp_with_text(text), ¶ms, None).unwrap(); - assert_eq!(response.inner.output.len(), 1); - let OutputItem::Message(message) = &response.inner.output[0] else { - panic!("tool-disabled request must preserve literal tool-call text"); - }; - let OutputMessageContent::OutputText(content) = &message.content[0] else { - panic!("expected output text"); - }; - assert_eq!(content.text, text); - } - } - - #[test] - fn test_text_tool_calls_parsed_when_tools_are_enabled() { - let text = - r#"{"name":"get_weather","arguments":{"city":"Beijing"}}"#; - let tools = serde_json::from_value(serde_json::json!([{ - "type": "function", "name": "get_weather", "parameters": {"type": "object"} - }])) - .unwrap(); - let params = ResponseParams { - tools: Some(tools), - tool_choice: Some(ToolChoiceParam::Mode(ToolChoiceOptions::Auto)), - ..Default::default() - }; - let response = - chat_completion_to_response(make_chat_resp_with_text(text), ¶ms, None).unwrap(); - assert_eq!(response.inner.output.len(), 1); - let OutputItem::FunctionCall(call) = &response.inner.output[0] else { - panic!("expected a function call for an enabled tool request"); - }; - assert_eq!(call.name, "get_weather"); - assert_eq!( - serde_json::from_str::(&call.arguments).unwrap(), - serde_json::json!({"city":"Beijing"}) - ); - } - - #[test] - fn test_text_tool_call_preserves_namespace() { + fn test_response_preserves_literal_tool_markup_alongside_structured_call() { + let text = r#"Example: reasoning{"name":"get_weather","arguments":{}}"#; let params = ResponseParams { tools: Some( serde_json::from_value(serde_json::json!([{ - "type": "namespace", - "name": "weather", - "description": "Weather tools", + "type": "namespace", "name": "weather", "description": "Weather tools", "tools": [{"type": "function", "name": "get_weather"}] }])) .unwrap(), @@ -3146,35 +2925,32 @@ Let me check the weather. tool_choice: Some(ToolChoiceParam::Mode(ToolChoiceOptions::Auto)), ..Default::default() }; - let response = chat_completion_to_response( - make_chat_resp_with_text( - r#"{"name":"get_weather","arguments":{}}"#, - ), - ¶ms, - None, - ) - .unwrap(); - assert_eq!(response.inner.output.len(), 1); + let mut chat = make_chat_resp_with_text(text); + chat.inner.choices[0].message.tool_calls = Some(vec![ChatCompletionMessageToolCall { + id: "call_original".into(), + r#type: FunctionType::Function, + function: dynamo_protocols::types::FunctionCall { + name: "get_weather".into(), + arguments: r#"{"city":"Paris"}"#.into(), + }, + }]); + chat.inner.choices[0].finish_reason = Some(FinishReason::ToolCalls); + let response = chat_completion_to_response(chat, ¶ms, None).unwrap(); + assert_eq!(response.inner.output.len(), 2); let OutputItem::FunctionCall(call) = &response.inner.output[0] else { - panic!("expected a namespaced function call"); + panic!("expected the structured function call"); }; + assert_eq!(call.call_id, "call_original"); assert_eq!(call.name, "get_weather"); assert_eq!(call.namespace.as_deref(), Some("weather")); - assert_eq!(call.arguments, "{}"); - } - - #[test] - fn test_strip_tool_call_text() { - let text = r#" -thinking - - - -{"name": "f", "arguments": {}} -"#; - let stripped = strip_tool_call_text(text); - assert!(!stripped.contains("")); - assert!(!stripped.contains("")); + assert_eq!(call.arguments, r#"{"city":"Paris"}"#); + let OutputItem::Message(message) = &response.inner.output[1] else { + panic!("expected the original text"); + }; + let OutputMessageContent::OutputText(content) = &message.content[0] else { + panic!("expected output text"); + }; + assert_eq!(content.text, text); } // ── PR1: reasoning / text.format / service_tier pass-through tests ── diff --git a/lib/llm/tests/aggregators.rs b/lib/llm/tests/aggregators.rs index 1d4697393cff..7dc09cd813fc 100644 --- a/lib/llm/tests/aggregators.rs +++ b/lib/llm/tests/aggregators.rs @@ -1060,3 +1060,49 @@ async fn test_muse_unified_batch_native_fallback_zero_calls_still_strips_markup( guided-JSON synthetic placeholder" ); } + +#[tokio::test] +async fn test_responses_tool_parsing_is_owned_by_the_aggregator() { + use dynamo_llm::protocols::openai::responses::{ResponseParams, chat_completion_to_response}; + use dynamo_protocols::types::responses::{OutputItem, OutputMessageContent}; + + let raw = r#"{"name":"get_weather","arguments":{"city":"Paris"}}"#; + let params = ResponseParams { + tools: Some( + serde_json::from_value(serde_json::json!([{ + "type": "function", "name": "get_weather", "parameters": {"type": "object"} + }])) + .unwrap(), + ), + ..Default::default() + }; + for parser in [None, Some("hermes".to_string())] { + let parses_tools = parser.is_some(); + let chat = NvCreateChatCompletionResponse::from_annotated_stream( + futures::stream::iter([make_stream_delta(Some(raw), None)]), + ParsingOptions::new(parser, None), + ) + .await + .unwrap(); + let response = chat_completion_to_response(chat, ¶ms, None).unwrap(); + assert_eq!(response.inner.output.len(), 1); + if parses_tools { + let OutputItem::FunctionCall(call) = &response.inner.output[0] else { + panic!("expected an upstream-parsed call"); + }; + assert_eq!(call.name, "get_weather"); + assert_eq!( + serde_json::from_str::(&call.arguments).unwrap(), + serde_json::json!({"city":"Paris"}) + ); + } else { + let OutputItem::Message(message) = &response.inner.output[0] else { + panic!("no-parser output must remain text"); + }; + let OutputMessageContent::OutputText(content) = &message.content[0] else { + panic!("expected output text"); + }; + assert_eq!(content.text, raw); + } + } +} diff --git a/lib/llm/tests/tool_choice.rs b/lib/llm/tests/tool_choice.rs index 25652e9d8cb5..742daa86273d 100644 --- a/lib/llm/tests/tool_choice.rs +++ b/lib/llm/tests/tool_choice.rs @@ -251,6 +251,7 @@ async fn test_required_tool_choice_parses_json_array() { .as_deref(), Some(r#"{"topic":"memory"}"#) ); + assert_responses_preserves_forced_calls(response).await; } #[tokio::test] @@ -1104,3 +1105,36 @@ async fn test_harmony_tool_choice_named_wrong_tool_filtered() { "wrong tool must be filtered; got {calls:?}" ); } + +async fn assert_responses_preserves_forced_calls(response: NvCreateChatCompletionStreamResponse) { + use dynamo_llm::protocols::{ + Annotated, + openai::{ + ParsingOptions, + chat_completions::{ + NvCreateChatCompletionResponse, aggregator::ChatCompletionAggregator, + }, + responses::{ResponseParams, chat_completion_to_response}, + }, + }; + use dynamo_protocols::types::responses::OutputItem; + + let expected = response.inner.choices[0].delta.tool_calls.clone().unwrap(); + let chat = NvCreateChatCompletionResponse::from_annotated_stream( + futures::stream::iter([Annotated::from_data(response)]), + ParsingOptions::default(), + ) + .await + .unwrap(); + let response = chat_completion_to_response(chat, &ResponseParams::default(), None).unwrap(); + assert_eq!(response.inner.output.len(), expected.len()); + for (item, expected) in response.inner.output.iter().zip(expected) { + let OutputItem::FunctionCall(call) = item else { + panic!("expected a guided tool call without a model parser"); + }; + assert_eq!(Some(&call.call_id), expected.id.as_ref()); + let function = expected.function.unwrap(); + assert_eq!(Some(call.name.as_str()), function.name.as_deref()); + assert_eq!(Some(call.arguments.as_str()), function.arguments.as_deref()); + } +} From a28ecfb6988563bb617cd7fe39488b712e98fb99 Mon Sep 17 00:00:00 2001 From: Dmitry Tokarev Date: Thu, 17 Sep 2026 17:13:22 -0400 Subject: [PATCH 082/191] chore: temporarily increase frontend build time limit 45 --> 90 min (#15019) Signed-off-by: Dmitry Tokarev --- .github/workflows/post-merge-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/post-merge-ci.yml b/.github/workflows/post-merge-ci.yml index 18b7f01958bd..42143bcc5ebd 100644 --- a/.github/workflows/post-merge-ci.yml +++ b/.github/workflows/post-merge-ci.yml @@ -441,7 +441,7 @@ jobs: platform: 'linux/amd64,linux/arm64' builder_name: b-${{ github.run_id }}-${{ github.run_attempt }} inline_compliance: true - build_timeout_minutes: 45 + build_timeout_minutes: 90 # TEMPORARY CHANGE - TODO: INVESTIGATE AND SPEEDUP SLOW BUILDS # OSRB CSV diff baseline: post-merge context. main -> previous commit; # release/* -> prior release tag (see resolve_diff_base.py). diff_event_context: push From 4ed78bcd432d8691eaeddc4452f6904dd9fdd88b Mon Sep 17 00:00:00 2001 From: Julien Mancuso <161955438+julienmancuso@users.noreply.github.com> Date: Thu, 17 Sep 2026 15:55:21 -0600 Subject: [PATCH 083/191] test(operator): cover scoped CA injection ownership (#14961) Signed-off-by: Julien Mancuso --- deploy/operator/cmd/main.go | 24 +-- deploy/operator/internal/cert/cert.go | 31 +++- deploy/operator/internal/cert/cert_test.go | 187 ++++++++++++++------- 3 files changed, 157 insertions(+), 85 deletions(-) diff --git a/deploy/operator/cmd/main.go b/deploy/operator/cmd/main.go index be0b9ad0b6e4..3da73d70bd38 100644 --- a/deploy/operator/cmd/main.go +++ b/deploy/operator/cmd/main.go @@ -251,7 +251,6 @@ func main() { } restrictedNamespace := operatorCfg.Namespace.Restricted - isClusterWide := restrictedNamespace == "" if restrictedNamespace != "" { mgrOpts.Cache.DefaultNamespaces = map[string]cache.Config{ restrictedNamespace: {}, @@ -506,31 +505,14 @@ func main() { os.Exit(1) } - // CertManager.SetupAndRunOnce has already bootstrapped auto-mode TLS secrets. - // Auto mode patches admission and, for cluster-wide operators, conversion CAs. - // Manual mode patches only cluster-wide conversion CAs; admission stays out-of-band. caInjector, err := internalcert.NewCABundleInjector(directClient, operatorCfg) if err != nil { setupLog.Error(err, "unable to create CA bundle injector") os.Exit(1) } - if operatorCfg.Server.Webhook.CertProvisionMode == configv1alpha1.CertProvisionModeAuto { - if isClusterWide { - err = caInjector.InjectAll(mainCtx) - } else { - err = caInjector.InjectAdmission(mainCtx) - } - if err != nil { - setupLog.Error(err, "failed to inject CA bundles into webhook configurations") - os.Exit(1) - } - } else if isClusterWide { - // Manual mode gets webhook CA material out-of-band. Missing ca.crt - // blocks startup instead of running with unauthenticated conversion. - if err := caInjector.InjectCRDConversionCA(mainCtx); err != nil { - setupLog.Error(err, "failed to inject CRD conversion CA bundle") - os.Exit(1) - } + if err := caInjector.Inject(mainCtx); err != nil { + setupLog.Error(err, "failed to inject CA bundles into webhook configurations") + os.Exit(1) } // mgr.Start reads tls.crt and tls.key from the projected Secret volume diff --git a/deploy/operator/internal/cert/cert.go b/deploy/operator/internal/cert/cert.go index a9b672dbc1fb..59bb37dfe963 100644 --- a/deploy/operator/internal/cert/cert.go +++ b/deploy/operator/internal/cert/cert.go @@ -329,10 +329,29 @@ func NewCABundleInjector(cl client.Client, cfg *configv1alpha1.OperatorConfigura return injector, nil } -// InjectAll reads the CA bundle from the cert secret and injects it into all +// Inject applies the CA bundle only to resources owned by this operator scope. +func (i *CABundleInjector) Inject(ctx context.Context) error { + // Automatic certificate management owns admission CA injection in every scope. + if i.cfg.Server.Webhook.CertProvisionMode == configv1alpha1.CertProvisionModeAuto { + if i.cfg.Namespace.Restricted != "" { + return i.injectAdmissionCA(ctx) + } + return i.injectAll(ctx) + } + + // Namespace-restricted operators never own shared CRD conversion configuration. + if i.cfg.Namespace.Restricted != "" { + return nil + } + + // Cluster-wide manual mode receives admission CAs out-of-band but owns conversion CA injection. + return i.injectCRDConversionCA(ctx) +} + +// injectAll reads the CA bundle from the cert secret and injects it into all // webhook configurations owned by this operator instance (scoped by namespace // label), and into the multi-version CRD conversion webhooks. -func (i *CABundleInjector) InjectAll(ctx context.Context) error { +func (i *CABundleInjector) injectAll(ctx context.Context) error { caBundle, err := i.readCABundle(ctx) if err != nil { return fmt.Errorf("reading CA bundle from secret %s/%s: %w", i.namespace, i.cfg.Server.Webhook.SecretName, err) @@ -349,9 +368,9 @@ func (i *CABundleInjector) InjectAll(ctx context.Context) error { return nil } -// InjectAdmission reads the CA bundle from the cert secret and injects it only +// injectAdmissionCA reads the CA bundle from the cert secret and injects it only // into admission webhook configurations owned by this operator instance. -func (i *CABundleInjector) InjectAdmission(ctx context.Context) error { +func (i *CABundleInjector) injectAdmissionCA(ctx context.Context) error { caBundle, err := i.readCABundle(ctx) if err != nil { return fmt.Errorf("reading CA bundle from secret %s/%s: %w", i.namespace, i.cfg.Server.Webhook.SecretName, err) @@ -372,9 +391,9 @@ func (i *CABundleInjector) injectAdmission(ctx context.Context, caBundle []byte) return i.injectIntoMutatingWebhooks(ctx, caBundle) } -// InjectCRDConversionCA reads the CA bundle from the cert secret and patches it +// injectCRDConversionCA reads the CA bundle from the cert secret and patches it // into the CRD conversion webhook configurations. -func (i *CABundleInjector) InjectCRDConversionCA(ctx context.Context) error { +func (i *CABundleInjector) injectCRDConversionCA(ctx context.Context) error { caBundle, err := i.waitForCABundle(ctx) if err != nil { return err diff --git a/deploy/operator/internal/cert/cert_test.go b/deploy/operator/internal/cert/cert_test.go index 5d0bf75f88e1..f06ba9814eae 100644 --- a/deploy/operator/internal/cert/cert_test.go +++ b/deploy/operator/internal/cert/cert_test.go @@ -27,7 +27,9 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/utils/ptr" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/client/interceptor" ) // fakeCertProvisioner captures the rotator config passed to AddRotator and @@ -435,66 +437,135 @@ func TestInjectIntoMutatingWebhooks(t *testing.T) { } } -func TestInjectAdmissionDoesNotPatchCRDConversion(t *testing.T) { - secret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{Namespace: testNamespace, Name: testSecretName}, - Data: map[string][]byte{defaultCACertName: []byte("admission-ca")}, - } - validating := &admissionregistrationv1.ValidatingWebhookConfiguration{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-validating", - Labels: map[string]string{partOfLabel: partOfValue, operatorNamespaceLabel: testNamespace}, +func TestInjectHonorsNamespaceScope(t *testing.T) { + tests := []struct { + name string + mode configv1alpha1.CertProvisionMode + restrictedNamespace string + wantAdmissionCA string + wantConversionCA string + wantCRDReadCount int + wantCRDMutationCount int + }{ + { + name: "cluster-wide auto mode owns admission and conversion", + mode: configv1alpha1.CertProvisionModeAuto, + wantAdmissionCA: "operator-ca", + wantConversionCA: "operator-ca", + wantCRDReadCount: len(convertibleCRDs), + wantCRDMutationCount: 1, }, - Webhooks: []admissionregistrationv1.ValidatingWebhook{{ - Name: "validate.webhook.io", - ClientConfig: admissionregistrationv1.WebhookClientConfig{}, - }}, - } - mutating := &admissionregistrationv1.MutatingWebhookConfiguration{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-mutating", - Labels: map[string]string{partOfLabel: partOfValue, operatorNamespaceLabel: testNamespace}, + { + name: "namespace-restricted auto mode owns admission only", + mode: configv1alpha1.CertProvisionModeAuto, + restrictedNamespace: testNamespace, + wantAdmissionCA: "operator-ca", + wantConversionCA: "cluster-ca", + }, + { + name: "cluster-wide manual mode owns conversion only", + mode: configv1alpha1.CertProvisionModeManual, + wantAdmissionCA: "existing-admission-ca", + wantConversionCA: "operator-ca", + wantCRDReadCount: len(convertibleCRDs), + wantCRDMutationCount: 1, + }, + { + name: "namespace-restricted manual mode owns neither", + mode: configv1alpha1.CertProvisionModeManual, + restrictedNamespace: testNamespace, + wantAdmissionCA: "existing-admission-ca", + wantConversionCA: "cluster-ca", }, - Webhooks: []admissionregistrationv1.MutatingWebhook{{ - Name: "mutate.webhook.io", - ClientConfig: admissionregistrationv1.WebhookClientConfig{}, - }}, - } - crd := newDGDConversionCRD() - - cfg := &configv1alpha1.OperatorConfiguration{} - cfg.Server.Webhook.SecretName = testSecretName - injector := newTestInjector( - fake.NewClientBuilder().WithScheme(newScheme()).WithObjects(secret, validating, mutating, crd), - cfg, - ) - ctx := context.Background() - if err := injector.InjectAdmission(ctx); err != nil { - t.Fatalf("injecting admission CA: %v", err) - } - - updatedValidating := &admissionregistrationv1.ValidatingWebhookConfiguration{} - if err := injector.client.Get(ctx, types.NamespacedName{Name: validating.Name}, updatedValidating); err != nil { - t.Fatalf("getting validating webhook: %v", err) - } - if string(updatedValidating.Webhooks[0].ClientConfig.CABundle) != "admission-ca" { - t.Fatalf("validating webhook CA = %q, want admission-ca", updatedValidating.Webhooks[0].ClientConfig.CABundle) - } - - updatedMutating := &admissionregistrationv1.MutatingWebhookConfiguration{} - if err := injector.client.Get(ctx, types.NamespacedName{Name: mutating.Name}, updatedMutating); err != nil { - t.Fatalf("getting mutating webhook: %v", err) - } - if string(updatedMutating.Webhooks[0].ClientConfig.CABundle) != "admission-ca" { - t.Fatalf("mutating webhook CA = %q, want admission-ca", updatedMutating.Webhooks[0].ClientConfig.CABundle) } - updatedCRD := &apiextensionsv1.CustomResourceDefinition{} - if err := injector.client.Get(ctx, types.NamespacedName{Name: crd.Name}, updatedCRD); err != nil { - t.Fatalf("getting CRD: %v", err) - } - if updatedCRD.Spec.Conversion.Webhook.ClientConfig.CABundle != nil { - t.Fatalf("CRD conversion CA was modified: %q", updatedCRD.Spec.Conversion.Webhook.ClientConfig.CABundle) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Log("Seed webhook resources with distinct operator and cluster CA bundles") + secret := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{Namespace: testNamespace, Name: testSecretName}, + Data: map[string][]byte{defaultCACertName: []byte("operator-ca")}, + } + validating := &admissionregistrationv1.ValidatingWebhookConfiguration{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-validating", + Labels: map[string]string{partOfLabel: partOfValue, operatorNamespaceLabel: testNamespace}, + }, + Webhooks: []admissionregistrationv1.ValidatingWebhook{{ + Name: "validate.webhook.io", + ClientConfig: admissionregistrationv1.WebhookClientConfig{ + CABundle: []byte("existing-admission-ca"), + }, + }}, + } + crd := newDGDConversionCRD() + crd.Spec.Conversion.Webhook.ClientConfig.CABundle = []byte("cluster-ca") + originalService := crd.Spec.Conversion.Webhook.ClientConfig.Service.DeepCopy() + + t.Log("Record every attempted CRD read, patch, or update") + crdReadCount := 0 + crdMutationCount := 0 + builder := fake.NewClientBuilder(). + WithScheme(newScheme()). + WithObjects(secret, validating, crd). + WithInterceptorFuncs(interceptor.Funcs{ + Get: func(ctx context.Context, reader client.WithWatch, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error { + if _, ok := obj.(*apiextensionsv1.CustomResourceDefinition); ok { + crdReadCount++ + } + return reader.Get(ctx, key, obj, opts...) + }, + Patch: func(ctx context.Context, writer client.WithWatch, obj client.Object, patch client.Patch, opts ...client.PatchOption) error { + if _, ok := obj.(*apiextensionsv1.CustomResourceDefinition); ok { + crdMutationCount++ + } + return writer.Patch(ctx, obj, patch, opts...) + }, + Update: func(ctx context.Context, writer client.WithWatch, obj client.Object, opts ...client.UpdateOption) error { + if _, ok := obj.(*apiextensionsv1.CustomResourceDefinition); ok { + crdMutationCount++ + } + return writer.Update(ctx, obj, opts...) + }, + }) + cfg := &configv1alpha1.OperatorConfiguration{} + cfg.Server.Webhook.SecretName = testSecretName + cfg.Server.Webhook.CertProvisionMode = tt.mode + cfg.Namespace.Restricted = tt.restrictedNamespace + injector := newTestInjector(builder, cfg) + ctx := context.Background() + + t.Log("Inject CA bundles according to the operator scope and certificate mode") + if err := injector.Inject(ctx); err != nil { + t.Fatalf("injecting CA bundles: %v", err) + } + if crdReadCount != tt.wantCRDReadCount { + t.Fatalf("CRD read count = %d, want %d", crdReadCount, tt.wantCRDReadCount) + } + + t.Log("Verify admission and conversion ownership boundaries") + updatedValidating := &admissionregistrationv1.ValidatingWebhookConfiguration{} + if err := injector.client.Get(ctx, types.NamespacedName{Name: validating.Name}, updatedValidating); err != nil { + t.Fatalf("getting validating webhook: %v", err) + } + if got := string(updatedValidating.Webhooks[0].ClientConfig.CABundle); got != tt.wantAdmissionCA { + t.Fatalf("admission CA = %q, want %q", got, tt.wantAdmissionCA) + } + + updatedCRD := &apiextensionsv1.CustomResourceDefinition{} + if err := injector.client.Get(ctx, types.NamespacedName{Name: crd.Name}, updatedCRD); err != nil { + t.Fatalf("getting CRD: %v", err) + } + if got := string(updatedCRD.Spec.Conversion.Webhook.ClientConfig.CABundle); got != tt.wantConversionCA { + t.Fatalf("conversion CA = %q, want %q", got, tt.wantConversionCA) + } + if got := updatedCRD.Spec.Conversion.Webhook.ClientConfig.Service; !reflect.DeepEqual(got, originalService) { + t.Fatalf("conversion service = %#v, want %#v", got, originalService) + } + if crdMutationCount != tt.wantCRDMutationCount { + t.Fatalf("CRD mutation count = %d, want %d", crdMutationCount, tt.wantCRDMutationCount) + } + }) } } @@ -561,7 +632,7 @@ func TestInjectCRDConversionCA_ReadsCABundleAndPatchesOnlyCABundle(t *testing.T) injector := newTestInjector(fake.NewClientBuilder().WithScheme(newScheme()).WithObjects(secret, crd), cfg) ctx := context.Background() - if err := injector.InjectCRDConversionCA(ctx); err != nil { + if err := injector.injectCRDConversionCA(ctx); err != nil { t.Fatalf("unexpected error: %v", err) } @@ -615,7 +686,7 @@ func TestInjectCRDConversionCA_WaitsWhenSecretNotFound(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 25*time.Millisecond) defer cancel() - err := injector.InjectCRDConversionCA(ctx) + err := injector.injectCRDConversionCA(ctx) if err == nil { t.Fatal("expected context timeout while waiting for missing secret") } From 6be0ab241d8d02717e06cdada3c4eb7ba5911031 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Thu, 17 Sep 2026 14:57:33 -0700 Subject: [PATCH 084/191] feat(frontend): map semantic errors to HTTP responses (#14396) Signed-off-by: Biswa Panda --- .../tests/test_vllm_instrumented_scheduler.py | 1 + lib/bindings/python/rust/backend.rs | 49 +- lib/bindings/python/rust/engine.rs | 61 +- lib/bindings/python/rust/errors.rs | 97 +- .../python/src/dynamo/prometheus_names.py | 2 + lib/bindings/python/tests/test_http_server.py | 15 +- lib/llm/src/http/service/anthropic.rs | 454 +++++- lib/llm/src/http/service/disconnect.rs | 311 +++- lib/llm/src/http/service/error.rs | 199 ++- lib/llm/src/http/service/metrics.rs | 154 +- lib/llm/src/http/service/openai.rs | 1451 ++++++++++++----- lib/llm/src/preprocessor.rs | 11 +- lib/llm/src/preprocessor/tool_choice.rs | 1 + .../protocols/anthropic/stream_converter.rs | 16 +- lib/llm/src/protocols/common.rs | 4 +- lib/llm/src/session_affinity/coordinator.rs | 1 + lib/llm/tests/chat_template_render_errors.rs | 7 +- .../frontend_protocol_validation_http.rs | 6 +- lib/llm/tests/http-service.rs | 3 + lib/llm/tests/preprocessor.rs | 7 + lib/llm/tests/responses_http_replay.rs | 4 +- lib/runtime/src/error.rs | 45 +- lib/runtime/src/metrics/prometheus_names.rs | 3 + .../http_status_propagation_worker.py | 6 +- .../frontend/test_http_status_propagation.py | 13 +- 25 files changed, 2308 insertions(+), 613 deletions(-) diff --git a/components/src/dynamo/vllm/tests/test_vllm_instrumented_scheduler.py b/components/src/dynamo/vllm/tests/test_vllm_instrumented_scheduler.py index 6085c7dd83dd..8e11c957c1ca 100644 --- a/components/src/dynamo/vllm/tests/test_vllm_instrumented_scheduler.py +++ b/components/src/dynamo/vllm/tests/test_vllm_instrumented_scheduler.py @@ -5223,6 +5223,7 @@ def _kvwarm_planner_stub(usable_blocks, groups=1, block_size=16): meta = {"warm_eligible": True, "skip_reason": None} stub._kvwarm_meta_init = lambda: meta stub._kvwarm_warm_eligible = lambda: True + stub._bench_synchronizer = None stub._bench_negotiated_capacity = None stub.max_model_len = 8192 stub.cache_config = SimpleNamespace(block_size=block_size) diff --git a/lib/bindings/python/rust/backend.rs b/lib/bindings/python/rust/backend.rs index c029ab9c6608..c169f02cf675 100644 --- a/lib/bindings/python/rust/backend.rs +++ b/lib/bindings/python/rust/backend.rs @@ -43,7 +43,7 @@ use pythonize::{depythonize, pythonize}; use crate::ModelInput; use crate::context::Context as PyContext; -use crate::errors::{extract_http_like_error, py_exception_to_backend_error}; +use crate::errors::{http_like_error_to_dynamo, py_exception_to_backend_error}; use crate::llm::kv::KvEventPublisher as PyKvEventPublisher; use crate::llm::preprocessor::{MediaDecoder, MediaFetcher}; use crate::to_pyerr; @@ -1677,21 +1677,28 @@ where /// subclasses go through the shared mapping table; built-in Python /// exceptions fall back to the closest category. fn py_err_to_dynamo(err: PyErr) -> DynamoError { - let (backend, message) = Python::with_gil(|py| { - if let Some(mapped) = py_exception_to_backend_error(py, &err) { - return mapped; + Python::with_gil(|py| { + if let Some((backend, message)) = py_exception_to_backend_error(py, &err) { + let mut builder = DynamoError::builder() + .error_type(ErrorType::Backend(backend)) + .message(message.clone()); + if backend == BackendError::InvalidArgument { + builder = builder.public_message(message); + } + return builder.build(); } - // See engine.rs::process_item — emit JSON-shaped message so the OpenAI - // frontend can read the status code instead of defaulting to 500. - if let Some((code, message)) = extract_http_like_error(py, &err) { - let backend = if (400..500).contains(&code) { - BackendError::InvalidArgument - } else { - BackendError::Unknown - }; - let json_msg = serde_json::json!({ "message": message, "code": code }).to_string(); - return (backend, json_msg); + + if let Some(error) = http_like_error_to_dynamo(py, &err) { + return error; } + + if err.is_instance_of::(py) { + return DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::EngineShutdown)) + .message("engine shutting down") + .build(); + } + let backend = if err.is_instance_of::(py) || err.is_instance_of::(py) { @@ -1707,15 +1714,13 @@ fn py_err_to_dynamo(err: PyErr) -> DynamoError { BackendError::Disconnected } else if err.is_instance_of::(py) { BackendError::Cancelled - } else if err.is_instance_of::(py) { - BackendError::EngineShutdown } else { BackendError::Unknown }; - (backend, err.to_string()) - }); - DynamoError::builder() - .error_type(ErrorType::Backend(backend)) - .message(message) - .build() + + DynamoError::builder() + .error_type(ErrorType::Backend(backend)) + .message(err.to_string()) + .build() + }) } diff --git a/lib/bindings/python/rust/engine.rs b/lib/bindings/python/rust/engine.rs index 2e6cae502497..2e3f239604a2 100644 --- a/lib/bindings/python/rust/engine.rs +++ b/lib/bindings/python/rust/engine.rs @@ -30,7 +30,7 @@ use crate::PyAsyncRequestStream; use dynamo_runtime::pipeline::ManyIn; use super::context::{Context, callable_accepts_kwarg}; -use super::errors::{extract_http_like_error, py_exception_to_backend_error}; +use super::errors::{http_like_error_to_dynamo, py_exception_to_backend_error}; use crate::python_payload::{PythonPayload, PythonResponseItem}; /// Add bindings from this crate to the provided module @@ -383,27 +383,17 @@ pub(crate) fn map_python_exception(error: PyErr) -> DynamoError { error.display(py); if let Some((backend_err, message)) = py_exception_to_backend_error(py, &error) { - return DynamoError::builder() + let mut builder = DynamoError::builder() .error_type(ErrorType::Backend(backend_err)) - .message(message) - .build(); + .message(message.clone()); + if backend_err == BackendError::InvalidArgument { + builder = builder.public_message(message); + } + return builder.build(); } - if let Some((code, message)) = extract_http_like_error(py, &error) { - let backend_err = if (400..500).contains(&code) { - BackendError::InvalidArgument - } else { - BackendError::Unknown - }; - let json_msg = serde_json::json!({ - "message": message, - "code": code, - }) - .to_string(); - return DynamoError::builder() - .error_type(ErrorType::Backend(backend_err)) - .message(json_msg) - .build(); + if let Some(error) = http_like_error_to_dynamo(py, &error) { + return error; } if error.is_instance_of::(py) { @@ -744,3 +734,36 @@ impl AsyncEngine, ManyOut, Error> Ok(ResponseStream::new(response_stream, ctx)) } } + +#[cfg(test)] +mod tests { + use crate::errors::error_class_for_http_status; + use dynamo_runtime::error::ErrorClass; + + #[test] + fn http_statuses_map_to_semantic_classes() { + assert_eq!(error_class_for_http_status(400), ErrorClass::InvalidRequest); + assert_eq!( + error_class_for_http_status(415), + ErrorClass::UnsupportedMedia + ); + assert_eq!(error_class_for_http_status(429), ErrorClass::RateLimited); + assert_eq!(error_class_for_http_status(499), ErrorClass::Cancelled); + assert_eq!(error_class_for_http_status(418), ErrorClass::InvalidRequest); + assert_eq!(error_class_for_http_status(501), ErrorClass::NotImplemented); + assert_eq!( + error_class_for_http_status(502), + ErrorClass::BackendProtocol + ); + assert_eq!(error_class_for_http_status(503), ErrorClass::Unavailable); + assert_eq!( + error_class_for_http_status(504), + ErrorClass::DeadlineExceeded + ); + assert_eq!( + error_class_for_http_status(529), + ErrorClass::CapacityExhausted + ); + assert_eq!(error_class_for_http_status(500), ErrorClass::Internal); + } +} diff --git a/lib/bindings/python/rust/errors.rs b/lib/bindings/python/rust/errors.rs index ec414adfd2f1..afad4d96ce42 100644 --- a/lib/bindings/python/rust/errors.rs +++ b/lib/bindings/python/rust/errors.rs @@ -11,7 +11,7 @@ //! corresponding entry to the macro invocation below to keep Python exceptions //! in sync. -use dynamo_runtime::error::BackendError; +use dynamo_runtime::error::{BackendError, DynamoError, ErrorClass}; use pyo3::prelude::*; use pyo3::types::PyModule; @@ -138,11 +138,10 @@ define_dynamo_exceptions!( /// status. Accepts `.code` (matches [`HttpError`] in `http.rs`) or `.status` /// (matches `dynamo.common.http.HttpStatusError`) plus `.message`. /// -/// SECURITY: `.message` is forwarded verbatim to clients on 4xx responses -/// (HTTP protocol contract). Python callers must ensure it contains no -/// internal state, file paths, traceback strings, or backend identifiers. -/// Non-4xx codes (including 5xx) are sanitized downstream — the original -/// message survives in server logs only. +/// SECURITY: `.message` is diagnostic-only. HTTP-like exceptions can wrap remote +/// fetch failures whose text includes URLs or internal connection details. The +/// semantic status is preserved, but client renderers use the class catalog +/// unless the producer raised an explicitly public Dynamo exception. pub fn extract_http_like_error(py: Python<'_>, err: &PyErr) -> Option<(u16, String)> { let value = err.value(py); let code = value @@ -158,3 +157,89 @@ pub fn extract_http_like_error(py: Python<'_>, err: &PyErr) -> Option<(u16, Stri let message = value.getattr("message").ok()?.extract::().ok()?; Some((code, message)) } + +/// Map an explicit Python HTTP exception status to Dynamo's semantic class. +pub fn error_class_for_http_status(code: u16) -> ErrorClass { + match code { + 400 => ErrorClass::InvalidRequest, + 401 => ErrorClass::Unauthenticated, + 403 => ErrorClass::PermissionDenied, + 404 => ErrorClass::NotFound, + 408 => ErrorClass::DeadlineExceeded, + 409 => ErrorClass::Conflict, + 413 => ErrorClass::PayloadTooLarge, + 415 => ErrorClass::UnsupportedMedia, + 431 => ErrorClass::PayloadTooLarge, + 429 => ErrorClass::RateLimited, + 499 => ErrorClass::Cancelled, + 501 => ErrorClass::NotImplemented, + 502 => ErrorClass::BackendProtocol, + 503 => ErrorClass::Unavailable, + 504 => ErrorClass::DeadlineExceeded, + 529 => ErrorClass::CapacityExhausted, + 402 | 405..=407 | 410..=412 | 414 | 416..=428 | 430 | 432..=498 => { + ErrorClass::InvalidRequest + } + _ => ErrorClass::Internal, + } +} + +pub(crate) fn http_like_error_to_dynamo(py: Python<'_>, err: &PyErr) -> Option { + let (code, message) = extract_http_like_error(py, err)?; + Some(build_http_like_error(code, message)) +} + +fn build_http_like_error(code: u16, message: String) -> DynamoError { + let legacy_message = serde_json::json!({ + "message": message, + "code": code, + }) + .to_string(); + + DynamoError::builder() + .class(error_class_for_http_status(code)) + .diagnostic(legacy_message) + .build() +} + +#[cfg(test)] +mod tests { + use super::*; + use serde::Deserialize; + + #[derive(Deserialize)] + struct LegacyDynamoError { + message: String, + } + + #[derive(Deserialize)] + struct LegacyHttpError { + code: u16, + message: String, + } + + #[test] + fn http_like_errors_support_semantic_and_legacy_readers() { + for (code, expected_class) in [ + (409, ErrorClass::Conflict), + (415, ErrorClass::UnsupportedMedia), + (503, ErrorClass::Unavailable), + ] { + let error = build_http_like_error(code, "private backend detail".to_string()); + assert_eq!(error.class(), expected_class); + assert_eq!(error.public_message(), None); + + let wire = serde_json::to_value(&error).expect("serialize DynamoError"); + let semantic: DynamoError = + serde_json::from_value(wire.clone()).expect("semantic reader"); + assert_eq!(semantic.class(), expected_class); + assert_eq!(semantic.public_message(), None); + + let legacy: LegacyDynamoError = serde_json::from_value(wire).expect("legacy reader"); + let legacy_http: LegacyHttpError = + serde_json::from_str(&legacy.message).expect("legacy HTTP payload"); + assert_eq!(legacy_http.code, code); + assert_eq!(legacy_http.message, "private backend detail"); + } + } +} diff --git a/lib/bindings/python/src/dynamo/prometheus_names.py b/lib/bindings/python/src/dynamo/prometheus_names.py index 1a563de87d91..bf602a0ae205 100644 --- a/lib/bindings/python/src/dynamo/prometheus_names.py +++ b/lib/bindings/python/src/dynamo/prometheus_names.py @@ -97,6 +97,8 @@ class frontend_service: REQUESTS_TOTAL = "requests_total" # Total number of LLM requests accepted by the frontend handler REQUESTS_STARTED_TOTAL = "requests_started_total" + # Total number of terminal semantic request failures. + FAILURES_TOTAL = "failures_total" # Number of requests waiting in HTTP queue before receiving the first response (gauge) QUEUED_REQUESTS = "queued_requests" # Number of inflight/concurrent requests going to the engine (vLLM, SGLang, ...) diff --git a/lib/bindings/python/tests/test_http_server.py b/lib/bindings/python/tests/test_http_server.py index 4a6c25c11cef..27ee10cc60b8 100644 --- a/lib/bindings/python/tests/test_http_server.py +++ b/lib/bindings/python/tests/test_http_server.py @@ -230,17 +230,17 @@ async def test_chat_completion_success(http_server): HTTP_ERROR_CASES = ( - (MSG_CONTAINS_ERROR, 400, MSG_CONTAINS_ERROR, "Bad Request"), + (MSG_CONTAINS_ERROR, 400, "Bad Request", "Bad Request"), ( MSG_CONTAINS_STATUS_ERROR, 415, - MSG_CONTAINS_STATUS_ERROR, + "Unsupported Media Type", "Unsupported Media Type", ), ( MSG_CONTAINS_INVALID_ARGUMENT, 400, - f"ValueError: {MSG_CONTAINS_INVALID_ARGUMENT}", + "Invalid request", "Bad Request", ), ( @@ -254,13 +254,8 @@ async def test_chat_completion_success(http_server): def expected_error_body(status: int, message: str, error_type: str) -> Dict: body = {"message": message, "type": error_type, "code": status} - # A backend-asserted 500 that carries no retry semantics tunnels - # its own status into `details` so it survives for debugging, - # while the backend's own message text stays server-side. See - # `BackendStatusAction::CoerceToInternal` in - # lib/llm/src/http/service/openai.rs. if status == 500: - body["details"] = {"backend_status": 500} + body["details"] = {"backend_status": status} return body @@ -319,7 +314,7 @@ async def test_streaming_chat_completion_http_error_waits_for_first_item(http_se async with session.post(url, json=data) as response: assert response.status == 400 assert await response.json() == expected_error_body( - 400, MSG_CONTAINS_ERROR, "Bad Request" + 400, "Bad Request", "Bad Request" ) diff --git a/lib/llm/src/http/service/anthropic.rs b/lib/llm/src/http/service/anthropic.rs index ce7ce024a632..52e370242e1e 100644 --- a/lib/llm/src/http/service/anthropic.rs +++ b/lib/llm/src/http/service/anthropic.rs @@ -24,6 +24,7 @@ use axum::{ }, routing::{get, post}, }; +use dynamo_runtime::error::{DynamoError, ErrorClass}; use dynamo_runtime::pipeline::{AsyncEngineContextProvider, Context}; use futures::StreamExt; use tracing::Instrument; @@ -31,7 +32,8 @@ use tracing::Instrument; use super::{ RouteDoc, apply_request_tool_call_parsing_options, disconnect::{ - ConnectionHandle, create_connection_monitor, monitor_for_disconnects_with_activity, + ConnectionHandle, StreamErrorSignal, create_connection_monitor, + monitor_for_disconnects_with_activity_and_error_signal, }, metrics::{ CancellationLabels, Endpoint, ErrorType, InflightGuard, @@ -61,7 +63,10 @@ use crate::request_template::{RequestTemplate, resolve_request_model}; use crate::types::Annotated; // Re-use helpers from the openai module (sibling under service/) -use super::error::{SanitizedError, invalid_argument}; +use super::error::{ + ClientErrorAction, SanitizedError, find_canonical_error_in_chain, http_action_for_error, + invalid_argument, +}; use super::metadata::{attach_x_request_id, extract_metadata_from_http}; use super::openai::{get_body_limit, get_or_create_request_id, warn_nvext_disabled}; @@ -127,6 +132,7 @@ async fn anthropic_error_middleware(request: Request, next: Next) -> Respo .unwrap_or_default(); let error_message = String::from_utf8_lossy(&body_bytes).to_string(); return anthropic_error( + ErrorClass::InvalidRequest, StatusCode::BAD_REQUEST, "invalid_request_error", &error_message, @@ -175,6 +181,7 @@ impl AnthropicRequestValidationError { #[derive(Debug)] struct AnthropicHandlerError { + class: ErrorClass, status: StatusCode, anthropic_error_type: &'static str, message: String, @@ -183,12 +190,14 @@ struct AnthropicHandlerError { impl AnthropicHandlerError { fn new( + class: ErrorClass, status: StatusCode, anthropic_error_type: &'static str, message: impl Into, metric_error_type: ErrorType, ) -> Self { Self { + class, status, anthropic_error_type, message: message.into(), @@ -198,6 +207,7 @@ impl AnthropicHandlerError { fn validation(message: impl Into) -> Self { Self::new( + ErrorClass::InvalidRequest, StatusCode::BAD_REQUEST, "invalid_request_error", message, @@ -208,12 +218,19 @@ impl AnthropicHandlerError { // Validation is reused by /v1/messages/count_tokens, which has no request-scoped // guard. Attach metrics only at the /v1/messages handler boundary. fn from_request_validation(error: AnthropicRequestValidationError) -> Self { - let metric_error_type = match &error { - AnthropicRequestValidationError::InvalidArgument(_) => ErrorType::Validation, - AnthropicRequestValidationError::NotImplemented(_) - | AnthropicRequestValidationError::UnsupportedContent(_) => ErrorType::NotImplemented, + let (class, metric_error_type) = match &error { + AnthropicRequestValidationError::InvalidArgument(_) => { + (ErrorClass::InvalidRequest, ErrorType::Validation) + } + AnthropicRequestValidationError::UnsupportedContent(_) => { + (ErrorClass::InvalidRequest, ErrorType::NotImplemented) + } + AnthropicRequestValidationError::NotImplemented(_) => { + (ErrorClass::NotImplemented, ErrorType::NotImplemented) + } }; Self::new( + class, error.status(), error.anthropic_error_type(), error.message().to_string(), @@ -227,12 +244,21 @@ impl AnthropicHandlerError { metric_error_type: ErrorType, ) -> Self { let status = err.status(); + let class = match err { + SanitizedError::Cancelled => ErrorClass::Cancelled, + SanitizedError::Overloaded => ErrorClass::CapacityExhausted, + SanitizedError::Unavailable => ErrorClass::Unavailable, + SanitizedError::Internal | SanitizedError::PreserveServerError(_) => { + ErrorClass::Internal + } + }; if err.log_as_error() { tracing::error!(status = %status, "Anthropic {err}: {details}"); } else { tracing::debug!(status = %status, "Anthropic {err}: {details}"); } Self::new( + class, status, err.anthropic_type(), err.to_string(), @@ -242,36 +268,25 @@ impl AnthropicHandlerError { fn into_response(self) -> Response { let Self { + class, status, anthropic_error_type, message, .. } = self; - anthropic_error(status, anthropic_error_type, &message) + anthropic_error(class, status, anthropic_error_type, &message) } fn into_marked_response(self, inflight_guard: &mut InflightGuard) -> Response { let Self { + class, status, anthropic_error_type, message, metric_error_type, } = self; - inflight_guard.mark_error(metric_error_type); - anthropic_error(status, anthropic_error_type, &message) - } -} - -fn classify_backend_status_for_metrics(status: StatusCode) -> ErrorType { - match status { - StatusCode::NOT_FOUND => ErrorType::NotFound, - StatusCode::NOT_IMPLEMENTED => ErrorType::NotImplemented, - StatusCode::TOO_MANY_REQUESTS => ErrorType::Overload, - StatusCode::SERVICE_UNAVAILABLE => ErrorType::Unavailable, - _ if status.as_u16() == 529 => ErrorType::Overload, - _ if status.as_u16() == 499 => ErrorType::Cancelled, - _ if status.is_client_error() => ErrorType::Validation, - _ => ErrorType::Internal, + inflight_guard.mark_error(metric_error_type.clone()); + anthropic_error(class, status, anthropic_error_type, &message) } } @@ -395,6 +410,7 @@ async fn handler_anthropic_messages( }; let metadata = extract_metadata_from_http(&headers).map_err(|err| { AnthropicHandlerError::new( + ErrorClass::PayloadTooLarge, StatusCode::REQUEST_HEADER_FIELDS_TOO_LARGE, "invalid_request_error", err.to_string(), @@ -501,6 +517,7 @@ async fn anthropic_messages( // canonical, customer-facing message so both APIs report the same // text. Anything else is a genuine missing model → 404. crate::discovery::ModelManagerError::ModelUnavailable(_) => AnthropicHandlerError::new( + ErrorClass::Unavailable, StatusCode::SERVICE_UNAVAILABLE, "overloaded_error", super::openai::model_not_ready_message(&model), @@ -508,6 +525,7 @@ async fn anthropic_messages( ) .into_marked_response(&mut inflight_guard), _ => AnthropicHandlerError::new( + ErrorClass::NotFound, StatusCode::NOT_FOUND, "not_found_error", format!("Model '{}' not found", model), @@ -638,24 +656,25 @@ async fn anthropic_messages( ) .into_marked_response(&mut inflight_guard); } - if super::metrics::request_was_unavailable(e.as_ref()) { + if super::metrics::request_was_cancelled(e.as_ref()) { return AnthropicHandlerError::sanitized( - SanitizedError::Unavailable, + SanitizedError::Cancelled, format!("{e:#}"), - ErrorType::Unavailable, + ErrorType::Cancelled, ) .into_marked_response(&mut inflight_guard); } - if let Some(dynamo_err) = find_invalid_argument_in_chain(e.as_ref()) { - return AnthropicHandlerError::validation(dynamo_err.message()) - .into_marked_response(&mut inflight_guard); + if let Some(error) = find_canonical_error_in_chain(e.as_ref()) + && let Some(response) = anthropic_semantic_error(error) + { + inflight_guard.mark_error(super::openai::metric_error_type_for_class(error.class())); + return response; } - // Check for cancelled request (client disconnected before response was sent) - if super::metrics::request_was_cancelled(e.as_ref()) { + if super::metrics::request_was_unavailable(e.as_ref()) { return AnthropicHandlerError::sanitized( - SanitizedError::Cancelled, + SanitizedError::Unavailable, format!("{e:#}"), - ErrorType::Cancelled, + ErrorType::Unavailable, ) .into_marked_response(&mut inflight_guard); } @@ -695,7 +714,7 @@ async fn anthropic_messages( // before the first event maps to its HTTP status instead of arriving // as an SSE error frame behind an HTTP 200. let engine_stream = super::openai::until_client_disconnects( - super::openai::check_for_backend_error( + super::openai::check_for_backend_error_info( engine_stream, state.streaming_backend_error_check(), ), @@ -713,7 +732,7 @@ async fn anthropic_messages( inflight_guard.mark_error(super::openai::extract_error_type_from_response( &error_response, )); - anthropic_backend_error(error_response.0).into_response() + anthropic_backend_error_response(error_response) })?; stream_handle.arm(); @@ -732,6 +751,8 @@ async fn anthropic_messages( let cancel_ctx = ctx.clone(); let (activity_tx, activity_rx) = tokio::sync::mpsc::unbounded_channel(); + let error_signal = StreamErrorSignal::default(); + let producer_error_signal = error_signal.clone(); let full_stream = async_stream::stream! { let mut events = Vec::with_capacity(4); converter.append_start_events(&mut events); @@ -740,6 +761,7 @@ async fn anthropic_messages( } let mut saw_error = false; + let mut stream_error_body = None; let mut cancelled = false; // Match the outer monitor: graceful stops must drain the backend's @@ -764,9 +786,24 @@ async fn anthropic_messages( &mut http_queue_guard, ); + let semantic_error = !saw_error + && super::openai::set_stream_semantic_error( + &annotated_chunk, + &producer_error_signal, + ); + if semantic_error { + saw_error = true; + stream_error_body = annotated_chunk + .error + .as_ref() + .map(anthropic_stream_error_body); + } let Some(stream_resp) = annotated_chunk.data else { if annotated_chunk.event.as_deref() == Some("error") { saw_error = true; + if !semantic_error { + producer_error_signal.set(ErrorType::Internal); + } } continue; }; @@ -788,7 +825,12 @@ async fn anthropic_messages( } if saw_error { - converter.append_error_events(&mut events); + if let Some(error) = stream_error_body { + converter.append_error_events_with_body(&mut events, error); + } else { + converter.append_error_events(&mut events); + } + producer_error_signal.mark_terminal_event_emitted(); } else { converter.append_end_events(&mut events); } @@ -806,12 +848,13 @@ async fn anthropic_messages( }; let keep_alive = state.sse_keep_alive_for_response(stream_can_defer_all_output); - let stream = monitor_for_disconnects_with_activity( + let stream = monitor_for_disconnects_with_activity_and_error_signal( full_stream, ctx, inflight_guard, stream_handle, activity_rx, + error_signal, ); let mut sse_stream = Sse::new(stream); @@ -826,8 +869,11 @@ async fn anthropic_messages( let check = BackendErrorCheck::UntilFirstEvent; let stream_with_check = super::openai::check_for_backend_error(engine_stream, check) .await - .map_err(|(status, _json_err)| { - anthropic_backend_error(status).into_marked_response(&mut inflight_guard) + .map_err(|error_response| { + inflight_guard.mark_error(super::openai::extract_error_type_from_response( + &error_response, + )); + anthropic_backend_error_response(error_response) })?; let mut http_queue_guard = Some(http_queue_guard); @@ -842,13 +888,14 @@ async fn anthropic_messages( let chat_response = NvCreateChatCompletionResponse::from_annotated_stream(stream, parsing_options.clone()) .await - .map_err(|e| { - AnthropicHandlerError::sanitized( - SanitizedError::Internal, - format!("Failed to fold messages stream: {e:?}"), - ErrorType::Internal, - ) - .into_marked_response(&mut inflight_guard) + .map_err(|error| { + let error_type = if super::metrics::request_was_cancelled(&error) { + super::metrics::ErrorType::Cancelled + } else { + super::openai::metric_error_type_for_class(error.class()) + }; + inflight_guard.mark_error(error_type); + anthropic_non_streaming_aggregation_error(error) })?; let response = chat_completion_to_anthropic_response( @@ -1172,34 +1219,15 @@ fn apply_anthropic_nvext_policy( }; } -/// Re-wrap a backend-error status from -/// [`super::openai::check_for_backend_error`] in Anthropic's error format. -/// -/// The helper has already sanitized the body and logged the backend detail, so -/// only the status carries over. Classification is delegated to -/// [`SanitizedError::for_backend_status`] so the OpenAI and Anthropic surfaces -/// answer the same backend failure the same way, whether the request streams or -/// not. -fn anthropic_backend_error(status: StatusCode) -> AnthropicHandlerError { - let details = format!("backend error event (status {})", status.as_u16()); - let metric_error_type = classify_backend_status_for_metrics(status); - match SanitizedError::for_backend_status(status) { - Some(variant) => AnthropicHandlerError::sanitized(variant, details, metric_error_type), - // 4xx (non-499): preserve the client-error status; the message is the - // canonical reason so we don't smuggle backend text through. The - // "invalid_request_error" argument is a fallback — anthropic_error - // remaps 401/403/404/429 to their spec-correct types from the status - // code itself. - None => { - tracing::error!(%status, "Anthropic backend error event"); - AnthropicHandlerError::new( - status, - "invalid_request_error", - status.canonical_reason().unwrap_or("Client error"), - metric_error_type, - ) - } - } +/// Re-render a backend error event whose semantic failure was already recorded. +fn anthropic_backend_error_response(error_response: super::openai::ErrorResponse) -> Response { + let (status, Json(error)) = error_response; + let error_type = if error.is_overload() { + "overloaded_error" + } else { + anthropic_error_type_for_status(status, "api_error") + }; + anthropic_error_unrecorded(status, error_type, error.message()) } /// Build an Anthropic-formatted error response from a canonical @@ -1209,6 +1237,20 @@ fn anthropic_backend_error(status: StatusCode) -> AnthropicHandlerError { fn anthropic_sanitized_error_with_details( err: SanitizedError, details: impl std::fmt::Display, +) -> Response { + let class = match err { + SanitizedError::Cancelled => ErrorClass::Cancelled, + SanitizedError::Overloaded => ErrorClass::CapacityExhausted, + SanitizedError::Unavailable => ErrorClass::Unavailable, + SanitizedError::Internal | SanitizedError::PreserveServerError(_) => ErrorClass::Internal, + }; + super::openai::record_local_failure(class); + anthropic_sanitized_error_with_details_unrecorded(err, details) +} + +fn anthropic_sanitized_error_with_details_unrecorded( + err: SanitizedError, + details: impl std::fmt::Display, ) -> Response { let status = err.status(); if err.log_as_error() { @@ -1230,6 +1272,7 @@ fn anthropic_sanitized_error_with_details( } /// Find a request or backend invalid-argument error anywhere in the chain. +#[cfg(test)] fn find_invalid_argument_in_chain<'a>( err: &'a (dyn std::error::Error + 'static), ) -> Option<&'a dynamo_runtime::error::DynamoError> { @@ -1248,26 +1291,106 @@ fn find_invalid_argument_in_chain<'a>( None } +fn anthropic_stream_error_body(error: &dynamo_runtime::error::DynamoError) -> AnthropicErrorBody { + let message = match http_action_for_error(error) { + ClientErrorAction::Respond { public_message, .. } => public_message, + ClientErrorAction::NoDelivery => "Request cancelled", + }; + AnthropicErrorBody { + error_type: anthropic_error_type_for_class(error.class()).to_string(), + message: error.public_message().unwrap_or(message).to_string(), + } +} + +fn anthropic_non_streaming_aggregation_error(error: DynamoError) -> Response { + if super::metrics::request_was_cancelled(&error) { + return anthropic_sanitized_error_with_details(SanitizedError::Cancelled, error); + } + anthropic_semantic_error(&error) + .unwrap_or_else(|| anthropic_sanitized_error_with_details(SanitizedError::Internal, error)) +} + +fn anthropic_semantic_error(error: &dynamo_runtime::error::DynamoError) -> Option { + let ClientErrorAction::Respond { + status, + public_message, + } = http_action_for_error(error) + else { + return None; + }; + + super::metrics::record_failure(error); + if matches!( + error.class(), + dynamo_runtime::error::ErrorClass::Internal + | dynamo_runtime::error::ErrorClass::BackendProtocol + ) { + tracing::error!(class = %error.class(), reason = %error.reason(), diagnostic = ?error.diagnostic().map(dynamo_runtime::error::Diagnostic::as_str), "Semantic request failure"); + } else { + tracing::debug!(class = %error.class(), reason = %error.reason(), diagnostic = ?error.diagnostic().map(dynamo_runtime::error::Diagnostic::as_str), "Semantic request failure"); + } + Some(anthropic_error_unrecorded( + status, + anthropic_error_type_for_class(error.class()), + error.public_message().unwrap_or(public_message), + )) +} + /// Build an Anthropic-formatted error response. /// Maps HTTP status codes to Anthropic error types following the Anthropic API spec. -fn anthropic_error(status: StatusCode, error_type: &str, message: &str) -> Response { - let mapped_type = match status.as_u16() { +fn anthropic_error( + class: ErrorClass, + status: StatusCode, + error_type: &str, + message: &str, +) -> Response { + super::openai::record_local_failure(class); + anthropic_error_unrecorded(status, error_type, message) +} + +fn anthropic_error_type_for_class(class: ErrorClass) -> &'static str { + match class.normalized() { + ErrorClass::InvalidRequest | ErrorClass::UnsupportedMedia => "invalid_request_error", + ErrorClass::Unauthenticated => "authentication_error", + ErrorClass::PermissionDenied => "permission_error", + ErrorClass::NotFound => "not_found_error", + ErrorClass::Conflict => "conflict_error", + ErrorClass::PayloadTooLarge => "request_too_large", + ErrorClass::RateLimited => "rate_limit_error", + ErrorClass::CapacityExhausted | ErrorClass::Unavailable => "overloaded_error", + ErrorClass::DeadlineExceeded => "timeout_error", + ErrorClass::Cancelled + | ErrorClass::BackendProtocol + | ErrorClass::NotImplemented + | ErrorClass::Internal => "api_error", + _ => "api_error", + } +} + +fn anthropic_error_type_for_status(status: StatusCode, fallback: &str) -> &str { + match status.as_u16() { 400 => "invalid_request_error", 401 => "authentication_error", 403 => "permission_error", 404 => "not_found_error", + 409 => "conflict_error", + 413 => "request_too_large", 429 => "rate_limit_error", + 499 => "api_error", 503 | 529 => "overloaded_error", - // Use the caller-provided type for other codes (e.g. 500 → "api_error") - _ => error_type, - }; + 504 => "timeout_error", + _ if status.is_client_error() => "invalid_request_error", + _ => fallback, + } +} +fn anthropic_error_unrecorded(status: StatusCode, error_type: &str, message: &str) -> Response { ( status, Json(AnthropicErrorResponse { object_type: "error".to_string(), error: AnthropicErrorBody { - error_type: mapped_type.to_string(), + error_type: error_type.to_string(), message: message.to_string(), }, }), @@ -1279,6 +1402,7 @@ fn anthropic_error(status: StatusCode, error_type: &str, message: &str) -> Respo /// Anthropic clients expect the nested `{"type": "error", "error": {...}}` pub(crate) fn unmatched_route_response(method: &Method, uri: &Uri) -> Response { anthropic_error( + ErrorClass::NotFound, StatusCode::NOT_FOUND, "not_found_error", &format!("Route not found: {} {}", method, uri.path()), @@ -1305,6 +1429,84 @@ mod tests { .unwrap() } + #[tokio::test] + #[serial_test::serial(failure_metrics)] + async fn anthropic_backend_error_rewrap_records_once() { + use dynamo_runtime::error::{DynamoError, ErrorClass}; + + let error = DynamoError::builder() + .class(ErrorClass::BackendProtocol) + .diagnostic("PRIVATE_BACKEND_DIAGNOSTIC") + .build(); + let counter = super::super::metrics::DYNAM_FAILURES_TOTAL + .with_label_values(&[error.class().as_str(), error.reason().as_str()]); + let before = counter.get(); + let event = Annotated:: { + data: None, + id: None, + event: Some("error".to_string()), + comment: None, + error: Some(error), + }; + let response = match super::super::openai::check_for_backend_error( + futures::stream::iter([event]), + BackendErrorCheck::UntilFirstEvent, + ) + .await + { + Err(response) => anthropic_backend_error_response(response), + Ok(_) => panic!("typed backend failure must fail preflight"), + }; + + assert_eq!(counter.get() - before, 1); + assert_eq!(response.status(), StatusCode::BAD_GATEWAY); + let body = axum::body::to_bytes(response.into_body(), get_body_limit()) + .await + .unwrap(); + let body: AnthropicErrorResponse = serde_json::from_slice(&body).unwrap(); + assert_eq!(body.error.error_type, "api_error"); + assert_eq!(body.error.message, "Bad gateway"); + assert!(!body.error.message.contains("PRIVATE_BACKEND_DIAGNOSTIC")); + } + + #[tokio::test] + #[serial_test::serial(failure_metrics)] + async fn anthropic_backend_error_rewrap_preserves_safe_public_message() { + use dynamo_runtime::error::{DynamoError, ErrorClass, ErrorReason}; + + let error = DynamoError::builder() + .class(ErrorClass::InvalidRequest) + .reason(ErrorReason::new("request.invalid_argument").unwrap()) + .diagnostic("PRIVATE_BACKEND_DIAGNOSTIC") + .public_message("CLIENT_SAFE_MESSAGE") + .build(); + let event = Annotated:: { + data: None, + id: None, + event: Some("error".to_string()), + comment: None, + error: Some(error), + }; + let response = match super::super::openai::check_for_backend_error( + futures::stream::iter([event]), + BackendErrorCheck::UntilFirstEvent, + ) + .await + { + Err(response) => anthropic_backend_error_response(response), + Ok(_) => panic!("typed backend failure must fail preflight"), + }; + + assert_eq!(response.status(), StatusCode::BAD_REQUEST); + let body = axum::body::to_bytes(response.into_body(), get_body_limit()) + .await + .unwrap(); + let body: AnthropicErrorResponse = serde_json::from_slice(&body).unwrap(); + assert_eq!(body.error.error_type, "invalid_request_error"); + assert_eq!(body.error.message, "CLIENT_SAFE_MESSAGE"); + assert!(!body.error.message.contains("PRIVATE_BACKEND_DIAGNOSTIC")); + } + #[test] fn anthropic_nvext_gate_preserves_when_enabled() { let mut request = request_with_nvext(); @@ -1429,6 +1631,100 @@ mod tests { ); } + #[tokio::test] + async fn anthropic_semantic_error_hides_private_diagnostic() { + use dynamo_runtime::error::{DynamoError, ErrorType}; + + let error = DynamoError::builder() + .error_type(ErrorType::InvalidArgument) + .diagnostic("PRIVATE_DIAGNOSTIC_SENTINEL") + .build(); + let response = anthropic_semantic_error(&error).expect("invalid request response"); + + assert_eq!(response.status(), StatusCode::BAD_REQUEST); + let body = axum::body::to_bytes(response.into_body(), get_body_limit()) + .await + .unwrap(); + let body = String::from_utf8(body.to_vec()).unwrap(); + assert!(body.contains("Invalid request")); + assert!(!body.contains("PRIVATE_DIAGNOSTIC_SENTINEL")); + } + + #[tokio::test] + async fn anthropic_semantic_conflict_uses_invalid_request_type() { + let error = dynamo_runtime::error::DynamoError::builder() + .class(dynamo_runtime::error::ErrorClass::Conflict) + .reason(dynamo_runtime::error::ErrorReason::new("request.conflict").unwrap()) + .build(); + let response = anthropic_semantic_error(&error).expect("client response"); + + assert_eq!(response.status(), StatusCode::CONFLICT); + let body = axum::body::to_bytes(response.into_body(), get_body_limit()) + .await + .unwrap(); + let body: AnthropicErrorResponse = serde_json::from_slice(&body).unwrap(); + assert_eq!(body.error.error_type, "conflict_error"); + } + + #[tokio::test] + async fn anthropic_semantic_deadline_uses_timeout_type() { + let error = dynamo_runtime::error::DynamoError::builder() + .class(dynamo_runtime::error::ErrorClass::DeadlineExceeded) + .reason(dynamo_runtime::error::ErrorReason::new("request.deadline_exceeded").unwrap()) + .build(); + let response = anthropic_semantic_error(&error).expect("client response"); + + assert_eq!(response.status(), StatusCode::GATEWAY_TIMEOUT); + let body = axum::body::to_bytes(response.into_body(), get_body_limit()) + .await + .unwrap(); + let body: AnthropicErrorResponse = serde_json::from_slice(&body).unwrap(); + assert_eq!(body.error.error_type, "timeout_error"); + } + + #[tokio::test] + async fn anthropic_non_streaming_aggregation_preserves_unavailable() { + let error = DynamoError::builder() + .class(ErrorClass::Unavailable) + .diagnostic("worker unavailable at /srv/private/backend.rs") + .build(); + let response = anthropic_non_streaming_aggregation_error(error); + + assert_eq!(response.status(), StatusCode::SERVICE_UNAVAILABLE); + let body = axum::body::to_bytes(response.into_body(), get_body_limit()) + .await + .unwrap(); + let body: AnthropicErrorResponse = serde_json::from_slice(&body).unwrap(); + assert_eq!(body.error.error_type, "overloaded_error"); + assert!(!body.error.message.contains("/srv/private")); + } + + #[test] + fn anthropic_stream_error_uses_semantic_identity_without_diagnostic() { + let error = dynamo_runtime::error::DynamoError::builder() + .class(ErrorClass::InvalidRequest) + .diagnostic("PRIVATE_STREAM_DIAGNOSTIC") + .build(); + + let body = anthropic_stream_error_body(&error); + + assert_eq!(body.error_type, "invalid_request_error"); + assert_eq!(body.message, "Invalid request"); + assert!(!body.message.contains("PRIVATE_STREAM_DIAGNOSTIC")); + } + + #[test] + fn anthropic_stream_cancellation_uses_a_spec_error_type() { + let error = dynamo_runtime::error::DynamoError::builder() + .class(ErrorClass::Cancelled) + .build(); + + let body = anthropic_stream_error_body(&error); + + assert_eq!(body.error_type, "api_error"); + assert_eq!(body.message, "Request cancelled"); + } + #[test] fn anthropic_invalid_argument_is_found_through_error_context() { use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; diff --git a/lib/llm/src/http/service/disconnect.rs b/lib/llm/src/http/service/disconnect.rs index af236948b93c..258c387ae9f1 100644 --- a/lib/llm/src/http/service/disconnect.rs +++ b/lib/llm/src/http/service/disconnect.rs @@ -28,7 +28,7 @@ //! done by sending a [`axum::response::sse::Event`] with the event type "error" and the data "`[DONE]`". //! -use axum::response::sse::Event; +use axum::{http::StatusCode, response::sse::Event}; use dynamo_runtime::engine::AsyncEngineContext; use futures::{Stream, StreamExt}; use std::ops::{Deref, DerefMut}; @@ -39,8 +39,9 @@ use std::sync::{ use std::time::Duration; use tokio::sync::mpsc; -use crate::http::service::error::SanitizedError; +use crate::http::service::error::{ClientErrorAction, SanitizedError, http_action_for_error}; use crate::http::service::metrics::{CancellationLabels, ErrorType, InflightGuard, Metrics}; +use dynamo_runtime::error::{DynamoError, ErrorClass}; use dynamo_runtime::config::environment_names::llm::DYN_HTTP_BACKEND_STREAM_TIMEOUT_SECS as BACKEND_STREAM_TIMEOUT_ENV; @@ -77,9 +78,14 @@ pub struct ConnectionHandle { /// protocol event immediately before yielding it. The disconnect monitor reads /// only when the source stream ends or its guards are dropped, avoiding /// synchronization on successful per-token events. +struct StreamFailure { + error_type: ErrorType, + semantic_error: Option, +} + #[derive(Default)] struct StreamErrorState { - error_type: OnceLock, + failure: OnceLock, terminal_event_emitted: AtomicBool, } @@ -88,11 +94,21 @@ pub(super) struct StreamErrorSignal(Arc); impl StreamErrorSignal { pub(super) fn set(&self, error_type: ErrorType) { - let _ = self.0.error_type.set(error_type); + let _ = self.0.failure.set(StreamFailure { + error_type, + semantic_error: None, + }); + } + + pub(super) fn set_semantic(&self, error_type: ErrorType, error: &DynamoError) { + let _ = self.0.failure.set(StreamFailure { + error_type, + semantic_error: Some(error.clone()), + }); } fn get(&self) -> Option<&ErrorType> { - self.0.error_type.get() + self.0.failure.get().map(|failure| &failure.error_type) } pub(super) fn mark_terminal_event_emitted(&self) { @@ -102,6 +118,40 @@ impl StreamErrorSignal { fn terminal_event_emitted(&self) -> bool { self.0.terminal_event_emitted.load(Ordering::Acquire) } + + fn semantic_error(&self) -> Option<&DynamoError> { + self.0 + .failure + .get() + .and_then(|failure| failure.semantic_error.as_ref()) + } + + fn record_delivered_failure(&self) { + if !self.terminal_event_emitted() { + return; + } + let Some(failure) = self.0.failure.get() else { + return; + }; + if let Some(error) = &failure.semantic_error { + if error.class() != ErrorClass::Cancelled { + crate::http::service::metrics::record_failure(error); + } + return; + } + + let class = match &failure.error_type { + ErrorType::Validation => ErrorClass::InvalidRequest, + ErrorType::NotFound => ErrorClass::NotFound, + ErrorType::Overload => ErrorClass::CapacityExhausted, + ErrorType::Unavailable => ErrorClass::Unavailable, + ErrorType::Cancelled => return, + ErrorType::ResponseTimeout => ErrorClass::DeadlineExceeded, + ErrorType::NotImplemented => ErrorClass::NotImplemented, + ErrorType::None | ErrorType::Internal => ErrorClass::Internal, + }; + crate::http::service::metrics::record_failure(&DynamoError::builder().class(class).build()); + } } struct SignaledInflightGuard { @@ -141,10 +191,15 @@ impl DerefMut for SignaledInflightGuard { impl Drop for SignaledInflightGuard { fn drop(&mut self) { - if self.guard.error_type() == &ErrorType::Cancelled - && let Some(error_type) = self.signaled_error_type() + if let Some(error_signal) = &self.error_signal + && error_signal.terminal_event_emitted() { - self.guard.mark_error(error_type); + error_signal.record_delivered_failure(); + if self.guard.error_type() == &ErrorType::Cancelled + && let Some(error_type) = self.signaled_error_type() + { + self.guard.mark_error(error_type); + } } } } @@ -319,6 +374,51 @@ fn openai_stream_error(_error: &(dyn std::error::Error + 'static)) -> (ErrorType (ErrorType::Internal, body) } +fn openai_semantic_stream_error(error: &DynamoError) -> (ErrorType, String) { + let (status, message) = match http_action_for_error(error) { + ClientErrorAction::Respond { + status, + public_message, + } => (status, public_message), + ClientErrorAction::NoDelivery => ( + StatusCode::from_u16(499).expect("499 is a valid extension status"), + "Request cancelled", + ), + }; + let message = error.public_message().unwrap_or(message); + let error_type = if status == crate::http::service::error::overload_status_code() { + "service_unavailable" + } else { + match status { + StatusCode::BAD_REQUEST + | StatusCode::CONFLICT + | StatusCode::PAYLOAD_TOO_LARGE + | StatusCode::UNSUPPORTED_MEDIA_TYPE => "invalid_request_error", + StatusCode::UNAUTHORIZED => "authentication_error", + StatusCode::FORBIDDEN => "permission_error", + StatusCode::NOT_FOUND => "not_found_error", + StatusCode::TOO_MANY_REQUESTS => "rate_limit_error", + StatusCode::SERVICE_UNAVAILABLE => "service_unavailable", + StatusCode::GATEWAY_TIMEOUT => "timeout_error", + StatusCode::NOT_IMPLEMENTED => "not_implemented_error", + _ if status.as_u16() == 499 => "request_cancelled", + _ => "internal_server_error", + } + }; + let body = serde_json::json!({ + "error": { + "message": message, + "type": error_type, + "code": status.as_u16(), + } + }) + .to_string(); + ( + crate::http::service::openai::metric_error_type_for_class(error.class()), + body, + ) +} + /// This method will consume a stream of SSE events and monitor for disconnects or context cancellation. /// /// Uses `tokio::select!` to choose between receiving events from the source stream or detecting when @@ -408,6 +508,28 @@ pub fn monitor_for_disconnects_with_activity( ) } +pub(super) fn monitor_for_disconnects_with_activity_and_error_signal( + stream: impl Stream>, + context: Arc, + inflight_guard: InflightGuard, + stream_handle: ConnectionHandle, + activity_rx: mpsc::UnboundedReceiver<()>, + error_signal: StreamErrorSignal, +) -> impl Stream> { + monitor_for_disconnects_with_timeout_error_and_keep_alive( + stream, + context, + inflight_guard, + stream_handle, + backend_stream_timeout(), + openai_stream_error, + StreamMonitorOptions { + activity_rx: Some(activity_rx), + error_signal: Some(error_signal), + }, + ) +} + #[cfg(test)] fn monitor_for_disconnects_with_timeout( stream: impl Stream>, @@ -474,14 +596,50 @@ fn monitor_for_disconnects_with_timeout_error_and_keep_alive( yield event; } Some(Err(err)) => { - let (error_type, error_body) = error_formatter(&err); - inflight_guard.mark_error(error_type); + let semantic_error = inflight_guard + .error_signal + .as_ref() + .and_then(StreamErrorSignal::semantic_error); + let (fallback_error_type, fallback_error_body) = + error_formatter(&err); + let (error_type, error_body) = match semantic_error { + Some(error) => openai_semantic_stream_error(error), + None => (fallback_error_type, fallback_error_body), + }; + inflight_guard.mark_error(error_type.clone()); // We're terminating the stream intentionally here with a // structured error + [DONE]; disarm so the stream handle // doesn't later record this as ClosedUnexpectedly (which // would mis-attribute the fault as a client disconnect). stream_handle.disarm(); - tracing::error!("Streaming error: {err}"); + if let Some(error_signal) = &inflight_guard.error_signal { + error_signal.mark_terminal_event_emitted(); + if let Some(error) = error_signal.semantic_error() { + if matches!( + error.class(), + dynamo_runtime::error::ErrorClass::Internal + | dynamo_runtime::error::ErrorClass::BackendProtocol + ) { + tracing::error!( + class = %error.class(), + reason = %error.reason(), + diagnostic = ?error.diagnostic().map(dynamo_runtime::error::Diagnostic::as_str), + "Semantic streaming failure" + ); + } else { + tracing::debug!( + class = %error.class(), + reason = %error.reason(), + diagnostic = ?error.diagnostic().map(dynamo_runtime::error::Diagnostic::as_str), + "Semantic streaming failure" + ); + } + } else { + tracing::error!(%error_type, %err, "Streaming failure"); + } + } else { + tracing::error!(%error_type, %err, "Streaming failure"); + } yield Event::default().data(error_body); yield Event::default().data("[DONE]"); // Break to prevent any subsequent mark_ok() from overwriting the error @@ -822,6 +980,7 @@ mod tests { } #[tokio::test] + #[serial_test::serial(failure_metrics)] async fn signaled_error_drop_after_terminal_event_is_not_a_cancellation() { let model = "drop-after-response-failed"; let metrics = Arc::new(Metrics::new()); @@ -852,6 +1011,9 @@ mod tests { connection_handle.disarm(); drop(connection_handle); let error_signal = StreamErrorSignal::default(); + let semantic_counter = crate::http::service::metrics::DYNAM_FAILURES_TOTAL + .with_label_values(&["Internal", "runtime.internal"]); + let semantic_before = semantic_counter.get(); let producer_error_signal = error_signal.clone(); let stream = futures::stream::once(async move { producer_error_signal.set(ErrorType::Internal); @@ -911,6 +1073,91 @@ mod tests { assert_eq!(metrics.get_cancellation_count(&cancellation_labels), 0); assert_eq!(metrics.get_client_disconnect_count(), 0); assert!(!context.is_killed()); + assert_eq!(semantic_counter.get() - semantic_before, 1); + } + + #[tokio::test] + async fn signaled_semantic_err_is_classified_when_terminal_frame_is_emitted() { + let model = "delivered-semantic-error"; + let metrics = Arc::new(Metrics::new()); + let guard = metrics.clone().create_inflight_guard( + model, + Endpoint::ChatCompletions, + true, + "req-delivered-semantic-error", + ); + let context: Arc = Arc::new(MockContext::with_kill_tracking()); + let (stream_tx, _stream_rx) = tokio::sync::oneshot::channel(); + let stream_handle = ConnectionHandle::create_disabled(stream_tx); + let error_signal = StreamErrorSignal::default(); + let producer_error_signal = error_signal.clone(); + let stream = futures::stream::once(async move { + let error = DynamoError::builder() + .class(dynamo_runtime::error::ErrorClass::InvalidRequest) + .reason( + dynamo_runtime::error::ErrorReason::new("request.invalid_argument").unwrap(), + ) + .diagnostic("PRIVATE_STREAM_DIAGNOSTIC") + .public_message("CLIENT_SAFE_STREAM_ERROR") + .build(); + producer_error_signal.set_semantic(ErrorType::Validation, &error); + Err::(axum::Error::new("semantic stream error")) + }); + let monitored = monitor_for_disconnects_with_timeout_error_and_keep_alive( + stream, + context, + guard, + stream_handle, + None, + openai_stream_error, + StreamMonitorOptions { + error_signal: Some(error_signal), + ..Default::default() + }, + ); + let body = collect_sse_body(monitored).await; + + assert!(body.contains("CLIENT_SAFE_STREAM_ERROR")); + assert!(body.contains("\"code\":400")); + assert!(body.contains("invalid_request_error")); + assert!(!body.contains("PRIVATE_STREAM_DIAGNOSTIC")); + assert_eq!( + metrics.get_request_counter( + model, + &Endpoint::ChatCompletions, + &RequestType::Stream, + &Status::Error, + &ErrorType::Validation, + ), + 1 + ); + assert_eq!( + metrics.get_request_counter( + model, + &Endpoint::ChatCompletions, + &RequestType::Stream, + &Status::Error, + &ErrorType::Internal, + ), + 0 + ); + } + + #[test] + fn semantic_overload_stream_error_is_retryable() { + let error = DynamoError::builder() + .class(dynamo_runtime::error::ErrorClass::CapacityExhausted) + .reason(dynamo_runtime::error::ErrorReason::new("capacity.exhausted").unwrap()) + .build(); + + let (_, body) = openai_semantic_stream_error(&error); + let body: serde_json::Value = serde_json::from_str(&body).unwrap(); + + assert_eq!(body["error"]["type"], "service_unavailable"); + assert_eq!( + body["error"]["code"], + crate::http::service::error::overload_status_code().as_u16() + ); } #[tokio::test] @@ -929,6 +1176,44 @@ mod tests { )); } + #[test] + fn undelivered_signaled_error_preserves_cancellation_classification() { + let model = "undelivered-terminal-error"; + let metrics = Arc::new(Metrics::new()); + let mut guard = metrics.clone().create_inflight_guard( + model, + Endpoint::Responses, + true, + "req-undelivered-terminal-error", + ); + guard.mark_error(ErrorType::Cancelled); + let error_signal = StreamErrorSignal::default(); + error_signal.set(ErrorType::Internal); + + drop(SignaledInflightGuard::new(guard, Some(error_signal))); + + assert_eq!( + metrics.get_request_counter( + model, + &Endpoint::Responses, + &RequestType::Stream, + &Status::Error, + &ErrorType::Cancelled, + ), + 1 + ); + assert_eq!( + metrics.get_request_counter( + model, + &Endpoint::Responses, + &RequestType::Stream, + &Status::Error, + &ErrorType::Internal, + ), + 0 + ); + } + fn generate_cancellation_labels() -> CancellationLabels { CancellationLabels { model: "test-model".to_string(), @@ -1234,8 +1519,8 @@ mod tests { "[{case}] structured error `type` mismatch. Body:\n{text}" ); assert_eq!( - error.get("code").and_then(|v| v.as_i64()), - Some(i64::from(expected.status().as_u16())), + error.get("code").and_then(serde_json::Value::as_u64), + Some(expected.status().as_u16().into()), "[{case}] structured error `code` mismatch. Body:\n{text}" ); assert!( diff --git a/lib/llm/src/http/service/error.rs b/lib/llm/src/http/service/error.rs index c37755ea4764..3046b96fd9de 100644 --- a/lib/llm/src/http/service/error.rs +++ b/lib/llm/src/http/service/error.rs @@ -38,12 +38,100 @@ pub struct HttpError { pub message: String, } +/// Frontend-owned HTTP disposition derived only from semantic error class. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum ClientErrorAction { + NoDelivery, + Respond { + status: StatusCode, + public_message: &'static str, + }, +} + +/// Total class-to-HTTP policy. Backends never select these status codes. +pub(crate) fn http_action_for_class(class: dynamo_runtime::error::ErrorClass) -> ClientErrorAction { + use dynamo_runtime::error::ErrorClass; + + let response = |status, public_message| ClientErrorAction::Respond { + status, + public_message, + }; + + match class.normalized() { + ErrorClass::InvalidRequest => response(StatusCode::BAD_REQUEST, "Invalid request"), + ErrorClass::Unauthenticated => { + response(StatusCode::UNAUTHORIZED, "Authentication required") + } + ErrorClass::PermissionDenied => response(StatusCode::FORBIDDEN, "Permission denied"), + ErrorClass::NotFound => response(StatusCode::NOT_FOUND, "Resource not found"), + ErrorClass::Conflict => response(StatusCode::CONFLICT, "Request conflict"), + ErrorClass::PayloadTooLarge => { + response(StatusCode::PAYLOAD_TOO_LARGE, "Request payload too large") + } + ErrorClass::UnsupportedMedia => { + response(StatusCode::UNSUPPORTED_MEDIA_TYPE, "Unsupported media type") + } + ErrorClass::RateLimited => response(StatusCode::TOO_MANY_REQUESTS, "Rate limit exceeded"), + ErrorClass::CapacityExhausted => { + response(overload_status_code(), "Service temporarily overloaded") + } + ErrorClass::Unavailable => response( + StatusCode::SERVICE_UNAVAILABLE, + "Service temporarily unavailable", + ), + ErrorClass::BackendProtocol => response(StatusCode::BAD_GATEWAY, "Bad gateway"), + ErrorClass::DeadlineExceeded => { + response(StatusCode::GATEWAY_TIMEOUT, "Request deadline exceeded") + } + ErrorClass::NotImplemented => { + response(StatusCode::NOT_IMPLEMENTED, "Operation not implemented") + } + ErrorClass::Cancelled => ClientErrorAction::NoDelivery, + ErrorClass::Internal => { + response(StatusCode::INTERNAL_SERVER_ERROR, "Internal server error") + } + _ => response(StatusCode::INTERNAL_SERVER_ERROR, "Internal server error"), + } +} + +pub(crate) fn http_action_for_error(error: &DynamoError) -> ClientErrorAction { + http_action_for_class(error.class()) +} + +/// Return the first classified DynamoError using its fail-closed semantic accessors. +pub(crate) fn find_canonical_error_in_chain<'a>( + err: &'a (dyn std::error::Error + 'static), +) -> Option<&'a DynamoError> { + use dynamo_runtime::error::ErrorClass; + + let mut current = Some(err); + let mut fallback = None; + while let Some(error) = current { + if let Some(dynamo_error) = error.downcast_ref::() + && dynamo_error.class() != ErrorClass::Cancelled + { + if matches!( + dynamo_error.reason().as_str(), + "runtime.unclassified" | "transport.cannot_connect" + ) { + fallback.get_or_insert(dynamo_error); + } else { + return Some(dynamo_error); + } + } + current = error.source(); + } + fallback +} + /// Construct a typed invalid-argument error for validation performed at an /// HTTP protocol adapter boundary. pub(crate) fn invalid_argument(message: impl Into) -> DynamoError { + let message = message.into(); DynamoError::builder() .error_type(DynamoErrorType::InvalidArgument) - .message(message) + .message(message.clone()) + .public_message(message) .build() } @@ -121,12 +209,13 @@ impl SanitizedError { /// generic `api_error`. pub fn anthropic_type(self) -> &'static str { match self { - SanitizedError::Cancelled => "request_cancelled", + SanitizedError::Cancelled => "api_error", SanitizedError::Overloaded => "overloaded_error", SanitizedError::Unavailable => "overloaded_error", SanitizedError::Internal => "api_error", SanitizedError::PreserveServerError(status) => match status.as_u16() { 503 | 529 => "overloaded_error", + 504 => "timeout_error", _ => "api_error", }, } @@ -281,6 +370,13 @@ mod tests { assert_eq!(err.openai_type_slug(), "service_unavailable"); } + #[test] + fn preserve_server_error_504_maps_to_timeout_type() { + let err = SanitizedError::PreserveServerError(StatusCode::GATEWAY_TIMEOUT); + assert_eq!(err.anthropic_type(), "timeout_error"); + assert_eq!(err.openai_type_slug(), "internal_server_error"); + } + #[test] fn preserve_server_error_500_remains_generic() { let err = SanitizedError::PreserveServerError(StatusCode::INTERNAL_SERVER_ERROR); @@ -353,4 +449,103 @@ mod tests { BackendStatusAction::Sanitize(SanitizedError::Internal) ); } + + #[test] + fn canonical_lookup_skips_legacy_wrapper() { + use dynamo_runtime::error::{ErrorClass, ErrorReason}; + + let inner = DynamoError::builder() + .class(ErrorClass::InvalidRequest) + .reason(ErrorReason::new("request.invalid").unwrap()) + .build(); + let outer = DynamoError::builder() + .error_type(DynamoErrorType::Unknown) + .cause(inner) + .build(); + + assert_eq!( + find_canonical_error_in_chain(&outer).map(DynamoError::class), + Some(ErrorClass::InvalidRequest) + ); + } + + #[test] + fn canonical_lookup_retains_unclassified_as_fallback() { + let error = DynamoError::builder() + .class(dynamo_runtime::error::ErrorClass::Internal) + .reason(dynamo_runtime::error::ErrorReason::new("runtime.unclassified").unwrap()) + .build(); + + assert_eq!( + find_canonical_error_in_chain(&error).map(|error| error.reason().as_str()), + Some("runtime.unclassified") + ); + } + + #[test] + fn semantic_classes_have_total_http_policy() { + use dynamo_runtime::error::ErrorClass; + + let cases = [ + (ErrorClass::InvalidRequest, Some(StatusCode::BAD_REQUEST)), + (ErrorClass::Unauthenticated, Some(StatusCode::UNAUTHORIZED)), + (ErrorClass::PermissionDenied, Some(StatusCode::FORBIDDEN)), + (ErrorClass::NotFound, Some(StatusCode::NOT_FOUND)), + (ErrorClass::Conflict, Some(StatusCode::CONFLICT)), + ( + ErrorClass::PayloadTooLarge, + Some(StatusCode::PAYLOAD_TOO_LARGE), + ), + ( + ErrorClass::UnsupportedMedia, + Some(StatusCode::UNSUPPORTED_MEDIA_TYPE), + ), + (ErrorClass::RateLimited, Some(StatusCode::TOO_MANY_REQUESTS)), + (ErrorClass::CapacityExhausted, Some(overload_status_code())), + (ErrorClass::BackendProtocol, Some(StatusCode::BAD_GATEWAY)), + ( + ErrorClass::Unavailable, + Some(StatusCode::SERVICE_UNAVAILABLE), + ), + ( + ErrorClass::DeadlineExceeded, + Some(StatusCode::GATEWAY_TIMEOUT), + ), + ( + ErrorClass::NotImplemented, + Some(StatusCode::NOT_IMPLEMENTED), + ), + ( + ErrorClass::Internal, + Some(StatusCode::INTERNAL_SERVER_ERROR), + ), + (ErrorClass::Cancelled, None), + ]; + + for (class, expected_status) in cases { + match (http_action_for_class(class), expected_status) { + (ClientErrorAction::Respond { status, .. }, Some(expected)) => { + assert_eq!(status, expected, "{class}"); + } + (ClientErrorAction::NoDelivery, None) => {} + (actual, expected) => panic!("{class}: got {actual:?}, expected {expected:?}"), + } + } + } + + #[test] + fn legacy_classes_normalize_before_http_policy() { + use dynamo_runtime::error::ErrorClass; + + for (class, expected) in [ + (ErrorClass::InvalidArgument, StatusCode::BAD_REQUEST), + (ErrorClass::WorkerOverloaded, overload_status_code()), + (ErrorClass::Unknown, StatusCode::INTERNAL_SERVER_ERROR), + ] { + assert!(matches!( + http_action_for_class(class), + ClientErrorAction::Respond { status, .. } if status == expected + )); + } + } } diff --git a/lib/llm/src/http/service/metrics.rs b/lib/llm/src/http/service/metrics.rs index 38bc27b6ce8e..b7ca587500e8 100644 --- a/lib/llm/src/http/service/metrics.rs +++ b/lib/llm/src/http/service/metrics.rs @@ -21,7 +21,7 @@ use prometheus::{ }; use serde::Serialize; use std::{ - sync::{Arc, LazyLock}, + sync::{Arc, LazyLock, OnceLock}, time::{Duration, Instant}, }; @@ -35,7 +35,41 @@ use crate::protocols::{ use crate::reasoning_field::{ReasoningField, RoutedReasoning}; use dynamo_runtime::metrics::prometheus_names::clamp_u64_to_i64; -use dynamo_runtime::error::ErrorType as DynamoErrorType; +use dynamo_runtime::error::{DynamoError, ErrorType as DynamoErrorType}; + +fn new_failure_counter(metrics_prefix: Option<&str>) -> IntCounterVec { + let prefix = + sanitize_frontend_prometheus_prefix(metrics_prefix.unwrap_or(name_prefix::FRONTEND)); + IntCounterVec::new( + Opts::new( + format!("{}_{}", prefix, frontend_service::FAILURES_TOTAL), + "Total number of terminal semantic request failures", + ), + &["class", "reason"], + ) + .expect("the fixed failure metric name and labels are valid") +} + +/// Process-wide because protocol error renderers can run without a request-scoped `Metrics`. +static FAILURE_METRICS_PREFIX: OnceLock = OnceLock::new(); +pub(crate) static DYNAM_FAILURES_TOTAL: LazyLock = LazyLock::new(|| { + let prefix = FAILURE_METRICS_PREFIX.get_or_init(|| { + let raw = std::env::var(env_metrics::DYN_METRICS_PREFIX) + .unwrap_or_else(|_| name_prefix::FRONTEND.to_string()); + sanitize_frontend_prometheus_prefix(&raw) + }); + new_failure_counter(Some(prefix.as_str())) +}); + +fn record_failure_into(counter: &IntCounterVec, error: &DynamoError) { + counter + .with_label_values(&[error.class().as_str(), error.reason().as_str()]) + .inc(); +} + +pub(crate) fn record_failure(error: &DynamoError) { + record_failure_into(&DYNAM_FAILURES_TOTAL, error); +} /// Check whether an error chain indicates the request was rejected. pub fn request_was_rejected(err: &(dyn std::error::Error + 'static)) -> bool { @@ -63,7 +97,10 @@ pub fn request_was_unavailable(err: &(dyn std::error::Error + 'static)) -> bool /// Check whether an error chain indicates the request was cancelled. pub fn request_was_cancelled(err: &(dyn std::error::Error + 'static)) -> bool { - const CANCELLATION: &[DynamoErrorType] = &[DynamoErrorType::Cancelled]; + const CANCELLATION: &[DynamoErrorType] = &[ + DynamoErrorType::Cancelled, + DynamoErrorType::Backend(dynamo_runtime::error::BackendError::Cancelled), + ]; const NON_CANCELLATION: &[DynamoErrorType] = &[]; dynamo_runtime::error::match_error_chain(err, CANCELLATION, NON_CANCELLATION) } @@ -830,6 +867,15 @@ impl Metrics { // needed — hardcode name_prefix::FRONTEND and drop the sanitize function. let raw_prefix = metrics_prefix.unwrap_or_else(|| name_prefix::FRONTEND.to_string()); let prefix = sanitize_frontend_prometheus_prefix(&raw_prefix); + if let Err(configured_prefix) = FAILURE_METRICS_PREFIX.set(prefix.clone()) + && configured_prefix != prefix + { + tracing::warn!( + configured=%configured_prefix, + requested=%prefix, + "Semantic failure metrics already use a different process-wide prefix" + ); + } if prefix != raw_prefix { tracing::warn!( raw=%raw_prefix, @@ -1379,6 +1425,7 @@ impl Metrics { registry.register(Box::new(self.embedding_latency.clone()))?; registry.register(Box::new(self.images_per_request.clone()))?; registry.register(Box::new(self.videos_per_request.clone()))?; + registry.register(Box::new(DYNAM_FAILURES_TOTAL.clone()))?; registry.register(Box::new(self.audio_per_request.clone()))?; registry.register(Box::new(self.image_tokens_per_request.clone()))?; @@ -2315,19 +2362,14 @@ fn annotated_to_sse_event( if let Some(ref msg) = annotated.event { if msg == "error" { - let error_message = if let Some(ref dynamo_err) = annotated.error - && !dynamo_err.message().is_empty() - { - dynamo_err.message().to_string() - } else if let Some(ref comments) = annotated.comment { - let joined = comments.join(" -- "); - if joined.trim().is_empty() { - "unspecified error".to_string() - } else { - joined - } + let error_message = if let Some(ref dynamo_err) = annotated.error { + format!( + "semantic stream error: class={} reason={}", + dynamo_err.class(), + dynamo_err.reason() + ) } else { - "unspecified error".to_string() + "backend stream error".to_string() }; return Err(axum::Error::new(error_message)); } @@ -4208,6 +4250,64 @@ mod tests { } } + #[test] + fn semantic_failure_metric_honors_custom_prefix() { + let registry = prometheus::Registry::new(); + let counter = new_failure_counter(Some("nv_llm_http_service")); + counter + .with_label_values(&["Internal", "runtime.internal"]) + .inc(); + registry.register(Box::new(counter)).unwrap(); + + assert!( + registry + .gather() + .iter() + .any(|family| family.name() == "nv_llm_http_service_failures_total") + ); + } + + #[test] + fn semantic_failure_metric_has_only_class_and_reason_labels() { + use dynamo_runtime::error::{DynamoError, ErrorClass, ErrorReason}; + + let registry = prometheus::Registry::new(); + let counter = new_failure_counter(None); + registry.register(Box::new(counter.clone())).unwrap(); + let error = DynamoError::builder() + .class(ErrorClass::InvalidRequest) + .reason(ErrorReason::new("request.invalid").unwrap()) + .build(); + + record_failure_into(&counter, &error); + + let family = registry + .gather() + .into_iter() + .find(|family| family.name() == "dynamo_frontend_failures_total") + .expect("dynamo_frontend_failures_total metric"); + let metric = family + .get_metric() + .iter() + .find(|metric| { + metric + .get_label() + .iter() + .any(|label| label.name() == "reason" && label.value() == "request.invalid") + }) + .expect("request.invalid sample"); + let labels: Vec<_> = metric + .get_label() + .iter() + .map(|label| (label.name(), label.value())) + .collect(); + assert_eq!( + labels, + vec![("class", "InvalidRequest"), ("reason", "request.invalid")] + ); + assert_eq!(metric.get_counter().value(), 1.0); + } + #[test] fn test_multiple_requests_different_error_types() { let metrics = Arc::new(Metrics::new()); @@ -4403,36 +4503,34 @@ mod tests { } #[test] - fn test_error_event_uses_dynamo_error_message() { + fn test_error_event_uses_semantic_identity_without_diagnostic() { use dynamo_runtime::error::DynamoError; let result = run_event_converter(error_annotated( Some(DynamoError::msg("image load failed: 403 Forbidden")), None, )); assert!(result.is_err()); - assert!(result.unwrap_err().to_string().contains("403 Forbidden")); + let message = result.unwrap_err().to_string(); + assert!(message.contains("class=Internal")); + assert!(message.contains("reason=runtime.unclassified")); + assert!(!message.contains("403 Forbidden")); } #[test] - fn test_error_event_falls_back_to_comment() { + fn test_error_event_does_not_expose_comment() { let result = run_event_converter(error_annotated(None, Some(vec!["connection lost".into()]))); assert!(result.is_err()); - assert!(result.unwrap_err().to_string().contains("connection lost")); + let message = result.unwrap_err().to_string(); + assert_eq!(message, "backend stream error"); + assert!(!message.contains("connection lost")); } #[test] - fn test_error_event_unspecified_when_no_message() { + fn test_error_event_without_identity_is_generic() { let result = run_event_converter(error_annotated(None, None)); assert!(result.is_err()); - assert_eq!(result.unwrap_err().to_string(), "unspecified error"); - } - - #[test] - fn test_error_event_empty_comment_falls_through() { - let result = run_event_converter(error_annotated(None, Some(vec!["".into()]))); - assert!(result.is_err()); - assert_eq!(result.unwrap_err().to_string(), "unspecified error"); + assert_eq!(result.unwrap_err().to_string(), "backend stream error"); } #[test] diff --git a/lib/llm/src/http/service/openai.rs b/lib/llm/src/http/service/openai.rs index ed371563f1ec..770cafd595f0 100644 --- a/lib/llm/src/http/service/openai.rs +++ b/lib/llm/src/http/service/openai.rs @@ -24,6 +24,7 @@ use axum::{ use base64::Engine as _; use bytes::Bytes; use dynamo_runtime::config::{env_is_truthy, environment_names::llm as env_llm}; +use dynamo_runtime::error::{DynamoError, ErrorClass}; use dynamo_runtime::{ engine::AsyncEngineContext, pipeline::{AsyncEngineContextProvider, Context}, @@ -36,8 +37,9 @@ use serde::{Deserialize, Serialize, de::DeserializeOwned}; use super::{ RouteDoc, apply_request_tool_call_parsing_options, disconnect::{ - ConnectionHandle, StreamErrorSignal, create_connection_monitor, monitor_for_disconnects, - monitor_for_disconnects_with_activity, monitor_for_disconnects_with_error_signal, + ConnectionHandle, StreamErrorSignal, create_connection_monitor, + monitor_for_disconnects_with_activity_and_error_signal, + monitor_for_disconnects_with_error_signal, }, error::{HttpError, invalid_argument}, metadata::{attach_x_request_id, extract_metadata_from_http}, @@ -112,7 +114,10 @@ const BATCH_OUTPUT_RETRIEVAL_NOT_IMPLEMENTED: &str = static FORCE_INCLUDE_USAGE: LazyLock = LazyLock::new(|| env_is_truthy(env_llm::DYN_ENABLE_FORCE_INCLUDE_USAGE)); -use super::error::{BackendStatusAction, SanitizedError, overload_status_code}; +use super::error::{ + BackendStatusAction, ClientErrorAction, SanitizedError, find_canonical_error_in_chain, + http_action_for_error, overload_status_code, +}; pub(super) fn rl_router( drt: Arc, @@ -151,6 +156,10 @@ impl ErrorMessage { pub(crate) fn message(&self) -> &str { &self.message } + + pub(crate) fn is_overload(&self) -> bool { + self.metric_error_type == Some(ErrorType::Overload) + } } fn map_error_code_to_error_type(code: StatusCode) -> String { @@ -172,6 +181,17 @@ fn map_error_code_to_error_type(code: StatusCode) -> String { } } +fn semantic_error_type(class: ErrorClass, status: StatusCode) -> String { + if class.normalized() == ErrorClass::CapacityExhausted { + "Overloaded".to_string() + } else { + status + .canonical_reason() + .unwrap_or("UnknownError") + .to_string() + } +} + /// `error_type` for a genuine 503 (readiness, model-unavailable, no routable /// worker) that is not itself a load-shed rejection. `map_error_code_to_error_type` /// cannot be reused here: it checks `code == overload_status_code()` first, and @@ -209,8 +229,8 @@ fn internal_error_type() -> String { .to_string() } -/// Classify error for metrics based on status code and message -fn classify_error_for_metrics(code: StatusCode, message: &str) -> ErrorType { +/// Classify an untyped error response for legacy request metrics by status code. +fn classify_error_for_metrics(code: StatusCode) -> ErrorType { // Same reason as `map_error_code_to_error_type`: the configured overload // code goes first. A registered status such as 507 matches an arm below and // would otherwise be counted as `Internal`, so a load shed would look like a @@ -219,15 +239,8 @@ fn classify_error_for_metrics(code: StatusCode, message: &str) -> ErrorType { return ErrorType::Overload; } match code { - StatusCode::BAD_REQUEST => { - // 400 - if message.starts_with("Validation:") { - ErrorType::Validation - } else { - ErrorType::Internal - } - } - StatusCode::NOT_FOUND => ErrorType::NotFound, // 404 + StatusCode::BAD_REQUEST => ErrorType::Validation, // 400 + StatusCode::NOT_FOUND => ErrorType::NotFound, // 404 StatusCode::NOT_IMPLEMENTED => ErrorType::NotImplemented, // 501 StatusCode::TOO_MANY_REQUESTS => ErrorType::Overload, // 429 StatusCode::SERVICE_UNAVAILABLE => ErrorType::Unavailable, // 503 @@ -235,7 +248,47 @@ fn classify_error_for_metrics(code: StatusCode, message: &str) -> ErrorType { _ if code.as_u16() == 529 => ErrorType::Overload, // 529 _ if code.as_u16() == 499 => ErrorType::Cancelled, // 499 Client Closed Request _ if code.is_client_error() => ErrorType::Validation, // other 4xx - _ => ErrorType::Internal, // everything else + _ => ErrorType::Internal, // everything else + } +} + +pub(super) fn record_local_failure(class: ErrorClass) { + use dynamo_runtime::error::DynamoError; + + if class == ErrorClass::Cancelled { + return; + } + super::metrics::record_failure(&DynamoError::builder().class(class).build()); +} + +fn sanitized_error_class(error: SanitizedError) -> ErrorClass { + match error { + SanitizedError::Cancelled => ErrorClass::Cancelled, + SanitizedError::Overloaded => ErrorClass::CapacityExhausted, + SanitizedError::Unavailable => ErrorClass::Unavailable, + SanitizedError::Internal | SanitizedError::PreserveServerError(_) => ErrorClass::Internal, + } +} + +pub(super) fn metric_error_type_for_class(class: dynamo_runtime::error::ErrorClass) -> ErrorType { + use dynamo_runtime::error::ErrorClass; + + match class.normalized() { + ErrorClass::InvalidRequest + | ErrorClass::Unauthenticated + | ErrorClass::PermissionDenied + | ErrorClass::Conflict + | ErrorClass::PayloadTooLarge + | ErrorClass::UnsupportedMedia => ErrorType::Validation, + ErrorClass::NotFound => ErrorType::NotFound, + ErrorClass::RateLimited | ErrorClass::CapacityExhausted => ErrorType::Overload, + ErrorClass::Unavailable => ErrorType::Unavailable, + ErrorClass::Cancelled => ErrorType::Cancelled, + ErrorClass::NotImplemented => ErrorType::NotImplemented, + ErrorClass::BackendProtocol | ErrorClass::DeadlineExceeded | ErrorClass::Internal => { + ErrorType::Internal + } + _ => ErrorType::Internal, } } @@ -245,7 +298,7 @@ pub(super) fn extract_error_type_from_response(response: &ErrorResponse) -> Erro .1 .metric_error_type .clone() - .unwrap_or_else(|| classify_error_for_metrics(response.0, &response.1.message)) + .unwrap_or_else(|| classify_error_for_metrics(response.0)) } fn responses_conversion_error_response(error: anyhow::Error) -> ErrorResponse { @@ -314,6 +367,7 @@ impl ErrorMessage { /// Not Found Error pub fn model_not_found() -> ErrorResponse { let code = StatusCode::NOT_FOUND; + record_local_failure(ErrorClass::NotFound); let error_type = map_error_code_to_error_type(code); ( code, @@ -354,6 +408,7 @@ impl ErrorMessage { /// shedding. pub fn _service_unavailable() -> ErrorResponse { let code = StatusCode::SERVICE_UNAVAILABLE; + record_local_failure(ErrorClass::Unavailable); ( code, Json(ErrorMessage { @@ -374,6 +429,7 @@ impl ErrorMessage { /// `metric_error_type` are set directly rather than derived from `code`. pub fn service_unavailable_with_body(message: String) -> ErrorResponse { let code = StatusCode::SERVICE_UNAVAILABLE; + record_local_failure(ErrorClass::Unavailable); ( code, Json(ErrorMessage { @@ -419,6 +475,7 @@ impl ErrorMessage { pub fn internal_server_error(msg: &str) -> ErrorResponse { tracing::error!("Internal server error: {msg}"); let code = StatusCode::INTERNAL_SERVER_ERROR; + record_local_failure(ErrorClass::Internal); ( code, Json(ErrorMessage { @@ -445,6 +502,7 @@ impl ErrorMessage { ) -> ErrorResponse { tracing::error!("Internal server error: {public_msg}: {details}"); let code = StatusCode::INTERNAL_SERVER_ERROR; + record_local_failure(ErrorClass::Internal); ( code, Json(ErrorMessage { @@ -465,8 +523,19 @@ impl ErrorMessage { pub fn sanitized_with_details( err: SanitizedError, details: impl std::fmt::Display, + ) -> ErrorResponse { + Self::sanitized_with_details_recording(err, details, true) + } + + fn sanitized_with_details_recording( + err: SanitizedError, + details: impl std::fmt::Display, + record_failure: bool, ) -> ErrorResponse { let status = err.status(); + if record_failure { + record_local_failure(sanitized_error_class(err)); + } if err.log_as_error() { tracing::error!(status = %status, "{err}: {details}"); } else { @@ -501,10 +570,12 @@ impl ErrorMessage { fn coerced_backend_error( asserted: StatusCode, details: impl std::fmt::Display, + record_failure: bool, ) -> ErrorResponse { - let (status, mut body) = ErrorMessage::sanitized_with_details( + let (status, mut body) = ErrorMessage::sanitized_with_details_recording( SanitizedError::Internal, format!("backend asserted status {}: {details}", asserted.as_u16()), + record_failure, ); body.0.details = Some(Box::new( serde_json::json!({ "backend_status": asserted.as_u16() }), @@ -518,6 +589,7 @@ impl ErrorMessage { pub fn not_implemented_error(msg: T) -> ErrorResponse { tracing::error!("Not Implemented error: {msg}"); let code = StatusCode::NOT_IMPLEMENTED; + record_local_failure(ErrorClass::NotImplemented); let error_type = map_error_code_to_error_type(code); ( code, @@ -534,9 +606,12 @@ impl ErrorMessage { /// Unsupported multimodal content is a client error: no retry can make the /// request succeed, and infrastructure above the frontend counts 5xx as a /// server-side fault. Answered 400 where `not_implemented_error` answers 501. + /// The legacy request metric remains `NotImplemented` to distinguish an + /// unsupported feature from malformed input. pub fn unsupported_content_error(msg: T) -> ErrorResponse { tracing::debug!("Unsupported Content error: {msg}"); let code = StatusCode::BAD_REQUEST; + record_local_failure(ErrorClass::InvalidRequest); let error_type = bad_request_error_type(); ( code, @@ -552,6 +627,7 @@ impl ErrorMessage { pub fn request_headers_too_large(msg: &str) -> ErrorResponse { let code = StatusCode::REQUEST_HEADER_FIELDS_TOO_LARGE; + record_local_failure(ErrorClass::PayloadTooLarge); let error_type = map_error_code_to_error_type(code); ( code, @@ -565,6 +641,67 @@ impl ErrorMessage { ) } + fn from_semantic_error(error: &dynamo_runtime::error::DynamoError) -> Option { + Self::from_semantic_error_with_recording(error, true) + } + + fn from_semantic_error_with_recording( + error: &dynamo_runtime::error::DynamoError, + record_failure: bool, + ) -> Option { + let ClientErrorAction::Respond { + status, + public_message, + } = http_action_for_error(error) + else { + return None; + }; + + if record_failure { + super::metrics::record_failure(error); + } + + if matches!( + error.class(), + dynamo_runtime::error::ErrorClass::Internal + | dynamo_runtime::error::ErrorClass::BackendProtocol + ) { + tracing::error!( + class = %error.class(), + reason = %error.reason(), + diagnostic = ?error.diagnostic().map(dynamo_runtime::error::Diagnostic::as_str), + "Semantic request failure" + ); + } else { + tracing::debug!( + class = %error.class(), + reason = %error.reason(), + diagnostic = ?error.diagnostic().map(dynamo_runtime::error::Diagnostic::as_str), + "Semantic request failure" + ); + } + + Some(( + status, + Json(ErrorMessage { + message: error.public_message().unwrap_or(public_message).to_string(), + error_type: semantic_error_type(error.class(), status), + code: status.as_u16(), + details: error + .public_details() + .filter(|details| { + !matches!( + details, + dynamo_runtime::error::PublicDetails::Message { .. } + ) + }) + .and_then(|details| serde_json::to_value(details).ok()) + .map(Box::new), + metric_error_type: Some(metric_error_type_for_class(error.class())), + }), + )) + } + /// The OAI endpoints call an [`dynamo.runtime::engine::AsyncEngine`] which are specialized to return /// an [`anyhow::Error`]. This method will convert the [`anyhow::Error`] into an [`HttpError`]. /// If successful, it will return the [`HttpError`] as an [`ErrorMessage::internal_server_error`] @@ -572,6 +709,7 @@ impl ErrorMessage { pub fn from_anyhow(err: anyhow::Error, alt_msg: &str) -> ErrorResponse { if let Some(rejection) = find_queue_rejection_in_chain(err.as_ref()) { let code = overload_status_code(); + record_local_failure(ErrorClass::CapacityExhausted); return ( code, Json(ErrorMessage { @@ -584,6 +722,21 @@ impl ErrorMessage { ); } + if super::metrics::request_was_cancelled(err.as_ref()) { + return ErrorMessage::sanitized_with_details( + SanitizedError::Cancelled, + format!("{err:#}"), + ); + } + + let canonical_error = find_canonical_error_in_chain(err.as_ref()); + if let Some(error) = canonical_error + && error.reason().as_str() != "runtime.unclassified" + && let Some(response) = Self::from_semantic_error(error) + { + return response; + } + // Check for ResourceExhausted anywhere in the error chain → HTTP 529 if super::metrics::request_was_rejected(err.as_ref()) { return ErrorMessage::sanitized_with_details( @@ -600,104 +753,43 @@ impl ErrorMessage { ); } - // InvalidArgument (top-level OR Backend) → 400. - if let Some(dynamo_err) = find_invalid_argument_in_chain(err.as_ref()) { - // The message may be an [`ErrorPayload`] envelope rather than prose, - // so unwrap it; otherwise the client is shown the raw JSON. An - // explicit client-error status inside the envelope (for example 415) - // is honoured, matching what the in-stream path already does. A 5xx - // is not, because reaching this arm means the worker classified the - // failure as a request problem, and a 5xx body here would bypass the - // sanitizing the other arms apply. - let (message, explicit_status) = - match serde_json::from_str::(dynamo_err.message()) { - Ok(envelope) => { - let explicit_status = envelope - .code - .and_then(|code| StatusCode::from_u16(code).ok()) - .filter(StatusCode::is_client_error); - ( - envelope - .message - .unwrap_or_else(|| dynamo_err.message().to_string()), - explicit_status, - ) - } - Err(_) => (dynamo_err.message().to_string(), None), - }; - let code = explicit_status.unwrap_or(StatusCode::BAD_REQUEST); - // An explicit status the worker asserted goes through the shared - // policy, so a 499 answers with the same sanitized cancellation - // body as every other HTTP path rather than the worker's own text, - // which can name a context id or an internal file. A 400 remains a - // validation error, even when the configured overload status also - // happens to be 400. - if let Some(explicit_status) = explicit_status - && explicit_status != StatusCode::BAD_REQUEST - && let BackendStatusAction::Sanitize(variant) = - BackendStatusAction::triage(explicit_status) - { - return ErrorMessage::sanitized_with_details(variant, message); - } - return ( - code, - Json(ErrorMessage { - message, - error_type: if code == StatusCode::BAD_REQUEST { - bad_request_error_type() - } else { - map_error_code_to_error_type(code) - }, - code: code.as_u16(), - details: None, - // A plain 400 keeps the validation override: a worker's - // refusal text does not carry the `Validation:` prefix - // `classify_error_for_metrics` looks for, so the request - // error would otherwise be counted as `Internal`. A status - // the envelope preserved classifies from that status - // instead, so a backend rate limit counts as `Overload`. - metric_error_type: (code == StatusCode::BAD_REQUEST) - .then_some(ErrorType::Validation), - }), - ); - } - - // Check for Cancelled anywhere in the error chain → HTTP 499 (Client Closed Request) - if super::metrics::request_was_cancelled(err.as_ref()) { - return ErrorMessage::sanitized_with_details( - SanitizedError::Cancelled, - format!("{err:#}"), - ); + if let Some(error) = canonical_error + && let Some(response) = Self::from_semantic_error(error) + { + return response; } // Then check for HttpError match err.downcast::() { - Ok(http_error) => ErrorMessage::from_http_error(http_error), + Ok(http_error) => ErrorMessage::from_backend_http_error(http_error), Err(err) => { ErrorMessage::internal_server_error_with_details(alt_msg, format!("{err:#}")) } } } - /// Convert a backend-supplied [`HttpError`] into a client response. - /// /// Parse first, so a code outside the HTTP status space cannot reach the /// response, then let [`BackendStatusAction::triage`] decide. A 5xx keeps /// its own status only when it is 503 or the configured overload code, /// which is what makes a deliberate load shed distinguishable from an /// internal error. The body text is sanitized either way. - pub fn from_http_error(err: HttpError) -> ErrorResponse { + pub fn from_http_error(class: ErrorClass, err: HttpError) -> ErrorResponse { let Ok(status) = StatusCode::from_u16(err.code) else { - return ErrorMessage::sanitized_with_details(SanitizedError::Internal, err.message); + record_local_failure(ErrorClass::Internal); + return ErrorMessage::sanitized_with_details_recording( + SanitizedError::Internal, + err.message, + false, + ); }; + record_local_failure(class); match BackendStatusAction::triage(status) { BackendStatusAction::Sanitize(variant) => { - ErrorMessage::sanitized_with_details(variant, err.message) + ErrorMessage::sanitized_with_details_recording(variant, err.message, false) } BackendStatusAction::CoerceToInternal(asserted) => { - ErrorMessage::coerced_backend_error(asserted, err.message) + ErrorMessage::coerced_backend_error(asserted, err.message, false) } - // 4xx (non-499): forward the backend's own message. BackendStatusAction::ForwardClientError => ( status, Json(ErrorMessage { @@ -710,6 +802,46 @@ impl ErrorMessage { ), } } + + /// The status remains useful protocol information, but backend message text + /// is diagnostic-only and must not become public merely because it used a + /// 4xx status. + fn from_backend_http_error(mut err: HttpError) -> ErrorResponse { + let Ok(status) = StatusCode::from_u16(err.code) else { + return ErrorMessage::sanitized_with_details(SanitizedError::Internal, err.message); + }; + if status.is_client_error() && status.as_u16() != 499 && status != overload_status_code() { + tracing::debug!(status = %status, "Backend client error: {}", err.message); + err.message = status + .canonical_reason() + .unwrap_or("Client error") + .to_string(); + } + Self::from_http_error(backend_http_error_class(status), err) + } +} + +fn backend_http_error_class(status: StatusCode) -> ErrorClass { + if status == overload_status_code() { + return ErrorClass::CapacityExhausted; + } + + match status { + status if status.as_u16() == 499 => ErrorClass::Cancelled, + StatusCode::BAD_REQUEST | StatusCode::UNPROCESSABLE_ENTITY => ErrorClass::InvalidRequest, + StatusCode::UNAUTHORIZED => ErrorClass::Unauthenticated, + StatusCode::FORBIDDEN => ErrorClass::PermissionDenied, + StatusCode::NOT_FOUND => ErrorClass::NotFound, + StatusCode::CONFLICT => ErrorClass::Conflict, + StatusCode::PAYLOAD_TOO_LARGE => ErrorClass::PayloadTooLarge, + StatusCode::UNSUPPORTED_MEDIA_TYPE => ErrorClass::UnsupportedMedia, + StatusCode::TOO_MANY_REQUESTS => ErrorClass::RateLimited, + StatusCode::SERVICE_UNAVAILABLE => ErrorClass::Unavailable, + StatusCode::GATEWAY_TIMEOUT => ErrorClass::DeadlineExceeded, + StatusCode::NOT_IMPLEMENTED => ErrorClass::NotImplemented, + status if status.is_client_error() => ErrorClass::InvalidRequest, + _ => ErrorClass::Internal, + } } impl From for ErrorMessage { @@ -726,6 +858,13 @@ impl From for ErrorMessage { } } +fn unprocessable_error_message(body: &[u8]) -> (String, bool) { + match serde_json::from_slice::(body) { + Ok(error) => (error.message, true), + Err(_) => (String::from_utf8_lossy(body).into_owned(), false), + } +} + // Problem: Currently we are using JSON from axum as the request validator. Whenever there is an invalid JSON, it will return a 422. // But all the downstream apps that relies on openai based APIs, expects to get 400 for all these cases otherwise they fail badly // Solution: Intercept the response from handlers and convert ANY 422 status codes to 400 with the actual error message. @@ -737,12 +876,15 @@ pub async fn smart_json_error_middleware(request: Request, next: Next) -> let body_bytes = axum::body::to_bytes(body, get_body_limit()) .await .unwrap_or_default(); - let error_message = String::from_utf8_lossy(&body_bytes).to_string(); + let (error_message, already_recorded) = unprocessable_error_message(&body_bytes); + if !already_recorded { + record_local_failure(ErrorClass::InvalidRequest); + } ( StatusCode::BAD_REQUEST, Json(ErrorMessage { message: error_message, - error_type: map_error_code_to_error_type(StatusCode::BAD_REQUEST), + error_type: bad_request_error_type(), code: StatusCode::BAD_REQUEST.as_u16(), details: None, metric_error_type: None, @@ -1078,7 +1220,7 @@ async fn completions_single( // the first item maps to its HTTP status instead of an SSE frame // behind an HTTP 200. let stream = until_client_disconnects( - check_for_backend_error(stream, state.streaming_backend_error_check()), + check_for_backend_error_info(stream, state.streaming_backend_error_check()), &ctx, ) .await @@ -1089,6 +1231,8 @@ async fn completions_single( // For streaming, we'll drop the http_queue_guard on the first token let mut http_queue_guard = Some(http_queue_guard); + let error_signal = StreamErrorSignal::default(); + let producer_error_signal = error_signal.clone(); let stream = stream .filter(|r| { // Drop empty chunks from multi-byte token assembly @@ -1099,19 +1243,30 @@ async fn completions_single( ) }) .map(move |response| { + let semantic_error = set_stream_semantic_error(&response, &producer_error_signal); // Calls observe_response() on each token - process_response_using_event_converter_and_observe_metrics( + let result = process_response_using_event_converter_and_observe_metrics( EventConverter::from(response), &mut response_collector, &mut http_queue_guard, - ) + ); + if semantic_error && matches!(result, Ok(Some(_))) { + producer_error_signal.mark_terminal_event_emitted(); + } + result }) .filter_map(|result| { use futures::future; // Transpose Result> -> Option> future::ready(result.transpose()) }); - let stream = monitor_for_disconnects(stream, ctx, inflight_guard, stream_handle); + let stream = monitor_for_disconnects_with_error_signal( + stream, + ctx, + inflight_guard, + stream_handle, + error_signal, + ); let mut sse_stream = Sse::new(stream); @@ -1146,14 +1301,10 @@ async fn completions_single( let response = NvCreateCompletionResponse::from_annotated_stream(stream, parsing_options) .await .map_err(|e| { - tracing::error!( - "Failed to fold completions stream for {}: {:?}", - request_id, - e + let err_response = non_streaming_aggregation_error_response( + e, + &format!("Failed to fold completions stream for {request_id}"), ); - let err_response = ErrorMessage::internal_server_error(&format!( - "Failed to fold completions stream for {request_id}" - )); inflight_guard.mark_error(extract_error_type_from_response(&err_response)); err_response })?; @@ -1259,14 +1410,14 @@ type BoxedCompletionResponseStream = async fn check_completion_batch_streams( streams: Vec, check: BackendErrorCheck, -) -> Result, ErrorResponse> +) -> Result, BackendErrorInfo> where S: futures::Stream> + Send + 'static, { futures::future::try_join_all( streams .into_iter() - .map(|stream| check_for_backend_error(stream, check)), + .map(|stream| check_for_backend_error_info(stream, check)), ) .await } @@ -1427,6 +1578,8 @@ async fn completions_batch( if streaming { // For streaming, we'll drop the http_queue_guard on the first token let mut http_queue_guard = Some(http_queue_guard); + let error_signal = StreamErrorSignal::default(); + let producer_error_signal = error_signal.clone(); let stream = merged_stream .filter(|r| { // Drop empty chunks from multi-byte token assembly @@ -1437,19 +1590,30 @@ async fn completions_batch( ) }) .map(move |response| { + let semantic_error = set_stream_semantic_error(&response, &producer_error_signal); // Calls observe_response() on each token - process_response_using_event_converter_and_observe_metrics( + let result = process_response_using_event_converter_and_observe_metrics( EventConverter::from(response), &mut response_collector, &mut http_queue_guard, - ) + ); + if semantic_error && matches!(result, Ok(Some(_))) { + producer_error_signal.mark_terminal_event_emitted(); + } + result }) .filter_map(|result| { use futures::future; // Transpose Result> -> Option> future::ready(result.transpose()) }); - let stream = monitor_for_disconnects(stream, ctx, inflight_guard, stream_handle); + let stream = monitor_for_disconnects_with_error_signal( + stream, + ctx, + inflight_guard, + stream_handle, + error_signal, + ); let mut sse_stream = Sse::new(stream); @@ -1473,14 +1637,10 @@ async fn completions_batch( let response = NvCreateCompletionResponse::from_annotated_stream(stream, parsing_options) .await .map_err(|e| { - tracing::error!( - "Failed to fold completions stream for {}: {:?}", - request_id, - e + let err_response = non_streaming_aggregation_error_response( + e, + &format!("Failed to fold completions stream for {request_id}"), ); - let err_response = ErrorMessage::internal_server_error(&format!( - "Failed to fold completions stream for {request_id}" - )); inflight_guard.mark_error(extract_error_type_from_response(&err_response)); err_response })?; @@ -1609,13 +1769,8 @@ async fn embeddings( let mut response = NvCreateEmbeddingResponse::from_annotated_stream(stream) .await .map_err(|e| { - tracing::error!( - "Failed to fold embeddings stream for {}: {:?}", - request_id, - e - ); let err_response = - ErrorMessage::internal_server_error("Failed to fold embeddings stream"); + non_streaming_aggregation_error_response(e, "Failed to fold embeddings stream"); inflight.mark_error(extract_error_type_from_response(&err_response)); err_response })?; @@ -1854,16 +2009,12 @@ async fn rerank( } fn pooling_family_bad_request(message: String) -> ErrorResponse { - let code = StatusCode::BAD_REQUEST; - ( - code, - Json(ErrorMessage { + ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: StatusCode::BAD_REQUEST.as_u16(), message, - error_type: map_error_code_to_error_type(code), - code: code.as_u16(), - details: None, - metric_error_type: None, - }), + }, ) } @@ -2292,16 +2443,12 @@ where } fn json_deserialize_error(error: serde_json::Error) -> ErrorResponse { - let code = StatusCode::BAD_REQUEST; - ( - code, - Json(ErrorMessage { + ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: StatusCode::BAD_REQUEST.as_u16(), message: format!("Failed to deserialize the JSON body into the target type: {error}"), - error_type: map_error_code_to_error_type(code), - code: code.as_u16(), - details: None, - metric_error_type: None, - }), + }, ) } @@ -2321,51 +2468,39 @@ fn ensure_json_content_type(headers: &HeaderMap) -> Result<(), ErrorResponse> { } fn unsupported_media_type_error() -> ErrorResponse { - let code = StatusCode::UNSUPPORTED_MEDIA_TYPE; - ( - code, - Json(ErrorMessage { + ErrorMessage::from_http_error( + ErrorClass::UnsupportedMedia, + HttpError { + code: StatusCode::UNSUPPORTED_MEDIA_TYPE.as_u16(), message: "Expected request with Content-Type application/json".to_string(), - error_type: map_error_code_to_error_type(code), - code: code.as_u16(), - details: None, - metric_error_type: None, - }), + }, ) } /// Returns the standard error response for a request body that exceeds the /// configured size limit. fn payload_too_large_error() -> ErrorResponse { - let code = StatusCode::PAYLOAD_TOO_LARGE; - ( - code, - Json(ErrorMessage { + ErrorMessage::from_http_error( + ErrorClass::PayloadTooLarge, + HttpError { + code: StatusCode::PAYLOAD_TOO_LARGE.as_u16(), message: format!( "Request body exceeds the limit of {} MB set by {}", get_body_limit() / (1024 * 1024), env_llm::DYN_HTTP_BODY_LIMIT_MB ), - error_type: map_error_code_to_error_type(code), - code: code.as_u16(), - details: None, - metric_error_type: None, - }), + }, ) } /// Returns the standard error response when the request body cannot be read. fn failed_to_read_request_body_error() -> ErrorResponse { - let code = StatusCode::BAD_REQUEST; - ( - code, - Json(ErrorMessage { + ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: StatusCode::BAD_REQUEST.as_u16(), message: "Failed to read request body".to_string(), - error_type: map_error_code_to_error_type(code), - code: code.as_u16(), - details: None, - metric_error_type: None, - }), + }, ) } @@ -2438,10 +2573,29 @@ fn escape_json_string_control_chars(body: &[u8]) -> Option> { changed.then_some(out) } +/// Capture the first typed terminal stream error without recording it yet. +/// The disconnect monitor records it only after the protocol terminal event is delivered. +pub(super) fn set_stream_semantic_error( + event: &Annotated, + error_signal: &StreamErrorSignal, +) -> bool { + let Some(error) = event + .error + .as_ref() + .filter(|_| event.event.as_deref() == Some("error")) + else { + return false; + }; + let error_type = metric_error_type_for_class(error.class()); + error_signal.set_semantic(error_type, error); + true +} + /// A backend error extracted from an event, ready for `backend_error_response`. -struct BackendErrorInfo { +pub(super) struct BackendErrorInfo { message: String, status: StatusCode, + semantic: Option, /// Classification already established from the error chain, when the /// status alone is not enough to recover it. `None` means "derive it from /// `status`" — the ordinary case for a status the worker supplied. @@ -2454,22 +2608,24 @@ impl BackendErrorInfo { Self { message, status, + semantic: None, sanitized: None, } } + + fn with_semantic(mut self, error: Option<&dynamo_runtime::error::DynamoError>) -> Self { + self.semantic = error.cloned(); + self + } } -/// The `{"message": ..., "code": ...}` envelope `py_err_to_dynamo` emits for an -/// HTTP-like Python exception (see `lib/bindings/python/rust/backend.rs`). +/// The `{"message": ..., "code": ...}` envelope emitted by older Python workers +/// for HTTP-like exceptions. /// -/// A worker's error message is therefore not always prose, and the raw envelope -/// must never reach a client. Both the in-stream path -/// ([`extract_backend_error_if_present`]) and the pre-stream path -/// ([`ErrorMessage::from_anyhow`]) unwrap it, so the *body* is the same either -/// way. They deliberately differ on the *status*: the in-stream path honours -/// any code in the envelope, while the pre-stream path honours only a client -/// error, because it is reached solely through the `InvalidArgument` arm and a -/// 5xx there would skip the sanitizing the other arms apply. +/// A legacy worker's error message is not always prose, and the raw envelope +/// must never reach a client. The in-stream compatibility path unwraps it; new +/// producers carry semantic classes instead. This parser is only a bounded +/// rolling-upgrade adapter. #[derive(serde::Deserialize)] struct ErrorPayload { message: Option, @@ -2485,6 +2641,8 @@ fn extract_backend_error_if_present( if let Some(event_type) = &event.event && event_type == "error" { + let semantic = event.error.as_ref(); + // Classify only this event's error, not its causes. An inner invalid // argument must not override an outer unavailable or internal error. let invalid_argument = event @@ -2551,29 +2709,34 @@ fn extract_backend_error_if_present( return Some(BackendErrorInfo { message, status: code, + semantic: if overloaded { semantic.cloned() } else { None }, sanitized: overloaded.then_some(SanitizedError::Overloaded), }); } - if let Some(invalid_argument) = invalid_argument { - return Some(BackendErrorInfo::from_status( - invalid_argument.message().to_string(), - StatusCode::BAD_REQUEST, - )); + if invalid_argument.is_some() { + return Some( + BackendErrorInfo::from_status( + "Invalid request".to_string(), + StatusCode::BAD_REQUEST, + ) + .with_semantic(semantic), + ); } if overloaded { return Some(BackendErrorInfo { message: error_str, status: overload_status_code(), + semantic: semantic.cloned(), sanitized: Some(SanitizedError::Overloaded), }); } - return Some(BackendErrorInfo::from_status( - error_str, - StatusCode::INTERNAL_SERVER_ERROR, - )); + return Some( + BackendErrorInfo::from_status(error_str, StatusCode::INTERNAL_SERVER_ERROR) + .with_semantic(semantic), + ); } // Check if the data payload itself contains an error structure with code >= 400 @@ -2653,12 +2816,12 @@ const MAX_LEADING_ANNOTATIONS: usize = 16; /// sees the original ordering. `BackendErrorCheck::Skip` returns the stream /// untouched. /// -/// Returns `Err(ErrorResponse)` if the first non-annotation event is a backend +/// Returns `Err(BackendErrorInfo)` if the first non-annotation event is a backend /// error, `Ok(stream)` otherwise. -pub(super) async fn check_for_backend_error( +pub(super) async fn check_for_backend_error_info( stream: impl futures::Stream> + Send + 'static, check: BackendErrorCheck, -) -> Result> + Send>>, ErrorResponse> +) -> Result> + Send>>, BackendErrorInfo> where T: serde::Serialize + Send + 'static, { @@ -2697,7 +2860,7 @@ where } if let Some(backend_error) = extract_backend_error_if_present(&event) { - return Err(backend_error_response(backend_error)); + return Err(backend_error); } // First non-annotation, non-error event — hand back for downstream @@ -2707,6 +2870,18 @@ where } } +pub(super) async fn check_for_backend_error( + stream: impl futures::Stream> + Send + 'static, + check: BackendErrorCheck, +) -> Result> + Send>>, ErrorResponse> +where + T: serde::Serialize + Send + 'static, +{ + check_for_backend_error_info(stream, check) + .await + .map_err(|error| backend_error_response(error, true)) +} + /// Abandon `check` if the client disconnects before it resolves, and discard a /// result that resolved after the disconnect. /// @@ -2724,7 +2899,7 @@ where /// hangup as whatever the backend said on its way out. So a result is /// returned only while the connection is still open. pub(super) async fn until_client_disconnects( - check: impl std::future::Future>, + check: impl std::future::Future>, ctx: &Arc, ) -> Result { let result = tokio::select! { @@ -2734,7 +2909,7 @@ pub(super) async fn until_client_disconnects( if ctx.is_killed() { return Err(ErrorMessage::client_disconnected()); } - result + result.map_err(|error| backend_error_response(error, true)) } /// Log a failed pre-commit check. @@ -2757,6 +2932,14 @@ pub(super) fn log_pre_commit_error(request_id: &str, error_response: &ErrorRespo } } +/// Render a typed unary aggregation failure through the standard semantic funnel. +fn non_streaming_aggregation_error_response( + error: DynamoError, + fallback_message: &str, +) -> ErrorResponse { + ErrorMessage::from_anyhow(anyhow::Error::new(error), fallback_message) +} + /// Convert a `BackendErrorInfo` from `extract_backend_error_if_present` into the /// wire `ErrorResponse`. Shared between the non-streaming preflight /// (`check_for_backend_error`) and the streaming preflight so both paths speak @@ -2774,34 +2957,77 @@ pub(super) fn log_pre_commit_error(request_id: &str, error_response: &ErrorRespo /// from the status: the status alone cannot distinguish a capacity rejection /// from an outage once `DYN_HTTP_OVERLOAD_STATUS_CODE` is set outside the 5xx /// range. -fn backend_error_response(backend_error: BackendErrorInfo) -> ErrorResponse { +fn backend_error_response(backend_error: BackendErrorInfo, record_failure: bool) -> ErrorResponse { let BackendErrorInfo { message, status, + semantic, sanitized, } = backend_error; - let action = match sanitized { - Some(variant) => BackendStatusAction::Sanitize(variant), - None => BackendStatusAction::triage(status), - }; + if let Some(variant) = sanitized { + let mut render_record_failure = record_failure; + if record_failure + && let Some(error) = &semantic + && error.class().normalized() == sanitized_error_class(variant) + { + super::metrics::record_failure(error); + render_record_failure = false; + } + return ErrorMessage::sanitized_with_details_recording( + variant, + message, + render_record_failure, + ); + } + + if let Some(error) = &semantic { + let is_classified = !matches!( + error.reason().as_str(), + "backend.unknown" | "runtime.unclassified" + ); + if is_classified + && let Some(response) = + ErrorMessage::from_semantic_error_with_recording(error, record_failure) + { + return response; + } + if matches!(http_action_for_error(error), ClientErrorAction::NoDelivery) { + return ErrorMessage::sanitized_with_details_recording( + SanitizedError::Cancelled, + message, + false, + ); + } + } + + let render_record_failure = record_failure; + let action = BackendStatusAction::triage(status); match action { BackendStatusAction::Sanitize(variant) => { - ErrorMessage::sanitized_with_details(variant, message) + ErrorMessage::sanitized_with_details_recording(variant, message, render_record_failure) } BackendStatusAction::CoerceToInternal(asserted) => { - ErrorMessage::coerced_backend_error(asserted, message) + ErrorMessage::coerced_backend_error(asserted, message, render_record_failure) + } + BackendStatusAction::ForwardClientError => { + if render_record_failure { + record_local_failure(backend_http_error_class(status)); + } + let message = status + .canonical_reason() + .unwrap_or("Client error") + .to_string(); + ( + status, + Json(ErrorMessage { + message, + error_type: map_error_code_to_error_type(status), + code: status.as_u16(), + details: None, + metric_error_type: None, + }), + ) } - // 4xx (non-499): protocol contract — forward backend message as-is. - BackendStatusAction::ForwardClientError => ( - status, - Json(ErrorMessage { - message, - error_type: map_error_code_to_error_type(status), - code: status.as_u16(), - details: None, - metric_error_type: None, - }), - ), } } @@ -3180,7 +3406,7 @@ async fn chat_completions( // `UntilFirstEvent` ends on the first event or on the client // disconnecting, and on nothing else. let stream = until_client_disconnects( - check_for_backend_error(stream, state.streaming_backend_error_check()), + check_for_backend_error_info(stream, state.streaming_backend_error_check()), &ctx, ) .await @@ -3201,12 +3427,16 @@ async fn chat_completions( // - `event: tool_call_dispatch` — complete tool call detected early (tool dispatch) // - `event: reasoning_dispatch` — complete reasoning block (emitted once) let (activity_tx, activity_rx) = tokio::sync::mpsc::unbounded_channel(); + let error_signal = StreamErrorSignal::default(); + let producer_error_signal = error_signal.clone(); let stream = async_stream::stream! { let mut stream = Box::pin(stream); let mut events: Vec> = Vec::with_capacity(4); while let Some(mut response) = stream.next().await { events.clear(); + let semantic_error = + set_stream_semantic_error(&response, &producer_error_signal); // When parallel_tool_calls is false, surface only the first tool call // Keep index 0 and drop any higher indexes @@ -3268,6 +3498,10 @@ async fn chat_completions( reasoning_field, ); + if semantic_error && matches!(&sse_result, Ok(Some(_))) { + producer_error_signal.mark_terminal_event_emitted(); + } + // Side-channel events come first, then the regular data event. match sse_result { Ok(Some(ev)) => events.push(Ok(ev)), @@ -3282,12 +3516,13 @@ async fn chat_completions( } }; let keep_alive = state.sse_keep_alive_for_response(stream_can_defer_all_output); - let stream = monitor_for_disconnects_with_activity( + let stream = monitor_for_disconnects_with_activity_and_error_signal( stream, ctx, inflight_guard, stream_handle, activity_rx, + error_signal, ); let mut sse_stream = Sse::new(stream); @@ -3319,12 +3554,8 @@ async fn chat_completions( NvCreateChatCompletionResponse::from_annotated_stream(stream, parsing_options.clone()) .await .map_err(|e| { - tracing::error!( - request_id, - "Failed to parse chat completion response: {:?}", - e - ); - let err_response = ErrorMessage::internal_server_error( + let err_response = non_streaming_aggregation_error_response( + e, "Failed to parse chat completion response", ); inflight_guard.mark_error(extract_error_type_from_response(&err_response)); @@ -3375,10 +3606,13 @@ fn normalize_chat_reasoning_template_args( request: &mut NvCreateChatCompletionRequest, ) -> Result<(), ErrorResponse> { request.normalize_reasoning_template_args().map_err(|e| { - ErrorMessage::from_http_error(HttpError { - code: 400, - message: VALIDATION_PREFIX.to_string() + &e.to_string(), - }) + ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: 400, + message: VALIDATION_PREFIX.to_string() + &e.to_string(), + }, + ) }) } @@ -3400,11 +3634,14 @@ pub fn validate_chat_completion_required_fields( let inner = &request.inner; if inner.messages.is_empty() { - return Err(ErrorMessage::from_http_error(HttpError { - code: 400, - message: VALIDATION_PREFIX.to_string() - + "The 'messages' field cannot be empty. At least one message is required.", - })); + return Err(ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: 400, + message: VALIDATION_PREFIX.to_string() + + "The 'messages' field cannot be empty. At least one message is required.", + }, + )); } Ok(()) @@ -3417,11 +3654,14 @@ pub fn validate_chat_completion_stream_options( let inner = &request.inner; let streaming = inner.stream.unwrap_or(false); if !streaming && inner.stream_options.is_some() { - return Err(ErrorMessage::from_http_error(HttpError { - code: 400, - message: VALIDATION_PREFIX.to_string() - + "The 'stream_options' field is only allowed when 'stream' is set to true.", - })); + return Err(ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: 400, + message: VALIDATION_PREFIX.to_string() + + "The 'stream_options' field is only allowed when 'stream' is set to true.", + }, + )); } Ok(()) } @@ -3437,10 +3677,13 @@ pub fn validate_chat_completion_fields_generic( if find_invalid_argument_in_chain(e.as_ref()).is_some() { return ErrorMessage::from_anyhow(e, "Invalid chat completion request"); } - ErrorMessage::from_http_error(HttpError { - code: 400, - message: VALIDATION_PREFIX.to_string() + &e.to_string(), - }) + ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: 400, + message: VALIDATION_PREFIX.to_string() + &e.to_string(), + }, + ) }) } @@ -3451,11 +3694,14 @@ pub fn validate_completion_stream_options( let inner = &request.inner; let streaming = inner.stream.unwrap_or(false); if !streaming && inner.stream_options.is_some() { - return Err(ErrorMessage::from_http_error(HttpError { - code: 400, - message: VALIDATION_PREFIX.to_string() - + "The 'stream_options' field is only allowed when 'stream' is set to true.", - })); + return Err(ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: 400, + message: VALIDATION_PREFIX.to_string() + + "The 'stream_options' field is only allowed when 'stream' is set to true.", + }, + )); } Ok(()) } @@ -3471,10 +3717,13 @@ pub fn validate_completion_fields_generic( if find_invalid_argument_in_chain(e.as_ref()).is_some() { return ErrorMessage::from_anyhow(e, "Invalid completion request"); } - ErrorMessage::from_http_error(HttpError { - code: 400, - message: VALIDATION_PREFIX.to_string() + &e.to_string(), - }) + ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: 400, + message: VALIDATION_PREFIX.to_string() + &e.to_string(), + }, + ) }) } @@ -3802,7 +4051,7 @@ async fn responses( // chat_completions above. The long backend-inactivity safety net // lives in `monitor_for_disconnects`. let engine_stream = until_client_disconnects( - check_for_backend_error(engine_stream, state.streaming_backend_error_check()), + check_for_backend_error_info(engine_stream, state.streaming_backend_error_check()), &ctx, ) .await @@ -3846,13 +4095,21 @@ async fn responses( if let Some(backend_error_info) = extract_backend_error_if_present(&annotated_chunk) { - let error_response = backend_error_response(backend_error_info); - producer_error_signal - .set(extract_error_type_from_response(&error_response)); - backend_error.get_or_insert_with(|| ErrorObject { - code: responses_error_code(error_response.0).to_string(), - message: error_response.1.message.clone(), - }); + if backend_error.is_none() { + let semantic = set_stream_semantic_error( + &annotated_chunk, + &producer_error_signal, + ); + let error_response = backend_error_response(backend_error_info, false); + if !semantic { + producer_error_signal + .set(extract_error_type_from_response(&error_response)); + } + backend_error = Some(ErrorObject { + code: responses_error_code(error_response.0).to_string(), + message: error_response.1.message.clone(), + }); + } continue; } @@ -3927,9 +4184,10 @@ async fn responses( NvCreateChatCompletionResponse::from_annotated_stream(stream, parsing_options.clone()) .await .map_err(|e| { - tracing::error!(request_id, "Failed to fold responses stream: {:?}", e); - let err_response = - ErrorMessage::internal_server_error("Failed to fold responses stream"); + let err_response = non_streaming_aggregation_error_response( + e, + "Failed to fold responses stream", + ); inflight_guard.mark_error(extract_error_type_from_response(&err_response)); err_response })?; @@ -4023,10 +4281,13 @@ pub fn validate_responses_fields(request: &NvCreateResponse) -> Result<(), Error use crate::protocols::openai::validate; let map_err = |e: anyhow::Error| { - ErrorMessage::from_http_error(HttpError { - code: 400, - message: VALIDATION_PREFIX.to_string() + &e.to_string(), - }) + ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: 400, + message: VALIDATION_PREFIX.to_string() + &e.to_string(), + }, + ) }; validate::validate_temperature(request.inner.temperature).map_err(&map_err)?; @@ -4055,6 +4316,7 @@ pub(crate) fn check_ready(state: &Arc) -> Result<(), ErrorRes /// unmatched route. pub(crate) fn unmatched_route_response(method: &Method, uri: &Uri) -> ErrorResponse { let code = StatusCode::NOT_FOUND; + record_local_failure(ErrorClass::NotFound); ( code, Json(ErrorMessage { @@ -4644,16 +4906,12 @@ async fn images_edits( let body = read_json_request_body(&headers, body).await?; let request: NvCreateImageRequest = parse_json_request("image edits", &body)?; if request.input_reference.is_none() { - let code = StatusCode::BAD_REQUEST; - return Err(( - code, - Json(ErrorMessage { + return Err(ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: StatusCode::BAD_REQUEST.as_u16(), message: "input_reference is required for /v1/images/edits".to_string(), - error_type: map_error_code_to_error_type(code), - code: code.as_u16(), - details: None, - metric_error_type: None, - }), + }, )); } images_with_request(state.0, headers, request).await @@ -4748,22 +5006,34 @@ async fn videos( }, ) .await; + let error_signal = StreamErrorSignal::default(); + let producer_error_signal = error_signal.clone(); let stream = stream.flat_map(move |response| { + let semantic_error = set_stream_semantic_error(&response, &producer_error_signal); let sse_result = process_response_using_event_converter_and_observe_metrics( EventConverter::from(response), &mut response_collector, &mut http_queue_guard, ); + if semantic_error && matches!(sse_result, Ok(Some(_))) { + producer_error_signal.mark_terminal_event_emitted(); + } match sse_result { Ok(Some(ev)) => stream::iter(vec![Ok(ev)]), Ok(None) => stream::iter(vec![]), Err(e) => stream::iter(vec![Err(e)]), } }); - // monitor_for_disconnects: arms stream_handle, pre-marks inflight Cancelled, - // emits data:[DONE] on natural end, demotes to Internal on mid-stream Err, + // The disconnect monitor arms stream_handle, pre-marks inflight Cancelled, + // emits data:[DONE] on natural end, classifies typed mid-stream errors, // and kills the engine context when the client disconnects. - let stream = monitor_for_disconnects(stream, ctx, inflight, stream_handle); + let stream = monitor_for_disconnects_with_error_signal( + stream, + ctx, + inflight, + stream_handle, + error_signal, + ); let mut sse_stream = Sse::new(stream); if let Some(keep_alive) = state.sse_keep_alive() { @@ -4785,9 +5055,8 @@ async fn videos( let response = NvVideosResponse::from_annotated_stream(stream) .await .map_err(|e| { - tracing::error!("Failed to fold videos stream for {}: {:?}", request_id, e); let err_response = - ErrorMessage::internal_server_error("Failed to fold videos stream"); + non_streaming_aggregation_error_response(e, "Failed to fold videos stream"); inflight.mark_error(extract_error_type_from_response(&err_response)); err_response })?; @@ -5143,13 +5412,7 @@ async fn audio_speech( let stream = check_for_backend_error(stream, BackendErrorCheck::UntilFirstEvent) .await .inspect_err(|error_response| { - let error_type = match error_response.0 { - // Worker-side InvalidArgument messages are not guaranteed to use - // the "Validation:" prefix expected by the shared classifier. - StatusCode::BAD_REQUEST => ErrorType::Validation, - _ => extract_error_type_from_response(error_response), - }; - inflight.mark_error(error_type); + inflight.mark_error(extract_error_type_from_response(error_response)); })?; let mut http_queue_guard = Some(http_queue_guard); @@ -5962,7 +6225,8 @@ mod tests { let err = http_error_from_engine(400).unwrap_err(); let response = ErrorMessage::from_anyhow(err, BACKUP_ERROR_MESSAGE); assert_eq!(response.0, StatusCode::BAD_REQUEST); - assert_eq!(response.1.message, "custom error message"); + assert_eq!(response.1.message, "Bad Request"); + assert!(!response.1.message.contains("custom error message")); } #[test] @@ -6001,6 +6265,26 @@ mod tests { ); } + #[test] + fn semantic_422_body_is_not_reclassified() { + let body = serde_json::to_vec(&ErrorMessage { + message: "safe semantic message".to_string(), + error_type: "Unprocessable Entity".to_string(), + code: 422, + details: None, + metric_error_type: None, + }) + .unwrap(); + + let (message, already_recorded) = unprocessable_error_message(&body); + assert_eq!(message, "safe semantic message"); + assert!(already_recorded); + + let (message, already_recorded) = unprocessable_error_message(b"raw validator rejection"); + assert_eq!(message, "raw validator rejection"); + assert!(!already_recorded); + } + #[test] fn test_check_ready_rejects_draining_service() { let service = service_v2::HttpService::builder().build().unwrap(); @@ -6039,6 +6323,46 @@ mod tests { } } + #[test] + fn unclassified_backend_error_hides_unmarked_message() { + let backend_payload = std::io::Error::other("backend payload"); + let response = backend_error_response( + BackendErrorInfo { + message: "unsupported image format".to_string(), + status: StatusCode::UNSUPPORTED_MEDIA_TYPE, + semantic: Some(dynamo_runtime::error::DynamoError::from( + &backend_payload as &(dyn std::error::Error + 'static), + )), + sanitized: None, + }, + true, + ); + + assert_eq!(response.0, StatusCode::UNSUPPORTED_MEDIA_TYPE); + assert_eq!(response.1.message, "Unsupported Media Type"); + assert!(!response.1.message.contains("unsupported image format")); + } + + #[test] + fn classified_internal_error_ignores_backend_http_status() { + let response = backend_error_response( + BackendErrorInfo { + message: "backend unavailable".to_string(), + status: StatusCode::SERVICE_UNAVAILABLE, + semantic: Some( + dynamo_runtime::error::DynamoError::builder() + .class(dynamo_runtime::error::ErrorClass::Internal) + .build(), + ), + sanitized: None, + }, + true, + ); + + assert_eq!(response.0, StatusCode::INTERNAL_SERVER_ERROR); + assert_eq!(response.1.message, "Internal server error"); + } + #[test] fn test_from_http_error_sanitizes_499_message() { // Backend may construct HttpError { code: 499, message: "..." }; that @@ -6047,7 +6371,7 @@ mod tests { code: 499, message: "session abc-123 cancelled at /srv/queue.py:42".to_string(), }; - let response = ErrorMessage::from_http_error(err); + let response = ErrorMessage::from_http_error(ErrorClass::Internal, err); assert_eq!(response.0.as_u16(), 499); assert_eq!(response.1.code, 499); assert_eq!(response.1.message, "Request cancelled"); @@ -6063,7 +6387,7 @@ mod tests { code: 529, message: "site overloaded at /srv/pool.py:12".to_string(), }; - let response = ErrorMessage::from_http_error(err); + let response = ErrorMessage::from_http_error(ErrorClass::Internal, err); assert_eq!(response.0.as_u16(), 529); assert_eq!(response.1.code, 529); assert_eq!(response.1.error_type, "Overloaded"); @@ -6081,10 +6405,13 @@ mod tests { fn test_from_http_error_529_classifies_as_overload_for_metrics() { // Observability half of the same bug: the metric recorded Internal // while the status was squashed, hiding load shedding. - let response = ErrorMessage::from_http_error(HttpError { - code: 529, - message: "site overloaded".to_string(), - }); + let response = ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: 529, + message: "site overloaded".to_string(), + }, + ); assert_eq!( extract_error_type_from_response(&response), ErrorType::Overload @@ -6098,7 +6425,7 @@ mod tests { code: 1000, message: "bogus status from /srv/backend.py:7".to_string(), }; - let response = ErrorMessage::from_http_error(err); + let response = ErrorMessage::from_http_error(ErrorClass::Internal, err); assert_eq!(response.0, StatusCode::INTERNAL_SERVER_ERROR); assert_eq!(response.1.code, 500); assert_eq!(response.1.message, "Internal server error"); @@ -6116,10 +6443,13 @@ mod tests { // `details`. 507 is a WebDAV code no Dynamo component emits; 501 is // what the previous blanket pass-through forwarded verbatim. for code in [501u16, 502, 504, 507] { - let response = ErrorMessage::from_http_error(HttpError { - code, - message: format!("engine failure {code} at /srv/pool.py:12"), - }); + let response = ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code, + message: format!("engine failure {code} at /srv/pool.py:12"), + }, + ); assert_eq!( response.0, StatusCode::INTERNAL_SERVER_ERROR, @@ -6149,10 +6479,13 @@ mod tests { fn test_from_http_error_preserves_retryable_5xx_without_tunnel() { // These two survive on the status line, so nothing lands in `details`. for status in [StatusCode::SERVICE_UNAVAILABLE, overload_status_code()] { - let response = ErrorMessage::from_http_error(HttpError { - code: status.as_u16(), - message: "shedding load at /srv/pool.py:12".to_string(), - }); + let response = ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: status.as_u16(), + message: "shedding load at /srv/pool.py:12".to_string(), + }, + ); assert_eq!(response.0, status); assert_eq!(response.1.code, status.as_u16()); assert_eq!(response.1.message, "Internal server error"); @@ -6168,10 +6501,13 @@ mod tests { fn test_from_http_error_forwards_4xx_verbatim() { // The 5xx allowlist leaves 4xx alone: the backend's own description is // what the caller needs (e.g. the in-tree 415 from image loading). - let response = ErrorMessage::from_http_error(HttpError { - code: 415, - message: "Unsupported Media Type: image/tiff".to_string(), - }); + let response = ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: 415, + message: "Unsupported Media Type: image/tiff".to_string(), + }, + ); assert_eq!(response.0, StatusCode::UNSUPPORTED_MEDIA_TYPE); assert_eq!(response.1.code, 415); assert_eq!(response.1.message, "Unsupported Media Type: image/tiff"); @@ -6295,11 +6631,15 @@ mod tests { // coerce-to-500 path, dropping the configured status. The carried // category avoids both, so the worker path renders exactly like the // admission path at every configured value. - let response = backend_error_response(BackendErrorInfo { - message: "Worker local total request limit reached (32/32)".to_string(), - status: StatusCode::TOO_MANY_REQUESTS, - sanitized: Some(SanitizedError::Overloaded), - }); + let response = backend_error_response( + BackendErrorInfo { + message: "Worker local total request limit reached (32/32)".to_string(), + status: StatusCode::TOO_MANY_REQUESTS, + semantic: None, + sanitized: Some(SanitizedError::Overloaded), + }, + true, + ); assert_eq!(response.0, overload_status_code()); assert_eq!(response.1.code, overload_status_code().as_u16()); @@ -6308,13 +6648,54 @@ mod tests { } #[test] - fn python_worker_503_reaches_the_frontend_as_backend_unknown() { + fn canonical_backend_cancellation_is_not_coerced_to_internal() { + let cancelled = dynamo_runtime::error::DynamoError::builder() + .class(dynamo_runtime::error::ErrorClass::Cancelled) + .reason(dynamo_runtime::error::ErrorReason::new("request.cancelled").unwrap()) + .build(); + let response = backend_error_response( + BackendErrorInfo { + message: "backend stopped".to_string(), + status: StatusCode::INTERNAL_SERVER_ERROR, + semantic: Some(cancelled), + sanitized: None, + }, + true, + ); + + assert_eq!(response.0.as_u16(), 499); + assert_eq!(response.1.message, "Request cancelled"); + } + + #[test] + fn legacy_backend_cancellation_is_not_coerced_to_internal() { + use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; + + let cancelled = DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::Cancelled)) + .build(); + let response = backend_error_response( + BackendErrorInfo { + message: "backend stopped".to_string(), + status: StatusCode::INTERNAL_SERVER_ERROR, + semantic: Some(cancelled), + sanitized: None, + }, + true, + ); + + assert_eq!(response.0.as_u16(), 499); + assert_eq!(response.1.message, "Request cancelled"); + } + + #[test] + fn legacy_python_worker_503_envelope_is_supported() { use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; - // Exactly what map_python_exception (bindings/python/rust/engine.rs) and - // py_err_to_dynamo (backend.rs) build for a Python exception carrying - // `.code = 503`: 503 is outside 400..500, so the type is Backend(Unknown) - // and the message is the JSON envelope. No cause is attached. + // Older Python workers encoded HTTP-like exceptions as Backend(Unknown) + // with a JSON envelope. Keep this bounded compatibility path during + // rolling upgrades; current producers carry ErrorClass::Unavailable + // directly. let event: Annotated = Annotated { data: None, id: None, @@ -6330,8 +6711,8 @@ mod tests { ), }; - // request_was_rejected keys on ErrorType::ResourceExhausted, which this - // shape never carries, so the overload override does not engage. + // The legacy shape has no capacity signal, so the overload override does + // not engage. assert!(!super::super::metrics::request_was_rejected( event.error.as_ref().expect("error is set") )); @@ -6339,6 +6720,46 @@ mod tests { let backend_error = extract_backend_error_if_present(&event).expect("error event should be extracted"); assert_eq!(backend_error.status, StatusCode::SERVICE_UNAVAILABLE); + + let response = backend_error_response(backend_error, false); + assert_eq!(response.0, StatusCode::SERVICE_UNAVAILABLE); + assert_eq!(response.1.message, "Internal server error"); + } + + #[test] + fn legacy_python_worker_client_status_envelopes_are_supported() { + use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; + + for (code, expected_status, expected_message) in [ + ( + 415, + StatusCode::UNSUPPORTED_MEDIA_TYPE, + "Unsupported Media Type", + ), + (429, StatusCode::TOO_MANY_REQUESTS, "Too Many Requests"), + ] { + let event: Annotated = Annotated { + data: None, + id: None, + event: Some("error".to_string()), + comment: None, + error: Some( + DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::InvalidArgument)) + .message(format!( + r#"{{"message":"private backend detail","code":{code}}}"# + )) + .build(), + ), + }; + + let backend_error = + extract_backend_error_if_present(&event).expect("error event should be extracted"); + let response = backend_error_response(backend_error, false); + assert_eq!(response.0, expected_status); + assert_eq!(response.1.message, expected_message); + assert!(!response.1.message.contains("private backend detail")); + } } #[test] @@ -6430,11 +6851,60 @@ mod tests { assert_eq!(response.0, StatusCode::BAD_REQUEST); assert_eq!(response.1.code, StatusCode::BAD_REQUEST.as_u16()); - assert!(response.1.message.contains("Request payload is too large")); + assert_eq!(response.1.message, "Invalid request"); assert!(!response.1.message.contains("NATS")); assert!(!response.1.message.contains("payload_bytes")); } + #[test] + fn frontend_invalid_argument_exposes_client_safe_details() { + const DIAGNOSTIC: &str = "request.messages must not be empty"; + let response = + ErrorMessage::from_anyhow(invalid_argument(DIAGNOSTIC).into(), BACKUP_ERROR_MESSAGE); + + assert_eq!(response.0, StatusCode::BAD_REQUEST); + assert_eq!(response.1.message, DIAGNOSTIC); + assert!(response.1.details.is_none()); + let body = serde_json::to_string(&response.1.0).expect("error response serializes"); + assert!(body.contains(DIAGNOSTIC)); + } + + #[test] + fn frontend_public_message_hides_private_diagnostic() { + let error = dynamo_runtime::error::DynamoError::builder() + .error_type(ErrorClass::InvalidRequest) + .diagnostic("PRIVATE_DIAGNOSTIC_SENTINEL=/srv/frontend.rs:42") + .public_message("request.messages must not be empty") + .build(); + let response = ErrorMessage::from_anyhow(error.into(), BACKUP_ERROR_MESSAGE); + + assert_eq!(response.0, StatusCode::BAD_REQUEST); + assert_eq!(response.1.message, "request.messages must not be empty"); + let body = serde_json::to_string(&response.1.0).expect("error response serializes"); + assert!(!body.contains("PRIVATE_DIAGNOSTIC_SENTINEL")); + assert!(!body.contains("/srv/frontend.rs")); + } + + #[test] + fn backend_http_status_derives_the_recorded_semantic_class() { + assert_eq!( + backend_http_error_class(StatusCode::BAD_REQUEST), + ErrorClass::InvalidRequest + ); + assert_eq!( + backend_http_error_class(StatusCode::TOO_MANY_REQUESTS), + ErrorClass::RateLimited + ); + assert_eq!( + backend_http_error_class(overload_status_code()), + ErrorClass::CapacityExhausted + ); + assert_eq!( + backend_http_error_class(StatusCode::SERVICE_UNAVAILABLE), + ErrorClass::Unavailable + ); + } + #[test] fn test_backend_invalid_argument_surfaces_as_400() { // `Backend(InvalidArgument)` is what `py_err_to_dynamo` produces @@ -6452,7 +6922,87 @@ mod tests { assert_eq!(response.0, StatusCode::BAD_REQUEST); assert_eq!(response.1.code, StatusCode::BAD_REQUEST.as_u16()); - assert!(response.1.message.contains("does not currently support")); + assert_eq!(response.1.message, "Invalid request"); + } + #[test] + #[serial_test::serial(failure_metrics)] + fn canonical_errors_use_shared_status_and_hide_diagnostics() { + use dynamo_runtime::error::{DynamoError, ErrorClass}; + + let cases = [ + ( + ErrorClass::InvalidRequest, + StatusCode::BAD_REQUEST, + "Invalid request", + ErrorType::Validation, + ), + ( + ErrorClass::PermissionDenied, + StatusCode::FORBIDDEN, + "Permission denied", + ErrorType::Validation, + ), + ( + ErrorClass::RateLimited, + StatusCode::TOO_MANY_REQUESTS, + "Rate limit exceeded", + ErrorType::Overload, + ), + ( + ErrorClass::CapacityExhausted, + overload_status_code(), + "Service temporarily overloaded", + ErrorType::Overload, + ), + ( + ErrorClass::BackendProtocol, + StatusCode::BAD_GATEWAY, + "Bad gateway", + ErrorType::Internal, + ), + ( + ErrorClass::DeadlineExceeded, + StatusCode::GATEWAY_TIMEOUT, + "Request deadline exceeded", + ErrorType::Internal, + ), + ( + ErrorClass::Internal, + StatusCode::INTERNAL_SERVER_ERROR, + "Internal server error", + ErrorType::Internal, + ), + ]; + + for (class, expected_status, expected_message, expected_metric) in cases { + let err: anyhow::Error = DynamoError::builder() + .class(class) + .diagnostic("PRIVATE_DIAGNOSTIC_SENTINEL") + .build() + .into(); + + let response = ErrorMessage::from_anyhow(err, BACKUP_ERROR_MESSAGE); + + assert_eq!(response.0, expected_status, "{class}"); + assert_eq!(response.1.code, expected_status.as_u16(), "{class}"); + assert_eq!(response.1.message, expected_message, "{class}"); + assert_eq!( + response.1.error_type, + if class == ErrorClass::CapacityExhausted { + "Overloaded" + } else { + expected_status.canonical_reason().unwrap() + }, + "{class}" + ); + assert_eq!( + response.1.metric_error_type, + Some(expected_metric), + "{class}" + ); + let body = serde_json::to_string(&response.1.0).unwrap(); + assert!(!body.contains("PRIVATE_DIAGNOSTIC_SENTINEL")); + } } /// A worker that refuses a request before the response stream opens must @@ -6476,22 +7026,14 @@ mod tests { assert_eq!(response.0, StatusCode::BAD_REQUEST); assert_eq!(response.1.code, StatusCode::BAD_REQUEST.as_u16()); - assert!( - response - .1 - .message - .contains("multimodal input is not supported"), - "the client should see the worker's reason, got: {}", - response.1.message - ); + assert_eq!(response.1.message, "Invalid request"); } - /// `py_err_to_dynamo` wraps an HTTP-like Python exception's text in a - /// `{"message":..,"code":..}` envelope, so a refusal from a Python worker - /// carries JSON, not prose. The client must be shown the reason, never the - /// envelope -- the in-stream path already unwraps it, and the two must agree. + /// Legacy Python workers may place a JSON-looking HTTP envelope in diagnostic text. + /// The semantic class remains authoritative: the renderer does not parse that text + /// for either the client message or status. #[test] - fn test_pre_stream_refusal_unwraps_the_python_error_envelope() { + fn test_pre_stream_refusal_does_not_parse_python_error_envelope() { use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; use dynamo_runtime::pipeline::network::StreamPrologueError; use dynamo_runtime::pipeline::network::egress::addressed_router::testing::pre_stream_failure_error; @@ -6515,26 +7057,24 @@ mod tests { .to_string(), ); assert_eq!(response.0, StatusCode::BAD_REQUEST); - assert_eq!(response.1.message, "multimodal input is not supported"); + assert_eq!(response.1.message, "Invalid request"); - // An explicit client-error status inside the envelope is honoured. + // A client-error code in diagnostic text is ignored. let response = refuse( &serde_json::json!({"message": "unsupported media type", "code": 415}).to_string(), ); - assert_eq!(response.0, StatusCode::UNSUPPORTED_MEDIA_TYPE); - assert_eq!(response.1.message, "unsupported media type"); + assert_eq!(response.0, StatusCode::BAD_REQUEST); + assert_eq!(response.1.message, "Invalid request"); - // A 5xx inside the envelope does not escape through the 4xx arm. + // A server-error code in diagnostic text is ignored too. let response = refuse(&serde_json::json!({"message": "boom", "code": 500}).to_string()); assert_eq!(response.0, StatusCode::BAD_REQUEST); } - /// A worker can report a cancellation as an HTTP-like 499, and its own text - /// may name a context id or an internal path. The status survives, the text - /// does not: this arm owes the client the same sanitized body every other - /// HTTP path produces for a cancellation. + /// A cancellation-looking code in diagnostic text cannot override an InvalidRequest + /// class or expose the diagnostic payload. #[test] - fn test_pre_stream_refusal_sanitizes_the_envelope_cancellation() { + fn test_pre_stream_refusal_ignores_envelope_cancellation_status() { use dynamo_runtime::error::{BackendError, DynamoError, ErrorType as DynErrorType}; use dynamo_runtime::pipeline::network::StreamPrologueError; use dynamo_runtime::pipeline::network::egress::addressed_router::testing::pre_stream_failure_error; @@ -6557,8 +7097,8 @@ mod tests { BACKUP_ERROR_MESSAGE, ); - assert_eq!(response.0, StatusCode::from_u16(499).unwrap()); - assert_eq!(response.1.message, SanitizedError::Cancelled.to_string()); + assert_eq!(response.0, StatusCode::BAD_REQUEST); + assert_eq!(response.1.message, "Invalid request"); assert!( !response.1.message.contains("abc-123") && !response.1.message.contains("/opt/dynamo"), "the worker's own cancellation text must not reach the client, got: {}", @@ -6566,16 +7106,14 @@ mod tests { ); assert_eq!( extract_error_type_from_response(&response), - ErrorType::Cancelled + ErrorType::Validation ); } - /// A status the envelope preserved is what the metric is counted from. A - /// backend rate limit is an overload, not a validation failure; a plain 400 - /// keeps the validation override, because a worker's refusal text carries no - /// `Validation:` prefix and would otherwise be counted as internal. + /// Failure metrics follow the semantic class, not a status-like value embedded in + /// diagnostic text. #[test] - fn test_pre_stream_refusal_classifies_metrics_from_the_preserved_status() { + fn test_pre_stream_refusal_classifies_metrics_from_the_semantic_class() { use dynamo_runtime::error::{BackendError, DynamoError, ErrorType as DynErrorType}; use dynamo_runtime::pipeline::network::StreamPrologueError; use dynamo_runtime::pipeline::network::egress::addressed_router::testing::pre_stream_failure_error; @@ -6596,10 +7134,10 @@ mod tests { let rate_limited = refuse(serde_json::json!({"message": "too many requests", "code": 429}).to_string()); - assert_eq!(rate_limited.0, StatusCode::TOO_MANY_REQUESTS); + assert_eq!(rate_limited.0, StatusCode::BAD_REQUEST); assert_eq!( extract_error_type_from_response(&rate_limited), - ErrorType::Overload + ErrorType::Validation ); let refused = refuse("multimodal input is not supported by this backend".to_string()); @@ -6610,11 +7148,10 @@ mod tests { ); } - /// Negative control for `test_pre_stream_refusal_surfaces_as_400`: a genuine - /// pre-stream connect failure must still be 500. Only a request-level - /// refusal earns a 4xx. + /// A transport wrapper and its typed backend cause both use semantic classes. + /// EngineShutdown and the untyped CannotConnect wrapper normalize to Unavailable. #[test] - fn test_pre_stream_connect_failure_still_surfaces_as_500() { + fn test_pre_stream_connect_failure_uses_semantic_class() { use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; use dynamo_runtime::pipeline::network::StreamPrologueError; use dynamo_runtime::pipeline::network::egress::addressed_router::testing::pre_stream_failure_error; @@ -6631,15 +7168,15 @@ mod tests { pre_stream_failure_error(engine_shutdown).into(), BACKUP_ERROR_MESSAGE, ); - assert_eq!(response.0, StatusCode::INTERNAL_SERVER_ERROR); + assert_eq!(response.0, StatusCode::SERVICE_UNAVAILABLE); - // An older worker sends no typed error at all: also still 500. + // An older worker has no typed cause, so the CannotConnect wrapper is authoritative. let untyped = StreamPrologueError::from_message("Generate Error: could not reach worker"); let response = ErrorMessage::from_anyhow( pre_stream_failure_error(untyped).into(), BACKUP_ERROR_MESSAGE, ); - assert_eq!(response.0, StatusCode::INTERNAL_SERVER_ERROR); + assert_eq!(response.0, StatusCode::SERVICE_UNAVAILABLE); } #[test] @@ -6669,8 +7206,7 @@ mod tests { #[test] fn test_cancelled_error_metrics_classification() { // HTTP 499 should be classified as Cancelled for metrics - let error_type = - classify_error_for_metrics(StatusCode::from_u16(499).unwrap(), "cancelled request"); + let error_type = classify_error_for_metrics(StatusCode::from_u16(499).unwrap()); assert_eq!( error_type, ErrorType::Cancelled, @@ -7444,6 +7980,67 @@ mod tests { } } + #[tokio::test] + async fn non_streaming_aggregation_late_unavailable_surfaces_as_503() { + use dynamo_protocols::types::CreateChatCompletionStreamResponse; + use dynamo_runtime::error::DynamoError; + use futures::stream; + + let normal_event = Annotated { + data: Some(NvCreateChatCompletionStreamResponse { + inner: CreateChatCompletionStreamResponse { + id: "test-id".to_string(), + choices: vec![], + created: 0, + model: "test-model".to_string(), + system_fingerprint: None, + object: "chat.completion.chunk".to_string(), + service_tier: None, + usage: None, + }, + nvext: None, + llm_metrics: None, + }), + id: Some("msg-1".to_string()), + event: None, + comment: None, + error: None, + }; + let error_event = Annotated:: { + data: None, + id: None, + event: Some("error".to_string()), + comment: None, + error: Some( + DynamoError::builder() + .class(ErrorClass::Unavailable) + .diagnostic("worker unavailable at /srv/private/backend.rs") + .build(), + ), + }; + + let checked = check_for_backend_error( + stream::iter(vec![normal_event, error_event]), + BackendErrorCheck::UntilFirstEvent, + ) + .await + .expect("the first normal item must pass preflight"); + let error = NvCreateChatCompletionResponse::from_annotated_stream( + checked, + ParsingOptions::default(), + ) + .await + .expect_err("the late typed error must fail aggregation"); + let response = non_streaming_aggregation_error_response( + error, + "Failed to parse chat completion response", + ); + + assert_eq!(response.0, StatusCode::SERVICE_UNAVAILABLE); + assert_eq!(response.1.code, StatusCode::SERVICE_UNAVAILABLE.as_u16()); + assert!(!response.1.message.contains("/srv/private")); + } + #[tokio::test] async fn test_check_for_backend_error_with_error_event() { use crate::types::openai::chat_completions::NvCreateChatCompletionStreamResponse; @@ -7528,7 +8125,69 @@ mod tests { assert_eq!(error_response.0, StatusCode::BAD_REQUEST); assert_eq!(error_response.1.code, StatusCode::BAD_REQUEST.as_u16()); assert_eq!(error_response.1.error_type, "Bad Request"); - assert_eq!(error_response.1.message, "unsupported JSON schema keyword"); + assert_eq!(error_response.1.message, "Invalid request"); + } + } + + #[tokio::test] + async fn wire_roundtripped_transport_subtypes_keep_semantic_status() { + use crate::types::openai::chat_completions::NvCreateChatCompletionStreamResponse; + use dynamo_runtime::error::{BackendError, DynamoError, ErrorClass, ErrorType}; + use futures::stream; + + for (error_type, expected_class, expected_status) in [ + ( + ErrorType::Backend(BackendError::Disconnected), + ErrorClass::Unavailable, + StatusCode::SERVICE_UNAVAILABLE, + ), + ( + ErrorType::Backend(BackendError::ResponseTimeout), + ErrorClass::DeadlineExceeded, + StatusCode::GATEWAY_TIMEOUT, + ), + ] { + let wire = serde_json::to_value( + DynamoError::builder() + .error_type(error_type) + .diagnostic("PRIVATE_BACKEND_DIAGNOSTIC") + .build(), + ) + .unwrap(); + let error: DynamoError = serde_json::from_value(wire).unwrap(); + assert_eq!(error.error_type(), error_type); + assert_eq!(error.class(), expected_class); + + let unary_response = + ErrorMessage::from_anyhow(error.clone().into(), "backend request failed"); + assert_eq!(unary_response.0, expected_status); + assert!( + !unary_response + .1 + .message + .contains("PRIVATE_BACKEND_DIAGNOSTIC") + ); + + let event = Annotated:: { + data: None, + id: None, + event: Some("error".to_string()), + comment: None, + error: Some(error), + }; + let response = match check_for_backend_error( + stream::iter([event]), + BackendErrorCheck::UntilFirstEvent, + ) + .await + { + Err(response) => response, + Ok(_) => panic!("typed backend failure must fail preflight"), + }; + + assert_eq!(response.0, expected_status); + assert_eq!(response.1.code, expected_status.as_u16()); + assert!(!response.1.message.contains("PRIVATE_BACKEND_DIAGNOSTIC")); } } @@ -7563,12 +8222,7 @@ mod tests { assert_eq!(error_response.0, StatusCode::BAD_REQUEST); assert_eq!(error_response.1.code, StatusCode::BAD_REQUEST.as_u16()); assert_eq!(error_response.1.error_type, "Bad Request"); - assert!( - error_response - .1 - .message - .contains("does not currently support logprobs >= 1") - ); + assert_eq!(error_response.1.message, "Invalid request"); } #[tokio::test] @@ -7605,14 +8259,15 @@ mod tests { ) .await; - let error_response = match result { + let backend_error = match result { Ok(_) => panic!("an error in any batch prompt must fail the request"), - Err(error_response) => error_response, + Err(backend_error) => backend_error, }; + let error_response = backend_error_response(backend_error, false); assert_eq!(error_response.0, StatusCode::BAD_REQUEST); assert_eq!(error_response.1.code, StatusCode::BAD_REQUEST.as_u16()); assert_eq!(error_response.1.error_type, "Bad Request"); - assert_eq!(error_response.1.message, "invalid second prompt"); + assert_eq!(error_response.1.message, "Invalid request"); } #[tokio::test] @@ -7785,10 +8440,7 @@ mod tests { assert_eq!(response.0, overload); assert_eq!(response.1.code, overload.as_u16()); assert_eq!(response.1.error_type, "Overloaded"); - assert_eq!( - classify_error_for_metrics(overload, &response.1.message), - ErrorType::Overload - ); + assert_eq!(classify_error_for_metrics(overload), ErrorType::Overload); assert!(!response.1.message.contains("/srv/pool.py")); } @@ -7807,10 +8459,7 @@ mod tests { fn test_overload_classification_follows_configured_code() { let overload = overload_status_code(); assert_eq!(map_error_code_to_error_type(overload), "Overloaded"); - assert_eq!( - classify_error_for_metrics(overload, "Internal server error"), - ErrorType::Overload - ); + assert_eq!(classify_error_for_metrics(overload), ErrorType::Overload); } #[tokio::test] @@ -7877,7 +8526,8 @@ mod tests { if let Err(error_response) = result { assert_eq!(error_response.0, StatusCode::BAD_REQUEST); assert_eq!(error_response.1.code, 400); - assert_eq!(error_response.1.message, "bad input from client"); + assert_eq!(error_response.1.message, "Bad Request"); + assert!(!error_response.1.message.contains("bad input from client")); } } @@ -8067,41 +8717,37 @@ mod tests { } #[test] - fn test_classify_error_for_metrics_validation() { - // 400 with "Validation:" prefix to validation - let error_type = - classify_error_for_metrics(StatusCode::BAD_REQUEST, "Validation: Invalid parameter"); - assert_eq!(error_type, ErrorType::Validation); - - // 400 WITHOUT "Validation:" to internal (fallback) - let error_type = classify_error_for_metrics(StatusCode::BAD_REQUEST, "Some other error"); - assert_eq!(error_type, ErrorType::Internal); + fn test_classify_error_for_metrics_bad_request_is_validation() { + assert_eq!( + classify_error_for_metrics(StatusCode::BAD_REQUEST), + ErrorType::Validation + ); } #[test] fn test_classify_error_for_metrics_status_codes() { assert_eq!( - classify_error_for_metrics(StatusCode::NOT_FOUND, "Model not found"), + classify_error_for_metrics(StatusCode::NOT_FOUND), ErrorType::NotFound ); assert_eq!( - classify_error_for_metrics(StatusCode::NOT_IMPLEMENTED, "Feature not supported"), + classify_error_for_metrics(StatusCode::NOT_IMPLEMENTED), ErrorType::NotImplemented ); assert_eq!( - classify_error_for_metrics(StatusCode::TOO_MANY_REQUESTS, "Rate limit exceeded"), + classify_error_for_metrics(StatusCode::TOO_MANY_REQUESTS), ErrorType::Overload ); assert_eq!( - classify_error_for_metrics(StatusCode::SERVICE_UNAVAILABLE, "Unavailable"), + classify_error_for_metrics(StatusCode::SERVICE_UNAVAILABLE), ErrorType::Unavailable ); assert_eq!( - classify_error_for_metrics(overload_status_code(), "Overloaded"), + classify_error_for_metrics(overload_status_code()), ErrorType::Overload ); assert_eq!( - classify_error_for_metrics(StatusCode::INTERNAL_SERVER_ERROR, "Panic"), + classify_error_for_metrics(StatusCode::INTERNAL_SERVER_ERROR), ErrorType::Internal ); } @@ -8110,21 +8756,24 @@ mod tests { fn test_classify_error_for_metrics_client_errors() { // Other 4xx errors should be classified as validation assert_eq!( - classify_error_for_metrics(StatusCode::UNAUTHORIZED, "Unauthorized"), + classify_error_for_metrics(StatusCode::UNAUTHORIZED), ErrorType::Validation ); assert_eq!( - classify_error_for_metrics(StatusCode::FORBIDDEN, "Forbidden"), + classify_error_for_metrics(StatusCode::FORBIDDEN), ErrorType::Validation ); } #[test] fn test_extract_error_type_from_response_validation() { - let response = ErrorMessage::from_http_error(HttpError { - code: 400, - message: "Validation: bad input".to_string(), - }); + let response = ErrorMessage::from_http_error( + ErrorClass::InvalidRequest, + HttpError { + code: 400, + message: "Validation: bad input".to_string(), + }, + ); assert_eq!( extract_error_type_from_response(&response), ErrorType::Validation @@ -8249,7 +8898,7 @@ mod tests { } #[test] - fn unsupported_content_responses_conversion_errors_are_not_implemented() { + fn unsupported_content_responses_conversion_errors_keep_legacy_metric() { let response = responses_conversion_error_response( ResponsesConversionError::UnsupportedContent("feature not available".to_string()) .into(), diff --git a/lib/llm/src/preprocessor.rs b/lib/llm/src/preprocessor.rs index 92cecbfe3143..f8d9a151be6a 100644 --- a/lib/llm/src/preprocessor.rs +++ b/lib/llm/src/preprocessor.rs @@ -32,7 +32,7 @@ use dynamo_renderer::{OAIPromptFormatter, PromptRenderError, RenderedPrompt}; use dynamo_runtime::config::{ env_is_falsey, environment_names::llm as env_llm, is_truthy, parse_bool_opt, }; -use dynamo_runtime::error::{DynamoError, ErrorType}; +use dynamo_runtime::error::{DynamoError, ErrorType, PublicDetails}; use either::Either; use futures::Stream; use futures::stream::{self, StreamExt}; @@ -127,6 +127,7 @@ fn routing_priorities(hints: Option<&AgentHints>) -> (Option, Option, (priority_jump, strict_priority, priority) } +/// Build a private validation diagnostic. Callers may attach structured `PublicDetails` only when every value is safe for clients. pub(crate) fn invalid_argument_error(message: impl Into) -> anyhow::Error { DynamoError::builder() .error_type(ErrorType::InvalidArgument) @@ -1772,6 +1773,10 @@ impl OpenAIPreprocessor { length.", combined_limit, request_description, )) + .public_details(PublicDetails::ContextLength { + limit: combined_limit as u64, + actual: Some(requested_tokens as u64), + }) .build() .into()); } @@ -4515,6 +4520,10 @@ impl OpenAIPreprocessor { Please reduce the length of the messages.", combined_limit, token_count, )) + .public_details(PublicDetails::ContextLength { + limit: combined_limit as u64, + actual: Some(token_count as u64), + }) .build() } diff --git a/lib/llm/src/preprocessor/tool_choice.rs b/lib/llm/src/preprocessor/tool_choice.rs index 10a1a8acb3a5..1511aeba93d2 100644 --- a/lib/llm/src/preprocessor/tool_choice.rs +++ b/lib/llm/src/preprocessor/tool_choice.rs @@ -14,6 +14,7 @@ use dynamo_parsers::tool_calling::{ToolChoice, ToolDefinition}; use dynamo_protocols::types::{ChatCompletionTool, ChatCompletionToolChoiceOption, ResponseFormat}; use dynamo_runtime::error::{DynamoError, ErrorType}; +/// Tool names and parser diagnostics can contain request data, so this helper does not mark its message public. fn invalid_argument(message: impl Into) -> DynamoError { DynamoError::builder() .error_type(ErrorType::InvalidArgument) diff --git a/lib/llm/src/protocols/anthropic/stream_converter.rs b/lib/llm/src/protocols/anthropic/stream_converter.rs index 133d4f1d7e06..625126190595 100644 --- a/lib/llm/src/protocols/anthropic/stream_converter.rs +++ b/lib/llm/src/protocols/anthropic/stream_converter.rs @@ -657,12 +657,22 @@ impl AnthropicStreamConverter { /// Append error events when the stream ends due to a backend error. pub fn append_error_events(&mut self, events: &mut Vec>) { - let error_event = AnthropicStreamEvent::Error { - error: AnthropicErrorBody { + self.append_error_events_with_body( + events, + AnthropicErrorBody { error_type: "api_error".to_string(), message: "An internal error occurred during generation.".to_string(), }, - }; + ); + } + + /// Append a terminal error event whose body was selected by the HTTP protocol boundary. + pub fn append_error_events_with_body( + &mut self, + events: &mut Vec>, + error: AnthropicErrorBody, + ) { + let error_event = AnthropicStreamEvent::Error { error }; events.push(make_sse_event("error", &error_event)); } } diff --git a/lib/llm/src/protocols/common.rs b/lib/llm/src/protocols/common.rs index faa474ae2a67..c36d6bef9045 100644 --- a/lib/llm/src/protocols/common.rs +++ b/lib/llm/src/protocols/common.rs @@ -25,9 +25,11 @@ use dynamo_protocols::types::StopReason; const MAX_GRAMMAR_NESTING_DEPTH: usize = 500; pub(crate) fn invalid_argument_error(message: impl Into) -> anyhow::Error { + let message = message.into(); DynamoError::builder() .error_type(ErrorType::InvalidArgument) - .message(message.into()) + .message(message.clone()) + .public_message(message) .build() .into() } diff --git a/lib/llm/src/session_affinity/coordinator.rs b/lib/llm/src/session_affinity/coordinator.rs index bd485cfb870a..d003b61fece6 100644 --- a/lib/llm/src/session_affinity/coordinator.rs +++ b/lib/llm/src/session_affinity/coordinator.rs @@ -359,6 +359,7 @@ fn affinity_error(error: AffinityError) -> Error { } } +/// Session and worker identifiers are private diagnostics and must not be copied into client responses. pub(crate) fn invalid_argument(message: impl Into) -> Error { DynamoError::builder() .error_type(ErrorType::InvalidArgument) diff --git a/lib/llm/tests/chat_template_render_errors.rs b/lib/llm/tests/chat_template_render_errors.rs index 483f0d12a1a2..b2eb13c2eaa3 100644 --- a/lib/llm/tests/chat_template_render_errors.rs +++ b/lib/llm/tests/chat_template_render_errors.rs @@ -281,10 +281,11 @@ async fn template_render_failure_returns_400_json_not_sse() { let body: serde_json::Value = response.json().await.expect("error body was not JSON"); assert_eq!(body["code"], 400, "stream={stream}"); + assert_eq!(body["message"], "Invalid request", "stream={stream}"); assert!( - body["message"] - .as_str() - .is_some_and(|message| message.contains("No user query found in messages.")), + !body + .to_string() + .contains("No user query found in messages."), "stream={stream}, body={body}" ); } diff --git a/lib/llm/tests/frontend_protocol_validation_http.rs b/lib/llm/tests/frontend_protocol_validation_http.rs index e5ceb099899f..920a3df072f0 100644 --- a/lib/llm/tests/frontend_protocol_validation_http.rs +++ b/lib/llm/tests/frontend_protocol_validation_http.rs @@ -437,7 +437,7 @@ async fn anthropic_backend_error_events_record_status_classification() { let svc = HarnessService::start_with_engine(engine).await; for (status, error_type, message) in [ - (cancelled_status, "request_cancelled", "Request cancelled"), + (cancelled_status, "api_error", "Request cancelled"), ( reqwest::StatusCode::SERVICE_UNAVAILABLE, "overloaded_error", @@ -532,13 +532,13 @@ async fn anthropic_handler_errors_record_classification_with_response() { ), ( reqwest::StatusCode::from_u16(499).unwrap(), - "request_cancelled", + "api_error", "Request cancelled", ), ( reqwest::StatusCode::BAD_REQUEST, "invalid_request_error", - "bad backend input", + "Invalid request", ), ( reqwest::StatusCode::INTERNAL_SERVER_ERROR, diff --git a/lib/llm/tests/http-service.rs b/lib/llm/tests/http-service.rs index 82343f8c70f3..fb96963d3874 100644 --- a/lib/llm/tests/http-service.rs +++ b/lib/llm/tests/http-service.rs @@ -476,6 +476,7 @@ fn invalid_argument_error_frame() -> Annotated { DynamoError::builder() .error_type(DynErrorType::Backend(BackendError::InvalidArgument)) .message(INVALID_ARGUMENT_MESSAGE) + .public_message(INVALID_ARGUMENT_MESSAGE) .build(), ), } @@ -542,6 +543,7 @@ impl Err(DynamoError::builder() .error_type(DynamoErrorType::InvalidArgument) .message("request exceeds strict token budget") + .public_message("request exceeds strict token budget") .build() .into()) } @@ -2870,6 +2872,7 @@ impl "ValidationError: 1 validation error for NvCreateAudioSpeechRequest \ task_type Input should be 'CustomVoice', 'VoiceDesign', 'Base'", ) + .public_message("Invalid task_type") .build(), ), }; diff --git a/lib/llm/tests/preprocessor.rs b/lib/llm/tests/preprocessor.rs index eced81600080..147ac78236d8 100644 --- a/lib/llm/tests/preprocessor.rs +++ b/lib/llm/tests/preprocessor.rs @@ -1023,6 +1023,13 @@ mod context_length_validation { "error message should tell user what to do, got: {}", dynamo_err.message() ); + let Some(dynamo_runtime::error::PublicDetails::ContextLength { limit, actual }) = + dynamo_err.public_details() + else { + panic!("context overflow should expose structured length details"); + }; + assert_eq!(*limit, 5); + assert!(actual.is_some_and(|actual| actual > *limit)); } #[tokio::test] diff --git a/lib/llm/tests/responses_http_replay.rs b/lib/llm/tests/responses_http_replay.rs index 9b0c9d89daee..ee3ab5fdccda 100644 --- a/lib/llm/tests/responses_http_replay.rs +++ b/lib/llm/tests/responses_http_replay.rs @@ -270,7 +270,7 @@ async fn streaming_backend_error_closes_partial_output_and_counts_failure() { ); assert_eq!( failed.data["response"]["error"]["message"], - ERROR_MESSAGE + "Invalid request" ); assert!( events @@ -283,7 +283,7 @@ async fn streaming_backend_error_closes_partial_output_and_counts_failure() { &Endpoint::Responses, &RequestType::Stream, &Status::Error, - &ErrorType::Internal, + &ErrorType::Validation, ), 1 ); diff --git a/lib/runtime/src/error.rs b/lib/runtime/src/error.rs index 87cbccd3595f..11fc0ee4d362 100644 --- a/lib/runtime/src/error.rs +++ b/lib/runtime/src/error.rs @@ -570,6 +570,18 @@ impl PublicDetails { } } +fn bounded_message(mut message: String) -> String { + if message.len() > Diagnostic::MAX_BYTES { + let mut end = Diagnostic::MAX_BYTES - Diagnostic::TRUNCATION_SUFFIX.len(); + while !message.is_char_boundary(end) { + end -= 1; + } + message.truncate(end); + message.push_str(Diagnostic::TRUNCATION_SUFFIX); + } + message +} + /// Bounded operator-only diagnostic text. #[derive(Debug, Clone, Default)] pub struct Diagnostic { @@ -582,17 +594,8 @@ impl Diagnostic { pub const TRUNCATION_SUFFIX: &'static str = "...[truncated]"; pub fn new(value: impl Into) -> Self { - let mut message = value.into(); - if message.len() > Self::MAX_BYTES { - let mut end = Self::MAX_BYTES - Self::TRUNCATION_SUFFIX.len(); - while !message.is_char_boundary(end) { - end -= 1; - } - message.truncate(end); - message.push_str(Self::TRUNCATION_SUFFIX); - } Self { - message, + message: bounded_message(value.into()), source: None, } } @@ -1004,11 +1007,10 @@ impl DynamoErrorBuilder { self.diagnostic(message) } - /// Set a client-safe rejection message. + /// Set a bounded client-safe rejection message. pub fn public_message(mut self, message: impl Into) -> Self { - self.public = Some(PublicDetails::Message { - message: message.into(), - }); + let message = bounded_message(message.into()); + self.public = Some(PublicDetails::Message { message }); self } @@ -1354,6 +1356,21 @@ mod tests { assert!(diagnostic.as_str().ends_with(Diagnostic::TRUNCATION_SUFFIX)); } + #[test] + fn public_message_is_bounded_at_utf8_boundary() { + let truncation_index = Diagnostic::MAX_BYTES - Diagnostic::TRUNCATION_SUFFIX.len(); + let message = "x".repeat(truncation_index - 1) + "é" + &"x".repeat(Diagnostic::MAX_BYTES); + let error = DynamoError::builder() + .class(ErrorClass::InvalidRequest) + .public_message(message) + .build(); + let public_message = error.public_message().unwrap(); + + assert!(public_message.len() <= Diagnostic::MAX_BYTES); + assert!(public_message.is_char_boundary(public_message.len())); + assert!(public_message.ends_with(Diagnostic::TRUNCATION_SUFFIX)); + } + #[test] fn legacy_builder_derives_semantic_defaults() { let legacy_type: ErrorType = ErrorType::InvalidArgument; diff --git a/lib/runtime/src/metrics/prometheus_names.rs b/lib/runtime/src/metrics/prometheus_names.rs index f06f43e36dc9..41d125f1c5eb 100644 --- a/lib/runtime/src/metrics/prometheus_names.rs +++ b/lib/runtime/src/metrics/prometheus_names.rs @@ -176,6 +176,9 @@ pub mod frontend_service { /// Total number of LLM requests accepted by the frontend handler pub const REQUESTS_STARTED_TOTAL: &str = "requests_started_total"; + /// Total number of terminal semantic request failures. + pub const FAILURES_TOTAL: &str = "failures_total"; + /// Number of requests waiting in HTTP queue before receiving the first response (gauge) pub const QUEUED_REQUESTS: &str = "queued_requests"; diff --git a/tests/frontend/http_status_propagation_worker.py b/tests/frontend/http_status_propagation_worker.py index cdc767c74f52..c035d35b9c65 100644 --- a/tests/frontend/http_status_propagation_worker.py +++ b/tests/frontend/http_status_propagation_worker.py @@ -26,8 +26,8 @@ from dynamo.llm import ModelInput, ModelType, WorkerType, register_model from dynamo.runtime import DistributedRuntime from tests.frontend.test_http_status_propagation import ( + BACKEND_MESSAGE, ENDPOINT_PATH, - EXPECTED_MESSAGE, EXPECTED_STATUS, MODEL_NAME, PASSTHROUGH_ENDPOINT_PATH, @@ -47,7 +47,7 @@ def __init__(self, status: int, message: str): async def generate(request, context): - raise _StatusLikeError(status=EXPECTED_STATUS, message=EXPECTED_MESSAGE) + raise _StatusLikeError(status=EXPECTED_STATUS, message=BACKEND_MESSAGE) yield # unreachable; needed to make this an async generator @@ -60,7 +60,7 @@ async def generate_passthrough(request, context): # URL must raise before this generator can produce or delegate work. await ImageLoader().load_image_batch(image_items) raise AssertionError("blocked media URL unexpectedly passed validation") - raise _StatusLikeError(status=EXPECTED_STATUS, message=EXPECTED_MESSAGE) + raise _StatusLikeError(status=EXPECTED_STATUS, message=BACKEND_MESSAGE) yield # unreachable; needed to make this an async generator diff --git a/tests/frontend/test_http_status_propagation.py b/tests/frontend/test_http_status_propagation.py index 50fe7598be62..97de12c8061b 100644 --- a/tests/frontend/test_http_status_propagation.py +++ b/tests/frontend/test_http_status_propagation.py @@ -25,7 +25,8 @@ PASSTHROUGH_MODEL_NAME = "test-http-status-prop-passthrough" PASSTHROUGH_ENDPOINT_PATH = "test.http_status_prop.generate_passthrough" EXPECTED_STATUS = 415 -EXPECTED_MESSAGE = "unsupported-media-via-wire" +BACKEND_MESSAGE = "unsupported-media-via-wire" +EXPECTED_MESSAGE = "Unsupported Media Type" pytestmark = [ pytest.mark.pre_merge, @@ -99,7 +100,12 @@ def test_http_status_propagates_through_wire(services: int) -> None: timeout=30, ) assert response.status_code == EXPECTED_STATUS, response.text - assert EXPECTED_MESSAGE in response.text + assert response.json() == { + "message": EXPECTED_MESSAGE, + "type": EXPECTED_MESSAGE, + "code": EXPECTED_STATUS, + } + assert BACKEND_MESSAGE not in response.text @pytest.mark.timeout(120) @@ -133,7 +139,8 @@ def test_python_backend_ssrf_rejection_is_4xx_with_zero_egress( ) assert 400 <= response.status_code < 500, response.text - assert "is in a blocked range" in response.text, response.text + assert response.json()["message"] == "Invalid request", response.text + assert "is in a blocked range" not in response.text, response.text outbound_canary.assert_no_connection() From cdadeb6bb309e363eee153b98805201f81233449 Mon Sep 17 00:00:00 2001 From: Elizabeth Thomas Date: Thu, 17 Sep 2026 17:18:09 -0500 Subject: [PATCH 085/191] docs: correct fault-tolerance architecture details (#14880) Signed-off-by: Elizabeth Thomas --- .../fault-tolerance/request-cancellation-architecture.md | 2 +- .../concepts/fault-tolerance/request-migration-architecture.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-cancellation-architecture.md b/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-cancellation-architecture.md index 761079d00c0b..e30423826d20 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-cancellation-architecture.md +++ b/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-cancellation-architecture.md @@ -22,7 +22,7 @@ In both cases, the frontend cancels the request's `AsyncEngineContext`, which pr ### Worker Cancellation Detection -On the worker side, the runtime monitors the TCP connection from the frontend for cancellation signals. The worker detects cancellation in three scenarios: +On the worker side, the runtime monitors the TCP connection from the frontend for cancellation signals. The worker detects cancellation in two scenarios: 1. **Control message received** — The frontend explicitly sent a cancellation control message. 2. **TCP connection dropped** — The frontend disconnected without sending a control message (e.g., frontend crash or network failure). diff --git a/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-migration-architecture.md b/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-migration-architecture.md index 002047aa40eb..bcf2b1121742 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-migration-architecture.md +++ b/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-migration-architecture.md @@ -11,7 +11,7 @@ This is an architecture reference. For how to enable and tune migration, its ben ## Overview -Request migration is implemented through a Migration operator that sits in the LLM processing pipeline between the Backend operator and the service backend. When a worker fails during request processing, the migration system preserves the partial generation state and recreates the request on a new worker to continue from where the previous worker left off. +Request migration is implemented through a Migration operator that sits in the LLM processing pipeline between the frontend preprocessing and the service backend. When a worker fails during request processing, the migration system preserves the partial generation state and recreates the request on a new worker to continue from where the previous worker left off. ## Architecture Components From f140f3ac508bf4a1df042573d27eccd17b8a1715 Mon Sep 17 00:00:00 2001 From: Dan Gil Date: Thu, 17 Sep 2026 15:36:07 -0700 Subject: [PATCH 086/191] build(deps): bump nats-server to v2.14.7 (#14919) Signed-off-by: Dan Gil --- container/compliance/native_packages.yaml | 2 +- container/context.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/container/compliance/native_packages.yaml b/container/compliance/native_packages.yaml index 52cf593258d5..f5001412d7d9 100644 --- a/container/compliance/native_packages.yaml +++ b/container/compliance/native_packages.yaml @@ -133,7 +133,7 @@ packages: # nats-server — messaging server, downloaded as a .deb in dynamo_base (dpkg -i # may not survive into the final runtime layer attribution reliably). - name: nats-server - version: v2.12.14 + version: v2.14.7 license: Apache-2.0 source: https://github.com/nats-io/nats-server images: diff --git a/container/context.yaml b/container/context.yaml index 0478fd01571c..95a56a1867f3 100644 --- a/container/context.yaml +++ b/container/context.yaml @@ -49,7 +49,7 @@ dynamo: # and uv rejects cache entries written by a newer version. uv_version: "0.12.0" - nats_version: v2.12.14 + nats_version: v2.14.7 etcd_version: v3.5.33 nixl_ref: v1.3.2 From 7d9cdd5fd0e9a0c7bb44c05ed0f2eff89b34947d Mon Sep 17 00:00:00 2001 From: Harrison Saturley-Hall Date: Thu, 17 Sep 2026 18:43:13 -0400 Subject: [PATCH 087/191] build(deps): bump AISimulate to 0.12.0 (#15012) Signed-off-by: Harrison King Saturley-Hall --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- benchmarks/pyproject.toml | 2 +- container/deps/requirements.aisimulate.txt | 2 +- container/templates/wheel_builder.Dockerfile | 11 +++++++---- .../sizing-with-aiconfigurator.mdx | 2 +- .../aiconfigurator-reference.md | 2 +- .../ai-simulate-experimental/overview.md | 6 +++--- .../sweeper-experimental/dynamo-integration.md | 6 +++--- .../sweeper-experimental/glm-5-fp8-pareto-sweep.md | 3 ++- .../planner-goodput-per-gpu-sweep.md | 14 ++++++++------ .../sweeper-experimental/quickstart.md | 2 +- .../router-end-to-end-latency-sweep.md | 13 +++++++------ .../sizing-with-aiconfigurator.mdx | 2 +- lib/bindings/kvbm/Cargo.lock | 4 ++-- lib/bindings/python/Cargo.lock | 4 ++-- lib/bindings/python/Cargo.toml | 2 +- pyproject.toml | 2 +- .../test_aiconfigurator_consistency.py | 2 +- tests/dependencies/test_aisimulate_consistency.py | 3 +++ 20 files changed, 49 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d9e4d32066c7..bd01a7f29f05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "aisimulate-core" -version = "0.12.0-dev.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec87377a578ece6834d384b93bfba15f5809c754f5495efa452fe985cdb0edd5" +checksum = "7d266db788afdb866421aad39f8fbc7096dba9517105ff7d770ee83ad70f82bb" dependencies = [ "anyhow", "bincode 1.3.3", diff --git a/Cargo.toml b/Cargo.toml index b48ce0627275..a6562434b27f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,7 +56,7 @@ keywords = ["llm", "genai", "inference", "nvidia", "distributed"] [workspace.dependencies] # Published separately by https://github.com/ai-dynamo/aisimulate. -aisimulate-core = { version = "=0.12.0-dev.2" } +aisimulate-core = { version = "=0.12.0" } # Local crates dynamo-runtime = { path = "lib/runtime", version = "1.5.0" } diff --git a/benchmarks/pyproject.toml b/benchmarks/pyproject.toml index 4fa3cd742c05..612b122a3011 100644 --- a/benchmarks/pyproject.toml +++ b/benchmarks/pyproject.toml @@ -39,7 +39,7 @@ classifiers = [ ] dependencies = [ - "aisimulate==0.12.0.dev2; python_version >= '3.11' and python_version < '3.14'", + "aisimulate==0.12.0; python_version >= '3.11' and python_version < '3.14'", "aiperf==0.12.0", "matplotlib", "networkx", diff --git a/container/deps/requirements.aisimulate.txt b/container/deps/requirements.aisimulate.txt index b6e21613076e..53ccc2c1cd6d 100644 --- a/container/deps/requirements.aisimulate.txt +++ b/container/deps/requirements.aisimulate.txt @@ -2,4 +2,4 @@ # SPDX-License-Identifier: Apache-2.0 # Published AISimulate wheel staged into planner and framework runtime wheelhouses. -aisimulate==0.12.0.dev2 +aisimulate==0.12.0 diff --git a/container/templates/wheel_builder.Dockerfile b/container/templates/wheel_builder.Dockerfile index c81a67297659..17e03383fda7 100644 --- a/container/templates/wheel_builder.Dockerfile +++ b/container/templates/wheel_builder.Dockerfile @@ -635,16 +635,19 @@ COPY deploy/inference-gateway/sidecar/ /opt/dynamo/deploy/inference-gateway/side {% if target == "planner" or (target == "runtime" and framework in ("vllm", "sglang", "trtllm")) %} COPY container/deps/requirements.aisimulate.txt /opt/dynamo/container/deps/requirements.aisimulate.txt -# AI Simulate is released separately as an abi3 wheel. Stage the exact published -# wheel consumed by ai-dynamo instead of rebuilding it from vendored source. -# Download only this distribution; runtime images own dependency installation -# through their requirements files and local wheels. +# AI Simulate is released separately as an abi3 wheel. Its public PyPI artifact +# is a small resolver sdist because the full wheel is too large for that registry; +# stage the actual wheel directly from NVIDIA's package index. Download only this +# distribution; runtime images own dependency installation through their +# requirements files and local wheels. RUN --mount=type=cache,id=uv-root-{{ context.dynamo.uv_version }},target=/root/.cache/uv,sharing=shared \ export UV_CACHE_DIR=/root/.cache/uv && \ source ${VIRTUAL_ENV}/bin/activate && \ python -m pip download \ --only-binary=:all: \ --no-deps \ + --no-index \ + --find-links https://pypi.nvidia.com/aisimulate/ \ --dest /opt/dynamo/dist \ --requirement /opt/dynamo/container/deps/requirements.aisimulate.txt {% endif %} diff --git a/docs/fern/pages/cli/disaggregated-serving/sizing-with-aiconfigurator.mdx b/docs/fern/pages/cli/disaggregated-serving/sizing-with-aiconfigurator.mdx index 79ee395f7e6e..0f987974e3da 100644 --- a/docs/fern/pages/cli/disaggregated-serving/sizing-with-aiconfigurator.mdx +++ b/docs/fern/pages/cli/disaggregated-serving/sizing-with-aiconfigurator.mdx @@ -22,7 +22,7 @@ Use Python 3.11 through 3.13. Install AISimulate, which provides the retained `a sizing command: ```bash -python3 -m pip install "aisimulate==0.1.0.dev2" +python3 -m pip install "aisimulate==0.12.0" ``` Collect: diff --git a/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md b/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md index c02bf5604485..71684c0841f3 100644 --- a/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md +++ b/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md @@ -71,7 +71,7 @@ Use Python 3.11 through 3.13. ```bash # Install the distribution that provides the compatibility command -python3 -m pip install "aisimulate==0.1.0.dev2" +python3 -m pip install "aisimulate==0.12.0" # Optional: check whether the model/system/backend is covered aiconfigurator cli support \ diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/overview.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/overview.md index 954ab41ad645..730cb7223d61 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/overview.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/overview.md @@ -42,15 +42,15 @@ path. They have no adapter migration. AISimulate requires Python 3.11 through 3.13. Dynamo itself still supports Python 3.10, but the `aisimulate` dependency and its CLI are not installed in a Python 3.10 environment. -The `dynamo-planner` image installs the published `aisimulate==0.1.0.dev2` wheel from its local -wheelhouse. Dynamo builds `aisimulate-core==0.1.0-dev.2` from crates.io instead of vendoring the +The `dynamo-planner` image installs the published `aisimulate==0.12.0` wheel from its local +wheelhouse. Dynamo builds `aisimulate-core==0.12.0` from crates.io instead of vendoring the AISimulate source tree. For Dynamo source development, install the published AISimulate wheel, Dynamo, and the Planner dependencies from the Dynamo repository root: ```bash -python3 -m pip install "aisimulate==0.1.0.dev2" +python3 -m pip install "aisimulate==0.12.0" python3 -m pip install --no-deps -e . python3 -m pip install -r container/deps/requirements.planner.txt ``` diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/dynamo-integration.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/dynamo-integration.md index 669ed1643aa8..228f0f1738f2 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/dynamo-integration.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/dynamo-integration.md @@ -18,8 +18,8 @@ AISimulate requires Python 3.11 through 3.13. The `ai-dynamo` package remains in 3.10, but the AISimulate dependency and CLI are not installed there. The supported prebuilt environment is the `dynamo-planner` image. The image stages and installs the -published `aisimulate==0.1.0.dev2` wheel alongside the Dynamo wheels. Dynamo's Rust workspace -resolves `aisimulate-core==0.1.0-dev.2` from crates.io. +published `aisimulate==0.12.0` wheel alongside the Dynamo wheels. Dynamo's Rust workspace +resolves `aisimulate-core==0.12.0` from crates.io. For Dynamo source development, install the published AISimulate wheel and build the matching Dynamo bindings: @@ -30,7 +30,7 @@ cd lib/bindings/python maturin develop --uv --release --features aic-forward-pass cd ../../.. python3 -m pip install --no-deps -e . -python3 -m pip install "aisimulate==0.1.0.dev2" +python3 -m pip install "aisimulate==0.12.0" python3 -m pip install -r container/deps/requirements.planner.txt ``` diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/glm-5-fp8-pareto-sweep.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/glm-5-fp8-pareto-sweep.md index 275dc77cc22e..bf4227d6a182 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/glm-5-fp8-pareto-sweep.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/glm-5-fp8-pareto-sweep.md @@ -65,7 +65,8 @@ provide one config as a strict pin or several configs as a custom projection poo ## Configuration -Use this reference configuration: +The experiment used the following configuration shape. It documents the retired +`aisimulate==0.1.0.dev1` API and is not accepted by AISimulate 0.12.0: ```yaml search_space: diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/planner-goodput-per-gpu-sweep.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/planner-goodput-per-gpu-sweep.md index 63a8920d371c..44a7df9950d0 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/planner-goodput-per-gpu-sweep.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/planner-goodput-per-gpu-sweep.md @@ -10,10 +10,10 @@ subtitle: Experimental Sweeper search over Planner policies for MiniMax-M2.5 on > treat them as production capacity guidance or a performance commitment. Sweeper's search behavior > and output may change without a standard deprecation period. -Enable the planner (SLA mode) on the same deployment as the -[router experiment](router-end-to-end-latency-sweep.md), then use Sweeper's smart sweep to **find the -planner configuration that maximizes goodput-per-GPU** on the Mooncake toolagent trace, and -compare against the static deployment and the default planner. +This experiment enabled the planner (SLA mode) on the same deployment as the +[router experiment](router-end-to-end-latency-sweep.md), then used Sweeper's smart sweep to find the +planner configuration that maximized goodput-per-GPU on the Mooncake toolagent trace and compared +it against the static deployment and the default planner. ## Setup @@ -50,8 +50,10 @@ scales the fleet to an average of ~13.5 GPUs instead of pinning 32. ## Sweep config -`Sweeper.run`, `goal.target = goodput_per_gpu`. Deployment + router + workload + SLA -fixed; only the planner knobs swept (full trace, open-loop): +The experiment used `Sweeper.run` with `goal.target = goodput_per_gpu`. It fixed the deployment, +router, workload, and SLA, and swept only the planner settings using the full open-loop trace. The +configuration below documents the retired `aisimulate==0.1.0.dev1` API and is not accepted by +AISimulate 0.12.0: ```yaml search_space: diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/quickstart.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/quickstart.md index 7b6683b1f4cf..abf8c99a2109 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/quickstart.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/quickstart.md @@ -12,7 +12,7 @@ subtitle: Run a backend-neutral sweep with an injected replay runtime Install AISimulate: ```bash -python3 -m pip install "aisimulate==0.1.0.dev2" +python3 -m pip install "aisimulate==0.12.0" ``` Sweeper requires a `RunnerFactory` supplied by the application that owns replay execution: diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/router-end-to-end-latency-sweep.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/router-end-to-end-latency-sweep.md index 2dd2e6277969..536bbcdf6be1 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/router-end-to-end-latency-sweep.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/router-end-to-end-latency-sweep.md @@ -10,9 +10,9 @@ subtitle: Experimental Sweeper search over KV router settings for MiniMax-M2.5 o > treat them as production capacity guidance or a performance commitment. Sweeper's search behavior > and output may change without a standard deprecation period. -Reproduce the DynoSim router experiment, then use Sweeper's smart sweep to **find the -KV-router configuration that minimizes mean end-to-end latency** on the Mooncake toolagent -trace, and validate the winner against the default-router baseline on the full trace. +This experiment reproduced the DynoSim router experiment, then used Sweeper's smart sweep to find +the KV-router configuration that minimized mean end-to-end latency on the Mooncake toolagent trace +and validated the winner against the default-router baseline on the full trace. ## Setup @@ -32,9 +32,10 @@ concurrency) so any change in e2e latency is attributable to the **router** alon ## Sweep config -Searched with `Sweeper.run` (Vizier GP-bandit), `goal.target = e2e_latency`. Search -runs on a 2k-request subset (fast, representative — same long-context mix); the winner is -then validated on the full trace. +The experiment searched with `Sweeper.run` (Vizier GP-bandit) and +`goal.target = e2e_latency`. It ran on a 2k-request subset with the same long-context mix, then +validated the winner on the full trace. The configuration below documents the retired +`aisimulate==0.1.0.dev1` API and is not accepted by AISimulate 0.12.0. ```yaml search_space: diff --git a/docs/fern/pages/kubernetes/disaggregated-serving/sizing-with-aiconfigurator.mdx b/docs/fern/pages/kubernetes/disaggregated-serving/sizing-with-aiconfigurator.mdx index f4fc7dfef015..11216c3c8338 100644 --- a/docs/fern/pages/kubernetes/disaggregated-serving/sizing-with-aiconfigurator.mdx +++ b/docs/fern/pages/kubernetes/disaggregated-serving/sizing-with-aiconfigurator.mdx @@ -27,7 +27,7 @@ forward-pass timing model. retained `aiconfigurator` sizing command: ```bash - python3 -m pip install "aisimulate==0.1.0.dev2" + python3 -m pip install "aisimulate==0.12.0" ``` - Your checkpoint's HuggingFace ID, GPU system (for example `h200_sxm`), backend (`vllm`, `sglang`, or `trtllm`), the total GPUs you can allocate, and your SLA: Time To First Token (TTFT), Time Per Output Token (TPOT), and typical input/output sequence lengths (ISL/OSL). diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index ecb50844c826..98fe092b284f 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "aisimulate-core" -version = "0.12.0-dev.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec87377a578ece6834d384b93bfba15f5809c754f5495efa452fe985cdb0edd5" +checksum = "7d266db788afdb866421aad39f8fbc7096dba9517105ff7d770ee83ad70f82bb" dependencies = [ "anyhow", "bincode 1.3.3", diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index fe3b163c7f0c..0872f2ccab1a 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "aisimulate-core" -version = "0.12.0-dev.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec87377a578ece6834d384b93bfba15f5809c754f5495efa452fe985cdb0edd5" +checksum = "7d266db788afdb866421aad39f8fbc7096dba9517105ff7d770ee83ad70f82bb" dependencies = [ "anyhow", "bincode 1.3.3", diff --git a/lib/bindings/python/Cargo.toml b/lib/bindings/python/Cargo.toml index cab947a905ea..ff24d9e9218d 100644 --- a/lib/bindings/python/Cargo.toml +++ b/lib/bindings/python/Cargo.toml @@ -60,7 +60,7 @@ request-trace-s3 = ["dynamo-llm/request-trace-s3"] # former AIC crate surface. The `python` feature is required for # AicEngineBuilder; this extension supplies the interpreter, so the dependency # must not enable `extension-module`. -aisimulate-core = { version = "=0.12.0-dev.2", optional = true, features = ["python"] } +aisimulate-core = { version = "=0.12.0", optional = true, features = ["python"] } dynamo-runtime = { path = "../../runtime" } dynamo-mocker = { path = "../../mocker" } dynamo-parsers = { version = "8.1.0" } diff --git a/pyproject.toml b/pyproject.toml index 02aca2a7330d..37c09bb3cce3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ license-files = ["LICENSE"] requires-python = ">=3.10" dependencies = [ "ai-dynamo-runtime==1.5.0", - "aisimulate==0.12.0.dev2; python_version >= '3.11' and python_version < '3.14'", + "aisimulate==0.12.0; python_version >= '3.11' and python_version < '3.14'", "aiohttp>=3.14.3,<4.0", "transformers>=4.56.0", "kubernetes>=32.0.1,<33.0.0", diff --git a/tests/dependencies/test_aiconfigurator_consistency.py b/tests/dependencies/test_aiconfigurator_consistency.py index daf90295d456..d00eb35ae749 100644 --- a/tests/dependencies/test_aiconfigurator_consistency.py +++ b/tests/dependencies/test_aiconfigurator_consistency.py @@ -93,7 +93,7 @@ def test_no_manifest_installs_retired_aic_distributions() -> None: assert all(package["name"] != "aiconfigurator-core" for package in packages) assert features["aic-forward-pass"] == ["dep:aisimulate-core"] assert dependencies["aisimulate-core"] == { - "version": "=0.12.0-dev.2", + "version": "=0.12.0", "optional": True, "features": ["python"], } diff --git a/tests/dependencies/test_aisimulate_consistency.py b/tests/dependencies/test_aisimulate_consistency.py index 44609300f4fe..f3fa00f26f15 100644 --- a/tests/dependencies/test_aisimulate_consistency.py +++ b/tests/dependencies/test_aisimulate_consistency.py @@ -145,7 +145,10 @@ def test_container_stages_the_published_aisimulate_wheel() -> None: "--requirement /opt/dynamo/container/deps/requirements.aisimulate.txt" in wheel_builder ) + assert "--only-binary=:all:" in wheel_builder assert "--no-deps" in wheel_builder + assert "--no-index" in wheel_builder + assert "--find-links https://pypi.nvidia.com/aisimulate/" in wheel_builder assert "COPY aisimulate" not in wheel_builder assert "/opt/dynamo/aisimulate" not in wheel_builder assert not (ROOT / "aisimulate").exists() From ddff098f16097e63735b71b005dc37eb726a2bbf Mon Sep 17 00:00:00 2001 From: JulienDarve <86800349+JulienDarve@users.noreply.github.com> Date: Thu, 17 Sep 2026 16:07:02 -0700 Subject: [PATCH 088/191] feat(backends): expose native LoRA capacity in model registration (#14754) Signed-off-by: Julien Darve Signed-off-by: bzsuni Co-authored-by: bzsuni <86399306+bzsuni@users.noreply.github.com> --- Cargo.lock | 3 + .../src/dynamo/common/backend/engine.py | 1 + .../backend/tests/test_backend_bindings.py | 8 + .../examples/mocker/src/engine.rs | 1 + lib/backend-common/src/engine.rs | 2 + lib/backend-common/src/worker.rs | 3 + lib/bindings/python/Cargo.lock | 2 + lib/bindings/python/rust/backend.rs | 8 + lib/bindings/python/src/dynamo/_core.pyi | 3 + lib/kv-router/src/scheduling/queue.rs | 65 ++++-- lib/kv-router/src/scheduling/types.rs | 15 +- .../src/services/selection/core/tests.rs | 2 +- lib/llm/src/discovery/model_manager.rs | 142 ++++++++++++- lib/llm/src/discovery/watcher.rs | 1 + lib/llm/src/kv_router.rs | 194 +++++++++++++++++- lib/llm/src/lora.rs | 3 + lib/llm/src/lora/filter.rs | 29 ++- lib/llm/src/lora/state_tracker.rs | 31 +++ lib/sidecar/sglang/src/engine.rs | 1 + lib/sidecar/vllm/Cargo.toml | 7 + lib/sidecar/vllm/src/model.rs | 24 ++- lib/sidecar/vllm/src/tests.rs | 14 +- 22 files changed, 526 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd01a7f29f05..f84b8155ba24 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3188,10 +3188,13 @@ dependencies = [ "async-trait", "clap", "dynamo-backend-common", + "dynamo-llm", + "dynamo-runtime", "dynamo-sidecar-common", "futures", "prost-types 0.14.3", "serde_json", + "tempfile", "tokio", "tokio-stream", "tokio-util", diff --git a/components/src/dynamo/common/backend/engine.py b/components/src/dynamo/common/backend/engine.py index 57b69287f8e3..b0d4c2f2415a 100644 --- a/components/src/dynamo/common/backend/engine.py +++ b/components/src/dynamo/common/backend/engine.py @@ -132,6 +132,7 @@ class LlmRegistration: bootstrap_host: Optional[str] = None bootstrap_port: Optional[int] = None enable_eagle: bool = False + max_gpu_lora_count: Optional[int] = None @dataclass diff --git a/components/src/dynamo/common/backend/tests/test_backend_bindings.py b/components/src/dynamo/common/backend/tests/test_backend_bindings.py index 6edd9aff4aa4..714922192b92 100644 --- a/components/src/dynamo/common/backend/tests/test_backend_bindings.py +++ b/components/src/dynamo/common/backend/tests/test_backend_bindings.py @@ -88,6 +88,7 @@ def test_engine_config_full_kwargs_round_trip_through_getters(): max_num_seqs=64, max_num_batched_tokens=2048, enable_eagle=True, + max_gpu_lora_count=4, ), ) assert cfg.model == "m2" @@ -101,6 +102,7 @@ def test_engine_config_full_kwargs_round_trip_through_getters(): assert llm.max_num_seqs == 64 assert llm.max_num_batched_tokens == 2048 assert llm.enable_eagle is True + assert llm.max_gpu_lora_count == 4 @pytest.mark.unified @@ -109,6 +111,12 @@ def test_llm_registration_preserves_legacy_positional_arguments(): assert llm.bootstrap_host == "host" assert llm.bootstrap_port == 9000 assert llm.enable_eagle is False + assert llm.max_gpu_lora_count is None + extended = backend.LlmRegistration( + 2048, 16, 1000, 64, 2048, 2, 1, "host", 9000, True, 8 + ) + assert extended.enable_eagle is True + assert extended.max_gpu_lora_count == 8 @pytest.mark.parametrize("kwargs", [{}, {"enable_eagle": True}]) diff --git a/lib/backend-common/examples/mocker/src/engine.rs b/lib/backend-common/examples/mocker/src/engine.rs index 052e551d21b5..df8b09ea8159 100644 --- a/lib/backend-common/examples/mocker/src/engine.rs +++ b/lib/backend-common/examples/mocker/src/engine.rs @@ -363,6 +363,7 @@ impl LLMEngine for MockerBackend { total_kv_blocks: Some(self.engine_args.num_gpu_blocks as u64), max_num_seqs: self.engine_args.max_num_seqs.map(|v| v as u64), max_num_batched_tokens: self.engine_args.max_num_batched_tokens.map(|v| v as u64), + max_gpu_lora_count: None, data_parallel_size: None, data_parallel_start_rank: None, enable_eagle: false, diff --git a/lib/backend-common/src/engine.rs b/lib/backend-common/src/engine.rs index f46dd3406f95..a4d00f239063 100644 --- a/lib/backend-common/src/engine.rs +++ b/lib/backend-common/src/engine.rs @@ -141,6 +141,8 @@ pub struct LlmRegistration { pub max_num_seqs: Option, /// Maximum tokens the engine will process in a single batched step. pub max_num_batched_tokens: Option, + /// Maximum number of LoRA adapters the engine can keep resident on GPU. + pub max_gpu_lora_count: Option, /// DP ranks this worker hosts (default 1); the router enumerates per-rank /// load from it. pub data_parallel_size: Option, diff --git a/lib/backend-common/src/worker.rs b/lib/backend-common/src/worker.rs index f9b652d47735..4077cb5d488f 100644 --- a/lib/backend-common/src/worker.rs +++ b/lib/backend-common/src/worker.rs @@ -2128,6 +2128,7 @@ async fn build_local_model( total_kv_blocks: llm.total_kv_blocks, max_num_seqs: llm.max_num_seqs, max_num_batched_tokens: llm.max_num_batched_tokens, + max_gpu_lora_count: llm.max_gpu_lora_count, data_parallel_size: llm.data_parallel_size.unwrap_or(1), data_parallel_start_rank: llm.data_parallel_start_rank.unwrap_or(0), enable_eagle: llm.enable_eagle, @@ -2485,6 +2486,7 @@ mod tests { total_kv_blocks: Some(100), max_num_seqs: Some(16), max_num_batched_tokens: Some(8192), + max_gpu_lora_count: Some(8), enable_eagle: true, ..Default::default() }), @@ -2500,6 +2502,7 @@ mod tests { assert_eq!(runtime_config.total_kv_blocks, Some(100)); assert_eq!(runtime_config.max_num_seqs, Some(16)); assert_eq!(runtime_config.max_num_batched_tokens, Some(8192)); + assert_eq!(runtime_config.max_gpu_lora_count, Some(8)); assert!(runtime_config.enable_eagle); assert_eq!(runtime_config.tool_call_parser.as_deref(), Some("kimi_k2")); assert_eq!(runtime_config.reasoning_parser.as_deref(), Some("kimi_k25")); diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index 0872f2ccab1a..ce8c3bea4add 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -2655,6 +2655,8 @@ dependencies = [ "async-trait", "clap", "dynamo-backend-common", + "dynamo-llm", + "dynamo-runtime", "dynamo-sidecar-common", "futures", "prost-types 0.14.4", diff --git a/lib/bindings/python/rust/backend.rs b/lib/bindings/python/rust/backend.rs index c169f02cf675..4df6c4014138 100644 --- a/lib/bindings/python/rust/backend.rs +++ b/lib/bindings/python/rust/backend.rs @@ -230,6 +230,7 @@ impl LlmRegistration { bootstrap_host = None, bootstrap_port = None, enable_eagle = false, + max_gpu_lora_count = None, ))] #[allow(clippy::too_many_arguments)] fn new( @@ -243,6 +244,7 @@ impl LlmRegistration { bootstrap_host: Option, bootstrap_port: Option, enable_eagle: bool, + max_gpu_lora_count: Option, ) -> Self { Self { inner: RsLlmRegistration { @@ -251,6 +253,7 @@ impl LlmRegistration { total_kv_blocks, max_num_seqs, max_num_batched_tokens, + max_gpu_lora_count, data_parallel_size, data_parallel_start_rank, enable_eagle, @@ -281,6 +284,10 @@ impl LlmRegistration { self.inner.max_num_batched_tokens } #[getter] + fn max_gpu_lora_count(&self) -> Option { + self.inner.max_gpu_lora_count + } + #[getter] fn data_parallel_size(&self) -> Option { self.inner.data_parallel_size } @@ -896,6 +903,7 @@ impl PyEngineCore { total_kv_blocks: opt_attr::(&v, "total_kv_blocks")?, max_num_seqs: opt_attr::(&v, "max_num_seqs")?, max_num_batched_tokens: opt_attr::(&v, "max_num_batched_tokens")?, + max_gpu_lora_count: opt_attr::(&v, "max_gpu_lora_count")?, data_parallel_size: opt_attr::(&v, "data_parallel_size")?, data_parallel_start_rank: opt_attr::(&v, "data_parallel_start_rank")?, enable_eagle: opt_attr::(&v, "enable_eagle")?.unwrap_or(false), diff --git a/lib/bindings/python/src/dynamo/_core.pyi b/lib/bindings/python/src/dynamo/_core.pyi index 1f8df6c915e0..d899afeb2a76 100644 --- a/lib/bindings/python/src/dynamo/_core.pyi +++ b/lib/bindings/python/src/dynamo/_core.pyi @@ -3428,6 +3428,7 @@ class backend: bootstrap_host: Optional[str] = None, bootstrap_port: Optional[int] = None, enable_eagle: bool = False, + max_gpu_lora_count: Optional[int] = None, ) -> None: ... @property def context_length(self) -> Optional[int]: ... @@ -3449,6 +3450,8 @@ class backend: def bootstrap_port(self) -> Optional[int]: ... @property def enable_eagle(self) -> bool: ... + @property + def max_gpu_lora_count(self) -> Optional[int]: ... class EngineConfig: def __init__( diff --git a/lib/kv-router/src/scheduling/queue.rs b/lib/kv-router/src/scheduling/queue.rs index 358af306a6fd..f48840008412 100644 --- a/lib/kv-router/src/scheduling/queue.rs +++ b/lib/kv-router/src/scheduling/queue.rs @@ -477,6 +477,7 @@ struct SchedulerQueueActor< pending: PolicyQueue, cleanup: Arc, profile: PolicyProfile, + is_queueing_enabled: bool, pending_count: Arc, pending_isl_tokens: Arc, class_counters: Arc>, @@ -616,6 +617,7 @@ impl< pending, cleanup: Arc::clone(&cleanup), profile, + is_queueing_enabled: queueing_enabled, pending_count: Arc::clone(&pending_count), pending_isl_tokens: Arc::clone(&pending_isl_tokens), class_counters: Arc::clone(&class_counters), @@ -1021,6 +1023,13 @@ impl< block_hashes: Option>, ) -> bool { let decay_now = Instant::now(); + if !self.is_queueing_enabled { + return self.admit_one(request, attempt_tx, lifecycle_transfer, decay_now); + } + let available = self + .available_worker_provider + .as_ref() + .and_then(|provider| provider(&request)); // Synthetic and explicit selections avoid cache work. Family classification // samples overlap once and reuses it if the request enters queue storage. let (class_index, snapshot) = if let Some(class_index) = self @@ -1030,7 +1039,7 @@ impl< (class_index, None) } else { let workers = self.workers_with_configs.borrow(); - let snapshot = Self::snapshot_for_with(&request, &workers); + let snapshot = Self::snapshot_for_with(&request, &workers, available.as_deref()); let class_index = self .profile .resolve_class_index(request.policy_class.as_deref(), snapshot.uncached_tokens); @@ -1038,13 +1047,20 @@ impl< }; let class = self.profile.class(class_index); let should_queue = self.should_queue(class_index, class, || { - self.all_workers_prefill_busy(class, request.eligibility(), decay_now) + self.all_workers_prefill_busy( + class, + request + .eligibility() + .with_available_workers(available.as_deref()), + decay_now, + ) }); if !should_queue { return self.admit_one(request, attempt_tx, lifecycle_transfer, decay_now); } - let snapshot = snapshot.unwrap_or_else(|| self.snapshot_for(&request)); + let snapshot = + snapshot.unwrap_or_else(|| self.snapshot_for(&request, available.as_deref())); tracing::debug!(policy_class = class.name, "queueing request"); let arrival_offset = self.start_time.elapsed().as_secs_f64(); let priority_jump = request.priority_jump; @@ -1095,18 +1111,23 @@ impl< class.queueing_enabled() && (self.pending.has_backlog(class_index) || all_workers_busy()) } - fn snapshot_for(&self, request: &SchedulingRequest) -> QueueSnapshot { + fn snapshot_for( + &self, + request: &SchedulingRequest, + available: Option<&HashSet>, + ) -> QueueSnapshot { let workers = self.workers_with_configs.borrow(); - Self::snapshot_for_with(request, &workers) + Self::snapshot_for_with(request, &workers, available) } fn snapshot_for_with( request: &SchedulingRequest, workers: &HashMap, + available: Option<&HashSet>, ) -> QueueSnapshot { // Cache overlap is sampled once and reused for classification, queue // limits, ordering, DRR cost, and counters. - let context = SchedulingContext::new(request, workers); + let context = SchedulingContext::new(request, workers).with_available_workers(available); QueueSnapshot::new(request.isl_tokens, context.best_cached_tokens()) } @@ -1217,13 +1238,20 @@ impl< fn has_dispatchable_ready_head(&self) -> bool { let active_tokens = self.slots.active_tokens(Instant::now()); - let configs = self.workers_with_configs.borrow(); self.pending.any_ready_head(|_, class, queued| { + let available = self + .available_worker_provider + .as_ref() + .and_then(|provider| provider(&queued.request)); + let configs = self.workers_with_configs.borrow(); !Self::all_workers_prefill_busy_with( &active_tokens, &configs, class, - queued.request.eligibility(), + queued + .request + .eligibility() + .with_available_workers(available.as_deref()), ) }) } @@ -1254,8 +1282,11 @@ impl< let decay_now = Instant::now(); let active_tokens = self.slots.active_tokens(decay_now); let popped = { - let configs = self.workers_with_configs.borrow(); + let provider = self.available_worker_provider.as_ref(); + let workers = &self.workers_with_configs; self.pending.pop_next(|_, class, queued| { + let available = provider.and_then(|provider| provider(&queued.request)); + let configs = workers.borrow(); // TODO: This preserves head-of-line blocking within each policy // class. A blocked constrained head can stall later entries in // that class until a bounded non-HOL policy is introduced. @@ -1263,7 +1294,10 @@ impl< &active_tokens, &configs, class, - queued.request.eligibility(), + queued + .request + .eligibility() + .with_available_workers(available.as_deref()), ) }) }; @@ -1342,16 +1376,17 @@ impl< .slots .project_worker_loads(request.token_seq.as_deref(), decay_now); + let available_worker_ids = self + .available_worker_provider + .as_ref() + .and_then(|provider| provider(request)); + { let workers = self.workers_with_configs.borrow(); let overloaded_worker_ids = self .overloaded_worker_provider .as_ref() .and_then(|provider| provider()); - let available_worker_ids = self - .available_worker_provider - .as_ref() - .and_then(|provider| provider()); let mut eligibility = request .eligibility_with_overloaded(overloaded_worker_ids.as_ref()) .with_available_workers(available_worker_ids.as_deref()); @@ -3263,7 +3298,7 @@ policy_classes: #[tokio::test(flavor = "multi_thread")] async fn hard_availability_provider_filters_unpinned_and_pinned_selection() { let available_worker_provider: WorkerAvailabilityProvider = - Arc::new(|| Some(Arc::new(HashSet::from([1])))); + Arc::new(|_| Some(Arc::new(HashSet::from([1])))); let (queue, slots) = make_queue_with_providers(2, 16, 256, None, Some(available_worker_provider)); diff --git a/lib/kv-router/src/scheduling/types.rs b/lib/kv-router/src/scheduling/types.rs index 2b19d87e228a..b967707412e5 100644 --- a/lib/kv-router/src/scheduling/types.rs +++ b/lib/kv-router/src/scheduling/types.rs @@ -53,7 +53,7 @@ pub type OverloadedWorkerProvider = /// set. `None` means no hard-availability source is attached; `Some` is /// authoritative, so an empty set rejects every candidate. pub type WorkerAvailabilityProvider = - Arc Option>> + Send + Sync + 'static>; + Arc Option>> + Send + Sync + 'static>; #[derive(Debug, thiserror::Error)] pub enum WorkerSelectionPolicyError { @@ -434,13 +434,24 @@ impl<'a, C: WorkerConfigLike> SchedulingContext<'a, C> { self.request } + pub(crate) fn with_available_workers( + mut self, + available: Option<&'a HashSet>, + ) -> Self { + self.eligibility = self.eligibility.with_available_workers(available); + self + } + pub fn best_effective_prefill_tokens(&self) -> usize { effective_prefill_tokens(self.request.isl_tokens, self.best_cached_tokens()) } pub fn best_cached_tokens(&self) -> usize { match self.eligibility.pinned_worker() { - Some(worker) => self.request.effective_cached_tokens_for(worker), + Some(worker) => self + .eligibility + .validate_worker_rank(self.workers, worker) + .map_or(0, |_| self.request.effective_cached_tokens_for(worker)), None => self .request .overlap diff --git a/lib/kv-router/src/services/selection/core/tests.rs b/lib/kv-router/src/services/selection/core/tests.rs index 408944a166bb..3c2af0e9e2fd 100644 --- a/lib/kv-router/src/services/selection/core/tests.rs +++ b/lib/kv-router/src/services/selection/core/tests.rs @@ -924,7 +924,7 @@ async fn injected_load_providers_restrict_selection() { let provider_state = Arc::clone(&available); let core = core_with_host(SelectionHost { load: HostLoad { - available_workers: Some(Arc::new(move || provider_state.lock().clone())), + available_workers: Some(Arc::new(move |_| provider_state.lock().clone())), overloaded_workers: Some(Arc::new(|| Some(HashSet::from([1])))), ..HostLoad::default() }, diff --git a/lib/llm/src/discovery/model_manager.rs b/lib/llm/src/discovery/model_manager.rs index d206edc630fc..825633a2b5ef 100644 --- a/lib/llm/src/discovery/model_manager.rs +++ b/lib/llm/src/discovery/model_manager.rs @@ -141,6 +141,7 @@ struct CommittedDiscoveryGroup { struct PendingLoraProjection { base_capacities: Vec, adapters: HashMap, + is_registration_required: bool, } type EndpointLoraProjection = HashMap>; @@ -277,6 +278,9 @@ impl ModelManager { if let Some(capacity) = card.runtime_config.max_gpu_lora_count { worker_projection.base_capacities.push(capacity); } + worker_projection.is_registration_required |= card + .runtime_config + .runtime_flag_enabled(crate::lora::LORA_REQUIRES_REGISTRATION); for (adapter_key, adapter_card) in &group.adapters { let Ok(adapter_mcid) = ModelCardInstanceId::from_path(adapter_key) else { @@ -335,8 +339,13 @@ impl ModelManager { .first() .copied() .or_else(|| adapter_capacities.first().copied()) - .or_else(|| (!loras.is_empty()).then_some(4))?; - Some((worker, LoraWorkerProjection { capacity, loras })) + .or_else(|| (!loras.is_empty()).then_some(4)) + .or_else(|| projection.is_registration_required.then_some(0))?; + Some((worker, LoraWorkerProjection { + capacity, + loras, + is_registration_required: projection.is_registration_required, + })) }) .collect(); (endpoint_id, workers) @@ -357,6 +366,7 @@ impl ModelManager { continue; }; existing.capacity = existing.capacity.min(projection.capacity); + existing.is_registration_required |= projection.is_registration_required; let mut loras = existing .loras .iter() @@ -3701,6 +3711,134 @@ mod tests { assert!(tracker.is_empty()); } + #[test] + fn sidecar_unload_preserves_routing_to_registered_replicas() { + use crate::lora::{LORA_REQUIRES_REGISTRATION, LoraAllocationConfig, LoraController}; + + let manager = ModelManager::new(); + let mut base = ModelDeploymentCard::with_name_only("base"); + base.runtime_config.max_gpu_lora_count = Some(4); + base.runtime_config + .runtime_data + .insert(LORA_REQUIRES_REGISTRATION.into(), true.into()); + let mut adapter = ModelDeploymentCard::with_name_only("adapter"); + adapter.lora = Some(LoraInfo { + name: "adapter".into(), + max_gpu_lora_count: Some(4), + }); + let members: Vec<_> = [1, 2] + .into_iter() + .map(|id| { + ( + ModelCardInstanceId { + namespace: "namespace".into(), + component: "worker".into(), + endpoint: "generate".into(), + instance_id: id, + model_suffix: None, + } + .to_path(), + base.clone(), + ) + }) + .collect(); + let adapters: Vec<_> = members + .iter() + .map(|(key, _)| { + let mut mcid = ModelCardInstanceId::from_path(key).unwrap(); + mcid.model_suffix = Some("adapter".into()); + (mcid.to_path(), adapter.clone()) + }) + .collect(); + manager + .commit_discovery_group( + "group", + "workers", + WorkerSet::new("deployment".into(), base.mdcsum().into(), base), + members.clone(), + adapters.clone(), + ) + .unwrap(); + let domain = manager.lora_domain(&EndpointId::from("namespace.worker.generate")); + let mut controller = LoraController::new( + LoraAllocationConfig::default(), + domain.routing_table.clone(), + domain.state_tracker.clone(), + domain.load_estimator.clone(), + ); + controller.recompute_now(); + let pin = domain + .routing_table + .get_config("adapter") + .unwrap() + .replica_set[0] + .worker_id; + assert_eq!( + domain + .filter + .filter_worker_ids_for_lora(Some("adapter"), &[1, 2]), + [pin] + ); + + let remaining = if pin == 1 { 2 } else { 1 }; + let retained = adapters + .into_iter() + .filter(|(key, _)| { + ModelCardInstanceId::from_path(key).unwrap().instance_id == remaining + }) + .collect(); + manager + .replace_discovery_group("group", None, members.clone(), retained) + .unwrap(); + controller.recompute_now(); + assert_eq!(domain.state_tracker.total_lora_slots(), 8); + assert_eq!( + domain + .routing_table + .get_config("adapter") + .unwrap() + .replica_set[0] + .worker_id, + pin + ); + assert_eq!( + domain + .filter + .filter_worker_ids_for_lora(Some("adapter"), &[1, 2]), + [remaining] + ); + assert_eq!( + domain + .filter + .filter_worker_ids_for_lora_with_pin(Some("adapter"), &[1, 2], Some(pin)), + [remaining] + ); + + manager + .replace_discovery_group("group", None, members, Vec::new()) + .unwrap(); + controller.recompute_now(); + assert!( + domain + .filter + .filter_worker_ids_for_lora_with_pin(Some("adapter"), &[1, 2], Some(pin)) + .is_empty() + ); + assert_eq!( + domain.filter.filter_worker_ids_for_lora(None, &[1, 2]), + [1, 2] + ); + domain + .state_tracker + .set_worker_capacity(WorkerWithDpRank::new(3, 0), 4); + assert_eq!( + domain + .filter + .filter_worker_ids_for_lora_with_pin(Some("adapter"), &[1, 2, 3], Some(3)), + [3] + ); + } + fn topology_card(role: WorkerType) -> ModelDeploymentCard { let mut card = ModelDeploymentCard::with_name_only("topology-model"); card.worker_type = Some(role); diff --git a/lib/llm/src/discovery/watcher.rs b/lib/llm/src/discovery/watcher.rs index 0d7e326f2f03..9883d5d652f7 100644 --- a/lib/llm/src/discovery/watcher.rs +++ b/lib/llm/src/discovery/watcher.rs @@ -1386,6 +1386,7 @@ fn lora_projection_fingerprint(card: &ModelDeploymentCard) -> anyhow::Result = match (&request.allowed_worker_ids, available.as_ref()) { + (Some(allowed), _) => allowed + .iter() + .filter(|id| { + available + .as_ref() + .is_none_or(|workers| workers.contains(*id)) + }) + .copied() + .collect(), + (None, Some(available)) => available.iter().copied().collect(), + (None, None) => workers_for_availability.borrow().keys().copied().collect(), + }; + Some(Arc::new( + filter + .filter_worker_ids_for_lora_with_pin( + Some(lora_name), + &candidates, + request.pinned_worker.map(|worker| worker.worker_id), + ) + .into_iter() + .collect(), + )) + }); let request_leases = request_lease::RequestLeaseManager::new(cancellation_token.child_token()); @@ -821,9 +851,8 @@ impl KvRouter { overloaded_worker_provider, available_worker_provider, shared_cache: shared_cache.clone(), - lora_worker_filter: lora_filter.map(|filter| { - filter as Arc - }), + // The availability provider refreshes LoRA eligibility at admission. + lora_worker_filter: None, ingress: Arc::clone(&ingress) as Arc, scheduler_load, @@ -2877,6 +2906,161 @@ mod tests { .unwrap() } + #[tokio::test] + async fn queued_lora_requests_refresh_registration_without_widening_constraints() { + use crate::lora::state_tracker::LoraWorkerProjection; + use crate::lora::{LoraFilter, LoraReplicaConfig, LoraRoutingTable, LoraStateTracker}; + use crate::model_card::LoraInfo; + + let tracker = LoraStateTracker::new(); + let publish = |loaded: &[u64]| { + tracker.replace_endpoint_projection( + [1, 2] + .into_iter() + .map(|id| { + ( + WorkerWithDpRank::new(id, 0), + LoraWorkerProjection { + capacity: 4, + loras: loaded + .contains(&id) + .then(|| LoraInfo { + name: "adapter".into(), + max_gpu_lora_count: Some(4), + }) + .into_iter() + .collect(), + is_registration_required: true, + }, + ) + }) + .collect(), + ); + }; + let routing = LoraRoutingTable::new(); + routing.update_allocation( + "adapter".into(), + LoraReplicaConfig { + lora_name: "adapter".into(), + replica_factor: 1, + replica_set: vec![WorkerWithDpRank::new(1, 0)], + updated_at: Instant::now(), + is_active: false, + }, + ); + let component = make_test_component("queued-lora-router").await; + let endpoint = component.endpoint("backend"); + let client = endpoint.client().await.unwrap(); + let (_tx, workers) = watch::channel( + [1, 2] + .into_iter() + .map(|id| (id, ModelRuntimeConfig::default())) + .collect(), + ); + let router = KvRouter::new( + endpoint, + client, + workers, + None, + 2, + SelectionPolicySource::Registry, + Some(KvRouterConfig { + overlap_score_credit: 0.0, + router_temperature: 0.0, + use_kv_events: false, + router_track_active_blocks: false, + skip_initial_worker_wait: true, + router_queue_threshold: Some(0.0), + ..Default::default() + }), + None, + "decode", + None, + false, + None, + Some(Arc::new(LoraFilter::new(routing, tracker.clone()))), + ) + .await + .unwrap(); + let route = |id, lora_name, pinned_worker, allowed_worker_ids| { + router.find_best_match_details_with_policy_class( + Some(id), + &[1, 2], + None, + None, + true, + false, + lora_name, + None, + 0.0, + 0, + None, + None, + None, + pinned_worker, + allowed_worker_ids, + RoutingConstraints::default(), + ) + }; + + for (pin, allowed, retained, expected) in [ + (None, Some(HashSet::from([1, 2])), vec![2], Some(2)), + (Some(WorkerWithDpRank::new(1, 0)), None, vec![2], None), + (None, Some(HashSet::from([1])), vec![2], None), + (None, None, vec![], None), + ] { + publish(&[1, 2]); + for (id, worker) in [("busy-a", 1), ("busy-b", 2)] { + route(id, None, Some(WorkerWithDpRank::new(worker, 0)), None) + .await + .unwrap(); + } + let queued = route("queued", Some("adapter".into()), pin, allowed); + tokio::pin!(queued); + tokio::time::timeout(std::time::Duration::from_secs(2), async { + tokio::select! { + _ = &mut queued => panic!("request bypassed queue"), + _ = async { + while router.pending_count() != 1 { + tokio::task::yield_now().await; + } + } => {} + } + }) + .await + .unwrap(); + + publish(&retained); + router.mark_prefill_completed("busy-a").await.unwrap(); + if expected.is_some() { + assert_eq!(router.pending_count(), 1, "remaining replica is still busy"); + } + router.mark_prefill_completed("busy-b").await.unwrap(); + let result = tokio::time::timeout(std::time::Duration::from_secs(2), queued) + .await + .unwrap(); + match expected { + Some(id) => { + assert!( + matches!(result.unwrap(), FindBestMatchOutcome::Routed { worker, .. } if worker.worker_id == id) + ); + router.free("queued").await.unwrap(); + } + None => assert!(matches!( + result + .err() + .expect("no eligible worker") + .downcast_ref::(), + Some(KvSchedulerError::NoEndpoints) + )), + } + assert_eq!(router.pending_count(), 0); + for id in ["busy-a", "busy-b"] { + router.free(id).await.unwrap(); + } + } + } + /// Picks worker 0 and records which construction it belongs to. Its /// required inputs differ by tag so the router's probed inputs identify /// the instance they were read from. diff --git a/lib/llm/src/lora.rs b/lib/llm/src/lora.rs index 8efcf845afc5..484a98ced410 100644 --- a/lib/llm/src/lora.rs +++ b/lib/llm/src/lora.rs @@ -33,6 +33,9 @@ pub use routing::{ pub use source::{HuggingFaceLoRASource, LoRASource, LocalLoRASource, S3LoRASource}; pub use state_tracker::LoraStateTracker; +/// Worker runtime flag requiring an adapter registration before request routing. +pub const LORA_REQUIRES_REGISTRATION: &str = "lora_requires_registration"; + /// Returns true when LoRA serving is enabled via a truthy `DYN_LORA_ENABLED` env var /// (`1`/`true`/`on`/`yes`, case-insensitive). This gates the request-time LoRA filter on /// both the KV and non-KV routing paths, so non-LoRA deployments keep the unmodified diff --git a/lib/llm/src/lora/filter.rs b/lib/llm/src/lora/filter.rs index 8c697be2cb47..24d37027af6d 100644 --- a/lib/llm/src/lora/filter.rs +++ b/lib/llm/src/lora/filter.rs @@ -99,12 +99,37 @@ impl LoraFilter { &self, lora_name: Option<&str>, available: &[u64], + ) -> Vec { + self.filter_worker_ids_for_lora_with_pin(lora_name, available, None) + } + + pub(crate) fn filter_worker_ids_for_lora_with_pin( + &self, + lora_name: Option<&str>, + available: &[u64], + pinned_worker: Option, ) -> Vec { let Some(lora_name) = lora_name else { return available.to_vec(); }; let observed = self.state_tracker.snapshot(); + let eligible = observed.eligible_workers(lora_name, available); + let mut selected = self.filter_observed(&observed, lora_name, &eligible); + if let Some(pin) = pinned_worker + && eligible.contains(&pin) + && !selected.contains(&pin) + { + selected.push(pin); + } + selected + } + fn filter_observed( + &self, + observed: &LoraObservedSnapshot, + lora_name: &str, + available: &[u64], + ) -> Vec { let Some(config) = self.routing_table.get_config(lora_name) else { // No routing-table entry yet (controller disabled, or before the first tick). // Prefer workers that actually have this adapter loaded (from the state tracker) @@ -177,7 +202,7 @@ impl LoraFilter { lora = lora_name, "Replica set workers all unavailable; using bounded fallback (no scatter)" ); - self.bounded_fallback(&observed, lora_name, available) + self.bounded_fallback(observed, lora_name, available) } else { // Inactive: cold-start pin if let Some(pin_id) = config.replica_set.first().map(|w| w.worker_id) @@ -194,7 +219,7 @@ impl LoraFilter { lora = lora_name, "Cold-start pin worker unavailable; using bounded fallback (no scatter)" ); - self.bounded_fallback(&observed, lora_name, available) + self.bounded_fallback(observed, lora_name, available) } } diff --git a/lib/llm/src/lora/state_tracker.rs b/lib/llm/src/lora/state_tracker.rs index d5751c991718..3cf0d5950460 100644 --- a/lib/llm/src/lora/state_tracker.rs +++ b/lib/llm/src/lora/state_tracker.rs @@ -9,6 +9,7 @@ //! [`LoraObservedSnapshot`] so a routing decision cannot mix indexes from different //! discovery generations. +use std::borrow::Cow; use std::collections::{HashMap, HashSet}; use std::sync::{Arc, Mutex}; @@ -26,9 +27,31 @@ pub struct LoraObservedSnapshot { lora_info: HashMap<(String, WorkerWithDpRank), LoraInfo>, worker_to_loras: HashMap>, worker_capacity: HashMap, + registration_required: HashSet, } impl LoraObservedSnapshot { + pub(crate) fn eligible_workers<'a>( + &self, + lora_name: &str, + available: &'a [u64], + ) -> Cow<'a, [u64]> { + if self.registration_required.is_empty() { + return Cow::Borrowed(available); + } + Cow::Owned( + available + .iter() + .copied() + .filter(|id| { + let worker = WorkerWithDpRank::new(*id, 0); + !self.registration_required.contains(&worker) + || self.is_loaded(lora_name, &worker) + }) + .collect(), + ) + } + pub fn incarnation(&self) -> u64 { self.incarnation } @@ -109,6 +132,7 @@ impl LoraObservedSnapshot { pub(crate) struct LoraWorkerProjection { pub(crate) capacity: u32, pub(crate) loras: Vec, + pub(crate) is_registration_required: bool, } /// Tracks one endpoint's complete observed LoRA state. @@ -227,6 +251,7 @@ impl LoraStateTracker { let projection = capacity.map(|capacity| LoraWorkerProjection { capacity, loras: loras.to_vec(), + is_registration_required: false, }); self.mutate(|next| replace_worker(next, worker, projection)); } @@ -401,6 +426,7 @@ fn replace_worker( .unwrap_or_default(); let Some(projection) = projection else { snapshot.worker_capacity.remove(&worker); + snapshot.registration_required.remove(&worker); for name in previous { remove_lora(snapshot, worker, &name); } @@ -408,6 +434,11 @@ fn replace_worker( }; snapshot.worker_capacity.insert(worker, projection.capacity); + if projection.is_registration_required { + snapshot.registration_required.insert(worker); + } else { + snapshot.registration_required.remove(&worker); + } let desired = projection .loras .into_iter() diff --git a/lib/sidecar/sglang/src/engine.rs b/lib/sidecar/sglang/src/engine.rs index 90d41623c8df..6eba3f582ba7 100644 --- a/lib/sidecar/sglang/src/engine.rs +++ b/lib/sidecar/sglang/src/engine.rs @@ -958,6 +958,7 @@ fn build_engine_config( total_kv_blocks, max_num_seqs, max_num_batched_tokens, + max_gpu_lora_count: None, data_parallel_size, data_parallel_start_rank, enable_eagle, diff --git a/lib/sidecar/vllm/Cargo.toml b/lib/sidecar/vllm/Cargo.toml index 542da1a69fc8..0e300cbd383a 100644 --- a/lib/sidecar/vllm/Cargo.toml +++ b/lib/sidecar/vllm/Cargo.toml @@ -11,12 +11,18 @@ homepage.workspace = true repository.workspace = true description = "Rust sidecar for vLLM's native gRPC server" +[package.metadata.cargo-machete] +# LoRA dependencies are used by the next stacked PR. +ignored = ["dynamo-runtime", "tempfile"] + [[bin]] name = "dynamo-vllm-sidecar" path = "src/main.rs" [dependencies] dynamo-backend-common = { workspace = true } +dynamo-llm = { path = "../../llm", default-features = false } +dynamo-runtime = { workspace = true } dynamo-sidecar-common = { workspace = true, features = ["tonic-v14"] } anyhow = { workspace = true } @@ -36,4 +42,5 @@ vllm-proto = { workspace = true } [dev-dependencies] dynamo-backend-common = { workspace = true, features = ["testing"] } +tempfile = { workspace = true } tokio-stream = { workspace = true, features = ["net"] } diff --git a/lib/sidecar/vllm/src/model.rs b/lib/sidecar/vllm/src/model.rs index 74840a01c752..10a827b1dc26 100644 --- a/lib/sidecar/vllm/src/model.rs +++ b/lib/sidecar/vllm/src/model.rs @@ -17,6 +17,8 @@ struct ModelIdentity { aliases: Vec, reasoning_parser: Option, tool_call_parser: Option, + supports_lora: bool, + max_loras: u32, } #[derive(Clone, Debug)] @@ -61,12 +63,16 @@ impl DiscoveredModel { } let reasoning_parser = nonempty(model.reasoning_parser); let tool_call_parser = nonempty(model.tool_call_parser); + let supports_lora = model.supports_lora; + let max_loras = server.max_loras; let identity = ModelIdentity { source: source.clone(), served_name: served_name.clone(), aliases: model.served_model_aliases, reasoning_parser: reasoning_parser.clone(), tool_call_parser: tool_call_parser.clone(), + supports_lora, + max_loras, }; Ok(Self { source, @@ -169,15 +175,19 @@ impl DiscoveredModel { model: self.source.clone(), served_model_name: Some(self.served_name.clone()), model_aliases: self.identity.aliases.clone(), - // The released protocol lacks native sampling JSON and its capability - // flag. Advertise native Generate only once upstream supports both. - runtime_data: Default::default(), + runtime_data: [( + dynamo_llm::lora::LORA_REQUIRES_REGISTRATION.to_string(), + serde_json::Value::Bool(true), + )] + .into_iter() + .collect(), llm: Some(LlmRegistration { context_length: nonzero(self.server.max_model_len), kv_cache_block_size: nonzero(self.server.kv_block_size), total_kv_blocks: self.total_kv_blocks_per_rank(), max_num_seqs: nonzero(self.server.max_running_requests), max_num_batched_tokens: nonzero(self.server.max_batched_tokens), + max_gpu_lora_count: self.supports_lora().then_some(self.max_loras()), data_parallel_size: parallelism .and_then(|parallelism| nonzero(parallelism.data_parallel_size)), data_parallel_start_rank: parallelism.map(|_| 0), @@ -193,6 +203,14 @@ impl DiscoveredModel { .map_or(1, |parallelism| parallelism.data_parallel_size) } + pub(crate) fn supports_lora(&self) -> bool { + self.identity.supports_lora && self.identity.max_loras > 0 + } + + pub(crate) fn max_loras(&self) -> u32 { + self.identity.max_loras + } + fn total_kv_blocks_per_rank(&self) -> Option { let total_kv_blocks = nonzero(self.server.total_kv_blocks)?; let data_parallel_size = u64::from(self.data_parallel_size()); diff --git a/lib/sidecar/vllm/src/tests.rs b/lib/sidecar/vllm/src/tests.rs index 0528a3816d79..1536e5ee692f 100644 --- a/lib/sidecar/vllm/src/tests.rs +++ b/lib/sidecar/vllm/src/tests.rs @@ -485,7 +485,7 @@ fn model_info() -> pb::ModelInfo { served_model_aliases: vec!["model-alias".to_string()], supports_text_input: true, supports_token_ids_input: true, - supports_lora: false, + supports_lora: true, supports_multimodal: false, reasoning_parser: "deepseek_r1".to_string(), tool_call_parser: "hermes".to_string(), @@ -510,7 +510,7 @@ fn server_info() -> pb::ServerInfo { total_kv_blocks: 4096, max_running_requests: 128, max_batched_tokens: 2048, - max_loras: 0, + max_loras: 4, rl_capabilities: Some(pb::RlCapabilities { weight_transfer_enabled: true, weight_transfer_backend: "nccl".to_string(), @@ -521,7 +521,7 @@ fn server_info() -> pb::ServerInfo { } #[test] -fn released_protocol_does_not_advertise_native_generate() { +fn engine_config_advertises_supported_capabilities() { let model = DiscoveredModel::from_proto(model_info(), server_info()).expect("valid discovery"); assert!( !model @@ -529,6 +529,13 @@ fn released_protocol_does_not_advertise_native_generate() { .runtime_data .contains_key("vllm_inference_v1_generate") ); + assert_eq!( + model + .engine_config() + .runtime_data + .get(dynamo_llm::lora::LORA_REQUIRES_REGISTRATION), + Some(&json!(true)) + ); } #[test] @@ -1516,6 +1523,7 @@ async fn aggregated_generation_converts_request_stream_and_usage() { assert_eq!(registration.total_kv_blocks, Some(2048)); assert_eq!(registration.max_num_seqs, Some(128)); assert_eq!(registration.max_num_batched_tokens, Some(2048)); + assert_eq!(registration.max_gpu_lora_count, Some(4)); assert_eq!(registration.data_parallel_size, Some(2)); assert_eq!(registration.data_parallel_start_rank, Some(0)); From 6e11aae9d363c588eb3f4ec895a51f44fd87d101 Mon Sep 17 00:00:00 2001 From: bzsuni <86399306+bzsuni@users.noreply.github.com> Date: Fri, 18 Sep 2026 07:10:28 +0800 Subject: [PATCH 089/191] fix(planner): handle pending decisions in virtual connector wait (#14841) Signed-off-by: bzsuni Co-authored-by: Hongkuan Zhou --- .../integration/test_virtual_connector.py | 153 +++++++++++++++++- lib/bindings/python/rust/planner.rs | 44 +++-- lib/bindings/python/src/dynamo/_core.pyi | 5 +- 3 files changed, 183 insertions(+), 19 deletions(-) diff --git a/components/src/dynamo/planner/tests/integration/test_virtual_connector.py b/components/src/dynamo/planner/tests/integration/test_virtual_connector.py index 6185210838e2..4db61b84d7a1 100644 --- a/components/src/dynamo/planner/tests/integration/test_virtual_connector.py +++ b/components/src/dynamo/planner/tests/integration/test_virtual_connector.py @@ -1,16 +1,24 @@ # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -# -# This test requires etcd and nats to be running, and the bindings to be installed -# - import asyncio +import json import logging +import os +import re +import shutil +import subprocess +import sys +import time +from contextlib import contextmanager import pytest -from dynamo._core import DistributedRuntime, VirtualConnectorClient +from dynamo._core import ( + DistributedRuntime, + VirtualConnectorClient, + VirtualConnectorCoordinator, +) from dynamo.planner import SubComponentType, TargetReplica, VirtualConnector from dynamo.planner.monitoring.worker_info import build_worker_info_from_defaults @@ -24,6 +32,80 @@ logger = logging.getLogger(__name__) NAMESPACE = "test_virtual_connector" +ETCD_STARTUP_TIMEOUT = 5 +ETCD_SHUTDOWN_TIMEOUT = 5 + + +@contextmanager +def _isolated_etcd(tmp_path): + tmp_path.mkdir() + data_dir = tmp_path / "data" + log_path = tmp_path / "etcd.log" + command = [ + "etcd", + "--logger", + "zap", + "--data-dir", + str(data_dir), + "--listen-client-urls", + "http://localhost:0", + "--advertise-client-urls", + "http://localhost:0", + "--listen-peer-urls", + "http://localhost:0", + "--initial-advertise-peer-urls", + "http://localhost:0", + "--initial-cluster", + "default=http://localhost:0", + ] + + with log_path.open("w", encoding="utf-8") as log_writer: + etcd = subprocess.Popen( + command, + stdout=subprocess.DEVNULL, + stderr=log_writer, + ) + + try: + client_port = None + deadline = time.monotonic() + ETCD_STARTUP_TIMEOUT + with log_path.open(encoding="utf-8") as log_reader: + while time.monotonic() < deadline: + if etcd.poll() is not None: + break + + line = log_reader.readline() + if not line: + time.sleep(0.01) + continue + + try: + entry = json.loads(line) + except json.JSONDecodeError: + continue + + if "serving client" not in entry.get("msg", ""): + continue + + match = re.search(r":(\d+)$", entry.get("address", "")) + if match: + client_port = int(match.group(1)) + break + + if client_port is None: + details = log_path.read_text(encoding="utf-8") + raise RuntimeError(f"etcd failed to start:\n{details}") + + yield client_port + finally: + if etcd.poll() is None: + etcd.terminate() + try: + etcd.wait(timeout=ETCD_SHUTDOWN_TIMEOUT) + except subprocess.TimeoutExpired: + etcd.kill() + etcd.wait(timeout=ETCD_SHUTDOWN_TIMEOUT) + shutil.rmtree(tmp_path, ignore_errors=True) class DefaultWorkerInfoProvider: @@ -118,3 +200,64 @@ async def async_internal(distributed_runtime): assert event.num_prefill_workers == 0 assert event.num_decode_workers == 0 await client.complete(event) + + +@pytest.mark.timeout(15) +def test_wait_for_unacknowledged_decision(tmp_path): + # DistributedRuntime is process-global, so keep it out of the pytest worker. + with _isolated_etcd(tmp_path / "etcd") as etcd_port: + subprocess.run( + [sys.executable, __file__], + check=True, + env={**os.environ, "ETCD_ENDPOINTS": f"http://localhost:{etcd_port}"}, + timeout=30, + ) + + +async def _wait_for_unacknowledged_decision(): + runtime = DistributedRuntime( + asyncio.get_running_loop(), "etcd", "tcp", event_plane="zmq" + ) + try: + coord = VirtualConnectorCoordinator(runtime, NAMESPACE, 1, 30, 5) + await coord.async_init() + await coord.update_scaling_decision(1, 2) + + # A late consumer must find the decision even though its watch starts afterward. + client = VirtualConnectorClient(runtime, NAMESPACE) + await asyncio.wait_for(client.wait(), timeout=5) + first = await client.get() + assert ( + first.num_prefill_workers, + first.num_decode_workers, + first.decision_id, + ) == (1, 2, 0) + await client.complete(first) + await coord.wait_for_scaling_completion() + + waiter = asyncio.ensure_future(client.wait()) + try: + done, _ = await asyncio.wait([waiter], timeout=0.2) + assert not done, "An acknowledged decision must not wake the next wait" + await client.complete(first) + done, _ = await asyncio.wait([waiter], timeout=0.2) + assert not done, "An acknowledgement update is not a new decision" + + await coord.update_scaling_decision(0, 3) + await asyncio.wait_for(waiter, timeout=5) + second = await client.get() + assert ( + second.num_prefill_workers, + second.num_decode_workers, + second.decision_id, + ) == (0, 3, 1) + await client.complete(second) + finally: + waiter.cancel() + await asyncio.gather(waiter, return_exceptions=True) + finally: + runtime.shutdown() + + +if __name__ == "__main__": + asyncio.run(_wait_for_unacknowledged_decision()) diff --git a/lib/bindings/python/rust/planner.rs b/lib/bindings/python/rust/planner.rs index c59d637e8ecf..4218c2f51503 100644 --- a/lib/bindings/python/rust/planner.rs +++ b/lib/bindings/python/rust/planner.rs @@ -278,7 +278,7 @@ impl InnerConnector { )); }; // Read etcd directly: the cache's initial watch snapshot is applied asynchronously. - let decision = read_decision(&self.etcd_client, &kv_cache.prefix) + let (decision, _) = read_scaling_state(&self.etcd_client, &kv_cache.prefix) .await .map_err(to_pyerr)?; *self.decision.lock() = decision; @@ -366,7 +366,7 @@ impl VirtualConnectorClient { ) } - /// Wait until a new PlannerDecision appears. Will block until there is one to fetch. + /// Wait for an unacknowledged PlannerDecision, including one already published. /// Use `get` to fetch the decision. #[pyo3(signature = ())] pub fn wait<'p>(&self, py: Python<'p>) -> PyResult> { @@ -397,7 +397,9 @@ struct InnerClient { impl InnerClient { /// Fetch the latest scaling decision async fn get(&self) -> anyhow::Result { - read_decision(&self.etcd_client, &self.key).await + read_scaling_state(&self.etcd_client, &self.key) + .await + .map(|(decision, _)| decision) } /// Mark this decision as having been handled. @@ -411,28 +413,42 @@ impl InnerClient { .await } - /// Wait for a new scaling decision. Use `get` when this returns to fetch the values. async fn wait(&self) -> anyhow::Result<()> { - let watcher = self.etcd_client.kv_watch_prefix(&self.key).await?; - let (_prefix, mut receiver) = watcher.dissolve(); tokio::select! { - _ = receiver.recv() => { - Ok(()) - } _ = self.cancellation_token.cancelled() => { anyhow::bail!("VirtualConnectorClient.wait: Runtime shutdown"); }, + result = async { + // Subscribe before reading so a decision published during the read is not lost. + let watcher = self.etcd_client.kv_watch_prefix(&self.key).await?; + let (_, mut receiver) = watcher.dissolve(); + loop { + let (decision, scaled_decision_id) = + read_scaling_state(&self.etcd_client, &self.key).await?; + if !scaling_decision_is_ready(decision.decision_id, scaled_decision_id) { + return Ok(()); + } + // ACKs, deletions and resyncs also wake the watch; recheck persisted state. + if receiver.recv().await.is_none() { + anyhow::bail!("VirtualConnectorClient.wait: Watch closed"); + } + } + } => result, } } } -async fn read_decision(client: &Client, prefix: &str) -> anyhow::Result { +async fn read_scaling_state( + client: &Client, + prefix: &str, +) -> anyhow::Result<(PlannerDecision, Option)> { let mut decision = PlannerDecision { num_prefill_workers: -1, num_decode_workers: -1, decision_id: -1, }; - // One prefix read observes all fields at the same etcd revision. + let mut scaled_decision_id = None; + // One prefix read observes the decision and its acknowledgement at the same revision. for kv in client.kv_get_prefix(prefix).await? { let key = kv.key_str()?; match key.strip_prefix(prefix) { @@ -441,7 +457,9 @@ async fn read_decision(client: &Client, prefix: &str) -> anyhow::Result decision.num_decode_workers = kv.value_str()?.parse()?, Some("decision_id") => decision.decision_id = kv.value_str()?.parse()?, - Some("scaled_decision_id") => {} + Some("scaled_decision_id") => { + scaled_decision_id = String::from_utf8_lossy(kv.value()).parse().ok(); + } _ => tracing::warn!( unexpected_key = key, root = prefix, @@ -449,7 +467,7 @@ async fn read_decision(client: &Client, prefix: &str) -> anyhow::Result None: - """Blocks until there is a new decision to fetch using 'get'""" + """Wait for an unacknowledged decision, including one already published. + + Use get() to fetch the decision. + """ ... From 1346923a4f63a172bf080c3f30651b568905ff82 Mon Sep 17 00:00:00 2001 From: Connor Carpenter Date: Thu, 17 Sep 2026 20:06:05 -0400 Subject: [PATCH 090/191] feat(vllm): add sidecar LoRA lifecycle (#13068) Signed-off-by: Julien Darve Signed-off-by: bzsuni Co-authored-by: Julien Darve Co-authored-by: bzsuni <86399306+bzsuni@users.noreply.github.com> --- lib/sidecar/vllm/Cargo.toml | 4 - lib/sidecar/vllm/README.md | 47 +- lib/sidecar/vllm/src/client.rs | 88 +++ lib/sidecar/vllm/src/convert.rs | 16 +- lib/sidecar/vllm/src/engine.rs | 572 +++++++++++++++++++- lib/sidecar/vllm/src/lib.rs | 1 + lib/sidecar/vllm/src/lora.rs | 386 ++++++++++++++ lib/sidecar/vllm/src/model.rs | 6 + lib/sidecar/vllm/src/tests.rs | 913 ++++++++++++++++++++++++++++++-- 9 files changed, 1956 insertions(+), 77 deletions(-) create mode 100644 lib/sidecar/vllm/src/lora.rs diff --git a/lib/sidecar/vllm/Cargo.toml b/lib/sidecar/vllm/Cargo.toml index 0e300cbd383a..ac46a114436a 100644 --- a/lib/sidecar/vllm/Cargo.toml +++ b/lib/sidecar/vllm/Cargo.toml @@ -11,10 +11,6 @@ homepage.workspace = true repository.workspace = true description = "Rust sidecar for vLLM's native gRPC server" -[package.metadata.cargo-machete] -# LoRA dependencies are used by the next stacked PR. -ignored = ["dynamo-runtime", "tempfile"] - [[bin]] name = "dynamo-vllm-sidecar" path = "src/main.rs" diff --git a/lib/sidecar/vllm/README.md b/lib/sidecar/vllm/README.md index 940b40ee65ac..372914e2dd8d 100644 --- a/lib/sidecar/vllm/README.md +++ b/lib/sidecar/vllm/README.md @@ -37,16 +37,61 @@ It is a standalone Rust executable and is also compiled into - Data-parallel rank routing and KV-event source discovery - Capability-gated RL pause/resume, sleep/wake, weight-transfer, and weight-version controls through native gRPC - Image, video, and audio URL and data-URI inputs; cache UUIDs remain image-only +- Dynamic LoRA load, unload, list, discovery, and request selection when vLLM enables LoRA - Opaque encoder-cache handoff through vLLM `ec_transfer_params` Audio and video gRPC inputs are not available in vLLM `0.28.0`. They require a later vLLM release. -The sidecar does not support LoRA, beam search, `n > 1`, or Dynamo tool-call and reasoning parsers. The sidecar does not support `input_audio`, `file://` media, `use_audio_in_video` or other `mm_processor_kwargs`, preprocessed multimodal features, decoded RDMA media, UUID-only media, or audio/video cache UUIDs. Encoder disaggregation is image-only in this release. Direct vLLM gRPC callers can send raw media bytes, but Dynamo's current `MultimodalData` representation cannot. Parser defaults returned by Control are intentionally not advertised to the Dynamo frontend because the current inference protocol does not preserve all parser-related request semantics. +The sidecar does not support beam search, `n > 1`, or Dynamo tool-call and reasoning parsers. The sidecar does not support `input_audio`, `file://` media, `use_audio_in_video` or other `mm_processor_kwargs`, preprocessed multimodal features, decoded RDMA media, UUID-only media, or audio/video cache UUIDs. Encoder disaggregation is image-only in this release. Direct vLLM gRPC callers can send raw media bytes, but Dynamo's current `MultimodalData` representation cannot. Parser defaults returned by Control are intentionally not advertised to the Dynamo frontend because the current inference protocol does not preserve all parser-related request semantics. In prefill/decode deployments, both engines independently prepare the original media. Reusing only the prefill-expanded prompt IDs is insufficient because KV transfer does not carry model-specific multimodal position metadata. The official `Qwen/Qwen3-ASR-1.7B` repository currently needs Rust-frontend-compatible tokenizer and config metadata (`tokenizer.json` and a top-level `vocab_size`). Dynamo's Rust chat renderer also does not yet insert the model-native audio placeholder for `audio_url` content parts; callers can supply those prompt token IDs through `nvext.token_data`. These are model-loading and request-rendering gaps rather than sidecar media-transport limitations. +### LoRA + +LoRA management is exposed only when `DYN_LORA_ENABLED` permits it, vLLM advertises +`supports_lora`, and the server reports `max_loras > 0`. + +The sidecar resolves `file://`, `hf://`, and `s3://` LoRA sources through Dynamo's shared +LoRA downloader. Local `file://` adapters pass through at their canonical absolute path, +S3 adapters use `DYN_LORA_PATH`, and Hugging Face adapters use an immutable snapshot under +the configured Hugging Face cache. vLLM and the sidecar must see every resolved directory at +the same absolute path, so mount all local paths and cache roots identically when they run in +separate containers. Set vLLM's `VLLM_RUNTIME_LORA_ALLOWED_PATH_PREFIXES` to a platform +path-list containing those shared roots, for example +`/shared/local-loras:/shared/dynamo-loras:/shared/huggingface` on Linux. + +Three behaviors intentionally differ from the legacy Python vLLM worker, because the gRPC +control surface does not expose the primitives they need: + +- **Adapter IDs are server-assigned and opaque.** The Python worker derives the ID + deterministically from the adapter name; `LoadLora` assigns it instead. Dynamo always + reports the ID returned by vLLM and never generates or infers one. +- **Prefill workers load adapters eagerly.** The Python worker can defer loading until a + request arrives because it forwards an adapter path in its internal `LoRARequest`. + `GenerateRequest` carries only `lora_name`, and vLLM rejects names it has not already + loaded, so every worker that may receive the adapter must load it up front. +- **Hot swap is not supported.** Loading a name that is already loaded is idempotent + and returns the existing ID, and `hot_swap` is reported as `false`. The gRPC API + has no atomic adapter replacement. Its pause-and-clear operation affects the + whole worker and is not coordinated with adapter lifecycle operations here. + +Custom Python-only LoRA source schemes are not available in the sidecar implementation. + +LoRA requests retain normal prefix caching. Use a new adapter name for different weights: +unloading an adapter does not invalidate KV cached under its name, so reusing that name +for different weights can reuse stale results. Safe same-name replacement is not supported. + +LoRA lifecycle mutations are serialized per worker, including source resolution. Requests +using other loaded adapters can continue during a load or unload. Multiple workers can +publish the same adapter independently. + +LoRA requires a vLLM build containing +[vllm-project/vllm#52840](https://github.com/vllm-project/vllm/pull/52840). +NIXL prefill/decode also requires the gRPC numeric-conversion fix in +[vllm-project/vllm#54814](https://github.com/vllm-project/vllm/pull/54814). + ## Run ### Native Generate compatibility diff --git a/lib/sidecar/vllm/src/client.rs b/lib/sidecar/vllm/src/client.rs index 0efb1ebad3d6..68c902aca02d 100644 --- a/lib/sidecar/vllm/src/client.rs +++ b/lib/sidecar/vllm/src/client.rs @@ -4,6 +4,7 @@ use tonic_health_v14 as tonic_health; use tonic_v14 as tonic; +use std::future::Future; use std::time::Duration; use dynamo_backend_common::DynamoError; @@ -185,6 +186,41 @@ impl VllmClient { .map(|response| response.sources) .map_err(|status| status_to_dynamo("GetKvEventSources", status)) } + + pub(crate) async fn load_lora( + &self, + lora_name: String, + source_path: String, + ) -> Result { + let mut client = self.control_client(); + lora_rpc( + "LoadLora", + client.load_lora(pb::LoadLoraRequest { + lora_name, + source_path, + }), + ) + .await + } + + pub(crate) async fn unload_lora( + &self, + lora_name: String, + ) -> Result { + let mut client = self.control_client(); + lora_rpc( + "UnloadLora", + client.unload_lora(pb::UnloadLoraRequest { lora_name }), + ) + .await + } + + pub(crate) async fn list_loras(&self) -> Result, LoraRpcError> { + let mut client = self.control_client(); + lora_rpc("ListLoras", client.list_loras(pb::ListLorasRequest {})) + .await + .map(|response| response.adapters) + } } pub(crate) fn startup_deadline(duration: Duration) -> Result { @@ -198,3 +234,55 @@ pub(crate) fn startup_deadline(duration: Duration) -> Result) -> DynamoError { dynamo_sidecar_common::protocol_error("vLLM", message) } + +// Bound how long a stalled RPC can hold the lifecycle lock. +pub(crate) const LORA_RPC_DEADLINE: Duration = Duration::from_secs(60); + +#[derive(Debug, Clone)] +pub(crate) struct LoraRpcError { + pub(crate) rpc: &'static str, + pub(crate) code: tonic::Code, + pub(crate) message: String, +} + +impl LoraRpcError { + // Other errors may follow a committed mutation; reconcile them with ListLoras. + pub(crate) fn is_definitive(&self) -> bool { + matches!( + self.code, + tonic::Code::InvalidArgument + | tonic::Code::AlreadyExists + | tonic::Code::NotFound + | tonic::Code::FailedPrecondition + ) + } + + pub(crate) fn into_dynamo(self) -> DynamoError { + status_to_dynamo(self.rpc, tonic::Status::new(self.code, self.message)) + } +} + +impl std::fmt::Display for LoraRpcError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}: {} ({:?})", self.rpc, self.message, self.code) + } +} + +async fn lora_rpc( + rpc: &'static str, + call: impl Future, tonic::Status>>, +) -> Result { + match tokio::time::timeout(LORA_RPC_DEADLINE, call).await { + Ok(Ok(response)) => Ok(response.into_inner()), + Ok(Err(status)) => Err(LoraRpcError { + rpc, + code: status.code(), + message: status.message().to_string(), + }), + Err(_) => Err(LoraRpcError { + rpc, + code: tonic::Code::DeadlineExceeded, + message: format!("{rpc} exceeded the {LORA_RPC_DEADLINE:?} lifecycle deadline"), + }), + } +} diff --git a/lib/sidecar/vllm/src/convert.rs b/lib/sidecar/vllm/src/convert.rs index f8889ddcb003..3189e9554970 100644 --- a/lib/sidecar/vllm/src/convert.rs +++ b/lib/sidecar/vllm/src/convert.rs @@ -98,6 +98,10 @@ pub(crate) fn build_generate_request( .and_then(|routing| routing.priority) .unwrap_or(0); let priority = dynamo_priority.saturating_neg(); + let lora_name = routing + .as_mut() + .and_then(|routing| routing.lora_name.take()) + .unwrap_or_default(); let cache_salt = routing .as_mut() .and_then(|routing| routing.cache_namespace.take()); @@ -164,7 +168,7 @@ pub(crate) fn build_generate_request( priority, session_id: None, media, - lora_name: String::new(), + lora_name, }) } @@ -807,16 +811,6 @@ fn validate_request( "encode requests must not include encoder_result", )); } - if request - .routing - .as_ref() - .and_then(|routing| routing.lora_name.as_deref()) - .is_some_and(|name| !name.is_empty()) - { - return Err(client::invalid_argument( - "LoRA request selection is not supported by vLLM gRPC", - )); - } if request.bootstrap_info.is_some() { return Err(client::invalid_argument( "Dynamo bootstrap handoff is not supported by the vLLM sidecar", diff --git a/lib/sidecar/vllm/src/engine.rs b/lib/sidecar/vllm/src/engine.rs index 66cba70f0a98..3bb58df00363 100644 --- a/lib/sidecar/vllm/src/engine.rs +++ b/lib/sidecar/vllm/src/engine.rs @@ -10,6 +10,8 @@ use dynamo_backend_common::{ DisaggregationMode, DynamoError, GenerateContext, KvEventSource, LLMEngine, LLMEngineOutput, LLMEngineOutputExt, RlAdminBaseUrl, WorkerConfig, usage, }; +use dynamo_llm::lora::{LoRADownloader, lora_serving_enabled}; +use dynamo_runtime::component::Endpoint; use dynamo_sidecar_common::{GrpcEndpoint, GrpcTransportConfig, SidecarStartupError}; use futures::stream::BoxStream; use serde_json::{Map, Value, json}; @@ -22,7 +24,9 @@ use crate::client::{self, CONTROL_SERVICE, INFERENCE_SERVICE, VllmClient}; use crate::convert::{ ResponseState, build_generate_request, data_parallel_rank, normalize_response_options, }; +use crate::lora::{self, build_downloader, parse_load_lora, parse_lora_name, resolve_source_path}; use crate::model::DiscoveredModel; +use crate::proto as pb; pub struct VllmSidecarEngine { endpoint: GrpcEndpoint, @@ -30,6 +34,11 @@ pub struct VllmSidecarEngine { mode: DisaggregationMode, transport: GrpcTransportConfig, client: OnceCell, + runtime_endpoint: OnceCell, + lora_downloader: OnceCell, + is_lora_enabled: bool, + is_hot_swap_requested: bool, + lifecycle: lora::LoraLifecycle, cancel: CancellationToken, } @@ -48,11 +57,16 @@ impl VllmSidecarEngine { transport: GrpcTransportConfig, ) -> Self { Self { + is_lora_enabled: lora_serving_enabled() && model.supports_lora(), + is_hot_swap_requested: is_hot_swap_requested(), endpoint, model, mode, transport, client: OnceCell::new(), + runtime_endpoint: OnceCell::new(), + lora_downloader: OnceCell::new(), + lifecycle: lora::LoraLifecycle::default(), cancel: CancellationToken::new(), } } @@ -154,6 +168,499 @@ impl VllmSidecarEngine { .get() .ok_or_else(|| client::engine_shutdown("vLLM sidecar is not started")) } + + fn ready_endpoint(&self) -> Result<&Endpoint, DynamoError> { + self.runtime_endpoint + .get() + .ok_or_else(|| client::engine_shutdown("vLLM sidecar runtime endpoint is not ready")) + } + + fn is_lora_enabled(&self) -> bool { + self.is_lora_enabled + } + + #[cfg(test)] + pub(crate) fn with_lora_enabled(mut self, enabled: bool) -> Self { + self.is_lora_enabled = enabled && self.model.supports_lora(); + self + } + + #[cfg(test)] + pub(crate) fn with_hot_swap_requested(mut self, requested: bool) -> Self { + self.is_hot_swap_requested = requested; + self + } + + async fn native_inventory(&self) -> Result, DynamoError> { + let adapters = self + .started_client()? + .list_loras() + .await + .map_err(client::LoraRpcError::into_dynamo)?; + crate::lora::validate_inventory(adapters) + } + + fn rl_updates(&self) -> Vec { + let Some(capabilities) = self.model.rl_capabilities() else { + return Vec::new(); + }; + let mut updates = vec!["update_weight_version".to_string()]; + if capabilities.weight_transfer_enabled { + updates.extend([ + "init_weight_transfer_engine".to_string(), + "start_weight_update".to_string(), + "update_weights".to_string(), + "finish_weight_update".to_string(), + ]); + if capabilities.draft_weight_updates_enabled { + updates.push("start_draft_weight_update".to_string()); + } + } + updates + } + + async fn lora_updates(&self) -> Vec { + if !self.is_lora_enabled() { + return Vec::new(); + } + if let Err(error) = self.reconcile_loaded_loras().await { + tracing::warn!( + %error, + "LoRA restart reconciliation failed; serving the base model without \ + republished adapters. Reconciliation is retried on the next lifecycle call." + ); + } + vec![ + lora::LOAD_LORA.to_string(), + lora::UNLOAD_LORA.to_string(), + lora::LIST_LORAS.to_string(), + ] + } + + async fn lora_engine_update(&self, update: &str, body: Value) -> Result { + let lora_name = body + .get("lora_name") + .and_then(Value::as_str) + .map(str::to_string); + let result = if !self.is_lora_enabled() { + Err(client::invalid_argument( + "LoRA lifecycle is not available: it requires DYN_LORA_ENABLED and a vLLM \ + server advertising LoRA support with max_loras > 0", + )) + } else { + if let Err(error) = self.reconcile_loaded_loras().await { + tracing::warn!(%error, "LoRA reconciliation is still failing; continuing with the requested operation"); + } + match update { + lora::LOAD_LORA => self.load_lora(&body).await, + lora::UNLOAD_LORA => self.unload_lora(&body).await, + lora::LIST_LORAS => self.list_loras().await, + _ => Err(client::invalid_argument(format!( + "unsupported engine update: {update}" + ))), + } + }; + Ok(match result { + Ok(response) => response, + Err(error) => json!({ + "status": "error", + "message": error.to_string(), + "lora_name": lora_name, + }), + }) + } + + async fn reconcile_loaded_loras(&self) -> Result<(), DynamoError> { + let mut state = self.lifecycle.updates.lock().await; + if state.is_reconciled { + return Ok(()); + } + let endpoint = self.ready_endpoint()?; + self.unpublish_pending_loras(endpoint, &mut state).await?; + let adapters = self.native_inventory().await?; + for adapter in &adapters { + lora::validate_adapter_name( + &adapter.lora_name, + |name| self.model.is_base_model_name(name), + &adapters, + )?; + } + let mut records = std::collections::BTreeSet::new(); + for adapter in &adapters { + self.ensure_published(endpoint, adapter, &mut state).await?; + records.insert(adapter.lora_name.clone()); + } + state + .pending_unpublish + .extend(self.lifecycle.replace_published(records).await); + self.unpublish_pending_loras(endpoint, &mut state).await?; + state.is_reconciled = true; + Ok(()) + } + + async fn load_lora(&self, body: &Value) -> Result { + let request = parse_load_lora(body)?; + let client = self.started_client()?; + let endpoint = self.ready_endpoint()?; + let mut state = self.lifecycle.updates.lock().await; + let is_reconciled = std::mem::replace(&mut state.is_reconciled, false); + let _guard = self + .lifecycle + .adapter_lock(&request.name) + .await + .write_owned() + .await; + + self.unpublish_pending_loras(endpoint, &mut state).await?; + let loaded = self.native_inventory().await?; + lora::validate_adapter_name( + &request.name, + |name| self.model.is_base_model_name(name), + &loaded, + )?; + let existing = loaded + .iter() + .find(|adapter| adapter.lora_name == request.name); + + if let Some(existing) = existing { + if self.is_hot_swap_requested { + return Err(client::invalid_argument(format!( + "LoRA adapter `{}` is already loaded; hot swap is not supported by the \ + gRPC backend. Load new weights under a different name.", + request.name + ))); + } + self.ensure_published(endpoint, existing, &mut state) + .await?; + state.is_reconciled = is_reconciled; + tracing::info!( + lora_name = %existing.lora_name, + lora_id = existing.lora_id, + "LoRA adapter already loaded" + ); + return Ok(json!({ + "status": "success", + "message": format!("LoRA adapter '{}' already loaded", existing.lora_name), + "lora_name": existing.lora_name, + "lora_id": existing.lora_id, + "hot_swap": false, + })); + } + + if loaded.len() >= self.model.max_loras() as usize { + return Err(client::invalid_argument(format!( + "LoRA capacity exceeded: at most {} adapter(s) may be loaded", + self.model.max_loras() + ))); + } + + let downloader = self + .lora_downloader + .get_or_try_init(|| async { build_downloader() }) + .await?; + tracing::info!(lora_name = %request.name, uri = %request.uri, "resolving LoRA source"); + let source_path = resolve_source_path(downloader, &request.uri).await?; + let source_path_arg = source_path.to_string_lossy().to_string(); + + let adapter = match client + .load_lora(request.name.clone(), source_path_arg) + .await + { + Ok(response) => self.expect_adapter(response.adapter, &request.name)?, + Err(error) if error.is_definitive() => { + if error.code == tonic::Code::AlreadyExists { + let observed = self.find_loaded(&request.name).await?.ok_or_else(|| { + client::protocol_error(format!( + "LoadLora reported `{}` as already loaded but ListLoras does not \ + report it", + request.name + )) + })?; + self.ensure_published(endpoint, &observed, &mut state) + .await?; + state.is_reconciled = is_reconciled; + return Ok(json!({ + "status": "success", + "message": format!("LoRA adapter '{}' already loaded", observed.lora_name), + "lora_name": observed.lora_name, + "lora_id": observed.lora_id, + "hot_swap": false, + })); + } + return Err(error.into_dynamo()); + } + Err(error) => { + tracing::warn!(%error, lora_name = %request.name, "LoadLora outcome is ambiguous; reconciling"); + match self.find_loaded(&request.name).await? { + Some(observed) + if std::path::Path::new(&observed.source_path) == source_path => + { + observed + } + Some(observed) => { + return Err(client::protocol_error(format!( + "LoRA adapter `{}` is loaded from `{}` but this load requested `{}`; \ + vLLM and Dynamo disagree about adapter state", + request.name, + observed.source_path, + source_path.display() + ))); + } + None => return Err(error.into_dynamo()), + } + } + }; + + if let Err(error) = self.ensure_published(endpoint, &adapter, &mut state).await { + tracing::error!(%error, lora_name = %adapter.lora_name, "failed to publish LoRA discovery record; rolling back the native load"); + if let Err(cleanup_error) = self.unpublish_pending_loras(endpoint, &mut state).await { + tracing::warn!(%cleanup_error, lora_name = %adapter.lora_name, "failed to remove LoRA discovery record during rollback"); + } + self.rollback_loaded_adapter(client, &adapter).await; + self.lifecycle.forget(&adapter.lora_name).await; + return Err(error); + } + state.is_reconciled = is_reconciled; + + tracing::info!(lora_name = %adapter.lora_name, lora_id = adapter.lora_id, "loaded LoRA adapter"); + Ok(json!({ + "status": "success", + "message": format!("LoRA adapter '{}' loaded successfully", adapter.lora_name), + "lora_name": adapter.lora_name, + "lora_id": adapter.lora_id, + "hot_swap": false, + })) + } + + async fn unload_lora(&self, body: &Value) -> Result { + let lora_name = parse_lora_name(body)?; + let client = self.started_client()?; + let endpoint = self.ready_endpoint()?; + let mut state = self.lifecycle.updates.lock().await; + let is_reconciled = std::mem::replace(&mut state.is_reconciled, false); + let _guard = self + .lifecycle + .adapter_lock(&lora_name) + .await + .write_owned() + .await; + + let loaded = client + .list_loras() + .await + .map_err(client::LoraRpcError::into_dynamo)?; + let Some(existing) = loaded + .iter() + .find(|adapter| adapter.lora_name == lora_name) + .cloned() + else { + let available: Vec<&str> = loaded + .iter() + .map(|adapter| adapter.lora_name.as_str()) + .collect(); + return Err(client::invalid_argument(format!( + "LoRA adapter '{lora_name}' not found. Available LoRAs: {available:?}" + ))); + }; + + // Stop routing new requests before unloading the adapter. + let is_published = self.lifecycle.is_published(&lora_name).await; + state.pending_unpublish.insert(lora_name.clone()); + lora::unpublish_lora_model(endpoint, &lora_name).await?; + state.pending_unpublish.remove(&lora_name); + self.lifecycle.forget(&lora_name).await; + + let removed = match client.unload_lora(lora_name.clone()).await { + Ok(response) => self.expect_adapter(response.adapter, &lora_name)?, + Err(error) if error.is_definitive() && error.code == tonic::Code::NotFound => { + existing.clone() + } + Err(error) => { + let is_definitive = error.is_definitive(); + let still_loaded = if is_definitive { + Some(existing.clone()) + } else { + tracing::warn!(%error, %lora_name, "UnloadLora outcome is ambiguous; reconciling"); + client + .list_loras() + .await + .map_err(client::LoraRpcError::into_dynamo)? + .into_iter() + .find(|adapter| adapter.lora_name == lora_name) + }; + match still_loaded { + Some(observed) => { + if is_published { + self.restore_unloaded_adapter(endpoint, &observed, &mut state) + .await; + } + return Err(error.into_dynamo()); + } + None => existing.clone(), + } + } + }; + + state.is_reconciled = is_reconciled; + tracing::info!(%lora_name, lora_id = removed.lora_id, "unloaded LoRA adapter"); + Ok(json!({ + "status": "success", + "message": format!("LoRA adapter '{lora_name}' unloaded successfully"), + "lora_name": lora_name, + "lora_id": removed.lora_id, + })) + } + + async fn list_loras(&self) -> Result { + let adapters = self.native_inventory().await?; + let loras: Map = adapters + .into_iter() + .map(|adapter| (adapter.lora_name, json!(adapter.lora_id))) + .collect(); + Ok(json!({ + "status": "success", + "count": loras.len(), + "loras": loras, + })) + } + + async fn admit_lora_request(&self, lora_name: &str) -> Result { + if !self.model.supports_lora() { + return Err(client::invalid_argument(format!( + "request selected LoRA adapter `{lora_name}` but this vLLM server did not \ + advertise LoRA support" + ))); + } + // Hold admission until vLLM resolves the adapter for the request. + let guard = self + .lifecycle + .adapter_lock(lora_name) + .await + .read_owned() + .await; + if !self.lifecycle.is_published(lora_name).await { + return Err(client::invalid_argument(format!( + "unknown model or LoRA adapter: '{lora_name}'" + ))); + } + Ok(guard) + } + + async fn find_loaded(&self, lora_name: &str) -> Result, DynamoError> { + Ok(self + .native_inventory() + .await? + .into_iter() + .find(|adapter| adapter.lora_name == lora_name)) + } + + fn expect_adapter( + &self, + adapter: Option, + lora_name: &str, + ) -> Result { + let adapter = adapter.ok_or_else(|| { + client::protocol_error(format!( + "vLLM returned no adapter identity for LoRA `{lora_name}`" + )) + })?; + if adapter.lora_name != lora_name { + return Err(client::protocol_error(format!( + "vLLM returned adapter `{}` for LoRA `{lora_name}`", + adapter.lora_name + ))); + } + if adapter.lora_id <= 0 { + return Err(client::protocol_error(format!( + "vLLM returned a non-positive id {} for LoRA `{lora_name}`", + adapter.lora_id + ))); + } + Ok(adapter) + } + + async fn ensure_published( + &self, + endpoint: &Endpoint, + adapter: &pb::LoraAdapter, + state: &mut lora::LoraUpdateState, + ) -> Result<(), DynamoError> { + state.pending_unpublish.insert(adapter.lora_name.clone()); + lora::publish_lora_model(endpoint, adapter, self.model.max_loras()).await?; + state.pending_unpublish.remove(&adapter.lora_name); + self.lifecycle.mark_published(&adapter.lora_name).await; + Ok(()) + } + + async fn unpublish_pending_loras( + &self, + endpoint: &Endpoint, + state: &mut lora::LoraUpdateState, + ) -> Result<(), DynamoError> { + while let Some(name) = state.pending_unpublish.first().cloned() { + lora::unpublish_lora_model(endpoint, &name).await?; + state.pending_unpublish.remove(&name); + self.lifecycle.forget(&name).await; + } + Ok(()) + } + + async fn rollback_loaded_adapter(&self, client: &VllmClient, adapter: &pb::LoraAdapter) { + match client.unload_lora(adapter.lora_name.clone()).await { + Ok(_) => tracing::info!( + lora_name = %adapter.lora_name, + "rolled back the native LoRA load" + ), + Err(error) => tracing::error!( + %error, + lora_name = %adapter.lora_name, + "failed to roll back the native LoRA load; the adapter still occupies GPU capacity" + ), + } + } + + async fn restore_unloaded_adapter( + &self, + endpoint: &Endpoint, + adapter: &pb::LoraAdapter, + state: &mut lora::LoraUpdateState, + ) { + match self.ensure_published(endpoint, adapter, state).await { + Ok(()) => { + tracing::info!( + lora_name = %adapter.lora_name, + "restored the LoRA discovery record after a failed unload" + ); + } + Err(error) => tracing::error!( + %error, + lora_name = %adapter.lora_name, + "failed to restore the LoRA discovery record; the adapter is loaded but unroutable" + ), + } + } + + async fn unpublish_all_loras(&self) { + let mut state = self.lifecycle.updates.lock().await; + state.is_reconciled = false; + let Ok(endpoint) = self.ready_endpoint() else { + return; + }; + state + .pending_unpublish + .extend(self.lifecycle.published_names().await); + for name in state.pending_unpublish.clone() { + match lora::unpublish_lora_model(endpoint, &name).await { + Ok(_) => { + state.pending_unpublish.remove(&name); + self.lifecycle.forget(&name).await; + } + Err(error) => { + tracing::warn!(%error, lora_name = %name, "failed to unpublish LoRA discovery record during shutdown"); + } + } + } + } } #[async_trait] @@ -224,25 +731,31 @@ impl LLMEngine for VllmSidecarEngine { let data_parallel_rank = data_parallel_rank(&request, self.mode); let mut proto_request = build_generate_request(request, request_id, self.mode)?; proto_request.model.clone_from(&self.model.served_name); + if self.model.is_base_model_name(&proto_request.lora_name) { + // Routers may address the base model by name through the adapter field. + proto_request.lora_name.clear(); + } + let submit = async { + let _admission = if proto_request.lora_name.is_empty() { + None + } else { + Some(self.admit_lora_request(&proto_request.lora_name).await?) + }; + client + .generate_stream(proto_request, data_parallel_rank) + .await + }; let defer_request_cancellation = self.mode.is_decode(); let stopped_ctx = ctx.inner_arc(); let shutdown = self.cancel.child_token(); let mut request_cancellation = Box::pin(async move { stopped_ctx.stopped().await }); let mut shutdown_cancellation = Box::pin(async move { shutdown.cancelled().await }); - let stream = if defer_request_cancellation { + let stream = tokio::select! { + biased; + _ = shutdown_cancellation.as_mut() => None, // Decode must reach vLLM so NIXL can release transferred KV. - tokio::select! { - biased; - _ = shutdown_cancellation.as_mut() => None, - result = client.generate_stream(proto_request, data_parallel_rank) => Some(result?), - } - } else { - tokio::select! { - biased; - _ = shutdown_cancellation.as_mut() => None, - _ = request_cancellation.as_mut() => None, - result = client.generate_stream(proto_request, data_parallel_rank) => Some(result?), - } + _ = request_cancellation.as_mut(), if !defer_request_cancellation => None, + result = submit => Some(result?), }; let Some(mut stream) = stream else { let output = cancelled(&state); @@ -466,26 +979,16 @@ impl LLMEngine for VllmSidecarEngine { } async fn supported_updates(&self) -> Result, DynamoError> { - let Some(capabilities) = self.model.rl_capabilities() else { - return Ok(Vec::new()); - }; - let mut updates = vec!["update_weight_version".to_string()]; - if capabilities.weight_transfer_enabled { - updates.extend([ - "init_weight_transfer_engine".to_string(), - "start_weight_update".to_string(), - "update_weights".to_string(), - "finish_weight_update".to_string(), - ]); - if capabilities.draft_weight_updates_enabled { - updates.push("start_draft_weight_update".to_string()); - } - } + let mut updates = self.lora_updates().await; + updates.extend(self.rl_updates()); Ok(updates) } async fn engine_update(&self, update: String, body: Value) -> Result { - if !self.supported_updates().await?.contains(&update) { + if crate::lora::is_lora_update(&update) { + return self.lora_engine_update(&update, body).await; + } + if !self.rl_updates().contains(&update) { return Ok(unsupported("update", &update)); } let body = request_object(&body)?; @@ -541,7 +1044,14 @@ impl LLMEngine for VllmSidecarEngine { } } + async fn on_endpoint_ready(&self, endpoint: Endpoint) -> Result<(), DynamoError> { + self.runtime_endpoint.set(endpoint).map_err(|_| { + client::engine_shutdown("vLLM sidecar runtime endpoint was already initialized") + }) + } + async fn cleanup(&self) -> Result<(), DynamoError> { + self.unpublish_all_loras().await; self.cancel.cancel(); Ok(()) } @@ -766,3 +1276,7 @@ fn bootstrap_discover( DiscoveredModel::from_proto(model, server) }) } + +fn is_hot_swap_requested() -> bool { + dynamo_runtime::config::env_is_truthy("DYN_LORA_HOTSWAP_ENABLED") +} diff --git a/lib/sidecar/vllm/src/lib.rs b/lib/sidecar/vllm/src/lib.rs index b2c604eccfe8..015dfa544c08 100644 --- a/lib/sidecar/vllm/src/lib.rs +++ b/lib/sidecar/vllm/src/lib.rs @@ -8,6 +8,7 @@ mod client; mod convert; mod engine; mod json; +mod lora; mod model; #[doc(hidden)] diff --git a/lib/sidecar/vllm/src/lora.rs b/lib/sidecar/vllm/src/lora.rs new file mode 100644 index 000000000000..fee28c1a2fe6 --- /dev/null +++ b/lib/sidecar/vllm/src/lora.rs @@ -0,0 +1,386 @@ +// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::collections::{BTreeSet, HashMap, HashSet}; +use std::path::PathBuf; +use std::sync::Arc; + +use dynamo_backend_common::DynamoError; +use dynamo_llm::local_model::derive_lora_suffix; +use dynamo_llm::lora::{ + HuggingFaceLoRASource, LoRACache, LoRADownloader, LoRASource, LocalLoRASource, S3LoRASource, +}; +use dynamo_llm::model_card::{LoraInfo, ModelDeploymentCard}; +use dynamo_runtime::component::Endpoint; +use dynamo_runtime::discovery::{DiscoveryInstance, DiscoveryQuery, DiscoverySpec}; +use dynamo_runtime::traits::DistributedRuntimeProvider; +use serde_json::Value; +use tokio::sync::{Mutex, OwnedRwLockReadGuard, RwLock}; + +use crate::client; +use crate::proto as pb; + +pub(crate) const LOAD_LORA: &str = "load_lora"; +pub(crate) const UNLOAD_LORA: &str = "unload_lora"; +pub(crate) const LIST_LORAS: &str = "list_loras"; + +pub(crate) fn is_lora_update(update: &str) -> bool { + matches!(update, LOAD_LORA | UNLOAD_LORA | LIST_LORAS) +} + +pub(crate) type LoraGuard = OwnedRwLockReadGuard<()>; + +#[derive(Default)] +pub(crate) struct LoraUpdateState { + pub(crate) is_reconciled: bool, + pub(crate) pending_unpublish: BTreeSet, +} + +#[derive(Default)] +pub(crate) struct LoraLifecycle { + // Serialize inventory checks through native mutation and discovery publication. + pub(crate) updates: Mutex, + locks: Mutex>>>, + published: Mutex>, +} + +impl LoraLifecycle { + pub(crate) async fn adapter_lock(&self, name: &str) -> Arc> { + let mut locks = self.locks.lock().await; + if let Some(lock) = locks.get(name) { + return lock.clone(); + } + let published = self.published.lock().await; + locks.retain(|name, lock| published.contains(name) || Arc::strong_count(lock) > 1); + let lock = Arc::new(RwLock::new(())); + locks.insert(name.to_string(), lock.clone()); + lock + } + + pub(crate) async fn mark_published(&self, name: &str) { + self.published.lock().await.insert(name.to_string()); + } + + pub(crate) async fn forget(&self, name: &str) { + self.published.lock().await.remove(name); + } + + pub(crate) async fn is_published(&self, name: &str) -> bool { + self.published.lock().await.contains(name) + } + + pub(crate) async fn published_names(&self) -> Vec { + self.published.lock().await.iter().cloned().collect() + } + + pub(crate) async fn replace_published(&self, fresh: BTreeSet) -> Vec { + let mut published = self.published.lock().await; + let stale = published.difference(&fresh).cloned().collect(); + *published = fresh; + stale + } +} + +pub(crate) fn validate_adapter_name( + name: &str, + is_base_model_name: impl Fn(&str) -> bool, + loaded: &[pb::LoraAdapter], +) -> Result<(), DynamoError> { + if is_base_model_name(name) { + return Err(client::invalid_argument(format!( + "LoRA adapter `{name}` conflicts with the base model name or one of its aliases" + ))); + } + let Some(suffix) = derive_lora_suffix(Some(name)).filter(|suffix| !suffix.is_empty()) else { + return Err(client::invalid_argument(format!( + "LoRA adapter `{name}` does not produce a usable discovery suffix" + ))); + }; + if let Some(existing) = loaded.iter().find(|adapter| { + adapter.lora_name != name + && derive_lora_suffix(Some(&adapter.lora_name)).as_deref() == Some(suffix.as_str()) + }) { + return Err(client::invalid_argument(format!( + "LoRA adapter `{name}` derives the discovery suffix `{suffix}`, which is already \ + used by loaded adapter `{}`; publishing it would overwrite that adapter's \ + discovery record", + existing.lora_name + ))); + } + Ok(()) +} + +pub(crate) fn validate_inventory( + adapters: Vec, +) -> Result, DynamoError> { + let mut seen_names = HashSet::new(); + let mut seen_ids = HashSet::new(); + let mut seen_suffixes = HashSet::new(); + for adapter in &adapters { + if adapter.lora_name.trim().is_empty() { + return Err(client::protocol_error( + "ListLoras returned an adapter with an empty name", + )); + } + if adapter.lora_id <= 0 { + return Err(client::protocol_error(format!( + "ListLoras returned adapter `{}` with a non-positive id {}", + adapter.lora_name, adapter.lora_id + ))); + } + if adapter.source_path.trim().is_empty() { + return Err(client::protocol_error(format!( + "ListLoras returned adapter `{}` without a source path", + adapter.lora_name + ))); + } + if !seen_names.insert(adapter.lora_name.as_str()) { + return Err(client::protocol_error(format!( + "ListLoras returned duplicate adapter name `{}`", + adapter.lora_name + ))); + } + if !seen_ids.insert(adapter.lora_id) { + return Err(client::protocol_error(format!( + "ListLoras returned duplicate adapter id {}", + adapter.lora_id + ))); + } + let Some(suffix) = + derive_lora_suffix(Some(&adapter.lora_name)).filter(|suffix| !suffix.is_empty()) + else { + return Err(client::protocol_error(format!( + "adapter `{}` does not produce a usable discovery suffix", + adapter.lora_name + ))); + }; + if !seen_suffixes.insert(suffix.clone()) { + return Err(client::protocol_error(format!( + "adapter `{}` derives the discovery suffix `{suffix}`, which another loaded \ + adapter already uses", + adapter.lora_name + ))); + } + } + let mut adapters = adapters; + adapters.sort_by(|left, right| left.lora_name.cmp(&right.lora_name)); + Ok(adapters) +} + +#[derive(Debug, Eq, PartialEq)] +pub(crate) struct LoadLoraUpdate { + pub(crate) name: String, + pub(crate) uri: String, +} + +pub(crate) fn parse_load_lora(body: &Value) -> Result { + let name = parse_lora_name(body)?; + let uri = body + .pointer("/source/uri") + .and_then(Value::as_str) + .map(str::trim) + .filter(|uri| !uri.is_empty()) + .ok_or_else(|| client::invalid_argument("source.uri must be a non-empty string"))?; + if !["file://", "hf://", "s3://"] + .iter() + .any(|scheme| uri.starts_with(scheme)) + { + return Err(client::invalid_argument( + "source.uri must use the file://, hf://, or s3:// scheme", + )); + } + if uri.starts_with("file://") && (!uri.starts_with("file:///") || uri.contains(['?', '#'])) { + return Err(client::invalid_argument( + "file source.uri must contain an absolute local path without a host, query, or fragment", + )); + } + Ok(LoadLoraUpdate { + name: name.trim().to_string(), + uri: uri.to_string(), + }) +} + +pub(crate) fn parse_lora_name(body: &Value) -> Result { + body.get("lora_name") + .and_then(Value::as_str) + .filter(|name| !name.trim().is_empty()) + .map(str::to_string) + .ok_or_else(|| client::invalid_argument("lora_name must be a non-empty string")) +} + +pub(crate) fn build_downloader() -> Result { + let mut sources: Vec> = vec![ + Arc::new(LocalLoRASource::new()), + Arc::new(HuggingFaceLoRASource::from_env()), + ]; + sources.push(Arc::new(S3LoRASource::from_env())); + let cache = LoRACache::from_env() + .map_err(|error| client::invalid_argument(format!("invalid LoRA cache: {error}")))?; + Ok(LoRADownloader::new(sources, cache)) +} + +pub(crate) async fn resolve_source_path( + downloader: &LoRADownloader, + uri: &str, +) -> Result { + let downloaded = downloader.download_if_needed(uri).await.map_err(|error| { + client::protocol_error(format!("failed to resolve LoRA source `{uri}`: {error}")) + })?; + let canonical = tokio::fs::canonicalize(&downloaded) + .await + .map_err(|error| { + client::protocol_error(format!( + "failed to canonicalize LoRA directory `{}`: {error}", + downloaded.display() + )) + })?; + let is_valid = LoRACache::validate_path(&canonical).map_err(|error| { + client::protocol_error(format!( + "failed to validate LoRA directory `{}`: {error}", + canonical.display() + )) + })?; + if !is_valid { + return Err(client::invalid_argument(format!( + "LoRA directory `{}` must contain adapter_config.json and adapter weights", + canonical.display() + ))); + } + Ok(canonical) +} + +pub(crate) async fn publish_lora_model( + endpoint: &Endpoint, + adapter: &pb::LoraAdapter, + max_loras: u32, +) -> Result<(), DynamoError> { + let discovery = endpoint.drt().discovery(); + let discovery = discovery.as_ref(); + let endpoint_id = endpoint.id(); + let namespace = endpoint_id.namespace.as_str(); + let component = endpoint_id.component.as_str(); + let endpoint_name = endpoint_id.name.as_str(); + let instance_id = endpoint.drt().connection_id(); + + let models = discovery + .list(DiscoveryQuery::EndpointModels { + namespace: namespace.to_string(), + component: component.to_string(), + endpoint: endpoint_name.to_string(), + }) + .await + .map_err(|error| { + client::protocol_error(format!("failed to query base model discovery: {error}")) + })?; + let suffix = derive_lora_suffix(Some(&adapter.lora_name)); + for instance in &models { + if matches!(instance, DiscoveryInstance::Model { + instance_id: candidate_id, model_suffix, .. + } if *candidate_id == instance_id && *model_suffix == suffix) + { + let card = instance + .deserialize_model::() + .map_err(|error| { + client::protocol_error(format!("invalid LoRA model card: {error}")) + })?; + if card.name() != adapter.lora_name { + return Err(client::invalid_argument(format!( + "LoRA adapter `{}` collides with an existing discovery record", + adapter.lora_name + ))); + } + } + } + let base = models + .iter() + .find(|instance| { + matches!( + instance, + DiscoveryInstance::Model { + instance_id: candidate_id, + model_suffix: None, + .. + } if *candidate_id == instance_id + ) + }) + .ok_or_else(|| client::protocol_error("base model is not registered in discovery"))?; + let mut card = base + .deserialize_model::() + .map_err(|error| client::protocol_error(format!("invalid base model card: {error}")))?; + if card.source_path.is_none() { + card.source_path = Some(card.name().to_string()); + } + card.set_name(&adapter.lora_name); + card.aliases.clear(); + card.lora = Some(LoraInfo { + name: adapter.lora_name.clone(), + max_gpu_lora_count: Some(max_loras), + }); + card.user_data = Some(serde_json::json!({ + "lora_adapter": true, + "lora_id": adapter.lora_id, + })); + let spec = DiscoverySpec::from_model_with_suffix( + namespace.to_string(), + component.to_string(), + endpoint_name.to_string(), + &card, + suffix, + ) + .map_err(|error| client::protocol_error(format!("failed to build LoRA model card: {error}")))?; + discovery.register(spec).await.map_err(|error| { + client::protocol_error(format!("failed to publish LoRA model: {error}")) + })?; + Ok(()) +} + +pub(crate) async fn unpublish_lora_model( + endpoint: &Endpoint, + lora_name: &str, +) -> Result { + let discovery = endpoint.drt().discovery(); + let discovery = discovery.as_ref(); + let endpoint_id = endpoint.id(); + let namespace = endpoint_id.namespace.as_str(); + let component = endpoint_id.component.as_str(); + let endpoint_name = endpoint_id.name.as_str(); + let instance_id = endpoint.drt().connection_id(); + + let Some(suffix) = derive_lora_suffix(Some(lora_name)).filter(|suffix| !suffix.is_empty()) + else { + return Ok(false); + }; + let models = discovery + .list(DiscoveryQuery::EndpointModels { + namespace: namespace.to_string(), + component: component.to_string(), + endpoint: endpoint_name.to_string(), + }) + .await + .map_err(|error| { + client::protocol_error(format!("failed to query LoRA discovery: {error}")) + })?; + let instance = models.into_iter().find(|instance| { + matches!( + instance, + DiscoveryInstance::Model { + instance_id: candidate_id, + model_suffix, + .. + } if *candidate_id == instance_id && model_suffix.as_deref() == Some(suffix.as_str()) + ) + }); + let Some(instance) = instance else { + return Ok(false); + }; + let card = instance + .deserialize_model::() + .map_err(|error| client::protocol_error(format!("invalid LoRA model card: {error}")))?; + if card.name() != lora_name || card.lora.as_ref().is_none_or(|lora| lora.name != lora_name) { + return Ok(false); + } + discovery.unregister(instance).await.map_err(|error| { + client::protocol_error(format!("failed to unpublish LoRA model: {error}")) + })?; + Ok(true) +} diff --git a/lib/sidecar/vllm/src/model.rs b/lib/sidecar/vllm/src/model.rs index 10a827b1dc26..d6127bb6f206 100644 --- a/lib/sidecar/vllm/src/model.rs +++ b/lib/sidecar/vllm/src/model.rs @@ -211,6 +211,12 @@ impl DiscoveredModel { self.identity.max_loras } + pub(crate) fn is_base_model_name(&self, name: &str) -> bool { + name == self.identity.source + || name == self.identity.served_name + || self.identity.aliases.iter().any(|alias| alias == name) + } + fn total_kv_blocks_per_rank(&self) -> Option { let total_kv_blocks = nonzero(self.server.total_kv_blocks)?; let data_parallel_size = u64::from(self.data_parallel_size()); diff --git a/lib/sidecar/vllm/src/tests.rs b/lib/sidecar/vllm/src/tests.rs index 1536e5ee692f..4a1c2fdcbd7e 100644 --- a/lib/sidecar/vllm/src/tests.rs +++ b/lib/sidecar/vllm/src/tests.rs @@ -10,7 +10,7 @@ use std::net::SocketAddr; use std::num::NonZeroUsize; use std::pin::Pin; use std::sync::Arc; -use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::atomic::{AtomicBool, AtomicI64, Ordering}; use dynamo_backend_common::engine::RoutingHints; use dynamo_backend_common::{ @@ -18,6 +18,11 @@ use dynamo_backend_common::{ MultimodalData, OutputOptions, PrefillResult, PreprocessedRequest, RlAdminBaseUrl, RlWorkerMetadata, SamplingOptions, StopConditions, }; +use dynamo_llm::model_card::ModelDeploymentCard; +use dynamo_runtime::discovery::{DiscoveryInstance, DiscoveryQuery, DiscoverySpec}; +use dynamo_runtime::distributed::DistributedConfig; +use dynamo_runtime::traits::DistributedRuntimeProvider; +use dynamo_runtime::{DistributedRuntime, Runtime}; use dynamo_sidecar_common::{GrpcEndpoint, GrpcTransportConfig}; use futures::{Stream, StreamExt}; use serde_json::json; @@ -39,6 +44,8 @@ struct FakeVllm { sequence_outputs: Option>, requests: Arc>>, data_parallel_rank_metadata: Arc>>>, + loras: Arc>>, + next_lora_id: Arc, peers: Arc>>, model_info_override: Arc>>, server_info_override: Arc>>, @@ -56,11 +63,34 @@ struct FakeVllm { paused: Arc, sleeping_tags: Arc>>, weight_version: Arc>, + load_commit_error: Arc, + unload_commit_error: Arc, + lora_disabled: Arc, + is_lora_unavailable: Arc, + hold_load: Arc, + load_pending: Arc, + release_load: Arc, + hold_unload: Arc, + unload_pending: Arc, + release_unload: Arc, encoder_response: Arc, omit_encoder_metadata: Arc, } impl FakeVllm { + #[allow(clippy::result_large_err)] + fn ensure_lora_enabled(&self) -> Result<(), Status> { + if self.is_lora_unavailable.load(Ordering::SeqCst) { + return Err(Status::unavailable("injected LoRA outage")); + } + if self.lora_disabled.load(Ordering::SeqCst) { + return Err(Status::failed_precondition( + "engine was not started with LoRA enabled", + )); + } + Ok(()) + } + async fn record_control(&self, name: &str, body: serde_json::Value) { self.control_calls .lock() @@ -116,6 +146,25 @@ impl pb::inference_server::Inference for FakeVllm { if self.reject.load(Ordering::SeqCst) { return Err(Status::invalid_argument("rejected by fake vLLM")); } + if !request.lora_name.is_empty() { + if self.lora_disabled.load(Ordering::SeqCst) { + return Err(Status::failed_precondition( + "engine was not started with LoRA enabled", + )); + } + if !self + .loras + .lock() + .await + .iter() + .any(|adapter| adapter.lora_name == request.lora_name) + { + return Err(Status::not_found(format!( + "LoRA adapter `{}` is not loaded", + request.lora_name + ))); + } + } let prompt_tokens = match request.prompt.as_ref() { Some(pb::generate_request::Prompt::TokenIds(ids)) => ids.ids.len() as u32, @@ -246,33 +295,6 @@ impl pb::inference_server::Inference for FakeVllm { #[tonic::async_trait] impl pb::control_server::Control for FakeVllm { - async fn load_lora( - &self, - _request: Request, - ) -> Result, Status> { - Err(Status::unimplemented( - "LoRA is not supported by the mock server", - )) - } - - async fn unload_lora( - &self, - _request: Request, - ) -> Result, Status> { - Err(Status::unimplemented( - "LoRA is not supported by the mock server", - )) - } - - async fn list_loras( - &self, - _request: Request, - ) -> Result, Status> { - Err(Status::unimplemented( - "LoRA is not supported by the mock server", - )) - } - async fn get_server_info( &self, _request: Request, @@ -306,6 +328,82 @@ impl pb::control_server::Control for FakeVllm { Ok(Response::new(pb::AbortResponse {})) } + async fn load_lora( + &self, + request: Request, + ) -> Result, Status> { + let request = request.into_inner(); + self.record_control("load_lora", json!({"lora_name": request.lora_name})) + .await; + self.ensure_lora_enabled()?; + if self.hold_load.load(Ordering::SeqCst) { + self.load_pending.store(true, Ordering::SeqCst); + self.release_load.notified().await; + self.load_pending.store(false, Ordering::SeqCst); + } + let mut loras = self.loras.lock().await; + if let Some(existing) = loras + .iter() + .find(|loaded| loaded.lora_name == request.lora_name) + { + return Err(Status::already_exists(format!( + "adapter `{}` is already loaded with id {}", + existing.lora_name, existing.lora_id + ))); + } + let adapter = pb::LoraAdapter { + lora_id: self.next_lora_id.fetch_add(1, Ordering::SeqCst) + 1, + lora_name: request.lora_name, + source_path: request.source_path, + }; + loras.push(adapter.clone()); + if self.load_commit_error.swap(false, Ordering::SeqCst) { + return Err(Status::unavailable("injected error after load commit")); + } + Ok(Response::new(pb::LoadLoraResponse { + adapter: Some(adapter), + })) + } + + async fn unload_lora( + &self, + request: Request, + ) -> Result, Status> { + let name = request.into_inner().lora_name; + self.record_control("unload_lora", json!({"lora_name": name})) + .await; + self.ensure_lora_enabled()?; + if self.hold_unload.load(Ordering::SeqCst) { + self.unload_pending.store(true, Ordering::SeqCst); + self.release_unload.notified().await; + self.ensure_lora_enabled()?; + return Err(Status::failed_precondition("injected unload rejection")); + } + let mut loras = self.loras.lock().await; + let index = loras + .iter() + .position(|adapter| adapter.lora_name == name) + .ok_or_else(|| Status::not_found("adapter not found"))?; + let adapter = loras.remove(index); + if self.unload_commit_error.swap(false, Ordering::SeqCst) { + return Err(Status::unavailable("injected error after unload commit")); + } + Ok(Response::new(pb::UnloadLoraResponse { + adapter: Some(adapter), + })) + } + + async fn list_loras( + &self, + _request: Request, + ) -> Result, Status> { + self.record_control("list_loras", json!({})).await; + self.ensure_lora_enabled()?; + Ok(Response::new(pb::ListLorasResponse { + adapters: self.loras.lock().await.clone(), + })) + } + async fn get_kv_event_sources( &self, _request: Request, @@ -1147,6 +1245,43 @@ fn engine_with_server_info( ) } +async fn runtime_endpoint(namespace: &str) -> dynamo_runtime::component::Endpoint { + runtime_endpoint_with_config(namespace, DistributedConfig::process_local()).await +} + +async fn runtime_endpoint_with_config( + namespace: &str, + config: DistributedConfig, +) -> dynamo_runtime::component::Endpoint { + let runtime = Runtime::from_current().expect("current runtime"); + let drt = DistributedRuntime::new(runtime, config) + .await + .expect("process-local DRT"); + let endpoint = drt + .namespace(namespace) + .expect("namespace") + .component("backend") + .expect("component") + .endpoint("generate"); + let mut base = ModelDeploymentCard::with_name_only("model-source"); + base.source_path = Some("model-source".to_string()); + endpoint + .drt() + .discovery() + .register( + DiscoverySpec::from_model( + namespace.to_string(), + "backend".to_string(), + "generate".to_string(), + &base, + ) + .expect("base discovery spec"), + ) + .await + .expect("register base model"); + endpoint +} + async fn engine_from_args( endpoint: &str, ) -> (VllmSidecarEngine, dynamo_backend_common::WorkerConfig) { @@ -2204,6 +2339,724 @@ async fn encode_terminal_without_encoder_cache_metadata_is_rejected() { ); } +fn lora_engine(endpoint: &str) -> VllmSidecarEngine { + engine(endpoint, DisaggregationMode::Aggregated, 1, model_info()).with_lora_enabled(true) +} + +fn adapter_dir() -> tempfile::TempDir { + let dir = tempfile::tempdir().expect("adapter tempdir"); + std::fs::write(dir.path().join("adapter_config.json"), "{}").unwrap(); + std::fs::write(dir.path().join("adapter_model.safetensors"), []).unwrap(); + dir +} + +fn load_body(name: &str, dir: &tempfile::TempDir) -> serde_json::Value { + json!({ + "lora_name": name, + "source": {"uri": format!("file://{}", dir.path().display())}, + }) +} + +async fn load( + engine: &VllmSidecarEngine, + name: &str, + dir: &tempfile::TempDir, +) -> serde_json::Value { + engine + .engine_update("load_lora".to_string(), load_body(name, dir)) + .await + .expect("load_lora envelope") +} + +async fn unload(engine: &VllmSidecarEngine, name: &str) -> serde_json::Value { + engine + .engine_update("unload_lora".to_string(), json!({"lora_name": name})) + .await + .expect("unload_lora envelope") +} + +async fn lora_siblings(endpoint: &dynamo_runtime::component::Endpoint) -> Vec { + let endpoint_id = endpoint.id(); + endpoint + .drt() + .discovery() + .list(DiscoveryQuery::EndpointModels { + namespace: endpoint_id.namespace.clone(), + component: endpoint_id.component.clone(), + endpoint: endpoint_id.name.clone(), + }) + .await + .unwrap() + .into_iter() + .filter_map(|instance| match instance { + DiscoveryInstance::Model { + model_suffix: Some(suffix), + .. + } => Some(suffix), + _ => None, + }) + .collect() +} + +async fn started_lora_engine( + service: FakeVllm, + namespace: &str, +) -> ( + FakeServer, + VllmSidecarEngine, + dynamo_runtime::component::Endpoint, +) { + let server = FakeServer::start(service).await; + let engine = lora_engine(&server.endpoint); + engine.start(0).await.expect("start"); + let endpoint = runtime_endpoint(namespace).await; + engine + .on_endpoint_ready(endpoint.clone()) + .await + .expect("endpoint ready"); + (server, engine, endpoint) +} + +#[tokio::test] +async fn lora_enablement_and_rl_coexistence() { + let server = FakeServer::start(FakeVllm::default()).await; + for (flag, support, capacity) in [ + (false, true, 4), + (true, false, 4), + (true, true, 0), + (true, true, 4), + ] { + let mut model = model_info(); + model.supports_lora = support; + *server.service.model_info_override.lock().await = Some(model.clone()); + let mut info = server_info(); + info.max_loras = capacity; + *server.service.server_info_override.lock().await = Some(info.clone()); + let engine = engine_with_server_info( + &server.endpoint, + DisaggregationMode::Aggregated, + 1, + model, + info, + ) + .with_lora_enabled(flag); + let registration = engine.start(0).await.unwrap(); + let updates = engine.supported_updates().await.unwrap(); + assert_eq!( + updates.contains(&"load_lora".to_string()), + flag && support && capacity > 0 + ); + assert!(updates.contains(&"update_weight_version".to_string())); + if support && capacity > 0 { + assert_eq!(registration.llm.unwrap().max_gpu_lora_count, Some(capacity)); + } + if !support { + assert!( + generate_error(&engine, "math-r8") + .await + .to_string() + .contains("did not advertise") + ); + } + } +} + +#[tokio::test] +async fn lora_lifecycle_preserves_identity_and_routing_metadata() { + use dynamo_llm::worker_type::WorkerType; + let (server, engine, endpoint) = + started_lora_engine(FakeVllm::default(), "lora_lifecycle").await; + for card in endpoint + .drt() + .discovery() + .list(DiscoveryQuery::AllModels) + .await + .unwrap() + { + endpoint.drt().discovery().unregister(card).await.unwrap(); + } + let mut base = ModelDeploymentCard::with_name_only("model-source"); + base.worker_type = Some(WorkerType::Decode); + base.needs = vec![vec![WorkerType::Prefill]]; + base.kv_cache_block_size = 32; + base.migration_limit = 3; + base.runtime_config.context_length = Some(2048); + base.runtime_config.max_num_seqs = Some(8); + endpoint + .drt() + .discovery() + .register( + DiscoverySpec::from_model( + "lora_lifecycle".into(), + "backend".into(), + "generate".into(), + &base, + ) + .unwrap(), + ) + .await + .unwrap(); + let dir = adapter_dir(); + let first = load(&engine, "math-r8", &dir).await; + assert_eq!(first["status"], "success"); + let assigned = server.service.loras.lock().await[0].lora_id; + assert_eq!(first["lora_id"], assigned); + assert!( + !crate::lora::unpublish_lora_model(&endpoint, "Math-R8") + .await + .unwrap() + ); + let cards = endpoint + .drt() + .discovery() + .list(DiscoveryQuery::AllModels) + .await + .unwrap(); + let sibling = cards + .iter() + .find(|card| { + matches!( + card, + DiscoveryInstance::Model { + model_suffix: Some(_), + .. + } + ) + }) + .unwrap() + .deserialize_model::() + .unwrap(); + assert_eq!(sibling.worker_type, base.worker_type); + assert_eq!(sibling.needs, base.needs); + assert_eq!(sibling.kv_cache_block_size, base.kv_cache_block_size); + assert_eq!(sibling.runtime_config, base.runtime_config); + assert_eq!(sibling.migration_limit, base.migration_limit); + assert_eq!(sibling.source_path.as_deref(), Some("model-source")); + assert!(sibling.aliases.is_empty()); + assert_eq!(sibling.lora.unwrap().max_gpu_lora_count, Some(4)); + assert_eq!(sibling.user_data.unwrap()["lora_id"], assigned); + for source in [&dir, &adapter_dir()] { + assert_eq!(load(&engine, "math-r8", source).await["lora_id"], assigned); + } + assert_eq!( + collect(&engine, request_selecting("math-r8")).await.len(), + 1 + ); + { + let requests = server.service.requests.lock().await; + let sent = requests.last().unwrap(); + assert_eq!(sent.lora_name, "math-r8"); + assert!(!sent.kv.as_ref().unwrap().bypass_prefix_cache); + } + let listed = engine + .engine_update("list_loras".into(), json!({})) + .await + .unwrap(); + assert_eq!(listed["loras"], json!({"math-r8": assigned})); + assert_eq!(unload(&engine, "math-r8").await["status"], "success"); + assert!(lora_siblings(&endpoint).await.is_empty()); + assert!(server.service.loras.lock().await.is_empty()); + assert!( + generate_error(&engine, "math-r8") + .await + .to_string() + .contains("unknown model") + ); +} + +#[tokio::test] +async fn replicas_publish_the_same_adapter_independently() { + let registry = tempfile::tempdir().unwrap(); + let config = || DistributedConfig { + discovery_backend: dynamo_runtime::distributed::DiscoveryBackend::KvStore( + dynamo_runtime::storage::kv::Selector::File(registry.path().to_path_buf()), + ), + ..DistributedConfig::process_local() + }; + let first_endpoint = runtime_endpoint_with_config("lora_replicas", config()).await; + let second_endpoint = runtime_endpoint_with_config("lora_replicas", config()).await; + assert_ne!( + first_endpoint.drt().connection_id(), + second_endpoint.drt().connection_id() + ); + let first_server = FakeServer::start(FakeVllm::default()).await; + let second_server = FakeServer::start(FakeVllm::default()).await; + let first = lora_engine(&first_server.endpoint); + let second = lora_engine(&second_server.endpoint); + first.start(0).await.unwrap(); + second.start(0).await.unwrap(); + first + .on_endpoint_ready(first_endpoint.clone()) + .await + .unwrap(); + second.on_endpoint_ready(second_endpoint).await.unwrap(); + let dir = adapter_dir(); + assert_eq!(load(&first, "math-r8", &dir).await["status"], "success"); + assert_eq!(load(&second, "math-r8", &dir).await["status"], "success"); + assert_eq!(lora_siblings(&first_endpoint).await.len(), 2); + assert_eq!(unload(&first, "math-r8").await["status"], "success"); + assert_eq!(lora_siblings(&first_endpoint).await.len(), 1); + assert_eq!( + collect(&second, request_selecting("math-r8")).await.len(), + 1 + ); +} + +async fn wait_pending(pending: &AtomicBool, future: &mut (impl std::future::Future + Unpin)) { + tokio::time::timeout(std::time::Duration::from_secs(5), async { + while !pending.load(Ordering::SeqCst) { + assert!( + futures::future::poll_immediate(&mut *future) + .await + .is_none() + ); + tokio::task::yield_now().await; + } + }) + .await + .expect("RPC reached barrier"); +} + +#[tokio::test] +async fn concurrent_lora_loads_use_fresh_inventory() { + for (second_name, capacity, expected) in [ + ("Math-R8", 4, "error"), + ("other", 1, "error"), + ("other", 2, "success"), + ] { + let service = FakeVllm::default(); + service.hold_load.store(true, Ordering::SeqCst); + let server = FakeServer::start(service).await; + let mut info = server_info(); + info.max_loras = capacity; + *server.service.server_info_override.lock().await = Some(info.clone()); + let engine = engine_with_server_info( + &server.endpoint, + DisaggregationMode::Aggregated, + 1, + model_info(), + info, + ) + .with_lora_enabled(true); + engine.start(0).await.unwrap(); + engine + .on_endpoint_ready(runtime_endpoint("lora_concurrent").await) + .await + .unwrap(); + engine.supported_updates().await.unwrap(); + let dir = adapter_dir(); + let mut first = Box::pin(load(&engine, "math-r8", &dir)); + wait_pending(&server.service.load_pending, &mut first).await; + let calls_before = server.service.control_calls.lock().await.len(); + let mut second = Box::pin(load(&engine, second_name, &dir)); + assert!(futures::future::poll_immediate(&mut second).await.is_none()); + for _ in 0..20 { + assert!(futures::future::poll_immediate(&mut second).await.is_none()); + tokio::task::yield_now().await; + } + assert_eq!( + server.service.control_calls.lock().await.len(), + calls_before + ); + server.service.hold_load.store(false, Ordering::SeqCst); + server.service.release_load.notify_one(); + assert_eq!(first.await["status"], "success"); + let result = second.await; + assert_eq!(result["status"], expected, "{result}"); + assert_eq!( + server.service.loras.lock().await.len(), + if expected == "success" { 2 } else { 1 } + ); + assert_eq!(load(&engine, "model-alias", &dir).await["status"], "error"); + } +} + +#[tokio::test] +async fn same_name_load_and_unload_are_ordered() { + let service = FakeVllm::default(); + service.hold_load.store(true, Ordering::SeqCst); + let (server, engine, _) = started_lora_engine(service, "lora_order").await; + engine.supported_updates().await.unwrap(); + let dir = adapter_dir(); + let mut loading = Box::pin(load(&engine, "math-r8", &dir)); + wait_pending(&server.service.load_pending, &mut loading).await; + let mut unloading = Box::pin(unload(&engine, "math-r8")); + assert!( + futures::future::poll_immediate(&mut unloading) + .await + .is_none() + ); + assert!( + !server + .service + .control_calls + .lock() + .await + .iter() + .any(|(name, _)| name == "unload_lora") + ); + server.service.hold_load.store(false, Ordering::SeqCst); + server.service.release_load.notify_one(); + assert_eq!(loading.await["status"], "success"); + assert_eq!(unloading.await["status"], "success"); + assert!(server.service.loras.lock().await.is_empty()); +} + +#[tokio::test] +async fn committed_lora_errors_reconcile_against_inventory() { + let service = FakeVllm::default(); + service.load_commit_error.store(true, Ordering::SeqCst); + service.unload_commit_error.store(true, Ordering::SeqCst); + let (server, engine, endpoint) = started_lora_engine(service, "lora_ambiguous").await; + let dir = adapter_dir(); + assert_eq!(load(&engine, "math-r8", &dir).await["status"], "success"); + assert_eq!(server.service.loras.lock().await.len(), 1); + assert_eq!(lora_siblings(&endpoint).await.len(), 1); + assert_eq!(unload(&engine, "math-r8").await["status"], "success"); + assert!(server.service.loras.lock().await.is_empty()); + assert!(lora_siblings(&endpoint).await.is_empty()); +} + +#[tokio::test] +async fn publication_failure_rolls_back_a_committed_native_load() { + let service = FakeVllm::default(); + service.hold_load.store(true, Ordering::SeqCst); + let (server, engine, endpoint) = started_lora_engine(service, "lora_rollback").await; + engine.supported_updates().await.unwrap(); + let dir = adapter_dir(); + let mut loading = Box::pin(load(&engine, "math-r8", &dir)); + wait_pending(&server.service.load_pending, &mut loading).await; + // Simulate a record written before publication returns an error. + crate::lora::publish_lora_model( + &endpoint, + &pb::LoraAdapter { + lora_id: 1, + lora_name: "math-r8".into(), + source_path: dir.path().to_string_lossy().into_owned(), + }, + 4, + ) + .await + .unwrap(); + let discovery = endpoint.drt().discovery(); + for card in discovery.list(DiscoveryQuery::AllModels).await.unwrap() { + if matches!( + &card, + DiscoveryInstance::Model { + model_suffix: None, + .. + } + ) { + discovery.unregister(card).await.unwrap(); + } + } + assert_eq!(lora_siblings(&endpoint).await.len(), 1); + server.service.hold_load.store(false, Ordering::SeqCst); + server.service.release_load.notify_one(); + assert_eq!(loading.await["status"], "error"); + let calls: Vec<_> = server + .service + .control_calls + .lock() + .await + .iter() + .filter(|(name, _)| name != "list_loras") + .map(|(name, _)| name.clone()) + .collect(); + assert_eq!(calls, ["load_lora", "unload_lora"]); + assert_eq!(server.service.next_lora_id.load(Ordering::SeqCst), 1); + assert!(server.service.loras.lock().await.is_empty()); + assert!(lora_siblings(&endpoint).await.is_empty()); +} + +#[tokio::test] +async fn failed_unload_restores_the_removed_discovery_record() { + for is_unavailable in [false, true] { + let (server, engine, endpoint) = + started_lora_engine(FakeVllm::default(), "lora_restore").await; + let dir = adapter_dir(); + assert_eq!(load(&engine, "math-r8", &dir).await["status"], "success"); + server.service.hold_unload.store(true, Ordering::SeqCst); + let mut unloading = Box::pin(unload(&engine, "math-r8")); + wait_pending(&server.service.unload_pending, &mut unloading).await; + assert!(lora_siblings(&endpoint).await.is_empty()); + assert_eq!(server.service.loras.lock().await.len(), 1); + server + .service + .is_lora_unavailable + .store(is_unavailable, Ordering::SeqCst); + server.service.release_unload.notify_one(); + assert_eq!(unloading.await["status"], "error"); + if is_unavailable { + assert!(lora_siblings(&endpoint).await.is_empty()); + server + .service + .is_lora_unavailable + .store(false, Ordering::SeqCst); + assert_eq!( + engine + .engine_update("list_loras".into(), json!({})) + .await + .unwrap()["status"], + "success" + ); + } + assert_eq!(lora_siblings(&endpoint).await.len(), 1); + assert_eq!( + collect(&engine, request_selecting("math-r8")).await.len(), + 1 + ); + } +} + +#[tokio::test] +async fn restart_republishes_resident_adapters_and_shutdown_unpublishes() { + let service = FakeVllm::default(); + service.loras.lock().await.push(pb::LoraAdapter { + lora_id: 7, + lora_name: "math-r8".into(), + source_path: "/shared/loras/math-r8".into(), + }); + let (server, engine, endpoint) = started_lora_engine(service, "lora_restart").await; + assert!( + generate_error(&engine, "math-r8") + .await + .to_string() + .contains("unknown model") + ); + assert!(server.service.requests.lock().await.is_empty()); + engine.supported_updates().await.unwrap(); + assert_eq!(lora_siblings(&endpoint).await.len(), 1); + assert_eq!( + collect(&engine, request_selecting("math-r8")).await.len(), + 1 + ); + engine.cleanup().await.unwrap(); + assert!(lora_siblings(&endpoint).await.is_empty()); + assert_eq!(server.service.loras.lock().await[0].lora_id, 7); +} + +#[tokio::test] +async fn restart_inventory_keeps_base_serving_and_allows_exact_unload() { + for (conflicting_name, initial_siblings) in + [("Math-R8", 0), ("model-source", 0), ("math-r8 ", 2)] + { + let service = FakeVllm::default(); + for (id, name) in [(1, "math-r8"), (2, conflicting_name)] { + service.loras.lock().await.push(pb::LoraAdapter { + lora_id: id, + lora_name: name.into(), + source_path: "/shared/loras/math-r8".into(), + }); + } + let (server, engine, endpoint) = + started_lora_engine(service, "lora_restart_collision").await; + assert!( + engine + .supported_updates() + .await + .unwrap() + .contains(&"load_lora".to_string()) + ); + assert_eq!(lora_siblings(&endpoint).await.len(), initial_siblings); + assert_eq!(collect(&engine, request()).await.len(), 1); + assert_eq!(unload(&engine, conflicting_name).await["status"], "success"); + assert_eq!(server.service.loras.lock().await.len(), 1); + assert_eq!(server.service.loras.lock().await[0].lora_name, "math-r8"); + assert_eq!( + engine + .engine_update("list_loras".into(), json!({})) + .await + .unwrap()["status"], + "success" + ); + assert_eq!(lora_siblings(&endpoint).await.len(), 1); + } +} + +#[tokio::test] +async fn base_aliases_and_unknown_adapters_do_not_select_lora() { + let (server, engine, _) = + started_lora_engine(FakeVllm::default(), "lora_admission_names").await; + for name in ["model-source", "served-model", "model-alias"] { + assert_eq!(collect(&engine, request_selecting(name)).await.len(), 1); + let requests = server.service.requests.lock().await; + let sent = requests.last().unwrap(); + assert_eq!(sent.lora_name, ""); + assert!(!sent.kv.as_ref().unwrap().bypass_prefix_cache); + } + let count = server.service.requests.lock().await.len(); + assert!( + generate_error(&engine, "absent") + .await + .to_string() + .contains("unknown model") + ); + assert_eq!(server.service.requests.lock().await.len(), count); +} + +#[tokio::test] +async fn hot_swap_is_refused() { + let server = FakeServer::start(FakeVllm::default()).await; + let engine = lora_engine(&server.endpoint).with_hot_swap_requested(true); + engine.start(0).await.unwrap(); + engine + .on_endpoint_ready(runtime_endpoint("lora_hot_swap").await) + .await + .unwrap(); + let dir = adapter_dir(); + assert_eq!(load(&engine, "math-r8", &dir).await["status"], "success"); + let response = load(&engine, "math-r8", &dir).await; + assert_eq!(response["status"], "error"); + assert!( + response["message"] + .as_str() + .unwrap() + .contains("hot swap is not supported") + ); +} + +fn request_selecting(lora_name: &str) -> PreprocessedRequest { + let mut value = serde_json::to_value(request()).unwrap(); + value["routing"]["lora_name"] = json!(lora_name); + value["extra_args"]["bypass_prefix_cache"] = json!(false); + serde_json::from_value(value).unwrap() +} + +fn generate_context() -> GenerateContext { + GenerateContext::new(dynamo_backend_common::testing::mock_context(), None) +} + +async fn generate_error( + engine: &VllmSidecarEngine, + name: &str, +) -> dynamo_backend_common::DynamoError { + match engine + .generate(request_selecting(name), generate_context()) + .await + { + Ok(_) => panic!("unexpected generation success for {name}"), + Err(error) => error, + } +} + +#[tokio::test] +async fn lora_lock_registry_reclaims_idle_entries_without_losing_waiters() { + let lifecycle = crate::lora::LoraLifecycle::default(); + let mut published = Vec::new(); + for name in ["loaded-a", "loaded-b"] { + lifecycle.mark_published(name).await; + published.push((name, Arc::downgrade(&lifecycle.adapter_lock(name).await))); + } + let lock = lifecycle.adapter_lock("active").await; + let active = Arc::downgrade(&lock); + let held = lock.clone().write_owned().await; + let mut waiting = Box::pin(lock.read_owned()); + assert!( + futures::future::poll_immediate(&mut waiting) + .await + .is_none() + ); + + let mut idle = std::sync::Weak::new(); + for name in ["idle-a", "idle-b", "idle-c"] { + let lock = lifecycle.adapter_lock(name).await; + assert!(idle.upgrade().is_none()); + idle = Arc::downgrade(&lock); + } + drop(held); + drop(lifecycle.adapter_lock("after-release").await); + let lock = lifecycle.adapter_lock("active").await; + assert!(Arc::ptr_eq(&lock, &active.upgrade().unwrap())); + let guard = waiting.await; + assert!(lock.try_write().is_err()); + drop(guard); + drop(lock); + drop(lifecycle.adapter_lock("after-waiter").await); + assert!(active.upgrade().is_none()); + + for (name, lock) in &published { + assert!(Arc::ptr_eq( + &lifecycle.adapter_lock(name).await, + &lock.upgrade().expect("published lock must survive churn") + )); + lifecycle.forget(name).await; + } + drop(lifecycle.adapter_lock("after-unload").await); + assert!(published.iter().all(|(_, lock)| lock.upgrade().is_none())); +} + +#[tokio::test] +async fn request_admission_and_unload_cannot_race() { + let (server, engine, endpoint) = + started_lora_engine(FakeVllm::default(), "lora_admission").await; + let dir = adapter_dir(); + assert_eq!(load(&engine, "math-r8", &dir).await["status"], "success"); + server + .service + .hang_before_headers + .store(true, Ordering::SeqCst); + let mut generating = + Box::pin(engine.generate(request_selecting("math-r8"), generate_context())); + wait_pending(&server.service.headers_pending, &mut generating).await; + server + .service + .headers_pending + .store(false, Ordering::SeqCst); + let mut second = Box::pin(engine.generate(request_selecting("math-r8"), generate_context())); + wait_pending(&server.service.headers_pending, &mut second).await; + assert_eq!(server.service.requests.lock().await.len(), 2); + let mut unloading = Box::pin(unload(&engine, "math-r8")); + assert!( + futures::future::poll_immediate(&mut unloading) + .await + .is_none() + ); + let context = dynamo_backend_common::testing::mock_context(); + let mut waiting = Box::pin(engine.generate( + request_selecting("math-r8"), + GenerateContext::new(context.clone(), None), + )); + assert!( + futures::future::poll_immediate(&mut waiting) + .await + .is_none() + ); + context.stop_generating(); + let mut cancelled = tokio::time::timeout(std::time::Duration::from_secs(2), waiting) + .await + .expect("cancel admission wait") + .unwrap(); + assert_eq!( + cancelled.next().await.unwrap().unwrap().finish_reason, + Some(FinishReason::Cancelled) + ); + assert_eq!(server.service.requests.lock().await.len(), 2); + assert!( + !server + .service + .control_calls + .lock() + .await + .iter() + .any(|(name, _)| name == "unload_lora") + ); + assert_eq!(lora_siblings(&endpoint).await.len(), 1); + server + .service + .hang_before_headers + .store(false, Ordering::SeqCst); + server.service.release_headers.notify_waiters(); + let _stream = generating.await.unwrap(); + assert!( + futures::future::poll_immediate(&mut unloading) + .await + .is_none() + ); + let _second_stream = second.await.unwrap(); + assert_eq!(unloading.await["status"], "success"); +} + #[tokio::test] async fn grpc_request_errors_are_propagated() { let service = FakeVllm::default(); @@ -2579,10 +3432,6 @@ async fn unsupported_features_fail_before_rpc_submission() { )])); requests.push(audio_uuid); - let mut lora_request = serde_json::to_value(request()).expect("serialize request"); - lora_request["routing"] = json!({"lora_name": "adapter"}); - requests.push(serde_json::from_value(lora_request).expect("deserialize request")); - let mut mismatched_cache_salt = request(); mismatched_cache_salt.extra_args.as_mut().unwrap()["nvext"]["cache_salt"] = json!("different-cache-salt"); From 3264d8f73388ed21772deed2b6baa2c9ed4b0567 Mon Sep 17 00:00:00 2001 From: Jasim Kareem Date: Thu, 17 Sep 2026 17:09:21 -0700 Subject: [PATCH 091/191] fix(vllm/omni): pass response_format into video EngineInputs (#14667) (#14844) --- .../src/dynamo/vllm/omni/omni_handler.py | 1 + .../vllm/tests/omni/test_omni_handler.py | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/components/src/dynamo/vllm/omni/omni_handler.py b/components/src/dynamo/vllm/omni/omni_handler.py index 287c921f124b..b054891c981c 100644 --- a/components/src/dynamo/vllm/omni/omni_handler.py +++ b/components/src/dynamo/vllm/omni/omni_handler.py @@ -798,5 +798,6 @@ def _engine_inputs_from_video( sampling_params_list=sampling_params_list, request_type=RequestType.VIDEO_GENERATION, fps=fps, + response_format=req.response_format, lora_request=lora_request, ) diff --git a/components/src/dynamo/vllm/tests/omni/test_omni_handler.py b/components/src/dynamo/vllm/tests/omni/test_omni_handler.py index 4d625589cd25..555cc36c2d8f 100644 --- a/components/src/dynamo/vllm/tests/omni/test_omni_handler.py +++ b/components/src/dynamo/vllm/tests/omni/test_omni_handler.py @@ -203,6 +203,27 @@ async def test_video_generation(self): assert inputs.request_type == RequestType.VIDEO_GENERATION assert inputs.prompt["prompt"] == "a drone" assert inputs.fps > 0 + assert inputs.response_format is None + + @pytest.mark.parametrize("response_format", ["b64_json", "url"]) + @pytest.mark.asyncio + async def test_video_and_i2v_forward_response_format(self, response_format): + """T2V and I2V share _engine_inputs_from_video; b64_json must not be dropped.""" + handler = _make_handler() + req = NvCreateVideoRequest( + prompt="a drone", + model="test-model", + size="832x480", + response_format=response_format, + ) + t2v = await handler.build_engine_inputs(req, RequestType.VIDEO_GENERATION) + assert t2v.response_format == response_format + + img = Image.new("RGB", (64, 64), color="red") + i2v = await handler.build_engine_inputs( + req, RequestType.VIDEO_GENERATION, image=img + ) + assert i2v.response_format == response_format @pytest.mark.asyncio async def test_audio_generation_delegates_toaudio(self): From d07fcea4b8e4ad0645d5ca4d54143dfe7003e247 Mon Sep 17 00:00:00 2001 From: Pavithra Vijayakrishnan <160681768+pvijayakrish@users.noreply.github.com> Date: Thu, 17 Sep 2026 17:23:10 -0700 Subject: [PATCH 092/191] chore: bump version to 1.6.0 post 1.5.0 branch cut (#15009) Signed-off-by: pvijayakrish Signed-off-by: Pavithra Vijayakrishnan <160681768+pvijayakrish@users.noreply.github.com> Co-authored-by: Claude Opus 5 (1M context) --- Cargo.lock | 74 +++++++++---------- Cargo.toml | 40 +++++----- deploy/helm/charts/platform/Chart.yaml | 4 +- deploy/helm/charts/platform/README.md | 4 +- .../platform/components/operator/Chart.yaml | 4 +- lib/bindings/kvbm/Cargo.lock | 22 +++--- lib/bindings/kvbm/Cargo.toml | 2 +- lib/bindings/kvbm/pyproject.toml | 2 +- lib/bindings/python/Cargo.lock | 36 ++++----- lib/bindings/python/Cargo.toml | 2 +- lib/bindings/python/pyproject.toml | 2 +- lib/kvbm-common/Cargo.toml | 2 +- lib/kvbm-engine/Cargo.toml | 2 +- lib/kvbm-kernels/Cargo.toml | 2 +- lib/kvbm-logical/Cargo.toml | 2 +- lib/kvbm-physical/Cargo.toml | 2 +- lib/runtime/examples/Cargo.lock | 10 +-- lib/runtime/examples/Cargo.toml | 2 +- pyproject.toml | 4 +- 19 files changed, 109 insertions(+), 109 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f84b8155ba24..d78cd55aa392 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2392,7 +2392,7 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "dynamo-backend-common" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -2420,7 +2420,7 @@ dependencies = [ [[package]] name = "dynamo-bench" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "blake3", @@ -2462,7 +2462,7 @@ dependencies = [ [[package]] name = "dynamo-custom-policy-builtin" -version = "1.5.0" +version = "1.6.0" dependencies = [ "dynamo-kv-router", "serde", @@ -2471,7 +2471,7 @@ dependencies = [ [[package]] name = "dynamo-custom-policy-example-catalog" -version = "1.5.0" +version = "1.6.0" dependencies = [ "dynamo-custom-policy-example-disagg-filter-score-pick", "dynamo-custom-policy-example-simple-filter-score-pick", @@ -2482,7 +2482,7 @@ dependencies = [ [[package]] name = "dynamo-custom-policy-example-disagg-filter-score-pick" -version = "1.5.0" +version = "1.6.0" dependencies = [ "dynamo-kv-router", "serde", @@ -2490,7 +2490,7 @@ dependencies = [ [[package]] name = "dynamo-custom-policy-example-epp" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "dynamo-custom-policy-example-catalog", @@ -2501,7 +2501,7 @@ dependencies = [ [[package]] name = "dynamo-custom-policy-example-simple-filter-score-pick" -version = "1.5.0" +version = "1.6.0" dependencies = [ "dynamo-kv-router", "serde", @@ -2509,7 +2509,7 @@ dependencies = [ [[package]] name = "dynamo-custom-policy-example-simple-stacked-score-pick" -version = "1.5.0" +version = "1.6.0" dependencies = [ "dynamo-kv-router", "serde", @@ -2517,7 +2517,7 @@ dependencies = [ [[package]] name = "dynamo-custom-policy-example-soft-pin-repin" -version = "1.5.0" +version = "1.6.0" dependencies = [ "dynamo-kv-router", "serde", @@ -2525,7 +2525,7 @@ dependencies = [ [[package]] name = "dynamo-data-gen" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "blake3", @@ -2539,7 +2539,7 @@ dependencies = [ [[package]] name = "dynamo-epp-sidecar" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-trait", @@ -2558,7 +2558,7 @@ dependencies = [ [[package]] name = "dynamo-ext-proc" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-trait", @@ -2599,7 +2599,7 @@ dependencies = [ [[package]] name = "dynamo-kv-hashing" -version = "1.5.0" +version = "1.6.0" dependencies = [ "derive_builder", "dynamo-tokens", @@ -2611,7 +2611,7 @@ dependencies = [ [[package]] name = "dynamo-kv-router" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "arc-swap", @@ -2659,7 +2659,7 @@ dependencies = [ [[package]] name = "dynamo-llm" -version = "1.5.0" +version = "1.6.0" dependencies = [ "aligned-vec", "anyhow", @@ -2778,7 +2778,7 @@ dependencies = [ [[package]] name = "dynamo-memory" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "cudarc", @@ -2797,7 +2797,7 @@ dependencies = [ [[package]] name = "dynamo-mocker" -version = "1.5.0" +version = "1.6.0" dependencies = [ "aisimulate-core", "anyhow", @@ -2831,7 +2831,7 @@ dependencies = [ [[package]] name = "dynamo-mocker-backend" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -2927,7 +2927,7 @@ dependencies = [ [[package]] name = "dynamo-rl" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "axum 0.8.4", @@ -2944,7 +2944,7 @@ dependencies = [ [[package]] name = "dynamo-runtime" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "arc-swap", @@ -3029,7 +3029,7 @@ dependencies = [ [[package]] name = "dynamo-sglang-mocker" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -3049,7 +3049,7 @@ dependencies = [ [[package]] name = "dynamo-sglang-sidecar" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -3073,7 +3073,7 @@ dependencies = [ [[package]] name = "dynamo-sidecar-common" -version = "1.5.0" +version = "1.6.0" dependencies = [ "clap", "dynamo-backend-common", @@ -3110,7 +3110,7 @@ dependencies = [ [[package]] name = "dynamo-tokens" -version = "1.5.0" +version = "1.6.0" dependencies = [ "bs58", "bytemuck", @@ -3128,7 +3128,7 @@ dependencies = [ [[package]] name = "dynamo-trtllm-sidecar" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -3149,14 +3149,14 @@ dependencies = [ [[package]] name = "dynamo-truthy" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", ] [[package]] name = "dynamo-vllm-mocker" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -3181,7 +3181,7 @@ dependencies = [ [[package]] name = "dynamo-vllm-sidecar" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -3206,7 +3206,7 @@ dependencies = [ [[package]] name = "dynamo-worker-selection-policy-catalog" -version = "1.5.0" +version = "1.6.0" dependencies = [ "dynamo-kv-router", ] @@ -5331,7 +5331,7 @@ dependencies = [ [[package]] name = "kvbm-common" -version = "1.5.0" +version = "1.6.0" dependencies = [ "dynamo-tokens", "serde", @@ -5339,7 +5339,7 @@ dependencies = [ [[package]] name = "kvbm-config" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "dynamo-memory", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "kvbm-consolidator" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "dynamo-kv-hashing", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "kvbm-engine" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-nats", @@ -5424,7 +5424,7 @@ dependencies = [ [[package]] name = "kvbm-kernels" -version = "1.5.0" +version = "1.6.0" dependencies = [ "clap", "cudarc", @@ -5435,7 +5435,7 @@ dependencies = [ [[package]] name = "kvbm-logical" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "kvbm-physical" -version = "1.5.0" +version = "1.6.0" dependencies = [ "aligned-vec", "anyhow", @@ -5514,7 +5514,7 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libdynamo_llm" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-once-cell", diff --git a/Cargo.toml b/Cargo.toml index a6562434b27f..0ae3e1f40176 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,7 @@ members = [ resolver = "3" [workspace.package] -version = "1.5.0" +version = "1.6.0" edition = "2024" description = "Dynamo Inference Framework" authors = ["NVIDIA Inc. "] @@ -59,18 +59,18 @@ keywords = ["llm", "genai", "inference", "nvidia", "distributed"] aisimulate-core = { version = "=0.12.0" } # Local crates -dynamo-runtime = { path = "lib/runtime", version = "1.5.0" } -dynamo-llm = { path = "lib/llm", version = "1.5.0" } -dynamo-rl = { path = "lib/rl", version = "1.5.0" } +dynamo-runtime = { path = "lib/runtime", version = "1.6.0" } +dynamo-llm = { path = "lib/llm", version = "1.6.0" } +dynamo-rl = { path = "lib/rl", version = "1.6.0" } dynamo-tokenizers = { version = "=1.8.1" } dynamo-renderer = { version = "=5.1.2" } -dynamo-tokens = { path = "lib/tokens", version = "1.5.0" } -dynamo-truthy = { path = "lib/truthy", version = "1.5.0" } -dynamo-data-gen = { path = "lib/data-gen", version = "1.5.0" } -dynamo-kv-hashing = { path = "lib/kv-hashing", version = "1.5.0" } -dynamo-memory = { path = "lib/memory", version = "1.5.0" } -dynamo-mocker = { path = "lib/mocker", version = "1.5.0" } -dynamo-kv-router = { path = "lib/kv-router", version = "1.5.0" } +dynamo-tokens = { path = "lib/tokens", version = "1.6.0" } +dynamo-truthy = { path = "lib/truthy", version = "1.6.0" } +dynamo-data-gen = { path = "lib/data-gen", version = "1.6.0" } +dynamo-kv-hashing = { path = "lib/kv-hashing", version = "1.6.0" } +dynamo-memory = { path = "lib/memory", version = "1.6.0" } +dynamo-mocker = { path = "lib/mocker", version = "1.6.0" } +dynamo-kv-router = { path = "lib/kv-router", version = "1.6.0" } dynamo-protocols = { version = "=5.4.1" } dynamo-parsers = { version = "8.1.0" } @@ -78,18 +78,18 @@ dynamo-parsers = { version = "8.1.0" } # web: https://crates.io/crates/dynamo-parsers-v2/versions # sparse index: curl https://index.crates.io/dy/na/dynamo-parsers-v2 (one JSON line per release; read the "vers" field) dynamo-parsers-v2 = { version = "0.3.2" } -dynamo-backend-common = { path = "lib/backend-common", version = "1.5.0" } -dynamo-sidecar-common = { path = "lib/sidecar/common", version = "1.5.0" } +dynamo-backend-common = { path = "lib/backend-common", version = "1.6.0" } +dynamo-sidecar-common = { path = "lib/sidecar/common", version = "1.6.0" } # kvbm -kvbm-common = { path = "lib/kvbm-common", version = "1.5.0" } -kvbm-config = { path = "lib/kvbm-config", version = "1.5.0" } -kvbm-consolidator = { path = "lib/kvbm-consolidator", version = "1.5.0" } -kvbm-engine = { path = "lib/kvbm-engine", version = "1.5.0" } -kvbm-kernels = { path = "lib/kvbm-kernels", version = "1.5.0" } -kvbm-logical = { path = "lib/kvbm-logical", version = "1.5.0" } -kvbm-physical = { path = "lib/kvbm-physical", version = "1.5.0" } +kvbm-common = { path = "lib/kvbm-common", version = "1.6.0" } +kvbm-config = { path = "lib/kvbm-config", version = "1.6.0" } +kvbm-consolidator = { path = "lib/kvbm-consolidator", version = "1.6.0" } +kvbm-engine = { path = "lib/kvbm-engine", version = "1.6.0" } +kvbm-kernels = { path = "lib/kvbm-kernels", version = "1.6.0" } +kvbm-logical = { path = "lib/kvbm-logical", version = "1.6.0" } +kvbm-physical = { path = "lib/kvbm-physical", version = "1.6.0" } # velo velo = { version = "0.12.0" } diff --git a/deploy/helm/charts/platform/Chart.yaml b/deploy/helm/charts/platform/Chart.yaml index ce5dc77d0e29..5496e9305ad3 100644 --- a/deploy/helm/charts/platform/Chart.yaml +++ b/deploy/helm/charts/platform/Chart.yaml @@ -19,13 +19,13 @@ maintainers: url: https://www.nvidia.com description: A Helm chart for NVIDIA Dynamo Platform. type: application -version: 1.5.0 +version: 1.6.0 # Kubernetes 1.30 enables CRD validation ratcheting by default; generated CRDs use optionalOldSelf. kubeVersion: ">=1.30.0-0" home: https://nvidia.com dependencies: - name: dynamo-operator - version: 1.5.0 + version: 1.6.0 repository: file://components/operator condition: dynamo-operator.enabled - name: nats diff --git a/deploy/helm/charts/platform/README.md b/deploy/helm/charts/platform/README.md index fd7b93a021cd..311baf30551a 100644 --- a/deploy/helm/charts/platform/README.md +++ b/deploy/helm/charts/platform/README.md @@ -19,7 +19,7 @@ limitations under the License. A Helm chart for NVIDIA Dynamo Platform. -![Version: 1.5.0](https://img.shields.io/badge/Version-1.5.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) +![Version: 1.6.0](https://img.shields.io/badge/Version-1.6.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ## 🚀 Overview @@ -146,7 +146,7 @@ Kubernetes: `>=1.30.0-0` | Repository | Name | Version | |------------|------|---------| -| file://components/operator | dynamo-operator | 1.5.0 | +| file://components/operator | dynamo-operator | 1.6.0 | | https://charts.bitnami.com/bitnami | etcd | 12.0.18 | | https://nats-io.github.io/k8s/helm/charts/ | nats | 1.3.2 | | oci://ghcr.io/ai-dynamo/grove | grove(grove-charts) | v0.1.0-alpha.13 | diff --git a/deploy/helm/charts/platform/components/operator/Chart.yaml b/deploy/helm/charts/platform/components/operator/Chart.yaml index 541038d9a303..a2db1afc04e7 100644 --- a/deploy/helm/charts/platform/components/operator/Chart.yaml +++ b/deploy/helm/charts/platform/components/operator/Chart.yaml @@ -27,11 +27,11 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 1.5.0 +version: 1.6.0 # Kubernetes 1.30 enables CRD validation ratcheting by default; generated CRDs use optionalOldSelf. kubeVersion: ">=1.30.0-0" # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "1.5.0" +appVersion: "1.6.0" diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index 98fe092b284f..e875d87b93be 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -2056,7 +2056,7 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "dynamo-data-gen" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "blake3", @@ -2069,7 +2069,7 @@ dependencies = [ [[package]] name = "dynamo-kv-hashing" -version = "1.5.0" +version = "1.6.0" dependencies = [ "derive_builder", "dynamo-tokens", @@ -2080,7 +2080,7 @@ dependencies = [ [[package]] name = "dynamo-kv-router" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "arc-swap", @@ -2123,7 +2123,7 @@ dependencies = [ [[package]] name = "dynamo-llm" -version = "1.5.0" +version = "1.6.0" dependencies = [ "aligned-vec", "anyhow", @@ -2222,7 +2222,7 @@ dependencies = [ [[package]] name = "dynamo-memory" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "cudarc", @@ -2239,7 +2239,7 @@ dependencies = [ [[package]] name = "dynamo-mocker" -version = "1.5.0" +version = "1.6.0" dependencies = [ "aisimulate-core", "anyhow", @@ -2346,7 +2346,7 @@ dependencies = [ [[package]] name = "dynamo-rl" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "axum", @@ -2361,7 +2361,7 @@ dependencies = [ [[package]] name = "dynamo-runtime" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "arc-swap", @@ -2461,7 +2461,7 @@ dependencies = [ [[package]] name = "dynamo-tokens" -version = "1.5.0" +version = "1.6.0" dependencies = [ "bs58", "bytemuck", @@ -2476,7 +2476,7 @@ dependencies = [ [[package]] name = "dynamo-truthy" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", ] @@ -4292,7 +4292,7 @@ dependencies = [ [[package]] name = "kvbm-py3" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "cudarc", diff --git a/lib/bindings/kvbm/Cargo.toml b/lib/bindings/kvbm/Cargo.toml index 0915bef8d439..aa3509b9482d 100644 --- a/lib/bindings/kvbm/Cargo.toml +++ b/lib/bindings/kvbm/Cargo.toml @@ -5,7 +5,7 @@ [package] name = "kvbm-py3" -version = "1.5.0" +version = "1.6.0" edition = "2024" authors = ["NVIDIA"] license = "Apache-2.0" diff --git a/lib/bindings/kvbm/pyproject.toml b/lib/bindings/kvbm/pyproject.toml index a79022ac8e08..ed5328ff5f15 100644 --- a/lib/bindings/kvbm/pyproject.toml +++ b/lib/bindings/kvbm/pyproject.toml @@ -16,7 +16,7 @@ [project] name = "kvbm" -version = "1.5.0" +version = "1.6.0" description = "Dynamo KVBM" readme = "README.md" authors = [ diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index ce8c3bea4add..7911e4b0c10c 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -2079,7 +2079,7 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "dynamo-backend-common" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -2103,7 +2103,7 @@ dependencies = [ [[package]] name = "dynamo-custom-policy-builtin" -version = "1.5.0" +version = "1.6.0" dependencies = [ "dynamo-kv-router", "serde", @@ -2111,7 +2111,7 @@ dependencies = [ [[package]] name = "dynamo-data-gen" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "blake3", @@ -2124,7 +2124,7 @@ dependencies = [ [[package]] name = "dynamo-kv-hashing" -version = "1.5.0" +version = "1.6.0" dependencies = [ "derive_builder", "dynamo-tokens", @@ -2135,7 +2135,7 @@ dependencies = [ [[package]] name = "dynamo-kv-router" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "arc-swap", @@ -2178,7 +2178,7 @@ dependencies = [ [[package]] name = "dynamo-llm" -version = "1.5.0" +version = "1.6.0" dependencies = [ "aligned-vec", "anyhow", @@ -2282,7 +2282,7 @@ dependencies = [ [[package]] name = "dynamo-memory" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "cudarc", @@ -2299,7 +2299,7 @@ dependencies = [ [[package]] name = "dynamo-mocker" -version = "1.5.0" +version = "1.6.0" dependencies = [ "aisimulate-core", "anyhow", @@ -2388,7 +2388,7 @@ dependencies = [ [[package]] name = "dynamo-py3" -version = "1.5.0" +version = "1.6.0" dependencies = [ "aisimulate-core", "anyhow", @@ -2452,7 +2452,7 @@ dependencies = [ [[package]] name = "dynamo-rl" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "axum", @@ -2467,7 +2467,7 @@ dependencies = [ [[package]] name = "dynamo-runtime" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "arc-swap", @@ -2545,7 +2545,7 @@ dependencies = [ [[package]] name = "dynamo-sglang-sidecar" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -2569,7 +2569,7 @@ dependencies = [ [[package]] name = "dynamo-sidecar-common" -version = "1.5.0" +version = "1.6.0" dependencies = [ "clap", "dynamo-backend-common", @@ -2606,7 +2606,7 @@ dependencies = [ [[package]] name = "dynamo-tokens" -version = "1.5.0" +version = "1.6.0" dependencies = [ "bs58", "bytemuck", @@ -2621,7 +2621,7 @@ dependencies = [ [[package]] name = "dynamo-trtllm-sidecar" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -2641,14 +2641,14 @@ dependencies = [ [[package]] name = "dynamo-truthy" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", ] [[package]] name = "dynamo-vllm-sidecar" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "async-stream", @@ -2671,7 +2671,7 @@ dependencies = [ [[package]] name = "dynamo-worker-selection-policy-catalog" -version = "1.5.0" +version = "1.6.0" dependencies = [ "dynamo-kv-router", ] diff --git a/lib/bindings/python/Cargo.toml b/lib/bindings/python/Cargo.toml index ff24d9e9218d..8ead4c72ec59 100644 --- a/lib/bindings/python/Cargo.toml +++ b/lib/bindings/python/Cargo.toml @@ -7,7 +7,7 @@ [package] name = "dynamo-py3" -version = "1.5.0" +version = "1.6.0" edition = "2024" authors = ["NVIDIA"] license = "Apache-2.0" diff --git a/lib/bindings/python/pyproject.toml b/lib/bindings/python/pyproject.toml index 2f9a3162c2a1..de317cb7b048 100644 --- a/lib/bindings/python/pyproject.toml +++ b/lib/bindings/python/pyproject.toml @@ -16,7 +16,7 @@ [project] name = "ai-dynamo-runtime" -version = "1.5.0" +version = "1.6.0" description = "Dynamo Inference Framework Runtime" readme = "README.md" authors = [ diff --git a/lib/kvbm-common/Cargo.toml b/lib/kvbm-common/Cargo.toml index 52c4cc1df73a..12e7086e0717 100644 --- a/lib/kvbm-common/Cargo.toml +++ b/lib/kvbm-common/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "kvbm-common" -version = "1.5.0" +version = "1.6.0" edition.workspace = true description.workspace = true authors.workspace = true diff --git a/lib/kvbm-engine/Cargo.toml b/lib/kvbm-engine/Cargo.toml index db3e18e5d703..88cede11ee09 100644 --- a/lib/kvbm-engine/Cargo.toml +++ b/lib/kvbm-engine/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "kvbm-engine" -version = "1.5.0" +version = "1.6.0" edition.workspace = true authors.workspace = true license.workspace = true diff --git a/lib/kvbm-kernels/Cargo.toml b/lib/kvbm-kernels/Cargo.toml index ec7f22d01626..0043b35e594e 100644 --- a/lib/kvbm-kernels/Cargo.toml +++ b/lib/kvbm-kernels/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "kvbm-kernels" -version = "1.5.0" +version = "1.6.0" edition.workspace = true authors.workspace = true license.workspace = true diff --git a/lib/kvbm-logical/Cargo.toml b/lib/kvbm-logical/Cargo.toml index ae232a028ac7..9927513fb38b 100644 --- a/lib/kvbm-logical/Cargo.toml +++ b/lib/kvbm-logical/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "kvbm-logical" -version = "1.5.0" +version = "1.6.0" edition.workspace = true authors.workspace = true license.workspace = true diff --git a/lib/kvbm-physical/Cargo.toml b/lib/kvbm-physical/Cargo.toml index a4e0f585e0c2..84bb2ec1ae14 100644 --- a/lib/kvbm-physical/Cargo.toml +++ b/lib/kvbm-physical/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "kvbm-physical" -version = "1.5.0" +version = "1.6.0" edition.workspace = true authors.workspace = true license.workspace = true diff --git a/lib/runtime/examples/Cargo.lock b/lib/runtime/examples/Cargo.lock index 23f376c5d65b..0ca080bb76ce 100644 --- a/lib/runtime/examples/Cargo.lock +++ b/lib/runtime/examples/Cargo.lock @@ -784,7 +784,7 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "dynamo-runtime" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "arc-swap", @@ -861,7 +861,7 @@ dependencies = [ [[package]] name = "dynamo-truthy" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", ] @@ -1303,7 +1303,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hello_world" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "dynamo-runtime", @@ -3261,7 +3261,7 @@ dependencies = [ [[package]] name = "service_metrics" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "dynamo-runtime", @@ -3454,7 +3454,7 @@ dependencies = [ [[package]] name = "system_metrics" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "dynamo-runtime", diff --git a/lib/runtime/examples/Cargo.toml b/lib/runtime/examples/Cargo.toml index 180ba5e5c38e..9c77648fe699 100644 --- a/lib/runtime/examples/Cargo.toml +++ b/lib/runtime/examples/Cargo.toml @@ -10,7 +10,7 @@ members = [ resolver = "3" [workspace.package] -version = "1.5.0" +version = "1.6.0" edition = "2024" authors = ["NVIDIA"] license = "Apache-2.0" diff --git a/pyproject.toml b/pyproject.toml index 37c09bb3cce3..fd52d6f6957e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ [project] name = "ai-dynamo" -version = "1.5.0" +version = "1.6.0" description = "Distributed Inference Framework" readme = "README.md" authors = [ @@ -13,7 +13,7 @@ license = { text = "Apache-2.0" } license-files = ["LICENSE"] requires-python = ">=3.10" dependencies = [ - "ai-dynamo-runtime==1.5.0", + "ai-dynamo-runtime==1.6.0", "aisimulate==0.12.0; python_version >= '3.11' and python_version < '3.14'", "aiohttp>=3.14.3,<4.0", "transformers>=4.56.0", From 460134d2a858003324a5d9d2a51887920a777a2c Mon Sep 17 00:00:00 2001 From: J Wyman Date: Thu, 17 Sep 2026 20:38:13 -0400 Subject: [PATCH 093/191] fix(ci): Use `pytest --ignore` to Skip Tests Based on Framework (#14815) Signed-off-by: J Wyman --- .github/workflows/shared-test.yml | 9 +++++++-- tests/fault_tolerance/test_canary_rank_pause.py | 8 -------- tests/serve/test_sglang.py | 7 ------- tests/serve/test_trtllm.py | 7 ------- tests/serve/test_vllm.py | 8 -------- 5 files changed, 7 insertions(+), 32 deletions(-) diff --git a/.github/workflows/shared-test.yml b/.github/workflows/shared-test.yml index c8f3b08037dd..f28f2a9f066f 100644 --- a/.github/workflows/shared-test.yml +++ b/.github/workflows/shared-test.yml @@ -11,7 +11,7 @@ on: required: true type: string framework: - description: 'Backend the test image was built with (vllm, sglang, trtllm, dynamo); labels test metadata and coverage/Allure artifacts' + description: 'Backend the test image was built with (dynamo, sglang, triton, trtllm, vllm); labels test metadata and coverage/Allure artifacts' required: true type: string test_type: @@ -193,7 +193,12 @@ jobs: DD_CIVISIBILITY_ENABLED: 'true' DD_CIVISIBILITY_AGENTLESS_ENABLED: 'true' DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER: github - PYTEST_ADDOPTS: --ddtrace + PYTEST_ADDOPTS: > + --ddtrace + ${{ inputs.framework == 'triton' && '--ignore=tests/fault_tolerance/test_canary_rank_pause.py' || '' }} + ${{ inputs.framework == 'triton' && '--ignore=tests/serve/test_vllm.py' || '' }} + ${{ inputs.framework == 'triton' && '--ignore=tests/serve/test_sglang.py' || '' }} + ${{ inputs.framework == 'triton' && '--ignore=tests/serve/test_trtllm.py' || '' }} permissions: contents: read services: diff --git a/tests/fault_tolerance/test_canary_rank_pause.py b/tests/fault_tolerance/test_canary_rank_pause.py index c4233389e1fa..c85cd2cfa204 100644 --- a/tests/fault_tolerance/test_canary_rank_pause.py +++ b/tests/fault_tolerance/test_canary_rank_pause.py @@ -22,14 +22,6 @@ import pytest import requests -# The serve modules imported below reach dynamo.common.multimodal, whose -# package __init__ eagerly imports torch. -# Skip the whole module in images that do not ship torch (e.g. Triton). -try: - import torch # noqa: F401 -except ModuleNotFoundError as e: - pytest.skip(f"torch not available in this image: {e}", allow_module_level=True) - from tests.serve.test_sglang import sglang_configs from tests.serve.test_trtllm import trtllm_configs from tests.serve.test_vllm import vllm_configs diff --git a/tests/serve/test_sglang.py b/tests/serve/test_sglang.py index 4b83914cd469..a4b7f028f80f 100644 --- a/tests/serve/test_sglang.py +++ b/tests/serve/test_sglang.py @@ -8,13 +8,6 @@ import pytest -# dynamo.common.multimodal eagerly imports torch via its package __init__. -# Skip the whole module in images that do not ship torch (e.g. Triton). -try: - import torch # noqa: F401 -except ModuleNotFoundError as e: - pytest.skip(f"torch not available in this image: {e}", allow_module_level=True) - from dynamo.common.multimodal.nvdec_decoder import nvdec_available from dynamo.common.utils.install_media_decoders import VALIDATED_SPECS from tests.serve.common import ( diff --git a/tests/serve/test_trtllm.py b/tests/serve/test_trtllm.py index 6224f6ac1d5b..d483f0a9e1ab 100644 --- a/tests/serve/test_trtllm.py +++ b/tests/serve/test_trtllm.py @@ -9,13 +9,6 @@ import pytest import yaml -# dynamo.common.multimodal eagerly imports torch via its package __init__. -# Skip the whole module in images that do not ship torch (e.g. Triton). -try: - import torch # noqa: F401 -except ModuleNotFoundError as e: - pytest.skip(f"torch not available in this image: {e}", allow_module_level=True) - from dynamo.common.multimodal.nvdec_decoder import nvdec_available from tests.serve.common import ( SERVE_TEST_DIR, diff --git a/tests/serve/test_vllm.py b/tests/serve/test_vllm.py index 1eee3b045643..01c5003b1ef4 100644 --- a/tests/serve/test_vllm.py +++ b/tests/serve/test_vllm.py @@ -10,14 +10,6 @@ import pytest -# tests.serve.multimodal_profiles.vllm reaches dynamo.common.multimodal, whose -# package __init__ eagerly imports torch. -# Skip the whole module in images that do not ship torch (e.g. Triton). -try: - import torch # noqa: F401 -except ModuleNotFoundError as e: - pytest.skip(f"torch not available in this image: {e}", allow_module_level=True) - from tests.serve.common import ( WORKSPACE_DIR, params_with_model_mark, From e0a996bc6bd51f8cda8e52adac6b32fe867d860e Mon Sep 17 00:00:00 2001 From: Tanmay Verma Date: Thu, 17 Sep 2026 19:35:35 -0700 Subject: [PATCH 094/191] feat(sidecar): add e2e CI testing for sidecar launch scripts (#14508) Signed-off-by: tanmayv25 Signed-off-by: Julien Darve Co-authored-by: Julien Darve --- .github/actions/pytest-local/action.yml | 26 ++++ .github/filters.yaml | 1 + .github/workflows/nightly-ci.yml | 18 ++- .github/workflows/post-merge-ci.yml | 30 ++++- .github/workflows/pr.yaml | 105 +++++++++++++++- .github/workflows/shared-build-image.yml | 26 +++- .github/workflows/shared-build-sidecar.yml | 46 +++++++ .github/workflows/shared-test.yml | 47 ++++++- lib/sidecar/Dockerfile | 10 ++ lib/sidecar/common/src/lib.rs | 2 +- lib/sidecar/common/src/transport.rs | 57 ++++++--- lib/sidecar/sglang/launch/agg.sh | 9 +- lib/sidecar/sglang/src/client.rs | 52 +++++++- lib/sidecar/sglang/src/engine.rs | 33 ++++- lib/sidecar/trtllm/launch/agg.sh | 27 ++-- lib/sidecar/trtllm/src/client.rs | 5 +- lib/sidecar/vllm/launch/agg.sh | 9 +- lib/sidecar/vllm/src/client.rs | 6 +- lib/sidecar/vllm/src/engine.rs | 6 +- lib/sidecar/vllm/src/tests.rs | 2 +- pyproject.toml | 1 + tests/conftest.py | 5 + tests/serve/test_sidecar.py | 136 +++++++++++++++++++++ tests/utils/managed_process.py | 3 + tests/utils/payload_builder.py | 60 +++++---- 25 files changed, 638 insertions(+), 84 deletions(-) create mode 100644 tests/serve/test_sidecar.py diff --git a/.github/actions/pytest-local/action.yml b/.github/actions/pytest-local/action.yml index e7bae3c105ca..34e07bbf6a0a 100644 --- a/.github/actions/pytest-local/action.yml +++ b/.github/actions/pytest-local/action.yml @@ -305,6 +305,32 @@ runs: exit ${TEST_EXIT_CODE} + # conftest.py's autouse `logger` fixture writes every test's full root-logger + # output (ManagedProcess/EngineProcess health-check status, retry reasons, + # subprocess log tails, ...) to /tmp/dynamo_tests//test.log.txt -- + # a much richer trace than the JUnit XML's truncated captured-output, but + # nothing ever uploaded it. failure()-gated (not always()) to keep this + # opt-in-by-outcome: pytest-local is shared by every framework's CI, and + # most runs pass. + - name: Collect per-test log files + if: failure() + shell: bash + run: | + set -euo pipefail + mkdir -p test-results/dynamo-tests-logs + if [ -d /tmp/dynamo_tests ]; then + cp -r /tmp/dynamo_tests/. test-results/dynamo-tests-logs/ + fi + + - name: Upload per-test log files + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + if: failure() + with: + name: dynamo-tests-logs-${{ inputs.test_suite_name }}-${{ inputs.test_type }}-${{ inputs.platform_arch }}-${{ github.run_id }}-${{ job.check_run_id }} + path: test-results/dynamo-tests-logs/ + retention-days: 7 + if-no-files-found: ignore + # Allure results and coverage data are uploaded per stage, under the same # artifact names as before the step collapse, because an external CI-metrics # pipeline consumes them by name. `always()` because the step above exits diff --git a/.github/filters.yaml b/.github/filters.yaml index 15864f15c6d0..1287320c1f20 100644 --- a/.github/filters.yaml +++ b/.github/filters.yaml @@ -352,6 +352,7 @@ sidecar: # acceptable CI fan-out is agreed. Keep the remaining scope narrow for now. - 'lib/sidecar/**' - '.github/workflows/shared-build-sidecar.yml' + - 'tests/serve/test_sidecar.py' - 'Cargo.toml' - 'Cargo.lock' # Compliance policy and baseline changes can fail the sidecar image build. diff --git a/.github/workflows/nightly-ci.yml b/.github/workflows/nightly-ci.yml index 5e14495deecf..12873163a59a 100644 --- a/.github/workflows/nightly-ci.yml +++ b/.github/workflows/nightly-ci.yml @@ -816,7 +816,13 @@ jobs: enable_coverage: true run_cpu_only_tests: true cpu_only_test_markers: vllm and gpu_0 - gpu_test_markers: vllm and gpu_1 + # not sidecar: sidecar-marked tests need the dynamo-vllm-sidecar binary + # installed (see pr.yaml's sidecar-vllm-test), which this plain + # vllm-runtime image doesn't have. + # TODO: this ad-hoc exclusion is duplicated across pr.yaml, post-merge-ci.yml, + # and nightly-ci.yml's gpu_test_markers; consolidate into shared-test.yml + # once there's a second marker that needs the same treatment. + gpu_test_markers: vllm and gpu_1 and not sidecar gpu_test_timeout_minutes: 240 # Profiled tests run in the parallel stage; unprofiled fall through to sequential. # 24 GiB admits all currently profiled vLLM tests (max is ~20.4 GiB) on a 48 GiB GPU. @@ -891,7 +897,7 @@ jobs: platform: '["amd64"]' enable_coverage: true run_sanity_check: false - gpu_test_markers: vllm and (gpu_1 or gpu_2) + gpu_test_markers: vllm and (gpu_1 or gpu_2) and not sidecar gpu_test_timeout_minutes: 240 # 80 GiB H100 admits more of the profiled pool per slot than the 24 GiB lanes. run_gpu_parallel_tests: true @@ -919,7 +925,7 @@ jobs: run_cpu_only_tests: true cpu_only_test_markers: sglang and gpu_0 # Exclude h100 tests: they need >24 GiB and run on the sglang-h100-test lane below. - gpu_test_markers: sglang and gpu_1 and not h100 + gpu_test_markers: sglang and gpu_1 and not h100 and not sidecar gpu_test_timeout_minutes: 240 # Profiled tests run in the VRAM-aware GPU stage; unprofiled fall through to sequential. # Current single-GPU runners are 24 GiB, so this cap admits the profiled SGLang pool @@ -994,7 +1000,7 @@ jobs: platform: '["amd64"]' enable_coverage: true run_sanity_check: false - gpu_test_markers: sglang and (gpu_1 or gpu_2) + gpu_test_markers: sglang and (gpu_1 or gpu_2) and not sidecar gpu_test_timeout_minutes: 240 # 80 GiB H100 admits more of the profiled pool per slot than the 24 GiB lanes. run_gpu_parallel_tests: true @@ -1021,7 +1027,7 @@ jobs: enable_coverage: true run_cpu_only_tests: true cpu_only_test_markers: trtllm and gpu_0 - gpu_test_markers: trtllm and gpu_1 + gpu_test_markers: trtllm and gpu_1 and not sidecar gpu_test_timeout_minutes: 240 # Profiled tests run in the VRAM-aware GPU stage; unprofiled fall through to sequential. # Current single-GPU runners are 24 GiB, so this cap admits the profiled TRT-LLM pool @@ -1073,7 +1079,7 @@ jobs: platform: '["amd64"]' enable_coverage: true run_sanity_check: false - gpu_test_markers: trtllm and (gpu_1 or gpu_2) + gpu_test_markers: trtllm and (gpu_1 or gpu_2) and not sidecar gpu_test_timeout_minutes: 240 # 80 GiB H100 admits more of the profiled pool per slot than the 24 GiB lanes. run_gpu_parallel_tests: true diff --git a/.github/workflows/post-merge-ci.yml b/.github/workflows/post-merge-ci.yml index 42143bcc5ebd..52e13f5fec30 100644 --- a/.github/workflows/post-merge-ci.yml +++ b/.github/workflows/post-merge-ci.yml @@ -215,6 +215,11 @@ jobs: extra_tags: | ${{ github.ref_name == 'main' && 'main-vllm-runtime' || '' }} ${{ github.ref_name == 'main' && format('main-vllm-runtime-{0}', github.sha) || '' }} + # Lets sidecar-vllm-test (pr.yaml) fall back to this floating tag via its + # source_ref input instead of rebuilding vllm-runtime on every + # lib/sidecar/**-only PR. + test_extra_tags: | + ${{ github.ref_name == 'main' && 'main-vllm-runtime-test' || '' }} archive_sources: false secrets: inherit @@ -280,6 +285,11 @@ jobs: extra_tags: | ${{ github.ref_name == 'main' && 'main-sglang-runtime' || '' }} ${{ github.ref_name == 'main' && format('main-sglang-runtime-{0}', github.sha) || '' }} + # Lets sidecar-sglang-test (pr.yaml) fall back to this floating tag via + # its source_ref input instead of rebuilding sglang-runtime on every + # lib/sidecar/**-only PR. + test_extra_tags: | + ${{ github.ref_name == 'main' && 'main-sglang-runtime-test' || '' }} archive_sources: false secrets: inherit @@ -345,6 +355,11 @@ jobs: extra_tags: | ${{ github.ref_name == 'main' && 'main-trtllm-runtime' || '' }} ${{ github.ref_name == 'main' && format('main-trtllm-runtime-{0}', github.sha) || '' }} + # Lets sidecar-trtllm-test (pr.yaml) fall back to this floating tag via + # its source_ref input instead of rebuilding trtllm-runtime on every + # lib/sidecar/**-only PR. + test_extra_tags: | + ${{ github.ref_name == 'main' && 'main-trtllm-runtime-test' || '' }} archive_sources: false secrets: inherit @@ -471,7 +486,10 @@ jobs: platform: '["amd64", "arm64"]' # arm64 for CPU tests, single GPU tests are skipped run_cpu_only_tests: true cpu_only_test_markers: '(pre_merge or post_merge) and vllm and gpu_0' - gpu_test_markers: '(pre_merge or post_merge) and vllm and gpu_1' + # not sidecar: sidecar-marked tests need dynamo-vllm-sidecar layered onto + # the image (see pr.yaml's sidecar-vllm-test), which this plain + # vllm-runtime image doesn't have. + gpu_test_markers: '(pre_merge or post_merge) and vllm and gpu_1 and not sidecar' gpu_test_timeout_minutes: 120 # Profiled tests (those carrying @pytest.mark.profiled_vram_gib(N)) run concurrently in # the parallel stage; the rest fall through to the sequential stage. 24 GiB admits all @@ -549,7 +567,10 @@ jobs: platform: '["amd64", "arm64"]' # arm64 for CPU tests, single GPU tests are skipped run_cpu_only_tests: true cpu_only_test_markers: '(pre_merge or post_merge) and sglang and gpu_0' - gpu_test_markers: '(pre_merge or post_merge) and sglang and gpu_1' + # not sidecar: sidecar-marked tests need dynamo-sglang-sidecar layered + # onto the image (see pr.yaml's sidecar-sglang-test), which this plain + # sglang-runtime image doesn't have. + gpu_test_markers: '(pre_merge or post_merge) and sglang and gpu_1 and not sidecar' gpu_test_timeout_minutes: 120 # Profiled tests run in the VRAM-aware GPU stage; unprofiled fall through to sequential. # Current single-GPU runners are 24 GiB, so this cap admits the profiled SGLang pool @@ -591,7 +612,10 @@ jobs: platform: '["amd64", "arm64"]' # arm64 for CPU tests, single GPU tests are skipped run_cpu_only_tests: true cpu_only_test_markers: '(pre_merge or post_merge) and trtllm and gpu_0' - gpu_test_markers: '(pre_merge or post_merge) and trtllm and gpu_1' + # not sidecar: sidecar-marked tests need dynamo-trtllm-sidecar layered + # onto the image (see pr.yaml's sidecar-trtllm-test), which this plain + # trtllm-runtime image doesn't have. + gpu_test_markers: '(pre_merge or post_merge) and trtllm and gpu_1 and not sidecar' gpu_test_timeout_minutes: 120 # Profiled tests run in the VRAM-aware GPU stage; unprofiled fall through to sequential. # Current single-GPU runners are 24 GiB, so this cap admits the profiled TRT-LLM pool diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 09428070b404..61608ce05052 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -134,6 +134,9 @@ jobs: - snapshot-placeholder-trtllm - power-agent - sidecar-build + - sidecar-vllm-test + - sidecar-sglang-test + - sidecar-trtllm-test - vllm-build - vllm-local-dev-build - sglang-local-dev-build @@ -355,12 +358,99 @@ jobs: uses: $/.github/workflows/shared-build-sidecar.yml with: builder_name: ${{ needs.changed-files.outputs.builder_name }} + # Default (60) is tight for a cold cache: multi-arch cargo build of 3 + # sidecar crates + dynamo-llm/dynamo-runtime, plus the compliance and + # binary-extraction steps that follow it. Observed a legitimate cold + # build exceed 60m with room to spare in run 34547963529. + build_timeout_minutes: 90 artifact_retention_days: '7' diff_event_context: pr diff_current_branch: ${{ github.ref_name }} diff_base_branch: ${{ needs.changed-files.outputs.base_ref }} diff_merge_base_sha: ${{ needs.changed-files.outputs.merge_base_sha }} + # Reuse the backend test image and install the sidecar artifact before pytest. + + sidecar-vllm-test: + name: sidecar-runtime # This name overlaps with other sidecar jobs to group them in the UI + needs: [changed-files, vllm-build, sidecar-build] + # vllm-build must have succeeded or been intentionally skipped (a + # lib/sidecar-only PR) -- not failed or cancelled -- or the fallback below + # would silently test this PR's sidecar binary against main's vllm image + # and report green while this PR's own vllm-runtime build is red. + if: ${{ !cancelled() && needs.changed-files.outputs.sidecar == 'true' && needs.sidecar-build.result == 'success' && (needs.vllm-build.result == 'success' || needs.vllm-build.result == 'skipped') }} + permissions: + actions: read + contents: read + uses: $/.github/workflows/shared-test.yml + with: + test_suite_name: vllm + framework: vllm # matches the framework passed to vllm-build + test_type: Sidecar E2E Test + amd_runner: prod-tester-amd-gpu-v2 + target_tag_plain: ${{ needs.vllm-build.result == 'success' && needs.vllm-build.outputs.target_tag_plain || 'vllm-runtime' }} + source_ref: ${{ needs.vllm-build.result == 'success' && github.sha || 'main' }} + cuda_version: '["13.0"]' + platform: '["amd64"]' + run_sanity_check: false + gpu_test_markers: pre_merge and sidecar and vllm and gpu_1 + gpu_test_timeout_minutes: 45 + sidecar_backend: vllm + sidecar_binary_artifact: ${{ needs.sidecar-build.outputs.binary_artifact }} + secrets: inherit + + sidecar-sglang-test: + name: sidecar-runtime # This name overlaps with other sidecar jobs to group them in the UI + needs: [changed-files, sglang-build, sidecar-build] + # See sidecar-vllm-test above: sglang-build must have succeeded or been + # intentionally skipped, not failed or cancelled. + if: ${{ !cancelled() && needs.changed-files.outputs.sidecar == 'true' && needs.sidecar-build.result == 'success' && (needs.sglang-build.result == 'success' || needs.sglang-build.result == 'skipped') }} + permissions: + actions: read + contents: read + uses: $/.github/workflows/shared-test.yml + with: + test_suite_name: sglang + framework: sglang # matches the framework passed to sglang-build + test_type: Sidecar E2E Test + amd_runner: prod-tester-amd-gpu-v2 + target_tag_plain: ${{ needs.sglang-build.result == 'success' && needs.sglang-build.outputs.target_tag_plain || 'sglang-runtime' }} + source_ref: ${{ needs.sglang-build.result == 'success' && github.sha || 'main' }} + cuda_version: '["13.0"]' + platform: '["amd64"]' + run_sanity_check: false + gpu_test_markers: pre_merge and sidecar and sglang and gpu_1 + gpu_test_timeout_minutes: 45 + sidecar_backend: sglang + sidecar_binary_artifact: ${{ needs.sidecar-build.outputs.binary_artifact }} + secrets: inherit + + sidecar-trtllm-test: + name: sidecar-runtime # This name overlaps with other sidecar jobs to group them in the UI + needs: [changed-files, trtllm-build, sidecar-build] + # See sidecar-vllm-test above: trtllm-build must have succeeded or been + # intentionally skipped, not failed or cancelled. + if: ${{ !cancelled() && needs.changed-files.outputs.sidecar == 'true' && needs.sidecar-build.result == 'success' && (needs.trtllm-build.result == 'success' || needs.trtllm-build.result == 'skipped') }} + permissions: + actions: read + contents: read + uses: $/.github/workflows/shared-test.yml + with: + test_suite_name: trtllm + framework: trtllm # matches the framework passed to trtllm-build + test_type: Sidecar E2E Test + amd_runner: prod-tester-amd-gpu-v2 + target_tag_plain: ${{ needs.trtllm-build.result == 'success' && needs.trtllm-build.outputs.target_tag_plain || 'trtllm-runtime' }} + source_ref: ${{ needs.trtllm-build.result == 'success' && github.sha || 'main' }} + cuda_version: '["13.1"]' + platform: '["amd64"]' + run_sanity_check: false + gpu_test_markers: pre_merge and sidecar and trtllm and gpu_1 + gpu_test_timeout_minutes: 45 + sidecar_backend: trtllm + sidecar_binary_artifact: ${{ needs.sidecar-build.outputs.binary_artifact }} + secrets: inherit + # ============================================================================ # FRAMEWORK PIPELINES (Build → Test → Copy) # ============================================================================ @@ -813,7 +903,10 @@ jobs: # Keep the outer step budget above the test's 450s timeout so pytest can # finish teardown and upload diagnostics instead of being killed first. cpu_e2e_test_timeout_minutes: 15 - gpu_test_markers: pre_merge and vllm and gpu_1 + # not sidecar: sidecar-marked tests need dynamo-vllm-sidecar layered onto + # the image (see sidecar-vllm-test below), which this plain vllm-runtime + # image doesn't have. + gpu_test_markers: pre_merge and vllm and gpu_1 and not sidecar gpu_test_timeout_minutes: 45 # Profiled tests run in the parallel stage; unprofiled fall through to sequential. # 24 GiB admits all currently profiled vLLM tests (max is ~20.4 GiB) on a 48 GiB GPU. @@ -858,7 +951,10 @@ jobs: platform: '["amd64", "arm64"]' # arm64 for CPU tests, single GPU tests are skipped run_cpu_only_tests: true cpu_only_test_markers: pre_merge and sglang and gpu_0 - gpu_test_markers: pre_merge and sglang and gpu_1 + # not sidecar: sidecar-marked tests need dynamo-sglang-sidecar layered + # onto the image (see sidecar-sglang-test below), which this plain + # sglang-runtime image doesn't have. + gpu_test_markers: pre_merge and sglang and gpu_1 and not sidecar # Profiled tests run in the VRAM-aware GPU stage; unprofiled fall through to sequential. # Current single-GPU runners are 24 GiB, so this cap admits the profiled SGLang pool # while yielding one auto slot today. Larger runners will get more slots from the same markers. @@ -903,7 +999,10 @@ jobs: platform: '["amd64", "arm64"]' # arm64 for CPU tests, single GPU tests are skipped run_cpu_only_tests: true cpu_only_test_markers: pre_merge and trtllm and gpu_0 - gpu_test_markers: pre_merge and trtllm and gpu_1 + # not sidecar: sidecar-marked tests need dynamo-trtllm-sidecar layered + # onto the image (see sidecar-trtllm-test below), which this plain + # trtllm-runtime image doesn't have. + gpu_test_markers: pre_merge and trtllm and gpu_1 and not sidecar # Profiled tests run in the VRAM-aware GPU stage; unprofiled fall through to sequential. # Current single-GPU runners are 24 GiB, so this cap admits the profiled TRT-LLM pool # while yielding one auto slot today. Larger runners will get more slots from the same markers. diff --git a/.github/workflows/shared-build-image.yml b/.github/workflows/shared-build-image.yml index ace6d4d752fb..b3e44ed63342 100644 --- a/.github/workflows/shared-build-image.yml +++ b/.github/workflows/shared-build-image.yml @@ -37,6 +37,11 @@ on: required: false type: string default: '' + test_extra_tags: + description: 'Additional tags for the -test image only (newline-separated plain tag names, no ECR prefix). Unlike extra_tags (runtime image), the -test image otherwise gets no floating tag.' + required: false + type: string + default: '' no_cache: description: 'Disable Docker build cache' required: false @@ -603,6 +608,14 @@ jobs: - name: Build and Push Test Image if: ${{ !inputs.compliance_only && inputs.target != 'dev' && inputs.target != 'local-dev' && inputs.target != 'frontend' }} shell: bash + env: + ECR_REGISTRY: ${{ vars.ECR_REGISTRY }} + ECR_REPOSITORY: ${{ vars.ECR_REPOSITORY }} + TEST_EXTRA_TAGS: ${{ inputs.test_extra_tags }} + # Routed through env (not inlined via ${{ }}) so a value containing + # shell metacharacters can't be interpreted as script rather than data. + IMAGE_URI: ${{ steps.calculate-target-tag.outputs.image_uri }} + TEST_IMAGE_URI: ${{ steps.calculate-target-tag.outputs.test_image_uri }} run: | PUSH_ARGS="" if [ "${{ inputs.push_image }}" == "true" ]; then @@ -630,6 +643,15 @@ jobs: PYPI_SECRET_ARGS+=(--secret "id=pypi-netrc,src=${NETRC}") fi + TEST_TAG_ARGS=(-t "${TEST_IMAGE_URI}") + if [ -n "$TEST_EXTRA_TAGS" ]; then + while IFS= read -r tag; do + if [ -n "$tag" ]; then + TEST_TAG_ARGS+=(-t "${ECR_REGISTRY}/${ECR_REPOSITORY}:${tag}") + fi + done <<< "$TEST_EXTRA_TAGS" + fi + docker buildx build \ --progress=plain \ ${PUSH_ARGS} \ @@ -638,8 +660,8 @@ jobs: --platform ${{ inputs.platform }} \ --target ${TEST_TARGET} \ -f container/Dockerfile.test \ - --build-arg BASE_IMAGE=${{ steps.calculate-target-tag.outputs.image_uri }} \ - -t ${{ steps.calculate-target-tag.outputs.test_image_uri }} . + --build-arg BASE_IMAGE="${IMAGE_URI}" \ + "${TEST_TAG_ARGS[@]}" . - name: Show summary shell: bash if: ${{ inputs.push_image == 'true' && inputs.show_summary == 'true' }} diff --git a/.github/workflows/shared-build-sidecar.yml b/.github/workflows/shared-build-sidecar.yml index ecd6cb550287..6219ad142563 100644 --- a/.github/workflows/shared-build-sidecar.yml +++ b/.github/workflows/shared-build-sidecar.yml @@ -45,6 +45,13 @@ on: required: false type: string default: '' + outputs: + target_tag_plain: + description: 'Plain sidecar image tag prefix' + value: ${{ jobs.build.outputs.target_tag_plain }} + binary_artifact: + description: 'Name of the workflow artifact containing the amd64 dynamo-*-sidecar binaries' + value: ${{ jobs.build.outputs.binary_artifact }} jobs: build: @@ -54,6 +61,9 @@ jobs: permissions: actions: read contents: read + outputs: + target_tag_plain: ${{ steps.calculate-target-tag.outputs.target_tag_plain }} + binary_artifact: ${{ steps.binary-artifact.outputs.name }} steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -123,6 +133,42 @@ jobs: no_load: true use_sccache: false + # No derived per-backend test image: shared-test.yml pulls the backend's + # own -test image unmodified and installs the sidecar binary from this + # artifact via PATH (see shared-test.yml's sidecar_binary_artifact + # input). amd64-only: sidecar tests only run on amd64 GPU runners. + # + # buildx local output, not `docker pull` + `docker create` + `docker + # cp`: these builder runners route to a remote BuildKit worker (see + # init-dynamo-builder above) with no local docker daemon, so plain + # `docker` CLI commands against an image fail with "failed to connect + # to the docker API at unix:///var/run/docker.sock". `docker buildx + # build` talks to the remote builder directly and needs no daemon. + # Reuses the same builder and build cache as "Build and Push Image" + # above, so the sidecar-binaries target (which only depends on the + # {vllm,sglang,trtllm}-builder stages) is a near-instant cache hit. + - name: Extract sidecar binaries (amd64) + id: binary-artifact + shell: bash + run: | + set -euo pipefail + mkdir -p sidecar-binaries + docker buildx build \ + --target sidecar-binaries \ + --platform linux/amd64 \ + -f lib/sidecar/Dockerfile \ + --output type=local,dest=sidecar-binaries \ + . + name="dynamo-sidecar-binaries-${GITHUB_SHA}" + echo "name=${name}" >> "${GITHUB_OUTPUT}" + + - name: Upload sidecar binaries + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + with: + name: ${{ steps.binary-artifact.outputs.name }} + path: sidecar-binaries/ + retention-days: 7 + - name: Resolve diff baseline id: resolve-diff-base if: ${{ inputs.diff_event_context != '' }} diff --git a/.github/workflows/shared-test.yml b/.github/workflows/shared-test.yml index f28f2a9f066f..c0fc2e8af477 100644 --- a/.github/workflows/shared-test.yml +++ b/.github/workflows/shared-test.yml @@ -117,7 +117,7 @@ on: type: boolean default: true source_ref: - description: 'Git ref/SHA to checkout and to resolve image tags against. Empty = caller SHA (github.sha).' + description: 'Git ref/SHA for image tags and checkout. Sidecar jobs always check out the caller SHA. Empty = caller SHA (github.sha).' required: false type: string default: '' @@ -136,6 +136,16 @@ on: required: false type: string default: 'true' + sidecar_backend: + description: 'Backend name (vllm/sglang/trtllm) to install a dynamo-*-sidecar binary for before running tests. Empty = skip (non-sidecar callers).' + required: false + type: string + default: '' + sidecar_binary_artifact: + description: 'Name of the workflow artifact (from shared-build-sidecar.yml) containing the amd64 dynamo-*-sidecar binaries. Required when sidecar_backend is set.' + required: false + type: string + default: '' secrets: AWS_DEFAULT_REGION: required: true @@ -201,6 +211,7 @@ jobs: ${{ inputs.framework == 'triton' && '--ignore=tests/serve/test_trtllm.py' || '' }} permissions: contents: read + actions: read services: minio: image: ${{ vars.ECR_REGISTRY }}/quay/minio/minio:latest @@ -217,7 +228,39 @@ jobs: id: checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: - ref: ${{ inputs.source_ref != '' && inputs.source_ref || github.sha }} + ref: ${{ inputs.sidecar_backend != '' && github.sha || inputs.source_ref || github.sha }} + - name: Download sidecar binary + if: ${{ inputs.sidecar_backend != '' }} + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + with: + name: ${{ inputs.sidecar_binary_artifact }} + path: sidecar-artifact + - name: Install sidecar binary + if: ${{ inputs.sidecar_backend != '' }} + shell: bash + env: + SIDECAR_BACKEND: ${{ inputs.sidecar_backend }} + CONTAINER_WORKSPACE: ${{ inputs.container_workspace }} + run: | + set -euo pipefail + # Use a workspace-local directory writable by the container user. + bin_dir="${GITHUB_WORKSPACE}/.sidecar-bin" + mkdir -p "${bin_dir}" + install -m755 "sidecar-artifact/dynamo-${SIDECAR_BACKEND}-sidecar" \ + "${bin_dir}/dynamo-${SIDECAR_BACKEND}-sidecar" + echo "${bin_dir}" >> "${GITHUB_PATH}" + if [ -z "${CONTAINER_WORKSPACE}" ]; then + echo "::error::container_workspace is empty; refusing to replace test files" + exit 1 + fi + if [ ! "${GITHUB_WORKSPACE}" -ef "${CONTAINER_WORKSPACE}" ]; then + # Replace the test inputs so files deleted by the PR cannot linger. + for path in lib/sidecar tests examples/common conftest.py pyproject.toml Cargo.toml; do + rm -rf "${CONTAINER_WORKSPACE}/${path}" + mkdir -p "$(dirname "${CONTAINER_WORKSPACE}/${path}")" + cp -r "${GITHUB_WORKSPACE}/${path}" "${CONTAINER_WORKSPACE}/${path}" + done + fi - name: Export KVBM MLA backend if: ${{ inputs.kvbm_mla_backend != '' }} shell: bash diff --git a/lib/sidecar/Dockerfile b/lib/sidecar/Dockerfile index e173038ffd5a..d253f5b9a237 100644 --- a/lib/sidecar/Dockerfile +++ b/lib/sidecar/Dockerfile @@ -239,6 +239,16 @@ RUN python3 -m compliance.generators \ FROM scratch AS compliance_artifact COPY --from=licenses /legal/ / +# ---- CI-only: sidecar binaries as a buildx local-output target -------------- +# CI extracts these via `docker buildx build --target sidecar-binaries +# --output=type=local`, not `docker pull` + `docker create` + `docker cp`: the +# builder runners route to a remote BuildKit worker with no local docker +# daemon (see shared-build-sidecar.yml). Not used for any shipped image. +FROM scratch AS sidecar-binaries +COPY --from=vllm-builder /out/dynamo-vllm-sidecar / +COPY --from=sglang-builder /out/dynamo-sglang-sidecar / +COPY --from=trtllm-builder /out/dynamo-trtllm-sidecar / + # ---- shipped runtime --------------------------------------------------------- FROM runtime-base AS runtime diff --git a/lib/sidecar/common/src/lib.rs b/lib/sidecar/common/src/lib.rs index 01a17d662f7f..d6e455dce8e6 100644 --- a/lib/sidecar/common/src/lib.rs +++ b/lib/sidecar/common/src/lib.rs @@ -24,4 +24,4 @@ pub use error::{ SidecarStartupError, cannot_connect, connection_timeout, engine_shutdown, invalid_argument, protocol_error, status_to_dynamo, }; -pub use transport::{DEFAULT_MAX_GRPC_MESSAGE_SIZE, GrpcChannelPool}; +pub use transport::{DEFAULT_MAX_GRPC_MESSAGE_SIZE, GrpcChannelPool, format_error_chain}; diff --git a/lib/sidecar/common/src/transport.rs b/lib/sidecar/common/src/transport.rs index f1e547556151..9ef2f046e425 100644 --- a/lib/sidecar/common/src/transport.rs +++ b/lib/sidecar/common/src/transport.rs @@ -22,10 +22,18 @@ pub struct GrpcChannelPool { } impl GrpcChannelPool { + /// `bootstrap`: true when called before `dynamo_backend_common::run` + /// installs the global tracing subscriber (i.e. from a `bootstrap_discover` + /// path during `from_args()`). Tracing events emitted with no subscriber + /// installed are silently dropped, so the retry warning must go to raw + /// stderr instead on that path. Pass `false` once running inside + /// `LLMEngine::start` or later, where the subscriber is live and the + /// retry warning should go through `tracing` like everything else. pub async fn connect( peer: &str, endpoint: &GrpcEndpoint, transport: GrpcTransportConfig, + bootstrap: bool, ) -> Result { let endpoint_label = endpoint.to_string(); let tonic_endpoint = Endpoint::from_shared(endpoint_label.clone()).map_err(|error| { @@ -43,6 +51,7 @@ impl GrpcChannelPool { 1, transport, deadline, + bootstrap, ) .await?; let mut channels = vec![first]; @@ -57,6 +66,7 @@ impl GrpcChannelPool { index + 1, transport, deadline, + bootstrap, ) .await } @@ -90,6 +100,7 @@ async fn connect_until_ready( pool_slot: usize, transport: GrpcTransportConfig, deadline: Instant, + bootstrap: bool, ) -> Result { let started = Instant::now(); let mut attempt = 0_u64; @@ -124,18 +135,33 @@ async fn connect_until_ready( let log_interval_elapsed = last_logged_at .is_none_or(|last| now.duration_since(last) >= RETRY_LOG_INTERVAL); if error_changed || log_interval_elapsed { - tracing::debug!( - peer, - endpoint = %endpoint_label, - pool_slot, - attempt, - elapsed = ?started.elapsed(), - remaining = ?deadline.saturating_duration_since(now), - retry_interval = ?transport.retry_interval, - suppressed_attempts, - error = ?error, - "sidecar gRPC connection attempt failed" - ); + // eprintln! on the bootstrap path: tracing events emitted before + // dynamo_backend_common::run() installs the global subscriber are + // silently dropped, which would make this warning exactly as + // invisible as the debug! it replaced. Once running (bootstrap == + // false), route through tracing like everything else so the line + // gets levels, timestamps, and filtering. + if bootstrap { + eprintln!( + "{peer} gRPC connection attempt failed; retrying (endpoint={endpoint_label}, pool_slot={pool_slot}, attempt={attempt}, elapsed={:?}, remaining={:?}, retry_interval={:?}, suppressed_attempts={suppressed_attempts}, error={detailed_error})", + started.elapsed(), + deadline.saturating_duration_since(now), + transport.retry_interval, + ); + } else { + tracing::warn!( + peer, + endpoint = %endpoint_label, + pool_slot, + attempt, + elapsed = ?started.elapsed(), + remaining = ?deadline.saturating_duration_since(now), + retry_interval = ?transport.retry_interval, + suppressed_attempts, + error = ?error, + "sidecar gRPC connection attempt failed; retrying" + ); + } last_logged_at = Some(now); last_logged_error = Some(detailed_error.clone()); suppressed_attempts = 0; @@ -205,7 +231,10 @@ fn startup_timeout( )) } -fn format_error_chain(error: &(dyn std::error::Error + 'static)) -> String { +/// Flattens an error's `source()` chain into one string ("outer: middle: +/// inner"). `Display` alone on a `tonic::transport::Error` gives only the +/// constant "transport error" -- this is what callers should log instead. +pub fn format_error_chain(error: &(dyn std::error::Error + 'static)) -> String { let mut message = error.to_string(); let mut source = error.source(); while let Some(cause) = source { @@ -240,7 +269,7 @@ mod tests { let endpoint = GrpcEndpoint::parse(&address.to_string(), "--test-endpoint").unwrap(); let result = tokio::time::timeout( Duration::from_millis(300), - GrpcChannelPool::connect("test", &endpoint, transport), + GrpcChannelPool::connect("test", &endpoint, transport, false), ) .await .expect("connection retries must respect the startup deadline"); diff --git a/lib/sidecar/sglang/launch/agg.sh b/lib/sidecar/sglang/launch/agg.sh index d5e7665900b0..6856aedf5100 100755 --- a/lib/sidecar/sglang/launch/agg.sh +++ b/lib/sidecar/sglang/launch/agg.sh @@ -8,11 +8,14 @@ set -e SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" -export DYNAMO_HOME="${DYNAMO_HOME:-$(readlink -f "$SCRIPT_DIR/../../../..")}" +# Resolved relative to this script, not via $DYNAMO_HOME: some runtime images +# (e.g. vllm_runtime.Dockerfile) bake DYNAMO_HOME to a minimal install path +# with no examples/ directory, which would silently override this and break +# sourcing. Matches examples/backends/sglang/launch/agg.sh's own approach. # shellcheck disable=SC1091 # Resolved relative to this script at runtime. -source "$DYNAMO_HOME/examples/common/gpu_utils.sh" # build_sglang_gpu_mem_args +source "$SCRIPT_DIR/../../../../examples/common/gpu_utils.sh" # build_sglang_gpu_mem_args # shellcheck disable=SC1091 # Resolved relative to this script at runtime. -source "$DYNAMO_HOME/examples/common/launch_utils.sh" # print_launch_banner, wait_any_exit +source "$SCRIPT_DIR/../../../../examples/common/launch_utils.sh" # print_launch_banner, wait_any_exit MODEL="${MODEL:-Qwen/Qwen3-0.6B}" diff --git a/lib/sidecar/sglang/src/client.rs b/lib/sidecar/sglang/src/client.rs index cf2b830422a8..2a2be10f9c18 100644 --- a/lib/sidecar/sglang/src/client.rs +++ b/lib/sidecar/sglang/src/client.rs @@ -8,7 +8,9 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::Duration; use dynamo_backend_common::{BackendError, DynamoError, ErrorType}; -use dynamo_sidecar_common::{DEFAULT_MAX_GRPC_MESSAGE_SIZE, GrpcEndpoint, GrpcTransportConfig}; +use dynamo_sidecar_common::{ + DEFAULT_MAX_GRPC_MESSAGE_SIZE, GrpcEndpoint, GrpcTransportConfig, format_error_chain, +}; use serde_json::Value; use tokio::time::{Instant, timeout_at}; use tonic::transport::{Channel, Endpoint}; @@ -18,6 +20,8 @@ use crate::proto::sglang_service_client::SglangServiceClient; pub type Client = SglangServiceClient; +const RETRY_LOG_INTERVAL: Duration = Duration::from_secs(30); + /// Metadata exposed by SGLang's model/server discovery RPCs. #[derive(Clone, Debug)] pub struct Discovery { @@ -29,15 +33,24 @@ pub struct Discovery { pub server_info: Value, } +/// `bootstrap`: true when called before `dynamo_backend_common::run` installs +/// the global tracing subscriber (the `bootstrap_discover` path during +/// `from_args()`), false once running inside `LLMEngine::start` (via +/// `Pool::connect`) where the subscriber is live. pub async fn connect( uri: &GrpcEndpoint, cfg: &GrpcTransportConfig, deadline: Instant, + bootstrap: bool, ) -> Result { let endpoint = Endpoint::from_shared(uri.to_string()) .map_err(|err| invalid_arg(format!("invalid SGLang gRPC endpoint `{uri}`: {err}")))?; + let started = Instant::now(); + let mut attempt = 0_u64; let mut last_err; + let mut last_logged_at: Option = None; loop { + attempt += 1; match try_connect_once(&endpoint, cfg, deadline).await { Ok(client) => return Ok(client), Err(err) => { @@ -48,7 +61,35 @@ pub async fn connect( cfg.startup_deadline ))); } - tokio::time::sleep_until((Instant::now() + cfg.retry_interval).min(deadline)).await; + let now = Instant::now(); + if last_logged_at.is_none_or(|last| now.duration_since(last) >= RETRY_LOG_INTERVAL) + { + // eprintln! on the bootstrap path: tracing events emitted before + // dynamo_backend_common::run() installs the global subscriber are + // silently dropped, which would make this warning exactly as + // invisible as the debug! it replaced. On the post-init path + // (Pool::connect, called from LLMEngine::start), route through + // tracing like everything else so the line gets levels, + // timestamps, and filtering. + if bootstrap { + eprintln!( + "SGLang gRPC connection attempt failed; retrying (endpoint={uri}, attempt={attempt}, elapsed={:?}, retry_interval={:?}, error={last_err})", + started.elapsed(), + cfg.retry_interval, + ); + } else { + tracing::warn!( + endpoint = %uri, + attempt, + elapsed = ?started.elapsed(), + retry_interval = ?cfg.retry_interval, + error = %last_err, + "SGLang gRPC connection attempt failed; retrying" + ); + } + last_logged_at = Some(now); + } + tokio::time::sleep_until((now + cfg.retry_interval).min(deadline)).await; } } } @@ -69,7 +110,7 @@ async fn try_connect_once( let channel = timeout_at(deadline, endpoint.connect()) .await .map_err(|_| "startup deadline elapsed while connecting".to_string())? - .map_err(|e| e.to_string())?; + .map_err(|e| format_error_chain(&e))?; Ok(client_from_channel(channel)) } @@ -87,6 +128,9 @@ pub struct Pool { } impl Pool { + // bootstrap=false: Pool::connect's only call site is LLMEngine::start + // (lib/sidecar/sglang/src/engine.rs), after the tracing subscriber is + // installed. See connect()'s own doc comment. pub async fn connect( uri: &GrpcEndpoint, cfg: &GrpcTransportConfig, @@ -95,7 +139,7 @@ impl Pool { let size = cfg.connections.get(); let mut clients = Vec::with_capacity(size); for _ in 0..size { - clients.push(connect(uri, cfg, deadline).await?); + clients.push(connect(uri, cfg, deadline, false).await?); } Ok(Self { clients, diff --git a/lib/sidecar/sglang/src/engine.rs b/lib/sidecar/sglang/src/engine.rs index 6eba3f582ba7..8c7ee6ced18f 100644 --- a/lib/sidecar/sglang/src/engine.rs +++ b/lib/sidecar/sglang/src/engine.rs @@ -6,6 +6,7 @@ use std::collections::HashMap; use std::net::IpAddr; use std::sync::Arc; +use std::time::Duration; use async_trait::async_trait; use dynamo_backend_common::{ @@ -29,6 +30,8 @@ use crate::protocol::{ meta_u32, output_ids_to_u32, terminal_from_meta, }; +const RETRY_LOG_INTERVAL: Duration = Duration::from_secs(30); + pub struct SglangSidecarEngine { endpoint: GrpcEndpoint, transport: GrpcTransportConfig, @@ -143,7 +146,11 @@ impl SglangSidecarEngine { } async fn await_ready(&self, client: &mut Client, deadline: Instant) -> Result<(), DynamoError> { + let started = Instant::now(); + let mut attempt = 0_u64; + let mut last_logged_at: Option = None; loop { + attempt += 1; let retry_message = match client::health_check(client, deadline).await { Ok(healthy) => { if healthy { @@ -159,10 +166,26 @@ impl SglangSidecarEngine { self.transport.startup_deadline ))); } - tokio::time::sleep_until( - (Instant::now() + self.transport.retry_interval).min(deadline), - ) - .await; + let now = Instant::now(); + if last_logged_at.is_none_or(|last| now.duration_since(last) >= RETRY_LOG_INTERVAL) { + // WARN, not silent: this loop previously logged nothing at all on a + // failed attempt, so a SGLang engine that's slow (or never becomes) + // healthy produced zero visible output anywhere for up to + // startup_deadline (default 300s) -- indistinguishable from a hang. + // Rate-limited like GrpcChannelPool::connect_until_ready: a normal + // slow startup retries every retry_interval (default 1s) and would + // otherwise spam hundreds of lines. + tracing::warn!( + attempt, + elapsed = ?started.elapsed(), + remaining = ?deadline.saturating_duration_since(now), + retry_interval = ?self.transport.retry_interval, + reason = %retry_message, + "SGLang not healthy yet; retrying" + ); + last_logged_at = Some(now); + } + tokio::time::sleep_until((now + self.transport.retry_interval).min(deadline)).await; } } } @@ -502,7 +525,7 @@ fn bootstrap_discover( .map_err(|err| client::engine_shutdown(format!("bootstrap runtime: {err}")))?; runtime.block_on(async { let deadline = Instant::now() + transport.startup_deadline; - let mut grpc_client = client::connect(endpoint, transport, deadline).await?; + let mut grpc_client = client::connect(endpoint, transport, deadline, true).await?; client::discover(&mut grpc_client, deadline).await }) } diff --git a/lib/sidecar/trtllm/launch/agg.sh b/lib/sidecar/trtllm/launch/agg.sh index 90cad14f2d86..afc2940704a7 100755 --- a/lib/sidecar/trtllm/launch/agg.sh +++ b/lib/sidecar/trtllm/launch/agg.sh @@ -7,11 +7,14 @@ set -e SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" -export DYNAMO_HOME="${DYNAMO_HOME:-$(readlink -f "$SCRIPT_DIR/../../../..")}" +# Resolved relative to this script, not via $DYNAMO_HOME: some runtime images +# (e.g. vllm_runtime.Dockerfile) bake DYNAMO_HOME to a minimal install path +# with no examples/ directory, which would silently override this and break +# sourcing. Matches examples/backends/trtllm/launch/agg.sh's own approach. # shellcheck disable=SC1091 # Resolved relative to this script at runtime. -source "$DYNAMO_HOME/examples/common/gpu_utils.sh" # build_trtllm_override_args_with_mem +source "$SCRIPT_DIR/../../../../examples/common/gpu_utils.sh" # build_trtllm_override_args_with_mem # shellcheck disable=SC1091 # Resolved relative to this script at runtime. -source "$DYNAMO_HOME/examples/common/launch_utils.sh" # print_launch_banner, wait_any_exit +source "$SCRIPT_DIR/../../../../examples/common/launch_utils.sh" # print_launch_banner, wait_any_exit MODEL="${MODEL:-Qwen/Qwen3-0.6B}" @@ -86,11 +89,19 @@ if [[ -n "$TRTLLM_CONTEXT_LENGTH" ]]; then TRTLLM_CONTEXT_LENGTH_ARGS=(--context-length "$TRTLLM_CONTEXT_LENGTH") fi -# `--grpc` needs `smg-grpc-proto`, which TRT-LLM keeps behind its optional -# `grpc-smg` extra. Constraint copied from that extra so we resolve what -# upstream resolves. -if ! "$TRTLLM_PYTHON" -c "import smg_grpc_proto" >/dev/null 2>&1; then - "$TRTLLM_PYTHON" -m pip install --no-cache-dir "smg-grpc-proto>=0.4.2" +# `--grpc` needs `smg-grpc-proto`. Pinned to the exact version +# lib/sidecar/trtllm/proto/trtllm_service.proto was vendored from (see +# proto/README.md's checksum) -- 0.4.2 lacks the include_stop_token_in_output +# field (added by 0.4.14) our proto and Rust code both expect, which makes +# every request fail with "'GenerateRequest' object has no attribute +# 'include_stop_token_in_output'". Check the resolved version, not just +# importability: an image whose TRT-LLM install already pulled an older +# smg-grpc-proto (e.g. via its own grpc-smg extra) would otherwise satisfy a +# bare `import` check and skip straight past this pin. sys.exit, not assert: +# `assert` is stripped entirely under `python -O`/`PYTHONOPTIMIZE`, which +# would make this check fail open (exit 0) even with the package missing. +if ! "$TRTLLM_PYTHON" -c "import importlib.metadata as m, sys; sys.exit(0 if m.version('smg-grpc-proto') == '0.4.14' else 1)" >/dev/null 2>&1; then + "$TRTLLM_PYTHON" -m pip install --no-cache-dir "smg-grpc-proto==0.4.14" fi HTTP_PORT="${DYN_HTTP_PORT:-8000}" diff --git a/lib/sidecar/trtllm/src/client.rs b/lib/sidecar/trtllm/src/client.rs index 155b374b0e32..477da7c6aaf9 100644 --- a/lib/sidecar/trtllm/src/client.rs +++ b/lib/sidecar/trtllm/src/client.rs @@ -30,7 +30,10 @@ impl TrtllmClient { endpoint: &GrpcEndpoint, transport: GrpcTransportConfig, ) -> Result { - let pool = GrpcChannelPool::connect("TensorRT-LLM", endpoint, transport).await?; + // bootstrap=false: TrtllmClient::connect's only call site is + // LLMEngine::start (lib/sidecar/trtllm/src/engine.rs), after the + // tracing subscriber is installed. See GrpcChannelPool::connect. + let pool = GrpcChannelPool::connect("TensorRT-LLM", endpoint, transport, false).await?; Ok(Self { pool }) } diff --git a/lib/sidecar/vllm/launch/agg.sh b/lib/sidecar/vllm/launch/agg.sh index b3572a826d6e..032f95c5c572 100755 --- a/lib/sidecar/vllm/launch/agg.sh +++ b/lib/sidecar/vllm/launch/agg.sh @@ -7,11 +7,14 @@ set -e SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" -export DYNAMO_HOME="${DYNAMO_HOME:-$(readlink -f "$SCRIPT_DIR/../../../..")}" +# Resolved relative to this script, not via $DYNAMO_HOME: some runtime images +# (e.g. vllm_runtime.Dockerfile) bake DYNAMO_HOME to a minimal install path +# with no examples/ directory, which would silently override this and break +# sourcing. Matches examples/backends/vllm/launch/agg.sh's own approach. # shellcheck disable=SC1091 # Resolved relative to this script at runtime. -source "$DYNAMO_HOME/examples/common/gpu_utils.sh" # build_vllm_gpu_mem_args +source "$SCRIPT_DIR/../../../../examples/common/gpu_utils.sh" # build_vllm_gpu_mem_args # shellcheck disable=SC1091 # Resolved relative to this script at runtime. -source "$DYNAMO_HOME/examples/common/launch_utils.sh" # print_launch_banner, wait_any_exit +source "$SCRIPT_DIR/../../../../examples/common/launch_utils.sh" # print_launch_banner, wait_any_exit MODEL="${MODEL:-Qwen/Qwen3-0.6B}" diff --git a/lib/sidecar/vllm/src/client.rs b/lib/sidecar/vllm/src/client.rs index 68c902aca02d..add4c72196d7 100644 --- a/lib/sidecar/vllm/src/client.rs +++ b/lib/sidecar/vllm/src/client.rs @@ -30,14 +30,18 @@ pub(crate) struct VllmClient { } impl VllmClient { + /// `bootstrap`: see `GrpcChannelPool::connect`. True from the + /// `bootstrap_discover` call site (before the tracing subscriber is + /// installed), false from `LLMEngine::start` (after it). pub(crate) async fn connect( endpoint: &GrpcEndpoint, transport: GrpcTransportConfig, startup_deadline: Instant, + bootstrap: bool, ) -> Result { let pool = timeout_at( startup_deadline, - GrpcChannelPool::connect("vLLM", endpoint, transport), + GrpcChannelPool::connect("vLLM", endpoint, transport, bootstrap), ) .await .map_err(|_| { diff --git a/lib/sidecar/vllm/src/engine.rs b/lib/sidecar/vllm/src/engine.rs index 3bb58df00363..e1c832a64713 100644 --- a/lib/sidecar/vllm/src/engine.rs +++ b/lib/sidecar/vllm/src/engine.rs @@ -679,7 +679,8 @@ impl LLMEngine for VllmSidecarEngine { "connecting to vLLM gRPC" ); let startup_deadline = client::startup_deadline(self.transport.startup_deadline)?; - let client = VllmClient::connect(&self.endpoint, self.transport, startup_deadline).await?; + let client = + VllmClient::connect(&self.endpoint, self.transport, startup_deadline, false).await?; client .wait_for_services( &[CONTROL_SERVICE, INFERENCE_SERVICE], @@ -1264,7 +1265,8 @@ fn bootstrap_discover( connections: std::num::NonZeroUsize::MIN, ..transport }; - let client = VllmClient::connect(endpoint, bootstrap_transport, startup_deadline).await?; + let client = + VllmClient::connect(endpoint, bootstrap_transport, startup_deadline, true).await?; client .wait_for_services( &[CONTROL_SERVICE], diff --git a/lib/sidecar/vllm/src/tests.rs b/lib/sidecar/vllm/src/tests.rs index 4a1c2fdcbd7e..971f972ba2a2 100644 --- a/lib/sidecar/vllm/src/tests.rs +++ b/lib/sidecar/vllm/src/tests.rs @@ -3170,7 +3170,7 @@ async fn pool_uses_each_configured_connection() { }; let endpoint = GrpcEndpoint::parse(&server.endpoint, "--grpc-endpoint").unwrap(); let deadline = crate::client::startup_deadline(transport.startup_deadline).unwrap(); - let client = VllmClient::connect(&endpoint, transport, deadline) + let client = VllmClient::connect(&endpoint, transport, deadline, false) .await .expect("connect pool"); assert_eq!(client.connection_count(), 2); diff --git a/pyproject.toml b/pyproject.toml index fd52d6f6957e..713f70b24b40 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -352,6 +352,7 @@ markers = [ "mocker: marks tests for the mocker component", "router: marks tests for router component", "planner: marks tests for planner component", + "sidecar: marks tests that launch a Dynamo dynamo-*-sidecar binary against its native-gRPC engine via lib/sidecar/*/launch/*.sh", "kvbm: marks tests for KV behavior and model determinism", "kvbm_consolidator: marks KVBM consolidator/router integration tests", "kvbm_determinism: marks KVBM model determinism tests", diff --git a/tests/conftest.py b/tests/conftest.py index f7973f6d27d7..fa8d30cbe59a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -235,6 +235,11 @@ def pytest_configure(config: pytest.Config) -> None: "token_budget_parity: compares native backend and Dynamo prompt/output " "overflow behavior", ) + config.addinivalue_line( + "markers", + "sidecar: marks tests that launch a Dynamo dynamo-*-sidecar binary " + "against its native-gRPC engine via lib/sidecar/*/launch/*.sh", + ) config.addinivalue_line( "markers", "framework_with_efa: marks deployment tests that require an EFA-capable " diff --git a/tests/serve/test_sidecar.py b/tests/serve/test_sidecar.py new file mode 100644 index 000000000000..91f03d518efe --- /dev/null +++ b/tests/serve/test_sidecar.py @@ -0,0 +1,136 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""E2E coverage for lib/sidecar/{vllm,sglang,trtllm}/launch/agg.sh (native-gRPC sidecar + engine).""" + +import dataclasses +import os + +import pytest + +from tests.serve.common import ( + WORKSPACE_DIR, + params_with_model_mark, + run_serve_deployment, +) +from tests.utils.constants import DynamoPortRange +from tests.utils.engine_process import EngineConfig +from tests.utils.payload_builder import chat_payload_default +from tests.utils.port_utils import reserved_ports + +vllm_sidecar_dir = os.environ.get("VLLM_SIDECAR_DIR") or os.path.join( + WORKSPACE_DIR, "lib/sidecar/vllm" +) +sglang_sidecar_dir = os.environ.get("SGLANG_SIDECAR_DIR") or os.path.join( + WORKSPACE_DIR, "lib/sidecar/sglang" +) +trtllm_sidecar_dir = os.environ.get("TRTLLM_SIDECAR_DIR") or os.path.join( + WORKSPACE_DIR, "lib/sidecar/trtllm" +) + + +# Sequential stage only: no profiled_vram_gib mark yet, since actual peak VRAM +# has not been profiled for the sidecar launch path. Add one once measured, to +# admit these into the parallel stage alongside the equivalent dynamo.{backend} +# scenarios in tests/serve/test_{vllm,sglang,trtllm}.py. +sidecar_configs = { + "vllm_aggregated": EngineConfig( + name="vllm_aggregated", + directory=vllm_sidecar_dir, + script_name="agg.sh", + marks=[ + pytest.mark.vllm, + pytest.mark.gpu_1, + # Let the 600s health check report failure before pytest times out. + pytest.mark.timeout(780), + pytest.mark.pre_merge, + ], + model="Qwen/Qwen3-0.6B", + # Flush Python output promptly into CI logs. + env={"PYTHONUNBUFFERED": "1"}, + request_payloads=[ + chat_payload_default(), + ], + ), + "sglang_aggregated": EngineConfig( + name="sglang_aggregated", + directory=sglang_sidecar_dir, + script_name="agg.sh", + marks=[ + pytest.mark.sglang, + pytest.mark.gpu_1, + pytest.mark.timeout(780), + pytest.mark.pre_merge, + ], + model="Qwen/Qwen3-0.6B", + env={"PYTHONUNBUFFERED": "1"}, + request_payloads=[ + chat_payload_default(), + ], + ), + "trtllm_aggregated": EngineConfig( + name="trtllm_aggregated", + directory=trtllm_sidecar_dir, + script_name="agg.sh", + marks=[ + pytest.mark.trtllm, + pytest.mark.gpu_1, + pytest.mark.timeout(780), + pytest.mark.pre_merge, + ], + model="Qwen/Qwen3-0.6B", + env={ + # TRT-LLM blocks greedy n>1 by default; matches the guard already + # enabled for the equivalent dynamo.trtllm scenario in test_trtllm.py. + "TLLM_ALLOW_N_GREEDY_DECODING": "1", + "PYTHONUNBUFFERED": "1", + }, + request_payloads=[ + chat_payload_default(), + ], + ), +} + + +@pytest.fixture(params=params_with_model_mark(sidecar_configs)) +def sidecar_config_test(request): + """Fixture that provides different sidecar test configurations""" + return sidecar_configs[request.param] + + +@pytest.mark.core +@pytest.mark.sidecar +@pytest.mark.e2e +@pytest.mark.parametrize("num_system_ports", [2], indirect=True) +def test_serve_deployment( + sidecar_config_test, + request, + runtime_services_dynamic_ports, + dynamo_dynamic_ports, + num_system_ports, + predownload_models, +): + """ + Launch a lib/sidecar//launch/agg.sh script end-to-end (Dynamo + frontend + native-gRPC engine + dynamo--sidecar) and confirm it + serves a real chat completion. + """ + assert ( + num_system_ports >= 2 + ), "serve tests require at least SYSTEM_PORT1 + SYSTEM_PORT2" + config = dataclasses.replace( + sidecar_config_test, frontend_port=dynamo_dynamic_ports.frontend_port + ) + if config.name == "vllm_aggregated": + with reserved_ports(2, start_port=DynamoPortRange.SERVE.value) as engine_ports: + run_serve_deployment( + config, + request, + ports=dynamo_dynamic_ports, + extra_env={ + "VLLM_RS_HTTP_PORT": str(engine_ports[0]), + "VLLM_GRPC_PORT": str(engine_ports[1]), + }, + ) + else: + run_serve_deployment(config, request, ports=dynamo_dynamic_ports) diff --git a/tests/utils/managed_process.py b/tests/utils/managed_process.py index 158a6f3bb0ca..33b79cf51fe6 100644 --- a/tests/utils/managed_process.py +++ b/tests/utils/managed_process.py @@ -698,6 +698,7 @@ def _check_port(self, port, timeout=30, sleep=0.1): time.sleep(sleep) elapsed = time.time() - start_time self._logger.error("FAILED: Check Port: %s", port) + self._log_tail_on_error() raise RuntimeError("FAILED: Check Port: %s" % port) def _check_urls(self, timeout): @@ -784,6 +785,7 @@ def _check_url(self, url, timeout=30, sleep=1, log_interval=20): attempt, timeout, ) + self._log_tail_on_error(lines=100) raise RuntimeError( "TIMEOUT: Check URL: %s failed after %.1fs (timeout=%.1fs)" % (url, elapsed, timeout) @@ -851,6 +853,7 @@ def _check_func(self, func, timeout=30, sleep=1, log_interval=20): attempt, elapsed, ) + self._log_tail_on_error(lines=100) raise RuntimeError("FAILED: Custom health check") def _terminate_all_matching_process_names(self): diff --git a/tests/utils/payload_builder.py b/tests/utils/payload_builder.py index bd77cb005bfc..6000adfe865c 100644 --- a/tests/utils/payload_builder.py +++ b/tests/utils/payload_builder.py @@ -638,19 +638,23 @@ def _check_chat_endpoint(remaining_timeout: float = 30.0) -> bool: stream=False, ).with_model(model) payload.port = port - try: - resp = send_request( - payload.url(), - payload.body, - timeout=min(max(1.0, remaining_timeout), 5.0), - method=payload.method, - log_level=10, + # Let ManagedProcess log the actual health-check failure. + resp = send_request( + payload.url(), + payload.body, + timeout=min(max(1.0, remaining_timeout), 5.0), + method=payload.method, + log_level=10, + ) + # raise_for_status() omits the response body. + if not resp.ok: + raise RuntimeError( + f"chat health check got HTTP {resp.status_code} from {resp.url}: " + f"{resp.text[:500]!r}" ) - # Validate structure only; expected_response is empty - _ = payload.response_handler(resp) - return True - except Exception: - return False + # Validate structure only; expected_response is empty + payload.response_handler(resp) + return True return _check_chat_endpoint @@ -665,20 +669,26 @@ def _check_completions_endpoint(remaining_timeout: float = 30.0) -> bool: stream=False, ).with_model(model) payload.port = port - try: - resp = send_request( - payload.url(), - payload.body, - timeout=min(max(1.0, remaining_timeout), 5.0), - method=payload.method, - log_level=10, + # See make_chat_health_check: no try/except, so ManagedProcess._check_func's + # own exception logging can surface the real failure reason. + resp = send_request( + payload.url(), + payload.body, + timeout=min(max(1.0, remaining_timeout), 5.0), + method=payload.method, + log_level=10, + ) + # See make_chat_health_check: surface the response body, since + # raise_for_status() alone only reports the status line. + if not resp.ok: + raise RuntimeError( + f"completions health check got HTTP {resp.status_code} from " + f"{resp.url}: {resp.text[:500]!r}" ) - out = payload.response_handler(resp) - if not out: - raise ValueError("") - return True - except Exception: - return False + out = payload.response_handler(resp) + if not out: + raise ValueError(f"completions health check got empty response: {out!r}") + return True return _check_completions_endpoint From 3322d1f340688af27b09fb2eda59e21e344999fa Mon Sep 17 00:00:00 2001 From: Neelay Shah Date: Thu, 17 Sep 2026 20:16:55 -0700 Subject: [PATCH 095/191] docs(operator): document the DGDR workload-creation trust boundary (#14429) Signed-off-by: nnshah1 Co-authored-by: Claude Opus 4.8 --- .../profiler/utils/dgdr_v1beta1_types.py | 2 +- .../dynamographdeploymentrequest_types.go | 16 +++++++ ...dia.com_dynamographdeploymentrequests.yaml | 16 +++++++ .../auto-deployment/auto-deploy-with-dgdr.md | 43 +++++++++++++++++++ .../additional-resources/api-reference-k8s.md | 2 +- .../kubernetes-api/full-api-reference.mdx | 2 +- 6 files changed, 78 insertions(+), 3 deletions(-) diff --git a/components/src/dynamo/profiler/utils/dgdr_v1beta1_types.py b/components/src/dynamo/profiler/utils/dgdr_v1beta1_types.py index 68f6d952cd1e..952b472cde8a 100644 --- a/components/src/dynamo/profiler/utils/dgdr_v1beta1_types.py +++ b/components/src/dynamo/profiler/utils/dgdr_v1beta1_types.py @@ -174,7 +174,7 @@ class OverridesSpec(BaseModel): profilingJob: Optional[Dict[str, Any]] = Field( default=None, - description="ProfilingJob allows overriding the profiling Job specification. Fields set here are merged into the controller-generated Job spec.", + description="ProfilingJob allows overriding the profiling Job specification. Fields set here are merged into the controller-generated Job spec. Security: creating a DGDR is workload-creation authority in its namespace — these overrides carry the same blast radius as creating a Job or Pod directly there, by design. Pod security is enforced centrally by Kubernetes Pod Security Admission on the resulting Pods once the namespace is labeled (see pod-security.kubernetes.io/enforce): it applies the full Pod Security Standards — covering privileged, host namespaces, and hostPath, not only securityContext — not this API. ServiceAccount identity is a separate layer: these overrides can set serviceAccountName and automountServiceAccountToken, which are bounded by RBAC and namespace membership rather than PSA — the same authority any Pod author in the namespace already holds. Grant create/update on DGDRs only to principals trusted to create Pods in the namespace. The profiling Job always runs in the DGDR's own namespace and overrides cannot change that — but namespace containment is not node or cross-tenant isolation. Dynamo's workloads, including this Job, satisfy the baseline standard, so enforce baseline (non-exempt) on every resulting Pod to close the privileged, host-namespace, host-device, and hostPath paths.", ) trustRemoteCode: bool = Field( default=False, diff --git a/deploy/operator/api/v1beta1/dynamographdeploymentrequest_types.go b/deploy/operator/api/v1beta1/dynamographdeploymentrequest_types.go index 2ed3141deb05..f874bff74678 100644 --- a/deploy/operator/api/v1beta1/dynamographdeploymentrequest_types.go +++ b/deploy/operator/api/v1beta1/dynamographdeploymentrequest_types.go @@ -296,6 +296,22 @@ type ModelCacheSpec struct { type OverridesSpec struct { // ProfilingJob allows overriding the profiling Job specification. // Fields set here are merged into the controller-generated Job spec. + // + // Security: creating a DGDR is workload-creation authority in its namespace — + // these overrides carry the same blast radius as creating a Job or Pod directly + // there, by design. Pod security is enforced centrally by Kubernetes Pod Security + // Admission on the resulting Pods once the namespace is labeled (see + // pod-security.kubernetes.io/enforce): it applies the full Pod Security Standards — + // covering privileged, host namespaces, and hostPath, not only securityContext — + // not this API. ServiceAccount identity is a separate layer: these overrides can + // set serviceAccountName and automountServiceAccountToken, which are bounded by + // RBAC and namespace membership rather than PSA — the same authority any Pod author + // in the namespace already holds. Grant create/update on DGDRs only to principals + // trusted to create Pods in the namespace. The profiling Job always runs in the + // DGDR's own namespace and overrides cannot change that — but namespace containment + // is not node or cross-tenant isolation. Dynamo's workloads, including this Job, + // satisfy the baseline standard, so enforce baseline (non-exempt) on every resulting + // Pod to close the privileged, host-namespace, host-device, and hostPath paths. // +optional ProfilingJob *batchv1.JobSpec `json:"profilingJob,omitempty"` diff --git a/deploy/operator/config/crd/bases/nvidia.com_dynamographdeploymentrequests.yaml b/deploy/operator/config/crd/bases/nvidia.com_dynamographdeploymentrequests.yaml index e92bf18a3214..39467c831d18 100644 --- a/deploy/operator/config/crd/bases/nvidia.com_dynamographdeploymentrequests.yaml +++ b/deploy/operator/config/crd/bases/nvidia.com_dynamographdeploymentrequests.yaml @@ -776,6 +776,22 @@ spec: description: |- ProfilingJob allows overriding the profiling Job specification. Fields set here are merged into the controller-generated Job spec. + + Security: creating a DGDR is workload-creation authority in its namespace — + these overrides carry the same blast radius as creating a Job or Pod directly + there, by design. Pod security is enforced centrally by Kubernetes Pod Security + Admission on the resulting Pods once the namespace is labeled (see + pod-security.kubernetes.io/enforce): it applies the full Pod Security Standards — + covering privileged, host namespaces, and hostPath, not only securityContext — + not this API. ServiceAccount identity is a separate layer: these overrides can + set serviceAccountName and automountServiceAccountToken, which are bounded by + RBAC and namespace membership rather than PSA — the same authority any Pod author + in the namespace already holds. Grant create/update on DGDRs only to principals + trusted to create Pods in the namespace. The profiling Job always runs in the + DGDR's own namespace and overrides cannot change that — but namespace containment + is not node or cross-tenant isolation. Dynamo's workloads, including this Job, + satisfy the baseline standard, so enforce baseline (non-exempt) on every resulting + Pod to close the privileged, host-namespace, host-device, and hostPath paths. properties: activeDeadlineSeconds: description: |- diff --git a/docs/fern/pages/kubernetes/auto-deployment/auto-deploy-with-dgdr.md b/docs/fern/pages/kubernetes/auto-deployment/auto-deploy-with-dgdr.md index bb8c4a2d38cb..43849cc30cb5 100644 --- a/docs/fern/pages/kubernetes/auto-deployment/auto-deploy-with-dgdr.md +++ b/docs/fern/pages/kubernetes/auto-deployment/auto-deploy-with-dgdr.md @@ -452,6 +452,49 @@ replacement behavior and requires the complete desired argument list. For the complete merge, metadata, and validation rules, see [DGDR Reference — Generated DGD overrides](../../reference/kubernetes-api/dynamo-graph-deployment-request.mdx#generated-dgd-overrides). +### Profiling job overrides and the trust boundary + +`spec.overrides.profilingJob` accepts a partial Kubernetes `JobSpec` that the operator merges +into the profiling Job it launches (for example, to add tolerations or adjust resources). Because +the operator creates that Job on your behalf, treat this the way Kubernetes treats any +workload-creation API: + +> [!IMPORTANT] +> Any principal that can create workloads in a namespace where Dynamo runs — a `Pod` directly, or +> any resource that creates Pods (`Job`, `Deployment`, `DynamoGraphDeploymentRequest`, …) — is +> inside that namespace's trust boundary: it can run code with the Secrets and ServiceAccount +> tokens mounted in that namespace. Creating a DGDR is one such path and is no more privileged than +> creating a `Job` or `Pod` there — including through `overrides.profilingJob`. This is by design +> and matches how Kubernetes treats every Pod-spawning resource. +> +> Enforce Pod security **centrally on the resulting Pods** with +> [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) +> (and any admission webhooks), which applies the full +> [Pod Security Standards](https://kubernetes.io/docs/concepts/security/pod-security-standards/) — +> not only `securityContext` fields but also `privileged`, host namespaces, `hostPath` volumes, and +> host ports. PSA applies no policy until you label the namespace — set +> `pod-security.kubernetes.io/enforce: ` (plus the matching `audit`/`warn` labels) on every +> namespace where Dynamo runs, exactly as you would for any workload. The operator does not +> re-implement those checks. +> +> Dynamo's operator-generated workloads — including the DGDR profiling Job — satisfy the **`baseline`** +> standard. Enforce **`baseline`** to block the privileged-container, host-namespace, host-device, and +> `hostPath` escalation paths while keeping Dynamo running. +> +> PSA governs a Pod's security *posture*, not its *identity*: `overrides.profilingJob` can set the +> Job's `serviceAccountName` and `automountServiceAccountToken`, and those are bounded by RBAC and +> namespace membership, not by PSA — the same authority any Pod author in the namespace already has. +> So grant `create`/`update` on DGDRs — and on workload resources generally — only to principals you +> would trust to create Pods in that namespace, and use namespaces as the tenancy boundary — see +> [Kubernetes RBAC good practices](https://kubernetes.io/docs/concepts/security/rbac-good-practices/#workload-creation). + +The profiling Job object always remains in the DGDR's own namespace and overrides cannot relocate +it — but namespace containment is not node or cross-tenant isolation. If admission permits +privileged containers, host namespaces, host devices, or `hostPath` mounts, a DGDR creator can +obtain those capabilities through the operator, exactly as any Pod author in the namespace could. +Enforcing `baseline` non-exempt on every resulting Pod closes those paths; use namespaces as the +tenancy boundary for anything stronger. + ## Next steps | Goal | Guide | diff --git a/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md b/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md index fcdc3c856cd6..c255419e3a20 100644 --- a/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md +++ b/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md @@ -2578,7 +2578,7 @@ _Appears in:_ | Field | Description | Default | Validation | | --- | --- | --- | --- | -| `profilingJob` _[JobSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#jobspec-v1-batch)_ | ProfilingJob allows overriding the profiling Job specification.
Fields set here are merged into the controller-generated Job spec. | | Optional: \{\}
| +| `profilingJob` _[JobSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#jobspec-v1-batch)_ | ProfilingJob allows overriding the profiling Job specification.
Fields set here are merged into the controller-generated Job spec.
Security: creating a DGDR is workload-creation authority in its namespace —
these overrides carry the same blast radius as creating a Job or Pod directly
there, by design. Pod security is enforced centrally by Kubernetes Pod Security
Admission on the resulting Pods once the namespace is labeled (see
pod-security.kubernetes.io/enforce): it applies the full Pod Security Standards —
covering privileged, host namespaces, and hostPath, not only securityContext —
not this API. ServiceAccount identity is a separate layer: these overrides can
set serviceAccountName and automountServiceAccountToken, which are bounded by
RBAC and namespace membership rather than PSA — the same authority any Pod author
in the namespace already holds. Grant create/update on DGDRs only to principals
trusted to create Pods in the namespace. The profiling Job always runs in the
DGDR's own namespace and overrides cannot change that — but namespace containment
is not node or cross-tenant isolation. Dynamo's workloads, including this Job,
satisfy the baseline standard, so enforce baseline (non-exempt) on every resulting
Pod to close the privileged, host-namespace, host-device, and hostPath paths. | | Optional: \{\}
| | `trustRemoteCode` _boolean_ | TrustRemoteCode explicitly permits generated vLLM and SGLang workers to
execute custom code from the configured model repository. When enabled,
the profiler adds --trust-remote-code to every generated worker component
after the deployment topology has been generated. Enable this setting only
for model repositories you trust. | false | Optional: \{\}
| | `dgd` _[RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg)_ | DGD provides a partial, versioned DynamoGraphDeployment override for the
profiler-generated deployment. Set apiVersion to nvidia.com/v1alpha1 or
nvidia.com/v1beta1 and kind to DynamoGraphDeployment.
The profiler merges the override using the schema for its declared version.
If the generated DGD uses another supported version, the complete DGD is
converted before the merge and converted back afterward. The final DGD
selected or created by a DGDR is nvidia.com/v1beta1.
The override can update DGD fields, but topology entries are limited to
services or components already present in the generated DGD. Metadata labels
and annotations are merged, metadata.name selects the final DGD name, and
other identity or runtime metadata is ignored.
V1alpha1 worker argument lists retain legacy append behavior. V1beta1 follows
structural schema merge behavior, including map-list merging and atomic-list
replacement.
The raw embedded resource preserves either supported schema. The API server
validates that it has apiVersion and kind; override processing validates the
DGD kind, supported version, and field schema. | | EmbeddedResource: \{\}
Optional: \{\}
| diff --git a/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx b/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx index 7e840fd5b403..a6a643fb03dd 100644 --- a/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx +++ b/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx @@ -3689,7 +3689,7 @@ OverridesSpec allows customizing the profiling job and the generated DynamoGraph **Appears in:** [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec) -ProfilingJob allows overriding the profiling Job specification. Fields set here are merged into the controller-generated Job spec. +ProfilingJob allows overriding the profiling Job specification. Fields set here are merged into the controller-generated Job spec. Security: creating a DGDR is workload-creation authority in its namespace — these overrides carry the same blast radius as creating a Job or Pod directly there, by design. Pod security is enforced centrally by Kubernetes Pod Security Admission on the resulting Pods once the namespace is labeled (see pod-security.kubernetes.io/enforce): it applies the full Pod Security Standards — covering privileged, host namespaces, and hostPath, not only securityContext — not this API. ServiceAccount identity is a separate layer: these overrides can set serviceAccountName and automountServiceAccountToken, which are bounded by RBAC and namespace membership rather than PSA — the same authority any Pod author in the namespace already holds. Grant create/update on DGDRs only to principals trusted to create Pods in the namespace. The profiling Job always runs in the DGDR's own namespace and overrides cannot change that — but namespace containment is not node or cross-tenant isolation. Dynamo's workloads, including this Job, satisfy the baseline standard, so enforce baseline (non-exempt) on every resulting Pod to close the privileged, host-namespace, host-device, and hostPath paths. See [JobSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#jobspec-v1-batch). **Validation:** Optional: \{\} From d419abc120e50f1ba1f253d06690a740306b68a3 Mon Sep 17 00:00:00 2001 From: Jie Hao Date: Fri, 18 Sep 2026 00:17:20 -0400 Subject: [PATCH 096/191] test(efa): add the EFA disaggregated deploy test for sglang (#13893) Signed-off-by: Jie Hao Co-authored-by: Claude Opus 5 (1M context) --- .github/actions/connect-vcluster/action.yml | 3 + .github/workflows/nightly-ci.yml | 107 +++- tests/deploy/README.md | 16 + tests/deploy/efa/disagg-efa-sglang.yaml | 166 ++++++ tests/deploy/efa_utils.py | 615 +++++++++++++++++++ tests/deploy/test_deploy_efa.py | 623 +------------------- tests/deploy/test_deploy_efa_sglang.py | 83 +++ tests/deploy/test_efa_utils.py | 109 ++++ 8 files changed, 1123 insertions(+), 599 deletions(-) create mode 100644 tests/deploy/efa/disagg-efa-sglang.yaml create mode 100644 tests/deploy/efa_utils.py create mode 100644 tests/deploy/test_deploy_efa_sglang.py create mode 100644 tests/deploy/test_efa_utils.py diff --git a/.github/actions/connect-vcluster/action.yml b/.github/actions/connect-vcluster/action.yml index eafc9792a41b..77889ae55bf8 100644 --- a/.github/actions/connect-vcluster/action.yml +++ b/.github/actions/connect-vcluster/action.yml @@ -167,5 +167,8 @@ runs: fi KUBECONFIG_B64=$(base64 < "${KUBECONFIG_PATH}" | tr -d '\n') + # Masked before export: the value carries a vCluster client certificate, + # and every consumer interpolates it into a shell script. + echo "::add-mask::${KUBECONFIG_B64}" echo "kubeconfig_base64=${KUBECONFIG_B64}" >> $GITHUB_OUTPUT echo "::endgroup::" diff --git a/.github/workflows/nightly-ci.yml b/.github/workflows/nightly-ci.yml index 12873163a59a..fff53ec81f8a 100644 --- a/.github/workflows/nightly-ci.yml +++ b/.github/workflows/nightly-ci.yml @@ -641,11 +641,17 @@ jobs: # ============================================================================ # EFA DEPLOY TEST # ============================================================================ - # The only job here that runs against real EFA hardware. Everything else - # validates the -efa images statically; this one deploys a 1P1D vLLM stack on - # aws-dev-02 (p5 / H100, 32 EFA devices per node) and proves the prefill->decode - # KV transfer rode NIXL -> LIBFABRIC -> EFA instead of silently falling back to - # UCX. + # The only jobs here that run against real EFA hardware. Everything else + # validates the -efa images statically; these deploy a 1P1D stack on aws-dev-02 + # (p5 / H100, 32 EFA devices per node) -- vLLM first, then SGLang -- and prove + # the prefill->decode KV transfer rode NIXL -> LIBFABRIC -> EFA instead of + # silently falling back to UCX. + # + # The two framework tests share one vCluster and run one after the other rather + # than together, to keep peak GPU use on the shared CI pool at one 1P1D stack. + # SGLang is gated on the vLLM job having *finished*, not on it having passed + # (`!cancelled()` rather than `success()`), so a vLLM regression does not also + # delete the SGLang result. # # It cannot reuse shared-deploy-test.yml: that workflow hardcodes its runner, # timeout, ACR image reference and `-m framework_only` selector, and forwards no @@ -670,7 +676,7 @@ jobs: # nscleanup/ttl label for dynamo-deploy-test, so a leaked vCluster holds p5 # GPUs and EFA interfaces on a shared cluster with no automated reaper. efa-deploy-operator: - name: vLLM EFA Deploy Operator + name: EFA Deploy Operator needs: [compute-release-mode, operator-build, resolve-source-sha] if: ${{ needs.compute-release-mode.outputs.run_tests == 'true' }} runs-on: prod-deploy-tester-v1 @@ -754,10 +760,95 @@ jobs: image: ${{ vars.ECR_REGISTRY }}/${{ vars.ECR_REPOSITORY }}:${{ needs.resolve-source-sha.outputs.source_sha }}-${{ needs.vllm-efa-build.outputs.target_tag_plain }}-nightly platform_arch: amd64 + efa-deploy-test-sglang: + name: SGLang EFA Deploy Test + needs: [compute-release-mode, operator-build, resolve-source-sha, sglang-efa-build, efa-deploy-operator, efa-deploy-test-vllm] + # Runs after the vLLM test whatever that test concluded, so the two never hold + # GPUs on the shared CI pool at the same time, but a vLLM failure still leaves + # SGLang measured. Cancellation stops the lane; failure does not. + # + # `!cancelled()` replaces the default "every need succeeded" rule, so the two + # needs this job genuinely cannot run without -- the vCluster and the image -- + # have to be spelled out again. Only efa-deploy-test-vllm is allowed to fail. + if: ${{ !cancelled() && needs.compute-release-mode.outputs.run_tests == 'true' && needs.efa-deploy-operator.result == 'success' && needs.sglang-efa-build.result == 'success' }} + runs-on: prod-deploy-tester-v1 + # Same reasoning as the vLLM job. Bring-up is dominated by the cold image + # pull rather than by engine startup (measured on aws-dev-02: ~10 min to all + # pods ready cold, ~1.5 min once the image is on the nodes), which the test's + # own 900s readiness wait covers. + timeout-minutes: 30 + permissions: + contents: read + env: + KUBE_CONTEXT: nv-prd-dgxc.teleport.sh-dynamo-aws-dev-02 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + ref: ${{ needs.resolve-source-sha.outputs.source_sha }} + + - name: Set kubectl context to aws-dev-02 + uses: ./.github/actions/set-kube-context + + - name: Connect to vCluster + id: connect-vcluster + uses: ./.github/actions/connect-vcluster + with: + vcluster_name: ${{ needs.efa-deploy-operator.outputs.vcluster_name }} + vcluster_namespace: ${{ needs.efa-deploy-operator.outputs.namespace }} + + # The vLLM stack normally tears itself down in the test's own fixture, but + # that does not survive a job timeout or a lost runner, and + # dynamo-deploy-test's fallback cleanup cannot help: its GRAPH_NAME reads + # steps.deploy.outputs.graph_name, which the pytest step never sets, so it + # always reports "already cleaned up". Without this, a stranded vLLM stack + # would still hold GPUs while SGLang runs -- the one thing running the two + # lanes sequentially is meant to prevent. + - name: Delete any stranded vLLM EFA deployment + shell: bash + env: + KUBECONFIG_B64: ${{ steps.connect-vcluster.outputs.kubeconfig_base64 }} + PREFLIGHT_KUBECONFIG: ${{ github.workspace }}/.kubeconfig-preflight + run: | + set -euo pipefail + printf '%s' "${KUBECONFIG_B64}" | base64 -d > "${PREFLIGHT_KUBECONFIG}" + chmod 600 "${PREFLIGHT_KUBECONFIG}" + export KUBECONFIG="${PREFLIGHT_KUBECONFIG}" + kubectl delete dynamographdeployment vllm-disagg-efa \ + -n default --ignore-not-found --timeout=180s + # Deletion returns once the DGD object is gone; the pods it owned can + # outlive it, and those are what hold the GPUs and EFA devices. + SEL="nvidia.com/dynamo-graph-deployment-name=vllm-disagg-efa" + if ! kubectl wait --for=delete pod -l "${SEL}" -n default --timeout=180s; then + # wait also exits non-zero when the selector matched nothing, which + # is the normal path. Only pods that outlived the timeout matter, and + # they are worth a warning rather than a failure: SGLang may still + # schedule, and a hard failure here would lose that run entirely. + REMAINING=$(kubectl get pod -l "${SEL}" -n default -o name | wc -l | tr -d ' ') + [ "${REMAINING}" -eq 0 ] || echo "::warning::${REMAINING} stranded vllm-disagg-efa pod(s) still hold GPUs/EFA devices" + fi + rm -f "${PREFLIGHT_KUBECONFIG}" + + - name: Run EFA deploy test + uses: ./.github/actions/dynamo-deploy-test + with: + kubeconfig_base64: ${{ steps.connect-vcluster.outputs.kubeconfig_base64 }} + namespace: default + registry: ${{ secrets.AZURE_ACR_HOSTNAME }} + operator_tag: ${{ needs.operator-build.outputs.operator_default_tag }} + hf_token: ${{ secrets.HF_TOKEN }} + framework: sglang + test_name: sglang_efa + test_file: tests/deploy/test_deploy_efa_sglang.py + extra_pytest_args: -m framework_with_efa + # Straight from ECR, as for vLLM above. + image: ${{ vars.ECR_REGISTRY }}/${{ vars.ECR_REPOSITORY }}:${{ needs.resolve-source-sha.outputs.source_sha }}-${{ needs.sglang-efa-build.outputs.target_tag_plain }}-nightly + platform_arch: amd64 + efa-deploy-cleanup: - name: vLLM EFA Deploy Cleanup + name: EFA Deploy Cleanup if: always() - needs: [efa-deploy-operator, efa-deploy-test-vllm] + needs: [efa-deploy-operator, efa-deploy-test-vllm, efa-deploy-test-sglang] runs-on: prod-deploy-tester-v1 permissions: contents: read diff --git a/tests/deploy/README.md b/tests/deploy/README.md index cb3a3d66ecb9..6c3512778573 100644 --- a/tests/deploy/README.md +++ b/tests/deploy/README.md @@ -38,4 +38,20 @@ and DGD pods. Teardown stops DGDR reconciliation first and then waits for child resources to disappear. CI also runs the suite in a per-run namespace and deletes that namespace unconditionally. +`test_deploy_efa.py` and `test_deploy_efa_sglang.py` are the EFA lanes: each +deploys a 1P1D stack from `efa/` on an EFA-capable cluster (p5/H100) and proves +the prefill/decode KV transfer rode NIXL -> LIBFABRIC -> EFA rather than falling +back to UCX. They share their flow and assertions through `efa_utils.py`; what +differs per framework -- how LIBFABRIC is pinned, which worker initiates the +transfer, and therefore which NIXL and EFA adapter counters move -- lives in an +`EfaFrameworkProfile` in each test file. They are excluded from the +auto-discovered matrix and selected by the `framework_with_efa` marker: + +```bash +python -m pytest tests/deploy/test_deploy_efa_sglang.py \ + -m framework_with_efa \ + --image=registry.example/sglang-runtime:tag-efa \ + --namespace=efa-test -v -s +``` + New operator deployment tests belong in this directory. diff --git a/tests/deploy/efa/disagg-efa-sglang.yaml b/tests/deploy/efa/disagg-efa-sglang.yaml new file mode 100644 index 000000000000..7707a493908d --- /dev/null +++ b/tests/deploy/efa/disagg-efa-sglang.yaml @@ -0,0 +1,166 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Minimal SGLang disaggregated deployment for tests/deploy/test_deploy_efa_sglang.py. +# Companion to disagg-efa.yaml, which does the same for vLLM. What the EFA lanes +# assert, and how to run them, is in tests/deploy/README.md. +# +# Kept out of examples/backends/*/deploy/ so the auto-discovered deploy-test +# matrix (tests/deploy/conftest.py) never picks it up. +# +# Two things are intentionally absent, for the same reasons as in disagg-efa.yaml: +# +# * No tolerations or nodeSelector. The Kyverno policy deploy-test-pod-policy +# injects them for GPU pods in the dynamo-deploy-test namespace, and what it +# injects differs per cluster (an H100 ci-pool label on aws-dev-02, a GB200 +# gpu.product label on aws-dev-01), so hardcoding either breaks the other. +# +# * No LD_LIBRARY_PATH or PATH override. The -efa image sets up its own NIXL +# and libfabric paths, which are arch-dependent; overriding them here would +# mask the packaging regression tests/container/test_efa_image.py catches. +# +# Every image: below is a placeholder, overridden by the test via --image. +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: sglang-disagg-efa +spec: + components: + - name: Frontend + replicas: 1 + type: frontend + podTemplate: + spec: + containers: + - name: main + image: nvcr.io/nvidia/ai-dynamo/sglang-runtime:efa + - name: prefill + replicas: 1 + type: prefill + podTemplate: + spec: + containers: + - name: main + image: nvcr.io/nvidia/ai-dynamo/sglang-runtime:efa + workingDir: /workspace/examples/backends/sglang + command: [python3, -m, dynamo.sglang] + args: + - --model-path + - Qwen/Qwen3-0.6B + - --served-model-name + - Qwen/Qwen3-0.6B + - --page-size + - "16" + - --tp + - "1" + - --trust-remote-code + - --skip-tokenizer-init + - --disaggregation-mode + - prefill + - --disaggregation-transfer-backend + - nixl + - --disaggregation-bootstrap-port + - "12345" + - --host + - 0.0.0.0 + envFrom: + - secretRef: + name: hf-token-secret + env: + # Pins NIXL to the LIBFABRIC plugin. Without it SGLang requests UCX. + - { name: SGLANG_DISAGGREGATION_NIXL_BACKEND, value: LIBFABRIC } + - { name: FI_PROVIDER, value: efa } + # FI_LOG_LEVEL=info is what surfaces the libfabric:...:efa:mr: memory + # registration lines the test greps for as proof of the LIBFABRIC path. + - { name: FI_LOG_LEVEL, value: info } + - { name: FI_EFA_USE_DEVICE_RDMA, value: "1" } + - { name: FI_EFA_ENABLE_SHM_TRANSFER, value: "0" } + # SGLang pushes KV from prefill to decode (NIXL WRITE), so it is the + # prefill agent's tx counter that grows -- the mirror image of vLLM. + - { name: NIXL_TELEMETRY_ENABLE, value: "y" } + - { name: NIXL_TELEMETRY_EXPORTER, value: prometheus } + - { name: NIXL_TELEMETRY_PROMETHEUS_PORT, value: "19090" } + securityContext: + capabilities: + add: ["IPC_LOCK", "SYS_PTRACE"] + resources: + # nvidia.com/gpu is set on BOTH requests and limits on purpose: the + # Kyverno rule that injects the node targeting keys off + # spec.containers[].resources.requests."nvidia.com/gpu" > 0, so + # relying on requests being defaulted from limits would make the + # injection depend on admission ordering. + requests: + nvidia.com/gpu: "1" + # 1 EFA NIC per GPU. p5.48xlarge exposes 32 NICs for 8 GPUs, but a + # TP=1 transport smoke test only needs one device per worker. + vpc.amazonaws.com/efa: "1" + ephemeral-storage: 8Gi + limits: + nvidia.com/gpu: "1" + vpc.amazonaws.com/efa: "1" + - name: decode + replicas: 1 + type: decode + podTemplate: + spec: + # Force prefill and decode onto different hosts. Without this they are + # routinely co-scheduled, and a same-node transfer can be served without + # the traffic ever crossing the fabric -- which would make every EFA + # assertion pass on a deployment that never exercised EFA. + # The label values are the operator's own (`prefill`/`decode`); the + # plausible-looking `dynamo-component-type: worker` matches nothing. + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - topologyKey: kubernetes.io/hostname + labelSelector: + matchLabels: + nvidia.com/dynamo-graph-deployment-name: sglang-disagg-efa + nvidia.com/dynamo-component-type: prefill + containers: + - name: main + image: nvcr.io/nvidia/ai-dynamo/sglang-runtime:efa + workingDir: /workspace/examples/backends/sglang + command: [python3, -m, dynamo.sglang] + args: + - --model-path + - Qwen/Qwen3-0.6B + - --served-model-name + - Qwen/Qwen3-0.6B + - --page-size + - "16" + - --tp + - "1" + - --trust-remote-code + - --skip-tokenizer-init + - --disaggregation-mode + - decode + - --disaggregation-transfer-backend + - nixl + - --disaggregation-bootstrap-port + - "12345" + - --host + - 0.0.0.0 + envFrom: + - secretRef: + name: hf-token-secret + env: + - { name: SGLANG_DISAGGREGATION_NIXL_BACKEND, value: LIBFABRIC } + - { name: FI_PROVIDER, value: efa } + - { name: FI_LOG_LEVEL, value: info } + - { name: FI_EFA_USE_DEVICE_RDMA, value: "1" } + - { name: FI_EFA_ENABLE_SHM_TRANSFER, value: "0" } + - { name: NIXL_TELEMETRY_ENABLE, value: "y" } + - { name: NIXL_TELEMETRY_EXPORTER, value: prometheus } + - { name: NIXL_TELEMETRY_PROMETHEUS_PORT, value: "19090" } + securityContext: + capabilities: + add: ["IPC_LOCK", "SYS_PTRACE"] + resources: + requests: + nvidia.com/gpu: "1" + vpc.amazonaws.com/efa: "1" + ephemeral-storage: 8Gi + limits: + nvidia.com/gpu: "1" + vpc.amazonaws.com/efa: "1" diff --git a/tests/deploy/efa_utils.py b/tests/deploy/efa_utils.py new file mode 100644 index 000000000000..96185339f8b1 --- /dev/null +++ b/tests/deploy/efa_utils.py @@ -0,0 +1,615 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Shared machinery for the per-framework EFA verification deploy tests. + +One deployment flow and one set of assertions, parameterised by an +:class:`EfaFrameworkProfile`, so that ``test_deploy_efa.py`` (vLLM) and +``test_deploy_efa_sglang.py`` (SGLang) prove the same thing about their own +framework and a fix to the evidence rules cannot land in one copy only. + +What differs between frameworks is only *how the KV moves*, and that is exactly +what the profile carries: which worker initiates the NIXL transfer, which NIXL +telemetry counter therefore grows, and which pair of EFA adapter counters the +transfer shows up in. The evidence rules themselves -- LIBFABRIC backend on +every worker, no UCX anywhere, libfabric's own EFA memory-registration lines, +adapter counters that moved -- are identical and live here. +""" + +import json +import logging +import shlex +from dataclasses import dataclass +from pathlib import Path +from typing import Mapping + +# The request defaults, prompt and response validation are shared with +# tests/deploy/test_dgd.py via dgd_utils, a non-test module -- so these tests +# assert the same response contract as every other deploy test, and a fix to +# that contract cannot land in one copy only. +from tests.deploy.dgd_utils import ( + DEFAULT_REQUEST_TIMEOUT, + DEFAULT_TEMPERATURE, + TEST_PROMPT, + DeploymentSpec, + ManagedDeployment, + validate_chat_response, +) +from tests.utils.client import send_request, wait_for_model_availability + +logger = logging.getLogger(__name__) + +# Same model for every framework: the smallest thing that still forces a real +# prefill->decode KV transfer, so the lanes stay comparable and cheap. +EFA_MODEL_NAME = "Qwen/Qwen3-0.6B" + +MANIFEST_DIR = Path(__file__).parent / "efa" + +# Comfortably under the tests' own pytest timeout, so a deployment that never +# becomes ready loses the race to _wait_for_condition, which raises with pod +# statuses, conditions and warning events appended. Left at the 1800s default it +# would be pytest-timeout that fires, killing the test mid-wait with a traceback +# that says nothing about why the pods were not ready. Observed readiness on +# aws-dev-02 is ~90-150s for vLLM and ~150-250s for SGLang, so this is not a +# tight budget. +EFA_READINESS_TIMEOUT = 900 + +# Generate enough tokens to clear MIN_RESPONSE_CONTENT_LENGTH with margin. +# The shared DEFAULT_MAX_TOKENS=30 leaves a thin cushion above the 100-char +# minimum (a short, deterministic Qwen3-0.6B reply can land near the floor), +# so request a larger budget here to keep these single-completion tests robust. +EFA_MAX_TOKENS = 64 + +# NIXL states which backend it instantiated, per worker. Both strings were +# observed directly: a deployment with the LIBFABRIC pin removed logs +# "Backend UCX was instantiated" (plus nixl_agent.cpp warning that EFA NICs were +# detected but UCX was configured), and a correctly pinned one logs LIBFABRIC. +# This is a positive statement of backend selection rather than an inference. +NIXL_BACKEND_LIBFABRIC = "Backend LIBFABRIC was instantiated" +NIXL_BACKEND_UCX = "Backend UCX was instantiated" + +# libfabric's own memory-registration lines (FI_LOG_LEVEL>=info). These pin the +# transfer to the *efa* provider specifically -- choosing the LIBFABRIC backend +# alone would not rule out libfabric selecting shm or tcp underneath. +LIBFABRIC_EFA_MARKERS = ("efa:mr:", "efa_mr_reg") + +# NIXL Prometheus telemetry (enabled via NIXL_TELEMETRY_ENABLE=y in the +# manifests) is exposed on this port inside each worker pod. We scrape it with +# pod.exec(python3 ...) — python3 is the container entrypoint, so it is always +# present — which avoids depending on a named container port or port-forward. +NIXL_TELEMETRY_PORT = 19090 + +# The efa-node-exporter DaemonSet (monitoring namespace, hostNetwork, :9102) +# publishes per-NIC Amazon EFA counters. Unlike the NIXL agent counters -- which +# are agent-level and increment identically whichever backend moved the bytes -- +# these are read from the adapter, so a delta here is direct evidence that +# traffic crossed EFA. Measured idle noise on an assigned NIC is zero, and the +# delta matches the NIXL counter byte-for-byte. +EFA_EXPORTER_PORT = 9102 + +# 1 MiB floor for the adapter-counter gate: the observed KV volume for this +# prompt is ~12.8 MB, so this catches "nothing moved" without being brittle +# about the exact figure. +EFA_MIN_TRANSFER_BYTES = 1 << 20 + + +@dataclass(frozen=True) +class EfaFrameworkProfile: + """Everything that differs between one framework's EFA lane and another's. + + ``nixl_counter_service``/``nixl_counter_metric`` follow the direction of the + transfer: NIXL counts bytes on the agent that *initiates* it, so a framework + whose decode worker pulls KV (READ) is proved by rx bytes on decode, and one + whose prefill worker pushes KV (WRITE) by tx bytes on prefill. Asserting the + wrong side reads a permanently-zero counter and fails a healthy deployment. + ``efa_counter_by_role`` follows the same split at the adapter level. + """ + + name: str + manifest_name: str + prefill_service: str + decode_service: str + # How this framework is told to use LIBFABRIC, quoted back in the failure + # message so a regression names the knob that has to be checked. + backend_pin_hint: str + nixl_counter_service: str + nixl_counter_metric: str + efa_counter_by_role: Mapping[str, str] + + @property + def manifest_path(self) -> Path: + """Resolved from this file rather than from where pytest was invoked.""" + return MANIFEST_DIR / self.manifest_name + + @property + def worker_services(self) -> tuple[str, str]: + return (self.prefill_service, self.decode_service) + + +def _read_pod_logs(pod, tail_lines: int = 20000) -> str: + """Return this pod's logs, including the previous container instance. + + ``previous`` matters both ways: a worker that restarted during startup keeps + its EFA registration lines in the prior instance (gate would false-fail on a + healthy deployment), and a fallback that happened before a restart would + otherwise be invisible. ``tail_lines`` bounds memory -- FI_LOG_LEVEL=info is + extremely chatty and both workers' logs are held at once. + """ + chunks = [] + spec = pod.raw.get("spec", {}) + containers = [c["name"] for c in (spec.get("containers") or []) if c.get("name")] + for container in containers or [""]: + for previous in (True, False): + kwargs = {"tail_lines": tail_lines, "previous": previous} + if container: + kwargs["container"] = container + try: + chunks.append("\n".join(pod.logs(**kwargs))) + except Exception as e: # noqa: BLE001 - no previous instance is normal + logger.debug( + "logs(previous=%s) unavailable for %s/%s: %s", + previous, + pod.name, + container or "", + e, + ) + return "\n".join(chunks) + + +def log_nixl_layout(pod) -> None: + """Record where NIXL actually lives in the worker image. Diagnostic only. + + Deliberately not asserted on. The layout moves between framework images and + between releases -- vLLM and TRT-LLM expose the canonical + /opt/nvidia/nvda_nixl tree via NIXL_PLUGIN_DIR, while the CUDA SGLang image + gets NIXL from the pip wheel and exports no NIXL_* variables at all -- so a + test that pins the layout breaks on the next repackaging without any EFA + regression having occurred. Logging it keeps a failed run diagnosable + ("NIXL was over here, and these plugins were present") while the assertions + stay on the observable outcome: bytes moved over LIBFABRIC/EFA. + """ + snippet = ( + "import os;" + "d=os.environ.get('NIXL_PLUGIN_DIR','');" + "print('NIXL_PLUGIN_DIR=', d or '');" + "print('NIXL_LIB_DIR=', os.environ.get('NIXL_LIB_DIR','') or '');" + "print('LD_PRELOAD=', os.environ.get('LD_PRELOAD','') or '');" + "print('EFA_VERSION=', os.environ.get('EFA_VERSION','') or '');" + "print('plugins=', sorted(os.listdir(d)) if d and os.path.isdir(d) else '')" + ) + try: + result = pod.exec(["python3", "-c", snippet]) + logger.info("NIXL layout in %s:\n%s", pod.name, result.stdout.decode()) + except Exception as e: # noqa: BLE001 - diagnostics only, never fail the test + logger.warning("Could not read NIXL layout from %s: %s", pod.name, e) + + +def assert_nixl_used_libfabric(worker_pods: dict, profile: EfaFrameworkProfile) -> None: + """Every worker must have instantiated the LIBFABRIC backend, and no UCX. + + Evaluated per pod on purpose. Concatenating both workers' logs and asking + ``any()`` passes when only one side used EFA -- and one-sided fallback (say + decode landing without a usable EFA device) is exactly the regression this + test exists to catch. + """ + verdicts = {} + for role, pods in worker_pods.items(): + for pod in pods: + logs = _read_pod_logs(pod) + verdicts[f"{role}/{pod.name}"] = { + "libfabric_backend": NIXL_BACKEND_LIBFABRIC in logs, + "ucx_backend": NIXL_BACKEND_UCX in logs, + "efa_provider": any(m in logs for m in LIBFABRIC_EFA_MARKERS), + } + + assert verdicts, "No prefill/decode worker pods found to verify EFA usage" + for name, v in verdicts.items(): + logger.info("NIXL backend verdict %s: %s", name, v) + + no_libfabric = sorted(n for n, v in verdicts.items() if not v["libfabric_backend"]) + assert not no_libfabric, ( + f"EFA NOT confirmed: {len(no_libfabric)} of {len(verdicts)} workers never logged " + f"{NIXL_BACKEND_LIBFABRIC!r}: {no_libfabric}. Check that {profile.backend_pin_hint}" + ) + + on_ucx = sorted(n for n, v in verdicts.items() if v["ucx_backend"]) + assert not on_ucx, ( + f"EFA NOT confirmed: {len(on_ucx)} worker(s) instantiated the UCX backend " + f"({NIXL_BACKEND_UCX!r}): {on_ucx}. Even alongside LIBFABRIC this makes the " + "agent byte counter ambiguous about which transport moved the KV." + ) + + no_provider = sorted(n for n, v in verdicts.items() if not v["efa_provider"]) + assert not no_provider, ( + f"EFA NOT confirmed: {len(no_provider)} worker(s) show no libfabric EFA " + f"memory-registration lines {LIBFABRIC_EFA_MARKERS}: {no_provider}. The " + "LIBFABRIC backend was selected but libfabric may not have used the efa " + "provider (shm/tcp). Check FI_PROVIDER=efa and FI_LOG_LEVEL>=info." + ) + logger.info( + "EFA path confirmed on all %d workers: LIBFABRIC backend, no UCX, efa provider", + len(verdicts), + ) + + +def sum_nixl_agent_samples(text: str, metric: str) -> tuple[str, float | None]: + """Sum every ``metric`` sample in a NIXL Prometheus scrape. + + Accepts the bare name or a ``_total`` suffix, since NIXL renames these + counters across versions and the lane has to read either. Matching on the + name rather than on a line prefix keeps a future sibling series -- + ``_bucket``, ``_sum``, a per-backend split -- out of the total, which would + otherwise report growth the caller never asked about. + """ + total = 0.0 + found = False + for raw in text.splitlines(): + line = raw.strip() + if not line or line.startswith("#"): + continue + # Samples look like: agent_rx_bytes{agent="..."} 1234. The name runs up + # to the label block or the first space; the value is the final field. + head = line.split("{", 1)[0].split(maxsplit=1) + if not head or head[0] not in (metric, f"{metric}_total"): + continue + try: + total += float(line.rsplit(maxsplit=1)[1]) + found = True + except (IndexError, ValueError): + continue + return ("ok", total) if found else ("absent", None) + + +def read_nixl_agent_bytes(pod, metric: str) -> tuple[str, float | None]: + """Return the summed NIXL byte counter ``metric`` from a worker pod. + + Scrapes the in-pod NIXL Prometheus endpoint via ``pod.exec`` and sums every + matching sample (one per NIXL agent/label set). Returns the total, or + ``None`` with a status of ``scrape_failed``/``absent`` when telemetry is not + reachable or the metric is missing -- the caller decides what that means. + """ + snippet = ( + "import urllib.request;" + "print(urllib.request.urlopen(" + f"'http://localhost:{NIXL_TELEMETRY_PORT}/metrics', timeout=5).read().decode())" + ) + try: + result = pod.exec(["python3", "-c", snippet]) + text = result.stdout.decode() + except Exception as e: # noqa: BLE001 - classified as a scrape failure below + logger.warning("Could not scrape NIXL telemetry from %s: %s", pod.name, e) + return ("scrape_failed", None) + + return sum_nixl_agent_samples(text, metric) + + +def _parse_prometheus_labels(label_block: str) -> dict: + """Parse a Prometheus label block into a dict. + + Naive on commas inside label values, which node_amazonefa_* never has -- + device names are PCI-derived (rdmaps) and port is numeric. + """ + out = {} + for part in label_block.split(","): + key, sep, value = part.partition("=") + if sep: + out[key.strip()] = value.strip().strip('"') + return out + + +def parse_efa_device_metrics(metrics_lines, dev: str) -> dict: + """Return ``{metric_name: value}`` for exactly the device ``dev``. + + Matches the ``device`` label by equality rather than by substring. A node + publishes one series per metric per NIC, and the result here is keyed only by + metric name, so a loose match would let a second NIC's sample overwrite the + assigned one -- attributing another adapter's traffic to this worker and + passing the load-bearing gate in assert_efa_device_traffic on evidence from + the wrong NIC. Device names can nest (rdmap16s2 is a prefix of rdmap16s27), + so substring matching is not safe even though the current p5 fleet happens + to name every EFA device rdmaps0. + """ + out = {} + for line in metrics_lines: + line = line.strip() + if not line.startswith("node_amazonefa_"): + continue + name, sep, rest = line.partition("{") + if not sep: + # No label block at all, so the sample cannot be attributed to a NIC. + continue + label_block, sep, value = rest.rpartition("}") + if not sep: + continue + if _parse_prometheus_labels(label_block).get("device") != dev: + continue + try: + out[name] = float(value.split()[0]) + except (ValueError, IndexError): + continue + return out + + +def read_efa_device_counters(pod) -> dict: + """Read this pod's OWN EFA NIC counters from the node exporter. + + Resolves the assigned device (the pod sees all 32 NICs in sysfs but is given + exactly one ``/dev/infiniband/uverbs*``) and maps it to its ibdev name. The + in-pod snippet only fetches and coarse-filters to node_amazonefa_* lines; + device attribution happens in parse_efa_device_metrics above, so the part + that has to be exact is ordinary local code with unit tests rather than a + string executed over kubectl exec. + """ + snippet = ( + "import glob,os,json,urllib.request\n" + "u=[os.path.basename(p) for p in glob.glob('/dev/infiniband/uverbs*')]\n" + "if not u: print('{}'); raise SystemExit\n" + "dev=open('/sys/class/infiniband_verbs/%s/ibdev'%u[0]).read().strip()\n" + "ip=os.environ.get('EFA_EXPORTER_HOST','')\n" + f"t=urllib.request.urlopen('http://%s:{EFA_EXPORTER_PORT}/metrics'%ip,timeout=10).read().decode()\n" + "lines=[l for l in t.splitlines() if l.startswith('node_amazonefa_')]\n" + "print(json.dumps({'_ibdev':dev,'_lines':lines}))" + ) + try: + host = pod.raw["status"]["hostIP"] + result = pod.exec( + ["sh", "-c", f"EFA_EXPORTER_HOST={host} python3 -c {shlex.quote(snippet)}"] + ) + for line in result.stdout.decode().splitlines(): + line = line.strip() + if not line.startswith("{"): + continue + payload = json.loads(line) + dev = payload.get("_ibdev") + if not dev: + break + parsed = parse_efa_device_metrics(payload.get("_lines", []), dev) + parsed["_ibdev"] = dev + parsed["_status"] = "ok" + return parsed + except Exception as e: # noqa: BLE001 - classified as a scrape failure below + logger.warning("EFA device counters unavailable for %s: %s", pod.name, e) + return {"_status": "scrape_failed"} + return {"_status": "empty"} + + +def assert_efa_device_traffic( + before: dict, + after: dict, + profile: EfaFrameworkProfile, + min_bytes: int = EFA_MIN_TRANSFER_BYTES, +) -> None: + """Assert each worker's own EFA adapter moved at least ``min_bytes``. + + This is the only backend-independent proof in the test: it is read from the + adapter, not from NIXL, so it cannot be satisfied by a transfer that took a + different transport. Measured idle noise on an assigned NIC is zero. + """ + # Fails closed. This guards the only backend-independent proof in the test, so + # an unreachable exporter or a renamed counter must not quietly turn it into a + # no-op. The efa-node-exporter DaemonSet runs on both aws-dev-02 (8 nodes) and + # aws-dev-01 (13 nodes), so there is no lane where leniency here is justified. + failed = sorted( + role + for snap in (before, after) + for role, c in snap.items() + if c.get("_status") != "ok" + ) + assert not failed, ( + f"EFA traffic NOT confirmed: could not read EFA device counters for {failed}. " + f"The efa-node-exporter DaemonSet publishes them on :{EFA_EXPORTER_PORT} of each " + "node; an unreachable exporter is an infrastructure failure, not a platform " + "without EFA telemetry." + ) + + for role, counter in profile.efa_counter_by_role.items(): + b, a = before.get(role, {}), after.get(role, {}) + assert counter in b and counter in a, ( + f"EFA traffic NOT confirmed: counter {counter} missing for {role} " + f"(device {a.get('_ibdev') or b.get('_ibdev')}). Skipping it would leave " + "the adapter-level proof unasserted." + ) + delta = a[counter] - b[counter] + assert delta >= min_bytes, ( + f"EFA traffic NOT confirmed on {role} ({a.get('_ibdev')}): {counter} rose " + f"{delta:,.0f} bytes across the completion, expected at least " + f"{min_bytes:,}. The KV transfer did not cross this worker's EFA adapter." + ) + logger.info( + "EFA adapter traffic confirmed on %s (%s): %s +%s bytes", + role, + a.get("_ibdev"), + counter, + f"{delta:,.0f}", + ) + + +def assert_efa_rdma_traffic( + before: tuple[str, float | None], + after: tuple[str, float | None], + profile: EfaFrameworkProfile, +) -> None: + """Assert the initiating worker's NIXL byte counter grew across the request. + + Combined with assert_nixl_used_libfabric (which proves the *backend* is + LIBFABRIC/EFA), a strictly increasing counter proves KV bytes physically + moved through the NIXL/EFA agent for this inference -- not merely that the + path was configured. + + Fails closed. These lanes are pinned to aws-dev-02/H100, where the exporter + is known to work, so a scrape that errors is an infrastructure failure and + must not silently delete the only direct proof that bytes moved. An exporter + that is up but omits its principal counter is broken, not a platform without + telemetry, so both cases fail here rather than being tolerated. A GB200 lane + can add an explicit capability gate when it exists. + """ + before_status, bytes_before = before + after_status, bytes_after = after + metric = profile.nixl_counter_metric + + not_ok = { + k: v + for k, v in (("before", before_status), ("after", after_status)) + if v != "ok" + } + assert not not_ok, ( + f"EFA RDMA traffic NOT confirmed: NIXL {metric} unreadable ({not_ok}) on the " + f"{profile.nixl_counter_service} worker. 'scrape_failed' means the exporter on " + f":{NIXL_TELEMETRY_PORT} was unreachable; 'absent' means it responded without " + "the counter, which indicates NIXL_TELEMETRY_ENABLE did not take effect or the " + "metric was renamed. Either way there is no evidence KV moved." + ) + + assert bytes_after > bytes_before, ( + f"EFA RDMA traffic NOT confirmed: NIXL {metric} did not increase across the " + f"completion (before={bytes_before}, after={bytes_after}). A disagg request " + f"must move KV between prefill and decode; a flat counter on the " + f"{profile.nixl_counter_service} worker means no KV moved through the NIXL/EFA " + "agent." + ) + logger.info( + "EFA RDMA traffic confirmed: NIXL %s rose %s -> %s bytes across the request", + metric, + bytes_before, + bytes_after, + ) + + +async def run_efa_deployment_check( + profile: EfaFrameworkProfile, + image: str, + namespace: str, + skip_service_restart: bool, + request, +) -> None: + """Deploy this framework's EFA manifest and prove the KV rode EFA. + + 1. Deploys the profile's manifest with the EFA image under test + 2. Waits for the frontend and BOTH prefill and decode workers to be ready + 3. Port-forwards to the frontend and waits for the model to be available + 4. Baselines the NIXL agent byte counter on the worker that initiates the + transfer, and both workers' own EFA adapter counters + 5. Sends a chat completion (which requires a prefill->decode KV transfer) + 6. Validates the response + 7. Asserts the worker logs prove NIXL used the LIBFABRIC/EFA backend, that + the NIXL counter grew, and that each worker's own EFA adapter moved the + bytes -- i.e. KV physically crossed EFA, not just that the path was + configured. + """ + assert image, "--image is required for the EFA deploy test" + assert namespace, "--namespace is required for the EFA deploy test" + + deployment_spec = DeploymentSpec(profile.manifest_path) + deployment_spec.namespace = namespace + # Single EFA-tagged image for every service (the framework runtime image also + # provides the frontend entrypoint). + deployment_spec.set_image(image) + + logger.info( + "Starting %s EFA deploy test (image: %s, model: %s, namespace: %s)", + profile.name, + image, + EFA_MODEL_NAME, + namespace, + ) + + async with ManagedDeployment( + log_dir=request.node.name, + deployment_spec=deployment_spec, + namespace=namespace, + skip_service_restart=skip_service_restart, + readiness_timeout=EFA_READINESS_TIMEOUT, + ) as deployment: + # Both workers must be present — disaggregation is the whole point. + worker_pods = deployment.get_pods(list(profile.worker_services)) + for svc in profile.worker_services: + assert worker_pods.get(svc), f"No pods found for worker service {svc}" + # The worker that initiates the NIXL transfer is the one whose agent + # counts the bytes; see EfaFrameworkProfile. + counter_pod = worker_pods[profile.nixl_counter_service][0] + + frontend_pods = deployment.get_pods([deployment.frontend_service_name]) + frontend_pod_list = frontend_pods.get(deployment.frontend_service_name, []) + assert frontend_pod_list, "No frontend pods found for EFA deployment" + frontend_pod = frontend_pod_list[0] + logger.info("Found frontend pod: %s", frontend_pod.name) + + port = deployment_spec.port + port_forward = deployment.port_forward(frontend_pod, port) + assert ( + port_forward is not None + ), f"Failed to establish port forward to {frontend_pod.name}:{port}" + base_url = f"http://localhost:{port_forward.local_port}" + logger.info("Port forwarding established: %s", base_url) + + endpoint = deployment_spec.endpoint + model_ready = wait_for_model_availability( + url=base_url, + endpoint=endpoint, + model=EFA_MODEL_NAME, + logger=logger, + max_attempts=30, + ) + assert ( + model_ready + ), f"Model '{EFA_MODEL_NAME}' did not become available within the timeout" + + # Baseline the NIXL byte counter before the request, so we can prove the + # completion below makes it grow (KV moved over EFA). + nixl_before = read_nixl_agent_bytes(counter_pod, profile.nixl_counter_metric) + logger.info( + "NIXL %s before request: %s", profile.nixl_counter_metric, nixl_before + ) + efa_before = { + role: read_efa_device_counters(pods[0]) + for role, pods in worker_pods.items() + if pods + } + for role, c in efa_before.items(): + logger.info( + "EFA counters before (%s, %s): %s", + role, + c.get("_ibdev"), + {k: v for k, v in c.items() if k.endswith("_bytes")}, + ) + + url = f"{base_url}{endpoint}" + payload = { + "model": EFA_MODEL_NAME, + "messages": [{"role": "user", "content": TEST_PROMPT}], + "max_tokens": EFA_MAX_TOKENS, + "temperature": DEFAULT_TEMPERATURE, + "stream": False, + } + response = send_request( + url, payload, timeout=float(DEFAULT_REQUEST_TIMEOUT), method="POST" + ) + validate_chat_response(response=response, expected_model=EFA_MODEL_NAME) + + nixl_after = read_nixl_agent_bytes(counter_pod, profile.nixl_counter_metric) + logger.info( + "NIXL %s after request: %s", profile.nixl_counter_metric, nixl_after + ) + efa_after = { + role: read_efa_device_counters(pods[0]) + for role, pods in worker_pods.items() + if pods + } + + # A successful disagg completion means KV moved prefill->decode. Prove it + # (1) rode the LIBFABRIC/EFA backend rather than falling back to UCX, and + # (2) physically moved bytes over EFA RDMA. + log_nixl_layout(counter_pod) + assert_nixl_used_libfabric(worker_pods, profile) + assert_efa_rdma_traffic(nixl_before, nixl_after, profile) + # Backend-independent proof, read from the adapter rather than from NIXL. + assert_efa_device_traffic(efa_before, efa_after, profile) + + logger.info( + "EFA deployment test PASSED (framework: %s, image: %s, model: %s, " + "namespace: %s)", + profile.name, + image, + EFA_MODEL_NAME, + namespace, + ) diff --git a/tests/deploy/test_deploy_efa.py b/tests/deploy/test_deploy_efa.py index cb26956b80e7..3698fc807ce4 100644 --- a/tests/deploy/test_deploy_efa.py +++ b/tests/deploy/test_deploy_efa.py @@ -2,13 +2,17 @@ # SPDX-License-Identifier: Apache-2.0 """ -EFA verification deploy test. +EFA verification deploy test for vLLM. Verifies that an EFA-tagged image built from the commit under test can run Dynamo with Elastic Fabric Adapter (EFA) fully enabled: a disaggregated vLLM stack deploys on an EFA-capable cluster, serves a chat completion, and the prefill->decode KV-cache transfer rides NIXL -> LIBFABRIC -> EFA. +The deployment flow and every assertion live in tests/deploy/efa_utils.py and +are shared with the SGLang lane (test_deploy_efa_sglang.py); this file carries +only what is specific to vLLM. + This test is NOT part of the auto-discovered deploy-test matrix. It uses an explicit manifest (tests/deploy/efa/disagg-efa.yaml) and the ``framework_with_efa`` marker, and only makes sense on a cluster with p5/EFA @@ -27,419 +31,30 @@ minutes, which is far more than the per-commit risk warrants. """ -import json -import logging -import shlex -from pathlib import Path - import pytest -# The request defaults, prompt and response validation are shared with -# tests/deploy/test_dgd.py via dgd_utils, a non-test module -- so this test -# asserts the same response contract as every other deploy test, and a fix to -# that contract cannot land in one copy only. -from tests.deploy.dgd_utils import ( - DEFAULT_REQUEST_TIMEOUT, - DEFAULT_TEMPERATURE, - TEST_PROMPT, - DeploymentSpec, - ManagedDeployment, - validate_chat_response, +from tests.deploy.efa_utils import EfaFrameworkProfile, run_efa_deployment_check + +# vLLM's NixlConnector pulls: decode issues RDMA READs against prefill's KV +# blocks (_read_blocks). The bytes are therefore counted as rx on the decode +# agent, and at the adapter as reads issued by decode and read-responses served +# by prefill. SGLang pushes instead, which is why the two profiles differ here. +VLLM_EFA_PROFILE = EfaFrameworkProfile( + name="vLLM", + manifest_name="disagg-efa.yaml", + prefill_service="prefill", + decode_service="decode", + backend_pin_hint=( + "--kv-transfer-config still pins " + "kv_connector_extra_config.backends=['LIBFABRIC']." + ), + nixl_counter_service="decode", + nixl_counter_metric="agent_rx_bytes", + efa_counter_by_role={ + "decode": "node_amazonefa_rdma_read_bytes", + "prefill": "node_amazonefa_rdma_read_resp_bytes", + }, ) -from tests.utils.client import send_request, wait_for_model_availability - -logger = logging.getLogger(__name__) - -EFA_MODEL_NAME = "Qwen/Qwen3-0.6B" -PREFILL_SERVICE = "prefill" -DECODE_SERVICE = "decode" - -# Comfortably under the test's own pytest timeout below, so a deployment that -# never becomes ready loses the race to _wait_for_condition, which raises with -# pod statuses, conditions and warning events appended. Left at the 1800s default -# it would be pytest-timeout that fires, killing the test mid-wait with a -# traceback that says nothing about why the pods were not ready. Observed -# readiness on aws-dev-02 is ~90-150s, so this is not a tight budget. -EFA_READINESS_TIMEOUT = 900 - - -# Generate enough tokens to clear MIN_RESPONSE_CONTENT_LENGTH with margin. -# The shared DEFAULT_MAX_TOKENS=30 leaves a thin cushion above the 100-char -# minimum (a short, deterministic Qwen3-0.6B reply can land near the floor), -# so request a larger budget here to keep this single-completion test robust. -EFA_MAX_TOKENS = 64 - -# NIXL states which backend it instantiated, per worker. Both strings were -# observed directly: a deployment with backends:["LIBFABRIC"] removed logs -# "Backend UCX was instantiated" (plus nixl_agent.cpp warning that EFA NICs were -# detected but UCX was configured), and a correctly pinned one logs LIBFABRIC. -# This is a positive statement of backend selection rather than an inference. -NIXL_BACKEND_LIBFABRIC = "Backend LIBFABRIC was instantiated" -NIXL_BACKEND_UCX = "Backend UCX was instantiated" - -# libfabric's own memory-registration lines (FI_LOG_LEVEL>=info). These pin the -# transfer to the *efa* provider specifically -- choosing the LIBFABRIC backend -# alone would not rule out libfabric selecting shm or tcp underneath. -LIBFABRIC_EFA_MARKERS = ("efa:mr:", "efa_mr_reg") - -# NIXL Prometheus telemetry (enabled via NIXL_TELEMETRY_ENABLE=y in the manifest) -# is exposed on this port inside each worker pod. We scrape it with -# pod.exec(python3 ...) — python3 is the container entrypoint, so it is always -# present — which avoids depending on a named container port or port-forward. -NIXL_TELEMETRY_PORT = 19090 -# With NIXL READ semantics (vLLM _read_blocks) the decode worker pulls KV from -# prefill, so transferred bytes register as rx on the decode side (prefill tx -# stays ~0). agent_rx_bytes is therefore the authoritative "bytes moved over the -# NIXL/EFA agent" counter. Metric name per the test_efa_on_aws skill; TP=1 here, -# so the rank-0-only telemetry limitation does not apply. -NIXL_RX_BYTES_METRIC = "agent_rx_bytes" - -# The efa-node-exporter DaemonSet (monitoring namespace, hostNetwork, :9102) -# publishes per-NIC Amazon EFA counters. Unlike agent_rx_bytes -- which is a -# NIXL agent-level counter and increments identically whichever backend moved -# the bytes -- these are read from the adapter, so a delta here is direct -# evidence that traffic crossed EFA. Measured idle noise on an assigned NIC is -# zero, and the delta matches agent_rx_bytes byte-for-byte. -EFA_EXPORTER_PORT = 9102 -# decode issues RDMA READs; prefill serves them. Assert on the side that proves -# each worker actually moved bytes over its own adapter. -EFA_COUNTER_BY_ROLE = { - DECODE_SERVICE: "node_amazonefa_rdma_read_bytes", - PREFILL_SERVICE: "node_amazonefa_rdma_read_resp_bytes", -} - - -def _read_pod_logs(pod, tail_lines: int = 20000) -> str: - """Return this pod's logs, including the previous container instance. - - ``previous`` matters both ways: a worker that restarted during startup keeps - its EFA registration lines in the prior instance (gate would false-fail on a - healthy deployment), and a fallback that happened before a restart would - otherwise be invisible. ``tail_lines`` bounds memory -- FI_LOG_LEVEL=info is - extremely chatty and both workers' logs are held at once. - """ - chunks = [] - spec = pod.raw.get("spec", {}) if hasattr(pod, "raw") else {} - containers = [c["name"] for c in (spec.get("containers") or []) if c.get("name")] - for container in containers or [""]: - for previous in (True, False): - kwargs = {"tail_lines": tail_lines, "previous": previous} - if container: - kwargs["container"] = container - try: - chunks.append("\n".join(pod.logs(**kwargs))) - except Exception as e: # noqa: BLE001 - no previous instance is normal - logger.debug( - "logs(previous=%s) unavailable for %s/%s: %s", - previous, - pod.name, - container or "", - e, - ) - return "\n".join(chunks) - - -def log_nixl_layout(pod) -> None: - """Record where NIXL actually lives in the worker image. Diagnostic only. - - Deliberately not asserted on. The layout moves between framework images and - between releases -- vLLM and TRT-LLM expose the canonical - /opt/nvidia/nvda_nixl tree via NIXL_PLUGIN_DIR, while the CUDA SGLang image - gets NIXL from the pip wheel and exports no NIXL_* variables at all -- so a - test that pins the layout breaks on the next repackaging without any EFA - regression having occurred. Logging it keeps a failed run diagnosable - ("NIXL was over here, and these plugins were present") while the assertions - below stay on the observable outcome: bytes moved over LIBFABRIC/EFA. - """ - snippet = ( - "import os;" - "d=os.environ.get('NIXL_PLUGIN_DIR','');" - "print('NIXL_PLUGIN_DIR=', d or '');" - "print('NIXL_LIB_DIR=', os.environ.get('NIXL_LIB_DIR','') or '');" - "print('LD_PRELOAD=', os.environ.get('LD_PRELOAD','') or '');" - "print('EFA_VERSION=', os.environ.get('EFA_VERSION','') or '');" - "print('plugins=', sorted(os.listdir(d)) if d and os.path.isdir(d) else '')" - ) - try: - result = pod.exec(["python3", "-c", snippet]) - logger.info("NIXL layout in %s:\n%s", pod.name, result.stdout.decode()) - except Exception as e: # noqa: BLE001 - diagnostics only, never fail the test - logger.warning("Could not read NIXL layout from %s: %s", pod.name, e) - - -def assert_nixl_used_libfabric(worker_pods: dict) -> None: - """Every worker must have instantiated the LIBFABRIC backend, and no UCX. - - Evaluated per pod on purpose. Concatenating both workers' logs and asking - ``any()`` passes when only one side used EFA -- and one-sided fallback (say - decode landing without a usable EFA device) is exactly the regression this - test exists to catch. - """ - verdicts = {} - for role, pods in worker_pods.items(): - for pod in pods: - logs = _read_pod_logs(pod) - verdicts[f"{role}/{pod.name}"] = { - "libfabric_backend": NIXL_BACKEND_LIBFABRIC in logs, - "ucx_backend": NIXL_BACKEND_UCX in logs, - "efa_provider": any(m in logs for m in LIBFABRIC_EFA_MARKERS), - } - - assert verdicts, "No prefill/decode worker pods found to verify EFA usage" - for name, v in verdicts.items(): - logger.info("NIXL backend verdict %s: %s", name, v) - - no_libfabric = sorted(n for n, v in verdicts.items() if not v["libfabric_backend"]) - assert not no_libfabric, ( - f"EFA NOT confirmed: {len(no_libfabric)} of {len(verdicts)} workers never logged " - f"{NIXL_BACKEND_LIBFABRIC!r}: {no_libfabric}. Check that --kv-transfer-config " - "still pins kv_connector_extra_config.backends=['LIBFABRIC']." - ) - - on_ucx = sorted(n for n, v in verdicts.items() if v["ucx_backend"]) - assert not on_ucx, ( - f"EFA NOT confirmed: {len(on_ucx)} worker(s) instantiated the UCX backend " - f"({NIXL_BACKEND_UCX!r}): {on_ucx}. Even alongside LIBFABRIC this makes the " - "agent byte counter ambiguous about which transport moved the KV." - ) - - no_provider = sorted(n for n, v in verdicts.items() if not v["efa_provider"]) - assert not no_provider, ( - f"EFA NOT confirmed: {len(no_provider)} worker(s) show no libfabric EFA " - f"memory-registration lines {LIBFABRIC_EFA_MARKERS}: {no_provider}. The " - "LIBFABRIC backend was selected but libfabric may not have used the efa " - "provider (shm/tcp). Check FI_PROVIDER=efa and FI_LOG_LEVEL>=info." - ) - logger.info( - "EFA path confirmed on all %d workers: LIBFABRIC backend, no UCX, efa provider", - len(verdicts), - ) - - -def _read_nixl_rx_bytes(pod) -> tuple[str, float | None]: - """Return the summed NIXL ``agent_rx_bytes`` counter from a worker pod. - - Scrapes the in-pod NIXL Prometheus endpoint via ``pod.exec`` and sums every - ``agent_rx_bytes`` sample (one per NIXL agent/label set). Returns the total - bytes NIXL has received (KV pulled from prefill), or ``None`` if telemetry is - not reachable or the metric is absent. - """ - snippet = ( - "import urllib.request;" - "print(urllib.request.urlopen(" - f"'http://localhost:{NIXL_TELEMETRY_PORT}/metrics', timeout=5).read().decode())" - ) - try: - result = pod.exec(["python3", "-c", snippet]) - text = result.stdout.decode() - except Exception as e: # noqa: BLE001 - classified as a scrape failure below - logger.warning("Could not scrape NIXL telemetry from %s: %s", pod.name, e) - return ("scrape_failed", None) - - total = 0.0 - found = False - for raw in text.splitlines(): - line = raw.strip() - if not line or line.startswith("#"): - continue - # Samples look like: agent_rx_bytes{agent="..."} 1234 (also matches a - # possible _total suffix). The value is the final whitespace field. - if line.startswith(NIXL_RX_BYTES_METRIC): - try: - total += float(line.rsplit(maxsplit=1)[1]) - found = True - except (IndexError, ValueError): - continue - return ("ok", total) if found else ("absent", None) - - -def _parse_prometheus_labels(label_block: str) -> dict: - """Parse a Prometheus label block into a dict. - - Naive on commas inside label values, which node_amazonefa_* never has -- - device names are PCI-derived (rdmaps) and port is numeric. - """ - out = {} - for part in label_block.split(","): - key, sep, value = part.partition("=") - if sep: - out[key.strip()] = value.strip().strip('"') - return out - - -def parse_efa_device_metrics(metrics_lines, dev: str) -> dict: - """Return ``{metric_name: value}`` for exactly the device ``dev``. - - Matches the ``device`` label by equality rather than by substring. A node - publishes one series per metric per NIC, and the result here is keyed only by - metric name, so a loose match would let a second NIC's sample overwrite the - assigned one -- attributing another adapter's traffic to this worker and - passing the load-bearing gate in assert_efa_device_traffic on evidence from - the wrong NIC. Device names can nest (rdmap16s2 is a prefix of rdmap16s27), - so substring matching is not safe even though the current p5 fleet happens - to name every EFA device rdmaps0. - """ - out = {} - for line in metrics_lines: - line = line.strip() - if not line.startswith("node_amazonefa_"): - continue - name, sep, rest = line.partition("{") - if not sep: - # No label block at all, so the sample cannot be attributed to a NIC. - continue - label_block, sep, value = rest.rpartition("}") - if not sep: - continue - if _parse_prometheus_labels(label_block).get("device") != dev: - continue - try: - out[name] = float(value.split()[0]) - except (ValueError, IndexError): - continue - return out - - -def read_efa_device_counters(pod) -> dict: - """Read this pod's OWN EFA NIC counters from the node exporter. - - Resolves the assigned device (the pod sees all 32 NICs in sysfs but is given - exactly one ``/dev/infiniband/uverbs*``) and maps it to its ibdev name. The - in-pod snippet only fetches and coarse-filters to node_amazonefa_* lines; - device attribution happens in parse_efa_device_metrics above, so the part - that has to be exact is ordinary local code with unit tests rather than a - string executed over kubectl exec. - """ - snippet = ( - "import glob,os,json,urllib.request\n" - "u=[os.path.basename(p) for p in glob.glob('/dev/infiniband/uverbs*')]\n" - "if not u: print('{}'); raise SystemExit\n" - "dev=open('/sys/class/infiniband_verbs/%s/ibdev'%u[0]).read().strip()\n" - "ip=os.environ.get('EFA_EXPORTER_HOST','')\n" - f"t=urllib.request.urlopen('http://%s:{EFA_EXPORTER_PORT}/metrics'%ip,timeout=10).read().decode()\n" - "lines=[l for l in t.splitlines() if l.startswith('node_amazonefa_')]\n" - "print(json.dumps({'_ibdev':dev,'_lines':lines}))" - ) - try: - host = pod.raw["status"]["hostIP"] - result = pod.exec( - ["sh", "-c", f"EFA_EXPORTER_HOST={host} python3 -c {shlex.quote(snippet)}"] - ) - for line in result.stdout.decode().splitlines(): - line = line.strip() - if not line.startswith("{"): - continue - payload = json.loads(line) - dev = payload.get("_ibdev") - if not dev: - break - parsed = parse_efa_device_metrics(payload.get("_lines", []), dev) - parsed["_ibdev"] = dev - parsed["_status"] = "ok" - return parsed - except Exception as e: # noqa: BLE001 - classified as a scrape failure below - logger.warning("EFA device counters unavailable for %s: %s", pod.name, e) - return {"_status": "scrape_failed"} - return {"_status": "empty"} - - -def assert_efa_device_traffic(before: dict, after: dict, min_bytes: int) -> None: - """Assert each worker's own EFA adapter moved at least ``min_bytes``. - - This is the only backend-independent proof in the test: it is read from the - adapter, not from NIXL, so it cannot be satisfied by a transfer that took a - different transport. Measured idle noise on an assigned NIC is zero. - """ - # Fails closed. This guards the only backend-independent proof in the test, so - # an unreachable exporter or a renamed counter must not quietly turn it into a - # no-op. The efa-node-exporter DaemonSet runs on both aws-dev-02 (8 nodes) and - # aws-dev-01 (13 nodes), so there is no lane where leniency here is justified. - failed = sorted( - role - for snap in (before, after) - for role, c in snap.items() - if c.get("_status") != "ok" - ) - assert not failed, ( - f"EFA traffic NOT confirmed: could not read EFA device counters for {failed}. " - f"The efa-node-exporter DaemonSet publishes them on :{EFA_EXPORTER_PORT} of each " - "node; an unreachable exporter is an infrastructure failure, not a platform " - "without EFA telemetry." - ) - - for role, counter in EFA_COUNTER_BY_ROLE.items(): - b, a = before.get(role, {}), after.get(role, {}) - assert counter in b and counter in a, ( - f"EFA traffic NOT confirmed: counter {counter} missing for {role} " - f"(device {a.get('_ibdev') or b.get('_ibdev')}). Skipping it would leave " - "the adapter-level proof unasserted." - ) - delta = a[counter] - b[counter] - assert delta >= min_bytes, ( - f"EFA traffic NOT confirmed on {role} ({a.get('_ibdev')}): {counter} rose " - f"{delta:,.0f} bytes across the completion, expected at least " - f"{min_bytes:,}. The KV transfer did not cross this worker's EFA adapter." - ) - logger.info( - "EFA adapter traffic confirmed on %s (%s): %s +%s bytes", - role, - a.get("_ibdev"), - counter, - f"{delta:,.0f}", - ) - - -def assert_efa_rdma_traffic( - before: tuple[str, float | None], after: tuple[str, float | None] -) -> None: - """Assert the decode worker's NIXL rx-bytes counter grew across the request. - - Combined with assert_nixl_used_libfabric (which proves the *backend* is - LIBFABRIC/EFA), a strictly increasing ``agent_rx_bytes`` proves KV bytes - physically moved through the NIXL/EFA agent for this inference -- not merely - that the path was configured. - - Fails closed. This lane is pinned to aws-dev-02/H100, where the exporter is - known to work, so a scrape that errors is an infrastructure failure and must - not silently delete the only direct proof that bytes moved. Only a - *successful* scrape that genuinely lacks the metric is treated as a platform - without NIXL telemetry -- and even that is reported loudly, since on this - lane it is not expected either. A GB200 lane can add an explicit capability - gate when it exists. - """ - before_status, rx_before = before - after_status, rx_after = after - - # No silent-pass path. If either sample is anything other than a reading of - # the counter, we cannot say the KV moved through the NIXL agent -- and with - # that unknown we cannot claim the transfer used EFA RDMA at all. An exporter - # that is up but omits its principal counter is broken, not a platform - # without telemetry, so both cases fail here rather than being tolerated. - not_ok = { - k: v - for k, v in (("before", before_status), ("after", after_status)) - if v != "ok" - } - assert not not_ok, ( - f"EFA RDMA traffic NOT confirmed: NIXL {NIXL_RX_BYTES_METRIC} unreadable " - f"({not_ok}). 'scrape_failed' means the exporter on :{NIXL_TELEMETRY_PORT} " - "was unreachable; 'absent' means it responded without the counter, which " - "indicates NIXL_TELEMETRY_ENABLE did not take effect or the metric was " - "renamed. Either way there is no evidence KV moved." - ) - - assert rx_after > rx_before, ( - f"EFA RDMA traffic NOT confirmed: NIXL {NIXL_RX_BYTES_METRIC} did not " - f"increase across the completion (before={rx_before}, after={rx_after}). " - "A disagg request must pull KV from prefill to decode; a flat counter means " - "no KV moved through the NIXL/EFA agent." - ) - logger.info( - "EFA RDMA traffic confirmed: NIXL %s rose %s -> %s bytes across the request", - NIXL_RX_BYTES_METRIC, - rx_before, - rx_after, - ) @pytest.mark.framework_with_efa @@ -461,185 +76,11 @@ async def test_efa_deployment( skip_service_restart: bool, request, ) -> None: - """Deploy a disaggregated vLLM stack with EFA enabled and verify it serves. - - This test: - 1. Deploys tests/deploy/efa/disagg-efa.yaml with the EFA image under test - 2. Waits for the frontend and BOTH prefill and decode workers to be ready - 3. Port-forwards to the frontend and waits for the model to be available - 4. Baselines the decode worker's NIXL agent_rx_bytes telemetry counter - 5. Sends a chat completion (which requires prefill->decode KV transfer) - 6. Validates the response - 7. Asserts the worker logs prove NIXL used the LIBFABRIC/EFA backend, AND - that agent_rx_bytes grew across the request — i.e. KV bytes physically - moved over EFA RDMA, not just that the LIBFABRIC path was configured. - """ - assert image, "--image is required for the EFA deploy test" - assert namespace, "--namespace is required for the EFA deploy test" - - # Resolved from this file rather than the workspace root, so the test does - # not depend on a private helper or on where pytest was invoked from. - manifest_path = Path(__file__).parent / "efa" / "disagg-efa.yaml" - - deployment_spec = DeploymentSpec(manifest_path) - deployment_spec.namespace = namespace - # Single EFA-tagged image for every service (the vllm-runtime image also - # provides the frontend entrypoint). - deployment_spec.set_image(image) - - logger.info( - f"Starting EFA deploy test (image: {image}, model: {EFA_MODEL_NAME}, " - f"namespace: {namespace})" - ) - - async with ManagedDeployment( - log_dir=request.node.name, - deployment_spec=deployment_spec, + """Deploy a disaggregated vLLM stack with EFA enabled and verify it serves.""" + await run_efa_deployment_check( + profile=VLLM_EFA_PROFILE, + image=image, namespace=namespace, skip_service_restart=skip_service_restart, - readiness_timeout=EFA_READINESS_TIMEOUT, - ) as deployment: - # Both workers must be present — disaggregation is the whole point. - worker_pods = deployment.get_pods([PREFILL_SERVICE, DECODE_SERVICE]) - for svc in (PREFILL_SERVICE, DECODE_SERVICE): - assert worker_pods.get(svc), f"No pods found for worker service {svc}" - # Decode worker is the NIXL READ sink — its agent_rx_bytes counter is what - # we baseline and re-read to prove KV bytes actually moved over EFA. - decode_pod = worker_pods[DECODE_SERVICE][0] - - frontend_pods = deployment.get_pods([deployment.frontend_service_name]) - frontend_pod_list = frontend_pods.get(deployment.frontend_service_name, []) - assert frontend_pod_list, "No frontend pods found for EFA deployment" - frontend_pod = frontend_pod_list[0] - logger.info("Found frontend pod: %s", frontend_pod.name) - - port = deployment_spec.port - port_forward = deployment.port_forward(frontend_pod, port) - assert ( - port_forward is not None - ), f"Failed to establish port forward to {frontend_pod.name}:{port}" - base_url = f"http://localhost:{port_forward.local_port}" - logger.info("Port forwarding established: %s", base_url) - - endpoint = deployment_spec.endpoint - model_ready = wait_for_model_availability( - url=base_url, - endpoint=endpoint, - model=EFA_MODEL_NAME, - logger=logger, - max_attempts=30, - ) - assert ( - model_ready - ), f"Model '{EFA_MODEL_NAME}' did not become available within the timeout" - - # Baseline the decode worker's NIXL rx-bytes counter before the request, - # so we can prove the completion below makes it grow (KV pulled over EFA). - rx_before = _read_nixl_rx_bytes(decode_pod) - logger.info("NIXL %s before request: %s", NIXL_RX_BYTES_METRIC, rx_before) - efa_before = { - role: read_efa_device_counters(pods[0]) - for role, pods in worker_pods.items() - if pods - } - for role, c in efa_before.items(): - logger.info( - "EFA counters before (%s, %s): %s", - role, - c.get("_ibdev"), - {k: v for k, v in c.items() if k.endswith("_bytes")}, - ) - - url = f"{base_url}{endpoint}" - payload = { - "model": EFA_MODEL_NAME, - "messages": [{"role": "user", "content": TEST_PROMPT}], - "max_tokens": EFA_MAX_TOKENS, - "temperature": DEFAULT_TEMPERATURE, - "stream": False, - } - response = send_request( - url, payload, timeout=float(DEFAULT_REQUEST_TIMEOUT), method="POST" - ) - validate_chat_response(response=response, expected_model=EFA_MODEL_NAME) - - rx_after = _read_nixl_rx_bytes(decode_pod) - logger.info("NIXL %s after request: %s", NIXL_RX_BYTES_METRIC, rx_after) - efa_after = { - role: read_efa_device_counters(pods[0]) - for role, pods in worker_pods.items() - if pods - } - - # A successful disagg completion means KV moved prefill->decode. Prove it - # (1) rode the LIBFABRIC/EFA backend rather than falling back to UCX, and - # (2) physically moved bytes over EFA RDMA (the rx-bytes counter grew). - log_nixl_layout(decode_pod) - assert_nixl_used_libfabric(worker_pods) - assert_efa_rdma_traffic(rx_before, rx_after) - # Backend-independent proof, read from the adapter rather than from NIXL. - # 1 MiB floor: the observed KV volume for this prompt is ~12.8 MB, so this - # catches "nothing moved" without being brittle about the exact figure. - assert_efa_device_traffic(efa_before, efa_after, min_bytes=1 << 20) - - logger.info( - "EFA deployment test PASSED (image: %s, model: %s, namespace: %s)", - image, - EFA_MODEL_NAME, - namespace, - ) - - -# Real exporter output, trimmed. Device names are nested on purpose: rdmap16s2 -# is a prefix of rdmap16s27, and rdmap16s27 of rdmap16s270. A substring match on -# the device name -- which is what this parser used to do -- attributes the wrong -# NIC's counters to the worker, and because the result is keyed only by metric -# name the last match silently wins. -_COLLIDING_METRICS = """\ -# HELP node_amazonefa_rdma_read_bytes The number of bytes read with RDMA -# TYPE node_amazonefa_rdma_read_bytes gauge -node_amazonefa_rdma_read_bytes{device="rdmap16s2",port="1"} 100 -node_amazonefa_rdma_read_bytes{device="rdmap16s27",port="1"} 200 -node_amazonefa_rdma_read_bytes{device="rdmap16s270",port="1"} 300 -node_amazonefa_rdma_read_resp_bytes{device="rdmap16s27",port="1"} 400 -node_amazonefa_tx_bytes{device="rdmap16s270",port="1"} 500 -node_cpu_seconds_total{cpu="0",mode="idle"} 999 -""".splitlines() - - -@pytest.mark.pre_merge -@pytest.mark.unit -@pytest.mark.gpu_0 -def test_parse_efa_device_metrics_matches_device_exactly() -> None: - """Each device gets only its own samples, never a longer name's.""" - assert parse_efa_device_metrics(_COLLIDING_METRICS, "rdmap16s2") == { - "node_amazonefa_rdma_read_bytes": 100.0 - } - assert parse_efa_device_metrics(_COLLIDING_METRICS, "rdmap16s27") == { - "node_amazonefa_rdma_read_bytes": 200.0, - "node_amazonefa_rdma_read_resp_bytes": 400.0, - } - assert parse_efa_device_metrics(_COLLIDING_METRICS, "rdmap16s270") == { - "node_amazonefa_rdma_read_bytes": 300.0, - "node_amazonefa_tx_bytes": 500.0, - } - # An absent device yields nothing rather than borrowing a neighbour's series, - # so assert_efa_device_traffic fails closed on its "counter missing" branch. - assert parse_efa_device_metrics(_COLLIDING_METRICS, "rdmap99s0") == {} - - -@pytest.mark.pre_merge -@pytest.mark.unit -@pytest.mark.gpu_0 -def test_parse_efa_device_metrics_ignores_unattributable_samples() -> None: - """Non-EFA series, unlabelled samples and junk values are skipped.""" - lines = [ - 'node_cpu_seconds_total{cpu="0"} 1', # not an EFA metric - "node_amazonefa_rdma_read_bytes 7", # no label block -> no device - 'node_amazonefa_rdma_read_bytes{port="1"} 8', # labelled, but no device - 'node_amazonefa_tx_bytes{device="rdmap0s0",port="1"} not_a_number', - 'node_amazonefa_rx_bytes{device="rdmap0s0",port="1"} 9', - ] - assert parse_efa_device_metrics(lines, "rdmap0s0") == { - "node_amazonefa_rx_bytes": 9.0 - } + request=request, + ) diff --git a/tests/deploy/test_deploy_efa_sglang.py b/tests/deploy/test_deploy_efa_sglang.py new file mode 100644 index 000000000000..af37a1d52a6f --- /dev/null +++ b/tests/deploy/test_deploy_efa_sglang.py @@ -0,0 +1,83 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +""" +EFA verification deploy test for SGLang. + +The SGLang counterpart of test_deploy_efa.py: a disaggregated SGLang stack +deploys on an EFA-capable cluster, serves a chat completion, and the +prefill->decode KV-cache transfer rides NIXL -> LIBFABRIC -> EFA. The flow and +the assertions are shared with the vLLM lane via tests/deploy/efa_utils.py; only +the profile below is SGLang-specific. + +Run it explicitly, e.g.: + + pytest tests/deploy/test_deploy_efa_sglang.py -m framework_with_efa \ + --image= --namespace= -v -s + +The deployment name is fixed, so the namespace must be clear of a previous run +before starting a new one. CI is unaffected: every nightly gets a fresh +vCluster. +""" + +import pytest + +from tests.deploy.efa_utils import EfaFrameworkProfile, run_efa_deployment_check + +# SGLang pushes: the prefill worker writes its KV into decode's registered +# blocks over NIXL (WRITE), the mirror image of vLLM's pull. So the counter that +# grows is tx on the *prefill* agent, and at the adapter it is writes issued by +# prefill and write-receives on decode. Asserting vLLM's read counters here +# would read permanently-zero series and fail a healthy deployment: decode's +# agent_rx_bytes stays at 0 for the whole run, as measured on aws-dev-02. +# +# Volume, for the EFA_MIN_TRANSFER_BYTES floor: Qwen3-0.6B holds 114,688 bytes of +# KV per token, and --page-size 16 makes one page (1,835,008 bytes) the smallest +# transfer possible, so even a one-token prompt clears the 1 MiB floor. The +# deploy test's own prompt moved 16,516,672 bytes. +SGLANG_EFA_PROFILE = EfaFrameworkProfile( + name="SGLang", + manifest_name="disagg-efa-sglang.yaml", + prefill_service="prefill", + decode_service="decode", + backend_pin_hint=( + "SGLANG_DISAGGREGATION_NIXL_BACKEND=LIBFABRIC is still set on both " + "workers and --disaggregation-transfer-backend is still nixl." + ), + nixl_counter_service="prefill", + nixl_counter_metric="agent_tx_bytes", + efa_counter_by_role={ + "prefill": "node_amazonefa_rdma_write_bytes", + "decode": "node_amazonefa_rdma_write_recv_bytes", + }, +) + + +@pytest.mark.framework_with_efa +@pytest.mark.k8s +@pytest.mark.deploy +@pytest.mark.nightly +@pytest.mark.e2e +# Two GPUs total: one prefill, one decode. No framework marker -- the nightly job +# selects with -m framework_with_efa, and carrying @pytest.mark.sglang would both +# require an exemption in tests/conftest.py's framework auto-skip and make this +# test collectable by the multi-GPU jobs, whose selectors are +# "sglang and gpu_2 and not h100" and "sglang and (gpu_1 or gpu_2)" with no +# lifecycle filter. +@pytest.mark.gpu_2 +@pytest.mark.core +@pytest.mark.timeout(1200) +async def test_efa_deployment_sglang( + image: str, + namespace: str, + skip_service_restart: bool, + request, +) -> None: + """Deploy a disaggregated SGLang stack with EFA enabled and verify it serves.""" + await run_efa_deployment_check( + profile=SGLANG_EFA_PROFILE, + image=image, + namespace=namespace, + skip_service_restart=skip_service_restart, + request=request, + ) diff --git a/tests/deploy/test_efa_utils.py b/tests/deploy/test_efa_utils.py new file mode 100644 index 000000000000..7767bbd58fb9 --- /dev/null +++ b/tests/deploy/test_efa_utils.py @@ -0,0 +1,109 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Unit tests for the EFA deploy-test helpers (tests/deploy/efa_utils.py).""" + +import pytest + +from tests.deploy.efa_utils import parse_efa_device_metrics, sum_nixl_agent_samples + +# Real exporter output, trimmed. Device names are nested on purpose: rdmap16s2 +# is a prefix of rdmap16s27, and rdmap16s27 of rdmap16s270. A substring match on +# the device name -- which is what this parser used to do -- attributes the wrong +# NIC's counters to the worker, and because the result is keyed only by metric +# name the last match silently wins. +_COLLIDING_METRICS = tuple( + """\ +# HELP node_amazonefa_rdma_read_bytes The number of bytes read with RDMA +# TYPE node_amazonefa_rdma_read_bytes gauge +node_amazonefa_rdma_read_bytes{device="rdmap16s2",port="1"} 100 +node_amazonefa_rdma_read_bytes{device="rdmap16s27",port="1"} 200 +node_amazonefa_rdma_read_bytes{device="rdmap16s270",port="1"} 300 +node_amazonefa_rdma_read_resp_bytes{device="rdmap16s27",port="1"} 400 +node_amazonefa_tx_bytes{device="rdmap16s270",port="1"} 500 +node_cpu_seconds_total{cpu="0",mode="idle"} 999 +""".splitlines() +) + +# NIXL publishes one sample per agent, and the gate that consumes this only asks +# whether the total grew. A sibling series that grows on its own -- a per-backend +# split, or a histogram's _bucket/_sum -- would therefore be enough to satisfy it +# on evidence from somewhere other than the counter under test. +_SIBLING_SERIES = """\ +# HELP agent_tx_bytes Bytes sent by this agent +# TYPE agent_tx_bytes counter +agent_tx_bytes{agent="prefill-0"} 100 +agent_tx_bytes{agent="prefill-1"} 200 +agent_tx_bytes_by_backend{agent="prefill-0",backend="UCX"} 900 +agent_tx_bytes_bucket{agent="prefill-0",le="1024"} 700 +agent_rx_bytes{agent="prefill-0"} 50 +""" + + +@pytest.mark.pre_merge +@pytest.mark.unit +@pytest.mark.gpu_0 +def test_parse_efa_device_metrics_matches_device_exactly() -> None: + """Each device gets only its own samples, never a longer name's.""" + assert parse_efa_device_metrics(_COLLIDING_METRICS, "rdmap16s2") == { + "node_amazonefa_rdma_read_bytes": 100.0 + } + assert parse_efa_device_metrics(_COLLIDING_METRICS, "rdmap16s27") == { + "node_amazonefa_rdma_read_bytes": 200.0, + "node_amazonefa_rdma_read_resp_bytes": 400.0, + } + assert parse_efa_device_metrics(_COLLIDING_METRICS, "rdmap16s270") == { + "node_amazonefa_rdma_read_bytes": 300.0, + "node_amazonefa_tx_bytes": 500.0, + } + # An absent device yields nothing rather than borrowing a neighbour's series, + # so assert_efa_device_traffic fails closed on its "counter missing" branch. + assert parse_efa_device_metrics(_COLLIDING_METRICS, "rdmap99s0") == {} + + +@pytest.mark.pre_merge +@pytest.mark.unit +@pytest.mark.gpu_0 +def test_parse_efa_device_metrics_ignores_unattributable_samples() -> None: + """Non-EFA series, unlabelled samples and junk values are skipped.""" + lines = [ + 'node_cpu_seconds_total{cpu="0"} 1', # not an EFA metric + "node_amazonefa_rdma_read_bytes 7", # no label block -> no device + 'node_amazonefa_rdma_read_bytes{port="1"} 8', # labelled, but no device + 'node_amazonefa_tx_bytes{device="rdmap0s0",port="1"} not_a_number', + 'node_amazonefa_rx_bytes{device="rdmap0s0",port="1"} 9', + ] + assert parse_efa_device_metrics(lines, "rdmap0s0") == { + "node_amazonefa_rx_bytes": 9.0 + } + + +@pytest.mark.pre_merge +@pytest.mark.unit +@pytest.mark.gpu_0 +def test_sum_nixl_agent_samples_matches_metric_name_exactly() -> None: + """Every agent's sample is summed, and only that counter's own series.""" + assert sum_nixl_agent_samples(_SIBLING_SERIES, "agent_tx_bytes") == ("ok", 300.0) + assert sum_nixl_agent_samples(_SIBLING_SERIES, "agent_rx_bytes") == ("ok", 50.0) + + +@pytest.mark.pre_merge +@pytest.mark.unit +@pytest.mark.gpu_0 +def test_sum_nixl_agent_samples_accepts_total_suffix() -> None: + """NIXL spells these counters _total in some versions.""" + renamed = 'agent_tx_bytes_total{agent="prefill-0"} 42\n' + assert sum_nixl_agent_samples(renamed, "agent_tx_bytes") == ("ok", 42.0) + + +@pytest.mark.pre_merge +@pytest.mark.unit +@pytest.mark.gpu_0 +def test_sum_nixl_agent_samples_reports_absent() -> None: + """A counter that is missing or unparseable fails closed in the caller.""" + assert sum_nixl_agent_samples(_SIBLING_SERIES, "agent_read_bytes") == ( + "absent", + None, + ) + junk = 'agent_tx_bytes{agent="prefill-0"} not_a_number\n' + assert sum_nixl_agent_samples(junk, "agent_tx_bytes") == ("absent", None) From 99875cbf869d37eb0980a5fbc47a42176e606486 Mon Sep 17 00:00:00 2001 From: jthomson04 Date: Thu, 17 Sep 2026 21:29:32 -0700 Subject: [PATCH 097/191] fix(runtime): support IPv6-only IP resolution (#13126) Signed-off-by: jthomson04 --- Cargo.lock | 1 + .../components/runtime-configuration.mdx | 59 +- lib/backend-common/src/rl.rs | 8 +- lib/bindings/kvbm/Cargo.lock | 2 + lib/bindings/python/Cargo.lock | 2 + lib/bindings/python/rust/lib.rs | 12 +- lib/llm/src/local_model.rs | 19 +- lib/runtime/Cargo.toml | 3 + lib/runtime/examples/Cargo.lock | 23 + lib/runtime/src/component/endpoint.rs | 74 +- lib/runtime/src/config/environment_names.rs | 26 +- lib/runtime/src/pipeline/network/manager.rs | 68 +- .../src/pipeline/network/tcp/server.rs | 259 +++-- lib/runtime/src/system_status_server.rs | 54 +- lib/runtime/src/transports/event_plane/mod.rs | 53 +- lib/runtime/src/utils.rs | 1 + lib/runtime/src/utils/ip_resolver.rs | 972 +++++++++++++++--- 17 files changed, 1260 insertions(+), 376 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d78cd55aa392..ed3ce0ed5ef9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2981,6 +2981,7 @@ dependencies = [ "log", "lru 0.16.4", "mio 1.2.2", + "nix 0.30.1", "notify", "nuid", "once_cell", diff --git a/docs/fern/pages/reference/components/runtime-configuration.mdx b/docs/fern/pages/reference/components/runtime-configuration.mdx index bbe54c7f5070..84c1d30fb608 100644 --- a/docs/fern/pages/reference/components/runtime-configuration.mdx +++ b/docs/fern/pages/reference/components/runtime-configuration.mdx @@ -143,11 +143,48 @@ Unless a field is marked environment-only, it has both a CLI flag and an environ See [Frontend Configuration](frontend-configuration.mdx) for `DYN_HTTP_BODY_LIMIT_MB`.
+ + Host for the TCP request-plane server. Accepts IPv4 and IPv6 literals, bracketed IPv6 literals, + wildcards, and interface names, including aliases such as `eth0:1`. If unset or empty, Dynamo + selects the first usable non-loopback IPv4 address, then IPv6, then IPv4 loopback, then IPv6 + loopback. On Unix, automatic selection excludes interfaces that are down. Dynamo trims surrounding + whitespace from configured hosts; a value containing only whitespace still fails server startup. + + For a named interface, Dynamo uses the same address selection order, restricted to that interface. + It selects the first usable address in each category in operating-system enumeration order. An + interface with only loopback addresses uses IPv4 loopback, then IPv6 loopback. Explicit interface + lookup does not filter by interface state. + + A wildcard uses the same automatic interface inventory to select a usable non-loopback address in + its requested family for advertisement. If only the other family has one, Dynamo switches the bind + wildcard to that family. If neither family has one, Dynamo prefers loopback in the requested family + before trying the other family. If no + loopback address is found, it uses the requested family's standard loopback address. The bind + wildcard uses the selected address family. Wildcards are never advertised. IPv4 link-local + addresses are accepted. Multicast, broadcast, and IPv6 link-local addresses are rejected. + + IPv4-mapped IPv6 addresses use IPv4 rules. For example, `::ffff:0.0.0.0` uses the `0.0.0.0` + wildcard rules and advertises a concrete address. + + The server resolves the address once at startup. A loopback fallback persists until restart, and + an interface-enumeration error fails server startup. + + + + Port used by the TCP request-plane server. Accepted values are integers from `0` to `65535`. + When the value is unset, empty, or `0`, the operating system assigns a free port. Dynamo does not + trim whitespace. An invalid value, including a value with surrounding whitespace, silently falls + back to an operating-system-assigned port. + + - IPv4 or IPv6 address, or exact network interface name, used to bind and advertise the TCP response - stream server. If an interface name occurs more than once in the operating system's interface - list, Dynamo uses the last address. Dynamo trims whitespace and treats an empty value as unset. - Unspecified addresses such as `0.0.0.0` and `::` are invalid. + Host for the TCP response-stream server. It accepts the same address syntax and uses the same + address selection and wildcard-family rules as `DYN_TCP_RPC_HOST`. Dynamo trims whitespace and + treats an empty value as unset. With a wildcard host, the TCP listener binds the selected wildcard, + while the QUIC response listener binds only the selected concrete address. + + The server resolves the address once at startup. A loopback fallback persists until restart, and + an interface-enumeration error fails server startup. @@ -167,13 +204,17 @@ Unless a field is marked environment-only, it has both a CLI flag and an environ IPv4 or IPv6 address, or exact network interface name, advertised by direct ZMQ event publishers. - If an interface name occurs more than once in the operating system's interface list, Dynamo uses - the last address. Dynamo trims whitespace and treats an empty value as unset. Unspecified addresses - such as `0.0.0.0` and `::` are invalid. + For an interface name, Dynamo selects the first usable IPv4 address, then IPv6. Dynamo trims + whitespace and treats an empty value as unset. Unspecified addresses such as `0.0.0.0` and `::` are + invalid, including IPv4-mapped wildcards such as `::ffff:0.0.0.0`. When unset, automatic + advertisement stays in the IPv4 bind family and, on Unix, excludes down interfaces. If no eligible + interface has a usable non-loopback IPv4 address, automatic selection advertises IPv4 loopback + (`127.0.0.1` when no IPv4 loopback address is found), and remote subscribers cannot reach the publisher. This variable changes the discovery address, not the listener address. Direct ZMQ continues to bind - an IPv4 wildcard, so an IPv6 value does not enable IPv6 listening. This variable does not affect - NATS or ZMQ broker mode. + an IPv4 wildcard. For remote subscribers, an explicit override must identify a reachable IPv4 + address served by that listener. An IPv6 value does not enable IPv6 listening. This variable does + not affect NATS or ZMQ broker mode. diff --git a/lib/backend-common/src/rl.rs b/lib/backend-common/src/rl.rs index 404e9eb40c68..042bd501a9e1 100644 --- a/lib/backend-common/src/rl.rs +++ b/lib/backend-common/src/rl.rs @@ -90,13 +90,7 @@ pub(crate) async fn serve_endpoint( fn self_host_base_url(drt: &dynamo_runtime::DistributedRuntime) -> Option { let info = drt.system_status_server_info()?; - let socket_addr = info.socket_addr; - if socket_addr.ip().is_unspecified() { - let host = dynamo_runtime::utils::local_ip_for_advertise(); - Some(format!("http://{host}:{}", socket_addr.port())) - } else { - Some(format!("http://{socket_addr}")) - } + Some(format!("http://{}", info.advertised_socket_addr())) } fn resolve_endpoint_name(primary_name: &str) -> anyhow::Result { diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index e875d87b93be..963f7ad41731 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -2394,6 +2394,7 @@ dependencies = [ "log", "lru", "mio 1.2.2", + "nix 0.30.1", "notify", "nuid", "once_cell", @@ -4865,6 +4866,7 @@ dependencies = [ "cfg-if", "cfg_aliases", "libc", + "memoffset 0.9.1", ] [[package]] diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index 7911e4b0c10c..154b3bb872d4 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -2501,6 +2501,7 @@ dependencies = [ "log", "lru", "mio 1.2.2", + "nix 0.30.1", "notify", "nuid", "once_cell", @@ -5282,6 +5283,7 @@ dependencies = [ "cfg-if", "cfg_aliases", "libc", + "memoffset 0.9.1", ] [[package]] diff --git a/lib/bindings/python/rust/lib.rs b/lib/bindings/python/rust/lib.rs index 7ae9539e9fb8..354a374f2563 100644 --- a/lib/bindings/python/rust/lib.rs +++ b/lib/bindings/python/rust/lib.rs @@ -1470,15 +1470,9 @@ impl DistributedRuntime { /// Workers use this in their RL request-plane route descriptor so the /// frontend does not need to derive worker system URLs from static env vars. fn system_status_server_url(&self) -> Option { - self.inner.system_status_server_info().map(|info| { - let socket_addr = info.socket_addr; - if socket_addr.ip().is_unspecified() { - let host = dynamo_runtime::utils::ip_resolver::local_ip_for_advertise(); - format!("http://{host}:{}", socket_addr.port()) - } else { - format!("http://{socket_addr}") - } - }) + self.inner + .system_status_server_info() + .map(|info| format!("http://{}", info.advertised_socket_addr())) } /// Register an async Python callback for /engine/{route_name} diff --git a/lib/llm/src/local_model.rs b/lib/llm/src/local_model.rs index 4f0d95bdd7a1..63b3e5dfe986 100644 --- a/lib/llm/src/local_model.rs +++ b/lib/llm/src/local_model.rs @@ -888,15 +888,11 @@ pub(crate) fn self_host_base_url( return Ok(None); }; - let configured = dynamo_runtime::RuntimeConfig::from_settings() - .unwrap_or_default() - .system_host; - let host = match configured.as_str() { - "0.0.0.0" | "::" | "[::]" => dynamo_runtime::utils::local_ip_for_advertise(), - _ => configured, - }; + Ok(Some(system_status_base_url(&info))) +} - Ok(Some(format!("http://{host}:{}", info.port()))) +fn system_status_base_url(info: &dynamo_runtime::SystemStatusServerInfo) -> String { + format!("http://{}", info.advertised_socket_addr()) } /// Scan `model_dir` for files to advertise alongside the typed MDC slots. @@ -951,6 +947,13 @@ mod self_host_metadata_default_tests { assert!(self_host_metadata_default(Some("garbage"))); // unrecognized assert!(!self_host_metadata_default(Some("false"))); // explicit opt-out } + + #[test] + fn self_host_url_uses_the_bound_status_address() { + let info = dynamo_runtime::SystemStatusServerInfo::new("[::1]:8080".parse().unwrap(), None); + + assert_eq!(system_status_base_url(&info), "http://[::1]:8080"); + } } #[cfg(test)] diff --git a/lib/runtime/Cargo.toml b/lib/runtime/Cargo.toml index 5bf28152d53e..e935d0311997 100644 --- a/lib/runtime/Cargo.toml +++ b/lib/runtime/Cargo.toml @@ -121,6 +121,9 @@ tokio-rayon = { version = "2.1" } kube = { version = "2.0.1", default-features = false, features = ["runtime", "derive", "client", "rustls-tls", "aws-lc-rs"] } k8s-openapi = { version = "0.26.0", features = ["v1_32"] } +[target.'cfg(unix)'.dependencies] +nix = { version = "0.30.1", default-features = false, features = ["net"] } + [dev-dependencies] criterion = { version = "0.5", features = ["async_tokio"] } rcgen = { workspace = true } diff --git a/lib/runtime/examples/Cargo.lock b/lib/runtime/examples/Cargo.lock index 0ca080bb76ce..b101d7bc7630 100644 --- a/lib/runtime/examples/Cargo.lock +++ b/lib/runtime/examples/Cargo.lock @@ -817,6 +817,7 @@ dependencies = [ "log", "lru", "mio 1.2.2", + "nix", "notify", "nuid", "once_cell", @@ -1976,6 +1977,15 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -2051,6 +2061,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.11.1", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + [[package]] name = "nkeys" version = "0.4.5" diff --git a/lib/runtime/src/component/endpoint.rs b/lib/runtime/src/component/endpoint.rs index 99ca80b88a52..0d6cac4937d0 100644 --- a/lib/runtime/src/component/endpoint.rs +++ b/lib/runtime/src/component/endpoint.rs @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 +use std::net::SocketAddr; use std::sync::Arc; use anyhow::Result; @@ -327,25 +328,8 @@ fn build_transport_type_inner( ) -> Result { match mode { RequestPlaneMode::Tcp => { - let tcp_host = crate::utils::tcp_rpc_host_from_env(); - // If a fixed port is explicitly configured, use it directly (no init ordering dependency). - // Otherwise, use the actual bound port (set by TCP server after binding when port 0 is used). - let tcp_port = std::env::var("DYN_TCP_RPC_PORT") - .ok() - .and_then(|p| p.parse::().ok()) - .filter(|&p| p != 0) - .unwrap_or(crate::pipeline::network::manager::get_actual_tcp_rpc_port()?); - - // Include instance_id and endpoint name for proper TCP routing. - // Format: host:port/instance_id_hex/endpoint_name - // This ensures each worker has a unique routing key when multiple workers - // share the same TCP server (e.g., --num-workers > 1). - let tcp_endpoint = format!( - "{}:{}/{:x}/{}", - tcp_host, tcp_port, connection_id, endpoint_id.name - ); - - Ok(TransportType::Tcp(tcp_endpoint)) + let address = crate::pipeline::network::manager::get_actual_tcp_rpc_address()?; + Ok(tcp_transport_type(address, endpoint_id, connection_id)) } RequestPlaneMode::Nats => Ok(TransportType::Nats(nats::instance_subject( endpoint_id, @@ -354,11 +338,19 @@ fn build_transport_type_inner( } } +fn tcp_transport_type( + address: SocketAddr, + endpoint_id: &EndpointId, + connection_id: u64, +) -> TransportType { + TransportType::Tcp(format!("{address}/{connection_id:x}/{}", endpoint_id.name)) +} + /// Build transport type, ensuring TCP server is initialized when needed. /// -/// In TCP mode with an OS-assigned port (`DYN_TCP_RPC_PORT` unset or invalid), the server must bind -/// before we can construct a correct transport address. This helper ensures that initialization -/// occurs, then delegates to the internal builder. +/// In TCP mode the server must bind before discovery can publish the concrete +/// advertised address. This helper ensures that initialization occurs, then +/// delegates to the internal builder. pub async fn build_transport_type( endpoint: &Endpoint, endpoint_id: &EndpointId, @@ -366,19 +358,7 @@ pub async fn build_transport_type( ) -> Result { let mode = endpoint.drt().request_plane(); - // For TCP with OS-assigned ports, we must ensure the server is initialized - // (bound to a port) before we can construct a correct transport address. - let has_fixed_port = match mode { - RequestPlaneMode::Tcp => std::env::var("DYN_TCP_RPC_PORT") - .ok() - .and_then(|p| p.parse::().ok()) - .filter(|&p| p != 0) - .is_some(), - RequestPlaneMode::Nats => true, // NATS doesn't need port init - }; - - if !has_fixed_port { - // Ensure request plane server is initialized before building transport. + if mode == RequestPlaneMode::Tcp { let _ = endpoint.drt().request_plane_server().await?; } @@ -473,3 +453,27 @@ impl Endpoint { Ok(()) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn tcp_transport_uses_concrete_ipv4_and_bracketed_ipv6_addresses() { + let endpoint_id = EndpointId { + namespace: "ns".to_string(), + component: "worker".to_string(), + name: "generate".to_string(), + }; + + for (address, expected) in [ + ("192.0.2.10:1234", "192.0.2.10:1234/2a/generate"), + ("[2001:db8::10]:1234", "[2001:db8::10]:1234/2a/generate"), + ] { + let transport = tcp_transport_type(address.parse().unwrap(), &endpoint_id, 0x2a); + assert_eq!(transport.address(), expected); + assert!(!transport.address().starts_with("0.0.0.0")); + assert!(!transport.address().starts_with("[::]")); + } + } +} diff --git a/lib/runtime/src/config/environment_names.rs b/lib/runtime/src/config/environment_names.rs index 3c2eaa457a66..c6fd04d8a8aa 100644 --- a/lib/runtime/src/config/environment_names.rs +++ b/lib/runtime/src/config/environment_names.rs @@ -798,6 +798,15 @@ pub mod request_plane { /// Buffer size above which the TCP decoder shrinks an empty buffer, in bytes. pub const DYN_TCP_SHRINK_MESSAGE_SIZE: &str = "DYN_TCP_SHRINK_MESSAGE_SIZE"; + + /// Host or interface for the TCP request-plane server. + /// The server resolves the value once at startup. A loopback fallback + /// persists until restart, and an enumeration error fails server startup. + pub const DYN_TCP_RPC_HOST: &str = "DYN_TCP_RPC_HOST"; + + /// Port for the TCP request-plane server. + /// If unset, the OS assigns a free ephemeral port. + pub const DYN_TCP_RPC_PORT: &str = "DYN_TCP_RPC_PORT"; } /// Response plane transport configuration. @@ -813,10 +822,17 @@ pub mod tcp_response_stream { /// If unset or 0, the OS assigns a free ephemeral port. pub const DYN_TCP_RESPONSE_STREAM_PORT: &str = "DYN_TCP_RESPONSE_STREAM_PORT"; - /// IP address or exact interface shared by the TCP request callback and QUIC response - /// listeners. - /// Unspecified addresses are rejected. - /// If unset, the server auto-detects a routable local IP. + /// Host or interface for the TCP response stream server and QUIC response listener. + /// + /// Accepts IPv4 and IPv6 literals, bracketed IPv6 literals, IPv4 or IPv6 + /// wildcards, and interface names. Interface aliases such as `eth0:1` are + /// also accepted. If unset, the server selects the first usable + /// non-loopback IPv4 address, then IPv6, then IPv4 loopback, then IPv6 + /// loopback. A wildcard uses a reachable address in its requested family. + /// If only the other family has a usable non-loopback address, the server + /// switches the bind wildcard to that family. The server resolves the value + /// once at startup. A loopback fallback persists until restart, and an + /// enumeration error fails server startup. pub const DYN_TCP_RESPONSE_STREAM_HOST: &str = "DYN_TCP_RESPONSE_STREAM_HOST"; /// TCP request-plane TLS configuration @@ -1142,6 +1158,8 @@ mod tests { response_plane::DYN_RESPONSE_PLANE, request_plane::DYN_TCP_MAX_MESSAGE_SIZE, request_plane::DYN_TCP_SHRINK_MESSAGE_SIZE, + request_plane::DYN_TCP_RPC_HOST, + request_plane::DYN_TCP_RPC_PORT, // TCP Response Stream tcp_response_stream::DYN_TCP_RESPONSE_STREAM_PORT, tcp_response_stream::DYN_TCP_RESPONSE_STREAM_HOST, diff --git a/lib/runtime/src/pipeline/network/manager.rs b/lib/runtime/src/pipeline/network/manager.rs index af55dc3f2280..92978d843994 100644 --- a/lib/runtime/src/pipeline/network/manager.rs +++ b/lib/runtime/src/pipeline/network/manager.rs @@ -16,23 +16,26 @@ use super::egress::unified_client::RequestPlaneClient; use super::ingress::shared_tcp_endpoint::SharedTcpServer; use super::ingress::unified_server::RequestPlaneServer; +use crate::config::environment_names::request_plane; use crate::distributed::RequestPlaneMode; +use crate::utils::ip_resolver::{DefaultIpResolver, resolve_host_or_interface, resolve_local_host}; use anyhow::Result; use async_once_cell::OnceCell; +use std::net::SocketAddr; use std::sync::Arc; use std::sync::OnceLock; use tokio_util::sync::CancellationToken; -/// Global storage for the actual TCP RPC port after binding. -/// Uses OnceLock since the port is set once when the server binds and never changes. -static ACTUAL_TCP_RPC_PORT: OnceLock = OnceLock::new(); +/// Global storage for the advertised TCP RPC address after binding. +/// Uses OnceLock since the shared server binds once and never changes. +static ACTUAL_TCP_RPC_ADDRESS: OnceLock = OnceLock::new(); /// Global storage for the shared TCP server instance. /// /// When multiple workers run in the same process, they must share a single TCP server /// to ensure all endpoints are registered on the same server. Without this, each worker /// would create its own server on a different port, but all would publish the same port -/// (from ACTUAL_TCP_RPC_PORT) to discovery, causing "No handler found" errors. +/// (from ACTUAL_TCP_RPC_ADDRESS) to discovery, causing "No handler found" errors. /// /// Uses `tokio::sync::OnceCell` to support async initialization (binding the TCP socket). static GLOBAL_TCP_SERVER: tokio::sync::OnceCell> = @@ -48,23 +51,26 @@ static GLOBAL_TCP_SERVER_TOKEN: std::sync::LazyLock = /// Get the actual TCP RPC port that the server is listening on. pub fn get_actual_tcp_rpc_port() -> anyhow::Result { - ACTUAL_TCP_RPC_PORT.get().copied().ok_or_else(|| { + Ok(get_actual_tcp_rpc_address()?.port()) +} + +/// Get the concrete TCP RPC address published to discovery. +pub(crate) fn get_actual_tcp_rpc_address() -> anyhow::Result { + ACTUAL_TCP_RPC_ADDRESS.get().copied().ok_or_else(|| { tracing::error!( - "TCP RPC port not set - request_plane_server() must be called before get_actual_tcp_rpc_port()" + "TCP RPC address not set - request_plane_server() must be called before get_actual_tcp_rpc_address()" ); - anyhow::anyhow!( - "TCP RPC port not initialized. This is not expected." - ) + anyhow::anyhow!("TCP RPC address not initialized. This is not expected.") }) } -/// Set the actual TCP RPC port (called internally after server binds). -fn set_actual_tcp_rpc_port(port: u16) { - if let Err(existing) = ACTUAL_TCP_RPC_PORT.set(port) { +/// Set the address published to discovery after the shared server binds. +fn set_actual_tcp_rpc_address(address: SocketAddr) { + if let Err(existing) = ACTUAL_TCP_RPC_ADDRESS.set(address) { tracing::warn!( - existing_port = existing, - new_port = port, - "TCP RPC port already set, ignoring new value" + %existing, + new_address = %address, + "TCP RPC address already set, ignoring new value" ); } } @@ -73,7 +79,7 @@ fn set_actual_tcp_rpc_port(port: u16) { #[derive(Clone)] struct NetworkConfig { // TCP server configuration - tcp_host: String, + tcp_host: Option, /// TCP port to bind to. If None, the OS will assign a free port. tcp_port: Option, @@ -92,8 +98,10 @@ impl NetworkConfig { Self { // TCP server configuration // If DYN_TCP_RPC_PORT is set, use that port; otherwise None means OS will assign a free port - tcp_host: crate::utils::tcp_rpc_host_from_env(), - tcp_port: std::env::var("DYN_TCP_RPC_PORT") + tcp_host: std::env::var(request_plane::DYN_TCP_RPC_HOST) + .ok() + .filter(|host| !host.is_empty()), + tcp_port: std::env::var(request_plane::DYN_TCP_RPC_PORT) .ok() .and_then(|p| p.parse().ok()), @@ -175,7 +183,7 @@ impl NetworkManager { .unwrap_or_else(|| "OS-assigned".to_string()); tracing::info!( %mode, - host = %config.tcp_host, + host = config.tcp_host.as_deref().unwrap_or("auto"), port = %port_display, "Initializing NetworkManager with TCP request plane" ); @@ -267,13 +275,20 @@ impl NetworkManager { .get_or_try_init(|| async { // Use configured port if specified, otherwise use port 0 (OS assigns free port) let port = self.config.tcp_port.unwrap_or(0); - let bind_addr = format!("{}:{}", self.config.tcp_host, port) - .parse() - .map_err(|e| anyhow::anyhow!("Invalid TCP bind address: {}", e))?; + let resolver = DefaultIpResolver; + let resolved_host = match self.config.tcp_host.as_deref() { + Some(host) => resolve_host_or_interface(host, &resolver).map_err(|error| { + anyhow::anyhow!("Failed to resolve configured TCP RPC host '{host}': {error}") + })?, + None => resolve_local_host(&resolver).map_err(|error| { + anyhow::anyhow!("Failed to resolve local TCP RPC host: {error}") + })?, + }; + let bind_addr = SocketAddr::new(resolved_host.bind_ip(), port); tracing::info!( bind_addr = %bind_addr, - port_source = if self.config.tcp_port.is_some() { "DYN_TCP_RPC_PORT" } else { "OS-assigned" }, + port_source = if self.config.tcp_port.is_some() { request_plane::DYN_TCP_RPC_PORT } else { "OS-assigned" }, "Creating TCP request plane server" ); @@ -282,12 +297,13 @@ impl NetworkManager { // Bind and start server, getting the actual bound address let actual_addr = server.clone().bind_and_start().await?; - // Store the actual bound port globally so build_transport_type() can access it - set_actual_tcp_rpc_port(actual_addr.port()); + let advertised_addr = + SocketAddr::new(resolved_host.advertise_ip(), actual_addr.port()); + set_actual_tcp_rpc_address(advertised_addr); tracing::info!( actual_addr = %actual_addr, - actual_port = actual_addr.port(), + %advertised_addr, "TCP request plane server started" ); diff --git a/lib/runtime/src/pipeline/network/tcp/server.rs b/lib/runtime/src/pipeline/network/tcp/server.rs index ed0847f73615..7233686bbba4 100644 --- a/lib/runtime/src/pipeline/network/tcp/server.rs +++ b/lib/runtime/src/pipeline/network/tcp/server.rs @@ -4,7 +4,7 @@ use socket2::{Domain, SockAddr, SockRef, Socket, Type}; use std::{ collections::{HashMap, HashSet}, - net::{IpAddr, SocketAddr, TcpListener}, + net::{IpAddr, SocketAddr}, os::fd::{AsFd, FromRawFd}, sync::Arc, time::Duration, @@ -22,7 +22,6 @@ const TOMBSTONE_TTL: Duration = Duration::from_secs(5); use bytes::Bytes; use derive_builder::Builder; use futures::{SinkExt, StreamExt}; -use local_ip_address::Error; use parking_lot::Mutex; use serde::{Deserialize, Serialize}; @@ -47,7 +46,7 @@ use crate::pipeline::{ tcp::StreamType, }, }; -use crate::utils::ip_resolver::resolve_host_or_interface; +use crate::utils::ip_resolver::{resolve_host_or_interface, resolve_local_host}; use anyhow::{Result, anyhow as error}; pub use crate::utils::ip_resolver::{DefaultIpResolver, IpResolver}; @@ -60,8 +59,9 @@ pub struct ServerOptions { #[builder(default = "0")] pub port: u16, - /// IP literal or exact network interface name used to bind and advertise the server. + /// IP literal, bracketed IPv6 literal, wildcard, or network interface name. /// When unset, Dynamo selects a local address automatically. + /// The field name is retained for source compatibility. #[builder(default)] pub interface: Option, } @@ -76,8 +76,7 @@ impl ServerOptions { /// A Response connection is a connection that is established by a client with the intention of sending /// specific data back to the server. pub struct TcpStreamServer { - local_ip: IpAddr, - local_port: u16, + address: String, state: Arc>, } @@ -160,7 +159,7 @@ fn prune_tombstones(tombstones: &mut HashMap, now: impl TcpStreamServer { pub fn local_address(&self) -> Result { - Ok(SocketAddr::new(self.local_ip, self.local_port)) + Ok(self.address.parse()?) } pub fn options_builder() -> ServerOptionsBuilder { @@ -175,39 +174,26 @@ impl TcpStreamServer { options: ServerOptions, resolver: R, ) -> Result, PipelineError> { - let local_ip = match options.interface.as_deref() { - Some(host) => resolve_host_or_interface(host, &resolver).map_err(|error| { + let resolved_host = if let Some(host_or_interface) = options.interface.as_deref() { + resolve_host_or_interface(host_or_interface, &resolver).map_err(|error| { PipelineError::Generic(format!( - "Failed to resolve configured TCP host '{host}': {error}" + "Failed to resolve configured TCP host '{host_or_interface}': {error}" )) - })?, - None => { - let resolved_ip = resolver.local_ip().or_else(|err| match err { - Error::LocalIpAddressNotFound => resolver.local_ipv6(), - _ => Err(err), - }); - - match resolved_ip { - Ok(addr) => addr, - // Only fall back to loopback when no routable IP exists at all; - // propagate other resolver errors (I/O, platform) so - // misconfigured hosts fail fast instead of silently binding - // to 127.0.0.1. - Err(Error::LocalIpAddressNotFound) => { - tracing::warn!( - "No routable local IP address found; falling back to 127.0.0.1" - ); - IpAddr::from([127, 0, 0, 1]) - } - Err(err) => { - return Err(PipelineError::Generic(format!( - "Failed to resolve local IP address: {err}" - ))); - } - } - } + })? + } else { + resolve_local_host(&resolver).map_err(|error| { + PipelineError::Generic(format!("Failed to resolve local IP address: {error}")) + })? }; + if resolved_host.used_loopback_fallback() { + tracing::warn!( + bind_ip = %resolved_host.bind_ip(), + advertise_ip = %resolved_host.advertise_ip(), + "No usable local IP address found; advertising loopback" + ); + } + let state = Arc::new(Mutex::new(State::default())); // Build TLS acceptor from environment if cert+key paths are configured. @@ -215,20 +201,19 @@ impl TcpStreamServer { PipelineError::Generic(format!("Failed to build TCP TLS acceptor: {}", e)) })?; - let local_port = Self::start(local_ip, options.port, state.clone(), tls_acceptor) + let bind_address = SocketAddr::new(resolved_host.bind_ip(), options.port); + let local_address = Self::start(bind_address, state.clone(), tls_acceptor) .await - .map_err(|e| { - PipelineError::Generic(format!("Failed to start TcpStreamServer: {}", e)) + .map_err(|error| { + PipelineError::Generic(format!("Failed to start TcpStreamServer: {error}")) })?; + let advertised_address = + SocketAddr::new(resolved_host.advertise_ip(), local_address.port()); + let address = advertised_address.to_string(); - let local_addr = SocketAddr::new(local_ip, local_port); - tracing::debug!("tcp transport service on {local_addr}"); + tracing::debug!(%local_address, %advertised_address, "tcp transport service started"); - Ok(Arc::new(Self { - local_ip, - local_port, - state, - })) + Ok(Arc::new(Self { address, state })) } /// Associate one or both halves of a registration with a backend instance. @@ -391,28 +376,25 @@ impl TcpStreamServer { } async fn start( - local_ip: IpAddr, - local_port: u16, + bind_address: SocketAddr, state: Arc>, tls_acceptor: Option, - ) -> Result { - let addr = SocketAddr::new(local_ip, local_port); + ) -> Result { let state_clone = state.clone(); - let (ready_tx, ready_rx) = tokio::sync::oneshot::channel::>(); + let (ready_tx, ready_rx) = tokio::sync::oneshot::channel::>(); { let mut guard = state.lock(); if guard.handle.is_some() { panic!("TcpStreamServer already started"); } guard.handle = Some(tokio::spawn(tcp_listener( - addr, + bind_address, state_clone, tls_acceptor, ready_tx, ))); } - let local_port = ready_rx.await??; - Ok(local_port) + ready_rx.await? } fn insert_request_stream(&self, subject: String, connection: RequestedSendConnection) { @@ -481,7 +463,7 @@ impl ResponseService for TcpStreamServer { async fn register(&self, options: StreamOptions) -> PendingConnections { // oneshot channels to pass back the sender and receiver objects - let address = SocketAddr::new(self.local_ip, self.local_port).to_string(); + let address = self.address.clone(); tracing::debug!("Registering new TcpStream on {address}"); let send_stream = if options.enable_request_stream { @@ -776,7 +758,7 @@ async fn tcp_listener( addr: SocketAddr, state: Arc>, tls_acceptor: Option, - read_tx: tokio::sync::oneshot::Sender>, + read_tx: tokio::sync::oneshot::Sender>, ) -> Result<()> { let listener = tokio::net::TcpListener::bind(addr) .await @@ -789,9 +771,7 @@ async fn tcp_listener( .map_err(|e| anyhow::anyhow!("Failed get SocketAddr: {:?}", e)) .unwrap(); - read_tx - .send(Ok(addr.port())) - .expect("Failed to send ready signal"); + read_tx.send(Ok(addr)).expect("Failed to send ready signal"); listener } @@ -1345,6 +1325,7 @@ mod tests { use crate::pipeline::network::DEFAULT_SEND_BUFFER_COUNT; use crate::pipeline::network::tcp::client::TcpClient; use crate::tls_utils::test_certs::self_signed_pair; + use crate::utils::ip_resolver::test_support::{ProbeOutcome, StubResolver}; use tokio::io::{AsyncWriteExt, ReadHalf, WriteHalf}; use tokio::net::TcpStream; @@ -1432,17 +1413,99 @@ mod tests { ); } - // Mock resolver that always fails to simulate the fallback scenario - struct FailingIpResolver; + async fn registered_tcp_info(server: &TcpStreamServer) -> TcpStreamConnectionInfo { + let context = Context::new(()); + let stream_options = StreamOptions::builder() + .context(context.context()) + .enable_request_stream(false) + .enable_response_stream(true) + .build() + .unwrap(); + + let pending_connection = server.register(stream_options).await; + let connection_info = pending_connection + .recv_stream + .as_ref() + .unwrap() + .connection_info + .clone(); + connection_info.try_into().unwrap() + } + + #[tokio::test] + async fn wildcard_bind_advertises_concrete_ipv4_with_bound_port() { + for host in ["0.0.0.0", "::ffff:0.0.0.0", " [::ffff:0.0.0.0] "] { + let mut resolver = StubResolver::not_found(); + resolver + .interfaces + .push(("eth0", "192.0.2.20".parse().unwrap())); + let options = ServerOptions::builder() + .port(0) + .interface(Some(host.to_string())) + .build() + .unwrap(); + let server = TcpStreamServer::new_with_resolver(options, resolver) + .await + .unwrap(); - impl IpResolver for FailingIpResolver { - fn local_ip(&self) -> Result { - Err(Error::LocalIpAddressNotFound) + let tcp_info = registered_tcp_info(&server).await; + let socket_addr: SocketAddr = tcp_info.address.parse().unwrap(); + assert_eq!(socket_addr.ip(), "192.0.2.20".parse::().unwrap()); + assert_ne!(socket_addr.port(), 0); + assert!(!socket_addr.ip().is_unspecified()); + // The advertised port must belong to the real wildcard listener. + let _connection = tokio::net::TcpStream::connect(SocketAddr::new( + std::net::Ipv4Addr::LOCALHOST.into(), + socket_addr.port(), + )) + .await + .unwrap(); } + } - fn local_ipv6(&self) -> Result { - Err(Error::LocalIpAddressNotFound) + #[tokio::test] + async fn real_bracketed_ipv6_host_binds_and_registers() { + if let Err(error) = std::net::TcpListener::bind("[::1]:0") { + eprintln!("Skipping IPv6 loopback bind test: {error}"); + return; } + + let options = ServerOptions::builder() + .port(0) + .interface(Some("[::1]".to_string())) + .build() + .unwrap(); + let server = TcpStreamServer::new_with_resolver(options, StubResolver::not_found()) + .await + .unwrap(); + + let tcp_info = registered_tcp_info(&server).await; + let socket_addr: SocketAddr = tcp_info.address.parse().unwrap(); + assert_eq!(socket_addr.ip(), IpAddr::V6(std::net::Ipv6Addr::LOCALHOST)); + assert_ne!(socket_addr.port(), 0); + assert!( + tcp_info.address.starts_with("[::1]:"), + "{}", + tcp_info.address + ); + } + + #[tokio::test] + async fn tcp_server_preserves_interface_enumeration_error() { + let mut resolver = StubResolver::not_found(); + resolver.interface_error = Some(ProbeOutcome::Platform("test-platform")); + let options = ServerOptions::builder().port(0).build().unwrap(); + let error = TcpStreamServer::new_with_resolver(options, resolver) + .await + .err() + .expect("an interface enumeration failure must be returned"); + + let error = error.to_string(); + assert!( + error.contains("failed to enumerate network interfaces"), + "{error}" + ); + assert!(error.contains("test-platform"), "{error}"); } #[tokio::test] @@ -1459,26 +1522,7 @@ mod tests { let server = result.unwrap(); - // Verify the server can be used by registering a stream - let context = Context::new(()); - let stream_options = StreamOptions::builder() - .context(context.context()) - .enable_request_stream(false) - .enable_response_stream(true) - .build() - .unwrap(); - - let pending_connection = server.register(stream_options).await; - - // Verify connection info is available and valid - let connection_info = pending_connection - .recv_stream - .as_ref() - .unwrap() - .connection_info - .clone(); - - let tcp_info: TcpStreamConnectionInfo = connection_info.try_into().unwrap(); + let tcp_info = registered_tcp_info(&server).await; let socket_addr = tcp_info.address.parse::().unwrap(); // Should have a valid port assigned @@ -1552,7 +1596,7 @@ mod tests { let options = ServerOptions::builder().port(0).build().unwrap(); // Use the failing resolver to force the fallback - let result = TcpStreamServer::new_with_resolver(options, FailingIpResolver).await; + let result = TcpStreamServer::new_with_resolver(options, StubResolver::not_found()).await; assert!( result.is_ok(), "Server creation should succeed with fallback even when IP detection fails" @@ -1560,24 +1604,7 @@ mod tests { let server = result.unwrap(); - // Get the actual bound address by registering a stream - let context = Context::new(()); - let stream_options = StreamOptions::builder() - .context(context.context()) - .enable_request_stream(false) - .enable_response_stream(true) - .build() - .unwrap(); - - let pending_connection = server.register(stream_options).await; - let connection_info = pending_connection - .recv_stream - .as_ref() - .unwrap() - .connection_info - .clone(); - - let tcp_info: TcpStreamConnectionInfo = connection_info.try_into().unwrap(); + let tcp_info = registered_tcp_info(&server).await; let socket_addr = tcp_info.address.parse::().unwrap(); // With the failing resolver, fallback should ALWAYS be used @@ -1603,23 +1630,32 @@ mod tests { #[tokio::test] async fn configured_ip_literals_bind_and_format_addresses() { - let ipv6_available = TcpListener::bind("[::1]:0").is_ok(); + let ipv6_available = std::net::TcpListener::bind("[::1]:0").is_ok(); for (host, expected_ip) in [ ("127.0.0.1", "127.0.0.1".parse::().unwrap()), ("::1", "::1".parse::().unwrap()), + (" 127.0.0.1 ", "127.0.0.1".parse::().unwrap()), + (" [::1]\t", "::1".parse::().unwrap()), + ("::ffff:127.0.0.1", "127.0.0.1".parse::().unwrap()), + (" lo ", "127.0.0.1".parse::().unwrap()), + (" lo:1 ", "127.0.0.1".parse::().unwrap()), ] { if expected_ip.is_ipv6() && !ipv6_available { eprintln!("skipping IPv6 bind because this host does not support IPv6 loopback"); continue; } + let mut resolver = StubResolver::not_found(); + resolver + .interfaces + .push(("lo:1", "127.0.0.1".parse().unwrap())); let server = TcpStreamServer::new_with_resolver( ServerOptions { port: 0, interface: Some(host.to_string()), }, - FailingIpResolver, + resolver, ) .await .unwrap(); @@ -1638,6 +1674,7 @@ mod tests { let tcp_info: TcpStreamConnectionInfo = connection_info.try_into().unwrap(); let address = tcp_info.address.parse::().unwrap(); + assert_eq!(address, server.local_address().unwrap()); assert_eq!(address.ip(), expected_ip); assert_ne!(address.port(), 0); if expected_ip.is_ipv6() { @@ -1650,7 +1687,7 @@ mod tests { async fn test_server() -> Arc { TcpStreamServer::new_with_resolver( ServerOptions::builder().port(0).build().unwrap(), - FailingIpResolver, + StubResolver::not_found(), ) .await .unwrap() @@ -2208,7 +2245,7 @@ mod tests { /// framed reader/writer along with the receiver. async fn open_registered_response_stream() -> TestResponseStream { let options = ServerOptions::builder().port(0).build().unwrap(); - let server = TcpStreamServer::new_with_resolver(options, FailingIpResolver) + let server = TcpStreamServer::new_with_resolver(options, StubResolver::not_found()) .await .unwrap(); let context = Context::new(()); @@ -2346,7 +2383,7 @@ mod tests { #[tokio::test] async fn test_tcp_stream_server_returns_error_on_invalid_prologue() { let options = ServerOptions::builder().port(0).build().unwrap(); - let server = TcpStreamServer::new_with_resolver(options, FailingIpResolver) + let server = TcpStreamServer::new_with_resolver(options, StubResolver::not_found()) .await .unwrap(); let context = Context::new(()); @@ -2403,7 +2440,7 @@ mod tests { #[tokio::test] async fn test_unknown_typed_error_preserves_the_legacy_prologue_error() { let options = ServerOptions::builder().port(0).build().unwrap(); - let server = TcpStreamServer::new_with_resolver(options, FailingIpResolver) + let server = TcpStreamServer::new_with_resolver(options, StubResolver::not_found()) .await .unwrap(); let context = Context::new(()); diff --git a/lib/runtime/src/system_status_server.rs b/lib/runtime/src/system_status_server.rs index 0d46ca2aca19..97d744a9a810 100644 --- a/lib/runtime/src/system_status_server.rs +++ b/lib/runtime/src/system_status_server.rs @@ -11,6 +11,9 @@ use crate::config::environment_names::runtime::system as env_system; use crate::logging::make_system_request_span; use crate::metrics::MetricsHierarchy; use crate::traits::DistributedRuntimeProvider; +use crate::utils::ip_resolver::{ + DefaultIpResolver, IpResolutionError, IpResolver, resolve_advertise_ip_for_bind, +}; use axum::{ Router, body::Bytes, @@ -23,6 +26,7 @@ use futures::StreamExt; use serde::{Deserialize, Serialize}; use serde_json::json; use std::collections::HashMap; +use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use std::sync::{Arc, OnceLock}; use std::time::Instant; use tokio::{net::TcpListener, task::JoinHandle}; @@ -32,12 +36,12 @@ use tower_http::trace::TraceLayer; /// System status server information containing socket address and handle #[derive(Debug)] pub struct SystemStatusServerInfo { - pub socket_addr: std::net::SocketAddr, + pub socket_addr: SocketAddr, pub handle: Option>>, } impl SystemStatusServerInfo { - pub fn new(socket_addr: std::net::SocketAddr, handle: Option>) -> Self { + pub fn new(socket_addr: SocketAddr, handle: Option>) -> Self { Self { socket_addr, handle: handle.map(Arc::new), @@ -55,6 +59,37 @@ impl SystemStatusServerInfo { pub fn port(&self) -> u16 { self.socket_addr.port() } + + /// Return an address that is served by the bound socket. + /// + /// A wildcard bind is replaced with a usable address from the same address + /// family. If interface enumeration fails, the same-family loopback is + /// used so IPv4 and IPv6 are never combined. + pub fn advertised_socket_addr(&self) -> SocketAddr { + match advertised_socket_addr(self.socket_addr, &DefaultIpResolver) { + Ok(address) => address, + Err(error) => { + let fallback = match self.socket_addr.ip() { + IpAddr::V4(_) => IpAddr::V4(Ipv4Addr::LOCALHOST), + IpAddr::V6(_) => IpAddr::V6(Ipv6Addr::LOCALHOST), + }; + tracing::warn!( + %error, + %fallback, + "Failed to resolve the system status advertisement address; using loopback" + ); + SocketAddr::new(fallback, self.socket_addr.port()) + } + } + } +} + +fn advertised_socket_addr( + bound: SocketAddr, + resolver: &R, +) -> Result { + let advertise_ip = resolve_advertise_ip_for_bind(bound.ip(), resolver)?; + Ok(SocketAddr::new(advertise_ip, bound.port())) } impl Clone for SystemStatusServerInfo { @@ -710,8 +745,23 @@ async fn engine_route_handler( #[cfg(test)] mod tests { use super::*; + use crate::utils::ip_resolver::test_support::StubResolver; use tokio::time::Duration; + #[test] + fn advertised_address_stays_in_the_bound_family() { + let mut resolver = StubResolver::not_found(); + resolver.interfaces = vec![ + ("lo", "127.0.0.1".parse().unwrap()), + ("eth0", "2001:db8::20".parse().unwrap()), + ]; + + let advertised = advertised_socket_addr("0.0.0.0:8080".parse().unwrap(), &resolver) + .expect("wildcard advertisement should resolve"); + + assert_eq!(advertised, "127.0.0.1:8080".parse().unwrap()); + } + // This is a basic test to verify the HTTP server is working before testing other more complicated tests #[tokio::test] async fn test_http_server_lifecycle() { diff --git a/lib/runtime/src/transports/event_plane/mod.rs b/lib/runtime/src/transports/event_plane/mod.rs index 2a8126f054f1..2127e2ac8531 100644 --- a/lib/runtime/src/transports/event_plane/mod.rs +++ b/lib/runtime/src/transports/event_plane/mod.rs @@ -50,8 +50,8 @@ use crate::discovery::{ use crate::protocols::EndpointId; use crate::traits::DistributedRuntimeProvider; use crate::utils::ip_resolver::{ - DefaultIpResolver, IpResolver, host_override_from_env, resolve_host_or_interface, - resolve_local_host, + DefaultIpResolver, IpResolver, host_override_from_env, resolve_advertise_ip_for_bind, + resolve_host_or_interface, }; fn event_plane_host_from_env() -> Result { @@ -60,11 +60,20 @@ fn event_plane_host_from_env() -> Result { fn event_plane_host_from_env_with_resolver(resolver: &R) -> Result { let Some(host) = host_override_from_env(DYN_EVENT_PLANE_HOST)? else { - return Ok(resolve_local_host(resolver)); + return Ok(resolve_advertise_ip_for_bind( + std::net::Ipv4Addr::UNSPECIFIED.into(), + resolver, + )?); }; resolve_host_or_interface(&host, resolver) .map_err(|error| anyhow::anyhow!("Invalid {DYN_EVENT_PLANE_HOST} value '{host}': {error}")) + .and_then(|resolved| { + if resolved.bind_ip().to_canonical().is_unspecified() { + anyhow::bail!("Invalid {DYN_EVENT_PLANE_HOST} value '{host}': unspecified IP addresses cannot be advertised"); + } + Ok(resolved.advertise_ip()) + }) } fn direct_zmq_public_endpoint(advertised_ip: IpAddr, actual_bind_endpoint: &str) -> Result { @@ -949,6 +958,34 @@ fn current_timestamp_ms() -> u64 { mod tests { use super::*; use crate::config::environment_names::zmq_broker as broker_env; + use crate::utils::ip_resolver::test_support::StubResolver; + + #[test] + fn direct_zmq_advertisement_matches_bound_family() { + let mut resolver = StubResolver::not_found(); + resolver.interfaces = vec![ + ("lo", "127.0.0.1".parse().unwrap()), + ("lo", "::1".parse().unwrap()), + ("eth0", "2001:db8::20".parse().unwrap()), + ]; + + assert_eq!( + direct_zmq_public_endpoint( + resolve_advertise_ip_for_bind("0.0.0.0".parse().unwrap(), &resolver).unwrap(), + "tcp://0.0.0.0:4321" + ) + .unwrap(), + "tcp://127.0.0.1:4321" + ); + assert_eq!( + direct_zmq_public_endpoint( + resolve_advertise_ip_for_bind("::".parse().unwrap(), &resolver).unwrap(), + "tcp://[::]:4321" + ) + .unwrap(), + "tcp://[2001:db8::20]:4321" + ); + } struct EventPlaneHostResolver { ipv4: Option, @@ -1009,28 +1046,28 @@ mod tests { } #[test] - fn direct_zmq_advertise_host_preserves_ipv6_fallback_and_rejects_wildcards() { + fn direct_zmq_advertise_host_keeps_ipv4_bind_family_and_rejects_wildcards() { let resolver = EventPlaneHostResolver { ipv4: None, ipv6: Some("2001:db8::1".parse().unwrap()), - interfaces: Vec::new(), + interfaces: vec![("eth0".to_string(), "2001:db8::1".parse().unwrap())], }; assert_eq!( temp_env::with_vars([(DYN_EVENT_PLANE_HOST, None::<&str>)], || { event_plane_host_from_env_with_resolver(&resolver) }) .unwrap(), - "2001:db8::1".parse::().unwrap() + "127.0.0.1".parse::().unwrap() ); assert_eq!( temp_env::with_vars([(DYN_EVENT_PLANE_HOST, Some(" \t"))], || { event_plane_host_from_env_with_resolver(&resolver) }) .unwrap(), - "2001:db8::1".parse::().unwrap() + "127.0.0.1".parse::().unwrap() ); - for host in ["0.0.0.0", "::"] { + for host in ["0.0.0.0", "::", "::ffff:0.0.0.0", "[::ffff:0.0.0.0]"] { let error = temp_env::with_vars([(DYN_EVENT_PLANE_HOST, Some(host))], || { event_plane_host_from_env_with_resolver(&resolver) }) diff --git a/lib/runtime/src/utils.rs b/lib/runtime/src/utils.rs index 74a6408a3fbf..58e4663077b6 100644 --- a/lib/runtime/src/utils.rs +++ b/lib/runtime/src/utils.rs @@ -12,4 +12,5 @@ pub mod tasks; pub mod typed_prefix_watcher; pub use graceful_shutdown::{GracefulShutdownTracker, GracefulTaskGuard}; +#[allow(deprecated)] pub use ip_resolver::{local_ip_for_advertise, tcp_rpc_host_from_env}; diff --git a/lib/runtime/src/utils/ip_resolver.rs b/lib/runtime/src/utils/ip_resolver.rs index bb098c2400a7..024ee2ba42fd 100644 --- a/lib/runtime/src/utils/ip_resolver.rs +++ b/lib/runtime/src/utils/ip_resolver.rs @@ -3,13 +3,39 @@ //! Local IP address resolution for advertising endpoints. -use anyhow::{Result, bail}; use local_ip_address::{Error, list_afinet_netifas, local_ip, local_ipv6}; -use std::{ffi::OsString, net::IpAddr}; +use std::ffi::OsString; +use std::{ + net::{IpAddr, Ipv4Addr, Ipv6Addr}, + sync::OnceLock, +}; -const FALLBACK: IpAddr = IpAddr::V4(std::net::Ipv4Addr::LOCALHOST); +const DEFAULT_LOOPBACK: IpAddr = IpAddr::V4(Ipv4Addr::LOCALHOST); +static LOCAL_IP_FOR_ADVERTISE: OnceLock = OnceLock::new(); -/// IP address resolution interface used by networking components and tests. +/// Read and normalize a host override from the environment. +pub(crate) fn host_override_from_env(name: &str) -> anyhow::Result> { + host_override_from_lookup(name, |key| std::env::var_os(key)) +} + +fn host_override_from_lookup( + name: &str, + mut get_env: impl FnMut(&str) -> Option, +) -> anyhow::Result> { + let Some(value) = get_env(name) else { + return Ok(None); + }; + let value = value + .into_string() + .map_err(|_| anyhow::anyhow!("{name} must contain valid Unicode"))?; + let value = value.trim(); + Ok((!value.is_empty()).then(|| value.to_string())) +} + +/// IP address operations used by the runtime. +/// +/// This trait allows address resolution and interface enumeration to be +/// controlled in tests. pub trait IpResolver { fn local_ip(&self) -> Result; fn local_ipv6(&self) -> Result; @@ -17,9 +43,17 @@ pub trait IpResolver { fn list_afinet_netifas(&self) -> Result, Error> { list_afinet_netifas() } + + /// List addresses eligible for automatic selection. + /// + /// Custom resolvers can override this to exclude down interfaces. The + /// default trusts their existing interface inventory for compatibility. + fn list_up_afinet_netifas(&self) -> Result, Error> { + self.list_afinet_netifas() + } } -/// Default resolver backed by the local network interfaces. +/// The system IP resolver. pub struct DefaultIpResolver; impl IpResolver for DefaultIpResolver { @@ -30,237 +64,861 @@ impl IpResolver for DefaultIpResolver { fn local_ipv6(&self) -> Result { local_ipv6() } + + #[cfg(unix)] + fn list_up_afinet_netifas(&self) -> Result, Error> { + let interfaces = nix::ifaddrs::getifaddrs() + .map_err(|error| Error::StrategyError(format!("getifaddrs failed: {error}")))?; + Ok(up_ip_interfaces(interfaces)) + } } -/// Resolve the local IP for advertising endpoints, falling back to 127.0.0.1. -/// -/// IPv6 addresses are bracketed (e.g. `[::1]`) so the result is safe to -/// interpolate into a `host:port` URL. -pub fn local_ip_for_advertise() -> String { - resolve(DefaultIpResolver) +#[cfg(unix)] +fn up_ip_interfaces( + interfaces: impl IntoIterator, +) -> Vec<(String, IpAddr)> { + use nix::net::if_::InterfaceFlags; + + interfaces + .into_iter() + .filter(|interface| interface.flags.contains(InterfaceFlags::IFF_UP)) + .filter_map(|interface| { + let address = interface.address?; + let ip = if let Some(address) = address.as_sockaddr_in() { + IpAddr::V4(address.ip()) + } else { + IpAddr::V6(address.as_sockaddr_in6()?.ip()) + }; + Some((interface.interface_name, ip)) + }) + .collect() } -/// TCP RPC host: `DYN_TCP_RPC_HOST` if set, otherwise the resolved local IP. -pub fn tcp_rpc_host_from_env() -> String { - std::env::var("DYN_TCP_RPC_HOST").unwrap_or_else(|_| local_ip_for_advertise()) +#[derive(Debug, thiserror::Error)] +pub(crate) enum IpResolutionError { + #[error("failed to enumerate network interfaces: {0}")] + InterfaceEnumeration(#[source] Error), + + #[error("interface not found: {0}")] + InterfaceNotFound(String), + + #[error("interface has no usable IP address: {0}")] + NoUsableInterfaceAddress(String), + + #[error("IP address is not usable: {0}")] + UnusableAddress(IpAddr), + + #[error("invalid IP literal: {0}")] + InvalidLiteral(String), } -/// Read and normalize a host override from the environment. -pub(crate) fn host_override_from_env(name: &str) -> Result> { - host_override_from_lookup(name, |key| std::env::var_os(key)) +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) struct ResolvedHost { + bind_ip: IpAddr, + advertise_ip: IpAddr, + used_loopback_fallback: bool, } -fn host_override_from_lookup( - name: &str, - mut get_env: impl FnMut(&str) -> Option, -) -> Result> { - let Some(value) = get_env(name) else { - return Ok(None); - }; - let value = value - .into_string() - .map_err(|_| anyhow::anyhow!("{name} must contain valid Unicode"))?; - let value = value.trim(); - Ok((!value.is_empty()).then(|| value.to_string())) +impl ResolvedHost { + pub(crate) fn same_address(address: IpAddr) -> Self { + Self { + bind_ip: address, + advertise_ip: address, + used_loopback_fallback: false, + } + } + + pub(crate) fn loopback_fallback(address: IpAddr) -> Self { + Self { + bind_ip: address, + advertise_ip: address, + used_loopback_fallback: true, + } + } + + pub(crate) fn bind_ip(self) -> IpAddr { + self.bind_ip + } + + pub(crate) fn advertise_ip(self) -> IpAddr { + self.advertise_ip + } + + pub(crate) fn used_loopback_fallback(self) -> bool { + self.used_loopback_fallback + } } -/// Resolve a configured host as an IP literal or exact network interface name. +#[derive(Default)] +struct AddressCandidates { + ipv4: Option, + ipv6: Option, + ipv4_loopback: Option, + ipv6_loopback: Option, +} + +impl AddressCandidates { + fn consider(&mut self, address: IpAddr) { + let address = address.to_canonical(); + if !is_usable(address) { + return; + } + + match address { + IpAddr::V4(address) if address.is_loopback() => { + self.ipv4_loopback.get_or_insert(address); + } + IpAddr::V4(address) => { + self.ipv4.get_or_insert(address); + } + IpAddr::V6(address) if address.is_loopback() => { + self.ipv6_loopback.get_or_insert(address); + } + IpAddr::V6(address) => { + self.ipv6.get_or_insert(address); + } + } + } + + fn preferred_non_loopback(&self) -> Option { + self.ipv4 + .map(IpAddr::V4) + .or_else(|| self.ipv6.map(IpAddr::V6)) + } + + fn preferred_loopback(&self) -> Option { + self.ipv4_loopback + .map(IpAddr::V4) + .or_else(|| self.ipv6_loopback.map(IpAddr::V6)) + } + + fn non_loopback_for(&self, family: IpAddr) -> Option { + match family { + IpAddr::V4(_) => self.ipv4.map(IpAddr::V4), + IpAddr::V6(_) => self.ipv6.map(IpAddr::V6), + } + } + + fn loopback_for(&self, family: IpAddr) -> Option { + match family { + IpAddr::V4(_) => self.ipv4_loopback.map(IpAddr::V4), + IpAddr::V6(_) => self.ipv6_loopback.map(IpAddr::V6), + } + } + + fn other_non_loopback(&self, family: IpAddr) -> Option { + match family { + IpAddr::V4(_) => self.ipv6.map(IpAddr::V6), + IpAddr::V6(_) => self.ipv4.map(IpAddr::V4), + } + } +} + +fn local_candidates(resolver: &R) -> Result { + let interfaces = resolver + .list_up_afinet_netifas() + .map_err(IpResolutionError::InterfaceEnumeration)?; + let mut candidates = AddressCandidates::default(); + for (_, address) in interfaces { + candidates.consider(address); + } + Ok(candidates) +} + +/// Resolve the preferred local bind and advertisement address from one +/// interface snapshot. The system resolver excludes down interfaces on Unix. +pub(crate) fn resolve_local_host( + resolver: &R, +) -> Result { + let candidates = local_candidates(resolver)?; + if let Some(address) = candidates.preferred_non_loopback() { + return Ok(ResolvedHost::same_address(address)); + } + + Ok(ResolvedHost::loopback_fallback( + candidates.preferred_loopback().unwrap_or(DEFAULT_LOOPBACK), + )) +} + +/// Resolve a configured host value as an IP literal or interface name. /// -/// Interface lookup preserves the existing TCP response-stream behavior: when -/// an interface name occurs more than once, the last enumerated address wins. +/// Named dual-stack interfaces prefer the first usable IPv4 address in OS +/// enumeration order. IPv6 is used when no usable IPv4 address exists. +/// Surrounding whitespace is trimmed, and IPv4-mapped addresses use IPv4 rules. pub(crate) fn resolve_host_or_interface( host_or_interface: &str, resolver: &R, -) -> Result { +) -> Result { let host_or_interface = host_or_interface.trim(); - let ip = match host_or_interface.parse::() { - Ok(ip) => ip, - Err(_) => resolver - .list_afinet_netifas()? - .into_iter() - .filter_map(|(name, ip)| (name == host_or_interface).then_some(ip)) - .next_back() - .ok_or_else(|| { - anyhow::anyhow!( - "'{host_or_interface}' is not a valid IP address and no network interface with that name was found" - ) - })?, - }; - if ip.to_canonical().is_unspecified() { - bail!("unspecified IP addresses cannot be advertised"); + if let Some(address) = parse_ip_literal(host_or_interface)? { + if address.is_unspecified() { + return resolve_wildcard(address, &local_candidates(resolver)?); + } + + validate_configured_address(address)?; + return Ok(ResolvedHost::same_address(address)); + } + + let interfaces = resolver + .list_afinet_netifas() + .map_err(IpResolutionError::InterfaceEnumeration)?; + let mut interface_found = false; + let mut candidates = AddressCandidates::default(); + + for (name, address) in interfaces { + if name != host_or_interface { + continue; + } + + interface_found = true; + candidates.consider(address); } - Ok(ip) + + if !interface_found { + return Err(IpResolutionError::InterfaceNotFound( + host_or_interface.to_string(), + )); + } + + candidates + .preferred_non_loopback() + .or_else(|| candidates.preferred_loopback()) + .map(ResolvedHost::same_address) + .ok_or_else(|| IpResolutionError::NoUsableInterfaceAddress(host_or_interface.to_string())) } -pub(crate) fn resolve_local_host(resolver: &R) -> IpAddr { - resolver - .local_ip() - .or_else(|err| match err { - Error::LocalIpAddressNotFound => resolver.local_ipv6(), - _ => Err(err), - }) - .unwrap_or(FALLBACK) +fn resolve_wildcard( + wildcard: IpAddr, + candidates: &AddressCandidates, +) -> Result { + if let Some(advertise_ip) = candidates.non_loopback_for(wildcard) { + return Ok(ResolvedHost { + bind_ip: wildcard, + advertise_ip, + used_loopback_fallback: false, + }); + } + + if let Some(advertise_ip) = candidates.other_non_loopback(wildcard) { + return Ok(ResolvedHost { + bind_ip: unspecified_for(advertise_ip), + advertise_ip, + used_loopback_fallback: false, + }); + } + + let advertise_ip = candidates + .loopback_for(wildcard) + .or_else(|| candidates.preferred_loopback()) + .unwrap_or_else(|| loopback_for(wildcard)); + Ok(ResolvedHost { + bind_ip: unspecified_for(advertise_ip), + advertise_ip, + used_loopback_fallback: true, + }) +} + +/// Resolve an advertisement address that is served by an existing listener. +/// Wildcard listeners stay in their bound family. +pub(crate) fn resolve_advertise_ip_for_bind( + bind_ip: IpAddr, + resolver: &R, +) -> Result { + let bind_ip = bind_ip.to_canonical(); + if !bind_ip.is_unspecified() { + validate_configured_address(bind_ip)?; + return Ok(bind_ip); + } + + let candidates = local_candidates(resolver)?; + Ok(candidates + .non_loopback_for(bind_ip) + .or_else(|| candidates.loopback_for(bind_ip)) + .unwrap_or_else(|| loopback_for(bind_ip))) +} + +fn unspecified_for(address: IpAddr) -> IpAddr { + match address { + IpAddr::V4(_) => IpAddr::V4(Ipv4Addr::UNSPECIFIED), + IpAddr::V6(_) => IpAddr::V6(Ipv6Addr::UNSPECIFIED), + } +} + +fn loopback_for(address: IpAddr) -> IpAddr { + match address { + IpAddr::V4(_) => IpAddr::V4(Ipv4Addr::LOCALHOST), + IpAddr::V6(_) => IpAddr::V6(Ipv6Addr::LOCALHOST), + } +} + +fn parse_ip_literal(value: &str) -> Result, IpResolutionError> { + let has_open_bracket = value.starts_with('['); + let has_close_bracket = value.ends_with(']'); + + if has_open_bracket || has_close_bracket { + if !(has_open_bracket && has_close_bracket) { + return Err(IpResolutionError::InvalidLiteral(value.to_string())); + } + + let inner = &value[1..value.len() - 1]; + return inner + .parse::() + .map(|address| Some(IpAddr::V6(address).to_canonical())) + .map_err(|_| IpResolutionError::InvalidLiteral(value.to_string())); + } + + match value.parse::() { + Ok(address) => Ok(Some(address.to_canonical())), + Err(_) if looks_like_ip_literal(value) => { + Err(IpResolutionError::InvalidLiteral(value.to_string())) + } + Err(_) => Ok(None), + } +} + +fn looks_like_ip_literal(value: &str) -> bool { + value.bytes().filter(|byte| *byte == b':').count() >= 2 + || (value.contains('.') + && value + .chars() + .all(|character| character.is_ascii_digit() || character == '.')) +} + +fn validate_configured_address(address: IpAddr) -> Result<(), IpResolutionError> { + if is_usable(address) { + Ok(()) + } else { + Err(IpResolutionError::UnusableAddress(address)) + } +} + +fn is_usable(address: IpAddr) -> bool { + match address { + IpAddr::V4(address) => { + !address.is_unspecified() && !address.is_multicast() && !address.is_broadcast() + } + IpAddr::V6(address) => { + !address.is_unspecified() && !address.is_multicast() && !address.is_unicast_link_local() + } + } +} + +/// Resolve the local IP for advertising endpoints, with loopback fallback. +/// +/// IPv6 addresses are bracketed (for example, `[::1]`) so the result is safe +/// to interpolate into a `host:port` URL. Resolution is cached for the process +/// lifetime only after a non-loopback address is found. Enumeration failures +/// and loopback fallbacks are retried on the next call. +pub fn local_ip_for_advertise() -> String { + cached_local_ip_for_advertise(&LOCAL_IP_FOR_ADVERTISE, &DefaultIpResolver) +} + +/// TCP RPC host: `DYN_TCP_RPC_HOST` if set, otherwise the resolved local IP. +#[deprecated(note = "DYN_TCP_RPC_HOST is resolved by the request-plane server at startup")] +pub fn tcp_rpc_host_from_env() -> String { + std::env::var(crate::config::environment_names::request_plane::DYN_TCP_RPC_HOST) + .unwrap_or_else(|_| local_ip_for_advertise()) } -fn resolve(resolver: R) -> String { - let ip = resolve_local_host(&resolver); +fn cached_local_ip_for_advertise(cache: &OnceLock, resolver: &R) -> String { + if let Some(address) = cache.get() { + return format_host(*address); + } + + match resolve_local_host(resolver) { + Ok(resolved) if !resolved.used_loopback_fallback() => { + let address = resolved.advertise_ip(); + if cache.set(address).is_err() { + return format_host(*cache.get().expect("advertisement cache was initialized")); + } + format_host(address) + } + Ok(resolved) => { + let loopback = resolved.advertise_ip(); + tracing::warn!( + %loopback, + "No usable non-loopback IP address found; advertising loopback" + ); + format_host(loopback) + } + Err(error) => { + tracing::warn!( + %error, + loopback = %DEFAULT_LOOPBACK, + "Failed to resolve a usable local IP address; advertising loopback" + ); + format_host(DEFAULT_LOOPBACK) + } + } +} - match ip { - IpAddr::V6(_) => format!("[{ip}]"), - IpAddr::V4(_) => ip.to_string(), +fn format_host(address: IpAddr) -> String { + match address { + IpAddr::V6(_) => format!("[{address}]"), + IpAddr::V4(_) => address.to_string(), } } #[cfg(test)] -mod tests { +pub(crate) mod test_support { use super::*; + use std::cell::Cell; + + #[derive(Clone, Copy)] + pub(crate) enum ProbeOutcome { + NotFound, + Strategy(&'static str), + Platform(&'static str), + } + + impl ProbeOutcome { + fn result(self) -> Result { + match self { + Self::NotFound => Err(Error::LocalIpAddressNotFound), + Self::Strategy(message) => Err(Error::StrategyError(message.to_string())), + Self::Platform(platform) => Err(Error::PlatformNotSupported(platform.to_string())), + } + } + + fn error(self) -> Error { + self.result().unwrap_err() + } + } - struct MockIpResolver { - v4: Result, - v6: Result, - interfaces: Vec<(String, IpAddr)>, + pub(crate) struct StubResolver { + pub(crate) ipv4: ProbeOutcome, + pub(crate) ipv6: ProbeOutcome, + pub(crate) interfaces: Vec<(&'static str, IpAddr)>, + pub(crate) down_interfaces: Vec<&'static str>, + pub(crate) interface_error: Option, + pub(crate) ipv4_calls: Cell, + pub(crate) ipv6_calls: Cell, + pub(crate) interface_calls: Cell, } - impl IpResolver for MockIpResolver { + impl StubResolver { + pub(crate) fn new(ipv4: ProbeOutcome, ipv6: ProbeOutcome) -> Self { + Self { + ipv4, + ipv6, + interfaces: vec![ + ("lo", IpAddr::V4(Ipv4Addr::LOCALHOST)), + ("lo", IpAddr::V6(Ipv6Addr::LOCALHOST)), + ], + down_interfaces: Vec::new(), + interface_error: None, + ipv4_calls: Cell::new(0), + ipv6_calls: Cell::new(0), + interface_calls: Cell::new(0), + } + } + + pub(crate) fn not_found() -> Self { + Self::new(ProbeOutcome::NotFound, ProbeOutcome::NotFound) + } + } + + impl IpResolver for StubResolver { fn local_ip(&self) -> Result { - self.v4 - .as_ref() - .copied() - .map_err(|_| Error::LocalIpAddressNotFound) + self.ipv4_calls.set(self.ipv4_calls.get() + 1); + self.ipv4.result() } fn local_ipv6(&self) -> Result { - self.v6 - .as_ref() - .copied() - .map_err(|_| Error::LocalIpAddressNotFound) + self.ipv6_calls.set(self.ipv6_calls.get() + 1); + self.ipv6.result() } fn list_afinet_netifas(&self) -> Result, Error> { - Ok(self.interfaces.clone()) + self.interface_calls.set(self.interface_calls.get() + 1); + if let Some(error) = self.interface_error { + return Err(error.error()); + } + + Ok(self + .interfaces + .iter() + .map(|(name, address)| ((*name).to_string(), *address)) + .collect()) + } + + fn list_up_afinet_netifas(&self) -> Result, Error> { + Ok(self + .list_afinet_netifas()? + .into_iter() + .filter(|(name, _)| !self.down_interfaces.contains(&name.as_str())) + .collect()) } } +} - #[test] - fn ipv4_returned_unbracketed() { - let r = MockIpResolver { - v4: Ok(IpAddr::from([192, 168, 1, 100])), - v6: Err(Error::LocalIpAddressNotFound), - interfaces: Vec::new(), - }; - assert_eq!(resolve(r), "192.168.1.100"); +#[cfg(test)] +mod tests { + use super::test_support::{ProbeOutcome, StubResolver}; + use super::*; + use ProbeOutcome::{NotFound, Platform, Strategy}; + + fn ip(address: &str) -> IpAddr { + address.parse().unwrap() } - #[test] - fn ipv6_fallback_is_bracketed() { - let r = MockIpResolver { - v4: Err(Error::LocalIpAddressNotFound), - v6: Ok(IpAddr::from([0x2001, 0xdb8, 0, 0, 0, 0, 0, 1])), - interfaces: Vec::new(), - }; - assert_eq!(resolve(r), "[2001:db8::1]"); + fn interface(name: &'static str, addresses: &[&str]) -> Vec<(&'static str, IpAddr)> { + addresses + .iter() + .map(|address| (name, ip(address))) + .collect() } #[test] - fn both_fail_uses_localhost() { - let r = MockIpResolver { - v4: Err(Error::LocalIpAddressNotFound), - v6: Err(Error::LocalIpAddressNotFound), - interfaces: Vec::new(), - }; - assert_eq!(resolve(r), "127.0.0.1"); + fn ipv6_only_inventory_uses_global_ipv6_without_family_probes() { + let mut resolver = StubResolver::new(Strategy("IPv4 failed"), NotFound); + resolver.interfaces = vec![ + ("lo", ip("127.0.0.1")), + ("lo", ip("::1")), + ("eth0", ip("2001:db8::5")), + ]; + + let resolved = resolve_local_host(&resolver).unwrap(); + assert_eq!(resolved.bind_ip(), ip("2001:db8::5")); + assert!(!resolved.used_loopback_fallback()); + assert_eq!(resolver.ipv4_calls.get(), 0); + assert_eq!(resolver.ipv6_calls.get(), 0); + assert_eq!(resolver.interface_calls.get(), 1); } + #[cfg(unix)] #[test] - fn explicit_ip_literals_are_used_directly_and_trimmed() { - let resolver = MockIpResolver { - v4: Err(Error::LocalIpAddressNotFound), - v6: Err(Error::LocalIpAddressNotFound), - interfaces: Vec::new(), + fn system_inventory_keeps_only_up_ip_addresses() { + use nix::{ + ifaddrs::InterfaceAddress, net::if_::InterfaceFlags, sys::socket::SockaddrStorage, }; + use std::{net::SocketAddr, os::fd::AsRawFd, os::unix::net::UnixDatagram}; + + let socket = UnixDatagram::unbound().unwrap(); + let unsupported = + nix::sys::socket::getsockname::(socket.as_raw_fd()).unwrap(); + let up = InterfaceFlags::IFF_UP; + let entries = [ + ( + "stale0", + InterfaceFlags::empty(), + Some(SocketAddr::new(ip("198.51.100.1"), 0).into()), + ), + ("eth0", up, Some(SocketAddr::new(ip("192.0.2.1"), 0).into())), + ( + "eth0", + up, + Some(SocketAddr::new(ip("2001:db8::1"), 0).into()), + ), + ( + "lo", + up | InterfaceFlags::IFF_LOOPBACK, + Some(SocketAddr::new(ip("127.0.0.1"), 0).into()), + ), + ("unsupported", up, Some(unsupported)), + ("no-address", up, None), + ]; + let interfaces = entries + .into_iter() + .map(|(name, flags, address)| InterfaceAddress { + interface_name: name.to_string(), + flags, + address, + netmask: None, + broadcast: None, + destination: None, + }); assert_eq!( - resolve_host_or_interface(" 172.16.0.87 ", &resolver).unwrap(), - "172.16.0.87".parse::().unwrap() - ); - assert_eq!( - resolve_host_or_interface("2001:db8::1", &resolver).unwrap(), - "2001:db8::1".parse::().unwrap() + up_ip_interfaces(interfaces), + vec![ + ("eth0".to_string(), ip("192.0.2.1")), + ("eth0".to_string(), ip("2001:db8::1")), + ("lo".to_string(), ip("127.0.0.1")), + ] ); } #[test] - fn explicit_host_rejects_unspecified_addresses() { - let resolver = MockIpResolver { - v4: Err(Error::LocalIpAddressNotFound), - v6: Err(Error::LocalIpAddressNotFound), - interfaces: vec![("wildcard0".to_string(), "::ffff:0.0.0.0".parse().unwrap())], - }; - - for host in ["0.0.0.0", "::", "::ffff:0.0.0.0", "wildcard0"] { + fn automatic_selection_excludes_down_interfaces_but_explicit_lookup_keeps_them() { + for active in [Some("192.0.2.1"), Some("2001:db8::1"), None] { + let mut resolver = StubResolver::not_found(); + resolver + .interfaces + .insert(0, ("stale0", ip("198.51.100.1"))); + resolver.down_interfaces.push("stale0"); + if let Some(address) = active { + resolver.interfaces.push(("eth0", ip(address))); + } + let expected = active.map(ip).unwrap_or(DEFAULT_LOOPBACK); assert_eq!( - resolve_host_or_interface(host, &resolver) - .unwrap_err() - .to_string(), - "unspecified IP addresses cannot be advertised" + resolve_local_host(&resolver).unwrap().advertise_ip(), + expected + ); + assert_eq!( + resolve_host_or_interface("0.0.0.0", &resolver) + .unwrap() + .advertise_ip(), + expected + ); + assert_eq!( + resolve_advertise_ip_for_bind(unspecified_for(expected), &resolver).unwrap(), + expected + ); + assert_eq!( + resolve_host_or_interface("stale0", &resolver) + .unwrap() + .advertise_ip(), + ip("198.51.100.1") ); } } #[test] - fn exact_interface_name_supports_ipv4_and_ipv6() { - let resolver = MockIpResolver { - v4: Err(Error::LocalIpAddressNotFound), - v6: Err(Error::LocalIpAddressNotFound), - interfaces: vec![ - ("ib0".to_string(), "172.16.0.87".parse().unwrap()), - ("eth0".to_string(), "2001:db8::20".parse().unwrap()), - ], - }; + fn configured_literals_are_parsed_and_validated() { + let resolver = StubResolver::not_found(); + + for (literal, expected) in [ + ("192.0.2.10", "192.0.2.10"), + ("169.254.1.1", "169.254.1.1"), + ("2001:db8::2", "2001:db8::2"), + ("[2001:db8::2]", "2001:db8::2"), + ("fd00::2", "fd00::2"), + (" 127.0.0.1 ", "127.0.0.1"), + ("\t[::1] ", "::1"), + ("::ffff:192.0.2.10", "192.0.2.10"), + ("[::ffff:127.0.0.1]", "127.0.0.1"), + ] { + let resolved = resolve_host_or_interface(literal, &resolver).unwrap(); + assert_eq!(resolved.bind_ip(), ip(expected)); + assert_eq!(resolved.advertise_ip(), resolved.bind_ip()); + } + + for literal in ["[::1", "::1]", "[not-an-ip]", "192.0.2.999"] { + let error = resolve_host_or_interface(literal, &resolver) + .unwrap_err() + .to_string(); + assert!(error.contains("invalid IP literal"), "{error}"); + } + + for literal in [ + "224.0.0.1", + "255.255.255.255", + "fe80::1", + "ff02::1", + "::ffff:224.0.0.1", + "[::ffff:255.255.255.255]", + ] { + let error = resolve_host_or_interface(literal, &resolver).unwrap_err(); + assert!(matches!(error, IpResolutionError::UnusableAddress(_))); + } + } + + #[test] + fn wildcard_switches_bind_family_before_using_loopback() { + let mut resolver = StubResolver::new(NotFound, NotFound); + resolver.interfaces = interface("eth0", &["192.0.2.20"]); + let cases = [ + ("0.0.0.0", ip("0.0.0.0"), ip("192.0.2.20")), + ("::", ip("0.0.0.0"), ip("192.0.2.20")), + ("[::]", ip("0.0.0.0"), ip("192.0.2.20")), + ("::ffff:0.0.0.0", ip("0.0.0.0"), ip("192.0.2.20")), + (" [::ffff:0.0.0.0] ", ip("0.0.0.0"), ip("192.0.2.20")), + ]; + + for (literal, bind_ip, advertise_ip) in cases { + let resolved = resolve_host_or_interface(literal, &resolver).unwrap(); + assert_eq!(resolved.bind_ip(), bind_ip); + assert_eq!(resolved.advertise_ip(), advertise_ip); + } + } + + #[test] + fn wildcard_prefers_loopback_in_requested_family() { + let mut resolver = StubResolver::not_found(); + resolver.interfaces = vec![("lo", ip("127.0.0.1")), ("lo", ip("::1"))]; + + for (literal, expected_bind, expected_advertise) in [ + ("0.0.0.0", ip("0.0.0.0"), ip("127.0.0.1")), + ("::", ip("::"), ip("::1")), + ("[::]", ip("::"), ip("::1")), + ("::ffff:0.0.0.0", ip("0.0.0.0"), ip("127.0.0.1")), + ] { + let resolved = resolve_host_or_interface(literal, &resolver).unwrap(); + assert_eq!(resolved.bind_ip(), expected_bind); + assert_eq!(resolved.advertise_ip(), expected_advertise); + } + + resolver.interfaces = vec![("lo", ip("127.0.0.1"))]; + let resolved = resolve_host_or_interface("::", &resolver).unwrap(); + assert_eq!(resolved.bind_ip(), ip("0.0.0.0")); + assert_eq!(resolved.advertise_ip(), ip("127.0.0.1")); + + resolver.interfaces.clear(); + let resolved = resolve_host_or_interface("::", &resolver).unwrap(); + assert_eq!(resolved.bind_ip(), ip("::")); + assert_eq!(resolved.advertise_ip(), ip("::1")); + } + + #[test] + fn interface_alias_preserves_order_and_accepts_ipv4_link_local() { + let mut resolver = StubResolver::not_found(); + resolver.interfaces = interface("eth0:1", &["2001:db8::2", "169.254.10.5", "192.0.2.10"]); + + for name in ["eth0:1", " eth0:1\t"] { + let resolved = resolve_host_or_interface(name, &resolver).unwrap(); + assert_eq!(resolved.advertise_ip(), ip("169.254.10.5")); + } + } + + #[test] + fn interface_errors_retain_context() { + let mut resolver = StubResolver::not_found(); + resolver.interfaces = vec![("eth0", ip("fe80::1"))]; + + for (name, expected) in [ + ("missing", "interface not found: missing"), + ("", "interface not found: "), + (" \t", "interface not found: "), + ("eth0", "interface has no usable IP address: eth0"), + ] { + let error = resolve_host_or_interface(name, &resolver) + .unwrap_err() + .to_string(); + assert!(error.contains(expected), "{error}"); + } + + resolver.interface_error = Some(Platform("test-platform")); + let error = resolve_host_or_interface("eth0", &resolver) + .unwrap_err() + .to_string(); + assert!( + error.contains("failed to enumerate network interfaces"), + "{error}" + ); + assert!(error.contains("test-platform"), "{error}"); + } + + #[test] + fn loopback_only_host_preserves_ipv4_compatibility() { + let mut resolver = StubResolver::not_found(); + resolver.interfaces = vec![ + ("lo", IpAddr::V4(Ipv4Addr::LOCALHOST)), + ("lo", IpAddr::V6(Ipv6Addr::LOCALHOST)), + ]; + + let resolved = resolve_local_host(&resolver).unwrap(); + assert_eq!(resolved.advertise_ip(), DEFAULT_LOOPBACK); + assert!(resolved.used_loopback_fallback()); + } + + #[test] + fn bound_wildcard_advertisement_stays_in_bound_family() { + let mut resolver = StubResolver::not_found(); + resolver.interfaces = vec![ + ("lo", ip("127.0.0.1")), + ("lo", ip("::1")), + ("eth0", ip("2001:db8::20")), + ]; assert_eq!( - resolve_host_or_interface(" ib0 ", &resolver).unwrap(), - "172.16.0.87".parse::().unwrap() + resolve_advertise_ip_for_bind(ip("0.0.0.0"), &resolver).unwrap(), + ip("127.0.0.1") + ); + assert_eq!( + resolve_advertise_ip_for_bind(ip("::"), &resolver).unwrap(), + ip("2001:db8::20") + ); + assert_eq!( + resolve_advertise_ip_for_bind(ip("::ffff:0.0.0.0"), &resolver).unwrap(), + ip("127.0.0.1") ); assert_eq!( - resolve_host_or_interface("eth0", &resolver).unwrap(), - "2001:db8::20".parse::().unwrap() + resolve_advertise_ip_for_bind(ip("::ffff:127.0.0.1"), &resolver).unwrap(), + ip("127.0.0.1") ); } #[test] - fn interface_lookup_preserves_existing_last_address_behavior() { - let resolver = MockIpResolver { - v4: Err(Error::LocalIpAddressNotFound), - v6: Err(Error::LocalIpAddressNotFound), - interfaces: vec![ - ("ib0".to_string(), "172.16.0.10".parse().unwrap()), - ("ib0".to_string(), "172.16.0.20".parse().unwrap()), + fn mapped_interface_addresses_use_ipv4_classification() { + let mut resolver = StubResolver::not_found(); + resolver.interfaces = interface( + "eth0", + &[ + "::ffff:0.0.0.0", + "::ffff:224.0.0.1", + "::ffff:255.255.255.255", + "::ffff:127.0.0.1", + "2001:db8::20", ], - }; - + ); + assert_eq!( + resolve_local_host(&resolver).unwrap().advertise_ip(), + ip("2001:db8::20") + ); + resolver.interfaces.push(("eth0", ip("::ffff:192.0.2.1"))); assert_eq!( - resolve_host_or_interface("ib0", &resolver).unwrap(), - "172.16.0.20".parse::().unwrap() + resolve_local_host(&resolver).unwrap().advertise_ip(), + ip("192.0.2.1") + ); + assert_eq!( + resolve_host_or_interface("eth0", &resolver) + .unwrap() + .advertise_ip(), + ip("192.0.2.1") ); } #[test] - fn missing_interface_reports_the_accepted_input_forms() { - let resolver = MockIpResolver { - v4: Err(Error::LocalIpAddressNotFound), - v6: Err(Error::LocalIpAddressNotFound), - interfaces: Vec::new(), - }; + fn transient_fallbacks_are_not_cached_but_success_is() { + let cache = OnceLock::new(); + let mut enumeration_error = StubResolver::not_found(); + enumeration_error.interface_error = Some(Platform("transient")); + assert_eq!( + cached_local_ip_for_advertise(&cache, &enumeration_error), + "127.0.0.1" + ); + assert!(cache.get().is_none()); + let loopback = StubResolver::not_found(); assert_eq!( - resolve_host_or_interface("missing0", &resolver) - .unwrap_err() - .to_string(), - "'missing0' is not a valid IP address and no network interface with that name was found" + cached_local_ip_for_advertise(&cache, &loopback), + "127.0.0.1" + ); + assert!(cache.get().is_none()); + + let mut success = StubResolver::not_found(); + success.interfaces.push(("eth0", ip("2001:db8::10"))); + assert_eq!( + cached_local_ip_for_advertise(&cache, &success), + "[2001:db8::10]" + ); + assert_eq!(cache.get(), Some(&ip("2001:db8::10"))); + + assert_eq!( + cached_local_ip_for_advertise(&cache, &loopback), + "[2001:db8::10]" ); } + #[test] + fn legacy_resolver_implementation_remains_source_compatible() { + struct LegacyResolver; + + impl IpResolver for LegacyResolver { + fn local_ip(&self) -> Result { + Err(Error::LocalIpAddressNotFound) + } + + fn local_ipv6(&self) -> Result { + Err(Error::LocalIpAddressNotFound) + } + } + + fn assert_resolver() {} + assert_resolver::(); + } + #[test] fn host_override_is_trimmed_and_empty_is_unset() { assert_eq!( From 12e8f63396681f39284cac88b62b94c40694ba80 Mon Sep 17 00:00:00 2001 From: Jacky <18255193+kthui@users.noreply.github.com> Date: Thu, 17 Sep 2026 21:46:34 -0700 Subject: [PATCH 098/191] docs(fault-tolerance): clarify migration after shutdown grace expires (#14872) Signed-off-by: Jacky <18255193+kthui@users.noreply.github.com> --- .../graceful-shutdown-architecture.md | 13 ++++++++----- .../request-migration-architecture.md | 6 +++--- .../kubernetes/fault-tolerance/graceful-shutdown.md | 6 ++++-- .../kubernetes/fault-tolerance/request-migration.md | 4 ++-- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/graceful-shutdown-architecture.md b/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/graceful-shutdown-architecture.md index c4655ccaec98..2588c8b1af54 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/graceful-shutdown-architecture.md +++ b/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/graceful-shutdown-architecture.md @@ -40,12 +40,15 @@ for sig in (signal.SIGTERM, signal.SIGINT): ``` The `graceful_shutdown()` function: + 1. Logs the shutdown signal 2. Unregisters all endpoints from discovery 3. Waits for a configurable grace period (`DYN_GRACEFUL_SHUTDOWN_GRACE_PERIOD_SECS`, default 5s) -4. Calls `runtime.shutdown()` to invalidate endpoints and stop accepting new requests -5. Waits for in-flight requests (based on `graceful_shutdown` per endpoint) -6. Returns to allow cleanup to proceed +4. Awaits the optional `drain_callback` and `pre_shutdown_callback`, in that order +5. Sets `shutdown_event`, if provided, to initiate cancellation of unfinished requests +6. Awaits the optional `cleanup_callback` before runtime teardown +7. Calls `runtime.shutdown()` to initiate runtime shutdown +8. Returns while the runtime waits for request handlers to finish, including with an error (based on `graceful_shutdown` per endpoint) The aggregate wait in `runtime.shutdown()` is bounded by `DYN_RUNTIME_GRACEFUL_SHUTDOWN_TIMEOUT_SECS`, which defaults to 900 seconds @@ -101,7 +104,7 @@ drain into a restart loop. Backend workers always use `graceful_shutdown=True`, meaning they wait for in-flight requests to complete until the engine is stopped. Request migration is configured at the **frontend** level via `--migration-limit`: -- When migration is enabled at the frontend, disconnected streams from failed workers are automatically retried on healthy workers +- When migration is enabled at the frontend, requests interrupted by worker failure or graceful shutdown after grace expires are retried on healthy workers, subject to the retry budget and request limits - Workers don't need to know about migration configuration - they simply complete their work or signal incomplete streams - See [Request Migration Architecture](request-migration-architecture.md) for details on how migration works @@ -206,7 +209,7 @@ Kubernetes uses health endpoints to determine pod readiness: - **During shutdown**: Endpoints become unavailable - **Readiness probe fails**: Traffic stops routing to the pod -- **Graceful draining**: Existing requests complete +- **Graceful draining**: Existing requests have time to complete ## Related Documentation diff --git a/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-migration-architecture.md b/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-migration-architecture.md index bcf2b1121742..346f271197a6 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-migration-architecture.md +++ b/docs/fern/pages/developer-guide/knowledge-base/concepts/fault-tolerance/request-migration-architecture.md @@ -59,13 +59,13 @@ The migration system handles two distinct failure scenarios: #### 2. Ongoing Request Migration (Mid-Stream Disconnection) -**Scenario**: Connection lost during active generation after partial responses have been received. +**Scenario**: The connection is lost or an ongoing request ends with a migratable error. -**Error Pattern**: Stream termination detected before generation completion. +**Error Pattern**: A migratable stream error is reported before generation completes. **Migration Process**: -1. **Failure Detection**: The system detects the stream disconnection through error monitoring. +1. **Failure Detection**: The system detects the connection loss or migratable request error. 2. **State Preservation**: At this point, the request's token sequence contains both the original prompt tokens and all successfully generated tokens from the failed worker. diff --git a/docs/fern/pages/kubernetes/fault-tolerance/graceful-shutdown.md b/docs/fern/pages/kubernetes/fault-tolerance/graceful-shutdown.md index f3d89977e7cd..2bd859e1766a 100644 --- a/docs/fern/pages/kubernetes/fault-tolerance/graceful-shutdown.md +++ b/docs/fern/pages/kubernetes/fault-tolerance/graceful-shutdown.md @@ -7,6 +7,8 @@ subtitle: Let workers finish in-flight requests and release resources cleanly wh When Kubernetes terminates a pod (rollout, scale-down, node drain), Dynamo workers stop accepting new requests, keep serving in-flight ones through a grace period, then release engine and connection resources before exiting. This is **on by default** — every component handles `SIGTERM`/`SIGINT` and drains automatically. The steps below tune *how long* it waits and make sure interrupted requests are recovered. +Once shutdown proceeds past the grace period and any backend-specific draining, workers initiate cancellation of unfinished requests. The Frontend can migrate these requests to a healthy worker when migration is enabled and policy permits it; otherwise the client receives an error. Exhausted retries or an exceeded sequence-length cap can prevent recovery. + The knobs are three timeouts plus enabling migration. The default flow: endpoints unregister from discovery immediately, workers serve for a short grace period, then endpoints drain (bounded by a timeout) before resources are cleaned up. > **How it works:** the signal handlers, the `graceful_shutdown()` sequence, per-backend `cleanup()` code, and error-initiated shutdown are documented in [Graceful Shutdown Architecture](../../developer-guide/knowledge-base/concepts/fault-tolerance/graceful-shutdown-architecture.md). @@ -54,7 +56,7 @@ The defaults are sound for most deployments. Raise the relevant timeout only for -Draining lets *current* requests finish, but a request interrupted by an unexpected worker loss still needs somewhere to go. Enable [request migration](request-migration.md) on the Frontend so disconnected streams are retried on healthy workers. Set `DYN_MIGRATION_LIMIT` in the Frontend `env:` (or `--migration-limit` in its `args:`): +Draining lets *current* requests finish during the grace period set by `DYN_GRACEFUL_SHUTDOWN_GRACE_PERIOD_SECS`, but a request interrupted after the shutdown grace period expires or by an unexpected worker loss still needs somewhere to go. Enable [request migration](request-migration.md) on the Frontend for rolling upgrades and scale-downs as well, so eligible interrupted requests are retried on healthy workers. Set `DYN_MIGRATION_LIMIT` in the Frontend `env:` (or `--migration-limit` in its `args:`): ```yaml - name: Frontend @@ -90,7 +92,7 @@ During Frontend shutdown, `/health` returns 503 so readiness routing stops, whil finish or `DYN_HTTP_GRACEFUL_SHUTDOWN_TIMEOUT_SECS` expires. During worker shutdown, endpoints unregister and stop receiving new work while admitted requests -complete. If a pod receives `SIGKILL` before draining finishes, increase +have time to complete. If a pod receives `SIGKILL` before draining finishes, increase `terminationGracePeriodSeconds` (step 1) or lower the relevant internal timeout (step 2). diff --git a/docs/fern/pages/kubernetes/fault-tolerance/request-migration.md b/docs/fern/pages/kubernetes/fault-tolerance/request-migration.md index cd5063b624e7..1e8bc5db8202 100644 --- a/docs/fern/pages/kubernetes/fault-tolerance/request-migration.md +++ b/docs/fern/pages/kubernetes/fault-tolerance/request-migration.md @@ -2,10 +2,10 @@ # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 title: Request Migration -subtitle: Keep in-flight generations alive across worker failures by retrying them on a healthy worker. +subtitle: Keep in-flight generations alive across worker failures and shutdown interruptions by retrying them on a healthy worker. --- -When a worker fails mid-generation, Dynamo can migrate the in-progress request to a healthy worker and continue from the exact point of failure — no tokens lost or duplicated, and no interruption visible to the client. Migration is configured once on the **Frontend** and applies globally to every model it serves. +When a worker fails mid-generation or its shutdown grace period expires, Dynamo can migrate the in-progress request to a healthy worker and continue from the exact point of failure — no tokens lost or duplicated, and no interruption visible to the client. Migration is configured once on the **Frontend** and applies globally to every model it serves. Migration is **off by default** (`--migration-limit 0`). The steps below turn it on, optionally bound its memory use, and verify it is working. From 72cb224c288a48da7645edc8bb004ffacf5e6275 Mon Sep 17 00:00:00 2001 From: Qi Wang Date: Thu, 17 Sep 2026 21:53:18 -0700 Subject: [PATCH 099/191] feat(vllm-omni): preserve generated video audio (#13707) Signed-off-by: Guan Luo Co-authored-by: Guan Luo --- .../dynamo/common/protocols/video_protocol.py | 6 + .../common/tests/test_video_protocol.py | 16 + .../src/dynamo/vllm/omni/omni_handler.py | 35 +- .../src/dynamo/vllm/omni/output_formatter.py | 798 +++++++++++++++++- .../vllm/tests/omni/test_omni_handler.py | 45 + .../vllm/tests/omni/test_output_formatter.py | 315 ++++++- .../backends/vllm/omni/video_audio.Dockerfile | 69 ++ lib/llm/src/http/service/openai.rs | 16 + lib/llm/src/protocols/openai/videos.rs | 27 + 9 files changed, 1278 insertions(+), 49 deletions(-) create mode 100644 examples/backends/vllm/omni/video_audio.Dockerfile diff --git a/components/src/dynamo/common/protocols/video_protocol.py b/components/src/dynamo/common/protocols/video_protocol.py index 644cea28e161..13d061344d64 100644 --- a/components/src/dynamo/common/protocols/video_protocol.py +++ b/components/src/dynamo/common/protocols/video_protocol.py @@ -108,6 +108,12 @@ class VideoData(BaseModel): b64_json: Optional[str] = None """Base64-encoded video (if response_format is 'b64_json').""" + fps: Optional[int] = None + """Actual video frame rate when reported by the model.""" + + audio_sample_rate: Optional[int] = None + """Muxed audio sample rate when the generated video contains audio.""" + class NvVideosResponse(BaseModel): """Response structure for video generation. diff --git a/components/src/dynamo/common/tests/test_video_protocol.py b/components/src/dynamo/common/tests/test_video_protocol.py index cc537ec657dd..524e5c63eaf8 100644 --- a/components/src/dynamo/common/tests/test_video_protocol.py +++ b/components/src/dynamo/common/tests/test_video_protocol.py @@ -56,3 +56,19 @@ def test_video_response_wire_shape(): "created": 0, "data": [{"output_format": "mp4", "url": "http://example.com/v.mp4"}], } + + +def test_video_response_reports_media_metadata(): + response = VideoData( + output_format="mp4", + url="http://example.com/v.mp4", + fps=24, + audio_sample_rate=32000, + ) + + assert response.model_dump(exclude_none=True) == { + "output_format": "mp4", + "url": "http://example.com/v.mp4", + "fps": 24, + "audio_sample_rate": 32000, + } diff --git a/components/src/dynamo/vllm/omni/omni_handler.py b/components/src/dynamo/vllm/omni/omni_handler.py index b054891c981c..91b866faeee1 100644 --- a/components/src/dynamo/vllm/omni/omni_handler.py +++ b/components/src/dynamo/vllm/omni/omni_handler.py @@ -358,19 +358,14 @@ async def _generate_openai_mode( ) except (ValueError, NotImplementedError, RuntimeError) as e: logger.error(f"Invalid request {request_id}: {e}") - if ( - isinstance(e, ValueError) - and request_type == RequestType.IMAGE_GENERATION + if isinstance(e, ValueError) and request_type in ( + RequestType.IMAGE_GENERATION, + RequestType.VIDEO_GENERATION, ): - # /v1/images/generations folds worker output into - # NvImagesResponse, which has no failure shape, so the - # chat.completion.chunk _error_chunk returns is not a rejection - # the client can read. Re-raise as InvalidArgument instead: it is - # a registered binding exception, so errors.rs takes its message - # via .value(py).str() and the client sees the reason alone. A - # bare ValueError reaches the same 400 through engine.rs's - # fallback, but that path uses PyErr::to_string() and renders as - # "ValueError: ", leaking the Python type to the API. + # Media endpoints cannot interpret the chat.completion.chunk + # returned by _error_chunk as a request rejection. Re-raise as + # the registered binding exception so the HTTP layer returns a + # 400 with the validation reason before generation begins. raise InvalidArgument(str(e)) from e yield self._error_chunk(request_id, str(e), request_type) return @@ -742,6 +737,12 @@ def _engine_inputs_from_video( image: Pre-loaded PIL Image for I2V. When provided, the image is attached to the prompt via ``multi_modal_data`` so vllm-omni's I2V pipeline pre-process can use it. + + Returns: + EngineInputs: Validated inputs for video generation. + + Raises: + ValueError: If the frame rate or output format is unsupported. """ width, height = parse_size(req.size) nvext = req.nvext or VideoNvExt() @@ -753,6 +754,15 @@ def _engine_inputs_from_video( default_fps=DEFAULT_VIDEO_FPS, ) fps = nvext.fps if nvext.fps is not None else DEFAULT_VIDEO_FPS + if fps <= 0: + raise ValueError(f"fps must be greater than zero, got {fps}") + + output_format = req.output_format.lower() if req.output_format else None + if output_format not in (None, "mp4"): + raise ValueError( + f"Unsupported output_format: {req.output_format!r}; " + "only 'mp4' is supported" + ) prompt = OmniTextPrompt(prompt=req.prompt) if nvext.negative_prompt is not None: @@ -799,5 +809,6 @@ def _engine_inputs_from_video( request_type=RequestType.VIDEO_GENERATION, fps=fps, response_format=req.response_format, + output_format=output_format, lora_request=lora_request, ) diff --git a/components/src/dynamo/vllm/omni/output_formatter.py b/components/src/dynamo/vllm/omni/output_formatter.py index abbd5a2b8e7e..94310d5be49c 100644 --- a/components/src/dynamo/vllm/omni/output_formatter.py +++ b/components/src/dynamo/vllm/omni/output_formatter.py @@ -1,11 +1,46 @@ # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -"""Modality-specific output formatters for vLLM-Omni. +"""Convert vLLM-Omni stage outputs into Dynamo protocol responses. + +``OutputFormatter`` is the caller entry point. Construct it once for a model and +pass each engine stage to ``await format(...)``. It dispatches on +``stage_output.final_output_type`` using this stage contract: + +* ``"text"`` reads ``request_output`` and the optional ``previous_text`` context. +* ``"image"`` or ``"video"`` reads ``images``. Supply ``request_type`` to + distinguish image, video, and chat-completion responses because a video + diffusion stage may be labelled ``"image"``. +* ``"audio"`` reads ``multimodal_output``. Video stages may also use that mapping + for video, audio, frame-rate, and sample-rate data. + +A typical one-stage call is:: + + formatter = OutputFormatter(model_name, media_fs, media_http_url) + response = await formatter.format( + stage_output, + request_id, + request_type=request_type, + response_format="b64_json", + ) + +The common context keys are ``response_format``, ``output_format``, ``fps``, +``speed``, and the audio state objects. URL responses require a writable +``media_fs``; ``media_http_url`` optionally rewrites the returned public URL. + +Audio state belongs to one request. For streaming, pass the same +``AudioStreamState`` to every stage as ``audio_stream_state``. For one final +non-streaming response, pass one ``AudioAggregateState`` as +``audio_aggregate_state`` to every stage, then call ``await finish_audio(...)`` +with that state after the engine finishes. -Extracted from OmniHandler and AudioGenerationHandler so that any consumer -(aggregated handler, disaggregated router, test harness) can format engine -output without creating an engine or loading model weights. +Formatters return serialized response mappings, or ``None`` when a stage has no +response to emit. Invalid request options may raise ``ValueError``; +media-processing failures are normally represented by a modality response with +``status="failed"``. + +The formatters are independent of engine construction and model loading, so +aggregated handlers, disaggregated routers, and tests can share them. """ import asyncio @@ -14,6 +49,7 @@ import struct import time import uuid +from collections.abc import Mapping from dataclasses import dataclass, field from io import BytesIO from typing import Any, Dict, Optional @@ -22,6 +58,11 @@ import soundfile as sf import torch +try: + from vllm_omni.diffusion.utils.media_utils import mux_video_audio_bytes +except (ImportError, OSError): + mux_video_audio_bytes = None # type: ignore[assignment] + from dynamo.common.protocols.audio_protocol import AudioData, NvAudioSpeechResponse from dynamo.common.protocols.image_protocol import ImageData, NvImagesResponse from dynamo.common.protocols.video_protocol import NvVideosResponse, VideoData @@ -38,6 +79,8 @@ logger = logging.getLogger(__name__) +DEFAULT_AUDIO_SAMPLE_RATE = 24000 + @dataclass class AudioStreamState: @@ -74,6 +117,14 @@ class TextFormatter: """Formats LLM text output as OpenAI chat completion chunks.""" def __init__(self, model_name: str) -> None: + """Initialize a text formatter. + + Args: + model_name: Model identifier included in response chunks. + + Returns: + None. + """ self._model_name = model_name def format( @@ -83,6 +134,19 @@ def format( *, previous_text: str = "", ) -> Dict[str, Any] | None: + """Format the next text delta as a chat-completion chunk. + + Args: + request_output: vLLM request output containing generated choices. + request_id: Identifier included in the response chunk. + previous_text: Text already emitted for this request. + + Returns: + Dict[str, Any] | None: Formatted chunk or an engine-output error chunk. + + Raises: + AttributeError: If the request output lacks required choice fields. + """ if not request_output.outputs: return _error_chunk(request_id, self._model_name, "No outputs from engine") @@ -127,6 +191,17 @@ def __init__( media_http_url: Optional[str], default_fps: int = 16, ) -> None: + """Initialize a diffusion formatter. + + Args: + model_name: Model identifier included in responses. + media_fs: Storage backend used for URL responses. + media_http_url: Public base URL for stored media. + default_fps: Frame rate used when output metadata omits one. + + Returns: + None. + """ self._model_name = model_name self._media_fs = media_fs self._media_http_url = media_http_url @@ -135,20 +210,35 @@ def __init__( async def format( self, stage_output: Any, request_id: str, *, request_type: Any, **ctx: Any ) -> Dict[str, Any] | None: + """Format a diffusion stage output as an image or video response. + + Args: + stage_output: vLLM-Omni stage output containing generated media. + request_id: Identifier included in the response. + request_type: Request kind used to distinguish image and video output. + **ctx: Response format, output format, and frame-rate overrides. + + Returns: + Dict[str, Any] | None: Formatted response, or ``None`` for empty images. + + Raises: + ValueError: If an image or video response option is unsupported. + """ images = ( stage_output.images if hasattr(stage_output, "images") else stage_output ) - if is_empty_payload(images): - return None if request_type == RequestType.VIDEO_GENERATION: return await self._encode_video( images, request_id, + multimodal_output=self._extract_multimodal_output(stage_output), fps=ctx.get("fps", self._default_fps), response_format=ctx.get("response_format"), output_format=ctx.get("output_format"), ) + if is_empty_payload(images): + return None return await self._encode_image( images, request_id, @@ -158,12 +248,30 @@ async def format( async def _encode_video( self, - images: list, + images: Any, request_id: str, fps: int, + multimodal_output: dict[str, Any] | None = None, response_format: Optional[str] = None, output_format: Optional[str] = None, ) -> Dict[str, Any] | None: + """Encode generated frames and optional audio as video responses. + + Args: + images: Primary generated video-frame payload. + request_id: Identifier included in the response and storage path. + fps: Positive fallback frame rate when metadata does not provide one. + multimodal_output: Optional video, audio, and encoding metadata. + response_format: ``"url"`` or ``"b64_json"`` output representation. + output_format: Video container format; currently only ``"mp4"``. + + Returns: + Dict[str, Any] | None: Completed response, or a failed response for + invalid media metadata, mismatched durations, or encoding errors. + + Raises: + ValueError: If the response or output format is unsupported. + """ output_format = output_format or "mp4" response_format = response_format or "url" if response_format not in ("url", "b64_json"): @@ -176,30 +284,87 @@ async def _encode_video( ) try: start_time = time.time() - # Encode with the in-tree VP9 (libvpx-vp9) encoder rather - # than diffusers.export_to_video, whose imageio backend defaults to the - # H.264 codec that the codec-compliant image no longer ships (it would - # fail with "No valid H.264 encoder was found"). encode_to_video_bytes - # is the same shared helper the TRT-LLM video handler uses; VP9-in-mp4 - # is valid and decodes with our VP8/VP9 allowlist. - frames_np = frames_to_numpy(normalize_video_frames(images)) - video_bytes = await asyncio.to_thread( - encode_to_video_bytes, frames_np, fps=fps, output_format=output_format + multimodal_output = multimodal_output or {} + videos = self._split_video_outputs(images, multimodal_output) + if not videos: + raise ValueError("No video outputs found in generation result") + resolved_fps = self._resolve_int_metadata(multimodal_output, "fps", "video") + if resolved_fps is None: + resolved_fps = self._coerce_positive_int(fps) + if resolved_fps is None: + raise ValueError(f"Video fps must be greater than zero, got {fps!r}") + audio_sample_rate = self._resolve_audio_sample_rate(multimodal_output) + audio_outputs = self._split_audio_outputs( + multimodal_output.get("audio"), len(videos) ) - if response_format == "b64_json": + data = [] + for index, (video, audio) in enumerate( + zip(videos, audio_outputs, strict=True) + ): + frames_np = self._video_to_numpy_frames(video) + if audio is None: + # The codec-compliant standard image retains its existing + # royalty-free VP9 path for silent video models. + video_bytes = await asyncio.to_thread( + encode_to_video_bytes, + frames_np, + fps=resolved_fps, + output_format=output_format, + ) + else: + if mux_video_audio_bytes is None: + raise RuntimeError( + "Generated audio requires PyAV with H.264 and AAC encoders; " + "use the video-audio codec overlay" + ) + audio_np = self._audio_to_numpy(audio) + if audio_np.ndim in (1, 2): + # Match the muxer's channel-first/channel-last normalization. + audio_sample_count = max(audio_np.shape) + video_duration_s = frames_np.shape[0] / resolved_fps + audio_duration_s = audio_sample_count / audio_sample_rate + duration_tolerance_s = ( + 1.0 / resolved_fps + 1.0 / audio_sample_rate + ) + if ( + abs(video_duration_s - audio_duration_s) + > duration_tolerance_s + ): + raise ValueError( + "Audio/video duration mismatch: " + f"video={video_duration_s:.3f}s, " + f"audio={audio_duration_s:.3f}s, " + f"tolerance={duration_tolerance_s:.3f}s" + ) + video_bytes = await asyncio.to_thread( + mux_video_audio_bytes, + frames_np, + audio_np, + fps=float(resolved_fps), + audio_sample_rate=audio_sample_rate, + ) + video_data = VideoData( output_format=output_format, - b64_json=base64.b64encode(video_bytes).decode("utf-8"), - ) - else: - video_url = await upload_to_fs( - self._media_fs, - f"videos/{request_id}.{output_format}", - video_bytes, - self._media_http_url, + fps=resolved_fps, + audio_sample_rate=audio_sample_rate if audio is not None else None, ) - video_data = VideoData(output_format=output_format, url=video_url) + if response_format == "b64_json": + video_data.b64_json = base64.b64encode(video_bytes).decode("utf-8") + else: + filename = ( + f"videos/{request_id}.{output_format}" + if len(videos) == 1 + else f"videos/{request_id}/{index}.{output_format}" + ) + video_data.url = await upload_to_fs( + self._media_fs, + filename, + video_bytes, + self._media_http_url, + ) + data.append(video_data) return NvVideosResponse( id=request_id, @@ -208,7 +373,7 @@ async def _encode_video( status="completed", progress=100, created=int(time.time()), - data=[video_data], + data=data, inference_time_s=time.time() - start_time, ).model_dump() except Exception as e: @@ -224,6 +389,302 @@ async def _encode_video( error=str(e), ).model_dump() + @staticmethod + def _extract_multimodal_output(stage_output: Any) -> dict[str, Any]: + """Extract multimodal metadata from a stage output. + + Args: + stage_output: vLLM-Omni stage result or compatibility wrapper. + + Returns: + dict[str, Any]: A shallow metadata copy, or an empty dictionary. + """ + multimodal_output = getattr(stage_output, "multimodal_output", None) + if isinstance(multimodal_output, Mapping): + return dict(multimodal_output) + + request_output = getattr(stage_output, "request_output", None) + if isinstance(request_output, dict): + multimodal_output = request_output.get("multimodal_output") + if multimodal_output is None: + multimodal_output = request_output.get("_multimodal_output") + elif request_output is not None: + multimodal_output = getattr(request_output, "multimodal_output", None) + if multimodal_output is None: + multimodal_output = getattr(request_output, "_multimodal_output", None) + return dict(multimodal_output) if isinstance(multimodal_output, Mapping) else {} + + @staticmethod + def _split_video_outputs( + images: Any, multimodal_output: dict[str, Any] + ) -> list[Any]: + """Separate a batched diffusion payload into individual videos. + + Args: + images: Primary video-frame payload from the stage output. + multimodal_output: Metadata that may contain a fallback video payload. + + Returns: + list[Any]: Individual video payloads, or an empty list when absent. + + Raises: + ValueError: If a list mixes incompatible batched video payloads. + """ + videos = images + if is_empty_payload(videos): + videos = multimodal_output.get("video") + if videos is None: + return [] + if isinstance(videos, (np.ndarray, torch.Tensor)): + if videos.ndim == 5: + return [videos[index] for index in range(videos.shape[0])] + return [videos] + if isinstance(videos, (list, tuple)): + videos = list(videos) + if not videos: + return [] + first = videos[0] + if isinstance(first, (np.ndarray, torch.Tensor)) and first.ndim == 5: + flattened: list[Any] = [] + for batch in videos: + if ( + not isinstance(batch, (np.ndarray, torch.Tensor)) + or batch.ndim != 5 + ): + raise ValueError("Video output batches must all be 5-D") + flattened.extend(batch[index] for index in range(batch.shape[0])) + return flattened + if isinstance(first, (np.ndarray, torch.Tensor)) and first.ndim == 4: + return videos + if isinstance(first, list): + return videos + return [videos] + return [videos] + + @staticmethod + def _video_to_numpy_frames(video: Any) -> np.ndarray: + """Normalize one video to uint8 ``(frames, height, width, channels)``. + + Args: + video: Video tensor, array, or sequence of image frames. + + Returns: + np.ndarray: Contiguous FHWC frames with uint8 RGB values. + + Raises: + ValueError: If frames are empty, inconsistent, or use an unsupported layout. + """ + if isinstance(video, torch.Tensor): + video = video.detach().float().cpu().numpy() + + if isinstance(video, np.ndarray): + if video.ndim == 3: + video = video[None, ...] + if video.ndim != 4: + raise ValueError( + f"Expected a 4-D video tensor, got shape {video.shape}" + ) + if video.shape[-1] in (1, 3, 4): + frames = video + else: + is_cfhw = video.shape[0] in (1, 3, 4) + is_fchw = video.shape[1] in (1, 3, 4) + if is_cfhw and is_fchw: + raise ValueError( + "Ambiguous channel-first video tensor; expected an " + "unambiguous CFHW or FCHW shape, " + f"got {video.shape}" + ) + if is_cfhw: + frames = video.transpose(1, 2, 3, 0) + elif is_fchw: + frames = video.transpose(0, 2, 3, 1) + else: + raise ValueError( + "Video tensor must use CFHW, FCHW, or FHWC channel layout, " + f"got shape {video.shape}" + ) + if frames.shape[-1] == 1: + frames = np.repeat(frames, 3, axis=-1) + elif frames.shape[-1] == 4: + frames = frames[..., :3] + if np.issubdtype(frames.dtype, np.floating) and frames.min(initial=0.0) < 0: + frames = (frames + 1.0) / 2.0 + return frames_to_numpy(list(np.ascontiguousarray(frames))) + + frames = normalize_video_frames(video if isinstance(video, list) else [video]) + normalized = [] + for frame in frames: + if isinstance(frame, torch.Tensor): + frame = frame.detach().float().cpu().numpy() + if isinstance(frame, np.ndarray) and frame.ndim == 3: + if frame.shape[-1] in (1, 3, 4): + pass + elif frame.shape[0] in (1, 3, 4): + frame = frame.transpose(1, 2, 0) + else: + raise ValueError( + "Video frame must use CHW or HWC channel layout, " + f"got shape {frame.shape}" + ) + if frame.shape[-1] == 1: + frame = np.repeat(frame, 3, axis=-1) + elif frame.shape[-1] == 4: + frame = frame[..., :3] + if ( + np.issubdtype(frame.dtype, np.floating) + and frame.min(initial=0.0) < 0 + ): + frame = (frame + 1.0) / 2.0 + normalized.append(frame) + return frames_to_numpy(normalized) + + @staticmethod + def _split_audio_outputs(audio: Any, expected_count: int) -> list[Any | None]: + """Align generated audio payloads with their corresponding videos. + + Args: + audio: Batched or per-video audio payload. + expected_count: Number of video outputs requiring audio entries. + + Returns: + list[Any | None]: One audio payload or ``None`` for each video. + + Raises: + ValueError: If the audio payload count does not match the video count. + """ + if audio is None: + return [None] * expected_count + if isinstance(audio, (np.ndarray, torch.Tensor)): + if audio.ndim >= 3: + if audio.shape[0] != expected_count: + raise ValueError( + f"Expected {expected_count} audio output(s) for " + f"{expected_count} videos" + ) + return [audio[index] for index in range(expected_count)] + if expected_count == 1: + return [audio] + if isinstance(audio, (list, tuple)): + if len(audio) == expected_count: + return list(audio) + if expected_count == 1: + return [audio] + raise ValueError( + f"Expected {expected_count} audio output(s) for {expected_count} videos" + ) + + @staticmethod + def _audio_to_numpy(audio: Any) -> np.ndarray: + """Convert an audio payload to a float32 NumPy array. + + Args: + audio: Tensor, array, or array-like audio samples. + + Returns: + np.ndarray: Audio samples represented as float32 values. + + Raises: + TypeError: If the payload cannot be interpreted as an array. + ValueError: If the payload cannot be converted to float32 values. + """ + if isinstance(audio, torch.Tensor): + return audio.detach().float().cpu().numpy() + if isinstance(audio, np.ndarray): + return audio.astype(np.float32, copy=False) + return np.asarray(audio, dtype=np.float32) + + @staticmethod + def _resolve_int_metadata( + multimodal_output: dict[str, Any], + key: str, + metadata_section: str, + metadata_key: str | None = None, + ) -> int | None: + """Resolve positive numeric metadata rounded to the nearest integer. + + Args: + multimodal_output: Multimodal payload containing optional metadata. + key: Top-level metadata key to inspect first. + metadata_section: Nested section under the ``metadata`` field. + metadata_key: Nested key, defaulting to the top-level key. + + Returns: + int | None: Positive resolved value, or ``None`` when absent or invalid. + + Raises: + RuntimeError: If tensor metadata contains more than one value. + OverflowError: If a non-finite numeric value cannot be converted. + """ + value = multimodal_output.get(key) + if value is None: + metadata = multimodal_output.get("metadata") + if isinstance(metadata, Mapping): + section = metadata.get(metadata_section) + if isinstance(section, Mapping): + value = section.get(metadata_key or key) + if value is None: + return None + return DiffusionFormatter._coerce_positive_int(value) + + def _resolve_audio_sample_rate(self, multimodal_output: dict[str, Any]) -> int: + """Resolve an audio sample rate from known metadata aliases. + + Args: + multimodal_output: Multimodal payload containing audio metadata. + + Returns: + int: Positive sample rate, or the default when none is valid. + + Raises: + RuntimeError: If tensor metadata contains more than one value. + OverflowError: If a non-finite numeric value cannot be converted. + """ + for key in ("audio_sample_rate", "sample_rate", "sampling_rate", "sr"): + sample_rate = self._coerce_positive_int(multimodal_output.get(key)) + if sample_rate is not None: + return sample_rate + + metadata = multimodal_output.get("metadata") + audio_metadata = ( + metadata.get("audio") if isinstance(metadata, Mapping) else None + ) + if isinstance(audio_metadata, Mapping): + for key in ( + "audio_sample_rate", + "sample_rate", + "sampling_rate", + "sr", + ): + sample_rate = self._coerce_positive_int(audio_metadata.get(key)) + if sample_rate is not None: + return sample_rate + + return DEFAULT_AUDIO_SAMPLE_RATE + + @staticmethod + def _coerce_positive_int(value: Any) -> int | None: + """Round a scalar value to a positive integer when possible. + + Args: + value: Scalar-like value to convert. + + Returns: + int | None: Positive integer value, or ``None`` when invalid. + + Raises: + RuntimeError: If a tensor contains more than one value. + OverflowError: If a non-finite numeric value cannot be converted. + """ + if value is None: + return None + try: + scalar = value.item() if hasattr(value, "item") else value + resolved = round(float(scalar)) + except (TypeError, ValueError): + return None + return resolved if resolved > 0 else None + async def _encode_image( self, images: list, @@ -232,6 +693,21 @@ async def _encode_image( request_type: Any, response_format: Optional[str] = None, ) -> Dict[str, Any] | None: + """Encode generated images for chat or image-generation responses. + + Args: + images: Generated image objects to encode. + request_id: Identifier included in the response and storage path. + request_type: Request kind selecting the response schema. + response_format: ``"url"`` or ``"b64_json"`` output representation. + + Returns: + Dict[str, Any] | None: Formatted response or ``None`` for other request kinds. + + Raises: + ValueError: If the response format is unsupported. + OSError: If an image cannot be encoded or uploaded. + """ if is_empty_payload(images): return _error_chunk(request_id, self._model_name, "No images generated") @@ -281,6 +757,20 @@ async def _encode_image( async def _prepare_images( self, images: list, request_id: str, response_format: Optional[str] = None ) -> list: + """Serialize images as data URLs or upload-backed URLs. + + Args: + images: Generated image objects supporting PNG serialization. + request_id: Identifier used to construct storage paths. + response_format: ``"url"`` or ``"b64_json"`` output representation. + + Returns: + list: Encoded data URLs or uploaded media URLs. + + Raises: + ValueError: If the response format is unsupported. + OSError: If an image cannot be encoded or uploaded. + """ outlist = [] for img in images: buf = BytesIO() @@ -309,6 +799,16 @@ class AudioFormatter: def __init__( self, model_name: str, media_fs: Any, media_http_url: Optional[str] ) -> None: + """Initialize an audio formatter. + + Args: + model_name: Model identifier included in responses. + media_fs: Storage backend used for URL responses. + media_http_url: Public base URL for stored media. + + Returns: + None. + """ self._model_name = model_name self._media_fs = media_fs self._media_http_url = media_http_url @@ -317,6 +817,16 @@ def __init__( async def format( self, stage_output: Any, request_id: str, **ctx: Any ) -> Dict[str, Any] | None: + """Format complete, streaming, or aggregate audio output. + + Args: + stage_output: Stage output or multimodal audio mapping. + request_id: Identifier included in the response and storage path. + **ctx: Encoding, response, speed, and stream-state options. + + Returns: + Dict[str, Any] | None: Audio response, failure response, or no streaming chunk. + """ stream_state = ctx.get("audio_stream_state") aggregate_state = ctx.get("audio_aggregate_state") mm_output = ( @@ -412,7 +922,19 @@ async def format( async def finish_aggregate( self, request_id: str, aggregate_state: AudioAggregateState, **ctx: Any ) -> Dict[str, Any]: - """Encode all buffered raw chunks as one complete audio file.""" + """Encode all buffered raw chunks as one complete audio file. + + Args: + request_id: Identifier included in the response and storage path. + aggregate_state: Buffered audio chunks and their shared metadata. + **ctx: Encoding, response, and speed options. + + Returns: + Dict[str, Any]: Completed or failed audio response. + + Raises: + ValueError: If buffered chunks cannot be concatenated. + """ if not aggregate_state.chunks or aggregate_state.sample_rate is None: return self._error_response(request_id, "No audio generated") @@ -432,6 +954,19 @@ def _append_audio_chunk( audio_np: np.ndarray, sample_rate: int, ) -> None: + """Normalize and append one chunk to aggregate audio state. + + Args: + state: Aggregate state receiving the normalized chunk. + audio_np: Raw mono or stereo audio samples. + sample_rate: Chunk sample rate in hertz. + + Returns: + None. + + Raises: + ValueError: If the chunk shape or metadata conflicts with prior chunks. + """ audio_np, num_channels, channel_axis = self._channel_first_audio( audio_np, expected_channels=state.num_channels, @@ -455,6 +990,20 @@ def _validate_audio_metadata( num_channels: int, channel_axis: int | None, ) -> None: + """Validate and record stable audio-stream metadata. + + Args: + state: Streaming or aggregate state to validate and update. + sample_rate: Current chunk sample rate in hertz. + num_channels: Current chunk channel count. + channel_axis: Original channel axis, or ``None`` for mono samples. + + Returns: + None. + + Raises: + ValueError: If sample rate, channel count, or layout changes. + """ if state.sample_rate is not None and state.sample_rate != sample_rate: raise ValueError( f"Audio sample rate changed from {state.sample_rate} to {sample_rate}" @@ -478,6 +1027,20 @@ def _extract_audio_tensor( *, chunk_state: AudioStreamState | AudioAggregateState | None = None, ) -> tuple[np.ndarray, int]: + """Extract new float32 audio samples and their sample rate. + + Args: + mm_output: Multimodal mapping containing audio and sample-rate data. + chunk_state: State used to skip chunks emitted previously. + + Returns: + tuple[np.ndarray, int]: Audio samples and sample rate in hertz. + + Raises: + ValueError: If audio data or sample-rate metadata is invalid. + RuntimeError: If listed tensors cannot be concatenated. + TypeError: If audio samples cannot be converted to a NumPy array. + """ audio_key = "audio" if "audio" in mm_output else "model_outputs" audio_val = mm_output.get(audio_key) if audio_val is None: @@ -512,6 +1075,19 @@ def _extract_audio_tensor( @staticmethod def _sample_rate(mm_output: Dict[str, Any]) -> int: + """Resolve the latest sample rate from multimodal output. + + Args: + mm_output: Multimodal mapping containing optional ``sr`` metadata. + + Returns: + int: Resolved sample rate, defaulting to 24000 Hz. + + Raises: + TypeError: If sample-rate metadata is not integer-compatible. + ValueError: If sample-rate metadata cannot be converted to an integer. + RuntimeError: If tensor metadata contains more than one value. + """ sr_raw = mm_output.get("sr", 24000) if isinstance(sr_raw, list): sr_raw = sr_raw[-1] if sr_raw else 24000 @@ -524,6 +1100,21 @@ def _encode_audio_chunk( fmt: str, stream_state: AudioStreamState, ) -> tuple[bytes, str]: + """Encode one incremental audio chunk as PCM or streaming WAV. + + Args: + audio_np: Raw mono or stereo audio samples. + sample_rate: Chunk sample rate in hertz. + fmt: Requested streaming format, ``"wav"`` or raw PCM. + stream_state: State tracking established stream metadata. + + Returns: + tuple[bytes, str]: Encoded bytes and their media type. + + Raises: + ValueError: If audio layout or metadata is invalid or changes. + sf.LibsndfileError: If PCM encoding fails. + """ audio_np, num_channels, channel_axis = self._normalize_audio_layout( audio_np, expected_channels=stream_state.num_channels, @@ -550,6 +1141,18 @@ def _channel_first_audio( An established channel axis determines the layout, including for square chunks. Otherwise, channel count can disambiguate the axes. Shapes that remain ambiguous follow vLLM-Omni's channel-first contract. + + Args: + audio_np: Audio samples in mono, batched, or two-dimensional layout. + expected_channels: Channel count established by earlier chunks. + expected_channel_axis: Channel axis established by earlier chunks. + + Returns: + tuple[np.ndarray, int, int | None]: Channel-first samples, channel + count, and the original channel axis. + + Raises: + ValueError: If the shape is unsupported or conflicts with prior layout. """ if audio_np.ndim == 3: if audio_np.shape[0] != 1: @@ -620,7 +1223,20 @@ def _normalize_audio_layout( expected_channels: int | None = None, expected_channel_axis: int | None = None, ) -> tuple[np.ndarray, int, int | None]: - """Convert supported audio layouts to soundfile's frame-major layout.""" + """Convert supported audio layouts to soundfile's frame-major layout. + + Args: + audio_np: Raw mono or stereo audio samples. + expected_channels: Channel count established by earlier chunks. + expected_channel_axis: Channel axis established by earlier chunks. + + Returns: + tuple[np.ndarray, int, int | None]: Frame-major samples, channel + count, and the original channel axis. + + Raises: + ValueError: If the shape is unsupported or conflicts with prior layout. + """ audio_np, num_channels, channel_axis = cls._channel_first_audio( audio_np, expected_channels=expected_channels, @@ -634,7 +1250,19 @@ def _normalize_audio_layout( def _wav_stream_header( sample_rate: int, num_channels: int = 1, bits_per_sample: int = 16 ) -> bytes: - """Build a PCM WAV header whose payload length is not known yet.""" + """Build a PCM WAV header whose payload length is not known yet. + + Args: + sample_rate: Audio sample rate in hertz. + num_channels: Number of interleaved audio channels. + bits_per_sample: PCM bit depth for each sample. + + Returns: + bytes: WAV header with placeholder RIFF and data lengths. + + Raises: + struct.error: If a numeric field does not fit the WAV header layout. + """ byte_rate = sample_rate * num_channels * bits_per_sample // 8 block_align = num_channels * bits_per_sample // 8 placeholder_size = 0xFFFFFFFF @@ -659,6 +1287,21 @@ def _wav_stream_header( def _encode_audio( self, audio_np: Any, sample_rate: int, fmt: str = "wav", speed: float = 1.0 ) -> tuple[bytes, str]: + """Normalize, optionally retime, and encode complete audio. + + Args: + audio_np: Raw mono or stereo audio samples. + sample_rate: Audio sample rate in hertz. + fmt: Requested output format. + speed: Playback-speed multiplier applied when librosa is available. + + Returns: + tuple[bytes, str]: Encoded audio bytes and their media type. + + Raises: + ValueError: If the audio layout or speed is invalid. + sf.LibsndfileError: If audio encoding fails. + """ audio_np, _, _ = self._channel_first_audio(audio_np) if speed != 1.0: try: @@ -676,6 +1319,20 @@ def _encode_audio( def _write_audio( audio_np: np.ndarray, sample_rate: int, fmt: str ) -> tuple[bytes, str]: + """Encode frame-major audio with soundfile. + + Args: + audio_np: Frame-major mono or stereo samples. + sample_rate: Audio sample rate in hertz. + fmt: Requested output format; unsupported values fall back to WAV. + + Returns: + tuple[bytes, str]: Encoded audio bytes and their media type. + + Raises: + sf.LibsndfileError: If the selected codec cannot encode the audio. + TypeError: If samples or format parameters are incompatible. + """ fmt = (fmt or "wav").lower() format_map = { "wav": ("WAV", "audio/wav", {}), @@ -697,6 +1354,15 @@ def _write_audio( return buf.getvalue(), media_type def _error_response(self, request_id: str, error: str) -> Dict[str, Any]: + """Build a failed audio-speech response. + + Args: + request_id: Identifier included in the response. + error: User-facing error description. + + Returns: + Dict[str, Any]: Serialized failed audio response. + """ return NvAudioSpeechResponse( id=request_id, model=self._model_name, @@ -709,7 +1375,16 @@ def _error_response(self, request_id: str, error: str) -> Dict[str, Any]: def _error_chunk( request_id: str, model_name: str, error_message: str ) -> Dict[str, Any]: - """Error response in OpenAI chat.completion.chunk format.""" + """Build an OpenAI chat-completion error chunk. + + Args: + request_id: Identifier included in the response chunk. + model_name: Model identifier included in the response chunk. + error_message: User-facing error description. + + Returns: + Dict[str, Any]: Serialized chat-completion error chunk. + """ return { "id": request_id, "created": int(time.time()), @@ -726,7 +1401,19 @@ def _error_chunk( def _build_completion_usage(request_output: Any) -> Dict[str, Any]: - """Build completion usage stats from a vLLM RequestOutput.""" + """Build token-usage statistics from a vLLM request output. + + Args: + request_output: Request output containing prompt and completion token IDs. + + Returns: + Dict[str, Any]: Prompt, completion, total, and cached-token statistics. + + Raises: + AttributeError: If required output token fields are missing. + IndexError: If the request output contains no choices. + TypeError: If token identifiers do not provide a length. + """ prompt_token_ids = getattr(request_output, "prompt_token_ids", None) prompt_tokens = ( len(prompt_token_ids) @@ -760,11 +1447,24 @@ def __init__( media_http_url: Optional[str] = None, default_fps: int = 16, ) -> None: + """Initialize modality-specific output formatters. + + Args: + model_name: Model identifier included in responses. + media_fs: Storage backend used for URL responses. + media_http_url: Public base URL for stored media. + default_fps: Frame rate used when video metadata omits one. + + Returns: + None. + """ + diffusion_formatter = DiffusionFormatter( + model_name, media_fs, media_http_url, default_fps + ) self._formatters: Dict[str, Any] = { "text": TextFormatter(model_name), - "image": DiffusionFormatter( - model_name, media_fs, media_http_url, default_fps - ), + "image": diffusion_formatter, + "video": diffusion_formatter, "audio": AudioFormatter(model_name, media_fs, media_http_url), } @@ -776,6 +1476,21 @@ async def format( request_type: Any = None, **ctx: Any, ) -> Dict[str, Any] | None: + """Dispatch a stage output to its modality formatter. + + Args: + stage_output: vLLM-Omni output carrying ``final_output_type``. + request_id: Identifier included in the formatted response. + request_type: Request kind used by diffusion formatting. + **ctx: Modality-specific formatting and stream-state options. + + Returns: + Dict[str, Any] | None: Formatted response or ``None`` when unsupported. + + Raises: + ValueError: If modality-specific formatting options are invalid. + AttributeError: If a text output lacks required generation fields. + """ fmt_type = getattr(stage_output, "final_output_type", None) formatter = self._formatters.get(fmt_type) if fmt_type else None if formatter is None: @@ -800,6 +1515,19 @@ async def finish_audio( aggregate_state: AudioAggregateState, **ctx: Any, ) -> Dict[str, Any]: + """Finalize buffered audio through the audio formatter. + + Args: + request_id: Identifier included in the formatted response. + aggregate_state: Buffered audio chunks and their shared metadata. + **ctx: Audio encoding, response, and speed options. + + Returns: + Dict[str, Any]: Completed or failed audio response. + + Raises: + ValueError: If buffered chunks cannot be concatenated. + """ return await self._formatters["audio"].finish_aggregate( request_id, aggregate_state, **ctx ) diff --git a/components/src/dynamo/vllm/tests/omni/test_omni_handler.py b/components/src/dynamo/vllm/tests/omni/test_omni_handler.py index 555cc36c2d8f..50314c896605 100644 --- a/components/src/dynamo/vllm/tests/omni/test_omni_handler.py +++ b/components/src/dynamo/vllm/tests/omni/test_omni_handler.py @@ -225,6 +225,30 @@ async def test_video_and_i2v_forward_response_format(self, response_format): ) assert i2v.response_format == response_format + @pytest.mark.asyncio + @pytest.mark.parametrize("fps", [0, -1]) + async def test_video_generation_rejects_non_positive_fps(self, fps): + handler = _make_handler() + req = NvCreateVideoRequest( + prompt="a drone", + model="test-model", + nvext=VideoNvExt(num_frames=24, fps=fps), + ) + + with pytest.raises(ValueError, match="fps must be greater than zero"): + await handler.build_engine_inputs(req, RequestType.VIDEO_GENERATION) + + @pytest.mark.asyncio + async def test_video_generation_normalizes_mp4_output_format(self): + handler = _make_handler() + req = NvCreateVideoRequest( + prompt="a drone", model="test-model", output_format="MP4" + ) + + inputs = await handler.build_engine_inputs(req, RequestType.VIDEO_GENERATION) + + assert inputs.output_format == "mp4" + @pytest.mark.asyncio async def test_audio_generation_delegates_toaudio(self): """Audio request delegates to audio.""" @@ -1077,6 +1101,27 @@ async def test_rejection_propagates_instead_of_yielding_a_chat_chunk(self): ) +class TestVideoEndpointValidation: + """Video requests reject invalid controls before generation.""" + + @pytest.mark.asyncio + async def test_video_rejection_propagates_before_generation(self): + handler = _make_handler() + handler.config.output_modalities = ["video"] + handler.engine_client.generate = MagicMock( + side_effect=AssertionError("engine must not run for a rejected request") + ) + request = { + "prompt": "a drone", + "model": "test-model", + "output_format": "webm", + } + + with pytest.raises(InvalidArgument, match="only 'mp4' is supported"): + async for _ in handler._generate_openai_mode(request, None, "req-1"): + pass + + # --------------------------------------------------------------------------- # AudioGenerationHandler — data_source / response_format field mapping # --------------------------------------------------------------------------- diff --git a/components/src/dynamo/vllm/tests/omni/test_output_formatter.py b/components/src/dynamo/vllm/tests/omni/test_output_formatter.py index 104017174df2..b52639da6fc4 100644 --- a/components/src/dynamo/vllm/tests/omni/test_output_formatter.py +++ b/components/src/dynamo/vllm/tests/omni/test_output_formatter.py @@ -220,7 +220,7 @@ async def test_empty_images_returns_error(self): class TestDiffusionFormatterVideo: @pytest.mark.asyncio - async def test_empty_frames_returns_none(self): + async def test_empty_frames_returns_video_error(self): from dynamo.common.utils.output_modalities import RequestType f = _make_diffusion_formatter() @@ -229,7 +229,9 @@ async def test_empty_frames_returns_none(self): result = await f.format( stage, "req-1", request_type=RequestType.VIDEO_GENERATION ) - assert result is None + assert result["object"] == "video" + assert result["status"] == "failed" + assert "No video outputs" in result["error"] @pytest.mark.asyncio async def test_error_returns_failed_status(self): @@ -244,6 +246,315 @@ async def test_error_returns_failed_status(self): assert chunk["status"] == "failed" assert "boom" in chunk["error"] + @pytest.mark.asyncio + async def test_muxes_video_audio_and_reports_metadata(self): + from dynamo.common.utils.output_modalities import RequestType + + f = _make_diffusion_formatter() + stage = SimpleNamespace( + images=[np.zeros((2, 4, 4, 3), dtype=np.float32)], + multimodal_output={ + "audio": np.zeros((1, 2, 2667), dtype=np.float32), + "fps": 24, + "audio_sample_rate": 32000, + }, + ) + with patch( + "dynamo.vllm.omni.output_formatter.mux_video_audio_bytes", + return_value=b"muxed-mp4", + ) as mux: + result = await f.format( + stage, + "req-video-audio", + request_type=RequestType.VIDEO_GENERATION, + response_format="b64_json", + ) + + assert result["status"] == "completed" + assert result["data"][0]["fps"] == 24 + assert result["data"][0]["audio_sample_rate"] == 32000 + assert result["data"][0]["b64_json"] is not None + assert mux.call_count == 1 + assert mux.call_args.args[1].shape == (2, 2667) + assert mux.call_args.kwargs["fps"] == 24.0 + assert mux.call_args.kwargs["audio_sample_rate"] == 32000 + + @pytest.mark.asyncio + @pytest.mark.parametrize( + ("sample_rate_key", "sample_rate"), + [("sample_rate", 22050), ("sampling_rate", 44100), ("sr", 16000)], + ) + async def test_uses_audio_sample_rate_aliases(self, sample_rate_key, sample_rate): + from dynamo.common.utils.output_modalities import RequestType + + f = _make_diffusion_formatter() + stage = SimpleNamespace( + images=[np.zeros((2, 4, 4, 3), dtype=np.float32)], + multimodal_output={ + "audio": np.zeros( + (1, 2, round(sample_rate * 2 / 16)), dtype=np.float32 + ), + sample_rate_key: sample_rate, + }, + ) + with patch( + "dynamo.vllm.omni.output_formatter.mux_video_audio_bytes", + return_value=b"muxed-mp4", + ) as mux: + result = await f.format( + stage, + "req-video-audio", + request_type=RequestType.VIDEO_GENERATION, + response_format="b64_json", + ) + + assert result["data"][0]["audio_sample_rate"] == sample_rate + assert mux.call_args.kwargs["audio_sample_rate"] == sample_rate + + @pytest.mark.asyncio + async def test_uses_default_audio_sample_rate_when_metadata_is_absent(self): + audio = {"audio": np.zeros((1, 2, 2000), dtype=np.float32)} + video = [np.zeros((2, 4, 4, 3), dtype=np.float32)] + + with patch( + "dynamo.vllm.omni.output_formatter.mux_video_audio_bytes", + return_value=b"muxed-mp4", + ) as mux: + result = await _make_diffusion_formatter()._encode_video( + video, + "req-fallback-rate", + fps=24, + multimodal_output=audio, + response_format="b64_json", + ) + + assert result["data"][0]["audio_sample_rate"] == 24000 + assert mux.call_args.kwargs["audio_sample_rate"] == 24000 + + @pytest.mark.asyncio + async def test_returns_every_generated_video(self): + from dynamo.common.utils.output_modalities import RequestType + + f = _make_diffusion_formatter() + videos = [np.zeros((2, 4, 4, 3), dtype=np.float32) for _ in range(2)] + stage = SimpleNamespace( + images=videos, + multimodal_output={ + "audio": np.zeros((2, 2, 2667), dtype=np.float32), + "metadata": { + "video": {"fps": 24}, + "audio": {"sample_rate": 32000}, + }, + }, + ) + with patch( + "dynamo.vllm.omni.output_formatter.mux_video_audio_bytes", + return_value=b"muxed-mp4", + ) as mux: + result = await f.format( + stage, + "req-video-audio", + request_type=RequestType.VIDEO_GENERATION, + response_format="b64_json", + ) + + assert len(result["data"]) == 2 + assert mux.call_count == 2 + + @pytest.mark.asyncio + async def test_rejects_mismatched_audio_video_duration_before_mux(self): + video = [np.zeros((48, 4, 4, 3), dtype=np.float32)] + audio = { + "audio": np.zeros((1, 2, 16000), dtype=np.float32), + "fps": 24, + "audio_sample_rate": 32000, + } + + with patch("dynamo.vllm.omni.output_formatter.mux_video_audio_bytes") as mux: + result = await _make_diffusion_formatter()._encode_video( + video, + "req-duration-mismatch", + fps=24, + multimodal_output=audio, + response_format="b64_json", + ) + + assert result["status"] == "failed" + assert "Audio/video duration mismatch" in result["error"] + mux.assert_not_called() + + @pytest.mark.asyncio + async def test_rejects_non_positive_fallback_fps_before_encoding(self): + with patch("dynamo.vllm.omni.output_formatter.encode_to_video_bytes") as encode: + result = await _make_diffusion_formatter()._encode_video( + [np.zeros((2, 4, 4, 3), dtype=np.float32)], + "req-invalid-fps", + fps=0, + response_format="b64_json", + ) + + assert result["status"] == "failed" + assert "fps must be greater than zero" in result["error"] + encode.assert_not_called() + + @pytest.mark.asyncio + async def test_silent_video_keeps_vp9_encoder(self): + f = _make_diffusion_formatter() + with ( + patch( + "dynamo.vllm.omni.output_formatter.encode_to_video_bytes", + return_value=b"vp9-mp4", + ) as vp9, + patch("dynamo.vllm.omni.output_formatter.mux_video_audio_bytes") as mux, + ): + result = await f._encode_video( + [np.zeros((4, 4, 3), dtype=np.float32)], + "req-silent", + fps=16, + response_format="b64_json", + ) + + assert result["status"] == "completed" + assert result["data"][0]["audio_sample_rate"] is None + vp9.assert_called_once() + mux.assert_not_called() + + @pytest.mark.asyncio + async def test_unsupported_output_format_is_rejected(self): + f = _make_diffusion_formatter() + with pytest.raises(ValueError, match="only 'mp4' is supported"): + await f._encode_video( + [np.zeros((4, 4, 3), dtype=np.float32)], + "req-output-hint", + fps=16, + response_format="b64_json", + output_format="webm", + ) + + @pytest.mark.asyncio + async def test_normalizes_direct_fchw_torch_video(self): + f = _make_diffusion_formatter() + video = torch.zeros((2, 3, 8, 10), dtype=torch.float32) + + with patch( + "dynamo.vllm.omni.output_formatter.encode_to_video_bytes", + return_value=b"vp9-mp4", + ) as encode: + result = await f._encode_video( + video, + "req-tensor", + fps=16, + response_format="b64_json", + ) + + assert result["status"] == "completed" + frames = encode.call_args.args[0] + assert frames.shape == (2, 8, 10, 3) + assert frames.dtype == np.uint8 + + @pytest.mark.asyncio + async def test_splits_direct_bfchw_torch_videos(self): + f = _make_diffusion_formatter() + videos = torch.zeros((2, 2, 3, 8, 10), dtype=torch.float32) + + with patch( + "dynamo.vllm.omni.output_formatter.encode_to_video_bytes", + return_value=b"vp9-mp4", + ) as encode: + result = await f._encode_video( + videos, + "req-tensor-batch", + fps=16, + response_format="b64_json", + ) + + assert result["status"] == "completed" + assert len(result["data"]) == 2 + assert encode.call_count == 2 + assert all( + call.args[0].shape == (2, 8, 10, 3) for call in encode.call_args_list + ) + + @pytest.mark.asyncio + async def test_splits_list_wrapped_bfhwc_numpy_videos(self): + f = _make_diffusion_formatter() + videos = [np.zeros((2, 2, 8, 10, 3), dtype=np.float32)] + + with patch( + "dynamo.vllm.omni.output_formatter.encode_to_video_bytes", + return_value=b"vp9-mp4", + ) as encode: + result = await f._encode_video( + videos, + "req-numpy-batch", + fps=16, + response_format="b64_json", + ) + + assert result["status"] == "completed" + assert len(result["data"]) == 2 + assert encode.call_count == 2 + + @pytest.mark.asyncio + @pytest.mark.parametrize("as_tensor", [False, True]) + @pytest.mark.parametrize("num_frames", [2, 8]) + async def test_normalizes_cfhw_negative_one_to_one_video( + self, as_tensor, num_frames + ): + f = _make_diffusion_formatter() + video = np.linspace(-1.0, 1.0, num=3 * num_frames * 16 * 16, dtype=np.float32) + video = video.reshape(3, num_frames, 16, 16) + if as_tensor: + video = torch.from_numpy(video) + + with patch( + "dynamo.vllm.omni.output_formatter.encode_to_video_bytes", + return_value=b"vp9-mp4", + ) as encode: + result = await f._encode_video( + video, + "req-cfhw", + fps=16, + response_format="b64_json", + ) + + assert result["status"] == "completed" + frames = encode.call_args.args[0] + assert frames.shape == (num_frames, 16, 16, 3) + assert frames.dtype == np.uint8 + assert frames.min() == 0 + assert frames.max() == 255 + + @pytest.mark.parametrize("shape", [(4, 3, 8, 10), (3, 4, 8, 10)]) + def test_rejects_ambiguous_channel_first_video(self, shape): + with pytest.raises(ValueError, match="Ambiguous channel-first"): + DiffusionFormatter._video_to_numpy_frames(np.zeros(shape, dtype=np.float32)) + + @pytest.mark.parametrize( + "audio", + [ + np.zeros(128, dtype=np.float32), + torch.zeros(1, 2, 128), + [np.zeros(128, dtype=np.float32)] * 3, + tuple(np.zeros(128, dtype=np.float32) for _ in range(3)), + ], + ) + def test_rejects_mismatched_audio_batch(self, audio): + with pytest.raises(ValueError, match="Expected 2 audio output"): + DiffusionFormatter._split_audio_outputs(audio, expected_count=2) + + def test_rejects_batched_audio_for_one_video(self): + with pytest.raises(ValueError, match="Expected 1 audio output"): + DiffusionFormatter._split_audio_outputs( + np.zeros((2, 2, 128), dtype=np.float32), expected_count=1 + ) + + def test_rounds_fractional_positive_fps_metadata(self): + assert ( + DiffusionFormatter._resolve_int_metadata({"fps": 23.976}, "fps", "video") + == 24 + ) + class TestBuildCompletionUsage: def test_basic(self): diff --git a/examples/backends/vllm/omni/video_audio.Dockerfile b/examples/backends/vllm/omni/video_audio.Dockerfile new file mode 100644 index 000000000000..fc42641e8dfc --- /dev/null +++ b/examples/backends/vllm/omni/video_audio.Dockerfile @@ -0,0 +1,69 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Opt-in development and qualification overlay for vLLM-Omni models that +# generate joint video and audio. The standard Dynamo image intentionally +# remains on its royalty-free VP9-only media stack. +ARG BASE_IMAGE=dynamo:latest-vllm-runtime +FROM ${BASE_IMAGE} + +USER root + +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + ffmpeg \ + && ln -sf /usr/bin/ffmpeg /usr/local/bin/ffmpeg \ + && ln -sf /usr/bin/ffprobe /usr/local/bin/ffprobe \ + && rm -rf /var/lib/apt/lists/* + +RUN uv pip install \ + --system \ + --no-deps \ + av==18.0.0 \ + && python3 -c \ + 'import av; av.codec.Codec("h264", "w"); av.codec.Codec("aac", "w")' + +RUN python3 <<'PY' +import io + +import av +import numpy as np +from vllm_omni.diffusion.utils.media_utils import mux_video_audio_bytes + +fps = 24 +sample_rate = 32000 +frames = np.zeros((4, 16, 16, 3), dtype=np.uint8) +waveform = np.zeros( + (2, round(sample_rate * len(frames) / fps)), dtype=np.float32 +) +payload = mux_video_audio_bytes( + frames, + waveform, + fps=fps, + audio_sample_rate=sample_rate, +) +with av.open(io.BytesIO(payload), mode="r") as container: + video = container.streams.video[0] + audio = container.streams.audio[0] + assert video.codec_context.name == "h264" + assert int(video.average_rate) == fps + assert audio.codec_context.name == "aac" + assert audio.codec_context.sample_rate == sample_rate + video_duration = float(video.duration * video.time_base) + audio_duration = float(audio.duration * audio.time_base) + assert abs(video_duration - audio_duration) <= 1 / fps +PY + +USER dynamo diff --git a/lib/llm/src/http/service/openai.rs b/lib/llm/src/http/service/openai.rs index 770cafd595f0..d7e7fb2955ef 100644 --- a/lib/llm/src/http/service/openai.rs +++ b/lib/llm/src/http/service/openai.rs @@ -7179,6 +7179,22 @@ mod tests { assert_eq!(response.0, StatusCode::SERVICE_UNAVAILABLE); } + #[test] + fn test_video_fold_preserves_backend_invalid_argument() { + use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; + + let error = DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::InvalidArgument)) + .message("unsupported video control") + .build(); + let response = + non_streaming_aggregation_error_response(error, "Failed to fold videos stream"); + + assert_eq!(response.0, StatusCode::BAD_REQUEST); + assert_eq!(response.1.code, StatusCode::BAD_REQUEST.as_u16()); + assert_eq!(response.1.message, "Invalid request"); + } + #[test] fn test_cancelled_error_response_from_anyhow() { use dynamo_runtime::error::{DynamoError, ErrorType}; diff --git a/lib/llm/src/protocols/openai/videos.rs b/lib/llm/src/protocols/openai/videos.rs index 9b325286048c..c04b928dd655 100644 --- a/lib/llm/src/protocols/openai/videos.rs +++ b/lib/llm/src/protocols/openai/videos.rs @@ -91,6 +91,14 @@ pub struct VideoData { /// Base64-encoded video (if response_format is "b64_json") #[serde(skip_serializing_if = "Option::is_none")] pub b64_json: Option, + + /// Actual video frame rate when reported by the model + #[serde(skip_serializing_if = "Option::is_none")] + pub fps: Option, + + /// Muxed audio sample rate when the generated video contains audio + #[serde(skip_serializing_if = "Option::is_none")] + pub audio_sample_rate: Option, } /// Response structure for video generation @@ -345,6 +353,8 @@ mod tests { output_format: "mp4".into(), url: None, b64_json: Some("abc==".into()), + fps: None, + audio_sample_rate: None, }; let json = serde_json::to_string(&d).unwrap(); assert!(!json.contains("url")); @@ -357,6 +367,8 @@ mod tests { output_format: "webm".into(), url: Some("http://x/v.webm".into()), b64_json: None, + fps: None, + audio_sample_rate: None, }; let json = serde_json::to_string(&d).unwrap(); let d2: VideoData = serde_json::from_str(&json).unwrap(); @@ -364,4 +376,19 @@ mod tests { assert_eq!(d2.url.as_deref(), Some("http://x/v.webm")); assert!(d2.b64_json.is_none()); } + + #[test] + fn video_data_round_trip_with_media_metadata() { + let d = VideoData { + output_format: "mp4".into(), + url: Some("http://x/v.mp4".into()), + b64_json: None, + fps: Some(24), + audio_sample_rate: Some(32000), + }; + let json = serde_json::to_string(&d).unwrap(); + let d2: VideoData = serde_json::from_str(&json).unwrap(); + assert_eq!(d2.fps, Some(24)); + assert_eq!(d2.audio_sample_rate, Some(32000)); + } } From 01ac8006c892254736f874314a1242800597a362 Mon Sep 17 00:00:00 2001 From: Qi Wang Date: Thu, 17 Sep 2026 21:53:18 -0700 Subject: [PATCH 100/191] feat(vllm-omni): pass model-specific video parameters (#13708) Signed-off-by: Guan Luo Co-authored-by: Guan Luo --- .../dynamo/common/tests/test_video_utils.py | 14 ++ .../src/dynamo/common/utils/video_utils.py | 4 +- components/src/dynamo/vllm/omni/args.py | 41 ++++ .../src/dynamo/vllm/omni/base_handler.py | 37 +++- .../src/dynamo/vllm/omni/omni_handler.py | 141 +++++++++++--- .../dynamo/vllm/tests/omni/test_omni_args.py | 25 +++ .../vllm/tests/omni/test_omni_base_handler.py | 70 ++++++- .../vllm/tests/omni/test_omni_handler.py | 184 ++++++++++++++++++ container/context.yaml | 2 + 9 files changed, 481 insertions(+), 37 deletions(-) diff --git a/components/src/dynamo/common/tests/test_video_utils.py b/components/src/dynamo/common/tests/test_video_utils.py index 7371965c6f8c..e60783677e80 100644 --- a/components/src/dynamo/common/tests/test_video_utils.py +++ b/components/src/dynamo/common/tests/test_video_utils.py @@ -20,6 +20,20 @@ def make_frames(n=3, h=8, w=8) -> np.ndarray: return np.zeros((n, h, w, 3), dtype=np.uint8) +# --------------------------------------------------------------------------- +# compute_num_frames +# --------------------------------------------------------------------------- + + +def test_compute_num_frames_rounds_fractional_frame_rate(): + from dynamo.common.utils.video_utils import compute_num_frames + + result = compute_num_frames(seconds=10, fps=23.976) + + assert result == 240 + assert isinstance(result, int) + + # --------------------------------------------------------------------------- # encode_to_video_bytes # --------------------------------------------------------------------------- diff --git a/components/src/dynamo/common/utils/video_utils.py b/components/src/dynamo/common/utils/video_utils.py index c7cc59f1be0c..0f0cb1d5a141 100644 --- a/components/src/dynamo/common/utils/video_utils.py +++ b/components/src/dynamo/common/utils/video_utils.py @@ -45,7 +45,7 @@ def parse_size( def compute_num_frames( num_frames: int | None = None, seconds: int | None = None, - fps: int | None = None, + fps: float | None = None, default_fps: int = DEFAULT_VIDEO_FPS, default_num_frames: int = DEFAULT_VIDEO_NUM_FRAMES, ) -> int: @@ -58,7 +58,7 @@ def compute_num_frames( if seconds is not None or fps is not None: _seconds = seconds if seconds is not None else 4 _fps = fps if fps is not None else default_fps - return _seconds * _fps + return round(_seconds * _fps) return default_num_frames diff --git a/components/src/dynamo/vllm/omni/args.py b/components/src/dynamo/vllm/omni/args.py index 12b9c404f1ea..b4ac027becef 100644 --- a/components/src/dynamo/vllm/omni/args.py +++ b/components/src/dynamo/vllm/omni/args.py @@ -56,6 +56,9 @@ class OmniDiffusionKwargs: cache_config: Optional[str] = None enable_cache_dit_summary: bool = False enable_cpu_offload: bool = False + task_type: Optional[str] = None + lora_path: Optional[list[str]] = None + diffusion_attention_backend: Optional[str] = None enforce_eager: bool = False @@ -69,6 +72,7 @@ class OmniParallelKwargs: """ ulysses_degree: int = 1 + ulysses_a2a_permute: bool = False ring_degree: int = 1 allgather_degree: int = 1 cfg_parallel_size: int = 1 @@ -191,6 +195,32 @@ def add_arguments(self, parser) -> None: default=False, help="Enable CPU offloading for diffusion models to reduce GPU memory usage.", ) + add_argument( + g, + flag_name="--task-type", + env_var="DYN_OMNI_TASK_TYPE", + default=None, + help="Model-defined task or checkpoint partition selected at startup.", + ) + add_argument( + g, + flag_name="--lora-path", + env_var="DYN_OMNI_LORA_PATH", + default=None, + nargs="+", + env_value_type=list, + help=( + "Diffusion checkpoint adapter path(s) fused by vLLM-Omni at " + "startup. This is separate from request-time LoRA loading." + ), + ) + add_argument( + g, + flag_name="--diffusion-attention-backend", + env_var="DYN_OMNI_DIFFUSION_ATTENTION_BACKEND", + default=None, + help="vLLM-Omni diffusion attention backend.", + ) add_negatable_bool_argument( g, flag_name="--enforce-eager", @@ -254,6 +284,17 @@ def add_arguments(self, parser) -> None: arg_type=int, help="Number of GPUs used for Ulysses sequence parallelism in diffusion.", ) + add_negatable_bool_argument( + g, + flag_name="--ulysses-a2a-permute", + env_var="DYN_OMNI_ULYSSES_A2A_PERMUTE", + default=False, + help=( + "Use vLLM-Omni's fused permute-free all-to-all for eligible " + "Ulysses exchanges. Requires --ulysses-degree > 1; enabling " + "it JIT-compiles a CUDA kernel at worker start." + ), + ) add_argument( g, flag_name="--ring-degree", diff --git a/components/src/dynamo/vllm/omni/base_handler.py b/components/src/dynamo/vllm/omni/base_handler.py index 2136d4991175..fb98f17f2bd3 100644 --- a/components/src/dynamo/vllm/omni/base_handler.py +++ b/components/src/dynamo/vllm/omni/base_handler.py @@ -146,6 +146,41 @@ def _build_omni_kwargs(self, config) -> Dict[str, Any]: # source in engine_args while forwarding them to Omni's diffusion # topology explicitly. if DiffusionParallelConfig is not None: + # Compatibility workaround for the XPU image's vLLM-Omni 0.27 pin + # in container/context.yaml. Remove this filtering when that pin is + # bumped to a version supporting every OmniParallelKwargs field. + parallel_kwargs = dataclasses.asdict(config.parallel) + supported_parallel_fields = { + field.name for field in dataclasses.fields(DiffusionParallelConfig) + } + unsupported_parallel_fields = sorted( + set(parallel_kwargs) - supported_parallel_fields + ) + if unsupported_parallel_fields: + default_parallel_kwargs = dataclasses.asdict(type(config.parallel)()) + unsupported_non_defaults = [ + field + for field in unsupported_parallel_fields + if parallel_kwargs[field] != default_parallel_kwargs[field] + ] + if unsupported_non_defaults: + options = ", ".join(unsupported_non_defaults) + raise ValueError( + "Installed vLLM-Omni does not support non-default " + f"parallel option(s): {options}. Upgrade vLLM-Omni or " + "remove the unsupported option(s)." + ) + logger.debug( + "Ignoring parallel options unavailable in the installed " + "vLLM-Omni: %s", + ", ".join(unsupported_parallel_fields), + ) + parallel_kwargs = { + field: value + for field, value in parallel_kwargs.items() + if field in supported_parallel_fields + } + parallel_config = DiffusionParallelConfig( tensor_parallel_size=getattr( config.engine_args, "tensor_parallel_size", 1 @@ -154,7 +189,7 @@ def _build_omni_kwargs(self, config) -> Dict[str, Any]: config.engine_args, "pipeline_parallel_size", 1 ), data_parallel_size=getattr(config.engine_args, "data_parallel_size", 1), - **dataclasses.asdict(config.parallel), + **parallel_kwargs, ) omni_kwargs["parallel_config"] = parallel_config else: diff --git a/components/src/dynamo/vllm/omni/omni_handler.py b/components/src/dynamo/vllm/omni/omni_handler.py index 91b866faeee1..a5f502c53360 100644 --- a/components/src/dynamo/vllm/omni/omni_handler.py +++ b/components/src/dynamo/vllm/omni/omni_handler.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 import asyncio +import copy import functools import logging import os @@ -35,7 +36,11 @@ get_output_modalities, parse_request_type, ) -from dynamo.common.utils.video_utils import compute_num_frames, parse_size +from dynamo.common.utils.video_utils import ( + DEFAULT_VIDEO_NUM_FRAMES, + compute_num_frames, + parse_size, +) from dynamo.llm import ( ModelInput, ModelRuntimeConfig, @@ -683,6 +688,95 @@ def _build_sampling_params_list( ) return result if result else [diffusion_sp] + def _build_video_sampling_params_list( + self, req: NvCreateVideoRequest, nvext: VideoNvExt + ) -> tuple[list, OmniDiffusionSamplingParams]: + """Clone per-stage model defaults and apply explicit video overrides.""" + defaults = list(self.engine_client.default_sampling_params_list or []) + if not defaults: + defaults = [OmniDiffusionSamplingParams()] + stage_types = ["diffusion"] + else: + stage_types = [ + getattr( + self.engine_client.engine.get_stage_metadata(i), + "stage_type", + "llm", + ) + for i in range(len(defaults)) + ] + + result = [] + output_sp = None + for default, stage_type in zip(defaults, stage_types, strict=True): + if stage_type != "diffusion": + result.append( + default.clone() if hasattr(default, "clone") else SamplingParams() + ) + continue + + sp = ( + copy.deepcopy(default) + if isinstance(default, OmniDiffusionSamplingParams) + else OmniDiffusionSamplingParams() + ) + self._apply_video_sampling_overrides(sp, req, nvext) + result.append(sp) + output_sp = sp + + if output_sp is None: + raise ValueError("Video generation requires a diffusion stage") + return result, output_sp + + def _apply_video_sampling_overrides( + self, + sp: OmniDiffusionSamplingParams, + req: NvCreateVideoRequest, + nvext: VideoNvExt, + ) -> None: + """Overlay only fields explicitly supplied by a video request.""" + if nvext.num_frames is not None and nvext.num_frames <= 0: + raise ValueError("nvext.num_frames must be greater than zero") + if nvext.fps is not None and nvext.fps <= 0: + raise ValueError("nvext.fps must be greater than zero") + if req.seconds is not None and req.seconds <= 0: + raise ValueError("seconds must be greater than zero") + + if req.size is not None: + width, height = parse_size(req.size) + sp.width = width + sp.height = height + + if nvext.num_frames is not None: + sp.num_frames = nvext.num_frames + elif req.seconds is not None: + frame_rate = ( + float(nvext.fps) if nvext.fps is not None else sp.resolved_frame_rate + ) + sp.num_frames = compute_num_frames( + seconds=req.seconds, + fps=frame_rate, + default_fps=int( + getattr(self.config, "default_video_fps", DEFAULT_VIDEO_FPS) + ), + ) + elif sp.num_frames == 1: + # vllm-omni uses 1 as the image-model sentinel. It is not a usable + # video default for pipelines that consume num_frames verbatim. + sp.num_frames = DEFAULT_VIDEO_NUM_FRAMES + + if nvext.fps is not None: + sp.fps = nvext.fps + if hasattr(sp, "frame_rate"): + sp.frame_rate = float(nvext.fps) + + self._update_if_not_none(sp, "num_inference_steps", nvext.num_inference_steps) + self._update_if_not_none(sp, "guidance_scale", nvext.guidance_scale) + self._update_if_not_none(sp, "seed", nvext.seed) + self._update_if_not_none(sp, "boundary_ratio", nvext.boundary_ratio) + self._update_if_not_none(sp, "guidance_scale_2", nvext.guidance_scale_2) + _apply_media_passthrough(sp, req.extra_args) + def _engine_inputs_from_image(self, req: NvCreateImageRequest) -> EngineInputs: """Build engine inputs from an NvCreateImageRequest.""" # req.size is a free-form client string, so it needs the same bound the @@ -744,19 +838,8 @@ def _engine_inputs_from_video( Raises: ValueError: If the frame rate or output format is unsupported. """ - width, height = parse_size(req.size) nvext = req.nvext or VideoNvExt() - num_frames = compute_num_frames( - num_frames=nvext.num_frames, - seconds=req.seconds, - fps=nvext.fps, - default_fps=DEFAULT_VIDEO_FPS, - ) - fps = nvext.fps if nvext.fps is not None else DEFAULT_VIDEO_FPS - if fps <= 0: - raise ValueError(f"fps must be greater than zero, got {fps}") - output_format = req.output_format.lower() if req.output_format else None if output_format not in (None, "mp4"): raise ValueError( @@ -776,38 +859,32 @@ def _engine_inputs_from_video( image.size[1], ) - sp = OmniDiffusionSamplingParams( - height=height, - width=width, - num_frames=num_frames, - ) - self._update_if_not_none(sp, "num_inference_steps", nvext.num_inference_steps) - self._update_if_not_none(sp, "guidance_scale", nvext.guidance_scale) - sp.seed = ( - nvext.seed if nvext.seed is not None else random.randint(0, 2**32 - 1) + sampling_params_list, output_sp = self._build_video_sampling_params_list( + req, nvext ) - self._update_if_not_none(sp, "boundary_ratio", nvext.boundary_ratio) - self._update_if_not_none(sp, "guidance_scale_2", nvext.guidance_scale_2) - self._update_if_not_none(sp, "fps", fps) - _apply_media_passthrough(sp, req.extra_args) - - sampling_params_list = self._build_sampling_params_list(sp) lora_request = self._resolve_and_apply_lora(req.model, sampling_params_list) + model_fps = output_sp.resolved_frame_rate + output_fps = round( + model_fps + if model_fps is not None + else getattr(self.config, "default_video_fps", DEFAULT_VIDEO_FPS) + ) + logger.info( "Video diffusion request: prompt='%s...', size=%sx%s, frames=%s, fps=%s", req.prompt[:50], - width, - height, - num_frames, - fps, + getattr(output_sp, "width", None), + getattr(output_sp, "height", None), + getattr(output_sp, "num_frames", None), + model_fps, ) return EngineInputs( prompt=prompt, sampling_params_list=sampling_params_list, request_type=RequestType.VIDEO_GENERATION, - fps=fps, + fps=output_fps, response_format=req.response_format, output_format=output_format, lora_request=lora_request, diff --git a/components/src/dynamo/vllm/tests/omni/test_omni_args.py b/components/src/dynamo/vllm/tests/omni/test_omni_args.py index 39d5bf7a38f3..346aa9dba1a2 100644 --- a/components/src/dynamo/vllm/tests/omni/test_omni_args.py +++ b/components/src/dynamo/vllm/tests/omni/test_omni_args.py @@ -3,6 +3,7 @@ """Unit tests for OmniConfig validation and omni argument parsing.""" +import argparse import contextlib import dataclasses import logging @@ -19,6 +20,7 @@ from dynamo.vllm import main as vllm_main from dynamo.vllm.omni.args import ( FlexibleArgumentParser, + OmniArgGroup, OmniConfig, OmniDiffusionKwargs, OmniEngineArgs, @@ -105,6 +107,29 @@ def test_omni_config_valid_defaults(): config.validate() +def test_startup_lora_paths_parse_as_diffusion_options(): + parser = argparse.ArgumentParser() + OmniArgGroup().add_arguments(parser) + + args = parser.parse_args( + ["--lora-path", "/models/fast-a.safetensors", "/models/fast-b.safetensors"] + ) + + assert args.lora_path == [ + "/models/fast-a.safetensors", + "/models/fast-b.safetensors", + ] + + +def test_ulysses_a2a_permute_parses_as_parallel_option(): + parser = argparse.ArgumentParser() + OmniArgGroup().add_arguments(parser) + + args = parser.parse_args(["--ulysses-a2a-permute"]) + + assert args.ulysses_a2a_permute is True + + @pytest.mark.parametrize("fps", [0, -1, -100]) def test_omni_config_invalid_video_fps(fps): config = _make_omni_config(default_video_fps=fps) diff --git a/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py b/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py index 5dce871e7e52..b0732867f9bb 100644 --- a/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py +++ b/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py @@ -31,7 +31,6 @@ "sequence_parallel_size", "enable_expert_parallel", "ulysses_mode", - "ulysses_a2a_permute", "mask_sp_padding", } @@ -75,6 +74,16 @@ def _build_kwargs(config, stage_type="diffusion"): return handler._build_omni_kwargs(config) +def _parallel_config_without(*excluded_fields): + """Model an older upstream config that lacks newer Dynamo options.""" + fields = [ + (field.name, field.type, dataclasses.field(default=None)) + for field in dataclasses.fields(DiffusionParallelConfig) + if field.name not in excluded_fields + ] + return dataclasses.make_dataclass("LegacyDiffusionParallelConfig", fields) + + class TestDiffusionParallelConfigCoverage: def test_all_diffusion_parallel_config_fields_covered(self): """Every DiffusionParallelConfig field must be in OmniParallelKwargs, engine_args, or _SKIP_FIELDS. @@ -83,6 +92,11 @@ def test_all_diffusion_parallel_config_fields_covered(self): Fix by adding it to OmniParallelKwargs and OmniArgGroup, or to _SKIP_FIELDS """ parallel_kwarg_fields = {f.name for f in dataclasses.fields(OmniParallelKwargs)} + stale_skips = _SKIP_FIELDS & parallel_kwarg_fields + if stale_skips: + pytest.fail( + f"Exposed parallel fields still marked as skipped: {sorted(stale_skips)}" + ) uncovered = [ f for f in _diffusion_parallel_fields() @@ -97,7 +111,13 @@ def test_all_diffusion_parallel_config_fields_covered(self): def test_parallel_fields_forwarded_from_separate_configs(self): """Construct the real vLLM-Omni config from both argument groups.""" - config = _make_config(text_encoder_tp_size=2) + parallel_overrides = {"text_encoder_tp_size": 2} + supports_ulysses_a2a_permute = ( + "ulysses_a2a_permute" in _diffusion_parallel_fields() + ) + if supports_ulysses_a2a_permute: + parallel_overrides["ulysses_a2a_permute"] = True + config = _make_config(**parallel_overrides) config.engine_args.tensor_parallel_size = 4 config.engine_args.pipeline_parallel_size = 3 config.engine_args.data_parallel_size = 5 @@ -108,6 +128,37 @@ def test_parallel_fields_forwarded_from_separate_configs(self): assert parallel_config.pipeline_parallel_size == 3 assert parallel_config.data_parallel_size == 5 assert parallel_config.text_encoder_tp_size == 2 + if supports_ulysses_a2a_permute: + assert parallel_config.ulysses_a2a_permute is True + + def test_unsupported_default_parallel_field_is_omitted(self): + """Older Omni releases accept configs when new options keep their defaults.""" + legacy_config = _parallel_config_without("ulysses_a2a_permute") + + with patch( + "dynamo.vllm.omni.base_handler.DiffusionParallelConfig", legacy_config + ): + parallel_config = _build_kwargs(_make_config())["parallel_config"] + + assert parallel_config.text_encoder_tp_size == 1 + assert not hasattr(parallel_config, "ulysses_a2a_permute") + + def test_unsupported_non_default_parallel_field_is_rejected(self): + """Do not silently ignore options unavailable in the installed Omni.""" + legacy_config = _parallel_config_without("ulysses_a2a_permute") + config = _make_config(ulysses_a2a_permute=True) + + with patch( + "dynamo.vllm.omni.base_handler.DiffusionParallelConfig", legacy_config + ): + with pytest.raises( + ValueError, + match=( + "Installed vLLM-Omni does not support non-default parallel " + "option.*ulysses_a2a_permute" + ), + ): + _build_kwargs(config) def test_output_modalities_forwarded_to_async_omni(self): config = _make_config() @@ -140,6 +191,21 @@ def test_diffusion_kwargs_preserved_when_stage_detection_is_deferred(self): assert kwargs["enable_cpu_offload"] is True assert kwargs["vae_use_tiling"] is True + def test_model_defined_diffusion_fields_forwarded_to_async_omni(self): + config = _make_config() + config.diffusion = dataclasses.replace( + OmniDiffusionKwargs(), + task_type="t2va", + lora_path=["/models/fasth3/adapter_model.safetensors"], + diffusion_attention_backend="TRTLLM_ATTN", + ) + + kwargs = _build_kwargs(config) + + assert kwargs["task_type"] == "t2va" + assert kwargs["lora_path"] == ["/models/fasth3/adapter_model.safetensors"] + assert kwargs["diffusion_attention_backend"] == "TRTLLM_ATTN" + def test_lora_disabled_resolves_no_capacity(self): config = _make_config() handler = BaseOmniHandler.__new__(BaseOmniHandler) diff --git a/components/src/dynamo/vllm/tests/omni/test_omni_handler.py b/components/src/dynamo/vllm/tests/omni/test_omni_handler.py index 50314c896605..a27ce447902d 100644 --- a/components/src/dynamo/vllm/tests/omni/test_omni_handler.py +++ b/components/src/dynamo/vllm/tests/omni/test_omni_handler.py @@ -52,6 +52,7 @@ def _make_handler(stage_types=("diffusion",)): config.model = "test-model" config.served_model_name = None config.output_modalities = ["text"] + config.default_video_fps = 16 config.enable_lora = False # Disable LoRA for tests unless explicitly set config.engine_args = SimpleNamespace(enable_lora=False) handler.config = config @@ -530,6 +531,189 @@ async def test_i2v_nvext_params_on_sampling_params(self): assert sp.guidance_scale_2 == 1.0 assert sp.num_inference_steps == 40 + @pytest.mark.asyncio + async def test_video_preserves_each_stage_default_and_merges_passthrough(self): + handler = _make_handler(stage_types=("diffusion", "diffusion")) + ( + first_default, + second_default, + ) = handler.engine_client.default_sampling_params_list + first_default.num_frames = 209 + first_default.seed = 7 + first_default.extra_args = {"stage": "first", "flow_shift": 11.0} + second_default.num_frames = 243 + second_default.seed = 8 + second_default.extra_args = {"stage": "second", "flow_shift": 10.0} + req = NvCreateVideoRequest( + prompt="cat playing piano", + model="video-model", + nvext=VideoNvExt(num_inference_steps=50), + extra_args={ + "media_passthrough": { + "task": "t2va", + "duration": 10.0, + "flow_shift": 12.0, + "audio_flow_shift": 3.0, + } + }, + ) + + result = await handler.build_engine_inputs(req, RequestType.VIDEO_GENERATION) + first, second = result.sampling_params_list + + assert (first.num_frames, first.seed) == (209, 7) + assert (second.num_frames, second.seed) == (243, 8) + assert first.extra_args == { + "stage": "first", + "flow_shift": 12.0, + "task": "t2va", + "duration": 10.0, + "audio_flow_shift": 3.0, + } + assert second.extra_args == { + "stage": "second", + "flow_shift": 12.0, + "task": "t2va", + "duration": 10.0, + "audio_flow_shift": 3.0, + } + assert first_default.extra_args == {"stage": "first", "flow_shift": 11.0} + assert second_default.extra_args == {"stage": "second", "flow_shift": 10.0} + + @pytest.mark.asyncio + async def test_video_passthrough_does_not_leak_between_requests(self): + handler = _make_handler() + first = NvCreateVideoRequest( + prompt="first", + model="video-model", + extra_args={"media_passthrough": {"task": "t2va"}}, + ) + second = NvCreateVideoRequest(prompt="second", model="video-model") + + first_inputs = await handler.build_engine_inputs( + first, RequestType.VIDEO_GENERATION + ) + second_inputs = await handler.build_engine_inputs( + second, RequestType.VIDEO_GENERATION + ) + + assert first_inputs.sampling_params_list[0].extra_args == {"task": "t2va"} + assert second_inputs.sampling_params_list[0].extra_args == {} + + @pytest.mark.asyncio + async def test_video_fps_only_preserves_model_num_frames(self): + handler = _make_handler() + model_defaults = handler.engine_client.default_sampling_params_list[0] + model_defaults.num_frames = 33 + req = NvCreateVideoRequest( + prompt="cat", model="video-model", nvext=VideoNvExt(fps=8) + ) + + result = await handler.build_engine_inputs(req, RequestType.VIDEO_GENERATION) + sp = result.sampling_params_list[0] + + assert sp.num_frames == 33 + assert sp.fps == 8 + assert sp.frame_rate == 8.0 + + @pytest.mark.asyncio + async def test_explicit_video_fields_override_model_defaults(self): + handler = _make_handler() + model_defaults = handler.engine_client.default_sampling_params_list[0] + model_defaults.width = 1024 + model_defaults.height = 576 + model_defaults.num_frames = 209 + model_defaults.fps = None + model_defaults.seed = 7 + req = NvCreateVideoRequest( + prompt="cat", + model="video-model", + size="448x256", + seconds=10, + nvext=VideoNvExt(fps=24, seed=42), + ) + + result = await handler.build_engine_inputs(req, RequestType.VIDEO_GENERATION) + sp = result.sampling_params_list[0] + + assert (sp.width, sp.height) == (448, 256) + assert sp.num_frames == 240 + assert sp.fps == 24 + assert sp.frame_rate == 24.0 + assert sp.seed == 42 + assert result.fps == 24 + + @pytest.mark.parametrize("fps", [None, 8]) + @pytest.mark.asyncio + async def test_video_uses_video_default_for_image_num_frames_sentinel(self, fps): + handler = _make_handler() + req = NvCreateVideoRequest( + prompt="cat", model="video-model", nvext=VideoNvExt(fps=fps) + ) + + result = await handler.build_engine_inputs(req, RequestType.VIDEO_GENERATION) + + assert result.sampling_params_list[0].num_frames == 97 + + @pytest.mark.asyncio + async def test_video_resolves_fractional_frame_rate(self): + handler = _make_handler() + model_defaults = handler.engine_client.default_sampling_params_list[0] + model_defaults.fps = 16 + model_defaults.frame_rate = 23.976 + req = NvCreateVideoRequest(prompt="cat", model="video-model", seconds=10) + + result = await handler.build_engine_inputs(req, RequestType.VIDEO_GENERATION) + sp = result.sampling_params_list[0] + + assert sp.num_frames == 240 + assert isinstance(sp.num_frames, int) + assert result.fps == 24 + + @pytest.mark.parametrize( + ("field", "value", "message"), + [ + ("num_frames", 0, "nvext.num_frames must be greater than zero"), + ("num_frames", -1, "nvext.num_frames must be greater than zero"), + ("fps", 0, "nvext.fps must be greater than zero"), + ("fps", -1, "nvext.fps must be greater than zero"), + ], + ) + @pytest.mark.asyncio + async def test_video_rejects_non_positive_overrides(self, field, value, message): + handler = _make_handler() + req = NvCreateVideoRequest( + prompt="cat", model="video-model", nvext=VideoNvExt(**{field: value}) + ) + + with pytest.raises(ValueError, match=message): + await handler.build_engine_inputs(req, RequestType.VIDEO_GENERATION) + + @pytest.mark.parametrize("seconds", [0, -1]) + @pytest.mark.asyncio + async def test_video_rejects_non_positive_duration(self, seconds): + handler = _make_handler() + req = NvCreateVideoRequest(prompt="cat", model="video-model", seconds=seconds) + + with pytest.raises(ValueError, match="seconds must be greater than zero"): + await handler.build_engine_inputs(req, RequestType.VIDEO_GENERATION) + + @pytest.mark.asyncio + async def test_video_rejection_propagates_as_invalid_argument(self): + handler = _make_handler() + handler.config.output_modalities = ["video"] + request = { + "prompt": "cat", + "model": "video-model", + "nvext": {"fps": 0}, + } + + with pytest.raises(InvalidArgument) as excinfo: + async for _ in handler._generate_openai_mode(request, None, "req-1"): + pass + + assert str(excinfo.value) == "nvext.fps must be greater than zero" + async def test_media_passthrough_reaches_sampling_params(self): """A top-level SDK extra_body field, nested by the frontend under extra_args["media_passthrough"], rides sampling params extra_args to diff --git a/container/context.yaml b/container/context.yaml index 95a56a1867f3..6012465f4eb8 100644 --- a/container/context.yaml +++ b/container/context.yaml @@ -91,6 +91,8 @@ vllm: runtime_image: vllm/vllm-openai-xpu base_image_tag: v0.27.1 runtime_image_tag: v0.27.1 + # Cross-reference: BaseOmniHandler filters unsupported parallel fields for + # this older Omni schema. Remove that workaround when bumping this pin. vllm_omni_ref: "v0.27.0rc1" baseline_sbom: vllm-openai-xpu@3309c2e1 cpu: From 0dc991c01b995196d752a276e917e509966780fb Mon Sep 17 00:00:00 2001 From: Qi Wang Date: Thu, 17 Sep 2026 21:53:19 -0700 Subject: [PATCH 101/191] feat(vllm-omni): qualify MiniMax-H3 T2VA on B200 (#13589) Signed-off-by: Guan Luo Signed-off-by: GuanLuo <41310872+GuanLuo@users.noreply.github.com> Co-authored-by: Guan Luo Co-authored-by: GuanLuo <41310872+GuanLuo@users.noreply.github.com> Co-authored-by: Ryan McCormick --- .../vllm/tests/omni/test_omni_base_handler.py | 4 +- .../backends/vllm-omni-configuration.mdx | 16 ++ .../diffusion/workflows/text-to-video.md | 116 ++++++++++ .../vllm/launch/agg_omni_minimax_h3.sh | 150 ++++++++++++ .../vllm/launch/validate_omni_minimax_h3.sh | 218 ++++++++++++++++++ 5 files changed, 502 insertions(+), 2 deletions(-) create mode 100755 examples/backends/vllm/launch/agg_omni_minimax_h3.sh create mode 100755 examples/backends/vllm/launch/validate_omni_minimax_h3.sh diff --git a/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py b/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py index b0732867f9bb..1efcae11cf46 100644 --- a/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py +++ b/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py @@ -195,14 +195,14 @@ def test_model_defined_diffusion_fields_forwarded_to_async_omni(self): config = _make_config() config.diffusion = dataclasses.replace( OmniDiffusionKwargs(), - task_type="t2va", + task_type="fl2va", lora_path=["/models/fasth3/adapter_model.safetensors"], diffusion_attention_backend="TRTLLM_ATTN", ) kwargs = _build_kwargs(config) - assert kwargs["task_type"] == "t2va" + assert kwargs["task_type"] == "fl2va" assert kwargs["lora_path"] == ["/models/fasth3/adapter_model.safetensors"] assert kwargs["diffusion_attention_backend"] == "TRTLLM_ATTN" diff --git a/docs/fern/pages/reference/backends/vllm-omni-configuration.mdx b/docs/fern/pages/reference/backends/vllm-omni-configuration.mdx index 6341e3a92c42..f1d224de3c8b 100644 --- a/docs/fern/pages/reference/backends/vllm-omni-configuration.mdx +++ b/docs/fern/pages/reference/backends/vllm-omni-configuration.mdx @@ -31,6 +31,16 @@ These are the vLLM-Omni orchestration flags. The omni worker also accepts the sa Default frames per second for generated videos. + + Model-defined startup task or checkpoint partition. + + + Diffusion checkpoint adapter path(s) fused into the model at startup. This is + separate from request-time LoRA loading. + + + Default diffusion attention backend, such as `TRTLLM_ATTN` or `FLASH_ATTN`. + ## Memory & Performance @@ -76,6 +86,12 @@ These are the vLLM-Omni orchestration flags. The omni worker also accepts the sa GPUs for classifier-free guidance parallelism (1 or 2). + + Ranks used for VAE patch or tile parallelism. + + + Tensor-parallel ranks used by the diffusion text encoder. + ## Disaggregated Mode diff --git a/docs/fern/pages/use-cases/diffusion/workflows/text-to-video.md b/docs/fern/pages/use-cases/diffusion/workflows/text-to-video.md index 70e5dc5ad5f7..752f1191c429 100644 --- a/docs/fern/pages/use-cases/diffusion/workflows/text-to-video.md +++ b/docs/fern/pages/use-cases/diffusion/workflows/text-to-video.md @@ -20,6 +20,7 @@ Text-to-video generation runs a vLLM-Omni worker with `--output-modalities video |---|---| | `Wan-AI/Wan2.1-T2V-1.3B-Diffusers` | Default model (1 GPU) | | `Wan-AI/Wan2.2-T2V-A14B-Diffusers` | | +| `MiniMaxAI/MiniMax-H3` | Joint 24-FPS video and 32-kHz stereo audio; requires the dedicated [MiniMax-H3 workflow](#minimax-h3) and 4 B200 GPUs | To run a non-default model, pass `--model` to the launch script: @@ -53,6 +54,121 @@ curl -s http://localhost:8000/v1/videos \ The response returns a video URL or base64 data depending on `response_format` (e.g. `{"object": "video", "status": "completed", "data": [{"url": "file:///tmp/dynamo_media/videos/req-abc123.mp4"}]}`). +## MiniMax-H3 + +The initial MiniMax-H3 qualification serves text-to-video-and-audio (T2VA) with +one aggregated diffusion worker. The launcher passes `--task-type fl2va`, which +loads only H3's FL2VA checkpoint partition. Dynamo's standard image stays on +its VP9-only media stack, so build the opt-in video-audio overlay to mux H.264 +video and AAC audio: + +```bash +export DYN_H3_DYNAMO_REVISION="$(git rev-parse HEAD)" +export DYN_H3_BASE_IMAGE="dynamo:${DYN_H3_DYNAMO_REVISION}-vllm-runtime" +export DYN_H3_IMAGE="dynamo:minimax-h3-${DYN_H3_DYNAMO_REVISION}" + +python container/render.py --framework vllm --target runtime --output-short-filename +docker build -t "$DYN_H3_BASE_IMAGE" -f container/rendered.Dockerfile . +docker build \ + --build-arg BASE_IMAGE="$DYN_H3_BASE_IMAGE" \ + -f examples/backends/vllm/omni/video_audio.Dockerfile \ + -t "$DYN_H3_IMAGE" . +export DYN_H3_IMAGE_REF="$(docker image inspect --format '{{.Id}}' "$DYN_H3_IMAGE")" +``` + +Start a shell with exactly four B200 GPUs visible. The commands pass the tested +source revision and image ID into the qualification record: + +```bash +container/run.sh \ + --image "$DYN_H3_IMAGE" \ + --gpus device=0,1,2,3 \ + --mount-workspace \ + -e DYN_H3_DYNAMO_REVISION \ + -e DYN_H3_IMAGE_REF \ + -e DYN_H3_MODEL \ + -e DYN_H3_MODEL_PATH \ + -e DYN_H3_MODEL_REVISION \ + -e DYN_H3_FASTH3_LORA_PATH \ + -e HF_TOKEN \ + -it +``` + +Launch the profile inside the container. It uses four-way Ulysses and text-encoder tensor +parallelism while keeping VAE patch parallelism at one, so small supported +resolutions such as 448x256 still have at least one tile per participating +rank. Larger resolutions can opt into four-way VAE patch parallelism with +`DYN_H3_VAE_PATCH_PARALLEL_SIZE=4`: + +```bash +bash examples/backends/vllm/launch/agg_omni_minimax_h3.sh \ + > /tmp/dynamo-minimax-h3.log 2>&1 & +``` + +When an offline cache contains only H3's `FL2VA/` partition, set +`DYN_H3_MODEL_PATH` to that partition directory. The launcher keeps +`DYN_H3_MODEL` as the public API model name and passes the local partition as +the engine path. + +To use the four-step Dense FastH3 adapter, download and pin the startup adapter: + +```bash +export DYN_H3_FASTH3_LORA_PATH="$(hf download \ + FastVideo/FastVideo-FastH3-4-step-Preview-v1-LoRA \ + dense-datafree/adapter_model.safetensors \ + --revision bcf40ca6f457ed66f8badf13514943e390205fca)" +``` + +The launcher fuses this adapter into the checkpoint at load time. It is not a +request-time LoRA and cannot be combined with another request-time adapter. +The qualification script verifies the adapter SHA-256, requests four inference +steps, omits request scheduler-shift overrides, and records request duration and +adapter provenance. FastH3 v1 is T2VA-only and does not support CPU or layerwise +offload. + +Run the supplied end-to-end qualification against the same worker. It requests +a 10-second clip, then verifies a non-empty H.264 stream at 24 FPS and a +non-silent 32-kHz stereo AAC stream: + +```bash +export DYN_H3_QUAL_DIR=/tmp/dynamo_minimax_h3_qualification +bash examples/backends/vllm/launch/validate_omni_minimax_h3.sh +``` + +```json +{ + "model": "MiniMaxAI/MiniMax-H3", + "prompt": "A cat playing Canon in D on a grand piano.", + "size": "448x256", + "response_format": "url", + "output_format": "mp4", + "nvext": { + "fps": 24, + "num_inference_steps": 50, + "seed": 42 + }, + "task": "t2va", + "duration": 10.0, + "flow_shift": 12.0, + "audio_flow_shift": 3.0, + "aspect_ratio": "16:9" +} +``` + +The launcher pins model revision `42ed227ee7df40d41602854ae760620d6eb651fe`. +Set `DYN_H3_MODEL_REVISION` to test another revision. Dynamo preserves +unrecognized top-level video fields and the vLLM-Omni adapter merges them into +the pipeline's `extra_args`, where the upstream model validates them. Client +libraries that expose an `extra_body` option can use it to add these top-level +fields; do not send a literal nested `extra_body` object. Generated responses +report `fps` and `audio_sample_rate` for each MP4. The qualification output +records the exact Dynamo revision, container image ID, model revision, package +versions, visible GPU models, request, media checksum, and stream probe data. + +First/last-frame FL2VA and reference-driven Ref2VA are not part of this initial +qualification. They additionally require typed image, video, and audio input +references. + ## Request Parameters (`nvext`) The `/v1/videos` endpoint also accepts NVIDIA extensions via the `nvext` field for fine-grained control: diff --git a/examples/backends/vllm/launch/agg_omni_minimax_h3.sh b/examples/backends/vllm/launch/agg_omni_minimax_h3.sh new file mode 100755 index 000000000000..626fac0d9da5 --- /dev/null +++ b/examples/backends/vllm/launch/agg_omni_minimax_h3.sh @@ -0,0 +1,150 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Launch one aggregated vLLM-Omni worker that serves MiniMax-H3 T2VA. +set -euo pipefail +trap 'echo Cleaning up...; kill 0' EXIT + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +source "$SCRIPT_DIR/../../../common/launch_utils.sh" + +# MiniMax-H3 uses the four visible B200s for diffusion parallelism. The +# text-generation KV-cache flags from gpu_utils.sh do not apply to this worker. + +MODEL="${DYN_H3_MODEL:-MiniMaxAI/MiniMax-H3}" +MODEL_PATH="${DYN_H3_MODEL_PATH:-}" +MODEL_REVISION="${DYN_H3_MODEL_REVISION:-42ed227ee7df40d41602854ae760620d6eb651fe}" +ULYSSES_DEGREE="${DYN_H3_ULYSSES_DEGREE:-4}" +TEXT_ENCODER_TP_SIZE="${DYN_H3_TEXT_ENCODER_TP_SIZE:-4}" +# H3's native patch-parallel VAE requires at least one spatial tile per rank. +# Keep it single-rank by default so small supported resolutions (for example, +# 448x256) do not leave ranks with empty tile lists. Larger workloads may opt +# into the full DiT group size explicitly. +VAE_PATCH_PARALLEL_SIZE="${DYN_H3_VAE_PATCH_PARALLEL_SIZE:-1}" +ATTENTION_BACKEND="${DYN_H3_ATTENTION_BACKEND:-TRTLLM_ATTN}" +FASTH3_LORA_PATH="${DYN_H3_FASTH3_LORA_PATH:-}" +EXTRA_ARGS=() + +while [[ $# -gt 0 ]]; do + case "$1" in + --model) + if [[ $# -lt 2 || "$2" == --* ]]; then + echo "Error: --model requires a value" >&2 + exit 1 + fi + MODEL="$2" + shift 2 + ;; + --model-path) + if [[ $# -lt 2 || "$2" == --* ]]; then + echo "Error: --model-path requires a value" >&2 + exit 1 + fi + MODEL_PATH="$2" + shift 2 + ;; + --model-revision) + if [[ $# -lt 2 || "$2" == --* ]]; then + echo "Error: --model-revision requires a value" >&2 + exit 1 + fi + MODEL_REVISION="$2" + shift 2 + ;; + *) + EXTRA_ARGS+=("$1") + shift + ;; + esac +done + +MODEL_PATH="${MODEL_PATH:-$MODEL}" +FASTH3_ARGS=() +if [[ -n "$FASTH3_LORA_PATH" ]]; then + if [[ ! -f "$FASTH3_LORA_PATH" ]]; then + echo "FastH3 adapter not found: $FASTH3_LORA_PATH" >&2 + exit 1 + fi + FASTH3_ARGS=(--lora-path "$FASTH3_LORA_PATH") + EXAMPLE_INFERENCE_STEPS=4 + EXAMPLE_SCHEDULER_FIELDS="" +else + EXAMPLE_INFERENCE_STEPS=50 + EXAMPLE_SCHEDULER_FIELDS=$',\n "flow_shift": 12.0,\n "audio_flow_shift": 3.0' +fi + +SERVED_MODEL_ARGS=() +if [[ "$MODEL_PATH" != "$MODEL" ]]; then + SERVED_MODEL_ARGS=(--served-model-name "$MODEL") +fi + +VIDEO_AUDIO_OVERLAY_HINT="Build the opt-in video-audio overlay image from examples/backends/vllm/omni/video_audio.Dockerfile." +if ! command -v ffmpeg >/dev/null; then + echo "Error: ffmpeg was not found. $VIDEO_AUDIO_OVERLAY_HINT" >&2 + exit 1 +fi +if ! command -v ffprobe >/dev/null; then + echo "Error: ffprobe was not found. $VIDEO_AUDIO_OVERLAY_HINT" >&2 + exit 1 +fi +if ! ffmpeg -hide_banner -encoders 2>/dev/null | grep -E '(^| )libx264( |$)' >/dev/null; then + echo "Error: ffmpeg cannot encode H.264 because libx264 is unavailable. $VIDEO_AUDIO_OVERLAY_HINT" >&2 + exit 1 +fi +if ! python -c 'import av; av.codec.Codec("h264", "w"); av.codec.Codec("aac", "w")' >/dev/null 2>&1; then + echo "Error: PyAV cannot encode H.264 and AAC. $VIDEO_AUDIO_OVERLAY_HINT" >&2 + exit 1 +fi + +export VLLM_WORKER_MULTIPROC_METHOD="${VLLM_WORKER_MULTIPROC_METHOD:-spawn}" +export VLLM_OMNI_VIDEO_SYNC_TIMEOUT="${VLLM_OMNI_VIDEO_SYNC_TIMEOUT:-3600}" + +HTTP_PORT="${DYN_HTTP_PORT:-8000}" +print_launch_banner --no-curl "Launching MiniMax-H3 T2VA (4 GPUs)" "$MODEL_PATH" "$HTTP_PORT" +print_curl_footer <&2 + exit 1 +fi + +echo "Starting MiniMax-H3 T2VA Omni worker..." +DYN_SYSTEM_PORT="${DYN_SYSTEM_PORT:-8081}" \ + python -m dynamo.vllm.omni \ + --model "$MODEL_PATH" \ + "${SERVED_MODEL_ARGS[@]}" \ + --revision "$MODEL_REVISION" \ + --output-modalities video \ + --media-output-fs-url file:///tmp/dynamo_media \ + --trust-remote-code \ + --task-type fl2va \ + --ulysses-degree "$ULYSSES_DEGREE" \ + --text-encoder-tp-size "$TEXT_ENCODER_TP_SIZE" \ + --vae-patch-parallel-size "$VAE_PATCH_PARALLEL_SIZE" \ + --vae-use-tiling \ + --diffusion-attention-backend "$ATTENTION_BACKEND" \ + "${FASTH3_ARGS[@]}" \ + "${EXTRA_ARGS[@]}" & + +wait_any_exit diff --git a/examples/backends/vllm/launch/validate_omni_minimax_h3.sh b/examples/backends/vllm/launch/validate_omni_minimax_h3.sh new file mode 100755 index 000000000000..0cdb96d278ac --- /dev/null +++ b/examples/backends/vllm/launch/validate_omni_minimax_h3.sh @@ -0,0 +1,218 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Qualify MiniMax-H3 T2VA against one already-running aggregated worker. +set -euo pipefail + +API_URL="${DYN_H3_API_URL:-http://127.0.0.1:8000/v1/videos}" +MODEL="${DYN_H3_MODEL:-MiniMaxAI/MiniMax-H3}" +MODEL_REVISION="${DYN_H3_MODEL_REVISION:-42ed227ee7df40d41602854ae760620d6eb651fe}" +FASTH3_LORA_PATH="${DYN_H3_FASTH3_LORA_PATH:-}" +FASTH3_REVISION="${DYN_H3_FASTH3_REVISION:-bcf40ca6f457ed66f8badf13514943e390205fca}" +FASTH3_SHA256="${DYN_H3_FASTH3_SHA256:-4ce198c83132251b7fd0de2503823aa49c53983f068318f66cb19eaefb7fcc12}" +QUAL_DIR="${DYN_H3_QUAL_DIR:-/tmp/dynamo_minimax_h3_qualification}" +OUTPUT_DIR="$QUAL_DIR/outputs" +CASE_NAME="cat-playing-canon-in-d-grand-piano" +REQUEST_FILE="$OUTPUT_DIR/${CASE_NAME}.request.json" +RESPONSE_FILE="$OUTPUT_DIR/${CASE_NAME}.response.json" +VIDEO_FILE="$OUTPUT_DIR/${CASE_NAME}.mp4" +PROBE_FILE="$OUTPUT_DIR/${CASE_NAME}.ffprobe.json" +SOURCE_FILE="$OUTPUT_DIR/${CASE_NAME}.source-url.txt" +SHA_FILE="$OUTPUT_DIR/${CASE_NAME}.sha256" +HARDWARE_FILE="$OUTPUT_DIR/${CASE_NAME}.hardware.json" +METADATA_FILE="$OUTPUT_DIR/${CASE_NAME}.qualification.json" +AUDIO_STATS_FILE="$OUTPUT_DIR/${CASE_NAME}.audio-stats.txt" +TIMING_FILE="$OUTPUT_DIR/${CASE_NAME}.curl-time-seconds.txt" + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +DYNAMO_REVISION="${DYN_H3_DYNAMO_REVISION:-$(git -C "$SCRIPT_DIR" rev-parse HEAD 2>/dev/null || true)}" +IMAGE_REF="${DYN_H3_IMAGE_REF:-}" + +if [[ -z "$DYNAMO_REVISION" ]]; then + echo "Set DYN_H3_DYNAMO_REVISION to the tested Dynamo commit" >&2 + exit 1 +fi +if [[ -z "$IMAGE_REF" ]]; then + echo "Set DYN_H3_IMAGE_REF to the tested container image ID or digest" >&2 + exit 1 +fi + +mkdir -p "$OUTPUT_DIR" + +if [[ -n "$FASTH3_LORA_PATH" ]]; then + if [[ ! -f "$FASTH3_LORA_PATH" ]]; then + echo "FastH3 adapter not found: $FASTH3_LORA_PATH" >&2 + exit 1 + fi + actual_fasth3_sha256="$(sha256sum "$FASTH3_LORA_PATH" | awk '{print $1}')" + if [[ "$actual_fasth3_sha256" != "$FASTH3_SHA256" ]]; then + echo "FastH3 adapter checksum mismatch: $actual_fasth3_sha256" >&2 + exit 1 + fi + inference_steps=4 + fasth3=true +else + inference_steps=50 + fasth3=false +fi + +jq -n \ + --arg model "$MODEL" \ + --arg prompt "A photorealistic orange tabby cat seated at a polished black grand piano, visibly pressing the keys with both front paws while performing Pachelbel's Canon in D. Elegant concert hall, cinematic lighting, realistic paw and key motion, synchronized clear solo grand-piano audio playing the recognizable Canon in D melody, no speech, no other instruments." \ + --argjson inference_steps "$inference_steps" \ + --argjson fasth3 "$fasth3" \ + '{ + model: $model, + prompt: $prompt, + size: "448x256", + response_format: "url", + output_format: "mp4", + nvext: { + fps: 24, + num_inference_steps: $inference_steps, + seed: 42 + }, + task: "t2va", + duration: 10.0, + aspect_ratio: "16:9" + } | if $fasth3 then . else . + { + flow_shift: 12.0, + audio_flow_shift: 3.0 + } end' > "$REQUEST_FILE" + +python3 - "$HARDWARE_FILE" <<'PY' +import json +import sys + +import torch + +devices = [torch.cuda.get_device_name(index) for index in range(torch.cuda.device_count())] +if len(devices) != 4: + raise SystemExit(f"Expected exactly 4 visible GPUs, found {len(devices)}: {devices}") +if any("B200" not in device.upper() for device in devices): + raise SystemExit(f"Expected 4 B200 GPUs, found: {devices}") + +with open(sys.argv[1], "w", encoding="utf-8") as output: + json.dump({"visible_gpu_count": len(devices), "devices": devices}, output, indent=2) + output.write("\n") +PY + +models_url="${API_URL%/v1/videos}/v1/models" +echo "Waiting for MiniMax-H3 to register with the frontend..." +for _ in $(seq 1 360); do + if curl -fsS --max-time 10 "$models_url" | jq -e \ + --arg model "$MODEL" '.data[]? | select(.id == $model)' >/dev/null; then + break + fi + sleep 10 +done +curl -fsS --max-time 10 "$models_url" | jq -e \ + --arg model "$MODEL" '.data[]? | select(.id == $model)' >/dev/null + +echo "Generating a 10-second MiniMax-H3 T2VA sample..." +curl -fsS --max-time 7200 "$API_URL" \ + -H 'Content-Type: application/json' \ + --data-binary "@$REQUEST_FILE" \ + --output "$RESPONSE_FILE" \ + --write-out '%{time_total}\n' > "$TIMING_FILE" +jq -e '.status == "completed" and (.data | length) >= 1' "$RESPONSE_FILE" >/dev/null + +media_url="$(jq -er '.data[0].url' "$RESPONSE_FILE")" +media_path="${media_url#file://}" +if [[ ! -s "$media_path" ]]; then + echo "Missing generated video: $media_path" >&2 + exit 1 +fi +cp "$media_path" "$VIDEO_FILE" +printf '%s\n' "$media_url" > "$SOURCE_FILE" + +ffprobe -v error \ + -show_entries stream=codec_type,codec_name,width,height,sample_rate,channels,r_frame_rate,start_time,duration \ + -show_entries format=duration,size \ + -of json "$VIDEO_FILE" > "$PROBE_FILE" + +expected_size="$(jq -er '.size' "$REQUEST_FILE")" +expected_width="${expected_size%x*}" +expected_height="${expected_size#*x}" + +jq -e \ + --argjson expected_width "$expected_width" \ + --argjson expected_height "$expected_height" ' + def abs: if . < 0 then -. else . end; + ([.streams[] | select(.codec_type == "video")][0]) as $video | + ([.streams[] | select(.codec_type == "audio")][0]) as $audio | + ($video.codec_name == "h264") and + ($video.r_frame_rate == "24/1") and + ($video.width == $expected_width) and + ($video.height == $expected_height) and + ($audio.codec_name == "aac") and + ($audio.sample_rate == "32000") and + ($audio.channels == 2) and + ((($video.start_time | tonumber) - ($audio.start_time | tonumber)) | abs) <= 0.10 and + (((($video.start_time | tonumber) + ($video.duration | tonumber)) - + (($audio.start_time | tonumber) + ($audio.duration | tonumber))) | abs) <= 0.25 and + ((.format.duration | tonumber) >= 9.5 and (.format.duration | tonumber) <= 10.6) and + ((.format.size | tonumber) > 0) +' "$PROBE_FILE" >/dev/null + +ffmpeg -v error -i "$VIDEO_FILE" -map 0:v:0 -map 0:a:0 -f null - +ffmpeg -hide_banner -i "$VIDEO_FILE" -map 0:a:0 -af volumedetect -f null - \ + > /dev/null 2> "$AUDIO_STATS_FILE" +if grep -q 'mean_volume: -inf' "$AUDIO_STATS_FILE"; then + echo "Generated audio is silent" >&2 + exit 1 +fi + +sha256sum "$VIDEO_FILE" > "$SHA_FILE" +export DYNAMO_REVISION IMAGE_REF MODEL MODEL_REVISION FASTH3_LORA_PATH FASTH3_REVISION FASTH3_SHA256 +python3 - "$METADATA_FILE" "$HARDWARE_FILE" "$REQUEST_FILE" "$TIMING_FILE" <<'PY' +import importlib.metadata +import json +import os +import sys +from datetime import datetime, timezone + + +def version(distribution): + try: + return importlib.metadata.version(distribution) + except importlib.metadata.PackageNotFoundError: + return None + + +with open(sys.argv[2], encoding="utf-8") as source: + hardware = json.load(source) +with open(sys.argv[3], encoding="utf-8") as source: + request = json.load(source) +with open(sys.argv[4], encoding="utf-8") as source: + request_time_seconds = float(source.read().strip()) + +metadata = { + "qualified_at": datetime.now(timezone.utc).isoformat(), + "dynamo_revision": os.environ["DYNAMO_REVISION"], + "container_image": os.environ["IMAGE_REF"], + "model": os.environ["MODEL"], + "model_revision": os.environ["MODEL_REVISION"], + "request_time_seconds": request_time_seconds, + "package_versions": { + "ai-dynamo": version("ai-dynamo"), + "vllm": version("vllm"), + "vllm-omni": version("vllm-omni"), + "av": version("av"), + }, + "hardware": hardware, + "request": request, +} +if os.environ["FASTH3_LORA_PATH"]: + metadata["fasth3"] = { + "adapter_path": os.environ["FASTH3_LORA_PATH"], + "adapter_revision": os.environ["FASTH3_REVISION"], + "adapter_sha256": os.environ["FASTH3_SHA256"], + } +with open(sys.argv[1], "w", encoding="utf-8") as output: + json.dump(metadata, output, indent=2) + output.write("\n") +PY +echo "MiniMax-H3 T2VA qualification passed: $VIDEO_FILE" +echo "Qualification metadata: $METADATA_FILE" From 71c94bcb8ba1e630920a99a8a56650b4e1172cfa Mon Sep 17 00:00:00 2001 From: Xianlu Bird Date: Fri, 18 Sep 2026 13:34:52 +0800 Subject: [PATCH 102/191] feat(responses): support allowed function tools (#14990) Signed-off-by: xianlubird Co-authored-by: Ryan McCormick --- lib/llm/src/http/service/openai.rs | 19 ++- lib/llm/src/protocols/openai/responses/mod.rs | 141 +++++++++++++++--- .../openai/responses/stream_converter.rs | 104 +++++++++++-- lib/llm/tests/common/scripted_chat_engine.rs | 14 +- lib/llm/tests/responses_http_replay.rs | 132 +++++++++++++--- 5 files changed, 358 insertions(+), 52 deletions(-) diff --git a/lib/llm/src/http/service/openai.rs b/lib/llm/src/http/service/openai.rs index d7e7fb2955ef..126dd154c4ee 100644 --- a/lib/llm/src/http/service/openai.rs +++ b/lib/llm/src/http/service/openai.rs @@ -4073,6 +4073,7 @@ async fn responses( let mut http_queue_guard = Some(http_queue_guard); let error_signal = StreamErrorSignal::default(); let producer_error_signal = error_signal.clone(); + let producer_ctx = ctx.clone(); let mut engine_stream = Box::pin(engine_stream); let full_stream = async_stream::stream! { @@ -4117,7 +4118,23 @@ async fn responses( continue; }; - converter.append_chunk_events(&stream_resp, &mut events); + let terminal_failure = converter.append_chunk_events(&stream_resp, &mut events); + if terminal_failure { + producer_error_signal.set(ErrorType::Internal); + producer_ctx.kill(); + + let terminal_event = events + .pop() + .expect("terminal failure is missing response.failed"); + for event in events.drain(..) { + yield event.map_err(axum::Error::new); + } + if terminal_event.is_ok() { + producer_error_signal.mark_terminal_event_emitted(); + } + yield terminal_event.map_err(axum::Error::new); + return; + } for event in events.drain(..) { yield event.map_err(axum::Error::new); } diff --git a/lib/llm/src/protocols/openai/responses/mod.rs b/lib/llm/src/protocols/openai/responses/mod.rs index a95a237f6e1f..7176675af250 100644 --- a/lib/llm/src/protocols/openai/responses/mod.rs +++ b/lib/llm/src/protocols/openai/responses/mod.rs @@ -3,7 +3,7 @@ pub mod stream_converter; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use dynamo_protocols::types::responses::{ AssistantRole, FunctionCallOutput, FunctionToolCall, IncludeEnum, IncompleteDetails, @@ -12,8 +12,8 @@ use dynamo_protocols::types::responses::{ OutputMessageContent, OutputStatus, OutputTextContent, OutputTokenDetails, PromptCacheRetention, Reasoning, ReasoningItem, ReasoningItemContent, ReasoningTextContent, Response, ResponseTextParam, ResponseUsage, Role as ResponseRole, ServiceTier, Status, - SummaryPart, TextResponseFormatConfiguration, Tool, ToolChoiceOptions, ToolChoiceParam, - Truncation, + SummaryPart, TextResponseFormatConfiguration, Tool, ToolChoiceAllowed, ToolChoiceAllowedMode, + ToolChoiceOptions, ToolChoiceParam, Truncation, }; use dynamo_protocols::types::{ ChatCompletionMessageToolCall, ChatCompletionNamedToolChoice, @@ -744,7 +744,7 @@ fn unsupported_tool(tool: &impl serde::Serialize, field: &str) -> anyhow::Res let value = serde_json::to_value(tool)?; let tool_type = value["type"].as_str().unwrap_or("unknown"); Err(ResponsesConversionError::InvalidArgument(format!( - "Unsupported Responses {field} type '{tool_type}': the Chat Completions adapter supports only function tools and none, auto, required, or named function tool choices" + "Unsupported Responses {field} type '{tool_type}': the Chat Completions adapter supports only function tools and none, auto, required, named function, or function-only allowed_tools choices" )) .into()) } @@ -772,6 +772,76 @@ fn convert_tool_choice(tc: &ToolChoiceParam) -> anyhow::Result anyhow::Result> { + let mut names = HashSet::new(); + for tool in &choice.tools { + let tool_type = tool.get("type").and_then(serde_json::Value::as_str); + let name = tool.get("name").and_then(serde_json::Value::as_str); + let (Some("function"), Some(name)) = (tool_type, name) else { + return Err(ResponsesConversionError::InvalidArgument( + "Responses allowed_tools currently supports only function entries with a string name" + .to_string(), + ) + .into()); + }; + names.insert(name.to_string()); + } + if names.is_empty() { + return Err(ResponsesConversionError::InvalidArgument( + "Responses allowed_tools must contain at least one function".to_string(), + ) + .into()); + } + Ok(names) +} + +/// Convert tools and tool choice together so an `allowed_tools` subset cannot +/// be separated from the tool definitions it constrains. +fn convert_tools_and_choice( + tools: Option<&[Tool]>, + tool_choice: Option<&ToolChoiceParam>, +) -> anyhow::Result<( + Option>, + Option, +)> { + let mut converted_tools = tools.map(convert_tools).transpose()?.unwrap_or_default(); + + let converted_choice = match tool_choice { + Some(ToolChoiceParam::AllowedTools(choice)) => { + let allowed = allowed_function_names(choice)?; + let available: HashSet<&str> = converted_tools + .iter() + .map(|tool| tool.function.name.as_str()) + .collect(); + if let Some(missing) = allowed + .iter() + .find(|name| !available.contains(name.as_str())) + { + return Err(ResponsesConversionError::InvalidArgument(format!( + "Responses allowed_tools references unknown function '{missing}'" + )) + .into()); + } + + converted_tools.retain(|tool| allowed.contains(&tool.function.name)); + Some(match choice.mode { + ToolChoiceAllowedMode::Auto => ChatCompletionToolChoiceOption::Auto, + ToolChoiceAllowedMode::Required => ChatCompletionToolChoiceOption::Required, + }) + } + Some(choice) => Some(convert_tool_choice(choice)?), + None => None, + }; + + Ok(( + (!converted_tools.is_empty()).then_some(converted_tools), + converted_choice, + )) +} + /// Convert Responses API `text.format` to Chat Completions `response_format`. pub fn convert_text_format(text: &ResponseTextParam) -> Option { match &text.format { @@ -874,22 +944,8 @@ impl TryFrom for NvCreateChatCompletionRequest { let top_logprobs = convert_top_logprobs(resp.inner.top_logprobs); - // Convert tools if present - let tools = resp - .inner - .tools - .as_ref() - .map(|t| convert_tools(t)) - .transpose()? - .filter(|t: &Vec<_>| !t.is_empty()); - - // Convert tool_choice if present - let tool_choice = resp - .inner - .tool_choice - .as_ref() - .map(convert_tool_choice) - .transpose()?; + let (tools, tool_choice) = + convert_tools_and_choice(resp.inner.tools.as_deref(), resp.inner.tool_choice.as_ref())?; // Determine stream setting: respect caller's preference, default to true for aggregation let stream = resp.inner.stream.or(Some(true)); @@ -1033,6 +1089,19 @@ impl ResponseParams { .all(|other_namespace| other_namespace == namespace) .then(|| namespace.to_owned()) } + + /// The request conversion already limits the backend-visible definitions, + /// but keep this response-side gate as a defense against a backend or parser + /// returning a function that was not enabled for this turn. + pub(super) fn function_is_allowed(&self, name: &str) -> bool { + let Some(ToolChoiceParam::AllowedTools(choice)) = &self.tool_choice else { + return true; + }; + choice.tools.iter().any(|tool| { + tool.get("type").and_then(serde_json::Value::as_str) == Some("function") + && tool.get("name").and_then(serde_json::Value::as_str) == Some(name) + }) + } } /// Normalize tools so that `FunctionTool.strict` is always set. @@ -1120,6 +1189,15 @@ pub fn chat_completion_to_response( // Handle structured tool calls if let Some(tool_calls) = choice.message.tool_calls { + if let Some(disallowed) = tool_calls + .iter() + .find(|tc| !params.function_is_allowed(&tc.function.name)) + { + anyhow::bail!( + "Backend returned function '{}' outside allowed_tools", + disallowed.function.name + ); + } for tc in &tool_calls { output.push(OutputItem::FunctionCall(FunctionToolCall { arguments: tc.function.arguments.clone(), @@ -2830,8 +2908,16 @@ mod tests { nvext: None, }; - let wrapped = - chat_completion_to_response(chat_resp, &requested_reasoning_params(), None).unwrap(); + let mut params = requested_reasoning_params(); + params.tool_choice = Some( + serde_json::from_value(serde_json::json!({ + "type": "allowed_tools", + "mode": "auto", + "tools": [{"type": "function", "name": "get_weather"}] + })) + .unwrap(), + ); + let wrapped = chat_completion_to_response(chat_resp.clone(), ¶ms, None).unwrap(); assert_eq!(wrapped.inner.output.len(), 2); let OutputItem::Reasoning(reasoning) = &wrapped.inner.output[0] else { panic!("Expected Reasoning output before the tool call"); @@ -2845,6 +2931,17 @@ mod tests { } _ => panic!("Expected FunctionCall output"), } + + params.tool_choice = Some( + serde_json::from_value(serde_json::json!({ + "type": "allowed_tools", + "mode": "auto", + "tools": [{"type": "function", "name": "delete_file"}] + })) + .unwrap(), + ); + let error = chat_completion_to_response(chat_resp, ¶ms, None).unwrap_err(); + assert!(error.to_string().contains("outside allowed_tools")); } #[allow(deprecated)] diff --git a/lib/llm/src/protocols/openai/responses/stream_converter.rs b/lib/llm/src/protocols/openai/responses/stream_converter.rs index e3196635ffbb..2efdf20d7db9 100644 --- a/lib/llm/src/protocols/openai/responses/stream_converter.rs +++ b/lib/llm/src/protocols/openai/responses/stream_converter.rs @@ -65,6 +65,7 @@ pub struct ResponseStreamConverter { usage: Option, // The backend ended with a terminal reason that is not success-like. incomplete_reason: Option<&'static str>, + terminal_failure_emitted: bool, } struct ReasoningState { @@ -133,6 +134,7 @@ impl ResponseStreamConverter { next_output_index: 0, usage: None, incomplete_reason: None, + terminal_failure_emitted: false, } } @@ -371,11 +373,16 @@ impl ResponseStreamConverter { } /// Process a single chat completion stream chunk and append zero or more SSE events. + /// Returns `true` after appending a terminal failure so the caller can drop the upstream stream. pub fn append_chunk_events( &mut self, chunk: &NvCreateChatCompletionStreamResponse, events: &mut Vec>, - ) { + ) -> bool { + if self.terminal_failure_emitted { + return false; + } + // Capture usage stats from the final chunk (sent when stream_options.include_usage=true) if let Some(ref u) = chunk.inner.usage { self.usage = Some(ResponseUsage { @@ -492,15 +499,9 @@ impl ResponseStreamConverter { // allocating converter state so suppressed calls cannot emit // any Responses API events at finish or EOF. let enforce_single_tool_call = self.params.parallel_tool_calls == Some(false); - let mut tool_calls = tool_calls + let tool_calls = tool_calls .iter() - .filter(|tc| !enforce_single_tool_call || tc.index == 0) - .peekable(); - if tool_calls.peek().is_some() { - // Starting a tool call is also an explicit reasoning phase - // boundary, independent of this chunk's finish reason. - self.append_active_reasoning_done_events(events, OutputStatus::Completed); - } + .filter(|tc| !enforce_single_tool_call || tc.index == 0); for tc in tool_calls { let tc_index = tc.index as usize; @@ -547,10 +548,32 @@ impl ResponseStreamConverter { // a monotonically increasing index, so indices are not interleaved today; // keying state by `tc_index` would handle interleaving too, but that path // is defensive rather than exercised by any current backend. - let should_start = { + let (should_start, disallowed_name) = { let state = &self.function_call_items[tc_index]; - !state.started && state.has_identity() + let has_identity = state.has_identity(); + let is_allowed = self.params.function_is_allowed(&state.name); + ( + !state.started && has_identity && is_allowed, + (has_identity && !is_allowed).then(|| state.name.clone()), + ) }; + if let Some(name) = disallowed_name { + let error = ErrorObject { + code: "server_error".to_string(), + message: format!( + "Backend returned function '{name}' outside allowed_tools" + ), + }; + let terminal_event = self.append_error_events(error, events); + events.push(terminal_event); + self.terminal_failure_emitted = true; + return true; + } + if should_start { + // Starting an allowed tool call is an explicit reasoning + // phase boundary, independent of the finish reason. + self.append_active_reasoning_done_events(events, OutputStatus::Completed); + } let new_output_index = should_start.then(|| { let output_index = self.next_output_index; self.next_output_index += 1; @@ -643,6 +666,8 @@ impl ResponseStreamConverter { let output_status = self.output_status(); self.append_pending_function_call_done_events(events, output_status, true); } + + false } fn append_pending_function_call_done_events( @@ -870,6 +895,10 @@ impl ResponseStreamConverter { /// Append remaining output completion events and `response.completed` at stream end. pub fn append_end_events(&mut self, events: &mut Vec>) { + if self.terminal_failure_emitted { + return; + } + let output_status = self.output_status(); // Without a later output item, the response finish reason determines // whether the still-open reasoning item completed or was truncated. @@ -1472,6 +1501,59 @@ mod tests { assert_eq!(call.status, Some(OutputStatus::Completed)); } + #[test] + fn disallowed_function_call_fails_without_splitting_reasoning() { + let params = ResponseParams { + tool_choice: Some( + serde_json::from_value(serde_json::json!({ + "type": "allowed_tools", + "mode": "auto", + "tools": [{"type": "function", "name": "read_file"}] + })) + .unwrap(), + ), + ..reasoning_params() + }; + let mut conv = ResponseStreamConverter::new("test-model".into(), params); + let reasoning_events = conv.process_chunk(&reasoning_chunk("still thinking")); + assert_eq!( + event_types(&reasoning_events), + vec![ + "response.output_item.added".to_string(), + "response.content_part.added".to_string(), + "response.reasoning_text.delta".to_string(), + ] + ); + + let tool_events = conv.process_chunk(&tool_call_chunk( + 0, + Some("call-1"), + Some("delete_file"), + Some("{\"path\":\"notes.txt\"}"), + )); + assert_eq!( + event_types(&tool_events), + vec![ + "response.reasoning_text.done".to_string(), + "response.content_part.done".to_string(), + "response.output_item.done".to_string(), + "response.failed".to_string(), + ] + ); + assert_eq!( + conv.reasoning_items[0].output_status, + Some(OutputStatus::Incomplete) + ); + + assert!( + conv.process_chunk(&reasoning_chunk(" must be ignored")) + .is_empty() + ); + assert!(conv.emit_end_events().is_empty()); + assert_eq!(conv.reasoning_items.len(), 1); + assert_eq!(conv.reasoning_items[0].accumulated_text, "still thinking"); + } + #[test] fn test_backend_error_preserves_completed_function_call_status() { let mut conv = ResponseStreamConverter::new("test-model".into(), default_params()); diff --git a/lib/llm/tests/common/scripted_chat_engine.rs b/lib/llm/tests/common/scripted_chat_engine.rs index 0f74cd831e0c..68427fa64816 100644 --- a/lib/llm/tests/common/scripted_chat_engine.rs +++ b/lib/llm/tests/common/scripted_chat_engine.rs @@ -14,7 +14,8 @@ use dynamo_llm::protocols::{ }; use dynamo_runtime::error::DynamoError; use dynamo_runtime::pipeline::{ - AsyncEngine, AsyncEngineContextProvider, ManyOut, ResponseStream, SingleIn, async_trait, + AsyncEngine, AsyncEngineContext, AsyncEngineContextProvider, ManyOut, ResponseStream, SingleIn, + async_trait, }; use tokio::sync::{Mutex, Semaphore}; @@ -55,6 +56,7 @@ impl ScriptGate { pub struct ScriptedChatEngine { scripts: Mutex>, requests: Mutex>, + contexts: Mutex>>, } impl ScriptedChatEngine { @@ -68,6 +70,7 @@ impl ScriptedChatEngine { kill_after_stop, }])), requests: Mutex::new(Vec::new()), + contexts: Mutex::new(Vec::new()), } } @@ -83,6 +86,7 @@ impl ScriptedChatEngine { .collect(), ), requests: Mutex::new(Vec::new()), + contexts: Mutex::new(Vec::new()), } } @@ -100,6 +104,7 @@ impl ScriptedChatEngine { release: release.clone(), }])), requests: Mutex::new(Vec::new()), + contexts: Mutex::new(Vec::new()), }, ScriptGate { release }, ) @@ -113,6 +118,7 @@ impl ScriptedChatEngine { error, }])), requests: Mutex::new(Vec::new()), + contexts: Mutex::new(Vec::new()), } } @@ -121,6 +127,11 @@ impl ScriptedChatEngine { std::mem::take(&mut *self.requests.lock().await) } + #[allow(dead_code)] + pub async fn take_contexts(&self) -> Vec> { + std::mem::take(&mut *self.contexts.lock().await) + } + pub async fn remaining_scripts(&self) -> usize { self.scripts.lock().await.len() } @@ -142,6 +153,7 @@ impl let ctx = context.context(); self.requests.lock().await.push(request); + self.contexts.lock().await.push(ctx.clone()); let script = self .scripts .lock() diff --git a/lib/llm/tests/responses_http_replay.rs b/lib/llm/tests/responses_http_replay.rs index ee3ab5fdccda..99d54d8557d0 100644 --- a/lib/llm/tests/responses_http_replay.rs +++ b/lib/llm/tests/responses_http_replay.rs @@ -9,7 +9,7 @@ use std::time::Duration; use dynamo_llm::http::service::metrics::{Endpoint, ErrorType, RequestType, Status}; use dynamo_protocols::types::{ ChatCompletionRequestMessage, ChatCompletionRequestToolMessageContent, - ChatCompletionRequestUserMessageContent, + ChatCompletionRequestUserMessageContent, ChatCompletionToolChoiceOption, }; use dynamo_runtime::config::environment_names::llm::DYN_HTTP_GRACEFUL_SHUTDOWN_TIMEOUT_SECS; use dynamo_runtime::error::{BackendError, DynamoError, ErrorType as DynamoErrorType}; @@ -78,22 +78,17 @@ async fn unsupported_tool_choices_fail_before_dispatch_or_streaming() { temp_env::async_with_vars(ENV, async { let svc = HarnessService::start([]).await; for stream in [false, true] { - for choice in [ - json!({"type": "web_search_preview"}), - json!({"type": "allowed_tools", "mode": "required", "tools": [{"type": "function", "name": "read_file"}]}), - ] { - let body = json!({ - "model": MODEL, - "input": "ping", - "stream": stream, - "tool_choice": choice, - "tools": [tool("read_file")], - }); - let response = post_responses(&svc, &body).await; - assert_eq!(response.status(), reqwest::StatusCode::BAD_REQUEST); - let error: Value = response.json().await.unwrap(); - assert!(error["message"].as_str().unwrap().contains("tool_choice")); - } + let body = json!({ + "model": MODEL, + "input": "ping", + "stream": stream, + "tool_choice": {"type": "web_search_preview"}, + "tools": [tool("read_file")], + }); + let response = post_responses(&svc, &body).await; + assert_eq!(response.status(), reqwest::StatusCode::BAD_REQUEST); + let error: Value = response.json().await.unwrap(); + assert!(error["message"].as_str().unwrap().contains("tool_choice")); } assert!(svc.engine.take_requests().await.is_empty()); svc.shutdown().await; @@ -101,6 +96,109 @@ async fn unsupported_tool_choices_fail_before_dispatch_or_streaming() { .await; } +#[tokio::test] +#[serial] +async fn allowed_function_tools_filter_before_dispatch() { + temp_env::async_with_vars(ENV, async { + let script = load_agent_fixture("text.sse").await.unwrap(); + let svc = HarnessService::start([script.clone(), script]).await; + for (stream, mode) in [(false, "auto"), (true, "required")] { + let body = json!({ + "model": MODEL, + "input": "ping", + "stream": stream, + "tools": [tool("read_file"), tool("write_file")], + "tool_choice": { + "type": "allowed_tools", + "mode": mode, + "tools": [{"type": "function", "name": "read_file"}] + } + }); + let response = post_responses(&svc, &body).await; + assert_eq!(response.status(), reqwest::StatusCode::OK); + let _ = response.bytes().await.unwrap(); + } + + let requests = svc.engine.take_requests().await; + assert_eq!(requests.len(), 2); + for (request, expected_choice) in requests.iter().zip([ + ChatCompletionToolChoiceOption::Auto, + ChatCompletionToolChoiceOption::Required, + ]) { + let tools = request.inner.tools.as_deref().unwrap(); + assert_eq!(tools.len(), 1); + assert_eq!(tools[0].function.name, "read_file"); + assert_eq!(request.inner.tool_choice, Some(expected_choice)); + } + svc.shutdown().await; + }) + .await; +} + +#[tokio::test] +#[serial] +async fn invalid_allowed_tools_fail_before_dispatch() { + temp_env::async_with_vars(ENV, async { + let svc = HarnessService::start([]).await; + for allowed in [ + json!([]), + json!([{"type": "function", "name": "unknown"}]), + json!([{"type": "web_search"}]), + ] { + let body = json!({ + "model": MODEL, + "input": "ping", + "tools": [tool("read_file")], + "tool_choice": { + "type": "allowed_tools", + "mode": "auto", + "tools": allowed + } + }); + let response = post_responses(&svc, &body).await; + assert_eq!(response.status(), reqwest::StatusCode::BAD_REQUEST); + } + assert!(svc.engine.take_requests().await.is_empty()); + svc.shutdown().await; + }) + .await; +} + +#[tokio::test] +#[serial] +async fn disallowed_streamed_function_call_kills_backend_context() { + temp_env::async_with_vars(ENV, async { + let svc = + HarnessService::start([load_agent_fixture("fragmented-tool.sse").await.unwrap()]).await; + let response = post_responses( + &svc, + &json!({ + "model": MODEL, + "input": "List /tmp", + "stream": true, + "tools": [tool("read_file"), tool("list_directory")], + "tool_choice": { + "type": "allowed_tools", + "mode": "auto", + "tools": [{"type": "function", "name": "read_file"}] + } + }), + ) + .await; + assert_eq!(response.status(), reqwest::StatusCode::OK); + let events = parse_json_sse(&response.text().await.unwrap()) + .await + .unwrap(); + assert!(events.iter().any(|event| event.event == "response.failed")); + + let contexts = svc.engine.take_contexts().await; + assert_eq!(contexts.len(), 1); + assert!(contexts[0].is_killed()); + svc.shutdown().await; + }) + .await; +} + async fn post_responses(svc: &HarnessService, body: &Value) -> reqwest::Response { svc.client .post(format!("{}/v1/responses", svc.base_url)) From 402c2611ffcb3dbdeea344677d757dfed5469912 Mon Sep 17 00:00:00 2001 From: Indrajit Bhosale Date: Thu, 17 Sep 2026 22:46:25 -0700 Subject: [PATCH 103/191] feat: Merge DSV4.1 changes from release branch to main (#15030) Signed-off-by: Indrajit Bhosale --- Cargo.lock | 12 +- Cargo.toml | 6 +- lib/bindings/kvbm/Cargo.lock | 12 +- lib/bindings/python/Cargo.lock | 12 +- lib/llm/src/preprocessor.rs | 53 +++++- .../openai/chat_completions/aggregator.rs | 35 ++++ .../openai/chat_completions/tool_parser_v2.rs | 28 +-- .../openai/chat_completions/unified_parser.rs | 176 +++++++++++++++++- lib/llm/src/protocols/openai/responses/mod.rs | 114 ++++++++++-- lib/llm/tests/deepseek_v41_renderer.rs | 64 +++++++ 10 files changed, 445 insertions(+), 67 deletions(-) create mode 100644 lib/llm/tests/deepseek_v41_renderer.rs diff --git a/Cargo.lock b/Cargo.lock index ed3ce0ed5ef9..c2f11c350ebe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2875,9 +2875,9 @@ dependencies = [ [[package]] name = "dynamo-parsers-v2" -version = "0.3.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2277648c57af9f41943c1c6abf573ed42ddbad9d05f2e4053e9d66e9a41182" +checksum = "e3dba2a81c6382dc217fb4caa2b5b03a7e80d5bda6694a3c002ee9eeefa84336" dependencies = [ "anyhow", "num-traits", @@ -2892,9 +2892,9 @@ dependencies = [ [[package]] name = "dynamo-protocols" -version = "5.4.1" +version = "5.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbaf3179de1accba21fcad16eb22b5e113722084265e0315e808e32150088ee7" +checksum = "b1cdacfc1398779cf173d5ff54438d9f14682f76875b6879853a84cc7d646228" dependencies = [ "async-openai", "derive_builder", @@ -2909,9 +2909,9 @@ dependencies = [ [[package]] name = "dynamo-renderer" -version = "5.1.2" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae2eaa139651c535aeaad8856c5546709608931ccd4d24d3a529f6c5233c4b6" +checksum = "d4609cdbd65f8bd15c74f4531c1560d04496e8737dfb6b65b45487644b878963" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 0ae3e1f40176..d804930af299 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,7 +63,7 @@ dynamo-runtime = { path = "lib/runtime", version = "1.6.0" } dynamo-llm = { path = "lib/llm", version = "1.6.0" } dynamo-rl = { path = "lib/rl", version = "1.6.0" } dynamo-tokenizers = { version = "=1.8.1" } -dynamo-renderer = { version = "=5.1.2" } +dynamo-renderer = { version = "=5.2.0" } dynamo-tokens = { path = "lib/tokens", version = "1.6.0" } dynamo-truthy = { path = "lib/truthy", version = "1.6.0" } dynamo-data-gen = { path = "lib/data-gen", version = "1.6.0" } @@ -71,13 +71,13 @@ dynamo-kv-hashing = { path = "lib/kv-hashing", version = "1.6.0" } dynamo-memory = { path = "lib/memory", version = "1.6.0" } dynamo-mocker = { path = "lib/mocker", version = "1.6.0" } dynamo-kv-router = { path = "lib/kv-router", version = "1.6.0" } -dynamo-protocols = { version = "=5.4.1" } +dynamo-protocols = { version = "=5.4.3" } dynamo-parsers = { version = "8.1.0" } # Published on crates.io. To see all available versions: # web: https://crates.io/crates/dynamo-parsers-v2/versions # sparse index: curl https://index.crates.io/dy/na/dynamo-parsers-v2 (one JSON line per release; read the "vers" field) -dynamo-parsers-v2 = { version = "0.3.2" } +dynamo-parsers-v2 = { version = "0.5.3" } dynamo-backend-common = { path = "lib/backend-common", version = "1.6.0" } dynamo-sidecar-common = { path = "lib/sidecar/common", version = "1.6.0" } diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index 963f7ad41731..ddebffea0197 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -2294,9 +2294,9 @@ dependencies = [ [[package]] name = "dynamo-parsers-v2" -version = "0.3.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2277648c57af9f41943c1c6abf573ed42ddbad9d05f2e4053e9d66e9a41182" +checksum = "e3dba2a81c6382dc217fb4caa2b5b03a7e80d5bda6694a3c002ee9eeefa84336" dependencies = [ "anyhow", "num-traits", @@ -2311,9 +2311,9 @@ dependencies = [ [[package]] name = "dynamo-protocols" -version = "5.4.1" +version = "5.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbaf3179de1accba21fcad16eb22b5e113722084265e0315e808e32150088ee7" +checksum = "b1cdacfc1398779cf173d5ff54438d9f14682f76875b6879853a84cc7d646228" dependencies = [ "async-openai", "derive_builder", @@ -2328,9 +2328,9 @@ dependencies = [ [[package]] name = "dynamo-renderer" -version = "5.1.2" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae2eaa139651c535aeaad8856c5546709608931ccd4d24d3a529f6c5233c4b6" +checksum = "d4609cdbd65f8bd15c74f4531c1560d04496e8737dfb6b65b45487644b878963" dependencies = [ "anyhow", "chrono", diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index 154b3bb872d4..dc7331ab4916 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -2354,9 +2354,9 @@ dependencies = [ [[package]] name = "dynamo-parsers-v2" -version = "0.3.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2277648c57af9f41943c1c6abf573ed42ddbad9d05f2e4053e9d66e9a41182" +checksum = "e3dba2a81c6382dc217fb4caa2b5b03a7e80d5bda6694a3c002ee9eeefa84336" dependencies = [ "anyhow", "num-traits", @@ -2371,9 +2371,9 @@ dependencies = [ [[package]] name = "dynamo-protocols" -version = "5.4.1" +version = "5.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbaf3179de1accba21fcad16eb22b5e113722084265e0315e808e32150088ee7" +checksum = "b1cdacfc1398779cf173d5ff54438d9f14682f76875b6879853a84cc7d646228" dependencies = [ "async-openai", "derive_builder", @@ -2434,9 +2434,9 @@ dependencies = [ [[package]] name = "dynamo-renderer" -version = "5.1.2" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae2eaa139651c535aeaad8856c5546709608931ccd4d24d3a529f6c5233c4b6" +checksum = "d4609cdbd65f8bd15c74f4531c1560d04496e8737dfb6b65b45487644b878963" dependencies = [ "anyhow", "chrono", diff --git a/lib/llm/src/preprocessor.rs b/lib/llm/src/preprocessor.rs index f8d9a151be6a..1ebe13d3846d 100644 --- a/lib/llm/src/preprocessor.rs +++ b/lib/llm/src/preprocessor.rs @@ -188,7 +188,7 @@ fn validate_legacy_jail_nvext_choice_count( #[derive(Clone, Debug, PartialEq, Eq)] enum ToolProcessingRoute { MuseUnified(String), - QwenUnified(&'static str), + Unified(&'static str), ParserV2(String), LegacyJail(Option), PassThrough, @@ -2036,9 +2036,9 @@ impl OpenAIPreprocessor { Some("deepseek_v3" | "deepseek_v3_1") => { Self::deepseek_renderer_reasoning_enabled(chat_template_args, false) } - Some("deepseek_v3_2" | "deepseek_v4" | "deepseek-v4" | "deepseekv4") => { - Self::deepseek_renderer_reasoning_enabled(chat_template_args, true) - } + Some( + "deepseek_v3_2" | "deepseek_v4" | "deepseek-v4" | "deepseekv4" | "deepseek_v41", + ) => Self::deepseek_renderer_reasoning_enabled(chat_template_args, true), Some("gemma4" | "gemma-4") => thinking_enabled == Some(true), // SGLang's Mistral reasoner is active only for a concrete effort. @@ -4777,7 +4777,7 @@ impl OpenAIPreprocessor { self.tool_call_parser.as_deref(), self.runtime_config.reasoning_parser.as_deref(), ) { - return Ok(ToolProcessingRoute::QwenUnified(family)); + return Ok(ToolProcessingRoute::Unified(family)); } let effective_tool_call_parser = self.tool_call_parser.clone().or_else(|| { @@ -4926,7 +4926,7 @@ impl OpenAIPreprocessor { )); } - if let ToolProcessingRoute::QwenUnified(family) = &tool_processing_route { + if let ToolProcessingRoute::Unified(family) = &tool_processing_route { let tool_definitions = request.inner.tools.as_ref().map(|tools| { tools .iter() @@ -5092,7 +5092,7 @@ impl OpenAIPreprocessor { )) } ToolProcessingRoute::PassThrough => Box::pin(stream), - ToolProcessingRoute::MuseUnified(_) | ToolProcessingRoute::QwenUnified(_) => { + ToolProcessingRoute::MuseUnified(_) | ToolProcessingRoute::Unified(_) => { unreachable!("unified routes return before legacy response processing") } }; @@ -6041,6 +6041,7 @@ impl OpenAIPreprocessor { | Some("inkling") | Some("muse_glimmer") | Some("muse") + | Some("deepseek_v41") ) || matches!( reasoning_parser, Some("gemma4") @@ -6055,6 +6056,7 @@ impl OpenAIPreprocessor { | Some("inkling") | Some("muse_glimmer") | Some("muse") + | Some("deepseek_v41") ) } @@ -6214,6 +6216,7 @@ impl OpenAIPreprocessor { reasoning_parser, Some( "deepseek_v4" + | "deepseek_v41" | "deepseek-v4" | "deepseekv4" | "glm45" @@ -6249,7 +6252,9 @@ impl OpenAIPreprocessor { ) -> Option { let should_forward = matches!( reasoning_parser, - Some("minimax_m2" | "minimax_m3" | "minimax-m3" | "kimi_k3" | "kimi-k3") + Some( + "minimax_m2" | "minimax_m3" | "minimax-m3" | "kimi_k3" | "kimi-k3" | "deepseek_v41" + ) ); if should_forward && Self::prompt_injected_reasoning_start(reasoning_parser, formatted_prompt) @@ -6306,7 +6311,7 @@ impl OpenAIPreprocessor { } Some( "deepseek_r1" | "deepseek_v3_2" | "deepseek_v4" | "deepseek-v4" | "deepseekv4" - | "minimax_m2", + | "deepseek_v41" | "minimax_m2", ) => !Self::deepseek_renderer_reasoning_enabled(chat_template_args, true), Some("gemma4") | Some("gemma-4") => { dynamo_renderer::thinking_bool_from_args(chat_template_args) != Some(true) @@ -7666,6 +7671,34 @@ mod tests { FinishReason, Role, }; + #[test] + fn deepseek_v41_preserves_markers_and_initializes_backend_reasoning() { + for (tool, reasoning) in [(Some("deepseek_v41"), None), (None, Some("deepseek_v41"))] { + assert!(OpenAIPreprocessor::parser_requires_special_tokens( + tool, reasoning + )); + } + assert_eq!( + OpenAIPreprocessor::prompt_injected_reasoning_ended_arg( + Some("deepseek_v41"), + Some("<|Assistant|>"), + ), + Some(false) + ); + assert_eq!( + OpenAIPreprocessor::prompt_injected_reasoning_ended_arg( + Some("deepseek_v41"), + Some("<|Assistant|>"), + ), + None + ); + let disabled = HashMap::from([("thinking".to_string(), serde_json::json!(false))]); + assert!(OpenAIPreprocessor::is_reasoning_disabled_by_request( + Some("deepseek_v41"), + Some(&disabled) + )); + } + #[test] fn guided_tool_streaming_release_only_when_guided_json_and_not_rolled_back() { assert!( @@ -7698,7 +7731,7 @@ mod tests { for route in [ ToolProcessingRoute::MuseUnified("muse_glimmer".to_string()), - ToolProcessingRoute::QwenUnified("qwen3"), + ToolProcessingRoute::Unified("qwen3"), ToolProcessingRoute::ParserV2("qwen3_coder".to_string()), ToolProcessingRoute::PassThrough, ] { diff --git a/lib/llm/src/protocols/openai/chat_completions/aggregator.rs b/lib/llm/src/protocols/openai/chat_completions/aggregator.rs index 609ac3d79d75..02e22025ef42 100644 --- a/lib/llm/src/protocols/openai/chat_completions/aggregator.rs +++ b/lib/llm/src/protocols/openai/chat_completions/aggregator.rs @@ -2648,6 +2648,41 @@ mod tests { assert_eq!(tool_calls[0].function.arguments, "{\"location\":\"SF\"}"); } + #[tokio::test] + async fn deepseek_v41_batch_recovers_malformed_closed_arguments_as_text() { + let text = concat!( + "<|DSML| calls><|DSML| invoke name=\"get_weather\">", + "<|DSML| parameter name=\"count\" string=\"false\">not-json", + "" + ); + let annotated_delta = create_test_delta( + 0, + text, + Some(dynamo_protocols::types::Role::Assistant), + Some(dynamo_protocols::types::FinishReason::Stop), + None, + None, + ); + let stream = Box::pin(stream::iter(vec![annotated_delta])); + + let result = DeltaAggregator::apply( + stream, + ParsingOptions::new( + Some("deepseek_v41".to_string()), + Some("deepseek_v41".to_string()), + ), + ) + .await; + + let response = result.expect("malformed parser output should fall back to text"); + let choice = &response.inner.choices[0]; + assert_eq!( + choice.message.content, + Some(ChatCompletionMessageContent::Text(text.to_string())) + ); + assert!(choice.message.tool_calls.is_none()); + } + #[tokio::test] async fn test_disabled_tool_parsing_preserves_structured_content_with_name() { let json = r#"{"name":"Science Fair","date":"Friday","participants":["Alice","Bob"]}"#; diff --git a/lib/llm/src/protocols/openai/chat_completions/tool_parser_v2.rs b/lib/llm/src/protocols/openai/chat_completions/tool_parser_v2.rs index 5ceed0754c3b..45e391ff7339 100644 --- a/lib/llm/src/protocols/openai/chat_completions/tool_parser_v2.rs +++ b/lib/llm/src/protocols/openai/chat_completions/tool_parser_v2.rs @@ -66,23 +66,22 @@ pub(crate) fn supports_family(family: &str) -> bool { V2_FAMILIES.contains(&family) } -/// Families served by the v2 UNIFIED parser (reasoning + content + tool calls in -/// ONE ordered pass), default-on — no `DYN_ENABLE_EXPERIMENTAL_PARSERS_V2` gate. +/// Parser names served by a v2 UNIFIED parser (reasoning + content + tool calls in +/// ONE ordered pass), exposed to configuration and Python. +/// +/// These parsers are default-on — no `DYN_ENABLE_EXPERIMENTAL_PARSERS_V2` gate. /// Muse has no usable v1 reasoning parser (the v1 crate dropped the variant, so /// `get_reasoning_parser_from_name` falls back to `Basic`, which cannot read the /// `to=self<|message|>` grammar), so the unified pass is the only correct path. -/// Strings match dynamo's parser names. -/// The two names the FRAMEWORKS register, so a card written against either engine +/// The two Muse names match those the frameworks register, so a card written against either engine /// selects the same parser here: vLLM ships `--reasoning-parser muse_glimmer` and /// `--tool-call-parser muse_glimmer`, SGLang registers the family as `muse` in both /// its reasoning and function-call registries. A hyphenated spelling matches neither /// engine, so it is not accepted. -pub(crate) const UNIFIED_FAMILIES: &[&str] = &["muse_glimmer", "muse"]; +/// DeepSeek V4.1 is selected separately by `unified_parser::configured_family`, +/// which requires both parser fields to name `deepseek_v41`. +pub(crate) const UNIFIED_FAMILIES: &[&str] = &["muse_glimmer", "muse", "deepseek_v41"]; -/// The parser names that route through the muse unified pass. Public accessor for -/// [`UNIFIED_FAMILIES`] so the Python bindings can add muse to the selectable -/// tool-call and reasoning parser names — fc's v1 registries dropped muse, so this -/// is the only source of truth for the unified names. pub fn unified_family_names() -> &'static [&'static str] { UNIFIED_FAMILIES } @@ -96,7 +95,7 @@ pub(crate) fn unified_family( tool_call_parser: Option<&str>, reasoning_parser: Option<&str>, ) -> Option { - let is_muse = |p: Option<&str>| UNIFIED_FAMILIES.contains(&p.unwrap_or_default()); + let is_muse = |p: Option<&str>| matches!(p, Some("muse_glimmer" | "muse")); (is_muse(tool_call_parser) || is_muse(reasoning_parser)).then(|| "muse_glimmer".to_string()) } @@ -1499,7 +1498,14 @@ mod tests { // leaves its byte-for-byte original path untouched. #[test] fn unified_family_returns_none_for_other_families() { - for other in ["deepseek_v4", "qwen3", "glm47", "harmony", "nemotron_deci"] { + for other in [ + "deepseek_v4", + "deepseek_v41", + "qwen3", + "glm47", + "harmony", + "nemotron_deci", + ] { assert_eq!(unified_family(Some(other), None), None, "{other} tool"); assert_eq!(unified_family(None, Some(other)), None, "{other} reasoning"); } diff --git a/lib/llm/src/protocols/openai/chat_completions/unified_parser.rs b/lib/llm/src/protocols/openai/chat_completions/unified_parser.rs index a5dc02c5a974..4b48c1a50677 100644 --- a/lib/llm/src/protocols/openai/chat_completions/unified_parser.rs +++ b/lib/llm/src/protocols/openai/chat_completions/unified_parser.rs @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -//! Opt-in ordered reasoning, text, and tool-call parsing through one state machine. +//! Ordered reasoning, text, and tool-call parsing through one state machine. //! -//! Gated behind +//! Qwen3 is gated behind //! [`DYN_ENABLE_EXPERIMENTAL_PARSERS_V2`](dynamo_runtime::config::environment_names::llm::DYN_ENABLE_EXPERIMENTAL_PARSERS_V2). //! //! # What this replaces @@ -67,6 +67,7 @@ use dynamo_protocols::types::ChatCompletionToolChoiceOption; /// the same XML grammar; `qwen3` is the canonical registry name and the one the /// conformance corpus uses, so it is what this module passes and logs. pub(crate) const QWEN3_UNIFIED_FAMILY: &str = "qwen3"; +pub(crate) const DEEPSEEK_V41_UNIFIED_FAMILY: &str = "deepseek_v41"; /// Dynamo's `--dyn-tool-call-parser` name that pairs into [`QWEN3_UNIFIED_FAMILY`]. const QWEN3_TOOL_CALL_PARSER: &str = "qwen3_coder"; @@ -104,6 +105,9 @@ pub(crate) fn configured_family( ) -> Option<&'static str> { match (tool_call_parser, reasoning_parser) { (Some(QWEN3_TOOL_CALL_PARSER), Some(QWEN3_REASONING_PARSER)) => Some(QWEN3_UNIFIED_FAMILY), + (Some(DEEPSEEK_V41_UNIFIED_FAMILY), Some(DEEPSEEK_V41_UNIFIED_FAMILY)) => { + Some(DEEPSEEK_V41_UNIFIED_FAMILY) + } _ => None, } } @@ -130,7 +134,7 @@ pub(crate) fn selected_family( ); configured.filter(|family| match *family { QWEN3_UNIFIED_FAMILY => experimental_parsers_v2_enabled(), - // A family with no opt-in flag stays off; adding one here is what turns it on. + DEEPSEEK_V41_UNIFIED_FAMILY => true, _ => false, }) } @@ -154,6 +158,7 @@ pub(crate) fn selected_batch_family( ) -> Option<&'static str> { configured_batch_family(tool_call_parser, reasoning_parser).filter(|family| match *family { QWEN3_UNIFIED_FAMILY => experimental_parsers_v2_enabled(), + DEEPSEEK_V41_UNIFIED_FAMILY => true, _ => false, }) } @@ -175,9 +180,7 @@ pub(crate) fn stream_prefill( // Qwen3's generation prompt ends at the assistant header with no channel open, // so the model emits `` itself when it thinks. QWEN3_UNIFIED_FAMILY => UnifiedParserStartingState::None, - // A family whose non-thinking prompt ends INSIDE the visible response channel - // would return `Response` here. None exists yet; an unknown family gets the - // conservative answer, which is to assume the model opens its own channels. + DEEPSEEK_V41_UNIFIED_FAMILY => UnifiedParserStartingState::Response, _ => UnifiedParserStartingState::None, } } @@ -231,7 +234,7 @@ fn bare_guided_json_prefill( /// neither marker means reasoning never ran for this turn. fn detect_prefill(family: &str, content: &str) -> anyhow::Result { match family { - QWEN3_UNIFIED_FAMILY => { + QWEN3_UNIFIED_FAMILY | DEEPSEEK_V41_UNIFIED_FAMILY => { // Compare FIRST-occurrence positions, not mere presence: a prompt that // pre-opened reasoning produces a leading `` with no opener before // it, but a later `...` pair from the model can still follow @@ -1496,6 +1499,164 @@ mod tests { // --- selected_family / configured_family ------------------------------------- + #[test] + fn deepseek_v41_uses_native_parsing_without_an_experimental_flag() { + let pair = (Some("deepseek_v41"), Some("deepseek_v41")); + assert_eq!(configured_family(pair.0, pair.1), Some("deepseek_v41")); + assert_eq!(selected_family(pair.0, pair.1), Some("deepseek_v41")); + assert_eq!(selected_batch_family(pair.0, pair.1), Some("deepseek_v41")); + assert_eq!(configured_family(Some("deepseek_v41"), Some("qwen3")), None); + assert_eq!(configured_family(Some("deepseek_v41"), None), None); + assert_eq!(configured_family(None, Some("deepseek_v41")), None); + } + + #[tokio::test] + async fn deepseek_v41_preserves_calls_across_utf8_chunk_boundaries() { + let call = concat!( + "<|DSML| calls><|DSML| invoke name=\"get_weather\">", + "<|DSML| parameter name=\"city\" string=\"true\">東京", + "" + ); + for (prefix, prefill, reasoning) in [ + ("", UnifiedParserStartingState::Response, ""), + ( + "plan", + UnifiedParserStartingState::Reasoning, + "plan", + ), + ( + "plan", + UnifiedParserStartingState::None, + "plan", + ), + ] { + let input = format!("{prefix}{call}"); + let batch = parse_complete( + DEEPSEEK_V41_UNIFIED_FAMILY, + &input, + &GuidedToolConstraint::None, + &[], + ) + .unwrap(); + assert_eq!(batch.reasoning, reasoning); + assert_eq!(batch.tool_calls.len(), 1); + assert_eq!(batch.tool_calls[0].function.arguments, r#"{"city":"東京"}"#); + for split in input.char_indices().map(|(index, _)| index) { + let (first, second) = input.split_at(split); + let responses = apply_stream( + stream::iter([chunk(first, false), chunk(second, true)]), + Some(weather_tools()), + None, + false, + prefill, + DEEPSEEK_V41_UNIFIED_FAMILY, + ) + .collect::>() + .await; + let mut expected = Vec::new(); + if !reasoning.is_empty() { + expected.push(LogicalEvent::Reasoning(reasoning.to_string())); + } + expected.push(LogicalEvent::Tool { + index: 0, + name: Some("get_weather".to_string()), + arguments: r#"{"city":"東京"}"#.to_string(), + }); + let mut actual = logical_events(&responses); + for event in &mut actual { + if let LogicalEvent::Tool { arguments, .. } = event { + *arguments = serde_json::from_str::(arguments) + .unwrap() + .to_string(); + } + } + assert_eq!(actual, expected, "split={split}"); + assert_eq!( + collect_choices(&responses).last().unwrap().finish_reason, + Some(FinishReason::ToolCalls) + ); + } + } + } + + #[tokio::test] + async fn deepseek_v41_complete_call_survives_missing_outer_closer() { + // Model the frontend hiding an EOS token that is also the outer DSML + // closer. A complete invocation is committed at ``, so + // removing only `` must not drop the call. + let input = concat!( + "<|DSML| calls><|DSML| invoke name=\"get_weather\">", + "<|DSML| parameter name=\"city\" string=\"true\">Tokyo", + "" + ); + + let batch = parse_complete( + DEEPSEEK_V41_UNIFIED_FAMILY, + input, + &GuidedToolConstraint::None, + &weather_tools(), + ) + .unwrap(); + assert_eq!(batch.tool_calls.len(), 1); + assert_eq!(batch.tool_calls[0].function.name, "get_weather"); + assert_eq!( + batch.tool_calls[0].function.arguments, + r#"{"city":"Tokyo"}"# + ); + + let responses = apply_stream( + stream::iter([chunk(input, true)]), + Some(weather_tools()), + None, + false, + UnifiedParserStartingState::Response, + DEEPSEEK_V41_UNIFIED_FAMILY, + ) + .collect::>() + .await; + assert!(responses.iter().all(|response| !response.is_error())); + assert_eq!( + logical_events(&responses), + vec![LogicalEvent::Tool { + index: 0, + name: Some("get_weather".to_string()), + arguments: r#"{"city":"Tokyo"}"#.to_string(), + }] + ); + assert_eq!( + collect_choices(&responses).last().unwrap().finish_reason, + Some(FinishReason::ToolCalls) + ); + } + + #[tokio::test] + async fn deepseek_v41_recovers_malformed_closed_arguments_as_text() { + let text = concat!( + "<|DSML| calls><|DSML| invoke name=\"get_weather\">", + "<|DSML| parameter name=\"count\" string=\"false\">not-json", + "" + ); + let responses = apply_stream( + stream::iter([chunk(text, true)]), + Some(weather_tools()), + None, + false, + UnifiedParserStartingState::Response, + DEEPSEEK_V41_UNIFIED_FAMILY, + ) + .collect::>() + .await; + assert!(responses.iter().all(|response| !response.is_error())); + assert_eq!( + logical_events(&responses), + vec![LogicalEvent::Text(text.to_string())] + ); + assert_eq!( + collect_choices(&responses).last().unwrap().finish_reason, + Some(FinishReason::Stop) + ); + } + #[test] fn pairs_only_qwen3_coder_with_qwen3() { assert_eq!( @@ -1763,6 +1924,7 @@ mod tests { tool_index, name: name.map(str::to_string), arguments: arguments.to_string(), + complete: true, }) } diff --git a/lib/llm/src/protocols/openai/responses/mod.rs b/lib/llm/src/protocols/openai/responses/mod.rs index 7176675af250..8e0c2070af21 100644 --- a/lib/llm/src/protocols/openai/responses/mod.rs +++ b/lib/llm/src/protocols/openai/responses/mod.rs @@ -373,23 +373,27 @@ fn convert_input_content_to_text(content: &[InputContent]) -> String { .join("") } -/// Counterpart to `convert_input_content_to_text` for upstream's -/// `InputContent`. Reachable only via `FunctionCallOutput::Content`, which is -/// not Dynamo-owned and therefore carries upstream variants. The sibling -/// `EasyInputContent::ContentList` is Dynamo-owned and routed through -/// `convert_input_content_to_text` / `convert_input_content_to_user_content`. -fn convert_upstream_input_content_to_text( - content: &[dynamo_protocols::types::responses::UpstreamInputContent], -) -> String { - use dynamo_protocols::types::responses::UpstreamInputContent; - content - .iter() - .filter_map(|p| match p { - UpstreamInputContent::InputText(t) => Some(t.text.as_str()), - _ => None, - }) - .collect::>() - .join("") +/// Convert function-call output content to the plain text representation that +/// Chat Completions tool messages accept. +/// +/// Images and files have no faithful representation in a tool message. Reject +/// them instead of silently dropping the parts and potentially sending an empty +/// tool result to the model. +fn convert_function_call_output_content_to_text( + content: &[InputContent], +) -> Result { + for part in content { + let unsupported = match part { + InputContent::InputText(_) => continue, + InputContent::InputImage(_) => "Image", + InputContent::InputFile(_) => "File", + }; + return Err(ResponsesConversionError::UnsupportedContent(format!( + "{unsupported} function call output content is not yet supported" + )) + .into()); + } + Ok(convert_input_content_to_text(content)) } /// Accumulator for consecutive assistant-side items (OutputMessage, FunctionCall, @@ -560,7 +564,7 @@ fn convert_input_items_to_messages( let output_text = match &fco.output { FunctionCallOutput::Text(text) => text.clone(), FunctionCallOutput::Content(parts) => { - convert_upstream_input_content_to_text(parts) + convert_function_call_output_content_to_text(parts)? } }; messages.push(ChatCompletionRequestMessage::Tool( @@ -1391,6 +1395,25 @@ mod tests { } } + fn make_response_with_function_output(output: FunctionCallOutput) -> NvCreateResponse { + NvCreateResponse { + inner: CreateResponse { + input: InputParam::Items(vec![InputItem::Item(Item::FunctionCallOutput( + FunctionCallOutputItemParam { + call_id: "call_123".into(), + output, + id: None, + status: None, + }, + ))]), + model: Some("test-model".into()), + ..Default::default() + }, + nvext: None, + chat_template_args: None, + } + } + fn requested_reasoning_params() -> ResponseParams { use dynamo_protocols::types::responses::ReasoningSummary; @@ -1910,6 +1933,61 @@ mod tests { assert!(matches!(messages[2], ChatCompletionRequestMessage::Tool(_))); } + #[test] + fn test_function_call_output_text_content_is_preserved() { + let output = FunctionCallOutput::Content(vec![ + InputContent::InputText(InputTextContent { + text: "first".into(), + }), + InputContent::InputText(InputTextContent { + text: " second".into(), + }), + ]); + + let chat_req: NvCreateChatCompletionRequest = make_response_with_function_output(output) + .try_into() + .unwrap(); + let ChatCompletionRequestMessage::Tool(message) = &chat_req.inner.messages[0] else { + panic!("expected tool message"); + }; + assert_eq!( + message.content, + ChatCompletionRequestToolMessageContent::Text("first second".into()) + ); + } + + #[test] + fn test_function_call_output_content_rejects_images_and_files() { + for (part, expected_error) in [ + ( + serde_json::json!({ + "type": "input_image", + "image_url": "https://example.com/image.png" + }), + "Image function call output content is not yet supported", + ), + ( + serde_json::json!({ + "type": "input_file", + "file_data": "data:text/plain;base64,aGVsbG8=" + }), + "File function call output content is not yet supported", + ), + ] { + let output: FunctionCallOutput = + serde_json::from_value(serde_json::json!([part])).unwrap(); + let error = + NvCreateChatCompletionRequest::try_from(make_response_with_function_output(output)) + .unwrap_err(); + + assert_eq!(error.to_string(), expected_error); + assert!(matches!( + error.downcast_ref::(), + Some(ResponsesConversionError::UnsupportedContent(_)) + )); + } + } + #[test] fn test_function_call_with_interstitial_assistant_message_is_coalesced() { // Regression: prior turn was `function_call` + assistant text + `function_call_output`. diff --git a/lib/llm/tests/deepseek_v41_renderer.rs b/lib/llm/tests/deepseek_v41_renderer.rs new file mode 100644 index 000000000000..fef325831eaa --- /dev/null +++ b/lib/llm/tests/deepseek_v41_renderer.rs @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use dynamo_llm::protocols::openai::chat_completions::NvCreateChatCompletionRequest; +use dynamo_renderer::{OAIPromptFormatter, deepseek::v41::DeepSeekV41Formatter}; +use serde_json::{Value, json}; + +fn render(fields: Value) -> anyhow::Result { + let mut payload = + json!({"model":"deepseek-v4.1", "messages":[{"role":"user", "content":"Hello"}]}); + payload + .as_object_mut() + .unwrap() + .extend(fields.as_object().unwrap().clone()); + let mut request: NvCreateChatCompletionRequest = serde_json::from_value(payload)?; + request.normalize_reasoning_template_args()?; + DeepSeekV41Formatter.render(&request) +} + +#[test] +fn normalized_effort_matches_the_reference_encoder_for_both_request_fields() { + assert!(render(json!({})).unwrap().contains("Reasoning Effort: 75 ")); + assert!(render(json!({"reasoning_effort":"xhigh"})).is_err()); + for field in ["chat_template_args", "chat_template_kwargs"] { + for (effort, budget) in [("low", 50), ("high", 75), ("max", 100)] { + for fields in [ + json!({"reasoning_effort":effort}), + json!({(field):{"reasoning_effort":effort}}), + ] { + let output = render(fields).unwrap(); + assert!(output.contains(&format!("Reasoning Effort: {budget} "))); + assert!(output.ends_with("")); + } + } + assert!( + render(json!({(field):{"reasoning_effort":37}})) + .unwrap() + .contains("Reasoning Effort: 37 ") + ); + assert!( + render(json!({"reasoning_effort":"low",(field):{"reasoning_effort":37}})) + .unwrap() + .contains("Reasoning Effort: 50 ") + ); + for fields in [ + json!({"reasoning_effort":"none"}), + json!({(field):{"reasoning_effort":"none"}}), + json!({(field):{"thinking":false}}), + ] { + let output = render(fields).unwrap(); + assert!(!output.contains("Reasoning Effort:")); + assert!(output.ends_with("")); + } + for invalid in [ + json!(0), + json!(101), + json!(true), + json!(1.5), + json!("xhigh"), + ] { + assert!(render(json!({(field):{"reasoning_effort":invalid}})).is_err()); + } + } +} From ecb92bd8f55fdb4ead6ae620642aa88247e19db7 Mon Sep 17 00:00:00 2001 From: Peter Pan Date: Fri, 18 Sep 2026 14:42:20 +0800 Subject: [PATCH 104/191] fix(frontend): reject boundary-only reasoning parsers at engine setup (#14991) Signed-off-by: Peter Pan Co-authored-by: Ryan McCormick --- .../tests/test_vllm_processor_unit.py | 100 ++++++++++++++++++ .../src/dynamo/frontend/vllm_processor.py | 59 +++++++++++ 2 files changed, 159 insertions(+) diff --git a/components/src/dynamo/frontend/tests/test_vllm_processor_unit.py b/components/src/dynamo/frontend/tests/test_vllm_processor_unit.py index 60d8aeee2398..86593101f705 100644 --- a/components/src/dynamo/frontend/tests/test_vllm_processor_unit.py +++ b/components/src/dynamo/frontend/tests/test_vllm_processor_unit.py @@ -1008,6 +1008,106 @@ def test_kv_router_copies_reasoning_metadata_to_extra_args(self): } +class TestReasoningParserOutputCapability: + def test_harmony_note_only_for_gptoss(self): + from dynamo.frontend.vllm_processor import ( + _ensure_reasoning_parser_output_capable, + ) + + class BoundaryOnlyParser: + def __init__(self, tokenizer, *args, **kwargs): + pass + + def extract_reasoning_streaming(self, *args): + raise NotImplementedError("boundary detection only") + + with pytest.raises(RuntimeError, match="boundary detection") as exc_info: + _ensure_reasoning_parser_output_capable( + "future_parser", BoundaryOnlyParser, object(), {}, None + ) + assert "HarmonyParser" not in str(exc_info.value) + + with pytest.raises(RuntimeError, match="HarmonyParser"): + _ensure_reasoning_parser_output_capable( + "openai_gptoss", BoundaryOnlyParser, object(), {}, None + ) + + def test_output_capable_parser_accepted(self): + from dynamo.frontend.vllm_processor import ( + _ensure_reasoning_parser_output_capable, + ) + + class WorkingParser: + def __init__(self, tokenizer, *args, **kwargs): + pass + + def extract_reasoning_streaming(self, *args): + return None + + _ensure_reasoning_parser_output_capable( + "fake", WorkingParser, object(), {}, None + ) + + def test_probe_tolerates_other_empty_input_failures(self): + from dynamo.frontend.vllm_processor import ( + _ensure_reasoning_parser_output_capable, + ) + + class PickyParser: + def __init__(self, tokenizer, *args, **kwargs): + pass + + def extract_reasoning_streaming(self, *args): + raise IndexError("empty input") + + _ensure_reasoning_parser_output_capable("fake", PickyParser, object(), {}, None) + + def test_incompatible_signature_rejected(self): + from dynamo.frontend.vllm_processor import ( + _ensure_reasoning_parser_output_capable, + ) + + class WrongSignatureParser: + def __init__(self, tokenizer, *args, **kwargs): + pass + + def extract_reasoning_streaming(self, delta_text): + return None + + with pytest.raises(RuntimeError, match="signature"): + _ensure_reasoning_parser_output_capable( + "fake", WrongSignatureParser, object(), {}, None + ) + + def test_real_gptoss_parser_rejected(self): + pytest.importorskip("vllm.reasoning.gptoss_reasoning_parser") + from vllm.reasoning import ReasoningParserManager + + from dynamo.frontend.vllm_processor import ( + _ensure_reasoning_parser_output_capable, + ) + + class GptOssTokenizer: + vocab = {"<|end|>": 1} + encoded = { + "<|channel|>final": [2], + "<|message|>": [3], + "<|start|>assistant<|channel|>final<|message|>": [4], + } + + def encode(self, text, *args, **kwargs): + return self.encoded[text] + + def get_vocab(self): + return self.vocab + + parser_class = ReasoningParserManager.get_reasoning_parser("openai_gptoss") + with pytest.raises(RuntimeError, match="openai_gptoss"): + _ensure_reasoning_parser_output_capable( + "openai_gptoss", parser_class, GptOssTokenizer(), {}, None + ) + + @pytest.mark.asyncio @pytest.mark.multimodal async def test_build_engine_inputs_preserves_multimodal_uuids( diff --git a/components/src/dynamo/frontend/vllm_processor.py b/components/src/dynamo/frontend/vllm_processor.py index ac17a343fe8f..e68322625863 100644 --- a/components/src/dynamo/frontend/vllm_processor.py +++ b/components/src/dynamo/frontend/vllm_processor.py @@ -6,6 +6,7 @@ # import asyncio +import inspect import json import logging import os @@ -238,6 +239,57 @@ class _ReasoningParserMetadata: parser_kwargs: dict[str, Any] | None +def _ensure_reasoning_parser_output_capable( + parser_name: str, + parser_class: type[ReasoningParser], + tokenizer: TokenizerLike, + chat_template_kwargs: dict[str, Any], + model_config: Any, +) -> None: + # vLLM ships boundary-only parsers (e.g. GptOssReasoningParser) that raise + # NotImplementedError from every output-parsing method, while this + # processor calls extract_reasoning_streaming per request. Probe once here + # so the combination is rejected at engine setup instead of failing every + # request with a 500 (issue #14936). The probe constructor mirrors the + # production construction sites (chat_template_kwargs, model_config). + probe = parser_class( + tokenizer, + chat_template_kwargs=chat_template_kwargs, + model_config=model_config, + ) + try: + inspect.signature(probe.extract_reasoning_streaming).bind( + "", "", "", [], [], [] + ) + except TypeError as e: + raise RuntimeError( + f"reasoning_parser {parser_name!r} ({parser_class.__name__}) has an " + f"extract_reasoning_streaming signature this processor cannot call: {e}" + ) from e + try: + probe.extract_reasoning_streaming("", "", "", [], [], []) + except NotImplementedError as e: + msg = ( + f"reasoning_parser {parser_name!r} ({parser_class.__name__}) only " + "provides boundary detection; this processor needs a parser that " + "implements extract_reasoning_streaming (issue #14936)" + ) + if parser_name == "openai_gptoss": + msg += ( + "; gpt-oss output parsing requires HarmonyParser, which this " + "processor does not support yet" + ) + raise RuntimeError(msg) from e + except Exception as e: + # Parsers are not contracted to accept empty input; the probe only + # proves the method is implemented, so log and accept. + logger.debug( + "reasoning_parser %r probe raised %r on empty input; accepting", + parser_name, + e, + ) + + def _build_reasoning_parser_metadata( reasoning_parser_class: type[ReasoningParser] | None, tokenizer: TokenizerLike, @@ -1225,6 +1277,13 @@ async def chat_engine_factory( reasoning_parser_class = ReasoningParserManager.get_reasoning_parser( reasoning_parser_name ) + _ensure_reasoning_parser_output_capable( + reasoning_parser_name, + reasoning_parser_class, + tokenizer, + getattr(self.flags, "default_chat_template_kwargs", None) or {}, + model_config, + ) else: reasoning_parser_class = None default_thinking_mode = runtime_default_thinking_mode(mdc.runtime_config()) From a9792dbe2402d379232f0aa88eb647cddb78dcab Mon Sep 17 00:00:00 2001 From: GLAMR Date: Fri, 18 Sep 2026 03:27:40 -0400 Subject: [PATCH 105/191] fix(sglang): stop an unsupported --dcp-size worker from crashing mid-request (#14800) Signed-off-by: svc-glamr@nvidia.com Signed-off-by: GLAMR Signed-off-by: Matej Kosec Co-authored-by: Matej Kosec --- components/src/dynamo/sglang/args.py | 119 +++++++++++- components/src/dynamo/sglang/main.py | 2 +- components/src/dynamo/sglang/snapshot.py | 10 +- .../dynamo/sglang/tests/test_sglang_unit.py | 173 ++++++++++++++++++ 4 files changed, 299 insertions(+), 5 deletions(-) diff --git a/components/src/dynamo/sglang/args.py b/components/src/dynamo/sglang/args.py index 3cd344fa2c7c..faeec86d271f 100644 --- a/components/src/dynamo/sglang/args.py +++ b/components/src/dynamo/sglang/args.py @@ -38,6 +38,7 @@ ensure_sglang_tensor_image_size, get_sglang_model_config, resolved_server_args, + sglang_uses_mla_backend, ) from dynamo.sglang.backend_args import DynamoSGLangArgGroup, DynamoSGLangConfig from dynamo.sglang.elastic_ep_preflight import check_elastic_ep_backend @@ -45,6 +46,16 @@ configure_dynamo_logging() PREFILL_DECODE_DISAGGREGATION_MODE = "pd" +# Non-MLA attention backends that read the DCP parallel state in their forward +# path. `aiter` is here because SGLang itself allows dcp_size > 1 on ROCm. +DCP_CAPABLE_ATTENTION_BACKENDS = frozenset({"triton", "aiter"}) + +ATTENTION_BACKEND_CLI_FIELDS = ( + "attention_backend", + "prefill_attention_backend", + "decode_attention_backend", +) + class DynamoConfig(DynamoRuntimeConfig, DynamoSGLangConfig): """Combined configuration container for SGLang server and Dynamo args.""" @@ -67,9 +78,19 @@ def validate(self) -> None: class Config: """Combined configuration container for SGLang server and Dynamo args.""" - def __init__(self, server_args: ServerArgs, dynamo_args: DynamoConfig) -> None: + def __init__( + self, + server_args: ServerArgs, + dynamo_args: DynamoConfig, + *, + attention_backend_from_cli: bool = False, + ) -> None: self.server_args = server_args self.dynamo_args = dynamo_args + # Whether the launch named an attention backend itself. Only the CLI + # knows this; the resolved configuration reports the same field whether + # SGLang chose the value or the user did. + self.attention_backend_from_cli = attention_backend_from_cli self.serving_mode = self._set_serving_strategy() def _set_serving_strategy(self): @@ -82,8 +103,19 @@ def _set_serving_strategy(self): else: return DisaggregationMode.AGGREGATED + def validate_engine_server_args(self, server_args: Any) -> None: + """Re-run the launch checks a built engine's configuration can answer. + + Call this on ``engine.server_args`` before the engine takes a request + of any kind, including a warmup one. + """ + _validate_dcp_attention_backend( + server_args, backend_from_cli=self.attention_backend_from_cli + ) + def use_resolved_server_args(self, server_args: Any) -> Any: """Switch post-runtime Dynamo code to SGLang's resolved configuration.""" + self.validate_engine_server_args(server_args) self.server_args = resolved_server_args(server_args) return self.server_args @@ -193,6 +225,84 @@ def _validate_parser_flags( sys.exit(1) +def _attention_backend_from_cli(parsed_args: Namespace) -> bool: + """Return whether the launch named an attention backend on the command line. + + The phase-specific flags take priority over --attention-backend, so any one + of the three means the backend in force was chosen by the user. + """ + return any( + getattr(parsed_args, field, None) for field in ATTENTION_BACKEND_CLI_FIELDS + ) + + +def _validate_dcp_attention_backend( + server_args: Any, *, backend_from_cli: bool +) -> None: + """Reject --dcp-size > 1 on an attention backend that never reads it. + + SGLang sizes the KV cache pool the DCP way: DCP ranks replicate the KV + heads instead of splitting them, and partition the context dimension. Only + some attention backends honor that in their forward path; the rest still do + a plain tensor-parallel head split, so the two disagree on the KV row width + and the scheduler dies on the first real request. Fail here instead, before + the worker registers and starts taking traffic. + + Call this twice: once on the arguments the CLI produced, which catches a + backend the user named, and once on the engine's own configuration, which + is the only place a backend SGLang chose for itself can be read. SGLang + 0.5.19 keeps ``ServerArgs`` at what the caller asked for and resolves in a + separate pass, so at CLI time an automatic backend is still ``None``. + """ + # Diffusion/video argument stubs and older SGLang releases omit dcp_size. + dcp_size = int(getattr(server_args, "dcp_size", 1) or 1) + if dcp_size <= 1: + return + + # MLA KV pools have no per-rank KV head split to disagree about, and every + # MLA attention backend consumes the DCP parallel state. + if sglang_uses_mla_backend(server_args): + return + + # Read the effective backend, not the flag the user typed: fa3 is the + # automatic choice for an MHA model on Hopper with no --attention-backend. + resolved = resolved_server_args(server_args) + base_backend = getattr(resolved, "attention_backend", None) + phase_backends = { + "prefill": getattr(resolved, "prefill_attention_backend", None) or base_backend, + "decode": getattr(resolved, "decode_attention_backend", None) or base_backend, + } + + unsupported = sorted( + (phase, backend) + for phase, backend in phase_backends.items() + # A backend SGLang has not decided yet is unknown, not unsupported. At + # CLI time that is every automatic backend; the engine's configuration + # carries the decision, and this runs again there. + if backend is not None and backend not in DCP_CAPABLE_ATTENTION_BACKENDS + ) + if not unsupported: + return + + named = ", ".join( + f"{phase} attention backend '{backend}'" for phase, backend in unsupported + ) + automatic = ( + "" + if backend_from_cli + else " SGLang selected it automatically because no attention backend was passed." + ) + raise ValueError( + f"--dcp-size {dcp_size} is not supported with the {named}.{automatic} " + "Decode context parallel replicates the KV heads across DCP ranks when " + "it sizes the KV cache pool, but this backend still splits them across " + "tensor-parallel ranks, so the worker crashes on its first request. " + "Use --dcp-size 1, or an attention backend that implements decode " + "context parallel (--attention-backend triton), or an MLA model with " + "one of SGLang's MLA attention backends." + ) + + def _has_cli_flag(args: list[str], flag: str) -> bool: """Return True when a CLI flag is present in '--flag val' or '--flag=val' form.""" return any(arg == flag or arg.startswith(f"{flag}=") for arg in args) @@ -664,6 +774,9 @@ async def parse_args(args: list[str]) -> Config: "values are always higher priority at the API layer." ) + backend_from_cli = _attention_backend_from_cli(parsed_args) + _validate_dcp_attention_backend(server_args, backend_from_cli=backend_from_cli) + if dynamo_config.use_sglang_tokenizer: warnings.warn( "--use-sglang-tokenizer is deprecated and will be removed in a future " @@ -704,7 +817,9 @@ async def parse_args(args: list[str]) -> Config: logging.debug(f"Dynamo configs: {dynamo_config}") - return Config(server_args, dynamo_config) + return Config( + server_args, dynamo_config, attention_backend_from_cli=backend_from_cli + ) @contextlib.contextmanager diff --git a/components/src/dynamo/sglang/main.py b/components/src/dynamo/sglang/main.py index 4ab641da9b18..427207d68a60 100644 --- a/components/src/dynamo/sglang/main.py +++ b/components/src/dynamo/sglang/main.py @@ -64,7 +64,7 @@ async def worker(argv: list[str] | None = None): # Snapshot mode: engine must be created before runtime so CRIU captures no # NATS/etcd connections. - snapshot_controller = await prepare_snapshot_engine(config.server_args) + snapshot_controller = await prepare_snapshot_engine(config) dynamo_args = config.dynamo_args snapshot_engine = None diff --git a/components/src/dynamo/sglang/snapshot.py b/components/src/dynamo/sglang/snapshot.py index 5e47fcbb1d4b..2a4086726cec 100644 --- a/components/src/dynamo/sglang/snapshot.py +++ b/components/src/dynamo/sglang/snapshot.py @@ -8,7 +8,7 @@ import logging import os import time -from typing import Any +from typing import TYPE_CHECKING, Any import sglang as sgl from sglang.srt.managers.io_struct import ( @@ -25,6 +25,9 @@ ) from dynamo.sglang._compat import override_server_args, resolved_server_args +if TYPE_CHECKING: + from dynamo.sglang.args import Config + logger = logging.getLogger(__name__) @@ -141,7 +144,7 @@ async def warmup_engine(engine: sgl.Engine, server_args: Any) -> None: async def prepare_snapshot_engine( - server_args, + config: "Config", ) -> EngineSnapshotController[sgl.Engine] | None: """Single entry point for Dynamo Snapshot integration. @@ -160,6 +163,8 @@ async def prepare_snapshot_engine( if snapshot_config is None: return None + server_args = config.server_args + configure_snapshot_capture_env() logger.info("Snapshot mode enabled (watcher-driven signals)") @@ -190,6 +195,7 @@ async def prepare_snapshot_engine( logger.info( f"SGLang engine loaded in {time.time() - start_time:.2f}s (snapshot mode)" ) + config.validate_engine_server_args(engine.server_args) runtime_server_args = resolved_server_args(engine.server_args) await warmup_engine(engine, runtime_server_args) diff --git a/components/src/dynamo/sglang/tests/test_sglang_unit.py b/components/src/dynamo/sglang/tests/test_sglang_unit.py index 4bdf66077c59..e31fbae1c1c2 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_unit.py +++ b/components/src/dynamo/sglang/tests/test_sglang_unit.py @@ -503,6 +503,179 @@ def resolve(parsed_args): assert config.server_args.incremental_streaming_output is True +def _dcp_server_args_stub(**overrides): + """Minimal resolved ServerArgs surface that parse_args reads.""" + stub = SimpleNamespace( + disaggregation_mode="null", + dllm_algorithm=None, + kv_events_config=None, + dcp_size=1, + attention_backend=None, + prefill_attention_backend=None, + decode_attention_backend=None, + use_mla_backend=lambda: False, + get_model_config=lambda: SimpleNamespace(is_multimodal=False), + ) + for name, value in overrides.items(): + setattr(stub, name, value) + return stub + + +@pytest.mark.asyncio +async def test_parse_args_rejects_dcp_on_backend_without_dcp_support( + monkeypatch, mock_sglang_cli, tmp_path +): + monkeypatch.setattr( + "dynamo.sglang.args.ServerArgs.from_cli_args", + lambda _: _dcp_server_args_stub(dcp_size=2, attention_backend="fa3"), + ) + mock_sglang_cli(model=str(tmp_path)) + + with pytest.raises(ValueError) as excinfo: + await parse_args(sys.argv[1:]) + + message = str(excinfo.value) + assert "'fa3'" in message + assert "--dcp-size 1" in message + assert "automatically" in message + + +@pytest.mark.asyncio +async def test_parse_args_rejects_dcp_on_decode_only_unsupported_backend( + monkeypatch, mock_sglang_cli, tmp_path +): + monkeypatch.setattr( + "dynamo.sglang.args.ServerArgs.from_cli_args", + lambda _: _dcp_server_args_stub( + dcp_size=2, + prefill_attention_backend="triton", + decode_attention_backend="fa3", + ), + ) + mock_sglang_cli(model=str(tmp_path)) + + with pytest.raises(ValueError) as excinfo: + await parse_args(sys.argv[1:]) + + message = str(excinfo.value) + assert "decode attention backend 'fa3'" in message + assert "prefill attention backend" not in message + + +@pytest.mark.asyncio +async def test_parse_args_does_not_call_a_phase_flag_automatic( + monkeypatch, mock_sglang_cli, tmp_path +): + monkeypatch.setattr( + "dynamo.sglang.args.ServerArgs.from_cli_args", + lambda _: _dcp_server_args_stub(dcp_size=2, decode_attention_backend="fa3"), + ) + mock_sglang_cli(model=str(tmp_path), decode_attention_backend="fa3") + + with pytest.raises(ValueError) as excinfo: + await parse_args(sys.argv[1:]) + + message = str(excinfo.value) + assert "decode attention backend 'fa3'" in message + assert "automatically" not in message + + +@pytest.mark.asyncio +async def test_resolved_server_args_rejects_an_automatic_unsupported_backend( + monkeypatch, mock_sglang_cli, tmp_path +): + """The backend SGLang chooses for itself is only readable from the engine. + + On the pinned SGLang release ``ServerArgs`` still holds what the caller + asked for, so a launch that passes no attention backend reaches parse_args + with all three fields unset. The engine resolves fa3 afterwards, and the + check on its configuration is the one that catches it. + """ + cli_server_args = _dcp_server_args_stub(dcp_size=2) + monkeypatch.setattr( + "dynamo.sglang.args.ServerArgs.from_cli_args", lambda _: cli_server_args + ) + mock_sglang_cli(model=str(tmp_path)) + + config = await parse_args(sys.argv[1:]) + assert config.server_args is cli_server_args + + engine_server_args = _dcp_server_args_stub(dcp_size=2, attention_backend="fa3") + with pytest.raises(ValueError) as excinfo: + config.use_resolved_server_args(engine_server_args) + + message = str(excinfo.value) + assert "'fa3'" in message + assert "automatically" in message + assert config.server_args is cli_server_args + + +@pytest.mark.asyncio +async def test_prepare_snapshot_engine_rejects_dcp_before_warmup(monkeypatch): + """Snapshot mode warms the engine with a real request of its own. + + That warmup runs before any init function reaches + ``use_resolved_server_args``, so the snapshot engine has to be checked + where it is built. + """ + from dynamo.sglang import snapshot as sglang_snapshot + + monkeypatch.setattr( + sglang_snapshot, + "SnapshotConfig", + SimpleNamespace(from_env=lambda: SimpleNamespace()), + ) + monkeypatch.setattr(sglang_snapshot, "configure_snapshot_capture_env", lambda: None) + monkeypatch.setattr(sglang_snapshot, "override_server_args", lambda *a, **kw: None) + + engine_server_args = _dcp_server_args_stub(dcp_size=2, attention_backend="fa3") + monkeypatch.setattr( + sglang_snapshot.sgl, + "Engine", + lambda server_args: SimpleNamespace(server_args=engine_server_args), + ) + + warmed = [] + + async def _warmup(engine, server_args): + warmed.append(engine) + + monkeypatch.setattr(sglang_snapshot, "warmup_engine", _warmup) + + config = sglang_args.Config(_dcp_server_args_stub(dcp_size=2), SimpleNamespace()) + + with pytest.raises(ValueError) as excinfo: + await sglang_snapshot.prepare_snapshot_engine(config) + + assert "'fa3'" in str(excinfo.value) + assert warmed == [] + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "overrides", + [ + {"dcp_size": 2, "attention_backend": "triton"}, + {"dcp_size": 1, "attention_backend": "fa3"}, + {"dcp_size": 2, "attention_backend": "fa3", "use_mla_backend": lambda: True}, + ], + ids=["dcp-capable-backend", "dcp-disabled", "mla-model"], +) +async def test_parse_args_accepts_supported_dcp_configurations( + monkeypatch, mock_sglang_cli, tmp_path, overrides +): + server_args = _dcp_server_args_stub(**overrides) + monkeypatch.setattr( + "dynamo.sglang.args.ServerArgs.from_cli_args", lambda _: server_args + ) + mock_sglang_cli(model=str(tmp_path)) + + config = await parse_args(sys.argv[1:]) + + assert config.server_args is server_args + assert config.use_resolved_server_args(server_args) is not None + + @pytest.mark.asyncio async def test_parse_args_applies_dynamo_defaults_before_resolution( monkeypatch, mock_sglang_cli From b5221198016b2cdf5858b7215347b9c45835b103 Mon Sep 17 00:00:00 2001 From: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> Date: Fri, 18 Sep 2026 12:19:22 +0000 Subject: [PATCH 106/191] docs: refresh community events Automated refresh from the public Dynamo Google Calendar. Generated by .github/workflows/community-events-refresh.yml. Signed-off-by: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> --- docs/fern/components/events.generated.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fern/components/events.generated.ts b/docs/fern/components/events.generated.ts index 4955759763a0..28acffa59e02 100644 --- a/docs/fern/components/events.generated.ts +++ b/docs/fern/components/events.generated.ts @@ -22,7 +22,7 @@ export interface DynamoEvent { } /** Generation date in Pacific, YYYY-MM-DD. The calendar grid treats this as "today". */ -export const GENERATED_ON = "2026-09-17"; +export const GENERATED_ON = "2026-09-18"; export const UPCOMING_EVENTS: DynamoEvent[] = []; From 4067d08f7ee2b0b496a652c68dbff20c53de271f Mon Sep 17 00:00:00 2001 From: Julien Mancuso <161955438+julienmancuso@users.noreply.github.com> Date: Fri, 18 Sep 2026 07:32:38 -0600 Subject: [PATCH 107/191] test(operator): cover Grove compilation cache regression (#14960) Signed-off-by: Julien Mancuso --- deploy/operator/internal/dynamo/graph_test.go | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/deploy/operator/internal/dynamo/graph_test.go b/deploy/operator/internal/dynamo/graph_test.go index f2213f4252aa..87bf2a960f0f 100644 --- a/deploy/operator/internal/dynamo/graph_test.go +++ b/deploy/operator/internal/dynamo/graph_test.go @@ -7695,6 +7695,65 @@ func TestGenerateBasePodSpec_ConvertedCompilationCacheMountIsNotDuplicated(t *te } } +func TestGenerateGrovePodCliqueSet_ConvertedCompilationCacheMountIsNotDuplicated(t *testing.T) { + const compilationCachePath = "/home/dynamo/.cache/vllm" + + dgd := &v1alpha1.DynamoGraphDeployment{ + ObjectMeta: metav1.ObjectMeta{Name: "test-dgd", Namespace: "default"}, + Spec: v1alpha1.DynamoGraphDeploymentSpec{ + BackendFramework: string(BackendFrameworkVLLM), + Services: map[string]*v1alpha1.DynamoComponentDeploymentSharedSpec{ + "worker": { + ComponentType: commonconsts.ComponentTypeWorker, + VolumeMounts: []v1alpha1.VolumeMount{ + {Name: "model-cache", MountPoint: "/home/dynamo/.cache/huggingface"}, + {Name: "compilation-cache", MountPoint: compilationCachePath, UseAsCompilationCache: true}, + }, + }, + }, + }, + } + + t.Log("Render the reported v1alpha1 compilation-cache fixture as a Grove PodCliqueSet") + got, err := GenerateGrovePodCliqueSet( + context.Background(), + betaDGD(t, dgd), + &configv1alpha1.OperatorConfiguration{}, + &controller_common.RuntimeConfig{}, + nil, + nil, + nil, + nil, + nil, + ) + require.NoError(t, err) + require.Len(t, got.Spec.Template.Cliques, 1) + require.Len(t, got.Spec.Template.Cliques[0].Spec.PodSpec.Containers, 1) + + t.Log("Verify every rendered mount path is unique and the compilation cache appears once") + mainContainer := got.Spec.Template.Cliques[0].Spec.PodSpec.Containers[0] + mountsByPath := make(map[string]corev1.VolumeMount, len(mainContainer.VolumeMounts)) + for _, mount := range mainContainer.VolumeMounts { + require.NotContains(t, mountsByPath, mount.MountPath, "duplicate mountPath %q", mount.MountPath) + mountsByPath[mount.MountPath] = mount + } + assert.Equal(t, "model-cache", mountsByPath["/home/dynamo/.cache/huggingface"].Name) + assert.Equal(t, "compilation-cache", mountsByPath[compilationCachePath].Name) + assert.False(t, mountsByPath[compilationCachePath].ReadOnly) + + t.Log("Verify the compilation-cache mount retains one writable PVC-backed volume") + var compilationCacheVolumes []corev1.Volume + for _, volume := range got.Spec.Template.Cliques[0].Spec.PodSpec.Volumes { + if volume.Name == "compilation-cache" { + compilationCacheVolumes = append(compilationCacheVolumes, volume) + } + } + require.Len(t, compilationCacheVolumes, 1) + require.NotNil(t, compilationCacheVolumes[0].PersistentVolumeClaim) + assert.Equal(t, "compilation-cache", compilationCacheVolumes[0].PersistentVolumeClaim.ClaimName) + assert.False(t, compilationCacheVolumes[0].PersistentVolumeClaim.ReadOnly) +} + func TestGenerateBasePodSpec_ConvertedCompilationCacheUsesDefaultMount(t *testing.T) { component := &v1alpha1.DynamoComponentDeploymentSharedSpec{ ComponentType: commonconsts.ComponentTypeFrontend, From 829a0a2ffe11e2ee9d9d01988a6d94ce365edb03 Mon Sep 17 00:00:00 2001 From: JulienDarve <86800349+JulienDarve@users.noreply.github.com> Date: Fri, 18 Sep 2026 09:29:55 -0700 Subject: [PATCH 108/191] feat(vllm): add local LoRA sidecar launchers (#14574) Signed-off-by: Julien Darve --- lib/sidecar/vllm/README.md | 24 ++++ lib/sidecar/vllm/launch/agg_lora.sh | 141 +++++++++++++++++++ lib/sidecar/vllm/launch/disagg_lora.sh | 182 +++++++++++++++++++++++++ 3 files changed, 347 insertions(+) create mode 100755 lib/sidecar/vllm/launch/agg_lora.sh create mode 100755 lib/sidecar/vllm/launch/disagg_lora.sh diff --git a/lib/sidecar/vllm/README.md b/lib/sidecar/vllm/README.md index 372914e2dd8d..dcb1cd1e7ae0 100644 --- a/lib/sidecar/vllm/README.md +++ b/lib/sidecar/vllm/README.md @@ -92,6 +92,30 @@ LoRA requires a vLLM build containing NIXL prefill/decode also requires the gRPC numeric-conversion fix in [vllm-project/vllm#54814](https://github.com/vllm-project/vllm/pull/54814). +For local LoRA serving, use [`launch/agg_lora.sh`](launch/agg_lora.sh) or +[`launch/disagg_lora.sh`](launch/disagg_lora.sh). Both print adapter loading examples +and accept `--help` for GPU, port, and cache settings. Load each adapter on both +workers before sending prefill/decode traffic. + +S3 downloads use your existing AWS configuration. To use a local MinIO server, +set its connection details explicitly (also applies to `disagg_lora.sh`): + +```bash +AWS_ENDPOINT_URL_S3=http://localhost:9000 \ +AWS_ACCESS_KEY_ID=minioadmin \ +AWS_SECRET_ACCESS_KEY=minioadmin \ +AWS_REGION=us-east-1 \ +AWS_ALLOW_HTTP=true \ + lib/sidecar/vllm/launch/agg_lora.sh +``` + +The disaggregated launcher uses a private local IPC socket for KV events, with one +data-parallel rank per engine. Custom multi-rank deployments must set +`VLLM_PREFILL_KV_EVENT_ENDPOINT`, replacing `VLLM_PREFILL_KV_EVENT_PORT`. +For TCP, this vLLM publisher requires a wildcard bind address such as +`tcp://*:20081`; a concrete IP makes it connect instead of listen. Restrict access +to that port to trusted consumers because KV events contain request token IDs. + ## Run ### Native Generate compatibility diff --git a/lib/sidecar/vllm/launch/agg_lora.sh b/lib/sidecar/vllm/launch/agg_lora.sh new file mode 100755 index 000000000000..3e806a92f441 --- /dev/null +++ b/lib/sidecar/vllm/launch/agg_lora.sh @@ -0,0 +1,141 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Aggregated LoRA serving (1 GPU). +# Requires vLLM #52840; see ../README.md for runtime requirements. + +set -e + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +export DYNAMO_HOME="${DYNAMO_HOME:-$(readlink -f "$SCRIPT_DIR/../../../..")}" +# shellcheck disable=SC1091 # Resolved relative to this script at runtime. +source "$DYNAMO_HOME/examples/common/gpu_utils.sh" # build_vllm_gpu_mem_args +# shellcheck disable=SC1091 # Resolved relative to this script at runtime. +source "$DYNAMO_HOME/examples/common/launch_utils.sh" # print_launch_banner, wait_any_exit + +MODEL="${MODEL:-Qwen/Qwen3-0.6B}" +LORA_NAME="${LORA_NAME:-codelion/Qwen3-0.6B-accuracy-recovery-lora}" + +EXTRA_ARGS=() +while [[ $# -gt 0 ]]; do + case $1 in + --model) + if [[ $# -lt 2 || "$2" == -* ]]; then + echo "Missing value for --model" + echo "Use --help for usage information" + exit 1 + fi + MODEL="$2" + shift 2 + ;; + -h|--help) + echo "Usage: $0 [--model ] [vLLM engine options...]" + echo + echo "Additional options are passed to the managed vLLM engine." + echo + echo "Environment overrides:" + echo " MODEL Model to serve (default: Qwen/Qwen3-0.6B)" + echo " LORA_NAME Example adapter (default: codelion/Qwen3-0.6B-accuracy-recovery-lora)" + echo " MAX_LORAS GPU-resident adapter capacity (default: 4)" + echo " MAX_LORA_RANK Maximum adapter rank (default: 64)" + echo " DYN_LORA_PATH S3 download root (default: /tmp/dynamo_loras_minio)" + echo " CUDA_VISIBLE_DEVICES GPU assignment (default: 0)" + echo " DYN_HTTP_PORT Dynamo frontend port (default: 8000)" + echo " DYN_SYSTEM_PORT Dynamo sidecar system port (default: 8081)" + echo " VLLM_RS_HTTP_PORT vLLM HTTP port (default: 8100)" + echo " VLLM_GRPC_PORT vLLM gRPC port (default: 50051)" + echo " MAX_MODEL_LEN Maximum model length (default: 4096)" + echo " MAX_CONCURRENT_SEQS Maximum concurrent sequences (default: 2)" + echo " DEFAULT_KV_CACHE_BYTES KV cache cap when not profiling (default: 1119388000)" + exit 0 + ;; + *) + EXTRA_ARGS+=("$1") + shift + ;; + esac +done + +trap dynamo_exit_trap EXIT + +MAX_MODEL_LEN="${MAX_MODEL_LEN:-4096}" +MAX_CONCURRENT_SEQS="${MAX_CONCURRENT_SEQS:-2}" +MAX_LORAS="${MAX_LORAS:-4}" +MAX_LORA_RANK="${MAX_LORA_RANK:-64}" +VLLM_RS_HTTP_PORT="${VLLM_RS_HTTP_PORT:-8100}" +VLLM_GRPC_PORT="${VLLM_GRPC_PORT:-50051}" +CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-0}" + +export DYN_LORA_ENABLED=true +export VLLM_ALLOW_RUNTIME_LORA_UPDATING=true +export DYN_LORA_PATH="${DYN_LORA_PATH:-/tmp/dynamo_loras_minio}" +mkdir -p "$DYN_LORA_PATH" + +# Both processes must see adapter paths at the same absolute location. +if [[ -z "${VLLM_RUNTIME_LORA_ALLOWED_PATH_PREFIXES:-}" ]]; then + HF_CACHE="${HF_HUB_CACHE:-${HF_HOME:-${XDG_CACHE_HOME:-$HOME/.cache}/huggingface}/hub}" + mkdir -p "$HF_CACHE" + export VLLM_RUNTIME_LORA_ALLOWED_PATH_PREFIXES="${DYN_LORA_PATH}:${HF_CACHE}" +fi + +DEFAULT_KV_CACHE_BYTES="${DEFAULT_KV_CACHE_BYTES:-1119388000}" +GPU_MEM_ARGS=$(build_vllm_gpu_mem_args) +if [[ -z "$GPU_MEM_ARGS" ]]; then + GPU_MEM_ARGS="--kv-cache-memory-bytes $DEFAULT_KV_CACHE_BYTES --gpu-memory-utilization 0.01" +fi + +HTTP_PORT="${DYN_HTTP_PORT:-8000}" +SYSTEM_PORT="${DYN_SYSTEM_PORT:-8081}" +print_launch_banner --no-curl "Launching vLLM Native-gRPC Sidecar + LoRA (1 GPU)" "$MODEL" "$HTTP_PORT" \ + "vLLM HTTP: http://127.0.0.1:${VLLM_RS_HTTP_PORT}" \ + "vLLM gRPC: 127.0.0.1:${VLLM_GRPC_PORT}" +echo "" +echo "Once running, test with:" +echo "" +echo " # Load an adapter (file://, hf://, or s3://). The returned lora_id is assigned by vLLM." +echo " curl -s -X POST http://localhost:${SYSTEM_PORT}/v1/loras \\" +echo " -H 'Content-Type: application/json' \\" +echo " -d '{\"lora_name\": \"${LORA_NAME}\", \"source\": {\"uri\": \"hf://${LORA_NAME}\"}}' | jq ." +echo "" +echo " # List loaded adapters" +echo " curl -s http://localhost:${SYSTEM_PORT}/v1/loras | jq ." +echo "" +echo " # Adapter inference" +echo " curl http://localhost:${HTTP_PORT}/v1/chat/completions \\" +echo " -H 'Content-Type: application/json' \\" +echo " -d '{\"model\": \"${LORA_NAME}\", \"messages\": [{\"role\": \"user\", \"content\": \"What is deep learning?\"}], \"max_tokens\": 300, \"temperature\": 0.0}' | jq ." +echo "" +echo " # Base-model inference, for comparison" +echo " curl http://localhost:${HTTP_PORT}/v1/chat/completions \\" +echo " -H 'Content-Type: application/json' \\" +echo " -d '{\"model\": \"${MODEL}\", \"messages\": [{\"role\": \"user\", \"content\": \"What is deep learning?\"}], \"max_tokens\": 300, \"temperature\": 0.0}' | jq ." +echo "" +echo " # Unload" +echo " curl -X DELETE http://localhost:${SYSTEM_PORT}/v1/loras/${LORA_NAME}" +echo "" +echo "==========================================" + +python -m dynamo.frontend & + +# shellcheck disable=SC2086 # GPU_MEM_ARGS intentionally expands into multiple flags. +CUDA_VISIBLE_DEVICES="$CUDA_VISIBLE_DEVICES" \ +vllm-rs serve "$MODEL" \ + --host 127.0.0.1 \ + --port "$VLLM_RS_HTTP_PORT" \ + --grpc-port "$VLLM_GRPC_PORT" \ + --max-model-len "$MAX_MODEL_LEN" \ + -- \ + --enforce-eager \ + --max-num-seqs "$MAX_CONCURRENT_SEQS" \ + --enable-lora \ + --max-loras "$MAX_LORAS" \ + --max-lora-rank "$MAX_LORA_RANK" \ + $GPU_MEM_ARGS \ + "${EXTRA_ARGS[@]}" & + +DYN_SYSTEM_PORT="$SYSTEM_PORT" \ + dynamo-vllm-sidecar \ + --grpc-endpoint "127.0.0.1:${VLLM_GRPC_PORT}" & + +wait_any_exit diff --git a/lib/sidecar/vllm/launch/disagg_lora.sh b/lib/sidecar/vllm/launch/disagg_lora.sh new file mode 100755 index 000000000000..57922ac4f6f4 --- /dev/null +++ b/lib/sidecar/vllm/launch/disagg_lora.sh @@ -0,0 +1,182 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Prefill/decode LoRA serving with NIXL (2 GPUs). +# Requires vLLM #52840 and #54814; load adapters on both workers. + +set -e + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +export DYNAMO_HOME="${DYNAMO_HOME:-$(readlink -f "$SCRIPT_DIR/../../../..")}" +# shellcheck disable=SC1091 # Resolved relative to this script at runtime. +source "$DYNAMO_HOME/examples/common/gpu_utils.sh" # build_vllm_gpu_mem_args +# shellcheck disable=SC1091 # Resolved relative to this script at runtime. +source "$DYNAMO_HOME/examples/common/launch_utils.sh" # print_launch_banner, wait_any_exit + +MODEL="${MODEL:-Qwen/Qwen3-0.6B}" +LORA_NAME="${LORA_NAME:-codelion/Qwen3-0.6B-accuracy-recovery-lora}" + +EXTRA_ARGS=() +while [[ $# -gt 0 ]]; do + case $1 in + --model) + if [[ $# -lt 2 || "$2" == -* ]]; then + echo "Missing value for --model" + echo "Use --help for usage information" + exit 1 + fi + MODEL="$2" + shift 2 + ;; + -h|--help) + echo "Usage: $0 [--model ] [vLLM engine options...]" + echo + echo "Additional options are passed to both managed vLLM engines." + echo + echo "Environment overrides:" + echo " MODEL Model to serve (default: Qwen/Qwen3-0.6B)" + echo " LORA_NAME Example adapter (default: codelion/Qwen3-0.6B-accuracy-recovery-lora)" + echo " MAX_LORAS GPU-resident adapter capacity (default: 4)" + echo " MAX_LORA_RANK Maximum adapter rank (default: 64)" + echo " DYN_LORA_PATH S3 download root (default: /tmp/dynamo_loras_minio)" + echo " DYN_HTTP_PORT Dynamo frontend port (default: 8000)" + echo " DYN_SYSTEM_PORT1 Decode sidecar system port (default: 8081)" + echo " DYN_SYSTEM_PORT2 Prefill sidecar system port (default: 8082)" + echo " VLLM_DECODE_HTTP_PORT Decode vLLM HTTP port (default: 8100)" + echo " VLLM_DECODE_GRPC_PORT Decode vLLM gRPC port (default: 50051)" + echo " VLLM_PREFILL_HTTP_PORT Prefill vLLM HTTP port (default: 8110)" + echo " VLLM_PREFILL_GRPC_PORT Prefill vLLM gRPC port (default: 50052)" + echo " VLLM_DECODE_NIXL_SIDE_CHANNEL_PORT Decode NIXL port (default: 5600)" + echo " VLLM_PREFILL_NIXL_SIDE_CHANNEL_PORT Prefill NIXL port (default: 20097)" + echo " VLLM_PREFILL_KV_EVENT_ENDPOINT KV event endpoint (default: private local IPC socket)" + echo " VLLM_DECODE_GPU Decode GPU index (default: 0)" + echo " VLLM_PREFILL_GPU Prefill GPU index (default: 1)" + echo " MAX_MODEL_LEN Maximum model length (default: 4096)" + echo " MAX_CONCURRENT_SEQS Maximum concurrent sequences (default: 2)" + echo " DEFAULT_KV_CACHE_BYTES KV cache cap when not profiling (default: 1119388000)" + exit 0 + ;; + *) + EXTRA_ARGS+=("$1") + shift + ;; + esac +done + +KV_EVENT_DIR="" +if [[ -z "${VLLM_PREFILL_KV_EVENT_ENDPOINT:-}" ]]; then + KV_EVENT_DIR="$(mktemp -d "${TMPDIR:-/tmp}/dynamo-vllm-kv.XXXXXX")" + VLLM_PREFILL_KV_EVENT_ENDPOINT="ipc://${KV_EVENT_DIR}/events" +fi + +lora_exit_trap() { + local _rc=$? + if [[ -n "$KV_EVENT_DIR" ]]; then + rm -rf -- "$KV_EVENT_DIR" + fi + dynamo_reap_and_exit "$_rc" +} +trap lora_exit_trap EXIT + +MAX_MODEL_LEN="${MAX_MODEL_LEN:-4096}" +MAX_CONCURRENT_SEQS="${MAX_CONCURRENT_SEQS:-2}" +MAX_LORAS="${MAX_LORAS:-4}" +MAX_LORA_RANK="${MAX_LORA_RANK:-64}" +VLLM_DECODE_HTTP_PORT="${VLLM_DECODE_HTTP_PORT:-8100}" +VLLM_DECODE_GRPC_PORT="${VLLM_DECODE_GRPC_PORT:-50051}" +VLLM_PREFILL_HTTP_PORT="${VLLM_PREFILL_HTTP_PORT:-8110}" +VLLM_PREFILL_GRPC_PORT="${VLLM_PREFILL_GRPC_PORT:-50052}" +VLLM_DECODE_GPU="${VLLM_DECODE_GPU:-0}" +VLLM_PREFILL_GPU="${VLLM_PREFILL_GPU:-1}" +VLLM_DECODE_NIXL_SIDE_CHANNEL_PORT="${VLLM_DECODE_NIXL_SIDE_CHANNEL_PORT:-5600}" +VLLM_PREFILL_NIXL_SIDE_CHANNEL_PORT="${VLLM_PREFILL_NIXL_SIDE_CHANNEL_PORT:-20097}" + +export DYN_LORA_ENABLED=true +export VLLM_ALLOW_RUNTIME_LORA_UPDATING=true +export DYN_LORA_PATH="${DYN_LORA_PATH:-/tmp/dynamo_loras_minio}" +mkdir -p "$DYN_LORA_PATH" + +# Both engines must see the adapter cache at the same absolute location. +if [[ -z "${VLLM_RUNTIME_LORA_ALLOWED_PATH_PREFIXES:-}" ]]; then + HF_CACHE="${HF_HUB_CACHE:-${HF_HOME:-${XDG_CACHE_HOME:-$HOME/.cache}/huggingface}/hub}" + mkdir -p "$HF_CACHE" + export VLLM_RUNTIME_LORA_ALLOWED_PATH_PREFIXES="${DYN_LORA_PATH}:${HF_CACHE}" +fi + +DEFAULT_KV_CACHE_BYTES="${DEFAULT_KV_CACHE_BYTES:-1119388000}" +GPU_MEM_ARGS=$(build_vllm_gpu_mem_args) +if [[ -z "$GPU_MEM_ARGS" ]]; then + GPU_MEM_ARGS="--kv-cache-memory-bytes $DEFAULT_KV_CACHE_BYTES --gpu-memory-utilization 0.01" +fi + +HTTP_PORT="${DYN_HTTP_PORT:-8000}" +print_launch_banner "Launching vLLM Native-gRPC Sidecar Disaggregated Serving + LoRA (2 GPUs)" "$MODEL" "$HTTP_PORT" \ + "Decode: GPU ${VLLM_DECODE_GPU}, gRPC 127.0.0.1:${VLLM_DECODE_GRPC_PORT}" \ + "Prefill: GPU ${VLLM_PREFILL_GPU}, gRPC 127.0.0.1:${VLLM_PREFILL_GRPC_PORT}" + +echo "" +echo "Load each adapter on BOTH workers before routing traffic to it:" +echo " for port in ${DYN_SYSTEM_PORT1:-8081} ${DYN_SYSTEM_PORT2:-8082}; do" +echo " curl -s -X POST http://localhost:\$port/v1/loras \\" +echo " -H 'Content-Type: application/json' \\" +echo " -d '{\"lora_name\": \"${LORA_NAME}\", \"source\": {\"uri\": \"hf://${LORA_NAME}\"}}' | jq ." +echo " done" +echo "" +echo " # Adapter inference" +echo " curl http://localhost:${HTTP_PORT}/v1/chat/completions \\" +echo " -H 'Content-Type: application/json' \\" +echo " -d '{\"model\": \"${LORA_NAME}\", \"messages\": [{\"role\": \"user\", \"content\": \"What is deep learning?\"}], \"max_tokens\": 300, \"temperature\": 0.0}' | jq ." +echo "" + +python -m dynamo.frontend & + +# shellcheck disable=SC2086 # GPU_MEM_ARGS intentionally expands into multiple flags. +CUDA_VISIBLE_DEVICES="$VLLM_DECODE_GPU" \ +VLLM_NIXL_SIDE_CHANNEL_PORT="$VLLM_DECODE_NIXL_SIDE_CHANNEL_PORT" \ +vllm-rs serve "$MODEL" \ + --host 127.0.0.1 \ + --port "$VLLM_DECODE_HTTP_PORT" \ + --grpc-port "$VLLM_DECODE_GRPC_PORT" \ + --max-model-len "$MAX_MODEL_LEN" \ + -- \ + --enforce-eager \ + --max-num-seqs "$MAX_CONCURRENT_SEQS" \ + --enable-lora \ + --max-loras "$MAX_LORAS" \ + --max-lora-rank "$MAX_LORA_RANK" \ + --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both"}' \ + $GPU_MEM_ARGS \ + "${EXTRA_ARGS[@]}" & + +# shellcheck disable=SC2086 # GPU_MEM_ARGS intentionally expands into multiple flags. +CUDA_VISIBLE_DEVICES="$VLLM_PREFILL_GPU" \ +VLLM_NIXL_SIDE_CHANNEL_PORT="$VLLM_PREFILL_NIXL_SIDE_CHANNEL_PORT" \ +vllm-rs serve "$MODEL" \ + --host 127.0.0.1 \ + --port "$VLLM_PREFILL_HTTP_PORT" \ + --grpc-port "$VLLM_PREFILL_GRPC_PORT" \ + --max-model-len "$MAX_MODEL_LEN" \ + -- \ + --enforce-eager \ + --max-num-seqs "$MAX_CONCURRENT_SEQS" \ + --enable-lora \ + --max-loras "$MAX_LORAS" \ + --max-lora-rank "$MAX_LORA_RANK" \ + --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both"}' \ + --kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"${VLLM_PREFILL_KV_EVENT_ENDPOINT}\",\"enable_kv_cache_events\":true}" \ + $GPU_MEM_ARGS \ + "${EXTRA_ARGS[@]}" & + +DYN_SYSTEM_PORT="${DYN_SYSTEM_PORT1:-8081}" \ + dynamo-vllm-sidecar \ + --grpc-endpoint "127.0.0.1:${VLLM_DECODE_GRPC_PORT}" \ + --disaggregation-mode decode & + +DYN_SYSTEM_PORT="${DYN_SYSTEM_PORT2:-8082}" \ + dynamo-vllm-sidecar \ + --grpc-endpoint "127.0.0.1:${VLLM_PREFILL_GRPC_PORT}" \ + --component prefill \ + --disaggregation-mode prefill & + +wait_any_exit From 032d8fcac3bdb15915942bbbe1abc3870a417e0a Mon Sep 17 00:00:00 2001 From: Alec <35311602+alec-flowers@users.noreply.github.com> Date: Fri, 18 Sep 2026 09:40:43 -0700 Subject: [PATCH 109/191] fix(sidecar): honor local KV indexing for decode workers (#14981) Signed-off-by: Alec Flowers --- lib/backend-common/AGENTS.md | 5 ++--- lib/backend-common/README.md | 2 +- lib/backend-common/src/worker.rs | 24 +++++++++--------------- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/lib/backend-common/AGENTS.md b/lib/backend-common/AGENTS.md index d31a8a4aff28..f75806a1398c 100644 --- a/lib/backend-common/AGENTS.md +++ b/lib/backend-common/AGENTS.md @@ -255,9 +255,8 @@ What the **`Worker`** does with the mode at registration time: OpenAI surface — dual-emitted for cross-version compat) and `WorkerType::Prefill` regardless of `endpoint_types`, so the frontend's `PrefillRouter` targets it via `worker_type`. -- `Decode` → keep `endpoint_types`, but force-disable - `enable_local_indexer` (decode workers don't host the indexer - endpoint, so they must not advertise it). +- `Decode` → keep `endpoint_types` and honor `enable_local_indexer` + for declared KV event sources, including their recovery endpoints. - `Aggregated` → register with the parsed `endpoint_types`. What an **`LLMEngine`** does with the mode (engine-side dispatch in diff --git a/lib/backend-common/README.md b/lib/backend-common/README.md index 2a8212077cc5..5436b1b4aed3 100644 --- a/lib/backend-common/README.md +++ b/lib/backend-common/README.md @@ -171,7 +171,7 @@ Roles and `Worker` behavior: | --- | --- | --- | | `Aggregated` | Self-contained inference (default) | Standard registration; KV indexer enabled | | `Prefill` | Run prompt → emit 1 token + KV handoff | Registers with `ModelType::empty()` + `WorkerType::Prefill`; advertises `bootstrap_host`/`port` if set in `EngineConfig` | -| `Decode` | Resume from a prefill peer's KV | Disables the local indexer (KV is owned by the prefill peer) | +| `Decode` | Resume from a prefill peer's KV | Honors `enable_local_indexer` for declared KV event sources | The crate re-exports `PrefillResult` and `BootstrapInfo` from [`dynamo-llm`'s protocol types](../llm/src/protocols/common/preprocessor.rs); diff --git a/lib/backend-common/src/worker.rs b/lib/backend-common/src/worker.rs index 4077cb5d488f..1b8a92d7ac40 100644 --- a/lib/backend-common/src/worker.rs +++ b/lib/backend-common/src/worker.rs @@ -160,10 +160,10 @@ pub struct WorkerConfig { /// `endpoint_types`. `Prefill` registers with the legacy `ModelType::Prefill` /// marker bit (no OpenAI surface — dual-emitted for cross-version compat) /// and `WorkerType::Prefill`, so the frontend's prefill router targets it - /// via `worker_type`. `Decode` keeps `endpoint_types` but force-disables the - /// local KV indexer because decode workers do not host the indexer - /// endpoint. `Encode` registers as `WorkerType::Encode` with topology needs - /// `[[Prefill, Decode], [Aggregated]]`; it also force-disables the local KV + /// via `worker_type`. `Decode` keeps `endpoint_types` and honors + /// `enable_local_indexer` for its KV event sources. `Encode` registers as + /// `WorkerType::Encode` with topology needs + /// `[[Prefill, Decode], [Aggregated]]`; it force-disables the local KV /// indexer. pub disaggregation_mode: DisaggregationMode, /// Operator override. `Worker` resolves precedence: this field > @@ -199,12 +199,10 @@ pub struct WorkerConfig { impl WorkerConfig { /// Effective `enable_local_indexer`, accounting for disaggregation - /// mode. Decode and Encode workers force this off because they don't + /// mode. Encode workers force this off because they don't /// host the in-process KV indexer endpoint and must not advertise it. pub(crate) fn effective_enable_local_indexer(&self) -> bool { - self.enable_local_indexer - && !self.disaggregation_mode.is_decode() - && !self.disaggregation_mode.is_encode() + self.enable_local_indexer && !self.disaggregation_mode.is_encode() } } @@ -2080,9 +2078,7 @@ async fn build_local_model( .or_else(|| Some(engine_config.model.clone())) .filter(|s| !s.is_empty()); - // Decode workers don't host the WorkerKvQuery endpoint, so they must not - // advertise the local indexer regardless of the operator-supplied flag. - // Mirrors the vLLM worker-factory path. + // Use the same effective setting for publisher setup and model metadata. let enable_local_indexer = config.effective_enable_local_indexer(); // None for raw engines → all-`None` fields → no KV/DP/bootstrap hints. @@ -2816,7 +2812,7 @@ mod tests { } #[tokio::test] - async fn build_local_model_decode_disables_local_indexer() { + async fn build_local_model_decode_keeps_local_indexer() { let config = WorkerConfig { enable_local_indexer: true, disaggregation_mode: DisaggregationMode::Decode, @@ -2830,9 +2826,7 @@ mod tests { let local_model = build_local_model(&config, &engine_config, false) .await .unwrap(); - // Decode workers cannot host the local indexer endpoint, so the - // worker forces it off even when the operator-supplied flag is true. - assert!(!local_model.runtime_config().enable_local_indexer); + assert!(local_model.runtime_config().enable_local_indexer); } #[tokio::test] From 0bc706bbde2f01dcaf2f423a99ca94638d3de47e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Ant=C3=B3nio?= Date: Fri, 18 Sep 2026 17:51:55 +0100 Subject: [PATCH 110/191] fix(runtime): establish discovery watches before list_and_watch returns (#14769) Signed-off-by: Jorge Antonio --- lib/bindings/python/rust/llm/fpm.rs | 1 + lib/llm/src/direct_zmq_fan_in.rs | 3 +- lib/llm/src/discovery/controller.rs | 91 ++++++ lib/llm/src/discovery/endpoint_card.rs | 1 + lib/llm/src/discovery/kv_source_watch.rs | 3 +- lib/llm/src/discovery/runtime_configs.rs | 1 + lib/llm/src/kv_dc_relay/discovery.rs | 16 ++ lib/llm/src/kv_dc_relay/membership_watch.rs | 78 +++++ .../kv_router/indexer/recovery/direct_zmq.rs | 3 +- .../kv_router/indexer/recovery/state_agent.rs | 3 +- .../kv_router/publisher/state_agent_host.rs | 3 +- lib/runtime/src/component/client.rs | 272 ++++++++++++++++-- lib/runtime/src/discovery/kube.rs | 68 +++-- lib/runtime/src/discovery/kv_store.rs | 141 +++++++-- lib/runtime/src/discovery/mock.rs | 171 +++++++++-- lib/runtime/src/discovery/mod.rs | 37 ++- lib/runtime/src/discovery/utils.rs | 1 + .../pipeline/network/egress/push_router.rs | 9 +- lib/runtime/src/storage/kv.rs | 248 +++++++++++++--- lib/runtime/src/storage/kv/mem.rs | 2 +- .../event_plane/dynamic_subscriber.rs | 1 + 21 files changed, 1012 insertions(+), 141 deletions(-) diff --git a/lib/bindings/python/rust/llm/fpm.rs b/lib/bindings/python/rust/llm/fpm.rs index 947d7929df12..679f5508a0a2 100644 --- a/lib/bindings/python/rust/llm/fpm.rs +++ b/lib/bindings/python/rust/llm/fpm.rs @@ -870,6 +870,7 @@ impl FpmEventSubscriber { ); } } + Some(Ok(DiscoveryEvent::Resync(_))) => {} Some(Err(e)) => { tracing::warn!("FPM tracker: discovery error: {e}"); } diff --git a/lib/llm/src/direct_zmq_fan_in.rs b/lib/llm/src/direct_zmq_fan_in.rs index 97dd2b27863e..a69e26a93f78 100644 --- a/lib/llm/src/direct_zmq_fan_in.rs +++ b/lib/llm/src/direct_zmq_fan_in.rs @@ -323,7 +323,8 @@ async fn run_supervisor( } Ok(DiscoveryEvent::Added(_)) | Ok(DiscoveryEvent::ModelTaintsUpdated(_)) - | Ok(DiscoveryEvent::Removed(_)) => {} + | Ok(DiscoveryEvent::Removed(_)) + | Ok(DiscoveryEvent::Resync(_)) => {} Err(error) => { tracing::warn!(%error, topic, "direct-ZMQ discovery watch failed"); break; diff --git a/lib/llm/src/discovery/controller.rs b/lib/llm/src/discovery/controller.rs index 550fca7427ca..c3bd7ddd23e0 100644 --- a/lib/llm/src/discovery/controller.rs +++ b/lib/llm/src/discovery/controller.rs @@ -281,6 +281,9 @@ pub(crate) struct ModelDiscoveryController { groups: HashMap, revision: u64, instance_revisions: HashMap, + /// The revision at the last `DiscoveryEvent::Resync`. A periodic list that started before + /// it can carry an instance the resync removed, so its result is discarded. + resync_revision: u64, builds: JoinSet>, reconciliations: JoinSet, active_builds: usize, @@ -300,6 +303,7 @@ impl ModelDiscoveryController { groups: HashMap::new(), revision: 0, instance_revisions: HashMap::new(), + resync_revision: 0, builds: JoinSet::new(), reconciliations: JoinSet::new(), active_builds: 0, @@ -391,6 +395,21 @@ impl ModelDiscoveryController { tracing::error!("Unexpected non-model removal in model discovery stream"); false } + DiscoveryEvent::Resync(instances) => { + // A resync supersedes every list that started before it, including one that + // started at the current revision: the events it missed never reached the + // controller, so nothing advanced the revision on their behalf. + self.revision = self.revision.wrapping_add(1); + self.resync_revision = self.revision; + self.apply_reconciliation( + ReconciliationResult { + revision: self.revision, + instances: Ok(instances), + }, + namespace_filter, + ); + false + } }; } @@ -1045,6 +1064,12 @@ impl ModelDiscoveryController { result: ReconciliationResult, namespace_filter: &NamespaceFilter, ) { + if result.revision < self.resync_revision { + tracing::debug!( + "Discarding a model reconciliation snapshot that predates a discovery resync" + ); + return; + } let instances = match result.instances { Ok(instances) => instances, Err(error) => { @@ -2158,6 +2183,72 @@ mod tests { } } + #[tokio::test] + async fn a_resync_replaces_the_desired_instances() { + let (host, mut starts) = FakeHost::new(); + let mut controller = ModelDiscoveryController::new(host.clone()); + let first = instance(1, "spec"); + let second = instance(2, "spec"); + + controller.apply_added(first.clone()); + controller.start_queued_builds(); + starts.recv().await.unwrap(); + host.release.add_permits(1); + finish_build(&mut controller).await; + assert_eq!( + host.members(&group_key()), + BTreeSet::from([first.key.clone()]) + ); + + controller.apply_event( + DiscoveryEvent::Resync(vec![discovery_instance(&second)]), + &NamespaceFilter::Global, + ); + assert_eq!(host.members(&group_key()), BTreeSet::from([second.key])); + } + + #[tokio::test] + async fn a_list_that_predates_a_resync_cannot_revive_a_removed_instance() { + let (host, _starts) = FakeHost::new(); + let mut controller = ModelDiscoveryController::new(host); + let first = instance(1, "spec"); + + controller.apply_added(first.clone()); + // The periodic list starts here and captures `first` before its removal. + let list_revision = controller.revision; + controller.apply_removed(&first.key); + controller.apply_event(DiscoveryEvent::Resync(Vec::new()), &NamespaceFilter::Global); + controller.apply_reconciliation( + ReconciliationResult { + revision: list_revision, + instances: Ok(vec![discovery_instance(&first)]), + }, + &NamespaceFilter::Global, + ); + assert!(controller.desired.is_empty()); + } + + #[tokio::test] + async fn a_list_that_predates_a_resync_is_discarded_when_no_event_advanced_the_revision() { + let (host, _starts) = FakeHost::new(); + let mut controller = ModelDiscoveryController::new(host); + let first = instance(1, "spec"); + + // The periodic list starts here and captures `first`. Its registration and its + // removal are then both lost to a backend buffer overflow, so no event reaches + // the controller to advance the revision before the resync that follows. + let list_revision = controller.revision; + controller.apply_event(DiscoveryEvent::Resync(Vec::new()), &NamespaceFilter::Global); + controller.apply_reconciliation( + ReconciliationResult { + revision: list_revision, + instances: Ok(vec![discovery_instance(&first)]), + }, + &NamespaceFilter::Global, + ); + assert!(controller.desired.is_empty()); + } + #[tokio::test] async fn reconciliation_repairs_missed_state_without_undoing_newer_events() { let (host, mut starts) = FakeHost::new(); diff --git a/lib/llm/src/discovery/endpoint_card.rs b/lib/llm/src/discovery/endpoint_card.rs index e8961cbb50a8..4f404aed9e17 100644 --- a/lib/llm/src/discovery/endpoint_card.rs +++ b/lib/llm/src/discovery/endpoint_card.rs @@ -62,6 +62,7 @@ pub async fn wait_for_endpoint_model_card( } Ok(DiscoveryEvent::ModelTaintsUpdated(_)) => {} Ok(DiscoveryEvent::Removed(_)) => {} + Ok(DiscoveryEvent::Resync(_)) => {} Err(e) => { tracing::debug!( error = %e, diff --git a/lib/llm/src/discovery/kv_source_watch.rs b/lib/llm/src/discovery/kv_source_watch.rs index 630034ebab0d..85aa7e478cc1 100644 --- a/lib/llm/src/discovery/kv_source_watch.rs +++ b/lib/llm/src/discovery/kv_source_watch.rs @@ -299,7 +299,8 @@ fn reconcile_discovery_event( } Ok(DiscoveryEvent::Added(_)) | Ok(DiscoveryEvent::ModelTaintsUpdated(_)) - | Ok(DiscoveryEvent::Removed(_)) => {} + | Ok(DiscoveryEvent::Removed(_)) + | Ok(DiscoveryEvent::Resync(_)) => {} Err(error) => { tracing::error!(%error, "KV event-source discovery stream failed; rebinding"); *membership = KvSourceMembership::new(); diff --git a/lib/llm/src/discovery/runtime_configs.rs b/lib/llm/src/discovery/runtime_configs.rs index 1ae77bfc9e25..a84f27ead9ff 100644 --- a/lib/llm/src/discovery/runtime_configs.rs +++ b/lib/llm/src/discovery/runtime_configs.rs @@ -96,6 +96,7 @@ fn base_runtime_config_watch( } } Ok(DiscoveryEvent::Removed(_)) => continue, + Ok(DiscoveryEvent::Resync(_)) => continue, Err(error) => { tracing::error!(%error, "Base model runtime-config discovery stream failed"); continue; diff --git a/lib/llm/src/kv_dc_relay/discovery.rs b/lib/llm/src/kv_dc_relay/discovery.rs index ca6209a70431..2264511d4329 100644 --- a/lib/llm/src/kv_dc_relay/discovery.rs +++ b/lib/llm/src/kv_dc_relay/discovery.rs @@ -407,6 +407,7 @@ impl MembershipState { self.cards.remove(&id).is_some() } DiscoveryEvent::Removed(_) => false, + DiscoveryEvent::Resync(instances) => self.replace_all(instances, filter), } } @@ -1094,6 +1095,21 @@ mod tests { assert_ne!(*receiver.borrow_and_update(), initial); } + #[test] + fn a_resync_replaces_the_membership() { + let filter = DcDiscoveryFilter::default(); + let mut state = MembershipState::default(); + let first = instance("generate", 1, None, card("llama", "meta/llama", 64)); + let second = instance("generate", 2, None, card("llama", "meta/llama", 64)); + assert!(state.apply(DiscoveryEvent::Added(first), &filter)); + + assert!(state.apply(DiscoveryEvent::Resync(vec![second.clone()]), &filter)); + let members: Vec = state.cards.keys().map(|id| id.instance_id).collect(); + assert_eq!(members, vec![2]); + + assert!(!state.apply(DiscoveryEvent::Resync(vec![second]), &filter)); + } + #[test] fn reappearing_endpoint_advances_its_generation() { let filter = DcDiscoveryFilter::default(); diff --git a/lib/llm/src/kv_dc_relay/membership_watch.rs b/lib/llm/src/kv_dc_relay/membership_watch.rs index 09fd40b6d841..ca1faa80871d 100644 --- a/lib/llm/src/kv_dc_relay/membership_watch.rs +++ b/lib/llm/src/kv_dc_relay/membership_watch.rs @@ -660,6 +660,84 @@ mod tests { .unwrap(); } + /// A backend that removes one instance when a watch opens. A list that ran before the watch + /// would still show the instance. + struct UnregisterOnWatch { + inner: MockDiscovery, + instance: std::sync::Mutex>, + } + + #[async_trait::async_trait] + impl Discovery for UnregisterOnWatch { + fn instance_id(&self) -> u64 { + self.inner.instance_id() + } + + async fn register_internal( + &self, + spec: DiscoverySpec, + ) -> anyhow::Result { + self.inner.register_internal(spec).await + } + + async fn unregister(&self, instance: DiscoveryInstance) -> anyhow::Result<()> { + self.inner.unregister(instance).await + } + + async fn list(&self, query: DiscoveryQuery) -> anyhow::Result> { + self.inner.list(query).await + } + + async fn list_and_watch( + &self, + query: DiscoveryQuery, + cancel: Option, + ) -> anyhow::Result { + let stale = self.instance.lock().unwrap().take(); + if let Some(stale) = stale { + self.inner.unregister(stale).await?; + } + self.inner.list_and_watch(query, cancel).await + } + } + + /// Startup opens the watch before it lists, so an instance that leaves as the watch opens + /// is not in the first membership. + #[tokio::test] + async fn startup_opens_the_watch_before_it_lists() { + let inner = MockDiscovery::new(Some(1), SharedMockRegistry::new()); + let mut card = ModelDeploymentCard::with_name_only("a"); + card.source_path = Some("test/a".into()); + card.kv_cache_block_size = 64; + card.worker_type = Some(WorkerType::Aggregated); + let stale = inner + .register(DiscoverySpec::Model { + namespace: "a".into(), + component: "worker".into(), + endpoint: "generate".into(), + card_json: serde_json::to_value(card).unwrap(), + model_suffix: None, + }) + .await + .unwrap(); + let discovery: Arc = Arc::new(UnregisterOnWatch { + inner, + instance: std::sync::Mutex::new(Some(stale)), + }); + let membership = DcMembershipWatch::start_sources( + discovery, + crate::kv_dc_relay::host::KvDcRelaySources::Discovery(KvDcRelayDiscoveryConfig { + namespaces: vec!["a".into()], + ..Default::default() + }), + CancellationToken::new(), + ) + .await + .unwrap(); + assert!(membership.receiver.borrow().endpoints.is_empty()); + membership.shutdown().await; + } + #[tokio::test] async fn discovery_tracks_added_and_removed_namespaces_with_endpoint_filters() { let discovery: Arc = diff --git a/lib/llm/src/kv_router/indexer/recovery/direct_zmq.rs b/lib/llm/src/kv_router/indexer/recovery/direct_zmq.rs index 9e41ccbef394..79edf3545efd 100644 --- a/lib/llm/src/kv_router/indexer/recovery/direct_zmq.rs +++ b/lib/llm/src/kv_router/indexer/recovery/direct_zmq.rs @@ -467,7 +467,8 @@ async fn consume_scope( } Ok(DiscoveryEvent::Added(_)) | Ok(DiscoveryEvent::ModelTaintsUpdated(_)) - | Ok(DiscoveryEvent::Removed(_)) => {} + | Ok(DiscoveryEvent::Removed(_)) + | Ok(DiscoveryEvent::Resync(_)) => {} Err(error) => { tracing::error!(%error, %kv_state_endpoint, "Direct-ZMQ event-channel discovery failed"); break; diff --git a/lib/llm/src/kv_router/indexer/recovery/state_agent.rs b/lib/llm/src/kv_router/indexer/recovery/state_agent.rs index b2aedaabeef7..9de1154888df 100644 --- a/lib/llm/src/kv_router/indexer/recovery/state_agent.rs +++ b/lib/llm/src/kv_router/indexer/recovery/state_agent.rs @@ -785,7 +785,8 @@ fn update_advertisements( } DiscoveryEvent::Added(_) | DiscoveryEvent::Removed(_) - | DiscoveryEvent::ModelTaintsUpdated(_) => Ok(false), + | DiscoveryEvent::ModelTaintsUpdated(_) + | DiscoveryEvent::Resync(_) => Ok(false), } } diff --git a/lib/llm/src/kv_router/publisher/state_agent_host.rs b/lib/llm/src/kv_router/publisher/state_agent_host.rs index 632734436801..3f52c7068969 100644 --- a/lib/llm/src/kv_router/publisher/state_agent_host.rs +++ b/lib/llm/src/kv_router/publisher/state_agent_host.rs @@ -447,7 +447,8 @@ fn reconcile_intent_event( } DiscoveryEvent::Added(_) | DiscoveryEvent::Removed(_) - | DiscoveryEvent::ModelTaintsUpdated(_) => return Ok(None), + | DiscoveryEvent::ModelTaintsUpdated(_) + | DiscoveryEvent::Resync(_) => return Ok(None), }; if scope != (EventScope::Component { diff --git a/lib/runtime/src/component/client.rs b/lib/runtime/src/component/client.rs index a03b15dd2e74..479a9ac8873b 100644 --- a/lib/runtime/src/component/client.rs +++ b/lib/runtime/src/component/client.rs @@ -3,7 +3,7 @@ use std::{ collections::{HashMap, HashSet}, - sync::{Arc, LazyLock, Mutex as StdMutex}, + sync::{Arc, LazyLock, Mutex as StdMutex, Weak}, time::Duration, }; @@ -11,10 +11,11 @@ use anyhow::Result; use arc_swap::ArcSwap; use futures::StreamExt; use tokio::time::Instant; +use tokio_util::sync::{CancellationToken, DropGuard}; use crate::component::{Endpoint, Instance}; use crate::config::environment_names::runtime as env_runtime; -use crate::discovery::{DiscoveryEvent, DiscoveryInstance, DiscoveryInstanceId}; +use crate::discovery::{Discovery, DiscoveryEvent, DiscoveryInstance, DiscoveryInstanceId}; use crate::routing_policy::{RoutingOccupancyState, get_or_create_routing_occupancy_state}; use crate::traits::DistributedRuntimeProvider; @@ -56,10 +57,14 @@ fn inhibited_duration_from_env(mut lookup: impl FnMut(&str) -> Option) - /// cancellation watcher. Both outputs are driven by a single underlying /// discovery `list_and_watch` task so clients do not multiply control-plane /// watches. +/// +/// Dropping the source stops that watch. A backend producer can park on its own feed without +/// noticing that its consumer is gone, as the Kubernetes watcher does, so the token ends it. #[derive(Debug)] pub(crate) struct EndpointDiscoverySource { instance_source: tokio::sync::watch::Receiver>, event_subscribers: StdMutex>>, + _watch_guard: DropGuard, } pub(crate) struct DiscoveryEventReceiver { @@ -82,10 +87,14 @@ impl std::ops::DerefMut for DiscoveryEventReceiver { } impl EndpointDiscoverySource { - fn new(instance_source: tokio::sync::watch::Receiver>) -> Self { + fn new( + instance_source: tokio::sync::watch::Receiver>, + watch_guard: DropGuard, + ) -> Self { Self { instance_source, event_subscribers: StdMutex::new(Vec::new()), + _watch_guard: watch_guard, } } @@ -890,19 +899,42 @@ impl Client { async fn get_or_create_dynamic_discovery_source( endpoint: &Endpoint, ) -> Result> { - let drt = endpoint.drt(); - let sources = drt.endpoint_discovery_sources(); - let mut sources = sources.lock().await; + let sources = endpoint.drt().endpoint_discovery_sources(); - if let Some(source) = sources.get(endpoint) { - if let Some(source) = source.upgrade() { - return Ok(source); - } else { - sources.remove(endpoint); - } + let existing = sources.lock().await.get(endpoint).and_then(Weak::upgrade); + if let Some(source) = existing { + return Ok(source); } - let discovery = drt.discovery(); + // Discovery::list_and_watch establishes the backend watch, so it runs outside the + // registry lock. Holding the lock across it serializes every client construction behind + // one round trip to the discovery backend. + let discovery = endpoint.drt().discovery(); + let discovery_source = Self::spawn_dynamic_discovery_source( + endpoint, + discovery.as_ref(), + endpoint.drt().primary_token().child_token(), + ) + .await?; + + let mut sources = sources.lock().await; + // Another caller can register a source for this endpoint while this watch is + // established. Every later client shares that source, and this one drops, which stops + // both the watcher task it spawned and the backend watch it established. + if let Some(source) = sources.get(endpoint).and_then(Weak::upgrade) { + return Ok(source); + } + sources.insert(endpoint.clone(), Arc::downgrade(&discovery_source)); + Ok(discovery_source) + } + + /// Pass a child of the runtime's primary token as `cancel_token`: the backends fall back to + /// that token, so shutdown still ends a watch that clients are holding. + async fn spawn_dynamic_discovery_source( + endpoint: &Endpoint, + discovery: &dyn Discovery, + cancel_token: CancellationToken, + ) -> Result> { let discovery_query = crate::discovery::DiscoveryQuery::Endpoint { namespace: endpoint.component.namespace.name.clone(), component: endpoint.component.name.clone(), @@ -910,10 +942,13 @@ impl Client { }; let mut discovery_stream = discovery - .list_and_watch(discovery_query.clone(), None) + .list_and_watch(discovery_query.clone(), Some(cancel_token.clone())) .await?; let (watch_tx, watch_rx) = tokio::sync::watch::channel(vec![]); - let discovery_source = Arc::new(EndpointDiscoverySource::new(watch_rx)); + let discovery_source = Arc::new(EndpointDiscoverySource::new( + watch_rx, + cancel_token.drop_guard(), + )); let secondary = endpoint.component.drt.runtime().secondary().clone(); let discovery_source_task = Arc::downgrade(&discovery_source); @@ -953,6 +988,17 @@ impl Client { } DiscoveryEvent::Added(_) => {} DiscoveryEvent::ModelTaintsUpdated(_) => {} + DiscoveryEvent::Resync(instances) => { + map = instances + .into_iter() + .filter_map(|instance| { + let DiscoveryInstance::Endpoint(instance) = instance else { + return None; + }; + Some((instance.instance_id, instance)) + }) + .collect(); + } DiscoveryEvent::Removed(id) => { if let DiscoveryInstanceId::Endpoint(endpoint_id) = id { map.remove(&endpoint_id.instance_id); @@ -968,7 +1014,6 @@ impl Client { let _ = watch_tx.send(vec![]); }); - sources.insert(endpoint.clone(), Arc::downgrade(&discovery_source)); Ok(discovery_source) } } @@ -976,7 +1021,63 @@ impl Client { #[cfg(test)] mod tests { use super::*; + use crate::component::TransportType; + use crate::discovery::{ + DiscoveryQuery, DiscoverySpec, DiscoveryStream, MockDiscovery, SharedMockRegistry, + }; use crate::{DistributedRuntime, Runtime, distributed::DistributedConfig}; + use futures::future::try_join_all; + + /// A backend whose watch producer, like the Kubernetes watcher, parks on its own feed and ends + /// only when the token it was given cancels. A test sends events to a watch through `feeds`. + struct ParkedProducerDiscovery { + inner: MockDiscovery, + producers: StdMutex>>, + feeds: StdMutex>>>, + } + + #[async_trait::async_trait] + impl Discovery for ParkedProducerDiscovery { + fn instance_id(&self) -> u64 { + self.inner.instance_id() + } + + async fn register_internal(&self, spec: DiscoverySpec) -> Result { + self.inner.register_internal(spec).await + } + + async fn unregister(&self, instance: DiscoveryInstance) -> Result<()> { + self.inner.unregister(instance).await + } + + async fn list(&self, query: DiscoveryQuery) -> Result> { + self.inner.list(query).await + } + + async fn list_and_watch( + &self, + _query: DiscoveryQuery, + cancel_token: Option, + ) -> Result { + let (feed_tx, mut feed) = + tokio::sync::mpsc::unbounded_channel::>(); + self.feeds.lock().unwrap().push(feed_tx.clone()); + let producer = tokio::spawn(async move { + let _feed_tx = feed_tx; + match cancel_token { + Some(token) => token.cancelled().await, + None => std::future::pending::<()>().await, + } + }); + self.producers.lock().unwrap().push(producer); + + Ok(Box::pin(async_stream::stream! { + while let Some(event) = feed.recv().await { + yield event; + } + })) + } + } async fn wait_for_discovery_event( receiver: &mut DiscoveryEventReceiver, @@ -1033,6 +1134,145 @@ mod tests { ); } + #[tokio::test] + async fn concurrent_clients_share_one_discovery_source() { + let rt = Runtime::from_current().unwrap(); + let drt = DistributedRuntime::new(rt, DistributedConfig::process_local()) + .await + .unwrap(); + let endpoint = drt + .namespace("test_shared_discovery_source".to_string()) + .unwrap() + .component("test_component".to_string()) + .unwrap() + .endpoint("decode".to_string()); + + // Every client passes the registry lookup before the first one establishes its watch, so + // they all take the slow path and race on the insert. + let clients = try_join_all((0..8).map(|_| endpoint.client())) + .await + .unwrap(); + + let shared = &clients[0].endpoint_discovery_source; + for (index, client) in clients.iter().enumerate() { + assert!( + Arc::ptr_eq(shared, &client.endpoint_discovery_source), + "client {index} watches the endpoint through a second discovery source" + ); + } + } + + #[tokio::test] + async fn dropping_a_discovery_source_stops_its_backend_watch() { + let rt = Runtime::from_current().unwrap(); + let drt = DistributedRuntime::new(rt, DistributedConfig::process_local()) + .await + .unwrap(); + let endpoint = drt + .namespace("test_discovery_source_drop".to_string()) + .unwrap() + .component("test_component".to_string()) + .unwrap() + .endpoint("decode".to_string()); + + let discovery = ParkedProducerDiscovery { + inner: MockDiscovery::new(Some(1), SharedMockRegistry::new()), + producers: StdMutex::default(), + feeds: StdMutex::default(), + }; + + let source = Client::spawn_dynamic_discovery_source( + &endpoint, + &discovery, + drt.primary_token().child_token(), + ) + .await + .unwrap(); + let producer = discovery + .producers + .lock() + .unwrap() + .pop() + .expect("the source established no backend watch"); + tokio::task::yield_now().await; + assert!( + !producer.is_finished(), + "a live source must keep watching the endpoint" + ); + + drop(source); + tokio::time::timeout(Duration::from_secs(1), producer) + .await + .expect("the backend watch outlives the source that established it") + .unwrap(); + } + + fn endpoint_instance(endpoint: &Endpoint, instance_id: u64) -> Instance { + Instance { + namespace: endpoint.component.namespace.name.clone(), + component: endpoint.component.name.clone(), + endpoint: endpoint.name.clone(), + instance_id, + transport: TransportType::Tcp(format!("127.0.0.1:{}", 8000 + instance_id)), + device_type: None, + request_plane_codec: None, + } + } + + #[tokio::test] + async fn a_resync_replaces_the_instances_of_a_discovery_source() { + let rt = Runtime::from_current().unwrap(); + let drt = DistributedRuntime::new(rt, DistributedConfig::process_local()) + .await + .unwrap(); + let endpoint = drt + .namespace("test_discovery_source_resync".to_string()) + .unwrap() + .component("test_component".to_string()) + .unwrap() + .endpoint("decode".to_string()); + let discovery = ParkedProducerDiscovery { + inner: MockDiscovery::new(Some(1), SharedMockRegistry::new()), + producers: StdMutex::default(), + feeds: StdMutex::default(), + }; + + let source = Client::spawn_dynamic_discovery_source( + &endpoint, + &discovery, + drt.primary_token().child_token(), + ) + .await + .unwrap(); + let feed = discovery + .feeds + .lock() + .unwrap() + .pop() + .expect("the source established no backend watch"); + let mut instances = source.instance_receiver(); + + let first = endpoint_instance(&endpoint, 1); + feed.send(Ok(DiscoveryEvent::Added(DiscoveryInstance::Endpoint( + first.clone(), + )))) + .unwrap(); + wait_for_watch_state(&mut instances, |instances| { + instances == std::slice::from_ref(&first) + }) + .await; + + let second = endpoint_instance(&endpoint, 2); + feed.send(Ok(DiscoveryEvent::Resync(vec![ + DiscoveryInstance::Endpoint(second.clone()), + ]))) + .unwrap(); + wait_for_watch_state(&mut instances, |instances| { + instances == std::slice::from_ref(&second) + }) + .await; + } + #[tokio::test] async fn dropping_last_client_releases_routing_state() { let rt = Runtime::from_current().unwrap(); diff --git a/lib/runtime/src/discovery/kube.rs b/lib/runtime/src/discovery/kube.rs index 779728997546..3d7e662f4174 100644 --- a/lib/runtime/src/discovery/kube.rs +++ b/lib/runtime/src/discovery/kube.rs @@ -18,7 +18,7 @@ use crate::CancellationToken; use crate::discovery::{ Discovery, DiscoveryEvent, DiscoveryInstance, DiscoveryInstanceId, DiscoveryMetadata, DiscoveryQuery, DiscoverySpec, DiscoveryStream, MAX_JSON_SAFE_PUBLISHER_ID, - ModelCardInstanceId, reconcile_discovery_snapshot, + ModelCardInstanceId, reconcile_discovery_snapshot, resync_discovery_events, }; use anyhow::Result; use async_trait::async_trait; @@ -398,24 +398,25 @@ impl Discovery for KubeDiscoveryClient { let (out_tx, out_rx) = mpsc::unbounded_channel(); let stream_id = uuid::Uuid::new_v4(); + + // Acquire read lock, subscribe to broadcast, then read initial state. + // The write lock (held by the daemon while updating list_state and sending events) + // is mutually exclusive with our read lock, so no events can slip between + // our subscription point and our initial state read. + // This runs before the return, so a caller that lists afterwards cannot observe an + // instance that a removal deletes before the subscription. + let (initial_instances, mut broadcast_rx) = { + let state = self.list_state.read().await; + let rx = self.event_tx.subscribe(); + let initial = state + .values() + .flat_map(|m| m.filter(&query)) + .collect::>(); + (initial, rx) + }; let list_state = self.list_state.clone(); - let event_tx = self.event_tx.clone(); tokio::spawn(async move { - // Acquire read lock, subscribe to broadcast, then read initial state. - // The write lock (held by the daemon while updating list_state and sending events) - // is mutually exclusive with our read lock, so no events can slip between - // our subscription point and our initial state read. - let (initial_instances, mut broadcast_rx) = { - let state = list_state.read().await; - let rx = event_tx.subscribe(); - let initial = state - .values() - .flat_map(|m| m.filter(&query)) - .collect::>(); - (initial, rx) - }; - tracing::debug!( stream_id = %stream_id, initial_count = initial_instances.len(), @@ -457,34 +458,33 @@ impl Discovery for KubeDiscoveryClient { match recv_result { Ok(event) => { - let forward = match &event { + let forwarded = match &event { DiscoveryEvent::Added(instance) => { if instance.matches(&query) { let id = instance.id(); if known.get(&id) != Some(instance) { - known.insert(id, instance.clone()); - true + known.insert(id.clone(), instance.clone()); + Some(("added", id)) } else { - false + None } } else { - false + None } } - DiscoveryEvent::Removed(id) => known.remove(id).is_some(), + DiscoveryEvent::Removed(id) => { + known.remove(id).is_some().then(|| ("removed", id.clone())) + } DiscoveryEvent::ModelTaintsUpdated(update) => { - known.contains_key(&DiscoveryInstanceId::Model(update.id.clone())) + let id = DiscoveryInstanceId::Model(update.id.clone()); + known + .contains_key(&id) + .then_some(("model_taints_updated", id)) } + // The daemon publishes incremental events only. + DiscoveryEvent::Resync(_) => None, }; - if forward { - let (event_kind, instance_id) = match &event { - DiscoveryEvent::Added(i) => ("added", i.id()), - DiscoveryEvent::ModelTaintsUpdated(u) => ( - "model_taints_updated", - DiscoveryInstanceId::Model(u.id.clone()), - ), - DiscoveryEvent::Removed(id) => ("removed", id.clone()), - }; + if let Some((event_kind, instance_id)) = forwarded { tracing::info!( stream_id = %stream_id, event_kind, @@ -509,9 +509,7 @@ impl Discovery for KubeDiscoveryClient { .map(|i| (i.id(), i)) .collect(); drop(state); - let (events, reconciled) = reconcile_discovery_snapshot(&known, current); - known = reconciled; - for event in events { + for event in resync_discovery_events(&mut known, current) { if out_tx.send(Ok(event)).is_err() { return; } diff --git a/lib/runtime/src/discovery/kv_store.rs b/lib/runtime/src/discovery/kv_store.rs index 7cb39ce21de7..79fe64a8cb1a 100644 --- a/lib/runtime/src/discovery/kv_store.rs +++ b/lib/runtime/src/discovery/kv_store.rs @@ -14,7 +14,7 @@ use super::{ Discovery, DiscoveryEvent, DiscoveryInstance, DiscoveryInstanceId, DiscoveryQuery, DiscoverySpec, DiscoveryStream, EndpointInstanceId, EventChannelInstanceId, EventScope, EventSourceInstanceId, ModelCardInstanceId, classify_discovery_change, encode_event_segment, - model_with_updated_taints, reconcile_discovery_snapshot, validate_event_source_reregistration, + model_with_updated_taints, resync_discovery_events, validate_event_source_reregistration, validate_model_reregistration, }; use crate::storage::kv; @@ -362,17 +362,16 @@ impl KVStoreDiscovery { } } - let (events, reconciled) = - reconcile_discovery_snapshot(known_instances, next_instances); + let old_count = known_instances.len(); + let events = resync_discovery_events(known_instances, next_instances); tracing::warn!( - old_count = known_instances.len(), - new_count = reconciled.len(), + old_count, + new_count = known_instances.len(), emitted_events = events.len(), "KVStoreDiscovery::list_and_watch resynced discovery state" ); - *known_instances = reconciled; events } } @@ -725,12 +724,15 @@ impl Discovery for KVStoreDiscovery { // Use the provided cancellation token, or fall back to the default token let cancel_token = cancel_token.unwrap_or_else(|| self.cancel_token.clone()); - // Use the kv::Manager's watch mechanism - let (_, mut rx) = self.store.clone().watch( - bucket_name, - None, // No TTL - cancel_token, - ); + let (_, mut rx) = self + .store + .clone() + .watch( + bucket_name, + None, // No TTL + cancel_token, + ) + .await?; // Create a stream that filters and transforms WatchEvents to DiscoveryEvents let stream = async_stream::stream! { @@ -791,6 +793,13 @@ mod tests { ) } + fn resync_ids(event: &DiscoveryEvent) -> HashSet { + let DiscoveryEvent::Resync(instances) = event else { + panic!("expected a resync event, got {event:?}"); + }; + instances.iter().map(DiscoveryInstance::id).collect() + } + #[test] fn test_resync_removes_missing_discovery_instances() { let prefix = format!("{}/{}/{}", INSTANCES_BUCKET, "ns", "component"); @@ -822,13 +831,18 @@ mod tests { ); assert!(!events.contains(&DiscoveryEvent::Added(second))); + assert_eq!(events.len(), 3); assert_eq!( - events, - vec![ + events[..2], + [ DiscoveryEvent::Removed(endpoint_instance(1).id()), DiscoveryEvent::Added(third), ] ); + assert_eq!( + resync_ids(&events[2]), + HashSet::from([endpoint_instance(2).id(), endpoint_instance(3).id()]) + ); assert_eq!(known_instances.len(), 2); assert!(known_instances.contains_key(&endpoint_instance(2).id())); assert!(known_instances.contains_key(&endpoint_instance(3).id())); @@ -855,7 +869,8 @@ mod tests { &mut known_instances, ); - assert!(events.is_empty()); + assert_eq!(events.len(), 1); + assert_eq!(resync_ids(&events[0]), HashSet::from([first.id()])); assert_eq!(known_instances.len(), 1); assert_eq!(known_instances.get(&first.id()), Some(&first)); } @@ -881,15 +896,20 @@ mod tests { &mut known_instances, ); + assert_eq!(events.len(), 2); assert_eq!( - events, - vec![DiscoveryEvent::ModelTaintsUpdated(ModelTaintsUpdate { + events[0], + DiscoveryEvent::ModelTaintsUpdated(ModelTaintsUpdate { id: id.clone(), taints: vec![ "dynamo.topology/zone=west".to_string(), "second".to_string(), ], - })] + }) + ); + assert_eq!( + resync_ids(&events[1]), + HashSet::from([DiscoveryInstanceId::Model(id.clone())]) ); assert_eq!( known_instances.get(&DiscoveryInstanceId::Model(id)), @@ -1214,6 +1234,91 @@ mod tests { cancel_token.cancel(); } + #[tokio::test] + async fn watch_reports_an_unregister_that_follows_establishment() { + let client = KVStoreDiscovery::new(kv::Manager::memory(), CancellationToken::new()); + let instance = client + .register(DiscoverySpec::Endpoint { + namespace: "ns".to_string(), + component: "comp".to_string(), + endpoint: "ep".to_string(), + device_type: None, + request_plane_codec: None, + transport: TransportType::Nats("nats://127.0.0.1:4222".to_string()), + }) + .await + .unwrap(); + + let mut stream = client + .list_and_watch(DiscoveryQuery::AllEndpoints, None) + .await + .unwrap(); + client.unregister(instance.clone()).await.unwrap(); + + let added = tokio::time::timeout(tokio::time::Duration::from_secs(1), stream.next()) + .await + .unwrap() + .unwrap() + .unwrap(); + assert_eq!(added, DiscoveryEvent::Added(instance.clone())); + + let removed = tokio::time::timeout(tokio::time::Duration::from_secs(1), stream.next()) + .await + .unwrap() + .unwrap() + .unwrap(); + assert_eq!( + removed, + DiscoveryEvent::Removed(instance.id()), + "an unregister after establishment must reach the stream" + ); + } + + #[tokio::test] + async fn watch_reports_a_resync_after_the_backend_lags() { + use crate::storage::kv::Bucket; + + let store = kv::Manager::memory(); + let client = KVStoreDiscovery::new(store.clone(), CancellationToken::new()); + let mut stream = client + .list_and_watch(DiscoveryQuery::AllEndpoints, None) + .await + .unwrap(); + + let instance = client + .register(DiscoverySpec::Endpoint { + namespace: "ns".to_string(), + component: "comp".to_string(), + endpoint: "ep".to_string(), + device_type: None, + request_plane_codec: None, + transport: TransportType::Nats("nats://127.0.0.1:4222".to_string()), + }) + .await + .unwrap(); + assert_eq!( + client.list(DiscoveryQuery::AllEndpoints).await.unwrap(), + vec![instance.clone()] + ); + client.unregister(instance).await.unwrap(); + + // The memory store has one change buffer for all buckets. These writes push the register + // and the unregister out of the buffer before the watch task reads them: on the + // current-thread test runtime that task cannot run before this test yields. + let filler = store.get_or_create_bucket("filler", None).await.unwrap(); + let key = kv::Key::new("key".to_string()); + for revision in 1..=(kv::MEMORY_EVENT_BUFFER_CAPACITY + 1) as u64 { + filler.insert(&key, "value".into(), revision).await.unwrap(); + } + + let event = tokio::time::timeout(tokio::time::Duration::from_secs(1), stream.next()) + .await + .expect("the stream must report the resync") + .unwrap() + .unwrap(); + assert_eq!(event, DiscoveryEvent::Resync(vec![])); + } + fn model_spec(taint: &str) -> DiscoverySpec { DiscoverySpec::Model { namespace: "ns".to_string(), diff --git a/lib/runtime/src/discovery/mock.rs b/lib/runtime/src/discovery/mock.rs index 86652a3d1e20..a38741667880 100644 --- a/lib/runtime/src/discovery/mock.rs +++ b/lib/runtime/src/discovery/mock.rs @@ -11,12 +11,13 @@ use anyhow::Result; use async_trait::async_trait; use std::collections::{HashMap, HashSet}; use std::sync::{Arc, Mutex}; +use tokio::sync::mpsc::UnboundedSender; use tokio_util::sync::CancellationToken; /// Shared in-memory registry for mock discovery #[derive(Clone, Default)] pub struct SharedMockRegistry { - instances: Arc>>, + state: Arc>, } impl SharedMockRegistry { @@ -25,6 +26,25 @@ impl SharedMockRegistry { } } +#[derive(Default)] +struct RegistryState { + instances: Vec, + /// Each watch receives the registry after every change, so a change made between two reads + /// of its stream still reaches it. + watchers: Vec>>>, +} + +impl RegistryState { + fn publish(&mut self) { + if self.watchers.is_empty() { + return; + } + let instances = Arc::new(self.instances.clone()); + self.watchers + .retain(|watcher| watcher.send(instances.clone()).is_ok()); + } +} + /// Mock implementation of Discovery for testing /// We can potentially remove this once we have KVStoreDiscovery fully tested pub struct MockDiscovery { @@ -47,6 +67,18 @@ impl MockDiscovery { } } +fn query_snapshot( + instances: &[DiscoveryInstance], + query: &DiscoveryQuery, +) -> HashMap { + instances + .iter() + .filter(|instance| matches_query(instance, query)) + .cloned() + .map(|instance| (instance.id(), instance)) + .collect() +} + /// Helper function to check if an instance matches a discovery query fn matches_query(instance: &DiscoveryInstance, query: &DiscoveryQuery) -> bool { match (instance, query) { @@ -188,14 +220,16 @@ impl Discovery for MockDiscovery { async fn register_internal(&self, spec: DiscoverySpec) -> Result { let instance = spec.into_instance(self.instance_id); let instance_id = instance.id(); - let mut instances = self.registry.instances.lock().unwrap(); - if let Some(existing) = instances + let mut state = self.registry.state.lock().unwrap(); + if let Some(existing) = state + .instances .iter_mut() .find(|existing| existing.id() == instance_id) { match &instance { DiscoveryInstance::Endpoint(_) => { *existing = instance.clone(); + state.publish(); return Ok(instance); } DiscoveryInstance::EventSource { .. } => { @@ -209,7 +243,8 @@ impl Discovery for MockDiscovery { DiscoveryInstance::EventChannel { .. } => {} } } - instances.push(instance.clone()); + state.instances.push(instance.clone()); + state.publish(); Ok(instance) } @@ -220,32 +255,33 @@ impl Discovery for MockDiscovery { taints: HashSet, ) -> Result<()> { let target_id = DiscoveryInstanceId::Model(id); - let mut instances = self.registry.instances.lock().unwrap(); - let existing = instances + let mut state = self.registry.state.lock().unwrap(); + let existing = state + .instances .iter_mut() .find(|existing| existing.id() == target_id) .ok_or_else(|| { anyhow::anyhow!("model discovery record {target_id:?} is not registered") })?; *existing = model_with_updated_taints(existing, taints)?; + state.publish(); Ok(()) } async fn unregister(&self, instance: DiscoveryInstance) -> Result<()> { let target_id = instance.id(); - self.registry - .instances - .lock() - .unwrap() - .retain(|i| i.id() != target_id); + let mut state = self.registry.state.lock().unwrap(); + state.instances.retain(|i| i.id() != target_id); + state.publish(); Ok(()) } async fn list(&self, query: DiscoveryQuery) -> Result> { - let instances = self.registry.instances.lock().unwrap(); - Ok(instances + let state = self.registry.state.lock().unwrap(); + Ok(state + .instances .iter() .filter(|instance| matches_query(instance, &query)) .cloned() @@ -257,30 +293,31 @@ impl Discovery for MockDiscovery { query: DiscoveryQuery, _cancel_token: Option, ) -> Result { - let registry = self.registry.clone(); + let (changes_tx, mut changes) = tokio::sync::mpsc::unbounded_channel(); + // Every change publishes under this lock, so none falls between the snapshot and the + // subscription. + let initial = { + let mut state = self.registry.state.lock().unwrap(); + state.watchers.push(changes_tx); + query_snapshot(&state.instances, &query) + }; let stream = async_stream::stream! { - let mut known_instances = HashMap::::new(); - - loop { - let current: HashMap = { - let instances = registry.instances.lock().unwrap(); - instances - .iter() - .filter(|instance| matches_query(instance, &query)) - .cloned() - .map(|instance| (instance.id(), instance)) - .collect() - }; + let (events, mut known_instances) = + reconcile_discovery_snapshot(&HashMap::new(), initial); + for event in events { + yield Ok(event); + } - let (events, reconciled) = - reconcile_discovery_snapshot(&known_instances, current); + while let Some(instances) = changes.recv().await { + let (events, reconciled) = reconcile_discovery_snapshot( + &known_instances, + query_snapshot(&instances, &query), + ); for event in events { yield Ok(event); } - known_instances = reconciled; - tokio::time::sleep(tokio::time::Duration::from_millis(10)).await; } }; @@ -332,6 +369,80 @@ mod tests { assert_eq!(client.list(query).await.unwrap(), vec![updated]); } + #[tokio::test] + async fn watch_reports_an_unregister_that_follows_establishment() { + let client = MockDiscovery::new(Some(1), SharedMockRegistry::new()); + let instance = client + .register(DiscoverySpec::Endpoint { + namespace: "ns".to_string(), + component: "component".to_string(), + endpoint: "endpoint".to_string(), + transport: TransportType::Tcp("127.0.0.1:8000".to_string()), + device_type: None, + request_plane_codec: None, + }) + .await + .unwrap(); + + let mut stream = client + .list_and_watch(DiscoveryQuery::AllEndpoints, None) + .await + .unwrap(); + client.unregister(instance.clone()).await.unwrap(); + + let added = timeout(Duration::from_secs(1), stream.next()) + .await + .expect("the first snapshot must reach the stream") + .unwrap() + .unwrap(); + assert_eq!(added, DiscoveryEvent::Added(instance.clone())); + + let removed = timeout(Duration::from_secs(1), stream.next()) + .await + .expect("an unregister after establishment must reach the stream") + .unwrap() + .unwrap(); + assert_eq!(removed, DiscoveryEvent::Removed(instance.id())); + } + + #[tokio::test] + async fn watch_reports_the_removal_of_an_instance_listed_after_establishment() { + let client = MockDiscovery::new(Some(1), SharedMockRegistry::new()); + let mut stream = client + .list_and_watch(DiscoveryQuery::AllEndpoints, None) + .await + .unwrap(); + + let instance = client + .register(DiscoverySpec::Endpoint { + namespace: "ns".to_string(), + component: "component".to_string(), + endpoint: "endpoint".to_string(), + transport: TransportType::Tcp("127.0.0.1:8000".to_string()), + device_type: None, + request_plane_codec: None, + }) + .await + .unwrap(); + let listed = client.list(DiscoveryQuery::AllEndpoints).await.unwrap(); + assert_eq!(listed, vec![instance.clone()]); + client.unregister(instance.clone()).await.unwrap(); + + let added = timeout(Duration::from_secs(1), stream.next()) + .await + .expect("a registration after establishment must reach the stream") + .unwrap() + .unwrap(); + assert_eq!(added, DiscoveryEvent::Added(instance.clone())); + + let removed = timeout(Duration::from_secs(1), stream.next()) + .await + .expect("a caller that listed the instance must see its removal") + .unwrap() + .unwrap(); + assert_eq!(removed, DiscoveryEvent::Removed(instance.id())); + } + fn model_spec( namespace: &str, component: &str, diff --git a/lib/runtime/src/discovery/mod.rs b/lib/runtime/src/discovery/mod.rs index b88a53c7efe7..d1bb68a46875 100644 --- a/lib/runtime/src/discovery/mod.rs +++ b/lib/runtime/src/discovery/mod.rs @@ -1193,6 +1193,14 @@ pub enum DiscoveryEvent { ModelTaintsUpdated(ModelTaintsUpdate), /// An instance was removed (identified by its unique ID) Removed(DiscoveryInstanceId), + /// The backend resynchronized. The payload holds every instance that matches the query at + /// that moment. + /// + /// The stream sends this event after the incremental events of the same resync. A consumer + /// that builds its state only from this stream can ignore this event. A consumer + /// that holds state from another source, such as a [`Discovery::list`] call, must replace its + /// state with the payload. + Resync(Vec), } /// A scoped, idempotent update to an existing model card's routing taints. @@ -1504,6 +1512,20 @@ pub(crate) fn reconcile_discovery_snapshot( (events, next) } +/// Reconcile an authoritative snapshot after a backend resync. +/// +/// Returns the changes between `known` and the snapshot, then one [`DiscoveryEvent::Resync`] +/// with the reconciled set. `known` becomes the reconciled set. +pub(crate) fn resync_discovery_events( + known: &mut HashMap, + current: HashMap, +) -> Vec { + let (mut events, reconciled) = reconcile_discovery_snapshot(known, current); + *known = reconciled; + events.push(DiscoveryEvent::Resync(known.values().cloned().collect())); + events +} + fn model_with_updated_taints( existing: &DiscoveryInstance, mut taints: HashSet, @@ -1646,7 +1668,20 @@ pub trait Discovery: Send + Sync { /// This is a one-time snapshot without watching for changes async fn list(&self, query: DiscoveryQuery) -> Result>; - /// Returns a stream of discovery events (Added/Removed) for the given discovery query + /// Returns a stream of discovery events for the given discovery query + /// + /// An implementation establishes the watch before it returns. The stream reports the state at + /// that moment as `Added` events, and then every change that follows. + /// + /// A backend can fall behind and resynchronize from an authoritative snapshot. The stream then + /// reports the changes between its own state and that snapshot, and after them one + /// [`DiscoveryEvent::Resync`] that holds the full set. A change that started and ended inside + /// the gap is not reported as a change. + /// + /// A caller that also needs a [`Discovery::list`] snapshot calls `list_and_watch` first, and + /// replaces its state on every `Resync`. A `list` before the watch can show an instance that + /// an unregister removes before the snapshot, and no event reports that removal. + /// /// The optional cancellation token can be used to stop the watch stream async fn list_and_watch( &self, diff --git a/lib/runtime/src/discovery/utils.rs b/lib/runtime/src/discovery/utils.rs index 087af88d4a71..cd2695ad3753 100644 --- a/lib/runtime/src/discovery/utils.rs +++ b/lib/runtime/src/discovery/utils.rs @@ -124,6 +124,7 @@ where } } Ok(DiscoveryEvent::ModelTaintsUpdated(_)) => {} + Ok(DiscoveryEvent::Resync(_)) => {} Ok(DiscoveryEvent::Removed(id)) => { let had_entry = state.contains_key(&id); diff --git a/lib/runtime/src/pipeline/network/egress/push_router.rs b/lib/runtime/src/pipeline/network/egress/push_router.rs index 8edfce7548ad..84c739f9e3b1 100644 --- a/lib/runtime/src/pipeline/network/egress/push_router.rs +++ b/lib/runtime/src/pipeline/network/egress/push_router.rs @@ -443,7 +443,9 @@ fn spawn_instance_removal_watcher( let eid: EndpointInstanceId = inst.endpoint_instance_id(); dispatch.on_instance_added(&eid).await; } - Some(Ok(_)) => {} + Some(Ok(DiscoveryEvent::Added(_))) + | Some(Ok(DiscoveryEvent::ModelTaintsUpdated(_))) + | Some(Ok(DiscoveryEvent::Resync(_))) => {} Some(Err(e)) => { tracing::warn!( endpoint = %endpoint_name, @@ -534,7 +536,10 @@ fn spawn_multimodal_cache_cleanup_watcher( Some(Ok(DiscoveryEvent::Removed(DiscoveryInstanceId::Endpoint(eid)))) => { indexer.remove_worker(eid.instance_id); } - Some(Ok(_)) => {} + Some(Ok(DiscoveryEvent::Added(_))) + | Some(Ok(DiscoveryEvent::ModelTaintsUpdated(_))) + | Some(Ok(DiscoveryEvent::Removed(_))) + | Some(Ok(DiscoveryEvent::Resync(_))) => {} Some(Err(error)) => { tracing::warn!( endpoint = %endpoint_name, diff --git a/lib/runtime/src/storage/kv.rs b/lib/runtime/src/storage/kv.rs index 55f4c448aae8..7a5b6e28964e 100644 --- a/lib/runtime/src/storage/kv.rs +++ b/lib/runtime/src/storage/kv.rs @@ -18,8 +18,11 @@ use async_trait::async_trait; use futures::StreamExt; use percent_encoding::{NON_ALPHANUMERIC, percent_decode_str, percent_encode}; use serde::{Deserialize, Serialize}; +use tokio_util::task::AbortOnDropHandle; mod mem; +#[cfg(test)] +pub(crate) use mem::MEMORY_EVENT_BUFFER_CAPACITY; pub use mem::MemoryStore; mod nats; pub use nats::NATSStore; @@ -333,48 +336,101 @@ impl Manager { } } - /// Returns a receiver that will receive all the existing keys, and - /// then block and receive new keys as they are created. - /// Starts a task that runs forever, watches the store. - pub fn watch( + /// Returns a receiver for all the existing keys of a bucket, and then for every later change. + /// + /// This method establishes the watch before it returns: [`Bucket::watch`] has captured the + /// initial snapshot, so every change that follows reaches the receiver, as its own event or + /// inside a later [`WatchEvent::Resync`] that replaces all earlier state. A caller that also + /// reads the bucket directly must read it after this returns. A read before the watch can + /// show a key that a delete removes before the snapshot, and the receiver never reports that + /// delete. + /// + /// The spawned task runs until `cancel_token` cancels, the receiver drops, or the backend + /// stream ends. + /// + /// # Errors + /// + /// Returns an error when the bucket is unavailable, when the backend cannot establish the + /// watch, or when `cancel_token` cancels first. + pub async fn watch( self: Arc, bucket_name: &str, bucket_ttl: Option, cancel_token: CancellationToken, - ) -> ( - tokio::task::JoinHandle>, - tokio::sync::mpsc::Receiver, - ) { + ) -> Result< + ( + tokio::task::JoinHandle<()>, + tokio::sync::mpsc::Receiver, + ), + StoreError, + > { let bucket_name = bucket_name.to_string(); // Backpressure is intentional: discovery state events must never be dropped. let (tx, rx) = tokio::sync::mpsc::channel(16384); - let watch_task = tokio::spawn(async move { - // Start listening for changes but don't poll this yet - let bucket = self - .0 - .get_or_create_bucket(&bucket_name, bucket_ttl) - .await?; - // Bucket::watch atomically establishes its initial snapshot and incremental - // stream. A separate entries() read here could replay an older buffered update - // after a newer snapshot. - let mut stream = bucket.watch().await?; - - loop { - let event = tokio::select! { - _ = cancel_token.cancelled() => break, - result = stream.next() => match result { - Some(event) => event, - None => break, + let (established_tx, established_rx) = tokio::sync::oneshot::channel(); + // Until the watch is established, a caller that stops waiting aborts the task rather than + // detaching it: nobody reads the bucket it would create or the backend watch it would hold. + let watch_task = AbortOnDropHandle::new(tokio::spawn({ + let bucket_name = bucket_name.clone(); + let cancel_token = cancel_token.clone(); + async move { + // Start listening for changes but don't poll this yet + let bucket = match self.0.get_or_create_bucket(&bucket_name, bucket_ttl).await { + Ok(bucket) => bucket, + Err(error) => { + let _ = established_tx.send(Err(error)); + return; + } + }; + // Bucket::watch atomically establishes its initial snapshot and incremental + // stream. A separate entries() read here could replay an older buffered update + // after a newer snapshot. + let mut stream = match bucket.watch().await { + Ok(stream) => stream, + Err(error) => { + let _ = established_tx.send(Err(error)); + return; } }; - if !Self::forward_watch_event(&tx, event, &cancel_token, &bucket_name).await { - break; + // The caller stopped waiting, so no receiver reconciles against this snapshot. + if established_tx.send(Ok(())).is_err() { + return; + } + + loop { + let event = tokio::select! { + () = cancel_token.cancelled() => break, + // A quiet bucket would otherwise park the task until its next change. + () = tx.closed() => break, + result = stream.next() => match result { + Some(event) => event, + None => break, + } + }; + if !Self::forward_watch_event(&tx, event, &cancel_token, &bucket_name).await { + break; + } } } + })); + + let established = tokio::select! { + biased; + // Await the abort, so the task cannot create the bucket after this returns. + () = cancel_token.cancelled() => { + watch_task.abort(); + let _ = watch_task.await; + return Err(StoreError::WatchCancelled(bucket_name)); + } + established = established_rx => established, + }; + established.map_err(|_| { + StoreError::ProviderError(format!( + "the watch task for bucket '{bucket_name}' ended before it established the watch" + )) + })??; - Ok::<(), StoreError>(()) - }); - (watch_task, rx) + Ok((watch_task.detach(), rx)) } pub async fn publish( @@ -495,6 +551,11 @@ pub enum StoreError { #[error("Key Value Error: {0} for bucket '{1}'")] KeyValueError(String, String), + /// The caller cancelled before the backend established the watch, so no snapshot exists to + /// reconcile against. + #[error("Watch on bucket '{0}' was cancelled before it was established")] + WatchCancelled(String), + #[error("Error decoding bytes: {0}")] JSONDecodeError(#[from] serde_json::error::Error), @@ -514,7 +575,7 @@ mod tests { use std::sync::Arc; use super::*; - use futures::{StreamExt, pin_mut}; + use futures::{FutureExt, StreamExt, pin_mut}; const BUCKET_NAME: &str = "v1/mdc"; @@ -564,7 +625,9 @@ mod tests { let cancel_token = CancellationToken::new(); let (watch_task, mut rx) = manager .clone() - .watch(BUCKET_NAME, None, cancel_token.clone()); + .watch(BUCKET_NAME, None, cancel_token.clone()) + .await + .unwrap(); let first = tokio::time::timeout(Duration::from_secs(1), rx.recv()) .await @@ -590,7 +653,126 @@ mod tests { ); cancel_token.cancel(); - watch_task.await.unwrap().unwrap(); + watch_task.await.unwrap(); + } + + #[tokio::test] + async fn manager_watch_reports_a_delete_that_follows_establishment() { + let manager = Arc::new(Manager::memory()); + let bucket = manager + .get_or_create_bucket(BUCKET_NAME, None) + .await + .unwrap(); + let key = Key::new("ns/worker/generate/1".to_string()); + bucket.insert(&key, "value".into(), 1).await.unwrap(); + + let cancel_token = CancellationToken::new(); + let (watch_task, mut rx) = manager + .clone() + .watch(BUCKET_NAME, None, cancel_token.clone()) + .await + .unwrap(); + bucket.delete(&key).await.unwrap(); + + let first = tokio::time::timeout(Duration::from_secs(1), rx.recv()) + .await + .unwrap() + .unwrap(); + let WatchEvent::Put(first) = first else { + panic!("expected the existing key in the initial snapshot, got {first:?}"); + }; + assert_eq!(first.key_str(), key.as_ref()); + + let second = tokio::time::timeout(Duration::from_secs(1), rx.recv()) + .await + .unwrap() + .unwrap(); + assert_eq!( + second, + WatchEvent::Delete(key), + "a delete after establishment must reach the receiver" + ); + + cancel_token.cancel(); + watch_task.await.unwrap(); + } + + #[tokio::test] + async fn manager_watch_reports_an_unavailable_bucket() { + // A file as the store root makes every bucket directory unreachable. + let root = tempfile::NamedTempFile::new().unwrap(); + let cancel_token = CancellationToken::new(); + let manager = Arc::new(Manager::file(cancel_token.clone(), root.path())); + + let error = manager + .watch(BUCKET_NAME, None, cancel_token.clone()) + .await + .expect_err("a bucket under a file cannot be created"); + + assert!( + matches!(error, StoreError::FilesystemError(_)), + "expected a filesystem error, got {error:?}" + ); + cancel_token.cancel(); + } + + #[tokio::test] + async fn manager_watch_reports_cancellation_before_establishment() { + let manager = Arc::new(Manager::memory()); + let cancel_token = CancellationToken::new(); + cancel_token.cancel(); + + let error = manager + .clone() + .watch(BUCKET_NAME, None, cancel_token) + .await + .expect_err("a cancelled watch establishes no snapshot"); + + assert!( + matches!(&error, StoreError::WatchCancelled(bucket) if bucket == BUCKET_NAME), + "expected a cancelled watch, got {error:?}" + ); + // Give a task that outlived the failed watch its chance to run. + tokio::task::yield_now().await; + assert!( + manager.get_bucket(BUCKET_NAME).await.unwrap().is_none(), + "a cancelled watch created the bucket it gave up on" + ); + } + + #[tokio::test] + async fn manager_watch_abandoned_before_establishment_creates_no_bucket() { + let manager = Arc::new(Manager::memory()); + + let watch = manager + .clone() + .watch(BUCKET_NAME, None, CancellationToken::new()); + assert!( + watch.now_or_never().is_none(), + "the watch completed on its first poll, before its setup task could run" + ); + + tokio::task::yield_now().await; + assert!( + manager.get_bucket(BUCKET_NAME).await.unwrap().is_none(), + "an abandoned watch created the bucket nobody waits for" + ); + } + + #[tokio::test] + async fn manager_watch_task_ends_when_its_receiver_drops() { + let manager = Arc::new(Manager::memory()); + let (watch_task, rx) = manager + .watch(BUCKET_NAME, None, CancellationToken::new()) + .await + .unwrap(); + + drop(rx); + + tokio::time::timeout(Duration::from_secs(1), watch_task) + .await + .expect("the watch task outlived its receiver on a quiet bucket") + .unwrap(); } #[tokio::test] diff --git a/lib/runtime/src/storage/kv/mem.rs b/lib/runtime/src/storage/kv/mem.rs index 68f8e41d1f93..f0b006547503 100644 --- a/lib/runtime/src/storage/kv/mem.rs +++ b/lib/runtime/src/storage/kv/mem.rs @@ -13,7 +13,7 @@ use tokio::sync::broadcast; use super::{Bucket, Key, KeyValue, Store, StoreError, StoreOutcome, WatchEvent}; -const MEMORY_EVENT_BUFFER_CAPACITY: usize = 16_384; +pub(crate) const MEMORY_EVENT_BUFFER_CAPACITY: usize = 16_384; #[derive(Clone, Debug)] enum MemoryEvent { diff --git a/lib/runtime/src/transports/event_plane/dynamic_subscriber.rs b/lib/runtime/src/transports/event_plane/dynamic_subscriber.rs index 547a7ed13070..c1def78af681 100644 --- a/lib/runtime/src/transports/event_plane/dynamic_subscriber.rs +++ b/lib/runtime/src/transports/event_plane/dynamic_subscriber.rs @@ -182,6 +182,7 @@ impl DynamicSubscriber { } } Ok(DiscoveryEvent::ModelTaintsUpdated(_)) => {} + Ok(DiscoveryEvent::Resync(_)) => {} Ok(DiscoveryEvent::Removed(instance_id)) => { let is_expected_topic = matches!( &instance_id, From 8bfb587b1222edb5734ce016f255f893d5b75044 Mon Sep 17 00:00:00 2001 From: atchernych Date: Fri, 18 Sep 2026 11:50:48 -0600 Subject: [PATCH 111/191] docs: document the EPP endpoint-picker failure mode (#14811) Signed-off-by: Anna Tchernych Co-authored-by: Claude Opus 5 (1M context) --- .../reference/components/gateway-api-routing.mdx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/fern/pages/reference/components/gateway-api-routing.mdx b/docs/fern/pages/reference/components/gateway-api-routing.mdx index c7bbb8a24781..d3af1be6b488 100644 --- a/docs/fern/pages/reference/components/gateway-api-routing.mdx +++ b/docs/fern/pages/reference/components/gateway-api-routing.mdx @@ -156,6 +156,22 @@ spec: Treat the generated `InferencePool`, EPP Service, and Deployment as operator-owned resources. Make persistent changes in the DGD. +### Endpoint Picker Failure Mode + +`InferencePool.spec.endpointPickerRef.failureMode` decides what the gateway does when the EPP does not +answer, such as when its pod is restarting or has failed: + +- `FailClose` drops the request. The client gets an error, in practice HTTP 500. +- `FailOpen` forwards the request to an endpoint the gateway picks. The request is served, but without + KV-aware routing. + +The operator does not set this field, so the Gateway API default of `FailClose` applies. Setting it by +hand on the generated `InferencePool` does not hold: the operator restores its own rendering on the +next reconcile, which leaves the field unset and lets the default apply again. No DGD field selects it. + +A standalone EPP is unaffected. Its `InferencePool` is user-applied, so the value you write is the +value you keep. The on-ramp example leaves the field out, so it also gets `FailClose`. + ## HTTPRoute Contract From 1f29d08a07724edd542e8563c7621f42b52070c9 Mon Sep 17 00:00:00 2001 From: GLAMR Date: Fri, 18 Sep 2026 13:57:04 -0400 Subject: [PATCH 112/191] fix(operator): validate an existing DGD before a DGDR adopts it (#13885) Signed-off-by: svc-glamr@nvidia.com Signed-off-by: Matej Kosec Co-authored-by: Matej Kosec --- ...dynamographdeploymentrequest_controller.go | 223 ++++++- ...ploymentrequest_controller_envtest_test.go | 595 +++++++++++++++++- 2 files changed, 794 insertions(+), 24 deletions(-) diff --git a/deploy/operator/internal/controller/dynamographdeploymentrequest_controller.go b/deploy/operator/internal/controller/dynamographdeploymentrequest_controller.go index d9f0d01e2767..b28d80d1cb9d 100644 --- a/deploy/operator/internal/controller/dynamographdeploymentrequest_controller.go +++ b/deploy/operator/internal/controller/dynamographdeploymentrequest_controller.go @@ -24,8 +24,11 @@ import ( "errors" "fmt" "io" + "reflect" + "sort" "strings" "text/template" + "time" batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" @@ -74,6 +77,8 @@ const ( // Annotation keys AnnotationAdditionalResources = "dgdr.nvidia.com/additional-resources" AnnotationGeneratedDGDSpec = "nvidia.com/generated-dgd-spec" + AnnotationDGDRUID = "nvidia.com/dgdr-uid" + AnnotationConfirmedDGDUID = "nvidia.com/confirmed-dgd-uid" // Size limits MaxAnnotationSize = 250000 // ~250KB, below K8s 256KB limit @@ -120,6 +125,10 @@ const ( MessageGenerationFailed = "GenerationFailed" MessageProfilingCheckFailed = "ProfilingCheckFailed" MessageModelCachePVCNotFound = "model cache PVC %s not found in namespace %s" + MessageDeploymentNameCollision = "DynamoGraphDeployment %s already exists in namespace %s and was not created by this request (%s). Refusing to adopt it. Delete this DynamoGraphDeploymentRequest and create a new one whose generated deployment uses a free name." + + // ReasonDeploymentNameCollision marks a DGD identity mismatch. + ReasonDeploymentNameCollision = "DeploymentNameCollision" ) var errProfilingOutputNotReady = errors.New("profiling output is not ready") @@ -818,9 +827,15 @@ func (r *DynamoGraphDeploymentRequestReconciler) handleDeployingPhase(ctx contex if err != nil { return ctrl.Result{}, err } - if err := r.clearGeneratedSpecAnnotation(ctx, dgdr); err != nil { + + // Confirm object identity before adopting resources or consuming deployment status. + mismatchReason, err := r.confirmDGDIdentity(ctx, dgdr, dgd) + if err != nil { return ctrl.Result{}, err } + if mismatchReason != "" { + return r.failDeploymentNameCollision(ctx, dgdr, dgd, mismatchReason) + } if err := r.adoptAdditionalResources(ctx, dgdr, dgd); err != nil { return ctrl.Result{}, fmt.Errorf("failed to adopt additional resources for DGD %s: %w", dgd.Name, err) @@ -884,6 +899,15 @@ func (r *DynamoGraphDeploymentRequestReconciler) handleDeployedPhase(ctx context return ctrl.Result{}, err } + // Confirm object identity before adopting resources or consuming deployment status. + mismatchReason, err := r.confirmDGDIdentity(ctx, dgdr, dgd) + if err != nil { + return ctrl.Result{}, err + } + if mismatchReason != "" { + return r.failDeploymentNameCollision(ctx, dgdr, dgd, mismatchReason) + } + if err := r.adoptAdditionalResources(ctx, dgdr, dgd); err != nil { return ctrl.Result{}, fmt.Errorf("failed to adopt additional resources for DGD %s: %w", dgd.Name, err) } @@ -948,16 +972,10 @@ func (r *DynamoGraphDeploymentRequestReconciler) createDGD(ctx context.Context, logger := log.FromContext(ctx) // Extract DGD spec from annotation (stored by generateDGDSpec) - dgdSpecYAML, ok := dgdr.Annotations[AnnotationGeneratedDGDSpec] - if !ok || dgdSpecYAML == "" { - return ctrl.Result{}, fmt.Errorf("generated DGD spec not found in annotation %s", AnnotationGeneratedDGDSpec) - } - - generatedDGD, err := r.extractDGDFromYAML([]byte(dgdSpecYAML)) + generatedDGD, err := r.generatedDGDFromAnnotation(dgdr) if err != nil { - return ctrl.Result{}, fmt.Errorf("failed to unmarshal generated deployment from annotation: %w", err) + return ctrl.Result{}, err } - applyDGDRRuntimeVersionOverride(dgdr, generatedDGD) // Determine DGD name and namespace from generated deployment dgdName := generatedDGD.Name @@ -986,6 +1004,7 @@ func (r *DynamoGraphDeploymentRequestReconciler) createDGD(ctx context.Context, annotations[k] = v } } + annotations[AnnotationDGDRUID] = string(dgdr.UID) // Create DGD from generated deployment dgd := &nvidiacomv1beta1.DynamoGraphDeployment{ @@ -1006,9 +1025,10 @@ func (r *DynamoGraphDeploymentRequestReconciler) createDGD(ctx context.Context, if err := r.Create(ctx, dgd); err != nil { if apierrors.IsAlreadyExists(err) { - // The DGD watch reconciles again after the object is in the informer cache. - logger.Info("DGD already exists, waiting for informer observation") - return ctrl.Result{}, nil + // A foreign DGD may not route watch events to this request. Retry the + // level-driven observation path even when the informer has not caught up. + logger.Info("DGD already exists, requeueing for identity confirmation") + return ctrl.Result{RequeueAfter: dgdCollisionRequeueDelay}, nil } r.Recorder.Eventf(dgdr, dgd, corev1.EventTypeWarning, MessageDeploymentCreationFailed, "Create", "%s", err.Error()) // Admission webhook denials and other permanent API rejections (400/403/422) @@ -1031,15 +1051,174 @@ func (r *DynamoGraphDeploymentRequestReconciler) createDGD(ctx context.Context, return ctrl.Result{}, nil } -// clearGeneratedSpecAnnotation marks the DGD as observed in the informer cache. -func (r *DynamoGraphDeploymentRequestReconciler) clearGeneratedSpecAnnotation( +// dgdCollisionRequeueDelay retries the identity check after an AlreadyExists create +// the cache cannot yet see. A foreign DGD carries no labels, so no watch delivers it. +const dgdCollisionRequeueDelay = 5 * time.Second + +// generatedDGDFromAnnotation decodes the deployment this request intends to create +// from the generated-spec annotation, applying the runtime version override to a fresh copy. +func (r *DynamoGraphDeploymentRequestReconciler) generatedDGDFromAnnotation( + dgdr *nvidiacomv1beta1.DynamoGraphDeploymentRequest, +) (*nvidiacomv1beta1.DynamoGraphDeployment, error) { + dgdSpecYAML := dgdr.Annotations[AnnotationGeneratedDGDSpec] + if dgdSpecYAML == "" { + return nil, fmt.Errorf("generated DGD spec not found in annotation %s", AnnotationGeneratedDGDSpec) + } + + generatedDGD, err := r.extractDGDFromYAML([]byte(dgdSpecYAML)) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal generated deployment from annotation: %w", err) + } + applyDGDRRuntimeVersionOverride(dgdr, generatedDGD) + + return generatedDGD, nil +} + +// generatedSpecDivergence returns the first field path where liveDGD fails to carry what +// generatedDGD asks for. Subset, not equality: only liveDGD has been through defaulting. +func generatedSpecDivergence(liveDGD, generatedDGD *nvidiacomv1beta1.DynamoGraphDeployment) (string, error) { + liveSpec, err := specAsJSONValue(liveDGD) + if err != nil { + return "", fmt.Errorf("failed to encode the live deployment spec for comparison: %w", err) + } + generatedSpec, err := specAsJSONValue(generatedDGD) + if err != nil { + return "", fmt.Errorf("failed to encode the generated deployment spec for comparison: %w", err) + } + + return jsonSubsetDivergence(generatedSpec, liveSpec, "spec"), nil +} + +// specAsJSONValue renders dgd's spec as the generic JSON value the API server saw, +// so an omitempty field is absent here exactly when it was absent on the wire. +func specAsJSONValue(dgd *nvidiacomv1beta1.DynamoGraphDeployment) (any, error) { + encoded, err := json.Marshal(dgd.Spec) + if err != nil { + return nil, err + } + var decoded any + if err := json.Unmarshal(encoded, &decoded); err != nil { + return nil, err + } + return decoded, nil +} + +// jsonSubsetDivergence returns the path of the first place where have does not carry +// what want specifies. Keys walk in sorted order so the reported path is stable. +func jsonSubsetDivergence(want, have any, path string) string { + switch wantValue := want.(type) { + case map[string]any: + haveObject, isObject := have.(map[string]any) + if !isObject { + return path + } + keys := make([]string, 0, len(wantValue)) + for key := range wantValue { + keys = append(keys, key) + } + sort.Strings(keys) + for _, key := range keys { + haveChild, present := haveObject[key] + if !present { + return path + "." + key + } + if divergence := jsonSubsetDivergence(wantValue[key], haveChild, path+"."+key); divergence != "" { + return divergence + } + } + return "" + case []any: + haveList, isList := have.([]any) + if !isList || len(haveList) != len(wantValue) { + return path + } + for index := range wantValue { + if divergence := jsonSubsetDivergence(wantValue[index], haveList[index], fmt.Sprintf("%s[%d]", path, index)); divergence != "" { + return divergence + } + } + return "" + default: + if !reflect.DeepEqual(want, have) { + return path + } + return "" + } +} + +// failDeploymentNameCollision drives the request terminal. The status-only write preserves +// the generated-spec annotation, so what this request meant to create stays inspectable. +// The event follows the status write, so a failed write cannot leave a warning recorded +// against a request that still reports Deploying and re-emit it on the next reconcile. +func (r *DynamoGraphDeploymentRequestReconciler) failDeploymentNameCollision( ctx context.Context, dgdr *nvidiacomv1beta1.DynamoGraphDeploymentRequest, -) error { - if dgdr.Annotations[AnnotationGeneratedDGDSpec] == "" { - return nil + liveDGD *nvidiacomv1beta1.DynamoGraphDeployment, + mismatchReason string, +) (ctrl.Result, error) { + message := fmt.Sprintf(MessageDeploymentNameCollision, liveDGD.Name, dgdr.Namespace, mismatchReason) + + log.FromContext(ctx).Info("Refusing to adopt an existing DGD that failed the DGDR identity contract", + "dgd", liveDGD.Name, "namespace", dgdr.Namespace, "reason", mismatchReason) + + result, err := r.updatePhaseWithCondition(ctx, dgdr, nvidiacomv1beta1.DGDRPhaseFailed, + nvidiacomv1beta1.ConditionTypeDeploymentReady, metav1.ConditionFalse, + ReasonDeploymentNameCollision, message) + if err != nil { + return result, err + } + r.Recorder.Eventf(dgdr, liveDGD, corev1.EventTypeWarning, ReasonDeploymentNameCollision, "Get", "%s", message) + + return result, nil +} + +// confirmDGDIdentity validates an unbound deployment and durably binds its UID before +// resource adoption. Later observations compare UIDs without rechecking mutable specs. +// dgdr and dgd must be non-nil; successful persistence updates dgdr's metadata in place. +func (r *DynamoGraphDeploymentRequestReconciler) confirmDGDIdentity( + ctx context.Context, + dgdr *nvidiacomv1beta1.DynamoGraphDeploymentRequest, + dgd *nvidiacomv1beta1.DynamoGraphDeployment, +) (string, error) { + // A persisted binding rejects replacements even if they copy the tracking metadata. + if uid := dgdr.Annotations[AnnotationConfirmedDGDUID]; uid != "" { + if uid != string(dgd.UID) { + return "its UID differs from the confirmed deployment", nil + } + return "", nil + } + + // Bootstrap legacy requests once from their tracking metadata. A missing DGD-side + // UID remains compatible with older operators; an explicit mismatch never does. + if dgd.Labels[nvidiacomv1beta1.LabelDGDRName] != dgdr.Name || + dgd.Labels[nvidiacomv1beta1.LabelDGDRNamespace] != dgdr.Namespace || + dgd.Labels[nvidiacomv1beta1.LabelManagedBy] != nvidiacomv1beta1.LabelValueDynamoOperator { + return "it does not carry this request's tracking labels", nil + } + if uid, bound := dgd.Annotations[AnnotationDGDRUID]; bound && uid != string(dgdr.UID) { + return "it is not bound to this request's UID", nil + } + + // Validate generated intent only before the original confirmation marker is cleared. + if dgdr.Annotations[AnnotationGeneratedDGDSpec] != "" { + generatedDGD, err := r.generatedDGDFromAnnotation(dgdr) + if err != nil { + return "", err + } + divergence, err := generatedSpecDivergence(dgd, generatedDGD) + if err != nil { + return "", err + } + if divergence != "" { + return fmt.Sprintf("its %s differs from the spec this request generated", divergence), nil + } + } + + // Commit the UID and marker together so an interrupted confirmation cannot lose identity. + annotations := map[string]any{ + AnnotationGeneratedDGDSpec: "", + AnnotationConfirmedDGDUID: string(dgd.UID), } - annotations := map[string]any{AnnotationGeneratedDGDSpec: ""} if additionalResources := dgdr.Annotations[AnnotationAdditionalResources]; additionalResources != "" { annotations[AnnotationAdditionalResources] = additionalResources } @@ -1054,11 +1233,15 @@ func (r *DynamoGraphDeploymentRequestReconciler) clearGeneratedSpecAnnotation( }, }} if err := r.Apply(ctx, client.ApplyConfigurationFromUnstructured(apply), client.FieldOwner("dynamo-operator-dgdr"), client.ForceOwnership); err != nil { - return fmt.Errorf("failed to clear generated DGD annotation: %w", err) + return "", fmt.Errorf("failed to persist confirmed DGD identity: %w", err) + } + if dgdr.Annotations == nil { + dgdr.Annotations = make(map[string]string) } dgdr.Annotations[AnnotationGeneratedDGDSpec] = "" + dgdr.Annotations[AnnotationConfirmedDGDUID] = string(dgd.UID) dgdr.ResourceVersion = apply.GetResourceVersion() - return nil + return "", nil } // adoptAdditionalResources makes profiling-generated ConfigMaps follow the DGD lifecycle. diff --git a/deploy/operator/internal/controller/dynamographdeploymentrequest_controller_envtest_test.go b/deploy/operator/internal/controller/dynamographdeploymentrequest_controller_envtest_test.go index 8afa966084da..3f54a4149d2c 100644 --- a/deploy/operator/internal/controller/dynamographdeploymentrequest_controller_envtest_test.go +++ b/deploy/operator/internal/controller/dynamographdeploymentrequest_controller_envtest_test.go @@ -67,6 +67,23 @@ func (c *writeFaultClient) Apply(ctx context.Context, obj runtime.ApplyConfigura return c.Client.Apply(ctx, obj, opts...) } +// dgdCacheMissClient hides one DGD observation while writes reach the API server. +type dgdCacheMissClient struct { + client.Client + unobservedDGD client.ObjectKey +} + +func (c *dgdCacheMissClient) Get(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error { + // Model an informer that has not observed the DGD yet, then allow subsequent reads. + if _, isDGD := obj.(*nvidiacomv1beta1.DynamoGraphDeployment); isDGD && key == c.unobservedDGD { + c.unobservedDGD = client.ObjectKey{} + return apierrors.NewNotFound(schema.GroupResource{ + Group: nvidiacomv1beta1.GroupVersion.Group, Resource: "dynamographdeployments", + }, key.Name) + } + return c.Client.Get(ctx, key, obj, opts...) +} + var _ = Describe("DynamoGraphDeploymentRequest Controller", func() { const ( timeout = time.Second * 10 @@ -1217,13 +1234,16 @@ spec: Expect(outputCM.OwnerReferences[0].Name).Should(Equal(dgdrName)) }) - It("Should adopt additional ConfigMaps when DGD already exists", func() { + It("Should adopt additional ConfigMaps when the existing DGD is this request's own deployment", func() { ctx := context.Background() dgdrName := "test-dgdr-existing-dgd-adopt" namespace := envtestNamespace dgdName := dgdrName + "-dgd" additionalConfigMapName := "planner-config-existing-dgd" + t := GinkgoT() + t.Log("Given a DGDR whose generated spec describes the DGD that already exists") + dgdr := &nvidiacomv1beta1.DynamoGraphDeploymentRequest{ ObjectMeta: metav1.ObjectMeta{ Name: dgdrName, @@ -1238,7 +1258,12 @@ spec: components: - name: worker type: worker - replicas: 1`, + replicas: 1 + podTemplate: + spec: + containers: + - name: main + image: registry.example/runtime:1.1.0`, }, }, Spec: nvidiacomv1beta1.DynamoGraphDeploymentRequestSpec{ @@ -1253,10 +1278,20 @@ spec: dgdr.Status.DGDName = dgdName Expect(k8sClient.Status().Update(ctx, dgdr)).Should(Succeed()) + t.Log("And the DGD carries this DGDR's tracking labels, as createDGD would have written them") + dgd := &nvidiacomv1beta1.DynamoGraphDeployment{ ObjectMeta: metav1.ObjectMeta{ Name: dgdName, Namespace: namespace, + Labels: map[string]string{ + nvidiacomv1beta1.LabelDGDRName: dgdrName, + nvidiacomv1beta1.LabelDGDRNamespace: namespace, + nvidiacomv1beta1.LabelManagedBy: nvidiacomv1beta1.LabelValueDynamoOperator, + }, + Annotations: map[string]string{ + AnnotationDGDRUID: string(dgdr.UID), + }, }, Spec: nvidiacomv1beta1.DynamoGraphDeploymentSpec{ BackendFramework: "vllm", @@ -1288,9 +1323,14 @@ spec: Expect(k8sClient.Create(ctx, additionalCM)).Should(Succeed()) defer func() { _ = k8sClient.Delete(ctx, additionalCM) }() + t.Log("When the deploying phase runs against the interrupted create") + _, err := reconciler.handleDeployingPhase(ctx, dgdr) Expect(err).NotTo(HaveOccurred()) + t.Log("Then the request recovers: it adopts the DGD and reparents the additional ConfigMap") + + Expect(dgdr.Status.Phase).ShouldNot(Equal(nvidiacomv1beta1.DGDRPhaseFailed)) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: additionalConfigMapName, Namespace: namespace}, additionalCM)).Should(Succeed()) Expect(additionalCM.OwnerReferences).Should(HaveLen(1)) Expect(additionalCM.OwnerReferences[0].Kind).Should(Equal("DynamoGraphDeployment")) @@ -1372,6 +1412,542 @@ spec: Expect(k8sClient.Get(ctx, types.NamespacedName{Name: additionalConfigMapName, Namespace: namespace}, additionalCM)).Should(Succeed()) Expect(additionalCM.ResourceVersion).Should(Equal(resourceVersion)) }) + + DescribeTable("Should refuse to adopt an existing DGD that is not this request's own deployment", + func(nameSuffix string, trackedByThisRequest bool, liveWorkerImage string, cacheMiss bool) { + ctx := context.Background() + t := GinkgoT() + namespace := envtestNamespace + dgdrName := "test-dgdr-collision-" + nameSuffix + dgdName := dgdrName + "-dgd" + additionalConfigMapName := "planner-config-collision-" + nameSuffix + + t.Log("Given a DGDR deploying a generated spec it has not yet confirmed") + + dgdr := &nvidiacomv1beta1.DynamoGraphDeploymentRequest{ + ObjectMeta: metav1.ObjectMeta{ + Name: dgdrName, + Namespace: namespace, + Annotations: map[string]string{ + "nvidia.com/generated-dgd-spec": `apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: ` + dgdName + ` +spec: + backendFramework: vllm + components: + - name: worker + type: worker + replicas: 1 + podTemplate: + spec: + containers: + - name: main + image: registry.example/runtime:1.1.0`, + }, + }, + Spec: nvidiacomv1beta1.DynamoGraphDeploymentRequestSpec{ + Model: "test-model", + Backend: "vllm", + Image: "test-profiler:1.1.0", + }, + } + Expect(k8sClient.Create(ctx, dgdr)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, dgdr) }() + dgdr.Status.Phase = nvidiacomv1beta1.DGDRPhaseDeploying + dgdr.Status.DGDName = dgdName + Expect(k8sClient.Status().Update(ctx, dgdr)).Should(Succeed()) + + t.Log("And a DGD already occupying that name that fails one half of the identity contract") + + labels := map[string]string{} + annotations := map[string]string{} + if trackedByThisRequest { + labels = map[string]string{ + nvidiacomv1beta1.LabelDGDRName: dgdrName, + nvidiacomv1beta1.LabelDGDRNamespace: namespace, + nvidiacomv1beta1.LabelManagedBy: nvidiacomv1beta1.LabelValueDynamoOperator, + } + annotations[AnnotationDGDRUID] = string(dgdr.UID) + } + + existingDGD := &nvidiacomv1beta1.DynamoGraphDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: dgdName, + Namespace: namespace, + Labels: labels, + Annotations: annotations, + }, + Spec: nvidiacomv1beta1.DynamoGraphDeploymentSpec{ + BackendFramework: "vllm", + Components: []nvidiacomv1beta1.DynamoComponentDeploymentSharedSpec{{ + ComponentName: "worker", + ComponentType: nvidiacomv1beta1.ComponentTypeWorker, + Replicas: ptr.To[int32](1), + PodTemplate: &corev1.PodTemplateSpec{Spec: corev1.PodSpec{ + Containers: []corev1.Container{{Name: consts.MainContainerName, Image: liveWorkerImage}}, + }}, + }}, + }, + } + Expect(k8sClient.Create(ctx, existingDGD)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, existingDGD) }() + + additionalCM := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: additionalConfigMapName, + Namespace: namespace, + Labels: map[string]string{ + nvidiacomv1beta1.LabelDGDRName: dgdrName, + nvidiacomv1beta1.LabelDGDRNamespace: namespace, + nvidiacomv1beta1.LabelManagedBy: nvidiacomv1beta1.LabelValueDynamoOperator, + }, + }, + Data: map[string]string{"planner_config.json": "{}"}, + } + Expect(k8sClient.Create(ctx, additionalCM)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, additionalCM) }() + + if cacheMiss { + t.Log("When the cache misses the existing DGD, creation reaches the API server and returns AlreadyExists") + + reconciler.Client = &dgdCacheMissClient{ + Client: k8sClient, unobservedDGD: client.ObjectKeyFromObject(existingDGD), + } + result, err := reconciler.handleDeployingPhase(ctx, dgdr) + Expect(err).NotTo(HaveOccurred()) + Expect(result.RequeueAfter).Should(BeNumerically(">", 0)) + t.Logf("The collision schedules another observation after %s", result.RequeueAfter) + + t.Log("Then the request retains its generated intent without confirming or adopting the unseen DGD") + + Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(dgdr), dgdr)).Should(Succeed()) + Expect(dgdr.Status.Phase).Should(Equal(nvidiacomv1beta1.DGDRPhaseDeploying)) + Expect(dgdr.Annotations[AnnotationGeneratedDGDSpec]).ShouldNot(BeEmpty()) + Expect(dgdr.Annotations[AnnotationConfirmedDGDUID]).Should(BeEmpty()) + Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(additionalCM), additionalCM)).Should(Succeed()) + Expect(additionalCM.OwnerReferences).Should(BeEmpty()) + } + + t.Log("When the deploying phase observes the same-name DGD") + + _, err := reconciler.handleDeployingPhase(ctx, dgdr) + Expect(err).NotTo(HaveOccurred()) + + t.Log("Then the request goes terminal with a name-collision condition instead of adopting") + + Expect(dgdr.Status.Phase).Should(Equal(nvidiacomv1beta1.DGDRPhaseFailed)) + condition := meta.FindStatusCondition(dgdr.Status.Conditions, nvidiacomv1beta1.ConditionTypeDeploymentReady) + Expect(condition).NotTo(BeNil()) + Expect(condition.Status).Should(Equal(metav1.ConditionFalse)) + Expect(condition.Reason).Should(Equal(ReasonDeploymentNameCollision)) + + t.Log("And the generated spec survives, so the intended deployment stays recoverable") + + persistedDGDR := &nvidiacomv1beta1.DynamoGraphDeploymentRequest{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: dgdrName, Namespace: namespace}, persistedDGDR)).Should(Succeed()) + Expect(persistedDGDR.Status.Phase).Should(Equal(nvidiacomv1beta1.DGDRPhaseFailed)) + Expect(persistedDGDR.Annotations["nvidia.com/generated-dgd-spec"]).ShouldNot(BeEmpty()) + + t.Log("And nothing this request owns is reparented onto the foreign deployment") + + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: additionalConfigMapName, Namespace: namespace}, additionalCM)).Should(Succeed()) + Expect(additionalCM.OwnerReferences).Should(BeEmpty()) + + t.Log("And the foreign deployment itself is left exactly as it was") + + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: dgdName, Namespace: namespace}, existingDGD)).Should(Succeed()) + Expect(existingDGD.Spec.Components[0].PodTemplate.Spec.Containers[0].Image).Should(Equal(liveWorkerImage)) + }, + Entry("when it does not carry this request's tracking labels", "foreign", false, "registry.example/runtime:1.1.0", false), + Entry("when its spec differs from the spec this request generated", "spec-drift", true, "registry.example/other:9.9.9", false), + Entry("after AlreadyExists retries an initially stale cache", "cache-miss", false, "registry.example/runtime:1.1.0", true), + ) + + DescribeTable("Should reject a same-name DGD replacement after confirmation", + func(phase nvidiacomv1beta1.DGDRPhase) { + ctx := context.Background() + t := GinkgoT() + dgdrName := "confirmed-replacement-" + strings.ToLower(string(phase)) + dgdName := dgdrName + "-dgd" + + t.Log("Given a request that creates its DGD through the controller") + + dgdr := &nvidiacomv1beta1.DynamoGraphDeploymentRequest{ + ObjectMeta: metav1.ObjectMeta{ + Name: dgdrName, Namespace: envtestNamespace, + Annotations: map[string]string{ + AnnotationGeneratedDGDSpec: `apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: ` + dgdName + ` +spec: + backendFramework: vllm + components: + - name: worker + type: worker + replicas: 1 + podTemplate: + spec: + containers: + - name: main + image: registry.example/runtime:1.1.0`, + }, + }, + Spec: nvidiacomv1beta1.DynamoGraphDeploymentRequestSpec{ + Model: "test-model", Backend: "vllm", Image: "test-profiler:1.1.0", + }, + } + Expect(k8sClient.Create(ctx, dgdr)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, dgdr) }() + dgdr.Status.Phase = nvidiacomv1beta1.DGDRPhaseDeploying + dgdr.Status.DGDName = dgdName + Expect(k8sClient.Status().Update(ctx, dgdr)).Should(Succeed()) + _, err := reconciler.createDGD(ctx, dgdr) + Expect(err).NotTo(HaveOccurred()) + + t.Log("When the controller observes the original DGD, its UID is persisted on the DGDR") + + originalDGD := &nvidiacomv1beta1.DynamoGraphDeployment{} + dgdKey := client.ObjectKey{Name: dgdName, Namespace: envtestNamespace} + Expect(k8sClient.Get(ctx, dgdKey, originalDGD)).Should(Succeed()) + originalDGD.Status.State = nvidiacomv1beta1.DGDStatePending + availableReplicas := int32(0) + if phase == nvidiacomv1beta1.DGDRPhaseDeployed { + originalDGD.Status.State = nvidiacomv1beta1.DGDStateSuccessful + availableReplicas = 1 + } + originalDGD.Status.Components = map[string]nvidiacomv1beta1.ComponentReplicaStatus{ + "worker": {ComponentKind: nvidiacomv1beta1.ComponentKindDeployment, Replicas: 1, AvailableReplicas: ptr.To(availableReplicas)}, + } + Expect(k8sClient.Status().Update(ctx, originalDGD)).Should(Succeed()) + _, err = reconciler.handleDeployingPhase(ctx, dgdr) + Expect(err).NotTo(HaveOccurred()) + Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(dgdr), dgdr)).Should(Succeed()) + Expect(dgdr.Status.Phase).Should(Equal(phase)) + Expect(dgdr.Annotations[AnnotationConfirmedDGDUID]).Should(Equal(string(originalDGD.UID))) + Expect(dgdr.Annotations[AnnotationGeneratedDGDSpec]).Should(BeEmpty()) + confirmedInfo := dgdr.Status.DeploymentInfo.DeepCopy() + + t.Log("And an additional ConfigMap arrives after confirmation, still without an owner") + + additionalCM := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: dgdrName + "-config", Namespace: envtestNamespace, + Labels: originalDGD.DeepCopy().Labels, + }, + Data: map[string]string{"planner_config.json": "{}"}, + } + Expect(k8sClient.Create(ctx, additionalCM)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, additionalCM) }() + + t.Log("When a same-name replacement copies the original spec and tracking metadata but has a new UID") + + Expect(k8sClient.Delete(ctx, originalDGD)).Should(Succeed()) + Eventually(func() bool { + return apierrors.IsNotFound(k8sClient.Get(ctx, dgdKey, &nvidiacomv1beta1.DynamoGraphDeployment{})) + }, timeout, interval).Should(BeTrue()) + replacement := originalDGD.DeepCopy() + replacement.ObjectMeta = metav1.ObjectMeta{ + Name: dgdName, Namespace: envtestNamespace, + Labels: replacement.Labels, Annotations: replacement.Annotations, + } + Expect(k8sClient.Create(ctx, replacement)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, replacement) }() + Expect(replacement.UID).ShouldNot(Equal(originalDGD.UID)) + replacement.Status.State = nvidiacomv1beta1.DGDStateSuccessful + if phase == nvidiacomv1beta1.DGDRPhaseDeployed { + replacement.Status.State = nvidiacomv1beta1.DGDStateFailed + } + replacement.Status.Components = map[string]nvidiacomv1beta1.ComponentReplicaStatus{ + "worker": {ComponentKind: nvidiacomv1beta1.ComponentKindDeployment, Replicas: 1, AvailableReplicas: ptr.To(1 - availableReplicas)}, + } + Expect(k8sClient.Status().Update(ctx, replacement)).Should(Succeed()) + + t.Log("Then observation rejects the replacement before adopting resources or consuming its status") + + if phase == nvidiacomv1beta1.DGDRPhaseDeploying { + _, err = reconciler.handleDeployingPhase(ctx, dgdr) + } else { + _, err = reconciler.handleDeployedPhase(ctx, dgdr) + } + Expect(err).NotTo(HaveOccurred()) + Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(dgdr), dgdr)).Should(Succeed()) + Expect(dgdr.Status.Phase).Should(Equal(nvidiacomv1beta1.DGDRPhaseFailed)) + condition := meta.FindStatusCondition(dgdr.Status.Conditions, nvidiacomv1beta1.ConditionTypeDeploymentReady) + Expect(condition).NotTo(BeNil()) + Expect(condition.Status).Should(Equal(metav1.ConditionFalse)) + Expect(condition.Reason).Should(Equal(ReasonDeploymentNameCollision)) + Expect(dgdr.Annotations[AnnotationConfirmedDGDUID]).Should(Equal(string(originalDGD.UID))) + Expect(dgdr.Annotations[AnnotationGeneratedDGDSpec]).Should(BeEmpty()) + Expect(dgdr.Status.DeploymentInfo).Should(Equal(confirmedInfo)) + Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(additionalCM), additionalCM)).Should(Succeed()) + Expect(additionalCM.OwnerReferences).Should(BeEmpty()) + Expect(k8sClient.Get(ctx, dgdKey, replacement)).Should(Succeed()) + Expect(replacement.OwnerReferences).Should(BeEmpty()) + }, + Entry("while Deploying", nvidiacomv1beta1.DGDRPhaseDeploying), + Entry("while Deployed", nvidiacomv1beta1.DGDRPhaseDeployed), + ) + + It("Should refuse a recreated DGDR from adopting its prior DGD", func() { + ctx := context.Background() + t := GinkgoT() + namespace := envtestNamespace + dgdrName := "test-dgdr-recreated" + dgdName := dgdrName + "-dgd" + additionalConfigMapName := "planner-config-recreated" + + t.Log("Given an original DGDR and DGD with matching labels and spec") + + originalDGDR := &nvidiacomv1beta1.DynamoGraphDeploymentRequest{ + ObjectMeta: metav1.ObjectMeta{ + Name: dgdrName, + Namespace: namespace, + Annotations: map[string]string{ + AnnotationGeneratedDGDSpec: `apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: ` + dgdName + ` +spec: + backendFramework: vllm + components: + - name: worker + type: worker + replicas: 1 + podTemplate: + spec: + containers: + - name: main + image: registry.example/runtime:1.1.0`, + }, + }, + Spec: nvidiacomv1beta1.DynamoGraphDeploymentRequestSpec{ + Model: "test-model", + Backend: "vllm", + Image: "test-profiler:1.1.0", + }, + } + Expect(k8sClient.Create(ctx, originalDGDR)).Should(Succeed()) + originalDGDR.Status.Phase = nvidiacomv1beta1.DGDRPhaseDeploying + originalDGDR.Status.DGDName = dgdName + Expect(k8sClient.Status().Update(ctx, originalDGDR)).Should(Succeed()) + + priorDGD := &nvidiacomv1beta1.DynamoGraphDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: dgdName, + Namespace: namespace, + Labels: map[string]string{ + nvidiacomv1beta1.LabelDGDRName: dgdrName, + nvidiacomv1beta1.LabelDGDRNamespace: namespace, + nvidiacomv1beta1.LabelManagedBy: nvidiacomv1beta1.LabelValueDynamoOperator, + }, + Annotations: map[string]string{ + AnnotationDGDRUID: string(originalDGDR.UID), + }, + }, + Spec: nvidiacomv1beta1.DynamoGraphDeploymentSpec{ + BackendFramework: "vllm", + Components: []nvidiacomv1beta1.DynamoComponentDeploymentSharedSpec{{ + ComponentName: "worker", + ComponentType: nvidiacomv1beta1.ComponentTypeWorker, + Replicas: ptr.To[int32](1), + PodTemplate: &corev1.PodTemplateSpec{Spec: corev1.PodSpec{ + Containers: []corev1.Container{{Name: consts.MainContainerName, Image: "registry.example/runtime:1.1.0"}}, + }}, + }}, + }, + } + Expect(k8sClient.Create(ctx, priorDGD)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, priorDGD) }() + + additionalCM := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: additionalConfigMapName, + Namespace: namespace, + Labels: map[string]string{ + nvidiacomv1beta1.LabelDGDRName: dgdrName, + nvidiacomv1beta1.LabelDGDRNamespace: namespace, + nvidiacomv1beta1.LabelManagedBy: nvidiacomv1beta1.LabelValueDynamoOperator, + }, + }, + Data: map[string]string{"planner_config.json": "{}"}, + } + Expect(k8sClient.Create(ctx, additionalCM)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, additionalCM) }() + + t.Log("When the original DGDR is deleted and recreated with the same name and spec") + + Expect(k8sClient.Delete(ctx, originalDGDR)).Should(Succeed()) + Eventually(func() bool { + return apierrors.IsNotFound(k8sClient.Get(ctx, types.NamespacedName{Name: dgdrName, Namespace: namespace}, &nvidiacomv1beta1.DynamoGraphDeploymentRequest{})) + }, timeout, interval).Should(BeTrue()) + + recreatedDGDR := &nvidiacomv1beta1.DynamoGraphDeploymentRequest{ + ObjectMeta: metav1.ObjectMeta{ + Name: dgdrName, + Namespace: namespace, + Annotations: map[string]string{ + AnnotationGeneratedDGDSpec: originalDGDR.Annotations[AnnotationGeneratedDGDSpec], + }, + }, + Spec: originalDGDR.Spec, + } + Expect(k8sClient.Create(ctx, recreatedDGDR)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, recreatedDGDR) }() + Expect(recreatedDGDR.UID).ShouldNot(Equal(originalDGDR.UID)) + recreatedDGDR.Status.Phase = nvidiacomv1beta1.DGDRPhaseDeploying + recreatedDGDR.Status.DGDName = dgdName + Expect(k8sClient.Status().Update(ctx, recreatedDGDR)).Should(Succeed()) + + t.Log("Then the recreated DGDR rejects the DGD bound to the original request") + + _, err := reconciler.handleDeployingPhase(ctx, recreatedDGDR) + Expect(err).NotTo(HaveOccurred()) + Expect(recreatedDGDR.Status.Phase).Should(Equal(nvidiacomv1beta1.DGDRPhaseFailed)) + condition := meta.FindStatusCondition(recreatedDGDR.Status.Conditions, nvidiacomv1beta1.ConditionTypeDeploymentReady) + Expect(condition).NotTo(BeNil()) + Expect(condition.Reason).Should(Equal(ReasonDeploymentNameCollision)) + + t.Log("And the stale DGD and ConfigMap are not adopted") + + persistedDGDR := &nvidiacomv1beta1.DynamoGraphDeploymentRequest{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: dgdrName, Namespace: namespace}, persistedDGDR)).Should(Succeed()) + Expect(persistedDGDR.Annotations[AnnotationGeneratedDGDSpec]).ShouldNot(BeEmpty()) + + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: additionalConfigMapName, Namespace: namespace}, additionalCM)).Should(Succeed()) + Expect(additionalCM.OwnerReferences).Should(BeEmpty()) + }) + + It("Should adopt an existing DGD whose live spec differs only by API-server structural defaults", func() { + ctx := context.Background() + t := GinkgoT() + namespace := envtestNamespace + dgdrName := "test-dgdr-structural-defaults" + dgdName := dgdrName + "-dgd" + additionalConfigMapName := "planner-config-structural-defaults" + + t.Log("Given a generated spec that declares a container port and omits its protocol") + + // A port protocol is the cheapest reachable instance of the whole class: the + // CRD's structural defaults apply on write, and the annotation bypasses them. + dgdr := &nvidiacomv1beta1.DynamoGraphDeploymentRequest{ + ObjectMeta: metav1.ObjectMeta{ + Name: dgdrName, + Namespace: namespace, + Annotations: map[string]string{ + AnnotationGeneratedDGDSpec: `apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: ` + dgdName + ` +spec: + backendFramework: vllm + components: + - name: worker + type: worker + replicas: 1 + podTemplate: + spec: + containers: + - name: main + image: registry.example/runtime:1.1.0 + ports: + - name: http + containerPort: 8000`, + }, + }, + Spec: nvidiacomv1beta1.DynamoGraphDeploymentRequestSpec{ + Model: "test-model", + Backend: "vllm", + Image: "test-profiler:1.1.0", + }, + } + Expect(k8sClient.Create(ctx, dgdr)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, dgdr) }() + dgdr.Status.Phase = nvidiacomv1beta1.DGDRPhaseDeploying + dgdr.Status.DGDName = dgdName + Expect(k8sClient.Status().Update(ctx, dgdr)).Should(Succeed()) + + t.Log("And this request's own DGD persisted from that spec, which the API server defaulted") + + dgd := &nvidiacomv1beta1.DynamoGraphDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: dgdName, + Namespace: namespace, + Labels: map[string]string{ + nvidiacomv1beta1.LabelDGDRName: dgdrName, + nvidiacomv1beta1.LabelDGDRNamespace: namespace, + nvidiacomv1beta1.LabelManagedBy: nvidiacomv1beta1.LabelValueDynamoOperator, + }, + Annotations: map[string]string{ + AnnotationDGDRUID: string(dgdr.UID), + }, + }, + Spec: nvidiacomv1beta1.DynamoGraphDeploymentSpec{ + BackendFramework: "vllm", + Components: []nvidiacomv1beta1.DynamoComponentDeploymentSharedSpec{{ + ComponentName: "worker", + ComponentType: nvidiacomv1beta1.ComponentTypeWorker, + Replicas: ptr.To[int32](1), + PodTemplate: &corev1.PodTemplateSpec{Spec: corev1.PodSpec{ + Containers: []corev1.Container{{ + Name: consts.MainContainerName, + Image: "registry.example/runtime:1.1.0", + Ports: []corev1.ContainerPort{{Name: "http", ContainerPort: 8000}}, + }}, + }}, + }}, + }, + } + Expect(k8sClient.Create(ctx, dgd)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, dgd) }() + + t.Log("Then the persisted object really does carry a default the generated spec never had") + + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: dgdName, Namespace: namespace}, dgd)).Should(Succeed()) + Expect(dgd.Spec.Components[0].PodTemplate.Spec.Containers[0].Ports[0].Protocol). + Should(Equal(corev1.ProtocolTCP), "the CRD's structural default must actually be applied, or this spec proves nothing") + + additionalCM := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: additionalConfigMapName, + Namespace: namespace, + Labels: map[string]string{ + nvidiacomv1beta1.LabelDGDRName: dgdrName, + nvidiacomv1beta1.LabelDGDRNamespace: namespace, + nvidiacomv1beta1.LabelManagedBy: nvidiacomv1beta1.LabelValueDynamoOperator, + }, + }, + Data: map[string]string{"planner_config.json": "{}"}, + } + Expect(k8sClient.Create(ctx, additionalCM)).Should(Succeed()) + defer func() { _ = k8sClient.Delete(ctx, additionalCM) }() + + t.Log("When the deploying phase observes the DGD this request created") + + _, err := reconciler.handleDeployingPhase(ctx, dgdr) + Expect(err).NotTo(HaveOccurred()) + + t.Log("Then the request adopts its own deployment instead of colliding with it") + + Expect(dgdr.Status.Phase).ShouldNot(Equal(nvidiacomv1beta1.DGDRPhaseFailed)) + condition := meta.FindStatusCondition(dgdr.Status.Conditions, nvidiacomv1beta1.ConditionTypeDeploymentReady) + if condition != nil { + Expect(condition.Reason).ShouldNot(Equal(ReasonDeploymentNameCollision)) + } + + t.Log("And adoption really ran: the marker is cleared and the ConfigMap follows the DGD") + + persistedDGDR := &nvidiacomv1beta1.DynamoGraphDeploymentRequest{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: dgdrName, Namespace: namespace}, persistedDGDR)).Should(Succeed()) + Expect(persistedDGDR.Annotations[AnnotationGeneratedDGDSpec]).Should(BeEmpty()) + + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: additionalConfigMapName, Namespace: namespace}, additionalCM)).Should(Succeed()) + Expect(additionalCM.OwnerReferences).Should(HaveLen(1)) + Expect(additionalCM.OwnerReferences[0].Kind).Should(Equal("DynamoGraphDeployment")) + Expect(additionalCM.OwnerReferences[0].Name).Should(Equal(dgdName)) + Expect(additionalCM.OwnerReferences[0].UID).Should(Equal(dgd.UID)) + }) }) Context("When enabling autoApply after manual review", func() { @@ -2689,12 +3265,21 @@ spec: Name: dgdrName, Namespace: namespace, Annotations: map[string]string{ - AnnotationGeneratedDGDSpec: `apiVersion: nvidia.com/v1alpha1 + AnnotationGeneratedDGDSpec: `apiVersion: nvidia.com/v1beta1 kind: DynamoGraphDeployment metadata: name: test-dgd-deployed spec: - services: {}`, + backendFramework: vllm + components: + - name: worker + type: worker + replicas: 1 + podTemplate: + spec: + containers: + - name: main + image: registry.example/runtime:1.1.0`, }, }, Spec: nvidiacomv1beta1.DynamoGraphDeploymentRequestSpec{ @@ -2730,6 +3315,7 @@ spec: Labels: map[string]string{ nvidiacomv1beta1.LabelDGDRName: dgdrName, nvidiacomv1beta1.LabelDGDRNamespace: namespace, + nvidiacomv1beta1.LabelManagedBy: nvidiacomv1beta1.LabelValueDynamoOperator, }, }, Spec: nvidiacomv1beta1.DynamoGraphDeploymentSpec{ @@ -4036,6 +4622,7 @@ var _ = Describe("DGDR Image Pull Error Detection", func() { Labels: map[string]string{ nvidiacomv1beta1.LabelDGDRName: dgdrName, nvidiacomv1beta1.LabelDGDRNamespace: namespace, + nvidiacomv1beta1.LabelManagedBy: nvidiacomv1beta1.LabelValueDynamoOperator, }, }, Spec: nvidiacomv1beta1.DynamoGraphDeploymentSpec{ From 805a77f053d807b0d8def5d27f674a6df0ed839e Mon Sep 17 00:00:00 2001 From: Alec <35311602+alec-flowers@users.noreply.github.com> Date: Fri, 18 Sep 2026 11:29:47 -0700 Subject: [PATCH 113/191] fix(vllm): support hybrid DP ownership with released proto (#14697) --- Cargo.lock | 4 +- Cargo.toml | 2 +- lib/bindings/python/Cargo.lock | 4 +- lib/mocker/servers/vllm/src/server.rs | 2 + lib/sidecar/vllm/README.md | 4 +- lib/sidecar/vllm/src/convert.rs | 3 +- lib/sidecar/vllm/src/engine.rs | 9 +- lib/sidecar/vllm/src/model.rs | 118 ++++++++++++++++++++------ lib/sidecar/vllm/src/tests.rs | 89 ++++++++++++++++++- 9 files changed, 194 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c2f11c350ebe..6fa6419ef5b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11082,9 +11082,9 @@ checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" [[package]] name = "vllm-proto" -version = "0.1.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520830f75f6a97b9423e5f9155fd4a6aa5578b247dea7d31adb49a5ce5f6e817" +checksum = "77383505a016d5090ecf460297c815752339669aee187e29111baf444cd6e171" dependencies = [ "prost 0.14.3", "prost-types 0.14.3", diff --git a/Cargo.toml b/Cargo.toml index d804930af299..04bd36aaa6d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -198,7 +198,7 @@ tonic-build = { version = "0.13.1" } prost-types-v14 = { package = "prost-types", version = "0.14.3" } tonic-v14 = { package = "tonic", version = "0.14.6" } tonic-health-v14 = { package = "tonic-health", version = "0.14.6" } -vllm-proto = { version = "=0.1.0" } +vllm-proto = { version = "=0.3.0" } kube = { version = "2.0.1", default-features = false, features = ["client", "rustls-tls", "aws-lc-rs", "runtime"] } k8s-openapi = { version = "0.26.0", features = ["v1_32"] } rcgen = { version = "0.13" } diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index dc7331ab4916..81565753d293 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -9600,9 +9600,9 @@ checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" [[package]] name = "vllm-proto" -version = "0.1.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520830f75f6a97b9423e5f9155fd4a6aa5578b247dea7d31adb49a5ce5f6e817" +checksum = "77383505a016d5090ecf460297c815752339669aee187e29111baf444cd6e171" dependencies = [ "prost 0.14.4", "prost-types 0.14.4", diff --git a/lib/mocker/servers/vllm/src/server.rs b/lib/mocker/servers/vllm/src/server.rs index 45384486b7b0..3d344e541c0e 100644 --- a/lib/mocker/servers/vllm/src/server.rs +++ b/lib/mocker/servers/vllm/src/server.rs @@ -116,6 +116,7 @@ impl VllmMockerService { data_parallel_rank: DP_RANK, decode_context_parallel_size: 1, world_size: 1, + ..Default::default() }), max_model_len: engine_args .max_model_len @@ -142,6 +143,7 @@ impl VllmMockerService { })? .unwrap_or_default(), rl_capabilities: None, + ..Default::default() }; // The wire role is separate from the aggregated scheduler used to // emulate disaggregated requests. diff --git a/lib/sidecar/vllm/README.md b/lib/sidecar/vllm/README.md index dcb1cd1e7ae0..284c1de19736 100644 --- a/lib/sidecar/vllm/README.md +++ b/lib/sidecar/vllm/README.md @@ -120,7 +120,7 @@ to that port to trusted consumers because KV events contain request token IDs. ### Native Generate compatibility -`vllm-proto 0.1.0` does not include the native sampling JSON extension proposed +`vllm-proto 0.3.0` does not include the native sampling JSON extension proposed in [vLLM #56421](https://github.com/vllm-project/vllm/pull/56421). The sidecar therefore does not advertise `vllm_inference_v1_generate`. Aggregated and decode requests from v1.4 frontends can still use the legacy @@ -209,7 +209,7 @@ The RL endpoint, engine routes, and raw HTTP compatibility surface are administr The sidecar discovers `model_id`, the served name, context length, KV capacity, scheduler limits, data-parallel topology, and KV-event sources through `vllm.Control`. `model_id` must be readable locally or fetchable by Dynamo for tokenization and chat templates. Parser defaults are not advertised because the current inference protocol cannot preserve all parser-related request semantics. -The sidecar currently supports one vLLM frontend hosting the complete data-parallel group starting at rank 0. Control reports the global size; Dynamo forwards the selected rank as `x-data-parallel-rank` gRPC metadata on each generation request. Partial and hybrid rank ownership are unsupported because the protocol does not report the locally hosted rank count, and a nonzero starting rank is rejected. When KV routing is enabled, Control must return one unique ZMQ event source for every rank in the group. +For hybrid data parallelism, run one vLLM gRPC frontend and sidecar per node with `--data-parallel-hybrid-lb` and the node's local DP size and starting rank. Point each sidecar's `--grpc-endpoint` at its local frontend. This requires a vLLM build that reports local DP size. Aggregated serving is the default. The sidecar role is configured explicitly because the current Control API does not report it: diff --git a/lib/sidecar/vllm/src/convert.rs b/lib/sidecar/vllm/src/convert.rs index 3189e9554970..103c28dabec9 100644 --- a/lib/sidecar/vllm/src/convert.rs +++ b/lib/sidecar/vllm/src/convert.rs @@ -46,7 +46,7 @@ pub(crate) fn build_generate_request( }) { return Err(client::invalid_argument(format!( - "extra_args.vllm_tito.sampling_params.{key} is not supported by vllm-proto 0.1.0; use the chat/completions API" + "extra_args.vllm_tito.sampling_params.{key} is not supported by the sidecar; use the chat/completions API" ))); } @@ -169,6 +169,7 @@ pub(crate) fn build_generate_request( session_id: None, media, lora_name, + watermarking: None, }) } diff --git a/lib/sidecar/vllm/src/engine.rs b/lib/sidecar/vllm/src/engine.rs index e1c832a64713..76675b442d7c 100644 --- a/lib/sidecar/vllm/src/engine.rs +++ b/lib/sidecar/vllm/src/engine.rs @@ -1062,7 +1062,8 @@ impl LLMEngine for VllmSidecarEngine { .client .get() .ok_or_else(|| client::engine_shutdown("vLLM sidecar is not started"))?; - let expected_dp_size = self.model.data_parallel_size(); + let expected_dp_range = self.model.data_parallel_range(); + let expected_dp_size = expected_dp_range.end - expected_dp_range.start; let mut ranks = HashSet::new(); let mut sources = Vec::new(); let reported_sources = client.kv_event_sources().await?; @@ -1083,9 +1084,9 @@ impl LLMEngine for VllmSidecarEngine { "GetKvEventSources returned a ZMQ source without data_parallel_rank", ) })?; - if dp_rank >= expected_dp_size { + if !expected_dp_range.contains(&dp_rank) { return Err(client::protocol_error(format!( - "GetKvEventSources returned rank {dp_rank}, outside the expected range 0..{expected_dp_size}", + "GetKvEventSources returned rank {dp_rank}, outside the expected local range {expected_dp_range:?}", ))); } if !ranks.insert(dp_rank) { @@ -1106,7 +1107,7 @@ impl LLMEngine for VllmSidecarEngine { } if ranks.len() != expected_dp_size as usize { return Err(client::protocol_error(format!( - "GetKvEventSources returned ZMQ sources for {} of {expected_dp_size} data-parallel ranks; KV routing requires one source for every rank", + "GetKvEventSources returned ZMQ sources for {} of {expected_dp_size} local data-parallel ranks; KV routing requires one source for every local rank", ranks.len() ))); } diff --git a/lib/sidecar/vllm/src/model.rs b/lib/sidecar/vllm/src/model.rs index d6127bb6f206..b5983f2d7460 100644 --- a/lib/sidecar/vllm/src/model.rs +++ b/lib/sidecar/vllm/src/model.rs @@ -1,6 +1,8 @@ // SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 +use std::ops::Range; + use dynamo_backend_common::{ DynamoError, EngineConfig, LlmRegistration, RlAdminBaseUrl, RlWorkerMetadata, }; @@ -28,6 +30,7 @@ pub(crate) struct DiscoveredModel { pub supports_multimodal: bool, identity: ModelIdentity, server: pb::ServerInfo, + data_parallel_range: Range, } impl DiscoveredModel { @@ -41,19 +44,15 @@ impl DiscoveredModel { server.api_version ))); } - if let Some(parallelism) = server.parallelism.as_ref() { - if parallelism.data_parallel_size == 0 { - return Err(client::protocol_error( - "vLLM reports a data-parallel size of zero", - )); - } - if parallelism.data_parallel_rank != 0 { - return Err(client::protocol_error(format!( - "vLLM reports data_parallel_rank {}; the sidecar currently requires one frontend hosting the complete data-parallel group starting at rank 0", - parallelism.data_parallel_rank - ))); - } - } + let data_parallel_range = if let Some(parallelism) = server.parallelism.as_ref() { + local_data_parallel_range( + parallelism.data_parallel_size, + parallelism.data_parallel_rank, + parallelism.data_parallel_size_local, + )? + } else { + 0..1 + }; let source = required("model_id", model.model_id)?; let served_name = required("served_model_name", model.served_model_name)?; if !model.supports_token_ids_input { @@ -80,6 +79,7 @@ impl DiscoveredModel { supports_multimodal: model.supports_multimodal, identity, server, + data_parallel_range, }) } @@ -188,19 +188,19 @@ impl DiscoveredModel { max_num_seqs: nonzero(self.server.max_running_requests), max_num_batched_tokens: nonzero(self.server.max_batched_tokens), max_gpu_lora_count: self.supports_lora().then_some(self.max_loras()), - data_parallel_size: parallelism - .and_then(|parallelism| nonzero(parallelism.data_parallel_size)), - data_parallel_start_rank: parallelism.map(|_| 0), + data_parallel_size: parallelism.map(|_| self.data_parallel_size_local()), + data_parallel_start_rank: parallelism.map(|_| self.data_parallel_range.start), ..Default::default() }), } } - pub(crate) fn data_parallel_size(&self) -> u32 { - self.server - .parallelism - .as_ref() - .map_or(1, |parallelism| parallelism.data_parallel_size) + pub(crate) fn data_parallel_range(&self) -> &Range { + &self.data_parallel_range + } + + fn data_parallel_size_local(&self) -> u32 { + self.data_parallel_range.end - self.data_parallel_range.start } pub(crate) fn supports_lora(&self) -> bool { @@ -219,11 +219,8 @@ impl DiscoveredModel { fn total_kv_blocks_per_rank(&self) -> Option { let total_kv_blocks = nonzero(self.server.total_kv_blocks)?; - let data_parallel_size = u64::from(self.data_parallel_size()); - // Control exposes only the aggregate across DP engines. This arithmetic-mean - // estimate assumes homogeneous ranks; exact division does not prove they are equal. - // TODO(rank-aware-kv-capacity): consume a per-rank Control response when available and - // publish it atomically; never relabel this quotient as exact for hard admission. + let data_parallel_size = u64::from(self.data_parallel_size_local()); + // Control reports total KV blocks across the frontend's local DP engines. let per_rank = total_kv_blocks / data_parallel_size; if per_rank == 0 { @@ -248,6 +245,45 @@ impl DiscoveredModel { } } +// A zero local size means unknown, including metadata from older Control servers. +fn local_data_parallel_range( + global_size: u32, + start: u32, + local_size: u32, +) -> Result, DynamoError> { + if global_size == 0 { + return Err(client::protocol_error( + "vLLM reports a data-parallel size of zero", + )); + } + let local_size = match local_size { + 0 if start == 0 => { + if global_size > 1 { + tracing::warn!( + global_size, + "vLLM omits data_parallel_size_local; assuming this frontend hosts the entire DP group. Hybrid deployments require a vLLM build that reports local DP size to avoid registering unhosted ranks and underestimating per-rank KV capacity" + ); + } + global_size + } + 0 => { + return Err(client::protocol_error(format!( + "vLLM reports data_parallel_rank {start} without data_parallel_size_local; hybrid rank ownership requires the local-size Control field" + ))); + } + size => size, + }; + let end = start + .checked_add(local_size) + .filter(|&end| end <= global_size) + .ok_or_else(|| { + client::protocol_error(format!( + "vLLM reports an invalid local data-parallel range: start {start}, local size {local_size}, global size {global_size}" + )) + })?; + Ok(start..end) +} + fn required(field: &str, value: String) -> Result { if value.trim().is_empty() { return Err(client::protocol_error(format!( @@ -267,3 +303,33 @@ where { (value != T::default()).then_some(value) } + +#[cfg(test)] +mod tests { + use super::local_data_parallel_range; + + // Regression: ambiguous, out-of-bounds, or overflowing ownership can advertise + // unreachable DP ranks; validate the metadata before worker registration. + #[test] + fn local_dp_ownership_requires_a_valid_unambiguous_range() { + for (global, start, local, expected) in [(2, 0, 0, 0..2), (8, 0, 4, 0..4), (8, 4, 4, 4..8)] + { + assert_eq!( + local_data_parallel_range(global, start, local).unwrap(), + expected + ); + } + for (global, start, local) in [ + (0, 0, 0), + (8, 4, 0), + (8, 0, 9), + (8, 4, 5), + (u32::MAX, u32::MAX - 1, 4), + ] { + assert!( + local_data_parallel_range(global, start, local).is_err(), + "invalid range: {start} + {local} of {global}" + ); + } + } +} diff --git a/lib/sidecar/vllm/src/tests.rs b/lib/sidecar/vllm/src/tests.rs index 971f972ba2a2..af29e5fe96a8 100644 --- a/lib/sidecar/vllm/src/tests.rs +++ b/lib/sidecar/vllm/src/tests.rs @@ -49,6 +49,7 @@ struct FakeVllm { peers: Arc>>, model_info_override: Arc>>, server_info_override: Arc>>, + kv_ranks_override: Arc>>>, reject: Arc, hang: Arc, hang_before_headers: Arc, @@ -409,7 +410,13 @@ impl pb::control_server::Control for FakeVllm { _request: Request, ) -> Result, Status> { Ok(Response::new(pb::GetKvEventSourcesResponse { - sources: (0..2) + sources: self + .kv_ranks_override + .lock() + .await + .clone() + .unwrap_or_else(|| vec![0, 1]) + .into_iter() .map(|rank| pb::KvEventSource { transport: "zmq".to_string(), endpoint: format!("tcp://*:{}", 20081 + rank), @@ -602,6 +609,7 @@ fn server_info() -> pb::ServerInfo { data_parallel_rank: 0, decode_context_parallel_size: 1, world_size: 2, + data_parallel_size_local: 0, }), max_model_len: 8192, kv_block_size: 16, @@ -609,6 +617,7 @@ fn server_info() -> pb::ServerInfo { max_running_requests: 128, max_batched_tokens: 2048, max_loras: 4, + effective_attention_block_size: None, rl_capabilities: Some(pb::RlCapabilities { weight_transfer_enabled: true, weight_transfer_backend: "nccl".to_string(), @@ -671,11 +680,11 @@ fn discovery_rejects_zero_data_parallelism() { } #[test] -fn startup_compatibility_rejects_tensor_or_pipeline_parallelism_change() { +fn startup_compatibility_rejects_parallelism_change() { let bootstrap = DiscoveredModel::from_proto(model_info(), server_info()) .expect("valid bootstrap discovery"); - for dimension in ["tensor", "pipeline"] { + for dimension in ["tensor", "pipeline", "local_dp"] { let mut changed_server = server_info(); let parallelism = changed_server .parallelism @@ -684,6 +693,7 @@ fn startup_compatibility_rejects_tensor_or_pipeline_parallelism_change() { match dimension { "tensor" => parallelism.tensor_parallel_size += 1, "pipeline" => parallelism.pipeline_parallel_size += 1, + "local_dp" => parallelism.data_parallel_size_local = 1, _ => unreachable!(), } let observed = DiscoveredModel::from_proto(model_info(), changed_server) @@ -1379,6 +1389,17 @@ fn discovery_rejects_incompatible_model_metadata() { } } +// Older servers omit local ownership. A nonzero starting rank must still fail +// discovery rather than register an assumed complete group. +#[test] +fn discovery_rejects_nonzero_dp_start_without_local_size() { + let mut server = server_info(); + let parallelism = server.parallelism.as_mut().unwrap(); + parallelism.data_parallel_size = 8; + parallelism.data_parallel_rank = 4; + assert!(DiscoveredModel::from_proto(model_info(), server).is_err()); +} + #[test] fn engine_config_normalizes_total_kv_blocks_per_dp_rank() { let mut server = server_info(); @@ -1745,6 +1766,68 @@ async fn aggregated_generation_converts_request_stream_and_usage() { ); } +// Regression: a frontend hosting ranks 4..8 must register and route that local +// range, or hybrid deployments reject discovery or advertise unreachable engines. +#[tokio::test] +async fn hybrid_discovery_routes_and_tracks_only_local_absolute_dp_ranks() { + let service = FakeVllm::default(); + let mut info = server_info(); + let parallelism = info.parallelism.as_mut().unwrap(); + parallelism.data_parallel_size = 8; + parallelism.data_parallel_rank = 4; + parallelism.data_parallel_size_local = 4; + *service.server_info_override.lock().await = Some(info); + *service.kv_ranks_override.lock().await = Some(vec![4, 5, 6, 7]); + let server = FakeServer::start(service).await; + let (engine, worker) = engine_from_args(&server.endpoint).await; + assert_eq!( + worker.rl_metadata, + Some( + RlWorkerMetadata::new( + 16, + Some(RlAdminBaseUrl::parse("http://worker:8120/").unwrap()) + ) + .unwrap() + ) + ); + let registration = engine.start(0).await.expect("hybrid startup").llm.unwrap(); + assert_eq!(registration.data_parallel_size, Some(4)); + assert_eq!(registration.data_parallel_start_rank, Some(4)); + assert_eq!(registration.total_kv_blocks, Some(1024)); + let sources = engine.kv_event_sources().await.expect("local KV sources"); + assert_eq!( + sources + .iter() + .map(|source| source.dp_rank()) + .collect::>(), + BTreeSet::from([4, 5, 6, 7]) + ); + let mut routed_request = request(); + routed_request + .routing + .get_or_insert_with(Default::default) + .dp_rank = Some(7); + let outputs = collect(&engine, routed_request).await; + assert_eq!(outputs[0].token_ids, [42]); + assert_eq!( + *server.service.data_parallel_rank_metadata.lock().await, + vec![Some("7".to_string())] + ); + + for invalid_ranks in [ + vec![3, 5, 6, 7], + vec![4, 5, 6, 8], + vec![4, 5, 6], + vec![4, 5, 6, 6], + ] { + *server.service.kv_ranks_override.lock().await = Some(invalid_ranks); + assert!( + engine.kv_event_sources().await.is_err(), + "KV sources must cover exactly the local range" + ); + } +} + #[tokio::test] async fn rl_engine_routes_preserve_lifecycle_payloads_and_version() { let server = FakeServer::start(FakeVllm::default()).await; From 81fa669fcb456054b3aee6557e6e80ced6783a2e Mon Sep 17 00:00:00 2001 From: Jie Hao Date: Fri, 18 Sep 2026 14:48:36 -0400 Subject: [PATCH 114/191] fix(metrics): raise inter-token latency histogram ceiling to 80s (#14839) Signed-off-by: Jie Hao Co-authored-by: Claude Opus 5 (1M context) --- .../components/frontend-configuration.mdx | 12 ++-- lib/llm/src/http/service/metrics.rs | 55 ++++++++++++++++--- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/docs/fern/pages/reference/components/frontend-configuration.mdx b/docs/fern/pages/reference/components/frontend-configuration.mdx index 9081f1670827..76179995cdbc 100644 --- a/docs/fern/pages/reference/components/frontend-configuration.mdx +++ b/docs/fern/pages/reference/components/frontend-configuration.mdx @@ -539,7 +539,7 @@ See the [KServe gRPC Frontend](../../developer-guide/knowledge-base/modular-comp ### Histogram buckets -The frontend's six latency and size histograms use log-spaced buckets, rounded to two significant figures, always starting with a `0` edge. Each histogram is tuned by three environment variables that share a prefix: `_MIN` and `_MAX` bound the range, and `_COUNT` is the total number of bucket edges **including** that leading `0`, so `COUNT - 1` edges are spread across the range. The inter-token latency default of `13` therefore means `0` plus twelve log-spaced edges. Every edge, including the top one, is rounded to two significant figures, so the highest exported edge is `MAX` rounded rather than `MAX` itself — see the `Top le` column below. These have no CLI equivalent, and they are read once while the frontend builds its metrics, so changing one requires a restart. +The frontend's six latency and size histograms use log-spaced buckets, rounded to two significant figures, always starting with a `0` edge. Each histogram is tuned by three environment variables that share a prefix: `_MIN` and `_MAX` bound the range, and `_COUNT` is the total number of bucket edges **including** that leading `0`, so `COUNT - 1` edges are spread across the range. The inter-token latency default of `20` therefore means `0` plus nineteen log-spaced edges. Every edge, including the top one, is rounded to two significant figures, so the highest exported edge is `MAX` rounded rather than `MAX` itself — see the `Top le` column below. These have no CLI equivalent, and they are read once while the frontend builds its metrics, so changing one requires a restart. | Histogram | Variable prefix | Min | Max | Count | Top `le` | |---|---|---|---|---|---| @@ -547,21 +547,21 @@ The frontend's six latency and size histograms use log-spaced buckets, rounded t | `dynamo_frontend_input_sequence_tokens` | `DYN_METRICS_INPUT_SEQUENCE` | `50.0` | `128000.0` | `12` | `130000` | | `dynamo_frontend_output_sequence_tokens` | `DYN_METRICS_OUTPUT_SEQUENCE` | `50.0` | `32000.0` | `10` | `32000` | | `dynamo_frontend_time_to_first_token_seconds` | `DYN_METRICS_TTFT` | `0.001` | `480.0` | `18` | `480` | -| `dynamo_frontend_inter_token_latency_seconds` | `DYN_METRICS_ITL` | `0.001` | `2.0` | `13` | `2` | +| `dynamo_frontend_inter_token_latency_seconds` | `DYN_METRICS_ITL` | `0.001` | `80.0` | `20` | `80` | | `dynamo_frontend_embedding_latency_seconds` | `DYN_METRICS_EMBEDDING_LATENCY` | `0.001` | `10.0` | `14` | `10` | -For example, to raise the inter-token latency ceiling from 2 seconds to 80: +For example, to raise the output sequence ceiling from 32k tokens to 128k: ```bash -export DYN_METRICS_ITL_MAX=80 -export DYN_METRICS_ITL_COUNT=20 +export DYN_METRICS_OUTPUT_SEQUENCE_MAX=131072 +export DYN_METRICS_OUTPUT_SEQUENCE_COUNT=12 ``` Rounding can move the top edge either way, so pick a `MAX` that is already two significant figures if you need an exact ceiling. Prometheus buckets are inclusive, so `MAX=123` exports `le=120` and only observations *greater than* 120 and up to 123 fall into `+Inf` — a value of exactly 120 still lands in the `le=120` bucket. `MAX=131072` exports `le=130000`. Two of the defaults above are affected: request duration is set to `512` but exports `510`, and input sequence is set to `128000` but exports `130000`. `dynamo_frontend_cached_tokens` shares the input sequence buckets, so `DYN_METRICS_INPUT_SEQUENCE_*` changes both histograms. -A histogram's configuration is validated as a set: `MIN` must be above zero, below `MAX`, and `COUNT` must be between 1 and 512. If any part fails, the frontend warns and reverts **all three** values for that histogram together — setting `DYN_METRICS_ITL_MIN=5` against the default `MAX` of `2.0` also discards a perfectly valid `DYN_METRICS_ITL_COUNT=20`. +A histogram's configuration is validated as a set: `MIN` must be above zero, below `MAX`, and `COUNT` must be between 1 and 512. If any part fails, the frontend warns and reverts **all three** values for that histogram together — setting `DYN_METRICS_ITL_MIN=100` against the default `MAX` of `80.0` also discards a perfectly valid `DYN_METRICS_ITL_COUNT=20`. A value that cannot be parsed at all is handled per variable, not as a set: it warns, that one variable falls back to its default, and the others still apply. diff --git a/lib/llm/src/http/service/metrics.rs b/lib/llm/src/http/service/metrics.rs index b7ca587500e8..527f8dde6cf2 100644 --- a/lib/llm/src/http/service/metrics.rs +++ b/lib/llm/src/http/service/metrics.rs @@ -827,7 +827,7 @@ impl Metrics { /// - `DYN_METRICS_INPUT_SEQUENCE_{MIN,MAX,COUNT}` - Input sequence length histogram (defaults: 50.0, 128000.0, 12) /// - `DYN_METRICS_OUTPUT_SEQUENCE_{MIN,MAX,COUNT}` - Output sequence length histogram (defaults: 50.0, 32000.0, 10) /// - `DYN_METRICS_TTFT_{MIN,MAX,COUNT}` - Time to first token histogram (defaults: 0.001, 480.0, 18) - /// - `DYN_METRICS_ITL_{MIN,MAX,COUNT}` - Inter-token latency histogram (defaults: 0.001, 2.0, 13) + /// - `DYN_METRICS_ITL_{MIN,MAX,COUNT}` - Inter-token latency histogram (defaults: 0.001, 80.0, 20) /// - `DYN_METRICS_EMBEDDING_LATENCY_{MIN,MAX,COUNT}` - End-to-end `/v1/embeddings` latency histogram (defaults: 0.001, 10.0, 14) /// /// ## Model Configuration Metrics @@ -1024,7 +1024,7 @@ impl Metrics { // Inter-token latency buckets: configurable via DYN_METRICS_ITL_{MIN,MAX,COUNT} let (itl_min, itl_max, itl_count) = - parse_bucket_config(env, env_metrics::DYN_METRICS_ITL, 0.001, 2.0, 13); + parse_bucket_config(env, env_metrics::DYN_METRICS_ITL, 0.001, 80.0, 20); let inter_token_latency_buckets = generate_log_buckets(itl_min, itl_max, itl_count); let inter_token_latency = HistogramVec::new( @@ -2780,9 +2780,11 @@ mod tests { #[test] fn itl_ceiling_env_var_reaches_the_exported_le_labels() { + // Deliberately not the default (80.0, 20): a test that sets the env to the + // default value would pass even if the variable were ignored entirely. let env = fake_env(&[ - ("DYN_METRICS_ITL_MAX", "80"), - ("DYN_METRICS_ITL_COUNT", "20"), + ("DYN_METRICS_ITL_MAX", "30"), + ("DYN_METRICS_ITL_COUNT", "8"), ]); let registry = Registry::new(); let metrics = Metrics::build(None, &env); @@ -2802,9 +2804,47 @@ mod tests { ); assert_eq!( bounds.last().copied(), - Some(80.0), + Some(30.0), "top finite bucket should follow DYN_METRICS_ITL_MAX, got {bounds:?}" ); + assert_eq!( + bounds.len(), + 8, + "bucket count should follow DYN_METRICS_ITL_COUNT" + ); + } + + #[test] + fn itl_default_buckets_reach_80_seconds() { + // The ceiling was 2.0s, so any inter-token latency above it landed in `+Inf` and + // `histogram_quantile` pinned p99 at exactly 2.0 -- indistinguishable from a real + // 2s measurement. Guard the shipped default, not just the env-var override. + let registry = Registry::new(); + let metrics = Metrics::build(None, &fake_env(&[])); + metrics.register(®istry).unwrap(); + metrics + .inter_token_latency + .with_label_values(&["m"]) + .observe(0.5); + + let bounds = bucket_upper_bounds( + ®istry, + &format!( + "{}_{}", + name_prefix::FRONTEND, + frontend_service::INTER_TOKEN_LATENCY_SECONDS + ), + ); + // The exact set is the contract. Note the bottom edge of 0.0018: vLLM's equivalent + // starts at 0.01 and cannot resolve anything faster than 10ms per token, so raising + // the ceiling must not cost the low-end resolution Dynamo has and vLLM does not. + assert_eq!( + bounds, + vec![ + 0.0, 0.0018, 0.0033, 0.0059, 0.011, 0.02, 0.035, 0.064, 0.12, 0.21, 0.38, 0.69, + 1.2, 2.3, 4.1, 7.4, 13.0, 24.0, 44.0, 80.0 + ], + ); } #[test] @@ -2841,11 +2881,12 @@ mod tests { #[test] fn test_all_buckets_are_two_sig_figs() { let test_cases = vec![ - (1.0, 256.0, 10), + (1.0, 512.0, 10), (50.0, 128000.0, 12), (50.0, 32000.0, 10), (0.001, 480.0, 18), - (0.001, 2.0, 13), + (0.001, 80.0, 20), + (0.001, 10.0, 14), ]; for (min, max, count) in test_cases { From 9d3ce5d892f817087082a4f18c0c5f8138d4ad3c Mon Sep 17 00:00:00 2001 From: GLAMR Date: Fri, 18 Sep 2026 16:16:06 -0400 Subject: [PATCH 115/191] fix(request-trace): stop audit records claiming completeness when the response was dropped (#14143) Signed-off-by: svc-glamr@nvidia.com Signed-off-by: Matej Kosec Co-authored-by: Matej Kosec --- lib/llm/src/preprocessor.rs | 25 +- lib/llm/src/request_trace/otel_sink.rs | 60 ++- lib/llm/src/request_trace/payload.rs | 85 +++- lib/llm/src/request_trace/payload_stream.rs | 416 ++++++++++++++---- .../tests/request_trace_nats_integration.rs | 12 +- 5 files changed, 485 insertions(+), 113 deletions(-) diff --git a/lib/llm/src/preprocessor.rs b/lib/llm/src/preprocessor.rs index 1ebe13d3846d..41fb3550208c 100644 --- a/lib/llm/src/preprocessor.rs +++ b/lib/llm/src/preprocessor.rs @@ -7239,22 +7239,19 @@ impl crate::request_trace::payload_stream::fold_aggregate_with_future(transformed_stream) }; - // Spawn the payload emit off the request path. `agg_fut` resolves to - // None on client cancel / gateway timeout / aggregation failure; we - // still emit the payload record with an empty response so those - // cases remain inspectable. The record carries the request snapshot - // and arrival time captured at handle creation. + // Spawn the payload emit off the request path. The outcome carries a drop + // reason and any recovered partial response, so emit the record either way. tokio::spawn(async move { - match agg_fut.await { - Some(final_resp) => payload.emit(Some(Arc::new(final_resp))), - None => { - tracing::debug!( - request_id = %payload.request_id(), - "request payload: response aggregation incomplete (client cancel / timeout); emitting request-only record" - ); - payload.emit(None); - } + let outcome = agg_fut.await; + if let Some(reason) = outcome.drop_reason.as_deref() { + tracing::debug!( + request_id = %payload.request_id(), + drop_reason = %reason, + partial_response = outcome.response.is_some(), + "request payload: response aggregation incomplete; emitting record with drop reason" + ); } + payload.emit(outcome.response.map(Arc::new), outcome.drop_reason); }); stream diff --git a/lib/llm/src/request_trace/otel_sink.rs b/lib/llm/src/request_trace/otel_sink.rs index 39a18454dc6e..6cb2945e8fe5 100644 --- a/lib/llm/src/request_trace/otel_sink.rs +++ b/lib/llm/src/request_trace/otel_sink.rs @@ -157,7 +157,13 @@ impl OtelRequestTraceSink { } }; if payload.len() <= max_payload_bytes { - return Some((payload, true, None)); + let (complete, drop_reason) = record.payload.as_ref().map_or((true, None), |payload| { + ( + payload.payload_complete, + payload.payload_drop_reason.clone(), + ) + }); + return Some((payload, complete, drop_reason)); } marker_payload( @@ -187,6 +193,11 @@ fn marker_payload( return None; }; + let reason = match payload.payload_drop_reason.as_deref() { + Some(capture_reason) => format!("{reason}:capture_drop_reason={capture_reason}"), + None => reason, + }; + tracing::warn!( target: "dynamo_llm::request_trace", request_id = %payload.request_id, @@ -395,6 +406,53 @@ mod tests { record } + #[test] + fn payload_under_limit_preserves_capture_metadata() { + for (complete, drop_reason) in [ + (true, None), + (false, Some("aggregation_failed:engine died mid-stream")), + ] { + let mut record = sample_payload_record(); + let capture = record.payload.as_mut().unwrap(); + capture.payload_complete = complete; + capture.payload_drop_reason = drop_reason.map(str::to_owned); + let serialized = serde_json::to_string(&record).unwrap(); + + let (payload, exported_complete, exported_reason) = + OtelRequestTraceSink::payload_for_limit(&record, serialized.len()).unwrap(); + + assert_eq!(payload, serialized); + assert_eq!(exported_complete, complete); + assert_eq!(exported_reason.as_deref(), drop_reason); + } + } + + #[test] + fn payload_over_limit_preserves_capture_reason() { + let mut record = sample_payload_record_with_headers(); + let capture_reason = "aggregation_failed:engine died mid-stream"; + let capture = record.payload.as_mut().unwrap(); + capture.payload_complete = false; + capture.payload_drop_reason = Some(capture_reason.to_string()); + let full_len = serde_json::to_string(&record).unwrap().len(); + + for limit in [full_len - 1, 1] { + let (payload, complete, drop_reason) = + OtelRequestTraceSink::payload_for_limit(&record, limit).unwrap(); + let expected_reason = format!( + "otel_payload_too_large:max_bytes={limit}:actual_bytes={full_len}:capture_drop_reason={capture_reason}" + ); + + assert!(!complete); + assert_eq!(drop_reason.as_deref(), Some(expected_reason.as_str())); + let decoded: serde_json::Value = serde_json::from_str(&payload).unwrap(); + assert_eq!(decoded["payload"]["payload_complete"], false); + assert_eq!(decoded["payload"]["payload_drop_reason"], expected_reason); + assert!(decoded["payload"].get("request").is_none()); + assert!(decoded["payload"].get("response").is_none()); + } + } + #[test] fn payload_over_limit_marker_preserves_headers_when_marker_fits() { let record = sample_payload_record_with_headers(); diff --git a/lib/llm/src/request_trace/payload.rs b/lib/llm/src/request_trace/payload.rs index 60ce488242b5..e2e08b2019cd 100644 --- a/lib/llm/src/request_trace/payload.rs +++ b/lib/llm/src/request_trace/payload.rs @@ -55,6 +55,8 @@ fn capture_http_headers_with_list( (!out.is_empty()).then_some(out) } +const DROP_UNSPECIFIED: &str = "unspecified"; + pub struct RequestPayloadHandle { requested_streaming: bool, request_id: String, @@ -73,11 +75,19 @@ impl RequestPayloadHandle { &self.request_id } - /// Publish one request trace payload record. Consumes the handle to enforce - /// exactly one payload record per request. `response` is `None` on client - /// cancel / gateway timeout / aggregation failure; the record still carries - /// the request so those cases remain inspectable. - pub fn emit(self, response: Option>) { + /// Consume the handle to publish one request payload record. + /// Pass a `drop_reason` for a missing or partial response. + pub fn emit( + self, + response: Option>, + drop_reason: Option, + ) { + let payload_complete = response.is_some() && drop_reason.is_none(); + let drop_reason = match (payload_complete, drop_reason) { + (true, reason) => reason, + (false, Some(reason)) => Some(reason), + (false, None) => Some(DROP_UNSPECIFIED.to_string()), + }; super::record::emit_request_payload( super::RequestTracePayload { request_id: self.request_id, @@ -86,8 +96,8 @@ impl RequestPayloadHandle { request: Some(self.request), response, http_request_headers: self.http_request_headers, - payload_complete: true, - payload_drop_reason: None, + payload_complete, + payload_drop_reason: drop_reason, }, unix_time_ms(self.event_time), ); @@ -300,8 +310,9 @@ mod tests { let mut rx = crate::request_trace::subscribe(); RequestPayloadHandle::for_test("payload-test-req-ok", "test-model", true) - .emit(Some(Arc::new(create_test_response("hello")))); - RequestPayloadHandle::for_test("payload-test-req-cancel", "test-model", true).emit(None); + .emit(Some(Arc::new(create_test_response("hello"))), None); + RequestPayloadHandle::for_test("payload-test-req-dropped", "test-model", true) + .emit(None, Some("response_stream_dropped".to_string())); let mut records = HashMap::new(); tokio::time::timeout(std::time::Duration::from_secs(5), async { @@ -316,7 +327,7 @@ mod tests { }; if matches!( payload.request_id.as_str(), - "payload-test-req-ok" | "payload-test-req-cancel" + "payload-test-req-ok" | "payload-test-req-dropped" ) { records.insert(payload.request_id.clone(), record); } @@ -329,8 +340,8 @@ mod tests { .remove("payload-test-req-ok") .expect("payload-test-req-ok record"); let second = records - .remove("payload-test-req-cancel") - .expect("payload-test-req-cancel record"); + .remove("payload-test-req-dropped") + .expect("payload-test-req-dropped record"); assert_eq!( first.event_type, @@ -340,14 +351,62 @@ mod tests { assert_eq!(first_payload.request_id, "payload-test-req-ok"); assert!(first_payload.request.is_some()); assert!(first_payload.response.is_some()); + assert!(first_payload.payload_complete); + assert!(first_payload.payload_drop_reason.is_none()); assert_eq!( second.event_type, crate::request_trace::RequestTraceEventType::RequestPayload ); let second_payload = second.payload.as_ref().expect("second payload"); - assert_eq!(second_payload.request_id, "payload-test-req-cancel"); + assert_eq!(second_payload.request_id, "payload-test-req-dropped"); assert!(second_payload.request.is_some()); assert!(second_payload.response.is_none()); + assert!( + !second_payload.payload_complete, + "a record with no response must not claim to be complete" + ); + assert_eq!( + second_payload.payload_drop_reason.as_deref(), + Some("response_stream_dropped") + ); + } + + #[tokio::test] + #[serial_test::serial] + async fn emit_without_response_or_reason_still_marks_the_record_incomplete() { + // Guards a future call site that drops the response without saying why: + // the record must be labelled, not left indistinguishable from a good one. + crate::request_trace::init_bus_for_test(8); + let mut rx = crate::request_trace::subscribe(); + + RequestPayloadHandle::for_test("payload-test-req-unspecified", "test-model", true) + .emit(None, None); + + let record = tokio::time::timeout(std::time::Duration::from_secs(5), async { + loop { + let record = rx.recv().await.expect("record receives ok"); + if record.event_type != crate::request_trace::RequestTraceEventType::RequestPayload + { + continue; + } + let Some(payload) = record.payload.as_ref() else { + continue; + }; + if payload.request_id == "payload-test-req-unspecified" { + return record; + } + } + }) + .await + .expect("expected request payload record before timeout"); + + let payload = record.payload.as_ref().expect("payload"); + assert!(payload.response.is_none()); + assert!( + !payload.payload_complete, + "a record with no response must not claim to be complete" + ); + assert_eq!(payload.payload_drop_reason.as_deref(), Some("unspecified")); } } diff --git a/lib/llm/src/request_trace/payload_stream.rs b/lib/llm/src/request_trace/payload_stream.rs index 2e956492e1d5..346611c70da4 100644 --- a/lib/llm/src/request_trace/payload_stream.rs +++ b/lib/llm/src/request_trace/payload_stream.rs @@ -18,22 +18,58 @@ use futures::StreamExt; type PayloadStream = Pin> + Send>>; -/// Resolves to `Some(final_response)` when aggregation succeeds, or `None` when the -/// client cancels mid-stream / the aggregator fails. The caller emits the single -/// combined request payload record once either way — with the response on `Some`, or -/// request-only (`response = None`) on `None`. -type PayloadFuture = - Pin> + Send>>; +/// Aggregated response for audit capture. Partial responses carry a `drop_reason`. +pub struct PayloadOutcome { + pub response: Option, + pub drop_reason: Option, +} + +impl PayloadOutcome { + fn complete(response: NvCreateChatCompletionResponse) -> Self { + Self { + response: Some(response), + drop_reason: None, + } + } + + fn dropped( + response: Option, + reason: impl Into, + ) -> Self { + Self { + response, + drop_reason: Some(reason.into()), + } + } +} + +const DROP_EMPTY_RESPONSE_STREAM: &str = "empty_response_stream"; + +/// The aggregation never reported an outcome at all: something dropped the +/// pass-through stream before end-of-stream. A client disconnect does that, but so +/// does `http::service::disconnect` killing the engine context on a backend +/// inactivity timeout, and the two are indistinguishable from here. The reason names +/// what we observed rather than guessing at a cause. +const DROP_RESPONSE_STREAM_DROPPED: &str = "response_stream_dropped"; + +/// Build the `aggregation_failed` drop reason. The colon-delimited +/// `identifier:detail` shape matches the marker reasons `otel_sink.rs` already +/// publishes, so a consumer can parse one grammar across both producers. +fn aggregation_failed_reason(error: impl std::fmt::Display) -> String { + format!("aggregation_failed:{error}") +} + +type PayloadFuture = Pin + Send>>; /// Forwards transformed chunks unchanged; collects them for aggregation. pub struct PassThroughWithAgg { inner: S, chunks: Vec>, - done_tx: Option>, + done_tx: Option>, } impl PassThroughWithAgg { - fn new(inner: S, tx: oneshot::Sender) -> Self { + fn new(inner: S, tx: oneshot::Sender) -> Self { Self { inner, chunks: Vec::new(), @@ -51,34 +87,35 @@ where fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { match Pin::new(&mut self.inner).poll_next(cx) { Poll::Ready(Some(chunk)) => { - // Store chunk for aggregation self.chunks.push(chunk.clone()); - // Forward the chunk unchanged downstream + // Capture the prefix now: the SSE monitor drops this stream on error. + if chunk.is_error() + && let Some(tx) = self.done_tx.take() + { + let chunks = std::mem::take(&mut self.chunks); + let parsing_options = ParsingOptions::default(); + tokio::spawn(async move { + let _ = + tx.send(aggregate_with_partial_recovery(chunks, parsing_options).await); + }); + } Poll::Ready(Some(chunk)) } Poll::Ready(None) => { if let Some(tx) = self.done_tx.take() { - // Aggregate all collected chunks let chunks = std::mem::take(&mut self.chunks); if chunks.is_empty() { tracing::debug!( "request payload: empty response stream, no response to aggregate" ); - drop(tx); + let _ = tx.send(PayloadOutcome::dropped(None, DROP_EMPTY_RESPONSE_STREAM)); return Poll::Ready(None); } - let chunks_stream = futures::stream::iter(chunks); let parsing_options = ParsingOptions::default(); tokio::spawn(async move { - match DeltaAggregator::apply(chunks_stream, parsing_options).await { - Ok(final_resp) => { - let _ = tx.send(final_resp); - } - Err(e) => { - tracing::warn!("request payload: aggregation failed: {e}"); - } - } + let _ = + tx.send(aggregate_with_partial_recovery(chunks, parsing_options).await); }); } Poll::Ready(None) @@ -88,83 +125,120 @@ where } } -/// Return (pass-through stream, future -> final aggregated response for request payload capture). +/// Aggregate the buffered chunks, keeping whatever content arrived before an +/// error-tagged chunk. +/// +/// `DeltaAggregator` is deliberately left alone rather than taught to recover here: +/// its short-circuit on the first error-tagged chunk is load-bearing on the +/// client-facing non-streaming path, where a typed backend error must surface as an +/// error rather than as a truncated success. +async fn aggregate_with_partial_recovery( + mut chunks: Vec>, + parsing_options: ParsingOptions, +) -> PayloadOutcome { + let Some(error_at) = chunks.iter().position(|chunk| chunk.is_error()) else { + return match DeltaAggregator::apply(futures::stream::iter(chunks), parsing_options).await { + Ok(final_resp) => PayloadOutcome::complete(final_resp), + Err(e) => { + tracing::warn!("request payload: aggregation failed: {e}"); + PayloadOutcome::dropped(None, aggregation_failed_reason(e)) + } + }; + }; + + let error = match chunks[error_at].clone().into_data() { + Err(error) => error.to_string(), + // Unreachable: `is_error()` is the same predicate `into_data` errors on. + // Kept so a future divergence still yields a well-formed reason. + Ok(_) => "unknown error".to_string(), + }; + tracing::warn!("request payload: aggregation failed: {error}"); + let reason = aggregation_failed_reason(&error); + + chunks.truncate(error_at); + if chunks.is_empty() { + return PayloadOutcome::dropped(None, reason); + } + let partial = DeltaAggregator::apply(futures::stream::iter(chunks), parsing_options) + .await + .ok(); + PayloadOutcome::dropped(partial, reason) +} + pub fn scan_aggregate_with_future(stream: S) -> (PayloadStream, PayloadFuture) where S: Stream> + Unpin + Send + 'static, { - let (tx, rx) = oneshot::channel::(); + let (tx, rx) = oneshot::channel::(); let passthrough = PassThroughWithAgg::new(stream, tx); ( Box::pin(passthrough), Box::pin(async move { match rx.await { - Ok(resp) => Some(resp), + Ok(outcome) => outcome, Err(_) => { - // tx dropped without sending: either the SSE consumer dropped the - // passthrough stream before end-of-stream (client cancel) or the - // spawned `DeltaAggregator::apply` errored. Either way, the combined - // record is emitted with `response = None`. + // tx dropped without sending: the passthrough stream went away before + // end-of-stream, either because the client disconnected or because the + // engine context was killed under it. tracing::debug!( - "request payload: response aggregation produced no record (client cancel or aggregation error)" + "request payload: response aggregation produced no outcome (stream dropped)" ); - None + PayloadOutcome::dropped(None, DROP_RESPONSE_STREAM_DROPPED) } } }), ) } +/// A well-formed response carrying no choices, sent to the client when aggregation +/// failed so the HTTP response shape stays valid. +fn empty_fallback_response() -> NvCreateChatCompletionResponse { + NvCreateChatCompletionResponse { + inner: dynamo_protocols::types::CreateChatCompletionResponse { + id: String::new(), + created: 0, + usage: None, + model: String::new(), + object: "chat.completion".to_string(), + system_fingerprint: None, + choices: vec![], + service_tier: None, + }, + nvext: None, + } +} + /// Collect all chunks, aggregate them, then emit a single final chunk (for non-streaming) pub fn fold_aggregate_with_future(stream: S) -> (PayloadStream, PayloadFuture) where S: Stream> + Send + 'static, { - let (tx, rx) = oneshot::channel::(); + let (tx, rx) = oneshot::channel::(); let single_chunk_stream = async move { let chunks: Vec<_> = stream.collect().await; - let chunks_stream = futures::stream::iter(chunks); let parsing_options = ParsingOptions::default(); - - match DeltaAggregator::apply(chunks_stream, parsing_options).await { - Ok(final_resp) => { - let _ = tx.send(final_resp.clone()); - final_response_to_one_chunk_stream(final_resp) - } - Err(e) => { - tracing::warn!("fold aggregation failed: {e}"); - // Drop tx without sending so the request payload future resolves to None. - // The client still receives a (best-effort) empty fallback chunk so - // the HTTP response shape stays valid; the combined request payload record is - // emitted with `response = None`. - drop(tx); - let fallback = NvCreateChatCompletionResponse { - inner: dynamo_protocols::types::CreateChatCompletionResponse { - id: String::new(), - created: 0, - usage: None, - model: String::new(), - object: "chat.completion".to_string(), - system_fingerprint: None, - choices: vec![], - service_tier: None, - }, - nvext: None, - }; - final_response_to_one_chunk_stream(fallback) - } - } + let outcome = aggregate_with_partial_recovery(chunks, parsing_options).await; + + // A dropped outcome may still carry the pre-error prefix for the record, but the + // client gets the empty fallback either way: a truncated aggregation presented as + // the whole answer is worse than an empty one the caller can recognize as such. + let client_response = match (&outcome.drop_reason, &outcome.response) { + (None, Some(complete)) => complete.clone(), + _ => empty_fallback_response(), + }; + let _ = tx.send(outcome); + final_response_to_one_chunk_stream(client_response) }; let future = Box::pin(async move { match rx.await { - Ok(resp) => Some(resp), + Ok(outcome) => outcome, Err(_) => { tracing::debug!( - "request payload: fold response aggregation produced no record (client cancel or aggregation error)" + "request payload: fold response aggregation produced no outcome (stream dropped)" ); - None + PayloadOutcome::dropped(None, DROP_RESPONSE_STREAM_DROPPED) } } }); @@ -472,7 +546,14 @@ mod tests { let input_stream = stream::iter(chunks.clone()); let (passthrough, future) = scan_aggregate_with_future(input_stream); let results: Vec<_> = passthrough.collect().await; - let final_resp = future.await.expect("aggregation should produce a record"); + let outcome = future.await; + assert!( + outcome.drop_reason.is_none(), + "a fully successful aggregation must not carry a drop reason" + ); + let final_resp = outcome + .response + .expect("aggregation should produce a record"); // Verify chunk count assert_eq!(results.len(), 3, "Should pass through all chunks unchanged"); @@ -524,7 +605,10 @@ mod tests { let input_stream = stream::iter(chunks.clone()); let (passthrough, future) = scan_aggregate_with_future(input_stream); let results: Vec<_> = passthrough.collect().await; - let final_resp = future.await.expect("aggregation should produce a record"); + let outcome = future.await; + let final_resp = outcome + .response + .expect("aggregation should produce a record"); assert_eq!(results.len(), chunks.len()); assert_eq!( @@ -601,21 +685,24 @@ mod tests { #[tokio::test] async fn test_empty_stream_handling() { - // Empty stream is treated the same as a client-cancel mid-stream: the - // aggregator has nothing to apply, tx drops without sending, and the - // future resolves to None. The caller (preprocessor) then emits the - // combined request payload record with `response = None`. + // Empty stream: the aggregator has nothing to apply, so the outcome carries no + // response, and names itself rather than looking like a dropped stream. let chunks: Vec> = vec![]; let input_stream = stream::iter(chunks); let (passthrough, future) = scan_aggregate_with_future(input_stream); let results: Vec<_> = passthrough.collect().await; - let final_resp = future.await; + let outcome = future.await; assert_eq!(results.len(), 0, "Empty stream should produce no chunks"); assert!( - final_resp.is_none(), - "Empty stream should resolve request payload future to None, not a fallback record" + outcome.response.is_none(), + "Empty stream should resolve request payload future to no response, not a fallback record" + ); + assert_eq!( + outcome.drop_reason.as_deref(), + Some("empty_response_stream"), + "an empty stream must be distinguishable from a dropped one" ); } @@ -627,7 +714,10 @@ mod tests { let input_stream = stream::iter(chunks); let (passthrough, future) = scan_aggregate_with_future(input_stream); let results: Vec<_> = passthrough.collect().await; - let final_resp = future.await.expect("aggregation should produce a record"); + let outcome = future.await; + let final_resp = outcome + .response + .expect("aggregation should produce a record"); // Verify passthrough assert_eq!(results.len(), 1); @@ -693,17 +783,185 @@ mod tests { async fn test_concurrent_futures() { // Test that multiple concurrent payload streams don't interfere. The // passthrough streams are dropped immediately (the `_` destructure), which - // models a client cancel before the first poll — each future should - // independently resolve to None without crosstalk. + // models the stream going away before the first poll — each future should + // independently resolve to a dropped outcome without crosstalk. let chunks1 = vec![create_mock_chunk("Stream 1".to_string(), 0)]; let chunks2 = vec![create_mock_chunk("Stream 2".to_string(), 0)]; let (_, future1) = scan_aggregate_with_future(stream::iter(chunks1)); let (_, future2) = scan_aggregate_with_future(stream::iter(chunks2)); - let (resp1, resp2) = tokio::join!(future1, future2); + let (outcome1, outcome2) = tokio::join!(future1, future2); + + assert!(outcome1.response.is_none()); + assert!(outcome2.response.is_none()); + assert_eq!( + outcome1.drop_reason.as_deref(), + Some("response_stream_dropped") + ); + assert_eq!( + outcome2.drop_reason.as_deref(), + Some("response_stream_dropped") + ); + } + + #[tokio::test] + async fn error_chunk_settles_the_outcome_without_reaching_end_of_stream() { + // `http::service::disconnect` stops polling and drops the stream as soon as an + // error reaches it, so end-of-stream never arrives on the streaming path. Model + // that: take chunks up to and including the error, then drop the pass-through. + let chunks = vec![ + create_mock_chunk("Hello ".to_string(), 0), + Annotated::::from_error( + "invalid sampling parameter", + ), + create_mock_chunk("never polled".to_string(), 0), + ]; + + let (passthrough, future) = scan_aggregate_with_future(stream::iter(chunks)); + let delivered: Vec<_> = passthrough.take(2).collect().await; + assert_eq!(delivered.len(), 2); + + let outcome = future.await; + + let reason = outcome + .drop_reason + .as_deref() + .expect("an errored stream must carry a drop reason"); + assert!( + reason.starts_with("aggregation_failed:"), + "reason should use the colon-delimited grammar, got {reason}" + ); + assert!( + reason.contains("invalid sampling parameter"), + "the record must name the backend error rather than report a dropped stream, got {reason}" + ); + + let partial = outcome + .response + .expect("content delivered before the error must survive the early drop"); + assert_eq!( + partial.inner.choices[0].message.content.as_ref().unwrap(), + &ChatCompletionMessageContent::Text("Hello ".to_string()), + ); + } + + #[tokio::test] + async fn error_as_first_chunk_reports_reason_without_a_response() { + let chunks = vec![ + Annotated::::from_error("backend unavailable"), + ]; + + let input_stream = stream::iter(chunks); + let (passthrough, future) = scan_aggregate_with_future(input_stream); + let _results: Vec<_> = passthrough.collect().await; + let outcome = future.await; - assert!(resp1.is_none()); - assert!(resp2.is_none()); + assert!( + outcome.response.is_none(), + "no content arrived before the error, so there is nothing to preserve" + ); + let reason = outcome + .drop_reason + .as_deref() + .expect("an errored stream must carry a drop reason"); + assert!( + reason.starts_with("aggregation_failed:"), + "reason should use the colon-delimited grammar, got {reason}" + ); + assert!( + reason.contains("backend unavailable"), + "reason should name the underlying error, got {reason}" + ); + } + + #[tokio::test] + async fn fold_success_delivers_and_records_the_complete_response() { + let chunks = vec![ + create_mock_chunk("Hello ".to_string(), 0), + create_mock_chunk("World".to_string(), 0), + create_final_chunk(0), + ]; + + let (folded, future) = fold_aggregate_with_future(stream::iter(chunks)); + let delivered: Vec<_> = folded.collect().await; + let outcome = future.await; + + assert_eq!(delivered.len(), 1, "the fold path emits a single chunk"); + assert_eq!(extract_content(&delivered[0]), "Hello World"); + let client_response = delivered[0] + .data + .as_ref() + .expect("the successful chunk carries a body"); + assert_eq!(client_response.inner.choices.len(), 1); + assert_eq!( + client_response.inner.choices[0].finish_reason, + Some(FinishReason::Stop) + ); + + assert!( + outcome.drop_reason.is_none(), + "a successful fold must not carry a drop reason" + ); + let recorded = outcome + .response + .expect("the complete response must reach the record"); + assert_eq!(recorded.inner.choices.len(), 1); + assert_eq!( + recorded.inner.choices[0].message.content.as_ref().unwrap(), + &ChatCompletionMessageContent::Text("Hello World".to_string()) + ); + assert_eq!( + recorded.inner.choices[0].finish_reason, + Some(FinishReason::Stop) + ); + } + + #[tokio::test] + async fn fold_error_after_content_records_the_prefix_and_sends_the_fallback() { + let chunks = vec![ + create_mock_chunk("Hello ".to_string(), 0), + Annotated::::from_error( + "invalid sampling parameter", + ), + ]; + + let (folded, future) = fold_aggregate_with_future(stream::iter(chunks)); + let delivered: Vec<_> = folded.collect().await; + let outcome = future.await; + + assert_eq!(delivered.len(), 1, "the fold path emits a single chunk"); + assert!( + delivered[0] + .data + .as_ref() + .expect("the fallback chunk carries a body") + .inner + .choices + .is_empty(), + "the client gets the empty fallback, not the truncated aggregation" + ); + + let reason = outcome + .drop_reason + .as_deref() + .expect("an errored fold must carry a drop reason"); + assert!( + reason.starts_with("aggregation_failed:"), + "reason should use the colon-delimited grammar, got {reason}" + ); + assert!( + reason.contains("invalid sampling parameter"), + "reason should name the underlying error, got {reason}" + ); + + let partial = outcome + .response + .expect("content collected before the error must reach the record"); + assert_eq!( + partial.inner.choices[0].message.content.as_ref().unwrap(), + &ChatCompletionMessageContent::Text("Hello ".to_string()), + "only the pre-error prefix should be aggregated" + ); } } diff --git a/lib/llm/tests/request_trace_nats_integration.rs b/lib/llm/tests/request_trace_nats_integration.rs index e752fef7dc1b..73e161c01635 100644 --- a/lib/llm/tests/request_trace_nats_integration.rs +++ b/lib/llm/tests/request_trace_nats_integration.rs @@ -166,10 +166,10 @@ mod tests { let request = create_test_request("nemotron", true); let handle = payload::create_handle(&request, "test-req-1", None) .expect("Failed to create payload handle"); - handle.emit(Some(Arc::new(create_test_response( - "nemotron", - "test response", - )))); + handle.emit( + Some(Arc::new(create_test_response("nemotron", "test response"))), + None, + ); time::sleep(Duration::from_millis(200)).await; @@ -232,12 +232,12 @@ mod tests { let request_true = create_test_request("nemotron", true); payload::create_handle(&request_true, "store-true", None) .expect("store=true handle") - .emit(None); + .emit(None, Some("response_stream_dropped".to_string())); let request_false = create_test_request("nemotron", false); payload::create_handle(&request_false, "store-false", None) .expect("store=false handle") - .emit(None); + .emit(None, Some("response_stream_dropped".to_string())); time::sleep(Duration::from_millis(200)).await; From e46c7e91784cf15e787e2826e942902de4cd09e1 Mon Sep 17 00:00:00 2001 From: GLAMR Date: Fri, 18 Sep 2026 17:35:17 -0400 Subject: [PATCH 116/191] fix: align NIXL Prometheus port handling (#14625) Signed-off-by: svc-glamr@nvidia.com Signed-off-by: GLAMR Signed-off-by: krishung5 Co-authored-by: krishung5 --- .../src/dynamo/common/utils/nixl_telemetry.py | 83 +++++++++++++++---- .../common/utils/tests/test_nixl_telemetry.py | 69 +++++++++++++-- .../src/dynamo/sglang/nixl_telemetry.py | 12 ++- .../tests/test_sglang_nixl_telemetry_ports.py | 16 ++++ components/src/dynamo/vllm/backend_args.py | 16 +--- .../vllm/tests/test_vllm_backend_args.py | 48 +++++++---- deploy/operator/docs/footer.md | 2 +- .../internal/dynamo/backend_sglang.go | 80 +++++++++++------- .../internal/dynamo/backend_sglang_test.go | 75 ++++++++++++----- .../kubernetes/operations/observability.mdx | 32 ++++++- .../additional-resources/api-reference-k8s.md | 2 +- .../kubernetes-api/full-api-reference.mdx | 2 +- .../observability/environment-variables.mdx | 18 +++- 13 files changed, 341 insertions(+), 114 deletions(-) diff --git a/components/src/dynamo/common/utils/nixl_telemetry.py b/components/src/dynamo/common/utils/nixl_telemetry.py index e4855061e5f9..a98366600f8a 100644 --- a/components/src/dynamo/common/utils/nixl_telemetry.py +++ b/components/src/dynamo/common/utils/nixl_telemetry.py @@ -15,11 +15,16 @@ This module deliberately imports no inference engine: the derivation is pure arithmetic over a base port and a rank index, and the callers that know how to find a rank index live in the per-backend packages. + +Only environment configuration is inspected here. NIXL can also read these +settings from ``NIXL_CONFIG_FILE``, ``~/.nixl.cfg``, or ``/etc/nixl.cfg``; +Dynamo cannot derive or declare per-rank ports from those files. """ from __future__ import annotations import os +import re from collections.abc import Mapping MAX_PORT = 65535 @@ -28,7 +33,14 @@ NIXL_TELEMETRY_EXPORTER_ENV = "NIXL_TELEMETRY_EXPORTER" NIXL_TELEMETRY_PROMETHEUS_PORT_ENV = "NIXL_TELEMETRY_PROMETHEUS_PORT" -DEFAULT_NIXL_PROMETHEUS_PORT = 19090 +# NIXL's Prometheus exporter uses this port when no override is configured. +DEFAULT_NIXL_PROMETHEUS_PORT = 9090 + +# NIXL compares these tokens case-insensitively, without trimming whitespace. +_NIXL_TRUE_VALUES = frozenset({"y", "1", "yes", "on", "true", "enable"}) +_NIXL_FALSE_VALUES = frozenset({"n", "0", "no", "off", "false", "disable"}) + +_NIXL_UINT16 = re.compile(r"(?:0[xX][0-9a-fA-F]+|[0-9]+)") # Keep in sync with DynamoMaxNixlPorts in deploy/operator/internal/consts/consts.go: # a rank deriving a port past the reserved range would bind a port nothing scrapes. @@ -45,11 +57,7 @@ def configured_fixed_port( default: int | None = None, env: Mapping[str, str] | None = None, ) -> int | None: - """Return a configured fixed TCP port, ignoring disabled/invalid values. - - Mirrors ``dynamo.vllm.backend_args._configured_fixed_port`` so that a value - this package accepts is exactly a value that package accepts. - """ + """Return a configured fixed TCP port, ignoring disabled/invalid values.""" environ = os.environ if env is None else env raw = environ.get(env_name) if raw is None: @@ -61,18 +69,65 @@ def configured_fixed_port( return port if 0 < port <= MAX_PORT else None +def _parse_nixl_uint16(env_name: str, raw: str) -> int: + """Parse one present value with NIXL's unsigned 16-bit syntax.""" + # Unlike int(), NIXL rejects signs, whitespace, separators, and partial parses. + if _NIXL_UINT16.fullmatch(raw) is None: + raise ValueError(f"{env_name}={raw!r} is not a valid unsigned 16-bit integer") + + is_hex = raw.startswith(("0x", "0X")) + digits = (raw[2:] if is_hex else raw).lstrip("0") or "0" + max_digits = format(MAX_PORT, "x") if is_hex else str(MAX_PORT) + if len(digits) > len(max_digits) or ( + len(digits) == len(max_digits) and digits.lower() > max_digits + ): + raise ValueError(f"{env_name}={raw!r} is outside the range 0-{MAX_PORT}") + # Parse only the significant digits so Python's configurable integer-string + # limit cannot misclassify a valid value with many leading zeroes. + return int(digits, 16 if is_hex else 10) + + +def _parse_nixl_bool(env_name: str, raw: str) -> bool: + """Parse one present value with NIXL's case-insensitive boolean syntax.""" + normalized = raw.lower() + if normalized in _NIXL_TRUE_VALUES: + return True + if normalized in _NIXL_FALSE_VALUES: + return False + raise ValueError(f"{env_name}={raw!r} is not a boolean value recognized by NIXL") + + def nixl_prometheus_base_port(env: Mapping[str, str] | None = None) -> int | None: - """Return the base NIXL Prometheus port, or None when it is not in use.""" + """Return the fixed Prometheus port selected by the NIXL environment. + + ``None`` means this environment does not select the Prometheus exporter. + Invalid NIXL values raise, as they do during NIXL agent construction. + """ environ = os.environ if env is None else env - enabled = environ.get(NIXL_TELEMETRY_ENABLE_ENV, "").strip().lower() - exporter = environ.get(NIXL_TELEMETRY_EXPORTER_ENV, "prometheus") - if enabled != "y" or exporter.strip().lower() != "prometheus": + enabled = environ.get(NIXL_TELEMETRY_ENABLE_ENV) + if enabled is None or not _parse_nixl_bool(NIXL_TELEMETRY_ENABLE_ENV, enabled): + return None + + exporter = environ.get(NIXL_TELEMETRY_EXPORTER_ENV, "") + # TODO: NIXL main also has a prometheus_mp exporter that shares this port + # variable but aggregates all ranks behind one endpoint. Add separate + # reservation semantics when Dynamo moves to a NIXL release containing it. + if exporter != "prometheus": return None - return configured_fixed_port( - NIXL_TELEMETRY_PROMETHEUS_PORT_ENV, - default=DEFAULT_NIXL_PROMETHEUS_PORT, - env=environ, + + raw_port = environ.get(NIXL_TELEMETRY_PROMETHEUS_PORT_ENV) + port = ( + DEFAULT_NIXL_PROMETHEUS_PORT + if raw_port is None + else _parse_nixl_uint16(NIXL_TELEMETRY_PROMETHEUS_PORT_ENV, raw_port) ) + if port == 0: + raise ValueError( + f"{NIXL_TELEMETRY_PROMETHEUS_PORT_ENV}=0 asks NIXL for an ephemeral " + "port, which Dynamo cannot declare or configure as a scrape target. " + f"Set a fixed port between 1 and {MAX_PORT}." + ) + return port def reserved_port_ranges( diff --git a/components/src/dynamo/common/utils/tests/test_nixl_telemetry.py b/components/src/dynamo/common/utils/tests/test_nixl_telemetry.py index c8e0dcfe6cdd..dfee579a9a00 100644 --- a/components/src/dynamo/common/utils/tests/test_nixl_telemetry.py +++ b/components/src/dynamo/common/utils/tests/test_nixl_telemetry.py @@ -6,6 +6,7 @@ import pytest from dynamo.common.utils.nixl_telemetry import ( + DEFAULT_NIXL_PROMETHEUS_PORT, MAX_COLOCATED_NIXL_EXPORTERS, MAX_PORT, derive_nixl_prometheus_port, @@ -95,16 +96,72 @@ def test_a_launch_wider_than_the_pod_reserves_is_rejected(self): class TestNixlPrometheusBasePort: - def test_operator_defaults_are_recognized(self): - assert nixl_prometheus_base_port(OPERATOR_ENV) == 19090 + @pytest.mark.parametrize( + "enabled_value", ["y", "1", "yes", "on", "true", "enable", "TRUE"] + ) + def test_nixl_truthy_token_is_recognized(self, enabled_value): + env = {**OPERATOR_ENV, "NIXL_TELEMETRY_ENABLE": enabled_value} + assert nixl_prometheus_base_port(env) == 19090 + + @pytest.mark.parametrize( + "enabled_value", ["n", "0", "no", "off", "false", "disable", "FALSE"] + ) + def test_nixl_false_token_disables_telemetry(self, enabled_value): + env = {**OPERATOR_ENV, "NIXL_TELEMETRY_ENABLE": enabled_value} + assert nixl_prometheus_base_port(env) is None + + @pytest.mark.parametrize("enabled_value", ["", "maybe", " y", "y "]) + def test_invalid_enable_value_is_rejected(self, enabled_value): + env = {**OPERATOR_ENV, "NIXL_TELEMETRY_ENABLE": enabled_value} + with pytest.raises(ValueError, match="NIXL_TELEMETRY_ENABLE"): + nixl_prometheus_base_port(env) + + @pytest.mark.parametrize( + ("removed_name", "expected"), + [ + ("NIXL_TELEMETRY_EXPORTER", None), + ("NIXL_TELEMETRY_PROMETHEUS_PORT", DEFAULT_NIXL_PROMETHEUS_PORT), + ], + ) + def test_unset_value(self, removed_name, expected): + env = dict(OPERATOR_ENV) + del env[removed_name] + assert nixl_prometheus_base_port(env) == expected + + def test_hexadecimal_port_is_recognized(self): + env = {**OPERATOR_ENV, "NIXL_TELEMETRY_PROMETHEUS_PORT": "0x4A92"} + assert nixl_prometheus_base_port(env) == 19090 + + @pytest.mark.parametrize("port_value", ["abc", "99999", " 9090", "+9090"]) + def test_invalid_port_is_rejected(self, port_value): + env = {**OPERATOR_ENV, "NIXL_TELEMETRY_PROMETHEUS_PORT": port_value} + with pytest.raises(ValueError, match="NIXL_TELEMETRY_PROMETHEUS_PORT"): + nixl_prometheus_base_port(env) + + def test_oversized_port_is_reported_as_out_of_range(self): + env = {**OPERATOR_ENV, "NIXL_TELEMETRY_PROMETHEUS_PORT": "9" * 5000} + with pytest.raises(ValueError, match="outside the range"): + nixl_prometheus_base_port(env) + + def test_many_leading_zeroes_do_not_trigger_python_integer_limit(self): + env = { + **OPERATOR_ENV, + "NIXL_TELEMETRY_PROMETHEUS_PORT": "0" * 5000 + "19090", + } + assert nixl_prometheus_base_port(env) == 19090 + + def test_ephemeral_port_is_rejected_by_dynamo(self): + env = {**OPERATOR_ENV, "NIXL_TELEMETRY_PROMETHEUS_PORT": "0"} + with pytest.raises(ValueError, match="ephemeral"): + nixl_prometheus_base_port(env) @pytest.mark.parametrize( "override", [ - {"NIXL_TELEMETRY_ENABLE": "n"}, - {"NIXL_TELEMETRY_ENABLE": ""}, - {"NIXL_TELEMETRY_EXPORTER": "file"}, + {"NIXL_TELEMETRY_EXPORTER": "doca"}, + {"NIXL_TELEMETRY_EXPORTER": "PROMETHEUS"}, + {"NIXL_TELEMETRY_EXPORTER": "prometheus "}, ], ) - def test_disabled_telemetry_has_no_base_port(self, override): + def test_inactive_configuration_has_no_base_port(self, override): assert nixl_prometheus_base_port({**OPERATOR_ENV, **override}) is None diff --git a/components/src/dynamo/sglang/nixl_telemetry.py b/components/src/dynamo/sglang/nixl_telemetry.py index 4a28b0651633..3d9c6153eea0 100644 --- a/components/src/dynamo/sglang/nixl_telemetry.py +++ b/components/src/dynamo/sglang/nixl_telemetry.py @@ -101,7 +101,11 @@ def _node_local_rank( def _assign_nixl_prometheus_port(target: Any, args: tuple, kwargs: dict) -> None: - """Rewrite this process's exporter port before the NIXL agent is built.""" + """Rewrite this process's exporter port before the NIXL agent is built. + + Raises ``ValueError`` when the NIXL environment is invalid or the rank's + fixed port cannot fit in Dynamo's declared scrape range. + """ base_port = nixl_prometheus_base_port() if base_port is None: return @@ -163,8 +167,10 @@ def install_per_rank_nixl_prometheus_ports() -> None: """Point SGLang's scheduler launches at the wrapper, when telemetry is on. A no-op when NIXL Prometheus telemetry is disabled, so a deployment that - does not scrape NIXL keeps SGLang's own entry point. Raises ``RuntimeError`` - when telemetry is on but this SGLang offers no override point. + does not scrape NIXL keeps SGLang's own entry point. Raises ``ValueError`` + for invalid NIXL environment values or an unusable fixed port, and + ``RuntimeError`` when telemetry is on but this SGLang offers no override + point. """ if nixl_prometheus_base_port() is None: return diff --git a/components/src/dynamo/sglang/tests/test_sglang_nixl_telemetry_ports.py b/components/src/dynamo/sglang/tests/test_sglang_nixl_telemetry_ports.py index a3e423055d44..3f2645558e4b 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_nixl_telemetry_ports.py +++ b/components/src/dynamo/sglang/tests/test_sglang_nixl_telemetry_ports.py @@ -292,6 +292,22 @@ def test_install_is_a_no_op_when_telemetry_is_disabled(self, telemetry_env): telemetry_env.setenv("NIXL_TELEMETRY_ENABLE", "n") install_per_rank_nixl_prometheus_ports() + @pytest.mark.parametrize( + ("env_name", "value"), + [ + ("NIXL_TELEMETRY_ENABLE", "maybe"), + (NIXL_TELEMETRY_PROMETHEUS_PORT_ENV, "not-a-port"), + ], + ) + def test_invalid_config_is_rejected_before_importing_sglang( + self, telemetry_env, env_name, value + ): + telemetry_env.setenv(env_name, value) + telemetry_env.setitem(sys.modules, "sglang", _LazyProxyModule()) + + with pytest.raises(ValueError, match=env_name): + install_per_rank_nixl_prometheus_ports() + def test_install_points_sglang_at_the_wrapper(self, telemetry_env): """The override has to land on the class, not on the ``sglang`` proxy.""" engine = type("Engine", (), {"run_scheduler_process_func": None}) diff --git a/components/src/dynamo/vllm/backend_args.py b/components/src/dynamo/vllm/backend_args.py index 689a6c2dcd74..89fe0e2c0fe8 100644 --- a/components/src/dynamo/vllm/backend_args.py +++ b/components/src/dynamo/vllm/backend_args.py @@ -19,6 +19,7 @@ add_negatable_bool_argument, parse_bool, ) +from dynamo.common.utils.nixl_telemetry import nixl_prometheus_base_port from . import __version__ from .benchmark_points import ( @@ -32,7 +33,6 @@ logger = logging.getLogger(__name__) PREFILL_DECODE_DISAGGREGATION_MODE = "pd" MAX_PORT = 65535 -DEFAULT_NIXL_PROMETHEUS_PORT = 19090 def _configured_fixed_port(env_name: str, *, default: int | None = None) -> int | None: @@ -47,18 +47,6 @@ def _configured_fixed_port(env_name: str, *, default: int | None = None) -> int return port if 0 < port <= MAX_PORT else None -def _nixl_prometheus_port() -> int | None: - """Return the NIXL Prometheus listener port when it is enabled.""" - enabled = os.environ.get("NIXL_TELEMETRY_ENABLE", "").strip().lower() - exporter = os.environ.get("NIXL_TELEMETRY_EXPORTER", "prometheus") - if enabled != "y" or exporter.strip().lower() != "prometheus": - return None - return _configured_fixed_port( - "NIXL_TELEMETRY_PROMETHEUS_PORT", - default=DEFAULT_NIXL_PROMETHEUS_PORT, - ) - - def _is_intra_pod_failover_engine() -> bool: """Recognize the operator's cloned intra-pod engine containers.""" engine_id = os.environ.get("ENGINE_ID") @@ -912,7 +900,7 @@ def _validate_port_reservation_collisions( if fpm_port is not None: reservations.append(("DYN_FORWARDPASS_METRIC_PORT", fpm_port, fpm_port)) - nixl_port = _nixl_prometheus_port() + nixl_port = nixl_prometheus_base_port() if nixl_port is not None: reservations.append( ("NIXL_TELEMETRY_PROMETHEUS_PORT", nixl_port, nixl_port) diff --git a/components/src/dynamo/vllm/tests/test_vllm_backend_args.py b/components/src/dynamo/vllm/tests/test_vllm_backend_args.py index 14b1450f88c8..1e309d3cd1aa 100644 --- a/components/src/dynamo/vllm/tests/test_vllm_backend_args.py +++ b/components/src/dynamo/vllm/tests/test_vllm_backend_args.py @@ -662,21 +662,6 @@ def test_system_port_range_adjacent_to_fpm_is_accepted(self, monkeypatch): config.embedding_worker_processes = 3 config._validate_embedding_worker_processes() - def test_enabled_nixl_prometheus_collision_is_rejected(self, monkeypatch): - monkeypatch.setenv("DYN_SYSTEM_PORT", "19089") - monkeypatch.setenv("NIXL_TELEMETRY_ENABLE", "y") - monkeypatch.setenv("NIXL_TELEMETRY_EXPORTER", "prometheus") - monkeypatch.setenv("NIXL_TELEMETRY_PROMETHEUS_PORT", "19090") - config = create_config() - config.embedding_worker = True - config.embedding_worker_processes = 3 - - with pytest.raises( - ValueError, - match="NIXL_TELEMETRY_PROMETHEUS_PORT reserves 19090", - ): - config._validate_embedding_worker_processes() - def test_disabled_nixl_prometheus_port_is_not_reserved(self, monkeypatch): monkeypatch.setenv("DYN_SYSTEM_PORT", "19089") monkeypatch.setenv("NIXL_TELEMETRY_ENABLE", "n") @@ -705,6 +690,39 @@ def test_active_non_system_listeners_cannot_overlap(self, monkeypatch): ): config._validate_embedding_worker_processes() + @pytest.mark.parametrize( + ("system_port", "nixl_port", "reserved_port"), + [("19089", "19090", "19090"), ("9090", None, "9090")], + ) + def test_nixl_port_collision_is_rejected( + self, monkeypatch, system_port, nixl_port, reserved_port + ): + monkeypatch.setenv("DYN_SYSTEM_PORT", system_port) + monkeypatch.setenv("NIXL_TELEMETRY_ENABLE", "y") + monkeypatch.setenv("NIXL_TELEMETRY_EXPORTER", "prometheus") + if nixl_port is not None: + monkeypatch.setenv("NIXL_TELEMETRY_PROMETHEUS_PORT", nixl_port) + config = create_config() + config.embedding_worker = True + config.embedding_worker_processes = 3 + + with pytest.raises( + ValueError, + match=f"NIXL_TELEMETRY_PROMETHEUS_PORT reserves {reserved_port}", + ): + config._validate_embedding_worker_processes() + + def test_invalid_nixl_configuration_is_rejected(self, monkeypatch): + monkeypatch.setenv("NIXL_TELEMETRY_ENABLE", "y") + monkeypatch.setenv("NIXL_TELEMETRY_EXPORTER", "prometheus") + monkeypatch.setenv("NIXL_TELEMETRY_PROMETHEUS_PORT", "not-a-port") + config = create_config() + config.embedding_worker = True + config.embedding_worker_processes = 3 + + with pytest.raises(ValueError, match="NIXL_TELEMETRY_PROMETHEUS_PORT"): + config._validate_embedding_worker_processes() + def test_fixed_tcp_rpc_port_is_rejected(self, monkeypatch): monkeypatch.setenv("DYN_TCP_RPC_PORT", "25000") config = create_config() diff --git a/deploy/operator/docs/footer.md b/deploy/operator/docs/footer.md index 4f81bef66b51..9569de9499cf 100644 --- a/deploy/operator/docs/footer.md +++ b/deploy/operator/docs/footer.md @@ -215,7 +215,7 @@ These are injected into all components when the corresponding infrastructure ser | `DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS` | Endpoints whose health status is used for readiness | `["generate"]` | `string` (JSON array) | | `DYN_SYSTEM_PORT` | Port for the system HTTP server (health, metrics) | `9090` | `int` | | `DYN_HEALTH_CHECK_ENABLED` | Disables the legacy health check mechanism in favor of the system server | `false` | `string` (boolean) | -| `NIXL_TELEMETRY_ENABLE` | Enables or disables NIXL telemetry collection | `n` | `string` | Options: `y`, `n` | +| `NIXL_TELEMETRY_ENABLE` | Enables or disables NIXL telemetry collection. Case-insensitive options: `y`, `1`, `yes`, `on`, `true`, `enable`, `n`, `0`, `no`, `off`, `false`, `disable`. Unrecognized values fail SGLang admission or worker validation. Use `y` to opt in to SGLang operator rank port declarations. | `n` | `string` | | `NIXL_TELEMETRY_EXPORTER` | Telemetry exporter format for NIXL metrics | `prometheus` | `string` | | `NIXL_TELEMETRY_PROMETHEUS_PORT` | Port for NIXL Prometheus metrics endpoint | `19090` | `int` | | `DYN_NAMESPACE_WORKER_SUFFIX` | Hash suffix appended to worker namespace for rolling updates | — | `string` | Only set during rolling update transitions | diff --git a/deploy/operator/internal/dynamo/backend_sglang.go b/deploy/operator/internal/dynamo/backend_sglang.go index 598cb0ae586b..88f7efdf02a4 100644 --- a/deploy/operator/internal/dynamo/backend_sglang.go +++ b/deploy/operator/internal/dynamo/backend_sglang.go @@ -72,7 +72,8 @@ func (b *SGLangBackend) UpdateContainer(container *corev1.Container, numberOfNod // reserveNixlExporterPorts declares one NIXL exporter port per node-local rank. // Skips containers without a nixl port, with NIXL_TELEMETRY_ENABLE set off, or -// with an exporter other than Prometheus selected. +// with an exporter other than Prometheus selected. Literal enable values other +// than y retain their existing port declarations for upgrade compatibility. func reserveNixlExporterPorts(container *corev1.Container, containerGPUCount ContainerGPUCount) error { basePort := findContainerPort(container, commonconsts.DynamoNixlPortName) if basePort == nil { @@ -93,23 +94,37 @@ func reserveNixlExporterPorts(container *corev1.Container, containerGPUCount Con if !prometheusOn { sourced = append(sourced, "NIXL_TELEMETRY_ENABLE") } - if prometheusOn && !strings.EqualFold(strings.TrimSpace(enabled.Value), "y") { - return nil + + // Preserve the existing pod template for non-y truthy values. Users opt in + // to rank port declarations by changing the CR's enable value to y. + if prometheusOn { + switch strings.ToLower(enabled.Value) { + case "y": + case "1", "yes", "on", "true", "enable": + return nil + case "n", "0", "no", "off", "false", "disable": + return nil + default: + return fmt.Errorf( + "NIXL_TELEMETRY_ENABLE is set to %q, which is not a boolean value recognized by NIXL", + enabled.Value) + } } // Only the Prometheus exporter binds a port per rank, so activate on the - // same pair of variables nixl_prometheus_base_port() reads: an absent - // selection is the Prometheus default, any other literal selection needs no - // ports at all, and a sourced one joins an unreadable enable value in - // reserving a range this code cannot rule out. + // same pair of variables nixl_prometheus_base_port() reads. An absent + // selection or any other literal selection needs no ports at all, while a + // sourced one joins an unreadable enable value in reserving a range this + // code cannot rule out. exporter := findEnvVar(container.Env, "NIXL_TELEMETRY_EXPORTER") - if exporter != nil { - if exporter.ValueFrom != nil { - prometheusOn = false - sourced = append(sourced, "NIXL_TELEMETRY_EXPORTER") - } else if !strings.EqualFold(strings.TrimSpace(exporter.Value), "prometheus") { - return nil - } + if exporter == nil { + return nil + } + if exporter.ValueFrom != nil { + prometheusOn = false + sourced = append(sourced, "NIXL_TELEMETRY_EXPORTER") + } else if exporter.Value != "prometheus" { + return nil } containerGPUs, err := containerGPUCount() @@ -121,13 +136,12 @@ func reserveNixlExporterPorts(container *corev1.Container, containerGPUCount Con // the whole range: realign `nixl` with it or it advertises a port rank 0 // never binds. override := findEnvVar(container.Env, "NIXL_TELEMETRY_PROMETHEUS_PORT") - overridden, literal, err := literalPort(override) + overridden, literal, err := nixlPrometheusPort(override) switch { case err != nil: - // A base that is present but unusable is the quietest way to lose the - // metrics: NIXL binds 0 as an ephemeral port and reports back no port to - // scrape, so the container starts while the ports declared here and the - // PodMonitor still name the default range. Say so at admission instead. + // Reject a setting that cannot name the fixed range declared below. NIXL + // throws on malformed and out-of-range values; it accepts zero as an + // ephemeral port, but the operator cannot declare or scrape that port. return fmt.Errorf( "NIXL_TELEMETRY_PROMETHEUS_PORT is the base of the NIXL exporter range and %w, so the operator "+ "cannot declare the range it names and Prometheus would scrape ports no rank binds. Set "+ @@ -207,23 +221,31 @@ func reserveNixlExporterPorts(container *corev1.Container, containerGPUCount Con return nil } -// literalPort reads a TCP port written inline on an environment variable. An -// unset variable and one taken from valueFrom are both reported as absent, -// because a value resolved in the container at startup cannot be turned into a -// container port declaration here. A variable that is set inline to something -// that is not a usable port is neither absent nor usable, so it is returned as -// an error rather than folded into either. -func literalPort(env *corev1.EnvVar) (int32, bool, error) { +// nixlPrometheusPort parses NIXL's unsigned 16-bit syntax and requires the +// fixed, nonzero port the operator needs to declare. An unset variable and one +// taken from valueFrom are both reported as absent because a value resolved in +// the container at startup cannot become a container port declaration here. +func nixlPrometheusPort(env *corev1.EnvVar) (int32, bool, error) { if env == nil || env.ValueFrom != nil { return 0, false, nil } - value := strings.TrimSpace(env.Value) - port, err := strconv.Atoi(value) + value := env.Value + base := 10 + digits := value + if strings.HasPrefix(value, "0x") || strings.HasPrefix(value, "0X") { + base = 16 + digits = value[2:] + } + port, err := strconv.ParseUint(digits, base, 64) if err != nil { return 0, false, fmt.Errorf("is set to %q, which is not a number", env.Value) } - if port < 1 || port > maxTCPPort { + if port == 0 { + return 0, false, fmt.Errorf( + "is set to 0, which asks NIXL for an ephemeral port the operator cannot declare or scrape") + } + if port > maxTCPPort { return 0, false, fmt.Errorf("is set to %d, which is outside the port range 1-%d", port, maxTCPPort) } return int32(port), true, nil diff --git a/deploy/operator/internal/dynamo/backend_sglang_test.go b/deploy/operator/internal/dynamo/backend_sglang_test.go index 2a272c65ca09..3ca09e9022cd 100644 --- a/deploy/operator/internal/dynamo/backend_sglang_test.go +++ b/deploy/operator/internal/dynamo/backend_sglang_test.go @@ -663,6 +663,9 @@ func TestSGLangBackend_ReservesOneNixlExporterPortPerColocatedRank(t *testing.T) "nixl": 19090, "nixl-1": 19091, "nixl-2": 19092, "nixl-3": 19093, "nixl-4": 19094, "nixl-5": 19095, "nixl-6": 19096, "nixl-7": 19097, } + firstFourPorts := map[string]int32{ + "nixl": 19090, "nixl-1": 19091, "nixl-2": 19092, "nixl-3": 19093, + } tests := []struct { name string @@ -693,6 +696,27 @@ func TestSGLangBackend_ReservesOneNixlExporterPortPerColocatedRank(t *testing.T) containerGPUs: 8, expectedPorts: allEightPorts, }, + { + name: "a non-y truthy enable value preserves the existing port declarations", + ports: workerPorts, + telemetryEnable: "true", + containerGPUs: 4, + expectedPorts: map[string]int32{"nixl": 19090}, + }, + { + name: "a leading-space enable value is rejected", + ports: workerPorts, + telemetryEnable: " y", + containerGPUs: -1, + expectedError: "not a boolean value recognized by NIXL", + }, + { + name: "a malformed enable value is rejected", + ports: workerPorts, + telemetryEnable: "maybe", + containerGPUs: -1, + expectedError: "not a boolean value recognized by NIXL", + }, { name: "more ranks than the reserved range is rejected", ports: workerPorts, @@ -799,34 +823,36 @@ func TestSGLangBackend_ReservesOneNixlExporterPortPerColocatedRank(t *testing.T) expectedError: "exceeds the maximum port", }, { - name: "another exporter binds no port per rank, however many ranks there are", + name: "an uppercase exporter reserves no Prometheus rank ports", ports: workerPorts, telemetryEnable: "y", - telemetryExporter: "file", + telemetryExporter: "PROMETHEUS", containerGPUs: -1, expectedPorts: map[string]int32{"nixl": 19090}, }, { - name: "another exporter reads no base, so a sourced one is no obstacle", + name: "another valid exporter reserves no Prometheus rank ports", ports: workerPorts, telemetryEnable: "y", - telemetryExporter: "file", - portValueFrom: &corev1.EnvVarSource{ - ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{Name: "telemetry"}, - Key: "nixl-port", - }, - }, - containerGPUs: -1, - expectedPorts: map[string]int32{"nixl": 19090}, + telemetryExporter: "doca", + containerGPUs: -1, + expectedPorts: map[string]int32{"nixl": 19090}, + }, + { + name: "a whitespace-padded exporter reserves no Prometheus rank ports", + ports: workerPorts, + telemetryEnable: "y", + telemetryExporter: "prometheus ", + containerGPUs: -1, + expectedPorts: map[string]int32{"nixl": 19090}, }, { - name: "no exporter selection is the Prometheus default", + name: "no exporter selection reserves no additional ports", ports: workerPorts, telemetryEnable: "y", exporterAbsent: true, containerGPUs: 8, - expectedPorts: allEightPorts, + expectedPorts: map[string]int32{"nixl": 19090}, }, { name: "a sourced exporter reserves the range it cannot read", @@ -842,14 +868,20 @@ func TestSGLangBackend_ReservesOneNixlExporterPortPerColocatedRank(t *testing.T) expectedPorts: allEightPorts, }, { - name: "a base padded with whitespace is still a port", + name: "a base padded with whitespace is rejected", ports: workerPorts, telemetryEnable: "y", telemetryPort: " 19090 ", containerGPUs: 4, - expectedPorts: map[string]int32{ - "nixl": 19090, "nixl-1": 19091, "nixl-2": 19092, "nixl-3": 19093, - }, + expectedError: `is set to " 19090 ", which is not a number`, + }, + { + name: "a hexadecimal base moves every declared port with it", + ports: workerPorts, + telemetryEnable: "y", + telemetryPort: "0x4A92", + containerGPUs: 4, + expectedPorts: firstFourPorts, }, { name: "a base written as words is rejected", @@ -868,12 +900,12 @@ func TestSGLangBackend_ReservesOneNixlExporterPortPerColocatedRank(t *testing.T) expectedError: `is set to "", which is not a number`, }, { - name: "a base of zero is rejected rather than bound as an ephemeral port", + name: "an ephemeral base is rejected because it cannot be declared", ports: workerPorts, telemetryEnable: "y", telemetryPort: "0", containerGPUs: 4, - expectedError: "is set to 0, which is outside the port range", + expectedError: "ephemeral port the operator cannot declare or scrape", }, { name: "a base past the maximum port is rejected", @@ -905,8 +937,7 @@ func TestSGLangBackend_ReservesOneNixlExporterPortPerColocatedRank(t *testing.T) {Name: "DYN_SYSTEM_PORT", Value: strconv.Itoa(commonconsts.DynamoSystemPort)}, {Name: "NIXL_TELEMETRY_ENABLE", Value: tt.telemetryEnable, ValueFrom: tt.telemetryValueFrom}, } - // An older deployment predating the exporter selection leaves the - // variable off entirely, which the runtime reads as Prometheus. + // Leave the exporter variable absent for the no-exporter case. if !tt.exporterAbsent { env = append(env, corev1.EnvVar{Name: "NIXL_TELEMETRY_EXPORTER", Value: telemetryExporter, ValueFrom: tt.exporterValueFrom}) } diff --git a/docs/fern/pages/kubernetes/operations/observability.mdx b/docs/fern/pages/kubernetes/operations/observability.mdx index 131379f9c12c..b3a779ce1afd 100644 --- a/docs/fern/pages/kubernetes/operations/observability.mdx +++ b/docs/fern/pages/kubernetes/operations/observability.mdx @@ -146,10 +146,34 @@ spec: value: "y" ``` -NIXL exposes these metrics on its telemetry port, which defaults to `19090`. A worker that runs -several ranks in one container builds one NIXL agent per rank, so that value is the base of a -range: SGLang gives node-local rank *i* the port `19090 + i` and the operator declares each one as -a separate container port (`nixl`, `nixl-1`, …). See +`NIXL_TELEMETRY_ENABLE` on its own only turns collection on. A scrapeable endpoint also needs +`NIXL_TELEMETRY_EXPORTER=prometheus`, because NIXL has no default exporter. +`NIXL_TELEMETRY_PROMETHEUS_PORT` is optional and chooses the port. When it is unset, the exporter +falls back to `9090` rather than to Dynamo's `19090` convention. The operator already presets +`DYN_SYSTEM_PORT` to `9090`, so set the NIXL port explicitly to keep the two apart. The operator +presets `NIXL_TELEMETRY_EXPORTER=prometheus` and `NIXL_TELEMETRY_PROMETHEUS_PORT=19090` on worker, +prefill, and decode pods, so on an operator-managed deployment the snippet above is enough. Set all +three variables explicitly anywhere else. + +A worker that runs several ranks in one container builds one NIXL agent per rank, so the configured +port is the base of a range: SGLang gives node-local rank *i* the port `base + i` and the operator +declares each one as a separate container port (`nixl`, `nixl-1`, …) when +`NIXL_TELEMETRY_ENABLE=y` (case-insensitive). + +For upgrade compatibility, literal enable values `1`, `yes`, `on`, `true`, and `enable` +retain their existing container port declarations. To expose the additional SGLang rank ports, +change the value to `y` in the custom resource. This explicit change updates the pod template +and rolls the workload; an operator-only upgrade leaves these declarations unchanged. + + +Enabling telemetry does not on its own make the port scrapeable from Prometheus. The +`dynamo-worker` PodMonitor endpoint for the `nixl` port is off by default +(`dynamo-operator.dynamo.metrics.podMonitors.nixlTelemetry` in the platform chart), because every worker pod declares the `nixl` +container port whether or not telemetry is enabled. Turn the endpoint on once the port is +confirmed to be serving. + + +See [Environment Variables](../../reference/observability/environment-variables.mdx#system-and-metrics) for the complete NIXL telemetry configuration. diff --git a/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md b/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md index c255419e3a20..5023b97435c2 100644 --- a/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md +++ b/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md @@ -3745,7 +3745,7 @@ These are injected into all components when the corresponding infrastructure ser | `DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS` | Endpoints whose health status is used for readiness | `["generate"]` | `string` (JSON array) | | `DYN_SYSTEM_PORT` | Port for the system HTTP server (health, metrics) | `9090` | `int` | | `DYN_HEALTH_CHECK_ENABLED` | Disables the legacy health check mechanism in favor of the system server | `false` | `string` (boolean) | -| `NIXL_TELEMETRY_ENABLE` | Enables or disables NIXL telemetry collection | `n` | `string` | Options: `y`, `n` | +| `NIXL_TELEMETRY_ENABLE` | Enables or disables NIXL telemetry collection. Case-insensitive options: `y`, `1`, `yes`, `on`, `true`, `enable`, `n`, `0`, `no`, `off`, `false`, `disable`. Unrecognized values fail SGLang admission or worker validation. Use `y` to opt in to SGLang operator rank port declarations. | `n` | `string` | | `NIXL_TELEMETRY_EXPORTER` | Telemetry exporter format for NIXL metrics | `prometheus` | `string` | | `NIXL_TELEMETRY_PROMETHEUS_PORT` | Port for NIXL Prometheus metrics endpoint | `19090` | `int` | | `DYN_NAMESPACE_WORKER_SUFFIX` | Hash suffix appended to worker namespace for rolling updates | — | `string` | Only set during rolling update transitions | diff --git a/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx b/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx index a6a643fb03dd..3dbf22a26d99 100644 --- a/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx +++ b/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx @@ -4987,7 +4987,7 @@ These are injected into all components when the corresponding infrastructure ser | `DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS` | Endpoints whose health status is used for readiness | `["generate"]` | `string` (JSON array) | | `DYN_SYSTEM_PORT` | Port for the system HTTP server (health, metrics) | `9090` | `int` | | `DYN_HEALTH_CHECK_ENABLED` | Disables the legacy health check mechanism in favor of the system server | `false` | `string` (boolean) | -| `NIXL_TELEMETRY_ENABLE` | Enables or disables NIXL telemetry collection | `n` | `string` | Options: `y`, `n` | +| `NIXL_TELEMETRY_ENABLE` | Enables or disables NIXL telemetry collection. Case-insensitive options: `y`, `1`, `yes`, `on`, `true`, `enable`, `n`, `0`, `no`, `off`, `false`, `disable`. Unrecognized values fail SGLang admission or worker validation. Use `y` to opt in to SGLang operator rank port declarations. | `n` | `string` | | `NIXL_TELEMETRY_EXPORTER` | Telemetry exporter format for NIXL metrics | `prometheus` | `string` | | `NIXL_TELEMETRY_PROMETHEUS_PORT` | Port for NIXL Prometheus metrics endpoint | `19090` | `int` | | `DYN_NAMESPACE_WORKER_SUFFIX` | Hash suffix appended to worker namespace for rolling updates | — | `string` | Only set during rolling update transitions | diff --git a/docs/fern/pages/reference/observability/environment-variables.mdx b/docs/fern/pages/reference/observability/environment-variables.mdx index 72ac10511048..a46d90995c03 100644 --- a/docs/fern/pages/reference/observability/environment-variables.mdx +++ b/docs/fern/pages/reference/observability/environment-variables.mdx @@ -91,7 +91,13 @@ Every Dynamo process reads its own environment at startup, so set these on each Enables [NIXL](https://github.com/ai-dynamo/nixl) telemetry. NIXL metrics track KV cache and embedding data transfers and are populated only during disaggregated serving or multimodal embedding transfers. - Allowed values: y n + This variable alone does not produce a scrapeable endpoint: set `NIXL_TELEMETRY_EXPORTER` as well. `NIXL_TELEMETRY_PROMETHEUS_PORT` then chooses the port, and while it is optional, leaving it unset lands the exporter on a port the operator already uses. Both are described below. + + Allowed values: y 1 yes on true enable n 0 no off false disable + + NIXL compares the value case-insensitively but does not trim whitespace, so `Y` and `TRUE` are accepted while ` y` and `y ` are errors. Any other value is also an error. + + For SGLang operator port declarations, use `y` (case-insensitive). Other literal truthy values retain their existing port declarations to avoid rolling unchanged workloads on operator upgrade. Changing the custom resource value to `y` opts in to the additional rank ports and rolls the workload. Runtime telemetry still accepts all the truthy values listed above. **Operator preset:** `n` on worker, prefill, and decode pods. @@ -99,17 +105,21 @@ Every Dynamo process reads its own environment at startup, so set these on each NIXL telemetry exporter to use, e.g. `prometheus`. + Required for a Prometheus endpoint, with the exact lowercase value `prometheus`. NIXL has no default exporter: when this variable is unset, telemetry is collected in-process without opening a Prometheus port. Other valid exporters, such as `doca`, use their own configuration; an exporter that NIXL cannot load makes agent construction fail. + **Operator preset:** `prometheus` on worker, prefill, and decode pods. - - Port for NIXL's Prometheus exporter — a separate port from the Dynamo metrics port. Each NIXL agent binds its own exporter, so every agent needs a port of its own; two agents pointed at the same port leave the second unable to bind and the process exits. + + Port for NIXL's Prometheus exporter — a separate port from the Dynamo metrics port. Each NIXL agent binds its own exporter, so every agent needs a port of its own; two agents pointed at the same port leave the second exporter unable to bind. Give each worker a non-overlapping value when workers share a network namespace. Because each value is the base of an eight-port range (see below), `19090` for the prefill worker leaves `19098` as the next free base for the decode worker. Within a single worker, treat this as the **base** of a range rather than one port. SGLang runs one scheduler process per node-local GPU and each builds its own NIXL agent, so Dynamo gives node-local rank *i* the port `base + i` and the operator declares the whole range on the pod as `nixl`, `nixl-1`, … so Prometheus scrapes every rank. Leave room for as many consecutive ports as the pod has GPUs (up to 8). - Set it to a literal port between 1 and 65535. The operator reads this value to declare the range as container ports, so while NIXL Prometheus telemetry is on it rejects a value taken from `valueFrom`, and one that is not a usable port, rather than let the exporters bind a range nothing scrapes. + Optional: with the exporter selected, NIXL binds a listener whether or not this is set. `19090` is Dynamo's convention rather than a NIXL default, and with this variable unset the exporter falls back to its own built-in `9090` — which is the `DYN_SYSTEM_PORT` operator preset, so set it explicitly to keep the two apart. A malformed or out-of-range value is not a fallback. NIXL 1.3.2 logs the exporter creation failure and continues without an exporter; NIXL 1.4.0 raises an error during agent construction. Dynamo's own port validation rejects these values before worker startup, independently of that version-specific NIXL behavior. NIXL accepts `0` as an ephemeral port, but Dynamo rejects it because that port cannot be declared or configured as a scrape target. + + Set a literal port between 1 and 65535, in decimal or hexadecimal (for example, `0x4a92` for `19090`). When reserving SGLang Prometheus rank ports, the operator rejects a value taken from `valueFrom`: it cannot resolve that value to declare the range as container ports. **Operator preset:** `19090` on worker, prefill, and decode pods. From ae5ca99fba7fd79d20175f45317980a948758af7 Mon Sep 17 00:00:00 2001 From: ishandhanani <82981111+ishandhanani@users.noreply.github.com> Date: Fri, 18 Sep 2026 15:05:12 -0700 Subject: [PATCH 117/191] feat(router): add deadline-aware policy queue ordering (#14176) Signed-off-by: Ishan Dhanani --- benchmarks/router/common.py | 6 +- lib/kv-router/src/scheduling/AGENTS.md | 29 +- lib/kv-router/src/scheduling/policy_config.rs | 9 + lib/kv-router/src/scheduling/policy_queue.rs | 452 +++++++++++- lib/kv-router/src/scheduling/queue.rs | 667 ++++++++++++++---- lib/kv-router/src/scheduling/types.rs | 3 + .../src/services/selection/core/run.rs | 2 +- lib/kv-router/src/services/selection/error.rs | 12 +- lib/kv-router/src/services/selection/tests.rs | 2 +- lib/llm/src/grpc/service/openai.rs | 9 + lib/llm/src/grpc/service/tensor.rs | 9 + lib/llm/src/http/service/anthropic.rs | 13 + lib/llm/src/http/service/generate.rs | 74 +- lib/llm/src/http/service/metrics.rs | 24 + lib/llm/src/http/service/openai.rs | 35 + lib/llm/src/http/service/sglang_generate.rs | 141 +++- lib/llm/src/kv_router.rs | 22 + lib/llm/src/kv_router/embedded.rs | 57 +- lib/llm/src/kv_router/metrics.rs | 107 ++- lib/llm/tests/common/http_harness.rs | 5 + lib/llm/tests/common/scripted_chat_engine.rs | 19 + .../frontend_protocol_validation_http.rs | 51 ++ lib/runtime/src/error.rs | 4 +- .../src/pipeline/network/egress/route_span.rs | 16 +- 24 files changed, 1596 insertions(+), 172 deletions(-) diff --git a/benchmarks/router/common.py b/benchmarks/router/common.py index ae25d805fbcc..eae8872aaff1 100755 --- a/benchmarks/router/common.py +++ b/benchmarks/router/common.py @@ -10,8 +10,6 @@ import logging import os -from prefix_data_generator.synthesizer import Synthesizer - # Default values DEFAULT_MODEL = "deepseek-ai/DeepSeek-R1-Distill-Llama-8B" DEFAULT_URL = "http://localhost:8000" @@ -326,6 +324,10 @@ def prepare_trace_dataset(args, output_dir, logger): ) logger.info(f" Random seed: {args.seed}") + # Synthetic generation has optional dependencies absent from slim CPU test images. + # Keep the request helpers and trace-file path usable without those dependencies. + from prefix_data_generator.synthesizer import Synthesizer + synthesizer = Synthesizer( args.input_dataset, block_size=args.block_size, diff --git a/lib/kv-router/src/scheduling/AGENTS.md b/lib/kv-router/src/scheduling/AGENTS.md index 84fa6e4fbdc5..8f80b3312e41 100644 --- a/lib/kv-router/src/scheduling/AGENTS.md +++ b/lib/kv-router/src/scheduling/AGENTS.md @@ -16,17 +16,16 @@ sequenceDiagram end participant S as WorkerSelector - H->>A: Enqueue(request) - A->>A: Resolve class_index - alt Immediate path + H->>H: Resolve class_index, sample snapshot, stamp arrival + H->>A: Enqueue(request, metadata) + alt Direct path (never-queues class or zero workers) A->>S: select_worker(request) S-->>A: Selected worker A->>A: Reserve worker capacity and respond - else Queued path - A->>P: enqueue(class_index, request) + else Policy-queue path (every other request) + A->>P: enqueue(metadata, request) P->>C: Push into the selected class queue - H->>A: Update after capacity changes - A->>P: pop_next() + A->>P: pop_next() in the same actor turn P->>C: Get one candidate per dispatchable class C-->>P: Dispatch candidate P-->>A: DRR winner @@ -34,12 +33,24 @@ sequenceDiagram S-->>A: Selected worker A->>A: Reserve worker capacity and respond end + H->>A: Update after capacity changes drains the remaining backlog ``` -- `SchedulerQueue` is the public handle that sends commands to the actor. -- `SchedulerQueueActor` classifies each request and chooses the immediate or queued path. +- `SchedulerQueue` is the public handle. It resolves the class index, samples the + cache-overlap snapshot, and stamps the arrival offset on the caller task before + sending the Enqueue command. +- `SchedulerQueueActor` routes every request through the policy queue and drains the + ready backlog in the same actor turn, so freed capacity can go to another class's + queued head under DRR rather than to the arriving request. The direct path remains + only for classes that can never hold a queued entry (any zero per-worker limit) and + for zero-discovered-worker windows, which surface `NoEndpoints` from selection. - `PolicyQueue` does not classify requests. It owns all class queues and uses deficit round robin (DRR) to give each class weighted turns. - Each `PolicyClassQueue` owns ordering and accounting for one class such as `latency`, `agents`, or `batch`. +- Within one strict-priority tier, deadline-bearing entries order earliest-due-first + ahead of all non-deadline entries before the FCFS/LCFS/WSPT policy score applies. + Deadlines are indexed in an ordered due set and a conditional actor timer rejects + expired entries; all deadline math uses `tokio::time::Instant` so paused-clock tests + stay coherent. - `SchedulerQueueActor::admit_one` performs final worker selection and reserves worker capacity after either path. - A single-class profile still uses `PolicyQueue`, but DRR has no cross-class effect. diff --git a/lib/kv-router/src/scheduling/policy_config.rs b/lib/kv-router/src/scheduling/policy_config.rs index 6d65f37a7237..f838c3a7aed9 100644 --- a/lib/kv-router/src/scheduling/policy_config.rs +++ b/lib/kv-router/src/scheduling/policy_config.rs @@ -49,6 +49,15 @@ impl PolicyClassConfig { self.prefill_busy_threshold.is_some() || self.prefill_busy_threshold_frac.is_some() } + /// Any zero per-worker limit means `queue_rejection` rejects every queued + /// entry (`current >= limit` holds at zero usage), so the class can never + /// hold a queued request and must keep the direct admission path. + pub fn never_queues(&self) -> bool { + self.request_queue_limit_per_worker == Some(0) + || self.raw_isl_token_queue_limit_per_worker == Some(0) + || self.cached_token_queue_limit_per_worker == Some(0) + } + pub fn worker_is_busy(&self, active_tokens: usize, max_batched_tokens: u64) -> bool { let absolute_busy = self .prefill_busy_threshold diff --git a/lib/kv-router/src/scheduling/policy_queue.rs b/lib/kv-router/src/scheduling/policy_queue.rs index 1e51dcaae561..18be195428a0 100644 --- a/lib/kv-router/src/scheduling/policy_queue.rs +++ b/lib/kv-router/src/scheduling/policy_queue.rs @@ -4,6 +4,8 @@ use std::cmp::Ordering; use std::collections::{BTreeSet, BinaryHeap}; +use tokio::time::Instant; + use ordered_float::OrderedFloat; use rustc_hash::{FxHashMap, FxHashSet}; use serde::{Deserialize, Serialize}; @@ -35,6 +37,14 @@ impl QueueSnapshot { } } +#[derive(Debug, Clone, Copy)] +pub(crate) struct QueueMetadata { + pub(crate) class_index: usize, + pub(crate) snapshot: QueueSnapshot, + pub(crate) due_at: Option, + pub(crate) arrival_offset_secs: f64, +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum QueueLimitKind { @@ -75,9 +85,18 @@ pub struct PolicyQueueStats { #[derive(Debug, Clone, Copy, PartialEq, Eq)] struct QueuePriority { strict_priority: u32, + due_time_key: u64, policy_score: OrderedFloat, } +const NO_DUE_TIME: u64 = u64::MAX; + +// Within one strict tier, deadline-bearing entries order earliest-due-first +// ahead of every non-deadline entry, before the FCFS/LCFS/WSPT policy score +// applies: a request that must finish by a wall-clock time cannot trade its +// slot for cache affinity, so EDF deliberately preempts the cost-aware score +// (DEP #13891). Entries without a deadline tie at NO_DUE_TIME and fall through +// to the policy score unchanged. #[inline] fn cmp_queue_order( lhs_priority: QueuePriority, @@ -88,15 +107,53 @@ fn cmp_queue_order( lhs_priority .strict_priority .cmp(&rhs_priority.strict_priority) + .then_with(|| rhs_priority.due_time_key.cmp(&lhs_priority.due_time_key)) .then_with(|| lhs_priority.policy_score.cmp(&rhs_priority.policy_score)) .then_with(|| rhs_enqueue_seq.cmp(&lhs_enqueue_seq)) } +// `uncached_tokens` is derived, so drop it from queued entries: with the +// deadline key in `QueuePriority` the header would otherwise cross 64 bytes, +// and the policy_queue drain benchmarks (near-empty payloads, header-bound +// heap sifts) regress 50-150% when an entry spans two cache lines. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct QueueEntrySnapshot { + raw_isl_tokens: usize, + cached_tokens: usize, + scheduling_cost_tokens: usize, +} + +impl From for QueueEntrySnapshot { + fn from(snapshot: QueueSnapshot) -> Self { + Self { + raw_isl_tokens: snapshot.raw_isl_tokens, + cached_tokens: snapshot.cached_tokens, + scheduling_cost_tokens: snapshot.scheduling_cost_tokens, + } + } +} + +impl From for QueueSnapshot { + fn from(snapshot: QueueEntrySnapshot) -> Self { + // `QueueSnapshot::new` clamps cached <= raw and floors the scheduling + // cost; both already held when the entry was built, so this round-trip + // only re-derives the dropped field. + Self { + raw_isl_tokens: snapshot.raw_isl_tokens, + cached_tokens: snapshot.cached_tokens, + uncached_tokens: snapshot + .raw_isl_tokens + .saturating_sub(snapshot.cached_tokens), + scheduling_cost_tokens: snapshot.scheduling_cost_tokens, + } + } +} + pub struct PolicyQueueEntry { class_index: usize, priority: QueuePriority, enqueue_seq: u64, - snapshot: QueueSnapshot, + snapshot: QueueEntrySnapshot, payload: T, } @@ -106,7 +163,11 @@ impl PolicyQueueEntry { } pub fn snapshot(&self) -> QueueSnapshot { - self.snapshot + self.snapshot.into() + } + + fn due_time_key(&self) -> Option { + (self.priority.due_time_key != NO_DUE_TIME).then_some(self.priority.due_time_key) } pub fn payload(&self) -> &T { @@ -132,11 +193,12 @@ impl PartialEq for PolicyQueueEntry { impl Ord for PolicyQueueEntry { fn cmp(&self, other: &Self) -> Ordering { - self.priority - .strict_priority - .cmp(&other.priority.strict_priority) - .then_with(|| self.priority.policy_score.cmp(&other.priority.policy_score)) - .then_with(|| other.enqueue_seq.cmp(&self.enqueue_seq)) + cmp_queue_order( + self.priority, + self.enqueue_seq, + other.priority, + other.enqueue_seq, + ) } } @@ -418,6 +480,8 @@ pub struct PolicyQueue { carry_class: Option, next_enqueue_seq: u64, pending_count: usize, + due_entries: BTreeSet<(u64, u64)>, + deadline_origin: Instant, candidates: Vec>, } @@ -444,6 +508,8 @@ impl PolicyQueue { carry_class: None, next_enqueue_seq: 0, pending_count: 0, + due_entries: BTreeSet::new(), + deadline_origin: Instant::now(), candidates: vec![None; class_count], } } @@ -473,6 +539,11 @@ impl PolicyQueue { }) } + pub(crate) fn next_due_at(&self) -> Option { + let &(due_time_key, _) = self.due_entries.first()?; + Some(self.deadline_origin + std::time::Duration::from_nanos(due_time_key)) + } + pub fn class_count(&self) -> usize { self.classes.len() } @@ -527,6 +598,45 @@ impl PolicyQueue { placement: WorkerPlacement, payload: T, ) -> Result<(), (QueueRejection, T)> { + self.enqueue_with_due_at( + QueueMetadata { + class_index, + snapshot, + due_at: None, + arrival_offset_secs, + }, + worker_count, + priority_jump, + strict_priority, + placement, + payload, + ) + } + + pub(crate) fn enqueue_with_due_at( + &mut self, + metadata: QueueMetadata, + worker_count: usize, + priority_jump: f64, + strict_priority: u32, + placement: WorkerPlacement, + payload: T, + ) -> Result<(), (QueueRejection, T)> { + let QueueMetadata { + class_index, + snapshot, + due_at, + arrival_offset_secs, + } = metadata; + if due_at.is_some() && self.due_entries.is_empty() { + self.deadline_origin = Instant::now(); + } + let due_time_key = due_at.map_or(NO_DUE_TIME, |due_at| { + due_at + .saturating_duration_since(self.deadline_origin) + .as_nanos() + .min((NO_DUE_TIME - 1) as u128) as u64 + }); let class = &mut self.classes[class_index]; if let Some(rejection) = queue_rejection(class, worker_count) { return Err((rejection, payload)); @@ -538,10 +648,15 @@ impl PolicyQueue { arrival_offset_secs, priority_jump, strict_priority, + due_time_key, class.config.queue_policy, self.next_enqueue_seq, payload, ); + if due_time_key != NO_DUE_TIME { + self.due_entries + .insert((due_time_key, self.next_enqueue_seq)); + } self.next_enqueue_seq = self.next_enqueue_seq.wrapping_add(1); add_stats(&mut class.stats, snapshot); class.push_ready(placement, entry); @@ -553,11 +668,54 @@ impl PolicyQueue { &mut self, class_index: usize, mut predicate: impl FnMut(&T) -> bool, + ) -> (Vec>, bool) { + self.take_if_entry_in_class(class_index, |entry| predicate(entry.payload())) + } + + /// Removes and returns every entry whose deadline is at or before `now`. + /// + /// Cost: one full scan of all queued entries plus a heap rebuild of each + /// class that lost an entry, per timer fire. Acceptable while deadlines are + /// rare; once every request carries a due time (the classifier PR), this + /// needs a seq-to-lane index or expiry-on-pop to avoid O(N) per fire under + /// a standing backlog. + pub(crate) fn take_expired(&mut self, now: Instant) -> Vec> { + if self.due_entries.is_empty() { + return Vec::new(); + } + let now_key = now + .saturating_duration_since(self.deadline_origin) + .as_nanos() + .min((NO_DUE_TIME - 1) as u128) as u64; + let expired_sequences: FxHashSet = self + .due_entries + .range(..=(now_key, u64::MAX)) + .map(|(_, enqueue_seq)| *enqueue_seq) + .collect(); + if expired_sequences.is_empty() { + return Vec::new(); + } + let mut expired = Vec::new(); + for class_index in 0..self.classes.len() { + expired.extend( + self.take_if_entry_in_class(class_index, |entry| { + expired_sequences.contains(&entry.enqueue_seq) + }) + .0, + ); + } + expired + } + + fn take_if_entry_in_class( + &mut self, + class_index: usize, + mut predicate: impl FnMut(&PolicyQueueEntry) -> bool, ) -> (Vec>, bool) { let class = &mut self.classes[class_index]; let remove_sequences: FxHashSet = class .entries() - .filter(|entry| predicate(entry.payload())) + .filter(|entry| predicate(entry)) .map(|entry| entry.enqueue_seq) .collect(); if remove_sequences.is_empty() { @@ -600,8 +758,9 @@ impl PolicyQueue { class.rebuild_worker_heads(); for entry in &removed { - subtract_stats(&mut class.stats, entry.snapshot); + subtract_stats(&mut class.stats, entry.snapshot()); self.pending_count -= 1; + remove_due_time(&mut self.due_entries, entry); } if class.ready_is_empty() { class.deficit = 0; @@ -729,8 +888,9 @@ impl PolicyQueue { class.deficit = class .deficit .saturating_sub(entry.snapshot.scheduling_cost_tokens); - subtract_stats(&mut class.stats, entry.snapshot); + subtract_stats(&mut class.stats, entry.snapshot()); self.pending_count -= 1; + remove_due_time(&mut self.due_entries, &entry); if class.ready_is_empty() { class.deficit = 0; } else { @@ -740,6 +900,13 @@ impl PolicyQueue { } } +fn remove_due_time(due_entries: &mut BTreeSet<(u64, u64)>, entry: &PolicyQueueEntry) { + if let Some(due_time_key) = entry.due_time_key() { + let removed = due_entries.remove(&(due_time_key, entry.enqueue_seq)); + debug_assert!(removed); + } +} + #[allow(clippy::too_many_arguments)] fn make_entry( class_index: usize, @@ -747,6 +914,7 @@ fn make_entry( arrival_offset_secs: f64, priority_jump: f64, strict_priority: u32, + due_time_key: u64, queue_policy: RouterQueuePolicy, enqueue_seq: u64, payload: T, @@ -757,10 +925,11 @@ fn make_entry( class_index, priority: QueuePriority { strict_priority, + due_time_key, policy_score: OrderedFloat(policy_score), }, enqueue_seq, - snapshot, + snapshot: snapshot.into(), payload, } } @@ -854,6 +1023,14 @@ policy_classes: ) } + #[test] + fn queue_entry_stays_compact() { + // One cache line per header: the drain benchmarks are header-bound and + // regress heavily past 64 bytes (see QueueEntrySnapshot). + assert!(std::mem::size_of::>() <= 64); + assert!(std::mem::size_of::() <= 48); + } + #[test] fn per_worker_caps_scale_and_remain_pre_add() { let mut queue = PolicyQueue::new(profile( @@ -916,6 +1093,259 @@ policy_classes: assert_eq!(queue.class_stats(0).cached_tokens, 104); } + #[test] + fn earliest_due_request_precedes_fcfs_arrival_within_a_class() { + let mut queue = PolicyQueue::new(admission_profile()); + let now = Instant::now(); + queue + .enqueue_with_due_at( + QueueMetadata { + class_index: 0, + snapshot: QueueSnapshot::new(1, 0), + due_at: Some(now + std::time::Duration::from_secs(20)), + arrival_offset_secs: 0.0, + }, + 1, + 0.0, + 0, + WorkerPlacement::Any, + "later-due", + ) + .unwrap(); + queue + .enqueue_with_due_at( + QueueMetadata { + class_index: 0, + snapshot: QueueSnapshot::new(1, 0), + due_at: Some(now + std::time::Duration::from_secs(10)), + arrival_offset_secs: 1.0, + }, + 1, + 0.0, + 0, + WorkerPlacement::Any, + "earlier-due", + ) + .unwrap(); + + assert_eq!( + queue.next_due_at(), + Some(now + std::time::Duration::from_secs(10)) + ); + assert_eq!( + queue.pop_next(|_, _, _| true).unwrap().into_payload(), + "earlier-due" + ); + assert_eq!(queue.due_entries.len(), 1); + assert_eq!( + queue.next_due_at(), + Some(now + std::time::Duration::from_secs(20)) + ); + assert_eq!( + queue.pop_next(|_, _, _| true).unwrap().into_payload(), + "later-due" + ); + assert!(queue.due_entries.is_empty()); + assert_eq!(queue.next_due_at(), None); + } + + #[test] + fn due_time_order_preserves_sub_millisecond_precision() { + let mut queue = PolicyQueue::new(admission_profile()); + let due_at = Instant::now() + std::time::Duration::from_secs(10); + queue + .enqueue_with_due_at( + QueueMetadata { + class_index: 0, + snapshot: QueueSnapshot::new(1, 0), + due_at: Some(due_at + std::time::Duration::from_nanos(1)), + arrival_offset_secs: 0.0, + }, + 1, + 0.0, + 0, + WorkerPlacement::Exact(WorkerWithDpRank::new(1, 0)), + "later-due-better-fcfs", + ) + .unwrap(); + queue + .enqueue_with_due_at( + QueueMetadata { + class_index: 0, + snapshot: QueueSnapshot::new(1, 0), + due_at: Some(due_at), + arrival_offset_secs: 1.0, + }, + 1, + 0.0, + 0, + WorkerPlacement::Exact(WorkerWithDpRank::new(2, 0)), + "earlier-due-worse-fcfs", + ) + .unwrap(); + + assert_eq!( + queue.pop_next(|_, _, _| true).unwrap().into_payload(), + "earlier-due-worse-fcfs" + ); + } + + #[test] + fn deadline_count_restores_the_no_deadline_fast_path_after_removal() { + let mut queue = PolicyQueue::new(admission_profile()); + let due_at = Instant::now() + std::time::Duration::from_secs(10); + queue + .enqueue( + 0, + 2, + QueueSnapshot::new(1, 0), + 0.0, + 0.0, + 0, + WorkerPlacement::Any, + "no-deadline", + ) + .unwrap(); + queue + .enqueue_with_due_at( + QueueMetadata { + class_index: 0, + snapshot: QueueSnapshot::new(1, 0), + due_at: Some(due_at), + arrival_offset_secs: 1.0, + }, + 2, + 0.0, + 0, + WorkerPlacement::Exact(WorkerWithDpRank::new(1, 0)), + "deadline", + ) + .unwrap(); + + assert_eq!(queue.next_due_at(), Some(due_at)); + queue.retain(|payload| *payload != "deadline"); + assert!(queue.due_entries.is_empty()); + assert_eq!(queue.next_due_at(), None); + assert_eq!(queue.pending_count(), 1); + } + + #[test] + fn deadline_timer_removes_an_expired_blocked_worker_lane() { + let mut queue = PolicyQueue::new(admission_profile()); + let worker = WorkerWithDpRank::new(7, 0); + let due_at = Instant::now() + std::time::Duration::from_secs(1); + queue + .enqueue_with_due_at( + QueueMetadata { + class_index: 0, + snapshot: QueueSnapshot::new(1, 0), + due_at: Some(due_at), + arrival_offset_secs: 0.0, + }, + 1, + 0.0, + 0, + WorkerPlacement::Exact(worker), + "blocked", + ) + .unwrap(); + + assert!(queue.pop_next(|_, _, _| false).is_none()); + assert!(queue.classes[0].blocked_workers.contains(&worker)); + assert_eq!(queue.next_due_at(), Some(due_at)); + + let expired = queue.take_expired(due_at); + assert_eq!(expired.len(), 1); + assert_eq!( + expired.into_iter().next().unwrap().into_payload(), + "blocked" + ); + assert_eq!(queue.next_due_at(), None); + assert!( + queue + .pop_next(|_, _, _| panic!("expired lane revisited")) + .is_none() + ); + } + + #[test] + fn strict_priority_precedes_earlier_due_request_within_a_class() { + let mut queue = PolicyQueue::new(admission_profile()); + let now = Instant::now(); + queue + .enqueue_with_due_at( + QueueMetadata { + class_index: 0, + snapshot: QueueSnapshot::new(1, 0), + due_at: Some(now + std::time::Duration::from_secs(20)), + arrival_offset_secs: 0.0, + }, + 1, + 0.0, + 10, + WorkerPlacement::Any, + "high-priority-later-due", + ) + .unwrap(); + queue + .enqueue_with_due_at( + QueueMetadata { + class_index: 0, + snapshot: QueueSnapshot::new(1, 0), + due_at: Some(now + std::time::Duration::from_secs(10)), + arrival_offset_secs: 1.0, + }, + 1, + 0.0, + 0, + WorkerPlacement::Any, + "low-priority-earlier-due", + ) + .unwrap(); + + assert_eq!( + queue.pop_next(|_, _, _| true).unwrap().into_payload(), + "high-priority-later-due" + ); + } + + #[test] + fn drr_charges_cost_when_the_queue_was_empty() { + let mut queue = PolicyQueue::new(admission_profile()); + let mut snapshot = QueueSnapshot::new(100, 0); + snapshot.scheduling_cost_tokens = 7; + queue + .enqueue( + 0, + 1, + snapshot, + 0.0, + 0.0, + 0, + WorkerPlacement::Any, + "idle-arrival", + ) + .unwrap(); + queue + .enqueue( + 0, + 1, + QueueSnapshot::new(1, 0), + 1.0, + 0.0, + 0, + WorkerPlacement::Any, + "following-arrival", + ) + .unwrap(); + + assert_eq!( + queue.pop_next(|_, _, _| true).unwrap().into_payload(), + "idle-arrival" + ); + assert_eq!(queue.classes[0].deficit, 3); + } + #[test] fn retain_removes_payload_and_rebuilds_queue_accounting() { let mut queue = PolicyQueue::new(profile( diff --git a/lib/kv-router/src/scheduling/queue.rs b/lib/kv-router/src/scheduling/queue.rs index f48840008412..75e27d25e3fa 100644 --- a/lib/kv-router/src/scheduling/queue.rs +++ b/lib/kv-router/src/scheduling/queue.rs @@ -3,7 +3,7 @@ use std::collections::{HashMap, HashSet}; use std::marker::PhantomData; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering as AtomicOrdering}; +use std::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering as AtomicOrdering}; use std::sync::{Arc, OnceLock}; use std::time::Duration; @@ -20,7 +20,7 @@ use super::overlap_refresh::{ NoopOverlapScoresRefresh, OverlapScoresRefresh, read_overlap_refresh_after, refresh_overlap, }; use super::policy_config::{PolicyClassConfig, PolicyProfile}; -use super::policy_queue::{PolicyQueue, QueueSnapshot}; +use super::policy_queue::{PolicyQueue, QueueMetadata, QueueSnapshot}; use super::prefill_load::{PrefillLoadEstimator, effective_prefill_tokens}; use super::queue_admission::WorkerPlacement; use super::selector::{DefaultWorkerSelector, WorkerSelectionInput, WorkerSelector}; @@ -47,6 +47,8 @@ struct ClassQueueCounters { pending_count: AtomicUsize, pending_isl_tokens: AtomicUsize, pending_cached_tokens: AtomicUsize, + received_total: AtomicU64, + rejected_due_time_passed_total: AtomicU64, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -54,6 +56,10 @@ pub struct ClassQueueStats { pub pending_count: usize, pub pending_isl_tokens: usize, pub pending_cached_tokens: usize, + /// Attempts received by the admission actor; includes retries, excludes advisory probes. + pub received_total: u64, + /// Attempts rejected because their due time passed, counted once at rejection. + pub rejected_due_time_passed_total: u64, } struct QueuedRequest { @@ -61,6 +67,7 @@ struct QueuedRequest { attempt_tx: Option>, lifecycle_transfer: Option>, enqueue_at: Instant, + due_at: Option, block_hashes: Option>, } @@ -133,6 +140,7 @@ enum AdmissionCommand { request: SchedulingRequest, attempt_tx: Option>, block_hashes: Option>, + queue_metadata: QueueMetadata, lease: Option>, ack_tx: oneshot::Sender>>, }, @@ -477,13 +485,11 @@ struct SchedulerQueueActor< pending: PolicyQueue, cleanup: Arc, profile: PolicyProfile, - is_queueing_enabled: bool, pending_count: Arc, pending_isl_tokens: Arc, class_counters: Arc>, slots: Arc>, workers_with_configs: watch::Receiver>, - start_time: Instant, block_size: u32, selector: Sel, prefill_load_estimator: Option>, @@ -513,7 +519,11 @@ pub struct SchedulerQueue< /// Incremented after push, decremented after pop. Lock-free reads via `Relaxed` load. pending_isl_tokens: Arc, class_counters: Arc>, + workers_with_configs: watch::Receiver>, + profile: PolicyProfile, + start_time: Instant, queueing_enabled: bool, + available_worker_provider: Option, supports_overlap_refresh: bool, non_max_overlap_selection_observer: Arc>, #[allow(clippy::type_complexity)] @@ -607,30 +617,31 @@ impl< pending_count: AtomicUsize::new(0), pending_isl_tokens: AtomicUsize::new(0), pending_cached_tokens: AtomicUsize::new(0), + received_total: AtomicU64::new(0), + rejected_due_time_passed_total: AtomicU64::new(0), }) .collect(), ); let (admission_tx, admission_rx) = mpsc::channel(admission_channel_capacity); let cleanup = Arc::new(AdmissionCleanup::default()); let non_max_overlap_selection_observer = Arc::new(OnceLock::new()); + let start_time = Instant::now(); let actor = SchedulerQueueActor { pending, cleanup: Arc::clone(&cleanup), - profile, - is_queueing_enabled: queueing_enabled, + profile: profile.clone(), pending_count: Arc::clone(&pending_count), pending_isl_tokens: Arc::clone(&pending_isl_tokens), class_counters: Arc::clone(&class_counters), slots, - workers_with_configs, - start_time: Instant::now(), + workers_with_configs: workers_with_configs.clone(), block_size, selector, prefill_load_estimator, overlap_scores_refresh, overlap_refresh_after, overloaded_worker_provider, - available_worker_provider, + available_worker_provider: available_worker_provider.clone(), non_max_overlap_selection_observer: Arc::clone(&non_max_overlap_selection_observer), }; tokio::spawn(actor.run(admission_rx)); @@ -640,7 +651,11 @@ impl< pending_count, pending_isl_tokens, class_counters, + workers_with_configs, + profile, + start_time, queueing_enabled, + available_worker_provider, supports_overlap_refresh: overlap_refresh_after.is_some(), non_max_overlap_selection_observer, _marker: PhantomData, @@ -667,9 +682,15 @@ impl< .is_ok() } - /// Enqueue a new request. - /// If queueing is disabled or workers have capacity, schedule immediately. - /// Otherwise park in the pending heap. + /// Enqueue a new request through the router-owned policy queue. + /// + /// Every request enters the policy queue and the actor drains the ready + /// backlog in the same turn, so an uncontended request is admitted before + /// the enqueue acknowledgement returns. Two direct-admission carve-outs + /// bypass the queue: classes with any zero per-worker limit (which can + /// never hold a queued entry) and windows with zero discovered workers + /// (so selection reports `NoEndpoints` instead of a scaled-to-zero + /// queue-limit rejection). pub async fn enqueue(&self, request: SchedulingRequest) { self.enqueue_with_block_hashes(request, None).await; } @@ -709,6 +730,8 @@ impl< return None; } + let queue_metadata = self.default_queue_metadata(&request); + let eligibility = request.eligibility(); if let Err(error) = eligibility.validate_pinned_worker_allowed() { @@ -721,6 +744,7 @@ impl< request, attempt_tx, block_hashes: self.prepare_block_hashes_for_refresh(block_hashes), + queue_metadata, lease, ack_tx, }; @@ -742,6 +766,59 @@ impl< } } + /// Enqueue a request with `due_at` for actor-expiry tests. + #[cfg(test)] + pub(crate) async fn enqueue_with_due_at_for_test( + &self, + request: SchedulingRequest, + due_at: Instant, + ) { + let mut queue_metadata = self.default_queue_metadata(&request); + queue_metadata.due_at = Some(due_at); + let (ack_tx, ack_rx) = oneshot::channel(); + let command = AdmissionCommand::Enqueue { + request, + attempt_tx: None, + block_hashes: None, + queue_metadata, + lease: None, + ack_tx, + }; + self.admission_tx + .send(command) + .await + .expect("scheduler queue actor gone"); + let _ = ack_rx.await; + } + + fn default_queue_metadata(&self, request: &SchedulingRequest) -> QueueMetadata { + let available = self + .available_worker_provider + .as_ref() + .and_then(|provider| provider(request)); + let workers = self.workers_with_configs.borrow(); + let snapshot = QueueSnapshot::new( + request.isl_tokens, + SchedulingContext::new(request, &workers) + .with_available_workers(available.as_deref()) + .best_cached_tokens(), + ); + let class_index = self + .profile + .resolve_class_index(request.policy_class.as_deref(), snapshot.uncached_tokens); + QueueMetadata { + class_index, + snapshot, + due_at: None, + // "Arrival" is the moment the caller hands the request to the + // scheduler handle, stamped before the admission channel. Two + // racing callers can therefore enqueue in the opposite order of + // their offsets; `enqueue_seq` stays the authoritative FCFS + // tiebreak for same-score entries. + arrival_offset_secs: self.start_time.elapsed().as_secs_f64(), + } + } + pub(crate) fn new_request_lifecycle_lease( &self, request_id: Option<&str>, @@ -890,6 +967,10 @@ impl< pending_count: counters.pending_count.load(AtomicOrdering::Relaxed), pending_isl_tokens: counters.pending_isl_tokens.load(AtomicOrdering::Relaxed), pending_cached_tokens: counters.pending_cached_tokens.load(AtomicOrdering::Relaxed), + received_total: counters.received_total.load(AtomicOrdering::Relaxed), + rejected_due_time_passed_total: counters + .rejected_due_time_passed_total + .load(AtomicOrdering::Relaxed), }) } @@ -913,7 +994,22 @@ impl< { async fn run(mut self, mut rx: mpsc::Receiver) { let mut commands_since_cleanup = 0usize; - while let Some(command) = rx.recv().await { + loop { + let command = match self.pending.next_due_at() { + Some(due_at) => { + tokio::select! { + command = rx.recv() => command, + _ = tokio::time::sleep_until(due_at) => { + self.handle_update(None).await; + continue; + } + } + } + None => rx.recv().await, + }; + let Some(command) = command else { + break; + }; commands_since_cleanup += 1; let drain_cleanup = rx.is_empty() || commands_since_cleanup == 256; if drain_cleanup { @@ -924,18 +1020,25 @@ impl< request, attempt_tx, block_hashes, + queue_metadata, lease, ack_tx, } => { let lifecycle_transfer = lease .as_ref() .and_then(|lease| lease.transfer.as_ref().map(Arc::clone)); - let enqueue_ready = - self.handle_enqueue(request, attempt_tx, lifecycle_transfer, block_hashes); + let enqueue_ready = self.handle_enqueue( + request, + attempt_tx, + lifecycle_transfer, + block_hashes, + queue_metadata, + ); let cleanup_ready = drain_cleanup && self.drain_cleanup(); - let made_ready = enqueue_ready || cleanup_ready; - if made_ready { + if cleanup_ready { self.handle_update(None).await; + } else if enqueue_ready { + self.handle_enqueued().await; } let _ = ack_tx.send(lease); } @@ -1017,52 +1120,59 @@ impl< fn handle_enqueue( &mut self, - request: SchedulingRequest, + mut request: SchedulingRequest, attempt_tx: Option>, lifecycle_transfer: Option>, block_hashes: Option>, + queue_metadata: QueueMetadata, ) -> bool { + let class_index = queue_metadata.class_index; + self.class_counters[class_index] + .received_total + .fetch_add(1, AtomicOrdering::Relaxed); let decay_now = Instant::now(); - if !self.is_queueing_enabled { - return self.admit_one(request, attempt_tx, lifecycle_transfer, decay_now); - } - let available = self - .available_worker_provider - .as_ref() - .and_then(|provider| provider(&request)); - // Synthetic and explicit selections avoid cache work. Family classification - // samples overlap once and reuses it if the request enters queue storage. - let (class_index, snapshot) = if let Some(class_index) = self - .profile - .direct_class_index(request.policy_class.as_deref()) + if queue_metadata + .due_at + .is_some_and(|due_at| due_at <= decay_now) { - (class_index, None) - } else { - let workers = self.workers_with_configs.borrow(); - let snapshot = Self::snapshot_for_with(&request, &workers, available.as_deref()); - let class_index = self - .profile - .resolve_class_index(request.policy_class.as_deref(), snapshot.uncached_tokens); - (class_index, Some(snapshot)) - }; + self.reject_due_time_passed(class_index, &mut request); + return false; + } + let snapshot = queue_metadata.snapshot; let class = self.profile.class(class_index); - let should_queue = self.should_queue(class_index, class, || { - self.all_workers_prefill_busy( - class, - request - .eligibility() - .with_available_workers(available.as_deref()), - decay_now, - ) - }); - if !should_queue { + // With zero discovered workers every per-worker limit scales to zero and + // `queue_rejection` would reject with `limit: 0`. Admit directly instead + // so selection reports the real condition, `NoEndpoints`. + if self.workers_with_configs.borrow().is_empty() { return self.admit_one(request, attempt_tx, lifecycle_transfer, decay_now); } - - let snapshot = - snapshot.unwrap_or_else(|| self.snapshot_for(&request, available.as_deref())); - tracing::debug!(policy_class = class.name, "queueing request"); - let arrival_offset = self.start_time.elapsed().as_secs_f64(); + // A class with any zero per-worker limit never queues: keep the direct + // admission semantics by admitting while a worker has prefill capacity, + // and otherwise fall through so `queue_rejection` produces the same + // limit-zero rejection the queued path always has. + if class.never_queues() { + let available = self + .available_worker_provider + .as_ref() + .and_then(|provider| provider(&request)); + let should_queue = class.queueing_enabled() + && (self.pending.has_backlog(class_index) || { + let active_tokens = self.slots.active_tokens(decay_now); + let configs = self.workers_with_configs.borrow(); + Self::all_workers_prefill_busy_with( + &active_tokens, + &configs, + class, + request + .eligibility() + .with_available_workers(available.as_deref()), + ) + }); + if !should_queue { + return self.admit_one(request, attempt_tx, lifecycle_transfer, decay_now); + } + } + tracing::trace!(policy_class = class.name, "ordering request"); let priority_jump = request.priority_jump; let strict_priority = request.strict_priority; let placement = request @@ -1073,14 +1183,13 @@ impl< attempt_tx, lifecycle_transfer: lifecycle_transfer.clone(), enqueue_at: decay_now, + due_at: queue_metadata.due_at, block_hashes, }; let worker_count = self.workers_with_configs.borrow().len(); - if let Err((rejection, queued)) = self.pending.enqueue( - class_index, + if let Err((rejection, queued)) = self.pending.enqueue_with_due_at( + queue_metadata, worker_count, - snapshot, - arrival_offset, priority_jump, strict_priority, placement, @@ -1097,38 +1206,23 @@ impl< self.pending_isl_tokens .fetch_add(snapshot.raw_isl_tokens, AtomicOrdering::Relaxed); self.add_class_counters(class_index, snapshot); - false + true } - fn should_queue( - &self, - class_index: usize, - class: &PolicyClassConfig, - all_workers_busy: impl FnOnce() -> bool, - ) -> bool { - // Preserve backlog anti-bypass and lazily avoid worker scans when an - // earlier condition already decides admission. - class.queueing_enabled() && (self.pending.has_backlog(class_index) || all_workers_busy()) - } - - fn snapshot_for( - &self, - request: &SchedulingRequest, - available: Option<&HashSet>, - ) -> QueueSnapshot { - let workers = self.workers_with_configs.borrow(); - Self::snapshot_for_with(request, &workers, available) + fn reject_due_time_passed(&self, class_index: usize, request: &mut SchedulingRequest) { + self.class_counters[class_index] + .rejected_due_time_passed_total + .fetch_add(1, AtomicOrdering::Relaxed); + request.respond(Err(KvSchedulerError::DeadlineExceeded)); } - fn snapshot_for_with( - request: &SchedulingRequest, - workers: &HashMap, - available: Option<&HashSet>, - ) -> QueueSnapshot { - // Cache overlap is sampled once and reused for classification, queue - // limits, ordering, DRR cost, and counters. - let context = SchedulingContext::new(request, workers).with_available_workers(available); - QueueSnapshot::new(request.isl_tokens, context.best_cached_tokens()) + fn reject_expired(&mut self, now: Instant) { + for entry in self.pending.take_expired(now) { + let class_index = entry.class_index(); + self.subtract_pending_counters(class_index, entry.snapshot()); + let mut request = entry.into_payload().request; + self.reject_due_time_passed(class_index, &mut request); + } } fn drain_cleanup(&mut self) -> bool { @@ -1264,6 +1358,7 @@ impl< } async fn handle_update(&mut self, worker: Option) { + self.reject_expired(Instant::now()); if !self.pending.has_ready() { return; } @@ -1276,9 +1371,29 @@ impl< self.pending.recheck_all_workers(); } + self.drain_ready().await; + } + + /// Drain after an enqueue. An arrival adds work but never frees worker + /// capacity, so the blocked-lane recheck is skipped: every capacity change + /// (update, prefill completion, cleanup) arrives with its own recheck, and + /// shared-lane heads are re-evaluated against the dispatch predicate on + /// every pop regardless. + async fn handle_enqueued(&mut self) { + self.reject_expired(Instant::now()); + if !self.pending.has_ready() { + return; + } + self.drain_ready().await; + } + + async fn drain_ready(&mut self) { // Continuation draining stays actor-local; never self-send through the // bounded command channel while processing an update. loop { + if !self.pending.has_ready() { + break; + } let decay_now = Instant::now(); let active_tokens = self.slots.active_tokens(decay_now); let popped = { @@ -1321,6 +1436,7 @@ impl< self.pending_isl_tokens .fetch_sub(snapshot.raw_isl_tokens, AtomicOrdering::Relaxed); self.subtract_class_counters(popped.class_index(), snapshot); + let class_index = popped.class_index(); let queued = popped.payload_mut(); // NOTE: Overlap refresh is expected to be very short. We intentionally // accept load crossing the class threshold during this await: busy @@ -1335,6 +1451,14 @@ impl< decay_now, ) .await; + if queued.due_at.is_some_and(|due_at| due_at <= Instant::now()) { + // The pop already charged this entry's scheduling cost against + // the class deficit; the credit is intentionally not refunded, + // matching every other post-pop terminal outcome. + let mut request = popped.into_payload().request; + self.reject_due_time_passed(class_index, &mut request); + continue; + } let wait_ms = queued.enqueue_at.elapsed().as_millis() as u64; if let Some(snapshot) = refreshed { tracing::info!( @@ -1353,13 +1477,12 @@ impl< let class_index = popped.class_index(); let class = self.profile.class(class_index); let queued = popped.into_payload(); - let request = queued.request; - tracing::debug!( + tracing::trace!( policy_class = class.name, "scheduling request from pending queue" ); self.admit_one( - request, + queued.request, queued.attempt_tx, queued.lifecycle_transfer, admit_now, @@ -1648,23 +1771,6 @@ impl< }) } - /// Check if all eligible workers are prefill-busy based on threshold. - /// When `pinned_worker` is `Some`, only that exact worker/rank is considered. - /// Otherwise when `allowed` is `Some`, only those worker IDs are considered; - /// otherwise all registered workers are checked. - /// Returns false when no eligible workers exist so the request falls - /// through to `schedule`, which returns a proper `NoEndpoints` error. - fn all_workers_prefill_busy( - &self, - class: &PolicyClassConfig, - eligibility: RoutingEligibility<'_>, - decay_now: Instant, - ) -> bool { - let active_tokens = self.slots.active_tokens(decay_now); - let configs = self.workers_with_configs.borrow(); - Self::all_workers_prefill_busy_with(&active_tokens, &configs, class, eligibility) - } - fn all_workers_prefill_busy_with( active_tokens: &HashMap, configs: &HashMap, @@ -2404,6 +2510,218 @@ mod tests { (req, rx) } + #[tokio::test] + async fn expired_deadline_is_rejected_at_enqueue() { + let (queue, _slots) = make_queue(1, 16, 64, Some(0.0)); + let (probe, _probe_rx) = make_request("advisory", 64); + queue.select_without_admission(probe).await.unwrap(); + let (request, response_rx) = make_request("expired-on-arrival", 64); + queue + .enqueue_with_due_at_for_test(request, Instant::now()) + .await; + assert!(matches!( + response_rx.await.unwrap(), + Err(KvSchedulerError::DeadlineExceeded) + )); + assert_eq!(queue.pending_count(), 0); + queue.update().await; + let stats = queue.class_queue_stats(0).unwrap(); + assert_eq!(stats.received_total, 1); + assert_eq!(stats.rejected_due_time_passed_total, 1); + } + + #[tokio::test(start_paused = true)] + async fn parked_request_expires_via_actor_timer() { + let (queue, _slots) = make_queue(1, 16, 64, Some(0.0)); + let (active, active_rx) = make_request("active", 64); + queue.enqueue(active).await; + active_rx.await.unwrap().unwrap(); + + // The worker is busy, so the deadline-bearing request parks; the actor + // timer must fire at due_at and reject it without any further command. + let (parked, parked_rx) = make_request("parked-deadline", 64); + queue + .enqueue_with_due_at_for_test(parked, Instant::now() + Duration::from_secs(5)) + .await; + assert_eq!(queue.pending_count(), 1); + + assert!(matches!( + parked_rx.await.unwrap(), + Err(KvSchedulerError::DeadlineExceeded) + )); + assert_eq!(queue.pending_count(), 0); + queue.update().await; + let stats = queue.class_queue_stats(0).unwrap(); + assert_eq!(stats.received_total, 2); + assert_eq!(stats.rejected_due_time_passed_total, 1); + } + + #[tokio::test(start_paused = true)] + async fn deadline_expiry_during_refresh_is_counted_once() { + let refresher = Arc::new(BlockingRefresher::new(RefreshedOverlap::default())); + let (queue, slots) = make_queue_with_blocking_refresher( + 1, + 16, + 64, + Some(0.0), + Arc::clone(&refresher), + ADMISSION_CHANNEL_CAPACITY, + ); + let (active, active_rx) = make_request("active", 64); + queue.enqueue(active).await; + active_rx.await.unwrap().unwrap(); + + let (request, response_rx) = make_request("expires-during-refresh", 64); + let mut queue_metadata = queue.default_queue_metadata(&request); + queue_metadata.due_at = Some(Instant::now() + Duration::from_secs(30)); + let (ack_tx, ack_rx) = oneshot::channel(); + queue + .admission_tx + .send(AdmissionCommand::Enqueue { + request, + attempt_tx: None, + block_hashes: Some(vec![LocalBlockHash(42)]), + queue_metadata, + lease: None, + ack_tx, + }) + .await + .unwrap(); + ack_rx.await.unwrap(); + slots + .mark_prefill_completed(&"active".to_string(), decay_now()) + .unwrap(); + slots.free(&"active".to_string(), decay_now()).unwrap(); + tokio::time::advance(Duration::from_secs(11)).await; + let updating_queue = Arc::clone(&queue); + let update = tokio::spawn(async move { updating_queue.update().await }); + refresher.wait_for_calls(1).await; + tokio::time::advance(Duration::from_secs(20)).await; + refresher.release_one(); + update.await.unwrap(); + assert!(matches!( + response_rx.await.unwrap(), + Err(KvSchedulerError::DeadlineExceeded) + )); + queue.update().await; + assert_eq!(queue.pending_count(), 0); + let stats = queue.class_queue_stats(0).unwrap(); + assert_eq!(stats.received_total, 2); + assert_eq!(stats.rejected_due_time_passed_total, 1); + } + + #[tokio::test] + async fn zero_class_queue_limit_never_queues() { + let profile = policy_profile( + r#" +default_policy_family: capped +uncached_isl_buckets: + - min_tokens: 0 + bucket: all +policy_classes: + - name: capped + policy_family: capped + cache_bucket: all + quantum: 1 + prefill_busy_threshold: 0 + request_queue_limit_per_worker: 0 +"#, + ); + let (queue, slots) = make_queue_with_profile(1, 16, 64, profile); + + // An idle worker admits a zero-limit request directly, bypassing the + // policy queue. + let (admitted, admitted_rx) = make_request("admitted-idle", 64); + queue.enqueue(admitted).await; + admitted_rx.await.unwrap().unwrap(); + assert_eq!(queue.pending_count(), 0); + + // With every worker busy the request would have to queue, so the zero + // limit rejects it instead of parking it. + let (rejected, rejected_rx) = make_request("rejected-busy", 64); + queue.enqueue(rejected).await; + assert!(matches!( + rejected_rx.await.unwrap(), + Err(KvSchedulerError::QueueRejected(_)) + )); + assert_eq!(queue.pending_count(), 0); + + slots + .mark_prefill_completed(&"admitted-idle".to_string(), decay_now()) + .unwrap(); + slots + .free(&"admitted-idle".to_string(), decay_now()) + .unwrap(); + slots.assert_completely_drained(decay_now()); + } + + #[tokio::test] + async fn zero_token_queue_limit_admits_idle_workers() { + let profile = policy_profile( + r#" +default_policy_family: capped +uncached_isl_buckets: + - min_tokens: 0 + bucket: all +policy_classes: + - name: capped + policy_family: capped + cache_bucket: all + quantum: 1 + prefill_busy_threshold: 0 + raw_isl_token_queue_limit_per_worker: 0 +"#, + ); + let (queue, _slots) = make_queue_with_profile(1, 16, 64, profile); + + // A zero token limit means the class can never hold a queued entry, so + // an idle worker must still admit directly instead of tripping the + // limit-zero rejection. + let (admitted, admitted_rx) = make_request("admitted-idle-token-limit", 64); + queue.enqueue(admitted).await; + admitted_rx.await.unwrap().unwrap(); + assert_eq!(queue.pending_count(), 0); + + let (rejected, rejected_rx) = make_request("rejected-busy-token-limit", 64); + queue.enqueue(rejected).await; + assert!(matches!( + rejected_rx.await.unwrap(), + Err(KvSchedulerError::QueueRejected(_)) + )); + assert_eq!(queue.pending_count(), 0); + } + + #[tokio::test] + async fn zero_workers_report_no_endpoints_not_queue_rejection() { + let profile = policy_profile( + r#" +default_policy_family: capped +uncached_isl_buckets: + - min_tokens: 0 + bucket: all +policy_classes: + - name: capped + policy_family: capped + cache_bucket: all + quantum: 1 + prefill_busy_threshold: 0 + request_queue_limit_per_worker: 4 +"#, + ); + let (queue, _slots) = make_queue_with_profile(0, 16, 64, profile); + + // With zero discovered workers every per-worker limit scales to zero; + // the request must surface the real condition instead of a + // `QueueRejected { limit: 0 }`. + let (request, response_rx) = make_request("no-workers", 64); + queue.enqueue(request).await; + assert!(matches!( + response_rx.await.unwrap(), + Err(KvSchedulerError::NoEndpoints) + )); + assert_eq!(queue.pending_count(), 0); + } + #[test] fn non_max_overlap_selection_ignores_ties_pins_and_ineligible_workers() { let workers = HashMap::from([ @@ -3010,13 +3328,9 @@ policy_classes: queue.enqueue(queued_second).await; assert_eq!( queue.pending_count(), - 2, - "new arrivals must not bypass backlog" + 1, + "enqueue should admit the existing head before the new arrival" ); - assert!(queued_first_rx.try_recv().is_err()); - assert!(queued_second_rx.try_recv().is_err()); - - queue.update().await; queued_first_rx .try_recv() .expect("first queued request should be admitted") @@ -3036,6 +3350,63 @@ policy_classes: queued_second_rx.await.unwrap().unwrap(); } + // No-bypass ordering per DEP #13891: freed capacity goes to the queued + // head, never to the arriving request. + #[tokio::test] + async fn arrival_drains_other_class_backlog_instead_of_bypassing() { + let profile = policy_profile( + r#" +default_policy_family: latency +uncached_isl_buckets: + - min_tokens: 0 + bucket: all +policy_classes: + - name: latency + policy_family: latency + cache_bucket: all + quantum: 1 + prefill_busy_threshold: 1024 + - name: bulk + policy_family: bulk + cache_bucket: all + quantum: 1 + prefill_busy_threshold: 0 +"#, + ); + let (queue, slots) = make_queue_with_profile(1, 16, 64, profile); + + let (mut active, active_rx) = make_request("active", 64); + active.policy_class = Some("latency".to_string()); + queue.enqueue(active).await; + active_rx.await.unwrap().unwrap(); + + // The bulk class sees the worker as busy, so its request parks. + let (mut bulk_head, mut bulk_head_rx) = make_request("bulk-head", 64); + bulk_head.policy_class = Some("bulk".to_string()); + queue.enqueue(bulk_head).await; + assert_eq!(queue.pending_count(), 1); + + // Free the worker without emitting a capacity update; the parked head + // stays queued until something drains. + slots + .mark_prefill_completed(&"active".to_string(), decay_now()) + .unwrap(); + slots.free(&"active".to_string(), decay_now()).unwrap(); + assert_eq!(queue.pending_count(), 1); + + // A latency arrival must not bypass the bulk backlog: its enqueue-turn + // drain admits the parked bulk head alongside the arrival itself. + let (mut arrival, arrival_rx) = make_request("latency-arrival", 64); + arrival.policy_class = Some("latency".to_string()); + queue.enqueue(arrival).await; + assert_eq!(queue.pending_count(), 0); + bulk_head_rx + .try_recv() + .expect("parked bulk head should drain on the arrival's turn") + .expect("bulk head failed"); + arrival_rx.await.unwrap().unwrap(); + } + #[tokio::test(flavor = "multi_thread")] async fn policy_families_and_cache_buckets_select_physical_queues() { let profile = policy_profile( @@ -3111,6 +3482,8 @@ policy_classes: assert_eq!( queue.class_queue_stats(0), Some(ClassQueueStats { + received_total: 1, + rejected_due_time_passed_total: 0, pending_count: 1, pending_isl_tokens: 64, pending_cached_tokens: 64, @@ -3119,6 +3492,8 @@ policy_classes: assert_eq!( queue.class_queue_stats(1), Some(ClassQueueStats { + received_total: 2, + rejected_due_time_passed_total: 0, pending_count: 1, pending_isl_tokens: 64, pending_cached_tokens: 0, @@ -3127,6 +3502,8 @@ policy_classes: assert_eq!( queue.class_queue_stats(2), Some(ClassQueueStats { + received_total: 1, + rejected_due_time_passed_total: 0, pending_count: 1, pending_isl_tokens: 64, pending_cached_tokens: 64, @@ -3135,6 +3512,8 @@ policy_classes: assert_eq!( queue.class_queue_stats(3), Some(ClassQueueStats { + received_total: 1, + rejected_due_time_passed_total: 0, pending_count: 1, pending_isl_tokens: 64, pending_cached_tokens: 0, @@ -3143,6 +3522,8 @@ policy_classes: assert_eq!( queue.class_queue_stats(4), Some(ClassQueueStats { + received_total: 1, + rejected_due_time_passed_total: 0, pending_count: 1, pending_isl_tokens: 64, pending_cached_tokens: 0, @@ -3191,6 +3572,8 @@ policy_classes: assert_eq!( queue.class_queue_stats(0), Some(ClassQueueStats { + received_total: 3, + rejected_due_time_passed_total: 0, pending_count: 1, pending_isl_tokens: 64, pending_cached_tokens: 0, @@ -3221,7 +3604,7 @@ policy_classes: queue.enqueue(active).await; active_rx.await.unwrap().unwrap(); - let (first, _first_rx) = make_request("first", 64); + let (first, mut first_rx) = make_request("first", 64); queue.enqueue(first).await; cfg_tx.send_modify(|configs| { @@ -3235,7 +3618,11 @@ policy_classes: }); let (second, _second_rx) = make_request("second", 64); queue.enqueue(second).await; - assert_eq!(queue.pending_count(), 2); + first_rx + .try_recv() + .expect("new worker capacity should admit the existing head") + .expect("first queued request failed"); + assert_eq!(queue.pending_count(), 1); cfg_tx.send_modify(|configs| { configs.remove(&1); @@ -3246,9 +3633,9 @@ policy_classes: let KvSchedulerError::QueueRejected(rejection) = error else { panic!("expected queue rejection, got {error:?}"); }; - assert_eq!(rejection.current, 2); + assert_eq!(rejection.current, 1); assert_eq!(rejection.limit, 1); - assert_eq!(queue.pending_count(), 2); + assert_eq!(queue.pending_count(), 1); } #[tokio::test(start_paused = true)] @@ -3321,6 +3708,37 @@ policy_classes: )); } + #[tokio::test] + async fn queue_snapshot_excludes_workers_unavailable_to_the_request() { + let provider: WorkerAvailabilityProvider = Arc::new(|request| { + assert_eq!(request.lora_name.as_deref(), Some("adapter")); + Some(Arc::new(HashSet::from([1]))) + }); + let (queue, _slots) = make_queue_with_providers(2, 16, 256, None, Some(provider)); + let (mut request, _response) = make_request("adapter-request", 256); + request.lora_name = Some("adapter".to_string()); + request.overlap.effective_cached_tokens = HashMap::from([ + (WorkerWithDpRank::from_worker_id(0), 224), + (WorkerWithDpRank::from_worker_id(1), 32), + ]); + assert_eq!( + queue + .default_queue_metadata(&request) + .snapshot + .cached_tokens, + 32 + ); + + request.pinned_worker = Some(WorkerWithDpRank::from_worker_id(0)); + assert_eq!( + queue + .default_queue_metadata(&request) + .snapshot + .cached_tokens, + 0 + ); + } + /// A queue starting with zero workers can route after slots and configs arrive. #[tokio::test(flavor = "multi_thread")] async fn test_worker_updates_after_empty_start() { @@ -3449,7 +3867,7 @@ policy_classes: queue.enqueue(active_b).await; active_b_rx.await.unwrap().unwrap(); - let (backlog_head, backlog_head_rx) = make_request("backlog-head", isl); + let (backlog_head, mut backlog_head_rx) = make_request("backlog-head", isl); queue.enqueue(backlog_head).await; assert_eq!(queue.pending_count(), 1); @@ -3463,16 +3881,15 @@ policy_classes: queue.enqueue(allowed).await; assert_eq!( queue.pending_count(), - 2, - "allow-list request must not bypass the existing class backlog" + 1, + "enqueue should dispatch the existing head before the allow-list request" ); assert!(allowed_rx.try_recv().is_err()); - queue.update().await; let backlog_head_worker = backlog_head_rx - .await - .unwrap() - .unwrap() + .try_recv() + .expect("existing backlog head should be admitted") + .expect("backlog head failed") .best_worker .worker_id; assert!(allowed_rx.try_recv().is_err()); @@ -3575,10 +3992,6 @@ policy_classes: let (mut other_worker, mut other_worker_rx) = make_request("pinned-0", 256); other_worker.pinned_worker = Some(WorkerWithDpRank::new(0, 0)); queue.enqueue(other_worker).await; - assert_eq!(queue.pending_count(), 2); - - queue.update().await; - assert_eq!(queue.pending_count(), 1); let other_worker_resp = other_worker_rx .try_recv() diff --git a/lib/kv-router/src/scheduling/types.rs b/lib/kv-router/src/scheduling/types.rs index b967707412e5..57e69bc0a140 100644 --- a/lib/kv-router/src/scheduling/types.rs +++ b/lib/kv-router/src/scheduling/types.rs @@ -116,6 +116,9 @@ pub enum KvSchedulerError { #[error("failed to initialize event publisher: {0}")] InitFailed(String), + #[error("request deadline exceeded")] + DeadlineExceeded, + #[error(transparent)] WorkerSelectionPolicy(#[from] WorkerSelectionPolicyError), } diff --git a/lib/kv-router/src/services/selection/core/run.rs b/lib/kv-router/src/services/selection/core/run.rs index 2df9803a2179..bc8a499f640a 100644 --- a/lib/kv-router/src/services/selection/core/run.rs +++ b/lib/kv-router/src/services/selection/core/run.rs @@ -153,7 +153,7 @@ impl SelectionCore { Ok(self.select_response(selected, endpoint, Some(selection_id))) } - /// The wire shape of a selection; a queue rejection keeps its 503 body. + /// The wire shape of a selection; a queue rejection keeps its structured body. async fn select_or_reject( &self, operation: SelectionOperation<'_>, diff --git a/lib/kv-router/src/services/selection/error.rs b/lib/kv-router/src/services/selection/error.rs index 0cce437cfffa..69cf3a45ef0b 100644 --- a/lib/kv-router/src/services/selection/error.rs +++ b/lib/kv-router/src/services/selection/error.rs @@ -75,9 +75,13 @@ fn scheduler_error_status(error: &KvSchedulerError) -> StatusCode { | KvSchedulerError::SubscriberShutdown | KvSchedulerError::InitFailed(_) => StatusCode::SERVICE_UNAVAILABLE, KvSchedulerError::WorkerSelectionPolicy(_) => StatusCode::INTERNAL_SERVER_ERROR, + // Deadline expiry is deliberately 429, not 504: the deadline elapsed + // while waiting for capacity, so it is backpressure the client should + // respond to like the overloaded family, not a gateway timeout. KvSchedulerError::AllEligibleWorkersOverloaded - | KvSchedulerError::PinnedWorkerOverloaded { .. } => StatusCode::TOO_MANY_REQUESTS, - KvSchedulerError::QueueRejected(_) => StatusCode::SERVICE_UNAVAILABLE, + | KvSchedulerError::PinnedWorkerOverloaded { .. } + | KvSchedulerError::QueueRejected(_) + | KvSchedulerError::DeadlineExceeded => StatusCode::TOO_MANY_REQUESTS, KvSchedulerError::PinnedWorkerNotAllowed { .. } => StatusCode::BAD_REQUEST, KvSchedulerError::BookingFailed(_) => StatusCode::CONFLICT, } @@ -128,5 +132,9 @@ mod tests { SelectionError::Scheduler(KvSchedulerError::AllEligibleWorkersOverloaded).status_code(), StatusCode::TOO_MANY_REQUESTS.as_u16() ); + assert_eq!( + SelectionError::Scheduler(KvSchedulerError::DeadlineExceeded).status_code(), + StatusCode::TOO_MANY_REQUESTS.as_u16() + ); } } diff --git a/lib/kv-router/src/services/selection/tests.rs b/lib/kv-router/src/services/selection/tests.rs index 4fb73b48d772..78b9b62179ac 100644 --- a/lib/kv-router/src/services/selection/tests.rs +++ b/lib/kv-router/src/services/selection/tests.rs @@ -1159,7 +1159,7 @@ policy_classes: Some("latency"), ) .await; - assert_eq!(rejected.status(), StatusCode::SERVICE_UNAVAILABLE); + assert_eq!(rejected.status(), StatusCode::TOO_MANY_REQUESTS); let body = response_json(rejected).await; assert_eq!(body["details"]["policy_class"], "latency"); assert_eq!(body["details"]["limit_kind"], "requests"); diff --git a/lib/llm/src/grpc/service/openai.rs b/lib/llm/src/grpc/service/openai.rs index 303e13ced12a..a219cbe353fa 100644 --- a/lib/llm/src/grpc/service/openai.rs +++ b/lib/llm/src/grpc/service/openai.rs @@ -113,6 +113,15 @@ pub async fn completion_response_stream( // issue the generate call on the engine let stream = engine.generate(request).await.map_err(|e| { + // Deadline is checked before overload so a chain carrying both markers + // keeps the deadline outcome. RESOURCE_EXHAUSTED mirrors the HTTP + // surfaces' 429: the deadline elapsed waiting for capacity, so it is + // backpressure rather than a gateway timeout. No rejection accounting. + if crate::http::service::metrics::request_deadline_exceeded(e.as_ref()) { + return Status::resource_exhausted( + crate::http::service::metrics::REQUEST_DEADLINE_EXCEEDED_MESSAGE, + ); + } if crate::http::service::metrics::request_was_rejected(e.as_ref()) { state.metrics_clone().inc_rejection( &model_name, diff --git a/lib/llm/src/grpc/service/tensor.rs b/lib/llm/src/grpc/service/tensor.rs index a2951c2ffadf..ba6d2b16f571 100644 --- a/lib/llm/src/grpc/service/tensor.rs +++ b/lib/llm/src/grpc/service/tensor.rs @@ -115,6 +115,15 @@ pub async fn tensor_response_stream( // issue the generate call on the engine let stream = engine.generate(request).await.map_err(|e| { + // Deadline is checked before overload so a chain carrying both markers + // keeps the deadline outcome. RESOURCE_EXHAUSTED mirrors the HTTP + // surfaces' 429: the deadline elapsed waiting for capacity, so it is + // backpressure rather than a gateway timeout. No rejection accounting. + if crate::http::service::metrics::request_deadline_exceeded(e.as_ref()) { + return Status::resource_exhausted( + crate::http::service::metrics::REQUEST_DEADLINE_EXCEEDED_MESSAGE, + ); + } if crate::http::service::metrics::request_was_rejected(e.as_ref()) { state .metrics_clone() diff --git a/lib/llm/src/http/service/anthropic.rs b/lib/llm/src/http/service/anthropic.rs index 52e370242e1e..c6229453720d 100644 --- a/lib/llm/src/http/service/anthropic.rs +++ b/lib/llm/src/http/service/anthropic.rs @@ -645,6 +645,19 @@ async fn anthropic_messages( tracing::trace!("Issuing generate call for Anthropic messages"); let engine_stream = engine.generate(request).await.map_err(|e| { + // Deadline is checked before overload so a chain carrying both markers + // keeps the deadline outcome, matching the OpenAI surface: HTTP 429 + // (`rate_limit_error`) with a `Cancelled` metric label and no + // rejection accounting. + if let Some(error) = super::metrics::queue_deadline_error(e.as_ref()) { + super::metrics::record_failure(error); + inflight_guard.mark_error(super::metrics::ErrorType::Cancelled); + return anthropic_error_unrecorded( + StatusCode::TOO_MANY_REQUESTS, + "rate_limit_error", + super::metrics::REQUEST_DEADLINE_EXCEEDED_MESSAGE, + ); + } if super::metrics::request_was_rejected(e.as_ref()) { state .metrics_clone() diff --git a/lib/llm/src/http/service/generate.rs b/lib/llm/src/http/service/generate.rs index 0ee0335149d7..13224c8a86ea 100644 --- a/lib/llm/src/http/service/generate.rs +++ b/lib/llm/src/http/service/generate.rs @@ -188,6 +188,17 @@ fn generate_cancelled_response() -> Response { ) } +/// Caller-supplied deadline elapsed before the engine produced a stream: HTTP +/// 429 with a `Cancelled` metric label, the same contract as the OpenAI and +/// SGLang generate surfaces. +fn generate_deadline_exceeded_response() -> Response { + generate_error_response( + StatusCode::TOO_MANY_REQUESTS, + "deadline_exceeded", + super::metrics::REQUEST_DEADLINE_EXCEEDED_MESSAGE.to_string(), + ) +} + fn generate_unavailable_response() -> Response { generate_error_response( StatusCode::SERVICE_UNAVAILABLE, @@ -1011,17 +1022,23 @@ async fn generate_dispatch( let stream = match generate_result { Ok(stream) => stream, Err(error) => { + // Deadline is checked before overload so a chain carrying both + // markers keeps the deadline outcome, matching the OpenAI surface. + let deadline_exceeded = super::metrics::request_deadline_exceeded(error.as_ref()); let was_cancelled = request_context.is_killed() || super::metrics::request_was_cancelled(error.as_ref()); let was_rejected = super::metrics::request_was_rejected(error.as_ref()); let was_unavailable = super::metrics::request_was_unavailable(error.as_ref()); - inflight_guard.mark_error(if was_cancelled { + inflight_guard.mark_error(if deadline_exceeded || was_cancelled { ErrorType::Cancelled } else if was_rejected || was_unavailable { ErrorType::Unavailable } else { ErrorType::Internal }); + if deadline_exceeded { + return generate_deadline_exceeded_response(); + } if was_cancelled { return generate_cancelled_response(); } @@ -1209,6 +1226,8 @@ pub(crate) mod tests { struct CancelledEngine; + struct DeadlineEngine; + struct MetricEngine; /// Fails dispatch the way an addressed worker that no longer serves the instance does. @@ -1253,6 +1272,26 @@ pub(crate) mod tests { } } + #[async_trait::async_trait] + impl AsyncEngine, ManyOut>, Error> + for DeadlineEngine + { + async fn generate( + &self, + _request: SingleIn, + ) -> Result>, Error> { + Err(dynamo_runtime::error::DynamoError::builder() + .error_type(dynamo_runtime::error::ErrorType::DeadlineExceeded) + .reason( + dynamo_runtime::error::ErrorReason::new("router.queue_deadline_exceeded") + .unwrap(), + ) + .message("router deadline exceeded before stream start") + .build() + .into()) + } + } + #[async_trait::async_trait] impl AsyncEngine, ManyOut>, Error> for WorkerUnavailableEngine @@ -2707,6 +2746,39 @@ pub(crate) mod tests { assert_cancelled_dispatch_metrics(state.as_ref(), 0, 0); } + #[tokio::test] + async fn immediate_deadline_exceeded_returns_429_with_cancelled_metric() { + let engine: crate::types::openai::generate::GenerateStreamingEngine = + Arc::new(DeadlineEngine); + let service = HttpService::builder().build().unwrap(); + let state = service.state_clone(); + + let response = generate_dispatch_for_test( + engine, + dispatch_test_context(), + "req-deadline".to_string(), + "test-model".to_string(), + state.clone(), + GenerateResponseOptions::default(), + ) + .await; + + assert_eq!(response.status(), StatusCode::TOO_MANY_REQUESTS); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + let body: serde_json::Value = serde_json::from_slice(&body).unwrap(); + assert_eq!(body["error"]["message"], "request deadline exceeded"); + assert_eq!(body["error"]["type"], "deadline_exceeded"); + assert_eq!(body["error"]["code"], 429); + assert!( + !body + .to_string() + .contains("router deadline exceeded before stream start") + ); + assert_cancelled_dispatch_metrics(state.as_ref(), 0, 0); + } + #[tokio::test] async fn request_kill_after_first_token_records_partial_metrics() { let started = Arc::new(Notify::new()); diff --git a/lib/llm/src/http/service/metrics.rs b/lib/llm/src/http/service/metrics.rs index 527f8dde6cf2..60bbc93e5eaa 100644 --- a/lib/llm/src/http/service/metrics.rs +++ b/lib/llm/src/http/service/metrics.rs @@ -83,6 +83,30 @@ pub fn request_was_rejected(err: &(dyn std::error::Error + 'static)) -> bool { dynamo_runtime::error::match_error_chain(err, REJECTION, NON_REJECTION) } +/// User-facing body for a request whose caller-supplied deadline elapsed +/// before dispatch; shared by every HTTP surface so the wording stays uniform. +pub(crate) const REQUEST_DEADLINE_EXCEEDED_MESSAGE: &str = "request deadline exceeded"; + +/// Identify a deadline that expired while waiting in the router's queue. +pub fn request_deadline_exceeded(err: &(dyn std::error::Error + 'static)) -> bool { + queue_deadline_error(err).is_some() +} + +pub(super) fn queue_deadline_error<'a>( + err: &'a (dyn std::error::Error + 'static), +) -> Option<&'a DynamoError> { + let mut current = Some(err); + while let Some(error) = current { + if let Some(error) = error.downcast_ref::() + && error.reason().as_str() == "router.queue_deadline_exceeded" + { + return Some(error); + } + current = error.source(); + } + None +} + /// Check whether an error chain indicates that no backend worker is available /// to this request. Both flavors are HTTP 503; they differ only in whether /// migration may retry elsewhere. diff --git a/lib/llm/src/http/service/openai.rs b/lib/llm/src/http/service/openai.rs index 126dd154c4ee..b58ba14e5f1a 100644 --- a/lib/llm/src/http/service/openai.rs +++ b/lib/llm/src/http/service/openai.rs @@ -722,6 +722,21 @@ impl ErrorMessage { ); } + if let Some(error) = super::metrics::queue_deadline_error(err.as_ref()) { + super::metrics::record_failure(error); + let code = StatusCode::TOO_MANY_REQUESTS; + return ( + code, + Json(ErrorMessage { + message: super::metrics::REQUEST_DEADLINE_EXCEEDED_MESSAGE.to_string(), + error_type: map_error_code_to_error_type(code), + code: code.as_u16(), + details: None, + metric_error_type: Some(ErrorType::Cancelled), + }), + ); + } + if super::metrics::request_was_cancelled(err.as_ref()) { return ErrorMessage::sanitized_with_details( SanitizedError::Cancelled, @@ -6808,6 +6823,26 @@ mod tests { } } + #[test] + fn caller_deadline_maps_to_http_429_without_overload_accounting() { + use dynamo_runtime::error::{DynamoError, ErrorType as DynamoErrorType}; + + let error: anyhow::Error = DynamoError::builder() + .error_type(DynamoErrorType::DeadlineExceeded) + .reason( + dynamo_runtime::error::ErrorReason::new("router.queue_deadline_exceeded").unwrap(), + ) + .message("internal deadline detail") + .build() + .into(); + assert!(!super::super::metrics::request_was_rejected(error.as_ref())); + + let response = ErrorMessage::from_anyhow(error, BACKUP_ERROR_MESSAGE); + assert_eq!(response.0, StatusCode::TOO_MANY_REQUESTS); + assert_eq!(response.1.message, "request deadline exceeded"); + assert_eq!(response.1.metric_error_type, Some(ErrorType::Cancelled)); + } + #[test] fn queue_rejection_maps_to_structured_http_529() { use dynamo_kv_router::scheduling::{QueueLimitKind, QueueRejection}; diff --git a/lib/llm/src/http/service/sglang_generate.rs b/lib/llm/src/http/service/sglang_generate.rs index 6ef15aa2e477..a0bdab11d7f3 100644 --- a/lib/llm/src/http/service/sglang_generate.rs +++ b/lib/llm/src/http/service/sglang_generate.rs @@ -104,7 +104,14 @@ fn error_response(code: StatusCode, message: String) -> Response { (code, Json(generate_error(message))).into_response() } fn stream_error(error: &(dyn std::error::Error + 'static)) -> (ErrorType, String) { - let (error_type, message) = if super::metrics::request_was_rejected(error) { + // Deadline is checked before overload so a chain carrying both markers keeps + // the deadline outcome, matching the OpenAI surface. + let (error_type, message) = if super::metrics::request_deadline_exceeded(error) { + ( + ErrorType::Cancelled, + super::metrics::REQUEST_DEADLINE_EXCEEDED_MESSAGE.to_string(), + ) + } else if super::metrics::request_was_rejected(error) { (ErrorType::Overload, SanitizedError::Overloaded.to_string()) } else if super::metrics::request_was_unavailable(error) { ( @@ -174,6 +181,16 @@ fn internal_error_response() -> Response { ) } +/// Caller-supplied deadline elapsed before the engine produced a stream: HTTP +/// 429 with a `Cancelled` metric label, the same contract as the OpenAI +/// surface's `ErrorMessage::from_anyhow` deadline branch. +fn deadline_exceeded_response() -> Response { + error_response( + StatusCode::TOO_MANY_REQUESTS, + super::metrics::REQUEST_DEADLINE_EXCEEDED_MESSAGE.to_string(), + ) +} + fn preprocessed_request( request: SglangGenerateRequest, model: &str, @@ -384,12 +401,13 @@ async fn dispatch( let stream = match generate_result { Ok(stream) => stream, Err(error) => { + let deadline_exceeded = super::metrics::request_deadline_exceeded(error.as_ref()); let was_cancelled = request_context.is_killed() || super::metrics::request_was_cancelled(error.as_ref()); let was_rejected = super::metrics::request_was_rejected(error.as_ref()); let was_unavailable = super::metrics::request_was_unavailable(error.as_ref()); let invalid_argument = find_invalid_argument_in_chain(error.as_ref()); - inflight_guard.mark_error(if was_cancelled { + inflight_guard.mark_error(if deadline_exceeded || was_cancelled { ErrorType::Cancelled } else if was_rejected || was_unavailable { ErrorType::Unavailable @@ -398,6 +416,9 @@ async fn dispatch( } else { ErrorType::Internal }); + if deadline_exceeded { + return deadline_exceeded_response(); + } if was_cancelled { return cancelled_response(); } @@ -569,4 +590,120 @@ mod tests { assert_eq!(body["error"]["message"], expected_message); } } + + #[test] + fn streaming_deadline_wins_over_overload_classification() { + use dynamo_runtime::error::{DynamoError, ErrorType as DynamoErrorType}; + + let error = DynamoError::builder() + .error_type(DynamoErrorType::WorkerOverloaded) + .message("worker overloaded") + .cause( + DynamoError::builder() + .error_type(DynamoErrorType::DeadlineExceeded) + .reason( + dynamo_runtime::error::ErrorReason::new("router.queue_deadline_exceeded") + .unwrap(), + ) + .message("internal deadline detail") + .build(), + ) + .build(); + let (error_type, body) = stream_error(&error); + let body: serde_json::Value = serde_json::from_str(&body).unwrap(); + + assert_eq!(error_type, ErrorType::Cancelled); + assert_eq!(body["error"]["message"], "request deadline exceeded"); + } + + struct DeadlineEngine; + + #[async_trait::async_trait] + impl + dynamo_runtime::engine::AsyncEngine< + dynamo_runtime::pipeline::SingleIn, + dynamo_runtime::pipeline::ManyOut< + crate::protocols::Annotated, + >, + dynamo_runtime::pipeline::Error, + > for DeadlineEngine + { + async fn generate( + &self, + _request: dynamo_runtime::pipeline::SingleIn, + ) -> Result< + dynamo_runtime::pipeline::ManyOut< + crate::protocols::Annotated, + >, + dynamo_runtime::pipeline::Error, + > { + Err(dynamo_runtime::error::DynamoError::builder() + .error_type(dynamo_runtime::error::ErrorType::DeadlineExceeded) + .reason( + dynamo_runtime::error::ErrorReason::new("router.queue_deadline_exceeded") + .unwrap(), + ) + .message("router deadline exceeded before stream start") + .build() + .into()) + } + } + + #[tokio::test] + async fn pre_stream_deadline_maps_to_http_429_with_cancelled_metric() { + use crate::http::service::metrics::{Endpoint, RequestType, Status}; + + let engine: crate::types::openai::generate::GenerateStreamingEngine = + Arc::new(DeadlineEngine); + let service = service_v2::HttpService::builder().build().unwrap(); + let state = service.state_clone(); + let context = Context::new( + PreprocessedRequest::builder() + .model("test-model".to_string()) + .token_ids(vec![1]) + .stop_conditions(Default::default()) + .sampling_options(Default::default()) + .output_options(Default::default()) + .build() + .expect("build dispatch test request"), + ); + let (mut connection_handle, stream_handle) = create_connection_monitor( + context.context(), + None, + CancellationLabels { + model: "test-model".to_string(), + endpoint: Endpoint::Generate.to_string(), + request_type: "streaming".to_string(), + }, + ) + .await; + + let response = dispatch( + engine, + context, + "req-deadline".to_string(), + "test-model".to_string(), + state.clone(), + stream_handle, + ) + .await; + connection_handle.disarm(); + + assert_eq!(response.status(), StatusCode::TOO_MANY_REQUESTS); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + let body: serde_json::Value = serde_json::from_slice(&body).unwrap(); + assert_eq!(body["error"]["message"], "request deadline exceeded"); + assert_eq!( + state.metrics_clone().get_request_counter( + state.manager().metric_model_for("test-model"), + &Endpoint::Generate, + &RequestType::Stream, + &Status::Error, + &ErrorType::Cancelled, + ), + 1 + ); + } } diff --git a/lib/llm/src/kv_router.rs b/lib/llm/src/kv_router.rs index 61a3672cb1d5..ab6f9c373929 100644 --- a/lib/llm/src/kv_router.rs +++ b/lib/llm/src/kv_router.rs @@ -525,6 +525,7 @@ fn map_scheduler_error(error: scheduling::KvSchedulerError) -> anyhow::Error { scheduling::KvSchedulerError::AllEligibleWorkersOverloaded => { (ErrorType::ResourceExhausted, true) } + scheduling::KvSchedulerError::DeadlineExceeded => (ErrorType::DeadlineExceeded, false), scheduling::KvSchedulerError::AllEligibleWorkersFiltered => (ErrorType::Unavailable, false), _ => return error.into(), }; @@ -533,6 +534,14 @@ fn map_scheduler_error(error: scheduling::KvSchedulerError) -> anyhow::Error { let error = DynamoError::builder() .error_type(error_type) .message(message.clone()); + let error = if error_type == ErrorType::DeadlineExceeded { + error.reason( + dynamo_runtime::error::ErrorReason::new("router.queue_deadline_exceeded") + .expect("registered queue deadline reason"), + ) + } else { + error + }; if overloaded { error .cause(PipelineError::ServiceOverloaded(message)) @@ -1950,6 +1959,19 @@ mod tests { assert_eq!(dynamo_error.error_type(), ErrorType::ResourceExhausted); } + #[test] + fn queue_deadline_keeps_its_reason_through_serialization() { + let error = map_scheduler_error(KvSchedulerError::DeadlineExceeded); + let error = error.downcast_ref::().unwrap(); + let decoded: DynamoError = + serde_json::from_value(serde_json::to_value(error).unwrap()).unwrap(); + assert_eq!(decoded.class(), ErrorType::DeadlineExceeded); + assert_eq!(decoded.reason().as_str(), "router.queue_deadline_exceeded"); + assert!(crate::http::service::metrics::request_deadline_exceeded( + &decoded + )); + } + #[test] fn worker_selection_receives_complete_session_context() { use crate::protocols::common::extensions::{AgentContext, InputTrigger}; diff --git a/lib/llm/src/kv_router/embedded.rs b/lib/llm/src/kv_router/embedded.rs index e60b18eb4e19..747e5e587db9 100644 --- a/lib/llm/src/kv_router/embedded.rs +++ b/lib/llm/src/kv_router/embedded.rs @@ -87,15 +87,19 @@ fn record_queue_rejection( } } -fn update_queue_metrics(per_class: &[RouterQueueMetricHandles], scheduler: &SelectionScheduler) { +fn update_queue_metrics( + per_class: &[RouterQueueMetricHandles], + mut stats_for: impl FnMut(usize) -> Option, +) { for (class_index, handles) in per_class.iter().enumerate() { - let Some(stats) = scheduler.class_queue_stats(class_index) else { + let Some(stats) = stats_for(class_index) else { debug_assert!( false, "missing queue counters for policy class {class_index}" ); continue; }; + handles.update_admission(stats.received_total, stats.rejected_due_time_passed_total); handles.pending_requests.set(stats.pending_count as i64); handles .pending_isl_tokens @@ -117,7 +121,9 @@ fn spawn_queue_metrics_updater( let period = Duration::from_secs(60); let mut recheck = tokio::time::interval_at(tokio::time::Instant::now() + period, period); loop { - update_queue_metrics(&handles, partition.scheduler()); + update_queue_metrics(&handles, |index| { + partition.scheduler().class_queue_stats(index) + }); tokio::select! { _ = cancellation_token.cancelled() => break, changed = queue_updates.changed() => { @@ -376,7 +382,9 @@ impl EmbeddedSelection { if let Some(rejection) = rejection { record_queue_rejection(&self.queue_metrics, &self.queue_metric_indices, rejection); } - update_queue_metrics(&self.queue_metrics, self.partition.scheduler()); + update_queue_metrics(&self.queue_metrics, |index| { + self.partition.scheduler().class_queue_stats(index) + }); } pub(crate) fn affinity_coordinator( @@ -569,6 +577,47 @@ mod tests { use super::*; use dynamo_kv_router::services::selection::SchedulerLoadSink; + #[test] + fn queue_metrics_are_updated_by_class_index() { + let handles = ["latency", "bulk"] + .map(|class| ROUTER_QUEUE_METRICS.handles("index-test", "decode", class)); + let stats = [ + dynamo_kv_router::queue::ClassQueueStats { + received_total: 10, + rejected_due_time_passed_total: 1, + pending_count: 2, + pending_isl_tokens: 128, + pending_cached_tokens: 64, + }, + dynamo_kv_router::queue::ClassQueueStats { + received_total: 20, + rejected_due_time_passed_total: 3, + pending_count: 3, + pending_isl_tokens: 384, + pending_cached_tokens: 192, + }, + ]; + + update_queue_metrics(&handles, |index| stats.get(index).copied()); + update_queue_metrics(&handles, |index| stats.get(index).copied()); + for (handles, stats) in handles.iter().zip(stats) { + assert_eq!(handles.received_total.get(), stats.received_total); + assert_eq!( + handles.rejected_due_time_passed_total.get(), + stats.rejected_due_time_passed_total + ); + assert_eq!(handles.pending_requests.get(), stats.pending_count as i64); + assert_eq!( + handles.pending_isl_tokens.get(), + stats.pending_isl_tokens as i64 + ); + assert_eq!( + handles.pending_cached_tokens.get(), + stats.pending_cached_tokens as i64 + ); + } + } + #[test] fn worker_request_mirrors_runtime_config() { let mut config = ModelRuntimeConfig { diff --git a/lib/llm/src/kv_router/metrics.rs b/lib/llm/src/kv_router/metrics.rs index 02c584de6c62..1ab197f68b23 100644 --- a/lib/llm/src/kv_router/metrics.rs +++ b/lib/llm/src/kv_router/metrics.rs @@ -681,17 +681,17 @@ pub fn register_worker_load_metrics( } // --------------------------------------------------------------------------- -// Router queue metrics (gauge) +// Router queue and admission metrics // --------------------------------------------------------------------------- -/// Gauge tracking the number of requests pending in the router's scheduler queue. -/// Labeled by `worker_type` ("prefill" or "decode") to distinguish queues in -/// disaggregated mode. At most 2 label combinations. +/// Queue gauges and cumulative admission counters by model, worker type, and policy class. pub struct RouterQueueMetrics { pub pending_requests: IntGaugeVec, pub pending_isl_tokens: IntGaugeVec, pub pending_cached_tokens: IntGaugeVec, pub backpressure_total: IntCounterVec, + pub received_total: IntCounterVec, + pub deadline_rejections_total: IntCounterVec, } #[derive(Clone)] @@ -702,10 +702,15 @@ pub struct RouterQueueMetricHandles { pub request_limit_rejections: IntCounter, pub raw_isl_limit_rejections: IntCounter, pub cached_token_limit_rejections: IntCounter, + pub received_total: IntCounter, + pub rejected_due_time_passed_total: IntCounter, + // Shared by clones for one scheduler; separate schedulers may share Prometheus labels. + reported_received: Arc, + reported_due_time_passed: Arc, } -pub static ROUTER_QUEUE_METRICS: LazyLock = - LazyLock::new(|| RouterQueueMetrics { +pub static ROUTER_QUEUE_METRICS: LazyLock = LazyLock::new(|| { + RouterQueueMetrics { pending_requests: IntGaugeVec::new( Opts::new( format!( @@ -737,6 +742,20 @@ pub static ROUTER_QUEUE_METRICS: LazyLock = &[labels::MODEL, labels::WORKER_TYPE, "policy_class"], ) .expect("Failed to create router_queue_pending_cached_tokens gauge"), + received_total: IntCounterVec::new( + Opts::new( + format!("{}_router_admission_received_total", name_prefix::FRONTEND), + "Total attempts received by router admission; includes retries and excludes advisory probes", + ), + &[labels::MODEL, labels::WORKER_TYPE, "policy_class"], + ).expect("valid router admission received metric"), + deadline_rejections_total: IntCounterVec::new( + Opts::new( + format!("{}_router_admission_rejected_total", name_prefix::FRONTEND), + "Total router admission rejections by deadline reason", + ), + &[labels::MODEL, labels::WORKER_TYPE, "policy_class", "reason"], + ).expect("valid router admission rejection metric"), backpressure_total: IntCounterVec::new( Opts::new( format!("{}_router_queue_backpressure_total", name_prefix::FRONTEND), @@ -745,7 +764,8 @@ pub static ROUTER_QUEUE_METRICS: LazyLock = &[labels::MODEL, labels::WORKER_TYPE, "policy_class", "reason"], ) .expect("Failed to create router_queue_backpressure_total counter"), - }); + } +}); impl RouterQueueMetrics { pub fn handles( @@ -759,6 +779,13 @@ impl RouterQueueMetrics { self.backpressure_total .with_label_values(&[model, worker_type, policy_class, reason]) }; + // Reserved by DEP #13891; no predicted-miss admission policy exists yet. + self.deadline_rejections_total.with_label_values(&[ + model, + worker_type, + policy_class, + "predicted_miss", + ]); RouterQueueMetricHandles { pending_requests: self.pending_requests.with_label_values(&queue_labels), pending_isl_tokens: self.pending_isl_tokens.with_label_values(&queue_labels), @@ -766,11 +793,37 @@ impl RouterQueueMetrics { request_limit_rejections: rejection("request_limit"), raw_isl_limit_rejections: rejection("raw_isl_token_limit"), cached_token_limit_rejections: rejection("cached_token_limit"), + received_total: self.received_total.with_label_values(&queue_labels), + rejected_due_time_passed_total: self.deadline_rejections_total.with_label_values(&[ + model, + worker_type, + policy_class, + "due_time_passed", + ]), + reported_received: Arc::default(), + reported_due_time_passed: Arc::default(), } } } -/// Register the router queue gauge with the given Prometheus registry. +impl RouterQueueMetricHandles { + /// Export only unseen increments, including when concurrent updates carry older snapshots. + pub(super) fn update_admission(&self, received: u64, due_time_passed: u64) { + use std::sync::atomic::Ordering; + let previous = self + .reported_received + .fetch_max(received, Ordering::Relaxed); + self.received_total + .inc_by(received.saturating_sub(previous)); + let previous = self + .reported_due_time_passed + .fetch_max(due_time_passed, Ordering::Relaxed); + self.rejected_due_time_passed_total + .inc_by(due_time_passed.saturating_sub(previous)); + } +} + +/// Register router queue gauges and admission counters with the Prometheus registry. /// Called during frontend HTTP service setup (`service_v2.rs`), served on port 8000. pub fn register_router_queue_metrics( registry: &prometheus::Registry, @@ -780,6 +833,8 @@ pub fn register_router_queue_metrics( registry.register(Box::new(m.pending_isl_tokens.clone()))?; registry.register(Box::new(m.pending_cached_tokens.clone()))?; registry.register(Box::new(m.backpressure_total.clone()))?; + registry.register(Box::new(m.received_total.clone()))?; + registry.register(Box::new(m.deadline_rejections_total.clone()))?; Ok(()) } @@ -1553,7 +1608,21 @@ dynamo_frontend_worker_active_prefill_tokens{dp_rank=\"0\",worker_id=\"123\",wor &[labels::MODEL, labels::WORKER_TYPE, "policy_class"], ) .unwrap(), - backpressure_total: IntCounterVec::new( + received_total: IntCounterVec::new( + Opts::new( + format!("{}_router_admission_received_total", name_prefix::FRONTEND), + "Total attempts received by router admission; includes retries and excludes advisory probes", + ), + &[labels::MODEL, labels::WORKER_TYPE, "policy_class"], + ).expect("valid router admission received metric"), + deadline_rejections_total: IntCounterVec::new( + Opts::new( + format!("{}_router_admission_rejected_total", name_prefix::FRONTEND), + "Total router admission rejections by deadline reason", + ), + &[labels::MODEL, labels::WORKER_TYPE, "policy_class", "reason"], + ).expect("valid router admission rejection metric"), + backpressure_total: IntCounterVec::new( Opts::new( format!("{}_router_queue_backpressure_total", name_prefix::FRONTEND), "Total number of router scheduler queue backpressure rejections", @@ -1575,13 +1644,33 @@ dynamo_frontend_worker_active_prefill_tokens{dp_rank=\"0\",worker_id=\"123\",wor .register(Box::new(metrics.backpressure_total.clone())) .unwrap(); + registry + .register(Box::new(metrics.received_total.clone())) + .unwrap(); + registry + .register(Box::new(metrics.deadline_rejections_total.clone())) + .unwrap(); let handles = metrics.handles("model", "decode", "default"); + handles.update_admission(10, 1); + handles.clone().update_admission(10, 1); + handles.update_admission(9, 0); + // A replacement scheduler with the same labels adds its own counts. + metrics + .handles("model", "decode", "default") + .update_admission(2, 1); handles.pending_requests.set(5); handles.pending_isl_tokens.set(1024); handles.pending_cached_tokens.set(512); let output = gather_pef(®istry); let expected = "\ +# HELP dynamo_frontend_router_admission_received_total Total attempts received by router admission; includes retries and excludes advisory probes +# TYPE dynamo_frontend_router_admission_received_total counter +dynamo_frontend_router_admission_received_total{model=\"model\",policy_class=\"default\",worker_type=\"decode\"} 12 +# HELP dynamo_frontend_router_admission_rejected_total Total router admission rejections by deadline reason +# TYPE dynamo_frontend_router_admission_rejected_total counter +dynamo_frontend_router_admission_rejected_total{model=\"model\",policy_class=\"default\",reason=\"due_time_passed\",worker_type=\"decode\"} 2 +dynamo_frontend_router_admission_rejected_total{model=\"model\",policy_class=\"default\",reason=\"predicted_miss\",worker_type=\"decode\"} 0 # HELP dynamo_frontend_router_queue_backpressure_total Total number of router scheduler queue backpressure rejections # TYPE dynamo_frontend_router_queue_backpressure_total counter dynamo_frontend_router_queue_backpressure_total{model=\"model\",policy_class=\"default\",reason=\"cached_token_limit\",worker_type=\"decode\"} 0 diff --git a/lib/llm/tests/common/http_harness.rs b/lib/llm/tests/common/http_harness.rs index 0c41f4d4bf58..c9253def453b 100644 --- a/lib/llm/tests/common/http_harness.rs +++ b/lib/llm/tests/common/http_harness.rs @@ -62,6 +62,11 @@ impl HarnessService { .await } + #[allow(dead_code)] + pub async fn start_with_generate_error(error: DynamoError) -> Self { + Self::start_with_engine(Arc::new(ScriptedChatEngine::with_generate_error(error))).await + } + pub async fn start_with_engine(engine: Arc) -> Self { let client = reqwest::Client::builder() .no_proxy() diff --git a/lib/llm/tests/common/scripted_chat_engine.rs b/lib/llm/tests/common/scripted_chat_engine.rs index 68427fa64816..8f05ecab30d2 100644 --- a/lib/llm/tests/common/scripted_chat_engine.rs +++ b/lib/llm/tests/common/scripted_chat_engine.rs @@ -35,6 +35,10 @@ enum QueuedScript { chunks: Script, error: DynamoError, }, + /// `generate()` itself fails before any stream exists, the shape of a + /// router-side rejection (overload, deadline) rather than a backend fault. + #[allow(dead_code)] + GenerateError(DynamoError), Gated { chunks: Script, split_at: usize, @@ -122,6 +126,14 @@ impl ScriptedChatEngine { } } + #[allow(dead_code)] + pub fn with_generate_error(error: DynamoError) -> Self { + Self { + scripts: Mutex::new(VecDeque::from([QueuedScript::GenerateError(error)])), + ..Self::new([]) + } + } + /// Remove and return all requests observed so far, in arrival order. pub async fn take_requests(&self) -> Vec { std::mem::take(&mut *self.requests.lock().await) @@ -165,6 +177,10 @@ impl script => script, }; + if let QueuedScript::GenerateError(error) = script { + return Err(error.into()); + } + let producer_ctx = ctx.clone(); let output = async_stream::stream! { match script { @@ -222,6 +238,9 @@ impl yield chunk; } } + QueuedScript::GenerateError(_) => { + unreachable!("GenerateError returns before the stream is built") + } } }; Ok(ResponseStream::new(Box::pin(output), ctx)) diff --git a/lib/llm/tests/frontend_protocol_validation_http.rs b/lib/llm/tests/frontend_protocol_validation_http.rs index 920a3df072f0..d3c7e43715b2 100644 --- a/lib/llm/tests/frontend_protocol_validation_http.rs +++ b/lib/llm/tests/frontend_protocol_validation_http.rs @@ -58,6 +58,7 @@ enum ExpectedError { Validation, NotImplemented, UnsupportedContent, + DeadlineExceeded, } impl ExpectedError { @@ -66,6 +67,7 @@ impl ExpectedError { Self::Validation => reqwest::StatusCode::BAD_REQUEST, Self::NotImplemented => reqwest::StatusCode::NOT_IMPLEMENTED, Self::UnsupportedContent => reqwest::StatusCode::BAD_REQUEST, + Self::DeadlineExceeded => reqwest::StatusCode::TOO_MANY_REQUESTS, } } @@ -74,6 +76,7 @@ impl ExpectedError { Self::Validation => "invalid_request_error", Self::NotImplemented => "api_error", Self::UnsupportedContent => "invalid_request_error", + Self::DeadlineExceeded => "rate_limit_error", } } } @@ -203,6 +206,54 @@ fn assert_error_metrics_for_model( } } +/// A router deadline rejection reaches the Anthropic surface as HTTP 429 +/// `rate_limit_error` with the `Cancelled` metric label, the same contract as +/// the OpenAI surface, rather than falling through to a 500 `api_error`. +#[tokio::test] +#[serial] +async fn anthropic_deadline_exceeded_maps_to_rate_limit_error_with_cancelled_metric() { + temp_env::async_with_vars(BASE_ENV, async { + let error = DynamoError::builder() + .error_type(DynamoErrorType::DeadlineExceeded) + .reason( + dynamo_runtime::error::ErrorReason::new("router.queue_deadline_exceeded").unwrap(), + ) + .message("internal deadline detail") + .build(); + let svc = HarnessService::start_with_generate_error(error).await; + + let response = post_json( + &svc, + "/v1/messages", + json!({ + "model": MODEL, + "max_tokens": 16, + "messages": [{"role": "user", "content": "ping"}] + }), + ) + .await; + + assert_anthropic_error( + response, + ExpectedError::DeadlineExceeded, + "request deadline exceeded", + ) + .await; + assert_error_metrics( + &svc, + &Endpoint::AnthropicMessages, + &RequestType::Unary, + &[ + (ErrorType::Cancelled, 1), + (ErrorType::Overload, 0), + (ErrorType::Internal, 0), + ], + ); + svc.shutdown().await; + }) + .await; +} + fn tool_name_requests(name: &str) -> [(&'static str, Value, bool); 3] { [ ( diff --git a/lib/runtime/src/error.rs b/lib/runtime/src/error.rs index 11fc0ee4d362..c8fcc7f7314f 100644 --- a/lib/runtime/src/error.rs +++ b/lib/runtime/src/error.rs @@ -418,7 +418,8 @@ impl ErrorReason { "transport.connection_timeout" | "backend.response_timeout" | "backend.connection_timeout" - | "request.deadline_exceeded" => Some(ErrorClass::DeadlineExceeded), + | "request.deadline_exceeded" + | "router.queue_deadline_exceeded" => Some(ErrorClass::DeadlineExceeded), "request.cancelled" | "backend.cancelled" => Some(ErrorClass::Cancelled), "capacity.pool_exhausted" | "capacity.worker_overloaded" | "capacity.exhausted" => { Some(ErrorClass::CapacityExhausted) @@ -1563,6 +1564,7 @@ mod tests { ); assert_eq!(ErrorClass::ResponseTimeout.to_string(), "ResponseTimeout"); assert_eq!(ErrorClass::Cancelled.to_string(), "Cancelled"); + assert_eq!(ErrorClass::DeadlineExceeded.to_string(), "DeadlineExceeded"); assert_eq!( ErrorClass::ResourceExhausted.to_string(), "ResourceExhausted" diff --git a/lib/runtime/src/pipeline/network/egress/route_span.rs b/lib/runtime/src/pipeline/network/egress/route_span.rs index bef69fa506ca..653aa93d5e83 100644 --- a/lib/runtime/src/pipeline/network/egress/route_span.rs +++ b/lib/runtime/src/pipeline/network/egress/route_span.rs @@ -251,7 +251,11 @@ fn error_outcome(error_type: ErrorType) -> &'static str { } ErrorType::ResourceExhausted | ErrorType::WorkerOverloaded => "rejected", ErrorType::Unavailable | ErrorType::WorkerUnavailable => "unavailable", - ErrorType::Cancelled | ErrorType::Backend(BackendError::Cancelled) => "cancelled", + // Deadline expiry matches the HTTP metric classification, which labels + // deadline-exceeded 429 responses as `cancelled`. + ErrorType::DeadlineExceeded + | ErrorType::Cancelled + | ErrorType::Backend(BackendError::Cancelled) => "cancelled", ErrorType::Unknown | ErrorType::Backend(BackendError::Unknown) => "error", ErrorType::InvalidRequest | ErrorType::Unauthenticated @@ -262,7 +266,6 @@ fn error_outcome(error_type: ErrorType) -> &'static str { | ErrorType::UnsupportedMedia | ErrorType::RateLimited | ErrorType::CapacityExhausted => "rejected", - ErrorType::DeadlineExceeded => "timeout", ErrorType::BackendProtocol | ErrorType::NotImplemented | ErrorType::Internal => "error", } } @@ -538,6 +541,15 @@ mod tests { captured.fields.lock().unwrap().get(name).cloned() } + #[test] + fn deadline_exceeded_is_a_cancelled_route_outcome() { + assert_eq!( + error_type_name(ErrorType::DeadlineExceeded), + "deadline_exceeded" + ); + assert_eq!(error_outcome(ErrorType::DeadlineExceeded), "cancelled"); + } + #[tokio::test] async fn route_span_covers_attempt_lifecycle_and_retry_metadata() { let captured = Arc::new(Captured::default()); From b0785175ee31135f1be35edb2ec4ac83dc4eb262 Mon Sep 17 00:00:00 2001 From: Ryan McCormick Date: Fri, 18 Sep 2026 16:02:22 -0700 Subject: [PATCH 118/191] docs: fix community calendar invite link (#15070) Signed-off-by: Ryan McCormick --- docs/fern/components/CommunityLanding.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fern/components/CommunityLanding.tsx b/docs/fern/components/CommunityLanding.tsx index 46bbac5d53b7..128fc837bb2f 100644 --- a/docs/fern/components/CommunityLanding.tsx +++ b/docs/fern/components/CommunityLanding.tsx @@ -24,7 +24,7 @@ const MEETING_URL = "https://meet.google.com/heb-demu-qok"; const NOTES_URL = "https://docs.google.com/document/d/1uR8xD_hlYGwV6QspvSc36k1H-wo1BUcVmFbHH9xlXd8/view"; const INVITE_URL = - "https://github.com/ai-dynamo/dynamo/blob/main/docs/assets/dynamo-community-meeting.ics"; + "https://github.com/ai-dynamo/dynamo/blob/main/docs/fern/assets/dynamo-community-meeting.ics"; const MONTHS = [ "January", From 65fcc02b126ee1b1071f34c18a01b2b4c19629d5 Mon Sep 17 00:00:00 2001 From: ishandhanani <82981111+ishandhanani@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:01:15 -0700 Subject: [PATCH 119/191] feat(router): add request classifier seam (#14177) Signed-off-by: Ishan Dhanani --- Cargo.lock | 1 + lib/bindings/kvbm/Cargo.lock | 1 + lib/bindings/python/Cargo.lock | 1 + lib/kv-router/Cargo.toml | 1 + lib/kv-router/src/scheduling/local.rs | 222 ++- lib/kv-router/src/scheduling/mod.rs | 5 + lib/kv-router/src/scheduling/policy_config.rs | 30 + lib/kv-router/src/scheduling/queue.rs | 329 +++- .../src/scheduling/request_classifier.rs | 1487 +++++++++++++++++ lib/kv-router/src/scheduling/types.rs | 15 + lib/kv-router/src/services/selection/error.rs | 59 +- 11 files changed, 2132 insertions(+), 19 deletions(-) create mode 100644 lib/kv-router/src/scheduling/request_classifier.rs diff --git a/Cargo.lock b/Cargo.lock index 6fa6419ef5b9..de42eda60c5b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2629,6 +2629,7 @@ dependencies = [ "dynamo-truthy", "fastrand", "flume 0.12.0", + "futures-util", "indexmap 2.14.0", "once_cell", "ordered-float 4.6.0", diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index ddebffea0197..eee0b73ed25a 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -2097,6 +2097,7 @@ dependencies = [ "dynamo-truthy", "fastrand", "flume", + "futures-util", "indexmap 2.14.0", "once_cell", "ordered-float 4.6.0", diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index 81565753d293..54ee7cebaf90 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -2152,6 +2152,7 @@ dependencies = [ "dynamo-truthy", "fastrand", "flume", + "futures-util", "indexmap 2.14.0", "once_cell", "ordered-float 4.6.0", diff --git a/lib/kv-router/Cargo.toml b/lib/kv-router/Cargo.toml index a778cc5ce945..2045158ecf18 100644 --- a/lib/kv-router/Cargo.toml +++ b/lib/kv-router/Cargo.toml @@ -42,6 +42,7 @@ ordered-float = { workspace = true } once_cell = { version = "1", optional = true } derive_builder = { workspace = true } fastrand = "2" +futures-util = { workspace = true } prometheus = { workspace = true, optional = true } seqlock = { workspace = true } serde = { workspace = true } diff --git a/lib/kv-router/src/scheduling/local.rs b/lib/kv-router/src/scheduling/local.rs index 4cb363064621..2fa8a63c40e0 100644 --- a/lib/kv-router/src/scheduling/local.rs +++ b/lib/kv-router/src/scheduling/local.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use std::collections::{HashMap, HashSet}; -use std::sync::Arc; +use std::sync::{Arc, OnceLock}; use std::time::Duration; use rustc_hash::FxHashMap; @@ -20,6 +20,9 @@ use super::queue::{ BookingHandle, ClassQueueStats, SchedulerBookingCleanup, SchedulerBookingDescriptor, SchedulerQueue, }; +use super::request_classifier::{ + ClassifyRequest, RequestClassifier, RequestClassifierRuntime, RequestLifecycle, +}; use super::selector::{DefaultWorkerSelector, WorkerSelector}; use super::types::{ AdmissionAttempt, AdmittedSchedulingResponse, AdvisorySchedulingResponse, AttemptId, @@ -53,6 +56,7 @@ where slots: Arc>, queue: Arc>, queue_updates: watch::Sender<()>, + request_classifier: OnceLock>, track_prefill_tokens_default: bool, worker_type: &'static str, } @@ -271,6 +275,7 @@ where slots, queue, queue_updates, + request_classifier: OnceLock::new(), track_prefill_tokens_default, worker_type, } @@ -291,7 +296,20 @@ where &self, request: ScheduleRequest, ) -> Result { - let (admitted, booking) = self.schedule_request_with_booking(request).await?; + self.schedule_request_admitted_with_context(request, Instant::now()) + .await + } + + /// Schedule with the router's original ingress timing. + #[doc(hidden)] + pub async fn schedule_request_admitted_with_context( + &self, + request: ScheduleRequest, + ingress_at: Instant, + ) -> Result { + let (admitted, booking) = self + .schedule_request_with_booking_and_context(request, ingress_at) + .await?; if let Some(booking) = booking { let _ = booking.commit(); } @@ -305,13 +323,26 @@ where &self, request: ScheduleRequest, ) -> Result<(AdmittedSchedulingResponse, Option), KvSchedulerError> { - let tracked = request.mode.is_tracked(); + self.schedule_request_with_booking_and_context(request, Instant::now()) + .await + } + + /// Classify before acquiring a booking lease, preserving the caller's + /// ingress timestamp across the classifier's await and returning the + /// booking armed for its host. + pub(crate) async fn schedule_request_with_booking_and_context( + &self, + request: ScheduleRequest, + ingress_at: Instant, + ) -> Result<(AdmittedSchedulingResponse, Option), KvSchedulerError> { let (resp_tx, resp_rx) = tokio::sync::oneshot::channel(); let (attempt_tx, attempt_rx) = tokio::sync::oneshot::channel(); + let (request, block_hashes) = self.make_scheduling_request(request, Some(resp_tx)); + let tracked = request.mode.is_tracked(); + let classified_request = self.classify_request(&request, ingress_at).await?; let lifecycle_lease = self .queue .new_request_lifecycle_lease(request.mode.lifecycle_request_id()); - let (request, block_hashes) = self.make_scheduling_request(request, Some(resp_tx)); let lifecycle_lease = self .queue @@ -320,6 +351,8 @@ where block_hashes, lifecycle_lease, tracked.then_some(attempt_tx), + classified_request, + ingress_at, ) .await; @@ -343,6 +376,56 @@ where Ok((AdmittedSchedulingResponse { response, attempt }, booking)) } + async fn classify_request( + &self, + request: &SchedulingRequest, + ingress_at: Instant, + ) -> Result, KvSchedulerError> { + let Some(classifier) = self.request_classifier.get() else { + return Ok(None); + }; + let Some(request_id) = request.mode.tracked_request_id() else { + return Ok(None); + }; + // A tracked admission with no registered lifecycle (Python bindings + // `best_worker`, `RouterRequest::New`) never emits lifecycle events, so + // classifying it would corrupt plugin bookkeeping. It uses the default + // queue inputs, exactly as if no classifier were installed. + if !classifier.has_request(request_id) { + return Ok(None); + } + classifier + .classify_with(self.queue.build_classify_request(request, ingress_at)) + .await + .map(Some) + } + + /// Install the request classifier plugin. Must be called from within a + /// Tokio runtime: it spawns the classifier's event-delivery task. + /// + /// Returns `false` when a classifier is already installed. + #[doc(hidden)] + pub fn install_request_classifier( + &self, + classifier: Box, + shutdown: CancellationToken, + ) -> bool { + self.request_classifier + .set(RequestClassifierRuntime::new(classifier, shutdown)) + .is_ok() + } + + #[doc(hidden)] + pub fn begin_request_lifecycle( + &self, + request_id: &str, + ) -> Result, KvSchedulerError> { + self.request_classifier + .get() + .map(|classifier| classifier.begin_request(request_id)) + .transpose() + } + /// Select a worker from current scheduler state without queue admission or booking. pub async fn select_without_admission( &self, @@ -779,6 +862,7 @@ where mod tests { use std::collections::HashMap; use std::sync::Arc; + use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::Duration; use tokio::sync::{mpsc, watch}; @@ -786,6 +870,7 @@ mod tests { use super::*; use crate::protocols::{ActiveSequenceEvent, ActiveSequenceEventData}; use crate::scheduling::PrefillLoadEstimator; + use crate::scheduling::request_classifier::ClassifyFuture; use crate::scheduling::selector::DefaultWorkerSelector; use crate::sequences::SequenceSubscriber; use crate::test_utils::{NoopSequencePublisher, SimpleWorkerConfig}; @@ -979,6 +1064,135 @@ mod tests { cancel_token.cancel(); } + struct CountingClassifier { + calls: Arc, + } + + impl RequestClassifier for CountingClassifier { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + self.calls.fetch_add(1, Ordering::Relaxed); + Box::pin(async move { Ok(request) }) + } + } + + /// A tracked admission with no registered lifecycle takes the default + /// path without reaching the plugin; only `begin_request_lifecycle` opts + /// a request into classification. The runtime itself rejects ids it does + /// not know, so this bypass lives here in the scheduler. + #[tokio::test] + async fn tracked_request_without_lifecycle_bypasses_the_classifier() { + let workers = HashMap::from([(0, SimpleWorkerConfig::default())]); + let (scheduler, _slots, _cfg_tx, cancel_token) = make_scheduler(workers, None, true, None); + let calls = Arc::new(AtomicUsize::new(0)); + assert!(scheduler.install_request_classifier( + Box::new(CountingClassifier { + calls: Arc::clone(&calls), + }), + cancel_token.clone(), + )); + + scheduler + .schedule_request(request(ScheduleMode::Tracked { + request_id: "unregistered".to_string(), + })) + .await + .unwrap(); + assert_eq!(calls.load(Ordering::Relaxed), 0); + + let _lifecycle = scheduler + .begin_request_lifecycle("registered") + .unwrap() + .unwrap(); + scheduler + .schedule_request(request(ScheduleMode::TrackedWithLifecycle { + request_id: "registered".to_string(), + })) + .await + .unwrap(); + assert_eq!(calls.load(Ordering::Relaxed), 1); + cancel_token.cancel(); + } + + #[tokio::test] + async fn booking_admission_classifies_and_releases_on_drop() { + let workers = HashMap::from([(0, SimpleWorkerConfig::default())]); + let (scheduler, _slots, _cfg_tx, cancel_token) = make_scheduler(workers, None, true, None); + let calls = Arc::new(AtomicUsize::new(0)); + assert!(scheduler.install_request_classifier( + Box::new(CountingClassifier { + calls: Arc::clone(&calls), + }), + cancel_token.clone(), + )); + let _lifecycle = scheduler + .begin_request_lifecycle("booked") + .unwrap() + .unwrap(); + + let (_, booking) = scheduler + .schedule_request_with_booking(request(ScheduleMode::TrackedWithLifecycle { + request_id: "booked".to_string(), + })) + .await + .unwrap(); + assert_eq!(calls.load(Ordering::Relaxed), 1); + assert_eq!( + scheduler.get_potential_loads(None, 0, HashMap::new(), false)[0].active_requests, + 1 + ); + drop(booking.expect("admission must return an armed booking")); + tokio::time::timeout(Duration::from_secs(1), async { + while scheduler.get_potential_loads(None, 0, HashMap::new(), false)[0].active_requests + != 0 + { + tokio::task::yield_now().await; + } + }) + .await + .expect("dropping the booking must release the attempt"); + cancel_token.cancel(); + } + + #[tokio::test(start_paused = true)] + async fn booking_admission_applies_classifier_deadline_from_original_ingress() { + struct DeadlineClassifier(Instant); + impl RequestClassifier for DeadlineClassifier { + fn classify(&mut self, mut request: ClassifyRequest) -> ClassifyFuture { + assert_eq!(request.ingress_at(), self.0); + request.set_due_at(self.0 + Duration::from_secs(1)); + Box::pin(async move { Ok(request) }) + } + } + + let workers = HashMap::from([(0, SimpleWorkerConfig::default())]); + let (scheduler, _slots, _cfg_tx, cancel_token) = make_scheduler(workers, None, true, None); + let ingress_at = Instant::now(); + assert!(scheduler.install_request_classifier( + Box::new(DeadlineClassifier(ingress_at)), + cancel_token.clone(), + )); + let _lifecycle = scheduler + .begin_request_lifecycle("expired") + .unwrap() + .unwrap(); + tokio::time::advance(Duration::from_secs(2)).await; + + let result = scheduler + .schedule_request_with_booking_and_context( + request(ScheduleMode::TrackedWithLifecycle { + request_id: "expired".to_string(), + }), + ingress_at, + ) + .await; + assert!(matches!(result, Err(KvSchedulerError::DeadlineExceeded))); + assert_eq!( + scheduler.get_potential_loads(None, 0, HashMap::new(), false)[0].active_requests, + 0 + ); + cancel_token.cancel(); + } + #[tokio::test] async fn legacy_tracked_request_without_id_fails_before_enqueue() { let workers = HashMap::from([(0, SimpleWorkerConfig::default())]); diff --git a/lib/kv-router/src/scheduling/mod.rs b/lib/kv-router/src/scheduling/mod.rs index 82eab3885b66..cbaa84d0ea57 100644 --- a/lib/kv-router/src/scheduling/mod.rs +++ b/lib/kv-router/src/scheduling/mod.rs @@ -13,6 +13,7 @@ pub mod policy_queue; pub mod prefill_load; pub mod queue; mod queue_admission; +pub mod request_classifier; pub mod selector; mod worker_selection_config; @@ -42,4 +43,8 @@ pub use prefill_load::{ prefill_load_hint_from_effective_tokens, }; pub use queue_admission::{RequestProgress, RequestProgressUpdater, WorkerPlacement}; +pub use request_classifier::{ + AbortCause, ClassifierError, ClassifyEvent, ClassifyFuture, ClassifyRequest, RequestClassifier, + RequestLifecycle, +}; pub use types::*; diff --git a/lib/kv-router/src/scheduling/policy_config.rs b/lib/kv-router/src/scheduling/policy_config.rs index f838c3a7aed9..97ddcb6fd2bf 100644 --- a/lib/kv-router/src/scheduling/policy_config.rs +++ b/lib/kv-router/src/scheduling/policy_config.rs @@ -110,6 +110,21 @@ impl FamilyBucketClassifier { let family_index = requested .and_then(|name| self.family_indices.get(name).copied()) .unwrap_or(self.default_family_index); + self.class_index_for_family(family_index, uncached_tokens) + } + + fn strict_class_index(&self, requested: &str, uncached_tokens: usize) -> Option { + self.explicit_class_indices + .get(requested) + .copied() + .or_else(|| { + self.family_indices + .get(requested) + .map(|family_index| self.class_index_for_family(*family_index, uncached_tokens)) + }) + } + + fn class_index_for_family(&self, family_index: usize, uncached_tokens: usize) -> usize { let bucket_index = self .buckets .partition_point(|bucket| bucket.min_tokens <= uncached_tokens) @@ -169,6 +184,21 @@ impl PolicyProfile { pub fn class(&self, index: usize) -> &PolicyClassConfig { &self.classes[index] } + + pub(crate) fn resolve_class_index_strict( + &self, + requested: &str, + uncached_tokens: usize, + ) -> Option { + match &self.classifier { + PolicyClassifier::SyntheticSingle { class_index } => { + (self.classes[*class_index].name == requested).then_some(*class_index) + } + PolicyClassifier::FamilyBucket(classifier) => { + classifier.strict_class_index(requested, uncached_tokens) + } + } + } } #[derive(Debug, Clone, PartialEq)] diff --git a/lib/kv-router/src/scheduling/queue.rs b/lib/kv-router/src/scheduling/queue.rs index 75e27d25e3fa..cde1f4d3f01f 100644 --- a/lib/kv-router/src/scheduling/queue.rs +++ b/lib/kv-router/src/scheduling/queue.rs @@ -23,6 +23,7 @@ use super::policy_config::{PolicyClassConfig, PolicyProfile}; use super::policy_queue::{PolicyQueue, QueueMetadata, QueueSnapshot}; use super::prefill_load::{PrefillLoadEstimator, effective_prefill_tokens}; use super::queue_admission::WorkerPlacement; +use super::request_classifier::ClassifyRequest; use super::selector::{DefaultWorkerSelector, WorkerSelectionInput, WorkerSelector}; use super::types::{ AdvisorySchedulingResponse, AdvisoryWorkerLoad, AttemptId, KvSchedulerError, @@ -711,8 +712,15 @@ impl< block_hashes: Option>, lease: Option>, ) -> Option> { - self.enqueue_admitted_with_block_hashes_and_lease(request, block_hashes, lease, None) - .await + self.enqueue_admitted_with_block_hashes_and_lease( + request, + block_hashes, + lease, + None, + None, + Instant::now(), + ) + .await } pub(crate) async fn enqueue_admitted_with_block_hashes_and_lease( @@ -721,6 +729,8 @@ impl< block_hashes: Option>, lease: Option>, attempt_tx: Option>, + classified_request: Option, + ingress_at: Instant, ) -> Option> { if self.queueing_enabled && lease.is_none() && request.mode.lifecycle_request_id().is_some() { @@ -730,7 +740,17 @@ impl< return None; } - let queue_metadata = self.default_queue_metadata(&request); + let queue_metadata = match classified_request { + Some(classified) => self.validate_classification(&request, classified, ingress_at), + None => Ok(self.default_queue_metadata(&request, ingress_at)), + }; + let queue_metadata = match queue_metadata { + Ok(metadata) => metadata, + Err(error) => { + request.respond(Err(error)); + return None; + } + }; let eligibility = request.eligibility(); @@ -766,6 +786,37 @@ impl< } } + /// Build the classifier's input. Uses `request.isl_tokens` — the + /// routing-token basis the queue's bucketing, limits, and DRR cost already + /// use — so a pass-through classifier is behavior-identical to no + /// classifier. + pub(crate) fn build_classify_request( + &self, + request: &SchedulingRequest, + ingress_at: Instant, + ) -> ClassifyRequest { + let available = self + .available_worker_provider + .as_ref() + .and_then(|provider| provider(request)); + let workers = self.workers_with_configs.borrow(); + let cached_tokens = SchedulingContext::new(request, &workers) + .with_available_workers(available.as_deref()) + .best_cached_tokens(); + let mut classification = + ClassifyRequest::with_timing(request.isl_tokens, cached_tokens, ingress_at); + if let Some(request_id) = request.mode.request_id() { + classification = classification.with_request_id(request_id); + } + if let Some(policy_class) = request.policy_class.as_deref() { + classification = classification.with_initial_policy_class(policy_class); + } + if let Some(session_context) = request.session_context.clone() { + classification = classification.with_session_context(session_context); + } + classification + } + /// Enqueue a request with `due_at` for actor-expiry tests. #[cfg(test)] pub(crate) async fn enqueue_with_due_at_for_test( @@ -773,7 +824,7 @@ impl< request: SchedulingRequest, due_at: Instant, ) { - let mut queue_metadata = self.default_queue_metadata(&request); + let mut queue_metadata = self.default_queue_metadata(&request, Instant::now()); queue_metadata.due_at = Some(due_at); let (ack_tx, ack_rx) = oneshot::channel(); let command = AdmissionCommand::Enqueue { @@ -791,7 +842,11 @@ impl< let _ = ack_rx.await; } - fn default_queue_metadata(&self, request: &SchedulingRequest) -> QueueMetadata { + fn default_queue_metadata( + &self, + request: &SchedulingRequest, + ingress_at: Instant, + ) -> QueueMetadata { let available = self .available_worker_provider .as_ref() @@ -810,15 +865,55 @@ impl< class_index, snapshot, due_at: None, - // "Arrival" is the moment the caller hands the request to the - // scheduler handle, stamped before the admission channel. Two - // racing callers can therefore enqueue in the opposite order of - // their offsets; `enqueue_seq` stays the authoritative FCFS - // tiebreak for same-score entries. - arrival_offset_secs: self.start_time.elapsed().as_secs_f64(), + // "Arrival" is the router ingress time, stamped before the + // admission channel — one basis for classified and unclassified + // requests alike, so time spent in a classifier does not reorder + // FCFS/LCFS. Two racing callers can still enqueue in the opposite + // order of their offsets; `enqueue_seq` stays the authoritative + // FCFS tiebreak for same-score entries. + arrival_offset_secs: ingress_at + .saturating_duration_since(self.start_time) + .as_secs_f64(), } } + fn validate_classification( + &self, + request: &SchedulingRequest, + classified_request: ClassifyRequest, + ingress_at: Instant, + ) -> Result { + let (policy_class, due_at, scheduling_cost_tokens) = classified_request.into_queue_inputs(); + + if scheduling_cost_tokens == Some(0) { + return Err(KvSchedulerError::InvalidClassificationMetadata( + "scheduling cost must be greater than zero".to_string(), + )); + } + // An already-expired `due_at` is not validated here: the actor is the + // single deadline authority and rejects it at enqueue on its own clock. + + // Queue inputs are recomputed from the current workers, exactly as the + // default path computes them: worker state may have changed while the + // classification was pending, and only explicit overrides survive. + let mut metadata = self.default_queue_metadata(request, ingress_at); + if let Some(policy_class) = policy_class { + metadata.class_index = self + .profile + .resolve_class_index_strict(&policy_class, metadata.snapshot.uncached_tokens) + .ok_or_else(|| { + KvSchedulerError::InvalidClassificationMetadata(format!( + "unknown policy class {policy_class:?}" + )) + })?; + } + if let Some(cost) = scheduling_cost_tokens { + metadata.snapshot.scheduling_cost_tokens = cost; + } + metadata.due_at = due_at; + Ok(metadata) + } + pub(crate) fn new_request_lifecycle_lease( &self, request_id: Option<&str>, @@ -1451,6 +1546,11 @@ impl< decay_now, ) .await; + // Deadlines can pass while the refresh is awaited and the actor + // timer cannot fire mid-command. Sweep the still-queued entries so + // a stalled refresh delays their rejection by at most one refresh, + // and an expired entry is never popped into a refresh of its own. + self.reject_expired(Instant::now()); if queued.due_at.is_some_and(|due_at| due_at <= Instant::now()) { // The pop already charged this entry's scheduling cost against // the class deficit; the credit is intentionally not refunded, @@ -2510,6 +2610,124 @@ mod tests { (req, rx) } + #[tokio::test] + async fn classifier_overrides_are_validated_before_enqueue() { + let profile = policy_profile( + r#" +default_policy_family: latency +uncached_isl_buckets: + - min_tokens: 0 + bucket: cached + - min_tokens: 32 + bucket: uncached +policy_classes: + - name: latency_cached + policy_family: latency + cache_bucket: cached + quantum: 1 + - name: latency_uncached + policy_family: latency + cache_bucket: uncached + quantum: 1 + - name: bulk_cached + policy_family: bulk + cache_bucket: cached + quantum: 1 + - name: bulk_uncached + policy_family: bulk + cache_bucket: uncached + quantum: 1 + - name: custom_priority + quantum: 1 +"#, + ); + let (queue, _slots) = make_queue_with_profile(1, 16, 64, profile); + let (mut request, _rx) = make_request("classified", 16); + request.policy_class = Some("latency".to_string()); + let ingress_at = Instant::now(); + let due_at = ingress_at + Duration::from_secs(20); + let mut classified = queue.build_classify_request(&request, ingress_at); + assert_eq!(classified.ingress_at(), ingress_at); + classified.set_policy_class("bulk"); + classified.set_due_at(due_at); + classified.set_scheduling_cost_tokens(7); + + let metadata = queue + .validate_classification(&request, classified, ingress_at) + .unwrap(); + assert_eq!( + queue.profile.class(metadata.class_index).name, + "bulk_cached" + ); + assert_eq!(metadata.snapshot.scheduling_cost_tokens, 7); + assert_eq!(metadata.due_at, Some(due_at)); + + let mut invalid = queue.build_classify_request(&request, ingress_at); + invalid.set_policy_class("missing"); + assert!(matches!( + queue.validate_classification(&request, invalid, ingress_at), + Err(KvSchedulerError::InvalidClassificationMetadata(_)) + )); + + let mut physical = queue.build_classify_request(&request, ingress_at); + physical.set_policy_class("latency_cached"); + assert!(matches!( + queue.validate_classification(&request, physical, ingress_at), + Err(KvSchedulerError::InvalidClassificationMetadata(_)) + )); + + let mut zero_cost = queue.build_classify_request(&request, ingress_at); + zero_cost.set_scheduling_cost_tokens(0); + assert!(matches!( + queue.validate_classification(&request, zero_cost, ingress_at), + Err(KvSchedulerError::InvalidClassificationMetadata(_)) + )); + } + + #[tokio::test] + async fn validation_recomputes_cache_eligibility_at_enqueue() { + let profile = policy_profile( + r#" +default_policy_family: latency +uncached_isl_buckets: + - min_tokens: 0 + bucket: cached + - min_tokens: 32 + bucket: uncached +policy_classes: + - name: latency_cached + policy_family: latency + cache_bucket: cached + quantum: 1 + - name: latency_uncached + policy_family: latency + cache_bucket: uncached + quantum: 1 +"#, + ); + let (queue, _slots, cfg_tx) = make_queue_with_profile_and_sender(1, 16, 64, profile); + let (mut request, _rx) = make_request("classified", 48); + request + .overlap + .effective_cached_tokens + .insert(WorkerWithDpRank::new(0, 0), 32); + + let ingress_at = Instant::now(); + let classified = queue.build_classify_request(&request, ingress_at); + + // The only cache-bearing worker disappears while the classification is + // pending; enqueue-time state governs, so the request buckets as + // uncached — exactly as an unclassified request admitted now would. + cfg_tx.send(HashMap::new()).unwrap(); + let metadata = queue + .validate_classification(&request, classified, ingress_at) + .unwrap(); + assert_eq!( + queue.profile.class(metadata.class_index).name, + "latency_uncached" + ); + } + #[tokio::test] async fn expired_deadline_is_rejected_at_enqueue() { let (queue, _slots) = make_queue(1, 16, 64, Some(0.0)); @@ -2572,7 +2790,7 @@ mod tests { active_rx.await.unwrap().unwrap(); let (request, response_rx) = make_request("expires-during-refresh", 64); - let mut queue_metadata = queue.default_queue_metadata(&request); + let mut queue_metadata = queue.default_queue_metadata(&request, Instant::now()); queue_metadata.due_at = Some(Instant::now() + Duration::from_secs(30)); let (ack_tx, ack_rx) = oneshot::channel(); queue @@ -2610,6 +2828,77 @@ mod tests { assert_eq!(stats.rejected_due_time_passed_total, 1); } + #[tokio::test(flavor = "current_thread", start_paused = true)] + async fn stalled_refresh_sweeps_expired_entries_without_refreshing_them() { + let block_size = 16; + let isl = 64; + let refresher = Arc::new(BlockingRefresher::new(RefreshedOverlap::default())); + let (queue, slots) = make_queue_with_blocking_refresher( + 1, + block_size, + isl, + Some(0.0), + Arc::clone(&refresher), + ADMISSION_CHANNEL_CAPACITY, + ); + + let (active, active_rx) = make_request("active", isl); + queue.enqueue(active).await; + active_rx.await.unwrap().unwrap(); + + // Two deadline-bearing entries with the same due time: FCFS pops the + // first into a refresh that stalls past both deadlines. + let ingress_at = Instant::now(); + let due_at = ingress_at + Duration::from_secs(12); + let mut receivers = Vec::new(); + for (name, hash) in [("stalled", 41), ("swept", 42)] { + let (queued, queued_rx) = make_request(name, isl); + let mut classified = queue.build_classify_request(&queued, ingress_at); + classified.set_due_at(due_at); + queue + .enqueue_admitted_with_block_hashes_and_lease( + queued, + Some(vec![LocalBlockHash(hash)]), + None, + None, + Some(classified), + ingress_at, + ) + .await; + receivers.push(queued_rx); + } + assert_eq!(queue.pending_count(), 2); + + slots + .mark_prefill_completed(&"active".to_string(), decay_now()) + .unwrap(); + slots.free(&"active".to_string(), decay_now()).unwrap(); + tokio::time::advance(Duration::from_secs(11)).await; + + let update = { + let queue = Arc::clone(&queue); + tokio::spawn(async move { queue.update().await }) + }; + refresher.wait_for_calls(1).await; + tokio::time::advance(Duration::from_secs(2)).await; + refresher.release_one(); + // Pre-arm a second release so a regression (popping the expired entry + // into its own refresh) fails the call-count assertion below instead + // of hanging the test. + refresher.release_one(); + update.await.unwrap(); + + for queued_rx in receivers { + assert!(matches!( + queued_rx.await.unwrap(), + Err(KvSchedulerError::DeadlineExceeded) + )); + } + assert_eq!(queue.pending_count(), 0); + assert_eq!(refresher.calls.load(Ordering::Relaxed), 1); + slots.assert_completely_drained(decay_now()); + } + #[tokio::test] async fn zero_class_queue_limit_never_queues() { let profile = policy_profile( @@ -3723,20 +4012,32 @@ policy_classes: ]); assert_eq!( queue - .default_queue_metadata(&request) + .default_queue_metadata(&request, Instant::now()) .snapshot .cached_tokens, 32 ); + assert_eq!( + queue + .build_classify_request(&request, Instant::now()) + .scheduling_cost_tokens(), + 224 + ); request.pinned_worker = Some(WorkerWithDpRank::from_worker_id(0)); assert_eq!( queue - .default_queue_metadata(&request) + .default_queue_metadata(&request, Instant::now()) .snapshot .cached_tokens, 0 ); + assert_eq!( + queue + .build_classify_request(&request, Instant::now()) + .scheduling_cost_tokens(), + 256 + ); } /// A queue starting with zero workers can route after slots and configs arrive. diff --git a/lib/kv-router/src/scheduling/request_classifier.rs b/lib/kv-router/src/scheduling/request_classifier.rs new file mode 100644 index 000000000000..ae4c229d91ad --- /dev/null +++ b/lib/kv-router/src/scheduling/request_classifier.rs @@ -0,0 +1,1487 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::any::Any; +use std::collections::HashMap; +use std::error::Error; +use std::future::Future; +use std::panic::{AssertUnwindSafe, catch_unwind}; +use std::pin::Pin; +use std::sync::Arc; +use std::sync::atomic::{AtomicU64, Ordering}; + +use async_trait::async_trait; +use futures_util::FutureExt; +use parking_lot::Mutex; +use tokio::sync::{Mutex as AsyncMutex, Notify, mpsc}; +use tokio::task::JoinHandle; +// Deadline math across the scheduler uses `tokio::time::Instant` so +// paused-clock tests stay coherent. +use tokio::time::Instant; +use tokio_util::sync::CancellationToken; + +use super::policy_queue::QueueSnapshot; +use super::types::{KvSchedulerError, SessionContext}; +use crate::protocols::WorkerWithDpRank; + +static NEXT_CLASSIFICATION_ID: AtomicU64 = AtomicU64::new(1); +static NEXT_LIFECYCLE_GENERATION: AtomicU64 = AtomicU64::new(1); + +#[derive(Debug)] +pub struct ClassifyRequest { + classification_id: u64, + request_id: Option, + policy_class: Option, + overrides: ClassificationOverrides, + ingress_at: Instant, + input_tokens: usize, + initial_cached_tokens: usize, + session_context: Option, +} + +#[derive(Clone, Debug, Default)] +struct ClassificationOverrides { + policy_class: Option, + due_at: Option, + scheduling_cost_tokens: Option, +} + +impl ClassifyRequest { + #[cfg(test)] + pub(crate) fn new(input_tokens: usize, initial_cached_tokens: usize) -> Self { + Self::with_timing(input_tokens, initial_cached_tokens, Instant::now()) + } + + pub(crate) fn with_timing( + input_tokens: usize, + initial_cached_tokens: usize, + ingress_at: Instant, + ) -> Self { + Self { + classification_id: 0, + request_id: None, + policy_class: None, + overrides: ClassificationOverrides::default(), + ingress_at, + input_tokens, + initial_cached_tokens, + session_context: None, + } + } + + pub(crate) fn with_request_id(mut self, request_id: impl Into) -> Self { + self.request_id = Some(request_id.into()); + self + } + + pub(crate) fn with_initial_policy_class(mut self, policy_class: impl Into) -> Self { + self.policy_class = Some(policy_class.into()); + self + } + + pub(crate) fn with_session_context(mut self, session_context: SessionContext) -> Self { + self.session_context = Some(session_context); + self + } + + pub fn request_id(&self) -> Option<&str> { + self.request_id.as_deref() + } + + pub fn policy_class(&self) -> Option<&str> { + self.overrides + .policy_class + .as_deref() + .or(self.policy_class.as_deref()) + } + + pub fn set_policy_class(&mut self, policy_class: impl Into) { + self.overrides.policy_class = Some(policy_class.into()); + } + + pub fn input_tokens(&self) -> usize { + self.input_tokens + } + + /// Return the original router ingress time on the monotonic clock. + pub fn ingress_at(&self) -> Instant { + self.ingress_at + } + + pub fn due_at(&self) -> Option { + self.overrides.due_at + } + + pub fn set_due_at(&mut self, due_at: Instant) { + self.overrides.due_at = Some(due_at); + } + + pub fn scheduling_cost_tokens(&self) -> usize { + self.overrides.scheduling_cost_tokens.unwrap_or_else(|| { + QueueSnapshot::new(self.input_tokens, self.initial_cached_tokens).scheduling_cost_tokens + }) + } + + pub fn set_scheduling_cost_tokens(&mut self, scheduling_cost_tokens: usize) { + self.overrides.scheduling_cost_tokens = Some(scheduling_cost_tokens); + } + + pub fn session_context(&self) -> Option<&SessionContext> { + self.session_context.as_ref() + } + + /// Only the explicit overrides feed the queue: cache eligibility is + /// recomputed from the current workers at enqueue, because worker state + /// may have changed while the classification was pending. + pub(crate) fn into_queue_inputs(self) -> (Option, Option, Option) { + ( + self.overrides.policy_class, + self.overrides.due_at, + self.overrides.scheduling_cost_tokens, + ) + } +} + +/// Error returned by [`RequestClassifier::classify`]. +pub type ClassifierError = dyn Error + Send + Sync + 'static; + +/// Cause delivered to the classifier when a request aborts. Produced by the +/// router or the worker path, not by the classifier. +pub type AbortCause = dyn Error + Send + Sync + 'static; + +/// Request lifecycle events, delivered to [`RequestClassifier::on_event`] one +/// at a time in lifecycle order. A terminal event can arrive without a prior +/// `Sent`: an attempt that recorded a worker via selection but was never +/// dispatched still ends with `Completed`. +/// +/// Delivery is asynchronous, but a re-registered request id is not classified +/// until the previous lifecycle's terminal event has been delivered, so a +/// plugin keying state by request id observes each lifecycle's `classify` and +/// events in order and never receives a stale terminal event after the id's +/// next `classify`. +#[derive(Debug)] +#[non_exhaustive] +pub enum ClassifyEvent { + Sent { + request_id: String, + worker: WorkerWithDpRank, + }, + Responding { + request_id: String, + worker: WorkerWithDpRank, + }, + Completed { + request_id: String, + worker: WorkerWithDpRank, + context_tokens: Option, + }, + Aborted { + request_id: String, + worker: Option, + error: Option>, + }, +} + +/// An independently pollable classifier invocation. See [`RequestClassifier`] +/// for why this is a `'static` future rather than `async fn`. +pub type ClassifyFuture = + Pin>> + Send + 'static>>; + +/// User-provided request classifier. +/// +/// [`Self::classify`] deliberately avoids `async fn` and returns a `'static` +/// future which the router polls on its own runtime, so a classifier may +/// await, sleep, or park a request without blocking a thread and without +/// standing up a runtime of its own. `async fn` cannot express this: its +/// future borrows `&mut self` for the whole pending wait, which would hold the +/// router-wide classifier lock and block every other request and every event. +/// +/// Because the returned future is `'static`, state it touches must be owned or +/// shared rather than borrowed from `self`: +/// +/// ```ignore +/// struct Pauser { +/// state: Arc>, +/// } +/// +/// impl RequestClassifier for Pauser { +/// fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { +/// // Clone the handle into the future; `self` cannot be borrowed. +/// let state = Arc::clone(&self.state); +/// Box::pin(async move { +/// state.lock().await.wait_for_slot().await; +/// Ok(request) +/// }) +/// } +/// } +/// ``` +/// +/// `classify`'s synchronous prologue runs under the router-wide classifier +/// lock: build the future and return promptly, then wait inside it. Blocking +/// before the future is returned stalls classification and event delivery. +/// +/// [`Self::on_event`] is `async fn`. A dedicated router task delivers events +/// one at a time in lifecycle order and awaits each callback, so `on_event` +/// may await freely. A pending `classify` future never blocks delivery, but a +/// slow `on_event` delays classification of new requests because both share +/// the classifier lock. Terminal events arrive asynchronously, shortly after +/// the request ends; events still queued at router shutdown are dropped. +#[async_trait] +pub trait RequestClassifier: Send + 'static { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + Box::pin(async move { Ok(request) }) + } + + async fn on_event(&mut self, _event: ClassifyEvent) {} +} + +/// One live lifecycle's bookkeeping. `generation` fences `classify_with` +/// against a lifecycle that released this request id and a new one that +/// re-registered it mid-classification: only the lifecycle a classification +/// started under may receive its overrides or enter Order. +struct LiveRequest { + generation: u64, + overrides: Option, +} + +/// Terminal events enqueued for delivery but not yet delivered, per request +/// id. `classify_with` waits on this before invoking the plugin for a reused +/// id, so the plugin never observes a lifecycle's `classify` ahead of the +/// previous lifecycle's terminal event for the same id. +#[derive(Default)] +struct PendingTerminals { + counts: Mutex>, + delivered: Notify, +} + +impl PendingTerminals { + fn reserve(&self, request_id: &str) { + *self.counts.lock().entry(request_id.to_owned()).or_insert(0) += 1; + } + + fn release(&self, request_id: &str) { + { + let mut counts = self.counts.lock(); + if let Some(count) = counts.get_mut(request_id) { + *count -= 1; + if *count == 0 { + counts.remove(request_id); + } + } + } + self.delivered.notify_waiters(); + } + + fn is_pending(&self, request_id: &str) -> bool { + self.counts.lock().contains_key(request_id) + } +} + +pub(crate) struct RequestClassifierRuntime { + // Box: the install seam is object-safe and `Mutex::new` needs `Sized`; + // Arc: the delivery task holds its own handle to the classifier. + // Panics in `classify` and `on_event` are caught and the same instance + // keeps serving: one request's failure must not disable classification + // router-wide, and the plugin owns its own state across an unwind. + classifier: Arc>>, + live_requests: Mutex>, + // Shared with the delivery task, which releases each terminal event once + // `on_event` has returned for it. + pending_terminals: Arc, + // Deliberately unbounded and lossless: dropping a lifecycle event (above + // all a terminal one) silently corrupts plugin bookkeeping, and senders — + // including `Drop` — must not await. The cost is unbounded growth while + // `on_event` is stuck, backstopped by shutdown cancelling delivery and + // `Drop` aborting the task. + events: mpsc::UnboundedSender, + shutdown: CancellationToken, + // Aborted on drop as a backstop for a shutdown token that never fires + // while `on_event` is stuck. + delivery: JoinHandle<()>, +} + +impl RequestClassifierRuntime { + /// Create the runtime and spawn its event-delivery task. Must be called + /// from within a Tokio runtime. + pub(crate) fn new( + classifier: Box, + shutdown: CancellationToken, + ) -> Arc { + let (events, mut receiver) = mpsc::unbounded_channel(); + let classifier = Arc::new(AsyncMutex::new(classifier)); + let pending_terminals = Arc::new(PendingTerminals::default()); + let delivery_classifier = Arc::clone(&classifier); + let delivery_pending = Arc::clone(&pending_terminals); + let delivery_shutdown = shutdown.clone(); + let delivery = tokio::spawn(async move { + loop { + let event = tokio::select! { + biased; + _ = delivery_shutdown.cancelled() => break, + event = receiver.recv() => match event { + Some(event) => event, + None => break, + }, + }; + let terminal_request_id = terminal_request_id(&event); + // Shutdown must also interrupt a stuck `on_event`, not just + // fire between events: dropping this branch releases the + // classifier lock so callers queued on it can observe + // shutdown instead of hanging. + let delivered = tokio::select! { + biased; + _ = delivery_shutdown.cancelled() => break, + delivered = async { + let mut classifier = delivery_classifier.lock().await; + AssertUnwindSafe(classifier.on_event(event)) + .catch_unwind() + .await + } => delivered, + }; + if let Err(panic) = delivered { + tracing::error!( + panic = %panic_message(panic), + "Request classifier panicked while processing a lifecycle event" + ); + } + // Released only after `on_event` returned (or unwound): the + // plugin has observed the terminal event, so the id's next + // lifecycle may now be classified. + if let Some(request_id) = terminal_request_id { + delivery_pending.release(&request_id); + } + } + }); + Arc::new(Self { + classifier, + live_requests: Mutex::new(HashMap::new()), + pending_terminals, + events, + shutdown, + delivery, + }) + } + + pub(crate) async fn classify_with( + &self, + mut request: ClassifyRequest, + ) -> Result { + if self.shutdown.is_cancelled() { + return Err(KvSchedulerError::SubscriberShutdown); + } + + // Capture the lifecycle before waiting: an id re-registered while we + // wait belongs to a different request, even before the plugin runs. + let generation = if let Some(request_id) = request.request_id() { + let live_requests = self.live_requests.lock(); + let live = live_requests.get(request_id).ok_or_else(|| { + KvSchedulerError::ClassificationLifecycleEnded(request_id.to_owned()) + })?; + if let Some(overrides) = live.overrides.clone() { + request.overrides = overrides; + return Ok(request); + } + Some(live.generation) + } else { + None + }; + + let classification_id = NEXT_CLASSIFICATION_ID.fetch_add(1, Ordering::Relaxed); + request.classification_id = classification_id; + let classification = { + let mut classifier = self.lock_classifier_for(request.request_id()).await?; + // Re-check lifecycle identity under the classifier lock: terminal events + // are delivered under this same lock after the id leaves the live + // set, so an id seen live here cannot have had its Aborted + // delivered yet — the plugin never observes classify-after-abort. + if let (Some(request_id), Some(generation)) = (request.request_id(), generation) + && self + .live_requests + .lock() + .get(request_id) + .is_none_or(|live| live.generation != generation) + { + return Err(KvSchedulerError::ClassificationLifecycleEnded( + request_id.to_owned(), + )); + } + catch_unwind(AssertUnwindSafe(|| classifier.classify(request))).map_err(|panic| { + KvSchedulerError::RequestClassifierPanicked(panic_message(panic)) + })? + }; + let classification = AssertUnwindSafe(classification).catch_unwind(); + + let result = tokio::select! { + biased; + _ = self.shutdown.cancelled() => return Err(KvSchedulerError::SubscriberShutdown), + result = classification => result, + }; + let classified = result + .map_err(|panic| KvSchedulerError::RequestClassifierPanicked(panic_message(panic)))? + .map_err(|error| KvSchedulerError::RequestClassifierFailed(Arc::from(error)))?; + + if classified.classification_id != classification_id { + return Err(KvSchedulerError::InvalidClassificationMetadata( + "classifier replaced the logical request".to_string(), + )); + } + // Only the lifecycle the classification started under may enter Order: + // the id may have been released, and re-registered, while the plugin + // ran. Write the overrides back onto that lifecycle; otherwise reject, + // so a request whose lifecycle ended can neither reserve capacity nor + // leak stale overrides onto the id's next lifecycle. + if let (Some(generation), Some(request_id)) = (generation, classified.request_id()) { + match self.live_requests.lock().get_mut(request_id) { + Some(live) if live.generation == generation => { + live.overrides = Some(classified.overrides.clone()); + } + _ => { + return Err(KvSchedulerError::ClassificationLifecycleEnded( + request_id.to_owned(), + )); + } + } + } + Ok(classified) + } + + pub(crate) fn begin_request( + self: &Arc, + request_id: &str, + ) -> Result { + if self.shutdown.is_cancelled() { + return Err(KvSchedulerError::SubscriberShutdown); + } + match self.live_requests.lock().entry(request_id.to_owned()) { + std::collections::hash_map::Entry::Occupied(_) => { + return Err(KvSchedulerError::DuplicateClassificationRequestId( + request_id.to_owned(), + )); + } + std::collections::hash_map::Entry::Vacant(entry) => { + entry.insert(LiveRequest { + generation: NEXT_LIFECYCLE_GENERATION.fetch_add(1, Ordering::Relaxed), + overrides: None, + }); + } + } + Ok(RequestLifecycle { + runtime: Arc::clone(self), + request_id: request_id.to_owned(), + worker: None, + context_tokens: None, + phase: LifecyclePhase::Registered, + }) + } + + pub(crate) fn has_request(&self, request_id: &str) -> bool { + self.live_requests.lock().contains_key(request_id) + } + + /// Take the classifier lock for a `classify` call. A reused id must not + /// reach the plugin ahead of the previous lifecycle's terminal event, so + /// wait for that id's pending terminals outside the lock (delivery needs + /// it), then re-check under it: a terminal enqueued in between cannot be + /// delivered while the lock is held, so release it and wait again. + async fn lock_classifier_for( + &self, + request_id: Option<&str>, + ) -> Result>, KvSchedulerError> { + loop { + if let Some(request_id) = request_id { + self.await_terminal_delivery(request_id).await?; + } + let classifier = self.classifier.lock().await; + if request_id.is_some_and(|request_id| self.pending_terminals.is_pending(request_id)) { + continue; + } + return Ok(classifier); + } + } + + /// Wait until no terminal event for `request_id` is queued undelivered. + async fn await_terminal_delivery(&self, request_id: &str) -> Result<(), KvSchedulerError> { + loop { + // Register before checking so a release between the check and the + // await still wakes this waiter. + let delivered = self.pending_terminals.delivered.notified(); + if !self.pending_terminals.is_pending(request_id) { + return Ok(()); + } + tokio::select! { + biased; + _ = self.shutdown.cancelled() => return Err(KvSchedulerError::SubscriberShutdown), + _ = delivered => {} + } + } + } + + fn send_event(&self, event: ClassifyEvent) { + let _ = self.events.send(event); + } + + /// Remove the request from the live set and, if it was live, enqueue its + /// terminal event before releasing the lock (the unbounded send cannot + /// block). `begin_request` re-registers a reused id under the same lock, + /// so the terminal event is always ordered ahead of any event from the + /// id's next lifecycle, and the pending-terminal reservation taken here + /// holds that lifecycle's `classify` until the event has been delivered. + fn finish_request_and_send( + &self, + request_id: String, + event: impl FnOnce(String) -> ClassifyEvent, + ) { + let mut live_requests = self.live_requests.lock(); + if live_requests.remove(&request_id).is_none() { + return; + } + // Reserve before sending so delivery can never release first. A send + // only fails once delivery has ended (shutdown or Drop), and waiters + // observe shutdown rather than the reservation. + self.pending_terminals.reserve(&request_id); + let _ = self.events.send(event(request_id)); + } +} + +impl Drop for RequestClassifierRuntime { + fn drop(&mut self) { + self.delivery.abort(); + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum LifecyclePhase { + Registered, + Sent, + Responding, + Terminal, +} + +#[doc(hidden)] +pub struct RequestLifecycle { + runtime: Arc, + request_id: String, + worker: Option, + context_tokens: Option, + phase: LifecyclePhase, +} + +impl std::fmt::Debug for RequestLifecycle { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter + .debug_struct("RequestLifecycle") + .field("request_id", &self.request_id) + .field("worker", &self.worker) + .field("phase", &self.phase) + .finish() + } +} + +#[doc(hidden)] +impl RequestLifecycle { + pub fn selected(&mut self, worker: WorkerWithDpRank) { + if self.phase == LifecyclePhase::Registered { + self.worker = Some(worker); + } + } + + pub fn sent(&mut self, worker: WorkerWithDpRank) { + if self.phase != LifecyclePhase::Registered { + return; + } + self.worker = Some(worker); + self.phase = LifecyclePhase::Sent; + self.runtime.send_event(ClassifyEvent::Sent { + request_id: self.request_id.clone(), + worker, + }); + } + + pub fn responding(&mut self) { + if self.phase != LifecyclePhase::Sent { + return; + } + let Some(worker) = self.worker else { + debug_assert!(false, "phase Sent implies a recorded worker"); + return; + }; + self.phase = LifecyclePhase::Responding; + self.runtime.send_event(ClassifyEvent::Responding { + request_id: self.request_id.clone(), + worker, + }); + } + + /// Add generated output tokens on top of the current context total. + /// + /// Order matters: [`Self::observe_context_tokens`] floors the same total, + /// so report a context before its outputs or the floor erases them. + pub fn observe_output_tokens(&mut self, output_tokens: usize) { + self.context_tokens = Some( + self.context_tokens + .unwrap_or_default() + .saturating_add(output_tokens), + ); + } + + /// Raise the context total to at least `context_tokens` (an + /// engine-reported absolute count). + pub fn observe_context_tokens(&mut self, context_tokens: usize) { + self.context_tokens = Some( + self.context_tokens + .map_or(context_tokens, |current| current.max(context_tokens)), + ); + } + + pub fn prepare_retry(&mut self) { + if self.phase != LifecyclePhase::Terminal { + self.phase = LifecyclePhase::Registered; + } + } + + pub fn complete(&mut self) { + if self.phase == LifecyclePhase::Terminal { + return; + } + let Some(worker) = self.worker else { + self.abort(None); + return; + }; + self.phase = LifecyclePhase::Terminal; + let context_tokens = self.context_tokens; + self.runtime + .finish_request_and_send(std::mem::take(&mut self.request_id), |request_id| { + ClassifyEvent::Completed { + request_id, + worker, + context_tokens, + } + }); + } + + pub fn abort(&mut self, error: Option>) { + if self.phase == LifecyclePhase::Terminal { + return; + } + self.phase = LifecyclePhase::Terminal; + let worker = self.worker; + self.runtime + .finish_request_and_send(std::mem::take(&mut self.request_id), |request_id| { + ClassifyEvent::Aborted { + request_id, + worker, + error, + } + }); + } +} + +impl Drop for RequestLifecycle { + fn drop(&mut self) { + self.abort(None); + } +} + +fn terminal_request_id(event: &ClassifyEvent) -> Option { + match event { + ClassifyEvent::Completed { request_id, .. } | ClassifyEvent::Aborted { request_id, .. } => { + Some(request_id.clone()) + } + ClassifyEvent::Sent { .. } | ClassifyEvent::Responding { .. } => None, + } +} + +fn panic_message(panic: Box) -> String { + if let Some(message) = panic.downcast_ref::<&str>() { + (*message).to_string() + } else if let Some(message) = panic.downcast_ref::() { + message.clone() + } else { + "request classifier panicked with a non-string payload".to_string() + } +} + +#[cfg(test)] +mod tests { + use std::sync::Arc; + use std::sync::atomic::{AtomicUsize, Ordering}; + + use tokio::sync::{Notify, mpsc}; + use tokio_util::sync::CancellationToken; + + use super::*; + use crate::protocols::WorkerWithDpRank; + use crate::scheduling::KvSchedulerError; + + struct PassThrough; + + impl RequestClassifier for PassThrough {} + + struct SynchronousPanicOnce { + calls: Arc, + } + + impl RequestClassifier for SynchronousPanicOnce { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + if self.calls.fetch_add(1, Ordering::Relaxed) == 0 { + panic!("synchronous classifier panic"); + } + Box::pin(async move { Ok(request) }) + } + } + + #[tokio::test] + async fn synchronous_panic_fails_one_request_and_retains_the_classifier() { + let calls = Arc::new(AtomicUsize::new(0)); + let runtime = RequestClassifierRuntime::new( + Box::new(SynchronousPanicOnce { + calls: Arc::clone(&calls), + }), + CancellationToken::new(), + ); + + let error = runtime + .classify_with(ClassifyRequest::new(1, 0)) + .await + .unwrap_err(); + assert!(matches!( + error, + KvSchedulerError::RequestClassifierPanicked(message) + if message == "synchronous classifier panic" + )); + runtime + .classify_with(ClassifyRequest::new(2, 0)) + .await + .unwrap(); + assert_eq!(calls.load(Ordering::Relaxed), 2); + } + + struct FuturePanicOnce { + calls: Arc, + } + + impl RequestClassifier for FuturePanicOnce { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + let should_panic = self.calls.fetch_add(1, Ordering::Relaxed) == 0; + Box::pin(async move { + assert!(!should_panic, "classifier future panic"); + Ok(request) + }) + } + } + + #[tokio::test] + async fn future_panic_fails_one_request_and_retains_the_classifier() { + let calls = Arc::new(AtomicUsize::new(0)); + let runtime = RequestClassifierRuntime::new( + Box::new(FuturePanicOnce { + calls: Arc::clone(&calls), + }), + CancellationToken::new(), + ); + + let error = runtime + .classify_with(ClassifyRequest::new(1, 0)) + .await + .unwrap_err(); + assert!(matches!( + error, + KvSchedulerError::RequestClassifierPanicked(message) + if message == "classifier future panic" + )); + runtime + .classify_with(ClassifyRequest::new(2, 0)) + .await + .unwrap(); + assert_eq!(calls.load(Ordering::Relaxed), 2); + } + + #[derive(Debug, thiserror::Error)] + #[error("classifier rejected request")] + struct TestClassifierError; + + struct FailingClassifier; + + impl RequestClassifier for FailingClassifier { + fn classify(&mut self, _request: ClassifyRequest) -> ClassifyFuture { + Box::pin(async { Err(Box::new(TestClassifierError) as Box) }) + } + } + + #[tokio::test] + async fn classifier_error_is_preserved_as_scheduler_error() { + let runtime = + RequestClassifierRuntime::new(Box::new(FailingClassifier), CancellationToken::new()); + + let error = runtime + .classify_with(ClassifyRequest::new(1, 0)) + .await + .unwrap_err(); + assert!(matches!( + error, + KvSchedulerError::RequestClassifierFailed(source) + if source.to_string() == "classifier rejected request" + )); + } + + struct ReplacingClassifier; + + impl RequestClassifier for ReplacingClassifier { + fn classify(&mut self, _request: ClassifyRequest) -> ClassifyFuture { + Box::pin(async { Ok(ClassifyRequest::new(2, 0)) }) + } + } + + #[tokio::test] + async fn classifier_cannot_replace_the_logical_request() { + let runtime = + RequestClassifierRuntime::new(Box::new(ReplacingClassifier), CancellationToken::new()); + + let error = runtime + .classify_with(ClassifyRequest::new(1, 0)) + .await + .unwrap_err(); + assert!(matches!( + error, + KvSchedulerError::InvalidClassificationMetadata(message) + if message == "classifier replaced the logical request" + )); + } + + #[tokio::test] + async fn duplicate_live_request_id_is_rejected_until_lifecycle_ends() { + let runtime = + RequestClassifierRuntime::new(Box::new(PassThrough), CancellationToken::new()); + let lifecycle = runtime.begin_request("request-1").unwrap(); + + let error = runtime.begin_request("request-1").unwrap_err(); + assert!(matches!( + error, + KvSchedulerError::DuplicateClassificationRequestId(request_id) + if request_id == "request-1" + )); + + drop(lifecycle); + runtime.begin_request("request-1").unwrap(); + } + + #[tokio::test] + async fn default_classifier_returns_the_same_request_without_overrides() { + let request = ClassifyRequest::new(128, 32) + .with_request_id("request-1") + .with_initial_policy_class("latency"); + + let result = PassThrough.classify(request).await.unwrap(); + + assert_eq!(result.request_id(), Some("request-1")); + assert_eq!(result.policy_class(), Some("latency")); + assert_eq!(result.scheduling_cost_tokens(), 96); + assert_eq!(result.into_queue_inputs(), (None, None, None)); + } + + struct EventReleasedClassifier { + entered: Arc, + released: Arc, + } + + #[async_trait] + impl RequestClassifier for EventReleasedClassifier { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + let entered = Arc::clone(&self.entered); + let released = Arc::clone(&self.released); + Box::pin(async move { + entered.notify_one(); + released.notified().await; + Ok(request) + }) + } + + async fn on_event(&mut self, _event: ClassifyEvent) { + self.released.notify_one(); + } + } + + #[tokio::test] + async fn pending_classification_does_not_block_event_delivery() { + let entered = Arc::new(Notify::new()); + let released = Arc::new(Notify::new()); + let runtime = RequestClassifierRuntime::new( + Box::new(EventReleasedClassifier { + entered: Arc::clone(&entered), + released, + }), + CancellationToken::new(), + ); + let mut lifecycle = runtime.begin_request("event-source").unwrap(); + let worker = WorkerWithDpRank::new(7, 0); + + let pending_runtime = Arc::clone(&runtime); + let pending = tokio::spawn(async move { + pending_runtime + .classify_with(ClassifyRequest::new(1, 1)) + .await + }); + entered.notified().await; + lifecycle.sent(worker); + + pending.await.unwrap().unwrap(); + lifecycle.abort(None); + } + + struct PendingClassifier { + entered: Arc, + events: mpsc::UnboundedSender, + } + + #[async_trait] + impl RequestClassifier for PendingClassifier { + fn classify(&mut self, _request: ClassifyRequest) -> ClassifyFuture { + self.entered.fetch_add(1, Ordering::Relaxed); + Box::pin(std::future::pending()) + } + + async fn on_event(&mut self, event: ClassifyEvent) { + if let ClassifyEvent::Aborted { request_id, .. } = event { + self.events.send(request_id).unwrap(); + } + } + } + + #[tokio::test] + async fn cancellation_aborts_pending_classification() { + let entered = Arc::new(AtomicUsize::new(0)); + let (event_tx, mut event_rx) = mpsc::unbounded_channel(); + let runtime = RequestClassifierRuntime::new( + Box::new(PendingClassifier { + entered: Arc::clone(&entered), + events: event_tx, + }), + CancellationToken::new(), + ); + + let cancelled_runtime = Arc::clone(&runtime); + let cancelled = tokio::spawn(async move { + let _lifecycle = cancelled_runtime.begin_request("cancelled").unwrap(); + cancelled_runtime + .classify_with(ClassifyRequest::new(1, 0).with_request_id("cancelled")) + .await + }); + while entered.load(Ordering::Relaxed) < 1 { + tokio::task::yield_now().await; + } + cancelled.abort(); + assert!(cancelled.await.unwrap_err().is_cancelled()); + assert_eq!(event_rx.recv().await.as_deref(), Some("cancelled")); + assert!(event_rx.try_recv().is_err()); + } + + struct AwaitingEventClassifier { + events: mpsc::UnboundedSender, + } + + #[async_trait] + impl RequestClassifier for AwaitingEventClassifier { + async fn on_event(&mut self, event: ClassifyEvent) { + let ClassifyEvent::Aborted { request_id, .. } = event else { + return; + }; + // Await inside the callback: delivery must tolerate suspension. + tokio::task::yield_now().await; + self.events.send(request_id).unwrap(); + } + } + + #[tokio::test] + async fn off_runtime_drop_still_delivers_terminal_event() { + let (event_tx, mut event_rx) = mpsc::unbounded_channel(); + let runtime = RequestClassifierRuntime::new( + Box::new(AwaitingEventClassifier { events: event_tx }), + CancellationToken::new(), + ); + let lifecycle = runtime.begin_request("off-runtime-drop").unwrap(); + runtime + .classify_with(ClassifyRequest::new(1, 0).with_request_id("off-runtime-drop")) + .await + .unwrap(); + + std::thread::spawn(move || drop(lifecycle)).join().unwrap(); + assert_eq!(event_rx.recv().await.as_deref(), Some("off-runtime-drop")); + } + + struct CountingClassifier { + calls: Arc, + } + + impl RequestClassifier for CountingClassifier { + fn classify(&mut self, mut request: ClassifyRequest) -> ClassifyFuture { + self.calls.fetch_add(1, Ordering::Relaxed); + request.set_scheduling_cost_tokens(7); + Box::pin(async move { Ok(request) }) + } + } + + #[tokio::test] + async fn retry_reuses_classification_overrides_without_reinvoking_plugin() { + let calls = Arc::new(AtomicUsize::new(0)); + let runtime = RequestClassifierRuntime::new( + Box::new(CountingClassifier { + calls: Arc::clone(&calls), + }), + CancellationToken::new(), + ); + let mut lifecycle = runtime.begin_request("request-1").unwrap(); + + let first = runtime + .classify_with(ClassifyRequest::new(10, 10).with_request_id("request-1")) + .await + .unwrap(); + let retry = runtime + .classify_with(ClassifyRequest::new(20, 20).with_request_id("request-1")) + .await + .unwrap(); + + assert_eq!(calls.load(Ordering::Relaxed), 1); + assert_eq!(first.input_tokens(), 10); + assert_eq!(retry.input_tokens(), 20); + assert_eq!(retry.scheduling_cost_tokens(), 7); + lifecycle.abort(None); + } + + // `LocalScheduler::classify_request` routes ids with no registered + // lifecycle to the default path before reaching the runtime, so at this + // level an unregistered id is indistinguishable from one whose lifecycle + // ended: neither may enter Order, and the plugin is never invoked. + #[tokio::test] + async fn unregistered_request_id_is_rejected_without_calling_the_plugin() { + let calls = Arc::new(AtomicUsize::new(0)); + let runtime = RequestClassifierRuntime::new( + Box::new(CountingClassifier { + calls: Arc::clone(&calls), + }), + CancellationToken::new(), + ); + + let result = runtime + .classify_with(ClassifyRequest::new(4, 0).with_request_id("ghost")) + .await; + + assert!(matches!( + result, + Err(KvSchedulerError::ClassificationLifecycleEnded(_)) + )); + assert_eq!(calls.load(Ordering::Relaxed), 0); + } + + struct GatedClassifier { + entered: Arc, + release: Arc, + calls: Arc, + } + + impl RequestClassifier for GatedClassifier { + fn classify(&mut self, mut request: ClassifyRequest) -> ClassifyFuture { + let call = self.calls.fetch_add(1, Ordering::Relaxed) + 1; + let entered = Arc::clone(&self.entered); + let release = Arc::clone(&self.release); + Box::pin(async move { + entered.notify_one(); + release.notified().await; + request.set_scheduling_cost_tokens(call); + Ok(request) + }) + } + } + + #[tokio::test] + async fn stale_classification_does_not_cache_onto_a_reused_request_id() { + let entered = Arc::new(Notify::new()); + let release = Arc::new(Notify::new()); + let calls = Arc::new(AtomicUsize::new(0)); + let runtime = RequestClassifierRuntime::new( + Box::new(GatedClassifier { + entered: Arc::clone(&entered), + release: Arc::clone(&release), + calls: Arc::clone(&calls), + }), + CancellationToken::new(), + ); + + let lifecycle = runtime.begin_request("reused").unwrap(); + let stale_runtime = Arc::clone(&runtime); + let stale = tokio::spawn(async move { + stale_runtime + .classify_with(ClassifyRequest::new(1, 0).with_request_id("reused")) + .await + }); + entered.notified().await; + + // End the first lifecycle and re-register the id while its + // classification is still in flight. + drop(lifecycle); + let _reused = runtime.begin_request("reused").unwrap(); + release.notify_one(); + // The stale lifecycle may not enter Order. + assert!(matches!( + stale.await.unwrap(), + Err(KvSchedulerError::ClassificationLifecycleEnded(_)) + )); + + // The stale result must not be cached onto the new lifecycle: its + // classification reaches the plugin instead of reusing overrides. + release.notify_one(); + let second = runtime + .classify_with(ClassifyRequest::new(1, 0).with_request_id("reused")) + .await + .unwrap(); + assert_eq!(calls.load(Ordering::Relaxed), 2); + assert_eq!(second.scheduling_cost_tokens(), 2); + } + + #[tokio::test] + async fn reused_id_while_waiting_for_classifier_lock_rejects_stale_classification() { + let calls = Arc::new(AtomicUsize::new(0)); + let runtime = RequestClassifierRuntime::new( + Box::new(CountingClassifier { + calls: Arc::clone(&calls), + }), + CancellationToken::new(), + ); + let lifecycle = runtime.begin_request("reused").unwrap(); + let guard = runtime.classifier.lock().await; + let mut stale = + Box::pin(runtime.classify_with(ClassifyRequest::new(1, 0).with_request_id("reused"))); + + // Poll once to guarantee the old call is waiting for the lock, then + // replace its lifecycle before the plugin can be invoked. + assert!(futures_util::poll!(stale.as_mut()).is_pending()); + drop(lifecycle); + let _replacement = runtime.begin_request("reused").unwrap(); + drop(guard); + + assert!(matches!( + stale.await, + Err(KvSchedulerError::ClassificationLifecycleEnded(_)) + )); + assert_eq!(calls.load(Ordering::Relaxed), 0); + + // The replacement must reach the plugin, without stale overrides. + let replacement = runtime + .classify_with(ClassifyRequest::new(100, 0).with_request_id("reused")) + .await + .unwrap(); + assert_eq!(replacement.input_tokens(), 100); + assert_eq!(replacement.scheduling_cost_tokens(), 7); + assert_eq!(calls.load(Ordering::Relaxed), 1); + } + + #[tokio::test] + async fn lifecycle_ended_while_waiting_for_the_classifier_lock_is_rejected() { + let calls = Arc::new(AtomicUsize::new(0)); + let runtime = RequestClassifierRuntime::new( + Box::new(CountingClassifier { + calls: Arc::clone(&calls), + }), + CancellationToken::new(), + ); + let lifecycle = runtime.begin_request("ended").unwrap(); + + // Hold the classifier lock so the classification parks ahead of the + // plugin call, then end the lifecycle while it waits. + let guard = runtime.classifier.lock().await; + let ended_runtime = Arc::clone(&runtime); + let ended = tokio::spawn(async move { + ended_runtime + .classify_with(ClassifyRequest::new(1, 0).with_request_id("ended")) + .await + }); + tokio::task::yield_now().await; + drop(lifecycle); + drop(guard); + + assert!(matches!( + ended.await.unwrap(), + Err(KvSchedulerError::ClassificationLifecycleEnded(_)) + )); + assert_eq!(calls.load(Ordering::Relaxed), 0); + } + + #[tokio::test] + async fn lifecycle_ended_during_classification_is_rejected() { + let entered = Arc::new(Notify::new()); + let release = Arc::new(Notify::new()); + let runtime = RequestClassifierRuntime::new( + Box::new(GatedClassifier { + entered: Arc::clone(&entered), + release: Arc::clone(&release), + calls: Arc::new(AtomicUsize::new(0)), + }), + CancellationToken::new(), + ); + let lifecycle = runtime.begin_request("ended").unwrap(); + let ended_runtime = Arc::clone(&runtime); + let ended = tokio::spawn(async move { + ended_runtime + .classify_with(ClassifyRequest::new(1, 0).with_request_id("ended")) + .await + }); + entered.notified().await; + + // End the lifecycle while the plugin still holds the request, without + // re-registering the id. + drop(lifecycle); + release.notify_one(); + + assert!(matches!( + ended.await.unwrap(), + Err(KvSchedulerError::ClassificationLifecycleEnded(_)) + )); + assert!(!runtime.has_request("ended")); + } + + #[derive(Debug, PartialEq, Eq)] + enum RecordedEvent { + Sent(String, WorkerWithDpRank), + Completed(String, WorkerWithDpRank, Option), + Aborted(String, Option), + } + + struct RecordingClassifier { + events: mpsc::UnboundedSender, + } + + #[async_trait] + impl RequestClassifier for RecordingClassifier { + async fn on_event(&mut self, event: ClassifyEvent) { + let event = match event { + ClassifyEvent::Sent { request_id, worker } => { + Some(RecordedEvent::Sent(request_id, worker)) + } + ClassifyEvent::Completed { + request_id, + worker, + context_tokens, + } => Some(RecordedEvent::Completed(request_id, worker, context_tokens)), + ClassifyEvent::Aborted { + request_id, worker, .. + } => Some(RecordedEvent::Aborted(request_id, worker)), + ClassifyEvent::Responding { .. } => None, + }; + if let Some(event) = event { + let _ = self.events.send(event); + } + } + } + + #[tokio::test] + async fn lifecycle_delivers_one_terminal_event() { + let (event_tx, mut event_rx) = mpsc::unbounded_channel(); + let runtime = RequestClassifierRuntime::new( + Box::new(RecordingClassifier { events: event_tx }), + CancellationToken::new(), + ); + let worker = WorkerWithDpRank::new(7, 2); + let mut lifecycle = runtime.begin_request("request-1").unwrap(); + runtime + .classify_with(ClassifyRequest::new(40, 0).with_request_id("request-1")) + .await + .unwrap(); + + lifecycle.sent(worker); + lifecycle.observe_context_tokens(40); + lifecycle.observe_output_tokens(2); + lifecycle.complete(); + lifecycle.abort(None); + + assert_eq!( + event_rx.recv().await, + Some(RecordedEvent::Sent("request-1".to_string(), worker)) + ); + assert_eq!( + event_rx.recv().await, + Some(RecordedEvent::Completed( + "request-1".to_string(), + worker, + Some(42) + )) + ); + assert!(event_rx.try_recv().is_err()); + } + + #[tokio::test] + async fn terminal_event_is_ordered_before_events_from_a_reused_request_id() { + let (event_tx, mut event_rx) = mpsc::unbounded_channel(); + let runtime = RequestClassifierRuntime::new( + Box::new(RecordingClassifier { events: event_tx }), + CancellationToken::new(), + ); + let worker = WorkerWithDpRank::new(1, 0); + + for _ in 0..4096 { + let mut lifecycle = runtime.begin_request("reused").unwrap(); + lifecycle.sent(worker); + + // Race a re-registration of the client-controlled id against + // `complete`, grabbing it the instant it is released. + let attempts = Arc::new(AtomicUsize::new(0)); + let reuse_attempts = Arc::clone(&attempts); + let reuse_runtime = Arc::clone(&runtime); + let reuse = std::thread::spawn(move || { + let mut reused = loop { + reuse_attempts.fetch_add(1, Ordering::Relaxed); + match reuse_runtime.begin_request("reused") { + Ok(lifecycle) => break lifecycle, + Err(_) => std::hint::spin_loop(), + } + }; + reused.sent(worker); + reused + }); + while attempts.load(Ordering::Relaxed) == 0 { + std::thread::yield_now(); + } + lifecycle.complete(); + let reused = reuse.join().unwrap(); + + assert_eq!( + event_rx.recv().await, + Some(RecordedEvent::Sent("reused".to_string(), worker)) + ); + assert_eq!( + event_rx.recv().await, + Some(RecordedEvent::Completed("reused".to_string(), worker, None)), + "terminal event for the released id must precede the reused id's Sent" + ); + assert_eq!( + event_rx.recv().await, + Some(RecordedEvent::Sent("reused".to_string(), worker)) + ); + drop(reused); + assert_eq!( + event_rx.recv().await, + Some(RecordedEvent::Aborted("reused".to_string(), Some(worker))) + ); + } + } + + /// Records what the plugin observes, in order, and holds the `Sent` + /// callback open so a terminal event can queue behind it undelivered. + struct OrderingClassifier { + observed: mpsc::UnboundedSender, + entered_sent: Arc, + release_sent: Arc, + } + + #[async_trait] + impl RequestClassifier for OrderingClassifier { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + let _ = self + .observed + .send(format!("classify:{}", request.request_id().unwrap_or(""))); + Box::pin(async move { Ok(request) }) + } + + async fn on_event(&mut self, event: ClassifyEvent) { + match event { + ClassifyEvent::Sent { request_id, .. } => { + self.entered_sent.notify_one(); + self.release_sent.notified().await; + let _ = self.observed.send(format!("sent:{request_id}")); + } + ClassifyEvent::Completed { request_id, .. } => { + let _ = self.observed.send(format!("completed:{request_id}")); + } + ClassifyEvent::Aborted { request_id, .. } => { + let _ = self.observed.send(format!("aborted:{request_id}")); + } + ClassifyEvent::Responding { .. } => {} + } + } + } + + #[tokio::test] + async fn reused_id_is_not_classified_before_the_prior_terminal_is_delivered() { + let (observed_tx, mut observed) = mpsc::unbounded_channel(); + let entered_sent = Arc::new(Notify::new()); + let release_sent = Arc::new(Notify::new()); + let runtime = RequestClassifierRuntime::new( + Box::new(OrderingClassifier { + observed: observed_tx, + entered_sent: Arc::clone(&entered_sent), + release_sent: Arc::clone(&release_sent), + }), + CancellationToken::new(), + ); + let worker = WorkerWithDpRank::new(1, 0); + + // Park delivery inside the first lifecycle's `Sent` callback, then end + // that lifecycle: its `Completed` is queued but undelivered. + let mut first = runtime.begin_request("reused").unwrap(); + first.sent(worker); + entered_sent.notified().await; + first.complete(); + + // Re-register the id and start classifying it while the terminal + // event is still queued. The classification is parked before delivery + // resumes, so without the gate the lock's FIFO hand-off would run it + // ahead of the queued `Completed`. + let _second = runtime.begin_request("reused").unwrap(); + let classify_runtime = Arc::clone(&runtime); + let classify = tokio::spawn(async move { + classify_runtime + .classify_with(ClassifyRequest::new(1, 0).with_request_id("reused")) + .await + }); + tokio::task::yield_now().await; + + release_sent.notify_one(); + classify.await.unwrap().unwrap(); + + let mut order = Vec::new(); + for _ in 0..3 { + order.push(observed.recv().await.unwrap()); + } + assert_eq!( + order, + vec![ + "sent:reused".to_string(), + "completed:reused".to_string(), + "classify:reused".to_string(), + ], + "the prior lifecycle's terminal event must reach the plugin before the reused id's classify" + ); + } + + struct StuckOnEventClassifier { + entered: Arc, + } + + #[async_trait] + impl RequestClassifier for StuckOnEventClassifier { + async fn on_event(&mut self, _event: ClassifyEvent) { + self.entered.notify_one(); + std::future::pending::<()>().await; + } + } + + #[tokio::test] + async fn shutdown_interrupts_stuck_on_event_and_releases_classifier_lock() { + let entered = Arc::new(Notify::new()); + let shutdown = CancellationToken::new(); + let runtime = RequestClassifierRuntime::new( + Box::new(StuckOnEventClassifier { + entered: Arc::clone(&entered), + }), + shutdown.clone(), + ); + let mut lifecycle = runtime.begin_request("stuck").unwrap(); + lifecycle.sent(WorkerWithDpRank::new(1, 0)); + // The callback now holds the classifier lock and never returns. + entered.notified().await; + + shutdown.cancel(); + let _guard = + tokio::time::timeout(std::time::Duration::from_secs(5), runtime.classifier.lock()) + .await + .expect("shutdown did not release the classifier lock held by on_event"); + } +} diff --git a/lib/kv-router/src/scheduling/types.rs b/lib/kv-router/src/scheduling/types.rs index 57e69bc0a140..00b86e50f9d1 100644 --- a/lib/kv-router/src/scheduling/types.rs +++ b/lib/kv-router/src/scheduling/types.rs @@ -116,6 +116,21 @@ pub enum KvSchedulerError { #[error("failed to initialize event publisher: {0}")] InitFailed(String), + #[error("request classifier panicked: {0}")] + RequestClassifierPanicked(String), + + #[error("request classifier failed: {0}")] + RequestClassifierFailed(Arc), + + #[error("request classifier is already tracking request ID {0:?}")] + DuplicateClassificationRequestId(String), + + #[error("invalid request classification metadata: {0}")] + InvalidClassificationMetadata(String), + + #[error("request lifecycle for request ID {0:?} ended before classification completed")] + ClassificationLifecycleEnded(String), + #[error("request deadline exceeded")] DeadlineExceeded, diff --git a/lib/kv-router/src/services/selection/error.rs b/lib/kv-router/src/services/selection/error.rs index 69cf3a45ef0b..aed3ee6d4092 100644 --- a/lib/kv-router/src/services/selection/error.rs +++ b/lib/kv-router/src/services/selection/error.rs @@ -83,7 +83,15 @@ fn scheduler_error_status(error: &KvSchedulerError) -> StatusCode { | KvSchedulerError::QueueRejected(_) | KvSchedulerError::DeadlineExceeded => StatusCode::TOO_MANY_REQUESTS, KvSchedulerError::PinnedWorkerNotAllowed { .. } => StatusCode::BAD_REQUEST, - KvSchedulerError::BookingFailed(_) => StatusCode::CONFLICT, + // A duplicate live request id, or a lifecycle the caller ended (or + // re-registered) mid-classification, is caller-induced, like + // `BookingFailed` and `SequenceError::DuplicateRequest`. + KvSchedulerError::BookingFailed(_) + | KvSchedulerError::DuplicateClassificationRequestId(_) + | KvSchedulerError::ClassificationLifecycleEnded(_) => StatusCode::CONFLICT, + KvSchedulerError::RequestClassifierPanicked(_) + | KvSchedulerError::RequestClassifierFailed(_) + | KvSchedulerError::InvalidClassificationMetadata(_) => StatusCode::INTERNAL_SERVER_ERROR, } } @@ -99,6 +107,23 @@ fn sequence_error_status(error: &SequenceError) -> StatusCode { impl IntoResponse for SelectionError { fn into_response(self) -> Response { + if matches!( + &self, + Self::Scheduler( + KvSchedulerError::RequestClassifierPanicked(_) + | KvSchedulerError::RequestClassifierFailed(_) + | KvSchedulerError::InvalidClassificationMetadata(_) + ) + ) { + // Plugin-produced detail (its error text, or the metadata it + // returned) stays server-side: log it and return a fixed body. + tracing::warn!(error = %self, "request classifier failure sanitized from response"); + return ( + self.status(), + Json(serde_json::json!({"error": "request classifier failed"})), + ) + .into_response(); + } if let Self::Scheduler(KvSchedulerError::QueueRejected(rejection)) = &self { return ( self.status(), @@ -122,6 +147,10 @@ impl IntoResponse for SelectionError { mod tests { use super::*; + #[derive(Debug, thiserror::Error)] + #[error("private plugin detail")] + struct PrivateClassifierError; + #[test] fn filtered_workers_are_unavailable_not_overloaded() { assert_eq!( @@ -137,4 +166,32 @@ mod tests { StatusCode::TOO_MANY_REQUESTS.as_u16() ); } + + #[tokio::test] + async fn classifier_error_response_is_sanitized() { + let response = SelectionError::Scheduler(KvSchedulerError::RequestClassifierFailed( + std::sync::Arc::new(PrivateClassifierError), + )) + .into_response(); + + assert_eq!(response.status(), StatusCode::INTERNAL_SERVER_ERROR); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + assert_eq!(body.as_ref(), br#"{"error":"request classifier failed"}"#); + } + + #[tokio::test] + async fn invalid_classification_metadata_response_is_sanitized() { + let response = SelectionError::Scheduler(KvSchedulerError::InvalidClassificationMetadata( + "unknown policy class \"plugin-private-class\"".to_string(), + )) + .into_response(); + + assert_eq!(response.status(), StatusCode::INTERNAL_SERVER_ERROR); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + assert_eq!(body.as_ref(), br#"{"error":"request classifier failed"}"#); + } } From cedab728622a028125ed0fc81d51356b89e7f5a8 Mon Sep 17 00:00:00 2001 From: ishandhanani <82981111+ishandhanani@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:01:15 -0700 Subject: [PATCH 120/191] feat(router): add pluggable router flow control (#14123) Signed-off-by: Ishan Dhanani --- .../nvidia-request-extensions-nvext.md | 8 +- .../router/configuration-and-tuning.md | 5 +- .../router/custom-worker-selection.mdx | 10 + .../pages/use-cases/agents/agent-hints.md | 2 +- .../use-cases/agents/priority-scheduling.md | 4 +- lib/kv-router/src/scheduling/mod.rs | 2 +- lib/kv-router/src/scheduling/queue.rs | 74 +- .../src/scheduling/request_classifier.rs | 111 ++- .../scheduling/request_classifier/inputs.rs | 70 ++ lib/llm/src/kv_router.rs | 95 ++ .../kv_router/prefill_router/activation.rs | 2 + lib/llm/src/kv_router/routing_host.rs | 68 +- lib/llm/src/kv_router/routing_host/kv.rs | 112 ++- .../kv_router/routing_host/kv_selection.rs | 7 +- .../kv_router/routing_host/request_guard.rs | 70 +- lib/llm/src/kv_router/routing_host/tests.rs | 943 +++++++++++++++++- lib/llm/src/migration.rs | 131 ++- lib/llm/src/protocols/common/preprocessor.rs | 57 ++ .../network/egress/addressed_router.rs | 1 + 19 files changed, 1657 insertions(+), 115 deletions(-) create mode 100644 lib/kv-router/src/scheduling/request_classifier/inputs.rs diff --git a/docs/fern/pages/developer-guide/additional-resources/nvidia-request-extensions-nvext.md b/docs/fern/pages/developer-guide/additional-resources/nvidia-request-extensions-nvext.md index 28ef0272733b..8a01c6ec5c16 100644 --- a/docs/fern/pages/developer-guide/additional-resources/nvidia-request-extensions-nvext.md +++ b/docs/fern/pages/developer-guide/additional-resources/nvidia-request-extensions-nvext.md @@ -138,7 +138,7 @@ The `agent_hints` sub-object carries per-request hints that the router uses for | Field | Type | Default | Description | |-------|------|---------|-------------| | `priority` | `i32` | `None` | Unified soft request priority. Used for router policy scoring and backend scheduling/eviction. | -| `strict_priority` | `u32` | `None` | Router pending-queue tier. Higher values always precede lower values. Unset is equivalent to `0`. | +| `strict_priority` | `u32` | `None` | Router pending-queue tier. Higher values always precede lower values; see [Priority Scheduling](../../use-cases/agents/priority-scheduling.md) for due-time ordering within a tier. Unset is equivalent to `0`. | | `osl` | `u32` | `None` | Expected output sequence length (tokens). Used for output block tracking and resource estimation. | | `speculative_prefill` | `bool` | `false` | When `true`, speculatively prefills the predicted next-turn prompt after the current turn completes to warm the KV cache. | @@ -166,8 +166,10 @@ For layer-by-layer behavior and backend requirements, see `strict_priority` is an unsigned router-only tier for requests waiting in a router scheduler queue. The queue orders requests by -`(strict_priority, configured_policy_key)`, so FCFS, LCFS, or WSPT still orders -requests within the same tier. +`(strict_priority, due_at, configured_policy_key)`, so FCFS, LCFS, or WSPT still orders +requests within the same tier; see +[Priority Scheduling](../../use-cases/agents/priority-scheduling.md) for how due-time +ordering applies within a tier. This field does not change backend engine priority, preempt running work, or provide ordering across router replicas. It also does not prevent an eligible diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md index 1bf73f077663..08026aa76981 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md @@ -93,8 +93,9 @@ For how queue backpressure differs from candidate filtering and busy-threshold o YAML accept only `fcfs` and `wspt`. For each policy, the complete pending-queue key is -`(strict_priority, policy_key)`. Higher strict tiers always win; the selected -policy orders requests within a tier. +`(strict_priority, due_at, policy_key)`. Higher strict tiers always win; see +[Priority Scheduling](../../../../use-cases/agents/priority-scheduling.md) for how due-time +ordering applies within a tier. ### Worker-Selection Policies diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx index 13f04c85f6ac..0491a5ae4c7f 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx @@ -482,6 +482,16 @@ Standalone EPP supplies `WorkerType::Aggregated` because it selects from one ful +## Request Classifier Signals and Placement + +Rust request classifiers can defer admission while retaining independently pollable futures. `KvRouter::request_classifier_context()` supplies the router's cached worker view when constructing a classifier: + +- `block_size()` is the number of tokens per KV block. Each entry in `workers()` identifies a registered worker/rank and its advertised `total_kv_blocks()`, or `None` if capacity was not advertised. Their product is total capacity, not currently free space. The view follows existing discovery updates and does not probe worker health. +- `ClassifyRequest::progress()` returns a read-only context high-water mark, initialized from `input_tokens()` and raised by host observations of prompt plus generated tokens. Clones share a monotonic counter across migration retries. A new request lifecycle gets a fresh counter, even if it reuses a request ID. This measures logical tokens, not physical KV occupancy. +- `set_worker_selection_target(worker)` replaces the request's soft affinity preference; `clear_worker_selection_target()` removes that preference. Hard pins and caller eligibility constraints remain authoritative. A custom picker can fall back when the preferred worker is ineligible. The classifier's `Sent` event reports the worker actually used. + +Holding a classification future pauses admission before dispatch; it does not interrupt an already running generation. Worker filters, scorers, and pickers continue to own placement decisions within Dynamo's eligibility rules. + ## Policy Contract - Return `true` from a filter to keep a worker and `false` to reject it. diff --git a/docs/fern/pages/use-cases/agents/agent-hints.md b/docs/fern/pages/use-cases/agents/agent-hints.md index bbfd963f3aca..085705870bb2 100644 --- a/docs/fern/pages/use-cases/agents/agent-hints.md +++ b/docs/fern/pages/use-cases/agents/agent-hints.md @@ -29,7 +29,7 @@ Use hints only for serving-relevant intent. Use [session IDs](session-ids.mdx#se | Hint | Description | |------|-------------| | `priority` | Unified request priority. Higher values mean higher priority at the Dynamo API layer; see [Priority Scheduling](priority-scheduling.md) for router and backend requirements. | -| `strict_priority` | Router pending-queue tier. Higher values always precede lower values before the configured queue policy is applied. | +| `strict_priority` | Router pending-queue tier. Higher values always precede lower values before the configured queue policy is applied; see [Priority Scheduling](priority-scheduling.md) for due-time ordering within a tier. | | `osl` | Expected output sequence length in tokens. Used by the router for output block tracking and load-balancing accuracy when `--router-track-output-blocks` is enabled. | | `speculative_prefill` | When true, Dynamo can prefill the predicted next-turn prefix after the current turn completes to warm the KV cache for the next request. | diff --git a/docs/fern/pages/use-cases/agents/priority-scheduling.md b/docs/fern/pages/use-cases/agents/priority-scheduling.md index 9248f6aa08ef..880cb6dead41 100644 --- a/docs/fern/pages/use-cases/agents/priority-scheduling.md +++ b/docs/fern/pages/use-cases/agents/priority-scheduling.md @@ -49,10 +49,10 @@ The router queue only matters when requests are held before dispatch. If a reque `--router-queue-threshold` controls when the router starts holding requests. A request waits in the router queue while every eligible worker is above the configured threshold. The queue drains when capacity is available, and higher-priority requests are selected according to the queue key: ```text -(strict_priority, configured_policy_key) +(strict_priority, due_at, configured_policy_key) ``` -The strict tier is compared first. FCFS, LCFS, or Weighted Shortest Processing Time (WSPT) still computes the secondary key and orders requests within the same tier. +The strict tier is compared first. Within that tier, every request with a classifier-provided `due_at` is scheduled ahead of every request without one (an unset due time sorts last) before FCFS, LCFS, or Weighted Shortest Processing Time (WSPT) applies its configured policy key. Sustained deadline-bearing traffic can therefore starve non-deadline requests in the same class. A `due_at` is set only by a router request classifier; classifiers are not yet user-configurable. The default policy is `fcfs`, which uses the priority value as a positive arrival-time bump. Higher values move the request earlier in the queue. Negative priority values are clamped to zero for router queueing, so a request cannot be pushed behind normal first-come, first-served ordering by sending a negative priority. diff --git a/lib/kv-router/src/scheduling/mod.rs b/lib/kv-router/src/scheduling/mod.rs index cbaa84d0ea57..1ca16f081454 100644 --- a/lib/kv-router/src/scheduling/mod.rs +++ b/lib/kv-router/src/scheduling/mod.rs @@ -45,6 +45,6 @@ pub use prefill_load::{ pub use queue_admission::{RequestProgress, RequestProgressUpdater, WorkerPlacement}; pub use request_classifier::{ AbortCause, ClassifierError, ClassifyEvent, ClassifyFuture, ClassifyRequest, RequestClassifier, - RequestLifecycle, + RequestClassifierContext, RequestClassifierWorker, RequestLifecycle, }; pub use types::*; diff --git a/lib/kv-router/src/scheduling/queue.rs b/lib/kv-router/src/scheduling/queue.rs index cde1f4d3f01f..d120f186198c 100644 --- a/lib/kv-router/src/scheduling/queue.rs +++ b/lib/kv-router/src/scheduling/queue.rs @@ -23,7 +23,7 @@ use super::policy_config::{PolicyClassConfig, PolicyProfile}; use super::policy_queue::{PolicyQueue, QueueMetadata, QueueSnapshot}; use super::prefill_load::{PrefillLoadEstimator, effective_prefill_tokens}; use super::queue_admission::WorkerPlacement; -use super::request_classifier::ClassifyRequest; +use super::request_classifier::{ClassificationOverrides, ClassifyRequest}; use super::selector::{DefaultWorkerSelector, WorkerSelectionInput, WorkerSelector}; use super::types::{ AdvisorySchedulingResponse, AdvisoryWorkerLoad, AttemptId, KvSchedulerError, @@ -741,7 +741,7 @@ impl< } let queue_metadata = match classified_request { - Some(classified) => self.validate_classification(&request, classified, ingress_at), + Some(classified) => self.validate_classification(&mut request, classified, ingress_at), None => Ok(self.default_queue_metadata(&request, ingress_at)), }; let queue_metadata = match queue_metadata { @@ -879,11 +879,16 @@ impl< fn validate_classification( &self, - request: &SchedulingRequest, + request: &mut SchedulingRequest, classified_request: ClassifyRequest, ingress_at: Instant, ) -> Result { - let (policy_class, due_at, scheduling_cost_tokens) = classified_request.into_queue_inputs(); + let ClassificationOverrides { + policy_class, + due_at, + scheduling_cost_tokens, + worker_selection_target, + } = classified_request.into_queue_inputs(); if scheduling_cost_tokens == Some(0) { return Err(KvSchedulerError::InvalidClassificationMetadata( @@ -893,6 +898,14 @@ impl< // An already-expired `due_at` is not validated here: the actor is the // single deadline authority and rejects it at enqueue on its own clock. + // Hard pins must not acquire a conflicting soft target. Apply a permitted + // override before recomputing cache eligibility for the resulting target. + if request.pinned_worker.is_none() + && let Some(target) = worker_selection_target + { + request.affinity_target = target; + } + // Queue inputs are recomputed from the current workers, exactly as the // default path computes them: worker state may have changed while the // classification was pending, and only explicit overrides survive. @@ -2653,7 +2666,7 @@ policy_classes: classified.set_scheduling_cost_tokens(7); let metadata = queue - .validate_classification(&request, classified, ingress_at) + .validate_classification(&mut request, classified, ingress_at) .unwrap(); assert_eq!( queue.profile.class(metadata.class_index).name, @@ -2665,25 +2678,68 @@ policy_classes: let mut invalid = queue.build_classify_request(&request, ingress_at); invalid.set_policy_class("missing"); assert!(matches!( - queue.validate_classification(&request, invalid, ingress_at), + queue.validate_classification(&mut request, invalid, ingress_at), Err(KvSchedulerError::InvalidClassificationMetadata(_)) )); let mut physical = queue.build_classify_request(&request, ingress_at); physical.set_policy_class("latency_cached"); assert!(matches!( - queue.validate_classification(&request, physical, ingress_at), + queue.validate_classification(&mut request, physical, ingress_at), Err(KvSchedulerError::InvalidClassificationMetadata(_)) )); let mut zero_cost = queue.build_classify_request(&request, ingress_at); zero_cost.set_scheduling_cost_tokens(0); assert!(matches!( - queue.validate_classification(&request, zero_cost, ingress_at), + queue.validate_classification(&mut request, zero_cost, ingress_at), Err(KvSchedulerError::InvalidClassificationMetadata(_)) )); } + #[tokio::test] + async fn classifier_targets_preserve_pins_and_caller_eligibility() { + let (queue, _slots) = make_queue(2, 16, 64, None); + let (mut request, _rx) = make_request("targeted", 48); + let worker = WorkerWithDpRank::new(1, 0); + let pin = WorkerWithDpRank::new(0, 0); + let now = Instant::now(); + + let mut classified = queue.build_classify_request(&request, now); + classified.set_worker_selection_target(worker); + queue + .validate_classification(&mut request, classified, now) + .unwrap(); + assert_eq!(request.affinity_target, Some(worker.into())); + + let mut classified = queue.build_classify_request(&request, now); + classified.clear_worker_selection_target(); + queue + .validate_classification(&mut request, classified, now) + .unwrap(); + assert!(request.affinity_target.is_none()); + + request.pinned_worker = Some(pin); + let mut classified = queue.build_classify_request(&request, now); + classified.set_worker_selection_target(worker); + queue + .validate_classification(&mut request, classified, now) + .unwrap(); + assert_eq!(request.pinned_worker, Some(pin)); + assert!(request.affinity_target.is_none()); + request.pinned_worker = None; + request.allowed_worker_ids = Some(HashSet::from([0])); + let mut classified = queue.build_classify_request(&request, now); + classified.set_worker_selection_target(worker); + queue + .validate_classification(&mut request, classified, now) + .unwrap(); + assert_eq!(request.allowed_worker_ids, Some(HashSet::from([0]))); + // The selector still applies the allowlist after a classifier supplies a target. + let result = queue.select_without_admission(request).await.unwrap(); + assert_eq!(result.response.best_worker, pin); + } + #[tokio::test] async fn validation_recomputes_cache_eligibility_at_enqueue() { let profile = policy_profile( @@ -2720,7 +2776,7 @@ policy_classes: // uncached — exactly as an unclassified request admitted now would. cfg_tx.send(HashMap::new()).unwrap(); let metadata = queue - .validate_classification(&request, classified, ingress_at) + .validate_classification(&mut request, classified, ingress_at) .unwrap(); assert_eq!( queue.profile.class(metadata.class_index).name, diff --git a/lib/kv-router/src/scheduling/request_classifier.rs b/lib/kv-router/src/scheduling/request_classifier.rs index ae4c229d91ad..1d090e04b0dd 100644 --- a/lib/kv-router/src/scheduling/request_classifier.rs +++ b/lib/kv-router/src/scheduling/request_classifier.rs @@ -22,7 +22,11 @@ use tokio_util::sync::CancellationToken; use super::policy_queue::QueueSnapshot; use super::types::{KvSchedulerError, SessionContext}; -use crate::protocols::WorkerWithDpRank; +use crate::protocols::{WorkerAffinityTarget, WorkerWithDpRank}; + +mod inputs; +use super::queue_admission::{RequestProgress, RequestProgressUpdater}; +pub use inputs::{RequestClassifierContext, RequestClassifierWorker}; static NEXT_CLASSIFICATION_ID: AtomicU64 = AtomicU64::new(1); static NEXT_LIFECYCLE_GENERATION: AtomicU64 = AtomicU64::new(1); @@ -36,14 +40,16 @@ pub struct ClassifyRequest { ingress_at: Instant, input_tokens: usize, initial_cached_tokens: usize, + progress: RequestProgress, session_context: Option, } #[derive(Clone, Debug, Default)] -struct ClassificationOverrides { - policy_class: Option, - due_at: Option, - scheduling_cost_tokens: Option, +pub(crate) struct ClassificationOverrides { + pub(crate) policy_class: Option, + pub(crate) due_at: Option, + pub(crate) scheduling_cost_tokens: Option, + pub(crate) worker_selection_target: Option>, } impl ClassifyRequest { @@ -65,6 +71,7 @@ impl ClassifyRequest { ingress_at, input_tokens, initial_cached_tokens, + progress: RequestProgress::new(input_tokens).0, session_context: None, } } @@ -103,6 +110,13 @@ impl ClassifyRequest { self.input_tokens } + /// Live context high-water mark, initialized from `input_tokens()` and raised + /// by host observations of prompt plus generated tokens. This is not physical + /// KV occupancy. The host alone updates this request's counter. + pub fn progress(&self) -> &RequestProgress { + &self.progress + } + /// Return the original router ingress time on the monotonic clock. pub fn ingress_at(&self) -> Instant { self.ingress_at @@ -126,6 +140,18 @@ impl ClassifyRequest { self.overrides.scheduling_cost_tokens = Some(scheduling_cost_tokens); } + /// Prefer a worker/rank for this request, replacing its soft affinity target. + /// Hard pins and caller eligibility constraints remain authoritative. A custom + /// selector can fall back if the target is ineligible; `Sent` reports the result. + pub fn set_worker_selection_target(&mut self, worker: WorkerWithDpRank) { + self.overrides.worker_selection_target = Some(Some(worker.into())); + } + + /// Clear this request's soft affinity preference without changing hard pins. + pub fn clear_worker_selection_target(&mut self) { + self.overrides.worker_selection_target = Some(None); + } + pub fn session_context(&self) -> Option<&SessionContext> { self.session_context.as_ref() } @@ -133,12 +159,8 @@ impl ClassifyRequest { /// Only the explicit overrides feed the queue: cache eligibility is /// recomputed from the current workers at enqueue, because worker state /// may have changed while the classification was pending. - pub(crate) fn into_queue_inputs(self) -> (Option, Option, Option) { - ( - self.overrides.policy_class, - self.overrides.due_at, - self.overrides.scheduling_cost_tokens, - ) + pub(crate) fn into_queue_inputs(self) -> ClassificationOverrides { + self.overrides } } @@ -242,6 +264,8 @@ pub trait RequestClassifier: Send + 'static { struct LiveRequest { generation: u64, overrides: Option, + progress: RequestProgress, + progress_updater: RequestProgressUpdater, } /// Terminal events enqueued for delivery but not yet delivered, per request @@ -377,6 +401,9 @@ impl RequestClassifierRuntime { let live = live_requests.get(request_id).ok_or_else(|| { KvSchedulerError::ClassificationLifecycleEnded(request_id.to_owned()) })?; + live.progress_updater + .update_context_tokens(request.input_tokens); + request.progress = live.progress.clone(); if let Some(overrides) = live.overrides.clone() { request.overrides = overrides; return Ok(request); @@ -452,24 +479,29 @@ impl RequestClassifierRuntime { if self.shutdown.is_cancelled() { return Err(KvSchedulerError::SubscriberShutdown); } - match self.live_requests.lock().entry(request_id.to_owned()) { + let progress_updater = match self.live_requests.lock().entry(request_id.to_owned()) { std::collections::hash_map::Entry::Occupied(_) => { return Err(KvSchedulerError::DuplicateClassificationRequestId( request_id.to_owned(), )); } std::collections::hash_map::Entry::Vacant(entry) => { + let (progress, progress_updater) = RequestProgress::new(0); entry.insert(LiveRequest { generation: NEXT_LIFECYCLE_GENERATION.fetch_add(1, Ordering::Relaxed), overrides: None, + progress, + progress_updater: progress_updater.clone(), }); + progress_updater } - } + }; Ok(RequestLifecycle { runtime: Arc::clone(self), request_id: request_id.to_owned(), worker: None, context_tokens: None, + progress_updater, phase: LifecyclePhase::Registered, }) } @@ -563,6 +595,7 @@ pub struct RequestLifecycle { request_id: String, worker: Option, context_tokens: Option, + progress_updater: RequestProgressUpdater, phase: LifecyclePhase, } @@ -617,20 +650,28 @@ impl RequestLifecycle { /// Order matters: [`Self::observe_context_tokens`] floors the same total, /// so report a context before its outputs or the floor erases them. pub fn observe_output_tokens(&mut self, output_tokens: usize) { - self.context_tokens = Some( - self.context_tokens - .unwrap_or_default() - .saturating_add(output_tokens), - ); + if self.phase == LifecyclePhase::Terminal { + return; + } + let context_tokens = self + .context_tokens + .unwrap_or_default() + .saturating_add(output_tokens); + self.context_tokens = Some(context_tokens); + self.progress_updater.update_context_tokens(context_tokens); } /// Raise the context total to at least `context_tokens` (an /// engine-reported absolute count). pub fn observe_context_tokens(&mut self, context_tokens: usize) { + if self.phase == LifecyclePhase::Terminal { + return; + } self.context_tokens = Some( self.context_tokens .map_or(context_tokens, |current| current.max(context_tokens)), ); + self.progress_updater.update_context_tokens(context_tokens); } pub fn prepare_retry(&mut self) { @@ -876,7 +917,11 @@ mod tests { assert_eq!(result.request_id(), Some("request-1")); assert_eq!(result.policy_class(), Some("latency")); assert_eq!(result.scheduling_cost_tokens(), 96); - assert_eq!(result.into_queue_inputs(), (None, None, None)); + let inputs = result.into_queue_inputs(); + assert!(inputs.policy_class.is_none()); + assert!(inputs.due_at.is_none()); + assert!(inputs.scheduling_cost_tokens.is_none()); + assert!(inputs.worker_selection_target.is_none()); } struct EventReleasedClassifier { @@ -1016,6 +1061,7 @@ mod tests { fn classify(&mut self, mut request: ClassifyRequest) -> ClassifyFuture { self.calls.fetch_add(1, Ordering::Relaxed); request.set_scheduling_cost_tokens(7); + request.set_worker_selection_target(WorkerWithDpRank::new(9, 1)); Box::pin(async move { Ok(request) }) } } @@ -1035,6 +1081,11 @@ mod tests { .classify_with(ClassifyRequest::new(10, 10).with_request_id("request-1")) .await .unwrap(); + assert_eq!(first.progress().context_tokens(), 10); + lifecycle.observe_context_tokens(10); + lifecycle.observe_output_tokens(15); + assert_eq!(first.progress().context_tokens(), 25); + lifecycle.prepare_retry(); let retry = runtime .classify_with(ClassifyRequest::new(20, 20).with_request_id("request-1")) .await @@ -1044,7 +1095,29 @@ mod tests { assert_eq!(first.input_tokens(), 10); assert_eq!(retry.input_tokens(), 20); assert_eq!(retry.scheduling_cost_tokens(), 7); + assert_eq!(retry.progress().context_tokens(), 25); + assert_eq!( + retry.overrides.worker_selection_target, + Some(Some(WorkerWithDpRank::new(9, 1).into())) + ); + lifecycle.observe_context_tokens(50); + lifecycle.observe_context_tokens(30); + assert_eq!(first.progress().context_tokens(), 50); + assert_eq!(retry.progress().context_tokens(), 50); lifecycle.abort(None); + + let mut next_lifecycle = runtime.begin_request("request-1").unwrap(); + let next = runtime + .classify_with(ClassifyRequest::new(3, 0).with_request_id("request-1")) + .await + .unwrap(); + next_lifecycle.observe_context_tokens(3); + next_lifecycle.observe_output_tokens(4); + lifecycle.observe_output_tokens(100); + assert_eq!(next.progress().context_tokens(), 7); + assert_eq!(first.progress().context_tokens(), 50); + assert_eq!(calls.load(Ordering::Relaxed), 2); + next_lifecycle.abort(None); } // `LocalScheduler::classify_request` routes ids with no registered diff --git a/lib/kv-router/src/scheduling/request_classifier/inputs.rs b/lib/kv-router/src/scheduling/request_classifier/inputs.rs new file mode 100644 index 000000000000..ba154782dfa8 --- /dev/null +++ b/lib/kv-router/src/scheduling/request_classifier/inputs.rs @@ -0,0 +1,70 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::sync::Arc; + +use crate::protocols::WorkerWithDpRank; + +/// One registered worker rank and its advertised capacity, which may be absent. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct RequestClassifierWorker { + worker: WorkerWithDpRank, + total_kv_blocks: Option, +} + +impl RequestClassifierWorker { + pub fn new(worker: WorkerWithDpRank, total_kv_blocks: Option) -> Self { + Self { + worker, + total_kv_blocks, + } + } + + pub fn worker(&self) -> WorkerWithDpRank { + self.worker + } + + /// Total capacity from the worker's runtime config, not currently free blocks. + /// Each block contains [`RequestClassifierContext::block_size`] tokens. + pub fn total_kv_blocks(&self) -> Option { + self.total_kv_blocks + } +} + +/// Cached discovery inputs for one router. Workers appear and disappear as the +/// host processes registration updates; this does not probe worker health. +#[derive(Clone)] +pub struct RequestClassifierContext { + block_size: u32, + workers: Arc Vec + Send + Sync>, +} + +impl RequestClassifierContext { + /// The callback must return cached state without blocking I/O. + pub fn new( + block_size: u32, + workers: impl Fn() -> Vec + Send + Sync + 'static, + ) -> Self { + Self { + block_size, + workers: Arc::new(workers), + } + } + + pub fn block_size(&self) -> u32 { + self.block_size + } + + pub fn workers(&self) -> Vec { + (self.workers)() + } +} + +impl std::fmt::Debug for RequestClassifierContext { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter + .debug_struct("RequestClassifierContext") + .field("block_size", &self.block_size) + .finish_non_exhaustive() + } +} diff --git a/lib/llm/src/kv_router.rs b/lib/llm/src/kv_router.rs index ab6f9c373929..acac342a5f56 100644 --- a/lib/llm/src/kv_router.rs +++ b/lib/llm/src/kv_router.rs @@ -26,6 +26,7 @@ use dynamo_kv_router::{ }, scheduling::{ CacheHitEstimates, OverlapAnalysis, OverloadedWorkerProvider, PotentialLoad, + RequestClassifier, RequestClassifierContext, RequestClassifierWorker, WorkerAvailabilityProvider, effective_prefill_tokens, overlap::cache_hit_estimates_from_tiered_matches, queue::{BookingHandle, SchedulerBookingDescriptor}, @@ -910,6 +911,51 @@ impl KvRouter { self.endpoint_registration = Some(registration); } + /// Attach a request classifier before placing this router into service. + /// Classifier lifecycles belong to decode/aggregated routing; prefill hops bypass them. + // TODO: wire a production installer (Python bindings / router config); hidden until then. + #[doc(hidden)] + pub fn with_request_classifier(self, classifier: impl RequestClassifier) -> Result { + if !self + .selection + .scheduler() + .install_request_classifier(Box::new(classifier), self.cancellation_token.child_token()) + { + anyhow::bail!("request classifier is already configured"); + } + Ok(self) + } + + /// Cached per-rank capacity and registration state for this router's classifier. + pub fn request_classifier_context(&self) -> RequestClassifierContext { + let workers = self.workers_with_configs.clone(); + RequestClassifierContext::new(self.block_size, move || { + workers + .borrow() + .iter() + .flat_map(|(&worker_id, config)| { + let start = config.data_parallel_start_rank(); + let end = start.saturating_add(config.data_parallel_size()); + (start..end).map(move |rank| { + RequestClassifierWorker::new( + WorkerWithDpRank::new(worker_id, rank), + config.total_kv_blocks(), + ) + }) + }) + .collect() + }) + } + + pub(crate) fn begin_request_lifecycle( + &self, + request_id: &str, + ) -> Result, KvSchedulerError> { + self.selection + .scheduler() + .begin_request_lifecycle(request_id) + } + pub(crate) fn set_teardown_task_guard( &mut self, task_guard: dynamo_runtime::engine::EngineContextGuard, @@ -2247,6 +2293,55 @@ mod tests { .await } + #[tokio::test] + async fn classifier_context_tracks_capacity_and_registered_ranks() { + let mut router = make_router_without_membership(Some(WorkerType::Decode)) + .await + .unwrap(); + let (tx, workers) = watch::channel(HashMap::from([ + ( + 7, + ModelRuntimeConfig { + total_kv_blocks: Some(100), + data_parallel_start_rank: 2, + data_parallel_size: 2, + ..Default::default() + }, + ), + (8, ModelRuntimeConfig::default()), + ])); + router.workers_with_configs = workers; + let context = router.request_classifier_context(); + assert_eq!(context.block_size(), 16); + let mut snapshot = context.workers(); + snapshot.sort_by_key(RequestClassifierWorker::worker); + assert_eq!( + snapshot, + vec![ + RequestClassifierWorker::new(WorkerWithDpRank::new(7, 2), Some(100)), + RequestClassifierWorker::new(WorkerWithDpRank::new(7, 3), Some(100)), + RequestClassifierWorker::new(WorkerWithDpRank::new(8, 0), None), + ] + ); + tx.send(HashMap::from([( + 8, + ModelRuntimeConfig { + total_kv_blocks: Some(200), + ..Default::default() + }, + )])) + .unwrap(); + assert_eq!( + context.workers(), + vec![RequestClassifierWorker::new( + WorkerWithDpRank::new(8, 0), + Some(200) + ),] + ); + tx.send(HashMap::new()).unwrap(); + assert!(context.workers().is_empty()); + } + #[tokio::test] async fn constructor_skips_sources_for_decode_but_preserves_unknown_behavior() { let router = make_router_without_membership(Some(WorkerType::Decode)) diff --git a/lib/llm/src/kv_router/prefill_router/activation.rs b/lib/llm/src/kv_router/prefill_router/activation.rs index 8fbf22f7051d..1ed8f4902ebc 100644 --- a/lib/llm/src/kv_router/prefill_router/activation.rs +++ b/lib/llm/src/kv_router/prefill_router/activation.rs @@ -774,6 +774,8 @@ mod tests { child .args(["--exact", test_name, "--nocapture"]) .env("DYNAMO_ROUTING_HOP_TEST", test_name) + // The debug routing future exceeds libtest's default 2 MiB stack. + .env("RUST_MIN_STACK", (4 * 1024 * 1024).to_string()) .env("DYN_TCP_RPC_HOST", "127.0.0.1") .env("DYN_TCP_RPC_PORT", "0") .env("DYN_TCP_RESPONSE_STREAM_HOST", "127.0.0.1") diff --git a/lib/llm/src/kv_router/routing_host.rs b/lib/llm/src/kv_router/routing_host.rs index 8fe847f8571d..a9f259d7c3ea 100644 --- a/lib/llm/src/kv_router/routing_host.rs +++ b/lib/llm/src/kv_router/routing_host.rs @@ -10,6 +10,7 @@ use std::{ use dynamo_kv_router::{ protocols::{TokensWithHashes, WorkerConfigLike, WorkerWithDpRank}, + scheduling::{AbortCause, KvSchedulerError}, selector::{WorkerInputs, WorkerSelector}, }; use dynamo_runtime::{ @@ -35,6 +36,7 @@ use crate::{ FinishReason, extensions::SessionAffinityId, llm_backend::LLMEngineOutput, + preprocessor::owned_abort_error, timing::{RequestPhase, RoutingData, WORKER_TYPE_DECODE, WORKER_TYPE_PREFILL}, }, session_affinity::{ @@ -67,6 +69,57 @@ pub(crate) fn is_cancelled(error: &Error) -> bool { match_error_chain(error.as_ref(), &[ErrorType::Cancelled], &[]) } +fn classification_failure(error: &Error) -> Option<&KvSchedulerError> { + error.chain().find_map(|cause| { + let error = cause.downcast_ref::()?; + matches!( + error, + KvSchedulerError::RequestClassifierPanicked(_) + | KvSchedulerError::RequestClassifierFailed(_) + | KvSchedulerError::InvalidClassificationMetadata(_) + ) + .then_some(error) + }) +} + +fn classifier_abort_error(error: &KvSchedulerError) -> Arc { + match error { + KvSchedulerError::RequestClassifierFailed(source) => Arc::clone(source), + _ => owned_abort_error(error), + } +} + +/// The client-facing error for a classifier failure. A typed [`DynamoError`] +/// returned by the plugin is an intentional, client-visible decision (flow +/// control) and passes through with its status; everything else is sanitized +/// to hide classifier internals from the client and logged for the operator. +fn classifier_failure_response(request_id: &str, error: &KvSchedulerError) -> Error { + if let KvSchedulerError::RequestClassifierFailed(source) = error { + let mut cause: Option<&(dyn std::error::Error + 'static)> = Some(source.as_ref()); + while let Some(current) = cause { + if let Some(typed) = current.downcast_ref::() { + // A load-shedding classifier rejects by design, one request at + // a time; that is not an operator error. + tracing::debug!( + request_id = %request_id, + error = %typed, + "request classifier rejected request" + ); + return crate::migration::ClassifierRejection(typed.clone()).into(); + } + cause = current.source(); + } + } + // The client only sees the sanitized error below, so this log is the + // operator's sole copy of the original failure. + tracing::error!(request_id = %request_id, error = %error, "request classifier failed"); + DynamoError::builder() + .error_type(ErrorType::Unknown) + .message("request classifier failed") + .build() + .into() +} + fn route_target(worker: WorkerWithDpRank) -> AffinityTarget { AffinityTarget::new(worker.worker_id, Some(worker.dp_rank)) } @@ -117,8 +170,19 @@ fn monitor_response_stream( guard.record_migration_failure(item.error.clone()); // Release the failed attempt before Migration can observe // the item and start another one. This keeps serialized - // retries free of stale-cleanup ABA races. - guard.abort().await; + // retries free of stale-cleanup ABA races. A migratable + // failure hands the classifier lifecycle to the retry, + // exactly like a dispatch-time failure; anything else is + // terminal for the logical request and aborts it here. + let migratable = item + .error + .as_ref() + .is_some_and(|error| crate::migration::is_migratable(error)); + if !migratable || !guard.release_for_retry().await { + guard + .abort_with_error(item.error.as_ref().map(|e| e as &AbortCause)) + .await; + } yield item; break false; } diff --git a/lib/llm/src/kv_router/routing_host/kv.rs b/lib/llm/src/kv_router/routing_host/kv.rs index 650172bac3e9..88498369b9fe 100644 --- a/lib/llm/src/kv_router/routing_host/kv.rs +++ b/lib/llm/src/kv_router/routing_host/kv.rs @@ -89,10 +89,87 @@ impl RoutingHost { budget: &CleanupBudget, ) -> Result<(WorkerSelection, Option), Error> { self.validate_explicit_worker(request.content(), phase)?; - self.select_with_session_affinity(request, phase, is_query_only, budget, |target| { - self.select_request(request, phase, is_query_only, target, budget) - }) - .await + let select = || { + self.select_with_session_affinity(request, phase, is_query_only, budget, |target| { + self.select_request(request, phase, is_query_only, target, budget) + }) + }; + if is_query_only { + return select().await; + } + self.select_with_request_lifecycle(request, phase, select) + .await + } + + /// Claim or begin the classifier lifecycle for `request`, run the selection + /// future built by `select` under it, and attach it to the selection. + /// Selection failures either park the lifecycle for a migration retry or + /// abort it with the cause. + /// + /// `select` is a constructor rather than a future so the selection future + /// lives in exactly one slot: taking it by value gave the caller's future a + /// second copy, and in debug builds that doubled footprint overflowed the + /// test-thread stack under `block_on`. + async fn select_with_request_lifecycle( + &self, + request: &SingleIn, + phase: RequestPhase, + select: impl FnOnce() -> Fut, + ) -> Result<(WorkerSelection, Option), Error> + where + Fut: Future), Error>>, + { + // Decode/aggregated routing owns the logical request's classifier. + // A retry can run prefill again with the same MigrationState; that hop + // must leave the parked decode lifecycle for the decode host to resume. + match phase { + RequestPhase::Prefill => return select().await, + RequestPhase::Decode | RequestPhase::Aggregated => {} + } + let mut lifecycle = request + .migration_state + .as_ref() + .and_then(|state| state.take_request_lifecycle()); + if lifecycle.is_none() { + lifecycle = self + .kv_router() + .begin_request_lifecycle(request.context().id()) + .map_err(|error| classifier_failure_response(request.context().id(), &error))? + .map(Box::new); + } + + let (mut selection, affinity) = match select().await { + Ok(selection) => selection, + Err(error) => { + if let Some(mut lifecycle) = lifecycle.take() { + if let Some(classifier_error) = classification_failure(&error) { + lifecycle.abort(Some(classifier_abort_error(classifier_error))); + return Err(classifier_failure_response( + request.context().id(), + classifier_error, + )); + } + if crate::migration::is_migratable(error.as_ref()) + && let Some(state) = request.migration_state.as_ref() + { + lifecycle.prepare_retry(); + state.store_request_lifecycle(lifecycle); + } else { + lifecycle.abort(Some( + crate::protocols::common::preprocessor::owned_abort_error( + error.as_ref(), + ), + )); + } + } + return Err(error); + } + }; + if let Some(lifecycle) = lifecycle.as_mut() { + lifecycle.selected(selection.worker); + } + selection.request_lifecycle = lifecycle; + Ok((selection, affinity)) } fn route_signals(&self, selection: &WorkerSelection) -> RoutePlanSignals { @@ -179,8 +256,8 @@ impl RoutingHost { let phase_label = phase.to_string(); let route_guard = StageGuard::new(STAGE_ROUTE, &phase_label); let planned_worker = preview.signals.worker; - let (mut selection, affinity) = self - .select_with_session_affinity(request, phase, false, &budget, |target| { + let select = || { + self.select_with_session_affinity(request, phase, false, &budget, |target| { let budget = &budget; async move { self.select_request_outcome( @@ -196,6 +273,9 @@ impl RoutingHost { .into_result() } }) + }; + let (mut selection, affinity) = self + .select_with_request_lifecycle(request, phase, select) .await?; let signals = self.route_signals(&selection); drop(route_guard); @@ -331,9 +411,12 @@ impl RoutingHost { let block_size = chooser.block_size() as usize; let selected_worker = selection.worker; let mut guard = match cleanup { - Some(cleanup) => { - RequestGuard::new_kv_with_cleanup(self.request_metrics.clone(), cleanup, request) - } + Some(cleanup) => RequestGuard::new_kv_with_cleanup( + self.request_metrics.clone(), + cleanup, + request, + selection.request_lifecycle.take(), + ), None => RequestGuard::new_kv( Arc::clone(chooser), self.request_metrics.clone(), @@ -341,6 +424,7 @@ impl RoutingHost { selected_worker, selection.booking.take(), request, + selection.request_lifecycle.take(), ), }; @@ -428,7 +512,7 @@ impl RoutingHost { .await; if let Err(error) = record_result { - guard.abort().await; + guard.abort_with_error(Some(error.as_ref())).await; return Err(error); } Ok(guard) @@ -506,7 +590,11 @@ impl RoutingHost { .chain() .find_map(|cause| cause.downcast_ref::().cloned()); guard.record_migration_failure(typed_error); - guard.abort().await; + if !crate::migration::is_migratable(error.as_ref()) + || !guard.release_for_retry().await + { + guard.abort_with_error(Some(error.as_ref())).await; + } return Err(error); } }; @@ -577,7 +665,7 @@ impl RoutingHost { let metadata = match prepare(&mut request, selected_target) { Ok(metadata) => metadata, Err(error) => { - guard.abort().await; + guard.abort_with_error(Some(error.as_ref())).await; return Err(error); } }; diff --git a/lib/llm/src/kv_router/routing_host/kv_selection.rs b/lib/llm/src/kv_router/routing_host/kv_selection.rs index fb76a5387b78..00f16608e8fa 100644 --- a/lib/llm/src/kv_router/routing_host/kv_selection.rs +++ b/lib/llm/src/kv_router/routing_host/kv_selection.rs @@ -10,7 +10,10 @@ use dynamo_kv_router::{ protocols::{ BlockExtraInfo, RoutingConstraints, WorkerAffinityTarget, WorkerId, WorkerWithDpRank, }, - scheduling::{AdvisoryWorkerLoad, QueueRejection, RoutingEligibility, queue::BookingHandle}, + scheduling::{ + AdvisoryWorkerLoad, QueueRejection, RequestLifecycle, RoutingEligibility, + queue::BookingHandle, + }, }; use dynamo_runtime::{dynamo_nvtx_range, pipeline::Error}; @@ -35,6 +38,7 @@ pub(super) struct WorkerSelection { pub(super) selected_worker_load: Option, pub(super) routing_hashes: Option, pub(super) kv_hint: Option, + pub(super) request_lifecycle: Option>, } // Transient return value; `Routed` is moved into `WorkerSelection` right away. @@ -142,6 +146,7 @@ impl RoutingHost { selected_worker_load: admitted.advisory_load, routing_hashes, kv_hint, + request_lifecycle: None, })), FindBestMatchOutcome::QueueRejected { rejection } => { Ok(SelectionOutcome::QueueRejected(rejection)) diff --git a/lib/llm/src/kv_router/routing_host/request_guard.rs b/lib/llm/src/kv_router/routing_host/request_guard.rs index 135eec5ab788..45c00f58711a 100644 --- a/lib/llm/src/kv_router/routing_host/request_guard.rs +++ b/lib/llm/src/kv_router/routing_host/request_guard.rs @@ -22,7 +22,7 @@ use dynamo_kv_router::{ BlockExtraInfo, BlockHashOptions, WorkerWithDpRank, compute_block_hash_for_seq, compute_next_seq_hash, }, - scheduling::queue::BookingHandle, + scheduling::{AbortCause, RequestLifecycle, queue::BookingHandle}, }; use dynamo_runtime::{ error::DynamoError, @@ -393,6 +393,9 @@ pub(super) struct KvRequestCleanup { worker: WorkerWithDpRank, approximate_lru: Option, lifecycle: Option, + /// Classifier lifecycle for this attempt. Living here keeps it structurally + /// tied to KV routing: builtin and occupancy cleanups cannot hold one. + request_lifecycle: Option>, } impl KvRequestCleanup { @@ -422,6 +425,7 @@ impl KvRequestCleanup { worker, approximate_lru, lifecycle, + request_lifecycle: None, } } @@ -494,6 +498,20 @@ impl RequestCleanup { } } + fn request_lifecycle_mut(&mut self) -> Option<&mut RequestLifecycle> { + match self { + Self::Kv(cleanup) => cleanup.request_lifecycle.as_deref_mut(), + Self::Stateless { .. } | Self::Occupancy { .. } => None, + } + } + + fn take_request_lifecycle(&mut self) -> Option> { + match self { + Self::Kv(cleanup) => cleanup.request_lifecycle.take(), + Self::Stateless { .. } | Self::Occupancy { .. } => None, + } + } + async fn finish(&mut self) { match self { Self::Kv(cleanup) => cleanup.finish().await, @@ -562,19 +580,26 @@ impl RequestGuard { worker: WorkerWithDpRank, booking: Option, request: &PreprocessedRequest, + request_lifecycle: Option>, ) -> Self { Self::new_kv_with_cleanup( request_metrics, KvRequestCleanup::new(chooser, context_id, worker, booking), request, + request_lifecycle, ) } pub(super) fn new_kv_with_cleanup( request_metrics: Arc, - cleanup: KvRequestCleanup, + mut cleanup: KvRequestCleanup, request: &PreprocessedRequest, + mut request_lifecycle: Option>, ) -> Self { + if let Some(lifecycle) = request_lifecycle.as_mut() { + lifecycle.observe_context_tokens(request.expanded_prompt_token_count()); + } + cleanup.request_lifecycle = request_lifecycle; let chooser = &cleanup.chooser; let block_size = chooser.block_size() as usize; let isl_tokens = request.token_ids.len(); @@ -665,6 +690,12 @@ impl RequestGuard { pub(super) fn mark_dispatched(&mut self) { self.observability.mark_dispatched(); + if let RequestCleanup::Kv(cleanup) = &mut self.cleanup { + let worker = cleanup.worker; + if let Some(lifecycle) = cleanup.request_lifecycle.as_mut() { + lifecycle.sent(worker); + } + } } pub(super) fn has_approximate_lru(&self) -> bool { @@ -703,6 +734,18 @@ impl RequestGuard { { lifecycle.touch(); } + if let Some(lifecycle) = self.cleanup.request_lifecycle_mut() { + lifecycle.responding(); + lifecycle.observe_output_tokens(new_tokens); + if let Some(total_tokens) = item + .data + .as_ref() + .and_then(|data| data.completion_usage.as_ref()) + .map(|usage| usage.total_tokens as usize) + { + lifecycle.observe_context_tokens(total_tokens); + } + } if !self.prefill_marked { let has_tokens = item .data @@ -776,6 +819,9 @@ impl RequestGuard { } pub(super) async fn finish(&mut self) { + if let Some(lifecycle) = self.cleanup.request_lifecycle_mut() { + lifecycle.complete(); + } // Metrics must observe the completed request before cleanup releases its state. self.observability .record_metrics(self.record_itl_at_completion); @@ -783,6 +829,26 @@ impl RequestGuard { } pub(super) async fn abort(&mut self) { + self.abort_with_error(None).await; + } + + pub(super) async fn release_for_retry(&mut self) -> bool { + let Some(migration_state) = self.migration_state.as_ref() else { + return false; + }; + let Some(mut lifecycle) = self.cleanup.take_request_lifecycle() else { + return false; + }; + lifecycle.prepare_retry(); + migration_state.store_request_lifecycle(lifecycle); + self.cleanup.finish().await; + true + } + + pub(super) async fn abort_with_error(&mut self, error: Option<&AbortCause>) { + if let Some(lifecycle) = self.cleanup.request_lifecycle_mut() { + lifecycle.abort(error.map(crate::protocols::common::preprocessor::owned_abort_error)); + } self.cleanup.finish().await; } } diff --git a/lib/llm/src/kv_router/routing_host/tests.rs b/lib/llm/src/kv_router/routing_host/tests.rs index 7cae3e4fdab4..25eaa3eb288f 100644 --- a/lib/llm/src/kv_router/routing_host/tests.rs +++ b/lib/llm/src/kv_router/routing_host/tests.rs @@ -5,14 +5,19 @@ use std::{ collections::{HashMap, HashSet}, sync::{ Arc, Mutex, - atomic::{AtomicBool, Ordering}, + atomic::{AtomicBool, AtomicUsize, Ordering}, }, time::{Duration, Instant}, }; -use dynamo_kv_router::{config::KvRouterConfig, protocols::RoutingConstraints}; - use crate::kv_router::SelectionPolicySource; +use dynamo_kv_router::{ + config::KvRouterConfig, + protocols::RoutingConstraints, + scheduling::{ + ClassifierError, ClassifyEvent, ClassifyFuture, ClassifyRequest, RequestClassifier, + }, +}; use dynamo_runtime::{ DistributedRuntime, Runtime, component::{Client, Instance}, @@ -26,7 +31,7 @@ use dynamo_runtime::{ storage::kv::Selector, traits::DistributedRuntimeProvider, }; -use tokio::sync::watch; +use tokio::sync::{Notify, mpsc, watch}; use super::*; use crate::{ @@ -37,6 +42,7 @@ use crate::{ migration::Migration, protocols::common::{ extensions::{SESSION_AFFINITY_CONTEXT_KEY, SessionAffinityId}, + preprocessor::{MmRoutingInfo, RoutingHints}, timing::RequestTracker, }, }; @@ -672,6 +678,7 @@ async fn terminal_item_does_not_skip_transport_eof() { WorkerWithDpRank::from_worker_id(0), None, &request(), + None, ); let monitored = monitor_response_stream(source, context, guard); tokio::pin!(monitored); @@ -741,6 +748,7 @@ async fn shutdown_cancellation_drains_trailing_engine_shutdown_error() { WorkerWithDpRank::from_worker_id(0), None, &request(), + None, ); let monitored = monitor_response_stream(source, context, guard); tokio::pin!(monitored); @@ -787,6 +795,7 @@ async fn client_cancellation_still_ends_stream_without_draining() { WorkerWithDpRank::from_worker_id(0), None, &request(), + None, ); let monitored = monitor_response_stream(source, context, guard); tokio::pin!(monitored); @@ -825,6 +834,7 @@ async fn drain_without_trailing_error_gives_up_at_the_deadline() { WorkerWithDpRank::from_worker_id(0), None, &request(), + None, ); let monitored = monitor_response_stream(source, context, guard); tokio::pin!(monitored); @@ -880,6 +890,7 @@ async fn trailing_error_within_the_drain_window_still_reaches_migration() { WorkerWithDpRank::from_worker_id(0), None, &request(), + None, ); let monitored = monitor_response_stream(source, context, guard); tokio::pin!(monitored); @@ -926,6 +937,7 @@ async fn always_ready_terminals_cannot_starve_the_drain_deadline() { WorkerWithDpRank::from_worker_id(0), None, &request(), + None, ); let monitored = monitor_response_stream(source, context, guard); tokio::pin!(monitored); @@ -1151,6 +1163,32 @@ async fn router_with_workers( async fn router_with_worker_configs( session_affinity_ttl: Option, workers: HashMap, +) -> (RoutingHost, Runtime) { + // Keep the large construction future off debug test stacks. + Box::pin(router_with_worker_configs_and_classifier( + session_affinity_ttl, + workers, + None::, + )) + .await +} + +async fn router_with_classifier( + classifier: impl RequestClassifier, + session_affinity_ttl: Option, +) -> (RoutingHost, Runtime) { + router_with_worker_configs_and_classifier( + session_affinity_ttl, + HashMap::from([(7, ModelRuntimeConfig::default())]), + Some(classifier), + ) + .await +} + +async fn router_with_worker_configs_and_classifier( + session_affinity_ttl: Option, + workers: HashMap, + classifier: Option, ) -> (RoutingHost, Runtime) { let runtime = Runtime::from_current().unwrap(); // Each runtime has its own in-memory discovery store, so fixture namespaces can repeat. @@ -1172,7 +1210,7 @@ async fn router_with_worker_configs( router_track_active_blocks: false, ..Default::default() }; - let chooser = KvRouter::new( + let mut chooser = KvRouter::new( endpoint, client.clone(), workers, @@ -1189,6 +1227,9 @@ async fn router_with_worker_configs( ) .await .unwrap(); + if let Some(classifier) = classifier { + chooser = chooser.with_request_classifier(classifier).unwrap(); + } let inner = PushRouter::from_client(client, RouterMode::KV) .await .unwrap(); @@ -1378,6 +1419,535 @@ async fn kv_cancellation_after_admission_still_stops_the_aggregated_dispatch() { runtime.shutdown(); } +#[derive(Debug, PartialEq, Eq)] +enum ClassifierObservation { + Completed(usize), + /// The typed cause the plugin received, if the abort carried one. + Aborted { + cause: Option, + }, +} + +fn abort_cause_type(error: &(dyn std::error::Error + 'static)) -> Option { + let mut cause = Some(error); + while let Some(current) = cause { + if let Some(typed) = current.downcast_ref::() { + return Some(typed.error_type()); + } + cause = current.source(); + } + None +} + +struct RecordingClassifier { + calls: Arc, + observations: mpsc::UnboundedSender, +} + +#[async_trait::async_trait] +impl RequestClassifier for RecordingClassifier { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + self.calls.fetch_add(1, Ordering::Relaxed); + Box::pin(async move { Ok(request) }) + } + + async fn on_event(&mut self, event: ClassifyEvent) { + let observation = match event { + ClassifyEvent::Completed { + context_tokens: Some(context_tokens), + .. + } => Some(ClassifierObservation::Completed(context_tokens)), + ClassifyEvent::Aborted { error, .. } => Some(ClassifierObservation::Aborted { + cause: error.as_deref().and_then(|error| abort_cause_type(error)), + }), + _ => None, + }; + if let Some(observation) = observation { + self.observations.send(observation).unwrap(); + } + } +} + +#[derive(Debug, thiserror::Error)] +#[error("classifier rejected request")] +struct ClassifierRejected; + +struct RejectingClassifier { + calls: Arc, + observations: mpsc::UnboundedSender>, +} + +#[async_trait::async_trait] +impl RequestClassifier for RejectingClassifier { + fn classify(&mut self, _request: ClassifyRequest) -> ClassifyFuture { + self.calls.fetch_add(1, Ordering::Relaxed); + Box::pin(async { Err(Box::new(ClassifierRejected) as Box) }) + } + + async fn on_event(&mut self, event: ClassifyEvent) { + if let ClassifyEvent::Aborted { error, .. } = event { + self.observations + .send(error.map(|error| { + ( + error.downcast_ref::().is_some(), + error.to_string(), + ) + })) + .unwrap(); + } + } +} + +#[tokio::test] +async fn classifier_failure_aborts_once_with_original_error() { + let calls = Arc::new(AtomicUsize::new(0)); + let (observations_tx, mut observations_rx) = mpsc::unbounded_channel(); + let (router, runtime) = router_with_classifier( + RejectingClassifier { + calls: Arc::clone(&calls), + observations: observations_tx, + }, + Some(Duration::from_secs(10)), + ) + .await; + let session_id = SessionAffinityId::new("classifier-failure-stale-affinity"); + bind_affinity_target(&router, &session_id, AffinityTarget::new(7, Some(1))).await; + let mut request = Context::new(request()); + request.insert(SESSION_AFFINITY_CONTEXT_KEY, session_id); + + let client_error = match router + .select_with_affinity( + &request, + RequestPhase::Aggregated, + false, + &CleanupBudget::default(), + ) + .await + { + Ok(_) => panic!("classifier rejection unexpectedly selected a worker"), + Err(error) => error, + }; + assert!(!format!("{client_error:#}").contains("classifier rejected request")); + assert_eq!(calls.load(Ordering::Relaxed), 1); + assert_eq!( + tokio::time::timeout(Duration::from_secs(1), observations_rx.recv()) + .await + .expect("classifier abort event timed out"), + Some(Some((true, "classifier rejected request".to_string()))) + ); + assert!(observations_rx.try_recv().is_err()); + + drop(router); + runtime.shutdown(); +} + +struct TypedRejectingClassifier { + error_type: ErrorType, + calls: Arc, + observations: mpsc::UnboundedSender, +} + +#[async_trait::async_trait] +impl RequestClassifier for TypedRejectingClassifier { + fn classify(&mut self, _request: ClassifyRequest) -> ClassifyFuture { + self.calls.fetch_add(1, Ordering::Relaxed); + let error_type = self.error_type; + Box::pin(async move { + Err(Box::new( + DynamoError::builder() + .error_type(error_type) + .message("classifier shed load") + .build(), + ) as Box) + }) + } + + async fn on_event(&mut self, event: ClassifyEvent) { + if let ClassifyEvent::Aborted { error, .. } = event { + self.observations + .send(ClassifierObservation::Aborted { + cause: error.as_deref().and_then(|error| abort_cause_type(error)), + }) + .unwrap(); + } + } +} + +#[tokio::test] +async fn typed_classifier_rejection_reaches_client_without_migration() { + for error_type in [ + ErrorType::ResourceExhausted, + ErrorType::WorkerOverloaded, + ErrorType::CannotConnect, + ] { + let calls = Arc::new(AtomicUsize::new(0)); + let (observations_tx, mut observations_rx) = mpsc::unbounded_channel(); + let (router, runtime) = router_with_classifier( + TypedRejectingClassifier { + error_type, + calls: Arc::clone(&calls), + observations: observations_tx, + }, + None, + ) + .await; + let engine: ServerStreamingEngine> = + Arc::new(router); + let migration = Migration::new(2, None, "test".to_string(), Arc::new(Metrics::new())); + let client_error = match migration + .generate(Context::new(request()), engine.clone()) + .await + { + Ok(_) => panic!("typed rejection unexpectedly selected a worker"), + Err(error) => error, + }; + + assert_eq!( + calls.load(Ordering::Relaxed), + 1, + "classifier rejection {error_type:?} must not be retried" + ); + assert!(match_error_chain(client_error.as_ref(), &[error_type], &[])); + assert!(format!("{client_error:#}").contains("classifier shed load")); + assert_eq!( + tokio::time::timeout(Duration::from_secs(1), observations_rx.recv()) + .await + .expect("classifier abort event timed out"), + Some(ClassifierObservation::Aborted { + cause: Some(error_type), + }) + ); + assert!(observations_rx.try_recv().is_err()); + + drop(engine); + runtime.shutdown(); + } +} + +#[tokio::test] +async fn stale_affinity_rebind_classifies_once_without_intermediate_abort() { + let calls = Arc::new(AtomicUsize::new(0)); + let (observations_tx, mut observations_rx) = mpsc::unbounded_channel(); + let (router, runtime) = router_with_classifier( + RecordingClassifier { + calls: Arc::clone(&calls), + observations: observations_tx, + }, + Some(Duration::from_secs(10)), + ) + .await; + let session_id = SessionAffinityId::new("classifier-stale-affinity"); + bind_affinity_target(&router, &session_id, AffinityTarget::new(7, Some(1))).await; + let mut request = Context::new(request()); + request.insert(SESSION_AFFINITY_CONTEXT_KEY, session_id); + + let (mut selection, operation) = router + .select_with_affinity( + &request, + RequestPhase::Aggregated, + false, + &CleanupBudget::default(), + ) + .await + .unwrap(); + + assert_eq!(calls.load(Ordering::Relaxed), 1); + assert!(observations_rx.try_recv().is_err()); + let mut lifecycle = selection.request_lifecycle.take().unwrap(); + lifecycle.observe_context_tokens(1); + lifecycle.complete(); + assert_eq!( + observations_rx.recv().await, + Some(ClassifierObservation::Completed(1)) + ); + router.kv_router().free(request.id()).await.unwrap(); + + drop(operation); + drop(router); + runtime.shutdown(); +} + +#[tokio::test] +async fn query_only_selection_bypasses_classifier_and_request_lifecycle() { + let calls = Arc::new(AtomicUsize::new(0)); + let (observations_tx, mut observations_rx) = mpsc::unbounded_channel(); + let (router, runtime) = router_with_classifier( + RecordingClassifier { + calls: Arc::clone(&calls), + observations: observations_tx, + }, + None, + ) + .await; + let request = Context::new(request()); + + let (selection, operation) = router + .select_with_affinity( + &request, + RequestPhase::Aggregated, + true, + &CleanupBudget::default(), + ) + .await + .unwrap(); + + assert_eq!(calls.load(Ordering::Relaxed), 0); + assert!(selection.request_lifecycle.is_none()); + assert!(operation.is_none()); + drop(selection); + assert!(!router.prefill_worker_busy(&request, 0.5).await.unwrap()); + assert_eq!(calls.load(Ordering::Relaxed), 0); + assert!(observations_rx.try_recv().is_err()); + + drop(router); + runtime.shutdown(); +} + +#[tokio::test] +async fn planned_route_admission_classifies_and_carries_lifecycle() { + let calls = Arc::new(AtomicUsize::new(0)); + let (observations_tx, mut observations_rx) = mpsc::unbounded_channel(); + let (router, runtime) = router_with_classifier( + RecordingClassifier { + calls: Arc::clone(&calls), + observations: observations_tx, + }, + None, + ) + .await; + let request = Context::new(request()); + + let preview = router + .preview_kv_route(&request, RequestPhase::Decode) + .await + .unwrap(); + assert_eq!(calls.load(Ordering::Relaxed), 0, "preview is query-only"); + let mut plan = router + .plan_kv_route_from_preview(&request, preview) + .await + .unwrap(); + assert_eq!(calls.load(Ordering::Relaxed), 1); + + let mut lifecycle = plan.selection.request_lifecycle.take().unwrap(); + lifecycle.observe_context_tokens(1); + lifecycle.complete(); + assert_eq!( + observations_rx.recv().await, + Some(ClassifierObservation::Completed(1)) + ); + router.kv_router().free(request.id()).await.unwrap(); + + drop(plan); + drop(router); + runtime.shutdown(); +} + +struct PausingClassifier { + entered: Arc, + resumed: Arc, +} + +impl RequestClassifier for PausingClassifier { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + let entered = Arc::clone(&self.entered); + let resumed = Arc::clone(&self.resumed); + Box::pin(async move { + entered.notify_one(); + resumed.notified().await; + Ok(request) + }) + } +} + +#[tokio::test] +async fn classifier_pause_defers_admission_until_resumed() { + let entered = Arc::new(Notify::new()); + let resumed = Arc::new(Notify::new()); + let (router, runtime) = router_with_classifier( + PausingClassifier { + entered: Arc::clone(&entered), + resumed: Arc::clone(&resumed), + }, + None, + ) + .await; + let router = Arc::new(router); + let request = Context::new(request()); + let request_id = request.id().to_string(); + let selection = { + let router = Arc::clone(&router); + tokio::spawn(async move { + router + .select_with_affinity( + &request, + RequestPhase::Aggregated, + false, + &CleanupBudget::default(), + ) + .await + }) + }; + + entered.notified().await; + assert!(!selection.is_finished()); + resumed.notify_one(); + let (selection, _) = selection.await.unwrap().unwrap(); + assert!(selection.request_lifecycle.is_some()); + router.kv_router().free(&request_id).await.unwrap(); + drop(selection); + + drop(router); + runtime.shutdown(); +} + +#[tokio::test] +async fn tracked_admission_without_lifecycle_bypasses_classifier() { + let calls = Arc::new(AtomicUsize::new(0)); + let (observations_tx, mut observations_rx) = mpsc::unbounded_channel(); + let (router, runtime) = router_with_classifier( + RecordingClassifier { + calls: Arc::clone(&calls), + observations: observations_tx, + }, + None, + ) + .await; + + // `find_best_match_details_with_policy_class` with `update_states` is a tracked admission + // that never calls `begin_request_lifecycle` — the same funnel as the + // Python bindings `best_worker` and the standalone `RouterRequest::New` + // path. The plugin would receive no lifecycle events for it, so admission + // must use the default queue inputs instead of the classifier. + let outcome = router + .kv_router() + .find_best_match_details_with_policy_class( + Some("unregistered-tracked"), + &[1, 2, 3, 4], + None, + None, + true, + false, + None, + None, + 0.0, + 0, + None, + None, + None, + None, + None, + RoutingConstraints::default(), + ) + .await + .unwrap(); + assert!(matches!( + outcome, + crate::kv_router::FindBestMatchOutcome::Routed { .. } + )); + assert_eq!(calls.load(Ordering::Relaxed), 0); + router + .kv_router() + .free("unregistered-tracked") + .await + .unwrap(); + assert!(observations_rx.try_recv().is_err()); + + drop(router); + runtime.shutdown(); +} + +struct TokenContractClassifier { + classified: mpsc::UnboundedSender<(usize, dynamo_kv_router::scheduling::RequestProgress)>, + completed: mpsc::UnboundedSender, +} + +#[async_trait::async_trait] +impl RequestClassifier for TokenContractClassifier { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + self.classified + .send((request.input_tokens(), request.progress().clone())) + .unwrap(); + Box::pin(async move { Ok(request) }) + } + + async fn on_event(&mut self, event: ClassifyEvent) { + if let ClassifyEvent::Completed { + context_tokens: Some(context_tokens), + .. + } = event + { + self.completed.send(context_tokens).unwrap(); + } + } +} + +#[tokio::test] +async fn classifier_uses_scheduler_token_basis() { + let (classified_tx, mut classified_rx) = mpsc::unbounded_channel(); + let (completed_tx, mut completed_rx) = mpsc::unbounded_channel(); + let (router, runtime) = router_with_classifier( + TokenContractClassifier { + classified: classified_tx, + completed: completed_tx, + }, + None, + ) + .await; + let mut content = request(); + content.mm_routing_info = Some(MmRoutingInfo { + routing_token_ids: vec![1, 2, 3, 4, 5, 0, 0, 0], + block_mm_infos: vec![None], + expanded_prompt_len: 5, + }); + let request = Context::new(content); + let (mut selection, _) = router + .select_with_affinity( + &request, + RequestPhase::Aggregated, + false, + &CleanupBudget::default(), + ) + .await + .unwrap(); + // Classification and the scheduler queue share one token basis: the + // routing tokens (`isl_tokens`, 8 here), not the multimodal expanded + // prompt length (5), so a pass-through classifier cannot shift queue + // bucketing, limits, or DRR cost for multimodal requests. + let (input_tokens, progress) = classified_rx.recv().await.unwrap(); + assert_eq!(input_tokens, 8); + assert_eq!(progress.context_tokens(), 8); + + let mut guard = router + .track_selection( + &request, + &mut selection, + RequestPhase::Aggregated, + false, + &CleanupBudget::default(), + ) + .await + .unwrap(); + guard.mark_dispatched(); + let output = LLMEngineOutput { + completion_usage: Some(dynamo_protocols::types::CompletionUsage { + prompt_tokens: 5, + completion_tokens: 6, + total_tokens: 11, + prompt_tokens_details: None, + completion_tokens_details: None, + }), + ..Default::default() + }; + guard.on_item(&Annotated::from_data(output)).await; + assert_eq!(progress.context_tokens(), 11); + assert!(completed_rx.try_recv().is_err()); + guard.finish().await; + assert_eq!(completed_rx.recv().await, Some(11)); + + drop(router); + runtime.shutdown(); +} + async fn track_request( router: &RoutingHost, is_query_only: bool, @@ -2279,6 +2849,7 @@ struct MigrationHarness { async fn two_worker_migration_harness( namespace: &str, dispatch: Arc>>, + classifier: Option, ) -> MigrationHarness { async fn shared_drt(runtime: Runtime, store_path: &std::path::Path) -> DistributedRuntime { DistributedRuntime::new( @@ -2353,7 +2924,7 @@ async fn two_worker_migration_harness( router_track_active_blocks: false, ..Default::default() }; - let chooser = KvRouter::new_with_worker_role_and_scheduler_load( + let mut chooser = KvRouter::new_with_worker_role_and_scheduler_load( endpoint, client.clone(), workers, @@ -2373,12 +2944,15 @@ async fn two_worker_migration_harness( ) .await .unwrap(); + if let Some(classifier) = classifier { + chooser = chooser.with_request_classifier(classifier).unwrap(); + } let push_router = PushRouter::from_client_with_dispatch(client.clone(), RouterMode::KV, dispatch) .await .unwrap(); let chooser = Arc::new(chooser); - let kv_router = Arc::new( + let engine: ServerStreamingEngine> = Arc::new( RoutingHost::new_with_load_context( push_router, chooser.clone(), @@ -2392,7 +2966,7 @@ async fn two_worker_migration_harness( MigrationHarness { runtime, chooser, - engine: kv_router, + engine, registered_ids, _store: store, _drts: vec![router_drt, first_worker_drt, second_worker_drt], @@ -2403,18 +2977,12 @@ async fn two_worker_migration_harness( #[serial_test::serial] async fn worker_overload_stream_migration_releases_and_reselects() { let dispatch = Arc::new(RejectFirstDispatch::default()); - let harness = two_worker_migration_harness("worker-overload-migration", dispatch.clone()).await; - let MigrationHarness { - runtime, - chooser, - engine: next, - registered_ids, - .. - } = &harness; + let harness = + two_worker_migration_harness("worker-overload-migration", dispatch.clone(), None).await; let migration = Migration::new(1, None, "test".to_string(), Arc::new(Metrics::new())); let responses: Vec<_> = migration - .generate(Context::new(request()), next.clone()) + .generate(Context::new(request()), harness.engine.clone()) .await .unwrap() .collect() @@ -2431,11 +2999,12 @@ async fn worker_overload_stream_migration_releases_and_reselects() { let failed_worker = attempts[0].0; let retried_worker = attempts[1].0; assert_ne!(failed_worker, retried_worker); - assert!(registered_ids.contains(&failed_worker)); - assert!(registered_ids.contains(&retried_worker)); + assert!(harness.registered_ids.contains(&failed_worker)); + assert!(harness.registered_ids.contains(&retried_worker)); assert!(attempts[0].1.is_empty()); assert_eq!(attempts[1].1, vec![failed_worker]); - let loads = chooser + let loads = harness + .chooser .get_potential_loads(&[], None, None, None, None) .await .unwrap(); @@ -2443,7 +3012,336 @@ async fn worker_overload_stream_migration_releases_and_reselects() { loads.iter().all(|load| load.active_requests == 0), "all scheduler bookings must be released after migration: {loads:?}" ); - runtime.shutdown(); + harness.runtime.shutdown(); +} + +#[tokio::test] +#[serial_test::serial] +async fn stream_migration_retry_continues_one_classifier_lifecycle() { + let calls = Arc::new(AtomicUsize::new(0)); + let (observations_tx, mut observations_rx) = mpsc::unbounded_channel(); + let dispatch = Arc::new(RejectFirstDispatch::default()); + let harness = two_worker_migration_harness( + "stream-migration-classifier-lifecycle", + dispatch.clone(), + Some(RecordingClassifier { + calls: Arc::clone(&calls), + observations: observations_tx, + }), + ) + .await; + let migration = Migration::new(1, None, "test".to_string(), Arc::new(Metrics::new())); + + let responses: Vec<_> = migration + .generate(Context::new(request()), harness.engine.clone()) + .await + .unwrap() + .collect() + .await; + + assert_eq!(responses.len(), 1); + assert!(responses[0].error.is_none()); + let attempts = { + let attempts = dispatch.attempts.lock().unwrap(); + attempts.clone() + }; + assert_eq!(attempts.len(), 2, "the failed stream must be retried once"); + assert_ne!(attempts[0].0, attempts[1].0); + + // The retry continues the failed attempt's lifecycle, so the plugin must + // see exactly one terminal event for the logical request: the retry's + // Completed, with no Aborted from the failed stream before it. + let observation = tokio::time::timeout(Duration::from_secs(1), observations_rx.recv()) + .await + .expect("classifier terminal event timed out") + .expect("classifier event channel closed"); + assert!( + matches!(observation, ClassifierObservation::Completed(_)), + "the failed stream must not abort the lifecycle Migration retries: {observation:?}" + ); + assert!( + observations_rx.try_recv().is_err(), + "the logical request must emit exactly one terminal lifecycle event" + ); + assert_eq!( + calls.load(Ordering::Relaxed), + 1, + "the retry must reuse the cached classification" + ); + let loads = harness + .chooser + .get_potential_loads(&[], None, None, None, None) + .await + .unwrap(); + assert!( + loads.iter().all(|load| load.active_requests == 0), + "both attempt bookings must be released after classifier completion: {loads:?}" + ); + harness.runtime.shutdown(); +} + +#[tokio::test] +#[serial_test::serial] +async fn prefill_retry_preserves_parked_decode_classifier_lifecycle() { + let calls = Arc::new(AtomicUsize::new(0)); + let (observations_tx, mut observations_rx) = mpsc::unbounded_channel(); + let (decode, decode_runtime) = Box::pin(router_with_classifier( + RecordingClassifier { + calls: Arc::clone(&calls), + observations: observations_tx, + }, + None, + )) + .await; + let (prefill, prefill_runtime) = Box::pin(router(None)).await; + let mut content = request(); + content.migration_state = Some(Default::default()); + let request = Context::new(content); + + let (mut selected, _) = decode + .select_with_affinity( + &request, + RequestPhase::Decode, + false, + &CleanupBudget::default(), + ) + .await + .unwrap(); + let mut guard = decode + .track_selection( + &request, + &mut selected, + RequestPhase::Decode, + false, + &CleanupBudget::default(), + ) + .await + .unwrap(); + guard.mark_dispatched(); + assert!(guard.release_for_retry().await); + assert!( + potential_loads(&decode) + .await + .iter() + .all(|load| load.active_requests == 0) + ); + + let (mut selected, _) = prefill + .select_with_affinity( + &request, + RequestPhase::Prefill, + false, + &CleanupBudget::default(), + ) + .await + .unwrap(); + assert!( + selected.request_lifecycle.is_none(), + "prefill must not claim the decode lifecycle" + ); + let mut guard = prefill + .track_selection( + &request, + &mut selected, + RequestPhase::Prefill, + false, + &CleanupBudget::default(), + ) + .await + .unwrap(); + guard.mark_dispatched(); + guard.finish().await; + + let (mut selected, _) = decode + .select_with_affinity( + &request, + RequestPhase::Decode, + false, + &CleanupBudget::default(), + ) + .await + .unwrap(); + let mut guard = decode + .track_selection( + &request, + &mut selected, + RequestPhase::Decode, + false, + &CleanupBudget::default(), + ) + .await + .unwrap(); + guard.mark_dispatched(); + guard.finish().await; + let observation = tokio::time::timeout(Duration::from_secs(1), observations_rx.recv()) + .await + .unwrap() + .unwrap(); + assert!(matches!(observation, ClassifierObservation::Completed(_))); + assert!(observations_rx.try_recv().is_err()); + assert_eq!( + calls.load(Ordering::Relaxed), + 1, + "decode retry reuses its classification" + ); + drop(decode); + drop(prefill); + decode_runtime.shutdown(); + prefill_runtime.shutdown(); +} + +#[tokio::test] +#[serial_test::serial] +async fn pinned_request_stream_failure_aborts_parked_lifecycle_with_cause() { + let calls = Arc::new(AtomicUsize::new(0)); + let (observations_tx, mut observations_rx) = mpsc::unbounded_channel(); + let dispatch = Arc::new(RejectFirstDispatch::default()); + let harness = two_worker_migration_harness( + "pinned-stream-failure-classifier-lifecycle", + dispatch.clone(), + Some(RecordingClassifier { + calls: Arc::clone(&calls), + observations: observations_tx, + }), + ) + .await; + let migration = Migration::new(1, None, "test".to_string(), Arc::new(Metrics::new())); + let pinned = *harness.registered_ids.iter().next().unwrap(); + let mut content = request(); + content.routing = Some(RoutingHints { + backend_instance_id: Some(pinned), + ..Default::default() + }); + + let responses: Vec<_> = migration + .generate(Context::new(content), harness.engine.clone()) + .await + .unwrap() + .collect() + .await; + + // The failure is type-migratable so the stream host parks the lifecycle, + // but the explicit pin vetoes the retry. The plugin must still receive + // exactly one terminal event carrying the failure, not a bare Drop abort. + assert_eq!(responses.len(), 1); + assert!(responses[0].error.is_some()); + let attempts = dispatch.attempts.lock().unwrap().len(); + assert_eq!( + attempts, 1, + "an explicit pin must block the migration retry" + ); + assert_eq!( + tokio::time::timeout(Duration::from_secs(1), observations_rx.recv()) + .await + .expect("classifier abort event timed out"), + Some(ClassifierObservation::Aborted { + cause: Some(ErrorType::WorkerOverloaded), + }) + ); + assert!(observations_rx.try_recv().is_err()); + harness.runtime.shutdown(); +} + +/// Every attempt fails in-stream with a migratable worker error. +#[derive(Default)] +struct AlwaysOverloadedDispatch { + attempts: Mutex>, +} + +#[async_trait] +impl StreamingDispatch> + for AlwaysOverloadedDispatch +{ + async fn generate( + &self, + request: SingleIn>, + ) -> Result>, Error> { + let (addressed, context) = request.transfer(()); + let (_, _, instance) = addressed.into_parts(); + self.attempts + .lock() + .unwrap() + .push(instance.expect("selected worker instance").id()); + let output = Annotated { + data: None, + id: None, + event: Some("error".to_string()), + comment: None, + error: Some( + DynamoError::builder() + .error_type(ErrorType::WorkerOverloaded) + .message("selected worker is overloaded") + .build(), + ), + }; + Ok(ResponseStream::new( + Box::pin(stream::once(async move { output })), + context.context(), + )) + } + + async fn generate_bidirectional( + &self, + _instance: Instance, + _address: String, + _input: ManyIn, + ) -> Result>, Error> { + unreachable!("the routing host dispatches unary requests") + } +} + +#[tokio::test] +#[serial_test::serial] +async fn exhausted_migration_aborts_parked_lifecycle_with_worker_failure() { + let calls = Arc::new(AtomicUsize::new(0)); + let (observations_tx, mut observations_rx) = mpsc::unbounded_channel(); + let dispatch = Arc::new(AlwaysOverloadedDispatch::default()); + let harness = two_worker_migration_harness( + "exhausted-migration-classifier-lifecycle", + dispatch.clone(), + Some(RecordingClassifier { + calls: Arc::clone(&calls), + observations: observations_tx, + }), + ) + .await; + let migration = Migration::new(1, None, "test".to_string(), Arc::new(Metrics::new())); + + let responses: Vec<_> = migration + .generate(Context::new(request()), harness.engine.clone()) + .await + .unwrap() + .collect() + .await; + + // Both attempts fail in-stream and the retry budget is spent. The client + // receives the final attempt's worker error, so the classifier's single + // terminal event must carry that same failure, not the synthetic + // "migration limit exhausted" that retry accounting produces. + assert_eq!( + dispatch.attempts.lock().unwrap().len(), + 2, + "one migration retry must run before the budget is exhausted" + ); + let error = responses + .last() + .and_then(|response| response.error.as_ref()) + .expect("the final worker error reaches the client"); + assert!(match_error_chain( + error, + &[ErrorType::WorkerOverloaded], + &[] + )); + assert_eq!( + tokio::time::timeout(Duration::from_secs(1), observations_rx.recv()) + .await + .expect("classifier abort event timed out"), + Some(ClassifierObservation::Aborted { + cause: Some(ErrorType::WorkerOverloaded), + }) + ); + assert!(observations_rx.try_recv().is_err()); + harness.runtime.shutdown(); } /// A gracefully shutting-down worker: `Cancelled` data frame, then the reason. @@ -2510,7 +3408,8 @@ impl StreamingDispatch> #[serial_test::serial] async fn engine_shutdown_after_cancel_frame_migrates_and_reselects() { let dispatch = Arc::new(ShutdownAfterCancelDispatch::default()); - let harness = two_worker_migration_harness("engine-shutdown-migration", dispatch.clone()).await; + let harness = + two_worker_migration_harness("engine-shutdown-migration", dispatch.clone(), None).await; let migration = Migration::new(1, None, "test".to_string(), Arc::new(Metrics::new())); let responses: Vec<_> = migration diff --git a/lib/llm/src/migration.rs b/lib/llm/src/migration.rs index bb13915d19ce..e54a94de66ef 100644 --- a/lib/llm/src/migration.rs +++ b/lib/llm/src/migration.rs @@ -24,6 +24,7 @@ use crate::{ session_affinity::explicit_target, }; +use dynamo_kv_router::scheduling::AbortCause; use dynamo_runtime::engine::Data; use dynamo_runtime::error::{self, DynamoError, ErrorReason, ErrorType}; use dynamo_runtime::metrics::prometheus_names::frontend_service; @@ -70,8 +71,15 @@ impl HasTokenIds for LLMEngineOutput { } } +/// A classifier decision is terminal even when its client-visible error type +/// would normally identify a retryable worker failure. +#[derive(Debug, thiserror::Error)] +#[error("{0}")] +pub(crate) struct ClassifierRejection(#[source] pub(crate) DynamoError); + const MIGRATION_BLOCKING_REASONS: &[&str] = &[ "request.cancelled", + "request.deadline_exceeded", "backend.cancelled", "capacity.exhausted", "capacity.pool_exhausted", @@ -102,6 +110,9 @@ fn migratable_error_in_chain<'a>(err: &'a (dyn StdError + 'static)) -> Option<&' let mut migratable = None; let mut current = Some(err); while let Some(source) = current { + if source.is::() { + return None; + } if let Some(error) = source.downcast_ref::() { if blocks_migration(error.reason()) { return None; @@ -116,7 +127,7 @@ fn migratable_error_in_chain<'a>(err: &'a (dyn StdError + 'static)) -> Option<&' } /// Check if an error chain indicates the request should be migrated. -fn is_migratable(err: &(dyn StdError + 'static)) -> bool { +pub(crate) fn is_migratable(err: &(dyn StdError + 'static)) -> bool { migratable_error_in_chain(err).is_some() } @@ -418,38 +429,51 @@ where }; if let Some(response) = response_stream.next().await { // Check if this is a migratable error that should trigger stream recreation. - if let Some(err) = response.error.as_ref() - && is_migratable_for_request(&self.request, err) - { - let Some(migration_error) = migratable_error_in_chain(err) else { - tracing::warn!(error = %err, "Migration eligibility had no semantic error"); - continue; - }; - if self.retries_left == 0 { - let route_trace = self.active_route_trace.clone(); - self.record_migration_exhausted(MigrationCause { - reason: migration_error.error_type(), - from_worker_id: route_trace - .as_deref() - .and_then(RouteTraceContext::selected_worker_id), - attempt: self.failed_attempt(route_trace.as_deref()), - }); - } else { - self.queue_migration( - migration_error.error_type(), - self.active_route_trace.clone(), - ); - } - tracing::warn!(error = %err, "Stream disconnected, recreating stream"); - self.metrics.inc_migration_ongoing_request(&self.model_name); - let migration_event = - MigrationEvent::new(frontend_service::migration_type::ONGOING_REQUEST); - // NOTE: Delegate exhaustion to new_stream so retry accounting has one owner. - // When no replacement is established, preserve the triggering stream error. - if let Err(err) = self.new_stream(Some(migration_event)).await { - tracing::warn!(error = ?err, "Cannot recreate stream"); + if let Some(err) = response.error.as_ref() { + if is_migratable_for_request(&self.request, err) { + let Some(migration_error) = migratable_error_in_chain(err) else { + tracing::warn!(error = %err, "Migration eligibility had no semantic error"); + continue; + }; + if self.retries_left == 0 { + let route_trace = self.active_route_trace.clone(); + self.record_migration_exhausted(MigrationCause { + reason: migration_error.error_type(), + from_worker_id: route_trace + .as_deref() + .and_then(RouteTraceContext::selected_worker_id), + attempt: self.failed_attempt(route_trace.as_deref()), + }); + // The stream host parked the lifecycle on this + // failure. The client receives this worker error + // (below), so the classifier's abort cause must be + // the same error, not the synthetic exhaustion + // error `new_stream` would otherwise abort with. + self.abort_request_lifecycle(err); + } else { + self.queue_migration( + migration_error.error_type(), + self.active_route_trace.clone(), + ); + } + tracing::warn!(error = %err, "Stream disconnected, recreating stream"); + self.metrics.inc_migration_ongoing_request(&self.model_name); + let migration_event = + MigrationEvent::new(frontend_service::migration_type::ONGOING_REQUEST); + // NOTE: Delegate exhaustion to new_stream so retry accounting has one owner. + // When no replacement is established, preserve the triggering stream error. + if let Err(err) = self.new_stream(Some(migration_event)).await { + tracing::warn!(error = ?err, "Cannot recreate stream"); + } else { + continue; + } } else { - continue; + // The stream host parks the classifier lifecycle on any + // type-migratable failure, but an explicit worker pin can + // veto the retry here. Nothing will claim the parked + // lifecycle, so abort it with the cause now rather than + // letting Drop emit a late, cause-less event. + self.abort_request_lifecycle(err); } } self.track_response(&response); @@ -459,6 +483,14 @@ where } } + /// Abort any classifier lifecycle parked for a retry this request will not + /// make. No-op when nothing is parked. + fn abort_request_lifecycle(&self, error: &AbortCause) { + if let Some(state) = self.request.migration_state.as_ref() { + state.abort_request_lifecycle(Some(error)); + } + } + async fn new_stream(&mut self, mut migration_event: Option) -> Result<()> { if self.retries_left == 0 { if let Some(cause) = self.pending_migration.take() { @@ -468,7 +500,9 @@ where migration_event.as_ref(), frontend_service::migration_outcome::FAILURE, ); - return Err(Error::msg("Migration limit exhausted")); + let error = Error::msg("Migration limit exhausted"); + self.abort_request_lifecycle(error.as_ref()); + return Err(error); } while self.retries_left > 0 { self.retries_left -= 1; @@ -527,14 +561,15 @@ where migration_event.as_ref(), frontend_service::migration_outcome::CANCELLED, ); - return Err(DynamoError::builder() + let error = DynamoError::builder() .error_type(ErrorType::Cancelled) .message(format!( "Context id {} is stopped or killed", self.context.id() )) - .build() - .into()); + .build(); + self.abort_request_lifecycle(&error); + return Err(error.into()); } let source_guards = self .request @@ -586,6 +621,7 @@ where migration_event.as_ref(), frontend_service::migration_outcome::FAILURE, ); + self.abort_request_lifecycle(err.as_ref()); return Err(err); } self.queue_migration(reason, Some(route_trace)); @@ -599,6 +635,7 @@ where frontend_service::migration_outcome::FAILURE }; self.record_migration_outcome(migration_event.as_ref(), outcome); + self.abort_request_lifecycle(err.as_ref()); return Err(err); } } @@ -607,7 +644,9 @@ where migration_event.as_ref(), frontend_service::migration_outcome::FAILURE, ); - Err(Error::msg("Migration limit exhausted")) + let error = Error::msg("Migration limit exhausted"); + self.abort_request_lifecycle(error.as_ref()); + Err(error) } /// The attempt a failure belongs to. Prefers the attempt's own trace @@ -793,6 +832,7 @@ mod tests { for &(error_type, reason) in &[ (ErrorType::Cancelled, "request.cancelled"), + (ErrorType::DeadlineExceeded, "request.deadline_exceeded"), ( ErrorType::Backend(BackendError::Cancelled), "backend.cancelled", @@ -888,10 +928,23 @@ mod tests { // Guard: genuinely non-migratable errors stay non-migratable. #[test] - fn cancelled_and_exhausted_are_not_migratable() { - for et in [ErrorType::Cancelled, ErrorType::ResourceExhausted] { + fn terminal_error_types_are_not_migratable() { + for et in [ + ErrorType::Cancelled, + ErrorType::DeadlineExceeded, + ErrorType::ResourceExhausted, + ] { let err = DynamoError::builder().error_type(et).message("x").build(); assert!(!is_migratable(&err), "{et:?} must not be migratable"); + let wrapped = DynamoError::builder() + .error_type(ErrorType::CannotConnect) + .message("outer transport error") + .cause(err) + .build(); + assert!( + !is_migratable(&wrapped), + "{et:?} must block migration through a retryable outer error" + ); } } diff --git a/lib/llm/src/protocols/common/preprocessor.rs b/lib/llm/src/protocols/common/preprocessor.rs index e80c9a700c51..df9efe1553ae 100644 --- a/lib/llm/src/protocols/common/preprocessor.rs +++ b/lib/llm/src/protocols/common/preprocessor.rs @@ -11,6 +11,7 @@ pub use dynamo_kv_router::kv_hints::{ use dynamo_kv_router::{ config::RouterConfigOverride, protocols::{BlockExtraInfo, RoutingConstraints, WorkerId}, + scheduling::{AbortCause, RequestLifecycle}, }; use dynamo_runtime::error::{DynamoError, ErrorType, match_error_chain}; use serde::{Deserialize, Serialize}; @@ -133,6 +134,7 @@ pub(crate) struct MigrationState { struct MigrationStateInner { excluded_worker_ids: Vec, last_error: Option, + request_lifecycle: Option>, } impl MigrationState { @@ -190,6 +192,54 @@ impl MigrationState { .build(), ) } + + pub(crate) fn take_request_lifecycle(&self) -> Option> { + self.inner + .get()? + .lock() + .unwrap_or_else(std::sync::PoisonError::into_inner) + .request_lifecycle + .take() + } + + pub(crate) fn store_request_lifecycle(&self, lifecycle: Box) { + let replaced = self + .inner + .get_or_init(Default::default) + .lock() + .unwrap_or_else(std::sync::PoisonError::into_inner) + .request_lifecycle + .replace(lifecycle); + if let Some(replaced) = replaced { + tracing::warn!( + replaced = ?replaced, + "Replacing an unclaimed request-classifier migration lifecycle" + ); + } + } + + pub(crate) fn abort_request_lifecycle(&self, error: Option<&AbortCause>) { + let Some(mut lifecycle) = self.take_request_lifecycle() else { + return; + }; + lifecycle.abort(error.map(owned_abort_error)); + } +} + +/// Owned abort payload for classifier lifecycle events: the typed +/// [`DynamoError`] from the chain when one exists, else the whole chain +/// converted so the root cause survives. +pub(crate) fn owned_abort_error(error: &AbortCause) -> Arc { + let mut cause: Option<&(dyn std::error::Error + 'static)> = Some(error); + while let Some(current) = cause { + if let Some(dynamo_error) = current.downcast_ref::() { + return Arc::new(dynamo_error.clone()); + } + cause = current.source(); + } + Arc::new(DynamoError::from( + error as &(dyn std::error::Error + 'static), + )) } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -512,6 +562,13 @@ impl PreprocessedRequest { } (tokens, Some(mm.block_mm_infos.as_slice())) } + + pub(crate) fn expanded_prompt_token_count(&self) -> usize { + self.mm_routing_info + .as_ref() + .filter(|mm| !mm.routing_token_ids.is_empty() && mm.expanded_prompt_len > 0) + .map_or(self.token_ids.len(), |mm| mm.expanded_prompt_len) + } } /// [`PreprocessedEmbeddingRequest`] is the internal representation of an embedding request diff --git a/lib/runtime/src/pipeline/network/egress/addressed_router.rs b/lib/runtime/src/pipeline/network/egress/addressed_router.rs index 2ee776e69cd9..08053971c0f8 100644 --- a/lib/runtime/src/pipeline/network/egress/addressed_router.rs +++ b/lib/runtime/src/pipeline/network/egress/addressed_router.rs @@ -57,6 +57,7 @@ use tracing::Instrument; /// This must match `MIGRATION_BLOCKING_REASONS` in `lib/llm/src/migration.rs`. pub(crate) const MIGRATION_SENSITIVE_ERROR_REASONS: &[&str] = &[ "request.cancelled", + "request.deadline_exceeded", "backend.cancelled", "capacity.exhausted", "capacity.pool_exhausted", From cdcd721e72fdfd521c93f35c7f91745b1f7dd01f Mon Sep 17 00:00:00 2001 From: Xianlu Bird Date: Sat, 19 Sep 2026 08:20:15 +0800 Subject: [PATCH 121/191] fix(discovery): log metadata publication and capture deploy failure state (#14837) Signed-off-by: xianlubird --- lib/runtime/src/discovery/kube/crd.rs | 14 +- tests/deploy/dgd_utils.py | 97 +++++++++- tests/deploy/test_dgd.py | 250 ++++++++++++++++++-------- tests/deploy/test_dgd_utils.py | 61 +++++++ 4 files changed, 342 insertions(+), 80 deletions(-) diff --git a/lib/runtime/src/discovery/kube/crd.rs b/lib/runtime/src/discovery/kube/crd.rs index 29b7ed73410e..76dd79a32997 100644 --- a/lib/runtime/src/discovery/kube/crd.rs +++ b/lib/runtime/src/discovery/kube/crd.rs @@ -182,14 +182,16 @@ pub async fn apply_cr( // in practice the CR will only have one writer (the pod owner) let params = PatchParams::apply(FIELD_MANAGER).force(); - api.patch(cr_name, ¶ms, &Patch::Apply(cr)) - .await - .map_err(|e| anyhow::anyhow!("Failed to apply DynamoWorkerMetadata CR: {}", e))?; + let patch = Patch::Apply(cr); + let applied = api.patch(cr_name, ¶ms, &patch).await.map_err(|e| { + anyhow::anyhow!("Failed to apply DynamoWorkerMetadata {namespace}/{cr_name}: {e}") + })?; - tracing::debug!( - "Applied DynamoWorkerMetadata CR: name={}, namespace={}", + tracing::info!( + namespace, cr_name, - namespace + resource_version = ?applied.metadata.resource_version, + "Applied DynamoWorkerMetadata CR" ); Ok(()) diff --git a/tests/deploy/dgd_utils.py b/tests/deploy/dgd_utils.py index 316c01d4995c..18b3af9b4ca4 100644 --- a/tests/deploy/dgd_utils.py +++ b/tests/deploy/dgd_utils.py @@ -4,13 +4,16 @@ """Helpers for live-cluster DynamoGraphDeployment tests.""" import asyncio +import json import logging import os import re import secrets import time from dataclasses import dataclass, field +from datetime import datetime, timezone from functools import partial +from pathlib import Path from typing import Any, List, Literal, Optional import aiohttp @@ -59,6 +62,8 @@ # This matches the validation threshold from the original shell-based deployment tests. MIN_RESPONSE_CONTENT_LENGTH = 100 PORT_FORWARD_REQUEST_RETRY_LIMIT = 1 +DISCOVERY_SNAPSHOT_TIMEOUT = 15 +DISCOVERY_RESOURCE_TIMEOUT = 3 _KR8S_VCLUSTER_CONNECTION_ERRORS = (httpx.TransportError, kr8s.APITimeoutError) _VCLUSTER_CLEANUP_ERRORS = ( aiohttp.ClientConnectionError, @@ -1786,8 +1791,90 @@ def send_request_with_port_forward_retry( raise AssertionError("unreachable") - async def _cleanup(self): + async def _capture_discovery_state(self): + """Save namespace discovery resources while their owner objects still exist.""" + if self._custom_api is None or self._core_api is None: + self._logger.warning( + "Discovery snapshot unavailable: Kubernetes clients not initialized" + ) + return + directory = Path(self.log_dir) / "discovery" + directory.mkdir(parents=True, exist_ok=True) + api_client = self._core_api.api_client + discovery_api = client.DiscoveryV1Api(api_client) + resources = ( + ( + "dgd", + partial( + self._custom_api.list_namespaced_custom_object, + "nvidia.com", + self.deployment_spec.api_version, + self.namespace, + "dynamographdeployments", + ), + ), + ( + "dwm", + partial( + self._custom_api.list_namespaced_custom_object, + "nvidia.com", + "v1alpha1", + self.namespace, + "dynamoworkermetadatas", + ), + ), + ("pods", partial(self._core_api.list_namespaced_pod, self.namespace)), + ( + "services", + partial(self._core_api.list_namespaced_service, self.namespace), + ), + ( + "endpointslices", + partial(discovery_api.list_namespaced_endpoint_slice, self.namespace), + ), + ) + # DWM ownership is through Pod UIDs; a DGD label selector can miss it. + for name, read in resources: + record = { + "namespace": self.namespace, + "deployment": self._deployment_name, + "captured_at": datetime.now(timezone.utc).isoformat(), + } + try: + async with asyncio.timeout(DISCOVERY_RESOURCE_TIMEOUT): + response = await read(_request_timeout=DISCOVERY_RESOURCE_TIMEOUT) + record["response"] = api_client.sanitize_for_serialization(response) + except Exception as error: + record["error"] = f"{type(error).__name__}: {error}" + self._logger.warning( + "Could not capture discovery resource %s: %s", name, error + ) + try: + (directory / f"{name}.json").write_text(json.dumps(record, indent=2)) + except (OSError, TypeError, ValueError) as error: + self._logger.warning( + "Could not save discovery resource %s: %s", name, error + ) + + async def _cleanup(self, failed: bool = False): + pending_cancellation: asyncio.CancelledError | None = None try: + if failed: + try: + async with asyncio.timeout(DISCOVERY_SNAPSHOT_TIMEOUT): + await self._capture_discovery_state() + except asyncio.CancelledError as error: + pending_cancellation = error + self._logger.warning( + "Discovery snapshot cancelled; finishing cleanup before " + "propagating cancellation" + ) + except BaseException as error: + # Snapshot capture is best-effort and must not replace the + # existing setup or test failure. + self._logger.warning( + "Discovery snapshot failed; continuing cleanup: %s", error + ) # Collect logs/metrics first; any PFs opened here will be tracked and stopped below. self._get_service_logs() self._logger.info( @@ -1804,6 +1891,8 @@ async def _cleanup(self): self._active_port_forwards.clear() finally: await self._delete_deployment() + if pending_cancellation is not None: + raise pending_cancellation async def __aenter__(self): try: @@ -1822,9 +1911,9 @@ async def __aenter__(self): await self._create_deployment() await self._wait_for_ready(timeout=self.readiness_timeout) - except BaseException: + except BaseException as error: try: - await self._cleanup() + await self._cleanup(failed=not isinstance(error, pytest.skip.Exception)) except _VCLUSTER_CLEANUP_ERRORS: self._logger.exception( "vCluster connection failed during cleanup after deployment " @@ -1839,7 +1928,7 @@ async def __aexit__(self, exc_type, exc_val, exc_tb): return None try: - await self._cleanup() + await self._cleanup(failed=not issubclass(exc_type, pytest.skip.Exception)) except _VCLUSTER_CLEANUP_ERRORS: self._logger.exception( "vCluster connection failed during cleanup after test failure; " diff --git a/tests/deploy/test_dgd.py b/tests/deploy/test_dgd.py index e56204a0de02..98c617e90111 100644 --- a/tests/deploy/test_dgd.py +++ b/tests/deploy/test_dgd.py @@ -14,12 +14,15 @@ import os import subprocess import time +from contextlib import nullcontext +from pathlib import Path from typing import Any import kr8s import pytest import requests import yaml +from kubernetes_asyncio.client.exceptions import ApiException from tests.deploy.conftest import DeploymentTarget from tests.deploy.dgd_utils import ( @@ -96,12 +99,18 @@ def validate_agg_logging_output(frontend_pod: Any, baseline_line_count: int) -> @pytest.mark.post_merge @pytest.mark.e2e @pytest.mark.timeout(1200) +@pytest.mark.parametrize( + "capture_failure", + [False, pytest.param(True, marks=pytest.mark.gpu_1)], + ids=["normal", "discovery-failure"], +) async def test_deployment( deployment_target: DeploymentTarget, deployment_spec: DeploymentSpec, namespace: str, skip_service_restart: bool, request, + capture_failure: bool, ) -> None: """Test Kubernetes deployment end-to-end. @@ -120,11 +129,17 @@ async def test_deployment( skip_service_restart: Whether to skip restarting NATS/etcd services (default: True). Use --restart-services flag to restart services before deployment. request: Pytest request object for accessing test metadata + capture_failure: Exercise failure cleanup and validate discovery artifacts. """ # Extract identifying information from the target framework = deployment_target.framework profile = deployment_target.profile validate_agg_logging = profile == "agg_logging" + if capture_failure and (framework, profile) != ("vllm", "agg"): + pytest.skip("Failure snapshot coverage uses only the vLLM agg deployment") + if capture_failure: + # Avoid racing deletion of the normal case's deployment. + deployment_spec.name = f"{deployment_spec.name}-discovery" # NIXL_ERR_BACKEND: vCluster CI nodes lack RDMA/UCX for inter-pod KV # transfer. Prefill workers crash in NixlWrapper.create_backend. @@ -169,84 +184,179 @@ async def test_deployment( ) logger.info(f"Log directory: {request.node.name}") - # Deploy and test - async with ManagedDeployment( - log_dir=request.node.name, - deployment_spec=deployment_spec, - namespace=namespace, - skip_service_restart=skip_service_restart, - ) as deployment: - # Get frontend pod for port forwarding - frontend_pods = deployment.get_pods([deployment.frontend_service_name]) - frontend_pod_list = frontend_pods.get(deployment.frontend_service_name, []) + # Catch outside the deployment context so teardown sees the failure. + expected_failure = ( + pytest.raises(RuntimeError, match="^intentional discovery capture failure$") + if capture_failure + else nullcontext() + ) + with expected_failure: + async with ManagedDeployment( + log_dir=request.node.name, + deployment_spec=deployment_spec, + namespace=namespace, + skip_service_restart=skip_service_restart, + ) as deployment: + # Get frontend pod for port forwarding + frontend_pods = deployment.get_pods([deployment.frontend_service_name]) + frontend_pod_list = frontend_pods.get(deployment.frontend_service_name, []) + + assert ( + len(frontend_pod_list) > 0 + ), f"No frontend pods found for deployment {deployment_spec.name}" + + frontend_pod = frontend_pod_list[0] + logger.info(f"Found frontend pod: {frontend_pod.name}") + + # Setup port forwarding + port = deployment_spec.port + port_forward = deployment.port_forward(frontend_pod, port) + assert ( + port_forward is not None + ), f"Failed to establish port forward to {frontend_pod.name}:{port}" + + base_url = f"http://localhost:{port_forward.local_port}" + logger.info(f"Port forwarding established: {base_url}") + + # Wait for model to be available + endpoint = deployment_spec.endpoint + model_ready = wait_for_model_availability( + url=base_url, + endpoint=endpoint, + model=model, + logger=logger, + max_attempts=30, + ) - assert ( - len(frontend_pod_list) > 0 - ), f"No frontend pods found for deployment {deployment_spec.name}" + assert ( + model_ready + ), f"Model '{model}' did not become available within the timeout period" - frontend_pod = frontend_pod_list[0] - logger.info(f"Found frontend pod: {frontend_pod.name}") + # This chat-completion request is side-effect free, so one retry after a + # dropped port-forward is safe. + payload = { + "model": model, + "messages": [{"role": "user", "content": TEST_PROMPT}], + "max_tokens": DEFAULT_MAX_TOKENS, + "temperature": DEFAULT_TEMPERATURE, + "stream": False, + } + frontend_log_baseline = ( + len(normalize_log_lines(frontend_pod.logs(container="main"))) + if validate_agg_logging + else 0 + ) + response = deployment.send_request_with_port_forward_retry( + pod=frontend_pod, + remote_port=port, + endpoint=endpoint, + payload=payload, + timeout=float(DEFAULT_REQUEST_TIMEOUT), + port_forward=port_forward, + ) - # Setup port forwarding - port = deployment_spec.port - port_forward = deployment.port_forward(frontend_pod, port) - assert ( - port_forward is not None - ), f"Failed to establish port forward to {frontend_pod.name}:{port}" - - base_url = f"http://localhost:{port_forward.local_port}" - logger.info(f"Port forwarding established: {base_url}") - - # Wait for model to be available - endpoint = deployment_spec.endpoint - model_ready = wait_for_model_availability( - url=base_url, - endpoint=endpoint, - model=model, - logger=logger, - max_attempts=30, - ) + # Validate response + validate_chat_response( + response=response, + expected_model=model, + min_content_length=MIN_RESPONSE_CONTENT_LENGTH, + ) - assert ( - model_ready - ), f"Model '{model}' did not become available within the timeout period" - - # This chat-completion request is side-effect free, so one retry after a - # dropped port-forward is safe. - payload = { - "model": model, - "messages": [{"role": "user", "content": TEST_PROMPT}], - "max_tokens": DEFAULT_MAX_TOKENS, - "temperature": DEFAULT_TEMPERATURE, - "stream": False, - } - frontend_log_baseline = ( - len(normalize_log_lines(frontend_pod.logs(container="main"))) - if validate_agg_logging - else 0 - ) - response = deployment.send_request_with_port_forward_retry( - pod=frontend_pod, - remote_port=port, - endpoint=endpoint, - payload=payload, - timeout=float(DEFAULT_REQUEST_TIMEOUT), - port_forward=port_forward, - ) + if validate_agg_logging: + validate_agg_logging_output(frontend_pod, frontend_log_baseline) + + if capture_failure: + pod_uids = { + pod.metadata.uid + for pods in deployment.get_pods().values() + for pod in pods + } + # Readiness alone does not guarantee that worker metadata is visible. + async with asyncio.timeout(60): + while True: + metadata = ( + await deployment._custom_api.list_namespaced_custom_object( + "nvidia.com", + "v1alpha1", + namespace, + "dynamoworkermetadatas", + _request_timeout=3, + ) + ) + worker_uids = { + item["metadata"]["uid"] + for item in metadata["items"] + if any( + owner["uid"] in pod_uids + for owner in item["metadata"].get("ownerReferences", []) + ) + } + if worker_uids: + break + await asyncio.sleep(1) + raise RuntimeError("intentional discovery capture failure") - # Validate response - validate_chat_response( - response=response, - expected_model=model, - min_content_length=MIN_RESPONSE_CONTENT_LENGTH, - ) + logger.info( + f"Deployment test PASSED for {deployment_target.test_id} " + f"(source: {deployment_target.source}, model: {model}, namespace: {namespace})" + ) - if validate_agg_logging: - validate_agg_logging_output(frontend_pod, frontend_log_baseline) + if capture_failure: + snapshots = {} + for resource in ("dgd", "dwm", "pods", "services", "endpointslices"): + path = Path(deployment.log_dir) / "discovery" / f"{resource}.json" + record = json.loads(path.read_text()) + assert "error" not in record, record + assert record["namespace"] == namespace + assert record["deployment"] == deployment_spec.name + assert record["captured_at"] + snapshots[resource] = record["response"]["items"] + assert snapshots[resource], f"Empty discovery snapshot: {path}" + + dgd = next( + item + for item in snapshots["dgd"] + if item["metadata"]["name"] == deployment_spec.name + ) + assert dgd["metadata"]["resourceVersion"] + assert not dgd["metadata"].get("deletionTimestamp") + assert pod_uids <= {item["metadata"]["uid"] for item in snapshots["pods"]} + assert worker_uids <= {item["metadata"]["uid"] for item in snapshots["dwm"]} + for item in snapshots["dwm"]: + if item["metadata"]["uid"] in worker_uids: + assert item["metadata"]["resourceVersion"] + assert item["metadata"]["ownerReferences"] + services = {item["metadata"]["name"] for item in snapshots["services"]} + assert any( + item["metadata"].get("labels", {}).get("kubernetes.io/service-name") + in services + and any( + endpoint.get("targetRef", {}).get("uid") in pod_uids + and endpoint.get("conditions", {}).get("ready") + for endpoint in item["endpoints"] + ) + for item in snapshots["endpointslices"] + ) + # Deletion can be asynchronous while Kubernetes processes finalizers. + async with asyncio.timeout(60): + while True: + try: + await deployment._custom_api.get_namespaced_custom_object( + "nvidia.com", + deployment_spec.api_version, + namespace, + "dynamographdeployments", + deployment_spec.name, + _request_timeout=3, + ) + except ApiException as error: + if error.status != 404: + raise + break + await asyncio.sleep(1) logger.info( - f"Deployment test PASSED for {deployment_target.test_id} " - f"(source: {deployment_target.source}, model: {model}, namespace: {namespace})" + "Validated discovery snapshot files in %s/discovery", deployment.log_dir ) diff --git a/tests/deploy/test_dgd_utils.py b/tests/deploy/test_dgd_utils.py index c74a210ec0c7..c91a8778c113 100644 --- a/tests/deploy/test_dgd_utils.py +++ b/tests/deploy/test_dgd_utils.py @@ -3,6 +3,7 @@ """Unit tests for schema-aware DynamoGraphDeployment helpers.""" +import asyncio from types import SimpleNamespace from unittest.mock import AsyncMock, MagicMock @@ -13,6 +14,7 @@ import requests import yaml +from tests.deploy import dgd_utils from tests.deploy.dgd_utils import DeploymentSpec, ManagedDeployment pytestmark = [pytest.mark.unit, pytest.mark.pre_merge, pytest.mark.gpu_0] @@ -231,3 +233,62 @@ async def test_in_flight_restart_preserves_bounded_previous_log(tmp_path) -> Non previous=True, tail_lines=50000, ) + + +@pytest.mark.parametrize( + ("failed", "capture_behavior", "expected_events"), + [ + (False, "complete", ["service-logs", "delete"]), + ( + True, + "complete", + ["capture-start", "capture-done", "service-logs", "delete"], + ), + (True, "timeout", ["capture-start", "service-logs", "delete"]), + (True, "cancel", ["capture-start", "service-logs", "delete"]), + ], + ids=["success", "failure", "capture-timeout", "capture-cancelled"], +) +async def test_discovery_capture_and_cleanup( + monkeypatch, tmp_path, failed, capture_behavior, expected_events +): + deployment = managed_deployment(tmp_path) + events = [] + + # Isolate teardown from Kubernetes startup. + monkeypatch.setattr( + ManagedDeployment, "__aenter__", AsyncMock(return_value=deployment) + ) + deployment._get_service_logs = MagicMock( + side_effect=lambda: events.append("service-logs") + ) + snapshot_timeout = 1 if capture_behavior == "cancel" else 0.01 + monkeypatch.setattr(dgd_utils, "DISCOVERY_SNAPSHOT_TIMEOUT", snapshot_timeout) + + async def capture(): + events.append("capture-start") + if capture_behavior in {"timeout", "cancel"}: + await asyncio.Event().wait() + await asyncio.sleep(0) + events.append("capture-done") + + async def delete(): + events.append("delete") + + deployment._capture_discovery_state = capture + deployment._delete_deployment = delete + + if capture_behavior == "cancel": + with pytest.raises(TimeoutError): + async with asyncio.timeout(0.01): + async with deployment: + raise ValueError("inference failed") + elif failed: + with pytest.raises(ValueError, match="inference failed"): + async with deployment: + raise ValueError("inference failed") + else: + async with deployment: + pass + + assert events == expected_events From e35b9638f7d480f5baa159b4b595e696fc33b8b8 Mon Sep 17 00:00:00 2001 From: GLAMR Date: Fri, 18 Sep 2026 20:49:18 -0400 Subject: [PATCH 122/191] fix(vllm): distinguish undeclared RL weight versions (#13041) Signed-off-by: svc-glamr@nvidia.com Signed-off-by: Matej Kosec Co-authored-by: Matej Kosec --- components/src/dynamo/vllm/handlers.py | 48 +++++-- .../vllm/tests/test_vllm_worker_handler.py | 117 +++++++++++++++++- components/src/dynamo/vllm/worker_factory.py | 1 + .../integration-reference.md | 42 ++++++- 4 files changed, 199 insertions(+), 9 deletions(-) diff --git a/components/src/dynamo/vllm/handlers.py b/components/src/dynamo/vllm/handlers.py index 217d3c2d2f4b..cea26280da65 100644 --- a/components/src/dynamo/vllm/handlers.py +++ b/components/src/dynamo/vllm/handlers.py @@ -154,6 +154,8 @@ def _discard_orphan_result(fut: "asyncio.Future[dict]") -> None: "weight_version", } ) +# An object sentinel cannot collide with a caller-supplied version. +_WEIGHT_VERSION_UNDECLARED: Final = object() def build_prompt_tokens_details( @@ -1201,7 +1203,7 @@ def __init__( # to prevent both bypassing the check before either inserts (atomicity). self._lora_capacity_guard = asyncio.Lock() self._paused: bool = False - self._weight_version: str = "initial" + self._weight_version: Any = _WEIGHT_VERSION_UNDECLARED embedding_loader = self.init_embedding_loader(config, encode_worker_client) @@ -2017,7 +2019,7 @@ async def abort_request(self, body: dict) -> dict: return {"status": "error", "message": str(e)} async def get_weight_version(self, body: dict) -> dict: - """Return the current weight version tag.""" + """Report the worker's current declared weight-version state.""" if body is None: body = {} elif not isinstance(body, dict): @@ -2025,7 +2027,29 @@ async def get_weight_version(self, body: dict) -> dict: "status": "error", "message": "request body must be a JSON object", } - return {"status": "ok", "version": getattr(self, "_weight_version", "initial")} + version = self._weight_version + is_declared = version is not _WEIGHT_VERSION_UNDECLARED + return { + "status": "ok", + "version": version if is_declared else None, + "version_declared": is_declared, + } + + async def set_weight_version(self, body: dict) -> dict: + """Validate and declare a weight version for subsequent requests.""" + if body is None: + body = {} + elif not isinstance(body, dict): + return { + "status": "error", + "message": "request body must be a JSON object", + } + if "weight_version" not in body: + return {"status": "error", "message": "Missing 'weight_version' in body"} + version = body["weight_version"] + self._weight_version = version + logger.info("[RL] Weight version declared") + return {"status": "ok", "version": version} async def update_weights_from_disk(self, body: dict) -> dict: """Load weights from a shared filesystem checkpoint.""" @@ -2064,11 +2088,16 @@ async def update_weights_from_disk(self, body: dict) -> dict: # weights is now stale and must not be reused. Invalidate it # while still holding _pause_lock (generation is paused). await self.engine_client.reset_prefix_cache() - self._weight_version = version + if "weight_version" in body: + self._weight_version = version logger.info( f"[RL] Weights loaded from {path} (version={version}, rpc={rpc})" ) - return {"status": "ok", "version": version} + return { + "status": "ok", + "version": version, + "version_declared": "weight_version" in body, + } except EngineDeadError as e: self._shutdown_on_engine_dead(e) except Exception as e: @@ -2127,12 +2156,17 @@ async def update_weights_from_distributed(self, body: dict) -> dict: # Weights changed: stale prefix/KV cache must be invalidated # before resume so it is not reused under the new weights. await self.engine_client.reset_prefix_cache() - self._weight_version = version + if "weight_version" in body: + self._weight_version = version logger.info( f"[RL] Weights received via distributed " f"(version={version}, rpc={rpc})" ) - return {"status": "ok", "version": version} + return { + "status": "ok", + "version": version, + "version_declared": "weight_version" in body, + } except EngineDeadError as e: self._shutdown_on_engine_dead(e) except Exception as e: diff --git a/components/src/dynamo/vllm/tests/test_vllm_worker_handler.py b/components/src/dynamo/vllm/tests/test_vllm_worker_handler.py index 6ddd3472c40d..fad0a4e58683 100644 --- a/components/src/dynamo/vllm/tests/test_vllm_worker_handler.py +++ b/components/src/dynamo/vllm/tests/test_vllm_worker_handler.py @@ -98,6 +98,7 @@ def _make_handler( # BaseWorkerHandler.__init__ is bypassed above; the decode generate path # registers per-request deferred-abort guards here. handler._deferred_aborts = {} + handler._weight_version = mod._WEIGHT_VERSION_UNDECLARED return handler @@ -1926,6 +1927,8 @@ async def test_admin_rejects_non_dict_body(self): handler.resume_generation, handler.flush_cache, handler.abort_request, + handler.get_weight_version, + handler.set_weight_version, ): resp = await fn(body) assert resp["status"] == "error", (fn.__name__, body, resp) @@ -1950,7 +1953,7 @@ async def test_distributed_update_can_match_async_rl_semantics(self): } ) - assert resp == {"status": "ok", "version": 7} + assert resp == {"status": "ok", "version": 7, "version_declared": True} handler.engine_client.collective_rpc.assert_awaited_once_with( "update_weights", kwargs={"update_info": {"names": ["weight"]}}, @@ -1998,6 +2001,118 @@ async def test_distributed_update_preserves_safe_defaults(self): ) handler.engine_client.reset_prefix_cache.assert_awaited_once_with() + @staticmethod + def _make_rl_handler(): + handler = _make_handler() + handler._pause_lock = asyncio.Lock() + handler._paused = False + handler.engine_client = MagicMock() + handler.engine_client.collective_rpc = AsyncMock() + handler.engine_client.reset_prefix_cache = AsyncMock() + return handler + + @pytest.mark.asyncio + async def test_get_weight_version_reports_undeclared_before_any_update(self): + config = _make_config(enable_multimodal=False) + config.custom_encoder_class = None + with patch.object(mod, "VllmEngineMonitor"): + handler = mod.DecodeWorkerHandler( + runtime=MagicMock(), + config=config, + engine=MagicMock(), + default_sampling_params={}, + ) + + resp = await handler.get_weight_version({}) + + assert resp["status"] == "ok" + assert resp["version_declared"] is False + assert resp["version"] is None + + @pytest.mark.asyncio + @pytest.mark.parametrize("version", [None, 7, "policy-43"]) + async def test_set_weight_version_declares_without_touching_the_engine( + self, version + ): + handler = self._make_rl_handler() + + resp = await handler.set_weight_version({"weight_version": version}) + + assert resp == {"status": "ok", "version": version} + assert await handler.get_weight_version({}) == { + "status": "ok", + "version": version, + "version_declared": True, + } + handler.engine_client.collective_rpc.assert_not_awaited() + handler.engine_client.reset_prefix_cache.assert_not_awaited() + + @pytest.mark.asyncio + async def test_set_weight_version_rejects_a_missing_version(self): + handler = self._make_rl_handler() + + resp = await handler.set_weight_version({}) + + assert resp["status"] == "error" + assert (await handler.get_weight_version({}))["version_declared"] is False + + @pytest.mark.asyncio + @pytest.mark.parametrize("version", [None, "initial", "unknown"]) + @pytest.mark.parametrize( + ("route", "body"), + [ + ("update_weights_from_disk", {"model_path": "/models/checkpoint-42"}), + ("update_weights_from_distributed", {"engine_rpc": "update_weights"}), + ], + ) + async def test_explicit_version_is_declared(self, route, body, version): + handler = self._make_rl_handler() + handler._paused = True + + response = await getattr(handler, route)({**body, "weight_version": version}) + + assert response == { + "status": "ok", + "version": version, + "version_declared": True, + } + assert await handler.get_weight_version({}) == { + "status": "ok", + "version": version, + "version_declared": True, + } + + @pytest.mark.asyncio + @pytest.mark.parametrize( + "version", + [mod._WEIGHT_VERSION_UNDECLARED, None, "policy-42"], + ids=["undeclared", "declared-null", "declared-string"], + ) + @pytest.mark.parametrize( + ("route", "body"), + [ + ("update_weights_from_disk", {"model_path": "/models/checkpoint-43"}), + ("update_weights_from_distributed", {"engine_rpc": "update_weights"}), + ], + ) + async def test_update_without_a_version_preserves_declaration( + self, route, body, version + ): + handler = self._make_rl_handler() + handler._paused = True + if version is not mod._WEIGHT_VERSION_UNDECLARED: + await handler.set_weight_version({"weight_version": version}) + previous = await handler.get_weight_version({}) + + response = await getattr(handler, route)(body) + + assert response == { + "status": "ok", + "version": "unknown", + "version_declared": False, + } + assert await handler.get_weight_version({}) == previous + @pytest.mark.asyncio async def test_init_weights_update_group_succeeds_within_timeout(self): handler = _make_handler() diff --git a/components/src/dynamo/vllm/worker_factory.py b/components/src/dynamo/vllm/worker_factory.py index 4c87277a4dce..330e0d0873d9 100644 --- a/components/src/dynamo/vllm/worker_factory.py +++ b/components/src/dynamo/vllm/worker_factory.py @@ -1843,6 +1843,7 @@ def register_engine_routes( "init_weights_update_group": handler.init_weights_update_group, "destroy_weights_update_group": handler.destroy_weights_update_group, "get_weight_version": handler.get_weight_version, + "set_weight_version": handler.set_weight_version, } if lora_enabled: diff --git a/docs/fern/pages/use-cases/reinforcement-learning/integration-reference.md b/docs/fern/pages/use-cases/reinforcement-learning/integration-reference.md index 495b8bf74212..f631b51f0235 100644 --- a/docs/fern/pages/use-cases/reinforcement-learning/integration-reference.md +++ b/docs/fern/pages/use-cases/reinforcement-learning/integration-reference.md @@ -122,6 +122,7 @@ A protocol version `1` response has this shape. Optional fields such as `model`, "liveness_probe", "pause_generation", "resume_generation", + "set_weight_version", "update_weights_from_disk" ] } @@ -195,12 +196,51 @@ The backends do not share one administration schema. Use the exact route returne | Stop and resume work | Python `pause_generation` / `resume_generation`; native-sidecar control routes reflect the installed vLLM RL API | `release_memory_occupation` unregisters and drains the worker; `resume_memory_occupation` restores it | | Clear KV state | Python `flush_cache`; native-sidecar behavior follows the advertised lifecycle route and vLLM configuration | `clear_kv_blocks` is a Dynamo worker request-plane endpoint, not a built-in `/engine/control/*` route, and rejects active requests | | Apply weights | Python disk or distributed update routes and group lifecycle; native sidecar init/start/update/finish routes when weight transfer is enabled | Built-in disk, tensor, distributed, or IPC update routes using the installed SGLang request schemas | -| Weight version | Python `get_weight_version` reads caller-supplied update metadata; native sidecar exposes get/update controls | `update_weight_version` changes metadata and can abort requests; it does not replace tensors | +| Weight version | Python `get_weight_version` reads the last declared version; `set_weight_version` declares metadata without loading weights; native sidecar exposes get/update controls | `update_weight_version` changes metadata and can abort requests; it does not replace tensors | | Custom controls | Python integrations can register and advertise trusted engine routes | Allowlist methods with `--engine-route` or `DYN_SGLANG_ENGINE_ROUTES` using path[=method][:engine|tm] | | Success body | Python RL routes commonly return a `status` field; native-sidecar routes follow vLLM's RL schemas | Built-in update routes commonly return `success` and `message`; check both HTTP status and body | Even two vLLM deployments can expose different route families because the Python worker and native sidecar adapt different backend control APIs. Never prepend, remove, or rename route segments returned in `routes`. +### Read and Declare the Weight Version + +A Python vLLM worker reports the last weight version declared to it through `get_weight_version`: + +```bash +curl http://10.0.0.12:8081/engine/get_weight_version \ + -H 'Content-Type: application/json' \ + -d '{}' +``` + +```json +{"status": "ok", "version": "42", "version_declared": true} +``` + +A worker tracks only the versions declared to it. `version_declared` is `false`, with `version` set to `null`, until something declares one, either through a `/engine/` weight-update route that carries `weight_version` or through `set_weight_version`. Branch on `version_declared` rather than comparing `version` against a placeholder string: any string, including `"initial"`, is a legal version tag that a caller can declare. + +For each Python vLLM worker, check that `routes` from `GET /v1/rl/workers` includes `set_weight_version` before relying on `version_declared`. Older workers omit both that route and the response field; treat a missing `version_declared` as unsupported declaration tracking, not as `false`, because their `"initial"` version cannot distinguish an undeclared worker from an explicit declaration. + +Version declarations accept any JSON value, including `null`. An explicit `{"weight_version": null}` is a declaration: `get_weight_version` then returns `"version": null` with `"version_declared": true`. + +A successful weight-update reply includes `version_declared` to indicate whether that update declared a version. If the request omits `weight_version`, the reply contains `"version": "unknown"` and `"version_declared": false`, and the previous declaration remains unchanged. An explicit `{"weight_version": "unknown"}` returns the same version with `"version_declared": true`. In an update reply, this flag describes the update; in `get_weight_version`, it describes the stored declaration. A worker with no previous declaration remains undeclared after an update that omits the version. Pass `weight_version` on every update whose version you want the worker to report. + +> [!WARNING] +> A worker reports the last version declared to it, not the weights loaded in its GPU memory. Dynamo observes only the weight updates that traverse its own `/engine/` routes. Loading weights by another path, such as calling `collective_rpc` on the engine object directly, leaves the reported version stale unless the loader declares the new version. + +When an RL framework loads weights outside Dynamo, declare the resulting version so the worker reports it. `set_weight_version` records the version without loading weights: + +```bash +curl http://10.0.0.12:8081/engine/set_weight_version \ + -H 'Content-Type: application/json' \ + -d '{"weight_version": "43"}' +``` + +```json +{"status": "ok", "version": "43"} +``` + +The route requires `weight_version` in the body and returns `{"status": "error"}` when it is missing. It neither pauses generation nor invalidates the prefix cache, so a caller that changed the weights must handle both itself. + ## Framework Compatibility | Framework | Status | Current Dynamo path | Key boundary | From 848206e594cda58a06556de3bbf392787911a48f Mon Sep 17 00:00:00 2001 From: Neelay Shah Date: Fri, 18 Sep 2026 17:57:10 -0700 Subject: [PATCH 123/191] fix(common-http): pin validated DNS answers at connect time (#14474) Signed-off-by: nnshah1 Signed-off-by: Dmitry Tokarev Co-authored-by: Claude Opus 4.8 Co-authored-by: Dmitry Tokarev --- .../common/configuration/groups/http_args.py | 2 +- components/src/dynamo/common/http/README.md | 29 +- components/src/dynamo/common/http/__init__.py | 15 +- .../src/dynamo/common/http/_ssrf_resolver.py | 98 +++++++ .../src/dynamo/common/http/aiohttp_client.py | 129 ++++++++- components/src/dynamo/common/http/base.py | 33 ++- .../dynamo/common/multimodal/audio_loader.py | 4 +- .../common/multimodal/media_connector.py | 4 +- .../dynamo/common/multimodal/video_loader.py | 4 +- .../src/dynamo/common/tests/http/conftest.py | 30 +- .../common/tests/http/test_aiohttp_client.py | 258 +++++++++++++++++- .../common/tests/http/test_http_facade.py | 8 +- .../common/tests/http/test_ssrf_resolver.py | 128 +++++++++ .../common/tests/http/test_url_validator.py | 6 +- .../tests/multimodal/test_audio_loader.py | 25 +- .../tests/multimodal/test_video_loader.py | 24 +- tests/report_pytest_markers.py | 6 + 17 files changed, 760 insertions(+), 43 deletions(-) create mode 100644 components/src/dynamo/common/http/_ssrf_resolver.py create mode 100644 components/src/dynamo/common/tests/http/test_ssrf_resolver.py diff --git a/components/src/dynamo/common/configuration/groups/http_args.py b/components/src/dynamo/common/configuration/groups/http_args.py index f2f58ac0829d..c0de78d6481a 100644 --- a/components/src/dynamo/common/configuration/groups/http_args.py +++ b/components/src/dynamo/common/configuration/groups/http_args.py @@ -146,7 +146,7 @@ def add_arguments(self, parser: argparse.ArgumentParser) -> None: default=100, arg_type=int, dest="max_connections", - help="Total pool size cap (httpx Limits.max_connections / aiohttp TCPConnector.limit).", + help="Pool size cap per connect-time policy (aiohttp TCPConnector.limit). The aiohttp client keeps one pool per connect-time policy outcome, at most two, so a deployment that sets DYN_MM_ALLOW_INTERNAL=1 and also issues stricter per-request policies can reach twice this value in total.", ) add_argument( g, diff --git a/components/src/dynamo/common/http/README.md b/components/src/dynamo/common/http/README.md index b02f90d51952..f8c66cfe7168 100644 --- a/components/src/dynamo/common/http/README.md +++ b/components/src/dynamo/common/http/README.md @@ -11,9 +11,32 @@ uses aiohttp. `AiohttpClient` is the single supported backend. Its connector queues pending connections in `O(1)`, so latency stays close to the offered rate when one request fans out to many URLs (e.g. 100 image fetches), -and it exposes a `TCPConnector(resolver=...)` DNS hook that can pin -validated DNS answers for a connect-time SSRF backstop (the default -client here uses the stock resolver; the pinning lands as a follow-up). See the +and it exposes a `TCPConnector(resolver=...)` DNS hook that pins the +validated DNS answers as a connect-time SSRF backstop against DNS +rebinding — the default client wires a `BlocklistResolver` (see +`_ssrf_resolver.py`). The connector may return private addresses only when the +`DYN_MM_ALLOW_INTERNAL` deployment baseline **and** the request policy both +allow it, so neither side alone can weaken the other. The client keeps one +session per outcome and closes each resolver itself, because aiohttp closes +only a resolver it created. + +> [!IMPORTANT] +> The backstop governs **direct** connections only. When a proxy applies +> (`HTTP_PROXY` / `HTTPS_PROXY` — the session runs `trust_env=True`), the +> connector dials the proxy and the *proxy* resolves the origin, out of this +> resolver's sight, so the check cannot govern the destination. +> +> A policy-protected fetch that a proxy would carry therefore **fails closed**. +> Set `DYN_MM_TRUST_EGRESS_PROXY=1` to assert that the proxy enforces +> destination policy itself, and the fetch proceeds. The gate asks aiohttp +> which proxy applies to that specific URL, so `NO_PROXY` is honored and a +> fetch that goes direct is never refused. It does not apply when +> `DYN_MM_ALLOW_INTERNAL=1`, which already permits private destinations. +> +> Note aiohttp never calls a resolver for an IP literal, so literal blocked +> addresses are `validate_url`'s job rather than the backstop's. + +See the [NeMo Gym aiohttp vs httpx note](https://docs.nvidia.com/nemo/gym/latest/infrastructure/engineering-notes/aiohttp-vs-httpx.html) for the fan-out latency comparison. diff --git a/components/src/dynamo/common/http/__init__.py b/components/src/dynamo/common/http/__init__.py index 894646df807e..a8eed9266746 100644 --- a/components/src/dynamo/common/http/__init__.py +++ b/components/src/dynamo/common/http/__init__.py @@ -11,9 +11,16 @@ ``DYN_HTTP_BACKEND`` accepts only ``aiohttp``; any other value logs a warning and uses aiohttp. aiohttp scales well under fan-out and exposes a -``TCPConnector(resolver=...)`` hook that a policy-aware resolver can use to pin -validated DNS answers (the connect-time SSRF backstop lands on top of this -capability; it is not wired in the default client here). +``TCPConnector(resolver=...)`` hook. The default client wires a +``BlocklistResolver`` (``_ssrf_resolver.py``) into it that pins validated DNS +answers at connect time — the SSRF backstop against DNS rebinding. The +connector may return private addresses only when the ``DYN_MM_ALLOW_INTERNAL`` +deployment baseline and the request policy both allow it. It governs +**direct** connections: when a proxy applies, the proxy resolves the origin, +so a policy-protected fetch that would be proxied fails closed unless +``DYN_MM_TRUST_EGRESS_PROXY=1`` asserts that the proxy enforces destination +policy. ``NO_PROXY`` is honored, so a fetch that goes direct is never refused. +IP literals never reach a resolver in aiohttp and stay ``validate_url``'s job. """ from __future__ import annotations @@ -32,6 +39,7 @@ from .aiohttp_client import AiohttpClient from .base import ( HttpClient, + HttpConfigurationError, HttpConnectionError, HttpError, HttpStatusError, @@ -97,6 +105,7 @@ async def close_http_client() -> None: "AiohttpClient", "HttpError", "HttpTimeoutError", + "HttpConfigurationError", "HttpConnectionError", "HttpStatusError", "HttpConfigBase", diff --git a/components/src/dynamo/common/http/_ssrf_resolver.py b/components/src/dynamo/common/http/_ssrf_resolver.py new file mode 100644 index 000000000000..8d550fbd6544 --- /dev/null +++ b/components/src/dynamo/common/http/_ssrf_resolver.py @@ -0,0 +1,98 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Connect-time SSRF backstop for the aiohttp backend. + +``validate_url`` checks a hostname's resolved IPs, but the client re-resolves at +connect, so a DNS-rebinding server can return a public IP on the check and an +internal one at connect. aiohttp's ``TCPConnector(resolver=...)`` hook lets us +resolve + filter once and hand the connector the validated addresses to dial, +while the hostname is still used for TLS SNI / certificate verification — the +same mechanism the Rust frontend uses on reqwest's ``dns_resolver`` +(``lib/llm/src/preprocessor/media/loader.rs``). Reuses +:func:`url_validator.is_blocked_ip`. + +Scope: this governs **direct** connections. When an egress proxy is configured, +the proxy resolves the origin, so SSRF must be enforced at the proxy / network +layer instead (true of the Rust path as well). +""" + +from __future__ import annotations + +import errno +import socket + +from aiohttp.abc import AbstractResolver, ResolveResult +from aiohttp.helpers import proxies_from_env +from aiohttp.resolver import DefaultResolver + +from .url_validator import describe_media_source, is_blocked_ip + + +class SsrfBlockedAddress(OSError): + """Raised at connect time when every resolved IP is in a blocked range.""" + + +def _env_proxy_hosts() -> frozenset[str]: + """Hosts of any egress proxy configured in the environment. + + The session runs with ``trust_env=True``, so when a proxy is configured the + connector dials *the proxy*, and it is the proxy's own address that reaches + this resolver -- the origin is resolved by the proxy, out of our sight. A + corporate proxy on a private address would therefore be filtered here and + take out every fetch: measured, HTTP_PROXY at a private host turns each one + into ClientConnectorDNSError. Exempt the configured proxy so proxied + deployments keep working, and see the module docstring for what that means + for enforcement. + """ + return frozenset( + info.proxy.host + for info in proxies_from_env().values() + if info.proxy.host is not None + ) + + +class BlocklistResolver(AbstractResolver): + """aiohttp resolver that drops blocked IPs before the connector dials. + + Returns the full set of non-blocked addresses (not just the first) so + aiohttp keeps its normal multi-address / Happy-Eyeballs fallback. + + Note aiohttp short-circuits IP literals in ``TCPConnector._resolve_host`` + and never calls a resolver for them, so literal blocked addresses are + ``validate_url``'s job, not this one. This covers the hostname case, which + is the one that rebinds. + """ + + def __init__(self, *, allow_private_ips: bool) -> None: + self._inner = DefaultResolver() + self._allow_private_ips = allow_private_ips + self._proxy_hosts = _env_proxy_hosts() + + async def resolve( + self, + host: str, + port: int = 0, + family: socket.AddressFamily = socket.AF_INET, + ) -> list[ResolveResult]: + hosts = await self._inner.resolve(host, port, family) + if self._allow_private_ips or host in self._proxy_hosts: + return hosts + allowed = [h for h in hosts if not is_blocked_ip(h["host"])] + if not allowed: + # ``host`` is caller-supplied and unbounded; this text reaches an + # error response and a log line through the facade's connection + # error, so bound it the way every other message on this path is. + # + # Two-argument OSError on purpose: aiohttp wraps this in + # ClientConnectorDNSError and renders ``strerror``, so the + # one-argument form reaches the caller as a bare "[None]" and the + # reason is lost exactly where an operator would read it. + raise SsrfBlockedAddress( + errno.EHOSTUNREACH, + f"host {describe_media_source(host)} resolves only to blocked IPs", + ) + return allowed + + async def close(self) -> None: + await self._inner.close() diff --git a/components/src/dynamo/common/http/aiohttp_client.py b/components/src/dynamo/common/http/aiohttp_client.py index d1b2c1561013..1294183c8904 100644 --- a/components/src/dynamo/common/http/aiohttp_client.py +++ b/components/src/dynamo/common/http/aiohttp_client.py @@ -12,19 +12,27 @@ import asyncio import logging +import os from typing import Optional import aiohttp +from aiohttp.helpers import get_env_proxy_for_url from yarl import URL +from ._ssrf_resolver import BlocklistResolver from .base import ( HttpClient, + HttpConfigurationError, HttpConnectionError, HttpStatusError, HttpTimeoutError, collect_capped, ) -from .url_validator import describe_error_detail, describe_media_source +from .url_validator import ( + UrlValidationPolicy, + describe_error_detail, + describe_media_source, +) logger = logging.getLogger(__name__) @@ -35,13 +43,23 @@ # bounds how far past the limit a single read can carry. _READ_CHUNK = 64 * 1024 +# Set to "1" to assert that the configured egress proxy enforces destination +# policy itself. Spelled like DYN_MM_ALLOW_INTERNAL, which it sits beside. +DYN_MM_TRUST_EGRESS_PROXY = "DYN_MM_TRUST_EGRESS_PROXY" + class AiohttpClient(HttpClient): """aiohttp-backed concrete client.""" def __init__(self, config=None) -> None: super().__init__(config) - self._session: Optional[aiohttp.ClientSession] = None + # Keyed by whether the connector may return private addresses. At most + # two entries, so a request that asks for a stricter policy than the + # deployment baseline gets a connector that actually enforces it. + self._sessions: dict[bool, aiohttp.ClientSession] = {} + # aiohttp marks an injected resolver as externally owned, so closing a + # session never closes it. Hold each one and close it ourselves. + self._resolvers: dict[bool, BlocklistResolver] = {} def _effective_timeout(self, timeout: float) -> aiohttp.ClientTimeout: # The override caps ``total`` (whole request). ``sock_connect`` @@ -57,7 +75,57 @@ def _effective_timeout(self, timeout: float) -> aiohttp.ClientTimeout: total=total, sock_connect=self._config.connect_timeout ) - def _build_session(self) -> aiohttp.ClientSession: + @staticmethod + def _connect_allows_private(policy: Optional[UrlValidationPolicy]) -> bool: + """Whether the connector may return private addresses for this fetch. + + The intersection of the deployment baseline and the request policy. + Taking the baseline alone lets ``DYN_MM_ALLOW_INTERNAL=1`` override a + caller that explicitly asked for ``allow_private_ips=False``, and + taking the request alone lets any caller opt out of the deployment + setting. Only when both allow it does the backstop stand down. + """ + env_allows = UrlValidationPolicy.from_env().allow_private_ips + if policy is None: + return env_allows + return env_allows and policy.allow_private_ips + + @staticmethod + async def _require_trusted_egress_proxy(url: str) -> None: + """Refuse a protected fetch that a proxy would put out of our reach. + + When a proxy applies, the connector dials the proxy and the proxy + resolves the origin, so the origin hostname never reaches the + connect-time check. Measured: the resolver sees only the proxy host, + while the proxy receives the absolute URI. Documenting that boundary + does not enforce it, so fail closed unless an operator asserts that + the proxy enforces destination policy itself. + + Asks aiohttp which proxy applies to *this* URL rather than whether any + proxy variable is set, so ``NO_PROXY`` is honored and a fetch that + would go direct is not refused. + """ + if os.getenv(DYN_MM_TRUST_EGRESS_PROXY, "").strip() == "1": + return + try: + # aiohttp runs this same helper through asyncio.to_thread because + # it does proxy-bypass discovery and .netrc file reads. Match that + # rather than repeating the blocking work on the event loop. + await asyncio.to_thread(get_env_proxy_for_url, URL(url)) + except LookupError: + # No proxy for this URL, so aiohttp dials the origin and the + # connect-time check governs it. + return + raise HttpConfigurationError( + f"{describe_media_source(url)} would be fetched through an egress " + "proxy, so the connect-time address check cannot govern the " + f"origin; set {DYN_MM_TRUST_EGRESS_PROXY}=1 to assert that the " + "proxy enforces destination policy, or unset the proxy" + ) + + def _build_session(self, allow_private_ips: bool) -> aiohttp.ClientSession: + resolver = BlocklistResolver(allow_private_ips=allow_private_ips) + self._resolvers[allow_private_ips] = resolver connector = aiohttp.TCPConnector( limit=self._config.max_connections, # Single-origin fan-out is the whole point; capping per-host @@ -65,13 +133,19 @@ def _build_session(self) -> aiohttp.ClientSession: limit_per_host=0, keepalive_timeout=self._config.keepalive_timeout, enable_cleanup_closed=True, + # Connect-time SSRF backstop against DNS rebinding (see + # _ssrf_resolver). See _connect_allows_private for how the flag is + # derived. DYN_MM_ALLOW_INTERNAL is the deployment knob. + resolver=resolver, ) return aiohttp.ClientSession(connector=connector, trust_env=True) - async def _get_session(self) -> aiohttp.ClientSession: + async def _get_session(self, allow_private_ips: bool) -> aiohttp.ClientSession: async with self._lock: - if self._session is None or self._session.closed: - self._session = self._build_session() + session = self._sessions.get(allow_private_ips) + if session is None or session.closed: + session = self._build_session(allow_private_ips) + self._sessions[allow_private_ips] = session logger.info( "aiohttp backend initialized: limit=%d, limit_per_host=0, " "keepalive_timeout=%.1fs%s", @@ -81,12 +155,22 @@ async def _get_session(self) -> aiohttp.ClientSession: if self._config.per_call_timeout_override is not None else "; total timeout set per-request", ) - return self._session + return session async def _fetch_simple( - self, url: str, timeout: float, *, max_bytes: Optional[int] = None + self, + url: str, + timeout: float, + *, + max_bytes: Optional[int] = None, + policy: Optional[UrlValidationPolicy] = None, ) -> bytes: - session = await self._get_session() + allow_private = self._connect_allows_private(policy) + # Only when the check is meant to bite. If private destinations are + # already permitted for this fetch, the proxy gate protects nothing. + if not allow_private: + await self._require_trusted_egress_proxy(url) + session = await self._get_session(allow_private) client_timeout = self._effective_timeout(timeout) try: async with session.get( @@ -116,9 +200,19 @@ async def _fetch_simple( ) from e async def _fetch_body_or_redirect( - self, url: str, timeout: float, *, max_bytes: Optional[int] = None + self, + url: str, + timeout: float, + *, + max_bytes: Optional[int] = None, + policy: Optional[UrlValidationPolicy] = None, ) -> tuple[bytes | None, str | None]: - session = await self._get_session() + allow_private = self._connect_allows_private(policy) + # Only when the check is meant to bite. If private destinations are + # already permitted for this fetch, the proxy gate protects nothing. + if not allow_private: + await self._require_trusted_egress_proxy(url) + session = await self._get_session(allow_private) client_timeout = self._effective_timeout(timeout) try: async with session.get( @@ -165,6 +259,13 @@ async def _fetch_body_or_redirect( async def close(self) -> None: async with self._lock: - if self._session is not None and not self._session.closed: - await self._session.close() - self._session = None + for session in self._sessions.values(): + if not session.closed: + await session.close() + self._sessions = {} + # TCPConnector sets _resolver_owner=False for an injected resolver + # and only closes the one it made itself, so closing the session + # above leaves ours open. + for resolver in self._resolvers.values(): + await resolver.close() + self._resolvers = {} diff --git a/components/src/dynamo/common/http/base.py b/components/src/dynamo/common/http/base.py index beee869cedb9..c928de3de6b6 100644 --- a/components/src/dynamo/common/http/base.py +++ b/components/src/dynamo/common/http/base.py @@ -47,6 +47,16 @@ class HttpConnectionError(HttpError): """Network-layer failure: DNS, refused, reset, half-close.""" +class HttpConfigurationError(HttpError): + """The deployment is configured so the fetch cannot be made safely. + + An operator fault, not a verdict on the caller's URL, so it must not reach + the client as a 4xx. Loaders that convert unknown exceptions into + ``ValueError`` have to let this one through: ``py_err_to_dynamo`` maps + ``ValueError`` to ``InvalidArgument``, which is a client error. + """ + + class HttpStatusError(HttpError): """Server responded with a non-2xx status.""" @@ -152,7 +162,7 @@ async def _fetch_with_revalidation( visited.append(current) body, redirect_to = await self._fetch_body_or_redirect( - current, timeout, max_bytes=max_bytes + current, timeout, max_bytes=max_bytes, policy=policy ) if redirect_to is None: @@ -174,13 +184,28 @@ async def _fetch_with_revalidation( @abc.abstractmethod async def _fetch_simple( - self, url: str, timeout: float, *, max_bytes: Optional[int] = None + self, + url: str, + timeout: float, + *, + max_bytes: Optional[int] = None, + policy: Optional[UrlValidationPolicy] = None, ) -> bytes: - """Backend's native redirect-following GET (no SSRF policy applied).""" + """Backend's native redirect-following GET (no SSRF policy applied). + + ``policy`` is not applied to the URL here. It is passed so a backend + can honor a request that is stricter than the deployment baseline at + connect time; see ``AiohttpClient._connect_allows_private``. + """ @abc.abstractmethod async def _fetch_body_or_redirect( - self, url: str, timeout: float, *, max_bytes: Optional[int] = None + self, + url: str, + timeout: float, + *, + max_bytes: Optional[int] = None, + policy: Optional[UrlValidationPolicy] = None, ) -> tuple[bytes | None, str | None]: """Single hop with redirects disabled. diff --git a/components/src/dynamo/common/multimodal/audio_loader.py b/components/src/dynamo/common/multimodal/audio_loader.py index b9a5941389bd..15bb17b78930 100644 --- a/components/src/dynamo/common/multimodal/audio_loader.py +++ b/components/src/dynamo/common/multimodal/audio_loader.py @@ -8,7 +8,7 @@ import numpy as np -from dynamo.common.http import HttpStatusError, fetch_bytes +from dynamo.common.http import HttpConfigurationError, HttpStatusError, fetch_bytes from dynamo.common.http.url_validator import ( UrlValidationError, UrlValidationPolicy, @@ -153,7 +153,7 @@ async def load_audio(self, audio_url: str) -> tuple[np.ndarray, float]: return waveform, sr except FileNotFoundError: raise - except (UrlValidationError, HttpStatusError): + except (UrlValidationError, HttpStatusError, HttpConfigurationError): # Preserve deliberate client-error verdicts. UrlValidationError is # a ValueError, so the generic handler below would otherwise erase # its type and prevent the frontend from returning a 4xx. diff --git a/components/src/dynamo/common/multimodal/media_connector.py b/components/src/dynamo/common/multimodal/media_connector.py index 31eb097ce51f..bc9b918107fc 100644 --- a/components/src/dynamo/common/multimodal/media_connector.py +++ b/components/src/dynamo/common/multimodal/media_connector.py @@ -19,7 +19,7 @@ from PIL import Image -from dynamo.common.http import HttpStatusError +from dynamo.common.http import HttpConfigurationError, HttpStatusError from dynamo.common.http.url_validator import UrlValidationError from dynamo.common.multimodal.image_loader import ImageLoader @@ -70,7 +70,7 @@ async def fetch_image_async( """Async image fetch via dynamo's ImageLoader with LRU cache.""" try: img = await self._image_loader.load_image(image_url) - except (UrlValidationError, HttpStatusError): + except (UrlValidationError, HttpStatusError, HttpConfigurationError): # These are deliberate client-error verdicts, not signals that # another loader should retry the same rejected URL. raise diff --git a/components/src/dynamo/common/multimodal/video_loader.py b/components/src/dynamo/common/multimodal/video_loader.py index f9134305003c..042bd24b8f93 100644 --- a/components/src/dynamo/common/multimodal/video_loader.py +++ b/components/src/dynamo/common/multimodal/video_loader.py @@ -23,7 +23,7 @@ import numpy as np -from dynamo.common.http import HttpStatusError, fetch_bytes +from dynamo.common.http import HttpConfigurationError, HttpStatusError, fetch_bytes from dynamo.common.http.url_validator import ( UrlValidationError, UrlValidationPolicy, @@ -271,7 +271,7 @@ async def load_video( return np.ascontiguousarray(frames), metadata except FileNotFoundError: raise - except (UrlValidationError, HttpStatusError): + except (UrlValidationError, HttpStatusError, HttpConfigurationError): # Preserve deliberate client-error verdicts. UrlValidationError is # a ValueError, so the generic handler below would otherwise erase # its type and prevent the frontend from returning a 4xx. diff --git a/components/src/dynamo/common/tests/http/conftest.py b/components/src/dynamo/common/tests/http/conftest.py index 0bd56223c909..c80c344c694b 100644 --- a/components/src/dynamo/common/tests/http/conftest.py +++ b/components/src/dynamo/common/tests/http/conftest.py @@ -3,17 +3,41 @@ """Shared fixtures for HTTP facade tests. -Autouse fixture ensures the shared HTTP client singleton is closed after -each test so ``DYN_HTTP_BACKEND`` changes take effect between runs and -no "Unclosed client session" warning bleeds across tests. +One autouse fixture closes the shared HTTP client singleton after each test, +so ``DYN_HTTP_BACKEND`` changes take effect between runs and no "Unclosed +client session" warning bleeds across tests. + +A second clears the proxy environment. The client refuses a policy-protected +fetch that an egress proxy would carry (see ``DYN_MM_TRUST_EGRESS_PROXY``), so +a developer machine or CI runner with an ambient ``http_proxy`` would other- +wise fail tests that have nothing to do with proxies. A test that wants a +proxy sets one itself with ``monkeypatch``. """ from __future__ import annotations +import pytest import pytest_asyncio from dynamo.common.http import close_http_client +_PROXY_VARS = ( + "http_proxy", + "https_proxy", + "all_proxy", + "no_proxy", + "HTTP_PROXY", + "HTTPS_PROXY", + "ALL_PROXY", + "NO_PROXY", +) + + +@pytest.fixture(autouse=True) +def _no_ambient_proxy(monkeypatch): + for name in _PROXY_VARS: + monkeypatch.delenv(name, raising=False) + @pytest_asyncio.fixture(autouse=True) async def _close_shared_http_client(): diff --git a/components/src/dynamo/common/tests/http/test_aiohttp_client.py b/components/src/dynamo/common/tests/http/test_aiohttp_client.py index 7c31ea8ad622..5a0a1a37e73d 100644 --- a/components/src/dynamo/common/tests/http/test_aiohttp_client.py +++ b/components/src/dynamo/common/tests/http/test_aiohttp_client.py @@ -24,6 +24,8 @@ from dynamo.common import http as mm_http from dynamo.common.http import AiohttpClient +from dynamo.common.http._ssrf_resolver import BlocklistResolver +from dynamo.common.http.base import HttpConfigurationError from dynamo.common.http.url_validator import UrlValidationPolicy pytestmark = [ @@ -118,11 +120,21 @@ def _get(url, **kwargs): def _make_client_with_session(session) -> AiohttpClient: client = AiohttpClient() - client._session = session + # Both strictness keys map to the same double, so a test does not have to + # care which session the policy under test selects. + client._sessions = {True: session, False: session} return client _PERMISSIVE = UrlValidationPolicy(allow_http=True, allow_private_ips=True) +_STRICT = UrlValidationPolicy(allow_http=True, allow_private_ips=False) + +# Building the real connector trips aiohttp's notice that ``enable_cleanup_closed`` +# is a no-op on Python >= 3.12.7. That flag is pre-existing on main, so this is +# scoped to the tests that build a real connector rather than ignored repo-wide. +_allows_cleanup_closed_notice = pytest.mark.filterwarnings( + "ignore:enable_cleanup_closed ignored because:DeprecationWarning" +) async def test_fetch_bytes_returns_body_on_200() -> None: @@ -187,3 +199,247 @@ async def test_redirect_resolved_through_policy_path() -> None: body = await client.fetch_bytes("https://h/x.png", 30.0, policy=_PERMISSIVE) assert body == b"final" + + +@_allows_cleanup_closed_notice +async def test_build_session_installs_the_connect_time_resolver() -> None: + """The shared connector carries the connect-time resolver. + + Every fetch goes through a connector built here, so losing the + ``resolver=`` wiring silently drops the connect-time check for the whole + process while the resolver's own unit tests stay green. + """ + client = AiohttpClient() + # Through _get_session, so client.close() owns it. _build_session does not + # register the session, and closing the client would leave it open. + session = await client._get_session(False) + try: + assert isinstance(session.connector._resolver, BlocklistResolver) + finally: + await client.close() + assert session.closed + + +@_allows_cleanup_closed_notice +async def test_connect_policy_is_the_intersection(monkeypatch) -> None: + """Neither side alone decides whether the connector may return private IPs. + + A permissive request must not loosen a strict deployment, and a permissive + deployment must not override a request that explicitly asked for strict. + """ + strict = UrlValidationPolicy(allow_http=True, allow_private_ips=False) + + monkeypatch.delenv("DYN_MM_ALLOW_INTERNAL", raising=False) + client = AiohttpClient() + assert client._connect_allows_private(None) is False + assert client._connect_allows_private(_PERMISSIVE) is False + assert client._connect_allows_private(strict) is False + + monkeypatch.setenv("DYN_MM_ALLOW_INTERNAL", "1") + assert client._connect_allows_private(None) is True + assert client._connect_allows_private(_PERMISSIVE) is True + # The case that regressed: the deployment allows private, the caller does + # not, and the caller wins. + assert client._connect_allows_private(strict) is False + + +@_allows_cleanup_closed_notice +async def test_a_strict_request_gets_a_filtering_connector(monkeypatch) -> None: + """The intersection reaches the connector, not just the helper.""" + monkeypatch.setenv("DYN_MM_ALLOW_INTERNAL", "1") + strict = UrlValidationPolicy(allow_http=True, allow_private_ips=False) + client = AiohttpClient() + try: + permissive_session = await client._get_session( + client._connect_allows_private(_PERMISSIVE) + ) + strict_session = await client._get_session( + client._connect_allows_private(strict) + ) + assert permissive_session is not strict_session + assert permissive_session.connector._resolver._allow_private_ips is True + assert strict_session.connector._resolver._allow_private_ips is False + finally: + await client.close() + + +@_allows_cleanup_closed_notice +async def test_close_closes_every_resolver(monkeypatch) -> None: + """aiohttp will not close an injected resolver, so the client must. + + ``TCPConnector`` sets ``_resolver_owner=False`` for a resolver it did not + create, and only closes its own. Without this the optional aiodns resolver + stays registered for the loop after the session is gone. + """ + monkeypatch.delenv("DYN_MM_ALLOW_INTERNAL", raising=False) + client = AiohttpClient() + session = await client._get_session(False) + resolver = session.connector._resolver + assert session.connector._resolver_owner is False + + closed = [] + original = resolver._inner.close + + async def _spy() -> None: + closed.append(1) + await original() + + resolver._inner.close = _spy + await client.close() + + assert closed, "the injected resolver was never closed" + assert client._sessions == {} + assert client._resolvers == {} + + +async def test_a_proxied_fetch_fails_closed_without_the_opt_in(monkeypatch) -> None: + """A proxied fetch puts the origin out of the resolver's reach. + + Documenting the boundary does not enforce it, so without an operator + assertion the fetch must not quietly run unchecked. Driven through + ``fetch_bytes`` so it also pins that the gate is wired into the fetch + path, not merely present as a helper. + """ + monkeypatch.delenv("DYN_MM_ALLOW_INTERNAL", raising=False) + monkeypatch.delenv("DYN_MM_TRUST_EGRESS_PROXY", raising=False) + for name in ("http_proxy", "HTTP_PROXY", "https_proxy", "HTTPS_PROXY"): + monkeypatch.setenv(name, "http://proxy.internal:3128") + + client = AiohttpClient() + try: + with pytest.raises(HttpConfigurationError) as excinfo: + # No policy, so no URL validation runs first and the gate is the + # only thing that can reject this. + await client.fetch_bytes("https://example.com/x.png", 5.0) + message = str(excinfo.value) + assert "DYN_MM_TRUST_EGRESS_PROXY" in message + # An operator configuration fault, not a verdict on the caller's URL, + # so it must not arrive as the ValueError subclass that maps to a 400. + assert not isinstance(excinfo.value, ValueError) + finally: + await client.close() + + +async def test_the_gate_guards_the_revalidating_path_too(monkeypatch) -> None: + """Both fetch seams must be gated, not just the simple one.""" + monkeypatch.delenv("DYN_MM_ALLOW_INTERNAL", raising=False) + monkeypatch.delenv("DYN_MM_TRUST_EGRESS_PROXY", raising=False) + for name in ("http_proxy", "HTTP_PROXY", "https_proxy", "HTTPS_PROXY"): + monkeypatch.setenv(name, "http://proxy.internal:3128") + + client = AiohttpClient() + try: + with pytest.raises(HttpConfigurationError) as excinfo: + await client._fetch_body_or_redirect( + "https://example.com/x.png", 5.0, policy=_STRICT + ) + assert "DYN_MM_TRUST_EGRESS_PROXY" in str(excinfo.value) + finally: + await client.close() + + +async def test_no_proxy_exempts_a_host_from_the_gate(monkeypatch) -> None: + """NO_PROXY means the fetch goes direct, so the gate must not fire. + + Asking only "is any proxy variable set" would refuse this fetch even + though the connect-time check governs it perfectly well. Asserted on the + helper directly, because driving it through a fetch reaches the transport + and passes whether or not the gate is precise. + """ + monkeypatch.delenv("DYN_MM_ALLOW_INTERNAL", raising=False) + monkeypatch.delenv("DYN_MM_TRUST_EGRESS_PROXY", raising=False) + for name in ("http_proxy", "HTTP_PROXY", "https_proxy", "HTTPS_PROXY"): + monkeypatch.setenv(name, "http://proxy.internal:3128") + for name in ("no_proxy", "NO_PROXY"): + monkeypatch.setenv(name, "example.com") + + client = AiohttpClient() + # Must not raise: NO_PROXY sends this host direct. + await client._require_trusted_egress_proxy("https://example.com/x.png") + # A host NOT covered by NO_PROXY is still gated, which is the control. + with pytest.raises(HttpConfigurationError): + await client._require_trusted_egress_proxy("https://other.invalid/x.png") + await client.close() + + +async def test_the_proxy_gate_does_not_fire_when_private_is_allowed( + monkeypatch, +) -> None: + """DYN_MM_ALLOW_INTERNAL=1 already permits private destinations. + + Nothing is left for the proxy gate to protect, so it must not demand a + second variable. + """ + monkeypatch.setenv("DYN_MM_ALLOW_INTERNAL", "1") + monkeypatch.delenv("DYN_MM_TRUST_EGRESS_PROXY", raising=False) + for name in ("http_proxy", "HTTP_PROXY"): + monkeypatch.setenv(name, "http://proxy.internal:3128") + + client = AiohttpClient() + assert client._connect_allows_private(None) is True + # The gate is keyed to the effective policy, so it never runs here. + client._require_trusted_egress_proxy # present, but not reached + await client.close() + + +async def test_the_opt_in_allows_a_proxied_fetch(monkeypatch) -> None: + """With the assertion set, the fetch proceeds and the operator owns it.""" + monkeypatch.delenv("DYN_MM_ALLOW_INTERNAL", raising=False) + monkeypatch.setenv("DYN_MM_TRUST_EGRESS_PROXY", "1") + for name in ("http_proxy", "HTTP_PROXY"): + monkeypatch.setenv(name, "http://proxy.internal:3128") + + client = AiohttpClient() + # Returns without raising, which is the whole assertion. + await client._require_trusted_egress_proxy("https://example.com/x.png") + await client.close() + + +@_allows_cleanup_closed_notice +async def test_each_policy_pool_gets_the_full_connection_limit(monkeypatch) -> None: + """The cap is per connect-time policy, and the help text says so. + + Two pools can coexist, each with the configured limit, so a deployment + that enables internal access and also issues stricter per-request policies + can reach twice the value. Pinned here so the number and the documented + meaning cannot drift apart silently. + """ + monkeypatch.setenv("DYN_MM_ALLOW_INTERNAL", "1") + client = AiohttpClient() + try: + permissive = await client._get_session(True) + strict = await client._get_session(False) + limit = client._config.max_connections + assert permissive is not strict + assert permissive.connector.limit == limit + assert strict.connector.limit == limit + finally: + await client.close() + + +async def test_the_default_configuration_only_ever_builds_one_pool(monkeypatch) -> None: + """Without DYN_MM_ALLOW_INTERNAL the connect policy is always strict. + + So the second pool, and the doubled cap with it, cannot appear in the + default deployment whatever a caller passes. + """ + monkeypatch.delenv("DYN_MM_ALLOW_INTERNAL", raising=False) + client = AiohttpClient() + strict = UrlValidationPolicy(allow_http=True, allow_private_ips=False) + assert client._connect_allows_private(None) is False + assert client._connect_allows_private(_PERMISSIVE) is False + assert client._connect_allows_private(strict) is False + await client.close() + + +async def test_the_proxy_gate_is_awaitable() -> None: + """The gate must not run aiohttp's proxy discovery on the event loop. + + ``get_env_proxy_for_url`` does proxy-bypass discovery and ``.netrc`` file + reads, which is why aiohttp itself calls it through ``asyncio.to_thread``. + A synchronous gate repeats that blocking work inline on every protected + hop. + """ + import inspect + + assert inspect.iscoroutinefunction(AiohttpClient._require_trusted_egress_proxy) diff --git a/components/src/dynamo/common/tests/http/test_http_facade.py b/components/src/dynamo/common/tests/http/test_http_facade.py index 3bfc4d801705..0d3f64086b8c 100644 --- a/components/src/dynamo/common/tests/http/test_http_facade.py +++ b/components/src/dynamo/common/tests/http/test_http_facade.py @@ -94,7 +94,7 @@ async def test_fetch_with_policy_returns_first_response( call_count = {"n": 0} - async def _fake(url, timeout, *, max_bytes=None): + async def _fake(url, timeout, *, max_bytes=None, policy=None): call_count["n"] += 1 return b"body-bytes", None @@ -115,7 +115,7 @@ async def test_fetch_with_policy_follows_safe_redirect( hops: list[str] = [] - async def _fake(url, timeout, *, max_bytes=None): + async def _fake(url, timeout, *, max_bytes=None, policy=None): hops.append(url) if url == "https://example.com/x.png": return None, "https://example.com/final.png" @@ -138,7 +138,7 @@ async def test_fetch_with_policy_blocks_redirect_to_private_ip( strict = UrlValidationPolicy(allow_private_ips=False) - async def _fake(url, timeout, *, max_bytes=None): + async def _fake(url, timeout, *, max_bytes=None, policy=None): return None, "http://169.254.169.254/latest/meta-data/" with patch.object(client, "_fetch_body_or_redirect", _fake): @@ -161,7 +161,7 @@ async def test_fetch_with_policy_enforces_redirect_limit( "https://example.com/d": "https://example.com/e", } - async def _fake(url, timeout, *, max_bytes=None): + async def _fake(url, timeout, *, max_bytes=None, policy=None): return None, chain[url] with patch.object(client, "_fetch_body_or_redirect", _fake): diff --git a/components/src/dynamo/common/tests/http/test_ssrf_resolver.py b/components/src/dynamo/common/tests/http/test_ssrf_resolver.py new file mode 100644 index 000000000000..3f2a0729d091 --- /dev/null +++ b/components/src/dynamo/common/tests/http/test_ssrf_resolver.py @@ -0,0 +1,128 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Unit tests for the aiohttp connect-time SSRF resolver (``_ssrf_resolver``). + +Exercise the DNS-rebinding case deterministically: the resolver is fed a mix of +public and blocked answers (as if a rebinding server flipped between check and +connect) and must drop the blocked ones, keep the rest, and fail closed when +none remain. No network. +""" + +from __future__ import annotations + +import errno + +import pytest + +from dynamo.common.http._ssrf_resolver import BlocklistResolver, SsrfBlockedAddress + +pytestmark = [ + pytest.mark.unit, + pytest.mark.pre_merge, + pytest.mark.gpu_0, +] + + +class _FakeInner: + """Stand-in for aiohttp's DefaultResolver returning canned entries.""" + + def __init__(self, ips: list[str]) -> None: + self._ips = ips + + async def resolve(self, host, port=0, family=0): + return [{"hostname": host, "host": ip, "port": port} for ip in self._ips] + + async def close(self): + pass + + +def _resolver_with(ips: list[str]) -> BlocklistResolver: + r = BlocklistResolver(allow_private_ips=False) + r._inner = _FakeInner(ips) + return r + + +async def test_resolver_drops_blocked_and_keeps_the_rest() -> None: + # Rebinding answer (public + metadata IP): the blocked one is dropped, and + # every non-blocked address survives for multi-address fallback. + resolver = _resolver_with(["93.184.216.34", "169.254.169.254", "8.8.8.8"]) + out = await resolver.resolve("evil.example.com") + assert [h["host"] for h in out] == ["93.184.216.34", "8.8.8.8"] + + +async def test_resolver_fails_closed_when_only_blocked() -> None: + resolver = _resolver_with(["169.254.169.254"]) + with pytest.raises(SsrfBlockedAddress): + await resolver.resolve("evil.example.com") + + +async def test_allow_private_ips_bypasses_filtering() -> None: + # The env baseline (DYN_MM_ALLOW_INTERNAL=1) opts the deployment into + # internal targets, so the resolver returns every answer unfiltered. + resolver = BlocklistResolver(allow_private_ips=True) + resolver._inner = _FakeInner(["169.254.169.254", "10.0.0.5"]) + out = await resolver.resolve("internal.svc") + assert [h["host"] for h in out] == ["169.254.169.254", "10.0.0.5"] + + +async def test_configured_egress_proxy_is_not_filtered(monkeypatch) -> None: + """A corporate proxy on a private address must not be filtered out. + + The session runs with ``trust_env=True``, so with a proxy configured the + connector dials the proxy and it is the proxy's own address that reaches + this resolver. Filtering it turns every fetch into a connection error -- + measured before the exemption, HTTP_PROXY at a private host failed them all. + """ + # aiohttp's proxies_from_env() prefers the lowercase name, and CI images can + # carry one already -- clear both so this test controls what is configured. + monkeypatch.delenv("http_proxy", raising=False) + monkeypatch.setenv("HTTP_PROXY", "http://proxy.internal:3128") + + resolver = BlocklistResolver(allow_private_ips=False) + resolver._inner = _FakeInner(["10.1.2.3"]) + + hosts = await resolver.resolve("proxy.internal") + + assert [h["host"] for h in hosts] == ["10.1.2.3"] + + +async def test_a_non_proxy_host_is_still_filtered(monkeypatch) -> None: + """Control: the exemption is for the configured proxy only.""" + monkeypatch.delenv("http_proxy", raising=False) + monkeypatch.setenv("HTTP_PROXY", "http://proxy.internal:3128") + + resolver = BlocklistResolver(allow_private_ips=False) + resolver._inner = _FakeInner(["10.1.2.3"]) + + with pytest.raises(SsrfBlockedAddress): + await resolver.resolve("origin.example.com") + + +async def test_blocked_message_bounds_the_hostname() -> None: + """The host is caller-supplied; this text reaches a response and a log.""" + resolver = _resolver_with(["169.254.169.254"]) + + with pytest.raises(SsrfBlockedAddress) as excinfo: + await resolver.resolve("h" * 200_000 + ".example.com") + + assert len(str(excinfo.value)) < 500 + assert "h" * 200 not in str(excinfo.value) + + +async def test_blocked_reason_survives_into_strerror() -> None: + """aiohttp renders ``strerror``, not ``str(exc)``, for a connector error. + + A one-argument OSError leaves ``strerror`` as None, and the caller then + receives ``Cannot connect to host ... [None]`` with the reason dropped at + the one place an operator reads it. + """ + resolver = _resolver_with(["169.254.169.254"]) + + with pytest.raises(SsrfBlockedAddress) as excinfo: + await resolver.resolve("evil.example.com") + + assert excinfo.value.strerror == ( + "host evil.example.com resolves only to blocked IPs" + ) + assert excinfo.value.errno == errno.EHOSTUNREACH diff --git a/components/src/dynamo/common/tests/http/test_url_validator.py b/components/src/dynamo/common/tests/http/test_url_validator.py index e0cedf96a0c8..5484150f76e8 100644 --- a/components/src/dynamo/common/tests/http/test_url_validator.py +++ b/components/src/dynamo/common/tests/http/test_url_validator.py @@ -547,10 +547,12 @@ async def test_redirect_chain_in_the_limit_message_is_bounded() -> None: long_hop = "https://example.com/" + "A" * 200_000 class _Client(HttpClient): - async def _fetch_simple(self, url, timeout, *, max_bytes=None): + async def _fetch_simple(self, url, timeout, *, max_bytes=None, policy=None): raise AssertionError("unused") - async def _fetch_body_or_redirect(self, url, timeout, *, max_bytes=None): + async def _fetch_body_or_redirect( + self, url, timeout, *, max_bytes=None, policy=None + ): return None, long_hop async def close(self): diff --git a/components/src/dynamo/common/tests/multimodal/test_audio_loader.py b/components/src/dynamo/common/tests/multimodal/test_audio_loader.py index 11e6634e1fcf..a962fa76a0eb 100644 --- a/components/src/dynamo/common/tests/multimodal/test_audio_loader.py +++ b/components/src/dynamo/common/tests/multimodal/test_audio_loader.py @@ -6,7 +6,7 @@ import numpy as np import pytest -from dynamo.common.http import HttpStatusError +from dynamo.common.http import HttpConfigurationError, HttpStatusError from dynamo.common.http.url_validator import UrlValidationError, UrlValidationPolicy from dynamo.common.multimodal import audio_loader as audio_loader_module from dynamo.common.multimodal.audio_loader import AudioLoader @@ -220,3 +220,26 @@ async def test_load_audio_batch_preserves_missing_decoder_error(): await loader.load_audio_batch([{"Url": "https://example.com/x.mp3"}]) assert exc_info.value is err + + +@pytest.mark.asyncio +async def test_load_audio_preserves_a_configuration_error(monkeypatch): + """An operator fault must not reach the client as a 4xx. + + ``load_audio`` converts unknown exceptions into ``ValueError``, and + ``py_err_to_dynamo`` maps ``ValueError`` to ``InvalidArgument``. Measured + before this was preserved: an ``HttpError`` from the egress-proxy gate + arrived as ``builtins.ValueError``, so audio clients saw a 4xx for a + deployment misconfiguration. + """ + loader = AudioLoader.__new__(AudioLoader) + + async def _boom(url): + raise HttpConfigurationError("egress proxy is not trusted") + + monkeypatch.setattr(loader, "_load_audio_with_vllm", _boom, raising=False) + + with pytest.raises(HttpConfigurationError) as excinfo: + await loader.load_audio("https://example.com/a.wav") + + assert not isinstance(excinfo.value, ValueError) diff --git a/components/src/dynamo/common/tests/multimodal/test_video_loader.py b/components/src/dynamo/common/tests/multimodal/test_video_loader.py index 9f213ce0e873..b6b427c93c49 100644 --- a/components/src/dynamo/common/tests/multimodal/test_video_loader.py +++ b/components/src/dynamo/common/tests/multimodal/test_video_loader.py @@ -7,7 +7,7 @@ import numpy as np import pytest -from dynamo.common.http import HttpStatusError +from dynamo.common.http import HttpConfigurationError, HttpStatusError from dynamo.common.http.url_validator import UrlValidationError, UrlValidationPolicy from dynamo.common.multimodal import codec_errors from dynamo.common.multimodal import video_loader as video_loader_module @@ -536,3 +536,25 @@ async def test_load_video_preserves_missing_decoder_error(monkeypatch): await loader.load_video("https://example.com/x.mp4") assert exc_info.value is err + + +@pytest.mark.asyncio +async def test_load_video_preserves_a_configuration_error(monkeypatch): + """An operator fault must not reach the client as a 4xx. + + Same reasoning as the audio loader: the generic ``except Exception`` there + rewrites unknown errors as ``ValueError``, which maps to ``InvalidArgument``. + """ + from dynamo.common.multimodal.video_loader import VideoLoader + + loader = VideoLoader.__new__(VideoLoader) + + async def _boom(*args, **kwargs): + raise HttpConfigurationError("egress proxy is not trusted") + + monkeypatch.setattr(loader, "_load_video_with_vllm", _boom, raising=False) + + with pytest.raises(HttpConfigurationError) as excinfo: + await loader.load_video("https://example.com/v.mp4") + + assert not isinstance(excinfo.value, ValueError) diff --git a/tests/report_pytest_markers.py b/tests/report_pytest_markers.py index d31c1da62ff8..d955bbb6b0ae 100755 --- a/tests/report_pytest_markers.py +++ b/tests/report_pytest_markers.py @@ -271,6 +271,12 @@ "nixl._bindings", "aiohttp.web", "aiohttp.test_utils", + # aiohttp submodules used by the connect-time resolver in + # dynamo.common.http; the bare "aiohttp" stub above has no submodules, + # so importing these fails collection for every test that reaches it. + "aiohttp.abc", + "aiohttp.helpers", + "aiohttp.resolver", "aiconfigurator.generator", "aiconfigurator.generator.naive", "aiconfigurator.sdk", From c3deae7507717409d4d1ff0d6f7e575180bd03d7 Mon Sep 17 00:00:00 2001 From: bzsuni <86399306+bzsuni@users.noreply.github.com> Date: Sat, 19 Sep 2026 09:18:56 +0800 Subject: [PATCH 124/191] fix(ci): exclude lychee reports from retry scans (#14792) Signed-off-by: bzsuni --- .github/workflows/docs-link-check.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docs-link-check.yml b/.github/workflows/docs-link-check.yml index 2bcc204dd9ef..93233292cfe1 100644 --- a/.github/workflows/docs-link-check.yml +++ b/.github/workflows/docs-link-check.yml @@ -39,6 +39,7 @@ jobs: --exclude-path ".*ATTRIBUTIONS.*" --exclude-path "./lib/llm/tests/data/.*" --exclude-path "./container/compliance/spdx_licenses/.*" + --exclude-path "(^|/)lychee/" --accept "200..=299, 403, 429" --exclude-all-private --exclude 0.0.0.0 From 5593e8857c508bebce7259e107a85c57cd142fd8 Mon Sep 17 00:00:00 2001 From: Seonmyeong Bak Date: Fri, 18 Sep 2026 21:22:43 -0700 Subject: [PATCH 125/191] feat(runtime): add per-request lifecycle instrumentation (#14101) Signed-off-by: Seonmyeong Bak Co-authored-by: Biswa Panda --- lib/backend-common/src/worker.rs | 21 +- lib/bindings/python/rust/lib.rs | 11 + lib/llm/src/http/service/disconnect.rs | 64 +- lib/llm/src/http/service/metadata.rs | 21 + lib/llm/src/http/service/metrics.rs | 13 + lib/llm/src/http/service/openai.rs | 752 +++++++++++++++++- lib/llm/src/preprocessor.rs | 57 +- lib/runtime/src/component.rs | 30 +- lib/runtime/src/component/endpoint.rs | 1 + lib/runtime/src/config/environment_names.rs | 12 + lib/runtime/src/lib.rs | 1 + lib/runtime/src/logging.rs | 15 +- lib/runtime/src/pipeline/network.rs | 86 +- .../src/pipeline/network/egress/route_span.rs | 8 +- .../src/pipeline/network/egress/tcp_client.rs | 2 +- .../pipeline/network/ingress/push_handler.rs | 280 ++++++- .../src/pipeline/network/tcp/client.rs | 8 +- lib/runtime/src/telemetry.rs | 592 ++++++++++++++ 18 files changed, 1889 insertions(+), 85 deletions(-) create mode 100644 lib/runtime/src/telemetry.rs diff --git a/lib/backend-common/src/worker.rs b/lib/backend-common/src/worker.rs index 1b8a92d7ac40..97f37a2a6f20 100644 --- a/lib/backend-common/src/worker.rs +++ b/lib/backend-common/src/worker.rs @@ -27,6 +27,7 @@ use dynamo_runtime::engine_routes::EngineRouteCallback; use dynamo_runtime::pipeline::network::Ingress; use dynamo_runtime::protocols::EndpointId; use dynamo_runtime::system_health::ReadinessHold; +use dynamo_runtime::telemetry::LifecycleOperationRole; use dynamo_runtime::traits::DistributedRuntimeProvider; use dynamo_runtime::{DistributedRuntime, Runtime}; use tokio_util::sync::CancellationToken; @@ -1021,12 +1022,20 @@ impl Worker { engine_adapter = engine_adapter.with_first_token_source(source); } let engine_adapter = Arc::new(engine_adapter); - let ingress = Ingress::for_engine(engine_adapter.clone()).map_err(|e| { - err( - ErrorType::Backend(BackendError::Unknown), - format!("ingress: {e}"), - ) - })?; + let lifecycle_role = match self.config.disaggregation_mode { + DisaggregationMode::Prefill => LifecycleOperationRole::Prefill, + DisaggregationMode::Decode => LifecycleOperationRole::Decode, + DisaggregationMode::Encode => LifecycleOperationRole::Encode, + DisaggregationMode::Aggregated => LifecycleOperationRole::Worker, + }; + let ingress = + Ingress::for_engine_with_lifecycle_role(engine_adapter.clone(), lifecycle_role) + .map_err(|e| { + err( + ErrorType::Backend(BackendError::Unknown), + format!("ingress: {e}"), + ) + })?; let probe = Arc::new(crate::adapter::JsonProbeAdapter::new(engine_adapter)); (ingress, probe) } diff --git a/lib/bindings/python/rust/lib.rs b/lib/bindings/python/rust/lib.rs index 354a374f2563..296e40f6df03 100644 --- a/lib/bindings/python/rust/lib.rs +++ b/lib/bindings/python/rust/lib.rs @@ -785,6 +785,17 @@ fn register_model<'p>( cfg.validate_config()?; } + let lifecycle_role = match worker_type_unwrapped { + WorkerType::Prefill => rs::telemetry::LifecycleOperationRole::Prefill, + WorkerType::Decode => rs::telemetry::LifecycleOperationRole::Decode, + WorkerType::Encode => rs::telemetry::LifecycleOperationRole::Encode, + WorkerType::Aggregated => rs::telemetry::LifecycleOperationRole::Worker, + }; + endpoint + .inner + .set_lifecycle_operation_role(lifecycle_role) + .map_err(to_pyerr)?; + crate::future_into_py(py, async move { let runtime_config = runtime_config.unwrap_or_default(); diff --git a/lib/llm/src/http/service/disconnect.rs b/lib/llm/src/http/service/disconnect.rs index 258c387ae9f1..8af9bea38fb1 100644 --- a/lib/llm/src/http/service/disconnect.rs +++ b/lib/llm/src/http/service/disconnect.rs @@ -111,15 +111,19 @@ impl StreamErrorSignal { self.0.failure.get().map(|failure| &failure.error_type) } + pub(super) fn error_type(&self) -> Option { + self.get().cloned() + } + pub(super) fn mark_terminal_event_emitted(&self) { self.0.terminal_event_emitted.store(true, Ordering::Release); } - fn terminal_event_emitted(&self) -> bool { + pub(super) fn terminal_event_emitted(&self) -> bool { self.0.terminal_event_emitted.load(Ordering::Acquire) } - fn semantic_error(&self) -> Option<&DynamoError> { + pub(super) fn semantic_error(&self) -> Option<&DynamoError> { self.0 .failure .get() @@ -570,7 +574,7 @@ fn monitor_for_disconnects_with_timeout_error_and_keep_alive( // "cancelled" instead of "internal". The happy path overrides this via mark_ok(). inflight_guard.mark_error(ErrorType::Cancelled); let mut stream_handle = SignaledConnectionHandle::new(stream_handle, error_signal.clone()); - let mut inflight_guard = SignaledInflightGuard::new(inflight_guard, error_signal); + let mut inflight_guard = SignaledInflightGuard::new(inflight_guard, error_signal.clone()); async_stream::try_stream! { tokio::pin!(stream); @@ -606,7 +610,15 @@ fn monitor_for_disconnects_with_timeout_error_and_keep_alive( Some(error) => openai_semantic_stream_error(error), None => (fallback_error_type, fallback_error_body), }; + let error_type = error_signal + .as_ref() + .and_then(StreamErrorSignal::get) + .cloned() + .unwrap_or(error_type); inflight_guard.mark_error(error_type.clone()); + if let Some(error_signal) = &error_signal { + error_signal.set(error_type.clone()); + } // We're terminating the stream intentionally here with a // structured error + [DONE]; disarm so the stream handle // doesn't later record this as ClosedUnexpectedly (which @@ -701,6 +713,9 @@ fn monitor_for_disconnects_with_timeout_error_and_keep_alive( } } => { inflight_guard.mark_error(ErrorType::ResponseTimeout); + if let Some(error_signal) = &error_signal { + error_signal.set(ErrorType::ResponseTimeout); + } stream_handle.disarm(); tracing::warn!( request_id = %inflight_guard.request_id(), @@ -1558,6 +1573,49 @@ mod tests { assert_fault_contract("python_consumer_drop", &body, backend_detail); } + #[tokio::test] + async fn typed_producer_error_overrides_generic_stream_error_classification() { + let model = "typed-timeout-model"; + let (metrics, guard, ctx, handle) = setup_test(model, "req-typed-timeout"); + let error_signal = StreamErrorSignal::default(); + error_signal.set(ErrorType::ResponseTimeout); + let stream = simulate_mid_stream_error(0, "request-plane response timeout"); + let monitored = monitor_for_disconnects_with_timeout_error_and_keep_alive( + stream, + ctx, + guard, + handle, + None, + openai_stream_error, + StreamMonitorOptions { + error_signal: Some(error_signal), + ..Default::default() + }, + ); + + let _body = collect_sse_body(monitored).await; + assert_eq!( + metrics.get_request_counter( + model, + &Endpoint::ChatCompletions, + &RequestType::Stream, + &Status::Error, + &ErrorType::ResponseTimeout, + ), + 1 + ); + assert_eq!( + metrics.get_request_counter( + model, + &Endpoint::ChatCompletions, + &RequestType::Stream, + &Status::Error, + &ErrorType::Internal, + ), + 0 + ); + } + /// A backend error carrying sensitive internals (file paths, panic text, /// Python exception details) MUST NOT reach the streaming client. The client /// receives only the sanitized static frame; the detail stays server-side. diff --git a/lib/llm/src/http/service/metadata.rs b/lib/llm/src/http/service/metadata.rs index b90795f03a39..d68106cf75dc 100644 --- a/lib/llm/src/http/service/metadata.rs +++ b/lib/llm/src/http/service/metadata.rs @@ -60,6 +60,10 @@ fn insert_metadata_entry( raw_key: &str, raw_value: &str, ) -> Result<(), MetadataHeaderError> { + // Lifecycle capture is selected by the frontend, never by caller metadata. + if raw_key.eq_ignore_ascii_case(dynamo_runtime::telemetry::LIFECYCLE_ROOT_METADATA_KEY) { + return Ok(()); + } if out.contains_key(raw_key) { return Ok(()); } @@ -192,6 +196,23 @@ mod tests { use axum::http::HeaderName; use tonic::metadata::{MetadataKey, MetadataValue}; + #[test] + fn callers_cannot_enable_lifecycle_capture_through_metadata() { + let key = dynamo_runtime::telemetry::LIFECYCLE_ROOT_METADATA_KEY; + for prefix in ["x-dynamo-meta-", "custom-meta-"] { + let metadata = extract_metadata_from_pairs( + [ + (format!("{prefix}{key}"), "v1"), + (format!("{prefix}tenant"), "test"), + ], + prefix, + ) + .unwrap(); + assert!(!metadata.contains_key(key)); + assert_eq!(metadata.get("tenant").map(String::as_str), Some("test")); + } + } + fn header_name(name: String) -> HeaderName { name.parse::().unwrap() } diff --git a/lib/llm/src/http/service/metrics.rs b/lib/llm/src/http/service/metrics.rs index 60bbc93e5eaa..537a074375e5 100644 --- a/lib/llm/src/http/service/metrics.rs +++ b/lib/llm/src/http/service/metrics.rs @@ -129,6 +129,19 @@ pub fn request_was_cancelled(err: &(dyn std::error::Error + 'static)) -> bool { dynamo_runtime::error::match_error_chain(err, CANCELLATION, NON_CANCELLATION) } +pub fn request_was_timed_out(err: &(dyn std::error::Error + 'static)) -> bool { + use dynamo_runtime::error::BackendError; + + const TIMEOUT: &[DynamoErrorType] = &[ + DynamoErrorType::ResponseTimeout, + DynamoErrorType::ConnectionTimeout, + DynamoErrorType::Backend(BackendError::ResponseTimeout), + DynamoErrorType::Backend(BackendError::ConnectionTimeout), + ]; + const NON_TIMEOUT: &[DynamoErrorType] = &[]; + dynamo_runtime::error::match_error_chain(err, TIMEOUT, NON_TIMEOUT) +} + pub use prometheus::Registry; use super::RouteDoc; diff --git a/lib/llm/src/http/service/openai.rs b/lib/llm/src/http/service/openai.rs index b58ba14e5f1a..0bd6f861309f 100644 --- a/lib/llm/src/http/service/openai.rs +++ b/lib/llm/src/http/service/openai.rs @@ -25,6 +25,9 @@ use base64::Engine as _; use bytes::Bytes; use dynamo_runtime::config::{env_is_truthy, environment_names::llm as env_llm}; use dynamo_runtime::error::{DynamoError, ErrorClass}; +use dynamo_runtime::telemetry::{ + LIFECYCLE_TRACE_CONTEXT_KEY, LifecycleStage, LifecycleTerminal, LifecycleTrace, TerminalOutcome, +}; use dynamo_runtime::{ engine::AsyncEngineContext, pipeline::{AsyncEngineContextProvider, Context}, @@ -140,6 +143,97 @@ pub(super) fn get_body_limit() -> usize { pub type ErrorResponse = (StatusCode, Json); +/// Preserve an emitted failure when the response body is dropped before EOF. +struct StreamingLifecycleTerminal { + terminal: LifecycleTerminal, + error_signal: StreamErrorSignal, +} + +impl Drop for StreamingLifecycleTerminal { + fn drop(&mut self) { + let delivered = self + .error_signal + .terminal_event_emitted() + .then(|| terminal_outcome_for_stream_error(&self.error_signal)) + .flatten(); + self.terminal.finish(delivered.unwrap_or_else(|| { + if std::thread::panicking() { + TerminalOutcome::Failed + } else { + TerminalOutcome::Cancelled + } + })); + } +} + +fn terminal_outcome_for_stream_error(signal: &StreamErrorSignal) -> Option { + if signal + .semantic_error() + .is_some_and(|error| error.class().normalized() == ErrorClass::DeadlineExceeded) + { + Some(TerminalOutcome::TimedOut) + } else { + signal.error_type().map(terminal_outcome_for_error_type) + } +} + +fn classify_lifecycle_response( + response: impl std::future::Future>, + terminal: LifecycleTerminal, +) -> impl std::future::Future> { + // Arm before polling so aborting an unpolled task also has a terminal result. + let mut guard = TaskLifecycleTerminal(Some(terminal)); + async move { + let response = response.await; + if let Err(error) = &response + && let Some(terminal) = &guard.0 + { + terminal.finish(terminal_outcome_for_error_response(error)); + } + // A successful SSE response owns its own cancellation guard; unary + // success has already been recorded by the request task. + guard.0.take(); + response + } +} + +struct TaskLifecycleTerminal(Option); + +impl Drop for TaskLifecycleTerminal { + fn drop(&mut self) { + if let Some(terminal) = &self.0 { + terminal.finish(if std::thread::panicking() { + TerminalOutcome::Failed + } else { + TerminalOutcome::Cancelled + }); + } + } +} + +fn terminal_outcome_for_error_response(response: &ErrorResponse) -> TerminalOutcome { + match extract_error_type_from_response(response) { + // Preserve explicit categories such as overload, even when configured as 504. + ErrorType::Internal if response.0 == StatusCode::GATEWAY_TIMEOUT => { + TerminalOutcome::TimedOut + } + error_type => terminal_outcome_for_error_type(error_type), + } +} + +fn terminal_outcome_for_error_type(error_type: ErrorType) -> TerminalOutcome { + match error_type { + ErrorType::Validation + | ErrorType::NotFound + | ErrorType::Overload + | ErrorType::Unavailable + | ErrorType::NotImplemented => TerminalOutcome::Rejected, + ErrorType::Cancelled => TerminalOutcome::Cancelled, + ErrorType::ResponseTimeout => TerminalOutcome::TimedOut, + ErrorType::Internal | ErrorType::None => TerminalOutcome::Failed, + } +} + #[derive(Serialize, Deserialize, Debug)] pub(crate) struct ErrorMessage { message: String, @@ -326,6 +420,26 @@ fn responses_error_code(status_code: StatusCode) -> &'static str { } } +fn stream_error_type(error: &dynamo_runtime::error::DynamoError) -> ErrorType { + use super::metrics::{ + request_was_cancelled, request_was_rejected, request_was_timed_out, request_was_unavailable, + }; + + if request_was_timed_out(error) { + ErrorType::ResponseTimeout + } else if find_queue_rejection_in_chain(error).is_some() || request_was_rejected(error) { + ErrorType::Overload + } else if request_was_unavailable(error) { + ErrorType::Unavailable + } else if find_invalid_argument_in_chain(error).is_some() { + ErrorType::Validation + } else if request_was_cancelled(error) { + ErrorType::Cancelled + } else { + ErrorType::Internal + } +} + fn is_invalid_argument(error: &dynamo_runtime::error::DynamoError) -> bool { matches!( error.reason().as_str(), @@ -2331,8 +2445,30 @@ async fn handler_chat_completions( headers: HeaderMap, body: Body, ) -> Result { - let body = read_json_request_body(&headers, body).await?; - let mut request: NvCreateChatCompletionRequest = parse_json_request("chat completions", &body)?; + let request_id = get_or_create_request_id(&headers); + let lifecycle = LifecycleTrace::frontend_request_without_session(request_id.as_str()); + let lifecycle_request = lifecycle.start_request(); + lifecycle_request.record_session(&request_id, None); + let request_lifecycle = lifecycle_request.span(); + let terminal = lifecycle_request.terminal(); + let mut handler_terminal = TaskLifecycleTerminal(Some(terminal.clone())); + let body = match read_json_request_body(&headers, body).await { + Ok(body) => body, + Err(error) => { + lifecycle_request.record_session(&request_id, None); + terminal.finish(terminal_outcome_for_error_response(&error)); + return Err(error); + } + }; + let mut request: NvCreateChatCompletionRequest = + match parse_json_request("chat completions", &body) { + Ok(request) => request, + Err(error) => { + lifecycle_request.record_session(&request_id, None); + terminal.finish(terminal_outcome_for_error_response(&error)); + return Err(error); + } + }; if *FORCE_INCLUDE_USAGE && request.inner.stream.unwrap_or(false) { delta_common::force_include_usage(&mut request.inner.stream_options); } @@ -2341,10 +2477,18 @@ async fn handler_chat_completions( // serving readiness). An aggregated request to a decode-only namespace // would otherwise hang/crash on the decode worker. Resolve the templated // model first so empty/missing `model` fields don't bypass the gate. - check_ready(&state)?; + if let Err(error) = check_ready(&state) { + lifecycle_request.record_session(&request_id, None); + terminal.finish(terminal_outcome_for_error_response(&error)); + return Err(error); + } let resolved_model = resolve_request_model(&request.inner.model, template.as_ref()); - if !resolved_model.is_empty() { - check_model_serving_ready(&state, resolved_model)?; + if !resolved_model.is_empty() + && let Err(error) = check_model_serving_ready(&state, resolved_model) + { + lifecycle_request.record_session(&request_id, None); + terminal.finish(terminal_outcome_for_error_response(&error)); + return Err(error); } if !state.nvext_enabled() { @@ -2361,7 +2505,6 @@ async fn handler_chat_completions( apply_frontend_nvext_policy(request.nvext.take(), &headers, state.nvext_enabled()); // create the context for the request - let request_id = get_or_create_request_id(&headers); let streaming = request.inner.stream.unwrap_or(false); let resolved_model = resolve_request_model(&request.inner.model, template.as_ref()); // Canonicalize alias → primary for the metric label. @@ -2375,9 +2518,15 @@ async fn handler_chat_completions( request_type: if streaming { "stream" } else { "unary" }.to_string(), }; let mut request = - context_from_headers_with_input_trigger(request, request_id, &headers, |request| { + match context_from_headers_with_input_trigger(request, request_id, &headers, |request| { Some(classify_chat_request(request)) - })?; + }) { + Ok(request) => request, + Err(error) => { + terminal.finish(terminal_outcome_for_error_response(&error)); + return Err(error); + } + }; if let Some(captured) = crate::request_trace::payload::capture_http_headers(&headers) { request.insert( crate::request_trace::payload::HTTP_HEADERS_CONTEXT_KEY, @@ -2386,6 +2535,21 @@ async fn handler_chat_completions( } let context = request.context(); + if lifecycle.is_enabled() { + let agent_context = request + .get_optional::(AGENT_CONTEXT_CONTEXT_KEY) + .ok() + .flatten(); + lifecycle_request.record_session( + context.id(), + agent_context + .as_ref() + .map(|context| context.session_id.as_str()), + ); + request.insert_metadata(dynamo_runtime::telemetry::LIFECYCLE_ROOT_METADATA_KEY, "v1"); + request.insert(LIFECYCLE_TRACE_CONTEXT_KEY, lifecycle.clone()); + } + // create the connection handles let (mut connection_handle, stream_handle) = create_connection_monitor( context.clone(), @@ -2394,16 +2558,38 @@ async fn handler_chat_completions( ) .await; - let response = - tokio::spawn(chat_completions(state, template, request, stream_handle).in_current_span()) - .await - .map_err(|e| { - ErrorMessage::internal_server_error_with_details( - "Failed to await chat completions task", - format!("{e:?}"), - ) - })?; + // Keep the HTTP-side guard armed while awaiting the detached task. A client + // disconnect drops this handler, but the task can continue until a backend + // timeout; that later error must not replace the observed cancellation. + let response = match tokio::spawn( + classify_lifecycle_response( + chat_completions( + state, + template, + request, + stream_handle, + lifecycle, + request_lifecycle.clone(), + terminal.clone(), + ), + terminal.clone(), + ) + .instrument(request_lifecycle.or_current()), + ) + .await + { + Ok(response) => response, + Err(error) => { + terminal.finish(TerminalOutcome::Failed); + connection_handle.disarm(); + return Err(ErrorMessage::internal_server_error_with_details( + "Failed to await chat completions task", + format!("{error:?}"), + )); + } + }; + handler_terminal.0.take(); // if we got here, then we will return a response and the potentially long running task has completed successfully // without need to be cancelled. connection_handle.disarm(); @@ -2615,6 +2801,9 @@ pub(super) struct BackendErrorInfo { /// status alone is not enough to recover it. `None` means "derive it from /// `status`" — the ordinary case for a status the worker supplied. sanitized: Option, + /// Semantic classification preserved from the typed request-plane error. + /// This may intentionally differ from the HTTP status classification. + metric_error_type: Option, } impl BackendErrorInfo { @@ -2625,6 +2814,7 @@ impl BackendErrorInfo { status, semantic: None, sanitized: None, + metric_error_type: None, } } @@ -2632,6 +2822,11 @@ impl BackendErrorInfo { self.semantic = error.cloned(); self } + + fn with_metric_error_type(mut self, error_type: Option) -> Self { + self.metric_error_type = error_type; + self + } } /// The `{"message": ..., "code": ...}` envelope emitted by older Python workers @@ -2696,6 +2891,11 @@ fn extract_backend_error_if_present( .error .as_ref() .is_some_and(|error| super::metrics::request_was_rejected(error)); + let metric_error_type = event + .error + .as_ref() + .filter(|error| super::metrics::request_was_timed_out(*error)) + .map(|_| ErrorType::ResponseTimeout); // Parse the status-bearing node's own message. The diagnostic string // above includes its causes and therefore is not necessarily JSON. @@ -2726,6 +2926,7 @@ fn extract_backend_error_if_present( status: code, semantic: if overloaded { semantic.cloned() } else { None }, sanitized: overloaded.then_some(SanitizedError::Overloaded), + metric_error_type, }); } @@ -2735,7 +2936,8 @@ fn extract_backend_error_if_present( "Invalid request".to_string(), StatusCode::BAD_REQUEST, ) - .with_semantic(semantic), + .with_semantic(semantic) + .with_metric_error_type(metric_error_type), ); } @@ -2745,12 +2947,14 @@ fn extract_backend_error_if_present( status: overload_status_code(), semantic: semantic.cloned(), sanitized: Some(SanitizedError::Overloaded), + metric_error_type, }); } return Some( BackendErrorInfo::from_status(error_str, StatusCode::INTERNAL_SERVER_ERROR) - .with_semantic(semantic), + .with_semantic(semantic) + .with_metric_error_type(metric_error_type), ); } @@ -2978,6 +3182,7 @@ fn backend_error_response(backend_error: BackendErrorInfo, record_failure: bool) status, semantic, sanitized, + metric_error_type, } = backend_error; if let Some(variant) = sanitized { let mut render_record_failure = record_failure; @@ -3017,7 +3222,7 @@ fn backend_error_response(backend_error: BackendErrorInfo, record_failure: bool) let render_record_failure = record_failure; let action = BackendStatusAction::triage(status); - match action { + let mut response = match action { BackendStatusAction::Sanitize(variant) => { ErrorMessage::sanitized_with_details_recording(variant, message, render_record_failure) } @@ -3043,7 +3248,11 @@ fn backend_error_response(backend_error: BackendErrorInfo, record_failure: bool) }), ) } + }; + if let Some(error_type) = metric_error_type { + response.1.metric_error_type = Some(error_type); } + response } #[derive(Serialize)] @@ -3251,6 +3460,9 @@ async fn chat_completions( template: Option, mut request: Context, stream_handle: ConnectionHandle, + lifecycle: LifecycleTrace, + request_lifecycle: tracing::Span, + terminal: LifecycleTerminal, ) -> Result { // return a 503 if the service is not ready check_ready(&state)?; @@ -3437,7 +3649,6 @@ async fn chat_completions( let mut reasoning_buffer: HashMap = HashMap::new(); let mut dispatched_tool_ids: HashSet<(u32, String)> = HashSet::new(); let mut emitted_roles: HashSet = HashSet::new(); - // Optionally prepend extra SSE events before each regular chunk: // - `event: tool_call_dispatch` — complete tool call detected early (tool dispatch) // - `event: reasoning_dispatch` — complete reasoning block (emitted once) @@ -3452,6 +3663,9 @@ async fn chat_completions( events.clear(); let semantic_error = set_stream_semantic_error(&response, &producer_error_signal); + // Conversion consumes the typed error. Preserve only its cheap, + // borrowed classification before it becomes an SSE error string. + let response_error_type = response.error.as_ref().map(stream_error_type); // When parallel_tool_calls is false, surface only the first tool call // Keep index 0 and drop any higher indexes @@ -3473,6 +3687,7 @@ async fn chat_completions( } // Drop empty chunks from multi-byte token assembly. + // Empty chunks are transport artifacts, not a streaming boundary. if response.data.as_ref().is_some_and(is_empty_stream_response) { let _ = activity_tx.send(()); // Not forwarded, but the engine still generated these tokens, @@ -3489,6 +3704,7 @@ async fn chat_completions( ); continue; } + if tool_dispatch_enabled { streaming_tool_dispatch_events( &response, @@ -3521,7 +3737,12 @@ async fn chat_completions( match sse_result { Ok(Some(ev)) => events.push(Ok(ev)), Ok(None) => {} - Err(e) => events.push(Err(e)), + Err(e) => { + if let Some(error_type) = response_error_type { + producer_error_signal.set(error_type); + } + events.push(Err(e)); + } } events.reverse(); @@ -3531,14 +3752,45 @@ async fn chat_completions( } }; let keep_alive = state.sse_keep_alive_for_response(stream_can_defer_all_output); + let monitor_error_signal = error_signal.clone(); let stream = monitor_for_disconnects_with_activity_and_error_signal( stream, - ctx, + ctx.clone(), inflight_guard, stream_handle, activity_rx, error_signal, ); + let terminal = terminal.clone(); + // Arm the cancellation fallback before Axum can take ownership of the + // lazy response body. If the body is dropped without being polled, the + // guard still records cancellation instead of an unknown outcome. + let stream_terminal = StreamingLifecycleTerminal { + terminal: terminal.clone(), + error_signal: monitor_error_signal.clone(), + }; + let stream = async_stream::stream! { + let _stream_terminal = stream_terminal; + let mut response_streaming = None; + let mut inner = Box::pin(stream); + while let Some(item) = inner.next().await { + // This monitored stream is the final source of client-visible + // SSE events. It includes regular and side-channel events as + // well as errors converted into structured SSE + [DONE]. + if response_streaming.is_none() { + let _entered_request_lifecycle = request_lifecycle.enter(); + response_streaming = Some(lifecycle.start(LifecycleStage::ResponseStreaming)); + } + yield item; + } + if let Some(outcome) = terminal_outcome_for_stream_error(&monitor_error_signal) { + terminal.finish(outcome); + } else if ctx.is_stopped() || ctx.is_killed() { + terminal.finish(TerminalOutcome::Cancelled); + } else { + terminal.finish(TerminalOutcome::Success); + } + }; let mut sse_stream = Sse::new(stream); if let Some(keep_alive) = keep_alive { @@ -3582,6 +3834,9 @@ async fn chat_completions( // assembled but never delivered. Override to cancelled. if ctx.is_killed() { inflight_guard.mark_error(ErrorType::Cancelled); + terminal.finish(TerminalOutcome::Cancelled); + } else { + terminal.finish(TerminalOutcome::Success); } Ok(Json(crate::reasoning_field::RoutedReasoning::new( response, @@ -6366,6 +6621,7 @@ mod tests { &backend_payload as &(dyn std::error::Error + 'static), )), sanitized: None, + metric_error_type: None, }, true, ); @@ -6387,6 +6643,7 @@ mod tests { .build(), ), sanitized: None, + metric_error_type: None, }, true, ); @@ -6669,6 +6926,7 @@ mod tests { status: StatusCode::TOO_MANY_REQUESTS, semantic: None, sanitized: Some(SanitizedError::Overloaded), + metric_error_type: Some(ErrorType::Overload), }, true, ); @@ -6691,6 +6949,7 @@ mod tests { status: StatusCode::INTERNAL_SERVER_ERROR, semantic: Some(cancelled), sanitized: None, + metric_error_type: None, }, true, ); @@ -6712,6 +6971,7 @@ mod tests { status: StatusCode::INTERNAL_SERVER_ERROR, semantic: Some(cancelled), sanitized: None, + metric_error_type: None, }, true, ); @@ -6823,6 +7083,360 @@ mod tests { } } + #[test] + fn response_timeout_from_anyhow_preserves_terminal_outcome() { + use dynamo_runtime::error::{BackendError, DynamoError, ErrorType as DynamoErrorType}; + + for error_type in [ + DynamoErrorType::DeadlineExceeded, + DynamoErrorType::ResponseTimeout, + DynamoErrorType::ConnectionTimeout, + DynamoErrorType::Backend(BackendError::ResponseTimeout), + DynamoErrorType::Backend(BackendError::ConnectionTimeout), + ] { + let err = anyhow::Error::new( + DynamoError::builder() + .error_type(error_type) + .message("typed timeout") + .build(), + ) + .context("outer request error"); + let response = ErrorMessage::from_anyhow(err, BACKUP_ERROR_MESSAGE); + + assert_eq!(response.0, StatusCode::GATEWAY_TIMEOUT, "{error_type:?}"); + assert_eq!(response.1.code, StatusCode::GATEWAY_TIMEOUT.as_u16()); + assert_eq!( + extract_error_type_from_response(&response), + ErrorType::Internal, + "{error_type:?}", + ); + assert_eq!( + terminal_outcome_for_error_response(&response), + TerminalOutcome::TimedOut, + "{error_type:?}", + ); + } + } + + #[test] + fn terminal_outcome_uses_semantic_error_type() { + let mut response = ( + StatusCode::SERVICE_UNAVAILABLE, + Json(ErrorMessage { + message: "request rejected because the service is overloaded".to_string(), + error_type: "service_unavailable".to_string(), + code: StatusCode::SERVICE_UNAVAILABLE.as_u16(), + details: None, + metric_error_type: Some(ErrorType::Overload), + }), + ); + + for status in [503, 504, 529] { + response.0 = StatusCode::from_u16(status).unwrap(); + response.1.code = status; + assert_eq!( + terminal_outcome_for_error_response(&response), + TerminalOutcome::Rejected + ); + } + } + + #[test] + fn lifecycle_json_rejections_preserve_validation_category() { + for body in [b"{".as_slice(), br#"{"model":42}"#.as_slice()] { + let response = + parse_json_request::("chat completions", body) + .expect_err("invalid request must be rejected"); + assert_eq!(response.0, StatusCode::BAD_REQUEST); + assert_eq!( + extract_error_type_from_response(&response), + ErrorType::Validation + ); + assert_eq!( + terminal_outcome_for_error_response(&response), + TerminalOutcome::Rejected + ); + } + } + + #[tokio::test(flavor = "current_thread")] + async fn lifecycle_disabled_spawn_preserves_http_parent() { + use tracing::instrument::WithSubscriber; + + let subscriber = tracing_subscriber::registry(); + async { + let http = tracing::info_span!("http-request"); + let expected = http.id().expect("HTTP span must be enabled"); + async { + let lifecycle = LifecycleTrace::new(false).start_request(); + assert!(lifecycle.span().is_disabled()); + let task = async { tracing::Span::current().id() } + .instrument(lifecycle.span().or_current()) + .with_current_subscriber(); + assert_eq!(tokio::spawn(task).await.unwrap(), Some(expected)); + } + .instrument(http) + .await; + } + .with_subscriber(subscriber) + .await; + } + + #[derive(Clone, Default)] + struct LifecycleOutcomeCapture( + Arc>>, + Arc>>, + Arc, + ); + + impl tracing_subscriber::Layer for LifecycleOutcomeCapture + where + S: tracing::Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>, + { + fn on_close(&self, id: tracing::Id, ctx: tracing_subscriber::layer::Context<'_, S>) { + if ctx.span(&id).unwrap().metadata().name() == "request.lifecycle" { + self.2.store(true, std::sync::atomic::Ordering::SeqCst); + } + } + + fn on_record( + &self, + _id: &tracing::Id, + values: &tracing::span::Record<'_>, + _ctx: tracing_subscriber::layer::Context<'_, S>, + ) { + struct OutcomeVisitor<'a>(&'a mut Vec, &'a mut Vec); + impl tracing::field::Visit for OutcomeVisitor<'_> { + fn record_u64(&mut self, field: &tracing::field::Field, value: u64) { + if field.name() == "dynamo.request.terminal.timestamp_unix_ns" { + self.1.push(value); + } + } + fn record_debug( + &mut self, + field: &tracing::field::Field, + value: &dyn std::fmt::Debug, + ) { + if field.name() == "dynamo.request.terminal.outcome" { + self.0.push(format!("{value:?}")); + } + } + + fn record_str(&mut self, field: &tracing::field::Field, value: &str) { + if field.name() == "dynamo.request.terminal.outcome" { + self.0.push(value.to_string()); + } + } + } + values.record(&mut OutcomeVisitor( + &mut self.0.lock().unwrap(), + &mut self.1.lock().unwrap(), + )); + } + } + + #[test] + fn lifecycle_unpolled_task_is_cancelled() { + use tracing_subscriber::prelude::*; + + let capture = LifecycleOutcomeCapture::default(); + let subscriber = tracing_subscriber::registry().with(capture.clone()); + tracing::subscriber::with_default(subscriber, || { + let request = LifecycleTrace::new(true).start_request(); + let future = classify_lifecycle_response(std::future::pending(), request.terminal()); + drop(future); + drop(request); + }); + assert_eq!(*capture.0.lock().unwrap(), ["cancelled"]); + } + + #[tokio::test] + async fn lifecycle_detached_task_classifies_its_error() { + use futures::FutureExt; + use tracing::instrument::WithSubscriber; + use tracing_subscriber::prelude::*; + + for (error_type, expected) in [ + (ErrorType::Cancelled, "cancelled"), + (ErrorType::ResponseTimeout, "timed_out"), + (ErrorType::Overload, "rejected"), + (ErrorType::Internal, "failed"), + ] { + let capture = LifecycleOutcomeCapture::default(); + let subscriber = tracing_subscriber::registry().with(capture.clone()); + async { + let request = LifecycleTrace::new(true).start_request(); + let (release, released) = tokio::sync::oneshot::channel(); + let (done, completed) = tokio::sync::oneshot::channel(); + let response = async move { + released.await.unwrap(); + let mut response = ErrorMessage::internal_server_error("test error"); + response.1.metric_error_type = Some(error_type); + Err(response) + }; + let task = classify_lifecycle_response(response, request.terminal()) + .map(move |_| { + let _ = done.send(()); + }) + .with_current_subscriber(); + let join = tokio::spawn(task); + // Mirror Axum dropping the caller without aborting its request task. + drop(join); + drop(request); + release.send(()).unwrap(); + tokio::time::timeout(std::time::Duration::from_secs(5), completed) + .await + .expect("detached task did not finish") + .unwrap(); + } + .with_subscriber(subscriber) + .await; + assert_eq!(*capture.0.lock().unwrap(), [expected]); + } + } + + #[tokio::test] + async fn lifecycle_handler_disconnect_precedes_detached_timeout() { + use tracing::instrument::WithSubscriber; + use tracing_subscriber::prelude::*; + + let capture = LifecycleOutcomeCapture::default(); + let subscriber = tracing_subscriber::registry().with(capture.clone()); + async { + let request = LifecycleTrace::new(true).start_request(); + let handler_guard = TaskLifecycleTerminal(Some(request.terminal())); + let (release, released) = tokio::sync::oneshot::channel(); + let (started, running) = tokio::sync::oneshot::channel(); + let task = tokio::spawn( + classify_lifecycle_response( + async move { + started.send(()).unwrap(); + released.await.unwrap(); + let mut error = ErrorMessage::internal_server_error("late timeout"); + error.1.metric_error_type = Some(ErrorType::ResponseTimeout); + Err(error) + }, + request.terminal(), + ) + .with_current_subscriber(), + ); + running.await.unwrap(); + // Axum drops the HTTP handler on disconnect without aborting the + // spawned task. The first observed terminal event must win. + drop(handler_guard); + drop(request); + assert_eq!(*capture.0.lock().unwrap(), ["cancelled"]); + let timestamps = capture.1.lock().unwrap().clone(); + assert_eq!(timestamps.len(), 1); + assert!(timestamps[0] > 0); + assert!( + !capture.2.load(std::sync::atomic::Ordering::SeqCst), + "pending detached work retains the root span after terminal recording" + ); + release.send(()).unwrap(); + assert!(task.await.unwrap().is_err()); + assert!(capture.2.load(std::sync::atomic::Ordering::SeqCst)); + assert_eq!( + *capture.1.lock().unwrap(), + timestamps, + "late timeout must not replace terminal time" + ); + } + .with_subscriber(subscriber) + .await; + assert_eq!(*capture.0.lock().unwrap(), ["cancelled"]); + } + + #[tokio::test] + async fn lifecycle_stream_drop_preserves_delivered_error_and_panic() { + use futures::FutureExt; + use http_body_util::BodyExt; + use tracing::instrument::WithSubscriber; + use tracing_subscriber::prelude::*; + + for (class, emitted, panic, expected) in [ + (ErrorClass::DeadlineExceeded, true, false, "timed_out"), + (ErrorClass::Internal, true, false, "failed"), + (ErrorClass::CapacityExhausted, true, false, "rejected"), + (ErrorClass::DeadlineExceeded, false, false, "cancelled"), + (ErrorClass::DeadlineExceeded, false, true, "failed"), + (ErrorClass::DeadlineExceeded, true, true, "timed_out"), + ] { + let capture = LifecycleOutcomeCapture::default(); + let subscriber = tracing_subscriber::registry().with(capture.clone()); + async { + let request = LifecycleTrace::new(true).start_request(); + let signal = StreamErrorSignal::default(); + signal.set_semantic( + metric_error_type_for_class(class), + &DynamoError::builder().class(class).build(), + ); + let guard = StreamingLifecycleTerminal { + terminal: request.terminal(), + error_signal: signal.clone(), + }; + let stream = async_stream::stream! { + let _guard = guard; + if emitted { + signal.mark_terminal_event_emitted(); + } + if panic { + panic!("streaming regression probe"); + } + yield Ok::<_, std::convert::Infallible>(Event::default().data("probe")); + std::future::pending::<()>().await; + }; + let mut response = Sse::new(stream).into_response(); + let frame = std::panic::AssertUnwindSafe(response.body_mut().frame()) + .catch_unwind() + .await; + if panic { + assert!(frame.is_err()); + } else { + assert!(frame.unwrap().unwrap().is_ok()); + } + drop(response); + drop(request); + } + .with_subscriber(subscriber) + .await; + assert_eq!(*capture.0.lock().unwrap(), [expected]); + } + } + + #[tokio::test] + async fn lifecycle_task_hands_cancellation_to_unpolled_response_body() { + use tracing::instrument::WithSubscriber; + use tracing_subscriber::prelude::*; + + let capture = LifecycleOutcomeCapture::default(); + let subscriber = tracing_subscriber::registry().with(capture.clone()); + async { + let request = LifecycleTrace::new(true).start_request(); + let stream_guard = StreamingLifecycleTerminal { + terminal: request.terminal(), + error_signal: StreamErrorSignal::default(), + }; + let body = async_stream::stream! { + let _guard = stream_guard; + std::future::pending::<()>().await; + yield Ok::<_, std::io::Error>(Bytes::new()); + }; + let response = classify_lifecycle_response( + async { Ok(Response::new(Body::from_stream(body))) }, + request.terminal(), + ) + .await + .unwrap(); + assert!(capture.0.lock().unwrap().is_empty()); + drop(response); + drop(request); + } + .with_subscriber(subscriber) + .await; + assert_eq!(*capture.0.lock().unwrap(), ["cancelled"]); + } + #[test] fn caller_deadline_maps_to_http_429_without_overload_accounting() { use dynamo_runtime::error::{DynamoError, ErrorType as DynamoErrorType}; @@ -8259,6 +8873,98 @@ mod tests { } } + #[tokio::test] + async fn test_check_for_backend_error_preserves_timeout_outcome() { + use crate::types::openai::chat_completions::NvCreateChatCompletionStreamResponse; + use dynamo_runtime::error::{BackendError, DynamoError, ErrorType as DynamoErrorType}; + use futures::stream; + + for error_type in [ + DynamoErrorType::DeadlineExceeded, + DynamoErrorType::ResponseTimeout, + DynamoErrorType::ConnectionTimeout, + DynamoErrorType::Backend(BackendError::ResponseTimeout), + DynamoErrorType::Backend(BackendError::ConnectionTimeout), + ] { + let error_event = Annotated:: { + data: None, + id: None, + event: Some("error".to_string()), + comment: None, + error: Some( + DynamoError::builder() + .error_type(error_type) + .message("typed timeout") + .build(), + ), + }; + + let response = match check_for_backend_error( + stream::iter(vec![error_event]), + BackendErrorCheck::UntilFirstEvent, + ) + .await + { + Err(response) => response, + Ok(_) => panic!("typed timeout must fail preflight: {error_type:?}"), + }; + assert_eq!(response.0, StatusCode::GATEWAY_TIMEOUT, "{error_type:?}"); + assert_eq!(response.1.code, StatusCode::GATEWAY_TIMEOUT.as_u16()); + assert_eq!( + extract_error_type_from_response(&response), + ErrorType::Internal, + "{error_type:?}", + ); + assert_eq!( + terminal_outcome_for_error_response(&response), + TerminalOutcome::TimedOut, + "{error_type:?}", + ); + } + } + + #[test] + fn lifecycle_stream_error_classifies_borrowed_typed_errors() { + use dynamo_runtime::error::{BackendError, DynamoError, ErrorType as DynamoErrorType}; + + for (kind, expected) in [ + (DynamoErrorType::ResponseTimeout, ErrorType::ResponseTimeout), + ( + DynamoErrorType::ConnectionTimeout, + ErrorType::ResponseTimeout, + ), + ( + DynamoErrorType::Backend(BackendError::ResponseTimeout), + ErrorType::ResponseTimeout, + ), + ( + DynamoErrorType::Backend(BackendError::ConnectionTimeout), + ErrorType::ResponseTimeout, + ), + (DynamoErrorType::Cancelled, ErrorType::Cancelled), + ( + DynamoErrorType::Backend(BackendError::Cancelled), + ErrorType::Cancelled, + ), + (DynamoErrorType::ResourceExhausted, ErrorType::Overload), + (DynamoErrorType::WorkerOverloaded, ErrorType::Overload), + (DynamoErrorType::Unavailable, ErrorType::Unavailable), + (DynamoErrorType::WorkerUnavailable, ErrorType::Unavailable), + (DynamoErrorType::InvalidArgument, ErrorType::Validation), + ( + DynamoErrorType::Backend(BackendError::InvalidArgument), + ErrorType::Validation, + ), + (DynamoErrorType::Internal, ErrorType::Internal), + ] { + let error = DynamoError::builder() + .error_type(kind) + .message("typed failure") + .build(); + assert_eq!(stream_error_type(&error), expected, "{kind:?}"); + } + } + #[tokio::test] async fn test_completion_backend_invalid_argument_surfaces_as_400() { use dynamo_runtime::error::{BackendError, DynamoError, ErrorType}; diff --git a/lib/llm/src/preprocessor.rs b/lib/llm/src/preprocessor.rs index 41fb3550208c..eda9f851ed4c 100644 --- a/lib/llm/src/preprocessor.rs +++ b/lib/llm/src/preprocessor.rs @@ -33,6 +33,7 @@ use dynamo_runtime::config::{ env_is_falsey, environment_names::llm as env_llm, is_truthy, parse_bool_opt, }; use dynamo_runtime::error::{DynamoError, ErrorType, PublicDetails}; +use dynamo_runtime::telemetry::{LIFECYCLE_TRACE_CONTEXT_KEY, LifecycleStage, LifecycleTrace}; use either::Either; use futures::Stream; use futures::stream::{self, StreamExt}; @@ -51,7 +52,7 @@ use std::{ sync::{Arc, Mutex, OnceLock}, }; use tokio_util::sync::CancellationToken; -use tracing; +use tracing::{self, Instrument}; use crate::local_model::runtime_config::{TOKEN_BUDGET_RUNTIME_KEY, TokenBudget}; #[cfg(all(feature = "mm-routing", feature = "media-ffmpeg"))] @@ -7057,6 +7058,17 @@ impl OpenAIPreprocessor { } } +fn preprocessing_lifecycle(context: &PipelineContext<()>) -> LifecycleTrace { + context + .get_optional::(LIFECYCLE_TRACE_CONTEXT_KEY) + .ok() + .flatten() + .map(|trace| trace.as_ref().clone()) + // Responses and other callers may share this preprocessor without + // creating a frontend lifecycle root. Never invent an orphan capture. + .unwrap_or_else(|| LifecycleTrace::new(false)) +} + // for pals, we do not want to add the generation prompt to the formatted prompt // we also need to know if the template support this add_generation_prompt bool // any prompt template that does not support this should return an error @@ -7080,6 +7092,8 @@ impl ) -> Result>, Error> { // unpack the request let (mut request, context) = request.into_parts(); + let lifecycle = preprocessing_lifecycle(&context); + let preprocessing = lifecycle.start(LifecycleStage::RequestPreprocessing); // Preserve original inbound streaming flag before any internal overrides let request_id = context.id().to_string(); @@ -7147,6 +7161,7 @@ impl .flatten() .map(|name| name.as_ref().clone()), ) + .instrument(preprocessing.clone()) .await?; attach_agent_context_from_context(&mut common_request, &context); @@ -7200,6 +7215,7 @@ impl .flat_map(|(k, v)| Annotated::from_annotation(k, &v)) .collect(); let annotations_stream = stream::iter(annotations); + drop(preprocessing); // forward the common completion request to the next operator let response_stream = next.generate(common_request).await?; @@ -7696,6 +7712,45 @@ mod tests { )); } + #[test] + fn lifecycle_preprocessing_requires_frontend_capture() { + const CHILD: &str = "DYNAMO_PREPROCESSOR_LIFECYCLE_TEST_CHILD"; + if std::env::var_os(CHILD).is_none() { + // Enable the process-cached knob without racing other tests. + let output = std::process::Command::new(std::env::current_exe().unwrap()) + .args([ + "--exact", + "preprocessor::tests::lifecycle_preprocessing_requires_frontend_capture", + "--nocapture", + ]) + .env(CHILD, "1") + .env("DYN_LIFECYCLE_TRACE_ENABLED", "true") + .output() + .unwrap(); + assert!( + output.status.success(), + "{}\n{}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr), + ); + return; + } + + assert!( + LifecycleTrace::from_request_id_with_role( + "knob-probe", + dynamo_runtime::telemetry::LifecycleOperationRole::Worker, + ) + .is_enabled() + ); + let mut context = PipelineContext::new(()); + assert!(!preprocessing_lifecycle(&context).is_enabled()); + context.insert(LIFECYCLE_TRACE_CONTEXT_KEY, LifecycleTrace::new(false)); + assert!(!preprocessing_lifecycle(&context).is_enabled()); + context.insert(LIFECYCLE_TRACE_CONTEXT_KEY, LifecycleTrace::new(true)); + assert!(preprocessing_lifecycle(&context).is_enabled()); + } + #[test] fn guided_tool_streaming_release_only_when_guided_json_and_not_rolled_back() { assert!( diff --git a/lib/runtime/src/component.rs b/lib/runtime/src/component.rs index 47a5bad95ee4..eb425fe3d2ef 100644 --- a/lib/runtime/src/component.rs +++ b/lib/runtime/src/component.rs @@ -54,7 +54,11 @@ use derive_builder::Builder; use derive_getters::Getters; use educe::Educe; use serde::{Deserialize, Serialize}; -use std::{collections::HashMap, hash::Hash, sync::Arc}; +use std::{ + collections::HashMap, + hash::Hash, + sync::{Arc, OnceLock}, +}; use validator::{Validate, ValidationError}; mod client; @@ -280,6 +284,7 @@ impl Component { name: endpoint.into(), labels: Vec::new(), metrics_registry: crate::MetricsRegistry::new(), + lifecycle_operation_role: Arc::new(OnceLock::new()), }; // Attach endpoint registry so scrapes traverse separate registries (avoids collisions). self.get_metrics_registry() @@ -368,6 +373,9 @@ pub struct Endpoint { /// This hierarchy's own metrics registry metrics_registry: crate::MetricsRegistry, + + /// Topology role shared by all clones of this endpoint. + lifecycle_operation_role: Arc>, } impl Hash for Endpoint { @@ -440,6 +448,26 @@ impl Endpoint { &self.component } + /// Record the topology role already advertised for this serving endpoint. + pub fn set_lifecycle_operation_role( + &self, + role: crate::telemetry::LifecycleOperationRole, + ) -> anyhow::Result<()> { + let existing = *self.lifecycle_operation_role.get_or_init(|| role); + anyhow::ensure!( + existing == role, + "endpoint {} lifecycle role is already {existing:?}, cannot set it to {role:?}", + self.id() + ); + Ok(()) + } + + pub(crate) fn lifecycle_operation_role( + &self, + ) -> Arc> { + self.lifecycle_operation_role.clone() + } + pub async fn client(&self) -> anyhow::Result { client::Client::new(self.clone()).await } diff --git a/lib/runtime/src/component/endpoint.rs b/lib/runtime/src/component/endpoint.rs index 0d6cac4937d0..1997b6a05035 100644 --- a/lib/runtime/src/component/endpoint.rs +++ b/lib/runtime/src/component/endpoint.rs @@ -142,6 +142,7 @@ impl EndpointConfigBuilder { let metrics_labels: Option> = metrics_labels .as_ref() .map(|v| v.iter().map(|(k, v)| (k.as_str(), v.as_str())).collect()); + handler.bind_endpoint(&endpoint); // Add metrics to the handler. The endpoint provides additional information to the handler. handler.add_metrics(&endpoint, metrics_labels.as_deref())?; diff --git a/lib/runtime/src/config/environment_names.rs b/lib/runtime/src/config/environment_names.rs index c6fd04d8a8aa..54bf191dda91 100644 --- a/lib/runtime/src/config/environment_names.rs +++ b/lib/runtime/src/config/environment_names.rs @@ -109,6 +109,18 @@ pub mod logging { } } +/// Request-lifecycle tracing environment variables. +pub mod lifecycle_tracing { + /// Enable the native request-lifecycle OpenTelemetry span convention. + /// + /// This is independent from `DYN_LOG`: lifecycle spans are exported through + /// the OpenTelemetry tracing layer only. + pub const DYN_LIFECYCLE_TRACE_ENABLED: &str = "DYN_LIFECYCLE_TRACE_ENABLED"; + + /// Lifecycle detail mode. Defaults to `core`. + pub const DYN_LIFECYCLE_TRACE_MODE: &str = "DYN_LIFECYCLE_TRACE_MODE"; +} + /// Runtime configuration environment variables /// /// These control the Tokio runtime, system health/metrics server, and worker behavior diff --git a/lib/runtime/src/lib.rs b/lib/runtime/src/lib.rs index 8116c70d99a5..aa01e3c01417 100644 --- a/lib/runtime/src/lib.rs +++ b/lib/runtime/src/lib.rs @@ -48,6 +48,7 @@ pub mod service; pub mod slug; pub mod storage; pub mod system_health; +pub mod telemetry; pub mod tls_utils; pub mod traits; pub mod transports; diff --git a/lib/runtime/src/logging.rs b/lib/runtime/src/logging.rs index 4ebb4af92c44..223d019e46d3 100644 --- a/lib/runtime/src/logging.rs +++ b/lib/runtime/src/logging.rs @@ -98,6 +98,7 @@ use tracing_opentelemetry::OpenTelemetrySpanExt; use tracing_subscriber::util::SubscriberInitExt; use crate::config::environment_names::logging as env_logging; +use crate::telemetry::{LIFECYCLE_TARGET, lifecycle_tracing_enabled}; /// Default log level const DEFAULT_FILTER_LEVEL: &str = "info"; @@ -1242,7 +1243,7 @@ fn setup_logging() -> Result<(), Box> { fn setup_logging() -> Result<(), Box> { let fmt_filter_layer = filters(load_config()); let trace_filter_layer = filters(load_config()); - let otel_filter_layer = filters(load_config()); + let otel_filter_layer = otel_filters(load_config(), lifecycle_tracing_enabled()); let otel_logs_filter_layer = filters(load_config()); let console_format = console_log_format(); let legacy_jsonl_enabled = legacy_jsonl_logging_enabled(); @@ -1529,6 +1530,18 @@ enum TargetsFilterFallback { Other, } +/// Lifecycle spans bypass `DYN_LOG` only in the OTel layer. The console +/// formatter keeps its normal filter, so enabling lifecycle tracing does not +/// increase stderr logging volume. +fn otel_filters(mut config: LoggingConfig, lifecycle_enabled: bool) -> LoggingFilter { + if lifecycle_enabled { + config + .log_filters + .insert(LIFECYCLE_TARGET.to_string(), "info".to_string()); + } + filters(config) +} + fn filters(config: LoggingConfig) -> LoggingFilter { let targets = match std::env::var(env_logging::DYN_LOG) { Ok(value) => targets_filter(&config, Some(&value)), diff --git a/lib/runtime/src/pipeline/network.rs b/lib/runtime/src/pipeline/network.rs index 40f892944fa8..5a49001938a7 100644 --- a/lib/runtime/src/pipeline/network.rs +++ b/lib/runtime/src/pipeline/network.rs @@ -37,6 +37,7 @@ use super::{ use crate::metrics::MetricsHierarchy; use crate::metrics::prometheus_names::work_handler; use crate::protocols::maybe_error::MaybeError; +use crate::telemetry::LifecycleOperationRole; use ingress::push_handler::WorkHandlerMetrics; use prometheus::{CounterVec, Histogram, IntCounter, IntCounterVec, IntGauge}; @@ -683,16 +684,18 @@ pub struct Egress { #[cfg(test)] mod tests { use super::{ - DEFAULT_SEND_BUFFER_COUNT, IngressResponseEncoder, NetworkStreamWrapper, + DEFAULT_SEND_BUFFER_COUNT, Ingress, IngressResponseEncoder, ManyOut, NetworkStreamWrapper, RequestControlMessage, RequestPlanePayloadCodec, RequestType, ResponsePlaneMode, - ResponseStreamPrologue, ResponseType, SerdeIngressPayloadAdapter, StreamOptions, + ResponseStreamPrologue, ResponseType, SerdeIngressPayloadAdapter, SingleIn, StreamOptions, StreamPrologueError, }; use crate::engine::AsyncEngineContextProvider; use crate::error::{BackendError, DynamoError, ErrorType}; use crate::pipeline::Context; use crate::protocols::annotated::Annotated; + use crate::telemetry::LifecycleOperationRole; use serde::{Deserialize, Serialize}; + use std::sync::{Arc, OnceLock}; #[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] struct TestPayload { @@ -881,6 +884,26 @@ mod tests { assert_eq!(options.send_buffer_count, 128); } + #[test] + fn ingress_observes_lifecycle_role_set_after_binding() { + let ingress = Ingress::, ManyOut>::new(); + let endpoint_role = Arc::new(OnceLock::new()); + + ingress + .lifecycle_operation_role + .set(endpoint_role.clone()) + .expect("new ingress lifecycle role source must be empty"); + assert_eq!(ingress.registered_lifecycle_role(), None); + + endpoint_role + .set(LifecycleOperationRole::Prefill) + .expect("new endpoint lifecycle role cell must be empty"); + assert_eq!( + ingress.registered_lifecycle_role(), + Some(LifecycleOperationRole::Prefill) + ); + } + #[test] fn legacy_frontend_control_message_defaults_payload_codec_to_json() { let json = r#"{ @@ -1170,6 +1193,7 @@ pub struct Ingress>, quic_response_client_pool: OnceLock>, payload_adapter: Arc, + lifecycle_operation_role: OnceLock>>, } impl Ingress { @@ -1192,6 +1216,14 @@ impl Ingress { pub fn for_engine(engine: ServiceEngine) -> Result> { Self::for_engine_with_adapter(engine, SerdeIngressPayloadAdapter) } + + /// Build a worker ingress with the role fixed by its startup configuration. + pub fn for_engine_with_lifecycle_role( + engine: ServiceEngine, + role: LifecycleOperationRole, + ) -> Result> { + Self::for_engine_with_adapter_and_lifecycle_role(engine, SerdeIngressPayloadAdapter, role) + } } impl Ingress @@ -1207,9 +1239,25 @@ where endpoint_health_check_notifier: OnceLock::new(), quic_response_client_pool: OnceLock::new(), payload_adapter: Arc::new(payload_adapter), + lifecycle_operation_role: OnceLock::new(), }) } + fn new_with_adapter_and_lifecycle_role( + payload_adapter: Adapter, + lifecycle_operation_role: LifecycleOperationRole, + ) -> Arc { + let ingress = Self::new_with_adapter(payload_adapter); + let role = Arc::new(OnceLock::new()); + role.set(lifecycle_operation_role) + .expect("new lifecycle role cell must be empty"); + ingress + .lifecycle_operation_role + .set(role) + .expect("new ingress lifecycle role source must be empty"); + ingress + } + pub fn attach(&self, segment: Arc>) -> Result<()> { self.segment .set(segment) @@ -1266,11 +1314,23 @@ where ) -> Result> { let frontend = SegmentSource::::new(); let backend = ServiceBackend::from_engine(engine); + let pipeline = frontend.link(backend)?.link_terminal(frontend)?; + let ingress = Ingress::new_with_adapter(payload_adapter); + ingress.attach(pipeline)?; + Ok(ingress) + } + + pub fn for_engine_with_adapter_and_lifecycle_role( + engine: ServiceEngine, + payload_adapter: Adapter, + role: LifecycleOperationRole, + ) -> Result> { + let frontend = SegmentSource::::new(); + let backend = ServiceBackend::from_engine(engine); - // create the pipeline let pipeline = frontend.link(backend)?.link_terminal(frontend)?; - let ingress = Ingress::new_with_adapter(payload_adapter); + let ingress = Ingress::new_with_adapter_and_lifecycle_role(payload_adapter, role); ingress.attach(pipeline)?; Ok(ingress) @@ -1280,10 +1340,28 @@ where fn metrics(&self) -> Option<&Arc> { self.metrics.get() } + + fn registered_lifecycle_role(&self) -> Option { + self.lifecycle_operation_role + .get() + .and_then(|role| role.get()) + .copied() + } + + fn bind_lifecycle_endpoint(&self, endpoint: &crate::component::Endpoint) { + // Keep an explicitly constructed ingress role; otherwise observe model + // registration even when it happens after the endpoint starts serving. + let _ = self + .lifecycle_operation_role + .set(endpoint.lifecycle_operation_role()); + } } #[async_trait] pub trait PushWorkHandler: Send + Sync { + /// Bind endpoint identity independently of metrics registration. + fn bind_endpoint(&self, _endpoint: &crate::component::Endpoint) {} + async fn handle_payload( &self, payload: Bytes, diff --git a/lib/runtime/src/pipeline/network/egress/route_span.rs b/lib/runtime/src/pipeline/network/egress/route_span.rs index 653aa93d5e83..af1f2ab21bc5 100644 --- a/lib/runtime/src/pipeline/network/egress/route_span.rs +++ b/lib/runtime/src/pipeline/network/egress/route_span.rs @@ -411,7 +411,6 @@ mod tests { use tracing_subscriber::Layer; use tracing_subscriber::layer::{Context as TraceContext, SubscriberExt}; use tracing_subscriber::registry::LookupSpan; - use tracing_subscriber::util::SubscriberInitExt; use super::*; @@ -553,9 +552,10 @@ mod tests { #[tokio::test] async fn route_span_covers_attempt_lifecycle_and_retry_metadata() { let captured = Arc::new(Captured::default()); - let _subscriber = tracing_subscriber::registry() - .with(CaptureLayer(captured.clone())) - .set_default(); + // Do not install a global LogTracer: other tests initialize logging. + let _subscriber = tracing::subscriber::set_default( + tracing_subscriber::registry().with(CaptureLayer(captured.clone())), + ); let mut request = Context::new(()); let trace_context = attach_route_trace_context( diff --git a/lib/runtime/src/pipeline/network/egress/tcp_client.rs b/lib/runtime/src/pipeline/network/egress/tcp_client.rs index 597c00f9800d..88283a99d66f 100644 --- a/lib/runtime/src/pipeline/network/egress/tcp_client.rs +++ b/lib/runtime/src/pipeline/network/egress/tcp_client.rs @@ -1735,7 +1735,7 @@ impl RequestPlaneClient for TcpRequestClient { tracing::warn!("TCP request timeout to {}", addr); Err(anyhow::anyhow!( crate::error::DynamoError::builder() - .error_type(crate::error::ErrorType::CannotConnect) + .error_type(crate::error::ErrorType::ConnectionTimeout) .message(format!("TCP request to {addr} timed out")) .build() )) diff --git a/lib/runtime/src/pipeline/network/ingress/push_handler.rs b/lib/runtime/src/pipeline/network/ingress/push_handler.rs index 1dd9c3eb8228..b962e78c7009 100644 --- a/lib/runtime/src/pipeline/network/ingress/push_handler.rs +++ b/lib/runtime/src/pipeline/network/ingress/push_handler.rs @@ -12,6 +12,7 @@ use crate::metrics::work_handler_perf::{ }; use crate::pipeline::network::StreamPrologueError; use crate::pipeline::{ManyIn, RequestStream}; +use crate::telemetry::{LifecycleStage, LifecycleTrace}; use futures::StreamExt; use prometheus::{Histogram, IntCounter, IntCounterVec, IntGauge}; use serde::Deserialize; @@ -457,6 +458,12 @@ struct ParsedRequest { payload_codec: RequestPlanePayloadCodec, } +#[derive(Clone, Copy)] +struct ResponsePlaneModes { + configured: ResponsePlaneMode, + advertised: ResponsePlaneMode, +} + /// Per-shape strategy for turning a raw payload into a typed engine /// request. Captures the wire-shape divergence between the unary /// (`HeaderAndData`) and bidirectional (`HeaderOnly` + dial-in for the @@ -469,7 +476,8 @@ trait IngressDispatch: Send + Sync { async fn parse_and_build_request( &self, - payload: Bytes, + control_msg: RequestControlMessage, + data: Option, ) -> Result, PipelineError>; } @@ -484,10 +492,9 @@ where async fn parse_and_build_request( &self, - payload: Bytes, + control_msg: RequestControlMessage, + data: Option, ) -> Result>, PipelineError> { - let (control_msg, data) = self.decode_control_message(payload)?; - // The unary path carries the request body in the data half; a // header-only envelope means the sender used the bidirectional shape. let data = data.ok_or_else(|| { @@ -543,10 +550,9 @@ where async fn parse_and_build_request( &self, - payload: Bytes, + control_msg: RequestControlMessage, + data: Option, ) -> Result>, PipelineError> { - let (control_msg, data) = self.decode_control_message(payload)?; - // Bidirectional envelopes are header-only — all request frames // (including the first) flow on the request-stream socket once it's // dialed in. A data payload means the sender used the unary wire @@ -673,14 +679,19 @@ where request: Req, payload_codec: RequestPlanePayloadCodec, start_time: Instant, - configured_mode: ResponsePlaneMode, - advertised_mode: ResponsePlaneMode, + response_modes: ResponsePlaneModes, + lifecycle: &LifecycleTrace, mut publisher: P, ) -> Result<(), PipelineError> where Self: IngressDispatch, P: ResponsePublisher, { + let ResponsePlaneModes { + configured: configured_mode, + advertised: advertised_mode, + } = response_modes; + if configured_mode != advertised_mode { let message = format!( "response plane mismatch: frontend requested {}, worker configured {}", @@ -694,26 +705,32 @@ where let request_context = request.context(); tracing::trace!("calling generate"); + let worker_operation = lifecycle.start_worker_operation(); // Route backend generation through the transport-independent admission // boundary. Admission errors follow the existing generate error path. - let stream = admission_gate::global() - .admit( - Some(request_context.as_ref()), - self.segment - .get() - .expect("segment not set") - .generate(request), - ) - .await - .map_err(|error| { - if let Some(metrics) = self.metrics() { - metrics - .error_counter - .with_label_values(&[work_handler::error_types::GENERATE]) - .inc(); - } - PipelineError::GenerateError(error) - }); + let stream = async { + admission_gate::global() + .admit( + Some(request_context.as_ref()), + self.segment + .get() + .expect("segment not set") + .generate(request) + .instrument(lifecycle.start(LifecycleStage::RequestDispatch)), + ) + .await + } + .instrument(worker_operation.clone()) + .await + .map_err(|error| { + if let Some(metrics) = self.metrics() { + metrics + .error_counter + .with_label_values(&[work_handler::error_types::GENERATE]) + .inc(); + } + PipelineError::GenerateError(error) + }); let stream = match stream { Ok(stream) => { @@ -767,8 +784,13 @@ where } }; - self.pump_response_stream(stream, &publisher, payload_codec) - .await; + async { + self.pump_response_stream(stream, &publisher, payload_codec) + .instrument(lifecycle.start_worker_response_streaming()) + .await + } + .instrument(worker_operation) + .await; let finish = if publisher.reset_on_stop() && request_context.is_stopped() && !request_context.is_killed() @@ -805,7 +827,6 @@ where .unwrap_or_default() .as_nanos() as u64; let start_time = std::time::Instant::now(); - // Increment inflight and ensure it's decremented on all exits via RAII guard let _inflight_guard = self.metrics().map(|m| { m.request_counter.inc(); @@ -822,12 +843,30 @@ where } }); + let (control_msg, data) = self.decode_control_message(payload)?; + let lifecycle = match self.registered_lifecycle_role() { + Some(role) + if control_msg + .metadata + .get(crate::telemetry::LIFECYCLE_ROOT_METADATA_KEY) + .is_some_and(|version| version == "v1") => + { + LifecycleTrace::from_request_id_with_role(control_msg.id.clone(), role) + } + _ => LifecycleTrace::new(false), + }; + + // Admission begins after the envelope selects capture, before payload + // decoding and response setup. Hold without entering it: response + // readers capture the current span and live until the request ends. + // They must inherit handle_payload, not prolong worker.admission. + let worker_admission = lifecycle.start(LifecycleStage::WorkerAdmission); let ParsedRequest { request, response_connection_info, frontend_send_ts_ns, payload_codec, - } = self.parse_and_build_request(payload).await?; + } = self.parse_and_build_request(control_msg, data).await?; // Compute network transit time (T2 - T1) using cross-process wall-clock timestamps if let Some(t1_ns) = frontend_send_ts_ns { @@ -840,6 +879,10 @@ where .map_err(|error| PipelineError::Generic(error.to_string()))?; let configured_mode = ResponsePlaneMode::configured() .map_err(|error| PipelineError::Generic(error.to_string()))?; + let response_modes = ResponsePlaneModes { + configured: configured_mode, + advertised: advertised_mode, + }; let cancellation_counter = self .metrics() .map(|metrics| metrics.cancellation_total.clone()); @@ -862,12 +905,13 @@ where } PipelineError::Generic(format!("Failed to create response stream: {error}")) })?; + drop(worker_admission); self.generate_and_publish( request, payload_codec, start_time, - configured_mode, - advertised_mode, + response_modes, + &lifecycle, publisher, ) .await?; @@ -893,12 +937,13 @@ where "Failed to create QUIC response stream: {error}" )) })?; + drop(worker_admission); self.generate_and_publish( request, payload_codec, start_time, - configured_mode, - advertised_mode, + response_modes, + &lifecycle, publisher, ) .await?; @@ -920,6 +965,10 @@ where U: Data + std::fmt::Debug, Adapter: IngressPayloadAdapter + Send + Sync + 'static, { + fn bind_endpoint(&self, endpoint: &crate::component::Endpoint) { + self.bind_lifecycle_endpoint(endpoint); + } + fn add_metrics( &self, endpoint: &crate::component::Endpoint, @@ -952,6 +1001,10 @@ where U: Data + std::fmt::Debug, Adapter: IngressPayloadAdapter + Send + Sync + 'static, { + fn bind_endpoint(&self, endpoint: &crate::component::Endpoint) { + self.bind_lifecycle_endpoint(endpoint); + } + fn add_metrics( &self, endpoint: &crate::component::Endpoint, @@ -1038,6 +1091,155 @@ mod tests { assert_eq!(error.reason().as_str(), "runtime.unclassified"); } + #[derive(Clone, Default)] + struct AdmissionCapture { + started: Arc, + closed: Arc, + } + + impl tracing_subscriber::Layer for AdmissionCapture + where + S: tracing::Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>, + { + fn on_new_span( + &self, + attrs: &tracing::span::Attributes<'_>, + _id: &tracing::span::Id, + _ctx: tracing_subscriber::layer::Context<'_, S>, + ) { + if attrs.metadata().name() == "worker.admission" { + self.started.store(true, Ordering::SeqCst); + } + } + + fn on_close(&self, id: tracing::span::Id, ctx: tracing_subscriber::layer::Context<'_, S>) { + if ctx.span(&id).unwrap().metadata().name() == "worker.admission" { + self.closed.store(true, Ordering::SeqCst); + } + } + } + + struct AdmissionProbe(AdmissionCapture, bool); + + #[async_trait] + impl crate::engine::AsyncEngine, ManyOut, anyhow::Error> + for AdmissionProbe + { + async fn generate( + &self, + _request: SingleIn, + ) -> anyhow::Result> { + assert_eq!(self.0.started.load(Ordering::SeqCst), self.1); + assert_eq!( + self.0.closed.load(Ordering::SeqCst), + self.1, + "admission must close before generation, while the TCP reader is still alive" + ); + anyhow::bail!("admission probe finished") + } + } + + #[tokio::test] + async fn lifecycle_admission_closes_before_generation_and_skips_control_calls() { + use tracing::instrument::WithSubscriber; + use tracing_subscriber::prelude::*; + + // Configuration is process-scoped. Isolate this enabled-mode test from + // other tests which may have initialized the disabled default already. + const CHILD: &str = "DYNAMO_LIFECYCLE_ADMISSION_TEST_CHILD"; + if std::env::var_os(CHILD).is_none() { + let status = std::process::Command::new(std::env::current_exe().unwrap()) + .args([ + "--exact", + "pipeline::network::ingress::push_handler::tests::lifecycle_admission_closes_before_generation_and_skips_control_calls", + "--nocapture", + ]) + .env(CHILD, "1") + .env("DYN_LIFECYCLE_TRACE_ENABLED", "true") + .status() + .unwrap(); + assert!(status.success(), "isolated admission regression failed"); + return; + } + + temp_env::async_with_vars( + [ + ("DYN_LIFECYCLE_TRACE_ENABLED", Some("true")), + ("DYN_RESPONSE_PLANE", Some("tcp")), + ], + async { + for (inference, rooted) in + [(true, true), (true, false), (false, true), (false, false)] + { + let capture = AdmissionCapture::default(); + let subscriber = tracing_subscriber::registry().with(capture.clone()); + async { + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let address = listener.local_addr().unwrap().to_string(); + let peer = tokio::spawn(async move { + let (mut socket, _) = listener.accept().await.unwrap(); + let _ = tokio::io::copy(&mut socket, &mut tokio::io::sink()).await; + }); + let engine = Arc::new(AdmissionProbe(capture, inference && rooted)); + let ingress = if inference { + TestIngress::for_engine_with_lifecycle_role( + engine, + crate::telemetry::LifecycleOperationRole::Worker, + ) + } else { + TestIngress::for_engine(engine) + } + .unwrap(); + let connection: ConnectionInfo = tcp::TcpStreamConnectionInfo { + address, + subject: "admission-probe".to_string(), + context: "admission-probe".to_string(), + stream_type: crate::pipeline::network::StreamType::Response, + } + .into(); + let metadata = if rooted { + std::collections::BTreeMap::from([( + crate::telemetry::LIFECYCLE_ROOT_METADATA_KEY, + "v1", + )]) + } else { + std::collections::BTreeMap::new() + }; + let header = serde_json::to_vec(&serde_json::json!({ + "id": "admission-probe", + "request_type": "single_in", + "response_type": "many_out", + "connection_info": connection, + "metadata": metadata, + })) + .unwrap(); + let payload = TwoPartCodec::default() + .encode_message(TwoPartMessage::from_parts( + header.into(), + Bytes::from_static(b"{}"), + )) + .unwrap(); + let error = tokio::time::timeout( + std::time::Duration::from_secs(10), + ingress + .handle_payload_shared(payload, Some("admission-probe".to_string())) + .instrument(tracing::info_span!("handle_payload")), + ) + .await + .expect("local admission probe timed out") + .unwrap_err(); + assert!(error.to_string().contains("admission probe finished")); + peer.abort(); + let _ = peer.await; + } + .with_subscriber(subscriber) + .await; + } + }, + ) + .await; + } + #[derive(Default)] struct MismatchPublisher { prologue: Arc>>>, @@ -1074,14 +1276,18 @@ mod tests { let publisher = MismatchPublisher::default(); let prologue = publisher.prologue.clone(); let finished = publisher.finished.clone(); + let lifecycle = LifecycleTrace::new(false); let error = ingress .generate_and_publish( Context::new(serde_json::json!({})), RequestPlanePayloadCodec::Json, Instant::now(), - configured, - advertised, + ResponsePlaneModes { + configured, + advertised, + }, + &lifecycle, publisher, ) .await diff --git a/lib/runtime/src/pipeline/network/tcp/client.rs b/lib/runtime/src/pipeline/network/tcp/client.rs index 55b3a8b52e0c..cbdc182eb597 100644 --- a/lib/runtime/src/pipeline/network/tcp/client.rs +++ b/lib/runtime/src/pipeline/network/tcp/client.rs @@ -766,7 +766,6 @@ mod tests { use tracing_subscriber::Layer; use tracing_subscriber::layer::{Context as TraceContext, SubscriberExt}; use tracing_subscriber::registry::LookupSpan; - use tracing_subscriber::util::SubscriberInitExt; type CapturedCancellationEvent = (HashMap, Option); @@ -812,9 +811,10 @@ mod tests { #[tokio::test] async fn upstream_cancellation_event_is_parented_to_worker_request_span() { let captured = Arc::new(CancellationEventCapture::default()); - let _subscriber = tracing_subscriber::registry() - .with(CancellationEventLayer(captured.clone())) - .set_default(); + // Do not install a global LogTracer: other tests initialize logging. + let _subscriber = tracing::subscriber::set_default( + tracing_subscriber::registry().with(CancellationEventLayer(captured.clone())), + ); let controller = Arc::new(Controller::new("request-123".to_string())); let span = tracing::info_span!(target: "request_span", "handle_payload"); diff --git a/lib/runtime/src/telemetry.rs b/lib/runtime/src/telemetry.rs new file mode 100644 index 000000000000..755375ecc9aa --- /dev/null +++ b/lib/runtime/src/telemetry.rs @@ -0,0 +1,592 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Native OpenTelemetry request-lifecycle spans. +//! +//! Coarse runtime timing, causal parentage, request identity, and terminal outcomes. +//! Engine-internal metrics and invariants are intentionally not instrumented here. + +use std::sync::{ + Arc, OnceLock, + atomic::{AtomicBool, Ordering}, +}; + +use std::time::{SystemTime, UNIX_EPOCH}; +use tracing::Span; + +use crate::config::environment_names::lifecycle_tracing::{ + DYN_LIFECYCLE_TRACE_ENABLED, DYN_LIFECYCLE_TRACE_MODE, +}; + +/// Static tracing target used exclusively by lifecycle spans. +pub const LIFECYCLE_TARGET: &str = "dynamo.request_lifecycle"; + +/// Context-registry key used to preserve lifecycle identity through frontend stages. +pub const LIFECYCLE_TRACE_CONTEXT_KEY: &str = "dynamo.request_lifecycle.trace"; + +/// Internal wire metadata marking requests with a frontend lifecycle root. +/// Absent on legacy or uninstrumented frontends; those requests keep ordinary tracing. +pub const LIFECYCLE_ROOT_METADATA_KEY: &str = "dynamo.lifecycle.root"; + +const LIFECYCLE_SCHEMA: &str = "v1"; +const DEFAULT_PROFILE: &str = "generic.v1"; +const DEFAULT_MODE: &str = "core"; + +static PROCESS_EPOCH: OnceLock = OnceLock::new(); +static INSTANCE_ID: OnceLock = OnceLock::new(); +static LIFECYCLE_ENABLED: OnceLock = OnceLock::new(); +static LIFECYCLE_MODE: OnceLock<&'static str> = OnceLock::new(); + +/// Operation owner used to distinguish the frontend and worker stages. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum LifecycleOperationRole { + Frontend, + Encode, + Prefill, + Decode, + Worker, +} + +impl LifecycleOperationRole { + const fn as_str(self) -> &'static str { + match self { + Self::Frontend => "frontend", + Self::Encode => "encode", + Self::Prefill => "prefill", + Self::Decode => "decode", + Self::Worker => "worker", + } + } +} + +/// One-shot outcome recorded on the request root. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum TerminalOutcome { + Success, + Rejected, + Cancelled, + TimedOut, + Failed, + Unknown, +} + +impl TerminalOutcome { + const fn as_str(self) -> &'static str { + match self { + Self::Success => "success", + Self::Rejected => "rejected", + Self::Cancelled => "cancelled", + Self::TimedOut => "timed_out", + Self::Failed => "failed", + Self::Unknown => "unknown", + } + } + + const fn is_error(self) -> bool { + !matches!(self, Self::Success) + } +} + +#[derive(Clone, Debug, Eq, PartialEq)] +struct LifecycleIdentity { + request_id: String, + /// Identifies one lifecycle wave within a request, which may span retries + /// or prefill/decode operations. + operation_id: String, + role: LifecycleOperationRole, + profile: &'static str, + mode: &'static str, + identity_state: &'static str, +} + +impl LifecycleIdentity { + fn new(request_id: Option, role: LifecycleOperationRole) -> Self { + let (request_id, identity_state) = match request_id.filter(|id| !id.is_empty()) { + Some(id) => (id, "complete"), + None => ("unknown".to_string(), "missing_request_id"), + }; + Self { + request_id, + operation_id: uuid::Uuid::new_v4().to_string(), + role, + profile: DEFAULT_PROFILE, + mode: lifecycle_mode(), + identity_state, + } + } +} + +/// A duration-bearing boundary in the request-lifecycle convention. +/// +/// `WorkerOperationPrefill` and `WorkerOperationDecode` are coarse Dynamo +/// runtime boundaries around the worker operation; they are not direct engine +/// execution measurements. +/// +/// Router queue and selection stages are intentionally deferred. A later +/// instrumentation milestone will add spans at the actual scheduling +/// boundaries together with the router-specific metrics and invariants needed +/// to interpret them. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum LifecycleStage { + RequestLifecycle, + RequestPreprocessing, + WorkerAdmission, + RequestDispatch, + WorkerOperation, + WorkerOperationEncode, + WorkerOperationPrefill, + WorkerOperationDecode, + ResponseStreaming, + ResponseStreamingEncode, + ResponseStreamingPrefill, + ResponseStreamingDecode, + ResponseStreamingWorker, +} + +impl LifecycleStage { + const fn component(self) -> &'static str { + match self { + Self::RequestLifecycle | Self::RequestPreprocessing | Self::ResponseStreaming => { + "frontend" + } + Self::WorkerAdmission + | Self::RequestDispatch + | Self::WorkerOperation + | Self::WorkerOperationEncode + | Self::WorkerOperationPrefill + | Self::WorkerOperationDecode + | Self::ResponseStreamingPrefill + | Self::ResponseStreamingEncode + | Self::ResponseStreamingDecode + | Self::ResponseStreamingWorker => "worker", + } + } + + fn span(self, identity: &LifecycleIdentity) -> Span { + macro_rules! common_span { + ($name:literal) => { + tracing::info_span!( + target: LIFECYCLE_TARGET, $name, + "dynamo.request.id" = %identity.request_id, + "dynamo.operation.id" = %identity.operation_id, + "dynamo.operation.role" = identity.role.as_str(), + "dynamo.lifecycle.schema" = LIFECYCLE_SCHEMA, + "dynamo.lifecycle.profile" = %identity.profile, + "dynamo.lifecycle.mode" = %identity.mode, + "dynamo.component" = self.component(), + "dynamo.instance.id" = instance_id(), + "dynamo.process.epoch" = process_epoch(), + "dynamo.lifecycle.identity.state" = identity.identity_state, + ) + }; + } + // Each branch is a static callsite, allowing inexpensive target filtering. + match self { + Self::RequestLifecycle => tracing::info_span!( + target: LIFECYCLE_TARGET, "request.lifecycle", + "dynamo.request.id" = %identity.request_id, + "dynamo.operation.id" = %identity.operation_id, + "dynamo.operation.role" = identity.role.as_str(), + "dynamo.lifecycle.schema" = LIFECYCLE_SCHEMA, + "dynamo.lifecycle.profile" = %identity.profile, + "dynamo.lifecycle.mode" = %identity.mode, + "dynamo.component" = self.component(), + "dynamo.instance.id" = instance_id(), + "dynamo.process.epoch" = process_epoch(), + "dynamo.lifecycle.identity.state" = identity.identity_state, + "dynamo.session.id" = tracing::field::Empty, + "dynamo.session.source" = tracing::field::Empty, + "dynamo.request.terminal.outcome" = tracing::field::Empty, + "dynamo.request.terminal.error" = tracing::field::Empty, + "dynamo.request.terminal.timestamp_unix_ns" = tracing::field::Empty, + ), + Self::RequestPreprocessing => common_span!("request.preprocessing"), + Self::WorkerAdmission => common_span!("worker.admission"), + Self::RequestDispatch => common_span!("request.dispatch"), + Self::WorkerOperation => common_span!("worker.operation"), + Self::WorkerOperationEncode => common_span!("worker.operation.encode"), + Self::WorkerOperationPrefill => common_span!("worker.operation.prefill"), + Self::WorkerOperationDecode => common_span!("worker.operation.decode"), + Self::ResponseStreaming => common_span!("response.streaming"), + Self::ResponseStreamingEncode => common_span!("response.streaming.encode"), + Self::ResponseStreamingPrefill => common_span!("response.streaming.prefill"), + Self::ResponseStreamingDecode => common_span!("response.streaming.decode"), + Self::ResponseStreamingWorker => common_span!("response.streaming.worker"), + } + } +} + +/// Request-scoped lifecycle capture state. +/// +/// Construct this once when request state is created, freezing the feature gate +/// for the lifetime of that request. +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct LifecycleTrace { + enabled: bool, + identity: Option, +} + +impl LifecycleTrace { + /// Construct capture state explicitly, primarily for integrations and tests. + pub fn new(enabled: bool) -> Self { + if enabled { + Self::enabled(LifecycleIdentity::new(None, LifecycleOperationRole::Worker)) + } else { + Self::disabled() + } + } + + /// Construct worker capture state with its statically configured role. + pub fn from_request_id_with_role( + request_id: impl Into, + role: LifecycleOperationRole, + ) -> Self { + if !lifecycle_tracing_enabled() { + return Self::disabled(); + } + Self::enabled(LifecycleIdentity::new(Some(request_id.into()), role)) + } + + /// Construct a frontend trace before request parsing has made a session ID available. + pub fn frontend_request_without_session(request_id: impl Into) -> Self { + Self::with_role(request_id, LifecycleOperationRole::Frontend) + } + + fn with_role(request_id: impl Into, role: LifecycleOperationRole) -> Self { + if lifecycle_tracing_enabled() { + Self::enabled(LifecycleIdentity::new(Some(request_id.into()), role)) + } else { + Self::disabled() + } + } + + fn enabled(identity: LifecycleIdentity) -> Self { + Self { + enabled: true, + identity: Some(identity), + } + } + + const fn disabled() -> Self { + Self { + enabled: false, + identity: None, + } + } + + /// Whether lifecycle spans are emitted for this request. + pub const fn is_enabled(&self) -> bool { + self.enabled + } + + /// Start the request root and return a recorder shared with all terminal paths. + #[must_use] + pub fn start_request(&self) -> LifecycleRequest { + let span = self.start(LifecycleStage::RequestLifecycle); + LifecycleRequest { + span: span.clone(), + terminal: LifecycleTerminal(self.enabled.then(|| { + Arc::new(TerminalState { + span, + finished: AtomicBool::new(false), + }) + })), + } + } + + /// Start a duration-only lifecycle span. + #[must_use] + pub fn start(&self, stage: LifecycleStage) -> Span { + if let Some(identity) = self.identity.as_ref() { + stage.span(identity) + } else { + Span::none() + } + } + + /// Start the worker response-streaming boundary with its configured + /// disaggregation role encoded in the timing span name. + #[must_use] + pub fn start_worker_response_streaming(&self) -> Span { + if !self.enabled { + return Span::none(); + } + let role = self.identity.as_ref().map(|identity| identity.role); + self.start(worker_response_streaming_stage(role)) + } + + /// Start the worker operation boundary for a disaggregated role. + /// + /// This bounds the Dynamo runtime's worker-side operation. It intentionally + /// includes any backend-internal queueing or decode-side KV wait. + #[must_use] + pub fn start_worker_operation(&self) -> Span { + if !self.enabled { + return Span::none(); + } + let role = self.identity.as_ref().map(|identity| identity.role); + self.start(worker_operation_stage(role)) + } +} + +/// Request root span plus the shared terminal recorder. +/// +/// The span stays open while detached request work cleans up. Its duration may +/// therefore extend past client termination; `dynamo.request.terminal.timestamp_unix_ns` +/// records the first terminal observation, independently of that cleanup. +pub struct LifecycleRequest { + span: Span, + terminal: LifecycleTerminal, +} + +impl LifecycleRequest { + #[must_use] + pub fn span(&self) -> Span { + self.span.clone() + } + + #[must_use] + pub fn terminal(&self) -> LifecycleTerminal { + self.terminal.clone() + } + + /// Record session identity after request parsing, or the request-ID fallback on early errors. + pub fn record_session(&self, request_id: &str, session_id: Option<&str>) { + let (session_id, source) = session_id + .filter(|id| !id.is_empty()) + .map(|id| (id, "agent_context")) + .unwrap_or((request_id, "request_id_fallback")); + self.span.record("dynamo.session.id", session_id); + self.span.record("dynamo.session.source", source); + } +} + +/// A terminal recorder that is safe to clone across completion and cancellation paths. +#[derive(Clone)] +pub struct LifecycleTerminal(Option>); + +struct TerminalState { + span: Span, + finished: AtomicBool, +} + +impl LifecycleTerminal { + /// Record the first observed terminal result. Later races are ignored. + pub fn finish(&self, outcome: TerminalOutcome) { + if let Some(state) = &self.0 + && !state.finished.swap(true, Ordering::AcqRel) + { + state.record(outcome); + } + } +} + +impl TerminalState { + fn record(&self, outcome: TerminalOutcome) { + let timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default(); + self.span.record( + "dynamo.request.terminal.timestamp_unix_ns", + u64::try_from(timestamp.as_nanos()).unwrap_or(u64::MAX), + ); + self.span + .record("dynamo.request.terminal.outcome", outcome.as_str()); + self.span + .record("dynamo.request.terminal.error", outcome.is_error()); + } +} + +impl Drop for TerminalState { + fn drop(&mut self) { + if !self.finished.swap(true, Ordering::AcqRel) { + self.record(TerminalOutcome::Unknown); + } + } +} + +fn lifecycle_mode() -> &'static str { + LIFECYCLE_MODE.get_or_init(|| match std::env::var(DYN_LIFECYCLE_TRACE_MODE) { + Ok(mode) if mode.trim().eq_ignore_ascii_case("investigation") => "investigation", + _ => DEFAULT_MODE, + }) +} + +fn process_epoch() -> &'static str { + PROCESS_EPOCH + .get_or_init(|| format!("{}:{}", std::process::id(), uuid::Uuid::new_v4())) + .as_str() +} + +fn instance_id() -> &'static str { + INSTANCE_ID + .get_or_init(|| { + std::env::var("HOSTNAME") + .ok() + .filter(|value| !value.is_empty()) + .unwrap_or_else(|| format!("pid-{}", std::process::id())) + }) + .as_str() +} + +fn worker_operation_stage(role: Option) -> LifecycleStage { + match role { + Some(LifecycleOperationRole::Encode) => LifecycleStage::WorkerOperationEncode, + Some(LifecycleOperationRole::Prefill) => LifecycleStage::WorkerOperationPrefill, + Some(LifecycleOperationRole::Decode) => LifecycleStage::WorkerOperationDecode, + _ => LifecycleStage::WorkerOperation, + } +} + +fn worker_response_streaming_stage(role: Option) -> LifecycleStage { + match role { + Some(LifecycleOperationRole::Encode) => LifecycleStage::ResponseStreamingEncode, + Some(LifecycleOperationRole::Prefill) => LifecycleStage::ResponseStreamingPrefill, + Some(LifecycleOperationRole::Decode) => LifecycleStage::ResponseStreamingDecode, + _ => LifecycleStage::ResponseStreamingWorker, + } +} + +pub(crate) fn lifecycle_tracing_enabled() -> bool { + *LIFECYCLE_ENABLED.get_or_init(|| crate::config::env_is_truthy(DYN_LIFECYCLE_TRACE_ENABLED)) +} + +#[cfg(test)] +mod tests { + use std::sync::{Arc, Mutex}; + + use tracing::Subscriber; + use tracing_subscriber::{Layer, layer::Context, prelude::*}; + + use super::*; + + #[derive(Debug, Eq, PartialEq)] + struct CapturedSpan { + name: &'static str, + target: &'static str, + role: Option, + } + + #[derive(Default)] + struct RoleCapture(Option); + + impl tracing::field::Visit for RoleCapture { + fn record_str(&mut self, field: &tracing::field::Field, value: &str) { + if field.name() == "dynamo.operation.role" { + self.0 = Some(value.to_owned()); + } + } + + fn record_debug(&mut self, _field: &tracing::field::Field, _value: &dyn std::fmt::Debug) {} + } + + struct CaptureLayer(Arc>>); + + impl Layer for CaptureLayer { + fn on_new_span( + &self, + attrs: &tracing::span::Attributes<'_>, + _id: &tracing::Id, + _ctx: Context<'_, S>, + ) { + let metadata = attrs.metadata(); + let mut role = RoleCapture::default(); + attrs.record(&mut role); + self.0.lock().unwrap().push(CapturedSpan { + name: metadata.name(), + target: metadata.target(), + role: role.0, + }); + } + } + + #[test] + fn enabled_trace_creates_a_registered_span() { + let captured = Arc::new(Mutex::new(Vec::new())); + let subscriber = tracing_subscriber::registry().with(CaptureLayer(captured.clone())); + let _guard = tracing::subscriber::set_default(subscriber); + let _span = LifecycleTrace::new(true).start(LifecycleStage::RequestPreprocessing); + + assert_eq!( + captured.lock().unwrap().as_slice(), + [CapturedSpan { + name: "request.preprocessing", + target: LIFECYCLE_TARGET, + role: Some("worker".to_string()), + }] + ); + } + + #[test] + fn disabled_trace_is_a_noop() { + let captured = Arc::new(Mutex::new(Vec::new())); + let subscriber = tracing_subscriber::registry().with(CaptureLayer(captured.clone())); + let _guard = tracing::subscriber::set_default(subscriber); + let trace = LifecycleTrace::new(false); + assert!(trace.identity.is_none()); + let request = trace.start_request(); + assert!( + request.terminal.0.is_none(), + "disabled requests must not allocate terminal state" + ); + let terminal = request.terminal(); + assert!(terminal.0.is_none()); + terminal.finish(TerminalOutcome::Success); + request.record_session("request-id", None); + let _span = trace.start(LifecycleStage::RequestPreprocessing); + + assert!(captured.lock().unwrap().is_empty()); + } + + #[test] + fn worker_stage_selection_emits_expected_spans() { + let captured = Arc::new(Mutex::new(Vec::new())); + let subscriber = tracing_subscriber::registry().with(CaptureLayer(captured.clone())); + let _guard = tracing::subscriber::set_default(subscriber); + for role in [ + LifecycleOperationRole::Worker, + LifecycleOperationRole::Encode, + LifecycleOperationRole::Prefill, + LifecycleOperationRole::Decode, + ] { + let trace = LifecycleTrace::enabled(LifecycleIdentity::new( + Some("request-id".to_string()), + role, + )); + let _operation = trace.start_worker_operation(); + let _streaming = trace.start_worker_response_streaming(); + } + + let captured = captured.lock().unwrap(); + assert!(captured.iter().all(|span| span.target == LIFECYCLE_TARGET)); + assert_eq!( + captured + .iter() + .map(|span| span.role.as_deref()) + .collect::>(), + [ + Some("worker"), + Some("worker"), + Some("encode"), + Some("encode"), + Some("prefill"), + Some("prefill"), + Some("decode"), + Some("decode") + ] + ); + assert_eq!( + captured.iter().map(|span| span.name).collect::>(), + [ + "worker.operation", + "response.streaming.worker", + "worker.operation.encode", + "response.streaming.encode", + "worker.operation.prefill", + "response.streaming.prefill", + "worker.operation.decode", + "response.streaming.decode", + ] + ); + } +} From 6562e7d04b04ad177459f8a5b720718de71e1a6a Mon Sep 17 00:00:00 2001 From: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> Date: Sat, 19 Sep 2026 12:17:57 +0000 Subject: [PATCH 126/191] docs: refresh community events Automated refresh from the public Dynamo Google Calendar. Generated by .github/workflows/community-events-refresh.yml. Signed-off-by: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> --- docs/fern/components/events.generated.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fern/components/events.generated.ts b/docs/fern/components/events.generated.ts index 28acffa59e02..f58075cbf218 100644 --- a/docs/fern/components/events.generated.ts +++ b/docs/fern/components/events.generated.ts @@ -22,7 +22,7 @@ export interface DynamoEvent { } /** Generation date in Pacific, YYYY-MM-DD. The calendar grid treats this as "today". */ -export const GENERATED_ON = "2026-09-18"; +export const GENERATED_ON = "2026-09-19"; export const UPCOMING_EVENTS: DynamoEvent[] = []; From 25a8159d2d22317e8f72bb734958aaab0516d3bb Mon Sep 17 00:00:00 2001 From: ishandhanani <82981111+ishandhanani@users.noreply.github.com> Date: Sat, 19 Sep 2026 13:20:49 -0700 Subject: [PATCH 127/191] feat(router): unify native plugin setup and register classifiers (#14149) Signed-off-by: Ishan Dhanani --- .../router/custom-worker-selection.mdx | 120 +++++- .../use-cases/agents/priority-scheduling.md | 2 +- .../simple-filter-score-pick/src/filter.rs | 2 +- .../simple-filter-score-pick/src/lib.rs | 13 +- .../simple-filter-score-pick/src/picker.rs | 2 +- .../simple-filter-score-pick/src/scorer.rs | 2 +- lib/bindings/python/rust/lib.rs | 53 ++- lib/bindings/python/rust/llm/entrypoint.rs | 17 +- lib/bindings/python/rust/llm/kv.rs | 68 ++-- lib/kv-router/src/lib.rs | 21 +- lib/kv-router/src/plugins.rs | 63 ++++ .../registry.rs} | 119 +++++- .../src/plugins/request_classifier.rs | 256 +++++++++++++ .../src/plugins/request_classifier/config.rs | 65 ++++ .../request_classifier/inputs.rs | 0 .../plugins/request_classifier/progress.rs | 59 +++ .../plugins/request_classifier/registry.rs | 242 ++++++++++++ lib/kv-router/src/plugins/worker_selection.rs | 353 ++++++++++++++++++ .../worker_selection/config.rs} | 6 +- lib/kv-router/src/scheduling/config.rs | 12 + lib/kv-router/src/scheduling/local.rs | 5 +- lib/kv-router/src/scheduling/mod.rs | 16 +- lib/kv-router/src/scheduling/policy_config.rs | 74 +++- .../src/scheduling/queue_admission/mod.rs | 58 --- .../src/scheduling/request_classifier.rs | 249 +----------- lib/kv-router/src/scheduling/selector/mod.rs | 8 +- .../src/scheduling/selector/policy.rs | 340 +---------------- lib/kv-router/src/services/selection/mod.rs | 16 +- .../src/services/selection/service.rs | 63 +++- lib/kv-router/tests/plugin_api_compat.rs | 139 +++++++ lib/llm/src/discovery/model_manager.rs | 38 ++ lib/llm/src/discovery/watcher.rs | 264 ++++++++++++- lib/llm/src/entrypoint/input/grpc.rs | 3 + lib/llm/src/entrypoint/input/http.rs | 122 ++++-- lib/llm/src/kv_router.rs | 20 +- lib/llm/src/kv_router/embedded.rs | 15 +- lib/llm/src/kv_router/plugins.rs | 63 ++++ lib/mocker/src/replay/router_shared.rs | 21 ++ lib/router-plugins/builtin/src/lib.rs | 10 +- .../builtin/src/two_tier_cost_fn.rs | 19 +- lib/router-plugins/catalog/src/lib.rs | 10 +- 41 files changed, 2169 insertions(+), 859 deletions(-) create mode 100644 lib/kv-router/src/plugins.rs rename lib/kv-router/src/{services/selection/policy_registry.rs => plugins/registry.rs} (79%) create mode 100644 lib/kv-router/src/plugins/request_classifier.rs create mode 100644 lib/kv-router/src/plugins/request_classifier/config.rs rename lib/kv-router/src/{scheduling => plugins}/request_classifier/inputs.rs (100%) create mode 100644 lib/kv-router/src/plugins/request_classifier/progress.rs create mode 100644 lib/kv-router/src/plugins/request_classifier/registry.rs create mode 100644 lib/kv-router/src/plugins/worker_selection.rs rename lib/kv-router/src/{scheduling/worker_selection_config.rs => plugins/worker_selection/config.rs} (96%) create mode 100644 lib/kv-router/tests/plugin_api_compat.rs create mode 100644 lib/llm/src/kv_router/plugins.rs diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx index 0491a5ae4c7f..5827ada9569d 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx @@ -43,6 +43,20 @@ Write your own policy when no shipped policy expresses the rule you need. The re An external policy owns its filters, scorers, and picker. Dynamo's default scorer and picker are internal and can change with the built-in routing algorithm. +## Public Plugin API and Compatibility + +Use `dynamo_kv_router::plugins` for plugin registration and these modules for plugin contracts: + +| Module | Public API | +|---|---| +| `plugins::worker_selection` | `WorkerFilter`, `WorkerScorer`, `WorkerPicker`, `WorkerSelectionPolicy`, request context, worker signal accessors, configuration, and factories | +| `plugins::request_classifier` | `RequestClassifier`, `ClassifyRequest`, `ClassifyEvent`, configuration, and factories | +| `plugins` | `RouterPluginRegistry` and the resolved `RouterPlugins` bundle | + +The module organization changes no signal accessor, callback signature, signal meaning, or configuration format. Cache overlap, worker load, session metadata, and classification inputs retain their existing APIs. Dynamo owns scheduler queues, eligibility checks, reservations, lifecycle synchronization, and the default selector implementation. Low-level host interfaces such as `WorkerSelector` are used to connect Dynamo components; external plugins use `WorkerSelectionPolicy`. + +Existing plugin imports and the `WorkerSelectionPolicyRegistry` name remain available through compatibility re-exports until version 1.7. They refer to the same types and traits, so existing policies can register into `RouterPluginRegistry` without adapters. Migrate imports to `plugins::worker_selection` or `plugins::request_classifier`, rename the registry to `RouterPluginRegistry`, and use `register_worker_selection` for worker policies. The compatibility exports, registry alias, worker-only `register` method, and frontend `worker_selection_policy_factory` setter are scheduled for removal in 1.7. The signal methods themselves are unchanged. + ## Build the Policy ### Create the Policy and Catalog Crates @@ -67,7 +81,6 @@ Add `dynamo-kv-router` from the same checkout that builds the frontend or EPP: cargo add \ --manifest-path "$POLICY_DIR/policy/Cargo.toml" \ --path "$DYNAMO_DIR/lib/kv-router" \ - --features standalone-selection \ dynamo-kv-router # Add parameter deserialization to the policy crate. @@ -85,7 +98,6 @@ cargo add \ cargo add \ --manifest-path "$POLICY_DIR/catalog/Cargo.toml" \ --path "$DYNAMO_DIR/lib/kv-router" \ - --features standalone-selection \ dynamo-kv-router ``` @@ -96,7 +108,7 @@ A filter answers a hard yes-or-no question about one worker that already passed This filter keeps workers with at least the configured number of device-resident overlap blocks: ```rust -use dynamo_kv_router::{ +use dynamo_kv_router::plugins::worker_selection::{ WorkerCandidate, WorkerFilter, WorkerInputs, WorkerSelectionContext, WorkerSelectionPolicyError, }; @@ -134,7 +146,7 @@ A scorer expresses a preference without excluding a worker. It returns one finit This scorer uses the current number of active requests as its cost: ```rust -use dynamo_kv_router::{ +use dynamo_kv_router::plugins::worker_selection::{ WorkerCandidate, WorkerInputs, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicyError, }; @@ -168,7 +180,7 @@ A picker makes the final choice after filtering and scoring. It sees every remai This picker selects the lowest-cost row: ```rust -use dynamo_kv_router::{ +use dynamo_kv_router::plugins::worker_selection::{ WorkerInputView, WorkerPicker, WorkerSelectionContext, WorkerSelectionPolicyError, }; @@ -200,11 +212,11 @@ The provider runs once at startup. Parse and validate all parameters there, then ```rust use std::sync::Arc; -use dynamo_kv_router::services::selection::{ +use dynamo_kv_router::plugins::worker_selection::{ WorkerSelectionPolicyFactory, WorkerSelectionPolicyParameters, WorkerSelectionPolicyProviderError, }; -use dynamo_kv_router::{WorkerFilter, WorkerScorer, WorkerSelectionPolicy}; +use dynamo_kv_router::plugins::worker_selection::{WorkerFilter, WorkerScorer, WorkerSelectionPolicy}; #[derive(serde::Deserialize)] #[serde(deny_unknown_fields)] @@ -248,14 +260,12 @@ Dynamo calls the returned factory once per routing partition. Branch on the type Expose a registration function from the policy crate: ```rust -use dynamo_kv_router::services::selection::{ - WorkerSelectionPolicyRegistry, WorkerSelectionPolicyRegistryError, -}; +use dynamo_kv_router::plugins::{RouterPluginRegistry, WorkerSelectionPolicyRegistryError}; pub fn register( - registry: &mut WorkerSelectionPolicyRegistry, + registry: &mut RouterPluginRegistry, ) -> Result<(), WorkerSelectionPolicyRegistryError> { - registry.register("least-busy", Arc::new(provider)) + registry.register_worker_selection("least-busy", Arc::new(provider)) } ``` @@ -263,7 +273,7 @@ Call this function from the catalog: ```rust pub fn register( - registry: &mut WorkerSelectionPolicyRegistry, + registry: &mut RouterPluginRegistry, ) -> Result<(), WorkerSelectionPolicyRegistryError> { acme_routing_policy::register(registry) } @@ -310,6 +320,86 @@ cargo check --manifest-path "$POLICY_DIR/catalog/Cargo.toml" Add one focused test for each policy decision and one registration test for every type name. +## Register a Request Classifier + +**Experimental.** Request classifiers use the same statically linked catalog as worker filters, scorers, and pickers. Keep the catalog's single `register` function and call `register_request_classifier` for each classifier type. `RouterPluginRegistry` also accepts the existing worker-selection providers; `WorkerSelectionPolicyRegistry` remains an alias, so existing catalogs compile unchanged. + +Implement `RequestClassifier` in your policy crate. Its provider validates `RequestClassifierParameters` at startup and returns a `RequestClassifierFactory`: a closure that receives `RequestClassifierContext` and creates a fresh `Box` for each routed model. The shared router builder supplies the cached capacity context for both HTTP discovery and Python `KvRouter.generate`. Register that provider alongside your worker-selection providers: + +```rust +use std::sync::Arc; +use dynamo_kv_router::plugins::RouterPluginRegistry; + +pub fn register(registry: &mut RouterPluginRegistry) -> Result<(), Box> { + acme_worker_policy::register(registry)?; + registry.register_request_classifier("acme-admission", Arc::new(acme_admission::provider))?; + Ok(()) +} +``` + +The provider signature is: + +```rust +use dynamo_kv_router::plugins::request_classifier::{ + RequestClassifierFactory, RequestClassifierParameters, RequestClassifierProviderError, +}; + +pub fn provider( + parameters: &RequestClassifierParameters, +) -> Result; +``` + +Select the classifier in the same `--router-policy-config` YAML: + +```yaml +request_classifier: + type: acme-admission + parameters: + max_in_flight: 32 +``` + +The parameter mapping belongs to the plugin; `max_in_flight` above is an example plugin setting. Omit `request_classifier` to retain pass-through admission. Unknown types and invalid parameters fail startup. Build and link the catalog with the existing `custom-policy` workflow below; no second catalog export or build flag is required. + +The discovery-backed HTTP frontend and Python `KvRouter.generate` path install classifiers on their KV routers. Classification applies to decode/aggregated admission before queue ordering and worker selection. Selection is fixed at frontend startup and is process-wide; per-model queue profiles do not select different classifier types. A classifier can change the policy class, due time, and scheduling cost through the existing `ClassifyRequest` API. Dynamo retains queueing, worker selection, reservations, and lifecycle delivery. + +### Shared Plugin Construction + +The catalog registers plugin providers once. `RouterPluginRegistry::resolve_plugins` validates the selected configuration and returns a `RouterPlugins` bundle containing the configured factories. Both the HTTP frontend and Python router pass this bundle to the shared router construction path. Each router receives fresh plugin instances; factories run during construction, not for each request. + +Rust embedders can use the same setup: + +```rust +use dynamo_kv_router::plugins::RouterPluginRegistry; +use dynamo_llm::entrypoint::input::http::HttpFrontend; + +let mut registry = RouterPluginRegistry::default(); +acme_routing_catalog::register(&mut registry)?; +let plugins = registry.resolve_plugins(&kv_router_config)?; +HttpFrontend::default() + .plugins(plugins) + .run(distributed_runtime, engine_config) + .await?; +``` + +```mermaid +flowchart LR + Catalog["catalog::register"] --> Registry[RouterPluginRegistry] + Config[Router policy YAML] --> Registry + Registry -->|resolve_plugins| Bundle[RouterPlugins] + Bundle --> HTTP[HTTP discovery] + Bundle --> Python[Python KvRouter] + HTTP --> Build[Shared router construction] + Python --> Build + Build --> Selector[Per-router worker selector] + Build --> Classifier[Per-router request classifier] +``` + +The host's `RouterPluginBuilder` passes worker selection through the shared selection core and installs the remaining plugins before the router is exposed to requests. The worker policy is constructed once per partition, including the probe for its required inputs. Adding another plugin trait requires a typed registration slot, a factory in the bundle, and its construction hook. Entry points continue to carry one bundle. Execution and lifecycle callbacks stay on each trait; the bundle does not add per-request dispatch. + +The compatibility paths described above remain available until 1.7. An empty bundle retains the default selector and pass-through admission. + +The disaggregated prefill hop and query-only probes do not run classifiers. Stateful low-level `best_worker` calls also lack classifier lifecycle enrollment. Offline replay and standalone selection reject `request_classifier` configuration because they cannot run its lifecycle. + ## Available Signals Request context and worker identity are always available. Dynamo calculates optional per-worker signals only for groups that a filter, scorer, or picker requests. @@ -459,11 +549,11 @@ Register the catalog before the standard runner starts: ```rust use dynamo_ext_proc::run; -use dynamo_kv_router::services::selection::WorkerSelectionPolicyRegistry; +use dynamo_kv_router::plugins::RouterPluginRegistry; #[tokio::main] async fn main() -> anyhow::Result<()> { - let mut registry = WorkerSelectionPolicyRegistry::default(); + let mut registry = RouterPluginRegistry::default(); acme_routing_catalog::register(&mut registry)?; run(Some(registry)).await } diff --git a/docs/fern/pages/use-cases/agents/priority-scheduling.md b/docs/fern/pages/use-cases/agents/priority-scheduling.md index 880cb6dead41..e81785aaec9a 100644 --- a/docs/fern/pages/use-cases/agents/priority-scheduling.md +++ b/docs/fern/pages/use-cases/agents/priority-scheduling.md @@ -52,7 +52,7 @@ The router queue only matters when requests are held before dispatch. If a reque (strict_priority, due_at, configured_policy_key) ``` -The strict tier is compared first. Within that tier, every request with a classifier-provided `due_at` is scheduled ahead of every request without one (an unset due time sorts last) before FCFS, LCFS, or Weighted Shortest Processing Time (WSPT) applies its configured policy key. Sustained deadline-bearing traffic can therefore starve non-deadline requests in the same class. A `due_at` is set only by a router request classifier; classifiers are not yet user-configurable. +The strict tier is compared first. Within that tier, every request with a classifier-provided `due_at` is scheduled ahead of every request without one (an unset due time sorts last) before FCFS, LCFS, or Weighted Shortest Processing Time (WSPT) applies its configured policy key. Sustained deadline-bearing traffic can therefore starve non-deadline requests in the same class. A `due_at` is set only by a router request classifier; select a [linked request classifier](../../developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx#register-a-request-classifier) through router policy YAML. The default policy is `fcfs`, which uses the priority value as a positive arrival-time bump. Higher values move the request earlier in the queue. Negative priority values are clamped to zero for router queueing, so a request cannot be pushed behind normal first-come, first-served ordering by sending a negative priority. diff --git a/examples/router/custom-policy-example/simple-filter-score-pick/src/filter.rs b/examples/router/custom-policy-example/simple-filter-score-pick/src/filter.rs index 6be134b6be19..6fb790a8c5ec 100644 --- a/examples/router/custom-policy-example/simple-filter-score-pick/src/filter.rs +++ b/examples/router/custom-policy-example/simple-filter-score-pick/src/filter.rs @@ -3,7 +3,7 @@ //! Device-cache filter for the `simple-filter-score-pick` policy. -use dynamo_kv_router::{ +use dynamo_kv_router::plugins::worker_selection::{ WorkerCandidate, WorkerFilter, WorkerInputs, WorkerSelectionContext, WorkerSelectionPolicyError, }; diff --git a/examples/router/custom-policy-example/simple-filter-score-pick/src/lib.rs b/examples/router/custom-policy-example/simple-filter-score-pick/src/lib.rs index aa75cf461724..a63e0e6504d0 100644 --- a/examples/router/custom-policy-example/simple-filter-score-pick/src/lib.rs +++ b/examples/router/custom-policy-example/simple-filter-score-pick/src/lib.rs @@ -12,12 +12,13 @@ mod scorer; use std::sync::Arc; -use dynamo_kv_router::services::selection::{ - WorkerSelectionPolicyFactory, WorkerSelectionPolicyParameters, - WorkerSelectionPolicyProviderError, WorkerSelectionPolicyRegistry, +use dynamo_kv_router::KvRouterConfig; +use dynamo_kv_router::plugins::RouterPluginRegistry; +use dynamo_kv_router::plugins::worker_selection::{ + WorkerFilter, WorkerSelectionPolicy, WorkerSelectionPolicyFactory, + WorkerSelectionPolicyParameters, WorkerSelectionPolicyProviderError, WorkerSelectionPolicyRegistryError, }; -use dynamo_kv_router::{KvRouterConfig, WorkerFilter, WorkerSelectionPolicy}; use filter::MinimumDeviceOverlapFilter; use picker::RequestAwarePicker; use scorer::ActiveRequestsScorer; @@ -64,9 +65,9 @@ fn provider( /// Register the `simple-filter-score-pick` policy type. pub fn register( - registry: &mut WorkerSelectionPolicyRegistry, + registry: &mut RouterPluginRegistry, ) -> Result<(), WorkerSelectionPolicyRegistryError> { - registry.register("simple-filter-score-pick", Arc::new(provider)) + registry.register_worker_selection("simple-filter-score-pick", Arc::new(provider)) } #[cfg(test)] diff --git a/examples/router/custom-policy-example/simple-filter-score-pick/src/picker.rs b/examples/router/custom-policy-example/simple-filter-score-pick/src/picker.rs index d87824be4f20..16d3cc89ef89 100644 --- a/examples/router/custom-policy-example/simple-filter-score-pick/src/picker.rs +++ b/examples/router/custom-policy-example/simple-filter-score-pick/src/picker.rs @@ -3,7 +3,7 @@ //! Request-aware picker for the `simple-filter-score-pick` policy. -use dynamo_kv_router::{ +use dynamo_kv_router::plugins::worker_selection::{ WorkerInputView, WorkerInputs, WorkerPicker, WorkerSelectionContext, WorkerSelectionInputTrigger, WorkerSelectionPolicyError, }; diff --git a/examples/router/custom-policy-example/simple-filter-score-pick/src/scorer.rs b/examples/router/custom-policy-example/simple-filter-score-pick/src/scorer.rs index 136cca9f1b3f..a9429e55de94 100644 --- a/examples/router/custom-policy-example/simple-filter-score-pick/src/scorer.rs +++ b/examples/router/custom-policy-example/simple-filter-score-pick/src/scorer.rs @@ -3,7 +3,7 @@ //! Active-request scorer for the `simple-filter-score-pick` policy. -use dynamo_kv_router::{ +use dynamo_kv_router::plugins::worker_selection::{ WorkerCandidate, WorkerInputs, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicyError, }; diff --git a/lib/bindings/python/rust/lib.rs b/lib/bindings/python/rust/lib.rs index 296e40f6df03..5b10f891ebbb 100644 --- a/lib/bindings/python/rust/lib.rs +++ b/lib/bindings/python/rust/lib.rs @@ -41,8 +41,8 @@ use dynamo_runtime::{ }; #[cfg(any(feature = "custom-policy", feature = "select-service"))] -use dynamo_kv_router::services::selection::WorkerSelectionPolicyRegistry; -use dynamo_kv_router::{KvRouterConfig, WorkerSelectionPolicyFactory}; +use dynamo_kv_router::plugins::RouterPluginRegistry; +use dynamo_kv_router::{KvRouterConfig, plugins::RouterPlugins}; use dynamo_llm::entrypoint::RouterConfig; use dynamo_llm::{self as llm_rs}; @@ -117,9 +117,6 @@ type PythonBidirectionalIngress = Ingress< static INIT: OnceCell<()> = OnceCell::new(); -#[cfg(feature = "custom-policy")] -static WORKER_SELECTION_POLICY_REGISTRY: OnceCell = OnceCell::new(); - const DEFAULT_ANNOTATED_SETTING: Option = Some(true); const SKIP_PYTHON_LOG_INIT_ENV: &str = "DYNAMO_SKIP_PYTHON_LOG_INIT"; @@ -411,48 +408,44 @@ fn register_core(m: &Bound<'_, PyModule>) -> PyResult<()> { Ok(()) } -pub(crate) fn worker_selection_policy_factory( - config: &KvRouterConfig, -) -> anyhow::Result> { +pub(crate) fn router_plugins(config: &KvRouterConfig) -> anyhow::Result { #[cfg(feature = "custom-policy")] { - Ok(WORKER_SELECTION_POLICY_REGISTRY - .get() - .map(|registry| registry.resolve(config)) - .transpose()? - .flatten()) + Ok(dynamo_llm::kv_router::plugins::router_plugin_registry().resolve_plugins(config)?) } #[cfg(not(feature = "custom-policy"))] { if let Some(instance) = config.selected_worker_selection_policy_instance()? { anyhow::bail!( - "worker-selection instance {instance:?} is configured, but this Dynamo build has no linked worker-selection policy catalog; rebuild with --features custom-policy" + "worker-selection instance {instance:?} is configured, but this Dynamo build has no linked router plugin catalog; rebuild with --features custom-policy" + ); + } + if config.request_classifier_config()?.is_some() { + anyhow::bail!( + "request_classifier is configured, but no router plugin catalog is installed; rebuild with --features custom-policy" ); } - Ok(None) + Ok(RouterPlugins::default()) } } #[cfg(feature = "select-service")] -pub(crate) fn linked_worker_selection_policy_registry() -> WorkerSelectionPolicyRegistry { +pub(crate) fn linked_worker_selection_policy_registry() -> RouterPluginRegistry { #[cfg(feature = "custom-policy")] { - WORKER_SELECTION_POLICY_REGISTRY - .get() - .cloned() - .unwrap_or_default() + dynamo_llm::kv_router::plugins::router_plugin_registry() } #[cfg(not(feature = "custom-policy"))] { - WorkerSelectionPolicyRegistry::default() + RouterPluginRegistry::default() } } #[cfg(feature = "custom-policy")] -fn register_core_with_custom_worker_selection_policy(m: &Bound<'_, PyModule>) -> PyResult<()> { - let mut registry = WorkerSelectionPolicyRegistry::default(); +fn register_core_with_router_plugins(m: &Bound<'_, PyModule>) -> PyResult<()> { + let mut registry = RouterPluginRegistry::default(); // The policies Dynamo ships register first, so a replaced catalog that reuses one of their // type names fails here instead of silently overriding it. dynamo_custom_policy_builtin::register(&mut registry) @@ -460,13 +453,11 @@ fn register_core_with_custom_worker_selection_policy(m: &Bound<'_, PyModule>) -> dynamo_worker_selection_policy_catalog::register(&mut registry) .map_err(|error| PyRuntimeError::new_err(error.to_string()))?; - // Embedded selection partitions resolve linked policies from the same registry. - dynamo_llm::kv_router::install_worker_selection_policy_registry(registry.clone()); - WORKER_SELECTION_POLICY_REGISTRY - .set(registry) - .map_err(|_| { - PyRuntimeError::new_err("worker-selection policy registry already installed") - })?; + if !dynamo_llm::kv_router::plugins::install_router_plugin_registry(registry) { + return Err(PyRuntimeError::new_err( + "router plugin registry already installed", + )); + } register_core(m) } @@ -474,7 +465,7 @@ fn register_core_with_custom_worker_selection_policy(m: &Bound<'_, PyModule>) -> #[cfg(feature = "custom-policy")] #[pymodule] fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { - register_core_with_custom_worker_selection_policy(m) + register_core_with_router_plugins(m) } /// The stock extension-module entrypoint. diff --git a/lib/bindings/python/rust/llm/entrypoint.rs b/lib/bindings/python/rust/llm/entrypoint.rs index f17608631db7..256f3b1e5ffc 100644 --- a/lib/bindings/python/rust/llm/entrypoint.rs +++ b/lib/bindings/python/rust/llm/entrypoint.rs @@ -1018,7 +1018,7 @@ pub fn run_input<'p>( let input_enum: Input = input.parse().map_err(to_pyerr)?; let frontend_route_extensions = super::frontend_routes::frontend_route_extensions_from_py(py, frontend_route_extensions)?; - let worker_selection_policy_factory = crate::worker_selection_policy_factory( + let plugins = crate::router_plugins( &engine_config .inner .local_model() @@ -1026,7 +1026,8 @@ pub fn run_input<'p>( .kv_router_config, ) .map_err(to_pyerr)?; - if worker_selection_policy_factory.is_some() + let has_router_plugin = !plugins.is_empty(); + if has_router_plugin && !engine_config .inner .local_model() @@ -1035,21 +1036,19 @@ pub fn run_input<'p>( .is_kv_routing() { return Err(PyValueError::new_err( - "linked worker-selection policies require --router-mode kv", + "linked router plugins require --router-mode kv", )); } - if worker_selection_policy_factory.is_some() && !matches!(&input_enum, Input::Http) { + if has_router_plugin && !matches!(&input_enum, Input::Http) { return Err(PyValueError::new_err( - "linked worker-selection policies require HTTP frontend input", + "linked router plugins require HTTP frontend input", )); } crate::future_into_py(py, async move { - if let Some(factory) = worker_selection_policy_factory { + if has_router_plugin { HttpFrontend::default() .frontend_route_extensions(frontend_route_extensions) - .worker_selection_policy_factory(move |config, worker_type, partition| { - factory(config, worker_type, partition) - }) + .plugins(plugins) .run(distributed_runtime.inner.clone(), engine_config.inner) .await .map_err(to_pyerr)?; diff --git a/lib/bindings/python/rust/llm/kv.rs b/lib/bindings/python/rust/llm/kv.rs index 3336d017dcbf..10602d3dc5f4 100644 --- a/lib/bindings/python/rust/llm/kv.rs +++ b/lib/bindings/python/rust/llm/kv.rs @@ -1,6 +1,8 @@ // SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 +#[cfg(feature = "select-service")] +use dynamo_kv_router::plugins::RouterPluginRegistry; use pythonize::{depythonize, pythonize}; use serde::Deserialize; use std::collections::HashMap; @@ -20,10 +22,10 @@ use crate::Endpoint; feature = "select-service" ))] use clap::Parser; -use dynamo_kv_router::WorkerSelectionPolicyFactory; #[cfg(feature = "select-service")] use dynamo_kv_router::config::try_kv_router_config_from_dynamo_env; use dynamo_kv_router::config::{KvRouterConfig, RouterConfigOverride}; +use dynamo_kv_router::plugins::RouterPlugins; use dynamo_kv_router::protocols::compute_block_hash_for_seq; use dynamo_kv_router::protocols::*; #[cfg(feature = "kv-indexer")] @@ -33,14 +35,12 @@ use dynamo_kv_router::services::selection::{ self, OverlapScoresRequest, PotentialLoadsRequest, ReservationRequest, SelectAndReserveRequest, SelectRequest, SelectionCacheConfig as RsSelectionCacheConfig, SelectionError, SelectionService as RustSelectionService, SelectionServiceBuilder, SelectionServiceConfig, - WorkerPatchRequest, WorkerRequest, WorkerSelectionPolicyRegistry, - warn_for_unserved_worker_selection_policies, + WorkerPatchRequest, WorkerRequest, warn_for_unserved_worker_selection_policies, }; #[cfg(feature = "slot-tracker")] use dynamo_kv_router::services::slot_tracker::{self, SlotTrackerConfig}; #[cfg(feature = "select-service")] use dynamo_kv_router::{TrackingHashAlgorithm, WorkerType}; -use llm_rs::kv_router::SelectionPolicySource; use rs::pipeline::{AsyncEngine, SingleIn}; use rs::protocols::annotated::Annotated as RsAnnotated; use tracing; @@ -519,7 +519,7 @@ where #[cfg(feature = "select-service")] pub(crate) fn run_select_service_cli( args: I, - policy_registry: WorkerSelectionPolicyRegistry, + policy_registry: RouterPluginRegistry, ) -> anyhow::Result<()> where I: IntoIterator, @@ -1796,7 +1796,7 @@ mod metric_worker_type_tests { Some(config), load_threshold_config, None, - None, + RouterPlugins::default(), ) .await .unwrap(); @@ -1910,7 +1910,7 @@ async fn create_kv_router_from_endpoint( kv_router_config: Option, load_threshold_config: RsLoadThresholdConfig, prefill_load_estimator: Option>, - worker_selection_policy_factory: Option, + plugins: RouterPlugins, ) -> anyhow::Result { // Create ModelManager and use it to create KvRouter (ensures registration) let model_manager = Arc::new(llm_rs::discovery::ModelManager::new()); @@ -1934,7 +1934,7 @@ async fn create_kv_router_from_endpoint( .as_ref() .map(|cfg| cfg.use_remote_indexer || cfg.serve_indexer) .unwrap_or(false); - let needs_policy_role = worker_selection_policy_factory.is_some(); + let needs_policy_role = plugins.worker_selection().is_some(); let (model_name, policy_model_name, enable_eagle, worker_role, policy_worker_role, load_source) = { let maybe_card = if needs_model_name || needs_policy_role { let wait_secs: u64 = std::env::var("DYN_ROUTER_MODEL_CARD_WAIT_SECS") @@ -2020,8 +2020,6 @@ async fn create_kv_router_from_endpoint( } } }; - #[cfg(not(feature = "custom-policy"))] - let _ = (policy_model_name, policy_worker_role); let load_context = llm_rs::kv_router::RoutingLoadContext::start( client.clone(), @@ -2032,34 +2030,31 @@ async fn create_kv_router_from_endpoint( ) .await?; - #[cfg(not(feature = "custom-policy"))] - let selection_policy = SelectionPolicySource::Registry; - #[cfg(feature = "custom-policy")] - let selection_policy = match worker_selection_policy_factory { - None => SelectionPolicySource::Registry, - // The policy sees the card's typed role and display name, which can - // differ from the metric role and the routing model name. - Some(factory) => { - let policy_worker_role = policy_worker_role - .expect("a configured worker-selection policy waits for a typed model card above"); - let policy_model_name = policy_model_name.unwrap_or_default(); - SelectionPolicySource::Factory(Arc::new(move |config, _worker_type, _partition| { - factory( - config, - policy_worker_role, - dynamo_kv_router::RoutingPartitionRef::new( - &policy_model_name, - dynamo_kv_router::DEFAULT_ROUTING_GROUP, - ), - ) - })) - } + // Preserve the model card's role and display name, which can differ + // from the metric role and the routing partition name. + let plugins = if let Some(factory) = plugins.worker_selection().cloned() { + let policy_worker_role = policy_worker_role + .expect("a configured worker-selection policy waits for a typed model card above"); + let policy_model_name = policy_model_name.unwrap_or_default(); + plugins.with_worker_selection(Arc::new(move |config, _worker_type, _partition| { + factory( + config, + policy_worker_role, + dynamo_kv_router::RoutingPartitionRef::new( + &policy_model_name, + dynamo_kv_router::DEFAULT_ROUTING_GROUP, + ), + ) + })) + } else { + plugins }; + let plugins = llm_rs::kv_router::plugins::RouterPluginBuilder::new(plugins); let kv_router = model_manager - .kv_chooser_for_with_policy_and_client( + .kv_chooser_for_with_plugins_and_client( client, block_size as u32, - selection_policy, + &plugins, kv_router_config, prefill_load_estimator, worker_role, @@ -2234,8 +2229,7 @@ impl KvRouter { let load_threshold_config = load_threshold_config .map(LoadThresholdConfig::as_rust) .unwrap_or_default(); - let worker_selection_policy_factory = - crate::worker_selection_policy_factory(&kv_router_config).map_err(to_pyerr)?; + let plugins = crate::router_plugins(&kv_router_config).map_err(to_pyerr)?; let prefill_load_estimator = aic_perf_config .map(|config| { Python::with_gil(|py| { @@ -2277,7 +2271,7 @@ impl KvRouter { Some(kv_router_config), load_threshold_config, prefill_load_estimator, - worker_selection_policy_factory, + plugins, ) .await .map_err(to_pyerr)?; diff --git a/lib/kv-router/src/lib.rs b/lib/kv-router/src/lib.rs index c3a9a92f19ec..2ce2cf9a14f9 100644 --- a/lib/kv-router/src/lib.rs +++ b/lib/kv-router/src/lib.rs @@ -6,8 +6,6 @@ //! This crate provides the core radix tree implementation and protocols for //! efficient KV cache lookup and routing in distributed LLM inference systems. -use std::sync::Arc; - mod active_set; pub(crate) mod cleanup; pub mod conditional_disagg; @@ -16,6 +14,7 @@ mod lookup_update; pub mod identity; pub mod indexer; pub mod kv_hints; +pub mod plugins; pub mod protocols; pub mod recovery; pub mod scheduling; @@ -77,10 +76,12 @@ pub use scheduling::{ KvSchedulerError, PotentialLoad, SchedulingRequest, SchedulingResponse, SessionContext, WorkerSelectionInputTrigger, WorkerSelectionPolicyError, }; -pub use selector::{ - DefaultWorkerSelector, ScoredWorkerCandidate, WorkerCacheInput, WorkerCandidate, WorkerFilter, - WorkerInputView, WorkerInputs, WorkerLoadInput, WorkerPicker, WorkerScorer, - WorkerSelectionContext, WorkerSelectionInput, WorkerSelectionPolicy, WorkerSelector, +pub use selector::{DefaultWorkerSelector, WorkerSelectionInput, WorkerSelector}; +// TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. +pub use plugins::worker_selection::{ + ScoredWorkerCandidate, WorkerCacheInput, WorkerCandidate, WorkerFilter, WorkerInputView, + WorkerInputs, WorkerLoadInput, WorkerPicker, WorkerScorer, WorkerSelectionContext, + WorkerSelectionPolicy, }; pub use session_prefix_index::{ LogicalNode, NodeId, SessionId, SessionPrefixIndexError, SessionPrefixIndexer, @@ -88,9 +89,5 @@ pub use session_prefix_index::{ pub use tracking_hash::{TrackingHashAlgorithm, TrackingHashContext, TrackingHashScope}; pub use worker_type::WorkerType; -/// Factory that creates one worker-selection policy per routing partition. -pub type WorkerSelectionPolicyFactory = Arc< - dyn for<'a> Fn(&KvRouterConfig, WorkerType, RoutingPartitionRef<'a>) -> WorkerSelectionPolicy - + Send - + Sync, ->; +// TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. +pub use plugins::worker_selection::WorkerSelectionPolicyFactory; diff --git a/lib/kv-router/src/plugins.rs b/lib/kv-router/src/plugins.rs new file mode 100644 index 000000000000..ecc205c80937 --- /dev/null +++ b/lib/kv-router/src/plugins.rs @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Public contracts, configuration, and registration for statically linked router plugins. +//! +//! Plugin authors implement [`worker_selection`] or [`request_classifier`] and register their +//! providers with [`RouterPluginRegistry`]. Signal accessors and callback signatures are unchanged. +//! Scheduling owns execution, eligibility, lifecycle synchronization, and capacity accounting. +//! +//! Legacy imports remain compatibility re-exports until v1.7; new plugins should use this module. + +mod registry; +pub mod request_classifier; +pub mod worker_selection; + +pub use registry::{ + DYN_ROUTER_DECODE_POLICY, DYN_ROUTER_PREFILL_POLICY, DYN_ROUTER_WORKER_SELECTION_POLICY, + RouterPluginRegistry, WorkerSelectionPolicyParameters, WorkerSelectionPolicyProvider, + WorkerSelectionPolicyProviderError, WorkerSelectionPolicyRegistry, + WorkerSelectionPolicyRegistryError, +}; + +use request_classifier::{RequestClassifierFactory, RequestClassifierRegistryError}; +use worker_selection::WorkerSelectionPolicyFactory; + +/// Configured factories shared across router construction, with fresh instances per router. +#[derive(Clone, Default)] +pub struct RouterPlugins { + worker_selection: Option, + request_classifier: Option, +} + +impl RouterPlugins { + pub fn with_worker_selection(mut self, factory: WorkerSelectionPolicyFactory) -> Self { + self.worker_selection = Some(factory); + self + } + + pub fn with_request_classifier(mut self, factory: RequestClassifierFactory) -> Self { + self.request_classifier = Some(factory); + self + } + + pub fn is_empty(&self) -> bool { + self.worker_selection.is_none() && self.request_classifier.is_none() + } + + pub fn worker_selection(&self) -> Option<&WorkerSelectionPolicyFactory> { + self.worker_selection.as_ref() + } + + pub fn request_classifier(&self) -> Option<&RequestClassifierFactory> { + self.request_classifier.as_ref() + } +} + +#[derive(Debug, thiserror::Error)] +pub enum RouterPluginRegistryError { + #[error(transparent)] + WorkerSelection(#[from] WorkerSelectionPolicyRegistryError), + #[error(transparent)] + RequestClassifier(#[from] RequestClassifierRegistryError), +} diff --git a/lib/kv-router/src/services/selection/policy_registry.rs b/lib/kv-router/src/plugins/registry.rs similarity index 79% rename from lib/kv-router/src/services/selection/policy_registry.rs rename to lib/kv-router/src/plugins/registry.rs index de36724f3ee0..5a48e7055bd8 100644 --- a/lib/kv-router/src/services/selection/policy_registry.rs +++ b/lib/kv-router/src/plugins/registry.rs @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -//! Startup registration for statically linked worker-selection policies. +//! Startup registration for statically linked router plugins. use std::collections::HashMap; use std::sync::Arc; @@ -9,14 +9,17 @@ use std::sync::Arc; use serde::de::DeserializeOwned; use thiserror::Error; -use crate::WorkerSelectionPolicyFactory; +use super::request_classifier::RequestClassifierRegistry; +use super::request_classifier::{ + RequestClassifierFactory, RequestClassifierProvider, RequestClassifierRegistryError, +}; +use super::worker_selection::{WorkerSelectionPolicy, WorkerSelectionPolicyFactory}; use crate::WorkerType; use crate::config::KvRouterConfig; use crate::scheduling::config::WorkerSelectionPolicySelections; pub use crate::scheduling::config::{ DYN_ROUTER_DECODE_POLICY, DYN_ROUTER_PREFILL_POLICY, DYN_ROUTER_WORKER_SELECTION_POLICY, }; -use crate::scheduling::selector::WorkerSelectionPolicy; /// Parses one policy instance's YAML parameters and creates its partition factory. pub type WorkerSelectionPolicyProvider = Arc< @@ -61,12 +64,17 @@ impl WorkerSelectionPolicyProviderError { } } -/// A startup-only registry of policy types linked into a custom Dynamo image. +/// A startup-only registry of worker-selection and request-classifier plugins linked into an image. #[derive(Clone, Default)] -pub struct WorkerSelectionPolicyRegistry { +pub struct RouterPluginRegistry { providers: HashMap, + request_classifiers: RequestClassifierRegistry, } +/// Existing catalogs can retain their worker-selection registration signature. +// TODO(v1.7): Remove this compatibility alias; use RouterPluginRegistry. +pub type WorkerSelectionPolicyRegistry = RouterPluginRegistry; + /// An error from policy registration or startup resolution. #[derive(Debug, Error)] pub enum WorkerSelectionPolicyRegistryError { @@ -90,14 +98,20 @@ pub enum WorkerSelectionPolicyRegistryError { }, } -impl WorkerSelectionPolicyRegistry { - /// Whether this image has no linked custom worker-selection policy types. - pub fn is_empty(&self) -> bool { - self.providers.is_empty() +impl RouterPluginRegistry { + /// Resolve every configured plugin once before constructing any routers. + pub fn resolve_plugins( + &self, + config: &KvRouterConfig, + ) -> Result { + Ok(super::RouterPlugins { + worker_selection: self.resolve(config)?, + request_classifier: self.resolve_request_classifier(config)?, + }) } - /// Register a policy type supplied by a linked policy crate. - pub fn register( + /// Register a worker-selection provider through the common plugin catalog. + pub fn register_worker_selection( &mut self, name: impl Into, provider: WorkerSelectionPolicyProvider, @@ -116,6 +130,38 @@ impl WorkerSelectionPolicyRegistry { Ok(()) } + /// Register a request-classifier type through the same catalog entry point as worker selection. + pub fn register_request_classifier( + &mut self, + name: impl Into, + provider: RequestClassifierProvider, + ) -> Result<(), RequestClassifierRegistryError> { + self.request_classifiers.register(name, provider) + } + + /// Resolve the configured request classifier once at frontend startup. + pub fn resolve_request_classifier( + &self, + config: &KvRouterConfig, + ) -> Result, RequestClassifierRegistryError> { + self.request_classifiers.resolve(config) + } + + /// Whether this image has no linked router plugin types. + pub fn is_empty(&self) -> bool { + self.providers.is_empty() && self.request_classifiers.is_empty() + } + + /// Compatibility entry point for worker-only catalogs. + // TODO(v1.7): Remove this compatibility method; use register_worker_selection. + pub fn register( + &mut self, + name: impl Into, + provider: WorkerSelectionPolicyProvider, + ) -> Result<(), WorkerSelectionPolicyRegistryError> { + self.register_worker_selection(name, provider) + } + /// Resolve the configured policy instances once at process startup. /// /// Aggregated, prefill, decode, and encode pools can select separate instances. The returned @@ -353,6 +399,57 @@ worker_selection: .clone() } + #[test] + fn classifier_only_catalog_resolves_through_common_bundle() { + struct PassThrough; + impl super::super::request_classifier::RequestClassifier for PassThrough {} + + let provider_calls = Arc::new(AtomicUsize::new(0)); + let mut registry = RouterPluginRegistry::default(); + assert!(registry.is_empty()); + registry + .register_request_classifier( + "test", + Arc::new({ + let provider_calls = provider_calls.clone(); + move |_| { + provider_calls.fetch_add(1, Ordering::Relaxed); + Ok(Arc::new(|_| Box::new(PassThrough))) + } + }), + ) + .unwrap(); + assert!(!registry.is_empty()); + let policy_file = tempfile::NamedTempFile::new().unwrap(); + std::fs::write(policy_file.path(), "request_classifier:\n type: test\n").unwrap(); + let config = KvRouterConfig { + router_policy_config: Some(policy_file.path().display().to_string()), + ..Default::default() + }; + let plugins = registry.resolve_plugins(&config).unwrap(); + assert!(!plugins.is_empty()); + assert!(plugins.worker_selection().is_none()); + let _first = plugins.request_classifier().unwrap()( + crate::plugins::request_classifier::RequestClassifierContext::new(16, Vec::new), + ); + let _second = plugins.clone().request_classifier().unwrap()( + crate::plugins::request_classifier::RequestClassifierContext::new(16, Vec::new), + ); + assert_eq!(provider_calls.load(Ordering::Relaxed), 1); + assert!( + RouterPluginRegistry::default() + .resolve_plugins(&KvRouterConfig::default()) + .unwrap() + .is_empty() + ); + assert!(matches!( + RouterPluginRegistry::default().resolve_plugins(&config), + Err(super::super::RouterPluginRegistryError::RequestClassifier( + RequestClassifierRegistryError::UnknownType { .. } + )) + )); + } + #[test] fn resolves_builtin_default_and_multiple_custom_instances() { let mut registry = WorkerSelectionPolicyRegistry::default(); diff --git a/lib/kv-router/src/plugins/request_classifier.rs b/lib/kv-router/src/plugins/request_classifier.rs new file mode 100644 index 000000000000..3e10ee3dee1c --- /dev/null +++ b/lib/kv-router/src/plugins/request_classifier.rs @@ -0,0 +1,256 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Public request-classifier contract and startup configuration. + +mod config; +mod inputs; +mod progress; +mod registry; +pub use inputs::{RequestClassifierContext, RequestClassifierWorker}; +pub use progress::{RequestProgress, RequestProgressUpdater}; + +pub(crate) use config::RawRequestClassifierConfig; +pub use config::RequestClassifierConfig; +pub(crate) use registry::RequestClassifierRegistry; +pub use registry::{ + RequestClassifierFactory, RequestClassifierParameters, RequestClassifierProvider, + RequestClassifierProviderError, RequestClassifierRegistryError, +}; + +use std::error::Error; +use std::future::Future; +use std::pin::Pin; +use std::sync::Arc; + +use async_trait::async_trait; +use tokio::time::Instant; + +use crate::protocols::{WorkerAffinityTarget, WorkerWithDpRank}; +use crate::scheduling::{SessionContext, policy_queue::QueueSnapshot}; + +#[derive(Debug)] +pub struct ClassifyRequest { + pub(crate) classification_id: u64, + request_id: Option, + policy_class: Option, + pub(crate) overrides: ClassificationOverrides, + ingress_at: Instant, + input_tokens: usize, + initial_cached_tokens: usize, + pub(crate) progress: RequestProgress, + session_context: Option, +} + +#[derive(Clone, Debug, Default)] +pub(crate) struct ClassificationOverrides { + pub(crate) policy_class: Option, + pub(crate) due_at: Option, + pub(crate) scheduling_cost_tokens: Option, + pub(crate) worker_selection_target: Option>, +} + +impl ClassifyRequest { + #[cfg(test)] + pub(crate) fn new(input_tokens: usize, initial_cached_tokens: usize) -> Self { + Self::with_timing(input_tokens, initial_cached_tokens, Instant::now()) + } + + pub(crate) fn with_timing( + input_tokens: usize, + initial_cached_tokens: usize, + ingress_at: Instant, + ) -> Self { + Self { + classification_id: 0, + request_id: None, + policy_class: None, + overrides: ClassificationOverrides::default(), + ingress_at, + input_tokens, + initial_cached_tokens, + progress: RequestProgress::new(input_tokens).0, + session_context: None, + } + } + + pub(crate) fn with_request_id(mut self, request_id: impl Into) -> Self { + self.request_id = Some(request_id.into()); + self + } + + pub(crate) fn with_initial_policy_class(mut self, policy_class: impl Into) -> Self { + self.policy_class = Some(policy_class.into()); + self + } + + pub(crate) fn with_session_context(mut self, session_context: SessionContext) -> Self { + self.session_context = Some(session_context); + self + } + + pub fn request_id(&self) -> Option<&str> { + self.request_id.as_deref() + } + + pub fn policy_class(&self) -> Option<&str> { + self.overrides + .policy_class + .as_deref() + .or(self.policy_class.as_deref()) + } + + pub fn set_policy_class(&mut self, policy_class: impl Into) { + self.overrides.policy_class = Some(policy_class.into()); + } + + pub fn input_tokens(&self) -> usize { + self.input_tokens + } + + /// Live context high-water mark, initialized from `input_tokens()` and raised + /// by host observations of prompt plus generated tokens. This is not physical + /// KV occupancy. The host alone updates this request's counter. + pub fn progress(&self) -> &RequestProgress { + &self.progress + } + + /// Return the original router ingress time on the monotonic clock. + pub fn ingress_at(&self) -> Instant { + self.ingress_at + } + + pub fn due_at(&self) -> Option { + self.overrides.due_at + } + + pub fn set_due_at(&mut self, due_at: Instant) { + self.overrides.due_at = Some(due_at); + } + + pub fn scheduling_cost_tokens(&self) -> usize { + self.overrides.scheduling_cost_tokens.unwrap_or_else(|| { + QueueSnapshot::new(self.input_tokens, self.initial_cached_tokens).scheduling_cost_tokens + }) + } + + pub fn set_scheduling_cost_tokens(&mut self, scheduling_cost_tokens: usize) { + self.overrides.scheduling_cost_tokens = Some(scheduling_cost_tokens); + } + + /// Prefer a worker/rank for this request, replacing its soft affinity target. + /// Hard pins and caller eligibility constraints remain authoritative. A custom + /// selector can fall back if the target is ineligible; `Sent` reports the result. + pub fn set_worker_selection_target(&mut self, worker: WorkerWithDpRank) { + self.overrides.worker_selection_target = Some(Some(worker.into())); + } + + /// Clear this request's soft affinity preference without changing hard pins. + pub fn clear_worker_selection_target(&mut self) { + self.overrides.worker_selection_target = Some(None); + } + + pub fn session_context(&self) -> Option<&SessionContext> { + self.session_context.as_ref() + } + + /// Only the explicit overrides feed the queue: cache eligibility is + /// recomputed from the current workers at enqueue, because worker state + /// may have changed while the classification was pending. + pub(crate) fn into_queue_inputs(self) -> ClassificationOverrides { + self.overrides + } +} + +/// Error returned by [`RequestClassifier::classify`]. +pub type ClassifierError = dyn Error + Send + Sync + 'static; + +/// Cause delivered to the classifier when a request aborts. Produced by the +/// router or the worker path, not by the classifier. +pub type AbortCause = dyn Error + Send + Sync + 'static; + +/// Request lifecycle events, delivered to [`RequestClassifier::on_event`] one +/// at a time in lifecycle order. A terminal event can arrive without a prior +/// `Sent`: an attempt that recorded a worker via selection but was never +/// dispatched still ends with `Completed`. +/// +/// Delivery is asynchronous, but a re-registered request id is not classified +/// until the previous lifecycle's terminal event has been delivered, so a +/// plugin keying state by request id observes each lifecycle's `classify` and +/// events in order and never receives a stale terminal event after the id's +/// next `classify`. +#[derive(Debug)] +#[non_exhaustive] +pub enum ClassifyEvent { + Sent { + request_id: String, + worker: WorkerWithDpRank, + }, + Responding { + request_id: String, + worker: WorkerWithDpRank, + }, + Completed { + request_id: String, + worker: WorkerWithDpRank, + context_tokens: Option, + }, + Aborted { + request_id: String, + worker: Option, + error: Option>, + }, +} + +/// An independently pollable classifier invocation. See [`RequestClassifier`] +/// for why this is a `'static` future rather than `async fn`. +pub type ClassifyFuture = + Pin>> + Send + 'static>>; + +/// User-provided request classifier. +/// +/// [`Self::classify`] deliberately avoids `async fn` and returns a `'static` +/// future which the router polls on its own runtime, so a classifier may +/// await, sleep, or park a request without blocking a thread and without +/// standing up a runtime of its own. `async fn` cannot express this: its +/// future borrows `&mut self` for the whole pending wait, which would hold the +/// router-wide classifier lock and block every other request and every event. +/// +/// Because the returned future is `'static`, state it touches must be owned or +/// shared rather than borrowed from `self`: +/// +/// ```ignore +/// struct Pauser { +/// state: Arc>, +/// } +/// +/// impl RequestClassifier for Pauser { +/// fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { +/// // Clone the handle into the future; `self` cannot be borrowed. +/// let state = Arc::clone(&self.state); +/// Box::pin(async move { +/// state.lock().await.wait_for_slot().await; +/// Ok(request) +/// }) +/// } +/// } +/// ``` +/// +/// `classify`'s synchronous prologue runs under the router-wide classifier +/// lock: build the future and return promptly, then wait inside it. Blocking +/// before the future is returned stalls classification and event delivery. +/// +/// [`Self::on_event`] is `async fn`. A dedicated router task delivers events +/// one at a time in lifecycle order and awaits each callback, so `on_event` +/// may await freely. A pending `classify` future never blocks delivery, but a +/// slow `on_event` delays classification of new requests because both share +/// the classifier lock. Terminal events arrive asynchronously, shortly after +/// the request ends; events still queued at router shutdown are dropped. +#[async_trait] +pub trait RequestClassifier: Send + 'static { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + Box::pin(async move { Ok(request) }) + } + + async fn on_event(&mut self, _event: ClassifyEvent) {} +} diff --git a/lib/kv-router/src/plugins/request_classifier/config.rs b/lib/kv-router/src/plugins/request_classifier/config.rs new file mode 100644 index 000000000000..badc8e3918f3 --- /dev/null +++ b/lib/kv-router/src/plugins/request_classifier/config.rs @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! YAML schema for one process-wide request-classifier plugin. + +use serde::Deserialize; + +use crate::scheduling::policy_config::{RouterPolicyConfigError, validate_identifier}; + +/// Startup selection and plugin-owned parameters for one request-classifier type. +#[derive(Debug, Clone, PartialEq)] +pub struct RequestClassifierConfig { + classifier_type: String, + parameters: serde_yaml::Value, +} + +impl RequestClassifierConfig { + /// The classifier type registered by a linked plugin crate. + pub fn classifier_type(&self) -> &str { + &self.classifier_type + } + + /// YAML parameters owned and validated by the linked plugin crate. + pub fn parameters(&self) -> &serde_yaml::Value { + &self.parameters + } +} + +#[derive(Debug, Deserialize)] +#[serde(deny_unknown_fields)] +pub(crate) struct RawRequestClassifierConfig { + #[serde(rename = "type")] + classifier_type: String, + #[serde(default = "empty_parameters")] + parameters: serde_yaml::Value, +} + +impl RawRequestClassifierConfig { + pub(crate) fn resolve(self) -> Result { + validate_identifier( + &self.classifier_type, + "classifier type", + "request_classifier", + )?; + if self.classifier_type == "default" { + return Err(RouterPolicyConfigError::Validation( + "request_classifier type 'default' is reserved; omit request_classifier to use Dynamo's pass-through classifier" + .to_string(), + )); + } + if !matches!(self.parameters, serde_yaml::Value::Mapping(_)) { + return Err(RouterPolicyConfigError::Validation( + "request_classifier parameters must be a YAML mapping".to_string(), + )); + } + Ok(RequestClassifierConfig { + classifier_type: self.classifier_type, + parameters: self.parameters, + }) + } +} + +fn empty_parameters() -> serde_yaml::Value { + serde_yaml::Value::Mapping(Default::default()) +} diff --git a/lib/kv-router/src/scheduling/request_classifier/inputs.rs b/lib/kv-router/src/plugins/request_classifier/inputs.rs similarity index 100% rename from lib/kv-router/src/scheduling/request_classifier/inputs.rs rename to lib/kv-router/src/plugins/request_classifier/inputs.rs diff --git a/lib/kv-router/src/plugins/request_classifier/progress.rs b/lib/kv-router/src/plugins/request_classifier/progress.rs new file mode 100644 index 000000000000..688fd365e10b --- /dev/null +++ b/lib/kv-router/src/plugins/request_classifier/progress.rs @@ -0,0 +1,59 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::sync::Arc; +use std::sync::atomic::{AtomicUsize, Ordering}; + +/// Lock-free access to the latest logical context observed for one request. +#[derive(Debug, Clone)] +pub struct RequestProgress { + context_tokens: Arc, +} + +/// Write capability paired with [`RequestProgress`]. +/// +/// Updates are monotonic so concurrent or delayed observations cannot move a +/// request's logical context backwards. +#[derive(Debug, Clone)] +pub struct RequestProgressUpdater { + context_tokens: Arc, +} + +impl RequestProgress { + pub fn new(initial_context_tokens: usize) -> (Self, RequestProgressUpdater) { + let context_tokens = Arc::new(AtomicUsize::new(initial_context_tokens)); + ( + Self { + context_tokens: Arc::clone(&context_tokens), + }, + RequestProgressUpdater { context_tokens }, + ) + } + + #[inline] + pub fn context_tokens(&self) -> usize { + self.context_tokens.load(Ordering::Relaxed) + } +} + +impl RequestProgressUpdater { + #[inline] + pub fn update_context_tokens(&self, context_tokens: usize) { + self.context_tokens + .fetch_max(context_tokens, Ordering::Relaxed); + } +} +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn request_progress_is_monotonic() { + let (progress, updater) = RequestProgress::new(42); + + updater.update_context_tokens(55); + updater.update_context_tokens(50); + + assert_eq!(progress.context_tokens(), 55); + } +} diff --git a/lib/kv-router/src/plugins/request_classifier/registry.rs b/lib/kv-router/src/plugins/request_classifier/registry.rs new file mode 100644 index 000000000000..4af8f48d3e6e --- /dev/null +++ b/lib/kv-router/src/plugins/request_classifier/registry.rs @@ -0,0 +1,242 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Startup registration for statically linked request-classifier plugins. + +use std::collections::HashMap; +use std::sync::Arc; + +use serde::de::DeserializeOwned; +use thiserror::Error; + +use super::{RequestClassifier, RequestClassifierContext}; +use crate::config::KvRouterConfig; + +/// Creates one classifier per routed model during router construction, not per request. +pub type RequestClassifierFactory = + Arc Box + Send + Sync>; + +/// Validates plugin-owned YAML parameters once and returns a per-router factory. +pub type RequestClassifierProvider = Arc< + dyn Fn( + &RequestClassifierParameters, + ) -> Result + + Send + + Sync, +>; + +/// YAML parameters passed to a linked request-classifier provider. +#[derive(Debug, Clone)] +pub struct RequestClassifierParameters(serde_yaml::Value); + +impl RequestClassifierParameters { + /// Deserialize the parameter mapping into the plugin's own configuration type. + pub fn deserialize(&self) -> Result { + serde_yaml::from_value(self.0.clone()) + .map_err(|source| RequestClassifierProviderError::new(source.to_string())) + } +} + +/// A plugin-owned parameter validation failure reported during startup. +#[derive(Debug, Error)] +#[error("{message}")] +pub struct RequestClassifierProviderError { + message: String, +} + +impl RequestClassifierProviderError { + /// Construct an error suitable for user-facing startup diagnostics. + pub fn new(message: impl Into) -> Self { + Self { + message: message.into(), + } + } +} + +#[derive(Clone, Default)] +pub(crate) struct RequestClassifierRegistry { + providers: HashMap, +} + +/// An error from classifier registration or startup resolution. +#[derive(Debug, Error)] +pub enum RequestClassifierRegistryError { + #[error("request-classifier type must not be empty")] + EmptyName, + #[error("request-classifier type 'default' is reserved for Dynamo's pass-through behavior")] + ReservedDefault, + #[error("request-classifier type {name:?} is already registered")] + Duplicate { name: String }, + #[error("could not load request_classifier from router_policy_config: {source}")] + Config { + #[source] + source: crate::scheduling::RouterPolicyConfigError, + }, + #[error("unknown request-classifier type {name:?}; linked classifier types: {available}")] + UnknownType { name: String, available: String }, + #[error("invalid parameters for request-classifier type {classifier_type:?}: {source}")] + Provider { + classifier_type: String, + #[source] + source: RequestClassifierProviderError, + }, +} + +impl RequestClassifierRegistry { + pub fn is_empty(&self) -> bool { + self.providers.is_empty() + } + + pub fn register( + &mut self, + name: impl Into, + provider: RequestClassifierProvider, + ) -> Result<(), RequestClassifierRegistryError> { + let name = name.into(); + if name.is_empty() { + return Err(RequestClassifierRegistryError::EmptyName); + } + if name == "default" { + return Err(RequestClassifierRegistryError::ReservedDefault); + } + if self.providers.contains_key(&name) { + return Err(RequestClassifierRegistryError::Duplicate { name }); + } + self.providers.insert(name, provider); + Ok(()) + } + + pub fn resolve( + &self, + config: &KvRouterConfig, + ) -> Result, RequestClassifierRegistryError> { + let Some(classifier) = config + .request_classifier_config() + .map_err(|source| RequestClassifierRegistryError::Config { source })? + else { + return Ok(None); + }; + let classifier_type = classifier.classifier_type(); + let provider = self.providers.get(classifier_type).ok_or_else(|| { + RequestClassifierRegistryError::UnknownType { + name: classifier_type.to_owned(), + available: self.available_classifier_types(), + } + })?; + provider(&RequestClassifierParameters( + classifier.parameters().clone(), + )) + .map(Some) + .map_err(|source| RequestClassifierRegistryError::Provider { + classifier_type: classifier_type.to_owned(), + source, + }) + } + + fn available_classifier_types(&self) -> String { + let mut available = self.providers.keys().cloned().collect::>(); + available.sort_unstable(); + if available.is_empty() { + "".to_owned() + } else { + available.join(", ") + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::plugins::request_classifier::RequestClassifier; + + #[derive(serde::Deserialize)] + #[serde(deny_unknown_fields)] + struct Parameters { + limit: usize, + } + + struct PassThrough; + + impl RequestClassifier for PassThrough {} + + fn provider( + parameters: &RequestClassifierParameters, + ) -> Result { + let parameters: Parameters = parameters.deserialize()?; + if parameters.limit == 0 { + return Err(RequestClassifierProviderError::new( + "limit must be greater than zero", + )); + } + Ok(Arc::new(|_| Box::new(PassThrough))) + } + + fn config(yaml: &str) -> (tempfile::NamedTempFile, KvRouterConfig) { + let policy = tempfile::NamedTempFile::new().unwrap(); + std::fs::write(policy.path(), yaml).unwrap(); + let config = KvRouterConfig { + router_policy_config: Some(policy.path().display().to_string()), + ..Default::default() + }; + (policy, config) + } + + const VALID_CONFIG: &str = r#" +request_classifier: + type: test + parameters: + limit: 4 +"#; + + #[test] + fn resolves_linked_classifier_and_validates_parameters() { + let mut registry = RequestClassifierRegistry::default(); + registry.register("test", Arc::new(provider)).unwrap(); + let (_policy, valid_config) = config(VALID_CONFIG); + let factory = registry.resolve(&valid_config).unwrap().unwrap(); + let classifier = factory(RequestClassifierContext::new(16, Vec::new)); + let _: Box = classifier; + + let (_policy, invalid) = config( + r#" +request_classifier: + type: test + parameters: + limit: 0 +"#, + ); + assert!(matches!( + registry.resolve(&invalid), + Err(RequestClassifierRegistryError::Provider { + classifier_type, + .. + }) if classifier_type == "test" + )); + } + + #[test] + fn rejects_duplicate_reserved_and_unknown_types() { + let provider: RequestClassifierProvider = Arc::new(provider); + let mut registry = RequestClassifierRegistry::default(); + assert!(matches!( + registry.register("", provider.clone()), + Err(RequestClassifierRegistryError::EmptyName) + )); + assert!(matches!( + registry.register("default", provider.clone()), + Err(RequestClassifierRegistryError::ReservedDefault) + )); + registry.register("test", provider.clone()).unwrap(); + assert!(matches!( + registry.register("test", provider), + Err(RequestClassifierRegistryError::Duplicate { .. }) + )); + + let (_policy, config) = config(VALID_CONFIG); + let empty = RequestClassifierRegistry::default(); + assert!(matches!( + empty.resolve(&config), + Err(RequestClassifierRegistryError::UnknownType { name, .. }) if name == "test" + )); + } +} diff --git a/lib/kv-router/src/plugins/worker_selection.rs b/lib/kv-router/src/plugins/worker_selection.rs new file mode 100644 index 000000000000..b16c5db7cb1e --- /dev/null +++ b/lib/kv-router/src/plugins/worker_selection.rs @@ -0,0 +1,353 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Public filter, scorer, and picker contracts and their input signals. + +mod config; + +pub use super::registry::{ + WorkerSelectionPolicyParameters, WorkerSelectionPolicyProvider, + WorkerSelectionPolicyProviderError, WorkerSelectionPolicyRegistryError, +}; +pub use crate::scheduling::selector::WorkerSelectionPolicy; +pub use crate::scheduling::{ + SessionContext, WorkerSelectionInputTrigger, WorkerSelectionPolicyError, +}; +pub(crate) use config::RawWorkerSelectionConfig; +pub use config::{WorkerSelectionConfig, WorkerSelectionInstance}; + +use std::ops::BitOr; +use std::sync::Arc; + +use crate::protocols::{WorkerAffinityTarget, WorkerWithDpRank}; +use crate::scheduling::SchedulingRequest; +use crate::scheduling::selector::LogitWeights; +use crate::{KvRouterConfig, RoutingPartitionRef, WorkerType}; + +/// Factory that creates one worker-selection policy per routing partition. +pub type WorkerSelectionPolicyFactory = Arc< + dyn for<'a> Fn(&KvRouterConfig, WorkerType, RoutingPartitionRef<'a>) -> WorkerSelectionPolicy + + Send + + Sync, +>; + +/// Request-level values available to custom filters, scorers, and pickers. +pub struct WorkerSelectionContext<'a> { + pub(crate) request: &'a SchedulingRequest, + pub(crate) request_id: &'a str, + pub(crate) request_blocks: u64, + pub(crate) block_size: u32, + pub(crate) track_prefill_tokens: bool, + pub(crate) weights: LogitWeights, + pub(crate) router_temperature_override: Option, +} + +/// One eligible worker and the optional inputs requested by a filter or scorer. +pub struct WorkerCandidate { + pub(crate) worker: WorkerWithDpRank, + pub(crate) inputs: WorkerInputs, + pub(crate) cache: WorkerCacheInput, + pub(crate) load: WorkerLoadInput, + pub(crate) preferred_taint_multiplier: Option, +} + +/// One eligible worker and its total cost after all scorers run. +#[derive(Clone, Copy)] +pub struct ScoredWorkerCandidate { + pub(crate) worker: WorkerWithDpRank, + pub(crate) cost: f64, + pub(crate) preferred_taint_multiplier: Option, +} + +/// Optional worker-signal groups requested by scorers and pickers. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub struct WorkerInputs(u8); + +impl WorkerInputs { + /// Request no optional worker inputs. + pub const NONE: Self = Self(0); + /// Request KV-cache overlap inputs. + pub const CACHE: Self = Self(1 << 0); + /// Request active-load inputs. + pub const LOAD: Self = Self(1 << 1); + /// Request preferred-taint routing metadata. + pub const PREFERRED_TAINT: Self = Self(1 << 2); + /// Request host-owned active-request counts. + pub const OCCUPANCY: Self = Self(1 << 5); + pub(crate) const ALL: Self = Self(Self::CACHE.0 | Self::LOAD.0 | Self::PREFERRED_TAINT.0); + + pub const fn contains(self, other: Self) -> bool { + self.0 & other.0 == other.0 + } + + pub(crate) fn without(self, other: Self) -> Self { + Self(self.0 & !other.0) + } +} + +impl BitOr for WorkerInputs { + type Output = Self; + + fn bitor(self, rhs: Self) -> Self::Output { + Self(self.0 | rhs.0) + } +} + +/// KV-cache overlap values for one worker. +#[derive(Clone, Copy, Default)] +pub struct WorkerCacheInput { + pub(crate) effective_overlap_blocks: f64, + pub(crate) device_overlap_blocks: f64, + pub(crate) host_overlap_blocks: f64, + pub(crate) disk_overlap_blocks: f64, + pub(crate) shared_beyond_device_blocks: u32, +} + +/// Active-load values for one worker. +#[derive(Clone, Copy, Default)] +pub struct WorkerLoadInput { + pub(crate) raw_prefill_blocks: f64, + pub(crate) active_prefill_tokens: usize, + pub(crate) decode_cost_blocks: f64, + pub(crate) active_requests: usize, +} + +/// Borrowed, index-aligned view of one custom picker's requested worker inputs. +#[derive(Clone, Copy)] +pub struct WorkerInputView<'a> { + pub(crate) candidates: &'a [ScoredWorkerCandidate], + pub(crate) cache: Option<&'a [WorkerCacheInput]>, + pub(crate) load: Option<&'a [WorkerLoadInput]>, +} + +/// Adds one finite cost contribution to each eligible worker. +pub trait WorkerScorer: Send { + /// Declare the worker-signal groups needed by this scorer. + fn required_worker_inputs(&self) -> WorkerInputs { + WorkerInputs::NONE + } + + /// Return one finite, lower-is-better cost contribution for an eligible worker row. + fn score( + &mut self, + context: &WorkerSelectionContext<'_>, + candidate: &WorkerCandidate, + ) -> Result; +} + +/// Filters run in declaration order for each candidate. Callback order across different +/// candidates and scorers is unspecified; implementations must not depend on filters and scorers +/// being interleaved. +pub trait WorkerFilter: Send { + /// Declare the worker-signal groups needed by this filter. + fn required_worker_inputs(&self) -> WorkerInputs { + WorkerInputs::NONE + } + + /// Return `true` to keep an eligible worker in the policy candidate set. + fn keep( + &mut self, + context: &WorkerSelectionContext<'_>, + candidate: &WorkerCandidate, + ) -> Result; +} + +/// Selects one row after all filters and scorers run. +pub trait WorkerPicker: Send { + /// Declare the optional worker-signal columns needed by this picker. + fn required_worker_inputs(&self) -> WorkerInputs { + WorkerInputs::NONE + } + + /// Return one row index from the host-owned eligible candidate table. Row order is + /// unspecified; inspect candidate data instead of relying on a stable position. + fn pick( + &mut self, + context: &WorkerSelectionContext<'_>, + input: WorkerInputView<'_>, + ) -> Result; +} + +impl WorkerSelectionContext<'_> { + /// Return the incoming prompt size in KV blocks. + pub fn request_blocks(&self) -> u64 { + self.request_blocks + } + + /// Return the number of tokens in one KV block. + pub fn block_size(&self) -> u32 { + self.block_size + } + + /// Return whether this request contributes to prefill-load tracking. + pub fn tracks_prefill_tokens(&self) -> bool { + self.track_prefill_tokens + } + + /// Return the session metadata available to worker selection. + pub fn session_context(&self) -> Option<&SessionContext> { + self.request.session_context.as_ref() + } + + /// Return the session-affinity target resolved by the request host. + /// + /// The default selector treats an eligible target as exclusive. Custom policies receive it as + /// advisory context; it may be absent from their candidate set when unavailable or filtered. + pub fn affinity_target(&self) -> Option { + self.request.affinity_target + } + + /// Return the expected output length, if the request supplies one. + pub fn expected_output_tokens(&self) -> Option { + self.request.expected_output_tokens + } + + /// Return the request's scheduler priority boost. + pub fn priority_jump(&self) -> f64 { + self.request.priority_jump + } + + /// Return the request's strict integer priority. + pub fn strict_priority(&self) -> u32 { + self.request.strict_priority + } + + /// Return the request-level router temperature override, if present. + pub fn router_temperature_override(&self) -> Option { + self.router_temperature_override + } +} + +impl WorkerCandidate { + /// Return this candidate's worker ID and data-parallel rank. + pub fn worker(&self) -> WorkerWithDpRank { + self.worker + } + + /// Return KV-cache inputs when the component requested [`WorkerInputs::CACHE`]. + pub fn cache(&self) -> Option<&WorkerCacheInput> { + self.inputs + .contains(WorkerInputs::CACHE) + .then_some(&self.cache) + } + + /// Return active-load inputs when the component requested [`WorkerInputs::LOAD`]. + pub fn load(&self) -> Option<&WorkerLoadInput> { + self.inputs + .contains(WorkerInputs::LOAD) + .then_some(&self.load) + } + + /// Return the optional cost multiplier from preferred routing constraints when the component + /// requested [`WorkerInputs::PREFERRED_TAINT`]. + /// + /// Required routing constraints are enforced by host eligibility. This preferred value is + /// ordinary candidate metadata and is only materialized for components that declare the + /// capability. + pub fn preferred_taint_multiplier(&self) -> Option { + self.preferred_taint_multiplier + } + + pub(crate) fn with_inputs_from(&self, additional: &Self, inputs: WorkerInputs) -> Self { + debug_assert_eq!(self.worker, additional.worker); + Self { + worker: self.worker, + inputs, + cache: if inputs.contains(WorkerInputs::CACHE) { + if self.inputs.contains(WorkerInputs::CACHE) { + self.cache + } else { + additional.cache + } + } else { + WorkerCacheInput::default() + }, + load: if inputs.contains(WorkerInputs::LOAD) { + if self.inputs.contains(WorkerInputs::LOAD) { + self.load + } else { + additional.load + } + } else { + WorkerLoadInput::default() + }, + preferred_taint_multiplier: self + .preferred_taint_multiplier + .or(additional.preferred_taint_multiplier), + } + } +} + +impl ScoredWorkerCandidate { + /// Return this candidate's worker ID and data-parallel rank. + pub fn worker(&self) -> WorkerWithDpRank { + self.worker + } + + /// Return the sum of all scorer contributions for this candidate. + pub fn cost(&self) -> f64 { + self.cost + } + + /// Return the optional cost multiplier from preferred routing constraints when the picker + /// requested [`WorkerInputs::PREFERRED_TAINT`]. + pub fn preferred_taint_multiplier(&self) -> Option { + self.preferred_taint_multiplier + } +} + +impl WorkerCacheInput { + /// Return device-resident prefix overlap in KV blocks. + pub fn device_overlap_blocks(&self) -> f64 { + self.device_overlap_blocks + } + + /// Return host-pinned prefix overlap in KV blocks. + pub fn host_overlap_blocks(&self) -> f64 { + self.host_overlap_blocks + } + + /// Return disk prefix overlap in KV blocks. + pub fn disk_overlap_blocks(&self) -> f64 { + self.disk_overlap_blocks + } + + /// Return shared-cache hits beyond the device-resident prefix. + pub fn shared_beyond_device_blocks(&self) -> u32 { + self.shared_beyond_device_blocks + } +} + +impl WorkerLoadInput { + /// Return the tokens active in this worker's prefill stage. + pub fn active_prefill_tokens(&self) -> usize { + self.active_prefill_tokens + } + + /// Return the projected active decode footprint in KV blocks. + pub fn decode_cost_blocks(&self) -> f64 { + self.decode_cost_blocks + } + + /// Return this worker's active request count. + pub fn active_requests(&self) -> usize { + self.active_requests + } +} + +impl<'a> WorkerInputView<'a> { + /// Return the eligible candidates and their total costs. + pub fn candidates(self) -> &'a [ScoredWorkerCandidate] { + self.candidates + } + + /// Return index-aligned KV-cache inputs when the picker requested them. + pub fn cache(self) -> Option<&'a [WorkerCacheInput]> { + self.cache + } + + /// Return index-aligned active-load inputs when the picker requested them. + pub fn load(self) -> Option<&'a [WorkerLoadInput]> { + self.load + } +} diff --git a/lib/kv-router/src/scheduling/worker_selection_config.rs b/lib/kv-router/src/plugins/worker_selection/config.rs similarity index 96% rename from lib/kv-router/src/scheduling/worker_selection_config.rs rename to lib/kv-router/src/plugins/worker_selection/config.rs index e812b6e07c0f..a5b6b83f85df 100644 --- a/lib/kv-router/src/scheduling/worker_selection_config.rs +++ b/lib/kv-router/src/plugins/worker_selection/config.rs @@ -7,7 +7,7 @@ use std::collections::HashMap; use serde::Deserialize; -use super::policy_config::{RouterPolicyConfigError, validate_identifier}; +use crate::scheduling::policy_config::{RouterPolicyConfigError, validate_identifier}; /// Process-wide configuration for worker selection in a custom Dynamo image. #[derive(Debug, Clone, PartialEq)] @@ -71,7 +71,7 @@ impl WorkerSelectionInstance { #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] -pub(super) struct RawWorkerSelectionConfig { +pub(crate) struct RawWorkerSelectionConfig { aggregated: Option, prefill: Option, decode: Option, @@ -81,7 +81,7 @@ pub(super) struct RawWorkerSelectionConfig { } impl RawWorkerSelectionConfig { - pub(super) fn resolve(self) -> Result { + pub(crate) fn resolve(self) -> Result { if self.instances.is_empty() && self.aggregated.is_none() && self.prefill.is_none() diff --git a/lib/kv-router/src/scheduling/config.rs b/lib/kv-router/src/scheduling/config.rs index 6de8e3494749..4bc3e3c75043 100644 --- a/lib/kv-router/src/scheduling/config.rs +++ b/lib/kv-router/src/scheduling/config.rs @@ -1204,6 +1204,18 @@ impl KvRouterConfig { .and_then(super::policy_config::RouterPolicyConfig::worker_selection)) } + /// Return the custom request-classifier configuration from `router_policy_config`, if any. + pub fn request_classifier_config( + &self, + ) -> Result< + Option<&super::policy_config::RequestClassifierConfig>, + super::policy_config::RouterPolicyConfigError, + > { + Ok(self + .loaded_policy_config()? + .and_then(super::policy_config::RouterPolicyConfig::request_classifier)) + } + /// Return one configured custom worker-selection instance, if any. /// /// `DYN_ROUTER_WORKER_SELECTION_POLICY` overrides the role-specific YAML selections. The diff --git a/lib/kv-router/src/scheduling/local.rs b/lib/kv-router/src/scheduling/local.rs index 2fa8a63c40e0..b850f9879374 100644 --- a/lib/kv-router/src/scheduling/local.rs +++ b/lib/kv-router/src/scheduling/local.rs @@ -20,9 +20,7 @@ use super::queue::{ BookingHandle, ClassQueueStats, SchedulerBookingCleanup, SchedulerBookingDescriptor, SchedulerQueue, }; -use super::request_classifier::{ - ClassifyRequest, RequestClassifier, RequestClassifierRuntime, RequestLifecycle, -}; +use super::request_classifier::{RequestClassifierRuntime, RequestLifecycle}; use super::selector::{DefaultWorkerSelector, WorkerSelector}; use super::types::{ AdmissionAttempt, AdmittedSchedulingResponse, AdvisorySchedulingResponse, AttemptId, @@ -30,6 +28,7 @@ use super::types::{ ScheduleMode, ScheduleRequest, SchedulingRequest, SchedulingResponse, TierOverlapBlocks, WorkerAvailabilityProvider, }; +use crate::plugins::request_classifier::{ClassifyRequest, RequestClassifier}; use crate::protocols::RoutingConstraints; use crate::protocols::{LocalBlockHash, WorkerConfigLike, WorkerId, WorkerWithDpRank}; use crate::sequences::topology::WorkerDpRange; diff --git a/lib/kv-router/src/scheduling/mod.rs b/lib/kv-router/src/scheduling/mod.rs index 1ca16f081454..21b619151f88 100644 --- a/lib/kv-router/src/scheduling/mod.rs +++ b/lib/kv-router/src/scheduling/mod.rs @@ -16,8 +16,6 @@ mod queue_admission; pub mod request_classifier; pub mod selector; -mod worker_selection_config; - mod types; pub use filter::*; pub use local::LocalScheduler; @@ -33,7 +31,6 @@ pub use overlap_refresh::{ }; pub use policy_config::{ PolicyClassConfig, PolicyProfile, RouterPolicyConfig, RouterPolicyConfigError, - WorkerSelectionConfig, WorkerSelectionInstance, }; pub use policy_queue::{ PolicyQueue, PolicyQueueEntry, QueueLimitKind, QueueRejection, QueueSnapshot, @@ -42,9 +39,16 @@ pub use prefill_load::{ InvalidEffectivePrefillTokens, PrefillLoadEstimator, effective_prefill_tokens, prefill_load_hint_from_effective_tokens, }; -pub use queue_admission::{RequestProgress, RequestProgressUpdater, WorkerPlacement}; -pub use request_classifier::{ +pub use queue_admission::WorkerPlacement; +pub use request_classifier::RequestLifecycle; +// TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. +pub use crate::plugins::request_classifier::{ AbortCause, ClassifierError, ClassifyEvent, ClassifyFuture, ClassifyRequest, RequestClassifier, - RequestClassifierContext, RequestClassifierWorker, RequestLifecycle, + RequestClassifierConfig, RequestClassifierContext, RequestClassifierFactory, + RequestClassifierParameters, RequestClassifierProvider, RequestClassifierProviderError, + RequestClassifierRegistryError, RequestClassifierWorker, RequestProgress, + RequestProgressUpdater, }; +// TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. +pub use crate::plugins::worker_selection::{WorkerSelectionConfig, WorkerSelectionInstance}; pub use types::*; diff --git a/lib/kv-router/src/scheduling/policy_config.rs b/lib/kv-router/src/scheduling/policy_config.rs index 97ddcb6fd2bf..07e90f5557d2 100644 --- a/lib/kv-router/src/scheduling/policy_config.rs +++ b/lib/kv-router/src/scheduling/policy_config.rs @@ -9,8 +9,12 @@ use serde::Deserialize; use thiserror::Error; use super::config::RouterQueuePolicy; -use super::worker_selection_config::RawWorkerSelectionConfig; -pub use super::worker_selection_config::{WorkerSelectionConfig, WorkerSelectionInstance}; +use crate::plugins::request_classifier::RawRequestClassifierConfig; +// TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. +pub use crate::plugins::request_classifier::RequestClassifierConfig; +use crate::plugins::worker_selection::RawWorkerSelectionConfig; +// TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. +pub use crate::plugins::worker_selection::{WorkerSelectionConfig, WorkerSelectionInstance}; const SYNTHETIC_POLICY_CLASS: &str = "default"; @@ -206,6 +210,7 @@ pub struct RouterPolicyConfig { root: Option, models: HashMap, worker_selection: Option, + request_classifier: Option, } impl RouterPolicyConfig { @@ -254,6 +259,11 @@ impl RouterPolicyConfig { self.worker_selection.as_ref() } + /// Returns the process-wide request-classifier plugin configuration, if present. + pub fn request_classifier(&self) -> Option<&RequestClassifierConfig> { + self.request_classifier.as_ref() + } + /// Whether this document configures queue policy profiles. pub fn has_routing_profiles(&self) -> bool { self.root.is_some() || !self.models.is_empty() @@ -269,6 +279,7 @@ struct RawRouterPolicyConfig { #[serde(default)] models: HashMap, worker_selection: Option, + request_classifier: Option, } impl RawRouterPolicyConfig { @@ -312,9 +323,17 @@ impl RawRouterPolicyConfig { None => None, }; - if root.is_none() && models.is_empty() && worker_selection.is_none() { + let request_classifier = self + .request_classifier + .map(|config| config.resolve()) + .transpose()?; + if root.is_none() + && models.is_empty() + && worker_selection.is_none() + && request_classifier.is_none() + { return Err(RouterPolicyConfigError::Validation( - "router policy config must define a root profile, at least one model profile, or worker_selection".to_string(), + "router policy config must define a root profile, at least one model profile, worker_selection, or request_classifier".to_string(), )); } @@ -322,6 +341,7 @@ impl RawRouterPolicyConfig { root, models, worker_selection, + request_classifier, }) } } @@ -604,7 +624,7 @@ fn resolve_uncached_isl_buckets( }) } -pub(super) fn validate_identifier( +pub(crate) fn validate_identifier( name: &str, kind: &str, location: &str, @@ -658,6 +678,50 @@ worker_selection: ); } + #[test] + fn request_classifier_only_config_preserves_parameter_mapping() { + let config = RouterPolicyConfig::from_yaml( + r#" +request_classifier: + type: thunderagent + parameters: + pause_threshold: 0.9 +"#, + ) + .unwrap(); + + let classifier = config.request_classifier().unwrap(); + assert_eq!(classifier.classifier_type(), "thunderagent"); + assert!(matches!( + classifier.parameters(), + serde_yaml::Value::Mapping(_) + )); + } + + #[test] + fn rejects_invalid_request_classifier_config() { + for yaml in [ + r#" +request_classifier: + type: default +"#, + r#" +request_classifier: + type: thunderagent + parameters: 1 +"#, + r#" +request_classifier: + type: "" +"#, + ] { + assert!( + RouterPolicyConfig::from_yaml(yaml).is_err(), + "unexpectedly accepted {yaml}" + ); + } + } + #[test] fn worker_selection_accepts_every_worker_type() { let config = RouterPolicyConfig::from_yaml( diff --git a/lib/kv-router/src/scheduling/queue_admission/mod.rs b/lib/kv-router/src/scheduling/queue_admission/mod.rs index 6d82359379fc..09a74cc14453 100644 --- a/lib/kv-router/src/scheduling/queue_admission/mod.rs +++ b/lib/kv-router/src/scheduling/queue_admission/mod.rs @@ -1,51 +1,8 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -use std::sync::Arc; -use std::sync::atomic::{AtomicUsize, Ordering}; - use crate::protocols::WorkerWithDpRank; -/// Lock-free access to the latest logical context observed for one request. -#[derive(Debug, Clone)] -pub struct RequestProgress { - context_tokens: Arc, -} - -/// Write capability paired with [`RequestProgress`]. -/// -/// Updates are monotonic so concurrent or delayed observations cannot move a -/// request's logical context backwards. -#[derive(Debug, Clone)] -pub struct RequestProgressUpdater { - context_tokens: Arc, -} - -impl RequestProgress { - pub fn new(initial_context_tokens: usize) -> (Self, RequestProgressUpdater) { - let context_tokens = Arc::new(AtomicUsize::new(initial_context_tokens)); - ( - Self { - context_tokens: Arc::clone(&context_tokens), - }, - RequestProgressUpdater { context_tokens }, - ) - } - - #[inline] - pub fn context_tokens(&self) -> usize { - self.context_tokens.load(Ordering::Relaxed) - } -} - -impl RequestProgressUpdater { - #[inline] - pub fn update_context_tokens(&self, context_tokens: usize) { - self.context_tokens - .fetch_max(context_tokens, Ordering::Relaxed); - } -} - #[derive(Debug, Clone, Copy, PartialEq, Eq)] #[non_exhaustive] pub enum WorkerPlacement { @@ -55,18 +12,3 @@ pub enum WorkerPlacement { /// request's existing constraints before dispatch. Exact(WorkerWithDpRank), } - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn request_progress_is_monotonic() { - let (progress, updater) = RequestProgress::new(42); - - updater.update_context_tokens(55); - updater.update_context_tokens(50); - - assert_eq!(progress.context_tokens(), 55); - } -} diff --git a/lib/kv-router/src/scheduling/request_classifier.rs b/lib/kv-router/src/scheduling/request_classifier.rs index 1d090e04b0dd..891d99713177 100644 --- a/lib/kv-router/src/scheduling/request_classifier.rs +++ b/lib/kv-router/src/scheduling/request_classifier.rs @@ -3,259 +3,32 @@ use std::any::Any; use std::collections::HashMap; -use std::error::Error; -use std::future::Future; use std::panic::{AssertUnwindSafe, catch_unwind}; -use std::pin::Pin; use std::sync::Arc; use std::sync::atomic::{AtomicU64, Ordering}; +#[cfg(test)] use async_trait::async_trait; use futures_util::FutureExt; use parking_lot::Mutex; use tokio::sync::{Mutex as AsyncMutex, Notify, mpsc}; use tokio::task::JoinHandle; -// Deadline math across the scheduler uses `tokio::time::Instant` so -// paused-clock tests stay coherent. -use tokio::time::Instant; use tokio_util::sync::CancellationToken; -use super::policy_queue::QueueSnapshot; -use super::types::{KvSchedulerError, SessionContext}; -use crate::protocols::{WorkerAffinityTarget, WorkerWithDpRank}; - -mod inputs; -use super::queue_admission::{RequestProgress, RequestProgressUpdater}; -pub use inputs::{RequestClassifierContext, RequestClassifierWorker}; +use super::types::KvSchedulerError; +use crate::protocols::WorkerWithDpRank; static NEXT_CLASSIFICATION_ID: AtomicU64 = AtomicU64::new(1); static NEXT_LIFECYCLE_GENERATION: AtomicU64 = AtomicU64::new(1); -#[derive(Debug)] -pub struct ClassifyRequest { - classification_id: u64, - request_id: Option, - policy_class: Option, - overrides: ClassificationOverrides, - ingress_at: Instant, - input_tokens: usize, - initial_cached_tokens: usize, - progress: RequestProgress, - session_context: Option, -} - -#[derive(Clone, Debug, Default)] -pub(crate) struct ClassificationOverrides { - pub(crate) policy_class: Option, - pub(crate) due_at: Option, - pub(crate) scheduling_cost_tokens: Option, - pub(crate) worker_selection_target: Option>, -} - -impl ClassifyRequest { - #[cfg(test)] - pub(crate) fn new(input_tokens: usize, initial_cached_tokens: usize) -> Self { - Self::with_timing(input_tokens, initial_cached_tokens, Instant::now()) - } - - pub(crate) fn with_timing( - input_tokens: usize, - initial_cached_tokens: usize, - ingress_at: Instant, - ) -> Self { - Self { - classification_id: 0, - request_id: None, - policy_class: None, - overrides: ClassificationOverrides::default(), - ingress_at, - input_tokens, - initial_cached_tokens, - progress: RequestProgress::new(input_tokens).0, - session_context: None, - } - } - - pub(crate) fn with_request_id(mut self, request_id: impl Into) -> Self { - self.request_id = Some(request_id.into()); - self - } - - pub(crate) fn with_initial_policy_class(mut self, policy_class: impl Into) -> Self { - self.policy_class = Some(policy_class.into()); - self - } - - pub(crate) fn with_session_context(mut self, session_context: SessionContext) -> Self { - self.session_context = Some(session_context); - self - } - - pub fn request_id(&self) -> Option<&str> { - self.request_id.as_deref() - } - - pub fn policy_class(&self) -> Option<&str> { - self.overrides - .policy_class - .as_deref() - .or(self.policy_class.as_deref()) - } - - pub fn set_policy_class(&mut self, policy_class: impl Into) { - self.overrides.policy_class = Some(policy_class.into()); - } - - pub fn input_tokens(&self) -> usize { - self.input_tokens - } - - /// Live context high-water mark, initialized from `input_tokens()` and raised - /// by host observations of prompt plus generated tokens. This is not physical - /// KV occupancy. The host alone updates this request's counter. - pub fn progress(&self) -> &RequestProgress { - &self.progress - } - - /// Return the original router ingress time on the monotonic clock. - pub fn ingress_at(&self) -> Instant { - self.ingress_at - } - - pub fn due_at(&self) -> Option { - self.overrides.due_at - } - - pub fn set_due_at(&mut self, due_at: Instant) { - self.overrides.due_at = Some(due_at); - } - - pub fn scheduling_cost_tokens(&self) -> usize { - self.overrides.scheduling_cost_tokens.unwrap_or_else(|| { - QueueSnapshot::new(self.input_tokens, self.initial_cached_tokens).scheduling_cost_tokens - }) - } - - pub fn set_scheduling_cost_tokens(&mut self, scheduling_cost_tokens: usize) { - self.overrides.scheduling_cost_tokens = Some(scheduling_cost_tokens); - } - - /// Prefer a worker/rank for this request, replacing its soft affinity target. - /// Hard pins and caller eligibility constraints remain authoritative. A custom - /// selector can fall back if the target is ineligible; `Sent` reports the result. - pub fn set_worker_selection_target(&mut self, worker: WorkerWithDpRank) { - self.overrides.worker_selection_target = Some(Some(worker.into())); - } - - /// Clear this request's soft affinity preference without changing hard pins. - pub fn clear_worker_selection_target(&mut self) { - self.overrides.worker_selection_target = Some(None); - } - - pub fn session_context(&self) -> Option<&SessionContext> { - self.session_context.as_ref() - } +pub(crate) use crate::plugins::request_classifier::ClassificationOverrides; +use crate::plugins::request_classifier::{RequestProgress, RequestProgressUpdater}; - /// Only the explicit overrides feed the queue: cache eligibility is - /// recomputed from the current workers at enqueue, because worker state - /// may have changed while the classification was pending. - pub(crate) fn into_queue_inputs(self) -> ClassificationOverrides { - self.overrides - } -} - -/// Error returned by [`RequestClassifier::classify`]. -pub type ClassifierError = dyn Error + Send + Sync + 'static; - -/// Cause delivered to the classifier when a request aborts. Produced by the -/// router or the worker path, not by the classifier. -pub type AbortCause = dyn Error + Send + Sync + 'static; - -/// Request lifecycle events, delivered to [`RequestClassifier::on_event`] one -/// at a time in lifecycle order. A terminal event can arrive without a prior -/// `Sent`: an attempt that recorded a worker via selection but was never -/// dispatched still ends with `Completed`. -/// -/// Delivery is asynchronous, but a re-registered request id is not classified -/// until the previous lifecycle's terminal event has been delivered, so a -/// plugin keying state by request id observes each lifecycle's `classify` and -/// events in order and never receives a stale terminal event after the id's -/// next `classify`. -#[derive(Debug)] -#[non_exhaustive] -pub enum ClassifyEvent { - Sent { - request_id: String, - worker: WorkerWithDpRank, - }, - Responding { - request_id: String, - worker: WorkerWithDpRank, - }, - Completed { - request_id: String, - worker: WorkerWithDpRank, - context_tokens: Option, - }, - Aborted { - request_id: String, - worker: Option, - error: Option>, - }, -} - -/// An independently pollable classifier invocation. See [`RequestClassifier`] -/// for why this is a `'static` future rather than `async fn`. -pub type ClassifyFuture = - Pin>> + Send + 'static>>; - -/// User-provided request classifier. -/// -/// [`Self::classify`] deliberately avoids `async fn` and returns a `'static` -/// future which the router polls on its own runtime, so a classifier may -/// await, sleep, or park a request without blocking a thread and without -/// standing up a runtime of its own. `async fn` cannot express this: its -/// future borrows `&mut self` for the whole pending wait, which would hold the -/// router-wide classifier lock and block every other request and every event. -/// -/// Because the returned future is `'static`, state it touches must be owned or -/// shared rather than borrowed from `self`: -/// -/// ```ignore -/// struct Pauser { -/// state: Arc>, -/// } -/// -/// impl RequestClassifier for Pauser { -/// fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { -/// // Clone the handle into the future; `self` cannot be borrowed. -/// let state = Arc::clone(&self.state); -/// Box::pin(async move { -/// state.lock().await.wait_for_slot().await; -/// Ok(request) -/// }) -/// } -/// } -/// ``` -/// -/// `classify`'s synchronous prologue runs under the router-wide classifier -/// lock: build the future and return promptly, then wait inside it. Blocking -/// before the future is returned stalls classification and event delivery. -/// -/// [`Self::on_event`] is `async fn`. A dedicated router task delivers events -/// one at a time in lifecycle order and awaits each callback, so `on_event` -/// may await freely. A pending `classify` future never blocks delivery, but a -/// slow `on_event` delays classification of new requests because both share -/// the classifier lock. Terminal events arrive asynchronously, shortly after -/// the request ends; events still queued at router shutdown are dropped. -#[async_trait] -pub trait RequestClassifier: Send + 'static { - fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { - Box::pin(async move { Ok(request) }) - } - - async fn on_event(&mut self, _event: ClassifyEvent) {} -} +// TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. +pub use crate::plugins::request_classifier::{ + AbortCause, ClassifierError, ClassifyEvent, ClassifyFuture, ClassifyRequest, RequestClassifier, + RequestClassifierContext, RequestClassifierWorker, +}; /// One live lifecycle's bookkeeping. `generation` fences `classify_with` /// against a lifecycle that released this request id and a new one that @@ -402,7 +175,7 @@ impl RequestClassifierRuntime { KvSchedulerError::ClassificationLifecycleEnded(request_id.to_owned()) })?; live.progress_updater - .update_context_tokens(request.input_tokens); + .update_context_tokens(request.input_tokens()); request.progress = live.progress.clone(); if let Some(overrides) = live.overrides.clone() { request.overrides = overrides; diff --git a/lib/kv-router/src/scheduling/selector/mod.rs b/lib/kv-router/src/scheduling/selector/mod.rs index 1b81bc78cb74..61b4f5c1c33b 100644 --- a/lib/kv-router/src/scheduling/selector/mod.rs +++ b/lib/kv-router/src/scheduling/selector/mod.rs @@ -9,12 +9,14 @@ mod policy; pub use default::DefaultWorkerSelector; use default::{DefaultWorkerPicker, DefaultWorkerScorer}; -pub use policy::{ +// TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. +pub use crate::plugins::worker_selection::{ ScoredWorkerCandidate, WorkerCacheInput, WorkerCandidate, WorkerFilter, WorkerInputView, WorkerInputs, WorkerLoadInput, WorkerPicker, WorkerScorer, WorkerSelectionContext, - WorkerSelectionPolicy, }; +pub use policy::WorkerSelectionPolicy; + use default::{pick_default_worker, selection_weights}; use policy::{ CustomWorkerSelectionState, WorkerSelectionPolicyStateRef, collect_custom_candidates, @@ -125,7 +127,7 @@ impl<'a, C: WorkerConfigLike> WorkerSelectionInput<'a, C> { } #[derive(Debug, Clone, Copy)] -struct LogitWeights { +pub(crate) struct LogitWeights { overlap_score_credit: f64, overlap_score_credit_decay: f64, prefill_load_scale: f64, diff --git a/lib/kv-router/src/scheduling/selector/policy.rs b/lib/kv-router/src/scheduling/selector/policy.rs index 78a5cbf6e2ab..01213e781f67 100644 --- a/lib/kv-router/src/scheduling/selector/policy.rs +++ b/lib/kv-router/src/scheduling/selector/policy.rs @@ -3,341 +3,20 @@ use std::cell::RefCell; use std::collections::HashMap; -use std::ops::BitOr; use super::{ - DefaultWorkerPicker, LogitWeights, MaterializedSelectionInput, WorkerSelectionInput, - WorkerSelector, select_worker_with_policy, -}; -use crate::protocols::{ - WorkerAffinityTarget, WorkerConfigLike, WorkerId, WorkerSelectionResult, WorkerWithDpRank, + DefaultWorkerPicker, MaterializedSelectionInput, WorkerSelectionInput, WorkerSelector, + select_worker_with_policy, }; +use crate::protocols::{WorkerConfigLike, WorkerId, WorkerSelectionResult}; use crate::scheduling::config::KvRouterConfig; use crate::scheduling::filter::RoutingEligibility; -use crate::scheduling::types::{ - KvSchedulerError, SchedulingRequest, SessionContext, WorkerSelectionPolicyError, -}; - -/// Request-level values available to custom filters, scorers, and pickers. -pub struct WorkerSelectionContext<'a> { - pub(super) request: &'a SchedulingRequest, - pub(super) request_id: &'a str, - pub(super) request_blocks: u64, - pub(super) block_size: u32, - pub(super) track_prefill_tokens: bool, - pub(super) weights: LogitWeights, - pub(super) router_temperature_override: Option, -} - -/// One eligible worker and the optional inputs requested by a filter or scorer. -pub struct WorkerCandidate { - pub(super) worker: WorkerWithDpRank, - pub(super) inputs: WorkerInputs, - pub(super) cache: WorkerCacheInput, - pub(super) load: WorkerLoadInput, - pub(super) preferred_taint_multiplier: Option, -} - -/// One eligible worker and its total cost after all scorers run. -#[derive(Clone, Copy)] -pub struct ScoredWorkerCandidate { - pub(super) worker: WorkerWithDpRank, - pub(super) cost: f64, - pub(super) preferred_taint_multiplier: Option, -} - -/// Optional worker-signal groups requested by scorers and pickers. -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -pub struct WorkerInputs(u8); - -impl WorkerInputs { - /// Request no optional worker inputs. - pub const NONE: Self = Self(0); - /// Request KV-cache overlap inputs. - pub const CACHE: Self = Self(1 << 0); - /// Request active-load inputs. - pub const LOAD: Self = Self(1 << 1); - /// Request preferred-taint routing metadata. - pub const PREFERRED_TAINT: Self = Self(1 << 2); - /// Request host-owned active-request counts. - pub const OCCUPANCY: Self = Self(1 << 5); - pub(super) const ALL: Self = Self(Self::CACHE.0 | Self::LOAD.0 | Self::PREFERRED_TAINT.0); - - pub const fn contains(self, other: Self) -> bool { - self.0 & other.0 == other.0 - } - - pub(super) fn without(self, other: Self) -> Self { - Self(self.0 & !other.0) - } -} - -impl BitOr for WorkerInputs { - type Output = Self; - - fn bitor(self, rhs: Self) -> Self::Output { - Self(self.0 | rhs.0) - } -} - -/// KV-cache overlap values for one worker. -#[derive(Clone, Copy, Default)] -pub struct WorkerCacheInput { - pub(super) effective_overlap_blocks: f64, - pub(super) device_overlap_blocks: f64, - pub(super) host_overlap_blocks: f64, - pub(super) disk_overlap_blocks: f64, - pub(super) shared_beyond_device_blocks: u32, -} - -/// Active-load values for one worker. -#[derive(Clone, Copy, Default)] -pub struct WorkerLoadInput { - pub(super) raw_prefill_blocks: f64, - pub(super) active_prefill_tokens: usize, - pub(super) decode_cost_blocks: f64, - pub(super) active_requests: usize, -} - -/// Borrowed, index-aligned view of one custom picker's requested worker inputs. -#[derive(Clone, Copy)] -pub struct WorkerInputView<'a> { - pub(super) candidates: &'a [ScoredWorkerCandidate], - pub(super) cache: Option<&'a [WorkerCacheInput]>, - pub(super) load: Option<&'a [WorkerLoadInput]>, -} - -/// Adds one finite cost contribution to each eligible worker. -pub trait WorkerScorer: Send { - /// Declare the worker-signal groups needed by this scorer. - fn required_worker_inputs(&self) -> WorkerInputs { - WorkerInputs::NONE - } - - /// Return one finite, lower-is-better cost contribution for an eligible worker row. - fn score( - &mut self, - context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result; -} - -/// Filters run in declaration order for each candidate. Callback order across different -/// candidates and scorers is unspecified; implementations must not depend on filters and scorers -/// being interleaved. -pub trait WorkerFilter: Send { - /// Declare the worker-signal groups needed by this filter. - fn required_worker_inputs(&self) -> WorkerInputs { - WorkerInputs::NONE - } - - /// Return `true` to keep an eligible worker in the policy candidate set. - fn keep( - &mut self, - context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result; -} - -/// Selects one row after all filters and scorers run. -pub trait WorkerPicker: Send { - /// Declare the optional worker-signal columns needed by this picker. - fn required_worker_inputs(&self) -> WorkerInputs { - WorkerInputs::NONE - } - - /// Return one row index from the host-owned eligible candidate table. Row order is - /// unspecified; inspect candidate data instead of relying on a stable position. - fn pick( - &mut self, - context: &WorkerSelectionContext<'_>, - input: WorkerInputView<'_>, - ) -> Result; -} - -impl WorkerSelectionContext<'_> { - /// Return the incoming prompt size in KV blocks. - pub fn request_blocks(&self) -> u64 { - self.request_blocks - } - - /// Return the number of tokens in one KV block. - pub fn block_size(&self) -> u32 { - self.block_size - } - - /// Return whether this request contributes to prefill-load tracking. - pub fn tracks_prefill_tokens(&self) -> bool { - self.track_prefill_tokens - } - - /// Return the session metadata available to worker selection. - pub fn session_context(&self) -> Option<&SessionContext> { - self.request.session_context.as_ref() - } - - /// Return the session-affinity target resolved by the request host. - /// - /// The default selector treats an eligible target as exclusive. Custom policies receive it as - /// advisory context; it may be absent from their candidate set when unavailable or filtered. - pub fn affinity_target(&self) -> Option { - self.request.affinity_target - } - - /// Return the expected output length, if the request supplies one. - pub fn expected_output_tokens(&self) -> Option { - self.request.expected_output_tokens - } - - /// Return the request's scheduler priority boost. - pub fn priority_jump(&self) -> f64 { - self.request.priority_jump - } - - /// Return the request's strict integer priority. - pub fn strict_priority(&self) -> u32 { - self.request.strict_priority - } - - /// Return the request-level router temperature override, if present. - pub fn router_temperature_override(&self) -> Option { - self.router_temperature_override - } -} - -impl WorkerCandidate { - /// Return this candidate's worker ID and data-parallel rank. - pub fn worker(&self) -> WorkerWithDpRank { - self.worker - } - - /// Return KV-cache inputs when the component requested [`WorkerInputs::CACHE`]. - pub fn cache(&self) -> Option<&WorkerCacheInput> { - self.inputs - .contains(WorkerInputs::CACHE) - .then_some(&self.cache) - } - - /// Return active-load inputs when the component requested [`WorkerInputs::LOAD`]. - pub fn load(&self) -> Option<&WorkerLoadInput> { - self.inputs - .contains(WorkerInputs::LOAD) - .then_some(&self.load) - } - - /// Return the optional cost multiplier from preferred routing constraints when the component - /// requested [`WorkerInputs::PREFERRED_TAINT`]. - /// - /// Required routing constraints are enforced by host eligibility. This preferred value is - /// ordinary candidate metadata and is only materialized for components that declare the - /// capability. - pub fn preferred_taint_multiplier(&self) -> Option { - self.preferred_taint_multiplier - } - - fn with_inputs_from(&self, additional: &Self, inputs: WorkerInputs) -> Self { - debug_assert_eq!(self.worker, additional.worker); - Self { - worker: self.worker, - inputs, - cache: if inputs.contains(WorkerInputs::CACHE) { - if self.inputs.contains(WorkerInputs::CACHE) { - self.cache - } else { - additional.cache - } - } else { - WorkerCacheInput::default() - }, - load: if inputs.contains(WorkerInputs::LOAD) { - if self.inputs.contains(WorkerInputs::LOAD) { - self.load - } else { - additional.load - } - } else { - WorkerLoadInput::default() - }, - preferred_taint_multiplier: self - .preferred_taint_multiplier - .or(additional.preferred_taint_multiplier), - } - } -} - -impl ScoredWorkerCandidate { - /// Return this candidate's worker ID and data-parallel rank. - pub fn worker(&self) -> WorkerWithDpRank { - self.worker - } - - /// Return the sum of all scorer contributions for this candidate. - pub fn cost(&self) -> f64 { - self.cost - } - - /// Return the optional cost multiplier from preferred routing constraints when the picker - /// requested [`WorkerInputs::PREFERRED_TAINT`]. - pub fn preferred_taint_multiplier(&self) -> Option { - self.preferred_taint_multiplier - } -} - -impl WorkerCacheInput { - /// Return device-resident prefix overlap in KV blocks. - pub fn device_overlap_blocks(&self) -> f64 { - self.device_overlap_blocks - } - - /// Return host-pinned prefix overlap in KV blocks. - pub fn host_overlap_blocks(&self) -> f64 { - self.host_overlap_blocks - } - - /// Return disk prefix overlap in KV blocks. - pub fn disk_overlap_blocks(&self) -> f64 { - self.disk_overlap_blocks - } +use crate::scheduling::types::{KvSchedulerError, SchedulingRequest, WorkerSelectionPolicyError}; - /// Return shared-cache hits beyond the device-resident prefix. - pub fn shared_beyond_device_blocks(&self) -> u32 { - self.shared_beyond_device_blocks - } -} - -impl WorkerLoadInput { - /// Return the tokens active in this worker's prefill stage. - pub fn active_prefill_tokens(&self) -> usize { - self.active_prefill_tokens - } - - /// Return the projected active decode footprint in KV blocks. - pub fn decode_cost_blocks(&self) -> f64 { - self.decode_cost_blocks - } - - /// Return this worker's active request count. - pub fn active_requests(&self) -> usize { - self.active_requests - } -} - -impl<'a> WorkerInputView<'a> { - /// Return the eligible candidates and their total costs. - pub fn candidates(self) -> &'a [ScoredWorkerCandidate] { - self.candidates - } - - /// Return index-aligned KV-cache inputs when the picker requested them. - pub fn cache(self) -> Option<&'a [WorkerCacheInput]> { - self.cache - } - - /// Return index-aligned active-load inputs when the picker requested them. - pub fn load(self) -> Option<&'a [WorkerLoadInput]> { - self.load - } -} +use crate::plugins::worker_selection::{ + ScoredWorkerCandidate, WorkerCacheInput, WorkerCandidate, WorkerFilter, WorkerInputs, + WorkerLoadInput, WorkerPicker, WorkerScorer, WorkerSelectionContext, +}; #[cfg_attr(not(feature = "standalone-selection"), allow(dead_code))] pub(super) enum WorkerSelectionPolicyState { @@ -641,6 +320,9 @@ mod tests { use super::super::DefaultWorkerSelector; use super::super::test_support::*; use super::*; + use crate::SessionContext; + use crate::plugins::worker_selection::WorkerInputView; + use crate::protocols::WorkerWithDpRank; use crate::scheduling::WorkerSelectionInputTrigger; fn uses_exclusive_affinity(selector: &impl WorkerSelector) -> bool { diff --git a/lib/kv-router/src/services/selection/mod.rs b/lib/kv-router/src/services/selection/mod.rs index d10a4bb91313..27467ae69b67 100644 --- a/lib/kv-router/src/services/selection/mod.rs +++ b/lib/kv-router/src/services/selection/mod.rs @@ -14,7 +14,6 @@ mod ingress; mod input; mod membership; mod pending; -mod policy_registry; mod server; mod service; mod types; @@ -22,7 +21,14 @@ mod types; #[cfg(test)] mod tests; -pub use crate::WorkerSelectionPolicyFactory; +// TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. +pub use crate::plugins::worker_selection::WorkerSelectionPolicyFactory; +pub use crate::plugins::{ + DYN_ROUTER_DECODE_POLICY, DYN_ROUTER_PREFILL_POLICY, DYN_ROUTER_WORKER_SELECTION_POLICY, + RouterPluginRegistry, WorkerSelectionPolicyParameters, WorkerSelectionPolicyProvider, + WorkerSelectionPolicyProviderError, WorkerSelectionPolicyRegistry, + WorkerSelectionPolicyRegistryError, +}; pub use crate::services::common::replica_sync::{ HostReplicaChannels, HostReplicaSyncFactory, ReplicaIngressObserver, ReplicaPeerError, SchedulerLoadSink, @@ -37,12 +43,6 @@ pub use ingress::KvEventIngress; pub use input::{PromptRequest, PromptView}; pub use membership::{CatalogObserver, CatalogReconciler, WorkerCatalogSource}; pub use pending::SelectionCacheConfig; -pub use policy_registry::{ - DYN_ROUTER_DECODE_POLICY, DYN_ROUTER_PREFILL_POLICY, DYN_ROUTER_WORKER_SELECTION_POLICY, - WorkerSelectionPolicyParameters, WorkerSelectionPolicyProvider, - WorkerSelectionPolicyProviderError, WorkerSelectionPolicyRegistry, - WorkerSelectionPolicyRegistryError, -}; pub use server::{AppState, run_server}; pub use service::{ SelectionService, SelectionServiceBuilder, warn_for_unserved_worker_selection_policies, diff --git a/lib/kv-router/src/services/selection/service.rs b/lib/kv-router/src/services/selection/service.rs index 3be85bd12052..1dc026914029 100644 --- a/lib/kv-router/src/services/selection/service.rs +++ b/lib/kv-router/src/services/selection/service.rs @@ -20,13 +20,13 @@ use super::affinity::SessionAffinityConfig; use super::core::{KvIndexSource, SelectionCore, SelectionHost, SelectionServiceConfig}; use super::error::SelectionError; use super::pending::SelectionCacheConfig; -use super::policy_registry::WorkerSelectionPolicyRegistry; use super::types::{ ModelLoadResponse, OverlapScoresRequest, OverlapScoresResponse, PotentialLoadsRequest, ReadyResponse, ReservationRequest, ReservationResponse, SelectAndReserveRequest, SelectRequest, SelectResponse, WorkerCatalogRecord, WorkerPatchRequest, WorkerRequest, }; use crate::WorkerType; +use crate::plugins::RouterPluginRegistry; pub struct SelectionServiceBuilder { kv_router_config: KvRouterConfig, @@ -36,10 +36,11 @@ pub struct SelectionServiceBuilder { replica_sync_peers: Vec, selection_cache: SelectionCacheConfig, worker_type: WorkerType, - worker_selection_policy_registry: WorkerSelectionPolicyRegistry, + plugin_registry: RouterPluginRegistry, host: SelectionHost, worker_selection_policy_factory: Option, session_affinity_ttl: Option, + host_manages_request_lifecycle: bool, } /// Warn when a host does not construct workers for explicitly configured policy roles. @@ -66,7 +67,7 @@ impl SelectionServiceBuilder { pub fn new( kv_router_config: KvRouterConfig, worker_type: WorkerType, - worker_selection_policy_registry: WorkerSelectionPolicyRegistry, + plugin_registry: RouterPluginRegistry, ) -> Self { Self { kv_router_config, @@ -76,10 +77,11 @@ impl SelectionServiceBuilder { replica_sync_peers: Vec::new(), selection_cache: SelectionCacheConfig::default(), worker_type, - worker_selection_policy_registry, + plugin_registry, host: SelectionHost::default(), worker_selection_policy_factory: None, session_affinity_ttl: None, + host_manages_request_lifecycle: false, } } @@ -134,6 +136,15 @@ impl SelectionServiceBuilder { self } + /// The embedding host installs classifiers and drives their request lifecycle. + /// + /// Only hosts that enroll requests and report dispatch, completion, and abort + /// may enable this. Standalone selection cannot provide those callbacks. + pub fn host_manages_request_lifecycle(mut self) -> Self { + self.host_manages_request_lifecycle = true; + self + } + pub async fn build(self) -> anyhow::Result { if let Some(ttl) = self.session_affinity_ttl { super::affinity::SessionAffinity::validate_ttl(ttl)?; @@ -141,10 +152,15 @@ impl SelectionServiceBuilder { self.kv_router_config .validate_config() .map_err(anyhow::Error::msg)?; + if !self.host_manages_request_lifecycle + && self.kv_router_config.request_classifier_config()?.is_some() + { + anyhow::bail!("standalone selection does not support request_classifier plugins"); + } let worker_selection_policy_factory = match self.worker_selection_policy_factory { Some(factory) => Some(factory), None => self - .worker_selection_policy_registry + .plugin_registry .resolve_for_worker_type(&self.kv_router_config, self.worker_type)?, }; let tracking_hash = Arc::new(TrackingHashContext::from_config(&self.kv_router_config)?); @@ -233,12 +249,12 @@ impl SelectionServiceConfig { pub fn service_builder( &self, worker_type: WorkerType, - worker_selection_policy_registry: WorkerSelectionPolicyRegistry, + plugin_registry: RouterPluginRegistry, ) -> SelectionServiceBuilder { let mut builder = SelectionServiceBuilder::new( self.kv_router_config.clone(), worker_type, - worker_selection_policy_registry, + plugin_registry, ) .indexer_threads(self.threads) .indexer_peers(self.indexer_peers.clone()) @@ -514,6 +530,31 @@ mod tests { .port() } + #[tokio::test] + async fn standalone_selection_rejects_request_classifier() { + let policy = tempfile::NamedTempFile::new().unwrap(); + std::fs::write(policy.path(), "request_classifier: {type: test}").unwrap(); + let config = KvRouterConfig { + router_policy_config: Some(policy.path().display().to_string()), + ..test_config() + }; + let result = SelectionServiceBuilder::new( + config, + WorkerType::Aggregated, + RouterPluginRegistry::default(), + ) + .build() + .await; + let Err(error) = result else { + panic!("classifier ignored") + }; + assert!( + error + .to_string() + .contains("standalone selection does not support request_classifier") + ); + } + #[tokio::test] async fn configured_custom_policy_requires_linked_policy_type_at_construction() { let policy_file = tempfile::NamedTempFile::new().unwrap(); @@ -537,7 +578,7 @@ worker_selection: let error = match SelectionServiceBuilder::new( config, WorkerType::Prefill, - WorkerSelectionPolicyRegistry::default(), + RouterPluginRegistry::default(), ) .build() .await @@ -559,7 +600,7 @@ worker_selection: match SelectionServiceBuilder::new( test_config(), WorkerType::Aggregated, - WorkerSelectionPolicyRegistry::default(), + RouterPluginRegistry::default(), ) .indexer_threads(1) .replica_sync(port, Vec::new()) @@ -581,7 +622,7 @@ worker_selection: let failed = SelectionServiceBuilder::new( test_config(), WorkerType::Aggregated, - WorkerSelectionPolicyRegistry::default(), + RouterPluginRegistry::default(), ) .indexer_threads(1) .replica_sync(port, vec!["invalid".to_string()]) @@ -636,7 +677,7 @@ worker_selection: SelectionServiceBuilder::new( test_config(), WorkerType::Aggregated, - WorkerSelectionPolicyRegistry::default(), + RouterPluginRegistry::default(), ) .indexer_threads(1) .indexer_peers(vec![peer_url]) diff --git a/lib/kv-router/tests/plugin_api_compat.rs b/lib/kv-router/tests/plugin_api_compat.rs new file mode 100644 index 000000000000..27964d9da8a2 --- /dev/null +++ b/lib/kv-router/tests/plugin_api_compat.rs @@ -0,0 +1,139 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Compile old plugin implementations against the canonical registry and contracts. +//! TODO(v1.7): Remove the legacy import coverage when the compatibility exports are removed. + +use std::sync::Arc; + +use dynamo_kv_router::plugins::{RouterPluginRegistry, request_classifier, worker_selection}; +use dynamo_kv_router::scheduling::{ClassifyFuture, ClassifyRequest, RequestClassifier}; +use dynamo_kv_router::{ + KvRouterConfig, RoutingPartitionRef, WorkerCandidate, WorkerFilter, WorkerInputView, + WorkerInputs, WorkerPicker, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicy, + WorkerSelectionPolicyError, WorkerType, +}; + +struct LegacyPolicy; + +impl WorkerFilter for LegacyPolicy { + fn required_worker_inputs(&self) -> WorkerInputs { + WorkerInputs::CACHE + } + + fn keep( + &mut self, + context: &WorkerSelectionContext<'_>, + candidate: &WorkerCandidate, + ) -> Result { + let _: Option<&dynamo_kv_router::SessionContext> = context.session_context(); + let _: Option = context.expected_output_tokens(); + let cache = candidate.cache().expect("requested cache inputs"); + Ok(cache.device_overlap_blocks() + cache.host_overlap_blocks() >= 0.0) + } +} + +impl WorkerScorer for LegacyPolicy { + fn required_worker_inputs(&self) -> WorkerInputs { + WorkerInputs::LOAD + } + + fn score( + &mut self, + context: &WorkerSelectionContext<'_>, + candidate: &WorkerCandidate, + ) -> Result { + let _: u64 = context.request_blocks(); + let _: u32 = context.block_size(); + let load = candidate.load().expect("requested load inputs"); + Ok(load.active_requests() as f64 + load.decode_cost_blocks()) + } +} + +impl WorkerPicker for LegacyPolicy { + fn pick( + &mut self, + _context: &WorkerSelectionContext<'_>, + input: WorkerInputView<'_>, + ) -> Result { + input + .candidates() + .iter() + .enumerate() + .min_by(|(_, a), (_, b)| a.cost().total_cmp(&b.cost())) + .map(|(row, _)| row) + .ok_or_else(|| WorkerSelectionPolicyError::failed("empty candidate table")) + } +} + +struct LegacyClassifier; + +impl RequestClassifier for LegacyClassifier { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + let _: Option<&str> = request.request_id(); + let _: usize = request.input_tokens(); + let _: &dynamo_kv_router::scheduling::RequestProgress = request.progress(); + let _: &request_classifier::RequestProgress = request.progress(); + let _: Option = request.due_at(); + Box::pin(async move { Ok(request) }) + } +} + +fn legacy_provider( + _parameters: &dynamo_kv_router::plugins::WorkerSelectionPolicyParameters, +) -> Result< + dynamo_kv_router::WorkerSelectionPolicyFactory, + dynamo_kv_router::plugins::WorkerSelectionPolicyProviderError, +> { + Ok(Arc::new(|config, worker_type, _partition| { + WorkerSelectionPolicy::new_with_filters( + config.clone(), + worker_type.as_str(), + vec![Box::new(LegacyPolicy)], + vec![Box::new(LegacyPolicy)], + Box::new(LegacyPolicy), + ) + })) +} + +#[test] +fn legacy_plugins_resolve_through_the_common_registry() { + // These assignments require identity, not wrappers around the original traits. + let _: Box = Box::new(LegacyPolicy); + let _: Box = Box::new(LegacyPolicy); + let _: Box = Box::new(LegacyPolicy); + let _: Box = Box::new(LegacyClassifier); + + let mut registry = dynamo_kv_router::plugins::WorkerSelectionPolicyRegistry::default(); + registry + .register("legacy", Arc::new(legacy_provider)) + .unwrap(); + let registry: RouterPluginRegistry = registry; + let policy = tempfile::NamedTempFile::new().unwrap(); + std::fs::write(policy.path(), "worker_selection:\n aggregated: legacy\n instances:\n - name: legacy\n type: legacy\n").unwrap(); + let config = KvRouterConfig { + router_policy_config: Some(policy.path().display().to_string()), + ..Default::default() + }; + let plugins = registry.resolve_plugins(&config).unwrap(); + let factory = plugins.worker_selection().unwrap(); + let _policy: worker_selection::WorkerSelectionPolicy = factory( + &config, + WorkerType::Aggregated, + RoutingPartitionRef::new("model", "default"), + ); +} + +#[cfg(feature = "standalone-selection")] +#[test] +fn legacy_service_catalog_registers_into_the_common_registry() { + use dynamo_kv_router::services::selection::{ + WorkerSelectionPolicyProvider, WorkerSelectionPolicyRegistry, + }; + + let mut registry = RouterPluginRegistry::default(); + let legacy_registry: &mut WorkerSelectionPolicyRegistry = &mut registry; + let provider: WorkerSelectionPolicyProvider = Arc::new(legacy_provider); + legacy_registry.register("legacy", provider).unwrap(); + assert!(!registry.is_empty()); +} diff --git a/lib/llm/src/discovery/model_manager.rs b/lib/llm/src/discovery/model_manager.rs index 825633a2b5ef..754c4631f7d0 100644 --- a/lib/llm/src/discovery/model_manager.rs +++ b/lib/llm/src/discovery/model_manager.rs @@ -2208,6 +2208,44 @@ impl ModelManager { Ok(crate::kv_router::ManagedKvRouter::new(load_context, router)) } + /// Construct and attach all configured plugins before publishing the router. + #[allow(clippy::too_many_arguments)] + pub async fn kv_chooser_for_with_plugins_and_client( + &self, + client: Client, + kv_cache_block_size: u32, + plugins: &crate::kv_router::plugins::RouterPluginBuilder, + kv_router_config: Option, + prefill_load_estimator: Option>, + worker_role: Option, + metric_worker_type: &'static str, + model_name: Option, + is_eagle: bool, + scheduler_load: crate::kv_router::SchedulerLoadSender, + cancellation_token: CancellationToken, + ) -> anyhow::Result> { + if let Some(config) = &kv_router_config { + plugins.validate_config(config)?; + } + let chooser = self + .kv_chooser_for_with_policy_and_client( + client, + kv_cache_block_size, + plugins.selection_policy(), + kv_router_config, + prefill_load_estimator, + worker_role, + metric_worker_type, + model_name, + is_eagle, + scheduler_load, + cancellation_token, + ) + .await?; + plugins.install(&chooser)?; + Ok(chooser) + } + #[allow(clippy::too_many_arguments)] pub async fn kv_chooser_for_with_policy_and_client( &self, diff --git a/lib/llm/src/discovery/watcher.rs b/lib/llm/src/discovery/watcher.rs index 9883d5d652f7..7b192d9d0efa 100644 --- a/lib/llm/src/discovery/watcher.rs +++ b/lib/llm/src/discovery/watcher.rs @@ -28,6 +28,7 @@ use crate::{ discovery::{LoadThresholdHandle, WORKER_TYPE_DECODE, WorkerSet}, entrypoint::{self, ChatEngineFactoryCallback, RouterConfig}, http::service::metrics::Metrics, + kv_router::plugins::RouterPluginBuilder, kv_router::{ EncoderRouter, PrefillRouter, RouterLoadSource, RoutingLoadContext, SelectionPolicySource, }, @@ -206,7 +207,7 @@ pub struct ModelWatcher { /// Worker capabilities accepted by the frontend's engine-native Generate routes. /// Keep raw pipelines out of default-off and backend-mismatched paths. generate_engine_capabilities: Vec<&'static str>, - selection_policy: SelectionPolicySource, + plugins: RouterPluginBuilder, } pub(crate) struct PreparedWorkerSet { @@ -275,7 +276,7 @@ impl ModelWatcher { prefill_load_estimator: Option>, metrics: Arc, ) -> ModelWatcher { - Self::new_with_selection_policy( + Self::new_with_plugins( runtime, model_manager, router_config, @@ -284,12 +285,12 @@ impl ModelWatcher { chat_engine_factory, prefill_load_estimator, metrics, - SelectionPolicySource::Registry, + RouterPluginBuilder::default(), ) } #[allow(clippy::too_many_arguments)] - pub(crate) fn new_with_selection_policy( + pub(crate) fn new_with_plugins( runtime: DistributedRuntime, model_manager: Arc, router_config: RouterConfig, @@ -298,7 +299,7 @@ impl ModelWatcher { chat_engine_factory: Option, prefill_load_estimator: Option>, metrics: Arc, - selection_policy: SelectionPolicySource, + plugins: RouterPluginBuilder, ) -> Self { Self { manager: model_manager, @@ -316,7 +317,7 @@ impl ModelWatcher { tokenizer_backend: None, tokenizer_fallback_enabled: None, generate_engine_capabilities: Vec::new(), - selection_policy, + plugins, } } @@ -413,7 +414,7 @@ impl ModelWatcher { card.download_config(self.local_model_path.as_deref()) .await?; - validate_policy_worker_role(card, &self.selection_policy)?; + validate_policy_worker_role(card, &self.plugins.selection_policy())?; // Prepare without exact video routing unless the cohort agreed on a contract. if spec.video_contract.is_none() @@ -578,14 +579,14 @@ impl ModelWatcher { if router_config.router_mode == RouterMode::KV && needs_preprocessed_routing { let mut chooser = self .manager - .kv_chooser_for_with_policy_and_client( + .kv_chooser_for_with_plugins_and_client( load_context .as_ref() .expect("routing load context must exist") .client() .clone(), card.kv_cache_block_size, - self.selection_policy.clone(), + &self.plugins, Some(router_config.kv_router_config.clone()), self.prefill_load_estimator.clone(), card.worker_type, @@ -628,7 +629,7 @@ impl ModelWatcher { router_config.router_mode, card.kv_cache_block_size, Some(prefill_config), - self.selection_policy.clone(), + self.plugins.selection_policy(), self.prefill_load_estimator.clone(), router_config.session_affinity_ttl_secs, router_config.session_affinity_mode, @@ -2039,6 +2040,249 @@ mod tests { )); } + #[tokio::test] + async fn plugin_bundle_is_installed_per_discovered_model() { + const TEST: &str = concat!( + module_path!(), + "::plugin_bundle_is_installed_per_discovered_model" + ); + let test_name = TEST.split_once("::").unwrap().1; + if std::env::var("DYNAMO_CLASSIFIER_CATALOG_TEST").as_deref() != Ok(test_name) { + // Isolate the process-global request plane and give the debug routing future + // more than libtest's default 2 MiB stack, like the prefill routing tests. + let output = tokio::time::timeout( + Duration::from_secs(30), + tokio::process::Command::new(std::env::current_exe().unwrap()) + .args(["--exact", test_name, "--nocapture"]) + .env("DYNAMO_CLASSIFIER_CATALOG_TEST", test_name) + .env("RUST_MIN_STACK", (4 * 1024 * 1024).to_string()) + .env("DYN_TCP_RPC_HOST", "127.0.0.1") + .env("DYN_TCP_RPC_PORT", "0") + .env("DYN_TCP_RESPONSE_STREAM_HOST", "127.0.0.1") + .env("DYN_TCP_RESPONSE_STREAM_PORT", "0") + .kill_on_drop(true) + .output(), + ) + .await + .expect("classifier subprocess timed out") + .unwrap(); + assert!( + output.status.success(), + "{}\n{}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + return; + } + use dynamo_kv_router::scheduling::{ + ClassifyEvent, ClassifyFuture, ClassifyRequest, RequestClassifier, + }; + use std::sync::atomic::{AtomicUsize, Ordering}; + + struct RejectingClassifier { + instance: usize, + calls: usize, + events: tokio::sync::mpsc::UnboundedSender<(usize, &'static str, usize)>, + } + #[async_trait] + impl RequestClassifier for RejectingClassifier { + fn classify(&mut self, _request: ClassifyRequest) -> ClassifyFuture { + self.calls += 1; + self.events + .send((self.instance, "classify", self.calls)) + .unwrap(); + Box::pin(async { Err(Box::new(std::io::Error::other("catalog rejection")) as _) }) + } + + async fn on_event(&mut self, event: ClassifyEvent) { + if matches!(event, ClassifyEvent::Aborted { .. }) { + self.events + .send((self.instance, "aborted", self.calls)) + .unwrap(); + } + } + } + + let policy_file = tempfile::NamedTempFile::new().unwrap(); + std::fs::write( + policy_file.path(), + r#" +worker_selection: + aggregated: test + instances: + - name: test + type: test +request_classifier: + type: test +"#, + ) + .unwrap(); + let router_config = RouterConfig::new( + RouterMode::KV, + dynamo_kv_router::KvRouterConfig { + use_kv_events: false, + router_policy_config: Some(policy_file.path().display().to_string()), + ..Default::default() + }, + ); + let instances = Arc::new(AtomicUsize::new(0)); + let (events, mut received) = tokio::sync::mpsc::unbounded_channel(); + let factory: dynamo_kv_router::scheduling::RequestClassifierFactory = Arc::new({ + let instances = instances.clone(); + move |context| { + assert_eq!(context.block_size(), 16); + Box::new(RejectingClassifier { + instance: instances.fetch_add(1, Ordering::Relaxed), + calls: 0, + events: events.clone(), + }) + } + }); + let selectors = Arc::new(parking_lot::Mutex::new(Vec::new())); + let mut registry = dynamo_kv_router::plugins::RouterPluginRegistry::default(); + registry + .register_request_classifier("test", Arc::new(move |_| Ok(factory.clone()))) + .unwrap(); + registry + .register_worker_selection( + "test", + Arc::new({ + let selectors = selectors.clone(); + move |_| { + let selectors = selectors.clone(); + Ok(Arc::new(move |config, role, partition| { + selectors.lock().push((role, partition.into_owned())); + dynamo_kv_router::WorkerSelectionPolicy::default( + config.clone(), + role.default_selector_label(), + ) + })) + } + }), + ) + .unwrap(); + let plugins = registry + .resolve_plugins(&router_config.kv_router_config) + .unwrap(); + let runtime = Runtime::from_current().unwrap(); + let drt = DistributedRuntime::new(runtime.clone(), DistributedConfig::process_local()) + .await + .unwrap(); + let worker_id = drt.discovery().instance_id(); + let watcher = ModelWatcher::new_with_plugins( + drt, + Arc::new(ModelManager::new()), + router_config, + 0, + None, + None, + None, + Arc::new(Metrics::new()), + RouterPluginBuilder::new(plugins), + ); + + for instance in 0..2 { + let namespace = format!("classifier-test-{instance}"); + let endpoint = watcher + .drt + .namespace(&namespace) + .unwrap() + .component("workers") + .unwrap() + .endpoint("generate"); + endpoint.register_endpoint_instance().await.unwrap(); + let model_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("tests/data/sample-models/mock-llama-3.1-8b-instruct"); + let mut card = ModelDeploymentCard::load_from_disk(model_path, None).unwrap(); + card.set_name(&format!("classifier-model-{instance}")); + card.model_type = ModelType::Chat; + card.model_input = ModelInput::Tokens; + card.kv_cache_block_size = 16; + card.worker_type = Some(WorkerType::Aggregated); + crate::local_model::register_model_card(&endpoint, &card) + .await + .unwrap(); + // SelectionCore takes membership from runtime-config discovery, + // independently of the ModelWatcher event exercised below. + let mut workers = watcher + .manager + .get_or_create_runtime_config_watcher(&endpoint) + .await + .unwrap(); + tokio::time::timeout( + Duration::from_secs(5), + workers.wait_for(|workers| workers.contains_key(&worker_id)), + ) + .await + .expect("worker runtime config was not discovered") + .unwrap(); + let DiscoveryEvent::Added(discovery) = discovered_card(&namespace, worker_id, &card) + else { + unreachable!() + }; + let desired = watcher + .normalize(discovery, &NamespaceFilter::Global) + .unwrap() + .unwrap(); + let spec = GroupSpec { + key: desired.group_key.clone(), + mdc_checksum: desired.mdc_checksum.clone(), + fingerprint: desired.mdc_checksum.clone(), + generation: instance as u64 + 1, + video_contract: desired.video_contract.clone(), + representative: desired, + }; + let (_admission_tx, admission_rx) = tokio::sync::watch::channel(vec![worker_id]); + let cancellation = runtime.child_token(); + let prepared = watcher + .prepare_worker_set(&spec, admission_rx, cancellation.clone()) + .await + .unwrap(); + let engine = prepared + .worker_set + .as_ref() + .unwrap() + .chat_engine + .as_ref() + .unwrap(); + let request = + serde_json::from_value::(serde_json::json!({ + "model": card.display_name, + "messages": [{"role": "user", "content": "Hello"}], + "stream": true, + })) + .unwrap(); + let error = tokio::time::timeout( + Duration::from_secs(5), + engine.generate(SingleIn::new(request)), + ) + .await + .expect("request stalled before classifier rejection") + .expect_err("classifier must reject the request"); + for event in ["classify", "aborted"] { + let observed = tokio::time::timeout(Duration::from_secs(5), received.recv()) + .await + .unwrap(); + assert_eq!(observed, Some((instance, event, 1)), "{error:#}"); + } + cancellation.cancel(); + } + assert_eq!(instances.load(Ordering::Relaxed), 2); + assert_eq!( + *selectors.lock(), + (0..2) + .map(|instance| ( + WorkerType::Aggregated, + dynamo_kv_router::RoutingPartitionId::new( + format!("classifier-model-{instance}"), + dynamo_kv_router::DEFAULT_ROUTING_GROUP + ), + )) + .collect::>() + ); + runtime.shutdown(); + } + #[tokio::test] async fn tokenizer_fallback_override_applies_to_discovered_card() { use dynamo_runtime::{Runtime, distributed::DistributedConfig}; diff --git a/lib/llm/src/entrypoint/input/grpc.rs b/lib/llm/src/entrypoint/input/grpc.rs index c342751c35b5..5d21fc9f4501 100644 --- a/lib/llm/src/entrypoint/input/grpc.rs +++ b/lib/llm/src/entrypoint/input/grpc.rs @@ -24,6 +24,9 @@ pub async fn run( distributed_runtime: DistributedRuntime, engine_config: EngineConfig, ) -> anyhow::Result<()> { + crate::kv_router::plugins::RouterPluginBuilder::default() + .validate_config(&engine_config.local_model().router_config().kv_router_config)?; + let mut grpc_service_builder = kserve::KserveService::builder() .port(engine_config.local_model().http_port()) // [WIP] generalize port.. .metrics_prefix(engine_config.local_model().metrics_prefix()) diff --git a/lib/llm/src/entrypoint/input/http.rs b/lib/llm/src/entrypoint/input/http.rs index 69fbb1856b6e..d01e28b5dfd4 100644 --- a/lib/llm/src/entrypoint/input/http.rs +++ b/lib/llm/src/entrypoint/input/http.rs @@ -13,7 +13,7 @@ use crate::{ FrontendRouteExtension, service_v2::{self, HttpService}, }, - kv_router::SelectionPolicySource, + kv_router::plugins::RouterPluginBuilder, local_model::runtime_config::TokenizerBackend, model_type::ModelType, namespace::NamespaceFilter, @@ -23,23 +23,33 @@ use crate::{ }, }; use dynamo_kv_router::{ - KvRouterConfig, RoutingPartitionRef, WorkerSelectionPolicy, WorkerSelectionPolicyFactory, - WorkerType, + KvRouterConfig, RoutingPartitionRef, WorkerSelectionPolicy, WorkerType, + plugins::{RouterPlugins, request_classifier::RequestClassifierFactory}, }; use dynamo_runtime::DistributedRuntime; use dynamo_runtime::metrics::MetricsHierarchy; /// Dynamo's complete discovery-backed HTTP frontend. /// -/// The default frontend resolves worker selection from its configuration. A statically linked -/// external crate can replace only worker selection with [`Self::worker_selection_policy_factory`]. +/// The default frontend resolves worker selection from its configuration. +/// Statically linked plugins install together through [`Self::plugins`]. #[derive(Default)] pub struct HttpFrontend { frontend_route_extensions: Vec, - worker_selection_policy_factory: Option, + plugins: RouterPlugins, } impl HttpFrontend { + /// Install a resolved plugin bundle for all routers created by this frontend. + /// + /// This replaces all previously configured plugins. Call this before + /// [`Self::worker_selection_policy_factory`] or [`Self::request_classifier_factory`] + /// to retain overrides made by those setters. + pub fn plugins(mut self, plugins: RouterPlugins) -> Self { + self.plugins = plugins; + self + } + /// Add system route extensions to the frontend. pub fn frontend_route_extensions( mut self, @@ -55,6 +65,7 @@ impl HttpFrontend { /// request. Workers must advertise an explicit typed role; legacy untyped cards are rejected /// because decode and aggregated workers cannot be distinguished. Dynamo continues to own /// discovery, scheduling, validation, and accounting. + // TODO(v1.7): Remove this compatibility setter; use plugins with RouterPlugins::with_worker_selection. pub fn worker_selection_policy_factory(mut self, factory: F) -> Self where F: for<'a> Fn( @@ -66,7 +77,13 @@ impl HttpFrontend { + Sync + 'static, { - self.worker_selection_policy_factory = Some(Arc::new(factory)); + self.plugins = self.plugins.with_worker_selection(Arc::new(factory)); + self + } + + /// Install one catalog-created request classifier per routed decode or aggregated model. + pub fn request_classifier_factory(mut self, factory: RequestClassifierFactory) -> Self { + self.plugins = self.plugins.with_request_classifier(factory); self } @@ -76,11 +93,21 @@ impl HttpFrontend { distributed_runtime: DistributedRuntime, engine_config: EngineConfig, ) -> anyhow::Result<()> { - if self.worker_selection_policy_factory.is_some() - && !matches!(&engine_config, EngineConfig::Dynamic { .. }) + if self.plugins.request_classifier().is_some() + && !engine_config + .local_model() + .router_config() + .router_mode + .is_kv_routing() { - anyhow::bail!("custom worker-selection policies require a dynamic engine"); + anyhow::bail!("request classifiers require --router-mode kv"); } + if !self.plugins.is_empty() && !matches!(&engine_config, EngineConfig::Dynamic { .. }) { + anyhow::bail!("custom router plugins require a dynamic engine"); + } + + let plugins = RouterPluginBuilder::new(self.plugins); + plugins.validate_config(&engine_config.local_model().router_config().kv_router_config)?; // Callers that reach the frontend without going through `run_input` // still have to drain the trace sinks before the process exits. The @@ -93,15 +120,11 @@ impl HttpFrontend { super::initialize_input(&distributed_runtime, &engine_config).await; - let selection_policy = match self.worker_selection_policy_factory { - Some(factory) => SelectionPolicySource::Factory(factory), - None => SelectionPolicySource::Registry, - }; - let result = run_with_selection_policy( + let result = run_with_router_plugins( distributed_runtime, engine_config, self.frontend_route_extensions, - selection_policy, + plugins, ) .await; @@ -133,11 +156,11 @@ pub async fn run_with_frontend_route_extensions( .await } -async fn run_with_selection_policy( +async fn run_with_router_plugins( distributed_runtime: DistributedRuntime, engine_config: EngineConfig, frontend_route_extensions: Vec, - selection_policy: SelectionPolicySource, + plugins: RouterPluginBuilder, ) -> anyhow::Result<()> { let local_model = engine_config.local_model(); let mut http_service_builder = match ( @@ -241,7 +264,7 @@ async fn run_with_selection_policy( model.runtime_config().tokenizer_backend, model.runtime_config().tokenizer_fallback_enabled, generate_engine_capabilities, - selection_policy.clone(), + plugins, ) .await?; http_service @@ -330,7 +353,7 @@ async fn run_watcher( tokenizer_backend: Option, tokenizer_fallback_enabled: Option, generate_engine_capabilities: Vec<&'static str>, - selection_policy: SelectionPolicySource, + plugins: RouterPluginBuilder, ) -> anyhow::Result<()> { // Start the LoRA allocation controller when LoRA serving is enabled. The // controller itself is additionally gated on the allocation config @@ -340,7 +363,7 @@ async fn run_watcher( let _controller_handle = model_manager.start_lora_controller(cancel_token); } - let mut watch_obj = ModelWatcher::new_with_selection_policy( + let mut watch_obj = ModelWatcher::new_with_plugins( runtime.clone(), model_manager, router_config, @@ -349,7 +372,7 @@ async fn run_watcher( chat_engine_factory, prefill_load_estimator, metrics.clone(), - selection_policy, + plugins, ); watch_obj.set_local_model_path(local_model_path); watch_obj.set_tokenizer_backend(tokenizer_backend); @@ -450,6 +473,61 @@ mod tests { use crate::model_card::{LoraInfo, ModelDeploymentCard}; use crate::types::openai::chat_completions::OpenAIChatCompletionsStreamingEngine; + #[tokio::test] + async fn configured_classifier_requires_installed_plugin() { + use crate::{entrypoint::RouterMode, local_model::LocalModelBuilder}; + use dynamo_runtime::{Runtime, distributed::DistributedConfig}; + + let policy_file = tempfile::NamedTempFile::new().unwrap(); + std::fs::write(policy_file.path(), "request_classifier:\n type: test\n").unwrap(); + let model = LocalModelBuilder::default() + .router_config(Some(RouterConfig::new( + RouterMode::KV, + KvRouterConfig { + router_policy_config: Some(policy_file.path().display().to_string()), + ..Default::default() + }, + ))) + .build() + .await + .unwrap(); + let runtime = Runtime::from_current().unwrap(); + let drt = DistributedRuntime::new(runtime.clone(), DistributedConfig::process_local()) + .await + .unwrap(); + let error = tokio::time::timeout( + std::time::Duration::from_secs(5), + HttpFrontend::default().run( + drt.clone(), + EngineConfig::Dynamic { + model: Box::new(model.clone()), + chat_engine_factory: None, + prefill_load_estimator: None, + }, + ), + ) + .await + .expect("must reject missing classifier before serving") + .unwrap_err(); + assert!(error.to_string().contains("configured but not installed")); + let error = tokio::time::timeout( + std::time::Duration::from_secs(5), + super::super::grpc::run( + drt, + EngineConfig::Dynamic { + model: Box::new(model), + chat_engine_factory: None, + prefill_load_estimator: None, + }, + ), + ) + .await + .expect("gRPC must also reject the missing classifier before serving") + .unwrap_err(); + assert!(error.to_string().contains("configured but not installed")); + runtime.shutdown(); + } + // `run` takes a `request_trace::ActiveInput` registration, which is // process-wide, so this shares a serialization group with the request-trace // lifecycle test rather than racing it for the last release. diff --git a/lib/llm/src/kv_router.rs b/lib/llm/src/kv_router.rs index acac342a5f56..363adf9dd576 100644 --- a/lib/llm/src/kv_router.rs +++ b/lib/llm/src/kv_router.rs @@ -60,6 +60,7 @@ pub mod encoder_router; pub mod indexer; pub mod metrics; pub(crate) mod metrics_subscriber; +pub mod plugins; pub mod prefill_router; pub mod publisher; mod request_lease; @@ -69,9 +70,13 @@ pub mod sequence; pub mod shared_cache; pub use dynamo_kv_router::scheduling::OverlapScoresResponse; -pub use embedded::{install_worker_selection_policy_registry, worker_selection_policy_registry}; +// TODO(v1.7): Remove these compatibility aliases; use kv_router::plugins instead. pub use encoder_router::EncoderRouter; pub use indexer::Indexer; +pub use plugins::{ + install_router_plugin_registry as install_worker_selection_policy_registry, + router_plugin_registry as worker_selection_policy_registry, +}; pub use prefill_router::PrefillRouter; pub use routing_host::{KvPushRouter, RoutingHost}; pub use routing_load::{ @@ -913,17 +918,22 @@ impl KvRouter { /// Attach a request classifier before placing this router into service. /// Classifier lifecycles belong to decode/aggregated routing; prefill hops bypass them. - // TODO: wire a production installer (Python bindings / router config); hidden until then. - #[doc(hidden)] pub fn with_request_classifier(self, classifier: impl RequestClassifier) -> Result { + self.install_request_classifier(Box::new(classifier))?; + Ok(self) + } + + /// Attach a catalog-created request classifier before placing this router into service. + pub fn install_request_classifier(&self, classifier: Box) -> Result<()> { if !self .selection .scheduler() - .install_request_classifier(Box::new(classifier), self.cancellation_token.child_token()) + .install_request_classifier(classifier, self.cancellation_token.child_token()) { anyhow::bail!("request classifier is already configured"); } - Ok(self) + tracing::info!(model = %self.tracking_model_name, "installed linked request classifier"); + Ok(()) } /// Cached per-rank capacity and registration state for this router's classifier. diff --git a/lib/llm/src/kv_router/embedded.rs b/lib/llm/src/kv_router/embedded.rs index 747e5e587db9..39a69a7c1131 100644 --- a/lib/llm/src/kv_router/embedded.rs +++ b/lib/llm/src/kv_router/embedded.rs @@ -182,20 +182,6 @@ pub(crate) struct EmbeddedSelection { queue_metric_indices: HashMap, } -static INSTALLED_POLICY_REGISTRY: OnceLock = OnceLock::new(); - -/// Install the process-wide worker-selection policy registry (linked custom -/// policies) that embedded selection partitions resolve `KvRouterConfig` -/// policy instances against. Returns `false` if one is already installed. -pub fn install_worker_selection_policy_registry(registry: WorkerSelectionPolicyRegistry) -> bool { - INSTALLED_POLICY_REGISTRY.set(registry).is_ok() -} - -/// The installed registry, or the built-in default. -pub fn worker_selection_policy_registry() -> WorkerSelectionPolicyRegistry { - INSTALLED_POLICY_REGISTRY.get().cloned().unwrap_or_default() -} - /// Bridges the partition's scheduler load snapshots to the router's /// `SchedulerLoadSender`, which feeds `KvWorkerMonitor`, and its per-worker /// load to the frontend gauges. @@ -270,6 +256,7 @@ impl EmbeddedSelection { WorkerSelectionPolicyRegistry::default(), ) .worker_selection_policy_factory(args.policy_factory) + .host_manages_request_lifecycle() .indexer_threads(1) .host(SelectionHost { load: HostLoad { diff --git a/lib/llm/src/kv_router/plugins.rs b/lib/llm/src/kv_router/plugins.rs new file mode 100644 index 000000000000..6d6354795702 --- /dev/null +++ b/lib/llm/src/kv_router/plugins.rs @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Host construction for the resolved router plugin bundle. + +use std::sync::OnceLock; + +use dynamo_kv_router::plugins::{RouterPluginRegistry, RouterPlugins}; + +use super::{KvRouter, SelectionPolicySource}; + +static INSTALLED_PLUGINS: OnceLock = OnceLock::new(); + +/// Install the linked catalog once for frontend and embedded router construction. +/// Returns `false` if a catalog has already been installed. +pub fn install_router_plugin_registry(registry: RouterPluginRegistry) -> bool { + INSTALLED_PLUGINS.set(registry).is_ok() +} + +/// The installed catalog, or an empty registry for Dynamo's default policies. +pub fn router_plugin_registry() -> RouterPluginRegistry { + INSTALLED_PLUGINS.get().cloned().unwrap_or_default() +} + +/// Carries configured plugins through the host's shared router construction. +#[derive(Clone, Default)] +pub struct RouterPluginBuilder { + plugins: RouterPlugins, +} + +impl RouterPluginBuilder { + pub fn new(plugins: RouterPlugins) -> Self { + Self { plugins } + } + + pub(crate) fn validate_config( + &self, + config: &dynamo_kv_router::KvRouterConfig, + ) -> anyhow::Result<()> { + if config.request_classifier_config()?.is_some() + && self.plugins.request_classifier().is_none() + { + anyhow::bail!( + "request_classifier is configured but not installed; supply a resolved RouterPlugins bundle" + ); + } + Ok(()) + } + + pub(crate) fn selection_policy(&self) -> SelectionPolicySource { + self.plugins.worker_selection().cloned().map_or( + SelectionPolicySource::Registry, + SelectionPolicySource::Factory, + ) + } + + pub(crate) fn install(&self, router: &KvRouter) -> anyhow::Result<()> { + if let Some(factory) = self.plugins.request_classifier() { + router.install_request_classifier(factory(router.request_classifier_context()))?; + } + Ok(()) + } +} diff --git a/lib/mocker/src/replay/router_shared.rs b/lib/mocker/src/replay/router_shared.rs index cdd9fc2f9d26..5859782f94b5 100644 --- a/lib/mocker/src/replay/router_shared.rs +++ b/lib/mocker/src/replay/router_shared.rs @@ -115,6 +115,9 @@ pub(super) fn replay_selector_with_seed( config: &KvRouterConfig, selector_seed: Option, ) -> anyhow::Result { + if config.request_classifier_config()?.is_some() { + anyhow::bail!("offline replay does not support request_classifier plugins"); + } if let Some(instance) = config .selected_worker_selection_policy_instance() .map_err(anyhow::Error::from)? @@ -146,6 +149,24 @@ pub(crate) fn replay_router_config( mod tests { use super::*; + #[test] + fn replay_selector_rejects_request_classifier() { + let policy = tempfile::NamedTempFile::new().unwrap(); + std::fs::write(policy.path(), "request_classifier: {type: test}").unwrap(); + let config = KvRouterConfig { + router_policy_config: Some(policy.path().display().to_string()), + ..Default::default() + }; + let Err(error) = replay_selector(&config) else { + panic!("classifier ignored") + }; + assert!( + error + .to_string() + .contains("offline replay does not support request_classifier") + ); + } + #[test] fn replay_selector_rejects_custom_worker_selection() { let policy_file = tempfile::NamedTempFile::new().unwrap(); diff --git a/lib/router-plugins/builtin/src/lib.rs b/lib/router-plugins/builtin/src/lib.rs index 1440ecf8de88..06e8993e9303 100644 --- a/lib/router-plugins/builtin/src/lib.rs +++ b/lib/router-plugins/builtin/src/lib.rs @@ -20,9 +20,7 @@ mod two_tier_cost_fn; -use dynamo_kv_router::services::selection::{ - WorkerSelectionPolicyRegistry, WorkerSelectionPolicyRegistryError, -}; +use dynamo_kv_router::plugins::{RouterPluginRegistry, WorkerSelectionPolicyRegistryError}; /// Register every policy Dynamo ships. /// @@ -30,14 +28,14 @@ use dynamo_kv_router::services::selection::{ /// can shadow it. A later catalog that reuses one of these type names fails registration rather /// than overriding it. pub fn register( - registry: &mut WorkerSelectionPolicyRegistry, + registry: &mut RouterPluginRegistry, ) -> Result<(), WorkerSelectionPolicyRegistryError> { two_tier_cost_fn::register(registry) } #[cfg(test)] mod tests { - use dynamo_kv_router::services::selection::WorkerSelectionPolicyFactory; + use dynamo_kv_router::plugins::worker_selection::WorkerSelectionPolicyFactory; use dynamo_kv_router::{KvRouterConfig, RoutingPartitionRef, WorkerType}; use super::*; @@ -57,7 +55,7 @@ mod tests { ..Default::default() }; - let mut registry = WorkerSelectionPolicyRegistry::default(); + let mut registry = RouterPluginRegistry::default(); register(&mut registry).unwrap(); let resolved = registry.resolve(&config); (config, resolved) diff --git a/lib/router-plugins/builtin/src/two_tier_cost_fn.rs b/lib/router-plugins/builtin/src/two_tier_cost_fn.rs index bceff369fadf..f4a2a3f3bf37 100644 --- a/lib/router-plugins/builtin/src/two_tier_cost_fn.rs +++ b/lib/router-plugins/builtin/src/two_tier_cost_fn.rs @@ -29,14 +29,15 @@ use std::sync::Arc; -use dynamo_kv_router::services::selection::{ - WorkerSelectionPolicyFactory, WorkerSelectionPolicyParameters, - WorkerSelectionPolicyProviderError, WorkerSelectionPolicyRegistry, - WorkerSelectionPolicyRegistryError, -}; -use dynamo_kv_router::{ - KvRouterConfig, WorkerCacheInput, WorkerInputView, WorkerInputs, WorkerLoadInput, WorkerPicker, +use dynamo_kv_router::KvRouterConfig; +use dynamo_kv_router::plugins::worker_selection::{ + WorkerCacheInput, WorkerInputView, WorkerInputs, WorkerLoadInput, WorkerPicker, WorkerSelectionContext, WorkerSelectionPolicy, WorkerSelectionPolicyError, + WorkerSelectionPolicyFactory, +}; +use dynamo_kv_router::plugins::{ + RouterPluginRegistry, WorkerSelectionPolicyParameters, WorkerSelectionPolicyProviderError, + WorkerSelectionPolicyRegistryError, }; /// Policy type selected by `worker_selection.instances[].type`. @@ -177,9 +178,9 @@ fn provider( } pub fn register( - registry: &mut WorkerSelectionPolicyRegistry, + registry: &mut RouterPluginRegistry, ) -> Result<(), WorkerSelectionPolicyRegistryError> { - registry.register(POLICY_TYPE, Arc::new(provider)) + registry.register_worker_selection(POLICY_TYPE, Arc::new(provider)) } #[cfg(test)] diff --git a/lib/router-plugins/catalog/src/lib.rs b/lib/router-plugins/catalog/src/lib.rs index c248e44a82fa..b37d2104e8b4 100644 --- a/lib/router-plugins/catalog/src/lib.rs +++ b/lib/router-plugins/catalog/src/lib.rs @@ -3,19 +3,21 @@ //! The empty catalog used when a custom image does not replace Dynamo's catalog slot. -use dynamo_kv_router::services::selection::{ - WorkerSelectionPolicyRegistry, WorkerSelectionPolicyRegistryError, -}; +use dynamo_kv_router::plugins::{RouterPluginRegistry, WorkerSelectionPolicyRegistryError}; /// Register policies linked into this image. /// /// Custom catalogs replace this crate and register their own factories. The default catalog is /// intentionally empty so `default` always selects Dynamo's built-in worker selector. /// +/// The same registry also accepts request classifiers through `register_request_classifier`. +/// A catalog that supplies both plugin types can return `Result<(), Box>` +/// while worker-only catalogs can return `WorkerSelectionPolicyRegistryError`. +/// /// The policies Dynamo ships are registered separately from `dynamo-custom-policy-builtin`, so /// replacing this crate adds policies alongside them rather than displacing them. pub fn register( - _registry: &mut WorkerSelectionPolicyRegistry, + _registry: &mut RouterPluginRegistry, ) -> Result<(), WorkerSelectionPolicyRegistryError> { Ok(()) } From caafba8de224d2e2353b282f0755c0b58e43d431 Mon Sep 17 00:00:00 2001 From: "bin.pan" Date: Sun, 20 Sep 2026 05:51:54 +0800 Subject: [PATCH 128/191] feat(llm): support root-level thinking_token_budget for chat and responses (#12624) Signed-off-by: bin Signed-off-by: Biswa Panda Co-authored-by: Biswa Panda --- .../src/dynamo/common/utils/input_params.py | 12 ++ .../src/dynamo/frontend/vllm_processor.py | 14 +- components/src/dynamo/vllm/handlers.py | 11 +- .../src/dynamo/vllm/tests/test_vllm_unit.py | 27 ++++ lib/llm/src/discovery/watcher.rs | 1 + lib/llm/src/entrypoint/input/text.rs | 1 + lib/llm/src/http/service/openai.rs | 9 ++ .../src/preprocessor/speculative_prefill.rs | 1 + lib/llm/src/protocols/anthropic/types.rs | 1 + lib/llm/src/protocols/common/input_trigger.rs | 3 + lib/llm/src/protocols/openai.rs | 10 +- .../src/protocols/openai/chat_completions.rs | 78 +++++++++- .../openai/chat_completions/delta.rs | 2 + lib/llm/src/protocols/openai/responses/mod.rs | 90 +++++++++++- lib/llm/src/protocols/unified.rs | 22 +++ .../tests/parallel_tool_call_integration.rs | 1 + lib/llm/tests/preprocessor.rs | 3 + lib/llm/tests/test_common_ext.rs | 3 + lib/llm/tests/test_streaming_usage.rs | 2 + lib/llm/tests/tool_choice.rs | 1 + lib/llm/tests/tool_choice_finish_reasons.rs | 1 + .../frontend/test_vllm_prepost_integration.py | 135 ++++++++++++++++++ 22 files changed, 413 insertions(+), 15 deletions(-) diff --git a/components/src/dynamo/common/utils/input_params.py b/components/src/dynamo/common/utils/input_params.py index 1e8c38cde9e4..9c88cb7046e2 100644 --- a/components/src/dynamo/common/utils/input_params.py +++ b/components/src/dynamo/common/utils/input_params.py @@ -4,6 +4,18 @@ from typing import Any, Optional +def resolve_thinking_token_budget(request: dict) -> Optional[Any]: + """Resolve the thinking-token budget from an OpenAI-compatible request. + + Supports both the OpenAI-compatible root-level field + ``thinking_token_budget`` and the legacy Dynamo extension + ``nvext.max_thinking_tokens``. The root-level field takes precedence. + """ + root = request.get("thinking_token_budget") + legacy = (request.get("nvext") or {}).get("max_thinking_tokens") + return root if root is not None else legacy + + def _inject_reasoning_content(messages: list) -> None: """Inject reasoning_content as blocks into content. diff --git a/components/src/dynamo/frontend/vllm_processor.py b/components/src/dynamo/frontend/vllm_processor.py index e68322625863..e3f294b1706b 100644 --- a/components/src/dynamo/frontend/vllm_processor.py +++ b/components/src/dynamo/frontend/vllm_processor.py @@ -38,6 +38,7 @@ ) from dynamo.common.multimodal.routing_utils import build_mm_routing_info_from_features from dynamo.common.utils import nvtx_utils as _nvtx +from dynamo.common.utils.input_params import resolve_thinking_token_budget from dynamo.frontend.frontend_args import FrontendConfig from dynamo.llm import ModelCardInstanceId, PythonAsyncEngine, RoutedEngine from dynamo.llm.exceptions import HttpError @@ -710,7 +711,7 @@ async def _generator_inner( sampling_fields = ( set(getattr(SamplingParams, "__annotations__", ())) & set(type(request_for_sampling).model_fields) - ) - {"max_tokens", "logprobs", "output_kind"} + ) - {"max_tokens", "logprobs", "output_kind", "thinking_token_budget"} for k in sorted(sampling_fields): v = getattr(request_for_sampling, k, None) if v is not None: @@ -719,11 +720,10 @@ async def _generator_inner( # frontend's InputProcessor is built without reasoning_config (it only # tokenizes), so setting sampling_params.thinking_token_budget would # cause process_inputs._validate_params to reject the request. Pluck - # the value out of nvext and pass it directly into dynamo_preproc - # below. - nvext_max_thinking_tokens = (request.get("nvext") or {}).get( - "max_thinking_tokens" - ) + # the value out of the request and pass it directly into dynamo_preproc + # below. Prefer the OpenAI-compatible root-level field, fall back to the + # legacy nvext passthrough. + thinking_token_budget = resolve_thinking_token_budget(request) with _nvtx.annotate("mm_frontend:process_inputs", color="orange"): # render_messages_async returns a raw prompt. Convert it to a typed @@ -770,7 +770,7 @@ async def _generator_inner( "stop_token_ids": sp.stop_token_ids, "min_tokens": sp.min_tokens, "ignore_eos": sp.ignore_eos, - "max_thinking_tokens": nvext_max_thinking_tokens, + "max_thinking_tokens": thinking_token_budget, }, "sampling_options": { "n": sp.n, diff --git a/components/src/dynamo/vllm/handlers.py b/components/src/dynamo/vllm/handlers.py index cea26280da65..59fc0a8d0fed 100644 --- a/components/src/dynamo/vllm/handlers.py +++ b/components/src/dynamo/vllm/handlers.py @@ -68,7 +68,10 @@ from dynamo.common.utils import nvtx_utils as _nvtx from dynamo.common.utils.engine_response import normalize_finish_reason from dynamo.common.utils.guided_json import reject_nonprogressing_guided_json_ref_cycles -from dynamo.common.utils.input_params import InputParamManager +from dynamo.common.utils.input_params import ( + InputParamManager, + resolve_thinking_token_budget, +) from dynamo.common.utils.structural_tag import serialize_structural_tag from dynamo.common.utils.time_section import time_and_log_code_section from dynamo.llm import ( @@ -1000,11 +1003,11 @@ def build_sampling_params_openai( if "min_tokens" in request and request["min_tokens"] is not None: sampling_params.min_tokens = request["min_tokens"] - nvext_max_thinking_tokens = (request.get("nvext") or {}).get("max_thinking_tokens") - if nvext_max_thinking_tokens is not None and hasattr( + thinking_token_budget = resolve_thinking_token_budget(request) + if thinking_token_budget is not None and hasattr( sampling_params, "thinking_token_budget" ): - sampling_params.thinking_token_budget = nvext_max_thinking_tokens + sampling_params.thinking_token_budget = thinking_token_budget return sampling_params diff --git a/components/src/dynamo/vllm/tests/test_vllm_unit.py b/components/src/dynamo/vllm/tests/test_vllm_unit.py index 9729cf8b06ba..b3d700954678 100644 --- a/components/src/dynamo/vllm/tests/test_vllm_unit.py +++ b/components/src/dynamo/vllm/tests/test_vllm_unit.py @@ -2119,6 +2119,33 @@ def test_build_sampling_params_openai_maps_max_thinking_tokens(): assert sp.thinking_token_budget == 1024 +def test_build_sampling_params_openai_maps_root_thinking_token_budget(): + from dynamo.vllm.handlers import build_sampling_params_openai + + request = { + "model": "test-model", + "prompt": "Solve: 1+1.", + "max_tokens": 32, + "thinking_token_budget": 2048, + } + sp = build_sampling_params_openai(request, default_sampling_params={}) + assert sp.thinking_token_budget == 2048 + + +def test_build_sampling_params_openai_root_thinking_token_budget_overrides_nvext(): + from dynamo.vllm.handlers import build_sampling_params_openai + + request = { + "model": "test-model", + "prompt": "Solve: 1+1.", + "max_tokens": 32, + "thinking_token_budget": 2048, + "nvext": {"max_thinking_tokens": 1024}, + } + sp = build_sampling_params_openai(request, default_sampling_params={}) + assert sp.thinking_token_budget == 2048 + + @pytest.mark.asyncio async def test_generate_text_mode_applies_nvext_cache_salt(): from dynamo.vllm.handlers import DecodeWorkerHandler diff --git a/lib/llm/src/discovery/watcher.rs b/lib/llm/src/discovery/watcher.rs index 7b192d9d0efa..0e805059ab0a 100644 --- a/lib/llm/src/discovery/watcher.rs +++ b/lib/llm/src/discovery/watcher.rs @@ -2640,6 +2640,7 @@ request_classifier: nvext: None, chat_template_args: None, thinking: None, + thinking_token_budget: None, media_io_kwargs: None, return_tokens_as_token_ids: None, unsupported_fields: Default::default(), diff --git a/lib/llm/src/entrypoint/input/text.rs b/lib/llm/src/entrypoint/input/text.rs index 6ea9916d4d5a..8c078f9400cd 100644 --- a/lib/llm/src/entrypoint/input/text.rs +++ b/lib/llm/src/entrypoint/input/text.rs @@ -117,6 +117,7 @@ async fn main_loop( thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; diff --git a/lib/llm/src/http/service/openai.rs b/lib/llm/src/http/service/openai.rs index 0bd6f861309f..4ab8316685a5 100644 --- a/lib/llm/src/http/service/openai.rs +++ b/lib/llm/src/http/service/openai.rs @@ -6330,6 +6330,7 @@ mod tests { }, nvext: None, chat_template_args: None, + thinking_token_budget: None, } } @@ -8142,6 +8143,7 @@ mod tests { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; let result = validate_chat_completion_required_fields(&request); @@ -8176,6 +8178,7 @@ mod tests { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; let result = validate_chat_completion_required_fields(&request); @@ -8424,6 +8427,7 @@ mod tests { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; @@ -8456,6 +8460,7 @@ mod tests { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; let result = validate_chat_completion_fields_generic(&request); @@ -8487,6 +8492,7 @@ mod tests { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; let result = validate_chat_completion_fields_generic(&request); @@ -8518,6 +8524,7 @@ mod tests { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; let result = validate_chat_completion_fields_generic(&request); @@ -8551,6 +8558,7 @@ mod tests { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; let result = validate_chat_completion_fields_generic(&request); @@ -8582,6 +8590,7 @@ mod tests { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; let result = validate_chat_completion_fields_generic(&request); diff --git a/lib/llm/src/preprocessor/speculative_prefill.rs b/lib/llm/src/preprocessor/speculative_prefill.rs index 96f368cc6111..ded325493147 100644 --- a/lib/llm/src/preprocessor/speculative_prefill.rs +++ b/lib/llm/src/preprocessor/speculative_prefill.rs @@ -621,6 +621,7 @@ mod tests { nvext, chat_template_args: None, thinking: None, + thinking_token_budget: None, media_io_kwargs: None, return_tokens_as_token_ids: None, unsupported_fields: Default::default(), diff --git a/lib/llm/src/protocols/anthropic/types.rs b/lib/llm/src/protocols/anthropic/types.rs index 80467f3cf2f5..008747c6c40c 100644 --- a/lib/llm/src/protocols/anthropic/types.rs +++ b/lib/llm/src/protocols/anthropic/types.rs @@ -180,6 +180,7 @@ impl TryFrom for NvCreateChatCompletionRequest { None }, thinking: None, + thinking_token_budget: None, media_io_kwargs: None, return_tokens_as_token_ids: None, unsupported_fields: Default::default(), diff --git a/lib/llm/src/protocols/common/input_trigger.rs b/lib/llm/src/protocols/common/input_trigger.rs index 1060c0ac5450..51781d5a513c 100644 --- a/lib/llm/src/protocols/common/input_trigger.rs +++ b/lib/llm/src/protocols/common/input_trigger.rs @@ -159,6 +159,7 @@ mod tests { nvext: None, chat_template_args: None, thinking: None, + thinking_token_budget: None, media_io_kwargs: None, return_tokens_as_token_ids: None, unsupported_fields: Default::default(), @@ -206,6 +207,7 @@ mod tests { }, nvext: None, chat_template_args: None, + thinking_token_budget: None, } } @@ -218,6 +220,7 @@ mod tests { }, nvext: None, chat_template_args: None, + thinking_token_budget: None, } } diff --git a/lib/llm/src/protocols/openai.rs b/lib/llm/src/protocols/openai.rs index 0a8d8a0a4ebd..5fe02773a099 100644 --- a/lib/llm/src/protocols/openai.rs +++ b/lib/llm/src/protocols/openai.rs @@ -119,10 +119,14 @@ pub(crate) trait OpenAIStopConditionsProvider { } /// Get max_thinking_tokens from nvext - /// NOTE: This is currently a passthrough for future thinking budget implementation + /// NOTE: This is a legacy passthrough; prefer root-level `thinking_token_budget`. fn get_max_thinking_tokens(&self) -> Option { self.nvext().and_then(|nv| nv.max_thinking_tokens) } + + fn get_thinking_token_budget(&self) -> Option { + None + } } pub(crate) trait OpenAIOutputOptionsProvider { @@ -218,7 +222,9 @@ impl StopConditionsProvider for T { let min_tokens = self.get_min_tokens(); let stop = self.get_stop(); let stop_token_ids = self.get_stop_token_ids(); - let max_thinking_tokens = self.get_max_thinking_tokens(); + let max_thinking_tokens = self + .get_thinking_token_budget() + .or_else(|| self.get_max_thinking_tokens()); if let Some(stop) = &stop && stop.len() > MAX_STOP_SEQUENCES diff --git a/lib/llm/src/protocols/openai/chat_completions.rs b/lib/llm/src/protocols/openai/chat_completions.rs index 24283c2b7796..9080f03b63a3 100644 --- a/lib/llm/src/protocols/openai/chat_completions.rs +++ b/lib/llm/src/protocols/openai/chat_completions.rs @@ -84,7 +84,7 @@ pub(crate) fn tool_call_response_chunk_to_protocol( /// - `common`: Common extension fields (ignore_eos, min_tokens) at root level, embedded using `serde(flatten)`. /// - `nvext`: The optional NVIDIA extension field. See [`NvExt`] for more details. /// Note: If ignore_eos is specified in both common and nvext, the common (root-level) value takes precedence. -#[derive(ToSchema, Serialize, Deserialize, Validate, Debug, Clone)] +#[derive(ToSchema, Serialize, Deserialize, Validate, Debug, Clone, Default)] pub struct NvCreateChatCompletionRequest { #[serde(flatten)] #[schema(value_type = Object)] @@ -111,6 +111,12 @@ pub struct NvCreateChatCompletionRequest { #[serde(default, skip_serializing_if = "Option::is_none")] pub thinking: Option, + /// OpenAI-style thinking token budget: bounds the number of thinking + /// tokens generated per request. Forwarded to the backend's + /// `thinking_token_budget` sampling parameter when supported. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub thinking_token_budget: Option, + /// Runtime media decoding parameters, forwarded verbatim to the worker when the /// worker owns decoding. When the frontend decodes, these override the MDC defaults. /// Kept opaque so options the frontend does not own pass through untouched. @@ -554,6 +560,11 @@ impl OpenAIStopConditionsProvider for NvCreateChatCompletionRequest { fn get_ignore_eos(&self) -> Option { self.common.ignore_eos } + + /// Returns the root-level thinking token budget if set. + fn get_thinking_token_budget(&self) -> Option { + self.thinking_token_budget + } } impl OpenAIOutputOptionsProvider for NvCreateChatCompletionRequest { @@ -1897,4 +1908,69 @@ mod tests { assert!(request.normalize_reasoning_template_args().is_err()); } } + + #[test] + fn test_thinking_token_budget_reaches_stop_conditions() { + let request_json = json!({ + "model": "test-model", + "messages": [{"role": "user", "content": "Hello"}], + "thinking_token_budget": 32 + }); + let request: NvCreateChatCompletionRequest = + serde_json::from_value(request_json).expect("Failed to deserialize request"); + + ValidateRequest::validate(&request).expect("thinking_token_budget must be valid"); + let stop_conditions = request + .extract_stop_conditions() + .expect("Failed to extract stop conditions"); + assert_eq!(stop_conditions.max_thinking_tokens, Some(32)); + } + + #[test] + fn test_thinking_token_budget_overrides_nvext() { + let request_json = json!({ + "model": "test-model", + "messages": [{"role": "user", "content": "Hello"}], + "thinking_token_budget": 32, + "nvext": {"max_thinking_tokens": 16} + }); + let request: NvCreateChatCompletionRequest = + serde_json::from_value(request_json).expect("Failed to deserialize request"); + + let stop_conditions = request + .extract_stop_conditions() + .expect("Failed to extract stop conditions"); + assert_eq!(stop_conditions.max_thinking_tokens, Some(32)); + } + + #[test] + fn test_nvext_max_thinking_tokens_fallback() { + let request_json = json!({ + "model": "test-model", + "messages": [{"role": "user", "content": "Hello"}], + "nvext": {"max_thinking_tokens": 16} + }); + let request: NvCreateChatCompletionRequest = + serde_json::from_value(request_json).expect("Failed to deserialize request"); + + let stop_conditions = request + .extract_stop_conditions() + .expect("Failed to extract stop conditions"); + assert_eq!(stop_conditions.max_thinking_tokens, Some(16)); + } + + #[test] + fn test_omitted_thinking_token_budget_is_none() { + let request_json = json!({ + "model": "test-model", + "messages": [{"role": "user", "content": "Hello"}] + }); + let request: NvCreateChatCompletionRequest = + serde_json::from_value(request_json).expect("Failed to deserialize request"); + + let stop_conditions = request + .extract_stop_conditions() + .expect("Failed to extract stop conditions"); + assert_eq!(stop_conditions.max_thinking_tokens, None); + } } diff --git a/lib/llm/src/protocols/openai/chat_completions/delta.rs b/lib/llm/src/protocols/openai/chat_completions/delta.rs index 3bbd5c326e87..00253caa9b6e 100644 --- a/lib/llm/src/protocols/openai/chat_completions/delta.rs +++ b/lib/llm/src/protocols/openai/chat_completions/delta.rs @@ -390,6 +390,7 @@ mod tests { media_io_kwargs: None, return_tokens_as_token_ids: None, unsupported_fields: Default::default(), + ..Default::default() } } @@ -757,6 +758,7 @@ mod tests { media_io_kwargs: None, return_tokens_as_token_ids: None, unsupported_fields: Default::default(), + ..Default::default() } } diff --git a/lib/llm/src/protocols/openai/responses/mod.rs b/lib/llm/src/protocols/openai/responses/mod.rs index 8e0c2070af21..f91030697956 100644 --- a/lib/llm/src/protocols/openai/responses/mod.rs +++ b/lib/llm/src/protocols/openai/responses/mod.rs @@ -39,7 +39,7 @@ use super::{OpenAISamplingOptionsProvider, OpenAIStopConditionsProvider}; use crate::protocols::common::extensions::{NvExt, NvExtProvider}; /// Request body for `POST /v1/responses`. -#[derive(ToSchema, Serialize, Deserialize, Validate, Debug, Clone)] +#[derive(ToSchema, Serialize, Deserialize, Validate, Debug, Clone, Default)] pub struct NvCreateResponse { /// Flattened CreateResponse fields (model, input, temperature, etc.). /// @@ -65,6 +65,12 @@ pub struct NvCreateResponse { )] #[schema(value_type = Object)] pub chat_template_args: Option>, + + /// OpenAI-style reasoning token budget: bounds the number of reasoning + /// (thinking) tokens generated per request. Forwarded to the backend's + /// `thinking_token_budget` sampling parameter when supported. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub thinking_token_budget: Option, } #[derive(ToSchema, Deserialize, Validate, Debug, Clone)] @@ -232,6 +238,10 @@ impl OpenAIStopConditionsProvider for NvCreateResponse { fn nvext(&self) -> Option<&NvExt> { self.nvext.as_ref() } + + fn get_thinking_token_budget(&self) -> Option { + self.thinking_token_budget + } } // --------------------------------------------------------------------------- @@ -996,6 +1006,7 @@ impl TryFrom for NvCreateChatCompletionRequest { nvext: resp.nvext, chat_template_args: resp.chat_template_args, thinking: None, + thinking_token_budget: resp.thinking_token_budget, media_io_kwargs: None, return_tokens_as_token_ids: None, unsupported_fields: Default::default(), @@ -1374,6 +1385,7 @@ mod tests { }; use super::*; + use crate::protocols::common::StopConditionsProvider; use crate::types::openai::chat_completions::NvCreateChatCompletionResponse; fn make_response_with_input(text: &str) -> NvCreateResponse { @@ -1392,6 +1404,7 @@ mod tests { ..Default::default() }), chat_template_args: None, + ..Default::default() } } @@ -1411,6 +1424,7 @@ mod tests { }, nvext: None, chat_template_args: None, + thinking_token_budget: None, } } @@ -1542,6 +1556,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -1587,6 +1602,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -1667,6 +1683,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -1709,6 +1726,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -1753,6 +1771,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -1802,6 +1821,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -1842,6 +1862,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -1877,6 +1898,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -1920,6 +1942,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -2037,6 +2060,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -2110,6 +2134,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -2168,6 +2193,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -2224,6 +2250,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -2272,6 +2299,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -2334,6 +2362,7 @@ mod tests { }, nvext: None, chat_template_args: None, + thinking_token_budget: None, }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -2384,6 +2413,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -2460,6 +2490,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); @@ -2534,6 +2565,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); let messages = &chat_req.inner.messages; @@ -2604,6 +2636,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); let messages = &chat_req.inner.messages; @@ -2671,6 +2704,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); let messages = &chat_req.inner.messages; @@ -2729,6 +2763,7 @@ mod tests { }, nvext: None, chat_template_args: None, + ..Default::default() }; let chat_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); let messages = &chat_req.inner.messages; @@ -3953,4 +3988,57 @@ mod tests { // nvext should be omitted when None assert!(json.get("nvext").is_none()); } + + #[test] + fn test_thinking_token_budget_preserved_in_chat_completion_conversion() { + let mut req = make_response_with_input("hi there"); + req.thinking_token_budget = Some(32); + + let nv_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); + assert_eq!(nv_req.thinking_token_budget, Some(32)); + assert_eq!( + nv_req + .extract_stop_conditions() + .expect("failed to extract stop conditions") + .max_thinking_tokens, + Some(32) + ); + } + + #[test] + fn test_thinking_token_budget_overrides_nvext_in_response_conversion() { + let mut req = make_response_with_input("hi there"); + req.thinking_token_budget = Some(32); + req.nvext = Some(NvExt { + max_thinking_tokens: Some(16), + ..Default::default() + }); + + let nv_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); + assert_eq!( + nv_req + .extract_stop_conditions() + .expect("failed to extract stop conditions") + .max_thinking_tokens, + Some(32) + ); + } + + #[test] + fn test_nvext_max_thinking_tokens_fallback_in_response_conversion() { + let mut req = make_response_with_input("hi there"); + req.nvext = Some(NvExt { + max_thinking_tokens: Some(16), + ..Default::default() + }); + + let nv_req: NvCreateChatCompletionRequest = req.try_into().unwrap(); + assert_eq!( + nv_req + .extract_stop_conditions() + .expect("failed to extract stop conditions") + .max_thinking_tokens, + Some(16) + ); + } } diff --git a/lib/llm/src/protocols/unified.rs b/lib/llm/src/protocols/unified.rs index 89da8fe7feed..2821e16c3458 100644 --- a/lib/llm/src/protocols/unified.rs +++ b/lib/llm/src/protocols/unified.rs @@ -428,6 +428,10 @@ impl OpenAIStopConditionsProvider for UnifiedRequest { fn get_common_ignore_eos(&self) -> Option { self.inner.common.ignore_eos } + + fn get_thinking_token_budget(&self) -> Option { + OpenAIStopConditionsProvider::get_thinking_token_budget(&self.inner) + } } impl OpenAIOutputOptionsProvider for UnifiedRequest { @@ -534,6 +538,7 @@ impl UnifiedRequest { #[cfg(test)] mod tests { use super::*; + use crate::protocols::common::StopConditionsProvider; #[test] fn test_chat_completions_roundtrip() { @@ -550,6 +555,7 @@ mod tests { media_io_kwargs: None, return_tokens_as_token_ids: None, unsupported_fields: Default::default(), + ..Default::default() }; let unified = UnifiedRequest::from(req.clone()); @@ -557,6 +563,22 @@ mod tests { assert_eq!(unified.model(), "test-model"); } + #[test] + fn test_thinking_token_budget_reaches_unified_stop_conditions() { + let request: NvCreateChatCompletionRequest = serde_json::from_value(serde_json::json!({ + "model": "test-model", + "messages": [{"role": "user", "content": "Hello"}], + "thinking_token_budget": 32, + "nvext": {"max_thinking_tokens": 16} + })) + .unwrap(); + + let unified = UnifiedRequest::from(request); + let stop_conditions = unified.extract_stop_conditions().unwrap(); + + assert_eq!(stop_conditions.max_thinking_tokens, Some(32)); + } + #[test] fn test_anthropic_context_preserved() { use super::super::anthropic::types::*; diff --git a/lib/llm/tests/parallel_tool_call_integration.rs b/lib/llm/tests/parallel_tool_call_integration.rs index 1760f93095f4..0f13b02c37fa 100644 --- a/lib/llm/tests/parallel_tool_call_integration.rs +++ b/lib/llm/tests/parallel_tool_call_integration.rs @@ -94,6 +94,7 @@ fn create_mock_chat_completion_request() -> NvCreateChatCompletionRequest { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), } } diff --git a/lib/llm/tests/preprocessor.rs b/lib/llm/tests/preprocessor.rs index 147ac78236d8..29faf27d913d 100644 --- a/lib/llm/tests/preprocessor.rs +++ b/lib/llm/tests/preprocessor.rs @@ -264,6 +264,7 @@ impl Request { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), } } @@ -952,6 +953,7 @@ mod context_length_validation { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), } } @@ -1332,6 +1334,7 @@ mod embedding_without_chat_template { media_io_kwargs: None, return_tokens_as_token_ids: None, unsupported_fields: Default::default(), + thinking_token_budget: None, } } diff --git a/lib/llm/tests/test_common_ext.rs b/lib/llm/tests/test_common_ext.rs index debbef4a7fb1..8b0c5ddc6968 100644 --- a/lib/llm/tests/test_common_ext.rs +++ b/lib/llm/tests/test_common_ext.rs @@ -71,6 +71,7 @@ fn test_sampling_parameters_include_stop_str_in_output_extraction() { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; @@ -341,6 +342,7 @@ fn test_serialization_preserves_structure() { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; @@ -395,6 +397,7 @@ fn test_sampling_parameters_extraction() { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), }; diff --git a/lib/llm/tests/test_streaming_usage.rs b/lib/llm/tests/test_streaming_usage.rs index 4025eaa56a21..c42105499066 100644 --- a/lib/llm/tests/test_streaming_usage.rs +++ b/lib/llm/tests/test_streaming_usage.rs @@ -210,6 +210,7 @@ fn create_chat_request( thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), } } @@ -802,6 +803,7 @@ fn create_nonstreaming_chat_request() -> NvCreateChatCompletionRequest { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), } } diff --git a/lib/llm/tests/tool_choice.rs b/lib/llm/tests/tool_choice.rs index 742daa86273d..bc8688439e8e 100644 --- a/lib/llm/tests/tool_choice.rs +++ b/lib/llm/tests/tool_choice.rs @@ -70,6 +70,7 @@ fn create_test_request() -> NvCreateChatCompletionRequest { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), } } diff --git a/lib/llm/tests/tool_choice_finish_reasons.rs b/lib/llm/tests/tool_choice_finish_reasons.rs index dbd521772dc8..eb00ae9d4ec0 100644 --- a/lib/llm/tests/tool_choice_finish_reasons.rs +++ b/lib/llm/tests/tool_choice_finish_reasons.rs @@ -35,6 +35,7 @@ fn create_test_request() -> NvCreateChatCompletionRequest { thinking: None, media_io_kwargs: None, return_tokens_as_token_ids: None, + thinking_token_budget: None, unsupported_fields: Default::default(), } } diff --git a/tests/frontend/test_vllm_prepost_integration.py b/tests/frontend/test_vllm_prepost_integration.py index 661925002487..747009fbb9e6 100644 --- a/tests/frontend/test_vllm_prepost_integration.py +++ b/tests/frontend/test_vllm_prepost_integration.py @@ -313,3 +313,138 @@ def test_vllm_chat_processor_forwards_max_thinking_tokens( captured = _read_captured_request(capture_path) assert captured["stop_conditions"]["max_thinking_tokens"] == 16 + + +@pytest.mark.timeout(180) +def test_vllm_chat_processor_forwards_thinking_token_budget( + start_services: tuple[int, Path], +) -> None: + """Root-level `thinking_token_budget` reaches the worker as + stop_conditions.max_thinking_tokens after the Python frontend processes it.""" + frontend_port, capture_path = start_services + + payload = { + "model": TEST_MODEL, + "messages": [{"role": "user", "content": "Solve: 1+1."}], + "max_tokens": 32, + "thinking_token_budget": 32, + } + + response = requests.post( + f"http://localhost:{frontend_port}/v1/chat/completions", + json=payload, + timeout=60, + ) + response.raise_for_status() + captured = _read_captured_request(capture_path) + + assert captured["stop_conditions"]["max_thinking_tokens"] == 32 + + +@pytest.mark.timeout(180) +def test_vllm_chat_processor_thinking_token_budget_overrides_nvext( + start_services: tuple[int, Path], +) -> None: + """Root-level `thinking_token_budget` takes precedence over the legacy + nvext.max_thinking_tokens field.""" + frontend_port, capture_path = start_services + + payload = { + "model": TEST_MODEL, + "messages": [{"role": "user", "content": "Solve: 1+1."}], + "max_tokens": 32, + "thinking_token_budget": 32, + "nvext": {"max_thinking_tokens": 16}, + } + + response = requests.post( + f"http://localhost:{frontend_port}/v1/chat/completions", + json=payload, + timeout=60, + ) + response.raise_for_status() + captured = _read_captured_request(capture_path) + + assert captured["stop_conditions"]["max_thinking_tokens"] == 32 + + +@pytest.mark.timeout(180) +def test_vllm_responses_processor_forwards_thinking_token_budget( + start_services: tuple[int, Path], +) -> None: + """Root-level `thinking_token_budget` on a request reaches the + worker as stop_conditions.max_thinking_tokens after JSON deserialization.""" + frontend_port, capture_path = start_services + + payload = { + "model": TEST_MODEL, + "input": "Solve: 1+1.", + "max_output_tokens": 32, + "stream": False, + "thinking_token_budget": 32, + } + + response = requests.post( + f"http://localhost:{frontend_port}/v1/responses", + json=payload, + timeout=60, + ) + response.raise_for_status() + captured = _read_captured_request(capture_path) + + assert captured["stop_conditions"]["max_thinking_tokens"] == 32 + + +@pytest.mark.timeout(180) +def test_vllm_responses_processor_thinking_token_budget_overrides_nvext( + start_services: tuple[int, Path], +) -> None: + """Root-level `thinking_token_budget` takes precedence over the legacy + nvext.max_thinking_tokens field.""" + frontend_port, capture_path = start_services + + payload = { + "model": TEST_MODEL, + "input": "Solve: 1+1.", + "max_output_tokens": 32, + "stream": False, + "thinking_token_budget": 32, + "nvext": {"max_thinking_tokens": 16}, + } + + response = requests.post( + f"http://localhost:{frontend_port}/v1/responses", + json=payload, + timeout=60, + ) + response.raise_for_status() + captured = _read_captured_request(capture_path) + + assert captured["stop_conditions"]["max_thinking_tokens"] == 32 + + +@pytest.mark.timeout(180) +def test_vllm_responses_processor_forwards_max_thinking_tokens( + start_services: tuple[int, Path], +) -> None: + """Legacy nvext.max_thinking_tokens alone on request still + reaches the worker as stop_conditions.max_thinking_tokens.""" + frontend_port, capture_path = start_services + + payload = { + "model": TEST_MODEL, + "input": "Solve: 1+1.", + "max_output_tokens": 32, + "stream": False, + "nvext": {"max_thinking_tokens": 16}, + } + + response = requests.post( + f"http://localhost:{frontend_port}/v1/responses", + json=payload, + timeout=60, + ) + response.raise_for_status() + captured = _read_captured_request(capture_path) + + assert captured["stop_conditions"]["max_thinking_tokens"] == 16 From bcec7eae7117abace3b7f7aeb92e45173f34fc11 Mon Sep 17 00:00:00 2001 From: Pei Li Date: Sat, 19 Sep 2026 18:47:22 -0700 Subject: [PATCH 129/191] feat: shard the SGLang worker gateway across processes (--gateway-workers) (#15078) --- components/src/dynamo/sglang/AGENTS.md | 50 ++ components/src/dynamo/sglang/backend_args.py | 19 + components/src/dynamo/sglang/gateway.py | 370 +++++++++++++++ components/src/dynamo/sglang/init_llm.py | 57 ++- components/src/dynamo/sglang/main.py | 28 ++ components/src/dynamo/sglang/publisher.py | 127 +++-- components/src/dynamo/sglang/register.py | 16 + .../sglang/request_handlers/handler_base.py | 8 + .../sglang/tests/test_sglang_gateway.py | 448 ++++++++++++++++++ .../sglang/tests/test_sglang_publisher.py | 158 +++++- lib/bindings/python/rust/lib.rs | 70 +++ lib/bindings/python/src/dynamo/_core.pyi | 13 + 12 files changed, 1314 insertions(+), 50 deletions(-) create mode 100644 components/src/dynamo/sglang/gateway.py create mode 100644 components/src/dynamo/sglang/tests/test_sglang_gateway.py diff --git a/components/src/dynamo/sglang/AGENTS.md b/components/src/dynamo/sglang/AGENTS.md index 0d9e87816945..47439a27ac31 100644 --- a/components/src/dynamo/sglang/AGENTS.md +++ b/components/src/dynamo/sglang/AGENTS.md @@ -30,6 +30,56 @@ support the current version plus 1 version back (N and N-1). The pattern: component files. Do not version-check with `sglang.__version__` -- import probing is more reliable since SGLang's internal layout doesn't always match the version string. +## Multi-process gateway (`--gateway-workers N`) + +`gateway.py`. One `dynamo.sglang` process fronts every DP rank of its engine: SGLang's +`TokenizerManager` intake and the Dynamo handler's token relay run on one GIL. With +`--tokenizer-worker-num N > 1` SGLang puts a `MultiTokenizerRouter` in the engine process; it +has no `generate_request`, so the leader (node rank 0) does not serve. Instead it publishes +the launch data with SGLang's shared-memory contract (`write_data_for_multi_tokenizer`) and +spawns N children, `python -m dynamo.sglang ` with `DYN_SGLANG_GATEWAY_PARENT_PID` +and `DYN_SGLANG_GATEWAY_CHILD_INDEX` set. A child builds a `TokenizerWorker` registered with +the router (`build_gateway_engine`), wraps it in `GatewayEngine` (what the handlers use of an +`sgl.Engine`: `tokenizer_manager`, `server_args`, `port_args`, `async_generate`, scheduler +info) and runs the ordinary `init_decode`/`init_prefill` path as its own endpoint instance +(`attached_engine=`, distinct from `snapshot_engine=`), so the router sees N instances per +engine. If SGLang exposes `Engine.attach_tokenizer_worker`, children use it instead of the +facade. + +Configuration (`effective_gateway_workers`, `validate_gateway_mode`, applied in `main.py` +before snapshot preparation and runtime creation): `--gateway-workers N` sets +`tokenizer_worker_num` to N; `--tokenizer-worker-num N` alone means N gateways; a tokenizer count +above 1 that differs from `--gateway-workers` is an error. Gateway mode is rejected for the direct-engine workers +(embedding, rerank, multimodal, diffusion), with `--enable-lora` (dynamic LoRA state would +live in one child), with `--enable-forward-pass-metrics` (the schedulers stamp FPM with the +non-serving leader's identity) and in snapshot mode. + +Ports and metrics: the leader gives `DYN_SYSTEM_PORT` to child 0 and runs without a system +status server; the other children bind a random system port (`DYN_SYSTEM_PORT=0`, logged by the +runtime), because any fixed offset can collide with another worker group's configured port. +Engine-target `--engine-routes` need `Engine.attach_tokenizer_worker`; the facade only exposes +the tokenizer manager. +The schedulers push KV metrics to one PULL socket: child 0 (`owns_engine_metrics()`) binds it +and re-publishes every `KvMetrics` on an ipc PUB (`metrics_fanout_endpoint()`) that the other +children subscribe to, so every gateway identity reports the engine's real KV usage. Every +child republishes KV events under its own worker id, otherwise the router would see prefixes +on instance 0 only; the cost is N copies of each KV event. On multi-node engines the +non-leader nodes resolve all N leader instances by worker group id +(`Client.wait_for_instances_by_runtime_data`) and attribute their remote-rank KV events to +each. Only the metrics owner publishes the engine-level gauges (total blocks, cache +usage, load time), so a scrape across children counts the engine once; every child still publishes +its own routing usage. Each child's model card carries `dynamo.sglang.gateway_engine` +(`host:leader_pid`) and `dynamo.sglang.gateway_workers`, so anything that counts workers or sums +per-worker capacity from discovery can collapse the N instances of one engine. Only child 0's +system port is fixed; sibling health lives on random ports, so fixed probes see one of N processes. + +Lifecycle: the leader owns the engine subprocesses and the shared memory, runs the deferred +shutdown handlers, and terminates and reaps the children with the worker's own shutdown budget +(`DYN_GRACEFUL_SHUTDOWN_GRACE_PERIOD_SECS` + drain + cleanup); a child exiting during shutdown is +not an error. Children run a parent watchdog (`PR_SET_PDEATHSIG` plus a liveness poll) and +SIGTERM themselves when the leader dies, since without the schedulers they would stay registered +and fail every request. + ## Entry Point `__main__.py` -> `main.py:main()` -> `main.py:worker()` diff --git a/components/src/dynamo/sglang/backend_args.py b/components/src/dynamo/sglang/backend_args.py index ee37ee7ade31..f5e269428617 100644 --- a/components/src/dynamo/sglang/backend_args.py +++ b/components/src/dynamo/sglang/backend_args.py @@ -67,6 +67,22 @@ def add_arguments(self, parser: argparse.ArgumentParser) -> None: "the same SGLang-native pre/post processing with KV router support.", ) + add_argument( + g, + flag_name="--gateway-workers", + env_var="DYN_SGL_GATEWAY_WORKERS", + default=None, + arg_type=int, + help="Run N gateway processes in front of this engine, each a Dynamo " + "endpoint instance with its own SGLang request gateway (SGLang calls " + "that process a tokenizer worker; it also handles request intake and " + "output relay, which is the work being spread). Sets SGLang's " + "--tokenizer-worker-num to N; a --tokenizer-worker-num above 1 that " + "differs from N is an error, and --tokenizer-worker-num N alone runs N " + "gateways as well. Decode and prefill LLM workers only; not with " + "--enable-lora, --enable-forward-pass-metrics or snapshot mode. Child 0 " + "takes DYN_SYSTEM_PORT, the other children bind a random system port.", + ) add_negatable_bool_argument( g, flag_name="--enable-multimodal", @@ -187,6 +203,7 @@ class DynamoSGLangConfig(ConfigBase): """Configuration for Dynamo SGLang wrapper (SGLang-specific only).""" use_sglang_tokenizer: bool + gateway_workers: Optional[int] = None # Internal roles derived from the canonical multimodal arguments in args.py. multimodal_encode_worker: bool = False multimodal_worker: bool = False @@ -234,6 +251,8 @@ def validate(self) -> None: "Both 'disagg_config' and 'disagg_config_key' must be provided together." ) + if self.gateway_workers is not None and self.gateway_workers < 1: + raise ValueError("--gateway-workers must be a positive integer") self.validate_multimodal_topology() self.validate_dedicated_mm_encoder() diff --git a/components/src/dynamo/sglang/gateway.py b/components/src/dynamo/sglang/gateway.py new file mode 100644 index 000000000000..a0610b06377d --- /dev/null +++ b/components/src/dynamo/sglang/gateway.py @@ -0,0 +1,370 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +"""Multi-process request gateway for the SGLang worker: the leader keeps the engine +and spawns N ``dynamo.sglang`` children that each serve requests through their own +SGLang ``TokenizerWorker``. Design notes: AGENTS.md, "Multi-process gateway". +""" + +from __future__ import annotations + +import asyncio +import ctypes +import logging +import os +import signal +import socket +import subprocess +import sys +import tempfile +import threading +import types +from typing import Awaitable, Callable, Optional + +import sglang as sgl + +from dynamo.common.snapshot.constants import SNAPSHOT_CONTROL_DIR_ENV +from dynamo.common.utils.graceful_shutdown import get_grace_period_seconds + +ENV_PARENT_PID = "DYN_SGLANG_GATEWAY_PARENT_PID" +ENV_CHILD_INDEX = "DYN_SGLANG_GATEWAY_CHILD_INDEX" +ENV_SYSTEM_PORT = "DYN_SYSTEM_PORT" +ENV_SYSTEM_PORT_BASE = "DYN_SGLANG_GATEWAY_SYSTEM_PORT" +ENV_LOAD_TIME = "DYN_SGLANG_GATEWAY_LOAD_TIME_S" +# Runtime-data keys on every gateway child's model card: consumers that count +# workers or sum per-worker capacity can collapse the N instances of one engine. +GATEWAY_ENGINE_ID_KEY = "dynamo.sglang.gateway_engine" +GATEWAY_WORKERS_KEY = "dynamo.sglang.gateway_workers" +# Children drain like any worker (grace + drain + cleanup); give them that budget. +CHILD_DRAIN_AND_CLEANUP_SECS = 60.0 + +DIRECT_ENGINE_WORKER_FLAGS = ( + "image_diffusion_worker", + "video_generation_worker", + "rerank_worker", + "embedding_worker", + "multimodal_encode_worker", + "multimodal_worker", + "diffusion_worker", +) + + +class GatewayEngine: + """What the request handlers need from an ``sgl.Engine``. + + A child never owns scheduler processes; it only holds a ``TokenizerWorker`` bound + to the parent's router. ``Engine.async_generate`` only touches + ``self.tokenizer_manager``, so it can be reused unchanged. + """ + + def __init__(self, tokenizer_manager, server_args, port_args, scheduler_info): + self.tokenizer_manager = tokenizer_manager + self.server_args = server_args + self.port_args = port_args + self._scheduler_init_result = types.SimpleNamespace( + scheduler_infos=[scheduler_info] + ) + + async_generate = sgl.Engine.async_generate + _resolve_routed_dp_rank = sgl.Engine._resolve_routed_dp_rank + + def shutdown(self): + pass + + +def is_gateway_child() -> bool: + return ENV_PARENT_PID in os.environ + + +def gateway_child_index() -> int: + return int(os.environ.get(ENV_CHILD_INDEX, "0")) + + +def owns_engine_metrics() -> bool: + """SGLang's schedulers push KV metrics to one PULL socket, so exactly one gateway + process may consume them: child 0 (or the single worker when the mode is off).""" + return gateway_child_index() == 0 + + +def effective_gateway_workers(server_args, dynamo_args) -> int: + """Gateway count implied by ``--gateway-workers`` and ``--tokenizer-worker-num``. + + The engine runs one SGLang tokenizer worker per gateway process. A tokenizer + count above 1 that differs from ``--gateway-workers`` is an error rather than a + silent choice; the default of 1 lets ``--gateway-workers N`` stand alone.""" + requested = getattr(dynamo_args, "gateway_workers", None) + tokenizer_workers = getattr(server_args, "tokenizer_worker_num", 1) or 1 + if requested is None: + return tokenizer_workers + if tokenizer_workers > 1 and tokenizer_workers != requested: + raise ValueError( + f"--gateway-workers {requested} conflicts with --tokenizer-worker-num " + f"{tokenizer_workers}: each gateway process is one SGLang tokenizer " + "worker, so drop --tokenizer-worker-num or give both the same value" + ) + return requested + + +def gateway_worker_count(server_args, dynamo_args) -> int: + if (getattr(server_args, "node_rank", 0) or 0) != 0 or is_gateway_child(): + return 1 + return effective_gateway_workers(server_args, dynamo_args) + + +def validate_gateway_mode(server_args, dynamo_args, count: int) -> None: + if count <= 1: + return + direct = [f for f in DIRECT_ENGINE_WORKER_FLAGS if getattr(dynamo_args, f, False)] + if direct: + raise ValueError( + "gateway mode (--gateway-workers / --tokenizer-worker-num > 1) is only " + "supported by the decode and prefill LLM workers, not with " + f"--{direct[0].replace('_', '-')}" + ) + if getattr(server_args, "enable_lora", False): + raise ValueError( + "gateway mode is not supported with --enable-lora: dynamic LoRA state " + "lives in each gateway process" + ) + if getattr(server_args, "enable_forward_pass_metrics", False): + raise ValueError( + "gateway mode is not supported with --enable-forward-pass-metrics: the " + "schedulers stamp forward-pass metrics with the identity of the process " + "that created the engine, which serves no requests in gateway mode" + ) + if os.environ.get(SNAPSHOT_CONTROL_DIR_ENV): + raise ValueError( + "gateway mode is not supported in snapshot mode " + f"({SNAPSHOT_CONTROL_DIR_ENV} is set): snapshot warmup needs a single " + "tokenizer manager" + ) + routes = getattr(dynamo_args, "engine_routes", None) + if routes and getattr(sgl.Engine, "attach_tokenizer_worker", None) is None: + from dynamo.sglang.engine_routes import parse_engine_route_descriptors + + engine_targets = [ + d.path + for d in parse_engine_route_descriptors(routes) + if d.target == "engine" + ] + if engine_targets: + raise ValueError( + "gateway mode with engine-target --engine-routes " + f"({', '.join(engine_targets)}) needs an SGLang with " + "Engine.attach_tokenizer_worker; on this SGLang the gateway children " + "only expose the tokenizer manager" + ) + + +def reserve_system_port_for_children() -> None: + """Leader side, before the runtime starts. The leader serves no requests, so the + configured ``DYN_SYSTEM_PORT`` goes to child 0; the leader runs without a system + status server and the other children bind a random port (0), because any fixed + offset can collide with another worker group's configured port.""" + raw = os.environ.get(ENV_SYSTEM_PORT) + try: + port = int(raw) if raw is not None else -1 + except ValueError: + return + if port <= 0: + return + os.environ[ENV_SYSTEM_PORT_BASE] = str(port) + os.environ[ENV_SYSTEM_PORT] = "-1" + + +def child_environment(index: int, load_time: Optional[float] = None) -> dict[str, str]: + env = { + **os.environ, + ENV_PARENT_PID: str(os.getpid()), + ENV_CHILD_INDEX: str(index), + } + base = env.pop(ENV_SYSTEM_PORT_BASE, None) + if base is not None: + env[ENV_SYSTEM_PORT] = base if index == 0 else "0" + env.pop(ENV_LOAD_TIME, None) + if index == 0 and load_time is not None: + # The leader measured the load; the metrics owner publishes it once. + env[ENV_LOAD_TIME] = repr(load_time) + return env + + +def attached_engine_load_time() -> Optional[float]: + raw = os.environ.get(ENV_LOAD_TIME) + return float(raw) if raw else None + + +def follow_pause_broadcasts( + tokenizer_manager, on_change: Callable[[], Awaitable[None]] +) -> bool: + """A pause or resume issued through any sibling reaches this process only as the + router's broadcast into its ``TokenizerWorker``; run ``on_change`` after each one so + this child's discovery registration follows the shared state.""" + apply = getattr(tokenizer_manager, "_apply_pause_continue_broadcast", None) + if apply is None: + return False + + async def apply_and_follow(obj): + await apply(obj) + await on_change() + + tokenizer_manager._apply_pause_continue_broadcast = apply_and_follow + return True + + +def gateway_engine_id() -> Optional[str]: + pid = os.environ.get(ENV_PARENT_PID) + if pid is None: + return None + return f"{socket.gethostname()}:{pid}" + + +def child_shutdown_timeout() -> float: + return get_grace_period_seconds() + CHILD_DRAIN_AND_CLEANUP_SECS + + +def start_parent_watchdog( + parent_pid: int, + on_parent_death: Optional[Callable[[], None]] = None, + poll_seconds: float = 2.0, +) -> threading.Thread: + """The leader owns the schedulers; a child that outlives it would stay registered + and fail every request. Ask the kernel for SIGTERM on parent death and poll as a + fallback for the window before the flag is set and for non-Linux hosts.""" + if on_parent_death is None: + + def on_parent_death() -> None: + logging.error( + "gateway parent pid=%d is gone; shutting down child pid=%d", + parent_pid, + os.getpid(), + ) + os.kill(os.getpid(), signal.SIGTERM) + + try: + libc = ctypes.CDLL("libc.so.6", use_errno=True) + libc.prctl(1, signal.SIGTERM) # PR_SET_PDEATHSIG + except (OSError, AttributeError): + pass + + def poll() -> None: + while True: + try: + os.kill(parent_pid, 0) + except ProcessLookupError: + on_parent_death() + return + except PermissionError: + pass + if os.getppid() != parent_pid: + on_parent_death() + return + threading.Event().wait(poll_seconds) + + thread = threading.Thread(target=poll, name="gateway-parent-watchdog", daemon=True) + thread.start() + return thread + + +def metrics_fanout_endpoint() -> Optional[str]: + """Where child 0 re-publishes the schedulers' KV metrics for its siblings.""" + pid = os.environ.get(ENV_PARENT_PID) + if pid is None: + return None + return f"ipc://{tempfile.gettempdir()}/dynamo_sglang_gateway_metrics_{pid}" + + +def build_gateway_engine(): + """Child side: join the parent's engine through a ``TokenizerWorker``.""" + parent_pid = int(os.environ[ENV_PARENT_PID]) + start_parent_watchdog(parent_pid) + attach = getattr(sgl.Engine, "attach_tokenizer_worker", None) + if attach is not None: + engine = attach(parent_pid) + logging.info( + "gateway child pid=%d attached via Engine.attach_tokenizer_worker", + os.getpid(), + ) + return engine + + from sglang.srt.managers.multi_tokenizer_mixin import ( + get_tokenizer_worker_class, + read_from_shared_memory, + ) + from sglang.srt.runtime_context import publish + + port_args, server_args, scheduler_info = read_from_shared_memory( + f"multi_tokenizer_args_{parent_pid}" + ) + publish(server_args, role="tokenizer") + port_args.tokenizer_ipc_name = ( + f"ipc://{tempfile.NamedTemporaryFile(delete=False).name}" + ) + tm = get_tokenizer_worker_class(server_args)(server_args, port_args) + tm.max_req_input_len = scheduler_info["max_req_input_len"] + tm.set_startup_time(scheduler_info["startup_time"]) + logging.info( + "gateway child pid=%d registered TokenizerWorker ipc=%s", + os.getpid(), + port_args.tokenizer_ipc_name, + ) + return GatewayEngine(tm, server_args, port_args, scheduler_info) + + +def _reap(proc: subprocess.Popen, timeout: Optional[float] = None) -> None: + try: + proc.wait(timeout=child_shutdown_timeout() if timeout is None else timeout) + except subprocess.TimeoutExpired: + proc.kill() + proc.wait() + + +async def serve_via_gateway_children( + engine, + count: int, + shutdown_event: asyncio.Event, + load_time: Optional[float] = None, +) -> None: + from sglang.srt.managers.multi_tokenizer_mixin import write_data_for_multi_tokenizer + + shm = getattr(engine, "_multi_tokenizer_shm", None) + owns_shm = shm is None + if shm is None: + scheduler_info = { + **engine._scheduler_init_result.scheduler_infos[0], + "startup_time": engine.tokenizer_manager.startup_time, + } + shm = write_data_for_multi_tokenizer( + engine.port_args, engine.server_args, scheduler_info + ) + argv = sys.argv[1:] + procs: list[subprocess.Popen] = [] + try: + for index in range(count): + procs.append( + subprocess.Popen( + [sys.executable, "-m", "dynamo.sglang", *argv], + env=child_environment(index, load_time), + ) + ) + logging.info( + "gateway parent pid=%d spawned %d children: %s", + os.getpid(), + count, + [p.pid for p in procs], + ) + while not shutdown_event.is_set(): + await asyncio.sleep(2) + dead = [p for p in procs if p.poll() is not None] + if dead and not shutdown_event.is_set(): + raise RuntimeError( + f"gateway child pid={dead[0].pid} exited rc={dead[0].returncode}" + ) + finally: + for p in procs: + if p.poll() is None: + p.terminate() + await asyncio.gather(*(asyncio.to_thread(_reap, p) for p in procs)) + if owns_shm: + try: + shm.unlink() + except FileNotFoundError: + pass diff --git a/components/src/dynamo/sglang/init_llm.py b/components/src/dynamo/sglang/init_llm.py index 10236f0e897c..ccff8406e2be 100644 --- a/components/src/dynamo/sglang/init_llm.py +++ b/components/src/dynamo/sglang/init_llm.py @@ -15,6 +15,11 @@ from dynamo.llm import ModelInput, ModelType, WorkerType from dynamo.runtime import DistributedRuntime from dynamo.sglang.args import Config +from dynamo.sglang.gateway import ( + attached_engine_load_time, + gateway_worker_count, + serve_via_gateway_children, +) from dynamo.sglang.health_check import ( SglangDisaggHealthCheckPayload, SglangHealthCheckPayload, @@ -48,6 +53,7 @@ async def init_decode( shutdown_endpoints: list, run_deferred_handlers: Callable[[], Awaitable[None]] | None = None, snapshot_engine: Optional[sgl.Engine] = None, + attached_engine: Optional[object] = None, ) -> None: server_args, dynamo_args = config.server_args, config.dynamo_args @@ -62,6 +68,7 @@ async def init_decode( ) # Use pre-created engine if provided (snapshot mode) + load_time: Optional[float] if snapshot_engine is not None: engine = snapshot_engine load_time = 0.0 @@ -70,6 +77,11 @@ async def init_decode( "Snapshot ServerArgs must disable forward-pass metrics before " "engine creation" ) + elif attached_engine is not None: + # Gateway child: the parent owns the engine, this process only holds a + # TokenizerWorker registered with its router. + engine = attached_engine + load_time = attached_engine_load_time() else: set_forward_pass_metrics_worker_id(server_args, generate_endpoint) start_time = time.time() @@ -77,6 +89,19 @@ async def init_decode( load_time = time.time() - start_time server_args = config.use_resolved_server_args(engine.server_args) + gateway_count = gateway_worker_count(server_args, dynamo_args) + if gateway_count > 1: + # engine.tokenizer_manager is SGLang's MultiTokenizerRouter here and cannot + # serve requests; gateway children do, this process keeps the engine alive. + try: + await serve_via_gateway_children( + engine, gateway_count, shutdown_event, load_time=load_time + ) + finally: + engine.shutdown() + if run_deferred_handlers is not None: + await run_deferred_handlers() + return if server_args.enable_trace: set_global_trace_level(dynamo_args.sglang_trace_level) @@ -100,8 +125,9 @@ async def init_decode( # which take a different init path entirely. Narrow for mypy. assert publisher is not None, "setup_sgl_metrics returned None on chat path" - publisher.component_gauges.set_model_load_time(load_time) - logging.debug(f"SGLang model load time: {load_time:.2f}s") + if load_time is not None: + publisher.component_gauges.set_model_load_time(load_time) + logging.debug(f"SGLang model load time: {load_time:.2f}s") if server_args.node_rank >= 1: await handle_non_leader_node(engine, publisher, metrics_task) @@ -129,6 +155,8 @@ async def init_decode( first_token_source=first_token_source, ) handler.register_engine_routes(runtime) + if attached_engine is not None: + handler.follow_shared_pause_state() if config.serving_mode == DisaggregationMode.DECODE: health_check_payload = SglangDisaggHealthCheckPayload( @@ -207,6 +235,7 @@ async def init_prefill( shutdown_endpoints: list, run_deferred_handlers: Callable[[], Awaitable[None]] | None = None, snapshot_engine: Optional[sgl.Engine] = None, + attached_engine: Optional[object] = None, ) -> None: server_args, dynamo_args = config.server_args, config.dynamo_args @@ -221,6 +250,7 @@ async def init_prefill( ) # Use pre-created engine if provided (snapshot mode) + load_time: Optional[float] if snapshot_engine is not None: engine = snapshot_engine load_time = 0.0 @@ -229,6 +259,11 @@ async def init_prefill( "Snapshot ServerArgs must disable forward-pass metrics before " "engine creation" ) + elif attached_engine is not None: + # Gateway child: the parent owns the engine, this process only holds a + # TokenizerWorker registered with its router. + engine = attached_engine + load_time = attached_engine_load_time() else: set_forward_pass_metrics_worker_id(server_args, generate_endpoint) start_time = time.time() @@ -236,6 +271,19 @@ async def init_prefill( load_time = time.time() - start_time server_args = config.use_resolved_server_args(engine.server_args) + gateway_count = gateway_worker_count(server_args, dynamo_args) + if gateway_count > 1: + # engine.tokenizer_manager is SGLang's MultiTokenizerRouter here and cannot + # serve requests; gateway children do, this process keeps the engine alive. + try: + await serve_via_gateway_children( + engine, gateway_count, shutdown_event, load_time=load_time + ) + finally: + engine.shutdown() + if run_deferred_handlers is not None: + await run_deferred_handlers() + return if server_args.enable_trace: set_global_trace_level(dynamo_args.sglang_trace_level) @@ -259,7 +307,8 @@ async def init_prefill( # which take a different init path entirely. Narrow for mypy. assert publisher is not None, "setup_sgl_metrics returned None on chat path" - publisher.component_gauges.set_model_load_time(load_time) + if load_time is not None: + publisher.component_gauges.set_model_load_time(load_time) if server_args.node_rank >= 1: await handle_non_leader_node(engine, publisher, metrics_task) @@ -280,6 +329,8 @@ async def init_prefill( engine, config, publisher, generate_endpoint, shutdown_event ) handler.register_engine_routes(runtime) + if attached_engine is not None: + handler.follow_shared_pause_state() health_check_payload = SglangPrefillHealthCheckPayload(engine).to_dict() diff --git a/components/src/dynamo/sglang/main.py b/components/src/dynamo/sglang/main.py index 427207d68a60..503ddb2ab6c6 100644 --- a/components/src/dynamo/sglang/main.py +++ b/components/src/dynamo/sglang/main.py @@ -19,6 +19,14 @@ from dynamo.runtime.logging import configure_dynamo_logging from dynamo.sglang._compat import override_server_args from dynamo.sglang.args import parse_args +from dynamo.sglang.gateway import ( + build_gateway_engine, + effective_gateway_workers, + gateway_worker_count, + is_gateway_child, + reserve_system_port_for_children, + validate_gateway_mode, +) from dynamo.sglang.init_diffusion import ( init_image_diffusion, init_llm_diffusion, @@ -62,12 +70,30 @@ async def worker(argv: list[str] | None = None): load_format=setup_gms(config.server_args), ) + gateway_count = effective_gateway_workers(config.server_args, config.dynamo_args) + validate_gateway_mode(config.server_args, config.dynamo_args, gateway_count) + if gateway_count > 1 and config.server_args.tokenizer_worker_num != gateway_count: + # SGLang launches its MultiTokenizerRouter (the shared-memory handoff the + # gateway children join) with exactly tokenizer_worker_num workers. + override_server_args( + config.server_args, + "dynamo.gateway", + tokenizer_worker_num=gateway_count, + ) + if gateway_worker_count(config.server_args, config.dynamo_args) > 1: + reserve_system_port_for_children() + # Snapshot mode: engine must be created before runtime so CRIU captures no # NATS/etcd connections. snapshot_controller = await prepare_snapshot_engine(config) dynamo_args = config.dynamo_args snapshot_engine = None + attached_engine = None + if snapshot_controller is None and is_gateway_child(): + # Spawned by gateway.serve_via_gateway_children: share the parent's engine + # through a TokenizerWorker instead of launching schedulers. + attached_engine = build_gateway_engine() if snapshot_controller is not None: snapshot_engine = snapshot_controller.engine dynamo_args = await refresh_snapshot_restore_config( @@ -159,6 +185,7 @@ async def worker(argv: list[str] | None = None): shutdown_endpoints, run_deferred_handlers, snapshot_engine=snapshot_engine, + attached_engine=attached_engine, ) else: await init_prefill( @@ -168,6 +195,7 @@ async def worker(argv: list[str] | None = None): shutdown_endpoints, run_deferred_handlers, snapshot_engine=snapshot_engine, + attached_engine=attached_engine, ) diff --git a/components/src/dynamo/sglang/publisher.py b/components/src/dynamo/sglang/publisher.py index c2acaae7a491..867e3ffa9797 100644 --- a/components/src/dynamo/sglang/publisher.py +++ b/components/src/dynamo/sglang/publisher.py @@ -33,6 +33,11 @@ local_dp_rank_bounds, publishes_kv_events, ) +from dynamo.sglang.gateway import ( + effective_gateway_workers, + metrics_fanout_endpoint, + owns_engine_metrics, +) def get_local_dp_rank_range(server_args) -> range: @@ -59,15 +64,20 @@ def set_forward_pass_metrics_worker_id( ) -async def _resolve_multinode_leader_worker_id( +async def _resolve_multinode_leader_worker_ids( generate_endpoint: Endpoint, server_args, -) -> Optional[int]: - """Return the routable leader worker id for SGLang non-leader nodes.""" + expected: int = 1, +) -> list[int]: + """Return the routable leader worker ids for SGLang non-leader nodes. + + In gateway mode the leader node registers ``expected`` endpoint instances for + the same engine (one per gateway child); remote-rank KV events must be + attributed to every one of them or the router only sees them on one.""" node_rank = getattr(server_args, "node_rank", 0) or 0 nnodes = getattr(server_args, "nnodes", 1) or 1 if node_rank <= 0 or nnodes <= 1: - return None + return [] worker_group_id = get_sglang_worker_group_id(server_args) client = await generate_endpoint.client() @@ -75,11 +85,21 @@ async def _resolve_multinode_leader_worker_id( timeout_s = getattr(server_args, "dist_timeout", None) timeout_s = None if timeout_s is None else float(timeout_s) try: - worker_id = await client.wait_for_instance_by_runtime_data( - SGLANG_WORKER_GROUP_ID_KEY, - worker_group_id, - timeout_s=timeout_s, - ) + if expected > 1: + worker_ids = await client.wait_for_instances_by_runtime_data( + SGLANG_WORKER_GROUP_ID_KEY, + worker_group_id, + expected, + timeout_s=timeout_s, + ) + else: + worker_ids = [ + await client.wait_for_instance_by_runtime_data( + SGLANG_WORKER_GROUP_ID_KEY, + worker_group_id, + timeout_s=timeout_s, + ) + ] except Exception as e: raise RuntimeError( "Failed to resolve SGLang leader worker_id for non-leader " @@ -88,13 +108,18 @@ async def _resolve_multinode_leader_worker_id( ) from e logging.info( - "Using SGLang leader worker_id=%s for non-leader KV event " + "Using SGLang leader worker_ids=%s for non-leader KV event " "publishing via worker_group_id=%s", - worker_id, + worker_ids, worker_group_id, ) - return int(worker_id) + return [int(w) for w in worker_ids] + if expected > 1: + raise RuntimeError( + "gateway mode on a multi-node engine needs dist_init_addr so the " + "non-leader nodes can find every gateway instance of their engine" + ) instances = await client.wait_for_instances() if len(instances) == 1: worker_id = int(instances[0]) @@ -102,14 +127,14 @@ async def _resolve_multinode_leader_worker_id( "Using SGLang leader worker_id=%s for non-leader KV event publishing", worker_id, ) - return worker_id + return [worker_id] logging.warning( "Expected exactly one SGLang leader endpoint instance for non-leader " "KV event attribution, got %d; skipping non-leader KV event publishing", len(instances), ) - return None + return [] def format_zmq_endpoint(endpoint_template: str, ip_address: str) -> str: @@ -143,6 +168,32 @@ def format_zmq_endpoint(endpoint_template: str, ip_address: str) -> str: # This is the same pattern used by dynamo+vLLM. +def _open_metrics_sockets( + ctx: zmq.asyncio.Context, + metrics_ipc_name: str, + fanout_endpoint: Optional[str], + owner: bool, +) -> tuple[zmq.asyncio.Socket, Optional[zmq.asyncio.Socket]]: + """The schedulers push KvMetrics to one PULL socket. Its owner (the single + worker, or gateway child 0) re-publishes every message on ``fanout_endpoint`` + so sibling gateways can report the same usage for their own identities.""" + # SGLang's get_zmq_socket only configures PUSH/PULL/DEALER/REQ/REP/PAIR and + # raises for PUB/SUB, so the fan-out pair is created directly. + if owner: + sock = get_zmq_socket(ctx, zmq.PULL, metrics_ipc_name, True) + fanout = None + if fanout_endpoint is not None: + fanout = ctx.socket(zmq.PUB) + fanout.bind(fanout_endpoint) + return sock, fanout + if fanout_endpoint is None: + raise ValueError("a sibling gateway needs the metrics fan-out endpoint") + sock = ctx.socket(zmq.SUB) + sock.setsockopt(zmq.SUBSCRIBE, b"") + sock.connect(fanout_endpoint) + return sock, None + + class DynamoSglangPublisher: """ Handles SGLang kv events and metrics reception and publishing. @@ -189,13 +240,19 @@ def __init__( # need KV event publishing which is set up separately in init_kv_event_publish() node_rank = getattr(self.server_args, "node_rank", 0) or 0 self._ctx: zmq.asyncio.Context | None = None + self._sock: zmq.asyncio.Socket | None = None + self._fanout: zmq.asyncio.Socket | None = None + # Engine-level gauges (total blocks, cache usage) describe one engine; only + # the process that consumes the schedulers' metrics publishes them, so a + # scrape across gateway children does not count the engine N times. + self._publishes_engine_gauges = owns_engine_metrics() if node_rank == 0: self._ctx = zmq.asyncio.Context() - self._sock = get_zmq_socket( + self._sock, self._fanout = _open_metrics_sockets( self._ctx, - zmq.PULL, self.engine.port_args.metrics_ipc_name, - True, + metrics_fanout_endpoint(), + self._publishes_engine_gauges, ) else: self._ctx = None @@ -223,6 +280,8 @@ async def run(self) -> None: # Receive KvMetrics object from SGLang scheduler via ZMQ # KvMetrics class: sglang/srt/observability/scheduler_metrics_mixin.py kv_metrics = await self._sock.recv_pyobj() + if self._fanout is not None: + await self._fanout.send_pyobj(kv_metrics) dp_rank = ( kv_metrics.data_parallel_rank if kv_metrics.data_parallel_rank is not None @@ -236,13 +295,12 @@ async def run(self) -> None: self.metrics_publisher.publish( dp_rank, kv_used_blocks=active_decode_blocks ) - dp_rank_str = str(dp_rank) - # Publish total blocks (always available in KvMetrics) - self.component_gauges.set_total_blocks(dp_rank_str, total_blocks) - # Publish GPU cache usage percentage (always available in KvMetrics) - self.component_gauges.set_gpu_cache_usage( - dp_rank_str, kv_metrics.gpu_cache_usage_perc - ) + if self._publishes_engine_gauges: + dp_rank_str = str(dp_rank) + self.component_gauges.set_total_blocks(dp_rank_str, total_blocks) + self.component_gauges.set_gpu_cache_usage( + dp_rank_str, kv_metrics.gpu_cache_usage_perc + ) except Exception: if self._running: logging.exception( @@ -254,9 +312,11 @@ def cleanup(self) -> None: self._running = False # Close ZMQ socket and context - if self._sock is not None: + for sock in (self._sock, self._fanout): + if sock is None: + continue try: - self._sock.close(linger=0) + sock.close(linger=0) except Exception as e: logging.warning(f"Failed to close ZMQ socket: {e}") @@ -286,9 +346,10 @@ def init_engine_metrics_publish(self) -> None: """Publish initial dummy metrics to bootstrap the metrics endpoint.""" logging.info("Sending dummy metrics to initialize") self.metrics_publisher.publish(self.dp_rank, kv_used_blocks=0) - dp_rank_str = str(self.dp_rank) - self.component_gauges.set_total_blocks(dp_rank_str, 0) - self.component_gauges.set_gpu_cache_usage(dp_rank_str, 0.0) + if self._publishes_engine_gauges: + dp_rank_str = str(self.dp_rank) + self.component_gauges.set_total_blocks(dp_rank_str, 0) + self.component_gauges.set_gpu_cache_usage(dp_rank_str, 0.0) def init_kv_event_publish(self) -> List[KvEventPublisher]: """Initialize KV event publisher(s) if configured. @@ -558,6 +619,9 @@ async def _idle() -> None: publisher.init_engine_metrics_publish() node_rank = getattr(config.server_args, "node_rank", 0) or 0 + # Every gateway child republishes KV events under its own worker id so the + # router can match prefixes on any instance of the engine; scheduler metrics + # and forward-pass metrics are consumed once, by the process that owns them. if node_rank <= 0 and config.dynamo_args.use_kv_events: publisher.init_kv_event_publish() publisher.init_fpm_relay() @@ -590,11 +654,12 @@ async def handle_non_leader_node( if publisher.dynamo_args.use_kv_events and publishes_kv_events( publisher.server_args ): - kv_worker_id = await _resolve_multinode_leader_worker_id( + kv_worker_ids = await _resolve_multinode_leader_worker_ids( publisher.generate_endpoint, publisher.server_args, + effective_gateway_workers(publisher.server_args, publisher.dynamo_args), ) - if kv_worker_id is not None: + for kv_worker_id in kv_worker_ids: publisher.kv_worker_id = kv_worker_id publisher.init_kv_event_publish() diff --git a/components/src/dynamo/sglang/register.py b/components/src/dynamo/sglang/register.py index 6fb2f1afb4ee..2fed98ee6894 100644 --- a/components/src/dynamo/sglang/register.py +++ b/components/src/dynamo/sglang/register.py @@ -41,6 +41,12 @@ runtime_capacity, ) from dynamo.sglang.engine_generate import SGLANG_GENERATE_CAPABILITY +from dynamo.sglang.gateway import ( + GATEWAY_ENGINE_ID_KEY, + GATEWAY_WORKERS_KEY, + effective_gateway_workers, + gateway_engine_id, +) SGLANG_HICACHE_MOONCAKE_RUNTIME_KEY = "sglang_hicache_mooncake" SPEC_DECODE_RUNTIME_KEY = "spec_decode" @@ -456,6 +462,16 @@ async def get_runtime_config( e, ) + gateway_engine = gateway_engine_id() + if gateway_engine is not None: + runtime_config.set_engine_specific( + GATEWAY_ENGINE_ID_KEY, json.dumps(gateway_engine) + ) + runtime_config.set_engine_specific( + GATEWAY_WORKERS_KEY, + json.dumps(effective_gateway_workers(server_args, dynamo_args)), + ) + # Set topology and KV transfer policy for topology-aware routing apply_topology_config(runtime_config) diff --git a/components/src/dynamo/sglang/request_handlers/handler_base.py b/components/src/dynamo/sglang/request_handlers/handler_base.py index 9834a934a611..6d16ecb56c39 100644 --- a/components/src/dynamo/sglang/request_handlers/handler_base.py +++ b/components/src/dynamo/sglang/request_handlers/handler_base.py @@ -49,6 +49,7 @@ from dynamo.sglang.args import Config from dynamo.sglang.capacity import kv_event_block_size from dynamo.sglang.engine_routes import resolve_configured_engine_routes +from dynamo.sglang.gateway import follow_pause_broadcasts from dynamo.sglang.publisher import DynamoSglangPublisher logger = logging.getLogger(__name__) @@ -885,6 +886,13 @@ async def _sync_discovery_with_sglang_pause_state(self) -> None: else: await self.generate_endpoint.register_endpoint_instance() + def follow_shared_pause_state(self) -> None: + async def resync() -> None: + async with self._engine_route_lock: + await self._sync_discovery_with_sglang_pause_state() + + follow_pause_broadcasts(getattr(self.engine, "tokenizer_manager", None), resync) + async def _invoke_engine_route(self, route_handler, body: dict) -> dict: """Invoke one engine route and then synchronize worker discovery.""" async with self._engine_route_lock: diff --git a/components/src/dynamo/sglang/tests/test_sglang_gateway.py b/components/src/dynamo/sglang/tests/test_sglang_gateway.py new file mode 100644 index 000000000000..e118d67faf84 --- /dev/null +++ b/components/src/dynamo/sglang/tests/test_sglang_gateway.py @@ -0,0 +1,448 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +"""Unit tests for the multi-process SGLang gateway (no engine, no GPU).""" + +from __future__ import annotations + +import asyncio +from types import SimpleNamespace + +import pytest + +pytest.importorskip("sglang", reason="sglang not installed in this container") + +from dynamo.sglang import gateway # noqa: E402 + +pytestmark = [ + pytest.mark.unit, + pytest.mark.sglang, + pytest.mark.gpu_0, + pytest.mark.pre_merge, +] + + +def _server_args(tokenizer_worker_num=1, node_rank=0, **kw): + return SimpleNamespace( + tokenizer_worker_num=tokenizer_worker_num, node_rank=node_rank, **kw + ) + + +def _dyn(gateway_workers=None, **kw): + return SimpleNamespace(gateway_workers=gateway_workers, **kw) + + +@pytest.fixture +def not_a_child(monkeypatch): + monkeypatch.delenv(gateway.ENV_PARENT_PID, raising=False) + monkeypatch.delenv(gateway.ENV_CHILD_INDEX, raising=False) + + +def test_effective_count_from_either_flag(not_a_child): + assert gateway.effective_gateway_workers(_server_args(1), _dyn()) == 1 + assert gateway.effective_gateway_workers(_server_args(8), _dyn()) == 8 + assert gateway.effective_gateway_workers(_server_args(1), _dyn(3)) == 3 + assert gateway.effective_gateway_workers(_server_args(3), _dyn(3)) == 3 + + +@pytest.mark.parametrize("tokenizer_workers,requested", [(8, 3), (2, 1)]) +def test_conflicting_explicit_counts_are_rejected( + not_a_child, tokenizer_workers, requested +): + with pytest.raises(ValueError, match="conflicts"): + gateway.effective_gateway_workers( + _server_args(tokenizer_workers), _dyn(requested) + ) + + +def test_gateway_worker_count_only_on_leader_and_not_in_children( + not_a_child, monkeypatch +): + assert gateway.gateway_worker_count(_server_args(8), _dyn()) == 8 + assert gateway.gateway_worker_count(_server_args(8, node_rank=1), _dyn()) == 1 + monkeypatch.setenv(gateway.ENV_PARENT_PID, "123") + assert gateway.is_gateway_child() + assert gateway.gateway_worker_count(_server_args(8), _dyn()) == 1 + + +def test_validate_rejects_unsupported_modes(not_a_child, monkeypatch): + monkeypatch.delenv("DYN_SNAPSHOT_CONTROL_DIR", raising=False) + gateway.validate_gateway_mode(_server_args(4), _dyn(), 4) + gateway.validate_gateway_mode(_server_args(1), _dyn(embedding_worker=True), 1) + with pytest.raises(ValueError, match="embedding-worker"): + gateway.validate_gateway_mode(_server_args(4), _dyn(embedding_worker=True), 4) + with pytest.raises(ValueError, match="enable-lora"): + gateway.validate_gateway_mode(_server_args(4, enable_lora=True), _dyn(), 4) + with pytest.raises(ValueError, match="forward-pass-metrics"): + gateway.validate_gateway_mode( + _server_args(4, enable_forward_pass_metrics=True), _dyn(), 4 + ) + monkeypatch.setenv("DYN_SNAPSHOT_CONTROL_DIR", "/snapshot-control") + with pytest.raises(ValueError, match="snapshot"): + gateway.validate_gateway_mode(_server_args(4), _dyn(), 4) + + +def test_validate_engine_routes_need_attach_api(monkeypatch): + monkeypatch.delenv("DYN_SNAPSHOT_CONTROL_DIR", raising=False) + monkeypatch.setattr( + gateway.sgl.Engine, "attach_tokenizer_worker", None, raising=False + ) + routes = ["flush_cache", "abort=abort_request:tm"] + gateway.validate_gateway_mode(_server_args(4), _dyn(engine_routes=routes[1:]), 4) + with pytest.raises(ValueError, match="attach_tokenizer_worker"): + gateway.validate_gateway_mode(_server_args(4), _dyn(engine_routes=routes), 4) + monkeypatch.setattr(gateway.sgl.Engine, "attach_tokenizer_worker", lambda pid: None) + gateway.validate_gateway_mode(_server_args(4), _dyn(engine_routes=routes), 4) + + +def test_child_index_decides_metrics_ownership_and_fanout(monkeypatch): + monkeypatch.delenv(gateway.ENV_PARENT_PID, raising=False) + monkeypatch.delenv(gateway.ENV_CHILD_INDEX, raising=False) + assert gateway.gateway_child_index() == 0 + assert gateway.owns_engine_metrics() + assert gateway.metrics_fanout_endpoint() is None + monkeypatch.setenv(gateway.ENV_PARENT_PID, "4242") + monkeypatch.setenv(gateway.ENV_CHILD_INDEX, "2") + assert not gateway.owns_engine_metrics() + assert gateway.metrics_fanout_endpoint().endswith("_4242") + + +def test_system_port_is_handed_to_children(not_a_child, monkeypatch): + monkeypatch.setenv(gateway.ENV_SYSTEM_PORT, "8081") + monkeypatch.delenv(gateway.ENV_SYSTEM_PORT_BASE, raising=False) + gateway.reserve_system_port_for_children() + import os + + assert os.environ[gateway.ENV_SYSTEM_PORT] == "-1" + env0, env2 = gateway.child_environment(0), gateway.child_environment(2) + assert env0[gateway.ENV_SYSTEM_PORT] == "8081" + assert env2[gateway.ENV_SYSTEM_PORT] == "0" + assert gateway.ENV_SYSTEM_PORT_BASE not in env2 + assert env2[gateway.ENV_CHILD_INDEX] == "2" + assert env2[gateway.ENV_PARENT_PID] == str(os.getpid()) + + +@pytest.mark.parametrize("value", [None, "-1", "0", "not-a-port"]) +def test_system_port_untouched_when_disabled(not_a_child, monkeypatch, value): + import os + + monkeypatch.delenv(gateway.ENV_SYSTEM_PORT_BASE, raising=False) + if value is None: + monkeypatch.delenv(gateway.ENV_SYSTEM_PORT, raising=False) + else: + monkeypatch.setenv(gateway.ENV_SYSTEM_PORT, value) + gateway.reserve_system_port_for_children() + assert os.environ.get(gateway.ENV_SYSTEM_PORT) == value + assert gateway.child_environment(1).get(gateway.ENV_SYSTEM_PORT) == value + assert gateway.ENV_SYSTEM_PORT_BASE not in os.environ + + +def test_parent_watchdog_fires_when_parent_is_gone(): + import threading + + died = threading.Event() + dead_pid = 2**22 - 7 # above pid_max on every default Linux, so never alive + thread = gateway.start_parent_watchdog( + dead_pid, on_parent_death=died.set, poll_seconds=0.01 + ) + assert died.wait(5) + thread.join(5) + assert not thread.is_alive() + + +def test_parent_watchdog_stays_quiet_while_parent_lives(): + import os + import threading + import time + + died = threading.Event() + gateway.start_parent_watchdog( + os.getppid(), on_parent_death=died.set, poll_seconds=0.01 + ) + time.sleep(0.1) + assert not died.is_set() + + +def test_gateway_engine_id_and_shutdown_budget(monkeypatch): + monkeypatch.delenv(gateway.ENV_PARENT_PID, raising=False) + assert gateway.gateway_engine_id() is None + monkeypatch.setenv(gateway.ENV_PARENT_PID, "777") + assert gateway.gateway_engine_id().endswith(":777") + monkeypatch.setenv("DYN_GRACEFUL_SHUTDOWN_GRACE_PERIOD_SECS", "12") + assert gateway.child_shutdown_timeout() == 12 + gateway.CHILD_DRAIN_AND_CLEANUP_SECS + + +def _child_env(monkeypatch, parent_pid="4321"): + monkeypatch.setenv(gateway.ENV_PARENT_PID, parent_pid) + monkeypatch.setenv(gateway.ENV_CHILD_INDEX, "1") + monkeypatch.setattr(gateway, "start_parent_watchdog", lambda pid: None) + + +def test_build_gateway_engine_prefers_attach_api(monkeypatch): + _child_env(monkeypatch) + seen = {} + + def attach(pid): + seen["pid"] = pid + return SimpleNamespace(port_args=SimpleNamespace(metrics_ipc_name="ipc:///p")) + + monkeypatch.setattr( + gateway.sgl.Engine, "attach_tokenizer_worker", attach, raising=False + ) + engine = gateway.build_gateway_engine() + assert seen["pid"] == 4321 + assert engine.port_args.metrics_ipc_name == "ipc:///p" + + +def test_build_gateway_engine_falls_back_to_facade(monkeypatch): + import sglang.srt.managers.multi_tokenizer_mixin as mixin + import sglang.srt.runtime_context as runtime_context + + _child_env(monkeypatch) + monkeypatch.setattr( + gateway.sgl.Engine, "attach_tokenizer_worker", None, raising=False + ) + port_args = SimpleNamespace( + metrics_ipc_name="ipc:///p", tokenizer_ipc_name="ipc:///t" + ) + server_args = SimpleNamespace(tokenizer_worker_num=2) + info = {"max_req_input_len": 64, "startup_time": {"t": 1}} + created = {} + + class FakeWorker: + def __init__(self, sa, pa): + created["port_args"] = pa + + def set_startup_time(self, t): + created["startup_time"] = t + + monkeypatch.setattr( + mixin, "read_from_shared_memory", lambda name: (port_args, server_args, info) + ) + monkeypatch.setattr(mixin, "get_tokenizer_worker_class", lambda sa: FakeWorker) + monkeypatch.setattr( + runtime_context, "publish", lambda sa, role: created.setdefault("role", role) + ) + + engine = gateway.build_gateway_engine() + assert isinstance(engine, gateway.GatewayEngine) + assert created["role"] == "tokenizer" + assert created["startup_time"] == {"t": 1} + assert created["port_args"].tokenizer_ipc_name != "ipc:///t" + assert engine.port_args.metrics_ipc_name == "ipc:///p" + assert engine.tokenizer_manager.max_req_input_len == 64 + + +def test_gateway_engine_facade_generates_through_tokenizer_manager(): + seen = {} + + class FakeTokenizerManager: + async def generate_request(self, obj, request): + seen["obj"] = obj + yield {"text": "ok"} + + facade = gateway.GatewayEngine( + FakeTokenizerManager(), + server_args=SimpleNamespace(), + port_args=SimpleNamespace(metrics_ipc_name="ipc:///tmp/x"), + scheduler_info={"max_req_input_len": 4}, + ) + assert facade._scheduler_init_result.scheduler_infos[0]["max_req_input_len"] == 4 + + async def run(): + gen = await facade.async_generate(input_ids=[1, 2, 3], stream=True) + return [chunk async for chunk in gen] + + assert asyncio.run(run()) == [{"text": "ok"}] + assert seen["obj"].input_ids == [1, 2, 3] + facade.shutdown() + + +class FakeProc: + def __init__(self, pid): + self.pid = pid + self.returncode = None + self.terminated = False + self.waited = False + + def poll(self): + return self.returncode + + def terminate(self): + self.terminated = True + self.returncode = -15 + + def wait(self, timeout=None): + self.waited = True + return self.returncode + + +class FakeShm: + unlinked = False + + def unlink(self): + self.unlinked = True + + +def _engine(): + return SimpleNamespace( + port_args=SimpleNamespace(), + server_args=SimpleNamespace(), + tokenizer_manager=SimpleNamespace(startup_time={"t": 0}), + _scheduler_init_result=SimpleNamespace( + scheduler_infos=[{"max_req_input_len": 8}] + ), + ) + + +def test_serve_via_gateway_children_spawns_and_fails_on_dead_child( + not_a_child, monkeypatch +): + spawned = [] + + def fake_popen(cmd, env): + p = FakeProc(4000 + len(spawned)) + p.cmd, p.env = cmd, env + spawned.append(p) + return p + + shm = FakeShm() + monkeypatch.setattr(gateway.subprocess, "Popen", fake_popen) + monkeypatch.setattr( + "sglang.srt.managers.multi_tokenizer_mixin.write_data_for_multi_tokenizer", + lambda port_args, server_args, info: shm, + ) + monkeypatch.setattr(gateway.sys, "argv", ["dynamo.sglang", "--model-path", "/m"]) + + async def fast_sleep(_): + spawned[1].returncode = 1 + + monkeypatch.setattr(gateway.asyncio, "sleep", fast_sleep) + + with pytest.raises(RuntimeError, match="exited rc=1"): + asyncio.run(gateway.serve_via_gateway_children(_engine(), 3, asyncio.Event())) + + assert len(spawned) == 3 + assert all(p.cmd[1:3] == ["-m", "dynamo.sglang"] for p in spawned) + assert all(p.cmd[3:] == ["--model-path", "/m"] for p in spawned) + assert [p.env[gateway.ENV_CHILD_INDEX] for p in spawned] == ["0", "1", "2"] + assert all(gateway.ENV_PARENT_PID in p.env for p in spawned) + assert all(p.terminated for p in spawned if p.pid != spawned[1].pid) + assert all(p.waited for p in spawned) + assert shm.unlinked + + +def test_serve_via_gateway_children_tolerates_child_exit_during_shutdown( + not_a_child, monkeypatch +): + spawned = [] + stop = asyncio.Event() + + def fake_popen(cmd, env): + p = FakeProc(4100 + len(spawned)) + spawned.append(p) + return p + + monkeypatch.setattr(gateway.subprocess, "Popen", fake_popen) + monkeypatch.setattr( + "sglang.srt.managers.multi_tokenizer_mixin.write_data_for_multi_tokenizer", + lambda port_args, server_args, info: FakeShm(), + ) + + async def fast_sleep(_): + stop.set() + spawned[0].returncode = 0 + + monkeypatch.setattr(gateway.asyncio, "sleep", fast_sleep) + asyncio.run(gateway.serve_via_gateway_children(_engine(), 2, stop)) + assert spawned[1].terminated and all(p.waited for p in spawned) + + +def test_serve_via_gateway_children_cleans_up_when_spawn_fails( + not_a_child, monkeypatch +): + spawned = [] + + def fake_popen(cmd, env): + if len(spawned) == 1: + raise OSError("no more pids") + p = FakeProc(5000 + len(spawned)) + spawned.append(p) + return p + + shm = FakeShm() + monkeypatch.setattr(gateway.subprocess, "Popen", fake_popen) + monkeypatch.setattr( + "sglang.srt.managers.multi_tokenizer_mixin.write_data_for_multi_tokenizer", + lambda port_args, server_args, info: shm, + ) + with pytest.raises(OSError, match="no more pids"): + asyncio.run(gateway.serve_via_gateway_children(_engine(), 3, asyncio.Event())) + assert len(spawned) == 1 and spawned[0].terminated and spawned[0].waited + assert shm.unlinked + + +def test_serve_via_gateway_children_reuses_engine_published_shm( + not_a_child, monkeypatch +): + """An SGLang Engine that already published its args (tokenizer_router set) owns + the shared memory; the gateway must not publish or unlink it.""" + calls = [] + monkeypatch.setattr( + "sglang.srt.managers.multi_tokenizer_mixin.write_data_for_multi_tokenizer", + lambda *a: calls.append(a), + ) + monkeypatch.setattr(gateway.subprocess, "Popen", lambda cmd, env: FakeProc(1)) + + class OwnedShm: + def unlink(self): + raise AssertionError("gateway must not unlink the engine's shm") + + engine = _engine() + engine._multi_tokenizer_shm = OwnedShm() + stop = asyncio.Event() + + async def run(): + task = asyncio.create_task(gateway.serve_via_gateway_children(engine, 1, stop)) + await asyncio.sleep(0) + stop.set() + await task + + asyncio.run(run()) + assert calls == [] + + +def test_child_zero_receives_the_leader_load_time(not_a_child, monkeypatch): + monkeypatch.delenv(gateway.ENV_LOAD_TIME, raising=False) + env0 = gateway.child_environment(0, load_time=12.5) + env1 = gateway.child_environment(1, load_time=12.5) + assert env0[gateway.ENV_LOAD_TIME] == "12.5" + assert gateway.ENV_LOAD_TIME not in env1 + assert gateway.ENV_LOAD_TIME not in gateway.child_environment(0) + assert gateway.attached_engine_load_time() is None + monkeypatch.setenv(gateway.ENV_LOAD_TIME, env0[gateway.ENV_LOAD_TIME]) + assert gateway.attached_engine_load_time() == 12.5 + + +def test_follow_pause_broadcasts_resyncs_after_each_broadcast(): + seen = [] + + class FakeWorker: + is_pause = False + + async def _apply_pause_continue_broadcast(self, obj): + self.is_pause = obj.is_pause + + worker = FakeWorker() + + async def on_change(): + seen.append(worker.is_pause) + + assert gateway.follow_pause_broadcasts(worker, on_change) + assert not gateway.follow_pause_broadcasts(SimpleNamespace(), on_change) + + async def run(): + await worker._apply_pause_continue_broadcast(SimpleNamespace(is_pause=True)) + await worker._apply_pause_continue_broadcast(SimpleNamespace(is_pause=False)) + + asyncio.run(run()) + assert seen == [True, False] diff --git a/components/src/dynamo/sglang/tests/test_sglang_publisher.py b/components/src/dynamo/sglang/tests/test_sglang_publisher.py index a6a4175a2d04..40af00e49a9e 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_publisher.py +++ b/components/src/dynamo/sglang/tests/test_sglang_publisher.py @@ -12,7 +12,7 @@ from dynamo.sglang._disagg import SGLANG_WORKER_GROUP_ID_KEY, get_sglang_worker_group_id from dynamo.sglang.publisher import ( DynamoSglangPublisher, - _resolve_multinode_leader_worker_id, + _resolve_multinode_leader_worker_ids, get_local_dp_rank_range, handle_non_leader_node, set_forward_pass_metrics_worker_id, @@ -156,9 +156,9 @@ async def client(self): server_args = SimpleNamespace(nnodes=2, node_rank=1) - worker_id = await _resolve_multinode_leader_worker_id(FakeEndpoint(), server_args) + worker_ids = await _resolve_multinode_leader_worker_ids(FakeEndpoint(), server_args) - assert worker_id == 1234 + assert worker_ids == [1234] @pytest.mark.asyncio @@ -185,9 +185,9 @@ async def client(self): dist_timeout=5, ) - worker_id = await _resolve_multinode_leader_worker_id(FakeEndpoint(), server_args) + worker_ids = await _resolve_multinode_leader_worker_ids(FakeEndpoint(), server_args) - assert worker_id == 1234 + assert worker_ids == [1234] assert calls == [ ( SGLANG_WORKER_GROUP_ID_KEY, @@ -220,9 +220,9 @@ async def client(self): node_rank=1, ) - worker_id = await _resolve_multinode_leader_worker_id(FakeEndpoint(), server_args) + worker_ids = await _resolve_multinode_leader_worker_ids(FakeEndpoint(), server_args) - assert worker_id == 1234 + assert worker_ids == [1234] assert calls == [ ( SGLANG_WORKER_GROUP_ID_KEY, @@ -232,6 +232,54 @@ async def client(self): ] +@pytest.mark.asyncio +async def test_resolve_multinode_leader_worker_ids_waits_for_every_gateway(monkeypatch): + calls = [] + + class FakeClient: + async def wait_for_instances_by_runtime_data( + self, key, value, min_count, timeout_s=None + ): + calls.append((key, value, min_count, timeout_s)) + return [7, 5, 6] + + class FakeEndpoint: + async def client(self): + return FakeClient() + + monkeypatch.setattr( + publisher_mod, + "get_sglang_worker_group_id", + lambda server_args: "dist_init:tcp://10.0.0.1:2345", + ) + server_args = SimpleNamespace(nnodes=2, node_rank=1, dist_timeout=5) + + worker_ids = await _resolve_multinode_leader_worker_ids( + FakeEndpoint(), server_args, expected=3 + ) + + assert worker_ids == [7, 5, 6] + assert calls == [ + (SGLANG_WORKER_GROUP_ID_KEY, "dist_init:tcp://10.0.0.1:2345", 3, 5.0) + ] + + +@pytest.mark.asyncio +async def test_resolve_multinode_leader_worker_ids_needs_group_id_for_gateways(): + class FakeClient: + async def wait_for_instances(self): + return [1234] + + class FakeEndpoint: + async def client(self): + return FakeClient() + + with pytest.raises(RuntimeError, match="dist_init_addr"): + await _resolve_multinode_leader_worker_ids( + FakeEndpoint(), SimpleNamespace(nnodes=2, node_rank=1), expected=2 + ) + + @pytest.mark.asyncio async def test_resolve_multinode_leader_worker_id_ignores_ambiguous_instances(): class FakeClient: @@ -244,9 +292,9 @@ async def client(self): server_args = SimpleNamespace(nnodes=2, node_rank=1) - worker_id = await _resolve_multinode_leader_worker_id(FakeEndpoint(), server_args) + worker_ids = await _resolve_multinode_leader_worker_ids(FakeEndpoint(), server_args) - assert worker_id is None + assert worker_ids == [] @pytest.mark.asyncio @@ -310,11 +358,11 @@ def cleanup(self): @pytest.mark.asyncio async def test_handle_non_leader_node_skips_tp_only_kv_event_setup(monkeypatch): - resolve_leader = AsyncMock(return_value=1234) + resolve_leader = AsyncMock(return_value=[1234]) kv_event_publisher = Mock() monkeypatch.setattr( publisher_mod, - "_resolve_multinode_leader_worker_id", + "_resolve_multinode_leader_worker_ids", resolve_leader, ) monkeypatch.setattr(publisher_mod, "KvEventPublisher", kv_event_publisher) @@ -365,9 +413,9 @@ async def test_handle_non_leader_node_skips_kv_publish_without_resolved_worker( init_called = asyncio.Event() cleanup_called = asyncio.Event() - async def missing_resolution(generate_endpoint, server_args): + async def missing_resolution(generate_endpoint, server_args, expected=1): resolution_done.set() - return None + return [] class FakePublisher: generate_endpoint = object() @@ -383,7 +431,7 @@ def cleanup(self): monkeypatch.setattr( publisher_mod, - "_resolve_multinode_leader_worker_id", + "_resolve_multinode_leader_worker_ids", missing_resolution, ) metrics_task = asyncio.create_task(asyncio.Event().wait()) @@ -412,7 +460,7 @@ def cleanup(self): async def test_handle_non_leader_node_cleans_up_when_resolution_fails(monkeypatch): cleanup_called = asyncio.Event() - async def fail_resolution(generate_endpoint, server_args): + async def fail_resolution(generate_endpoint, server_args, expected=1): raise RuntimeError("resolution failed") class FakePublisher: @@ -425,7 +473,7 @@ def cleanup(self): monkeypatch.setattr( publisher_mod, - "_resolve_multinode_leader_worker_id", + "_resolve_multinode_leader_worker_ids", fail_resolution, ) metrics_task = asyncio.create_task(asyncio.Event().wait()) @@ -811,3 +859,81 @@ async def _async_noop(): await task except asyncio.CancelledError: pass + + +def _publisher_with_sockets(sock, fanout, owner, stop_after_publish): + """A DynamoSglangPublisher with only what run() touches, no engine or runtime.""" + pub = publisher_mod.DynamoSglangPublisher.__new__( + publisher_mod.DynamoSglangPublisher + ) + pub._sock, pub._fanout = sock, fanout + pub._publishes_engine_gauges = owner + pub._running = True + pub.dp_rank = 0 + pub.server_args = SimpleNamespace(page_size=1) + published = [] + + def publish(dp_rank, kv_used_blocks): + published.append((dp_rank, kv_used_blocks)) + if stop_after_publish: + pub._running = False + + pub.metrics_publisher = SimpleNamespace(publish=publish) + pub.component_gauges = Mock() + return pub, published + + +@pytest.mark.asyncio +async def test_metrics_fanout_reaches_sibling_gateways(tmp_path, monkeypatch): + import zmq + import zmq.asyncio + + monkeypatch.setattr( + publisher_mod, "kv_metrics_block_values", lambda metrics, page_size: (7, 100) + ) + metrics_ep = f"ipc://{tmp_path}/metrics" + fanout_ep = f"ipc://{tmp_path}/fanout" + ctx = zmq.asyncio.Context() + sockets = [] + try: + owner_sock, fanout = publisher_mod._open_metrics_sockets( + ctx, metrics_ep, fanout_ep, owner=True + ) + sockets += [owner_sock, fanout] + assert fanout is not None + sibling_sock, sibling_fanout = publisher_mod._open_metrics_sockets( + ctx, metrics_ep, fanout_ep, owner=False + ) + sockets.append(sibling_sock) + assert sibling_fanout is None + await asyncio.sleep(0.3) # PUB/SUB slow joiner + + owner, owner_published = _publisher_with_sockets( + owner_sock, fanout, owner=True, stop_after_publish=True + ) + sibling, sibling_published = _publisher_with_sockets( + sibling_sock, None, owner=False, stop_after_publish=True + ) + + scheduler = ctx.socket(zmq.PUSH) + sockets.append(scheduler) + scheduler.connect(metrics_ep) + kv_metrics = SimpleNamespace(data_parallel_rank=3, gpu_cache_usage_perc=0.5) + await asyncio.wait_for(scheduler.send_pyobj(kv_metrics), 5) + + # The owner's run() consumes the scheduler message and relays it; the + # sibling's run() must see it through the fan-out with no other source. + await asyncio.wait_for(asyncio.gather(owner.run(), sibling.run()), 10) + + assert owner_published == [(3, 7)] + assert sibling_published == [(3, 7)] + owner.component_gauges.set_total_blocks.assert_called_once_with("3", 100) + sibling.component_gauges.set_total_blocks.assert_not_called() + + with pytest.raises(ValueError, match="fan-out"): + publisher_mod._open_metrics_sockets(ctx, metrics_ep, None, owner=False) + finally: + for s in sockets: + if s is not None: + s.close(linger=0) + ctx.term() diff --git a/lib/bindings/python/rust/lib.rs b/lib/bindings/python/rust/lib.rs index 5b10f891ebbb..dbc5f06268f0 100644 --- a/lib/bindings/python/rust/lib.rs +++ b/lib/bindings/python/rust/lib.rs @@ -1979,6 +1979,76 @@ impl Client { }) } + /// Wait until at least `min_count` ready endpoint instances have MDC runtime_data + /// containing the requested JSON string value; returns their sorted worker ids. + #[pyo3(signature = (key, value, min_count, timeout_s=None))] + fn wait_for_instances_by_runtime_data<'p>( + &self, + py: Python<'p>, + key: String, + value: String, + min_count: usize, + timeout_s: Option, + ) -> PyResult> { + if min_count == 0 { + return Err(PyValueError::new_err("min_count must be positive")); + } + let endpoint = self.endpoint.clone(); + crate::future_into_py(py, async move { + // Scope the discovery watcher to this lookup so every exit path stops it. + let lifecycle = endpoint.drt().primary_token().child_token(); + let _guard = lifecycle.clone().drop_guard(); + let mut last_matches: Vec = Vec::new(); + let wait = async { + let mut rx = llm_rs::discovery::runtime_config_watch(&endpoint, lifecycle.clone()) + .await + .map_err(to_pyerr)?; + + loop { + let mut matches: Vec = rx + .borrow_and_update() + .iter() + .filter_map(|(worker_id, runtime_config)| { + let matched = runtime_config + .runtime_data + .get(&key) + .and_then(|value| value.as_str()) + == Some(value.as_str()); + matched.then_some(*worker_id) + }) + .collect(); + matches.sort_unstable(); + + if matches.len() >= min_count { + return Ok(matches); + } + last_matches = matches; + + rx.changed().await.map_err(to_pyerr)?; + } + }; + + if let Some(timeout_s) = timeout_s { + if !timeout_s.is_finite() || timeout_s < 0.0 { + return Err(PyValueError::new_err( + "timeout_s must be a finite non-negative number", + )); + } + let timeout = std::time::Duration::from_secs_f64(timeout_s); + let result = tokio::time::timeout(timeout, wait).await; + match result { + Ok(result) => result, + Err(_) => Err(PyTimeoutError::new_err(format!( + "Timed out waiting for {min_count} endpoint instances with runtime_data[{key:?}] == {value:?}; last_match_count={}, matching_ids={last_matches:?}", + last_matches.len(), + ))), + } + } else { + wait.await + } + }) + } + /// Issue a request to the endpoint using the default routing strategy. #[pyo3(signature = (request, annotated=DEFAULT_ANNOTATED_SETTING, context=None))] fn generate<'p>( diff --git a/lib/bindings/python/src/dynamo/_core.pyi b/lib/bindings/python/src/dynamo/_core.pyi index 813378a92f08..187dabf20661 100644 --- a/lib/bindings/python/src/dynamo/_core.pyi +++ b/lib/bindings/python/src/dynamo/_core.pyi @@ -339,6 +339,19 @@ class Client: """ ... + async def wait_for_instances_by_runtime_data( + self, + key: str, + value: str, + min_count: int, + timeout_s: float | None = None, + ) -> List[int]: + """ + Wait until at least min_count instances have MDC runtime_data containing the + given string value, and return their sorted instance IDs. + """ + ... + async def random( self, request: JsonLike, From d7bfb3551604c09a3f6ccf6ab58f4af8be88186a Mon Sep 17 00:00:00 2001 From: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> Date: Sun, 20 Sep 2026 12:18:06 +0000 Subject: [PATCH 130/191] docs: refresh community events Automated refresh from the public Dynamo Google Calendar. Generated by .github/workflows/community-events-refresh.yml. Signed-off-by: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> --- docs/fern/components/events.generated.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fern/components/events.generated.ts b/docs/fern/components/events.generated.ts index f58075cbf218..fd5d7069cf9a 100644 --- a/docs/fern/components/events.generated.ts +++ b/docs/fern/components/events.generated.ts @@ -22,7 +22,7 @@ export interface DynamoEvent { } /** Generation date in Pacific, YYYY-MM-DD. The calendar grid treats this as "today". */ -export const GENERATED_ON = "2026-09-19"; +export const GENERATED_ON = "2026-09-20"; export const UPCOMING_EVENTS: DynamoEvent[] = []; From 38c93190cb580a6d995e8c22ff93713079dd81af Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Sun, 20 Sep 2026 21:19:01 -0700 Subject: [PATCH 131/191] fix(sglang): abort decode requests cancelled before first token (#14781) Signed-off-by: Biswa Panda --- components/src/dynamo/sglang/_compat.py | 18 + .../src/dynamo/sglang/engine_generate.py | 15 +- .../sglang/request_handlers/cancellation.py | 458 +++++++ .../sglang/request_handlers/handler_base.py | 186 +-- .../request_handlers/llm/decode_handler.py | 243 +++- .../tests/test_sglang_decode_cancellation.py | 1190 +++++++++++++++++ .../tests/test_sglang_decode_handler.py | 225 +++- .../tests/test_sglang_frontend_decoding.py | 20 +- .../tests/test_sglang_multimodal_video.py | 1 + .../dynamo/sglang/tests/test_sglang_unit.py | 26 + 10 files changed, 2153 insertions(+), 229 deletions(-) create mode 100644 components/src/dynamo/sglang/request_handlers/cancellation.py create mode 100644 components/src/dynamo/sglang/tests/test_sglang_decode_cancellation.py diff --git a/components/src/dynamo/sglang/_compat.py b/components/src/dynamo/sglang/_compat.py index 090e90ed5937..518a0b777429 100644 --- a/components/src/dynamo/sglang/_compat.py +++ b/components/src/dynamo/sglang/_compat.py @@ -62,6 +62,24 @@ # portion when minimum supported SGLang is 0.5.19+. _sglang_publish = None +try: + from sglang.srt.observability.req_time_stats import APIServerReqTimeStats +except ImportError: + # Fail closed for downstream SGLang builds that omit request-time + # statistics or dispatch timestamps. + APIServerReqTimeStats = None + + +def supports_disagg_prefill_cancel_anytime(engine: Any) -> bool: + """Return whether aborts can be ordered after scheduler dispatch.""" + tokenizer_manager = getattr(engine, "tokenizer_manager", None) + if not isinstance(getattr(tokenizer_manager, "rid_to_state", None), Mapping): + return False + if APIServerReqTimeStats is None: + return False + fields = getattr(APIServerReqTimeStats, "__dataclass_fields__", {}) + return "api_server_dispatch_finish_time" in fields + def get_sglang_model_config(server_args: Any) -> Any: """Return the resolved model config across SGLang ServerArgs APIs. diff --git a/components/src/dynamo/sglang/engine_generate.py b/components/src/dynamo/sglang/engine_generate.py index daa33f3dad42..2273f7ea9fc9 100644 --- a/components/src/dynamo/sglang/engine_generate.py +++ b/components/src/dynamo/sglang/engine_generate.py @@ -7,6 +7,7 @@ from collections.abc import AsyncIterator, Mapping from typing import Any +from uuid import uuid4 from pydantic import TypeAdapter from sglang.srt.managers.io_struct import GenerateReqInput @@ -14,10 +15,16 @@ from dynamo.common.backend import logprobs as _shared_logprobs SGLANG_GENERATE_CAPABILITY = "sglang_generate" +DISAGG_PREFILL_CANCEL_ANYTIME_V1 = "disagg_prefill_cancel_anytime_v1" _PAYLOAD_KEY = "sglang_tito" _GENERATE_REQUEST_ADAPTER = TypeAdapter(GenerateReqInput) +def new_sglang_request_id() -> str: + """Return an unguessable fixed-width ID used only inside SGLang.""" + return uuid4().hex + + def native_generate_payload( request: Mapping[str, Any], ) -> Mapping[str, Any] | None: @@ -49,10 +56,16 @@ def build_native_generate_request( ``extra_args.sglang_tito``. Dynamo replaces only canonical input, routing state, and fields supplied by the selected worker. SGLang owns all remaining validation. + + ``fallback_rid`` is router-owned and always replaces a caller-supplied + ``rid`` so cancellation cannot target another request. + Native session requests pass their caller-visible node ID as the fallback + because SGLang keys session continuations by the submitted top-level + request ID. """ payload = dict(native_payload) payload["input_ids"] = input_ids - payload["rid"] = payload.get("rid") or fallback_rid + payload["rid"] = fallback_rid payload["stream"] = True if priority is None: payload.pop("priority", None) diff --git a/components/src/dynamo/sglang/request_handlers/cancellation.py b/components/src/dynamo/sglang/request_handlers/cancellation.py new file mode 100644 index 000000000000..dab569828f2c --- /dev/null +++ b/components/src/dynamo/sglang/request_handlers/cancellation.py @@ -0,0 +1,458 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""SGLang request cancellation and shutdown coordination.""" + +import asyncio +import logging +from collections.abc import Mapping +from contextlib import asynccontextmanager +from typing import Any, AsyncGenerator, AsyncIterator + +from dynamo._core import Context +from dynamo.llm.exceptions import EngineShutdown +from dynamo.sglang._compat import resolved_server_args + +_CANCELLATION_POLL_MAX_DELAY_S = 0.05 +_CANCELLATION_ABORT_RETRY_LIMIT = 8 +_CANCELLATION_DRAIN_TIMEOUT_S = 1.0 +_CANCELLATION_REGISTRATION_WAIT_TIMEOUT_S = 30.0 +# Leave most of the drain window available after an ordered abort is submitted. +_CANCELLATION_DISPATCH_WAIT_TIMEOUT_S = 0.25 + + +async def _next_stream_item(iterator: AsyncIterator[Any]) -> Any: + return await anext(iterator) + + +def _consume_detached_task(task: asyncio.Task[Any]) -> None: + """Consume a detached cancellation task result without surfacing closure.""" + try: + task.result() + except (asyncio.CancelledError, StopAsyncIteration): + pass + except Exception: + logging.exception("Detached SGLang task failed during cancellation") + + +def _cancel_and_detach(task: asyncio.Task[Any]) -> None: + """Request cancellation without allowing resistant iterators to block cleanup.""" + task.cancel() + task.add_done_callback(_consume_detached_task) + + +class CancellationMixin: + """Coordinate Dynamo cancellation with SGLang request aborts.""" + + engine: Any + config: Any + shutdown_event: asyncio.Event | None + _abort_tasks: set[asyncio.Task[Any]] + + def _track_abort_task(self, task: asyncio.Task[Any]) -> None: + self._abort_tasks.add(task) + task.add_done_callback(self._abort_tasks.discard) + task.add_done_callback(_consume_detached_task) + + def _start_ordered_abort( + self, + tokenizer_manager: Any, + request_id_future: asyncio.Future, + submitted_request_id: str, + registry: Mapping[str, Any], + context_id: str, + ) -> asyncio.Task[Any]: + task = asyncio.create_task( + self._abort_after_registration( + tokenizer_manager, + request_id_future, + submitted_request_id, + registry, + context_id, + ) + ) + self._track_abort_task(task) + return task + + def _start_abort_retry( + self, + tokenizer_manager: Any, + request_id: str, + registry: Mapping[str, Any], + state: Any, + ) -> None: + retry_task = asyncio.create_task( + self._retry_abort(tokenizer_manager, request_id, registry, state) + ) + self._track_abort_task(retry_task) + + def _cancel_abort_tasks(self) -> None: + for task in tuple(self._abort_tasks): + task.cancel() + + def _abort_requests(self, request_ids: set[str], context: Context) -> None: + if not request_ids: + return + tokenizer_manager = getattr(self.engine, "tokenizer_manager", None) + if tokenizer_manager is None: + logging.error("SGLang tokenizer_manager not found for abort requests") + return + for request_id in request_ids: + tokenizer_manager.abort_request(rid=request_id, abort_all=False) + request_ids.clear() + logging.info("Aborted Request ID: %s", context.id()) + + async def _stream_until_cancelled( + self, + stream_source: AsyncIterator[Any], + cancellation_task: asyncio.Task[Any], + ) -> AsyncGenerator[Any, None]: + """Drain briefly after abort, then stop a stream that did not terminate.""" + iterator = aiter(stream_source) + drain_deadline: float | None = None + while True: + next_item = asyncio.create_task(_next_stream_item(iterator)) + try: + if drain_deadline is None: + done, _ = await asyncio.wait( + (next_item, cancellation_task), + return_when=asyncio.FIRST_COMPLETED, + ) + if cancellation_task in done: + cancellation_task.result() + drain_deadline = ( + asyncio.get_running_loop().time() + + _CANCELLATION_DRAIN_TIMEOUT_S + ) + if next_item in done: + try: + yield next_item.result() + except StopAsyncIteration: + return + continue + + assert drain_deadline is not None + remaining = drain_deadline - asyncio.get_running_loop().time() + if remaining <= 0: + logging.warning( + "Timed out draining SGLang stream after cancellation" + ) + return + done, _ = await asyncio.wait((next_item,), timeout=remaining) + if next_item not in done: + logging.warning( + "Timed out draining SGLang stream after cancellation" + ) + return + try: + yield next_item.result() + except StopAsyncIteration: + return + finally: + if not next_item.done(): + _cancel_and_detach(next_item) + + @asynccontextmanager + async def _wait_for_signal(self, context: Context) -> AsyncGenerator[bool, None]: + cancellation_future = context.async_killed_or_stopped() + shutdown_task = ( + asyncio.create_task(self.shutdown_event.wait()) + if self.shutdown_event + else None + ) + wait_for: list[asyncio.Future[Any]] = [cancellation_future] + if shutdown_task is not None: + wait_for.append(shutdown_task) + try: + done, _ = await asyncio.wait(wait_for, return_when=asyncio.FIRST_COMPLETED) + yield shutdown_task is not None and shutdown_task in done + finally: + pending = [awaitable for awaitable in wait_for if not awaitable.done()] + for awaitable in pending: + awaitable.cancel() + await asyncio.gather(*pending, return_exceptions=True) + + @staticmethod + def _request_registry( + tokenizer_manager: Any, submitted_request_id: str | None + ) -> Mapping[str, Any] | None: + if tokenizer_manager is None or submitted_request_id is None: + return None + candidate = getattr(tokenizer_manager, "rid_to_state", None) + return candidate if isinstance(candidate, Mapping) else None + + async def _wait_for_registration( + self, + submitted_request_id: str, + request_id_future: asyncio.Future, + registry: Mapping[str, Any], + ) -> str | None: + delay = 0.001 + while submitted_request_id not in registry: + if request_id_future.cancelled(): + return None + if request_id_future.done(): + return request_id_future.result() + await asyncio.sleep(delay) + delay = min(delay * 2, _CANCELLATION_POLL_MAX_DELAY_S) + return submitted_request_id + + async def _abort_after_registration( + self, + tokenizer_manager: Any, + request_id_future: asyncio.Future, + submitted_request_id: str, + registry: Mapping[str, Any], + context_id: str, + ) -> None: + try: + request_id = await asyncio.wait_for( + self._wait_for_registration( + submitted_request_id, + request_id_future, + registry, + ), + timeout=_CANCELLATION_REGISTRATION_WAIT_TIMEOUT_S, + ) + except asyncio.TimeoutError: + logging.warning( + "Timed out waiting for SGLang Request ID %s to register", + submitted_request_id, + ) + return + if request_id is None: + logging.debug( + "Abandoning SGLang abort for Context %s; request never registered", + context_id, + ) + return + await self._abort_sglang_request( + tokenizer_manager, + request_id, + registry, + context_id, + ) + + @staticmethod + def _resolved_request_id(request_id_future: asyncio.Future) -> str: + if request_id_future.done() and not request_id_future.cancelled(): + try: + return request_id_future.result() + except Exception: + pass + return "unknown" + + async def _handle_cancellation( + self, + request_id_future: asyncio.Future, + context: Context, + submitted_request_id: str | None = None, + request_ids: set[str] | None = None, + ) -> asyncio.Task[Any] | None: + """Wait for cancellation, then order an exact SGLang abort.""" + logging.debug("Cancellation monitor started for Context: %s", context.id()) + ordered_abort_task = None + request_id = submitted_request_id + try: + if request_id is None: + request_id = await request_id_future + async with self._wait_for_signal(context) as shutdown_requested: + tokenizer_manager = getattr(self.engine, "tokenizer_manager", None) + registry = self._request_registry( + tokenizer_manager, submitted_request_id + ) + logging.info( + "Cancellation or shutdown signal received for SGLang Request ID %s, Context: %s", + request_id, + context.id(), + ) + if tokenizer_manager is None: + logging.error( + "SGLang tokenizer_manager not found for abort request: %s", + context.id(), + ) + elif submitted_request_id is not None and registry is not None: + ordered_abort_task = self._start_ordered_abort( + tokenizer_manager, + request_id_future, + submitted_request_id, + registry, + context.id(), + ) + elif request_ids is not None: + self._abort_requests(request_ids, context) + else: + try: + await self._abort_sglang_request( + tokenizer_manager, request_id, registry, context.id() + ) + except Exception: + logging.exception( + "Failed to abort SGLang Request ID %s, Context: %s", + request_id, + context.id(), + ) + if shutdown_requested: + if ordered_abort_task is not None: + try: + await asyncio.wait_for( + asyncio.shield(ordered_abort_task), + timeout=_CANCELLATION_DRAIN_TIMEOUT_S, + ) + except asyncio.TimeoutError: + logging.warning( + "Timed out waiting for ordered SGLang abort during shutdown" + ) + except asyncio.CancelledError: + if not ordered_abort_task.cancelled(): + raise + except Exception: + pass + raise EngineShutdown("Engine was shut down during token generation") + return ordered_abort_task + except asyncio.CancelledError: + logging.debug( + "Cancellation monitor task cancelled for SGLang Request ID %s, Context: %s", + self._resolved_request_id(request_id_future), + context.id(), + ) + raise + + async def _wait_for_dispatch( + self, + registry: Mapping[str, Any], + request_id: str, + state: Any, + ) -> bool: + time_stats = getattr(state, "time_stats", None) + if time_stats is None or not hasattr( + time_stats, "api_server_dispatch_finish_time" + ): + return False + delay = 0.001 + deadline = ( + asyncio.get_running_loop().time() + _CANCELLATION_DISPATCH_WAIT_TIMEOUT_S + ) + while registry.get(request_id) is state: + if getattr(time_stats, "api_server_dispatch_finish_time", None): + return True + remaining = deadline - asyncio.get_running_loop().time() + if remaining <= 0: + logging.warning( + "Timed out waiting for SGLang Request ID %s to dispatch", + request_id, + ) + return False + await asyncio.sleep(min(delay, remaining)) + delay = min(delay * 2, _CANCELLATION_POLL_MAX_DELAY_S) + return False + + @staticmethod + def _submit_abort(tokenizer_manager: Any, request_id: str, context_id: str) -> None: + tokenizer_manager.abort_request(rid=request_id, abort_all=False) + logging.info("Aborted Request ID: %s", context_id) + + @staticmethod + def _requires_abort_retry(server_args: Any, dispatch_observed: bool) -> bool: + return ( + not dispatch_observed + or getattr(server_args, "pp_size", 1) > 1 + or ( + getattr(server_args, "enable_dp_attention", False) + and not getattr( + server_args, "enable_dp_attention_local_control_broadcast", False + ) + ) + ) + + async def _retry_abort( + self, + tokenizer_manager: Any, + request_id: str, + registry: Mapping[str, Any], + state: Any, + ) -> None: + delay = 0.05 + for retry in range(_CANCELLATION_ABORT_RETRY_LIMIT): + await asyncio.sleep(delay) + if registry.get(request_id) is not state: + return + logging.debug("Retrying SGLang abort_request for Request ID %s", request_id) + tokenizer_manager.abort_request(rid=request_id, abort_all=False) + delay = min(delay * 2, 1.0) + if registry.get(request_id) is state: + logging.warning( + "SGLang request %s remained registered after %d abort retries", + request_id, + retry + 1, + ) + + async def _abort_sglang_request( + self, + tokenizer_manager: Any, + request_id: str, + registry: Mapping[str, Any] | None, + context_id: str, + ) -> None: + state = registry.get(request_id) if registry is not None else None + if registry is None or state is None: + self._submit_abort(tokenizer_manager, request_id, context_id) + return + dispatch_observed = await self._wait_for_dispatch(registry, request_id, state) + if registry.get(request_id) is not state: + return + self._submit_abort(tokenizer_manager, request_id, context_id) + server_args = resolved_server_args(self.config.server_args) + if self._requires_abort_retry(server_args, dispatch_observed): + self._start_abort_retry(tokenizer_manager, request_id, registry, state) + + @asynccontextmanager + async def _cancellation_monitor( + self, + request_id_future: asyncio.Future, + context: Context, + submitted_request_id: str | None = None, + request_ids: set[str] | None = None, + ) -> AsyncGenerator[asyncio.Task, None]: + """Own the cancellation monitor task for one response stream.""" + logging.debug( + "Creating cancellation monitor task for Context: %s", context.id() + ) + cancellation_task = asyncio.create_task( + self._handle_cancellation( + request_id_future, + context, + submitted_request_id, + request_ids, + ) + ) + + try: + yield cancellation_task + finally: + request_id = self._resolved_request_id(request_id_future) + ordered_abort_task = None + try: + if not cancellation_task.done(): + logging.debug( + "Cancelling cancellation monitor task for SGLang Request ID %s, Context: %s", + request_id, + context.id(), + ) + cancellation_task.cancel() + try: + await cancellation_task + except asyncio.CancelledError: + pass + else: + ordered_abort_task = cancellation_task.result() + finally: + if not request_id_future.done() and ordered_abort_task is None: + request_id_future.cancel() + if request_ids is not None: + if ordered_abort_task is not None and submitted_request_id is not None: + request_ids.discard(submitted_request_id) + self._abort_requests(request_ids, context) + + if self.shutdown_event and self.shutdown_event.is_set(): + raise EngineShutdown("Engine was shut down during token generation") diff --git a/components/src/dynamo/sglang/request_handlers/handler_base.py b/components/src/dynamo/sglang/request_handlers/handler_base.py index 6d16ecb56c39..0c851937e264 100644 --- a/components/src/dynamo/sglang/request_handlers/handler_base.py +++ b/components/src/dynamo/sglang/request_handlers/handler_base.py @@ -9,17 +9,7 @@ import re import threading from abc import ABC, abstractmethod -from contextlib import asynccontextmanager -from typing import ( - Any, - AsyncGenerator, - AsyncIterator, - Dict, - Generic, - Optional, - Tuple, - TypeVar, -) +from typing import Any, AsyncIterator, Dict, Generic, Optional, Tuple, TypeVar import sglang as sgl from sglang.srt.managers.io_struct import ProfileReq @@ -44,13 +34,14 @@ register_llm, unregister_llm, ) -from dynamo.llm.exceptions import EngineShutdown from dynamo.runtime import DistributedRuntime +from dynamo.sglang._compat import supports_disagg_prefill_cancel_anytime from dynamo.sglang.args import Config from dynamo.sglang.capacity import kv_event_block_size from dynamo.sglang.engine_routes import resolve_configured_engine_routes from dynamo.sglang.gateway import follow_pause_broadcasts from dynamo.sglang.publisher import DynamoSglangPublisher +from dynamo.sglang.request_handlers.cancellation import CancellationMixin logger = logging.getLogger(__name__) @@ -557,7 +548,9 @@ async def list_loras(self, _request: Optional[Dict[str, Any]] = None): yield {"status": "error", "message": str(e)} -class BaseWorkerHandler(LoraMixin, BaseGenerativeHandler[RequestT, ResponseT]): +class BaseWorkerHandler( + CancellationMixin, LoraMixin, BaseGenerativeHandler[RequestT, ResponseT] +): """Abstract base class for SGLang LLM worker handlers. Extends BaseGenerativeHandler with LLM-specific functionality: @@ -592,6 +585,14 @@ def __init__( self.generate_endpoint = generate_endpoint self.publisher = publisher self.shutdown_event = shutdown_event + self._abort_tasks: set[asyncio.Task[Any]] = set() + self._supports_ordered_cancellation = ( + engine is not None and supports_disagg_prefill_cancel_anytime(engine) + ) + logger.info( + "SGLang ordered cancellation support: %s", + self._supports_ordered_cancellation, + ) if publisher is not None: self.metrics_publisher = publisher.metrics_publisher self.kv_publisher = publisher.kv_publisher @@ -978,6 +979,7 @@ def generate(self, request: RequestT, context: Context) -> AsyncIterator[Respons def cleanup(self) -> None: """Cleanup resources. Override in subclasses as needed.""" + self._cancel_abort_tasks() if self.publisher is not None: self.publisher.cleanup() @@ -1174,161 +1176,3 @@ def _get_bootstrap_info(engine: sgl.Engine) -> Tuple[str, int]: ) return bootstrap_host, bootstrap_port - - def _abort_requests(self, request_ids: set[str], context: Context) -> None: - if not request_ids: - return - if not getattr(self.engine, "tokenizer_manager", None): - logging.error("SGLang tokenizer_manager not found for abort requests") - return - for request_id in request_ids: - self.engine.tokenizer_manager.abort_request(rid=request_id, abort_all=False) - request_ids.clear() - logging.info("Aborted Request ID: %s", context.id()) - - async def _handle_cancellation( - self, - request_id_future: asyncio.Future, - context: Context, - request_ids: set[str] | None = None, - ): - """Background task to handle cancellation and shutdown by monitoring both signals. - - Args: - request_id_future: Future that will be set with the SGLang request ID - when the first response arrives. - context: Context object for cancellation handling. - request_ids: Live set of unfinished parallel-choice IDs, when available. - - Raises: - EngineShutdown: If shutdown event was triggered. - """ - cancellation_future: asyncio.Future[Any] | None = None - shutdown_task: asyncio.Task[Any] | None = None - try: - logging.debug(f"Cancellation monitor started for Context: {context.id()}") - - # Always wait for the request ID to ensure we can abort the request - sglang_request_id = await request_id_future - logging.debug( - f"Cancellation monitor received SGLang Request ID {sglang_request_id} for Context: {context.id()}" - ) - logging.debug(f"Request ID future cancelled for Context: {context.id()}") - - # Get the cancellation future - cancellation_future = context.async_killed_or_stopped() - - # Build list of futures/tasks to wait for - wait_for: list[asyncio.Future[Any]] = [cancellation_future] - - if self.shutdown_event: - # Create task for shutdown monitoring and add to wait list - shutdown_task = asyncio.create_task(self.shutdown_event.wait()) - wait_for.append(shutdown_task) - - # Wait for whichever happens first - done, pending = await asyncio.wait( - wait_for, - return_when=asyncio.FIRST_COMPLETED, - ) - - # Cancel the pending task/future - for task in pending: - task.cancel() - try: - await task - except asyncio.CancelledError: - pass - - logging.info( - f"Cancellation or shutdown signal received for SGLang Request ID {sglang_request_id}, Context: {context.id()}" - ) - - self._abort_requests( - request_ids if request_ids is not None else {sglang_request_id}, context - ) - - # Check which event triggered and raise EngineShutdown if shutdown - if shutdown_task and shutdown_task in done: - raise EngineShutdown("Engine was shut down during token generation") - - except asyncio.CancelledError: - # Task was cancelled, which is expected when generation completes - request_id = "unknown" - if request_id_future.done() and not request_id_future.cancelled(): - try: - request_id = request_id_future.result() - except Exception: - pass - logging.debug( - f"Cancellation monitor task cancelled for SGLang Request ID {request_id}, Context: {context.id()}" - ) - raise - finally: - for awaitable in (cancellation_future, shutdown_task): - if awaitable is None or awaitable.done(): - continue - awaitable.cancel() - try: - await awaitable - except (asyncio.CancelledError, Exception): - pass - - @asynccontextmanager - async def _cancellation_monitor( - self, - request_id_future: asyncio.Future, - context: Context, - request_ids: set[str] | None = None, - ) -> AsyncGenerator[asyncio.Task, None]: - """ - Context manager for monitoring request cancellation and shutdown. - Automatically creates a background task to monitor for cancellation and - shutdown events, cleaning it up when the context exits. - - If shutdown event was triggered, raises EngineShutdown on exit. - - Args: - request_id_future: Future that will be set with the SGLang request ID - when the first response arrives. - context: Context object for cancellation handling - request_ids: Live set of unfinished parallel-choice IDs to abort on exit. - - Yields: - asyncio.Task: The cancellation monitoring task being managed - """ - logging.debug(f"Creating cancellation monitor task for Context: {context.id()}") - - # Start the cancellation monitoring task - cancellation_task = asyncio.create_task( - self._handle_cancellation(request_id_future, context, request_ids) - ) - - try: - yield cancellation_task - finally: - # Stream closure can beat the monitor's cancellation wake-up. - if request_ids is not None: - self._abort_requests(request_ids, context) - # Clean up the background cancellation task - request_id = "unknown" - if request_id_future.done() and not request_id_future.cancelled(): - try: - request_id = request_id_future.result() - except Exception: - pass - - if not cancellation_task.done(): - logging.debug( - f"Cancelling cancellation monitor task for SGLang Request ID {request_id}, Context: {context.id()}" - ) - cancellation_task.cancel() - try: - await cancellation_task - except asyncio.CancelledError: - pass - else: - cancellation_task.result() - - if self.shutdown_event and self.shutdown_event.is_set(): - raise EngineShutdown("Engine was shut down during token generation") diff --git a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py index 9c4975766e79..347039b84ce4 100644 --- a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py +++ b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py @@ -32,6 +32,7 @@ build_native_generate_request, native_generate_payload, native_generate_stream, + new_sglang_request_id, ) from dynamo.sglang.publisher import DynamoSglangPublisher from dynamo.sglang.request_handlers.handler_base import BaseWorkerHandler @@ -142,6 +143,95 @@ def _sampling_option_params(values: Dict[str, Any]) -> Dict[str, Any]: return params +def _ordered_cancellation_request_id( + request_id: str, + sampling_params: Any, + *, + supported: bool, + batched: bool = False, +) -> str | None: + """Use pre-output cancellation only when SGLang preserves the submitted ID.""" + if not supported or batched: + return None + if isinstance(sampling_params, list): + sampling_params = sampling_params[0] if sampling_params else {} + if isinstance(sampling_params, Mapping): + sample_count = sampling_params.get("n") or 1 + beam_width = sampling_params.get("beam_width") or 1 + # SGLang parallel sampling replaces normalized ``rid_`` values + # with unrelated UUIDs before scheduler dispatch. Until SGLang exposes + # a group abort API, the submitted ID cannot order a safe exact abort. + if sample_count > 1 and beam_width <= 1: + return None + return request_id + + +def _native_payload_is_batched(native_payload: Mapping[str, Any]) -> bool: + for field in ("prompt", "text"): + if isinstance(native_payload.get(field), list): + return True + input_ids = native_payload.get("input_ids") + if isinstance(input_ids, list) and input_ids and isinstance(input_ids[0], list): + return True + input_embeds = native_payload.get("input_embeds") + return bool( + isinstance(input_embeds, list) + and input_embeds + and isinstance(input_embeds[0], list) + and input_embeds[0] + and isinstance(input_embeds[0][0], list) + ) + + +def _native_session_request_id( + native_payload: Mapping[str, Any], context_id: str +) -> str | None: + """Preserve the public node ID used by SGLang session continuations.""" + if native_payload.get("session_params") is None: + return None + request_id = native_payload.get("rid") + if request_id is None or request_id == "": + return context_id + if not isinstance(request_id, str): + raise ValueError("native SGLang session requests require a scalar rid") + return request_id + + +def _public_native_response_id( + engine_response_id: Any, + response_index: Any, + internal_request_id: str | None, + response_request_id: str | list[str] | None, +) -> Any: + """Map only response IDs derived from Dynamo's submitted SGLang ID.""" + if not isinstance(engine_response_id, str) or not isinstance( + internal_request_id, str + ): + return engine_response_id + if engine_response_id == internal_request_id: + return ( + response_request_id + if isinstance(response_request_id, str) + else engine_response_id + ) + if ( + not isinstance(response_index, int) + or isinstance(response_index, bool) + or response_index < 0 + or engine_response_id != f"{internal_request_id}_{response_index}" + ): + return engine_response_id + if isinstance(response_request_id, str): + return f"{response_request_id}_{response_index}" + if ( + isinstance(response_request_id, list) + and response_index < len(response_request_id) + and isinstance(response_request_id[response_index], str) + ): + return response_request_id[response_index] + return engine_response_id + + def _user_stop_token_ids(request: Dict[str, Any]) -> set[int]: stop_conditions = request.get("stop_conditions") if isinstance(stop_conditions, dict): @@ -429,6 +519,7 @@ def _native_generate_stream( native_payload: Mapping[str, Any], input_param: Dict[str, Any], context: Context, + sglang_request_id: str, priority: int | None, ) -> AsyncIterator[Dict[str, Any]]: """Build and dispatch one native SGLang request.""" @@ -449,14 +540,14 @@ def _native_generate_stream( native_request = build_native_generate_request( native_payload, input_ids=input_ids, - fallback_rid=context.trace_id or context.id(), + fallback_rid=sglang_request_id, priority=self._priority_kwargs(priority).get("priority"), bootstrap_host=bootstrap_info.get("bootstrap_host"), bootstrap_port=bootstrap_info.get("bootstrap_port"), bootstrap_room=bootstrap_info.get("bootstrap_room"), - external_trace_header=context.trace_headers() - if self.enable_trace - else None, + external_trace_header=( + context.trace_headers() if self.enable_trace else None + ), routed_dp_rank=routing.get("dp_rank"), lora_path=self._resolve_lora(request), ) @@ -484,24 +575,60 @@ async def generate( if self._first_token_source is not None: self._first_token_source.bind(context, routing.get("dp_rank")) _raise_if_conditional_disagg_bypass(request) - trace_id = context.trace_id + sglang_request_id = new_sglang_request_id() input_param = self._get_input_param(request) priority = (request.get("routing") or {}).get("priority") native_payload = native_generate_payload(request) + native_session_request_id = None if native_payload is not None: + native_session_request_id = _native_session_request_id( + native_payload, context.id() + ) + if native_session_request_id is not None: + sglang_request_id = native_session_request_id + logging.info( + "Submitted SGLang Request ID: %s, Context: %s", + sglang_request_id, + context.id(), + ) + if native_payload is not None: + submitted_request_id = _ordered_cancellation_request_id( + sglang_request_id, + native_payload.get("sampling_params"), + supported=( + getattr(self, "_supports_ordered_cancellation", False) + # Session node IDs are caller-visible. Waiting for SGLang's + # response avoids aborting an unrelated request if a caller + # reuses an active node ID. + and native_session_request_id is None + ), + batched=_native_payload_is_batched(native_payload), + ) stream = self._native_generate_stream( request, native_payload, input_param, context, + sglang_request_id, priority, ) - async for output in self._process_native_generate_stream(stream, context): + async for output in self._process_native_generate_stream( + stream, + context, + submitted_request_id=submitted_request_id, + internal_request_id=sglang_request_id, + response_request_id=native_payload.get("rid") or context.id(), + ): yield output return priority_kwargs = self._priority_kwargs(priority) sampling_params = self._build_sampling_params(request) + submitted_request_id = _ordered_cancellation_request_id( + sglang_request_id, + sampling_params, + supported=getattr(self, "_supports_ordered_cancellation", False), + ) logprob_kwargs = self._build_logprob_kwargs(request) metadata_uploader = self._metadata_uploader_from_request(request) @@ -554,7 +681,7 @@ async def generate( bootstrap_port=bootstrap_info["bootstrap_port"], bootstrap_room=bootstrap_info["bootstrap_room"], external_trace_header=trace_header, - rid=trace_id, + rid=sglang_request_id, data_parallel_rank=dp_rank, lora_path=lora_path, **logprob_kwargs, @@ -568,6 +695,7 @@ async def generate( return_tokens_as_token_ids, user_stop_token_ids=user_stop_token_ids, metadata_uploader=metadata_uploader, + submitted_request_id=submitted_request_id, ): yield out else: @@ -577,6 +705,7 @@ async def generate( request=request, user_stop_token_ids=user_stop_token_ids, metadata_uploader=metadata_uploader, + submitted_request_id=submitted_request_id, ): yield out else: @@ -638,7 +767,7 @@ async def generate( **self._routed_experts_kwargs, **mm_hashes_kwargs, external_trace_header=trace_header, - rid=trace_id, + rid=sglang_request_id, data_parallel_rank=dp_rank, lora_path=lora_path, **logprob_kwargs, @@ -652,6 +781,7 @@ async def generate( return_tokens_as_token_ids, user_stop_token_ids=user_stop_token_ids, metadata_uploader=metadata_uploader, + submitted_request_id=submitted_request_id, ): yield out else: @@ -661,6 +791,7 @@ async def generate( request=request, user_stop_token_ids=user_stop_token_ids, metadata_uploader=metadata_uploader, + submitted_request_id=submitted_request_id, ): yield out @@ -668,25 +799,65 @@ async def _process_native_generate_stream( self, stream_source: AsyncIterator[Dict[str, Any]], context: Context, + submitted_request_id: str | None = None, + internal_request_id: str | None = None, + response_request_id: str | list[str] | None = None, ) -> AsyncGenerator[Dict[str, Any], None]: """Forward opaque SGLang chunks while retaining engine cancellation.""" request_id_future: asyncio.Future[str] = asyncio.Future() + request_ids: set[str] = set() first_output_seen = False - async with self._cancellation_monitor(request_id_future, context): - async for chunk in stream_source: + async with self._cancellation_monitor( + request_id_future, + context, + submitted_request_id, + request_ids=request_ids, + ) as cancellation_task: + async for chunk in self._stream_until_cancelled( + stream_source, cancellation_task + ): native_response = chunk["engine_data"]["sglang_response"] - if not request_id_future.done(): - sglang_request_id = native_response.get("meta_info", {}).get("id") - if sglang_request_id: + output = chunk + meta_info = native_response.get("meta_info", {}) + sglang_request_id = meta_info.get("id") + if sglang_request_id: + request_ids.add(sglang_request_id) + if not request_id_future.done(): request_id_future.set_result(sglang_request_id) logging.debug(f"New SGLang Request ID: {sglang_request_id}") + if meta_info.get("finish_reason"): + request_ids.discard(sglang_request_id) + if context.is_stopped(): + if submitted_request_id is None: + self._abort_requests(request_ids, context) + continue if not first_output_seen and ( native_response.get("output_ids") or native_response.get("text") ): first_output_seen = True context.notify_first_token() + if response_request_id is not None and isinstance(meta_info, dict): + engine_response_id = meta_info.get("id") + public_response_id = _public_native_response_id( + engine_response_id, + native_response.get("index"), + internal_request_id, + response_request_id, + ) + if public_response_id != engine_response_id: + public_response = { + **native_response, + "meta_info": {**meta_info, "id": public_response_id}, + } + output = { + **chunk, + "engine_data": { + **chunk["engine_data"], + "sglang_response": public_response, + }, + } if not context.is_stopped(): - yield chunk + yield output async def _process_token_stream( self, @@ -695,6 +866,7 @@ async def _process_token_stream( return_tokens_as_token_ids: bool = False, user_stop_token_ids: set[int] | None = None, metadata_uploader: MetadataUploader | None = None, + submitted_request_id: str | None = None, ) -> AsyncGenerator[Dict[str, Any], None]: """Process token-based stream output. @@ -712,8 +884,15 @@ async def _process_token_stream( request_id_future: asyncio.Future[str] = asyncio.Future() request_ids: set[str] = set() first_output_seen = False - async with self._cancellation_monitor(request_id_future, context, request_ids): - async for res in stream_source: + async with self._cancellation_monitor( + request_id_future, + context, + submitted_request_id, + request_ids=request_ids, + ) as cancellation_task: + async for res in self._stream_until_cancelled( + stream_source, cancellation_task + ): meta_info = res.get("meta_info", {}) sglang_request_id = meta_info.get("id") if sglang_request_id: @@ -724,14 +903,11 @@ async def _process_token_stream( if meta_info.get("finish_reason"): request_ids.discard(sglang_request_id) if context.is_stopped(): - # A choice's first chunk can arrive after the monitor fired. - self._abort_requests(request_ids, context) + if submitted_request_id is None: + # A choice's first chunk can arrive after the monitor fired. + self._abort_requests(request_ids, context) continue - # Check cancellation before yielding to allow proper cleanup. - # This lets SGLang proceed to the second token generation, which will - # async context switch and allow the abort monitor to signal cancellation. - # The loop should exit by itself when context.is_stopped() returns True. # SGLang omits index for non-n/legacy chunks; treat those as # choice 0 while preserving explicit indices for n>1. output_idx = res.get("index") or 0 @@ -759,11 +935,9 @@ async def _process_token_stream( # With stream_output=True, output_ids contains only new tokens (disjoint) output_ids = res.get("output_ids", []) - # Empty, non-final chunks can happen during scheduler idle ticks. - # Keep waiting for the next chunk unless cancellation was requested. + # Keep draining empty, non-final chunks after cancellation so the + # abort monitor can run and SGLang can finish request cleanup. if not output_ids and not finish_reason: - if context.is_stopped(): - break continue if output_ids and not first_output_seen: @@ -841,6 +1015,7 @@ async def _process_text_stream( request: Dict[str, Any] | None = None, user_stop_token_ids: set[int] | None = None, metadata_uploader: MetadataUploader | None = None, + submitted_request_id: str | None = None, ) -> AsyncGenerator[Dict[str, Any], None]: """Process text-based stream output in OpenAI format. @@ -857,8 +1032,15 @@ async def _process_text_stream( request_id_future: asyncio.Future[str] = asyncio.Future() request_ids: set[str] = set() first_output_seen = False - async with self._cancellation_monitor(request_id_future, context, request_ids): - async for res in stream_source: + async with self._cancellation_monitor( + request_id_future, + context, + submitted_request_id, + request_ids=request_ids, + ) as cancellation_task: + async for res in self._stream_until_cancelled( + stream_source, cancellation_task + ): meta_info = res.get("meta_info", {}) sglang_request_id = meta_info.get("id") if sglang_request_id: @@ -869,7 +1051,8 @@ async def _process_text_stream( if meta_info.get("finish_reason"): request_ids.discard(sglang_request_id) if context.is_stopped(): - self._abort_requests(request_ids, context) + if submitted_request_id is None: + self._abort_requests(request_ids, context) continue # Check cancellation before yielding to allow proper cleanup. @@ -914,7 +1097,7 @@ async def _process_text_stream( ) response = { - "id": meta_info["id"], + "id": context.id(), "created": int(time.time()), "choices": [choice_data], "model": self.config.server_args.served_model_name, diff --git a/components/src/dynamo/sglang/tests/test_sglang_decode_cancellation.py b/components/src/dynamo/sglang/tests/test_sglang_decode_cancellation.py new file mode 100644 index 000000000000..c2024a44333b --- /dev/null +++ b/components/src/dynamo/sglang/tests/test_sglang_decode_cancellation.py @@ -0,0 +1,1190 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +import asyncio +import logging +from types import SimpleNamespace + +import pytest + +from dynamo.common.constants import DisaggregationMode +from dynamo.llm.exceptions import EngineShutdown +from dynamo.sglang.request_handlers.handler_base import BaseWorkerHandler +from dynamo.sglang.request_handlers.llm.decode_handler import DecodeWorkerHandler + +pytestmark = [ + pytest.mark.unit, + pytest.mark.sglang, + pytest.mark.fault_tolerance, + pytest.mark.gpu_0, + pytest.mark.profiled_vram_gib(0), + pytest.mark.pre_merge, +] + + +async def _collect(stream): + return [item async for item in stream] + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_cancellation_monitor_rechecks_shutdown_after_cleanup(): + handler = DecodeWorkerHandler.__new__(DecodeWorkerHandler) + handler.shutdown_event = asyncio.Event() + handler._abort_tasks = set() + + async def set_shutdown_when_cancelled(*_args): + try: + await asyncio.Future() + except asyncio.CancelledError: + handler.shutdown_event.set() + raise + + handler._handle_cancellation = set_shutdown_when_cancelled + request_id_future = asyncio.get_running_loop().create_future() + request_id_future.set_result("sglang-request-id") + context = SimpleNamespace(id=lambda: "request-id") + + with pytest.raises(EngineShutdown, match="shut down during token generation"): + async with handler._cancellation_monitor(request_id_future, context): + await asyncio.sleep(0) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_cancellation_monitor_keeps_pending_ordered_abort_alive( + decode_cancellation_case, +): + case = decode_cancellation_case + request_id_future = asyncio.get_running_loop().create_future() + + async with case.handler._cancellation_monitor( + request_id_future, + case.context, + submitted_request_id="internal-request-id", + ) as cancellation_task: + case.cancelled.set() + await asyncio.wait_for(cancellation_task, timeout=1) + + assert not request_id_future.cancelled() + case.registry["internal-request-id"] = SimpleNamespace( + time_stats=SimpleNamespace(api_server_dispatch_finish_time=1.0) + ) + case.dispatched.set() + await asyncio.wait_for(case.aborted.wait(), timeout=1) + await asyncio.gather(*tuple(case.handler._abort_tasks)) + + assert case.abort_calls == [("internal-request-id", False)] + case.registry.clear() + request_id_future.cancel() + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_pending_ordered_abort_has_bounded_registration_wait( + decode_cancellation_case, monkeypatch, caplog +): + caplog.set_level(logging.WARNING) + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation._CANCELLATION_REGISTRATION_WAIT_TIMEOUT_S", + 0, + ) + case = decode_cancellation_case + request_id_future = asyncio.get_running_loop().create_future() + + async with case.handler._cancellation_monitor( + request_id_future, + case.context, + submitted_request_id="internal-request-id", + ) as cancellation_task: + case.cancelled.set() + await asyncio.wait_for(cancellation_task, timeout=1) + + await asyncio.gather(*tuple(case.handler._abort_tasks)) + assert not case.abort_calls + assert ( + "Timed out waiting for SGLang Request ID internal-request-id to register" + in caplog.messages + ) + request_id_future.cancel() + + +@pytest.fixture +def decode_cancellation_case(monkeypatch): + handler = DecodeWorkerHandler.__new__(DecodeWorkerHandler) + handler._abort_tasks = set() + handler.shutdown_event = None + handler.use_sglang_tokenizer = False + handler.config = SimpleNamespace( + server_args=SimpleNamespace(served_model_name="test-model"), + dynamo_args=SimpleNamespace(enable_rl=False), + ) + handler._first_token_source = None + handler._supports_ordered_cancellation = True + monkeypatch.setattr( + "dynamo.sglang.request_handlers.llm.decode_handler.new_sglang_request_id", + lambda: "internal-request-id", + ) + handler.shutdown_event = asyncio.Event() + handler.serving_mode = DisaggregationMode.DECODE + handler.enable_trace = False + handler._routed_experts_kwargs = {} + handler._enable_frontend_decoding = False + handler._mm_hashes_supported = False + handler._get_input_param = lambda request: {"input_ids": [1]} + handler._build_sampling_params = lambda request: {"max_new_tokens": 1} + handler._build_logprob_kwargs = lambda request: {} + handler._resolve_lora = lambda request: None + handler._priority_kwargs = lambda priority: {} + monkeypatch.setattr( + "dynamo.sglang.request_handlers.llm.decode_handler.require_reasoning_kwargs", + lambda *args: {}, + ) + + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation.resolved_server_args", + lambda server_args: server_args, + ) + polling = asyncio.Queue() + + async def observed_sleep(delay): + polling.put_nowait(delay) + await asyncio.sleep(delay) + + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation.asyncio", + SimpleNamespace(**{**vars(asyncio), "sleep": observed_sleep}), + ) + started = asyncio.Event() + allow_registration = asyncio.Event() + registered = asyncio.Event() + allow_dispatch = asyncio.Event() + allow_dispatch.set() + dispatched = asyncio.Event() + aborted = asyncio.Event() + cancelled = asyncio.Event() + drained = asyncio.Event() + abort_calls = [] + registry = {} + + def cancellation_future(): + return asyncio.create_task(cancelled.wait()) + + context = SimpleNamespace( + id=lambda: "dynamo-request", + trace_id="trace-request", + async_killed_or_stopped=cancellation_future, + is_stopped=cancelled.is_set, + notify_first_token=lambda: None, + ) + case = SimpleNamespace( + handler=handler, + context=context, + started=started, + allow_registration=allow_registration, + registered=registered, + allow_dispatch=allow_dispatch, + dispatched=dispatched, + aborted=aborted, + cancelled=cancelled, + drained=drained, + abort_calls=abort_calls, + registry=registry, + polling=polling, + finish_without_cancel=False, + first_response=False, + cancel_before_response=False, + fail_registration=False, + fail_dispatch=False, + first_response_consumed=asyncio.Event(), + native_request=None, + request={ + "token_ids": [1], + "bootstrap_info": { + "bootstrap_host": "localhost", + "bootstrap_port": 0, + "bootstrap_room": 1, + }, + }, + ) + + async def stream(rid): + started.set() + try: + await allow_registration.wait() + if case.fail_registration: + raise ValueError("registration failed") + state = SimpleNamespace( + time_stats=SimpleNamespace(api_server_dispatch_finish_time=0.0) + ) + registry[rid] = state + registered.set() + await allow_dispatch.wait() + if case.fail_dispatch: + raise ValueError("dispatch failed") + state.time_stats.api_server_dispatch_finish_time = 1.0 + dispatched.set() + if case.finish_without_cancel: + return + if case.first_response: + if case.cancel_before_response: + cancelled.set() + yield { + "output_ids": [], + "meta_info": {"id": rid, "finish_reason": None}, + } + case.first_response_consumed.set() + await aborted.wait() + finally: + registry.pop(rid, None) + drained.set() + + def abort_request(*, rid, abort_all): + abort_calls.append((rid, abort_all)) + # Registration alone does not make a request visible to the scheduler. + if rid in registry and dispatched.is_set(): + aborted.set() + + async def async_generate(**kwargs): + return stream(kwargs["rid"]) + + def generate_request(request, context): + case.native_request = request + return stream(request.rid) + + handler.engine = SimpleNamespace( + async_generate=async_generate, + tokenizer_manager=SimpleNamespace( + rid_to_state=registry, + abort_request=abort_request, + generate_request=generate_request, + ), + ) + return case + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize("disaggregated", [False, True]) +@pytest.mark.parametrize("output_mode", ["tokens", "text", "native"]) +@pytest.mark.parametrize( + "phase", ["before_registration", "before_dispatch", "after_dispatch"] +) +@pytest.mark.parametrize("signal", ["cancel", "shutdown"]) +async def test_decode_cancels_before_first_response( + decode_cancellation_case, output_mode, phase, signal, disaggregated, caplog +): + caplog.set_level(logging.INFO) + case = decode_cancellation_case + abort_message = f"Aborted Request ID: {case.context.id()}" + if phase == "before_dispatch": + case.allow_dispatch.clear() + expected_id = "internal-request-id" + if not disaggregated: + case.handler.serving_mode = DisaggregationMode.AGGREGATED + case.handler.use_sglang_tokenizer = output_mode == "text" + if output_mode == "native": + case.request["extra_args"] = {"sglang_tito": {"rid": "caller-supplied-id"}} + + consumer = asyncio.create_task( + _collect(case.handler.generate(case.request, case.context)) + ) + try: + await asyncio.wait_for(case.started.wait(), timeout=1) + if phase != "before_registration": + case.allow_registration.set() + await asyncio.wait_for(case.registered.wait(), timeout=1) + if phase == "after_dispatch": + await asyncio.wait_for(case.dispatched.wait(), timeout=1) + if signal == "cancel": + case.cancelled.set() + else: + case.handler.shutdown_event.set() + if phase == "before_registration": + await asyncio.wait_for(case.polling.get(), timeout=1) + assert not case.abort_calls + assert abort_message not in caplog.messages + case.allow_registration.set() + elif phase == "before_dispatch": + await asyncio.wait_for(case.polling.get(), timeout=1) + assert not case.abort_calls + assert abort_message not in caplog.messages + assert not case.aborted.is_set() + assert case.registry + case.allow_dispatch.set() + + if signal == "shutdown": + with pytest.raises(EngineShutdown): + await asyncio.wait_for(consumer, timeout=1) + else: + assert await asyncio.wait_for(consumer, timeout=1) == [] + abort_results = await asyncio.gather( + *tuple(case.handler._abort_tasks), return_exceptions=True + ) + assert all( + result is None or isinstance(result, asyncio.CancelledError) + for result in abort_results + ) + assert "Detached SGLang task failed during cancellation" not in caplog.messages + assert case.abort_calls == [(expected_id, False)] + assert caplog.messages.count(abort_message) == 1 + assert case.dispatched.is_set() + assert case.aborted.is_set() + assert case.drained.is_set() + assert not case.registry + if output_mode == "native": + assert case.native_request is not None + expected_bootstrap = ( + ("localhost", 0, 1) if disaggregated else (None, None, None) + ) + assert ( + case.native_request.bootstrap_host, + case.native_request.bootstrap_port, + case.native_request.bootstrap_room, + ) == expected_bootstrap + else: + assert case.native_request is None + finally: + consumer.cancel() + await asyncio.gather(consumer, return_exceptions=True) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize( + "outcome", ["complete", "registration_error", "cancel_after_response"] +) +async def test_decode_cancellation_preserves_stream_lifetime( + decode_cancellation_case, outcome +): + case = decode_cancellation_case + case.finish_without_cancel = outcome == "complete" + case.fail_registration = outcome == "registration_error" + case.first_response = outcome == "cancel_after_response" + case.allow_registration.set() + consumer = asyncio.create_task( + _collect(case.handler.generate(case.request, case.context)) + ) + try: + if outcome == "registration_error": + with pytest.raises(ValueError, match="registration failed"): + await asyncio.wait_for(consumer, timeout=1) + else: + if case.first_response: + await asyncio.wait_for(case.first_response_consumed.wait(), timeout=1) + case.cancelled.set() + assert await asyncio.wait_for(consumer, timeout=1) == [] + expected = [("internal-request-id", False)] if case.first_response else [] + assert case.abort_calls == expected + assert case.drained.is_set() + assert not case.registry + finally: + consumer.cancel() + await asyncio.gather(consumer, return_exceptions=True) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize("native", [False, True]) +async def test_unsupported_runtime_uses_response_id_cancellation( + decode_cancellation_case, native +): + case = decode_cancellation_case + case.handler._supports_ordered_cancellation = False + case.first_response = True + case.allow_registration.set() + if native: + case.request["extra_args"] = {"sglang_tito": {"rid": "caller-supplied-id"}} + + consumer = asyncio.create_task( + _collect(case.handler.generate(case.request, case.context)) + ) + try: + await asyncio.wait_for(case.first_response_consumed.wait(), timeout=1) + assert not case.abort_calls + + case.cancelled.set() + + outputs = await asyncio.wait_for(consumer, timeout=1) + assert case.abort_calls == [("internal-request-id", False)] + if native: + assert case.native_request.rid == "internal-request-id" + assert ( + outputs[0]["engine_data"]["sglang_response"]["meta_info"]["id"] + == "caller-supplied-id" + ) + else: + assert outputs == [] + assert case.drained.is_set() + assert not case.registry + finally: + consumer.cancel() + await asyncio.gather(consumer, return_exceptions=True) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize( + ("public_request_id", "expected_request_id"), + [("session-request-2", "session-request-2"), (None, "dynamo-request")], +) +async def test_native_session_request_preserves_session_tree_ids( + decode_cancellation_case, public_request_id, expected_request_id +): + case = decode_cancellation_case + native_payload = {"session_params": {"id": "session-1", "rid": "session-request-1"}} + if public_request_id is not None: + native_payload["rid"] = public_request_id + case.request["extra_args"] = {"sglang_tito": native_payload} + case.finish_without_cancel = True + case.allow_registration.set() + + outputs = await asyncio.wait_for( + _collect(case.handler.generate(case.request, case.context)), timeout=1 + ) + + assert outputs == [] + assert case.native_request.rid == expected_request_id + assert case.native_request.session_params["rid"] == "session-request-1" + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_native_session_cancellation_uses_confirmed_response_id( + decode_cancellation_case, +): + case = decode_cancellation_case + case.request["extra_args"] = { + "sglang_tito": { + "rid": "session-request-2", + "session_params": {"id": "session-1", "rid": "session-request-1"}, + } + } + case.first_response = True + case.allow_registration.set() + + consumer = asyncio.create_task( + _collect(case.handler.generate(case.request, case.context)) + ) + try: + await asyncio.wait_for(case.first_response_consumed.wait(), timeout=1) + assert not case.abort_calls + + case.cancelled.set() + + outputs = await asyncio.wait_for(consumer, timeout=1) + assert case.abort_calls == [("session-request-2", False)] + assert ( + outputs[0]["engine_data"]["sglang_response"]["meta_info"]["id"] + == "session-request-2" + ) + finally: + consumer.cancel() + await asyncio.gather(consumer, return_exceptions=True) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_decode_logs_internal_and_context_request_ids( + decode_cancellation_case, caplog +): + caplog.set_level(logging.INFO) + case = decode_cancellation_case + case.finish_without_cancel = True + case.allow_registration.set() + + await asyncio.wait_for( + _collect(case.handler.generate(case.request, case.context)), timeout=1 + ) + + assert ( + "Submitted SGLang Request ID: internal-request-id, Context: dynamo-request" + in caplog.messages + ) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_parallel_sampling_does_not_guess_sglang_child_request_ids( + decode_cancellation_case, +): + case = decode_cancellation_case + case.handler.serving_mode = DisaggregationMode.AGGREGATED + case.handler._build_sampling_params = lambda request: { + "max_new_tokens": 1, + "n": 3, + } + case.first_response = True + case.allow_registration.set() + + async def async_generate(**kwargs): + assert kwargs["rid"] == "internal-request-id" + return case.handler.engine.tokenizer_manager.generate_request( + SimpleNamespace(rid="actual-child-uuid"), case.context + ) + + case.handler.engine.async_generate = async_generate + consumer = asyncio.create_task( + _collect(case.handler.generate(case.request, case.context)) + ) + try: + await asyncio.wait_for(case.first_response_consumed.wait(), timeout=1) + assert not case.abort_calls + + case.cancelled.set() + + assert await asyncio.wait_for(consumer, timeout=1) == [] + assert case.abort_calls == [("actual-child-uuid", False)] + assert case.drained.is_set() + assert not case.registry + finally: + consumer.cancel() + await asyncio.gather(consumer, return_exceptions=True) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_cancelled_stream_drain_is_bounded( + decode_cancellation_case, monkeypatch, caplog +): + caplog.set_level(logging.WARNING) + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation._CANCELLATION_DRAIN_TIMEOUT_S", + 0, + ) + + async def stalled_stream(): + await asyncio.Future() + yield {} + + cancellation_task = asyncio.create_task(asyncio.sleep(0)) + await cancellation_task + outputs = await _collect( + decode_cancellation_case.handler._stream_until_cancelled( + stalled_stream(), cancellation_task + ) + ) + + assert outputs == [] + assert "Timed out draining SGLang stream after cancellation" in caplog.messages + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_cancelled_stream_starts_deadline_when_chunk_is_already_ready( + decode_cancellation_case, monkeypatch, caplog +): + caplog.set_level(logging.WARNING) + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation._CANCELLATION_DRAIN_TIMEOUT_S", + 0, + ) + + async def simultaneous_wait(awaitables, **_kwargs): + await asyncio.gather(*awaitables) + return set(awaitables), set() + + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation.asyncio.wait", + simultaneous_wait, + ) + + async def buffered_stream(): + yield {"chunk": 1} + yield {"chunk": 2} + + cancellation_task = asyncio.create_task(asyncio.sleep(0)) + await cancellation_task + stream = decode_cancellation_case.handler._stream_until_cancelled( + buffered_stream(), cancellation_task + ) + + assert await anext(stream) == {"chunk": 1} + with pytest.raises(StopAsyncIteration): + await anext(stream) + assert "Timed out draining SGLang stream after cancellation" in caplog.messages + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_cancelled_stream_drain_does_not_wait_for_resistant_iterator( + decode_cancellation_case, monkeypatch, caplog +): + caplog.set_level(logging.WARNING) + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation._CANCELLATION_DRAIN_TIMEOUT_S", + 0.01, + ) + cancellation_seen = asyncio.Event() + iterator_finished = asyncio.Event() + + async def resistant_stream(): + try: + await asyncio.sleep(1) + except asyncio.CancelledError: + cancellation_seen.set() + await asyncio.sleep(0.2) + iterator_finished.set() + yield {} + + cancellation_task = asyncio.create_task(asyncio.sleep(0)) + await cancellation_task + started = asyncio.get_running_loop().time() + outputs = await _collect( + decode_cancellation_case.handler._stream_until_cancelled( + resistant_stream(), cancellation_task + ) + ) + elapsed = asyncio.get_running_loop().time() - started + + assert outputs == [] + assert elapsed < 0.1 + assert "Timed out draining SGLang stream after cancellation" in caplog.messages + await asyncio.wait_for(iterator_finished.wait(), timeout=1) + assert cancellation_seen.is_set() + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_decode_cancellation_drains_buffered_empty_chunk( + decode_cancellation_case, +): + case = decode_cancellation_case + case.first_response = True + case.cancel_before_response = True + case.allow_registration.set() + + outputs = await asyncio.wait_for( + _collect(case.handler.generate(case.request, case.context)), timeout=1 + ) + + assert outputs == [] + assert case.abort_calls == [("internal-request-id", False)] + assert case.first_response_consumed.is_set() + assert case.drained.is_set() + assert not case.registry + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize("submitted_request_id", [None, "internal-request-id_0"]) +async def test_cancellation_monitor_aborts_parallel_ids_on_stream_close( + decode_cancellation_case, submitted_request_id +): + case = decode_cancellation_case + request_id_future = asyncio.get_running_loop().create_future() + request_id_future.set_result("internal-request-id_0") + request_ids = {"internal-request-id_0", "internal-request-id_1"} + + async with case.handler._cancellation_monitor( + request_id_future, + case.context, + submitted_request_id=submitted_request_id, + request_ids=request_ids, + ): + pass + + assert set(case.abort_calls) == { + ("internal-request-id_0", False), + ("internal-request-id_1", False), + } + assert not request_ids + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize("state_kind", ["no_registry", "missing", "null_stats"]) +@pytest.mark.parametrize("abort_fails", [False, True]) +async def test_cancellation_monitor_logs_only_submitted_abort( + decode_cancellation_case, caplog, state_kind, abort_fails +): + caplog.set_level(logging.INFO) + case = decode_cancellation_case + rid = case.context.trace_id + registry = None if state_kind == "no_registry" else case.registry + if state_kind == "null_stats": + case.registry[rid] = SimpleNamespace(time_stats=None) + + def abort_request(*, rid, abort_all): + assert f"Aborted Request ID: {case.context.id()}" not in caplog.messages + if abort_fails: + raise RuntimeError("abort failed") + case.abort_calls.append((rid, abort_all)) + case.registry.pop(rid, None) + + manager = case.handler.engine.tokenizer_manager + manager.abort_request = abort_request + abort = case.handler._abort_sglang_request( + manager, rid, registry, case.context.id() + ) + if abort_fails: + with pytest.raises(RuntimeError, match="abort failed"): + await abort + else: + await abort + await asyncio.gather(*case.handler._abort_tasks) + assert case.abort_calls == ([] if abort_fails else [(rid, False)]) + assert caplog.messages.count(f"Aborted Request ID: {case.context.id()}") == ( + 0 if abort_fails else 1 + ) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize("reuse_rid", [False, True]) +@pytest.mark.parametrize("waiting_for", ["dispatch", "retry"]) +async def test_cancellation_monitor_stops_when_request_finishes( + decode_cancellation_case, monkeypatch, reuse_rid, waiting_for, caplog +): + """Neither a dispatch wait nor a retry may abort a replacement request.""" + caplog.set_level(logging.INFO) + case = decode_cancellation_case + rid = case.context.trace_id + case.registry[rid] = ( + SimpleNamespace(time_stats=SimpleNamespace(api_server_dispatch_finish_time=0.0)) + if waiting_for == "dispatch" + else object() + ) + sleeping = asyncio.Event() + resume = asyncio.Event() + + async def controlled_sleep(delay): + sleeping.set() + await resume.wait() + + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation.asyncio", + SimpleNamespace(**{**vars(asyncio), "sleep": controlled_sleep}), + ) + request_id_future = asyncio.get_running_loop().create_future() + monitor = asyncio.create_task( + case.handler._handle_cancellation(request_id_future, case.context, rid) + ) + try: + case.cancelled.set() + await asyncio.wait_for(sleeping.wait(), timeout=1) + case.registry.pop(rid) + if reuse_rid: + case.registry[rid] = object() + resume.set() + await asyncio.wait_for(monitor, timeout=1) + await asyncio.gather(*case.handler._abort_tasks) + expected = [(rid, False)] if waiting_for == "retry" else [] + assert case.abort_calls == expected + assert caplog.messages.count(f"Aborted Request ID: {case.context.id()}") == len( + expected + ) + assert not request_id_future.done() + finally: + monitor.cancel() + await asyncio.gather(monitor, return_exceptions=True) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize("outcome", ["complete", "error"]) +async def test_decode_stream_exit_retains_pending_abort_wait( + decode_cancellation_case, monkeypatch, outcome +): + case = decode_cancellation_case + case.allow_registration.set() + case.allow_dispatch.clear() + case.finish_without_cancel = True + sleeping = asyncio.Event() + wait_cancelled = asyncio.Event() + + async def controlled_sleep(delay): + sleeping.set() + try: + await asyncio.Future() + finally: + wait_cancelled.set() + + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation.asyncio", + SimpleNamespace(**{**vars(asyncio), "sleep": controlled_sleep}), + ) + case.fail_dispatch = outcome == "error" + consumer = asyncio.create_task( + _collect(case.handler.generate(case.request, case.context)) + ) + try: + await asyncio.wait_for(case.registered.wait(), timeout=1) + case.cancelled.set() + await asyncio.wait_for(sleeping.wait(), timeout=1) + case.allow_dispatch.set() + if outcome == "error": + with pytest.raises(ValueError, match="dispatch failed"): + await asyncio.wait_for(consumer, timeout=1) + else: + assert await asyncio.wait_for(consumer, timeout=1) == [] + assert not case.abort_calls + assert case.drained.is_set() + assert not case.registry + abort_tasks = tuple(case.handler._abort_tasks) + assert abort_tasks + case.handler._cancel_abort_tasks() + await asyncio.gather(*abort_tasks, return_exceptions=True) + assert wait_cancelled.is_set() + finally: + consumer.cancel() + await asyncio.gather(consumer, return_exceptions=True) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize("signal", ["cancel", "shutdown"]) +async def test_cancellation_monitor_without_tokenizer_manager( + decode_cancellation_case, signal +): + case = decode_cancellation_case + case.handler.engine = None + if signal == "cancel": + case.cancelled.set() + else: + case.handler.shutdown_event.set() + monitor = case.handler._handle_cancellation( + asyncio.get_running_loop().create_future(), case.context, case.context.trace_id + ) + if signal == "shutdown": + with pytest.raises(EngineShutdown): + await asyncio.wait_for(monitor, timeout=1) + else: + await asyncio.wait_for(monitor, timeout=1) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_cancellation_monitor_without_request_registry(decode_cancellation_case): + case = decode_cancellation_case + abort_calls = [] + + def abort_request(*, rid, abort_all): + abort_calls.append((rid, abort_all)) + + tokenizer_manager = SimpleNamespace(abort_request=abort_request) + tokenizer_manager.rid_to_state = [] + case.handler.engine = SimpleNamespace(tokenizer_manager=tokenizer_manager) + case.cancelled.set() + + await asyncio.wait_for( + case.handler._handle_cancellation( + asyncio.get_running_loop().create_future(), + case.context, + case.context.trace_id, + ), + timeout=1, + ) + + assert abort_calls == [(case.context.trace_id, False)] + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize( + "server_args, has_dispatch_time, expect_retry", + [ + ({}, True, False), + ({"dp_size": 2}, True, False), + ({"enable_dp_attention": True}, True, True), + ( + { + "enable_dp_attention": True, + "enable_dp_attention_local_control_broadcast": True, + }, + True, + False, + ), + ({"pp_size": 2}, True, True), + ({}, False, True), + ], + ids=["tp", "dp", "dp-attention-global", "dp-attention-local", "pp", "legacy"], +) +async def test_cancellation_monitor_retries_only_without_ordered_dispatch( + decode_cancellation_case, monkeypatch, server_args, has_dispatch_time, expect_retry +): + case = decode_cancellation_case + # SGLang may keep raw and effective server arguments separately. + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation.resolved_server_args", + lambda raw_args: SimpleNamespace(**server_args), + ) + rid = case.context.trace_id + case.registry[rid] = ( + SimpleNamespace(time_stats=SimpleNamespace(api_server_dispatch_finish_time=1.0)) + if has_dispatch_time + else object() + ) + + def abort_request(*, rid, abort_all): + case.abort_calls.append((rid, abort_all)) + # Leave the state registered after the first abort. A single-abort path + # must exit on its own, independently of the consumer draining the stream. + if len(case.abort_calls) == 2: + case.registry.pop(rid) + + case.handler.engine.tokenizer_manager.abort_request = abort_request + case.cancelled.set() + await asyncio.wait_for( + case.handler._handle_cancellation( + asyncio.get_running_loop().create_future(), case.context, rid + ), + timeout=1, + ) + await asyncio.gather(*case.handler._abort_tasks) + assert case.abort_calls == [(rid, False)] * (2 if expect_retry else 1) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_cancellation_monitor_bounds_abort_retries( + decode_cancellation_case, monkeypatch, caplog +): + caplog.set_level(logging.WARNING) + case = decode_cancellation_case + rid = "internal-request-id" + case.registry[rid] = SimpleNamespace( + time_stats=SimpleNamespace(api_server_dispatch_finish_time=0.0) + ) + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation._CANCELLATION_DISPATCH_WAIT_TIMEOUT_S", + 0, + ) + + async def immediate_sleep(_delay): + await asyncio.sleep(0) + + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation.asyncio", + SimpleNamespace(**{**vars(asyncio), "sleep": immediate_sleep}), + ) + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation.resolved_server_args", + lambda raw_args: SimpleNamespace(), + ) + + await asyncio.wait_for( + case.handler._abort_sglang_request( + case.handler.engine.tokenizer_manager, + rid, + case.registry, + case.context.id(), + ), + timeout=1, + ) + assert ( + "Timed out waiting for SGLang Request ID internal-request-id to dispatch" + in caplog.messages + ) + + await asyncio.gather(*case.handler._abort_tasks) + assert case.abort_calls == [(rid, False)] * 9 + assert ( + "SGLang request internal-request-id remained registered after 8 abort retries" + in caplog.messages + ) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_stream_drain_starts_before_abort_retries_complete( + decode_cancellation_case, monkeypatch +): + case = decode_cancellation_case + rid = "internal-request-id" + state = SimpleNamespace( + time_stats=SimpleNamespace(api_server_dispatch_finish_time=1.0) + ) + case.registry[rid] = state + retry_started = asyncio.Event() + release_retry = asyncio.Event() + + async def blocked_retry(*_args): + retry_started.set() + await release_retry.wait() + + async def stalled_stream(): + await asyncio.Future() + yield {} + + monkeypatch.setattr(case.handler, "_retry_abort", blocked_retry) + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation.resolved_server_args", + lambda raw_args: SimpleNamespace(pp_size=2), + ) + monkeypatch.setattr( + "dynamo.sglang.request_handlers.cancellation._CANCELLATION_DRAIN_TIMEOUT_S", + 0, + ) + + case.cancelled.set() + cancellation_task = asyncio.create_task( + case.handler._handle_cancellation( + asyncio.get_running_loop().create_future(), case.context, rid + ) + ) + stream_task = asyncio.create_task( + _collect( + case.handler._stream_until_cancelled(stalled_stream(), cancellation_task) + ) + ) + try: + await asyncio.wait_for(retry_started.wait(), timeout=1) + assert await asyncio.wait_for(stream_task, timeout=0.1) == [] + assert cancellation_task.done() + assert case.abort_calls == [(rid, False)] + finally: + retry_tasks = tuple(case.handler._abort_tasks) + release_retry.set() + await asyncio.gather( + cancellation_task, stream_task, *retry_tasks, return_exceptions=True + ) + assert not case.handler._abort_tasks + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_cancel_abort_tasks_cancels_and_releases_owned_tasks( + decode_cancellation_case, monkeypatch +): + case = decode_cancellation_case + retry_started = asyncio.Event() + + async def blocked_retry(*_args): + retry_started.set() + await asyncio.Future() + + monkeypatch.setattr(case.handler, "_retry_abort", blocked_retry) + case.handler._start_abort_retry(object(), "request-id", {}, object()) + await asyncio.wait_for(retry_started.wait(), timeout=1) + retry_task = next(iter(case.handler._abort_tasks)) + + case.handler._cancel_abort_tasks() + with pytest.raises(asyncio.CancelledError): + await retry_task + await asyncio.sleep(0) + + assert not case.handler._abort_tasks + + +def test_base_worker_cleanup_cancels_abort_tasks(): + handler = DecodeWorkerHandler.__new__(DecodeWorkerHandler) + handler.publisher = None + cleanup_calls = [] + handler._cancel_abort_tasks = lambda: cleanup_calls.append("cancel") + + BaseWorkerHandler.cleanup(handler) + + assert cleanup_calls == ["cancel"] + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize("phase", ["registration", "dispatch"]) +async def test_cancellation_monitor_preserves_abort_ordering( + decode_cancellation_case, phase +): + case = decode_cancellation_case + rid = "internal-request-id" + state = SimpleNamespace( + time_stats=SimpleNamespace(api_server_dispatch_finish_time=0.0) + ) + + if phase == "dispatch": + case.registry[rid] = state + + case.cancelled.set() + operation = asyncio.create_task( + case.handler._handle_cancellation( + asyncio.get_running_loop().create_future(), + case.context, + rid, + ) + ) + + await asyncio.wait_for(case.polling.get(), timeout=1) + await asyncio.wait_for(operation, timeout=1) + assert not case.abort_calls + case.registry[rid] = state + state.time_stats.api_server_dispatch_finish_time = 1.0 + + await asyncio.gather(*case.handler._abort_tasks) + assert case.abort_calls == [(rid, False)] + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_ordered_abort_stops_when_stream_ends_before_registration( + decode_cancellation_case, caplog +): + caplog.set_level(logging.DEBUG) + case = decode_cancellation_case + request_id_future = asyncio.get_running_loop().create_future() + request_id_future.cancel() + + await case.handler._abort_after_registration( + case.handler.engine.tokenizer_manager, + request_id_future, + "internal-request-id", + case.registry, + case.context.id(), + ) + + assert not case.abort_calls + assert ( + "Abandoning SGLang abort for Context dynamo-request; request never registered" + in caplog.messages + ) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_cancellation_monitor_logs_fallback_abort_failure( + decode_cancellation_case, caplog +): + caplog.set_level(logging.ERROR) + case = decode_cancellation_case + case.handler.engine.tokenizer_manager.rid_to_state = [] + + def abort_request(*, rid, abort_all): + raise RuntimeError("abort failed") + + case.handler.engine.tokenizer_manager.abort_request = abort_request + case.cancelled.set() + + await case.handler._handle_cancellation( + asyncio.get_running_loop().create_future(), + case.context, + "internal-request-id", + ) + + assert ( + "Failed to abort SGLang Request ID internal-request-id, Context: dynamo-request" + in caplog.messages + ) + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_shutdown_survives_ordered_abort_cleanup(decode_cancellation_case): + case = decode_cancellation_case + rid = "internal-request-id" + case.registry[rid] = SimpleNamespace( + time_stats=SimpleNamespace(api_server_dispatch_finish_time=0.0) + ) + case.handler.shutdown_event = asyncio.Event() + case.handler.shutdown_event.set() + operation = asyncio.create_task( + case.handler._handle_cancellation( + asyncio.get_running_loop().create_future(), + case.context, + rid, + ) + ) + + await asyncio.wait_for(case.polling.get(), timeout=1) + abort_task = next(iter(case.handler._abort_tasks)) + abort_task.cancel() + + with pytest.raises(EngineShutdown): + await operation diff --git a/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py b/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py index 43ef54aaf900..3f20e8eac7a5 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py +++ b/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py @@ -26,8 +26,11 @@ from dynamo.sglang.request_handlers.llm.decode_handler import ( DecodeWorkerHandler, _extract_sglang_stop_reason, + _native_payload_is_batched, _nvext_extra_field_requested, _openai_stop_sampling_params, + _ordered_cancellation_request_id, + _public_native_response_id, _user_stop_token_ids, ) from dynamo.sglang.request_handlers.llm.mm_disagg_utils import ( @@ -48,28 +51,6 @@ ] -@pytest.mark.asyncio -async def test_cancellation_monitor_rechecks_shutdown_after_cleanup(): - handler = DecodeWorkerHandler.__new__(DecodeWorkerHandler) - handler.shutdown_event = asyncio.Event() - - async def set_shutdown_when_cancelled(*_args): - try: - await asyncio.Future() - except asyncio.CancelledError: - handler.shutdown_event.set() - raise - - handler._handle_cancellation = set_shutdown_when_cancelled - request_id_future = asyncio.get_running_loop().create_future() - request_id_future.set_result("sglang-request-id") - context = SimpleNamespace(id=lambda: "request-id") - - with pytest.raises(EngineShutdown, match="shut down during token generation"): - async with handler._cancellation_monitor(request_id_future, context): - await asyncio.sleep(0) - - def _read_zstd_payload(path): import zstandard as zstd @@ -262,7 +243,15 @@ def _new_decode_handler( @asynccontextmanager async def no_cancellation_monitor(*args, **kwargs): - yield None + async def wait_forever(): + await asyncio.Future() + + task = asyncio.create_task(wait_forever()) + try: + yield task + finally: + task.cancel() + await asyncio.gather(task, return_exceptions=True) handler._cancellation_monitor = no_cancellation_monitor return handler @@ -329,6 +318,52 @@ async def stream(): pass +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize( + "processor_name", ["_process_token_stream", "_process_text_stream"] +) +async def test_ordered_cancellation_skips_stopped_chunk_processing(processor_name): + handler = _new_decode_handler() + notified = False + + def notify_first_token(): + nonlocal notified + notified = True + + context = SimpleNamespace( + id=lambda: "request-id", + is_stopped=lambda: True, + notify_first_token=notify_first_token, + ) + + class UnexpectedUploader: + async def upload_choice(self, *_args): + raise AssertionError("stopped chunks must not upload metadata") + + async def stream(): + yield { + "text": "ignored", + "output_ids": [1], + "meta_info": { + "id": "internal-request-id", + "finish_reason": {"type": "stop"}, + }, + } + + outputs = await _collect( + getattr(handler, processor_name)( + stream(), + context, + metadata_uploader=UnexpectedUploader(), + submitted_request_id="internal-request-id", + ) + ) + + assert outputs == [] + assert not notified + + def test_engine_generate_preserves_native_fields_and_overrides_worker_state(): request = { "rid": "resolved-request", @@ -351,14 +386,14 @@ def test_engine_generate_preserves_native_fields_and_overrides_worker_state(): native = build_native_generate_request( request, input_ids=[7, 8], - fallback_rid="fallback-request", + fallback_rid="internal-request-id", priority=9, sampling_overrides={"n": 1, "max_new_tokens": 1}, bootstrap_host="prefill.internal", routed_dp_rank=3, ) - assert native.rid == "resolved-request" + assert native.rid == "internal-request-id" assert native.input_ids == [7, 8] assert native.stream is True assert native.priority == 9 @@ -447,6 +482,93 @@ async def generate_request(self, request, request_context): assert chunks[0]["engine_data"]["sglang_response"] is native_response +@pytest.mark.asyncio +async def test_native_generate_stream_maps_internal_id_without_mutation(): + native_response = { + "output_ids": [101], + "meta_info": {"id": "internal-request-id"}, + } + + async def stream(): + yield { + "token_ids": [], + "engine_data": {"sglang_response": native_response}, + } + + handler = _new_decode_handler() + chunks = await _collect( + handler._process_native_generate_stream( + stream(), + _Context(), + submitted_request_id="internal-request-id", + internal_request_id="internal-request-id", + response_request_id="caller-visible-id", + ) + ) + + mapped_response = chunks[0]["engine_data"]["sglang_response"] + assert mapped_response["meta_info"]["id"] == "caller-visible-id" + assert native_response["meta_info"]["id"] == "internal-request-id" + assert mapped_response is not native_response + assert mapped_response["meta_info"] is not native_response["meta_info"] + + +@pytest.mark.asyncio +async def test_native_generate_stream_maps_batched_ids_without_collapsing(): + native_responses = [ + { + "output_ids": [101 + index], + "index": index, + "meta_info": {"id": f"internal-request-id_{index}"}, + } + for index in range(2) + ] + + async def stream(): + for native_response in native_responses: + yield { + "token_ids": [], + "engine_data": {"sglang_response": native_response}, + } + + handler = _new_decode_handler() + chunks = await _collect( + handler._process_native_generate_stream( + stream(), + _Context(), + submitted_request_id=None, + internal_request_id="internal-request-id", + response_request_id=["caller-request-0", "caller-request-1"], + ) + ) + + assert [ + chunk["engine_data"]["sglang_response"]["meta_info"]["id"] for chunk in chunks + ] == ["caller-request-0", "caller-request-1"] + assert [response["meta_info"]["id"] for response in native_responses] == [ + "internal-request-id_0", + "internal-request-id_1", + ] + + +@pytest.mark.parametrize( + ("engine_id", "index", "public_id", "expected"), + [ + ("internal_0", 0, "caller", "caller_0"), + ("actual-child-a", 0, "caller", "actual-child-a"), + ("internal_2", 2, ["caller-0", "caller-1"], "internal_2"), + ("internal_0", True, "caller", "internal_0"), + ("internal_0", 0, [123], "internal_0"), + ], +) +def test_public_native_response_id_maps_only_derived_string_ids( + engine_id, index, public_id, expected +): + assert ( + _public_native_response_id(engine_id, index, "internal", public_id) == expected + ) + + def _new_token_input_handler(maximum_input_token_id: int = 151935): handler = _new_decode_handler() handler._max_input_token_id = maximum_input_token_id @@ -671,6 +793,9 @@ async def _stream(items): class _Context: + def id(self): + return "public-request-id" + def is_stopped(self): return False @@ -693,6 +818,55 @@ def test_build_sampling_params_passes_n_for_token_requests(): assert sampling_params["max_new_tokens"] == 8 +@pytest.mark.parametrize( + ("sampling_params", "supported", "expected"), + [ + ({}, True, "request-id"), + ({"n": 1}, True, "request-id"), + ([{"n": 1}], True, "request-id"), + ({"n": 3}, True, None), + ([{"n": 3}], True, None), + ({"n": 3, "beam_width": 2}, True, "request-id"), + ({"n": 1}, False, None), + ], +) +def test_ordered_cancellation_requires_stable_sglang_request_id( + sampling_params, supported, expected +): + assert ( + _ordered_cancellation_request_id( + "request-id", sampling_params, supported=supported + ) + == expected + ) + + +@pytest.mark.parametrize( + ("native_payload", "expected"), + [ + ({}, False), + ({"prompt": "hello"}, False), + ({"prompt": ["hello", "world"]}, True), + ({"text": ["hello", "world"]}, True), + ({"input_ids": [1, 2]}, False), + ({"input_ids": [[1], [2]]}, True), + ({"input_embeds": [[0.1], [0.2]]}, False), + ({"input_embeds": [[[0.1]], [[0.2]]]}, True), + ], +) +def test_native_payload_batch_detection(native_payload, expected): + assert _native_payload_is_batched(native_payload) is expected + + +def test_ordered_cancellation_rejects_native_batch(): + assert ( + _ordered_cancellation_request_id( + "request-id", {"n": 1}, supported=True, batched=True + ) + is None + ) + + def test_build_sampling_params_forwards_repetition_controls_for_token_requests(): handler = _new_decode_handler(use_sglang_tokenizer=False) @@ -1538,6 +1712,7 @@ async def test_process_text_stream_forwards_incremental_text_per_choice(): "llo", "od", ] + assert [chunk["id"] for chunk in chunks] == ["public-request-id"] * 4 @pytest.mark.asyncio diff --git a/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py b/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py index d8f2999e25af..d3dbe7113d0d 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py +++ b/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py @@ -450,7 +450,15 @@ def _new_decode_handler(*, enable_frontend_decoding: bool): @asynccontextmanager async def no_cancellation_monitor(*args, **kwargs): - yield None + async def wait_forever(): + await asyncio.Future() + + task = asyncio.create_task(wait_forever()) + try: + yield task + finally: + task.cancel() + await asyncio.gather(task, return_exceptions=True) handler._cancellation_monitor = no_cancellation_monitor @@ -676,7 +684,15 @@ def _new_prefill_handler() -> PrefillWorkerHandler: @asynccontextmanager async def no_cancellation_monitor(*args, **kwargs): - yield None + async def wait_forever(): + await asyncio.Future() + + task = asyncio.create_task(wait_forever()) + try: + yield task + finally: + task.cancel() + await asyncio.gather(task, return_exceptions=True) handler._cancellation_monitor = no_cancellation_monitor diff --git a/components/src/dynamo/sglang/tests/test_sglang_multimodal_video.py b/components/src/dynamo/sglang/tests/test_sglang_multimodal_video.py index 3631a96335f5..ee450a0caed3 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_multimodal_video.py +++ b/components/src/dynamo/sglang/tests/test_sglang_multimodal_video.py @@ -445,6 +445,7 @@ async def results(): async def test_multimodal_prefill_cleanup_awaits_consumers_before_engine_shutdown(): handler = MultimodalPrefillWorkerHandler.__new__(MultimodalPrefillWorkerHandler) handler.publisher = None + handler._abort_tasks = set() events = [] async def consumer(): diff --git a/components/src/dynamo/sglang/tests/test_sglang_unit.py b/components/src/dynamo/sglang/tests/test_sglang_unit.py index e31fbae1c1c2..5c31932bcd54 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_unit.py +++ b/components/src/dynamo/sglang/tests/test_sglang_unit.py @@ -165,6 +165,32 @@ def test_resolved_server_args_uses_declarative_view(monkeypatch): assert raw_server_args.page_size is None +def test_compat_detects_ordered_cancellation_support(monkeypatch): + request_stats = SimpleNamespace( + __dataclass_fields__={"api_server_dispatch_finish_time": object()} + ) + monkeypatch.setattr(sglang_compat, "APIServerReqTimeStats", request_stats) + engine = SimpleNamespace(tokenizer_manager=SimpleNamespace(rid_to_state={})) + + assert sglang_compat.supports_disagg_prefill_cancel_anytime(engine) + + +@pytest.mark.parametrize( + "engine", + [ + SimpleNamespace(), + SimpleNamespace(tokenizer_manager=SimpleNamespace(rid_to_state=[])), + ], +) +def test_compat_rejects_runtime_without_request_registry(monkeypatch, engine): + request_stats = SimpleNamespace( + __dataclass_fields__={"api_server_dispatch_finish_time": object()} + ) + monkeypatch.setattr(sglang_compat, "APIServerReqTimeStats", request_stats) + + assert not sglang_compat.supports_disagg_prefill_cancel_anytime(engine) + + def test_compat_uses_current_sglang_model_config_accessor(monkeypatch): expected = SimpleNamespace(is_multimodal=True) server_args = SimpleNamespace() From 908358c4614ece1c995ece139f7df6a3ad459802 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Sun, 20 Sep 2026 23:35:38 -0700 Subject: [PATCH 132/191] fix(sglang): abort disaggregated prefill requests on cancellation (#14782) Signed-off-by: Biswa Panda --- .../src/dynamo/sglang/engine_generate.py | 6 +- components/src/dynamo/sglang/register.py | 26 +- .../request_handlers/llm/decode_handler.py | 2 +- .../request_handlers/llm/prefill_handler.py | 63 +++-- .../sglang/tests/test_runtime_metadata.py | 47 +++- .../tests/test_sglang_decode_handler.py | 8 +- .../tests/test_sglang_prefill_handler.py | 233 ++++++++++++++++++ 7 files changed, 357 insertions(+), 28 deletions(-) create mode 100644 components/src/dynamo/sglang/tests/test_sglang_prefill_handler.py diff --git a/components/src/dynamo/sglang/engine_generate.py b/components/src/dynamo/sglang/engine_generate.py index 2273f7ea9fc9..3ec185d718e0 100644 --- a/components/src/dynamo/sglang/engine_generate.py +++ b/components/src/dynamo/sglang/engine_generate.py @@ -40,7 +40,7 @@ def build_native_generate_request( native_payload: Mapping[str, Any], *, input_ids: list[int], - fallback_rid: str, + request_id: str, priority: int | None, sampling_overrides: Mapping[str, Any] | None = None, bootstrap_host: str | None = None, @@ -57,7 +57,7 @@ def build_native_generate_request( routing state, and fields supplied by the selected worker. SGLang owns all remaining validation. - ``fallback_rid`` is router-owned and always replaces a caller-supplied + ``request_id`` is router-owned and always replaces a caller-supplied ``rid`` so cancellation cannot target another request. Native session requests pass their caller-visible node ID as the fallback because SGLang keys session continuations by the submitted top-level @@ -65,7 +65,7 @@ def build_native_generate_request( """ payload = dict(native_payload) payload["input_ids"] = input_ids - payload["rid"] = fallback_rid + payload["rid"] = request_id payload["stream"] = True if priority is None: payload.pop("priority", None) diff --git a/components/src/dynamo/sglang/register.py b/components/src/dynamo/sglang/register.py index 2fed98ee6894..dcaf9e38a4ae 100644 --- a/components/src/dynamo/sglang/register.py +++ b/components/src/dynamo/sglang/register.py @@ -30,7 +30,10 @@ WorkerType, register_model, ) -from dynamo.sglang._compat import sglang_uses_mla_backend +from dynamo.sglang._compat import ( + sglang_uses_mla_backend, + supports_disagg_prefill_cancel_anytime, +) from dynamo.sglang._disagg import SGLANG_WORKER_GROUP_ID_KEY, get_sglang_worker_group_id from dynamo.sglang.args import DynamoConfig, use_modelexpress_remote_instance from dynamo.sglang.capacity import ( @@ -40,7 +43,10 @@ model_card_dp_rank_bounds, runtime_capacity, ) -from dynamo.sglang.engine_generate import SGLANG_GENERATE_CAPABILITY +from dynamo.sglang.engine_generate import ( + DISAGG_PREFILL_CANCEL_ANYTIME_V1, + SGLANG_GENERATE_CAPABILITY, +) from dynamo.sglang.gateway import ( GATEWAY_ENGINE_ID_KEY, GATEWAY_WORKERS_KEY, @@ -407,6 +413,22 @@ async def get_runtime_config( runtime_config = ModelRuntimeConfig() runtime_config.kv_state_endpoint = dynamo_args.kv_state_endpoint runtime_config.context_length = server_args.context_length + llm_handler = not dynamo_args.enable_multimodal + # Both disaggregated legs implement exact-RID cancellation before output, + # including waiting until the scheduler has accepted the request. + if ( + server_args.disaggregation_mode + in { + "prefill", + "decode", + } + and llm_handler + and supports_disagg_prefill_cancel_anytime(engine) + ): + runtime_config.set_engine_specific( + DISAGG_PREFILL_CANCEL_ANYTIME_V1, + json.dumps(True), + ) # Multimodal encode workers have no tokenizer manager and delegate # generation overflow handling to their downstream backend. if engine is not None: diff --git a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py index 347039b84ce4..808d1bcb39c9 100644 --- a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py +++ b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py @@ -540,7 +540,7 @@ def _native_generate_stream( native_request = build_native_generate_request( native_payload, input_ids=input_ids, - fallback_rid=sglang_request_id, + request_id=sglang_request_id, priority=self._priority_kwargs(priority).get("priority"), bootstrap_host=bootstrap_info.get("bootstrap_host"), bootstrap_port=bootstrap_info.get("bootstrap_port"), diff --git a/components/src/dynamo/sglang/request_handlers/llm/prefill_handler.py b/components/src/dynamo/sglang/request_handlers/llm/prefill_handler.py index c188e6d639bb..a57e8fd353fa 100644 --- a/components/src/dynamo/sglang/request_handlers/llm/prefill_handler.py +++ b/components/src/dynamo/sglang/request_handlers/llm/prefill_handler.py @@ -18,10 +18,15 @@ build_native_generate_request, native_generate_payload, native_generate_stream, + new_sglang_request_id, ) from dynamo.sglang.publisher import DynamoSglangPublisher from dynamo.sglang.request_handlers.handler_base import BaseWorkerHandler -from dynamo.sglang.request_handlers.llm.decode_handler import _sampling_option_params +from dynamo.sglang.request_handlers.llm.decode_handler import ( + _native_payload_is_batched, + _ordered_cancellation_request_id, + _sampling_option_params, +) from dynamo.sglang.request_handlers.llm.mm_disagg_utils import ( build_disagg_mm_kwargs, raise_if_unextracted_multimodal, @@ -87,7 +92,12 @@ async def generate( """ validate_disagg_parallel_sampling(request) logging.debug(f"New Request ID: {context.id()}") - trace_id = context.trace_id + sglang_request_id = new_sglang_request_id() + logging.debug( + "Submitted SGLang Request ID: %s, Context: %s", + sglang_request_id, + context.id(), + ) if "request" in request: # DisaggPreprocessedRequest format @@ -171,12 +181,15 @@ async def generate( priority_kwargs = self._priority_kwargs(priority) if native_payload is not None: input_ids = input_param.get("input_ids") + native_payload_is_batched = _native_payload_is_batched( + {"input_ids": input_ids} + ) if not isinstance(input_ids, list): raise ValueError("native SGLang Generate requires token input") native_request = build_native_generate_request( native_payload, input_ids=input_ids, - fallback_rid=trace_id or context.id(), + request_id=sglang_request_id, priority=priority_kwargs.get("priority"), sampling_overrides={"n": 1, "max_new_tokens": 1}, bootstrap_host=bootstrap_host, @@ -186,8 +199,20 @@ async def generate( routed_dp_rank=dp_rank, lora_path=lora_path, ) + submitted_request_id = _ordered_cancellation_request_id( + sglang_request_id, + native_request.sampling_params, + supported=getattr(self, "_supports_ordered_cancellation", False), + batched=native_payload_is_batched, + ) results = native_generate_stream(self.engine, native_request) else: + submitted_request_id = _ordered_cancellation_request_id( + sglang_request_id, + sampling_params, + supported=getattr(self, "_supports_ordered_cancellation", False), + batched=False, + ) results = await self.engine.async_generate( **input_param, **mm_kwargs, @@ -198,7 +223,7 @@ async def generate( bootstrap_port=bootstrap_port, bootstrap_room=bootstrap_room, external_trace_header=trace_header, - rid=trace_id, + rid=sglang_request_id, data_parallel_rank=dp_rank, lora_path=lora_path, **priority_kwargs, @@ -220,33 +245,43 @@ async def generate( "disaggregated_params": bootstrap_info, } - task = asyncio.create_task(self._consume_results(results, context)) + task = asyncio.create_task( + self._consume_results(results, submitted_request_id, context) + ) self._consume_tasks.add(task) task.add_done_callback(self._consume_tasks.discard) await task async def _consume_results( - self, results: AsyncIterator[Any], context: Context + self, + results: AsyncIterator[Any], + submitted_request_id: str | None, + context: Context, ) -> None: """Consume async generator results without processing. Args: results: Async generator from engine.async_generate. + submitted_request_id: Exact engine ID known before output, when supported. context: Context object for cancellation handling. """ - # Use Future pattern for request ID - will be set when first response arrives + # Preserve the response ID as a fallback if SGLang replaces the submitted ID. request_id_future: asyncio.Future[str] = asyncio.Future() - async with self._cancellation_monitor(request_id_future, context): - async for res in results: - # Extract SGLang request ID from the first response and set the future + async with self._cancellation_monitor( + request_id_future, context, submitted_request_id + ) as cancellation_task: + async for res in self._stream_until_cancelled(results, cancellation_task): if not request_id_future.done(): - meta_info = res.get("meta_info", {}) + meta_info = res.get("meta_info") or ( + res.get("engine_data", {}) + .get("sglang_response", {}) + .get("meta_info", {}) + ) sglang_request_id = meta_info.get("id") if sglang_request_id: request_id_future.set_result(sglang_request_id) logging.debug(f"New Prefill Request ID: {sglang_request_id}") - # Note: No explicit cancellation checks needed here. - # When abort_request is called by the cancellation monitor, - # SGLang will terminate this async generator automatically. + # The shared iterator briefly drains after abort so SGLang can + # clean up, then closes a stream that does not terminate. diff --git a/components/src/dynamo/sglang/tests/test_runtime_metadata.py b/components/src/dynamo/sglang/tests/test_runtime_metadata.py index 76ff8c13ee6f..0d1b94cbc181 100644 --- a/components/src/dynamo/sglang/tests/test_runtime_metadata.py +++ b/components/src/dynamo/sglang/tests/test_runtime_metadata.py @@ -135,13 +135,31 @@ def test_token_budget_matches_sglang_policy( assert _get_token_budget(engine, server_args) == expected -def test_runtime_config_without_engine_omits_token_budget(monkeypatch, caplog): +@pytest.mark.parametrize( + "disaggregation_mode, runtime_supported, enable_multimodal, capability_expected", + [ + (None, True, False, False), + ("null", True, False, False), + ("prefill", False, False, False), + ("prefill", True, True, False), + ("prefill", True, False, True), + ("decode", True, False, True), + ], +) +def test_runtime_config_publishes_supported_disagg_capabilities( + monkeypatch, + caplog, + disaggregation_mode, + runtime_supported, + enable_multimodal, + capability_expected, +): from dynamo.sglang import register server_args = SimpleNamespace( allow_auto_truncate=False, context_length=4096, - disaggregation_mode=None, + disaggregation_mode=disaggregation_mode, max_prefill_tokens=None, page_size=16, speculative_algorithm="NONE", @@ -149,6 +167,7 @@ def test_runtime_config_without_engine_omits_token_budget(monkeypatch, caplog): ) dynamo_args = register.DynamoConfig() dynamo_args.enable_local_indexer = False + dynamo_args.enable_multimodal = enable_multimodal capacity = SimpleNamespace( max_num_seqs=None, max_num_batched_tokens=None, @@ -164,12 +183,32 @@ def test_runtime_config_without_engine_omits_token_budget(monkeypatch, caplog): monkeypatch.setattr(register, "get_spec_decode_runtime_data", lambda _: None) monkeypatch.setattr(register, "_get_mooncake_runtime_data", lambda _: None) monkeypatch.setattr(register, "runtime_capacity", lambda *_: capacity) + monkeypatch.setattr( + register, "supports_disagg_prefill_cancel_anytime", lambda _: runtime_supported + ) + engine = None + if runtime_supported: + engine = SimpleNamespace( + tokenizer_manager=SimpleNamespace( + context_len=4096, + validate_total_tokens=True, + num_reserved_tokens=0, + rid_to_state={}, + ), + _scheduler_init_result=SimpleNamespace(scheduler_infos=[{}]), + ) runtime_config = asyncio.run( - register.get_runtime_config(None, server_args, dynamo_args) + register.get_runtime_config(engine, server_args, dynamo_args) ) - assert TOKEN_BUDGET_RUNTIME_KEY not in runtime_config.runtime_data + assert ( + TOKEN_BUDGET_RUNTIME_KEY in runtime_config.runtime_data + ) is runtime_supported + capability = register.DISAGG_PREFILL_CANCEL_ANYTIME_V1 + assert (capability in runtime_config.runtime_data) is capability_expected + if capability_expected: + assert json.loads(runtime_config.runtime_data[capability]) is True assert "Failed to get runtime config" not in caplog.text diff --git a/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py b/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py index 3f20e8eac7a5..f17d78794370 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py +++ b/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py @@ -386,7 +386,7 @@ def test_engine_generate_preserves_native_fields_and_overrides_worker_state(): native = build_native_generate_request( request, input_ids=[7, 8], - fallback_rid="internal-request-id", + request_id="internal-request-id", priority=9, sampling_overrides={"n": 1, "max_new_tokens": 1}, bootstrap_host="prefill.internal", @@ -420,7 +420,7 @@ def test_engine_generate_requires_object_sampling_params_for_prefill_override(): build_native_generate_request( request, input_ids=[1], - fallback_rid="prefill-request", + request_id="prefill-request", priority=None, sampling_overrides={"max_new_tokens": 1}, ) @@ -433,7 +433,7 @@ def test_engine_generate_rejects_top_logprobs_by_default(monkeypatch): build_native_generate_request( {"return_logprob": True, "top_logprobs_num": 1}, input_ids=[1], - fallback_rid="request", + request_id="request", priority=None, ) @@ -444,7 +444,7 @@ def test_engine_generate_allows_top_logprobs_with_escape_hatch(monkeypatch): native = build_native_generate_request( {"return_logprob": True, "top_logprobs_num": 2}, input_ids=[1], - fallback_rid="request", + request_id="request", priority=None, ) diff --git a/components/src/dynamo/sglang/tests/test_sglang_prefill_handler.py b/components/src/dynamo/sglang/tests/test_sglang_prefill_handler.py new file mode 100644 index 000000000000..8da282f55f2e --- /dev/null +++ b/components/src/dynamo/sglang/tests/test_sglang_prefill_handler.py @@ -0,0 +1,233 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +import asyncio +from types import SimpleNamespace + +import pytest + +from dynamo.sglang.request_handlers import cancellation +from dynamo.sglang.request_handlers.llm.prefill_handler import PrefillWorkerHandler + +pytestmark = [ + pytest.mark.unit, + pytest.mark.sglang, + pytest.mark.fault_tolerance, + pytest.mark.gpu_0, + pytest.mark.profiled_vram_gib(0), + pytest.mark.pre_merge, +] + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +@pytest.mark.parametrize("native", [False, True]) +@pytest.mark.parametrize("ordered_cancellation", [False, True]) +@pytest.mark.parametrize( + "phase", ["before_registration", "before_dispatch", "after_dispatch"] +) +async def test_prefill_cancellation_waits_for_dispatch_and_drains( + monkeypatch: pytest.MonkeyPatch, + phase: str, + native: bool, + ordered_cancellation: bool, +): + request_id = "native-request-id" if native else "request-id" + engine_request_id = "internal-request-id" + registry = {} + abort_calls = [] + started = asyncio.Event() + registered = asyncio.Event() + dispatched = asyncio.Event() + aborted = asyncio.Event() + drained = asyncio.Event() + cancelled = asyncio.Event() + polling = asyncio.Event() + allow_registration = asyncio.Event() + allow_dispatch = asyncio.Event() + if phase != "before_registration": + allow_registration.set() + if phase == "after_dispatch": + allow_dispatch.set() + + async def results(rid): + started.set() + try: + await allow_registration.wait() + state = SimpleNamespace( + time_stats=SimpleNamespace(api_server_dispatch_finish_time=0.0) + ) + registry[rid] = state + registered.set() + await allow_dispatch.wait() + state.time_stats.api_server_dispatch_finish_time = 1.0 + dispatched.set() + response = {"meta_info": {"id": rid}} + yield response + await aborted.wait() + finally: + registry.pop(rid, None) + drained.set() + + def abort_request(*, rid, abort_all): + abort_calls.append((rid, abort_all)) + if rid in registry and dispatched.is_set(): + aborted.set() + + def generate_request(request, _context): + return results(request.rid) + + class _Engine: + tokenizer_manager = SimpleNamespace( + rid_to_state=registry, + abort_request=abort_request, + generate_request=generate_request, + ) + + async def async_generate(self, **kwargs): + return results(kwargs["rid"]) + + handler = PrefillWorkerHandler.__new__(PrefillWorkerHandler) + handler.engine = _Engine() + handler.config = SimpleNamespace( + server_args=SimpleNamespace(pp_size=1, enable_dp_attention=False) + ) + handler.shutdown_event = None + handler.bootstrap_host = "127.0.0.1" + handler.bootstrap_port = 1234 + handler.enable_trace = False + handler._abort_tasks = set() + handler._consume_tasks = set() + handler._supports_ordered_cancellation = ordered_cancellation + handler._generate_bootstrap_room = lambda: 17 + handler._get_input_param = lambda request: {"input_ids": request["token_ids"]} + handler._resolve_lora = lambda request: None + handler._priority_kwargs = lambda priority: {} + monkeypatch.setattr( + "dynamo.sglang.request_handlers.llm.prefill_handler.require_reasoning_kwargs", + lambda engine, request: {}, + ) + monkeypatch.setattr( + cancellation, "resolved_server_args", lambda server_args: server_args + ) + monkeypatch.setattr( + "dynamo.sglang.request_handlers.llm.prefill_handler.new_sglang_request_id", + lambda: engine_request_id, + ) + real_sleep = asyncio.sleep + + async def observed_sleep(delay): + polling.set() + await real_sleep(0) + + monkeypatch.setattr( + cancellation, + "asyncio", + SimpleNamespace(**{**vars(asyncio), "sleep": observed_sleep}), + ) + context = SimpleNamespace( + id=lambda: request_id, + trace_id=None, + trace_headers=lambda: {}, + async_killed_or_stopped=lambda: asyncio.create_task(cancelled.wait()), + ) + inner_request = {"token_ids": [1, 2, 3], "routing": {}} + if native: + inner_request["extra_args"] = {"sglang_tito": {"rid": request_id}} + stream = handler.generate( + { + "request": inner_request, + "sampling_params": {}, + }, + context, + ) + await anext(stream) + consumer = asyncio.create_task(_drain(stream)) + await asyncio.wait_for(started.wait(), timeout=1) + if phase != "before_registration": + await asyncio.wait_for(registered.wait(), timeout=1) + if phase == "after_dispatch": + await asyncio.wait_for(dispatched.wait(), timeout=1) + + cancelled.set() + if phase != "after_dispatch": + if ordered_cancellation: + await asyncio.wait_for(polling.wait(), timeout=1) + else: + await asyncio.sleep(0) + assert not abort_calls + allow_registration.set() + allow_dispatch.set() + + assert await asyncio.wait_for(consumer, timeout=1) == [] + assert abort_calls == [(engine_request_id, False)] + assert dispatched.is_set() + assert aborted.is_set() + assert drained.is_set() + assert not registry + + +@pytest.mark.asyncio +@pytest.mark.timeout(5) +async def test_native_batched_prefill_disables_ordered_cancellation(monkeypatch): + captured_submitted_id = None + captured_native_request = None + + async def native_results(): + if False: + yield None + + handler = PrefillWorkerHandler.__new__(PrefillWorkerHandler) + handler.engine = SimpleNamespace() + handler.bootstrap_host = "127.0.0.1" + handler.bootstrap_port = 1234 + handler.enable_trace = False + handler._consume_tasks = set() + handler._supports_ordered_cancellation = True + handler._generate_bootstrap_room = lambda: 17 + handler._get_input_param = lambda request: {"input_ids": request["token_ids"]} + handler._resolve_lora = lambda request: None + handler._priority_kwargs = lambda priority: {} + + async def capture_consume(_results, submitted_request_id, _context): + nonlocal captured_submitted_id + captured_submitted_id = submitted_request_id + + def capture_native_stream(_engine, request): + nonlocal captured_native_request + captured_native_request = request + return native_results() + + handler._consume_results = capture_consume + monkeypatch.setattr( + "dynamo.sglang.request_handlers.llm.prefill_handler.new_sglang_request_id", + lambda: "internal-request-id", + ) + monkeypatch.setattr( + "dynamo.sglang.request_handlers.llm.prefill_handler.native_generate_stream", + capture_native_stream, + ) + context = SimpleNamespace( + id=lambda: "request-id", trace_id=None, trace_headers=lambda: {} + ) + stream = handler.generate( + { + "request": { + "token_ids": [[1], [2]], + "routing": {}, + "extra_args": {"sglang_tito": {}}, + }, + "sampling_params": {}, + }, + context, + ) + + await anext(stream) + with pytest.raises(StopAsyncIteration): + await anext(stream) + assert captured_submitted_id is None + assert captured_native_request.input_ids == [[1], [2]] + + +async def _drain(stream): + return [item async for item in stream] From c844b20f835d82d0924c35bf1f08801510d4402b Mon Sep 17 00:00:00 2001 From: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> Date: Mon, 21 Sep 2026 12:19:45 +0000 Subject: [PATCH 133/191] docs: refresh community events Automated refresh from the public Dynamo Google Calendar. Generated by .github/workflows/community-events-refresh.yml. Signed-off-by: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> --- docs/fern/components/events.generated.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fern/components/events.generated.ts b/docs/fern/components/events.generated.ts index fd5d7069cf9a..7fae90668054 100644 --- a/docs/fern/components/events.generated.ts +++ b/docs/fern/components/events.generated.ts @@ -22,7 +22,7 @@ export interface DynamoEvent { } /** Generation date in Pacific, YYYY-MM-DD. The calendar grid treats this as "today". */ -export const GENERATED_ON = "2026-09-20"; +export const GENERATED_ON = "2026-09-21"; export const UPCOMING_EVENTS: DynamoEvent[] = []; From 11f16cc2cebc2299f1dd866aa500f6bc54e8ee81 Mon Sep 17 00:00:00 2001 From: Dan Gil Date: Mon, 21 Sep 2026 10:48:29 -0500 Subject: [PATCH 134/191] docs: Dynamo v1.5.0 release notes page and release ledger (#15113) Signed-off-by: Dan Gil Co-authored-by: Claude Fable 5.1 --- .lycheeignore | 10 +- README.md | 4 +- README.zh-CN.md | 4 +- docs/fern/components/releases.data.ts | 158 +++-- docs/fern/index.yml | 3 + .../pages/cli/installation/install-dynamo.mdx | 4 +- .../aiconfigurator-reference.md | 4 +- .../tensorrt-llm-details/gpt-oss.md | 2 +- .../runtime-containers.md | 6 +- .../backends/sglang/overview.md | 2 +- .../backends/tensorrt-llm/overview.md | 8 +- .../planner/global-planner-guide.md | 2 +- .../modular-components/profiler/overview.md | 2 +- .../profiler/profiler-examples.md | 12 +- .../profiler/profiler-guide.md | 6 +- .../auto-deployment/auto-deploy-with-dgdr.md | 2 +- .../disaggregated-serving/overview.md | 6 +- .../installation/gateway-api-routing.mdx | 2 +- .../managed-kubernetes/eks/eks-setup.mdx | 2 +- .../managed-kubernetes/gcp/gke-setup.mdx | 8 +- .../model-deployment/deploy-with-dgd.md | 6 +- .../pages/reference/general/compatibility.mdx | 10 +- .../reference/general/release-artifacts.mdx | 60 +- .../general/releases-machine-readable.mdx | 68 +- .../general/releases/deprecations.mdx | 178 +++++ .../general/releases/dynamo-v1-5-0.mdx | 607 ++++++++++++++++++ .../general/releases/known-issues.mdx | 30 +- .../general/releases/release-history.mdx | 1 + .../pages/cli/getting-started/quickstart.mdx | 6 +- .../pages/cli/installation/install-dynamo.mdx | 10 +- 30 files changed, 1023 insertions(+), 200 deletions(-) create mode 100644 docs/fern/pages/reference/general/releases/dynamo-v1-5-0.mdx diff --git a/.lycheeignore b/.lycheeignore index c6b76628506d..cf4a75ff0d97 100644 --- a/.lycheeignore +++ b/.lycheeignore @@ -56,9 +56,13 @@ # (afterwards lychee validates the URL again, catching any later rename/move). ^https://github\.com/ai-dynamo/dynamo/blob/main/deploy/inference-gateway/ext-proc/examples/onramp/agg\.yaml -# The v1.4.0 release entry lands with the current-release promotion; the tag -# URL 404s from CI until v1.4.0 is cut. Remove after the tag exists. -^https://github\.com/ai-dynamo/dynamo/releases/tag/v1\.4\.0$ +# The v1.5.0 release entry lands with the current-release promotion; the tag +# URL 404s from CI until v1.5.0 is cut. Remove after the tag exists. +^https://github\.com/ai-dynamo/dynamo/releases/tag/v1\.5\.0$ + +# The classic dynamo-platform 1.5.0 chart publishes to helm.ngc.nvidia.com in a +# follow-up NGC publishing MR; the .tgz URL 404s until then. Remove once live. +^https://helm\.ngc\.nvidia\.com/nvidia/ai-dynamo/charts/dynamo-platform-1\.5\.0\.tgz$ # The Dynamo Enterprise NGC collection is not published on the public catalog # yet, so the canonical collection URL 404s from CI. The org and team segments diff --git a/README.md b/README.md index 2b54b2fd1202..8c217060da87 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ the Gateway API setup, supported features, and configuration. ```bash # Pull a prebuilt container (SGLang example) -docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.2 +docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 # Inside the container — start frontend and worker python3 -m dynamo.frontend --http-port 8000 --discovery-backend file > /dev/null 2>&1 & @@ -154,7 +154,7 @@ curl -s localhost:8000/v1/chat/completions -H "Content-Type: application/json" - }' | jq ``` -Also available: [`tensorrtllm-runtime:1.4.2`](https://docs.nvidia.com/dynamo/resources/release-artifacts) and [`vllm-runtime:1.4.2`](https://docs.nvidia.com/dynamo/resources/release-artifacts). +Also available: [`tensorrtllm-runtime:1.5.0`](https://docs.nvidia.com/dynamo/resources/release-artifacts) and [`vllm-runtime:1.5.0`](https://docs.nvidia.com/dynamo/resources/release-artifacts). ### Option B: Install from PyPI diff --git a/README.zh-CN.md b/README.zh-CN.md index 038ce35006c6..619787cc9d45 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -113,7 +113,7 @@ limitations under the License. ```bash # 拉取预构建容器(SGLang 示例) -docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.0 +docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 # 在容器内启动 frontend 和 worker python3 -m dynamo.frontend --http-port 8000 --discovery-backend file > /dev/null 2>&1 & @@ -127,7 +127,7 @@ curl -s localhost:8000/v1/chat/completions -H "Content-Type: application/json" - }' | jq ``` -另有 [`tensorrtllm-runtime:1.4.0`](https://docs.nvidia.com/dynamo/resources/release-artifacts) 和 [`vllm-runtime:1.4.0`](https://docs.nvidia.com/dynamo/resources/release-artifacts) 可用。 +另有 [`tensorrtllm-runtime:1.5.0`](https://docs.nvidia.com/dynamo/resources/release-artifacts) 和 [`vllm-runtime:1.5.0`](https://docs.nvidia.com/dynamo/resources/release-artifacts) 可用。 ### 选项 B:从 PyPI 安装 diff --git a/docs/fern/components/releases.data.ts b/docs/fern/components/releases.data.ts index b3434289724d..a932858e9457 100644 --- a/docs/fern/components/releases.data.ts +++ b/docs/fern/components/releases.data.ts @@ -65,10 +65,10 @@ export interface Release { partial?: boolean; } -export const CURRENT_VERSION = "v1.4.2"; -export const CURRENT_DATE = "Aug 28, 2026"; -export const CURRENT_TAG = "1.4.2"; -export const CURRENT_WHEEL = "1.4.2"; +export const CURRENT_VERSION = "v1.5.0"; +export const CURRENT_DATE = "Sep 18, 2026"; +export const CURRENT_TAG = "1.5.0"; +export const CURRENT_WHEEL = "1.5.0"; export const MAIN_TOT: BackendPins = { sglang: "0.5.19", @@ -82,6 +82,20 @@ export const MAIN_TOT: BackendPins = { const GH = "https://github.com/ai-dynamo/dynamo/releases/tag/"; export const RELEASES: Release[] = [ + { + version: "v1.5.0", + notesHref: "/dynamo/dev/reference/releases/v1-5-0", + date: "Sep 18, 2026", + kind: "stable", + github: `${GH}v1.5.0`, + docs: "https://docs.nvidia.com/dynamo", + pins: { sglang: "0.5.18", trtllm: "1.3.0rc25", vllm: "0.28.0", nixlSglang: "1.4.0", nixlTrtllm: "1.3.1", nixlVllm: "1.3.2" }, + ucx: "1.21.x", + delta: + "KVBM deprecated with removal targeted for v1.6.0; CRD storage version promoted to v1beta1 and the v1alpha1 admission webhook endpoints removed; Go EPP removed in favor of the Rust EPP shipped inside the Frontend image; Dynamo Snapshot moved to a standalone operator and chart, dropping the bundled snapshot chart, snapshot-agent image and DynamoCheckpoint CRD; AIConfigurator renamed to AISimulate; unified-backend entry point removed from the vLLM and SGLang workers; UCX 1.21.x.", + notesSummary: + "Pluggable worker selection policies and tiered KV indexing in the Router, guided tool-call streaming and request validation in the Frontend, image decoding at the Frontend for encode-prefill-decode deployments, v1beta1 CRD storage with the Rust EPP as the default Endpoint Picker, GPU Memory Service V1, and a standalone Snapshot operator.", + }, { version: "v1.4.2", notesHref: "/dynamo/dev/reference/releases/v1-4-0#v142", @@ -384,6 +398,9 @@ export interface CudaRow { } export const CUDA_HISTORY: CudaRow[] = [ + { version: "1.5.0", backend: "SGLang", toolkit: "13.0", minDriver: "580.xx+" }, + { version: "1.5.0", backend: "TensorRT-LLM", toolkit: "13.1", minDriver: "580.xx+" }, + { version: "1.5.0", backend: "vLLM", toolkit: "13.0", minDriver: "580.xx+" }, { version: "1.4.2", backend: "SGLang", toolkit: "13.0", minDriver: "580.xx+" }, { version: "1.4.2", backend: "TensorRT-LLM", toolkit: "13.1", minDriver: "580.xx+" }, { version: "1.4.2", backend: "vLLM", toolkit: "13.0", minDriver: "580.xx+" }, @@ -625,11 +642,11 @@ export const ARTIFACTS: Artifact[] = [ group: "runtime", name: "vllm-runtime", description: "vLLM backend runtime", - meta: "vLLM v0.26.0 · CUDA 13.0 · AMD64/ARM64", + meta: "vLLM v0.28.0 · CUDA 13.0 · AMD64/ARM64", href: `${NGC_C}/vllm-runtime/tags`, tags: [ - { label: "1.4.2", clipboard: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.2" }, - { label: "1.4.2-efa", clipboard: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.2-efa", variant: "experimental" }, + { label: "1.5.0", clipboard: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0" }, + { label: "1.5.0-efa", clipboard: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0-efa", variant: "experimental" }, ], }, { @@ -637,11 +654,11 @@ export const ARTIFACTS: Artifact[] = [ group: "runtime", name: "sglang-runtime", description: "SGLang backend runtime", - meta: "SGLang v0.5.16 · CUDA 13.0 · AMD64/ARM64", + meta: "SGLang v0.5.18 · CUDA 13.0 · AMD64/ARM64", href: `${NGC_C}/sglang-runtime/tags`, tags: [ - { label: "1.4.2", clipboard: "nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.2" }, - { label: "1.4.2-efa", clipboard: "nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.2-efa", variant: "experimental" }, + { label: "1.5.0", clipboard: "nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0" }, + { label: "1.5.0-efa", clipboard: "nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0-efa", variant: "experimental" }, ], }, { @@ -649,11 +666,11 @@ export const ARTIFACTS: Artifact[] = [ group: "runtime", name: "tensorrtllm-runtime", description: "TensorRT-LLM backend runtime", - meta: "TRT-LLM v1.3.0rc22 · CUDA 13.1 · AMD64/ARM64", + meta: "TRT-LLM v1.3.0rc25 · CUDA 13.1 · AMD64/ARM64", href: `${NGC_C}/tensorrtllm-runtime/tags`, tags: [ - { label: "1.4.2", clipboard: "nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.4.2" }, - { label: "1.4.2-efa", clipboard: "nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.4.2-efa", variant: "experimental" }, + { label: "1.5.0", clipboard: "nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.5.0" }, + { label: "1.5.0-efa", clipboard: "nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.5.0-efa", variant: "experimental" }, ], }, { @@ -663,7 +680,7 @@ export const ARTIFACTS: Artifact[] = [ description: "OpenAI-compatible API gateway with Endpoint Prediction Protocol (EPP)", meta: "AMD64/ARM64", href: `${NGC_C}/dynamo-frontend/tags`, - tags: [{ label: "1.4.2", clipboard: "nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.4.2" }], + tags: [{ label: "1.5.0", clipboard: "nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.5.0" }], }, { category: "container", @@ -672,7 +689,7 @@ export const ARTIFACTS: Artifact[] = [ description: "Standalone Planner used by Profiler jobs and Planner pods", meta: "AMD64/ARM64", href: `${NGC_C}/dynamo-planner/tags`, - tags: [{ label: "1.4.2", clipboard: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.2" }], + tags: [{ label: "1.5.0", clipboard: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" }], }, { category: "container", @@ -681,34 +698,24 @@ export const ARTIFACTS: Artifact[] = [ description: "Operator that manages Dynamo deployments and CRDs", meta: "AMD64/ARM64", href: `${NGC_C}/kubernetes-operator/tags`, - tags: [{ label: "1.4.2", clipboard: "nvcr.io/nvidia/ai-dynamo/kubernetes-operator:1.4.2" }], - }, - { - category: "container", - group: "component", - name: "snapshot-agent", - description: "Fast GPU worker recovery via CRIU", - meta: "AMD64", - href: `${NGC_C}/snapshot-agent/tags`, - badge: "Preview", - tags: [{ label: "1.4.2", clipboard: "nvcr.io/nvidia/ai-dynamo/snapshot-agent:1.4.2" }], + tags: [{ label: "1.5.0", clipboard: "nvcr.io/nvidia/ai-dynamo/kubernetes-operator:1.5.0" }], }, { category: "wheel", name: "ai-dynamo", description: "Main package with backend integrations (vLLM, SGLang, TRT-LLM)", meta: "Python 3.10–3.12 · Linux (glibc v2.28+)", - href: "https://pypi.org/project/ai-dynamo/1.4.2/", - tags: [{ label: "uv pip install ai-dynamo==1.4.2", clipboard: "uv pip install ai-dynamo==1.4.2" }], + href: "https://pypi.org/project/ai-dynamo/1.5.0/", + tags: [{ label: "uv pip install ai-dynamo==1.5.0", clipboard: "uv pip install ai-dynamo==1.5.0" }], }, { category: "wheel", name: "ai-dynamo-runtime", description: "Core Python bindings for the Dynamo runtime", meta: "Python 3.10–3.12 · Linux (glibc v2.28+)", - href: "https://pypi.org/project/ai-dynamo-runtime/1.4.2/", + href: "https://pypi.org/project/ai-dynamo-runtime/1.5.0/", tags: [ - { label: "uv pip install ai-dynamo-runtime==1.4.2", clipboard: "uv pip install ai-dynamo-runtime==1.4.2" }, + { label: "uv pip install ai-dynamo-runtime==1.5.0", clipboard: "uv pip install ai-dynamo-runtime==1.5.0" }, ], }, { @@ -716,31 +723,19 @@ export const ARTIFACTS: Artifact[] = [ name: "kvbm", description: "KV Block Manager for disaggregated KV cache", meta: "Python 3.10–3.12 · Linux (glibc v2.28+)", - href: "https://pypi.org/project/kvbm/1.4.2/", - tags: [{ label: "uv pip install kvbm==1.4.2", clipboard: "uv pip install kvbm==1.4.2" }], + href: "https://pypi.org/project/kvbm/1.5.0/", + tags: [{ label: "uv pip install kvbm==1.5.0", clipboard: "uv pip install kvbm==1.5.0" }], }, { category: "helm", name: "dynamo-platform", description: "Platform services (etcd, NATS) and the Dynamo Operator for a Dynamo cluster", - href: "https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-platform-1.4.2.tgz", + href: "https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-platform-1.5.0.tgz", tags: [ { - label: "helm install · dynamo-platform 1.4.2", + label: "helm install · dynamo-platform 1.5.0", clipboard: - "helm install dynamo-platform https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-platform-1.4.2.tgz", - }, - ], - }, - { - category: "helm", - name: "snapshot", - description: "Snapshot DaemonSet for fast GPU worker recovery", - href: "https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/snapshot-1.4.2.tgz", - tags: [ - { - label: "helm install · snapshot 1.4.2", - clipboard: "helm install snapshot https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/snapshot-1.4.2.tgz", + "helm install dynamo-platform https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-platform-1.5.0.tgz", }, ], }, @@ -749,16 +744,16 @@ export const ARTIFACTS: Artifact[] = [ name: "dynamo-runtime", description: "Core distributed runtime library", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-runtime/1.4.2", - tags: [{ label: "cargo add dynamo-runtime@1.4.2", clipboard: "cargo add dynamo-runtime@1.4.2" }], + href: "https://crates.io/crates/dynamo-runtime/1.5.0", + tags: [{ label: "cargo add dynamo-runtime@1.5.0", clipboard: "cargo add dynamo-runtime@1.5.0" }], }, { category: "crate", name: "dynamo-llm", description: "LLM inference engine", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-llm/1.4.2", - tags: [{ label: "cargo add dynamo-llm@1.4.2", clipboard: "cargo add dynamo-llm@1.4.2" }], + href: "https://crates.io/crates/dynamo-llm/1.5.0", + tags: [{ label: "cargo add dynamo-llm@1.5.0", clipboard: "cargo add dynamo-llm@1.5.0" }], }, { category: "crate", @@ -792,8 +787,8 @@ export const ARTIFACTS: Artifact[] = [ name: "dynamo-memory", description: "Memory management utilities", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-memory/1.4.2", - tags: [{ label: "cargo add dynamo-memory@1.4.2", clipboard: "cargo add dynamo-memory@1.4.2" }], + href: "https://crates.io/crates/dynamo-memory/1.5.0", + tags: [{ label: "cargo add dynamo-memory@1.5.0", clipboard: "cargo add dynamo-memory@1.5.0" }], }, { category: "crate", @@ -809,8 +804,8 @@ export const ARTIFACTS: Artifact[] = [ name: "dynamo-tokens", description: "Tokenizer bindings for LLM inference", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-tokens/1.4.2", - tags: [{ label: "cargo add dynamo-tokens@1.4.2", clipboard: "cargo add dynamo-tokens@1.4.2" }], + href: "https://crates.io/crates/dynamo-tokens/1.5.0", + tags: [{ label: "cargo add dynamo-tokens@1.5.0", clipboard: "cargo add dynamo-tokens@1.5.0" }], }, { category: "crate", @@ -826,104 +821,104 @@ export const ARTIFACTS: Artifact[] = [ name: "dynamo-mocker", description: "Inference engine simulator for benchmarking", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-mocker/1.4.2", - tags: [{ label: "cargo add dynamo-mocker@1.4.2", clipboard: "cargo add dynamo-mocker@1.4.2" }], + href: "https://crates.io/crates/dynamo-mocker/1.5.0", + tags: [{ label: "cargo add dynamo-mocker@1.5.0", clipboard: "cargo add dynamo-mocker@1.5.0" }], }, { category: "crate", name: "dynamo-kv-router", description: "KV-aware request routing library", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-kv-router/1.4.2", - tags: [{ label: "cargo add dynamo-kv-router@1.4.2", clipboard: "cargo add dynamo-kv-router@1.4.2" }], + href: "https://crates.io/crates/dynamo-kv-router/1.5.0", + tags: [{ label: "cargo add dynamo-kv-router@1.5.0", clipboard: "cargo add dynamo-kv-router@1.5.0" }], }, { category: "crate", name: "kvbm-logical", description: "Logical layer for the KV Block Manager", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/kvbm-logical/1.4.2", - tags: [{ label: "cargo add kvbm-logical@1.4.2", clipboard: "cargo add kvbm-logical@1.4.2" }], + href: "https://crates.io/crates/kvbm-logical/1.5.0", + tags: [{ label: "cargo add kvbm-logical@1.5.0", clipboard: "cargo add kvbm-logical@1.5.0" }], }, { category: "crate", name: "dynamo-kv-hashing", description: "Request-to-lineage-hash contract for KV cache identity", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-kv-hashing/1.4.2", - tags: [{ label: "cargo add dynamo-kv-hashing@1.4.2", clipboard: "cargo add dynamo-kv-hashing@1.4.2" }], + href: "https://crates.io/crates/dynamo-kv-hashing/1.5.0", + tags: [{ label: "cargo add dynamo-kv-hashing@1.5.0", clipboard: "cargo add dynamo-kv-hashing@1.5.0" }], }, { category: "crate", name: "dynamo-data-gen", description: "Schemas and primitives for Dynamo data generation and replay traces", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-data-gen/1.4.2", - tags: [{ label: "cargo add dynamo-data-gen@1.4.2", clipboard: "cargo add dynamo-data-gen@1.4.2" }], + href: "https://crates.io/crates/dynamo-data-gen/1.5.0", + tags: [{ label: "cargo add dynamo-data-gen@1.5.0", clipboard: "cargo add dynamo-data-gen@1.5.0" }], }, { category: "crate", name: "dynamo-rl", description: "Dynamo RL worker discovery API", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-rl/1.4.2", - tags: [{ label: "cargo add dynamo-rl@1.4.2", clipboard: "cargo add dynamo-rl@1.4.2" }], + href: "https://crates.io/crates/dynamo-rl/1.5.0", + tags: [{ label: "cargo add dynamo-rl@1.5.0", clipboard: "cargo add dynamo-rl@1.5.0" }], }, { category: "crate", name: "dynamo-bench", description: "Lightweight HTTP benchmarks for Dynamo endpoints", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-bench/1.4.2", - tags: [{ label: "cargo add dynamo-bench@1.4.2", clipboard: "cargo add dynamo-bench@1.4.2" }], + href: "https://crates.io/crates/dynamo-bench/1.5.0", + tags: [{ label: "cargo add dynamo-bench@1.5.0", clipboard: "cargo add dynamo-bench@1.5.0" }], }, { category: "crate", name: "dynamo-truthy", description: "Canonical truthy/falsy boolean flag parsing", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/dynamo-truthy/1.4.2", - tags: [{ label: "cargo add dynamo-truthy@1.4.2", clipboard: "cargo add dynamo-truthy@1.4.2" }], + href: "https://crates.io/crates/dynamo-truthy/1.5.0", + tags: [{ label: "cargo add dynamo-truthy@1.5.0", clipboard: "cargo add dynamo-truthy@1.5.0" }], }, { category: "crate", name: "kvbm-common", description: "Shared types for the KV Block Manager", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/kvbm-common/1.4.2", - tags: [{ label: "cargo add kvbm-common@1.4.2", clipboard: "cargo add kvbm-common@1.4.2" }], + href: "https://crates.io/crates/kvbm-common/1.5.0", + tags: [{ label: "cargo add kvbm-common@1.5.0", clipboard: "cargo add kvbm-common@1.5.0" }], }, { category: "crate", name: "kvbm-config", description: "KVBM configuration for Tokio, Rayon, and Messenger runtimes", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/kvbm-config/1.4.2", - tags: [{ label: "cargo add kvbm-config@1.4.2", clipboard: "cargo add kvbm-config@1.4.2" }], + href: "https://crates.io/crates/kvbm-config/1.5.0", + tags: [{ label: "cargo add kvbm-config@1.5.0", clipboard: "cargo add kvbm-config@1.5.0" }], }, { category: "crate", name: "kvbm-kernels", description: "CUDA kernels for the KV Block Manager", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/kvbm-kernels/1.4.2", - tags: [{ label: "cargo add kvbm-kernels@1.4.2", clipboard: "cargo add kvbm-kernels@1.4.2" }], + href: "https://crates.io/crates/kvbm-kernels/1.5.0", + tags: [{ label: "cargo add kvbm-kernels@1.5.0", clipboard: "cargo add kvbm-kernels@1.5.0" }], }, { category: "crate", name: "kvbm-physical", description: "Physical block layer for the KV Block Manager", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/kvbm-physical/1.4.2", - tags: [{ label: "cargo add kvbm-physical@1.4.2", clipboard: "cargo add kvbm-physical@1.4.2" }], + href: "https://crates.io/crates/kvbm-physical/1.5.0", + tags: [{ label: "cargo add kvbm-physical@1.5.0", clipboard: "cargo add kvbm-physical@1.5.0" }], }, { category: "crate", name: "kvbm-engine", description: "Distributed coordination primitives for KVBM", meta: "MSRV Rust v1.82", - href: "https://crates.io/crates/kvbm-engine/1.4.2", - tags: [{ label: "cargo add kvbm-engine@1.4.2", clipboard: "cargo add kvbm-engine@1.4.2" }], + href: "https://crates.io/crates/kvbm-engine/1.5.0", + tags: [{ label: "cargo add kvbm-engine@1.5.0", clipboard: "cargo add kvbm-engine@1.5.0" }], }, { category: "crate", @@ -1374,6 +1369,7 @@ export interface ReleaseStats { published 930/603/896, missing in both directions, so it cannot be trusted to fill the rest. Leave them absent unless a method reproduces all three. */ export const RELEASE_STATS: Record = { + "v1.5.0": { prs: 658, contributors: 123, breaking: 44, knownIssues: 12 }, "v1.4.0": { prs: 640, contributors: 127, firstTimers: 29, breaking: 51, knownIssues: 19 }, "v1.3.0": { prs: 930, contributors: 125, firstTimers: 24, breaking: 24, knownIssues: 10 }, "v1.2.0": { prs: 603, contributors: 82, breaking: 5, knownIssues: 11 }, diff --git a/docs/fern/index.yml b/docs/fern/index.yml index 69a5db805723..fdde93e1bc46 100644 --- a/docs/fern/index.yml +++ b/docs/fern/index.yml @@ -975,6 +975,9 @@ navigation: path: pages/reference/general/releases/release-history.mdx collapsed: true contents: + - page: Dynamo v1.5.0 + path: pages/reference/general/releases/dynamo-v1-5-0.mdx + slug: v1-5-0 - page: Dynamo v1.4.0 path: pages/reference/general/releases/dynamo-v1-4-0.mdx slug: v1-4-0 diff --git a/docs/fern/pages/cli/installation/install-dynamo.mdx b/docs/fern/pages/cli/installation/install-dynamo.mdx index ab9979981aca..b0f568a2a82b 100644 --- a/docs/fern/pages/cli/installation/install-dynamo.mdx +++ b/docs/fern/pages/cli/installation/install-dynamo.mdx @@ -189,10 +189,10 @@ Ensure you passed `--gpus all` to `docker run`. Without this flag, the container ```bash # Correct -docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.0 +docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 # Wrong -- no GPU access -docker run --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.0 +docker run --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 ``` ## Next Steps diff --git a/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md b/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md index 71684c0841f3..96029f2f0747 100644 --- a/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md +++ b/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md @@ -313,7 +313,7 @@ spec: value: /opt/models extraPodSpec: mainContainer: - image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0 + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0 imagePullPolicy: IfNotPresent worker: @@ -333,7 +333,7 @@ spec: value: /opt/models extraPodSpec: mainContainer: - image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0 + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0 workingDir: /workspace imagePullPolicy: IfNotPresent command: diff --git a/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/gpt-oss.md b/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/gpt-oss.md index ac300af0ed03..a11d7e8853d9 100644 --- a/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/gpt-oss.md +++ b/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/gpt-oss.md @@ -52,7 +52,7 @@ huggingface-cli download openai/gpt-oss-120b --exclude "original/*" --exclude "m Set the container image: ```bash -export DYNAMO_CONTAINER_IMAGE=nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.4.0 +export DYNAMO_CONTAINER_IMAGE=nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.5.0 ``` Launch the Dynamo TensorRT-LLM container with the necessary configurations: diff --git a/docs/fern/pages/developer-guide/advanced-customizations/writing-custom-backends/runtime-containers.md b/docs/fern/pages/developer-guide/advanced-customizations/writing-custom-backends/runtime-containers.md index de5ee6d1d4d1..041f3feb0e71 100644 --- a/docs/fern/pages/developer-guide/advanced-customizations/writing-custom-backends/runtime-containers.md +++ b/docs/fern/pages/developer-guide/advanced-customizations/writing-custom-backends/runtime-containers.md @@ -74,9 +74,9 @@ ENTRYPOINT ["my-backend"] When you deploy a custom image with a `DynamoGraphDeployment` (DGD) or standalone `DynamoComponentDeployment` (DCD), admission determines the Dynamo runtime compatibility version from the component's main-container image tag. The tag itself must be a semantic version. Tags such -as `1.4.0`, `v1.4.0`, and `1.4.0-cuda13` can provide the version. Set +as `1.5.0`, `v1.5.0`, and `1.5.0-cuda13` can provide the version. Set `runtimeVersionOverride` when the image is tagless, digest-only, uses a tag such as `latest`, -`main`, `sha-abc`, or `cuda13-1.4.0`, or when a semantic-version tag does not identify the Dynamo +`main`, `sha-abc`, or `cuda13-1.5.0`, or when a semantic-version tag does not identify the Dynamo runtime version packaged in the image. Set the override to the canonical `MAJOR.MINOR.PATCH` Dynamo runtime version without a `v` prefix, @@ -90,7 +90,7 @@ spec: backendFramework: vllm components: - name: worker - runtimeVersionOverride: "1.4.0" + runtimeVersionOverride: "1.5.0" podTemplate: spec: containers: diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/sglang/overview.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/sglang/overview.md index d35b82dbfc1e..cde1b2a5af4f 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/sglang/overview.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/sglang/overview.md @@ -81,7 +81,7 @@ docker run --gpus all -it --rm \ --ulimit nofile=65536:65536 \ --cap-add CAP_SYS_PTRACE --ipc host \ -v $HOME/.cache/huggingface:/home/dynamo/.cache/huggingface \ - nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.0 + nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 ``` Mount the host Hugging Face cache (`-v $HOME/.cache/huggingface:/home/dynamo/.cache/huggingface`) so each container restart doesn't re-download model weights. The container runs as user `dynamo` (UID 1000), which is why the in-container path is `/home/dynamo/.cache/huggingface`. diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/tensorrt-llm/overview.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/tensorrt-llm/overview.md index ff7498a87454..c33c3c94a3e3 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/tensorrt-llm/overview.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/tensorrt-llm/overview.md @@ -73,9 +73,9 @@ The matrix below shows which TensorRT-LLM feature pairs are validated to work to | Container tag | Backend version | CUDA | Min NVIDIA driver | |---|---|---|---| -| `tensorrtllm-runtime:1.4.0` | TRT-LLM `v1.3.0rc22` | `v13.1` | `580+` | -| `vllm-runtime:1.4.0` | vLLM `v0.26.0` | `v13.0` | `580+` | -| `sglang-runtime:1.4.0` | SGLang `v0.5.16` | `v13.0` | `580+` | +| `tensorrtllm-runtime:1.5.0` | TRT-LLM `v1.3.0rc25` | `v13.1` | `580+` | +| `vllm-runtime:1.5.0` | vLLM `v0.28.0` | `v13.0` | `580+` | +| `sglang-runtime:1.5.0` | SGLang `v0.5.18` | `v13.0` | `580+` | Source of truth: [`docs/fern/pages/reference/general/compatibility.mdx`](../../../../../reference/general/compatibility.mdx#release-support-matrix) and [`docs/fern/pages/reference/general/release-artifacts.mdx`](../../../../../reference/general/release-artifacts.mdx). If those differ from the values above, the source-of-truth files win. @@ -90,7 +90,7 @@ docker compose -f dev/docker-compose.yml up -d **Step 2 (host terminal):** Pull and run the prebuilt container: ```bash -DYNAMO_VERSION=1.4.0 +DYNAMO_VERSION=1.5.0 docker pull nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:$DYNAMO_VERSION docker run --gpus all -it --network host --ipc host \ nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:$DYNAMO_VERSION diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/planner/global-planner-guide.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/planner/global-planner-guide.md index ed501dedb823..d86f6566c078 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/planner/global-planner-guide.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/planner/global-planner-guide.md @@ -183,7 +183,7 @@ metadata: spec: model: meta-llama/Llama-3.3-70B-Instruct backend: vllm - image: nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0 # dynamo-frontend for Dynamo < 1.1.0 + image: nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0 # dynamo-frontend for Dynamo < 1.1.0 workload: isl: 2048 osl: 256 diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/overview.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/overview.md index 851c26d2be7d..31b95007b746 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/overview.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/overview.md @@ -37,7 +37,7 @@ metadata: spec: model: "Qwen/Qwen3-0.6B" backend: vllm - image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0" # dynamo-frontend for Dynamo < 1.1.0 + image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" # dynamo-frontend for Dynamo < 1.1.0 workload: isl: 3000 # Average input sequence length diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/profiler-examples.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/profiler-examples.md index 5a07e2ba4afe..a4a24364a02e 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/profiler-examples.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/profiler-examples.md @@ -20,7 +20,7 @@ metadata: name: qwen-0-6b spec: model: "Qwen/Qwen3-0.6B" - image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0" # dynamo-frontend for Dynamo < 1.1.0 + image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" # dynamo-frontend for Dynamo < 1.1.0 ``` ### Dense Model: Thorough @@ -35,7 +35,7 @@ metadata: spec: model: "Qwen/Qwen3-0.6B" backend: vllm - image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0" # dynamo-frontend for Dynamo < 1.1.0 + image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" # dynamo-frontend for Dynamo < 1.1.0 searchStrategy: thorough ``` @@ -56,7 +56,7 @@ metadata: spec: model: "deepseek-ai/DeepSeek-R1" backend: sglang - image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0" # dynamo-frontend for Dynamo < 1.1.0 + image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" # dynamo-frontend for Dynamo < 1.1.0 hardware: numGpusPerNode: 8 @@ -86,7 +86,7 @@ metadata: name: llama-private spec: model: "meta-llama/Llama-3.1-8B-Instruct" - image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0" # dynamo-frontend for Dynamo < 1.1.0 + image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" # dynamo-frontend for Dynamo < 1.1.0 ``` ### Custom SLA Targets @@ -103,7 +103,7 @@ metadata: name: low-latency-dense spec: model: "Qwen/Qwen3-0.6B" - image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0" # dynamo-frontend for Dynamo < 1.1.0 + image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" # dynamo-frontend for Dynamo < 1.1.0 sla: ttft: 500 # Time To First Token target in milliseconds @@ -137,7 +137,7 @@ metadata: name: dense-with-tolerations spec: model: "Qwen/Qwen3-0.6B" - image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0" # dynamo-frontend for Dynamo < 1.1.0 + image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" # dynamo-frontend for Dynamo < 1.1.0 overrides: profilingJob: diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/profiler-guide.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/profiler-guide.md index d053edb0f00a..b8cb60c22b23 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/profiler-guide.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/profiler/profiler-guide.md @@ -209,7 +209,7 @@ the operator defaults it to ```yaml spec: - image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0" # dynamo-frontend for Dynamo < 1.1.0 + image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" # dynamo-frontend for Dynamo < 1.1.0 ``` > [!NOTE] @@ -241,7 +241,7 @@ metadata: spec: model: "Qwen/Qwen3-0.6B" backend: vllm - image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0" # dynamo-frontend for Dynamo < 1.1.0 + image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" # dynamo-frontend for Dynamo < 1.1.0 ``` **Step 2: Apply the DGDR** @@ -427,7 +427,7 @@ metadata: spec: model: "Qwen/Qwen3-0.6B" backend: vllm - image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0" # dynamo-frontend for Dynamo < 1.1.0 + image: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0" # dynamo-frontend for Dynamo < 1.1.0 searchStrategy: rapid # or thorough autoApply: true diff --git a/docs/fern/pages/kubernetes/auto-deployment/auto-deploy-with-dgdr.md b/docs/fern/pages/kubernetes/auto-deployment/auto-deploy-with-dgdr.md index 43849cc30cb5..a0ba8883b390 100644 --- a/docs/fern/pages/kubernetes/auto-deployment/auto-deploy-with-dgdr.md +++ b/docs/fern/pages/kubernetes/auto-deployment/auto-deploy-with-dgdr.md @@ -271,7 +271,7 @@ deploy the reviewed snapshot, enable `autoApply`: ```bash kubectl patch dgdr my-model -n --type=merge \ - -p '{"spec":{"runtimeVersionOverride":"1.4.0"}}' + -p '{"spec":{"runtimeVersionOverride":"1.5.0"}}' kubectl patch dgdr my-model -n --type=merge \ -p '{"spec":{"autoApply":true}}' ``` diff --git a/docs/fern/pages/kubernetes/disaggregated-serving/overview.md b/docs/fern/pages/kubernetes/disaggregated-serving/overview.md index 6c87ba9e9cb7..306e7f50a36e 100644 --- a/docs/fern/pages/kubernetes/disaggregated-serving/overview.md +++ b/docs/fern/pages/kubernetes/disaggregated-serving/overview.md @@ -119,7 +119,7 @@ spec: replicas: 1 extraPodSpec: mainContainer: - image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0 + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0 imagePullPolicy: IfNotPresent ``` @@ -147,7 +147,7 @@ rather than a plain worker: size: 16Gi extraPodSpec: mainContainer: - image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0 + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0 imagePullPolicy: IfNotPresent command: ["python3", "-m", "dynamo.vllm"] args: @@ -184,7 +184,7 @@ rather than prompt load. size: 16Gi extraPodSpec: mainContainer: - image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0 + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0 imagePullPolicy: IfNotPresent command: ["python3", "-m", "dynamo.vllm"] args: diff --git a/docs/fern/pages/kubernetes/installation/gateway-api-routing.mdx b/docs/fern/pages/kubernetes/installation/gateway-api-routing.mdx index 66752e093ec7..a982012fce34 100644 --- a/docs/fern/pages/kubernetes/installation/gateway-api-routing.mdx +++ b/docs/fern/pages/kubernetes/installation/gateway-api-routing.mdx @@ -41,7 +41,7 @@ creates the Gateway in `NAMESPACE`. Keep the Dynamo version aligned with the pla ```bash export NAMESPACE=my-model export DYNAMO_SYSTEM_NAMESPACE=dynamo-system -export DYNAMO_VERSION=1.4.0 +export DYNAMO_VERSION=1.5.0 export AGW_NAMESPACE=agentgateway-system ``` diff --git a/docs/fern/pages/kubernetes/installation/managed-kubernetes/eks/eks-setup.mdx b/docs/fern/pages/kubernetes/installation/managed-kubernetes/eks/eks-setup.mdx index 98148ee741f6..d86a7bec8cde 100644 --- a/docs/fern/pages/kubernetes/installation/managed-kubernetes/eks/eks-setup.mdx +++ b/docs/fern/pages/kubernetes/installation/managed-kubernetes/eks/eks-setup.mdx @@ -234,7 +234,7 @@ Then copy the new recipe's manifest and apply again. This example deploys a disaggregated prefill/decode Dynamo Inference Graph that uses NIXL with the LIBFABRIC backend using [Elastic Fabric Adapter (EFA)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html) for high-throughput KV-cache transfer between workers. -It targets `g7e.12xlarge` instances, which support GPUDirect RDMA, and uses the Dynamo EFA-enabled vLLM container `nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-efa` that ships with the [EFA Installer](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-changelog.html) pre-installed. +It targets `g7e.12xlarge` instances, which support GPUDirect RDMA, and uses the Dynamo EFA-enabled vLLM container `nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0-efa` that ships with the [EFA Installer](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-changelog.html) pre-installed. *Note: For a full list of EFA-supported instance types, see [the AWS EC2 Docs](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html#efa-instance-types).* diff --git a/docs/fern/pages/kubernetes/installation/managed-kubernetes/gcp/gke-setup.mdx b/docs/fern/pages/kubernetes/installation/managed-kubernetes/gcp/gke-setup.mdx index 698063c25e93..bd44dca96bdd 100644 --- a/docs/fern/pages/kubernetes/installation/managed-kubernetes/gcp/gke-setup.mdx +++ b/docs/fern/pages/kubernetes/installation/managed-kubernetes/gcp/gke-setup.mdx @@ -59,7 +59,7 @@ git clone https://github.com/ai-dynamo/dynamo.git cd dynamo # Checkout the release branch matching your Dynamo platform version -git checkout release/1.4.0 +git checkout release/1.5.0 ``` @@ -116,7 +116,7 @@ export PATH=$PATH:/usr/local/nvidia/bin:/usr/local/nvidia/lib64 /sbin/ldconfig ``` -For example, refer to the [`release/1.4.0` disaggregated manifest](https://github.com/ai-dynamo/dynamo/blob/release/1.4.0/examples/deployments/GKE/vllm/v1beta1/disagg.yaml): +For example, refer to the [`release/1.5.0` disaggregated manifest](https://github.com/ai-dynamo/dynamo/blob/release/1.5.0/examples/deployments/GKE/vllm/disagg.yaml): ```yaml metadata: @@ -133,7 +133,7 @@ spec: export PATH=$PATH:/usr/local/nvidia/bin:/usr/local/nvidia/lib64 /sbin/ldconfig python3 -m dynamo.vllm --model Qwen/Qwen3-0.6B --disaggregation-mode decode - image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0 + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0 name: main resources: limits: @@ -143,7 +143,7 @@ spec: ```bash -cd examples/deployments/GKE/vllm/v1beta1 +cd examples/deployments/GKE/vllm kubectl apply -f disagg.yaml -n ${NAMESPACE} ``` diff --git a/docs/fern/pages/kubernetes/model-deployment/deploy-with-dgd.md b/docs/fern/pages/kubernetes/model-deployment/deploy-with-dgd.md index 781be4e83917..f0e61486ad3f 100644 --- a/docs/fern/pages/kubernetes/model-deployment/deploy-with-dgd.md +++ b/docs/fern/pages/kubernetes/model-deployment/deploy-with-dgd.md @@ -221,21 +221,21 @@ The worker in the previous step runs **vLLM**. Dynamo also supports **SGLang** a ```bash -export RUNTIME_IMAGE=nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0 +export RUNTIME_IMAGE=nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0 ``` ```bash -export RUNTIME_IMAGE=nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.0 +export RUNTIME_IMAGE=nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 ``` ```bash -export RUNTIME_IMAGE=nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.4.0 +export RUNTIME_IMAGE=nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.5.0 ``` diff --git a/docs/fern/pages/reference/general/compatibility.mdx b/docs/fern/pages/reference/general/compatibility.mdx index d1b3346dacd9..2f4a72d7fc68 100644 --- a/docs/fern/pages/reference/general/compatibility.mdx +++ b/docs/fern/pages/reference/general/compatibility.mdx @@ -159,20 +159,21 @@ Driver already installed? Read across from your version — each cell is the new | --- | --- | --- | --- | | 570.xx+ | 0.7.1 | None | 0.7.0.post1 | | 575.xx+ | 1.2.1 | None | 1.2.1 | -| 580.xx+ | 1.4.2 | 1.4.2 | 1.4.2 | +| 580.xx+ | 1.5.0 | 1.5.0 | 1.5.0 | {/* driver-floors:end */} {/* llms-tables:begin — generated by scripts/gen_llms_tables.py, do not edit */} -Current stable release: v1.4.2 (container tag `1.4.2`, wheel version `1.4.2`). +Current stable release: v1.5.0 (container tag `1.5.0`, wheel version `1.5.0`). **Backend engine pins per Dynamo release** | Dynamo | Type | SGLang | TensorRT-LLM | vLLM | NIXL (SGL / TRT / vLLM) | UCX | | --- | --- | --- | --- | --- | --- | --- | | main (ToT) | development head | 0.5.19 | 1.3.0rc26 | 0.29.0 | 1.4.0 / 1.3.1 / 1.3.2 | - | +| v1.5.0 | stable | 0.5.18 | 1.3.0rc25 | 0.28.0 | 1.4.0 / 1.3.1 / 1.3.2 | 1.21.x | | v1.4.2 | patch | 0.5.16 | 1.3.0rc22 | 0.26.0 | 1.3.0 / 1.3.1 / 1.3.2 | 1.21.x | | v1.4.1 | patch | 0.5.16 | 1.3.0rc22 | 0.26.0 | 1.3.0 / 1.3.1 / 1.3.2 | 1.21.x | | v1.4.0 | stable | 0.5.16 | 1.3.0rc22 | 0.26.0 | 1.3.0 / 1.3.1 / 1.3.2 | 1.21.x | @@ -209,6 +210,9 @@ Current stable release: v1.4.2 (container tag `1.4.2`, wheel version `1.4.2`). | Dynamo | Backend | CUDA Toolkit | Min Driver | Note | | --- | --- | --- | --- | --- | +| 1.5.0 | SGLang | 13.0 | 580.xx+ | - | +| 1.5.0 | TensorRT-LLM | 13.1 | 580.xx+ | - | +| 1.5.0 | vLLM | 13.0 | 580.xx+ | - | | 1.4.2 | SGLang | 13.0 | 580.xx+ | - | | 1.4.2 | TensorRT-LLM | 13.1 | 580.xx+ | - | | 1.4.2 | vLLM | 13.0 | 580.xx+ | - | @@ -286,7 +290,7 @@ Current stable release: v1.4.2 (container tag `1.4.2`, wheel version `1.4.2`). - Early access v1.1.0-dev.* images follow the same CUDA matrix as v1.0.2. The v1.2.0-deepseek-v4-dev.3 vLLM container is CUDA 13.0 multi-arch; the SGLang containers split by arch (CUDA 12.9 on amd64, CUDA 13.0 on arm64). - Experimental CUDA 13 images are not published for all versions. -**Feature support by backend (v1.4.2)** +**Feature support by backend (v1.5.0)** | Feature | SGLang | TensorRT-LLM | vLLM | | --- | --- | --- | --- | diff --git a/docs/fern/pages/reference/general/release-artifacts.mdx b/docs/fern/pages/reference/general/release-artifacts.mdx index f8a696a6981e..e5da8e087e7d 100644 --- a/docs/fern/pages/reference/general/release-artifacts.mdx +++ b/docs/fern/pages/reference/general/release-artifacts.mdx @@ -85,46 +85,44 @@ For the full release history — every release newest-first with its notes — s {/* llms-tables:begin — generated by scripts/gen_llms_tables.py, do not edit */} -Current stable release: v1.4.2 (container tag `1.4.2`, wheel version `1.4.2`). +Current stable release: v1.5.0 (container tag `1.5.0`, wheel version `1.5.0`). -**Artifact inventory (v1.4.2)** +**Artifact inventory (v1.5.0)** | Category | Name | Description | Meta | Tags / install | | --- | --- | --- | --- | --- | -| container | vllm-runtime | vLLM backend runtime | vLLM v0.26.0 · CUDA 13.0 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.2`; `nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.2-efa` | -| container | sglang-runtime | SGLang backend runtime | SGLang v0.5.16 · CUDA 13.0 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.2`; `nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.2-efa` | -| container | tensorrtllm-runtime | TensorRT-LLM backend runtime | TRT-LLM v1.3.0rc22 · CUDA 13.1 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.4.2`; `nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.4.2-efa` | -| container | dynamo-frontend | OpenAI-compatible API gateway with Endpoint Prediction Protocol (EPP) | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.4.2` | -| container | dynamo-planner | Standalone Planner used by Profiler jobs and Planner pods | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.2` | -| container | kubernetes-operator | Operator that manages Dynamo deployments and CRDs | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/kubernetes-operator:1.4.2` | -| container | snapshot-agent (Preview) | Fast GPU worker recovery via CRIU | AMD64 | `nvcr.io/nvidia/ai-dynamo/snapshot-agent:1.4.2` | -| wheel | ai-dynamo | Main package with backend integrations (vLLM, SGLang, TRT-LLM) | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install ai-dynamo==1.4.2` | -| wheel | ai-dynamo-runtime | Core Python bindings for the Dynamo runtime | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install ai-dynamo-runtime==1.4.2` | -| wheel | kvbm | KV Block Manager for disaggregated KV cache | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install kvbm==1.4.2` | -| helm | dynamo-platform | Platform services (etcd, NATS) and the Dynamo Operator for a Dynamo cluster | - | `helm install dynamo-platform https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-platform-1.4.2.tgz` | -| helm | snapshot | Snapshot DaemonSet for fast GPU worker recovery | - | `helm install snapshot https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/snapshot-1.4.2.tgz` | -| crate | dynamo-runtime | Core distributed runtime library | MSRV Rust v1.82 | `cargo add dynamo-runtime@1.4.2` | -| crate | dynamo-llm | LLM inference engine | MSRV Rust v1.82 | `cargo add dynamo-llm@1.4.2` | +| container | vllm-runtime | vLLM backend runtime | vLLM v0.28.0 · CUDA 13.0 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0`; `nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0-efa` | +| container | sglang-runtime | SGLang backend runtime | SGLang v0.5.18 · CUDA 13.0 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0`; `nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0-efa` | +| container | tensorrtllm-runtime | TensorRT-LLM backend runtime | TRT-LLM v1.3.0rc25 · CUDA 13.1 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.5.0`; `nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.5.0-efa` | +| container | dynamo-frontend | OpenAI-compatible API gateway with Endpoint Prediction Protocol (EPP) | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.5.0` | +| container | dynamo-planner | Standalone Planner used by Profiler jobs and Planner pods | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0` | +| container | kubernetes-operator | Operator that manages Dynamo deployments and CRDs | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/kubernetes-operator:1.5.0` | +| wheel | ai-dynamo | Main package with backend integrations (vLLM, SGLang, TRT-LLM) | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install ai-dynamo==1.5.0` | +| wheel | ai-dynamo-runtime | Core Python bindings for the Dynamo runtime | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install ai-dynamo-runtime==1.5.0` | +| wheel | kvbm | KV Block Manager for disaggregated KV cache | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install kvbm==1.5.0` | +| helm | dynamo-platform | Platform services (etcd, NATS) and the Dynamo Operator for a Dynamo cluster | - | `helm install dynamo-platform https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-platform-1.5.0.tgz` | +| crate | dynamo-runtime | Core distributed runtime library | MSRV Rust v1.82 | `cargo add dynamo-runtime@1.5.0` | +| crate | dynamo-llm | LLM inference engine | MSRV Rust v1.82 | `cargo add dynamo-llm@1.5.0` | | crate | dynamo-protocols | Async OpenAI-compatible API client | Independently versioned | `cargo add dynamo-protocols@5.0.1` | | crate | dynamo-async-openai (Deprecated) | Legacy OpenAI client; use dynamo-protocols | MSRV Rust v1.82 · final release | `cargo add dynamo-async-openai@1.0.2` | | crate | dynamo-parsers | Protocol parsers (SSE, JSON streaming) | Independently versioned | `cargo add dynamo-parsers@7.0.1` | -| crate | dynamo-memory | Memory management utilities | MSRV Rust v1.82 | `cargo add dynamo-memory@1.4.2` | +| crate | dynamo-memory | Memory management utilities | MSRV Rust v1.82 | `cargo add dynamo-memory@1.5.0` | | crate | dynamo-config | Configuration management | MSRV Rust v1.82 | `cargo add dynamo-config@1.2.1` | -| crate | dynamo-tokens | Tokenizer bindings for LLM inference | MSRV Rust v1.82 | `cargo add dynamo-tokens@1.4.2` | +| crate | dynamo-tokens | Tokenizer bindings for LLM inference | MSRV Rust v1.82 | `cargo add dynamo-tokens@1.5.0` | | crate | dynamo-tokenizers | Tokenizer library for LLM inference | Independently versioned | `cargo add dynamo-tokenizers@1.5.4` | -| crate | dynamo-mocker | Inference engine simulator for benchmarking | MSRV Rust v1.82 | `cargo add dynamo-mocker@1.4.2` | -| crate | dynamo-kv-router | KV-aware request routing library | MSRV Rust v1.82 | `cargo add dynamo-kv-router@1.4.2` | -| crate | kvbm-logical | Logical layer for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-logical@1.4.2` | -| crate | dynamo-kv-hashing | Request-to-lineage-hash contract for KV cache identity | MSRV Rust v1.82 | `cargo add dynamo-kv-hashing@1.4.2` | -| crate | dynamo-data-gen | Schemas and primitives for Dynamo data generation and replay traces | MSRV Rust v1.82 | `cargo add dynamo-data-gen@1.4.2` | -| crate | dynamo-rl | Dynamo RL worker discovery API | MSRV Rust v1.82 | `cargo add dynamo-rl@1.4.2` | -| crate | dynamo-bench | Lightweight HTTP benchmarks for Dynamo endpoints | MSRV Rust v1.82 | `cargo add dynamo-bench@1.4.2` | -| crate | dynamo-truthy | Canonical truthy/falsy boolean flag parsing | MSRV Rust v1.82 | `cargo add dynamo-truthy@1.4.2` | -| crate | kvbm-common | Shared types for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-common@1.4.2` | -| crate | kvbm-config | KVBM configuration for Tokio, Rayon, and Messenger runtimes | MSRV Rust v1.82 | `cargo add kvbm-config@1.4.2` | -| crate | kvbm-kernels | CUDA kernels for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-kernels@1.4.2` | -| crate | kvbm-physical | Physical block layer for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-physical@1.4.2` | -| crate | kvbm-engine | Distributed coordination primitives for KVBM | MSRV Rust v1.82 | `cargo add kvbm-engine@1.4.2` | +| crate | dynamo-mocker | Inference engine simulator for benchmarking | MSRV Rust v1.82 | `cargo add dynamo-mocker@1.5.0` | +| crate | dynamo-kv-router | KV-aware request routing library | MSRV Rust v1.82 | `cargo add dynamo-kv-router@1.5.0` | +| crate | kvbm-logical | Logical layer for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-logical@1.5.0` | +| crate | dynamo-kv-hashing | Request-to-lineage-hash contract for KV cache identity | MSRV Rust v1.82 | `cargo add dynamo-kv-hashing@1.5.0` | +| crate | dynamo-data-gen | Schemas and primitives for Dynamo data generation and replay traces | MSRV Rust v1.82 | `cargo add dynamo-data-gen@1.5.0` | +| crate | dynamo-rl | Dynamo RL worker discovery API | MSRV Rust v1.82 | `cargo add dynamo-rl@1.5.0` | +| crate | dynamo-bench | Lightweight HTTP benchmarks for Dynamo endpoints | MSRV Rust v1.82 | `cargo add dynamo-bench@1.5.0` | +| crate | dynamo-truthy | Canonical truthy/falsy boolean flag parsing | MSRV Rust v1.82 | `cargo add dynamo-truthy@1.5.0` | +| crate | kvbm-common | Shared types for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-common@1.5.0` | +| crate | kvbm-config | KVBM configuration for Tokio, Rayon, and Messenger runtimes | MSRV Rust v1.82 | `cargo add kvbm-config@1.5.0` | +| crate | kvbm-kernels | CUDA kernels for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-kernels@1.5.0` | +| crate | kvbm-physical | Physical block layer for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-physical@1.5.0` | +| crate | kvbm-engine | Distributed coordination primitives for KVBM | MSRV Rust v1.82 | `cargo add kvbm-engine@1.5.0` | | crate | dynamo-renderer | Chat-template rendering used by the Dynamo Frontend | Independently versioned | `cargo add dynamo-renderer@4.0.0` | | crate | dynamo-parsers-v2 | Successor parser line to dynamo-parsers, consumed by the Frontend | Independently versioned | `cargo add dynamo-parsers-v2@0.1.23` | | crate | fastokens | Rust BPE tokenizer backend consumed by the Frontend | Independently versioned | `cargo add fastokens@0.2.0` | diff --git a/docs/fern/pages/reference/general/releases-machine-readable.mdx b/docs/fern/pages/reference/general/releases-machine-readable.mdx index 7d1b9785cb81..7ccc6d5e2368 100644 --- a/docs/fern/pages/reference/general/releases-machine-readable.mdx +++ b/docs/fern/pages/reference/general/releases-machine-readable.mdx @@ -9,13 +9,14 @@ This page is a plain-markdown rendering of [`components/releases.data.ts`](https {/* llms-tables:begin — generated by scripts/gen_llms_tables.py, do not edit */} -Current stable release: v1.4.2 (Aug 28, 2026; container tag `1.4.2`, wheel version `1.4.2`). +Current stable release: v1.5.0 (Sep 18, 2026; container tag `1.5.0`, wheel version `1.5.0`). ## Releases | Version | Kind | Date | SGLang | TensorRT-LLM | vLLM | NIXL (SGL / TRT / vLLM) | UCX | Notes | Delta | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | main (ToT) | development head | - | 0.5.19 | 1.3.0rc26 | 0.29.0 | 1.4.0 / 1.3.1 / 1.3.2 | - | - | - | +| v1.5.0 | stable | Sep 18, 2026 | 0.5.18 | 1.3.0rc25 | 0.28.0 | 1.4.0 / 1.3.1 / 1.3.2 | 1.21.x | [release notes](https://docs.nvidia.com/dynamo/dev/reference/releases/v1-5-0) | KVBM deprecated with removal targeted for v1.6.0; CRD storage version promoted to v1beta1 and the v1alpha1 admission webhook endpoints removed; Go EPP removed in favor of the Rust EPP shipped inside the Frontend image; Dynamo Snapshot moved to a standalone operator and chart, dropping the bundled snapshot chart, snapshot-agent image and DynamoCheckpoint CRD; AIConfigurator renamed to AISimulate; unified-backend entry point removed from the vLLM and SGLang workers; UCX 1.21.x. | | v1.4.2 | patch | Aug 28, 2026 | 0.5.16 | 1.3.0rc22 | 0.26.0 | 1.3.0 / 1.3.1 / 1.3.2 | 1.21.x | [release notes](https://docs.nvidia.com/dynamo/dev/reference/releases/v1-4-0#v142) | Patch release and the first Dynamo Enterprise Support release: a curated set of release artifacts publishes under the -enterprise suffix on NGC, eligible for enterprise support, with no functional or binary differences from the open-source artifacts. Fixes NIXL loader-path resolution in the Frontend and SGLang Runtime images, removes the unused Nsight EFA metrics plugin, and tightens dependency pins (pillow v12.3.0 floor, plotext below v6, EFA Installer v1.50). Backend pins are unchanged from v1.4.0. | | v1.4.1 | patch | Aug 21, 2026 | 0.5.16 | 1.3.0rc22 | 0.26.0 | 1.3.0 / 1.3.1 / 1.3.2 | 1.21.x | [release notes](https://docs.nvidia.com/dynamo/dev/reference/releases/v1-4-0#v141) | Patch release. Adds the classify and pooling endpoints, forwards logprob_token_ids through the OpenAI frontend, reconciles request-path overload marks in the Router, and fixes NIXL writable buffers for vLLM. All three Go modules move to Go 1.26.6 with aligned x/net and grpc. Backend pins are unchanged from v1.4.0. | | v1.4.0 | stable | Aug 14, 2026 | 0.5.16 | 1.3.0rc22 | 0.26.0 | 1.3.0 / 1.3.1 / 1.3.2 | 1.21.x | [release notes](https://docs.nvidia.com/dynamo/dev/reference/releases/v1-4-0) | Audit subsystem migrated into request trace (DYN_AUDIT_* honored as legacy aliases); HTTP header capture in trace records is an explicit fail-closed allowlist; deprecated multimodal worker flags and vLLM worker-role flags removed; runtime images no longer bundle software video decoders (H.264/H.265 decodes via NVDEC); UCX 1.21.x. | @@ -50,6 +51,7 @@ Current stable release: v1.4.2 (Aug 28, 2026; container tag `1.4.2`, wheel versi Release highlights (stable releases): +- v1.5.0: Pluggable worker selection policies and tiered KV indexing in the Router, guided tool-call streaming and request validation in the Frontend, image decoding at the Frontend for encode-prefill-decode deployments, v1beta1 CRD storage with the Rust EPP as the default Endpoint Picker, GPU Memory Service V1, and a standalone Snapshot operator. - v1.4.0: Experimental cross-datacenter prefix routing and reservation replay in the Router, a vLLM-compatible generate token endpoint, tokenizer L1 prefix cache on by default, NIXL disaggregation for vLLM-Omni pipelines, and the Spica deployment simulator. - v1.3.0: Tool-calling and reasoning overhaul, RL rollout serving, the largest Router buildout to date, SLA-driven Planner autoscaling, and production GPU Memory Service on Kubernetes. - v1.2.0: DGD/DGDR v1beta1, CRTC as the default KV router, inter-pod GPU Memory Service, Dynamo Snapshot on CRI-O/OpenShift, and DeepSeek-V4 recipes on vLLM. @@ -60,6 +62,9 @@ Release highlights (stable releases): | Dynamo | Backend | CUDA Toolkit | Min Driver | Note | | --- | --- | --- | --- | --- | +| 1.5.0 | SGLang | 13.0 | 580.xx+ | - | +| 1.5.0 | TensorRT-LLM | 13.1 | 580.xx+ | - | +| 1.5.0 | vLLM | 13.0 | 580.xx+ | - | | 1.4.2 | SGLang | 13.0 | 580.xx+ | - | | 1.4.2 | TensorRT-LLM | 13.1 | 580.xx+ | - | | 1.4.2 | vLLM | 13.0 | 580.xx+ | - | @@ -137,7 +142,7 @@ Release highlights (stable releases): - Early access v1.1.0-dev.* images follow the same CUDA matrix as v1.0.2. The v1.2.0-deepseek-v4-dev.3 vLLM container is CUDA 13.0 multi-arch; the SGLang containers split by arch (CUDA 12.9 on amd64, CUDA 13.0 on arm64). - Experimental CUDA 13 images are not published for all versions. -## Feature support by backend (v1.4.2) +## Feature support by backend (v1.5.0) | Feature | SGLang | TensorRT-LLM | vLLM | | --- | --- | --- | --- | @@ -157,44 +162,42 @@ Release highlights (stable releases): | Shadow Engine Failover | Experimental (No KV-cache reuse or hardware fault tolerance) | Experimental (No KV-cache reuse or hardware fault tolerance) | Supported with caveat (Software-process failover only; no KV-cache reuse or hardware fault tolerance) | | Dynamo Snapshot | Supported with caveat (Single-GPU supported; multi-GPU and multinode remain in progress) | Experimental (Single-GPU aggregated text-worker path only) | Supported with caveat (Single-GPU supported; multi-GPU is highly experimental and multinode remains in progress) | -## Artifact inventory (v1.4.2) +## Artifact inventory (v1.5.0) | Category | Name | Description | Meta | Tags / install | | --- | --- | --- | --- | --- | -| container | vllm-runtime | vLLM backend runtime | vLLM v0.26.0 · CUDA 13.0 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.2`; `nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.2-efa` | -| container | sglang-runtime | SGLang backend runtime | SGLang v0.5.16 · CUDA 13.0 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.2`; `nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.2-efa` | -| container | tensorrtllm-runtime | TensorRT-LLM backend runtime | TRT-LLM v1.3.0rc22 · CUDA 13.1 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.4.2`; `nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.4.2-efa` | -| container | dynamo-frontend | OpenAI-compatible API gateway with Endpoint Prediction Protocol (EPP) | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.4.2` | -| container | dynamo-planner | Standalone Planner used by Profiler jobs and Planner pods | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.2` | -| container | kubernetes-operator | Operator that manages Dynamo deployments and CRDs | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/kubernetes-operator:1.4.2` | -| container | snapshot-agent (Preview) | Fast GPU worker recovery via CRIU | AMD64 | `nvcr.io/nvidia/ai-dynamo/snapshot-agent:1.4.2` | -| wheel | ai-dynamo | Main package with backend integrations (vLLM, SGLang, TRT-LLM) | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install ai-dynamo==1.4.2` | -| wheel | ai-dynamo-runtime | Core Python bindings for the Dynamo runtime | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install ai-dynamo-runtime==1.4.2` | -| wheel | kvbm | KV Block Manager for disaggregated KV cache | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install kvbm==1.4.2` | -| helm | dynamo-platform | Platform services (etcd, NATS) and the Dynamo Operator for a Dynamo cluster | - | `helm install dynamo-platform https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-platform-1.4.2.tgz` | -| helm | snapshot | Snapshot DaemonSet for fast GPU worker recovery | - | `helm install snapshot https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/snapshot-1.4.2.tgz` | -| crate | dynamo-runtime | Core distributed runtime library | MSRV Rust v1.82 | `cargo add dynamo-runtime@1.4.2` | -| crate | dynamo-llm | LLM inference engine | MSRV Rust v1.82 | `cargo add dynamo-llm@1.4.2` | +| container | vllm-runtime | vLLM backend runtime | vLLM v0.28.0 · CUDA 13.0 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0`; `nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0-efa` | +| container | sglang-runtime | SGLang backend runtime | SGLang v0.5.18 · CUDA 13.0 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0`; `nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0-efa` | +| container | tensorrtllm-runtime | TensorRT-LLM backend runtime | TRT-LLM v1.3.0rc25 · CUDA 13.1 · AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.5.0`; `nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.5.0-efa` | +| container | dynamo-frontend | OpenAI-compatible API gateway with Endpoint Prediction Protocol (EPP) | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.5.0` | +| container | dynamo-planner | Standalone Planner used by Profiler jobs and Planner pods | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.5.0` | +| container | kubernetes-operator | Operator that manages Dynamo deployments and CRDs | AMD64/ARM64 | `nvcr.io/nvidia/ai-dynamo/kubernetes-operator:1.5.0` | +| wheel | ai-dynamo | Main package with backend integrations (vLLM, SGLang, TRT-LLM) | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install ai-dynamo==1.5.0` | +| wheel | ai-dynamo-runtime | Core Python bindings for the Dynamo runtime | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install ai-dynamo-runtime==1.5.0` | +| wheel | kvbm | KV Block Manager for disaggregated KV cache | Python 3.10–3.12 · Linux (glibc v2.28+) | `uv pip install kvbm==1.5.0` | +| helm | dynamo-platform | Platform services (etcd, NATS) and the Dynamo Operator for a Dynamo cluster | - | `helm install dynamo-platform https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-platform-1.5.0.tgz` | +| crate | dynamo-runtime | Core distributed runtime library | MSRV Rust v1.82 | `cargo add dynamo-runtime@1.5.0` | +| crate | dynamo-llm | LLM inference engine | MSRV Rust v1.82 | `cargo add dynamo-llm@1.5.0` | | crate | dynamo-protocols | Async OpenAI-compatible API client | Independently versioned | `cargo add dynamo-protocols@5.0.1` | | crate | dynamo-async-openai (Deprecated) | Legacy OpenAI client; use dynamo-protocols | MSRV Rust v1.82 · final release | `cargo add dynamo-async-openai@1.0.2` | | crate | dynamo-parsers | Protocol parsers (SSE, JSON streaming) | Independently versioned | `cargo add dynamo-parsers@7.0.1` | -| crate | dynamo-memory | Memory management utilities | MSRV Rust v1.82 | `cargo add dynamo-memory@1.4.2` | +| crate | dynamo-memory | Memory management utilities | MSRV Rust v1.82 | `cargo add dynamo-memory@1.5.0` | | crate | dynamo-config | Configuration management | MSRV Rust v1.82 | `cargo add dynamo-config@1.2.1` | -| crate | dynamo-tokens | Tokenizer bindings for LLM inference | MSRV Rust v1.82 | `cargo add dynamo-tokens@1.4.2` | +| crate | dynamo-tokens | Tokenizer bindings for LLM inference | MSRV Rust v1.82 | `cargo add dynamo-tokens@1.5.0` | | crate | dynamo-tokenizers | Tokenizer library for LLM inference | Independently versioned | `cargo add dynamo-tokenizers@1.5.4` | -| crate | dynamo-mocker | Inference engine simulator for benchmarking | MSRV Rust v1.82 | `cargo add dynamo-mocker@1.4.2` | -| crate | dynamo-kv-router | KV-aware request routing library | MSRV Rust v1.82 | `cargo add dynamo-kv-router@1.4.2` | -| crate | kvbm-logical | Logical layer for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-logical@1.4.2` | -| crate | dynamo-kv-hashing | Request-to-lineage-hash contract for KV cache identity | MSRV Rust v1.82 | `cargo add dynamo-kv-hashing@1.4.2` | -| crate | dynamo-data-gen | Schemas and primitives for Dynamo data generation and replay traces | MSRV Rust v1.82 | `cargo add dynamo-data-gen@1.4.2` | -| crate | dynamo-rl | Dynamo RL worker discovery API | MSRV Rust v1.82 | `cargo add dynamo-rl@1.4.2` | -| crate | dynamo-bench | Lightweight HTTP benchmarks for Dynamo endpoints | MSRV Rust v1.82 | `cargo add dynamo-bench@1.4.2` | -| crate | dynamo-truthy | Canonical truthy/falsy boolean flag parsing | MSRV Rust v1.82 | `cargo add dynamo-truthy@1.4.2` | -| crate | kvbm-common | Shared types for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-common@1.4.2` | -| crate | kvbm-config | KVBM configuration for Tokio, Rayon, and Messenger runtimes | MSRV Rust v1.82 | `cargo add kvbm-config@1.4.2` | -| crate | kvbm-kernels | CUDA kernels for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-kernels@1.4.2` | -| crate | kvbm-physical | Physical block layer for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-physical@1.4.2` | -| crate | kvbm-engine | Distributed coordination primitives for KVBM | MSRV Rust v1.82 | `cargo add kvbm-engine@1.4.2` | +| crate | dynamo-mocker | Inference engine simulator for benchmarking | MSRV Rust v1.82 | `cargo add dynamo-mocker@1.5.0` | +| crate | dynamo-kv-router | KV-aware request routing library | MSRV Rust v1.82 | `cargo add dynamo-kv-router@1.5.0` | +| crate | kvbm-logical | Logical layer for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-logical@1.5.0` | +| crate | dynamo-kv-hashing | Request-to-lineage-hash contract for KV cache identity | MSRV Rust v1.82 | `cargo add dynamo-kv-hashing@1.5.0` | +| crate | dynamo-data-gen | Schemas and primitives for Dynamo data generation and replay traces | MSRV Rust v1.82 | `cargo add dynamo-data-gen@1.5.0` | +| crate | dynamo-rl | Dynamo RL worker discovery API | MSRV Rust v1.82 | `cargo add dynamo-rl@1.5.0` | +| crate | dynamo-bench | Lightweight HTTP benchmarks for Dynamo endpoints | MSRV Rust v1.82 | `cargo add dynamo-bench@1.5.0` | +| crate | dynamo-truthy | Canonical truthy/falsy boolean flag parsing | MSRV Rust v1.82 | `cargo add dynamo-truthy@1.5.0` | +| crate | kvbm-common | Shared types for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-common@1.5.0` | +| crate | kvbm-config | KVBM configuration for Tokio, Rayon, and Messenger runtimes | MSRV Rust v1.82 | `cargo add kvbm-config@1.5.0` | +| crate | kvbm-kernels | CUDA kernels for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-kernels@1.5.0` | +| crate | kvbm-physical | Physical block layer for the KV Block Manager | MSRV Rust v1.82 | `cargo add kvbm-physical@1.5.0` | +| crate | kvbm-engine | Distributed coordination primitives for KVBM | MSRV Rust v1.82 | `cargo add kvbm-engine@1.5.0` | | crate | dynamo-renderer | Chat-template rendering used by the Dynamo Frontend | Independently versioned | `cargo add dynamo-renderer@4.0.0` | | crate | dynamo-parsers-v2 | Successor parser line to dynamo-parsers, consumed by the Frontend | Independently versioned | `cargo add dynamo-parsers-v2@0.1.23` | | crate | fastokens | Rust BPE tokenizer backend consumed by the Frontend | Independently versioned | `cargo add fastokens@0.2.0` | @@ -262,6 +265,7 @@ Release highlights (stable releases): | Release | PRs | Contributors | First-time contributors | Breaking changes | Known issues | | --- | --- | --- | --- | --- | --- | +| v1.5.0 | 658 | 123 | - | 44 | 12 | | v1.4.0 | 640 | 127 | 29 | 51 | 19 | | v1.3.0 | 930 | 125 | 24 | 24 | 10 | | v1.2.0 | 603 | 82 | - | 5 | 11 | diff --git a/docs/fern/pages/reference/general/releases/deprecations.mdx b/docs/fern/pages/reference/general/releases/deprecations.mdx index d070ecdb2408..48640feb37ce 100644 --- a/docs/fern/pages/reference/general/releases/deprecations.mdx +++ b/docs/fern/pages/reference/general/releases/deprecations.mdx @@ -17,6 +17,184 @@ Upgrading? Pick the version you run today to see the dependency migration and th + + +## v1.5.0 — Sep 18, 2026 + +Deprecated **KVBM (KV Block Manager) is deprecated in v1.5.0 and removal is targeted for v1.6.0; the `kvbm` wheel and the vLLM KVBM launch and deploy examples ship unchanged for this release**. + + > **Migrate:** Use the engine's native KV offloading for host and disk tiering. Cross-node KV cache sharing is the scope of the separate, early-stage KV Cache Runner (KVCR) project, which does not replace KVBM. + +Removed **CRD storage version promoted from v1alpha1 to v1beta1, with examples and Profiler output moving with it** ([#11904](https://github.com/ai-dynamo/dynamo/pull/11904), [#12375](https://github.com/ai-dynamo/dynamo/pull/12375), [#12506](https://github.com/ai-dynamo/dynamo/pull/12506)). + + > **Migrate:** Upgrade the operator so the built-in CRD migrator converts stored objects. + +Removed **v1alpha1 admission webhook endpoints removed, and DGD and DCD validation served only at v1beta1 paths** ([#11177](https://github.com/ai-dynamo/dynamo/pull/11177)). + + > **Migrate:** Update any custom Validating/MutatingWebhookConfiguration (not managed by the bundled Helm chart) to point at the v1beta1 DGD admission paths with apiVersions: [v1beta1]. + +Removed **Go EPP removed, and the Rust EPP shipped inside the Frontend image is the default Endpoint Picker** ([#11355](https://github.com/ai-dynamo/dynamo/pull/11355)). + + > **Migrate:** Update EPP deployment manifests and flags to the Rust EPP (LW-EPP) contract. + +Deprecated **`eppConfig` deprecated; it remains honored so a `DynamoGraphDeployment` pinned to a 1.4 Go EPP image keeps working after the Operator upgrade** ([#11355](https://github.com/ai-dynamo/dynamo/pull/11355)). + + > **Migrate:** Omit `eppConfig` to use the Rust EPP; the field goes away with the Go EPP contract in a later release. + +Removed **Dynamo Snapshot moved to a standalone operator, removing the bundled chart, PodSnapshot CRDs, and reconciliation from Dynamo Operator** ([#13177](https://github.com/ai-dynamo/dynamo/pull/13177)). + + > **Migrate:** Snapshot v0.1.0 now installs as its own operator from `oci://ghcr.io/ai-dynamo/snapshot/snapshot:0.1.0`. For evaluation, the Dynamo platform chart can install it as a subchart with `global.snapshot.install=true`, which is off by default. For production, install the Snapshot chart separately before upgrading Dynamo Operator, then set `checkpoint.enabled=true` on the operator to turn checkpoint and restore back on. + +Removed **DynamoCheckpoint CRD, its Helm values, and `DYN_SNAPSHOT_RESTORE_STANDBY` removed, and `checkpointRef` now names a PodSnapshot** ([#14076](https://github.com/ai-dynamo/dynamo/pull/14076)). + + > **Migrate:** Delete legacy DynamoCheckpoint resources, create PodSnapshot resources through the Snapshot operator, and point `checkpointRef` at the PodSnapshot. + +Removed **Unified-backend entry point and logits-processing adapters removed from the SGLang and vLLM workers** ([#12792](https://github.com/ai-dynamo/dynamo/pull/12792)). + + > **Migrate:** Drop the unified-backend flag from SGLang/vLLM launch commands and use the standard worker invocation shown in the updated CLI templates. + +Removed **AIConfigurator renamed to AISimulate: aiconfigurator wheels replaced by the `aisimulate` package, and the `python -m dynamo.replay` CLI removed** ([#13665](https://github.com/ai-dynamo/dynamo/pull/13665)). + + > **Migrate:** Install the consolidated `aisimulate` wheel/`aisimulate-core` crate instead of the separate `aiconfigurator` packages (compatibility import namespaces ship inside the AISimulate wheel). + +Removed **Planner performance-model and Mocker engine bindings removed from `dynamo._core`** ([#12454](https://github.com/ai-dynamo/dynamo/pull/12454), [#12446](https://github.com/ai-dynamo/dynamo/pull/12446), [#12525](https://github.com/ai-dynamo/dynamo/pull/12525)). + +Removed **Offline replay API returns a single `ReplayReport`, `--report-jsonl` renamed to `--per-request-jsonl`, and per-request capture is opt-in** ([#12363](https://github.com/ai-dynamo/dynamo/pull/12363)). + + > **Migrate:** Update replay invocations/scripts to pass `--per-request-jsonl` instead of `--report-jsonl`. + +Removed **SGLang `call_tokenizer_manager` passthrough route and `RLMixin` export removed** ([#12246](https://github.com/ai-dynamo/dynamo/pull/12246)). + + > **Migrate:** Declare each needed tokenizer-manager or engine method explicitly with `--engine-route` (or `DYN_SGLANG_ENGINE_ROUTES`) and call the configured `/engine/` instead of the generic `call_tokenizer_manager` endpoint. + +Removed **PodSnapshot capture target now comes from the required `PodReference.Containers` field instead of a pod annotation** ([#12068](https://github.com/ai-dynamo/dynamo/pull/12068)). + + > **Migrate:** Update the PodSnapshot/PodSnapshotContent CRDs and add exactly one entry to spec.source.podRef.containers in any hand-authored manifests, otherwise admission rejects them. + +Removed **GMS Snapshot feature gate removed, and IntraPod Snapshot enabled by default under the Checkpoint gate and unsupported combinations rejected** ([#12685](https://github.com/ai-dynamo/dynamo/pull/12685)). + + > **Migrate:** Remove the GMS Snapshot feature-gate setting from your operator Helm values/args. + +Deprecated **Automatic tokenizer fallback to Hugging Face is deprecated and will stop being the default** ([#12923](https://github.com/ai-dynamo/dynamo/pull/12923)). + + > **Migrate:** Set --no-tokenizer-fallback or DYN_TOKENIZER_FALLBACK=false to adopt the future behavior now, and ensure your model's tokenizer.json is supported by the selected backend. + +Removed **Removed `nsRestorePath` snapshot config/Helm value** ([#12626](https://github.com/ai-dynamo/dynamo/pull/12626)). + + > **Migrate:** Delete any `nsRestorePath` setting from snapshot chart values/config. + +Removed **Shared AWS EFA Kustomize components removed in favor of instance-type template selections** ([#13125](https://github.com/ai-dynamo/dynamo/pull/13125)). + + > **Migrate:** Update overlays that referenced the aws-efa-p8d8/p8d16/p16d16 shared Components to select the new instance-type template (e.g. templates/aws-efa/p5.48xlarge) or the local components/efa Component. + +Removed **Legacy Nemotron-3-Ultra Day-0 recipe manifests replaced by Refresh profile paths without the `nvcr-secret` imagePullSecret** ([#13226](https://github.com/ai-dynamo/dynamo/pull/13226)). + + > **Migrate:** Update any references/automation pointing at the old Day-0 recipe directories to the corresponding new Refresh profile paths (SKU + context + serving shape). + +Removed **Qwen3.8-2.4T-A95B recipe renamed with an `-fp8` suffix, changing the served model name and weight cache key** ([#13265](https://github.com/ai-dynamo/dynamo/pull/13265)). + + > **Migrate:** Re-run the model-download Job to fetch Qwen/Qwen3.8-2.4T-A95B-FP8 and update any client requests to use the new served model name. + +Removed **DeepSeek-V4 model-download manifest split and renamed, and the default downloaded checkpoint is now FP8** ([#13034](https://github.com/ai-dynamo/dynamo/pull/13034)). + + > **Migrate:** Apply the SKU-specific manifest (model-download-fp8.yaml for H200/most variants, model-download-nvfp4.yaml for B200 agentic variants) instead of the removed model-download.yaml, and update any references to the old Job name. + +Behavioral **Guided tool calls stream incrementally by default instead of a single terminal chunk** ([#12576](https://github.com/ai-dynamo/dynamo/pull/12576)). + + > **Migrate:** Clients that assumed a single complete tool-call chunk must accumulate incremental tool-call argument deltas, or set DYN_ENABLE_GUIDED_TOOL_STREAMING=0 to restore buffering. + +Behavioral **Over-context requests rejected before streaming, and an omitted `max_tokens` now derives from the engine-published TokenBudget** ([#12092](https://github.com/ai-dynamo/dynamo/pull/12092)). + + > **Migrate:** Update clients and retry/monitoring logic to handle a non-200 HTTP client error for over-context requests instead of an inline streamed error. + +Behavioral **Thinking/reasoning controls resolved once with new precedence and written to all three template keys** ([#11739](https://github.com/ai-dynamo/dynamo/pull/11739)). + + > **Migrate:** If you relied on the previous per-backend resolution or on only `enable_thinking` being set, drop manual chat_template_args thinking overrides and rely on the documented precedence order. + +Behavioral **Gemma 4 reasoning parsing now requires explicit enable_thinking=true** ([#13061](https://github.com/ai-dynamo/dynamo/pull/13061)). + + > **Migrate:** Set `chat_template_args: {"enable_thinking": true}` in requests to Gemma 4 models to keep receiving parsed reasoning_content. + +Behavioral **Embedding tokenization adds special tokens by default and moves to the worker, with Frontend tokenization opt-in** ([#12157](https://github.com/ai-dynamo/dynamo/pull/12157)). + + > **Migrate:** Set `add_special_tokens: false` on embedding requests or export DYN_EMBEDDING_TOKENIZATION_ADD_SPECIAL_TOKENS=false to keep the previous tokenization behavior. + +Behavioral **vLLM encode worker embedding cache now disabled by default (gated on --multimodal-embedding-cache-capacity-gb)** ([#14452](https://github.com/ai-dynamo/dynamo/pull/14452)). + + > **Migrate:** Set --multimodal-embedding-cache-capacity-gb to a positive value to keep embedding caching in the vLLM encode worker. + +Behavioral **DGD, DCD, and DGDR admission requires a main container image, and a non-semver image tag (digest, custom build tag, or `:latest`) requires `runtimeVersionOverride`** ([#10494](https://github.com/ai-dynamo/dynamo/pull/10494)). + + > **Migrate:** Set the main container image on every component (`spec.components[*].podTemplate.spec.containers[name=main].image` in v1beta1, `spec.services..extraPodSpec.mainContainer.image` in v1alpha1) and add `runtimeVersionOverride: ""` wherever the image tag is not a semantic version, including a DGDR whose `spec.image` is not. The checks are ratcheted: an unchanged existing component stays admissible, but adding or changing an image applies them, so set the override in the same update that changes the tag. Full details are in the [platform chart upgrading notes](https://github.com/ai-dynamo/dynamo/blob/release/1.5.0/deploy/helm/charts/platform/README.md#-upgrading-notes). + +Behavioral **runtimeVersionOverride now participates in worker hash and can trigger rollouts** ([#12633](https://github.com/ai-dynamo/dynamo/pull/12633)). + + > **Migrate:** Before upgrading, ensure runtimeVersionOverride matches the image's actual runtime version and expect a one-time worker rollout when the resolved version (>=1.5.0) changes. + +Behavioral **Worker canary health checks enabled by default in operator-rendered pods** ([#11083](https://github.com/ai-dynamo/dynamo/pull/11083)). + + > **Migrate:** Set DYN_HEALTH_CHECK_ENABLED=false explicitly in the worker container env if you need the previous behavior. + +Behavioral **Worker liveness probe failureThreshold default raised from 1 to 3 for runtime >= 1.5.0** ([#13512](https://github.com/ai-dynamo/dynamo/pull/13512)). + + > **Migrate:** No action needed unless you rely on immediate restart on first liveness failure. + +Behavioral **`nvidia.com/workload-provider` is persisted and immutable, with no fallback to the Component provider when Grove is unavailable** ([#12942](https://github.com/ai-dynamo/dynamo/pull/12942)). + + > **Migrate:** To change the workload provider of an existing DynamoGraphDeployment, delete and recreate the DGD instead of toggling nvidia.com/enable-grove or the Grove feature gate. + +Behavioral **Elastic-EP components require an explicit container command, and single-pod components start a Ray head and inject `POD_IP` and `VLLM_DP_M*`** ([#12943](https://github.com/ai-dynamo/dynamo/pull/12943)). + + > **Migrate:** If you set --enable-elastic-ep on a single-pod component and relied on it being a no-op, remove the flag. + +Behavioral **componentType/type fields are now immutable after being set** ([#13763](https://github.com/ai-dynamo/dynamo/pull/13763)). + + > **Migrate:** Delete and recreate the DynamoComponentDeployment/DynamoGraphDeployment (or component) instead of editing its componentType/type field in place. + +Behavioral **vLLM STORAGE KV events now indexed on the Disk tier, and REMOTE or unknown-locality events dropped** ([#11571](https://github.com/ai-dynamo/dynamo/pull/11571)). + + > **Migrate:** Expect STORAGE offload prefixes to be scored via the Disk tier and non-local (REMOTE/unknown locality) KV events to be ignored. + +Behavioral **`DYN_USE_KV_EVENTS` renamed to `DYN_ROUTER_USE_KV_EVENTS` (alias kept), and previously ignored `DYN_*` Router env vars now honored** ([#13840](https://github.com/ai-dynamo/dynamo/pull/13840)). + + > **Migrate:** Switch to DYN_ROUTER_USE_KV_EVENTS. + +Behavioral **DYN_RUNTIME_NUM_WORKER_THREADS / DYN_RUNTIME_MAX_BLOCKING_THREADS now actually apply to the runtime serving traffic** ([#13849](https://github.com/ai-dynamo/dynamo/pull/13849)). + + > **Migrate:** Re-check any explicit DYN_RUNTIME_NUM_WORKER_THREADS / DYN_RUNTIME_MAX_BLOCKING_THREADS values (and unset ones relying on the old per-CPU/512 sizing) since they now change frontend thread counts and concurrency. + +Behavioral **EPP replica sync validates `POD_IP` at config-parse time and no longer resolves the port from the `replica-agg` Service port** ([#13811](https://github.com/ai-dynamo/dynamo/pull/13811)). + + > **Migrate:** Ensure every EPP replica binds the same replica-sync port (9092 by default) and set DYN_EPP_REPLICA_SYNC_PORT if your existing `replica-agg` targetPort differed. + +Behavioral **Standalone router --endpoint namespace now overridden by DYN_NAMESPACE / worker suffix** ([#12160](https://github.com/ai-dynamo/dynamo/pull/12160)). + + > **Migrate:** If you relied on the namespace embedded in --endpoint, unset/align DYN_NAMESPACE and DYN_NAMESPACE_WORKER_SUFFIX so the router resolves workers in the intended namespace. + +Behavioral **Unsupported tool_call_parser names now rejected at model registration** ([#13828](https://github.com/ai-dynamo/dynamo/pull/13828)). + + > **Migrate:** Set --tool-call-parser (or tool_call_parser in runtime config) to one of the parser names listed in the new validation error message before upgrading. + +Behavioral **tool_call arguments auto-normalized to JSON object for glm47 tool_call_parser** ([#12332](https://github.com/ai-dynamo/dynamo/pull/12332)). + + > **Migrate:** If you rely on the raw JSON-string form of historical tool_call arguments with the glm47 tool_call_parser, explicitly set tool_call_arguments_format: json_string in the model runtime config. + +Behavioral **Snapshot saver/loader CLI without --device now fans out to all visible GPUs** ([#13301](https://github.com/ai-dynamo/dynamo/pull/13301)). + + > **Migrate:** Pass an explicit --device N to retain single-process behavior. + +Behavioral **Planner Prometheus requests now time out after 10s and no longer retry** ([#13245](https://github.com/ai-dynamo/dynamo/pull/13245)). + + > **Migrate:** If your Prometheus endpoint is slow, raise the limit via DYN_PLANNER_PROMETHEUS_REQUEST_TIMEOUT_SECONDS or metric_pulling_prometheus_request_timeout_seconds, and expect failed queries to no longer be retried within a collection cycle. + +Behavioral **Profiler-generated vLLM worker args no longer pin --max-model-len, and naive fallback now sizes from declared workload isl/osl** ([#14205](https://github.com/ai-dynamo/dynamo/pull/14205)). + + > **Migrate:** Re-run the profiler and, if a specific context length is required, set --max-model-len explicitly via DGD overrides since the generated config no longer pins it. + +Behavioral **JPEG decoding switches to libjpeg-turbo by default when libturbojpeg is present** ([#11157](https://github.com/ai-dynamo/dynamo/pull/11157)). + + > **Migrate:** Set DYN_MM_ENABLE_LIBJPEG=0 to keep the previous pure-Rust image::ImageReader JPEG decode path (pixel output may differ slightly from TurboJPEG). + ## v1.4.0 — Aug 14, 2026 diff --git a/docs/fern/pages/reference/general/releases/dynamo-v1-5-0.mdx b/docs/fern/pages/reference/general/releases/dynamo-v1-5-0.mdx new file mode 100644 index 000000000000..76d1feaf096e --- /dev/null +++ b/docs/fern/pages/reference/general/releases/dynamo-v1-5-0.mdx @@ -0,0 +1,607 @@ +--- +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +title: Dynamo v1.5.0 +subtitle: Release notes for Dynamo v1.5.0 (GA Sep 18, 2026) +--- + +import { ReferenceStyles } from "@/components/ReferenceStyles"; +import { ReleaseHeader } from "@/components/ReleaseHeader"; +import { ReleaseSummaryCards } from "@/components/ReleaseSummaryCards"; +import { UpgradePanel } from "@/components/UpgradePanel"; +import { PinnedEnvironment } from "@/components/PinnedEnvironment"; + + + + + +Dynamo v1.5.0 is the 18th feature release of the open-source distributed inference platform, spanning 658 merged PRs from 123 contributors. It opens **Dynamo Router** worker selection to custom scoring and picking policies and extends KV indexing to Mooncake and disk tiers. KVBM is deprecated, with removal targeted for v1.6.0. **Dynamo Frontend** streams guided tool calls by default and rejects over-context requests before the first token, and multimodal encode-prefill-decode deployments can decode images once at the Frontend. On Kubernetes, `nvidia.com/v1beta1` becomes the CRD storage version, the Rust Endpoint Picker replaces the Go EPP, and Dynamo Snapshot moves to a standalone operator. TLS and mutual TLS now cover the TCP and NATS transports. AIConfigurator becomes **[AISimulate](https://github.com/ai-dynamo/aisimulate)** and ships as its own package, and the engines move to SGLang v0.5.18, TensorRT-LLM v1.3.0rc25, and vLLM v0.28.0. + + +Breaking changes and deprecations for this release are tracked on the [Deprecations](deprecations.mdx#v150) ledger; known issues on the [Known Issues](known-issues.mdx#v150) page. Key dependency pins live on [Compatibility](../compatibility.mdx); shipped artifacts on [Release Artifacts](../release-artifacts.mdx). Model early access builds (`vX.Y.Z--dev.N`) are tracked in [Model Early Access Builds](../model-early-access-builds.mdx). + + + + +## Get v1.5.0 + +Pull, deploy, and install with every artifact pinned to the v1.5.0 release set. + + + +## Highlights + + + +## Features & Improvements + +### Frontend & Agents + +- **Native Kimi K3 Processing:** Added native Kimi K3 rendering, parsing, and tokenization to the frontend, covering thinking, XTML tool calls, and response wrappers. Fixed the SGLang chat processor to split K3 reasoning content and strip the terminal `<|end_of_msg|>` token ([#12396](https://github.com/ai-dynamo/dynamo/pull/12396), [#12395](https://github.com/ai-dynamo/dynamo/pull/12395)). +- **Pluggable Tokenizer Backend Selection:** Added the Baseten tokenizer as a selectable frontend backend via `--tokenizer basetenkenizer` or `DYN_TOKENIZER=basetenkenizer`, and made the Hugging Face fallback policy configurable so a failed load no longer silently serves Hugging Face instead ([#12376](https://github.com/ai-dynamo/dynamo/pull/12376), [#12923](https://github.com/ai-dynamo/dynamo/pull/12923)). + +#### OpenAI API & Validation + +- **Assistant Message Continuation Support:** Added support for `add_generation_prompt` and `continue_final_message` in the chat preprocessor, which previously ignored both. Continuation requires `add_generation_prompt` set explicitly to false, since it defaults to true and the two flags together are rejected; the final message may be from any role, and prompts truncate to match Hugging Face `apply_chat_template` ([#13841](https://github.com/ai-dynamo/dynamo/pull/13841)). +- **Responses API Correctness Fixes:** Fixed streamed backend error propagation, tool-call and reasoning ordering, and `parallel_tool_calls` handling, added `chat_template_args` support, and added `POST /v1/responses/input_tokens` for estimated input token counts ([#12442](https://github.com/ai-dynamo/dynamo/pull/12442), [#12462](https://github.com/ai-dynamo/dynamo/pull/12462), [#13367](https://github.com/ai-dynamo/dynamo/pull/13367), [#13624](https://github.com/ai-dynamo/dynamo/pull/13624), [#13768](https://github.com/ai-dynamo/dynamo/pull/13768)). +- **Exact Multimodal Generate Routing:** Added routing-only token projection for `/inference/v1/generate` so image identity feeds KV cache-aware routing without changing execution tokens, and made engine, block size, and LoRA selection atomic per `WorkerSet`. Malformed placeholders fall back to token-only routing ([#11588](https://github.com/ai-dynamo/dynamo/pull/11588)). +- **Opt-In SSE Keep-Alive:** Added the `DYN_HTTP_SSE_KEEP_ALIVE_INTERVAL_MS` environment variable to emit spec-compliant Server-Sent Events (SSE) comment frames during idle streams. Unset, zero, or invalid values keep keep-alive disabled, so the default behavior is unchanged for clients that do not ignore comment frames ([#12453](https://github.com/ai-dynamo/dynamo/pull/12453)). + +#### Guided Decoding & Tool Calling + +- **V2 Unified Tool-Call Parser:** Streamed guided tool calls by default, routed Qwen3 through the v2 unified parser so reasoning stays after tool calls, and served Muse-Glimmer-30B default-on through the same parser, adding `--dyn-tool-call-parser muse_glimmer` ([#12576](https://github.com/ai-dynamo/dynamo/pull/12576), [#13340](https://github.com/ai-dynamo/dynamo/pull/13340)). + +#### Reasoning & Thinking Controls + +- **Deployment-Level Thinking Controls:** Added a deployment-level default thinking mode applied at chat-template rendering, with request-level overrides still taking priority, plus fixes for MiniMax M3's `thinking_mode` default and Gemma 4 reasoning parsing gated on explicit `enable_thinking` ([#11047](https://github.com/ai-dynamo/dynamo/pull/11047), [#11739](https://github.com/ai-dynamo/dynamo/pull/11739), [#12687](https://github.com/ai-dynamo/dynamo/pull/12687), [#13061](https://github.com/ai-dynamo/dynamo/pull/13061)). +- **Configurable Reasoning Output Field:** Added the `DYN_REASONING_FIELD_NAME` environment variable to select whether chat completion responses carry reasoning content in the `reasoning` or `reasoning_content` field, defaulting to `reasoning_content`. Routed both streaming and non-streaming emit sites through the new selection so reasoning-only chunks are no longer dropped ([#11464](https://github.com/ai-dynamo/dynamo/pull/11464)). + +#### Tokenizers & Model Processing + +- **Single-Flush Detokenization Metrics:** Changed the frontend to publish detokenization Prometheus counters once per stream instead of per chunk, removing cumulative overcounting while still recording partial metrics for cancellations, errors, timeouts, and early drops ([#12999](https://github.com/ai-dynamo/dynamo/pull/12999)). + +#### Agents & Request Classification + +- **Agent Request Trigger Classification:** Added an `AgentContext.input_trigger` field classifying incoming agent requests as `user_message`, `tool_result`, or `other` across OpenAI and Anthropic APIs, extended to Responses tool-output variants, and carried Codex compaction and thread-lineage metadata into agent context ([#12787](https://github.com/ai-dynamo/dynamo/pull/12787), [#13819](https://github.com/ai-dynamo/dynamo/pull/13819), [#13012](https://github.com/ai-dynamo/dynamo/pull/13012), [#12331](https://github.com/ai-dynamo/dynamo/pull/12331)). + +### Scheduling + +- **Two-Tier Cost Worker Selection Policy:** Added `dynamo-two-tier-cost-fn` as a built-in worker-selection policy that ranks workers on active-request load first and device-KV prefix overlap second, and enabled `custom-policy` by default so a stock build selects it from YAML with no rebuild ([#14498](https://github.com/ai-dynamo/dynamo/pull/14498)). +- **Custom Worker-Selection Policy Catalog:** Added native `WorkerScorer` and `WorkerPicker` policies through the built-in selection path, with a `worker_selection` YAML catalog for the KV frontend and selection services. Routed built-in strategies through one `WorkerSelector::select_worker` entry point ([#12526](https://github.com/ai-dynamo/dynamo/pull/12526), [#12536](https://github.com/ai-dynamo/dynamo/pull/12536), [#13513](https://github.com/ai-dynamo/dynamo/pull/13513), [#12891](https://github.com/ai-dynamo/dynamo/pull/12891), [#12585](https://github.com/ai-dynamo/dynamo/pull/12585)). +- **Pluggable Worker Selection Filters:** Added composable `WorkerFilter` policies to custom worker selection, running eligibility first and filters before scorers and the picker, returning HTTP 503 when filters reject every eligible worker, plus a `min_effective_overlap_blocks` cache-affinity example ([#12897](https://github.com/ai-dynamo/dynamo/pull/12897), [#12896](https://github.com/ai-dynamo/dynamo/pull/12896)). +- **Dynamic Worker Taint Updates:** Added an `update_model_taints` Python API and `POST /engine/update/model_taints` route across SGLang, TensorRT-LLM, and vLLM worker modes, so base-model routing metadata can change at runtime without restarting workers, waking pending scheduler requests ([#12620](https://github.com/ai-dynamo/dynamo/pull/12620)). +- **Tiered KV Event Ingestion:** Added an event-driven Mooncake shared-cache index for SGLang HiCache and routed vLLM native-storage KV events to Dynamo Router's Disk tier with a fail-closed locality policy. Hardened event conversion to fail closed on unrecognized KV event media ([#11239](https://github.com/ai-dynamo/dynamo/pull/11239), [#11571](https://github.com/ai-dynamo/dynamo/pull/11571), [#12456](https://github.com/ai-dynamo/dynamo/pull/12456)). +- **Remote KV Reuse Hints:** Added an experimental router-generated `router_hint` for backend requests when Dynamo Router finds a better non-target source prefix, a signal that remote KV fetchers such as the early-stage KV Cache Runner (KVCR) can use to pull KV blocks from a peer. Carried router-hint and worker-role metadata through vLLM attachment intents, and preserved KV source-health warnings across endpoint rebinds ([#11695](https://github.com/ai-dynamo/dynamo/pull/11695), [#13725](https://github.com/ai-dynamo/dynamo/pull/13725), [#12959](https://github.com/ai-dynamo/dynamo/pull/12959)). +- **Conditional Disaggregation Bypass Orchestration:** Added Router orchestration of the conditional disaggregation bypass path ([#11725](https://github.com/ai-dynamo/dynamo/pull/11725)), with the bypass behavior exposed through Router configuration ([#11723](https://github.com/ai-dynamo/dynamo/pull/11723)). +- **Planner Minimum Endpoint Floors:** Added runtime-configurable `prefill_min_endpoint`, `decode_min_endpoint`, and `min_endpoint` settings with a loopback-only `GET/PATCH /v1/min-endpoints` API, enforced across scaling and budgets, and fixed SLA-driven scaling that left deployments below the configured minimum during a metrics outage ([#13038](https://github.com/ai-dynamo/dynamo/pull/13038), [#14575](https://github.com/ai-dynamo/dynamo/pull/14575)). +- **Power-Aware Planner Scaling:** Added Kubernetes-only power-aware scaling where per-GPU caps set through `dynamo.nvidia.com/gpu-power-limit` annotations are enforced by the Power Agent, and the Planner clamps scaling proposals against `total_gpu_power_limit` without needing Pod write access ([#12012](https://github.com/ai-dynamo/dynamo/pull/12012)). + +#### KV Event Ingestion & Tiering + +- **Capacity-Bounded Approximate LRU:** Added an experimental, opt-in capacity-bounded LRU eviction policy for Dynamo Router's local approximate primary indexer, configurable through the CLI, environment variables, and the Python and Rust APIs. Each request lease is released on completion, abort, cancellation, or failure ([#13701](https://github.com/ai-dynamo/dynamo/pull/13701)). +- **Multimodal KV Event Normalization:** Normalized vLLM image and video object hashes to frontend-compatible pad values on the worker side, including mixed boundary blocks. Propagated an optional `video_token_id` through the KV-event publisher paths, falling back to native vLLM behavior when mapping is ambiguous ([#13910](https://github.com/ai-dynamo/dynamo/pull/13910)). +- **Parallelized Brokered ZMQ Ingress:** Reworked the KV Router broker subscriber to poll broker SUB sockets and dispatch batches to bounded per-publisher lanes instead of a lossy shared broadcast channel. A slow publisher no longer blocks the shared reader ([#14167](https://github.com/ai-dynamo/dynamo/pull/14167)). + +#### Multi-DC Relay & Remote KV Hints + +- **KV DC Relay Contract Alignment:** Indexed canonical Dynamo sequence hashes in the DC exact-state cuckoo filter instead of engine-specific hashes, and aligned the `VllmResidencyV1` raw-event contract on ownership. Added a transport-neutral `RelayPublicationSource` interface decoupling publication drivers from gRPC and protobuf ([#13471](https://github.com/ai-dynamo/dynamo/pull/13471), [#13510](https://github.com/ai-dynamo/dynamo/pull/13510), [#14041](https://github.com/ai-dynamo/dynamo/pull/14041)). +- **Relay Serving Topology Derivation:** Added per-namespace model readiness, pool query semantics, and per-worker load observations to the KV DC Relay, derived from deployment cards and the `ActiveLoad` stream. All facts are consumable in-process through watch and snapshot handles on `KvDcRelay` ([#13539](https://github.com/ai-dynamo/dynamo/pull/13539)). + +#### Router Configuration & State + +- **Worker-Advertised Router Configuration:** Exposed router flags on workers so a worker set declares its own routing strategy in its model deployment card, reachable from SGLang, TensorRT-LLM, and vLLM. Applied it to the prefill hop, which previously inherited the decode set's mode ([#13192](https://github.com/ai-dynamo/dynamo/pull/13192), [#13197](https://github.com/ai-dynamo/dynamo/pull/13197)). +- **Hard and Soft Session Affinity:** Added a `--router-session-affinity-mode hard|soft` flag and `DYN_ROUTER_SESSION_AFFINITY_MODE` variable, with `hard` as the default. In soft mode the stored session target passes through selection as an affinity target custom policies can override ([#13907](https://github.com/ai-dynamo/dynamo/pull/13907)). + +#### Planner & Profiler + +- **Profiler DGD v1beta1 Migration:** Moved profiler-generated DynamoGraphDeployment resources to the native `nvidia.com/v1beta1` `spec.components` and `podTemplate` schema, with packaged v1beta1 blueprints for SGLang, TensorRT-LLM, vLLM, and Mocker so profiler behavior no longer depends on public example manifests. Explicitly versioned v1alpha1 DGD overrides remain supported while generated deployments emit v1beta1 ([#12506](https://github.com/ai-dynamo/dynamo/pull/12506)). + +### Kubernetes Deployment + +- **llm-d Batch Gateway Integration:** Added an experimental llm-d Batch Gateway example for offline inference covering the OpenAI Batch API file and job lifecycle. Gated asynchronous dispatch on frontend model readiness, failing closed with a zero budget when the metric is absent ([#12784](https://github.com/ai-dynamo/dynamo/pull/12784), [#13978](https://github.com/ai-dynamo/dynamo/pull/13978)). +- **Runtime Version Override Field:** Added `runtimeVersionOverride` to DGD, DCD, and DGDR specs as an explicit runtime-compatibility declaration when an image tag lacks one. Included the resolved version in the v2 worker hash so an override matches its equivalent image tag ([#10494](https://github.com/ai-dynamo/dynamo/pull/10494), [#12633](https://github.com/ai-dynamo/dynamo/pull/12633)). +- **Runtime Feature Gates:** Added per-feature runtime gates in the Operator whose rendered defaults depend only on the resolved Dynamo runtime compatibility version, including a `CanaryHealthChecks` gate introduced by Dynamo runtime v1.4.0 and normalized runtime-version comparison. Rendering stays stable across operator-only upgrades, and explicit user configuration remains authoritative ([#12421](https://github.com/ai-dynamo/dynamo/pull/12421)). +- **Standalone Snapshot CRD Migration:** Migrated checkpoint capture and restore to standalone Snapshot resources, replacing DGD-managed DynamoCheckpoint, moved the capture target to a first-class `PodReference.Containers` field, and switched restore-compatibility identity to a SHA-256 fingerprint ([#14076](https://github.com/ai-dynamo/dynamo/pull/14076), [#12068](https://github.com/ai-dynamo/dynamo/pull/12068), [#14724](https://github.com/ai-dynamo/dynamo/pull/14724), [#13448](https://github.com/ai-dynamo/dynamo/pull/13448), [#13452](https://github.com/ai-dynamo/dynamo/pull/13452)). +- **GMS V1 Checkpoint Lifecycle:** Added an experimental, isolated GPU memory service V1 process-restore lifecycle preserving weight backing across suspend and resume, selected with `--use-v1`. Added exact-ID weight save and load plus a shared checkpoint lifecycle across weights and KV-cache servers ([#12011](https://github.com/ai-dynamo/dynamo/pull/12011), [#12392](https://github.com/ai-dynamo/dynamo/pull/12392), [#12989](https://github.com/ai-dynamo/dynamo/pull/12989), [#14797](https://github.com/ai-dynamo/dynamo/pull/14797)). +- **GMS V1 Engine Integration:** Added an opt-in SGLang plugin routing weight and KV-cache allocation through the shared GMS V1 Torch MemPool client, reused for vLLM sleep mode. Fixed SGLang memory saver so GMS workers no longer exit at startup on SGLang v0.5.18 ([#13218](https://github.com/ai-dynamo/dynamo/pull/13218), [#14360](https://github.com/ai-dynamo/dynamo/pull/14360)). +- **LMCache Aggregated Serving Example:** Added a `DynamoGraphDeployment` example and integration guide for running aggregated vLLM serving with LMCache MP as the KV cache backend, sharing tensors with the worker over cross-Pod CUDA IPC ([#10185](https://github.com/ai-dynamo/dynamo/pull/10185)). + +#### Inference Gateway (EPP) + +- **Reusable EPP Bootstrap Runner:** Moved the Rust endpoint picker (EPP) process bootstrap into the `dynamo-ext-proc` library as reusable `run()` and `run_with_selection_service()` functions. Custom linked selection policies can now supply a prebuilt `SelectionService` without duplicating Dynamo's TLS, health, metrics, discovery, readiness, and server setup ([#12720](https://github.com/ai-dynamo/dynamo/pull/12720)). +- **EPP Graceful Shutdown Handling:** Added graceful shutdown coordination to the inference gateway ext-proc server. It marks its gRPC health service `NOT_SERVING` on SIGTERM or SIGINT and waits a configurable propagation window before stopping new connections, keeping requests off terminating replicas ([#13537](https://github.com/ai-dynamo/dynamo/pull/13537)). + +#### Operator & CRDs + +- **v1beta1 CRD Storage Migration:** Promoted DCD, DGD, DGDR, and DGDR-scaling-adapter storage to v1beta1 while still serving v1alpha1, then fixed conversion fidelity for the metadata envelope, empty container fields, and preserved service annotations ahead of spec defaults ([#11904](https://github.com/ai-dynamo/dynamo/pull/11904), [#12432](https://github.com/ai-dynamo/dynamo/pull/12432), [#14338](https://github.com/ai-dynamo/dynamo/pull/14338), [#14855](https://github.com/ai-dynamo/dynamo/pull/14855)). +- **Durable DGD Workload Provider Selection:** Made workload-provider selection durable by materializing `nvidia.com/workload-provider` before reconciliation and treating it as authoritative, and added provider-native `providerOverride` fields at the DGD, component, and multinode levels, covering Grove topology configuration ([#12942](https://github.com/ai-dynamo/dynamo/pull/12942), [#13273](https://github.com/ai-dynamo/dynamo/pull/13273)). +- **Explicit Multinode Component Roles:** Added a typed `roles` list to DGD and DCD components so multinode leader and worker roles can be declared explicitly and provider overrides attach to the role they configure. Existing implicit multinode manifests remain valid ([#14419](https://github.com/ai-dynamo/dynamo/pull/14419)). +- **Performance Optimization Skill Pack:** Added repository-native agent skills, roles, guides, and rules so an AI coding agent captures a baseline and workload contract. It deploys and smoke-tests it, benchmarks with AIPerf, and proposes one evidence-backed change at a time ([#13557](https://github.com/ai-dynamo/dynamo/pull/13557), [#13625](https://github.com/ai-dynamo/dynamo/pull/13625)). + +#### DGDR & Profiling Jobs + +- **DGDR Profiling Job Overrides:** Extended `applyProfilingJobOverrides` to merge profiling job container overrides by name, so the `output-copier` sidecar image can be configured without new CRD fields. Fixed a conversion binding bug and added a `kubectl` check to prevent stuck profiling jobs ([#11392](https://github.com/ai-dynamo/dynamo/pull/11392), [#13153](https://github.com/ai-dynamo/dynamo/pull/13153), [#14589](https://github.com/ai-dynamo/dynamo/pull/14589)). +- **DGDR KV Routing Support:** Exposed `features.kvRouter.enabled` in the v1beta1 DGDR API, which sets `DYN_ROUTER_MODE=kv` on the generated frontend container so users can request KV-cache-aware routing without a low-level DGD override, preserved across v1alpha1 conversion ([#13079](https://github.com/ai-dynamo/dynamo/pull/13079)). +- **Append Args in DGDR Overrides:** Added a `$patch: args: append` directive to `v1beta1` DynamoGraphDeploymentRequest (DGDR) overrides, so container arguments can be added to a profiler-generated blueprint without restating the generated defaults ([#13091](https://github.com/ai-dynamo/dynamo/pull/13091)). + +#### Elastic Expert Parallelism + +- **Elastic EP Leader Wiring:** Started a Ray head on single-pod elastic EP components in Dynamo Operator, so `--enable-elastic-ep` no longer requires the component to be declared multinode. Added a headless leader Service for follower pods to join ([#12943](https://github.com/ai-dynamo/dynamo/pull/12943), [#13178](https://github.com/ai-dynamo/dynamo/pull/13178)). + +#### Dynamo Snapshot + +- **Shared CUDA CustomStorage Snapshot Layer:** Added a CUDA CustomStorage operation wrapper shared by checkpoint and restore, bounded helper cancellation through process-group isolation, and persisted and staged the CUDA launch-job file through the source container's resolved root filesystem ([#12488](https://github.com/ai-dynamo/dynamo/pull/12488), [#12936](https://github.com/ai-dynamo/dynamo/pull/12936), [#12961](https://github.com/ai-dynamo/dynamo/pull/12961), [#13252](https://github.com/ai-dynamo/dynamo/pull/13252)). +- **Namespace Bind-Mount Restore Helper:** Added a C helper and Go mount package for cross-namespace bind mounting, working around Go's inability to call `setns(CLONE_NEWNS)` from a multithreaded runtime. Replaced static path config with on-demand binary injection into the restore container ([#12542](https://github.com/ai-dynamo/dynamo/pull/12542), [#12626](https://github.com/ai-dynamo/dynamo/pull/12626)). +- **Snapshot Shadow Engine Promotion:** Added a promotion step to the snapshot restore path so restored shadow engines stay paused until a single winner is elected. The winner resumes and registers with the frontend, preventing several engines from claiming the same GPU ([#12869](https://github.com/ai-dynamo/dynamo/pull/12869)). + +#### GPU Memory Service + +- **GMS Snapshot Pod Replacement:** Added an Operator controller that replaces an owned Snapshot restore-target Pod after its native `gms-server` sidecar restarts, using UID checks to avoid deleting the wrong Pod. Excluded restore targets from the Grove InterPod failover cascade ([#11286](https://github.com/ai-dynamo/dynamo/pull/11286)). +- **GMS V1 Allocation Internals:** Reworked GMS V1 `create_mapping` to carve first-fit regions from large client slabs instead of one allocation per Torch segment, and added allocation backpressure. Renamed V1 sockets by device ordinal for stability and supervised one process per device ([#13516](https://github.com/ai-dynamo/dynamo/pull/13516), [#13262](https://github.com/ai-dynamo/dynamo/pull/13262), [#13156](https://github.com/ai-dynamo/dynamo/pull/13156), [#13301](https://github.com/ai-dynamo/dynamo/pull/13301)). +- **GMS KV Layout Commit:** Added `commit_layout()` to the GPU Memory Service, freezing an allocation's shape while the writer keeps writing, so a standby engine can adopt the same physical KV cache pages instead of allocating an empty pool. Disabled by default behind `DYN_GMS_PERSIST_KV` ([#12648](https://github.com/ai-dynamo/dynamo/pull/12648)). + +#### Security & Transport + +- **Operator TLS Auto-Injection:** Added 10 TLS certificate path fields to Dynamo Operator's `InfrastructureConfiguration`, so TLS and mTLS can be configured once. They auto-inject as NATS and TCP TLS environment variables into every DGD pod, and Dynamo Operator validates the dependency chain at startup ([#13689](https://github.com/ai-dynamo/dynamo/pull/13689)). + +#### Health & Rollouts + +- **Configurable Monitor Labels and Paths:** Added `dynamo.metrics.podMonitors.labels`, a configurable operator metrics ServiceMonitor label, and `dynamo.metrics.podMonitors.frontendPath` for the frontend PodMonitor and worker `http` endpoint, plus Helm unit tests covering the defaults and overrides ([#14083](https://github.com/ai-dynamo/dynamo/pull/14083), [#12716](https://github.com/ai-dynamo/dynamo/pull/12716), [#13014](https://github.com/ai-dynamo/dynamo/pull/13014)). +- **Forced Grove Scaling Group:** Added an opt-in `experimental.grove.forceScalingGroup` boolean in v1beta1 that renders a single-node component as a Grove `PodCliqueScalingGroup` instead of a standalone `PodClique`, so each replica becomes independently gang-scheduled and scales as a group ([#11772](https://github.com/ai-dynamo/dynamo/pull/11772), [#14341](https://github.com/ai-dynamo/dynamo/pull/14341)). + +### Multimodal & Diffusion + +- **Colocated EPD Layout and Benchmarks:** Added a reproducible multimodal benchmark sweep comparing one-GPU Aggregated and colocated EPD serving for vLLM and SGLang, and corrected the vLLM `disagg_multimodal_e_pd.sh` GPU layout so it no longer requires a third GPU ([#13466](https://github.com/ai-dynamo/dynamo/pull/13466), [#13111](https://github.com/ai-dynamo/dynamo/pull/13111)). +- **Frontend Image Decoding for EPD:** Added opt-in frontend image decoding for multimodal encode-prefill-decode deployments on SGLang and vLLM. Dynamo Frontend decodes images once and hands RGB pixels plus a content hash to the encode worker over a single NIXL transfer, so pixels never relay through the prefill worker ([#11880](https://github.com/ai-dynamo/dynamo/pull/11880), [#12004](https://github.com/ai-dynamo/dynamo/pull/12004)). Backend decoding stays the default; frontend-decoded video is not yet supported. +- **Multimodal Sidecar Input Support:** Added conversion of Dynamo multimodal inputs into vLLM `MediaItem` messages, mapping `mm_hashes` to reuse vLLM KV-event keys. Extended the path to forward image, video, and audio URLs as vLLM media modalities to both prefill and decode ([#12214](https://github.com/ai-dynamo/dynamo/pull/12214), [#13717](https://github.com/ai-dynamo/dynamo/pull/13717)). +- **vLLM Custom Encoder Adapter:** Added a model-aware Qwen3-VL custom encoder adapter preserving pre-merge grids and DeepStack features, with a Qwen3.5 native external-multimodal example. Replaced `finish_reason` as an error channel so custom-encoder failures reach callers as a typed HTTP error ([#11850](https://github.com/ai-dynamo/dynamo/pull/11850), [#13658](https://github.com/ai-dynamo/dynamo/pull/13658), [#13128](https://github.com/ai-dynamo/dynamo/pull/13128)). +- **vLLM-Omni Realtime Audio Streaming:** Added realtime session support so streaming ASR models are served through the OpenAI-compatible `/v1/realtime` WebSocket API. Added incremental audio delivery for `POST /v1/audio/speech` on vLLM-Omni TTS workers, streaming PCM chunks after one open-ended WAV header ([#11830](https://github.com/ai-dynamo/dynamo/pull/11830), [#12100](https://github.com/ai-dynamo/dynamo/pull/12100)). +- **Dynamic LoRA for Omni:** Added dynamic LoRA lifecycle support to aggregated vLLM Omni workers, including load, unload, and list endpoints, request-time adapter resolution for image and video generation, and registration of loaded adapters as distinct frontend-visible models ([#11551](https://github.com/ai-dynamo/dynamo/pull/11551)). + +#### Frontend Media Decoding + +- **Frontend Media Decoding Upgrades:** Added a default-on libjpeg-turbo JPEG decoder (when libturbojpeg is present) and an optimized video-rs FFmpeg path decoding frames in native pixel format. Reworked `media_io_kwargs` to carry raw JSON for worker-side decoding and kept unknown request fields as an `extra_body` passthrough ([#11157](https://github.com/ai-dynamo/dynamo/pull/11157), [#11364](https://github.com/ai-dynamo/dynamo/pull/11364), [#13826](https://github.com/ai-dynamo/dynamo/pull/13826), [#13817](https://github.com/ai-dynamo/dynamo/pull/13817)). + +#### Multimodal Routing & Sidecar Inputs + +- **Multimodal KV Routing Coverage:** Added Kimi K3 support to multimodal KV routing, matching routing-side image expansion to the backend prompt shape while retaining existing Kimi behavior. Disabled exact routing when K3 control tokens cannot resolve, and added Qwen video-aware routing ([#13371](https://github.com/ai-dynamo/dynamo/pull/13371), [#14239](https://github.com/ai-dynamo/dynamo/pull/14239)). + +#### General + +- **FastVideo Typed API Migration:** Updated the FastVideo diffusers example worker to FastVideo's typed `fastvideo.api` interface, replacing the legacy `generate_video()` call with structured config objects and CLI flags. Added max video dimension validation and cancellation cleanup for staged MP4 files ([#9591](https://github.com/ai-dynamo/dynamo/pull/9591)). +- **Per-Request Encode Buffer Reuse:** Reused a single 8 KiB encode buffer across all frames of a push-egress request and read the request-plane codec setting once per request instead of per frame. This cut the encode step for a single-token frame from 312 ns to 232 ns ([#13983](https://github.com/ai-dynamo/dynamo/pull/13983)). + +### Engines + +- **Heterogeneous XPU CPU Disaggregation:** Added example launch scripts for disaggregated vLLM serving that run prefill on XPU workers and decode on CPU workers, including a router variant with GPU-direct KV transfer. Users can now reproduce heterogeneous prefill-decode deployments ([#7977](https://github.com/ai-dynamo/dynamo/pull/7977)). +- **Neuron NIXL Connector Registration:** Registered `NeuronNixlConnector` from vllm-neuron in the vLLM KV connector protocol registry, so disaggregated prefill/decode serving on AWS Trainium over NIXL routes through Dynamo without additional code changes ([#13771](https://github.com/ai-dynamo/dynamo/pull/13771)). +- **Elastic Expert-Parallelism Scale-Up:** Added runtime elastic Expert-Parallelism scale-up control to the SGLang worker, exposing `/engine/control/scale_elastic_ep` and `/engine/control/is_scaling_elastic_ep` routes that integrate a joining group's GPUs while the primary keeps serving, requiring SGLang v0.5.16 or newer ([#12575](https://github.com/ai-dynamo/dynamo/pull/12575)). +- **Conversation Affinity Rank Owner:** Added the `--conversation-affinity-dp-rank-source {engine,dynamo}` flag and matching environment variable for the TensorRT-LLM backend, so Dynamo can own the initial attention data-parallel placement of a conversation while TensorRT-LLM preserves the resulting affinity ([#12225](https://github.com/ai-dynamo/dynamo/pull/12225)). + +#### vLLM + +- **FPM Self-Benchmark Fidelity:** Seeded decode self-benchmark points from KV produced by real prefill chains and salted every prompt with a unique `cache_salt`, closing the gap between benchmarked and production decode latency on MoE models and providing the scheduler interface the AISimulate v0.12.0 collector requires ([#14029](https://github.com/ai-dynamo/dynamo/pull/14029)). +- **vLLM Self-Benchmark Capacity Sync:** Synchronized self-benchmark capacity envelopes across attention-DP ranks so all ranks generate identical grids instead of deadlocking. Added variable-length prefill batch sampling behind an off-by-default flag and rejected `--benchmark-mode` with data-parallel size above one for dense models ([#12021](https://github.com/ai-dynamo/dynamo/pull/12021), [#12627](https://github.com/ai-dynamo/dynamo/pull/12627), [#14292](https://github.com/ai-dynamo/dynamo/pull/14292)). +- **vLLM Embedding Worker Pool:** Added a multi-process Dynamo endpoint pool sharing one `EngineCore` per GPU and aligned embedding tokenization with vLLM pooling defaults. Fixed the pool dying at startup with multiple embedding-worker processes and preserved prompt embedding failures as typed errors ([#12157](https://github.com/ai-dynamo/dynamo/pull/12157), [#14449](https://github.com/ai-dynamo/dynamo/pull/14449), [#13381](https://github.com/ai-dynamo/dynamo/pull/13381)). +- **Elastic EP Capacity Reporting:** Added a read-only `control/ep_capacity` endpoint reporting how a vLLM worker is parallelized and how many GPUs are idle. Derived the elastic EP scale floor from tensor parallel size instead of a hardcoded minimum of two data-parallel ranks ([#13179](https://github.com/ai-dynamo/dynamo/pull/13179), [#12937](https://github.com/ai-dynamo/dynamo/pull/12937)). + +#### TensorRT-LLM + +- **Response Streaming Path Performance:** Inverted the TensorRT-LLM decode worker egress path so the Python handler pushes responses into a Rust `ResponseSender` backed by a bounded tokio channel, keeping tokio threads off Python. Stripped `num_postprocess_workers` from merged engine args before initialization ([#12845](https://github.com/ai-dynamo/dynamo/pull/12845), [#12592](https://github.com/ai-dynamo/dynamo/pull/12592)). +- **TensorRT-LLM Engine Metrics Accuracy:** Reported the exact per-request `cached_tokens` value from the engine result instead of reconstructing it from block-level metrics, always emitted `prompt_tokens_details`, and gated `SamplingParams.return_perf_metrics` on `--publish-kv-events` instead of hardcoding it ([#13567](https://github.com/ai-dynamo/dynamo/pull/13567), [#13922](https://github.com/ai-dynamo/dynamo/pull/13922)). +- **TensorRT-LLM Prefill Completion Publishing:** Added worker-side first-token completion publication in TensorRT-LLM using the shared endpoint-scoped source, binding the source per request and notifying once on the first substantive token output. When the source is unavailable, the existing Router response fallback is preserved ([#13672](https://github.com/ai-dynamo/dynamo/pull/13672)). + +### Experimental + +Dynamo Sidecar, the Triton backend, and the SGLang RL rollout contract are experimental in v1.5.0. Their interfaces, defaults, and image layout may change without a deprecation cycle. Dynamo Sidecar runs beside a stock inference engine over its native gRPC API and does not yet match every feature of the in-process backends. + +- **SGLang Sidecar KV-Routing Examples:** Added experimental aggregated and disaggregated SGLang sidecar deployment examples with exact KV-aware routing, pinning SGLang v0.5.18 as the first version whose gRPC `GetServerInfo` reports the structured KV-event descriptor the sidecar requires ([#14127](https://github.com/ai-dynamo/dynamo/pull/14127)). Inference through this path returns 500 on the bundled SGLang (see Known Issues). +- **vLLM Python Sidecar Launchers:** Added a wheel-installed `dynamo.vllm.sidecar` Python launcher forwarding CLI arguments through the PyO3 backend, plus launch examples and removal of unused OTEL labels. Fixed vLLM-Omni plugin auto-loading that broke every sidecar inference request ([#13923](https://github.com/ai-dynamo/dynamo/pull/13923), [#13735](https://github.com/ai-dynamo/dynamo/pull/13735), [#13864](https://github.com/ai-dynamo/dynamo/pull/13864), [#14731](https://github.com/ai-dynamo/dynamo/pull/14731)). +- **Engine-Native SGLang Generate Endpoint:** Added an opt-in SGLang-native `POST`/`PUT /generate` endpoint for streaming token-in/token-out inference, replaced the `call_tokenizer_manager` passthrough with allowlisted `/engine/*` routes, and advertised native generate capability when `GetServerInfo` reports the co-located HTTP port ([#11640](https://github.com/ai-dynamo/dynamo/pull/11640), [#12246](https://github.com/ai-dynamo/dynamo/pull/12246), [#13659](https://github.com/ai-dynamo/dynamo/pull/13659)). +- **TensorRT-LLM Python Sidecar Launcher:** Added a wheel-installed `dynamo.trtllm.sidecar` Python launcher forwarding CLI arguments through the PyO3 backend. Installed the `smg-grpc-proto` package before starting the gRPC engine in both the launch script and container, since gRPC is the sidecar's only transport ([#13924](https://github.com/ai-dynamo/dynamo/pull/13924), [#14286](https://github.com/ai-dynamo/dynamo/pull/14286)). +- **Dynamo Triton Runtime Backend:** Added a `dynamo.triton` backend that serves NVIDIA Triton models through Dynamo, launched with `python -m dynamo.triton`, with model discovery, configurable server settings, health checks, logging, metrics, and an example identity model ([#13774](https://github.com/ai-dynamo/dynamo/pull/13774)). The backend is experimental and ships as source with its own container recipe. Render it with `container/render.py --framework=triton --target=runtime` and build on an `nvcr.io/nvidia/tritonserver` release image, selected with `RUNTIME_IMAGE_TAG`. No prebuilt Triton runtime image is published for v1.5.0. +- **SGLang RL Rollout Contract:** Added an experimental, opt-in reinforcement learning (RL) rollout contract for SGLang workers: `nvext.detailed_finish_reason` reports Dynamo's canonical finish reason such as `cancelled` on a pause abort, `nvext.extra_fields` carries `prompt_token_ids` and sampled logprobs, a `--publish-sglang-generate` flag advertises the native `/generate` endpoint, the engine's native pause and memory controls are exposed under `/engine/*` and drive Dynamo discovery, and worker `output_ids` keep matched stop tokens so training sees exactly what the engine sampled. A Slime example runs two SGLang engines with the in-container sidecar through this contract. Everything in this set is experimental in v1.5.0 and tested only on the example paths ([#13640](https://github.com/ai-dynamo/dynamo/pull/13640), [#14525](https://github.com/ai-dynamo/dynamo/pull/14525), [#13951](https://github.com/ai-dynamo/dynamo/pull/13951), [#14317](https://github.com/ai-dynamo/dynamo/pull/14317), [#12562](https://github.com/ai-dynamo/dynamo/pull/12562), [#12856](https://github.com/ai-dynamo/dynamo/pull/12856)). +- **Split gRPC Control Discovery:** Moved the vLLM sidecar and mocker to vLLM's split native `Inference` and `Control` gRPC services, discovering model identity, capacity, parallelism, KV-event sources, and readiness through `Control`. Removed the required model-path configuration while preserving existing launch, deployment, and documentation surfaces ([#12734](https://github.com/ai-dynamo/dynamo/pull/12734)). +- **Deterministic vLLM DP Routing:** Added forwarding of Dynamo's selected data-parallel rank as per-request `x-data-parallel-rank` gRPC metadata in the vLLM sidecar. Required a unique ZMQ KV-event source per rank when KV routing is enabled, and preserved cache-salt propagation for consistent block hashes ([#12735](https://github.com/ai-dynamo/dynamo/pull/12735)). +- **SGLang Sidecar KV Routing:** Added event-driven KV routing for the native SGLang sidecar by consuming the KV-event publisher descriptor from `GetServerInfo.json_info`. Validated publisher type and topology before worker registration, and preserved native Clap exit behavior for the wheel-installed sidecar launcher ([#13579](https://github.com/ai-dynamo/dynamo/pull/13579), [#13929](https://github.com/ai-dynamo/dynamo/pull/13929)). + +### Reinforcement Learning + +- **vLLM RL Control Plane:** Routed Dynamo vLLM sidecar reinforcement-learning controls and model updates through vLLM's native `vllm.Control` gRPC API, and added capability-gated pause and resume, sleep and wake, and weight-transfer routes. Published RL worker metadata with world size computed from parallelism dimensions ([#13066](https://github.com/ai-dynamo/dynamo/pull/13066), [#13261](https://github.com/ai-dynamo/dynamo/pull/13261), [#13607](https://github.com/ai-dynamo/dynamo/pull/13607), [#14840](https://github.com/ai-dynamo/dynamo/pull/14840)). +- **RL Route Discovery Endpoint:** Added an opt-in RL request-plane endpoint behind `--enable-rl` or `DYN_ENABLE_RL`. It reports a worker's engine-route names and system-server URL for the SGLang, TensorRT-LLM, and vLLM sidecars plus the Rust mocker, and ships as a versioned discovery response ([#13260](https://github.com/ai-dynamo/dynamo/pull/13260), [#13606](https://github.com/ai-dynamo/dynamo/pull/13606)). + +### Fault Tolerance & Observability + +- **Request-Trace S3 Sink Durability:** Added a native S3 `RequestTraceSink` that batches request-trace records as gzipped JSONL behind an opt-in cargo feature. Hardened shutdown to await the final flush and drain outstanding records, and corrected a shutdown drop summary that previously undercounted ([#11806](https://github.com/ai-dynamo/dynamo/pull/11806), [#13298](https://github.com/ai-dynamo/dynamo/pull/13298), [#14642](https://github.com/ai-dynamo/dynamo/pull/14642)). +- **Model and Worker Readiness Signals:** Added the frontend-authoritative `dynamo_frontend_model_ready{model}` Prometheus metric reporting whether Dynamo Frontend can route requests through a complete serving topology. Fixed Rust backends that left the health route reporting `NotReady` after the worker began serving traffic ([#13976](https://github.com/ai-dynamo/dynamo/pull/13976), [#14458](https://github.com/ai-dynamo/dynamo/pull/14458)). + +#### Request Migration & Tracing + +- **Request Migration Reliability Hardening:** Added a `WorkerOverloaded` error class and classified TCP connection failures so migration retries another worker. Hardened retry bookkeeping against overflow, exposed migration recovery latency via a histogram, and added a span recording migration reasons per worker attempt ([#11647](https://github.com/ai-dynamo/dynamo/pull/11647), [#12927](https://github.com/ai-dynamo/dynamo/pull/12927), [#13600](https://github.com/ai-dynamo/dynamo/pull/13600), [#12930](https://github.com/ai-dynamo/dynamo/pull/12930), [#11133](https://github.com/ai-dynamo/dynamo/pull/11133)). +- **OTLP Export Configuration Hardening:** Decoupled the stderr console log format from OpenTelemetry export by adding `DYN_LOGGING_CONSOLE_FORMAT`, keeping the legacy `DYN_LOGGING_JSONL` setting as a fallback. Fixed a panic when `logging::init()` ran from a synchronous entrypoint with OTEL export enabled ([#12424](https://github.com/ai-dynamo/dynamo/pull/12424), [#11143](https://github.com/ai-dynamo/dynamo/pull/11143)). + +#### Metrics & Readiness + +- **ThunderAgent Router Observability:** Added ThunderAgent Router observability through INFO and DEBUG logs for program lifecycle and route decisions, plus new status and metrics runtime endpoints. Added opt-in route proof so operators can confirm traffic passed through ThunderAgent and inspect live program and worker state ([#12196](https://github.com/ai-dynamo/dynamo/pull/12196)). +- **Model Alias Metric Labeling:** Resolved aliased model names to the primary served model name in frontend metrics, so `dynamo_frontend_model_ready` emits a single readiness series per deployment. Logged each alias claim as it registers to show which worker roles claimed which name ([#14364](https://github.com/ai-dynamo/dynamo/pull/14364), [#14365](https://github.com/ai-dynamo/dynamo/pull/14365)). +- **Generate Route Frontend Metrics:** Added frontend metrics for the token-native `/inference/v1/generate` route, observing raw engine deltas and split-router metadata, and starting request, queue, and latency lifecycles before frontend processing. Canonicalized model aliases before engine selection so metric labels stay bounded and consistent ([#11385](https://github.com/ai-dynamo/dynamo/pull/11385)). +- **EPP Cached Token Metrics:** Added parsing of OpenAI-style usage fields including `usage.prompt_tokens_details.cached_tokens` in the inference gateway endpoint picker, exported as `dynamo_epp_cached_tokens` Prometheus metrics, and validated that Envoy sets `response_body_mode` to `FULL_DUPLEX_STREAMED` ([#11868](https://github.com/ai-dynamo/dynamo/pull/11868)). +- **Embedding Cache Metrics:** Added Prometheus metrics to the vLLM multimodal embedding cache connector, emitting the `dynamo_component_embedding_cache_{hits,misses,evictions}_total`, `_utilization`, `_current_bytes`, and `_entries` series. Cache hit rate, occupancy, and eviction pressure are now visible in production dashboards under one metric family whichever cache implementation serves the model ([#11969](https://github.com/ai-dynamo/dynamo/pull/11969)). +- **Estimated Reasoning Token Reporting:** Added an estimate of reasoning-token usage in the shared Chat Completions stream, populating `completion_tokens_details.reasoning_tokens` for `/v1/chat/completions` and `/v1/responses` in both streaming and non-streaming modes, with positive backend-provided counts still treated as authoritative ([#12181](https://github.com/ai-dynamo/dynamo/pull/12181)). +- **Engine Request ID Mapping:** Added an INFO log line in the TensorRT-LLM handler that records the Dynamo request UUID alongside the TensorRT-LLM executor client ID and the disaggregated request ID immediately after submit. Engine-internal timing records can now be joined offline to Dynamo request traces ([#13970](https://github.com/ai-dynamo/dynamo/pull/13970)). + +### Performance Modeling & Replay + +- **Unified AISimulate CLI Integration:** Registered the Dynamo runner factory and Router and Planner configuration adapters for `aisimulate predict` and `aisimulate recommend`, removed the legacy `python -m dynamo.replay` CLI, and consolidated dependencies into the published `aisimulate` wheel ([#13665](https://github.com/ai-dynamo/dynamo/pull/13665)). +- **Mooncake Request Trace Converter:** Restored the `request_trace_to_mooncake` binary in `dynamo-bench` behind an opt-in feature, so callers can export Dynamo request traces to reusable Mooncake JSONL files, published through a same-directory temporary file renamed after successful conversion ([#12504](https://github.com/ai-dynamo/dynamo/pull/12504)). + +#### Mocker + +- **Offline Replay Hot-Path Optimization:** Reduced offline-replay coordinator, cache-index, and completion-event overhead through O(1) worker tracking, an ordered evictable-leaf index, and removed decode accept-length rescans, with public APIs, configuration, and KV-event formats left unchanged ([#12341](https://github.com/ai-dynamo/dynamo/pull/12341), [#12772](https://github.com/ai-dynamo/dynamo/pull/12772)). +- **Mocker KV Accounting Rework:** Moved per-request KV ownership into move-only backend leases, and switched vLLM and SGLang decode timing to summed logical KV tokens instead of distinct resident blocks. Published buffered KV events at pass completion instead of pass start ([#12329](https://github.com/ai-dynamo/dynamo/pull/12329), [#12583](https://github.com/ai-dynamo/dynamo/pull/12583), [#12653](https://github.com/ai-dynamo/dynamo/pull/12653)). +- **Typed LiveEngine Handoff Control:** Added a typed `LiveEngine` boundary for the Mocker scheduler with configured KV-event and FPM publishers, request registration, and idempotent graceful shutdown. Aligned live disaggregated prefill with offline replay by using the first replay-plan token ([#12380](https://github.com/ai-dynamo/dynamo/pull/12380), [#13635](https://github.com/ai-dynamo/dynamo/pull/13635)). +- **Mocker Cached-Token Usage Reporting:** Added cached prefix token counts, taken when the request is accepted, to vLLM-mode mocker output as `completion_usage.prompt_tokens_details.cached_tokens`. Multi-worker simulations can compare the Router's radix overlap estimate against tokens the scheduler actually reused ([#12711](https://github.com/ai-dynamo/dynamo/pull/12711)). + +### Infrastructure Modernization + +- **TLS and mTLS Transport Encryption:** Added opt-in TLS encryption to the TCP response and request dispatch planes, and covered the NATS transport with matching environment variables and `tls://` URL support. Layered opt-in mutual TLS with client certificate verification on top ([#10921](https://github.com/ai-dynamo/dynamo/pull/10921), [#12533](https://github.com/ai-dynamo/dynamo/pull/12533), [#13096](https://github.com/ai-dynamo/dynamo/pull/13096), [#13528](https://github.com/ai-dynamo/dynamo/pull/13528)). + +## Recipes + +- **Qwen3.8-2.4T-A95B Recipe Support:** Added the Qwen3.8-2.4T-A95B recipe to the catalog with SGLang and vLLM deployment options for GB200 and GB300, covering chat, agentic, and aggregated configurations ([#13105](https://github.com/ai-dynamo/dynamo/pull/13105)). Corrected the model ID to `Qwen/Qwen3.8-2.4T-A95B-FP8` across recipe manifests, model download commands, and docs to match the validated checkpoint ([#13265](https://github.com/ai-dynamo/dynamo/pull/13265)). +- **Kustomize Recipe Variant Rendering:** Added a Kustomize workflow for provider and fabric recipe variants that keeps fully materialized `deploy-*.yaml` manifests checked in and reviewable. Converted the Qwen3-32B vLLM cloud-provider variants and the Qwen3-235B-A22B-FP8 TensorRT-LLM Blackwell disaggregated variants ([#10989](https://github.com/ai-dynamo/dynamo/pull/10989)). Value-aware Component templates are selected by `source` and an overlay-relative `path`. They render through strict sandboxed Jinja against a resource index from the built base and materialize as normal local Components, so users need neither Python nor Jinja. Replaced the fixed `aws-efa-p8d8`, `aws-efa-p8d16`, and `aws-efa-p16d16` Components with AWS instance-type selections, where P5 adds its instance-affinity patch and P6 uses the family defaults ([#13125](https://github.com/ai-dynamo/dynamo/pull/13125)). +- **Qwen3.5-122B FP8 H200 Recipes:** Added H200 deployment recipes for Qwen/Qwen3.5-122B-A10B-FP8 on vLLM. Coverage spans an aggregated topology (TP2 with MTP, KV-aware routing, two replicas) and a disaggregated 1P2D topology using NIXL KV transfer over InfiniBand, plus model cache and benchmarking manifests ([#12088](https://github.com/ai-dynamo/dynamo/pull/12088)). +- **Nemotron-3.5-Lightning Deployment Recipes:** Added `recipes/nemotron-3.5-lightning` with vLLM aggregated and disaggregated profiles, TensorRT-LLM aggregated profiles, and model-cache manifests. Added performance traces for B200, GB200, H100, and H200 GPUs, plus documentation and catalog entries so the recipe appears in the recipes overview ([#13021](https://github.com/ai-dynamo/dynamo/pull/13021)). +- **Nemotron-3-Ultra Refresh Recipes:** Added 12 Nemotron-3-Ultra Refresh deployment profiles for B200, GB200, and H200 at 256K and 1M context lengths, covering aggregated two-worker and disaggregated topologies, and replaced the legacy Day-0 profiles. The profiles pin the public Dynamo v1.4.0 vLLM runtime image and use KV-aware routing, prefix caching, FP8 KV cache, and hybrid KV cache management ([#13226](https://github.com/ai-dynamo/dynamo/pull/13226)). +- **GLM-5.3-Flash vLLM Recipes:** Added aggregated and disaggregated 1P1D vLLM deployment recipes for GLM-5.3-Flash, a GLA/KDA hybrid attention model, on GB200 NVL72, covering text and image requests, and added the missing Qwen3.8-2.4T-A95B catalog card ([#13899](https://github.com/ai-dynamo/dynamo/pull/13899)). +- **Nemotron-3-Super Dev Image Revert:** Reverted the Nemotron-3-Super vLLM recipes from the generic `vllm-runtime:1.3.0` release image back to the dedicated `vllm-runtime:1.3.0-nemotron-super-dev.1` build, which carries the model-specific vLLM 0.21.0 patches the recipe was qualified against. Marked the recipe as Dev-only in the Model Early Access Builds reference ([#12520](https://github.com/ai-dynamo/dynamo/pull/12520)). +- **DeepSeek-V4 Checkpoint Download Parameterization:** Restored the `MODEL_NAME` environment variable in the shared DeepSeek-V4 Pro and Flash model-download Jobs, defaulting to the public FP8 checkpoint that most variants request, and documented the NVFP4 override for the agentic B200 variants. Because each variant mounts the model-cache PVC read-only with offline Hugging Face settings, a checkpoint the Job did not download was not fetchable at runtime and the worker never started ([#13034](https://github.com/ai-dynamo/dynamo/pull/13034)). +- **Obsolete Router Flag Removal:** Removed the `--router-reset-states` flag from the DeepSeek V4 Flash and Pro vLLM recipes for B200 and H200, and from the load-only routing documentation, so deployments no longer pass an obsolete option ([#13116](https://github.com/ai-dynamo/dynamo/pull/13116)). +- **SGLang GB200 Frontend Args:** Fixed the Qwen3.8-2.4T-A95B-FP8 GB200 SGLang deployment manifests by removing `--model-path` and `--model-name` from the frontend and replacing `--dyn-tool-call-parser` with `--tool-call-parser`, which previously caused the frontend to exit at startup ([#13324](https://github.com/ai-dynamo/dynamo/pull/13324)). +- **Nemotron 3.5 Lightning Recipe Refresh:** Updated the Nemotron 3.5 Lightning recipes to use BF16 weights on B200 and GB200. BF16 measured +80% over NVFP4 with Marlin dense and MoE backends and +12% over NVFP4 with CuTeDSL. Refreshed performance data, corrected the documented context length, added AWS EFA setup instructions, and removed redundant recipes and variants that did not meet the benchmark SLAs ([#13370](https://github.com/ai-dynamo/dynamo/pull/13370)). +- **DeepSeek-V3.2 and Llama-3-70B Recipe Removal:** Removed the `deepseek-v32-fp4` and `llama-3-70b` recipe directories along with their documentation pages, catalog entries, navigation, and dependent feature-benchmark pages for WideEP routing and Llama topology. Refreshed READMEs, codeowners, and remaining references that pointed at the removed paths ([#13663](https://github.com/ai-dynamo/dynamo/pull/13663)). + +## Bug Fixes + +### Frontend & Agents + +#### OpenAI API & Validation + +- **Client Error Status Mapping:** Returned proper HTTP 400 errors, instead of streamed 200s or plain-text failures, for invalid requests, template failures, out-of-range parameters, and unsupported multimodal content across `/v1/chat/completions`, `/v1/responses`, and `/v1/messages` ([#12155](https://github.com/ai-dynamo/dynamo/pull/12155), [#12036](https://github.com/ai-dynamo/dynamo/pull/12036), [#12404](https://github.com/ai-dynamo/dynamo/pull/12404), [#13006](https://github.com/ai-dynamo/dynamo/pull/13006), [#14056](https://github.com/ai-dynamo/dynamo/pull/14056), [#13102](https://github.com/ai-dynamo/dynamo/pull/13102)). +- **Backend Error Status Propagation:** Preserved backend 503 and request-rejection status codes instead of masking them as generic 500s, and fixed non-streaming completions so typed errors like `Backend(InvalidArgument)` keep their original HTTP 400 status and message ([#12412](https://github.com/ai-dynamo/dynamo/pull/12412), [#12966](https://github.com/ai-dynamo/dynamo/pull/12966), [#12706](https://github.com/ai-dynamo/dynamo/pull/12706)). +- **Single Role Emission in Streams:** Fixed chat streams emitting `delta.role` on every chunk instead of only the first, in both the Rust delta generator and the SGLang streaming postprocessor. Preserved the initial role-only chunk when generation finishes with no content ([#12639](https://github.com/ai-dynamo/dynamo/pull/12639), [#12741](https://github.com/ai-dynamo/dynamo/pull/12741)). +- **Explicit Zero Temperature Preservation:** Fixed chat-completions request-template handling so an explicitly supplied `temperature: 0` is preserved instead of being overwritten by the configured template temperature, keeping deterministic greedy requests from becoming sampled requests ([#12640](https://github.com/ai-dynamo/dynamo/pull/12640)). +- **Per-Choice Tool Dispatch Dedup:** Fixed streaming tool dispatch dropping `tool_call_dispatch` events when `n > 1` produced the same tool-call ID across completions, by keying the dedup guard on choice index plus ID. Repeated IDs within one choice still collapse to one event ([#12680](https://github.com/ai-dynamo/dynamo/pull/12680)). +- **Split UTF-8 Character Preservation:** Fixed multi-token UTF-8 characters showing up as replacement characters (U+FFFD) in the SGLang frontend's incremental decoding, by tracking committed decode context separately from pending token IDs and committing only at clean boundaries ([#12688](https://github.com/ai-dynamo/dynamo/pull/12688)). +- **Converted Protocol Request Validation:** Added validation for Responses and Anthropic requests after conversion to the shared Chat format, rejecting empty message lists, out-of-range sampling parameters, and malformed content blocks with 400 before the request reaches the backend ([#12809](https://github.com/ai-dynamo/dynamo/pull/12809)). +- **Runtime Shutdown on Startup Failure:** Fixed the HTTP and gRPC entrypoints to cancel the distributed runtime before propagating a server startup or bind error, for both discovery-backed and in-process engines. A failed bind no longer leaves the runtime running ([#13415](https://github.com/ai-dynamo/dynamo/pull/13415)). +- **Cancelled Request Intake Rollback:** Fixed router state corruption when a request was cancelled while being accepted, which left stale capacity or wait state or overwrote a later request for the same session. Request intake is now serialized per session with guarded rollback ([#13553](https://github.com/ai-dynamo/dynamo/pull/13553)). + +#### Guided Decoding & Tool Calling + +- **Reasoning Parser Lifecycle Fixes:** Fixed reasoning-parser lifecycle bugs that leaked `` text into visible content or dropped it when it should have shown. Covered Nemotron force-nonempty-content requests, `include_reasoning=false` responses, interleaved `n>1` streams, and text-grammar parsers missing their declared sampling params ([#11251](https://github.com/ai-dynamo/dynamo/pull/11251), [#13487](https://github.com/ai-dynamo/dynamo/pull/13487), [#11563](https://github.com/ai-dynamo/dynamo/pull/11563), [#12541](https://github.com/ai-dynamo/dynamo/pull/12541)). +- **Tool Call Guided Decoding Constraints:** Fixed tool-call guided decoding constraints for vLLM and SGLang across named, forced, and zero-argument tool choices, schemas with reference cycles, double-constrained vLLM reasoning, and Kimi K2 calls wrongly constrained as generic JSON ([#12684](https://github.com/ai-dynamo/dynamo/pull/12684), [#12878](https://github.com/ai-dynamo/dynamo/pull/12878), [#12795](https://github.com/ai-dynamo/dynamo/pull/12795), [#13235](https://github.com/ai-dynamo/dynamo/pull/13235), [#13785](https://github.com/ai-dynamo/dynamo/pull/13785), [#12638](https://github.com/ai-dynamo/dynamo/pull/12638)). +- **NvExt Metadata Preservation Fixes:** Fixed NvExt metadata loss across the frontend, EPP, and legacy streaming tool-call guard, the buffer that holds back partial tool-call markup. The loss dropped `cache_salt`, `x-tenant-id`, `nvext`, `engine_data`, token IDs, timing, and routed-expert data from responses. That metadata now survives intact ([#13157](https://github.com/ai-dynamo/dynamo/pull/13157), [#13730](https://github.com/ai-dynamo/dynamo/pull/13730)). +- **Tool Call Argument Normalization:** Fixed tool call arguments arriving as JSON strings instead of objects, which produced empty or garbled tool calls in multi-turn conversations for templates like GLM-5.2. Malformed values are now replaced with an empty object and logged ([#12332](https://github.com/ai-dynamo/dynamo/pull/12332)). +- **Truncated Tool Call Recovery:** Fixed dropped GLM `` XML blocks when `max_tokens` truncates a response. The partial block now returns as raw content in both the streaming and non-streaming chat completion paths, so clients no longer receive an incomplete turn ([#12333](https://github.com/ai-dynamo/dynamo/pull/12333)). +- **Unconsumed Control Marker Stripping:** Fixed unconsumed `<|...|>` control markers leaking into user-visible content when a reasoning or tool parser was active, previously forcing clients to choose between empty `reasoning_content` and visible markers. Stripping now applies uniformly to streaming deltas and plain-text responses alike ([#12510](https://github.com/ai-dynamo/dynamo/pull/12510)). +- **vLLM JSON Tool-Call Fallback:** Fixed forced vLLM tool choices using the JSON-schema fallback so generated JSON returns as proper `tool_calls` instead of assistant content, across required and named choices, streaming, non-streaming, and parallel tool calls ([#12908](https://github.com/ai-dynamo/dynamo/pull/12908)). +- **Request-Scoped Tool Call Parsing:** Fixed false-positive tool-call parsing by checking each request's `tools` and `tool_choice` fields across Chat Completions, Responses, and Anthropic Messages, disabling ordinary parsers when no tools are declared or `tool_choice` is `none` ([#13359](https://github.com/ai-dynamo/dynamo/pull/13359)). +- **Tool-Call Parser Name Validation:** Added validation of `tool_call_parser` values against Dynamo's v1 registry and unified parser families during model registration. Returned an error that names the unsupported parser and lists the available ones instead of failing silently during response aggregation ([#13828](https://github.com/ai-dynamo/dynamo/pull/13828)). + +#### Tokenizers & Model Processing + +- **Serialized Tokenizer Padding Disabled:** Fixed models that ship fixed tokenizer padding, like `nvidia/NVIDIA-Nemotron-Parse-2.0`, expanding short prompts into padded token IDs and failing context-length validation. Cleared serialized Hugging Face padding when loading `tokenizer.json`, matching how Dynamo already clears serialized truncation ([#12656](https://github.com/ai-dynamo/dynamo/pull/12656)). + +#### Logprobs & Usage Reporting + +- **Chat Logprobs Reporting Fixes:** Fixed OpenAI-compatible chat logprobs so SGLang responses return populated `logprobs.content` instead of `null`, preserved explicit `top_logprobs=0`, and fixed chosen-token and zero `top_logprobs` reporting ([#12820](https://github.com/ai-dynamo/dynamo/pull/12820), [#12444](https://github.com/ai-dynamo/dynamo/pull/12444), [#12650](https://github.com/ai-dynamo/dynamo/pull/12650), [#13209](https://github.com/ai-dynamo/dynamo/pull/13209), [#14621](https://github.com/ai-dynamo/dynamo/pull/14621)). +- **vLLM Chat-Processor Path Fixes:** Fixed the vLLM Python chat-processor path, used with `--dyn-chat-processor vllm`, so it reports `completion_tokens_details.reasoning_tokens` instead of omitting it. Worker-side sampling and grammar rejections now surface their original status and message instead of a generic HTTP 500 ([#13947](https://github.com/ai-dynamo/dynamo/pull/13947), [#13980](https://github.com/ai-dynamo/dynamo/pull/13980)). + +#### Anthropic Messages API + +- **Anthropic Messages Response Fidelity:** Brought `/v1/messages` streaming to usage parity with `/v1/chat/completions`, emitting token usage on every chunk including tokens before a client aborts, reporting `cache_creation_input_tokens` as 0 instead of omitting it, with native `toolu_` tool-call IDs ([#12473](https://github.com/ai-dynamo/dynamo/pull/12473), [#12472](https://github.com/ai-dynamo/dynamo/pull/12472), [#12614](https://github.com/ai-dynamo/dynamo/pull/12614)). +- **Typed Tool-Call Guard Error Preservation:** Fixed the v1 streaming tool-call guard collapsing typed backend errors like `Backend(InvalidArgument)` to `Unknown` by chaining terminal errors instead of reconstructing them. Error messages on `/v1/chat/completions`, `/v1/responses`, and `/v1/messages` no longer carry an internal prefix ([#13930](https://github.com/ai-dynamo/dynamo/pull/13930)). + +#### Agents & Request Classification + +- **SGLang Priority Hint Routing:** Fixed the SGLang preprocessing path treating all requests as default-priority traffic by projecting `nvext.agent_hints` into internal routing hints for priority, strict priority, expected output tokens, and latency sensitivity. Priority-aware Router policies now see SGLang requests correctly ([#12628](https://github.com/ai-dynamo/dynamo/pull/12628)). + +#### LoRA + +- **LoRA Adapter Unload Handling:** Fixed unloading one LoRA adapter making `/v1/chat/completions` and `/v1/responses` return 404 for its base model and unrelated models, by deriving endpoint retraction from the live model catalog instead of the removal event alone ([#14216](https://github.com/ai-dynamo/dynamo/pull/14216), [#14548](https://github.com/ai-dynamo/dynamo/pull/14548)). +- **Shared S3 LoRA Credentials:** Fixed S3 LoRA credential resolution to use the AWS SDK default provider chain, including shared profiles. Honored `AWS_ENDPOINT_URL` through the object-store environment builder, so custom S3 endpoints and profile-based authentication now work for LoRA adapter downloads ([#13844](https://github.com/ai-dynamo/dynamo/pull/13844)). + +### Scheduling + +#### Worker Selection Policies + +- **Unknown Worker Target Rejection:** Returned HTTP 400 naming the field and the rejected id when an explicit `nvext` worker target is not in the endpoint's discovery snapshot, across built-in and KV routing, prefill, and route previews ([#14858](https://github.com/ai-dynamo/dynamo/pull/14858)). +- **Full Request Body Forwarding:** Fixed the Endpoint Picker's KV-router scorer forwarding a reconstructed `{role, content}` view instead of the original request body. The reconstruction dropped `tool_calls`, `tool_call_id`, `name`, and `tools`, and caused multi-turn tool-calling requests to fail with 503 "no healthy upstream" ([#11991](https://github.com/ai-dynamo/dynamo/pull/11991)). +- **Post-Prefill Decode Dispatch Fix:** Fixed disaggregated serving leaving decode-bound KV blocks pinned until expiry when the client disconnected after remote prefill staged them, instead of dispatching the decode request anyway. Cancellation now keys off staged KV instead of request phase ([#13855](https://github.com/ai-dynamo/dynamo/pull/13855)). + +#### Router Configuration & State + +- **Local Output Block Accounting:** Fixed the KV Router so one frontend replica's local output-block mutations no longer overwrite shared worker load on the shared load channel with its own state. Prometheus load observation and normal add, prefill, and free lifecycle publishing are unchanged ([#12514](https://github.com/ai-dynamo/dynamo/pull/12514)). +- **Stale Worker Pin Recovery:** Fixed ThunderAgent session handling so a program pinned to a replaced backend worker is reassigned to a live worker when the request is accepted. Previously it returned HTTP 500 until the session ended or Dynamo Router restarted ([#12783](https://github.com/ai-dynamo/dynamo/pull/12783)). +- **WorkerSet Monitor Lifecycle Scoping:** Fixed the frontend KV worker monitor task outliving its `WorkerSet`. Repeated discovery churn, like LoRA load and unload cycles, had accumulated NATS subscriptions, etcd watches, and per-worker state that grew file descriptors and memory ([#13077](https://github.com/ai-dynamo/dynamo/pull/13077)). +- **Bounded Worker Load Publishing:** Fixed Dynamo Router worker-load publishing growing unbounded with request rate by routing snapshots through a single publisher task that keeps only the newest snapshot per worker and data-parallel rank. This bounds pending state by worker count instead. Wire formats are unchanged ([#13435](https://github.com/ai-dynamo/dynamo/pull/13435)). +- **Router Weight Download Skip:** Fixed GlobalRouter model registration to pass `ignore_weights=True` in both disaggregated and aggregated modes, so a routing-only process no longer downloads inference weights and delays model discovery ([#13916](https://github.com/ai-dynamo/dynamo/pull/13916)). +- **Disaggregated Prefill Error Propagation:** Fixed invalid-argument errors from the prefill worker flattening into opaque 500 responses in disaggregated deployments, by folding the worker's error text into the prefill router's message. Bad sampling parameters or invalid schemas now return 400 ([#14063](https://github.com/ai-dynamo/dynamo/pull/14063)). + +#### Planner & Profiler + +- **Actionable Model Path Trust Errors:** Reported the original filesystem cause with ownership guidance, and the option to set `modelCache.pvcModelPath` to the real snapshot path, when a local model path cannot be inspected during DGD materialization, instead of an unhandled error or a silent fallback to a Hugging Face id ([#14860](https://github.com/ai-dynamo/dynamo/pull/14860)). +- **RAPID Profiling Mode Fixes:** Fixed RAPID profiling for mocker-only DGDRs, which ignored declared `spec.workload.isl`/`osl` and mis-sized every worker at `--max-model-len 6500`. Selected AIC or NPZ profile data via `spec.searchStrategy` and passed workload sizes through on the fallback path ([#12573](https://github.com/ai-dynamo/dynamo/pull/12573), [#14205](https://github.com/ai-dynamo/dynamo/pull/14205)). +- **Planner KV Hit Rate Namespace:** Fixed the Planner's `get_avg_kv_hit_rate` querying the wrong namespace on operator-managed deployments, where router metrics carry a suffixed namespace the old filter never matched, sizing as if every request missed the prefix cache. It now falls back correctly ([#13480](https://github.com/ai-dynamo/dynamo/pull/13480)). +- **Worker Prefill Completion Events:** Added `MarkPrefillCompleted` publication from LLM workers on first token or first output chunk. Made Dynamo Router consume these marks even with replica sync disabled, so duplicate and stale events become silent no-ops instead of triggering repeated wakes ([#13655](https://github.com/ai-dynamo/dynamo/pull/13655)). +- **Planner Plotext Version Pin:** Pinned plotext below version 6 in the Planner requirements, since plotext 6 no longer exports the top-level `plot_size` function used by AISimulate (formerly aiconfigurator), which caused every profiler path to fail in image builds ([#13716](https://github.com/ai-dynamo/dynamo/pull/13716)). +- **Profiler DP and Decode Fixes:** Fixed SGLang prefill workers starving attention ranks by clamping `--max-running-requests` to the data-parallel size, and rejected invalid SGLang data-parallel and request-limit values during profiler config generation. Stripped conflicting duplicate vLLM `--disaggregation-mode` arguments too ([#14351](https://github.com/ai-dynamo/dynamo/pull/14351)). +- **THOROUGH Profiling Manifest Compatibility:** Fixed a `KeyError: 'services'` crash that stopped THOROUGH profiling from deploying its first candidate. `DynamoDeploymentClient` now reads component names from either the v1beta1 `spec.components` list or v1alpha1 `spec.services`, and derives the API version from the manifest ([#14591](https://github.com/ai-dynamo/dynamo/pull/14591)). + +#### General + +- **Router Worker Namespace Suffix:** Fixed standalone Router worker-endpoint resolution using the wrong namespace by resolving targets through `get_worker_namespace()`, including `DYN_NAMESPACE_WORKER_SUFFIX` when Dynamo Operator injects it. Dynamo Router still serves its own endpoints from the base `DYN_NAMESPACE`, fixing mismatches in Kubernetes deployments ([#12160](https://github.com/ai-dynamo/dynamo/pull/12160)). +- **KvRouter Initialization GIL Release:** Fixed the Python binding for `KvRouter.__new__` to release the Global Interpreter Lock (GIL) while waiting for `min_initial_workers` to register. Callers can now enforce their own timeouts instead of hanging indefinitely when a worker dies before registering ([#12762](https://github.com/ai-dynamo/dynamo/pull/12762)). + +### Kubernetes Deployment + +#### Inference Gateway (EPP) + +- **Explicit EPP Replica Sync Port:** Added `DYN_EPP_REPLICA_SYNC_PORT`, defaulting to `9092`, so Endpoint Picker replicas bind and dial a fixed peer-to-peer sync port instead of resolving it from Service and EndpointSlice ports. Incomplete EndpointSlices no longer block EPP startup ([#13811](https://github.com/ai-dynamo/dynamo/pull/13811)). + +#### Operator & CRDs + +- **vLLM Multinode DRA GPU Counts:** Fixed per-node GPU count resolution for components using `ResourceClaim`/`ResourceClaimTemplate` objects with no scalar GPU resource, which broke multinode vLLM launch flags and TensorRT-LLM `mpirun` world size under pure Dynamic Resource Allocation ([#12166](https://github.com/ai-dynamo/dynamo/pull/12166)). +- **Grove Worker Namespace Suffixing:** Fixed concurrent Grove worker generations publishing under the same runtime namespace during a rollout, which made discovery reject the new MDC checksum as incompatible. Rendered the worker hash into Grove templates so each generation gets its own namespace ([#12769](https://github.com/ai-dynamo/dynamo/pull/12769)). +- **Immutable Component Type Fields:** Made the v1alpha1 `componentType` and v1beta1 `type` fields immutable once set using CRD CEL transition rules, applied to standalone DynamoComponentDeployments and DynamoGraphDeployment components. Updates that alter an existing component type are now rejected, while legacy objects without a type can still initialize it once ([#13763](https://github.com/ai-dynamo/dynamo/pull/13763)). +- **Worker Hash Projection Gating:** Fixed Dynamo Operator completing rolling updates prematurely and writing unreliable annotations, by gating worker hash writes on informer cache confirmation. Required old DynamoComponentDeployments to drain to zero pods before deletion, and scoped DCD discovery accordingly ([#14249](https://github.com/ai-dynamo/dynamo/pull/14249)). +- **KAI Staleness Duration Validation:** Fixed the platform Helm chart accepting an unset `default-staleness-grace-period` unit that passed validation but failed at KAI Scheduler startup. Required the Go duration value `-1s` when Grove and KAI Scheduler are installed together ([#14722](https://github.com/ai-dynamo/dynamo/pull/14722)). + +#### DGDR & Profiling Jobs + +- **DGDR Model Cache Paths:** Fixed DynamoGraphDeploymentRequest profiling double-prefixing a `pvcModelPath` already under `pvcMountPath`, producing duplicated paths like `/opt/models/opt/models/...` that pointed workloads at nonexistent checkpoints. Relative and legacy leading-slash paths continue to resolve as before ([#12493](https://github.com/ai-dynamo/dynamo/pull/12493)). + +#### Dynamo Snapshot + +- **Snapshot Restore Socket Deconfliction:** Added per-restore remapping of clone-conflicting sockets so one CRIU checkpoint restores repeatedly into sibling engine containers sharing a Pod network namespace, rebinding the CUDA UVM listener and TCP pair. Preserved the `restore-complete` sentinel for the kubelet probe ([#12887](https://github.com/ai-dynamo/dynamo/pull/12887), [#12704](https://github.com/ai-dynamo/dynamo/pull/12704)). +- **vLLM Communicator Checkpoint Hooks:** Wrapped the vLLM snapshot sleep/wake sequence with `checkpoint_prepare()`/`checkpoint_restore()` hooks so FlashInfer and NCCL communicators tear down before a CRIU dump and rebuild after restore. Hook failures now propagate so the process dies instead of continuing with half-rebuilt communicators ([#12226](https://github.com/ai-dynamo/dynamo/pull/12226)). +- **NCCL Registered Windows Disabled:** Forced `TLLM_NCCL_SYMMETRIC_ZERO_COPY=0` before TensorRT-LLM Snapshot engine initialization and logged a warning when an existing setting was overridden, removing a known checkpoint-unsafe resource from snapshot capture ([#12570](https://github.com/ai-dynamo/dynamo/pull/12570)). + +#### Health & Rollouts + +- **Component-Scoped Topology Spread Validation:** Relaxed DynamoGraphDeployment webhook validation to accept a deployment topology without `packDomain` when at least one component defines its own topology constraint, while still rejecting configurations that set neither ([#12448](https://github.com/ai-dynamo/dynamo/pull/12448)). + +### Multimodal & Diffusion + +- **EPD Encode Worker Cache Bounds:** Fixed the vLLM encode worker's image embedding cache growing without limit, by routing it through the capacity-bounded LRU `MultimodalEmbeddingCacheManager` already used by prefill and decode workers, and removed a hardcoded `cache_size=8` limit ([#14452](https://github.com/ai-dynamo/dynamo/pull/14452), [#14444](https://github.com/ai-dynamo/dynamo/pull/14444)). +- **Multimodal EPD Decode Handoff:** Fixed the vLLM E/P/D decode handoff dropping mixed image and video media by reloading remaining video and audio when an image placeholder is present. Raised the multimodal NIXL KV lease from vLLM's 30-second default to 100 seconds ([#14522](https://github.com/ai-dynamo/dynamo/pull/14522), [#14502](https://github.com/ai-dynamo/dynamo/pull/14502)). +- **NVDEC Bitstream Filter Support:** Enabled the H.264 and HEVC MP4-to-Annex-B bitstream filters in the in-tree FFmpeg build while keeping software H.264/HEVC encoders, decoders, and parsers disabled. Restored PyNvVideoCodec NVDEC construction after the media-ffmpeg binding loads the in-tree FFmpeg ([#13936](https://github.com/ai-dynamo/dynamo/pull/13936)). +- **Kimi K3 Media Pads:** Fixed Kimi K3 multimodal handling in the vLLM adapter by expanding each frontend media pad into the checkpoint's image-placeholder token sequence at the worker. Pad and media mismatches and invalid K3 metadata are now rejected instead of silently misaligning ([#12394](https://github.com/ai-dynamo/dynamo/pull/12394)). +- **Multimodal Embedding Leak Fix:** Fixed the SGLang worker handler to release received multimodal embedding allocations when image or video item construction fails, so validation errors and cancellations no longer leak receiver allocations ([#13587](https://github.com/ai-dynamo/dynamo/pull/13587)). +- **Dynamic Diffusion Rendezvous Port:** Fixed SGLang diffusion workers to pass the allocated NCCL port through the diffusion config as the DiffGenerator master port for image and video workers. It falls back to the SGLang default when no port is provided, which avoids port collisions during concurrent deployments ([#13568](https://github.com/ai-dynamo/dynamo/pull/13568)). +- **Multimodal NIXL Buffer Cleanup:** Fixed `MmKwargsNixlSender.cleanup()` hanging forever on cancelled, rejected, or never-read transfers, which kept buffers alive and grew frontend memory until OOMKilled. Cleanup now bounds the wait with a timeout (`DYN_MM_NIXL_CLEANUP_TIMEOUT_S`, default 60s) ([#12759](https://github.com/ai-dynamo/dynamo/pull/12759)). + +### Engines + +#### vLLM + +- **vLLM KV-Router gRPC Flag:** Fixed the vLLM KV-router sidecar launch scripts to pass `--grpc-endpoint` instead of the removed `--vllm-endpoint` flag, so aggregated and disaggregated KV-router deployments start with the unified sidecar gRPC endpoint configuration ([#13894](https://github.com/ai-dynamo/dynamo/pull/13894)). +- **Codec-Free OpenCV for Image Inputs:** Rebuilt the vLLM CUDA image's OpenCV without software video backends so still-image preprocessing keeps `cv2.resize` while the image ships no software video codecs, and kept `install_media_decoders vllm` as the explicit step that swaps in the full wheel and PyAV ([#14361](https://github.com/ai-dynamo/dynamo/pull/14361)). +- **XPU Wheel and Omni Pin:** Tagged xpu wheels `manylinux_2_39` through `auditwheel`, pinned vLLM-Omni to v0.27.0rc1 on the xpu image to match its vLLM v0.27.1, and cleared an inherited metric-port variable in the XPU serve tests so the `vllm-xpu` build and tests pass ([#14034](https://github.com/ai-dynamo/dynamo/pull/14034)). +- **Decode Handoff Cancellation Preservation:** Fixed vLLM sidecar cancellation dropping decode requests when client cancellation won the initial race. Kept the decode stream alive until the first token or terminal transfer signal, so the disaggregated NIXL handoff completes ([#12736](https://github.com/ai-dynamo/dynamo/pull/12736)). +- **Decode Worker Engine Shutdown:** Fixed vLLM decode workers hanging when startup failed after the engine started, by tracking partially constructed resources and shutting down the handler and EngineCore on every worker exit instead of leaving EngineCore alive ([#12829](https://github.com/ai-dynamo/dynamo/pull/12829)). +- **vLLM Native Generate Capability:** Added publication of the `vllm_inference_v1_generate` runtime capability flag from token-input vLLM prefill, decode, and aggregated workers, so requests to `/inference/v1/generate` reach a matching worker instead of failing with a model-not-found error. Text-input, embedding, and incompatible role or type combinations do not advertise the capability ([#12881](https://github.com/ai-dynamo/dynamo/pull/12881)). +- **vLLM Abort Monitor Cleanup:** Fixed abort-monitor tasks being retained after normal request completion in vLLM handlers, which caused unbounded memory growth (6.05 GB RSS at 1.9 million requests) and longer GIL waits. Fixed this by tracking, cancelling, and draining child wait tasks ([#13637](https://github.com/ai-dynamo/dynamo/pull/13637)). +- **Accelerator-Free Omni Stage Router:** Fixed the vLLM omni stage router crashing on hosts with no accelerator with `RuntimeError: Failed to infer device type`, by detecting the router role before parser construction so it registers only the options it reads ([#14359](https://github.com/ai-dynamo/dynamo/pull/14359)). +- **LoRA Flag Exclusivity Enforcement:** Fixed vLLM worker argument parsing so `--enable-lora` combined with `--realtime` or `--classify-worker` is rejected instead of accepted, by assigning engine arguments before validation runs. Previously both invalid combinations passed through to worker startup ([#14446](https://github.com/ai-dynamo/dynamo/pull/14446)). +- **vLLM Runtime CRC32C Dependency:** Added the google-crc32c package to the vLLM runtime container image, which the ModelExpress v0.5.0 vLLM plugin imports at every vLLM startup, and added a build-time guard that verifies the ModelExpress loader registers. This fixes startup failures on XPU base images that lack the package ([#12664](https://github.com/ai-dynamo/dynamo/pull/12664)). +- **vLLM-RS Binary on PATH:** Fixed the vLLM sidecar failing to start with a command-not-found error by symlinking the `vllm-rs` binary shipped inside the installed `vllm` Python package onto `PATH`. This keeps it at the same revision as the Python package ([#14362](https://github.com/ai-dynamo/dynamo/pull/14362)). + +#### SGLang + +- **Mooncake Backend Preflight:** Checked that the mooncake `ProcessGroup` extension imports and registers before any model I/O, so a worker started with `--elastic-ep-backend mooncake` in an image that cannot use it fails at argument parsing with the flag named instead of crashing after model load ([#14461](https://github.com/ai-dynamo/dynamo/pull/14461)). +- **Pre-Tokenized SGLang Input Handling:** Added model-aware validation for pre-tokenized `nvext.token_data` requests, resolving the max accepted token ID from model or tokenizer vocabulary bounds and returning out-of-range IDs as a client error. Routed pre-tokenized embedding inputs through `EmbeddingReqInput` ([#12798](https://github.com/ai-dynamo/dynamo/pull/12798), [#13594](https://github.com/ai-dynamo/dynamo/pull/13594)). +- **Conditional Disaggregation Error Code:** Changed the SGLang backend rejection of the `x-bypass-remote-prefill` annotation from a generic 500 internal server error to an HTTP 400 response. Clients now receive the explanatory message directing them to vLLM or TensorRT-LLM for conditional disaggregation ([#12578](https://github.com/ai-dynamo/dynamo/pull/12578)). +- **DCP-Aware KV Block Size:** Fixed the router-facing SGLang KV block size using raw `page_size` instead of `page_size * dcp_size` for decode context parallelism, which made the event converter reject DCP blocks and left KV-aware routing blind ([#12765](https://github.com/ai-dynamo/dynamo/pull/12765)). +- **Temporary Disaggregated Config Cleanup:** Fixed cleanup of the temporary SGLang YAML file generated for a selected `--disagg-config-key` section so it is removed even when configuration merging, topology validation, or argument parsing fails. This prevents `dynamo_config_*.yaml` files from accumulating in the system temporary directory after failed worker launches ([#12913](https://github.com/ai-dynamo/dynamo/pull/12913)). +- **Incremental gRPC Stream Contract:** Switched the SGLang gRPC sidecar to SGLang's incremental streaming contract, consuming native token IDs and logprob metadata as per-chunk deltas instead of cumulative streams, and enabled `--incremental-streaming-output` across launch scripts and manifests ([#13739](https://github.com/ai-dynamo/dynamo/pull/13739)). +- **SGLang Min Tokens Mapping:** Fixed the SGLang backend to map `min_tokens` to SGLang's `min_new_tokens` in both the decode handler and the multimodal worker handler. End-of-sequence tokens are now suppressed until the minimum token floor is met, consistent with the TensorRT-LLM, TokenSpeed, and vLLM backends ([#13865](https://github.com/ai-dynamo/dynamo/pull/13865)). +- **SGLang Resolved Args Handling:** Fixed SGLang workers reading raw `ServerArgs` after engine initialization, which left values like `--page-size` unset and crashed the KV event publisher with a `TypeError` on a `None` block size. Dynamo now reads the resolved configuration view instead ([#13905](https://github.com/ai-dynamo/dynamo/pull/13905)). +- **SGLang Config Parser Compatibility:** Fixed the SGLang integration importing `ConfigArgumentMerger` from a path that broke on current nightlies, by preferring the relocated `sglang.srt.utils` module through a compatibility shim. Dynamo now works with both pinned SGLang releases and newer layouts ([#14054](https://github.com/ai-dynamo/dynamo/pull/14054)). +- **Per-Rank NIXL Telemetry Ports:** Fixed SGLang co-located ranks crashing on a shared NIXL exporter port by treating `NIXL_TELEMETRY_PROMETHEUS_PORT` as the base of a per-rank range with bounds checks against overflow. Disaggregated SGLang deployments now reach Ready with KV-transfer counters intact ([#14284](https://github.com/ai-dynamo/dynamo/pull/14284)). + +#### TensorRT-LLM + +- **Zero Prompt Logprobs Preservation:** Fixed the TensorRT-LLM request translation path so an explicit `prompt_logprobs=0` is forwarded to the engine instead of being treated as omitted. Callers requesting log probabilities for selected prompt tokens only now receive them ([#12689](https://github.com/ai-dynamo/dynamo/pull/12689)). +- **Prefill Stop Condition Handling:** Fixed the TensorRT-LLM handler overriding only `max_tokens` during prefill instead of applying full stop conditions, so a request with `ignore_eos=true` whose first token was EOS terminated immediately with HTTP 200 and no content. Stop conditions now pass through unchanged ([#13442](https://github.com/ai-dynamo/dynamo/pull/13442)). +- **Cancellation Listener Cleanup Fix:** Fixed a leak in the TensorRT-LLM backend where per-request client cancellation and service shutdown listeners were not stopped after a request completed normally. The leak accumulated tasks and memory under sustained traffic and ended in worker out-of-memory failures ([#13901](https://github.com/ai-dynamo/dynamo/pull/13901)). +- **Context-Length Precedence Fix:** Fixed the TensorRT-LLM sidecar discarding a configured `--context-length` (or `TRTLLM_CONTEXT_LENGTH`) whenever `GetModelInfo` reported a positive value, so the operator-supplied value now wins with a warning naming both numbers when they disagree ([#14450](https://github.com/ai-dynamo/dynamo/pull/14450)). +- **Environment-Independent Triton JIT:** Fixed a `cuda.h: No such file or directory` failure in Triton's `cuda_utils` on SSH-launched multinode TensorRT-LLM worker ranks. Restored Triton's default lookup layout with symlinks to the CUDA toolkit's `cuda.h`, `ptxas`, `cuobjdump`, and `nvdisasm`, so JIT compilation no longer depends on image environment variables ([#14865](https://github.com/ai-dynamo/dynamo/pull/14865)). + +### Reinforcement Learning + +- **Worker Discovery Visibility Fixes:** Fixed `materialization_fingerprint` hashing fields the frontend overrides, which split a `WorkerSet` into cohorts and hid the model from `/v1/models` during rolling upgrades, and reworked RL worker discovery to resolve a `NamespaceFilter` on Kubernetes ([#14451](https://github.com/ai-dynamo/dynamo/pull/14451), [#14455](https://github.com/ai-dynamo/dynamo/pull/14455)). + +### Fault Tolerance & Observability + +- **Worker Shutdown Request Migration:** Fixed requests interrupted by a worker shutdown terminating as clean cancellations instead of migrating, by briefly holding the terminal cancellation frame so the shutdown failure reaches the migration layer. Client-started cancellations and ordinary response streams keep their existing behavior ([#13952](https://github.com/ai-dynamo/dynamo/pull/13952)). +- **Worker Sidecar Metrics Scraping:** Added an `http` port endpoint to the `dynamo-worker` PodMonitor so `dynamo_frontend_*` metrics from the frontend sidecar on Gateway API and EPP worker pods reach Prometheus, restoring the cached-token Grafana panel ([#11981](https://github.com/ai-dynamo/dynamo/pull/11981)). +- **HTTP Graceful Shutdown Guard:** Fixed `HttpService::run()` to register and hold a graceful-shutdown guard for the lifetime of the service. The runtime no longer cancels discovery watches while in-flight requests and long-running streams are still draining after SIGTERM ([#12031](https://github.com/ai-dynamo/dynamo/pull/12031)). +- **Raced Final Marker Errors:** Fixed false-positive worker errors when the trailing `complete_final` marker lost a race with frontend teardown on successful streaming requests, which incremented `dynamo_component_errors_total{error_type="publish_final"}`. Those sends now log at DEBUG, while genuine dropped connections detected through `kill()` are still counted ([#12374](https://github.com/ai-dynamo/dynamo/pull/12374)). +- **Prometheus Name Generator Sync:** Fixed the Prometheus name generator and its Python and Rust sync so metric names dropped by the codegen gap (`transport`, `frontend_service`, `work_handler`, and tokenizer cache names) are restored. Made the generator fail on a name collision instead of silently dropping a constant ([#12745](https://github.com/ai-dynamo/dynamo/pull/12745), [#13283](https://github.com/ai-dynamo/dynamo/pull/13283)). +- **Bounded TCP Accept Backoff:** Added exponential backoff and rate-limited logging for TCP response server accept failures from file-descriptor or kernel memory exhaustion. This replaced a busy retry loop that spun at microsecond cadence and repeated the same warning every iteration ([#13146](https://github.com/ai-dynamo/dynamo/pull/13146)). +- **Administrative Route Lifecycle Hardening:** Gated Backend SDK engine control, engine update, and model-taint routes on the worker serving lifecycle and serialized administrative mutations with discovery transitions, so requests no longer race worker startup, discovery registration, or shutdown ([#13259](https://github.com/ai-dynamo/dynamo/pull/13259)). +- **Typed Backend Refusal Errors:** Fixed unservable requests, like multimodal input sent to a backend without multimodal support, returning a generic HTTP 500 instead of a useful error. Worker refusals now carry a typed error, and SGLang and TensorRT-LLM guards raise `InvalidArgument` ([#14467](https://github.com/ai-dynamo/dynamo/pull/14467)). + +### Performance Modeling & Replay + +- **Public Mocker Worker CLI:** Restored the `python3 -m dynamo.mocker` live worker CLI and migrated in-repo launchers, manifests, and documentation to it, while retaining `python3 -m dynamo.mocker._worker` as a compatibility shim for existing 1.5 configurations ([#14230](https://github.com/ai-dynamo/dynamo/pull/14230)). + +### General + +- **Shared-Source Served Aliases:** Allowed non-LoRA workers with different served names to register on the same endpoint when they advertise the same source path, with each served name selecting its own worker group, while base and LoRA name collisions stay rejected ([#14857](https://github.com/ai-dynamo/dynamo/pull/14857)). +- **CUDA and uv Dependency Pinning:** Pinned `cupy` to the `cuda13x` distribution in the `sglang` extra and enforced the CUDA major version, removing the last CUDA 12 reference, and declared mutually exclusive backend extras through `tool.uv.conflicts` ([#13650](https://github.com/ai-dynamo/dynamo/pull/13650), [#12933](https://github.com/ai-dynamo/dynamo/pull/12933)). +- **Discovery Instance State Consistency:** Reworked Kubernetes discovery to emit `Added` as an upsert for same-ID endpoint updates, propagating metadata changes instead of detecting only added or removed IDs. Restored first-wins model deployment card acceptance so an incompatible card no longer withdraws the set ([#12574](https://github.com/ai-dynamo/dynamo/pull/12574), [#14632](https://github.com/ai-dynamo/dynamo/pull/14632)). +- **Configured Dynamo Runtime Propagation:** Handed the configured Dynamo runtime to the PyO3 async bridge so `DYN_RUNTIME_NUM_WORKER_THREADS` and `DYN_RUNTIME_MAX_BLOCKING_THREADS` apply to the frontend-serving runtime instead of a second Tokio runtime, and pinned mocker startup to the owning executor ([#13849](https://github.com/ai-dynamo/dynamo/pull/13849), [#13352](https://github.com/ai-dynamo/dynamo/pull/13352)). +- **Bundled Runtime Dependency Refresh:** Refreshed third-party packages the SGLang and vLLM runtime images inherit from their base images, raising the bundled mooncake transfer engine and flooring `cryptography` for vLLM to pick up an updated etcd stack ([#14082](https://github.com/ai-dynamo/dynamo/pull/14082)). + +## New Release Artifacts + +- **Unified Sidecar Image (Experimental):** Shipped one CPU-only, multi-arch `dynamo-sidecar` image carrying the SGLang, TensorRT-LLM, and vLLM sidecar executables, replacing the per-engine images. Select the engine with the container command (`dynamo-sglang-sidecar`, `dynamo-trtllm-sidecar`, `dynamo-vllm-sidecar`); the engine stays in its own GPU container ([#13781](https://github.com/ai-dynamo/dynamo/pull/13781), [#13917](https://github.com/ai-dynamo/dynamo/pull/13917)). +- **Rust EPP Frontend Image:** Shipped the Rust Endpoint Picker binary inside the Dynamo Frontend image at `/epp`, replacing the Go EPP. A standalone `dynamo-epp` image is planned for a later release ([#11355](https://github.com/ai-dynamo/dynamo/pull/11355)). +- **Nightly Helm Charts:** Published nightly Dynamo Helm charts through both ChartMuseum and OCI so nightly deployments no longer need a local chart build ([#12962](https://github.com/ai-dynamo/dynamo/pull/12962)). +- **Standalone Snapshot Operator:** Moved Dynamo Snapshot to its own [repository](https://github.com/ai-dynamo/snapshot) and chart, shipped as Snapshot v0.1.0 at `oci://ghcr.io/ai-dynamo/snapshot/snapshot:0.1.0`. The `PodSnapshot` and `PodSnapshotContent` CRDs and their reconciler now come from that operator. The Dynamo platform chart can pull it in as a subchart with `global.snapshot.install=true` for evaluation; production deployments should install it separately ([#13177](https://github.com/ai-dynamo/dynamo/pull/13177)). +- **AISimulate v0.12.0:** Consumed [AISimulate](https://github.com/ai-dynamo/aisimulate) as a standalone release with one unified CLI, replacing the separate aiconfigurator wheels ([#13478](https://github.com/ai-dynamo/dynamo/pull/13478)). + +## Documentation + +- **Release and Version Page Updates:** Promoted the docs current-release surfaces through v1.4.0, v1.4.1, and v1.4.2, and refreshed the README community events table, Slack badge, and Dynamo Enterprise support section. Corrected nightly release artifact listings and hardened docs CI with a lint gate, verified-commit checks, test ownership, and a preview-build flake fix ([#13269](https://github.com/ai-dynamo/dynamo/pull/13269), [#12752](https://github.com/ai-dynamo/dynamo/pull/12752), [#13678](https://github.com/ai-dynamo/dynamo/pull/13678), [#13999](https://github.com/ai-dynamo/dynamo/pull/13999), [#13310](https://github.com/ai-dynamo/dynamo/pull/13310), [#13344](https://github.com/ai-dynamo/dynamo/pull/13344), [#12469](https://github.com/ai-dynamo/dynamo/pull/12469), [#12498](https://github.com/ai-dynamo/dynamo/pull/12498), [#13720](https://github.com/ai-dynamo/dynamo/pull/13720), [#12737](https://github.com/ai-dynamo/dynamo/pull/12737), [#13843](https://github.com/ai-dynamo/dynamo/pull/13843), [#13854](https://github.com/ai-dynamo/dynamo/pull/13854), [#12528](https://github.com/ai-dynamo/dynamo/pull/12528), [#12763](https://github.com/ai-dynamo/dynamo/pull/12763), [#13882](https://github.com/ai-dynamo/dynamo/pull/13882), [#12388](https://github.com/ai-dynamo/dynamo/pull/12388)). +- **Generated API Reference Docs:** Added deterministic, CI-gated API reference generation for Python, Rust crates, and Kubernetes CRDs as native Fern MDX. Moved generation to publish time so source PRs no longer carry machine-generated content, and fixed stale CRD reference links and a reference-checker crash ([#12110](https://github.com/ai-dynamo/dynamo/pull/12110), [#13556](https://github.com/ai-dynamo/dynamo/pull/13556), [#13035](https://github.com/ai-dynamo/dynamo/pull/13035), [#12985](https://github.com/ai-dynamo/dynamo/pull/12985), [#13320](https://github.com/ai-dynamo/dynamo/pull/13320), [#12815](https://github.com/ai-dynamo/dynamo/pull/12815), [#12342](https://github.com/ai-dynamo/dynamo/pull/12342)). +- **Support Matrix and Deploy Guides:** Replaced the CUDA driver picker with a generated support matrix reporting containers-versus-wheels-only scope, and defined the N-2 worker/frontend compatibility window. Aligned the Kubernetes build selector with the CLI guide, and added Vanilla vLLM GAIE, MatrixHub, and deploy contributing guides ([#12215](https://github.com/ai-dynamo/dynamo/pull/12215), [#12529](https://github.com/ai-dynamo/dynamo/pull/12529), [#12479](https://github.com/ai-dynamo/dynamo/pull/12479), [#13668](https://github.com/ai-dynamo/dynamo/pull/13668), [#12800](https://github.com/ai-dynamo/dynamo/pull/12800), [#12894](https://github.com/ai-dynamo/dynamo/pull/12894), [#13886](https://github.com/ai-dynamo/dynamo/pull/13886), [#10957](https://github.com/ai-dynamo/dynamo/pull/10957), [#11197](https://github.com/ai-dynamo/dynamo/pull/11197), [#11700](https://github.com/ai-dynamo/dynamo/pull/11700), [#12729](https://github.com/ai-dynamo/dynamo/pull/12729)). +- **Router and KV Routing Docs:** Refreshed Dynamo Router cost, scheduling, event-recovery, topology-aware KV transfer, and standalone-mode documentation to match the current implementation. Added a runnable custom worker-selection policy walkthrough, corrected the Selection API environment variable, and reorganized the Router docs into six task-oriented sections ([#12635](https://github.com/ai-dynamo/dynamo/pull/12635), [#12634](https://github.com/ai-dynamo/dynamo/pull/12634), [#12431](https://github.com/ai-dynamo/dynamo/pull/12431), [#12992](https://github.com/ai-dynamo/dynamo/pull/12992), [#13039](https://github.com/ai-dynamo/dynamo/pull/13039), [#13915](https://github.com/ai-dynamo/dynamo/pull/13915), [#13015](https://github.com/ai-dynamo/dynamo/pull/13015)). +- **Docs Navigation and Fern Styling:** Restructured guides around reader intent with dedicated Kubernetes, Local, and backend areas, and fixed Fern home page and navigation styling defects. Repointed the Fern CLI and dead SGLang and Helm chart links, and added tab-aligned authoring templates ([#12993](https://github.com/ai-dynamo/dynamo/pull/12993), [#12373](https://github.com/ai-dynamo/dynamo/pull/12373), [#12410](https://github.com/ai-dynamo/dynamo/pull/12410), [#12436](https://github.com/ai-dynamo/dynamo/pull/12436), [#13942](https://github.com/ai-dynamo/dynamo/pull/13942), [#13973](https://github.com/ai-dynamo/dynamo/pull/13973), [#12539](https://github.com/ai-dynamo/dynamo/pull/12539), [#12615](https://github.com/ai-dynamo/dynamo/pull/12615), [#12861](https://github.com/ai-dynamo/dynamo/pull/12861), [#13115](https://github.com/ai-dynamo/dynamo/pull/13115), [#12817](https://github.com/ai-dynamo/dynamo/pull/12817), [#12823](https://github.com/ai-dynamo/dynamo/pull/12823), [#13138](https://github.com/ai-dynamo/dynamo/pull/13138), [#12668](https://github.com/ai-dynamo/dynamo/pull/12668), [#12426](https://github.com/ai-dynamo/dynamo/pull/12426)). +- **RL and Agent Skill Docs:** Added a reinforcement learning integration guide covering rollout inference and the SGLang-compatible `/generate` API. Restructured the guides into a docs-only set spanning trainers, KV-aware routing, and simulation, and corrected the shipped agent optimization skill pack ([#11381](https://github.com/ai-dynamo/dynamo/pull/11381), [#13127](https://github.com/ai-dynamo/dynamo/pull/13127), [#13912](https://github.com/ai-dynamo/dynamo/pull/13912), [#13608](https://github.com/ai-dynamo/dynamo/pull/13608), [#13639](https://github.com/ai-dynamo/dynamo/pull/13639), [#13067](https://github.com/ai-dynamo/dynamo/pull/13067)). +- **Operator, CRD, and EPP Docs:** Clarified `scalingAdapter` and worker-hash rollout semantics per API version, and refreshed CRD YAML and image tags to 1.4.0. Documented the webhook failure-policy default, and announced the Go Endpoint Picker deprecation with Rust EPP migration guidance ([#12986](https://github.com/ai-dynamo/dynamo/pull/12986), [#13270](https://github.com/ai-dynamo/dynamo/pull/13270), [#12744](https://github.com/ai-dynamo/dynamo/pull/12744), [#12563](https://github.com/ai-dynamo/dynamo/pull/12563), [#13243](https://github.com/ai-dynamo/dynamo/pull/13243), [#13244](https://github.com/ai-dynamo/dynamo/pull/13244), [#13401](https://github.com/ai-dynamo/dynamo/pull/13401)). +- **Backend Flag and Config Corrections:** Removed retired vLLM prefill and decode worker flags in favor of `--disaggregation-mode`, and replaced stale benchmark-granularity flags with the six sampling flags the parser exposes. Fixed the SGLang `MAX_TOTAL_TOKENS` description, and clarified SGLang LoRA support status ([#12568](https://github.com/ai-dynamo/dynamo/pull/12568), [#12581](https://github.com/ai-dynamo/dynamo/pull/12581), [#13036](https://github.com/ai-dynamo/dynamo/pull/13036), [#13271](https://github.com/ai-dynamo/dynamo/pull/13271), [#14057](https://github.com/ai-dynamo/dynamo/pull/14057), [#13822](https://github.com/ai-dynamo/dynamo/pull/13822)). +- **Recipe and Multimodal Serving Docs:** Added catalog-owned image provenance metadata for six recipes, published Qwen3.5-122B-A10B and GLM-5.3 recipe pages, and added a multimodal serving guide covering parallel image decoding and custom vision encoders across backends ([#13232](https://github.com/ai-dynamo/dynamo/pull/13232), [#13469](https://github.com/ai-dynamo/dynamo/pull/13469), [#12931](https://github.com/ai-dynamo/dynamo/pull/12931), [#13995](https://github.com/ai-dynamo/dynamo/pull/13995), [#12417](https://github.com/ai-dynamo/dynamo/pull/12417), [#13651](https://github.com/ai-dynamo/dynamo/pull/13651), [#13673](https://github.com/ai-dynamo/dynamo/pull/13673)). +- **Planner, Profiler, and Observability Docs:** Synchronized Planner, Profiler, DGDR, and SPICA documentation with the current implementation, and documented profiler component names and the unified AISimulate CLI. Corrected the request-trace S3 sink behavior, and cleaned up 151 rustdoc warnings and the external and research publications pages ([#12408](https://github.com/ai-dynamo/dynamo/pull/12408), [#13446](https://github.com/ai-dynamo/dynamo/pull/13446), [#14148](https://github.com/ai-dynamo/dynamo/pull/14148), [#14623](https://github.com/ai-dynamo/dynamo/pull/14623), [#13223](https://github.com/ai-dynamo/dynamo/pull/13223), [#12945](https://github.com/ai-dynamo/dynamo/pull/12945)). +- **verl Guide Version Bounds:** Bounded the verl reinforcement-learning guide to vLLM v0.26.0, added `flash-attn` as an explicit prerequisite, and passed the three `_per_gpu` micro-batch overrides the pinned verl requires, so readers no longer hit import errors on the v1.5.0 vLLM pin ([#14571](https://github.com/ai-dynamo/dynamo/pull/14571)). + +## Dynamo Enterprise + +A curated set of v1.5.0 release artifacts is also published under the `-enterprise` suffix in the [Dynamo Enterprise collection](https://catalog.ngc.nvidia.com/orgs/nvidia/ai-dynamo/collections/dynamo-enterprise) on NGC. These artifacts are eligible for NVIDIA Enterprise Support under an active NVIDIA AI Enterprise subscription and carry no functional or binary differences from their open-source counterparts. See [Dynamo Enterprise](https://docs.nvidia.com/dynamo/dev/reference/enterprise/overview) for scope, supported artifacts, and coverage terms. + +## Looking Ahead + +### Planner Runtime Reconfiguration + +Planner reconfigures GPU budgets at runtime through a `/v1/min-endpoints` API and caps how many replicas change in one throughput-scaling step, so autoscaling can be steered without a redeploy. + +### Kubernetes Roles & Standalone Endpoint Picker + +Component roles gain a gated `podTemplate` API and explicit per-role replica counts. The Rust Endpoint Picker, now the default inside the Frontend image, continues toward a standalone image, adding an SGLang tokenizer provider and routing runtime requests under the requested policy class. + +### Frontend Transport Security + +The transport encryption in this release extends to the Frontend HTTP server with mutual TLS. + + + +Between v1.4.2 and v1.5.0 the project merged 658 PRs from 123 contributors, 40 of them from outside NVIDIA. Thank you to the external community contributors in this release (organization identified through the commit-author email domain or the public GitHub profile): + +- **DaoCloud:** [@bzsuni](https://github.com/bzsuni), [@carlory](https://github.com/carlory), [@flpanbin](https://github.com/flpanbin), [@muma378](https://github.com/muma378), [@panpan0000](https://github.com/panpan0000), [@weizhoublue](https://github.com/weizhoublue), [@windsonsea](https://github.com/windsonsea), [@yankay](https://github.com/yankay). +- **CoreWeave:** [@alexeldeib](https://github.com/alexeldeib), [@houshengbo](https://github.com/houshengbo), [@Rexwang8](https://github.com/Rexwang8), [@ritazh](https://github.com/ritazh). +- **Intel:** [@Spycsh](https://github.com/Spycsh), [@tthakkal](https://github.com/tthakkal), [@VincyZhang](https://github.com/VincyZhang). +- **Aliyun:** [@xianlubird](https://github.com/xianlubird). +- **Amazon:** [@AineshSootha](https://github.com/AineshSootha), [@jlonge4](https://github.com/jlonge4), [@YiqiuLiu](https://github.com/YiqiuLiu). +- **Arizona State University:** [@Change72](https://github.com/Change72). +- **Baseten:** [@michaelfeil](https://github.com/michaelfeil), [@shalinkpatel](https://github.com/shalinkpatel). +- **Datadog:** [@walkoss](https://github.com/walkoss). +- **Gcore:** [@Kaonael](https://github.com/Kaonael). +- **Georgia Tech:** [@Skenix64](https://github.com/Skenix64). +- **H Company:** [@h-avsha](https://github.com/h-avsha). +- **Microsoft:** [@Jont828](https://github.com/Jont828). +- **Reflection AI:** [@joeltg](https://github.com/joeltg). +- **SK Telecom:** [@changhyeonnam](https://github.com/changhyeonnam). +- **San Jose State University:** [@ayaangazali](https://github.com/ayaangazali). +- **Stanford University:** [@merceod](https://github.com/merceod). +- **UC San Diego Hao AI Lab:** [@vishruthb](https://github.com/vishruthb). +- **University of Guelph:** [@mgsalem](https://github.com/mgsalem). +- **University of Washington:** [@Shaoting-Feng](https://github.com/Shaoting-Feng). +- **Yandex Cloud:** [@jellysnack](https://github.com/jellysnack). +- **Independent:** [@avinash-rafay](https://github.com/avinash-rafay), [@cmdy](https://github.com/cmdy), [@elizabetht](https://github.com/elizabetht), [@hnt2601](https://github.com/hnt2601), [@Jonny-Skelton](https://github.com/Jonny-Skelton). +**New Contributors:** welcome to the 23 first-time contributors in this release: +- [@elizabetht](https://github.com/elizabetht) wrapped OTLP exporter construction in the Tokio runtime context ([#11143](https://github.com/ai-dynamo/dynamo/pull/11143)). +- [@YiqiuLiu](https://github.com/YiqiuLiu) added a native S3 sink for request-trace records ([#11806](https://github.com/ai-dynamo/dynamo/pull/11806)). +- [@h-avsha](https://github.com/h-avsha) added embedding cache metrics ([#11969](https://github.com/ai-dynamo/dynamo/pull/11969)). +- [@avinash-rafay](https://github.com/avinash-rafay) forwarded the full request body to the EPP KV-router scorer ([#11991](https://github.com/ai-dynamo/dynamo/pull/11991)). +- [@anmolgupt](https://github.com/anmolgupt) added tokenizer alignment, a multi-process pool, and worker byte transport for embedding workers ([#12157](https://github.com/ai-dynamo/dynamo/pull/12157)). +- [@hnt2601](https://github.com/hnt2601) emitted per-chunk token usage on `/v1/messages` streaming ([#12473](https://github.com/ai-dynamo/dynamo/pull/12473)). +- [@YijiaZhao](https://github.com/YijiaZhao) sampled variable-length prefill batches in the vLLM self-benchmark ([#12627](https://github.com/ai-dynamo/dynamo/pull/12627)). +- [@mgsalem](https://github.com/mgsalem) allowed custom ServiceMonitor labels in the Helm chart ([#12716](https://github.com/ai-dynamo/dynamo/pull/12716)). +- [@kristinapathak](https://github.com/kristinapathak) clarified the verified CI requirement in the contributing guide ([#12763](https://github.com/ai-dynamo/dynamo/pull/12763)). +- [@bzsuni](https://github.com/bzsuni) fixed the Fern CLI guide link and seven more docs and CI fixes ([#12817](https://github.com/ai-dynamo/dynamo/pull/12817)). +- [@Skenix64](https://github.com/Skenix64) gated Gemma 4 reasoning on `enable_thinking` ([#13061](https://github.com/ai-dynamo/dynamo/pull/13061)). +- [@JulienDarve](https://github.com/JulienDarve) bumped vLLM to v0.27.1 and isolated the CUDA context from GPU Memory Service checks in the NVDEC tests ([#13059](https://github.com/ai-dynamo/dynamo/pull/13059), [#13130](https://github.com/ai-dynamo/dynamo/pull/13130)). +- [@chw001](https://github.com/chw001) corrected the Qwen3.8-2.4T-A95B-FP8 recipe model ID ([#13265](https://github.com/ai-dynamo/dynamo/pull/13265)). +- [@changhyeonnam](https://github.com/changhyeonnam) regenerated the Kustomize OpenAPI schema after the PodSnapshot change ([#13444](https://github.com/ai-dynamo/dynamo/pull/13444)). +- [@ayaangazali](https://github.com/ayaangazali) resolved the Planner KV hit rate against the worker namespace ([#13480](https://github.com/ai-dynamo/dynamo/pull/13480)). +- [@AineshSootha](https://github.com/AineshSootha) cleaned up abort-monitor waiters in the vLLM backend ([#13637](https://github.com/ai-dynamo/dynamo/pull/13637)). +- [@jlonge4](https://github.com/jlonge4) registered the Neuron NIXL connector in the KV connector protocols ([#13771](https://github.com/ai-dynamo/dynamo/pull/13771)). +- [@merceod](https://github.com/merceod) added `extra_body` passthrough to media request structs ([#13817](https://github.com/ai-dynamo/dynamo/pull/13817)). +- [@Jankwi](https://github.com/Jankwi) forwarded `media_io_kwargs` for worker-side video decoding ([#13826](https://github.com/ai-dynamo/dynamo/pull/13826)). +- [@houshengbo](https://github.com/houshengbo) honored `continue_final_message` in the Rust chat preprocessor ([#13841](https://github.com/ai-dynamo/dynamo/pull/13841)). +- [@Jonny-Skelton](https://github.com/Jonny-Skelton) mapped `min_tokens` to SGLang's `min_new_tokens` ([#13865](https://github.com/ai-dynamo/dynamo/pull/13865)). +- [@Rexwang8](https://github.com/Rexwang8) returned HTTP 400 for unsupported multimodal content ([#14056](https://github.com/ai-dynamo/dynamo/pull/14056)). +- [@luckyq](https://github.com/luckyq) backported the chat logprobs fixes to the release branch ([#14621](https://github.com/ai-dynamo/dynamo/pull/14621)). +If you would like to get involved, please see our [Contribution Guide](https://docs.nvidia.com/dynamo/dev/getting-started/contribution-guide). + +If you would like to get involved, please see our [Contribution Guide](../../../community/contributing/overview.md). + + diff --git a/docs/fern/pages/reference/general/releases/known-issues.mdx b/docs/fern/pages/reference/general/releases/known-issues.mdx index c5790a22fbb1..dde405be0a26 100644 --- a/docs/fern/pages/reference/general/releases/known-issues.mdx +++ b/docs/fern/pages/reference/general/releases/known-issues.mdx @@ -12,9 +12,37 @@ import { RELEASE_STATS } from "@/components/releases.data"; Known issues are mirrored verbatim from each release's GitHub release notes. The current release is listed first, with older releases collapsed below; artifact-specific issues sit at the bottom of the page. + + +## v1.5.0 — current release + +SGLang **SGLang Sidecar Inference 500 Errors:** Every inference request sent to the SGLang sidecar fails with HTTP 500 and the error `'GenerateReqInput' object has no attribute 'batch_size'`. Startup, registration and discovery succeed on the same binaries, so only the generate path is affected; the cause is a protocol mismatch between the sidecar's request handling and the bundled SGLang version, which is corrected in upstream SGLang v0.5.19. No workaround is available yet. + +SGLang **Missing Prompt Logprobs under Disaggregation:** With the SGLang backend in disaggregated (prefill/decode) serving, requests to the engine-native `/generate` endpoint that set `return_logprob` are accepted but come back with no prompt logprobs. No error or warning explains the omission, while the same request in aggregated serving returns them. The prompt logprobs are produced on the prefill worker and are not propagated through the decode path. The request handler does not surface a diagnostic when they are absent, so callers cannot tell an unsupported option from an empty result. The missing logprobs are a known gap in the current engine-native generate path and are not scheduled for a fix in this release. No workaround is available yet. + +SGLang **SGLang DCP Worker Request Crash:** SGLang workers launched with `--dcp-size` crash on every real completion request with `RuntimeError: shape '[-1, 1024]' is invalid for input of size 5632`. The attention tensor-parallel size does not account for `dcp_size`, so it mismatches the DCP-aware head split of the KV pool. The root cause is in SGLang. **Workaround:** do not set `--dcp-size` on SGLang workers in v1.5.0. The fix is targeted for v1.6.0 with the next SGLang bump. + +vLLM **RL Weight Version Tracking Drift:** In reinforcement learning workflows on the vLLM backend, the reported weight version can disagree with the weights actually loaded in the engine, so downstream consumers may treat stale weights as current. + +CLI **Replay Module Entrypoint Removal:** Scripts and test suites that invoke `python -m dynamo.replay` now fail because the module no longer provides a CLI entry point. The replay CLI moved into the AISimulate wheel with no compatibility shim. **Workaround:** migrate to `aisimulate predict --stack dynamo --config `. It takes a YAML config instead of the previous command-line arguments and does not support online mode. See [the replay guide](https://github.com/ai-dynamo/dynamo/blob/main/docs/fern/pages/cli/operations/simulation-with-dynosim/dynosim-replay.mdx) for usage. + +Frontend **Bare 500 on Request Errors:** When a request-level error is returned by the backend, clients receive a bare HTTP 500 with no explanatory message, so the actual failure reason is not visible in the response. + +Planner **Thorough-Mode MoE GPU Overrun:** When the deployment recommender is run in thorough mode against a Mixture-of-Experts model, for example Qwen/Qwen3-30B-A3B, the enumerated profiling candidates can require more GPUs than the cluster GPU budget, so candidate configurations that cannot be deployed are still produced. + +Planner **Mocker Thorough Profiling GPU Crash:** When a DynamoGraphDeploymentRequest sets `features.mocker.enabled=true` together with `pre_deployment_sweeping_mode=thorough`, the SLA profiler still launches a real GPU worker deployment. That pod enters `CrashLoopBackOff` for lack of GPUs after about 40 seconds and the profiling job aborts. The interpolation path is missing the mocker check, so a GPU-free run still creates a GPU deployment. **Workaround:** use `pre_deployment_sweeping_mode=rapid` for GPU-free profiling with the mocker. + +Planner **Mocker Perf Model Startup Crash:** Launching `dynamo.mocker` with `--aic-perf-model` crashes on startup instead of serving mock requests. **Workaround:** launch the mocker without `--aic-perf-model`, or run performance modeling through `aisimulate predict`. + +Router **Explicit Prefill Pin Request Failure:** Requests that specify an explicit prefill target fail hard when that target is locally inhibited: the router neither dispatches the request to the pinned worker nor falls back to another prefill worker. + +Upstream **FP8 MoE Weight Load Crash:** Serving Qwen3-30B-A3B in its FP8 MoE variant on the vLLM backend crashes during model weight loading, with a shape mismatch raised from the expert weight loader (`routed_experts._load_w13`, tensor a(6) vs b(8)). The failure reproduces on H100, B200, and GB200. The crash reproduces on bare vLLM at the pinned version, so the fix is upstream. This FP8 variant is not covered by any Dynamo recipe, test, or model catalog entry. The non-FP8 Qwen3-30B-A3B checkpoint is unaffected. No workaround is available yet. + +Upstream **Disagg Prefill Worker Sleep Failure:** In vLLM disaggregated deployments, putting a prefill worker to sleep fails after it has served inference traffic, so the worker cannot be freed or scaled down. + -## v1.4.0 — current release +## v1.4.0 vLLM **Omni Cases Fail On GB200:** On ARM64 (GB200) hosts, every vLLM Omni case fails at startup with `ModuleNotFoundError: No module named vllm_omni`, covering the aggregated text, audio, image, video, and image-to-video paths as well as disaggregated GLM image serving. The cause is that the `vllm_omni` module is not shipped in the ARM64 container image; ARM is not a supported platform for vLLM Omni, as noted in the installation section of the [vLLM-Omni installation guidance](../../../use-cases/diffusion/overview.md). No workaround is available yet; Omni workloads must run on x86_64 images. diff --git a/docs/fern/pages/reference/general/releases/release-history.mdx b/docs/fern/pages/reference/general/releases/release-history.mdx index 78c4c9b37f32..26a9a83427bc 100644 --- a/docs/fern/pages/reference/general/releases/release-history.mdx +++ b/docs/fern/pages/reference/general/releases/release-history.mdx @@ -32,6 +32,7 @@ The pre-v1.0.0 bodies predate the current release-note template and state no PR | Release | PRs | Contributors | First-time contributors | Breaking changes | Known issues | | --- | --- | --- | --- | --- | --- | +| v1.5.0 | 658 | 123 | - | 44 | 12 | | v1.4.0 | 640 | 127 | 29 | 51 | 19 | | v1.3.0 | 930 | 125 | 24 | 24 | 10 | | v1.2.0 | 603 | 82 | - | 5 | 11 | diff --git a/docs/fern/translations/zh-CN/pages/cli/getting-started/quickstart.mdx b/docs/fern/translations/zh-CN/pages/cli/getting-started/quickstart.mdx index c439d60b5677..6635397c451d 100644 --- a/docs/fern/translations/zh-CN/pages/cli/getting-started/quickstart.mdx +++ b/docs/fern/translations/zh-CN/pages/cli/getting-started/quickstart.mdx @@ -35,17 +35,17 @@ Dynamo 与后端无关 — 每种安装路径都适用于 **SGLang**、**TensorR ```bash - docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.0 + docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 ``` ```bash - docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.4.0 + docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.5.0 ``` ```bash - docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0 + docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0 ``` diff --git a/docs/fern/translations/zh-CN/pages/cli/installation/install-dynamo.mdx b/docs/fern/translations/zh-CN/pages/cli/installation/install-dynamo.mdx index 7d63acca9dc9..052fa89b7646 100644 --- a/docs/fern/translations/zh-CN/pages/cli/installation/install-dynamo.mdx +++ b/docs/fern/translations/zh-CN/pages/cli/installation/install-dynamo.mdx @@ -54,13 +54,13 @@ description: 使用容器或 PyPI 在本地机器或 VM 上安装并运行 Dynam ```bash # SGLang - docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.0 + docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 # TensorRT-LLM - docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.4.0 + docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.5.0 # vLLM - docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0 + docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0 ``` @@ -277,10 +277,10 @@ curl localhost:8000/v1/chat/completions \ ```bash # Correct - docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.0 + docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 # Wrong -- no GPU access - docker run --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.4.0 + docker run --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 ``` **vLLM worker 启动失败:FlashInfer sampler 的 JIT 与 CUDA 13 wheels** From a67b954e74942a4e3106391c21ebf3cae152849e Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 22 Sep 2026 00:13:31 +0800 Subject: [PATCH 135/191] fix(vllm): publish KV gauges from prefill workers (#12559) Signed-off-by: gitover22 --- components/src/dynamo/vllm/publisher.py | 2 +- .../dynamo/vllm/tests/test_vllm_publisher.py | 66 +++++++++++++++++-- .../vllm/tests/test_vllm_worker_factory.py | 44 +++++++++++-- components/src/dynamo/vllm/worker_factory.py | 23 ++++--- tests/serve/test_vllm.py | 8 ++- 5 files changed, 119 insertions(+), 24 deletions(-) diff --git a/components/src/dynamo/vllm/publisher.py b/components/src/dynamo/vllm/publisher.py index 85d2cd016de4..da7317e8653a 100644 --- a/components/src/dynamo/vllm/publisher.py +++ b/components/src/dynamo/vllm/publisher.py @@ -89,7 +89,7 @@ def record( def init_publish(self) -> None: self.inner.publish(self.dp_rank, kv_used_blocks=0) dp_rank_str = str(self.dp_rank) - self.component_gauges.set_total_blocks(dp_rank_str, 0) + self.component_gauges.set_total_blocks(dp_rank_str, self.num_gpu_block) self.component_gauges.set_gpu_cache_usage(dp_rank_str, 0.0) def log_engine_initialized(self) -> None: diff --git a/components/src/dynamo/vllm/tests/test_vllm_publisher.py b/components/src/dynamo/vllm/tests/test_vllm_publisher.py index 7cbc105baecf..138a11fc68ec 100644 --- a/components/src/dynamo/vllm/tests/test_vllm_publisher.py +++ b/components/src/dynamo/vllm/tests/test_vllm_publisher.py @@ -12,11 +12,14 @@ """ from types import SimpleNamespace -from unittest.mock import AsyncMock, Mock +from unittest.mock import AsyncMock, Mock, call import pytest +from prometheus_client import CollectorRegistry import dynamo.vllm.publisher as publisher_mod +from dynamo import prometheus_names +from dynamo.common.utils.prometheus import LLMBackendMetrics from dynamo.vllm.publisher import ( DynamoStatLoggerPublisher, NoopStatLogger, @@ -135,18 +138,29 @@ def _fake_publisher(*args, **kwargs): factory = StatLoggerFactory( endpoint=SimpleNamespace(), component_gauges=SimpleNamespace() ) - for dp_rank in range(3): + dp_ranks = (2, 4, 7) + for dp_rank in dp_ranks: factory.create_stat_logger(dp_rank=dp_rank) factory.set_num_gpu_blocks_all(4096) factory.init_publish() - assert factory.created_loggers == dict(enumerate(loggers)) + assert factory.created_loggers == dict(zip(dp_ranks, loggers, strict=True)) for logger in loggers: logger.set_num_gpu_block.assert_called_once_with(4096) logger.init_publish.assert_called_once_with() +def test_factory_initialization_without_loggers_is_a_noop(): + """Disabled vLLM stat logging leaves the factory without loggers.""" + factory = StatLoggerFactory(endpoint=SimpleNamespace()) + + factory.set_num_gpu_blocks_all(4096) + factory.init_publish() + + assert factory.created_loggers == {} + + def test_factory_binds_deferred_endpoint_to_every_dp_rank_logger(monkeypatch): loggers = [] @@ -177,11 +191,19 @@ async def test_deferred_logger_starts_with_fresh_metrics_state(monkeypatch): publisher_mod, "WorkerMetricsPublisher", Mock(side_effect=publishers) ) + registry = CollectorRegistry() + component_gauges = LLMBackendMetrics( + registry=registry, + model_name="test-model", + component_name="prefill", + ) + logger = DynamoStatLoggerPublisher( endpoint=None, - component_gauges=SimpleNamespace(), + dp_rank=5, + component_gauges=component_gauges, ) - logger.inner.publish(dp_rank=0, kv_used_blocks=7) + logger.inner.publish(dp_rank=5, kv_used_blocks=7) endpoint = SimpleNamespace() logger.bind_endpoint(endpoint) @@ -189,6 +211,38 @@ async def test_deferred_logger_starts_with_fresh_metrics_state(monkeypatch): assert logger._endpoint_task is not None await logger._endpoint_task - publishers[0].publish.assert_called_once_with(dp_rank=0, kv_used_blocks=7) + publishers[0].publish.assert_called_once_with(dp_rank=5, kv_used_blocks=7) publishers[0].create_endpoint.assert_not_called() publishers[1].create_endpoint.assert_awaited_once_with(endpoint) + + metric_labels = { + prometheus_names.labels.MODEL: "test-model", + prometheus_names.labels.COMPONENT: "prefill", + prometheus_names.labels.DP_RANK: "5", + } + total_blocks_name = ( + f"{prometheus_names.name_prefix.COMPONENT}_" + f"{prometheus_names.kvstats.TOTAL_BLOCKS}" + ) + cache_usage_name = ( + f"{prometheus_names.name_prefix.COMPONENT}_" + f"{prometheus_names.kvstats.GPU_CACHE_USAGE_PERCENT}" + ) + + logger.set_num_gpu_block(400) + logger.init_publish() + assert registry.get_sample_value(total_blocks_name, metric_labels) == 400 + assert registry.get_sample_value(cache_usage_name, metric_labels) == 0.0 + + logger.record(SimpleNamespace(kv_cache_usage=0.25), None) + assert registry.get_sample_value(total_blocks_name, metric_labels) == 400 + assert registry.get_sample_value(cache_usage_name, metric_labels) == 0.25 + + logger.record(SimpleNamespace(kv_cache_usage=0.0), None) + assert registry.get_sample_value(total_blocks_name, metric_labels) == 400 + assert registry.get_sample_value(cache_usage_name, metric_labels) == 0.0 + assert publishers[1].publish.call_args_list == [ + call(5, kv_used_blocks=0), + call(5, kv_used_blocks=100), + call(5, kv_used_blocks=0), + ] diff --git a/components/src/dynamo/vllm/tests/test_vllm_worker_factory.py b/components/src/dynamo/vllm/tests/test_vllm_worker_factory.py index f8c2e4797074..32c2f09ffcf7 100644 --- a/components/src/dynamo/vllm/tests/test_vllm_worker_factory.py +++ b/components/src/dynamo/vllm/tests/test_vllm_worker_factory.py @@ -1114,21 +1114,32 @@ async def _noop(*_args, **_kwargs) -> None: @pytest.mark.asyncio @pytest.mark.parametrize("lora_enabled", [True, False]) -async def test_prefill_serves_lora_lifecycle_endpoints_when_enabled( +@pytest.mark.parametrize("snapshot_mode", [True, False]) +async def test_prefill_initializes_metrics_and_serves_lora_lifecycle( monkeypatch: pytest.MonkeyPatch, + tmp_path, lora_enabled: bool, + snapshot_mode: bool, ) -> None: engine_client = Mock() - vllm_config = Mock(additional_config={}) + vllm_config = Mock( + additional_config={}, + cache_config=SimpleNamespace(num_gpu_blocks=96), + ) engine_tuple: EngineSetupResult = ( engine_client, vllm_config, Mock(), - "/tmp/prom", + str(tmp_path / "prometheus"), Mock(), ) + stat_logger = Mock() + snapshot_engine: SnapshotEngineSetupResult | None = ( + (engine_tuple, stat_logger) if snapshot_mode else None + ) + setup_vllm_engine = Mock(return_value=engine_tuple) factory = WorkerFactory( - setup_vllm_engine_fn=Mock(return_value=engine_tuple), + setup_vllm_engine_fn=setup_vllm_engine, setup_kv_event_publisher_fn=Mock(return_value=None), register_vllm_model_fn=AsyncMock(), setup_fpm_relay_fn=Mock(return_value=None), @@ -1155,6 +1166,13 @@ async def _noop(*_args, **_kwargs) -> None: monkeypatch.setattr( "dynamo.vllm.worker_factory.configure_kv_event_block_size", _noop ) + monkeypatch.setattr( + "dynamo.vllm.worker_factory.get_dp_range_for_worker", lambda _config: (3, 2) + ) + stat_logger_factory = Mock(return_value=stat_logger) + monkeypatch.setattr( + "dynamo.vllm.worker_factory.StatLoggerFactory", stat_logger_factory + ) endpoints: dict[str, Mock] = {} @@ -1187,8 +1205,26 @@ def _endpoint(name: str) -> Mock: config, asyncio.Event(), shutdown_endpoints, + snapshot_engine=snapshot_engine, ) + if snapshot_mode: + stat_logger_factory.assert_not_called() + setup_vllm_engine.assert_not_called() + stat_logger.bind_endpoint.assert_called_once_with( + endpoints["dyn.prefill.generate"] + ) + else: + stat_logger_factory.assert_called_once_with( + endpoint=endpoints["dyn.prefill.generate"] + ) + setup_vllm_engine.assert_called_once_with( + config, stat_logger, fpm_worker_id="cid" + ) + stat_logger.bind_endpoint.assert_not_called() + stat_logger.set_num_gpu_blocks_all.assert_called_once_with(48) + stat_logger.init_publish.assert_called_once_with() + lifecycle_names = { "dyn.prefill.load_lora", "dyn.prefill.unload_lora", diff --git a/components/src/dynamo/vllm/worker_factory.py b/components/src/dynamo/vllm/worker_factory.py index 330e0d0873d9..adf8bb9f1fd2 100644 --- a/components/src/dynamo/vllm/worker_factory.py +++ b/components/src/dynamo/vllm/worker_factory.py @@ -1565,9 +1565,8 @@ async def _run_prefill_worker( # Use pre-created engine if provided (checkpoint mode), otherwise create new fpm_worker_id = str(generate_endpoint.connection_id()) - snapshot_factory: Optional[StatLoggerFactory] = None if snapshot_engine is not None: - engine_setup, snapshot_factory = snapshot_engine + engine_setup, factory = snapshot_engine ( engine_client, vllm_config, @@ -1575,30 +1574,30 @@ async def _run_prefill_worker( prometheus_temp_dir, _component_gauges, ) = engine_setup - snapshot_factory.bind_endpoint(generate_endpoint) + factory.bind_endpoint(generate_endpoint) # TODO: The scheduler in the child process still has worker_id="" # because the engine was forked before the runtime existed. # Propagating the new ID to the child requires shared memory or # a restart of the EngineCore process. os.environ[ENV_FPM_WORKER_ID] = fpm_worker_id else: + factory = StatLoggerFactory(endpoint=generate_endpoint) ( engine_client, vllm_config, default_sampling_params, prometheus_temp_dir, _component_gauges, - ) = self.setup_vllm_engine(config, fpm_worker_id=fpm_worker_id) + ) = self.setup_vllm_engine(config, factory, fpm_worker_id=fpm_worker_id) await configure_kv_event_block_size(engine_client, vllm_config) - if snapshot_factory is not None: - _, dp_size = get_dp_range_for_worker(vllm_config) - per_rank_num_gpu_blocks = per_rank_kv_blocks( - vllm_config.cache_config.num_gpu_blocks, - dp_size, - ) - snapshot_factory.set_num_gpu_blocks_all(per_rank_num_gpu_blocks or 0) - snapshot_factory.init_publish() + _, dp_size = get_dp_range_for_worker(vllm_config) + per_rank_num_gpu_blocks = per_rank_kv_blocks( + vllm_config.cache_config.num_gpu_blocks, + dp_size, + ) + factory.set_num_gpu_blocks_all(per_rank_num_gpu_blocks or 0) + factory.init_publish() encode_worker_client = await self._maybe_get_encode_worker_client( runtime, config diff --git a/tests/serve/test_vllm.py b/tests/serve/test_vllm.py index 01c5003b1ef4..75394243f17e 100644 --- a/tests/serve/test_vllm.py +++ b/tests/serve/test_vllm.py @@ -365,11 +365,17 @@ class VLLMConfig(EngineConfig): pytest.mark.core, pytest.mark.gpu_2, pytest.mark.pre_merge, - ], # TODO: profile to get max_vram and timeout + pytest.mark.timeout(720), # 3x ~240s local runtime + ], # TODO: profile to get max_vram model="Qwen/Qwen3-0.6B", request_payloads=[ chat_payload_default(), completion_payload_default(), + metric_payload_default( + min_num_requests=1, + backend="vllm", + port=DefaultPort.SYSTEM2.value, + ), ], ), "disaggregated_same_gpu": VLLMConfig( From e5394022b67f69a0c8d59427524270d91decd661 Mon Sep 17 00:00:00 2001 From: Pavithra Vijayakrishnan <160681768+pvijayakrish@users.noreply.github.com> Date: Mon, 21 Sep 2026 10:33:36 -0700 Subject: [PATCH 136/191] ci(release): push GA Helm charts to NGC OCI as well as ChartMuseum (#13657) Signed-off-by: pvijayakrish --- .github/workflows/release.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2c3958e48852..ef8993f2a033 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -554,6 +554,14 @@ jobs: if: env.NIGHTLY != 'true' env: NGC_HELM_REPO: https://helm.ngc.nvidia.com/${{ secrets.NGC_PUBLISH_ORG }}/ai-dynamo + # OCI mirror of the same staging namespace. ChartMuseum and OCI are + # SEPARATE registries in NGC — a chart in one is invisible from the + # other — so a GA release that only cm-pushes leaves the OCI copy + # missing, and the OCI publishing MR has nothing to promote. The + # nightly step below has dual-pushed since it was written; this step + # did not, which is why every GA chart through 1.4.0 is + # ChartMuseum-only. + NGC_HELM_OCI_REPO: oci://nvcr.io/${{ secrets.NGC_PUBLISH_ORG }}/ai-dynamo NGC_TOKEN: ${{ secrets.NGC_PUBLISH_TOKEN }} NGC_USERNAME: ${{ secrets.NGC_PUBLISH_USERNAME }} HELM_CHART_VERSION: ${{ needs.prepare-release.outputs.helm_chart_version }} @@ -592,6 +600,22 @@ jobs: helm cm-push "${CHART_FILE}" "${REPO_ALIAS}" echo "- \`${CHART_NAME}:${HELM_CHART_VERSION}\` pushed to NGC Helm registry" >> $GITHUB_STEP_SUMMARY + # Same tarball, second registry. helm does not read docker's login for + # OCI, so this needs its own registry login. Fail-soft: ChartMuseum is + # still the primary distribution channel and has already succeeded by + # this point, so an OCI hiccup must not fail the release. The GitLab + # publish:helm-oci:ondemand job probes for this copy and fails loudly + # if it is missing, so a soft failure here cannot ship silently. + echo "Pushing ${CHART_FILE} to NGC OCI registry..." + if echo "${NGC_TOKEN}" | helm registry login nvcr.io \ + --username "${NGC_USERNAME}" --password-stdin \ + && helm push "${CHART_FILE}" "${NGC_HELM_OCI_REPO}"; then + echo "- \`${CHART_NAME}:${HELM_CHART_VERSION}\` pushed to NGC OCI (\`${NGC_HELM_OCI_REPO}/${CHART_NAME}\`)" >> $GITHUB_STEP_SUMMARY + else + echo "::warning::OCI push of ${CHART_FILE} failed — the ChartMuseum copy is unaffected. Re-run this job or push by hand before the OCI publishing MR." + echo "- :warning: \`${CHART_NAME}:${HELM_CHART_VERSION}\` OCI push FAILED (ChartMuseum copy is fine)" >> $GITHUB_STEP_SUMMARY + fi + helm repo remove "${REPO_ALIAS}" # Nightly: package the platform chart at the dated pre-release version From 3e486515bc07a34d605332d06f00e35957e47b8e Mon Sep 17 00:00:00 2001 From: VincyZhang Date: Tue, 22 Sep 2026 02:11:44 +0800 Subject: [PATCH 137/191] chore(xpu): upgrade vLLM and Omni to 0.29.0 (#15033) Signed-off-by: wenxin.zhang Signed-off-by: Wenxin Zhang Signed-off-by: VincyZhang --- .../src/dynamo/vllm/omni/base_handler.py | 7 +- container/compliance/base_sboms/manifest.json | 12 +- ...> vllm-openai-xpu@96db42e2-amd64.cdx.json} | 42465 +++++++++------- container/context.yaml | 9 +- 4 files changed, 24856 insertions(+), 17637 deletions(-) rename container/compliance/base_sboms/{vllm-openai-xpu@3309c2e1-amd64.cdx.json => vllm-openai-xpu@96db42e2-amd64.cdx.json} (75%) diff --git a/components/src/dynamo/vllm/omni/base_handler.py b/components/src/dynamo/vllm/omni/base_handler.py index fb98f17f2bd3..93e79c1e2bf8 100644 --- a/components/src/dynamo/vllm/omni/base_handler.py +++ b/components/src/dynamo/vllm/omni/base_handler.py @@ -146,9 +146,9 @@ def _build_omni_kwargs(self, config) -> Dict[str, Any]: # source in engine_args while forwarding them to Omni's diffusion # topology explicitly. if DiffusionParallelConfig is not None: - # Compatibility workaround for the XPU image's vLLM-Omni 0.27 pin - # in container/context.yaml. Remove this filtering when that pin is - # bumped to a version supporting every OmniParallelKwargs field. + # Older installed Omni versions can lack newly added parallel + # options. Ignore unsupported default values, but reject explicit + # non-default values rather than silently changing configuration. parallel_kwargs = dataclasses.asdict(config.parallel) supported_parallel_fields = { field.name for field in dataclasses.fields(DiffusionParallelConfig) @@ -180,7 +180,6 @@ def _build_omni_kwargs(self, config) -> Dict[str, Any]: for field, value in parallel_kwargs.items() if field in supported_parallel_fields } - parallel_config = DiffusionParallelConfig( tensor_parallel_size=getattr( config.engine_args, "tensor_parallel_size", 1 diff --git a/container/compliance/base_sboms/manifest.json b/container/compliance/base_sboms/manifest.json index 5b1a43a33906..8daa99bcab38 100644 --- a/container/compliance/base_sboms/manifest.json +++ b/container/compliance/base_sboms/manifest.json @@ -56,13 +56,13 @@ "platform": "linux/amd64" }, { - "baseline_digest": "sha256:3309c2e1f7b1048fea9f392423afd91080c9f9e63796692872cff477e2562220", + "baseline_digest": "sha256:96db42e248d48760a4937eb3d04c4878b39d13a9814efea95d510393e097a901", "baseline_image": "vllm/vllm-openai-xpu", - "baseline_sbom": "vllm-openai-xpu@3309c2e1-amd64.cdx.json", - "baseline_tag": "v0.27.1", - "from_digest": "sha256:3309c2e1f7b1048fea9f392423afd91080c9f9e63796692872cff477e2562220", + "baseline_sbom": "vllm-openai-xpu@96db42e2-amd64.cdx.json", + "baseline_tag": "v0.29.0", + "from_digest": "sha256:96db42e248d48760a4937eb3d04c4878b39d13a9814efea95d510393e097a901", "from_image": "vllm/vllm-openai-xpu", - "from_tag": "v0.27.1", + "from_tag": "v0.29.0", "platform": "linux/amd64" }, { @@ -162,6 +162,6 @@ "platform": "platform pinned for layer-prefix verification, e.g. linux/amd64" }, "format": "CycloneDX 1.6 JSON, slim filter (drop properties/hashes/dependencies; keep evidence). Hard cap 5 MB per file.", - "generated_at": "2026-09-08T22:54:27+00:00", + "generated_at": "2026-09-18T02:12:55+00:00", "schema_version": 2 } diff --git a/container/compliance/base_sboms/vllm-openai-xpu@3309c2e1-amd64.cdx.json b/container/compliance/base_sboms/vllm-openai-xpu@96db42e2-amd64.cdx.json similarity index 75% rename from container/compliance/base_sboms/vllm-openai-xpu@3309c2e1-amd64.cdx.json rename to container/compliance/base_sboms/vllm-openai-xpu@96db42e2-amd64.cdx.json index 7a8059f5cb21..33729f9deaa8 100644 --- a/container/compliance/base_sboms/vllm-openai-xpu@3309c2e1-amd64.cdx.json +++ b/container/compliance/base_sboms/vllm-openai-xpu@96db42e2-amd64.cdx.json @@ -3,73842 +3,78252 @@ "bomFormat": "CycloneDX", "components": [ { - "bom-ref": "6fa8d5f488e31182", + "bom-ref": "3961279d5bddcfd9", "name": "/etc/OpenCL/vendors/intel.icd", "type": "file" }, { - "bom-ref": "1577650e26501af4", + "bom-ref": "f03f044608684c79", + "name": "/etc/PackageKit/PackageKit.conf", + "type": "file" + }, + { + "bom-ref": "81db6958567ee144", + "name": "/etc/PackageKit/Vendor.conf", + "type": "file" + }, + { + "bom-ref": "c5fd271f8e201bf4", "name": "/etc/X11/Xreset", "type": "file" }, { - "bom-ref": "eab411f85d24a41b", + "bom-ref": "260068cd8f4a0eb3", "name": "/etc/X11/Xreset.d/README", "type": "file" }, { - "bom-ref": "36e6261f9a0f3ff2", + "bom-ref": "65751787561474aa", "name": "/etc/X11/Xresources/x11-common", "type": "file" }, { - "bom-ref": "4e8e08e624450be5", + "bom-ref": "28cd1aa8975fe365", "name": "/etc/X11/Xsession", "type": "file" }, { - "bom-ref": "454f457b7c434fce", + "bom-ref": "3e580dea4e90c162", "name": "/etc/X11/Xsession.d/20x11-common_process-args", "type": "file" }, { - "bom-ref": "feb99c2481472201", + "bom-ref": "4d697913a872a84d", "name": "/etc/X11/Xsession.d/30x11-common_xresources", "type": "file" }, { - "bom-ref": "a5a937b9f0fc333b", + "bom-ref": "e189df5323b68fbb", "name": "/etc/X11/Xsession.d/35x11-common_xhost-local", "type": "file" }, { - "bom-ref": "53b0b31255e6422b", + "bom-ref": "87d0af376fc6f683", "name": "/etc/X11/Xsession.d/40x11-common_xsessionrc", "type": "file" }, { - "bom-ref": "a7f019a29b6fb356", + "bom-ref": "b095bdd8e75ceb7e", "name": "/etc/X11/Xsession.d/50x11-common_determine-startup", "type": "file" }, { - "bom-ref": "fe123ef7bed06159", + "bom-ref": "15568f0f09b8505d", "name": "/etc/X11/Xsession.d/60x11-common_xdg_path", "type": "file" }, { - "bom-ref": "c899aab8b185a74f", + "bom-ref": "9d9ac7d39c2ae7d7", "name": "/etc/X11/Xsession.d/90x11-common_ssh-agent", "type": "file" }, { - "bom-ref": "7630ff16c6e05ddf", + "bom-ref": "e443532dbb4102cb", "name": "/etc/X11/Xsession.d/99x11-common_start", "type": "file" }, { - "bom-ref": "a2236b5544df725c", + "bom-ref": "d05616685926c040", "name": "/etc/X11/Xsession.options", "type": "file" }, { - "bom-ref": "7291550077b71760", + "bom-ref": "2d00f74db1daccf8", "name": "/etc/X11/rgb.txt", "type": "file" }, { - "bom-ref": "6aecbbcb060854b2", + "bom-ref": "761b4351ff4fab64", "name": "/etc/adduser.conf", "type": "file" }, { - "bom-ref": "e906bd8d161880d3", + "bom-ref": "f04643246eb7ab95", "name": "/etc/alternatives/README", "type": "file" }, { - "bom-ref": "1ae75d4366d8e531", + "bom-ref": "0316c6a10a8462ab", "name": "/etc/apt/apt.conf.d/01-vendor-ubuntu", "type": "file" }, { - "bom-ref": "93dd2b2a44727566", + "bom-ref": "f4b94596efd90e14", "name": "/etc/apt/apt.conf.d/01autoremove", "type": "file" }, { - "bom-ref": "1ef6ce44ce5f3186", + "bom-ref": "30659e06d2f07d62", + "name": "/etc/apt/apt.conf.d/20packagekit", + "type": "file" + }, + { + "bom-ref": "3402f769ea958308", "name": "/etc/apt/apt.conf.d/70debconf", "type": "file" }, { - "bom-ref": "40fb510251fc8fa9", + "bom-ref": "74293d9ba49e6597", "name": "/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg", "type": "file" }, { - "bom-ref": "6fb89f7de8378963", + "bom-ref": "9efccb4ba1b7e501", "name": "/etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg", "type": "file" }, { - "bom-ref": "091ebdc73c00fe0d", + "bom-ref": "bbe1d399683936ab", "name": "/etc/bash.bashrc", "type": "file" }, { - "bom-ref": "fda1ba4536211f26", + "bom-ref": "0c2ba3d8927db0c2", "name": "/etc/bash_completion.d/git-prompt", "type": "file" }, { - "bom-ref": "7f6283dda4abc9c9", + "bom-ref": "f126c0b03baa121f", "name": "/etc/bindresvport.blacklist", "type": "file" }, { - "bom-ref": "28d86f8fe70cd42f", + "bom-ref": "79ebaaca68413959", "name": "/etc/cron.d/e2scrub_all", "type": "file" }, { - "bom-ref": "3876720ccc43b4f4", + "bom-ref": "f930863663c3c92e", "name": "/etc/cron.daily/apt-compat", "type": "file" }, { - "bom-ref": "57885561fb9780fa", + "bom-ref": "e64da0a5df532f84", "name": "/etc/cron.daily/dpkg", "type": "file" }, { - "bom-ref": "a44f5adf214c4673", + "bom-ref": "3a7fe5f0963b6580", + "name": "/etc/dbus-1/system.d/com.ubuntu.SoftwareProperties.conf", + "type": "file" + }, + { + "bom-ref": "48d10fa5c323ff79", "name": "/etc/debconf.conf", "type": "file" }, { - "bom-ref": "79628a298a427468", + "bom-ref": "b1fc398cca29d272", "name": "/etc/debian_version", "type": "file" }, { - "bom-ref": "74650ea746ea2e40", + "bom-ref": "afa9af20f7180a95", + "name": "/etc/default/dbus", + "type": "file" + }, + { + "bom-ref": "0d77f87e4ca03d92", "name": "/etc/default/useradd", "type": "file" }, { - "bom-ref": "cbb2984cab5ec99d", + "bom-ref": "58e4295a910284b3", "name": "/etc/deluser.conf", "type": "file" }, { - "bom-ref": "bb6dd948aaf0863a", + "bom-ref": "3dc9e864fa3c104c", "name": "/etc/dpkg/dpkg.cfg", "type": "file" }, { - "bom-ref": "bca81d8aed07a466", + "bom-ref": "230e76ab35dc3640", "name": "/etc/dpkg/origins/debian", "type": "file" }, { - "bom-ref": "d50c8aa3d4d8867b", + "bom-ref": "c1760a40ffbca4e5", "name": "/etc/dpkg/origins/ubuntu", "type": "file" }, { - "bom-ref": "433b688dc38c8798", + "bom-ref": "0bcd9fc53c9d9a20", "name": "/etc/dpkg/shlibs.default", "type": "file" }, { - "bom-ref": "3b34a574d94acb70", + "bom-ref": "d6c2abf92f0eb24c", "name": "/etc/dpkg/shlibs.override", "type": "file" }, { - "bom-ref": "e1728d8325daf66c", + "bom-ref": "5c1612a8d3548772", "name": "/etc/e2scrub.conf", "type": "file" }, { - "bom-ref": "26fc670b4af9cb8b", + "bom-ref": "198e1830d4906bab", "name": "/etc/ethertypes", "type": "file" }, { - "bom-ref": "076b2bdc498010cf", + "bom-ref": "13975ed3ec5f6d53", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-lgc-sans-mono.conf", "type": "file" }, { - "bom-ref": "bea48c06047e1927", + "bom-ref": "0baacf1676368207", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-lgc-sans.conf", "type": "file" }, { - "bom-ref": "cf2ca5330b3a4141", + "bom-ref": "515b070e4ce00911", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-lgc-serif.conf", "type": "file" }, { - "bom-ref": "0160c51b33bcadc7", + "bom-ref": "5ef3b1b76f50afb3", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-sans-mono.conf", "type": "file" }, { - "bom-ref": "00ba8702907bcaf2", + "bom-ref": "b58485e587bca7ce", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-sans.conf", "type": "file" }, { - "bom-ref": "c715ce10d2505355", + "bom-ref": "421ea03e450d9b6d", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-serif.conf", "type": "file" }, { - "bom-ref": "aa1e7c5c0af678ec", + "bom-ref": "f3ba0dfa4f936470", "name": "/etc/fonts/conf.avail/57-dejavu-sans-mono.conf", "type": "file" }, { - "bom-ref": "e257bf8e5c446db8", + "bom-ref": "bd1e5eceb6e66578", "name": "/etc/fonts/conf.avail/57-dejavu-sans.conf", "type": "file" }, { - "bom-ref": "b8b4ef4a3dbc8b21", + "bom-ref": "ad98191f764d97cd", "name": "/etc/fonts/conf.avail/57-dejavu-serif.conf", "type": "file" }, { - "bom-ref": "83ac3e79df795aa0", + "bom-ref": "2a86b09793b4527c", "name": "/etc/fonts/conf.avail/58-dejavu-lgc-sans-mono.conf", "type": "file" }, { - "bom-ref": "c8077e696c07be80", + "bom-ref": "35ca64800d545bc4", "name": "/etc/fonts/conf.avail/58-dejavu-lgc-sans.conf", "type": "file" }, { - "bom-ref": "93d6e90b2226f629", + "bom-ref": "b7581f4e28f10ff9", "name": "/etc/fonts/conf.avail/58-dejavu-lgc-serif.conf", "type": "file" }, { - "bom-ref": "9dc12a7cf1e6ee5c", + "bom-ref": "93f47f511a9d5ffc", "name": "/etc/fonts/conf.d/README", "type": "file" }, { - "bom-ref": "69879777d61d5583", + "bom-ref": "fd22e32a2a0f632b", "name": "/etc/fonts/fonts.conf", "type": "file" }, { - "bom-ref": "9593304878ceb672", + "bom-ref": "144c372fdf7315b8", "name": "/etc/gai.conf", "type": "file" }, { - "bom-ref": "0a6ca8735f2ad8c6", + "bom-ref": "f20585e47c5ea0c4", "name": "/etc/gnutls/config", "type": "file" }, { - "bom-ref": "1d2ed681829c9bfa", + "bom-ref": "26eadc48837791f2", "name": "/etc/gprofng.rc", "type": "file" }, { - "bom-ref": "2e8bb8a7a8b7b99e", + "bom-ref": "34f0e043183291f0", "name": "/etc/host.conf", "type": "file" }, { - "bom-ref": "7abd5aa56b465006", + "bom-ref": "9c0474b4dc3a4384", + "name": "/etc/init.d/dbus", + "type": "file" + }, + { + "bom-ref": "13ea89f564f4900a", "name": "/etc/init.d/iwpmd", "type": "file" }, { - "bom-ref": "790650ea683634c0", + "bom-ref": "32526888cccab5f2", "name": "/etc/init.d/procps", "type": "file" }, { - "bom-ref": "b33241e22f442e68", + "bom-ref": "2cd09d9921b4704c", "name": "/etc/init.d/x11-common", "type": "file" }, { - "bom-ref": "62d6dd71367234d6", + "bom-ref": "b876224f0a22da78", "name": "/etc/issue", "type": "file" }, { - "bom-ref": "9c964803d435a09d", + "bom-ref": "630901b821898f4f", "name": "/etc/issue.net", "type": "file" }, { - "bom-ref": "a3fa927fa5e9dc6a", + "bom-ref": "0a6835ee113e3492", "name": "/etc/iwpmd.conf", "type": "file" }, { - "bom-ref": "9dd4bf6da5a6cc9d", + "bom-ref": "399a6df807af5513", "name": "/etc/ld.so.conf", "type": "file" }, { - "bom-ref": "83d2d4c18c6d7112", + "bom-ref": "0856b3aaea7f94c4", "name": "/etc/ld.so.conf.d/libc.conf", "type": "file" }, { - "bom-ref": "136e710493d9a54a", + "bom-ref": "5b351a82ad3e138c", "name": "/etc/ld.so.conf.d/x86_64-linux-gnu.conf", "type": "file" }, { - "bom-ref": "4d2ce2bcee1add38", + "bom-ref": "32e511fb94930c1e", "name": "/etc/legal", "type": "file" }, { - "bom-ref": "444919b6011ffa21", + "bom-ref": "42f971bf624809ef", "name": "/etc/libaudit.conf", "type": "file" }, { - "bom-ref": "3ffd3cd48591f1d2", + "bom-ref": "0e83dff0be89a4c2", "name": "/etc/libibverbs.d/bnxt_re.driver", "type": "file" }, { - "bom-ref": "109957ca567004ed", + "bom-ref": "cc98e97029601f91", "name": "/etc/libibverbs.d/cxgb4.driver", "type": "file" }, { - "bom-ref": "62b3fd08ab550061", + "bom-ref": "f163a2181f0366fd", "name": "/etc/libibverbs.d/efa.driver", "type": "file" }, { - "bom-ref": "c084be501d54e7ac", + "bom-ref": "06d8f9efffde3744", "name": "/etc/libibverbs.d/erdma.driver", "type": "file" }, { - "bom-ref": "5de396afce839cda", + "bom-ref": "3f2f7850f8fef626", "name": "/etc/libibverbs.d/hfi1verbs.driver", "type": "file" }, { - "bom-ref": "804b0f8dcd9a1fdf", + "bom-ref": "e325cd721189111f", "name": "/etc/libibverbs.d/hns.driver", "type": "file" }, { - "bom-ref": "dcb1cfec23877018", + "bom-ref": "d75859203c651754", "name": "/etc/libibverbs.d/ipathverbs.driver", "type": "file" }, { - "bom-ref": "b0c22ab7e6a99f5f", + "bom-ref": "f459d1bb25e84573", "name": "/etc/libibverbs.d/irdma.driver", "type": "file" }, { - "bom-ref": "b9b2dd8c7cd4faef", + "bom-ref": "bad6cb6e864d7f4f", "name": "/etc/libibverbs.d/mana.driver", "type": "file" }, { - "bom-ref": "b597cd8944e1274f", + "bom-ref": "78883538f9de76f7", "name": "/etc/libibverbs.d/mlx4.driver", "type": "file" }, { - "bom-ref": "7f36b9b0b622341a", + "bom-ref": "8ccecef8c9c70c16", "name": "/etc/libibverbs.d/mlx5.driver", "type": "file" }, { - "bom-ref": "0ac1ea08d300a76b", + "bom-ref": "51fdc9e711dd6ca7", "name": "/etc/libibverbs.d/mthca.driver", "type": "file" }, { - "bom-ref": "1b188b62d04c00b7", + "bom-ref": "a3d33d5614f17253", "name": "/etc/libibverbs.d/ocrdma.driver", "type": "file" }, { - "bom-ref": "3ab01204b53ee8e4", + "bom-ref": "387d45976a3adc78", "name": "/etc/libibverbs.d/qedr.driver", "type": "file" }, { - "bom-ref": "8ea71f1240683ecd", + "bom-ref": "cc8b3ee8e60a7e11", "name": "/etc/libibverbs.d/rxe.driver", "type": "file" }, { - "bom-ref": "a6a52aeaa7e49090", + "bom-ref": "baf8f713b7b443e4", "name": "/etc/libibverbs.d/siw.driver", "type": "file" }, { - "bom-ref": "052cca1195b338b4", + "bom-ref": "9a7ba0ed707fe740", "name": "/etc/libibverbs.d/vmw_pvrdma.driver", "type": "file" }, { - "bom-ref": "a9947bac9e9718cb", + "bom-ref": "6b782f6ae54b9dd7", "name": "/etc/libnl-3/classid", "type": "file" }, { - "bom-ref": "1bc50a316c02f0ee", + "bom-ref": "79fbd4b001e61a72", "name": "/etc/libnl-3/pktloc", "type": "file" }, { - "bom-ref": "b0b5bfd269bed313", + "bom-ref": "bba68cb2dd70dd11", "name": "/etc/login.defs", "type": "file" }, { - "bom-ref": "2297ce51e3d4f38e", + "bom-ref": "10eca681ab20ee20", "name": "/etc/logrotate.d/alternatives", "type": "file" }, { - "bom-ref": "566ea5868d0961ef", + "bom-ref": "724d1a9b1a2c3281", "name": "/etc/logrotate.d/apt", "type": "file" }, { - "bom-ref": "2a03a344990d1a9c", + "bom-ref": "2c64b299744aa332", "name": "/etc/logrotate.d/dpkg", "type": "file" }, { - "bom-ref": "2d3377724a2d83d6", + "bom-ref": "dd5779e8cc36c6a0", "name": "/etc/lsb-release", "type": "file" }, { - "bom-ref": "b5e2538183229d44", + "bom-ref": "117e19f351a4e430", "name": "/etc/mime.types", "type": "file" }, { - "bom-ref": "e459ec76d42b8c21", + "bom-ref": "5ceb4478e6b32ab7", "name": "/etc/mke2fs.conf", "type": "file" }, { - "bom-ref": "099bcca4845ffe72", + "bom-ref": "95af2c9cefce8546", "name": "/etc/modprobe.d/mlx4.conf", "type": "file" }, { - "bom-ref": "6249ffd0b8db2dee", + "bom-ref": "2125dad8e566d87a", "name": "/etc/modprobe.d/truescale.conf", "type": "file" }, { - "bom-ref": "6182a7cbbecfcb80", + "bom-ref": "e23356f5b5d7796c", "name": "/etc/openal/alsoft.conf", "type": "file" }, { - "bom-ref": "1e6e14427d78a9c6", + "bom-ref": "c4580ec13820fd54", "name": "/etc/pam.conf", "type": "file" }, { - "bom-ref": "35174031ed14d7d7", + "bom-ref": "c0990dec9acb17c9", "name": "/etc/pam.d/chfn", "type": "file" }, { - "bom-ref": "acbcb9a5bcc56939", + "bom-ref": "3e04a8b60d4e5c67", "name": "/etc/pam.d/chpasswd", "type": "file" }, { - "bom-ref": "e644d06be587807f", + "bom-ref": "a62f642fb16e19b1", "name": "/etc/pam.d/chsh", "type": "file" }, { - "bom-ref": "9f6fbbb027046577", + "bom-ref": "98ef88598a70d23d", "name": "/etc/pam.d/login", "type": "file" }, { - "bom-ref": "69787451d2e9b53a", + "bom-ref": "8dc1e0325b113280", "name": "/etc/pam.d/newusers", "type": "file" }, { - "bom-ref": "2c55a8ce272c016a", + "bom-ref": "6ddb59dd73bc61f0", "name": "/etc/pam.d/other", "type": "file" }, { - "bom-ref": "884ed737fb140dae", + "bom-ref": "d749500ec867d380", "name": "/etc/pam.d/passwd", "type": "file" }, { - "bom-ref": "d96e637828719df4", + "bom-ref": "ec614d6faab59b26", "name": "/etc/pam.d/runuser", "type": "file" }, { - "bom-ref": "99485c767100face", + "bom-ref": "9bf76bdf8602d57c", "name": "/etc/pam.d/runuser-l", "type": "file" }, { - "bom-ref": "a01e3209bfa455e5", + "bom-ref": "218143f410662bc3", "name": "/etc/pam.d/su", "type": "file" }, { - "bom-ref": "0cd206a9e3414a53", + "bom-ref": "388266e05e76e831", "name": "/etc/pam.d/su-l", "type": "file" }, { - "bom-ref": "ad1253c971f96237", + "bom-ref": "6644f19608b6197f", "name": "/etc/perl/Net/libnet.cfg", "type": "file" }, { - "bom-ref": "c1437db0bf8419a0", + "bom-ref": "7a7b0bd6b2a00dd2", "name": "/etc/profile.d/01-locale-fix.sh", "type": "file" }, { - "bom-ref": "004969eb89bb5e4a", + "bom-ref": "84184a633d2e9d76", "name": "/etc/protocols", "type": "file" }, { - "bom-ref": "61f344b181c47695", + "bom-ref": "5ff1548a7f32e6e1", "name": "/etc/pulse/client.conf", "type": "file" }, { - "bom-ref": "90bbbb295d05fba6", + "bom-ref": "73e8bbd0e24b0002", "name": "/etc/python3.12/sitecustomize.py", "type": "file" }, { - "bom-ref": "b3c92a6e4d973aec", + "bom-ref": "55655c48d1e96914", "name": "/etc/rdma/modules/infiniband.conf", "type": "file" }, { - "bom-ref": "5fe5d2f14cde95fb", + "bom-ref": "20eed8c40c9a194f", "name": "/etc/rdma/modules/iwarp.conf", "type": "file" }, { - "bom-ref": "db077e8c8ef9c2ab", + "bom-ref": "9e36d6cf554dd39b", "name": "/etc/rdma/modules/iwpmd.conf", "type": "file" }, { - "bom-ref": "aad2f9e48778d544", + "bom-ref": "4de21953ea83ef48", "name": "/etc/rdma/modules/opa.conf", "type": "file" }, { - "bom-ref": "defaeafa9a79e9b9", + "bom-ref": "316638df387dfb8d", "name": "/etc/rdma/modules/rdma.conf", "type": "file" }, { - "bom-ref": "a2631319edcb1265", + "bom-ref": "8dd0c0ac5f233eed", "name": "/etc/rdma/modules/roce.conf", "type": "file" }, { - "bom-ref": "703d98ab5ce94f4d", + "bom-ref": "ea01e031e7806105", "name": "/etc/rpc", "type": "file" }, { - "bom-ref": "ba53dcbe66aeb802", + "bom-ref": "f1d73ee05d82d250", "name": "/etc/security/access.conf", "type": "file" }, { - "bom-ref": "aae004eb3a24a1ee", + "bom-ref": "34e616ebb3b2f87c", "name": "/etc/security/faillock.conf", "type": "file" }, { - "bom-ref": "dce5d9540b90790b", + "bom-ref": "ef20c6fbe09bcdad", "name": "/etc/security/group.conf", "type": "file" }, { - "bom-ref": "83cd90f5aedb18eb", + "bom-ref": "e712d7a1d5a0d2a5", "name": "/etc/security/limits.conf", "type": "file" }, { - "bom-ref": "f3c868ff361be8f4", + "bom-ref": "25a80d003bc7956a", "name": "/etc/security/namespace.conf", "type": "file" }, { - "bom-ref": "07cf02f186297ac0", + "bom-ref": "740caae2c9aec7ae", "name": "/etc/security/namespace.init", "type": "file" }, { - "bom-ref": "4c0ef2e9cee18968", + "bom-ref": "e755c2e2e14effa6", "name": "/etc/security/pam_env.conf", "type": "file" }, { - "bom-ref": "2a248e6091985035", + "bom-ref": "309344d8e1e95acf", "name": "/etc/security/pwhistory.conf", "type": "file" }, { - "bom-ref": "66b7f603b8264e5e", + "bom-ref": "c2240b3f4507bac4", "name": "/etc/security/sepermit.conf", "type": "file" }, { - "bom-ref": "f8a3d32739b7cf64", + "bom-ref": "020358ca93e76962", "name": "/etc/security/time.conf", "type": "file" }, { - "bom-ref": "28847f803a1df565", + "bom-ref": "2bbb14e00b37863f", "name": "/etc/selinux/semanage.conf", "type": "file" }, { - "bom-ref": "a286fd237a8aea17", + "bom-ref": "4f458ed58fe163bf", "name": "/etc/sensors.d/.placeholder", "type": "file" }, { - "bom-ref": "e2437bb775df7126", + "bom-ref": "5c373228d6971406", "name": "/etc/sensors3.conf", "type": "file" }, { - "bom-ref": "32cdfb44e0503325", + "bom-ref": "e9450e7f464360ed", "name": "/etc/services", "type": "file" }, { - "bom-ref": "5b1b2e43adfcb939", + "bom-ref": "71d965f16b007ec4", + "name": "/etc/sgml/xml-core.cat", + "type": "file" + }, + { + "bom-ref": "e3fb071a9ba2ef97", "name": "/etc/skel/.bash_logout", "type": "file" }, { - "bom-ref": "65d728bc601f9a77", + "bom-ref": "74d902cca07a98a9", "name": "/etc/skel/.bashrc", "type": "file" }, { - "bom-ref": "9e72449aa7c8bbcb", + "bom-ref": "bdf7fc101da8d53d", "name": "/etc/skel/.profile", "type": "file" }, { - "bom-ref": "5ea0f8b7d44535f4", + "bom-ref": "2d15d1cb665bfb90", "name": "/etc/ssl/openssl.cnf", "type": "file" }, { - "bom-ref": "f9b82f8cb314742c", + "bom-ref": "7a51fd4c766fa986", "name": "/etc/sysctl.conf", "type": "file" }, { - "bom-ref": "1e64442555ad54fe", + "bom-ref": "556006d1c9f95518", "name": "/etc/sysctl.d/10-bufferbloat.conf", "type": "file" }, { - "bom-ref": "8563ea7c9659d3f8", + "bom-ref": "8e8f94fca98d7956", "name": "/etc/sysctl.d/10-console-messages.conf", "type": "file" }, { - "bom-ref": "8b09636f0c7cba68", + "bom-ref": "cf15f32fa3537702", "name": "/etc/sysctl.d/10-ipv6-privacy.conf", "type": "file" }, { - "bom-ref": "bfd1b24762cb8419", + "bom-ref": "057de15608d3c083", "name": "/etc/sysctl.d/10-kernel-hardening.conf", "type": "file" }, { - "bom-ref": "44b939c677677be2", + "bom-ref": "6996ade11895d244", "name": "/etc/sysctl.d/10-magic-sysrq.conf", "type": "file" }, { - "bom-ref": "ee7e224fdff49bdb", + "bom-ref": "4ca3fdaaaa234965", "name": "/etc/sysctl.d/10-map-count.conf", "type": "file" }, { - "bom-ref": "5ca7b1eb00d2c570", + "bom-ref": "3ba8c6883753857e", "name": "/etc/sysctl.d/10-network-security.conf", "type": "file" }, { - "bom-ref": "9de48d0fdd44ed60", + "bom-ref": "631ee6508fb78e12", "name": "/etc/sysctl.d/10-ptrace.conf", "type": "file" }, { - "bom-ref": "d3a1360cceb3fcb1", + "bom-ref": "1b67fc367f306267", "name": "/etc/sysctl.d/10-zeropage.conf", "type": "file" }, { - "bom-ref": "b014a85ee5e4b4a7", + "bom-ref": "b728c16bac8c94c5", "name": "/etc/sysctl.d/README.sysctl", "type": "file" }, { - "bom-ref": "9d6f2077ea8173ec", + "bom-ref": "b3b08bad530b84f6", "name": "/etc/systemd/journald.conf", "type": "file" }, { - "bom-ref": "200e6c4a74e3743b", + "bom-ref": "14fac602e3e476a5", "name": "/etc/systemd/logind.conf", "type": "file" }, { - "bom-ref": "0974130d383026e5", + "bom-ref": "6c50dd0e3cff37bb", "name": "/etc/systemd/networkd.conf", "type": "file" }, { - "bom-ref": "4e4dd83cd6d72b33", + "bom-ref": "394acbc8a5a62c95", "name": "/etc/systemd/pstore.conf", "type": "file" }, { - "bom-ref": "f4bb9b09baf0af71", + "bom-ref": "5297320b3c83247b", "name": "/etc/systemd/sleep.conf", "type": "file" }, { - "bom-ref": "526d88a3216c81b8", + "bom-ref": "6e0b125424cdca4e", "name": "/etc/systemd/system.conf", "type": "file" }, { - "bom-ref": "bc52ee8f6a1e3178", + "bom-ref": "3fff0b656fded12a", "name": "/etc/systemd/user.conf", "type": "file" }, { - "bom-ref": "512cee9e2e14e9e8", + "bom-ref": "facecdbe7ad07b26", "name": "/etc/terminfo/README", "type": "file" }, { - "bom-ref": "a5e9eff6b024300c", + "bom-ref": "4a92fb3b2f28fe0c", "name": "/etc/udev/iocost.conf", "type": "file" }, { - "bom-ref": "08834a75102ef2a6", + "bom-ref": "05547e48ac86a6a6", "name": "/etc/udev/udev.conf", "type": "file" }, { - "bom-ref": "a501977008770410", + "bom-ref": "a6a991246f72e31e", "name": "/etc/update-motd.d/00-header", "type": "file" }, { - "bom-ref": "2ed45c04a3a3408b", + "bom-ref": "98f339aef7753a6d", "name": "/etc/update-motd.d/10-help-text", "type": "file" }, { - "bom-ref": "0168a80e0a784d85", + "bom-ref": "97d4e390a7da4ed7", "name": "/etc/update-motd.d/50-motd-news", "type": "file" }, { - "bom-ref": "52b86acb57d6d766", + "bom-ref": "fba338523ea3ef96", "name": "/etc/vdpau_wrapper.cfg", "type": "file" }, { - "bom-ref": "a487ee4f16d98299", + "bom-ref": "098b104c915fc3b5", "name": "/etc/vim/vimrc", "type": "file" }, { - "bom-ref": "4440cc698154fe78", + "bom-ref": "a69d69a07ffb4d58", "name": "/etc/wgetrc", "type": "file" }, { - "bom-ref": "c7c379b911aa5b3c", + "bom-ref": "89830ce66bb883de", "name": "/etc/xattr.conf", "type": "file" }, { - "bom-ref": "f38cfd347a45de18", - "name": "/opt/venv/lib/python3.12/site-packages/DataProperty-1.1.0.dist-info/METADATA", + "bom-ref": "66a33e6809e4d9a0", + "name": "/opt/venv/lib/python3.12/site-packages/absl_py-2.5.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "09d970c35617fbdb", - "name": "/opt/venv/lib/python3.12/site-packages/DataProperty-1.1.0.dist-info/RECORD", + "bom-ref": "1a5ef831f0a603ea", + "name": "/opt/venv/lib/python3.12/site-packages/absl_py-2.5.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4459ebb5604c6366", - "name": "/opt/venv/lib/python3.12/site-packages/DataProperty-1.1.0.dist-info/top_level.txt", + "bom-ref": "4a86b1b144f82292", + "name": "/opt/venv/lib/python3.12/site-packages/accelerate-1.14.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e4d029e8b56e4d60", - "name": "/opt/venv/lib/python3.12/site-packages/PyStemmer-3.0.0.dist-info/METADATA", + "bom-ref": "f2872715e81a6085", + "name": "/opt/venv/lib/python3.12/site-packages/accelerate-1.14.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "24e2473ad17e489a", - "name": "/opt/venv/lib/python3.12/site-packages/PyStemmer-3.0.0.dist-info/RECORD", + "bom-ref": "4d004a688bc8a98d", + "name": "/opt/venv/lib/python3.12/site-packages/accelerate-1.14.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "adb4e2595ae7a90a", - "name": "/opt/venv/lib/python3.12/site-packages/PyStemmer-3.0.0.dist-info/top_level.txt", + "bom-ref": "c9fa8844d2582e86", + "name": "/opt/venv/lib/python3.12/site-packages/agent_detector-2.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ad7fcc473e11cf81", - "name": "/opt/venv/lib/python3.12/site-packages/absl_py-2.4.0.dist-info/METADATA", + "bom-ref": "732db27bbdf3ab3d", + "name": "/opt/venv/lib/python3.12/site-packages/agent_detector-2.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c73a00056e893de9", - "name": "/opt/venv/lib/python3.12/site-packages/absl_py-2.4.0.dist-info/RECORD", + "bom-ref": "d1abf607a0440067", + "name": "/opt/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.7.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9ac4ff37f8616a36", - "name": "/opt/venv/lib/python3.12/site-packages/accelerate-1.13.0.dist-info/METADATA", + "bom-ref": "f867abc58af199cf", + "name": "/opt/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.7.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cf6136219a3e8481", - "name": "/opt/venv/lib/python3.12/site-packages/accelerate-1.13.0.dist-info/RECORD", + "bom-ref": "e2eb0f6d47435aba", + "name": "/opt/venv/lib/python3.12/site-packages/aiohttp-3.14.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6a13bdc158b96b89", - "name": "/opt/venv/lib/python3.12/site-packages/accelerate-1.13.0.dist-info/top_level.txt", + "bom-ref": "f3189806d35e5897", + "name": "/opt/venv/lib/python3.12/site-packages/aiohttp-3.14.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "65e98b34fbaf413e", - "name": "/opt/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/METADATA", + "bom-ref": "61eec5f64ffb6211", + "name": "/opt/venv/lib/python3.12/site-packages/aiohttp-3.14.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6afe31a033f6dd23", - "name": "/opt/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/RECORD", + "bom-ref": "b25a8a2b26eb3e3f", + "name": "/opt/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "614e6599ad6020b5", - "name": "/opt/venv/lib/python3.12/site-packages/aiohttp-3.13.4.dist-info/METADATA", + "bom-ref": "517922e470b7086a", + "name": "/opt/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "24046c3bf7b808d2", - "name": "/opt/venv/lib/python3.12/site-packages/aiohttp-3.13.4.dist-info/RECORD", + "bom-ref": "7176c9c4828641c5", + "name": "/opt/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "28106dbed1038cf5", - "name": "/opt/venv/lib/python3.12/site-packages/aiohttp-3.13.4.dist-info/top_level.txt", + "bom-ref": "ce36b4c0a55cb757", + "name": "/opt/venv/lib/python3.12/site-packages/albucore-0.0.24.dist-info/METADATA", "type": "file" }, { - "bom-ref": "dc766e7147f3f745", - "name": "/opt/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/METADATA", + "bom-ref": "5e932b2e4521e8cc", + "name": "/opt/venv/lib/python3.12/site-packages/albucore-0.0.24.dist-info/RECORD", "type": "file" }, { - "bom-ref": "43f9919bc18574f0", - "name": "/opt/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/RECORD", + "bom-ref": "77e35872ed959afd", + "name": "/opt/venv/lib/python3.12/site-packages/albucore-0.0.24.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6a47a9690c815bf3", - "name": "/opt/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/top_level.txt", + "bom-ref": "d24f2f8d44e048b6", + "name": "/opt/venv/lib/python3.12/site-packages/albumentations-2.0.8.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "bda0f7e75b7d401a", + "name": "/opt/venv/lib/python3.12/site-packages/albumentations-2.0.8.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "a7a6583826695a1b", + "name": "/opt/venv/lib/python3.12/site-packages/albumentations-2.0.8.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "cb5a8a0364753f7a", - "name": "/opt/venv/lib/python3.12/site-packages/albumentations-1.4.6.dist-info/METADATA", + "bom-ref": "ed9b1612b3624696", + "name": "/opt/venv/lib/python3.12/site-packages/annotated_doc-0.0.5.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "a81acdd5969b5cd5", + "name": "/opt/venv/lib/python3.12/site-packages/annotated_doc-0.0.5.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "95015281f7836899", + "name": "/opt/venv/lib/python3.12/site-packages/annotated_types-0.8.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "9e43859eea12a66f", + "name": "/opt/venv/lib/python3.12/site-packages/annotated_types-0.8.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "3470e39b947226e4", + "name": "/opt/venv/lib/python3.12/site-packages/anthropic-0.122.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "fd63d1804cba7562", + "name": "/opt/venv/lib/python3.12/site-packages/anthropic-0.122.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "fe84ba4a0083edac", + "name": "/opt/venv/lib/python3.12/site-packages/anyio-4.14.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "2eb292a6c6ed6706", + "name": "/opt/venv/lib/python3.12/site-packages/anyio-4.14.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "b889fa244cd5803e", + "name": "/opt/venv/lib/python3.12/site-packages/anyio-4.14.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "6890d2b26ec655fd", + "name": "/opt/venv/lib/python3.12/site-packages/apache_tvm_ffi-0.1.13.post3.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "1e2d4d9649b2283d", + "name": "/opt/venv/lib/python3.12/site-packages/apache_tvm_ffi-0.1.13.post3.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "03ea83d049916b69", + "name": "/opt/venv/lib/python3.12/site-packages/arctic_inference-0.2.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "ea8a1547cbf49167", + "name": "/opt/venv/lib/python3.12/site-packages/arctic_inference-0.2.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "5d45958b52e9396b", + "name": "/opt/venv/lib/python3.12/site-packages/arctic_inference-0.2.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "198da274abc53df1", + "name": "/opt/venv/lib/python3.12/site-packages/astor-0.8.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "c2ff15d31078383b", + "name": "/opt/venv/lib/python3.12/site-packages/astor-0.8.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "4e82f5cfcbe1573c", + "name": "/opt/venv/lib/python3.12/site-packages/astor-0.8.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "fe455becb9bee0f5", + "name": "/opt/venv/lib/python3.12/site-packages/attrs-26.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "35c90f105ed8c5b5", + "name": "/opt/venv/lib/python3.12/site-packages/attrs-26.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "4e01c804a49c7c1c", + "name": "/opt/venv/lib/python3.12/site-packages/audioread-3.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "fd9de5319b91127a", + "name": "/opt/venv/lib/python3.12/site-packages/audioread-3.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "8e3d410026996e96", + "name": "/opt/venv/lib/python3.12/site-packages/auto_round_lib-0.14.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "6877a2894e4d97bd", + "name": "/opt/venv/lib/python3.12/site-packages/auto_round_lib-0.14.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "b46a86daa6a31b96", + "name": "/opt/venv/lib/python3.12/site-packages/auto_round_lib-0.14.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "1e6adc5b2783b67e", + "name": "/opt/venv/lib/python3.12/site-packages/blake3-1.0.9.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "4cef099629cabf75", + "name": "/opt/venv/lib/python3.12/site-packages/blake3-1.0.9.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "220f5db5d49b5f6d", + "name": "/opt/venv/lib/python3.12/site-packages/blobfile-3.2.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "a5920a86b8f7b0ab", + "name": "/opt/venv/lib/python3.12/site-packages/blobfile-3.2.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "9c9ab454d9cfe505", + "name": "/opt/venv/lib/python3.12/site-packages/blobfile-3.2.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "b764cf50edfe971d", + "name": "/opt/venv/lib/python3.12/site-packages/bm25s-0.3.10.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "1437b360f235043d", + "name": "/opt/venv/lib/python3.12/site-packages/bm25s-0.3.10.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "64e135b9d21c3db3", + "name": "/opt/venv/lib/python3.12/site-packages/bm25s-0.3.10.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "c26434040e701c5a", + "name": "/opt/venv/lib/python3.12/site-packages/bounded_pool_executor-0.0.3.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "8ff9dbffc77ef308", + "name": "/opt/venv/lib/python3.12/site-packages/bounded_pool_executor-0.0.3.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "e5e5983a164bffb8", + "name": "/opt/venv/lib/python3.12/site-packages/bounded_pool_executor-0.0.3.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "ed9b2bfeacf0c18d", + "name": "/opt/venv/lib/python3.12/site-packages/cachetools-7.1.7.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "852d8067a394c037", + "name": "/opt/venv/lib/python3.12/site-packages/cachetools-7.1.7.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "a442930e63fd8733", + "name": "/opt/venv/lib/python3.12/site-packages/cachetools-7.1.7.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "0ccbd0c80376ee19", + "name": "/opt/venv/lib/python3.12/site-packages/cbor2-6.1.4.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "de70e9c1ca48c7c9", + "name": "/opt/venv/lib/python3.12/site-packages/cbor2-6.1.4.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "60d05eed460e2ad4", + "name": "/opt/venv/lib/python3.12/site-packages/cbor2-6.1.4.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "20c709714e98735a", + "name": "/opt/venv/lib/python3.12/site-packages/certifi-2026.7.22.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "1dea6e6c6d61e755", + "name": "/opt/venv/lib/python3.12/site-packages/certifi-2026.7.22.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "537714577ef5dac3", + "name": "/opt/venv/lib/python3.12/site-packages/certifi-2026.7.22.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "d676d8f8842fdb48", + "name": "/opt/venv/lib/python3.12/site-packages/cffi-2.1.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "5715fdc85de2ade8", + "name": "/opt/venv/lib/python3.12/site-packages/cffi-2.1.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "68aa61045f191bc2", + "name": "/opt/venv/lib/python3.12/site-packages/cffi-2.1.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "e216eeb184bbe5dc", + "name": "/opt/venv/lib/python3.12/site-packages/chardet-6.0.0.post1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "2659a9a50c6c5617", + "name": "/opt/venv/lib/python3.12/site-packages/chardet-6.0.0.post1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "3976e2a4e7be162d", + "name": "/opt/venv/lib/python3.12/site-packages/charset_normalizer-3.5.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "88a0c94b5e09008e", + "name": "/opt/venv/lib/python3.12/site-packages/charset_normalizer-3.5.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "36d2900b2817bf89", + "name": "/opt/venv/lib/python3.12/site-packages/charset_normalizer-3.5.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "ecfa99d1625f049e", + "name": "/opt/venv/lib/python3.12/site-packages/chz-0.4.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "ef26773c84e54faf", + "name": "/opt/venv/lib/python3.12/site-packages/chz-0.4.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "f664b838b88365d2", + "name": "/opt/venv/lib/python3.12/site-packages/chz-0.4.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "45f92387c1a44593", + "name": "/opt/venv/lib/python3.12/site-packages/click-8.4.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "ccc9a93581eac434", + "name": "/opt/venv/lib/python3.12/site-packages/click-8.4.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "83aa915d8412a6e5", + "name": "/opt/venv/lib/python3.12/site-packages/cloudpickle-3.1.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "292aab56e1b4f636", + "name": "/opt/venv/lib/python3.12/site-packages/cloudpickle-3.1.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "5e3f7d96fb52a0c6", + "name": "/opt/venv/lib/python3.12/site-packages/cmake-4.4.3.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "d5a88bffdebfca5e", + "name": "/opt/venv/lib/python3.12/site-packages/cmake-4.4.3.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "d847a3649d92f2b5", + "name": "/opt/venv/lib/python3.12/site-packages/colorama-0.4.6.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "ebe23deefead0be7", + "name": "/opt/venv/lib/python3.12/site-packages/colorama-0.4.6.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "a243cf18fab5afb3", + "name": "/opt/venv/lib/python3.12/site-packages/compressed_tensors-0.17.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "c6184a6569fce01f", + "name": "/opt/venv/lib/python3.12/site-packages/compressed_tensors-0.17.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "34f82766ea51d4b0", + "name": "/opt/venv/lib/python3.12/site-packages/compressed_tensors-0.17.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "869f112e23412f42", + "name": "/opt/venv/lib/python3.12/site-packages/compressed_tensors/transform/utils/hadamards.safetensors", "type": "file" }, { - "bom-ref": "22cc9d3b2037fd59", - "name": "/opt/venv/lib/python3.12/site-packages/albumentations-1.4.6.dist-info/RECORD", + "bom-ref": "ae859aa094c6c2c6", + "name": "/opt/venv/lib/python3.12/site-packages/coverage-7.15.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "72234ad259004bed", - "name": "/opt/venv/lib/python3.12/site-packages/albumentations-1.4.6.dist-info/top_level.txt", + "bom-ref": "e13a5e2717c3c2da", + "name": "/opt/venv/lib/python3.12/site-packages/coverage-7.15.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5f299b6c47a244b4", - "name": "/opt/venv/lib/python3.12/site-packages/annotated_doc-0.0.4.dist-info/METADATA", + "bom-ref": "272a243cc3434b06", + "name": "/opt/venv/lib/python3.12/site-packages/coverage-7.15.4.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "86c33875655b4974", - "name": "/opt/venv/lib/python3.12/site-packages/annotated_doc-0.0.4.dist-info/RECORD", + "bom-ref": "b6c019f9ca0efb11", + "name": "/opt/venv/lib/python3.12/site-packages/cryptography-50.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b6e101d3bad7446a", - "name": "/opt/venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/METADATA", + "bom-ref": "bffaf95cd7c600e6", + "name": "/opt/venv/lib/python3.12/site-packages/cryptography-50.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "472607ccd7cf2482", - "name": "/opt/venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/RECORD", + "bom-ref": "ba0c9a2fbc12f23e", + "name": "/opt/venv/lib/python3.12/site-packages/dataproperty-1.1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6f32ba1cdbb229c5", - "name": "/opt/venv/lib/python3.12/site-packages/anthropic-0.112.0.dist-info/METADATA", + "bom-ref": "c690180e899d95aa", + "name": "/opt/venv/lib/python3.12/site-packages/dataproperty-1.1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "fdba118eb2b3c76b", - "name": "/opt/venv/lib/python3.12/site-packages/anthropic-0.112.0.dist-info/RECORD", + "bom-ref": "8678c0db63b91c15", + "name": "/opt/venv/lib/python3.12/site-packages/dataproperty-1.1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "4173645eaf48529f", - "name": "/opt/venv/lib/python3.12/site-packages/anyio-4.13.0.dist-info/METADATA", + "bom-ref": "119a6bbbdfea5e67", + "name": "/opt/venv/lib/python3.12/site-packages/datasets-5.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5cdb59865d7afb4c", - "name": "/opt/venv/lib/python3.12/site-packages/anyio-4.13.0.dist-info/RECORD", + "bom-ref": "52e5d89c1d1e0b2c", + "name": "/opt/venv/lib/python3.12/site-packages/datasets-5.0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "0d8a9e81586a8f21", - "name": "/opt/venv/lib/python3.12/site-packages/anyio-4.13.0.dist-info/top_level.txt", + "bom-ref": "14e92ec57277cfdc", + "name": "/opt/venv/lib/python3.12/site-packages/datasets-5.0.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "5352fdae009ddc47", - "name": "/opt/venv/lib/python3.12/site-packages/apache_tvm_ffi-0.1.12.dist-info/METADATA", + "bom-ref": "048f9a832778388c", + "name": "/opt/venv/lib/python3.12/site-packages/decorator-5.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0259fd363e0dc438", - "name": "/opt/venv/lib/python3.12/site-packages/apache_tvm_ffi-0.1.12.dist-info/RECORD", + "bom-ref": "e06488706b77c19f", + "name": "/opt/venv/lib/python3.12/site-packages/decorator-5.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1cc78fabbfabd075", - "name": "/opt/venv/lib/python3.12/site-packages/arctic_inference-0.1.1.dist-info/METADATA", + "bom-ref": "c772f60c3207c884", + "name": "/opt/venv/lib/python3.12/site-packages/decorator-5.3.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "ec9b5c8d13ef2010", - "name": "/opt/venv/lib/python3.12/site-packages/arctic_inference-0.1.1.dist-info/RECORD", + "bom-ref": "8e2e1328ee9d4436", + "name": "/opt/venv/lib/python3.12/site-packages/defusedxml-0.7.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7d132a03aad41c99", - "name": "/opt/venv/lib/python3.12/site-packages/arctic_inference-0.1.1.dist-info/top_level.txt", + "bom-ref": "5ab600583050d71a", + "name": "/opt/venv/lib/python3.12/site-packages/defusedxml-0.7.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c559292b5eaee693", - "name": "/opt/venv/lib/python3.12/site-packages/astor-0.8.1.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "e44f70a3cb63e281", - "name": "/opt/venv/lib/python3.12/site-packages/astor-0.8.1.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "9bdf024430e5c446", - "name": "/opt/venv/lib/python3.12/site-packages/astor-0.8.1.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "75bab8e9fd41308b", - "name": "/opt/venv/lib/python3.12/site-packages/attrs-26.1.0.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "68beae7b89ba20e3", - "name": "/opt/venv/lib/python3.12/site-packages/attrs-26.1.0.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "a822eddf0e13de6c", - "name": "/opt/venv/lib/python3.12/site-packages/audioread-3.0.1.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "53d2c3899e758a6a", - "name": "/opt/venv/lib/python3.12/site-packages/audioread-3.0.1.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "12d8accbaa97d720", - "name": "/opt/venv/lib/python3.12/site-packages/auto_round_lib-0.14.2.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "a0f083886b69e36f", - "name": "/opt/venv/lib/python3.12/site-packages/auto_round_lib-0.14.2.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "1aa60e391769407c", - "name": "/opt/venv/lib/python3.12/site-packages/auto_round_lib-0.14.2.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "a0f4731d0a544034", - "name": "/opt/venv/lib/python3.12/site-packages/blake3-1.0.9.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "ff4ebc7003dd21e3", - "name": "/opt/venv/lib/python3.12/site-packages/blake3-1.0.9.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "6c93cd02f4603637", - "name": "/opt/venv/lib/python3.12/site-packages/blobfile-3.0.0.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "881c790f974d60d9", - "name": "/opt/venv/lib/python3.12/site-packages/blobfile-3.0.0.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "9269e25f6aff66a2", - "name": "/opt/venv/lib/python3.12/site-packages/blobfile-3.0.0.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "2bea573e066491ad", - "name": "/opt/venv/lib/python3.12/site-packages/bm25s-0.2.13.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "736bbe0aced749bd", - "name": "/opt/venv/lib/python3.12/site-packages/bm25s-0.2.13.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "7cf0113a60eab2b1", - "name": "/opt/venv/lib/python3.12/site-packages/bm25s-0.2.13.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "3f15465145a45dac", - "name": "/opt/venv/lib/python3.12/site-packages/bounded_pool_executor-0.0.3.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "7ee02fe71f65b0b6", - "name": "/opt/venv/lib/python3.12/site-packages/bounded_pool_executor-0.0.3.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "322aaeb856fbe002", - "name": "/opt/venv/lib/python3.12/site-packages/bounded_pool_executor-0.0.3.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "f64c7bfe973dccfd", - "name": "/opt/venv/lib/python3.12/site-packages/cachetools-7.1.4.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "63a4f082d33d5c60", - "name": "/opt/venv/lib/python3.12/site-packages/cachetools-7.1.4.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "24de59d30d999eab", - "name": "/opt/venv/lib/python3.12/site-packages/cachetools-7.1.4.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "ad9187dff744d1ed", - "name": "/opt/venv/lib/python3.12/site-packages/cbor2-6.1.2.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "f798daffc611a4d1", - "name": "/opt/venv/lib/python3.12/site-packages/cbor2-6.1.2.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "084c9e4d352ba32a", - "name": "/opt/venv/lib/python3.12/site-packages/cbor2-6.1.2.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "8109fffaeb3af5a3", - "name": "/opt/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "aef5bc9415efd856", - "name": "/opt/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "d2d8f8e02fe3a5e1", - "name": "/opt/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "7af243815ed1b7ba", - "name": "/opt/venv/lib/python3.12/site-packages/cffi-2.0.0.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "649ec299d7b3477c", - "name": "/opt/venv/lib/python3.12/site-packages/cffi-2.0.0.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "6427eccfe9298612", - "name": "/opt/venv/lib/python3.12/site-packages/cffi-2.0.0.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "bef8b7e12852355e", - "name": "/opt/venv/lib/python3.12/site-packages/chardet-5.2.0.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "3b90eefafd78e343", - "name": "/opt/venv/lib/python3.12/site-packages/chardet-5.2.0.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "e1a28c142af127ac", - "name": "/opt/venv/lib/python3.12/site-packages/chardet-5.2.0.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "c21dfdc656acece7", - "name": "/opt/venv/lib/python3.12/site-packages/charset_normalizer-3.4.6.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "27a288a21446aa27", - "name": "/opt/venv/lib/python3.12/site-packages/charset_normalizer-3.4.6.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "d3cc0150d37a40e8", - "name": "/opt/venv/lib/python3.12/site-packages/charset_normalizer-3.4.6.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "a8b05dff3e4750b8", - "name": "/opt/venv/lib/python3.12/site-packages/chz-0.4.0.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "503ff2f94c706add", - "name": "/opt/venv/lib/python3.12/site-packages/chz-0.4.0.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "eb7ceefd823bf01c", - "name": "/opt/venv/lib/python3.12/site-packages/chz-0.4.0.dist-info/top_level.txt", + "bom-ref": "d3e1b8b651c79439", + "name": "/opt/venv/lib/python3.12/site-packages/defusedxml-0.7.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1b36e299597670f5", - "name": "/opt/venv/lib/python3.12/site-packages/click-8.4.2.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "adc0f7d3af0b8cd2", - "name": "/opt/venv/lib/python3.12/site-packages/click-8.4.2.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "44405d4727fec4e7", - "name": "/opt/venv/lib/python3.12/site-packages/cloudpickle-3.1.2.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "581231a9cdb6fc5c", - "name": "/opt/venv/lib/python3.12/site-packages/cloudpickle-3.1.2.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "041d0d88764fd7ab", - "name": "/opt/venv/lib/python3.12/site-packages/cmake-4.4.2.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "63d7ac079f25f120", - "name": "/opt/venv/lib/python3.12/site-packages/cmake-4.4.2.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "1138940062ecdd53", - "name": "/opt/venv/lib/python3.12/site-packages/colorama-0.4.6.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "9736941f7d3afc79", - "name": "/opt/venv/lib/python3.12/site-packages/colorama-0.4.6.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "0ead0fb339905179", - "name": "/opt/venv/lib/python3.12/site-packages/compressed_tensors-0.17.0.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "27834685ca87e0d5", - "name": "/opt/venv/lib/python3.12/site-packages/compressed_tensors-0.17.0.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "38d9a085286cd1e6", - "name": "/opt/venv/lib/python3.12/site-packages/compressed_tensors-0.17.0.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "90495ba5cbe7947c", - "name": "/opt/venv/lib/python3.12/site-packages/compressed_tensors/transform/utils/hadamards.safetensors", - "type": "file" - }, - { - "bom-ref": "6ca27df3c4a825ba", - "name": "/opt/venv/lib/python3.12/site-packages/coverage-7.13.5.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "a8b93c1d48d64f7f", - "name": "/opt/venv/lib/python3.12/site-packages/coverage-7.13.5.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "b1c53bae7651fcb0", - "name": "/opt/venv/lib/python3.12/site-packages/coverage-7.13.5.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "bf5703aa91f73596", - "name": "/opt/venv/lib/python3.12/site-packages/cryptography-49.0.0.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "fbc00eb8bc77b632", - "name": "/opt/venv/lib/python3.12/site-packages/cryptography-49.0.0.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "ceb81a8e0c5164c6", - "name": "/opt/venv/lib/python3.12/site-packages/datasets-4.8.4.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "62fd8759ee91f03d", - "name": "/opt/venv/lib/python3.12/site-packages/datasets-4.8.4.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "8f75d3a5a9d4d8bb", - "name": "/opt/venv/lib/python3.12/site-packages/datasets-4.8.4.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "3f92866ff4cb3c1a", - "name": "/opt/venv/lib/python3.12/site-packages/decorator-5.2.1.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "3dbbbf9b40c4a411", - "name": "/opt/venv/lib/python3.12/site-packages/decorator-5.2.1.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "7dcd432500ed4959", - "name": "/opt/venv/lib/python3.12/site-packages/decorator-5.2.1.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "0162c4c3663d1758", + "bom-ref": "6b81333b9efde6a6", "name": "/opt/venv/lib/python3.12/site-packages/depyf-0.20.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "01140a21cd8b0fae", + "bom-ref": "b6d21dfaba805404", "name": "/opt/venv/lib/python3.12/site-packages/depyf-0.20.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7c47d3bd8fa67407", + "bom-ref": "e9d698570daae835", "name": "/opt/venv/lib/python3.12/site-packages/depyf-0.20.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "13f53e2260134075", + "bom-ref": "d6121ae76dc7885f", "name": "/opt/venv/lib/python3.12/site-packages/detect_installer-0.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a0b5cb13b76c8d92", + "bom-ref": "7399264ddc912c68", "name": "/opt/venv/lib/python3.12/site-packages/detect_installer-0.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5ee67b34d23c949c", + "bom-ref": "777fc2cb081fad36", "name": "/opt/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3701c15ee858217f", + "bom-ref": "d71ec05d70c1ed29", "name": "/opt/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d010336c1da04807", + "bom-ref": "aec48ba2e662c1d5", "name": "/opt/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1392b37256255b44", + "bom-ref": "74e516cb376f594e", "name": "/opt/venv/lib/python3.12/site-packages/distro-1.9.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "fdc3f2902827460d", + "bom-ref": "84bf50d413cd708f", "name": "/opt/venv/lib/python3.12/site-packages/distro-1.9.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2feeb94edf77333b", + "bom-ref": "af5c8cf1ccda75e5", "name": "/opt/venv/lib/python3.12/site-packages/distro-1.9.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "aeda22770088401f", + "bom-ref": "d945a6188899ab75", "name": "/opt/venv/lib/python3.12/site-packages/dnspython-2.8.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a52c3296a43ae62f", + "bom-ref": "f196fd95e9b2b431", "name": "/opt/venv/lib/python3.12/site-packages/dnspython-2.8.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9d66a7c56962364e", - "name": "/opt/venv/lib/python3.12/site-packages/docker-7.1.0.dist-info/METADATA", + "bom-ref": "3d4c3b38f92f9bac", + "name": "/opt/venv/lib/python3.12/site-packages/docker-7.2.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "248760d5c2d925fb", - "name": "/opt/venv/lib/python3.12/site-packages/docker-7.1.0.dist-info/RECORD", + "bom-ref": "663acd74585969e1", + "name": "/opt/venv/lib/python3.12/site-packages/docker-7.2.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "70b559c1a97f6ce1", + "bom-ref": "a30d76cb307d41c7", "name": "/opt/venv/lib/python3.12/site-packages/docopt-0.6.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cef10154e6f7df69", + "bom-ref": "13f2330cf0a40187", "name": "/opt/venv/lib/python3.12/site-packages/docopt-0.6.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4cb2ac39d5c15d3d", + "bom-ref": "0c3ab905cf29994f", "name": "/opt/venv/lib/python3.12/site-packages/docopt-0.6.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1caf16daa09cc5a6", + "bom-ref": "c2152f597c195b5c", "name": "/opt/venv/lib/python3.12/site-packages/docstring_parser-0.18.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "33177a3491e8c55b", + "bom-ref": "98ebe8b0dfae2ad9", "name": "/opt/venv/lib/python3.12/site-packages/docstring_parser-0.18.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2c7e41fdd77672b4", + "bom-ref": "d4336197f5a0c4e5", "name": "/opt/venv/lib/python3.12/site-packages/dpcpp_cpp_rt-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a14d8b34d9bda53a", + "bom-ref": "8c44b01f9f5efb97", "name": "/opt/venv/lib/python3.12/site-packages/dpcpp_cpp_rt-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "82c7a6218488ac1f", + "bom-ref": "f6964c9d99ea7e0a", "name": "/opt/venv/lib/python3.12/site-packages/dpcpp_cpp_rt-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "be045f0580bcc4ac", + "bom-ref": "f019e9fa496d6c46", "name": "/opt/venv/lib/python3.12/site-packages/einops-0.8.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5a66d84b695db0b2", + "bom-ref": "390bddaddd35231c", "name": "/opt/venv/lib/python3.12/site-packages/einops-0.8.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3c4f54afc7f2f091", + "bom-ref": "47e2c9ef743b9637", "name": "/opt/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c5510b5879838b19", + "bom-ref": "dffa5f5198ab1b43", "name": "/opt/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4c243283b387ac08", + "bom-ref": "54079a74a74478ae", "name": "/opt/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "3224438f91916979", + "bom-ref": "e95c23ca475e96c3", "name": "/opt/venv/lib/python3.12/site-packages/evaluate-0.4.6.dist-info/METADATA", "type": "file" }, { - "bom-ref": "873f578200bf51a7", + "bom-ref": "e195a23d62e92705", "name": "/opt/venv/lib/python3.12/site-packages/evaluate-0.4.6.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6b3dc3cce8f8c148", + "bom-ref": "b1ebbb510f96e0d6", "name": "/opt/venv/lib/python3.12/site-packages/evaluate-0.4.6.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "80b4e8aeddc12187", - "name": "/opt/venv/lib/python3.12/site-packages/fastapi-0.135.2.dist-info/METADATA", + "bom-ref": "fa03d5da565ff18f", + "name": "/opt/venv/lib/python3.12/site-packages/fastapi-0.136.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2b230c3ecc99da79", - "name": "/opt/venv/lib/python3.12/site-packages/fastapi-0.135.2.dist-info/RECORD", + "bom-ref": "7d4ae0be681ca5d6", + "name": "/opt/venv/lib/python3.12/site-packages/fastapi-0.136.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4e0817fa533306dc", - "name": "/opt/venv/lib/python3.12/site-packages/fastapi_cli-0.0.27.dist-info/METADATA", + "bom-ref": "16fb73c0e4349fcd", + "name": "/opt/venv/lib/python3.12/site-packages/fastapi_cli-0.0.32.dist-info/METADATA", "type": "file" }, { - "bom-ref": "38c624bcb06e8702", - "name": "/opt/venv/lib/python3.12/site-packages/fastapi_cli-0.0.27.dist-info/RECORD", + "bom-ref": "50fc183c40db6976", + "name": "/opt/venv/lib/python3.12/site-packages/fastapi_cli-0.0.32.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3747b9c585eb1a73", - "name": "/opt/venv/lib/python3.12/site-packages/fastapi_cloud_cli-0.21.0.dist-info/METADATA", + "bom-ref": "ed18f54726ce8afe", + "name": "/opt/venv/lib/python3.12/site-packages/fastapi_cloud_cli-0.23.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "36729d0dc9aa69d5", - "name": "/opt/venv/lib/python3.12/site-packages/fastapi_cloud_cli-0.21.0.dist-info/RECORD", + "bom-ref": "636b1e3e60266a2f", + "name": "/opt/venv/lib/python3.12/site-packages/fastapi_cloud_cli-0.23.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3b2246b3086531d4", + "bom-ref": "5744a8f7d7ac67f2", "name": "/opt/venv/lib/python3.12/site-packages/fastar-0.11.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "44bc5d51127d55b4", + "bom-ref": "14ef0142cd01c6ce", "name": "/opt/venv/lib/python3.12/site-packages/fastar-0.11.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "68489bff2dee202f", - "name": "/opt/venv/lib/python3.12/site-packages/filelock-3.25.2.dist-info/METADATA", + "bom-ref": "e2d67f36f4cdd02d", + "name": "/opt/venv/lib/python3.12/site-packages/filelock-3.32.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "87aef2b41d1cc217", - "name": "/opt/venv/lib/python3.12/site-packages/filelock-3.25.2.dist-info/RECORD", + "bom-ref": "ee4a8d316cb9e812", + "name": "/opt/venv/lib/python3.12/site-packages/filelock-3.32.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "837ada9060d9b431", + "bom-ref": "a9488b417dd37677", "name": "/opt/venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d4131e81de220e14", + "bom-ref": "b6b0e3f397e2ffaa", "name": "/opt/venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "731dfe1723b3eac1", + "bom-ref": "65fdb0003e3f0ce7", "name": "/opt/venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "636a2302968f9e73", - "name": "/opt/venv/lib/python3.12/site-packages/fsspec-2026.2.0.dist-info/METADATA", + "bom-ref": "1a92c4e799564158", + "name": "/opt/venv/lib/python3.12/site-packages/fsspec-2026.6.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f60338f5dfc12f10", - "name": "/opt/venv/lib/python3.12/site-packages/fsspec-2026.2.0.dist-info/RECORD", + "bom-ref": "16cefcc78ae1966e", + "name": "/opt/venv/lib/python3.12/site-packages/fsspec-2026.6.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "db0bae30e3163043", - "name": "/opt/venv/lib/python3.12/site-packages/googleapis_common_protos-1.75.0.dist-info/METADATA", + "bom-ref": "862c9c4b1577403a", + "name": "/opt/venv/lib/python3.12/site-packages/googleapis_common_protos-1.75.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4cb89e1d92cc0d53", - "name": "/opt/venv/lib/python3.12/site-packages/googleapis_common_protos-1.75.0.dist-info/RECORD", + "bom-ref": "b54549b13faca76d", + "name": "/opt/venv/lib/python3.12/site-packages/googleapis_common_protos-1.75.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "51b1bd8b643a280a", - "name": "/opt/venv/lib/python3.12/site-packages/googleapis_common_protos-1.75.0.dist-info/top_level.txt", + "bom-ref": "47ff92d9be45e879", + "name": "/opt/venv/lib/python3.12/site-packages/googleapis_common_protos-1.75.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "39ed869b7f1e6bfd", - "name": "/opt/venv/lib/python3.12/site-packages/gpt_oss-0.0.8.dist-info/METADATA", + "bom-ref": "6acf2929158f26f8", + "name": "/opt/venv/lib/python3.12/site-packages/gpt_oss-0.0.9.dist-info/METADATA", "type": "file" }, { - "bom-ref": "68b3bf7ce0247434", - "name": "/opt/venv/lib/python3.12/site-packages/gpt_oss-0.0.8.dist-info/RECORD", + "bom-ref": "eff429da8344aed8", + "name": "/opt/venv/lib/python3.12/site-packages/gpt_oss-0.0.9.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e16dff52da9ddb3a", - "name": "/opt/venv/lib/python3.12/site-packages/gpt_oss-0.0.8.dist-info/top_level.txt", + "bom-ref": "9b1d6fc7ae53eef2", + "name": "/opt/venv/lib/python3.12/site-packages/gpt_oss-0.0.9.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "f441dfae3d6a9a71", - "name": "/opt/venv/lib/python3.12/site-packages/graphql_core-3.2.8.dist-info/METADATA", + "bom-ref": "aef0bc1710382de0", + "name": "/opt/venv/lib/python3.12/site-packages/graphql_core-3.2.11.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cf4100460956f32a", - "name": "/opt/venv/lib/python3.12/site-packages/graphql_core-3.2.8.dist-info/RECORD", + "bom-ref": "ac23caee5d81df5b", + "name": "/opt/venv/lib/python3.12/site-packages/graphql_core-3.2.11.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5f2d559f52380bfc", - "name": "/opt/venv/lib/python3.12/site-packages/graphql_core-3.2.8.dist-info/top_level.txt", + "bom-ref": "50ee97a80556d8ed", + "name": "/opt/venv/lib/python3.12/site-packages/graphql_core-3.2.11.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1cdb40e85b8f2512", - "name": "/opt/venv/lib/python3.12/site-packages/grpcio-1.81.1.dist-info/METADATA", + "bom-ref": "a572dce10be24151", + "name": "/opt/venv/lib/python3.12/site-packages/grpcio-1.83.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ea658c92b8fdb729", - "name": "/opt/venv/lib/python3.12/site-packages/grpcio-1.81.1.dist-info/RECORD", + "bom-ref": "f11be6f524d96d04", + "name": "/opt/venv/lib/python3.12/site-packages/grpcio-1.83.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "58f21c9e950d19b5", - "name": "/opt/venv/lib/python3.12/site-packages/grpcio-1.81.1.dist-info/top_level.txt", + "bom-ref": "c5da3c13992a20e6", + "name": "/opt/venv/lib/python3.12/site-packages/grpcio-1.83.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "df3d35271bb9b2f8", - "name": "/opt/venv/lib/python3.12/site-packages/grpcio_tools-1.83.0.dist-info/METADATA", + "bom-ref": "056d0a4dff250fa9", + "name": "/opt/venv/lib/python3.12/site-packages/grpcio_tools-1.83.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1add67616b096e40", - "name": "/opt/venv/lib/python3.12/site-packages/grpcio_tools-1.83.0.dist-info/RECORD", + "bom-ref": "cc3c702cc5bb6f0c", + "name": "/opt/venv/lib/python3.12/site-packages/grpcio_tools-1.83.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "78f4d04f6e47ffa4", - "name": "/opt/venv/lib/python3.12/site-packages/grpcio_tools-1.83.0.dist-info/top_level.txt", + "bom-ref": "e737a641087da6f3", + "name": "/opt/venv/lib/python3.12/site-packages/grpcio_tools-1.83.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9282568dd09298ee", + "bom-ref": "76b9b78cd603f424", "name": "/opt/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f65e0be4e385347d", + "bom-ref": "9589a272d071b143", "name": "/opt/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "72a0daaecce8a541", + "bom-ref": "f9fd355ede757a9f", "name": "/opt/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "be9c856f356abea9", - "name": "/opt/venv/lib/python3.12/site-packages/harfile-0.4.0.dist-info/METADATA", + "bom-ref": "211eec0515d0cecc", + "name": "/opt/venv/lib/python3.12/site-packages/harfile-0.5.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "36bfc6c3824af7d4", - "name": "/opt/venv/lib/python3.12/site-packages/harfile-0.4.0.dist-info/RECORD", + "bom-ref": "6f7fa7c11244f33b", + "name": "/opt/venv/lib/python3.12/site-packages/harfile-0.5.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f3790b7cf4059fe7", - "name": "/opt/venv/lib/python3.12/site-packages/hf_xet-1.5.1.dist-info/METADATA", + "bom-ref": "00ba236e9118bff5", + "name": "/opt/venv/lib/python3.12/site-packages/hf_xet-1.6.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "60e00a97d7014977", - "name": "/opt/venv/lib/python3.12/site-packages/hf_xet-1.5.1.dist-info/RECORD", + "bom-ref": "658fc3da50deed25", + "name": "/opt/venv/lib/python3.12/site-packages/hf_xet-1.6.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5db080770e13a0d9", + "bom-ref": "59b6396119da076f", "name": "/opt/venv/lib/python3.12/site-packages/html2text-2025.4.15.dist-info/METADATA", "type": "file" }, { - "bom-ref": "19e016c198f8b4cc", + "bom-ref": "b4015cf67f1a35ee", "name": "/opt/venv/lib/python3.12/site-packages/html2text-2025.4.15.dist-info/RECORD", "type": "file" }, { - "bom-ref": "512b15124ee307c2", + "bom-ref": "439d975db95841e8", "name": "/opt/venv/lib/python3.12/site-packages/html2text-2025.4.15.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b424276611881917", + "bom-ref": "9fd0d808b95460dd", "name": "/opt/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/METADATA", "type": "file" }, { - "bom-ref": "71c5edc55a33771c", + "bom-ref": "92b7ad05998aafa2", "name": "/opt/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3128a67333cbcee7", + "bom-ref": "7b920fe651a2d525", "name": "/opt/venv/lib/python3.12/site-packages/httpcore2-2.10.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6754d092d899987f", + "bom-ref": "cb9d6a424401c645", "name": "/opt/venv/lib/python3.12/site-packages/httpcore2-2.10.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ac1fa5553fc2691b", + "bom-ref": "18d41c7584fdbe11", "name": "/opt/venv/lib/python3.12/site-packages/httptools-0.8.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "890a484bebfa9a05", + "bom-ref": "c59195a540102b0b", "name": "/opt/venv/lib/python3.12/site-packages/httptools-0.8.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3e3f9af166dfc0ac", + "bom-ref": "48fc489533e7ed26", "name": "/opt/venv/lib/python3.12/site-packages/httptools-0.8.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "df18a8bff3e071c6", + "bom-ref": "983b558b552e17b4", "name": "/opt/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d29ea36bd7997f83", + "bom-ref": "3d728c81853c6fb9", "name": "/opt/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e526ce8df60dea8d", + "bom-ref": "d0fbb44ad0ec370b", "name": "/opt/venv/lib/python3.12/site-packages/httpx2-2.10.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6be0ebb12e680c0a", + "bom-ref": "525fc30432faa198", "name": "/opt/venv/lib/python3.12/site-packages/httpx2-2.10.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6873ff4e3ae8e706", - "name": "/opt/venv/lib/python3.12/site-packages/httpx_sse-0.4.3.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "367916d304ea19ea", - "name": "/opt/venv/lib/python3.12/site-packages/httpx_sse-0.4.3.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "e5c0c69163b6e20f", - "name": "/opt/venv/lib/python3.12/site-packages/httpx_sse-0.4.3.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "a6d8bba1e87cd86f", - "name": "/opt/venv/lib/python3.12/site-packages/huggingface_hub-1.22.0.dist-info/METADATA", + "bom-ref": "46cb04ac3057ad7e", + "name": "/opt/venv/lib/python3.12/site-packages/huggingface_hub-1.28.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8a1a66ffc52ea687", - "name": "/opt/venv/lib/python3.12/site-packages/huggingface_hub-1.22.0.dist-info/RECORD", + "bom-ref": "930e1b60b4c5b79b", + "name": "/opt/venv/lib/python3.12/site-packages/huggingface_hub-1.28.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "84753ff67ae787bb", - "name": "/opt/venv/lib/python3.12/site-packages/huggingface_hub-1.22.0.dist-info/top_level.txt", + "bom-ref": "1dc4974ad9f3de05", + "name": "/opt/venv/lib/python3.12/site-packages/huggingface_hub-1.28.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "336602dc3d1e0df0", - "name": "/opt/venv/lib/python3.12/site-packages/hypothesis-6.151.10.dist-info/METADATA", + "bom-ref": "9b82f5f9e19965ca", + "name": "/opt/venv/lib/python3.12/site-packages/hypothesis-6.165.10.dist-info/METADATA", "type": "file" }, { - "bom-ref": "08bafb5cfcc61b07", - "name": "/opt/venv/lib/python3.12/site-packages/hypothesis-6.151.10.dist-info/RECORD", + "bom-ref": "e3d0726c4f31f163", + "name": "/opt/venv/lib/python3.12/site-packages/hypothesis-6.165.10.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7702e76d2bf2de66", - "name": "/opt/venv/lib/python3.12/site-packages/hypothesis-6.151.10.dist-info/top_level.txt", + "bom-ref": "5135ec37f0dc3e09", + "name": "/opt/venv/lib/python3.12/site-packages/hypothesis_graphql-0.13.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bfb0290ff1c86636", - "name": "/opt/venv/lib/python3.12/site-packages/hypothesis_graphql-0.12.0.dist-info/METADATA", + "bom-ref": "585d25c7b5956a4e", + "name": "/opt/venv/lib/python3.12/site-packages/hypothesis_graphql-0.13.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c249a76e34980c48", - "name": "/opt/venv/lib/python3.12/site-packages/hypothesis_graphql-0.12.0.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "5ca26fbc3bb2236a", + "bom-ref": "36dbe9ad96c093c4", "name": "/opt/venv/lib/python3.12/site-packages/hypothesis_jsonschema-0.23.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bd5d831e8770ceca", + "bom-ref": "afdb0dcb75b2a6f4", "name": "/opt/venv/lib/python3.12/site-packages/hypothesis_jsonschema-0.23.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9ef362f80d7c4b2c", + "bom-ref": "25a32002d4279f4e", "name": "/opt/venv/lib/python3.12/site-packages/hypothesis_jsonschema-0.23.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "66b6acf72ead2bdd", - "name": "/opt/venv/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "8ac838be967f30e9", - "name": "/opt/venv/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "e66d026180b88209", - "name": "/opt/venv/lib/python3.12/site-packages/ijson-3.5.0.dist-info/METADATA", + "bom-ref": "94ac04686a02fa3b", + "name": "/opt/venv/lib/python3.12/site-packages/idna-3.18.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a5e86acd24c94eaa", - "name": "/opt/venv/lib/python3.12/site-packages/ijson-3.5.0.dist-info/RECORD", + "bom-ref": "21f540f9d9420a75", + "name": "/opt/venv/lib/python3.12/site-packages/idna-3.18.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a1cad0a2c0dea002", - "name": "/opt/venv/lib/python3.12/site-packages/ijson-3.5.0.dist-info/top_level.txt", + "bom-ref": "3dff32b0a252b71f", + "name": "/opt/venv/lib/python3.12/site-packages/ijson-3.5.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0c1c6332363e012c", - "name": "/opt/venv/lib/python3.12/site-packages/imageio-2.37.3.dist-info/METADATA", + "bom-ref": "5fc95df8be81b0bc", + "name": "/opt/venv/lib/python3.12/site-packages/ijson-3.5.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b90eb9a7c581226d", - "name": "/opt/venv/lib/python3.12/site-packages/imageio-2.37.3.dist-info/RECORD", + "bom-ref": "2e0f06fe1447ee0d", + "name": "/opt/venv/lib/python3.12/site-packages/ijson-3.5.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "99c7b995577acf87", - "name": "/opt/venv/lib/python3.12/site-packages/imageio-2.37.3.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "0928f770217e517c", + "bom-ref": "7c24de69456de031", "name": "/opt/venv/lib/python3.12/site-packages/impi_rt-2021.18.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "33efcef4a0a511fa", + "bom-ref": "333ad65a2dc7ab03", "name": "/opt/venv/lib/python3.12/site-packages/impi_rt-2021.18.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "62815ba33884977b", + "bom-ref": "3c277d8a8f733296", "name": "/opt/venv/lib/python3.12/site-packages/impi_rt-2021.18.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "bed7c1becb22cbbf", + "bom-ref": "9ef94671ec6b4ad9", "name": "/opt/venv/lib/python3.12/site-packages/iniconfig-2.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "968aad25607e1783", + "bom-ref": "85051dcd85589ef1", "name": "/opt/venv/lib/python3.12/site-packages/iniconfig-2.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "def691b51c0dfe0b", + "bom-ref": "8553ca6c8a84669d", "name": "/opt/venv/lib/python3.12/site-packages/iniconfig-2.3.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "cb599ae7531cd75f", + "bom-ref": "ee723a8660d7c86a", "name": "/opt/venv/lib/python3.12/site-packages/intel_cmplr_lib_rt-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d501afe8ab19c61b", + "bom-ref": "c36007648feaaf86", "name": "/opt/venv/lib/python3.12/site-packages/intel_cmplr_lib_rt-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d3b9200906ce0fef", + "bom-ref": "f1f3f938dbf92282", "name": "/opt/venv/lib/python3.12/site-packages/intel_cmplr_lib_rt-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "87757e96e3c8b8e5", + "bom-ref": "d0415512da5d29e8", "name": "/opt/venv/lib/python3.12/site-packages/intel_cmplr_lib_ur-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "841d03de2b68fc44", + "bom-ref": "2f7f736728ac508d", "name": "/opt/venv/lib/python3.12/site-packages/intel_cmplr_lib_ur-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "be4be68240641cb7", + "bom-ref": "77e5c0e37e4e56be", "name": "/opt/venv/lib/python3.12/site-packages/intel_cmplr_lib_ur-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "64d22db1e120c4c6", + "bom-ref": "da09b0df1b4376bb", "name": "/opt/venv/lib/python3.12/site-packages/intel_cmplr_lic_rt-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "48b0f694dd837acb", + "bom-ref": "5842c410dec643b6", "name": "/opt/venv/lib/python3.12/site-packages/intel_cmplr_lic_rt-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dea2524fbb208f23", + "bom-ref": "a5c0c3e92e0cdb1a", "name": "/opt/venv/lib/python3.12/site-packages/intel_cmplr_lic_rt-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "db4b66227a9f7439", + "bom-ref": "2457f0bb06c867b0", "name": "/opt/venv/lib/python3.12/site-packages/intel_opencl_rt-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "18a4d49667bf44cd", + "bom-ref": "958e36603e5cb100", "name": "/opt/venv/lib/python3.12/site-packages/intel_opencl_rt-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3803678daf48a956", + "bom-ref": "87d7cd5a5d4bc7c7", "name": "/opt/venv/lib/python3.12/site-packages/intel_opencl_rt-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "fecbf8f21363f089", + "bom-ref": "0e67dc22d7aaf3e0", "name": "/opt/venv/lib/python3.12/site-packages/intel_openmp-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9decb7d70519d435", + "bom-ref": "9a0cf5ba96c63dbc", "name": "/opt/venv/lib/python3.12/site-packages/intel_openmp-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e41114a537e7594c", + "bom-ref": "81b03ff2900c1345", "name": "/opt/venv/lib/python3.12/site-packages/intel_openmp-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "41c1a1529e41f882", + "bom-ref": "c9c5dfcbed830c07", "name": "/opt/venv/lib/python3.12/site-packages/intel_pti-0.17.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6b3583a73ed38a63", + "bom-ref": "556cdb830fa2142e", "name": "/opt/venv/lib/python3.12/site-packages/intel_pti-0.17.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b1730fe1142f0f9e", + "bom-ref": "8d0255eef53bc76b", "name": "/opt/venv/lib/python3.12/site-packages/intel_pti-0.17.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "8f741472d3abbd12", + "bom-ref": "88b105bbe90ab113", "name": "/opt/venv/lib/python3.12/site-packages/intel_sycl_rt-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "82f5eb9dd184ee41", + "bom-ref": "9af16418fcc6c84c", "name": "/opt/venv/lib/python3.12/site-packages/intel_sycl_rt-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "437118e235b15f94", + "bom-ref": "7eda7b57374e8681", "name": "/opt/venv/lib/python3.12/site-packages/intel_sycl_rt-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "04fc6225fa54d443", + "bom-ref": "dd67738987490709", "name": "/opt/venv/lib/python3.12/site-packages/interegular-0.3.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d3f31847cc57c194", + "bom-ref": "188d95649eb7d6ca", "name": "/opt/venv/lib/python3.12/site-packages/interegular-0.3.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5342def684678b22", + "bom-ref": "4cfa2860aedb974c", "name": "/opt/venv/lib/python3.12/site-packages/interegular-0.3.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "f0c57a298cd8a5f0", + "bom-ref": "49cffb9bd745ceb1", "name": "/opt/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e8f6f78615b6bfe3", + "bom-ref": "c8c2e591c22dd4a2", "name": "/opt/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7864fff1022f4381", - "name": "/opt/venv/lib/python3.12/site-packages/jiter-0.15.0.dist-info/METADATA", + "bom-ref": "8bf3661409b61e54", + "name": "/opt/venv/lib/python3.12/site-packages/jiter-0.16.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4090a67b49f9c11f", - "name": "/opt/venv/lib/python3.12/site-packages/jiter-0.15.0.dist-info/RECORD", + "bom-ref": "e45714e4e3da6cbc", + "name": "/opt/venv/lib/python3.12/site-packages/jiter-0.16.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c03e4bf40244865e", + "bom-ref": "eaa9231d2a54a038", "name": "/opt/venv/lib/python3.12/site-packages/jiwer-4.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d9fd29047aea21ed", + "bom-ref": "36b113420855439f", "name": "/opt/venv/lib/python3.12/site-packages/jiwer-4.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7cc2c085af196fc9", + "bom-ref": "c13a8238cafebea3", "name": "/opt/venv/lib/python3.12/site-packages/jmespath-1.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7e559f590765afc9", + "bom-ref": "5507463fef970c1b", "name": "/opt/venv/lib/python3.12/site-packages/jmespath-1.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "178ee1c38b1042a3", + "bom-ref": "9734a45fab199201", "name": "/opt/venv/lib/python3.12/site-packages/jmespath-1.1.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d59f7e612247e7f0", + "bom-ref": "4274fe573bb23482", "name": "/opt/venv/lib/python3.12/site-packages/joblib-1.5.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1375d086f9b43ff4", + "bom-ref": "868cbc3178f39c62", "name": "/opt/venv/lib/python3.12/site-packages/joblib-1.5.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cf6ec2d40607241c", + "bom-ref": "6897b66f9f316382", "name": "/opt/venv/lib/python3.12/site-packages/joblib-1.5.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "eb51275dfdd0acfb", + "bom-ref": "9432f73040adc931", "name": "/opt/venv/lib/python3.12/site-packages/jsonschema-4.26.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "953790dd9bb8925b", + "bom-ref": "90ef9c80e5f8547d", "name": "/opt/venv/lib/python3.12/site-packages/jsonschema-4.26.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "79dd661647251e7c", - "name": "/opt/venv/lib/python3.12/site-packages/jsonschema_rs-0.45.0.dist-info/METADATA", + "bom-ref": "f62b514ccb5ee5b2", + "name": "/opt/venv/lib/python3.12/site-packages/jsonschema_rs-0.49.9.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b7f85c685283a572", - "name": "/opt/venv/lib/python3.12/site-packages/jsonschema_rs-0.45.0.dist-info/RECORD", + "bom-ref": "a925288854377c9b", + "name": "/opt/venv/lib/python3.12/site-packages/jsonschema_rs-0.49.9.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d5ad94769b7c13b3", + "bom-ref": "3560ea27b0db675d", "name": "/opt/venv/lib/python3.12/site-packages/jsonschema_specifications-2025.9.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2906c8740547d9c0", + "bom-ref": "2f9f4888d0a96b4e", "name": "/opt/venv/lib/python3.12/site-packages/jsonschema_specifications-2025.9.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "390a2376d03b300c", - "name": "/opt/venv/lib/python3.12/site-packages/junit_xml-1.9.dist-info/METADATA", + "bom-ref": "94d87b166da60365", + "name": "/opt/venv/lib/python3.12/site-packages/jupyter_client-8.9.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "2a5fecd4527b821f", + "name": "/opt/venv/lib/python3.12/site-packages/jupyter_client-8.9.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4d4433909b32be43", - "name": "/opt/venv/lib/python3.12/site-packages/junit_xml-1.9.dist-info/RECORD", + "bom-ref": "71e8800c8491fbde", + "name": "/opt/venv/lib/python3.12/site-packages/jupyter_core-5.9.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "dc571293b042a077", - "name": "/opt/venv/lib/python3.12/site-packages/junit_xml-1.9.dist-info/top_level.txt", + "bom-ref": "cf6cd59cdf55eefa", + "name": "/opt/venv/lib/python3.12/site-packages/jupyter_core-5.9.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3536fe1b58523bef", + "bom-ref": "8481d9413af7ae85", "name": "/opt/venv/lib/python3.12/site-packages/lark-1.2.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4e77d3ad132c133a", + "bom-ref": "ad241b6af11989d8", "name": "/opt/venv/lib/python3.12/site-packages/lark-1.2.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e505eca2553698dd", + "bom-ref": "0f0ac4087be6b27b", "name": "/opt/venv/lib/python3.12/site-packages/lark-1.2.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "15e29770435757a5", + "bom-ref": "cca58887eebe2e37", "name": "/opt/venv/lib/python3.12/site-packages/lazy_loader-0.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "eae2ffc0a3943b79", + "bom-ref": "eba2e74485998803", "name": "/opt/venv/lib/python3.12/site-packages/lazy_loader-0.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dd0641ec63b53811", + "bom-ref": "b88c1b9d8591cfe7", "name": "/opt/venv/lib/python3.12/site-packages/lazy_loader-0.5.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "07f80a870d5f761d", - "name": "/opt/venv/lib/python3.12/site-packages/librosa-0.10.2.post1.dist-info/METADATA", + "bom-ref": "6a5f8b33c78ea584", + "name": "/opt/venv/lib/python3.12/site-packages/librosa-1.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "dfb66af5da65b2dd", - "name": "/opt/venv/lib/python3.12/site-packages/librosa-0.10.2.post1.dist-info/RECORD", + "bom-ref": "c027d3d1789488f4", + "name": "/opt/venv/lib/python3.12/site-packages/librosa-1.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "174caf3a0873ea29", - "name": "/opt/venv/lib/python3.12/site-packages/librosa-0.10.2.post1.dist-info/top_level.txt", + "bom-ref": "c0fa73b27f6bd182", + "name": "/opt/venv/lib/python3.12/site-packages/librosa-1.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "4df7bc478e79c5bb", + "bom-ref": "3b1658aca1dc53e9", "name": "/opt/venv/lib/python3.12/site-packages/llguidance-1.7.6.dist-info/METADATA", "type": "file" }, { - "bom-ref": "dc0c170662dbba39", + "bom-ref": "607036c6d73a9bc3", "name": "/opt/venv/lib/python3.12/site-packages/llguidance-1.7.6.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7bc7c8596bb924a5", + "bom-ref": "5167df3b1e3744d7", "name": "/opt/venv/lib/python3.12/site-packages/llvmlite-0.47.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6646331b44b0d070", + "bom-ref": "c6ff45ecedd06d9a", "name": "/opt/venv/lib/python3.12/site-packages/llvmlite-0.47.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e3067353b35e22e4", + "bom-ref": "3cd40795c2873d5e", "name": "/opt/venv/lib/python3.12/site-packages/llvmlite-0.47.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0a85b92bad8ebfb2", + "bom-ref": "15b9c44352e649bc", "name": "/opt/venv/lib/python3.12/site-packages/lm_eval-0.4.12.dist-info/METADATA", "type": "file" }, { - "bom-ref": "50cae66a4bfe5191", + "bom-ref": "d9db28742c36e52f", "name": "/opt/venv/lib/python3.12/site-packages/lm_eval-0.4.12.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d275ed962962fecb", + "bom-ref": "494df4a9fbef1a1d", "name": "/opt/venv/lib/python3.12/site-packages/lm_eval-0.4.12.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "c358d7d6a4e4f74d", + "bom-ref": "4d9b5905fe15cba3", "name": "/opt/venv/lib/python3.12/site-packages/lm_format_enforcer-0.11.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "216d2344bfc94e1c", + "bom-ref": "1c45747701376d7a", "name": "/opt/venv/lib/python3.12/site-packages/lm_format_enforcer-0.11.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "509d254c160a096b", + "bom-ref": "f09fccdea9a33249", "name": "/opt/venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2a9d510c0100caa8", + "bom-ref": "8925b7af9eafc50a", "name": "/opt/venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ec470475513e0675", - "name": "/opt/venv/lib/python3.12/site-packages/lxml-6.0.2.dist-info/METADATA", + "bom-ref": "8679b1d669b7975c", + "name": "/opt/venv/lib/python3.12/site-packages/lxml-6.1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "efa7470a94e5d886", - "name": "/opt/venv/lib/python3.12/site-packages/lxml-6.0.2.dist-info/RECORD", + "bom-ref": "01503db781bba4bc", + "name": "/opt/venv/lib/python3.12/site-packages/lxml-6.1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ee0f4a2f0bcbbccc", - "name": "/opt/venv/lib/python3.12/site-packages/lxml-6.0.2.dist-info/top_level.txt", + "bom-ref": "69021008d8fbe0dc", + "name": "/opt/venv/lib/python3.12/site-packages/lxml-6.1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "bd4b85b9d2c37f55", - "name": "/opt/venv/lib/python3.12/site-packages/markdown_it_py-4.0.0.dist-info/METADATA", + "bom-ref": "52d4efc2d9f4f764", + "name": "/opt/venv/lib/python3.12/site-packages/markdown_it_py-4.2.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bfbf91bcae4ee8b5", - "name": "/opt/venv/lib/python3.12/site-packages/markdown_it_py-4.0.0.dist-info/RECORD", + "bom-ref": "918656d0e1bafc08", + "name": "/opt/venv/lib/python3.12/site-packages/markdown_it_py-4.2.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8fb8124ebd661f88", + "bom-ref": "8969ad5d0ab1e5e9", "name": "/opt/venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6b54e31c91f21915", + "bom-ref": "8b6b5f8a1e79b7a4", "name": "/opt/venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c9f07b8043c3ac72", + "bom-ref": "7c4915bbeba78baf", "name": "/opt/venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9b626fb538d6c0b4", - "name": "/opt/venv/lib/python3.12/site-packages/mbstrdecoder-1.1.4.dist-info/METADATA", + "bom-ref": "68a8cc0279c901ba", + "name": "/opt/venv/lib/python3.12/site-packages/mbstrdecoder-1.1.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f86cc71ff5e6d287", - "name": "/opt/venv/lib/python3.12/site-packages/mbstrdecoder-1.1.4.dist-info/RECORD", + "bom-ref": "f751bdbe24361ea1", + "name": "/opt/venv/lib/python3.12/site-packages/mbstrdecoder-1.1.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7371bb13d39f516b", - "name": "/opt/venv/lib/python3.12/site-packages/mbstrdecoder-1.1.4.dist-info/top_level.txt", + "bom-ref": "d240381a65686292", + "name": "/opt/venv/lib/python3.12/site-packages/mbstrdecoder-1.1.5.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b77c13acf9a4ff7f", - "name": "/opt/venv/lib/python3.12/site-packages/mcp-1.28.1.dist-info/METADATA", + "bom-ref": "083c5aeb9508d82a", + "name": "/opt/venv/lib/python3.12/site-packages/mcp-2.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "67822d1f0052b517", - "name": "/opt/venv/lib/python3.12/site-packages/mcp-1.28.1.dist-info/RECORD", + "bom-ref": "7b50b373cfac53fc", + "name": "/opt/venv/lib/python3.12/site-packages/mcp-2.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "36d215000e7e7b7c", + "bom-ref": "188e2e4881c12f96", "name": "/opt/venv/lib/python3.12/site-packages/mcp_types-2.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "73e72e4ffc23ed11", + "bom-ref": "0262bc60a7e2ac7f", "name": "/opt/venv/lib/python3.12/site-packages/mcp_types-2.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "806b112468281aac", + "bom-ref": "372be22e2e0471b2", "name": "/opt/venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d100e3e04da99aad", + "bom-ref": "03cac010b1a66f83", "name": "/opt/venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cfc7171176214a51", - "name": "/opt/venv/lib/python3.12/site-packages/mistral_common-1.11.6.dist-info/METADATA", + "bom-ref": "3a3c10ffe8913950", + "name": "/opt/venv/lib/python3.12/site-packages/mistral_common-1.11.7.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0a242868320770b9", - "name": "/opt/venv/lib/python3.12/site-packages/mistral_common-1.11.6.dist-info/RECORD", + "bom-ref": "796500896c3929fc", + "name": "/opt/venv/lib/python3.12/site-packages/mistral_common-1.11.7.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dda9ba3b456d512e", - "name": "/opt/venv/lib/python3.12/site-packages/mistral_common-1.11.6.dist-info/top_level.txt", + "bom-ref": "5ed3b4981541b7a5", + "name": "/opt/venv/lib/python3.12/site-packages/mistral_common-1.11.7.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "fb41f755d25fa35f", + "bom-ref": "f99095f8b87c1bba", "name": "/opt/venv/lib/python3.12/site-packages/mkl-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3988763edef07281", + "bom-ref": "186f16aa839bbab4", "name": "/opt/venv/lib/python3.12/site-packages/mkl-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3d8f61e44e52fb60", + "bom-ref": "bec1517b7898ffd1", "name": "/opt/venv/lib/python3.12/site-packages/mkl-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e4aefc05cc69b2e4", + "bom-ref": "a70ea768664e4eaa", "name": "/opt/venv/lib/python3.12/site-packages/model_hosting_container_standards-0.1.16.dist-info/METADATA", "type": "file" }, { - "bom-ref": "919abd6569340826", + "bom-ref": "7d02cbab70a496fc", "name": "/opt/venv/lib/python3.12/site-packages/model_hosting_container_standards-0.1.16.dist-info/RECORD", "type": "file" }, { - "bom-ref": "62fa664e7c30f94f", - "name": "/opt/venv/lib/python3.12/site-packages/modelscope-1.35.3.dist-info/METADATA", + "bom-ref": "d880ef91e6a92f23", + "name": "/opt/venv/lib/python3.12/site-packages/modelscope-1.37.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9df1bbf15691838f", - "name": "/opt/venv/lib/python3.12/site-packages/modelscope-1.35.3.dist-info/RECORD", + "bom-ref": "bffe880323b5c600", + "name": "/opt/venv/lib/python3.12/site-packages/modelscope-1.37.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9e94e6b9da2b990b", - "name": "/opt/venv/lib/python3.12/site-packages/modelscope-1.35.3.dist-info/top_level.txt", + "bom-ref": "039869d696cfa7d5", + "name": "/opt/venv/lib/python3.12/site-packages/modelscope-1.37.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "c281098acf0245df", - "name": "/opt/venv/lib/python3.12/site-packages/more_itertools-10.8.0.dist-info/METADATA", + "bom-ref": "0097a384766a52b5", + "name": "/opt/venv/lib/python3.12/site-packages/more_itertools-11.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6595fb642cfe7801", - "name": "/opt/venv/lib/python3.12/site-packages/more_itertools-10.8.0.dist-info/RECORD", + "bom-ref": "28ac15318a9bc68e", + "name": "/opt/venv/lib/python3.12/site-packages/more_itertools-11.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "95430b77da491b71", + "bom-ref": "3e7e5ec65c41321c", "name": "/opt/venv/lib/python3.12/site-packages/mpmath-1.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "78b1de5cba3eebe4", + "bom-ref": "5ce43861dfb54cd5", "name": "/opt/venv/lib/python3.12/site-packages/mpmath-1.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ce61a2352ebf1a4a", + "bom-ref": "7b5946b7d121b12b", "name": "/opt/venv/lib/python3.12/site-packages/mpmath-1.3.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "693ffda4474f25d6", - "name": "/opt/venv/lib/python3.12/site-packages/msgpack-1.1.2.dist-info/METADATA", + "bom-ref": "bfa06a502815a4eb", + "name": "/opt/venv/lib/python3.12/site-packages/msgpack-1.2.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0d5d4eeb44f7ed76", - "name": "/opt/venv/lib/python3.12/site-packages/msgpack-1.1.2.dist-info/RECORD", + "bom-ref": "3d3da49e68e3284f", + "name": "/opt/venv/lib/python3.12/site-packages/msgpack-1.2.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "58e2113abe0b6a33", - "name": "/opt/venv/lib/python3.12/site-packages/msgpack-1.1.2.dist-info/top_level.txt", + "bom-ref": "886283f72902a454", + "name": "/opt/venv/lib/python3.12/site-packages/msgpack-1.2.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "7636b70e0ad3e7ae", + "bom-ref": "88a4d08eda32dc00", "name": "/opt/venv/lib/python3.12/site-packages/msgspec-0.21.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "420f5bc3e9a95e9d", + "bom-ref": "30b8142d6702b07b", "name": "/opt/venv/lib/python3.12/site-packages/msgspec-0.21.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "33c71d88a0756b7d", + "bom-ref": "ef347ec34c5b0bb3", "name": "/opt/venv/lib/python3.12/site-packages/msgspec-0.21.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e5ed36a6810c04e0", - "name": "/opt/venv/lib/python3.12/site-packages/mteb-2.12.7.dist-info/METADATA", + "bom-ref": "7ed5a9d5e0a0a8ed", + "name": "/opt/venv/lib/python3.12/site-packages/mteb-2.19.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3372d885f24c97be", - "name": "/opt/venv/lib/python3.12/site-packages/mteb-2.12.7.dist-info/RECORD", + "bom-ref": "0fa207e4cbb519be", + "name": "/opt/venv/lib/python3.12/site-packages/mteb-2.19.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e5d28de876a61159", - "name": "/opt/venv/lib/python3.12/site-packages/mteb-2.12.7.dist-info/top_level.txt", + "bom-ref": "893d3a2ca7c09956", + "name": "/opt/venv/lib/python3.12/site-packages/mteb-2.19.4.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "dab8f9e3212b7c3a", + "bom-ref": "c1eb530cd26f049c", "name": "/opt/venv/lib/python3.12/site-packages/multidict-6.7.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "62de171e2cd84532", + "bom-ref": "5b70f805d4e90b58", "name": "/opt/venv/lib/python3.12/site-packages/multidict-6.7.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "82cb463d33af5bad", + "bom-ref": "fefaebfbac9b749f", "name": "/opt/venv/lib/python3.12/site-packages/multidict-6.7.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "20557310b082e0e3", + "bom-ref": "84c6297690152b55", "name": "/opt/venv/lib/python3.12/site-packages/multiprocess-0.70.19.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5681ea778c0deeda", + "bom-ref": "5bf648f0c911a39c", "name": "/opt/venv/lib/python3.12/site-packages/multiprocess-0.70.19.dist-info/RECORD", "type": "file" }, { - "bom-ref": "494662553136cd6f", + "bom-ref": "cea8fb5256cc1f8d", "name": "/opt/venv/lib/python3.12/site-packages/multiprocess-0.70.19.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "2c7e517b8914d794", - "name": "/opt/venv/lib/python3.12/site-packages/nanobind-2.14.0.dist-info/METADATA", + "bom-ref": "282cfb1c7b828a89", + "name": "/opt/venv/lib/python3.12/site-packages/nanobind-3.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5aee3a57ab6baa69", - "name": "/opt/venv/lib/python3.12/site-packages/nanobind-2.14.0.dist-info/RECORD", + "bom-ref": "79de8d188f926b58", + "name": "/opt/venv/lib/python3.12/site-packages/nanobind-3.0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "94e835f9780800e3", + "bom-ref": "1ea330936e42b4cc", + "name": "/opt/venv/lib/python3.12/site-packages/narwhals-2.24.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "28841b54c34ee0d4", + "name": "/opt/venv/lib/python3.12/site-packages/narwhals-2.24.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "d738fff90f3272ee", "name": "/opt/venv/lib/python3.12/site-packages/networkx-3.6.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "98fa9152e54b75b6", + "bom-ref": "58594ed460552223", "name": "/opt/venv/lib/python3.12/site-packages/networkx-3.6.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b12271c60193d0db", + "bom-ref": "f52644096fdfa986", "name": "/opt/venv/lib/python3.12/site-packages/networkx-3.6.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "201680c21996e96e", + "bom-ref": "84ed28756b9a27a4", "name": "/opt/venv/lib/python3.12/site-packages/ninja-1.13.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "86f4f843703d70e2", + "bom-ref": "d7b0ed93d4c53850", "name": "/opt/venv/lib/python3.12/site-packages/ninja-1.13.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "84261c00177b8640", - "name": "/opt/venv/lib/python3.12/site-packages/nixl-1.2.0.dist-info/METADATA", + "bom-ref": "f2139d100853bd78", + "name": "/opt/venv/lib/python3.12/site-packages/nixl-1.3.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ea6d058ce169d006", - "name": "/opt/venv/lib/python3.12/site-packages/nixl-1.2.0.dist-info/RECORD", + "bom-ref": "8e7d5eb39d0d89d6", + "name": "/opt/venv/lib/python3.12/site-packages/nixl-1.3.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "fb803440e5e61926", - "name": "/opt/venv/lib/python3.12/site-packages/nixl-1.2.0.dist-info/top_level.txt", + "bom-ref": "5855c37292e03f74", + "name": "/opt/venv/lib/python3.12/site-packages/nixl-1.3.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e737b0df2c18362f", - "name": "/opt/venv/lib/python3.12/site-packages/nixl_cu12-1.2.0.dist-info/METADATA", + "bom-ref": "41f02a4e44e744ab", + "name": "/opt/venv/lib/python3.12/site-packages/nixl_cu12-1.3.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "377c54b7f0f29768", - "name": "/opt/venv/lib/python3.12/site-packages/nixl_cu12-1.2.0.dist-info/RECORD", + "bom-ref": "40ae4de7c8b3ec8e", + "name": "/opt/venv/lib/python3.12/site-packages/nixl_cu12-1.3.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "52c4ba6ad3e4af98", - "name": "/opt/venv/lib/python3.12/site-packages/nixl_cu12-1.2.0.dist-info/direct_url.json", + "bom-ref": "1ad837881291385c", + "name": "/opt/venv/lib/python3.12/site-packages/nixl_cu12-1.3.2.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "656e60c7ca3e7774", - "name": "/opt/venv/lib/python3.12/site-packages/nltk-3.9.4.dist-info/METADATA", + "bom-ref": "10aba3e0778c35ab", + "name": "/opt/venv/lib/python3.12/site-packages/nltk-3.10.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3321dde8e7d54422", - "name": "/opt/venv/lib/python3.12/site-packages/nltk-3.9.4.dist-info/RECORD", + "bom-ref": "52a5bd4937986194", + "name": "/opt/venv/lib/python3.12/site-packages/nltk-3.10.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "90eae3e54365a992", - "name": "/opt/venv/lib/python3.12/site-packages/nltk-3.9.4.dist-info/top_level.txt", + "bom-ref": "5fe8736a1a287364", + "name": "/opt/venv/lib/python3.12/site-packages/nltk-3.10.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "5c18ede3ffa19641", + "bom-ref": "354d3d12848e0e97", "name": "/opt/venv/lib/python3.12/site-packages/num2words-0.5.14.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ea5db36ac2ce92d1", + "bom-ref": "5c353d2b9653ba0b", "name": "/opt/venv/lib/python3.12/site-packages/num2words-0.5.14.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ad8ffbb845e4dadd", + "bom-ref": "95feebee2cfdbfe3", "name": "/opt/venv/lib/python3.12/site-packages/num2words-0.5.14.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "84753fc04d07d331", + "bom-ref": "4a991cb76a144aa7", "name": "/opt/venv/lib/python3.12/site-packages/numba-0.65.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "be3be12651abc8b6", + "bom-ref": "170db9566d33aa80", "name": "/opt/venv/lib/python3.12/site-packages/numba-0.65.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "31f4c843c394c603", + "bom-ref": "e689442cb5b7ee4d", "name": "/opt/venv/lib/python3.12/site-packages/numba-0.65.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "bc5faca3b525df7a", - "name": "/opt/venv/lib/python3.12/site-packages/numpy-2.2.6.dist-info/METADATA", + "bom-ref": "574549b92673df15", + "name": "/opt/venv/lib/python3.12/site-packages/numpy-2.3.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b3587485f48e490d", - "name": "/opt/venv/lib/python3.12/site-packages/numpy-2.2.6.dist-info/RECORD", + "bom-ref": "c42092aaded2b47b", + "name": "/opt/venv/lib/python3.12/site-packages/numpy-2.3.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "fb63245dc357f935", + "bom-ref": "5b705a7279bafd74", "name": "/opt/venv/lib/python3.12/site-packages/oneccl-2022.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "28e91443190f79e4", + "bom-ref": "73fdf05caa9553a9", "name": "/opt/venv/lib/python3.12/site-packages/oneccl-2022.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7cfbc64b8cb85f98", + "bom-ref": "6ffcf40b3b7d4d7d", "name": "/opt/venv/lib/python3.12/site-packages/oneccl-2022.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0ad92211397cda51", + "bom-ref": "49edf3fd0ef97568", "name": "/opt/venv/lib/python3.12/site-packages/oneccl_devel-2022.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e8b3415e01128cf7", + "bom-ref": "2bfbd97c0bbe2dfe", "name": "/opt/venv/lib/python3.12/site-packages/oneccl_devel-2022.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d5ce295187efa1a6", + "bom-ref": "5c0820ac4d44c23b", "name": "/opt/venv/lib/python3.12/site-packages/oneccl_devel-2022.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "7c2fca8780fa0f67", + "bom-ref": "25057a60f59baaae", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_license-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "99f0bfaea3d5b00b", + "bom-ref": "8628fe5a17d193c2", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_license-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b2ab037c6ca0a90e", + "bom-ref": "823ddc367b66ce3b", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_license-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "7f5e477a3de265a3", + "bom-ref": "d0e1e65483469f0a", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_blas-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5f1a1534e8817aad", + "bom-ref": "f32f284187be087c", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_blas-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d2d3c1e800062600", + "bom-ref": "b687083c24387521", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_blas-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1eba7c5bb0c83682", + "bom-ref": "4984321f38f989df", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_dft-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3d26d014469036c9", + "bom-ref": "e0da8a379dc7e710", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_dft-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "18002fe5d3b89a65", + "bom-ref": "d503aca05b09daa0", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_dft-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "309e5731f4223124", + "bom-ref": "de864d8e48017a61", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_lapack-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "43b3ddcf5595d005", + "bom-ref": "cbfc8782e0e3f23c", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_lapack-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c60630e19f97316b", + "bom-ref": "39ef3c3202ef0562", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_lapack-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d5f85d6447a0b802", + "bom-ref": "3742e312bbd69b93", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_rng-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5cee2bee3fc5bb05", + "bom-ref": "6a72d87afe008900", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_rng-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "20bcf3f331e87d80", + "bom-ref": "4342bf94c296bfa1", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_rng-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9672d385716b6804", + "bom-ref": "83f450821f32d75d", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_sparse-2026.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "97294f2657a7ebd4", + "bom-ref": "87d2a10f950a0c8d", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_sparse-2026.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5439d2c90430b3df", + "bom-ref": "560999ba49aa5fce", "name": "/opt/venv/lib/python3.12/site-packages/onemkl_sycl_sparse-2026.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1b9d652b2076d485", - "name": "/opt/venv/lib/python3.12/site-packages/openai-2.44.0.dist-info/METADATA", + "bom-ref": "0598f5af3c5b98bc", + "name": "/opt/venv/lib/python3.12/site-packages/openai-3.2.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2cbd4b0cf4216ecb", - "name": "/opt/venv/lib/python3.12/site-packages/openai-2.44.0.dist-info/RECORD", + "bom-ref": "a4a17eb1b9f19ea7", + "name": "/opt/venv/lib/python3.12/site-packages/openai-3.2.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "16dab2dba2476fc4", + "bom-ref": "4a2ed71ed5daac96", "name": "/opt/venv/lib/python3.12/site-packages/openai_harmony-0.0.8.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6b04da2a7e3f42f6", + "bom-ref": "a24dd829cacc97f8", "name": "/opt/venv/lib/python3.12/site-packages/openai_harmony-0.0.8.dist-info/RECORD", "type": "file" }, { - "bom-ref": "44c77fc0f2ab8d77", - "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless-4.13.0.92.dist-info/METADATA", + "bom-ref": "429318a76f8111bb", + "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless-5.0.0.93.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f5c812667a7d6eb9", - "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless-4.13.0.92.dist-info/RECORD", + "bom-ref": "ba591882022c5e13", + "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless-5.0.0.93.dist-info/RECORD", "type": "file" }, { - "bom-ref": "60adea08cb22a76f", - "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless-4.13.0.92.dist-info/top_level.txt", + "bom-ref": "317c5879f8c2fd5c", + "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless-5.0.0.93.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "bb4b65a7d4c61e61", - "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless.libs/libavcodec-156beeea.so.62.11.100", + "bom-ref": "4aa0fa6f53e1af05", + "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless.libs/libavcodec-c4204469.so.62.28.101", "type": "file" }, { - "bom-ref": "40049e1db7ecfea5", - "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless.libs/libavformat-8c8a026e.so.62.3.100", + "bom-ref": "f45edc2e3899ead0", + "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless.libs/libavformat-4762a711.so.62.12.101", "type": "file" }, { - "bom-ref": "d22639fb59b5a714", - "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless.libs/libavutil-ec54c519.so.60.8.100", + "bom-ref": "476cd087184d48d6", + "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless.libs/libavutil-befbbc48.so.60.26.101", "type": "file" }, { - "bom-ref": "275dea8162f0d295", - "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless.libs/libswresample-02b1114a.so.6.1.100", + "bom-ref": "53e2c1eea6da98d3", + "name": "/opt/venv/lib/python3.12/site-packages/opencv_python_headless.libs/libswresample-2dfded3b.so.6.3.101", "type": "file" }, { - "bom-ref": "3c948f14e898bed8", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_api-1.43.0.dist-info/METADATA", + "bom-ref": "382dbfde400a6580", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_api-1.44.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "67782963a8dd2aa0", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_api-1.43.0.dist-info/RECORD", + "bom-ref": "784fff970101c497", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_api-1.44.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "fbaa011e536c96e6", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp-1.43.0.dist-info/METADATA", + "bom-ref": "a4d4da5bf8e2d06e", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp-1.44.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0e3542c280f579e2", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp-1.43.0.dist-info/RECORD", + "bom-ref": "ee8b33f8fa4f080a", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp-1.44.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "318cb9c82257629e", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_common-1.43.0.dist-info/METADATA", + "bom-ref": "8f73c6f28d63f232", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_common-1.44.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4b42a3dfb90c901d", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_common-1.43.0.dist-info/RECORD", + "bom-ref": "1217b5ff623cd1df", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_common-1.44.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "56e17796cde66c56", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_grpc-1.43.0.dist-info/METADATA", + "bom-ref": "8b50b9b557b07eb8", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_grpc-1.44.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "16ac0b603301d317", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_grpc-1.43.0.dist-info/RECORD", + "bom-ref": "5e4d0b322cbf17f1", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_grpc-1.44.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "12cf7443a77f4738", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_http-1.43.0.dist-info/METADATA", + "bom-ref": "b7946d8cfa822c33", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_http-1.44.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4d60683e91528595", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_http-1.43.0.dist-info/RECORD", + "bom-ref": "5f3b84421ba05fee", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_exporter_otlp_proto_http-1.44.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a34213867af7f9ec", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_proto-1.43.0.dist-info/METADATA", + "bom-ref": "9a045890dc289ecf", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_proto-1.44.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a5143bbb314e0663", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_proto-1.43.0.dist-info/RECORD", + "bom-ref": "8389563b5b002b17", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_proto-1.44.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7e5a1cb0167b961b", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_sdk-1.43.0.dist-info/METADATA", + "bom-ref": "a1fc643999d78143", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_sdk-1.44.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4380e6c70a3385f7", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_sdk-1.43.0.dist-info/RECORD", + "bom-ref": "ddb5edd25649e212", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_sdk-1.44.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e87d958b1439db6e", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_semantic_conventions-0.64b0.dist-info/METADATA", + "bom-ref": "0ed5eb08eee67dab", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_semantic_conventions-0.65b0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2d7042e79d5d53b4", - "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_semantic_conventions-0.64b0.dist-info/RECORD", + "bom-ref": "570635c12d88aac1", + "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_semantic_conventions-0.65b0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b678645cf0b9e0c7", + "bom-ref": "f9e0395d0778dd05", "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_semantic_conventions_ai-0.5.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d3c30b68dd5003eb", + "bom-ref": "b566b821ff5a6f71", "name": "/opt/venv/lib/python3.12/site-packages/opentelemetry_semantic_conventions_ai-0.5.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a91390ba7690c20c", + "bom-ref": "cbac24b656cdf206", "name": "/opt/venv/lib/python3.12/site-packages/outlines_core-0.2.14.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f437af518e696295", + "bom-ref": "19de2320dbf3321b", "name": "/opt/venv/lib/python3.12/site-packages/outlines_core-0.2.14.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b546d9b0121fe7fe", - "name": "/opt/venv/lib/python3.12/site-packages/packaging-26.0.dist-info/METADATA", + "bom-ref": "8424d650aaf5bdc1", + "name": "/opt/venv/lib/python3.12/site-packages/packaging-26.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d9e30448d7465a4d", - "name": "/opt/venv/lib/python3.12/site-packages/packaging-26.0.dist-info/RECORD", + "bom-ref": "fe4cecdadfe97517", + "name": "/opt/venv/lib/python3.12/site-packages/packaging-26.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "73d37bc7e2521a65", - "name": "/opt/venv/lib/python3.12/site-packages/pandas-3.0.1.dist-info/METADATA", + "bom-ref": "4df930ddf82797f7", + "name": "/opt/venv/lib/python3.12/site-packages/pandas-3.0.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c3616e8727c3299c", - "name": "/opt/venv/lib/python3.12/site-packages/pandas-3.0.1.dist-info/RECORD", + "bom-ref": "653ed6b0807fd392", + "name": "/opt/venv/lib/python3.12/site-packages/pandas-3.0.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d7147a491fa5fe34", + "bom-ref": "e8efc998bd368b22", "name": "/opt/venv/lib/python3.12/site-packages/partial_json_parser-0.2.1.1.post7.dist-info/METADATA", "type": "file" }, { - "bom-ref": "87fa2eee85bc51d0", + "bom-ref": "d928e07cb2199f2e", "name": "/opt/venv/lib/python3.12/site-packages/partial_json_parser-0.2.1.1.post7.dist-info/RECORD", "type": "file" }, { - "bom-ref": "313b26608d60f8f5", + "bom-ref": "274cadfe0ad8acc3", "name": "/opt/venv/lib/python3.12/site-packages/pathvalidate-3.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "94b07455a19948a6", + "bom-ref": "83d5b4a79dfaaf4c", "name": "/opt/venv/lib/python3.12/site-packages/pathvalidate-3.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "bfc161cf6d1d8471", + "bom-ref": "74b38fd854936b27", "name": "/opt/venv/lib/python3.12/site-packages/pathvalidate-3.3.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b1a0ca5c81e240dd", - "name": "/opt/venv/lib/python3.12/site-packages/pillow-12.1.1.dist-info/METADATA", + "bom-ref": "f6818aceebbd1093", + "name": "/opt/venv/lib/python3.12/site-packages/pillow-12.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cb605f8a24a01995", - "name": "/opt/venv/lib/python3.12/site-packages/pillow-12.1.1.dist-info/RECORD", + "bom-ref": "8989375879dd7946", + "name": "/opt/venv/lib/python3.12/site-packages/pillow-12.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dfa825b722ae1c32", - "name": "/opt/venv/lib/python3.12/site-packages/pillow-12.1.1.dist-info/top_level.txt", + "bom-ref": "b2953c8d0cd9ee6d", + "name": "/opt/venv/lib/python3.12/site-packages/pillow-12.3.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "759181682bfce689", + "bom-ref": "e1d54dd7d7f0b32f", "name": "/opt/venv/lib/python3.12/site-packages/pip-26.2.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "dee5d46a06bc3c1e", + "bom-ref": "087d9229c02b69e8", "name": "/opt/venv/lib/python3.12/site-packages/pip-26.2.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "aed5d6abd8d0ddd2", + "bom-ref": "c6e5f8f22273e468", "name": "/opt/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe", "type": "file" }, { - "bom-ref": "c8ecf364b5ee23c2", + "bom-ref": "246aa8fb59d65824", "name": "/opt/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe", "type": "file" }, { - "bom-ref": "e39dc69e7cdc44f9", + "bom-ref": "6ae883eebee2aee3", "name": "/opt/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe", "type": "file" }, { - "bom-ref": "c55ebb179acae788", + "bom-ref": "dbfb6e673db86956", "name": "/opt/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe", "type": "file" }, { - "bom-ref": "20892fa1dd5a7f83", + "bom-ref": "bcc466dd006f741d", "name": "/opt/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe", "type": "file" }, { - "bom-ref": "6a451057d7b5823f", + "bom-ref": "a887910d64bcc2dd", "name": "/opt/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe", "type": "file" }, { - "bom-ref": "39359daf6e936086", + "bom-ref": "e6656149b372a3c8", "name": "/opt/venv/lib/python3.12/site-packages/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/PKG-INFO", "type": "file" }, { - "bom-ref": "70c180bc92ff9762", + "bom-ref": "7833836db45e328c", "name": "/opt/venv/lib/python3.12/site-packages/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/top_level.txt", "type": "file" }, { - "bom-ref": "abc01e7d9275d4ac", - "name": "/opt/venv/lib/python3.12/site-packages/platformdirs-4.9.4.dist-info/METADATA", + "bom-ref": "cc03894a06a7a608", + "name": "/opt/venv/lib/python3.12/site-packages/platformdirs-4.11.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "479f3b67c83d9c88", - "name": "/opt/venv/lib/python3.12/site-packages/platformdirs-4.9.4.dist-info/RECORD", + "bom-ref": "674f424eb9773b3f", + "name": "/opt/venv/lib/python3.12/site-packages/platformdirs-4.11.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1bf706f1bc0b2ab5", + "bom-ref": "953a6ed0cf4fd4b3", "name": "/opt/venv/lib/python3.12/site-packages/pluggy-1.6.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "66bc751ccb6f311c", + "bom-ref": "761f7128e9bfe67a", "name": "/opt/venv/lib/python3.12/site-packages/pluggy-1.6.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1a25473f64ffb507", + "bom-ref": "26e3aa30bba86021", "name": "/opt/venv/lib/python3.12/site-packages/pluggy-1.6.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "ff8c6c036f91a2d0", - "name": "/opt/venv/lib/python3.12/site-packages/polars-1.39.3.dist-info/METADATA", + "bom-ref": "937c5c790412d893", + "name": "/opt/venv/lib/python3.12/site-packages/polars-1.43.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9b68a021de962d1e", - "name": "/opt/venv/lib/python3.12/site-packages/polars-1.39.3.dist-info/RECORD", + "bom-ref": "8d218db7b703bc17", + "name": "/opt/venv/lib/python3.12/site-packages/polars-1.43.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3752e68679aefd72", - "name": "/opt/venv/lib/python3.12/site-packages/polars-1.39.3.dist-info/top_level.txt", + "bom-ref": "e9493f58b414326a", + "name": "/opt/venv/lib/python3.12/site-packages/polars-1.43.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "c8528380db0d4f45", - "name": "/opt/venv/lib/python3.12/site-packages/polars_runtime_32-1.39.3.dist-info/METADATA", + "bom-ref": "b8b62c588c664636", + "name": "/opt/venv/lib/python3.12/site-packages/polars_runtime_32-1.43.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bfed9497ef77e3a5", - "name": "/opt/venv/lib/python3.12/site-packages/polars_runtime_32-1.39.3.dist-info/RECORD", + "bom-ref": "4fb53e3d0e76b0ae", + "name": "/opt/venv/lib/python3.12/site-packages/polars_runtime_32-1.43.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f563e15377379df5", - "name": "/opt/venv/lib/python3.12/site-packages/pooch-1.8.2.dist-info/METADATA", + "bom-ref": "1e57363de58d6f87", + "name": "/opt/venv/lib/python3.12/site-packages/pooch-1.9.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b72ba262ea3400b8", - "name": "/opt/venv/lib/python3.12/site-packages/pooch-1.8.2.dist-info/RECORD", + "bom-ref": "16951189cdf4a688", + "name": "/opt/venv/lib/python3.12/site-packages/pooch-1.9.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1f72324edc3610f3", - "name": "/opt/venv/lib/python3.12/site-packages/pooch-1.8.2.dist-info/top_level.txt", + "bom-ref": "cec5dc52eec5d3b8", + "name": "/opt/venv/lib/python3.12/site-packages/pooch-1.9.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "defe48946a4918de", - "name": "/opt/venv/lib/python3.12/site-packages/portalocker-3.2.0.dist-info/METADATA", + "bom-ref": "4af083eee668955b", + "name": "/opt/venv/lib/python3.12/site-packages/portalocker-4.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8d240b17e0f2f955", - "name": "/opt/venv/lib/python3.12/site-packages/portalocker-3.2.0.dist-info/RECORD", + "bom-ref": "4f511a9f3b40d456", + "name": "/opt/venv/lib/python3.12/site-packages/portalocker-4.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "828c360b3d6cf8a9", - "name": "/opt/venv/lib/python3.12/site-packages/portalocker-3.2.0.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "fb378b3962cd8bd4", + "bom-ref": "b1583fb8733ac982", "name": "/opt/venv/lib/python3.12/site-packages/pqdm-0.2.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ba4aa64936cfc2d1", + "bom-ref": "ce917117dd7c390f", "name": "/opt/venv/lib/python3.12/site-packages/pqdm-0.2.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1aac3f17a02aa498", + "bom-ref": "d3c2f27032f051aa", "name": "/opt/venv/lib/python3.12/site-packages/pqdm-0.2.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e8cb8e893903d162", - "name": "/opt/venv/lib/python3.12/site-packages/prometheus_client-0.25.0.dist-info/METADATA", + "bom-ref": "be6d60853534c31b", + "name": "/opt/venv/lib/python3.12/site-packages/prometheus_client-0.26.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0d7af3303cd76ff5", - "name": "/opt/venv/lib/python3.12/site-packages/prometheus_client-0.25.0.dist-info/RECORD", + "bom-ref": "41b8fe1205bb5ffa", + "name": "/opt/venv/lib/python3.12/site-packages/prometheus_client-0.26.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f580c285a2ff0038", - "name": "/opt/venv/lib/python3.12/site-packages/prometheus_client-0.25.0.dist-info/top_level.txt", + "bom-ref": "480b80d5868d543c", + "name": "/opt/venv/lib/python3.12/site-packages/prometheus_client-0.26.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "4a005b82ff34940d", - "name": "/opt/venv/lib/python3.12/site-packages/prometheus_fastapi_instrumentator-8.0.2.dist-info/METADATA", + "bom-ref": "7239c2ef02132233", + "name": "/opt/venv/lib/python3.12/site-packages/prometheus_fastapi_instrumentator-8.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1931c39539257b10", - "name": "/opt/venv/lib/python3.12/site-packages/prometheus_fastapi_instrumentator-8.0.2.dist-info/RECORD", + "bom-ref": "9c70caae6379aeeb", + "name": "/opt/venv/lib/python3.12/site-packages/prometheus_fastapi_instrumentator-8.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "803b2f52a410181a", - "name": "/opt/venv/lib/python3.12/site-packages/propcache-0.4.1.dist-info/METADATA", + "bom-ref": "50618c78bfbca4e9", + "name": "/opt/venv/lib/python3.12/site-packages/propcache-0.5.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ff1c119c3eaaff3f", - "name": "/opt/venv/lib/python3.12/site-packages/propcache-0.4.1.dist-info/RECORD", + "bom-ref": "17fc88a051781171", + "name": "/opt/venv/lib/python3.12/site-packages/propcache-0.5.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f7332e767b0a1961", - "name": "/opt/venv/lib/python3.12/site-packages/propcache-0.4.1.dist-info/top_level.txt", + "bom-ref": "2be13ee03566f2e1", + "name": "/opt/venv/lib/python3.12/site-packages/propcache-0.5.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "78b926cf6c7a2ad6", + "bom-ref": "b75e595105e5e7e0", "name": "/opt/venv/lib/python3.12/site-packages/protobuf-7.35.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "48598f44d2eb1cb2", + "bom-ref": "8afd0523e000a1cc", "name": "/opt/venv/lib/python3.12/site-packages/protobuf-7.35.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d12fd5e043bbe7df", + "bom-ref": "1e58b713cce5f419", "name": "/opt/venv/lib/python3.12/site-packages/psutil-7.2.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cddbe58d3754ee63", + "bom-ref": "af3c8fdfc8491511", "name": "/opt/venv/lib/python3.12/site-packages/psutil-7.2.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "922228ca9806a419", + "bom-ref": "2fdd645d3a780383", "name": "/opt/venv/lib/python3.12/site-packages/psutil-7.2.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d9f1b250d4a50e3b", - "name": "/opt/venv/lib/python3.12/site-packages/py-1.11.0.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "85a227d7d3bee585", - "name": "/opt/venv/lib/python3.12/site-packages/py-1.11.0.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "c6bb1db87eeee773", - "name": "/opt/venv/lib/python3.12/site-packages/py-1.11.0.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "2c897d6d4d772991", - "name": "/opt/venv/lib/python3.12/site-packages/py/_vendored_packages/apipkg-2.0.0.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "ba20b0841600483f", - "name": "/opt/venv/lib/python3.12/site-packages/py/_vendored_packages/apipkg-2.0.0.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "5697981dfb0aea6a", - "name": "/opt/venv/lib/python3.12/site-packages/py/_vendored_packages/apipkg-2.0.0.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "327b8f7a808f7cf8", - "name": "/opt/venv/lib/python3.12/site-packages/py/_vendored_packages/iniconfig-1.1.1.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "eea8eff37ab3a9b4", - "name": "/opt/venv/lib/python3.12/site-packages/py/_vendored_packages/iniconfig-1.1.1.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "5e928fed165c02e0", - "name": "/opt/venv/lib/python3.12/site-packages/py/_vendored_packages/iniconfig-1.1.1.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "a35722239c496df3", + "bom-ref": "ecaf8fb19e363dbd", "name": "/opt/venv/lib/python3.12/site-packages/py_cpuinfo-9.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c0d2f16f1694418f", + "bom-ref": "33d01e54d73b267d", "name": "/opt/venv/lib/python3.12/site-packages/py_cpuinfo-9.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e94e245518c7644b", + "bom-ref": "5aac2eb4e2e9344d", "name": "/opt/venv/lib/python3.12/site-packages/py_cpuinfo-9.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6d333b693a8ff281", - "name": "/opt/venv/lib/python3.12/site-packages/pyarrow-23.0.1.dist-info/METADATA", + "bom-ref": "87064d8dc1192651", + "name": "/opt/venv/lib/python3.12/site-packages/pyarrow-25.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e09a18046ffd3a2a", - "name": "/opt/venv/lib/python3.12/site-packages/pyarrow-23.0.1.dist-info/RECORD", + "bom-ref": "0fd50a911e8f8ab3", + "name": "/opt/venv/lib/python3.12/site-packages/pyarrow-25.0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d396c937d015cc40", - "name": "/opt/venv/lib/python3.12/site-packages/pyarrow-23.0.1.dist-info/top_level.txt", + "bom-ref": "f2ce840ea44afae8", + "name": "/opt/venv/lib/python3.12/site-packages/pybase64-1.5.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "94c08c75822764b1", - "name": "/opt/venv/lib/python3.12/site-packages/pybase64-1.4.3.dist-info/METADATA", + "bom-ref": "455ca8a60f7f0c1b", + "name": "/opt/venv/lib/python3.12/site-packages/pybase64-1.5.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6a88f391212afdb4", - "name": "/opt/venv/lib/python3.12/site-packages/pybase64-1.4.3.dist-info/RECORD", + "bom-ref": "05ef6f15e4082a26", + "name": "/opt/venv/lib/python3.12/site-packages/pybase64-1.5.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b3451c48f6172915", - "name": "/opt/venv/lib/python3.12/site-packages/pybase64-1.4.3.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "326e4bf914ffabd7", + "bom-ref": "92fd3ae884a4f05d", "name": "/opt/venv/lib/python3.12/site-packages/pycountry-26.2.16.dist-info/METADATA", "type": "file" }, { - "bom-ref": "109bfca0a4bf5df7", + "bom-ref": "495d1660bd418961", "name": "/opt/venv/lib/python3.12/site-packages/pycountry-26.2.16.dist-info/RECORD", "type": "file" }, { - "bom-ref": "46f0defca3fe0e5f", + "bom-ref": "6edf4aa990de2865", "name": "/opt/venv/lib/python3.12/site-packages/pycparser-3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d42e07be687566ba", + "bom-ref": "f676704778ac5118", "name": "/opt/venv/lib/python3.12/site-packages/pycparser-3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "966e68b0ddd8c062", + "bom-ref": "232f5e1bd4033340", "name": "/opt/venv/lib/python3.12/site-packages/pycparser-3.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0f7faf21176e1cd0", + "bom-ref": "ff3b125b5a10eb22", "name": "/opt/venv/lib/python3.12/site-packages/pycryptodomex-3.23.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5353681a72074320", + "bom-ref": "aa1c4ffd8653a8fa", "name": "/opt/venv/lib/python3.12/site-packages/pycryptodomex-3.23.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e3effbd337406373", + "bom-ref": "40c8460614111841", "name": "/opt/venv/lib/python3.12/site-packages/pycryptodomex-3.23.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6f8028590b591f8a", - "name": "/opt/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/METADATA", + "bom-ref": "63cce530b2b79540", + "name": "/opt/venv/lib/python3.12/site-packages/pydantic-2.13.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4b2f52718bd68b45", - "name": "/opt/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/RECORD", + "bom-ref": "3e11fa8e4e1a7a52", + "name": "/opt/venv/lib/python3.12/site-packages/pydantic-2.13.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "315299edf421660e", - "name": "/opt/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/METADATA", + "bom-ref": "a178abdbe6164c4e", + "name": "/opt/venv/lib/python3.12/site-packages/pydantic_core-2.46.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1c057ea2c126015d", - "name": "/opt/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/RECORD", + "bom-ref": "a6ce170dfeca2a77", + "name": "/opt/venv/lib/python3.12/site-packages/pydantic_core-2.46.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3f496c27b85b17f1", + "bom-ref": "b78684a8a4dcb977", "name": "/opt/venv/lib/python3.12/site-packages/pydantic_extra_types-2.11.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8ae95ff46f3ee9f7", + "bom-ref": "baf0a96b5ec78ff9", "name": "/opt/venv/lib/python3.12/site-packages/pydantic_extra_types-2.11.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "0a155a7aea761aae", - "name": "/opt/venv/lib/python3.12/site-packages/pydantic_settings-2.14.2.dist-info/METADATA", + "bom-ref": "003e3f67c9f1bcf3", + "name": "/opt/venv/lib/python3.12/site-packages/pydantic_settings-2.15.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0706ad0344b0e0aa", - "name": "/opt/venv/lib/python3.12/site-packages/pydantic_settings-2.14.2.dist-info/RECORD", + "bom-ref": "c7650ec6c6753b22", + "name": "/opt/venv/lib/python3.12/site-packages/pydantic_settings-2.15.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e91c993bd47de4c6", - "name": "/opt/venv/lib/python3.12/site-packages/pyelftools-0.32.dist-info/METADATA", + "bom-ref": "45b7cd8b9ea7c023", + "name": "/opt/venv/lib/python3.12/site-packages/pyelftools-0.33.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3f75d51de128beae", - "name": "/opt/venv/lib/python3.12/site-packages/pyelftools-0.32.dist-info/RECORD", + "bom-ref": "d1306e58d7339924", + "name": "/opt/venv/lib/python3.12/site-packages/pyelftools-0.33.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b2bc50a253bd6ef9", - "name": "/opt/venv/lib/python3.12/site-packages/pyelftools-0.32.dist-info/top_level.txt", + "bom-ref": "cc473df4bebb8a74", + "name": "/opt/venv/lib/python3.12/site-packages/pyelftools-0.33.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0d7a091fe8461996", - "name": "/opt/venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/METADATA", + "bom-ref": "3ea67556fa56c8f9", + "name": "/opt/venv/lib/python3.12/site-packages/pygments-2.21.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0f3c890f7d37c5f3", - "name": "/opt/venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/RECORD", + "bom-ref": "a44f029b032140eb", + "name": "/opt/venv/lib/python3.12/site-packages/pygments-2.21.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "0a07e41542c707b7", + "bom-ref": "97ac31075b302f99", "name": "/opt/venv/lib/python3.12/site-packages/pyjwt-2.13.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e5de74dd347e6f57", + "bom-ref": "f6fe17a942a9bcf5", "name": "/opt/venv/lib/python3.12/site-packages/pyjwt-2.13.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d4c08d68243b5a58", + "bom-ref": "23b836c7f5e78e5a", "name": "/opt/venv/lib/python3.12/site-packages/pyjwt-2.13.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "fb59c221d17e1a8c", - "name": "/opt/venv/lib/python3.12/site-packages/pyrate_limiter-4.1.0.dist-info/METADATA", + "bom-ref": "4d4a5834b131acea", + "name": "/opt/venv/lib/python3.12/site-packages/pyrate_limiter-4.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8a19ae9aa016f613", - "name": "/opt/venv/lib/python3.12/site-packages/pyrate_limiter-4.1.0.dist-info/RECORD", + "bom-ref": "e25ce063f5f4886f", + "name": "/opt/venv/lib/python3.12/site-packages/pyrate_limiter-4.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "91c23aa20ae7ea8d", - "name": "/opt/venv/lib/python3.12/site-packages/pytablewriter-1.2.1.dist-info/METADATA", + "bom-ref": "159eaf0def35008c", + "name": "/opt/venv/lib/python3.12/site-packages/pystemmer-3.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2338bc685e99866e", - "name": "/opt/venv/lib/python3.12/site-packages/pytablewriter-1.2.1.dist-info/RECORD", + "bom-ref": "abe97add93accb50", + "name": "/opt/venv/lib/python3.12/site-packages/pystemmer-3.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "17df6a0e82a10e2b", - "name": "/opt/venv/lib/python3.12/site-packages/pytablewriter-1.2.1.dist-info/top_level.txt", + "bom-ref": "2be700366f176d1c", + "name": "/opt/venv/lib/python3.12/site-packages/pystemmer-3.1.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "2c551a5b407e8267", + "name": "/opt/venv/lib/python3.12/site-packages/pytablewriter-1.2.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "d100c46f120cd68c", + "name": "/opt/venv/lib/python3.12/site-packages/pytablewriter-1.2.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dd850283f98c4aa1", - "name": "/opt/venv/lib/python3.12/site-packages/pytest-9.0.2.dist-info/METADATA", + "bom-ref": "cad286c65963c561", + "name": "/opt/venv/lib/python3.12/site-packages/pytablewriter-1.2.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "cb0ea7c3287bc3f8", - "name": "/opt/venv/lib/python3.12/site-packages/pytest-9.0.2.dist-info/RECORD", + "bom-ref": "a0ced5de1b09156e", + "name": "/opt/venv/lib/python3.12/site-packages/pytest-9.1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "300eaf9b50761066", - "name": "/opt/venv/lib/python3.12/site-packages/pytest-9.0.2.dist-info/top_level.txt", + "bom-ref": "5372efeba8ec735d", + "name": "/opt/venv/lib/python3.12/site-packages/pytest-9.1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4da3dadeb07f125c", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_asyncio-1.3.0.dist-info/METADATA", + "bom-ref": "251c54702e5017b3", + "name": "/opt/venv/lib/python3.12/site-packages/pytest-9.1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1a4f136e87bf1c5b", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_asyncio-1.3.0.dist-info/RECORD", + "bom-ref": "03c88572f4bab277", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_asyncio-1.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7f6baacb990fef29", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_asyncio-1.3.0.dist-info/top_level.txt", + "bom-ref": "a41790cce413828d", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_asyncio-1.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "194c4aec043e8765", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_cov-6.3.0.dist-info/METADATA", + "bom-ref": "d50a921115851fc1", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_asyncio-1.4.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "972e664fb5268bc7", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_cov-6.3.0.dist-info/RECORD", + "bom-ref": "dbcbf0a856f94f16", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_cov-7.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "119bf4e01425aa3f", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_cov-6.3.0.dist-info/top_level.txt", + "bom-ref": "a220c869a5102e89", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_cov-7.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "83f58aea43feb114", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_forked-1.6.0.dist-info/METADATA", + "bom-ref": "54b8e02a0a95c4d1", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_forked-1.7.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2ba65528b2f827b6", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_forked-1.6.0.dist-info/RECORD", + "bom-ref": "597be06935647cdc", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_forked-1.7.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "907ad6e09414f7ac", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_forked-1.6.0.dist-info/top_level.txt", + "bom-ref": "694ebd820846e239", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_forked-1.7.5.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b500bfb13ad61819", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_rerunfailures-14.0.dist-info/METADATA", + "bom-ref": "91dde43686b30286", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_rerunfailures-16.6.dist-info/METADATA", "type": "file" }, { - "bom-ref": "022ff9d54f254158", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_rerunfailures-14.0.dist-info/RECORD", + "bom-ref": "4f745113edfd8cfb", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_rerunfailures-16.6.dist-info/RECORD", "type": "file" }, { - "bom-ref": "66a9ca1cc8f806b4", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_rerunfailures-14.0.dist-info/top_level.txt", + "bom-ref": "ac314b3799722c05", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_rerunfailures-16.6.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e97e81ee3792120d", + "bom-ref": "ca3703619f884123", "name": "/opt/venv/lib/python3.12/site-packages/pytest_shard-0.1.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3ecc17187f24e59c", + "bom-ref": "b73aadfe095bd312", "name": "/opt/venv/lib/python3.12/site-packages/pytest_shard-0.1.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2129663e271f5f48", + "bom-ref": "036f04e9d5409952", "name": "/opt/venv/lib/python3.12/site-packages/pytest_shard-0.1.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9fc9ba2c29aeb4c3", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_timeout-2.3.1.dist-info/METADATA", + "bom-ref": "7e013af91f2c8ba6", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_timeout-2.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c6b4b9106b1fed8e", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_timeout-2.3.1.dist-info/RECORD", + "bom-ref": "bc8d49245d54e60e", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_timeout-2.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d0760cdcb2b7a6a5", - "name": "/opt/venv/lib/python3.12/site-packages/pytest_timeout-2.3.1.dist-info/top_level.txt", + "bom-ref": "726c097fd5c95e12", + "name": "/opt/venv/lib/python3.12/site-packages/pytest_timeout-2.4.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "a4fbd91c2934eecc", + "bom-ref": "e24d129721cdbfde", "name": "/opt/venv/lib/python3.12/site-packages/python_dateutil-2.9.0.post0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cd498888b2594fed", + "bom-ref": "adb45fce5242f7ab", "name": "/opt/venv/lib/python3.12/site-packages/python_dateutil-2.9.0.post0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b08af3d739161b5a", + "bom-ref": "d3dfd7e485ba4e24", "name": "/opt/venv/lib/python3.12/site-packages/python_dateutil-2.9.0.post0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "8e4478bbf3179119", - "name": "/opt/venv/lib/python3.12/site-packages/python_dotenv-1.2.2.dist-info/METADATA", + "bom-ref": "5fff6231c973d27c", + "name": "/opt/venv/lib/python3.12/site-packages/python_dotenv-1.2.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c62b09549efdf1f1", - "name": "/opt/venv/lib/python3.12/site-packages/python_dotenv-1.2.2.dist-info/RECORD", + "bom-ref": "10e629c060c9555c", + "name": "/opt/venv/lib/python3.12/site-packages/python_dotenv-1.2.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "57b60a954e15510e", - "name": "/opt/venv/lib/python3.12/site-packages/python_dotenv-1.2.2.dist-info/top_level.txt", + "bom-ref": "80aa8ee76f5af6e7", + "name": "/opt/venv/lib/python3.12/site-packages/python_dotenv-1.2.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d364ac68f3818d1d", - "name": "/opt/venv/lib/python3.12/site-packages/python_json_logger-4.1.0.dist-info/METADATA", + "bom-ref": "24971892761516ef", + "name": "/opt/venv/lib/python3.12/site-packages/python_json_logger-4.2.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "36b22697eef76e2e", - "name": "/opt/venv/lib/python3.12/site-packages/python_json_logger-4.1.0.dist-info/RECORD", + "bom-ref": "9e5f469289c9049c", + "name": "/opt/venv/lib/python3.12/site-packages/python_json_logger-4.2.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e9e20dc4075bd0e7", - "name": "/opt/venv/lib/python3.12/site-packages/python_json_logger-4.1.0.dist-info/top_level.txt", + "bom-ref": "66e2e961dac408d7", + "name": "/opt/venv/lib/python3.12/site-packages/python_json_logger-4.2.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "a1f376b5718c12dd", + "bom-ref": "60049a97fb3803bb", "name": "/opt/venv/lib/python3.12/site-packages/python_multipart-0.0.32.dist-info/METADATA", "type": "file" }, { - "bom-ref": "778205cf175d528d", + "bom-ref": "be1bc7bd09d4e073", "name": "/opt/venv/lib/python3.12/site-packages/python_multipart-0.0.32.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f2f176fc315f2b70", + "bom-ref": "06b06d4ac92e81be", "name": "/opt/venv/lib/python3.12/site-packages/pytrec_eval_terrier-0.5.10.dist-info/METADATA", "type": "file" }, { - "bom-ref": "aa245df7b9f135da", + "bom-ref": "4bbf063e7b43ff14", "name": "/opt/venv/lib/python3.12/site-packages/pytrec_eval_terrier-0.5.10.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4013f91c50348123", + "bom-ref": "9e3ba1bbc3c7bd15", "name": "/opt/venv/lib/python3.12/site-packages/pytrec_eval_terrier-0.5.10.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "c8ccc0be97a09023", - "name": "/opt/venv/lib/python3.12/site-packages/pytz-2026.1.post1.dist-info/METADATA", + "bom-ref": "0bf82055a7a557a3", + "name": "/opt/venv/lib/python3.12/site-packages/pytz-2026.3.post1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a39d7331399169be", - "name": "/opt/venv/lib/python3.12/site-packages/pytz-2026.1.post1.dist-info/RECORD", + "bom-ref": "e5a3d57f9ea2c51e", + "name": "/opt/venv/lib/python3.12/site-packages/pytz-2026.3.post1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e8b803dbfcd24963", - "name": "/opt/venv/lib/python3.12/site-packages/pytz-2026.1.post1.dist-info/top_level.txt", + "bom-ref": "9d97a0baf8e41373", + "name": "/opt/venv/lib/python3.12/site-packages/pytz-2026.3.post1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "52e5b73ded546f80", + "bom-ref": "aa4cb9b7c692773e", "name": "/opt/venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "60008ee161002aa0", + "bom-ref": "c9bb2b78e9c1e182", "name": "/opt/venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5ddbf576544b5ab0", + "bom-ref": "389032d2493e2a3a", "name": "/opt/venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "eafb52a4d09d1125", + "bom-ref": "92e15322b3bc7ca4", "name": "/opt/venv/lib/python3.12/site-packages/pyzes-0.1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c68e3f19413d8ac4", + "bom-ref": "377e6c0b1cdc6ee9", "name": "/opt/venv/lib/python3.12/site-packages/pyzes-0.1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3f880d6deb9d362c", + "bom-ref": "bfd937add5650251", "name": "/opt/venv/lib/python3.12/site-packages/pyzes-0.1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0be544e796848f55", + "bom-ref": "fd7663b0f69143a7", "name": "/opt/venv/lib/python3.12/site-packages/pyzmq-27.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d760dbf2c1186a10", + "bom-ref": "50a58de07cede06e", "name": "/opt/venv/lib/python3.12/site-packages/pyzmq-27.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "15a26b2b7fe629ea", - "name": "/opt/venv/lib/python3.12/site-packages/rapidfuzz-3.12.1.dist-info/METADATA", + "bom-ref": "715877578e28dbab", + "name": "/opt/venv/lib/python3.12/site-packages/rapidfuzz-3.14.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "aeef97702bebda6e", - "name": "/opt/venv/lib/python3.12/site-packages/rapidfuzz-3.12.1.dist-info/RECORD", + "bom-ref": "982bc4f754895e2c", + "name": "/opt/venv/lib/python3.12/site-packages/rapidfuzz-3.14.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "eea21120b552ada0", - "name": "/opt/venv/lib/python3.12/site-packages/ray-2.57.0.dist-info/METADATA", + "bom-ref": "cb2180539268e8d2", + "name": "/opt/venv/lib/python3.12/site-packages/ray-2.58.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b8448f514df65bcf", - "name": "/opt/venv/lib/python3.12/site-packages/ray-2.57.0.dist-info/RECORD", + "bom-ref": "87d74d9b1e3862c7", + "name": "/opt/venv/lib/python3.12/site-packages/ray-2.58.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "901030589fc350f1", - "name": "/opt/venv/lib/python3.12/site-packages/ray-2.57.0.dist-info/top_level.txt", + "bom-ref": "c5853e10524b4d41", + "name": "/opt/venv/lib/python3.12/site-packages/ray-2.58.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1f867df697dafe7f", + "bom-ref": "6ddae38aebe5e8e1", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/aiohappyeyeballs-2.7.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "08ea6591d506b42d", + "bom-ref": "02690de8a1a42b9b", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/aiohappyeyeballs-2.7.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "bd9122504176d588", + "bom-ref": "2f4f957ca4560472", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/aiohttp-3.14.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4073c53266e3f488", + "bom-ref": "4aca5e52e18dd0fa", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/aiohttp-3.14.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a48d9fb208c40cf4", + "bom-ref": "1979caef11c3e776", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/aiohttp-3.14.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "74b3dbea9ad059ec", + "bom-ref": "1d39f393cb87a30a", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/aiosignal-1.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2f8ef860a9e52af5", + "bom-ref": "e2f692954fde0127", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/aiosignal-1.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "36a1a21be81f3c01", + "bom-ref": "b312fc44a1dc174b", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/aiosignal-1.4.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "ee63f0e303d8c5c5", + "bom-ref": "7312672a04664a63", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/attrs-26.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4535f727f2fa0bfb", + "bom-ref": "7440c711062e56f5", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/attrs-26.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "32210dc4feda1c75", + "bom-ref": "69ddb9cbec686bb7", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/frozenlist-1.8.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a809e55d16b9aadf", + "bom-ref": "6c7853e8dbffe4d1", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/frozenlist-1.8.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "35419578befe9c60", + "bom-ref": "0773d6d56a7c07aa", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/frozenlist-1.8.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "50a0766a92e56f6e", - "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/idna-3.18.dist-info/METADATA", + "bom-ref": "63fe5b2cb2a5c7ba", + "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/idna-3.15.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b82fe2908f12c19a", - "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/idna-3.18.dist-info/RECORD", + "bom-ref": "c602477d2e65c1b4", + "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/idna-3.15.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a807174a678f680b", + "bom-ref": "142eb0a678984b7d", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/multidict-6.7.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1e46e3e446f471f5", + "bom-ref": "d0ce2a5e428b34f3", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/multidict-6.7.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c696f532c907e321", + "bom-ref": "773a88ad35810efb", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/multidict-6.7.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0a7b4bda5e65524c", + "bom-ref": "a6cda014bb33af52", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/propcache-0.5.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ae0e0d6084dae155", + "bom-ref": "1ff98989790a1247", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/propcache-0.5.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d5acffa1308e7a8e", + "bom-ref": "62b85827e261bf58", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/propcache-0.5.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b3d825d074c48ad7", + "bom-ref": "5dca265c62b3376d", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/typing_extensions-4.16.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "33e33b6519d935ac", + "bom-ref": "50c61cf1b51c7dde", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/typing_extensions-4.16.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6ffa38d9031d73eb", + "bom-ref": "62be5ef542d238e9", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/yarl-1.24.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f966e36f5635d971", + "bom-ref": "1ec59101787c325f", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/yarl-1.24.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "63c25c1ff494c573", + "bom-ref": "aa416cc16c69817d", "name": "/opt/venv/lib/python3.12/site-packages/ray/_private/runtime_env/agent/thirdparty_files/yarl-1.24.5.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "f3c189d1a89c7f1f", + "bom-ref": "e15c5875e83ea9a1", "name": "/opt/venv/lib/python3.12/site-packages/ray/jars/ray_dist.jar", "type": "file" }, { - "bom-ref": "ef45dee9f4c24741", + "bom-ref": "a69fc76a46e1fac3", "name": "/opt/venv/lib/python3.12/site-packages/ray/thirdparty_files/colorama-0.4.6.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3be97d7bac6752ec", + "bom-ref": "3cbe2741075e7162", "name": "/opt/venv/lib/python3.12/site-packages/ray/thirdparty_files/colorama-0.4.6.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6f7d63f029eddfd0", + "bom-ref": "a1fe5d19d3a2f33a", "name": "/opt/venv/lib/python3.12/site-packages/ray/thirdparty_files/psutil-7.2.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d291bd81103e6682", + "bom-ref": "09f41e5d78b19dec", "name": "/opt/venv/lib/python3.12/site-packages/ray/thirdparty_files/psutil-7.2.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e0ddcbc34d65f257", + "bom-ref": "b6632e6454168885", "name": "/opt/venv/lib/python3.12/site-packages/ray/thirdparty_files/psutil-7.2.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "3bc5062622f561d3", + "bom-ref": "edccf2b142eb0c29", "name": "/opt/venv/lib/python3.12/site-packages/referencing-0.37.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9677dc8672e2cd20", + "bom-ref": "51e7fd1130ba8446", "name": "/opt/venv/lib/python3.12/site-packages/referencing-0.37.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "346160865a4c978c", - "name": "/opt/venv/lib/python3.12/site-packages/regex-2026.3.32.dist-info/METADATA", + "bom-ref": "a7cbe8a299f57bd6", + "name": "/opt/venv/lib/python3.12/site-packages/regex-2026.7.19.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9ea7cf175dbf4c30", - "name": "/opt/venv/lib/python3.12/site-packages/regex-2026.3.32.dist-info/RECORD", + "bom-ref": "c8da48bf599e0077", + "name": "/opt/venv/lib/python3.12/site-packages/regex-2026.7.19.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6d2da5e6da836991", - "name": "/opt/venv/lib/python3.12/site-packages/regex-2026.3.32.dist-info/top_level.txt", + "bom-ref": "94485b08f69d3943", + "name": "/opt/venv/lib/python3.12/site-packages/regex-2026.7.19.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "dd192271bbc8828a", - "name": "/opt/venv/lib/python3.12/site-packages/requests-2.33.1.dist-info/METADATA", + "bom-ref": "e6cd608b75405b3a", + "name": "/opt/venv/lib/python3.12/site-packages/requests-2.34.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "af31b1e04b7ff208", - "name": "/opt/venv/lib/python3.12/site-packages/requests-2.33.1.dist-info/RECORD", + "bom-ref": "08ae274d4a0869ca", + "name": "/opt/venv/lib/python3.12/site-packages/requests-2.34.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2698c76f1c7be840", - "name": "/opt/venv/lib/python3.12/site-packages/requests-2.33.1.dist-info/top_level.txt", + "bom-ref": "c34f6269367c5348", + "name": "/opt/venv/lib/python3.12/site-packages/requests-2.34.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "2dc270594d3be583", - "name": "/opt/venv/lib/python3.12/site-packages/rich-14.3.3.dist-info/METADATA", + "bom-ref": "478bab6a5441782f", + "name": "/opt/venv/lib/python3.12/site-packages/rich-15.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b6012f5e8e31ceea", - "name": "/opt/venv/lib/python3.12/site-packages/rich-14.3.3.dist-info/RECORD", + "bom-ref": "1533a1e0087bed4a", + "name": "/opt/venv/lib/python3.12/site-packages/rich-15.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "74c560d220f7a623", - "name": "/opt/venv/lib/python3.12/site-packages/rich_toolkit-0.20.1.dist-info/METADATA", + "bom-ref": "be137e56ac7e7a41", + "name": "/opt/venv/lib/python3.12/site-packages/rich_toolkit-0.20.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d3369ae8f542797d", - "name": "/opt/venv/lib/python3.12/site-packages/rich_toolkit-0.20.1.dist-info/RECORD", + "bom-ref": "9c3cf262e3c18d21", + "name": "/opt/venv/lib/python3.12/site-packages/rich_toolkit-0.20.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "019d8b480c3b09c3", - "name": "/opt/venv/lib/python3.12/site-packages/rignore-0.7.6.dist-info/METADATA", + "bom-ref": "304e86b8cf896021", + "name": "/opt/venv/lib/python3.12/site-packages/rignore-0.8.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "320da630a1a56727", - "name": "/opt/venv/lib/python3.12/site-packages/rignore-0.7.6.dist-info/RECORD", + "bom-ref": "3b2cd31b49a5c4c0", + "name": "/opt/venv/lib/python3.12/site-packages/rignore-0.8.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4b6468770f5938a0", + "bom-ref": "586f5b33c9b51ece", "name": "/opt/venv/lib/python3.12/site-packages/rouge_score-0.1.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "69c5eef74c6c8e03", + "bom-ref": "5edfcc188b408c3d", "name": "/opt/venv/lib/python3.12/site-packages/rouge_score-0.1.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2acc43b7e60a9da8", + "bom-ref": "bc5635c74a47489e", "name": "/opt/venv/lib/python3.12/site-packages/rouge_score-0.1.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "f1a206884f32d82a", - "name": "/opt/venv/lib/python3.12/site-packages/rpds_py-0.30.0.dist-info/METADATA", + "bom-ref": "e3e3492a4fa7f416", + "name": "/opt/venv/lib/python3.12/site-packages/rpds_py-2026.6.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2ef336ffbe23533a", - "name": "/opt/venv/lib/python3.12/site-packages/rpds_py-0.30.0.dist-info/RECORD", + "bom-ref": "58f7d24770ded2da", + "name": "/opt/venv/lib/python3.12/site-packages/rpds_py-2026.6.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "607ea85ef66bdc13", + "bom-ref": "0437b85056730d69", "name": "/opt/venv/lib/python3.12/site-packages/sacrebleu-2.6.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "aadde446d7285aa0", + "bom-ref": "9a2aecc4b2bef11e", "name": "/opt/venv/lib/python3.12/site-packages/sacrebleu-2.6.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "57d4bde98325de6f", + "bom-ref": "54870cce4df02101", "name": "/opt/venv/lib/python3.12/site-packages/sacrebleu-2.6.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "5d4d31d435630218", + "bom-ref": "e5e46401c5ae2a4a", "name": "/opt/venv/lib/python3.12/site-packages/safetensors-0.8.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "085b32f104d93246", + "bom-ref": "11d23a6dfdb51694", "name": "/opt/venv/lib/python3.12/site-packages/safetensors-0.8.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8ac001334830fb81", - "name": "/opt/venv/lib/python3.12/site-packages/schemathesis-4.14.2.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "67a64b6eff1a57f2", - "name": "/opt/venv/lib/python3.12/site-packages/schemathesis-4.14.2.dist-info/RECORD", - "type": "file" - }, - { - "bom-ref": "8fad34d58c60e8db", - "name": "/opt/venv/lib/python3.12/site-packages/scikit_image-0.26.0.dist-info/METADATA", + "bom-ref": "a86a669da43fcf63", + "name": "/opt/venv/lib/python3.12/site-packages/schemathesis-4.24.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "20df9ee1e3c98038", - "name": "/opt/venv/lib/python3.12/site-packages/scikit_image-0.26.0.dist-info/RECORD", + "bom-ref": "c5eb07d4d876e0a5", + "name": "/opt/venv/lib/python3.12/site-packages/schemathesis-4.24.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4560bc1f2a75976a", - "name": "/opt/venv/lib/python3.12/site-packages/scikit_learn-1.8.0.dist-info/METADATA", + "bom-ref": "08e64da8ec5f5d17", + "name": "/opt/venv/lib/python3.12/site-packages/scikit_learn-1.9.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "680f0c6189c267e8", - "name": "/opt/venv/lib/python3.12/site-packages/scikit_learn-1.8.0.dist-info/RECORD", + "bom-ref": "d602a45db35f0f28", + "name": "/opt/venv/lib/python3.12/site-packages/scikit_learn-1.9.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b4eb9b7ae068619c", - "name": "/opt/venv/lib/python3.12/site-packages/scipy-1.17.1.dist-info/METADATA", + "bom-ref": "9dc490bf990a0af3", + "name": "/opt/venv/lib/python3.12/site-packages/scipy-1.18.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8048cfd5ae8abc48", - "name": "/opt/venv/lib/python3.12/site-packages/scipy-1.17.1.dist-info/RECORD", + "bom-ref": "15c67067dedd67a7", + "name": "/opt/venv/lib/python3.12/site-packages/scipy-1.18.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "69adb7d5e088ae1b", + "bom-ref": "af7c492e48d5e981", "name": "/opt/venv/lib/python3.12/site-packages/semantic_version-2.10.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b4f665402c010635", + "bom-ref": "395b72e772d8faaf", "name": "/opt/venv/lib/python3.12/site-packages/semantic_version-2.10.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "0188e86b47af73d5", + "bom-ref": "701c1e2c779582f7", "name": "/opt/venv/lib/python3.12/site-packages/semantic_version-2.10.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "3edee1dec1099cf6", - "name": "/opt/venv/lib/python3.12/site-packages/sentence_transformers-5.3.0.dist-info/METADATA", + "bom-ref": "1f001734555ca735", + "name": "/opt/venv/lib/python3.12/site-packages/sentence_transformers-5.7.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "430a4ef57ccf7b5b", - "name": "/opt/venv/lib/python3.12/site-packages/sentence_transformers-5.3.0.dist-info/RECORD", + "bom-ref": "9761094f87b91593", + "name": "/opt/venv/lib/python3.12/site-packages/sentence_transformers-5.7.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "33b759a4feaf9d51", - "name": "/opt/venv/lib/python3.12/site-packages/sentence_transformers-5.3.0.dist-info/top_level.txt", + "bom-ref": "062be1d31a041e43", + "name": "/opt/venv/lib/python3.12/site-packages/sentence_transformers-5.7.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "4ec5cca1e71f7ba1", + "bom-ref": "c0ee064380895a9f", "name": "/opt/venv/lib/python3.12/site-packages/sentencepiece-0.2.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "61b20cc4ba5665a9", + "bom-ref": "4815e7388208e9db", "name": "/opt/venv/lib/python3.12/site-packages/sentencepiece-0.2.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d78d836280c9df69", + "bom-ref": "bee778e2a3cc7deb", "name": "/opt/venv/lib/python3.12/site-packages/sentencepiece-0.2.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b85aeb99a7dbd45d", - "name": "/opt/venv/lib/python3.12/site-packages/sentry_sdk-2.63.0.dist-info/METADATA", + "bom-ref": "f9c181728281b692", + "name": "/opt/venv/lib/python3.12/site-packages/sentry_sdk-2.68.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c4209af960ec09a4", - "name": "/opt/venv/lib/python3.12/site-packages/sentry_sdk-2.63.0.dist-info/RECORD", + "bom-ref": "774342886f4e4942", + "name": "/opt/venv/lib/python3.12/site-packages/sentry_sdk-2.68.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "bb73aa08640efda0", - "name": "/opt/venv/lib/python3.12/site-packages/sentry_sdk-2.63.0.dist-info/top_level.txt", + "bom-ref": "b6a2c3d3bf93d668", + "name": "/opt/venv/lib/python3.12/site-packages/sentry_sdk-2.68.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1b1f0daa2c2eb9d3", + "bom-ref": "b3af6dba7047b799", "name": "/opt/venv/lib/python3.12/site-packages/setproctitle-1.3.7.dist-info/METADATA", "type": "file" }, { - "bom-ref": "37cc3f69fb2890ae", + "bom-ref": "5638af0351c68238", "name": "/opt/venv/lib/python3.12/site-packages/setproctitle-1.3.7.dist-info/RECORD", "type": "file" }, { - "bom-ref": "742d99f21dd6247e", + "bom-ref": "331d75e084c8989c", "name": "/opt/venv/lib/python3.12/site-packages/setproctitle-1.3.7.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "2b53498374274f9a", + "bom-ref": "78333ddaf56e6c38", "name": "/opt/venv/lib/python3.12/site-packages/setuptools-80.10.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a7bfa3f9ade13b02", + "bom-ref": "ffee7baeb795fe68", "name": "/opt/venv/lib/python3.12/site-packages/setuptools-80.10.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8781093c201caa90", + "bom-ref": "3ea61524c979ab5a", "name": "/opt/venv/lib/python3.12/site-packages/setuptools-80.10.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d172d3391bc1350f", + "bom-ref": "c4b2b326282cfda9", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "255009fb08190652", + "bom-ref": "5ad04626ca175400", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "899c7bf82e970351", + "bom-ref": "4821bf5e10ec9ef7", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b6c8d87c42f89e09", + "bom-ref": "5658c806b16f55cb", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "fe27316a4ce49e82", + "bom-ref": "e799ae7968e5d1d4", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d4755fbd798709b5", + "bom-ref": "0a61a4ced0595d1f", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "438a7e74180e6296", + "bom-ref": "ca7c73f5fbc89610", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "021c1b6bb81acffc", + "bom-ref": "9c352c1329ec5cc6", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cb771a6011e3d3d5", + "bom-ref": "8da7c4e90d651543", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1ccc982e33282de7", + "bom-ref": "75895e805a89bd41", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco.text-4.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ba0fc0988e2d69e6", + "bom-ref": "7299f0eb692acf7c", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco.text-4.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "fcbf0d40136e223a", + "bom-ref": "1ca843cc3480a2f8", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco.text-4.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9594ec4ae795a037", + "bom-ref": "e9e08e1d4e856fc1", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco_context-6.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "59f999974053ebd1", + "bom-ref": "f75e96aa3e07075b", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco_context-6.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ee3aea1c6d528866", + "bom-ref": "4c18443cbd69d318", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco_context-6.1.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1903ded58d7492dc", + "bom-ref": "5cd540427f95acca", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e9ffc69b7bc5e962", + "bom-ref": "5f068ded7ac73be8", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "35cb15619c21788c", + "bom-ref": "dacdfb6abdb30efa", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0190f36044ba5117", + "bom-ref": "3b2220849c2f7599", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/more_itertools-10.8.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "56dab01723f74227", + "bom-ref": "482a4c32ef7a48f9", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/more_itertools-10.8.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "23daeb9b0ab40462", + "bom-ref": "e34142c9b02006d8", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging-26.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cb12f75a1987397c", + "bom-ref": "83e60ee6d3250412", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging-26.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "802eea18f4e9121f", + "bom-ref": "1df4b389dc8d2e1d", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/platformdirs-4.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2acb7ec0f98f31ef", + "bom-ref": "9c870b9cf1228fa5", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/platformdirs-4.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "993ef549039eb96e", + "bom-ref": "e1641360c556bed0", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/tomli-2.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f2b2141aa5778fd9", + "bom-ref": "c6bf758b9b85613b", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/tomli-2.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "15fe34996939b284", + "bom-ref": "b025c66e235f317a", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/wheel-0.46.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7bb5903d0d15467c", + "bom-ref": "9351d98ef625a822", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/wheel-0.46.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8c6aee53132138a9", + "bom-ref": "1fa74d234408e02b", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp-3.23.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "996d80e9fef1c4c5", + "bom-ref": "0a45c367d093ae2f", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp-3.23.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c87b7bf57a794f78", + "bom-ref": "5b43ac2fe514e13a", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp-3.23.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "94253a9ce3e8d644", + "bom-ref": "bc4812c2a519934e", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/cli-32.exe", "type": "file" }, { - "bom-ref": "24514bbc430d8145", + "bom-ref": "ddd0ccdf635ea29f", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/cli-64.exe", "type": "file" }, { - "bom-ref": "24491a34a61a1557", + "bom-ref": "0ba05974adeb4969", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/cli-arm64.exe", "type": "file" }, { - "bom-ref": "30136aacf40a559a", + "bom-ref": "a3b8db609a42a5d8", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/cli.exe", "type": "file" }, { - "bom-ref": "4d96602d79debfbe", + "bom-ref": "8476dc38ccaaebc4", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/gui-32.exe", "type": "file" }, { - "bom-ref": "b81b0cf1c3a27737", + "bom-ref": "26b8926dd91176f1", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/gui-64.exe", "type": "file" }, { - "bom-ref": "851f1fcd8b37e83b", + "bom-ref": "837eb0a9cfd7e749", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/gui-arm64.exe", "type": "file" }, { - "bom-ref": "6655ce192d149c5a", + "bom-ref": "2a42fe8289a3b304", "name": "/opt/venv/lib/python3.12/site-packages/setuptools/gui.exe", "type": "file" }, { - "bom-ref": "fc49b297b57c2c92", + "bom-ref": "67952d022e6dd5a0", "name": "/opt/venv/lib/python3.12/site-packages/setuptools_rust-1.13.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "620b3e3abe8a95f9", + "bom-ref": "6f06a582ef9070bb", "name": "/opt/venv/lib/python3.12/site-packages/setuptools_rust-1.13.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a4907fd7503baf16", + "bom-ref": "91d4142f828c074c", "name": "/opt/venv/lib/python3.12/site-packages/setuptools_rust-1.13.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "cce4d427e86298fc", - "name": "/opt/venv/lib/python3.12/site-packages/setuptools_scm-10.2.1.dist-info/METADATA", + "bom-ref": "1631d40416f3dedd", + "name": "/opt/venv/lib/python3.12/site-packages/setuptools_scm-10.2.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3cad02dd1a1be6ab", - "name": "/opt/venv/lib/python3.12/site-packages/setuptools_scm-10.2.1.dist-info/RECORD", + "bom-ref": "150224621a01e306", + "name": "/opt/venv/lib/python3.12/site-packages/setuptools_scm-10.2.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "89a0299f154a6191", - "name": "/opt/venv/lib/python3.12/site-packages/setuptools_scm-10.2.1.dist-info/top_level.txt", + "bom-ref": "def02ce95fbc3e98", + "name": "/opt/venv/lib/python3.12/site-packages/setuptools_scm-10.2.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "fb6ff7c6e7373e7d", + "bom-ref": "ecb1208c70bbb203", "name": "/opt/venv/lib/python3.12/site-packages/shellingham-1.5.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "509a0f9d0ecae684", + "bom-ref": "6bf009fe408e9c8a", "name": "/opt/venv/lib/python3.12/site-packages/shellingham-1.5.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "66cfeada36908ca4", + "bom-ref": "3eee3f7e2ef70a1a", "name": "/opt/venv/lib/python3.12/site-packages/shellingham-1.5.4.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "2f279d6710fe7db4", + "bom-ref": "71f9d007dc1222f6", + "name": "/opt/venv/lib/python3.12/site-packages/simsimd-6.5.16.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "e65eb5b8a79312c4", + "name": "/opt/venv/lib/python3.12/site-packages/simsimd-6.5.16.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "b831ba4d03578412", + "name": "/opt/venv/lib/python3.12/site-packages/simsimd-6.5.16.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "65dea643eb16bf46", "name": "/opt/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "058907c975a3b863", + "bom-ref": "49f9009ab068191d", "name": "/opt/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "632a26f519e86312", + "bom-ref": "faf1f14e3a932f44", "name": "/opt/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6846f81c7b291d22", + "bom-ref": "060b94c842c6b164", "name": "/opt/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5ead22dbe841fd86", + "bom-ref": "54954ff84d3628cc", "name": "/opt/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cc1aa8a951415f72", + "bom-ref": "ae926290aa825108", "name": "/opt/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "893679dd194c73d5", + "bom-ref": "ec33aae80524a5bb", "name": "/opt/venv/lib/python3.12/site-packages/sortedcontainers-2.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "553fb0afc874f62d", + "bom-ref": "3ccd7a8176b12c13", "name": "/opt/venv/lib/python3.12/site-packages/sortedcontainers-2.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9a98e6c2758d10aa", + "bom-ref": "d2188c73fc09ea68", "name": "/opt/venv/lib/python3.12/site-packages/sortedcontainers-2.4.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9a926929db8d3a3b", - "name": "/opt/venv/lib/python3.12/site-packages/soundfile-0.13.1.dist-info/METADATA", + "bom-ref": "2625bddd425dcd8e", + "name": "/opt/venv/lib/python3.12/site-packages/soundfile-0.14.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b61b7c0cd19fe8fc", - "name": "/opt/venv/lib/python3.12/site-packages/soundfile-0.13.1.dist-info/RECORD", + "bom-ref": "f24bfb021abd8080", + "name": "/opt/venv/lib/python3.12/site-packages/soundfile-0.14.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2d1e65f33593a2e8", - "name": "/opt/venv/lib/python3.12/site-packages/soundfile-0.13.1.dist-info/top_level.txt", + "bom-ref": "893627f642d324d4", + "name": "/opt/venv/lib/python3.12/site-packages/soundfile-0.14.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6bb3686d75e317f1", - "name": "/opt/venv/lib/python3.12/site-packages/soxr-0.5.0.post1.dist-info/METADATA", + "bom-ref": "4ac65000763a3a81", + "name": "/opt/venv/lib/python3.12/site-packages/soxr-1.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c1a41c13de109ce5", - "name": "/opt/venv/lib/python3.12/site-packages/soxr-0.5.0.post1.dist-info/RECORD", + "bom-ref": "f695695b69299bd1", + "name": "/opt/venv/lib/python3.12/site-packages/soxr-1.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "79886824358bb626", + "bom-ref": "ba90570b7b06d654", "name": "/opt/venv/lib/python3.12/site-packages/sqlitedict-2.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "80a6e75892cf9787", + "bom-ref": "bf010975f8cf090d", "name": "/opt/venv/lib/python3.12/site-packages/sqlitedict-2.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d57fe7e82528889a", + "bom-ref": "a648899b1f935e10", "name": "/opt/venv/lib/python3.12/site-packages/sqlitedict-2.1.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "45d04c4f1465f918", - "name": "/opt/venv/lib/python3.12/site-packages/sse_starlette-3.4.5.dist-info/METADATA", + "bom-ref": "f5187e333157b2ee", + "name": "/opt/venv/lib/python3.12/site-packages/sse_starlette-3.4.8.dist-info/METADATA", "type": "file" }, { - "bom-ref": "900d1e9e8784de58", - "name": "/opt/venv/lib/python3.12/site-packages/sse_starlette-3.4.5.dist-info/RECORD", + "bom-ref": "879841a18cca2afa", + "name": "/opt/venv/lib/python3.12/site-packages/sse_starlette-3.4.8.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2a0eb1e1c8e0230f", - "name": "/opt/venv/lib/python3.12/site-packages/sse_starlette-3.4.5.dist-info/top_level.txt", + "bom-ref": "1cd320dcf6c5cf8c", + "name": "/opt/venv/lib/python3.12/site-packages/sse_starlette-3.4.8.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "72789453b810fc42", - "name": "/opt/venv/lib/python3.12/site-packages/starlette-1.3.1.dist-info/METADATA", + "bom-ref": "22e72d2876576a1a", + "name": "/opt/venv/lib/python3.12/site-packages/starlette-1.6.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1339cc5c8a384edb", - "name": "/opt/venv/lib/python3.12/site-packages/starlette-1.3.1.dist-info/RECORD", + "bom-ref": "7e1c3560d03177c1", + "name": "/opt/venv/lib/python3.12/site-packages/starlette-1.6.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7f0be10c778fc497", + "bom-ref": "9e120aa9f8e88601", "name": "/opt/venv/lib/python3.12/site-packages/starlette_testclient-0.4.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "68018bf6eb71fc11", + "bom-ref": "8ca255a9ac4fb017", "name": "/opt/venv/lib/python3.12/site-packages/starlette_testclient-0.4.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "41bac99ba7afacfb", - "name": "/opt/venv/lib/python3.12/site-packages/structlog-25.5.0.dist-info/METADATA", + "bom-ref": "9f15e36399b64c7d", + "name": "/opt/venv/lib/python3.12/site-packages/stringzilla-5.1.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "e25bbc6dfcab4006", + "name": "/opt/venv/lib/python3.12/site-packages/stringzilla-5.1.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "82feed60a2894426", + "name": "/opt/venv/lib/python3.12/site-packages/stringzilla-5.1.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "755a1bd3fb4d5f41", - "name": "/opt/venv/lib/python3.12/site-packages/structlog-25.5.0.dist-info/RECORD", + "bom-ref": "a870667a6c5c55a1", + "name": "/opt/venv/lib/python3.12/site-packages/structlog-26.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e679b482ccefe98f", + "bom-ref": "351182006fa035ef", + "name": "/opt/venv/lib/python3.12/site-packages/structlog-26.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "73b067a3425e51e5", "name": "/opt/venv/lib/python3.12/site-packages/supervisor-4.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d087a0798f02ca53", + "bom-ref": "9323a63753b39945", "name": "/opt/venv/lib/python3.12/site-packages/supervisor-4.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e294fd61669c2544", + "bom-ref": "2e916f1a1ccc75ee", "name": "/opt/venv/lib/python3.12/site-packages/supervisor-4.3.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1a13eb3b817acda0", + "bom-ref": "ebbb1d46a6682e9d", "name": "/opt/venv/lib/python3.12/site-packages/sympy-1.14.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "52272d7b17b78668", + "bom-ref": "23edb9bbac93fcad", "name": "/opt/venv/lib/python3.12/site-packages/sympy-1.14.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "04669bf455ebb0ff", + "bom-ref": "2a3847d2180b7f7a", "name": "/opt/venv/lib/python3.12/site-packages/sympy-1.14.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d338ec4263d01211", - "name": "/opt/venv/lib/python3.12/site-packages/tabledata-1.3.4.dist-info/METADATA", + "bom-ref": "0c475b340a203a7a", + "name": "/opt/venv/lib/python3.12/site-packages/tabledata-1.3.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d24ebc491e817569", - "name": "/opt/venv/lib/python3.12/site-packages/tabledata-1.3.4.dist-info/RECORD", + "bom-ref": "a4389984049e2961", + "name": "/opt/venv/lib/python3.12/site-packages/tabledata-1.3.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6a2b9ffee87a5fde", - "name": "/opt/venv/lib/python3.12/site-packages/tabledata-1.3.4.dist-info/top_level.txt", + "bom-ref": "f4c13cfdf6bf7ff2", + "name": "/opt/venv/lib/python3.12/site-packages/tabledata-1.3.5.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "4ba0bcf675f1b896", + "bom-ref": "613a8c586d003cec", "name": "/opt/venv/lib/python3.12/site-packages/tabulate-0.10.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4b57812e591966e0", + "bom-ref": "fa12ef25c8d1990e", "name": "/opt/venv/lib/python3.12/site-packages/tabulate-0.10.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "fdb7783bdd8d9124", + "bom-ref": "350d8bb370f17406", "name": "/opt/venv/lib/python3.12/site-packages/tabulate-0.10.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b498895bac1a421b", + "bom-ref": "4587f76ac3280ec2", "name": "/opt/venv/lib/python3.12/site-packages/tbb-2023.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d44ab3b9f6e43123", + "bom-ref": "8737799617e668c6", "name": "/opt/venv/lib/python3.12/site-packages/tbb-2023.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b4e696eb5b9fafb8", + "bom-ref": "252c7cfdc6339799", "name": "/opt/venv/lib/python3.12/site-packages/tbb-2023.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d685de641a456339", - "name": "/opt/venv/lib/python3.12/site-packages/tblib-3.1.0.dist-info/METADATA", + "bom-ref": "b2503da4a3ca1074", + "name": "/opt/venv/lib/python3.12/site-packages/tblib-3.2.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a8d4dbecc04f2fc9", - "name": "/opt/venv/lib/python3.12/site-packages/tblib-3.1.0.dist-info/RECORD", + "bom-ref": "5f3b644bef745f33", + "name": "/opt/venv/lib/python3.12/site-packages/tblib-3.2.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "955a9d24a4eb52fd", - "name": "/opt/venv/lib/python3.12/site-packages/tblib-3.1.0.dist-info/top_level.txt", + "bom-ref": "baaa714579f3cf39", + "name": "/opt/venv/lib/python3.12/site-packages/tblib-3.2.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "71194fbae3596046", + "bom-ref": "49f3730eb586df8b", "name": "/opt/venv/lib/python3.12/site-packages/tcmlib-1.5.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5753164645eab43e", + "bom-ref": "fef972dbf35bcb37", "name": "/opt/venv/lib/python3.12/site-packages/tcmlib-1.5.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7320f614be7fc5ff", + "bom-ref": "7f466838a574c162", "name": "/opt/venv/lib/python3.12/site-packages/tcmlib-1.5.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d3c99af9b04a0506", + "bom-ref": "faf0f9193dc96718", "name": "/opt/venv/lib/python3.12/site-packages/tcolorpy-0.1.7.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ef90be757ac28620", + "bom-ref": "e156d2a830914966", "name": "/opt/venv/lib/python3.12/site-packages/tcolorpy-0.1.7.dist-info/RECORD", "type": "file" }, { - "bom-ref": "81d7827269ec1fe2", + "bom-ref": "c2e6088dea2da8c4", "name": "/opt/venv/lib/python3.12/site-packages/tcolorpy-0.1.7.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "8bd1c3bf306191c1", + "bom-ref": "3e80cbd65f854e43", "name": "/opt/venv/lib/python3.12/site-packages/tenacity-9.1.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "43b97551eeb0c6a8", + "bom-ref": "b48984fa8dc8437a", "name": "/opt/venv/lib/python3.12/site-packages/tenacity-9.1.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "47e42dc45fabe4f7", + "bom-ref": "23c840573d6e01d9", "name": "/opt/venv/lib/python3.12/site-packages/tenacity-9.1.4.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "fe07f5b387dd3fe0", + "bom-ref": "77ab59e4ee5bc186", "name": "/opt/venv/lib/python3.12/site-packages/termcolor-3.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "efe181ece84f46ef", + "bom-ref": "3a92a063e25edaf5", "name": "/opt/venv/lib/python3.12/site-packages/termcolor-3.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "75726882f83597fd", + "bom-ref": "51372c1c23458e33", "name": "/opt/venv/lib/python3.12/site-packages/threadpoolctl-3.6.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "83f75f859d100662", + "bom-ref": "f0cf35e806e4f92c", "name": "/opt/venv/lib/python3.12/site-packages/threadpoolctl-3.6.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d7b586f517bd4059", - "name": "/opt/venv/lib/python3.12/site-packages/tifffile-2026.3.3.dist-info/METADATA", + "bom-ref": "ab9a3edf4b082a8e", + "name": "/opt/venv/lib/python3.12/site-packages/tiktoken-0.14.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d5724b9106032d75", - "name": "/opt/venv/lib/python3.12/site-packages/tifffile-2026.3.3.dist-info/RECORD", + "bom-ref": "cfc5dc918e677b7d", + "name": "/opt/venv/lib/python3.12/site-packages/tiktoken-0.14.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2ed0cd647bbcfa36", - "name": "/opt/venv/lib/python3.12/site-packages/tifffile-2026.3.3.dist-info/top_level.txt", + "bom-ref": "a10c5877e0e53018", + "name": "/opt/venv/lib/python3.12/site-packages/tiktoken-0.14.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "ec76b60bf86995f4", - "name": "/opt/venv/lib/python3.12/site-packages/tiktoken-0.12.0.dist-info/METADATA", + "bom-ref": "780318620b19aadc", + "name": "/opt/venv/lib/python3.12/site-packages/timm-1.0.28.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a36e243bd46a144b", - "name": "/opt/venv/lib/python3.12/site-packages/tiktoken-0.12.0.dist-info/RECORD", + "bom-ref": "7e2ebc9edda81073", + "name": "/opt/venv/lib/python3.12/site-packages/timm-1.0.28.dist-info/RECORD", "type": "file" }, { - "bom-ref": "0168557cc9f3a6b3", - "name": "/opt/venv/lib/python3.12/site-packages/tiktoken-0.12.0.dist-info/top_level.txt", + "bom-ref": "469b07347ae6b8db", + "name": "/opt/venv/lib/python3.12/site-packages/tokenizers-0.22.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e1ed55dd232c5dcd", - "name": "/opt/venv/lib/python3.12/site-packages/timm-1.0.17.dist-info/METADATA", + "bom-ref": "da0c61e782048e74", + "name": "/opt/venv/lib/python3.12/site-packages/tokenizers-0.22.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7c9d2bb000e04829", - "name": "/opt/venv/lib/python3.12/site-packages/timm-1.0.17.dist-info/RECORD", + "bom-ref": "53e7975306b218cb", + "name": "/opt/venv/lib/python3.12/site-packages/torch-2.13.0+xpu.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b6364ae2bd9bf7dd", - "name": "/opt/venv/lib/python3.12/site-packages/tokenizers-0.22.2.dist-info/METADATA", + "bom-ref": "ddaca0647df9e594", + "name": "/opt/venv/lib/python3.12/site-packages/torch-2.13.0+xpu.dist-info/RECORD", "type": "file" }, { - "bom-ref": "386002afbc8623c6", - "name": "/opt/venv/lib/python3.12/site-packages/tokenizers-0.22.2.dist-info/RECORD", + "bom-ref": "b6dd42fe1b17c111", + "name": "/opt/venv/lib/python3.12/site-packages/torch-2.13.0+xpu.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "ae6ea8a026e1980a", - "name": "/opt/venv/lib/python3.12/site-packages/torch-2.13.0+xpu.dist-info/METADATA", + "bom-ref": "0685431dbcdab3d1", + "name": "/opt/venv/lib/python3.12/site-packages/torchaudio-2.11.0+xpu.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cceccff5bdb817e9", - "name": "/opt/venv/lib/python3.12/site-packages/torch-2.13.0+xpu.dist-info/RECORD", + "bom-ref": "ab83ce7e3021cc29", + "name": "/opt/venv/lib/python3.12/site-packages/torchaudio-2.11.0+xpu.dist-info/RECORD", "type": "file" }, { - "bom-ref": "02418237eff34b90", - "name": "/opt/venv/lib/python3.12/site-packages/torch-2.13.0+xpu.dist-info/top_level.txt", + "bom-ref": "a6f0f1aa75ff2368", + "name": "/opt/venv/lib/python3.12/site-packages/torchaudio-2.11.0+xpu.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "34f659b02d13889b", - "name": "/opt/venv/lib/python3.12/site-packages/torchaudio-2.11.0+xpu.dist-info/METADATA", + "bom-ref": "07e8ce015ce06913", + "name": "/opt/venv/lib/python3.12/site-packages/torchcodec-0.16.0+cpu.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d36cbcb2043ec80f", - "name": "/opt/venv/lib/python3.12/site-packages/torchaudio-2.11.0+xpu.dist-info/RECORD", + "bom-ref": "020c3157e7ea9ccb", + "name": "/opt/venv/lib/python3.12/site-packages/torchcodec-0.16.0+cpu.dist-info/RECORD", "type": "file" }, { - "bom-ref": "63cb19b7cf1643a6", - "name": "/opt/venv/lib/python3.12/site-packages/torchaudio-2.11.0+xpu.dist-info/top_level.txt", + "bom-ref": "896dee981e803d8f", + "name": "/opt/venv/lib/python3.12/site-packages/torchvision-0.28.0+xpu.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6a5b0b357f177d9a", - "name": "/opt/venv/lib/python3.12/site-packages/torchcodec-0.15.0+cpu.dist-info/METADATA", + "bom-ref": "d877fe4eae97040c", + "name": "/opt/venv/lib/python3.12/site-packages/torchvision-0.28.0+xpu.dist-info/RECORD", "type": "file" }, { - "bom-ref": "29e42baf65160cd0", - "name": "/opt/venv/lib/python3.12/site-packages/torchcodec-0.15.0+cpu.dist-info/RECORD", + "bom-ref": "ca6a02a9341e6a20", + "name": "/opt/venv/lib/python3.12/site-packages/torchvision-0.28.0+xpu.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e35467652694b5ce", - "name": "/opt/venv/lib/python3.12/site-packages/torchcodec-0.15.0+cpu.dist-info/top_level.txt", + "bom-ref": "8e7f05f0524afb51", + "name": "/opt/venv/lib/python3.12/site-packages/tornado-6.5.8.dist-info/METADATA", "type": "file" }, { - "bom-ref": "44296bf76a235415", - "name": "/opt/venv/lib/python3.12/site-packages/torchvision-0.28.0+xpu.dist-info/METADATA", + "bom-ref": "cbb17d24122c3c12", + "name": "/opt/venv/lib/python3.12/site-packages/tornado-6.5.8.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a47e703d9ee7bcaa", - "name": "/opt/venv/lib/python3.12/site-packages/torchvision-0.28.0+xpu.dist-info/RECORD", + "bom-ref": "e76688001fb09a5e", + "name": "/opt/venv/lib/python3.12/site-packages/tornado-6.5.8.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "08e229f4979d3456", - "name": "/opt/venv/lib/python3.12/site-packages/torchvision-0.28.0+xpu.dist-info/top_level.txt", + "bom-ref": "0345b16ab1f3e0f1", + "name": "/opt/venv/lib/python3.12/site-packages/tqdm-4.70.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "ca6b3ddb50764e71", + "name": "/opt/venv/lib/python3.12/site-packages/tqdm-4.70.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "156ff7745078beda", - "name": "/opt/venv/lib/python3.12/site-packages/tqdm-4.67.3.dist-info/METADATA", + "bom-ref": "0e4d412657780302", + "name": "/opt/venv/lib/python3.12/site-packages/tqdm-4.70.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d61a96641727716a", - "name": "/opt/venv/lib/python3.12/site-packages/tqdm-4.67.3.dist-info/RECORD", + "bom-ref": "206c8b3f00c140c2", + "name": "/opt/venv/lib/python3.12/site-packages/traitlets-5.16.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "dcc1f58c2d0a583a", - "name": "/opt/venv/lib/python3.12/site-packages/tqdm-4.67.3.dist-info/top_level.txt", + "bom-ref": "4b9dd0c11f989774", + "name": "/opt/venv/lib/python3.12/site-packages/traitlets-5.16.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5f283b6f796e270d", - "name": "/opt/venv/lib/python3.12/site-packages/transformers-5.14.1.dist-info/METADATA", + "bom-ref": "77a54e72d8303a36", + "name": "/opt/venv/lib/python3.12/site-packages/transformers-5.15.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ac597add0fd7fc03", - "name": "/opt/venv/lib/python3.12/site-packages/transformers-5.14.1.dist-info/RECORD", + "bom-ref": "48f636eb334f0e9b", + "name": "/opt/venv/lib/python3.12/site-packages/transformers-5.15.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c8ceb0f2dc6a9f74", - "name": "/opt/venv/lib/python3.12/site-packages/transformers-5.14.1.dist-info/top_level.txt", + "bom-ref": "f51e9240ec4615c3", + "name": "/opt/venv/lib/python3.12/site-packages/transformers-5.15.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b64a55eb8096122a", + "bom-ref": "b7ebc38c01d6df0e", + "name": "/opt/venv/lib/python3.12/site-packages/triton-3.7.2+xpu.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "3f1defeb63053d53", + "name": "/opt/venv/lib/python3.12/site-packages/triton-3.7.2+xpu.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "5b2a3024a989499c", + "name": "/opt/venv/lib/python3.12/site-packages/triton-3.7.2+xpu.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "f3e73b90f6ff5e80", "name": "/opt/venv/lib/python3.12/site-packages/triton_xpu-3.7.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "752f0e7ff385cf2f", + "bom-ref": "6b7f0fc91458bc09", "name": "/opt/venv/lib/python3.12/site-packages/triton_xpu-3.7.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "032dd266b8f30240", + "bom-ref": "016d922ce3041046", "name": "/opt/venv/lib/python3.12/site-packages/triton_xpu-3.7.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "396abf219748f4b1", + "bom-ref": "451c647ca3fa6a37", "name": "/opt/venv/lib/python3.12/site-packages/truststore-0.10.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "fdbb286494f74ca9", + "bom-ref": "18a4a3ba9bffef8b", "name": "/opt/venv/lib/python3.12/site-packages/truststore-0.10.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6d1e8e13d527b7d3", - "name": "/opt/venv/lib/python3.12/site-packages/typepy-1.3.4.dist-info/METADATA", + "bom-ref": "400241a44c808a39", + "name": "/opt/venv/lib/python3.12/site-packages/typepy-1.3.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0b0d1441b3e7d51c", - "name": "/opt/venv/lib/python3.12/site-packages/typepy-1.3.4.dist-info/RECORD", + "bom-ref": "80c0b575226e1d85", + "name": "/opt/venv/lib/python3.12/site-packages/typepy-1.3.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e4595459cc7b57fe", - "name": "/opt/venv/lib/python3.12/site-packages/typepy-1.3.4.dist-info/top_level.txt", + "bom-ref": "73611f5e16754cfd", + "name": "/opt/venv/lib/python3.12/site-packages/typepy-1.3.5.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "ddf5b17951f28577", - "name": "/opt/venv/lib/python3.12/site-packages/typer-0.24.1.dist-info/METADATA", + "bom-ref": "a6f34be9002f19fd", + "name": "/opt/venv/lib/python3.12/site-packages/typer-0.27.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bccaa1f135c96edf", - "name": "/opt/venv/lib/python3.12/site-packages/typer-0.24.1.dist-info/RECORD", + "bom-ref": "b46a4ab6cf560620", + "name": "/opt/venv/lib/python3.12/site-packages/typer-0.27.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3e0fcfc0d3687771", - "name": "/opt/venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/METADATA", + "bom-ref": "c2cf076a3ed0c09d", + "name": "/opt/venv/lib/python3.12/site-packages/typing_extensions-4.16.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "dee23bbb8c48a94e", - "name": "/opt/venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/RECORD", + "bom-ref": "4761bd92e8b41fa4", + "name": "/opt/venv/lib/python3.12/site-packages/typing_extensions-4.16.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4b91476ae6e13bb9", - "name": "/opt/venv/lib/python3.12/site-packages/typing_inspection-0.4.2.dist-info/METADATA", + "bom-ref": "2edc2f4fbb84b18a", + "name": "/opt/venv/lib/python3.12/site-packages/typing_inspection-0.4.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e9355fddd3cd90da", - "name": "/opt/venv/lib/python3.12/site-packages/typing_inspection-0.4.2.dist-info/RECORD", + "bom-ref": "8f9cba06aa1c8ad5", + "name": "/opt/venv/lib/python3.12/site-packages/typing_inspection-0.4.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f12e01f0e1360853", + "bom-ref": "91fe375706bc286e", "name": "/opt/venv/lib/python3.12/site-packages/umf-1.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f25aa949b03e2f46", + "bom-ref": "131e37a6cf4521a7", "name": "/opt/venv/lib/python3.12/site-packages/umf-1.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "11d706bf6ece2129", + "bom-ref": "b97d5673e84922a4", "name": "/opt/venv/lib/python3.12/site-packages/umf-1.1.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "54accb039c0c5dc6", - "name": "/opt/venv/lib/python3.12/site-packages/urllib3-2.6.3.dist-info/METADATA", + "bom-ref": "5a102c4d1b326c13", + "name": "/opt/venv/lib/python3.12/site-packages/urllib3-2.7.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "91c132b5e6121fa4", - "name": "/opt/venv/lib/python3.12/site-packages/urllib3-2.6.3.dist-info/RECORD", + "bom-ref": "40da9a92a9214783", + "name": "/opt/venv/lib/python3.12/site-packages/urllib3-2.7.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "bd928a7be22c460f", - "name": "/opt/venv/lib/python3.12/site-packages/uvicorn-0.42.0.dist-info/METADATA", + "bom-ref": "266c91a4b16f425f", + "name": "/opt/venv/lib/python3.12/site-packages/uvicorn-0.52.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ab4e71fe56907dd1", - "name": "/opt/venv/lib/python3.12/site-packages/uvicorn-0.42.0.dist-info/RECORD", + "bom-ref": "22cb081a1518840e", + "name": "/opt/venv/lib/python3.12/site-packages/uvicorn-0.52.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a43b013b3c30ad6a", + "bom-ref": "4d57a7cca65c22c0", "name": "/opt/venv/lib/python3.12/site-packages/uvloop-0.22.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2dadf4d0fc09147b", + "bom-ref": "715534218faa0949", "name": "/opt/venv/lib/python3.12/site-packages/uvloop-0.22.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "49d0de1e05e62f3f", + "bom-ref": "d5266c16cf30d091", "name": "/opt/venv/lib/python3.12/site-packages/uvloop-0.22.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "41fb9268b02dd5f5", - "name": "/opt/venv/lib/python3.12/site-packages/vcs_versioning-2.2.4.dist-info/METADATA", + "bom-ref": "11c7940a635f7ae2", + "name": "/opt/venv/lib/python3.12/site-packages/vcs_versioning-2.3.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6ab136324abd316a", - "name": "/opt/venv/lib/python3.12/site-packages/vcs_versioning-2.2.4.dist-info/RECORD", + "bom-ref": "c938bde369054cca", + "name": "/opt/venv/lib/python3.12/site-packages/vcs_versioning-2.3.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b232946c657a2cba", - "name": "/opt/venv/lib/python3.12/site-packages/vcs_versioning-2.2.4.dist-info/top_level.txt", + "bom-ref": "8ae29af0e1716085", + "name": "/opt/venv/lib/python3.12/site-packages/vcs_versioning-2.3.4.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "8e2f67613ed5fd34", - "name": "/opt/venv/lib/python3.12/site-packages/vllm-0.27.1+xpu.dist-info/METADATA", + "bom-ref": "2ec66e05dd38937a", + "name": "/opt/venv/lib/python3.12/site-packages/vllm-0.29.0+xpu.dist-info/METADATA", "type": "file" }, { - "bom-ref": "891e5816f9f38244", - "name": "/opt/venv/lib/python3.12/site-packages/vllm-0.27.1+xpu.dist-info/RECORD", + "bom-ref": "efb5bfe0507897a0", + "name": "/opt/venv/lib/python3.12/site-packages/vllm-0.29.0+xpu.dist-info/RECORD", "type": "file" }, { - "bom-ref": "728729eaaa080bdb", - "name": "/opt/venv/lib/python3.12/site-packages/vllm-0.27.1+xpu.dist-info/direct_url.json", + "bom-ref": "5b87a22a65c7b8d1", + "name": "/opt/venv/lib/python3.12/site-packages/vllm-0.29.0+xpu.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "283c55d2e3818234", - "name": "/opt/venv/lib/python3.12/site-packages/vllm-0.27.1+xpu.dist-info/top_level.txt", + "bom-ref": "59dd9822a49fb440", + "name": "/opt/venv/lib/python3.12/site-packages/vllm-0.29.0+xpu.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0c68e29a304f1010", + "bom-ref": "f28c5b08dc3609d5", "name": "/opt/venv/lib/python3.12/site-packages/vllm_test_utils-0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "df5d0c7f6693cd76", + "bom-ref": "b378fd846e9dc157", "name": "/opt/venv/lib/python3.12/site-packages/vllm_test_utils-0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2cf2edf13f088b2a", + "bom-ref": "1de3a86bb5ad97f3", "name": "/opt/venv/lib/python3.12/site-packages/vllm_test_utils-0.1.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "ca3d6bf027da4633", + "bom-ref": "780485090f45c232", "name": "/opt/venv/lib/python3.12/site-packages/vllm_test_utils-0.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d1e3315c4e0d5475", - "name": "/opt/venv/lib/python3.12/site-packages/vllm_xpu_kernels-0.1.12.dist-info/METADATA", - "type": "file" - }, - { - "bom-ref": "204242297c633d9d", - "name": "/opt/venv/lib/python3.12/site-packages/vllm_xpu_kernels-0.1.12.dist-info/RECORD", + "bom-ref": "7cfe32319e336cd9", + "name": "/opt/venv/lib/python3.12/site-packages/vllm_xpu_kernels-0.1.14.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "daa4fb7b5f34a493", - "name": "/opt/venv/lib/python3.12/site-packages/vllm_xpu_kernels-0.1.12.dist-info/direct_url.json", + "bom-ref": "56e04f4318448ace", + "name": "/opt/venv/lib/python3.12/site-packages/vllm_xpu_kernels-0.1.14.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c13502db322bbd7d", - "name": "/opt/venv/lib/python3.12/site-packages/vllm_xpu_kernels-0.1.12.dist-info/top_level.txt", + "bom-ref": "cb74fca2c9806a77", + "name": "/opt/venv/lib/python3.12/site-packages/vllm_xpu_kernels-0.1.14.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "3fa504a8e5de0445", + "bom-ref": "33bb89d30ad46c87", "name": "/opt/venv/lib/python3.12/site-packages/watchfiles-1.2.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bc7dfb7d0824f67d", + "bom-ref": "6c9e81942e0e8517", "name": "/opt/venv/lib/python3.12/site-packages/watchfiles-1.2.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "41241047ba2ae68b", - "name": "/opt/venv/lib/python3.12/site-packages/websockets-16.0.dist-info/METADATA", + "bom-ref": "cdbd3c91a50ea9a4", + "name": "/opt/venv/lib/python3.12/site-packages/websockets-17.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "63899a2921e96307", - "name": "/opt/venv/lib/python3.12/site-packages/websockets-16.0.dist-info/RECORD", + "bom-ref": "663b7429a5a44b63", + "name": "/opt/venv/lib/python3.12/site-packages/websockets-17.0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a08e673d2719fea6", - "name": "/opt/venv/lib/python3.12/site-packages/websockets-16.0.dist-info/top_level.txt", + "bom-ref": "398eabafbab8adad", + "name": "/opt/venv/lib/python3.12/site-packages/websockets-17.0.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "08ca47a9f74c5dd5", - "name": "/opt/venv/lib/python3.12/site-packages/werkzeug-3.1.7.dist-info/METADATA", + "bom-ref": "46dc179331f0eb47", + "name": "/opt/venv/lib/python3.12/site-packages/werkzeug-3.1.8.dist-info/METADATA", "type": "file" }, { - "bom-ref": "57d4abd43fdc4bff", - "name": "/opt/venv/lib/python3.12/site-packages/werkzeug-3.1.7.dist-info/RECORD", + "bom-ref": "6531968112d4ad46", + "name": "/opt/venv/lib/python3.12/site-packages/werkzeug-3.1.8.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1bb3d85ee37e9959", - "name": "/opt/venv/lib/python3.12/site-packages/wheel-0.47.0.dist-info/METADATA", + "bom-ref": "9b5d3cf98ba6a226", + "name": "/opt/venv/lib/python3.12/site-packages/wheel-0.48.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bdc08cab3ed92004", - "name": "/opt/venv/lib/python3.12/site-packages/wheel-0.47.0.dist-info/RECORD", + "bom-ref": "cd045010b789a7b7", + "name": "/opt/venv/lib/python3.12/site-packages/wheel-0.48.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a1c600f7760d863d", + "bom-ref": "9739bf2a0f7ac937", "name": "/opt/venv/lib/python3.12/site-packages/word2number-1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d5358b8119519597", + "bom-ref": "ebb431a1d5744e19", "name": "/opt/venv/lib/python3.12/site-packages/word2number-1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e12760f59fcb5720", + "bom-ref": "7286fc10905207be", "name": "/opt/venv/lib/python3.12/site-packages/word2number-1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "f98cf04580970d80", + "bom-ref": "4bfc845e954741ea", "name": "/opt/venv/lib/python3.12/site-packages/xgrammar-0.2.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a2f7b15beb55dc91", + "bom-ref": "bd2e49e08bda8ccf", "name": "/opt/venv/lib/python3.12/site-packages/xgrammar-0.2.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "47a60751b39cf046", - "name": "/opt/venv/lib/python3.12/site-packages/xxhash-3.6.0.dist-info/METADATA", + "bom-ref": "4939efb56932cbcf", + "name": "/opt/venv/lib/python3.12/site-packages/xxhash-4.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "de4fdc21f6d73130", - "name": "/opt/venv/lib/python3.12/site-packages/xxhash-3.6.0.dist-info/RECORD", + "bom-ref": "0321bbfa96f0b724", + "name": "/opt/venv/lib/python3.12/site-packages/xxhash-4.0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "33afde0c190c84a0", - "name": "/opt/venv/lib/python3.12/site-packages/xxhash-3.6.0.dist-info/top_level.txt", + "bom-ref": "9260468bf943800f", + "name": "/opt/venv/lib/python3.12/site-packages/xxhash-4.0.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "2237e0d795117ef1", - "name": "/opt/venv/lib/python3.12/site-packages/yarl-1.23.0.dist-info/METADATA", + "bom-ref": "3bb4598a40295984", + "name": "/opt/venv/lib/python3.12/site-packages/yarl-1.24.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "42c1787c5172b2bc", - "name": "/opt/venv/lib/python3.12/site-packages/yarl-1.23.0.dist-info/RECORD", + "bom-ref": "aa3a238d432915ad", + "name": "/opt/venv/lib/python3.12/site-packages/yarl-1.24.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "358b5e4ccffcf49d", - "name": "/opt/venv/lib/python3.12/site-packages/yarl-1.23.0.dist-info/top_level.txt", + "bom-ref": "68c9ee508d8b5753", + "name": "/opt/venv/lib/python3.12/site-packages/yarl-1.24.5.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "ac23153e2245d4ea", + "bom-ref": "3696f0815c4611c3", "name": "/opt/venv/share/java/mpi.jar", "type": "file" }, { - "bom-ref": "e086c0a80c70bbbb", - "name": "/root/.cache/uv/archive-v0/mN34_W1QwFWyymIg/pip-26.2.1.dist-info/METADATA", + "bom-ref": "85f2c9037ea0360d", + "name": "/root/.cache/uv/archive-v0/j0n5Sr17-joyOAvN/pip-26.2.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "83579a7aff346fdf", - "name": "/root/.cache/uv/archive-v0/mN34_W1QwFWyymIg/pip-26.2.1.dist-info/RECORD", + "bom-ref": "dbffd33dbc1b1528", + "name": "/root/.cache/uv/archive-v0/j0n5Sr17-joyOAvN/pip-26.2.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "16fa46d2c60faa8e", - "name": "/root/.cache/uv/archive-v0/mN34_W1QwFWyymIg/pip/_vendor/distlib/t32.exe", + "bom-ref": "b6bcffe9c3ed4470", + "name": "/root/.cache/uv/archive-v0/j0n5Sr17-joyOAvN/pip/_vendor/distlib/t32.exe", "type": "file" }, { - "bom-ref": "a10321e7404f2d4f", - "name": "/root/.cache/uv/archive-v0/mN34_W1QwFWyymIg/pip/_vendor/distlib/t64-arm.exe", + "bom-ref": "3da36fe8c333fe00", + "name": "/root/.cache/uv/archive-v0/j0n5Sr17-joyOAvN/pip/_vendor/distlib/t64-arm.exe", "type": "file" }, { - "bom-ref": "1834d27073089edf", - "name": "/root/.cache/uv/archive-v0/mN34_W1QwFWyymIg/pip/_vendor/distlib/t64.exe", + "bom-ref": "8a03e55d4dd72b36", + "name": "/root/.cache/uv/archive-v0/j0n5Sr17-joyOAvN/pip/_vendor/distlib/t64.exe", "type": "file" }, { - "bom-ref": "b4f72aa88b3e85da", - "name": "/root/.cache/uv/archive-v0/mN34_W1QwFWyymIg/pip/_vendor/distlib/w32.exe", + "bom-ref": "058cb9890ddf2061", + "name": "/root/.cache/uv/archive-v0/j0n5Sr17-joyOAvN/pip/_vendor/distlib/w32.exe", "type": "file" }, { - "bom-ref": "34296598366550b1", - "name": "/root/.cache/uv/archive-v0/mN34_W1QwFWyymIg/pip/_vendor/distlib/w64-arm.exe", + "bom-ref": "0892acbb4bddd31e", + "name": "/root/.cache/uv/archive-v0/j0n5Sr17-joyOAvN/pip/_vendor/distlib/w64-arm.exe", "type": "file" }, { - "bom-ref": "9d1ed5aa4b338323", - "name": "/root/.cache/uv/archive-v0/mN34_W1QwFWyymIg/pip/_vendor/distlib/w64.exe", + "bom-ref": "9472a0fa8674ef29", + "name": "/root/.cache/uv/archive-v0/j0n5Sr17-joyOAvN/pip/_vendor/distlib/w64.exe", "type": "file" }, { - "bom-ref": "df720f686f6eff47", + "bom-ref": "507ec8ea404163ad", "name": "/root/.local/bin/uv", "type": "file" }, { - "bom-ref": "54de574ba0504308", + "bom-ref": "32710d79b11f3a7e", "name": "/root/.local/bin/uvx", "type": "file" }, { - "bom-ref": "de497359785b9716", + "bom-ref": "156ecad30962309c", "name": "/usr/bin/[", "type": "file" }, { - "bom-ref": "6a3648ae475d8fbe", + "bom-ref": "3282cdf00780f910", + "name": "/usr/bin/add-apt-repository", + "type": "file" + }, + { + "bom-ref": "b51649cf2e8f0f56", "name": "/usr/bin/addpart", "type": "file" }, { - "bom-ref": "429d5c0fa1ac31d3", + "bom-ref": "85c17f82d2810e35", "name": "/usr/bin/apt", "type": "file" }, { - "bom-ref": "de367fa634db8fb0", + "bom-ref": "08b640e539dfa03a", "name": "/usr/bin/apt-cache", "type": "file" }, { - "bom-ref": "49f685aa16889b7c", + "bom-ref": "d0c0cc3845d9e2d2", "name": "/usr/bin/apt-cdrom", "type": "file" }, { - "bom-ref": "8d3b157dfb15dd6c", + "bom-ref": "01851bb819ac0dfe", "name": "/usr/bin/apt-config", "type": "file" }, { - "bom-ref": "8afdeb73b6d5a662", + "bom-ref": "6bf0eb272657fe98", "name": "/usr/bin/apt-get", "type": "file" }, { - "bom-ref": "43f6a3b3598b4ee7", + "bom-ref": "667e1f36ed015f51", "name": "/usr/bin/apt-key", "type": "file" }, { - "bom-ref": "b49feed19df39af0", + "bom-ref": "500b48df207b8e4e", "name": "/usr/bin/apt-mark", "type": "file" }, { - "bom-ref": "8d0cd09cec628f89", + "bom-ref": "8911e335f5afcfbf", "name": "/usr/bin/arch", "type": "file" }, { - "bom-ref": "b9ab4811c7cb672e", + "bom-ref": "7ad3f96f88b68758", "name": "/usr/bin/b2sum", "type": "file" }, { - "bom-ref": "9caca56dfd385bf2", + "bom-ref": "6f845cb2b64cffa0", "name": "/usr/bin/base32", "type": "file" }, { - "bom-ref": "ee54c9598203abc1", + "bom-ref": "4699f9e8dc0cdbc3", "name": "/usr/bin/base64", "type": "file" }, { - "bom-ref": "41d7ac94dad78039", + "bom-ref": "108831f079946fe3", "name": "/usr/bin/basename", "type": "file" }, { - "bom-ref": "713f80efb9bbbfb5", + "bom-ref": "1469cfd9a30d97eb", "name": "/usr/bin/basenc", "type": "file" }, { - "bom-ref": "b97ece336ea4981d", + "bom-ref": "6fed42ee7a9305cf", "name": "/usr/bin/bash", "type": "file" }, { - "bom-ref": "66664cfca5355f41", + "bom-ref": "d9bb81f9a5422baf", "name": "/usr/bin/bashbug", "type": "file" }, { - "bom-ref": "1bcf64c8f0229395", - "name": "/usr/bin/bunzip2", - "type": "file" - }, - { - "bom-ref": "cd21a05b5e0c7026", - "name": "/usr/bin/bunzip2", - "type": "file" - }, - { - "bom-ref": "e31d5887ac54bd01", + "bom-ref": "2bdb895e12118aba", "name": "/usr/bin/bunzip2", "type": "file" }, { - "bom-ref": "afc3bc903cc6d354", + "bom-ref": "bce4defe159f82c6", "name": "/usr/bin/busctl", "type": "file" }, { - "bom-ref": "719f21ac04ecd2dc", + "bom-ref": "d37eb4cd1882f48c", "name": "/usr/bin/bzdiff", "type": "file" }, { - "bom-ref": "ef55556f3c62f9f8", + "bom-ref": "476c37b58c3b3164", "name": "/usr/bin/bzexe", "type": "file" }, { - "bom-ref": "564c42d31a825c53", + "bom-ref": "8a2ecb497d970683", "name": "/usr/bin/bzgrep", "type": "file" }, { - "bom-ref": "3f195d3569b35426", + "bom-ref": "d49c816d425fb43a", "name": "/usr/bin/bzip2recover", "type": "file" }, { - "bom-ref": "d2ea78701ef15747", + "bom-ref": "a0c5ae6b95e1f9eb", "name": "/usr/bin/bzmore", "type": "file" }, { - "bom-ref": "ab5cde3f217e60a1", + "bom-ref": "4a7bc816643dc59d", "name": "/usr/bin/c89-gcc", "type": "file" }, { - "bom-ref": "001a7ab186b23f60", + "bom-ref": "ebc5e7958b861638", "name": "/usr/bin/c99-gcc", "type": "file" }, { - "bom-ref": "79e8a9fc22b40c12", + "bom-ref": "365fdafeb77d33ce", "name": "/usr/bin/c_rehash", "type": "file" }, { - "bom-ref": "adcdd236c3085c36", + "bom-ref": "42f3db521d48f280", "name": "/usr/bin/cat", "type": "file" }, { - "bom-ref": "da65e23852910c53", + "bom-ref": "7152b2b5081a0d01", "name": "/usr/bin/chage", "type": "file" }, { - "bom-ref": "fb7487d4aecddb7d", + "bom-ref": "8a8204a8fb49a4bf", "name": "/usr/bin/chattr", "type": "file" }, { - "bom-ref": "a06e973e04739fe7", + "bom-ref": "9737232b303b0915", "name": "/usr/bin/chcon", "type": "file" }, { - "bom-ref": "bf06f64e29b5d6fc", + "bom-ref": "c21ffa4ae0deaf3e", "name": "/usr/bin/chfn", "type": "file" }, { - "bom-ref": "476de457a9f252a2", + "bom-ref": "60b8cf1ab4fadff4", "name": "/usr/bin/chgrp", "type": "file" }, { - "bom-ref": "98bf6c8a0983e890", + "bom-ref": "f8e8e73d7e7f5aa6", "name": "/usr/bin/chmod", "type": "file" }, { - "bom-ref": "ab359253d7f7158a", + "bom-ref": "560501ca5afb7c92", "name": "/usr/bin/choom", "type": "file" }, { - "bom-ref": "e715434ee810d7fe", + "bom-ref": "f7adc27b90668994", "name": "/usr/bin/chown", "type": "file" }, { - "bom-ref": "7ccff996550ef4ac", + "bom-ref": "d8b6f3655cfd02b4", "name": "/usr/bin/chrt", "type": "file" }, { - "bom-ref": "6a562cb3a80746ff", + "bom-ref": "c489957b4458d6dd", "name": "/usr/bin/chsh", "type": "file" }, { - "bom-ref": "b248fb22fd782b4d", + "bom-ref": "25a2406aff5661df", "name": "/usr/bin/cksum", "type": "file" }, { - "bom-ref": "fc8c0aa4db21e6c3", + "bom-ref": "dbc613f277c8ff65", "name": "/usr/bin/clear", "type": "file" }, { - "bom-ref": "9ee9a162548a8829", + "bom-ref": "0164f20496d6e47f", "name": "/usr/bin/clear_console", "type": "file" }, { - "bom-ref": "057eecbd02816f39", + "bom-ref": "bb0a8cd2c1a24c37", "name": "/usr/bin/cmp", "type": "file" }, { - "bom-ref": "906b24866d1a97e0", + "bom-ref": "497c2ad66fb09256", "name": "/usr/bin/comm", "type": "file" }, { - "bom-ref": "a615880b803ae171", + "bom-ref": "4b5f2621a0cb6225", "name": "/usr/bin/corelist", "type": "file" }, { - "bom-ref": "90541773f6708164", + "bom-ref": "c28ba2acfdea1fb6", "name": "/usr/bin/cp", "type": "file" }, { - "bom-ref": "a82e990fc8d18b56", + "bom-ref": "6daa20b78d6e56d6", "name": "/usr/bin/cpan", "type": "file" }, { - "bom-ref": "72e73eedd8af78c9", + "bom-ref": "ec721d3e070329a9", "name": "/usr/bin/cpan5.38-x86_64-linux-gnu", "type": "file" }, { - "bom-ref": "6f919d0638704ac1", + "bom-ref": "7e5c17be1a6d9ca3", "name": "/usr/bin/csplit", "type": "file" }, { - "bom-ref": "b22439895ed83038", + "bom-ref": "321c3d05f6f77d18", "name": "/usr/bin/curl", "type": "file" }, { - "bom-ref": "f9639da9e5d06f53", + "bom-ref": "f859b3c69847c6cd", "name": "/usr/bin/cut", "type": "file" }, { - "bom-ref": "e3d83b01c7a57220", + "bom-ref": "7bdf6e9758891a9e", "name": "/usr/bin/dash", "type": "file" }, { - "bom-ref": "55a49ae1c3ef0ab4", + "bom-ref": "8a38a811cd4372c6", "name": "/usr/bin/date", "type": "file" }, { - "bom-ref": "e76ab05e17646195", + "bom-ref": "af09dfbdf852e5ce", + "name": "/usr/bin/dbus-cleanup-sockets", + "type": "file" + }, + { + "bom-ref": "4170a540e5ef79ca", + "name": "/usr/bin/dbus-daemon", + "type": "file" + }, + { + "bom-ref": "dbc13316b12aebd0", + "name": "/usr/bin/dbus-monitor", + "type": "file" + }, + { + "bom-ref": "01a7b40f21009819", + "name": "/usr/bin/dbus-run-session", + "type": "file" + }, + { + "bom-ref": "4fffe3d7f87bd5ec", + "name": "/usr/bin/dbus-send", + "type": "file" + }, + { + "bom-ref": "20d9d04964f483e4", + "name": "/usr/bin/dbus-update-activation-environment", + "type": "file" + }, + { + "bom-ref": "c4f68d889838a607", + "name": "/usr/bin/dbus-uuidgen", + "type": "file" + }, + { + "bom-ref": "6a675c90ead5c9eb", "name": "/usr/bin/dd", "type": "file" }, { - "bom-ref": "8af39cdf828c34e4", + "bom-ref": "55a5b411aaea905e", "name": "/usr/bin/deb-systemd-helper", "type": "file" }, { - "bom-ref": "c9dbee47a747e62a", + "bom-ref": "5e825a5c2c891754", "name": "/usr/bin/deb-systemd-invoke", "type": "file" }, { - "bom-ref": "dcd493f2552a065c", + "bom-ref": "dbc70a19456d665a", "name": "/usr/bin/debconf", "type": "file" }, { - "bom-ref": "b156cbacbe40736b", + "bom-ref": "b4452907e05c9fb5", "name": "/usr/bin/debconf-apt-progress", "type": "file" }, { - "bom-ref": "12c6fbc1751bf753", + "bom-ref": "7604cae4f9a85521", "name": "/usr/bin/debconf-communicate", "type": "file" }, { - "bom-ref": "06c842fa6c901986", + "bom-ref": "6b1d111b46fb8684", "name": "/usr/bin/debconf-copydb", "type": "file" }, { - "bom-ref": "bb62ceb798bd7039", + "bom-ref": "4d92e216b6eb6707", "name": "/usr/bin/debconf-escape", "type": "file" }, { - "bom-ref": "935b4c422a0521e7", + "bom-ref": "8862f1b24693145d", "name": "/usr/bin/debconf-set-selections", "type": "file" }, { - "bom-ref": "3629c6aab1e148a2", + "bom-ref": "fcdb29e2e4390d5c", "name": "/usr/bin/debconf-show", "type": "file" }, { - "bom-ref": "3cb6ddd2bf97a03b", + "bom-ref": "44ad02b1764f9c3f", "name": "/usr/bin/delpart", "type": "file" }, { - "bom-ref": "3327fd4f8274c7fb", + "bom-ref": "e5b8b2a8cc572a25", "name": "/usr/bin/df", "type": "file" }, { - "bom-ref": "881505a7b2f71eeb", + "bom-ref": "a6e3ae3e28fcc1d9", + "name": "/usr/bin/dh_installxmlcatalogs", + "type": "file" + }, + { + "bom-ref": "f38b97092cce5655", "name": "/usr/bin/diff", "type": "file" }, { - "bom-ref": "5fa437774047a436", + "bom-ref": "e04891b685af9f70", "name": "/usr/bin/diff3", "type": "file" }, { - "bom-ref": "8c676d58121a83f5", + "bom-ref": "85a730e934ba908f", "name": "/usr/bin/dir", "type": "file" }, { - "bom-ref": "d7bac8fd892f2b6e", + "bom-ref": "b72cd31dcd277dbc", "name": "/usr/bin/dircolors", "type": "file" }, { - "bom-ref": "0e58eb9fbf36b00f", + "bom-ref": "f0419c0e4cf9344d", "name": "/usr/bin/dirname", "type": "file" }, { - "bom-ref": "e38d8db3b7cc322a", + "bom-ref": "bb947b3958371caa", "name": "/usr/bin/dmesg", "type": "file" }, { - "bom-ref": "dcb1990d5fe4f5d5", + "bom-ref": "e96d39c896d42c6b", "name": "/usr/bin/dpkg", "type": "file" }, { - "bom-ref": "7d682e95bf457708", + "bom-ref": "922d684aba61db8c", "name": "/usr/bin/dpkg-architecture", "type": "file" }, { - "bom-ref": "654144d3a1a6a173", + "bom-ref": "0ed34d88d3d3913f", "name": "/usr/bin/dpkg-buildapi", "type": "file" }, { - "bom-ref": "492caaea83d3d03c", + "bom-ref": "215c7d156c19da4c", "name": "/usr/bin/dpkg-buildflags", "type": "file" }, { - "bom-ref": "892355e6166b20d9", + "bom-ref": "dc78e42e3b6b3da1", "name": "/usr/bin/dpkg-buildpackage", "type": "file" }, { - "bom-ref": "896cdcbbf271ab47", + "bom-ref": "6be1e71b64e7dff3", "name": "/usr/bin/dpkg-buildtree", "type": "file" }, { - "bom-ref": "d02dc533a7d2c2bd", + "bom-ref": "cce169c375f782a1", "name": "/usr/bin/dpkg-checkbuilddeps", "type": "file" }, { - "bom-ref": "4ca29a096d665538", + "bom-ref": "2cb4c56bf5d87e36", "name": "/usr/bin/dpkg-deb", "type": "file" }, { - "bom-ref": "bb0d0de86603c2b2", + "bom-ref": "83f3d6da9eebbd7e", "name": "/usr/bin/dpkg-distaddfile", "type": "file" }, { - "bom-ref": "c2a3e3abcaf0356f", + "bom-ref": "0784703118725441", "name": "/usr/bin/dpkg-divert", "type": "file" }, { - "bom-ref": "13b607f879f44f48", + "bom-ref": "c23494cf41550018", "name": "/usr/bin/dpkg-genbuildinfo", "type": "file" }, { - "bom-ref": "22125aafcdb8f724", + "bom-ref": "17aadabea89119c0", "name": "/usr/bin/dpkg-genchanges", "type": "file" }, { - "bom-ref": "ceda86969378a88b", + "bom-ref": "406eb2f78a992c77", "name": "/usr/bin/dpkg-gencontrol", "type": "file" }, { - "bom-ref": "8a0b114f363ad63e", + "bom-ref": "d9b1d694cd917ada", "name": "/usr/bin/dpkg-gensymbols", "type": "file" }, { - "bom-ref": "ef7f39b29b8df7ea", + "bom-ref": "682a35956532c024", "name": "/usr/bin/dpkg-maintscript-helper", "type": "file" }, { - "bom-ref": "590f6920cf5d987d", + "bom-ref": "ea5c084ab07c61e9", "name": "/usr/bin/dpkg-mergechangelogs", "type": "file" }, { - "bom-ref": "f6a28d91201e3560", + "bom-ref": "fad6316ad843d83c", "name": "/usr/bin/dpkg-name", "type": "file" }, { - "bom-ref": "28a7d194b0c4cc8a", + "bom-ref": "764aa3575462ef06", "name": "/usr/bin/dpkg-parsechangelog", "type": "file" }, { - "bom-ref": "e9768385c8d96024", + "bom-ref": "ab527ff5f8919eee", "name": "/usr/bin/dpkg-query", "type": "file" }, { - "bom-ref": "1c1e9fff2ff15a77", + "bom-ref": "698890a1ec6605c9", "name": "/usr/bin/dpkg-realpath", "type": "file" }, { - "bom-ref": "b22d49f9780b2536", + "bom-ref": "02e20256d2f8c0be", "name": "/usr/bin/dpkg-scanpackages", "type": "file" }, { - "bom-ref": "b698b1de91233828", + "bom-ref": "4003853a1b5a3da0", "name": "/usr/bin/dpkg-scansources", "type": "file" }, { - "bom-ref": "9d528acb82d74aa6", + "bom-ref": "094a7f994df52212", "name": "/usr/bin/dpkg-shlibdeps", "type": "file" }, { - "bom-ref": "c07976c2cef1a7a1", + "bom-ref": "6d6e7b609bdbe4c1", "name": "/usr/bin/dpkg-source", "type": "file" }, { - "bom-ref": "be542d4641a5d4cb", + "bom-ref": "d489ff262b863941", "name": "/usr/bin/dpkg-split", "type": "file" }, { - "bom-ref": "e6dafa55ba4bcb91", + "bom-ref": "e6f76b044b1500b3", "name": "/usr/bin/dpkg-statoverride", "type": "file" }, { - "bom-ref": "7b4ce4857b2b4153", + "bom-ref": "e66a302445cf35b1", "name": "/usr/bin/dpkg-trigger", "type": "file" }, { - "bom-ref": "3faea0ac4c6de4fa", + "bom-ref": "ad4aab9c5ec849c2", "name": "/usr/bin/dpkg-vendor", "type": "file" }, { - "bom-ref": "5d89503fbc332eaf", + "bom-ref": "00e5c64511cacc19", "name": "/usr/bin/du", "type": "file" }, { - "bom-ref": "e32a52bcba2eff55", + "bom-ref": "8f3716f12f9a3b6f", "name": "/usr/bin/echo", "type": "file" }, { - "bom-ref": "435a5a6faaac537d", + "bom-ref": "fa8ca21f7c1452c7", "name": "/usr/bin/egrep", "type": "file" }, { - "bom-ref": "89d3ecbc6b99b591", + "bom-ref": "b3f40f95b9fcf471", "name": "/usr/bin/enc2xs", "type": "file" }, { - "bom-ref": "040355f0bee7367c", + "bom-ref": "222006f2cfd163bc", "name": "/usr/bin/encguess", "type": "file" }, { - "bom-ref": "c10f878db04fee9c", + "bom-ref": "6ccac63bfcd151fa", "name": "/usr/bin/env", "type": "file" }, { - "bom-ref": "2c0296e8e22ab097", + "bom-ref": "50b159d284c129e9", "name": "/usr/bin/expand", "type": "file" }, { - "bom-ref": "7073fe6c48315771", + "bom-ref": "9d97e6c2b167fc67", "name": "/usr/bin/expiry", "type": "file" }, { - "bom-ref": "a0e4e2726745742b", + "bom-ref": "b2279ede264e7149", "name": "/usr/bin/expr", "type": "file" }, { - "bom-ref": "4d9dba9e67457fe0", + "bom-ref": "20a74f634154e272", "name": "/usr/bin/factor", "type": "file" }, { - "bom-ref": "e1274df8d019aa00", + "bom-ref": "a3cc0251523d23a6", "name": "/usr/bin/faillog", "type": "file" }, { - "bom-ref": "d309ad32a6d1ed80", + "bom-ref": "93719fcffa0ba004", "name": "/usr/bin/fallocate", "type": "file" }, { - "bom-ref": "a34bff09fe376ad6", + "bom-ref": "7e5cda4e5afe19d0", "name": "/usr/bin/false", "type": "file" }, { - "bom-ref": "6d7226ed89b7d49c", + "bom-ref": "85b1e29fdd7dd86c", "name": "/usr/bin/fc-cache", "type": "file" }, { - "bom-ref": "99b8390cd337b104", + "bom-ref": "1d04cd456eaf706c", "name": "/usr/bin/fc-cat", "type": "file" }, { - "bom-ref": "62dc8e9d2890b268", + "bom-ref": "aa8cc61935931194", "name": "/usr/bin/fc-conflist", "type": "file" }, { - "bom-ref": "e4a3f342cddcee5c", + "bom-ref": "28177b73e777f724", "name": "/usr/bin/fc-list", "type": "file" }, { - "bom-ref": "a0e8f0fb0e33eb4e", + "bom-ref": "5e63681299211576", "name": "/usr/bin/fc-match", "type": "file" }, { - "bom-ref": "793325e5d4e688cc", + "bom-ref": "494e08bae93450ac", "name": "/usr/bin/fc-pattern", "type": "file" }, { - "bom-ref": "3d3d57fc2cf1c872", + "bom-ref": "28e387f588cd7bb2", "name": "/usr/bin/fc-query", "type": "file" }, { - "bom-ref": "a403f227e1318fb3", + "bom-ref": "de1d8b60a9544647", "name": "/usr/bin/fc-scan", "type": "file" }, { - "bom-ref": "5de10be527693169", + "bom-ref": "8f79bef3ceedd84d", "name": "/usr/bin/fc-validate", "type": "file" }, { - "bom-ref": "881c72e7fb78f9de", + "bom-ref": "a1726b7a6ad4dfbe", "name": "/usr/bin/ffmpeg", "type": "file" }, { - "bom-ref": "68c94b364729040d", + "bom-ref": "1ab4fb3e4d612069", "name": "/usr/bin/ffplay", "type": "file" }, { - "bom-ref": "88f8c119e0ba4b6f", + "bom-ref": "32c27b40a7dee4d7", "name": "/usr/bin/ffprobe", "type": "file" }, { - "bom-ref": "ce6f3d2984fa05fe", + "bom-ref": "d20d42fe8351bdb0", "name": "/usr/bin/fgrep", "type": "file" }, { - "bom-ref": "092fefd7e67cf1fa", + "bom-ref": "a1aa31bee3d23ec8", "name": "/usr/bin/find", "type": "file" }, { - "bom-ref": "24e3a20fb7c59505", + "bom-ref": "1f0098a048226ba1", "name": "/usr/bin/findmnt", "type": "file" }, { - "bom-ref": "9a6f800e530c343e", + "bom-ref": "17e1b8ad6d928916", "name": "/usr/bin/flock", "type": "file" }, { - "bom-ref": "3df1b2062588d331", + "bom-ref": "8978b4f789ce9953", "name": "/usr/bin/fmt", "type": "file" }, { - "bom-ref": "2ad32b6dd713ad62", + "bom-ref": "a1edc91e94b060e0", "name": "/usr/bin/fold", "type": "file" }, { - "bom-ref": "bb5d59d0686541af", + "bom-ref": "78283158972cbfe1", "name": "/usr/bin/free", "type": "file" }, { - "bom-ref": "a9a2859b81234b2f", + "bom-ref": "f65b276145c6c77c", + "name": "/usr/bin/gapplication", + "type": "file" + }, + { + "bom-ref": "4223e672fdf6889a", + "name": "/usr/bin/gdbus", + "type": "file" + }, + { + "bom-ref": "7c1b1142d92a74eb", "name": "/usr/bin/gencat", "type": "file" }, { - "bom-ref": "ef0812e0b09b1c64", + "bom-ref": "373792ee24a38dde", "name": "/usr/bin/getconf", "type": "file" }, { - "bom-ref": "5f954ae5e3438753", + "bom-ref": "99f493d2f4eea7a1", "name": "/usr/bin/getent", "type": "file" }, { - "bom-ref": "5e3a3b37a52d82f6", + "bom-ref": "b0fe32d756e015a2", "name": "/usr/bin/getopt", "type": "file" }, { - "bom-ref": "5d77fb1ce3c1b6ca", + "bom-ref": "d1650655105253fa", + "name": "/usr/bin/gio", + "type": "file" + }, + { + "bom-ref": "7b2542a5bf1a0a9e", "name": "/usr/bin/git", "type": "file" }, { - "bom-ref": "a00cb87f7c09aa00", + "bom-ref": "cf142d47cf473ff0", "name": "/usr/bin/git-shell", "type": "file" }, { - "bom-ref": "df2797d17aaaaaa1", + "bom-ref": "d32cb428d8356def", "name": "/usr/bin/gpasswd", "type": "file" }, { - "bom-ref": "626c9ed446c07219", + "bom-ref": "3e1fb512a011bdfd", "name": "/usr/bin/gpg", "type": "file" }, { - "bom-ref": "c2af94df909233ee", + "bom-ref": "79d4b2b5dd2a8a4a", "name": "/usr/bin/gpg-connect-agent", "type": "file" }, { - "bom-ref": "f668dbe140f761fd", + "bom-ref": "62a2e1f0692cec79", "name": "/usr/bin/gpgconf", "type": "file" }, { - "bom-ref": "2ba24a8bff759e36", + "bom-ref": "58d666f864b599c8", "name": "/usr/bin/gpgv", "type": "file" }, { - "bom-ref": "aeed71817a7c7ebf", + "bom-ref": "6e2e0af60c0f3e01", "name": "/usr/bin/grep", "type": "file" }, { - "bom-ref": "5b17368674f921f1", + "bom-ref": "6b1ff53e01a4eb40", + "name": "/usr/bin/gresource", + "type": "file" + }, + { + "bom-ref": "abc0da3d0fa8fdbf", "name": "/usr/bin/groups", "type": "file" }, { - "bom-ref": "287b12b8861d742b", - "name": "/usr/bin/gunzip", + "bom-ref": "e2bd38b516e1f595", + "name": "/usr/bin/gsettings", "type": "file" }, { - "bom-ref": "3405feac46942158", + "bom-ref": "af23dcf632137372", "name": "/usr/bin/gunzip", "type": "file" }, { - "bom-ref": "79453caeb485fbfa", + "bom-ref": "f2c2ff807a42ab3c", "name": "/usr/bin/gzexe", "type": "file" }, { - "bom-ref": "2a26fc7ae8685c7b", + "bom-ref": "bf569ccf1850cf91", "name": "/usr/bin/gzip", "type": "file" }, { - "bom-ref": "ca033d8eb1610ca8", + "bom-ref": "cca23f21ab8eee0c", "name": "/usr/bin/h2ph", "type": "file" }, { - "bom-ref": "0cca0369ef49c8d0", + "bom-ref": "f293dee629fe1a0c", "name": "/usr/bin/h2xs", "type": "file" }, { - "bom-ref": "3086bf06a3fb11d4", + "bom-ref": "0f870004f6618730", "name": "/usr/bin/hardlink", "type": "file" }, { - "bom-ref": "b0adee3be6af8fbd", + "bom-ref": "fa2f88ece09c6667", "name": "/usr/bin/head", "type": "file" }, { - "bom-ref": "75ec41ea16531f29", + "bom-ref": "e08363e737674dd1", "name": "/usr/bin/helpztags", "type": "file" }, { - "bom-ref": "88cc1a82472387df", + "bom-ref": "7ea7e3472e4da565", "name": "/usr/bin/hostid", "type": "file" }, { - "bom-ref": "fade94d168edc022", + "bom-ref": "74de2e85a0ea44a8", "name": "/usr/bin/hostname", "type": "file" }, { - "bom-ref": "18e7d91c6e168709", + "bom-ref": "47704483a41945b7", "name": "/usr/bin/hostnamectl", "type": "file" }, { - "bom-ref": "bf7409ded0aedea8", + "bom-ref": "8ab2775b38995e9e", "name": "/usr/bin/iconv", "type": "file" }, { - "bom-ref": "62d889fa82ac6dff", + "bom-ref": "8fb061c4340ef7f9", "name": "/usr/bin/id", "type": "file" }, { - "bom-ref": "8423ebc49cd1e4a9", + "bom-ref": "c85616b0656bdc4f", "name": "/usr/bin/infocmp", "type": "file" }, { - "bom-ref": "05d724d65c4d701a", + "bom-ref": "6bce2b8b03c63214", "name": "/usr/bin/install", "type": "file" }, { - "bom-ref": "fc5576ca1607fafe", + "bom-ref": "28547e1979ea2bea", "name": "/usr/bin/instmodsh", "type": "file" }, { - "bom-ref": "9aa246d11065e9e3", + "bom-ref": "6be18ef181a854e7", "name": "/usr/bin/ionice", "type": "file" }, { - "bom-ref": "804e03988b76a3d9", + "bom-ref": "d81d8e468395cd35", "name": "/usr/bin/ipcmk", "type": "file" }, { - "bom-ref": "b33ffcd0f9131020", + "bom-ref": "75eb05be844fea70", "name": "/usr/bin/ipcrm", "type": "file" }, { - "bom-ref": "01940a7c260b1487", + "bom-ref": "a3440f51e3034507", "name": "/usr/bin/ipcs", "type": "file" }, { - "bom-ref": "0b863978afeb9fd0", + "bom-ref": "38c006901c958fb6", "name": "/usr/bin/ischroot", "type": "file" }, { - "bom-ref": "d883bd740ff131c9", + "bom-ref": "3e43763703c5d65b", "name": "/usr/bin/join", "type": "file" }, { - "bom-ref": "acbb816e534f5023", + "bom-ref": "4e58f3d57fa21ba1", "name": "/usr/bin/journalctl", "type": "file" }, { - "bom-ref": "857cebf153aa57cf", + "bom-ref": "a25376ab04fc1d67", "name": "/usr/bin/json_pp", "type": "file" }, { - "bom-ref": "f3502b3307cf5990", + "bom-ref": "8292b1bd442f48d6", "name": "/usr/bin/kernel-install", "type": "file" }, { - "bom-ref": "54b3056c98829347", + "bom-ref": "8f278acfb110c261", "name": "/usr/bin/kill", "type": "file" }, { - "bom-ref": "e2e4dc48c8062864", + "bom-ref": "d7324808e24851ec", "name": "/usr/bin/last", "type": "file" }, { - "bom-ref": "b96f69bb46dfa36e", + "bom-ref": "8beb7838324c85c8", "name": "/usr/bin/lastlog", "type": "file" }, { - "bom-ref": "be42276cc5e5a87c", + "bom-ref": "e5563a0b4382db1a", "name": "/usr/bin/ldd", "type": "file" }, { - "bom-ref": "4b485dc861680e36", + "bom-ref": "3c5d4b4229f59f2a", "name": "/usr/bin/libnetcfg", "type": "file" }, { - "bom-ref": "26aedee6fdcd6be1", + "bom-ref": "22a7c89194d4a67b", "name": "/usr/bin/link", "type": "file" }, { - "bom-ref": "0fa1d2eaa2dc9edd", + "bom-ref": "0a7bdfac00f1c74f", "name": "/usr/bin/ln", "type": "file" }, { - "bom-ref": "eea22d70f2ff9459", + "bom-ref": "0f7eb654e0993ac7", "name": "/usr/bin/locale", "type": "file" }, { - "bom-ref": "17306368603daca0", + "bom-ref": "2463d604118ee246", "name": "/usr/bin/locale-check", "type": "file" }, { - "bom-ref": "566180fabecdb9c3", + "bom-ref": "8a735234dcce89d1", "name": "/usr/bin/localectl", "type": "file" }, { - "bom-ref": "51c8d44ee0e8be53", + "bom-ref": "ee22af4a9c406b81", "name": "/usr/bin/localedef", "type": "file" }, { - "bom-ref": "40118dc6c6c0d5c7", + "bom-ref": "820a41fdfdc05693", "name": "/usr/bin/logger", "type": "file" }, { - "bom-ref": "d56337f70e117c70", + "bom-ref": "8a46ee45ccdab3ae", "name": "/usr/bin/login", "type": "file" }, { - "bom-ref": "568b0b95f6c5b7f3", + "bom-ref": "3c2e30298fcdb1c5", "name": "/usr/bin/loginctl", "type": "file" }, { - "bom-ref": "e2e1cb526476b57a", + "bom-ref": "3372af2ed28177f4", "name": "/usr/bin/logname", "type": "file" }, { - "bom-ref": "baa3d8e0dad503d7", + "bom-ref": "828bccba2378ff05", "name": "/usr/bin/ls", "type": "file" }, { - "bom-ref": "9a416a1a5ec5f428", + "bom-ref": "b1ced84e296f48aa", "name": "/usr/bin/lsattr", "type": "file" }, { - "bom-ref": "e34b11e5bd5a9e11", + "bom-ref": "c1cb9e84b2abb2ed", "name": "/usr/bin/lsb_release", "type": "file" }, { - "bom-ref": "d59026934f7dd810", + "bom-ref": "71f4b1ac93b11938", "name": "/usr/bin/lsblk", "type": "file" }, { - "bom-ref": "40c7a42246897b1a", + "bom-ref": "4903280a3c4c455a", "name": "/usr/bin/lscpu", "type": "file" }, { - "bom-ref": "12afea96aa0ab3b1", + "bom-ref": "e0b2edf8f73d340d", "name": "/usr/bin/lsipc", "type": "file" }, { - "bom-ref": "b92084cc1fa7b59f", + "bom-ref": "ac83c8a70329dfdf", "name": "/usr/bin/lslocks", "type": "file" }, { - "bom-ref": "78567e73c4a344a1", + "bom-ref": "9675935af90f5709", "name": "/usr/bin/lslogins", "type": "file" }, { - "bom-ref": "9f4765ab8379aa17", + "bom-ref": "66ad27ffe700b12f", "name": "/usr/bin/lsmem", "type": "file" }, { - "bom-ref": "08a8f8d6db8ce253", + "bom-ref": "bc3788f458a55457", "name": "/usr/bin/lsns", "type": "file" }, { - "bom-ref": "38c721cab08f0cbc", + "bom-ref": "4d98240dadd19bb0", "name": "/usr/bin/lzmainfo", "type": "file" }, { - "bom-ref": "1c6da0c8d34fceb8", + "bom-ref": "27d51d83de463a34", "name": "/usr/bin/make", "type": "file" }, { - "bom-ref": "80b20452c4f350ed", + "bom-ref": "fbfacebab789ac29", "name": "/usr/bin/make-first-existing-target", "type": "file" }, { - "bom-ref": "433e755aa45e4c37", + "bom-ref": "0026a6fd01421fa9", "name": "/usr/bin/mawk", "type": "file" }, { - "bom-ref": "ecc626c0b0b63fc4", + "bom-ref": "c798ceca25f3a0d0", "name": "/usr/bin/mcookie", "type": "file" }, { - "bom-ref": "cd4477d6bce19b2e", + "bom-ref": "4e7d2c5bc559dd80", "name": "/usr/bin/md5sum", "type": "file" }, { - "bom-ref": "8c21039dc1f58616", + "bom-ref": "ec54d2290faade4a", "name": "/usr/bin/memhog", "type": "file" }, { - "bom-ref": "a7b9f243f96f0af9", + "bom-ref": "edd2fe1dd5fc4849", "name": "/usr/bin/mesg", "type": "file" }, { - "bom-ref": "c2a192ea05a24891", + "bom-ref": "d7418674b4e044a9", "name": "/usr/bin/migratepages", "type": "file" }, { - "bom-ref": "38edf3ebe99903f6", + "bom-ref": "304273fae89d1b8a", "name": "/usr/bin/migspeed", "type": "file" }, { - "bom-ref": "ab8b746e12c52e33", + "bom-ref": "859e13cbfb750799", "name": "/usr/bin/mkdir", "type": "file" }, { - "bom-ref": "d453ade7e5ffed31", + "bom-ref": "047e1d218cd53097", "name": "/usr/bin/mkfifo", "type": "file" }, { - "bom-ref": "995c3bd2a77eaf5b", + "bom-ref": "ce2a329bb5fc6511", "name": "/usr/bin/mknod", "type": "file" }, { - "bom-ref": "9a669f9f3bc0499e", + "bom-ref": "b6fa608632138930", "name": "/usr/bin/mktemp", "type": "file" }, { - "bom-ref": "744dac3a626ced83", + "bom-ref": "de3511aff475302b", "name": "/usr/bin/more", "type": "file" }, { - "bom-ref": "22220f3be662ff43", + "bom-ref": "276eac37b876071f", "name": "/usr/bin/mount", "type": "file" }, { - "bom-ref": "3cf3703c68909bf3", + "bom-ref": "a02f5a245fdbfc1f", "name": "/usr/bin/mountpoint", "type": "file" }, { - "bom-ref": "319c9a688f05e099", + "bom-ref": "a3ace79a94cb00eb", "name": "/usr/bin/mv", "type": "file" }, { - "bom-ref": "c9c47c2c270f3cf2", + "bom-ref": "e98a9c15a15c7d66", "name": "/usr/bin/namei", "type": "file" }, { - "bom-ref": "e689105b5492c081", + "bom-ref": "c448dee6ed02e573", "name": "/usr/bin/networkctl", "type": "file" }, { - "bom-ref": "515400096b2707bc", + "bom-ref": "fd258751e6c8dcd6", "name": "/usr/bin/newgrp", "type": "file" }, { - "bom-ref": "d15f0428c6b325f5", + "bom-ref": "624214905c50d28b", "name": "/usr/bin/nice", "type": "file" }, { - "bom-ref": "5987921a8a893d16", + "bom-ref": "693155212c47dac8", "name": "/usr/bin/nl", "type": "file" }, { - "bom-ref": "275dcb021ade0088", + "bom-ref": "e2a014425e0eb756", "name": "/usr/bin/nohup", "type": "file" }, { - "bom-ref": "2bbac0dc0e5abb0c", + "bom-ref": "561ad5ece08b7efa", "name": "/usr/bin/nproc", "type": "file" }, { - "bom-ref": "09f19fe1c249b192", + "bom-ref": "20d949085e890972", "name": "/usr/bin/nsenter", "type": "file" }, { - "bom-ref": "9db86dd7ec18708d", + "bom-ref": "0110902b23d0335d", "name": "/usr/bin/numactl", "type": "file" }, { - "bom-ref": "cb9471cb128e39a8", + "bom-ref": "8f9d55cf9e235bbc", "name": "/usr/bin/numastat", "type": "file" }, { - "bom-ref": "c4c4d5638a3601fe", + "bom-ref": "d8b4215b121d04b4", "name": "/usr/bin/numfmt", "type": "file" }, { - "bom-ref": "3195602dc171d502", - "name": "/usr/bin/ocloc-26.18.1", + "bom-ref": "c7fbf29661604c08", + "name": "/usr/bin/ocloc-26.27.1", "type": "file" }, { - "bom-ref": "eef9810c59558aca", + "bom-ref": "6ced01384d174134", "name": "/usr/bin/od", "type": "file" }, { - "bom-ref": "e8be235ee7d937ca", + "bom-ref": "dc9c254fc79d419a", "name": "/usr/bin/openssl", "type": "file" }, { - "bom-ref": "94da218ee47f0803", + "bom-ref": "05f024a32ec2dee7", "name": "/usr/bin/partx", "type": "file" }, { - "bom-ref": "a2026f4532a65d77", + "bom-ref": "ed6561a75e453411", "name": "/usr/bin/passwd", "type": "file" }, { - "bom-ref": "174f308945bcb3fb", + "bom-ref": "414e3db5d6f332e9", "name": "/usr/bin/paste", "type": "file" }, { - "bom-ref": "2de59ba8cfadceb7", + "bom-ref": "d256fb1e8b8c3e1f", "name": "/usr/bin/patch", "type": "file" }, { - "bom-ref": "73dd8d1fdafa5aa0", + "bom-ref": "08ee02736bbca0de", "name": "/usr/bin/pathchk", "type": "file" }, { - "bom-ref": "104652cd178dcfd1", - "name": "/usr/bin/perl", - "type": "file" - }, - { - "bom-ref": "872326880462bb3a", + "bom-ref": "0b50ed465d626548", "name": "/usr/bin/perl", "type": "file" }, { - "bom-ref": "4e1e2e36719c2ca2", + "bom-ref": "1193fc4a83bd8f3e", "name": "/usr/bin/perl5.38-x86_64-linux-gnu", "type": "file" }, { - "bom-ref": "275af416ea429b42", + "bom-ref": "ed651a77a26d8259", "name": "/usr/bin/perlbug", "type": "file" }, { - "bom-ref": "dce807c5be0a462d", - "name": "/usr/bin/perlbug", - "type": "file" - }, - { - "bom-ref": "8e514501515412e0", + "bom-ref": "1b1943f016607170", "name": "/usr/bin/perldoc", "type": "file" }, { - "bom-ref": "2ff02ac6063b4ea1", + "bom-ref": "d1e844746d12171d", "name": "/usr/bin/perlivp", "type": "file" }, { - "bom-ref": "fab836ccb714099e", + "bom-ref": "32142691801be02c", "name": "/usr/bin/pgrep", "type": "file" }, { - "bom-ref": "c05d96c5cba378d7", + "bom-ref": "d68b3fdcf5a6ff4f", "name": "/usr/bin/piconv", "type": "file" }, { - "bom-ref": "6ad84eb35c9e1c03", + "bom-ref": "3d5f217f952298cd", "name": "/usr/bin/pidwait", "type": "file" }, { - "bom-ref": "1f3485617a147ebc", + "bom-ref": "fe14f0c91df48d92", "name": "/usr/bin/pinky", "type": "file" }, { - "bom-ref": "c02cd783e7f68046", + "bom-ref": "890b795847f187da", "name": "/usr/bin/pip", "type": "file" }, { - "bom-ref": "6abfa19723297e68", + "bom-ref": "8af2fdfe77dfa4f8", "name": "/usr/bin/pip3", "type": "file" }, { - "bom-ref": "0dcd9183de663bab", + "bom-ref": "5eba791d73a44ebf", "name": "/usr/bin/pip3.12", "type": "file" }, { - "bom-ref": "a87e04c7609a4a67", + "bom-ref": "f021806e8f821295", + "name": "/usr/bin/pkaction", + "type": "file" + }, + { + "bom-ref": "1dcd99c50736a510", + "name": "/usr/bin/pkcheck", + "type": "file" + }, + { + "bom-ref": "df767af4e611a453", + "name": "/usr/bin/pkttyagent", + "type": "file" + }, + { + "bom-ref": "7a841831d262349f", "name": "/usr/bin/pl2pm", "type": "file" }, { - "bom-ref": "62f47163eb7e9146", + "bom-ref": "4856c8680d4ff034", "name": "/usr/bin/pldd", "type": "file" }, { - "bom-ref": "e1aec550d56492f5", + "bom-ref": "f0ce08f6c64de06b", "name": "/usr/bin/pmap", "type": "file" }, { - "bom-ref": "a69f5e4b4b421b1a", + "bom-ref": "335733ec85b1b20a", "name": "/usr/bin/pod2html", "type": "file" }, { - "bom-ref": "e66bf6bcc7ad5c5a", + "bom-ref": "050f71d5befd329a", "name": "/usr/bin/pod2man", "type": "file" }, { - "bom-ref": "9ae2f81f2bc31abd", + "bom-ref": "e8e008cd13ff4849", "name": "/usr/bin/pod2text", "type": "file" }, { - "bom-ref": "5f815072ca62f54f", + "bom-ref": "060f6f28f54008ff", "name": "/usr/bin/pod2usage", "type": "file" }, { - "bom-ref": "ff1265b9a441a304", + "bom-ref": "0d102aeacfa71770", "name": "/usr/bin/podchecker", "type": "file" }, { - "bom-ref": "18d3db40c0bec776", + "bom-ref": "c5b5cda63fc68f98", "name": "/usr/bin/pr", "type": "file" }, { - "bom-ref": "dee1284d7ec5e90a", + "bom-ref": "a8d8ff3c72910628", "name": "/usr/bin/printenv", "type": "file" }, { - "bom-ref": "fdaa20697ca67449", + "bom-ref": "aba67946dda108db", "name": "/usr/bin/printf", "type": "file" }, { - "bom-ref": "4fc23a1972ceab2e", + "bom-ref": "93ad114e5820cfb2", "name": "/usr/bin/prlimit", "type": "file" }, { - "bom-ref": "2df95c6d58a7ef90", + "bom-ref": "1b1242c8ecb9c86c", "name": "/usr/bin/prove", "type": "file" }, { - "bom-ref": "7663689d7017f484", + "bom-ref": "8da3f94b06525f5e", "name": "/usr/bin/ps", "type": "file" }, { - "bom-ref": "d3d842be029ef8cf", + "bom-ref": "da02043dab78303f", "name": "/usr/bin/ptar", "type": "file" }, { - "bom-ref": "c7c767e6c8724638", + "bom-ref": "1598ccb2fcde45e4", "name": "/usr/bin/ptardiff", "type": "file" }, { - "bom-ref": "1da28fec80978522", + "bom-ref": "a75b00536be66942", "name": "/usr/bin/ptargrep", "type": "file" }, { - "bom-ref": "f74193ec4bffb37f", + "bom-ref": "c4dd903e6a9d0b59", "name": "/usr/bin/ptx", "type": "file" }, { - "bom-ref": "b54ca92a3cba88cc", + "bom-ref": "42559265bbdf147e", "name": "/usr/bin/pwd", "type": "file" }, { - "bom-ref": "f4e18f61689bf14b", + "bom-ref": "ca1a2f28809a9371", "name": "/usr/bin/pwdx", "type": "file" }, { - "bom-ref": "098ab605e12badc3", + "bom-ref": "9789d8a00adbf6fb", "name": "/usr/bin/py3clean", "type": "file" }, { - "bom-ref": "26b28790c01caaa7", + "bom-ref": "456b56b39dc0cabb", "name": "/usr/bin/py3compile", "type": "file" }, { - "bom-ref": "fe7276391bbc4a3c", + "bom-ref": "4c689ee41538e72c", "name": "/usr/bin/pydoc3.12", "type": "file" }, { - "bom-ref": "842c4def1472e39a", + "bom-ref": "fbd12de6f31c4862", "name": "/usr/bin/pygettext3.12", "type": "file" }, { - "bom-ref": "fd7741f0b2290aa6", + "bom-ref": "0a067c21f0cb0c2e", "name": "/usr/bin/python3.12", "type": "file" }, { - "bom-ref": "f5cece76a28a78c7", + "bom-ref": "af42736f27a02e0f", "name": "/usr/bin/qt-faststart", "type": "file" }, { - "bom-ref": "f5afe3a2feb1a2b5", + "bom-ref": "d23321c394e71b23", "name": "/usr/bin/readlink", "type": "file" }, { - "bom-ref": "bde1247b1aa746f1", + "bom-ref": "285a442361075ca3", "name": "/usr/bin/realpath", "type": "file" }, { - "bom-ref": "acc5600a14cdd9d6", + "bom-ref": "ec5c1b3a2454c54e", "name": "/usr/bin/rename.ul", "type": "file" }, { - "bom-ref": "a355fabdfc7feeb0", + "bom-ref": "7eb250dee964dd28", "name": "/usr/bin/renice", "type": "file" }, { - "bom-ref": "90d7af3e4a2d57f0", + "bom-ref": "583bb4694111bf04", "name": "/usr/bin/resizepart", "type": "file" }, { - "bom-ref": "32f6894e8392205e", + "bom-ref": "3a0ff70aa0d16a02", "name": "/usr/bin/rev", "type": "file" }, { - "bom-ref": "daeb2176a599b1d5", + "bom-ref": "63b3ef97bdc9f6ab", "name": "/usr/bin/rgrep", "type": "file" }, { - "bom-ref": "08265e6374c75aae", + "bom-ref": "659d8e71d78863d4", "name": "/usr/bin/rm", "type": "file" }, { - "bom-ref": "df02d095c8813591", + "bom-ref": "0f5a63da5ace622b", "name": "/usr/bin/rmdir", "type": "file" }, { - "bom-ref": "6b93b92530516775", + "bom-ref": "7e867168aa2b998d", "name": "/usr/bin/rpcgen", "type": "file" }, { - "bom-ref": "6e5c5d5bb6c44e40", + "bom-ref": "48bcebb5fbf6545e", "name": "/usr/bin/run-parts", "type": "file" }, { - "bom-ref": "0bf4c70f7ed5c86a", + "bom-ref": "ca6d8aac0d2675e4", "name": "/usr/bin/runcon", "type": "file" }, { - "bom-ref": "9efb5d9ed226421a", + "bom-ref": "67d0214c3a39fcd0", "name": "/usr/bin/savelog", "type": "file" }, { - "bom-ref": "d40380fb49f6356f", + "bom-ref": "28b7741877ec89fb", "name": "/usr/bin/scalar", "type": "file" }, { - "bom-ref": "2b83b016b59612c7", + "bom-ref": "d0be01c0772f92a3", "name": "/usr/bin/script", "type": "file" }, { - "bom-ref": "868cb1ed35b3ea31", + "bom-ref": "52e1cdf6d5a39e71", "name": "/usr/bin/scriptlive", "type": "file" }, { - "bom-ref": "ba81d84c5693d68d", + "bom-ref": "f8f1b0df49b199d5", "name": "/usr/bin/scriptreplay", "type": "file" }, { - "bom-ref": "c53760892c5edee7", + "bom-ref": "6f92134002ef7d7d", "name": "/usr/bin/sdiff", "type": "file" }, { - "bom-ref": "66d657c8cffba18a", + "bom-ref": "4542b240e3d5ad78", "name": "/usr/bin/sed", "type": "file" }, { - "bom-ref": "0cfc0bd55c04ef50", + "bom-ref": "05f5b9746106f996", "name": "/usr/bin/select-editor", "type": "file" }, { - "bom-ref": "258dca0e07f500fa", + "bom-ref": "f5e74689af18caa4", "name": "/usr/bin/sensible-browser", "type": "file" }, { - "bom-ref": "617dc6b8ae05e867", + "bom-ref": "1a1f09b2c59f473d", "name": "/usr/bin/sensible-editor", "type": "file" }, { - "bom-ref": "243117daa3347b95", + "bom-ref": "62e20dc0ffaad653", "name": "/usr/bin/sensible-pager", "type": "file" }, { - "bom-ref": "aa208623a0962d87", + "bom-ref": "a8811e2bb3ef8971", "name": "/usr/bin/sensible-terminal", "type": "file" }, { - "bom-ref": "96d4179482239398", + "bom-ref": "1a8b42b0f0d9f866", "name": "/usr/bin/seq", "type": "file" }, { - "bom-ref": "ad5cbe82f74b4db3", + "bom-ref": "17cd468b3afc960f", "name": "/usr/bin/setarch", "type": "file" }, { - "bom-ref": "ef067952992dbdeb", + "bom-ref": "7ac3ceba91297917", "name": "/usr/bin/setpriv", "type": "file" }, { - "bom-ref": "ffcb941af56c2adb", + "bom-ref": "d8a4e45ddfecb34b", "name": "/usr/bin/setsid", "type": "file" }, { - "bom-ref": "d8811999a2fbbad7", + "bom-ref": "8bb01ab0f34bfedf", "name": "/usr/bin/setterm", "type": "file" }, { - "bom-ref": "c7bab4d9474515fb", + "bom-ref": "1e5d9724543a3e75", "name": "/usr/bin/sha1sum", "type": "file" }, { - "bom-ref": "7ed5870975e4698d", + "bom-ref": "a995f0eedaeec363", "name": "/usr/bin/sha224sum", "type": "file" }, { - "bom-ref": "bfc1c8d3bd385ed5", + "bom-ref": "cc68690755af3987", "name": "/usr/bin/sha256sum", "type": "file" }, { - "bom-ref": "1d22c447b797c737", + "bom-ref": "d962fb101b229bb9", "name": "/usr/bin/sha384sum", "type": "file" }, { - "bom-ref": "8294dc99ea01c1f6", + "bom-ref": "8f9648b876ad13f0", "name": "/usr/bin/sha512sum", "type": "file" }, { - "bom-ref": "32c8a896ce977962", + "bom-ref": "7eea1d5e29cdd91e", "name": "/usr/bin/shasum", "type": "file" }, { - "bom-ref": "1859019b8a7c97d7", + "bom-ref": "03bbdf0c32b90c6d", "name": "/usr/bin/shred", "type": "file" }, { - "bom-ref": "40d9bdb898e72397", + "bom-ref": "2a412064c144509d", "name": "/usr/bin/shuf", "type": "file" }, { - "bom-ref": "e4b03e293e2b92c4", + "bom-ref": "804a45425d2f81c6", "name": "/usr/bin/skill", "type": "file" }, { - "bom-ref": "135fa230fc0d65ee", + "bom-ref": "4afc27c273c4c208", "name": "/usr/bin/slabtop", "type": "file" }, { - "bom-ref": "8067cab9992b28cf", + "bom-ref": "f0e641983ab7bb01", "name": "/usr/bin/sleep", "type": "file" }, { - "bom-ref": "5a8a9b5f1007f6cf", + "bom-ref": "3e74e507470ae7ed", "name": "/usr/bin/sort", "type": "file" }, { - "bom-ref": "f7dda1f99c7fe9bd", + "bom-ref": "922b0eac9f8746b5", "name": "/usr/bin/splain", "type": "file" }, { - "bom-ref": "af6905d054ca9118", + "bom-ref": "1108bc6819a933d2", "name": "/usr/bin/split", "type": "file" }, { - "bom-ref": "481e2795c2d39dec", + "bom-ref": "1358e05f33c27f92", "name": "/usr/bin/stat", "type": "file" }, { - "bom-ref": "e9b6115fec4f8e78", + "bom-ref": "f6b97a38ecb615aa", "name": "/usr/bin/stdbuf", "type": "file" }, { - "bom-ref": "f5373adc42602c9a", + "bom-ref": "963bc4ae9ac28d9a", "name": "/usr/bin/streamzip", "type": "file" }, { - "bom-ref": "965bf900f8b42281", + "bom-ref": "8f22ad3864e01703", "name": "/usr/bin/stty", "type": "file" }, { - "bom-ref": "14a9c373802de03e", + "bom-ref": "a204095940ee5d6a", "name": "/usr/bin/su", "type": "file" }, { - "bom-ref": "126bfaa5382f8755", + "bom-ref": "d84b5fec7ecec1bb", "name": "/usr/bin/sum", "type": "file" }, { - "bom-ref": "0e238ecaab91f8b9", + "bom-ref": "d586328d28eb2cef", "name": "/usr/bin/sync", "type": "file" }, { - "bom-ref": "f162cf648f24cc0e", + "bom-ref": "7b8977c39a53f124", "name": "/usr/bin/systemctl", "type": "file" }, { - "bom-ref": "9b6bde2791be763d", + "bom-ref": "11d6981fe4edbfdb", "name": "/usr/bin/systemd-ac-power", "type": "file" }, { - "bom-ref": "c7618382a4aaf016", + "bom-ref": "3c44a468b50791b0", "name": "/usr/bin/systemd-analyze", "type": "file" }, { - "bom-ref": "4b74e5798a758c9b", + "bom-ref": "82d6ddd86f83eaf9", "name": "/usr/bin/systemd-ask-password", "type": "file" }, { - "bom-ref": "0f37531d2742cb84", + "bom-ref": "ae5a173489431d16", "name": "/usr/bin/systemd-cat", "type": "file" }, { - "bom-ref": "2fb949454d284c6e", + "bom-ref": "ce973bde15642874", "name": "/usr/bin/systemd-cgls", "type": "file" }, { - "bom-ref": "c7dae8c305bb0599", + "bom-ref": "8075b0d582c45cd7", "name": "/usr/bin/systemd-cgtop", "type": "file" }, { - "bom-ref": "90dbdbf86064363d", + "bom-ref": "fbf833b0c5a36177", "name": "/usr/bin/systemd-creds", "type": "file" }, { - "bom-ref": "03ba762812605066", + "bom-ref": "c66a8aee45577d2c", "name": "/usr/bin/systemd-cryptenroll", "type": "file" }, { - "bom-ref": "599ceab4a4c8339b", + "bom-ref": "4564567037513841", "name": "/usr/bin/systemd-cryptsetup", "type": "file" }, { - "bom-ref": "94ec5e345accf7f5", + "bom-ref": "400526dce79d5b6f", "name": "/usr/bin/systemd-delta", "type": "file" }, { - "bom-ref": "a3be7e4eb807f133", + "bom-ref": "c85c50824320bcad", "name": "/usr/bin/systemd-detect-virt", "type": "file" }, { - "bom-ref": "7b8b39556187cf06", + "bom-ref": "2a39a863b8112c9c", "name": "/usr/bin/systemd-escape", "type": "file" }, { - "bom-ref": "55ca4d5d59ee15b3", + "bom-ref": "dc212b9aca0109b9", "name": "/usr/bin/systemd-firstboot", "type": "file" }, { - "bom-ref": "25021f731bad343e", + "bom-ref": "f46681512ca36bc2", "name": "/usr/bin/systemd-hwdb", "type": "file" }, { - "bom-ref": "555d445af09c14b3", + "bom-ref": "0010b8ec1b909b05", "name": "/usr/bin/systemd-id128", "type": "file" }, { - "bom-ref": "576458e5654d57b0", + "bom-ref": "128b7ab63bb6b2ce", "name": "/usr/bin/systemd-inhibit", "type": "file" }, { - "bom-ref": "92c829d0b75e1ede", + "bom-ref": "9e291ce5e1318270", "name": "/usr/bin/systemd-machine-id-setup", "type": "file" }, { - "bom-ref": "4f17cc535d50636d", + "bom-ref": "9ea64c346cb7d6f3", "name": "/usr/bin/systemd-mount", "type": "file" }, { - "bom-ref": "6d4264ddbbecc2d2", + "bom-ref": "3655c27475a9d168", "name": "/usr/bin/systemd-notify", "type": "file" }, { - "bom-ref": "ddb6dd4a44a4132a", + "bom-ref": "1da166cef0898650", "name": "/usr/bin/systemd-path", "type": "file" }, { - "bom-ref": "44a83ed15b7aae6b", + "bom-ref": "b4b72cb4f6b9c77d", "name": "/usr/bin/systemd-repart", "type": "file" }, { - "bom-ref": "75cfa9129ae9370f", + "bom-ref": "11e44dc1eb36d671", "name": "/usr/bin/systemd-run", "type": "file" }, { - "bom-ref": "12a2f61974368057", + "bom-ref": "09a82063b0e1fca5", "name": "/usr/bin/systemd-socket-activate", "type": "file" }, { - "bom-ref": "32018c9cc6ce02b6", + "bom-ref": "8a64dd8a5615951c", "name": "/usr/bin/systemd-stdio-bridge", "type": "file" }, { - "bom-ref": "5b81472358b28545", + "bom-ref": "5991350f939a3bab", "name": "/usr/bin/systemd-sysext", "type": "file" }, { - "bom-ref": "b259f644d3556452", + "bom-ref": "49ec7931d5be01f8", "name": "/usr/bin/systemd-sysusers", "type": "file" }, { - "bom-ref": "45e2d89a68376589", + "bom-ref": "51c12391784b96a3", "name": "/usr/bin/systemd-tmpfiles", "type": "file" }, { - "bom-ref": "11ccf585c557b310", + "bom-ref": "2d368d2c7ffe774a", "name": "/usr/bin/systemd-tty-ask-password-agent", "type": "file" }, { - "bom-ref": "d402fcea10c287f9", + "bom-ref": "c393798972ad1f2b", "name": "/usr/bin/tabs", "type": "file" }, { - "bom-ref": "8ef57a5652f7a28d", + "bom-ref": "93fd36a6c6d841ff", "name": "/usr/bin/tac", "type": "file" }, { - "bom-ref": "5183c273a2c99924", + "bom-ref": "a8c636ecba623d9a", "name": "/usr/bin/tail", "type": "file" }, { - "bom-ref": "8a4cdb428bc8754d", + "bom-ref": "afd2f794f2b56a6f", "name": "/usr/bin/tar", "type": "file" }, { - "bom-ref": "23591bb6bd2c41e1", + "bom-ref": "a7a1906cee004121", "name": "/usr/bin/taskset", "type": "file" }, { - "bom-ref": "fd87f18c476bbe93", + "bom-ref": "5f3035e5f077d8e9", "name": "/usr/bin/tee", "type": "file" }, { - "bom-ref": "b11d03c2d4c3f5af", + "bom-ref": "fd756c809344badd", "name": "/usr/bin/tempfile", "type": "file" }, { - "bom-ref": "f44ec11b4e3193df", + "bom-ref": "b339e2e1b91d1069", "name": "/usr/bin/test", "type": "file" }, { - "bom-ref": "9861a065348cb22a", + "bom-ref": "6c64aec9f2ec5d5c", "name": "/usr/bin/tic", "type": "file" }, { - "bom-ref": "c1b0c07e139f63da", + "bom-ref": "c6cc976917f2c4d0", "name": "/usr/bin/timedatectl", "type": "file" }, { - "bom-ref": "5d648921cddfc7cb", + "bom-ref": "c63f1b1078f626ed", "name": "/usr/bin/timeout", "type": "file" }, { - "bom-ref": "e476e6d8be66175f", + "bom-ref": "8659aa2636d3a20d", "name": "/usr/bin/tload", "type": "file" }, { - "bom-ref": "c74c329e43208994", + "bom-ref": "64da0d0ad884ec62", "name": "/usr/bin/toe", "type": "file" }, { - "bom-ref": "6cd3415f76a0d652", + "bom-ref": "b940f0369970011c", "name": "/usr/bin/top", "type": "file" }, { - "bom-ref": "209fe9a65ad217ea", + "bom-ref": "c4531402654bb488", "name": "/usr/bin/touch", "type": "file" }, { - "bom-ref": "47b4fa5de5b1af2d", + "bom-ref": "8be226a0e471070b", "name": "/usr/bin/tput", "type": "file" }, { - "bom-ref": "88e76f0227f306ba", + "bom-ref": "1187f9c027c20afc", "name": "/usr/bin/tr", "type": "file" }, { - "bom-ref": "966bdc4fbb81c0f4", + "bom-ref": "97d339ad98b39ef2", "name": "/usr/bin/true", "type": "file" }, { - "bom-ref": "69a63b0c633a6596", + "bom-ref": "53fb078f0a87fb80", "name": "/usr/bin/truncate", "type": "file" }, { - "bom-ref": "3f80c484a28186fa", + "bom-ref": "12980c5fe82b27d8", "name": "/usr/bin/tset", "type": "file" }, { - "bom-ref": "98f020fb479983f9", + "bom-ref": "a1c91c3496d88993", "name": "/usr/bin/tsort", "type": "file" }, { - "bom-ref": "8e3776bcf01d791a", + "bom-ref": "4aebb5762eb3e4cc", "name": "/usr/bin/tty", "type": "file" }, { - "bom-ref": "c046b44629f273f1", + "bom-ref": "a4311bd9ba167c9b", "name": "/usr/bin/tzselect", "type": "file" }, { - "bom-ref": "384877e3adcfb449", + "bom-ref": "2b5e9eee2250c595", "name": "/usr/bin/uclampset", "type": "file" }, { - "bom-ref": "c76d8d577fd29597", + "bom-ref": "b7e202e790ecc08f", "name": "/usr/bin/udevadm", "type": "file" }, { - "bom-ref": "a508b63b991ef9e9", + "bom-ref": "dc0904af23249639", "name": "/usr/bin/umount", "type": "file" }, { - "bom-ref": "7c3ae365f5f18e34", + "bom-ref": "2dfa2f53c9289cb2", "name": "/usr/bin/uname", "type": "file" }, { - "bom-ref": "02c86b5bc528934e", + "bom-ref": "4ab4567d43b06398", "name": "/usr/bin/unexpand", "type": "file" }, { - "bom-ref": "a54aaf6d7b5dfff0", + "bom-ref": "baab49507612907e", "name": "/usr/bin/uniq", "type": "file" }, { - "bom-ref": "82a85b1f9e9b6126", + "bom-ref": "2c101650d5f86964", "name": "/usr/bin/unlink", "type": "file" }, { - "bom-ref": "200eab0adb56ab05", + "bom-ref": "5aef897e0a202563", "name": "/usr/bin/unminimize", "type": "file" }, { - "bom-ref": "af30a7093fc3328a", + "bom-ref": "7ed61346875d9be6", "name": "/usr/bin/unshare", "type": "file" }, { - "bom-ref": "dea5ebdda4fcd5e6", + "bom-ref": "62d55479bb5d6aa4", "name": "/usr/bin/update-alternatives", "type": "file" }, { - "bom-ref": "a75045f9d22932e9", + "bom-ref": "2ecfdd5cd1547175", "name": "/usr/bin/update-mime-database", "type": "file" }, { - "bom-ref": "45dfd1a9dd91009a", + "bom-ref": "3fd5532530ff0cb8", "name": "/usr/bin/uptime", "type": "file" }, { - "bom-ref": "354fe68489984986", + "bom-ref": "ee4803a1c542829c", "name": "/usr/bin/users", "type": "file" }, { - "bom-ref": "2944e266aaee464b", + "bom-ref": "9487a176434059f7", "name": "/usr/bin/utmpdump", "type": "file" }, { - "bom-ref": "e0bc8ec72829c6af", + "bom-ref": "4282c81a87d51c45", "name": "/usr/bin/varlinkctl", "type": "file" }, { - "bom-ref": "37a06f5d34b904d3", + "bom-ref": "178483beb8080a7d", "name": "/usr/bin/vdir", "type": "file" }, { - "bom-ref": "2206aebe26814b49", + "bom-ref": "4f256a054a183f3d", "name": "/usr/bin/vim.basic", "type": "file" }, { - "bom-ref": "5e5adaa9ade8bcb8", + "bom-ref": "781b5befce11c7e8", "name": "/usr/bin/vimtutor", "type": "file" }, { - "bom-ref": "a7347a450307d80e", + "bom-ref": "432fe76f33c5de58", "name": "/usr/bin/vmstat", "type": "file" }, { - "bom-ref": "5fb39d87be1806fa", + "bom-ref": "e15bcfd7774f334c", "name": "/usr/bin/w", "type": "file" }, { - "bom-ref": "cc7c4c59cb7fb6c0", + "bom-ref": "9c46799716e56b38", "name": "/usr/bin/wall", "type": "file" }, { - "bom-ref": "a2492e3705cf8dfe", + "bom-ref": "dd2260bd35dde15c", "name": "/usr/bin/watch", "type": "file" }, { - "bom-ref": "bb8bb36f33df27cb", + "bom-ref": "807c309589f8d45d", "name": "/usr/bin/wc", "type": "file" }, { - "bom-ref": "581858cace8bb568", + "bom-ref": "749d648fe40be26c", "name": "/usr/bin/wdctl", "type": "file" }, { - "bom-ref": "8201c53938caddd8", + "bom-ref": "2b19e029d01e1a44", "name": "/usr/bin/wget", "type": "file" }, { - "bom-ref": "3b2bfbfe713c7f76", + "bom-ref": "310ea86fa0914c7e", "name": "/usr/bin/whereis", "type": "file" }, { - "bom-ref": "9921725834a6118c", + "bom-ref": "c8645e9ee0eb592a", "name": "/usr/bin/which.debianutils", "type": "file" }, { - "bom-ref": "dd6960f2dfbc186c", + "bom-ref": "19d41a92983fbcb2", "name": "/usr/bin/who", "type": "file" }, { - "bom-ref": "108f18dc8d2847bf", + "bom-ref": "c1b2daade5be03f1", "name": "/usr/bin/whoami", "type": "file" }, { - "bom-ref": "39a8370753d9c6e1", + "bom-ref": "95562e5e73d15229", "name": "/usr/bin/x86_64-linux-gnu-addr2line", "type": "file" }, { - "bom-ref": "6f5d17990946ff9f", + "bom-ref": "5f4802dd30b958b7", "name": "/usr/bin/x86_64-linux-gnu-ar", "type": "file" }, { - "bom-ref": "a749a07861784c7e", + "bom-ref": "ba70db866350951e", "name": "/usr/bin/x86_64-linux-gnu-as", "type": "file" }, { - "bom-ref": "171885981e7b8cd4", + "bom-ref": "d6482a61822b06a4", "name": "/usr/bin/x86_64-linux-gnu-c++filt", "type": "file" }, { - "bom-ref": "7cbcf80a28815b47", + "bom-ref": "98249be290ad186b", "name": "/usr/bin/x86_64-linux-gnu-cpp-13", "type": "file" }, { - "bom-ref": "5cf906ffe0f003a4", + "bom-ref": "3eb92ae5c22d19e0", "name": "/usr/bin/x86_64-linux-gnu-dwp", "type": "file" }, { - "bom-ref": "2aef493e71e5ad73", + "bom-ref": "b1650dc6f646a84f", "name": "/usr/bin/x86_64-linux-gnu-elfedit", "type": "file" }, { - "bom-ref": "8872aef6148d1be1", + "bom-ref": "28ce8878946def05", "name": "/usr/bin/x86_64-linux-gnu-g++-13", "type": "file" }, { - "bom-ref": "a7dcc75608b12225", + "bom-ref": "4e42fda972c496d1", "name": "/usr/bin/x86_64-linux-gnu-gcc-13", "type": "file" }, { - "bom-ref": "521ff792f2d369ac", + "bom-ref": "8df5af5f15654cd8", "name": "/usr/bin/x86_64-linux-gnu-gcc-ar-13", "type": "file" }, { - "bom-ref": "8b6dae0b6941afc6", + "bom-ref": "712cbe6be35a8e96", "name": "/usr/bin/x86_64-linux-gnu-gcc-nm-13", "type": "file" }, { - "bom-ref": "2459908afc18cf0f", + "bom-ref": "31d06ecf2db28d87", "name": "/usr/bin/x86_64-linux-gnu-gcc-ranlib-13", "type": "file" }, { - "bom-ref": "10c11559ae29086b", + "bom-ref": "815433c73614f9af", "name": "/usr/bin/x86_64-linux-gnu-gcov-13", "type": "file" }, { - "bom-ref": "bb5d89a610891c13", + "bom-ref": "a20aed53f9900fdb", "name": "/usr/bin/x86_64-linux-gnu-gcov-dump-13", "type": "file" }, { - "bom-ref": "9d827f459cc20fa7", + "bom-ref": "36bff3f93dbf119f", "name": "/usr/bin/x86_64-linux-gnu-gcov-tool-13", "type": "file" }, { - "bom-ref": "4883ba9577d490c2", + "bom-ref": "a3c504b5bfcb8526", "name": "/usr/bin/x86_64-linux-gnu-gp-archive", "type": "file" }, { - "bom-ref": "4a06d3c95b80163c", + "bom-ref": "0a21912e487da610", "name": "/usr/bin/x86_64-linux-gnu-gp-collect-app", "type": "file" }, { - "bom-ref": "ab46790c0c17b800", + "bom-ref": "a44ebc4918db26c0", "name": "/usr/bin/x86_64-linux-gnu-gp-display-html", "type": "file" }, { - "bom-ref": "a1836b5ca9c55143", + "bom-ref": "618667b87a16da0b", "name": "/usr/bin/x86_64-linux-gnu-gp-display-src", "type": "file" }, { - "bom-ref": "a7e3cce3e2231ed5", + "bom-ref": "49833f83c0f4ae11", "name": "/usr/bin/x86_64-linux-gnu-gp-display-text", "type": "file" }, { - "bom-ref": "cf09670d14ae1bab", + "bom-ref": "bce253d20c80078b", "name": "/usr/bin/x86_64-linux-gnu-gprof", "type": "file" }, { - "bom-ref": "bd9e2fb9efc44b0a", + "bom-ref": "a48a76b66135a2b6", "name": "/usr/bin/x86_64-linux-gnu-gprofng", "type": "file" }, { - "bom-ref": "cf07df24ca9240aa", + "bom-ref": "7b567b43855cb9e6", "name": "/usr/bin/x86_64-linux-gnu-ld.bfd", "type": "file" }, { - "bom-ref": "9ca2f802a463f44d", + "bom-ref": "41c6307e16c35461", "name": "/usr/bin/x86_64-linux-gnu-ld.gold", "type": "file" }, { - "bom-ref": "b42f19cd04b55744", + "bom-ref": "8946e0e290a4f360", "name": "/usr/bin/x86_64-linux-gnu-lto-dump-13", "type": "file" }, { - "bom-ref": "8dd7377270446638", + "bom-ref": "437754e23934cce4", "name": "/usr/bin/x86_64-linux-gnu-nm", "type": "file" }, { - "bom-ref": "d93e3d8867e1ad67", + "bom-ref": "4f2bfec661cc6b4f", "name": "/usr/bin/x86_64-linux-gnu-objcopy", "type": "file" }, { - "bom-ref": "28bc6a78401e6826", + "bom-ref": "cc3d55628b57fe0a", "name": "/usr/bin/x86_64-linux-gnu-objdump", "type": "file" }, { - "bom-ref": "00f12777e9fbae44", + "bom-ref": "d986d7c37ba82c8c", "name": "/usr/bin/x86_64-linux-gnu-python3.12-config", "type": "file" }, { - "bom-ref": "480b6ed27fe1359a", + "bom-ref": "572d4f5a1651ee5a", "name": "/usr/bin/x86_64-linux-gnu-ranlib", "type": "file" }, { - "bom-ref": "1b6c765d1aa905fc", + "bom-ref": "2550e08a7fe84238", "name": "/usr/bin/x86_64-linux-gnu-readelf", "type": "file" }, { - "bom-ref": "c541f7fdd9d332d1", + "bom-ref": "8d2bc839bcc77711", "name": "/usr/bin/x86_64-linux-gnu-size", "type": "file" }, { - "bom-ref": "860ebe9157590f7e", + "bom-ref": "676cc774d47b737e", "name": "/usr/bin/x86_64-linux-gnu-strings", "type": "file" }, { - "bom-ref": "85d0d84556e1e610", + "bom-ref": "0067577bf81f5d04", "name": "/usr/bin/x86_64-linux-gnu-strip", "type": "file" }, { - "bom-ref": "7894f6b030ab62af", + "bom-ref": "51c12f744820a969", "name": "/usr/bin/xargs", "type": "file" }, { - "bom-ref": "f75757b46c234951", + "bom-ref": "22d4018d91f8c1c9", + "name": "/usr/bin/xpu-smi", + "type": "file" + }, + { + "bom-ref": "bd7d0f87d44e5a65", "name": "/usr/bin/xsubpp", "type": "file" }, { - "bom-ref": "f46d7e623a399c0f", + "bom-ref": "b065c97d8f1cfcbf", "name": "/usr/bin/xz", "type": "file" }, { - "bom-ref": "adfa74328e1cb936", + "bom-ref": "eb6fc46f0caf631a", "name": "/usr/bin/xzdiff", "type": "file" }, { - "bom-ref": "5cb3583c72638001", + "bom-ref": "6fbb082915de8eb5", "name": "/usr/bin/xzgrep", "type": "file" }, { - "bom-ref": "efa8b86cce56adff", + "bom-ref": "74ec0e39bbca9d0f", "name": "/usr/bin/xzless", "type": "file" }, { - "bom-ref": "1687ea778af3a556", + "bom-ref": "133779c1d15cf1a2", "name": "/usr/bin/xzmore", "type": "file" }, { - "bom-ref": "92998a6c33b004f3", + "bom-ref": "aa0cc0f21856da6d", "name": "/usr/bin/yes", "type": "file" }, { - "bom-ref": "d640a5b8d4e11142", + "bom-ref": "68dfa2d3c1613ff8", "name": "/usr/bin/zcat", "type": "file" }, { - "bom-ref": "c07ece52f04ac85f", + "bom-ref": "50f42fc783494b65", "name": "/usr/bin/zcmp", "type": "file" }, { - "bom-ref": "d513cce86105dcac", + "bom-ref": "ab2a346c084221da", "name": "/usr/bin/zdiff", "type": "file" }, { - "bom-ref": "e8d1c1934ff8bbcf", + "bom-ref": "6ed22db1664d5df5", "name": "/usr/bin/zdump", "type": "file" }, { - "bom-ref": "fc190f38c0d67988", + "bom-ref": "d75f508d84e76002", "name": "/usr/bin/zegrep", "type": "file" }, { - "bom-ref": "16c57a9db2ea1346", + "bom-ref": "493826c38d16ef3c", "name": "/usr/bin/zfgrep", "type": "file" }, { - "bom-ref": "f8ffa760b72a54fd", + "bom-ref": "3d8843e5e2a1f98f", "name": "/usr/bin/zforce", "type": "file" }, { - "bom-ref": "94091e88d0dfa60c", + "bom-ref": "9634bcefca2796fa", "name": "/usr/bin/zgrep", "type": "file" }, { - "bom-ref": "c08b5c53fe08a7cc", + "bom-ref": "5e0d78be2fe66858", "name": "/usr/bin/zipdetails", "type": "file" }, { - "bom-ref": "3063e79234b64e19", + "bom-ref": "4785b035e07af2fb", "name": "/usr/bin/zless", "type": "file" }, { - "bom-ref": "3410f19271eaf362", + "bom-ref": "cdaced333305bab4", "name": "/usr/bin/zmore", "type": "file" }, { - "bom-ref": "fc08a82f09c892d9", + "bom-ref": "aa8b8c5b8be445bb", "name": "/usr/bin/znew", "type": "file" }, { - "bom-ref": "6d01c1dcd1ad2ea3", + "bom-ref": "3b3b12b9478f4f43", "name": "/usr/include/aio.h", "type": "file" }, { - "bom-ref": "e3332fb796497186", + "bom-ref": "9a4fb70eaa4fafd2", "name": "/usr/include/aliases.h", "type": "file" }, { - "bom-ref": "d3fbe582c0256f10", + "bom-ref": "892111eb9c25528c", "name": "/usr/include/alloca.h", "type": "file" }, { - "bom-ref": "5f4d357461f929ad", + "bom-ref": "8a6c3320c74ca529", "name": "/usr/include/ar.h", "type": "file" }, { - "bom-ref": "5058dfa67310349d", + "bom-ref": "ba8e26ca04f37d71", "name": "/usr/include/argp.h", "type": "file" }, { - "bom-ref": "257edfe58f6726a7", + "bom-ref": "1c38914a50a8cd63", "name": "/usr/include/argz.h", "type": "file" }, { - "bom-ref": "85b87c1b91a37689", + "bom-ref": "8b9b4e5c829741c5", "name": "/usr/include/arpa/ftp.h", "type": "file" }, { - "bom-ref": "8cf35c9365472434", + "bom-ref": "6d7c5f3d2820bf28", "name": "/usr/include/arpa/inet.h", "type": "file" }, { - "bom-ref": "1eef3ba7cd39bc56", + "bom-ref": "8eb786071beda20a", "name": "/usr/include/arpa/nameser.h", "type": "file" }, { - "bom-ref": "5d4de0e852071692", + "bom-ref": "279b78aff6af879e", "name": "/usr/include/arpa/nameser_compat.h", "type": "file" }, { - "bom-ref": "2f356faa2a46c7b5", + "bom-ref": "e5d45b5bd0b43f65", "name": "/usr/include/arpa/telnet.h", "type": "file" }, { - "bom-ref": "7b9287ac61472fa8", + "bom-ref": "1c6fdb7b5ed50378", "name": "/usr/include/arpa/tftp.h", "type": "file" }, { - "bom-ref": "707c2c0c81d4ad6e", + "bom-ref": "750bd44f649acf52", "name": "/usr/include/asm-generic/auxvec.h", "type": "file" }, { - "bom-ref": "2dc69a0b2aaffd0c", + "bom-ref": "e5fb2eadcce0f70c", "name": "/usr/include/asm-generic/bitsperlong.h", "type": "file" }, { - "bom-ref": "ccf67c27816f80d5", + "bom-ref": "f7c37c01dfb151a5", "name": "/usr/include/asm-generic/bpf_perf_event.h", "type": "file" }, { - "bom-ref": "334c81573715fb46", + "bom-ref": "493e9936bd13f3ce", "name": "/usr/include/asm-generic/errno-base.h", "type": "file" }, { - "bom-ref": "d041e0ea060c8d65", + "bom-ref": "cfa38176b0e5e01d", "name": "/usr/include/asm-generic/errno.h", "type": "file" }, { - "bom-ref": "4c3bf89939b66614", + "bom-ref": "3183f97916dba878", "name": "/usr/include/asm-generic/fcntl.h", "type": "file" }, { - "bom-ref": "540b29a62e95932a", + "bom-ref": "95bc5d434ea94c62", "name": "/usr/include/asm-generic/hugetlb_encode.h", "type": "file" }, { - "bom-ref": "4fc65b1224b739d4", + "bom-ref": "c073c40c7269d510", "name": "/usr/include/asm-generic/int-l64.h", "type": "file" }, { - "bom-ref": "c576fb5b7ba7195c", + "bom-ref": "6bad0b713fa03630", "name": "/usr/include/asm-generic/int-ll64.h", "type": "file" }, { - "bom-ref": "8d6f2be2b4170177", + "bom-ref": "05479ee5495d6f6f", "name": "/usr/include/asm-generic/ioctl.h", "type": "file" }, { - "bom-ref": "f11cb2cdfad52677", + "bom-ref": "3e0b807febf7c12b", "name": "/usr/include/asm-generic/ioctls.h", "type": "file" }, { - "bom-ref": "f850bd55e62f80fa", + "bom-ref": "6c393c38f7307f2e", "name": "/usr/include/asm-generic/ipcbuf.h", "type": "file" }, { - "bom-ref": "78c058ee635228e3", + "bom-ref": "529859cb7cae1957", "name": "/usr/include/asm-generic/kvm_para.h", "type": "file" }, { - "bom-ref": "48ee96774bca8874", + "bom-ref": "764313e1024e6764", "name": "/usr/include/asm-generic/mman-common.h", "type": "file" }, { - "bom-ref": "23f5699ec75e58f8", + "bom-ref": "a72968e774d75a8c", "name": "/usr/include/asm-generic/mman.h", "type": "file" }, { - "bom-ref": "25159299549300f0", + "bom-ref": "97ad818b7d61c084", "name": "/usr/include/asm-generic/msgbuf.h", "type": "file" }, { - "bom-ref": "bddb50d1b3da2a5b", + "bom-ref": "767db57d34777883", "name": "/usr/include/asm-generic/param.h", "type": "file" }, { - "bom-ref": "b1305c4105d5e975", + "bom-ref": "3b259e6930ccf9a9", "name": "/usr/include/asm-generic/poll.h", "type": "file" }, { - "bom-ref": "1607b8f09b394a4f", + "bom-ref": "3d891e03a33b0f37", "name": "/usr/include/asm-generic/posix_types.h", "type": "file" }, { - "bom-ref": "58c0daf29fc2ee2b", + "bom-ref": "ad56ee8d5dc85c13", "name": "/usr/include/asm-generic/resource.h", "type": "file" }, { - "bom-ref": "59be9978f9ae234e", + "bom-ref": "70cf0a7c33e5f50a", "name": "/usr/include/asm-generic/sembuf.h", "type": "file" }, { - "bom-ref": "0ed49a4cee19154d", + "bom-ref": "6058427006c1f765", "name": "/usr/include/asm-generic/setup.h", "type": "file" }, { - "bom-ref": "214cb50c7881150f", + "bom-ref": "61fd9c541b3ec0ff", "name": "/usr/include/asm-generic/shmbuf.h", "type": "file" }, { - "bom-ref": "bf270fda4341aece", + "bom-ref": "0f8f1f34f9cd3d0e", "name": "/usr/include/asm-generic/siginfo.h", "type": "file" }, { - "bom-ref": "3950c56fe2878cb7", + "bom-ref": "0d3d88447796a817", "name": "/usr/include/asm-generic/signal-defs.h", "type": "file" }, { - "bom-ref": "15c4cf52ec7d2408", + "bom-ref": "391a16a0f1055284", "name": "/usr/include/asm-generic/signal.h", "type": "file" }, { - "bom-ref": "98feb0a395496ce9", + "bom-ref": "01994007e8f1c02d", "name": "/usr/include/asm-generic/socket.h", "type": "file" }, { - "bom-ref": "bedbee167562f70d", + "bom-ref": "f1913075d7ecb3d5", "name": "/usr/include/asm-generic/sockios.h", "type": "file" }, { - "bom-ref": "2ad54aac01b33830", + "bom-ref": "a94be68a47ccda94", "name": "/usr/include/asm-generic/stat.h", "type": "file" }, { - "bom-ref": "66c65390e33e4261", + "bom-ref": "47ea84bc3bda63fd", "name": "/usr/include/asm-generic/statfs.h", "type": "file" }, { - "bom-ref": "df5226b061eb866d", + "bom-ref": "98b211953d904f01", "name": "/usr/include/asm-generic/swab.h", "type": "file" }, { - "bom-ref": "4421081b3603e165", + "bom-ref": "1db5cd674d867b9d", "name": "/usr/include/asm-generic/termbits-common.h", "type": "file" }, { - "bom-ref": "c93fbb9d1589006d", + "bom-ref": "dabf3d3f3068b3d1", "name": "/usr/include/asm-generic/termbits.h", "type": "file" }, { - "bom-ref": "3ec6d6db86e78ece", + "bom-ref": "716d5a93be70d94a", "name": "/usr/include/asm-generic/termios.h", "type": "file" }, { - "bom-ref": "f2bdb017b4f8ca27", + "bom-ref": "ee60f54967f5793f", "name": "/usr/include/asm-generic/types.h", "type": "file" }, { - "bom-ref": "31bbbeb4b56293df", + "bom-ref": "1195e40a98364fa7", "name": "/usr/include/asm-generic/ucontext.h", "type": "file" }, { - "bom-ref": "1acb784edb1ce9b9", + "bom-ref": "9fb87e37b5b818d5", "name": "/usr/include/asm-generic/unistd.h", "type": "file" }, { - "bom-ref": "8452f89e84568f50", + "bom-ref": "96682272cf06d78c", "name": "/usr/include/assert.h", "type": "file" }, { - "bom-ref": "b0d1de138176edff", + "bom-ref": "e3b0c07eaa9a65c7", "name": "/usr/include/byteswap.h", "type": "file" }, { - "bom-ref": "824bf6348e8eed83", + "bom-ref": "6a8bf58a6f14fa73", "name": "/usr/include/c++/13/algorithm", "type": "file" }, { - "bom-ref": "d953ed50fdcf9962", + "bom-ref": "f68e3f17ba1cd4fe", "name": "/usr/include/c++/13/any", "type": "file" }, { - "bom-ref": "9c9b35fac3a4e7eb", + "bom-ref": "3ba26610e522c0ff", "name": "/usr/include/c++/13/array", "type": "file" }, { - "bom-ref": "790986aff334583d", + "bom-ref": "83189329ff5ba8f9", "name": "/usr/include/c++/13/atomic", "type": "file" }, { - "bom-ref": "464b8e3e31443d1a", + "bom-ref": "0f3b41278ebf725e", "name": "/usr/include/c++/13/backward/auto_ptr.h", "type": "file" }, { - "bom-ref": "9ade9c836b03d580", + "bom-ref": "f40f993458fda1e8", "name": "/usr/include/c++/13/backward/backward_warning.h", "type": "file" }, { - "bom-ref": "80ee6e37ae8581e2", + "bom-ref": "0e0b18d06f121116", "name": "/usr/include/c++/13/backward/binders.h", "type": "file" }, { - "bom-ref": "1f8536e196026993", + "bom-ref": "a94ffad2dc3abb4b", "name": "/usr/include/c++/13/backward/hash_fun.h", "type": "file" }, { - "bom-ref": "84cd11f96ea3c97a", + "bom-ref": "d2ce2b2c31ebf5ca", "name": "/usr/include/c++/13/backward/hash_map", "type": "file" }, { - "bom-ref": "a4ee236d35d51cea", + "bom-ref": "8e75fb524ed5347a", "name": "/usr/include/c++/13/backward/hash_set", "type": "file" }, { - "bom-ref": "c300a1f3ad83cf24", + "bom-ref": "ad0682a201347344", "name": "/usr/include/c++/13/backward/hashtable.h", "type": "file" }, { - "bom-ref": "0f24b7d5c20c1136", + "bom-ref": "44de92945bba16be", "name": "/usr/include/c++/13/backward/strstream", "type": "file" }, { - "bom-ref": "074196e330a1a74a", + "bom-ref": "781416ce96889a0e", "name": "/usr/include/c++/13/barrier", "type": "file" }, { - "bom-ref": "612826f0be897fc5", + "bom-ref": "676b252cafa6b569", "name": "/usr/include/c++/13/bit", "type": "file" }, { - "bom-ref": "0176f6ad01c6cc6c", + "bom-ref": "259e88d93272939c", "name": "/usr/include/c++/13/bits/algorithmfwd.h", "type": "file" }, { - "bom-ref": "0ba9030953aeb843", + "bom-ref": "a56c85b55895a0c3", "name": "/usr/include/c++/13/bits/align.h", "type": "file" }, { - "bom-ref": "d60fc479e52a87c3", + "bom-ref": "06118e3e125a7c1b", "name": "/usr/include/c++/13/bits/alloc_traits.h", "type": "file" }, { - "bom-ref": "b8b3d393db5c1068", + "bom-ref": "f0c03a78d45e9b30", "name": "/usr/include/c++/13/bits/allocated_ptr.h", "type": "file" }, { - "bom-ref": "d76976905964387b", + "bom-ref": "5ce74fa8d22d8a83", "name": "/usr/include/c++/13/bits/allocator.h", "type": "file" }, { - "bom-ref": "75151ed22dae4b0b", + "bom-ref": "6477006f85dd5ebf", "name": "/usr/include/c++/13/bits/atomic_base.h", "type": "file" }, { - "bom-ref": "eddfe237babf0ed7", + "bom-ref": "077733e746404d6f", "name": "/usr/include/c++/13/bits/atomic_futex.h", "type": "file" }, { - "bom-ref": "88178a036ab786b6", + "bom-ref": "551d9d6d9b503ca2", "name": "/usr/include/c++/13/bits/atomic_lockfree_defines.h", "type": "file" }, { - "bom-ref": "1b000b76378b8df7", + "bom-ref": "db62a0ddfa1eb453", "name": "/usr/include/c++/13/bits/atomic_timed_wait.h", "type": "file" }, { - "bom-ref": "38cf2404879c3294", + "bom-ref": "c16106abb8291b50", "name": "/usr/include/c++/13/bits/atomic_wait.h", "type": "file" }, { - "bom-ref": "a4379d0eef367f08", + "bom-ref": "933c7f245f38cd38", "name": "/usr/include/c++/13/bits/basic_ios.h", "type": "file" }, { - "bom-ref": "e5a1e6e294c72e2d", + "bom-ref": "4625250dc5616bcd", "name": "/usr/include/c++/13/bits/basic_ios.tcc", "type": "file" }, { - "bom-ref": "19b3725c0af9f0ee", + "bom-ref": "c9b95622ff25ac2a", "name": "/usr/include/c++/13/bits/basic_string.h", "type": "file" }, { - "bom-ref": "9697bc1d5d418d3d", + "bom-ref": "60190d479d78ef05", "name": "/usr/include/c++/13/bits/basic_string.tcc", "type": "file" }, { - "bom-ref": "9666c32482a24327", + "bom-ref": "8d12329b54cdfd73", "name": "/usr/include/c++/13/bits/boost_concept_check.h", "type": "file" }, { - "bom-ref": "d3d8685d20ded8c0", + "bom-ref": "f9760ed9b92a1de8", "name": "/usr/include/c++/13/bits/c++0x_warning.h", "type": "file" }, { - "bom-ref": "c27b1333b91ff74b", + "bom-ref": "df0cedc5516016ef", "name": "/usr/include/c++/13/bits/char_traits.h", "type": "file" }, { - "bom-ref": "9841ef28b58a8adf", + "bom-ref": "1bc86abee7f8df53", "name": "/usr/include/c++/13/bits/charconv.h", "type": "file" }, { - "bom-ref": "969fbfe60e2013cb", + "bom-ref": "fd8c1439ffd1772f", "name": "/usr/include/c++/13/bits/chrono.h", "type": "file" }, { - "bom-ref": "1527a22ab55d43eb", + "bom-ref": "7e43291dd1293063", "name": "/usr/include/c++/13/bits/chrono_io.h", "type": "file" }, { - "bom-ref": "6b61ec21659ffc1c", + "bom-ref": "d26d05d8dd5701a0", "name": "/usr/include/c++/13/bits/codecvt.h", "type": "file" }, { - "bom-ref": "2c19f6a87b2ec60b", + "bom-ref": "ae0d7c26cfbf326f", "name": "/usr/include/c++/13/bits/concept_check.h", "type": "file" }, { - "bom-ref": "5c2f3774de967689", + "bom-ref": "7e32f405d749126d", "name": "/usr/include/c++/13/bits/cow_string.h", "type": "file" }, { - "bom-ref": "3089851dbe32051f", + "bom-ref": "246aa661a8655723", "name": "/usr/include/c++/13/bits/cpp_type_traits.h", "type": "file" }, { - "bom-ref": "87596b125c591fcb", + "bom-ref": "7372d3defba76ecb", "name": "/usr/include/c++/13/bits/cxxabi_forced.h", "type": "file" }, { - "bom-ref": "15a76a2164218a4f", + "bom-ref": "04b38022d304bd7f", "name": "/usr/include/c++/13/bits/cxxabi_init_exception.h", "type": "file" }, { - "bom-ref": "824d9dd242c4d09d", + "bom-ref": "baf656a79b428e81", "name": "/usr/include/c++/13/bits/deque.tcc", "type": "file" }, { - "bom-ref": "0f273b5c45731fc2", + "bom-ref": "652266442b534466", "name": "/usr/include/c++/13/bits/enable_special_members.h", "type": "file" }, { - "bom-ref": "a8c6fadf438371a9", + "bom-ref": "46b112dc3b522c41", "name": "/usr/include/c++/13/bits/erase_if.h", "type": "file" }, { - "bom-ref": "c3527b2065edee90", + "bom-ref": "d5ec2a4004c81e90", "name": "/usr/include/c++/13/bits/exception.h", "type": "file" }, { - "bom-ref": "b9682f2f65be98c5", + "bom-ref": "74a1e1c9da8790b9", "name": "/usr/include/c++/13/bits/exception_defines.h", "type": "file" }, { - "bom-ref": "c848d6833c522aca", + "bom-ref": "6104c719cce86e22", "name": "/usr/include/c++/13/bits/exception_ptr.h", "type": "file" }, { - "bom-ref": "3aae6d1d7818dad7", + "bom-ref": "8a9a8b8e3272e0d7", "name": "/usr/include/c++/13/bits/forward_list.h", "type": "file" }, { - "bom-ref": "febb0470602cda51", + "bom-ref": "cc681338a8122ea9", "name": "/usr/include/c++/13/bits/forward_list.tcc", "type": "file" }, { - "bom-ref": "8c7a2b3f88cf7a16", + "bom-ref": "eb2c976c392b60d6", "name": "/usr/include/c++/13/bits/fs_dir.h", "type": "file" }, { - "bom-ref": "221b8559b99f3e37", + "bom-ref": "f82938651854dab3", "name": "/usr/include/c++/13/bits/fs_fwd.h", "type": "file" }, { - "bom-ref": "dcd8f1d943bb0088", + "bom-ref": "36ad9bfcc06745a4", "name": "/usr/include/c++/13/bits/fs_ops.h", "type": "file" }, { - "bom-ref": "ffa7bb3a9b741792", + "bom-ref": "0ffb268d956e99de", "name": "/usr/include/c++/13/bits/fs_path.h", "type": "file" }, { - "bom-ref": "dab12daafe9af62e", + "bom-ref": "79402c225884f4a6", "name": "/usr/include/c++/13/bits/fstream.tcc", "type": "file" }, { - "bom-ref": "ffe13175f26c788f", + "bom-ref": "86d2c79bae03d6e3", "name": "/usr/include/c++/13/bits/functexcept.h", "type": "file" }, { - "bom-ref": "d1baa19153ebb6a5", + "bom-ref": "b2d652841f5b4b49", "name": "/usr/include/c++/13/bits/functional_hash.h", "type": "file" }, { - "bom-ref": "5c3855f4576525f0", + "bom-ref": "731eceae61b05800", "name": "/usr/include/c++/13/bits/gslice.h", "type": "file" }, { - "bom-ref": "3acdb075895d86fd", + "bom-ref": "ae117e528b1e894d", "name": "/usr/include/c++/13/bits/gslice_array.h", "type": "file" }, { - "bom-ref": "814a280e0b89b466", + "bom-ref": "9cd9e120c5b109c2", "name": "/usr/include/c++/13/bits/hash_bytes.h", "type": "file" }, { - "bom-ref": "b35f444712c8ca1c", + "bom-ref": "32a268967919849c", "name": "/usr/include/c++/13/bits/hashtable.h", "type": "file" }, { - "bom-ref": "e0b3c0ce1d19c366", + "bom-ref": "5a8543a8dbcd901a", "name": "/usr/include/c++/13/bits/hashtable_policy.h", "type": "file" }, { - "bom-ref": "64bf2bfd176d6eee", + "bom-ref": "c0c3bfd13961e75e", "name": "/usr/include/c++/13/bits/indirect_array.h", "type": "file" }, { - "bom-ref": "58ceb56de97b3cd7", + "bom-ref": "ff19475c2d646757", "name": "/usr/include/c++/13/bits/invoke.h", "type": "file" }, { - "bom-ref": "16704a3de3e3544f", + "bom-ref": "e48b5f96c4d3dc97", "name": "/usr/include/c++/13/bits/ios_base.h", "type": "file" }, { - "bom-ref": "98db82185a6668f7", + "bom-ref": "99dbb82e734294fb", "name": "/usr/include/c++/13/bits/istream.tcc", "type": "file" }, { - "bom-ref": "1ec8c7e9e9db0e2b", + "bom-ref": "9e98525e743e4903", "name": "/usr/include/c++/13/bits/iterator_concepts.h", "type": "file" }, { - "bom-ref": "92415bf027e88d7e", + "bom-ref": "1bf804dd97141c86", "name": "/usr/include/c++/13/bits/list.tcc", "type": "file" }, { - "bom-ref": "36254909d5d7b801", + "bom-ref": "e63377a4a2ee63cd", "name": "/usr/include/c++/13/bits/locale_classes.h", "type": "file" }, { - "bom-ref": "cf1bb995c6ba4b70", + "bom-ref": "2cf66e5eb7ba1928", "name": "/usr/include/c++/13/bits/locale_classes.tcc", "type": "file" }, { - "bom-ref": "d896e5d2e5d165b7", + "bom-ref": "553988a24ec67edf", "name": "/usr/include/c++/13/bits/locale_conv.h", "type": "file" }, { - "bom-ref": "70082ba1fca51896", + "bom-ref": "e7ae71399ec64f16", "name": "/usr/include/c++/13/bits/locale_facets.h", "type": "file" }, { - "bom-ref": "28d13779740923b3", + "bom-ref": "5a0b42d89048fb5b", "name": "/usr/include/c++/13/bits/locale_facets.tcc", "type": "file" }, { - "bom-ref": "9644ec7818385fdf", + "bom-ref": "2676d4164c946a9f", "name": "/usr/include/c++/13/bits/locale_facets_nonio.h", "type": "file" }, { - "bom-ref": "48f6687141feacd7", + "bom-ref": "d9c3eb66c766f9d3", "name": "/usr/include/c++/13/bits/locale_facets_nonio.tcc", "type": "file" }, { - "bom-ref": "493edaa609fc736b", + "bom-ref": "beec23ce92f6fa4f", "name": "/usr/include/c++/13/bits/localefwd.h", "type": "file" }, { - "bom-ref": "2b264dc1ee9eb388", + "bom-ref": "9529751dd358dd00", "name": "/usr/include/c++/13/bits/mask_array.h", "type": "file" }, { - "bom-ref": "0684fb4cd680a71d", + "bom-ref": "44233ad10bb1c845", "name": "/usr/include/c++/13/bits/max_size_type.h", "type": "file" }, { - "bom-ref": "5688d311ed70fe51", + "bom-ref": "0f21d8f97bd09325", "name": "/usr/include/c++/13/bits/memory_resource.h", "type": "file" }, { - "bom-ref": "9370323a6b4256c0", + "bom-ref": "6e9d1f5cb5d147b4", "name": "/usr/include/c++/13/bits/memoryfwd.h", "type": "file" }, { - "bom-ref": "f2be6890bb097370", + "bom-ref": "7e864ad802ec1150", "name": "/usr/include/c++/13/bits/mofunc_impl.h", "type": "file" }, { - "bom-ref": "e6390bcbfe6710c0", + "bom-ref": "a157bb5080266480", "name": "/usr/include/c++/13/bits/move.h", "type": "file" }, { - "bom-ref": "9c1150e35488c97c", + "bom-ref": "189f5a48eaa4a210", "name": "/usr/include/c++/13/bits/move_only_function.h", "type": "file" }, { - "bom-ref": "b81f4f6b270b00a3", + "bom-ref": "b098dc77b33f610f", "name": "/usr/include/c++/13/bits/nested_exception.h", "type": "file" }, { - "bom-ref": "194e766d99fe470b", + "bom-ref": "4463f23da769e6ff", "name": "/usr/include/c++/13/bits/new_allocator.h", "type": "file" }, { - "bom-ref": "dd3db266cd884dad", + "bom-ref": "00e012720c894f65", "name": "/usr/include/c++/13/bits/node_handle.h", "type": "file" }, { - "bom-ref": "b3ece1cd591f431b", + "bom-ref": "a71317ae422b8037", "name": "/usr/include/c++/13/bits/ostream.tcc", "type": "file" }, { - "bom-ref": "4708492db5fe63cc", + "bom-ref": "924c3c070d7c1224", "name": "/usr/include/c++/13/bits/ostream_insert.h", "type": "file" }, { - "bom-ref": "38f94cf5688ed6dc", + "bom-ref": "327a0af03ed2c5fc", "name": "/usr/include/c++/13/bits/parse_numbers.h", "type": "file" }, { - "bom-ref": "f58daa5e50976404", + "bom-ref": "b35c276f8fc27e8c", "name": "/usr/include/c++/13/bits/postypes.h", "type": "file" }, { - "bom-ref": "f9c2a5c32287c623", + "bom-ref": "b2e01e1f2f129cbf", "name": "/usr/include/c++/13/bits/predefined_ops.h", "type": "file" }, { - "bom-ref": "b07780381c1eb6fc", + "bom-ref": "0a14b3e15b7fbfa4", "name": "/usr/include/c++/13/bits/ptr_traits.h", "type": "file" }, { - "bom-ref": "b8ed68afef359e70", + "bom-ref": "2c3f829193e7afa8", "name": "/usr/include/c++/13/bits/quoted_string.h", "type": "file" }, { - "bom-ref": "0c07013afbced322", + "bom-ref": "a2eaad1a1c5dea22", "name": "/usr/include/c++/13/bits/random.h", "type": "file" }, { - "bom-ref": "b1f0e247b4d3cf8d", + "bom-ref": "26789bff563447a5", "name": "/usr/include/c++/13/bits/random.tcc", "type": "file" }, { - "bom-ref": "1862a4894276a60f", + "bom-ref": "47fde32ab873da4b", "name": "/usr/include/c++/13/bits/range_access.h", "type": "file" }, { - "bom-ref": "77aa7c277f3c0972", + "bom-ref": "3b00b292ee242dc6", "name": "/usr/include/c++/13/bits/ranges_algo.h", "type": "file" }, { - "bom-ref": "7617108f99d15f18", + "bom-ref": "8ad5e07d53c89054", "name": "/usr/include/c++/13/bits/ranges_algobase.h", "type": "file" }, { - "bom-ref": "14b30f3bfbe23a5a", + "bom-ref": "0f879ee692e02146", "name": "/usr/include/c++/13/bits/ranges_base.h", "type": "file" }, { - "bom-ref": "0ac89e5d9e9f4287", + "bom-ref": "dd0135326423e85f", "name": "/usr/include/c++/13/bits/ranges_cmp.h", "type": "file" }, { - "bom-ref": "97285540917dcf17", + "bom-ref": "3b9e2059f67e071b", "name": "/usr/include/c++/13/bits/ranges_uninitialized.h", "type": "file" }, { - "bom-ref": "d3190d45c27c1e5b", + "bom-ref": "d6386465f69a6f2b", "name": "/usr/include/c++/13/bits/ranges_util.h", "type": "file" }, { - "bom-ref": "0797176012eb135f", + "bom-ref": "19e715f201529b5f", "name": "/usr/include/c++/13/bits/refwrap.h", "type": "file" }, { - "bom-ref": "2d55cb61a140c81f", + "bom-ref": "b4df17a518fe57a3", "name": "/usr/include/c++/13/bits/regex.h", "type": "file" }, { - "bom-ref": "f42074050c819bc2", + "bom-ref": "f422e2f20a44b1b6", "name": "/usr/include/c++/13/bits/regex.tcc", "type": "file" }, { - "bom-ref": "675ad02970330a66", + "bom-ref": "8860d379d97dfcfa", "name": "/usr/include/c++/13/bits/regex_automaton.h", "type": "file" }, { - "bom-ref": "8f99c1a4f3a232c4", + "bom-ref": "8bfd19a75cb06e80", "name": "/usr/include/c++/13/bits/regex_automaton.tcc", "type": "file" }, { - "bom-ref": "bfb13d31a0cc22d3", + "bom-ref": "a970efb1fbf3d6ff", "name": "/usr/include/c++/13/bits/regex_compiler.h", "type": "file" }, { - "bom-ref": "55fc808cdc4ccef7", + "bom-ref": "8e1a830dbbe122b3", "name": "/usr/include/c++/13/bits/regex_compiler.tcc", "type": "file" }, { - "bom-ref": "1ec8b516e325a775", + "bom-ref": "74a7372d46cfdbd1", "name": "/usr/include/c++/13/bits/regex_constants.h", "type": "file" }, { - "bom-ref": "9848ef85c49897d3", + "bom-ref": "440c2b727cb1c963", "name": "/usr/include/c++/13/bits/regex_error.h", "type": "file" }, { - "bom-ref": "9fcc506c62a94bad", + "bom-ref": "98409e939a941461", "name": "/usr/include/c++/13/bits/regex_executor.h", "type": "file" }, { - "bom-ref": "58a0e4da211f4a78", + "bom-ref": "05b37067d0164464", "name": "/usr/include/c++/13/bits/regex_executor.tcc", "type": "file" }, { - "bom-ref": "8a4e1c1e49427c2e", + "bom-ref": "02dbc923245f73fe", "name": "/usr/include/c++/13/bits/regex_scanner.h", "type": "file" }, { - "bom-ref": "7e7fc0a53ca7ea49", + "bom-ref": "8326287333526b75", "name": "/usr/include/c++/13/bits/regex_scanner.tcc", "type": "file" }, { - "bom-ref": "ba5687e7a13927e2", + "bom-ref": "b84361f99a699c62", "name": "/usr/include/c++/13/bits/requires_hosted.h", "type": "file" }, { - "bom-ref": "c4c0286b89efc5de", + "bom-ref": "fce692b8d2784a7a", "name": "/usr/include/c++/13/bits/semaphore_base.h", "type": "file" }, { - "bom-ref": "ab21240b7d81813c", + "bom-ref": "1f8cf03f40025784", "name": "/usr/include/c++/13/bits/shared_ptr.h", "type": "file" }, { - "bom-ref": "488015f3a419a483", + "bom-ref": "095de6961ef30947", "name": "/usr/include/c++/13/bits/shared_ptr_atomic.h", "type": "file" }, { - "bom-ref": "90c8ca4d203d9e8d", + "bom-ref": "9d18b806b4556fd5", "name": "/usr/include/c++/13/bits/shared_ptr_base.h", "type": "file" }, { - "bom-ref": "a5c301f38b9de4fc", + "bom-ref": "d2f446753123472c", "name": "/usr/include/c++/13/bits/slice_array.h", "type": "file" }, { - "bom-ref": "87cfbca6fc207320", + "bom-ref": "2e9736cfcd31f374", "name": "/usr/include/c++/13/bits/specfun.h", "type": "file" }, { - "bom-ref": "cf87210ccb86e444", + "bom-ref": "e4b5dfbc6b3d6004", "name": "/usr/include/c++/13/bits/sstream.tcc", "type": "file" }, { - "bom-ref": "8da2cb997d805c18", + "bom-ref": "fb94be8fee72244c", "name": "/usr/include/c++/13/bits/std_abs.h", "type": "file" }, { - "bom-ref": "7f7aa2ee193883c1", + "bom-ref": "d2c73cc9eec9b30d", "name": "/usr/include/c++/13/bits/std_function.h", "type": "file" }, { - "bom-ref": "adc0c28d3c21ac9d", + "bom-ref": "f21374e7f0a0af01", "name": "/usr/include/c++/13/bits/std_mutex.h", "type": "file" }, { - "bom-ref": "315c34f637e80848", + "bom-ref": "60f34bed50609c70", "name": "/usr/include/c++/13/bits/std_thread.h", "type": "file" }, { - "bom-ref": "d03cbf8332b10273", + "bom-ref": "4c3aa39e58766637", "name": "/usr/include/c++/13/bits/stl_algo.h", "type": "file" }, { - "bom-ref": "79af1557d628d0a0", + "bom-ref": "c1acd54b23f5a228", "name": "/usr/include/c++/13/bits/stl_algobase.h", "type": "file" }, { - "bom-ref": "fa9d654fe5d2aca9", + "bom-ref": "3f8169ebfe110691", "name": "/usr/include/c++/13/bits/stl_bvector.h", "type": "file" }, { - "bom-ref": "dca102848213d688", + "bom-ref": "88844fa7509fdccc", "name": "/usr/include/c++/13/bits/stl_construct.h", "type": "file" }, { - "bom-ref": "e35274b72e6943e4", + "bom-ref": "58f87a8d1e8fdc98", "name": "/usr/include/c++/13/bits/stl_deque.h", "type": "file" }, { - "bom-ref": "95c57d7fed13f92b", + "bom-ref": "13aeb6b74a430f4b", "name": "/usr/include/c++/13/bits/stl_function.h", "type": "file" }, { - "bom-ref": "e2c8ce3b662f380d", + "bom-ref": "7a577cf4da021935", "name": "/usr/include/c++/13/bits/stl_heap.h", "type": "file" }, { - "bom-ref": "611ad443011b8f52", + "bom-ref": "30f0f023d8eb8e42", "name": "/usr/include/c++/13/bits/stl_iterator.h", "type": "file" }, { - "bom-ref": "368f0208ca5fde8e", + "bom-ref": "151d836f7a2f192a", "name": "/usr/include/c++/13/bits/stl_iterator_base_funcs.h", "type": "file" }, { - "bom-ref": "2b939e2d9ebea392", + "bom-ref": "18b5d49ba7bf5316", "name": "/usr/include/c++/13/bits/stl_iterator_base_types.h", "type": "file" }, { - "bom-ref": "b5f9193a9b6b3ede", + "bom-ref": "59c03f6eb5d55332", "name": "/usr/include/c++/13/bits/stl_list.h", "type": "file" }, { - "bom-ref": "4cffa3925a30c451", + "bom-ref": "b0927ca5edfc5269", "name": "/usr/include/c++/13/bits/stl_map.h", "type": "file" }, { - "bom-ref": "e63302ddcfb691f2", + "bom-ref": "8732ed0b2b534dae", "name": "/usr/include/c++/13/bits/stl_multimap.h", "type": "file" }, { - "bom-ref": "f4ae100fa1f75087", + "bom-ref": "dbdccdd728bb4f57", "name": "/usr/include/c++/13/bits/stl_multiset.h", "type": "file" }, { - "bom-ref": "3d44332cb51d5653", + "bom-ref": "b218b68775c0ec3b", "name": "/usr/include/c++/13/bits/stl_numeric.h", "type": "file" }, { - "bom-ref": "170c8bfeca29eeef", + "bom-ref": "359e3f92c9c6757b", "name": "/usr/include/c++/13/bits/stl_pair.h", "type": "file" }, { - "bom-ref": "aab2b0eefce91361", + "bom-ref": "b6c1e088c1bb18d5", "name": "/usr/include/c++/13/bits/stl_queue.h", "type": "file" }, { - "bom-ref": "dbca8a0e3e07be09", + "bom-ref": "4bc1a35f91bf2239", "name": "/usr/include/c++/13/bits/stl_raw_storage_iter.h", "type": "file" }, { - "bom-ref": "9defefde0c817cc0", + "bom-ref": "f293a6f7e671cd54", "name": "/usr/include/c++/13/bits/stl_relops.h", "type": "file" }, { - "bom-ref": "8be8c03791e6eb8a", + "bom-ref": "d3f645a64aba2016", "name": "/usr/include/c++/13/bits/stl_set.h", "type": "file" }, { - "bom-ref": "0ea167bfb519e8cd", + "bom-ref": "6b6970699cfacb71", "name": "/usr/include/c++/13/bits/stl_stack.h", "type": "file" }, { - "bom-ref": "7380b0051570fc2a", + "bom-ref": "a006c0d7021aca7a", "name": "/usr/include/c++/13/bits/stl_tempbuf.h", "type": "file" }, { - "bom-ref": "ee21d206e23c48c2", + "bom-ref": "aea9b701f8beee32", "name": "/usr/include/c++/13/bits/stl_tree.h", "type": "file" }, { - "bom-ref": "8a83ae3d670660d5", + "bom-ref": "1501b34c188623a1", "name": "/usr/include/c++/13/bits/stl_uninitialized.h", "type": "file" }, { - "bom-ref": "c320f4c45bfff91a", + "bom-ref": "9783826bd8c05ec6", "name": "/usr/include/c++/13/bits/stl_vector.h", "type": "file" }, { - "bom-ref": "effd21483087e673", + "bom-ref": "c95571869a2670f7", "name": "/usr/include/c++/13/bits/stream_iterator.h", "type": "file" }, { - "bom-ref": "28674494f1c280d4", + "bom-ref": "1bedbfd799504fa8", "name": "/usr/include/c++/13/bits/streambuf.tcc", "type": "file" }, { - "bom-ref": "01b5c1594ce9c780", + "bom-ref": "f4bd28901996e12c", "name": "/usr/include/c++/13/bits/streambuf_iterator.h", "type": "file" }, { - "bom-ref": "4ef0be5407206b44", + "bom-ref": "472d73090d803d1c", "name": "/usr/include/c++/13/bits/string_view.tcc", "type": "file" }, { - "bom-ref": "ad4ed657c9e6ac2c", + "bom-ref": "7418bc78a1f2289c", "name": "/usr/include/c++/13/bits/stringfwd.h", "type": "file" }, { - "bom-ref": "3f73de7812b1b7a1", + "bom-ref": "2936e833242610d5", "name": "/usr/include/c++/13/bits/this_thread_sleep.h", "type": "file" }, { - "bom-ref": "e2c0c38589ed7084", + "bom-ref": "36c995a9d0fdbce0", "name": "/usr/include/c++/13/bits/uniform_int_dist.h", "type": "file" }, { - "bom-ref": "13c98716bf088a93", + "bom-ref": "361e222eb5f5086b", "name": "/usr/include/c++/13/bits/unique_lock.h", "type": "file" }, { - "bom-ref": "a35c2e1f1bf05b23", + "bom-ref": "651f7e7ef2e0dedf", "name": "/usr/include/c++/13/bits/unique_ptr.h", "type": "file" }, { - "bom-ref": "b4fb5d8b3dc465a9", + "bom-ref": "d264676486b9dac9", "name": "/usr/include/c++/13/bits/unordered_map.h", "type": "file" }, { - "bom-ref": "7fb369fbaaec0f0c", + "bom-ref": "df9afa816caa37bc", "name": "/usr/include/c++/13/bits/unordered_set.h", "type": "file" }, { - "bom-ref": "f51a96deed36cf04", + "bom-ref": "4442222b0a6c3224", "name": "/usr/include/c++/13/bits/uses_allocator.h", "type": "file" }, { - "bom-ref": "caa199a4dc75e26c", + "bom-ref": "d00c9cf34122fdf0", "name": "/usr/include/c++/13/bits/uses_allocator_args.h", "type": "file" }, { - "bom-ref": "661b47e51f6df95c", + "bom-ref": "9b86b96bb99716e8", "name": "/usr/include/c++/13/bits/utility.h", "type": "file" }, { - "bom-ref": "26507cab90e8ce9b", + "bom-ref": "99df63c625ef7487", "name": "/usr/include/c++/13/bits/valarray_after.h", "type": "file" }, { - "bom-ref": "bac234a349ec732f", + "bom-ref": "e05a9a3ba39f8ba3", "name": "/usr/include/c++/13/bits/valarray_array.h", "type": "file" }, { - "bom-ref": "cb242b9ad182d2af", + "bom-ref": "bb91a22a0b9a1caf", "name": "/usr/include/c++/13/bits/valarray_array.tcc", "type": "file" }, { - "bom-ref": "0861bc1d7e1ee4c3", + "bom-ref": "a60fcf0e66123e33", "name": "/usr/include/c++/13/bits/valarray_before.h", "type": "file" }, { - "bom-ref": "726fc13f21c97887", + "bom-ref": "f09d3a05984ff8df", "name": "/usr/include/c++/13/bits/vector.tcc", "type": "file" }, { - "bom-ref": "af7f0bacdfd7eeae", + "bom-ref": "43a6972079bad266", "name": "/usr/include/c++/13/bitset", "type": "file" }, { - "bom-ref": "c2017f26a71bacc8", + "bom-ref": "dd6d7d70127c4110", "name": "/usr/include/c++/13/cassert", "type": "file" }, { - "bom-ref": "c8134066f120b8ce", + "bom-ref": "61592de820cc6fc2", "name": "/usr/include/c++/13/ccomplex", "type": "file" }, { - "bom-ref": "51d894101d8c8901", + "bom-ref": "6c57d7cb30c24299", "name": "/usr/include/c++/13/cctype", "type": "file" }, { - "bom-ref": "ba5ca13e5d729642", + "bom-ref": "9af13ef21b815582", "name": "/usr/include/c++/13/cerrno", "type": "file" }, { - "bom-ref": "1c5e5d2f72282589", + "bom-ref": "e6dc0135d91208a5", "name": "/usr/include/c++/13/cfenv", "type": "file" }, { - "bom-ref": "610fd10e6fcf48e1", + "bom-ref": "95256906163e4509", "name": "/usr/include/c++/13/cfloat", "type": "file" }, { - "bom-ref": "87cfe24db929c6d3", + "bom-ref": "72f1891b8c874447", "name": "/usr/include/c++/13/charconv", "type": "file" }, { - "bom-ref": "f03eafce13a4a18d", + "bom-ref": "2257f72406afad05", "name": "/usr/include/c++/13/chrono", "type": "file" }, { - "bom-ref": "c01581dbaafb6031", + "bom-ref": "87b2bb588fcfebcd", "name": "/usr/include/c++/13/cinttypes", "type": "file" }, { - "bom-ref": "ec4d7a115a99c646", + "bom-ref": "cc48d92541be05e6", "name": "/usr/include/c++/13/ciso646", "type": "file" }, { - "bom-ref": "9700165983b5a5eb", + "bom-ref": "418822c390f60867", "name": "/usr/include/c++/13/climits", "type": "file" }, { - "bom-ref": "bb5091e27b5863a1", + "bom-ref": "03ad402f1d7ebc41", "name": "/usr/include/c++/13/clocale", "type": "file" }, { - "bom-ref": "b0fd7fbcb7acb360", + "bom-ref": "b1d9a1eb3b80315c", "name": "/usr/include/c++/13/cmath", "type": "file" }, { - "bom-ref": "4325b37d35ca27b5", + "bom-ref": "759b9cd84f323085", "name": "/usr/include/c++/13/codecvt", "type": "file" }, { - "bom-ref": "f6cc04f28cda26db", + "bom-ref": "29636b515c600b5f", "name": "/usr/include/c++/13/compare", "type": "file" }, { - "bom-ref": "f0fc0945b4fb380e", + "bom-ref": "6f40a8bbc8debba6", "name": "/usr/include/c++/13/complex", "type": "file" }, { - "bom-ref": "7becc81f1cf42b47", + "bom-ref": "c3d0330dac793f5b", "name": "/usr/include/c++/13/complex.h", "type": "file" }, { - "bom-ref": "6ba9d8343faa2265", + "bom-ref": "04c063466ee3e8e9", "name": "/usr/include/c++/13/concepts", "type": "file" }, { - "bom-ref": "b8a1bba17db3365b", + "bom-ref": "84268f995db57333", "name": "/usr/include/c++/13/condition_variable", "type": "file" }, { - "bom-ref": "117cd7cfd52b82e9", + "bom-ref": "c9c37c748a2fded9", "name": "/usr/include/c++/13/coroutine", "type": "file" }, { - "bom-ref": "aecf87443436cb1a", + "bom-ref": "6e8c91ce7480542e", "name": "/usr/include/c++/13/csetjmp", "type": "file" }, { - "bom-ref": "3a59a47b7b31bc7e", + "bom-ref": "513ff030c3a1df2e", "name": "/usr/include/c++/13/csignal", "type": "file" }, { - "bom-ref": "d9d3aafe1b690f61", + "bom-ref": "d486411780acf6c5", "name": "/usr/include/c++/13/cstdalign", "type": "file" }, { - "bom-ref": "36a40e2210da0087", + "bom-ref": "c234cdd71a1d748b", "name": "/usr/include/c++/13/cstdarg", "type": "file" }, { - "bom-ref": "d16d08056ae9e186", + "bom-ref": "4b9cb593213e18f6", "name": "/usr/include/c++/13/cstdbool", "type": "file" }, { - "bom-ref": "ded050face1e49e5", + "bom-ref": "8230ccaa5ac78e51", "name": "/usr/include/c++/13/cstddef", "type": "file" }, { - "bom-ref": "78a292b61c89280b", + "bom-ref": "44141c6e5c208b97", "name": "/usr/include/c++/13/cstdint", "type": "file" }, { - "bom-ref": "6a271bb9d6150dea", + "bom-ref": "594f800169cb3fee", "name": "/usr/include/c++/13/cstdio", "type": "file" }, { - "bom-ref": "c75723494cb43f26", + "bom-ref": "609bf6b894140c1e", "name": "/usr/include/c++/13/cstdlib", "type": "file" }, { - "bom-ref": "fd8a322601dbd2c8", + "bom-ref": "ad044945f3cafc94", "name": "/usr/include/c++/13/cstring", "type": "file" }, { - "bom-ref": "90e6de79170792b8", + "bom-ref": "baa0b2493ca88a80", "name": "/usr/include/c++/13/ctgmath", "type": "file" }, { - "bom-ref": "6d231baba64f6815", + "bom-ref": "9a133294c32803a5", "name": "/usr/include/c++/13/ctime", "type": "file" }, { - "bom-ref": "6797562ce3ec5101", + "bom-ref": "ebc9d5305b85234d", "name": "/usr/include/c++/13/cuchar", "type": "file" }, { - "bom-ref": "df8e16b328e6c9e8", + "bom-ref": "5679ec0f2f853904", "name": "/usr/include/c++/13/cwchar", "type": "file" }, { - "bom-ref": "9e8169074da56531", + "bom-ref": "41a5bceb691613bd", "name": "/usr/include/c++/13/cwctype", "type": "file" }, { - "bom-ref": "083d8598261989b7", + "bom-ref": "46e54cdd601156d7", "name": "/usr/include/c++/13/cxxabi.h", "type": "file" }, { - "bom-ref": "1c4bfff0f582e8b9", + "bom-ref": "aaa3c7c3c2089ac5", "name": "/usr/include/c++/13/debug/assertions.h", "type": "file" }, { - "bom-ref": "a6e264b69bd2d9d0", + "bom-ref": "51c073b1a5e1d928", "name": "/usr/include/c++/13/debug/bitset", "type": "file" }, { - "bom-ref": "578273b3d7143c04", + "bom-ref": "1cd3937bca7a3d4c", "name": "/usr/include/c++/13/debug/debug.h", "type": "file" }, { - "bom-ref": "5dd253cfe7c1af64", + "bom-ref": "84db3d11631a1020", "name": "/usr/include/c++/13/debug/deque", "type": "file" }, { - "bom-ref": "9cd7807b5f7fa136", + "bom-ref": "f6bcc2f7b40c935a", "name": "/usr/include/c++/13/debug/formatter.h", "type": "file" }, { - "bom-ref": "60a1e864fa1cf82c", + "bom-ref": "fa04a90544e393d8", "name": "/usr/include/c++/13/debug/forward_list", "type": "file" }, { - "bom-ref": "f154c07c0809c84b", + "bom-ref": "d06a9ad9609e5533", "name": "/usr/include/c++/13/debug/functions.h", "type": "file" }, { - "bom-ref": "3857cbfa03cb473b", + "bom-ref": "29404e353ad508bf", "name": "/usr/include/c++/13/debug/helper_functions.h", "type": "file" }, { - "bom-ref": "44919406ec3c7e03", + "bom-ref": "b75cd8f52903de33", "name": "/usr/include/c++/13/debug/list", "type": "file" }, { - "bom-ref": "1ef33f95f468945b", + "bom-ref": "81eee5720976dfeb", "name": "/usr/include/c++/13/debug/macros.h", "type": "file" }, { - "bom-ref": "eae6bab5db143b6a", + "bom-ref": "7fcdf2f2e9025a46", "name": "/usr/include/c++/13/debug/map", "type": "file" }, { - "bom-ref": "3b5941f4f96851a9", + "bom-ref": "fb212dee25f2c80d", "name": "/usr/include/c++/13/debug/map.h", "type": "file" }, { - "bom-ref": "e89118a0993b0a5e", + "bom-ref": "97b094767bbd7c4e", "name": "/usr/include/c++/13/debug/multimap.h", "type": "file" }, { - "bom-ref": "8403e20a486b5285", + "bom-ref": "c9f4d8895aa2e1a1", "name": "/usr/include/c++/13/debug/multiset.h", "type": "file" }, { - "bom-ref": "ae9f805dda482928", + "bom-ref": "8b2efd117c8a8494", "name": "/usr/include/c++/13/debug/safe_base.h", "type": "file" }, { - "bom-ref": "52a5f86ef98cbc68", + "bom-ref": "5dc098b5a4929b84", "name": "/usr/include/c++/13/debug/safe_container.h", "type": "file" }, { - "bom-ref": "1e0ed6968cb8bb8d", + "bom-ref": "a2e05b1c48be7371", "name": "/usr/include/c++/13/debug/safe_iterator.h", "type": "file" }, { - "bom-ref": "f72c34e658e884b8", + "bom-ref": "903aef647a9cda34", "name": "/usr/include/c++/13/debug/safe_iterator.tcc", "type": "file" }, { - "bom-ref": "e8fa142c77ec95d7", + "bom-ref": "945e8c2297bf7927", "name": "/usr/include/c++/13/debug/safe_local_iterator.h", "type": "file" }, { - "bom-ref": "0f8e2751417461b5", + "bom-ref": "59a3d2681f1a0aad", "name": "/usr/include/c++/13/debug/safe_local_iterator.tcc", "type": "file" }, { - "bom-ref": "fad97207b7f08ee5", + "bom-ref": "f72432c1fb54e209", "name": "/usr/include/c++/13/debug/safe_sequence.h", "type": "file" }, { - "bom-ref": "4c3bbb1a79353d9a", + "bom-ref": "62718804c3b47d56", "name": "/usr/include/c++/13/debug/safe_sequence.tcc", "type": "file" }, { - "bom-ref": "8d2b4f2150d12a7b", + "bom-ref": "1bf4dafd889e16d3", "name": "/usr/include/c++/13/debug/safe_unordered_base.h", "type": "file" }, { - "bom-ref": "8fea9a67e9a298b6", + "bom-ref": "02c8d5dc077f2b1e", "name": "/usr/include/c++/13/debug/safe_unordered_container.h", "type": "file" }, { - "bom-ref": "1212122f3394a736", + "bom-ref": "abe4ce544189ec92", "name": "/usr/include/c++/13/debug/safe_unordered_container.tcc", "type": "file" }, { - "bom-ref": "9e82df5b651b79fe", + "bom-ref": "b493c6726d70985a", "name": "/usr/include/c++/13/debug/set", "type": "file" }, { - "bom-ref": "0a3a47b386e905aa", + "bom-ref": "b10cce6b8b802dfe", "name": "/usr/include/c++/13/debug/set.h", "type": "file" }, { - "bom-ref": "64545ca2920e5dbc", + "bom-ref": "89f5d0a5108ce530", "name": "/usr/include/c++/13/debug/stl_iterator.h", "type": "file" }, { - "bom-ref": "e521d0b909097f4a", + "bom-ref": "dcc4f6b8dde37a32", "name": "/usr/include/c++/13/debug/string", "type": "file" }, { - "bom-ref": "84348cfeb20ddd9e", + "bom-ref": "8803f44d5c3add8a", "name": "/usr/include/c++/13/debug/unordered_map", "type": "file" }, { - "bom-ref": "9e630923d394a2f0", + "bom-ref": "3bdfa525c88d12e8", "name": "/usr/include/c++/13/debug/unordered_set", "type": "file" }, { - "bom-ref": "eb71382ede5a49b7", + "bom-ref": "36de9d75638a37e7", "name": "/usr/include/c++/13/debug/vector", "type": "file" }, { - "bom-ref": "13435ecc2ed29703", + "bom-ref": "5af7b8913ac634db", "name": "/usr/include/c++/13/decimal/decimal", "type": "file" }, { - "bom-ref": "a6b495265507dbd7", + "bom-ref": "123b93c041280553", "name": "/usr/include/c++/13/decimal/decimal.h", "type": "file" }, { - "bom-ref": "78f3d0b57e116a81", + "bom-ref": "9d0bafc0c22433d1", "name": "/usr/include/c++/13/deque", "type": "file" }, { - "bom-ref": "ab7342370a870ac2", + "bom-ref": "3e7186e4a014ada2", "name": "/usr/include/c++/13/exception", "type": "file" }, { - "bom-ref": "fb24f519bc487d3f", + "bom-ref": "1bd77a7346c0f2c7", "name": "/usr/include/c++/13/execution", "type": "file" }, { - "bom-ref": "ddaea7e05b73a5f9", + "bom-ref": "01d901c0f80cc5ad", "name": "/usr/include/c++/13/expected", "type": "file" }, { - "bom-ref": "ce0cf9a16a0e77db", + "bom-ref": "cc47fc031556d5d7", "name": "/usr/include/c++/13/experimental/algorithm", "type": "file" }, { - "bom-ref": "71de40aa3228a782", + "bom-ref": "662e97ca3602b5d2", "name": "/usr/include/c++/13/experimental/any", "type": "file" }, { - "bom-ref": "70ad5d5fd79d516d", + "bom-ref": "69a4ec689ef40795", "name": "/usr/include/c++/13/experimental/array", "type": "file" }, { - "bom-ref": "e3cb45884ff4836e", + "bom-ref": "da1800acee3617fa", "name": "/usr/include/c++/13/experimental/bits/fs_dir.h", "type": "file" }, { - "bom-ref": "8b887662595e6ee4", + "bom-ref": "c44c866233e90f38", "name": "/usr/include/c++/13/experimental/bits/fs_fwd.h", "type": "file" }, { - "bom-ref": "10ead17275fa81b8", + "bom-ref": "79e962e92eafb040", "name": "/usr/include/c++/13/experimental/bits/fs_ops.h", "type": "file" }, { - "bom-ref": "3ce53789e2fab451", + "bom-ref": "f14e7a9fbb4a2d55", "name": "/usr/include/c++/13/experimental/bits/fs_path.h", "type": "file" }, { - "bom-ref": "648a64b8a88ba9ed", + "bom-ref": "08ef4efcf6b9e155", "name": "/usr/include/c++/13/experimental/bits/lfts_config.h", "type": "file" }, { - "bom-ref": "db11633065f5b9fa", + "bom-ref": "c13495e1ace0c152", "name": "/usr/include/c++/13/experimental/bits/net.h", "type": "file" }, { - "bom-ref": "1ea78388f938adcd", + "bom-ref": "e4df7c820872e125", "name": "/usr/include/c++/13/experimental/bits/numeric_traits.h", "type": "file" }, { - "bom-ref": "1a68790255faf5b8", + "bom-ref": "eed609dad6bf0c00", "name": "/usr/include/c++/13/experimental/bits/shared_ptr.h", "type": "file" }, { - "bom-ref": "a4e62d99702f8180", + "bom-ref": "44b4d42b55d3d62c", "name": "/usr/include/c++/13/experimental/bits/simd.h", "type": "file" }, { - "bom-ref": "1330cd739d0d1606", + "bom-ref": "20ba06855ab75dbe", "name": "/usr/include/c++/13/experimental/bits/simd_builtin.h", "type": "file" }, { - "bom-ref": "7a3f12417139cb0f", + "bom-ref": "64f8f42571f801b3", "name": "/usr/include/c++/13/experimental/bits/simd_converter.h", "type": "file" }, { - "bom-ref": "a17c63463a562f40", + "bom-ref": "a0dcd090885bf58c", "name": "/usr/include/c++/13/experimental/bits/simd_detail.h", "type": "file" }, { - "bom-ref": "ac198ec349ccc2bf", + "bom-ref": "2fa163a3f0aa64e7", "name": "/usr/include/c++/13/experimental/bits/simd_fixed_size.h", "type": "file" }, { - "bom-ref": "25a89e795663b41c", + "bom-ref": "a4c6e81debc044e0", "name": "/usr/include/c++/13/experimental/bits/simd_math.h", "type": "file" }, { - "bom-ref": "319d2097c5c6f4ba", + "bom-ref": "d81bf75e21c2fb36", "name": "/usr/include/c++/13/experimental/bits/simd_neon.h", "type": "file" }, { - "bom-ref": "a2460e85af9c0677", + "bom-ref": "403b7bc9479b9d63", "name": "/usr/include/c++/13/experimental/bits/simd_ppc.h", "type": "file" }, { - "bom-ref": "f74ef82a8d294a9c", + "bom-ref": "41a12d66d3f7321c", "name": "/usr/include/c++/13/experimental/bits/simd_scalar.h", "type": "file" }, { - "bom-ref": "38ca99eab73fc37e", + "bom-ref": "ab1b032bdd589ade", "name": "/usr/include/c++/13/experimental/bits/simd_x86.h", "type": "file" }, { - "bom-ref": "60170a1c07d751b7", + "bom-ref": "37892567fb2170bf", "name": "/usr/include/c++/13/experimental/bits/simd_x86_conversions.h", "type": "file" }, { - "bom-ref": "fa6543f3ccffa035", + "bom-ref": "b14430440bdf4281", "name": "/usr/include/c++/13/experimental/bits/string_view.tcc", "type": "file" }, { - "bom-ref": "c5dfe275c7c2d0ad", + "bom-ref": "d80d9f8fadca34d1", "name": "/usr/include/c++/13/experimental/buffer", "type": "file" }, { - "bom-ref": "d0c2691f59f8fe4e", + "bom-ref": "87ba59c41d138f3e", "name": "/usr/include/c++/13/experimental/chrono", "type": "file" }, { - "bom-ref": "da3e373b03ef7197", + "bom-ref": "dcd3f0b3dacb557b", "name": "/usr/include/c++/13/experimental/contract", "type": "file" }, { - "bom-ref": "fd5a9c1f4a752a18", + "bom-ref": "ef23ce509fdadad0", "name": "/usr/include/c++/13/experimental/deque", "type": "file" }, { - "bom-ref": "e79ba1615c6cb21a", + "bom-ref": "fd48c9d3a7f3b00e", "name": "/usr/include/c++/13/experimental/executor", "type": "file" }, { - "bom-ref": "29552c6f8a2b4c47", + "bom-ref": "7c0cd878cae301c7", "name": "/usr/include/c++/13/experimental/filesystem", "type": "file" }, { - "bom-ref": "2f1aaf3afcee3eaf", + "bom-ref": "dc0b2dcab7f64c67", "name": "/usr/include/c++/13/experimental/forward_list", "type": "file" }, { - "bom-ref": "2c81965ad34c1d7e", + "bom-ref": "0cbc99b9dc1fcd12", "name": "/usr/include/c++/13/experimental/functional", "type": "file" }, { - "bom-ref": "7b05b41943b440cf", + "bom-ref": "7d71827df2a52323", "name": "/usr/include/c++/13/experimental/internet", "type": "file" }, { - "bom-ref": "926b8b60bc388022", + "bom-ref": "39f1c156d60c080a", "name": "/usr/include/c++/13/experimental/io_context", "type": "file" }, { - "bom-ref": "63a1d08c8c9f9614", + "bom-ref": "f4c740974e12a4e4", "name": "/usr/include/c++/13/experimental/iterator", "type": "file" }, { - "bom-ref": "5eea1e83a1aebbaf", + "bom-ref": "07ec339d7f30fecb", "name": "/usr/include/c++/13/experimental/list", "type": "file" }, { - "bom-ref": "d0e8f461a61979d9", + "bom-ref": "9670cda77a20d461", "name": "/usr/include/c++/13/experimental/map", "type": "file" }, { - "bom-ref": "2c5f7aaa6954b475", + "bom-ref": "37c44111baabd92d", "name": "/usr/include/c++/13/experimental/memory", "type": "file" }, { - "bom-ref": "f1587cb1e8e168b2", + "bom-ref": "c289c143ff83cc06", "name": "/usr/include/c++/13/experimental/memory_resource", "type": "file" }, { - "bom-ref": "27a96d3bf207993b", + "bom-ref": "492b46fd17bd7e37", "name": "/usr/include/c++/13/experimental/net", "type": "file" }, { - "bom-ref": "aee709de962e59fa", + "bom-ref": "ba2c4d68ca7bc456", "name": "/usr/include/c++/13/experimental/netfwd", "type": "file" }, { - "bom-ref": "db272a6cf9eb38af", + "bom-ref": "83c27428bf5f0f67", "name": "/usr/include/c++/13/experimental/numeric", "type": "file" }, { - "bom-ref": "2357e73edca211d1", + "bom-ref": "0f841a3970fb8ba1", "name": "/usr/include/c++/13/experimental/optional", "type": "file" }, { - "bom-ref": "87cea54575e2dd96", + "bom-ref": "bb65e0670967fb8e", "name": "/usr/include/c++/13/experimental/propagate_const", "type": "file" }, { - "bom-ref": "8fdcb13925d6d79f", + "bom-ref": "15208c6e39482fc3", "name": "/usr/include/c++/13/experimental/random", "type": "file" }, { - "bom-ref": "12d3aa9b06dddecb", + "bom-ref": "53707b162f93f597", "name": "/usr/include/c++/13/experimental/ratio", "type": "file" }, { - "bom-ref": "1aa6880f3d0142f5", + "bom-ref": "835bf18ea9779219", "name": "/usr/include/c++/13/experimental/regex", "type": "file" }, { - "bom-ref": "ed28e940194934f8", + "bom-ref": "00b631521d05ba84", "name": "/usr/include/c++/13/experimental/scope", "type": "file" }, { - "bom-ref": "f4600214c74803a1", + "bom-ref": "006a317b2d0b607d", "name": "/usr/include/c++/13/experimental/set", "type": "file" }, { - "bom-ref": "3bcf9b4bcb00deb7", + "bom-ref": "324c2c892f0195ef", "name": "/usr/include/c++/13/experimental/simd", "type": "file" }, { - "bom-ref": "5ac161fa9b635de9", + "bom-ref": "d5938d3015f9d789", "name": "/usr/include/c++/13/experimental/socket", "type": "file" }, { - "bom-ref": "6c1ca95a3529e4fc", + "bom-ref": "57d37ba207d0b5c0", "name": "/usr/include/c++/13/experimental/source_location", "type": "file" }, { - "bom-ref": "1241e41b791e1eed", + "bom-ref": "0b6786c71fb10975", "name": "/usr/include/c++/13/experimental/string", "type": "file" }, { - "bom-ref": "f9c0a0ba325a9ac1", + "bom-ref": "ce7f3fd5f13df3d1", "name": "/usr/include/c++/13/experimental/string_view", "type": "file" }, { - "bom-ref": "8b970792f8cc35f4", + "bom-ref": "cd5a9e45bbcf2470", "name": "/usr/include/c++/13/experimental/synchronized_value", "type": "file" }, { - "bom-ref": "028dbd914a96b984", + "bom-ref": "10876751a27f4d6c", "name": "/usr/include/c++/13/experimental/system_error", "type": "file" }, { - "bom-ref": "90593c2804b0a5b7", + "bom-ref": "99b538ff84ba3b7b", "name": "/usr/include/c++/13/experimental/timer", "type": "file" }, { - "bom-ref": "5561ea4d693b98c7", + "bom-ref": "49ce17b2e026510b", "name": "/usr/include/c++/13/experimental/tuple", "type": "file" }, { - "bom-ref": "621b97dd671fc230", + "bom-ref": "ffd31551bb505224", "name": "/usr/include/c++/13/experimental/type_traits", "type": "file" }, { - "bom-ref": "c1335bacd58d2d25", + "bom-ref": "026d42803adb2505", "name": "/usr/include/c++/13/experimental/unordered_map", "type": "file" }, { - "bom-ref": "546aeeae8ce86f69", + "bom-ref": "f2794e3a79020945", "name": "/usr/include/c++/13/experimental/unordered_set", "type": "file" }, { - "bom-ref": "f58e0278d87b312a", + "bom-ref": "f1bb2a72ffda6b12", "name": "/usr/include/c++/13/experimental/utility", "type": "file" }, { - "bom-ref": "4f99fa3c365bf745", + "bom-ref": "36679c62284ddf9d", "name": "/usr/include/c++/13/experimental/vector", "type": "file" }, { - "bom-ref": "5845cd2aef4f8384", + "bom-ref": "eb60e78ac8099720", "name": "/usr/include/c++/13/ext/algorithm", "type": "file" }, { - "bom-ref": "46e5da4fbf8796b2", + "bom-ref": "cda474f70a72d4d6", "name": "/usr/include/c++/13/ext/aligned_buffer.h", "type": "file" }, { - "bom-ref": "1b53d7fd64e4164a", + "bom-ref": "03c491481bf83dca", "name": "/usr/include/c++/13/ext/alloc_traits.h", "type": "file" }, { - "bom-ref": "508737a255135a45", + "bom-ref": "380abf7949a7e0fd", "name": "/usr/include/c++/13/ext/atomicity.h", "type": "file" }, { - "bom-ref": "a9a2100f7961a03b", + "bom-ref": "6ea39d9c3585219b", "name": "/usr/include/c++/13/ext/bitmap_allocator.h", "type": "file" }, { - "bom-ref": "4d35c01f0b56974b", + "bom-ref": "3a2ef54ef545cbc3", "name": "/usr/include/c++/13/ext/cast.h", "type": "file" }, { - "bom-ref": "32b4385a61354b0d", + "bom-ref": "90bf201e5a35f965", "name": "/usr/include/c++/13/ext/cmath", "type": "file" }, { - "bom-ref": "1a6f0273acf13f47", + "bom-ref": "e2978df94a726acf", "name": "/usr/include/c++/13/ext/codecvt_specializations.h", "type": "file" }, { - "bom-ref": "c57edff5597394c7", + "bom-ref": "a84679ac6f529f33", "name": "/usr/include/c++/13/ext/concurrence.h", "type": "file" }, { - "bom-ref": "c12be6f2b5d9de17", + "bom-ref": "616b7e4af948931f", "name": "/usr/include/c++/13/ext/debug_allocator.h", "type": "file" }, { - "bom-ref": "25b29c81e516dd1c", + "bom-ref": "f3ab205abeef816c", "name": "/usr/include/c++/13/ext/enc_filebuf.h", "type": "file" }, { - "bom-ref": "d9d1652d4ccfc01a", + "bom-ref": "ed3fc3f09cbb877e", "name": "/usr/include/c++/13/ext/extptr_allocator.h", "type": "file" }, { - "bom-ref": "f3a6f0cc8ba6126e", + "bom-ref": "c564b6f5d16ad7ea", "name": "/usr/include/c++/13/ext/functional", "type": "file" }, { - "bom-ref": "196b9d57dfe2c394", + "bom-ref": "15647a2061f3a4d0", "name": "/usr/include/c++/13/ext/hash_map", "type": "file" }, { - "bom-ref": "dfac08bbdfc78b05", + "bom-ref": "fcedc8d332ba4579", "name": "/usr/include/c++/13/ext/hash_set", "type": "file" }, { - "bom-ref": "fbc3ae32aa9c478c", + "bom-ref": "a0ed7b7ea8893df4", "name": "/usr/include/c++/13/ext/iterator", "type": "file" }, { - "bom-ref": "af62ddfcde3867d6", + "bom-ref": "6b380124934260e6", "name": "/usr/include/c++/13/ext/malloc_allocator.h", "type": "file" }, { - "bom-ref": "ffd934f3529f067a", + "bom-ref": "a0535daf8e48a7c6", "name": "/usr/include/c++/13/ext/memory", "type": "file" }, { - "bom-ref": "63024c5b311a4182", + "bom-ref": "2eb4fa8a9f74b512", "name": "/usr/include/c++/13/ext/mt_allocator.h", "type": "file" }, { - "bom-ref": "ffdbe7d9e8b155b1", + "bom-ref": "2f4da44d855d08a1", "name": "/usr/include/c++/13/ext/new_allocator.h", "type": "file" }, { - "bom-ref": "f36a6e3af06a739e", + "bom-ref": "94c2ccef31464fc6", "name": "/usr/include/c++/13/ext/numeric", "type": "file" }, { - "bom-ref": "156322b24baf9d26", + "bom-ref": "264c74be51a091fa", "name": "/usr/include/c++/13/ext/numeric_traits.h", "type": "file" }, { - "bom-ref": "5fa7c82197e741f2", + "bom-ref": "cbc4abd9781bbfbe", "name": "/usr/include/c++/13/ext/pb_ds/assoc_container.hpp", "type": "file" }, { - "bom-ref": "73feb2d47a8a1146", + "bom-ref": "8f6763504794dcde", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/bin_search_tree_.hpp", "type": "file" }, { - "bom-ref": "bbaee112fb7ce8e7", + "bom-ref": "33cdbbb235c3ab3f", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7b0f96f4f3d48003", + "bom-ref": "1dea46eb769ed8d3", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c3300234b45567cb", + "bom-ref": "a991fde9f3b5492f", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9a175c75a51bd49e", + "bom-ref": "fc9c97dcdca34e92", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0bd47d058f369025", + "bom-ref": "b9d7d9dc90fa5ff9", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f1009ebad60ad9ed", + "bom-ref": "7f0be3ed3ef92d61", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8cbc5ac87ade4449", + "bom-ref": "01b49c6b6111f9d9", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "82837e9f7a9dd816", + "bom-ref": "2cfc915ee97b693a", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/node_iterators.hpp", "type": "file" }, { - "bom-ref": "44175f4f5f4e593b", + "bom-ref": "daafcb07a701ca0b", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/point_iterators.hpp", "type": "file" }, { - "bom-ref": "9f2fa140304ee5b4", + "bom-ref": "3d6d2552766089c0", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2b645c0ee3b01535", + "bom-ref": "83c732854c9696a1", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/r_erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1de98f3ea20e4702", + "bom-ref": "94af4bf21fcf57b2", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/rotate_fn_imps.hpp", "type": "file" }, { - "bom-ref": "66feb3d070677b56", + "bom-ref": "7d6e1def696da09e", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4d244795dc5a0329", + "bom-ref": "3bfe1601ecd3dccd", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/traits.hpp", "type": "file" }, { - "bom-ref": "cbab24292472c416", + "bom-ref": "6e4140a9a778922e", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/binary_heap_.hpp", "type": "file" }, { - "bom-ref": "906bbe4e6da329d2", + "bom-ref": "2798f6a9ea949ec6", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/const_iterator.hpp", "type": "file" }, { - "bom-ref": "4023e7e08314706b", + "bom-ref": "f5f2def78df102ab", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6066971fe62dc89e", + "bom-ref": "fa9c7bd2fd88b0a6", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f573e9b4033f0667", + "bom-ref": "74f2180c5fed589b", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/entry_cmp.hpp", "type": "file" }, { - "bom-ref": "709ad9812b986c21", + "bom-ref": "cfbcae0d29ea1009", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/entry_pred.hpp", "type": "file" }, { - "bom-ref": "0ad411100a3f8406", + "bom-ref": "44e1770c1fb936d6", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "710636f10aedec9e", + "bom-ref": "fb1377879a8260f6", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6b43ee3ca7096a3b", + "bom-ref": "3e94eb80b61f1163", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c3c9a80b5f06f0e2", + "bom-ref": "ca594b601e24f336", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "92f8c4aa686e9032", + "bom-ref": "273ea180db5cc90a", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "cc9945fb71d0ff35", + "bom-ref": "f685a308ed49cb49", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/point_const_iterator.hpp", "type": "file" }, { - "bom-ref": "5d96016e7ba86ffd", + "bom-ref": "0367112561a8602d", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "67bdd28487a1d2e8", + "bom-ref": "c86e3d3b663e5094", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/resize_policy.hpp", "type": "file" }, { - "bom-ref": "9e41673dd999509f", + "bom-ref": "694cfb8d3ef9d307", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0d08e27b45b6c084", + "bom-ref": "d08825422efddb50", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8efa111dffb49bec", + "bom-ref": "9e9e0befd735045c", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_/binomial_heap_.hpp", "type": "file" }, { - "bom-ref": "82e3bfb8e41ad936", + "bom-ref": "6bf95bcdf856ca52", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f72c260808382178", + "bom-ref": "631f077c86ff347c", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "12dc039a357e76d2", + "bom-ref": "ffd6f952e6cc349a", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/binomial_heap_base_.hpp", "type": "file" }, { - "bom-ref": "7943fb24de13ccba", + "bom-ref": "71830e7e0df7584e", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ae477cbd1edbedd0", + "bom-ref": "3b326eac5243ef60", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5da8037ddaf6d501", + "bom-ref": "5e34f64bb2894449", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c15fb6f8b483060d", + "bom-ref": "871d62f0edb90ea9", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2e6f03073c348c55", + "bom-ref": "d463e313fd284769", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c5b8ca5e8aff9958", + "bom-ref": "1ef7ce1412875878", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b62aa875e6c8c632", + "bom-ref": "64c5fa738ec87b5a", "name": "/usr/include/c++/13/ext/pb_ds/detail/branch_policy/branch_policy.hpp", "type": "file" }, { - "bom-ref": "04047e366dd7db6a", + "bom-ref": "c4872f75c3bda6fe", "name": "/usr/include/c++/13/ext/pb_ds/detail/branch_policy/null_node_metadata.hpp", "type": "file" }, { - "bom-ref": "a7e2efba84dbda25", + "bom-ref": "6cdc6e0d55fbf8e5", "name": "/usr/include/c++/13/ext/pb_ds/detail/branch_policy/traits.hpp", "type": "file" }, { - "bom-ref": "62cb5bd842b52467", + "bom-ref": "880b4a243984f2b7", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp", "type": "file" }, { - "bom-ref": "faf0b206c1efb3ef", + "bom-ref": "e9f4fa1d66dc6967", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/cmp_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ef28509f684a172a", + "bom-ref": "1ff5fffd8aee3e2e", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/cond_key_dtor_entry_dealtor.hpp", "type": "file" }, { - "bom-ref": "9c5131c78342050d", + "bom-ref": "ac920116a932973d", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "679f1e0fa28bdb00", + "bom-ref": "730c1e425a80848c", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "245b36c83ea9808d", + "bom-ref": "936b43c72c0f5c89", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7d29f4cb8087db79", + "bom-ref": "bf359aafa2d55411", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8ec109ce0469fdcc", + "bom-ref": "36836d0025cee084", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/debug_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8fa3bce4d4f99e43", + "bom-ref": "28c1a33c71f5bd37", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/debug_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1b113da150250740", + "bom-ref": "2cfc9a6377e9958c", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/entry_list_fn_imps.hpp", "type": "file" }, { - "bom-ref": "86c9e19a8ec76ac5", + "bom-ref": "7778d0b675063399", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "3c8757cf24ca94d2", + "bom-ref": "fb9b98c4e9cd20fa", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/erase_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a8c7818f8bce334f", + "bom-ref": "a8d35c996c3a76fb", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/erase_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2f8034dd2d11cdbb", + "bom-ref": "2d8b1f15838f375f", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f50f460e96dc1dea", + "bom-ref": "7f9053c70a2bd50a", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/find_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6fadd44709a97b09", + "bom-ref": "2685dbf35f978931", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "25487ba7a03a7861", + "bom-ref": "43743a125220bc8d", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c45040981ef92a1b", + "bom-ref": "25360a601198dc87", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/insert_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6548e3103ce94b0b", + "bom-ref": "75ec3fe668ee25df", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/insert_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a6060a43ec8ed766", + "bom-ref": "30229cd4210deaca", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2ddf8a42c823cc41", + "bom-ref": "0680a536b7ce4b51", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c07ad36aff890309", + "bom-ref": "f0014fd9a4a22485", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/resize_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e9f7f46492d3c757", + "bom-ref": "92c6ba14bc3b2fff", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/resize_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "33ee50468a22a1a5", + "bom-ref": "fd6b2386a46c0999", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/resize_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0b0378270578368f", + "bom-ref": "da95f512e03c4f7b", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/size_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5e93e30fd659189f", + "bom-ref": "1a58d70e2fb8e673", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "31b65c8ad58d9f8d", + "bom-ref": "0858a0443f58ab79", "name": "/usr/include/c++/13/ext/pb_ds/detail/cond_dealtor.hpp", "type": "file" }, { - "bom-ref": "9791a3f5679ab806", + "bom-ref": "802ca49fdabf969a", "name": "/usr/include/c++/13/ext/pb_ds/detail/container_base_dispatch.hpp", "type": "file" }, { - "bom-ref": "6697bb689511a45c", + "bom-ref": "99b703e2639e1aec", "name": "/usr/include/c++/13/ext/pb_ds/detail/debug_map_base.hpp", "type": "file" }, { - "bom-ref": "9ac716b197d335c5", + "bom-ref": "a72e38d89e54aa7d", "name": "/usr/include/c++/13/ext/pb_ds/detail/eq_fn/eq_by_less.hpp", "type": "file" }, { - "bom-ref": "3d6f24a057048857", + "bom-ref": "9c038831f4f9eabb", "name": "/usr/include/c++/13/ext/pb_ds/detail/eq_fn/hash_eq_fn.hpp", "type": "file" }, { - "bom-ref": "1d0b6af752000909", + "bom-ref": "c3f9e65669a5bc3d", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7d7cf6babd70be0f", + "bom-ref": "b5df77a116f43afb", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0585a364edc275c4", + "bom-ref": "eca6a7dda6472850", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "00a4bce340613c3d", + "bom-ref": "41ef74df5f5326c5", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "613db5c352cb4014", + "bom-ref": "43ba2762bc865ba4", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/debug_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "bceece78462ebc4b", + "bom-ref": "f7f56e7a2e26353f", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/debug_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0c1745532b5d7b4c", + "bom-ref": "022aa24fa6e60a20", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "035bfec439369177", + "bom-ref": "07c5af2873964b37", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/erase_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b1187b8a6b40e624", + "bom-ref": "9aab809a400f0d70", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/erase_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "29b8e16f0e8ebfcb", + "bom-ref": "e71cf42cf489b293", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "dbe413e0f595396a", + "bom-ref": "092832e3d3904706", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/find_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5e8699141eb21e25", + "bom-ref": "cdd30038658035b5", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/find_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "39cdbb7a48e67086", + "bom-ref": "7b7ee692cf164d12", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp", "type": "file" }, { - "bom-ref": "e1621558453075a7", + "bom-ref": "3133bd3147482647", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8e9bf0dc35f7cbbb", + "bom-ref": "7018e15639515b5f", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ecde9834e5956000", + "bom-ref": "cdd32bd6bf9b2ba4", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/insert_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "43b4c17f306dc6f0", + "bom-ref": "6c22c129b9368ebc", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/insert_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7396449c22ba56ae", + "bom-ref": "0fc97960229bee4a", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/iterator_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f12f535edb7cf32e", + "bom-ref": "d9b909c63c2d434a", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6d7e950e4a7666f6", + "bom-ref": "09bb694e6d452c96", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/resize_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a2ca535e10d8ca6f", + "bom-ref": "0c09e9eb8e3f7a4b", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/resize_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0d49fe8b0d55bd34", + "bom-ref": "e23cf73f61813080", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/resize_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e6135248856748de", + "bom-ref": "e3124d6e5b29577e", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0206ca54a517d3d9", + "bom-ref": "d8c5e0b5385331a1", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/direct_mask_range_hashing_imp.hpp", "type": "file" }, { - "bom-ref": "37eab1af2460912d", + "bom-ref": "b0e9faefd9dabdf9", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/direct_mod_range_hashing_imp.hpp", "type": "file" }, { - "bom-ref": "a92758021566724a", + "bom-ref": "f3ff09399f8bd556", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/linear_probe_fn_imp.hpp", "type": "file" }, { - "bom-ref": "eeaf78b43dfdfc1c", + "bom-ref": "a5b468220e34d09c", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/mask_based_range_hashing.hpp", "type": "file" }, { - "bom-ref": "8d64af3fd88d446a", + "bom-ref": "c858092d09e89442", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/mod_based_range_hashing.hpp", "type": "file" }, { - "bom-ref": "8efe5668adedfa21", + "bom-ref": "24c7fff11629f9e5", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/probe_fn_base.hpp", "type": "file" }, { - "bom-ref": "0348af685ca98e3a", + "bom-ref": "53684c71437df0e6", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/quadratic_probe_fn_imp.hpp", "type": "file" }, { - "bom-ref": "001d162e9d272556", + "bom-ref": "c920c74da288a192", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/ranged_hash_fn.hpp", "type": "file" }, { - "bom-ref": "175a99dd103188bb", + "bom-ref": "725c702851506a47", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/ranged_probe_fn.hpp", "type": "file" }, { - "bom-ref": "e2e466c64b4d60a8", + "bom-ref": "838a56db1d3ce674", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/sample_probe_fn.hpp", "type": "file" }, { - "bom-ref": "8c2de0e900fbc310", + "bom-ref": "9860e11eaf707d2c", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/sample_range_hashing.hpp", "type": "file" }, { - "bom-ref": "e191ecba66861548", + "bom-ref": "ed29b6e546ff9f54", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/sample_ranged_hash_fn.hpp", "type": "file" }, { - "bom-ref": "d00842fe0812adb5", + "bom-ref": "312c86befdbc971d", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/sample_ranged_probe_fn.hpp", "type": "file" }, { - "bom-ref": "d337da5f8fc4369d", + "bom-ref": "bff22ee021f95461", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/const_iterator.hpp", "type": "file" }, { - "bom-ref": "6460f145337c6ba6", + "bom-ref": "057d602644c20532", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d93aba393a001b64", + "bom-ref": "6306a09e415f986c", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "511e1f40b62cbfa7", + "bom-ref": "e47cec4f7352d423", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "aa268d7c260e2c8d", + "bom-ref": "ddeeee6b3af67f61", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7bcbb2b345eb649a", + "bom-ref": "eed35dd6515019ce", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a437b4b8d7ed55d1", + "bom-ref": "15465a0048cab3a1", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c8a875ca30a18158", + "bom-ref": "70ede69c28e5ae6c", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/left_child_next_sibling_heap_.hpp", "type": "file" }, { - "bom-ref": "e1e3ff3a8a905bcf", + "bom-ref": "3c5de72de8b42277", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/node.hpp", "type": "file" }, { - "bom-ref": "4f7f7188d26a7cfb", + "bom-ref": "b9c9d498d97854c3", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/point_const_iterator.hpp", "type": "file" }, { - "bom-ref": "b31a5ea69741a3e0", + "bom-ref": "fd638e79b833e378", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e67e646985995db6", + "bom-ref": "e47827fee251ab8a", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1d1049bec517d012", + "bom-ref": "2b2df84e6ac7ad66", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/constructor_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9279ec75ff9752c7", + "bom-ref": "60e4cc30b056ab8b", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ee5f2b3d23f6c9c1", + "bom-ref": "bcaf51cfc8ff9d0d", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/entry_metadata_base.hpp", "type": "file" }, { - "bom-ref": "fd240c422970720f", + "bom-ref": "3e942deb327c98f7", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a24c1109a19007b2", + "bom-ref": "10100b9e87f5c3b6", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b45ac83e86f8afc6", + "bom-ref": "77dbb8d718979bf2", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "916c6336a46afc12", + "bom-ref": "5d2ef524f479de5a", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0aa4b7a11d7f0e84", + "bom-ref": "209a480b988b2ee8", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "225afac13c3a6036", + "bom-ref": "13ff796e5c935daa", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/lu_map_.hpp", "type": "file" }, { - "bom-ref": "1faf70c8e25eb629", + "bom-ref": "eb1929ba0c7d0e5d", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ad1c9437c9cd562d", + "bom-ref": "ad109b69947748f1", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_policy/lu_counter_metadata.hpp", "type": "file" }, { - "bom-ref": "cfc19a7192448757", + "bom-ref": "d333c6a2ec58401f", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_policy/sample_update_policy.hpp", "type": "file" }, { - "bom-ref": "b0d5456f37da973c", + "bom-ref": "f5fe22278cb374ac", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2badb46d0f96f777", + "bom-ref": "1e456fefe6025947", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "582fd726b80c1ace", + "bom-ref": "db2a35268cff47a6", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5b8f61580bd3bb37", + "bom-ref": "79ab3af0bbeefb93", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c6362e7542b684dc", + "bom-ref": "dcaf754deed46b28", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ffd875817629a4c8", + "bom-ref": "61fd28704cef5340", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "fdbf62130b0163e8", + "bom-ref": "7354c1c1f163aa94", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/node_iterators.hpp", "type": "file" }, { - "bom-ref": "050c7a0ab30226f6", + "bom-ref": "6cccd74f724d4f9e", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp", "type": "file" }, { - "bom-ref": "be84af79311c6e57", + "bom-ref": "c1fce6033202bcdb", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0bff1c9875734c7f", + "bom-ref": "f1a908ced9f0732b", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0d2a15463f4f0d56", + "bom-ref": "77d4f9f5f56c569a", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/traits.hpp", "type": "file" }, { - "bom-ref": "54f290f16ecde216", + "bom-ref": "63bd3e15cecada66", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b4628a48011b28c9", + "bom-ref": "5f56a00861000ad1", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c169c37797babe3f", + "bom-ref": "f052d15e0a73c907", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a424ef86244ea7d0", + "bom-ref": "2a973176c7b66a1c", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2a79d76e17399c71", + "bom-ref": "a66c23d38de2440d", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5d4113d93b012cde", + "bom-ref": "e803845bc57a9cb6", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/pairing_heap_.hpp", "type": "file" }, { - "bom-ref": "7d6db4cdaa965b84", + "bom-ref": "4c1d72d54783138c", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "30e5f469be226e07", + "bom-ref": "e219a9377326b22b", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f47ddbbda82947eb", + "bom-ref": "437e1a3701ee282f", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "639debc1cd798e5f", + "bom-ref": "0902475d7acc97e3", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "aa18ac99cac68c20", + "bom-ref": "445f6a7499d6c960", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5bf8f8ee6d08b5b2", + "bom-ref": "59f24e5baeb1def2", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f5c9c1d269a5d8a5", + "bom-ref": "c09cf64b2d55cbdd", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/insert_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c1da887c49950328", + "bom-ref": "17db8df4dc3579c0", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c111efb4fa7ab78a", + "bom-ref": "3b8f10ddd6d053a6", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/pat_trie_.hpp", "type": "file" }, { - "bom-ref": "508aac652bac16f9", + "bom-ref": "5704c391bbf0eecd", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/pat_trie_base.hpp", "type": "file" }, { - "bom-ref": "3725c338e9f05aec", + "bom-ref": "9f2349befc09d798", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2bf28b6ec57ce00c", + "bom-ref": "27b9735265fc4d28", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/r_erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "28c5be0ab36bd0ff", + "bom-ref": "68f91f1db51f9923", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/rotate_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e52460e9e9e00d5c", + "bom-ref": "f21f69c5c5a9c62c", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/split_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0e2fd9058b56762c", + "bom-ref": "cb0113bd55e5a880", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/synth_access_traits.hpp", "type": "file" }, { - "bom-ref": "7f14bcc70f556712", + "bom-ref": "55ba479d0da9b32a", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9f4dde35349d6caf", + "bom-ref": "8f17db00a60d04d7", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/traits.hpp", "type": "file" }, { - "bom-ref": "8deba95466bb737a", + "bom-ref": "cdc131784d913686", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/update_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1a5190a3bd0d19a1", + "bom-ref": "228b952f3b471e71", "name": "/usr/include/c++/13/ext/pb_ds/detail/priority_queue_base_dispatch.hpp", "type": "file" }, { - "bom-ref": "31de0f78ced7916f", + "bom-ref": "3b376188ba176d87", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "32bd0cdc5278142f", + "bom-ref": "e28db570c4d76543", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4721c3680aa2555e", + "bom-ref": "c69aecea85ad4c7e", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "97f7f52d339e0886", + "bom-ref": "1eb293031b50edba", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "050c04659627a681", + "bom-ref": "38381fbd8587a12d", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ca06b4cf0fa9c791", + "bom-ref": "cedd278933a383d1", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "3fa2f21a78ab8c23", + "bom-ref": "438220d2873901e3", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/node.hpp", "type": "file" }, { - "bom-ref": "e86219a0a05a0952", + "bom-ref": "2be78eea42bd2a62", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp", "type": "file" }, { - "bom-ref": "534abb4f834df9a9", + "bom-ref": "cfc4341c2585c981", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "16e7a92d8cd9bdbd", + "bom-ref": "36333e1a27f9e30d", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/traits.hpp", "type": "file" }, { - "bom-ref": "442e706320343c39", + "bom-ref": "10d0b5d35795f74d", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "77a6d0008d17f451", + "bom-ref": "7b59e7ed1a9caa9d", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "962e5d9c654e569d", + "bom-ref": "e73c19b0f2f267e5", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "200f510ec43b5a94", + "bom-ref": "716d2c8d56f39634", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "42a47142008dfe21", + "bom-ref": "e4e1406bdee8adc9", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/rc.hpp", "type": "file" }, { - "bom-ref": "22113fa572cacb03", + "bom-ref": "88264b66b306e68f", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/rc_binomial_heap_.hpp", "type": "file" }, { - "bom-ref": "fcb04c7205770d62", + "bom-ref": "671c46f538a5ce36", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c7a80cbf3a210829", + "bom-ref": "5486fd4e820960b1", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a42337d6cd5c0110", + "bom-ref": "ed92b9575e1b9ee4", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/cc_hash_max_collision_check_resize_trigger_imp.hpp", "type": "file" }, { - "bom-ref": "67fee78288666590", + "bom-ref": "d10f922749c31150", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/hash_exponential_size_policy_imp.hpp", "type": "file" }, { - "bom-ref": "aefe9be5403b4bf7", + "bom-ref": "b2aea82fb1f66f4b", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_imp.hpp", "type": "file" }, { - "bom-ref": "51f4e347522c707f", + "bom-ref": "03ad9256aade7fa3", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_size_base.hpp", "type": "file" }, { - "bom-ref": "ffc8172b7e31156b", + "bom-ref": "7292e346208a159b", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/hash_prime_size_policy_imp.hpp", "type": "file" }, { - "bom-ref": "5064718a8fb5ff39", + "bom-ref": "6a9ab973463f9c1d", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/hash_standard_resize_policy_imp.hpp", "type": "file" }, { - "bom-ref": "241810c34a3778ca", + "bom-ref": "3d82ec551bc2cef6", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/sample_resize_policy.hpp", "type": "file" }, { - "bom-ref": "88562695c17c0656", + "bom-ref": "8cdb1900a40dacd2", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/sample_resize_trigger.hpp", "type": "file" }, { - "bom-ref": "3e6a3322c3cfec70", + "bom-ref": "9feb88f37805fb94", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/sample_size_policy.hpp", "type": "file" }, { - "bom-ref": "11a4d749f2243080", + "bom-ref": "a1407a4e49282198", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f3986f2715c6ade7", + "bom-ref": "e97dda8a013b24af", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e82f203ec2a1f167", + "bom-ref": "4be7a597134ecaa7", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a0fdd42b5a5f4b74", + "bom-ref": "7b353a5f5d097524", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e867e3c07a0c8984", + "bom-ref": "2005daf47f908b9c", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6273f2595eeed1f8", + "bom-ref": "eb32d82e7cbf8bcc", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "07864bab5821d650", + "bom-ref": "660511c0a7b486c8", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/node.hpp", "type": "file" }, { - "bom-ref": "10eb1d326a1add31", + "bom-ref": "cb95372aab5ed3f1", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp", "type": "file" }, { - "bom-ref": "76a821142b320b77", + "bom-ref": "866898b2765799df", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/splay_tree_.hpp", "type": "file" }, { - "bom-ref": "2ecacdfdcd99d78f", + "bom-ref": "a3d8ff5ee2799e97", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "3081bd656efc49cc", + "bom-ref": "51691dce18bcf6bc", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/traits.hpp", "type": "file" }, { - "bom-ref": "29120f94ba8de215", + "bom-ref": "07b836db9513fcc1", "name": "/usr/include/c++/13/ext/pb_ds/detail/standard_policies.hpp", "type": "file" }, { - "bom-ref": "1c43679bd82f5d08", + "bom-ref": "c1f7f85a6718ec60", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0aa14685e2cc4d05", + "bom-ref": "17a1d636f299a5d1", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f1956cee533c8b20", + "bom-ref": "360f0f5c7522ed40", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "78bd090a11b8f5ba", + "bom-ref": "77103ed33c03c0a6", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a089648955a61830", + "bom-ref": "61f755758601c544", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f52da4cbf1e27129", + "bom-ref": "93b381e8221e0b09", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4309e3b7ccce810d", + "bom-ref": "6fa4043614c9184d", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/thin_heap_.hpp", "type": "file" }, { - "bom-ref": "d67d0971120e20b5", + "bom-ref": "a945048a786be065", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "86b86e7bc33c7cee", + "bom-ref": "1f9dc1fd2d5272e2", "name": "/usr/include/c++/13/ext/pb_ds/detail/tree_policy/node_metadata_selector.hpp", "type": "file" }, { - "bom-ref": "d4d25e55b0f90c78", + "bom-ref": "0aaa15323bc524ec", "name": "/usr/include/c++/13/ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp", "type": "file" }, { - "bom-ref": "429bbef1c3480734", + "bom-ref": "82531673ff7f3548", "name": "/usr/include/c++/13/ext/pb_ds/detail/tree_policy/sample_tree_node_update.hpp", "type": "file" }, { - "bom-ref": "aa1b2f5cb6809b7e", + "bom-ref": "6c2caa97693bce12", "name": "/usr/include/c++/13/ext/pb_ds/detail/tree_trace_base.hpp", "type": "file" }, { - "bom-ref": "b40a5273733722e8", + "bom-ref": "f26a016387310544", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/node_metadata_selector.hpp", "type": "file" }, { - "bom-ref": "b08ba7f9a4d4ca0e", + "bom-ref": "c909756c0436617e", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/order_statistics_imp.hpp", "type": "file" }, { - "bom-ref": "bd82b20cb2569796", + "bom-ref": "cedf72489a6f8afe", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/prefix_search_node_update_imp.hpp", "type": "file" }, { - "bom-ref": "efdef0eb6fe58427", + "bom-ref": "75b61e8689239507", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/sample_trie_access_traits.hpp", "type": "file" }, { - "bom-ref": "0459c6b53e31ed8f", + "bom-ref": "3d15e4f08fa2ded3", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/sample_trie_node_update.hpp", "type": "file" }, { - "bom-ref": "d5028450d1690747", + "bom-ref": "834c7a030f24cdb3", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/trie_policy_base.hpp", "type": "file" }, { - "bom-ref": "c4090641bd011440", + "bom-ref": "f69c1385894c8408", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/trie_string_access_traits_imp.hpp", "type": "file" }, { - "bom-ref": "1410596c969d59cd", + "bom-ref": "eba28a7e0ac83be1", "name": "/usr/include/c++/13/ext/pb_ds/detail/type_utils.hpp", "type": "file" }, { - "bom-ref": "4f6eebbc74a3f1dc", + "bom-ref": "718031fd18cf5740", "name": "/usr/include/c++/13/ext/pb_ds/detail/types_traits.hpp", "type": "file" }, { - "bom-ref": "a82d04e24fa34b98", + "bom-ref": "d0a7c96a00d1862c", "name": "/usr/include/c++/13/ext/pb_ds/detail/unordered_iterator/const_iterator.hpp", "type": "file" }, { - "bom-ref": "1acb7982cf35947f", + "bom-ref": "9b935c9903b5ec4b", "name": "/usr/include/c++/13/ext/pb_ds/detail/unordered_iterator/iterator.hpp", "type": "file" }, { - "bom-ref": "cf5bdc550109ee87", + "bom-ref": "ebc44be0744325b7", "name": "/usr/include/c++/13/ext/pb_ds/detail/unordered_iterator/point_const_iterator.hpp", "type": "file" }, { - "bom-ref": "8b47cd16e07c59c9", + "bom-ref": "9c2f4e88c1dd3679", "name": "/usr/include/c++/13/ext/pb_ds/detail/unordered_iterator/point_iterator.hpp", "type": "file" }, { - "bom-ref": "ec8c88df6b4f4d78", + "bom-ref": "195ad1378a80b374", "name": "/usr/include/c++/13/ext/pb_ds/exception.hpp", "type": "file" }, { - "bom-ref": "b7969399fe5c24fd", + "bom-ref": "e47c3c2fce71b3d5", "name": "/usr/include/c++/13/ext/pb_ds/hash_policy.hpp", "type": "file" }, { - "bom-ref": "8b20536fba0eea01", + "bom-ref": "0433e812acc16075", "name": "/usr/include/c++/13/ext/pb_ds/list_update_policy.hpp", "type": "file" }, { - "bom-ref": "37ae768197c826f0", + "bom-ref": "53a5c51b3ea6261c", "name": "/usr/include/c++/13/ext/pb_ds/priority_queue.hpp", "type": "file" }, { - "bom-ref": "fb7a90af40a2c479", + "bom-ref": "f65fced23fe5c55d", "name": "/usr/include/c++/13/ext/pb_ds/tag_and_trait.hpp", "type": "file" }, { - "bom-ref": "b39980a0f5d23a98", + "bom-ref": "d4ebd615aeeb6674", "name": "/usr/include/c++/13/ext/pb_ds/tree_policy.hpp", "type": "file" }, { - "bom-ref": "34d9fcfb9d881bdf", + "bom-ref": "ea5ac2b869ba33fb", "name": "/usr/include/c++/13/ext/pb_ds/trie_policy.hpp", "type": "file" }, { - "bom-ref": "45edf44b76c6a1ed", + "bom-ref": "fa16d4bec53c84d1", "name": "/usr/include/c++/13/ext/pod_char_traits.h", "type": "file" }, { - "bom-ref": "3c672bb56b85ee7f", + "bom-ref": "9b7981d99e52b2f7", "name": "/usr/include/c++/13/ext/pointer.h", "type": "file" }, { - "bom-ref": "a101ddf2eb6a47f2", + "bom-ref": "4311f8b72379d7ea", "name": "/usr/include/c++/13/ext/pool_allocator.h", "type": "file" }, { - "bom-ref": "d3f043bf6c9fc987", + "bom-ref": "d62dc8dcfdbb671b", "name": "/usr/include/c++/13/ext/random", "type": "file" }, { - "bom-ref": "31b6ba5a99734221", + "bom-ref": "e3ee6b9722307005", "name": "/usr/include/c++/13/ext/random.tcc", "type": "file" }, { - "bom-ref": "273fa2019b482212", + "bom-ref": "59895a7d3230ddb6", "name": "/usr/include/c++/13/ext/rb_tree", "type": "file" }, { - "bom-ref": "8bea683414a281cb", + "bom-ref": "1a7e187c79857a1f", "name": "/usr/include/c++/13/ext/rc_string_base.h", "type": "file" }, { - "bom-ref": "298b5cb51f738954", + "bom-ref": "f8e42edb847bde74", "name": "/usr/include/c++/13/ext/rope", "type": "file" }, { - "bom-ref": "34d972a1c9e168f6", + "bom-ref": "776e4f16c4a2faaa", "name": "/usr/include/c++/13/ext/ropeimpl.h", "type": "file" }, { - "bom-ref": "605358aea9b7ab74", + "bom-ref": "0bbedc3884d15610", "name": "/usr/include/c++/13/ext/slist", "type": "file" }, { - "bom-ref": "e02c69bd675ff8c4", + "bom-ref": "14f3ecb4d756fbb8", "name": "/usr/include/c++/13/ext/sso_string_base.h", "type": "file" }, { - "bom-ref": "6cead858aa202258", + "bom-ref": "a04e87a55b49e118", "name": "/usr/include/c++/13/ext/stdio_filebuf.h", "type": "file" }, { - "bom-ref": "e20e1595e91e0da1", + "bom-ref": "6d7189f7095f878d", "name": "/usr/include/c++/13/ext/stdio_sync_filebuf.h", "type": "file" }, { - "bom-ref": "7582ee9dd15fed93", + "bom-ref": "42cf7b97f7ed6eb7", "name": "/usr/include/c++/13/ext/string_conversions.h", "type": "file" }, { - "bom-ref": "c83a873fad39c599", + "bom-ref": "1e7ac7bb4d598b5d", "name": "/usr/include/c++/13/ext/throw_allocator.h", "type": "file" }, { - "bom-ref": "fee2b411c225e90e", + "bom-ref": "3f20d7a6f5611c0a", "name": "/usr/include/c++/13/ext/type_traits.h", "type": "file" }, { - "bom-ref": "ef1a664a6e3bee69", + "bom-ref": "c399a5af9e3d36bd", "name": "/usr/include/c++/13/ext/typelist.h", "type": "file" }, { - "bom-ref": "289f539e7be950fa", + "bom-ref": "c7be48b2ddf38af2", "name": "/usr/include/c++/13/ext/vstring.h", "type": "file" }, { - "bom-ref": "a29dcb5a6992f412", + "bom-ref": "44a66cec3b7733a2", "name": "/usr/include/c++/13/ext/vstring.tcc", "type": "file" }, { - "bom-ref": "8fd66c442aa845f1", + "bom-ref": "ab13c053545af2c5", "name": "/usr/include/c++/13/ext/vstring_fwd.h", "type": "file" }, { - "bom-ref": "b522d951fea607e7", + "bom-ref": "53644eab82280467", "name": "/usr/include/c++/13/ext/vstring_util.h", "type": "file" }, { - "bom-ref": "b549921077587fe8", + "bom-ref": "2a6c7df3d1efb904", "name": "/usr/include/c++/13/fenv.h", "type": "file" }, { - "bom-ref": "8feabd93e2d03cf1", + "bom-ref": "d30c38976cb7b85d", "name": "/usr/include/c++/13/filesystem", "type": "file" }, { - "bom-ref": "1bc87bee0f1bb119", + "bom-ref": "e5aca63fc70c4f19", "name": "/usr/include/c++/13/format", "type": "file" }, { - "bom-ref": "ee6ceeef8be5446f", + "bom-ref": "f4980206fa052fb3", "name": "/usr/include/c++/13/forward_list", "type": "file" }, { - "bom-ref": "68094e52e5974757", + "bom-ref": "42414d01e3fbf997", "name": "/usr/include/c++/13/fstream", "type": "file" }, { - "bom-ref": "fb2fb92579181245", + "bom-ref": "bee0acead414791d", "name": "/usr/include/c++/13/functional", "type": "file" }, { - "bom-ref": "8382c01be1767b09", + "bom-ref": "0e882c17809f4ab1", "name": "/usr/include/c++/13/future", "type": "file" }, { - "bom-ref": "92f8aa7a6577207c", + "bom-ref": "361e91cd49120a20", "name": "/usr/include/c++/13/initializer_list", "type": "file" }, { - "bom-ref": "350972fc25b5a083", + "bom-ref": "0bab5e6c7d746daf", "name": "/usr/include/c++/13/iomanip", "type": "file" }, { - "bom-ref": "f84459e61a569f0e", + "bom-ref": "3ce0687584666d76", "name": "/usr/include/c++/13/ios", "type": "file" }, { - "bom-ref": "dfb1b9c222f8204b", + "bom-ref": "0d3d73c9c6bd1e2b", "name": "/usr/include/c++/13/iosfwd", "type": "file" }, { - "bom-ref": "9025e41907be053d", + "bom-ref": "364f71c226d86981", "name": "/usr/include/c++/13/iostream", "type": "file" }, { - "bom-ref": "cd86e843557dff38", + "bom-ref": "62e0c4abd0d97dcc", "name": "/usr/include/c++/13/istream", "type": "file" }, { - "bom-ref": "5ed9d2ad1a06946f", + "bom-ref": "96018efb4e931ff3", "name": "/usr/include/c++/13/iterator", "type": "file" }, { - "bom-ref": "2e2d64e564956f7d", + "bom-ref": "9884c81996145a4d", "name": "/usr/include/c++/13/latch", "type": "file" }, { - "bom-ref": "c00a95dfae6d640d", + "bom-ref": "417d31a65ee9e801", "name": "/usr/include/c++/13/limits", "type": "file" }, { - "bom-ref": "ca476fdb3bc9eacc", + "bom-ref": "7c68569b0ae8e3c0", "name": "/usr/include/c++/13/list", "type": "file" }, { - "bom-ref": "b5d2ecc36456e04a", + "bom-ref": "6d7b25ae0965aa62", "name": "/usr/include/c++/13/locale", "type": "file" }, { - "bom-ref": "0561ffee9f04780f", + "bom-ref": "4ca1d0579b96d31b", "name": "/usr/include/c++/13/map", "type": "file" }, { - "bom-ref": "1bafda9f70170f0c", + "bom-ref": "36de1c77691f1df4", "name": "/usr/include/c++/13/math.h", "type": "file" }, { - "bom-ref": "5cd61e14171ebf36", + "bom-ref": "786f845aa7eba826", "name": "/usr/include/c++/13/memory", "type": "file" }, { - "bom-ref": "02308e9258cc206c", + "bom-ref": "728ea2cc566a4c28", "name": "/usr/include/c++/13/memory_resource", "type": "file" }, { - "bom-ref": "6926bcbbadd1f956", + "bom-ref": "dd385fb8ef307e26", "name": "/usr/include/c++/13/mutex", "type": "file" }, { - "bom-ref": "e909aaa10cd15cc3", + "bom-ref": "5b977a38ccbc9adb", "name": "/usr/include/c++/13/new", "type": "file" }, { - "bom-ref": "ec62573b994070be", + "bom-ref": "6ed023a6a93e48a6", "name": "/usr/include/c++/13/numbers", "type": "file" }, { - "bom-ref": "207427241d59337c", + "bom-ref": "12108f1290990fc0", "name": "/usr/include/c++/13/numeric", "type": "file" }, { - "bom-ref": "345b381f1f5c35b2", + "bom-ref": "f410190a00705af2", "name": "/usr/include/c++/13/optional", "type": "file" }, { - "bom-ref": "40627bdcbff6ecb7", + "bom-ref": "48e04162ebb9a577", "name": "/usr/include/c++/13/ostream", "type": "file" }, { - "bom-ref": "cc111888f0bfcd89", + "bom-ref": "db7b785724da0ca1", "name": "/usr/include/c++/13/parallel/algo.h", "type": "file" }, { - "bom-ref": "3e334c2dac89f2b0", + "bom-ref": "612aa587948085c4", "name": "/usr/include/c++/13/parallel/algobase.h", "type": "file" }, { - "bom-ref": "0338604d1edc28c4", + "bom-ref": "9a6e8f8274228958", "name": "/usr/include/c++/13/parallel/algorithm", "type": "file" }, { - "bom-ref": "1536e6fa7ec7da5e", + "bom-ref": "2306378cb495340a", "name": "/usr/include/c++/13/parallel/algorithmfwd.h", "type": "file" }, { - "bom-ref": "a2d2ca2055cb949d", + "bom-ref": "983868cf77b617ed", "name": "/usr/include/c++/13/parallel/balanced_quicksort.h", "type": "file" }, { - "bom-ref": "ca2729183932525e", + "bom-ref": "e62bc11a268eb9ea", "name": "/usr/include/c++/13/parallel/base.h", "type": "file" }, { - "bom-ref": "f4a354efa6715081", + "bom-ref": "5989d5f60ca18181", "name": "/usr/include/c++/13/parallel/basic_iterator.h", "type": "file" }, { - "bom-ref": "167d83298b1ec2fe", + "bom-ref": "3a4647eb1bd91962", "name": "/usr/include/c++/13/parallel/checkers.h", "type": "file" }, { - "bom-ref": "6cc3df6c07430ab8", + "bom-ref": "c09114eac85a311c", "name": "/usr/include/c++/13/parallel/compatibility.h", "type": "file" }, { - "bom-ref": "344c50da6f941053", + "bom-ref": "aa213d0b4fb25d8f", "name": "/usr/include/c++/13/parallel/compiletime_settings.h", "type": "file" }, { - "bom-ref": "68ca51e2cb22a8ee", + "bom-ref": "ed058aaee24d2b06", "name": "/usr/include/c++/13/parallel/equally_split.h", "type": "file" }, { - "bom-ref": "5c6befb408938b93", + "bom-ref": "6c77031494c50c53", "name": "/usr/include/c++/13/parallel/features.h", "type": "file" }, { - "bom-ref": "2d9e7282956cdbb8", + "bom-ref": "13fad3b57b33ec90", "name": "/usr/include/c++/13/parallel/find.h", "type": "file" }, { - "bom-ref": "a8a65f0cf392e5f7", + "bom-ref": "053671b824bdb70b", "name": "/usr/include/c++/13/parallel/find_selectors.h", "type": "file" }, { - "bom-ref": "ac70daa6eda7b135", + "bom-ref": "0965cad2af6510fd", "name": "/usr/include/c++/13/parallel/for_each.h", "type": "file" }, { - "bom-ref": "8b40a4a9de0abaf0", + "bom-ref": "cbe4c66c488fd7fc", "name": "/usr/include/c++/13/parallel/for_each_selectors.h", "type": "file" }, { - "bom-ref": "8b1e4358b29a01c6", + "bom-ref": "62c14da27a8d32ca", "name": "/usr/include/c++/13/parallel/iterator.h", "type": "file" }, { - "bom-ref": "72e9fa0b2ffc0cfc", + "bom-ref": "bbce45d8afeb7ff8", "name": "/usr/include/c++/13/parallel/list_partition.h", "type": "file" }, { - "bom-ref": "1c1789fc255e46c5", + "bom-ref": "e1dc37424b7cb235", "name": "/usr/include/c++/13/parallel/losertree.h", "type": "file" }, { - "bom-ref": "f2cbe44353fe836d", + "bom-ref": "4c878b425c51040d", "name": "/usr/include/c++/13/parallel/merge.h", "type": "file" }, { - "bom-ref": "580e21daa1909c3c", + "bom-ref": "2c819fbad3b85c60", "name": "/usr/include/c++/13/parallel/multiseq_selection.h", "type": "file" }, { - "bom-ref": "f40cf8fa6e49c6d6", + "bom-ref": "100576417c8442ee", "name": "/usr/include/c++/13/parallel/multiway_merge.h", "type": "file" }, { - "bom-ref": "818b16741a724462", + "bom-ref": "48109307078a902a", "name": "/usr/include/c++/13/parallel/multiway_mergesort.h", "type": "file" }, { - "bom-ref": "cd31050e80d1a938", + "bom-ref": "dcb5d1d799863538", "name": "/usr/include/c++/13/parallel/numeric", "type": "file" }, { - "bom-ref": "7c94b86c51e62f82", + "bom-ref": "f814a241b645af12", "name": "/usr/include/c++/13/parallel/numericfwd.h", "type": "file" }, { - "bom-ref": "2b5b1fdcf6cc2c11", + "bom-ref": "ec1dee948a85935d", "name": "/usr/include/c++/13/parallel/omp_loop.h", "type": "file" }, { - "bom-ref": "7ae4e5b7bb876146", + "bom-ref": "9b0fddf7db7be93a", "name": "/usr/include/c++/13/parallel/omp_loop_static.h", "type": "file" }, { - "bom-ref": "278af0c5d6e84945", + "bom-ref": "1262c0efe155553d", "name": "/usr/include/c++/13/parallel/par_loop.h", "type": "file" }, { - "bom-ref": "bce4c28bb39db714", + "bom-ref": "103d959e1c7bc144", "name": "/usr/include/c++/13/parallel/parallel.h", "type": "file" }, { - "bom-ref": "34ec4c1bbd7f0991", + "bom-ref": "5850939d71ec2741", "name": "/usr/include/c++/13/parallel/partial_sum.h", "type": "file" }, { - "bom-ref": "5e018a92e43db6a8", + "bom-ref": "24b31c0274bcaaa8", "name": "/usr/include/c++/13/parallel/partition.h", "type": "file" }, { - "bom-ref": "2c92a4fe5d910f59", + "bom-ref": "16ecc827ba06657d", "name": "/usr/include/c++/13/parallel/queue.h", "type": "file" }, { - "bom-ref": "600f8fc55eb5a840", + "bom-ref": "e8791b65df2364d4", "name": "/usr/include/c++/13/parallel/quicksort.h", "type": "file" }, { - "bom-ref": "1befd1fcb2b01603", + "bom-ref": "92f44fcb98561337", "name": "/usr/include/c++/13/parallel/random_number.h", "type": "file" }, { - "bom-ref": "4ef69e29fd32543e", + "bom-ref": "fbb664d7874b3376", "name": "/usr/include/c++/13/parallel/random_shuffle.h", "type": "file" }, { - "bom-ref": "50962c08d73402f3", + "bom-ref": "38f5d517473c9ecb", "name": "/usr/include/c++/13/parallel/search.h", "type": "file" }, { - "bom-ref": "4144b057d8ed91bf", + "bom-ref": "8160f3006a4916af", "name": "/usr/include/c++/13/parallel/set_operations.h", "type": "file" }, { - "bom-ref": "55ad5b4b7ab09462", + "bom-ref": "638ce24e626aa9da", "name": "/usr/include/c++/13/parallel/settings.h", "type": "file" }, { - "bom-ref": "3c074afec887d534", + "bom-ref": "363fa6e67d0791ac", "name": "/usr/include/c++/13/parallel/sort.h", "type": "file" }, { - "bom-ref": "8be22e6ff4879e80", + "bom-ref": "fca7681357340a54", "name": "/usr/include/c++/13/parallel/tags.h", "type": "file" }, { - "bom-ref": "dc7a266394b825d3", + "bom-ref": "367531a963e9d137", "name": "/usr/include/c++/13/parallel/types.h", "type": "file" }, { - "bom-ref": "7a6bda6e922ed841", + "bom-ref": "ea5d74ccc08556b1", "name": "/usr/include/c++/13/parallel/unique_copy.h", "type": "file" }, { - "bom-ref": "b78de5098106d99d", + "bom-ref": "a2c1a901b7b83e9d", "name": "/usr/include/c++/13/parallel/workstealing.h", "type": "file" }, { - "bom-ref": "c6e87372611a000a", + "bom-ref": "de3aeb1bce5a207a", "name": "/usr/include/c++/13/pstl/algorithm_fwd.h", "type": "file" }, { - "bom-ref": "a1c117615ce4ef22", + "bom-ref": "bdf0d10021ff5c5a", "name": "/usr/include/c++/13/pstl/algorithm_impl.h", "type": "file" }, { - "bom-ref": "ce9c0ed1798c00e2", + "bom-ref": "a530aeaf3638b7da", "name": "/usr/include/c++/13/pstl/execution_defs.h", "type": "file" }, { - "bom-ref": "321c9f99f6c81257", + "bom-ref": "34941d1a9b7bac0b", "name": "/usr/include/c++/13/pstl/execution_impl.h", "type": "file" }, { - "bom-ref": "319f23a91449df15", + "bom-ref": "79cc5b78e5a720ad", "name": "/usr/include/c++/13/pstl/glue_algorithm_defs.h", "type": "file" }, { - "bom-ref": "9c6d272dd19e8e72", + "bom-ref": "ab91577b3e1ae31e", "name": "/usr/include/c++/13/pstl/glue_algorithm_impl.h", "type": "file" }, { - "bom-ref": "7411b450466b1f5e", + "bom-ref": "a20ed60548b33326", "name": "/usr/include/c++/13/pstl/glue_execution_defs.h", "type": "file" }, { - "bom-ref": "582bda53526966d1", + "bom-ref": "6bdeda6819bc0f8d", "name": "/usr/include/c++/13/pstl/glue_memory_defs.h", "type": "file" }, { - "bom-ref": "efe90b4062b87ed4", + "bom-ref": "bd14730af2b17ba0", "name": "/usr/include/c++/13/pstl/glue_memory_impl.h", "type": "file" }, { - "bom-ref": "64082b98290f1b05", + "bom-ref": "46c31261d25be545", "name": "/usr/include/c++/13/pstl/glue_numeric_defs.h", "type": "file" }, { - "bom-ref": "3ee6b4129c9e4f78", + "bom-ref": "688540104564d418", "name": "/usr/include/c++/13/pstl/glue_numeric_impl.h", "type": "file" }, { - "bom-ref": "192f63982c66914a", + "bom-ref": "8fff47e0f534e0e2", "name": "/usr/include/c++/13/pstl/memory_impl.h", "type": "file" }, { - "bom-ref": "af247f5e3ffae588", + "bom-ref": "8f3b9212e76b5190", "name": "/usr/include/c++/13/pstl/numeric_fwd.h", "type": "file" }, { - "bom-ref": "a30c9130b19926d1", + "bom-ref": "699dee80136955f1", "name": "/usr/include/c++/13/pstl/numeric_impl.h", "type": "file" }, { - "bom-ref": "1ca4471be5bdbb8c", + "bom-ref": "cff8dedbb9bf0428", "name": "/usr/include/c++/13/pstl/parallel_backend.h", "type": "file" }, { - "bom-ref": "8bd76cab3d2e2b7c", + "bom-ref": "13393286aa3be77c", "name": "/usr/include/c++/13/pstl/parallel_backend_serial.h", "type": "file" }, { - "bom-ref": "1e5c8f64f5fb7aeb", + "bom-ref": "f83099c385de9d7b", "name": "/usr/include/c++/13/pstl/parallel_backend_tbb.h", "type": "file" }, { - "bom-ref": "f5b7bb33f14c0f92", + "bom-ref": "9e56b25be28b42e2", "name": "/usr/include/c++/13/pstl/parallel_backend_utils.h", "type": "file" }, { - "bom-ref": "042430a10a96a169", + "bom-ref": "bfc1b756a13a1435", "name": "/usr/include/c++/13/pstl/parallel_impl.h", "type": "file" }, { - "bom-ref": "3f33509211986464", + "bom-ref": "15765725ffe9e61c", "name": "/usr/include/c++/13/pstl/pstl_config.h", "type": "file" }, { - "bom-ref": "fe94bd564d3732d0", + "bom-ref": "da5d23ab09edb754", "name": "/usr/include/c++/13/pstl/unseq_backend_simd.h", "type": "file" }, { - "bom-ref": "2ee770276283f888", + "bom-ref": "b72d681772015d8c", "name": "/usr/include/c++/13/pstl/utils.h", "type": "file" }, { - "bom-ref": "2d14e3145a2fc287", + "bom-ref": "cc810a4e7e6212cf", "name": "/usr/include/c++/13/queue", "type": "file" }, { - "bom-ref": "603fd2e7de96c857", + "bom-ref": "5905740dd5158513", "name": "/usr/include/c++/13/random", "type": "file" }, { - "bom-ref": "c6967556c83559b0", + "bom-ref": "81b775823a2c7498", "name": "/usr/include/c++/13/ranges", "type": "file" }, { - "bom-ref": "682f866a9a48f450", + "bom-ref": "d35a37eb4821fa14", "name": "/usr/include/c++/13/ratio", "type": "file" }, { - "bom-ref": "c952a21f35c6e373", + "bom-ref": "baaf6a9ef23c9db7", "name": "/usr/include/c++/13/regex", "type": "file" }, { - "bom-ref": "eb880e505e83a2bb", + "bom-ref": "e6f21ad36f40f5f7", "name": "/usr/include/c++/13/scoped_allocator", "type": "file" }, { - "bom-ref": "d791e5167fd62bda", + "bom-ref": "55ad6796df9324a6", "name": "/usr/include/c++/13/semaphore", "type": "file" }, { - "bom-ref": "57ae31204b6c237e", + "bom-ref": "499b71f55a9307ae", "name": "/usr/include/c++/13/set", "type": "file" }, { - "bom-ref": "5328fbaf3a6f2de3", + "bom-ref": "1a96bfceadbd1edf", "name": "/usr/include/c++/13/shared_mutex", "type": "file" }, { - "bom-ref": "1d7cd37c35144726", + "bom-ref": "373ab5a0a85a650e", "name": "/usr/include/c++/13/source_location", "type": "file" }, { - "bom-ref": "097e4908e6114d09", + "bom-ref": "bd5179f6e8221de1", "name": "/usr/include/c++/13/span", "type": "file" }, { - "bom-ref": "534a13be17ebbb54", + "bom-ref": "078d0aad79443714", "name": "/usr/include/c++/13/spanstream", "type": "file" }, { - "bom-ref": "3633615ae5f9c9c8", + "bom-ref": "f82640b00368680c", "name": "/usr/include/c++/13/sstream", "type": "file" }, { - "bom-ref": "cf1f59f975a6bb41", + "bom-ref": "ca3446cd279bfe91", "name": "/usr/include/c++/13/stack", "type": "file" }, { - "bom-ref": "dbf74ddb623c2362", + "bom-ref": "e51b9689d84c66d2", "name": "/usr/include/c++/13/stacktrace", "type": "file" }, { - "bom-ref": "766408eed877543c", + "bom-ref": "c08f838629c96304", "name": "/usr/include/c++/13/stdatomic.h", "type": "file" }, { - "bom-ref": "026dda0dff681ce2", + "bom-ref": "2017bbeaec32aca2", "name": "/usr/include/c++/13/stdexcept", "type": "file" }, { - "bom-ref": "3d9627bd3f990e21", + "bom-ref": "635f5caa9e877219", "name": "/usr/include/c++/13/stdfloat", "type": "file" }, { - "bom-ref": "9460997152baff87", + "bom-ref": "9d63c4f01a10d5a3", "name": "/usr/include/c++/13/stdlib.h", "type": "file" }, { - "bom-ref": "604a5e7766840545", + "bom-ref": "1030ffc20cf07999", "name": "/usr/include/c++/13/stop_token", "type": "file" }, { - "bom-ref": "64e91a76a8ee6c8b", + "bom-ref": "fcdde8ebc93bd383", "name": "/usr/include/c++/13/streambuf", "type": "file" }, { - "bom-ref": "ae7d71863794554d", + "bom-ref": "7736c17a739a7aa1", "name": "/usr/include/c++/13/string", "type": "file" }, { - "bom-ref": "83bbb6e28b841a65", + "bom-ref": "33a6e62208958d29", "name": "/usr/include/c++/13/string_view", "type": "file" }, { - "bom-ref": "2948f13a687cf753", + "bom-ref": "b1020719f9ec546f", "name": "/usr/include/c++/13/syncstream", "type": "file" }, { - "bom-ref": "63ec772202c5ee8c", + "bom-ref": "45f9a2bb493efe0c", "name": "/usr/include/c++/13/system_error", "type": "file" }, { - "bom-ref": "8d718147b54fd6b1", + "bom-ref": "11d2149befe023c5", "name": "/usr/include/c++/13/tgmath.h", "type": "file" }, { - "bom-ref": "1ba78811163d960f", + "bom-ref": "a11678d40504fb43", "name": "/usr/include/c++/13/thread", "type": "file" }, { - "bom-ref": "867a6bde2a57022c", + "bom-ref": "5338a27bcc48f8c4", "name": "/usr/include/c++/13/tr1/array", "type": "file" }, { - "bom-ref": "4b3f35a8f2be81d3", + "bom-ref": "e8e9b79bf6b9c663", "name": "/usr/include/c++/13/tr1/bessel_function.tcc", "type": "file" }, { - "bom-ref": "fe5b79cd748c7adb", + "bom-ref": "0e937297ddc66f17", "name": "/usr/include/c++/13/tr1/beta_function.tcc", "type": "file" }, { - "bom-ref": "6207f5b0760bbc1c", + "bom-ref": "5467e80a0c7eff14", "name": "/usr/include/c++/13/tr1/ccomplex", "type": "file" }, { - "bom-ref": "8077d562283fd3fa", + "bom-ref": "7894e165cf3f04de", "name": "/usr/include/c++/13/tr1/cctype", "type": "file" }, { - "bom-ref": "4223cec32e99cd9e", + "bom-ref": "e0dd8e27b890428a", "name": "/usr/include/c++/13/tr1/cfenv", "type": "file" }, { - "bom-ref": "5a60bd474486c5c2", + "bom-ref": "b55c04bb4d1254ea", "name": "/usr/include/c++/13/tr1/cfloat", "type": "file" }, { - "bom-ref": "f5f8674ab73e7d20", + "bom-ref": "1f394596ffaa5c84", "name": "/usr/include/c++/13/tr1/cinttypes", "type": "file" }, { - "bom-ref": "d25e07783da7e346", + "bom-ref": "d9674f1d95bb4f3e", "name": "/usr/include/c++/13/tr1/climits", "type": "file" }, { - "bom-ref": "2447fe3466051a77", + "bom-ref": "9b2b482ac02d4e93", "name": "/usr/include/c++/13/tr1/cmath", "type": "file" }, { - "bom-ref": "6bad2ac2b84e0af4", + "bom-ref": "53b0cb560afc8308", "name": "/usr/include/c++/13/tr1/complex", "type": "file" }, { - "bom-ref": "5f8665818704cea9", + "bom-ref": "904d7270f92bc7d1", "name": "/usr/include/c++/13/tr1/complex.h", "type": "file" }, { - "bom-ref": "9e14f05f7e6ecc0c", + "bom-ref": "44c474a67fc45870", "name": "/usr/include/c++/13/tr1/cstdarg", "type": "file" }, { - "bom-ref": "e30085454efbb3fc", + "bom-ref": "290ea271b6ca6090", "name": "/usr/include/c++/13/tr1/cstdbool", "type": "file" }, { - "bom-ref": "46b8a9f0ad8b1741", + "bom-ref": "7a8ffeb60dd2abf9", "name": "/usr/include/c++/13/tr1/cstdint", "type": "file" }, { - "bom-ref": "2326b9a8185c53dc", + "bom-ref": "275fa7517e25d118", "name": "/usr/include/c++/13/tr1/cstdio", "type": "file" }, { - "bom-ref": "10ee90665119b36c", + "bom-ref": "09c48db2d04ee2d8", "name": "/usr/include/c++/13/tr1/cstdlib", "type": "file" }, { - "bom-ref": "369cacc6a3de62aa", + "bom-ref": "e11ee0f9690f6442", "name": "/usr/include/c++/13/tr1/ctgmath", "type": "file" }, { - "bom-ref": "11c4877d8b7e251a", + "bom-ref": "6c5c9e94e0ec2dd6", "name": "/usr/include/c++/13/tr1/ctime", "type": "file" }, { - "bom-ref": "e920faa10951f620", + "bom-ref": "9030f6c4d0c7adc4", "name": "/usr/include/c++/13/tr1/ctype.h", "type": "file" }, { - "bom-ref": "a1827a88e88c372c", + "bom-ref": "db974f40f590b6bc", "name": "/usr/include/c++/13/tr1/cwchar", "type": "file" }, { - "bom-ref": "282ed72b5f0fd430", + "bom-ref": "558e651ebc17cef0", "name": "/usr/include/c++/13/tr1/cwctype", "type": "file" }, { - "bom-ref": "4bdccc819c7974ff", + "bom-ref": "d2056f68f5a8fadf", "name": "/usr/include/c++/13/tr1/ell_integral.tcc", "type": "file" }, { - "bom-ref": "da8273a8d76c94bc", + "bom-ref": "eade48680cf50078", "name": "/usr/include/c++/13/tr1/exp_integral.tcc", "type": "file" }, { - "bom-ref": "d90ccbf5d131cb81", + "bom-ref": "a31dcff2deef9779", "name": "/usr/include/c++/13/tr1/fenv.h", "type": "file" }, { - "bom-ref": "f836ee574d7881fc", + "bom-ref": "9bba0645fb7d4810", "name": "/usr/include/c++/13/tr1/float.h", "type": "file" }, { - "bom-ref": "9826905cf840c8c7", + "bom-ref": "ec8c522c78f29f47", "name": "/usr/include/c++/13/tr1/functional", "type": "file" }, { - "bom-ref": "3ae8ebcf9bf5473d", + "bom-ref": "078d68a2f21b7951", "name": "/usr/include/c++/13/tr1/functional_hash.h", "type": "file" }, { - "bom-ref": "a4cf417510bad835", + "bom-ref": "9ad3cd55788b91d9", "name": "/usr/include/c++/13/tr1/gamma.tcc", "type": "file" }, { - "bom-ref": "ccb1a48f1ec8ae9c", + "bom-ref": "26fa2a817bf25ac4", "name": "/usr/include/c++/13/tr1/hashtable.h", "type": "file" }, { - "bom-ref": "719bd7fb5de5da48", + "bom-ref": "a5c51ad0a418d5b0", "name": "/usr/include/c++/13/tr1/hashtable_policy.h", "type": "file" }, { - "bom-ref": "d5f9f0a8e7998427", + "bom-ref": "2d72a9dbfc3be1f7", "name": "/usr/include/c++/13/tr1/hypergeometric.tcc", "type": "file" }, { - "bom-ref": "7de8762f1782aa9a", + "bom-ref": "44439d548ea24a62", "name": "/usr/include/c++/13/tr1/inttypes.h", "type": "file" }, { - "bom-ref": "aaf69059e6740909", + "bom-ref": "f5d3f4e92b537bc9", "name": "/usr/include/c++/13/tr1/legendre_function.tcc", "type": "file" }, { - "bom-ref": "99bfe4b06a211d8f", + "bom-ref": "77ce1cf7ceee78ef", "name": "/usr/include/c++/13/tr1/limits.h", "type": "file" }, { - "bom-ref": "72a0115203cf35de", + "bom-ref": "1afe4095aac4452e", "name": "/usr/include/c++/13/tr1/math.h", "type": "file" }, { - "bom-ref": "c562d145fecc8d24", + "bom-ref": "bfdb012ae8e4d75c", "name": "/usr/include/c++/13/tr1/memory", "type": "file" }, { - "bom-ref": "5268dae9186df735", + "bom-ref": "e741ebb3dc57b8a5", "name": "/usr/include/c++/13/tr1/modified_bessel_func.tcc", "type": "file" }, { - "bom-ref": "3a79ec393af7a0e7", + "bom-ref": "773fbc12711c5157", "name": "/usr/include/c++/13/tr1/poly_hermite.tcc", "type": "file" }, { - "bom-ref": "c104ba1273832708", + "bom-ref": "48f382aad1eba9a0", "name": "/usr/include/c++/13/tr1/poly_laguerre.tcc", "type": "file" }, { - "bom-ref": "1371748d507565f7", + "bom-ref": "22e9aaeea9ac0e57", "name": "/usr/include/c++/13/tr1/random", "type": "file" }, { - "bom-ref": "52ba81e44fa3ae1e", + "bom-ref": "a16ce2dfa8ca3ef2", "name": "/usr/include/c++/13/tr1/random.h", "type": "file" }, { - "bom-ref": "fbb1440df346a88c", + "bom-ref": "743b6e9547af560c", "name": "/usr/include/c++/13/tr1/random.tcc", "type": "file" }, { - "bom-ref": "5305fb345392b2f4", + "bom-ref": "844da27e1859de34", "name": "/usr/include/c++/13/tr1/regex", "type": "file" }, { - "bom-ref": "84c391ba079275a9", + "bom-ref": "b1af076af42dc269", "name": "/usr/include/c++/13/tr1/riemann_zeta.tcc", "type": "file" }, { - "bom-ref": "2bd52725ec8763e2", + "bom-ref": "b85aaf8842dd963a", "name": "/usr/include/c++/13/tr1/shared_ptr.h", "type": "file" }, { - "bom-ref": "d88f17f8a01c2e52", + "bom-ref": "0bd117cbcbcae006", "name": "/usr/include/c++/13/tr1/special_function_util.h", "type": "file" }, { - "bom-ref": "f7c0ce4adc037a18", + "bom-ref": "fb9d8c091fdb3b28", "name": "/usr/include/c++/13/tr1/stdarg.h", "type": "file" }, { - "bom-ref": "2294221eb878aafd", + "bom-ref": "65151cf242adc415", "name": "/usr/include/c++/13/tr1/stdbool.h", "type": "file" }, { - "bom-ref": "7b6cb7ba3c26594d", + "bom-ref": "8e409bf49a09a3c5", "name": "/usr/include/c++/13/tr1/stdint.h", "type": "file" }, { - "bom-ref": "a834724f38f140c3", + "bom-ref": "7e43865d706ed43f", "name": "/usr/include/c++/13/tr1/stdio.h", "type": "file" }, { - "bom-ref": "c5441bbfb9e05877", + "bom-ref": "25f985ccfce1bcf3", "name": "/usr/include/c++/13/tr1/stdlib.h", "type": "file" }, { - "bom-ref": "8022d75fc65a2cdf", + "bom-ref": "552e9b27c567bfb3", "name": "/usr/include/c++/13/tr1/tgmath.h", "type": "file" }, { - "bom-ref": "70eec83001195bad", + "bom-ref": "7a796d2fadb701d9", "name": "/usr/include/c++/13/tr1/tuple", "type": "file" }, { - "bom-ref": "6529583b63dc1c69", + "bom-ref": "f73d3b1791e0cc29", "name": "/usr/include/c++/13/tr1/type_traits", "type": "file" }, { - "bom-ref": "a3e1656538de4a43", + "bom-ref": "77e457708942e517", "name": "/usr/include/c++/13/tr1/unordered_map", "type": "file" }, { - "bom-ref": "82af15da4774d34a", + "bom-ref": "4eee6966f2a32352", "name": "/usr/include/c++/13/tr1/unordered_map.h", "type": "file" }, { - "bom-ref": "8915f578e5c0b42b", + "bom-ref": "69cd96f6ff1eefb3", "name": "/usr/include/c++/13/tr1/unordered_set", "type": "file" }, { - "bom-ref": "ced1da371a76f239", + "bom-ref": "0e84cb1310b23455", "name": "/usr/include/c++/13/tr1/unordered_set.h", "type": "file" }, { - "bom-ref": "2935c3e291b2fb34", + "bom-ref": "c22ee736c879f750", "name": "/usr/include/c++/13/tr1/utility", "type": "file" }, { - "bom-ref": "04d2788f185f3096", + "bom-ref": "09d66904766362de", "name": "/usr/include/c++/13/tr1/wchar.h", "type": "file" }, { - "bom-ref": "a974fe43e7c55828", + "bom-ref": "a622dab829488198", "name": "/usr/include/c++/13/tr1/wctype.h", "type": "file" }, { - "bom-ref": "cc5d1fd898d50344", + "bom-ref": "6bc68aec64c7b6e8", "name": "/usr/include/c++/13/tr2/bool_set", "type": "file" }, { - "bom-ref": "dacdc1eccb9a6abb", + "bom-ref": "b80e126f5e934f23", "name": "/usr/include/c++/13/tr2/bool_set.tcc", "type": "file" }, { - "bom-ref": "3304cd5b1f713b05", + "bom-ref": "d835cc8dd8b3e9a9", "name": "/usr/include/c++/13/tr2/dynamic_bitset", "type": "file" }, { - "bom-ref": "4149ea27a616b7e0", + "bom-ref": "43a916fe040933c0", "name": "/usr/include/c++/13/tr2/dynamic_bitset.tcc", "type": "file" }, { - "bom-ref": "ab94c9633d2a0366", + "bom-ref": "c4b9675747c2016e", "name": "/usr/include/c++/13/tr2/ratio", "type": "file" }, { - "bom-ref": "f2c1d5b4e6369f67", + "bom-ref": "86d904ba9f947837", "name": "/usr/include/c++/13/tr2/type_traits", "type": "file" }, { - "bom-ref": "56b5f8f9ec2da5a9", + "bom-ref": "c37dad6ea90c9305", "name": "/usr/include/c++/13/tuple", "type": "file" }, { - "bom-ref": "7f3d7204801263a4", + "bom-ref": "51e0a9e82707a368", "name": "/usr/include/c++/13/type_traits", "type": "file" }, { - "bom-ref": "2b6443566c192099", + "bom-ref": "f192ba4916b2ae21", "name": "/usr/include/c++/13/typeindex", "type": "file" }, { - "bom-ref": "aea0948ad310e03f", + "bom-ref": "56180a712f683283", "name": "/usr/include/c++/13/typeinfo", "type": "file" }, { - "bom-ref": "c251c31eb78d39ef", + "bom-ref": "53f4a4135562808b", "name": "/usr/include/c++/13/unordered_map", "type": "file" }, { - "bom-ref": "03ecbd5ed1dfeaab", + "bom-ref": "bca3478b39dee6f7", "name": "/usr/include/c++/13/unordered_set", "type": "file" }, { - "bom-ref": "588b135bf23f9080", + "bom-ref": "e9c12dbb0eae1080", "name": "/usr/include/c++/13/utility", "type": "file" }, { - "bom-ref": "78862a3d3c9210c9", + "bom-ref": "8422ae060ab4a76d", "name": "/usr/include/c++/13/valarray", "type": "file" }, { - "bom-ref": "cbf8cb830a8c93c2", + "bom-ref": "98319c025d5794fa", "name": "/usr/include/c++/13/variant", "type": "file" }, { - "bom-ref": "4154f509fd4acc4d", + "bom-ref": "628b11b650515405", "name": "/usr/include/c++/13/vector", "type": "file" }, { - "bom-ref": "3a1965867dce5eed", + "bom-ref": "8186a4acc7385291", "name": "/usr/include/c++/13/version", "type": "file" }, { - "bom-ref": "86cf5500efa81337", + "bom-ref": "4fbe3f3b9b3563d7", "name": "/usr/include/complex.h", "type": "file" }, { - "bom-ref": "1942d47e985fb924", + "bom-ref": "689f117dc8980740", "name": "/usr/include/cpio.h", "type": "file" }, { - "bom-ref": "81545c54e156d004", + "bom-ref": "b82c814fe7f2e840", "name": "/usr/include/crypt.h", "type": "file" }, { - "bom-ref": "d5038d0c6dd1bf05", + "bom-ref": "0cbcc00655b9b2c1", "name": "/usr/include/ctype.h", "type": "file" }, { - "bom-ref": "28c805a110f6da8e", + "bom-ref": "bdba2365e61974f6", "name": "/usr/include/dirent.h", "type": "file" }, { - "bom-ref": "f5f0ad654fdd6a93", + "bom-ref": "003cce381077df1f", "name": "/usr/include/dlfcn.h", "type": "file" }, { - "bom-ref": "9a6aacde1f5566b2", + "bom-ref": "3cf17a1d225925da", "name": "/usr/include/drm/amdgpu_drm.h", "type": "file" }, { - "bom-ref": "94d38e006f24438b", + "bom-ref": "38153b92872a9393", "name": "/usr/include/drm/armada_drm.h", "type": "file" }, { - "bom-ref": "3cbeb59710b72109", + "bom-ref": "be870e239f371279", "name": "/usr/include/drm/drm.h", "type": "file" }, { - "bom-ref": "67ef7bf98a33d0d1", + "bom-ref": "e00661e42064e895", "name": "/usr/include/drm/drm_fourcc.h", "type": "file" }, { - "bom-ref": "e7ff84103cafd4f3", + "bom-ref": "4875a882fb4fc9df", "name": "/usr/include/drm/drm_mode.h", "type": "file" }, { - "bom-ref": "bcc0a980e8475292", + "bom-ref": "792470e6ac50fba2", "name": "/usr/include/drm/drm_sarea.h", "type": "file" }, { - "bom-ref": "d4498ff110f58eb8", + "bom-ref": "7c971a2d0f232404", "name": "/usr/include/drm/etnaviv_drm.h", "type": "file" }, { - "bom-ref": "6709e4a6b50654cc", + "bom-ref": "008f6699119d95fc", "name": "/usr/include/drm/exynos_drm.h", "type": "file" }, { - "bom-ref": "8df3e7c0613a3b12", + "bom-ref": "981504755a3315b2", "name": "/usr/include/drm/habanalabs_accel.h", "type": "file" }, { - "bom-ref": "279ed4fca2442dff", + "bom-ref": "37f808201c50f4f3", "name": "/usr/include/drm/i915_drm.h", "type": "file" }, { - "bom-ref": "93aa4df03d39b004", + "bom-ref": "2ed9d5474783f4d0", "name": "/usr/include/drm/ivpu_accel.h", "type": "file" }, { - "bom-ref": "b2ced179e9e5f0ae", + "bom-ref": "28f5095d2faa5b52", "name": "/usr/include/drm/lima_drm.h", "type": "file" }, { - "bom-ref": "bfb54f27e75eb472", + "bom-ref": "ac4a81484d3ffd62", "name": "/usr/include/drm/msm_drm.h", "type": "file" }, { - "bom-ref": "20450204a8e1bd4b", + "bom-ref": "349da79520895a3f", "name": "/usr/include/drm/nouveau_drm.h", "type": "file" }, { - "bom-ref": "c045bb33565f6150", + "bom-ref": "741c52250ff69964", "name": "/usr/include/drm/omap_drm.h", "type": "file" }, { - "bom-ref": "aa9021fad9e54071", + "bom-ref": "8f863a96c3b791dd", "name": "/usr/include/drm/panfrost_drm.h", "type": "file" }, { - "bom-ref": "f807ab26f7da59a2", + "bom-ref": "95e1c6687d543a52", "name": "/usr/include/drm/pvr_drm.h", "type": "file" }, { - "bom-ref": "1b9a0cf0241932e9", + "bom-ref": "f1423a709d02fa6d", "name": "/usr/include/drm/qaic_accel.h", "type": "file" }, { - "bom-ref": "fe61195aaf72f39a", + "bom-ref": "ade46dbed9723056", "name": "/usr/include/drm/qxl_drm.h", "type": "file" }, { - "bom-ref": "48c8376341a981b7", + "bom-ref": "ecafd9603dd05d8f", "name": "/usr/include/drm/radeon_drm.h", "type": "file" }, { - "bom-ref": "9c65b2fe0ab777b4", + "bom-ref": "b3d1e45eccd36fbc", "name": "/usr/include/drm/tegra_drm.h", "type": "file" }, { - "bom-ref": "95f27b2f7db7022b", + "bom-ref": "380a0715b057fe8b", "name": "/usr/include/drm/v3d_drm.h", "type": "file" }, { - "bom-ref": "060de7ee0096ffcc", + "bom-ref": "1168bde82bcdc6cc", "name": "/usr/include/drm/vc4_drm.h", "type": "file" }, { - "bom-ref": "b650b41a63f81225", + "bom-ref": "14195b62172a7021", "name": "/usr/include/drm/vgem_drm.h", "type": "file" }, { - "bom-ref": "fa821b0f14560a60", + "bom-ref": "4ea47bacbdb3087c", "name": "/usr/include/drm/virtgpu_drm.h", "type": "file" }, { - "bom-ref": "3aba7e1a185229de", + "bom-ref": "e62d9cba161438da", "name": "/usr/include/drm/vmwgfx_drm.h", "type": "file" }, { - "bom-ref": "c4a731c0e4c5820d", + "bom-ref": "52a21c781328671d", "name": "/usr/include/drm/xe_drm.h", "type": "file" }, { - "bom-ref": "dadbdc5fce046927", + "bom-ref": "1dc3fb6bda5fddab", "name": "/usr/include/elf.h", "type": "file" }, { - "bom-ref": "e975f0c5d8025df0", + "bom-ref": "1c3f10265bdce450", "name": "/usr/include/endian.h", "type": "file" }, { - "bom-ref": "abe3311a05d253e2", + "bom-ref": "7b669d96226cc4ee", "name": "/usr/include/envz.h", "type": "file" }, { - "bom-ref": "9835c85fd6e69df0", + "bom-ref": "fda0a9b5a0e3de90", "name": "/usr/include/err.h", "type": "file" }, { - "bom-ref": "60de32934ac28d46", + "bom-ref": "410b0bfed0e4b5ea", "name": "/usr/include/errno.h", "type": "file" }, { - "bom-ref": "e5b03077d05a1bbc", + "bom-ref": "398cd1498842dfcc", "name": "/usr/include/error.h", "type": "file" }, { - "bom-ref": "a5747d093f1a7d47", + "bom-ref": "ca355674938e1743", "name": "/usr/include/execinfo.h", "type": "file" }, { - "bom-ref": "709aa244d053cc2e", + "bom-ref": "8439c8cc483eb432", "name": "/usr/include/expat.h", "type": "file" }, { - "bom-ref": "fda96c3d25124378", + "bom-ref": "53fdcf95b3c7c6d8", "name": "/usr/include/expat_external.h", "type": "file" }, { - "bom-ref": "c198f0d2d7150058", + "bom-ref": "14457b68806d2ccc", "name": "/usr/include/fcntl.h", "type": "file" }, { - "bom-ref": "57bba5d467ac4209", + "bom-ref": "122e6cdb1766c195", "name": "/usr/include/features-time64.h", "type": "file" }, { - "bom-ref": "59670e5d6826f335", + "bom-ref": "e02a241d43948121", "name": "/usr/include/features.h", "type": "file" }, { - "bom-ref": "25697979e5712eed", + "bom-ref": "d7e21ad52c1323d9", "name": "/usr/include/fenv.h", "type": "file" }, { - "bom-ref": "c115aa3122d79e1c", + "bom-ref": "57a8b00bf29aaaf8", "name": "/usr/include/finclude/x86_64-linux-gnu/math-vector-fortran.h", "type": "file" }, { - "bom-ref": "7fba2e5a23ce4b9e", + "bom-ref": "aadbe7325a4888a2", "name": "/usr/include/fmtmsg.h", "type": "file" }, { - "bom-ref": "9733c6ba653e5558", + "bom-ref": "f9854bd3710f777c", "name": "/usr/include/fnmatch.h", "type": "file" }, { - "bom-ref": "ba109baeee90322a", + "bom-ref": "78b3cde28c1ae6f2", "name": "/usr/include/fstab.h", "type": "file" }, { - "bom-ref": "0915c74d8d46a426", + "bom-ref": "4371b8a5ba00ce46", "name": "/usr/include/fts.h", "type": "file" }, { - "bom-ref": "bd94a6aef35539af", + "bom-ref": "329a0d891680e3bb", "name": "/usr/include/ftw.h", "type": "file" }, { - "bom-ref": "a58c76a4faf1c7e9", + "bom-ref": "27664b4474d1d889", "name": "/usr/include/gconv.h", "type": "file" }, { - "bom-ref": "657bfc1d1ffc96e5", + "bom-ref": "de7f6472b1e36811", "name": "/usr/include/getopt.h", "type": "file" }, { - "bom-ref": "9f0138233c8247ce", + "bom-ref": "c056cb93c22ab282", "name": "/usr/include/glob.h", "type": "file" }, { - "bom-ref": "374fd0b9df79f5ad", + "bom-ref": "1dd0a8e50790fa89", "name": "/usr/include/gnu-versions.h", "type": "file" }, { - "bom-ref": "4083b2dfd19f2e22", + "bom-ref": "7dff9ff0da4f67be", "name": "/usr/include/gnumake.h", "type": "file" }, { - "bom-ref": "cd14e34497796ee5", + "bom-ref": "b530aad0fef34b35", "name": "/usr/include/grp.h", "type": "file" }, { - "bom-ref": "fab2d8a71b885e79", + "bom-ref": "78093e901b2af901", "name": "/usr/include/gshadow.h", "type": "file" }, { - "bom-ref": "d72fe3efb314a7fa", + "bom-ref": "59dd3f58b47de086", "name": "/usr/include/iconv.h", "type": "file" }, { - "bom-ref": "97b2af3d6da4c722", + "bom-ref": "4253d6bf0881e156", "name": "/usr/include/ifaddrs.h", "type": "file" }, { - "bom-ref": "2018adeeada11072", + "bom-ref": "f756e535753b8f5a", "name": "/usr/include/inttypes.h", "type": "file" }, { - "bom-ref": "d133a9e0670f7bd1", + "bom-ref": "0074fddaa496a4d5", "name": "/usr/include/langinfo.h", "type": "file" }, { - "bom-ref": "b374aa0a0446d769", + "bom-ref": "27c0f5e2dbe20629", "name": "/usr/include/lastlog.h", "type": "file" }, { - "bom-ref": "61c2eca637fcc280", + "bom-ref": "9747c9dc43f6d357", "name": "/usr/include/level_zero/layers/zel_tracing_api.h", "type": "file" }, { - "bom-ref": "883cc768ab766d36", + "bom-ref": "664b57b46e5564fd", "name": "/usr/include/level_zero/layers/zel_tracing_ddi.h", "type": "file" }, { - "bom-ref": "00c8315b6a83a8ba", + "bom-ref": "b527508288fd42f1", "name": "/usr/include/level_zero/layers/zel_tracing_register_cb.h", "type": "file" }, { - "bom-ref": "2afbe902b18cc37a", + "bom-ref": "276de54a4932ead9", "name": "/usr/include/level_zero/loader/ze_loader.h", "type": "file" }, { - "bom-ref": "197ee65e1469ec98", + "bom-ref": "10fd8a504ac04ec3", "name": "/usr/include/level_zero/ze_api.h", "type": "file" }, { - "bom-ref": "fbb0c01eb7ee65e9", + "bom-ref": "88fad9cf79875fba", "name": "/usr/include/level_zero/ze_ddi.h", "type": "file" }, { - "bom-ref": "57d8c4ec70a84385", + "bom-ref": "0ce9ff9f760fd58e", "name": "/usr/include/level_zero/ze_ddi_common.h", "type": "file" }, { - "bom-ref": "71d188f8bc9263ac", + "bom-ref": "575923cd0b3f36f7", "name": "/usr/include/level_zero/zer_api.h", "type": "file" }, { - "bom-ref": "e1d1b1a5b813ee1a", + "bom-ref": "daf9ebf5311aa9dd", "name": "/usr/include/level_zero/zer_ddi.h", "type": "file" }, { - "bom-ref": "856d70a18332633e", + "bom-ref": "db84854e7015186d", "name": "/usr/include/level_zero/zes_api.h", "type": "file" }, { - "bom-ref": "30509e960519c76d", + "bom-ref": "47a02f13e874bd4e", "name": "/usr/include/level_zero/zes_ddi.h", "type": "file" }, { - "bom-ref": "43f137d097627bea", + "bom-ref": "c09b3c3f44899cd5", "name": "/usr/include/level_zero/zet_api.h", "type": "file" }, { - "bom-ref": "13c1ecbc9656b84f", + "bom-ref": "84017e2c4bf4e878", "name": "/usr/include/level_zero/zet_ddi.h", "type": "file" }, { - "bom-ref": "c1973cd4b57d4dbc", + "bom-ref": "6ab23c77af619508", "name": "/usr/include/libaio.h", "type": "file" }, { - "bom-ref": "ca5ad038fa5e9638", + "bom-ref": "bc9be5e236e6f378", "name": "/usr/include/libgen.h", "type": "file" }, { - "bom-ref": "8d5379156d875dbf", + "bom-ref": "13c2d0926b22eaef", "name": "/usr/include/libintl.h", "type": "file" }, { - "bom-ref": "6a4cd22e89064f94", + "bom-ref": "7a3652d61a6ec5e0", "name": "/usr/include/limits.h", "type": "file" }, { - "bom-ref": "217b6ab9c15f5694", + "bom-ref": "19e7e7b2835708f0", "name": "/usr/include/link.h", "type": "file" }, { - "bom-ref": "e05894585754d9cd", + "bom-ref": "fd7a1640b426b415", "name": "/usr/include/linux/a.out.h", "type": "file" }, { - "bom-ref": "52b8b9ff8776c2b1", + "bom-ref": "36fd4618f3a9c065", "name": "/usr/include/linux/acct.h", "type": "file" }, { - "bom-ref": "eab2d552bdbf55ee", + "bom-ref": "246f270d9de799d6", "name": "/usr/include/linux/acrn.h", "type": "file" }, { - "bom-ref": "6d10c423bd2f4cdb", + "bom-ref": "393ca2903d77c497", "name": "/usr/include/linux/adb.h", "type": "file" }, { - "bom-ref": "3a251916acccc05a", + "bom-ref": "548d042da50d554a", "name": "/usr/include/linux/adfs_fs.h", "type": "file" }, { - "bom-ref": "8576c36f1cfaee78", + "bom-ref": "42d82aaf3a9b9c88", "name": "/usr/include/linux/affs_hardblocks.h", "type": "file" }, { - "bom-ref": "f457f3f19ea9ebce", + "bom-ref": "075642170d83cc66", "name": "/usr/include/linux/agpgart.h", "type": "file" }, { - "bom-ref": "5bab8218600d11f8", + "bom-ref": "2bd13106bcc21ef0", "name": "/usr/include/linux/aio_abi.h", "type": "file" }, { - "bom-ref": "2bd0a08370e54654", + "bom-ref": "9c1f6d6b95dce2b8", "name": "/usr/include/linux/am437x-vpfe.h", "type": "file" }, { - "bom-ref": "644be94a3508a939", + "bom-ref": "a834fadf8f80bb99", "name": "/usr/include/linux/amt.h", "type": "file" }, { - "bom-ref": "927a3a9939c2dabc", + "bom-ref": "9743e2c819e3bc70", "name": "/usr/include/linux/android/binder.h", "type": "file" }, { - "bom-ref": "7e06a713578337e4", + "bom-ref": "9989e571a4f87130", "name": "/usr/include/linux/android/binderfs.h", "type": "file" }, { - "bom-ref": "342f69663f42578e", + "bom-ref": "916207b2f8124326", "name": "/usr/include/linux/apm_bios.h", "type": "file" }, { - "bom-ref": "a50ef296cfaa27f2", + "bom-ref": "0b0c73e166f64af6", "name": "/usr/include/linux/apparmor.h", "type": "file" }, { - "bom-ref": "e5093218dfe0179c", + "bom-ref": "852f8101819a2170", "name": "/usr/include/linux/arcfb.h", "type": "file" }, { - "bom-ref": "c768d8c23cfdad91", + "bom-ref": "8c45a3f99b9b4c39", "name": "/usr/include/linux/arm_sdei.h", "type": "file" }, { - "bom-ref": "87d3afcafe76ad65", + "bom-ref": "bda163c996759cdd", "name": "/usr/include/linux/aspeed-lpc-ctrl.h", "type": "file" }, { - "bom-ref": "0f52e0e9092cbe12", + "bom-ref": "78502d5431a612e6", "name": "/usr/include/linux/aspeed-p2a-ctrl.h", "type": "file" }, { - "bom-ref": "2c802da17e0a9f94", + "bom-ref": "8962dd72a2b0e5d8", "name": "/usr/include/linux/aspeed-video.h", "type": "file" }, { - "bom-ref": "842f04eeb8917ab0", + "bom-ref": "16aa2589108a5348", "name": "/usr/include/linux/atalk.h", "type": "file" }, { - "bom-ref": "40201e448ba9cf68", + "bom-ref": "c629cb5bd07d551c", "name": "/usr/include/linux/atm.h", "type": "file" }, { - "bom-ref": "9f907f492e85ac7a", + "bom-ref": "d8eec091019f8eee", "name": "/usr/include/linux/atm_eni.h", "type": "file" }, { - "bom-ref": "af91064c84b806cd", + "bom-ref": "1d7e67c91b1f735d", "name": "/usr/include/linux/atm_he.h", "type": "file" }, { - "bom-ref": "dfda76689caf4830", + "bom-ref": "7e174cb18a8b8ea0", "name": "/usr/include/linux/atm_idt77105.h", "type": "file" }, { - "bom-ref": "f8721bf7fb43c91a", + "bom-ref": "64b9686b8e22cc52", "name": "/usr/include/linux/atm_nicstar.h", "type": "file" }, { - "bom-ref": "d92f2e0e2a904358", + "bom-ref": "01fd9e1d6f3c76c8", "name": "/usr/include/linux/atm_tcp.h", "type": "file" }, { - "bom-ref": "de42cef2fca46e2e", + "bom-ref": "8fbd9933992b3796", "name": "/usr/include/linux/atm_zatm.h", "type": "file" }, { - "bom-ref": "a32a83735afb2b8d", + "bom-ref": "91d560df0ad2e695", "name": "/usr/include/linux/atmapi.h", "type": "file" }, { - "bom-ref": "e653c21ac4396e3d", + "bom-ref": "20a31dd2384c03b5", "name": "/usr/include/linux/atmarp.h", "type": "file" }, { - "bom-ref": "78fe60e261b3dcb6", + "bom-ref": "5d18167bb977b6f6", "name": "/usr/include/linux/atmbr2684.h", "type": "file" }, { - "bom-ref": "2dd82050a3be3110", + "bom-ref": "d43cd209247bda4c", "name": "/usr/include/linux/atmclip.h", "type": "file" }, { - "bom-ref": "096094bc8d2b3a3e", + "bom-ref": "83f7d95f4abddb56", "name": "/usr/include/linux/atmdev.h", "type": "file" }, { - "bom-ref": "d2d1952d121d40fb", + "bom-ref": "89a69b0c86b5c0fb", "name": "/usr/include/linux/atmioc.h", "type": "file" }, { - "bom-ref": "9906a5c3a7da857e", + "bom-ref": "354aa645e64e748e", "name": "/usr/include/linux/atmlec.h", "type": "file" }, { - "bom-ref": "024098fdfeae5fea", + "bom-ref": "ffb692aff6ebc14a", "name": "/usr/include/linux/atmmpc.h", "type": "file" }, { - "bom-ref": "e022edeae80a46b7", + "bom-ref": "2c3bf197d7b3aecf", "name": "/usr/include/linux/atmppp.h", "type": "file" }, { - "bom-ref": "9ecdab3217de0b7c", + "bom-ref": "60f51719e4fda06c", "name": "/usr/include/linux/atmsap.h", "type": "file" }, { - "bom-ref": "c210cc4409133db4", + "bom-ref": "7cb0bf15515bb6b8", "name": "/usr/include/linux/atmsvc.h", "type": "file" }, { - "bom-ref": "25c10de9b363a086", + "bom-ref": "6f1b54386a5afb72", "name": "/usr/include/linux/audit.h", "type": "file" }, { - "bom-ref": "12fb4fa7aefdfa06", + "bom-ref": "07e51c070331668a", "name": "/usr/include/linux/auto_dev-ioctl.h", "type": "file" }, { - "bom-ref": "307cd76bc2c69043", + "bom-ref": "a1ae31f848fc397f", "name": "/usr/include/linux/auto_fs.h", "type": "file" }, { - "bom-ref": "adb3f02972e0e2eb", + "bom-ref": "d6cbe53d2666096b", "name": "/usr/include/linux/auto_fs4.h", "type": "file" }, { - "bom-ref": "bb4c91bbc186fe87", + "bom-ref": "a24ab5bdb89caee3", "name": "/usr/include/linux/auxvec.h", "type": "file" }, { - "bom-ref": "beb1e4dd8ea9d42a", + "bom-ref": "e274f3106f04b4aa", "name": "/usr/include/linux/ax25.h", "type": "file" }, { - "bom-ref": "192de80ad75d4673", + "bom-ref": "0af6b8157f1ebaa3", "name": "/usr/include/linux/batadv_packet.h", "type": "file" }, { - "bom-ref": "d5ae8fb734a17505", + "bom-ref": "c8cc7cce547a1819", "name": "/usr/include/linux/batman_adv.h", "type": "file" }, { - "bom-ref": "9a71239366d0bd60", + "bom-ref": "abf7ee21a17957f0", "name": "/usr/include/linux/baycom.h", "type": "file" }, { - "bom-ref": "68f7d93179506ffd", + "bom-ref": "6c0a40cc16a07c81", "name": "/usr/include/linux/bcm933xx_hcs.h", "type": "file" }, { - "bom-ref": "4c179b68d756d35f", + "bom-ref": "6e308eb54cd6fe87", "name": "/usr/include/linux/bfs_fs.h", "type": "file" }, { - "bom-ref": "dcc6f54ef04c9566", + "bom-ref": "dc45bb23a4689dde", "name": "/usr/include/linux/binfmts.h", "type": "file" }, { - "bom-ref": "44cf5372f01b8859", + "bom-ref": "32e6da54d580d06d", "name": "/usr/include/linux/blkpg.h", "type": "file" }, { - "bom-ref": "8266a2932ce2e100", + "bom-ref": "7feb26cdf2785088", "name": "/usr/include/linux/blktrace_api.h", "type": "file" }, { - "bom-ref": "634837a1f9e17f6e", + "bom-ref": "0a232ba2403fa232", "name": "/usr/include/linux/blkzoned.h", "type": "file" }, { - "bom-ref": "9bb3ef5408b482a0", + "bom-ref": "239ea1aab111e9e4", "name": "/usr/include/linux/bpf.h", "type": "file" }, { - "bom-ref": "de7129a4ebb11b58", + "bom-ref": "b1be38f771565dc8", "name": "/usr/include/linux/bpf_common.h", "type": "file" }, { - "bom-ref": "132af30dad11f026", + "bom-ref": "939cccfda8f27b56", "name": "/usr/include/linux/bpf_perf_event.h", "type": "file" }, { - "bom-ref": "9f4cd921a50160b4", + "bom-ref": "cc183628f7654cd0", "name": "/usr/include/linux/bpqether.h", "type": "file" }, { - "bom-ref": "6870addf8da80de8", + "bom-ref": "a47e3c53eb4c0e98", "name": "/usr/include/linux/bsg.h", "type": "file" }, { - "bom-ref": "88707de87155e486", + "bom-ref": "59caae2c1489630e", "name": "/usr/include/linux/bt-bmc.h", "type": "file" }, { - "bom-ref": "8a147dc045491478", + "bom-ref": "c4599a7df053f320", "name": "/usr/include/linux/btf.h", "type": "file" }, { - "bom-ref": "61358b9a6d9d406d", + "bom-ref": "cb9dc85a21395ce1", "name": "/usr/include/linux/btrfs.h", "type": "file" }, { - "bom-ref": "b73661328fe01a0e", + "bom-ref": "ccb2641fec93ba96", "name": "/usr/include/linux/btrfs_tree.h", "type": "file" }, { - "bom-ref": "722ebeff745b6cea", + "bom-ref": "3beb86526dc1a502", "name": "/usr/include/linux/byteorder/big_endian.h", "type": "file" }, { - "bom-ref": "7f41a42f7a83290f", + "bom-ref": "7b7642b5b8501213", "name": "/usr/include/linux/byteorder/little_endian.h", "type": "file" }, { - "bom-ref": "e3889ef5cceddbf6", + "bom-ref": "ba9531dc67c99292", "name": "/usr/include/linux/cachefiles.h", "type": "file" }, { - "bom-ref": "9b61951ab5829b83", + "bom-ref": "069dead0b1be8e57", "name": "/usr/include/linux/caif/caif_socket.h", "type": "file" }, { - "bom-ref": "ed65ee66aa15bf4f", + "bom-ref": "2cc4d713c3c22233", "name": "/usr/include/linux/caif/if_caif.h", "type": "file" }, { - "bom-ref": "55928820ab9c248b", + "bom-ref": "4081ae6ad684a1df", "name": "/usr/include/linux/can.h", "type": "file" }, { - "bom-ref": "c46ca506ee3fb2ed", + "bom-ref": "04626e2aba886f75", "name": "/usr/include/linux/can/bcm.h", "type": "file" }, { - "bom-ref": "f33b2fe8f57227bf", + "bom-ref": "721b6520684baf07", "name": "/usr/include/linux/can/error.h", "type": "file" }, { - "bom-ref": "d4d012082c9591a7", + "bom-ref": "4601d00aae05df83", "name": "/usr/include/linux/can/gw.h", "type": "file" }, { - "bom-ref": "e690eb1e4fead416", + "bom-ref": "4d0c41324c4ff1de", "name": "/usr/include/linux/can/isotp.h", "type": "file" }, { - "bom-ref": "eb0fee513097fc5a", + "bom-ref": "7bab0b3510597bae", "name": "/usr/include/linux/can/j1939.h", "type": "file" }, { - "bom-ref": "1e7085161efdca65", + "bom-ref": "63c26fd42ad05b45", "name": "/usr/include/linux/can/netlink.h", "type": "file" }, { - "bom-ref": "017ba84c805d3c8c", + "bom-ref": "80fbd041c33fbdfc", "name": "/usr/include/linux/can/raw.h", "type": "file" }, { - "bom-ref": "f16b93ffb5ecc092", + "bom-ref": "00a0e36f9198e21a", "name": "/usr/include/linux/can/vxcan.h", "type": "file" }, { - "bom-ref": "d6fbed4407bf476b", + "bom-ref": "3a0ce47137bdd2cb", "name": "/usr/include/linux/capability.h", "type": "file" }, { - "bom-ref": "11afb902e23b2f08", + "bom-ref": "a6ab24532e907da8", "name": "/usr/include/linux/capi.h", "type": "file" }, { - "bom-ref": "1fea38a8eeb141cc", + "bom-ref": "e0d0f8c93a8cf844", "name": "/usr/include/linux/cciss_defs.h", "type": "file" }, { - "bom-ref": "9e3bbaae36e03125", + "bom-ref": "19f3d7303e9a2f41", "name": "/usr/include/linux/cciss_ioctl.h", "type": "file" }, { - "bom-ref": "249b3714c614dce1", + "bom-ref": "74e550989e7918a1", "name": "/usr/include/linux/ccs.h", "type": "file" }, { - "bom-ref": "97b0eed7e0d270d9", + "bom-ref": "db42485d9c3a2f95", "name": "/usr/include/linux/cdrom.h", "type": "file" }, { - "bom-ref": "3a9cc4d2520c977f", + "bom-ref": "67d077a2a761ec97", "name": "/usr/include/linux/cec-funcs.h", "type": "file" }, { - "bom-ref": "f4f08c019ce62915", + "bom-ref": "92b87907c4e99135", "name": "/usr/include/linux/cec.h", "type": "file" }, { - "bom-ref": "acbc9f68358da9c0", + "bom-ref": "830f438d566eaf84", "name": "/usr/include/linux/cfm_bridge.h", "type": "file" }, { - "bom-ref": "9a5af24dfd26078c", + "bom-ref": "65bdd60a4de9b818", "name": "/usr/include/linux/cgroupstats.h", "type": "file" }, { - "bom-ref": "c2a262298003660b", + "bom-ref": "310631aca55b93e3", "name": "/usr/include/linux/chio.h", "type": "file" }, { - "bom-ref": "e79231aef39b8da0", + "bom-ref": "9180056a78b0b9d4", "name": "/usr/include/linux/cifs/cifs_mount.h", "type": "file" }, { - "bom-ref": "b279dfc6c0918b2a", + "bom-ref": "be16c40d4bfd17f2", "name": "/usr/include/linux/cifs/cifs_netlink.h", "type": "file" }, { - "bom-ref": "45012dc28f8074f2", + "bom-ref": "80ce59f94e65090e", "name": "/usr/include/linux/close_range.h", "type": "file" }, { - "bom-ref": "fc3d96cc42288da1", + "bom-ref": "0e9db4148e001b49", "name": "/usr/include/linux/cn_proc.h", "type": "file" }, { - "bom-ref": "820393609555d4e6", + "bom-ref": "e855b42f258594a2", "name": "/usr/include/linux/coda.h", "type": "file" }, { - "bom-ref": "729f3597fea60f13", + "bom-ref": "00348b86aff09227", "name": "/usr/include/linux/coff.h", "type": "file" }, { - "bom-ref": "ca31c1de82a6d422", + "bom-ref": "e52e265654f27cc2", "name": "/usr/include/linux/comedi.h", "type": "file" }, { - "bom-ref": "ad2de5ab49ec2d1e", + "bom-ref": "34eaa748a337872a", "name": "/usr/include/linux/connector.h", "type": "file" }, { - "bom-ref": "2ec0d5781e164bb8", + "bom-ref": "5c04e82e63bdf8e8", "name": "/usr/include/linux/const.h", "type": "file" }, { - "bom-ref": "1ba70a35521e434b", + "bom-ref": "65867935aabbce2f", "name": "/usr/include/linux/coresight-stm.h", "type": "file" }, { - "bom-ref": "a3a880327e308df6", + "bom-ref": "52f6169b1dcd4992", "name": "/usr/include/linux/counter.h", "type": "file" }, { - "bom-ref": "846dbf9f66b1f800", + "bom-ref": "11ae4079b06ccfac", "name": "/usr/include/linux/cramfs_fs.h", "type": "file" }, { - "bom-ref": "a919d3d69949e591", + "bom-ref": "360edc52a4e567d1", "name": "/usr/include/linux/cryptouser.h", "type": "file" }, { - "bom-ref": "c24bbfdb4487cc23", + "bom-ref": "9d756147b30c6a43", "name": "/usr/include/linux/cuda.h", "type": "file" }, { - "bom-ref": "6bfbb4957a19f2c6", + "bom-ref": "27534e38c86837a6", "name": "/usr/include/linux/cxl_mem.h", "type": "file" }, { - "bom-ref": "17797357f26e8b32", + "bom-ref": "16678c35b2c41886", "name": "/usr/include/linux/cyclades.h", "type": "file" }, { - "bom-ref": "3a20cc91f860117a", + "bom-ref": "62a749fd839da54e", "name": "/usr/include/linux/cycx_cfm.h", "type": "file" }, { - "bom-ref": "32647c34435f7c73", + "bom-ref": "0f66f17f3a4719bb", "name": "/usr/include/linux/dcbnl.h", "type": "file" }, { - "bom-ref": "0683facb56c40433", + "bom-ref": "330ff5186021628f", "name": "/usr/include/linux/dccp.h", "type": "file" }, { - "bom-ref": "93026f62bd481108", + "bom-ref": "f123e612a74093d0", "name": "/usr/include/linux/devlink.h", "type": "file" }, { - "bom-ref": "de319747328bbea8", + "bom-ref": "15b15a136a02d94c", "name": "/usr/include/linux/dlm.h", "type": "file" }, { - "bom-ref": "7260ba45e72485e1", + "bom-ref": "6ff04d341bdbc4ed", "name": "/usr/include/linux/dlm_device.h", "type": "file" }, { - "bom-ref": "2eb7370b1a974833", + "bom-ref": "5b63cbb56d9a0353", "name": "/usr/include/linux/dlm_plock.h", "type": "file" }, { - "bom-ref": "f3e0ae22c03a8ec0", + "bom-ref": "88ce7f2a4ffff640", "name": "/usr/include/linux/dlmconstants.h", "type": "file" }, { - "bom-ref": "5bb80c26aca4868e", + "bom-ref": "7bc3b1825356a0c2", "name": "/usr/include/linux/dm-ioctl.h", "type": "file" }, { - "bom-ref": "3f4cbb5d4616e5d3", + "bom-ref": "8e158bb679d5ede7", "name": "/usr/include/linux/dm-log-userspace.h", "type": "file" }, { - "bom-ref": "c5faf4906a76f8e8", + "bom-ref": "ea104b92863621ec", "name": "/usr/include/linux/dma-buf.h", "type": "file" }, { - "bom-ref": "acec2ff19866d172", + "bom-ref": "e96ad969c78ba07e", "name": "/usr/include/linux/dma-heap.h", "type": "file" }, { - "bom-ref": "fe324bb790a3f8d5", + "bom-ref": "0b27e592a6aeb151", "name": "/usr/include/linux/dns_resolver.h", "type": "file" }, { - "bom-ref": "5a4c38a7a43b1741", + "bom-ref": "c5732d0c82b18a0d", "name": "/usr/include/linux/dpll.h", "type": "file" }, { - "bom-ref": "3d1b064387d464c1", + "bom-ref": "55074c50bfe2ac81", "name": "/usr/include/linux/dqblk_xfs.h", "type": "file" }, { - "bom-ref": "c1b500e9ea43f6a2", + "bom-ref": "50cd4d8af92811de", "name": "/usr/include/linux/dvb/audio.h", "type": "file" }, { - "bom-ref": "98f2a28a245cba48", + "bom-ref": "66c038d702e2dca4", "name": "/usr/include/linux/dvb/ca.h", "type": "file" }, { - "bom-ref": "15f5f0852b1290af", + "bom-ref": "632a54671b38b327", "name": "/usr/include/linux/dvb/dmx.h", "type": "file" }, { - "bom-ref": "deda9829ae595373", + "bom-ref": "5926c6c25ce28d63", "name": "/usr/include/linux/dvb/frontend.h", "type": "file" }, { - "bom-ref": "2e3894206a7a4a1f", + "bom-ref": "8d7950f8d2b30f3b", "name": "/usr/include/linux/dvb/net.h", "type": "file" }, { - "bom-ref": "ed59d73ca1b825dc", + "bom-ref": "04f6062b031cc830", "name": "/usr/include/linux/dvb/osd.h", "type": "file" }, { - "bom-ref": "561a1fac3280fbe5", + "bom-ref": "7d761270bdabf0a9", "name": "/usr/include/linux/dvb/version.h", "type": "file" }, { - "bom-ref": "eae14042728665ab", + "bom-ref": "3b42fa4a292a1147", "name": "/usr/include/linux/dvb/video.h", "type": "file" }, { - "bom-ref": "ebd1184d412912cd", + "bom-ref": "66ce0afbf21914a1", "name": "/usr/include/linux/dw100.h", "type": "file" }, { - "bom-ref": "e28a3e31ef20664a", + "bom-ref": "6e9651f00100083a", "name": "/usr/include/linux/edd.h", "type": "file" }, { - "bom-ref": "9bd5b05eb6e671e9", + "bom-ref": "970448ff639361d5", "name": "/usr/include/linux/efs_fs_sb.h", "type": "file" }, { - "bom-ref": "a0188980e472838c", + "bom-ref": "5ab0f5ef2b732164", "name": "/usr/include/linux/elf-em.h", "type": "file" }, { - "bom-ref": "0a1592e4a22d150c", + "bom-ref": "d73459459e147ed4", "name": "/usr/include/linux/elf-fdpic.h", "type": "file" }, { - "bom-ref": "dd578f54a71ee854", + "bom-ref": "995562a8a3052398", "name": "/usr/include/linux/elf.h", "type": "file" }, { - "bom-ref": "147015030d8aa276", + "bom-ref": "4c803c0e526d07b2", "name": "/usr/include/linux/errno.h", "type": "file" }, { - "bom-ref": "aadda9d830049889", + "bom-ref": "6ac537af6d656539", "name": "/usr/include/linux/errqueue.h", "type": "file" }, { - "bom-ref": "d1a01b290ab2b9b9", + "bom-ref": "32d44380252ea901", "name": "/usr/include/linux/erspan.h", "type": "file" }, { - "bom-ref": "ac35b1400a7225b3", + "bom-ref": "f10f731ece85d32f", "name": "/usr/include/linux/ethtool.h", "type": "file" }, { - "bom-ref": "375092072b12ef48", + "bom-ref": "255ca1f8a0f98bc4", "name": "/usr/include/linux/ethtool_netlink.h", "type": "file" }, { - "bom-ref": "ccb6f15df03cfdc9", + "bom-ref": "fa7bdec2452c219d", "name": "/usr/include/linux/eventfd.h", "type": "file" }, { - "bom-ref": "4fd042055ed36188", + "bom-ref": "e19450bf0df104c8", "name": "/usr/include/linux/eventpoll.h", "type": "file" }, { - "bom-ref": "a3cb646f047ca2d6", + "bom-ref": "6c5eb24c00fffb66", "name": "/usr/include/linux/ext4.h", "type": "file" }, { - "bom-ref": "62ce4b0aab0f3b80", + "bom-ref": "12cbf85ca627dd20", "name": "/usr/include/linux/f2fs.h", "type": "file" }, { - "bom-ref": "31ac029bfcb9e174", + "bom-ref": "cac68cc9ec36992c", "name": "/usr/include/linux/fadvise.h", "type": "file" }, { - "bom-ref": "4771031516185b6a", + "bom-ref": "ec7bfcdf76fb08ea", "name": "/usr/include/linux/falloc.h", "type": "file" }, { - "bom-ref": "aa5c6016caf93b29", + "bom-ref": "197d4cef6fc1cf71", "name": "/usr/include/linux/fanotify.h", "type": "file" }, { - "bom-ref": "6e4ff4b69dd12c77", + "bom-ref": "dad5e0e4162c72ff", "name": "/usr/include/linux/fb.h", "type": "file" }, { - "bom-ref": "02e21d896558fd9c", + "bom-ref": "24eb15d8e1045888", "name": "/usr/include/linux/fcntl.h", "type": "file" }, { - "bom-ref": "115047cb73c1aced", + "bom-ref": "fd7d0f08efaaedad", "name": "/usr/include/linux/fd.h", "type": "file" }, { - "bom-ref": "1380a0423add3ab7", + "bom-ref": "636b0d92d1f767ef", "name": "/usr/include/linux/fdreg.h", "type": "file" }, { - "bom-ref": "9ca862420a142c47", + "bom-ref": "37d1487a69886bff", "name": "/usr/include/linux/fib_rules.h", "type": "file" }, { - "bom-ref": "1f37b5bdedddff27", + "bom-ref": "fb897e89bdf0eaa3", "name": "/usr/include/linux/fiemap.h", "type": "file" }, { - "bom-ref": "f23090b350843afd", + "bom-ref": "52b65e994ea35671", "name": "/usr/include/linux/filter.h", "type": "file" }, { - "bom-ref": "1db6392fe4b60b47", + "bom-ref": "746f47c0b65c1c27", "name": "/usr/include/linux/firewire-cdev.h", "type": "file" }, { - "bom-ref": "982621a9c6480346", + "bom-ref": "84cf220892ba12b6", "name": "/usr/include/linux/firewire-constants.h", "type": "file" }, { - "bom-ref": "e1da47adba694df2", + "bom-ref": "2aec7604a179c0d2", "name": "/usr/include/linux/fou.h", "type": "file" }, { - "bom-ref": "dbeea546b5deca24", + "bom-ref": "5a3f833d89bbf470", "name": "/usr/include/linux/fpga-dfl.h", "type": "file" }, { - "bom-ref": "c8b383beef26d12a", + "bom-ref": "a84311757b92cf72", "name": "/usr/include/linux/fs.h", "type": "file" }, { - "bom-ref": "2b79cf64ae034d2f", + "bom-ref": "283054446ea3f22b", "name": "/usr/include/linux/fscrypt.h", "type": "file" }, { - "bom-ref": "3a25f57576692f4f", + "bom-ref": "18e7c494104461f7", "name": "/usr/include/linux/fsi.h", "type": "file" }, { - "bom-ref": "a3c703f9d0a85a09", + "bom-ref": "926fcfded72309d1", "name": "/usr/include/linux/fsl_hypervisor.h", "type": "file" }, { - "bom-ref": "eaa2c068f06d365a", + "bom-ref": "893bd763d3978846", "name": "/usr/include/linux/fsl_mc.h", "type": "file" }, { - "bom-ref": "506f17500fffe3c1", + "bom-ref": "5aa6b7aaf5825ac1", "name": "/usr/include/linux/fsmap.h", "type": "file" }, { - "bom-ref": "bc9ca0acdc076f14", + "bom-ref": "c1b1f793b08e2154", "name": "/usr/include/linux/fsverity.h", "type": "file" }, { - "bom-ref": "2c36892219c1a16c", + "bom-ref": "bf335a853a5a8dbc", "name": "/usr/include/linux/fuse.h", "type": "file" }, { - "bom-ref": "2acf0edd9762bcee", + "bom-ref": "6a0009c4324edf4a", "name": "/usr/include/linux/futex.h", "type": "file" }, { - "bom-ref": "ac63a44288210e00", + "bom-ref": "80401d7245bf11f8", "name": "/usr/include/linux/gameport.h", "type": "file" }, { - "bom-ref": "4e8edc8c6907450f", + "bom-ref": "4da0f77b379e0e8b", "name": "/usr/include/linux/gen_stats.h", "type": "file" }, { - "bom-ref": "fbb419f4ba6d89d2", + "bom-ref": "8283a8624ad143ae", "name": "/usr/include/linux/genetlink.h", "type": "file" }, { - "bom-ref": "004423681e9430fa", + "bom-ref": "6c1255b844876a46", "name": "/usr/include/linux/genwqe/genwqe_card.h", "type": "file" }, { - "bom-ref": "4c541d2c9754569c", + "bom-ref": "a221a7b0825af16c", "name": "/usr/include/linux/gfs2_ondisk.h", "type": "file" }, { - "bom-ref": "ac32f0730d4b0253", + "bom-ref": "4ade7b849af3c03f", "name": "/usr/include/linux/gpio.h", "type": "file" }, { - "bom-ref": "56544add2d1b8abd", + "bom-ref": "23f40795a6f211dd", "name": "/usr/include/linux/gsmmux.h", "type": "file" }, { - "bom-ref": "bec780149d2ae270", + "bom-ref": "78a17a705ab12698", "name": "/usr/include/linux/gtp.h", "type": "file" }, { - "bom-ref": "e7821d8e39c5c2cf", + "bom-ref": "102cf6f16cc79c93", "name": "/usr/include/linux/handshake.h", "type": "file" }, { - "bom-ref": "17d3b57012f91cf8", + "bom-ref": "42ce86d0b99f4f94", "name": "/usr/include/linux/hash_info.h", "type": "file" }, { - "bom-ref": "7df4dab4b0aca95e", + "bom-ref": "0c23e2b57505943a", "name": "/usr/include/linux/hdlc.h", "type": "file" }, { - "bom-ref": "b85dd4c9693008b6", + "bom-ref": "51b3590b957b0a7e", "name": "/usr/include/linux/hdlc/ioctl.h", "type": "file" }, { - "bom-ref": "523e443bb97251b2", + "bom-ref": "7da17e2bd85931e2", "name": "/usr/include/linux/hdlcdrv.h", "type": "file" }, { - "bom-ref": "3474690cfe4a7890", + "bom-ref": "dc84767db17d21ac", "name": "/usr/include/linux/hdreg.h", "type": "file" }, { - "bom-ref": "1c4170fa2bb024f4", + "bom-ref": "06107ab507dd8134", "name": "/usr/include/linux/hid.h", "type": "file" }, { - "bom-ref": "16a2ea2abeb6fe8a", + "bom-ref": "0d529ae02c6b0a5e", "name": "/usr/include/linux/hiddev.h", "type": "file" }, { - "bom-ref": "1a7730757887262f", + "bom-ref": "c05537a5ab6b502f", "name": "/usr/include/linux/hidraw.h", "type": "file" }, { - "bom-ref": "b069f1d7fa7ee386", + "bom-ref": "6ddf60d7258681a6", "name": "/usr/include/linux/hpet.h", "type": "file" }, { - "bom-ref": "53ddef7f575a934d", + "bom-ref": "3ab514126cb8b051", "name": "/usr/include/linux/hsi/cs-protocol.h", "type": "file" }, { - "bom-ref": "68470f705d8e764a", + "bom-ref": "2cc608273bc4f096", "name": "/usr/include/linux/hsi/hsi_char.h", "type": "file" }, { - "bom-ref": "cbef0ac22d7ba10e", + "bom-ref": "430a48e519b654fa", "name": "/usr/include/linux/hsr_netlink.h", "type": "file" }, { - "bom-ref": "bb78a9833252080a", + "bom-ref": "89df081db428bc2e", "name": "/usr/include/linux/hw_breakpoint.h", "type": "file" }, { - "bom-ref": "bc782bd81e2526dd", + "bom-ref": "06c63a063c6d5269", "name": "/usr/include/linux/hyperv.h", "type": "file" }, { - "bom-ref": "e4b5314f386027ce", + "bom-ref": "6d878bf593092d0a", "name": "/usr/include/linux/i2c-dev.h", "type": "file" }, { - "bom-ref": "f5e1613e541b873b", + "bom-ref": "9c2a6e37ce602a0b", "name": "/usr/include/linux/i2c.h", "type": "file" }, { - "bom-ref": "edbcf43f2283245d", + "bom-ref": "f69587c25c399559", "name": "/usr/include/linux/i2o-dev.h", "type": "file" }, { - "bom-ref": "0614c61393f736e4", + "bom-ref": "63f508f2a1df989c", "name": "/usr/include/linux/i8k.h", "type": "file" }, { - "bom-ref": "fa33c0161a9dfdc6", + "bom-ref": "3c81785b23d69ffa", "name": "/usr/include/linux/icmp.h", "type": "file" }, { - "bom-ref": "0f5e0b83046c674c", + "bom-ref": "63524926a6eae2b4", "name": "/usr/include/linux/icmpv6.h", "type": "file" }, { - "bom-ref": "677db283b3e3546a", + "bom-ref": "91b8ecb70561847e", "name": "/usr/include/linux/idxd.h", "type": "file" }, { - "bom-ref": "4d9bdcf005a62d15", + "bom-ref": "a4476e2e4bef3d7d", "name": "/usr/include/linux/if.h", "type": "file" }, { - "bom-ref": "3b1ba8c011dcf9a7", + "bom-ref": "605b8c0e8d5d4d83", "name": "/usr/include/linux/if_addr.h", "type": "file" }, { - "bom-ref": "35add958d70c20d1", + "bom-ref": "23879f88b3a9e261", "name": "/usr/include/linux/if_addrlabel.h", "type": "file" }, { - "bom-ref": "9c47cd2cfea6f9fd", + "bom-ref": "cf3aaeb73ac03539", "name": "/usr/include/linux/if_alg.h", "type": "file" }, { - "bom-ref": "2b604db3b3a81132", + "bom-ref": "47714491222b7986", "name": "/usr/include/linux/if_arcnet.h", "type": "file" }, { - "bom-ref": "d90e933849042e2a", + "bom-ref": "4bd6a6b6d2f2e1e6", "name": "/usr/include/linux/if_arp.h", "type": "file" }, { - "bom-ref": "0389e1d3004a5261", + "bom-ref": "166335060d135355", "name": "/usr/include/linux/if_bonding.h", "type": "file" }, { - "bom-ref": "2d3fd65d30bff900", + "bom-ref": "af198bb58c558a24", "name": "/usr/include/linux/if_bridge.h", "type": "file" }, { - "bom-ref": "c8fca9c9866d4afa", + "bom-ref": "9061211f7dde4156", "name": "/usr/include/linux/if_cablemodem.h", "type": "file" }, { - "bom-ref": "218bac4c0fa33524", + "bom-ref": "7563465f89c1b978", "name": "/usr/include/linux/if_eql.h", "type": "file" }, { - "bom-ref": "8d63cd14fb6622f9", + "bom-ref": "37d8aaf8e5e21c65", "name": "/usr/include/linux/if_ether.h", "type": "file" }, { - "bom-ref": "3c16be431f1c7af1", + "bom-ref": "db4d0dcf9f11ca11", "name": "/usr/include/linux/if_fc.h", "type": "file" }, { - "bom-ref": "34c8ac3375ef6c08", + "bom-ref": "c5d4b9fac2c699b4", "name": "/usr/include/linux/if_fddi.h", "type": "file" }, { - "bom-ref": "bf9ed8d782d6e090", + "bom-ref": "bd09f7189cf5b898", "name": "/usr/include/linux/if_hippi.h", "type": "file" }, { - "bom-ref": "0a0e96bf76f84a32", + "bom-ref": "b6343edd7b1167ee", "name": "/usr/include/linux/if_infiniband.h", "type": "file" }, { - "bom-ref": "b1207b7bb4e07631", + "bom-ref": "71a3bd6b9cb154b1", "name": "/usr/include/linux/if_link.h", "type": "file" }, { - "bom-ref": "f4b7f861505993b0", + "bom-ref": "37b39d9acaa2b9c0", "name": "/usr/include/linux/if_ltalk.h", "type": "file" }, { - "bom-ref": "e077870210ab9059", + "bom-ref": "f4665d0360b1c2d9", "name": "/usr/include/linux/if_macsec.h", "type": "file" }, { - "bom-ref": "457108fdc484ad3e", + "bom-ref": "67e97c9575af2c76", "name": "/usr/include/linux/if_packet.h", "type": "file" }, { - "bom-ref": "bd8412f00a80896a", + "bom-ref": "ef77140e8ac2140a", "name": "/usr/include/linux/if_phonet.h", "type": "file" }, { - "bom-ref": "eed42471016d37d7", + "bom-ref": "c56c71faad19afe3", "name": "/usr/include/linux/if_plip.h", "type": "file" }, { - "bom-ref": "b68992c7a031de5a", + "bom-ref": "0c2f969088b2c81e", "name": "/usr/include/linux/if_ppp.h", "type": "file" }, { - "bom-ref": "ff3463506c0cceb6", + "bom-ref": "0b4ad4f0c6aa75e6", "name": "/usr/include/linux/if_pppol2tp.h", "type": "file" }, { - "bom-ref": "8cd8547e16aec19c", + "bom-ref": "66f8abdb5611a298", "name": "/usr/include/linux/if_pppox.h", "type": "file" }, { - "bom-ref": "c3f92dfa89e54031", + "bom-ref": "37d9e76c26c70e9d", "name": "/usr/include/linux/if_slip.h", "type": "file" }, { - "bom-ref": "ce4c1ba0a9f17aa0", + "bom-ref": "34e2b0fe482fb970", "name": "/usr/include/linux/if_team.h", "type": "file" }, { - "bom-ref": "40ac2cfc6920f5b6", + "bom-ref": "86767f3a563f52f2", "name": "/usr/include/linux/if_tun.h", "type": "file" }, { - "bom-ref": "bd297058c86edee7", + "bom-ref": "366a8d2aab2c9c2b", "name": "/usr/include/linux/if_tunnel.h", "type": "file" }, { - "bom-ref": "85c87fdb3428279c", + "bom-ref": "4dbfcd0ee75378b4", "name": "/usr/include/linux/if_vlan.h", "type": "file" }, { - "bom-ref": "ee20740da423ff81", + "bom-ref": "3f4acc4a05cfde1d", "name": "/usr/include/linux/if_x25.h", "type": "file" }, { - "bom-ref": "36f77c53a9c7d8e0", + "bom-ref": "4d949e34836a20a4", "name": "/usr/include/linux/if_xdp.h", "type": "file" }, { - "bom-ref": "3610fedda636b440", + "bom-ref": "14034c52474993e8", "name": "/usr/include/linux/ife.h", "type": "file" }, { - "bom-ref": "6d7d9804960413a2", + "bom-ref": "464a9e05f63b09b6", "name": "/usr/include/linux/igmp.h", "type": "file" }, { - "bom-ref": "7702c7ab763e56ae", + "bom-ref": "eb4716204af43b12", "name": "/usr/include/linux/iio/buffer.h", "type": "file" }, { - "bom-ref": "69ab06dcc8f33c44", + "bom-ref": "0573b48af9e5c224", "name": "/usr/include/linux/iio/events.h", "type": "file" }, { - "bom-ref": "e9f7b4a7a7de6948", + "bom-ref": "33afa3055d9df1ec", "name": "/usr/include/linux/iio/types.h", "type": "file" }, { - "bom-ref": "124743c840c43965", + "bom-ref": "2cf4ae87a5fe977d", "name": "/usr/include/linux/ila.h", "type": "file" }, { - "bom-ref": "ab014903ad917f2c", + "bom-ref": "87c6d7020a50e4d0", "name": "/usr/include/linux/in.h", "type": "file" }, { - "bom-ref": "249a7ec25737282e", + "bom-ref": "1ba6710117a40942", "name": "/usr/include/linux/in6.h", "type": "file" }, { - "bom-ref": "64a33e93c91eecf6", + "bom-ref": "b153e45f2ebc0622", "name": "/usr/include/linux/in_route.h", "type": "file" }, { - "bom-ref": "4e77f33dfd8b37c5", + "bom-ref": "f9af54b2128786bd", "name": "/usr/include/linux/inet_diag.h", "type": "file" }, { - "bom-ref": "a9b14300275e723a", + "bom-ref": "387d6a8d95d1ab52", "name": "/usr/include/linux/inotify.h", "type": "file" }, { - "bom-ref": "0e35c1a3ceca5e7f", + "bom-ref": "ffc7f3084f6b7a2f", "name": "/usr/include/linux/input-event-codes.h", "type": "file" }, { - "bom-ref": "2cea82e505d2812c", + "bom-ref": "bc70bf95227d48b0", "name": "/usr/include/linux/input.h", "type": "file" }, { - "bom-ref": "0b2ca73a82762984", + "bom-ref": "537fc22535f5266c", "name": "/usr/include/linux/io_uring.h", "type": "file" }, { - "bom-ref": "3705de1b545fa222", + "bom-ref": "f62720cac0acd5d2", "name": "/usr/include/linux/ioam6.h", "type": "file" }, { - "bom-ref": "40ba413c2f4d0bce", + "bom-ref": "976dc12c43e0c78a", "name": "/usr/include/linux/ioam6_genl.h", "type": "file" }, { - "bom-ref": "9be12b97ba0b7b81", + "bom-ref": "7ffa950f2a86dfcd", "name": "/usr/include/linux/ioam6_iptunnel.h", "type": "file" }, { - "bom-ref": "d7a9d7e5dd586353", + "bom-ref": "50f19640dfa073af", "name": "/usr/include/linux/ioctl.h", "type": "file" }, { - "bom-ref": "e88181c39e33e365", + "bom-ref": "d08c46900e496529", "name": "/usr/include/linux/iommu.h", "type": "file" }, { - "bom-ref": "7f7a6bb58046b9e5", + "bom-ref": "f81572e0e5c11c7d", "name": "/usr/include/linux/iommufd.h", "type": "file" }, { - "bom-ref": "828ef3b5b7fe9949", + "bom-ref": "e1cecd949dccdea9", "name": "/usr/include/linux/ioprio.h", "type": "file" }, { - "bom-ref": "84e6bd3bf0db7595", + "bom-ref": "9877ee6fc6d79369", "name": "/usr/include/linux/ip.h", "type": "file" }, { - "bom-ref": "d8ea71422bf1b636", + "bom-ref": "4484500481ccea12", "name": "/usr/include/linux/ip6_tunnel.h", "type": "file" }, { - "bom-ref": "961e983ea4c92a4a", + "bom-ref": "3e1566d60668d74e", "name": "/usr/include/linux/ip_vs.h", "type": "file" }, { - "bom-ref": "5b975b0755752327", + "bom-ref": "6795285ace633edf", "name": "/usr/include/linux/ipc.h", "type": "file" }, { - "bom-ref": "dbd7c8668cf54334", + "bom-ref": "b5efdb8553ac8204", "name": "/usr/include/linux/ipmi.h", "type": "file" }, { - "bom-ref": "3421b2e5137c5c87", + "bom-ref": "b489c3b5bdeb098f", "name": "/usr/include/linux/ipmi_bmc.h", "type": "file" }, { - "bom-ref": "d1c87cbeb73623dd", + "bom-ref": "e488e8235f267dc9", "name": "/usr/include/linux/ipmi_msgdefs.h", "type": "file" }, { - "bom-ref": "670905ff26ba8f62", + "bom-ref": "affd862848ccb586", "name": "/usr/include/linux/ipmi_ssif_bmc.h", "type": "file" }, { - "bom-ref": "ff208436e265cc29", + "bom-ref": "fcd518ca878295b5", "name": "/usr/include/linux/ipsec.h", "type": "file" }, { - "bom-ref": "147481241da15a4b", + "bom-ref": "99c491b2066091f3", "name": "/usr/include/linux/ipv6.h", "type": "file" }, { - "bom-ref": "fb3a20af4e0b75af", + "bom-ref": "7f882d584fd41b5f", "name": "/usr/include/linux/ipv6_route.h", "type": "file" }, { - "bom-ref": "ccad83d85097dd34", + "bom-ref": "d0b0ef2f5ab71ed0", "name": "/usr/include/linux/irqnr.h", "type": "file" }, { - "bom-ref": "401caebd059a1f73", + "bom-ref": "4a84596c5a6021a7", "name": "/usr/include/linux/isdn/capicmd.h", "type": "file" }, { - "bom-ref": "68be372c2829a316", + "bom-ref": "99a0ae6e73c92e9e", "name": "/usr/include/linux/iso_fs.h", "type": "file" }, { - "bom-ref": "a30e7bf72e54250c", + "bom-ref": "60d08876c11bb634", "name": "/usr/include/linux/isst_if.h", "type": "file" }, { - "bom-ref": "48f4cfdfb685e892", + "bom-ref": "0c69ece45a40316a", "name": "/usr/include/linux/ivtv.h", "type": "file" }, { - "bom-ref": "efbc934e8c9cb48a", + "bom-ref": "4bb970d1735637ca", "name": "/usr/include/linux/ivtvfb.h", "type": "file" }, { - "bom-ref": "54c8ebbd5c94f3ef", + "bom-ref": "b40f405bfed7170b", "name": "/usr/include/linux/jffs2.h", "type": "file" }, { - "bom-ref": "6b9e2c33e5a4ceb9", + "bom-ref": "661cc9cbee986e75", "name": "/usr/include/linux/joystick.h", "type": "file" }, { - "bom-ref": "da5741cd7d75d87e", + "bom-ref": "3a9b4aeb527ab816", "name": "/usr/include/linux/kcm.h", "type": "file" }, { - "bom-ref": "cd58e7599638a189", + "bom-ref": "49eccf7c37f614a9", "name": "/usr/include/linux/kcmp.h", "type": "file" }, { - "bom-ref": "37d3ae5d6d0d50d8", + "bom-ref": "483d99dd644384d4", "name": "/usr/include/linux/kcov.h", "type": "file" }, { - "bom-ref": "8d03bdcdff56fa4f", + "bom-ref": "68d7c1c36fcf230b", "name": "/usr/include/linux/kd.h", "type": "file" }, { - "bom-ref": "7af678032d971890", + "bom-ref": "3e63f28a1c21e7b4", "name": "/usr/include/linux/kdev_t.h", "type": "file" }, { - "bom-ref": "14fa5c2a99c84f69", + "bom-ref": "f92e6f648c393471", "name": "/usr/include/linux/kernel-page-flags.h", "type": "file" }, { - "bom-ref": "9edc98588df9ddf0", + "bom-ref": "6a1b204b2affd9f4", "name": "/usr/include/linux/kernel.h", "type": "file" }, { - "bom-ref": "f8562e7b3661cc4c", + "bom-ref": "ee03ef5257b36760", "name": "/usr/include/linux/kernelcapi.h", "type": "file" }, { - "bom-ref": "c8070081a04c8eb0", + "bom-ref": "6a33f17de4cfb3e8", "name": "/usr/include/linux/kexec.h", "type": "file" }, { - "bom-ref": "5cf0fa1147d34171", + "bom-ref": "689f09b96841b3e9", "name": "/usr/include/linux/keyboard.h", "type": "file" }, { - "bom-ref": "a3db86fcc793ed1a", + "bom-ref": "7fa843c7a0ad2606", "name": "/usr/include/linux/keyctl.h", "type": "file" }, { - "bom-ref": "efb74aff84edc372", + "bom-ref": "c067ac193b415896", "name": "/usr/include/linux/kfd_ioctl.h", "type": "file" }, { - "bom-ref": "5b344276a1b57b48", + "bom-ref": "8c5f3df097908f58", "name": "/usr/include/linux/kfd_sysfs.h", "type": "file" }, { - "bom-ref": "2beb1e81a01ea25f", + "bom-ref": "2f31aeb34b6569cf", "name": "/usr/include/linux/kvm.h", "type": "file" }, { - "bom-ref": "32ab968dd575dd01", + "bom-ref": "2f514569e2487549", "name": "/usr/include/linux/kvm_para.h", "type": "file" }, { - "bom-ref": "e3883364ab308959", + "bom-ref": "802f2970c2d3e7e5", "name": "/usr/include/linux/l2tp.h", "type": "file" }, { - "bom-ref": "3e9e7b773456a8ac", + "bom-ref": "57c5245b93946cb8", "name": "/usr/include/linux/landlock.h", "type": "file" }, { - "bom-ref": "d1880f7c4ddb2ba4", + "bom-ref": "9ca0321a7cf95ea8", "name": "/usr/include/linux/libc-compat.h", "type": "file" }, { - "bom-ref": "c1f4c02bdee3f75e", + "bom-ref": "31e0bfb03f45270e", "name": "/usr/include/linux/limits.h", "type": "file" }, { - "bom-ref": "20cdd0d59541341f", + "bom-ref": "aa89ecf81818ef5b", "name": "/usr/include/linux/lirc.h", "type": "file" }, { - "bom-ref": "3cc1c23cb5b90725", + "bom-ref": "f17453f4976e3c45", "name": "/usr/include/linux/llc.h", "type": "file" }, { - "bom-ref": "270b322c5917b0c2", + "bom-ref": "e50a649a7f06599a", "name": "/usr/include/linux/loadpin.h", "type": "file" }, { - "bom-ref": "d40c73ac563d5011", + "bom-ref": "749e152c2a605211", "name": "/usr/include/linux/loop.h", "type": "file" }, { - "bom-ref": "de749c0deacb01f8", + "bom-ref": "f00e41e7ef392b00", "name": "/usr/include/linux/lp.h", "type": "file" }, { - "bom-ref": "6a9d7c5382e61d9f", + "bom-ref": "fb85e578936291ab", "name": "/usr/include/linux/lsm.h", "type": "file" }, { - "bom-ref": "0103543e7dfc05cd", + "bom-ref": "82e8c4d9b19ed27d", "name": "/usr/include/linux/lwtunnel.h", "type": "file" }, { - "bom-ref": "085c8316a99e65a4", + "bom-ref": "de221a8fbf3272c0", "name": "/usr/include/linux/magic.h", "type": "file" }, { - "bom-ref": "e0fd1469a7373978", + "bom-ref": "31c8bc88abd6a7f8", "name": "/usr/include/linux/major.h", "type": "file" }, { - "bom-ref": "77ec9e5bbea3ef42", + "bom-ref": "4feb61a7cb76e39e", "name": "/usr/include/linux/map_to_14segment.h", "type": "file" }, { - "bom-ref": "58e61fb629d0f943", + "bom-ref": "4af28db0137a69cf", "name": "/usr/include/linux/map_to_7segment.h", "type": "file" }, { - "bom-ref": "4620448031aa1913", + "bom-ref": "0054b838932e09e7", "name": "/usr/include/linux/matroxfb.h", "type": "file" }, { - "bom-ref": "e338f7e3f39d9dd9", + "bom-ref": "0b6824462923f181", "name": "/usr/include/linux/max2175.h", "type": "file" }, { - "bom-ref": "0fdb121bb7ab5a3b", + "bom-ref": "1fa6d099cd25130b", "name": "/usr/include/linux/mctp.h", "type": "file" }, { - "bom-ref": "c744541f6cdf2d48", + "bom-ref": "9c88685097f2756c", "name": "/usr/include/linux/mdio.h", "type": "file" }, { - "bom-ref": "35646abfb2ad9ffa", + "bom-ref": "ea37b1102856004e", "name": "/usr/include/linux/media-bus-format.h", "type": "file" }, { - "bom-ref": "4a3cf45008accc20", + "bom-ref": "70bda9a30b4dcfc8", "name": "/usr/include/linux/media.h", "type": "file" }, { - "bom-ref": "5312874bcede236b", + "bom-ref": "acad21c3985257e7", "name": "/usr/include/linux/mei.h", "type": "file" }, { - "bom-ref": "6d6a1fb8c6160215", + "bom-ref": "6844bdd746ac94ed", "name": "/usr/include/linux/mei_uuid.h", "type": "file" }, { - "bom-ref": "c04cf367e7c7f3c9", + "bom-ref": "76abf4f09d7b0b0d", "name": "/usr/include/linux/membarrier.h", "type": "file" }, { - "bom-ref": "d308f88a806229ad", + "bom-ref": "70ecf8f7b156713d", "name": "/usr/include/linux/memfd.h", "type": "file" }, { - "bom-ref": "7b9f5cf18e703fe0", + "bom-ref": "45e51e949e86eb9c", "name": "/usr/include/linux/mempolicy.h", "type": "file" }, { - "bom-ref": "bda3397273dad0dd", + "bom-ref": "3e5e63a2e14d6ac9", "name": "/usr/include/linux/mii.h", "type": "file" }, { - "bom-ref": "d5068c64a64d5781", + "bom-ref": "334ef0988b4f9ee9", "name": "/usr/include/linux/minix_fs.h", "type": "file" }, { - "bom-ref": "9becc055cca3a0ab", + "bom-ref": "e2c55c1ae37a4a4b", "name": "/usr/include/linux/misc/bcm_vk.h", "type": "file" }, { - "bom-ref": "ecedbfb461b79dc0", + "bom-ref": "2b94ebcd02ec6e68", "name": "/usr/include/linux/mman.h", "type": "file" }, { - "bom-ref": "9be544bfa0fd2f3c", + "bom-ref": "f3954e306e10f8ec", "name": "/usr/include/linux/mmc/ioctl.h", "type": "file" }, { - "bom-ref": "17438b53fa569620", + "bom-ref": "db7224acfa39630c", "name": "/usr/include/linux/mmtimer.h", "type": "file" }, { - "bom-ref": "ec565eb31d757120", + "bom-ref": "028e1349f265c184", "name": "/usr/include/linux/module.h", "type": "file" }, { - "bom-ref": "248b193854e795a1", + "bom-ref": "c6732f815ebe1fa9", "name": "/usr/include/linux/mount.h", "type": "file" }, { - "bom-ref": "5d797a13de6b394e", + "bom-ref": "a6ec78197d26fc4a", "name": "/usr/include/linux/mpls.h", "type": "file" }, { - "bom-ref": "e51bbb3cdd7a630b", + "bom-ref": "0c5715e4a441e15f", "name": "/usr/include/linux/mpls_iptunnel.h", "type": "file" }, { - "bom-ref": "be4d58ce6c443a1c", + "bom-ref": "9db715d691eabf50", "name": "/usr/include/linux/mptcp.h", "type": "file" }, { - "bom-ref": "988c1838d0ba0561", + "bom-ref": "f9a2818d690730dd", "name": "/usr/include/linux/mptcp_pm.h", "type": "file" }, { - "bom-ref": "97cf6034471cb56a", + "bom-ref": "cc0946e00d561332", "name": "/usr/include/linux/mqueue.h", "type": "file" }, { - "bom-ref": "e2c3ebe8adb7dc7c", + "bom-ref": "2f86beb9e7ce7e64", "name": "/usr/include/linux/mroute.h", "type": "file" }, { - "bom-ref": "a4d59b17cd8abd79", + "bom-ref": "91eb84078db61755", "name": "/usr/include/linux/mroute6.h", "type": "file" }, { - "bom-ref": "eba0b0691920b72f", + "bom-ref": "9d57625544eb6b57", "name": "/usr/include/linux/mrp_bridge.h", "type": "file" }, { - "bom-ref": "75b0c92c2259f36d", + "bom-ref": "4335cba3aa008dad", "name": "/usr/include/linux/msdos_fs.h", "type": "file" }, { - "bom-ref": "52464795559a9708", + "bom-ref": "63a1c0f86052fa2c", "name": "/usr/include/linux/msg.h", "type": "file" }, { - "bom-ref": "e8c7bd0c90dfe90f", + "bom-ref": "3c36677a9948949f", "name": "/usr/include/linux/mtio.h", "type": "file" }, { - "bom-ref": "f292e4eafcec1e15", + "bom-ref": "454e8fea63adb731", "name": "/usr/include/linux/nbd-netlink.h", "type": "file" }, { - "bom-ref": "b9fab360afe67b55", + "bom-ref": "6832fc213d5a2829", "name": "/usr/include/linux/nbd.h", "type": "file" }, { - "bom-ref": "778753713ee2f8e9", + "bom-ref": "1dd68b9111c16319", "name": "/usr/include/linux/ncsi.h", "type": "file" }, { - "bom-ref": "89811f0833cc30d6", + "bom-ref": "3b0ddf1565f12be6", "name": "/usr/include/linux/ndctl.h", "type": "file" }, { - "bom-ref": "9d97360511f8d678", + "bom-ref": "bcbf3d6fc7037c2c", "name": "/usr/include/linux/neighbour.h", "type": "file" }, { - "bom-ref": "9835b53fa0d9ea6e", + "bom-ref": "daee22350593ae2e", "name": "/usr/include/linux/net.h", "type": "file" }, { - "bom-ref": "56d7e223e3e3db37", + "bom-ref": "0d4c662661b595b7", "name": "/usr/include/linux/net_dropmon.h", "type": "file" }, { - "bom-ref": "1965addf5bc53718", + "bom-ref": "7820932e8464f7ac", "name": "/usr/include/linux/net_namespace.h", "type": "file" }, { - "bom-ref": "41ce8e0357e112df", + "bom-ref": "5427af94bdd75507", "name": "/usr/include/linux/net_tstamp.h", "type": "file" }, { - "bom-ref": "77e844467fd69abb", + "bom-ref": "df81a4f6f760fabb", "name": "/usr/include/linux/netconf.h", "type": "file" }, { - "bom-ref": "b8ce50fc4ee2cac9", + "bom-ref": "1f996cb5d16b849d", "name": "/usr/include/linux/netdev.h", "type": "file" }, { - "bom-ref": "e56ed965ecfd1dfc", + "bom-ref": "806fd44ee70b7984", "name": "/usr/include/linux/netdevice.h", "type": "file" }, { - "bom-ref": "75367745f9c68a54", + "bom-ref": "4ce0a148de955984", "name": "/usr/include/linux/netfilter.h", "type": "file" }, { - "bom-ref": "6b543342dc2b618e", + "bom-ref": "3329b9b4692ad846", "name": "/usr/include/linux/netfilter/ipset/ip_set.h", "type": "file" }, { - "bom-ref": "754a26426db29d3d", + "bom-ref": "0ef099f826562909", "name": "/usr/include/linux/netfilter/ipset/ip_set_bitmap.h", "type": "file" }, { - "bom-ref": "6f48dfb9b5d95426", + "bom-ref": "c8ef941e622555fe", "name": "/usr/include/linux/netfilter/ipset/ip_set_hash.h", "type": "file" }, { - "bom-ref": "173d68d66f5a75d8", + "bom-ref": "c5ac4c33b4588740", "name": "/usr/include/linux/netfilter/ipset/ip_set_list.h", "type": "file" }, { - "bom-ref": "afb8ce2cf51580e6", + "bom-ref": "d46ce4e112558dde", "name": "/usr/include/linux/netfilter/nf_conntrack_common.h", "type": "file" }, { - "bom-ref": "e1dfa25bfd0dc64e", + "bom-ref": "5cc4bdcc6a98e98a", "name": "/usr/include/linux/netfilter/nf_conntrack_ftp.h", "type": "file" }, { - "bom-ref": "fa09c398d0f59255", + "bom-ref": "882f4509ad48eddd", "name": "/usr/include/linux/netfilter/nf_conntrack_sctp.h", "type": "file" }, { - "bom-ref": "7126f94192219a11", + "bom-ref": "59c059b7b5a0921d", "name": "/usr/include/linux/netfilter/nf_conntrack_tcp.h", "type": "file" }, { - "bom-ref": "56042505c4b4cbeb", + "bom-ref": "30d80bffb0e451ef", "name": "/usr/include/linux/netfilter/nf_conntrack_tuple_common.h", "type": "file" }, { - "bom-ref": "39381a8495af5be6", + "bom-ref": "3375f4f4d36e6dce", "name": "/usr/include/linux/netfilter/nf_log.h", "type": "file" }, { - "bom-ref": "a99eecde4ef3ca7b", + "bom-ref": "afd302d31bb0ab3f", "name": "/usr/include/linux/netfilter/nf_nat.h", "type": "file" }, { - "bom-ref": "b6ee697b16206ad0", + "bom-ref": "c33693bd6293c09c", "name": "/usr/include/linux/netfilter/nf_synproxy.h", "type": "file" }, { - "bom-ref": "0a761c23d946fb54", + "bom-ref": "f986a5070432bfe4", "name": "/usr/include/linux/netfilter/nf_tables.h", "type": "file" }, { - "bom-ref": "7740359158f25e54", + "bom-ref": "658e756d3bc06270", "name": "/usr/include/linux/netfilter/nf_tables_compat.h", "type": "file" }, { - "bom-ref": "866f2b8e6adea4fc", + "bom-ref": "d927117b46557040", "name": "/usr/include/linux/netfilter/nfnetlink.h", "type": "file" }, { - "bom-ref": "e2ba94d4044781b9", + "bom-ref": "be3c76b81be3e079", "name": "/usr/include/linux/netfilter/nfnetlink_acct.h", "type": "file" }, { - "bom-ref": "0d2efb690da2c4b1", + "bom-ref": "0123642dcc4d42bd", "name": "/usr/include/linux/netfilter/nfnetlink_compat.h", "type": "file" }, { - "bom-ref": "e7046b70417f6c31", + "bom-ref": "bace456c233ca565", "name": "/usr/include/linux/netfilter/nfnetlink_conntrack.h", "type": "file" }, { - "bom-ref": "c5f5a44079a61892", + "bom-ref": "c12b7af48936767a", "name": "/usr/include/linux/netfilter/nfnetlink_cthelper.h", "type": "file" }, { - "bom-ref": "efd3e9a77193d71e", + "bom-ref": "b2c8d7412d97aaba", "name": "/usr/include/linux/netfilter/nfnetlink_cttimeout.h", "type": "file" }, { - "bom-ref": "20bcc5ecb3bc4c20", + "bom-ref": "a69c5d59fecb2d2c", "name": "/usr/include/linux/netfilter/nfnetlink_hook.h", "type": "file" }, { - "bom-ref": "6ba18a82c52734b0", + "bom-ref": "b688c1b5ccbcfbe8", "name": "/usr/include/linux/netfilter/nfnetlink_log.h", "type": "file" }, { - "bom-ref": "95f78d42e3866ef0", + "bom-ref": "d32a091a8f579c4c", "name": "/usr/include/linux/netfilter/nfnetlink_osf.h", "type": "file" }, { - "bom-ref": "c66ac8c351ff86b7", + "bom-ref": "2c7b46858740f743", "name": "/usr/include/linux/netfilter/nfnetlink_queue.h", "type": "file" }, { - "bom-ref": "afd091adc8675094", + "bom-ref": "4b6a9ec68330baa8", "name": "/usr/include/linux/netfilter/x_tables.h", "type": "file" }, { - "bom-ref": "c467c72fedb899a8", + "bom-ref": "fa71175a28e64d2c", "name": "/usr/include/linux/netfilter/xt_AUDIT.h", "type": "file" }, { - "bom-ref": "178e76ac4a23ded9", + "bom-ref": "7fb6e90fa38bb555", "name": "/usr/include/linux/netfilter/xt_CHECKSUM.h", "type": "file" }, { - "bom-ref": "76366d3b5dc84b1f", + "bom-ref": "ba243fc1a90027ff", "name": "/usr/include/linux/netfilter/xt_CLASSIFY.h", "type": "file" }, { - "bom-ref": "e04e9d4fe7b31e75", + "bom-ref": "dadf92100e2a6d99", "name": "/usr/include/linux/netfilter/xt_CONNMARK.h", "type": "file" }, { - "bom-ref": "93216325c6d03c5b", + "bom-ref": "8c10ab8d0118b6eb", "name": "/usr/include/linux/netfilter/xt_CONNSECMARK.h", "type": "file" }, { - "bom-ref": "1f72e8c40180e00e", + "bom-ref": "617d981d6a05d13e", "name": "/usr/include/linux/netfilter/xt_CT.h", "type": "file" }, { - "bom-ref": "efc11937dd4fcadc", + "bom-ref": "d857147f981d4090", "name": "/usr/include/linux/netfilter/xt_DSCP.h", "type": "file" }, { - "bom-ref": "9c588692fa571bfc", + "bom-ref": "c873acbb38b84a6c", "name": "/usr/include/linux/netfilter/xt_HMARK.h", "type": "file" }, { - "bom-ref": "74b7f6c08edcc278", + "bom-ref": "65757c1511530dc8", "name": "/usr/include/linux/netfilter/xt_IDLETIMER.h", "type": "file" }, { - "bom-ref": "2db2a5c7640fbca9", + "bom-ref": "a6b048d71c95dc51", "name": "/usr/include/linux/netfilter/xt_LED.h", "type": "file" }, { - "bom-ref": "0b72cce92e571962", + "bom-ref": "e977d7df89757162", "name": "/usr/include/linux/netfilter/xt_LOG.h", "type": "file" }, { - "bom-ref": "b91f072db64e467d", + "bom-ref": "f93ac77dd038a311", "name": "/usr/include/linux/netfilter/xt_MARK.h", "type": "file" }, { - "bom-ref": "1b2ee4f07e9ba802", + "bom-ref": "d265c42576b89fc6", "name": "/usr/include/linux/netfilter/xt_NFLOG.h", "type": "file" }, { - "bom-ref": "3d4947c1bf7d2fcc", + "bom-ref": "ada460071c21f8f4", "name": "/usr/include/linux/netfilter/xt_NFQUEUE.h", "type": "file" }, { - "bom-ref": "34319ade02cdc36d", + "bom-ref": "b8e847b2b07905e5", "name": "/usr/include/linux/netfilter/xt_RATEEST.h", "type": "file" }, { - "bom-ref": "e97a5ff1558656f6", + "bom-ref": "3c23dd2325c2bda2", "name": "/usr/include/linux/netfilter/xt_SECMARK.h", "type": "file" }, { - "bom-ref": "b1c195052d797d19", + "bom-ref": "8b4f87b4bbe0cd4d", "name": "/usr/include/linux/netfilter/xt_SYNPROXY.h", "type": "file" }, { - "bom-ref": "ede7094e6c44711b", + "bom-ref": "471efa0a74c835f3", "name": "/usr/include/linux/netfilter/xt_TCPMSS.h", "type": "file" }, { - "bom-ref": "10a29803c109602a", + "bom-ref": "070cf92f970c100a", "name": "/usr/include/linux/netfilter/xt_TCPOPTSTRIP.h", "type": "file" }, { - "bom-ref": "c165f59bd769bdd8", + "bom-ref": "61d065c548f03128", "name": "/usr/include/linux/netfilter/xt_TEE.h", "type": "file" }, { - "bom-ref": "30553b5e1b4a8690", + "bom-ref": "eba963cde28735d0", "name": "/usr/include/linux/netfilter/xt_TPROXY.h", "type": "file" }, { - "bom-ref": "443fd746e2bc197e", + "bom-ref": "0045f900f10ce896", "name": "/usr/include/linux/netfilter/xt_addrtype.h", "type": "file" }, { - "bom-ref": "867b7b2e6cc2657f", + "bom-ref": "e4bc4dd81c6460ef", "name": "/usr/include/linux/netfilter/xt_bpf.h", "type": "file" }, { - "bom-ref": "13fd617c6aeb4f00", + "bom-ref": "18ddb97f9f97050c", "name": "/usr/include/linux/netfilter/xt_cgroup.h", "type": "file" }, { - "bom-ref": "842e54c89c4a2415", + "bom-ref": "8944d31d8edfca45", "name": "/usr/include/linux/netfilter/xt_cluster.h", "type": "file" }, { - "bom-ref": "0cecde8c751b990d", + "bom-ref": "00c0821cf0c02d89", "name": "/usr/include/linux/netfilter/xt_comment.h", "type": "file" }, { - "bom-ref": "cb9e5b12da81235b", + "bom-ref": "4ecaa615b2d90de3", "name": "/usr/include/linux/netfilter/xt_connbytes.h", "type": "file" }, { - "bom-ref": "96a8196c4ceded93", + "bom-ref": "8c2446c06458c7c7", "name": "/usr/include/linux/netfilter/xt_connlabel.h", "type": "file" }, { - "bom-ref": "89e3571048aa8b1e", + "bom-ref": "2bb6ac1ffe0506da", "name": "/usr/include/linux/netfilter/xt_connlimit.h", "type": "file" }, { - "bom-ref": "66c499844a39936f", + "bom-ref": "66f42fbe6e4b57b7", "name": "/usr/include/linux/netfilter/xt_connmark.h", "type": "file" }, { - "bom-ref": "876828cf7e5216c4", + "bom-ref": "acf11426164b6380", "name": "/usr/include/linux/netfilter/xt_conntrack.h", "type": "file" }, { - "bom-ref": "c6e1aefed5e38526", + "bom-ref": "872eb8c8d9f9c80e", "name": "/usr/include/linux/netfilter/xt_cpu.h", "type": "file" }, { - "bom-ref": "34a518c5d3e91014", + "bom-ref": "09272fa59645bf38", "name": "/usr/include/linux/netfilter/xt_dccp.h", "type": "file" }, { - "bom-ref": "5933127b35e0d21a", + "bom-ref": "78c91f05da7f8dea", "name": "/usr/include/linux/netfilter/xt_devgroup.h", "type": "file" }, { - "bom-ref": "087eec696e597278", + "bom-ref": "fabcc26946846630", "name": "/usr/include/linux/netfilter/xt_dscp.h", "type": "file" }, { - "bom-ref": "768ab53b0f3966f2", + "bom-ref": "8483329fbdabba76", "name": "/usr/include/linux/netfilter/xt_ecn.h", "type": "file" }, { - "bom-ref": "17221364781e54b5", + "bom-ref": "6e1c6f7569af59e9", "name": "/usr/include/linux/netfilter/xt_esp.h", "type": "file" }, { - "bom-ref": "82a84d468e193604", + "bom-ref": "aa41a1410d4feadc", "name": "/usr/include/linux/netfilter/xt_hashlimit.h", "type": "file" }, { - "bom-ref": "8fe9c541ede8dc40", + "bom-ref": "50451ff1d5552b28", "name": "/usr/include/linux/netfilter/xt_helper.h", "type": "file" }, { - "bom-ref": "8727a1d07135abc9", + "bom-ref": "899c263c1e7fb3dd", "name": "/usr/include/linux/netfilter/xt_ipcomp.h", "type": "file" }, { - "bom-ref": "5e75deb5f92bbd34", + "bom-ref": "06d6c1698bbdd408", "name": "/usr/include/linux/netfilter/xt_iprange.h", "type": "file" }, { - "bom-ref": "19da8173239096da", + "bom-ref": "13f228b2f149cf56", "name": "/usr/include/linux/netfilter/xt_ipvs.h", "type": "file" }, { - "bom-ref": "a8c9e0eaccc45f4f", + "bom-ref": "5d2b516414fef943", "name": "/usr/include/linux/netfilter/xt_l2tp.h", "type": "file" }, { - "bom-ref": "59b96b40979ebf08", + "bom-ref": "60d1fdab747d3ee8", "name": "/usr/include/linux/netfilter/xt_length.h", "type": "file" }, { - "bom-ref": "f084a8fc991feda7", + "bom-ref": "ff8fd08e826018af", "name": "/usr/include/linux/netfilter/xt_limit.h", "type": "file" }, { - "bom-ref": "a4153b899938bfa0", + "bom-ref": "a0a53fb21283e800", "name": "/usr/include/linux/netfilter/xt_mac.h", "type": "file" }, { - "bom-ref": "1c63d0d870b40241", + "bom-ref": "f36dd71d7d8d71dd", "name": "/usr/include/linux/netfilter/xt_mark.h", "type": "file" }, { - "bom-ref": "72f838186400e9cb", + "bom-ref": "1fdf9b8bde934cfb", "name": "/usr/include/linux/netfilter/xt_multiport.h", "type": "file" }, { - "bom-ref": "baf4ca3ee0f66837", + "bom-ref": "97dfe1510395d223", "name": "/usr/include/linux/netfilter/xt_nfacct.h", "type": "file" }, { - "bom-ref": "2a3c50bed6ecaf0d", + "bom-ref": "3a88ba115696b1d5", "name": "/usr/include/linux/netfilter/xt_osf.h", "type": "file" }, { - "bom-ref": "62e5b899fb532ed3", + "bom-ref": "5fff01e65871dd6f", "name": "/usr/include/linux/netfilter/xt_owner.h", "type": "file" }, { - "bom-ref": "93656b0c66f0635c", + "bom-ref": "b90edeab21e068d0", "name": "/usr/include/linux/netfilter/xt_physdev.h", "type": "file" }, { - "bom-ref": "0505c86922f2f4b0", + "bom-ref": "f0c636c553b489f0", "name": "/usr/include/linux/netfilter/xt_pkttype.h", "type": "file" }, { - "bom-ref": "4177bcf367ce9239", + "bom-ref": "a5e9d97de0d3cf09", "name": "/usr/include/linux/netfilter/xt_policy.h", "type": "file" }, { - "bom-ref": "4e031580b667130a", + "bom-ref": "23dfd078caf98522", "name": "/usr/include/linux/netfilter/xt_quota.h", "type": "file" }, { - "bom-ref": "71ce7195d03e24e2", + "bom-ref": "e75cb484ed2f43b2", "name": "/usr/include/linux/netfilter/xt_rateest.h", "type": "file" }, { - "bom-ref": "6ac73c3c5b665e15", + "bom-ref": "2930848a4c2f6699", "name": "/usr/include/linux/netfilter/xt_realm.h", "type": "file" }, { - "bom-ref": "109d75cdfa31558e", + "bom-ref": "d41a5b33680094b6", "name": "/usr/include/linux/netfilter/xt_recent.h", "type": "file" }, { - "bom-ref": "cdb2668de803f519", + "bom-ref": "2d9f3f239cd71261", "name": "/usr/include/linux/netfilter/xt_rpfilter.h", "type": "file" }, { - "bom-ref": "7eb1f9d6e5ace3d7", + "bom-ref": "292b0843b946d94b", "name": "/usr/include/linux/netfilter/xt_sctp.h", "type": "file" }, { - "bom-ref": "696ab898a73c7514", + "bom-ref": "db03eb5d56b4d9b4", "name": "/usr/include/linux/netfilter/xt_set.h", "type": "file" }, { - "bom-ref": "cdd2fa178fce3a22", + "bom-ref": "95960243cd09025e", "name": "/usr/include/linux/netfilter/xt_socket.h", "type": "file" }, { - "bom-ref": "488aab97c8761831", + "bom-ref": "31f26de01c6ae439", "name": "/usr/include/linux/netfilter/xt_state.h", "type": "file" }, { - "bom-ref": "732b04b2c248d730", + "bom-ref": "11f86e12cdc361d8", "name": "/usr/include/linux/netfilter/xt_statistic.h", "type": "file" }, { - "bom-ref": "000cf336bbfa6168", + "bom-ref": "6fd2590625f793a8", "name": "/usr/include/linux/netfilter/xt_string.h", "type": "file" }, { - "bom-ref": "a46376e72e8c38b3", + "bom-ref": "b6baaa632e0d5683", "name": "/usr/include/linux/netfilter/xt_tcpmss.h", "type": "file" }, { - "bom-ref": "b3c5057d007350b6", + "bom-ref": "e69ea5763ac1264e", "name": "/usr/include/linux/netfilter/xt_tcpudp.h", "type": "file" }, { - "bom-ref": "6800001e99c244ed", + "bom-ref": "b75c2ea8f56b9c09", "name": "/usr/include/linux/netfilter/xt_time.h", "type": "file" }, { - "bom-ref": "8321963a6fd46493", + "bom-ref": "a0ca956d82ca1e6f", "name": "/usr/include/linux/netfilter/xt_u32.h", "type": "file" }, { - "bom-ref": "35cef3332466104c", + "bom-ref": "4dccbf14441e94d4", "name": "/usr/include/linux/netfilter_arp.h", "type": "file" }, { - "bom-ref": "9779c7b0b8c03456", + "bom-ref": "bf2594534ba666aa", "name": "/usr/include/linux/netfilter_arp/arp_tables.h", "type": "file" }, { - "bom-ref": "083550b1fa15460b", + "bom-ref": "f647b6fa73ec6a87", "name": "/usr/include/linux/netfilter_arp/arpt_mangle.h", "type": "file" }, { - "bom-ref": "c04738ac6e214845", + "bom-ref": "361bc305365f6b65", "name": "/usr/include/linux/netfilter_bridge.h", "type": "file" }, { - "bom-ref": "36d397dde228c825", + "bom-ref": "9207cabbb30ef2a5", "name": "/usr/include/linux/netfilter_bridge/ebt_802_3.h", "type": "file" }, { - "bom-ref": "a224875bc5a2eb0c", + "bom-ref": "373d4ba1748f976c", "name": "/usr/include/linux/netfilter_bridge/ebt_among.h", "type": "file" }, { - "bom-ref": "f15c57f7436167f1", + "bom-ref": "1da55a263fd8df51", "name": "/usr/include/linux/netfilter_bridge/ebt_arp.h", "type": "file" }, { - "bom-ref": "2ca391d3dfb8570a", + "bom-ref": "9ef58c9ff536fc7a", "name": "/usr/include/linux/netfilter_bridge/ebt_arpreply.h", "type": "file" }, { - "bom-ref": "a39338edc02edb03", + "bom-ref": "becb432ed5ae3697", "name": "/usr/include/linux/netfilter_bridge/ebt_ip.h", "type": "file" }, { - "bom-ref": "1682603e4740986f", + "bom-ref": "166324b67d1904af", "name": "/usr/include/linux/netfilter_bridge/ebt_ip6.h", "type": "file" }, { - "bom-ref": "b6677fb67556635d", + "bom-ref": "b9ee1b4c3535dae1", "name": "/usr/include/linux/netfilter_bridge/ebt_limit.h", "type": "file" }, { - "bom-ref": "378322fb36474da1", + "bom-ref": "c13ae96ad93ea7d9", "name": "/usr/include/linux/netfilter_bridge/ebt_log.h", "type": "file" }, { - "bom-ref": "7ac6f76d10aed8f9", + "bom-ref": "0cafe630a2fd8c71", "name": "/usr/include/linux/netfilter_bridge/ebt_mark_m.h", "type": "file" }, { - "bom-ref": "fddf9a92c927afa5", + "bom-ref": "491ec886564ce335", "name": "/usr/include/linux/netfilter_bridge/ebt_mark_t.h", "type": "file" }, { - "bom-ref": "756113e89f401669", + "bom-ref": "f6ed87b52129f589", "name": "/usr/include/linux/netfilter_bridge/ebt_nat.h", "type": "file" }, { - "bom-ref": "60b4fef325998b1a", + "bom-ref": "d70d3c4035660bc6", "name": "/usr/include/linux/netfilter_bridge/ebt_nflog.h", "type": "file" }, { - "bom-ref": "f664135cd8342bbc", + "bom-ref": "296e176968135ee8", "name": "/usr/include/linux/netfilter_bridge/ebt_pkttype.h", "type": "file" }, { - "bom-ref": "29e5986ed17970fc", + "bom-ref": "b4b18f7ff9245180", "name": "/usr/include/linux/netfilter_bridge/ebt_redirect.h", "type": "file" }, { - "bom-ref": "002c79dbb81869a3", + "bom-ref": "79a892e355b8563b", "name": "/usr/include/linux/netfilter_bridge/ebt_stp.h", "type": "file" }, { - "bom-ref": "fbd2c2f0b87db2ce", + "bom-ref": "4a760a9e9e731452", "name": "/usr/include/linux/netfilter_bridge/ebt_vlan.h", "type": "file" }, { - "bom-ref": "9d2cc6989d9887f7", + "bom-ref": "8738994f21ea345f", "name": "/usr/include/linux/netfilter_bridge/ebtables.h", "type": "file" }, { - "bom-ref": "6ea88441932106c7", + "bom-ref": "88250819926f52ab", "name": "/usr/include/linux/netfilter_ipv4.h", "type": "file" }, { - "bom-ref": "9b9d7e4e7ae1afdd", + "bom-ref": "c4d2836f8054d279", "name": "/usr/include/linux/netfilter_ipv4/ip_tables.h", "type": "file" }, { - "bom-ref": "414a4d41c25a2c56", + "bom-ref": "ca1a4f32a4048e76", "name": "/usr/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h", "type": "file" }, { - "bom-ref": "20bb6f2101b20c0c", + "bom-ref": "95632f1c16cb3424", "name": "/usr/include/linux/netfilter_ipv4/ipt_ECN.h", "type": "file" }, { - "bom-ref": "b0f23f785bc7a3c4", + "bom-ref": "83168750c18fd758", "name": "/usr/include/linux/netfilter_ipv4/ipt_LOG.h", "type": "file" }, { - "bom-ref": "540aed3b4ff3040b", + "bom-ref": "d12e14408cd9140b", "name": "/usr/include/linux/netfilter_ipv4/ipt_REJECT.h", "type": "file" }, { - "bom-ref": "889dc25e84c2b244", + "bom-ref": "93fe72d1e57596d4", "name": "/usr/include/linux/netfilter_ipv4/ipt_TTL.h", "type": "file" }, { - "bom-ref": "85d2895b605ea497", + "bom-ref": "410aab9784d68aab", "name": "/usr/include/linux/netfilter_ipv4/ipt_ah.h", "type": "file" }, { - "bom-ref": "889ae9f1b23f8fe4", + "bom-ref": "a1bcc19e7741bb5c", "name": "/usr/include/linux/netfilter_ipv4/ipt_ecn.h", "type": "file" }, { - "bom-ref": "828a8b91b8700d16", + "bom-ref": "5325d6b2cfe2afbe", "name": "/usr/include/linux/netfilter_ipv4/ipt_ttl.h", "type": "file" }, { - "bom-ref": "cc779b964d656198", + "bom-ref": "072fc47fcfdfd640", "name": "/usr/include/linux/netfilter_ipv6.h", "type": "file" }, { - "bom-ref": "b9230ab1f4cec4ab", + "bom-ref": "64059d5f832a8313", "name": "/usr/include/linux/netfilter_ipv6/ip6_tables.h", "type": "file" }, { - "bom-ref": "3760cf1b1ca59ee3", + "bom-ref": "199b4eea398743ab", "name": "/usr/include/linux/netfilter_ipv6/ip6t_HL.h", "type": "file" }, { - "bom-ref": "7d65409c7b18088f", + "bom-ref": "d324f460041d96c7", "name": "/usr/include/linux/netfilter_ipv6/ip6t_LOG.h", "type": "file" }, { - "bom-ref": "ec9f57701a9242b9", + "bom-ref": "8a4e74cfa7b52a09", "name": "/usr/include/linux/netfilter_ipv6/ip6t_NPT.h", "type": "file" }, { - "bom-ref": "00e2c1e323f76921", + "bom-ref": "764ce26e2298343d", "name": "/usr/include/linux/netfilter_ipv6/ip6t_REJECT.h", "type": "file" }, { - "bom-ref": "4f7222f92530b5fa", + "bom-ref": "8e14b488c8c74e66", "name": "/usr/include/linux/netfilter_ipv6/ip6t_ah.h", "type": "file" }, { - "bom-ref": "992838b28eff78fc", + "bom-ref": "afa6a7db64b002e4", "name": "/usr/include/linux/netfilter_ipv6/ip6t_frag.h", "type": "file" }, { - "bom-ref": "f63b7e89a9062b80", + "bom-ref": "aa2b97af83334588", "name": "/usr/include/linux/netfilter_ipv6/ip6t_hl.h", "type": "file" }, { - "bom-ref": "aa7a8ad363381e28", + "bom-ref": "1b89b65e2827e440", "name": "/usr/include/linux/netfilter_ipv6/ip6t_ipv6header.h", "type": "file" }, { - "bom-ref": "32f6c3fe0835ce46", + "bom-ref": "3c261145a6133952", "name": "/usr/include/linux/netfilter_ipv6/ip6t_mh.h", "type": "file" }, { - "bom-ref": "bacb76a6fb0064c5", + "bom-ref": "e61e2521ed11b02d", "name": "/usr/include/linux/netfilter_ipv6/ip6t_opts.h", "type": "file" }, { - "bom-ref": "dedaee45409ab96e", + "bom-ref": "8fa2e3a5a46736ba", "name": "/usr/include/linux/netfilter_ipv6/ip6t_rt.h", "type": "file" }, { - "bom-ref": "c0cc588bde2c6d3b", + "bom-ref": "b56753cc7f904757", "name": "/usr/include/linux/netfilter_ipv6/ip6t_srh.h", "type": "file" }, { - "bom-ref": "2ef3450089c4914a", + "bom-ref": "1230828ca3ddcd4a", "name": "/usr/include/linux/netlink.h", "type": "file" }, { - "bom-ref": "c9a879170aee858c", + "bom-ref": "a9a1c46b1aa2bc88", "name": "/usr/include/linux/netlink_diag.h", "type": "file" }, { - "bom-ref": "697ee3478c6fea26", + "bom-ref": "5d3af9af49be9d02", "name": "/usr/include/linux/netrom.h", "type": "file" }, { - "bom-ref": "c7d25bc4cd2eb619", + "bom-ref": "8b680c3315bcd7a9", "name": "/usr/include/linux/nexthop.h", "type": "file" }, { - "bom-ref": "2ca2fb45c4efb4bb", + "bom-ref": "3c3149090bbaa8eb", "name": "/usr/include/linux/nfc.h", "type": "file" }, { - "bom-ref": "444bdb87b82739c5", + "bom-ref": "32090de9b1749b69", "name": "/usr/include/linux/nfs.h", "type": "file" }, { - "bom-ref": "58db112a25a6f198", + "bom-ref": "8a4d8b0cddddb1b8", "name": "/usr/include/linux/nfs2.h", "type": "file" }, { - "bom-ref": "4082a67639c79fe3", + "bom-ref": "9c04a86af06cf85f", "name": "/usr/include/linux/nfs3.h", "type": "file" }, { - "bom-ref": "853fc5a77572ea98", + "bom-ref": "74e2ba16763ec0ec", "name": "/usr/include/linux/nfs4.h", "type": "file" }, { - "bom-ref": "fc02b55b5f26822a", + "bom-ref": "7b8eabd777a28c72", "name": "/usr/include/linux/nfs4_mount.h", "type": "file" }, { - "bom-ref": "dac762ee1fc01f41", + "bom-ref": "15afc223ba06d815", "name": "/usr/include/linux/nfs_fs.h", "type": "file" }, { - "bom-ref": "dfce5133681f0c1c", + "bom-ref": "8b5215f8e9e5c300", "name": "/usr/include/linux/nfs_idmap.h", "type": "file" }, { - "bom-ref": "e4ac39ec2d215034", + "bom-ref": "43779e31256e0b38", "name": "/usr/include/linux/nfs_mount.h", "type": "file" }, { - "bom-ref": "3fb1bd73d362b54a", + "bom-ref": "65f62b19a30d9626", "name": "/usr/include/linux/nfsacl.h", "type": "file" }, { - "bom-ref": "fbf26731a2bdd835", + "bom-ref": "6cb88b94ffa98cd9", "name": "/usr/include/linux/nfsd/cld.h", "type": "file" }, { - "bom-ref": "31553b1f13e28050", + "bom-ref": "9fa502089ddb0ff0", "name": "/usr/include/linux/nfsd/debug.h", "type": "file" }, { - "bom-ref": "35daac84cefc58b9", + "bom-ref": "b877b080ae515081", "name": "/usr/include/linux/nfsd/export.h", "type": "file" }, { - "bom-ref": "6cf7fd88ea071ec7", + "bom-ref": "8898aff01c762b7f", "name": "/usr/include/linux/nfsd/stats.h", "type": "file" }, { - "bom-ref": "0a2d0ce11a3d7711", + "bom-ref": "a3ad20f612ae9edd", "name": "/usr/include/linux/nfsd_netlink.h", "type": "file" }, { - "bom-ref": "b3d7c295cb29b995", + "bom-ref": "7e5d7fba36914359", "name": "/usr/include/linux/nilfs2_api.h", "type": "file" }, { - "bom-ref": "5066527aac10084b", + "bom-ref": "e25c21fb0d8f2eb7", "name": "/usr/include/linux/nilfs2_ondisk.h", "type": "file" }, { - "bom-ref": "356b496c419c9f42", + "bom-ref": "8f29439e322af626", "name": "/usr/include/linux/nitro_enclaves.h", "type": "file" }, { - "bom-ref": "d59b5597acd992bc", + "bom-ref": "91234d44625d5f70", "name": "/usr/include/linux/nl80211-vnd-intel.h", "type": "file" }, { - "bom-ref": "57f351e8371f7543", + "bom-ref": "d9e3856fa7a5c4cb", "name": "/usr/include/linux/nl80211.h", "type": "file" }, { - "bom-ref": "6a431cc992cc01f5", + "bom-ref": "e68d29bcad4e5c7d", "name": "/usr/include/linux/npcm-video.h", "type": "file" }, { - "bom-ref": "2aef06a8a84743b4", + "bom-ref": "f87bb029b558c910", "name": "/usr/include/linux/nsfs.h", "type": "file" }, { - "bom-ref": "0a4e816177174a2e", + "bom-ref": "701e2985edb309c6", "name": "/usr/include/linux/nsm.h", "type": "file" }, { - "bom-ref": "9354079c2a61a111", + "bom-ref": "940735c557aa7de9", "name": "/usr/include/linux/nubus.h", "type": "file" }, { - "bom-ref": "93d61e332b7d4c6a", + "bom-ref": "7ff10378cb88a0d6", "name": "/usr/include/linux/nvme_ioctl.h", "type": "file" }, { - "bom-ref": "6dd623ff11ef384a", + "bom-ref": "cc7d2656d54b7196", "name": "/usr/include/linux/nvram.h", "type": "file" }, { - "bom-ref": "ba32903bb21a6f2c", + "bom-ref": "1b0e87ec1de34588", "name": "/usr/include/linux/omap3isp.h", "type": "file" }, { - "bom-ref": "5594d1ed9aaf9307", + "bom-ref": "05c31a7cbd17f2fb", "name": "/usr/include/linux/omapfb.h", "type": "file" }, { - "bom-ref": "a9dfc3221fbafca2", + "bom-ref": "bb51181aa86d944e", "name": "/usr/include/linux/oom.h", "type": "file" }, { - "bom-ref": "277c8949ea2b94af", + "bom-ref": "b951d7a2ac1285d7", "name": "/usr/include/linux/openat2.h", "type": "file" }, { - "bom-ref": "215f6b44ad0baf6e", + "bom-ref": "b787c263a94e28b6", "name": "/usr/include/linux/openvswitch.h", "type": "file" }, { - "bom-ref": "f905fa3fa18bc1c0", + "bom-ref": "dd3e2595ddd22de4", "name": "/usr/include/linux/packet_diag.h", "type": "file" }, { - "bom-ref": "0e4f7ced4349ca16", + "bom-ref": "32939c18e1fc15e6", "name": "/usr/include/linux/param.h", "type": "file" }, { - "bom-ref": "61096f28beab5579", + "bom-ref": "f9620d074e921821", "name": "/usr/include/linux/parport.h", "type": "file" }, { - "bom-ref": "a8a7483d2e35fbbc", + "bom-ref": "dc426d7069949f0c", "name": "/usr/include/linux/patchkey.h", "type": "file" }, { - "bom-ref": "700091f2a0db219b", + "bom-ref": "ba3b057f95b9b7cb", "name": "/usr/include/linux/pci.h", "type": "file" }, { - "bom-ref": "bc62bde958ed9256", + "bom-ref": "1efedd33eb207d1e", "name": "/usr/include/linux/pci_regs.h", "type": "file" }, { - "bom-ref": "e8ffd3011f84295c", + "bom-ref": "4eb4030a400bce38", "name": "/usr/include/linux/pcitest.h", "type": "file" }, { - "bom-ref": "8c3c0829a87f221a", + "bom-ref": "452213b4311d9ec2", "name": "/usr/include/linux/perf_event.h", "type": "file" }, { - "bom-ref": "7b03589576562771", + "bom-ref": "141b09c82a473671", "name": "/usr/include/linux/personality.h", "type": "file" }, { - "bom-ref": "1c81e00cdaed1970", + "bom-ref": "41e4bbb7743d3684", "name": "/usr/include/linux/pfkeyv2.h", "type": "file" }, { - "bom-ref": "a7b55eaf3620cd8d", + "bom-ref": "3c9942a15785f86d", "name": "/usr/include/linux/pfrut.h", "type": "file" }, { - "bom-ref": "680719bb39263997", + "bom-ref": "eccef97434aec58b", "name": "/usr/include/linux/pg.h", "type": "file" }, { - "bom-ref": "fcbace54485363c0", + "bom-ref": "84a164c98fb6d34c", "name": "/usr/include/linux/phantom.h", "type": "file" }, { - "bom-ref": "0c5022de5d9978f8", + "bom-ref": "c59637a7d525bf98", "name": "/usr/include/linux/phonet.h", "type": "file" }, { - "bom-ref": "7b7298c7e94e9b16", + "bom-ref": "6b938946cd3ce47a", "name": "/usr/include/linux/pidfd.h", "type": "file" }, { - "bom-ref": "387b5daf8cc1b19b", + "bom-ref": "825b0fafba80071f", "name": "/usr/include/linux/pkt_cls.h", "type": "file" }, { - "bom-ref": "0f7c3f2c0a4b9791", + "bom-ref": "5a03edacf4834169", "name": "/usr/include/linux/pkt_sched.h", "type": "file" }, { - "bom-ref": "231300084973b697", + "bom-ref": "327e062908c752f3", "name": "/usr/include/linux/pktcdvd.h", "type": "file" }, { - "bom-ref": "1e559a6e67aca7df", + "bom-ref": "ad626f436466a9d7", "name": "/usr/include/linux/pmu.h", "type": "file" }, { - "bom-ref": "2a0ee53532ad4e46", + "bom-ref": "16e30af094466432", "name": "/usr/include/linux/poll.h", "type": "file" }, { - "bom-ref": "17024bcccbfdcb88", + "bom-ref": "8147bdbe7fd8d3a0", "name": "/usr/include/linux/posix_acl.h", "type": "file" }, { - "bom-ref": "36688a5f044843d0", + "bom-ref": "6caa3d0af7912b0c", "name": "/usr/include/linux/posix_acl_xattr.h", "type": "file" }, { - "bom-ref": "a8b6418e152ca902", + "bom-ref": "c8184a6ce2929a2a", "name": "/usr/include/linux/posix_types.h", "type": "file" }, { - "bom-ref": "e0869dc6545edea4", + "bom-ref": "4832d14bf711ac64", "name": "/usr/include/linux/ppdev.h", "type": "file" }, { - "bom-ref": "9efd7fab19943293", + "bom-ref": "f744d3833ce16807", "name": "/usr/include/linux/ppp-comp.h", "type": "file" }, { - "bom-ref": "f06eed21514c7c84", + "bom-ref": "0ccae49620a3d8f4", "name": "/usr/include/linux/ppp-ioctl.h", "type": "file" }, { - "bom-ref": "bc368b0ec4d5fb72", + "bom-ref": "ab57a1059f398b46", "name": "/usr/include/linux/ppp_defs.h", "type": "file" }, { - "bom-ref": "a8baa74bbf2f79ee", + "bom-ref": "dfd3b39ee497dae6", "name": "/usr/include/linux/pps.h", "type": "file" }, { - "bom-ref": "06aedbb1cac19782", + "bom-ref": "c85a23fa983ec55a", "name": "/usr/include/linux/pr.h", "type": "file" }, { - "bom-ref": "caa99e905742c8a9", + "bom-ref": "f7543d79cfa3fc15", "name": "/usr/include/linux/prctl.h", "type": "file" }, { - "bom-ref": "f556b61c5ff9db11", + "bom-ref": "05f076f43f779f51", "name": "/usr/include/linux/psample.h", "type": "file" }, { - "bom-ref": "e21a1d4cd151f10d", + "bom-ref": "d32c88ba5c89aad1", "name": "/usr/include/linux/psci.h", "type": "file" }, { - "bom-ref": "941a9003b0fe01e4", + "bom-ref": "5ab60b0ad9b06478", "name": "/usr/include/linux/psp-dbc.h", "type": "file" }, { - "bom-ref": "b2b938a1fda6914b", + "bom-ref": "0bada89dd9558b73", "name": "/usr/include/linux/psp-sev.h", "type": "file" }, { - "bom-ref": "b7892b5a5ab8fd95", + "bom-ref": "3357f92046baac39", "name": "/usr/include/linux/ptp_clock.h", "type": "file" }, { - "bom-ref": "35515da5adbc706d", + "bom-ref": "edd6932364c379f5", "name": "/usr/include/linux/ptrace.h", "type": "file" }, { - "bom-ref": "e95efd6c8e597e2e", + "bom-ref": "c036dcf8f4d98862", "name": "/usr/include/linux/qemu_fw_cfg.h", "type": "file" }, { - "bom-ref": "1b9a68b450f329fe", + "bom-ref": "3225304cceb2cad6", "name": "/usr/include/linux/qnx4_fs.h", "type": "file" }, { - "bom-ref": "61d2b1e47cf27624", + "bom-ref": "9c8ba73e17881e3c", "name": "/usr/include/linux/qnxtypes.h", "type": "file" }, { - "bom-ref": "2d824ac3513c5c39", + "bom-ref": "32a0d3e898a54019", "name": "/usr/include/linux/qrtr.h", "type": "file" }, { - "bom-ref": "81c8b0218947c0c4", + "bom-ref": "3cfce5c32cbcb8e0", "name": "/usr/include/linux/quota.h", "type": "file" }, { - "bom-ref": "0598c44596bbba5d", + "bom-ref": "6829eada610d4f5d", "name": "/usr/include/linux/radeonfb.h", "type": "file" }, { - "bom-ref": "d32d0c542cf52811", + "bom-ref": "3d0d21dfc4457619", "name": "/usr/include/linux/raid/md_p.h", "type": "file" }, { - "bom-ref": "d02feb6725d0b9c3", + "bom-ref": "678e76ab1454c983", "name": "/usr/include/linux/raid/md_u.h", "type": "file" }, { - "bom-ref": "f4c304589d487b17", + "bom-ref": "29b3597262ff6273", "name": "/usr/include/linux/random.h", "type": "file" }, { - "bom-ref": "31b481ada46fb87a", + "bom-ref": "457ff6b3f5f74a0e", "name": "/usr/include/linux/rds.h", "type": "file" }, { - "bom-ref": "40e2682b51e1c758", + "bom-ref": "ddc4dbba8fef2064", "name": "/usr/include/linux/reboot.h", "type": "file" }, { - "bom-ref": "7af6acd8158affe7", + "bom-ref": "37d285241e9e45bf", "name": "/usr/include/linux/reiserfs_fs.h", "type": "file" }, { - "bom-ref": "2b693185a9c42c9c", + "bom-ref": "83aed20c29fca868", "name": "/usr/include/linux/reiserfs_xattr.h", "type": "file" }, { - "bom-ref": "fcb0410182afe8b0", + "bom-ref": "af24778a3ccf47c0", "name": "/usr/include/linux/remoteproc_cdev.h", "type": "file" }, { - "bom-ref": "6ce345d98a4cea0d", + "bom-ref": "8ff8b1dbc5d70f99", "name": "/usr/include/linux/resource.h", "type": "file" }, { - "bom-ref": "8e9ce943cbfa16b3", + "bom-ref": "3e90bf90ae4c0a53", "name": "/usr/include/linux/rfkill.h", "type": "file" }, { - "bom-ref": "4b6ebec0a8a35a6f", + "bom-ref": "ebc951a6a547520f", "name": "/usr/include/linux/rio_cm_cdev.h", "type": "file" }, { - "bom-ref": "0d47883f429bdd5e", + "bom-ref": "c8d77e4d1b0eba02", "name": "/usr/include/linux/rio_mport_cdev.h", "type": "file" }, { - "bom-ref": "010d58f53b2ed4a8", + "bom-ref": "b6203a0a5769d044", "name": "/usr/include/linux/rkisp1-config.h", "type": "file" }, { - "bom-ref": "34b43b47c48e83c1", + "bom-ref": "295474af3d07b409", "name": "/usr/include/linux/romfs_fs.h", "type": "file" }, { - "bom-ref": "1bdac4e1f0f13c11", + "bom-ref": "143ad6db59268d79", "name": "/usr/include/linux/rose.h", "type": "file" }, { - "bom-ref": "3a0300090837c0c3", + "bom-ref": "058bee9a3082d5bf", "name": "/usr/include/linux/route.h", "type": "file" }, { - "bom-ref": "08f600762a7ebe85", + "bom-ref": "a549b96a15cf8ea5", "name": "/usr/include/linux/rpl.h", "type": "file" }, { - "bom-ref": "ce8cd2d96f0d88a6", + "bom-ref": "0facf569e39ab4ee", "name": "/usr/include/linux/rpl_iptunnel.h", "type": "file" }, { - "bom-ref": "fdedb7385c30fecb", + "bom-ref": "ec722952774ed2eb", "name": "/usr/include/linux/rpmsg.h", "type": "file" }, { - "bom-ref": "97e2f29a6a8ba280", + "bom-ref": "3f78d487fa3d0598", "name": "/usr/include/linux/rpmsg_types.h", "type": "file" }, { - "bom-ref": "0e8fe080af9cc2f4", + "bom-ref": "4ca289d32830b598", "name": "/usr/include/linux/rseq.h", "type": "file" }, { - "bom-ref": "4dfad65c1d581f7b", + "bom-ref": "d5512a7f4beb5f67", "name": "/usr/include/linux/rtc.h", "type": "file" }, { - "bom-ref": "63a74ec2b5fee150", + "bom-ref": "41ab6ee14799486c", "name": "/usr/include/linux/rtnetlink.h", "type": "file" }, { - "bom-ref": "d4976136d6aec763", + "bom-ref": "35173e523a7db0af", "name": "/usr/include/linux/rxrpc.h", "type": "file" }, { - "bom-ref": "b6f25fb4dfc89fdb", + "bom-ref": "22149740e72ee427", "name": "/usr/include/linux/scc.h", "type": "file" }, { - "bom-ref": "83a20a4bfdfcfdec", + "bom-ref": "990fa53e6503ad3c", "name": "/usr/include/linux/sched.h", "type": "file" }, { - "bom-ref": "65caa2982be4ee56", + "bom-ref": "7e7fc15e6f219326", "name": "/usr/include/linux/sched/types.h", "type": "file" }, { - "bom-ref": "bf09a3ac5c430df7", + "bom-ref": "ab5c287c4b293c8b", "name": "/usr/include/linux/scif_ioctl.h", "type": "file" }, { - "bom-ref": "40f35fbb7cfa9cc0", + "bom-ref": "8963246d538f0224", "name": "/usr/include/linux/screen_info.h", "type": "file" }, { - "bom-ref": "9ed184b4301b22f3", + "bom-ref": "d92737c499127deb", "name": "/usr/include/linux/sctp.h", "type": "file" }, { - "bom-ref": "5918913be7a13bcf", + "bom-ref": "093816da8ab3c97f", "name": "/usr/include/linux/seccomp.h", "type": "file" }, { - "bom-ref": "0553925f5d6842d7", + "bom-ref": "11aa21597c5ac00f", "name": "/usr/include/linux/securebits.h", "type": "file" }, { - "bom-ref": "ea3bd9d23067968f", + "bom-ref": "11297afb32760e73", "name": "/usr/include/linux/sed-opal.h", "type": "file" }, { - "bom-ref": "7f91a136b93223b0", + "bom-ref": "5c070aa83ce9f5dc", "name": "/usr/include/linux/seg6.h", "type": "file" }, { - "bom-ref": "eec5c4a2f338830a", + "bom-ref": "4012e180ae972c7a", "name": "/usr/include/linux/seg6_genl.h", "type": "file" }, { - "bom-ref": "5b0bd7991c3d551e", + "bom-ref": "663c90a46497b8de", "name": "/usr/include/linux/seg6_hmac.h", "type": "file" }, { - "bom-ref": "9eec2c321b568985", + "bom-ref": "57290f548cd59729", "name": "/usr/include/linux/seg6_iptunnel.h", "type": "file" }, { - "bom-ref": "a1f1b32393644cf4", + "bom-ref": "a207c91cc9d9b910", "name": "/usr/include/linux/seg6_local.h", "type": "file" }, { - "bom-ref": "a9d3022f06dcfcf1", + "bom-ref": "7b6423f5ab63fffd", "name": "/usr/include/linux/selinux_netlink.h", "type": "file" }, { - "bom-ref": "9b7b132979542a2d", + "bom-ref": "a858803bda2ea4bd", "name": "/usr/include/linux/sem.h", "type": "file" }, { - "bom-ref": "39110cb48cd42ac4", + "bom-ref": "2d1026cd48685f7c", "name": "/usr/include/linux/serial.h", "type": "file" }, { - "bom-ref": "62a0e9215b223335", + "bom-ref": "62f2fd480e7aeba5", "name": "/usr/include/linux/serial_core.h", "type": "file" }, { - "bom-ref": "5d58d27a8379a9b8", + "bom-ref": "04874993225a5760", "name": "/usr/include/linux/serial_reg.h", "type": "file" }, { - "bom-ref": "47fc96a55be7982b", + "bom-ref": "2e91b2602654600f", "name": "/usr/include/linux/serio.h", "type": "file" }, { - "bom-ref": "935042afdd34585d", + "bom-ref": "1e4deac050566b81", "name": "/usr/include/linux/sev-guest.h", "type": "file" }, { - "bom-ref": "34cbd665f870e194", + "bom-ref": "6751b2e689e5591c", "name": "/usr/include/linux/shm.h", "type": "file" }, { - "bom-ref": "5420cf0972236162", + "bom-ref": "e9b0dc9ffb437286", "name": "/usr/include/linux/signal.h", "type": "file" }, { - "bom-ref": "599190f6fbc8cd3a", + "bom-ref": "e22113b75cc1a78e", "name": "/usr/include/linux/signalfd.h", "type": "file" }, { - "bom-ref": "66f1cffdc2712546", + "bom-ref": "61cc3815bab951ce", "name": "/usr/include/linux/smc.h", "type": "file" }, { - "bom-ref": "8758e687e8aaf029", + "bom-ref": "07885bd7bb327d45", "name": "/usr/include/linux/smc_diag.h", "type": "file" }, { - "bom-ref": "94c5cbe7152cf51b", + "bom-ref": "3eb3195500b1d1eb", "name": "/usr/include/linux/smiapp.h", "type": "file" }, { - "bom-ref": "3c06bbfcfb49a35c", + "bom-ref": "cea57bf4395de998", "name": "/usr/include/linux/snmp.h", "type": "file" }, { - "bom-ref": "beab9f545dfad4dc", + "bom-ref": "7341c911453a38e0", "name": "/usr/include/linux/sock_diag.h", "type": "file" }, { - "bom-ref": "a4b0f7e8f2a97b64", + "bom-ref": "4061f0e96cb7b7d0", "name": "/usr/include/linux/socket.h", "type": "file" }, { - "bom-ref": "ea8b1904ffe98697", + "bom-ref": "83137fd1b92ab747", "name": "/usr/include/linux/sockios.h", "type": "file" }, { - "bom-ref": "41e34d099a261b12", + "bom-ref": "342747d574b68e76", "name": "/usr/include/linux/sonet.h", "type": "file" }, { - "bom-ref": "de93fff48e60fd24", + "bom-ref": "01322c3861775b38", "name": "/usr/include/linux/sonypi.h", "type": "file" }, { - "bom-ref": "e9115f6ffdbf2dab", + "bom-ref": "1b9dd1a7d6eadba3", "name": "/usr/include/linux/sound.h", "type": "file" }, { - "bom-ref": "8b5c9f48d63a0283", + "bom-ref": "2dfd8fad7df838bb", "name": "/usr/include/linux/soundcard.h", "type": "file" }, { - "bom-ref": "369e7ae41cd46cb3", + "bom-ref": "3e5f8a9272791f03", "name": "/usr/include/linux/spi/spi.h", "type": "file" }, { - "bom-ref": "fa143c7baaff9b3a", + "bom-ref": "72e713f982466d1a", "name": "/usr/include/linux/spi/spidev.h", "type": "file" }, { - "bom-ref": "31aca0620a92ea65", + "bom-ref": "f52a218afeba1f1d", "name": "/usr/include/linux/stat.h", "type": "file" }, { - "bom-ref": "0c81aa552c877340", + "bom-ref": "c14c934d1acb4930", "name": "/usr/include/linux/stddef.h", "type": "file" }, { - "bom-ref": "7f3097b07ee22a91", + "bom-ref": "960921f93f24d555", "name": "/usr/include/linux/stm.h", "type": "file" }, { - "bom-ref": "af11ec392edffbad", + "bom-ref": "b1a20e052b0ffa21", "name": "/usr/include/linux/string.h", "type": "file" }, { - "bom-ref": "92333cc7c20d9657", + "bom-ref": "310a291404d1959b", "name": "/usr/include/linux/sunrpc/debug.h", "type": "file" }, { - "bom-ref": "915a10c20d50d648", + "bom-ref": "48a973d36a3ff5e4", "name": "/usr/include/linux/surface_aggregator/cdev.h", "type": "file" }, { - "bom-ref": "b71fecd9a64525de", + "bom-ref": "d90fcca48b068d4a", "name": "/usr/include/linux/surface_aggregator/dtx.h", "type": "file" }, { - "bom-ref": "41c03b133633148a", + "bom-ref": "d9eef5654c44a5de", "name": "/usr/include/linux/suspend_ioctls.h", "type": "file" }, { - "bom-ref": "8a3f20b9d7108390", + "bom-ref": "b4e78b433a025334", "name": "/usr/include/linux/swab.h", "type": "file" }, { - "bom-ref": "25b83e6fb4ecd014", + "bom-ref": "28d3795e3fea58a0", "name": "/usr/include/linux/switchtec_ioctl.h", "type": "file" }, { - "bom-ref": "fcb88a383319b893", + "bom-ref": "775417b9d2fd8ef7", "name": "/usr/include/linux/sync_file.h", "type": "file" }, { - "bom-ref": "53996ba3e605d3ce", + "bom-ref": "6570e75af25459f2", "name": "/usr/include/linux/synclink.h", "type": "file" }, { - "bom-ref": "61f30baed59d2f60", + "bom-ref": "491ad5e69096754c", "name": "/usr/include/linux/sysctl.h", "type": "file" }, { - "bom-ref": "ac59b96835047b67", + "bom-ref": "2555dd8ee4e05da7", "name": "/usr/include/linux/sysinfo.h", "type": "file" }, { - "bom-ref": "f96834de5ea65e71", + "bom-ref": "ce3981636c3cb869", "name": "/usr/include/linux/target_core_user.h", "type": "file" }, { - "bom-ref": "0b86bc181295474e", + "bom-ref": "b2b2e7ae5b76cb52", "name": "/usr/include/linux/taskstats.h", "type": "file" }, { - "bom-ref": "70f1ee1c515c9570", + "bom-ref": "f6bf643d126d2388", "name": "/usr/include/linux/tc_act/tc_bpf.h", "type": "file" }, { - "bom-ref": "fb65ac32362f95af", + "bom-ref": "945e8242b653e2a3", "name": "/usr/include/linux/tc_act/tc_connmark.h", "type": "file" }, { - "bom-ref": "664a66a364d13abc", + "bom-ref": "5c5a67d8af3f7b1c", "name": "/usr/include/linux/tc_act/tc_csum.h", "type": "file" }, { - "bom-ref": "6ff81ba1359c8ad7", + "bom-ref": "69c8820af6f84623", "name": "/usr/include/linux/tc_act/tc_ct.h", "type": "file" }, { - "bom-ref": "ce9162b269b0ca02", + "bom-ref": "0177fb41c03a2f9e", "name": "/usr/include/linux/tc_act/tc_ctinfo.h", "type": "file" }, { - "bom-ref": "54fe054ffe3ec4fb", + "bom-ref": "f61d7c387174be9b", "name": "/usr/include/linux/tc_act/tc_defact.h", "type": "file" }, { - "bom-ref": "eb1e3755d56ed5f1", + "bom-ref": "bb7b793710c5f6a9", "name": "/usr/include/linux/tc_act/tc_gact.h", "type": "file" }, { - "bom-ref": "6ccfa98db13f967f", + "bom-ref": "8733178e48f7ad2b", "name": "/usr/include/linux/tc_act/tc_gate.h", "type": "file" }, { - "bom-ref": "fe67a17b5190ab36", + "bom-ref": "ff1356db2dc28bbe", "name": "/usr/include/linux/tc_act/tc_ife.h", "type": "file" }, { - "bom-ref": "e27fd2044a8a6872", + "bom-ref": "5d293f99b6ea523a", "name": "/usr/include/linux/tc_act/tc_mirred.h", "type": "file" }, { - "bom-ref": "c3bae17ffe124837", + "bom-ref": "a9639d1602c269af", "name": "/usr/include/linux/tc_act/tc_mpls.h", "type": "file" }, { - "bom-ref": "d68d1ae86d7c2607", + "bom-ref": "105126cb961f9d8b", "name": "/usr/include/linux/tc_act/tc_nat.h", "type": "file" }, { - "bom-ref": "72cc44bb6bc7c2c7", + "bom-ref": "d3149da54bfe9d17", "name": "/usr/include/linux/tc_act/tc_pedit.h", "type": "file" }, { - "bom-ref": "4ae4cc36c0378d2d", + "bom-ref": "a09f41ec4938720d", "name": "/usr/include/linux/tc_act/tc_sample.h", "type": "file" }, { - "bom-ref": "ad83a0083e47d6a3", + "bom-ref": "30ad6474b9b78c93", "name": "/usr/include/linux/tc_act/tc_skbedit.h", "type": "file" }, { - "bom-ref": "3ee13f21b1a4962d", + "bom-ref": "7e6c17021ba69995", "name": "/usr/include/linux/tc_act/tc_skbmod.h", "type": "file" }, { - "bom-ref": "d474ced523abcd40", + "bom-ref": "4733e8ed611eb884", "name": "/usr/include/linux/tc_act/tc_tunnel_key.h", "type": "file" }, { - "bom-ref": "4cb405791ac71f77", + "bom-ref": "a95bf5207d582453", "name": "/usr/include/linux/tc_act/tc_vlan.h", "type": "file" }, { - "bom-ref": "a115a41a66216036", + "bom-ref": "3941a50df0be5286", "name": "/usr/include/linux/tc_ematch/tc_em_cmp.h", "type": "file" }, { - "bom-ref": "01897a4e3e3183e0", + "bom-ref": "f123213874f327ac", "name": "/usr/include/linux/tc_ematch/tc_em_ipt.h", "type": "file" }, { - "bom-ref": "330ae0c0cda86ac9", + "bom-ref": "1a26c31610680041", "name": "/usr/include/linux/tc_ematch/tc_em_meta.h", "type": "file" }, { - "bom-ref": "bf4e5fdd99310525", + "bom-ref": "07a5384081422ca9", "name": "/usr/include/linux/tc_ematch/tc_em_nbyte.h", "type": "file" }, { - "bom-ref": "584748a261be7618", + "bom-ref": "f2c8bde8549ca21c", "name": "/usr/include/linux/tc_ematch/tc_em_text.h", "type": "file" }, { - "bom-ref": "7cdcf247e2ee0a80", + "bom-ref": "5e84c6b784834e5c", "name": "/usr/include/linux/tcp.h", "type": "file" }, { - "bom-ref": "f3e2190d5416cdc5", + "bom-ref": "4198409e5d891d59", "name": "/usr/include/linux/tcp_metrics.h", "type": "file" }, { - "bom-ref": "63cb8a21cc3d69a8", + "bom-ref": "c26258fac2b23160", "name": "/usr/include/linux/tdx-guest.h", "type": "file" }, { - "bom-ref": "d7e7c7ba1c4088e2", + "bom-ref": "d6d9600f119c8aba", "name": "/usr/include/linux/tee.h", "type": "file" }, { - "bom-ref": "3fcbde067d8db2d6", + "bom-ref": "4877a65a8e82a2e2", "name": "/usr/include/linux/termios.h", "type": "file" }, { - "bom-ref": "d5ba849cc919073d", + "bom-ref": "786a536875e9a2a5", "name": "/usr/include/linux/thermal.h", "type": "file" }, { - "bom-ref": "2b8cc22a819ea472", + "bom-ref": "e25486fc8c253966", "name": "/usr/include/linux/thp7312.h", "type": "file" }, { - "bom-ref": "5283d24b6c856a2d", + "bom-ref": "3928a2c16f05d669", "name": "/usr/include/linux/time.h", "type": "file" }, { - "bom-ref": "5efbc6a7e5920551", + "bom-ref": "be19a9612f2de2cd", "name": "/usr/include/linux/time_types.h", "type": "file" }, { - "bom-ref": "d57ea6cb57b53f14", + "bom-ref": "5908108b2f08c9d0", "name": "/usr/include/linux/timerfd.h", "type": "file" }, { - "bom-ref": "5938a40a48d11030", + "bom-ref": "5b7b1e75b57bfeb8", "name": "/usr/include/linux/times.h", "type": "file" }, { - "bom-ref": "47eb752cf3ea990a", + "bom-ref": "120c93f4405f9fca", "name": "/usr/include/linux/timex.h", "type": "file" }, { - "bom-ref": "1be121f94ef35b44", + "bom-ref": "6767c36cd90b8ee8", "name": "/usr/include/linux/tiocl.h", "type": "file" }, { - "bom-ref": "1a059173dd9c3159", + "bom-ref": "883498d04b61f76d", "name": "/usr/include/linux/tipc.h", "type": "file" }, { - "bom-ref": "f6114b1b2995a6d6", + "bom-ref": "5d9ea9c679ce521a", "name": "/usr/include/linux/tipc_config.h", "type": "file" }, { - "bom-ref": "c4a5bc5ff8c0266c", + "bom-ref": "6ed991fd0605d3bc", "name": "/usr/include/linux/tipc_netlink.h", "type": "file" }, { - "bom-ref": "a7ae8a82f2bfa4e3", + "bom-ref": "d18de8624fb98abb", "name": "/usr/include/linux/tipc_sockets_diag.h", "type": "file" }, { - "bom-ref": "65c8f15fe08aede5", + "bom-ref": "54c2dcb77ff4a019", "name": "/usr/include/linux/tls.h", "type": "file" }, { - "bom-ref": "c98db610f77dddec", + "bom-ref": "551e7bea95b29f64", "name": "/usr/include/linux/toshiba.h", "type": "file" }, { - "bom-ref": "8120e4f86a7cff22", + "bom-ref": "f0d1281f4d199bba", "name": "/usr/include/linux/tps6594_pfsm.h", "type": "file" }, { - "bom-ref": "d768e064739d38d2", + "bom-ref": "8961d26a32d0bb7a", "name": "/usr/include/linux/tty.h", "type": "file" }, { - "bom-ref": "fc272f88211f4de9", + "bom-ref": "5e1697c976871c85", "name": "/usr/include/linux/tty_flags.h", "type": "file" }, { - "bom-ref": "2a2436bafa2f77a5", + "bom-ref": "d1db5584540d47e5", "name": "/usr/include/linux/types.h", "type": "file" }, { - "bom-ref": "b4d81ce4e22d3160", + "bom-ref": "ae85403554f016c0", "name": "/usr/include/linux/ublk_cmd.h", "type": "file" }, { - "bom-ref": "cb16692f5dc4e2d7", + "bom-ref": "c2f1bc6f8e1d7f23", "name": "/usr/include/linux/udf_fs_i.h", "type": "file" }, { - "bom-ref": "27b337dc73d375b2", + "bom-ref": "0ee71bd8f0bc6d86", "name": "/usr/include/linux/udmabuf.h", "type": "file" }, { - "bom-ref": "8257d76b13b41e1d", + "bom-ref": "f86d1c3c09798979", "name": "/usr/include/linux/udp.h", "type": "file" }, { - "bom-ref": "ffa3bdcc952efb78", + "bom-ref": "8da73c5edae8bd4c", "name": "/usr/include/linux/uhid.h", "type": "file" }, { - "bom-ref": "be717a7c52da4657", + "bom-ref": "e54da140a44fcabb", "name": "/usr/include/linux/uinput.h", "type": "file" }, { - "bom-ref": "320326b050922172", + "bom-ref": "a34a4b891de2d7ba", "name": "/usr/include/linux/uio.h", "type": "file" }, { - "bom-ref": "4de30e7bfbef0c1c", + "bom-ref": "bc66269a18be5d20", "name": "/usr/include/linux/uleds.h", "type": "file" }, { - "bom-ref": "ab57c345a6d20eb0", + "bom-ref": "07682720150c0884", "name": "/usr/include/linux/ultrasound.h", "type": "file" }, { - "bom-ref": "3965087bbde71099", + "bom-ref": "59ec9a37cbb304f1", "name": "/usr/include/linux/um_timetravel.h", "type": "file" }, { - "bom-ref": "f44c3aa3fce0836b", + "bom-ref": "5f086b991452a36b", "name": "/usr/include/linux/un.h", "type": "file" }, { - "bom-ref": "a5fcc3acd445b8ae", + "bom-ref": "ab61fdf379cb8422", "name": "/usr/include/linux/unistd.h", "type": "file" }, { - "bom-ref": "c69a31239039d3bd", + "bom-ref": "75335bbd28f1b9e9", "name": "/usr/include/linux/unix_diag.h", "type": "file" }, { - "bom-ref": "d7629ec0d8a8a214", + "bom-ref": "522d9e639e2cab68", "name": "/usr/include/linux/usb/audio.h", "type": "file" }, { - "bom-ref": "47cffed641c02834", + "bom-ref": "bd203bab028b9cdc", "name": "/usr/include/linux/usb/cdc-wdm.h", "type": "file" }, { - "bom-ref": "f00661d4c14292c8", + "bom-ref": "f23c7c58a3474f68", "name": "/usr/include/linux/usb/cdc.h", "type": "file" }, { - "bom-ref": "8262625e701fd33e", + "bom-ref": "b3f001ae36ab4e42", "name": "/usr/include/linux/usb/ch11.h", "type": "file" }, { - "bom-ref": "097a4a9939ab16ef", + "bom-ref": "d0a6db77537c4737", "name": "/usr/include/linux/usb/ch9.h", "type": "file" }, { - "bom-ref": "918993bc0e3a9cbf", + "bom-ref": "9153f11a915ab5cf", "name": "/usr/include/linux/usb/charger.h", "type": "file" }, { - "bom-ref": "653e2a929c68d752", + "bom-ref": "a776da43b9209c46", "name": "/usr/include/linux/usb/functionfs.h", "type": "file" }, { - "bom-ref": "19a7f8b185c04aa2", + "bom-ref": "d35063a46b7ffbea", "name": "/usr/include/linux/usb/g_printer.h", "type": "file" }, { - "bom-ref": "b44fa64162f80168", + "bom-ref": "97c6540c99892c28", "name": "/usr/include/linux/usb/g_uvc.h", "type": "file" }, { - "bom-ref": "581e4f88c4a5457e", + "bom-ref": "98420a4c6d0362c2", "name": "/usr/include/linux/usb/gadgetfs.h", "type": "file" }, { - "bom-ref": "5a05837354bebcaf", + "bom-ref": "91b57a58a25ff8ef", "name": "/usr/include/linux/usb/midi.h", "type": "file" }, { - "bom-ref": "1ab5ac39f1093f67", + "bom-ref": "dc07d0a5de3527db", "name": "/usr/include/linux/usb/raw_gadget.h", "type": "file" }, { - "bom-ref": "12611353daf8148e", + "bom-ref": "a17210b8a712b4f2", "name": "/usr/include/linux/usb/tmc.h", "type": "file" }, { - "bom-ref": "0391f651faa8111e", + "bom-ref": "5f6451a07d03978a", "name": "/usr/include/linux/usb/video.h", "type": "file" }, { - "bom-ref": "542e761f75bca1c0", + "bom-ref": "2d941c374acc00a0", "name": "/usr/include/linux/usbdevice_fs.h", "type": "file" }, { - "bom-ref": "45ed76fea4b7b85b", + "bom-ref": "749150663b057333", "name": "/usr/include/linux/usbip.h", "type": "file" }, { - "bom-ref": "3de7f25bbb566da8", + "bom-ref": "93aac0e823eab0d8", "name": "/usr/include/linux/user_events.h", "type": "file" }, { - "bom-ref": "8c0d85cd4953b3ab", + "bom-ref": "f3fde80c507268bb", "name": "/usr/include/linux/userfaultfd.h", "type": "file" }, { - "bom-ref": "b6a8d913c1b3de0b", + "bom-ref": "7e0f833098f8a1a7", "name": "/usr/include/linux/userio.h", "type": "file" }, { - "bom-ref": "744f70959f8d485e", + "bom-ref": "8d0dab8fc67bdaba", "name": "/usr/include/linux/utime.h", "type": "file" }, { - "bom-ref": "76b2ab91ad13395d", + "bom-ref": "7004339f362073e1", "name": "/usr/include/linux/utsname.h", "type": "file" }, { - "bom-ref": "5eccff85873d1bb3", + "bom-ref": "69380eb3da710ecb", "name": "/usr/include/linux/uuid.h", "type": "file" }, { - "bom-ref": "4d42b7c0bca921cb", + "bom-ref": "b871f27fc2067bc7", "name": "/usr/include/linux/uvcvideo.h", "type": "file" }, { - "bom-ref": "04523dc3f71cd8ff", + "bom-ref": "dce9dcec588dc9c3", "name": "/usr/include/linux/v4l2-common.h", "type": "file" }, { - "bom-ref": "83fc30bd453dd904", + "bom-ref": "2cda2f7e21101c44", "name": "/usr/include/linux/v4l2-controls.h", "type": "file" }, { - "bom-ref": "3e0c8ecdb4f431ae", + "bom-ref": "3723dbc14dd910c2", "name": "/usr/include/linux/v4l2-dv-timings.h", "type": "file" }, { - "bom-ref": "23e1cd0545a181c1", + "bom-ref": "a50dfa7066a83c21", "name": "/usr/include/linux/v4l2-mediabus.h", "type": "file" }, { - "bom-ref": "341760e299899ed9", + "bom-ref": "6f0913f0f7e69335", "name": "/usr/include/linux/v4l2-subdev.h", "type": "file" }, { - "bom-ref": "f561ed81aab3c6b4", + "bom-ref": "4f2b0b75891d4e00", "name": "/usr/include/linux/vbox_err.h", "type": "file" }, { - "bom-ref": "d519702be424fb25", + "bom-ref": "81b55ce16a0e4bad", "name": "/usr/include/linux/vbox_vmmdev_types.h", "type": "file" }, { - "bom-ref": "bf4aa21dac07dd18", + "bom-ref": "75214bbf5e454a34", "name": "/usr/include/linux/vboxguest.h", "type": "file" }, { - "bom-ref": "ca6bba0202b489d9", + "bom-ref": "7cd4c0c0752bd805", "name": "/usr/include/linux/vdpa.h", "type": "file" }, { - "bom-ref": "286cdf950dfc3be1", + "bom-ref": "41fb681df5a4067d", "name": "/usr/include/linux/vduse.h", "type": "file" }, { - "bom-ref": "9fae5ddb7f56ee62", + "bom-ref": "21793359822c504e", "name": "/usr/include/linux/version.h", "type": "file" }, { - "bom-ref": "f48a290dc1eae362", + "bom-ref": "65149583777f2b02", "name": "/usr/include/linux/veth.h", "type": "file" }, { - "bom-ref": "29fdf8c18fb797da", + "bom-ref": "fee8f8a6f09cd5a2", "name": "/usr/include/linux/vfio.h", "type": "file" }, { - "bom-ref": "65a6dfe39128f459", + "bom-ref": "70a727d0ea250cd5", "name": "/usr/include/linux/vfio_ccw.h", "type": "file" }, { - "bom-ref": "35eef44563c19dda", + "bom-ref": "c707093514e09f9e", "name": "/usr/include/linux/vfio_zdev.h", "type": "file" }, { - "bom-ref": "ccc733d151e28763", + "bom-ref": "d8d27a0fee3acdbb", "name": "/usr/include/linux/vhost.h", "type": "file" }, { - "bom-ref": "dfac9ab296e703cd", + "bom-ref": "5874a6f1c23cbfa5", "name": "/usr/include/linux/vhost_types.h", "type": "file" }, { - "bom-ref": "1b869db003fd4726", + "bom-ref": "122b79bc28c48332", "name": "/usr/include/linux/videodev2.h", "type": "file" }, { - "bom-ref": "be5e0fd354baf289", + "bom-ref": "9952051eceab156d", "name": "/usr/include/linux/virtio_9p.h", "type": "file" }, { - "bom-ref": "c30acd3ae2f7c365", + "bom-ref": "d74009b9b5dd3a75", "name": "/usr/include/linux/virtio_balloon.h", "type": "file" }, { - "bom-ref": "8d419d4c72ee6ec9", + "bom-ref": "3171455b51b6f6b1", "name": "/usr/include/linux/virtio_blk.h", "type": "file" }, { - "bom-ref": "73179ea9cf261e14", + "bom-ref": "74330fe5964d92d0", "name": "/usr/include/linux/virtio_bt.h", "type": "file" }, { - "bom-ref": "8d42cd32f458d119", + "bom-ref": "29ede3547a9e77c5", "name": "/usr/include/linux/virtio_config.h", "type": "file" }, { - "bom-ref": "dfe7d5e0462c7654", + "bom-ref": "3e81288e3b87d850", "name": "/usr/include/linux/virtio_console.h", "type": "file" }, { - "bom-ref": "fc4e2d2a3c05cf5d", + "bom-ref": "ccddd22d7a391131", "name": "/usr/include/linux/virtio_crypto.h", "type": "file" }, { - "bom-ref": "bd421a802c39e05b", + "bom-ref": "8fffb81d51514dcb", "name": "/usr/include/linux/virtio_fs.h", "type": "file" }, { - "bom-ref": "3f2f3cac388146f9", + "bom-ref": "679fdf9552a54ed1", "name": "/usr/include/linux/virtio_gpio.h", "type": "file" }, { - "bom-ref": "f11d399bc38839a3", + "bom-ref": "f1ddfdbe0c07d983", "name": "/usr/include/linux/virtio_gpu.h", "type": "file" }, { - "bom-ref": "93b1897eb0e16996", + "bom-ref": "fab04ab60aea4d9a", "name": "/usr/include/linux/virtio_i2c.h", "type": "file" }, { - "bom-ref": "c4bf6c78a5647ff4", + "bom-ref": "405d03c3d35fe76c", "name": "/usr/include/linux/virtio_ids.h", "type": "file" }, { - "bom-ref": "b7204673396559ce", + "bom-ref": "2fc5611bfb5a34b2", "name": "/usr/include/linux/virtio_input.h", "type": "file" }, { - "bom-ref": "4fc68a75d9f67d5a", + "bom-ref": "45f935fd98eab002", "name": "/usr/include/linux/virtio_iommu.h", "type": "file" }, { - "bom-ref": "ffc02ea90070f27f", + "bom-ref": "44d848741a9cde1b", "name": "/usr/include/linux/virtio_mem.h", "type": "file" }, { - "bom-ref": "b603027633680fd7", + "bom-ref": "186c1b00d5740f7f", "name": "/usr/include/linux/virtio_mmio.h", "type": "file" }, { - "bom-ref": "1352b37df673e0f5", + "bom-ref": "e184b2b249bbb111", "name": "/usr/include/linux/virtio_net.h", "type": "file" }, { - "bom-ref": "875ad449b4284169", + "bom-ref": "5fb328c110d4b465", "name": "/usr/include/linux/virtio_pci.h", "type": "file" }, { - "bom-ref": "33da627f7340f89c", + "bom-ref": "a478e88a5ff09604", "name": "/usr/include/linux/virtio_pcidev.h", "type": "file" }, { - "bom-ref": "2e5cb06da322789c", + "bom-ref": "5e3ea5fe41db03e0", "name": "/usr/include/linux/virtio_pmem.h", "type": "file" }, { - "bom-ref": "9a0790704de527d9", + "bom-ref": "9a20869e2b5f0e55", "name": "/usr/include/linux/virtio_ring.h", "type": "file" }, { - "bom-ref": "6797f5800a291ec9", + "bom-ref": "d24adb46851ca109", "name": "/usr/include/linux/virtio_rng.h", "type": "file" }, { - "bom-ref": "24a677dfc5588d67", + "bom-ref": "64d213935926668b", "name": "/usr/include/linux/virtio_scmi.h", "type": "file" }, { - "bom-ref": "0048d048e75a02c0", + "bom-ref": "197baee64ef12a90", "name": "/usr/include/linux/virtio_scsi.h", "type": "file" }, { - "bom-ref": "cc290c43039e954b", + "bom-ref": "7ec43fae2b64c227", "name": "/usr/include/linux/virtio_snd.h", "type": "file" }, { - "bom-ref": "5803181b49407613", + "bom-ref": "161f069f059c1177", "name": "/usr/include/linux/virtio_types.h", "type": "file" }, { - "bom-ref": "4eaf02ec4e5a8a28", + "bom-ref": "e4c043d9d7946d54", "name": "/usr/include/linux/virtio_vsock.h", "type": "file" }, { - "bom-ref": "1ae26bd1541c584e", + "bom-ref": "04fbcd3297e7243a", "name": "/usr/include/linux/vm_sockets.h", "type": "file" }, { - "bom-ref": "f3ca1fee08c252b6", + "bom-ref": "034317cfce3243c2", "name": "/usr/include/linux/vm_sockets_diag.h", "type": "file" }, { - "bom-ref": "d52880f3494f7aca", + "bom-ref": "794e0d00736604ca", "name": "/usr/include/linux/vmcore.h", "type": "file" }, { - "bom-ref": "6584946123273d8f", + "bom-ref": "5e6e033069cd5377", "name": "/usr/include/linux/vsockmon.h", "type": "file" }, { - "bom-ref": "5b7f553aaf328843", + "bom-ref": "913531c8f28a225b", "name": "/usr/include/linux/vt.h", "type": "file" }, { - "bom-ref": "75a32aaca878ffc6", + "bom-ref": "b7c91912d0778ed6", "name": "/usr/include/linux/vtpm_proxy.h", "type": "file" }, { - "bom-ref": "796c3929bd67929d", + "bom-ref": "97ae012b8ccfca8d", "name": "/usr/include/linux/wait.h", "type": "file" }, { - "bom-ref": "dc96f4056a06f8a1", + "bom-ref": "e13d85c2197ff03d", "name": "/usr/include/linux/watch_queue.h", "type": "file" }, { - "bom-ref": "9d2d5a77667a47a2", + "bom-ref": "a2f1f987711380d6", "name": "/usr/include/linux/watchdog.h", "type": "file" }, { - "bom-ref": "394be30ca81d161c", + "bom-ref": "bf3929daf743df40", "name": "/usr/include/linux/wireguard.h", "type": "file" }, { - "bom-ref": "0993a2f1d18d2f9a", + "bom-ref": "d00434e17fed2682", "name": "/usr/include/linux/wireless.h", "type": "file" }, { - "bom-ref": "2e2a5d0668f6694d", + "bom-ref": "bd9e9c91b781fac9", "name": "/usr/include/linux/wmi.h", "type": "file" }, { - "bom-ref": "eac4653272cde5a7", + "bom-ref": "dd7a871e6b4fc90f", "name": "/usr/include/linux/wwan.h", "type": "file" }, { - "bom-ref": "1fd910da87af5b22", + "bom-ref": "a398f50d9446c012", "name": "/usr/include/linux/x25.h", "type": "file" }, { - "bom-ref": "3f14ef162a22e3a7", + "bom-ref": "320af983f4e732bb", "name": "/usr/include/linux/xattr.h", "type": "file" }, { - "bom-ref": "42efc37d827ba67d", + "bom-ref": "0ad1e77a2776f309", "name": "/usr/include/linux/xdp_diag.h", "type": "file" }, { - "bom-ref": "9badbdedce022fcb", + "bom-ref": "90e192265f0aa63b", "name": "/usr/include/linux/xfrm.h", "type": "file" }, { - "bom-ref": "3eef644b5fd746d3", + "bom-ref": "4fa3ffcffa96d55f", "name": "/usr/include/linux/xilinx-v4l2-controls.h", "type": "file" }, { - "bom-ref": "68ff2832e28e7220", + "bom-ref": "8c53a6230d3151e0", "name": "/usr/include/linux/zorro.h", "type": "file" }, { - "bom-ref": "d42292c0eafc85d9", + "bom-ref": "32a5e849675b5d25", "name": "/usr/include/linux/zorro_ids.h", "type": "file" }, { - "bom-ref": "a4553857c82bc0ec", + "bom-ref": "10a7e5b218d2a608", "name": "/usr/include/locale.h", "type": "file" }, { - "bom-ref": "60310db9dbb418ce", + "bom-ref": "b44125bcaf20ef42", "name": "/usr/include/malloc.h", "type": "file" }, { - "bom-ref": "87f1afd3a6ae89f6", + "bom-ref": "30ffc7d18438b00e", "name": "/usr/include/math.h", "type": "file" }, { - "bom-ref": "4bda915c47dfc887", + "bom-ref": "78bbbac64fee7efb", "name": "/usr/include/mcheck.h", "type": "file" }, { - "bom-ref": "ed706f07b0e5126d", + "bom-ref": "e1c2a2ca76d3ba09", "name": "/usr/include/memory.h", "type": "file" }, { - "bom-ref": "e0118b1995476280", + "bom-ref": "f0f7cc000dc48c2e", + "name": "/usr/include/metee.h", + "type": "file" + }, + { + "bom-ref": "8c3cbd2138a4d6d8", "name": "/usr/include/misc/cxl.h", "type": "file" }, { - "bom-ref": "474ea369e38a392f", + "bom-ref": "dd18da402528319b", "name": "/usr/include/misc/fastrpc.h", "type": "file" }, { - "bom-ref": "434604641e1d1adb", + "bom-ref": "a721c67127e6d47f", "name": "/usr/include/misc/ocxl.h", "type": "file" }, { - "bom-ref": "467ebfc2fa1dcf5c", + "bom-ref": "bf68308a7e19b550", "name": "/usr/include/misc/pvpanic.h", "type": "file" }, { - "bom-ref": "d78d14896a08e542", + "bom-ref": "b6b878d537eff526", "name": "/usr/include/misc/uacce/hisi_qm.h", "type": "file" }, { - "bom-ref": "6914fc65420ec491", + "bom-ref": "e8d6c7a1059c9211", "name": "/usr/include/misc/uacce/uacce.h", "type": "file" }, { - "bom-ref": "4180fde4d9c4ffc9", + "bom-ref": "24169cf6112f0b41", "name": "/usr/include/misc/xilinx_sdfec.h", "type": "file" }, { - "bom-ref": "88fea91ce45fbd5f", + "bom-ref": "13711e658f412d77", "name": "/usr/include/mntent.h", "type": "file" }, { - "bom-ref": "9aebf160ea9b9e3b", + "bom-ref": "52f873d4292f0933", "name": "/usr/include/monetary.h", "type": "file" }, { - "bom-ref": "9ab319370f38c257", + "bom-ref": "d87c0d879ab6336f", "name": "/usr/include/mqueue.h", "type": "file" }, { - "bom-ref": "2e5814425dd56f67", + "bom-ref": "a1058e72142018ff", "name": "/usr/include/mtd/inftl-user.h", "type": "file" }, { - "bom-ref": "b7010607876f6111", + "bom-ref": "4aadf97a2f4c7249", "name": "/usr/include/mtd/mtd-abi.h", "type": "file" }, { - "bom-ref": "1e07a8f3be3366d3", + "bom-ref": "704ec45d83723683", "name": "/usr/include/mtd/mtd-user.h", "type": "file" }, { - "bom-ref": "d55d63793560113b", + "bom-ref": "728ff7f23d9e8a5f", "name": "/usr/include/mtd/nftl-user.h", "type": "file" }, { - "bom-ref": "37ea72ab993fb99d", + "bom-ref": "0c36fe631ee7a749", "name": "/usr/include/mtd/ubi-user.h", "type": "file" }, { - "bom-ref": "106a054c9dc219c7", + "bom-ref": "f8039210c7ea5c47", "name": "/usr/include/net/ethernet.h", "type": "file" }, { - "bom-ref": "a089ad75e7f0d22b", + "bom-ref": "edbee56795547943", "name": "/usr/include/net/if.h", "type": "file" }, { - "bom-ref": "c9fadddce82059ed", + "bom-ref": "df350d4773964005", "name": "/usr/include/net/if_arp.h", "type": "file" }, { - "bom-ref": "d5bfb89743b48e1f", + "bom-ref": "f904022b28b02e0f", "name": "/usr/include/net/if_packet.h", "type": "file" }, { - "bom-ref": "0d10899f5a608de2", + "bom-ref": "2f405560d8e10016", "name": "/usr/include/net/if_ppp.h", "type": "file" }, { - "bom-ref": "f24dc3490a5c982f", + "bom-ref": "89e6584ad9f47dc3", "name": "/usr/include/net/if_shaper.h", "type": "file" }, { - "bom-ref": "9d098201564c7c93", + "bom-ref": "5ce64ef0e0954d67", "name": "/usr/include/net/if_slip.h", "type": "file" }, { - "bom-ref": "35b44841f738dfce", + "bom-ref": "3b14a536450b4a52", "name": "/usr/include/net/ppp-comp.h", "type": "file" }, { - "bom-ref": "f916d39bf6e47cf3", + "bom-ref": "83a63e24f0dda2c3", "name": "/usr/include/net/ppp_defs.h", "type": "file" }, { - "bom-ref": "be039d6050f8be4e", + "bom-ref": "0438e206cde29962", "name": "/usr/include/net/route.h", "type": "file" }, { - "bom-ref": "9c05c986c8d058d1", + "bom-ref": "893c515114fc0129", "name": "/usr/include/netash/ash.h", "type": "file" }, { - "bom-ref": "53b7a7e0a4ddef5e", + "bom-ref": "7aa3a4a8350cd6ae", "name": "/usr/include/netatalk/at.h", "type": "file" }, { - "bom-ref": "8945ba669b58016f", + "bom-ref": "3766146f1bcf2f4b", "name": "/usr/include/netax25/ax25.h", "type": "file" }, { - "bom-ref": "a380ec20b6e08982", + "bom-ref": "fb172a6f85597c42", "name": "/usr/include/netdb.h", "type": "file" }, { - "bom-ref": "3261c68c433ce24f", + "bom-ref": "8a3e7158c767ea53", "name": "/usr/include/neteconet/ec.h", "type": "file" }, { - "bom-ref": "a892c2cda12d5d7f", + "bom-ref": "4a760cdece937e4f", "name": "/usr/include/netinet/ether.h", "type": "file" }, { - "bom-ref": "2b573a70c3a1d346", + "bom-ref": "996d522f667a1cd2", "name": "/usr/include/netinet/icmp6.h", "type": "file" }, { - "bom-ref": "ed9c9d298e5e1813", + "bom-ref": "099284d39ab3dbc7", "name": "/usr/include/netinet/if_ether.h", "type": "file" }, { - "bom-ref": "90abdce4f762e119", + "bom-ref": "038ac2dda2ee5765", "name": "/usr/include/netinet/if_fddi.h", "type": "file" }, { - "bom-ref": "30fcf5b0002cf0a3", + "bom-ref": "bd4b976186055837", "name": "/usr/include/netinet/if_tr.h", "type": "file" }, { - "bom-ref": "7bf2b0b06752e1cf", + "bom-ref": "eebe574707e5448b", "name": "/usr/include/netinet/igmp.h", "type": "file" }, { - "bom-ref": "091aa80118869258", + "bom-ref": "f29c91ba672d4ea4", "name": "/usr/include/netinet/in.h", "type": "file" }, { - "bom-ref": "9ba93c8232a7ab58", + "bom-ref": "bc3c6d3d86f833a0", "name": "/usr/include/netinet/in_systm.h", "type": "file" }, { - "bom-ref": "f3bb837bc8aa058c", + "bom-ref": "e6ce0c7ee2fe30b0", "name": "/usr/include/netinet/ip.h", "type": "file" }, { - "bom-ref": "7945e4f09dcb5ad5", + "bom-ref": "5e0b116a90feacbd", "name": "/usr/include/netinet/ip6.h", "type": "file" }, { - "bom-ref": "da0a53059ac09be2", + "bom-ref": "a41c13f8dfe4e50e", "name": "/usr/include/netinet/ip_icmp.h", "type": "file" }, { - "bom-ref": "dffbc66ee39e3155", + "bom-ref": "607d1cff820b5da5", "name": "/usr/include/netinet/tcp.h", "type": "file" }, { - "bom-ref": "2fb611932d5b83c6", + "bom-ref": "2a6d26fd0450039e", "name": "/usr/include/netinet/udp.h", "type": "file" }, { - "bom-ref": "c16b8881485d7a96", + "bom-ref": "8074e54f42d0fe0e", "name": "/usr/include/netipx/ipx.h", "type": "file" }, { - "bom-ref": "6d963d582b167a84", + "bom-ref": "e6d3b011faa7ca1c", "name": "/usr/include/netiucv/iucv.h", "type": "file" }, { - "bom-ref": "3eeb149488f8a7b2", + "bom-ref": "6e2406f007457dc6", "name": "/usr/include/netpacket/packet.h", "type": "file" }, { - "bom-ref": "3c458396a9376ef9", + "bom-ref": "da62c84cadfe5e61", "name": "/usr/include/netrom/netrom.h", "type": "file" }, { - "bom-ref": "3079c12ca8b8b8f7", + "bom-ref": "a0765348cc69a573", "name": "/usr/include/netrose/rose.h", "type": "file" }, { - "bom-ref": "2870a144f9df145a", + "bom-ref": "3c1ba38ae96fe4ae", "name": "/usr/include/nfs/nfs.h", "type": "file" }, { - "bom-ref": "c4340765a16c7956", + "bom-ref": "4a687c8692190b76", "name": "/usr/include/nl_types.h", "type": "file" }, { - "bom-ref": "f16c2374809e1d1f", + "bom-ref": "a4d290b34916e923", "name": "/usr/include/nss.h", "type": "file" }, { - "bom-ref": "7a5a6545402df29f", + "bom-ref": "9054cf98145877db", "name": "/usr/include/obstack.h", "type": "file" }, { - "bom-ref": "d3a7e6a9ccdf6b64", + "bom-ref": "e6abeba0de064d18", "name": "/usr/include/paths.h", "type": "file" }, { - "bom-ref": "b57b997f2c3d364c", + "bom-ref": "8cab041d15c04278", "name": "/usr/include/poll.h", "type": "file" }, { - "bom-ref": "c757359f73d15c42", + "bom-ref": "657bbbaad79173c6", "name": "/usr/include/printf.h", "type": "file" }, { - "bom-ref": "123d87a01b63a920", + "bom-ref": "15236dd91427de40", "name": "/usr/include/proc_service.h", "type": "file" }, { - "bom-ref": "7f1f5b6af3c8908c", + "bom-ref": "b7a6bee4dcc04f0c", "name": "/usr/include/protocols/routed.h", "type": "file" }, { - "bom-ref": "b4e78dc1fd4b23c3", + "bom-ref": "2e766a6158769787", "name": "/usr/include/protocols/rwhod.h", "type": "file" }, { - "bom-ref": "056426fcbe118080", + "bom-ref": "dd8953dd176d1af4", "name": "/usr/include/protocols/talkd.h", "type": "file" }, { - "bom-ref": "9d4f72c93e559d47", + "bom-ref": "6668107fdbf13093", "name": "/usr/include/protocols/timed.h", "type": "file" }, { - "bom-ref": "f66bb8ac7e9cd820", + "bom-ref": "07c99beb98d0a07c", "name": "/usr/include/pthread.h", "type": "file" }, { - "bom-ref": "9edcdf9a007ae7b4", + "bom-ref": "e227c11f40482f68", "name": "/usr/include/pty.h", "type": "file" }, { - "bom-ref": "0794bfad4c7f9545", + "bom-ref": "1a85c26ae36c0ce1", "name": "/usr/include/pwd.h", "type": "file" }, { - "bom-ref": "30d428c9d2296fba", + "bom-ref": "edecff14e7455bb2", "name": "/usr/include/python3.12/Python.h", "type": "file" }, { - "bom-ref": "577d800430577679", + "bom-ref": "bed9471a527aeec1", "name": "/usr/include/python3.12/abstract.h", "type": "file" }, { - "bom-ref": "328e5a409980ab5e", + "bom-ref": "886d145374c55a36", "name": "/usr/include/python3.12/bltinmodule.h", "type": "file" }, { - "bom-ref": "9832af3d5ce1c215", + "bom-ref": "f4942f357a64e849", "name": "/usr/include/python3.12/boolobject.h", "type": "file" }, { - "bom-ref": "7ad918cb673af3cb", + "bom-ref": "dfbeaac1c1bad76f", "name": "/usr/include/python3.12/bytearrayobject.h", "type": "file" }, { - "bom-ref": "58ce0381e38eb1af", + "bom-ref": "7d710a1dbc63afcf", "name": "/usr/include/python3.12/bytesobject.h", "type": "file" }, { - "bom-ref": "b29378fc00035645", + "bom-ref": "f0f46af48805b105", "name": "/usr/include/python3.12/ceval.h", "type": "file" }, { - "bom-ref": "e8ba5208f0172e1f", + "bom-ref": "a88b9948ff55b733", "name": "/usr/include/python3.12/codecs.h", "type": "file" }, { - "bom-ref": "af11cd2b4d762408", + "bom-ref": "677f40510d1b58e4", "name": "/usr/include/python3.12/compile.h", "type": "file" }, { - "bom-ref": "57ab2add8c5161ba", + "bom-ref": "277371fe1c848bc2", "name": "/usr/include/python3.12/complexobject.h", "type": "file" }, { - "bom-ref": "bddc278c78b6bbce", + "bom-ref": "dd493bf96c0177a6", "name": "/usr/include/python3.12/cpython/abstract.h", "type": "file" }, { - "bom-ref": "ab85b89aaa8f6277", + "bom-ref": "4f2aa7cb86907a07", "name": "/usr/include/python3.12/cpython/bytearrayobject.h", "type": "file" }, { - "bom-ref": "aa976aa63f7289f7", + "bom-ref": "f89a485453ba8aff", "name": "/usr/include/python3.12/cpython/bytesobject.h", "type": "file" }, { - "bom-ref": "bfd6be7fa3019d4d", + "bom-ref": "1ab42b66b4e3b201", "name": "/usr/include/python3.12/cpython/cellobject.h", "type": "file" }, { - "bom-ref": "69a75b47cd7a279b", + "bom-ref": "36f778177ef5db9f", "name": "/usr/include/python3.12/cpython/ceval.h", "type": "file" }, { - "bom-ref": "37839cc84a63a0af", + "bom-ref": "b02bac708c6ca6d7", "name": "/usr/include/python3.12/cpython/classobject.h", "type": "file" }, { - "bom-ref": "5a57ec7dfe917744", + "bom-ref": "fbf3aeee4da10fb8", "name": "/usr/include/python3.12/cpython/code.h", "type": "file" }, { - "bom-ref": "33d324dfbb9e543b", + "bom-ref": "3c91f9c5e79caa8f", "name": "/usr/include/python3.12/cpython/compile.h", "type": "file" }, { - "bom-ref": "ee5e4f1d2f6b7b7b", + "bom-ref": "c01ce42d70fddf73", "name": "/usr/include/python3.12/cpython/complexobject.h", "type": "file" }, { - "bom-ref": "87d0c7d31db99efb", + "bom-ref": "e6db14b14fd7f94f", "name": "/usr/include/python3.12/cpython/context.h", "type": "file" }, { - "bom-ref": "d68b074b629927c2", + "bom-ref": "70dd27d6f7f1d9f2", "name": "/usr/include/python3.12/cpython/descrobject.h", "type": "file" }, { - "bom-ref": "e26d2daff62e3c8d", + "bom-ref": "2634312a5e52e655", "name": "/usr/include/python3.12/cpython/dictobject.h", "type": "file" }, { - "bom-ref": "19dc743b96c23cc0", + "bom-ref": "c3332f5d7f601794", "name": "/usr/include/python3.12/cpython/fileobject.h", "type": "file" }, { - "bom-ref": "5d79124905f2c9c6", + "bom-ref": "aa5df66dd4cc482a", "name": "/usr/include/python3.12/cpython/fileutils.h", "type": "file" }, { - "bom-ref": "af2acf18bad1d54b", + "bom-ref": "519bde7792e0f46b", "name": "/usr/include/python3.12/cpython/floatobject.h", "type": "file" }, { - "bom-ref": "15402c4d18d783a0", + "bom-ref": "c329c0fc68fac954", "name": "/usr/include/python3.12/cpython/frameobject.h", "type": "file" }, { - "bom-ref": "b6958b09a6c2e75d", + "bom-ref": "b6ae6d5ecc3e0e65", "name": "/usr/include/python3.12/cpython/funcobject.h", "type": "file" }, { - "bom-ref": "57ca014b1fb17e4a", + "bom-ref": "77237a882414f722", "name": "/usr/include/python3.12/cpython/genobject.h", "type": "file" }, { - "bom-ref": "a16475dba069c85e", + "bom-ref": "68229ef1a2a7506a", "name": "/usr/include/python3.12/cpython/import.h", "type": "file" }, { - "bom-ref": "1ad2685c00997657", + "bom-ref": "4121c9dd3f333eab", "name": "/usr/include/python3.12/cpython/initconfig.h", "type": "file" }, { - "bom-ref": "46889284d00041d0", + "bom-ref": "de195b8d3815e248", "name": "/usr/include/python3.12/cpython/interpreteridobject.h", "type": "file" }, { - "bom-ref": "1c6c176d7158077d", + "bom-ref": "5716a0dd908c68ad", "name": "/usr/include/python3.12/cpython/listobject.h", "type": "file" }, { - "bom-ref": "5c7349b9a62120a3", + "bom-ref": "fb3dc71cbc3178e3", "name": "/usr/include/python3.12/cpython/longintrepr.h", "type": "file" }, { - "bom-ref": "6aa91a43521a12a7", + "bom-ref": "93d51bd357eb37ef", "name": "/usr/include/python3.12/cpython/longobject.h", "type": "file" }, { - "bom-ref": "7c25dcd25f593d79", + "bom-ref": "6446c2df741a415d", "name": "/usr/include/python3.12/cpython/memoryobject.h", "type": "file" }, { - "bom-ref": "3486c00860cb7f4a", + "bom-ref": "566869ea85ce514a", "name": "/usr/include/python3.12/cpython/methodobject.h", "type": "file" }, { - "bom-ref": "f3b336c80ee8af58", + "bom-ref": "b33ee92a78f81140", "name": "/usr/include/python3.12/cpython/modsupport.h", "type": "file" }, { - "bom-ref": "1e0c235c9dcda103", + "bom-ref": "a74d656296ea526b", "name": "/usr/include/python3.12/cpython/object.h", "type": "file" }, { - "bom-ref": "9419923ad7f3bcfc", + "bom-ref": "769efa0c471b85c8", "name": "/usr/include/python3.12/cpython/objimpl.h", "type": "file" }, { - "bom-ref": "2112787a6913df03", + "bom-ref": "2cf4136d4545e687", "name": "/usr/include/python3.12/cpython/odictobject.h", "type": "file" }, { - "bom-ref": "277aa092ca7adffb", + "bom-ref": "b064bc7728f44597", "name": "/usr/include/python3.12/cpython/picklebufobject.h", "type": "file" }, { - "bom-ref": "fb9ea140b657abcd", + "bom-ref": "f0847cbe9f9ef1b9", "name": "/usr/include/python3.12/cpython/pthread_stubs.h", "type": "file" }, { - "bom-ref": "c7f2b89a02ecfea2", + "bom-ref": "27d7b87887422172", "name": "/usr/include/python3.12/cpython/pyctype.h", "type": "file" }, { - "bom-ref": "f02e6ad0f22e86d7", + "bom-ref": "feff456f227d9a1f", "name": "/usr/include/python3.12/cpython/pydebug.h", "type": "file" }, { - "bom-ref": "afd53fef3c2cc275", + "bom-ref": "77df5673b4a7d125", "name": "/usr/include/python3.12/cpython/pyerrors.h", "type": "file" }, { - "bom-ref": "4dc1e24b061d4ce4", + "bom-ref": "c559f6fb64285c84", "name": "/usr/include/python3.12/cpython/pyfpe.h", "type": "file" }, { - "bom-ref": "561941317de2d763", + "bom-ref": "8fe93a74ecaa3363", "name": "/usr/include/python3.12/cpython/pyframe.h", "type": "file" }, { - "bom-ref": "8d44226ddc7ed568", + "bom-ref": "c681bcbb20136188", "name": "/usr/include/python3.12/cpython/pylifecycle.h", "type": "file" }, { - "bom-ref": "f63b163a06270634", + "bom-ref": "6077fe437be0a65c", "name": "/usr/include/python3.12/cpython/pymem.h", "type": "file" }, { - "bom-ref": "cf09abf0071523de", + "bom-ref": "4d10ad1a1eb258f2", "name": "/usr/include/python3.12/cpython/pystate.h", "type": "file" }, { - "bom-ref": "9b3b5e11e6a9fc00", + "bom-ref": "dc3b436c75da72e8", "name": "/usr/include/python3.12/cpython/pythonrun.h", "type": "file" }, { - "bom-ref": "9a3e4913df9b9a9b", + "bom-ref": "51ef40f03c8acb87", "name": "/usr/include/python3.12/cpython/pythread.h", "type": "file" }, { - "bom-ref": "b7997496ca556053", + "bom-ref": "511c885b904bd6b3", "name": "/usr/include/python3.12/cpython/pytime.h", "type": "file" }, { - "bom-ref": "40c243f54354b1c1", + "bom-ref": "d4a4538e967eda55", "name": "/usr/include/python3.12/cpython/setobject.h", "type": "file" }, { - "bom-ref": "e422fa83c0fdb1b1", + "bom-ref": "d4d68407828bc0f1", "name": "/usr/include/python3.12/cpython/sysmodule.h", "type": "file" }, { - "bom-ref": "037fd5f63a4e720b", + "bom-ref": "0e8ea9a1524dad5f", "name": "/usr/include/python3.12/cpython/traceback.h", "type": "file" }, { - "bom-ref": "8fa1e14b101c8a25", + "bom-ref": "e06d0d4dd3d0d7ad", "name": "/usr/include/python3.12/cpython/tupleobject.h", "type": "file" }, { - "bom-ref": "778e8878a97fd96e", + "bom-ref": "50acfb9033e28db2", "name": "/usr/include/python3.12/cpython/unicodeobject.h", "type": "file" }, { - "bom-ref": "89fa5604b27f3378", + "bom-ref": "cd35417863ffb334", "name": "/usr/include/python3.12/cpython/warnings.h", "type": "file" }, { - "bom-ref": "9d0eab64fa664d57", + "bom-ref": "5ad607a23f56f03f", "name": "/usr/include/python3.12/cpython/weakrefobject.h", "type": "file" }, { - "bom-ref": "70f15ce0cdd51167", + "bom-ref": "092d2e5cb92580af", "name": "/usr/include/python3.12/datetime.h", "type": "file" }, { - "bom-ref": "cb1219e51bb4db7c", + "bom-ref": "76dedac23bf84fd0", "name": "/usr/include/python3.12/descrobject.h", "type": "file" }, { - "bom-ref": "9766b196c08b4950", + "bom-ref": "ba212c0e4afcc958", "name": "/usr/include/python3.12/dictobject.h", "type": "file" }, { - "bom-ref": "9857d527de585d4a", + "bom-ref": "d49b239225732cfe", "name": "/usr/include/python3.12/dynamic_annotations.h", "type": "file" }, { - "bom-ref": "946a30a7834ad84b", + "bom-ref": "3645c51066e4fa7f", "name": "/usr/include/python3.12/enumobject.h", "type": "file" }, { - "bom-ref": "411fb870ff87ea55", + "bom-ref": "183e98f777b51a0d", "name": "/usr/include/python3.12/errcode.h", "type": "file" }, { - "bom-ref": "964d7f90518559c8", + "bom-ref": "a425e8db9f1fdfa0", "name": "/usr/include/python3.12/exports.h", "type": "file" }, { - "bom-ref": "12f188cca4f25220", + "bom-ref": "e99ba79eaff12f2c", "name": "/usr/include/python3.12/fileobject.h", "type": "file" }, { - "bom-ref": "533bda1f23fc92ab", + "bom-ref": "d0db3eea2400f46b", "name": "/usr/include/python3.12/fileutils.h", "type": "file" }, { - "bom-ref": "f8d8f4e21bc636ad", + "bom-ref": "daa614e07867cd0d", "name": "/usr/include/python3.12/floatobject.h", "type": "file" }, { - "bom-ref": "4b8cf73c93dc4880", + "bom-ref": "08ea8054e2eb2670", "name": "/usr/include/python3.12/frameobject.h", "type": "file" }, { - "bom-ref": "0c3ac9fa68d79694", + "bom-ref": "b3f7b6b974ef3e84", "name": "/usr/include/python3.12/genericaliasobject.h", "type": "file" }, { - "bom-ref": "856b23a6b88ab30a", + "bom-ref": "9750b89170aef46e", "name": "/usr/include/python3.12/import.h", "type": "file" }, { - "bom-ref": "fd753fbd5ec8a2a8", + "bom-ref": "1cae8e6c84d52980", "name": "/usr/include/python3.12/internal/pycore_abstract.h", "type": "file" }, { - "bom-ref": "b38d7e09ce1ae357", + "bom-ref": "04b21b6778f925a3", "name": "/usr/include/python3.12/internal/pycore_asdl.h", "type": "file" }, { - "bom-ref": "be8f4a63f9321d0a", + "bom-ref": "8f2ce6efac1257e6", "name": "/usr/include/python3.12/internal/pycore_ast.h", "type": "file" }, { - "bom-ref": "6c47327f5e7ad95a", + "bom-ref": "7a9c6b34225df69e", "name": "/usr/include/python3.12/internal/pycore_ast_state.h", "type": "file" }, { - "bom-ref": "f9c94d060e0f8416", + "bom-ref": "903fd67089b97316", "name": "/usr/include/python3.12/internal/pycore_atexit.h", "type": "file" }, { - "bom-ref": "8d1e5057ec1038b5", + "bom-ref": "db244639694da901", "name": "/usr/include/python3.12/internal/pycore_atomic.h", "type": "file" }, { - "bom-ref": "4f8796adb4ef14a4", + "bom-ref": "ac1914e29453e108", "name": "/usr/include/python3.12/internal/pycore_atomic_funcs.h", "type": "file" }, { - "bom-ref": "5d991b5ae000660c", + "bom-ref": "e45108ac6becc808", "name": "/usr/include/python3.12/internal/pycore_bitutils.h", "type": "file" }, { - "bom-ref": "f7c1d39c7bf89cf2", + "bom-ref": "620463e6ca3604ee", "name": "/usr/include/python3.12/internal/pycore_blocks_output_buffer.h", "type": "file" }, { - "bom-ref": "cd9dfdcf6aafc7ec", + "bom-ref": "2c2a7aa24a596e94", "name": "/usr/include/python3.12/internal/pycore_bytes_methods.h", "type": "file" }, { - "bom-ref": "235e9531acd265de", + "bom-ref": "76fc121a25f14afe", "name": "/usr/include/python3.12/internal/pycore_bytesobject.h", "type": "file" }, { - "bom-ref": "2c9ac97d6a139ccb", + "bom-ref": "9f5d6710dc7e28d3", "name": "/usr/include/python3.12/internal/pycore_call.h", "type": "file" }, { - "bom-ref": "31ac4c32cbcd71d1", + "bom-ref": "f737068961916b7d", "name": "/usr/include/python3.12/internal/pycore_ceval.h", "type": "file" }, { - "bom-ref": "8434c62a5db74e52", + "bom-ref": "472bd47c3c42e992", "name": "/usr/include/python3.12/internal/pycore_ceval_state.h", "type": "file" }, { - "bom-ref": "a11165a4dc7758dc", + "bom-ref": "4ba64e314f4daa94", "name": "/usr/include/python3.12/internal/pycore_code.h", "type": "file" }, { - "bom-ref": "c148a59cd6559caf", + "bom-ref": "c9e27ce52d2492fb", "name": "/usr/include/python3.12/internal/pycore_compile.h", "type": "file" }, { - "bom-ref": "d9ff77d69aae6772", + "bom-ref": "e644d7117d5f2d26", "name": "/usr/include/python3.12/internal/pycore_condvar.h", "type": "file" }, { - "bom-ref": "178964f4b314eb06", + "bom-ref": "d77af5bf139febe2", "name": "/usr/include/python3.12/internal/pycore_context.h", "type": "file" }, { - "bom-ref": "4fff2845312b6a40", + "bom-ref": "00ea881aef0d1198", "name": "/usr/include/python3.12/internal/pycore_descrobject.h", "type": "file" }, { - "bom-ref": "5082d2b329367aa1", + "bom-ref": "3af65ba33c4cb6b1", "name": "/usr/include/python3.12/internal/pycore_dict.h", "type": "file" }, { - "bom-ref": "3f31c8bfca148e92", + "bom-ref": "019516a73971fcce", "name": "/usr/include/python3.12/internal/pycore_dict_state.h", "type": "file" }, { - "bom-ref": "477e5c50d1928b29", + "bom-ref": "01e71e8d50b68a75", "name": "/usr/include/python3.12/internal/pycore_dtoa.h", "type": "file" }, { - "bom-ref": "a63a05a0c90faf0b", + "bom-ref": "fa33fb4c574a6a97", "name": "/usr/include/python3.12/internal/pycore_emscripten_signal.h", "type": "file" }, { - "bom-ref": "45fbfcbeee8eff7b", + "bom-ref": "cb43ddab643541d3", "name": "/usr/include/python3.12/internal/pycore_exceptions.h", "type": "file" }, { - "bom-ref": "62157292328360ce", + "bom-ref": "c21348ef150dc8da", "name": "/usr/include/python3.12/internal/pycore_faulthandler.h", "type": "file" }, { - "bom-ref": "67aa69eb76dc8d3b", + "bom-ref": "62df9e6f62ede9ff", "name": "/usr/include/python3.12/internal/pycore_fileutils.h", "type": "file" }, { - "bom-ref": "4f495ed8193683a4", + "bom-ref": "d010218c8c4b5c4c", "name": "/usr/include/python3.12/internal/pycore_fileutils_windows.h", "type": "file" }, { - "bom-ref": "a6d2719ffbe9d0ca", + "bom-ref": "3815f0c90bdf2d32", "name": "/usr/include/python3.12/internal/pycore_floatobject.h", "type": "file" }, { - "bom-ref": "56db03bd9e5a2ce7", + "bom-ref": "687f3db1fde1cdb3", "name": "/usr/include/python3.12/internal/pycore_flowgraph.h", "type": "file" }, { - "bom-ref": "47481da95acda774", + "bom-ref": "1ff98679e88a2a44", "name": "/usr/include/python3.12/internal/pycore_format.h", "type": "file" }, { - "bom-ref": "4e0be485a274db47", + "bom-ref": "8c331adacdc6e317", "name": "/usr/include/python3.12/internal/pycore_frame.h", "type": "file" }, { - "bom-ref": "a8dca23bcecc501d", + "bom-ref": "2ca9d4c95d7b66e1", "name": "/usr/include/python3.12/internal/pycore_function.h", "type": "file" }, { - "bom-ref": "7418a66ae9abe241", + "bom-ref": "f5230ab4f8f4c07d", "name": "/usr/include/python3.12/internal/pycore_gc.h", "type": "file" }, { - "bom-ref": "111638d70d43fafb", + "bom-ref": "111fe71e9f7bd363", "name": "/usr/include/python3.12/internal/pycore_genobject.h", "type": "file" }, { - "bom-ref": "897ea0fb4ee4b592", + "bom-ref": "36073d25343d8d5e", "name": "/usr/include/python3.12/internal/pycore_getopt.h", "type": "file" }, { - "bom-ref": "0dc9b97d95dccc84", + "bom-ref": "b68a4c088ce1cc68", "name": "/usr/include/python3.12/internal/pycore_gil.h", "type": "file" }, { - "bom-ref": "4d63d36ae01c0546", + "bom-ref": "d40d18f26936d26a", "name": "/usr/include/python3.12/internal/pycore_global_objects.h", "type": "file" }, { - "bom-ref": "a1b984d9f3979b46", + "bom-ref": "5a0c778399b7d182", "name": "/usr/include/python3.12/internal/pycore_global_objects_fini_generated.h", "type": "file" }, { - "bom-ref": "51d6745d69a6d10a", + "bom-ref": "2e164f2d7b4cb10a", "name": "/usr/include/python3.12/internal/pycore_global_strings.h", "type": "file" }, { - "bom-ref": "789bb17dfdb477bf", + "bom-ref": "674fe305a3b798c7", "name": "/usr/include/python3.12/internal/pycore_hamt.h", "type": "file" }, { - "bom-ref": "b8fd09ce553b8522", + "bom-ref": "7831d692c011372e", "name": "/usr/include/python3.12/internal/pycore_hashtable.h", "type": "file" }, { - "bom-ref": "a8633d540b59edb7", + "bom-ref": "4d9c59c9b4554bcf", "name": "/usr/include/python3.12/internal/pycore_import.h", "type": "file" }, { - "bom-ref": "8bc786a38d829b5f", + "bom-ref": "2956502d9f6005b7", "name": "/usr/include/python3.12/internal/pycore_initconfig.h", "type": "file" }, { - "bom-ref": "d6ef90757a042470", + "bom-ref": "a903493a6ef98438", "name": "/usr/include/python3.12/internal/pycore_instruments.h", "type": "file" }, { - "bom-ref": "fe79e9ba5d99db39", + "bom-ref": "5ed6b458e392ccb1", "name": "/usr/include/python3.12/internal/pycore_interp.h", "type": "file" }, { - "bom-ref": "a11e8f534757821b", + "bom-ref": "e5781f971d848c23", "name": "/usr/include/python3.12/internal/pycore_intrinsics.h", "type": "file" }, { - "bom-ref": "84192876f85f516e", + "bom-ref": "8aa0c7ee7d57278a", "name": "/usr/include/python3.12/internal/pycore_list.h", "type": "file" }, { - "bom-ref": "b4e0c9bcf9cd1be8", + "bom-ref": "828606098fd16110", "name": "/usr/include/python3.12/internal/pycore_long.h", "type": "file" }, { - "bom-ref": "37f4769497572d9e", + "bom-ref": "f19fbe9b662d7c5a", "name": "/usr/include/python3.12/internal/pycore_memoryobject.h", "type": "file" }, { - "bom-ref": "fa8381d7d10bfe7a", + "bom-ref": "d5ab38c60f4c303a", "name": "/usr/include/python3.12/internal/pycore_moduleobject.h", "type": "file" }, { - "bom-ref": "f28e1d5a25bcbeb2", + "bom-ref": "ef384e202b0fe906", "name": "/usr/include/python3.12/internal/pycore_namespace.h", "type": "file" }, { - "bom-ref": "996862ade765114d", + "bom-ref": "42642dc4b3268a81", "name": "/usr/include/python3.12/internal/pycore_object.h", "type": "file" }, { - "bom-ref": "133ea94bd1bc0120", + "bom-ref": "a25e1dae4409edf4", "name": "/usr/include/python3.12/internal/pycore_object_state.h", "type": "file" }, { - "bom-ref": "836a979e2b56cf98", + "bom-ref": "f5b778eac37936ec", "name": "/usr/include/python3.12/internal/pycore_obmalloc.h", "type": "file" }, { - "bom-ref": "3c9b381a9caf05e1", + "bom-ref": "9a6c3aeeca715b4d", "name": "/usr/include/python3.12/internal/pycore_obmalloc_init.h", "type": "file" }, { - "bom-ref": "d3e87c4b7a9f37ef", + "bom-ref": "0d3d8ce1eaa31aeb", "name": "/usr/include/python3.12/internal/pycore_opcode.h", "type": "file" }, { - "bom-ref": "3223720bbcc74aae", + "bom-ref": "3c386bbd3f650c0a", "name": "/usr/include/python3.12/internal/pycore_opcode_utils.h", "type": "file" }, { - "bom-ref": "5245b57c9d791157", + "bom-ref": "aca764deca3ca457", "name": "/usr/include/python3.12/internal/pycore_parser.h", "type": "file" }, { - "bom-ref": "d509465fb775a9e7", + "bom-ref": "fae6ddbc320a83c7", "name": "/usr/include/python3.12/internal/pycore_pathconfig.h", "type": "file" }, { - "bom-ref": "b248d838ea819d4e", + "bom-ref": "e572366dbb60918e", "name": "/usr/include/python3.12/internal/pycore_pyarena.h", "type": "file" }, { - "bom-ref": "f4bbd0ae94ec1d4c", + "bom-ref": "75fefb13e806c400", "name": "/usr/include/python3.12/internal/pycore_pyerrors.h", "type": "file" }, { - "bom-ref": "04695e38f2dbfd88", + "bom-ref": "5f318201d39145f0", "name": "/usr/include/python3.12/internal/pycore_pyhash.h", "type": "file" }, { - "bom-ref": "f03de1efad472ddc", + "bom-ref": "0d643aef7e9efd48", "name": "/usr/include/python3.12/internal/pycore_pylifecycle.h", "type": "file" }, { - "bom-ref": "4fe3ecd4329ccf1d", + "bom-ref": "ab61298dc1a4554d", "name": "/usr/include/python3.12/internal/pycore_pymath.h", "type": "file" }, { - "bom-ref": "b44ef5b8955258ee", + "bom-ref": "c93f424754df5e4e", "name": "/usr/include/python3.12/internal/pycore_pymem.h", "type": "file" }, { - "bom-ref": "3cc592ca82d5e24d", + "bom-ref": "8686a0e3b42d4c8d", "name": "/usr/include/python3.12/internal/pycore_pymem_init.h", "type": "file" }, { - "bom-ref": "90ce6046eb586de1", + "bom-ref": "0b0ba3d58bcc2701", "name": "/usr/include/python3.12/internal/pycore_pystate.h", "type": "file" }, { - "bom-ref": "a612026b83be586f", + "bom-ref": "cdc21ea9f37361e7", "name": "/usr/include/python3.12/internal/pycore_pythread.h", "type": "file" }, { - "bom-ref": "02179820e24b8262", + "bom-ref": "21aa5965d3139c7a", "name": "/usr/include/python3.12/internal/pycore_range.h", "type": "file" }, { - "bom-ref": "f5190580e40e3acb", + "bom-ref": "76d0c316f581beeb", "name": "/usr/include/python3.12/internal/pycore_runtime.h", "type": "file" }, { - "bom-ref": "b642a5d4333981b9", + "bom-ref": "9d0e4ad49941a0ed", "name": "/usr/include/python3.12/internal/pycore_runtime_init.h", "type": "file" }, { - "bom-ref": "f69453c2808658ea", + "bom-ref": "10d9a55c08f20dca", "name": "/usr/include/python3.12/internal/pycore_runtime_init_generated.h", "type": "file" }, { - "bom-ref": "977975cdbb166e57", + "bom-ref": "6bdc1b7066ebf13f", "name": "/usr/include/python3.12/internal/pycore_signal.h", "type": "file" }, { - "bom-ref": "b62410af1b1a1560", + "bom-ref": "185c66e1907bf82c", "name": "/usr/include/python3.12/internal/pycore_sliceobject.h", "type": "file" }, { - "bom-ref": "c2fe9e954eec4dfc", + "bom-ref": "668a8634113ec994", "name": "/usr/include/python3.12/internal/pycore_strhex.h", "type": "file" }, { - "bom-ref": "1c4cfeca60968dc1", + "bom-ref": "268d9c9870ead11d", "name": "/usr/include/python3.12/internal/pycore_structseq.h", "type": "file" }, { - "bom-ref": "b3d790a5f8b2d1ee", + "bom-ref": "11ed160bd3da3022", "name": "/usr/include/python3.12/internal/pycore_symtable.h", "type": "file" }, { - "bom-ref": "af5b1db85fa58cc8", + "bom-ref": "8df9e7349f0fc670", "name": "/usr/include/python3.12/internal/pycore_sysmodule.h", "type": "file" }, { - "bom-ref": "5005e65c6c1d1f47", + "bom-ref": "15e8ec40557b69f3", "name": "/usr/include/python3.12/internal/pycore_time.h", "type": "file" }, { - "bom-ref": "e6b48e444e56e077", + "bom-ref": "806f90cd43bf83af", "name": "/usr/include/python3.12/internal/pycore_token.h", "type": "file" }, { - "bom-ref": "897ca41afbf71301", + "bom-ref": "569276cbdc5b215d", "name": "/usr/include/python3.12/internal/pycore_traceback.h", "type": "file" }, { - "bom-ref": "e4cbabe5197ff3ca", + "bom-ref": "fcb1d5d6eb17e926", "name": "/usr/include/python3.12/internal/pycore_tracemalloc.h", "type": "file" }, { - "bom-ref": "f25c622f359a7557", + "bom-ref": "6a7ff8b1d6016b3b", "name": "/usr/include/python3.12/internal/pycore_tuple.h", "type": "file" }, { - "bom-ref": "78ba76303cbefc96", + "bom-ref": "aa61d84d81de531a", "name": "/usr/include/python3.12/internal/pycore_typeobject.h", "type": "file" }, { - "bom-ref": "d134e5f11cc06db8", + "bom-ref": "843455b8a81c9564", "name": "/usr/include/python3.12/internal/pycore_typevarobject.h", "type": "file" }, { - "bom-ref": "240a3cfe6c12e78c", + "bom-ref": "3cbc91c960fe4ae4", "name": "/usr/include/python3.12/internal/pycore_ucnhash.h", "type": "file" }, { - "bom-ref": "3f9777aeb2f9d7a1", + "bom-ref": "11404ae6911f5985", "name": "/usr/include/python3.12/internal/pycore_unicodeobject.h", "type": "file" }, { - "bom-ref": "7a40606b40de4b02", + "bom-ref": "7f0c7a6306c88bba", "name": "/usr/include/python3.12/internal/pycore_unicodeobject_generated.h", "type": "file" }, { - "bom-ref": "0c48528c1562ea47", + "bom-ref": "f28bd6f8c5de6b9b", "name": "/usr/include/python3.12/internal/pycore_unionobject.h", "type": "file" }, { - "bom-ref": "5f6d78669da140c5", + "bom-ref": "cc63a4534dad5519", "name": "/usr/include/python3.12/internal/pycore_warnings.h", "type": "file" }, { - "bom-ref": "cdb46cb32c82941f", + "bom-ref": "d3d03a0dac43e8ab", "name": "/usr/include/python3.12/interpreteridobject.h", "type": "file" }, { - "bom-ref": "6bf570a9f043dfc0", + "bom-ref": "feb604c3cdde89f4", "name": "/usr/include/python3.12/intrcheck.h", "type": "file" }, { - "bom-ref": "0c15943f183ce3ce", + "bom-ref": "85057e5797f99ed6", "name": "/usr/include/python3.12/iterobject.h", "type": "file" }, { - "bom-ref": "3920a877805d51b5", + "bom-ref": "983026f7760e66a5", "name": "/usr/include/python3.12/listobject.h", "type": "file" }, { - "bom-ref": "0bef9e9e28d23b08", + "bom-ref": "a9c3d0e2c4e4d160", "name": "/usr/include/python3.12/longobject.h", "type": "file" }, { - "bom-ref": "c00d1623cd958750", + "bom-ref": "bda18f5a0a2d5fb0", "name": "/usr/include/python3.12/marshal.h", "type": "file" }, { - "bom-ref": "7411e0457d11f7d5", + "bom-ref": "af149dd21377875d", "name": "/usr/include/python3.12/memoryobject.h", "type": "file" }, { - "bom-ref": "75613d925ef46fd3", + "bom-ref": "b535c493a157f6a3", "name": "/usr/include/python3.12/methodobject.h", "type": "file" }, { - "bom-ref": "9810e89f9eb5b414", + "bom-ref": "0eb1b0e8f1824ee8", "name": "/usr/include/python3.12/modsupport.h", "type": "file" }, { - "bom-ref": "29ede7be4a11a020", + "bom-ref": "ae4369461ea3a428", "name": "/usr/include/python3.12/moduleobject.h", "type": "file" }, { - "bom-ref": "8931bc7c7aab18f6", + "bom-ref": "4a1cc6bcef14f412", "name": "/usr/include/python3.12/object.h", "type": "file" }, { - "bom-ref": "97863669d52f0ee5", + "bom-ref": "2ba897853e0c1a09", "name": "/usr/include/python3.12/objimpl.h", "type": "file" }, { - "bom-ref": "c84f26f9da41b494", + "bom-ref": "455f410535321640", "name": "/usr/include/python3.12/opcode.h", "type": "file" }, { - "bom-ref": "033cde0aa2718d51", + "bom-ref": "4d0f27f9b360783d", "name": "/usr/include/python3.12/osdefs.h", "type": "file" }, { - "bom-ref": "ac2bcf6f815cd2a4", + "bom-ref": "1a8022df8060d774", "name": "/usr/include/python3.12/osmodule.h", "type": "file" }, { - "bom-ref": "9227286ed480a0b9", + "bom-ref": "b72385955eb366a5", "name": "/usr/include/python3.12/patchlevel.h", "type": "file" }, { - "bom-ref": "bbe5df32932fb5c8", + "bom-ref": "09bd0a8c86672b60", "name": "/usr/include/python3.12/py_curses.h", "type": "file" }, { - "bom-ref": "400d147ab1a96d92", + "bom-ref": "08618d1cb9a0fb4a", "name": "/usr/include/python3.12/pybuffer.h", "type": "file" }, { - "bom-ref": "06c9b0fb61684ffc", + "bom-ref": "3f9477b7a627812c", "name": "/usr/include/python3.12/pycapsule.h", "type": "file" }, { - "bom-ref": "828e38ee95b5af22", + "bom-ref": "077b408b26b08dae", "name": "/usr/include/python3.12/pyconfig.h", "type": "file" }, { - "bom-ref": "d4070ed1affbfaa7", + "bom-ref": "66f8582662fd476b", "name": "/usr/include/python3.12/pydtrace.h", "type": "file" }, { - "bom-ref": "45671e189c5aca71", + "bom-ref": "efb29c90327b3061", "name": "/usr/include/python3.12/pyerrors.h", "type": "file" }, { - "bom-ref": "67b23bbb704439b2", + "bom-ref": "1aae656f10101892", "name": "/usr/include/python3.12/pyexpat.h", "type": "file" }, { - "bom-ref": "92f6d9bf7db99902", + "bom-ref": "d578b4136627b7d6", "name": "/usr/include/python3.12/pyframe.h", "type": "file" }, { - "bom-ref": "757ad8ec5d0837c4", + "bom-ref": "5fcb04477423d1dc", "name": "/usr/include/python3.12/pyhash.h", "type": "file" }, { - "bom-ref": "88e152d9a6967468", + "bom-ref": "b47f786af13492a4", "name": "/usr/include/python3.12/pylifecycle.h", "type": "file" }, { - "bom-ref": "2aa51dd6d176a70d", + "bom-ref": "e57e5d5da3439155", "name": "/usr/include/python3.12/pymacconfig.h", "type": "file" }, { - "bom-ref": "a3f7e387945fd651", + "bom-ref": "0c3bec611b0ede71", "name": "/usr/include/python3.12/pymacro.h", "type": "file" }, { - "bom-ref": "f2d98e6d3d6a4db1", + "bom-ref": "448820b9a3025ba9", "name": "/usr/include/python3.12/pymath.h", "type": "file" }, { - "bom-ref": "591e88fddd9be68e", + "bom-ref": "203ecf621e3a0992", "name": "/usr/include/python3.12/pymem.h", "type": "file" }, { - "bom-ref": "3127e5e85743a31b", + "bom-ref": "9e6ff6edccbafca7", "name": "/usr/include/python3.12/pyport.h", "type": "file" }, { - "bom-ref": "3061a7c72dba4931", + "bom-ref": "468228f61328a7e1", "name": "/usr/include/python3.12/pystate.h", "type": "file" }, { - "bom-ref": "214ed9cf4a160497", + "bom-ref": "3c37f016e47c16d7", "name": "/usr/include/python3.12/pystats.h", "type": "file" }, { - "bom-ref": "d70531360ab88aab", + "bom-ref": "63f2968b557106d3", "name": "/usr/include/python3.12/pystrcmp.h", "type": "file" }, { - "bom-ref": "785849d2c8f7ac5d", + "bom-ref": "725d8ee8aef33949", "name": "/usr/include/python3.12/pystrtod.h", "type": "file" }, { - "bom-ref": "6108089c37e7a9d2", + "bom-ref": "ed790cb6eb820cd6", "name": "/usr/include/python3.12/pythonrun.h", "type": "file" }, { - "bom-ref": "9960dac20dda4767", + "bom-ref": "42c90223637bd157", "name": "/usr/include/python3.12/pythread.h", "type": "file" }, { - "bom-ref": "1654a3fb3a5bd41b", + "bom-ref": "bc5b66d7c6aaf6a7", "name": "/usr/include/python3.12/pytypedefs.h", "type": "file" }, { - "bom-ref": "9c7939f721315ba8", + "bom-ref": "572aab13f3648c54", "name": "/usr/include/python3.12/rangeobject.h", "type": "file" }, { - "bom-ref": "e257229a339f3624", + "bom-ref": "9d7e27c27d205cdc", "name": "/usr/include/python3.12/setobject.h", "type": "file" }, { - "bom-ref": "4f801a2c2aacbe2f", + "bom-ref": "a94b2ce7a2ccb9d3", "name": "/usr/include/python3.12/sliceobject.h", "type": "file" }, { - "bom-ref": "aaa359c0a5b1bc09", + "bom-ref": "8cd8b0c699bbdc1d", "name": "/usr/include/python3.12/structmember.h", "type": "file" }, { - "bom-ref": "7af49efe019ded9d", + "bom-ref": "69d74bdaaaecb935", "name": "/usr/include/python3.12/structseq.h", "type": "file" }, { - "bom-ref": "2ed37ddc9cb11011", + "bom-ref": "4495a8de0aeb5715", "name": "/usr/include/python3.12/sysmodule.h", "type": "file" }, { - "bom-ref": "598d62efc6cd4b03", + "bom-ref": "35a39f65ec4b2cbb", "name": "/usr/include/python3.12/traceback.h", "type": "file" }, { - "bom-ref": "fe0519bce8b9ff5b", + "bom-ref": "b56e532ce204a073", "name": "/usr/include/python3.12/tracemalloc.h", "type": "file" }, { - "bom-ref": "231e6554ffaf5e0e", + "bom-ref": "8b3e0843174f1e62", "name": "/usr/include/python3.12/tupleobject.h", "type": "file" }, { - "bom-ref": "4906465e8a0e3a10", + "bom-ref": "4338608d33a7e798", "name": "/usr/include/python3.12/typeslots.h", "type": "file" }, { - "bom-ref": "32c4fe9c187053f3", + "bom-ref": "aac4cf97388ad18b", "name": "/usr/include/python3.12/unicodeobject.h", "type": "file" }, { - "bom-ref": "b46cd8aaf5829650", + "bom-ref": "33cd90629cae1cb8", "name": "/usr/include/python3.12/warnings.h", "type": "file" }, { - "bom-ref": "659d42cae7d0596c", + "bom-ref": "101d6521e75a1df8", "name": "/usr/include/python3.12/weakrefobject.h", "type": "file" }, { - "bom-ref": "61a29fdec8decf93", + "bom-ref": "4b91b035ad9a063b", "name": "/usr/include/rdma/bnxt_re-abi.h", "type": "file" }, { - "bom-ref": "439521c6fa241f4b", + "bom-ref": "5234bfea18b14f77", "name": "/usr/include/rdma/cxgb4-abi.h", "type": "file" }, { - "bom-ref": "88be994ae80e0de6", + "bom-ref": "13032fb6b04f6a7a", "name": "/usr/include/rdma/efa-abi.h", "type": "file" }, { - "bom-ref": "8a9f1f3422dea49d", + "bom-ref": "98547dbfdc638ba9", "name": "/usr/include/rdma/erdma-abi.h", "type": "file" }, { - "bom-ref": "c07005b7263a7132", + "bom-ref": "76fd8c5aba227256", "name": "/usr/include/rdma/hfi/hfi1_ioctl.h", "type": "file" }, { - "bom-ref": "432cb8968e38b6c3", + "bom-ref": "067c4e786a6c17a7", "name": "/usr/include/rdma/hfi/hfi1_user.h", "type": "file" }, { - "bom-ref": "e0f0e0eec80fae77", + "bom-ref": "722007d448c24507", "name": "/usr/include/rdma/hns-abi.h", "type": "file" }, { - "bom-ref": "159f2f05409735a4", + "bom-ref": "6b8c540e276498fc", "name": "/usr/include/rdma/ib_user_ioctl_cmds.h", "type": "file" }, { - "bom-ref": "69d24b4414dcfc69", + "bom-ref": "de91b860be22a6f5", "name": "/usr/include/rdma/ib_user_ioctl_verbs.h", "type": "file" }, { - "bom-ref": "680a2c6d8b556a5b", + "bom-ref": "18edf5c27f7bc613", "name": "/usr/include/rdma/ib_user_mad.h", "type": "file" }, { - "bom-ref": "73874114ad8029e6", + "bom-ref": "57e1bc85313965c6", "name": "/usr/include/rdma/ib_user_sa.h", "type": "file" }, { - "bom-ref": "6331ba6f621c801c", + "bom-ref": "6f1b902b7585c08c", "name": "/usr/include/rdma/ib_user_verbs.h", "type": "file" }, { - "bom-ref": "b003b9df811cf0ba", + "bom-ref": "24e04c3015a62492", "name": "/usr/include/rdma/irdma-abi.h", "type": "file" }, { - "bom-ref": "cd8440bdbd22cd12", + "bom-ref": "c173758af673e5be", "name": "/usr/include/rdma/mana-abi.h", "type": "file" }, { - "bom-ref": "4317ed25c5684004", + "bom-ref": "849f18ea44490b78", "name": "/usr/include/rdma/mlx4-abi.h", "type": "file" }, { - "bom-ref": "0e6866b40a1e3590", + "bom-ref": "01f5b7d80c9d9d58", "name": "/usr/include/rdma/mlx5-abi.h", "type": "file" }, { - "bom-ref": "99778f2b011c8a7b", + "bom-ref": "2d54ad1da8a9578f", "name": "/usr/include/rdma/mlx5_user_ioctl_cmds.h", "type": "file" }, { - "bom-ref": "8329ea9d41033c6e", + "bom-ref": "4c0c029d4e084cce", "name": "/usr/include/rdma/mlx5_user_ioctl_verbs.h", "type": "file" }, { - "bom-ref": "42c0f2ef81c8861a", + "bom-ref": "a71cca08c5438102", "name": "/usr/include/rdma/mthca-abi.h", "type": "file" }, { - "bom-ref": "234c14078b38d75d", + "bom-ref": "010bf36f8d2dbbf1", "name": "/usr/include/rdma/ocrdma-abi.h", "type": "file" }, { - "bom-ref": "a9caa2f30fa3c3e3", + "bom-ref": "e85c73f3a1d331df", "name": "/usr/include/rdma/qedr-abi.h", "type": "file" }, { - "bom-ref": "bef62bc6069da33b", + "bom-ref": "f480631d2d543457", "name": "/usr/include/rdma/rdma_netlink.h", "type": "file" }, { - "bom-ref": "42c56df13f29621e", + "bom-ref": "8da5f905d43b08ae", "name": "/usr/include/rdma/rdma_user_cm.h", "type": "file" }, { - "bom-ref": "6f68ee4046020986", + "bom-ref": "6fabe1cce239e1d6", "name": "/usr/include/rdma/rdma_user_ioctl.h", "type": "file" }, { - "bom-ref": "62cb6a949d65dc32", + "bom-ref": "9c0ecd39f45236a6", "name": "/usr/include/rdma/rdma_user_ioctl_cmds.h", "type": "file" }, { - "bom-ref": "33e285247e7811ef", + "bom-ref": "7ca6f64ee70f3a43", "name": "/usr/include/rdma/rdma_user_rxe.h", "type": "file" }, { - "bom-ref": "384d6a9cc9ab6145", + "bom-ref": "54cedc1df654c669", "name": "/usr/include/rdma/rvt-abi.h", "type": "file" }, { - "bom-ref": "ff4966cefb2f3e26", + "bom-ref": "23e868a5df966fde", "name": "/usr/include/rdma/siw-abi.h", "type": "file" }, { - "bom-ref": "4a44ce23b15ac7eb", + "bom-ref": "805bad3490fe3d27", "name": "/usr/include/rdma/vmw_pvrdma-abi.h", "type": "file" }, { - "bom-ref": "e5f2a48dc3af36fd", + "bom-ref": "756926d23d223869", "name": "/usr/include/re_comp.h", "type": "file" }, { - "bom-ref": "4b494d9452b734cf", + "bom-ref": "bd40ccdc76d153f7", "name": "/usr/include/regex.h", "type": "file" }, { - "bom-ref": "077547218b2c5c18", + "bom-ref": "8d4f0508782c5814", "name": "/usr/include/regexp.h", "type": "file" }, { - "bom-ref": "73d5fe61f54ce5bb", + "bom-ref": "ae9476fff114be53", "name": "/usr/include/regulator/regulator.h", "type": "file" }, { - "bom-ref": "6706bff22ea6aaf3", + "bom-ref": "b5a22dc88ac6a287", "name": "/usr/include/resolv.h", "type": "file" }, { - "bom-ref": "01f88862d3aca1a7", + "bom-ref": "8b3991f5934cdb03", "name": "/usr/include/rpc/netdb.h", "type": "file" }, { - "bom-ref": "f190d89d54ac9d41", + "bom-ref": "0f5c7f3f3d9de761", "name": "/usr/include/rpcsvc/bootparam_prot.h", "type": "file" }, { - "bom-ref": "68fc07e8967b88f5", + "bom-ref": "21eeee5dd63b889d", "name": "/usr/include/rpcsvc/bootparam_prot.x", "type": "file" }, { - "bom-ref": "828c216c2d84150b", + "bom-ref": "7669cde62a103a67", "name": "/usr/include/rpcsvc/key_prot.h", "type": "file" }, { - "bom-ref": "225f9d3ffb9afd52", + "bom-ref": "f144e88037b49a5e", "name": "/usr/include/rpcsvc/key_prot.x", "type": "file" }, { - "bom-ref": "a88e4f68cce4de67", + "bom-ref": "c33af1565a9c6a0b", "name": "/usr/include/rpcsvc/klm_prot.h", "type": "file" }, { - "bom-ref": "a31b876232746128", + "bom-ref": "d8827b117d39cf90", "name": "/usr/include/rpcsvc/klm_prot.x", "type": "file" }, { - "bom-ref": "8de2b02185f93d6f", + "bom-ref": "dd3173e03919dce3", "name": "/usr/include/rpcsvc/mount.h", "type": "file" }, { - "bom-ref": "ba0c4ca42f621997", + "bom-ref": "9c5f2f1edf3ecdff", "name": "/usr/include/rpcsvc/mount.x", "type": "file" }, { - "bom-ref": "893973d3700bc637", + "bom-ref": "e9d43d57a89e7677", "name": "/usr/include/rpcsvc/nfs_prot.h", "type": "file" }, { - "bom-ref": "b421b170ef384efd", + "bom-ref": "c7f72d7a87b4dec9", "name": "/usr/include/rpcsvc/nfs_prot.x", "type": "file" }, { - "bom-ref": "d17f40d24d952b94", + "bom-ref": "fdc264cf91f17618", "name": "/usr/include/rpcsvc/nlm_prot.h", "type": "file" }, { - "bom-ref": "e6e832574faaafb9", + "bom-ref": "e9e471031248c659", "name": "/usr/include/rpcsvc/nlm_prot.x", "type": "file" }, { - "bom-ref": "5dafcde110b50fdb", + "bom-ref": "b1992c787dd5d7db", "name": "/usr/include/rpcsvc/rex.h", "type": "file" }, { - "bom-ref": "0b501cd2e9292c54", + "bom-ref": "48d9f3a279867308", "name": "/usr/include/rpcsvc/rex.x", "type": "file" }, { - "bom-ref": "c1085ea6a4e77bbd", + "bom-ref": "8e9c37abb8812311", "name": "/usr/include/rpcsvc/rquota.h", "type": "file" }, { - "bom-ref": "5bc46a3e246871cf", + "bom-ref": "27415fde4273d7f7", "name": "/usr/include/rpcsvc/rquota.x", "type": "file" }, { - "bom-ref": "f98e174c815d59e1", + "bom-ref": "15340c8a073f1d35", "name": "/usr/include/rpcsvc/rstat.h", "type": "file" }, { - "bom-ref": "36fc88d6574fe046", + "bom-ref": "037957660532d0f2", "name": "/usr/include/rpcsvc/rstat.x", "type": "file" }, { - "bom-ref": "18e8731015cab254", + "bom-ref": "77aca44205acdd80", "name": "/usr/include/rpcsvc/rusers.h", "type": "file" }, { - "bom-ref": "189a8031efca267f", + "bom-ref": "366138b73a760a33", "name": "/usr/include/rpcsvc/rusers.x", "type": "file" }, { - "bom-ref": "97288b40909b51b5", + "bom-ref": "b4695e229c4f9f2d", "name": "/usr/include/rpcsvc/sm_inter.h", "type": "file" }, { - "bom-ref": "398cdb8bb0c00d6f", + "bom-ref": "04de6907e5836a3b", "name": "/usr/include/rpcsvc/sm_inter.x", "type": "file" }, { - "bom-ref": "cda6b445084b2861", + "bom-ref": "61739eec5a71f061", "name": "/usr/include/rpcsvc/spray.h", "type": "file" }, { - "bom-ref": "76290c02338ebfed", + "bom-ref": "40de6a4b9881efcd", "name": "/usr/include/rpcsvc/spray.x", "type": "file" }, { - "bom-ref": "633a8800086ee63d", + "bom-ref": "098d34d20446acdd", "name": "/usr/include/sched.h", "type": "file" }, { - "bom-ref": "8169ac6973f6df9d", + "bom-ref": "87de2788d2cbe2cd", "name": "/usr/include/scsi/cxlflash_ioctl.h", "type": "file" }, { - "bom-ref": "8ee1a04edb7ddc6d", + "bom-ref": "5452b97ce73cafe5", "name": "/usr/include/scsi/fc/fc_els.h", "type": "file" }, { - "bom-ref": "c7391ddbcc592159", + "bom-ref": "42cf5f1c7899ab15", "name": "/usr/include/scsi/fc/fc_fs.h", "type": "file" }, { - "bom-ref": "cc44e4a5f03e06c5", + "bom-ref": "5dc1bd9148a2022d", "name": "/usr/include/scsi/fc/fc_gs.h", "type": "file" }, { - "bom-ref": "4409ffc6372ed0df", + "bom-ref": "707e8b5243c986ab", "name": "/usr/include/scsi/fc/fc_ns.h", "type": "file" }, { - "bom-ref": "8a033583f1762629", + "bom-ref": "c492241a75c56419", "name": "/usr/include/scsi/scsi.h", "type": "file" }, { - "bom-ref": "fd1a28dcbfb6ea67", + "bom-ref": "14d7d60f36bb997b", "name": "/usr/include/scsi/scsi_bsg_fc.h", "type": "file" }, { - "bom-ref": "91791bfa78e0be3c", + "bom-ref": "464321e392d6b7ec", "name": "/usr/include/scsi/scsi_bsg_mpi3mr.h", "type": "file" }, { - "bom-ref": "f1f583f9d1f9fe50", + "bom-ref": "6c9a510c4b3fe7dc", "name": "/usr/include/scsi/scsi_bsg_ufs.h", "type": "file" }, { - "bom-ref": "f8ea2cc0a8c8d63a", + "bom-ref": "1486511f389a715a", "name": "/usr/include/scsi/scsi_ioctl.h", "type": "file" }, { - "bom-ref": "d276c50e644ef7ef", + "bom-ref": "1d651bc98477fb3f", "name": "/usr/include/scsi/scsi_netlink.h", "type": "file" }, { - "bom-ref": "a4e98d7b6fbd7120", + "bom-ref": "03d77ea9866212f8", "name": "/usr/include/scsi/scsi_netlink_fc.h", "type": "file" }, { - "bom-ref": "17126c7abb49217e", + "bom-ref": "d8e30a0963640396", "name": "/usr/include/scsi/sg.h", "type": "file" }, { - "bom-ref": "d3090997b6b582d4", + "bom-ref": "2cb3a6f4e9d64924", "name": "/usr/include/search.h", "type": "file" }, { - "bom-ref": "1628624d1c092e58", + "bom-ref": "c5d19890924d7d58", "name": "/usr/include/semaphore.h", "type": "file" }, { - "bom-ref": "efcfb3a445464faf", + "bom-ref": "87842ec5db7ca26f", "name": "/usr/include/setjmp.h", "type": "file" }, { - "bom-ref": "639cb69470dbc4ba", + "bom-ref": "c03821a5f06d2dd2", "name": "/usr/include/sgtty.h", "type": "file" }, { - "bom-ref": "0509cf74cf7e2473", + "bom-ref": "78aa1b64e79184e3", "name": "/usr/include/shadow.h", "type": "file" }, { - "bom-ref": "2a0120399470cf52", + "bom-ref": "b7ce2809bebabb3e", "name": "/usr/include/signal.h", "type": "file" }, { - "bom-ref": "28e814d0cf381aa7", + "bom-ref": "43c6ddae03b19abb", "name": "/usr/include/sound/asequencer.h", "type": "file" }, { - "bom-ref": "5bc439fcb6143f26", + "bom-ref": "1c4daee4dd0899ee", "name": "/usr/include/sound/asoc.h", "type": "file" }, { - "bom-ref": "3e73e89dc7bbb6bd", + "bom-ref": "dc2bfd98a5f5b171", "name": "/usr/include/sound/asound.h", "type": "file" }, { - "bom-ref": "e386a5a161b9d456", + "bom-ref": "6601aa8a4d77b036", "name": "/usr/include/sound/asound_fm.h", "type": "file" }, { - "bom-ref": "3d85ef4ce95f7d1f", + "bom-ref": "96af28b2d7831987", "name": "/usr/include/sound/compress_offload.h", "type": "file" }, { - "bom-ref": "f234a118c5029a4c", + "bom-ref": "f013048921eb1a6c", "name": "/usr/include/sound/compress_params.h", "type": "file" }, { - "bom-ref": "b31e9a9b4e1ad57d", + "bom-ref": "4ff4d8967f27fe89", "name": "/usr/include/sound/emu10k1.h", "type": "file" }, { - "bom-ref": "75663c905ff0dabf", + "bom-ref": "b1812bb5d0ccd3ef", "name": "/usr/include/sound/firewire.h", "type": "file" }, { - "bom-ref": "0cc439fdf38e3733", + "bom-ref": "085d2d8de11d02ab", "name": "/usr/include/sound/hdsp.h", "type": "file" }, { - "bom-ref": "9718ac25cef93adb", + "bom-ref": "5139b08c46cc075f", "name": "/usr/include/sound/hdspm.h", "type": "file" }, { - "bom-ref": "f086aa8fd83b53c2", + "bom-ref": "16cc5c32abaea9e2", "name": "/usr/include/sound/intel/avs/tokens.h", "type": "file" }, { - "bom-ref": "18e5f5467b5db9cb", + "bom-ref": "dc0f9ef570e5f40f", "name": "/usr/include/sound/sb16_csp.h", "type": "file" }, { - "bom-ref": "4b97306495001584", + "bom-ref": "785580e7c1ad18a8", "name": "/usr/include/sound/scarlett2.h", "type": "file" }, { - "bom-ref": "f9fc4f501f2951d5", + "bom-ref": "ce51953ef76857b1", "name": "/usr/include/sound/sfnt_info.h", "type": "file" }, { - "bom-ref": "3458f03a4f800084", + "bom-ref": "a648d530148e157c", "name": "/usr/include/sound/skl-tplg-interface.h", "type": "file" }, { - "bom-ref": "f351e47ff7a55e9e", + "bom-ref": "489b078e77ec8bb2", "name": "/usr/include/sound/snd_ar_tokens.h", "type": "file" }, { - "bom-ref": "f2740bba80e12717", + "bom-ref": "b43ac72a6ff06697", "name": "/usr/include/sound/snd_sst_tokens.h", "type": "file" }, { - "bom-ref": "04927f092eba8535", + "bom-ref": "3fea60fa802c8f89", "name": "/usr/include/sound/sof/abi.h", "type": "file" }, { - "bom-ref": "dc8e0acd91af0e2c", + "bom-ref": "39ea1d1ef3a6cf28", "name": "/usr/include/sound/sof/fw.h", "type": "file" }, { - "bom-ref": "2ae2faa120b3f4ab", + "bom-ref": "fc4e67bfcc3a85fb", "name": "/usr/include/sound/sof/header.h", "type": "file" }, { - "bom-ref": "159351ae1c201fa2", + "bom-ref": "57cd319ccb936566", "name": "/usr/include/sound/sof/tokens.h", "type": "file" }, { - "bom-ref": "b8b466b528edf136", + "bom-ref": "3afd3bd71f41d286", "name": "/usr/include/sound/tlv.h", "type": "file" }, { - "bom-ref": "15c7d0ac629caf35", + "bom-ref": "13a7c05e18ef5a89", "name": "/usr/include/sound/usb_stream.h", "type": "file" }, { - "bom-ref": "3acfbbad19bcdbd6", + "bom-ref": "d092d6617103e99a", "name": "/usr/include/spawn.h", "type": "file" }, { - "bom-ref": "f6650d3f13b0049b", + "bom-ref": "cdf641f2e47fb257", "name": "/usr/include/stab.h", "type": "file" }, { - "bom-ref": "ba10d8bd336387c2", + "bom-ref": "51b6e516ccd68242", "name": "/usr/include/stdbit.h", "type": "file" }, { - "bom-ref": "d7e0a322182e0b57", + "bom-ref": "3991f7d5d7d5d64f", "name": "/usr/include/stdc-predef.h", "type": "file" }, { - "bom-ref": "4780f6d407f30e47", + "bom-ref": "47ea29e6badf5067", "name": "/usr/include/stdint.h", "type": "file" }, { - "bom-ref": "e8424a12a2f7c37c", + "bom-ref": "d66c2a5f0d716480", "name": "/usr/include/stdio.h", "type": "file" }, { - "bom-ref": "870aa21dfdaa99ac", + "bom-ref": "143cabef56163110", "name": "/usr/include/stdio_ext.h", "type": "file" }, { - "bom-ref": "b6fb3cc79cf9dd3a", + "bom-ref": "cc964c67269efd82", "name": "/usr/include/stdlib.h", "type": "file" }, { - "bom-ref": "82d4b6c1ec50789f", + "bom-ref": "aee29e54c356e473", "name": "/usr/include/string.h", "type": "file" }, { - "bom-ref": "03192c539af1dbf8", + "bom-ref": "18d6355f69eeabcc", "name": "/usr/include/strings.h", "type": "file" }, { - "bom-ref": "64aa2a839fd8e92f", + "bom-ref": "e435dcaa8fd8a89f", "name": "/usr/include/syscall.h", "type": "file" }, { - "bom-ref": "1651428c82131f31", + "bom-ref": "35a0f45b598fe205", "name": "/usr/include/sysexits.h", "type": "file" }, { - "bom-ref": "ae2d8752418fb0e5", + "bom-ref": "be86b3ca8dc9eead", "name": "/usr/include/syslog.h", "type": "file" }, { - "bom-ref": "3f92fb297f2bda32", + "bom-ref": "29145efa3e9f0292", "name": "/usr/include/tar.h", "type": "file" }, { - "bom-ref": "db927f91b27d7921", + "bom-ref": "4df544cc741a1249", "name": "/usr/include/termio.h", "type": "file" }, { - "bom-ref": "8ba574bf9dba2bed", + "bom-ref": "dcda5d167dc1e8d5", "name": "/usr/include/termios.h", "type": "file" }, { - "bom-ref": "f8eb5b8ca8e8018f", + "bom-ref": "9bf40ce2d378938b", "name": "/usr/include/tgmath.h", "type": "file" }, { - "bom-ref": "8296959729a7184d", + "bom-ref": "190dd626b144260d", "name": "/usr/include/thread_db.h", "type": "file" }, { - "bom-ref": "b4e54e51bde450d8", + "bom-ref": "421671bbd8225f80", "name": "/usr/include/threads.h", "type": "file" }, { - "bom-ref": "5391606c054f349a", + "bom-ref": "bdea3ca55d9bfbbe", "name": "/usr/include/time.h", "type": "file" }, { - "bom-ref": "a6c8ac8beb63e69f", + "bom-ref": "f363e2dc1c181897", "name": "/usr/include/ttyent.h", "type": "file" }, { - "bom-ref": "3b8e78e65675dc50", + "bom-ref": "fcbdb370ad649b34", "name": "/usr/include/uchar.h", "type": "file" }, { - "bom-ref": "a74074a5312b4d84", + "bom-ref": "4addb9ef172d725c", "name": "/usr/include/ucontext.h", "type": "file" }, { - "bom-ref": "f1309fac5498b544", + "bom-ref": "58f734f507335b48", "name": "/usr/include/ulimit.h", "type": "file" }, { - "bom-ref": "9e886a3a6833e67f", + "bom-ref": "82e32e263c2cde57", "name": "/usr/include/unistd.h", "type": "file" }, { - "bom-ref": "4bf819200d29a5a4", + "bom-ref": "1681f4297b2b8a54", "name": "/usr/include/utime.h", "type": "file" }, { - "bom-ref": "5bb177b0e8a1507d", + "bom-ref": "7d9a74a072cae3a5", "name": "/usr/include/utmp.h", "type": "file" }, { - "bom-ref": "84319c24365b52ec", + "bom-ref": "6d1ec2ecfbfcb0d0", "name": "/usr/include/utmpx.h", "type": "file" }, { - "bom-ref": "7db5ca041d60eed1", + "bom-ref": "1a07ce8287a82f79", "name": "/usr/include/values.h", "type": "file" }, { - "bom-ref": "fc310b048fac7c13", + "bom-ref": "c0fb01be41270f93", "name": "/usr/include/video/edid.h", "type": "file" }, { - "bom-ref": "6a6fe78755102a1c", + "bom-ref": "67354fa2cc1af02c", "name": "/usr/include/video/sisfb.h", "type": "file" }, { - "bom-ref": "5c9dbdb0bcf22e77", + "bom-ref": "870ca4050b0fd65b", "name": "/usr/include/video/uvesafb.h", "type": "file" }, { - "bom-ref": "bb11df12faf779bc", + "bom-ref": "68e03b99e8dbc720", "name": "/usr/include/wait.h", "type": "file" }, { - "bom-ref": "251ab4cf294cad66", + "bom-ref": "72166691d9e10412", "name": "/usr/include/wchar.h", "type": "file" }, { - "bom-ref": "f259e7ea3257a066", + "bom-ref": "a55bd73e3c3ca2a2", "name": "/usr/include/wctype.h", "type": "file" }, { - "bom-ref": "05a2c20570d219ef", + "bom-ref": "b49aee756b60f453", "name": "/usr/include/wordexp.h", "type": "file" }, { - "bom-ref": "b364c247d9b0bc2a", + "bom-ref": "1767ae3651ea177e", "name": "/usr/include/x86_64-linux-gnu/a.out.h", "type": "file" }, { - "bom-ref": "d0ed3fec62371c9d", + "bom-ref": "d963189433c541f5", "name": "/usr/include/x86_64-linux-gnu/asm/a.out.h", "type": "file" }, { - "bom-ref": "c666b75e01767ac7", + "bom-ref": "d1851bb0e1bb6b3f", "name": "/usr/include/x86_64-linux-gnu/asm/amd_hsmp.h", "type": "file" }, { - "bom-ref": "7b9c27165cc68f7a", + "bom-ref": "8ccf135973ac15a6", "name": "/usr/include/x86_64-linux-gnu/asm/auxvec.h", "type": "file" }, { - "bom-ref": "f777c91650e62c82", + "bom-ref": "74d0fd5d3a8365fe", "name": "/usr/include/x86_64-linux-gnu/asm/bitsperlong.h", "type": "file" }, { - "bom-ref": "604e268113545d96", + "bom-ref": "848fc131efd16706", "name": "/usr/include/x86_64-linux-gnu/asm/boot.h", "type": "file" }, { - "bom-ref": "918f14f8536c7b54", + "bom-ref": "0b18339cb7dd2b94", "name": "/usr/include/x86_64-linux-gnu/asm/bootparam.h", "type": "file" }, { - "bom-ref": "d806d628180948c3", + "bom-ref": "49d137628dfc5097", "name": "/usr/include/x86_64-linux-gnu/asm/bpf_perf_event.h", "type": "file" }, { - "bom-ref": "dabbdb9f99d55ae6", + "bom-ref": "402c7a4cfbfc148e", "name": "/usr/include/x86_64-linux-gnu/asm/byteorder.h", "type": "file" }, { - "bom-ref": "d2926328b28ddb2c", + "bom-ref": "1416b8cba8ea6b2c", "name": "/usr/include/x86_64-linux-gnu/asm/debugreg.h", "type": "file" }, { - "bom-ref": "976e07b0997b0322", + "bom-ref": "7c49d94d60eabe6a", "name": "/usr/include/x86_64-linux-gnu/asm/e820.h", "type": "file" }, { - "bom-ref": "736e195c55163f4f", + "bom-ref": "b08ea092b65a2e9f", "name": "/usr/include/x86_64-linux-gnu/asm/errno.h", "type": "file" }, { - "bom-ref": "ccfc0a05ccabbebb", + "bom-ref": "335646f9e3666417", "name": "/usr/include/x86_64-linux-gnu/asm/fcntl.h", "type": "file" }, { - "bom-ref": "4555a283af115b7c", + "bom-ref": "d3151cc0abdd60c8", "name": "/usr/include/x86_64-linux-gnu/asm/hw_breakpoint.h", "type": "file" }, { - "bom-ref": "87b75bd08ec59e8e", + "bom-ref": "30eea723af1fd512", "name": "/usr/include/x86_64-linux-gnu/asm/hwcap2.h", "type": "file" }, { - "bom-ref": "1781e26bb99d946d", + "bom-ref": "92536d6c6d483155", "name": "/usr/include/x86_64-linux-gnu/asm/ioctl.h", "type": "file" }, { - "bom-ref": "5b17acd486df06c7", + "bom-ref": "42356822e0797177", "name": "/usr/include/x86_64-linux-gnu/asm/ioctls.h", "type": "file" }, { - "bom-ref": "1dab4223bb79cbae", + "bom-ref": "b9c3e83f768763a2", "name": "/usr/include/x86_64-linux-gnu/asm/ipcbuf.h", "type": "file" }, { - "bom-ref": "c5300b23ef1895e9", + "bom-ref": "9ed7a610207faaed", "name": "/usr/include/x86_64-linux-gnu/asm/ist.h", "type": "file" }, { - "bom-ref": "7dbf55eb0ddc5ff4", + "bom-ref": "38c5dc4292830690", "name": "/usr/include/x86_64-linux-gnu/asm/kvm.h", "type": "file" }, { - "bom-ref": "dd1a5afa30b530b5", + "bom-ref": "3b1473a65afd84b5", "name": "/usr/include/x86_64-linux-gnu/asm/kvm_para.h", "type": "file" }, { - "bom-ref": "3635f64b5855f3b3", + "bom-ref": "4af6a30b8f60b273", "name": "/usr/include/x86_64-linux-gnu/asm/kvm_perf.h", "type": "file" }, { - "bom-ref": "5c824514253221b6", + "bom-ref": "f84536ff6a986f2a", "name": "/usr/include/x86_64-linux-gnu/asm/ldt.h", "type": "file" }, { - "bom-ref": "f867cd3832fe8ca4", + "bom-ref": "702da9eb51eba974", "name": "/usr/include/x86_64-linux-gnu/asm/mce.h", "type": "file" }, { - "bom-ref": "40cde9c78abbe3c6", + "bom-ref": "a81bf9c72279ed2e", "name": "/usr/include/x86_64-linux-gnu/asm/mman.h", "type": "file" }, { - "bom-ref": "c71526acaaab7013", + "bom-ref": "2f246fbdeda1f293", "name": "/usr/include/x86_64-linux-gnu/asm/msgbuf.h", "type": "file" }, { - "bom-ref": "18875ed670d61dea", + "bom-ref": "0646c1af76872c26", "name": "/usr/include/x86_64-linux-gnu/asm/msr.h", "type": "file" }, { - "bom-ref": "3fa81f0d3cccce72", + "bom-ref": "4ee0a63d70148762", "name": "/usr/include/x86_64-linux-gnu/asm/mtrr.h", "type": "file" }, { - "bom-ref": "b29e6cb9f62ed297", + "bom-ref": "2c8eca89c1e627d7", "name": "/usr/include/x86_64-linux-gnu/asm/param.h", "type": "file" }, { - "bom-ref": "04234b6c88a4a7ec", + "bom-ref": "d07cfa95fa89b05c", "name": "/usr/include/x86_64-linux-gnu/asm/perf_regs.h", "type": "file" }, { - "bom-ref": "3c9606a2f0f940e9", + "bom-ref": "9ee9bd1a00408a09", "name": "/usr/include/x86_64-linux-gnu/asm/poll.h", "type": "file" }, { - "bom-ref": "b7f9802df28bea49", + "bom-ref": "d8d0fcb2e9a058c9", "name": "/usr/include/x86_64-linux-gnu/asm/posix_types.h", "type": "file" }, { - "bom-ref": "4de46ca4b3b5e59d", + "bom-ref": "36620494a7ceae2d", "name": "/usr/include/x86_64-linux-gnu/asm/posix_types_32.h", "type": "file" }, { - "bom-ref": "38a0ebff1557edc1", + "bom-ref": "f1cad0379e937c01", "name": "/usr/include/x86_64-linux-gnu/asm/posix_types_64.h", "type": "file" }, { - "bom-ref": "1eeed045083c5f08", + "bom-ref": "c97ac2d0b71ff0a0", "name": "/usr/include/x86_64-linux-gnu/asm/posix_types_x32.h", "type": "file" }, { - "bom-ref": "4a377e26059506db", + "bom-ref": "2c9ba266a6a4298f", "name": "/usr/include/x86_64-linux-gnu/asm/prctl.h", "type": "file" }, { - "bom-ref": "1f94de69d1ed0870", + "bom-ref": "fc9de2ef75f3cea8", "name": "/usr/include/x86_64-linux-gnu/asm/processor-flags.h", "type": "file" }, { - "bom-ref": "8a28deb528654fc5", + "bom-ref": "5c1d5377e07fc9ad", "name": "/usr/include/x86_64-linux-gnu/asm/ptrace-abi.h", "type": "file" }, { - "bom-ref": "48f5f4d0db5dcdc5", + "bom-ref": "3ea26a857636a44d", "name": "/usr/include/x86_64-linux-gnu/asm/ptrace.h", "type": "file" }, { - "bom-ref": "7fcdb37804736eac", + "bom-ref": "cca08e957ead6e30", "name": "/usr/include/x86_64-linux-gnu/asm/resource.h", "type": "file" }, { - "bom-ref": "0285c858d452efc4", + "bom-ref": "74040ade4faec0d4", "name": "/usr/include/x86_64-linux-gnu/asm/sembuf.h", "type": "file" }, { - "bom-ref": "4376da0713102a36", + "bom-ref": "2fa651cf247611f6", "name": "/usr/include/x86_64-linux-gnu/asm/setup.h", "type": "file" }, { - "bom-ref": "f50e56ca7f8fffe6", + "bom-ref": "53076bb7bc131426", "name": "/usr/include/x86_64-linux-gnu/asm/sgx.h", "type": "file" }, { - "bom-ref": "789af9468dc8620b", + "bom-ref": "b2c633674068335f", "name": "/usr/include/x86_64-linux-gnu/asm/shmbuf.h", "type": "file" }, { - "bom-ref": "6e19fe4c05b3b21a", + "bom-ref": "1e3fedf18ee0568a", "name": "/usr/include/x86_64-linux-gnu/asm/sigcontext.h", "type": "file" }, { - "bom-ref": "b400b96dda17f3a3", + "bom-ref": "47aa6d739c5e8f2f", "name": "/usr/include/x86_64-linux-gnu/asm/sigcontext32.h", "type": "file" }, { - "bom-ref": "d2fdc906dc5e69d8", + "bom-ref": "0fe06bbebe050c24", "name": "/usr/include/x86_64-linux-gnu/asm/siginfo.h", "type": "file" }, { - "bom-ref": "8754e10da8d24dc1", + "bom-ref": "8387a42024ac0485", "name": "/usr/include/x86_64-linux-gnu/asm/signal.h", "type": "file" }, { - "bom-ref": "22d9ff9a87b1cef0", + "bom-ref": "78476949f517c300", "name": "/usr/include/x86_64-linux-gnu/asm/socket.h", "type": "file" }, { - "bom-ref": "bbe23a8d35dc4686", + "bom-ref": "3cb5ca3348629da2", "name": "/usr/include/x86_64-linux-gnu/asm/sockios.h", "type": "file" }, { - "bom-ref": "1a426dbcc07cb149", + "bom-ref": "93e727f2ab334acd", "name": "/usr/include/x86_64-linux-gnu/asm/stat.h", "type": "file" }, { - "bom-ref": "1e46d1e504438d20", + "bom-ref": "920557a723d2b4a0", "name": "/usr/include/x86_64-linux-gnu/asm/statfs.h", "type": "file" }, { - "bom-ref": "538a9f4affd3d20f", + "bom-ref": "35b242d029a5ec57", "name": "/usr/include/x86_64-linux-gnu/asm/svm.h", "type": "file" }, { - "bom-ref": "a5c459319b7cda00", + "bom-ref": "8aed21fef288f568", "name": "/usr/include/x86_64-linux-gnu/asm/swab.h", "type": "file" }, { - "bom-ref": "aabf43ea0e40c98c", + "bom-ref": "0501ae61af48eee4", "name": "/usr/include/x86_64-linux-gnu/asm/termbits.h", "type": "file" }, { - "bom-ref": "2d679b6ca93d0f81", + "bom-ref": "00e156cc32aa7bc5", "name": "/usr/include/x86_64-linux-gnu/asm/termios.h", "type": "file" }, { - "bom-ref": "d4a829dd22a51393", + "bom-ref": "d1d1cb24014a0a9b", "name": "/usr/include/x86_64-linux-gnu/asm/types.h", "type": "file" }, { - "bom-ref": "bd2a3db52904b635", + "bom-ref": "93d59d5163a04b79", "name": "/usr/include/x86_64-linux-gnu/asm/ucontext.h", "type": "file" }, { - "bom-ref": "ebb8a6c58709cb88", + "bom-ref": "5bcf7886418fd498", "name": "/usr/include/x86_64-linux-gnu/asm/unistd.h", "type": "file" }, { - "bom-ref": "b3866207f63ac293", + "bom-ref": "70827890cbcad493", "name": "/usr/include/x86_64-linux-gnu/asm/unistd_32.h", "type": "file" }, { - "bom-ref": "83312928568f794f", + "bom-ref": "5bff6d8c58bb42a3", "name": "/usr/include/x86_64-linux-gnu/asm/unistd_64.h", "type": "file" }, { - "bom-ref": "4f3f164509d066b5", + "bom-ref": "3fefd19db1df6ad9", "name": "/usr/include/x86_64-linux-gnu/asm/unistd_x32.h", "type": "file" }, { - "bom-ref": "60fa5fc66d5844f1", + "bom-ref": "cc6132e44d054469", "name": "/usr/include/x86_64-linux-gnu/asm/vm86.h", "type": "file" }, { - "bom-ref": "de07c121ec72f90b", + "bom-ref": "8bf0f94a229da05b", "name": "/usr/include/x86_64-linux-gnu/asm/vmx.h", "type": "file" }, { - "bom-ref": "4933578cd26a6e9c", + "bom-ref": "443ecaffcba6f69c", "name": "/usr/include/x86_64-linux-gnu/asm/vsyscall.h", "type": "file" }, { - "bom-ref": "e1d126a4d9db3a0c", + "bom-ref": "a79a6931bd39b0bc", "name": "/usr/include/x86_64-linux-gnu/bits/a.out.h", "type": "file" }, { - "bom-ref": "552b008c60d7e10a", + "bom-ref": "94804597f1ab4596", "name": "/usr/include/x86_64-linux-gnu/bits/argp-ldbl.h", "type": "file" }, { - "bom-ref": "ff774f5865ad2df7", + "bom-ref": "028fc8c78b86a783", "name": "/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h", "type": "file" }, { - "bom-ref": "9721643b4f122fd3", + "bom-ref": "36d54a11fa6a8d1f", "name": "/usr/include/x86_64-linux-gnu/bits/byteswap.h", "type": "file" }, { - "bom-ref": "2d9dd5e2228104a2", + "bom-ref": "236f950354f2fcfa", "name": "/usr/include/x86_64-linux-gnu/bits/cmathcalls.h", "type": "file" }, { - "bom-ref": "f929bb38438a8f1b", + "bom-ref": "58935f0f3112aac7", "name": "/usr/include/x86_64-linux-gnu/bits/confname.h", "type": "file" }, { - "bom-ref": "57a2e6c2b25f17cc", + "bom-ref": "44d080d565c9504c", "name": "/usr/include/x86_64-linux-gnu/bits/cpu-set.h", "type": "file" }, { - "bom-ref": "5414c2ca468ebebc", + "bom-ref": "005f935d58ac9644", "name": "/usr/include/x86_64-linux-gnu/bits/dirent.h", "type": "file" }, { - "bom-ref": "cfcb7a2bf884a4c5", + "bom-ref": "7bbe1490fceb942d", "name": "/usr/include/x86_64-linux-gnu/bits/dirent_ext.h", "type": "file" }, { - "bom-ref": "962d013a3ac3b0e9", + "bom-ref": "cff332a718626185", "name": "/usr/include/x86_64-linux-gnu/bits/dl_find_object.h", "type": "file" }, { - "bom-ref": "ca1d5169697d5bae", + "bom-ref": "e5ac042151ae1756", "name": "/usr/include/x86_64-linux-gnu/bits/dlfcn.h", "type": "file" }, { - "bom-ref": "ddddd481e3cd89b7", + "bom-ref": "15be54febb8a608f", "name": "/usr/include/x86_64-linux-gnu/bits/elfclass.h", "type": "file" }, { - "bom-ref": "29de4f2d610e5fc2", + "bom-ref": "8e841b618e4731c2", "name": "/usr/include/x86_64-linux-gnu/bits/endian.h", "type": "file" }, { - "bom-ref": "718e66c7b8d4ed3f", + "bom-ref": "52537a65485227b3", "name": "/usr/include/x86_64-linux-gnu/bits/endianness.h", "type": "file" }, { - "bom-ref": "5a5fa98be196650b", + "bom-ref": "ea58523291301d83", "name": "/usr/include/x86_64-linux-gnu/bits/environments.h", "type": "file" }, { - "bom-ref": "6b6b2ac29dc40bbf", + "bom-ref": "1b412a1a7bbe4407", "name": "/usr/include/x86_64-linux-gnu/bits/epoll.h", "type": "file" }, { - "bom-ref": "bcc5166194a32a07", + "bom-ref": "8193c64cbc24aea7", "name": "/usr/include/x86_64-linux-gnu/bits/err-ldbl.h", "type": "file" }, { - "bom-ref": "95cdd6e4db5e1217", + "bom-ref": "8110230472bca28b", "name": "/usr/include/x86_64-linux-gnu/bits/errno.h", "type": "file" }, { - "bom-ref": "d9e8546b9751bd08", + "bom-ref": "fe062a2713b7adc4", "name": "/usr/include/x86_64-linux-gnu/bits/error-ldbl.h", "type": "file" }, { - "bom-ref": "1494e1175e78b041", + "bom-ref": "2e7192dfb5626391", "name": "/usr/include/x86_64-linux-gnu/bits/error.h", "type": "file" }, { - "bom-ref": "dcfe9dcdee531ce0", + "bom-ref": "9ac7671663a5e464", "name": "/usr/include/x86_64-linux-gnu/bits/eventfd.h", "type": "file" }, { - "bom-ref": "c7344fe99934306c", + "bom-ref": "c354c93210ec8734", "name": "/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h", "type": "file" }, { - "bom-ref": "012a0bba1e9cba3e", + "bom-ref": "f853a5fd22bfa63e", "name": "/usr/include/x86_64-linux-gnu/bits/fcntl.h", "type": "file" }, { - "bom-ref": "f1378d5b98c813bf", + "bom-ref": "feed943431f09e27", "name": "/usr/include/x86_64-linux-gnu/bits/fcntl2.h", "type": "file" }, { - "bom-ref": "c801a434b629b921", + "bom-ref": "b700ddb604d2d229", "name": "/usr/include/x86_64-linux-gnu/bits/fenv.h", "type": "file" }, { - "bom-ref": "b2a74b99f6543869", + "bom-ref": "0179596279b41d95", "name": "/usr/include/x86_64-linux-gnu/bits/floatn-common.h", "type": "file" }, { - "bom-ref": "03d3f6f72542ae59", + "bom-ref": "493baf89dc31f001", "name": "/usr/include/x86_64-linux-gnu/bits/floatn.h", "type": "file" }, { - "bom-ref": "894bf51e18c6f719", + "bom-ref": "2fbc2b3881f998d9", "name": "/usr/include/x86_64-linux-gnu/bits/flt-eval-method.h", "type": "file" }, { - "bom-ref": "e57682896194d8bc", + "bom-ref": "2939e44514ef80e8", "name": "/usr/include/x86_64-linux-gnu/bits/fp-fast.h", "type": "file" }, { - "bom-ref": "a83c1eea56d8cde4", + "bom-ref": "89e0bd92fb0e1b74", "name": "/usr/include/x86_64-linux-gnu/bits/fp-logb.h", "type": "file" }, { - "bom-ref": "a02efa49b83e0933", + "bom-ref": "f7ff3d3daf81b483", "name": "/usr/include/x86_64-linux-gnu/bits/getopt_core.h", "type": "file" }, { - "bom-ref": "87d82993c49a4326", + "bom-ref": "ae42a09985dd71d2", "name": "/usr/include/x86_64-linux-gnu/bits/getopt_ext.h", "type": "file" }, { - "bom-ref": "097a66c7e8b48819", + "bom-ref": "59dd31aad6e376f1", "name": "/usr/include/x86_64-linux-gnu/bits/getopt_posix.h", "type": "file" }, { - "bom-ref": "0c9f2cf0ca149f2c", + "bom-ref": "85b5092c7f3cd594", "name": "/usr/include/x86_64-linux-gnu/bits/hwcap.h", "type": "file" }, { - "bom-ref": "e39795f426bff729", + "bom-ref": "c549ed0fd41511dd", "name": "/usr/include/x86_64-linux-gnu/bits/in.h", "type": "file" }, { - "bom-ref": "fa5a77fbef320124", + "bom-ref": "6b8775e0c2090d74", "name": "/usr/include/x86_64-linux-gnu/bits/indirect-return.h", "type": "file" }, { - "bom-ref": "3acd87b86a036247", + "bom-ref": "ef8db650113ece9f", "name": "/usr/include/x86_64-linux-gnu/bits/initspin.h", "type": "file" }, { - "bom-ref": "ed15121d3c7eb5c3", + "bom-ref": "c0066d0bcbb2be23", "name": "/usr/include/x86_64-linux-gnu/bits/inotify.h", "type": "file" }, { - "bom-ref": "e32427f650cf742d", + "bom-ref": "843addea9431ef95", "name": "/usr/include/x86_64-linux-gnu/bits/ioctl-types.h", "type": "file" }, { - "bom-ref": "f9c7a32857d46ce3", + "bom-ref": "b8a1bbb00f74ef5b", "name": "/usr/include/x86_64-linux-gnu/bits/ioctls.h", "type": "file" }, { - "bom-ref": "ac077ec7674e4ec0", + "bom-ref": "c60970a596047344", "name": "/usr/include/x86_64-linux-gnu/bits/ipc-perm.h", "type": "file" }, { - "bom-ref": "965c6c9314a595ef", + "bom-ref": "b0855490f172baa7", "name": "/usr/include/x86_64-linux-gnu/bits/ipc.h", "type": "file" }, { - "bom-ref": "a8385b3b6953c96a", + "bom-ref": "b85577ca9a61eab6", "name": "/usr/include/x86_64-linux-gnu/bits/ipctypes.h", "type": "file" }, { - "bom-ref": "34cbd9c47e263b54", + "bom-ref": "24e69b94345afeb4", "name": "/usr/include/x86_64-linux-gnu/bits/iscanonical.h", "type": "file" }, { - "bom-ref": "9b24282e10845372", + "bom-ref": "c92bd715077b29c2", "name": "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h", "type": "file" }, { - "bom-ref": "1e2ea2864620254e", + "bom-ref": "3cbcc758f4da0626", "name": "/usr/include/x86_64-linux-gnu/bits/libm-simd-decl-stubs.h", "type": "file" }, { - "bom-ref": "99b6bec244ff2a64", + "bom-ref": "878a555715e95118", "name": "/usr/include/x86_64-linux-gnu/bits/link.h", "type": "file" }, { - "bom-ref": "2bb44e355fcc2433", + "bom-ref": "67b26138f01b20af", "name": "/usr/include/x86_64-linux-gnu/bits/link_lavcurrent.h", "type": "file" }, { - "bom-ref": "617bc0759de2f976", + "bom-ref": "ff8f05d5aba9acbe", "name": "/usr/include/x86_64-linux-gnu/bits/local_lim.h", "type": "file" }, { - "bom-ref": "f73c652dd69c7770", + "bom-ref": "c62a32e9fc170550", "name": "/usr/include/x86_64-linux-gnu/bits/locale.h", "type": "file" }, { - "bom-ref": "d1b7657e7f48bcfc", + "bom-ref": "e3d72728b7ec0320", "name": "/usr/include/x86_64-linux-gnu/bits/long-double.h", "type": "file" }, { - "bom-ref": "25ffea2a8380e667", + "bom-ref": "bf2ef329863c0d0f", "name": "/usr/include/x86_64-linux-gnu/bits/math-vector.h", "type": "file" }, { - "bom-ref": "411c91245dc13175", + "bom-ref": "b98c59710bf494ad", "name": "/usr/include/x86_64-linux-gnu/bits/mathcalls-helper-functions.h", "type": "file" }, { - "bom-ref": "6d6d6e4d489ce4f6", + "bom-ref": "f0aef56a9c33c13a", "name": "/usr/include/x86_64-linux-gnu/bits/mathcalls-narrow.h", "type": "file" }, { - "bom-ref": "02f98894a78c22a0", + "bom-ref": "5902846e09456a5c", "name": "/usr/include/x86_64-linux-gnu/bits/mathcalls.h", "type": "file" }, { - "bom-ref": "52ff21b5fd7dd321", + "bom-ref": "b1a8f03126d7aa01", "name": "/usr/include/x86_64-linux-gnu/bits/mathdef.h", "type": "file" }, { - "bom-ref": "6304a6cf06c5fac3", + "bom-ref": "ae75a8609e256b73", "name": "/usr/include/x86_64-linux-gnu/bits/mman-linux.h", "type": "file" }, { - "bom-ref": "7d1d4c6e325a5604", + "bom-ref": "395e722dbe9ed970", "name": "/usr/include/x86_64-linux-gnu/bits/mman-map-flags-generic.h", "type": "file" }, { - "bom-ref": "7300670fc980b0d5", + "bom-ref": "c4b43fcfbdfbef89", "name": "/usr/include/x86_64-linux-gnu/bits/mman-shared.h", "type": "file" }, { - "bom-ref": "4fa4524cd953514e", + "bom-ref": "bb989872d3cf0a62", "name": "/usr/include/x86_64-linux-gnu/bits/mman.h", "type": "file" }, { - "bom-ref": "a5e16e0acd396f6c", + "bom-ref": "4bac929123b0a3c4", "name": "/usr/include/x86_64-linux-gnu/bits/mman_ext.h", "type": "file" }, { - "bom-ref": "441bd758454fb721", + "bom-ref": "ac01f490d34b05ed", "name": "/usr/include/x86_64-linux-gnu/bits/monetary-ldbl.h", "type": "file" }, { - "bom-ref": "1b3ca04ce2eecc4e", + "bom-ref": "1d7485dad3e554d6", "name": "/usr/include/x86_64-linux-gnu/bits/mqueue.h", "type": "file" }, { - "bom-ref": "26d54f2f6de8439b", + "bom-ref": "458245b0f5b5fdbb", "name": "/usr/include/x86_64-linux-gnu/bits/mqueue2.h", "type": "file" }, { - "bom-ref": "0449c0192d806669", + "bom-ref": "8dbb61a3b2db6aed", "name": "/usr/include/x86_64-linux-gnu/bits/msq.h", "type": "file" }, { - "bom-ref": "7e193fca8cf235d1", + "bom-ref": "dd7b5b46b9140791", "name": "/usr/include/x86_64-linux-gnu/bits/netdb.h", "type": "file" }, { - "bom-ref": "7e1ce7917e1605bb", + "bom-ref": "e4327a2f7fab9f8b", "name": "/usr/include/x86_64-linux-gnu/bits/param.h", "type": "file" }, { - "bom-ref": "87923a17358d26c9", + "bom-ref": "99585ba8c82d37a9", "name": "/usr/include/x86_64-linux-gnu/bits/platform/features.h", "type": "file" }, { - "bom-ref": "da0615115ddb3a02", + "bom-ref": "cf3a6c51ab00afca", "name": "/usr/include/x86_64-linux-gnu/bits/platform/x86.h", "type": "file" }, { - "bom-ref": "7a0be85296d25a44", + "bom-ref": "b0275d508f0367c8", "name": "/usr/include/x86_64-linux-gnu/bits/poll.h", "type": "file" }, { - "bom-ref": "2863493e23bffcf8", + "bom-ref": "1d6350c4001ffcd8", "name": "/usr/include/x86_64-linux-gnu/bits/poll2.h", "type": "file" }, { - "bom-ref": "77dc9df404741763", + "bom-ref": "e2e4acba09d5ce5f", "name": "/usr/include/x86_64-linux-gnu/bits/posix1_lim.h", "type": "file" }, { - "bom-ref": "f8ff230be63e472c", + "bom-ref": "af14959ba49f609c", "name": "/usr/include/x86_64-linux-gnu/bits/posix2_lim.h", "type": "file" }, { - "bom-ref": "f2f810dcb52e80ea", + "bom-ref": "86c25e881681f572", "name": "/usr/include/x86_64-linux-gnu/bits/posix_opt.h", "type": "file" }, { - "bom-ref": "8bb27a07d9ed16f6", + "bom-ref": "df10d432e975e836", "name": "/usr/include/x86_64-linux-gnu/bits/printf-ldbl.h", "type": "file" }, { - "bom-ref": "9657d632c6171d88", + "bom-ref": "a791840dd3d52050", "name": "/usr/include/x86_64-linux-gnu/bits/procfs-extra.h", "type": "file" }, { - "bom-ref": "c786e25cce362d70", + "bom-ref": "9d455b400021f664", "name": "/usr/include/x86_64-linux-gnu/bits/procfs-id.h", "type": "file" }, { - "bom-ref": "ef7c09def84d48d0", + "bom-ref": "c74f3f48ce5a89e0", "name": "/usr/include/x86_64-linux-gnu/bits/procfs-prregset.h", "type": "file" }, { - "bom-ref": "c724f512bb6843eb", + "bom-ref": "331218f029b37453", "name": "/usr/include/x86_64-linux-gnu/bits/procfs.h", "type": "file" }, { - "bom-ref": "294ac32ddd51784f", + "bom-ref": "c3de5813575c6837", "name": "/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h", "type": "file" }, { - "bom-ref": "023568432c8b83bf", + "bom-ref": "80c8dda06b0d3847", "name": "/usr/include/x86_64-linux-gnu/bits/pthread_stack_min.h", "type": "file" }, { - "bom-ref": "66129d6ec42b2963", + "bom-ref": "99cd8062e8057e33", "name": "/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h", "type": "file" }, { - "bom-ref": "3a1dfc8c3861b382", + "bom-ref": "6eecdf33fd0c4b8e", "name": "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h", "type": "file" }, { - "bom-ref": "7f390ca3a132271e", + "bom-ref": "38acac82845d1396", "name": "/usr/include/x86_64-linux-gnu/bits/ptrace-shared.h", "type": "file" }, { - "bom-ref": "dbd9f681d613ef7d", + "bom-ref": "bf9c8e4db0522621", "name": "/usr/include/x86_64-linux-gnu/bits/resource.h", "type": "file" }, { - "bom-ref": "9a7d33bf9c30b719", + "bom-ref": "21452db5acc21829", "name": "/usr/include/x86_64-linux-gnu/bits/rseq.h", "type": "file" }, { - "bom-ref": "4984411e20f7d648", + "bom-ref": "796df6c74c7c6178", "name": "/usr/include/x86_64-linux-gnu/bits/sched.h", "type": "file" }, { - "bom-ref": "80e44706c35cfc9d", + "bom-ref": "e36d539df2ae85b1", "name": "/usr/include/x86_64-linux-gnu/bits/select-decl.h", "type": "file" }, { - "bom-ref": "8007f233078d8bee", + "bom-ref": "d742a7290d36399e", "name": "/usr/include/x86_64-linux-gnu/bits/select.h", "type": "file" }, { - "bom-ref": "558f83565c9261c5", + "bom-ref": "c0f180d0610afaa5", "name": "/usr/include/x86_64-linux-gnu/bits/select2.h", "type": "file" }, { - "bom-ref": "e00f9203f0420845", + "bom-ref": "d09c89f64aac3409", "name": "/usr/include/x86_64-linux-gnu/bits/sem.h", "type": "file" }, { - "bom-ref": "8079f9650df90acf", + "bom-ref": "f10954ee291dd7c3", "name": "/usr/include/x86_64-linux-gnu/bits/semaphore.h", "type": "file" }, { - "bom-ref": "9ad17dba29e5ca74", + "bom-ref": "274fbe4f12c77b50", "name": "/usr/include/x86_64-linux-gnu/bits/setjmp.h", "type": "file" }, { - "bom-ref": "1dfb62581e912973", + "bom-ref": "362d26889d471e1f", "name": "/usr/include/x86_64-linux-gnu/bits/setjmp2.h", "type": "file" }, { - "bom-ref": "f7540788a2ef31fb", + "bom-ref": "df113d7c97723c33", "name": "/usr/include/x86_64-linux-gnu/bits/shm.h", "type": "file" }, { - "bom-ref": "b2398e330516fb94", + "bom-ref": "1db91bf272923680", "name": "/usr/include/x86_64-linux-gnu/bits/shmlba.h", "type": "file" }, { - "bom-ref": "bbbe7ad80057c9d6", + "bom-ref": "31c1f2e23c154cf6", "name": "/usr/include/x86_64-linux-gnu/bits/sigaction.h", "type": "file" }, { - "bom-ref": "aee1244c0696fcba", + "bom-ref": "699a8f7075944366", "name": "/usr/include/x86_64-linux-gnu/bits/sigcontext.h", "type": "file" }, { - "bom-ref": "e300e409a2545a50", + "bom-ref": "e7da944ee77c76f4", "name": "/usr/include/x86_64-linux-gnu/bits/sigevent-consts.h", "type": "file" }, { - "bom-ref": "3efbed21ebfdaf0d", + "bom-ref": "24c0958ed943caf5", "name": "/usr/include/x86_64-linux-gnu/bits/siginfo-arch.h", "type": "file" }, { - "bom-ref": "31b337fa681b9d42", + "bom-ref": "42fd72ca7a06797e", "name": "/usr/include/x86_64-linux-gnu/bits/siginfo-consts-arch.h", "type": "file" }, { - "bom-ref": "26db93e6f7ad5655", + "bom-ref": "03f79555efe8a8a9", "name": "/usr/include/x86_64-linux-gnu/bits/siginfo-consts.h", "type": "file" }, { - "bom-ref": "e1978bc98e2fb361", + "bom-ref": "a59cfb19ea9b2f3d", "name": "/usr/include/x86_64-linux-gnu/bits/signal_ext.h", "type": "file" }, { - "bom-ref": "40cd5fecb020ce24", + "bom-ref": "28a9e799347d9078", "name": "/usr/include/x86_64-linux-gnu/bits/signalfd.h", "type": "file" }, { - "bom-ref": "79dfc805066a0f3e", + "bom-ref": "27944f91d534eea6", "name": "/usr/include/x86_64-linux-gnu/bits/signum-arch.h", "type": "file" }, { - "bom-ref": "89b224297240dd14", + "bom-ref": "c682bcc1fd5a6480", "name": "/usr/include/x86_64-linux-gnu/bits/signum-generic.h", "type": "file" }, { - "bom-ref": "4eea670c26dd932e", + "bom-ref": "5747c011d3025c6e", "name": "/usr/include/x86_64-linux-gnu/bits/sigstack.h", "type": "file" }, { - "bom-ref": "e081c5d7b627b7d7", + "bom-ref": "23c5c30a911477eb", "name": "/usr/include/x86_64-linux-gnu/bits/sigstksz.h", "type": "file" }, { - "bom-ref": "65aa325f4bd23aac", + "bom-ref": "77001ab96e75366c", "name": "/usr/include/x86_64-linux-gnu/bits/sigthread.h", "type": "file" }, { - "bom-ref": "1e9b8a1b86b9a273", + "bom-ref": "0a083fa3c85baf0f", "name": "/usr/include/x86_64-linux-gnu/bits/sockaddr.h", "type": "file" }, { - "bom-ref": "faccfce1eb5691ce", + "bom-ref": "9401a8340d55514a", "name": "/usr/include/x86_64-linux-gnu/bits/socket-constants.h", "type": "file" }, { - "bom-ref": "ac71782c122ada03", + "bom-ref": "3681c57350d2fc7f", "name": "/usr/include/x86_64-linux-gnu/bits/socket.h", "type": "file" }, { - "bom-ref": "2406312232389c89", + "bom-ref": "e9127480ca014605", "name": "/usr/include/x86_64-linux-gnu/bits/socket2.h", "type": "file" }, { - "bom-ref": "e3674deed34ff93e", + "bom-ref": "bedd9930c0396f66", "name": "/usr/include/x86_64-linux-gnu/bits/socket_type.h", "type": "file" }, { - "bom-ref": "5a4ecb03279af4eb", + "bom-ref": "824e160200387797", "name": "/usr/include/x86_64-linux-gnu/bits/spawn_ext.h", "type": "file" }, { - "bom-ref": "05ab4b10405ab5c9", + "bom-ref": "6da455deca193d7d", "name": "/usr/include/x86_64-linux-gnu/bits/ss_flags.h", "type": "file" }, { - "bom-ref": "5fe3f9d805fbf763", + "bom-ref": "c10b38c61f98fe0b", "name": "/usr/include/x86_64-linux-gnu/bits/stab.def", "type": "file" }, { - "bom-ref": "79c6d75325090107", + "bom-ref": "93b58935018558ef", "name": "/usr/include/x86_64-linux-gnu/bits/stat.h", "type": "file" }, { - "bom-ref": "b1c154150af79686", + "bom-ref": "a264230a49ce021a", "name": "/usr/include/x86_64-linux-gnu/bits/statfs.h", "type": "file" }, { - "bom-ref": "d681d8c118770d1a", + "bom-ref": "0f795bcab18c111a", "name": "/usr/include/x86_64-linux-gnu/bits/statvfs.h", "type": "file" }, { - "bom-ref": "64b63093f35489f2", + "bom-ref": "c94008dc589babf2", "name": "/usr/include/x86_64-linux-gnu/bits/statx-generic.h", "type": "file" }, { - "bom-ref": "24c4e28d203483a3", + "bom-ref": "2e188433b1bbed47", "name": "/usr/include/x86_64-linux-gnu/bits/statx.h", "type": "file" }, { - "bom-ref": "ff1f1b8a593c8e34", + "bom-ref": "3cf0f912d76fb2b8", "name": "/usr/include/x86_64-linux-gnu/bits/stdint-intn.h", "type": "file" }, { - "bom-ref": "470328e987d79b0c", + "bom-ref": "aaa559ad2a271f50", "name": "/usr/include/x86_64-linux-gnu/bits/stdint-least.h", "type": "file" }, { - "bom-ref": "f4fd35ce881e2a8a", + "bom-ref": "f04f545312c10b4a", "name": "/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h", "type": "file" }, { - "bom-ref": "3f4ea990517701fd", + "bom-ref": "0300c2da65ed895d", "name": "/usr/include/x86_64-linux-gnu/bits/stdio-ldbl.h", "type": "file" }, { - "bom-ref": "120a1370301544fc", + "bom-ref": "ecb072b746846380", "name": "/usr/include/x86_64-linux-gnu/bits/stdio.h", "type": "file" }, { - "bom-ref": "e16b12468c05cbac", + "bom-ref": "317f4ae0f79cbdec", "name": "/usr/include/x86_64-linux-gnu/bits/stdio2-decl.h", "type": "file" }, { - "bom-ref": "cca26dd55d03cb8a", + "bom-ref": "7771e764c4291e22", "name": "/usr/include/x86_64-linux-gnu/bits/stdio2.h", "type": "file" }, { - "bom-ref": "f2b50e39ce0bacea", + "bom-ref": "970d9a4502f25cea", "name": "/usr/include/x86_64-linux-gnu/bits/stdio_lim.h", "type": "file" }, { - "bom-ref": "0ff95bf2f2f7e1b0", + "bom-ref": "64cb06497c479610", "name": "/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h", "type": "file" }, { - "bom-ref": "862ee3de94b2bce2", + "bom-ref": "b168d79b629813a2", "name": "/usr/include/x86_64-linux-gnu/bits/stdlib-float.h", "type": "file" }, { - "bom-ref": "8b8996643dff5790", + "bom-ref": "48f0ba2f7ba1d1e4", "name": "/usr/include/x86_64-linux-gnu/bits/stdlib-ldbl.h", "type": "file" }, { - "bom-ref": "6c4ccca49985ca23", + "bom-ref": "0d3b97dc54396e6b", "name": "/usr/include/x86_64-linux-gnu/bits/stdlib.h", "type": "file" }, { - "bom-ref": "e2e97c1068bf3d89", + "bom-ref": "1832b2ad3337646d", "name": "/usr/include/x86_64-linux-gnu/bits/string_fortified.h", "type": "file" }, { - "bom-ref": "a6e8e04b2a52fca7", + "bom-ref": "b8d3a2bcc446510f", "name": "/usr/include/x86_64-linux-gnu/bits/strings_fortified.h", "type": "file" }, { - "bom-ref": "474c25b4143079b0", + "bom-ref": "c23b5b0e2c060830", "name": "/usr/include/x86_64-linux-gnu/bits/struct_mutex.h", "type": "file" }, { - "bom-ref": "bdeca655b3ef8e6f", + "bom-ref": "a5f379f555b1a84f", "name": "/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h", "type": "file" }, { - "bom-ref": "8c830caab4823af9", + "bom-ref": "d2e9a622985d16cd", "name": "/usr/include/x86_64-linux-gnu/bits/struct_stat.h", "type": "file" }, { - "bom-ref": "8a6159930eb635f5", + "bom-ref": "756e81957715e6f9", "name": "/usr/include/x86_64-linux-gnu/bits/struct_stat_time64_helper.h", "type": "file" }, { - "bom-ref": "2a67f8aa5a69e5a5", + "bom-ref": "d6c292317ccca639", "name": "/usr/include/x86_64-linux-gnu/bits/syscall.h", "type": "file" }, { - "bom-ref": "d526f01f32bf775e", + "bom-ref": "8ac21c7d22bdce8e", "name": "/usr/include/x86_64-linux-gnu/bits/syslog-decl.h", "type": "file" }, { - "bom-ref": "af25f29932a84f53", + "bom-ref": "74b44582e562881f", "name": "/usr/include/x86_64-linux-gnu/bits/syslog-ldbl.h", "type": "file" }, { - "bom-ref": "4f95af25eb60c358", + "bom-ref": "cc8be6fb1ce3107c", "name": "/usr/include/x86_64-linux-gnu/bits/syslog-path.h", "type": "file" }, { - "bom-ref": "d2058dedf1d207e6", + "bom-ref": "f08022cbeb411482", "name": "/usr/include/x86_64-linux-gnu/bits/syslog.h", "type": "file" }, { - "bom-ref": "713b418192e98a6c", + "bom-ref": "010a917ebc6e8aec", "name": "/usr/include/x86_64-linux-gnu/bits/sysmacros.h", "type": "file" }, { - "bom-ref": "0fe0922a6892eadd", + "bom-ref": "f1d33544dc352c19", "name": "/usr/include/x86_64-linux-gnu/bits/termios-baud.h", "type": "file" }, { - "bom-ref": "f65dab836ac3cd58", + "bom-ref": "4f489a446303f044", "name": "/usr/include/x86_64-linux-gnu/bits/termios-c_cc.h", "type": "file" }, { - "bom-ref": "dd026bf6967a0d66", + "bom-ref": "bade1ff499e22586", "name": "/usr/include/x86_64-linux-gnu/bits/termios-c_cflag.h", "type": "file" }, { - "bom-ref": "ad893139f3183730", + "bom-ref": "192eb53292834a00", "name": "/usr/include/x86_64-linux-gnu/bits/termios-c_iflag.h", "type": "file" }, { - "bom-ref": "89b8187bcbebe922", + "bom-ref": "0ce80b5d85cdee82", "name": "/usr/include/x86_64-linux-gnu/bits/termios-c_lflag.h", "type": "file" }, { - "bom-ref": "c1562087ab29afde", + "bom-ref": "49faede3866a86f6", "name": "/usr/include/x86_64-linux-gnu/bits/termios-c_oflag.h", "type": "file" }, { - "bom-ref": "d78a2160df383cf3", + "bom-ref": "40e906c6498df0eb", "name": "/usr/include/x86_64-linux-gnu/bits/termios-misc.h", "type": "file" }, { - "bom-ref": "2aa7b1a9e1584ae6", + "bom-ref": "315c867a1f81ca6a", "name": "/usr/include/x86_64-linux-gnu/bits/termios-struct.h", "type": "file" }, { - "bom-ref": "a32698084b5ff35c", + "bom-ref": "c8406393b0c542fc", "name": "/usr/include/x86_64-linux-gnu/bits/termios-tcflow.h", "type": "file" }, { - "bom-ref": "dd08eb86fa332897", + "bom-ref": "1198ea2fd0c9810b", "name": "/usr/include/x86_64-linux-gnu/bits/termios.h", "type": "file" }, { - "bom-ref": "b1c64e1d53a618b6", + "bom-ref": "1e217694c0e9b3ee", "name": "/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h", "type": "file" }, { - "bom-ref": "9460bb3c688df562", + "bom-ref": "13ecac3fec136016", "name": "/usr/include/x86_64-linux-gnu/bits/time.h", "type": "file" }, { - "bom-ref": "9d4468cb72591653", + "bom-ref": "c5854a8802e30bbf", "name": "/usr/include/x86_64-linux-gnu/bits/time64.h", "type": "file" }, { - "bom-ref": "68f39185fa8ed59b", + "bom-ref": "4c8b998000bb5043", "name": "/usr/include/x86_64-linux-gnu/bits/timerfd.h", "type": "file" }, { - "bom-ref": "b43bd7628846c010", + "bom-ref": "3f59c10848c67944", "name": "/usr/include/x86_64-linux-gnu/bits/timesize.h", "type": "file" }, { - "bom-ref": "df163ef8d3088f0f", + "bom-ref": "44f89d8c4682bbdb", "name": "/usr/include/x86_64-linux-gnu/bits/timex.h", "type": "file" }, { - "bom-ref": "bdf7ec74997bea9c", + "bom-ref": "a7e72883df4e2a58", "name": "/usr/include/x86_64-linux-gnu/bits/types.h", "type": "file" }, { - "bom-ref": "f0d74603505b359b", + "bom-ref": "40aa0b5b20ccfc9b", "name": "/usr/include/x86_64-linux-gnu/bits/types/FILE.h", "type": "file" }, { - "bom-ref": "3b475aaf8b8cf35e", + "bom-ref": "f5f0ceb693e81746", "name": "/usr/include/x86_64-linux-gnu/bits/types/__FILE.h", "type": "file" }, { - "bom-ref": "6af07cd936c08fe8", + "bom-ref": "5ac73aad42e1d4f4", "name": "/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h", "type": "file" }, { - "bom-ref": "d1aef42d446b51da", + "bom-ref": "31a03df69d4cc63e", "name": "/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h", "type": "file" }, { - "bom-ref": "06f4cea6c9d07b32", + "bom-ref": "e18cee1a9d413cca", "name": "/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h", "type": "file" }, { - "bom-ref": "02e1f5575c50f1b9", + "bom-ref": "d8662724ed2485a9", "name": "/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h", "type": "file" }, { - "bom-ref": "beccf2e8e34d7fcf", + "bom-ref": "c8f9d18b726168bb", "name": "/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h", "type": "file" }, { - "bom-ref": "816fd452a851958b", + "bom-ref": "2917c8b50c9ed3df", "name": "/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h", "type": "file" }, { - "bom-ref": "d94ba39f201a8e42", + "bom-ref": "7e3aa345f507703a", "name": "/usr/include/x86_64-linux-gnu/bits/types/clock_t.h", "type": "file" }, { - "bom-ref": "e14d8a1f6ee48c6d", + "bom-ref": "38c59fc62cc665ed", "name": "/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h", "type": "file" }, { - "bom-ref": "7ff1cec06151cdac", + "bom-ref": "da1bbbea02f56f10", "name": "/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h", "type": "file" }, { - "bom-ref": "b91bdd064983df2c", + "bom-ref": "adb6a2bd9f77c330", "name": "/usr/include/x86_64-linux-gnu/bits/types/error_t.h", "type": "file" }, { - "bom-ref": "c98dec7f82153008", + "bom-ref": "14e3a2f81128e234", "name": "/usr/include/x86_64-linux-gnu/bits/types/idtype_t.h", "type": "file" }, { - "bom-ref": "ab11c698e9dc1aa9", + "bom-ref": "bf0fd6f6d1c9cad1", "name": "/usr/include/x86_64-linux-gnu/bits/types/locale_t.h", "type": "file" }, { - "bom-ref": "2e9a121b3bfe7920", + "bom-ref": "d547f8a8fe3739c0", "name": "/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h", "type": "file" }, { - "bom-ref": "421d45778c729984", + "bom-ref": "3bd3598bacfafa10", "name": "/usr/include/x86_64-linux-gnu/bits/types/res_state.h", "type": "file" }, { - "bom-ref": "b7541b1105152108", + "bom-ref": "33a5b2337ff18958", "name": "/usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h", "type": "file" }, { - "bom-ref": "622f4e1187968ce5", + "bom-ref": "3d9fbba676e78c1d", "name": "/usr/include/x86_64-linux-gnu/bits/types/sigevent_t.h", "type": "file" }, { - "bom-ref": "093890dd53aaadbd", + "bom-ref": "6671acc97472d655", "name": "/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h", "type": "file" }, { - "bom-ref": "17a9bf2ebdcd435f", + "bom-ref": "83fea763cd62344f", "name": "/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h", "type": "file" }, { - "bom-ref": "a26b6407ec4310a0", + "bom-ref": "e52fbfcfb89328d0", "name": "/usr/include/x86_64-linux-gnu/bits/types/sigval_t.h", "type": "file" }, { - "bom-ref": "fd5894e1547c0c32", + "bom-ref": "96712208c9d8803a", "name": "/usr/include/x86_64-linux-gnu/bits/types/stack_t.h", "type": "file" }, { - "bom-ref": "0def03abfa5c1a68", + "bom-ref": "244a6336d973e65c", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h", "type": "file" }, { - "bom-ref": "063eb225533ad578", + "bom-ref": "796d463e215d8320", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct___jmp_buf_tag.h", "type": "file" }, { - "bom-ref": "bdc7ccf11bc5c1c7", + "bom-ref": "b5aeab97c4db487b", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h", "type": "file" }, { - "bom-ref": "e97a5b7f7c99c68c", + "bom-ref": "ef8220bc8374ab00", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h", "type": "file" }, { - "bom-ref": "cb36de62ed29630e", + "bom-ref": "5458f9022f0fd40e", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_msqid64_ds.h", "type": "file" }, { - "bom-ref": "a328250d22b526b7", + "bom-ref": "edd42544103a1d7b", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_msqid64_ds_helper.h", "type": "file" }, { - "bom-ref": "e895b39ee042a56e", + "bom-ref": "6162cebd04a8e33e", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_msqid_ds.h", "type": "file" }, { - "bom-ref": "902b6a129b679fdd", + "bom-ref": "a92f6ebf5135521d", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h", "type": "file" }, { - "bom-ref": "ff0483386a968a51", + "bom-ref": "36c544b5dc654eb1", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h", "type": "file" }, { - "bom-ref": "bc69436208466140", + "bom-ref": "a0f72f4baa7918d0", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h", "type": "file" }, { - "bom-ref": "baa62d99b6ba7522", + "bom-ref": "28c52df5b9895a42", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_semid64_ds.h", "type": "file" }, { - "bom-ref": "b5dbc76a419d8eeb", + "bom-ref": "d48e0051e2c11b8b", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_semid64_ds_helper.h", "type": "file" }, { - "bom-ref": "532bb9f90ecbf080", + "bom-ref": "4519d83c0fa81104", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_semid_ds.h", "type": "file" }, { - "bom-ref": "dacd73e5c3a7591c", + "bom-ref": "32174d9e8e254cd8", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_shmid64_ds.h", "type": "file" }, { - "bom-ref": "ac0a9bbe1179aa8b", + "bom-ref": "fc8d145e2ea83cfb", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_shmid64_ds_helper.h", "type": "file" }, { - "bom-ref": "cd7400cc61770dc2", + "bom-ref": "787afe385f8892a2", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_shmid_ds.h", "type": "file" }, { - "bom-ref": "3ed4803aa9d9ae99", + "bom-ref": "e9a59ae7ab7637b1", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_sigstack.h", "type": "file" }, { - "bom-ref": "44c3f618e00e1e5a", + "bom-ref": "76208b5e35a6e8ba", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_statx.h", "type": "file" }, { - "bom-ref": "a04e75d0da0d7f4d", + "bom-ref": "49a73dd0fd9abf9d", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_statx_timestamp.h", "type": "file" }, { - "bom-ref": "99e256dcda14b104", + "bom-ref": "811f9664ba25ba24", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_timeb.h", "type": "file" }, { - "bom-ref": "0a984f761cf15ba1", + "bom-ref": "3218b47be61aa3d1", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h", "type": "file" }, { - "bom-ref": "62f81d2ca3ca35a8", + "bom-ref": "4e325f8bc555b344", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h", "type": "file" }, { - "bom-ref": "27fcf30f786bf24d", + "bom-ref": "9198329bac645e51", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h", "type": "file" }, { - "bom-ref": "2b294bb7dec5e8ff", + "bom-ref": "b9a8f7faba1b0807", "name": "/usr/include/x86_64-linux-gnu/bits/types/time_t.h", "type": "file" }, { - "bom-ref": "e9c0d103a07260a2", + "bom-ref": "00319a2197ad373e", "name": "/usr/include/x86_64-linux-gnu/bits/types/timer_t.h", "type": "file" }, { - "bom-ref": "ef950c97fc021dc7", + "bom-ref": "f65efba99f0e1b5f", "name": "/usr/include/x86_64-linux-gnu/bits/types/wint_t.h", "type": "file" }, { - "bom-ref": "cd5cb3fce247ad29", + "bom-ref": "ee63324ce53d1d09", "name": "/usr/include/x86_64-linux-gnu/bits/typesizes.h", "type": "file" }, { - "bom-ref": "858512f58e7aba43", + "bom-ref": "4bef2381097a9013", "name": "/usr/include/x86_64-linux-gnu/bits/uintn-identity.h", "type": "file" }, { - "bom-ref": "db21f44a41d0ca77", + "bom-ref": "82af627eaec8ae87", "name": "/usr/include/x86_64-linux-gnu/bits/uio-ext.h", "type": "file" }, { - "bom-ref": "5a51d17e82eee691", + "bom-ref": "a6b1ef5205ed2421", "name": "/usr/include/x86_64-linux-gnu/bits/uio_lim.h", "type": "file" }, { - "bom-ref": "1e728bb1e35bb223", + "bom-ref": "aac017ad9a6b3bf3", "name": "/usr/include/x86_64-linux-gnu/bits/unistd-decl.h", "type": "file" }, { - "bom-ref": "8c99731fbbabed30", + "bom-ref": "0277e14771925b10", "name": "/usr/include/x86_64-linux-gnu/bits/unistd.h", "type": "file" }, { - "bom-ref": "9a5cb3e96217529a", + "bom-ref": "19f93b99dcbbfdf2", "name": "/usr/include/x86_64-linux-gnu/bits/unistd_ext.h", "type": "file" }, { - "bom-ref": "43bc4010faa59ce6", + "bom-ref": "74a8f52cbe77816a", "name": "/usr/include/x86_64-linux-gnu/bits/utmp.h", "type": "file" }, { - "bom-ref": "cca0d1f021e5e261", + "bom-ref": "3dd1509fc8d066bd", "name": "/usr/include/x86_64-linux-gnu/bits/utmpx.h", "type": "file" }, { - "bom-ref": "d74e9fcbf7154957", + "bom-ref": "ea2d39cfe59d04b3", "name": "/usr/include/x86_64-linux-gnu/bits/utsname.h", "type": "file" }, { - "bom-ref": "d9f73027ddcedc84", + "bom-ref": "2dd589a1e2e9dcac", "name": "/usr/include/x86_64-linux-gnu/bits/waitflags.h", "type": "file" }, { - "bom-ref": "b0b125796a8cd626", + "bom-ref": "2ee949d764db9f02", "name": "/usr/include/x86_64-linux-gnu/bits/waitstatus.h", "type": "file" }, { - "bom-ref": "716879c8bfbd10d5", + "bom-ref": "070bd774d47e90a5", "name": "/usr/include/x86_64-linux-gnu/bits/wchar-ldbl.h", "type": "file" }, { - "bom-ref": "da64d8cf869a75d3", + "bom-ref": "ff94893cec48576b", "name": "/usr/include/x86_64-linux-gnu/bits/wchar.h", "type": "file" }, { - "bom-ref": "eefa1b814899bdb8", + "bom-ref": "8e3a691f77beb408", "name": "/usr/include/x86_64-linux-gnu/bits/wchar2-decl.h", "type": "file" }, { - "bom-ref": "fd482853743d7a82", + "bom-ref": "6a8e0bca3bc904f6", "name": "/usr/include/x86_64-linux-gnu/bits/wchar2.h", "type": "file" }, { - "bom-ref": "7cbac482c744b342", + "bom-ref": "6ad0780e84758e72", "name": "/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h", "type": "file" }, { - "bom-ref": "b0ca4b88e4515233", + "bom-ref": "d9528d36e0af4bfb", "name": "/usr/include/x86_64-linux-gnu/bits/wordsize.h", "type": "file" }, { - "bom-ref": "0a0b2614838f9456", + "bom-ref": "4b4f17d67c5d6262", "name": "/usr/include/x86_64-linux-gnu/bits/xopen_lim.h", "type": "file" }, { - "bom-ref": "5cf07f1ac3f41970", + "bom-ref": "640ba39eedfde120", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/atomic_word.h", "type": "file" }, { - "bom-ref": "57c7554ede594cf2", + "bom-ref": "f8c9cdcfb6cc060a", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/basic_file.h", "type": "file" }, { - "bom-ref": "a01861e2ac7ebae0", + "bom-ref": "12390fb06c345eb8", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/c++allocator.h", "type": "file" }, { - "bom-ref": "e8e0b5a244aad667", + "bom-ref": "886f3f4cf10f15e3", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/c++config.h", "type": "file" }, { - "bom-ref": "bdec731ce1fd6f3b", + "bom-ref": "215a61e06d69f6cb", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/c++io.h", "type": "file" }, { - "bom-ref": "f53614e529412eb8", + "bom-ref": "975e5735ad216c1c", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/c++locale.h", "type": "file" }, { - "bom-ref": "2fc5a220fb3d916b", + "bom-ref": "bc3afa3983cccf5f", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/cpu_defines.h", "type": "file" }, { - "bom-ref": "87ec832f7ca079dc", + "bom-ref": "8be94eb1d5a25084", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/ctype_base.h", "type": "file" }, { - "bom-ref": "cc14d26ee8a55def", + "bom-ref": "cc67acb50bf5c75f", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/ctype_inline.h", "type": "file" }, { - "bom-ref": "b2df4ea48f6b0b82", + "bom-ref": "c4740cd25adc93a6", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/cxxabi_tweaks.h", "type": "file" }, { - "bom-ref": "ffb9bce27425cc4f", + "bom-ref": "9b2a9b3d38dbb78b", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/error_constants.h", "type": "file" }, { - "bom-ref": "992a6bf4cacafc48", + "bom-ref": "1edf1e94e3ee85ec", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/extc++.h", "type": "file" }, { - "bom-ref": "a67c609547b0f3a5", + "bom-ref": "ff215771758e2711", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/gthr-default.h", "type": "file" }, { - "bom-ref": "322b37f31243bbff", + "bom-ref": "8fd0cad9e8dc5cfb", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/gthr-posix.h", "type": "file" }, { - "bom-ref": "467190de7f23ffdc", + "bom-ref": "eeccc5e112a40b78", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/gthr-single.h", "type": "file" }, { - "bom-ref": "d0e0a65ae73b3781", + "bom-ref": "7fd2b6649f6749a1", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/gthr.h", "type": "file" }, { - "bom-ref": "92cf636dffc0260b", + "bom-ref": "58f927ace835d97b", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/messages_members.h", "type": "file" }, { - "bom-ref": "d330577097ee108e", + "bom-ref": "73b3dd47672d60da", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/opt_random.h", "type": "file" }, { - "bom-ref": "c01dddd4662a9cab", + "bom-ref": "1dd7d053a18a7dc7", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/os_defines.h", "type": "file" }, { - "bom-ref": "acdc3181d32c3944", + "bom-ref": "8175bcdcd6cc1490", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h", "type": "file" }, { - "bom-ref": "9935a9ec0694bd76", + "bom-ref": "5fef84cf438a7602", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/stdtr1c++.h", "type": "file" }, { - "bom-ref": "d60c345d0ec3a933", + "bom-ref": "1b940716186676db", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/time_members.h", "type": "file" }, { - "bom-ref": "8113ceff5a450cef", + "bom-ref": "2c7237176f2d516b", "name": "/usr/include/x86_64-linux-gnu/c++/13/ext/opt_random.h", "type": "file" }, { - "bom-ref": "07b16e8689820d5d", + "bom-ref": "83ef2f7c8834cdbd", "name": "/usr/include/x86_64-linux-gnu/expat_config.h", "type": "file" }, { - "bom-ref": "7f9edbf892120820", + "bom-ref": "e00c2f88560a9160", "name": "/usr/include/x86_64-linux-gnu/fpu_control.h", "type": "file" }, { - "bom-ref": "b273e6071d34b775", + "bom-ref": "c7c25e8ef63d18ed", "name": "/usr/include/x86_64-linux-gnu/gnu/lib-names-64.h", "type": "file" }, { - "bom-ref": "826890dac7998ea3", + "bom-ref": "92692c34b979ab9f", "name": "/usr/include/x86_64-linux-gnu/gnu/lib-names.h", "type": "file" }, { - "bom-ref": "53abd7e55cfd6ce4", + "bom-ref": "072525bf32ea99c4", "name": "/usr/include/x86_64-linux-gnu/gnu/libc-version.h", "type": "file" }, { - "bom-ref": "74f5114f6db13e39", + "bom-ref": "dd558899fc0ae379", "name": "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h", "type": "file" }, { - "bom-ref": "98025398cb6403d1", + "bom-ref": "43681a3fb3d724b9", "name": "/usr/include/x86_64-linux-gnu/gnu/stubs.h", "type": "file" }, { - "bom-ref": "adcedb67198a2ef8", + "bom-ref": "77594c84b39d76cc", "name": "/usr/include/x86_64-linux-gnu/ieee754.h", "type": "file" }, { - "bom-ref": "f67373b9833f2eab", + "bom-ref": "e85746fcdcd99977", "name": "/usr/include/x86_64-linux-gnu/python3.12/pyconfig.h", "type": "file" }, { - "bom-ref": "2bdb4138a7a7f79b", + "bom-ref": "1c3c57be23c2d8df", "name": "/usr/include/x86_64-linux-gnu/sys/acct.h", "type": "file" }, { - "bom-ref": "798c33a3374d223a", + "bom-ref": "b54dcbcdfcdbe6f2", "name": "/usr/include/x86_64-linux-gnu/sys/auxv.h", "type": "file" }, { - "bom-ref": "9ff93becfcc4ddd9", + "bom-ref": "1ccb602b133a8a61", "name": "/usr/include/x86_64-linux-gnu/sys/bitypes.h", "type": "file" }, { - "bom-ref": "3185ed938358889c", + "bom-ref": "ee5506f9794c781c", "name": "/usr/include/x86_64-linux-gnu/sys/cdefs.h", "type": "file" }, { - "bom-ref": "8698c169dfb55629", + "bom-ref": "33c72f6a87571f31", "name": "/usr/include/x86_64-linux-gnu/sys/debugreg.h", "type": "file" }, { - "bom-ref": "4bb41657b1b4a1c0", + "bom-ref": "c92c58e33beac74c", "name": "/usr/include/x86_64-linux-gnu/sys/dir.h", "type": "file" }, { - "bom-ref": "3c89daacb5b82692", + "bom-ref": "195d3325e681241e", "name": "/usr/include/x86_64-linux-gnu/sys/elf.h", "type": "file" }, { - "bom-ref": "2805e08a730bbed6", + "bom-ref": "27162931b6ce282a", "name": "/usr/include/x86_64-linux-gnu/sys/epoll.h", "type": "file" }, { - "bom-ref": "34e72e56bb6f8950", + "bom-ref": "b5067e2f23a037c8", "name": "/usr/include/x86_64-linux-gnu/sys/errno.h", "type": "file" }, { - "bom-ref": "b02b9823748cbd6a", + "bom-ref": "538cc1f1efb67fce", "name": "/usr/include/x86_64-linux-gnu/sys/eventfd.h", "type": "file" }, { - "bom-ref": "d1ebf4eccbfbb281", + "bom-ref": "587b387dd517594d", "name": "/usr/include/x86_64-linux-gnu/sys/fanotify.h", "type": "file" }, { - "bom-ref": "c4d49956d1167c4d", + "bom-ref": "79053cf7d89e3b75", "name": "/usr/include/x86_64-linux-gnu/sys/fcntl.h", "type": "file" }, { - "bom-ref": "280166db002786e9", + "bom-ref": "cae86cb387fc4db9", "name": "/usr/include/x86_64-linux-gnu/sys/file.h", "type": "file" }, { - "bom-ref": "0b6d3955a7ff61b4", + "bom-ref": "13cd821d8fa52664", "name": "/usr/include/x86_64-linux-gnu/sys/fsuid.h", "type": "file" }, { - "bom-ref": "5139c5fabb4ae228", + "bom-ref": "22d4b4e8fa7d681c", "name": "/usr/include/x86_64-linux-gnu/sys/gmon.h", "type": "file" }, { - "bom-ref": "719f93b29c03eb56", + "bom-ref": "a6d2dc1845ac479e", "name": "/usr/include/x86_64-linux-gnu/sys/gmon_out.h", "type": "file" }, { - "bom-ref": "53b37c5db81cdec8", + "bom-ref": "9fc93fecb8f25bcc", "name": "/usr/include/x86_64-linux-gnu/sys/inotify.h", "type": "file" }, { - "bom-ref": "a6148aaf7a352917", + "bom-ref": "dd9bd6f359249837", "name": "/usr/include/x86_64-linux-gnu/sys/io.h", "type": "file" }, { - "bom-ref": "b620925bfeac49d0", + "bom-ref": "fba2817e11da0df8", "name": "/usr/include/x86_64-linux-gnu/sys/ioctl.h", "type": "file" }, { - "bom-ref": "72d0beb4f782bd0b", + "bom-ref": "f0d63bd884d5ccaf", "name": "/usr/include/x86_64-linux-gnu/sys/ipc.h", "type": "file" }, { - "bom-ref": "deda4289d7d345a2", + "bom-ref": "92ddfbbdf23bf3d2", "name": "/usr/include/x86_64-linux-gnu/sys/kd.h", "type": "file" }, { - "bom-ref": "9c7315192525885a", + "bom-ref": "46d10d4151de328e", "name": "/usr/include/x86_64-linux-gnu/sys/klog.h", "type": "file" }, { - "bom-ref": "76aa0ca96a7b43b7", + "bom-ref": "c8d676a768e27e7b", "name": "/usr/include/x86_64-linux-gnu/sys/mman.h", "type": "file" }, { - "bom-ref": "e52b10f8263fdcb5", + "bom-ref": "73ba95c327846999", "name": "/usr/include/x86_64-linux-gnu/sys/mount.h", "type": "file" }, { - "bom-ref": "0b5328caebea9f9f", + "bom-ref": "18d538d407d3ed47", "name": "/usr/include/x86_64-linux-gnu/sys/msg.h", "type": "file" }, { - "bom-ref": "c4f2626bccc8fd26", + "bom-ref": "7f1e4d11082f8256", "name": "/usr/include/x86_64-linux-gnu/sys/mtio.h", "type": "file" }, { - "bom-ref": "842221a92ea1b53e", + "bom-ref": "bd17c5d4156fc9be", "name": "/usr/include/x86_64-linux-gnu/sys/param.h", "type": "file" }, { - "bom-ref": "b3ae73fdecf57760", + "bom-ref": "271f1aaf873f561c", "name": "/usr/include/x86_64-linux-gnu/sys/pci.h", "type": "file" }, { - "bom-ref": "0ddefd753d20717a", + "bom-ref": "1f4ec4bf184f049a", "name": "/usr/include/x86_64-linux-gnu/sys/perm.h", "type": "file" }, { - "bom-ref": "c86752f529aacffe", + "bom-ref": "01c3f1d9f92b65c2", "name": "/usr/include/x86_64-linux-gnu/sys/personality.h", "type": "file" }, { - "bom-ref": "4779cd222dae2f8e", + "bom-ref": "44d98c5bd8dda0b2", "name": "/usr/include/x86_64-linux-gnu/sys/pidfd.h", "type": "file" }, { - "bom-ref": "07cb655c83aac892", + "bom-ref": "9217b0d5c77b36e2", "name": "/usr/include/x86_64-linux-gnu/sys/platform/x86.h", "type": "file" }, { - "bom-ref": "def7c190451c98cb", + "bom-ref": "1cc346c0f146cdbf", "name": "/usr/include/x86_64-linux-gnu/sys/poll.h", "type": "file" }, { - "bom-ref": "9c64fc2b20071aea", + "bom-ref": "c84aee151f4e398e", "name": "/usr/include/x86_64-linux-gnu/sys/prctl.h", "type": "file" }, { - "bom-ref": "a3242384f34a4d12", + "bom-ref": "46e03dcebedb092a", "name": "/usr/include/x86_64-linux-gnu/sys/procfs.h", "type": "file" }, { - "bom-ref": "41fcd3ccb1174979", + "bom-ref": "e2f41db037bb1e89", "name": "/usr/include/x86_64-linux-gnu/sys/profil.h", "type": "file" }, { - "bom-ref": "9e5591cb42cc05cb", + "bom-ref": "2d423f58044366f7", "name": "/usr/include/x86_64-linux-gnu/sys/ptrace.h", "type": "file" }, { - "bom-ref": "03c34ab99ebf0f3e", + "bom-ref": "e523ebd207d1b2ba", "name": "/usr/include/x86_64-linux-gnu/sys/queue.h", "type": "file" }, { - "bom-ref": "9e4e4067d850474b", + "bom-ref": "e879a6dded0c6bd7", "name": "/usr/include/x86_64-linux-gnu/sys/quota.h", "type": "file" }, { - "bom-ref": "df7fbac528c53e90", + "bom-ref": "2375ff7e0f9554b4", "name": "/usr/include/x86_64-linux-gnu/sys/random.h", "type": "file" }, { - "bom-ref": "9e3af68b6bf9f32a", + "bom-ref": "a43af066bb278aca", "name": "/usr/include/x86_64-linux-gnu/sys/raw.h", "type": "file" }, { - "bom-ref": "c94ac893ecae1c05", + "bom-ref": "5c1394d22c9078f9", "name": "/usr/include/x86_64-linux-gnu/sys/reboot.h", "type": "file" }, { - "bom-ref": "815ff8c374b8c650", + "bom-ref": "4ef9407e12c6ea84", "name": "/usr/include/x86_64-linux-gnu/sys/reg.h", "type": "file" }, { - "bom-ref": "c73f3ac78aa6c6b1", + "bom-ref": "cd32e222fb2f5075", "name": "/usr/include/x86_64-linux-gnu/sys/resource.h", "type": "file" }, { - "bom-ref": "47bb67d40324aeaf", + "bom-ref": "6fac9365ec535abf", "name": "/usr/include/x86_64-linux-gnu/sys/rseq.h", "type": "file" }, { - "bom-ref": "cdeddd62b6f8f661", + "bom-ref": "d4531c487c882cf5", "name": "/usr/include/x86_64-linux-gnu/sys/select.h", "type": "file" }, { - "bom-ref": "4e9628620bcf54c3", + "bom-ref": "cb2798d7f925aa5f", "name": "/usr/include/x86_64-linux-gnu/sys/sem.h", "type": "file" }, { - "bom-ref": "b0965e9e419d81e8", + "bom-ref": "eed4b35ca7ca3ec0", "name": "/usr/include/x86_64-linux-gnu/sys/sendfile.h", "type": "file" }, { - "bom-ref": "56626cd629ec61dc", + "bom-ref": "b74cf306305f9b50", "name": "/usr/include/x86_64-linux-gnu/sys/shm.h", "type": "file" }, { - "bom-ref": "a83e4167f52dbd20", + "bom-ref": "c4dfbf40fd96c0dc", "name": "/usr/include/x86_64-linux-gnu/sys/signal.h", "type": "file" }, { - "bom-ref": "f586753bdf1e1407", + "bom-ref": "cab9e3abc5952297", "name": "/usr/include/x86_64-linux-gnu/sys/signalfd.h", "type": "file" }, { - "bom-ref": "b82fad26c1f55df6", + "bom-ref": "167708b37d721246", "name": "/usr/include/x86_64-linux-gnu/sys/single_threaded.h", "type": "file" }, { - "bom-ref": "fc23007912d84029", + "bom-ref": "364bdd2447033ce5", "name": "/usr/include/x86_64-linux-gnu/sys/socket.h", "type": "file" }, { - "bom-ref": "a7f04d284518442f", + "bom-ref": "8a7a786344a47477", "name": "/usr/include/x86_64-linux-gnu/sys/socketvar.h", "type": "file" }, { - "bom-ref": "e9ccf0ae7eebc345", + "bom-ref": "9a7b719edc320bbd", "name": "/usr/include/x86_64-linux-gnu/sys/soundcard.h", "type": "file" }, { - "bom-ref": "28921b56f1aab2a0", + "bom-ref": "213a5bd353f674e0", "name": "/usr/include/x86_64-linux-gnu/sys/stat.h", "type": "file" }, { - "bom-ref": "81c51938911d41b9", + "bom-ref": "0b45f7622c052569", "name": "/usr/include/x86_64-linux-gnu/sys/statfs.h", "type": "file" }, { - "bom-ref": "73cbe1699a10901c", + "bom-ref": "c7db3eed1e93be20", "name": "/usr/include/x86_64-linux-gnu/sys/statvfs.h", "type": "file" }, { - "bom-ref": "a78ec0911244eb75", + "bom-ref": "0b86159f0d98aefd", "name": "/usr/include/x86_64-linux-gnu/sys/swap.h", "type": "file" }, { - "bom-ref": "88119ec2b52835f7", + "bom-ref": "f5b9011363f842b7", "name": "/usr/include/x86_64-linux-gnu/sys/syscall.h", "type": "file" }, { - "bom-ref": "4a08c56851c7c418", + "bom-ref": "0d079ab05a5a9488", "name": "/usr/include/x86_64-linux-gnu/sys/sysinfo.h", "type": "file" }, { - "bom-ref": "2aa5b02a47844a96", + "bom-ref": "087a7563af21c64a", "name": "/usr/include/x86_64-linux-gnu/sys/syslog.h", "type": "file" }, { - "bom-ref": "5e6f8cc64456c378", + "bom-ref": "7f5cc4990b189bc8", "name": "/usr/include/x86_64-linux-gnu/sys/sysmacros.h", "type": "file" }, { - "bom-ref": "7a43fc9c21355449", + "bom-ref": "b9c02b450a4ee56d", "name": "/usr/include/x86_64-linux-gnu/sys/termios.h", "type": "file" }, { - "bom-ref": "398533a339c6c67a", + "bom-ref": "9a1dee9d0db63d6e", "name": "/usr/include/x86_64-linux-gnu/sys/time.h", "type": "file" }, { - "bom-ref": "37e6f582935ec39e", + "bom-ref": "46d83fa759af818e", "name": "/usr/include/x86_64-linux-gnu/sys/timeb.h", "type": "file" }, { - "bom-ref": "ab265cef43e764ac", + "bom-ref": "4de1b8f17e3bebc0", "name": "/usr/include/x86_64-linux-gnu/sys/timerfd.h", "type": "file" }, { - "bom-ref": "6d12a3a86028365f", + "bom-ref": "632b0917e6787d23", "name": "/usr/include/x86_64-linux-gnu/sys/times.h", "type": "file" }, { - "bom-ref": "28b9fd593ba0ca92", + "bom-ref": "8815dd251e2285d6", "name": "/usr/include/x86_64-linux-gnu/sys/timex.h", "type": "file" }, { - "bom-ref": "f7d0b0ff773c2af6", + "bom-ref": "7b290f32c7479e92", "name": "/usr/include/x86_64-linux-gnu/sys/ttychars.h", "type": "file" }, { - "bom-ref": "3549e863dc8be321", + "bom-ref": "2d8a8d9ef32c91c5", "name": "/usr/include/x86_64-linux-gnu/sys/ttydefaults.h", "type": "file" }, { - "bom-ref": "303a7b2cbefb7569", + "bom-ref": "3a94a24f0a39a861", "name": "/usr/include/x86_64-linux-gnu/sys/types.h", "type": "file" }, { - "bom-ref": "726d82b88eaf8796", + "bom-ref": "5c6787b06d259a8a", "name": "/usr/include/x86_64-linux-gnu/sys/ucontext.h", "type": "file" }, { - "bom-ref": "b137f436bdbbbd35", + "bom-ref": "c889bf1b94725c19", "name": "/usr/include/x86_64-linux-gnu/sys/uio.h", "type": "file" }, { - "bom-ref": "00b532d358f2c9d5", + "bom-ref": "9350a8cba170aa99", "name": "/usr/include/x86_64-linux-gnu/sys/un.h", "type": "file" }, { - "bom-ref": "88bc62c3da34698f", + "bom-ref": "2192151546a7911b", "name": "/usr/include/x86_64-linux-gnu/sys/unistd.h", "type": "file" }, { - "bom-ref": "c80abab5da585dc2", + "bom-ref": "ae6fbf97dc20c582", "name": "/usr/include/x86_64-linux-gnu/sys/user.h", "type": "file" }, { - "bom-ref": "2ff42081afd96a6e", + "bom-ref": "31bac7106c92cd2e", "name": "/usr/include/x86_64-linux-gnu/sys/utsname.h", "type": "file" }, { - "bom-ref": "e67398b37df1cf12", + "bom-ref": "fcf64e880c870a8a", "name": "/usr/include/x86_64-linux-gnu/sys/vfs.h", "type": "file" }, { - "bom-ref": "9488e28150eb3b59", + "bom-ref": "8e9ef56cf200eeb1", "name": "/usr/include/x86_64-linux-gnu/sys/vlimit.h", "type": "file" }, { - "bom-ref": "76a90c46ad5a8178", + "bom-ref": "88b12afc01a6cefc", "name": "/usr/include/x86_64-linux-gnu/sys/vm86.h", "type": "file" }, { - "bom-ref": "f7b016e3371bc036", + "bom-ref": "7bb9bb3f88940a5e", "name": "/usr/include/x86_64-linux-gnu/sys/vt.h", "type": "file" }, { - "bom-ref": "480594381ca36ca3", + "bom-ref": "8af05b6f4f3d336b", "name": "/usr/include/x86_64-linux-gnu/sys/wait.h", "type": "file" }, { - "bom-ref": "fd17c8ab6e667e9b", + "bom-ref": "7e13a13eefd2efef", "name": "/usr/include/x86_64-linux-gnu/sys/xattr.h", "type": "file" }, { - "bom-ref": "3bff5f3f5a687536", + "bom-ref": "43bdcf877760623e", "name": "/usr/include/xen/evtchn.h", "type": "file" }, { - "bom-ref": "b27d96b9eb1ef9cf", + "bom-ref": "56432ef1635dc923", "name": "/usr/include/xen/gntalloc.h", "type": "file" }, { - "bom-ref": "1dce5adbfad1e2fe", + "bom-ref": "17d54a2108d31fa2", "name": "/usr/include/xen/gntdev.h", "type": "file" }, { - "bom-ref": "65a457e8e294f503", + "bom-ref": "e4bfe878c0bf7303", "name": "/usr/include/xen/privcmd.h", "type": "file" }, { - "bom-ref": "da595c5f419a0cb2", + "bom-ref": "3d3142717fa40e36", "name": "/usr/include/zconf.h", "type": "file" }, { - "bom-ref": "860522a52abd8ffe", + "bom-ref": "82b3b1eb06a7baca", "name": "/usr/include/zlib.h", "type": "file" }, { - "bom-ref": "d39dcd912f7ef6b3", + "bom-ref": "292f4aaed2defea5", "name": "/usr/lib/apt/apt-helper", "type": "file" }, { - "bom-ref": "8d4c159a1bf0989d", + "bom-ref": "f9a0755a1fbf1197", "name": "/usr/lib/apt/apt.systemd.daily", "type": "file" }, { - "bom-ref": "73ea65a1d3a81191", + "bom-ref": "d991fd23eb4ff89f", "name": "/usr/lib/apt/methods/cdrom", "type": "file" }, { - "bom-ref": "993195126d561d41", + "bom-ref": "1093724a273f458b", "name": "/usr/lib/apt/methods/copy", "type": "file" }, { - "bom-ref": "8eefb8ffa248aa65", + "bom-ref": "c5148cc0894d13c7", "name": "/usr/lib/apt/methods/file", "type": "file" }, { - "bom-ref": "d9918e016a870700", + "bom-ref": "45769eab1e5642be", "name": "/usr/lib/apt/methods/ftp", "type": "file" }, { - "bom-ref": "11af583d4acff0a3", + "bom-ref": "eed17e82cf6638c1", "name": "/usr/lib/apt/methods/gpgv", "type": "file" }, { - "bom-ref": "4dcde7466ee7815b", + "bom-ref": "fc722ae4026b14ad", "name": "/usr/lib/apt/methods/http", "type": "file" }, { - "bom-ref": "80fe2d71f9beb35f", + "bom-ref": "c2c30c11a8a0c045", "name": "/usr/lib/apt/methods/mirror", "type": "file" }, { - "bom-ref": "1d35fcc1f8091c98", + "bom-ref": "9b44318617f5f452", "name": "/usr/lib/apt/methods/rred", "type": "file" }, { - "bom-ref": "2113e81a01b905fc", + "bom-ref": "95bb7cf7ff137c9a", "name": "/usr/lib/apt/methods/rsh", "type": "file" }, { - "bom-ref": "4e385a3fddf2bb61", + "bom-ref": "6a3189a5a92719eb", "name": "/usr/lib/apt/methods/store", "type": "file" }, { - "bom-ref": "876c24db2957d8d0", + "bom-ref": "482aeb519eca2d32", "name": "/usr/lib/apt/solvers/dump", "type": "file" }, { - "bom-ref": "c871ab2cee5450a1", + "bom-ref": "e44cd03d186f678d", "name": "/usr/lib/binfmt.d/python3.12.conf", "type": "file" }, { - "bom-ref": "78966a7506df27dc", + "bom-ref": "ecad9cfa16b2026b", + "name": "/usr/lib/dbus-1.0/dbus-daemon-launch-helper", + "type": "file" + }, + { + "bom-ref": "08c331961c2a1fc2", "name": "/usr/lib/dpkg/methods/apt/desc.apt", "type": "file" }, { - "bom-ref": "e0d9215f099dda51", + "bom-ref": "9b80d36317316e23", "name": "/usr/lib/dpkg/methods/apt/install", "type": "file" }, { - "bom-ref": "529f4af4a9bc9fc9", + "bom-ref": "988d421d2be2e743", "name": "/usr/lib/dpkg/methods/apt/names", "type": "file" }, { - "bom-ref": "4b3913f392d76130", + "bom-ref": "d6b3c8bc78335186", "name": "/usr/lib/dpkg/methods/apt/setup", "type": "file" }, { - "bom-ref": "8dc8bb8907b88edb", + "bom-ref": "39993c8550f7ba8d", "name": "/usr/lib/dpkg/methods/apt/update", "type": "file" }, { - "bom-ref": "3c7b47688e3cd511", + "bom-ref": "b73f6c4c15e4d1c1", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtbegin.o", "type": "file" }, { - "bom-ref": "4e14008373c57d25", + "bom-ref": "4dd85f2fdc9242f5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o", "type": "file" }, { - "bom-ref": "56d05b994b6aaec5", + "bom-ref": "2eca7320a2078469", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginT.o", "type": "file" }, { - "bom-ref": "3a173db96bc8aa7d", + "bom-ref": "d0f0879835d111ed", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtend.o", "type": "file" }, { - "bom-ref": "74e6731a07b13cbd", + "bom-ref": "03eb010a22efe4d5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o", "type": "file" }, { - "bom-ref": "6390b85fa69e88b0", + "bom-ref": "ed3308b0aada2cd4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtfastmath.o", "type": "file" }, { - "bom-ref": "91bb4b77c99d0b94", + "bom-ref": "7cb23ed17fe9650c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadbegin.o", "type": "file" }, { - "bom-ref": "fc23368146610fc6", + "bom-ref": "4c3914c633dd6e5e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadend.o", "type": "file" }, { - "bom-ref": "1ab426b488da6828", + "bom-ref": "adc69fc268076f7c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadtable.o", "type": "file" }, { - "bom-ref": "01872772eb3f47e7", + "bom-ref": "4b8f6b688f9fd0d7", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtprec32.o", "type": "file" }, { - "bom-ref": "2a0b096d998d3053", + "bom-ref": "fddba326c6e12557", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtprec64.o", "type": "file" }, { - "bom-ref": "f8a48fc0a459835b", + "bom-ref": "c4580a4affcb4f87", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtprec80.o", "type": "file" }, { - "bom-ref": "93f26040d4b8db03", + "bom-ref": "39d72c681bfecf87", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/acc_prof.h", "type": "file" }, { - "bom-ref": "86968aa7f32a2a6e", + "bom-ref": "ae6b2547df1d6d16", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/adxintrin.h", "type": "file" }, { - "bom-ref": "83e9b006b8c577f4", + "bom-ref": "75afff65a9d6de0c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/ammintrin.h", "type": "file" }, { - "bom-ref": "3d8f3bad51062a5e", + "bom-ref": "d4f9453cfd2ffec2", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/amxbf16intrin.h", "type": "file" }, { - "bom-ref": "aaf9c108bcde17d2", + "bom-ref": "9f2ac9d40ae8d48e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/amxcomplexintrin.h", "type": "file" }, { - "bom-ref": "7079eb49efd43a2e", + "bom-ref": "9b6b71f623b58f7e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/amxfp16intrin.h", "type": "file" }, { - "bom-ref": "114c2af4d2464292", + "bom-ref": "f65a6d583c2dcafe", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/amxint8intrin.h", "type": "file" }, { - "bom-ref": "2eccd6d4a647730c", + "bom-ref": "fb829c133b941fa4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/amxtileintrin.h", "type": "file" }, { - "bom-ref": "f7dc6e0fa0868159", + "bom-ref": "da577500caa32095", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx2intrin.h", "type": "file" }, { - "bom-ref": "291e7dcd3e3242f3", + "bom-ref": "d94ea8dc6e569523", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx5124fmapsintrin.h", "type": "file" }, { - "bom-ref": "61d139ca301d5807", + "bom-ref": "2d796e25d74e5f9f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx5124vnniwintrin.h", "type": "file" }, { - "bom-ref": "7f4377cb0b45fe50", + "bom-ref": "0ad27e6e35a55e60", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512bf16intrin.h", "type": "file" }, { - "bom-ref": "a01730cbcfbbff99", + "bom-ref": "f77d0c98dd9a0cbd", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512bf16vlintrin.h", "type": "file" }, { - "bom-ref": "7298e14a68b706a7", + "bom-ref": "f9995bc0bc34a2b3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512bitalgintrin.h", "type": "file" }, { - "bom-ref": "c38aaec9585afe1b", + "bom-ref": "81f8234e41d3c873", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512bwintrin.h", "type": "file" }, { - "bom-ref": "c96690fe19f80aa8", + "bom-ref": "ab802227083d8428", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512cdintrin.h", "type": "file" }, { - "bom-ref": "7116bc495c848de5", + "bom-ref": "11ffc402945c1391", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512dqintrin.h", "type": "file" }, { - "bom-ref": "d1eceb72bcd76613", + "bom-ref": "a5ef9fc750aa3dc3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512erintrin.h", "type": "file" }, { - "bom-ref": "34a355ab0469690e", + "bom-ref": "e4c40abccd067852", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512fintrin.h", "type": "file" }, { - "bom-ref": "496b7ddbaba9b0a2", + "bom-ref": "23a93e061422392a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512fp16intrin.h", "type": "file" }, { - "bom-ref": "4f4046852f601df9", + "bom-ref": "00c4019e1a07cf01", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512fp16vlintrin.h", "type": "file" }, { - "bom-ref": "a25d1e6afe5fa993", + "bom-ref": "32b8f07c813e1c77", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512ifmaintrin.h", "type": "file" }, { - "bom-ref": "c2bd515070adce8f", + "bom-ref": "8ca86d264e2a3363", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512ifmavlintrin.h", "type": "file" }, { - "bom-ref": "9f1cd7fc61b68a3c", + "bom-ref": "49c803b3372855b4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512pfintrin.h", "type": "file" }, { - "bom-ref": "b788ab14292b33fe", + "bom-ref": "635bf7c22239e9a6", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vbmi2intrin.h", "type": "file" }, { - "bom-ref": "9fb422826b8b7eb3", + "bom-ref": "9c08a4e2c9b40163", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vbmi2vlintrin.h", "type": "file" }, { - "bom-ref": "e20002a32e9710a1", + "bom-ref": "624ef23850046291", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vbmiintrin.h", "type": "file" }, { - "bom-ref": "e427096dc99d6498", + "bom-ref": "f4e6089ae7cba75c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vbmivlintrin.h", "type": "file" }, { - "bom-ref": "73613900bf77c63a", + "bom-ref": "5c476e0eec71aeda", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vlbwintrin.h", "type": "file" }, { - "bom-ref": "021bed7d22a55278", + "bom-ref": "bffb563cd6d8cb6c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vldqintrin.h", "type": "file" }, { - "bom-ref": "cf97359d036bbd09", + "bom-ref": "8ce48ca166c405e9", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vlintrin.h", "type": "file" }, { - "bom-ref": "87793fe45afd6e19", + "bom-ref": "1965f80bcc1b9b59", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vnniintrin.h", "type": "file" }, { - "bom-ref": "d3584cefe101c03a", + "bom-ref": "c561529ffd2fe42a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vnnivlintrin.h", "type": "file" }, { - "bom-ref": "b5bbdc23ca9e0a30", + "bom-ref": "9cba2e0cfc19f738", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vp2intersectintrin.h", "type": "file" }, { - "bom-ref": "b98aa55d2829be68", + "bom-ref": "ffd5d72f9817bb98", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vp2intersectvlintrin.h", "type": "file" }, { - "bom-ref": "10b56498cd42e318", + "bom-ref": "bf998c48a8d2f558", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vpopcntdqintrin.h", "type": "file" }, { - "bom-ref": "2cf11344cddc2117", + "bom-ref": "2629a9eefe778fe3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vpopcntdqvlintrin.h", "type": "file" }, { - "bom-ref": "33cb177b250c8635", + "bom-ref": "312fe8c080abb9d1", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avxifmaintrin.h", "type": "file" }, { - "bom-ref": "c23062c36d6a77d4", + "bom-ref": "5fae8aaa43ab90dc", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avxintrin.h", "type": "file" }, { - "bom-ref": "a709c004433174cf", + "bom-ref": "6f5be2584138dd8f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avxneconvertintrin.h", "type": "file" }, { - "bom-ref": "84ad81203783a1d0", + "bom-ref": "0c894fd9d36e0120", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avxvnniint8intrin.h", "type": "file" }, { - "bom-ref": "aaf687f1fd480ed3", + "bom-ref": "d21037597efc8d8b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avxvnniintrin.h", "type": "file" }, { - "bom-ref": "952475649e3b9240", + "bom-ref": "f9330de0807b2b18", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/backtrace-supported.h", "type": "file" }, { - "bom-ref": "d70216c0f5e02282", + "bom-ref": "51d1f2ef2f1fa632", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/backtrace.h", "type": "file" }, { - "bom-ref": "552d2f5d6f01fe1e", + "bom-ref": "76641751c86e2526", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/bmi2intrin.h", "type": "file" }, { - "bom-ref": "3f295acdc4b978c3", + "bom-ref": "a24910fe9fd8774b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/bmiintrin.h", "type": "file" }, { - "bom-ref": "0c5ae3dc533dbe5c", + "bom-ref": "aa2dd6803191b24c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/bmmintrin.h", "type": "file" }, { - "bom-ref": "41ba3003c0d711f2", + "bom-ref": "03cbcde5b7db008e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cet.h", "type": "file" }, { - "bom-ref": "d475365b369546b1", + "bom-ref": "29dd3fa103fa0965", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cetintrin.h", "type": "file" }, { - "bom-ref": "cb2f7f502e1a806f", + "bom-ref": "fbaf02fc8d849d37", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cldemoteintrin.h", "type": "file" }, { - "bom-ref": "1aa493cde184f592", + "bom-ref": "0d60ef6ce8607282", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/clflushoptintrin.h", "type": "file" }, { - "bom-ref": "bd6606c0641417c7", + "bom-ref": "a85c625cd0ba0673", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/clwbintrin.h", "type": "file" }, { - "bom-ref": "375eb40a8514275b", + "bom-ref": "0051322d87deead3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/clzerointrin.h", "type": "file" }, { - "bom-ref": "c493efd1c194458f", + "bom-ref": "e3798237b4f5cc4b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cmpccxaddintrin.h", "type": "file" }, { - "bom-ref": "6d08436091201c5c", + "bom-ref": "28c9bf7635a9c204", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cpuid.h", "type": "file" }, { - "bom-ref": "590a27f5e2724bfc", + "bom-ref": "7a295940f17f6000", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cross-stdarg.h", "type": "file" }, { - "bom-ref": "6c34aba1b45554dc", + "bom-ref": "bd717176b5dc3b54", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/emmintrin.h", "type": "file" }, { - "bom-ref": "284286b77e8da1ff", + "bom-ref": "b1fe1d527d14e8ef", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/enqcmdintrin.h", "type": "file" }, { - "bom-ref": "b165dff73a2d0a80", + "bom-ref": "0ae55d69a65782b4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/f16cintrin.h", "type": "file" }, { - "bom-ref": "7b7d6bd5d2e8d813", + "bom-ref": "cfdf4e24fccb1da7", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/float.h", "type": "file" }, { - "bom-ref": "1230c3984e80ce43", + "bom-ref": "5e9691e1ef06f3e3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/fma4intrin.h", "type": "file" }, { - "bom-ref": "6ca3882bc429d277", + "bom-ref": "085682c951d1d983", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/fmaintrin.h", "type": "file" }, { - "bom-ref": "48123f68ecbde16c", + "bom-ref": "eb942fceedb42f4c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/fxsrintrin.h", "type": "file" }, { - "bom-ref": "f70c33fad7047c13", + "bom-ref": "20b907cbe11b0f73", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/gcov.h", "type": "file" }, { - "bom-ref": "d5f987aa3d7a8501", + "bom-ref": "6f7f68465435ef95", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/gfniintrin.h", "type": "file" }, { - "bom-ref": "7eb5f7880b74b998", + "bom-ref": "61bf874a14e3d034", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/hresetintrin.h", "type": "file" }, { - "bom-ref": "7a0834060838395a", + "bom-ref": "e732163265c13e72", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/ia32intrin.h", "type": "file" }, { - "bom-ref": "9ed3726cea0a26aa", + "bom-ref": "5cc23288af1a9212", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/immintrin.h", "type": "file" }, { - "bom-ref": "c5b1a1447f9f3898", + "bom-ref": "6bd8b93155a35fd4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/iso646.h", "type": "file" }, { - "bom-ref": "d0916805cae87be4", + "bom-ref": "c7608fe015877de4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/keylockerintrin.h", "type": "file" }, { - "bom-ref": "c398f13322c89f8c", + "bom-ref": "5c9e21b5b3228f5c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/limits.h", "type": "file" }, { - "bom-ref": "2331655dc2322357", + "bom-ref": "814e102f0356a12f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/lwpintrin.h", "type": "file" }, { - "bom-ref": "474d1a95b9bfe6c0", + "bom-ref": "fd2c3366a5d6bfbc", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/lzcntintrin.h", "type": "file" }, { - "bom-ref": "a577431774d497c7", + "bom-ref": "7fc792995860ccc7", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/mm3dnow.h", "type": "file" }, { - "bom-ref": "12c26906a91b5fb0", + "bom-ref": "de10a0a3fd6f2624", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/mm_malloc.h", "type": "file" }, { - "bom-ref": "f00446d82c4095fa", + "bom-ref": "d3500addae06be12", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/mmintrin.h", "type": "file" }, { - "bom-ref": "f31cb7c79208abd0", + "bom-ref": "b939d84cad379a60", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/movdirintrin.h", "type": "file" }, { - "bom-ref": "d044bc4b3e35aab2", + "bom-ref": "e65441787e3ce7e2", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/mwaitintrin.h", "type": "file" }, { - "bom-ref": "e73ddab6892fd0f9", + "bom-ref": "728204a7648ea865", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/mwaitxintrin.h", "type": "file" }, { - "bom-ref": "9ee711e770545f02", + "bom-ref": "e42c3c967e348ba6", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/nmmintrin.h", "type": "file" }, { - "bom-ref": "bf59d45abccbeee0", + "bom-ref": "da2ceb3f300aed94", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/omp.h", "type": "file" }, { - "bom-ref": "030ebf40e688440b", + "bom-ref": "561aeceb516bb0a3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/openacc.h", "type": "file" }, { - "bom-ref": "a32c5426dba59f4d", + "bom-ref": "f4e197d2f0e98ae5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/pconfigintrin.h", "type": "file" }, { - "bom-ref": "b5bc0e93910ea5c0", + "bom-ref": "191cfeed639c33a4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/pkuintrin.h", "type": "file" }, { - "bom-ref": "5928527de554d270", + "bom-ref": "437b6391b021d108", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/pmmintrin.h", "type": "file" }, { - "bom-ref": "837e9105e0106003", + "bom-ref": "f282df7e497748bf", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/popcntintrin.h", "type": "file" }, { - "bom-ref": "f06db9788a654f11", + "bom-ref": "57dcd8abb1b29805", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/prfchiintrin.h", "type": "file" }, { - "bom-ref": "281ae17df1f6f08d", + "bom-ref": "1add80a7bc986bf9", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/prfchwintrin.h", "type": "file" }, { - "bom-ref": "11c4e9fee92cea02", + "bom-ref": "3c592c5b1de2b5d6", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/quadmath.h", "type": "file" }, { - "bom-ref": "5814e8fca1f3ebc6", + "bom-ref": "8567c1aee8134cce", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/quadmath_weak.h", "type": "file" }, { - "bom-ref": "05ff516e1226d978", + "bom-ref": "4bc0997c651e6bfc", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/raointintrin.h", "type": "file" }, { - "bom-ref": "2c985ace377dae29", + "bom-ref": "c33bfc66673ca089", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/rdseedintrin.h", "type": "file" }, { - "bom-ref": "52a7a49a6ace97b7", + "bom-ref": "9ca17d1182c1f25b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/rtmintrin.h", "type": "file" }, { - "bom-ref": "7025fbe5d824d008", + "bom-ref": "85c1722f4af73f5c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sanitizer/asan_interface.h", "type": "file" }, { - "bom-ref": "6c9923bbeedde1ef", + "bom-ref": "101b71cad6a6ec4b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sanitizer/common_interface_defs.h", "type": "file" }, { - "bom-ref": "1fe1a2ec60689d57", + "bom-ref": "b881e94f0fc66d33", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sanitizer/hwasan_interface.h", "type": "file" }, { - "bom-ref": "6b7a12b5796e8d42", + "bom-ref": "66b3b39f4211742e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sanitizer/lsan_interface.h", "type": "file" }, { - "bom-ref": "b4c928f9ee91e963", + "bom-ref": "1d0ec58a40790867", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sanitizer/tsan_interface.h", "type": "file" }, { - "bom-ref": "ebf471f99b5d5bef", + "bom-ref": "1499571809db43bf", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/serializeintrin.h", "type": "file" }, { - "bom-ref": "e2dc370ef4d0af3f", + "bom-ref": "74a7e77fd23d22e3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sgxintrin.h", "type": "file" }, { - "bom-ref": "70658eee907e60b5", + "bom-ref": "5ca109d66ea99d89", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/shaintrin.h", "type": "file" }, { - "bom-ref": "fd71127fad252aff", + "bom-ref": "20c888f801015d07", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/smmintrin.h", "type": "file" }, { - "bom-ref": "02ee996fc0b1a72d", + "bom-ref": "0b2cbe113d96cef5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdalign.h", "type": "file" }, { - "bom-ref": "03967c07125f8c22", + "bom-ref": "db8ff4ae2d2629fe", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdarg.h", "type": "file" }, { - "bom-ref": "b021eafd18b31265", + "bom-ref": "1bdc97b4cd03b735", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdatomic.h", "type": "file" }, { - "bom-ref": "e1b7d22a5a58434a", + "bom-ref": "f675bffb5c0e08be", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdbool.h", "type": "file" }, { - "bom-ref": "0220699d6742c41a", + "bom-ref": "4b4999d19a094506", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stddef.h", "type": "file" }, { - "bom-ref": "99459a51f2003c5e", + "bom-ref": "e08baba7f175208a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdfix.h", "type": "file" }, { - "bom-ref": "cf0365e2e01122c8", + "bom-ref": "69ff221bc7fcf220", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdint-gcc.h", "type": "file" }, { - "bom-ref": "d05c4457c31820d9", + "bom-ref": "d0e3e63088273f35", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdint.h", "type": "file" }, { - "bom-ref": "1cf18d585a4f3e95", + "bom-ref": "8e24f2317739f2ed", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdnoreturn.h", "type": "file" }, { - "bom-ref": "75c70c18ddf72c52", + "bom-ref": "3788b01e5a43999a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/syslimits.h", "type": "file" }, { - "bom-ref": "ba5a8c2e44296956", + "bom-ref": "2689437c1cb47756", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/tbmintrin.h", "type": "file" }, { - "bom-ref": "b23579ea6976874f", + "bom-ref": "6b79e818557fa013", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/tmmintrin.h", "type": "file" }, { - "bom-ref": "fa1964a37b6c08df", + "bom-ref": "31f337a94635effb", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/tsxldtrkintrin.h", "type": "file" }, { - "bom-ref": "5c930e449f304e9a", + "bom-ref": "775dac52d73a8f4e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/uintrintrin.h", "type": "file" }, { - "bom-ref": "0f8c7f63b89366c6", + "bom-ref": "4fa2763c7cbf26ee", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/unwind.h", "type": "file" }, { - "bom-ref": "4aa3750f9b27365d", + "bom-ref": "75d68802796223b5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/vaesintrin.h", "type": "file" }, { - "bom-ref": "19e1e7f4e49a68c3", + "bom-ref": "97709bf9f53d8043", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/varargs.h", "type": "file" }, { - "bom-ref": "af9e0316611218da", + "bom-ref": "5949c3ccc48a5652", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/vpclmulqdqintrin.h", "type": "file" }, { - "bom-ref": "f3af46c7b5f1036b", + "bom-ref": "41a32d4a0aecdc27", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/waitpkgintrin.h", "type": "file" }, { - "bom-ref": "b43f62e575cbf504", + "bom-ref": "f985a8883fb6d5d0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/wbnoinvdintrin.h", "type": "file" }, { - "bom-ref": "72183dd977d76b45", + "bom-ref": "03020f5ca1428f1d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/wmmintrin.h", "type": "file" }, { - "bom-ref": "f1f9f760dea45580", + "bom-ref": "22625b4c7ae0f3f0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/x86gprintrin.h", "type": "file" }, { - "bom-ref": "1eeba77a34fb1be4", + "bom-ref": "2d9c4f29a7cc707c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/x86intrin.h", "type": "file" }, { - "bom-ref": "4a45ea1df7503deb", + "bom-ref": "b6576e8738a2c51b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xmmintrin.h", "type": "file" }, { - "bom-ref": "feb7015e3aaaa594", + "bom-ref": "3086b83b038db9b0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xopintrin.h", "type": "file" }, { - "bom-ref": "ce0e9ce1ae2a8d3d", + "bom-ref": "f85bc07807591855", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xsavecintrin.h", "type": "file" }, { - "bom-ref": "552807039691115f", + "bom-ref": "dbe46cb9b4764aef", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xsaveintrin.h", "type": "file" }, { - "bom-ref": "20141da59aafbe94", + "bom-ref": "ba72523848b15680", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xsaveoptintrin.h", "type": "file" }, { - "bom-ref": "39584d7251087ab8", + "bom-ref": "f35337bb8cd7f63c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xsavesintrin.h", "type": "file" }, { - "bom-ref": "d614084f62f2832e", + "bom-ref": "e09cea343e08561e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xtestintrin.h", "type": "file" }, { - "bom-ref": "365dbb2f181fbaab", + "bom-ref": "c6f9a6840b13156b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libasan.a", "type": "file" }, { - "bom-ref": "de7e7d0eac0131fe", + "bom-ref": "4c9f3b9b3ea99c46", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libasan_preinit.o", "type": "file" }, { - "bom-ref": "9c9068d073e93035", + "bom-ref": "20986620001bd57d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libatomic.a", "type": "file" }, { - "bom-ref": "9aa6307f5bde06bf", + "bom-ref": "aeca96be66c80e5f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libbacktrace.a", "type": "file" }, { - "bom-ref": "0b879a27bab3c0b7", + "bom-ref": "cf102b69b5f872a3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgcc.a", "type": "file" }, { - "bom-ref": "7c7b772cce4cfafa", + "bom-ref": "b7c702ad8031e742", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgcc_eh.a", "type": "file" }, { - "bom-ref": "9865755cd77ff743", + "bom-ref": "af63553ddcc5f073", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgcc_s.so", "type": "file" }, { - "bom-ref": "3ac0d14a04921aa8", + "bom-ref": "c7bd63aad92bd8d0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgcov.a", "type": "file" }, { - "bom-ref": "17d87a06e8fe0a67", + "bom-ref": "35c18494760d0f7f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgomp.a", "type": "file" }, { - "bom-ref": "3e2b43f761090543", + "bom-ref": "073bceb1a196449b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgomp.spec", "type": "file" }, { - "bom-ref": "7a82123e7d81449d", + "bom-ref": "c8968a10d15520d9", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libhwasan.a", "type": "file" }, { - "bom-ref": "722763f0a8a16feb", + "bom-ref": "3006201b15815d7f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libhwasan_preinit.o", "type": "file" }, { - "bom-ref": "8f8360ae82a05d77", + "bom-ref": "f26a66b294c06ba3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libitm.a", "type": "file" }, { - "bom-ref": "8356d5a7ef9058f8", + "bom-ref": "7c341abe356a733c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libitm.spec", "type": "file" }, { - "bom-ref": "275162775028c00c", + "bom-ref": "e16ea6388343ac34", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/liblsan.a", "type": "file" }, { - "bom-ref": "dafa6a38efea2c22", + "bom-ref": "abc8b1fef157aef2", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/liblsan_preinit.o", "type": "file" }, { - "bom-ref": "29c2a3e343655b9c", + "bom-ref": "83845db647aae554", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libquadmath.a", "type": "file" }, { - "bom-ref": "0736ed243add526d", + "bom-ref": "a5d529b28bde6f61", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libsanitizer.spec", "type": "file" }, { - "bom-ref": "23da0cf72659a6d4", + "bom-ref": "19c67f4deccc7ae4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libssp_nonshared.a", "type": "file" }, { - "bom-ref": "db7a63f56d581ddf", + "bom-ref": "ab8a1d36667971b3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libstdc++.a", "type": "file" }, { - "bom-ref": "f32d50b122a88684", + "bom-ref": "f66fdd5995d4437c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libstdc++exp.a", "type": "file" }, { - "bom-ref": "16ccb5f835512d3b", + "bom-ref": "19afe8ad45670217", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libstdc++fs.a", "type": "file" }, { - "bom-ref": "3d9b3bccde6a921f", + "bom-ref": "63470d9c5403068f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libsupc++.a", "type": "file" }, { - "bom-ref": "e8fb05da6bf7bb68", + "bom-ref": "2eb0ab2a6316fba0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libtsan.a", "type": "file" }, { - "bom-ref": "eb7c06b7589feb5b", + "bom-ref": "f2bcfa1cc5eb317f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libtsan_preinit.o", "type": "file" }, { - "bom-ref": "8a372609e3157f25", + "bom-ref": "ae75ae346a0402cd", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libubsan.a", "type": "file" }, { - "bom-ref": "2aec9ddd618d57d5", + "bom-ref": "7590099b9ffa2341", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/plugin/libcc1plugin.so.0.0.0", "type": "file" }, { - "bom-ref": "cf6cbb427e3ffb18", + "bom-ref": "faeba4400253f84c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/plugin/libcp1plugin.so.0.0.0", "type": "file" }, { - "bom-ref": "c8b73e8279a40bc9", + "bom-ref": "3c11c62a9717b960", + "name": "/usr/lib/girepository-1.0/PackageKitGlib-1.0.typelib", + "type": "file" + }, + { + "bom-ref": "4496e6eb9fc5106d", "name": "/usr/lib/git-core/git", "type": "file" }, { - "bom-ref": "e9d557d2c0dde706", + "bom-ref": "4465291c15cac98a", "name": "/usr/lib/git-core/git-daemon", "type": "file" }, { - "bom-ref": "e404198af55cc885", + "bom-ref": "4ed4203139c036f5", "name": "/usr/lib/git-core/git-difftool--helper", "type": "file" }, { - "bom-ref": "e64787fb6e2cb018", + "bom-ref": "acf22ec9ccf33c28", "name": "/usr/lib/git-core/git-filter-branch", "type": "file" }, { - "bom-ref": "5beb97fa8afb2265", + "bom-ref": "253bcc2c68bd73dd", "name": "/usr/lib/git-core/git-http-backend", "type": "file" }, { - "bom-ref": "37f93e84b3f727d3", + "bom-ref": "165a319172619ce7", "name": "/usr/lib/git-core/git-http-fetch", "type": "file" }, { - "bom-ref": "703aca8d1a3c202c", + "bom-ref": "d7c7423f5ee34048", "name": "/usr/lib/git-core/git-http-push", "type": "file" }, { - "bom-ref": "5f584d20d218421f", + "bom-ref": "50d0e5b728d14c7b", "name": "/usr/lib/git-core/git-imap-send", "type": "file" }, { - "bom-ref": "1bd36f6124aa4b87", + "bom-ref": "d2ac33e508bfd40b", "name": "/usr/lib/git-core/git-instaweb", "type": "file" }, { - "bom-ref": "6dd9cfb214d46e61", + "bom-ref": "e100d494ba8f0f39", "name": "/usr/lib/git-core/git-merge-octopus", "type": "file" }, { - "bom-ref": "33c999d927d14ce1", + "bom-ref": "0a581d3487d5d42d", "name": "/usr/lib/git-core/git-merge-one-file", "type": "file" }, { - "bom-ref": "900d50e1c56043ab", + "bom-ref": "38ae31fb1970db67", "name": "/usr/lib/git-core/git-merge-resolve", "type": "file" }, { - "bom-ref": "33f52703893e3057", + "bom-ref": "18eb7fa02906dafb", "name": "/usr/lib/git-core/git-mergetool", "type": "file" }, { - "bom-ref": "b63d2d5ee36f7117", + "bom-ref": "7d7219455204a24b", "name": "/usr/lib/git-core/git-mergetool--lib", "type": "file" }, { - "bom-ref": "0b1b6bb97695ca68", + "bom-ref": "79215221acb47d10", "name": "/usr/lib/git-core/git-quiltimport", "type": "file" }, { - "bom-ref": "21a322d42e2d7388", + "bom-ref": "353de8c33b2ae5e4", "name": "/usr/lib/git-core/git-remote-http", "type": "file" }, { - "bom-ref": "788e6ca0cabc785b", + "bom-ref": "6e3be657c45c5a4f", "name": "/usr/lib/git-core/git-request-pull", "type": "file" }, { - "bom-ref": "11119fd007d76230", + "bom-ref": "6b99cef271c7f37c", "name": "/usr/lib/git-core/git-sh-i18n", "type": "file" }, { - "bom-ref": "09c9db86d302bd12", + "bom-ref": "01206ebb0ff844e6", "name": "/usr/lib/git-core/git-sh-i18n--envsubst", "type": "file" }, { - "bom-ref": "e42bba378317e8fe", + "bom-ref": "2d81a43cebbf5e5a", "name": "/usr/lib/git-core/git-sh-prompt", "type": "file" }, { - "bom-ref": "0eeb83add5254092", + "bom-ref": "53e1869f75be031e", "name": "/usr/lib/git-core/git-sh-setup", "type": "file" }, { - "bom-ref": "b48bd71ba10d483a", + "bom-ref": "7c37767042945e6e", "name": "/usr/lib/git-core/git-shell", "type": "file" }, { - "bom-ref": "f907050a4608c02e", + "bom-ref": "93b5d1c7d07ff992", "name": "/usr/lib/git-core/git-submodule", "type": "file" }, { - "bom-ref": "902dba7b019901a6", + "bom-ref": "15ef791b1cb5c8f6", "name": "/usr/lib/git-core/git-subtree", "type": "file" }, { - "bom-ref": "891aab752ff22734", + "bom-ref": "77808b9dc739995c", "name": "/usr/lib/git-core/git-web--browse", "type": "file" }, { - "bom-ref": "c46d9ec963954689", + "bom-ref": "1e5962ac3c2265b9", "name": "/usr/lib/git-core/mergetools/araxis", "type": "file" }, { - "bom-ref": "6acf46a0e92847ec", + "bom-ref": "f2c9bd40773bbfd0", "name": "/usr/lib/git-core/mergetools/bc", "type": "file" }, { - "bom-ref": "bb2b4e664497ea46", + "bom-ref": "ab36ed992ab88fc6", "name": "/usr/lib/git-core/mergetools/codecompare", "type": "file" }, { - "bom-ref": "131f7d51d7fc4f00", + "bom-ref": "c9b5723ffc9175bc", "name": "/usr/lib/git-core/mergetools/deltawalker", "type": "file" }, { - "bom-ref": "c40c32f4ca40c213", + "bom-ref": "72b754d7f70c7a3b", "name": "/usr/lib/git-core/mergetools/diffmerge", "type": "file" }, { - "bom-ref": "7705059500d11b0c", + "bom-ref": "c47372b09aa979ac", "name": "/usr/lib/git-core/mergetools/diffuse", "type": "file" }, { - "bom-ref": "720ba7feac7d42b0", + "bom-ref": "23049e07733fa6cc", "name": "/usr/lib/git-core/mergetools/ecmerge", "type": "file" }, { - "bom-ref": "44f24b98a223cd0f", + "bom-ref": "ed2de0a9b5b65a23", "name": "/usr/lib/git-core/mergetools/emerge", "type": "file" }, { - "bom-ref": "1cb9710546847838", + "bom-ref": "e7fa398222643670", "name": "/usr/lib/git-core/mergetools/examdiff", "type": "file" }, { - "bom-ref": "34bdeda4efcb979c", + "bom-ref": "7f4ea7911b2c3398", "name": "/usr/lib/git-core/mergetools/guiffy", "type": "file" }, { - "bom-ref": "8b76e368387d9740", + "bom-ref": "2dce46fb35fa241c", "name": "/usr/lib/git-core/mergetools/gvimdiff", "type": "file" }, { - "bom-ref": "23b4840a88cc844d", + "bom-ref": "a132d78df88990cd", "name": "/usr/lib/git-core/mergetools/kdiff3", "type": "file" }, { - "bom-ref": "32c58755e58dab5c", + "bom-ref": "71a652b1f72ee510", "name": "/usr/lib/git-core/mergetools/kompare", "type": "file" }, { - "bom-ref": "7d75e18345ef6232", + "bom-ref": "b6e4d2427df56d52", "name": "/usr/lib/git-core/mergetools/meld", "type": "file" }, { - "bom-ref": "992a532e95ef475a", + "bom-ref": "ab1788c5c931ccca", "name": "/usr/lib/git-core/mergetools/nvimdiff", "type": "file" }, { - "bom-ref": "2c0503fb88576f49", + "bom-ref": "e3948f57835b87ad", "name": "/usr/lib/git-core/mergetools/opendiff", "type": "file" }, { - "bom-ref": "49f6f11f368ba61d", + "bom-ref": "4149808857368b45", "name": "/usr/lib/git-core/mergetools/p4merge", "type": "file" }, { - "bom-ref": "38c1b3d842d502f0", + "bom-ref": "81b3a69fee0a3d8c", "name": "/usr/lib/git-core/mergetools/smerge", "type": "file" }, { - "bom-ref": "c430ade968d7ffe6", + "bom-ref": "36871adcfe387e22", "name": "/usr/lib/git-core/mergetools/tkdiff", "type": "file" }, { - "bom-ref": "9c5f7a2c85672399", + "bom-ref": "e6c1eb84fd4df191", "name": "/usr/lib/git-core/mergetools/tortoisemerge", "type": "file" }, { - "bom-ref": "93c79a535eb93202", + "bom-ref": "9cb370e932b057be", "name": "/usr/lib/git-core/mergetools/vimdiff", "type": "file" }, { - "bom-ref": "27a51984d24fd1b5", + "bom-ref": "cbf18fef2ac4bc9d", "name": "/usr/lib/git-core/mergetools/winmerge", "type": "file" }, { - "bom-ref": "64c8d6bbf427a15a", + "bom-ref": "22874d00ed9c019a", "name": "/usr/lib/git-core/mergetools/xxdiff", "type": "file" }, { - "bom-ref": "2a5dad9d1eff1f47", + "bom-ref": "6402de1155566d03", "name": "/usr/lib/git-core/scalar", "type": "file" }, { - "bom-ref": "deafe104abb440e3", + "bom-ref": "fb8bc0638cc39e15", "name": "/usr/lib/init/init-d-script", "type": "file" }, { - "bom-ref": "d5ff853e1895b843", + "bom-ref": "a95e70ea33954879", "name": "/usr/lib/init/vars.sh", "type": "file" }, { - "bom-ref": "014f3ca47c1f9543", + "bom-ref": "1c01fde33ffc1161", "name": "/usr/lib/kernel/install.conf", "type": "file" }, { - "bom-ref": "3b0dab82b8990dcf", + "bom-ref": "546410f71b1c78b9", "name": "/usr/lib/kernel/install.d/50-depmod.install", "type": "file" }, { - "bom-ref": "e9a6113e182cfcdd", + "bom-ref": "311754af7bb9c733", "name": "/usr/lib/kernel/install.d/55-initrd.install", "type": "file" }, { - "bom-ref": "87c5779e40f0f066", + "bom-ref": "f80d64116d237608", "name": "/usr/lib/kernel/install.d/90-loaderentry.install", "type": "file" }, { - "bom-ref": "b3985314eccdf976", + "bom-ref": "5628cc1e800cfdf4", "name": "/usr/lib/kernel/install.d/90-uki-copy.install", "type": "file" }, { - "bom-ref": "275149d89ce94088", + "bom-ref": "db2c3575f8e79c3a", "name": "/usr/lib/locale/C.utf8/LC_ADDRESS", "type": "file" }, { - "bom-ref": "39da075b1fd315dd", + "bom-ref": "9c551de8deff468b", "name": "/usr/lib/locale/C.utf8/LC_COLLATE", "type": "file" }, { - "bom-ref": "bcfa46c9cdfa5073", + "bom-ref": "415ef1a94e0d4b4d", "name": "/usr/lib/locale/C.utf8/LC_CTYPE", "type": "file" }, { - "bom-ref": "a2f0d971ee127644", + "bom-ref": "37f7450857500a3a", "name": "/usr/lib/locale/C.utf8/LC_IDENTIFICATION", "type": "file" }, { - "bom-ref": "9e42a0aacaa02fa6", + "bom-ref": "c40b998664ba9ea4", "name": "/usr/lib/locale/C.utf8/LC_MEASUREMENT", "type": "file" }, { - "bom-ref": "6eb73b338bb76e19", + "bom-ref": "ee0e3b31e3c342f3", "name": "/usr/lib/locale/C.utf8/LC_MESSAGES/SYS_LC_MESSAGES", "type": "file" }, { - "bom-ref": "df89ca4463c73d27", + "bom-ref": "d5e40db75ee5d105", "name": "/usr/lib/locale/C.utf8/LC_MONETARY", "type": "file" }, { - "bom-ref": "4a1d161ab9c9ad04", + "bom-ref": "746c035d6fc2ba96", "name": "/usr/lib/locale/C.utf8/LC_NAME", "type": "file" }, { - "bom-ref": "908fd8c49ddc063b", + "bom-ref": "f3fa7c7253508511", "name": "/usr/lib/locale/C.utf8/LC_NUMERIC", "type": "file" }, { - "bom-ref": "b65c48e3958e606f", + "bom-ref": "a39935baea42a735", "name": "/usr/lib/locale/C.utf8/LC_PAPER", "type": "file" }, { - "bom-ref": "a943ee2fce526f0a", + "bom-ref": "2afe08ce76950be8", "name": "/usr/lib/locale/C.utf8/LC_TELEPHONE", "type": "file" }, { - "bom-ref": "1f03f82d5d3d3088", + "bom-ref": "f3639e061f10e15a", "name": "/usr/lib/locale/C.utf8/LC_TIME", "type": "file" }, { - "bom-ref": "5a7399ee629f1121", + "bom-ref": "0bdb54a1520e55df", "name": "/usr/lib/lsb/init-functions", "type": "file" }, { - "bom-ref": "fa14deecebe713e1", + "bom-ref": "2a55278efb5fedfb", "name": "/usr/lib/lsb/init-functions.d/00-verbose", "type": "file" }, { - "bom-ref": "3099606cc623bef5", + "bom-ref": "6679ba603c27ac43", "name": "/usr/lib/lsb/init-functions.d/40-systemd", "type": "file" }, { - "bom-ref": "ec1bf173d631a746", + "bom-ref": "789568ff1858a83c", "name": "/usr/lib/lsb/init-functions.d/50-ubuntu-logging", "type": "file" }, { - "bom-ref": "af7bbd5edfe33e64", + "bom-ref": "bdbf45ebc741306a", "name": "/usr/lib/mime/packages/sensible-utils", "type": "file" }, { - "bom-ref": "c542eda0d058067d", + "bom-ref": "1c05c1edc928e24f", "name": "/usr/lib/mime/packages/tar", "type": "file" }, { - "bom-ref": "9ef51b09a1adfafc", + "bom-ref": "485f61f14c188f20", "name": "/usr/lib/mime/packages/util-linux", "type": "file" }, { - "bom-ref": "9b09cfac28e4f05a", + "bom-ref": "adeb2f9159a2f416", "name": "/usr/lib/mime/packages/vim-common", "type": "file" }, { - "bom-ref": "f6f0b3280c79f079", + "bom-ref": "26273e72d1260401", "name": "/usr/lib/modprobe.d/fbdev-blacklist.conf", "type": "file" }, { - "bom-ref": "31c809410c2cad4b", + "bom-ref": "b0ed4a98c3d72ca1", "name": "/usr/lib/modprobe.d/systemd.conf", "type": "file" }, { - "bom-ref": "e58d70599913f6ec", + "bom-ref": "f00645f88b9c49b6", "name": "/usr/lib/os-release", "type": "file" }, { - "bom-ref": "91ea10c5837a1e80", + "bom-ref": "499456b12f9a3e51", + "name": "/usr/lib/pam.d/polkit-1", + "type": "file" + }, + { + "bom-ref": "ce2f2fa1570b50e2", "name": "/usr/lib/pam.d/systemd-user", "type": "file" }, { - "bom-ref": "2ca3c6492d445ad2", + "bom-ref": "7368f75d6619d81c", "name": "/usr/lib/pcrlock.d/350-action-efi-application.pcrlock", "type": "file" }, { - "bom-ref": "221a3dea6e2efe7d", + "bom-ref": "d6e82a87c6e7db03", "name": "/usr/lib/pcrlock.d/400-secureboot-separator.pcrlock.d/300-0x00000000.pcrlock", "type": "file" }, { - "bom-ref": "e3d8d5b25968c0f0", + "bom-ref": "d09ce666e4380a9e", "name": "/usr/lib/pcrlock.d/400-secureboot-separator.pcrlock.d/600-0xffffffff.pcrlock", "type": "file" }, { - "bom-ref": "3c9a65d650a75d5b", + "bom-ref": "d66187d22d3865cd", "name": "/usr/lib/pcrlock.d/500-separator.pcrlock.d/300-0x00000000.pcrlock", "type": "file" }, { - "bom-ref": "5d87e3323770fbe0", + "bom-ref": "422943fa08606296", "name": "/usr/lib/pcrlock.d/500-separator.pcrlock.d/600-0xffffffff.pcrlock", "type": "file" }, { - "bom-ref": "5de110d5f5b9f57d", + "bom-ref": "9ca01e82a1a3d1d7", "name": "/usr/lib/pcrlock.d/700-action-efi-exit-boot-services.pcrlock.d/300-present.pcrlock", "type": "file" }, { - "bom-ref": "b08f3d351bcb4287", + "bom-ref": "31b973f4d9610995", "name": "/usr/lib/pcrlock.d/700-action-efi-exit-boot-services.pcrlock.d/600-absent.pcrlock", "type": "file" }, { - "bom-ref": "ff5ccbc269fee772", + "bom-ref": "95fbe221d9f4a830", "name": "/usr/lib/pcrlock.d/750-enter-initrd.pcrlock", "type": "file" }, { - "bom-ref": "602c5ba875df68bf", + "bom-ref": "2a68636ac67028cd", "name": "/usr/lib/pcrlock.d/800-leave-initrd.pcrlock", "type": "file" }, { - "bom-ref": "a32314225412dee0", + "bom-ref": "688cd5f2cbbc030a", "name": "/usr/lib/pcrlock.d/850-sysinit.pcrlock", "type": "file" }, { - "bom-ref": "a66d23a9ad9723f5", + "bom-ref": "129ae4ca2be63c97", "name": "/usr/lib/pcrlock.d/900-ready.pcrlock", "type": "file" }, { - "bom-ref": "406a9a0f698dd579", + "bom-ref": "34010ff93f4d293b", "name": "/usr/lib/pcrlock.d/950-shutdown.pcrlock", "type": "file" }, { - "bom-ref": "65105efad2e44900", + "bom-ref": "b955353e4834478a", "name": "/usr/lib/pcrlock.d/990-final.pcrlock", "type": "file" }, { - "bom-ref": "72d2854c6a2c1ad2", + "bom-ref": "04a2aabc7731fe15", + "name": "/usr/lib/polkit-1/polkit-agent-helper-1", + "type": "file" + }, + { + "bom-ref": "bbfc4dfc9e824d0e", + "name": "/usr/lib/polkit-1/polkitd", + "type": "file" + }, + { + "bom-ref": "7301166e075b692a", "name": "/usr/lib/python3.12/EXTERNALLY-MANAGED", "type": "file" }, { - "bom-ref": "dd9b5a8f1fc45801", + "bom-ref": "58e40933cd8956e1", "name": "/usr/lib/python3.12/LICENSE.txt", "type": "file" }, { - "bom-ref": "f6fdb6a678dc7e98", + "bom-ref": "ee47b738d4d5b2a4", "name": "/usr/lib/python3.12/__future__.py", "type": "file" }, { - "bom-ref": "ce43e5cfd4803616", + "bom-ref": "23d31e539258aede", "name": "/usr/lib/python3.12/__hello__.py", "type": "file" }, { - "bom-ref": "a1f5ac6ec5f5f5f2", + "bom-ref": "516f81f87a8c1b16", "name": "/usr/lib/python3.12/__phello__/__init__.py", "type": "file" }, { - "bom-ref": "b5ab095071b01b1b", + "bom-ref": "9bda5d08fc9ff697", "name": "/usr/lib/python3.12/__phello__/spam.py", "type": "file" }, { - "bom-ref": "1159b581b666f52a", + "bom-ref": "552075b34ef603aa", "name": "/usr/lib/python3.12/_aix_support.py", "type": "file" }, { - "bom-ref": "5c1a1783152dd023", + "bom-ref": "18f4dfb07aebf223", "name": "/usr/lib/python3.12/_collections_abc.py", "type": "file" }, { - "bom-ref": "d5656090ab6e4dbf", + "bom-ref": "6ed98880fa97b8e7", "name": "/usr/lib/python3.12/_compat_pickle.py", "type": "file" }, { - "bom-ref": "135bd89acfc1e930", + "bom-ref": "de574933309d1d84", "name": "/usr/lib/python3.12/_compression.py", "type": "file" }, { - "bom-ref": "32401d90605057b2", + "bom-ref": "abc81fd331f0acc2", "name": "/usr/lib/python3.12/_distutils_system_mod.py", "type": "file" }, { - "bom-ref": "ffe5ee9eb4fb9134", + "bom-ref": "6344244a9d2eb968", "name": "/usr/lib/python3.12/_markupbase.py", "type": "file" }, { - "bom-ref": "c8c7dad4dcc76b3d", + "bom-ref": "f3617f7ba6d744c1", "name": "/usr/lib/python3.12/_osx_support.py", "type": "file" }, { - "bom-ref": "5af0e68497e53e51", + "bom-ref": "9bf13aaea14190e9", "name": "/usr/lib/python3.12/_py_abc.py", "type": "file" }, { - "bom-ref": "eaac6e4f34f57b07", + "bom-ref": "79ac84b796bc74db", "name": "/usr/lib/python3.12/_pydatetime.py", "type": "file" }, { - "bom-ref": "3e9e3c1ec70c41fa", + "bom-ref": "ebae99f754e435f6", "name": "/usr/lib/python3.12/_pydecimal.py", "type": "file" }, { - "bom-ref": "4209ed866d5898b5", + "bom-ref": "834762de162fe025", "name": "/usr/lib/python3.12/_pyio.py", "type": "file" }, { - "bom-ref": "44ff6e1af31e2e45", + "bom-ref": "37888e7114ea4e69", "name": "/usr/lib/python3.12/_pylong.py", "type": "file" }, { - "bom-ref": "a9272ca08394ecec", + "bom-ref": "dea8c87296b90190", "name": "/usr/lib/python3.12/_sitebuiltins.py", "type": "file" }, { - "bom-ref": "8e7472799dcec4ea", + "bom-ref": "3a092b674d2083a6", "name": "/usr/lib/python3.12/_strptime.py", "type": "file" }, { - "bom-ref": "93fc412f273e8f5b", + "bom-ref": "39a39adee937079f", "name": "/usr/lib/python3.12/_sysconfigdata__x86_64-linux-gnu.py", "type": "file" }, { - "bom-ref": "8051595b8d1bd101", + "bom-ref": "7aa8fe566c356439", "name": "/usr/lib/python3.12/_threading_local.py", "type": "file" }, { - "bom-ref": "fab61fad6370dd4d", + "bom-ref": "6dc9e357ba6f9bfd", "name": "/usr/lib/python3.12/_weakrefset.py", "type": "file" }, { - "bom-ref": "a4d6b9c356884820", + "bom-ref": "a540e21c4d807830", "name": "/usr/lib/python3.12/abc.py", "type": "file" }, { - "bom-ref": "589a2094369c1548", + "bom-ref": "38701bbd21f0a854", "name": "/usr/lib/python3.12/aifc.py", "type": "file" }, { - "bom-ref": "f42df882a3515c58", + "bom-ref": "4889caa10d0e94c4", "name": "/usr/lib/python3.12/antigravity.py", "type": "file" }, { - "bom-ref": "1900096ece2bf5dd", + "bom-ref": "71afcbfde3674419", "name": "/usr/lib/python3.12/argparse.py", "type": "file" }, { - "bom-ref": "466fdc6e6c994427", + "bom-ref": "84cfa5282b956107", "name": "/usr/lib/python3.12/ast.py", "type": "file" }, { - "bom-ref": "5d922fd810fef831", + "bom-ref": "35794933f7186429", "name": "/usr/lib/python3.12/asyncio/__init__.py", "type": "file" }, { - "bom-ref": "b00fe05e7e7a66ac", + "bom-ref": "28c072dd13a44e70", "name": "/usr/lib/python3.12/asyncio/__main__.py", "type": "file" }, { - "bom-ref": "8d808bda059dc61d", + "bom-ref": "6f142f9d90ef0555", "name": "/usr/lib/python3.12/asyncio/base_events.py", "type": "file" }, { - "bom-ref": "2aef597e46acb007", + "bom-ref": "423bc86c076066bf", "name": "/usr/lib/python3.12/asyncio/base_futures.py", "type": "file" }, { - "bom-ref": "4a3adabf4a034435", + "bom-ref": "8ca4041a496ee089", "name": "/usr/lib/python3.12/asyncio/base_subprocess.py", "type": "file" }, { - "bom-ref": "eb83ac979d8d8476", + "bom-ref": "2833805c276f3ae6", "name": "/usr/lib/python3.12/asyncio/base_tasks.py", "type": "file" }, { - "bom-ref": "8b63b61c03908206", + "bom-ref": "2921731fe5eef9ba", "name": "/usr/lib/python3.12/asyncio/constants.py", "type": "file" }, { - "bom-ref": "d2dac5fc6daf66dc", + "bom-ref": "21658687aa1883b0", "name": "/usr/lib/python3.12/asyncio/coroutines.py", "type": "file" }, { - "bom-ref": "7033f6f0d8b98289", + "bom-ref": "d71dd9ffca1d50cd", "name": "/usr/lib/python3.12/asyncio/events.py", "type": "file" }, { - "bom-ref": "61e06c66dd0dbbd8", + "bom-ref": "83c7751dffd3bae4", "name": "/usr/lib/python3.12/asyncio/exceptions.py", "type": "file" }, { - "bom-ref": "0cf62d19e56257e0", + "bom-ref": "5f785eae11c10a30", "name": "/usr/lib/python3.12/asyncio/format_helpers.py", "type": "file" }, { - "bom-ref": "01855696550d8a1c", + "bom-ref": "00a4731c6c30861c", "name": "/usr/lib/python3.12/asyncio/futures.py", "type": "file" }, { - "bom-ref": "460f20cc007a1358", + "bom-ref": "e947dd8f10dad9cc", "name": "/usr/lib/python3.12/asyncio/locks.py", "type": "file" }, { - "bom-ref": "a51ea2869c50ab20", + "bom-ref": "12ef6c396c6087c4", "name": "/usr/lib/python3.12/asyncio/log.py", "type": "file" }, { - "bom-ref": "06ce3c086871552c", + "bom-ref": "0bb89e30b9ac9c20", "name": "/usr/lib/python3.12/asyncio/mixins.py", "type": "file" }, { - "bom-ref": "a036f3183181668a", + "bom-ref": "5c7002f0b793566a", "name": "/usr/lib/python3.12/asyncio/proactor_events.py", "type": "file" }, { - "bom-ref": "0f2aabccecd2cdf5", + "bom-ref": "21d98403f1f3cabd", "name": "/usr/lib/python3.12/asyncio/protocols.py", "type": "file" }, { - "bom-ref": "fade563378de6814", + "bom-ref": "f9960682cd3c7b10", "name": "/usr/lib/python3.12/asyncio/queues.py", "type": "file" }, { - "bom-ref": "e9d001b2c22e92df", + "bom-ref": "09f8dfd07df0aa07", "name": "/usr/lib/python3.12/asyncio/runners.py", "type": "file" }, { - "bom-ref": "74a166486ad66bbe", + "bom-ref": "35392ee7bbb20d6e", "name": "/usr/lib/python3.12/asyncio/selector_events.py", "type": "file" }, { - "bom-ref": "0c555acf51b0a100", + "bom-ref": "704f87dd7ff1582c", "name": "/usr/lib/python3.12/asyncio/sslproto.py", "type": "file" }, { - "bom-ref": "f5c1f52cca75d6ec", + "bom-ref": "7ec5b3e2f87f013c", "name": "/usr/lib/python3.12/asyncio/staggered.py", "type": "file" }, { - "bom-ref": "5fbf3a3f3fcbe067", + "bom-ref": "665df613846c2fdb", "name": "/usr/lib/python3.12/asyncio/streams.py", "type": "file" }, { - "bom-ref": "90ec4ab17529388f", + "bom-ref": "ef898670dee1acef", "name": "/usr/lib/python3.12/asyncio/subprocess.py", "type": "file" }, { - "bom-ref": "dde46d08f890545b", + "bom-ref": "5f3dcb9fb173efe7", "name": "/usr/lib/python3.12/asyncio/taskgroups.py", "type": "file" }, { - "bom-ref": "048180a9a99084a9", + "bom-ref": "aa6d6e63ffc81e9d", "name": "/usr/lib/python3.12/asyncio/tasks.py", "type": "file" }, { - "bom-ref": "f60fb12032b345d2", + "bom-ref": "d5ba13cb00e00bde", "name": "/usr/lib/python3.12/asyncio/threads.py", "type": "file" }, { - "bom-ref": "c0122bf391d6a8cd", + "bom-ref": "b8505d2bbe5b24cd", "name": "/usr/lib/python3.12/asyncio/timeouts.py", "type": "file" }, { - "bom-ref": "3be4ed4ba03dc8c7", + "bom-ref": "d264c9437b8deacf", "name": "/usr/lib/python3.12/asyncio/transports.py", "type": "file" }, { - "bom-ref": "839a654e0b91cf44", + "bom-ref": "b43958e460f39dd8", "name": "/usr/lib/python3.12/asyncio/trsock.py", "type": "file" }, { - "bom-ref": "8162455420b17c6e", + "bom-ref": "ddc24a0bbeef68aa", "name": "/usr/lib/python3.12/asyncio/unix_events.py", "type": "file" }, { - "bom-ref": "4bfaf5a8d84ad21e", + "bom-ref": "101c2c4c38b56ada", "name": "/usr/lib/python3.12/asyncio/windows_events.py", "type": "file" }, { - "bom-ref": "297e069eb194b08b", + "bom-ref": "7e9cff71f1e71bb3", "name": "/usr/lib/python3.12/asyncio/windows_utils.py", "type": "file" }, { - "bom-ref": "a183370b269f6093", + "bom-ref": "43a5eaafdd37936f", "name": "/usr/lib/python3.12/base64.py", "type": "file" }, { - "bom-ref": "51baf670cb224127", + "bom-ref": "3de004902a5549eb", "name": "/usr/lib/python3.12/bdb.py", "type": "file" }, { - "bom-ref": "0adf8701a4d79067", + "bom-ref": "5ee5df7f04933a87", "name": "/usr/lib/python3.12/bisect.py", "type": "file" }, { - "bom-ref": "c9cea9d4f9d61f00", + "bom-ref": "ebe41d8fd1dffe2c", "name": "/usr/lib/python3.12/bz2.py", "type": "file" }, { - "bom-ref": "021a81451092a0e9", + "bom-ref": "12dc9c79382cbec5", "name": "/usr/lib/python3.12/cProfile.py", "type": "file" }, { - "bom-ref": "1ba702170491d9a5", + "bom-ref": "7b9234198d5b9f2d", "name": "/usr/lib/python3.12/calendar.py", "type": "file" }, { - "bom-ref": "e6b244267e28881a", + "bom-ref": "a7f445f472d2770e", "name": "/usr/lib/python3.12/cgi.py", "type": "file" }, { - "bom-ref": "681c47f0591eca3b", + "bom-ref": "21f994feabeb295b", "name": "/usr/lib/python3.12/cgitb.py", "type": "file" }, { - "bom-ref": "86f19241b36bf394", + "bom-ref": "b0090f3ad1cf9c70", "name": "/usr/lib/python3.12/chunk.py", "type": "file" }, { - "bom-ref": "25ae46806b145ae2", + "bom-ref": "31472be7abd768ea", "name": "/usr/lib/python3.12/cmd.py", "type": "file" }, { - "bom-ref": "5baae1393729b843", + "bom-ref": "2a4678dc30c6221b", "name": "/usr/lib/python3.12/code.py", "type": "file" }, { - "bom-ref": "b972d005ada83000", + "bom-ref": "876c403b2dd941cc", "name": "/usr/lib/python3.12/codecs.py", "type": "file" }, { - "bom-ref": "0f06cec5b3a64c66", + "bom-ref": "5a47df5e868b5822", "name": "/usr/lib/python3.12/codeop.py", "type": "file" }, { - "bom-ref": "a72bfb1186aede9c", + "bom-ref": "7c47d330ea85aed0", "name": "/usr/lib/python3.12/collections/__init__.py", "type": "file" }, { - "bom-ref": "da20f71a1459f618", + "bom-ref": "5ca03b380462778c", "name": "/usr/lib/python3.12/collections/abc.py", "type": "file" }, { - "bom-ref": "0d59b2496c162982", + "bom-ref": "714bb8a4a9dcfad6", "name": "/usr/lib/python3.12/colorsys.py", "type": "file" }, { - "bom-ref": "43b16d9ceffc8c5d", + "bom-ref": "5ffe744f43bcaac5", "name": "/usr/lib/python3.12/compileall.py", "type": "file" }, { - "bom-ref": "3a90efb8c02bc5a9", + "bom-ref": "c22db2162a6b7449", "name": "/usr/lib/python3.12/concurrent/__init__.py", "type": "file" }, { - "bom-ref": "26abdedebc2935d6", + "bom-ref": "d36046cfcfae2e76", "name": "/usr/lib/python3.12/concurrent/futures/__init__.py", "type": "file" }, { - "bom-ref": "0ecf88d3a115ee35", + "bom-ref": "8424edf0463560b9", "name": "/usr/lib/python3.12/concurrent/futures/_base.py", "type": "file" }, { - "bom-ref": "63622e0d703e6773", + "bom-ref": "809d517e64918107", "name": "/usr/lib/python3.12/concurrent/futures/process.py", "type": "file" }, { - "bom-ref": "8c734eba20a47271", + "bom-ref": "d3b58bdb9e7ac9b9", "name": "/usr/lib/python3.12/concurrent/futures/thread.py", "type": "file" }, { - "bom-ref": "e35f249deae3b101", + "bom-ref": "4290e512afe455d1", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/Makefile", "type": "file" }, { - "bom-ref": "36030469429b21a0", + "bom-ref": "a5978958ef40c100", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup", "type": "file" }, { - "bom-ref": "c2372b44380bfa6b", + "bom-ref": "26f022edb2810233", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup.bootstrap", "type": "file" }, { - "bom-ref": "adedb03dc96338bf", + "bom-ref": "e1996f6b2fa59727", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup.local", "type": "file" }, { - "bom-ref": "0ecc797cf6024890", + "bom-ref": "bc22fa126f9c9638", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup.stdlib", "type": "file" }, { - "bom-ref": "e5c98fd578b8e1b8", + "bom-ref": "ddf1bbcd20078ab4", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/config.c", "type": "file" }, { - "bom-ref": "8afd54e1c692ec25", + "bom-ref": "f5228f375d24d5d1", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/config.c.in", "type": "file" }, { - "bom-ref": "6697009088db31d9", + "bom-ref": "6ff33c1a9fb36f7d", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/install-sh", "type": "file" }, { - "bom-ref": "f2c1acea2bb8fc9f", + "bom-ref": "a40b29f5e3e0d7cb", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/libpython3.12-pic.a", "type": "file" }, { - "bom-ref": "e2bf829b7b441e33", + "bom-ref": "b61f391e1f159887", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/libpython3.12.a", "type": "file" }, { - "bom-ref": "69fd921bae1d5fbb", + "bom-ref": "bac39cd3d2df7e7f", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/makesetup", "type": "file" }, { - "bom-ref": "a50fa2bab0164166", + "bom-ref": "f14347ade3cec5b6", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/python-config.py", "type": "file" }, { - "bom-ref": "885e1ffb0ebbb710", + "bom-ref": "cc30890f9e458818", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/python.o", "type": "file" }, { - "bom-ref": "08fa354e785ff0ac", + "bom-ref": "8d4acbea64f86ee0", "name": "/usr/lib/python3.12/configparser.py", "type": "file" }, { - "bom-ref": "7de337f8968f70e3", + "bom-ref": "c3baa1a2580a128b", "name": "/usr/lib/python3.12/contextlib.py", "type": "file" }, { - "bom-ref": "de1b6bca399f6e63", + "bom-ref": "6daf01872aefc3d3", "name": "/usr/lib/python3.12/contextvars.py", "type": "file" }, { - "bom-ref": "2fec76cdaaace820", + "bom-ref": "11d23a4dbb715374", "name": "/usr/lib/python3.12/copy.py", "type": "file" }, { - "bom-ref": "cc23c8fe5b0eaa5e", + "bom-ref": "9ebc30bcf8d68086", "name": "/usr/lib/python3.12/copyreg.py", "type": "file" }, { - "bom-ref": "e5f170eab12e592d", + "bom-ref": "c97e04f15c94939d", "name": "/usr/lib/python3.12/crypt.py", "type": "file" }, { - "bom-ref": "6d0a44ce85335555", + "bom-ref": "df9c6e714adb5c51", "name": "/usr/lib/python3.12/csv.py", "type": "file" }, { - "bom-ref": "2a9fc890722fd365", + "bom-ref": "e54feaabb1879871", "name": "/usr/lib/python3.12/ctypes/__init__.py", "type": "file" }, { - "bom-ref": "228ad826b6a9331e", + "bom-ref": "af036216fb3c09ba", "name": "/usr/lib/python3.12/ctypes/_aix.py", "type": "file" }, { - "bom-ref": "f74008b75a3763bd", + "bom-ref": "7b5299eb65800e49", "name": "/usr/lib/python3.12/ctypes/_endian.py", "type": "file" }, { - "bom-ref": "25607a3d83841fab", + "bom-ref": "de5fe639bfc2b3d7", "name": "/usr/lib/python3.12/ctypes/util.py", "type": "file" }, { - "bom-ref": "174c2204e4324e95", + "bom-ref": "5347d109f2723bbd", "name": "/usr/lib/python3.12/ctypes/wintypes.py", "type": "file" }, { - "bom-ref": "13f2c18c49db5791", + "bom-ref": "fd1aefd194cd3c89", "name": "/usr/lib/python3.12/curses/__init__.py", "type": "file" }, { - "bom-ref": "6f3d6944ed1a22c5", + "bom-ref": "97bd3eef185592f9", "name": "/usr/lib/python3.12/curses/ascii.py", "type": "file" }, { - "bom-ref": "ec75e89693e004d1", + "bom-ref": "e8077d3946faaedd", "name": "/usr/lib/python3.12/curses/has_key.py", "type": "file" }, { - "bom-ref": "f10b4a2ba4c6128e", + "bom-ref": "993f1f89c08caee6", "name": "/usr/lib/python3.12/curses/panel.py", "type": "file" }, { - "bom-ref": "c807e742a81500aa", + "bom-ref": "a8622520b228f46e", "name": "/usr/lib/python3.12/curses/textpad.py", "type": "file" }, { - "bom-ref": "eefdc446c3116b2f", + "bom-ref": "13ecccd5dbbc9b77", "name": "/usr/lib/python3.12/dataclasses.py", "type": "file" }, { - "bom-ref": "e6972e0aa6dde11f", + "bom-ref": "052e884b8a9f8d63", "name": "/usr/lib/python3.12/datetime.py", "type": "file" }, { - "bom-ref": "b983ec9039e2bd3b", + "bom-ref": "f7e3361847f60773", "name": "/usr/lib/python3.12/dbm/__init__.py", "type": "file" }, { - "bom-ref": "f701d1b1461b47b2", + "bom-ref": "77e3eecc24b4a9fe", "name": "/usr/lib/python3.12/dbm/dumb.py", "type": "file" }, { - "bom-ref": "521349db6d5bfb36", + "bom-ref": "81351cb80e2f01e6", "name": "/usr/lib/python3.12/dbm/gnu.py", "type": "file" }, { - "bom-ref": "e3b00d0e19f917c6", + "bom-ref": "c55987c18ff2d0b6", "name": "/usr/lib/python3.12/dbm/ndbm.py", "type": "file" }, { - "bom-ref": "957c052648014ba9", + "bom-ref": "c4b03c06fa862aa9", "name": "/usr/lib/python3.12/decimal.py", "type": "file" }, { - "bom-ref": "ec05ac3d27fe9e3d", + "bom-ref": "e94b9d3064a358c9", "name": "/usr/lib/python3.12/difflib.py", "type": "file" }, { - "bom-ref": "bc175fd673a7b677", + "bom-ref": "25930880c46737c3", "name": "/usr/lib/python3.12/dis.py", "type": "file" }, { - "bom-ref": "94fa7e2bf736c3f3", + "bom-ref": "fcb1ede2a043f5bf", "name": "/usr/lib/python3.12/doctest.py", "type": "file" }, { - "bom-ref": "e244268dfd770f69", + "bom-ref": "d6d498502ab99e99", "name": "/usr/lib/python3.12/email/__init__.py", "type": "file" }, { - "bom-ref": "5360c952f8d65741", + "bom-ref": "a212d316f42554a9", "name": "/usr/lib/python3.12/email/_encoded_words.py", "type": "file" }, { - "bom-ref": "9cf764b431728ac3", + "bom-ref": "aadbdadb3e07bbbb", "name": "/usr/lib/python3.12/email/_header_value_parser.py", "type": "file" }, { - "bom-ref": "2aca6b8418bd6d0c", + "bom-ref": "913bd705f10013e4", "name": "/usr/lib/python3.12/email/_parseaddr.py", "type": "file" }, { - "bom-ref": "5648a66cea9663ce", + "bom-ref": "a13c3f641eb21372", "name": "/usr/lib/python3.12/email/_policybase.py", "type": "file" }, { - "bom-ref": "dbbdc5e713670274", + "bom-ref": "b432b41b76924418", "name": "/usr/lib/python3.12/email/architecture.rst", "type": "file" }, { - "bom-ref": "e4c4e3ce229d1447", + "bom-ref": "211111fee60ea58b", "name": "/usr/lib/python3.12/email/base64mime.py", "type": "file" }, { - "bom-ref": "da1e79de3392e6d6", + "bom-ref": "c5ac70106afa55c6", "name": "/usr/lib/python3.12/email/charset.py", "type": "file" }, { - "bom-ref": "12af1e7b63a864a7", + "bom-ref": "8b086e4b01b7529b", "name": "/usr/lib/python3.12/email/contentmanager.py", "type": "file" }, { - "bom-ref": "798f7a6f4b425515", + "bom-ref": "b61167d065a69c39", "name": "/usr/lib/python3.12/email/encoders.py", "type": "file" }, { - "bom-ref": "a5ead2d2c69049f6", + "bom-ref": "ebd26524232d1fda", "name": "/usr/lib/python3.12/email/errors.py", "type": "file" }, { - "bom-ref": "61f43b1be2369ee9", + "bom-ref": "90b479275e20082d", "name": "/usr/lib/python3.12/email/feedparser.py", "type": "file" }, { - "bom-ref": "3235f8d2618f7cb0", + "bom-ref": "1cb63bef3630b380", "name": "/usr/lib/python3.12/email/generator.py", "type": "file" }, { - "bom-ref": "c47134590df9f412", + "bom-ref": "ef94cd9ae4cf4d66", "name": "/usr/lib/python3.12/email/header.py", "type": "file" }, { - "bom-ref": "7fc3868833517573", + "bom-ref": "e54ef1dcc7fe5c0f", "name": "/usr/lib/python3.12/email/headerregistry.py", "type": "file" }, { - "bom-ref": "ddbb962340616c13", + "bom-ref": "8237a9051cf5408f", "name": "/usr/lib/python3.12/email/iterators.py", "type": "file" }, { - "bom-ref": "68ba0a0a9bfce8fb", + "bom-ref": "467d879c7d48ce67", "name": "/usr/lib/python3.12/email/message.py", "type": "file" }, { - "bom-ref": "f6514f0657cd3b41", + "bom-ref": "133412667fe7f1b5", "name": "/usr/lib/python3.12/email/mime/__init__.py", "type": "file" }, { - "bom-ref": "11777990d371b7d4", + "bom-ref": "e8426c0bf6370810", "name": "/usr/lib/python3.12/email/mime/application.py", "type": "file" }, { - "bom-ref": "074b6756ba705f3e", + "bom-ref": "7f485a3e5e3f16c2", "name": "/usr/lib/python3.12/email/mime/audio.py", "type": "file" }, { - "bom-ref": "8b4c7a680f6417f4", + "bom-ref": "693fdaff1c3cb238", "name": "/usr/lib/python3.12/email/mime/base.py", "type": "file" }, { - "bom-ref": "2343bb49d9d6c657", + "bom-ref": "fca6f3d246ba9ff3", "name": "/usr/lib/python3.12/email/mime/image.py", "type": "file" }, { - "bom-ref": "dc15808be93f5588", + "bom-ref": "9ee5d6ac4ebba8b4", "name": "/usr/lib/python3.12/email/mime/message.py", "type": "file" }, { - "bom-ref": "208d0cc7fd7752b6", + "bom-ref": "bf9d3c00117c027a", "name": "/usr/lib/python3.12/email/mime/multipart.py", "type": "file" }, { - "bom-ref": "88ed2e1529caa3f7", + "bom-ref": "6c7541c1b7ba7253", "name": "/usr/lib/python3.12/email/mime/nonmultipart.py", "type": "file" }, { - "bom-ref": "2a424ea5672823f7", + "bom-ref": "7f0c994a894156a7", "name": "/usr/lib/python3.12/email/mime/text.py", "type": "file" }, { - "bom-ref": "e263930cd24e4473", + "bom-ref": "293fe47aa04287eb", "name": "/usr/lib/python3.12/email/parser.py", "type": "file" }, { - "bom-ref": "510003d16cafb401", + "bom-ref": "171c7d8e030d9d69", "name": "/usr/lib/python3.12/email/policy.py", "type": "file" }, { - "bom-ref": "893a6c279f9c9178", + "bom-ref": "be4d5f75fef6809c", "name": "/usr/lib/python3.12/email/quoprimime.py", "type": "file" }, { - "bom-ref": "f3f7a99bee143b1a", + "bom-ref": "2008b0bc26dc48b6", "name": "/usr/lib/python3.12/email/utils.py", "type": "file" }, { - "bom-ref": "487241f987483de4", + "bom-ref": "05e6198d672c56b0", "name": "/usr/lib/python3.12/encodings/__init__.py", "type": "file" }, { - "bom-ref": "f7babef43c9f5bd1", + "bom-ref": "318b347ecdbfbb89", "name": "/usr/lib/python3.12/encodings/aliases.py", "type": "file" }, { - "bom-ref": "75b70cd0ee49dd48", + "bom-ref": "6da910257a1309c4", "name": "/usr/lib/python3.12/encodings/ascii.py", "type": "file" }, { - "bom-ref": "aea341acae5bfbca", + "bom-ref": "89485b2a31bbdd2a", "name": "/usr/lib/python3.12/encodings/base64_codec.py", "type": "file" }, { - "bom-ref": "1dce076f70424a9c", + "bom-ref": "c8e7a19ff15aaf10", "name": "/usr/lib/python3.12/encodings/big5.py", "type": "file" }, { - "bom-ref": "0c3bc107dc8cabf0", + "bom-ref": "9fdac65a74c46138", "name": "/usr/lib/python3.12/encodings/big5hkscs.py", "type": "file" }, { - "bom-ref": "a876357b4b54bd5d", + "bom-ref": "0a725b962976b641", "name": "/usr/lib/python3.12/encodings/bz2_codec.py", "type": "file" }, { - "bom-ref": "ff072917ed7f0265", + "bom-ref": "45017040bcdf8159", "name": "/usr/lib/python3.12/encodings/charmap.py", "type": "file" }, { - "bom-ref": "fea764fe6c77ea82", + "bom-ref": "5132bf8a318a6c72", "name": "/usr/lib/python3.12/encodings/cp037.py", "type": "file" }, { - "bom-ref": "016655bab285fae3", + "bom-ref": "2724e1f195065b6b", "name": "/usr/lib/python3.12/encodings/cp1006.py", "type": "file" }, { - "bom-ref": "430bd68bf8a10012", + "bom-ref": "6d7f3fa5c69b3d5e", "name": "/usr/lib/python3.12/encodings/cp1026.py", "type": "file" }, { - "bom-ref": "8bce64581ff62240", + "bom-ref": "b9a4c0a3a68ec9d4", "name": "/usr/lib/python3.12/encodings/cp1125.py", "type": "file" }, { - "bom-ref": "443a21c3aab583a3", + "bom-ref": "0726a8749998bf87", "name": "/usr/lib/python3.12/encodings/cp1140.py", "type": "file" }, { - "bom-ref": "21a0ac333057a59a", + "bom-ref": "8e9038c2671ecdb6", "name": "/usr/lib/python3.12/encodings/cp1250.py", "type": "file" }, { - "bom-ref": "055ab5de92cbfddf", + "bom-ref": "9bc9f45566cd9473", "name": "/usr/lib/python3.12/encodings/cp1251.py", "type": "file" }, { - "bom-ref": "398dcdf3d81d1b80", + "bom-ref": "66a64c5e64af246c", "name": "/usr/lib/python3.12/encodings/cp1252.py", "type": "file" }, { - "bom-ref": "6a96eb1af5ba16ab", + "bom-ref": "b94eac144043034b", "name": "/usr/lib/python3.12/encodings/cp1253.py", "type": "file" }, { - "bom-ref": "258f989b62725239", + "bom-ref": "8c6e6cb727ff7f45", "name": "/usr/lib/python3.12/encodings/cp1254.py", "type": "file" }, { - "bom-ref": "3876fa1334762db2", + "bom-ref": "158317e2075e32ae", "name": "/usr/lib/python3.12/encodings/cp1255.py", "type": "file" }, { - "bom-ref": "a1f53ad021392b63", + "bom-ref": "2d922033c75e637f", "name": "/usr/lib/python3.12/encodings/cp1256.py", "type": "file" }, { - "bom-ref": "4b41918a0bd37c4e", + "bom-ref": "4067a8ab9d6dd7ee", "name": "/usr/lib/python3.12/encodings/cp1257.py", "type": "file" }, { - "bom-ref": "4b1c5fdcebaf2f01", + "bom-ref": "618b02ec109f68b1", "name": "/usr/lib/python3.12/encodings/cp1258.py", "type": "file" }, { - "bom-ref": "365da722a88873ee", + "bom-ref": "0bf9421af97484ee", "name": "/usr/lib/python3.12/encodings/cp273.py", "type": "file" }, { - "bom-ref": "8d45afaf90e9781f", + "bom-ref": "f041633b6fabfe2b", "name": "/usr/lib/python3.12/encodings/cp424.py", "type": "file" }, { - "bom-ref": "bcd67804ed7d7ef3", + "bom-ref": "37984711613bcc13", "name": "/usr/lib/python3.12/encodings/cp437.py", "type": "file" }, { - "bom-ref": "c2eca64e1818ae5f", + "bom-ref": "10471f2d2d06ce63", "name": "/usr/lib/python3.12/encodings/cp500.py", "type": "file" }, { - "bom-ref": "09422bafb241706d", + "bom-ref": "b7f47e50cd2a0941", "name": "/usr/lib/python3.12/encodings/cp720.py", "type": "file" }, { - "bom-ref": "bd2c15e2765bc3ce", + "bom-ref": "b1aacef7bbe1dc6a", "name": "/usr/lib/python3.12/encodings/cp737.py", "type": "file" }, { - "bom-ref": "5b6dba0bb7ff6635", + "bom-ref": "cf6592aadbe99f89", "name": "/usr/lib/python3.12/encodings/cp775.py", "type": "file" }, { - "bom-ref": "bc12c06d54b2ec13", + "bom-ref": "128800e1131ddc2b", "name": "/usr/lib/python3.12/encodings/cp850.py", "type": "file" }, { - "bom-ref": "2ec09fb02c48487f", + "bom-ref": "b4481a51404ea293", "name": "/usr/lib/python3.12/encodings/cp852.py", "type": "file" }, { - "bom-ref": "7f920fabf330b327", + "bom-ref": "acfefa52bfb766cb", "name": "/usr/lib/python3.12/encodings/cp855.py", "type": "file" }, { - "bom-ref": "73b0d4f5323b7ca2", + "bom-ref": "85fee6b33ef0f98e", "name": "/usr/lib/python3.12/encodings/cp856.py", "type": "file" }, { - "bom-ref": "722697ba16484ac6", + "bom-ref": "1575a7185b6b351a", "name": "/usr/lib/python3.12/encodings/cp857.py", "type": "file" }, { - "bom-ref": "8a7e44d140fd3e92", + "bom-ref": "6a680463fd34bff2", "name": "/usr/lib/python3.12/encodings/cp858.py", "type": "file" }, { - "bom-ref": "f7fb352e63d093ad", + "bom-ref": "e3e389da2189bbd5", "name": "/usr/lib/python3.12/encodings/cp860.py", "type": "file" }, { - "bom-ref": "7f7eaf6272bb5a8c", + "bom-ref": "10c499cac9e71d0c", "name": "/usr/lib/python3.12/encodings/cp861.py", "type": "file" }, { - "bom-ref": "426f7b8ea2051fc7", + "bom-ref": "df61f3e1cb9e8ae3", "name": "/usr/lib/python3.12/encodings/cp862.py", "type": "file" }, { - "bom-ref": "0574d1687325aaad", + "bom-ref": "6c7fc93c5989f4a9", "name": "/usr/lib/python3.12/encodings/cp863.py", "type": "file" }, { - "bom-ref": "b01fdbe136b904be", + "bom-ref": "f764f70e2d95e136", "name": "/usr/lib/python3.12/encodings/cp864.py", "type": "file" }, { - "bom-ref": "5fa6b05039bc136a", + "bom-ref": "1e1e9b227b4b6532", "name": "/usr/lib/python3.12/encodings/cp865.py", "type": "file" }, { - "bom-ref": "6c0f2a318addf72b", + "bom-ref": "c61049b7ca1d0373", "name": "/usr/lib/python3.12/encodings/cp866.py", "type": "file" }, { - "bom-ref": "0d2f0d2349484e6f", + "bom-ref": "e02555362a9aacb7", "name": "/usr/lib/python3.12/encodings/cp869.py", "type": "file" }, { - "bom-ref": "c08bfcb53dfd004a", + "bom-ref": "0f8ab421de10973a", "name": "/usr/lib/python3.12/encodings/cp874.py", "type": "file" }, { - "bom-ref": "5cd97ad3bee50a49", + "bom-ref": "5b00992179d8b3fd", "name": "/usr/lib/python3.12/encodings/cp875.py", "type": "file" }, { - "bom-ref": "00afb60d0354b889", + "bom-ref": "1cb4d7645d2307c9", "name": "/usr/lib/python3.12/encodings/cp932.py", "type": "file" }, { - "bom-ref": "6c528cf047213118", + "bom-ref": "786f7ac2b7154590", "name": "/usr/lib/python3.12/encodings/cp949.py", "type": "file" }, { - "bom-ref": "9c57ed7b13070cef", + "bom-ref": "6a5cf860e5426d23", "name": "/usr/lib/python3.12/encodings/cp950.py", "type": "file" }, { - "bom-ref": "3d3bfb4dcc5bda71", + "bom-ref": "03d755785c96d685", "name": "/usr/lib/python3.12/encodings/euc_jis_2004.py", "type": "file" }, { - "bom-ref": "ae9b7cb8c145f31d", + "bom-ref": "ecf2cec29f0c9cf1", "name": "/usr/lib/python3.12/encodings/euc_jisx0213.py", "type": "file" }, { - "bom-ref": "be7d63ebb02a0363", + "bom-ref": "879f729e328b346f", "name": "/usr/lib/python3.12/encodings/euc_jp.py", "type": "file" }, { - "bom-ref": "efdb71550b91eb5d", + "bom-ref": "b42e27682cea7f25", "name": "/usr/lib/python3.12/encodings/euc_kr.py", "type": "file" }, { - "bom-ref": "a9b944fe9782d663", + "bom-ref": "889dc89c536ca8ff", "name": "/usr/lib/python3.12/encodings/gb18030.py", "type": "file" }, { - "bom-ref": "c87d4700d03f98a5", + "bom-ref": "510dba4e70b8c611", "name": "/usr/lib/python3.12/encodings/gb2312.py", "type": "file" }, { - "bom-ref": "bf6f4c6fc8ffacad", + "bom-ref": "6283e27d38d93f7d", "name": "/usr/lib/python3.12/encodings/gbk.py", "type": "file" }, { - "bom-ref": "111ae01854e724a0", + "bom-ref": "82aa2bef52b388f8", "name": "/usr/lib/python3.12/encodings/hex_codec.py", "type": "file" }, { - "bom-ref": "df2f96f491dc5eed", + "bom-ref": "7e76ed15143bad1d", "name": "/usr/lib/python3.12/encodings/hp_roman8.py", "type": "file" }, { - "bom-ref": "87b2db38172f7f93", + "bom-ref": "e914eda3a91bf0a3", "name": "/usr/lib/python3.12/encodings/hz.py", "type": "file" }, { - "bom-ref": "ed7c5b111f218d9f", + "bom-ref": "0f13481bd4e56bef", "name": "/usr/lib/python3.12/encodings/idna.py", "type": "file" }, { - "bom-ref": "afa02528d5dc455e", + "bom-ref": "aa2cd9495d8b67e2", "name": "/usr/lib/python3.12/encodings/iso2022_jp.py", "type": "file" }, { - "bom-ref": "3298df198f9892a7", + "bom-ref": "70799c0f7c49c027", "name": "/usr/lib/python3.12/encodings/iso2022_jp_1.py", "type": "file" }, { - "bom-ref": "ff7a5c2b1eef2f22", + "bom-ref": "b762e4dbf3e7a5fe", "name": "/usr/lib/python3.12/encodings/iso2022_jp_2.py", "type": "file" }, { - "bom-ref": "88e830fd229f8253", + "bom-ref": "b411ea4e1a98e96b", "name": "/usr/lib/python3.12/encodings/iso2022_jp_2004.py", "type": "file" }, { - "bom-ref": "a598c09beb06b73e", + "bom-ref": "9b7c5bfc046caad6", "name": "/usr/lib/python3.12/encodings/iso2022_jp_3.py", "type": "file" }, { - "bom-ref": "02674e26c07c0367", + "bom-ref": "42e598001deca41b", "name": "/usr/lib/python3.12/encodings/iso2022_jp_ext.py", "type": "file" }, { - "bom-ref": "7050cf88103f49ce", + "bom-ref": "afe858c0c24ee2ae", "name": "/usr/lib/python3.12/encodings/iso2022_kr.py", "type": "file" }, { - "bom-ref": "25a7ab0065a537a6", + "bom-ref": "76bf537cc302f102", "name": "/usr/lib/python3.12/encodings/iso8859_1.py", "type": "file" }, { - "bom-ref": "2a87ad4efa149f6b", + "bom-ref": "c551c54de5f37037", "name": "/usr/lib/python3.12/encodings/iso8859_10.py", "type": "file" }, { - "bom-ref": "a94ceffd9d167ecc", + "bom-ref": "215acfdac634e564", "name": "/usr/lib/python3.12/encodings/iso8859_11.py", "type": "file" }, { - "bom-ref": "03643f89fae6d1d0", + "bom-ref": "8018c84b0db6fd1c", "name": "/usr/lib/python3.12/encodings/iso8859_13.py", "type": "file" }, { - "bom-ref": "69727367b307b757", + "bom-ref": "b8b12b13488c91d3", "name": "/usr/lib/python3.12/encodings/iso8859_14.py", "type": "file" }, { - "bom-ref": "fe878779b6d7c193", + "bom-ref": "b307f9c0ac90d6b7", "name": "/usr/lib/python3.12/encodings/iso8859_15.py", "type": "file" }, { - "bom-ref": "d6720221262cd6e2", + "bom-ref": "7d053ba9e970ef6e", "name": "/usr/lib/python3.12/encodings/iso8859_16.py", "type": "file" }, { - "bom-ref": "0a7b0af49df28864", + "bom-ref": "d3fba315ddd52fb0", "name": "/usr/lib/python3.12/encodings/iso8859_2.py", "type": "file" }, { - "bom-ref": "6708e6fc023f79ed", + "bom-ref": "e6defa25cb76ae8d", "name": "/usr/lib/python3.12/encodings/iso8859_3.py", "type": "file" }, { - "bom-ref": "d1e12f6657cbd5b3", + "bom-ref": "2f7e23ba74b5293f", "name": "/usr/lib/python3.12/encodings/iso8859_4.py", "type": "file" }, { - "bom-ref": "cc6e682514466f31", + "bom-ref": "3d87ee3597e73301", "name": "/usr/lib/python3.12/encodings/iso8859_5.py", "type": "file" }, { - "bom-ref": "c0579bbe34f10379", + "bom-ref": "377b91e9c07d6499", "name": "/usr/lib/python3.12/encodings/iso8859_6.py", "type": "file" }, { - "bom-ref": "8c12587f03c522e4", + "bom-ref": "43b2f0c068ed88e0", "name": "/usr/lib/python3.12/encodings/iso8859_7.py", "type": "file" }, { - "bom-ref": "589432b76a1600ad", + "bom-ref": "d5ac985393c688bd", "name": "/usr/lib/python3.12/encodings/iso8859_8.py", "type": "file" }, { - "bom-ref": "442127c8f0e08d42", + "bom-ref": "ee39662f9776309e", "name": "/usr/lib/python3.12/encodings/iso8859_9.py", "type": "file" }, { - "bom-ref": "c4cbad46199be967", + "bom-ref": "43b6e5e986d5d117", "name": "/usr/lib/python3.12/encodings/johab.py", "type": "file" }, { - "bom-ref": "6c6ae8d3d9034466", + "bom-ref": "d1827a78693f555e", "name": "/usr/lib/python3.12/encodings/koi8_r.py", "type": "file" }, { - "bom-ref": "7a5804b6471c4c4b", + "bom-ref": "9b985bf18fe5595f", "name": "/usr/lib/python3.12/encodings/koi8_t.py", "type": "file" }, { - "bom-ref": "9a2eb5d09ce4f62f", + "bom-ref": "7866ffac1bde1afb", "name": "/usr/lib/python3.12/encodings/koi8_u.py", "type": "file" }, { - "bom-ref": "c36b16b0a29c1682", + "bom-ref": "1b74e0c8373d056a", "name": "/usr/lib/python3.12/encodings/kz1048.py", "type": "file" }, { - "bom-ref": "81dfb69c73697707", + "bom-ref": "541538451f658873", "name": "/usr/lib/python3.12/encodings/latin_1.py", "type": "file" }, { - "bom-ref": "b41e526db2a17080", + "bom-ref": "dfc12f626c1d07ec", "name": "/usr/lib/python3.12/encodings/mac_arabic.py", "type": "file" }, { - "bom-ref": "afde8caf60205d2b", + "bom-ref": "f540be27ef960dd7", "name": "/usr/lib/python3.12/encodings/mac_croatian.py", "type": "file" }, { - "bom-ref": "ea760959451823b3", + "bom-ref": "1ae3a05c8ea6ff5f", "name": "/usr/lib/python3.12/encodings/mac_cyrillic.py", "type": "file" }, { - "bom-ref": "41ea5359cc44f619", + "bom-ref": "39af9559de8e9f45", "name": "/usr/lib/python3.12/encodings/mac_farsi.py", "type": "file" }, { - "bom-ref": "bf884ec9444090be", + "bom-ref": "6acf79350c0a3a96", "name": "/usr/lib/python3.12/encodings/mac_greek.py", "type": "file" }, { - "bom-ref": "dcd93bd4de34313a", + "bom-ref": "24dfc8f1a1be0072", "name": "/usr/lib/python3.12/encodings/mac_iceland.py", "type": "file" }, { - "bom-ref": "9f6d5dea53ce9f9f", + "bom-ref": "03eaacce612c46b7", "name": "/usr/lib/python3.12/encodings/mac_latin2.py", "type": "file" }, { - "bom-ref": "c8a92389db14dbf8", + "bom-ref": "3e0765c2029aead4", "name": "/usr/lib/python3.12/encodings/mac_roman.py", "type": "file" }, { - "bom-ref": "a9b66a7f461c80c8", + "bom-ref": "ff525e21d6df9238", "name": "/usr/lib/python3.12/encodings/mac_romanian.py", "type": "file" }, { - "bom-ref": "ccfb34c39a8a9ee8", + "bom-ref": "e11af69637739048", "name": "/usr/lib/python3.12/encodings/mac_turkish.py", "type": "file" }, { - "bom-ref": "529fc51d608fe82c", + "bom-ref": "e78d5b0b84f3d060", "name": "/usr/lib/python3.12/encodings/mbcs.py", "type": "file" }, { - "bom-ref": "23919f352c009e1c", + "bom-ref": "8d8436d90f34ea94", "name": "/usr/lib/python3.12/encodings/oem.py", "type": "file" }, { - "bom-ref": "0d433c541b661169", + "bom-ref": "3659fc39d0be4525", "name": "/usr/lib/python3.12/encodings/palmos.py", "type": "file" }, { - "bom-ref": "94157a120d5a7ec0", + "bom-ref": "51621c9ecf984030", "name": "/usr/lib/python3.12/encodings/ptcp154.py", "type": "file" }, { - "bom-ref": "25a0c1c4a96858a8", + "bom-ref": "59abbe35647ff744", "name": "/usr/lib/python3.12/encodings/punycode.py", "type": "file" }, { - "bom-ref": "65ed265ad4ae2c2b", + "bom-ref": "b2731394d052170f", "name": "/usr/lib/python3.12/encodings/quopri_codec.py", "type": "file" }, { - "bom-ref": "7d146223f65f830f", + "bom-ref": "d8a077f9447505f7", "name": "/usr/lib/python3.12/encodings/raw_unicode_escape.py", "type": "file" }, { - "bom-ref": "0cc3da73ec171eab", + "bom-ref": "e288b107bfacb033", "name": "/usr/lib/python3.12/encodings/rot_13.py", "type": "file" }, { - "bom-ref": "b43d9e7a8b1e08af", + "bom-ref": "a8c6a96ac23155e7", "name": "/usr/lib/python3.12/encodings/shift_jis.py", "type": "file" }, { - "bom-ref": "db7de7314117325a", + "bom-ref": "aae4536b6a7df74e", "name": "/usr/lib/python3.12/encodings/shift_jis_2004.py", "type": "file" }, { - "bom-ref": "0e0b813b205d16c0", + "bom-ref": "d79a45f386a5378c", "name": "/usr/lib/python3.12/encodings/shift_jisx0213.py", "type": "file" }, { - "bom-ref": "c3bf83f6d0eb9d47", + "bom-ref": "44e3d28d3c9fab23", "name": "/usr/lib/python3.12/encodings/tis_620.py", "type": "file" }, { - "bom-ref": "e0d196286daf5322", + "bom-ref": "8c3580569d5b0a72", "name": "/usr/lib/python3.12/encodings/undefined.py", "type": "file" }, { - "bom-ref": "88bbe130cb5b46f5", + "bom-ref": "9caa7832ca61f52d", "name": "/usr/lib/python3.12/encodings/unicode_escape.py", "type": "file" }, { - "bom-ref": "298e84eb1cc86e38", + "bom-ref": "3060924f1641b7d8", "name": "/usr/lib/python3.12/encodings/utf_16.py", "type": "file" }, { - "bom-ref": "f7695f950b25e96d", + "bom-ref": "c8a7574f21fac1b1", "name": "/usr/lib/python3.12/encodings/utf_16_be.py", "type": "file" }, { - "bom-ref": "4a9efb9c8c4c124d", + "bom-ref": "d215ac14d4e973a9", "name": "/usr/lib/python3.12/encodings/utf_16_le.py", "type": "file" }, { - "bom-ref": "68f9566626371242", + "bom-ref": "d95e6f7d3ee6146a", "name": "/usr/lib/python3.12/encodings/utf_32.py", "type": "file" }, { - "bom-ref": "99f288f7ac9e3ece", + "bom-ref": "71c745ac505065e6", "name": "/usr/lib/python3.12/encodings/utf_32_be.py", "type": "file" }, { - "bom-ref": "19ae8d802b900176", + "bom-ref": "bedd978b01e556e6", "name": "/usr/lib/python3.12/encodings/utf_32_le.py", "type": "file" }, { - "bom-ref": "35f674c2cf83b0cb", + "bom-ref": "f5fccca2e582110f", "name": "/usr/lib/python3.12/encodings/utf_7.py", "type": "file" }, { - "bom-ref": "929cfc5ca2c2d296", + "bom-ref": "614adb7eb7be083e", "name": "/usr/lib/python3.12/encodings/utf_8.py", "type": "file" }, { - "bom-ref": "ce5882bfeed14fb5", + "bom-ref": "96494eafa1a7f831", "name": "/usr/lib/python3.12/encodings/utf_8_sig.py", "type": "file" }, { - "bom-ref": "4160232435dfdca1", + "bom-ref": "a2d9645749691991", "name": "/usr/lib/python3.12/encodings/uu_codec.py", "type": "file" }, { - "bom-ref": "5affab6712f359fa", + "bom-ref": "4b99b03f373edfaa", "name": "/usr/lib/python3.12/encodings/zlib_codec.py", "type": "file" }, { - "bom-ref": "b1ef6981a6d5efdb", + "bom-ref": "87456876732db1c3", "name": "/usr/lib/python3.12/enum.py", "type": "file" }, { - "bom-ref": "06d253eb3daef1bc", + "bom-ref": "34e5890ffa45d3b4", "name": "/usr/lib/python3.12/filecmp.py", "type": "file" }, { - "bom-ref": "d6be70af8455cbc9", + "bom-ref": "ba86b52498a134a1", "name": "/usr/lib/python3.12/fileinput.py", "type": "file" }, { - "bom-ref": "6efeae20d0a67a81", + "bom-ref": "98cfda007286ac89", "name": "/usr/lib/python3.12/fnmatch.py", "type": "file" }, { - "bom-ref": "8271b66f039613ef", + "bom-ref": "dd2fe84a949648ef", "name": "/usr/lib/python3.12/fractions.py", "type": "file" }, { - "bom-ref": "f7c4b959bc2d0713", + "bom-ref": "29db2bfe498a185b", "name": "/usr/lib/python3.12/ftplib.py", "type": "file" }, { - "bom-ref": "cd377a9e0a127ec6", + "bom-ref": "668d5c8ff38503a2", "name": "/usr/lib/python3.12/functools.py", "type": "file" }, { - "bom-ref": "d2fff31c5d25af1a", + "bom-ref": "718975ec5ec238a6", "name": "/usr/lib/python3.12/genericpath.py", "type": "file" }, { - "bom-ref": "2a23ccb13670dea7", + "bom-ref": "1ecfe4a22309e20b", "name": "/usr/lib/python3.12/getopt.py", "type": "file" }, { - "bom-ref": "561293b808735820", + "bom-ref": "24042a40a3492fc8", "name": "/usr/lib/python3.12/getpass.py", "type": "file" }, { - "bom-ref": "d7d3dd1d5e91f5f1", + "bom-ref": "4b79f9108b3b60d5", "name": "/usr/lib/python3.12/gettext.py", "type": "file" }, { - "bom-ref": "b399501830f71353", + "bom-ref": "f456d63e95c25ceb", "name": "/usr/lib/python3.12/glob.py", "type": "file" }, { - "bom-ref": "cf1b454ed50b674c", + "bom-ref": "e4ecdde4a0e70760", "name": "/usr/lib/python3.12/graphlib.py", "type": "file" }, { - "bom-ref": "e25e60625938d25b", + "bom-ref": "e4aa4aa9b18fc943", "name": "/usr/lib/python3.12/gzip.py", "type": "file" }, { - "bom-ref": "7809f7c6b5eda291", + "bom-ref": "4f9b363faa6a01cd", "name": "/usr/lib/python3.12/hashlib.py", "type": "file" }, { - "bom-ref": "45ba73b7c012c6d8", + "bom-ref": "f273d6e95f60d8c4", "name": "/usr/lib/python3.12/heapq.py", "type": "file" }, { - "bom-ref": "81d9e0227dd7b0f8", + "bom-ref": "6d1f778c3bda51c8", "name": "/usr/lib/python3.12/hmac.py", "type": "file" }, { - "bom-ref": "5ec936dd696550c7", + "bom-ref": "a8c1234f7a956fcf", "name": "/usr/lib/python3.12/html/__init__.py", "type": "file" }, { - "bom-ref": "2db079270b193a33", + "bom-ref": "1fabff1ce7c233c3", "name": "/usr/lib/python3.12/html/entities.py", "type": "file" }, { - "bom-ref": "f8fa33d9cafdf5b4", + "bom-ref": "7162e5a67900ab84", "name": "/usr/lib/python3.12/html/parser.py", "type": "file" }, { - "bom-ref": "63721045cc92e6f5", + "bom-ref": "eb21be68d33b9f75", "name": "/usr/lib/python3.12/http/__init__.py", "type": "file" }, { - "bom-ref": "623d5907b67e6130", + "bom-ref": "f731055d0f623294", "name": "/usr/lib/python3.12/http/client.py", "type": "file" }, { - "bom-ref": "f60d0dfe5a80f062", + "bom-ref": "366813eb5aaec51a", "name": "/usr/lib/python3.12/http/cookiejar.py", "type": "file" }, { - "bom-ref": "c0c9c464b7037236", + "bom-ref": "63851a4289a1e0fa", "name": "/usr/lib/python3.12/http/cookies.py", "type": "file" }, { - "bom-ref": "7afaef4f69b68103", + "bom-ref": "d5a0a5b5df3e995f", "name": "/usr/lib/python3.12/http/server.py", "type": "file" }, { - "bom-ref": "16dce3f2f8e72b92", + "bom-ref": "c2c9e46c4da37962", "name": "/usr/lib/python3.12/imaplib.py", "type": "file" }, { - "bom-ref": "e4a1829cace34233", + "bom-ref": "37f5d7c0b3e1c68b", "name": "/usr/lib/python3.12/imghdr.py", "type": "file" }, { - "bom-ref": "8f629628d62334f1", + "bom-ref": "113b593ba76e80f5", "name": "/usr/lib/python3.12/importlib/__init__.py", "type": "file" }, { - "bom-ref": "3579613ce9563fe3", + "bom-ref": "53d45615a588613b", "name": "/usr/lib/python3.12/importlib/_abc.py", "type": "file" }, { - "bom-ref": "da8e9d8dac61bdc2", + "bom-ref": "4e36a511718ac32e", "name": "/usr/lib/python3.12/importlib/_bootstrap.py", "type": "file" }, { - "bom-ref": "fe078de43bcb8590", + "bom-ref": "f6522b5bbc144620", "name": "/usr/lib/python3.12/importlib/_bootstrap_external.py", "type": "file" }, { - "bom-ref": "ca8fe7ebaf18c5ba", + "bom-ref": "e02806146b5c00fa", "name": "/usr/lib/python3.12/importlib/abc.py", "type": "file" }, { - "bom-ref": "fcfa2badd6c6bec8", + "bom-ref": "fbca32d21218d4e0", "name": "/usr/lib/python3.12/importlib/machinery.py", "type": "file" }, { - "bom-ref": "4acf95091f196cf8", + "bom-ref": "a591deb27a2f2338", "name": "/usr/lib/python3.12/importlib/metadata/__init__.py", "type": "file" }, { - "bom-ref": "3ccdc0c3b4928f66", + "bom-ref": "79a82d95218a273a", "name": "/usr/lib/python3.12/importlib/metadata/_adapters.py", "type": "file" }, { - "bom-ref": "8fe6359b50c464f0", + "bom-ref": "a5eaa6d3c6cbff8c", "name": "/usr/lib/python3.12/importlib/metadata/_collections.py", "type": "file" }, { - "bom-ref": "0c1d16d314a3028d", + "bom-ref": "338850bfd30c417d", "name": "/usr/lib/python3.12/importlib/metadata/_functools.py", "type": "file" }, { - "bom-ref": "89928210f0434d19", + "bom-ref": "746b1f4397eabb49", "name": "/usr/lib/python3.12/importlib/metadata/_itertools.py", "type": "file" }, { - "bom-ref": "25938c3f33b85d28", + "bom-ref": "8219b757aeb2f9d8", "name": "/usr/lib/python3.12/importlib/metadata/_meta.py", "type": "file" }, { - "bom-ref": "59457c5bc93d4df4", + "bom-ref": "54ef2204cfbe6c0c", "name": "/usr/lib/python3.12/importlib/metadata/_text.py", "type": "file" }, { - "bom-ref": "b976c692b71e7a75", + "bom-ref": "897fbb27dfc80861", "name": "/usr/lib/python3.12/importlib/readers.py", "type": "file" }, { - "bom-ref": "d24d7892c3ef8c69", + "bom-ref": "2ea241adf5d84115", "name": "/usr/lib/python3.12/importlib/resources/__init__.py", "type": "file" }, { - "bom-ref": "5ff1249c3c46a8f0", + "bom-ref": "a439607432abc4f8", "name": "/usr/lib/python3.12/importlib/resources/_adapters.py", "type": "file" }, { - "bom-ref": "3b4fab0c56033952", + "bom-ref": "1759e57be07bd9fa", "name": "/usr/lib/python3.12/importlib/resources/_common.py", "type": "file" }, { - "bom-ref": "a18f2f42229321a2", + "bom-ref": "88fb7d4ad82b18ce", "name": "/usr/lib/python3.12/importlib/resources/_itertools.py", "type": "file" }, { - "bom-ref": "c19c7c245b79eb18", + "bom-ref": "d763d008d1adc2b0", "name": "/usr/lib/python3.12/importlib/resources/_legacy.py", "type": "file" }, { - "bom-ref": "3f2870d4a4e3e13f", + "bom-ref": "70caac196b013977", "name": "/usr/lib/python3.12/importlib/resources/abc.py", "type": "file" }, { - "bom-ref": "65e473bceb4645d4", + "bom-ref": "58aa6b9a5424c608", "name": "/usr/lib/python3.12/importlib/resources/readers.py", "type": "file" }, { - "bom-ref": "c772a79d5c64ad6f", + "bom-ref": "3a3c4788d816439f", "name": "/usr/lib/python3.12/importlib/resources/simple.py", "type": "file" }, { - "bom-ref": "95e797174f36579d", + "bom-ref": "342da0d0204036fd", "name": "/usr/lib/python3.12/importlib/simple.py", "type": "file" }, { - "bom-ref": "4143481dadbb0573", + "bom-ref": "f7f47bb7b89d65bf", "name": "/usr/lib/python3.12/importlib/util.py", "type": "file" }, { - "bom-ref": "72e7c84ccd8269df", + "bom-ref": "8a0295a936113c77", "name": "/usr/lib/python3.12/inspect.py", "type": "file" }, { - "bom-ref": "e3902a728aee717d", + "bom-ref": "7e63e26a0b4a4f41", "name": "/usr/lib/python3.12/io.py", "type": "file" }, { - "bom-ref": "2dc73318fdfd326e", + "bom-ref": "f3f9a3915c3b37d6", "name": "/usr/lib/python3.12/ipaddress.py", "type": "file" }, { - "bom-ref": "97000dc04eba5a64", + "bom-ref": "942e52048166335c", "name": "/usr/lib/python3.12/json/__init__.py", "type": "file" }, { - "bom-ref": "31daaa3f2b6157bb", + "bom-ref": "81670997bf7aaec3", "name": "/usr/lib/python3.12/json/decoder.py", "type": "file" }, { - "bom-ref": "4032cb3ec2973d19", + "bom-ref": "a856fc0a97e24529", "name": "/usr/lib/python3.12/json/encoder.py", "type": "file" }, { - "bom-ref": "dd1eb48bcb7d3756", + "bom-ref": "b32551643fa2198e", "name": "/usr/lib/python3.12/json/scanner.py", "type": "file" }, { - "bom-ref": "fc0443b7eda56dde", + "bom-ref": "97b9638eea47eb82", "name": "/usr/lib/python3.12/json/tool.py", "type": "file" }, { - "bom-ref": "0b952683197554af", + "bom-ref": "4484a63ef65714af", "name": "/usr/lib/python3.12/keyword.py", "type": "file" }, { - "bom-ref": "9a26329066ef38ee", + "bom-ref": "3fb6b0939c4255d6", "name": "/usr/lib/python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "3fbb27202990deee", + "bom-ref": "2338e40d3b8af9a6", "name": "/usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "ba5f0a2d0a6f1a2a", + "bom-ref": "90a93e91c26d868e", "name": "/usr/lib/python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "0a580e468bfb0d2e", + "bom-ref": "02eb49ecf3cfa0aa", "name": "/usr/lib/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "2a09d4a73a30dc58", + "bom-ref": "1ea68966c1df9a88", "name": "/usr/lib/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "46a467ce480260e6", + "bom-ref": "565771a52ccfceea", "name": "/usr/lib/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "350fe9b9a7e489b8", + "bom-ref": "a6888a02fc83aacc", "name": "/usr/lib/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "89fcb2f581a15f52", + "bom-ref": "644eb609ecdf32a2", "name": "/usr/lib/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "d35e1693fe80224c", + "bom-ref": "c5e8b1634f5b1ff8", "name": "/usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "d6236e5611b8ef32", + "bom-ref": "9de38dfe50b905f2", "name": "/usr/lib/python3.12/lib-dynload/_crypt.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "4d222d8e2116d1c5", + "bom-ref": "763b078d891f2999", "name": "/usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "31732210e3583ea4", + "bom-ref": "062650533f0a6938", "name": "/usr/lib/python3.12/lib-dynload/_ctypes_test.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "92b6aec5fa08edab", + "bom-ref": "0f74734008a13af3", "name": "/usr/lib/python3.12/lib-dynload/_curses.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "af3cfbb1d642fc8f", + "bom-ref": "779e6c27971d12e3", "name": "/usr/lib/python3.12/lib-dynload/_curses_panel.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "eaf0e7396ff808b1", + "bom-ref": "01d7091178f460cd", "name": "/usr/lib/python3.12/lib-dynload/_dbm.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "4e878c69e6c600d7", + "bom-ref": "72e1e4b062d9cc07", "name": "/usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "3e116f9b5e6c0958", + "bom-ref": "d4ad21e1c225b898", "name": "/usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "145db8249e2af2f6", + "bom-ref": "ea0364cd73034aa2", "name": "/usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "28401db38048bd3a", + "bom-ref": "7f8d12c4a02e6c76", "name": "/usr/lib/python3.12/lib-dynload/_lsprof.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "fe4e705486048299", + "bom-ref": "7748bfcd5feb7955", "name": "/usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "6ca976186456ffd1", + "bom-ref": "348114e43cafe54d", "name": "/usr/lib/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "a60a4a6f2de87d0a", + "bom-ref": "d4a8ef918c6908d2", "name": "/usr/lib/python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "35bd9d72d1757b8f", + "bom-ref": "ce3f8e36be2f08a3", "name": "/usr/lib/python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "d53d49fd895ef174", + "bom-ref": "27e9e9a56fc752bc", "name": "/usr/lib/python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "264fdb512fad9587", + "bom-ref": "e3f4d1f94527c98f", "name": "/usr/lib/python3.12/lib-dynload/_sqlite3.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "b58b0d53904786a4", + "bom-ref": "9147aae596bead34", "name": "/usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "6c33d9c0721fe9b3", + "bom-ref": "e4cfbbc37cf03577", "name": "/usr/lib/python3.12/lib-dynload/_testbuffer.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "0e245814a4a5a310", + "bom-ref": "1f55d1d1459344f4", "name": "/usr/lib/python3.12/lib-dynload/_testcapi.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "ce1c312c6ccac374", + "bom-ref": "a41f40def8a5ae20", "name": "/usr/lib/python3.12/lib-dynload/_testclinic.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "336da8d2549d8092", + "bom-ref": "98ee464cea3fffaa", "name": "/usr/lib/python3.12/lib-dynload/_testimportmultiple.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "b0102a30c224dead", + "bom-ref": "49c067d0f09ec755", "name": "/usr/lib/python3.12/lib-dynload/_testinternalcapi.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "5dacf978cb0a7812", + "bom-ref": "63c06a9d21d46956", "name": "/usr/lib/python3.12/lib-dynload/_testmultiphase.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "e83a3c4d61d443cd", + "bom-ref": "555945cdc68d75e1", "name": "/usr/lib/python3.12/lib-dynload/_testsinglephase.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "409a0c2ac485b38f", + "bom-ref": "c9809db985f8f49b", "name": "/usr/lib/python3.12/lib-dynload/_xxinterpchannels.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "8d14902b9b08c360", + "bom-ref": "77b824fccac7fd58", "name": "/usr/lib/python3.12/lib-dynload/_xxsubinterpreters.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "a7bb56dada73dbe4", + "bom-ref": "c2b52d48a9853990", "name": "/usr/lib/python3.12/lib-dynload/_xxtestfuzz.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "237f605e61baeb74", + "bom-ref": "e6c2c29aea0d1ee4", "name": "/usr/lib/python3.12/lib-dynload/_zoneinfo.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "6608a484076d6765", + "bom-ref": "e7db1f3d0cea7539", "name": "/usr/lib/python3.12/lib-dynload/audioop.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "32d8b9def83efe4e", + "bom-ref": "819bf3c91fddd33e", "name": "/usr/lib/python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "a76b93b3da71153e", + "bom-ref": "d54358ffff61ee96", "name": "/usr/lib/python3.12/lib-dynload/ossaudiodev.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "b332ae07ab3f7e75", + "bom-ref": "768ae52989846cc1", "name": "/usr/lib/python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "f8d3c114d11f63dc", + "bom-ref": "2e093b6bae62e0a0", "name": "/usr/lib/python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "fddea9695fca2ef5", + "bom-ref": "339d0660b24a0949", "name": "/usr/lib/python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "99b9c4b0e0bba5cf", + "bom-ref": "db276f92319ec767", "name": "/usr/lib/python3.12/lib-dynload/xxlimited.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "e09351ef6076c6e7", + "bom-ref": "6de6085e4227699b", "name": "/usr/lib/python3.12/lib-dynload/xxlimited_35.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "0121c4c4a6568c8a", + "bom-ref": "1a28e4368a2aa912", "name": "/usr/lib/python3.12/lib-dynload/xxsubtype.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "7e0b1d91899c6cdb", + "bom-ref": "caaa587ffd6da903", "name": "/usr/lib/python3.12/linecache.py", "type": "file" }, { - "bom-ref": "f9a7bad72d2f45e4", + "bom-ref": "64ece53ed0cb4a38", "name": "/usr/lib/python3.12/locale.py", "type": "file" }, { - "bom-ref": "42a2f466692cc0ea", + "bom-ref": "c5bd9aaa4e0f747e", "name": "/usr/lib/python3.12/logging/__init__.py", "type": "file" }, { - "bom-ref": "02bb6861f363d397", + "bom-ref": "680e2c02145da5df", "name": "/usr/lib/python3.12/logging/config.py", "type": "file" }, { - "bom-ref": "4d073c150b86d8cc", + "bom-ref": "556426201cbed8a0", "name": "/usr/lib/python3.12/logging/handlers.py", "type": "file" }, { - "bom-ref": "b1cec1a407073e0c", + "bom-ref": "50850c02a1deaefc", "name": "/usr/lib/python3.12/lzma.py", "type": "file" }, { - "bom-ref": "b0322ca41cd7afeb", + "bom-ref": "fcd4269159231233", "name": "/usr/lib/python3.12/mailbox.py", "type": "file" }, { - "bom-ref": "e7bfd10eef9c55cb", + "bom-ref": "475a768db1660f7b", "name": "/usr/lib/python3.12/mailcap.py", "type": "file" }, { - "bom-ref": "fe41966ac321f4b8", + "bom-ref": "859c477c233b5918", "name": "/usr/lib/python3.12/mimetypes.py", "type": "file" }, { - "bom-ref": "471707c153fc287f", + "bom-ref": "60054ac1776bf5ab", "name": "/usr/lib/python3.12/modulefinder.py", "type": "file" }, { - "bom-ref": "501515e9f3039449", + "bom-ref": "f8576cbebe0a8fd5", "name": "/usr/lib/python3.12/multiprocessing/__init__.py", "type": "file" }, { - "bom-ref": "dbee95ed63a8a659", + "bom-ref": "357307bce2b65bfd", "name": "/usr/lib/python3.12/multiprocessing/connection.py", "type": "file" }, { - "bom-ref": "da5130a1dcd46784", + "bom-ref": "39cca083a293c670", "name": "/usr/lib/python3.12/multiprocessing/context.py", "type": "file" }, { - "bom-ref": "86d35314948f9b2c", + "bom-ref": "5bb11a07c87a9564", "name": "/usr/lib/python3.12/multiprocessing/dummy/__init__.py", "type": "file" }, { - "bom-ref": "e0d83110851c4b63", + "bom-ref": "ebf6b9334ef9bc4b", "name": "/usr/lib/python3.12/multiprocessing/dummy/connection.py", "type": "file" }, { - "bom-ref": "79898d3e829a1339", + "bom-ref": "ce941f01048b7541", "name": "/usr/lib/python3.12/multiprocessing/forkserver.py", "type": "file" }, { - "bom-ref": "c6bcc6fb15d65863", + "bom-ref": "63aefbe350abd1b3", "name": "/usr/lib/python3.12/multiprocessing/heap.py", "type": "file" }, { - "bom-ref": "a29be674208aeaa3", + "bom-ref": "8d309812d2c2d557", "name": "/usr/lib/python3.12/multiprocessing/managers.py", "type": "file" }, { - "bom-ref": "02b4e1e65cddeb14", + "bom-ref": "d55636219b7fcda0", "name": "/usr/lib/python3.12/multiprocessing/pool.py", "type": "file" }, { - "bom-ref": "a00b9c60e794a272", + "bom-ref": "9b618111f8c83426", "name": "/usr/lib/python3.12/multiprocessing/popen_fork.py", "type": "file" }, { - "bom-ref": "0214479ee55a253a", + "bom-ref": "01aefba4f07f0012", "name": "/usr/lib/python3.12/multiprocessing/popen_forkserver.py", "type": "file" }, { - "bom-ref": "006767e30d48423a", + "bom-ref": "5e6bc17af094dade", "name": "/usr/lib/python3.12/multiprocessing/popen_spawn_posix.py", "type": "file" }, { - "bom-ref": "436fef04356f4929", + "bom-ref": "6229195b91b7bb19", "name": "/usr/lib/python3.12/multiprocessing/popen_spawn_win32.py", "type": "file" }, { - "bom-ref": "0bf52c07a97820e2", + "bom-ref": "691f1f209822dd3a", "name": "/usr/lib/python3.12/multiprocessing/process.py", "type": "file" }, { - "bom-ref": "53fea97776e9df44", + "bom-ref": "2cdb6301574115bc", "name": "/usr/lib/python3.12/multiprocessing/queues.py", "type": "file" }, { - "bom-ref": "3c6b99801f54d400", + "bom-ref": "b4ce6b219ac221c4", "name": "/usr/lib/python3.12/multiprocessing/reduction.py", "type": "file" }, { - "bom-ref": "454516deea8d3520", + "bom-ref": "699e9c338debc814", "name": "/usr/lib/python3.12/multiprocessing/resource_sharer.py", "type": "file" }, { - "bom-ref": "065ef1e917249775", + "bom-ref": "734b725d1c60a5ed", "name": "/usr/lib/python3.12/multiprocessing/resource_tracker.py", "type": "file" }, { - "bom-ref": "5cb4ac334bee6955", + "bom-ref": "878dae5d4110e411", "name": "/usr/lib/python3.12/multiprocessing/shared_memory.py", "type": "file" }, { - "bom-ref": "42124c4c44451a58", + "bom-ref": "7aaccdfd151562a8", "name": "/usr/lib/python3.12/multiprocessing/sharedctypes.py", "type": "file" }, { - "bom-ref": "114385f00c69667f", + "bom-ref": "c66fa151d47b336b", "name": "/usr/lib/python3.12/multiprocessing/spawn.py", "type": "file" }, { - "bom-ref": "37cb849e5f751f2a", + "bom-ref": "cee1f2494b7313f2", "name": "/usr/lib/python3.12/multiprocessing/synchronize.py", "type": "file" }, { - "bom-ref": "6edfd0e091d7b052", + "bom-ref": "1c5ecb1bbabec56e", "name": "/usr/lib/python3.12/multiprocessing/util.py", "type": "file" }, { - "bom-ref": "c9c7e3caf67f84a4", + "bom-ref": "85d7978c48fbaf5c", "name": "/usr/lib/python3.12/netrc.py", "type": "file" }, { - "bom-ref": "b2329be94eefe047", + "bom-ref": "a6233ea3256df6db", "name": "/usr/lib/python3.12/nntplib.py", "type": "file" }, { - "bom-ref": "06c995cb81d6eb74", + "bom-ref": "8ac4a7acf58efe08", "name": "/usr/lib/python3.12/ntpath.py", "type": "file" }, { - "bom-ref": "dfa5b01a5753d412", + "bom-ref": "c11048c41a6e6a32", "name": "/usr/lib/python3.12/nturl2path.py", "type": "file" }, { - "bom-ref": "277a8536470f98af", + "bom-ref": "ac37164ebe119d93", "name": "/usr/lib/python3.12/numbers.py", "type": "file" }, { - "bom-ref": "69a8daed96728ec7", + "bom-ref": "888d7bfd3a99dcef", "name": "/usr/lib/python3.12/opcode.py", "type": "file" }, { - "bom-ref": "7b453f916564f070", + "bom-ref": "af84cf35345995a8", "name": "/usr/lib/python3.12/operator.py", "type": "file" }, { - "bom-ref": "9efb449885f3e172", + "bom-ref": "7bcedb44ce0b4272", "name": "/usr/lib/python3.12/optparse.py", "type": "file" }, { - "bom-ref": "44f0d727441f1bba", + "bom-ref": "c0d81a654dbdde9a", "name": "/usr/lib/python3.12/os.py", "type": "file" }, { - "bom-ref": "3fa0e3676f8fe7da", + "bom-ref": "ad0a77cc61270902", "name": "/usr/lib/python3.12/pathlib.py", "type": "file" }, { - "bom-ref": "f2eeb64d76ccde74", + "bom-ref": "deae9fd4cf8482e0", "name": "/usr/lib/python3.12/pdb.py", "type": "file" }, { - "bom-ref": "1eee74cc9cfa4a21", + "bom-ref": "d51743f76c10f945", "name": "/usr/lib/python3.12/pickle.py", "type": "file" }, { - "bom-ref": "2a66f7fa96eeb227", + "bom-ref": "57d080aa2bd66573", "name": "/usr/lib/python3.12/pickletools.py", "type": "file" }, { - "bom-ref": "252d43452d864581", + "bom-ref": "34617298101f0afd", "name": "/usr/lib/python3.12/pipes.py", "type": "file" }, { - "bom-ref": "86abf82b77de90be", + "bom-ref": "5a3bdfb7b8533c06", "name": "/usr/lib/python3.12/pkgutil.py", "type": "file" }, { - "bom-ref": "fc50facfcc36a881", + "bom-ref": "5568a7d4892d5971", "name": "/usr/lib/python3.12/platform.py", "type": "file" }, { - "bom-ref": "47a3ed51aed832a5", + "bom-ref": "9e012890ad61b7ad", "name": "/usr/lib/python3.12/plistlib.py", "type": "file" }, { - "bom-ref": "c80b9cc15db7077f", + "bom-ref": "65a0f5a213b00af7", "name": "/usr/lib/python3.12/poplib.py", "type": "file" }, { - "bom-ref": "c6b4b12dbf97560f", + "bom-ref": "b66b1be119c80783", "name": "/usr/lib/python3.12/posixpath.py", "type": "file" }, { - "bom-ref": "088b9575f1297088", + "bom-ref": "2fcfe5887bb2bcf4", "name": "/usr/lib/python3.12/pprint.py", "type": "file" }, { - "bom-ref": "e2f99a5f2ce02ab4", + "bom-ref": "b6f8a4af0b8b8604", "name": "/usr/lib/python3.12/profile.py", "type": "file" }, { - "bom-ref": "f393e2b1c20ee49c", + "bom-ref": "6300d5176ed2aba4", "name": "/usr/lib/python3.12/pstats.py", "type": "file" }, { - "bom-ref": "4f6c76d6442c2bf7", + "bom-ref": "bd98e4065783e0af", "name": "/usr/lib/python3.12/pty.py", "type": "file" }, { - "bom-ref": "0f0a06e355af4836", + "bom-ref": "47779654c60a9ca6", "name": "/usr/lib/python3.12/py_compile.py", "type": "file" }, { - "bom-ref": "73f8be99785d1bfb", + "bom-ref": "39121a2b122b3c3b", "name": "/usr/lib/python3.12/pyclbr.py", "type": "file" }, { - "bom-ref": "13f14f2c49cd3f09", + "bom-ref": "f097cf569f2294b1", "name": "/usr/lib/python3.12/pydoc.py", "type": "file" }, { - "bom-ref": "acf23fdd4df0ddaf", + "bom-ref": "b6e1dba68f167bcb", "name": "/usr/lib/python3.12/pydoc_data/__init__.py", "type": "file" }, { - "bom-ref": "b9b7b884d7322835", + "bom-ref": "d1decaa495964085", "name": "/usr/lib/python3.12/pydoc_data/_pydoc.css", "type": "file" }, { - "bom-ref": "0c1e1d9223cc4535", + "bom-ref": "ff5d04dbb748f6f5", "name": "/usr/lib/python3.12/pydoc_data/topics.py", "type": "file" }, { - "bom-ref": "510496843f6ef9df", + "bom-ref": "76ec3c8eef5478c7", "name": "/usr/lib/python3.12/queue.py", "type": "file" }, { - "bom-ref": "b8a7877bba037334", + "bom-ref": "c5dd66921e93a23c", "name": "/usr/lib/python3.12/quopri.py", "type": "file" }, { - "bom-ref": "2a8084e71dc2818f", + "bom-ref": "93540268c7f51c9b", "name": "/usr/lib/python3.12/random.py", "type": "file" }, { - "bom-ref": "cefdcdaf45af936e", + "bom-ref": "2f0b7c2104f58e3e", "name": "/usr/lib/python3.12/re/__init__.py", "type": "file" }, { - "bom-ref": "0d502316886e92f4", + "bom-ref": "a3576a2bd4bb980c", "name": "/usr/lib/python3.12/re/_casefix.py", "type": "file" }, { - "bom-ref": "0d605e08b099311d", + "bom-ref": "4439c719f6612d35", "name": "/usr/lib/python3.12/re/_compiler.py", "type": "file" }, { - "bom-ref": "93a6c9e625362392", + "bom-ref": "db52ac08fc5ef89e", "name": "/usr/lib/python3.12/re/_constants.py", "type": "file" }, { - "bom-ref": "d588b31f35b5dd3f", + "bom-ref": "0fe47c3f117f83d7", "name": "/usr/lib/python3.12/re/_parser.py", "type": "file" }, { - "bom-ref": "6d50055992677a5f", + "bom-ref": "0bce9576d1233437", "name": "/usr/lib/python3.12/reprlib.py", "type": "file" }, { - "bom-ref": "8bc8156c0bdd7a41", + "bom-ref": "a44133439f6ef399", "name": "/usr/lib/python3.12/rlcompleter.py", "type": "file" }, { - "bom-ref": "4568144a0f5c0bab", + "bom-ref": "f61c5d67994b5bfb", "name": "/usr/lib/python3.12/runpy.py", "type": "file" }, { - "bom-ref": "7dfc6ca818895f05", + "bom-ref": "dec056b119e7fc61", "name": "/usr/lib/python3.12/sched.py", "type": "file" }, { - "bom-ref": "5145d13ec67b87a0", + "bom-ref": "7a494747e9d1e9d8", "name": "/usr/lib/python3.12/secrets.py", "type": "file" }, { - "bom-ref": "42685f0a215a24db", + "bom-ref": "696eb47e1dfc059b", "name": "/usr/lib/python3.12/selectors.py", "type": "file" }, { - "bom-ref": "1126b19171cc479e", + "bom-ref": "1ee5bb0430791dbe", "name": "/usr/lib/python3.12/shelve.py", "type": "file" }, { - "bom-ref": "4c60c629be20d24b", + "bom-ref": "ce4fad71a3ea2e9f", "name": "/usr/lib/python3.12/shlex.py", "type": "file" }, { - "bom-ref": "e685cd62699b78f8", + "bom-ref": "3ce41070dcf0e308", "name": "/usr/lib/python3.12/shutil.py", "type": "file" }, { - "bom-ref": "9ef4ec2d5ce8d30c", + "bom-ref": "255c799933458d7c", "name": "/usr/lib/python3.12/signal.py", "type": "file" }, { - "bom-ref": "342728450c0f44e9", + "bom-ref": "7e72c0e682f40551", "name": "/usr/lib/python3.12/site.py", "type": "file" }, { - "bom-ref": "425cf897b6e8b0fb", + "bom-ref": "3362dc41c710e0e7", "name": "/usr/lib/python3.12/smtplib.py", "type": "file" }, { - "bom-ref": "4cbfea9a254b43e0", + "bom-ref": "77a6656a980e8644", "name": "/usr/lib/python3.12/sndhdr.py", "type": "file" }, { - "bom-ref": "5af1a4389038b00a", + "bom-ref": "38e7ee2f29934bba", "name": "/usr/lib/python3.12/socket.py", "type": "file" }, { - "bom-ref": "946d85d2bf383d2a", + "bom-ref": "eb14fbeb67510cda", "name": "/usr/lib/python3.12/socketserver.py", "type": "file" }, { - "bom-ref": "27ed475d941b6c46", + "bom-ref": "e15bae9b84af8e2a", "name": "/usr/lib/python3.12/sqlite3/__init__.py", "type": "file" }, { - "bom-ref": "c24cd3b3ffee2777", + "bom-ref": "1a43c397542994ab", "name": "/usr/lib/python3.12/sqlite3/__main__.py", "type": "file" }, { - "bom-ref": "8a3a9977aae1a919", + "bom-ref": "bf16464d7f95257d", "name": "/usr/lib/python3.12/sqlite3/dbapi2.py", "type": "file" }, { - "bom-ref": "2c1e17c20db81454", + "bom-ref": "ce4ff67c342f8364", "name": "/usr/lib/python3.12/sqlite3/dump.py", "type": "file" }, { - "bom-ref": "f3d987c6d0aefa46", + "bom-ref": "5cd969aafc248efe", "name": "/usr/lib/python3.12/sre_compile.py", "type": "file" }, { - "bom-ref": "5795d0b2f9d96cb5", + "bom-ref": "fb7c7d94d9a11afd", "name": "/usr/lib/python3.12/sre_constants.py", "type": "file" }, { - "bom-ref": "07b94a1f00a1bdf2", + "bom-ref": "5eed8562957d0a8e", "name": "/usr/lib/python3.12/sre_parse.py", "type": "file" }, { - "bom-ref": "def53e35619ac0f7", + "bom-ref": "4c791ce204d3916b", "name": "/usr/lib/python3.12/ssl.py", "type": "file" }, { - "bom-ref": "f2b37b1c22663904", + "bom-ref": "320099f70eb8b8b8", "name": "/usr/lib/python3.12/stat.py", "type": "file" }, { - "bom-ref": "c1c8ac1190a29c40", + "bom-ref": "69ab56ba1ce1eb6c", "name": "/usr/lib/python3.12/statistics.py", "type": "file" }, { - "bom-ref": "7c0c3aae6786c7a2", + "bom-ref": "a09e62338162a782", "name": "/usr/lib/python3.12/string.py", "type": "file" }, { - "bom-ref": "021a49eb7e0c314a", + "bom-ref": "14db50bf77dd00be", "name": "/usr/lib/python3.12/stringprep.py", "type": "file" }, { - "bom-ref": "0ee9428951ee7b17", + "bom-ref": "4464c40598df659b", "name": "/usr/lib/python3.12/struct.py", "type": "file" }, { - "bom-ref": "cc71057336f91346", + "bom-ref": "6bbfc017d4aa6602", "name": "/usr/lib/python3.12/subprocess.py", "type": "file" }, { - "bom-ref": "38bdf06bc6c84944", + "bom-ref": "742f29ba6aee0d9c", "name": "/usr/lib/python3.12/sunau.py", "type": "file" }, { - "bom-ref": "0bc9e3a2d7ba747d", + "bom-ref": "7f3497be0567835d", "name": "/usr/lib/python3.12/symtable.py", "type": "file" }, { - "bom-ref": "62d482d8ad48c1e5", + "bom-ref": "6f6d40d054483ddd", "name": "/usr/lib/python3.12/sysconfig.py", "type": "file" }, { - "bom-ref": "834a17b1f0060941", + "bom-ref": "400b60cdf5976c45", "name": "/usr/lib/python3.12/tabnanny.py", "type": "file" }, { - "bom-ref": "27007872ffc4add7", + "bom-ref": "266b0c9814d59c93", "name": "/usr/lib/python3.12/tarfile.py", "type": "file" }, { - "bom-ref": "41e0aac97b8086cc", + "bom-ref": "d10c5342175c1fa8", "name": "/usr/lib/python3.12/telnetlib.py", "type": "file" }, { - "bom-ref": "aeec99a6374f6efa", + "bom-ref": "74de8c13db0788ba", "name": "/usr/lib/python3.12/tempfile.py", "type": "file" }, { - "bom-ref": "9b2ed8cf865e20a9", + "bom-ref": "febc6e7594c012a1", "name": "/usr/lib/python3.12/test/__init__.py", "type": "file" }, { - "bom-ref": "e627fc23dcc0eb6f", + "bom-ref": "68d8021b5f18cf2f", "name": "/usr/lib/python3.12/test/__main__.py", "type": "file" }, { - "bom-ref": "99f7ca96f344bce9", + "bom-ref": "3ac43d02d75cdd81", "name": "/usr/lib/python3.12/test/libregrtest/__init__.py", "type": "file" }, { - "bom-ref": "52b2fe7fa6f03a64", + "bom-ref": "bc37946c4f528c58", "name": "/usr/lib/python3.12/test/libregrtest/cmdline.py", "type": "file" }, { - "bom-ref": "68b66a306cc6c0ef", + "bom-ref": "00a5f6937499a55f", "name": "/usr/lib/python3.12/test/libregrtest/filter.py", "type": "file" }, { - "bom-ref": "87d53603a44bb1b6", + "bom-ref": "9c349c1575913dde", "name": "/usr/lib/python3.12/test/libregrtest/findtests.py", "type": "file" }, { - "bom-ref": "eb87d489a06cbd6f", + "bom-ref": "f7251ec537d51abb", "name": "/usr/lib/python3.12/test/libregrtest/logger.py", "type": "file" }, { - "bom-ref": "7c039fede201f8f4", + "bom-ref": "7c4d447113a2ea74", "name": "/usr/lib/python3.12/test/libregrtest/main.py", "type": "file" }, { - "bom-ref": "1d369e3ffabf3a35", + "bom-ref": "4e44c4d5da1d5669", "name": "/usr/lib/python3.12/test/libregrtest/mypy.ini", "type": "file" }, { - "bom-ref": "c6e3094860015b03", + "bom-ref": "9c703574a410f453", "name": "/usr/lib/python3.12/test/libregrtest/pgo.py", "type": "file" }, { - "bom-ref": "812685310dda7e64", + "bom-ref": "3ef73e82c24b68bc", "name": "/usr/lib/python3.12/test/libregrtest/refleak.py", "type": "file" }, { - "bom-ref": "cae9fbebf21a1153", + "bom-ref": "c6624d07c503cac3", "name": "/usr/lib/python3.12/test/libregrtest/result.py", "type": "file" }, { - "bom-ref": "7d0b3b4ecc750d06", + "bom-ref": "6de7f1d222a69a0a", "name": "/usr/lib/python3.12/test/libregrtest/results.py", "type": "file" }, { - "bom-ref": "fdfce37bdcbfb2b9", + "bom-ref": "aecc963c90f7e921", "name": "/usr/lib/python3.12/test/libregrtest/run_workers.py", "type": "file" }, { - "bom-ref": "1c08d9d18df62f92", + "bom-ref": "d5f56577b38c190a", "name": "/usr/lib/python3.12/test/libregrtest/runtests.py", "type": "file" }, { - "bom-ref": "0faf1980d626e556", + "bom-ref": "48133e38c4012cba", "name": "/usr/lib/python3.12/test/libregrtest/save_env.py", "type": "file" }, { - "bom-ref": "e96106fe14276998", + "bom-ref": "a53de189c2296ff8", "name": "/usr/lib/python3.12/test/libregrtest/setup.py", "type": "file" }, { - "bom-ref": "e6a93c79ece91592", + "bom-ref": "e2821581719d0ade", "name": "/usr/lib/python3.12/test/libregrtest/single.py", "type": "file" }, { - "bom-ref": "914d573529d94f1d", + "bom-ref": "f0e12966cab6d7b1", "name": "/usr/lib/python3.12/test/libregrtest/testresult.py", "type": "file" }, { - "bom-ref": "7685c91e7c0b5a2a", + "bom-ref": "d3941bfb287d89ba", "name": "/usr/lib/python3.12/test/libregrtest/tsan.py", "type": "file" }, { - "bom-ref": "42cb73f4b8f3d34c", + "bom-ref": "5ef1ea6029af0e00", "name": "/usr/lib/python3.12/test/libregrtest/utils.py", "type": "file" }, { - "bom-ref": "334ef4238294406a", + "bom-ref": "ea1e62c957b3aaae", "name": "/usr/lib/python3.12/test/libregrtest/win_utils.py", "type": "file" }, { - "bom-ref": "1e015e0fe66c5981", + "bom-ref": "483a69e1404a0765", "name": "/usr/lib/python3.12/test/libregrtest/worker.py", "type": "file" }, { - "bom-ref": "609089852de2aeba", + "bom-ref": "dc2f5dfb87a5d986", "name": "/usr/lib/python3.12/test/regrtest.py", "type": "file" }, { - "bom-ref": "cc4d26dc14cacc11", + "bom-ref": "7968c2377c557569", "name": "/usr/lib/python3.12/test/support/__init__.py", "type": "file" }, { - "bom-ref": "c150879791ea6327", + "bom-ref": "4e006e19c9fe160f", "name": "/usr/lib/python3.12/test/support/_hypothesis_stubs/__init__.py", "type": "file" }, { - "bom-ref": "5b5214e36d201974", + "bom-ref": "92e88056f56e6bfc", "name": "/usr/lib/python3.12/test/support/_hypothesis_stubs/_helpers.py", "type": "file" }, { - "bom-ref": "9af56cf70350244c", + "bom-ref": "efbb1e41b48caa54", "name": "/usr/lib/python3.12/test/support/_hypothesis_stubs/strategies.py", "type": "file" }, { - "bom-ref": "0915da2e73ec1b9b", + "bom-ref": "84b86587fa20bd0f", "name": "/usr/lib/python3.12/test/support/ast_helper.py", "type": "file" }, { - "bom-ref": "45c7d59d9b106b8a", + "bom-ref": "6810820fc001bede", "name": "/usr/lib/python3.12/test/support/asynchat.py", "type": "file" }, { - "bom-ref": "1b5906d42f313a9e", + "bom-ref": "175497742c515472", "name": "/usr/lib/python3.12/test/support/asyncore.py", "type": "file" }, { - "bom-ref": "9d9f51308888cc97", + "bom-ref": "13b920e00abc5063", "name": "/usr/lib/python3.12/test/support/bytecode_helper.py", "type": "file" }, { - "bom-ref": "726d6151fbb48073", + "bom-ref": "aa7378a491e4dbc3", "name": "/usr/lib/python3.12/test/support/hashlib_helper.py", "type": "file" }, { - "bom-ref": "a9fd14c735ca0b13", + "bom-ref": "1942870d725ecc57", "name": "/usr/lib/python3.12/test/support/hypothesis_helper.py", "type": "file" }, { - "bom-ref": "4d03c814fea51a2b", + "bom-ref": "1f1a8f774b540ffb", "name": "/usr/lib/python3.12/test/support/import_helper.py", "type": "file" }, { - "bom-ref": "8bde514f3a93aeb9", + "bom-ref": "f9ade3b5e0bb60ed", "name": "/usr/lib/python3.12/test/support/interpreters.py", "type": "file" }, { - "bom-ref": "e49e2b6f0b6d9cd2", + "bom-ref": "7eb729324315d7b2", "name": "/usr/lib/python3.12/test/support/logging_helper.py", "type": "file" }, { - "bom-ref": "423a3f71b3f8d121", + "bom-ref": "e111d3bb44f6c355", "name": "/usr/lib/python3.12/test/support/os_helper.py", "type": "file" }, { - "bom-ref": "862f33779d7eab18", + "bom-ref": "1a2511d35f40ac88", "name": "/usr/lib/python3.12/test/support/pty_helper.py", "type": "file" }, { - "bom-ref": "4fec3434ba2d8748", + "bom-ref": "3bdb16baee99b444", "name": "/usr/lib/python3.12/test/support/script_helper.py", "type": "file" }, { - "bom-ref": "347a36c9f9e15656", + "bom-ref": "01244c36d3b76c1a", "name": "/usr/lib/python3.12/test/support/smtpd.py", "type": "file" }, { - "bom-ref": "9d94dfed413789e4", + "bom-ref": "b878285f9239510c", "name": "/usr/lib/python3.12/test/support/socket_helper.py", "type": "file" }, { - "bom-ref": "18dd4b12043f1d4b", + "bom-ref": "4e62a33845c53613", "name": "/usr/lib/python3.12/test/support/testcase.py", "type": "file" }, { - "bom-ref": "6ca833dd43172417", + "bom-ref": "03f6e2bdc69c324b", "name": "/usr/lib/python3.12/test/support/threading_helper.py", "type": "file" }, { - "bom-ref": "8eb49c63f411f99c", + "bom-ref": "9fa3997b67e9ddbc", "name": "/usr/lib/python3.12/test/support/warnings_helper.py", "type": "file" }, { - "bom-ref": "5b2e7f9827d58d66", + "bom-ref": "7a94618fd4efdeee", "name": "/usr/lib/python3.12/test/test_support.py", "type": "file" }, { - "bom-ref": "a7cdb0804ec9aaaf", + "bom-ref": "04e297b41c229b9f", "name": "/usr/lib/python3.12/test/typinganndata/__init__.py", "type": "file" }, { - "bom-ref": "60a1edfb9b847eeb", + "bom-ref": "3241c3b9e5ca98a7", "name": "/usr/lib/python3.12/test/typinganndata/_typed_dict_helper.py", "type": "file" }, { - "bom-ref": "4e32ffae2f93dfef", + "bom-ref": "2fdde051deff6b4f", "name": "/usr/lib/python3.12/test/typinganndata/ann_module.py", "type": "file" }, { - "bom-ref": "6f5a8dbce7f8d6e5", + "bom-ref": "e4d45e387a29f8c9", "name": "/usr/lib/python3.12/test/typinganndata/ann_module2.py", "type": "file" }, { - "bom-ref": "d86b9583f275a4c7", + "bom-ref": "a006c1445d8b96df", "name": "/usr/lib/python3.12/test/typinganndata/ann_module3.py", "type": "file" }, { - "bom-ref": "dc2b0af250a91c45", + "bom-ref": "646b16e354a9cdf1", "name": "/usr/lib/python3.12/test/typinganndata/ann_module4.py", "type": "file" }, { - "bom-ref": "71db04af4a2695ce", + "bom-ref": "c8cf8388150a85be", "name": "/usr/lib/python3.12/test/typinganndata/ann_module5.py", "type": "file" }, { - "bom-ref": "4c33368292e56cda", + "bom-ref": "5166983c9bc687ae", "name": "/usr/lib/python3.12/test/typinganndata/ann_module6.py", "type": "file" }, { - "bom-ref": "2b047831f04b32b9", + "bom-ref": "d87ff5acaaa76205", "name": "/usr/lib/python3.12/test/typinganndata/ann_module7.py", "type": "file" }, { - "bom-ref": "d1ca21647d873ade", + "bom-ref": "5ea126553301bd86", "name": "/usr/lib/python3.12/test/typinganndata/ann_module8.py", "type": "file" }, { - "bom-ref": "01d6c4964383efc6", + "bom-ref": "43d015301bdf2cc2", "name": "/usr/lib/python3.12/test/typinganndata/ann_module9.py", "type": "file" }, { - "bom-ref": "a1aaf5c30cbb3100", + "bom-ref": "ff09d3badfe20e50", "name": "/usr/lib/python3.12/test/typinganndata/mod_generics_cache.py", "type": "file" }, { - "bom-ref": "e66197ff1daa9ce9", + "bom-ref": "c4617670a20b641d", "name": "/usr/lib/python3.12/textwrap.py", "type": "file" }, { - "bom-ref": "6b48521a85c97c41", + "bom-ref": "3af5a12369368b65", "name": "/usr/lib/python3.12/this.py", "type": "file" }, { - "bom-ref": "096e2b2f1f230764", + "bom-ref": "5048c5b4aa3582bc", "name": "/usr/lib/python3.12/threading.py", "type": "file" }, { - "bom-ref": "783c1445d598d892", + "bom-ref": "c9ae5985f844d88a", "name": "/usr/lib/python3.12/timeit.py", "type": "file" }, { - "bom-ref": "efed88dd0dc33f62", + "bom-ref": "d25530dda380b8ce", "name": "/usr/lib/python3.12/token.py", "type": "file" }, { - "bom-ref": "d719a36c8fd1774f", + "bom-ref": "6c44c79b66bed4d3", "name": "/usr/lib/python3.12/tokenize.py", "type": "file" }, { - "bom-ref": "0f8e649759174c53", + "bom-ref": "5b5a08058e5213fb", "name": "/usr/lib/python3.12/tomllib/__init__.py", "type": "file" }, { - "bom-ref": "976372ec8629a243", + "bom-ref": "18e6c177bdb58e27", "name": "/usr/lib/python3.12/tomllib/_parser.py", "type": "file" }, { - "bom-ref": "67b6df895e4071b9", + "bom-ref": "5a5f5b9d9cdf9475", "name": "/usr/lib/python3.12/tomllib/_re.py", "type": "file" }, { - "bom-ref": "67d68f96b079717d", + "bom-ref": "b8a9cedb19a1b59d", "name": "/usr/lib/python3.12/tomllib/_types.py", "type": "file" }, { - "bom-ref": "daac0d41061cc6ad", + "bom-ref": "2c04b9f71f950355", "name": "/usr/lib/python3.12/trace.py", "type": "file" }, { - "bom-ref": "4fb17e444706d644", + "bom-ref": "17a4793ea6317ef0", "name": "/usr/lib/python3.12/traceback.py", "type": "file" }, { - "bom-ref": "dc40ffa564541f63", + "bom-ref": "be69d38cbe3a7c7b", "name": "/usr/lib/python3.12/tracemalloc.py", "type": "file" }, { - "bom-ref": "649a4d17895d1713", + "bom-ref": "39844996819c6ecb", "name": "/usr/lib/python3.12/tty.py", "type": "file" }, { - "bom-ref": "ba67bed3d19f0d49", + "bom-ref": "6f166bdba4d249c9", "name": "/usr/lib/python3.12/turtle.py", "type": "file" }, { - "bom-ref": "7626e1ec8720b6fe", + "bom-ref": "ec43c4342e92657e", "name": "/usr/lib/python3.12/types.py", "type": "file" }, { - "bom-ref": "7b82dcaa0e29d91a", + "bom-ref": "29b6c6af9ed6aec6", "name": "/usr/lib/python3.12/typing.py", "type": "file" }, { - "bom-ref": "04af83432a57bf18", + "bom-ref": "dd752920b7fc5b98", "name": "/usr/lib/python3.12/unittest/__init__.py", "type": "file" }, { - "bom-ref": "75eac2de3cde73d3", + "bom-ref": "199a6a19ea24d4b7", "name": "/usr/lib/python3.12/unittest/__main__.py", "type": "file" }, { - "bom-ref": "968da7ed5b7ad634", + "bom-ref": "88768aa85f0f7164", "name": "/usr/lib/python3.12/unittest/_log.py", "type": "file" }, { - "bom-ref": "fee9df099c2e3772", + "bom-ref": "41e2d313de5a9c9a", "name": "/usr/lib/python3.12/unittest/async_case.py", "type": "file" }, { - "bom-ref": "c4c914915ea9da43", + "bom-ref": "af6b9289e7f522f7", "name": "/usr/lib/python3.12/unittest/case.py", "type": "file" }, { - "bom-ref": "cbcb9600a4a841b7", + "bom-ref": "12f32ac25e0a0a07", "name": "/usr/lib/python3.12/unittest/loader.py", "type": "file" }, { - "bom-ref": "7369ef9e98829b7e", + "bom-ref": "30a55417ae88bdb6", "name": "/usr/lib/python3.12/unittest/main.py", "type": "file" }, { - "bom-ref": "c565c4b729e995cc", + "bom-ref": "01b65312febedc2c", "name": "/usr/lib/python3.12/unittest/mock.py", "type": "file" }, { - "bom-ref": "ca04d5cee9536838", + "bom-ref": "bc06a0b1681b5350", "name": "/usr/lib/python3.12/unittest/result.py", "type": "file" }, { - "bom-ref": "c2be2a143048c11f", + "bom-ref": "37384b7e3f3540b7", "name": "/usr/lib/python3.12/unittest/runner.py", "type": "file" }, { - "bom-ref": "b4f9d1cf606625e0", + "bom-ref": "12de785cedd0a538", "name": "/usr/lib/python3.12/unittest/signals.py", "type": "file" }, { - "bom-ref": "0917137e6fcd8729", + "bom-ref": "501202fe3e4cee8d", "name": "/usr/lib/python3.12/unittest/suite.py", "type": "file" }, { - "bom-ref": "3241c16ebb745b55", + "bom-ref": "b3a73402b3f2c7ed", "name": "/usr/lib/python3.12/unittest/util.py", "type": "file" }, { - "bom-ref": "dd1c5de49b24ff3b", + "bom-ref": "8bf1f05ee2060ea7", "name": "/usr/lib/python3.12/urllib/__init__.py", "type": "file" }, { - "bom-ref": "3ffb96024dcc42c5", + "bom-ref": "fca2eb99bba7a7f1", "name": "/usr/lib/python3.12/urllib/error.py", "type": "file" }, { - "bom-ref": "a50b6063b1932bdd", + "bom-ref": "b631a666da703039", "name": "/usr/lib/python3.12/urllib/parse.py", "type": "file" }, { - "bom-ref": "9298b5b148c5b1de", + "bom-ref": "072013643dc2d7fa", "name": "/usr/lib/python3.12/urllib/request.py", "type": "file" }, { - "bom-ref": "0a0aa4ea2e535b68", + "bom-ref": "71e68d6c8341a204", "name": "/usr/lib/python3.12/urllib/response.py", "type": "file" }, { - "bom-ref": "17f8bbc297d7d8be", + "bom-ref": "e4b2f841a4f3ae9e", "name": "/usr/lib/python3.12/urllib/robotparser.py", "type": "file" }, { - "bom-ref": "d8c75f78c07b0433", + "bom-ref": "81d5a2f7b8ee778f", "name": "/usr/lib/python3.12/uu.py", "type": "file" }, { - "bom-ref": "344a69cce06c0bbc", + "bom-ref": "1cc3cb087a62ddbc", "name": "/usr/lib/python3.12/uuid.py", "type": "file" }, { - "bom-ref": "3fe405e99ec15f1f", + "bom-ref": "5ad07551f086d3db", "name": "/usr/lib/python3.12/venv/__init__.py", "type": "file" }, { - "bom-ref": "d8c10bd833d9e942", + "bom-ref": "94405073c163e8ea", "name": "/usr/lib/python3.12/venv/__main__.py", "type": "file" }, { - "bom-ref": "4b55956fd9b446bf", + "bom-ref": "997b2132c658ceab", "name": "/usr/lib/python3.12/venv/scripts/common/Activate.ps1", "type": "file" }, { - "bom-ref": "c01687ffd3e5e073", + "bom-ref": "7bcd8058dd3502c7", "name": "/usr/lib/python3.12/venv/scripts/common/activate", "type": "file" }, { - "bom-ref": "130c13a6149938a6", + "bom-ref": "90902a3b3dd9aaa6", "name": "/usr/lib/python3.12/venv/scripts/posix/activate.csh", "type": "file" }, { - "bom-ref": "f488b2d513f15102", + "bom-ref": "786a1b6ba799a0ae", "name": "/usr/lib/python3.12/venv/scripts/posix/activate.fish", "type": "file" }, { - "bom-ref": "ce1db529d6789bb3", + "bom-ref": "5f84d71727e6f0ff", "name": "/usr/lib/python3.12/warnings.py", "type": "file" }, { - "bom-ref": "11e411da86460d9d", + "bom-ref": "0f06d9599a3f4099", "name": "/usr/lib/python3.12/wave.py", "type": "file" }, { - "bom-ref": "707be624def965a3", + "bom-ref": "2db7c3df678e8017", "name": "/usr/lib/python3.12/weakref.py", "type": "file" }, { - "bom-ref": "4a58c22e60c8e15c", + "bom-ref": "378b013412160af4", "name": "/usr/lib/python3.12/webbrowser.py", "type": "file" }, { - "bom-ref": "ef2f812d83fd7e06", + "bom-ref": "28cb7f476618569e", "name": "/usr/lib/python3.12/wsgiref/__init__.py", "type": "file" }, { - "bom-ref": "2eb8f1ff2648d858", + "bom-ref": "9227ab7ac95efdf8", "name": "/usr/lib/python3.12/wsgiref/handlers.py", "type": "file" }, { - "bom-ref": "8096220c11961bb9", + "bom-ref": "e8675ec050dd0dbd", "name": "/usr/lib/python3.12/wsgiref/headers.py", "type": "file" }, { - "bom-ref": "9f756d0f3387eac0", + "bom-ref": "26379d2e9711c4bc", "name": "/usr/lib/python3.12/wsgiref/simple_server.py", "type": "file" }, { - "bom-ref": "ffae52666f065cc5", + "bom-ref": "29202df8da99a215", "name": "/usr/lib/python3.12/wsgiref/types.py", "type": "file" }, { - "bom-ref": "209adec87697b1de", + "bom-ref": "358543474d733d2a", "name": "/usr/lib/python3.12/wsgiref/util.py", "type": "file" }, { - "bom-ref": "82a32e7861c875ce", + "bom-ref": "f9a3b1c6fe9bb432", "name": "/usr/lib/python3.12/wsgiref/validate.py", "type": "file" }, { - "bom-ref": "9346cc182dc682cf", + "bom-ref": "d762fa6e1c493253", "name": "/usr/lib/python3.12/xdrlib.py", "type": "file" }, { - "bom-ref": "3f835904c8d6ca9d", + "bom-ref": "f46e5fe187875261", "name": "/usr/lib/python3.12/xml/__init__.py", "type": "file" }, { - "bom-ref": "1a5a8a378d887f3f", + "bom-ref": "4f76732078d0df1b", "name": "/usr/lib/python3.12/xml/dom/NodeFilter.py", "type": "file" }, { - "bom-ref": "3cb51211f1296a47", + "bom-ref": "4dcc1977ac6df51f", "name": "/usr/lib/python3.12/xml/dom/__init__.py", "type": "file" }, { - "bom-ref": "7c04ea8d2f4b3888", + "bom-ref": "c5d3d368082ada64", "name": "/usr/lib/python3.12/xml/dom/domreg.py", "type": "file" }, { - "bom-ref": "4a6f53c8261eadef", + "bom-ref": "cae0e924108d109b", "name": "/usr/lib/python3.12/xml/dom/expatbuilder.py", "type": "file" }, { - "bom-ref": "d2e549d56f95782e", + "bom-ref": "6c3117165c53aae2", "name": "/usr/lib/python3.12/xml/dom/minicompat.py", "type": "file" }, { - "bom-ref": "3ab28b7a2af948fc", + "bom-ref": "55d64a5df973d9c4", "name": "/usr/lib/python3.12/xml/dom/minidom.py", "type": "file" }, { - "bom-ref": "6717b033d9b5ad47", + "bom-ref": "dd4e4a1d38465abb", "name": "/usr/lib/python3.12/xml/dom/pulldom.py", "type": "file" }, { - "bom-ref": "36e086d8cb2d759e", + "bom-ref": "4c7554506985357e", "name": "/usr/lib/python3.12/xml/dom/xmlbuilder.py", "type": "file" }, { - "bom-ref": "81e0ea8f4da6dca9", + "bom-ref": "7ef891c3cd3642ad", "name": "/usr/lib/python3.12/xml/etree/ElementInclude.py", "type": "file" }, { - "bom-ref": "2179a934b63233e3", + "bom-ref": "9f3f875d12fa7a1f", "name": "/usr/lib/python3.12/xml/etree/ElementPath.py", "type": "file" }, { - "bom-ref": "b9ff822178bc41c8", + "bom-ref": "4de92ef61d200674", "name": "/usr/lib/python3.12/xml/etree/ElementTree.py", "type": "file" }, { - "bom-ref": "a4552d61a1fb50a2", + "bom-ref": "c740e491ce3a514e", "name": "/usr/lib/python3.12/xml/etree/__init__.py", "type": "file" }, { - "bom-ref": "dc217d536f6fbc0d", + "bom-ref": "e7251e6891a1715d", "name": "/usr/lib/python3.12/xml/etree/cElementTree.py", "type": "file" }, { - "bom-ref": "fb963226bfdc103d", + "bom-ref": "4e65fc327097e60d", "name": "/usr/lib/python3.12/xml/parsers/__init__.py", "type": "file" }, { - "bom-ref": "2ea05eb0b3804108", + "bom-ref": "87761ba0aa64dd48", "name": "/usr/lib/python3.12/xml/parsers/expat.py", "type": "file" }, { - "bom-ref": "e324393a016d4217", + "bom-ref": "dd2648acd195fba7", "name": "/usr/lib/python3.12/xml/sax/__init__.py", "type": "file" }, { - "bom-ref": "606a5097a4736f51", + "bom-ref": "54495a82b42b87c9", "name": "/usr/lib/python3.12/xml/sax/_exceptions.py", "type": "file" }, { - "bom-ref": "4b45bb0d52d81123", + "bom-ref": "ce49a493c48ac097", "name": "/usr/lib/python3.12/xml/sax/expatreader.py", "type": "file" }, { - "bom-ref": "1445accbc6bf5abc", + "bom-ref": "f15bddacae3c3338", "name": "/usr/lib/python3.12/xml/sax/handler.py", "type": "file" }, { - "bom-ref": "ade86691e1395a95", + "bom-ref": "a83dbc37f463fb15", "name": "/usr/lib/python3.12/xml/sax/saxutils.py", "type": "file" }, { - "bom-ref": "7e1a55c9ca0143fb", + "bom-ref": "164329cd5c4a25f7", "name": "/usr/lib/python3.12/xml/sax/xmlreader.py", "type": "file" }, { - "bom-ref": "a7cb47958acb61b5", + "bom-ref": "ab62b5641dfdb055", "name": "/usr/lib/python3.12/xmlrpc/__init__.py", "type": "file" }, { - "bom-ref": "14a6c603f802a46d", + "bom-ref": "2cccff113ab17719", "name": "/usr/lib/python3.12/xmlrpc/client.py", "type": "file" }, { - "bom-ref": "10e17f67505351de", + "bom-ref": "964c9dd28acbdf7a", "name": "/usr/lib/python3.12/xmlrpc/server.py", "type": "file" }, { - "bom-ref": "b004e982a6e5ab8c", + "bom-ref": "c27799dee547e718", "name": "/usr/lib/python3.12/zipapp.py", "type": "file" }, { - "bom-ref": "595aba2b159b1a46", + "bom-ref": "28a7c31dbcc1668e", "name": "/usr/lib/python3.12/zipfile/__init__.py", "type": "file" }, { - "bom-ref": "9b01fef40826fc07", + "bom-ref": "c9e05afc9072a22b", "name": "/usr/lib/python3.12/zipfile/__main__.py", "type": "file" }, { - "bom-ref": "db0656ba80d2b706", + "bom-ref": "185dff08f7dd2186", "name": "/usr/lib/python3.12/zipfile/_path/__init__.py", "type": "file" }, { - "bom-ref": "861334bcbbeca435", + "bom-ref": "326e6f291c69feb9", "name": "/usr/lib/python3.12/zipfile/_path/glob.py", "type": "file" }, { - "bom-ref": "4a714c716c59e4fb", + "bom-ref": "4a8016cbec4ab993", "name": "/usr/lib/python3.12/zipimport.py", "type": "file" }, { - "bom-ref": "b03d2f2e9c50c201", + "bom-ref": "b43f564b0c11a85d", "name": "/usr/lib/python3.12/zoneinfo/__init__.py", "type": "file" }, { - "bom-ref": "74e6e5c9548b5e64", + "bom-ref": "0767f2f8526c7bb0", "name": "/usr/lib/python3.12/zoneinfo/_common.py", "type": "file" }, { - "bom-ref": "23a859224d1d9941", + "bom-ref": "e1acd89963a0120d", "name": "/usr/lib/python3.12/zoneinfo/_tzpath.py", "type": "file" }, { - "bom-ref": "354e45bdbfbe022a", + "bom-ref": "d402f501077a4fc6", "name": "/usr/lib/python3.12/zoneinfo/_zoneinfo.py", "type": "file" }, { - "bom-ref": "e4c0b5e1b5e3b7e0", - "name": "/usr/lib/python3/dist-packages/_distutils_hack/__init__.py", + "bom-ref": "a4f997870749b333", + "name": "/usr/lib/python3/dist-packages/PyGObject-3.48.2.egg-info", "type": "file" }, { - "bom-ref": "72b2b3a63f24c1d3", - "name": "/usr/lib/python3/dist-packages/_distutils_hack/override.py", + "bom-ref": "c3ce85dcd0398434", + "name": "/usr/lib/python3/dist-packages/PyJWT-2.7.0.dist-info/INSTALLER", "type": "file" }, { - "bom-ref": "47f37f81d244cc84", - "name": "/usr/lib/python3/dist-packages/distutils-precedence.pth", + "bom-ref": "4844ced9cc2461e3", + "name": "/usr/lib/python3/dist-packages/PyJWT-2.7.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cf159963643188a9", - "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/INSTALLER", + "bom-ref": "5dc7e5adcfefd396", + "name": "/usr/lib/python3/dist-packages/PyJWT-2.7.0.dist-info/WHEEL", "type": "file" }, { - "bom-ref": "594241f581a3cfab", - "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/METADATA", + "bom-ref": "bd41127c83a9da6e", + "name": "/usr/lib/python3/dist-packages/PyJWT-2.7.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "eabd15931fc36fb3", - "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/WHEEL", + "bom-ref": "ec3163edb19f9c4b", + "name": "/usr/lib/python3/dist-packages/_cffi_backend.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "b7859af813fe1f6a", - "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/entry_points.txt", + "bom-ref": "6a8bf1045f056f23", + "name": "/usr/lib/python3/dist-packages/_dbus_bindings.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "b1c98ef1e173f924", - "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/top_level.txt", + "bom-ref": "0d399ad32e62c82b", + "name": "/usr/lib/python3/dist-packages/_dbus_glib_bindings.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "a8cbe0c07df6a9e4", - "name": "/usr/lib/python3/dist-packages/pip/__init__.py", + "bom-ref": "00dd74d546bade54", + "name": "/usr/lib/python3/dist-packages/_distutils_hack/__init__.py", "type": "file" }, { - "bom-ref": "6d6e83cf2f1999f1", - "name": "/usr/lib/python3/dist-packages/pip/__main__.py", + "bom-ref": "3d9094f5f269a823", + "name": "/usr/lib/python3/dist-packages/_distutils_hack/override.py", "type": "file" }, { - "bom-ref": "ae22d2b8465f1d2b", - "name": "/usr/lib/python3/dist-packages/pip/__pip-runner__.py", + "bom-ref": "7825b0b09a6d4fd2", + "name": "/usr/lib/python3/dist-packages/apt/__init__.py", "type": "file" }, { - "bom-ref": "12707a7f4b0b19ba", - "name": "/usr/lib/python3/dist-packages/pip/_internal/__init__.py", + "bom-ref": "7d9cded80a73d665", + "name": "/usr/lib/python3/dist-packages/apt/auth.py", "type": "file" }, { - "bom-ref": "66c3bd5f41ad1c58", - "name": "/usr/lib/python3/dist-packages/pip/_internal/build_env.py", + "bom-ref": "787ae1ba2c51c746", + "name": "/usr/lib/python3/dist-packages/apt/cache.py", "type": "file" }, { - "bom-ref": "61e48dec950569e0", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cache.py", + "bom-ref": "b21ed2791c9f15c1", + "name": "/usr/lib/python3/dist-packages/apt/cdrom.py", "type": "file" }, { - "bom-ref": "5037f2d0b1a8b819", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/__init__.py", + "bom-ref": "bbafec66af474d36", + "name": "/usr/lib/python3/dist-packages/apt/debfile.py", "type": "file" }, { - "bom-ref": "88cb055a964d2a45", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/autocompletion.py", + "bom-ref": "f05bf432c06e3d69", + "name": "/usr/lib/python3/dist-packages/apt/package.py", "type": "file" }, { - "bom-ref": "d36cc511628a3b72", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/base_command.py", + "bom-ref": "3d9c5a7ef6cf08b8", + "name": "/usr/lib/python3/dist-packages/apt/progress/__init__.py", "type": "file" }, { - "bom-ref": "402517e510deb2f0", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/cmdoptions.py", + "bom-ref": "739da4673d9fbad3", + "name": "/usr/lib/python3/dist-packages/apt/progress/base.py", "type": "file" }, { - "bom-ref": "4d010773bb65cd94", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/command_context.py", + "bom-ref": "cab1717099face01", + "name": "/usr/lib/python3/dist-packages/apt/progress/text.py", "type": "file" }, { - "bom-ref": "c63326448dca855a", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/main.py", + "bom-ref": "1ed7602083d9faee", + "name": "/usr/lib/python3/dist-packages/apt/py.typed", "type": "file" }, { - "bom-ref": "1dff8309a49da20e", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/main_parser.py", + "bom-ref": "37faf3d18128ed13", + "name": "/usr/lib/python3/dist-packages/apt/utils.py", "type": "file" }, { - "bom-ref": "5b6deeaf061033c7", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/parser.py", + "bom-ref": "b4a5b8a341141c77", + "name": "/usr/lib/python3/dist-packages/apt_inst-stubs/__init__.pyi", "type": "file" }, { - "bom-ref": "9cbd3137dc286417", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/progress_bars.py", + "bom-ref": "dcc2da3f2ce9cace", + "name": "/usr/lib/python3/dist-packages/apt_inst.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "1ca84aa1474269be", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/req_command.py", + "bom-ref": "d1317d70150b9bd8", + "name": "/usr/lib/python3/dist-packages/apt_pkg-stubs/__init__.pyi", "type": "file" }, { - "bom-ref": "54c1805f816152ed", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/spinners.py", + "bom-ref": "45a81e334db47dae", + "name": "/usr/lib/python3/dist-packages/apt_pkg.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "7ea5754f2661cacd", - "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/status_codes.py", + "bom-ref": "86486b9b8109ae26", + "name": "/usr/lib/python3/dist-packages/aptsources/__init__.py", "type": "file" }, { - "bom-ref": "42d7dfbf83c8e02b", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/__init__.py", + "bom-ref": "b031d8e5eed87625", + "name": "/usr/lib/python3/dist-packages/aptsources/_deb822.py", "type": "file" }, { - "bom-ref": "ede9f27b52d52f47", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/cache.py", + "bom-ref": "76ea4894e20b270d", + "name": "/usr/lib/python3/dist-packages/aptsources/distinfo.py", "type": "file" }, { - "bom-ref": "9490a2adc5721cb8", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/check.py", + "bom-ref": "b130148751878d14", + "name": "/usr/lib/python3/dist-packages/aptsources/distro.py", "type": "file" }, { - "bom-ref": "ec4803b8b346813d", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/completion.py", + "bom-ref": "70c17449ccb38d97", + "name": "/usr/lib/python3/dist-packages/aptsources/sourceslist.py", "type": "file" }, { - "bom-ref": "813300a3e6112610", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/configuration.py", + "bom-ref": "967226ea84f3cbb7", + "name": "/usr/lib/python3/dist-packages/blinker-1.7.0.dist-info/INSTALLER", "type": "file" }, { - "bom-ref": "d4e8dd484d94ad08", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/debug.py", + "bom-ref": "aff520b329ef5c3e", + "name": "/usr/lib/python3/dist-packages/blinker-1.7.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e62fc6589e43aea6", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/download.py", + "bom-ref": "d6e0c08522d5acd6", + "name": "/usr/lib/python3/dist-packages/blinker-1.7.0.dist-info/WHEEL", "type": "file" }, { - "bom-ref": "52f359b6f59b96f7", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/freeze.py", + "bom-ref": "2a9e70ac02e1eaa3", + "name": "/usr/lib/python3/dist-packages/blinker/__init__.py", "type": "file" }, { - "bom-ref": "5f34bd101449814a", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/hash.py", + "bom-ref": "c93ebda16a845af4", + "name": "/usr/lib/python3/dist-packages/blinker/_saferef.py", "type": "file" }, { - "bom-ref": "0e2b093cf3c12798", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/help.py", + "bom-ref": "ca55400360364e2a", + "name": "/usr/lib/python3/dist-packages/blinker/_utilities.py", "type": "file" }, { - "bom-ref": "921b7c5fde5cfff3", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/index.py", + "bom-ref": "9efb10515d49dc01", + "name": "/usr/lib/python3/dist-packages/blinker/base.py", "type": "file" }, { - "bom-ref": "b7c0e92b388ae71f", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/inspect.py", + "bom-ref": "62bbcf9abd274895", + "name": "/usr/lib/python3/dist-packages/blinker/py.typed", "type": "file" }, { - "bom-ref": "fb154a5e47ba8674", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/install.py", + "bom-ref": "c585a14352f68c02", + "name": "/usr/lib/python3/dist-packages/cryptography-41.0.7.dist-info/INSTALLER", "type": "file" }, { - "bom-ref": "d4097c5a479270d8", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/list.py", + "bom-ref": "60ae96a6fce93ae6", + "name": "/usr/lib/python3/dist-packages/cryptography-41.0.7.dist-info/METADATA", "type": "file" }, { - "bom-ref": "fb3e31cba5778ed6", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/search.py", + "bom-ref": "772ea70d14b40eac", + "name": "/usr/lib/python3/dist-packages/cryptography-41.0.7.dist-info/WHEEL", "type": "file" }, { - "bom-ref": "a03316f27d25d1d8", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/show.py", + "bom-ref": "648871dbaff95bc0", + "name": "/usr/lib/python3/dist-packages/cryptography-41.0.7.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "348589f8623a5bb2", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/uninstall.py", + "bom-ref": "7156dc096bb42c9a", + "name": "/usr/lib/python3/dist-packages/cryptography.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "601602eceac4e3eb", - "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/wheel.py", + "bom-ref": "9103ee82398df6dd", + "name": "/usr/lib/python3/dist-packages/cryptography.egg-info/dependency_links.txt", "type": "file" }, { - "bom-ref": "827386a11292d82b", - "name": "/usr/lib/python3/dist-packages/pip/_internal/configuration.py", + "bom-ref": "ed937645b5881f68", + "name": "/usr/lib/python3/dist-packages/cryptography.egg-info/not-zip-safe", "type": "file" }, { - "bom-ref": "5dbb2fcf7d430e04", - "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/__init__.py", + "bom-ref": "b34b439b893d2a38", + "name": "/usr/lib/python3/dist-packages/cryptography.egg-info/requires.txt", "type": "file" }, { - "bom-ref": "ac624f36072c51c2", - "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/base.py", + "bom-ref": "ea09c21f4ac64d60", + "name": "/usr/lib/python3/dist-packages/cryptography.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "4bc1a054c890ae1c", - "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/installed.py", + "bom-ref": "72463ddcf36c9bc3", + "name": "/usr/lib/python3/dist-packages/cryptography/__about__.py", "type": "file" }, { - "bom-ref": "45d5ec33add699db", - "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/sdist.py", + "bom-ref": "911fe208abcf7e36", + "name": "/usr/lib/python3/dist-packages/cryptography/__init__.py", "type": "file" }, { - "bom-ref": "2192f953d29f94af", - "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/wheel.py", + "bom-ref": "7e40b6dc4f85e87f", + "name": "/usr/lib/python3/dist-packages/cryptography/exceptions.py", "type": "file" }, { - "bom-ref": "4e9a8d3a9308bafe", - "name": "/usr/lib/python3/dist-packages/pip/_internal/exceptions.py", + "bom-ref": "0ab30f6bc25ebd2b", + "name": "/usr/lib/python3/dist-packages/cryptography/fernet.py", "type": "file" }, { - "bom-ref": "b21a32c62ceeb589", - "name": "/usr/lib/python3/dist-packages/pip/_internal/index/__init__.py", + "bom-ref": "99ce8442d2d47d2a", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/__init__.py", "type": "file" }, { - "bom-ref": "84e748134dd675bc", - "name": "/usr/lib/python3/dist-packages/pip/_internal/index/collector.py", + "bom-ref": "694f1c3632b32a68", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/_oid.py", "type": "file" }, { - "bom-ref": "d1f3cf3d154aeecc", - "name": "/usr/lib/python3/dist-packages/pip/_internal/index/package_finder.py", + "bom-ref": "29a35daf47cd6ba9", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/__init__.py", "type": "file" }, { - "bom-ref": "4b285f3574e3f28a", - "name": "/usr/lib/python3/dist-packages/pip/_internal/index/sources.py", + "bom-ref": "3bc3e7184dab2753", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/__init__.py", "type": "file" }, { - "bom-ref": "c58e2a7eb7a47173", - "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/__init__.py", + "bom-ref": "e273515c26fb97a6", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/aead.py", "type": "file" }, { - "bom-ref": "8aeb6489a9ce7ff1", - "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/_distutils.py", + "bom-ref": "0d675479759ca70d", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/backend.py", "type": "file" }, { - "bom-ref": "3516f32e99cd5e7b", - "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/_sysconfig.py", + "bom-ref": "1eeec7050ad69c72", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/ciphers.py", "type": "file" }, { - "bom-ref": "de068b422b52034b", - "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/base.py", + "bom-ref": "3d996c22243e4d27", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/cmac.py", "type": "file" }, { - "bom-ref": "31e9dfe117d363b8", - "name": "/usr/lib/python3/dist-packages/pip/_internal/main.py", + "bom-ref": "724297f5976a144a", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/decode_asn1.py", "type": "file" }, { - "bom-ref": "05cebeea664612a8", - "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/__init__.py", + "bom-ref": "dc8a8be9ef0c84e1", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/ec.py", "type": "file" }, { - "bom-ref": "9e3aaf3225ab04b4", - "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/_json.py", + "bom-ref": "a18eb628b45c56ea", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/rsa.py", "type": "file" }, { - "bom-ref": "81762757f97f3dd5", - "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/base.py", + "bom-ref": "b9bc869ce8e26633", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/utils.py", "type": "file" }, { - "bom-ref": "535e654a252f4de2", - "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/__init__.py", + "bom-ref": "97144cfbe92287ec", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/__init__.py", "type": "file" }, { - "bom-ref": "81a4ac87df1aadc3", - "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/_compat.py", + "bom-ref": "50b9f6aff0d520e6", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust.abi3.so", "type": "file" }, { - "bom-ref": "c201c349f4fc1c14", - "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/_dists.py", + "bom-ref": "d1fdc11021758694", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/__init__.pyi", "type": "file" }, { - "bom-ref": "18b8209b1d1ba38a", - "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/_envs.py", + "bom-ref": "b1da0263c0b0afea", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/_openssl.pyi", "type": "file" }, { - "bom-ref": "8631e1b536e6f623", - "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/pkg_resources.py", + "bom-ref": "7394f59454da5a71", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/asn1.pyi", "type": "file" }, { - "bom-ref": "adc125fe5441efbe", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/__init__.py", + "bom-ref": "41a0c6253761a951", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/exceptions.pyi", "type": "file" }, { - "bom-ref": "8d77658c63700a3d", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/candidate.py", + "bom-ref": "1c4ebf6d6460c38b", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/ocsp.pyi", "type": "file" }, { - "bom-ref": "d92a939f7e933371", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/direct_url.py", + "bom-ref": "de57eca5442c47a2", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/__init__.pyi", "type": "file" }, { - "bom-ref": "b3991127c2e5ab3c", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/format_control.py", + "bom-ref": "5090c8bc1e984005", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/dh.pyi", "type": "file" }, { - "bom-ref": "26933d9f71cec82a", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/index.py", + "bom-ref": "ef9a1353de74a0c3", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/dsa.pyi", "type": "file" }, { - "bom-ref": "1daf7487faff32c7", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/installation_report.py", + "bom-ref": "5c066b483b16de01", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi", "type": "file" }, { - "bom-ref": "e392288ffe76d6fe", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/link.py", + "bom-ref": "fcfb7f0aa564c19e", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/ed448.pyi", "type": "file" }, { - "bom-ref": "1301120fbd8b5482", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/scheme.py", + "bom-ref": "4f227d573feb23b2", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/hashes.pyi", "type": "file" }, { - "bom-ref": "f194d6674a7f3872", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/search_scope.py", + "bom-ref": "128a5bb453e8fc75", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/hmac.pyi", "type": "file" }, { - "bom-ref": "8abda70f9ae686f3", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/selection_prefs.py", + "bom-ref": "455d8cb4fa9f505b", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/kdf.pyi", "type": "file" }, { - "bom-ref": "36b0372940b6485d", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/target_python.py", + "bom-ref": "b0a15637b642f650", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi", "type": "file" }, { - "bom-ref": "ce081732b9e77ea2", - "name": "/usr/lib/python3/dist-packages/pip/_internal/models/wheel.py", + "bom-ref": "6e302df9e8ab99fd", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/x25519.pyi", "type": "file" }, { - "bom-ref": "b2e26a615253ab46", - "name": "/usr/lib/python3/dist-packages/pip/_internal/network/__init__.py", + "bom-ref": "c85ae8e67cb0aa2e", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/openssl/x448.pyi", "type": "file" }, { - "bom-ref": "99c0c9e96d819649", - "name": "/usr/lib/python3/dist-packages/pip/_internal/network/auth.py", + "bom-ref": "1800a9694ea427fe", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/pkcs7.pyi", "type": "file" }, { - "bom-ref": "9bf9ea5907a8d4d9", - "name": "/usr/lib/python3/dist-packages/pip/_internal/network/cache.py", + "bom-ref": "51c03aff7c404ebb", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/_rust/x509.pyi", "type": "file" }, { - "bom-ref": "30069e2762b235c8", - "name": "/usr/lib/python3/dist-packages/pip/_internal/network/download.py", + "bom-ref": "b4121eb287933aef", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/openssl/__init__.py", "type": "file" }, { - "bom-ref": "a38b68063e600e22", - "name": "/usr/lib/python3/dist-packages/pip/_internal/network/lazy_wheel.py", + "bom-ref": "643e002331d89070", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/openssl/_conditional.py", "type": "file" }, { - "bom-ref": "340bdfe1b7a03358", - "name": "/usr/lib/python3/dist-packages/pip/_internal/network/session.py", + "bom-ref": "5416f180ca6a9239", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/openssl/binding.py", "type": "file" }, { - "bom-ref": "59ae82c9ad670875", - "name": "/usr/lib/python3/dist-packages/pip/_internal/network/utils.py", + "bom-ref": "a69a6c440bdfe50a", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/__init__.py", "type": "file" }, { - "bom-ref": "fd9b1fbb96ee114b", - "name": "/usr/lib/python3/dist-packages/pip/_internal/network/xmlrpc.py", + "bom-ref": "84d28257ff2420c2", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/_asymmetric.py", "type": "file" }, { - "bom-ref": "7294bf5577b5011c", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/__init__.py", + "bom-ref": "bc0ab32940f82b87", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/_cipheralgorithm.py", "type": "file" }, { - "bom-ref": "37dda3e2a650c1e0", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/__init__.py", + "bom-ref": "dd8b09e8cd53ef44", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/_serialization.py", "type": "file" }, { - "bom-ref": "63fcf06c3c33f2e0", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/build_tracker.py", + "bom-ref": "f1f4cfaacaa5a906", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/__init__.py", "type": "file" }, { - "bom-ref": "3603623d3ce4125b", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/metadata.py", + "bom-ref": "c71f33aa67d1788b", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/dh.py", "type": "file" }, { - "bom-ref": "f8985f8f70e913a7", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/metadata_editable.py", + "bom-ref": "11212acd3a2940df", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/dsa.py", "type": "file" }, { - "bom-ref": "78c1f3d71e86b97e", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/metadata_legacy.py", + "bom-ref": "34db09d302f772de", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/ec.py", "type": "file" }, { - "bom-ref": "b99f271c9e1c3e1e", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/wheel.py", + "bom-ref": "9d6334478885c1c8", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/ed25519.py", "type": "file" }, { - "bom-ref": "0c0bf68273e2c4a5", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/wheel_editable.py", + "bom-ref": "829d09745319c0b2", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/ed448.py", "type": "file" }, { - "bom-ref": "ebae44be0888ba42", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/wheel_legacy.py", + "bom-ref": "5b27970358424ccf", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/padding.py", "type": "file" }, { - "bom-ref": "3b83dcbf23848d80", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/check.py", + "bom-ref": "ade33621551d586f", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/rsa.py", "type": "file" }, { - "bom-ref": "347f79f11fd16955", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/freeze.py", + "bom-ref": "ee70dce49b802746", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/types.py", "type": "file" }, { - "bom-ref": "a7ae7d41c1eefbb5", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/install/__init__.py", + "bom-ref": "c649fadfe8018209", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/utils.py", "type": "file" }, { - "bom-ref": "b96b8eb4ccb629f4", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/install/editable_legacy.py", + "bom-ref": "d37aa38c03363436", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/x25519.py", "type": "file" }, { - "bom-ref": "6c04be634619902f", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/install/wheel.py", + "bom-ref": "1a91c0fc147651a6", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/x448.py", "type": "file" }, { - "bom-ref": "9dedde10f954509b", - "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/prepare.py", + "bom-ref": "eee2ed505dd068fb", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/ciphers/__init__.py", "type": "file" }, { - "bom-ref": "4f236d54498add59", - "name": "/usr/lib/python3/dist-packages/pip/_internal/pyproject.py", + "bom-ref": "76ddacd5991f885a", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/ciphers/aead.py", "type": "file" }, { - "bom-ref": "1f0f354b507f078f", - "name": "/usr/lib/python3/dist-packages/pip/_internal/req/__init__.py", + "bom-ref": "52df614478208d90", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/ciphers/algorithms.py", "type": "file" }, { - "bom-ref": "367f1c892cde9117", - "name": "/usr/lib/python3/dist-packages/pip/_internal/req/constructors.py", + "bom-ref": "fe9c5abd684b8137", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/ciphers/base.py", "type": "file" }, { - "bom-ref": "d85916f2be901098", - "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", + "bom-ref": "b5b87c85c9f761b7", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/ciphers/modes.py", "type": "file" }, { - "bom-ref": "57b0705aa39af35c", - "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_install.py", + "bom-ref": "9ec9061555a6567f", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/cmac.py", "type": "file" }, { - "bom-ref": "2f29f1d5b985a22f", - "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_set.py", + "bom-ref": "b727bc424644cfdf", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/constant_time.py", "type": "file" }, { - "bom-ref": "3e618777f7f8623c", - "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_uninstall.py", + "bom-ref": "b158083d24d51894", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/hashes.py", "type": "file" }, { - "bom-ref": "4b1ef0f186c64cde", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/__init__.py", + "bom-ref": "28a6fcb9605cbfbf", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/hmac.py", "type": "file" }, { - "bom-ref": "fc265f426ce964b1", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/base.py", + "bom-ref": "8f49da716d39aa65", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/__init__.py", "type": "file" }, { - "bom-ref": "5b6894de203ea058", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/legacy/__init__.py", + "bom-ref": "c51fc193e96b896e", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/concatkdf.py", "type": "file" }, { - "bom-ref": "4ef848f181ab98c4", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/legacy/resolver.py", + "bom-ref": "69e054b6d845c070", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/hkdf.py", "type": "file" }, { - "bom-ref": "3cfc3a4d01f890fb", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/__init__.py", + "bom-ref": "d88aa58a23df2c37", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/kbkdf.py", "type": "file" }, { - "bom-ref": "04d0d3b23e777b18", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/base.py", + "bom-ref": "8d5723dd4e66e87b", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/pbkdf2.py", "type": "file" }, { - "bom-ref": "ae7e2a0e6a423f2a", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/candidates.py", + "bom-ref": "f32c6d898fb85967", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/scrypt.py", "type": "file" }, { - "bom-ref": "54e4bdf54fe6f5d4", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/factory.py", + "bom-ref": "ec5a5a90827b567d", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/x963kdf.py", "type": "file" }, { - "bom-ref": "c8525d527ec79753", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/found_candidates.py", + "bom-ref": "c21c18d69aa58c89", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/keywrap.py", "type": "file" }, { - "bom-ref": "238f6e2c2ef28a5a", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/provider.py", + "bom-ref": "911a260e9de5d0fa", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/padding.py", "type": "file" }, { - "bom-ref": "bf8d0fda9326a3fe", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/reporter.py", + "bom-ref": "d0a8d8caea985dbc", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/poly1305.py", "type": "file" }, { - "bom-ref": "f7fe5da6e630fe20", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/requirements.py", + "bom-ref": "7537cc5ee9d8f53b", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/serialization/__init__.py", "type": "file" }, { - "bom-ref": "fdcf8f117ff058e7", - "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/resolver.py", + "bom-ref": "c21166d47fb1e712", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/serialization/base.py", "type": "file" }, { - "bom-ref": "4ba05686d7756b0d", - "name": "/usr/lib/python3/dist-packages/pip/_internal/self_outdated_check.py", + "bom-ref": "b9df4a32ca633c37", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/serialization/pkcs12.py", "type": "file" }, { - "bom-ref": "83a2f944e8bd1e11", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/__init__.py", + "bom-ref": "0db4aa31ec6e0e95", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/serialization/pkcs7.py", "type": "file" }, { - "bom-ref": "760395e9d1abd150", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/_jaraco_text.py", + "bom-ref": "c05890f078e92137", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/serialization/ssh.py", "type": "file" }, { - "bom-ref": "6a10a111e2eda8fc", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/_log.py", + "bom-ref": "760f56116bdedd0a", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/twofactor/__init__.py", "type": "file" }, { - "bom-ref": "a188616cf9474c6a", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/appdirs.py", + "bom-ref": "083e1139a0a71ad1", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/twofactor/hotp.py", "type": "file" }, { - "bom-ref": "33a88e73ad618712", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/compat.py", + "bom-ref": "09a857e3c73f8f1a", + "name": "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/twofactor/totp.py", "type": "file" }, { - "bom-ref": "43a0ea42d17effae", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/compatibility_tags.py", + "bom-ref": "7ca5221bcbfc0eb5", + "name": "/usr/lib/python3/dist-packages/cryptography/py.typed", "type": "file" }, { - "bom-ref": "1e974b4ea314f23e", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/datetime.py", + "bom-ref": "fc6ea0551889a344", + "name": "/usr/lib/python3/dist-packages/cryptography/utils.py", "type": "file" }, { - "bom-ref": "2592b6f693fcce70", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/deprecation.py", + "bom-ref": "5e5cc59f505eaaa9", + "name": "/usr/lib/python3/dist-packages/cryptography/x509/__init__.py", "type": "file" }, { - "bom-ref": "f7930ea45b866b31", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/direct_url_helpers.py", + "bom-ref": "c14381398b8ee52f", + "name": "/usr/lib/python3/dist-packages/cryptography/x509/base.py", "type": "file" }, { - "bom-ref": "98c325696453ebd0", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/egg_link.py", + "bom-ref": "181ba7af0547e80b", + "name": "/usr/lib/python3/dist-packages/cryptography/x509/certificate_transparency.py", "type": "file" }, { - "bom-ref": "20da2f96dcd7d89a", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/encoding.py", + "bom-ref": "bece33dee2ed36d2", + "name": "/usr/lib/python3/dist-packages/cryptography/x509/extensions.py", "type": "file" }, { - "bom-ref": "573df78cd25f33a8", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/entrypoints.py", + "bom-ref": "8629320ce95e76ea", + "name": "/usr/lib/python3/dist-packages/cryptography/x509/general_name.py", "type": "file" }, { - "bom-ref": "1dcac4269cb5797b", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/filesystem.py", + "bom-ref": "6472558470edbad0", + "name": "/usr/lib/python3/dist-packages/cryptography/x509/name.py", "type": "file" }, { - "bom-ref": "d6b5f38e867a1e5d", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/filetypes.py", + "bom-ref": "f00ca8ef7f10dd1e", + "name": "/usr/lib/python3/dist-packages/cryptography/x509/ocsp.py", "type": "file" }, { - "bom-ref": "6e25fed29d1b8d34", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/glibc.py", + "bom-ref": "05151fbacfcfe790", + "name": "/usr/lib/python3/dist-packages/cryptography/x509/oid.py", "type": "file" }, { - "bom-ref": "0113c63f94a18a9f", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/hashes.py", + "bom-ref": "ae617b8c7df15c52", + "name": "/usr/lib/python3/dist-packages/dbus/__init__.py", "type": "file" }, { - "bom-ref": "d140eca2b2c5b971", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/logging.py", + "bom-ref": "249b267549e33b88", + "name": "/usr/lib/python3/dist-packages/dbus/_compat.py", "type": "file" }, { - "bom-ref": "ed0b47179a8c7c99", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/misc.py", + "bom-ref": "d0e6367d4f859f2a", + "name": "/usr/lib/python3/dist-packages/dbus/_dbus.py", "type": "file" }, { - "bom-ref": "d5f20bf217bddf53", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/models.py", + "bom-ref": "37958078d623486c", + "name": "/usr/lib/python3/dist-packages/dbus/_expat_introspect_parser.py", "type": "file" }, { - "bom-ref": "b9fa3ddf6f441aef", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/packaging.py", + "bom-ref": "c33fe854f28ab60a", + "name": "/usr/lib/python3/dist-packages/dbus/bus.py", "type": "file" }, { - "bom-ref": "9d4c0b195624e8f6", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/setuptools_build.py", + "bom-ref": "a0e1421c5d689384", + "name": "/usr/lib/python3/dist-packages/dbus/connection.py", "type": "file" }, { - "bom-ref": "4d1675dd091b861e", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/subprocess.py", + "bom-ref": "8cc4c902b890f20d", + "name": "/usr/lib/python3/dist-packages/dbus/decorators.py", "type": "file" }, { - "bom-ref": "8f93d0c0b4203cea", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/temp_dir.py", + "bom-ref": "9a846e2bf4aace01", + "name": "/usr/lib/python3/dist-packages/dbus/exceptions.py", "type": "file" }, { - "bom-ref": "fa5913d1c736b8b8", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/unpacking.py", + "bom-ref": "458f38afae4e5bb5", + "name": "/usr/lib/python3/dist-packages/dbus/gi_service.py", "type": "file" }, { - "bom-ref": "0c45c8da3ebbb1ff", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/urls.py", + "bom-ref": "f123ce2fd06f3f7b", + "name": "/usr/lib/python3/dist-packages/dbus/glib.py", "type": "file" }, { - "bom-ref": "ce898a4bbb0950e0", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/virtualenv.py", + "bom-ref": "9a0aac95c9cc3ce3", + "name": "/usr/lib/python3/dist-packages/dbus/lowlevel.py", "type": "file" }, { - "bom-ref": "f9d807ff154996b6", - "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/wheel.py", + "bom-ref": "30566f17c40c1bb9", + "name": "/usr/lib/python3/dist-packages/dbus/mainloop/__init__.py", "type": "file" }, { - "bom-ref": "5fb2fc3d49734fe8", - "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/__init__.py", + "bom-ref": "7a7a5f832de21e24", + "name": "/usr/lib/python3/dist-packages/dbus/mainloop/glib.py", "type": "file" }, { - "bom-ref": "d688d350b45848a7", - "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/bazaar.py", + "bom-ref": "46c5c7f4ca12f6ab", + "name": "/usr/lib/python3/dist-packages/dbus/proxies.py", "type": "file" }, { - "bom-ref": "a4194241fac8c6fa", - "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/git.py", + "bom-ref": "6321ab98f4a64438", + "name": "/usr/lib/python3/dist-packages/dbus/server.py", "type": "file" }, { - "bom-ref": "c4636aff1c090208", - "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/mercurial.py", + "bom-ref": "843932bfb2045f19", + "name": "/usr/lib/python3/dist-packages/dbus/service.py", "type": "file" }, { - "bom-ref": "540881f0dd8d357d", - "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/subversion.py", + "bom-ref": "78f5c691ce5e0962", + "name": "/usr/lib/python3/dist-packages/dbus/types.py", "type": "file" }, { - "bom-ref": "4d060eb650270d52", - "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/versioncontrol.py", + "bom-ref": "6de4ebc2b8077129", + "name": "/usr/lib/python3/dist-packages/dbus_python-1.3.2.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "c9322e57701156c0", - "name": "/usr/lib/python3/dist-packages/pip/_internal/wheel_builder.py", + "bom-ref": "f311d3deda4b63fd", + "name": "/usr/lib/python3/dist-packages/dbus_python-1.3.2.egg-info/dependency_links.txt", "type": "file" }, { - "bom-ref": "4fe0feb75c8af4fc", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/__init__.py", + "bom-ref": "d6215e39da61d09a", + "name": "/usr/lib/python3/dist-packages/dbus_python-1.3.2.egg-info/not-zip-safe", "type": "file" }, { - "bom-ref": "36f72ce5f3caf665", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/__init__.py", + "bom-ref": "3c780121d4c162b7", + "name": "/usr/lib/python3/dist-packages/dbus_python-1.3.2.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "cd91a9a9a8a01463", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/_cmd.py", + "bom-ref": "70639e189d494e61", + "name": "/usr/lib/python3/dist-packages/distro-1.9.0.dist-info/INSTALLER", "type": "file" }, { - "bom-ref": "28e864718778205d", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/adapter.py", + "bom-ref": "2a0934752a1acf7e", + "name": "/usr/lib/python3/dist-packages/distro-1.9.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "dc3c6649b7d3af5d", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/cache.py", + "bom-ref": "678a7e687e46ae09", + "name": "/usr/lib/python3/dist-packages/distro-1.9.0.dist-info/WHEEL", "type": "file" }, { - "bom-ref": "7fd075655e3c65d5", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/caches/__init__.py", + "bom-ref": "1d1af9dd8a189f8a", + "name": "/usr/lib/python3/dist-packages/distro-1.9.0.dist-info/entry_points.txt", "type": "file" }, { - "bom-ref": "20a204a296e57e53", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/caches/file_cache.py", + "bom-ref": "bf07a67a318fedce", + "name": "/usr/lib/python3/dist-packages/distro-1.9.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "fd408b5b86d2e852", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/caches/redis_cache.py", + "bom-ref": "d54e0db9a56cdd48", + "name": "/usr/lib/python3/dist-packages/distro/__init__.py", "type": "file" }, { - "bom-ref": "ae4ff40c6104a8b3", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/controller.py", + "bom-ref": "b88dab170b90dd35", + "name": "/usr/lib/python3/dist-packages/distro/__main__.py", "type": "file" }, { - "bom-ref": "ec77e954277ba682", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/filewrapper.py", + "bom-ref": "107233d2cfec1d76", + "name": "/usr/lib/python3/dist-packages/distro/distro.py", "type": "file" }, { - "bom-ref": "8a28a6ea85e48a3a", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/heuristics.py", + "bom-ref": "cf4126d59fba8d51", + "name": "/usr/lib/python3/dist-packages/distro/py.typed", "type": "file" }, { - "bom-ref": "2b7a2222a9dd4e21", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/serialize.py", + "bom-ref": "f609ef079aa17cc8", + "name": "/usr/lib/python3/dist-packages/distutils-precedence.pth", "type": "file" }, { - "bom-ref": "34cbbebca7ca2c56", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/wrapper.py", + "bom-ref": "1c79e80bee0362c2", + "name": "/usr/lib/python3/dist-packages/gi/__init__.py", "type": "file" }, { - "bom-ref": "ee7ec698636d1f15", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/__init__.py", + "bom-ref": "f9ca3284722b0dc2", + "name": "/usr/lib/python3/dist-packages/gi/_constants.py", "type": "file" }, { - "bom-ref": "536985b599f80c64", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/__main__.py", + "bom-ref": "6edf3788e603230b", + "name": "/usr/lib/python3/dist-packages/gi/_error.py", "type": "file" }, { - "bom-ref": "8a67a8635f3f738c", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/cacert.pem", + "bom-ref": "cfbba623268a8c6e", + "name": "/usr/lib/python3/dist-packages/gi/_gi.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "3bc6ee51517558e7", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/core.py", + "bom-ref": "2d802d88ad84c7dc", + "name": "/usr/lib/python3/dist-packages/gi/_gtktemplate.py", "type": "file" }, { - "bom-ref": "e95ab36d238f7bb1", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/__init__.py", + "bom-ref": "a69b6cf53c76f63e", + "name": "/usr/lib/python3/dist-packages/gi/_option.py", "type": "file" }, { - "bom-ref": "c5c6b94a97a73471", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/big5freq.py", + "bom-ref": "ea8a0ed665e32058", + "name": "/usr/lib/python3/dist-packages/gi/_ossighelper.py", "type": "file" }, { - "bom-ref": "0d0922ed279251ae", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/big5prober.py", + "bom-ref": "f940f1162b46f5d7", + "name": "/usr/lib/python3/dist-packages/gi/_propertyhelper.py", "type": "file" }, { - "bom-ref": "9b3b436a9c9e56c4", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/chardistribution.py", + "bom-ref": "3435938a4a7fdc53", + "name": "/usr/lib/python3/dist-packages/gi/_signalhelper.py", "type": "file" }, { - "bom-ref": "f844858bc3f76a9b", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/charsetgroupprober.py", + "bom-ref": "7743664cdbcf3900", + "name": "/usr/lib/python3/dist-packages/gi/docstring.py", "type": "file" }, { - "bom-ref": "2ac40862e313e906", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/charsetprober.py", + "bom-ref": "507453113105d9db", + "name": "/usr/lib/python3/dist-packages/gi/importer.py", "type": "file" }, { - "bom-ref": "150fe73d7921fc9f", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/cli/__init__.py", + "bom-ref": "475c3f81c56d47ab", + "name": "/usr/lib/python3/dist-packages/gi/module.py", "type": "file" }, { - "bom-ref": "3b8adc85fad6c1fe", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/cli/chardetect.py", + "bom-ref": "de5fbabe282c3efe", + "name": "/usr/lib/python3/dist-packages/gi/overrides/GIMarshallingTests.py", "type": "file" }, { - "bom-ref": "605628970f606eb3", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/codingstatemachine.py", + "bom-ref": "ba31a95fe1a1db62", + "name": "/usr/lib/python3/dist-packages/gi/overrides/GLib.py", "type": "file" }, { - "bom-ref": "2737eed7ec2a5e31", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/codingstatemachinedict.py", + "bom-ref": "64bd4bf3a23d713a", + "name": "/usr/lib/python3/dist-packages/gi/overrides/GObject.py", "type": "file" }, { - "bom-ref": "7d63e09945652403", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/cp949prober.py", + "bom-ref": "6f51f3b857c33289", + "name": "/usr/lib/python3/dist-packages/gi/overrides/Gdk.py", "type": "file" }, { - "bom-ref": "ecd7e7ec5124d726", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/enums.py", + "bom-ref": "99f4f403f9512d05", + "name": "/usr/lib/python3/dist-packages/gi/overrides/GdkPixbuf.py", "type": "file" }, { - "bom-ref": "6a6eff9ee4f23a6b", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/escprober.py", + "bom-ref": "8e9c9bf1b55834bd", + "name": "/usr/lib/python3/dist-packages/gi/overrides/Gio.py", "type": "file" }, { - "bom-ref": "506d253e772c00cc", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/escsm.py", + "bom-ref": "2ce9eea7c9198091", + "name": "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", "type": "file" }, { - "bom-ref": "9770732597813ae3", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/eucjpprober.py", + "bom-ref": "1f3639f91744ffa1", + "name": "/usr/lib/python3/dist-packages/gi/overrides/Pango.py", "type": "file" }, { - "bom-ref": "cdc08ed6c30b3d5e", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euckrfreq.py", + "bom-ref": "11cd77abf3f11398", + "name": "/usr/lib/python3/dist-packages/gi/overrides/__init__.py", "type": "file" }, { - "bom-ref": "73bd279d3f7c75ef", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euckrprober.py", + "bom-ref": "742963a60b95c1f6", + "name": "/usr/lib/python3/dist-packages/gi/overrides/keysyms.py", "type": "file" }, { - "bom-ref": "fe05f50da0019774", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euctwfreq.py", + "bom-ref": "480af9cab30654d1", + "name": "/usr/lib/python3/dist-packages/gi/pygtkcompat.py", "type": "file" }, { - "bom-ref": "7f97695500a25274", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euctwprober.py", + "bom-ref": "54eaf924a2d8483a", + "name": "/usr/lib/python3/dist-packages/gi/repository/__init__.py", "type": "file" }, { - "bom-ref": "487f60c1081f6b05", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/gb2312freq.py", + "bom-ref": "11377e63dadedec5", + "name": "/usr/lib/python3/dist-packages/gi/types.py", "type": "file" }, { - "bom-ref": "5ebd1fef3fdea3c0", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/gb2312prober.py", + "bom-ref": "378f4b9edc93de16", + "name": "/usr/lib/python3/dist-packages/httplib2-0.20.4.dist-info/INSTALLER", "type": "file" }, { - "bom-ref": "1bb97969979174af", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/hebrewprober.py", + "bom-ref": "2afe7758e0d76604", + "name": "/usr/lib/python3/dist-packages/httplib2-0.20.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a5886d3c0ed814b4", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/jisfreq.py", + "bom-ref": "b88c2675c87e2d02", + "name": "/usr/lib/python3/dist-packages/httplib2-0.20.4.dist-info/WHEEL", "type": "file" }, { - "bom-ref": "790e2ab1880c08e6", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/johabfreq.py", + "bom-ref": "12134f1557634037", + "name": "/usr/lib/python3/dist-packages/httplib2-0.20.4.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "816a5e9df8a3d780", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/johabprober.py", + "bom-ref": "bfb3084bd539a69d", + "name": "/usr/lib/python3/dist-packages/httplib2/__init__.py", "type": "file" }, { - "bom-ref": "3c2a9ce4d1ddb674", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/jpcntx.py", + "bom-ref": "ab23f6be987ccb78", + "name": "/usr/lib/python3/dist-packages/httplib2/auth.py", "type": "file" }, { - "bom-ref": "89ff2758c91b097f", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langbulgarianmodel.py", + "bom-ref": "9b66a8bd6b0ea644", + "name": "/usr/lib/python3/dist-packages/httplib2/certs.py", "type": "file" }, { - "bom-ref": "0cd99880a368cbb2", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langgreekmodel.py", + "bom-ref": "609ee2dded1362cf", + "name": "/usr/lib/python3/dist-packages/httplib2/decode.py", "type": "file" }, { - "bom-ref": "bd7c41c22bc7be94", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langhebrewmodel.py", + "bom-ref": "d01ddb36cb09f4fc", + "name": "/usr/lib/python3/dist-packages/httplib2/error.py", "type": "file" }, { - "bom-ref": "2444df209f65c5a6", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langhungarianmodel.py", + "bom-ref": "bc0f80b27fe94746", + "name": "/usr/lib/python3/dist-packages/httplib2/iri2uri.py", "type": "file" }, { - "bom-ref": "0d246d49be3773cb", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langrussianmodel.py", + "bom-ref": "5a33f4708191590c", + "name": "/usr/lib/python3/dist-packages/httplib2/socks.py", "type": "file" }, { - "bom-ref": "d00772f6bd5989b1", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langthaimodel.py", + "bom-ref": "c131289ddd7b6800", + "name": "/usr/lib/python3/dist-packages/jwt/__init__.py", "type": "file" }, { - "bom-ref": "5a8b9baa5f183968", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langturkishmodel.py", + "bom-ref": "75a9787b6e4b0045", + "name": "/usr/lib/python3/dist-packages/jwt/algorithms.py", "type": "file" }, { - "bom-ref": "e0a9e34593ca9836", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/latin1prober.py", + "bom-ref": "f208e0d2267b44c6", + "name": "/usr/lib/python3/dist-packages/jwt/api_jwk.py", "type": "file" }, { - "bom-ref": "1e0779b5bbc88738", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/macromanprober.py", + "bom-ref": "ff432ae5d7cf0239", + "name": "/usr/lib/python3/dist-packages/jwt/api_jws.py", "type": "file" }, { - "bom-ref": "4b0f64d85ca33562", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/mbcharsetprober.py", + "bom-ref": "9d7d3c602112a657", + "name": "/usr/lib/python3/dist-packages/jwt/api_jwt.py", "type": "file" }, { - "bom-ref": "afd032585bd5ae5c", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/mbcsgroupprober.py", + "bom-ref": "04e5c7f82eca4d55", + "name": "/usr/lib/python3/dist-packages/jwt/exceptions.py", "type": "file" }, { - "bom-ref": "8075e01dcc5a94f7", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/mbcssm.py", + "bom-ref": "367c990894aa5b45", + "name": "/usr/lib/python3/dist-packages/jwt/help.py", "type": "file" }, { - "bom-ref": "b8216c217c50f744", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/metadata/__init__.py", + "bom-ref": "6f7feaee818c6e82", + "name": "/usr/lib/python3/dist-packages/jwt/jwk_set_cache.py", "type": "file" }, { - "bom-ref": "9270b33fc6557a76", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/metadata/languages.py", + "bom-ref": "d47c50b6e56c41d3", + "name": "/usr/lib/python3/dist-packages/jwt/jwks_client.py", "type": "file" }, { - "bom-ref": "7286c0eb1b04446a", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/resultdict.py", + "bom-ref": "38c08235cd70b7d3", + "name": "/usr/lib/python3/dist-packages/jwt/py.typed", "type": "file" }, { - "bom-ref": "dc50ac97ba36c29d", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/sbcharsetprober.py", + "bom-ref": "46e713b41b3fb82a", + "name": "/usr/lib/python3/dist-packages/jwt/types.py", "type": "file" }, { - "bom-ref": "f82540b0f6d1948f", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/sbcsgroupprober.py", + "bom-ref": "2cf885e4136fbadf", + "name": "/usr/lib/python3/dist-packages/jwt/utils.py", "type": "file" }, { - "bom-ref": "0f5e6fef56e089be", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/sjisprober.py", + "bom-ref": "784eeaef27b650f4", + "name": "/usr/lib/python3/dist-packages/jwt/warnings.py", "type": "file" }, { - "bom-ref": "77cd65e5eb3897d0", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/universaldetector.py", + "bom-ref": "33a2a1d411c18b31", + "name": "/usr/lib/python3/dist-packages/launchpadlib-1.11.0.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "d3b6f1c5cbe04a7e", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/utf1632prober.py", + "bom-ref": "f58eda3771625b0b", + "name": "/usr/lib/python3/dist-packages/launchpadlib-1.11.0.egg-info/dependency_links.txt", "type": "file" }, { - "bom-ref": "cb9a4717798aa789", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/utf8prober.py", + "bom-ref": "25eb365dfeb18d2c", + "name": "/usr/lib/python3/dist-packages/launchpadlib-1.11.0.egg-info/not-zip-safe", "type": "file" }, { - "bom-ref": "da8024ba846cc102", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/version.py", + "bom-ref": "b04ea0b3adb428b5", + "name": "/usr/lib/python3/dist-packages/launchpadlib-1.11.0.egg-info/requires.txt", "type": "file" }, { - "bom-ref": "67f7ec80bc4cb74f", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/__init__.py", + "bom-ref": "66d61ec74dcbd483", + "name": "/usr/lib/python3/dist-packages/launchpadlib-1.11.0.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "0e33512050cd8290", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/ansi.py", + "bom-ref": "4e6090a6778a4939", + "name": "/usr/lib/python3/dist-packages/launchpadlib/__init__.py", "type": "file" }, { - "bom-ref": "c794d419dcf5b55b", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/ansitowin32.py", + "bom-ref": "342155da0b705b74", + "name": "/usr/lib/python3/dist-packages/launchpadlib/apps.py", "type": "file" }, { - "bom-ref": "a10ce49072b5bf59", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/initialise.py", + "bom-ref": "099b0dd4e65e4100", + "name": "/usr/lib/python3/dist-packages/launchpadlib/credentials.py", "type": "file" }, { - "bom-ref": "d3179af461166b8a", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/__init__.py", + "bom-ref": "cf435516c807a972", + "name": "/usr/lib/python3/dist-packages/launchpadlib/errors.py", "type": "file" }, { - "bom-ref": "468687129e2f5954", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/ansi_test.py", + "bom-ref": "b7f362ca6b88dba5", + "name": "/usr/lib/python3/dist-packages/launchpadlib/launchpad.py", "type": "file" }, { - "bom-ref": "a6cfcb21dbbe8f66", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/ansitowin32_test.py", + "bom-ref": "5f54bfe64a9950e3", + "name": "/usr/lib/python3/dist-packages/launchpadlib/testing/__init__.py", "type": "file" }, { - "bom-ref": "1072b8571b6544b2", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/initialise_test.py", + "bom-ref": "5cf7c11f1a286510", + "name": "/usr/lib/python3/dist-packages/launchpadlib/testing/helpers.py", "type": "file" }, { - "bom-ref": "008828fccdae6f23", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/isatty_test.py", + "bom-ref": "4573f37536e685dd", + "name": "/usr/lib/python3/dist-packages/launchpadlib/testing/launchpad-wadl.xml", "type": "file" }, { - "bom-ref": "e57cb1230ca13731", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/utils.py", + "bom-ref": "58561066fa09ab31", + "name": "/usr/lib/python3/dist-packages/launchpadlib/testing/launchpad.py", "type": "file" }, { - "bom-ref": "2dd72a35c78d0de1", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/winterm_test.py", + "bom-ref": "7412c1dc82da2a3e", + "name": "/usr/lib/python3/dist-packages/launchpadlib/testing/resources.py", "type": "file" }, { - "bom-ref": "4b268efe969f2751", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/win32.py", + "bom-ref": "0f90bf73ae2fd466", + "name": "/usr/lib/python3/dist-packages/launchpadlib/testing/testing-wadl.xml", "type": "file" }, { - "bom-ref": "8c5b9d1e5f33a452", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/winterm.py", + "bom-ref": "b47910a73a627c9c", + "name": "/usr/lib/python3/dist-packages/launchpadlib/testing/tests/__init__.py", "type": "file" }, { - "bom-ref": "0c3ff06f90ea5141", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/__init__.py", + "bom-ref": "cbab8b7c2566c0c7", + "name": "/usr/lib/python3/dist-packages/launchpadlib/testing/tests/test_launchpad.py", "type": "file" }, { - "bom-ref": "c6f13a31ea1158c7", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/compat.py", + "bom-ref": "f0ae4a502aebed00", + "name": "/usr/lib/python3/dist-packages/launchpadlib/tests/__init__.py", "type": "file" }, { - "bom-ref": "0427c110eec81bd8", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/database.py", + "bom-ref": "19497283706e4f55", + "name": "/usr/lib/python3/dist-packages/launchpadlib/tests/test_credential_store.py", "type": "file" }, { - "bom-ref": "58a166b5da4a1983", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/index.py", + "bom-ref": "25fecd181f19db9a", + "name": "/usr/lib/python3/dist-packages/launchpadlib/tests/test_http.py", "type": "file" }, { - "bom-ref": "883b2f2129e6e129", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/locators.py", + "bom-ref": "15d10683c610c44f", + "name": "/usr/lib/python3/dist-packages/launchpadlib/tests/test_launchpad.py", "type": "file" }, { - "bom-ref": "f46ad507dacdc9bb", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/manifest.py", + "bom-ref": "f58929fc27c1073d", + "name": "/usr/lib/python3/dist-packages/launchpadlib/uris.py", "type": "file" }, { - "bom-ref": "8a0a467e51f9d11b", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/markers.py", + "bom-ref": "d0eaeace07e68766", + "name": "/usr/lib/python3/dist-packages/lazr.restfulclient-0.14.6.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "937d9249a77fb74d", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/metadata.py", + "bom-ref": "9952785c9cd8a855", + "name": "/usr/lib/python3/dist-packages/lazr.restfulclient-0.14.6.egg-info/dependency_links.txt", "type": "file" }, { - "bom-ref": "c3fd7c27062dcd11", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/resources.py", + "bom-ref": "eab886323947aab7", + "name": "/usr/lib/python3/dist-packages/lazr.restfulclient-0.14.6.egg-info/namespace_packages.txt", "type": "file" }, { - "bom-ref": "a659cc4fb666aded", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/scripts.py", + "bom-ref": "fbe230aae23274d5", + "name": "/usr/lib/python3/dist-packages/lazr.restfulclient-0.14.6.egg-info/not-zip-safe", "type": "file" }, { - "bom-ref": "64b7c1b633609e15", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/util.py", + "bom-ref": "43d2406e8f244da3", + "name": "/usr/lib/python3/dist-packages/lazr.restfulclient-0.14.6.egg-info/requires.txt", "type": "file" }, { - "bom-ref": "35a2992485974850", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/version.py", + "bom-ref": "2dff25972206a87a", + "name": "/usr/lib/python3/dist-packages/lazr.restfulclient-0.14.6.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "c7c63ade6cd68ebf", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/wheel.py", + "bom-ref": "41a127d064fda442", + "name": "/usr/lib/python3/dist-packages/lazr.uri-1.0.6.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "5509688e70187276", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distro/__init__.py", + "bom-ref": "24f65d707b1913db", + "name": "/usr/lib/python3/dist-packages/lazr.uri-1.0.6.egg-info/dependency_links.txt", "type": "file" }, { - "bom-ref": "438f25aa5ad5f70e", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distro/__main__.py", + "bom-ref": "1b45ffeb80453c76", + "name": "/usr/lib/python3/dist-packages/lazr.uri-1.0.6.egg-info/namespace_packages.txt", "type": "file" }, { - "bom-ref": "d2f85d55fbf6534b", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/distro/distro.py", + "bom-ref": "0f6f868a8c53562c", + "name": "/usr/lib/python3/dist-packages/lazr.uri-1.0.6.egg-info/not-zip-safe", "type": "file" }, { - "bom-ref": "c32d7e0a0c01ccf8", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/__init__.py", + "bom-ref": "8728f99066525988", + "name": "/usr/lib/python3/dist-packages/lazr.uri-1.0.6.egg-info/requires.txt", "type": "file" }, { - "bom-ref": "efa28a0035b6683f", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/codec.py", + "bom-ref": "319ffd84151cae66", + "name": "/usr/lib/python3/dist-packages/lazr.uri-1.0.6.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "ed73c134bb36f1bb", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/compat.py", + "bom-ref": "62f0cd1b1677ba33", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/__init__.py", "type": "file" }, { - "bom-ref": "a6287a389be4eb38", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/core.py", + "bom-ref": "e74a2483d3627e0a", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/_browser.py", "type": "file" }, { - "bom-ref": "631a2c22b56ee79a", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/idnadata.py", + "bom-ref": "9419f041e36f76be", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/_json.py", "type": "file" }, { - "bom-ref": "59d4bab6a067be24", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/intranges.py", + "bom-ref": "7390faee6cdf905c", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/authorize/__init__.py", "type": "file" }, { - "bom-ref": "ec82e3543f0caa20", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/package_data.py", + "bom-ref": "dbfb4e030bbe2b25", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/authorize/oauth.py", "type": "file" }, { - "bom-ref": "8e940bcbb004f32e", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/uts46data.py", + "bom-ref": "e7108e62498b341d", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/errors.py", "type": "file" }, { - "bom-ref": "1e42e411e6842baa", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/__init__.py", + "bom-ref": "a1617ec746380075", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/resource.py", "type": "file" }, { - "bom-ref": "c33cd4668d3c86a3", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/exceptions.py", + "bom-ref": "e1974ff77953a894", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/tests/__init__.py", "type": "file" }, { - "bom-ref": "8d9c00a7cae0d32d", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/ext.py", + "bom-ref": "c26f5ead3b63828f", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/tests/example.py", "type": "file" }, { - "bom-ref": "f28b97b9f80b1279", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/fallback.py", + "bom-ref": "18cdcc38877c6981", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/tests/test_atomicfilecache.py", "type": "file" }, { - "bom-ref": "3cd2afb59d8df1ee", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/__about__.py", + "bom-ref": "99360bfb371c3f10", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/tests/test_docs.py", "type": "file" }, { - "bom-ref": "9a94e18db813ba66", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/__init__.py", + "bom-ref": "8439e97f04239384", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/tests/test_error.py", "type": "file" }, { - "bom-ref": "81c24c7b69d05701", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/_manylinux.py", + "bom-ref": "a5a27bbf87b92880", + "name": "/usr/lib/python3/dist-packages/lazr/restfulclient/tests/test_oauth.py", "type": "file" }, { - "bom-ref": "ec5a93b2e0927845", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/_musllinux.py", + "bom-ref": "f7a7759f02959fc3", + "name": "/usr/lib/python3/dist-packages/lazr/uri/__init__.py", "type": "file" }, { - "bom-ref": "9da4dc07914b3614", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/_structures.py", + "bom-ref": "3930497ea36454a9", + "name": "/usr/lib/python3/dist-packages/lazr/uri/_uri.py", "type": "file" }, { - "bom-ref": "56f5c5069c27bfda", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/markers.py", + "bom-ref": "8a9d8429540dedcd", + "name": "/usr/lib/python3/dist-packages/lazr/uri/configure.zcml", "type": "file" }, { - "bom-ref": "9d9aef4d5e64a0dd", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/requirements.py", + "bom-ref": "93760316933983d9", + "name": "/usr/lib/python3/dist-packages/lazr/uri/docs/Makefile", "type": "file" }, { - "bom-ref": "6983f59253531f52", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/specifiers.py", + "bom-ref": "2c536aeb0a3edf25", + "name": "/usr/lib/python3/dist-packages/lazr/uri/docs/NEWS.rst", "type": "file" }, { - "bom-ref": "2a66c3bb575715a0", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/tags.py", + "bom-ref": "c8a9b8fa0706f88d", + "name": "/usr/lib/python3/dist-packages/lazr/uri/docs/index.rst", "type": "file" }, { - "bom-ref": "ae221973440ac03f", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/utils.py", + "bom-ref": "f0e5a6718631018f", + "name": "/usr/lib/python3/dist-packages/lazr/uri/tests/__init__.py", "type": "file" }, { - "bom-ref": "29c72281551c2d37", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/version.py", + "bom-ref": "bc572f4eb2a9bd70", + "name": "/usr/lib/python3/dist-packages/lazr/uri/tests/test_docs.py", "type": "file" }, { - "bom-ref": "c6d986f83304c9b3", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pkg_resources/__init__.py", + "bom-ref": "a7c89d6f5d7136e1", + "name": "/usr/lib/python3/dist-packages/lazr/uri/tests/test_uri.py", "type": "file" }, { - "bom-ref": "6c860e51a1e97479", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/__init__.py", + "bom-ref": "806d53af86b69a4a", + "name": "/usr/lib/python3/dist-packages/oauthlib-3.2.2.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "1971ce8aba71dcad", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/__main__.py", + "bom-ref": "52bcee708926484e", + "name": "/usr/lib/python3/dist-packages/oauthlib-3.2.2.egg-info/dependency_links.txt", "type": "file" }, { - "bom-ref": "15f3b569b9cf4296", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/android.py", + "bom-ref": "5374ded947b76563", + "name": "/usr/lib/python3/dist-packages/oauthlib-3.2.2.egg-info/requires.txt", "type": "file" }, { - "bom-ref": "f19fba1afc076ea5", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/api.py", + "bom-ref": "844a5b829e7922da", + "name": "/usr/lib/python3/dist-packages/oauthlib-3.2.2.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "260861d69b6a0944", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/macos.py", + "bom-ref": "d2d593b9165af12c", + "name": "/usr/lib/python3/dist-packages/oauthlib/__init__.py", "type": "file" }, { - "bom-ref": "6264cf413b63073f", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/unix.py", + "bom-ref": "8b130f28bb331ade", + "name": "/usr/lib/python3/dist-packages/oauthlib/common.py", "type": "file" }, { - "bom-ref": "391280c3cd19f82a", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/version.py", + "bom-ref": "9d8020653510bdef", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/__init__.py", "type": "file" }, { - "bom-ref": "818a88d11a0c3b8f", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/windows.py", + "bom-ref": "4a4eb25536d563a0", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/__init__.py", "type": "file" }, { - "bom-ref": "bf555657cefd8f79", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/__init__.py", + "bom-ref": "c430a3fcf73ec6f7", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/endpoints/__init__.py", "type": "file" }, { - "bom-ref": "5fc1a4bada1c9d5a", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/__main__.py", + "bom-ref": "53175780cd4b9bdd", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/endpoints/access_token.py", "type": "file" }, { - "bom-ref": "9ecd62ad3a29db37", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/cmdline.py", + "bom-ref": "5b05b6681be4ac33", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/endpoints/authorization.py", "type": "file" }, { - "bom-ref": "8982881fbc692a00", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/console.py", + "bom-ref": "586f1a2f36c7b73a", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/endpoints/base.py", "type": "file" }, { - "bom-ref": "da8b884876b60bd6", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/filter.py", + "bom-ref": "12b17439776818bd", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/endpoints/pre_configured.py", "type": "file" }, { - "bom-ref": "247f7c8c6c7e1bbc", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/filters/__init__.py", + "bom-ref": "d49410ee4de5e651", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/endpoints/request_token.py", "type": "file" }, { - "bom-ref": "52a096e58b8b1f38", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatter.py", + "bom-ref": "7abf65cb9259bd2e", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/endpoints/resource.py", "type": "file" }, { - "bom-ref": "16b3ef0b17f5f0cd", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/__init__.py", + "bom-ref": "8f12a58fc16572e3", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/endpoints/signature_only.py", "type": "file" }, { - "bom-ref": "1ae2bfc492c629b1", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/_mapping.py", + "bom-ref": "40f37280b72874c4", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/errors.py", "type": "file" }, { - "bom-ref": "78897b9e06dadb3c", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/bbcode.py", + "bom-ref": "5e7aafdff0dccd2b", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/parameters.py", "type": "file" }, { - "bom-ref": "e3f10617825d5b77", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/groff.py", + "bom-ref": "f6f69f10a65230de", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/request_validator.py", "type": "file" }, { - "bom-ref": "e59b27fa12fa986e", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/html.py", + "bom-ref": "4e7ffb08d9c23b93", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/signature.py", "type": "file" }, { - "bom-ref": "a749097baa4cbdd3", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/img.py", + "bom-ref": "52a9b314e5eddb14", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/utils.py", "type": "file" }, { - "bom-ref": "b0305775c793f1f7", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/irc.py", + "bom-ref": "bdf67bcb593a33c8", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/__init__.py", "type": "file" }, { - "bom-ref": "5cfa8209a75b167b", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/latex.py", + "bom-ref": "3d57858c0db88482", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/__init__.py", "type": "file" }, { - "bom-ref": "a9faa7ba2d26c1e7", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/other.py", + "bom-ref": "5d9828e897d18224", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/clients/__init__.py", "type": "file" }, { - "bom-ref": "eb26bdba143ec463", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/pangomarkup.py", + "bom-ref": "78817f1de24596b4", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/clients/backend_application.py", "type": "file" }, { - "bom-ref": "42bbfa86b399cc82", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/rtf.py", + "bom-ref": "b1da0e8c94df0dbc", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/clients/base.py", "type": "file" }, { - "bom-ref": "2e4d7a4427a1384a", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/svg.py", + "bom-ref": "f1e51fc5f21ee0b1", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/clients/legacy_application.py", "type": "file" }, { - "bom-ref": "2d6c111eee1476ee", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/terminal.py", + "bom-ref": "cd076579530e1d1d", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/clients/mobile_application.py", "type": "file" }, { - "bom-ref": "5e521df44bdd1c34", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/terminal256.py", + "bom-ref": "2708c4a83324ada8", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/clients/service_application.py", "type": "file" }, { - "bom-ref": "fb0de2e4b2f91496", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexer.py", + "bom-ref": "a1149fb1ff4ab580", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/clients/web_application.py", "type": "file" }, { - "bom-ref": "b0a7c9e7e580ebc1", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers/__init__.py", + "bom-ref": "1fbeee4d432fe283", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/endpoints/__init__.py", "type": "file" }, { - "bom-ref": "0ec3ce7a99d25130", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers/_mapping.py", + "bom-ref": "4391ba8472acaf78", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/endpoints/authorization.py", "type": "file" }, { - "bom-ref": "4a789f8a32a7047e", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers/python.py", + "bom-ref": "db448f7e111dcd58", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/endpoints/base.py", "type": "file" }, { - "bom-ref": "1bdab984ad50c5ed", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/modeline.py", + "bom-ref": "90d26f15f26c03ff", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/endpoints/introspect.py", "type": "file" }, { - "bom-ref": "d02dca338938d422", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/plugin.py", + "bom-ref": "e0e56b2387bed33d", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/endpoints/metadata.py", "type": "file" }, { - "bom-ref": "1f16cdc5c9af0b20", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/regexopt.py", + "bom-ref": "88e53a968e213cc6", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/endpoints/pre_configured.py", "type": "file" }, { - "bom-ref": "90fd164794b85120", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/scanner.py", + "bom-ref": "3b5aaee89772a47f", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/endpoints/resource.py", "type": "file" }, { - "bom-ref": "3fd66f5d9c08b817", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/sphinxext.py", + "bom-ref": "9b247428c8ad1fbb", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/endpoints/revocation.py", "type": "file" }, { - "bom-ref": "33ee128578b81023", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/style.py", + "bom-ref": "cfddfdaf1407bc0b", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/endpoints/token.py", "type": "file" }, { - "bom-ref": "feba789d12587d6d", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/styles/__init__.py", + "bom-ref": "582d64708d0591f8", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/errors.py", "type": "file" }, { - "bom-ref": "ae382a8515d24c75", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/token.py", + "bom-ref": "2b51b8b7d8518d38", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/grant_types/__init__.py", "type": "file" }, { - "bom-ref": "adb8b5fa6d4a94a8", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/unistring.py", + "bom-ref": "58dc73cd4b0e6ee8", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py", "type": "file" }, { - "bom-ref": "5b56e66a7cf64823", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/util.py", + "bom-ref": "543e62d4cbc8ecc8", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/grant_types/base.py", "type": "file" }, { - "bom-ref": "6ca7dab843e67ef8", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/__init__.py", + "bom-ref": "6c97638e3b643d1b", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/grant_types/client_credentials.py", "type": "file" }, { - "bom-ref": "4b64de0149398e0c", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/actions.py", + "bom-ref": "daeae85cf03adfc0", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/grant_types/implicit.py", "type": "file" }, { - "bom-ref": "194c10952f8a2b00", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/common.py", + "bom-ref": "82b401f4cd27a6e2", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/grant_types/refresh_token.py", "type": "file" }, { - "bom-ref": "ed746fe8e9fb497b", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/core.py", + "bom-ref": "363d445d056b3154", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/grant_types/resource_owner_password_credentials.py", "type": "file" }, { - "bom-ref": "0aaf6295f9b02312", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/diagram/__init__.py", + "bom-ref": "2a1ab6ab784facd4", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/parameters.py", "type": "file" }, { - "bom-ref": "843eb99120b048d6", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/exceptions.py", + "bom-ref": "8c2ddc7f1b15ade6", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/request_validator.py", "type": "file" }, { - "bom-ref": "d53a5bae96649bd5", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/helpers.py", + "bom-ref": "0fef29082254cc46", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/tokens.py", "type": "file" }, { - "bom-ref": "ecdab32e8cc80bb8", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/results.py", + "bom-ref": "f2039a004121b12c", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc6749/utils.py", "type": "file" }, { - "bom-ref": "5e5e9854460276eb", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/testing.py", + "bom-ref": "9d6d3664409d2d4d", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc8628/__init__.py", "type": "file" }, { - "bom-ref": "9f78424e1fbabfb8", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/unicode.py", + "bom-ref": "0335c82dcd3f48fc", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc8628/clients/__init__.py", "type": "file" }, { - "bom-ref": "061cad446ae2d457", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/util.py", + "bom-ref": "75e6e8e27613c3f5", + "name": "/usr/lib/python3/dist-packages/oauthlib/oauth2/rfc8628/clients/device.py", "type": "file" }, { - "bom-ref": "23a2bbb743e0169e", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/__init__.py", + "bom-ref": "14c7fc5d1e73846d", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/__init__.py", "type": "file" }, { - "bom-ref": "fe25a970e4539fd0", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_compat.py", + "bom-ref": "0b3d267a4b571d60", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/__init__.py", "type": "file" }, { - "bom-ref": "fdc6bf2c315a9a29", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_impl.py", + "bom-ref": "1ee75dbe570ef036", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/__init__.py", "type": "file" }, { - "bom-ref": "737f162cfeb1290c", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py", + "bom-ref": "d4d2c40c8020c968", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/endpoints/__init__.py", "type": "file" }, { - "bom-ref": "ba0b17c5744a7d00", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", + "bom-ref": "26a55cba996ffbb3", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/endpoints/pre_configured.py", "type": "file" }, { - "bom-ref": "ca5bf30e606d78f9", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/__init__.py", + "bom-ref": "b6dac9441247d47a", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/endpoints/userinfo.py", "type": "file" }, { - "bom-ref": "ea2476a572af06c0", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/__version__.py", + "bom-ref": "dddd14559e30dbf9", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/exceptions.py", "type": "file" }, { - "bom-ref": "6fa50f05f7c5292c", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/_internal_utils.py", + "bom-ref": "1bcce0de205709a9", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/grant_types/__init__.py", "type": "file" }, { - "bom-ref": "bcddab267031ae89", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/adapters.py", + "bom-ref": "3da8c0dc2fc1ba5b", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/grant_types/authorization_code.py", "type": "file" }, { - "bom-ref": "c93830e74f9d1058", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/api.py", + "bom-ref": "273f463040077cc0", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/grant_types/base.py", "type": "file" }, { - "bom-ref": "f8777a72852ea957", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/auth.py", + "bom-ref": "b3960926428a5746", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/grant_types/dispatchers.py", "type": "file" }, { - "bom-ref": "6cea80bbef32cafd", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/certs.py", + "bom-ref": "df8639bc2c4f01ae", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/grant_types/hybrid.py", "type": "file" }, { - "bom-ref": "4f12d28d1639a078", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/compat.py", + "bom-ref": "e202fdcf9f053a40", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/grant_types/implicit.py", "type": "file" }, { - "bom-ref": "cba26a696316ddf0", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/cookies.py", + "bom-ref": "84c4dbd027c2399b", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/grant_types/refresh_token.py", "type": "file" }, { - "bom-ref": "6328847f39722aee", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/exceptions.py", + "bom-ref": "d7f29f52e4d155e8", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/request_validator.py", "type": "file" }, { - "bom-ref": "ce54e79706486efe", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/help.py", + "bom-ref": "f0822b3c9facb4e5", + "name": "/usr/lib/python3/dist-packages/oauthlib/openid/connect/core/tokens.py", "type": "file" }, { - "bom-ref": "dd7b036e8a1c4172", - "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/hooks.py", + "bom-ref": "fe76291c6f173aa4", + "name": "/usr/lib/python3/dist-packages/oauthlib/signals.py", "type": "file" }, { - "bom-ref": "079adc1905152eb7", + "bom-ref": "c70291ee48fe7e14", + "name": "/usr/lib/python3/dist-packages/oauthlib/uri_validate.py", + "type": "file" + }, + { + "bom-ref": "dbe2e8cdd0d2122d", + "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/INSTALLER", + "type": "file" + }, + { + "bom-ref": "6b5d72853da72d57", + "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "44c8745aaa1b4e0b", + "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/WHEEL", + "type": "file" + }, + { + "bom-ref": "2b61aba8ed71e4f2", + "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/entry_points.txt", + "type": "file" + }, + { + "bom-ref": "115135e285884424", + "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "0b17dbff60f145f4", + "name": "/usr/lib/python3/dist-packages/pip/__init__.py", + "type": "file" + }, + { + "bom-ref": "8df94ab008250f91", + "name": "/usr/lib/python3/dist-packages/pip/__main__.py", + "type": "file" + }, + { + "bom-ref": "60fc31840bc50477", + "name": "/usr/lib/python3/dist-packages/pip/__pip-runner__.py", + "type": "file" + }, + { + "bom-ref": "97a386bd265f1ab6", + "name": "/usr/lib/python3/dist-packages/pip/_internal/__init__.py", + "type": "file" + }, + { + "bom-ref": "a2de5f35d33d861c", + "name": "/usr/lib/python3/dist-packages/pip/_internal/build_env.py", + "type": "file" + }, + { + "bom-ref": "42de5f6b01b29a2c", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cache.py", + "type": "file" + }, + { + "bom-ref": "be30ce0a93fdefe5", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/__init__.py", + "type": "file" + }, + { + "bom-ref": "f6b1dce646be61a5", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/autocompletion.py", + "type": "file" + }, + { + "bom-ref": "81e5c7051d83d27e", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/base_command.py", + "type": "file" + }, + { + "bom-ref": "9f0c07cd16508330", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/cmdoptions.py", + "type": "file" + }, + { + "bom-ref": "770e72c54032423c", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/command_context.py", + "type": "file" + }, + { + "bom-ref": "26bea8d192857572", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/main.py", + "type": "file" + }, + { + "bom-ref": "3398114c16c583a2", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/main_parser.py", + "type": "file" + }, + { + "bom-ref": "9d08726f5204099b", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/parser.py", + "type": "file" + }, + { + "bom-ref": "1670c6c17c4d962b", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/progress_bars.py", + "type": "file" + }, + { + "bom-ref": "3051413a08b71322", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/req_command.py", + "type": "file" + }, + { + "bom-ref": "49bacdb1e27882e9", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/spinners.py", + "type": "file" + }, + { + "bom-ref": "fbccca30f7e43e61", + "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/status_codes.py", + "type": "file" + }, + { + "bom-ref": "789ea788c476bb23", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/__init__.py", + "type": "file" + }, + { + "bom-ref": "b3944a6c95cf3327", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/cache.py", + "type": "file" + }, + { + "bom-ref": "a5abd75f6d82b59c", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/check.py", + "type": "file" + }, + { + "bom-ref": "52e3e5dd35ad8dc1", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/completion.py", + "type": "file" + }, + { + "bom-ref": "8b76f9b4e221ace0", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/configuration.py", + "type": "file" + }, + { + "bom-ref": "4265d87d4bf17dd4", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/debug.py", + "type": "file" + }, + { + "bom-ref": "1b20f7df94ba1d8a", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/download.py", + "type": "file" + }, + { + "bom-ref": "7d2b213ab80eb3f7", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/freeze.py", + "type": "file" + }, + { + "bom-ref": "ccf0abf9495b7fd2", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/hash.py", + "type": "file" + }, + { + "bom-ref": "50d86e388ff13b9c", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/help.py", + "type": "file" + }, + { + "bom-ref": "6234ccac4f504bff", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/index.py", + "type": "file" + }, + { + "bom-ref": "9790f451dc1f5dfb", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/inspect.py", + "type": "file" + }, + { + "bom-ref": "f6197610e0730acc", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/install.py", + "type": "file" + }, + { + "bom-ref": "808d577120119ab0", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/list.py", + "type": "file" + }, + { + "bom-ref": "9d0113ba55e3c7fa", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/search.py", + "type": "file" + }, + { + "bom-ref": "cb759598e117cd1c", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/show.py", + "type": "file" + }, + { + "bom-ref": "07f87dace485122e", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/uninstall.py", + "type": "file" + }, + { + "bom-ref": "942a935079419733", + "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/wheel.py", + "type": "file" + }, + { + "bom-ref": "6acd9f55d9227faf", + "name": "/usr/lib/python3/dist-packages/pip/_internal/configuration.py", + "type": "file" + }, + { + "bom-ref": "48552bc7d1601020", + "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/__init__.py", + "type": "file" + }, + { + "bom-ref": "c375fb0c4bf2c196", + "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/base.py", + "type": "file" + }, + { + "bom-ref": "01ba3c598d4be2e4", + "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/installed.py", + "type": "file" + }, + { + "bom-ref": "4a704411d92b71ff", + "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/sdist.py", + "type": "file" + }, + { + "bom-ref": "6d9869b905271bc7", + "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/wheel.py", + "type": "file" + }, + { + "bom-ref": "edd098a940f2394a", + "name": "/usr/lib/python3/dist-packages/pip/_internal/exceptions.py", + "type": "file" + }, + { + "bom-ref": "102a98d130954405", + "name": "/usr/lib/python3/dist-packages/pip/_internal/index/__init__.py", + "type": "file" + }, + { + "bom-ref": "05276b120f497df8", + "name": "/usr/lib/python3/dist-packages/pip/_internal/index/collector.py", + "type": "file" + }, + { + "bom-ref": "dee78e18c5d48af4", + "name": "/usr/lib/python3/dist-packages/pip/_internal/index/package_finder.py", + "type": "file" + }, + { + "bom-ref": "d4296c01017a6f5a", + "name": "/usr/lib/python3/dist-packages/pip/_internal/index/sources.py", + "type": "file" + }, + { + "bom-ref": "c5df807d55457d23", + "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/__init__.py", + "type": "file" + }, + { + "bom-ref": "9135a372d9b521e1", + "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/_distutils.py", + "type": "file" + }, + { + "bom-ref": "5b21b3f8cbc7b4f3", + "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/_sysconfig.py", + "type": "file" + }, + { + "bom-ref": "af7e37777f451d0f", + "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/base.py", + "type": "file" + }, + { + "bom-ref": "82b2968a430e4f00", + "name": "/usr/lib/python3/dist-packages/pip/_internal/main.py", + "type": "file" + }, + { + "bom-ref": "eae541573940eab4", + "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/__init__.py", + "type": "file" + }, + { + "bom-ref": "1d85af26044e5498", + "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/_json.py", + "type": "file" + }, + { + "bom-ref": "454fad62ee578795", + "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/base.py", + "type": "file" + }, + { + "bom-ref": "a6abc442eb88cc1a", + "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/__init__.py", + "type": "file" + }, + { + "bom-ref": "40817e577190b14f", + "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/_compat.py", + "type": "file" + }, + { + "bom-ref": "610dc1b77f8b794c", + "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/_dists.py", + "type": "file" + }, + { + "bom-ref": "880b42003583b3f6", + "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/_envs.py", + "type": "file" + }, + { + "bom-ref": "e5c9a0b38936c127", + "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/pkg_resources.py", + "type": "file" + }, + { + "bom-ref": "70f73cafec628216", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/__init__.py", + "type": "file" + }, + { + "bom-ref": "130882339b36fe89", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/candidate.py", + "type": "file" + }, + { + "bom-ref": "0d896bd65104cf21", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/direct_url.py", + "type": "file" + }, + { + "bom-ref": "4fee64a9e61b3bd0", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/format_control.py", + "type": "file" + }, + { + "bom-ref": "93056413c298b8f6", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/index.py", + "type": "file" + }, + { + "bom-ref": "24baf42f7c4555bf", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/installation_report.py", + "type": "file" + }, + { + "bom-ref": "bea4e3427e7d57be", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/link.py", + "type": "file" + }, + { + "bom-ref": "075d95ece36ba8a6", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/scheme.py", + "type": "file" + }, + { + "bom-ref": "d3117c778f1effa6", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/search_scope.py", + "type": "file" + }, + { + "bom-ref": "23f89ea406d6210f", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/selection_prefs.py", + "type": "file" + }, + { + "bom-ref": "11990187b00919d1", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/target_python.py", + "type": "file" + }, + { + "bom-ref": "2bab16aa06972e02", + "name": "/usr/lib/python3/dist-packages/pip/_internal/models/wheel.py", + "type": "file" + }, + { + "bom-ref": "37449014ae44c992", + "name": "/usr/lib/python3/dist-packages/pip/_internal/network/__init__.py", + "type": "file" + }, + { + "bom-ref": "39c01f5c8872e871", + "name": "/usr/lib/python3/dist-packages/pip/_internal/network/auth.py", + "type": "file" + }, + { + "bom-ref": "137595c52834f489", + "name": "/usr/lib/python3/dist-packages/pip/_internal/network/cache.py", + "type": "file" + }, + { + "bom-ref": "6d3101b8844f6834", + "name": "/usr/lib/python3/dist-packages/pip/_internal/network/download.py", + "type": "file" + }, + { + "bom-ref": "5d0e845a48e4d2a2", + "name": "/usr/lib/python3/dist-packages/pip/_internal/network/lazy_wheel.py", + "type": "file" + }, + { + "bom-ref": "c4086f0e06bf8f44", + "name": "/usr/lib/python3/dist-packages/pip/_internal/network/session.py", + "type": "file" + }, + { + "bom-ref": "e2ca900d76c207e9", + "name": "/usr/lib/python3/dist-packages/pip/_internal/network/utils.py", + "type": "file" + }, + { + "bom-ref": "87da191690631f67", + "name": "/usr/lib/python3/dist-packages/pip/_internal/network/xmlrpc.py", + "type": "file" + }, + { + "bom-ref": "d95565494da15320", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/__init__.py", + "type": "file" + }, + { + "bom-ref": "15c7e462467343ac", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/__init__.py", + "type": "file" + }, + { + "bom-ref": "cc662869858b3c88", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/build_tracker.py", + "type": "file" + }, + { + "bom-ref": "3ad41eb846e4b873", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/metadata.py", + "type": "file" + }, + { + "bom-ref": "c6f4659941c8f513", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/metadata_editable.py", + "type": "file" + }, + { + "bom-ref": "4fc1fb7859203e9e", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/metadata_legacy.py", + "type": "file" + }, + { + "bom-ref": "7f34135e5dca81f2", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/wheel.py", + "type": "file" + }, + { + "bom-ref": "793c1e50e75834d9", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/wheel_editable.py", + "type": "file" + }, + { + "bom-ref": "ff7a6f882ba142d6", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/wheel_legacy.py", + "type": "file" + }, + { + "bom-ref": "db21cea4f5473a2c", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/check.py", + "type": "file" + }, + { + "bom-ref": "6e4884f84b3d95ed", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/freeze.py", + "type": "file" + }, + { + "bom-ref": "7ebfd4b6053d4d05", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/install/__init__.py", + "type": "file" + }, + { + "bom-ref": "d966447f073624e4", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/install/editable_legacy.py", + "type": "file" + }, + { + "bom-ref": "40790f7a06400ceb", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/install/wheel.py", + "type": "file" + }, + { + "bom-ref": "e03a973262a9d737", + "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/prepare.py", + "type": "file" + }, + { + "bom-ref": "18726f6a30e4c809", + "name": "/usr/lib/python3/dist-packages/pip/_internal/pyproject.py", + "type": "file" + }, + { + "bom-ref": "8b2e2e24f49cb917", + "name": "/usr/lib/python3/dist-packages/pip/_internal/req/__init__.py", + "type": "file" + }, + { + "bom-ref": "76beb6678c00c71b", + "name": "/usr/lib/python3/dist-packages/pip/_internal/req/constructors.py", + "type": "file" + }, + { + "bom-ref": "2d5cb89a253cbed8", + "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", + "type": "file" + }, + { + "bom-ref": "8de9f91186a3b488", + "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_install.py", + "type": "file" + }, + { + "bom-ref": "2102243635e6dd73", + "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_set.py", + "type": "file" + }, + { + "bom-ref": "83eeb4deabea3154", + "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_uninstall.py", + "type": "file" + }, + { + "bom-ref": "e6c8a7276dcc07b2", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/__init__.py", + "type": "file" + }, + { + "bom-ref": "921b15760cc894ad", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/base.py", + "type": "file" + }, + { + "bom-ref": "487c8fbdcf136868", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/legacy/__init__.py", + "type": "file" + }, + { + "bom-ref": "1ddeccc9ef0b2eb8", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/legacy/resolver.py", + "type": "file" + }, + { + "bom-ref": "433217cf7358fef3", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/__init__.py", + "type": "file" + }, + { + "bom-ref": "ef661203dc206234", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/base.py", + "type": "file" + }, + { + "bom-ref": "0f880db522a0ccda", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/candidates.py", + "type": "file" + }, + { + "bom-ref": "ab6e473ce5b916d4", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/factory.py", + "type": "file" + }, + { + "bom-ref": "5d07e53a74a7bbdb", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/found_candidates.py", + "type": "file" + }, + { + "bom-ref": "4c388feb12f87456", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/provider.py", + "type": "file" + }, + { + "bom-ref": "65368071fffab702", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/reporter.py", + "type": "file" + }, + { + "bom-ref": "457837bc346526d0", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/requirements.py", + "type": "file" + }, + { + "bom-ref": "a7648156f837b0cf", + "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/resolver.py", + "type": "file" + }, + { + "bom-ref": "7ef50a0e7cea2011", + "name": "/usr/lib/python3/dist-packages/pip/_internal/self_outdated_check.py", + "type": "file" + }, + { + "bom-ref": "41780052acaa0aa9", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/__init__.py", + "type": "file" + }, + { + "bom-ref": "30235ded73f3865c", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/_jaraco_text.py", + "type": "file" + }, + { + "bom-ref": "39a9605bb4a50e34", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/_log.py", + "type": "file" + }, + { + "bom-ref": "9206fea93733b54e", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/appdirs.py", + "type": "file" + }, + { + "bom-ref": "142a05a4cfb53912", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/compat.py", + "type": "file" + }, + { + "bom-ref": "d71a1cea724d288a", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/compatibility_tags.py", + "type": "file" + }, + { + "bom-ref": "59059c8b1562a42e", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/datetime.py", + "type": "file" + }, + { + "bom-ref": "9b36e20c23e498e4", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/deprecation.py", + "type": "file" + }, + { + "bom-ref": "856502f4de661e5d", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/direct_url_helpers.py", + "type": "file" + }, + { + "bom-ref": "55a073881c2ea0bc", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/egg_link.py", + "type": "file" + }, + { + "bom-ref": "e1cf27cc70a0ac0e", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/encoding.py", + "type": "file" + }, + { + "bom-ref": "011fae7b0a021ad4", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/entrypoints.py", + "type": "file" + }, + { + "bom-ref": "3d2cd34b7ad5c327", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/filesystem.py", + "type": "file" + }, + { + "bom-ref": "e15432fe549c0101", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/filetypes.py", + "type": "file" + }, + { + "bom-ref": "cf3b2ce30f9e32ec", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/glibc.py", + "type": "file" + }, + { + "bom-ref": "8b7d9be64bba0d03", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/hashes.py", + "type": "file" + }, + { + "bom-ref": "b89efa635ff6a765", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/logging.py", + "type": "file" + }, + { + "bom-ref": "955c5a345149f6f9", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/misc.py", + "type": "file" + }, + { + "bom-ref": "dde6c5e60ae29a4f", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/models.py", + "type": "file" + }, + { + "bom-ref": "41ed0d56079c0207", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/packaging.py", + "type": "file" + }, + { + "bom-ref": "04493dc53a964626", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/setuptools_build.py", + "type": "file" + }, + { + "bom-ref": "5fa109a3a0fc8182", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/subprocess.py", + "type": "file" + }, + { + "bom-ref": "1651211a6c77a356", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/temp_dir.py", + "type": "file" + }, + { + "bom-ref": "d6e350a49e756014", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/unpacking.py", + "type": "file" + }, + { + "bom-ref": "f983830ceefd361f", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/urls.py", + "type": "file" + }, + { + "bom-ref": "84cee5c254b251c4", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/virtualenv.py", + "type": "file" + }, + { + "bom-ref": "4403111934bdeafa", + "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/wheel.py", + "type": "file" + }, + { + "bom-ref": "b5d444eda69ea7cc", + "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/__init__.py", + "type": "file" + }, + { + "bom-ref": "a47a97b862a046b7", + "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/bazaar.py", + "type": "file" + }, + { + "bom-ref": "2762eb11705dba0a", + "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/git.py", + "type": "file" + }, + { + "bom-ref": "817939ceab2d2564", + "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/mercurial.py", + "type": "file" + }, + { + "bom-ref": "9f06d9f6ceba5ced", + "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/subversion.py", + "type": "file" + }, + { + "bom-ref": "23573499606a2842", + "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/versioncontrol.py", + "type": "file" + }, + { + "bom-ref": "8efa939e7d6224b4", + "name": "/usr/lib/python3/dist-packages/pip/_internal/wheel_builder.py", + "type": "file" + }, + { + "bom-ref": "cce6f014602cfa40", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/__init__.py", + "type": "file" + }, + { + "bom-ref": "3be45d6ed8a56441", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/__init__.py", + "type": "file" + }, + { + "bom-ref": "ff8f8b28a85ae433", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/_cmd.py", + "type": "file" + }, + { + "bom-ref": "500f2f7318798cdd", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/adapter.py", + "type": "file" + }, + { + "bom-ref": "37da4e06e28f25b9", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/cache.py", + "type": "file" + }, + { + "bom-ref": "b91a925295c9e0b9", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/caches/__init__.py", + "type": "file" + }, + { + "bom-ref": "f2b3e193f2b7f0ff", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/caches/file_cache.py", + "type": "file" + }, + { + "bom-ref": "4cb813001337bbaa", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/caches/redis_cache.py", + "type": "file" + }, + { + "bom-ref": "dd8b5b11609f1d2f", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/controller.py", + "type": "file" + }, + { + "bom-ref": "fbcb2163aebf4cde", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/filewrapper.py", + "type": "file" + }, + { + "bom-ref": "2d9778512e78007a", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/heuristics.py", + "type": "file" + }, + { + "bom-ref": "30298556635193a1", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/serialize.py", + "type": "file" + }, + { + "bom-ref": "88fbaf4973d1b16a", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/wrapper.py", + "type": "file" + }, + { + "bom-ref": "1e93cdaf2fcad495", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/__init__.py", + "type": "file" + }, + { + "bom-ref": "fb8510db0ea89b6c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/__main__.py", + "type": "file" + }, + { + "bom-ref": "351fcaecc9953b4c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/cacert.pem", + "type": "file" + }, + { + "bom-ref": "1529a4cec29133ff", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/core.py", + "type": "file" + }, + { + "bom-ref": "98465521b0f53619", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/__init__.py", + "type": "file" + }, + { + "bom-ref": "960a2d57228a2add", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/big5freq.py", + "type": "file" + }, + { + "bom-ref": "4eb9d9523898b892", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/big5prober.py", + "type": "file" + }, + { + "bom-ref": "e78f5c61fc48f1a0", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/chardistribution.py", + "type": "file" + }, + { + "bom-ref": "afbaff4a4780b8af", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/charsetgroupprober.py", + "type": "file" + }, + { + "bom-ref": "9037013f290b2ffa", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/charsetprober.py", + "type": "file" + }, + { + "bom-ref": "9c165dcff13d372f", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/cli/__init__.py", + "type": "file" + }, + { + "bom-ref": "2942db24e61506da", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/cli/chardetect.py", + "type": "file" + }, + { + "bom-ref": "c4ec4d30a1845edb", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/codingstatemachine.py", + "type": "file" + }, + { + "bom-ref": "4cd2af53d6ff17ad", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/codingstatemachinedict.py", + "type": "file" + }, + { + "bom-ref": "0d287473a9aa45cb", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/cp949prober.py", + "type": "file" + }, + { + "bom-ref": "02889e0f3cd80ed6", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/enums.py", + "type": "file" + }, + { + "bom-ref": "6167760652bc9637", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/escprober.py", + "type": "file" + }, + { + "bom-ref": "83797aade9c0344c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/escsm.py", + "type": "file" + }, + { + "bom-ref": "d27313f53fba1b13", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/eucjpprober.py", + "type": "file" + }, + { + "bom-ref": "9df8caddf5ac46d6", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euckrfreq.py", + "type": "file" + }, + { + "bom-ref": "9bdd10e78c0f8fbf", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euckrprober.py", + "type": "file" + }, + { + "bom-ref": "b5520031b5457c54", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euctwfreq.py", + "type": "file" + }, + { + "bom-ref": "a5baafe69b681b20", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euctwprober.py", + "type": "file" + }, + { + "bom-ref": "80f510cab4dc711d", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/gb2312freq.py", + "type": "file" + }, + { + "bom-ref": "596befa59fb33f88", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/gb2312prober.py", + "type": "file" + }, + { + "bom-ref": "f6074282eb0cb24b", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/hebrewprober.py", + "type": "file" + }, + { + "bom-ref": "63d96a11f9e686e0", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/jisfreq.py", + "type": "file" + }, + { + "bom-ref": "d56c8b51d60a912a", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/johabfreq.py", + "type": "file" + }, + { + "bom-ref": "43ffac69cdc229f8", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/johabprober.py", + "type": "file" + }, + { + "bom-ref": "ff4a882e7a1c8f70", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/jpcntx.py", + "type": "file" + }, + { + "bom-ref": "75c05a71f005ddd3", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langbulgarianmodel.py", + "type": "file" + }, + { + "bom-ref": "626f926098485bb2", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langgreekmodel.py", + "type": "file" + }, + { + "bom-ref": "7bd2cc8dffaa47d4", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langhebrewmodel.py", + "type": "file" + }, + { + "bom-ref": "106d92dc58a4ddde", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langhungarianmodel.py", + "type": "file" + }, + { + "bom-ref": "d9bdb223e5e6c8d3", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langrussianmodel.py", + "type": "file" + }, + { + "bom-ref": "c88d683029b71065", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langthaimodel.py", + "type": "file" + }, + { + "bom-ref": "a81852221af2eb60", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langturkishmodel.py", + "type": "file" + }, + { + "bom-ref": "7659e572e939c28e", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/latin1prober.py", + "type": "file" + }, + { + "bom-ref": "d3299da99d31a738", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/macromanprober.py", + "type": "file" + }, + { + "bom-ref": "4c37f0b3a3eb5d22", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/mbcharsetprober.py", + "type": "file" + }, + { + "bom-ref": "e51a425a71d3e350", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/mbcsgroupprober.py", + "type": "file" + }, + { + "bom-ref": "904b7e421361e427", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/mbcssm.py", + "type": "file" + }, + { + "bom-ref": "dfb329ab2fe9fbd8", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/metadata/__init__.py", + "type": "file" + }, + { + "bom-ref": "36985d1b4621deea", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/metadata/languages.py", + "type": "file" + }, + { + "bom-ref": "fb9dffb10c956d6e", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/resultdict.py", + "type": "file" + }, + { + "bom-ref": "ddcc9fdc31691839", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/sbcharsetprober.py", + "type": "file" + }, + { + "bom-ref": "7166325f68c3f957", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/sbcsgroupprober.py", + "type": "file" + }, + { + "bom-ref": "cc30f8682a8d7d86", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/sjisprober.py", + "type": "file" + }, + { + "bom-ref": "6fffe438878393bc", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/universaldetector.py", + "type": "file" + }, + { + "bom-ref": "6a8119aec39a1cde", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/utf1632prober.py", + "type": "file" + }, + { + "bom-ref": "46e17dd359e6aa59", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/utf8prober.py", + "type": "file" + }, + { + "bom-ref": "29faf0fa7dce118e", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/version.py", + "type": "file" + }, + { + "bom-ref": "04e2b0d0aa4337ab", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/__init__.py", + "type": "file" + }, + { + "bom-ref": "bade36b008baebe8", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/ansi.py", + "type": "file" + }, + { + "bom-ref": "3eae18c870a1fdeb", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/ansitowin32.py", + "type": "file" + }, + { + "bom-ref": "ca5c5fdb5072c04d", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/initialise.py", + "type": "file" + }, + { + "bom-ref": "c027dcb3bc4df50e", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/__init__.py", + "type": "file" + }, + { + "bom-ref": "2739df403554dcc8", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/ansi_test.py", + "type": "file" + }, + { + "bom-ref": "aa99e6b945c4ae62", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/ansitowin32_test.py", + "type": "file" + }, + { + "bom-ref": "fb96bd627ec8a5be", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/initialise_test.py", + "type": "file" + }, + { + "bom-ref": "39dac8e65fcca507", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/isatty_test.py", + "type": "file" + }, + { + "bom-ref": "4d1fb325c8ef40bd", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/utils.py", + "type": "file" + }, + { + "bom-ref": "5fb10231bc9f0dcd", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/winterm_test.py", + "type": "file" + }, + { + "bom-ref": "9a2c720b4937cf91", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/win32.py", + "type": "file" + }, + { + "bom-ref": "288200db76706206", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/winterm.py", + "type": "file" + }, + { + "bom-ref": "b07e8faab1781d39", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/__init__.py", + "type": "file" + }, + { + "bom-ref": "25f2f8371571fcab", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/compat.py", + "type": "file" + }, + { + "bom-ref": "cdd69ce48d092b64", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/database.py", + "type": "file" + }, + { + "bom-ref": "d1230160392a2f5f", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/index.py", + "type": "file" + }, + { + "bom-ref": "0e85780996129999", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/locators.py", + "type": "file" + }, + { + "bom-ref": "fa9c0a2b64c7caf7", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/manifest.py", + "type": "file" + }, + { + "bom-ref": "5e6118cc54ae247f", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/markers.py", + "type": "file" + }, + { + "bom-ref": "a36510a96c155e45", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/metadata.py", + "type": "file" + }, + { + "bom-ref": "d96e96e2501b9215", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/resources.py", + "type": "file" + }, + { + "bom-ref": "58d62cd467537a99", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/scripts.py", + "type": "file" + }, + { + "bom-ref": "551cd3c6e9d386b9", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/util.py", + "type": "file" + }, + { + "bom-ref": "74ae43003a3031d8", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/version.py", + "type": "file" + }, + { + "bom-ref": "f3b0335a56b732a3", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/wheel.py", + "type": "file" + }, + { + "bom-ref": "8002de5350a30302", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distro/__init__.py", + "type": "file" + }, + { + "bom-ref": "516198ca2f5f4ab6", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distro/__main__.py", + "type": "file" + }, + { + "bom-ref": "ac29fb05e48ba15f", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/distro/distro.py", + "type": "file" + }, + { + "bom-ref": "857ac19355829698", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/__init__.py", + "type": "file" + }, + { + "bom-ref": "a147aaa07de2db2b", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/codec.py", + "type": "file" + }, + { + "bom-ref": "89989638633e6a13", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/compat.py", + "type": "file" + }, + { + "bom-ref": "f44bb359dd735134", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/core.py", + "type": "file" + }, + { + "bom-ref": "28ead5bfb18031a6", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/idnadata.py", + "type": "file" + }, + { + "bom-ref": "1391a82eb2eb5f28", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/intranges.py", + "type": "file" + }, + { + "bom-ref": "fe5fed4fae76d5d0", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/package_data.py", + "type": "file" + }, + { + "bom-ref": "a31e885b352b0eb2", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/uts46data.py", + "type": "file" + }, + { + "bom-ref": "c9cfd2425b5c945e", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/__init__.py", + "type": "file" + }, + { + "bom-ref": "d540eb7536e680df", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/exceptions.py", + "type": "file" + }, + { + "bom-ref": "a3ab08be701f2cc9", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/ext.py", + "type": "file" + }, + { + "bom-ref": "9ff741afa9a0ef01", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/fallback.py", + "type": "file" + }, + { + "bom-ref": "06add2a3db997a7e", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/__about__.py", + "type": "file" + }, + { + "bom-ref": "a7567c4592e64b32", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/__init__.py", + "type": "file" + }, + { + "bom-ref": "227d6be0bb19854d", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/_manylinux.py", + "type": "file" + }, + { + "bom-ref": "b7f4a719317ebffd", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/_musllinux.py", + "type": "file" + }, + { + "bom-ref": "12d875bda1f55c4c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/_structures.py", + "type": "file" + }, + { + "bom-ref": "7a07482b399d275a", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/markers.py", + "type": "file" + }, + { + "bom-ref": "b59c122db905bc49", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/requirements.py", + "type": "file" + }, + { + "bom-ref": "c6da4d21212d9b7e", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/specifiers.py", + "type": "file" + }, + { + "bom-ref": "1adbfaa330ad0eb8", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/tags.py", + "type": "file" + }, + { + "bom-ref": "52eb00077600cd9b", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/utils.py", + "type": "file" + }, + { + "bom-ref": "42e937036b2f48c7", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/version.py", + "type": "file" + }, + { + "bom-ref": "6eae11041855b107", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pkg_resources/__init__.py", + "type": "file" + }, + { + "bom-ref": "1f9574a146eb0cd5", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/__init__.py", + "type": "file" + }, + { + "bom-ref": "6a1e9fc4930d6899", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/__main__.py", + "type": "file" + }, + { + "bom-ref": "68704cabb8bfc816", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/android.py", + "type": "file" + }, + { + "bom-ref": "d5a203b8c3689d2d", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/api.py", + "type": "file" + }, + { + "bom-ref": "ab0268395096f6e4", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/macos.py", + "type": "file" + }, + { + "bom-ref": "d53e40de5732567b", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/unix.py", + "type": "file" + }, + { + "bom-ref": "bb517003495d5a32", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/version.py", + "type": "file" + }, + { + "bom-ref": "990c7cd7dd30ae5f", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/windows.py", + "type": "file" + }, + { + "bom-ref": "709cba069f8edcb9", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/__init__.py", + "type": "file" + }, + { + "bom-ref": "fe17839a09da1bda", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/__main__.py", + "type": "file" + }, + { + "bom-ref": "c0776bb580d9da7b", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/cmdline.py", + "type": "file" + }, + { + "bom-ref": "86e8e8bdc4e71538", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/console.py", + "type": "file" + }, + { + "bom-ref": "e96588222e42b9da", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/filter.py", + "type": "file" + }, + { + "bom-ref": "5f6361a7e294a928", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/filters/__init__.py", + "type": "file" + }, + { + "bom-ref": "fd12e7493a88629c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatter.py", + "type": "file" + }, + { + "bom-ref": "b477e2fe1a5cd92d", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/__init__.py", + "type": "file" + }, + { + "bom-ref": "6c0076327f6c816d", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/_mapping.py", + "type": "file" + }, + { + "bom-ref": "23ca74d4bf72d83c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/bbcode.py", + "type": "file" + }, + { + "bom-ref": "07c9c7306c1f39e3", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/groff.py", + "type": "file" + }, + { + "bom-ref": "33abccef19be66ba", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/html.py", + "type": "file" + }, + { + "bom-ref": "d94f15f75672e603", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/img.py", + "type": "file" + }, + { + "bom-ref": "8bde62fe41da360f", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/irc.py", + "type": "file" + }, + { + "bom-ref": "0618011583fa9b13", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/latex.py", + "type": "file" + }, + { + "bom-ref": "072256e790037967", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/other.py", + "type": "file" + }, + { + "bom-ref": "0918b65b7c0b62c3", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/pangomarkup.py", + "type": "file" + }, + { + "bom-ref": "85cfa227bb3179e2", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/rtf.py", + "type": "file" + }, + { + "bom-ref": "b8b558cfa8a41a8a", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/svg.py", + "type": "file" + }, + { + "bom-ref": "58484c4317632d72", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/terminal.py", + "type": "file" + }, + { + "bom-ref": "01cc6e6fd7bef108", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/terminal256.py", + "type": "file" + }, + { + "bom-ref": "d305757c6090646a", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexer.py", + "type": "file" + }, + { + "bom-ref": "20c15a315292fa61", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers/__init__.py", + "type": "file" + }, + { + "bom-ref": "9725e491a676c278", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers/_mapping.py", + "type": "file" + }, + { + "bom-ref": "017838eace179f92", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers/python.py", + "type": "file" + }, + { + "bom-ref": "ef112df203a354d1", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/modeline.py", + "type": "file" + }, + { + "bom-ref": "37ce9b931615d53a", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/plugin.py", + "type": "file" + }, + { + "bom-ref": "f6cf87143b7bd1bc", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/regexopt.py", + "type": "file" + }, + { + "bom-ref": "db7a1d83bfbc976c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/scanner.py", + "type": "file" + }, + { + "bom-ref": "f264da6cee501a47", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/sphinxext.py", + "type": "file" + }, + { + "bom-ref": "ba51314f7f4e8643", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/style.py", + "type": "file" + }, + { + "bom-ref": "9a9c34f3f373695d", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/styles/__init__.py", + "type": "file" + }, + { + "bom-ref": "b8476b4c25363309", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/token.py", + "type": "file" + }, + { + "bom-ref": "374e30a488b136b8", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/unistring.py", + "type": "file" + }, + { + "bom-ref": "4431dafef6ab6cbb", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/util.py", + "type": "file" + }, + { + "bom-ref": "829b695e335d6a40", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/__init__.py", + "type": "file" + }, + { + "bom-ref": "7da738de54e9986c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/actions.py", + "type": "file" + }, + { + "bom-ref": "0abf9b01b0a94f60", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/common.py", + "type": "file" + }, + { + "bom-ref": "e75db4d37ab3b8a7", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/core.py", + "type": "file" + }, + { + "bom-ref": "e464847203641e86", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/diagram/__init__.py", + "type": "file" + }, + { + "bom-ref": "c83ba0ef326845a2", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/exceptions.py", + "type": "file" + }, + { + "bom-ref": "2f6004b6e46faced", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/helpers.py", + "type": "file" + }, + { + "bom-ref": "4da88dbfd9add860", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/results.py", + "type": "file" + }, + { + "bom-ref": "0a3680dc333b6707", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/testing.py", + "type": "file" + }, + { + "bom-ref": "a62fade1b9382888", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/unicode.py", + "type": "file" + }, + { + "bom-ref": "c96bc9f16de21a4f", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/util.py", + "type": "file" + }, + { + "bom-ref": "36920886421aba42", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/__init__.py", + "type": "file" + }, + { + "bom-ref": "e1d9a9a100b8e540", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_compat.py", + "type": "file" + }, + { + "bom-ref": "fdc508ed97e8c59d", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_impl.py", + "type": "file" + }, + { + "bom-ref": "d0e972f7735eb58c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py", + "type": "file" + }, + { + "bom-ref": "7212235d8c6e8194", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", + "type": "file" + }, + { + "bom-ref": "8e4e1d3741752455", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/__init__.py", + "type": "file" + }, + { + "bom-ref": "13d07c135716583c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/__version__.py", + "type": "file" + }, + { + "bom-ref": "b7aaec46b234d51c", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/_internal_utils.py", + "type": "file" + }, + { + "bom-ref": "6786cafea2937295", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/adapters.py", + "type": "file" + }, + { + "bom-ref": "3ab6b104f501cc70", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/api.py", + "type": "file" + }, + { + "bom-ref": "4c5972771f45a007", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/auth.py", + "type": "file" + }, + { + "bom-ref": "c876b8bf31300a41", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/certs.py", + "type": "file" + }, + { + "bom-ref": "b0c2600aa1c8bc34", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/compat.py", + "type": "file" + }, + { + "bom-ref": "815e87954e5e46ec", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/cookies.py", + "type": "file" + }, + { + "bom-ref": "82c63eb13ec7a556", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/exceptions.py", + "type": "file" + }, + { + "bom-ref": "112c341e4bedd026", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/help.py", + "type": "file" + }, + { + "bom-ref": "a81e3e7eb4974ace", + "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/hooks.py", + "type": "file" + }, + { + "bom-ref": "e583beb6ed3e45c7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/models.py", "type": "file" }, { - "bom-ref": "6837e2a943eb24b9", + "bom-ref": "8f36c32f42320e39", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/packages.py", "type": "file" }, { - "bom-ref": "84fe443d1f0f2139", + "bom-ref": "07f8f1217f985019", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/sessions.py", "type": "file" }, { - "bom-ref": "df4806b946a5cfa2", + "bom-ref": "6e6c15332f3b2252", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/status_codes.py", "type": "file" }, { - "bom-ref": "db102fe5310240d5", + "bom-ref": "abd0275d1eddb5d9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/structures.py", "type": "file" }, { - "bom-ref": "767ef53409c04665", + "bom-ref": "4f06bb9448e4e16d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/utils.py", "type": "file" }, { - "bom-ref": "d78ce27bce09a6e9", + "bom-ref": "5b75a67767b8b955", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/__init__.py", "type": "file" }, { - "bom-ref": "8fe20122178ff002", + "bom-ref": "b6a512a24353c69e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/compat/__init__.py", "type": "file" }, { - "bom-ref": "f1d68747d1819bd2", + "bom-ref": "4d9513144c94de12", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/compat/collections_abc.py", "type": "file" }, { - "bom-ref": "675be12258f2d217", + "bom-ref": "f684f751402e114f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/providers.py", "type": "file" }, { - "bom-ref": "cedecae8ceb25f9e", + "bom-ref": "375fd391dafa5c72", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/reporters.py", "type": "file" }, { - "bom-ref": "985cfa58d183bcf3", + "bom-ref": "248a372ac5e27a53", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/resolvers.py", "type": "file" }, { - "bom-ref": "51d00b501e440f4b", + "bom-ref": "e3b21649aeed8d97", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/structs.py", "type": "file" }, { - "bom-ref": "66032f474eb9addd", + "bom-ref": "8efb1d9c92fe9f0d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/__init__.py", "type": "file" }, { - "bom-ref": "0fc763c92ad99b1b", + "bom-ref": "9c9faed909a586c7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/__main__.py", "type": "file" }, { - "bom-ref": "b44b174ad86c002d", + "bom-ref": "f94ea8bdcd63b98d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_cell_widths.py", "type": "file" }, { - "bom-ref": "16769a6dd41ffad3", + "bom-ref": "653b7a270869b86f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_emoji_codes.py", "type": "file" }, { - "bom-ref": "b4c2b5c5af14977d", + "bom-ref": "9ae54e8bfc8be1a1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_emoji_replace.py", "type": "file" }, { - "bom-ref": "927d69a2086f73ca", + "bom-ref": "1e4f5e01050c2cae", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_export_format.py", "type": "file" }, { - "bom-ref": "6bbe47652e01c3c0", + "bom-ref": "ad8b6b3d61e067e8", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_extension.py", "type": "file" }, { - "bom-ref": "6edfdb54d9a54a7b", + "bom-ref": "e2aae1ee914b413f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_fileno.py", "type": "file" }, { - "bom-ref": "1c0f181a1c9d3aec", + "bom-ref": "6504aff8a77ab184", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_inspect.py", "type": "file" }, { - "bom-ref": "0772263556964d38", + "bom-ref": "6c06e7bd505ac400", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_log_render.py", "type": "file" }, { - "bom-ref": "ac3316f005753fb3", + "bom-ref": "1e5e888176a48a8b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_loop.py", "type": "file" }, { - "bom-ref": "8ac2554d556888c2", + "bom-ref": "0db3d03eb3e8f192", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_null_file.py", "type": "file" }, { - "bom-ref": "5c6bad74a0034a0a", + "bom-ref": "8610ad34e02e563e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_palettes.py", "type": "file" }, { - "bom-ref": "a3498ae21982eb2c", + "bom-ref": "f59416043634b8f8", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_pick.py", "type": "file" }, { - "bom-ref": "100b32cd4af4a1f2", + "bom-ref": "ac1ca2bcd13285ca", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_ratio.py", "type": "file" }, { - "bom-ref": "995c70c2773f4625", + "bom-ref": "235eb3edc7d00fed", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_spinners.py", "type": "file" }, { - "bom-ref": "f777138b932af830", + "bom-ref": "5819c088c79b604c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_stack.py", "type": "file" }, { - "bom-ref": "9e4060e25c4bafd3", + "bom-ref": "a079ed0727bc08c3", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_timer.py", "type": "file" }, { - "bom-ref": "dbc0f654efcadd6b", + "bom-ref": "ad97f25ffa07f64b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_win32_console.py", "type": "file" }, { - "bom-ref": "3ca5fd22fb1f0f9e", + "bom-ref": "8de64c4d27032b0e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_windows.py", "type": "file" }, { - "bom-ref": "d3574f48193a3e46", + "bom-ref": "683a13bf33c7807a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_windows_renderer.py", "type": "file" }, { - "bom-ref": "23892288e16203d8", + "bom-ref": "b7e511dcfd12777c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_wrap.py", "type": "file" }, { - "bom-ref": "7016f04bda044812", + "bom-ref": "d10b83ae8fc2fcae", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/abc.py", "type": "file" }, { - "bom-ref": "71002677c301184e", + "bom-ref": "6541129ecc4262c2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/align.py", "type": "file" }, { - "bom-ref": "006d01a8b472a580", + "bom-ref": "6fb36a4762687a90", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/ansi.py", "type": "file" }, { - "bom-ref": "1721d9c2fc975f68", + "bom-ref": "25453479e7b3d4b0", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/bar.py", "type": "file" }, { - "bom-ref": "00930bc04e1e12ae", + "bom-ref": "e862265ad11c0a6e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/box.py", "type": "file" }, { - "bom-ref": "20af2f992b0c9937", + "bom-ref": "b7aede28242bcac7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/cells.py", "type": "file" }, { - "bom-ref": "00dfc040ac0ea039", + "bom-ref": "eb71f895dbc32009", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/color.py", "type": "file" }, { - "bom-ref": "960e9e761baac35d", + "bom-ref": "f3b3712153ef308d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/color_triplet.py", "type": "file" }, { - "bom-ref": "85cc7565da424ef5", + "bom-ref": "ff47060efe203575", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/columns.py", "type": "file" }, { - "bom-ref": "7473d232ab8c3431", + "bom-ref": "b0656b4280f8cc29", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/console.py", "type": "file" }, { - "bom-ref": "95b58b9a51e11264", + "bom-ref": "763fa5b8e3c456ec", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/constrain.py", "type": "file" }, { - "bom-ref": "d293069d3c65a3d6", + "bom-ref": "c929dfcd90054e52", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/containers.py", "type": "file" }, { - "bom-ref": "0d8abafb304328d0", + "bom-ref": "de32b15bd20f23a4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/control.py", "type": "file" }, { - "bom-ref": "48e0da75900aae8e", + "bom-ref": "9ef86787a8df55f6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/default_styles.py", "type": "file" }, { - "bom-ref": "2f6c4b155f8d36b1", + "bom-ref": "5c1a1f190f8d76d5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/diagnose.py", "type": "file" }, { - "bom-ref": "4c8ef220089e1253", + "bom-ref": "03935b3b6fdfefeb", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/emoji.py", "type": "file" }, { - "bom-ref": "132a04d84609828c", + "bom-ref": "14a3f6418273ef88", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/errors.py", "type": "file" }, { - "bom-ref": "6341de02dfea32a5", + "bom-ref": "64252f9d2874f8f9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/file_proxy.py", "type": "file" }, { - "bom-ref": "47c53a4894f56b19", + "bom-ref": "f9d4c75b0ced3b9d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/filesize.py", "type": "file" }, { - "bom-ref": "26c578e0b9ff09ff", + "bom-ref": "a68dcb9014963247", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/highlighter.py", "type": "file" }, { - "bom-ref": "88d8902c7e761258", + "bom-ref": "685041c10496dc34", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/json.py", "type": "file" }, { - "bom-ref": "b9b172eefe846881", + "bom-ref": "f6583e8b4dcb4869", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/jupyter.py", "type": "file" }, { - "bom-ref": "5cbdcf97cde9be9a", + "bom-ref": "3afc986330a27f4e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/layout.py", "type": "file" }, { - "bom-ref": "78a0bb44d65a1a74", + "bom-ref": "6039989de23a4da4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/live.py", "type": "file" }, { - "bom-ref": "401bc2d2785f25f4", + "bom-ref": "25a65c41136df98c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/live_render.py", "type": "file" }, { - "bom-ref": "97de64b698c8cbb9", + "bom-ref": "da09a0db1542050d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/logging.py", "type": "file" }, { - "bom-ref": "b0228f208610066e", + "bom-ref": "233b7e6f0cc5ff3e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/markup.py", "type": "file" }, { - "bom-ref": "d15352d9f2d0b4b8", + "bom-ref": "b54c05b2261f20a0", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/measure.py", "type": "file" }, { - "bom-ref": "4e4706fde83c666e", + "bom-ref": "714660c6648c757e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/padding.py", "type": "file" }, { - "bom-ref": "026102d89fb2cc73", + "bom-ref": "f1ee2595e03f7cf3", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/pager.py", "type": "file" }, { - "bom-ref": "650fd53e2ff1042b", + "bom-ref": "73d210cf2a70d8bf", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/palette.py", "type": "file" }, { - "bom-ref": "a12c760babc51fd9", + "bom-ref": "e160e58f239e83a5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/panel.py", "type": "file" }, { - "bom-ref": "ac8e303a46a2a004", + "bom-ref": "cc44a5c6b5f96278", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/pretty.py", "type": "file" }, { - "bom-ref": "f40bca3184b0b3f5", + "bom-ref": "71d21cded8c40b01", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/progress.py", "type": "file" }, { - "bom-ref": "e7526e9cfedf13c3", + "bom-ref": "c9cf04ca2a4ce483", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/progress_bar.py", "type": "file" }, { - "bom-ref": "9b2217b37b411bb9", + "bom-ref": "a615011e32af71dd", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/prompt.py", "type": "file" }, { - "bom-ref": "01ba06bc179993ce", + "bom-ref": "e7bd16296102585e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/protocol.py", "type": "file" }, { - "bom-ref": "0a53148cb5f42148", + "bom-ref": "3fb439fd7c3463c0", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/region.py", "type": "file" }, { - "bom-ref": "a2ce4652ab3577bd", + "bom-ref": "de8a66254c9b10d5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/repr.py", "type": "file" }, { - "bom-ref": "292584ecbb7350a8", + "bom-ref": "b96bdef9a2de51c8", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/rule.py", "type": "file" }, { - "bom-ref": "eb58e66c16965c68", + "bom-ref": "7cc75d3b2e9df658", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/scope.py", "type": "file" }, { - "bom-ref": "4c749eb4e2af8622", + "bom-ref": "0aabe4d11751f846", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/screen.py", "type": "file" }, { - "bom-ref": "9fa2ef501abe803d", + "bom-ref": "4d8d149cc66d4e3d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/segment.py", "type": "file" }, { - "bom-ref": "913a719e846b0083", + "bom-ref": "1b15c0c5880a05f7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/spinner.py", "type": "file" }, { - "bom-ref": "f03cb6f4546b10ed", + "bom-ref": "1f8a6359ea2e0f45", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/status.py", "type": "file" }, { - "bom-ref": "d102a22be9c004d5", + "bom-ref": "70e80087dbf80b89", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/style.py", "type": "file" }, { - "bom-ref": "88dde4d72782fa96", + "bom-ref": "009f75c7e8aaa20e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/styled.py", "type": "file" }, { - "bom-ref": "ff8ccb9bc6fefd35", + "bom-ref": "007b561a02f9bcfd", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/syntax.py", "type": "file" }, { - "bom-ref": "0749d129a78bc79c", + "bom-ref": "5deaec064a137594", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/table.py", "type": "file" }, { - "bom-ref": "91cacaf0d8b70700", + "bom-ref": "7cba585974c34764", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/terminal_theme.py", "type": "file" }, { - "bom-ref": "41e0b0774ab4f053", + "bom-ref": "bec14c133f5cbae3", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/text.py", "type": "file" }, { - "bom-ref": "3b34032f92f41ed5", + "bom-ref": "8dcd0bec66b27705", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/theme.py", "type": "file" }, { - "bom-ref": "8a3eb95367aa8418", + "bom-ref": "ac86d9734a85682c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/themes.py", "type": "file" }, { - "bom-ref": "735b7bae1e3d9f2f", + "bom-ref": "79fce8836b8e2c1f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/traceback.py", "type": "file" }, { - "bom-ref": "0f01ca16d72c6eeb", + "bom-ref": "faab62fd3dd11a97", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/tree.py", "type": "file" }, { - "bom-ref": "682a2780a4e8037a", + "bom-ref": "84648360606944a2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/six.py", "type": "file" }, { - "bom-ref": "41609a5ba172e69b", + "bom-ref": "c51994133f15f73b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/__init__.py", "type": "file" }, { - "bom-ref": "b64181f78642e110", + "bom-ref": "73a8c222ef762e3c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/_asyncio.py", "type": "file" }, { - "bom-ref": "ac7ca091b3675f3b", + "bom-ref": "bb9b95647e61bd13", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/_utils.py", "type": "file" }, { - "bom-ref": "2804174930c0f6e1", + "bom-ref": "bb22a8c20fd3a84d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/after.py", "type": "file" }, { - "bom-ref": "5173a72579fdce5a", + "bom-ref": "754bffeed8999d9a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/before.py", "type": "file" }, { - "bom-ref": "93f6f061572d4182", + "bom-ref": "566ad7a3d818ce3e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/before_sleep.py", "type": "file" }, { - "bom-ref": "92935c9b66a523f5", + "bom-ref": "9b92d0e8a443cb45", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/nap.py", "type": "file" }, { - "bom-ref": "745e867e104b5d86", + "bom-ref": "09eb9d5dba43ae92", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/retry.py", "type": "file" }, { - "bom-ref": "05c58611a5cc82e3", + "bom-ref": "3c7741712166d96f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/stop.py", "type": "file" }, { - "bom-ref": "309d0b82c00ffe0c", + "bom-ref": "193cda9a9cbc1a60", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/tornadoweb.py", "type": "file" }, { - "bom-ref": "d523a078a5988765", + "bom-ref": "3bac72da7b270c79", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/wait.py", "type": "file" }, { - "bom-ref": "cb91230650f08dd5", + "bom-ref": "e6cee63609264205", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tomli/__init__.py", "type": "file" }, { - "bom-ref": "4e4125cbedee07fe", + "bom-ref": "e8382cce0fc83b36", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tomli/_parser.py", "type": "file" }, { - "bom-ref": "f4df215aacdc7e0b", + "bom-ref": "322d1b438abff263", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tomli/_re.py", "type": "file" }, { - "bom-ref": "e00defec24a9bb57", + "bom-ref": "5b0e9d8397802f0b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tomli/_types.py", "type": "file" }, { - "bom-ref": "1ea3fb772da4cdd7", + "bom-ref": "3bc58399ef35585b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/__init__.py", "type": "file" }, { - "bom-ref": "e3b7a2446d501b7c", + "bom-ref": "c6fca344f1b8b0d4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/_api.py", "type": "file" }, { - "bom-ref": "2894ba94f52517a8", + "bom-ref": "6283b08a1a027110", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/_macos.py", "type": "file" }, { - "bom-ref": "b16b447faf36b54b", + "bom-ref": "708968cad877eb3b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/_openssl.py", "type": "file" }, { - "bom-ref": "7c4a46a9e072c2c3", + "bom-ref": "67a687333d17568f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/_ssl_constants.py", "type": "file" }, { - "bom-ref": "73e66454d6e9677c", + "bom-ref": "0249a29e3dd7dfa8", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/_windows.py", "type": "file" }, { - "bom-ref": "70c607ececb32506", + "bom-ref": "a9d18ae23e7807b6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/typing_extensions.py", "type": "file" }, { - "bom-ref": "0a7ba452fb3c96bc", + "bom-ref": "0d46cbdb8b3fc97c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/__init__.py", "type": "file" }, { - "bom-ref": "7522db2dc427e1e0", + "bom-ref": "da1c7796103d6118", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/_collections.py", "type": "file" }, { - "bom-ref": "7ef85b3a7fdcbe7d", + "bom-ref": "a79ebed7c51017f5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/_version.py", "type": "file" }, { - "bom-ref": "d58edcba3e98db2c", + "bom-ref": "537ed439b8334e70", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/connection.py", "type": "file" }, { - "bom-ref": "073776f28d957fd8", + "bom-ref": "62cdbac3151f49e4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/connectionpool.py", "type": "file" }, { - "bom-ref": "66cbe7c04e9f17ae", + "bom-ref": "c6bcf409274a6722", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/__init__.py", "type": "file" }, { - "bom-ref": "af2932f2db8b5919", + "bom-ref": "a868ca878e0d3b29", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py", "type": "file" }, { - "bom-ref": "9f9a496d6614b589", + "bom-ref": "aa6d11297c69f5b5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py", "type": "file" }, { - "bom-ref": "499408ce5bcf1619", + "bom-ref": "2b0624978b5ecabd", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py", "type": "file" }, { - "bom-ref": "b2920fbdf23cd1eb", + "bom-ref": "2c42dd5c36ffa29f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py", "type": "file" }, { - "bom-ref": "693a657ac7f75ddc", + "bom-ref": "bfdcc1d32acc6d04", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/appengine.py", "type": "file" }, { - "bom-ref": "3cc7fa6c927e8966", + "bom-ref": "d6fde09fa435178e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/ntlmpool.py", "type": "file" }, { - "bom-ref": "f4b179e8d12f80ec", + "bom-ref": "82de42b523f3542c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/pyopenssl.py", "type": "file" }, { - "bom-ref": "0f1d2db512ec1170", + "bom-ref": "e133e50f714e9a84", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/securetransport.py", "type": "file" }, { - "bom-ref": "281c3887c0bb9be2", + "bom-ref": "fedc906a29d2aa76", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/socks.py", "type": "file" }, { - "bom-ref": "ac21247102288a61", + "bom-ref": "2ab8a958ea6f640d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/exceptions.py", "type": "file" }, { - "bom-ref": "a2ceaa8336fdc44a", + "bom-ref": "4de01c53377c495a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/fields.py", "type": "file" }, { - "bom-ref": "3db5ccb2c70305f9", + "bom-ref": "a3c6239bec208a79", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/filepost.py", "type": "file" }, { - "bom-ref": "63e941deb6865cfc", + "bom-ref": "e833f697f91e51d8", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/packages/__init__.py", "type": "file" }, { - "bom-ref": "334b50e9cbb42d66", + "bom-ref": "916f015450711506", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/packages/backports/__init__.py", "type": "file" }, { - "bom-ref": "293204d6cab3770a", + "bom-ref": "dbb89fd71a2259ca", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/packages/backports/makefile.py", "type": "file" }, { - "bom-ref": "0638b1665288a975", + "bom-ref": "04b7680928376581", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py", "type": "file" }, { - "bom-ref": "95975ebace4272f7", + "bom-ref": "45eb3411256e46b7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/packages/six.py", "type": "file" }, { - "bom-ref": "83b4954293bc1986", + "bom-ref": "59a0595aa5499472", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/poolmanager.py", "type": "file" }, { - "bom-ref": "80128137447b528d", + "bom-ref": "e20d8b38cf984e69", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/request.py", "type": "file" }, { - "bom-ref": "1cb7cd45b5a3e713", + "bom-ref": "c8488b93f246bc9b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/response.py", "type": "file" }, { - "bom-ref": "2752ceb5e87a637a", + "bom-ref": "badd8e78efec330e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/__init__.py", "type": "file" }, { - "bom-ref": "6e049fc42874d03a", + "bom-ref": "0731cd9e59c131ca", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/connection.py", "type": "file" }, { - "bom-ref": "531fb347bc0b6bea", + "bom-ref": "948300c358176eb2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/proxy.py", "type": "file" }, { - "bom-ref": "6bd532a80347e45e", + "bom-ref": "a7451cf2eaca3936", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/queue.py", "type": "file" }, { - "bom-ref": "016335a244899678", + "bom-ref": "4ff412e3d40d5430", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/request.py", "type": "file" }, { - "bom-ref": "c4d12a95a7184a83", + "bom-ref": "c052d54d395edb87", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/response.py", "type": "file" }, { - "bom-ref": "9bf115344f37c4a1", + "bom-ref": "d9e29f1ac2dab3cd", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/retry.py", "type": "file" }, { - "bom-ref": "d044d1d3dcb91345", + "bom-ref": "7bb343275246ba91", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/ssl_.py", "type": "file" }, { - "bom-ref": "557b6d067d9041a9", + "bom-ref": "cbbc50fa1efcf191", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py", "type": "file" }, { - "bom-ref": "6132709f7b104098", + "bom-ref": "e4fc84d83627b184", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/ssltransport.py", "type": "file" }, { - "bom-ref": "fa62d93978df1bea", + "bom-ref": "ed942df2c5c642ca", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/timeout.py", "type": "file" }, { - "bom-ref": "e3363045fdcc3a6a", + "bom-ref": "84b9993f1b180582", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/url.py", "type": "file" }, { - "bom-ref": "e8c01f67699e3b83", + "bom-ref": "b86bde3a4aa72e23", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/wait.py", "type": "file" }, { - "bom-ref": "031bf8f857cb6aba", + "bom-ref": "5e3dfecaa33d5912", "name": "/usr/lib/python3/dist-packages/pip/_vendor/vendor.txt", "type": "file" }, { - "bom-ref": "b1f8ab4309224d3b", + "bom-ref": "fb5ddf1806cab20f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/webencodings/__init__.py", "type": "file" }, { - "bom-ref": "9a1a6d820b588821", + "bom-ref": "e19f0fe6c61efab1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/webencodings/labels.py", "type": "file" }, { - "bom-ref": "229b9e50a2c760ef", + "bom-ref": "243602a6bab1204f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/webencodings/mklabels.py", "type": "file" }, { - "bom-ref": "457f065a878df6fa", + "bom-ref": "32745c8ad0806352", "name": "/usr/lib/python3/dist-packages/pip/_vendor/webencodings/tests.py", "type": "file" }, { - "bom-ref": "68ad048240712586", + "bom-ref": "6a7bb98a8d6868ea", "name": "/usr/lib/python3/dist-packages/pip/_vendor/webencodings/x_user_defined.py", "type": "file" }, { - "bom-ref": "7ca8c8b6648cf4d5", + "bom-ref": "9e21c5f79012b8cd", "name": "/usr/lib/python3/dist-packages/pip/py.typed", "type": "file" }, { - "bom-ref": "9a4d7925192cf736", + "bom-ref": "9373cac4c5f4fb32", "name": "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", "type": "file" }, { - "bom-ref": "5f44b7691db53952", + "bom-ref": "2f74ed76ffb273b6", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/__init__.py", "type": "file" }, { - "bom-ref": "0868aa1816c5f47b", + "bom-ref": "167098e43b40d667", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/__init__.py", "type": "file" }, { - "bom-ref": "ee554a6c84e0618d", + "bom-ref": "46e49effe7a0733d", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/_adapters.py", "type": "file" }, { - "bom-ref": "2370f23f68c187d4", + "bom-ref": "7e6bd5235d083a38", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/_common.py", "type": "file" }, { - "bom-ref": "3fa89cace1e16b0f", + "bom-ref": "409cf14783e8a397", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/_compat.py", "type": "file" }, { - "bom-ref": "e853ad9b7d7559d3", + "bom-ref": "5ccf2462744bdbab", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/_itertools.py", "type": "file" }, { - "bom-ref": "f37edf60f539d733", + "bom-ref": "16ebc8fe1c56e127", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/_legacy.py", "type": "file" }, { - "bom-ref": "eab72f932e0a2620", + "bom-ref": "df74d89bc19736b8", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/abc.py", "type": "file" }, { - "bom-ref": "9a1d7a8ca7e3e24b", + "bom-ref": "82d624dcd28bd493", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/readers.py", "type": "file" }, { - "bom-ref": "4c4f13d8ac690395", + "bom-ref": "1a7ca7951cbbc58d", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/simple.py", "type": "file" }, { - "bom-ref": "e555b58ed6a9199f", + "bom-ref": "06b062f6cbea51cf", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/jaraco/__init__.py", "type": "file" }, { - "bom-ref": "abece1d63fca0c07", + "bom-ref": "eb062b250df06d77", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/jaraco/context.py", "type": "file" }, { - "bom-ref": "e018857c36a09a7f", + "bom-ref": "667ea755cee1e957", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/jaraco/functools.py", "type": "file" }, { - "bom-ref": "bebbecf8e9b36835", + "bom-ref": "1f3c13cbaf3744c1", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/jaraco/text/__init__.py", "type": "file" }, { - "bom-ref": "1850caa18b23489c", + "bom-ref": "99b8621f11cc0eb0", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/more_itertools/__init__.py", "type": "file" }, { - "bom-ref": "12ee07b8d7c847ee", + "bom-ref": "79e77ae757e082f6", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/more_itertools/more.py", "type": "file" }, { - "bom-ref": "24dd4b306b85eb80", + "bom-ref": "b6d5294a64604fb0", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/more_itertools/recipes.py", "type": "file" }, { - "bom-ref": "f5061fb6e27afa2e", + "bom-ref": "39987421922295ae", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/__init__.py", "type": "file" }, { - "bom-ref": "49dbdd325d18df8c", + "bom-ref": "d3417c593e2cf2f0", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_elffile.py", "type": "file" }, { - "bom-ref": "3991d96bc793306c", + "bom-ref": "fe2bca6802041588", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_manylinux.py", "type": "file" }, { - "bom-ref": "4d4e6047db3d490c", + "bom-ref": "8eb214542c9e7594", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_musllinux.py", "type": "file" }, { - "bom-ref": "4df7e7a149109ab8", + "bom-ref": "2bc4af252fdd0918", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_parser.py", "type": "file" }, { - "bom-ref": "b58360411af79a71", + "bom-ref": "d91d679627a31f51", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_structures.py", "type": "file" }, { - "bom-ref": "221c3ba48bb9cc19", + "bom-ref": "c501779ad4de9a4d", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_tokenizer.py", "type": "file" }, { - "bom-ref": "6d4f6ff951981598", + "bom-ref": "f7b907310e41d300", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/markers.py", "type": "file" }, { - "bom-ref": "9aa7e40f1db00c27", + "bom-ref": "10d59c277c944a93", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/metadata.py", "type": "file" }, { - "bom-ref": "24beff0a3666f4ab", + "bom-ref": "7b40f355a74271a3", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/requirements.py", "type": "file" }, { - "bom-ref": "d2dd6f7793c750dd", + "bom-ref": "8ee97763fabf11a9", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/specifiers.py", "type": "file" }, { - "bom-ref": "74e95c31b4fdda97", + "bom-ref": "f1eb1d379c2491d3", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/tags.py", "type": "file" }, { - "bom-ref": "23d065d05588cd56", + "bom-ref": "f41538fe73a72a4a", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/utils.py", "type": "file" }, { - "bom-ref": "ed7d4fbf3d23d2ee", + "bom-ref": "67dad396da769a76", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/version.py", "type": "file" }, { - "bom-ref": "101396601d937b9e", + "bom-ref": "e762ee2aa2ade7be", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/__init__.py", "type": "file" }, { - "bom-ref": "f328608f0065686a", + "bom-ref": "424f82895cf7775e", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/__main__.py", "type": "file" }, { - "bom-ref": "67275805edac37f2", + "bom-ref": "b1a5e58851ba804a", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/android.py", "type": "file" }, { - "bom-ref": "616504cd96a27796", + "bom-ref": "632e874993753272", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/api.py", "type": "file" }, { - "bom-ref": "d56e6884826d6406", + "bom-ref": "221ca603849322ee", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/macos.py", "type": "file" }, { - "bom-ref": "4bded15b31457566", + "bom-ref": "c8f3cca24621cc96", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/unix.py", "type": "file" }, { - "bom-ref": "0fa9878ee6dcb87e", + "bom-ref": "79deb1f2fcd6003a", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/version.py", "type": "file" }, { - "bom-ref": "f0db8e90979632f6", + "bom-ref": "667488d57225b94e", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/windows.py", "type": "file" }, { - "bom-ref": "39f737b2fc35cf33", + "bom-ref": "c6aa44b002b31e67", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/typing_extensions.py", "type": "file" }, { - "bom-ref": "8aa4c406d58293e7", + "bom-ref": "b2973633ed35362b", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/zipp.py", "type": "file" }, { - "bom-ref": "71655b2af930f232", + "bom-ref": "45161a71ddcde00e", "name": "/usr/lib/python3/dist-packages/pkg_resources/extern/__init__.py", "type": "file" }, { - "bom-ref": "6b0a31ed8214f1ed", + "bom-ref": "d6e3c6d805410b9e", + "name": "/usr/lib/python3/dist-packages/pygtkcompat/__init__.py", + "type": "file" + }, + { + "bom-ref": "1140dd29495cd524", + "name": "/usr/lib/python3/dist-packages/pygtkcompat/generictreemodel.py", + "type": "file" + }, + { + "bom-ref": "afcbe6fc9ac1941d", + "name": "/usr/lib/python3/dist-packages/pygtkcompat/pygtkcompat.py", + "type": "file" + }, + { + "bom-ref": "6db229eb15112387", + "name": "/usr/lib/python3/dist-packages/pyparsing-3.1.1.dist-info/INSTALLER", + "type": "file" + }, + { + "bom-ref": "ddef55ffa02bce3f", + "name": "/usr/lib/python3/dist-packages/pyparsing-3.1.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "62efc2c01ec2af38", + "name": "/usr/lib/python3/dist-packages/pyparsing-3.1.1.dist-info/WHEEL", + "type": "file" + }, + { + "bom-ref": "46ca702f1a3e5f76", + "name": "/usr/lib/python3/dist-packages/pyparsing/__init__.py", + "type": "file" + }, + { + "bom-ref": "238b1ce46c7f6ffc", + "name": "/usr/lib/python3/dist-packages/pyparsing/actions.py", + "type": "file" + }, + { + "bom-ref": "077ac3285c683c31", + "name": "/usr/lib/python3/dist-packages/pyparsing/common.py", + "type": "file" + }, + { + "bom-ref": "e97ab94eb5dadde6", + "name": "/usr/lib/python3/dist-packages/pyparsing/core.py", + "type": "file" + }, + { + "bom-ref": "7141929e101264fc", + "name": "/usr/lib/python3/dist-packages/pyparsing/diagram/__init__.py", + "type": "file" + }, + { + "bom-ref": "1b0d43fafc34298f", + "name": "/usr/lib/python3/dist-packages/pyparsing/exceptions.py", + "type": "file" + }, + { + "bom-ref": "c246e46daba8bc97", + "name": "/usr/lib/python3/dist-packages/pyparsing/helpers.py", + "type": "file" + }, + { + "bom-ref": "2f6cf6ec855e3968", + "name": "/usr/lib/python3/dist-packages/pyparsing/py.typed", + "type": "file" + }, + { + "bom-ref": "9a68c12b45ac2e8f", + "name": "/usr/lib/python3/dist-packages/pyparsing/results.py", + "type": "file" + }, + { + "bom-ref": "0dc963085bfcb85c", + "name": "/usr/lib/python3/dist-packages/pyparsing/testing.py", + "type": "file" + }, + { + "bom-ref": "1eb52541f9261fd8", + "name": "/usr/lib/python3/dist-packages/pyparsing/unicode.py", + "type": "file" + }, + { + "bom-ref": "091678e5a0bb4c71", + "name": "/usr/lib/python3/dist-packages/pyparsing/util.py", + "type": "file" + }, + { + "bom-ref": "41b944b37cec568a", + "name": "/usr/lib/python3/dist-packages/python_apt-2.7.7+ubuntu5.3.egg-info/PKG-INFO", + "type": "file" + }, + { + "bom-ref": "5e75b047dbca9285", + "name": "/usr/lib/python3/dist-packages/python_apt-2.7.7+ubuntu5.3.egg-info/dependency_links.txt", + "type": "file" + }, + { + "bom-ref": "774606e81bec2a27", + "name": "/usr/lib/python3/dist-packages/python_apt-2.7.7+ubuntu5.3.egg-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "68c369312224f65d", "name": "/usr/lib/python3/dist-packages/setuptools-68.1.2.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "10d23ef1c40ba67b", + "bom-ref": "70296509aef8f50f", "name": "/usr/lib/python3/dist-packages/setuptools-68.1.2.egg-info/dependency_links.txt", "type": "file" }, { - "bom-ref": "8b712a265d65ea36", + "bom-ref": "77c19f7a63db9486", "name": "/usr/lib/python3/dist-packages/setuptools-68.1.2.egg-info/entry_points.txt", "type": "file" }, { - "bom-ref": "cf5dba8fb3251075", + "bom-ref": "e3c16fc7471a2529", "name": "/usr/lib/python3/dist-packages/setuptools-68.1.2.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "568945cc5e2ad668", + "bom-ref": "250e5bb3d281c660", "name": "/usr/lib/python3/dist-packages/setuptools/__init__.py", "type": "file" }, { - "bom-ref": "e7142afa41dd881f", + "bom-ref": "48b3bad48e645247", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/__init__.py", "type": "file" }, { - "bom-ref": "236df350106e33da", + "bom-ref": "a799befc8aca3d32", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/_collections.py", "type": "file" }, { - "bom-ref": "10aa725a183e1ea1", + "bom-ref": "01911148e301dc21", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/_functools.py", "type": "file" }, { - "bom-ref": "263bf8af89feb115", + "bom-ref": "5d99463c3e9b22e1", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/_log.py", "type": "file" }, { - "bom-ref": "900a9941dae4c18f", + "bom-ref": "18b05a80a0d9d18b", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/_macos_compat.py", "type": "file" }, { - "bom-ref": "5514c8be77335cbf", + "bom-ref": "f2757d0e2ca206bb", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/_msvccompiler.py", "type": "file" }, { - "bom-ref": "e40f32eb8ee9e8cb", + "bom-ref": "0d287ea0256b0aff", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/archive_util.py", "type": "file" }, { - "bom-ref": "c5db8865f5dacc3d", + "bom-ref": "05e6d81ccc0f5b05", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/bcppcompiler.py", "type": "file" }, { - "bom-ref": "0142ba1f0a422391", + "bom-ref": "3aabb54cce1a7df9", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/ccompiler.py", "type": "file" }, { - "bom-ref": "1e7c6893945fb2ee", + "bom-ref": "58a9546e41e8fba2", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", "type": "file" }, { - "bom-ref": "bac530e64db34c96", + "bom-ref": "7fb97fc0fc9e339e", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/__init__.py", "type": "file" }, { - "bom-ref": "a997ce6817d68a00", + "bom-ref": "7d444739c4b0e338", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/_framework_compat.py", "type": "file" }, { - "bom-ref": "37f1770cb16a851b", + "bom-ref": "7577a98ede671f4f", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/bdist.py", "type": "file" }, { - "bom-ref": "57a3769565500719", + "bom-ref": "875e241a22d4de05", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/bdist_dumb.py", "type": "file" }, { - "bom-ref": "19680636669afdea", + "bom-ref": "9ad35c9bdb6f9106", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/bdist_rpm.py", "type": "file" }, { - "bom-ref": "855eca6b69d39ae3", + "bom-ref": "20014810838cc49f", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/build.py", "type": "file" }, { - "bom-ref": "e0dc13fc3aff19eb", + "bom-ref": "0a5c3b6a85111b8b", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/build_clib.py", "type": "file" }, { - "bom-ref": "f5edff7b1e5f12ed", + "bom-ref": "1791aa26bf8cdab5", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/build_ext.py", "type": "file" }, { - "bom-ref": "ca5493f3b39fd482", + "bom-ref": "6bf6235ca4d5c0ce", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/build_py.py", "type": "file" }, { - "bom-ref": "5df2ee3a061dd31a", + "bom-ref": "b6ff309042c6b48a", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/build_scripts.py", "type": "file" }, { - "bom-ref": "f546db3a55c31c8a", + "bom-ref": "4f65c12f84e20272", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/check.py", "type": "file" }, { - "bom-ref": "9247401ae2d5290e", + "bom-ref": "64ae26266c879bc2", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/clean.py", "type": "file" }, { - "bom-ref": "f429d4868ffde29f", + "bom-ref": "2243b9ede3e91bab", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/config.py", "type": "file" }, { - "bom-ref": "4675ee7f825904c3", + "bom-ref": "21dab2b4cf56436b", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install.py", "type": "file" }, { - "bom-ref": "28208e0aa1444e72", + "bom-ref": "c89a38fed33d6e32", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install_data.py", "type": "file" }, { - "bom-ref": "062a0d511746ee45", + "bom-ref": "c47a32f75ae7791d", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install_egg_info.py", "type": "file" }, { - "bom-ref": "64b6f2498bc873cb", + "bom-ref": "d108cea919a7367f", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install_headers.py", "type": "file" }, { - "bom-ref": "9eebd6f47d4870f6", + "bom-ref": "920b25fdfe368f9e", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install_lib.py", "type": "file" }, { - "bom-ref": "65f92fbb0e5e79e8", + "bom-ref": "6b08a87f3af75618", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install_scripts.py", "type": "file" }, { - "bom-ref": "b48c7cdd365c6e75", + "bom-ref": "1b70aa9cdf0c9401", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/py37compat.py", "type": "file" }, { - "bom-ref": "7e68ecab1273830b", + "bom-ref": "07cae730b32c4e9f", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/register.py", "type": "file" }, { - "bom-ref": "f20e1e48ff5601e9", + "bom-ref": "cf0462d9281f6c8d", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/sdist.py", "type": "file" }, { - "bom-ref": "d49bf97dfec2508c", + "bom-ref": "3b490180099fe004", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/upload.py", "type": "file" }, { - "bom-ref": "950ff65c25922b2e", + "bom-ref": "551f0b37dd779c1e", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/config.py", "type": "file" }, { - "bom-ref": "15b55013db621a4f", + "bom-ref": "6fe205904540520b", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/core.py", "type": "file" }, { - "bom-ref": "a5ce8e6364df43b3", + "bom-ref": "b328275390d47a33", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/cygwinccompiler.py", "type": "file" }, { - "bom-ref": "f9272211958e0fd7", + "bom-ref": "6daccc6ba3d00dd7", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/debug.py", "type": "file" }, { - "bom-ref": "ae850d348490b8f1", + "bom-ref": "8f8d7953b01b38e1", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/dep_util.py", "type": "file" }, { - "bom-ref": "a312cc46f6248f3a", + "bom-ref": "17cf7a6b809ce386", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/dir_util.py", "type": "file" }, { - "bom-ref": "70b526d02e90333f", + "bom-ref": "b57d334b2d2c7613", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", "type": "file" }, { - "bom-ref": "80f5187be113f118", + "bom-ref": "adc9522ded3a898c", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/errors.py", "type": "file" }, { - "bom-ref": "2e010fa951ea7f18", + "bom-ref": "f4a40a8a58921214", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/extension.py", "type": "file" }, { - "bom-ref": "6bfc5ef03754fa86", + "bom-ref": "e12b2e43c3821162", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/fancy_getopt.py", "type": "file" }, { - "bom-ref": "88f1c0b1e611cda3", + "bom-ref": "dbc32c415a375bc3", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/file_util.py", "type": "file" }, { - "bom-ref": "1472a573416c7e6d", + "bom-ref": "ee86adb3255ce315", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/filelist.py", "type": "file" }, { - "bom-ref": "a9edf0861861d49d", + "bom-ref": "bafb9b36f3966fa1", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/log.py", "type": "file" }, { - "bom-ref": "2bbb2aa32289d02f", + "bom-ref": "991ec23fd7bd21ab", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/msvc9compiler.py", "type": "file" }, { - "bom-ref": "c39555aab6969784", + "bom-ref": "8103e432a340dc88", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/msvccompiler.py", "type": "file" }, { - "bom-ref": "6e1dad1a4cb9cd3e", + "bom-ref": "b19d59fd1c1b830e", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/py38compat.py", "type": "file" }, { - "bom-ref": "37356282efde92c0", + "bom-ref": "6ff4d2844c905778", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/py39compat.py", "type": "file" }, { - "bom-ref": "e6c6d0d9f5b3eca1", + "bom-ref": "85957909c36a0635", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/spawn.py", "type": "file" }, { - "bom-ref": "f46bc1403ca8025b", + "bom-ref": "75ab79027389344f", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/sysconfig.py", "type": "file" }, { - "bom-ref": "409be3e1711ed91f", + "bom-ref": "500880daffb7d4bb", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/text_file.py", "type": "file" }, { - "bom-ref": "649b636699d7dd7e", + "bom-ref": "faea88777851d30e", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/unixccompiler.py", "type": "file" }, { - "bom-ref": "179f4a6be85397d9", + "bom-ref": "b79b8fa1a326427d", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/util.py", "type": "file" }, { - "bom-ref": "18d57203395120ee", + "bom-ref": "2dd5335deae38a26", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/version.py", "type": "file" }, { - "bom-ref": "6acf0bc7afdd10c4", + "bom-ref": "51e993676d390454", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/versionpredicate.py", "type": "file" }, { - "bom-ref": "998a22902ef14fc2", + "bom-ref": "149db533778be37a", "name": "/usr/lib/python3/dist-packages/setuptools/_entry_points.py", "type": "file" }, { - "bom-ref": "429a0c4698e9d296", + "bom-ref": "bb5d74d4f19b3882", "name": "/usr/lib/python3/dist-packages/setuptools/_imp.py", "type": "file" }, { - "bom-ref": "4d334e63e2c8cfe6", + "bom-ref": "470f841efe09cc22", "name": "/usr/lib/python3/dist-packages/setuptools/_importlib.py", "type": "file" }, { - "bom-ref": "8a7e5abc65e057dd", + "bom-ref": "1a86b17760fe8f29", "name": "/usr/lib/python3/dist-packages/setuptools/_itertools.py", "type": "file" }, { - "bom-ref": "8438622bd57ddf61", + "bom-ref": "c0bb5ac162998f09", "name": "/usr/lib/python3/dist-packages/setuptools/_normalization.py", "type": "file" }, { - "bom-ref": "2759b7ec9575ae57", + "bom-ref": "4419e87341a1f693", "name": "/usr/lib/python3/dist-packages/setuptools/_path.py", "type": "file" }, { - "bom-ref": "f5d71a2ddd46cdb6", + "bom-ref": "acedec9fa838c046", "name": "/usr/lib/python3/dist-packages/setuptools/_reqs.py", "type": "file" }, { - "bom-ref": "7dd4d3c433b89540", + "bom-ref": "babe378ff6028b1c", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/__init__.py", "type": "file" }, { - "bom-ref": "da4c7de8320ae571", + "bom-ref": "341b5aac68eb8245", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/__init__.py", "type": "file" }, { - "bom-ref": "7da8409f801b9f39", + "bom-ref": "b0391914daf176d1", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_adapters.py", "type": "file" }, { - "bom-ref": "04a404b98bf006d5", + "bom-ref": "d1653f2aba3d83c5", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_collections.py", "type": "file" }, { - "bom-ref": "b96aca8669415e71", + "bom-ref": "99bc58af1486d499", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_compat.py", "type": "file" }, { - "bom-ref": "4b5fbe337d18c07a", + "bom-ref": "34fe7b47825b98ce", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_functools.py", "type": "file" }, { - "bom-ref": "cd898819b9a3d50d", + "bom-ref": "3348484265f73901", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_itertools.py", "type": "file" }, { - "bom-ref": "5f427907f6fbdb03", + "bom-ref": "fd98a2c222ee2b4f", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_meta.py", "type": "file" }, { - "bom-ref": "4fb488f6a1ebbf71", + "bom-ref": "b4a4e0f8c2e268bd", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_py39compat.py", "type": "file" }, { - "bom-ref": "fc344db9bd5f31ea", + "bom-ref": "c1db69256b48491a", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_text.py", "type": "file" }, { - "bom-ref": "9935b5de2c3ba522", + "bom-ref": "11ece8703078e706", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/__init__.py", "type": "file" }, { - "bom-ref": "1ddfa2f1c82b79b1", + "bom-ref": "0bef3931071cb97d", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/_adapters.py", "type": "file" }, { - "bom-ref": "bea3934fa61dc74c", + "bom-ref": "b38d831e8979d698", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/_common.py", "type": "file" }, { - "bom-ref": "1fbf570b023d6d4c", + "bom-ref": "8ad8fd84248a22dc", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/_compat.py", "type": "file" }, { - "bom-ref": "bc123211bc36f591", + "bom-ref": "5e052be1ff103ca9", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/_itertools.py", "type": "file" }, { - "bom-ref": "8b023d26130919fe", + "bom-ref": "cfc11234d1994246", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/_legacy.py", "type": "file" }, { - "bom-ref": "32fe3e4a4ab28ccf", + "bom-ref": "8ba5abad053e613b", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/abc.py", "type": "file" }, { - "bom-ref": "f55bc10e80a1a511", + "bom-ref": "0c2456d4d471e0ed", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/readers.py", "type": "file" }, { - "bom-ref": "1536be4b0336ac87", + "bom-ref": "00e4762691c67feb", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/simple.py", "type": "file" }, { - "bom-ref": "0ea5c197ac05a25d", + "bom-ref": "a8c304b133750a9d", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/jaraco/__init__.py", "type": "file" }, { - "bom-ref": "7fa481d956dc7e3c", + "bom-ref": "077c76b116e693bc", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/jaraco/context.py", "type": "file" }, { - "bom-ref": "020874a7b37b2229", + "bom-ref": "50588c21a6b0b699", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/jaraco/functools.py", "type": "file" }, { - "bom-ref": "78f9cabc05943bd9", + "bom-ref": "c65fa69dfdbee76d", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/jaraco/text/__init__.py", "type": "file" }, { - "bom-ref": "b2f59e752d6efa4a", + "bom-ref": "33747516892b4ee6", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/more_itertools/__init__.py", "type": "file" }, { - "bom-ref": "080f859af84795a6", + "bom-ref": "4d6f3d5b6496bcda", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/more_itertools/more.py", "type": "file" }, { - "bom-ref": "4fbe604424cffa21", + "bom-ref": "e995bbd5e75321c5", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/more_itertools/recipes.py", "type": "file" }, { - "bom-ref": "183e01dbe5fd71cd", + "bom-ref": "8e69673760234365", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/ordered_set.py", "type": "file" }, { - "bom-ref": "11d046c5cdffc301", + "bom-ref": "b2b19977ed8864ad", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/__init__.py", "type": "file" }, { - "bom-ref": "a58e4a121e4c9c57", + "bom-ref": "0cde811b43f311cf", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_elffile.py", "type": "file" }, { - "bom-ref": "2ae1f411499a934d", + "bom-ref": "cc491c5b4f754c39", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_manylinux.py", "type": "file" }, { - "bom-ref": "e04c75a8be34be45", + "bom-ref": "fa4e7538b248e3c9", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_musllinux.py", "type": "file" }, { - "bom-ref": "35c491fde2cb1c1f", + "bom-ref": "dbd03e7fce964e7b", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_parser.py", "type": "file" }, { - "bom-ref": "a2dca1711ebdefb0", + "bom-ref": "93e668aae86c2a84", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_structures.py", "type": "file" }, { - "bom-ref": "125d58c558abc18c", + "bom-ref": "ef10ab5bd80f3cd4", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_tokenizer.py", "type": "file" }, { - "bom-ref": "49acea6983653aeb", + "bom-ref": "d28369aeb1629103", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/markers.py", "type": "file" }, { - "bom-ref": "be1fdd76f0b81c3f", + "bom-ref": "dfc12924dc95dcc3", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/metadata.py", "type": "file" }, { - "bom-ref": "213b45eed52e33e7", + "bom-ref": "461c63d334f9503f", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/requirements.py", "type": "file" }, { - "bom-ref": "6bcf1770dec025a7", + "bom-ref": "4e9246a3d403735b", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/specifiers.py", "type": "file" }, { - "bom-ref": "cc0bc01db361b73b", + "bom-ref": "cd3ea6542f13424f", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/tags.py", "type": "file" }, { - "bom-ref": "b9221ede7236588d", + "bom-ref": "6100936278184be5", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/utils.py", "type": "file" }, { - "bom-ref": "ab250301c0730242", + "bom-ref": "ad1217906117772a", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/version.py", "type": "file" }, { - "bom-ref": "2ab400d6f93bd710", + "bom-ref": "96ad1ef04cfbcb48", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/tomli/__init__.py", "type": "file" }, { - "bom-ref": "ea5dadb37357cf33", + "bom-ref": "157f9e0b1d6a5b03", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/tomli/_parser.py", "type": "file" }, { - "bom-ref": "48196084519cd97a", + "bom-ref": "ebdde2458ca5e192", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/tomli/_re.py", "type": "file" }, { - "bom-ref": "762dede4202adce1", + "bom-ref": "fe585b51a1570445", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/tomli/_types.py", "type": "file" }, { - "bom-ref": "ffd996e7687bf0af", + "bom-ref": "bc6e81bd26e45c57", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/typing_extensions.py", "type": "file" }, { - "bom-ref": "0d44d18698e63dec", + "bom-ref": "c584a01b41249a18", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/zipp.py", "type": "file" }, { - "bom-ref": "fb68a2311a9e7bd7", + "bom-ref": "236da1009bc2d04f", "name": "/usr/lib/python3/dist-packages/setuptools/archive_util.py", "type": "file" }, { - "bom-ref": "9401435ebd64f1f8", + "bom-ref": "a6a7c78954e09578", "name": "/usr/lib/python3/dist-packages/setuptools/build_meta.py", "type": "file" }, { - "bom-ref": "f1c69f3e2bef8ba0", + "bom-ref": "e716f537aa73c948", "name": "/usr/lib/python3/dist-packages/setuptools/command/__init__.py", "type": "file" }, { - "bom-ref": "b0f1625d554dc5a0", + "bom-ref": "de8130f0c58dd064", "name": "/usr/lib/python3/dist-packages/setuptools/command/alias.py", "type": "file" }, { - "bom-ref": "3ab88235a6cf3033", + "bom-ref": "a15e99a09c97cf5b", "name": "/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py", "type": "file" }, { - "bom-ref": "f1149cf8ab7a7d95", + "bom-ref": "dedecfb41c70af1d", "name": "/usr/lib/python3/dist-packages/setuptools/command/bdist_rpm.py", "type": "file" }, { - "bom-ref": "484e66c1054432f6", + "bom-ref": "a728389cae113656", "name": "/usr/lib/python3/dist-packages/setuptools/command/build.py", "type": "file" }, { - "bom-ref": "8432bacfd636f14e", + "bom-ref": "96f8fa34af65fdc2", "name": "/usr/lib/python3/dist-packages/setuptools/command/build_clib.py", "type": "file" }, { - "bom-ref": "ac819213f6ba8436", + "bom-ref": "96c2b050c4e94526", "name": "/usr/lib/python3/dist-packages/setuptools/command/build_ext.py", "type": "file" }, { - "bom-ref": "22119b63c0bbfb94", + "bom-ref": "4065c2c626267470", "name": "/usr/lib/python3/dist-packages/setuptools/command/build_py.py", "type": "file" }, { - "bom-ref": "80b0931c2ff3b663", + "bom-ref": "b262ab2c63a0bef7", "name": "/usr/lib/python3/dist-packages/setuptools/command/develop.py", "type": "file" }, { - "bom-ref": "5c674b7983b4f2d8", + "bom-ref": "56ff5662e08368d8", "name": "/usr/lib/python3/dist-packages/setuptools/command/dist_info.py", "type": "file" }, { - "bom-ref": "b1a7112b523e1a3c", + "bom-ref": "00c1f039d9174220", "name": "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", "type": "file" }, { - "bom-ref": "c9ad12491e3c6304", + "bom-ref": "7545754f35895038", "name": "/usr/lib/python3/dist-packages/setuptools/command/editable_wheel.py", "type": "file" }, { - "bom-ref": "472b64761a609515", + "bom-ref": "70d3f3a69996c43d", "name": "/usr/lib/python3/dist-packages/setuptools/command/egg_info.py", "type": "file" }, { - "bom-ref": "11492a03bffeaaf8", + "bom-ref": "4a05ffa52894d710", "name": "/usr/lib/python3/dist-packages/setuptools/command/install.py", "type": "file" }, { - "bom-ref": "be2eb4e52c16eb03", + "bom-ref": "0623d927fe740423", "name": "/usr/lib/python3/dist-packages/setuptools/command/install_egg_info.py", "type": "file" }, { - "bom-ref": "8cccf70f5baeb938", + "bom-ref": "6c544397800ad604", "name": "/usr/lib/python3/dist-packages/setuptools/command/install_lib.py", "type": "file" }, { - "bom-ref": "ea0eb00f62ba300c", + "bom-ref": "89c2cfa763993c60", "name": "/usr/lib/python3/dist-packages/setuptools/command/install_scripts.py", "type": "file" }, { - "bom-ref": "53e66ceceab9beb9", + "bom-ref": "5583ad4c7da384ad", "name": "/usr/lib/python3/dist-packages/setuptools/command/launcher manifest.xml", "type": "file" }, { - "bom-ref": "206a8f79342aec55", + "bom-ref": "d4b9421f426ae309", "name": "/usr/lib/python3/dist-packages/setuptools/command/register.py", "type": "file" }, { - "bom-ref": "412f5182f2f3e8cf", + "bom-ref": "72cef7ec6d7c4147", "name": "/usr/lib/python3/dist-packages/setuptools/command/rotate.py", "type": "file" }, { - "bom-ref": "ef126cd38dfcd2cf", + "bom-ref": "7c5176948d81c187", "name": "/usr/lib/python3/dist-packages/setuptools/command/saveopts.py", "type": "file" }, { - "bom-ref": "57ba056d3f572dcc", + "bom-ref": "5fe46e4323565624", "name": "/usr/lib/python3/dist-packages/setuptools/command/sdist.py", "type": "file" }, { - "bom-ref": "149c03e9b50751e2", + "bom-ref": "f0651ffe7ee67312", "name": "/usr/lib/python3/dist-packages/setuptools/command/setopt.py", "type": "file" }, { - "bom-ref": "52fbf5c70311a38e", + "bom-ref": "6bd8a494c0b24126", "name": "/usr/lib/python3/dist-packages/setuptools/command/test.py", "type": "file" }, { - "bom-ref": "0350b2989054014c", + "bom-ref": "3a49bea22b8345d0", "name": "/usr/lib/python3/dist-packages/setuptools/command/upload.py", "type": "file" }, { - "bom-ref": "d434fcf1e4de0224", + "bom-ref": "3c1e4dd5f4a3ad20", "name": "/usr/lib/python3/dist-packages/setuptools/command/upload_docs.py", "type": "file" }, { - "bom-ref": "ac7aabad4e5afcf2", + "bom-ref": "41ab56c8ecfd0786", "name": "/usr/lib/python3/dist-packages/setuptools/config/__init__.py", "type": "file" }, { - "bom-ref": "a7d8c9ae50e46515", + "bom-ref": "0ea2085201f08061", "name": "/usr/lib/python3/dist-packages/setuptools/config/_apply_pyprojecttoml.py", "type": "file" }, { - "bom-ref": "2839f519ba026ad7", + "bom-ref": "2567b17947d592e7", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/__init__.py", "type": "file" }, { - "bom-ref": "94eafc2260ebf7f4", + "bom-ref": "341257d66adae5a8", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/error_reporting.py", "type": "file" }, { - "bom-ref": "b83a707374a63282", + "bom-ref": "77bcc74cd791a84a", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/extra_validations.py", "type": "file" }, { - "bom-ref": "8031ff8bf47fbdf0", + "bom-ref": "c0bfb3d3717fe010", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py", "type": "file" }, { - "bom-ref": "0bc44d1e91029847", + "bom-ref": "8c6677a00e0885b7", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py", "type": "file" }, { - "bom-ref": "385cd75b80392f46", + "bom-ref": "469220b642a50e16", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/formats.py", "type": "file" }, { - "bom-ref": "c0023dba9ec85fff", + "bom-ref": "1c86a20d520596af", "name": "/usr/lib/python3/dist-packages/setuptools/config/expand.py", "type": "file" }, { - "bom-ref": "cc86d231ff7aaaf0", + "bom-ref": "25269dd0d26f20b4", "name": "/usr/lib/python3/dist-packages/setuptools/config/pyprojecttoml.py", "type": "file" }, { - "bom-ref": "10331f19a8f86a3d", + "bom-ref": "d47bb2a5356f152d", "name": "/usr/lib/python3/dist-packages/setuptools/config/setupcfg.py", "type": "file" }, { - "bom-ref": "3859f0f17f4128dd", + "bom-ref": "3a787a1bfdaae9a9", "name": "/usr/lib/python3/dist-packages/setuptools/dep_util.py", "type": "file" }, { - "bom-ref": "bd435c56c4012fd1", + "bom-ref": "d7243344d4c40929", "name": "/usr/lib/python3/dist-packages/setuptools/depends.py", "type": "file" }, { - "bom-ref": "a0f496e176e15d5e", + "bom-ref": "f772dad16205d576", "name": "/usr/lib/python3/dist-packages/setuptools/discovery.py", "type": "file" }, { - "bom-ref": "92b49a2fa80f36df", + "bom-ref": "24635f9b2c203e9f", "name": "/usr/lib/python3/dist-packages/setuptools/dist.py", "type": "file" }, { - "bom-ref": "0e5299af26120c4c", + "bom-ref": "0779685ab1293e74", "name": "/usr/lib/python3/dist-packages/setuptools/errors.py", "type": "file" }, { - "bom-ref": "42a5652a49ef29ff", + "bom-ref": "bb23732ed16afe73", "name": "/usr/lib/python3/dist-packages/setuptools/extension.py", "type": "file" }, { - "bom-ref": "79efe4e2ca3cc732", + "bom-ref": "ce714564efa5f8aa", "name": "/usr/lib/python3/dist-packages/setuptools/extern/__init__.py", "type": "file" }, { - "bom-ref": "8c2939fabec15ebd", + "bom-ref": "3fbcf654fb63f105", "name": "/usr/lib/python3/dist-packages/setuptools/glob.py", "type": "file" }, { - "bom-ref": "f9b4e13a43857920", + "bom-ref": "3413e6425373bb2c", "name": "/usr/lib/python3/dist-packages/setuptools/installer.py", "type": "file" }, { - "bom-ref": "5b685d8640f03c09", + "bom-ref": "e60099c0bd997151", "name": "/usr/lib/python3/dist-packages/setuptools/launch.py", "type": "file" }, { - "bom-ref": "e478302a79cc0b2e", + "bom-ref": "26d070cd1c82ac26", "name": "/usr/lib/python3/dist-packages/setuptools/logging.py", "type": "file" }, { - "bom-ref": "81c9a17f0c72c472", + "bom-ref": "2dee64b22ca4440a", "name": "/usr/lib/python3/dist-packages/setuptools/monkey.py", "type": "file" }, { - "bom-ref": "a382fb7106237714", + "bom-ref": "2e9972fcc275a4f4", "name": "/usr/lib/python3/dist-packages/setuptools/msvc.py", "type": "file" }, { - "bom-ref": "1719f977992056e0", + "bom-ref": "f2b25ffebcf26008", "name": "/usr/lib/python3/dist-packages/setuptools/namespaces.py", "type": "file" }, { - "bom-ref": "796c19a01f5752c9", + "bom-ref": "27b974acfa1792b9", "name": "/usr/lib/python3/dist-packages/setuptools/package_index.py", "type": "file" }, { - "bom-ref": "08407eaea510a569", + "bom-ref": "cd53bef1a80947c5", "name": "/usr/lib/python3/dist-packages/setuptools/py312compat.py", "type": "file" }, { - "bom-ref": "f7df0c871e01bbb3", + "bom-ref": "531532cf7cc1cda7", "name": "/usr/lib/python3/dist-packages/setuptools/sandbox.py", "type": "file" }, { - "bom-ref": "0fdc6a53283ab8a8", + "bom-ref": "e96e1043b11f56d8", "name": "/usr/lib/python3/dist-packages/setuptools/script (dev).tmpl", "type": "file" }, { - "bom-ref": "e114f3394880857e", + "bom-ref": "5e74e7b11154fad6", "name": "/usr/lib/python3/dist-packages/setuptools/script.tmpl", "type": "file" }, { - "bom-ref": "cb84e6f6307c4b56", + "bom-ref": "7fe404e578652782", "name": "/usr/lib/python3/dist-packages/setuptools/unicode_utils.py", "type": "file" }, { - "bom-ref": "ef7405cd77fc3d1d", + "bom-ref": "59cc73fcf41695f1", "name": "/usr/lib/python3/dist-packages/setuptools/version.py", "type": "file" }, { - "bom-ref": "85a1fcf4d78f397f", + "bom-ref": "c909f467b590062f", "name": "/usr/lib/python3/dist-packages/setuptools/warnings.py", "type": "file" }, { - "bom-ref": "650ba9e5df0101a6", + "bom-ref": "a8312d114228807a", "name": "/usr/lib/python3/dist-packages/setuptools/wheel.py", "type": "file" }, { - "bom-ref": "f199b998214afdc7", + "bom-ref": "b981336af8691e73", "name": "/usr/lib/python3/dist-packages/setuptools/windows_support.py", "type": "file" }, { - "bom-ref": "d1a789958777f38e", + "bom-ref": "beec03e04effe252", + "name": "/usr/lib/python3/dist-packages/six-1.16.0.egg-info/PKG-INFO", + "type": "file" + }, + { + "bom-ref": "61827c1ef8ab0154", + "name": "/usr/lib/python3/dist-packages/six-1.16.0.egg-info/dependency_links.txt", + "type": "file" + }, + { + "bom-ref": "da2d778453aefcef", + "name": "/usr/lib/python3/dist-packages/six-1.16.0.egg-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "07652328dfd68f85", + "name": "/usr/lib/python3/dist-packages/six.py", + "type": "file" + }, + { + "bom-ref": "f59ebffeff5b82ed", + "name": "/usr/lib/python3/dist-packages/softwareproperties/AptAuth.py", + "type": "file" + }, + { + "bom-ref": "b3d2ac4e1f6e880c", + "name": "/usr/lib/python3/dist-packages/softwareproperties/CountryInformation.py", + "type": "file" + }, + { + "bom-ref": "1704e5c6556f334f", + "name": "/usr/lib/python3/dist-packages/softwareproperties/MirrorTest.py", + "type": "file" + }, + { + "bom-ref": "67b520f856f67e8c", + "name": "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", + "type": "file" + }, + { + "bom-ref": "32283f843a10b1d5", + "name": "/usr/lib/python3/dist-packages/softwareproperties/__init__.py", + "type": "file" + }, + { + "bom-ref": "ad2f67e0b0d21547", + "name": "/usr/lib/python3/dist-packages/softwareproperties/cloudarchive.py", + "type": "file" + }, + { + "bom-ref": "bdef995960748ce3", + "name": "/usr/lib/python3/dist-packages/softwareproperties/dbus/SoftwarePropertiesDBus.py", + "type": "file" + }, + { + "bom-ref": "45c2b379c0696029", + "name": "/usr/lib/python3/dist-packages/softwareproperties/dbus/__init__.py", + "type": "file" + }, + { + "bom-ref": "28061eba1d8a66c8", + "name": "/usr/lib/python3/dist-packages/softwareproperties/distro.py", + "type": "file" + }, + { + "bom-ref": "2329b6f8eaa7b002", + "name": "/usr/lib/python3/dist-packages/softwareproperties/ppa.py", + "type": "file" + }, + { + "bom-ref": "c4d996606b531cf7", + "name": "/usr/lib/python3/dist-packages/softwareproperties/shortcuthandler.py", + "type": "file" + }, + { + "bom-ref": "0a969b71e5dae9d3", + "name": "/usr/lib/python3/dist-packages/softwareproperties/shortcuts.py", + "type": "file" + }, + { + "bom-ref": "7ff20be0b8f45a76", + "name": "/usr/lib/python3/dist-packages/softwareproperties/sourceslist.py", + "type": "file" + }, + { + "bom-ref": "bdf961e823437d3b", + "name": "/usr/lib/python3/dist-packages/softwareproperties/sourceutils.py", + "type": "file" + }, + { + "bom-ref": "a4df5d4f19bff063", + "name": "/usr/lib/python3/dist-packages/softwareproperties/uri.py", + "type": "file" + }, + { + "bom-ref": "7b5e59eac0cd3865", + "name": "/usr/lib/python3/dist-packages/wadllib-1.3.6.egg-info/PKG-INFO", + "type": "file" + }, + { + "bom-ref": "d19002a6f9b05187", + "name": "/usr/lib/python3/dist-packages/wadllib-1.3.6.egg-info/dependency_links.txt", + "type": "file" + }, + { + "bom-ref": "cc56c1dea7a42acd", + "name": "/usr/lib/python3/dist-packages/wadllib-1.3.6.egg-info/not-zip-safe", + "type": "file" + }, + { + "bom-ref": "cd15b17530f3882c", + "name": "/usr/lib/python3/dist-packages/wadllib-1.3.6.egg-info/requires.txt", + "type": "file" + }, + { + "bom-ref": "a6689d94a88ae4be", + "name": "/usr/lib/python3/dist-packages/wadllib-1.3.6.egg-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "daa83b7915d56006", + "name": "/usr/lib/python3/dist-packages/wadllib/__init__.py", + "type": "file" + }, + { + "bom-ref": "e27efcbfc29ac825", + "name": "/usr/lib/python3/dist-packages/wadllib/application.py", + "type": "file" + }, + { + "bom-ref": "41c2713c8ccc28e1", + "name": "/usr/lib/python3/dist-packages/wadllib/iso_strptime.py", + "type": "file" + }, + { + "bom-ref": "32edd5f74d704336", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/__init__.py", + "type": "file" + }, + { + "bom-ref": "4fa8902ec9024e54", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/data/__init__.py", + "type": "file" + }, + { + "bom-ref": "f258a10755fd515d", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/data/data-types-wadl.xml", + "type": "file" + }, + { + "bom-ref": "6c24df874c9997a6", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/data/launchpad-wadl.xml", + "type": "file" + }, + { + "bom-ref": "0507579b73f93db7", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/data/links-wadl.xml", + "type": "file" + }, + { + "bom-ref": "0bfe55d6c6688c86", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/data/multipart-binary-wadl.xml", + "type": "file" + }, + { + "bom-ref": "0fb264c553258a21", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/data/options-wadl.xml", + "type": "file" + }, + { + "bom-ref": "046659f9bf734122", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/data/person-limi.json", + "type": "file" + }, + { + "bom-ref": "69f5406a48b4f495", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/data/personset-page2.json", + "type": "file" + }, + { + "bom-ref": "22a2dc25bfb66768", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/data/personset.json", + "type": "file" + }, + { + "bom-ref": "3b4ff2498b75c125", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/data/root.json", + "type": "file" + }, + { + "bom-ref": "53df4693d7246a39", + "name": "/usr/lib/python3/dist-packages/wadllib/tests/test_docs.py", + "type": "file" + }, + { + "bom-ref": "85611abd03a1e602", "name": "/usr/lib/python3/dist-packages/wheel-0.42.0.dist-info/INSTALLER", "type": "file" }, { - "bom-ref": "5bacb20a2d6d3c1e", + "bom-ref": "2f2b1ed551923f16", "name": "/usr/lib/python3/dist-packages/wheel-0.42.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2320f2af14f5f538", + "bom-ref": "238a5f93575f7688", "name": "/usr/lib/python3/dist-packages/wheel-0.42.0.dist-info/WHEEL", "type": "file" }, { - "bom-ref": "3d21ce44cae5dac2", + "bom-ref": "b359dd0b0c1dcb0e", "name": "/usr/lib/python3/dist-packages/wheel-0.42.0.dist-info/entry_points.txt", "type": "file" }, { - "bom-ref": "1498dcc045b5bdd5", + "bom-ref": "956a0d98008839b1", "name": "/usr/lib/python3/dist-packages/wheel/__init__.py", "type": "file" }, { - "bom-ref": "88b9d19ef34946ae", + "bom-ref": "245ef034206cdcf6", "name": "/usr/lib/python3/dist-packages/wheel/__main__.py", "type": "file" }, { - "bom-ref": "f379371c6df1a44c", + "bom-ref": "0c370394d04835c8", "name": "/usr/lib/python3/dist-packages/wheel/_setuptools_logging.py", "type": "file" }, { - "bom-ref": "98e2370ba26d2ef5", + "bom-ref": "6eb6c76c92244765", "name": "/usr/lib/python3/dist-packages/wheel/bdist_wheel.py", "type": "file" }, { - "bom-ref": "d1b919c9ded603cd", + "bom-ref": "886fe30b82b343d1", "name": "/usr/lib/python3/dist-packages/wheel/cli/__init__.py", "type": "file" }, { - "bom-ref": "5da99e69999869cf", + "bom-ref": "9703ea52bd884b9f", "name": "/usr/lib/python3/dist-packages/wheel/cli/convert.py", "type": "file" }, { - "bom-ref": "975a70e7cb098c28", + "bom-ref": "3f5951678c18b294", "name": "/usr/lib/python3/dist-packages/wheel/cli/pack.py", "type": "file" }, { - "bom-ref": "3e7947fe9ba553cc", + "bom-ref": "433b5330c70ddc3c", "name": "/usr/lib/python3/dist-packages/wheel/cli/tags.py", "type": "file" }, { - "bom-ref": "81ba5642b93c05a1", + "bom-ref": "d7cf08617e0fed21", "name": "/usr/lib/python3/dist-packages/wheel/cli/unpack.py", "type": "file" }, { - "bom-ref": "933b9a629e7f11a5", + "bom-ref": "dcc09504e766b791", "name": "/usr/lib/python3/dist-packages/wheel/macosx_libfile.py", "type": "file" }, { - "bom-ref": "bd246191e980fb57", + "bom-ref": "c2b7a83bac139aeb", "name": "/usr/lib/python3/dist-packages/wheel/metadata.py", "type": "file" }, { - "bom-ref": "c8112e15697edf96", + "bom-ref": "0c6b14a6ce141ece", "name": "/usr/lib/python3/dist-packages/wheel/util.py", "type": "file" }, { - "bom-ref": "0694d0bbe3ae4fa6", + "bom-ref": "3604533ef7e76f86", "name": "/usr/lib/python3/dist-packages/wheel/vendored/__init__.py", "type": "file" }, { - "bom-ref": "6748b442088cccc0", + "bom-ref": "1edaf222af362570", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/__init__.py", "type": "file" }, { - "bom-ref": "e86b37e1c063f76c", + "bom-ref": "a61bc03b9a990804", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_elffile.py", "type": "file" }, { - "bom-ref": "ede01cab7a58ba4c", + "bom-ref": "b50a04b21da84030", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_manylinux.py", "type": "file" }, { - "bom-ref": "2bf4e0a72bedf213", + "bom-ref": "3bf581ab861493a3", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_musllinux.py", "type": "file" }, { - "bom-ref": "48a7bd2a69f4fbff", + "bom-ref": "a12b883e3ed37e93", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_parser.py", "type": "file" }, { - "bom-ref": "d281076581b0b425", + "bom-ref": "f6315c5df8407385", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_structures.py", "type": "file" }, { - "bom-ref": "393150c2fe5d06d1", + "bom-ref": "fd9cbfe555e706b5", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_tokenizer.py", "type": "file" }, { - "bom-ref": "2d94e3f678aae598", + "bom-ref": "6eddf0db5dcdebc4", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/markers.py", "type": "file" }, { - "bom-ref": "5403acf43b3b6f44", + "bom-ref": "548a5ec16df96df0", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/requirements.py", "type": "file" }, { - "bom-ref": "927c0144cc9bbd6d", + "bom-ref": "72154596d3592035", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/specifiers.py", "type": "file" }, { - "bom-ref": "60cf9177223b0f35", + "bom-ref": "315decff3cb48301", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/tags.py", "type": "file" }, { - "bom-ref": "d3c18c05d49999dc", + "bom-ref": "a03b8cf047761e14", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/utils.py", "type": "file" }, { - "bom-ref": "fa2b8272ed5ea9be", + "bom-ref": "03113592ce8d8e22", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/version.py", "type": "file" }, { - "bom-ref": "59ce0203b1aaf776", + "bom-ref": "6fd4090d51c50da6", "name": "/usr/lib/python3/dist-packages/wheel/vendored/vendor.txt", "type": "file" }, { - "bom-ref": "2796869133c55a81", + "bom-ref": "b2210e98491daca5", "name": "/usr/lib/python3/dist-packages/wheel/wheelfile.py", "type": "file" }, { - "bom-ref": "4a2a69dea5573c50", + "bom-ref": "df05fdae0e3a53f1", + "name": "/usr/lib/software-properties/software-properties-dbus", + "type": "file" + }, + { + "bom-ref": "edb75d7056a76dd4", "name": "/usr/lib/ssl/misc/CA.pl", "type": "file" }, { - "bom-ref": "820873190279875e", + "bom-ref": "7849edec46703fbe", "name": "/usr/lib/ssl/misc/tsget.pl", "type": "file" }, { - "bom-ref": "30eb7fefe154ca62", + "bom-ref": "d7c32396dcf9d498", "name": "/usr/lib/sysctl.d/50-pid-max.conf", "type": "file" }, { - "bom-ref": "132021bd1a363a34", + "bom-ref": "7bbc0b0ee1f18ba6", "name": "/usr/lib/sysctl.d/99-protect-links.conf", "type": "file" }, { - "bom-ref": "b4cf601d874b9619", + "bom-ref": "8be021fa82b7b50f", "name": "/usr/lib/systemd/catalog/systemd.be.catalog", "type": "file" }, { - "bom-ref": "62f5c23151714417", + "bom-ref": "f637c83a396a6bcd", "name": "/usr/lib/systemd/catalog/systemd.be@latin.catalog", "type": "file" }, { - "bom-ref": "61a9c4ac1cd6f902", + "bom-ref": "aebc371e4f270440", "name": "/usr/lib/systemd/catalog/systemd.bg.catalog", "type": "file" }, { - "bom-ref": "9322d01caf63851e", + "bom-ref": "40686098e76fa824", "name": "/usr/lib/systemd/catalog/systemd.catalog", "type": "file" }, { - "bom-ref": "46e14ab2e4f4c503", + "bom-ref": "b49041ec17dd94d5", "name": "/usr/lib/systemd/catalog/systemd.da.catalog", "type": "file" }, { - "bom-ref": "1c73dc7c1103483d", + "bom-ref": "eba94e6f66ed3cd7", "name": "/usr/lib/systemd/catalog/systemd.de.catalog", "type": "file" }, { - "bom-ref": "7bbe0d626d8935fb", + "bom-ref": "cec7387722354d19", "name": "/usr/lib/systemd/catalog/systemd.fr.catalog", "type": "file" }, { - "bom-ref": "19656081fe3b431b", + "bom-ref": "177366971c7b5125", "name": "/usr/lib/systemd/catalog/systemd.hr.catalog", "type": "file" }, { - "bom-ref": "779cffbffb2be5c2", + "bom-ref": "c8fab51fbb4baf8c", "name": "/usr/lib/systemd/catalog/systemd.hu.catalog", "type": "file" }, { - "bom-ref": "acb0e1410f7add5e", + "bom-ref": "a008fd84e87cd7b0", "name": "/usr/lib/systemd/catalog/systemd.it.catalog", "type": "file" }, { - "bom-ref": "e9b7eca5f37a01cd", + "bom-ref": "50b38b6a068162b7", "name": "/usr/lib/systemd/catalog/systemd.ko.catalog", "type": "file" }, { - "bom-ref": "1fdcf631b168f77d", + "bom-ref": "e0894785bf5d5fdf", "name": "/usr/lib/systemd/catalog/systemd.pl.catalog", "type": "file" }, { - "bom-ref": "1a362ab66f532bc0", + "bom-ref": "aff099e5f9b3e3d2", "name": "/usr/lib/systemd/catalog/systemd.pt_BR.catalog", "type": "file" }, { - "bom-ref": "0430a89f71b51456", + "bom-ref": "647bbddeef78dd60", "name": "/usr/lib/systemd/catalog/systemd.ru.catalog", "type": "file" }, { - "bom-ref": "4a997c79bd7f6b1c", + "bom-ref": "f9c07b009ad46c46", "name": "/usr/lib/systemd/catalog/systemd.sr.catalog", "type": "file" }, { - "bom-ref": "bafea3f5256e6fb0", + "bom-ref": "577d70860340ec8a", "name": "/usr/lib/systemd/catalog/systemd.zh_CN.catalog", "type": "file" }, { - "bom-ref": "0b2a401e2c493c0d", + "bom-ref": "41ce399390b00faf", "name": "/usr/lib/systemd/catalog/systemd.zh_TW.catalog", "type": "file" }, { - "bom-ref": "9725a3e7c0ab1581", + "bom-ref": "acbf9fa27d8ef427", "name": "/usr/lib/systemd/journald.conf.d/syslog.conf", "type": "file" }, { - "bom-ref": "dcb7ce697f153aa1", + "bom-ref": "d25b6a87753dd31d", "name": "/usr/lib/systemd/network/73-usb-net-by-mac.link", "type": "file" }, { - "bom-ref": "b8bbd79003c81c21", + "bom-ref": "1081ba02296921e7", "name": "/usr/lib/systemd/network/80-6rd-tunnel.network", "type": "file" }, { - "bom-ref": "21463cb415a46c38", + "bom-ref": "511686c832e6e3b6", "name": "/usr/lib/systemd/network/80-auto-link-local.network.example", "type": "file" }, { - "bom-ref": "e19dae8954c944d4", + "bom-ref": "7ae3d492219685fa", "name": "/usr/lib/systemd/network/80-container-host0.network", "type": "file" }, { - "bom-ref": "39de52ab3f103a43", + "bom-ref": "1e871cc80ecb3691", "name": "/usr/lib/systemd/network/80-container-vb.network", "type": "file" }, { - "bom-ref": "0c85ef8b65953a6b", + "bom-ref": "bd47e37e85dee031", "name": "/usr/lib/systemd/network/80-container-ve.network", "type": "file" }, { - "bom-ref": "b617e3b68a32a565", + "bom-ref": "e3899b2801153037", "name": "/usr/lib/systemd/network/80-container-vz.network", "type": "file" }, { - "bom-ref": "60d461ec6014df2a", + "bom-ref": "f64aeeda40e0bf6c", "name": "/usr/lib/systemd/network/80-vm-vt.network", "type": "file" }, { - "bom-ref": "c80481e5454959da", + "bom-ref": "ec5a824d9d33039c", "name": "/usr/lib/systemd/network/80-wifi-adhoc.network", "type": "file" }, { - "bom-ref": "46b430121659dd8d", + "bom-ref": "dc70e71277930dcb", "name": "/usr/lib/systemd/network/80-wifi-ap.network.example", "type": "file" }, { - "bom-ref": "f2f620007d23e74f", + "bom-ref": "07732867502143f5", "name": "/usr/lib/systemd/network/80-wifi-station.network.example", "type": "file" }, { - "bom-ref": "5f5340974bfbe0c3", + "bom-ref": "a8513ddcb7b75a2d", "name": "/usr/lib/systemd/network/89-ethernet.network.example", "type": "file" }, { - "bom-ref": "d49b9c80449c3428", + "bom-ref": "b879ba934e277ba0", "name": "/usr/lib/systemd/network/99-default.link", "type": "file" }, { - "bom-ref": "360f198691007e7a", + "bom-ref": "e6601610d23cfc84", "name": "/usr/lib/systemd/repart/definitions/confext.repart.d/10-root.conf", "type": "file" }, { - "bom-ref": "c0b81dd19cac4845", + "bom-ref": "e192e999e9073397", "name": "/usr/lib/systemd/repart/definitions/confext.repart.d/20-root-verity.conf", "type": "file" }, { - "bom-ref": "24e001a1e3773806", + "bom-ref": "9316d1c5d500882c", "name": "/usr/lib/systemd/repart/definitions/confext.repart.d/30-root-verity-sig.conf", "type": "file" }, { - "bom-ref": "e5023409007cb1b2", + "bom-ref": "460e252ad8b06b54", "name": "/usr/lib/systemd/repart/definitions/portable.repart.d/10-root.conf", "type": "file" }, { - "bom-ref": "76be8dba18b56971", + "bom-ref": "92ea3c0a06fc1803", "name": "/usr/lib/systemd/repart/definitions/portable.repart.d/20-root-verity.conf", "type": "file" }, { - "bom-ref": "02dec04d9ae2c6b9", + "bom-ref": "f3529010fbd267c3", "name": "/usr/lib/systemd/repart/definitions/portable.repart.d/30-root-verity-sig.conf", "type": "file" }, { - "bom-ref": "f04de1dc07ad229a", + "bom-ref": "bed7da1fa756fc78", "name": "/usr/lib/systemd/repart/definitions/sysext.repart.d/10-root.conf", "type": "file" }, { - "bom-ref": "558f439b94a0d91e", + "bom-ref": "959476bf24dc70d0", "name": "/usr/lib/systemd/repart/definitions/sysext.repart.d/20-root-verity.conf", "type": "file" }, { - "bom-ref": "c1aa93df0160103c", + "bom-ref": "739b17c7509c5dea", "name": "/usr/lib/systemd/repart/definitions/sysext.repart.d/30-root-verity-sig.conf", "type": "file" }, { - "bom-ref": "039b44adf67e9e9d", + "bom-ref": "b0b1e69ea25f1f53", "name": "/usr/lib/systemd/resolv.conf", "type": "file" }, { - "bom-ref": "775768217a33f602", + "bom-ref": "494d7066f13da538", "name": "/usr/lib/systemd/system-generators/systemd-cryptsetup-generator", "type": "file" }, { - "bom-ref": "fdd1a4e3865d539f", + "bom-ref": "a6c211752a04ffad", "name": "/usr/lib/systemd/system-generators/systemd-debug-generator", "type": "file" }, { - "bom-ref": "9872be9330302ec7", + "bom-ref": "88bbfce2e0279c71", "name": "/usr/lib/systemd/system-generators/systemd-fstab-generator", "type": "file" }, { - "bom-ref": "840cebd0490f85eb", + "bom-ref": "8775abf9a58a7e71", "name": "/usr/lib/systemd/system-generators/systemd-getty-generator", "type": "file" }, { - "bom-ref": "fe9be5fe0d6c4ffb", + "bom-ref": "8952ec84a546d109", "name": "/usr/lib/systemd/system-generators/systemd-gpt-auto-generator", "type": "file" }, { - "bom-ref": "c6aa043fe4dbfc03", + "bom-ref": "5b4d538f6bcaf481", "name": "/usr/lib/systemd/system-generators/systemd-hibernate-resume-generator", "type": "file" }, { - "bom-ref": "7df959f1bb7b88eb", + "bom-ref": "e66e80ab8de2c8e9", "name": "/usr/lib/systemd/system-generators/systemd-integritysetup-generator", "type": "file" }, { - "bom-ref": "abad27d20783691f", + "bom-ref": "e7bbae85e7f4e825", "name": "/usr/lib/systemd/system-generators/systemd-rc-local-generator", "type": "file" }, { - "bom-ref": "9eeaa54ebb2345da", + "bom-ref": "aed343af45d28d94", "name": "/usr/lib/systemd/system-generators/systemd-run-generator", "type": "file" }, { - "bom-ref": "db36c58605057ebd", + "bom-ref": "37c3d276ffeec7ab", "name": "/usr/lib/systemd/system-generators/systemd-system-update-generator", "type": "file" }, { - "bom-ref": "5c40abf85bd61e89", + "bom-ref": "ed712cf2b269166f", "name": "/usr/lib/systemd/system-generators/systemd-sysv-generator", "type": "file" }, { - "bom-ref": "fa32266de0a30e57", + "bom-ref": "ceba7588d6af1855", "name": "/usr/lib/systemd/system-generators/systemd-veritysetup-generator", "type": "file" }, { - "bom-ref": "3cc39d54faa8397a", + "bom-ref": "f7d8185d72998f78", "name": "/usr/lib/systemd/system-preset/90-systemd.preset", "type": "file" }, { - "bom-ref": "8bf3f53cff19ed43", + "bom-ref": "1dbee8121452ba79", "name": "/usr/lib/systemd/system/apt-daily-upgrade.service", "type": "file" }, { - "bom-ref": "87144a7c94c9d4e8", + "bom-ref": "75050d42ca6ace7a", "name": "/usr/lib/systemd/system/apt-daily-upgrade.timer", "type": "file" }, { - "bom-ref": "e4beec87502745e8", + "bom-ref": "c2f6bc3d63650a0a", "name": "/usr/lib/systemd/system/apt-daily.service", "type": "file" }, { - "bom-ref": "e6e476f629d4825d", + "bom-ref": "a478334421b9c85f", "name": "/usr/lib/systemd/system/apt-daily.timer", "type": "file" }, { - "bom-ref": "92c046cd06e83dcb", + "bom-ref": "3dc7ea921e6ebf9d", "name": "/usr/lib/systemd/system/basic.target", "type": "file" }, { - "bom-ref": "2647b696515c6927", + "bom-ref": "d6323324ae90f901", "name": "/usr/lib/systemd/system/blockdev@.target", "type": "file" }, { - "bom-ref": "b1c31ba71eae6860", + "bom-ref": "56863566e2d4c612", "name": "/usr/lib/systemd/system/bluetooth.target", "type": "file" }, { - "bom-ref": "8cb58361b5362fb2", + "bom-ref": "9fbb32fa56013628", "name": "/usr/lib/systemd/system/boot-complete.target", "type": "file" }, { - "bom-ref": "2ed76b8b97e2d9a6", + "bom-ref": "75481a54afca1e20", "name": "/usr/lib/systemd/system/console-getty.service", "type": "file" }, { - "bom-ref": "92f83254b7ea20cf", + "bom-ref": "ca867f07e29b41dd", "name": "/usr/lib/systemd/system/container-getty@.service", "type": "file" }, { - "bom-ref": "f8f11046036a413f", + "bom-ref": "0e3fbceb00e3ea81", "name": "/usr/lib/systemd/system/cryptsetup-pre.target", "type": "file" }, { - "bom-ref": "5e01991fc4edefa0", + "bom-ref": "bccfe44eac36e6ae", "name": "/usr/lib/systemd/system/cryptsetup.target", "type": "file" }, { - "bom-ref": "0866fda6f5570594", + "bom-ref": "ceca33dedcec84c0", + "name": "/usr/lib/systemd/system/dbus.service", + "type": "file" + }, + { + "bom-ref": "84a07bef461db0e0", + "name": "/usr/lib/systemd/system/dbus.socket", + "type": "file" + }, + { + "bom-ref": "565d40d0769791ca", "name": "/usr/lib/systemd/system/debug-shell.service", "type": "file" }, { - "bom-ref": "e92af91d49490b46", + "bom-ref": "f537a1ff00eeff34", "name": "/usr/lib/systemd/system/dev-hugepages.mount", "type": "file" }, { - "bom-ref": "09b0c0e34a2ad0c5", + "bom-ref": "0c006a36ffb4372b", "name": "/usr/lib/systemd/system/dev-mqueue.mount", "type": "file" }, { - "bom-ref": "6ac691d5deeabbc1", + "bom-ref": "646805aa13dafc73", "name": "/usr/lib/systemd/system/dpkg-db-backup.service", "type": "file" }, { - "bom-ref": "37631e3c6d5ff4e8", + "bom-ref": "b108f63cd84a8092", "name": "/usr/lib/systemd/system/dpkg-db-backup.timer", "type": "file" }, { - "bom-ref": "f75b12400ad8efc9", + "bom-ref": "eb2a1ed180b85593", "name": "/usr/lib/systemd/system/e2scrub@.service", "type": "file" }, { - "bom-ref": "ac437e4cff46762c", + "bom-ref": "3214696d8e364f4a", "name": "/usr/lib/systemd/system/e2scrub_all.service", "type": "file" }, { - "bom-ref": "867597ac73703de1", + "bom-ref": "2696ec544054db27", "name": "/usr/lib/systemd/system/e2scrub_all.timer", "type": "file" }, { - "bom-ref": "a5dcbb7462d0ea18", + "bom-ref": "46c46be52a301bd6", "name": "/usr/lib/systemd/system/e2scrub_fail@.service", "type": "file" }, { - "bom-ref": "b6ab32cb6beaa6bd", + "bom-ref": "b75dff3018c8162b", "name": "/usr/lib/systemd/system/e2scrub_reap.service", "type": "file" }, { - "bom-ref": "43c73a906c9f1cb0", + "bom-ref": "32fb858238c6ae06", "name": "/usr/lib/systemd/system/emergency.service", "type": "file" }, { - "bom-ref": "ed594298e0178a5f", + "bom-ref": "fa5ed267622d5ec1", "name": "/usr/lib/systemd/system/emergency.target", "type": "file" }, { - "bom-ref": "9ed7ebe6f7eda487", + "bom-ref": "54ff416ad743b905", "name": "/usr/lib/systemd/system/exit.target", "type": "file" }, { - "bom-ref": "38e0e75e9a477769", + "bom-ref": "8117c47b5d8fde5f", "name": "/usr/lib/systemd/system/factory-reset.target", "type": "file" }, { - "bom-ref": "88a899e1ec0f066d", + "bom-ref": "08bba6b99cc79763", "name": "/usr/lib/systemd/system/final.target", "type": "file" }, { - "bom-ref": "7ecb56d72c95f24a", + "bom-ref": "5ce9ed3841e5c918", "name": "/usr/lib/systemd/system/first-boot-complete.target", "type": "file" }, { - "bom-ref": "b62ec733ff5605cc", + "bom-ref": "9d325e37456314b8", "name": "/usr/lib/systemd/system/fstrim.service", "type": "file" }, { - "bom-ref": "f0cfa2ccaa87835a", + "bom-ref": "efea76fde5e4d33a", "name": "/usr/lib/systemd/system/fstrim.timer", "type": "file" }, { - "bom-ref": "5577f10a3fbeb973", + "bom-ref": "485ef7a099311535", "name": "/usr/lib/systemd/system/getty-pre.target", "type": "file" }, { - "bom-ref": "5c48e9b116eba9f8", + "bom-ref": "bb9af4f51fa404a2", "name": "/usr/lib/systemd/system/getty-static.service", "type": "file" }, { - "bom-ref": "5f4c242bc5414df9", + "bom-ref": "9d059c405bc009bf", "name": "/usr/lib/systemd/system/getty.target", "type": "file" }, { - "bom-ref": "125d1c9406908f53", + "bom-ref": "48a051b3203ad0b9", "name": "/usr/lib/systemd/system/getty@.service", "type": "file" }, { - "bom-ref": "36b4c03de68f9fd7", + "bom-ref": "6ac3a1e1c8ff5671", "name": "/usr/lib/systemd/system/graphical.target", "type": "file" }, { - "bom-ref": "feb1775b2e4f918c", + "bom-ref": "4d2308f4b8343046", "name": "/usr/lib/systemd/system/halt.target", "type": "file" }, { - "bom-ref": "acdef55f8bdbcc75", + "bom-ref": "37e7eb793f57240b", "name": "/usr/lib/systemd/system/hibernate.target", "type": "file" }, { - "bom-ref": "6cbe79f81ff3ee7b", + "bom-ref": "ba5c47fb276f592d", "name": "/usr/lib/systemd/system/hybrid-sleep.target", "type": "file" }, { - "bom-ref": "1afa4f6c3e9b2918", + "bom-ref": "c35690880a48303a", "name": "/usr/lib/systemd/system/initrd-cleanup.service", "type": "file" }, { - "bom-ref": "00578bf6ffe9d18c", + "bom-ref": "77ade9411bbbadf2", "name": "/usr/lib/systemd/system/initrd-fs.target", "type": "file" }, { - "bom-ref": "2b0610673a21b452", + "bom-ref": "849066cd00562cd8", "name": "/usr/lib/systemd/system/initrd-parse-etc.service", "type": "file" }, { - "bom-ref": "62dc0eeb4e9a2383", + "bom-ref": "214e17d2e81af891", "name": "/usr/lib/systemd/system/initrd-root-device.target", "type": "file" }, { - "bom-ref": "4ca58324819182cb", + "bom-ref": "f6234fc4803d43b5", "name": "/usr/lib/systemd/system/initrd-root-fs.target", "type": "file" }, { - "bom-ref": "0d05a245c3e249d8", + "bom-ref": "105ca2665c49350e", "name": "/usr/lib/systemd/system/initrd-switch-root.service", "type": "file" }, { - "bom-ref": "27d5160b903cd7ec", + "bom-ref": "8ed0f503d85e0572", "name": "/usr/lib/systemd/system/initrd-switch-root.target", "type": "file" }, { - "bom-ref": "9d73f2ad5125443f", + "bom-ref": "f762eb38e1f65fd5", "name": "/usr/lib/systemd/system/initrd-udevadm-cleanup-db.service", "type": "file" }, { - "bom-ref": "74485a032559cc6e", + "bom-ref": "398c21040522da40", "name": "/usr/lib/systemd/system/initrd-usr-fs.target", "type": "file" }, { - "bom-ref": "71d4f9e8c81373d3", + "bom-ref": "f4893be995c74e89", "name": "/usr/lib/systemd/system/initrd.target", "type": "file" }, { - "bom-ref": "637e16838ee481ee", + "bom-ref": "01823b53a3385114", "name": "/usr/lib/systemd/system/integritysetup-pre.target", "type": "file" }, { - "bom-ref": "ec70b71494416ddf", + "bom-ref": "d3041e02c5083d85", "name": "/usr/lib/systemd/system/integritysetup.target", "type": "file" }, { - "bom-ref": "7aa4723530627254", + "bom-ref": "0c40f1468f94cf1c", "name": "/usr/lib/systemd/system/iwpmd.service", "type": "file" }, { - "bom-ref": "44c8d05c1d537518", + "bom-ref": "040643c6156e7226", "name": "/usr/lib/systemd/system/kexec.target", "type": "file" }, { - "bom-ref": "a447f34ba066ac83", + "bom-ref": "73a17eef02badd35", "name": "/usr/lib/systemd/system/kmod-static-nodes.service", "type": "file" }, { - "bom-ref": "99618e28971a49f5", + "bom-ref": "d225ea52fb7520ef", "name": "/usr/lib/systemd/system/ldconfig.service", "type": "file" }, { - "bom-ref": "e7a754b5caca5db8", + "bom-ref": "e7950cfdf3788b92", "name": "/usr/lib/systemd/system/local-fs-pre.target", "type": "file" }, { - "bom-ref": "1cf251026e51a805", + "bom-ref": "895650546131d6fb", "name": "/usr/lib/systemd/system/local-fs.target", "type": "file" }, { - "bom-ref": "9d702298f8e0f373", + "bom-ref": "1a44a7cf7f79528d", "name": "/usr/lib/systemd/system/machine.slice", "type": "file" }, { - "bom-ref": "4f3502e9c8551162", + "bom-ref": "c0dd773975e2ed7c", "name": "/usr/lib/systemd/system/modprobe@.service", "type": "file" }, { - "bom-ref": "8894b185761bf714", + "bom-ref": "791f3a953157e98a", "name": "/usr/lib/systemd/system/motd-news.service", "type": "file" }, { - "bom-ref": "6013a0967794e85d", + "bom-ref": "4741682129ff7ca7", "name": "/usr/lib/systemd/system/motd-news.timer", "type": "file" }, { - "bom-ref": "669b9409d20a5270", + "bom-ref": "f299eb28961aa34e", "name": "/usr/lib/systemd/system/multi-user.target", "type": "file" }, { - "bom-ref": "fbd1e33930855377", + "bom-ref": "06b1089f22801865", "name": "/usr/lib/systemd/system/network-online.target", "type": "file" }, { - "bom-ref": "fafade04651c904d", + "bom-ref": "d10a25a18d17c52b", "name": "/usr/lib/systemd/system/network-pre.target", "type": "file" }, { - "bom-ref": "99b1ed4c64b605ef", + "bom-ref": "d0c781296f20a9dd", "name": "/usr/lib/systemd/system/network.target", "type": "file" }, { - "bom-ref": "7fd1eea6b522036f", + "bom-ref": "fe5ebf81ed313995", "name": "/usr/lib/systemd/system/nss-lookup.target", "type": "file" }, { - "bom-ref": "d974e895b21feec1", + "bom-ref": "683261797a3ae8c7", "name": "/usr/lib/systemd/system/nss-user-lookup.target", "type": "file" }, { - "bom-ref": "f75d0ef8305a71c2", + "bom-ref": "cd834836b0ad459a", + "name": "/usr/lib/systemd/system/packagekit-offline-update.service", + "type": "file" + }, + { + "bom-ref": "9b764067640df597", + "name": "/usr/lib/systemd/system/packagekit.service", + "type": "file" + }, + { + "bom-ref": "b6ed94b1255552d8", "name": "/usr/lib/systemd/system/pam_namespace.service", "type": "file" }, { - "bom-ref": "7b05dcf13320bff4", + "bom-ref": "ea327bbf3acb3e4a", "name": "/usr/lib/systemd/system/paths.target", "type": "file" }, { - "bom-ref": "054739eefa4a373b", + "bom-ref": "cd7f43973cb1d929", + "name": "/usr/lib/systemd/system/polkit.service", + "type": "file" + }, + { + "bom-ref": "a99b9ebe2bb359a5", "name": "/usr/lib/systemd/system/poweroff.target", "type": "file" }, { - "bom-ref": "13c62b4ea5855c5d", + "bom-ref": "7cf89588edfbb2ff", "name": "/usr/lib/systemd/system/printer.target", "type": "file" }, { - "bom-ref": "1e931f4122e170c7", + "bom-ref": "daa616e77e158605", "name": "/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount", "type": "file" }, { - "bom-ref": "c9586105aeb714ba", + "bom-ref": "839655dbef655a10", "name": "/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.mount", "type": "file" }, { - "bom-ref": "fa8ed90d33de9302", + "bom-ref": "3c4e0ef6c2419fc8", "name": "/usr/lib/systemd/system/quotaon.service", "type": "file" }, { - "bom-ref": "a3737a91d034f88d", + "bom-ref": "078a09c68af6d76f", "name": "/usr/lib/systemd/system/rc-local.service", "type": "file" }, { - "bom-ref": "f544d4aa5069de87", + "bom-ref": "d4d9aa486606cf91", "name": "/usr/lib/systemd/system/rc-local.service.d/debian.conf", "type": "file" }, { - "bom-ref": "20745324f0a168af", + "bom-ref": "792a9a8c3f468313", "name": "/usr/lib/systemd/system/rdma-hw.target", "type": "file" }, { - "bom-ref": "d36cbf6495e46d53", + "bom-ref": "7c131a242bd963d7", "name": "/usr/lib/systemd/system/rdma-load-modules@.service", "type": "file" }, { - "bom-ref": "51548779a1e52026", + "bom-ref": "23ad06ae82921586", "name": "/usr/lib/systemd/system/rdma-ndd.service", "type": "file" }, { - "bom-ref": "cce34a782779d672", + "bom-ref": "27cc6f0085e38368", "name": "/usr/lib/systemd/system/reboot.target", "type": "file" }, { - "bom-ref": "af6b96a6368c3ca4", + "bom-ref": "981bb81287c7dfe6", "name": "/usr/lib/systemd/system/remote-cryptsetup.target", "type": "file" }, { - "bom-ref": "4f73c25607f90201", + "bom-ref": "4ca78aeba1370f03", "name": "/usr/lib/systemd/system/remote-fs-pre.target", "type": "file" }, { - "bom-ref": "f381a17e594894fb", + "bom-ref": "ef7e8017c7f6916d", "name": "/usr/lib/systemd/system/remote-fs.target", "type": "file" }, { - "bom-ref": "f52f1dcc1264896b", + "bom-ref": "134fdaf50b34274d", "name": "/usr/lib/systemd/system/remote-veritysetup.target", "type": "file" }, { - "bom-ref": "33d18f74ba5fdf8a", + "bom-ref": "0a5280bf5b394a7c", "name": "/usr/lib/systemd/system/rescue.service", "type": "file" }, { - "bom-ref": "7355642136ff21f1", + "bom-ref": "57153a8182a5f71b", "name": "/usr/lib/systemd/system/rescue.target", "type": "file" }, { - "bom-ref": "37395db48f7e1f5d", + "bom-ref": "088af0948212f7c3", "name": "/usr/lib/systemd/system/rpcbind.target", "type": "file" }, { - "bom-ref": "d655421a1decc8ad", + "bom-ref": "fc6b6d456c7f5cc3", "name": "/usr/lib/systemd/system/serial-getty@.service", "type": "file" }, { - "bom-ref": "23e2ca9927aa78e8", + "bom-ref": "079aaf9aea3edbc2", "name": "/usr/lib/systemd/system/shutdown.target", "type": "file" }, { - "bom-ref": "201257fe460de65c", + "bom-ref": "96db21c527eb2396", "name": "/usr/lib/systemd/system/sigpwr.target", "type": "file" }, { - "bom-ref": "8ac442dbf23aaaf3", + "bom-ref": "569c90ecd60e22f9", "name": "/usr/lib/systemd/system/sleep.target", "type": "file" }, { - "bom-ref": "b5e24a3924c5e728", + "bom-ref": "19754cf016fe9e16", "name": "/usr/lib/systemd/system/slices.target", "type": "file" }, { - "bom-ref": "86b26e15d5a42af5", + "bom-ref": "b4c968bc6abfaf07", "name": "/usr/lib/systemd/system/smartcard.target", "type": "file" }, { - "bom-ref": "965830adcd9e4e4b", + "bom-ref": "4fb48d248abb69b5", "name": "/usr/lib/systemd/system/sockets.target", "type": "file" }, { - "bom-ref": "6308bd08005020d3", + "bom-ref": "467c19633a60614d", "name": "/usr/lib/systemd/system/soft-reboot.target", "type": "file" }, { - "bom-ref": "20ad6c741dc95571", + "bom-ref": "57114e61fa18986f", "name": "/usr/lib/systemd/system/sound.target", "type": "file" }, { - "bom-ref": "17f36acc18c7fab3", + "bom-ref": "44085f90c1f407d9", "name": "/usr/lib/systemd/system/storage-target-mode.target", "type": "file" }, { - "bom-ref": "938e9b85122526be", + "bom-ref": "d9d03b8d96991268", "name": "/usr/lib/systemd/system/suspend-then-hibernate.target", "type": "file" }, { - "bom-ref": "636ce52526a75c49", + "bom-ref": "26e90af4963988c3", "name": "/usr/lib/systemd/system/suspend.target", "type": "file" }, { - "bom-ref": "b89a27aa638d32f0", + "bom-ref": "3e67cb54bcaee7d6", "name": "/usr/lib/systemd/system/swap.target", "type": "file" }, { - "bom-ref": "03a23d3ee76ffb40", + "bom-ref": "ed6848996cbe2f1e", "name": "/usr/lib/systemd/system/sys-fs-fuse-connections.mount", "type": "file" }, { - "bom-ref": "5fa0402becea7ff4", + "bom-ref": "d42233074f01d75a", "name": "/usr/lib/systemd/system/sys-kernel-config.mount", "type": "file" }, { - "bom-ref": "e62aeedc13006dee", + "bom-ref": "46f796c31c5dbf2c", "name": "/usr/lib/systemd/system/sys-kernel-debug.mount", "type": "file" }, { - "bom-ref": "a99721373fefbd1e", + "bom-ref": "26b692821af78a54", "name": "/usr/lib/systemd/system/sys-kernel-tracing.mount", "type": "file" }, { - "bom-ref": "254d3af5e72089d9", + "bom-ref": "cc02313ae5a05a7f", "name": "/usr/lib/systemd/system/sysinit.target", "type": "file" }, { - "bom-ref": "540128802677f7ce", + "bom-ref": "cbc58fdfdb964f48", "name": "/usr/lib/systemd/system/syslog.socket", "type": "file" }, { - "bom-ref": "acc157064b22e33b", + "bom-ref": "40f7d3ffe1d4d901", "name": "/usr/lib/systemd/system/system-systemd\\x2dcryptsetup.slice", "type": "file" }, { - "bom-ref": "d9a9d6ab843fa161", + "bom-ref": "f85b9a9a13e6a45b", "name": "/usr/lib/systemd/system/system-systemd\\x2dveritysetup.slice", "type": "file" }, { - "bom-ref": "474859576f3df46a", + "bom-ref": "a5e0d61f563816b8", "name": "/usr/lib/systemd/system/system-update-cleanup.service", "type": "file" }, { - "bom-ref": "38f8e3d7711d8304", + "bom-ref": "3020d0b63043c162", "name": "/usr/lib/systemd/system/system-update-pre.target", "type": "file" }, { - "bom-ref": "d95748dfd6d39558", + "bom-ref": "aa78131cf7ab6cc2", "name": "/usr/lib/systemd/system/system-update.target", "type": "file" }, { - "bom-ref": "2ad468cf57f6760a", + "bom-ref": "fe96ff80a0a09418", "name": "/usr/lib/systemd/system/systemd-ask-password-console.path", "type": "file" }, { - "bom-ref": "ce05cb83d8e64cad", + "bom-ref": "527e83c76c0ff5cb", "name": "/usr/lib/systemd/system/systemd-ask-password-console.service", "type": "file" }, { - "bom-ref": "3a1ba1135355df0d", + "bom-ref": "1a5df914c8efb603", "name": "/usr/lib/systemd/system/systemd-ask-password-wall.path", "type": "file" }, { - "bom-ref": "727534384e08aad9", + "bom-ref": "e64ad4a8a5bc438f", "name": "/usr/lib/systemd/system/systemd-ask-password-wall.service", "type": "file" }, { - "bom-ref": "69e52a312247915f", + "bom-ref": "f5380461470ac9e1", "name": "/usr/lib/systemd/system/systemd-backlight@.service", "type": "file" }, { - "bom-ref": "03dad550b418ab08", + "bom-ref": "4c938bf452ed819e", "name": "/usr/lib/systemd/system/systemd-battery-check.service", "type": "file" }, { - "bom-ref": "c3d8f0d1716801a1", + "bom-ref": "103c2bb7290e1eb7", "name": "/usr/lib/systemd/system/systemd-binfmt.service", "type": "file" }, { - "bom-ref": "335cd6678dc9b34f", + "bom-ref": "ae96480fabea11b1", "name": "/usr/lib/systemd/system/systemd-boot-check-no-failures.service", "type": "file" }, { - "bom-ref": "5a3c59ae0a8cd890", + "bom-ref": "4128e5930a72ef2e", "name": "/usr/lib/systemd/system/systemd-bsod.service", "type": "file" }, { - "bom-ref": "7505d8ffe98121e3", + "bom-ref": "48618563cf686aad", "name": "/usr/lib/systemd/system/systemd-confext.service", "type": "file" }, { - "bom-ref": "415762b120b72da1", + "bom-ref": "4b0864b34c2d02fb", "name": "/usr/lib/systemd/system/systemd-exit.service", "type": "file" }, { - "bom-ref": "47d51874fa99660a", + "bom-ref": "e082b82f037ff67c", "name": "/usr/lib/systemd/system/systemd-firstboot.service", "type": "file" }, { - "bom-ref": "925f70813ad0bc31", + "bom-ref": "85e17427c14bbeb7", "name": "/usr/lib/systemd/system/systemd-fsck-root.service", "type": "file" }, { - "bom-ref": "3eb81c01230d6e47", + "bom-ref": "8d4c1264c6254bb5", "name": "/usr/lib/systemd/system/systemd-fsck@.service", "type": "file" }, { - "bom-ref": "dafa8e195398460e", + "bom-ref": "5ae371e2e65d84d0", "name": "/usr/lib/systemd/system/systemd-fsckd.service", "type": "file" }, { - "bom-ref": "f3a85cd59089d46d", + "bom-ref": "7505e989e1817293", "name": "/usr/lib/systemd/system/systemd-fsckd.socket", "type": "file" }, { - "bom-ref": "6f68fc08bae7c14d", + "bom-ref": "5d6297a7fa540fd3", "name": "/usr/lib/systemd/system/systemd-growfs-root.service", "type": "file" }, { - "bom-ref": "5684b0a4e4792738", + "bom-ref": "82169fa552bb7082", "name": "/usr/lib/systemd/system/systemd-growfs@.service", "type": "file" }, { - "bom-ref": "409911e0ebc1fb12", + "bom-ref": "255bc6145d717710", "name": "/usr/lib/systemd/system/systemd-halt.service", "type": "file" }, { - "bom-ref": "60cab1b6537da0a9", + "bom-ref": "2786cb30b6f8724b", "name": "/usr/lib/systemd/system/systemd-hibernate-resume.service", "type": "file" }, { - "bom-ref": "11e6de745959fc79", + "bom-ref": "33bf38c8e3ba32b3", "name": "/usr/lib/systemd/system/systemd-hibernate.service", "type": "file" }, { - "bom-ref": "42eca04be247f8c4", + "bom-ref": "fa2e18f4ce8f5bd2", "name": "/usr/lib/systemd/system/systemd-hostnamed.service", "type": "file" }, { - "bom-ref": "1e9df6f777d9547c", + "bom-ref": "473a2b270ddcbbd8", "name": "/usr/lib/systemd/system/systemd-hwdb-update.service", "type": "file" }, { - "bom-ref": "9e9d37f41e0effab", + "bom-ref": "fbb740cfe9481139", "name": "/usr/lib/systemd/system/systemd-hybrid-sleep.service", "type": "file" }, { - "bom-ref": "66a29c7da84bd331", + "bom-ref": "c680b0c93c093f2b", "name": "/usr/lib/systemd/system/systemd-initctl.service", "type": "file" }, { - "bom-ref": "de91f2a724743643", + "bom-ref": "3356d996966b9591", "name": "/usr/lib/systemd/system/systemd-initctl.socket", "type": "file" }, { - "bom-ref": "f25cc0819558a40f", + "bom-ref": "4294c33fe4218c49", "name": "/usr/lib/systemd/system/systemd-journal-catalog-update.service", "type": "file" }, { - "bom-ref": "b10c41b4ced0aeb8", + "bom-ref": "4ff31f2e1ee01252", "name": "/usr/lib/systemd/system/systemd-journal-flush.service", "type": "file" }, { - "bom-ref": "2f2ffd36efd0e1d1", + "bom-ref": "8fd7cd281092d10f", "name": "/usr/lib/systemd/system/systemd-journald-audit.socket", "type": "file" }, { - "bom-ref": "cf3d9e749dffb5f1", + "bom-ref": "8eef2085bde883df", "name": "/usr/lib/systemd/system/systemd-journald-dev-log.socket", "type": "file" }, { - "bom-ref": "b939ea4ebdd39c92", + "bom-ref": "b61b536f5770cd1c", "name": "/usr/lib/systemd/system/systemd-journald-varlink@.socket", "type": "file" }, { - "bom-ref": "a7c8f7eee1c4ddd6", + "bom-ref": "0ef6f6ba4e12c524", "name": "/usr/lib/systemd/system/systemd-journald.service", "type": "file" }, { - "bom-ref": "3c4c3b4e52907b21", + "bom-ref": "c1aa2d800fe67323", "name": "/usr/lib/systemd/system/systemd-journald.service.d/nice.conf", "type": "file" }, { - "bom-ref": "4cd51d0a250965af", + "bom-ref": "5c0b86d92f28d2e9", "name": "/usr/lib/systemd/system/systemd-journald.socket", "type": "file" }, { - "bom-ref": "00ac674986d8aff8", + "bom-ref": "2c9d37cc117d0e32", "name": "/usr/lib/systemd/system/systemd-journald@.service", "type": "file" }, { - "bom-ref": "835f75f58863ca63", + "bom-ref": "fb7bfa2b6baca791", "name": "/usr/lib/systemd/system/systemd-journald@.socket", "type": "file" }, { - "bom-ref": "85af7a2554cfde02", + "bom-ref": "9512c2be80a68518", "name": "/usr/lib/systemd/system/systemd-kexec.service", "type": "file" }, { - "bom-ref": "f32733c0e8cb6ddb", + "bom-ref": "a21937d3ec457ff1", "name": "/usr/lib/systemd/system/systemd-localed.service", "type": "file" }, { - "bom-ref": "1cbc4cb20f64647a", + "bom-ref": "21eaa4c42710ae18", "name": "/usr/lib/systemd/system/systemd-localed.service.d/x11-keyboard.conf", "type": "file" }, { - "bom-ref": "e5b028eda1d28605", + "bom-ref": "ea9a97e9706b3517", "name": "/usr/lib/systemd/system/systemd-logind.service", "type": "file" }, { - "bom-ref": "4efc017a35c855bf", + "bom-ref": "bff0783321e7360d", "name": "/usr/lib/systemd/system/systemd-logind.service.d/dbus.conf", "type": "file" }, { - "bom-ref": "c6f02e54faf160a3", + "bom-ref": "202e1804b9707f75", "name": "/usr/lib/systemd/system/systemd-machine-id-commit.service", "type": "file" }, { - "bom-ref": "be0a8b9dbc3c3c86", + "bom-ref": "9e23f160c6ac7590", "name": "/usr/lib/systemd/system/systemd-modules-load.service", "type": "file" }, { - "bom-ref": "21c5157d89710d6a", + "bom-ref": "219328ae74829d7c", "name": "/usr/lib/systemd/system/systemd-network-generator.service", "type": "file" }, { - "bom-ref": "0dce7c62f3341b88", + "bom-ref": "8726df7b747147fe", "name": "/usr/lib/systemd/system/systemd-networkd-wait-online.service", "type": "file" }, { - "bom-ref": "8834d6bd90b68a94", + "bom-ref": "f811b29f56e8fde2", "name": "/usr/lib/systemd/system/systemd-networkd-wait-online@.service", "type": "file" }, { - "bom-ref": "ec8fbdc90e05616b", + "bom-ref": "695eb700c1f29ff9", "name": "/usr/lib/systemd/system/systemd-networkd.service", "type": "file" }, { - "bom-ref": "e571ca6472e21f04", + "bom-ref": "c55affe04433360e", "name": "/usr/lib/systemd/system/systemd-networkd.socket", "type": "file" }, { - "bom-ref": "3f6cb0cb01c75000", + "bom-ref": "fa1d4b6fb4986c22", "name": "/usr/lib/systemd/system/systemd-pcrextend.socket", "type": "file" }, { - "bom-ref": "c74e7c861b436856", + "bom-ref": "e45752d924022d64", "name": "/usr/lib/systemd/system/systemd-pcrextend@.service", "type": "file" }, { - "bom-ref": "dfbf78265b87f0c2", + "bom-ref": "de9fe7db062b3890", "name": "/usr/lib/systemd/system/systemd-pcrfs-root.service", "type": "file" }, { - "bom-ref": "247bbbd576401edb", + "bom-ref": "9e9cbe8e9b8c4099", "name": "/usr/lib/systemd/system/systemd-pcrfs@.service", "type": "file" }, { - "bom-ref": "268df524035ad784", + "bom-ref": "06654dc2b083373e", "name": "/usr/lib/systemd/system/systemd-pcrlock-file-system.service", "type": "file" }, { - "bom-ref": "bf455124129d0eff", + "bom-ref": "97db63ce17e3b189", "name": "/usr/lib/systemd/system/systemd-pcrlock-firmware-code.service", "type": "file" }, { - "bom-ref": "73b1ec436ad997d4", + "bom-ref": "510e42523a2834be", "name": "/usr/lib/systemd/system/systemd-pcrlock-firmware-config.service", "type": "file" }, { - "bom-ref": "4cc7d322cacd6b1b", + "bom-ref": "e99e79346ebc9d59", "name": "/usr/lib/systemd/system/systemd-pcrlock-machine-id.service", "type": "file" }, { - "bom-ref": "f605040d287a97f0", + "bom-ref": "8ac80ca4adc0f25e", "name": "/usr/lib/systemd/system/systemd-pcrlock-make-policy.service", "type": "file" }, { - "bom-ref": "2f37cb71efb54916", + "bom-ref": "c52cce6ab95e3ae4", "name": "/usr/lib/systemd/system/systemd-pcrlock-secureboot-authority.service", "type": "file" }, { - "bom-ref": "940428b97ed06124", + "bom-ref": "db4ecf38debcb4fe", "name": "/usr/lib/systemd/system/systemd-pcrlock-secureboot-policy.service", "type": "file" }, { - "bom-ref": "27b8aa2dd63b061b", + "bom-ref": "27a09a6ff0b678c9", "name": "/usr/lib/systemd/system/systemd-pcrmachine.service", "type": "file" }, { - "bom-ref": "daf7b2c618191dc7", + "bom-ref": "7a1f6b2a0d603735", "name": "/usr/lib/systemd/system/systemd-pcrphase-initrd.service", "type": "file" }, { - "bom-ref": "b1d83aa12a98e63d", + "bom-ref": "19d9e665f9341fbb", "name": "/usr/lib/systemd/system/systemd-pcrphase-sysinit.service", "type": "file" }, { - "bom-ref": "c1477056fac6f085", + "bom-ref": "2fd90e412c829aa3", "name": "/usr/lib/systemd/system/systemd-pcrphase.service", "type": "file" }, { - "bom-ref": "e414b3daca95678f", + "bom-ref": "6c1dd2bb17f67639", "name": "/usr/lib/systemd/system/systemd-poweroff.service", "type": "file" }, { - "bom-ref": "491cbcefbbe739e6", + "bom-ref": "7702148ef4208920", "name": "/usr/lib/systemd/system/systemd-pstore.service", "type": "file" }, { - "bom-ref": "0694bed5052d90cc", + "bom-ref": "546d1f920b9fa8ae", "name": "/usr/lib/systemd/system/systemd-quotacheck.service", "type": "file" }, { - "bom-ref": "4d3af12f0bb1c6c7", + "bom-ref": "743e941dc55f16d1", "name": "/usr/lib/systemd/system/systemd-random-seed.service", "type": "file" }, { - "bom-ref": "f8a07390c8a8acea", + "bom-ref": "384d3eb1bf51f164", "name": "/usr/lib/systemd/system/systemd-reboot.service", "type": "file" }, { - "bom-ref": "7a3bc864b988cbe2", + "bom-ref": "6ba2c6a97bc649dc", "name": "/usr/lib/systemd/system/systemd-remount-fs.service", "type": "file" }, { - "bom-ref": "610b713556339d46", + "bom-ref": "c5b9e787fd5e9cd4", "name": "/usr/lib/systemd/system/systemd-repart.service", "type": "file" }, { - "bom-ref": "20662b8aedf9d66a", + "bom-ref": "1a1d9801f27d6078", "name": "/usr/lib/systemd/system/systemd-rfkill.service", "type": "file" }, { - "bom-ref": "483e3742de3a7954", + "bom-ref": "41a51f51214f746a", "name": "/usr/lib/systemd/system/systemd-rfkill.socket", "type": "file" }, { - "bom-ref": "4fbe2c2821d6ee18", + "bom-ref": "0340ccd837a4c1f2", "name": "/usr/lib/systemd/system/systemd-soft-reboot.service", "type": "file" }, { - "bom-ref": "b8a99d67dc670271", + "bom-ref": "3714e40b0aa4d677", "name": "/usr/lib/systemd/system/systemd-storagetm.service", "type": "file" }, { - "bom-ref": "f2893cf4739edc89", + "bom-ref": "d28e39fb02e3720b", "name": "/usr/lib/systemd/system/systemd-suspend-then-hibernate.service", "type": "file" }, { - "bom-ref": "9cc9292884d372a0", + "bom-ref": "9a41942cbf14ec9e", "name": "/usr/lib/systemd/system/systemd-suspend.service", "type": "file" }, { - "bom-ref": "0407a17372c95cba", + "bom-ref": "9561d283c28e417c", "name": "/usr/lib/systemd/system/systemd-sysctl.service", "type": "file" }, { - "bom-ref": "f4363cf52aeba1d1", + "bom-ref": "8f0d3e7a96917efb", "name": "/usr/lib/systemd/system/systemd-sysext.service", "type": "file" }, { - "bom-ref": "3ba5b7c00c63e8c3", + "bom-ref": "c2750fe6a5330215", "name": "/usr/lib/systemd/system/systemd-sysext.socket", "type": "file" }, { - "bom-ref": "58ae5387e4da9ceb", + "bom-ref": "261c89571a21e961", "name": "/usr/lib/systemd/system/systemd-sysext@.service", "type": "file" }, { - "bom-ref": "243188a85e39f681", + "bom-ref": "03e1532422c7f6cb", "name": "/usr/lib/systemd/system/systemd-sysupdate-reboot.service", "type": "file" }, { - "bom-ref": "f394909d01ebeb3c", + "bom-ref": "d7ad65c31935121a", "name": "/usr/lib/systemd/system/systemd-sysupdate-reboot.timer", "type": "file" }, { - "bom-ref": "099f6da947c1079f", + "bom-ref": "6a754ea6d3ac71d5", "name": "/usr/lib/systemd/system/systemd-sysupdate.service", "type": "file" }, { - "bom-ref": "53a2610c7adba100", + "bom-ref": "a7aa595588aac2a2", "name": "/usr/lib/systemd/system/systemd-sysupdate.timer", "type": "file" }, { - "bom-ref": "beaef1fc7fd85987", + "bom-ref": "7fd53a4f22425359", "name": "/usr/lib/systemd/system/systemd-sysusers.service", "type": "file" }, { - "bom-ref": "66c0dc3403498cec", + "bom-ref": "fd362b9464b2b1de", "name": "/usr/lib/systemd/system/systemd-time-wait-sync.service", "type": "file" }, { - "bom-ref": "3a268da0863e66b0", + "bom-ref": "07e6b4ddf628923e", "name": "/usr/lib/systemd/system/systemd-timedated.service", "type": "file" }, { - "bom-ref": "3ac1115f7e37bd2a", + "bom-ref": "12ff4f1f1366f3d0", "name": "/usr/lib/systemd/system/systemd-tmpfiles-clean.service", "type": "file" }, { - "bom-ref": "d6458380e66166de", + "bom-ref": "48519745b9e8bb20", "name": "/usr/lib/systemd/system/systemd-tmpfiles-clean.timer", "type": "file" }, { - "bom-ref": "d02857416d24115d", + "bom-ref": "175f1c47a400df9f", "name": "/usr/lib/systemd/system/systemd-tmpfiles-setup-dev-early.service", "type": "file" }, { - "bom-ref": "e2479d7d471ac638", + "bom-ref": "f0950ad395d6fe8a", "name": "/usr/lib/systemd/system/systemd-tmpfiles-setup-dev.service", "type": "file" }, { - "bom-ref": "be1fbb7e16c15254", + "bom-ref": "181799458329095e", "name": "/usr/lib/systemd/system/systemd-tmpfiles-setup.service", "type": "file" }, { - "bom-ref": "3503ce61b77b2c01", + "bom-ref": "3da2cac10cadef3b", "name": "/usr/lib/systemd/system/systemd-tpm2-setup-early.service", "type": "file" }, { - "bom-ref": "8330cc018996e376", + "bom-ref": "2e4b233550d6c244", "name": "/usr/lib/systemd/system/systemd-tpm2-setup.service", "type": "file" }, { - "bom-ref": "57f896123203a949", + "bom-ref": "2e3bd91e37e523a1", "name": "/usr/lib/systemd/system/systemd-udev-settle.service", "type": "file" }, { - "bom-ref": "12076d1e3b21725a", + "bom-ref": "f5c62a343effb20e", "name": "/usr/lib/systemd/system/systemd-udev-trigger.service", "type": "file" }, { - "bom-ref": "7a8c906562d1a47d", + "bom-ref": "babecc464d34405d", "name": "/usr/lib/systemd/system/systemd-udevd-control.socket", "type": "file" }, { - "bom-ref": "8e6ae6cd683efe56", + "bom-ref": "c9293e9a0c0c1fce", "name": "/usr/lib/systemd/system/systemd-udevd-kernel.socket", "type": "file" }, { - "bom-ref": "e5b555427e7e35b8", + "bom-ref": "5a3216a113a417dc", "name": "/usr/lib/systemd/system/systemd-udevd.service", "type": "file" }, { - "bom-ref": "40fa5b0cb6950355", + "bom-ref": "2bb7e00f7bde9e31", "name": "/usr/lib/systemd/system/systemd-udevd.service.d/syscall-architecture.conf", "type": "file" }, { - "bom-ref": "ffc7a77ddb76d894", + "bom-ref": "d5e02c0da7cc9d32", "name": "/usr/lib/systemd/system/systemd-update-done.service", "type": "file" }, { - "bom-ref": "0afe92e6a3fe73db", + "bom-ref": "796e746aac461eed", "name": "/usr/lib/systemd/system/systemd-update-utmp-runlevel.service", "type": "file" }, { - "bom-ref": "7e39f5981ae8da30", + "bom-ref": "6030eebd6fe79d3e", "name": "/usr/lib/systemd/system/systemd-update-utmp.service", "type": "file" }, { - "bom-ref": "27429724121714b2", + "bom-ref": "5d02242b3bb54b84", "name": "/usr/lib/systemd/system/systemd-user-sessions.service", "type": "file" }, { - "bom-ref": "ed83c36c360d76b7", + "bom-ref": "f607feca4f1aa255", "name": "/usr/lib/systemd/system/systemd-volatile-root.service", "type": "file" }, { - "bom-ref": "c866d63ebc711226", + "bom-ref": "64f636a254784f60", "name": "/usr/lib/systemd/system/time-set.target", "type": "file" }, { - "bom-ref": "6aa1b2d20888f053", + "bom-ref": "ddc4eb66727cc2a1", "name": "/usr/lib/systemd/system/time-sync.target", "type": "file" }, { - "bom-ref": "973311286ec47d21", + "bom-ref": "8953ba6bbaeab543", "name": "/usr/lib/systemd/system/timers.target", "type": "file" }, { - "bom-ref": "681459cac2f3cf3d", + "bom-ref": "1f797fc2c620d40f", "name": "/usr/lib/systemd/system/umount.target", "type": "file" }, { - "bom-ref": "d2edc791d6aa8c09", + "bom-ref": "6ca09de039524b1f", "name": "/usr/lib/systemd/system/usb-gadget.target", "type": "file" }, { - "bom-ref": "1be5fac38a18e871", + "bom-ref": "57d5b2405f15b2e7", "name": "/usr/lib/systemd/system/user-.slice.d/10-defaults.conf", "type": "file" }, { - "bom-ref": "d0a4ae937418b90e", + "bom-ref": "321cadbd71602a94", "name": "/usr/lib/systemd/system/user-runtime-dir@.service", "type": "file" }, { - "bom-ref": "056f33ea03ea54c6", + "bom-ref": "3c9f70be7610f7bc", "name": "/usr/lib/systemd/system/user.slice", "type": "file" }, { - "bom-ref": "4be651814bbc8f74", + "bom-ref": "007738c6031dac56", "name": "/usr/lib/systemd/system/user@.service", "type": "file" }, { - "bom-ref": "0b8fd9b81fefb4bc", + "bom-ref": "a994a01f5ba3a4fe", "name": "/usr/lib/systemd/system/user@.service.d/10-login-barrier.conf", "type": "file" }, { - "bom-ref": "ba52a878230ad8f1", + "bom-ref": "938f9b1772383df3", "name": "/usr/lib/systemd/system/user@.service.d/timeout.conf", "type": "file" }, { - "bom-ref": "be691321438c401c", + "bom-ref": "fa97dbb6603f7272", "name": "/usr/lib/systemd/system/user@0.service.d/10-login-barrier.conf", "type": "file" }, { - "bom-ref": "a8029d66b0404b56", + "bom-ref": "fb605b4f82a1fc00", "name": "/usr/lib/systemd/system/veritysetup-pre.target", "type": "file" }, { - "bom-ref": "f96b8f590fdc9e17", + "bom-ref": "701d42b811e9bf39", "name": "/usr/lib/systemd/system/veritysetup.target", "type": "file" }, { - "bom-ref": "6d6e9ecfc5fc3799", + "bom-ref": "ba29ae9e215785f3", "name": "/usr/lib/systemd/systemd", "type": "file" }, { - "bom-ref": "2e2a8a71aad77d54", + "bom-ref": "3d9addf08c21dbae", "name": "/usr/lib/systemd/systemd-backlight", "type": "file" }, { - "bom-ref": "a81cc2dbc479b6f9", + "bom-ref": "f2eb1db6e9f86777", "name": "/usr/lib/systemd/systemd-battery-check", "type": "file" }, { - "bom-ref": "eee7658a1aeaf09b", + "bom-ref": "7e69024d2b06ee79", "name": "/usr/lib/systemd/systemd-binfmt", "type": "file" }, { - "bom-ref": "a5514e64067e5860", + "bom-ref": "b5d4c6038cb9359e", "name": "/usr/lib/systemd/systemd-boot-check-no-failures", "type": "file" }, { - "bom-ref": "50667e3aec9cf277", + "bom-ref": "5fc8848a20c2b7cd", "name": "/usr/lib/systemd/systemd-bsod", "type": "file" }, { - "bom-ref": "7d1ab3cad850cf20", + "bom-ref": "92928c930a5923f2", "name": "/usr/lib/systemd/systemd-cgroups-agent", "type": "file" }, { - "bom-ref": "35d1b08ee7484056", + "bom-ref": "8f3889b2c678b31c", "name": "/usr/lib/systemd/systemd-executor", "type": "file" }, { - "bom-ref": "242a8b9bb10a0df3", + "bom-ref": "e59125313be968d1", "name": "/usr/lib/systemd/systemd-fsck", "type": "file" }, { - "bom-ref": "fdff218e5a56701c", + "bom-ref": "36369cff96b3796e", "name": "/usr/lib/systemd/systemd-fsckd", "type": "file" }, { - "bom-ref": "03d363b65e6f82d4", + "bom-ref": "913a07d9c0426726", "name": "/usr/lib/systemd/systemd-growfs", "type": "file" }, { - "bom-ref": "8aa1c18f70b3ce85", + "bom-ref": "ed29b51f0593aa5b", "name": "/usr/lib/systemd/systemd-hibernate-resume", "type": "file" }, { - "bom-ref": "0338bacd53e68ae0", + "bom-ref": "d0b8e71b2dd7827e", "name": "/usr/lib/systemd/systemd-hostnamed", "type": "file" }, { - "bom-ref": "19139d504223b5b5", + "bom-ref": "d85926ae9e70e3e7", "name": "/usr/lib/systemd/systemd-initctl", "type": "file" }, { - "bom-ref": "03eadb80dee95e6c", + "bom-ref": "9936be210a37674e", "name": "/usr/lib/systemd/systemd-integritysetup", "type": "file" }, { - "bom-ref": "1f9f568335cbecc8", + "bom-ref": "6cfc755e27888582", "name": "/usr/lib/systemd/systemd-journald", "type": "file" }, { - "bom-ref": "eb38c39ec4e76138", + "bom-ref": "04a13c74a9de4a6e", "name": "/usr/lib/systemd/systemd-localed", "type": "file" }, { - "bom-ref": "e7720e7407496683", + "bom-ref": "38aa7f9c104c81dd", "name": "/usr/lib/systemd/systemd-logind", "type": "file" }, { - "bom-ref": "61e0ac0443169553", + "bom-ref": "b3c56680c768ff6d", "name": "/usr/lib/systemd/systemd-makefs", "type": "file" }, { - "bom-ref": "239c6c99e429ea08", + "bom-ref": "b36a22c70ca972a2", "name": "/usr/lib/systemd/systemd-measure", "type": "file" }, { - "bom-ref": "4f0ff9904d58fd65", + "bom-ref": "eed78d59262da383", "name": "/usr/lib/systemd/systemd-modules-load", "type": "file" }, { - "bom-ref": "ec01de14783bd2d7", + "bom-ref": "527e67d02406aeed", "name": "/usr/lib/systemd/systemd-network-generator", "type": "file" }, { - "bom-ref": "b0e2a5c00d707e22", + "bom-ref": "5f2a16186a04342c", "name": "/usr/lib/systemd/systemd-networkd", "type": "file" }, { - "bom-ref": "13d2613e035a5fee", + "bom-ref": "04ac0afbc43f48f8", "name": "/usr/lib/systemd/systemd-networkd-wait-online", "type": "file" }, { - "bom-ref": "0d282126f53edc07", + "bom-ref": "1da78f354253d049", "name": "/usr/lib/systemd/systemd-pcrextend", "type": "file" }, { - "bom-ref": "9e7731ea24226f0a", + "bom-ref": "208feb2c0ebd4654", "name": "/usr/lib/systemd/systemd-pcrlock", "type": "file" }, { - "bom-ref": "9b7d390afadfbbfd", + "bom-ref": "e65e7dd77d7665e7", "name": "/usr/lib/systemd/systemd-pstore", "type": "file" }, { - "bom-ref": "4b2b4a3faad60316", + "bom-ref": "4dd3ba423ddf8698", "name": "/usr/lib/systemd/systemd-quotacheck", "type": "file" }, { - "bom-ref": "798cc650c917df2c", + "bom-ref": "18751af94618a56a", "name": "/usr/lib/systemd/systemd-random-seed", "type": "file" }, { - "bom-ref": "99f1e2f5a01d296d", + "bom-ref": "9c9652d7dea19bbf", "name": "/usr/lib/systemd/systemd-remount-fs", "type": "file" }, { - "bom-ref": "1e4dd176803e07bb", + "bom-ref": "aa9f82efad096521", "name": "/usr/lib/systemd/systemd-reply-password", "type": "file" }, { - "bom-ref": "8d2e8942141b207e", + "bom-ref": "59944aa509fd4460", "name": "/usr/lib/systemd/systemd-rfkill", "type": "file" }, { - "bom-ref": "81313b89fb6911e1", + "bom-ref": "06d10a8c92b3825b", "name": "/usr/lib/systemd/systemd-shutdown", "type": "file" }, { - "bom-ref": "cd9412e01581fb01", + "bom-ref": "d88b0635c6f61287", "name": "/usr/lib/systemd/systemd-sleep", "type": "file" }, { - "bom-ref": "14229576769916e3", + "bom-ref": "743358b7b0379e55", "name": "/usr/lib/systemd/systemd-socket-proxyd", "type": "file" }, { - "bom-ref": "25247bbc255563c2", + "bom-ref": "f0d628cdb92bcb04", "name": "/usr/lib/systemd/systemd-storagetm", "type": "file" }, { - "bom-ref": "952cad6a874f2fd4", + "bom-ref": "df7126d60dd52672", "name": "/usr/lib/systemd/systemd-sulogin-shell", "type": "file" }, { - "bom-ref": "7c38c26986686975", + "bom-ref": "7c272079556bde23", "name": "/usr/lib/systemd/systemd-sysctl", "type": "file" }, { - "bom-ref": "b066c0191b6447e6", + "bom-ref": "40223521ce6e6600", "name": "/usr/lib/systemd/systemd-sysupdate", "type": "file" }, { - "bom-ref": "ad0167c7c4a88b0c", + "bom-ref": "5af9702fc464d9fe", "name": "/usr/lib/systemd/systemd-sysv-install", "type": "file" }, { - "bom-ref": "54bc75cea11cb9b8", + "bom-ref": "b29a31afe3636126", "name": "/usr/lib/systemd/systemd-time-wait-sync", "type": "file" }, { - "bom-ref": "a55ad693add67186", + "bom-ref": "407f36eac575593c", "name": "/usr/lib/systemd/systemd-timedated", "type": "file" }, { - "bom-ref": "02a00125bc0c3c45", + "bom-ref": "81afb391dc1158e7", "name": "/usr/lib/systemd/systemd-tpm2-setup", "type": "file" }, { - "bom-ref": "146c4e1e5e063e5d", + "bom-ref": "488fac03af3fb07f", "name": "/usr/lib/systemd/systemd-update-done", "type": "file" }, { - "bom-ref": "eb0adf84da0cc553", + "bom-ref": "8af1a50c2e8d61cd", "name": "/usr/lib/systemd/systemd-update-utmp", "type": "file" }, { - "bom-ref": "11d06813dfa19248", + "bom-ref": "d4f61aca31c132be", "name": "/usr/lib/systemd/systemd-user-runtime-dir", "type": "file" }, { - "bom-ref": "9e67ab31b3e2d7ea", + "bom-ref": "a450f93fb5f11138", "name": "/usr/lib/systemd/systemd-user-sessions", "type": "file" }, { - "bom-ref": "456ab36c0c966351", + "bom-ref": "382d693ac53a6b77", "name": "/usr/lib/systemd/systemd-veritysetup", "type": "file" }, { - "bom-ref": "5eccec55834a3ee3", + "bom-ref": "9526c1b9bc39a38d", "name": "/usr/lib/systemd/systemd-volatile-root", "type": "file" }, { - "bom-ref": "b444f8078cafd107", + "bom-ref": "8b47e70de08e10a5", "name": "/usr/lib/systemd/systemd-xdg-autostart-condition", "type": "file" }, { - "bom-ref": "45e013cc5f4be0d8", + "bom-ref": "dff8f6c5f44ff592", "name": "/usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator", "type": "file" }, { - "bom-ref": "410e8893eb044c03", + "bom-ref": "3b8a492a1f547f65", "name": "/usr/lib/systemd/user-generators/systemd-xdg-autostart-generator", "type": "file" }, { - "bom-ref": "876df1c1a66f4763", + "bom-ref": "dad679c0ec857065", "name": "/usr/lib/systemd/user-preset/90-systemd.preset", "type": "file" }, { - "bom-ref": "c0135df178399603", + "bom-ref": "dac67760223265c1", "name": "/usr/lib/systemd/user/app.slice", "type": "file" }, { - "bom-ref": "bec30f48b74030fc", + "bom-ref": "6b413d6d63dbff92", "name": "/usr/lib/systemd/user/background.slice", "type": "file" }, { - "bom-ref": "cc0e2f05d2ed477a", + "bom-ref": "22ec1f54a75bc9bc", "name": "/usr/lib/systemd/user/basic.target", "type": "file" }, { - "bom-ref": "6e3e7eedd5aef14b", + "bom-ref": "62af7bb3897b8c91", "name": "/usr/lib/systemd/user/bluetooth.target", "type": "file" }, { - "bom-ref": "6022de39c3c81b34", + "bom-ref": "21363d2cdaf3e51a", "name": "/usr/lib/systemd/user/default.target", "type": "file" }, { - "bom-ref": "ccbede917243925d", + "bom-ref": "a7d52fe1d96e593f", "name": "/usr/lib/systemd/user/exit.target", "type": "file" }, { - "bom-ref": "7819697c8fe2f077", + "bom-ref": "509866d1ad643ba1", "name": "/usr/lib/systemd/user/graphical-session-pre.target", "type": "file" }, { - "bom-ref": "f338354e7787bbec", + "bom-ref": "b03ec32fd6b649ba", "name": "/usr/lib/systemd/user/graphical-session.target", "type": "file" }, { - "bom-ref": "3556a0cad97e02d0", + "bom-ref": "920e7976cef25549", + "name": "/usr/lib/systemd/user/launchpadlib-cache-clean.service", + "type": "file" + }, + { + "bom-ref": "1d79376ca04cdb3e", + "name": "/usr/lib/systemd/user/launchpadlib-cache-clean.timer", + "type": "file" + }, + { + "bom-ref": "d5493f1a7fc73996", "name": "/usr/lib/systemd/user/paths.target", "type": "file" }, { - "bom-ref": "6418bbe439149e4b", + "bom-ref": "b95b35cacb9b32c7", + "name": "/usr/lib/systemd/user/pk-debconf-helper.service", + "type": "file" + }, + { + "bom-ref": "08a27f2b2749c0d3", + "name": "/usr/lib/systemd/user/pk-debconf-helper.socket", + "type": "file" + }, + { + "bom-ref": "6d2d630ba227adcd", "name": "/usr/lib/systemd/user/printer.target", "type": "file" }, { - "bom-ref": "099cbe4902f5a3b6", + "bom-ref": "256b5a2180f0b4c4", "name": "/usr/lib/systemd/user/session.slice", "type": "file" }, { - "bom-ref": "e48eabcb6048fac5", + "bom-ref": "6c74e4e10120a9e3", "name": "/usr/lib/systemd/user/shutdown.target", "type": "file" }, { - "bom-ref": "0d78753bf330311f", + "bom-ref": "b71938d19a86d3e1", "name": "/usr/lib/systemd/user/smartcard.target", "type": "file" }, { - "bom-ref": "2d74f8b49bc007a9", + "bom-ref": "315c82e1ef002f53", "name": "/usr/lib/systemd/user/sockets.target", "type": "file" }, { - "bom-ref": "fee5e3c45ec94f5d", + "bom-ref": "2713b8177bf7272f", "name": "/usr/lib/systemd/user/sound.target", "type": "file" }, { - "bom-ref": "a3d8598a071a2f35", + "bom-ref": "15442d1891cbcbef", "name": "/usr/lib/systemd/user/systemd-exit.service", "type": "file" }, { - "bom-ref": "f091e6c2e8f7391d", + "bom-ref": "a4a7dbef0bf62c67", "name": "/usr/lib/systemd/user/systemd-tmpfiles-clean.service", "type": "file" }, { - "bom-ref": "5f8d36474a170756", + "bom-ref": "b103662a839c69c0", "name": "/usr/lib/systemd/user/systemd-tmpfiles-clean.timer", "type": "file" }, { - "bom-ref": "4178a11f364c8bce", + "bom-ref": "ffa8a97a5ed145d0", "name": "/usr/lib/systemd/user/systemd-tmpfiles-setup.service", "type": "file" }, { - "bom-ref": "64c06a39d0752a34", + "bom-ref": "4cf23e8c63879f12", "name": "/usr/lib/systemd/user/timers.target", "type": "file" }, { - "bom-ref": "1c8e25a1366eb97c", + "bom-ref": "c8dac30e5a73bcbe", "name": "/usr/lib/systemd/user/xdg-desktop-autostart.target", "type": "file" }, { - "bom-ref": "02a5bc9eda4efbf6", + "bom-ref": "2bd0cf7c18bb78f0", "name": "/usr/lib/sysusers.d/basic.conf", "type": "file" }, { - "bom-ref": "fc75240a5f9913a3", + "bom-ref": "bb600f8f700a9520", + "name": "/usr/lib/sysusers.d/dbus.conf", + "type": "file" + }, + { + "bom-ref": "3971bf64895dec17", "name": "/usr/lib/sysusers.d/debian-udev.conf", "type": "file" }, { - "bom-ref": "e654178526f6af32", + "bom-ref": "d308b5445a10347a", + "name": "/usr/lib/sysusers.d/polkit.conf", + "type": "file" + }, + { + "bom-ref": "519704e373ffc9b8", "name": "/usr/lib/sysusers.d/systemd-journal.conf", "type": "file" }, { - "bom-ref": "30a5343f80dd01f1", + "bom-ref": "dd25fc56cfec566b", "name": "/usr/lib/sysusers.d/systemd-network.conf", "type": "file" }, { - "bom-ref": "9ebc47a4621cdc85", + "bom-ref": "e5051229df770f37", "name": "/usr/lib/tmpfiles.d/credstore.conf", "type": "file" }, { - "bom-ref": "94cadb51a5114d3f", + "bom-ref": "c03a53054fe38748", + "name": "/usr/lib/tmpfiles.d/dbus.conf", + "type": "file" + }, + { + "bom-ref": "1d41f17eada9154d", "name": "/usr/lib/tmpfiles.d/debian.conf", "type": "file" }, { - "bom-ref": "73dc0aa342d85837", + "bom-ref": "e7ca387ffb62f421", "name": "/usr/lib/tmpfiles.d/home.conf", "type": "file" }, { - "bom-ref": "f7dc20b3f10afd2c", + "bom-ref": "0329de314add7302", "name": "/usr/lib/tmpfiles.d/journal-nocow.conf", "type": "file" }, { - "bom-ref": "0a62f1e30079b5be", + "bom-ref": "0461fa553e0da2c0", "name": "/usr/lib/tmpfiles.d/legacy.conf", "type": "file" }, { - "bom-ref": "9d6f3d6e3d18f373", + "bom-ref": "d93c87b2edf0a121", "name": "/usr/lib/tmpfiles.d/libselinux1.conf", "type": "file" }, { - "bom-ref": "2ea13b022421626a", + "bom-ref": "102fbd9b3f239abc", "name": "/usr/lib/tmpfiles.d/passwd.conf", "type": "file" }, { - "bom-ref": "8d1b744c170c1d10", + "bom-ref": "cb28c61a260e7d9e", + "name": "/usr/lib/tmpfiles.d/polkitd.conf", + "type": "file" + }, + { + "bom-ref": "9147c6844c608736", "name": "/usr/lib/tmpfiles.d/provision.conf", "type": "file" }, { - "bom-ref": "d8b5efb232f78616", + "bom-ref": "9f59e5211d87a96a", "name": "/usr/lib/tmpfiles.d/static-nodes-permissions.conf", "type": "file" }, { - "bom-ref": "b1b3dcd70df781d8", + "bom-ref": "c9992da06ef5593a", "name": "/usr/lib/tmpfiles.d/systemd-network.conf", "type": "file" }, { - "bom-ref": "0076f923a9d2ab5a", + "bom-ref": "7f4e012cffdaeee0", "name": "/usr/lib/tmpfiles.d/systemd-nologin.conf", "type": "file" }, { - "bom-ref": "c7a23a253fa59f5f", + "bom-ref": "8e6d16233d46a325", "name": "/usr/lib/tmpfiles.d/systemd-pstore.conf", "type": "file" }, { - "bom-ref": "13960008acc629e0", + "bom-ref": "2d9c94371d619706", "name": "/usr/lib/tmpfiles.d/systemd-tmp.conf", "type": "file" }, { - "bom-ref": "0fffe329edc88298", + "bom-ref": "48e2b2d6e5bf706e", "name": "/usr/lib/tmpfiles.d/systemd.conf", "type": "file" }, { - "bom-ref": "2e5a004f222be154", + "bom-ref": "aff14f5d922172c6", "name": "/usr/lib/tmpfiles.d/tmp.conf", "type": "file" }, { - "bom-ref": "435ba4d6e8b21eae", + "bom-ref": "394872cb9e01eb14", "name": "/usr/lib/tmpfiles.d/var.conf", "type": "file" }, { - "bom-ref": "118a99d80d61d7b9", + "bom-ref": "8e448c3c44436543", "name": "/usr/lib/tmpfiles.d/x11.conf", "type": "file" }, { - "bom-ref": "f6b14ee8d6bd9d24", + "bom-ref": "cbaf5cec4943d388", "name": "/usr/lib/truescale-serdes.cmds", "type": "file" }, { - "bom-ref": "849b9f1b961b4a03", + "bom-ref": "f7f32050d425d493", "name": "/usr/lib/udev/ata_id", "type": "file" }, { - "bom-ref": "410e3e3b3304a905", + "bom-ref": "77004a4bc4e7ac2d", "name": "/usr/lib/udev/cdrom_id", "type": "file" }, { - "bom-ref": "b2cd1b86a1617d28", + "bom-ref": "bf9ac368e3ce01a0", "name": "/usr/lib/udev/dmi_memory_id", "type": "file" }, { - "bom-ref": "c7efddb3cf9327a5", + "bom-ref": "feccb7fc267e4421", "name": "/usr/lib/udev/fido_id", "type": "file" }, { - "bom-ref": "5d47dc2acf4d6be2", + "bom-ref": "9b765d21c9fea206", "name": "/usr/lib/udev/hwdb.d/20-OUI.hwdb", "type": "file" }, { - "bom-ref": "eb801774ae9fcc9a", + "bom-ref": "99b43b9452f92742", "name": "/usr/lib/udev/hwdb.d/20-acpi-vendor.hwdb", "type": "file" }, { - "bom-ref": "b43875781756b32f", + "bom-ref": "926f91676a09033b", "name": "/usr/lib/udev/hwdb.d/20-bluetooth-vendor-product.hwdb", "type": "file" }, { - "bom-ref": "b41a5e13b83832ee", + "bom-ref": "eb1e06971a7df6de", "name": "/usr/lib/udev/hwdb.d/20-dmi-id.hwdb", "type": "file" }, { - "bom-ref": "2135882fd24a6772", + "bom-ref": "e2d4589c2ab6b1ba", "name": "/usr/lib/udev/hwdb.d/20-net-ifname.hwdb", "type": "file" }, { - "bom-ref": "a91a31d5e4d23515", + "bom-ref": "7c89df1430020e59", "name": "/usr/lib/udev/hwdb.d/20-pci-classes.hwdb", "type": "file" }, { - "bom-ref": "fd4d787e7c55f330", + "bom-ref": "94593de8571d9c9c", "name": "/usr/lib/udev/hwdb.d/20-pci-vendor-model.hwdb", "type": "file" }, { - "bom-ref": "e2569d14ea85145e", + "bom-ref": "47b056ee54afa97e", "name": "/usr/lib/udev/hwdb.d/20-sdio-classes.hwdb", "type": "file" }, { - "bom-ref": "db8339ff88f2b519", + "bom-ref": "ace6e8aba6fcf809", "name": "/usr/lib/udev/hwdb.d/20-sdio-vendor-model.hwdb", "type": "file" }, { - "bom-ref": "f505aecf9b336723", + "bom-ref": "cf1be4f8dd0187a7", "name": "/usr/lib/udev/hwdb.d/20-usb-classes.hwdb", "type": "file" }, { - "bom-ref": "74474e193b1528c0", + "bom-ref": "8194d78c185bb37c", "name": "/usr/lib/udev/hwdb.d/20-usb-vendor-model.hwdb", "type": "file" }, { - "bom-ref": "5d870133374e56ad", + "bom-ref": "9cb729fe7be5f82d", "name": "/usr/lib/udev/hwdb.d/20-vmbus-class.hwdb", "type": "file" }, { - "bom-ref": "baf4e2c731e9d097", + "bom-ref": "1971454acd49e99b", "name": "/usr/lib/udev/hwdb.d/60-autosuspend-chromiumos.hwdb", "type": "file" }, { - "bom-ref": "82f241437824b713", + "bom-ref": "9f612099a3e8b867", "name": "/usr/lib/udev/hwdb.d/60-autosuspend-fingerprint-reader.hwdb", "type": "file" }, { - "bom-ref": "82ac57e3585b6e35", + "bom-ref": "fcb270f9494ed28d", "name": "/usr/lib/udev/hwdb.d/60-autosuspend.hwdb", "type": "file" }, { - "bom-ref": "d51d76353efaa1fc", + "bom-ref": "30c0aa7972a69ccc", "name": "/usr/lib/udev/hwdb.d/60-evdev.hwdb", "type": "file" }, { - "bom-ref": "76add028266a4f63", + "bom-ref": "4648ec2e0ca3e00f", "name": "/usr/lib/udev/hwdb.d/60-input-id.hwdb", "type": "file" }, { - "bom-ref": "ea65e9fc73056fe7", + "bom-ref": "7c8233c9cb7a535b", "name": "/usr/lib/udev/hwdb.d/60-keyboard.hwdb", "type": "file" }, { - "bom-ref": "9505b91953cf5bbd", + "bom-ref": "36f353c15dd3fa19", "name": "/usr/lib/udev/hwdb.d/60-seat.hwdb", "type": "file" }, { - "bom-ref": "f420e0442cd9023a", + "bom-ref": "f2c7955cb75f074a", "name": "/usr/lib/udev/hwdb.d/60-sensor.hwdb", "type": "file" }, { - "bom-ref": "611fa1bc9f8e95a0", + "bom-ref": "f3fecb6e98004e98", "name": "/usr/lib/udev/hwdb.d/70-analyzers.hwdb", "type": "file" }, { - "bom-ref": "4e3a87440faab856", + "bom-ref": "7e886728dec77a56", "name": "/usr/lib/udev/hwdb.d/70-av-production.hwdb", "type": "file" }, { - "bom-ref": "a0a505bc3851b9ad", + "bom-ref": "295cd95332e0da01", "name": "/usr/lib/udev/hwdb.d/70-cameras.hwdb", "type": "file" }, { - "bom-ref": "7973756cb7dd9b09", + "bom-ref": "28c4473a76b693a5", "name": "/usr/lib/udev/hwdb.d/70-joystick.hwdb", "type": "file" }, { - "bom-ref": "30db81057d87737d", + "bom-ref": "9b9cbc3ad910c239", "name": "/usr/lib/udev/hwdb.d/70-mouse.hwdb", "type": "file" }, { - "bom-ref": "702674eb8ef6c141", + "bom-ref": "48efe94fa7022bb5", "name": "/usr/lib/udev/hwdb.d/70-pda.hwdb", "type": "file" }, { - "bom-ref": "3dfb377c1eb073ea", + "bom-ref": "9c195532c8d2048a", "name": "/usr/lib/udev/hwdb.d/70-pointingstick.hwdb", "type": "file" }, { - "bom-ref": "8b9d5333db2666f7", + "bom-ref": "ac61e27966503d63", "name": "/usr/lib/udev/hwdb.d/70-sound-card.hwdb", "type": "file" }, { - "bom-ref": "7f78ac7f84292457", + "bom-ref": "069687e637f9e35f", "name": "/usr/lib/udev/hwdb.d/70-touchpad.hwdb", "type": "file" }, { - "bom-ref": "e8473cc4650b2af8", + "bom-ref": "02e5a68963252818", "name": "/usr/lib/udev/hwdb.d/80-ieee1394-unit-function.hwdb", "type": "file" }, { - "bom-ref": "ae3d460abde80b4f", + "bom-ref": "2d85cbd19027eb7f", "name": "/usr/lib/udev/iocost", "type": "file" }, { - "bom-ref": "646765e2287e3ce7", + "bom-ref": "ce542aa5e1f168db", "name": "/usr/lib/udev/mtd_probe", "type": "file" }, { - "bom-ref": "edf29b27bc067bb9", + "bom-ref": "3c460b706f14b77d", "name": "/usr/lib/udev/rdma_rename", "type": "file" }, { - "bom-ref": "efe9fa14fa731d7f", + "bom-ref": "c4bb1b334e4ee3bb", "name": "/usr/lib/udev/rules.d/40-vm-hotadd.rules", "type": "file" }, { - "bom-ref": "78173f41eeb2f1d9", + "bom-ref": "b5459fe58ac50ff5", "name": "/usr/lib/udev/rules.d/50-firmware.rules", "type": "file" }, { - "bom-ref": "3337668bc04ab371", + "bom-ref": "ef27c5c74a0168f1", "name": "/usr/lib/udev/rules.d/50-udev-default.rules", "type": "file" }, { - "bom-ref": "5e4936fc54dc0990", + "bom-ref": "a89bf5a4071f689c", "name": "/usr/lib/udev/rules.d/60-autosuspend.rules", "type": "file" }, { - "bom-ref": "d8833d99a465f18b", + "bom-ref": "5a0a5877a136cffb", "name": "/usr/lib/udev/rules.d/60-block.rules", "type": "file" }, { - "bom-ref": "f37ac3fc6ab30d40", + "bom-ref": "ddfb70dd8a5e92f4", "name": "/usr/lib/udev/rules.d/60-cdrom_id.rules", "type": "file" }, { - "bom-ref": "3430c1384aa550ae", + "bom-ref": "afe46704cf1237ce", "name": "/usr/lib/udev/rules.d/60-dmi-id.rules", "type": "file" }, { - "bom-ref": "96405056f51cde37", + "bom-ref": "0c51fe5df07fc253", "name": "/usr/lib/udev/rules.d/60-drm.rules", "type": "file" }, { - "bom-ref": "53d4e643e25b34d3", + "bom-ref": "af862a932c58847f", "name": "/usr/lib/udev/rules.d/60-evdev.rules", "type": "file" }, { - "bom-ref": "5fa4ad734c721b93", + "bom-ref": "02a7dfaaf96c4a3f", "name": "/usr/lib/udev/rules.d/60-fido-id.rules", "type": "file" }, { - "bom-ref": "894c98f57b32f5b1", + "bom-ref": "550c7609ad19c2a5", "name": "/usr/lib/udev/rules.d/60-infiniband.rules", "type": "file" }, { - "bom-ref": "12fd7b4588d61c7f", + "bom-ref": "8254cf28055ce453", "name": "/usr/lib/udev/rules.d/60-input-id.rules", "type": "file" }, { - "bom-ref": "83af1186a3af22ee", + "bom-ref": "cf84b16d6e89ee86", "name": "/usr/lib/udev/rules.d/60-persistent-alsa.rules", "type": "file" }, { - "bom-ref": "f6414d4930097105", + "bom-ref": "bd74dfb487ae6a11", "name": "/usr/lib/udev/rules.d/60-persistent-input.rules", "type": "file" }, { - "bom-ref": "d167f5885bf2d843", + "bom-ref": "80d48af391ae8c9f", "name": "/usr/lib/udev/rules.d/60-persistent-storage-mtd.rules", "type": "file" }, { - "bom-ref": "0734a3c0684446fe", + "bom-ref": "4a6b686aa8a761ae", "name": "/usr/lib/udev/rules.d/60-persistent-storage-tape.rules", "type": "file" }, { - "bom-ref": "9b072dd418563fc9", + "bom-ref": "3479f16c3baddf91", "name": "/usr/lib/udev/rules.d/60-persistent-storage.rules", "type": "file" }, { - "bom-ref": "aaa70835ef4e9aa3", + "bom-ref": "279fa282e200281b", "name": "/usr/lib/udev/rules.d/60-persistent-v4l.rules", "type": "file" }, { - "bom-ref": "bfda841462d148a0", + "bom-ref": "c42cd858857cf534", "name": "/usr/lib/udev/rules.d/60-rdma-ndd.rules", "type": "file" }, { - "bom-ref": "01bba53c7ba2d4ba", + "bom-ref": "d2c12c64431a90ba", "name": "/usr/lib/udev/rules.d/60-rdma-persistent-naming.rules", "type": "file" }, { - "bom-ref": "583640ac7674c270", + "bom-ref": "d4961dcb6d17a798", "name": "/usr/lib/udev/rules.d/60-sensor.rules", "type": "file" }, { - "bom-ref": "424418eae9e43e79", + "bom-ref": "caf52852b915d8bd", "name": "/usr/lib/udev/rules.d/60-serial.rules", "type": "file" }, { - "bom-ref": "ea0b21539f2dfe4d", + "bom-ref": "2b1b1a3713642875", "name": "/usr/lib/udev/rules.d/61-persistent-storage-android.rules", "type": "file" }, { - "bom-ref": "b518d796d5c4311f", + "bom-ref": "152add0805f64887", "name": "/usr/lib/udev/rules.d/64-btrfs.rules", "type": "file" }, { - "bom-ref": "649061f077acecb7", + "bom-ref": "56e592eda2de9797", "name": "/usr/lib/udev/rules.d/70-camera.rules", "type": "file" }, { - "bom-ref": "bf0462145251fe54", + "bom-ref": "7148b7dd14255f38", "name": "/usr/lib/udev/rules.d/70-joystick.rules", "type": "file" }, { - "bom-ref": "348dc9f1e198c8a2", + "bom-ref": "3f0a57e623cba18e", "name": "/usr/lib/udev/rules.d/70-memory.rules", "type": "file" }, { - "bom-ref": "6c738c9baf79272e", + "bom-ref": "4ff7bf02c2d78d56", "name": "/usr/lib/udev/rules.d/70-mouse.rules", "type": "file" }, { - "bom-ref": "c643d2b2ece0f54c", + "bom-ref": "a95b24c7387f8878", "name": "/usr/lib/udev/rules.d/70-power-switch.rules", "type": "file" }, { - "bom-ref": "16458411bcc2a04c", + "bom-ref": "9c7d51610430dadc", "name": "/usr/lib/udev/rules.d/70-touchpad.rules", "type": "file" }, { - "bom-ref": "338c79e04e1f4a23", + "bom-ref": "b14be92e0388c149", "name": "/usr/lib/udev/rules.d/70-uaccess.rules", "type": "file" }, { - "bom-ref": "e24d426ddfcb8295", + "bom-ref": "332e150b96f515ed", "name": "/usr/lib/udev/rules.d/71-power-switch-proliant.rules", "type": "file" }, { - "bom-ref": "8e1a7548b313b03a", + "bom-ref": "72d5191b6d2740c0", "name": "/usr/lib/udev/rules.d/71-seat.rules", "type": "file" }, { - "bom-ref": "f0dc29f7c301362e", + "bom-ref": "bec2affe92236420", "name": "/usr/lib/udev/rules.d/73-seat-late.rules", "type": "file" }, { - "bom-ref": "d9f4abf26c2e8f2c", + "bom-ref": "b4690cad5fc40c20", "name": "/usr/lib/udev/rules.d/73-special-net-names.rules", "type": "file" }, { - "bom-ref": "325f4d7e160a21f0", + "bom-ref": "361301a01992e3c0", "name": "/usr/lib/udev/rules.d/75-net-description.rules", "type": "file" }, { - "bom-ref": "2dd2e38a73ce8e13", + "bom-ref": "76342626bba585e3", "name": "/usr/lib/udev/rules.d/75-probe_mtd.rules", "type": "file" }, { - "bom-ref": "61d0833bec78f8c6", + "bom-ref": "b5ae80517be0bbb6", "name": "/usr/lib/udev/rules.d/75-rdma-description.rules", "type": "file" }, { - "bom-ref": "fcf9a711d6c8c5ee", + "bom-ref": "b360698c1a0f720e", "name": "/usr/lib/udev/rules.d/78-graphics-card.rules", "type": "file" }, { - "bom-ref": "4ca4821dbf5f11c7", + "bom-ref": "2c2c80ce3e641d4b", "name": "/usr/lib/udev/rules.d/78-sound-card.rules", "type": "file" }, { - "bom-ref": "d78962473a33676e", + "bom-ref": "4a00c2788b2e1af2", "name": "/usr/lib/udev/rules.d/80-debian-compat.rules", "type": "file" }, { - "bom-ref": "e09032f3295887d8", + "bom-ref": "770216de3b678f38", "name": "/usr/lib/udev/rules.d/80-drivers.rules", "type": "file" }, { - "bom-ref": "9ab24325fe8f51d8", + "bom-ref": "9896c739b055c2f0", "name": "/usr/lib/udev/rules.d/80-net-setup-link.rules", "type": "file" }, { - "bom-ref": "8364f4cd680d627b", + "bom-ref": "da90ad8bc8b651bf", "name": "/usr/lib/udev/rules.d/81-net-dhcp.rules", "type": "file" }, { - "bom-ref": "762d6e1e689a70fa", + "bom-ref": "a147c85cad321c0e", "name": "/usr/lib/udev/rules.d/90-iocost.rules", "type": "file" }, { - "bom-ref": "b7e8787563156dc2", + "bom-ref": "5f9421b7a1879efa", "name": "/usr/lib/udev/rules.d/90-iwpmd.rules", "type": "file" }, { - "bom-ref": "7232067353e87cef", + "bom-ref": "571ba6524cb0e5e3", "name": "/usr/lib/udev/rules.d/90-rdma-hw-modules.rules", "type": "file" }, { - "bom-ref": "7dc521267b5c9432", + "bom-ref": "cef965bda72f455e", "name": "/usr/lib/udev/rules.d/90-rdma-ulp-modules.rules", "type": "file" }, { - "bom-ref": "e08eccde18931b62", + "bom-ref": "78e6595ee969d3f2", "name": "/usr/lib/udev/rules.d/90-rdma-umad.rules", "type": "file" }, { - "bom-ref": "99bf9dddf5aedfb9", + "bom-ref": "98613dab7ecb8de3", "name": "/usr/lib/udev/rules.d/96-e2scrub.rules", "type": "file" }, { - "bom-ref": "2449535c8f3b77da", + "bom-ref": "261d32e108ccffa0", "name": "/usr/lib/udev/rules.d/99-systemd.rules", "type": "file" }, { - "bom-ref": "2274b45610a34c1c", + "bom-ref": "60ff1e4b95851ee4", "name": "/usr/lib/udev/scsi_id", "type": "file" }, { - "bom-ref": "6dc7d2d77b8f9af9", + "bom-ref": "837e1704f58b0a79", "name": "/usr/lib/udev/v4l_id", "type": "file" }, { - "bom-ref": "a172c26e89eaa06a", + "bom-ref": "83e9678118e24cce", "name": "/usr/lib/valgrind/python3.supp", "type": "file" }, { - "bom-ref": "c1d821c246f68977", + "bom-ref": "5bfcee600436f5e3", "name": "/usr/lib/x86_64-linux-gnu/Mcrt1.o", "type": "file" }, { - "bom-ref": "295aad93375942e8", + "bom-ref": "4ce4ab0e9ff8b8e8", "name": "/usr/lib/x86_64-linux-gnu/Scrt1.o", "type": "file" }, { - "bom-ref": "239e37e4f9b54363", + "bom-ref": "4a695f45660052f3", "name": "/usr/lib/x86_64-linux-gnu/audit/sotruss-lib.so", "type": "file" }, { - "bom-ref": "e5b59b7bc244338a", + "bom-ref": "7fc3dfe42e7b6ade", "name": "/usr/lib/x86_64-linux-gnu/bfd-plugins/libdep.so", "type": "file" }, { - "bom-ref": "82c6f71dd7d7b29f", + "bom-ref": "fbeddbb2eba2596f", "name": "/usr/lib/x86_64-linux-gnu/blas/libblas.so.3.12.0", "type": "file" }, { - "bom-ref": "b4f0d40803a34c3d", + "bom-ref": "719f00aeffa054d1", "name": "/usr/lib/x86_64-linux-gnu/caca/libgl_plugin.so.0.0.0", "type": "file" }, { - "bom-ref": "bde9333d3233411d", + "bom-ref": "e25fc2f3874661b9", "name": "/usr/lib/x86_64-linux-gnu/caca/libx11_plugin.so.0.0.0", "type": "file" }, { - "bom-ref": "bb82553e6431f78f", + "bom-ref": "8c7dd2d0110a8107", "name": "/usr/lib/x86_64-linux-gnu/cmake/expat-2.6.1/expat-config-version.cmake", "type": "file" }, { - "bom-ref": "658ad1762b8e088a", + "bom-ref": "42e6f819d9b93cba", "name": "/usr/lib/x86_64-linux-gnu/cmake/expat-2.6.1/expat-config.cmake", "type": "file" }, { - "bom-ref": "8f9b6e5f77788913", + "bom-ref": "406e9f1ff1540327", "name": "/usr/lib/x86_64-linux-gnu/cmake/expat-2.6.1/expat-noconfig.cmake", "type": "file" }, { - "bom-ref": "3856567ac0225fdd", + "bom-ref": "9aa88a72a398d00d", "name": "/usr/lib/x86_64-linux-gnu/cmake/expat-2.6.1/expat.cmake", "type": "file" }, { - "bom-ref": "f446d64017c02dcc", + "bom-ref": "f7a30fa06df71828", "name": "/usr/lib/x86_64-linux-gnu/crt1.o", "type": "file" }, { - "bom-ref": "ea90c4d4b98241f7", + "bom-ref": "20632bc8a227f817", "name": "/usr/lib/x86_64-linux-gnu/crti.o", "type": "file" }, { - "bom-ref": "6bc213720a91b132", + "bom-ref": "d6a25c67877fd6fa", "name": "/usr/lib/x86_64-linux-gnu/crtn.o", "type": "file" }, { - "bom-ref": "05c301a345b657ed", + "bom-ref": "fc0866f8d2827083", "name": "/usr/lib/x86_64-linux-gnu/cryptsetup/libcryptsetup-token-systemd-fido2.so", "type": "file" }, { - "bom-ref": "9d46acfaf92ae64e", + "bom-ref": "ea3d95e65d021690", "name": "/usr/lib/x86_64-linux-gnu/cryptsetup/libcryptsetup-token-systemd-pkcs11.so", "type": "file" }, { - "bom-ref": "8f862e6549b161f2", + "bom-ref": "3a84ce1482d3c138", "name": "/usr/lib/x86_64-linux-gnu/cryptsetup/libcryptsetup-token-systemd-tpm2.so", "type": "file" }, { - "bom-ref": "2230413151c76965", + "bom-ref": "ba8cfd30ba7a71ca", + "name": "/usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so", + "type": "file" + }, + { + "bom-ref": "d9cc17148349c56d", "name": "/usr/lib/x86_64-linux-gnu/dri/libdril_dri.so", "type": "file" }, { - "bom-ref": "a8bb313dc7cded57", + "bom-ref": "4379869dd4209bc9", "name": "/usr/lib/x86_64-linux-gnu/e2fsprogs/e2scrub_all_cron", "type": "file" }, { - "bom-ref": "d67d29b1140d9113", + "bom-ref": "e5bb04dc3ad2f841", "name": "/usr/lib/x86_64-linux-gnu/e2fsprogs/e2scrub_fail", "type": "file" }, { - "bom-ref": "a96ce4e45aca017c", + "bom-ref": "d9bb0237175b4f30", "name": "/usr/lib/x86_64-linux-gnu/engines-3/afalg.so", "type": "file" }, { - "bom-ref": "01d3759bb53446d7", + "bom-ref": "cb59e38c2995b5cf", "name": "/usr/lib/x86_64-linux-gnu/engines-3/loader_attic.so", "type": "file" }, { - "bom-ref": "1483242c138fb90a", + "bom-ref": "575296fed08b7392", "name": "/usr/lib/x86_64-linux-gnu/engines-3/padlock.so", "type": "file" }, { - "bom-ref": "068839d63d6a97e1", + "bom-ref": "525f316f1751a041", "name": "/usr/lib/x86_64-linux-gnu/gbm/dri_gbm.so", "type": "file" }, { - "bom-ref": "4d18f7aff5ad72b8", + "bom-ref": "6e3c2dc585111cba", "name": "/usr/lib/x86_64-linux-gnu/gconv/ANSI_X3.110.so", "type": "file" }, { - "bom-ref": "f28833d2a7d1d169", + "bom-ref": "7a5555673130fc3f", "name": "/usr/lib/x86_64-linux-gnu/gconv/ARMSCII-8.so", "type": "file" }, { - "bom-ref": "bc5061ad7210aca1", + "bom-ref": "9d1beae45fb79dd3", "name": "/usr/lib/x86_64-linux-gnu/gconv/ASMO_449.so", "type": "file" }, { - "bom-ref": "90cca5429ab13235", + "bom-ref": "40510e5c20249bbb", "name": "/usr/lib/x86_64-linux-gnu/gconv/BIG5.so", "type": "file" }, { - "bom-ref": "e7b1373377d244a1", + "bom-ref": "57280c23e4c726fb", "name": "/usr/lib/x86_64-linux-gnu/gconv/BIG5HKSCS.so", "type": "file" }, { - "bom-ref": "86f59c4520f0ef4c", + "bom-ref": "e3728a0f9897a37a", "name": "/usr/lib/x86_64-linux-gnu/gconv/BRF.so", "type": "file" }, { - "bom-ref": "609921067dc741d4", + "bom-ref": "55915a760a0d0362", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP10007.so", "type": "file" }, { - "bom-ref": "abaac45f3ef0c048", + "bom-ref": "f63eb56eb1899302", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1125.so", "type": "file" }, { - "bom-ref": "56921a4b02b1dacc", + "bom-ref": "e4d674305732c0a2", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1250.so", "type": "file" }, { - "bom-ref": "2ea90abfd9e30b2a", + "bom-ref": "26abc96a5d4b92f4", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1251.so", "type": "file" }, { - "bom-ref": "a37a3c082225a3ff", + "bom-ref": "05350aa115f8703d", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1252.so", "type": "file" }, { - "bom-ref": "5182a9650135c411", + "bom-ref": "57b646ac95a9e88b", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1253.so", "type": "file" }, { - "bom-ref": "2972eb4858b831d8", + "bom-ref": "eee9ddd645af3e16", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1254.so", "type": "file" }, { - "bom-ref": "2affdf2c83ff7e72", + "bom-ref": "453568a496a5fbd0", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1255.so", "type": "file" }, { - "bom-ref": "32f8cfdafce3e192", + "bom-ref": "9c50df755e4fede8", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1256.so", "type": "file" }, { - "bom-ref": "262338032f511bb1", + "bom-ref": "10ec9ff2e840a65f", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1257.so", "type": "file" }, { - "bom-ref": "0f14f9d154d4f678", + "bom-ref": "7e761e4f05407da2", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1258.so", "type": "file" }, { - "bom-ref": "2094d431e35aac6d", + "bom-ref": "2dc462943696bdcf", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP737.so", "type": "file" }, { - "bom-ref": "4e86d949370434f9", + "bom-ref": "c6d8ff2cdd791187", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP770.so", "type": "file" }, { - "bom-ref": "26888722eb55a023", + "bom-ref": "299a5d727382604d", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP771.so", "type": "file" }, { - "bom-ref": "f6b9784712cb728b", + "bom-ref": "509b9c63885538a1", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP772.so", "type": "file" }, { - "bom-ref": "365330919f41624e", + "bom-ref": "eb8be6e1a0a5f08c", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP773.so", "type": "file" }, { - "bom-ref": "e833a092810d21dc", + "bom-ref": "43ecdcc10a84a05a", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP774.so", "type": "file" }, { - "bom-ref": "57e42690473df1d5", + "bom-ref": "89f735d79e447d5f", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP775.so", "type": "file" }, { - "bom-ref": "a2afceef604e6d05", + "bom-ref": "730be0d14acc2cd7", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP932.so", "type": "file" }, { - "bom-ref": "19e0f5d60667e5c5", + "bom-ref": "95f29dd29f07356f", "name": "/usr/lib/x86_64-linux-gnu/gconv/CSN_369103.so", "type": "file" }, { - "bom-ref": "0ea8e31f6041d348", + "bom-ref": "901efa7bc5ef8dba", "name": "/usr/lib/x86_64-linux-gnu/gconv/CWI.so", "type": "file" }, { - "bom-ref": "3ccbbfa81e58ed60", + "bom-ref": "ac9b5743af0d2786", "name": "/usr/lib/x86_64-linux-gnu/gconv/DEC-MCS.so", "type": "file" }, { - "bom-ref": "3080f7f264e2d5a6", + "bom-ref": "f4571085d2f2a44c", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-AT-DE-A.so", "type": "file" }, { - "bom-ref": "8db3de8dfeaad600", + "bom-ref": "0a291e823d83ee92", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-AT-DE.so", "type": "file" }, { - "bom-ref": "096aea1e9d44b8bb", + "bom-ref": "b99386b85edadba5", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-CA-FR.so", "type": "file" }, { - "bom-ref": "261c6e5d6c4d2e15", + "bom-ref": "d9a579976d69436f", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-DK-NO-A.so", "type": "file" }, { - "bom-ref": "ae1c01cd4c919a02", + "bom-ref": "97bbc9eb434e1404", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-DK-NO.so", "type": "file" }, { - "bom-ref": "49be48f4c4162748", + "bom-ref": "44807ed90e453c12", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-ES-A.so", "type": "file" }, { - "bom-ref": "953a2048bcb0fb96", + "bom-ref": "64724233b1a6cf3c", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-ES-S.so", "type": "file" }, { - "bom-ref": "f8395299c8facd4c", + "bom-ref": "ea56b783b3d1d2c6", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-ES.so", "type": "file" }, { - "bom-ref": "8266f38e231e3e42", + "bom-ref": "6491bf11a56b5d58", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-FI-SE-A.so", "type": "file" }, { - "bom-ref": "5e20fb20afdec352", + "bom-ref": "dceaa7f3bcdad734", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-FI-SE.so", "type": "file" }, { - "bom-ref": "5231c0efe8b31472", + "bom-ref": "4fa843ba769917ac", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-FR.so", "type": "file" }, { - "bom-ref": "4e7112e139a93fb7", + "bom-ref": "01ffb6eb25f34209", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-IS-FRISS.so", "type": "file" }, { - "bom-ref": "8004658cca4ccd18", + "bom-ref": "960a915bd84c983a", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-IT.so", "type": "file" }, { - "bom-ref": "6c08f7cff4557174", + "bom-ref": "37c4181e69fe1c0a", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-PT.so", "type": "file" }, { - "bom-ref": "d51c3032aa188cff", + "bom-ref": "7f8f0eaf8eea8f49", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-UK.so", "type": "file" }, { - "bom-ref": "8cf653e242417d90", + "bom-ref": "c3083f46983601aa", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-US.so", "type": "file" }, { - "bom-ref": "a03aaf1a139ec704", + "bom-ref": "982aab7fafea3b3e", "name": "/usr/lib/x86_64-linux-gnu/gconv/ECMA-CYRILLIC.so", "type": "file" }, { - "bom-ref": "dde5df18400300e3", + "bom-ref": "7952febd93f8ae95", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-CN.so", "type": "file" }, { - "bom-ref": "f5d5ed96663ee9ef", + "bom-ref": "0101f5f210029eb5", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-JISX0213.so", "type": "file" }, { - "bom-ref": "72912c148b33bf4c", + "bom-ref": "bc3143a404317d1a", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-JP-MS.so", "type": "file" }, { - "bom-ref": "bf2011212b57a265", + "bom-ref": "245f0aa73e734eab", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-JP.so", "type": "file" }, { - "bom-ref": "3e35702bed526f2a", + "bom-ref": "13ce77fb5dc51d68", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-KR.so", "type": "file" }, { - "bom-ref": "1eef9a18bed68bea", + "bom-ref": "a07d871c6844c020", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-TW.so", "type": "file" }, { - "bom-ref": "7ad46f0b2fa08266", + "bom-ref": "1453d0c967c83614", "name": "/usr/lib/x86_64-linux-gnu/gconv/GB18030.so", "type": "file" }, { - "bom-ref": "2ec8732fc081709e", + "bom-ref": "9f12fb44fdc648a4", "name": "/usr/lib/x86_64-linux-gnu/gconv/GBBIG5.so", "type": "file" }, { - "bom-ref": "876e0ca529fd4970", + "bom-ref": "96dded1882997522", "name": "/usr/lib/x86_64-linux-gnu/gconv/GBGBK.so", "type": "file" }, { - "bom-ref": "b253d66f87296dd2", + "bom-ref": "c1afd5c158da8a98", "name": "/usr/lib/x86_64-linux-gnu/gconv/GBK.so", "type": "file" }, { - "bom-ref": "4f4595cb2683b349", + "bom-ref": "f5090bc4683efddf", "name": "/usr/lib/x86_64-linux-gnu/gconv/GEORGIAN-ACADEMY.so", "type": "file" }, { - "bom-ref": "cb023dc7607549f3", + "bom-ref": "31f2d323d8626479", "name": "/usr/lib/x86_64-linux-gnu/gconv/GEORGIAN-PS.so", "type": "file" }, { - "bom-ref": "bd64d646fdfd5543", + "bom-ref": "e4876f2ed39d1f6d", "name": "/usr/lib/x86_64-linux-gnu/gconv/GOST_19768-74.so", "type": "file" }, { - "bom-ref": "d89bcb5db82a6298", + "bom-ref": "1628a48804b1fdae", "name": "/usr/lib/x86_64-linux-gnu/gconv/GREEK-CCITT.so", "type": "file" }, { - "bom-ref": "164eeb89ff38497b", + "bom-ref": "0502143913409f15", "name": "/usr/lib/x86_64-linux-gnu/gconv/GREEK7-OLD.so", "type": "file" }, { - "bom-ref": "cd0c7f40b1df1170", + "bom-ref": "87b6c4f5c4fe2c8e", "name": "/usr/lib/x86_64-linux-gnu/gconv/GREEK7.so", "type": "file" }, { - "bom-ref": "98f5324f39f34491", + "bom-ref": "9ccdb496ccc083fb", "name": "/usr/lib/x86_64-linux-gnu/gconv/HP-GREEK8.so", "type": "file" }, { - "bom-ref": "366937059da18fd7", + "bom-ref": "420f2ddad4931e09", "name": "/usr/lib/x86_64-linux-gnu/gconv/HP-ROMAN8.so", "type": "file" }, { - "bom-ref": "778d42d9e4398ec8", + "bom-ref": "2adf5c07a644b16e", "name": "/usr/lib/x86_64-linux-gnu/gconv/HP-ROMAN9.so", "type": "file" }, { - "bom-ref": "c4b17fd3f5e81f04", + "bom-ref": "07a10b56bd616c6a", "name": "/usr/lib/x86_64-linux-gnu/gconv/HP-THAI8.so", "type": "file" }, { - "bom-ref": "80e3a47d11f42e66", + "bom-ref": "78c689714cc8ac24", "name": "/usr/lib/x86_64-linux-gnu/gconv/HP-TURKISH8.so", "type": "file" }, { - "bom-ref": "85ad95ec4a0e1541", + "bom-ref": "2e13d80fb4c867bf", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM037.so", "type": "file" }, { - "bom-ref": "cfafd0d28f4b46f2", + "bom-ref": "ab8ce59d1ca2a908", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM038.so", "type": "file" }, { - "bom-ref": "41c0d259a37231b5", + "bom-ref": "fbf21a4210c5af7f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1004.so", "type": "file" }, { - "bom-ref": "367d9259ca9a4aed", + "bom-ref": "cfce00b212c0d66f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1008.so", "type": "file" }, { - "bom-ref": "7e09582221a29fa0", + "bom-ref": "66364aee04ae176e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1008_420.so", "type": "file" }, { - "bom-ref": "2e00cb7127a2f1b6", + "bom-ref": "fcf17425356a5144", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1025.so", "type": "file" }, { - "bom-ref": "7a7c15062745670d", + "bom-ref": "06bfe32f645b935f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1026.so", "type": "file" }, { - "bom-ref": "62e577a8929ec3e1", + "bom-ref": "19c932ccd62d9147", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1046.so", "type": "file" }, { - "bom-ref": "c0b848306877dba0", + "bom-ref": "c8050584279f0e02", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1047.so", "type": "file" }, { - "bom-ref": "cc197f333d818636", + "bom-ref": "2789a116df54d590", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1097.so", "type": "file" }, { - "bom-ref": "bfd7ec31b271db16", + "bom-ref": "19e4344f186de870", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1112.so", "type": "file" }, { - "bom-ref": "ad679df873048ec9", + "bom-ref": "42c456da1e223327", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1122.so", "type": "file" }, { - "bom-ref": "d5e65c4725f3c0dc", + "bom-ref": "ec0a2b4fd32e6e52", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1123.so", "type": "file" }, { - "bom-ref": "7f609241a341d493", + "bom-ref": "2439be6ee34ddea1", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1124.so", "type": "file" }, { - "bom-ref": "dd531a9ffef356e7", + "bom-ref": "84abe949c6f754d5", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1129.so", "type": "file" }, { - "bom-ref": "0eb839ee6d61f24b", + "bom-ref": "527b3cc2c73d29b9", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1130.so", "type": "file" }, { - "bom-ref": "6fc145382afda56f", + "bom-ref": "70d902f57f7591cd", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1132.so", "type": "file" }, { - "bom-ref": "35da4a2bccab045f", + "bom-ref": "1d6b251b2020a0c1", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1133.so", "type": "file" }, { - "bom-ref": "18d61378d8a2f5c4", + "bom-ref": "3ff3d9053c0cf6c6", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1137.so", "type": "file" }, { - "bom-ref": "bfabc59806306c53", + "bom-ref": "8507ac3fb6e8dbf1", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1140.so", "type": "file" }, { - "bom-ref": "3299cd91076e3cc8", + "bom-ref": "028ea42e103a4f36", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1141.so", "type": "file" }, { - "bom-ref": "b0b28d82d45d44f7", + "bom-ref": "713c5f2d4936b2d5", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1142.so", "type": "file" }, { - "bom-ref": "807e21346b85390c", + "bom-ref": "43cffb920edb76ca", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1143.so", "type": "file" }, { - "bom-ref": "d1b4e3ebc7789a33", + "bom-ref": "d3cc2ed203e632d1", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1144.so", "type": "file" }, { - "bom-ref": "b8ddbf1e87cb3405", + "bom-ref": "e0596a8b9b26c80f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1145.so", "type": "file" }, { - "bom-ref": "b8357075bd4d3ba2", + "bom-ref": "92914e46bb51a604", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1146.so", "type": "file" }, { - "bom-ref": "0c7f1d32e0b8a9ec", + "bom-ref": "67076ebf01ed4fce", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1147.so", "type": "file" }, { - "bom-ref": "f89d70b0b8c92631", + "bom-ref": "0d39804d71caad53", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1148.so", "type": "file" }, { - "bom-ref": "95b41c8fc34ee4d5", + "bom-ref": "ad1dcda8cee4b3c7", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1149.so", "type": "file" }, { - "bom-ref": "ffcd7b4309d26c63", + "bom-ref": "6186b61b7ec62a69", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1153.so", "type": "file" }, { - "bom-ref": "ef06dfdd6a768a9d", + "bom-ref": "8bbe550d21436bd7", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1154.so", "type": "file" }, { - "bom-ref": "9dc6b6bc4849e152", + "bom-ref": "d45176235e8ad4c8", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1155.so", "type": "file" }, { - "bom-ref": "cf0d96e126e35ce4", + "bom-ref": "cb03a0d73e6e200e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1156.so", "type": "file" }, { - "bom-ref": "c7a3759e6ba340d8", + "bom-ref": "26125c0ba8bff80e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1157.so", "type": "file" }, { - "bom-ref": "60d5ad00f3ef20b3", + "bom-ref": "2e872042df503f81", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1158.so", "type": "file" }, { - "bom-ref": "022589a886d0f247", + "bom-ref": "ef711e8e377c4e11", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1160.so", "type": "file" }, { - "bom-ref": "582b83132061e761", + "bom-ref": "3f9ce73ffc4bf2c7", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1161.so", "type": "file" }, { - "bom-ref": "78eaf79be3e0ed94", + "bom-ref": "9e046b627b556eb6", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1162.so", "type": "file" }, { - "bom-ref": "1fe1ee0c5e417e26", + "bom-ref": "1fa7ce2cf0855570", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1163.so", "type": "file" }, { - "bom-ref": "28277171bb0dc9a8", + "bom-ref": "f50a14ddebc4a132", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1164.so", "type": "file" }, { - "bom-ref": "86f324f062caa915", + "bom-ref": "ac1fa6ca2588d037", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1166.so", "type": "file" }, { - "bom-ref": "d56eaf257eb6c0a4", + "bom-ref": "4168faab1f9a57ae", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1167.so", "type": "file" }, { - "bom-ref": "3944dc56bb9b4195", + "bom-ref": "f80009913f8e51db", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM12712.so", "type": "file" }, { - "bom-ref": "cf293c10c806b693", + "bom-ref": "6248ba0be1af18d9", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1364.so", "type": "file" }, { - "bom-ref": "04247efce2922f7d", + "bom-ref": "5d4d9323c7685e97", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1371.so", "type": "file" }, { - "bom-ref": "f10042170dfaa3e9", + "bom-ref": "5d0e58a9716145e7", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1388.so", "type": "file" }, { - "bom-ref": "12e5a6eb3435f57c", + "bom-ref": "0cce79258fcf6dba", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1390.so", "type": "file" }, { - "bom-ref": "34ca3391a2c56c28", + "bom-ref": "9b7e3f9f1a30a92e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1399.so", "type": "file" }, { - "bom-ref": "69782260c1a48332", + "bom-ref": "62a4a19acd3d40c8", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM16804.so", "type": "file" }, { - "bom-ref": "a34cc266d21d4f09", + "bom-ref": "3a2e82809134b6f7", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM256.so", "type": "file" }, { - "bom-ref": "7d50e4852052ce42", + "bom-ref": "4e248d164607b380", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM273.so", "type": "file" }, { - "bom-ref": "d59b3cbfdccee7f6", + "bom-ref": "48d572d72c23b7a4", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM274.so", "type": "file" }, { - "bom-ref": "53247fbe0a66b68b", + "bom-ref": "6c25b5c8647428ad", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM275.so", "type": "file" }, { - "bom-ref": "57c18111c2782d9a", + "bom-ref": "56c71f6e607f50c0", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM277.so", "type": "file" }, { - "bom-ref": "92c73556826c0ff9", + "bom-ref": "d999c043e18fe583", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM278.so", "type": "file" }, { - "bom-ref": "0fe57ccc10f76e25", + "bom-ref": "9190095b8d08f61b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM280.so", "type": "file" }, { - "bom-ref": "9894c10c0289ca49", + "bom-ref": "77728c4ddefc3cef", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM281.so", "type": "file" }, { - "bom-ref": "1b842e38128bc258", + "bom-ref": "e0777b3020c101f2", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM284.so", "type": "file" }, { - "bom-ref": "5cd8729762e129c6", + "bom-ref": "a840604dbb1dd5ec", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM285.so", "type": "file" }, { - "bom-ref": "488cbd5171a2c51f", + "bom-ref": "164b92d2cf8a6c9d", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM290.so", "type": "file" }, { - "bom-ref": "86d4adde528d3324", + "bom-ref": "476edbf596edd12e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM297.so", "type": "file" }, { - "bom-ref": "97c0eed51858b0c8", + "bom-ref": "90580a7bd9880fde", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM420.so", "type": "file" }, { - "bom-ref": "f349a1e2c1490c9f", + "bom-ref": "6f9fb372cebc1aa1", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM423.so", "type": "file" }, { - "bom-ref": "9408720c778cac6d", + "bom-ref": "5380fc00668861f7", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM424.so", "type": "file" }, { - "bom-ref": "84be970082cc9889", + "bom-ref": "acd333612eb54d5f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM437.so", "type": "file" }, { - "bom-ref": "f6a8e0ec5e9f09e3", + "bom-ref": "3bed9d830764db2d", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM4517.so", "type": "file" }, { - "bom-ref": "dfd155d84f7e9037", + "bom-ref": "4d0827872d0b952d", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM4899.so", "type": "file" }, { - "bom-ref": "1602d51cb6c857a6", + "bom-ref": "3ad7915230740b48", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM4909.so", "type": "file" }, { - "bom-ref": "89fbf6a94a49cef5", + "bom-ref": "cac36e05d91da55b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM4971.so", "type": "file" }, { - "bom-ref": "f74b7c347575b97c", + "bom-ref": "67175c2f83a99d66", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM500.so", "type": "file" }, { - "bom-ref": "c3578c7ef2609734", + "bom-ref": "46532a4665f49fea", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM5347.so", "type": "file" }, { - "bom-ref": "c3661cda62b9ea13", + "bom-ref": "18b9870d25a76aa1", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM803.so", "type": "file" }, { - "bom-ref": "947ff3010c9ff299", + "bom-ref": "00f03649e35a1657", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM850.so", "type": "file" }, { - "bom-ref": "aca0177e59d03bd6", + "bom-ref": "9dc940bd0f20ce1c", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM851.so", "type": "file" }, { - "bom-ref": "4d10666f46ad3f11", + "bom-ref": "cdb262f35da3ca43", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM852.so", "type": "file" }, { - "bom-ref": "4dbc4f7c74f73532", + "bom-ref": "e0fa7296795f53ec", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM855.so", "type": "file" }, { - "bom-ref": "7bea3f5217d304aa", + "bom-ref": "3e396b3952c0a018", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM856.so", "type": "file" }, { - "bom-ref": "21e8a058763224f0", + "bom-ref": "b9e2ee63779e79b6", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM857.so", "type": "file" }, { - "bom-ref": "de39fb2fd1732827", + "bom-ref": "3024cc47d49f08d5", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM858.so", "type": "file" }, { - "bom-ref": "173fa49691bb7377", + "bom-ref": "0248dd9555dd521d", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM860.so", "type": "file" }, { - "bom-ref": "c7b86a21f4c8a7dc", + "bom-ref": "d511b39998a3e5b2", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM861.so", "type": "file" }, { - "bom-ref": "cdc7f019d8d1a6a5", + "bom-ref": "aa1501c658b95783", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM862.so", "type": "file" }, { - "bom-ref": "6fa91b5b989fb408", + "bom-ref": "af74aabb8680d976", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM863.so", "type": "file" }, { - "bom-ref": "f8626b96c602f552", + "bom-ref": "31ed35785b05e2ec", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM864.so", "type": "file" }, { - "bom-ref": "658668dcad534715", + "bom-ref": "5bddc63ea1176753", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM865.so", "type": "file" }, { - "bom-ref": "8980214c3b531de3", + "bom-ref": "16b875b4973acb61", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM866.so", "type": "file" }, { - "bom-ref": "c3bcac39c8548eda", + "bom-ref": "9ca10a1a26ea5e64", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM866NAV.so", "type": "file" }, { - "bom-ref": "8e96257f2c0fd36a", + "bom-ref": "3bfa9129f1760a34", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM868.so", "type": "file" }, { - "bom-ref": "4407a124cd43c5bc", + "bom-ref": "a415ff867dd06d4e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM869.so", "type": "file" }, { - "bom-ref": "ba47d34b0a7fe35d", + "bom-ref": "8976821e76073ddb", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM870.so", "type": "file" }, { - "bom-ref": "010de9f578d5ee52", + "bom-ref": "41448aa2860670e8", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM871.so", "type": "file" }, { - "bom-ref": "af30cb27a5102d45", + "bom-ref": "794bbfd4b50303eb", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM874.so", "type": "file" }, { - "bom-ref": "6c42efe1e888be3a", + "bom-ref": "bb60a2e48aca416c", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM875.so", "type": "file" }, { - "bom-ref": "b0a624728d36c357", + "bom-ref": "d40312a5f141845d", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM880.so", "type": "file" }, { - "bom-ref": "23e80a9980971cf8", + "bom-ref": "6fdc2064c5c67eea", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM891.so", "type": "file" }, { - "bom-ref": "15d1e08c90d8b456", + "bom-ref": "c3570d88bdc22c3c", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM901.so", "type": "file" }, { - "bom-ref": "4044ac32485711eb", + "bom-ref": "5a70b77e71a1a1fd", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM902.so", "type": "file" }, { - "bom-ref": "132f1e001e8c72e8", + "bom-ref": "10273dedc7c1c026", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM903.so", "type": "file" }, { - "bom-ref": "2a21258813ca0c01", + "bom-ref": "31bb1a851cffb2b7", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM9030.so", "type": "file" }, { - "bom-ref": "5e2c70f5ccccb6d4", + "bom-ref": "13afe3488d52a4f6", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM904.so", "type": "file" }, { - "bom-ref": "d90837905adb16a1", + "bom-ref": "27e5d427f9554ec7", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM905.so", "type": "file" }, { - "bom-ref": "11ac86915bbe684d", + "bom-ref": "b9ce324d30eef803", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM9066.so", "type": "file" }, { - "bom-ref": "e7335bd8cd8a818d", + "bom-ref": "912ae2531f176c87", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM918.so", "type": "file" }, { - "bom-ref": "2a8baa866d4411bc", + "bom-ref": "b95c9dadba3db1ca", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM921.so", "type": "file" }, { - "bom-ref": "3a6f25f8e6c993be", + "bom-ref": "7b69d309f2cb393c", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM922.so", "type": "file" }, { - "bom-ref": "6e25c0edc5be333d", + "bom-ref": "88ec91f5b815e91b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM930.so", "type": "file" }, { - "bom-ref": "27b9609300aefbca", + "bom-ref": "38bd2c6ae68268ac", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM932.so", "type": "file" }, { - "bom-ref": "c386e55c2a5d9ff3", + "bom-ref": "911b3e8eda408301", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM933.so", "type": "file" }, { - "bom-ref": "4f3e7488f6bcbf25", + "bom-ref": "cc4a538b9427f0eb", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM935.so", "type": "file" }, { - "bom-ref": "394d152a703c30c0", + "bom-ref": "0f705042a857a27a", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM937.so", "type": "file" }, { - "bom-ref": "de6d0bc41b74ea4b", + "bom-ref": "ad325b307c469f1d", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM939.so", "type": "file" }, { - "bom-ref": "1feb19e49ab18d59", + "bom-ref": "e0010c48c0c9a07f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM943.so", "type": "file" }, { - "bom-ref": "5f099c9dc62bdfa7", + "bom-ref": "e674acbb4c629571", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM9448.so", "type": "file" }, { - "bom-ref": "aaed892507509418", + "bom-ref": "284910387d5e0456", "name": "/usr/lib/x86_64-linux-gnu/gconv/IEC_P27-1.so", "type": "file" }, { - "bom-ref": "1c04e804add322c4", + "bom-ref": "c5dae21bd0cfe5d6", "name": "/usr/lib/x86_64-linux-gnu/gconv/INIS-8.so", "type": "file" }, { - "bom-ref": "66b8e9f3239a04dc", + "bom-ref": "72bf507fd2778b1a", "name": "/usr/lib/x86_64-linux-gnu/gconv/INIS-CYRILLIC.so", "type": "file" }, { - "bom-ref": "bc9804ef5c49986c", + "bom-ref": "70084c7b0c32648a", "name": "/usr/lib/x86_64-linux-gnu/gconv/INIS.so", "type": "file" }, { - "bom-ref": "9950fd49682a1b0c", + "bom-ref": "51270ef01aa0f46a", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISIRI-3342.so", "type": "file" }, { - "bom-ref": "4dfcb2c4cc5e265f", + "bom-ref": "3ec2cf38f9328269", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-2022-CN-EXT.so", "type": "file" }, { - "bom-ref": "f241110d6949f607", + "bom-ref": "40e691c37325c905", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-2022-CN.so", "type": "file" }, { - "bom-ref": "4e36b3a001cc88bb", + "bom-ref": "1a2119fdaa57f029", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-2022-JP-3.so", "type": "file" }, { - "bom-ref": "24a3888e0d83e0af", + "bom-ref": "81f75d83e31bca1d", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-2022-JP.so", "type": "file" }, { - "bom-ref": "d03422a940223ba2", + "bom-ref": "ec62f6a3a8407320", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-2022-KR.so", "type": "file" }, { - "bom-ref": "ee3af23bea6d3a0c", + "bom-ref": "df75336a1eb5afba", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-IR-197.so", "type": "file" }, { - "bom-ref": "f62006e57a9e032a", + "bom-ref": "39b64b60e70c9da0", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-IR-209.so", "type": "file" }, { - "bom-ref": "f16532a27734b3d2", + "bom-ref": "dbb2dc6742078e7c", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO646.so", "type": "file" }, { - "bom-ref": "60a2e709ba1012fb", + "bom-ref": "849b8d1f713df271", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-1.so", "type": "file" }, { - "bom-ref": "0ea3386649561dc3", + "bom-ref": "6f2950734ed23685", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-10.so", "type": "file" }, { - "bom-ref": "24c90aad506b2107", + "bom-ref": "35bf743a20f39c29", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-11.so", "type": "file" }, { - "bom-ref": "f5fce330c15c249c", + "bom-ref": "48b28c5094e48d72", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-13.so", "type": "file" }, { - "bom-ref": "e52d0095753ec5ab", + "bom-ref": "598b86afd6b3c565", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-14.so", "type": "file" }, { - "bom-ref": "18bcd8baa2d02d4b", + "bom-ref": "d253613fa64d9ed5", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-15.so", "type": "file" }, { - "bom-ref": "f2085575bcf5b3b8", + "bom-ref": "ec4f3b6d798ce482", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-16.so", "type": "file" }, { - "bom-ref": "73f37dab5383dd3b", + "bom-ref": "8ce3fecc03bcd0e1", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-2.so", "type": "file" }, { - "bom-ref": "0260f86aa60da6c1", + "bom-ref": "10181ea2d0c1ea57", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-3.so", "type": "file" }, { - "bom-ref": "7f00637e72c278fe", + "bom-ref": "ea0a626d9dccedd8", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-4.so", "type": "file" }, { - "bom-ref": "920107647e4118c3", + "bom-ref": "fe716eeccd4382f5", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-5.so", "type": "file" }, { - "bom-ref": "cee445c16cf98a75", + "bom-ref": "4befb281d631e8f7", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-6.so", "type": "file" }, { - "bom-ref": "5c6fe190e8212b4d", + "bom-ref": "4514da8caa495483", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-7.so", "type": "file" }, { - "bom-ref": "6932ff6893e4da2f", + "bom-ref": "67b947c6385d9141", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-8.so", "type": "file" }, { - "bom-ref": "00633d57e4eaa07c", + "bom-ref": "51c6743be5ddb3da", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-9.so", "type": "file" }, { - "bom-ref": "5466a19b320ca6c9", + "bom-ref": "79e2da14e5ae6adf", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-9E.so", "type": "file" }, { - "bom-ref": "a75d56232fd9b0d9", + "bom-ref": "9e73326ef06e2d77", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_10367-BOX.so", "type": "file" }, { - "bom-ref": "484457a22a4f08cd", + "bom-ref": "0ed2b86fd1fbc19f", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_11548-1.so", "type": "file" }, { - "bom-ref": "a2d7a8e667536556", + "bom-ref": "4b84371950b541e4", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_2033.so", "type": "file" }, { - "bom-ref": "9c0b90aa8c7e6979", + "bom-ref": "23750dfdf8ef76cf", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_5427-EXT.so", "type": "file" }, { - "bom-ref": "2d706492d01b6bf8", + "bom-ref": "d5d7595d7caa0032", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_5427.so", "type": "file" }, { - "bom-ref": "d088067276bdbbe3", + "bom-ref": "786fa62e047d5a79", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_5428.so", "type": "file" }, { - "bom-ref": "c602d66b8d0df43a", + "bom-ref": "fa4370927d9c5880", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_6937-2.so", "type": "file" }, { - "bom-ref": "7038afdc78836170", + "bom-ref": "f184597556583ffa", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_6937.so", "type": "file" }, { - "bom-ref": "2dc7d1bbcb810cc6", + "bom-ref": "7a8107c5d6aa4ea4", "name": "/usr/lib/x86_64-linux-gnu/gconv/JOHAB.so", "type": "file" }, { - "bom-ref": "4ccae5349961db74", + "bom-ref": "fe4cd8bd3237dfae", "name": "/usr/lib/x86_64-linux-gnu/gconv/KOI-8.so", "type": "file" }, { - "bom-ref": "56c91cc0723fd889", + "bom-ref": "eefb96ae095c7363", "name": "/usr/lib/x86_64-linux-gnu/gconv/KOI8-R.so", "type": "file" }, { - "bom-ref": "93b1f3a3095ffa21", + "bom-ref": "904931cc17540857", "name": "/usr/lib/x86_64-linux-gnu/gconv/KOI8-RU.so", "type": "file" }, { - "bom-ref": "4309cde1acb3eb7d", + "bom-ref": "90c0f3816e9e0ee7", "name": "/usr/lib/x86_64-linux-gnu/gconv/KOI8-T.so", "type": "file" }, { - "bom-ref": "41670d218afe335b", + "bom-ref": "97bf65ec66aa12b1", "name": "/usr/lib/x86_64-linux-gnu/gconv/KOI8-U.so", "type": "file" }, { - "bom-ref": "b4bab184ae5c336e", + "bom-ref": "89f89cde08318dac", "name": "/usr/lib/x86_64-linux-gnu/gconv/LATIN-GREEK-1.so", "type": "file" }, { - "bom-ref": "585e693f0da50a59", + "bom-ref": "952b59db0c2d39d7", "name": "/usr/lib/x86_64-linux-gnu/gconv/LATIN-GREEK.so", "type": "file" }, { - "bom-ref": "fc853711920d24b3", + "bom-ref": "77b9ace33ea67dbd", "name": "/usr/lib/x86_64-linux-gnu/gconv/MAC-CENTRALEUROPE.so", "type": "file" }, { - "bom-ref": "535b0783a865cce6", + "bom-ref": "0d40e91f3d1e1ee0", "name": "/usr/lib/x86_64-linux-gnu/gconv/MAC-IS.so", "type": "file" }, { - "bom-ref": "d2e3379b2363b0c5", + "bom-ref": "4a1ff6b7fb4e07ef", "name": "/usr/lib/x86_64-linux-gnu/gconv/MAC-SAMI.so", "type": "file" }, { - "bom-ref": "74d03766e509b3fa", + "bom-ref": "0cada836d7c0fd68", "name": "/usr/lib/x86_64-linux-gnu/gconv/MAC-UK.so", "type": "file" }, { - "bom-ref": "9ca36c44fc4cd06f", + "bom-ref": "d0c36ca9d653a371", "name": "/usr/lib/x86_64-linux-gnu/gconv/MACINTOSH.so", "type": "file" }, { - "bom-ref": "606caed599afc73e", + "bom-ref": "8f4a736ff9f97fb8", "name": "/usr/lib/x86_64-linux-gnu/gconv/MIK.so", "type": "file" }, { - "bom-ref": "eb57a7b25633ebb4", + "bom-ref": "1e598c36c0c936ee", "name": "/usr/lib/x86_64-linux-gnu/gconv/NATS-DANO.so", "type": "file" }, { - "bom-ref": "70adfa6771328c14", + "bom-ref": "538632e89d81935a", "name": "/usr/lib/x86_64-linux-gnu/gconv/NATS-SEFI.so", "type": "file" }, { - "bom-ref": "7a00020813f7b16e", + "bom-ref": "4742da9ec31fa334", "name": "/usr/lib/x86_64-linux-gnu/gconv/PT154.so", "type": "file" }, { - "bom-ref": "c22cb728d39f4de5", + "bom-ref": "54ecb805fd24acc7", "name": "/usr/lib/x86_64-linux-gnu/gconv/RK1048.so", "type": "file" }, { - "bom-ref": "b995071e3e1988d2", + "bom-ref": "03269d7f116e15e4", "name": "/usr/lib/x86_64-linux-gnu/gconv/SAMI-WS2.so", "type": "file" }, { - "bom-ref": "35c14f484957e2bd", + "bom-ref": "3377941e59d38a67", "name": "/usr/lib/x86_64-linux-gnu/gconv/SHIFT_JISX0213.so", "type": "file" }, { - "bom-ref": "fb966a3a2fb4c3e7", + "bom-ref": "13ac7161047f4efd", "name": "/usr/lib/x86_64-linux-gnu/gconv/SJIS.so", "type": "file" }, { - "bom-ref": "00ac04c4a4b09b05", + "bom-ref": "26b090f9900c26c3", "name": "/usr/lib/x86_64-linux-gnu/gconv/T.61.so", "type": "file" }, { - "bom-ref": "bcd816a211363d66", + "bom-ref": "99ddc9859711cdf8", "name": "/usr/lib/x86_64-linux-gnu/gconv/TCVN5712-1.so", "type": "file" }, { - "bom-ref": "60ce18ecf3962ab1", + "bom-ref": "94622e387871e533", "name": "/usr/lib/x86_64-linux-gnu/gconv/TIS-620.so", "type": "file" }, { - "bom-ref": "327a8670375e8693", + "bom-ref": "59395d89a99500ed", "name": "/usr/lib/x86_64-linux-gnu/gconv/TSCII.so", "type": "file" }, { - "bom-ref": "31bc84af9e7b2944", + "bom-ref": "5f594c05fc5b7b92", "name": "/usr/lib/x86_64-linux-gnu/gconv/UHC.so", "type": "file" }, { - "bom-ref": "09a5aa6256469820", + "bom-ref": "5f0af57eefdec9a6", "name": "/usr/lib/x86_64-linux-gnu/gconv/UNICODE.so", "type": "file" }, { - "bom-ref": "a2e6a4fd11425965", + "bom-ref": "a8fee471d3171d13", "name": "/usr/lib/x86_64-linux-gnu/gconv/UTF-16.so", "type": "file" }, { - "bom-ref": "4c3a7d19675cd40a", + "bom-ref": "b9d0161a349e2268", "name": "/usr/lib/x86_64-linux-gnu/gconv/UTF-32.so", "type": "file" }, { - "bom-ref": "137f58155f1e7851", + "bom-ref": "596a7e853d66a333", "name": "/usr/lib/x86_64-linux-gnu/gconv/UTF-7.so", "type": "file" }, { - "bom-ref": "e47bbcd7d6dd2ed2", + "bom-ref": "c6697335f80d178c", "name": "/usr/lib/x86_64-linux-gnu/gconv/VISCII.so", "type": "file" }, { - "bom-ref": "89802babce8a43d2", + "bom-ref": "56b93bf196ec28a8", "name": "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules", "type": "file" }, { - "bom-ref": "eb60e21e905cea95", + "bom-ref": "84a0ef51d5b96063", "name": "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", "type": "file" }, { - "bom-ref": "743e7fce172e48ac", + "bom-ref": "5eb3ed87fdc946f2", "name": "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.d/gconv-modules-extra.conf", "type": "file" }, { - "bom-ref": "2dca733654490fe0", + "bom-ref": "669dab4c84673132", "name": "/usr/lib/x86_64-linux-gnu/gconv/libCNS.so", "type": "file" }, { - "bom-ref": "288b5c58467d7836", + "bom-ref": "81bc31feecef9774", "name": "/usr/lib/x86_64-linux-gnu/gconv/libGB.so", "type": "file" }, { - "bom-ref": "08357844091c6909", + "bom-ref": "34fbe9cdb196ebb7", "name": "/usr/lib/x86_64-linux-gnu/gconv/libISOIR165.so", "type": "file" }, { - "bom-ref": "72b7970a4c6975ac", + "bom-ref": "15f5230cc867bb7a", "name": "/usr/lib/x86_64-linux-gnu/gconv/libJIS.so", "type": "file" }, { - "bom-ref": "0f6ea3fd1fb3cfff", + "bom-ref": "376c983461097299", "name": "/usr/lib/x86_64-linux-gnu/gconv/libJISX0213.so", "type": "file" }, { - "bom-ref": "dca30a0b029a0501", + "bom-ref": "14ec0774da7d6967", "name": "/usr/lib/x86_64-linux-gnu/gconv/libKSC.so", "type": "file" }, { - "bom-ref": "cd8511c754fa4bbc", + "bom-ref": "ec0facff8aa93df8", "name": "/usr/lib/x86_64-linux-gnu/gcrt1.o", "type": "file" }, { - "bom-ref": "44b29dfb4568090c", + "bom-ref": "b613000d6df63334", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-ani.so", "type": "file" }, { - "bom-ref": "5c6f5f838251f91b", + "bom-ref": "33b372c9deea83bb", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-bmp.so", "type": "file" }, { - "bom-ref": "e5115d44b7a8e5b0", + "bom-ref": "f413cbe2706c812c", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gif.so", "type": "file" }, { - "bom-ref": "f85f78859df4c293", + "bom-ref": "61bc007e6bdbbb5f", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-icns.so", "type": "file" }, { - "bom-ref": "e2b77e70422c7956", + "bom-ref": "03555650560719ea", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-ico.so", "type": "file" }, { - "bom-ref": "abcfe6161f3412c7", + "bom-ref": "021a84c9bd31809b", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-pnm.so", "type": "file" }, { - "bom-ref": "86f88784d6aca9ec", + "bom-ref": "e629900badde7bb8", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-qtif.so", "type": "file" }, { - "bom-ref": "b98084cb1d3e7d00", + "bom-ref": "4ad93bda72717d98", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-tga.so", "type": "file" }, { - "bom-ref": "f736ccd9af329a8a", + "bom-ref": "d5f5dc397ab4822a", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-tiff.so", "type": "file" }, { - "bom-ref": "f0e566675e946577", + "bom-ref": "cc502d5edf818e77", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-xbm.so", "type": "file" }, { - "bom-ref": "65f633740947d0d1", + "bom-ref": "479e69383a87d851", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-xpm.so", "type": "file" }, { - "bom-ref": "af1da9f7e8823c5a", + "bom-ref": "f8e0e0f81b6ef33a", "name": "/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders", "type": "file" }, { - "bom-ref": "00705c87a510c5d4", + "bom-ref": "76729d3c9149b6a7", + "name": "/usr/lib/x86_64-linux-gnu/girepository-1.0/GIRepository-2.0.typelib", + "type": "file" + }, + { + "bom-ref": "9d82ffe2d38503e6", + "name": "/usr/lib/x86_64-linux-gnu/girepository-1.0/GLib-2.0.typelib", + "type": "file" + }, + { + "bom-ref": "35748ac3a44990e9", + "name": "/usr/lib/x86_64-linux-gnu/girepository-1.0/GLibUnix-2.0.typelib", + "type": "file" + }, + { + "bom-ref": "93e9144b48711b27", + "name": "/usr/lib/x86_64-linux-gnu/girepository-1.0/GModule-2.0.typelib", + "type": "file" + }, + { + "bom-ref": "0161db92636147b7", + "name": "/usr/lib/x86_64-linux-gnu/girepository-1.0/GObject-2.0.typelib", + "type": "file" + }, + { + "bom-ref": "75da8aa16e1a9194", + "name": "/usr/lib/x86_64-linux-gnu/girepository-1.0/Gio-2.0.typelib", + "type": "file" + }, + { + "bom-ref": "25270df3b24b7712", + "name": "/usr/lib/x86_64-linux-gnu/girepository-1.0/GioUnix-2.0.typelib", + "type": "file" + }, + { + "bom-ref": "3ed00b95c16fa900", "name": "/usr/lib/x86_64-linux-gnu/glib-2.0/gio-launch-desktop", "type": "file" }, { - "bom-ref": "e47c0fbd3da55ed2", + "bom-ref": "0a6718ffad65ff76", "name": "/usr/lib/x86_64-linux-gnu/glib-2.0/gio-querymodules", "type": "file" }, { - "bom-ref": "8b1157d8aac0580a", + "bom-ref": "fbb4e9e791eddcc2", "name": "/usr/lib/x86_64-linux-gnu/glib-2.0/glib-compile-schemas", "type": "file" }, { - "bom-ref": "a524886669cb325a", + "bom-ref": "f3b25ceec839b6de", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-collector.so", "type": "file" }, { - "bom-ref": "20a2e35e3fdeaa66", + "bom-ref": "3b4e6141801ba31a", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-collectorAPI.a", "type": "file" }, { - "bom-ref": "8084b9ff939c71cb", + "bom-ref": "c244a08519a7800f", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-collectorAPI.so", "type": "file" }, { - "bom-ref": "a6ea78255157a9b7", + "bom-ref": "771acfc1c5bcc077", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-heap.so", "type": "file" }, { - "bom-ref": "3c313bc4d3b04fe5", + "bom-ref": "a36573a9882130ad", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-iotrace.so", "type": "file" }, { - "bom-ref": "ef3d755a9957592b", + "bom-ref": "2ddf09f910ac0f1f", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-sync.so", "type": "file" }, { - "bom-ref": "d34b044a869c3c08", + "bom-ref": "4ef62f1395bca2cc", "name": "/usr/lib/x86_64-linux-gnu/grcrt1.o", "type": "file" }, { - "bom-ref": "8e994591478c0349", + "bom-ref": "7200fe31bd2d5fb5", + "name": "/usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstcoreelements.so", + "type": "file" + }, + { + "bom-ref": "ccefcae7c2ae18ae", + "name": "/usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstcoretracers.so", + "type": "file" + }, + { + "bom-ref": "498c9d2a7c5b73aa", + "name": "/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner", + "type": "file" + }, + { + "bom-ref": "fe82154b1b305ec7", + "name": "/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper", + "type": "file" + }, + { + "bom-ref": "55ab22de1125f7aa", "name": "/usr/lib/x86_64-linux-gnu/intel-opencl/libigdrcl.so", "type": "file" }, { - "bom-ref": "6ce34ac1354f90a0", + "bom-ref": "37d2afd20e9f1ef0", "name": "/usr/lib/x86_64-linux-gnu/krb5/plugins/preauth/spake.so", "type": "file" }, { - "bom-ref": "107f80a2936eba56", + "bom-ref": "d1ac6e2c62b9d11e", "name": "/usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0", "type": "file" }, { - "bom-ref": "2180e1f414d938c3", + "bom-ref": "9b9ab0f89990a8a1", "name": "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2", "type": "file" }, { - "bom-ref": "869a0706c5ce4677", + "bom-ref": "3776879acccab737", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.x", "type": "file" }, { - "bom-ref": "600791e4a492befa", + "bom-ref": "e818302708843c22", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xbn", "type": "file" }, { - "bom-ref": "2d9f62b1726f98ba", + "bom-ref": "bbc3cd0ebe3047d6", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xc", "type": "file" }, { - "bom-ref": "dcc3c9766f4b26ba", + "bom-ref": "4a6d39128731a20e", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xce", "type": "file" }, { - "bom-ref": "5083d1c1060520d0", + "bom-ref": "0b395516467150a8", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xd", "type": "file" }, { - "bom-ref": "f74a606b13968f78", + "bom-ref": "4029392657a9cfdc", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xdc", "type": "file" }, { - "bom-ref": "e70599580f6c4515", + "bom-ref": "029033a353fbe0e9", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xdce", "type": "file" }, { - "bom-ref": "48f4d2602f084030", + "bom-ref": "fcd831b613b0eec8", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xde", "type": "file" }, { - "bom-ref": "7009b1f7d880ceae", + "bom-ref": "e47e661f900cbf96", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xdw", "type": "file" }, { - "bom-ref": "89390dd21399bbc8", + "bom-ref": "dbe6d7fb85496a98", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xdwe", "type": "file" }, { - "bom-ref": "26dd6c080c88079a", + "bom-ref": "2656e131c146a61e", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xe", "type": "file" }, { - "bom-ref": "0e0f3a8048d7e62d", + "bom-ref": "23a056d7dc413201", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xn", "type": "file" }, { - "bom-ref": "70af458cb1c1a895", + "bom-ref": "a3bb45e268336545", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xr", "type": "file" }, { - "bom-ref": "2f7e26af739c33a0", + "bom-ref": "452f34d56c88ab18", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xs", "type": "file" }, { - "bom-ref": "c3f838ccbb98bc4e", + "bom-ref": "380f07b254124a9e", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xsc", "type": "file" }, { - "bom-ref": "bd66584298949d03", + "bom-ref": "424fc2ae13bcb8e3", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xsce", "type": "file" }, { - "bom-ref": "d36ac9fc8d5c5dd6", + "bom-ref": "ea83c8518c60d0c6", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xse", "type": "file" }, { - "bom-ref": "f2a39da363ac0234", + "bom-ref": "57480fcee054f1e8", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xsw", "type": "file" }, { - "bom-ref": "d4c869572cd79535", + "bom-ref": "addd1597d2118775", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xswe", "type": "file" }, { - "bom-ref": "eccae5946a84582c", + "bom-ref": "5702cf79dc2dedc0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xu", "type": "file" }, { - "bom-ref": "4af44ee045ad4de7", + "bom-ref": "50abc68b0af55feb", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xw", "type": "file" }, { - "bom-ref": "f55e11ab166cc476", + "bom-ref": "e13da8aebdf165ba", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xwe", "type": "file" }, { - "bom-ref": "5719e4a7026fdd45", + "bom-ref": "63b65f86a8a24c31", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.x", "type": "file" }, { - "bom-ref": "95782adae67eca2d", + "bom-ref": "869ce0d12864f3f9", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xbn", "type": "file" }, { - "bom-ref": "c62e04fc5d465718", + "bom-ref": "c1933ffd508f5e64", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xc", "type": "file" }, { - "bom-ref": "8a349d3cd57d5baa", + "bom-ref": "44929243c7647ed6", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xce", "type": "file" }, { - "bom-ref": "338ea54880dc4753", + "bom-ref": "a3db29b8cde2f62f", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xd", "type": "file" }, { - "bom-ref": "8878132b0374e6cf", + "bom-ref": "c38678b98f636a5f", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xdc", "type": "file" }, { - "bom-ref": "5b5b2a6f96befbe1", + "bom-ref": "35b2c310364af90d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xdce", "type": "file" }, { - "bom-ref": "8fd4553967f9a516", + "bom-ref": "f58450e0dd435552", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xde", "type": "file" }, { - "bom-ref": "330c5281cf93cd69", + "bom-ref": "2554aff64482326d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xdw", "type": "file" }, { - "bom-ref": "aaedf5c75d041c03", + "bom-ref": "d056e9db8d4b1473", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xdwe", "type": "file" }, { - "bom-ref": "3f02ad631ac30d51", + "bom-ref": "b39b66e633185e61", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xe", "type": "file" }, { - "bom-ref": "01eb4722b42ca8b1", + "bom-ref": "d924e87a25c9abc1", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xn", "type": "file" }, { - "bom-ref": "43552226389c5810", + "bom-ref": "18e1af01813b5ac8", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xr", "type": "file" }, { - "bom-ref": "bed9c461d8e3e20a", + "bom-ref": "32c371c507b3aa92", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xs", "type": "file" }, { - "bom-ref": "469b7ec81df0d402", + "bom-ref": "03e7090f5b760d1a", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xsc", "type": "file" }, { - "bom-ref": "752b077b89cd8a93", + "bom-ref": "089ac3ac917856cf", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xsce", "type": "file" }, { - "bom-ref": "e6eb6fb475abdef8", + "bom-ref": "1c6379586b1fc15c", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xse", "type": "file" }, { - "bom-ref": "ae581017c1c5cca0", + "bom-ref": "7d16b9881f737214", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xsw", "type": "file" }, { - "bom-ref": "3a53a33725b19379", + "bom-ref": "2eaccde176b37779", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xswe", "type": "file" }, { - "bom-ref": "163bb7d039811e19", + "bom-ref": "53a9aa83246de24d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xu", "type": "file" }, { - "bom-ref": "b47f19802fdba6f4", + "bom-ref": "c81b03716aef5bf0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xw", "type": "file" }, { - "bom-ref": "82d251dc8e2070f0", + "bom-ref": "79197f41cb1c3f84", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xwe", "type": "file" }, { - "bom-ref": "0c772206a73f6960", + "bom-ref": "afb8b64985f17888", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.x", "type": "file" }, { - "bom-ref": "e20d9ef035db7460", + "bom-ref": "223b67a057fd4bf8", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xbn", "type": "file" }, { - "bom-ref": "e4b17c75977de6d0", + "bom-ref": "2a8fb846f05b77cc", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xc", "type": "file" }, { - "bom-ref": "03dbdbdd968290a1", + "bom-ref": "145c045f8e3d67dd", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xce", "type": "file" }, { - "bom-ref": "2383d9caadb5e56e", + "bom-ref": "aade3750af8e9472", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xd", "type": "file" }, { - "bom-ref": "5d0f30b0e576b354", + "bom-ref": "1afb07925bd45398", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xdc", "type": "file" }, { - "bom-ref": "7e0f3cbc25dd64a7", + "bom-ref": "0c9ea7f71f72cfcf", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xdce", "type": "file" }, { - "bom-ref": "1d73668bd6a462d1", + "bom-ref": "269b5e625475a555", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xde", "type": "file" }, { - "bom-ref": "495ca5f2b2f18688", + "bom-ref": "17abad3d74c62a30", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xdw", "type": "file" }, { - "bom-ref": "837f8511015bb329", + "bom-ref": "b572c4554947b661", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xdwe", "type": "file" }, { - "bom-ref": "9389986447a73932", + "bom-ref": "15d07e462453a8d6", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xe", "type": "file" }, { - "bom-ref": "46c185a7b983d170", + "bom-ref": "6e9752e5c7883a40", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xn", "type": "file" }, { - "bom-ref": "a4396301d346da44", + "bom-ref": "dcc7aadfaae4af70", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xr", "type": "file" }, { - "bom-ref": "9805e84720e6ef22", + "bom-ref": "ad209e73aa551686", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xs", "type": "file" }, { - "bom-ref": "cd15f0cb0f6c8899", + "bom-ref": "d53b70d8107f8a69", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xsc", "type": "file" }, { - "bom-ref": "b7228b7f0462bc53", + "bom-ref": "140f1d1f6a40bc8b", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xsce", "type": "file" }, { - "bom-ref": "e901d42fb5e0cebf", + "bom-ref": "78215752d54a64af", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xse", "type": "file" }, { - "bom-ref": "900292a49c969135", + "bom-ref": "99e119be6a1ea1bd", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xsw", "type": "file" }, { - "bom-ref": "cc9b46fe333c23bb", + "bom-ref": "729c3c78a32453f7", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xswe", "type": "file" }, { - "bom-ref": "bfddff7b4548f054", + "bom-ref": "7a245f3bbce9d62c", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xu", "type": "file" }, { - "bom-ref": "eb7f9f78179c705b", + "bom-ref": "67d3d5b5afc3b96f", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xw", "type": "file" }, { - "bom-ref": "76bd4c3be283c1ec", + "bom-ref": "b26d3111af317f60", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xwe", "type": "file" }, { - "bom-ref": "a7aa5d2b60a59c24", + "bom-ref": "830123ca57755a08", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.x", "type": "file" }, { - "bom-ref": "8cb97941e16b4ca3", + "bom-ref": "58b671f59da6f88b", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xbn", "type": "file" }, { - "bom-ref": "fed32118140e927d", + "bom-ref": "09d50500bc1a2f75", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xc", "type": "file" }, { - "bom-ref": "9c74b4f918dbaf79", + "bom-ref": "12d7fd5d9ca95b69", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xce", "type": "file" }, { - "bom-ref": "976be3c03f9091e1", + "bom-ref": "ff34a596da5e9ef5", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xd", "type": "file" }, { - "bom-ref": "1cc93818d29ae1cf", + "bom-ref": "fea6e66987c3fa6b", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xdc", "type": "file" }, { - "bom-ref": "31b2a0314fb8bfd5", + "bom-ref": "bbab9e1ac86134b9", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xdce", "type": "file" }, { - "bom-ref": "c1b500a18dedd134", + "bom-ref": "3c065f176f653a00", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xde", "type": "file" }, { - "bom-ref": "edc02308936e6e57", + "bom-ref": "c5dfa9b9af16664b", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xdw", "type": "file" }, { - "bom-ref": "847602314bd3d135", + "bom-ref": "870cdcf8811e0ed9", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xdwe", "type": "file" }, { - "bom-ref": "14d9f534153a13e8", + "bom-ref": "2aed9051710a7238", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xe", "type": "file" }, { - "bom-ref": "78ea25abb4c0737c", + "bom-ref": "611e1340b20a9474", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xn", "type": "file" }, { - "bom-ref": "7e72394c0db2e8a5", + "bom-ref": "a63d750959749519", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xr", "type": "file" }, { - "bom-ref": "f854fdc32b47e389", + "bom-ref": "03a7ce50d19a2705", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xs", "type": "file" }, { - "bom-ref": "bbbb4831f32de321", + "bom-ref": "a341f15aab960f5d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xsc", "type": "file" }, { - "bom-ref": "dfc05e191df0518f", + "bom-ref": "00f519112435fa67", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xsce", "type": "file" }, { - "bom-ref": "62cad5f73c983309", + "bom-ref": "c200d0c37df9b089", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xse", "type": "file" }, { - "bom-ref": "ec59ba17dc824279", + "bom-ref": "b2067d326c156f21", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xsw", "type": "file" }, { - "bom-ref": "4818211de7a3b175", + "bom-ref": "f3aacb32db0a2171", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xswe", "type": "file" }, { - "bom-ref": "8a6e4d7a14bca6cc", + "bom-ref": "cfe6b2666bc0863c", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xu", "type": "file" }, { - "bom-ref": "e903912e3d40d1e8", + "bom-ref": "d442b497e4c04f08", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xw", "type": "file" }, { - "bom-ref": "80ce5bfa520bfd44", + "bom-ref": "1dfdaa5af478a96c", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xwe", "type": "file" }, { - "bom-ref": "a963c1b931b28e07", + "bom-ref": "8911c65081d3698b", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.x", "type": "file" }, { - "bom-ref": "45c662a2bb39ef65", + "bom-ref": "2f10f58fbb477061", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xa", "type": "file" }, { - "bom-ref": "9c5cec543cc8c2d0", + "bom-ref": "6938ff751b247aa0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xbn", "type": "file" }, { - "bom-ref": "99a69f0191e94742", + "bom-ref": "6a6b89f89c0b4ad6", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xe", "type": "file" }, { - "bom-ref": "bbe21005bf7aa6c5", + "bom-ref": "822a3806f48a0231", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xn", "type": "file" }, { - "bom-ref": "83dd385409314a45", + "bom-ref": "7797be303a92da21", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xr", "type": "file" }, { - "bom-ref": "8218e396ee00f2cc", + "bom-ref": "821656a351a646d0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xu", "type": "file" }, { - "bom-ref": "3a29986dfb94148b", + "bom-ref": "bce1e50c89bb368f", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.x", "type": "file" }, { - "bom-ref": "8059cf2e9eec229c", + "bom-ref": "2e06063c62028d30", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xa", "type": "file" }, { - "bom-ref": "1933957ffc07f160", + "bom-ref": "23910488730b59b0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xbn", "type": "file" }, { - "bom-ref": "12b0fbdd6f5445a3", + "bom-ref": "532b7114b03d13ab", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xe", "type": "file" }, { - "bom-ref": "42b57d197b81b99a", + "bom-ref": "759e7dfbadfa3dda", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xn", "type": "file" }, { - "bom-ref": "5be038715dc0d9c0", + "bom-ref": "8f72b0fe5cf3a1a8", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xr", "type": "file" }, { - "bom-ref": "adbe49d5cf537362", + "bom-ref": "32e1f0469d6c9e76", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xu", "type": "file" }, { - "bom-ref": "ebbe420943530e47", + "bom-ref": "2d8f3543ba756027", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/stamp", "type": "file" }, { - "bom-ref": "df84da6b556478c0", + "bom-ref": "cec43be30861e23c", "name": "/usr/lib/x86_64-linux-gnu/libBrokenLocale.a", "type": "file" }, { - "bom-ref": "8a24cdb38f9d344f", + "bom-ref": "d5db8ef8a7fcaa35", "name": "/usr/lib/x86_64-linux-gnu/libBrokenLocale.so.1", "type": "file" }, { - "bom-ref": "313c80ef17224557", + "bom-ref": "fa817a92b67ab127", "name": "/usr/lib/x86_64-linux-gnu/libFLAC.so.12.1.0", "type": "file" }, { - "bom-ref": "801e4131aef757b0", + "bom-ref": "ebb9716cc8566920", "name": "/usr/lib/x86_64-linux-gnu/libGL.so.1.7.0", "type": "file" }, { - "bom-ref": "59c0f6a8c1215efe", + "bom-ref": "443873aa903d9f1e", "name": "/usr/lib/x86_64-linux-gnu/libGLX.so.0.0.0", "type": "file" }, { - "bom-ref": "1998e5c7c8c2670a", + "bom-ref": "218adbd347129a06", "name": "/usr/lib/x86_64-linux-gnu/libGLX_mesa.so.0.0.0", "type": "file" }, { - "bom-ref": "aee7e883d8e0ec70", + "bom-ref": "108ef51e3977a7b8", "name": "/usr/lib/x86_64-linux-gnu/libGLdispatch.so.0.0.0", "type": "file" }, { - "bom-ref": "ae8faa00f665e950", + "bom-ref": "a032619b1daab290", "name": "/usr/lib/x86_64-linux-gnu/libICE.so.6.3.0", "type": "file" }, { - "bom-ref": "1b4faf1dca2effd2", + "bom-ref": "7c68e59fbc32fc2a", "name": "/usr/lib/x86_64-linux-gnu/libLLVM.so.20.1", "type": "file" }, { - "bom-ref": "7496a67bb08f3a8f", + "bom-ref": "c5f20ad887bfa387", "name": "/usr/lib/x86_64-linux-gnu/libLerc.so.4", "type": "file" }, { - "bom-ref": "a74e594262c9a65a", + "bom-ref": "406771841a321356", "name": "/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0", "type": "file" }, { - "bom-ref": "b78fdad5e8cb14ab", + "bom-ref": "3799e45a65be5443", "name": "/usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.3000.0", "type": "file" }, { - "bom-ref": "86b751f1fec3cb45", + "bom-ref": "dd9732e57cfffe05", "name": "/usr/lib/x86_64-linux-gnu/libSM.so.6.0.1", "type": "file" }, { - "bom-ref": "bdaf1bb9fe93f807", + "bom-ref": "66174c0d3ab8d22f", "name": "/usr/lib/x86_64-linux-gnu/libSvtAv1Enc.so.1.7.0", "type": "file" }, { - "bom-ref": "a32243ee66de22a5", + "bom-ref": "350e70ccaec4b849", "name": "/usr/lib/x86_64-linux-gnu/libX11-xcb.so.1.0.0", "type": "file" }, { - "bom-ref": "ee41cb05ceabedd1", + "bom-ref": "b9c4fe85d29e8cd9", "name": "/usr/lib/x86_64-linux-gnu/libX11.so.6.4.0", "type": "file" }, { - "bom-ref": "bf2a1cfa222a95ad", + "bom-ref": "0c1e1408229f21dd", "name": "/usr/lib/x86_64-linux-gnu/libXau.so.6.0.0", "type": "file" }, { - "bom-ref": "b48c3d5394763519", + "bom-ref": "76536e1b8aa45485", "name": "/usr/lib/x86_64-linux-gnu/libXcursor.so.1.0.2", "type": "file" }, { - "bom-ref": "bc6e81e15f4d76b2", + "bom-ref": "78ed0043038a3a42", "name": "/usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0", "type": "file" }, { - "bom-ref": "3f910dd5ee8ae3b9", + "bom-ref": "bbeaafd91d2f9ebd", "name": "/usr/lib/x86_64-linux-gnu/libXext.so.6.4.0", "type": "file" }, { - "bom-ref": "3fa3e44670f1fe1d", + "bom-ref": "8c83160c2c7e65b1", "name": "/usr/lib/x86_64-linux-gnu/libXfixes.so.3.1.0", "type": "file" }, { - "bom-ref": "aa9bc73849d03013", + "bom-ref": "f0533be59ca6ab7f", "name": "/usr/lib/x86_64-linux-gnu/libXi.so.6.1.0", "type": "file" }, { - "bom-ref": "13054da673761129", + "bom-ref": "d05a5f74637fafb1", "name": "/usr/lib/x86_64-linux-gnu/libXrandr.so.2.2.0", "type": "file" }, { - "bom-ref": "0c705d9632404d6e", + "bom-ref": "7f82b7a6ffb6a7d6", "name": "/usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0", "type": "file" }, { - "bom-ref": "362175a3f88536af", + "bom-ref": "abbaa087cb37703b", "name": "/usr/lib/x86_64-linux-gnu/libXss.so.1.0.0", "type": "file" }, { - "bom-ref": "bd0964fbee8916df", + "bom-ref": "18d1a594ea28428f", "name": "/usr/lib/x86_64-linux-gnu/libXv.so.1.0.0", "type": "file" }, { - "bom-ref": "9152db1b8cdf7226", + "bom-ref": "ba1227302d507566", "name": "/usr/lib/x86_64-linux-gnu/libXxf86vm.so.1.0.0", "type": "file" }, { - "bom-ref": "beb5247bfe29a9fc", + "bom-ref": "e8541078998d1d7a", "name": "/usr/lib/x86_64-linux-gnu/libacl.so.1.1.2302", "type": "file" }, { - "bom-ref": "66b0387df74872a5", + "bom-ref": "1ef7789006f80065", "name": "/usr/lib/x86_64-linux-gnu/libaio.a", "type": "file" }, { - "bom-ref": "42c96c86b8a0cb59", + "bom-ref": "1679a6a42eedcf81", "name": "/usr/lib/x86_64-linux-gnu/libaio.so.1t64.0.2", "type": "file" }, { - "bom-ref": "3386b9cd318b705e", + "bom-ref": "a52c75c4ad2006da", "name": "/usr/lib/x86_64-linux-gnu/libanl.a", "type": "file" }, { - "bom-ref": "176b08bab4faeac7", + "bom-ref": "5e940d8cf655b5bd", "name": "/usr/lib/x86_64-linux-gnu/libanl.so.1", "type": "file" }, { - "bom-ref": "37ab9596e208bfd7", + "bom-ref": "4fbf95900de521eb", "name": "/usr/lib/x86_64-linux-gnu/libaom.so.3.8.2", "type": "file" }, { - "bom-ref": "2be4917df7836c72", + "bom-ref": "5f19b861f3b763a2", "name": "/usr/lib/x86_64-linux-gnu/libapparmor.so.1.17.2", "type": "file" }, { - "bom-ref": "425ac15a3aba2872", + "bom-ref": "ab159d05412b7b78", + "name": "/usr/lib/x86_64-linux-gnu/libappstream.so.1.0.2", + "type": "file" + }, + { + "bom-ref": "46f9d6da0f1fac78", "name": "/usr/lib/x86_64-linux-gnu/libapt-pkg.so.6.0.0", "type": "file" }, { - "bom-ref": "f48be413d72f016a", + "bom-ref": "89167ae5cad47240", "name": "/usr/lib/x86_64-linux-gnu/libapt-private.so.0.0.0", "type": "file" }, { - "bom-ref": "0ae26cd4106b06e2", + "bom-ref": "7c4e937a430ebca8", "name": "/usr/lib/x86_64-linux-gnu/libargon2.so.1", "type": "file" }, { - "bom-ref": "81eafcc3b88bad4d", + "bom-ref": "01d4935bc14ea8bd", "name": "/usr/lib/x86_64-linux-gnu/libasan.so.8.0.0", "type": "file" }, { - "bom-ref": "459666c9cc62703c", + "bom-ref": "709c114baa8ca9f8", "name": "/usr/lib/x86_64-linux-gnu/libasound.so.2.0.0", "type": "file" }, { - "bom-ref": "7c451edbd4e323b1", + "bom-ref": "1281b5557092bdb9", "name": "/usr/lib/x86_64-linux-gnu/libass.so.9.2.1", "type": "file" }, { - "bom-ref": "18bf64c3af42fde2", + "bom-ref": "17ea4e0032b06584", "name": "/usr/lib/x86_64-linux-gnu/libassuan.so.0.8.6", "type": "file" }, { - "bom-ref": "52bce6d8b2b0fccd", + "bom-ref": "078f8a4eeee400cd", "name": "/usr/lib/x86_64-linux-gnu/libasyncns.so.0.3.1", "type": "file" }, { - "bom-ref": "1c5c7da3ccfa516a", + "bom-ref": "8ed385beba4b1482", "name": "/usr/lib/x86_64-linux-gnu/libatomic.so.1.2.0", "type": "file" }, { - "bom-ref": "975292611492ed09", + "bom-ref": "2c4d61200c4b143b", "name": "/usr/lib/x86_64-linux-gnu/libattr.so.1.1.2502", "type": "file" }, { - "bom-ref": "3efeb5a2cb24b928", + "bom-ref": "3e4a2add8f5bc36e", "name": "/usr/lib/x86_64-linux-gnu/libaudit.so.1.0.0", "type": "file" }, { - "bom-ref": "1725188568d7797b", + "bom-ref": "e4dd08caaf02366b", "name": "/usr/lib/x86_64-linux-gnu/libavc1394.so.0.3.0", "type": "file" }, { - "bom-ref": "cc1fa40efbd57973", + "bom-ref": "966a380c096eeeab", "name": "/usr/lib/x86_64-linux-gnu/libavcodec.so.60.31.102", "type": "file" }, { - "bom-ref": "63f77268f5b0baf3", + "bom-ref": "170468b392c30097", "name": "/usr/lib/x86_64-linux-gnu/libavdevice.so.60.3.100", "type": "file" }, { - "bom-ref": "81a9927f9ef080a8", + "bom-ref": "8b461d3381972b94", "name": "/usr/lib/x86_64-linux-gnu/libavfilter.so.9.12.100", "type": "file" }, { - "bom-ref": "c164c4ac928e57ef", + "bom-ref": "707a11c88960b9f3", "name": "/usr/lib/x86_64-linux-gnu/libavformat.so.60.16.100", "type": "file" }, { - "bom-ref": "2bd613fa449218dc", + "bom-ref": "a8287413cd085908", "name": "/usr/lib/x86_64-linux-gnu/libavutil.so.58.29.100", "type": "file" }, { - "bom-ref": "db1587ae12d6309c", + "bom-ref": "417b86371d6741b0", "name": "/usr/lib/x86_64-linux-gnu/libbfd-2.42-system.so", "type": "file" }, { - "bom-ref": "02621c83f3aa24a1", + "bom-ref": "40718062bbd6aac1", "name": "/usr/lib/x86_64-linux-gnu/libblkid.so.1.1.0", "type": "file" }, { - "bom-ref": "ee1dd1b090e8d02c", + "bom-ref": "0cf5c9ecb833e364", "name": "/usr/lib/x86_64-linux-gnu/libbluray.so.2.4.3", "type": "file" }, { - "bom-ref": "777c30fecd009407", + "bom-ref": "a0f67d6e6f1562d7", "name": "/usr/lib/x86_64-linux-gnu/libbrotlicommon.so.1.1.0", "type": "file" }, { - "bom-ref": "34c0f099583ab5bc", + "bom-ref": "356472f38e7fdf90", "name": "/usr/lib/x86_64-linux-gnu/libbrotlidec.so.1.1.0", "type": "file" }, { - "bom-ref": "2b5bb1448c107ee2", + "bom-ref": "56f02f0f8e2fab5a", "name": "/usr/lib/x86_64-linux-gnu/libbrotlienc.so.1.1.0", "type": "file" }, { - "bom-ref": "c954d572ff5f9940", + "bom-ref": "7b211c59ac54294c", "name": "/usr/lib/x86_64-linux-gnu/libbs2b.so.0.0.0", "type": "file" }, { - "bom-ref": "72d0cb2b52b3657f", + "bom-ref": "458dd64ba36c736b", "name": "/usr/lib/x86_64-linux-gnu/libbsd.so.0.12.1", "type": "file" }, { - "bom-ref": "292a2da605cc93c0", + "bom-ref": "a1de562823df09ce", "name": "/usr/lib/x86_64-linux-gnu/libbz2.so.1.0.4", "type": "file" }, { - "bom-ref": "4664408da9eefe13", + "bom-ref": "5bd982b50837ebf7", "name": "/usr/lib/x86_64-linux-gnu/libc.a", "type": "file" }, { - "bom-ref": "a0647e8dd9ac583b", + "bom-ref": "577d6932ef982177", "name": "/usr/lib/x86_64-linux-gnu/libc.so", "type": "file" }, { - "bom-ref": "31f023994ebd325a", + "bom-ref": "36f7cf5fedec3aa4", "name": "/usr/lib/x86_64-linux-gnu/libc.so.6", "type": "file" }, { - "bom-ref": "d0135ea91210fd29", + "bom-ref": "372035952e45b4eb", "name": "/usr/lib/x86_64-linux-gnu/libc_malloc_debug.so.0", "type": "file" }, { - "bom-ref": "908c4163dcb09e23", + "bom-ref": "26121a592f1e7d1f", "name": "/usr/lib/x86_64-linux-gnu/libc_nonshared.a", "type": "file" }, { - "bom-ref": "8688c9d92a4afaf7", + "bom-ref": "cedb49cb14b4c58b", "name": "/usr/lib/x86_64-linux-gnu/libcaca++.so.0.99.20", "type": "file" }, { - "bom-ref": "eba971553f4d16a3", + "bom-ref": "cd7b223801f0c7fb", "name": "/usr/lib/x86_64-linux-gnu/libcaca.so.0.99.20", "type": "file" }, { - "bom-ref": "fac0fd8bcb8a509f", + "bom-ref": "59ad3f619b6962b7", "name": "/usr/lib/x86_64-linux-gnu/libcairo-gobject.so.2.11800.0", "type": "file" }, { - "bom-ref": "662ffe1f2384b2fa", + "bom-ref": "269e3ae5be811426", "name": "/usr/lib/x86_64-linux-gnu/libcairo.so.2.11800.0", "type": "file" }, { - "bom-ref": "36ccfecca8e27d1f", + "bom-ref": "4274f3e57ed0bfcd", "name": "/usr/lib/x86_64-linux-gnu/libcap-ng.so.0.0.0", "type": "file" }, { - "bom-ref": "1108b2492a2ffec1", + "bom-ref": "047affaae7d2508b", "name": "/usr/lib/x86_64-linux-gnu/libcap.so.2.66", "type": "file" }, { - "bom-ref": "2313efb6af987c52", + "bom-ref": "e59f62bb3d20f542", "name": "/usr/lib/x86_64-linux-gnu/libcc1.so.0.0.0", "type": "file" }, { - "bom-ref": "85fd81d5a5131054", + "bom-ref": "f6af5fe590770820", "name": "/usr/lib/x86_64-linux-gnu/libcdio.so.19.0.0", "type": "file" }, { - "bom-ref": "6da33424bc77375e", + "bom-ref": "5c4aba94c11224d2", "name": "/usr/lib/x86_64-linux-gnu/libcdio_cdda.so.2.0.0", "type": "file" }, { - "bom-ref": "9ed85d7867aff58a", + "bom-ref": "6768cded48d719d6", "name": "/usr/lib/x86_64-linux-gnu/libcdio_paranoia.so.2.0.0", "type": "file" }, { - "bom-ref": "3c99b5364befdd03", + "bom-ref": "613e97c62ed46e77", "name": "/usr/lib/x86_64-linux-gnu/libchromaprint.so.1.5.1", "type": "file" }, { - "bom-ref": "b7ca40f308d9b462", + "bom-ref": "057c1414ffae55de", "name": "/usr/lib/x86_64-linux-gnu/libcjson.so.1.7.17", "type": "file" }, { - "bom-ref": "ac61a1156e7238a6", + "bom-ref": "e41762d474a1d5a6", "name": "/usr/lib/x86_64-linux-gnu/libcjson_utils.so.1.7.17", "type": "file" }, { - "bom-ref": "5b52dab3d79d9fa4", + "bom-ref": "bfc2f5b6aee8bda4", "name": "/usr/lib/x86_64-linux-gnu/libcodec2.so.1.2", "type": "file" }, { - "bom-ref": "72e391c964ef8c51", + "bom-ref": "78b4aa648130ff4b", "name": "/usr/lib/x86_64-linux-gnu/libcom_err.so.2.1", "type": "file" }, { - "bom-ref": "3e56cd189f4d014c", + "bom-ref": "275898342e52bdf8", "name": "/usr/lib/x86_64-linux-gnu/libcrypt.a", "type": "file" }, { - "bom-ref": "c5fc381ba3c13eea", + "bom-ref": "1b4ce90659d40c20", "name": "/usr/lib/x86_64-linux-gnu/libcrypt.so.1.1.0", "type": "file" }, { - "bom-ref": "d2afe28b2dcc9619", + "bom-ref": "d9831ba05fd7a1b9", "name": "/usr/lib/x86_64-linux-gnu/libcrypto.so.3", "type": "file" }, { - "bom-ref": "1a8902e8920f9764", + "bom-ref": "67afcda080b3c57a", "name": "/usr/lib/x86_64-linux-gnu/libcryptsetup.so.12.10.0", "type": "file" }, { - "bom-ref": "882673fc818d5dc2", + "bom-ref": "b3273e2730d5ed52", "name": "/usr/lib/x86_64-linux-gnu/libctf-nobfd.so.0.0.0", "type": "file" }, { - "bom-ref": "b6886e13a03e22f9", + "bom-ref": "5ddb6699e883c7ed", "name": "/usr/lib/x86_64-linux-gnu/libctf.so.0.0.0", "type": "file" }, { - "bom-ref": "c611b7a0cb0130b2", + "bom-ref": "e2fe3547eb774f6e", "name": "/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4.8.0", "type": "file" }, { - "bom-ref": "e2d69b552bc7846e", + "bom-ref": "873690933df9c5f2", "name": "/usr/lib/x86_64-linux-gnu/libcurl.so.4.8.0", "type": "file" }, { - "bom-ref": "4dda0665b01d3343", + "bom-ref": "ed9f38e52345b78f", "name": "/usr/lib/x86_64-linux-gnu/libdatrie.so.1.4.0", "type": "file" }, { - "bom-ref": "4f40b18436870f7d", + "bom-ref": "f4a9f12e72f54e31", "name": "/usr/lib/x86_64-linux-gnu/libdav1d.so.7.0.0", "type": "file" }, { - "bom-ref": "b6bcb5d741b8b166", + "bom-ref": "90e09ddc39d6bde0", "name": "/usr/lib/x86_64-linux-gnu/libdb-5.3.so", "type": "file" }, { - "bom-ref": "6f61cc337112002c", + "bom-ref": "2783c1348ebf2588", "name": "/usr/lib/x86_64-linux-gnu/libdbus-1.so.3.32.4", "type": "file" }, { - "bom-ref": "450ad8f06af1dcca", + "bom-ref": "2daf600f9d138aea", "name": "/usr/lib/x86_64-linux-gnu/libdc1394.so.25.0.0", "type": "file" }, { - "bom-ref": "3a86a3e30292c8f5", + "bom-ref": "cae09d65ed97e2df", "name": "/usr/lib/x86_64-linux-gnu/libdebconfclient.so.0.0.0", "type": "file" }, { - "bom-ref": "d2a5fd3079389485", + "bom-ref": "ce46044cebab3105", "name": "/usr/lib/x86_64-linux-gnu/libdecor-0.so.0.200.2", "type": "file" }, { - "bom-ref": "c49cb7209ebd7c21", + "bom-ref": "f134aa09c69611f1", "name": "/usr/lib/x86_64-linux-gnu/libdeflate.so.0", "type": "file" }, { - "bom-ref": "ba813cf581fa2b0f", + "bom-ref": "6fb8d3ab04a06c25", "name": "/usr/lib/x86_64-linux-gnu/libdevmapper.so.1.02.1", "type": "file" }, { - "bom-ref": "476faad7d4ba1866", + "bom-ref": "162937cdf8a26562", "name": "/usr/lib/x86_64-linux-gnu/libdl.a", "type": "file" }, { - "bom-ref": "412fd4c98c19bdda", + "bom-ref": "38e4c30a59573d38", "name": "/usr/lib/x86_64-linux-gnu/libdl.so.2", "type": "file" }, { - "bom-ref": "13d08c027bb53096", + "bom-ref": "91f33e81505a7d42", "name": "/usr/lib/x86_64-linux-gnu/libdrm.so.2.125.0", "type": "file" }, { - "bom-ref": "d0bdd8ec11fbe4c2", + "bom-ref": "c1d019e0d752f156", "name": "/usr/lib/x86_64-linux-gnu/libdrm_amdgpu.so.1.125.0", "type": "file" }, { - "bom-ref": "3baf0ad868ec2900", + "bom-ref": "e4e0afaef6ce6444", "name": "/usr/lib/x86_64-linux-gnu/libdrm_intel.so.1.125.0", "type": "file" }, { - "bom-ref": "05719363932339d7", + "bom-ref": "359eee026c9b68ad", "name": "/usr/lib/x86_64-linux-gnu/libdrop_ambient.so.0.0.0", "type": "file" }, { - "bom-ref": "2e4936e853d8148a", + "bom-ref": "7f24f7af2e0c4445", + "name": "/usr/lib/x86_64-linux-gnu/libduktape.so.207", + "type": "file" + }, + { + "bom-ref": "e9cb9ac9f78b4870", + "name": "/usr/lib/x86_64-linux-gnu/libdw-0.190.so", + "type": "file" + }, + { + "bom-ref": "6cdd18d2bfc492b8", "name": "/usr/lib/x86_64-linux-gnu/libe2p.so.2.3", "type": "file" }, { - "bom-ref": "cd48395c491869a4", + "bom-ref": "d87fa9f1f7b9d5dc", "name": "/usr/lib/x86_64-linux-gnu/libedit.so.2.0.72", "type": "file" }, { - "bom-ref": "6e138f7d0403f266", + "bom-ref": "764e16512d0a8802", "name": "/usr/lib/x86_64-linux-gnu/libefa.so.1.3.50.0", "type": "file" }, { - "bom-ref": "9cce580735893cfe", + "bom-ref": "cb1b3c76f3e41672", "name": "/usr/lib/x86_64-linux-gnu/libelf-0.190.so", "type": "file" }, { - "bom-ref": "e440db0cd864aa27", + "bom-ref": "42f7db145ab62b43", "name": "/usr/lib/x86_64-linux-gnu/libexpat.a", "type": "file" }, { - "bom-ref": "abf72e4d54367916", + "bom-ref": "1e35a9dc75819c76", "name": "/usr/lib/x86_64-linux-gnu/libexpat.so.1.9.1", "type": "file" }, { - "bom-ref": "5a6d597c986f7239", + "bom-ref": "8aa3907f258b0eb9", "name": "/usr/lib/x86_64-linux-gnu/libexpatw.a", "type": "file" }, { - "bom-ref": "38fcf55ffb54d39f", + "bom-ref": "ed84877e1bf2e7ab", "name": "/usr/lib/x86_64-linux-gnu/libexpatw.so.1.9.1", "type": "file" }, { - "bom-ref": "18ec7d255b523d0c", + "bom-ref": "58692ecd36e70d12", "name": "/usr/lib/x86_64-linux-gnu/libext2fs.so.2.4", "type": "file" }, { - "bom-ref": "00f3d724a08df674", + "bom-ref": "92c18c0ff847ac6e", "name": "/usr/lib/x86_64-linux-gnu/libfdisk.so.1.1.0", "type": "file" }, { - "bom-ref": "b94248e32b308f65", + "bom-ref": "c1c7ff7b5b351537", "name": "/usr/lib/x86_64-linux-gnu/libffi.so.8.1.4", "type": "file" }, { - "bom-ref": "bbc8980c448018fb", + "bom-ref": "290d16785f404d77", "name": "/usr/lib/x86_64-linux-gnu/libfftw3.so.3.6.10", "type": "file" }, { - "bom-ref": "34723d28eb38202a", + "bom-ref": "5129c8f3443b7152", "name": "/usr/lib/x86_64-linux-gnu/libfftw3_omp.so.3.6.10", "type": "file" }, { - "bom-ref": "56798a21de6ad2ea", + "bom-ref": "06300789c194b58a", "name": "/usr/lib/x86_64-linux-gnu/libfftw3_threads.so.3.6.10", "type": "file" }, { - "bom-ref": "716b8f6c7c52d522", + "bom-ref": "ff6b02e9a5103a72", "name": "/usr/lib/x86_64-linux-gnu/libflite.so.2.2", "type": "file" }, { - "bom-ref": "0e942dbeb9746cf8", + "bom-ref": "a1c309dc5cc6d600", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmu_grapheme_lang.so.2.2", "type": "file" }, { - "bom-ref": "34d8512539129d84", + "bom-ref": "aac06229702e40e4", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmu_grapheme_lex.so.2.2", "type": "file" }, { - "bom-ref": "dccef9a9f3274570", + "bom-ref": "6b94ff7d1bd186ac", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmu_indic_lang.so.2.2", "type": "file" }, { - "bom-ref": "2b9c1f6f5e6ee6bc", + "bom-ref": "955343e0ef3460e4", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmu_indic_lex.so.2.2", "type": "file" }, { - "bom-ref": "038a59df5768f52c", + "bom-ref": "4e5b68fea674ecc8", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmu_time_awb.so.2.2", "type": "file" }, { - "bom-ref": "e28365a0bd588356", + "bom-ref": "c331ad848d0b4872", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmu_us_awb.so.2.2", "type": "file" }, { - "bom-ref": "b67aec32cfe46d9e", + "bom-ref": "328f2fd54a403992", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmu_us_kal.so.2.2", "type": "file" }, { - "bom-ref": "ad448e88fa938ce0", + "bom-ref": "e1820e4e9de7276c", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmu_us_kal16.so.2.2", "type": "file" }, { - "bom-ref": "c17f855c40105bbd", + "bom-ref": "0baa2eff8e6ad73d", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmu_us_rms.so.2.2", "type": "file" }, { - "bom-ref": "5eb586e690b9cf73", + "bom-ref": "88b3df13622f4987", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmu_us_slt.so.2.2", "type": "file" }, { - "bom-ref": "96d98243f892413f", + "bom-ref": "e017e183280517fb", "name": "/usr/lib/x86_64-linux-gnu/libflite_cmulex.so.2.2", "type": "file" }, { - "bom-ref": "0219f1cffa9f900f", + "bom-ref": "322837daf8077013", "name": "/usr/lib/x86_64-linux-gnu/libflite_usenglish.so.2.2", "type": "file" }, { - "bom-ref": "7ae2d78c572001c1", + "bom-ref": "8db0319f676a93d9", "name": "/usr/lib/x86_64-linux-gnu/libfontconfig.so.1.12.1", "type": "file" }, { - "bom-ref": "a565b151c162fdbe", + "bom-ref": "aaad5c60986b233c", "name": "/usr/lib/x86_64-linux-gnu/libformw.so.6.4", "type": "file" }, { - "bom-ref": "1ec6774786b85d48", + "bom-ref": "67fd86398c723f90", "name": "/usr/lib/x86_64-linux-gnu/libfreetype.so.6.20.1", "type": "file" }, { - "bom-ref": "eb9ba6b1e893660c", + "bom-ref": "b25fedcf0df9eea4", "name": "/usr/lib/x86_64-linux-gnu/libfribidi.so.0.4.0", "type": "file" }, { - "bom-ref": "2cbbdb673819d7a4", + "bom-ref": "2e17db783dbbce10", "name": "/usr/lib/x86_64-linux-gnu/libg.a", "type": "file" }, { - "bom-ref": "d95a15471a0df47b", + "bom-ref": "9e076b91813cdc47", "name": "/usr/lib/x86_64-linux-gnu/libgallium-25.2.8-0ubuntu0.24.04.2.so", "type": "file" }, { - "bom-ref": "17d865d90b59e812", + "bom-ref": "e5d3a6f39108539a", "name": "/usr/lib/x86_64-linux-gnu/libgbm.so.1.0.0", "type": "file" }, { - "bom-ref": "740788f12d492fa4", + "bom-ref": "9b9b194e77ddfdc6", "name": "/usr/lib/x86_64-linux-gnu/libgcc_s.so.1", "type": "file" }, { - "bom-ref": "44101f4b1de0b8a6", + "bom-ref": "689d039eb1603764", "name": "/usr/lib/x86_64-linux-gnu/libgcrypt.so.20.4.3", "type": "file" }, { - "bom-ref": "c633455d9990b4bd", + "bom-ref": "91d8be39f41c1ad1", "name": "/usr/lib/x86_64-linux-gnu/libgdbm.so.6.0.0", "type": "file" }, { - "bom-ref": "734e603bc8cfecad", + "bom-ref": "e4c17f44407bda05", "name": "/usr/lib/x86_64-linux-gnu/libgdbm_compat.so.4.0.0", "type": "file" }, { - "bom-ref": "3501bb00af59bb09", + "bom-ref": "d0b9a7cc2fcfe981", "name": "/usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0.4200.10", "type": "file" }, { - "bom-ref": "583983e68b9eb992", + "bom-ref": "e3181af47e99edd2", "name": "/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0", "type": "file" }, { - "bom-ref": "e3951b0c0a507785", + "bom-ref": "901f8879dfd3c205", "name": "/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8000.0", "type": "file" }, { - "bom-ref": "4b7d5dac9473ea38", + "bom-ref": "e8cf5425c6c29b3e", + "name": "/usr/lib/x86_64-linux-gnu/libgirepository-1.0.so.1.0.0", + "type": "file" + }, + { + "bom-ref": "06d18d5192507a14", "name": "/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8000.0", "type": "file" }, { - "bom-ref": "b8a3ed74defeb50f", + "bom-ref": "5165711ad280b1a3", "name": "/usr/lib/x86_64-linux-gnu/libgme.so.0.6.3", "type": "file" }, { - "bom-ref": "f2d160c915ef7414", + "bom-ref": "4024af5a4c9cb19c", "name": "/usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0.8000.0", "type": "file" }, { - "bom-ref": "09c1809c0a101dcb", + "bom-ref": "1340d15fd9f9dbb9", "name": "/usr/lib/x86_64-linux-gnu/libgmp.so.10.5.0", "type": "file" }, { - "bom-ref": "f9b4f12ca7321eb4", + "bom-ref": "66daaf6125d7b226", "name": "/usr/lib/x86_64-linux-gnu/libgnutls.so.30.37.1", "type": "file" }, { - "bom-ref": "9b78e8ce3d00be73", + "bom-ref": "f62f061d6bdc96af", "name": "/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.8000.0", "type": "file" }, { - "bom-ref": "39dcec228e6a6077", + "bom-ref": "c4f447b53d7d4463", "name": "/usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0", "type": "file" }, { - "bom-ref": "7d3a07483fdd5d04", + "bom-ref": "7d2a3eed4fbc1b7a", "name": "/usr/lib/x86_64-linux-gnu/libgpg-error.so.0.34.0", "type": "file" }, { - "bom-ref": "7a54b617b8e2c916", + "bom-ref": "451443f531274b22", "name": "/usr/lib/x86_64-linux-gnu/libgpm.so.2", "type": "file" }, { - "bom-ref": "6a992b211cfe049c", + "bom-ref": "5db980d6b2dd7af8", "name": "/usr/lib/x86_64-linux-gnu/libgprofng.so.0.0.0", "type": "file" }, { - "bom-ref": "2ae5bd86d9f32ce3", + "bom-ref": "11c1bad34f610ef7", "name": "/usr/lib/x86_64-linux-gnu/libgraphite2.so.3.2.1", "type": "file" }, { - "bom-ref": "d76057311fc8d410", + "bom-ref": "7d3b370f35b7c2fc", "name": "/usr/lib/x86_64-linux-gnu/libgsm.so.1.0.19", "type": "file" }, { - "bom-ref": "74cd014403b04351", + "bom-ref": "2d5ae2e1147413c1", "name": "/usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2.2", "type": "file" }, { - "bom-ref": "5d5275109d05c99e", + "bom-ref": "8fa3ce7764e8db71", + "name": "/usr/lib/x86_64-linux-gnu/libgstbase-1.0.so.0.2402.0", + "type": "file" + }, + { + "bom-ref": "b81b737f40f03fd6", + "name": "/usr/lib/x86_64-linux-gnu/libgstcheck-1.0.so.0.2402.0", + "type": "file" + }, + { + "bom-ref": "9f9c0d1be18ac74b", + "name": "/usr/lib/x86_64-linux-gnu/libgstcontroller-1.0.so.0.2402.0", + "type": "file" + }, + { + "bom-ref": "6060091197f522ea", + "name": "/usr/lib/x86_64-linux-gnu/libgstnet-1.0.so.0.2402.0", + "type": "file" + }, + { + "bom-ref": "de66bd3e27956044", + "name": "/usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0.2402.0", + "type": "file" + }, + { + "bom-ref": "f98628d140859206", "name": "/usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0.8000.0", "type": "file" }, { - "bom-ref": "b20f4e00ff565cf6", + "bom-ref": "bda6ba22906fe2b6", "name": "/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0.60830.0", "type": "file" }, { - "bom-ref": "948c486c68956947", + "bom-ref": "c5cc4cee7597928b", "name": "/usr/lib/x86_64-linux-gnu/libhistory.so.8.2", "type": "file" }, { - "bom-ref": "322ee4a5432e23e5", + "bom-ref": "4a2d768706267f3b", "name": "/usr/lib/x86_64-linux-gnu/libhogweed.so.6.8", "type": "file" }, { - "bom-ref": "f953c5853562353a", + "bom-ref": "0520552ab17d68ca", "name": "/usr/lib/x86_64-linux-gnu/libhwasan.so.0.0.0", "type": "file" }, { - "bom-ref": "3d8a4cfde0cdba67", + "bom-ref": "8ea906ae21be8354", + "name": "/usr/lib/x86_64-linux-gnu/libhwloc.so.15.7.0", + "type": "file" + }, + { + "bom-ref": "9b1006b4bcbcada3", "name": "/usr/lib/x86_64-linux-gnu/libhwy.so.1.0.7", "type": "file" }, { - "bom-ref": "5a805104341f1545", + "bom-ref": "75956245ededf59d", "name": "/usr/lib/x86_64-linux-gnu/libhwy_contrib.so.1.0.7", "type": "file" }, { - "bom-ref": "349cef7da31e4860", + "bom-ref": "7b42a72be7e573b0", "name": "/usr/lib/x86_64-linux-gnu/libhwy_test.so.1.0.7", "type": "file" }, { - "bom-ref": "3c79eb65b923f1cc", + "bom-ref": "88cf3a6193894200", "name": "/usr/lib/x86_64-linux-gnu/libibmad.so.5.3.50.0", "type": "file" }, { - "bom-ref": "a2e71c66bb4f5708", + "bom-ref": "55dbd58b56c07e80", "name": "/usr/lib/x86_64-linux-gnu/libibumad.so.3.2.50.0", "type": "file" }, { - "bom-ref": "7daad06a65c7da55", + "bom-ref": "438e6a2e853202e9", "name": "/usr/lib/x86_64-linux-gnu/libibverbs.so.1.14.50.0", "type": "file" }, { - "bom-ref": "3af2446ce27cc2b3", + "bom-ref": "541995be96a9646f", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libbnxt_re-rdmav34.so", "type": "file" }, { - "bom-ref": "69138ea265908c49", + "bom-ref": "069ee810bfc53505", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libcxgb4-rdmav34.so", "type": "file" }, { - "bom-ref": "7155827b04d82005", + "bom-ref": "c7dec17c59f15bfd", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/liberdma-rdmav34.so", "type": "file" }, { - "bom-ref": "7bc91c64c98cfe98", + "bom-ref": "858c585b5f0061fc", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libhfi1verbs-rdmav34.so", "type": "file" }, { - "bom-ref": "7979798146a90fe1", + "bom-ref": "65ade07c9b68b23d", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libhns-rdmav34.so", "type": "file" }, { - "bom-ref": "fced436b3b0c9f74", + "bom-ref": "cd8b1b26af4acb94", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libipathverbs-rdmav34.so", "type": "file" }, { - "bom-ref": "11d5bc97976e9961", + "bom-ref": "b7f8ad16e5b7963d", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libirdma-rdmav34.so", "type": "file" }, { - "bom-ref": "7b244d5ced13b695", + "bom-ref": "665135b6c6549489", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libmthca-rdmav34.so", "type": "file" }, { - "bom-ref": "f3206bbd1e661386", + "bom-ref": "5203a6b6bfa7c5c6", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libocrdma-rdmav34.so", "type": "file" }, { - "bom-ref": "6fc4dff5ebc5af35", + "bom-ref": "59e44b7c0c6f6c99", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libqedr-rdmav34.so", "type": "file" }, { - "bom-ref": "226baed65a01e653", + "bom-ref": "e2ca4450b9d0a417", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/librxe-rdmav34.so", "type": "file" }, { - "bom-ref": "9527b093a3c05acd", + "bom-ref": "2452a58df28a3909", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libsiw-rdmav34.so", "type": "file" }, { - "bom-ref": "bc9f7d9a02e38740", + "bom-ref": "51123705810dadcc", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libvmw_pvrdma-rdmav34.so", "type": "file" }, { - "bom-ref": "5cb050e209f1a9ba", + "bom-ref": "73c809a20aef5b5a", "name": "/usr/lib/x86_64-linux-gnu/libicudata.so.74.2", "type": "file" }, { - "bom-ref": "43d061ef2bd825a4", + "bom-ref": "a292827eb8978cec", "name": "/usr/lib/x86_64-linux-gnu/libicui18n.so.74.2", "type": "file" }, { - "bom-ref": "038487a935c24fef", + "bom-ref": "825aa2f9a813c077", "name": "/usr/lib/x86_64-linux-gnu/libicuio.so.74.2", "type": "file" }, { - "bom-ref": "9f1b502f8f02c651", + "bom-ref": "d3eb515dfcf4b5b1", "name": "/usr/lib/x86_64-linux-gnu/libicutest.so.74.2", "type": "file" }, { - "bom-ref": "411001f54b506360", + "bom-ref": "65aca83625b31b7c", "name": "/usr/lib/x86_64-linux-gnu/libicutu.so.74.2", "type": "file" }, { - "bom-ref": "8c768d07b58ac433", + "bom-ref": "980a27c893179c7f", "name": "/usr/lib/x86_64-linux-gnu/libicuuc.so.74.2", "type": "file" }, { - "bom-ref": "a5fc266ab276196d", + "bom-ref": "82ea8f51dbb47ac7", "name": "/usr/lib/x86_64-linux-gnu/libidn2.so.0.4.0", "type": "file" }, { - "bom-ref": "e4ea635dc89f0306", + "bom-ref": "4bc9cd369a2ec92a", "name": "/usr/lib/x86_64-linux-gnu/libiec61883.so.0.1.1", "type": "file" }, { - "bom-ref": "b5d4781e277c671b", + "bom-ref": "71ff17c66e35f5c9", "name": "/usr/lib/x86_64-linux-gnu/libigdgmm.so.12.10.0", "type": "file" }, { - "bom-ref": "c99a5cf89d3c3b1e", + "bom-ref": "1531a09203d3216f", + "name": "/usr/lib/x86_64-linux-gnu/libigdmd.so.1.16.188", + "type": "file" + }, + { + "bom-ref": "830cf379e16dd6a7", + "name": "/usr/lib/x86_64-linux-gnu/libigdml.so.1.0.231", + "type": "file" + }, + { + "bom-ref": "cf3237cf5ef5a5ae", + "name": "/usr/lib/x86_64-linux-gnu/libigsc.so.1.2.0.0", + "type": "file" + }, + { + "bom-ref": "74083abc887a666e", "name": "/usr/lib/x86_64-linux-gnu/libisl.so.23.3.0", "type": "file" }, { - "bom-ref": "a47c547d8f863377", + "bom-ref": "237571ca62ecc397", "name": "/usr/lib/x86_64-linux-gnu/libitm.so.1.0.0", "type": "file" }, { - "bom-ref": "7e6210f536c91819", + "bom-ref": "9b66ba196c19e6b1", "name": "/usr/lib/x86_64-linux-gnu/libjack.so.0.1.0", "type": "file" }, { - "bom-ref": "b1c5c4f9fd11ee9e", + "bom-ref": "f25a88262b4cb402", "name": "/usr/lib/x86_64-linux-gnu/libjacknet.so.0.1.0", "type": "file" }, { - "bom-ref": "45df835881ce89e8", + "bom-ref": "04eeebee87ccba38", "name": "/usr/lib/x86_64-linux-gnu/libjackserver.so.0.1.0", "type": "file" }, { - "bom-ref": "686c0bde15820099", + "bom-ref": "ad9dc49169908305", "name": "/usr/lib/x86_64-linux-gnu/libjansson.so.4.14.0", "type": "file" }, { - "bom-ref": "5ae9aeab4252be0b", + "bom-ref": "60a87376563f0a1f", "name": "/usr/lib/x86_64-linux-gnu/libjbig.so.0", "type": "file" }, { - "bom-ref": "f1db9badccaae5c4", + "bom-ref": "62d78c8099a904ec", "name": "/usr/lib/x86_64-linux-gnu/libjpeg.so.8.2.2", "type": "file" }, { - "bom-ref": "483c0768b6c9495e", + "bom-ref": "72d2eaeb4e211bb0", "name": "/usr/lib/x86_64-linux-gnu/libjson-c.so.5.3.0", "type": "file" }, { - "bom-ref": "8c23f6395cf90012", + "bom-ref": "e0dfabc8c1aa6d9e", "name": "/usr/lib/x86_64-linux-gnu/libjxl.so.0.7.0", "type": "file" }, { - "bom-ref": "fd58781c573209b1", + "bom-ref": "4bde267963181ee9", "name": "/usr/lib/x86_64-linux-gnu/libjxl_threads.so.0.7.0", "type": "file" }, { - "bom-ref": "5789c2744f92ed0d", + "bom-ref": "7ae67b7056f59f8d", "name": "/usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1", "type": "file" }, { - "bom-ref": "64a7365cf00ed865", + "bom-ref": "ed3fdd5893641fc9", "name": "/usr/lib/x86_64-linux-gnu/libkeyutils.so.1.10", "type": "file" }, { - "bom-ref": "9fe9516c9d00e9be", + "bom-ref": "7b45bf09a010dd84", "name": "/usr/lib/x86_64-linux-gnu/libkmod.so.2.4.1", "type": "file" }, { - "bom-ref": "2dc35c30efb7915a", + "bom-ref": "dd3548ed357fa782", "name": "/usr/lib/x86_64-linux-gnu/libkrb5.so.3.3", "type": "file" }, { - "bom-ref": "8647c9c6ae1f068d", + "bom-ref": "fc5f7ab752e0d125", "name": "/usr/lib/x86_64-linux-gnu/libkrb5support.so.0.1", "type": "file" }, { - "bom-ref": "fc750962de661fd0", + "bom-ref": "d092584332c6bdd8", "name": "/usr/lib/x86_64-linux-gnu/liblber.so.2.0.200", "type": "file" }, { - "bom-ref": "bcb1613a140ecd9b", + "bom-ref": "e8c1dffd5fd68f6f", "name": "/usr/lib/x86_64-linux-gnu/liblcms2.so.2.0.14", "type": "file" }, { - "bom-ref": "cd17d9cd668b8b95", + "bom-ref": "22eeb0830d5ab29d", "name": "/usr/lib/x86_64-linux-gnu/libldap.so.2.0.200", "type": "file" }, { - "bom-ref": "f67fc1ebbcdb47ad", + "bom-ref": "640d7f4b4465e3d9", "name": "/usr/lib/x86_64-linux-gnu/liblilv-0.so.0.24.22", "type": "file" }, { - "bom-ref": "1cd985e4859d3253", + "bom-ref": "4129b3a14fd73ddb", "name": "/usr/lib/x86_64-linux-gnu/liblsan.so.0.0.0", "type": "file" }, { - "bom-ref": "f1ee972cadf0f3df", + "bom-ref": "5bcc19e8eeab03d5", "name": "/usr/lib/x86_64-linux-gnu/liblz4.so.1.9.4", "type": "file" }, { - "bom-ref": "cbebd53cf167eb10", + "bom-ref": "512d46111d5cf5f2", "name": "/usr/lib/x86_64-linux-gnu/liblzma.so.5.4.5", "type": "file" }, { - "bom-ref": "4d824c5330bd882b", + "bom-ref": "1252ec6f47dbd03f", "name": "/usr/lib/x86_64-linux-gnu/libm-2.39.a", "type": "file" }, { - "bom-ref": "a4a01222c0e37622", + "bom-ref": "f7cd4459a61db61e", "name": "/usr/lib/x86_64-linux-gnu/libm.a", "type": "file" }, { - "bom-ref": "ac17b837b2589dcf", + "bom-ref": "6cd808eda546715f", "name": "/usr/lib/x86_64-linux-gnu/libm.so", "type": "file" }, { - "bom-ref": "4e0477ad71516019", + "bom-ref": "a56aa71f608bb163", "name": "/usr/lib/x86_64-linux-gnu/libm.so.6", "type": "file" }, { - "bom-ref": "f7b6bb6615ce8370", + "bom-ref": "1cb2f2fcdb704c90", "name": "/usr/lib/x86_64-linux-gnu/libmana.so.1.0.50.0", "type": "file" }, { - "bom-ref": "0930d1825c21fb7a", + "bom-ref": "221adfddfd3ae62a", "name": "/usr/lib/x86_64-linux-gnu/libmbedcrypto.so.2.28.8", "type": "file" }, { - "bom-ref": "bf063acbcbd952c3", + "bom-ref": "aae8adc23d1dc78f", "name": "/usr/lib/x86_64-linux-gnu/libmcheck.a", "type": "file" }, { - "bom-ref": "a91729fc3284a567", + "bom-ref": "885d3e2f11168e35", "name": "/usr/lib/x86_64-linux-gnu/libmd.so.0.1.0", "type": "file" }, { - "bom-ref": "833892ff5a25b5b3", + "bom-ref": "c38604cab24e0f69", "name": "/usr/lib/x86_64-linux-gnu/libmemusage.so", "type": "file" }, { - "bom-ref": "7dc7397b6b38ebcc", + "bom-ref": "ea008a770afdb76e", "name": "/usr/lib/x86_64-linux-gnu/libmenuw.so.6.4", "type": "file" }, { - "bom-ref": "b30aa19c6c5992ed", + "bom-ref": "e707e69a6998035d", + "name": "/usr/lib/x86_64-linux-gnu/libmetee.so.6.2.1.0", + "type": "file" + }, + { + "bom-ref": "001b010a24516ccb", + "name": "/usr/lib/x86_64-linux-gnu/libmfx-gen.so.1.2.17", + "type": "file" + }, + { + "bom-ref": "ab8c488e60c34aa5", + "name": "/usr/lib/x86_64-linux-gnu/libmfx-gen/enctools.so", + "type": "file" + }, + { + "bom-ref": "35a1579d8dd72d99", "name": "/usr/lib/x86_64-linux-gnu/libmlx4.so.1.0.50.0", "type": "file" }, { - "bom-ref": "225856990e70ceb0", + "bom-ref": "60082e4281166fd8", "name": "/usr/lib/x86_64-linux-gnu/libmlx5.so.1.24.50.0", "type": "file" }, { - "bom-ref": "bede31bbee891c6b", + "bom-ref": "002ae636d69e1d73", "name": "/usr/lib/x86_64-linux-gnu/libmount.so.1.1.0", "type": "file" }, { - "bom-ref": "cebf01711fca461b", + "bom-ref": "299fd9d71a19f2b3", "name": "/usr/lib/x86_64-linux-gnu/libmp3lame.so.0.0.0", "type": "file" }, { - "bom-ref": "5679d48d75067099", + "bom-ref": "a614625b817c8a85", "name": "/usr/lib/x86_64-linux-gnu/libmpc.so.3.3.1", "type": "file" }, { - "bom-ref": "d51defea5cdf4bdc", + "bom-ref": "fca5f6db6f6bba28", "name": "/usr/lib/x86_64-linux-gnu/libmpfr.so.6.2.1", "type": "file" }, { - "bom-ref": "ec40f43b6dad59a9", + "bom-ref": "b01bc19a4becfad1", "name": "/usr/lib/x86_64-linux-gnu/libmpg123.so.0.48.2", "type": "file" }, { - "bom-ref": "0b323ee7d33afffe", + "bom-ref": "77d31c322816e2a2", "name": "/usr/lib/x86_64-linux-gnu/libmvec.a", "type": "file" }, { - "bom-ref": "89706fbb2a3f2650", + "bom-ref": "228daa3a6df8d8ee", "name": "/usr/lib/x86_64-linux-gnu/libmvec.so.1", "type": "file" }, { - "bom-ref": "b500d2250b934533", + "bom-ref": "1a9a4433635dcbdb", "name": "/usr/lib/x86_64-linux-gnu/libmysofa.so.1.3.2", "type": "file" }, { - "bom-ref": "268f69603abd603d", + "bom-ref": "5f0e779ca7ff7743", "name": "/usr/lib/x86_64-linux-gnu/libncursesw.so.6.4", "type": "file" }, { - "bom-ref": "5464aed528887b1d", + "bom-ref": "20ccc4976bffe06b", "name": "/usr/lib/x86_64-linux-gnu/libnettle.so.8.8", "type": "file" }, { - "bom-ref": "c703da187da63be4", + "bom-ref": "6c4a9998133328ac", "name": "/usr/lib/x86_64-linux-gnu/libnghttp2.so.14.26.0", "type": "file" }, { - "bom-ref": "0a133a6147d49301", + "bom-ref": "0830606145b81779", "name": "/usr/lib/x86_64-linux-gnu/libnl-3.so.200.26.0", "type": "file" }, { - "bom-ref": "839e62e227167f8e", + "bom-ref": "75c0bff614c24ec2", "name": "/usr/lib/x86_64-linux-gnu/libnl-route-3.so.200.26.0", "type": "file" }, { - "bom-ref": "1b51d7d68fcdb191", + "bom-ref": "83a0481889a33de1", "name": "/usr/lib/x86_64-linux-gnu/libnorm.so.1", "type": "file" }, { - "bom-ref": "7ea14b28843e9678", + "bom-ref": "f64ca71b05fa6de2", "name": "/usr/lib/x86_64-linux-gnu/libnpth.so.0.1.2", "type": "file" }, { - "bom-ref": "f1a35b56ee55b08a", + "bom-ref": "8b7f6abdb5ad5c3c", "name": "/usr/lib/x86_64-linux-gnu/libnsl.so.1", "type": "file" }, { - "bom-ref": "4bb865c3be68b8a3", + "bom-ref": "dc5c029e723712d9", "name": "/usr/lib/x86_64-linux-gnu/libnss_compat.so.2", "type": "file" }, { - "bom-ref": "9ae62fbe592970b6", + "bom-ref": "6a19a387369d5e10", "name": "/usr/lib/x86_64-linux-gnu/libnss_dns.so.2", "type": "file" }, { - "bom-ref": "584b12e227d97d30", + "bom-ref": "0b7fce41246837b6", "name": "/usr/lib/x86_64-linux-gnu/libnss_files.so.2", "type": "file" }, { - "bom-ref": "7e691df0897f3a16", + "bom-ref": "4bf3677637b8e258", "name": "/usr/lib/x86_64-linux-gnu/libnss_hesiod.so.2", "type": "file" }, { - "bom-ref": "7e1bddcbdee31ac8", + "bom-ref": "cb4bb0c84a043eb4", "name": "/usr/lib/x86_64-linux-gnu/libnuma.so.1.0.0", "type": "file" }, { - "bom-ref": "05b77a4ff38ba437", + "bom-ref": "e1684bfaf5435f68", "name": "/usr/lib/x86_64-linux-gnu/libocloc.so", "type": "file" }, { - "bom-ref": "ac7fe5b210ee9cf1", + "bom-ref": "e59904b92c93b2ed", "name": "/usr/lib/x86_64-linux-gnu/libogg.so.0.8.5", "type": "file" }, { - "bom-ref": "4d694e760356a3da", + "bom-ref": "6cd938c5b95eaeea", "name": "/usr/lib/x86_64-linux-gnu/libopcodes-2.42-system.so", "type": "file" }, { - "bom-ref": "ce42baed926bb478", + "bom-ref": "085fde14cf1e1110", "name": "/usr/lib/x86_64-linux-gnu/libopenal.so.1.23.1", "type": "file" }, { - "bom-ref": "1b0444c9d112aa4d", + "bom-ref": "45b99a12108b53e5", "name": "/usr/lib/x86_64-linux-gnu/libopenjp2.so.2.5.0", "type": "file" }, { - "bom-ref": "9b9e70eb4314b8bd", + "bom-ref": "4ce09b8d020d032d", "name": "/usr/lib/x86_64-linux-gnu/libopenmpt.so.0.4.4", "type": "file" }, { - "bom-ref": "a4b8014e48422731", + "bom-ref": "3e7dfc7473916675", "name": "/usr/lib/x86_64-linux-gnu/libopus.so.0.9.0", "type": "file" }, { - "bom-ref": "cb4827915674c4b3", + "bom-ref": "2019ff093c37cc61", "name": "/usr/lib/x86_64-linux-gnu/libp11-kit.so.0.3.1", "type": "file" }, { - "bom-ref": "4fdebf3e90da1451", + "bom-ref": "9ca0e9bcfbcb348f", + "name": "/usr/lib/x86_64-linux-gnu/libpackagekit-glib2.so.18.1.3", + "type": "file" + }, + { + "bom-ref": "e41167f0bc4e3c5f", "name": "/usr/lib/x86_64-linux-gnu/libpam.so.0.85.1", "type": "file" }, { - "bom-ref": "c3a5fb6c0bbb2076", + "bom-ref": "4938194173a2aa60", "name": "/usr/lib/x86_64-linux-gnu/libpam_misc.so.0.82.1", "type": "file" }, { - "bom-ref": "191c93e4412f3447", + "bom-ref": "33a17d8e8f18f729", "name": "/usr/lib/x86_64-linux-gnu/libpamc.so.0.82.1", "type": "file" }, { - "bom-ref": "845c9a6327ddaed1", + "bom-ref": "db6dea3aae305c17", "name": "/usr/lib/x86_64-linux-gnu/libpanelw.so.6.4", "type": "file" }, { - "bom-ref": "f66358153990ecd4", + "bom-ref": "a7b086aa4863a978", "name": "/usr/lib/x86_64-linux-gnu/libpango-1.0.so.0.5200.1", "type": "file" }, { - "bom-ref": "e61df3a313e22e0d", + "bom-ref": "cac1da99706395b9", "name": "/usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0.5200.1", "type": "file" }, { - "bom-ref": "693d69e9f0e1cb00", + "bom-ref": "c3437fae98b8406c", "name": "/usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0.5200.1", "type": "file" }, { - "bom-ref": "a3de3eda4200a544", + "bom-ref": "a8821794667d2484", "name": "/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1", "type": "file" }, { - "bom-ref": "2e31345a64bfd1b0", + "bom-ref": "c00876d562d26f82", "name": "/usr/lib/x86_64-linux-gnu/libpcprofile.so", "type": "file" }, { - "bom-ref": "f4e11e6266739670", + "bom-ref": "e18ca8313aa1821a", "name": "/usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.11.2", "type": "file" }, { - "bom-ref": "9d4711a024f5ac0b", + "bom-ref": "2e7f258a3aec549f", "name": "/usr/lib/x86_64-linux-gnu/libperl.so.5.38.2", "type": "file" }, { - "bom-ref": "e31345a19f5e0f81", + "bom-ref": "a20badd45ebbad21", "name": "/usr/lib/x86_64-linux-gnu/libpgm-5.3.so.0.0.128", "type": "file" }, { - "bom-ref": "94475171eef90483", + "bom-ref": "ef188718f7fe5c7f", "name": "/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.42.2", "type": "file" }, { - "bom-ref": "c00b2bc1c95efbf7", + "bom-ref": "c22978b504b640c7", "name": "/usr/lib/x86_64-linux-gnu/libplacebo.so.338", "type": "file" }, { - "bom-ref": "2f39b6b16fc70a25", + "bom-ref": "e360ed296548bc55", "name": "/usr/lib/x86_64-linux-gnu/libpng16.so.16.43.0", "type": "file" }, { - "bom-ref": "bdc2e7e6badd1552", + "bom-ref": "ce960d3a70d39232", "name": "/usr/lib/x86_64-linux-gnu/libpocketsphinx.so.3.0.0", "type": "file" }, { - "bom-ref": "681f7f7b36ebec0c", + "bom-ref": "16a1ec90f2ec8056", + "name": "/usr/lib/x86_64-linux-gnu/libpolkit-agent-1.so.0.0.0", + "type": "file" + }, + { + "bom-ref": "4a052eddd47983b7", + "name": "/usr/lib/x86_64-linux-gnu/libpolkit-gobject-1.so.0.0.0", + "type": "file" + }, + { + "bom-ref": "46e15bea629b9dc8", "name": "/usr/lib/x86_64-linux-gnu/libpostproc.so.57.3.100", "type": "file" }, { - "bom-ref": "beb4863e090343ec", + "bom-ref": "028645229ae73672", "name": "/usr/lib/x86_64-linux-gnu/libproc2.so.0.0.2", "type": "file" }, { - "bom-ref": "31cd48de153dc12d", + "bom-ref": "a2719f8b14023889", "name": "/usr/lib/x86_64-linux-gnu/libpsl.so.5.3.4", "type": "file" }, { - "bom-ref": "5639c427e968e02d", + "bom-ref": "e2f8bccd3fb5c4cb", "name": "/usr/lib/x86_64-linux-gnu/libpsx.so.2.66", "type": "file" }, { - "bom-ref": "35b49b99004099f4", + "bom-ref": "2c9da029813b7364", "name": "/usr/lib/x86_64-linux-gnu/libpthread.a", "type": "file" }, { - "bom-ref": "9ea7489cf8e33939", + "bom-ref": "3953001675b75c6b", "name": "/usr/lib/x86_64-linux-gnu/libpthread.so.0", "type": "file" }, { - "bom-ref": "85bddd565878e76b", + "bom-ref": "119123792eccc3a7", "name": "/usr/lib/x86_64-linux-gnu/libpthread_nonshared.a", "type": "file" }, { - "bom-ref": "ce220938e7f88c92", + "bom-ref": "7d2630f9868f5daa", "name": "/usr/lib/x86_64-linux-gnu/libpulse-simple.so.0.1.1", "type": "file" }, { - "bom-ref": "0bd1884869ecc0d2", + "bom-ref": "be6363cee1f499ca", "name": "/usr/lib/x86_64-linux-gnu/libpulse.so.0.24.2", "type": "file" }, { - "bom-ref": "218243da61eb1a5c", + "bom-ref": "731d0eba6e03229c", "name": "/usr/lib/x86_64-linux-gnu/libpython3.12.so.1.0", "type": "file" }, { - "bom-ref": "9b9167fcc57945dd", + "bom-ref": "59c984bb0c88a199", "name": "/usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0", "type": "file" }, { - "bom-ref": "26d2e9724247da2b", + "bom-ref": "72291ef3ff74df07", "name": "/usr/lib/x86_64-linux-gnu/librabbitmq.so.4.5.0", "type": "file" }, { - "bom-ref": "a12d29927131718c", + "bom-ref": "a35898108b6480bc", "name": "/usr/lib/x86_64-linux-gnu/librav1e.so.0.7.1", "type": "file" }, { - "bom-ref": "9f3e90566d4213ad", + "bom-ref": "2c079a69e4d5f7d9", "name": "/usr/lib/x86_64-linux-gnu/libraw1394.so.11.1.0", "type": "file" }, { - "bom-ref": "03ed03b82c6d31f7", + "bom-ref": "22ae8e56f4dc9597", "name": "/usr/lib/x86_64-linux-gnu/librdmacm.so.1.3.50.0", "type": "file" }, { - "bom-ref": "4571c1330a2501d8", + "bom-ref": "2771319e0801d1bc", "name": "/usr/lib/x86_64-linux-gnu/libreadline.so.8.2", "type": "file" }, { - "bom-ref": "ae8e135ffb1d128c", + "bom-ref": "b463e9b3362f1ddc", "name": "/usr/lib/x86_64-linux-gnu/libresolv.a", "type": "file" }, { - "bom-ref": "24d0b93197bc34b3", + "bom-ref": "a81960b15779e3d9", "name": "/usr/lib/x86_64-linux-gnu/libresolv.so.2", "type": "file" }, { - "bom-ref": "b6b3f6224fd22636", + "bom-ref": "5d83a7351221e136", "name": "/usr/lib/x86_64-linux-gnu/librist.so.4.3.1", "type": "file" }, { - "bom-ref": "6728e8e7236f9674", + "bom-ref": "511cca9c068bcc2c", "name": "/usr/lib/x86_64-linux-gnu/librom1394.so.0.3.0", "type": "file" }, { - "bom-ref": "695273a0a87af216", + "bom-ref": "81efa2927f55357e", "name": "/usr/lib/x86_64-linux-gnu/librsvg-2.so.2.50.0", "type": "file" }, { - "bom-ref": "3f169e0505850e0f", + "bom-ref": "a2ad64facd2fddaf", "name": "/usr/lib/x86_64-linux-gnu/librt.a", "type": "file" }, { - "bom-ref": "c3658a8079979d6a", + "bom-ref": "b8a548721294b8c0", "name": "/usr/lib/x86_64-linux-gnu/librt.so.1", "type": "file" }, { - "bom-ref": "7886189f639625f1", + "bom-ref": "0231e4123da09fb5", "name": "/usr/lib/x86_64-linux-gnu/librtmp.so.1", "type": "file" }, { - "bom-ref": "93934e7a5a078672", + "bom-ref": "0740d6bc75940672", "name": "/usr/lib/x86_64-linux-gnu/librubberband.so.2.3.0", "type": "file" }, { - "bom-ref": "e8533fe2f4a092a5", + "bom-ref": "6ffd2cb56d9e3679", "name": "/usr/lib/x86_64-linux-gnu/libsamplerate.so.0.2.2", "type": "file" }, { - "bom-ref": "80608511f3f8d9ec", + "bom-ref": "55c3e60b5bf85e4c", "name": "/usr/lib/x86_64-linux-gnu/libsasl2.so.2.0.25", "type": "file" }, { - "bom-ref": "d3afed4bdd119ee6", + "bom-ref": "e7561f864d3a6e2c", "name": "/usr/lib/x86_64-linux-gnu/libseccomp.so.2.5.5", "type": "file" }, { - "bom-ref": "4667cd8e4f9963ff", + "bom-ref": "3b04b1807c0ee8cd", "name": "/usr/lib/x86_64-linux-gnu/libselinux.so.1", "type": "file" }, { - "bom-ref": "8ec68f416008a317", + "bom-ref": "064f04e6cd753539", "name": "/usr/lib/x86_64-linux-gnu/libsemanage.so.2", "type": "file" }, { - "bom-ref": "20f45990f061b3d2", + "bom-ref": "9daf167dec564216", "name": "/usr/lib/x86_64-linux-gnu/libsensors.so.5.0.0", "type": "file" }, { - "bom-ref": "afaf57b7104fce88", + "bom-ref": "b630d8d392b95812", "name": "/usr/lib/x86_64-linux-gnu/libsepol.so.2", "type": "file" }, { - "bom-ref": "e8d6a827393ffd52", + "bom-ref": "edf0e67614f4c72a", "name": "/usr/lib/x86_64-linux-gnu/libserd-0.so.0.32.2", "type": "file" }, { - "bom-ref": "b239bd598ed203cf", + "bom-ref": "c96cfdbe5332daab", "name": "/usr/lib/x86_64-linux-gnu/libsframe.so.1.0.0", "type": "file" }, { - "bom-ref": "fd72c988c60c6b22", + "bom-ref": "ecbc830db8be10b2", "name": "/usr/lib/x86_64-linux-gnu/libsharpyuv.so.0.0.1", "type": "file" }, { - "bom-ref": "89c5b8935bd7a365", + "bom-ref": "dc96db356fcf6379", "name": "/usr/lib/x86_64-linux-gnu/libshine.so.3.0.1", "type": "file" }, { - "bom-ref": "54fc7b4d6a2f8471", + "bom-ref": "952e38852d480e01", "name": "/usr/lib/x86_64-linux-gnu/libslang.so.2.3.3", "type": "file" }, { - "bom-ref": "4dbd8407c1e6a390", + "bom-ref": "c6862fbcc84e3204", "name": "/usr/lib/x86_64-linux-gnu/libsmartcols.so.1.1.0", "type": "file" }, { - "bom-ref": "fd6f4feb9fad5b97", + "bom-ref": "d08473088b801abb", "name": "/usr/lib/x86_64-linux-gnu/libsnappy.so.1.1.10", "type": "file" }, { - "bom-ref": "c0e33a2a66358fe8", + "bom-ref": "5e7db510a857a954", "name": "/usr/lib/x86_64-linux-gnu/libsndfile.so.1.0.37", "type": "file" }, { - "bom-ref": "f3f00bbbdee16012", + "bom-ref": "901efcd9c031efba", "name": "/usr/lib/x86_64-linux-gnu/libsndio.so.7.2", "type": "file" }, { - "bom-ref": "867375c57459d475", + "bom-ref": "67b6c33fe3494ce9", "name": "/usr/lib/x86_64-linux-gnu/libsodium.so.23.3.0", "type": "file" }, { - "bom-ref": "943e92da5cc0a197", + "bom-ref": "bb4f9676ff7f2bd7", "name": "/usr/lib/x86_64-linux-gnu/libsord-0.so.0.16.16", "type": "file" }, { - "bom-ref": "2ac11a1754d9b440", + "bom-ref": "cb5bd4ff791d1a0c", "name": "/usr/lib/x86_64-linux-gnu/libsoxr.so.0.1.2", "type": "file" }, { - "bom-ref": "ac4032133b1905b2", + "bom-ref": "78dccf4434f023c2", "name": "/usr/lib/x86_64-linux-gnu/libspeex.so.1.5.2", "type": "file" }, { - "bom-ref": "fc7b23ae94c5ebba", + "bom-ref": "271356a721c8c746", "name": "/usr/lib/x86_64-linux-gnu/libsphinxad.so.3.0.0", "type": "file" }, { - "bom-ref": "62db7e4ecbb4f6d4", + "bom-ref": "47dd3e8c36dce094", "name": "/usr/lib/x86_64-linux-gnu/libsphinxbase.so.3.0.0", "type": "file" }, { - "bom-ref": "0a1f89bfb11f136f", + "bom-ref": "d18cd78a065b3c0f", "name": "/usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6", "type": "file" }, { - "bom-ref": "4caf31ed9c4dc8b7", + "bom-ref": "953d8d50c7bea067", "name": "/usr/lib/x86_64-linux-gnu/libsratom-0.so.0.6.16", "type": "file" }, { - "bom-ref": "46c1f68fa3d174fe", + "bom-ref": "0dbb93177df31302", "name": "/usr/lib/x86_64-linux-gnu/libsrt-gnutls.so.1.5.3", "type": "file" }, { - "bom-ref": "6ceed0587c0f0ac0", + "bom-ref": "4796187618718f7e", "name": "/usr/lib/x86_64-linux-gnu/libss.so.2.0", "type": "file" }, { - "bom-ref": "742fbde571897fcc", + "bom-ref": "9be6b4ae2a610444", "name": "/usr/lib/x86_64-linux-gnu/libssh-gcrypt.so.4.9.6", "type": "file" }, { - "bom-ref": "317a4c77c4a86808", + "bom-ref": "805ed5d6ab260b9c", "name": "/usr/lib/x86_64-linux-gnu/libssh.so.4.9.6", "type": "file" }, { - "bom-ref": "bcb2bce95b11488a", + "bom-ref": "ca39010ec4790d8e", "name": "/usr/lib/x86_64-linux-gnu/libssl.so.3", "type": "file" }, { - "bom-ref": "3a000de9f286fbf6", + "bom-ref": "2b9bca46e1284bdc", "name": "/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33", "type": "file" }, { - "bom-ref": "28fae976c2597395", + "bom-ref": "ec2b56bdc0560c75", + "name": "/usr/lib/x86_64-linux-gnu/libstemmer.so.0d.0.0", + "type": "file" + }, + { + "bom-ref": "69cf9373ce8784e9", "name": "/usr/lib/x86_64-linux-gnu/libswresample.so.4.12.100", "type": "file" }, { - "bom-ref": "89059f5afe472039", + "bom-ref": "0272a9aeb5b2683d", "name": "/usr/lib/x86_64-linux-gnu/libswscale.so.7.5.100", "type": "file" }, { - "bom-ref": "40f37614310aa1c2", + "bom-ref": "dc8b969d46d71eaa", "name": "/usr/lib/x86_64-linux-gnu/libsystemd.so.0.38.0", "type": "file" }, { - "bom-ref": "e73a927ceda088bf", + "bom-ref": "f5118af1580be9e9", "name": "/usr/lib/x86_64-linux-gnu/libtasn1.so.6.6.3", "type": "file" }, { - "bom-ref": "9fabffcc67b18512", + "bom-ref": "81fa9abc7550401e", "name": "/usr/lib/x86_64-linux-gnu/libthai.so.0.3.1", "type": "file" }, { - "bom-ref": "0eecd11d07fdc945", + "bom-ref": "89974063a63a6989", "name": "/usr/lib/x86_64-linux-gnu/libtheora.so.0.3.10", "type": "file" }, { - "bom-ref": "e8a7d98367c1f088", + "bom-ref": "022f7b9986084c40", "name": "/usr/lib/x86_64-linux-gnu/libtheoradec.so.1.1.4", "type": "file" }, { - "bom-ref": "33cbb9049ce2ec67", + "bom-ref": "c503dd717fb77def", "name": "/usr/lib/x86_64-linux-gnu/libtheoraenc.so.1.1.2", "type": "file" }, { - "bom-ref": "1fad637ce94dadda", + "bom-ref": "b542498ebf62ae04", "name": "/usr/lib/x86_64-linux-gnu/libthread_db.so.1", "type": "file" }, { - "bom-ref": "cb3c86e59ed8933d", + "bom-ref": "8bbeaf18a5bc422b", "name": "/usr/lib/x86_64-linux-gnu/libtic.so.6.4", "type": "file" }, { - "bom-ref": "ec3e79baa0da3c88", + "bom-ref": "0894d26425c971c4", "name": "/usr/lib/x86_64-linux-gnu/libtiff.so.6.0.1", "type": "file" }, { - "bom-ref": "14b68407692d3246", + "bom-ref": "e8bd3bb3a139c620", "name": "/usr/lib/x86_64-linux-gnu/libtinfo.so.6.4", "type": "file" }, { - "bom-ref": "07552cf2124aabc4", + "bom-ref": "50dabe18b02208e8", "name": "/usr/lib/x86_64-linux-gnu/libtsan.so.2.0.0", "type": "file" }, { - "bom-ref": "8397cca21a7b403b", + "bom-ref": "7f146c83a0062377", "name": "/usr/lib/x86_64-linux-gnu/libtwolame.so.0.0.0", "type": "file" }, { - "bom-ref": "8530ab758da32924", + "bom-ref": "e85edfafdeae1c68", "name": "/usr/lib/x86_64-linux-gnu/libubsan.so.1.0.0", "type": "file" }, { - "bom-ref": "d088a49141b19d5f", + "bom-ref": "900e04ad04d0287f", "name": "/usr/lib/x86_64-linux-gnu/libudev.so.1.7.8", "type": "file" }, { - "bom-ref": "c715182bece234fa", + "bom-ref": "2a6b30a10e8c8cae", "name": "/usr/lib/x86_64-linux-gnu/libudfread.so.0.1.0", "type": "file" }, { - "bom-ref": "471a2a7f24bb7a6f", + "bom-ref": "20e3a17b5a63422f", "name": "/usr/lib/x86_64-linux-gnu/libunibreak.so.5.0.1", "type": "file" }, { - "bom-ref": "d2684adc2040108b", + "bom-ref": "f44c7c123c2aaed5", "name": "/usr/lib/x86_64-linux-gnu/libunistring.so.5.0.0", "type": "file" }, { - "bom-ref": "961a10fae4d3bd56", + "bom-ref": "b36371358802bbf9", + "name": "/usr/lib/x86_64-linux-gnu/libunwind-coredump.so.0.0.0", + "type": "file" + }, + { + "bom-ref": "18059edc0bc27881", + "name": "/usr/lib/x86_64-linux-gnu/libunwind-ptrace.so.0.0.0", + "type": "file" + }, + { + "bom-ref": "d68b79bea22e13f8", + "name": "/usr/lib/x86_64-linux-gnu/libunwind-x86_64.so.8.0.1", + "type": "file" + }, + { + "bom-ref": "09cb77574be6124b", + "name": "/usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1", + "type": "file" + }, + { + "bom-ref": "30d7022339df5d26", "name": "/usr/lib/x86_64-linux-gnu/libusb-1.0.so.0.4.0", "type": "file" }, { - "bom-ref": "fd0f358c29c9c344", + "bom-ref": "b0534d6a448e8a44", "name": "/usr/lib/x86_64-linux-gnu/libutil.a", "type": "file" }, { - "bom-ref": "dd6366d850d94b08", + "bom-ref": "fd0b73bc58fafc5e", "name": "/usr/lib/x86_64-linux-gnu/libutil.so.1", "type": "file" }, { - "bom-ref": "bdaca153a765de7c", + "bom-ref": "f12cd3ccc8a14dc0", "name": "/usr/lib/x86_64-linux-gnu/libuuid.so.1.3.0", "type": "file" }, { - "bom-ref": "c9f83616cdcfcc5f", - "name": "/usr/lib/x86_64-linux-gnu/libva-drm.so.2.2000.0", + "bom-ref": "3090358417bc15df", + "name": "/usr/lib/x86_64-linux-gnu/libva-drm.so.2.2400.0", "type": "file" }, { - "bom-ref": "ca7617aa52984539", - "name": "/usr/lib/x86_64-linux-gnu/libva-x11.so.2.2000.0", + "bom-ref": "6ea6c3abf72736bb", + "name": "/usr/lib/x86_64-linux-gnu/libva-x11.so.2.2400.0", "type": "file" }, { - "bom-ref": "6ba4fa936ee7068e", - "name": "/usr/lib/x86_64-linux-gnu/libva.so.2.2000.0", + "bom-ref": "7bbd8825c80bac6a", + "name": "/usr/lib/x86_64-linux-gnu/libva.so.2.2400.0", "type": "file" }, { - "bom-ref": "0cc81428e8f4c945", + "bom-ref": "1a64b42a1da853ad", "name": "/usr/lib/x86_64-linux-gnu/libvdpau.so.1.0.0", "type": "file" }, { - "bom-ref": "2ef541bf90ab192b", + "bom-ref": "5541474ea12fc01f", "name": "/usr/lib/x86_64-linux-gnu/libvidstab.so.1.1", "type": "file" }, { - "bom-ref": "67c7bf46081932d4", + "bom-ref": "d6652e76b85e4490", "name": "/usr/lib/x86_64-linux-gnu/libvorbis.so.0.4.9", "type": "file" }, { - "bom-ref": "eddd58ca2379469e", + "bom-ref": "147222f14b026c9e", "name": "/usr/lib/x86_64-linux-gnu/libvorbisenc.so.2.0.12", "type": "file" }, { - "bom-ref": "023bdf7023b33f6c", + "bom-ref": "ceffe4d5ed416f44", "name": "/usr/lib/x86_64-linux-gnu/libvorbisfile.so.3.3.8", "type": "file" }, { - "bom-ref": "4fac9e9c11073d80", + "bom-ref": "f1d5965d7371eda8", "name": "/usr/lib/x86_64-linux-gnu/libvpl.so.2.9", "type": "file" }, { - "bom-ref": "ede6b4043b8ecf1c", + "bom-ref": "8aeafe75bbe89e90", "name": "/usr/lib/x86_64-linux-gnu/libvpx.so.9.0.0", "type": "file" }, { - "bom-ref": "66ee6a38ea4d782f", + "bom-ref": "e945059d03740e77", "name": "/usr/lib/x86_64-linux-gnu/libvulkan.so.1.3.275", "type": "file" }, { - "bom-ref": "cf98e832547bf149", + "bom-ref": "30776509303e1025", "name": "/usr/lib/x86_64-linux-gnu/libwayland-client.so.0.22.0", "type": "file" }, { - "bom-ref": "206ca4823e201318", + "bom-ref": "c2430642355c7784", "name": "/usr/lib/x86_64-linux-gnu/libwayland-cursor.so.0.22.0", "type": "file" }, { - "bom-ref": "c4b73509d4385719", + "bom-ref": "e3bde1118d8dd1a1", "name": "/usr/lib/x86_64-linux-gnu/libwayland-egl.so.1.22.0", "type": "file" }, { - "bom-ref": "510ad45e95df9f09", + "bom-ref": "e3e36f621b79dd8d", "name": "/usr/lib/x86_64-linux-gnu/libwebp.so.7.1.8", "type": "file" }, { - "bom-ref": "bf4e54aef7d683bd", + "bom-ref": "c24c3b129d65c415", "name": "/usr/lib/x86_64-linux-gnu/libwebpmux.so.3.0.13", "type": "file" }, { - "bom-ref": "140b5860acb4a7ba", + "bom-ref": "2bfb597fed3c1a22", "name": "/usr/lib/x86_64-linux-gnu/libx264.so.164", "type": "file" }, { - "bom-ref": "9276f2d659a21232", + "bom-ref": "9d299d7d7b7f562a", "name": "/usr/lib/x86_64-linux-gnu/libx265.so.199", "type": "file" }, { - "bom-ref": "d0b5d7205fc101b0", + "bom-ref": "ac7e8666c55ba5d8", "name": "/usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0.1.0", "type": "file" }, { - "bom-ref": "fb80212d6b54d4f4", + "bom-ref": "d0c95db9a1e1b780", "name": "/usr/lib/x86_64-linux-gnu/libxcb-glx.so.0.0.0", "type": "file" }, { - "bom-ref": "ae2814b83cd7731b", + "bom-ref": "c66fe5b4ae817ad3", "name": "/usr/lib/x86_64-linux-gnu/libxcb-present.so.0.0.0", "type": "file" }, { - "bom-ref": "a8ae0f2932b73b99", + "bom-ref": "9d960da265916bf5", "name": "/usr/lib/x86_64-linux-gnu/libxcb-randr.so.0.1.0", "type": "file" }, { - "bom-ref": "aa5028ef71c1bdc1", + "bom-ref": "bf81d66628e9121d", "name": "/usr/lib/x86_64-linux-gnu/libxcb-render.so.0.0.0", "type": "file" }, { - "bom-ref": "918652573b92bbf1", + "bom-ref": "f58032ff220d1e19", "name": "/usr/lib/x86_64-linux-gnu/libxcb-shape.so.0.0.0", "type": "file" }, { - "bom-ref": "0636e137d0536703", + "bom-ref": "0c1516e45def3ac3", "name": "/usr/lib/x86_64-linux-gnu/libxcb-shm.so.0.0.0", "type": "file" }, { - "bom-ref": "537b0c854b097da2", + "bom-ref": "b42d263fc6904de6", "name": "/usr/lib/x86_64-linux-gnu/libxcb-sync.so.1.0.0", "type": "file" }, { - "bom-ref": "1d7d77f4f2a1a020", + "bom-ref": "11046ecadbf8faa0", "name": "/usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0.0.0", "type": "file" }, { - "bom-ref": "a171ee57353fb965", + "bom-ref": "31c03ebc0a9a4e35", "name": "/usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0", "type": "file" }, { - "bom-ref": "466d01a841064d83", + "bom-ref": "bbcc2c04c86b3263", "name": "/usr/lib/x86_64-linux-gnu/libxkbcommon.so.0.0.0", "type": "file" }, { - "bom-ref": "8333db559d4c0202", + "bom-ref": "d873e5b5cf4268ae", "name": "/usr/lib/x86_64-linux-gnu/libxml2.so.2.9.14", "type": "file" }, { - "bom-ref": "51ec72c2d2ec11e1", + "bom-ref": "3cded9fecd838191", + "name": "/usr/lib/x86_64-linux-gnu/libxmlb.so.2.0.0", + "type": "file" + }, + { + "bom-ref": "5c2ed6b6304caf55", "name": "/usr/lib/x86_64-linux-gnu/libxshmfence.so.1.0.0", "type": "file" }, { - "bom-ref": "d922ba4ad26a449e", + "bom-ref": "95d69bf03cd7ce12", "name": "/usr/lib/x86_64-linux-gnu/libxvidcore.so.4.3", "type": "file" }, { - "bom-ref": "b811855890c93db0", + "bom-ref": "ed224d7159b5c292", "name": "/usr/lib/x86_64-linux-gnu/libxxhash.so.0.8.2", "type": "file" }, { - "bom-ref": "d30b9b09b4a49c67", + "bom-ref": "6a0ca837fa2aa5fa", + "name": "/usr/lib/x86_64-linux-gnu/libyaml-0.so.2.0.9", + "type": "file" + }, + { + "bom-ref": "7094b5118210b62f", "name": "/usr/lib/x86_64-linux-gnu/libz.a", "type": "file" }, { - "bom-ref": "d9afe7cb4d588341", + "bom-ref": "94c0384a7f670d3b", "name": "/usr/lib/x86_64-linux-gnu/libz.so.1.3", "type": "file" }, { - "bom-ref": "90099210dd7fd281", - "name": "/usr/lib/x86_64-linux-gnu/libze_intel_gpu.so.1.15.38308", + "bom-ref": "4b0b3e6a1318d682", + "name": "/usr/lib/x86_64-linux-gnu/libze_intel_gpu.so.1.15.39122", "type": "file" }, { - "bom-ref": "0d80ee984a77e3a3", - "name": "/usr/lib/x86_64-linux-gnu/libze_loader.so.1.28.2", + "bom-ref": "f53f803538fc3367", + "name": "/usr/lib/x86_64-linux-gnu/libze_loader.so.1.32.0", "type": "file" }, { - "bom-ref": "6c55151b51354a21", - "name": "/usr/lib/x86_64-linux-gnu/libze_tracing_layer.so.1.28.2", + "bom-ref": "6b458b2eb7c2fd4c", + "name": "/usr/lib/x86_64-linux-gnu/libze_tracing_layer.so.1.32.0", "type": "file" }, { - "bom-ref": "a7f4e209606934a5", - "name": "/usr/lib/x86_64-linux-gnu/libze_validation_layer.so.1.28.2", + "bom-ref": "0652bbefca7b95cb", + "name": "/usr/lib/x86_64-linux-gnu/libze_validation_layer.so.1.32.0", "type": "file" }, { - "bom-ref": "3b94d525d8cd1aa0", + "bom-ref": "c2c975b0cf2d3660", "name": "/usr/lib/x86_64-linux-gnu/libzimg.so.2.0.0", "type": "file" }, { - "bom-ref": "c53af6b44f9a1e12", + "bom-ref": "1d01b8eb6f5d1d2e", "name": "/usr/lib/x86_64-linux-gnu/libzix-0.so.0.4.2", "type": "file" }, { - "bom-ref": "0613f1725a0b1b53", + "bom-ref": "e1ab0d6ce53fd9e7", "name": "/usr/lib/x86_64-linux-gnu/libzmq.so.5.2.5", "type": "file" }, { - "bom-ref": "fae219a20399ddcb", + "bom-ref": "5e77f967b09c7745", "name": "/usr/lib/x86_64-linux-gnu/libzstd.so.1.5.5", "type": "file" }, { - "bom-ref": "850847bb5532a52b", + "bom-ref": "ff17faf7b6ba99af", "name": "/usr/lib/x86_64-linux-gnu/libzvbi-chains.so.0.0.0", "type": "file" }, { - "bom-ref": "f2033c14071677ac", + "bom-ref": "6ed52958c82687ec", "name": "/usr/lib/x86_64-linux-gnu/libzvbi.so.0.13.2", "type": "file" }, { - "bom-ref": "b64014b95f03f129", + "bom-ref": "4ea6a33a7bb77c29", "name": "/usr/lib/x86_64-linux-gnu/ossl-modules/legacy.so", "type": "file" }, { - "bom-ref": "fae0b2eb845a3e4c", + "bom-ref": "dd2c2821b74e9790", + "name": "/usr/lib/x86_64-linux-gnu/packagekit-backend/libpk_backend_apt.so", + "type": "file" + }, + { + "bom-ref": "41634def3c0c8fc5", + "name": "/usr/lib/x86_64-linux-gnu/packagekit-backend/libpk_backend_test_fail.so", + "type": "file" + }, + { + "bom-ref": "faf644a5ffe99998", + "name": "/usr/lib/x86_64-linux-gnu/packagekit-backend/libpk_backend_test_nop.so", + "type": "file" + }, + { + "bom-ref": "61b67d87dd561e58", + "name": "/usr/lib/x86_64-linux-gnu/packagekit-backend/libpk_backend_test_spawn.so", + "type": "file" + }, + { + "bom-ref": "4aeef08653fa4431", + "name": "/usr/lib/x86_64-linux-gnu/packagekit-backend/libpk_backend_test_succeed.so", + "type": "file" + }, + { + "bom-ref": "37cbbc2002d65942", + "name": "/usr/lib/x86_64-linux-gnu/packagekit-backend/libpk_backend_test_thread.so", + "type": "file" + }, + { + "bom-ref": "1846f457dc694df6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/AutoLoader.pm", "type": "file" }, { - "bom-ref": "131aebde98e64dfd", + "bom-ref": "056af0d711befb2b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Carp.pm", "type": "file" }, { - "bom-ref": "b4d602281b472d26", + "bom-ref": "5103393d583f3ef8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Carp/Heavy.pm", "type": "file" }, { - "bom-ref": "2c88fb7a7d575c4f", + "bom-ref": "db970ac54ce42435", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Config.pm", "type": "file" }, { - "bom-ref": "da04b016de5d5894", + "bom-ref": "d8b927ac34afa266", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Config_git.pl", "type": "file" }, { - "bom-ref": "6f25db19a38f28d6", + "bom-ref": "995b1ccd0ebb7c78", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Config_heavy.pl", "type": "file" }, { - "bom-ref": "dec46a1ac7a1200e", + "bom-ref": "721fea81c0f45e08", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Cwd.pm", "type": "file" }, { - "bom-ref": "780bebb4bd5a6157", + "bom-ref": "1ef58c9d51ddb8d1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/DynaLoader.pm", "type": "file" }, { - "bom-ref": "500f13320a1fbf35", + "bom-ref": "fd4f4c2675fb9d8b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Errno.pm", "type": "file" }, { - "bom-ref": "91504659adceece8", + "bom-ref": "7daf076cce8ca7ee", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Exporter.pm", "type": "file" }, { - "bom-ref": "7f3b67961a003809", + "bom-ref": "655b6aff38cd0943", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Exporter/Heavy.pm", "type": "file" }, { - "bom-ref": "2a5eb811c98199ee", + "bom-ref": "a91fb333cd8ca628", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Fcntl.pm", "type": "file" }, { - "bom-ref": "13e2ab957fd833b1", + "bom-ref": "1049ceeebe35c783", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Basename.pm", "type": "file" }, { - "bom-ref": "f22e767058473148", + "bom-ref": "9e442195cc3553d2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Glob.pm", "type": "file" }, { - "bom-ref": "f42373a481d77008", + "bom-ref": "bae84969bbde1b9a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Path.pm", "type": "file" }, { - "bom-ref": "89ab70550ea7868e", + "bom-ref": "47e2a3319ed8d078", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Spec.pm", "type": "file" }, { - "bom-ref": "117f4042dd338b5e", + "bom-ref": "1d503a94e76631e8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Spec/Unix.pm", "type": "file" }, { - "bom-ref": "52191a8da81e717a", + "bom-ref": "07c863288b23d818", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Temp.pm", "type": "file" }, { - "bom-ref": "a38e20181a33fe0f", + "bom-ref": "732f9430f5e515d1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/FileHandle.pm", "type": "file" }, { - "bom-ref": "37ca43d0fdfaca8e", + "bom-ref": "9d3a9c4efa799268", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Getopt/Long.pm", "type": "file" }, { - "bom-ref": "b9cfb239f0fac019", + "bom-ref": "352398a22d5ecb4f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Hash/Util.pm", "type": "file" }, { - "bom-ref": "23234540941d959b", + "bom-ref": "556dce472235492d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO.pm", "type": "file" }, { - "bom-ref": "7ecdac47fca030a5", + "bom-ref": "adb780cac5176877", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/File.pm", "type": "file" }, { - "bom-ref": "f31b00b5587745b4", + "bom-ref": "5bf9854de9967a06", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Handle.pm", "type": "file" }, { - "bom-ref": "25126c3058550788", + "bom-ref": "cc02a2b42fab65ea", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Pipe.pm", "type": "file" }, { - "bom-ref": "17c0536a8f729f54", + "bom-ref": "68de64c8da996c22", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Seekable.pm", "type": "file" }, { - "bom-ref": "afa15fc6ff59c47a", + "bom-ref": "2636b890aa7e6de8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Select.pm", "type": "file" }, { - "bom-ref": "fb8e2cb7f27ffeda", + "bom-ref": "2de010a19c85f330", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Socket.pm", "type": "file" }, { - "bom-ref": "4e4b0d4dcfa31149", + "bom-ref": "bc967255e892e59b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Socket/INET.pm", "type": "file" }, { - "bom-ref": "6f526d76a951378b", + "bom-ref": "8329528aa15c11dd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Socket/IP.pm", "type": "file" }, { - "bom-ref": "c4c6979075cedc80", + "bom-ref": "47f775b658fb1dba", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Socket/UNIX.pm", "type": "file" }, { - "bom-ref": "08d081950509dcb6", + "bom-ref": "3adcdd544f3d2974", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IPC/Open2.pm", "type": "file" }, { - "bom-ref": "8578660e4de4b876", + "bom-ref": "c64167a4314c642c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IPC/Open3.pm", "type": "file" }, { - "bom-ref": "fd9e4f76d930becf", + "bom-ref": "a31467e40d2204f9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/List/Util.pm", "type": "file" }, { - "bom-ref": "04bdc99108c188ce", + "bom-ref": "b6afc0ae1a14b6b0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/POSIX.pm", "type": "file" }, { - "bom-ref": "406a7cdfe93d1890", + "bom-ref": "612795a70145704e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Scalar/Util.pm", "type": "file" }, { - "bom-ref": "5d4d5f07b49341c3", + "bom-ref": "c853febd59a57ed5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/SelectSaver.pm", "type": "file" }, { - "bom-ref": "879f96952315f141", + "bom-ref": "b126027b4723dc87", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Socket.pm", "type": "file" }, { - "bom-ref": "41167aa56c60c1fe", + "bom-ref": "6e6762cd489fbe5c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Symbol.pm", "type": "file" }, { - "bom-ref": "b6c66ac859485fb6", + "bom-ref": "7d30acfe02e3a520", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Text/ParseWords.pm", "type": "file" }, { - "bom-ref": "2105f2b3aff80889", + "bom-ref": "8f625ca587b93283", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Text/Tabs.pm", "type": "file" }, { - "bom-ref": "40231e790ea5643a", + "bom-ref": "59d7aff7923d5fe4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Text/Wrap.pm", "type": "file" }, { - "bom-ref": "396bbe188158fe7b", + "bom-ref": "a399fd820a0b9d21", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Tie/Hash.pm", "type": "file" }, { - "bom-ref": "b84cd79d30018458", + "bom-ref": "b1c72c021531362e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/XSLoader.pm", "type": "file" }, { - "bom-ref": "82aeaee478dd7d0f", + "bom-ref": "121a64870b349945", "name": "/usr/lib/x86_64-linux-gnu/perl-base/attributes.pm", "type": "file" }, { - "bom-ref": "b137130afe1f0e78", + "bom-ref": "308155926939e602", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/Cwd/Cwd.so", "type": "file" }, { - "bom-ref": "aac2588713abc132", + "bom-ref": "e6bbf0db0ab5aa24", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/Fcntl/Fcntl.so", "type": "file" }, { - "bom-ref": "7b1e6dfc961bf1e0", + "bom-ref": "c03feedb3faed33a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/File/Glob/Glob.so", "type": "file" }, { - "bom-ref": "62ae58c0aa24939b", + "bom-ref": "34de9e2fbc6dde91", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/Hash/Util/Util.so", "type": "file" }, { - "bom-ref": "9f40a9e6d8f3afae", + "bom-ref": "462ea2c3be5da60c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/IO/IO.so", "type": "file" }, { - "bom-ref": "eec73e6c89f01f76", + "bom-ref": "4e7517a2d75a19a0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/List/Util/Util.so", "type": "file" }, { - "bom-ref": "aae2098651dba47e", + "bom-ref": "4b4a47478625135c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/POSIX/POSIX.so", "type": "file" }, { - "bom-ref": "ca6cd910c34ba3a9", + "bom-ref": "2442651ffc438137", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/Socket/Socket.so", "type": "file" }, { - "bom-ref": "a6c43ee3aea4f31b", + "bom-ref": "fd9e87c4fdb85781", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/attributes/attributes.so", "type": "file" }, { - "bom-ref": "fc922e8cf6fc4cbc", + "bom-ref": "67edc0d55ba14332", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/re/re.so", "type": "file" }, { - "bom-ref": "f7704c5d64cb163c", + "bom-ref": "1a24715a9a5f72f2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/base.pm", "type": "file" }, { - "bom-ref": "68fc4f194d5eca38", + "bom-ref": "843a0a401f560a06", "name": "/usr/lib/x86_64-linux-gnu/perl-base/builtin.pm", "type": "file" }, { - "bom-ref": "e8d94d96fb796084", + "bom-ref": "fbb5d108768cc08e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/bytes.pm", "type": "file" }, { - "bom-ref": "f1bff4db684b01f8", + "bom-ref": "ee5629cf1a546a56", "name": "/usr/lib/x86_64-linux-gnu/perl-base/bytes_heavy.pl", "type": "file" }, { - "bom-ref": "a86976c5311e26b2", + "bom-ref": "d2fdc28dd3e1778c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/constant.pm", "type": "file" }, { - "bom-ref": "603603ebc142b8e5", + "bom-ref": "01c539f3439850b7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/feature.pm", "type": "file" }, { - "bom-ref": "972d1d274a2d9c6b", + "bom-ref": "e54d060ef823c05d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/fields.pm", "type": "file" }, { - "bom-ref": "c6713346484d1bce", + "bom-ref": "3df102c418f58054", "name": "/usr/lib/x86_64-linux-gnu/perl-base/integer.pm", "type": "file" }, { - "bom-ref": "97db4d324966f183", + "bom-ref": "dc37f1cc3d893b51", "name": "/usr/lib/x86_64-linux-gnu/perl-base/lib.pm", "type": "file" }, { - "bom-ref": "7aa376bf6f9f435c", + "bom-ref": "454a487e64c4a526", "name": "/usr/lib/x86_64-linux-gnu/perl-base/locale.pm", "type": "file" }, { - "bom-ref": "9132248dc790c64e", + "bom-ref": "964eaa99dd3a8310", "name": "/usr/lib/x86_64-linux-gnu/perl-base/overload.pm", "type": "file" }, { - "bom-ref": "06cd4d9b1197acbf", + "bom-ref": "9c6c5bf329d3cd21", "name": "/usr/lib/x86_64-linux-gnu/perl-base/overloading.pm", "type": "file" }, { - "bom-ref": "a64b87df888bf8df", + "bom-ref": "97195a3422480e09", "name": "/usr/lib/x86_64-linux-gnu/perl-base/parent.pm", "type": "file" }, { - "bom-ref": "0ac32c57b636bf92", + "bom-ref": "b464813edabc4f38", "name": "/usr/lib/x86_64-linux-gnu/perl-base/re.pm", "type": "file" }, { - "bom-ref": "f13987fd2f8d03ef", + "bom-ref": "0cfdc68a979568d1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/strict.pm", "type": "file" }, { - "bom-ref": "ee27987c5c276648", + "bom-ref": "efe1763cc048b79e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Age.pl", "type": "file" }, { - "bom-ref": "57028cadab0fd7ef", + "bom-ref": "4107fa18daef0661", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Bc.pl", "type": "file" }, { - "bom-ref": "e515f589c77434e6", + "bom-ref": "610fcdf7610bb714", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Bmg.pl", "type": "file" }, { - "bom-ref": "ce261dcde88e914f", + "bom-ref": "7e414af271fdb01d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Bpb.pl", "type": "file" }, { - "bom-ref": "91217f4ada45a770", + "bom-ref": "e66a23c8e2737562", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Bpt.pl", "type": "file" }, { - "bom-ref": "d01fd46c94b98f83", + "bom-ref": "a189df23992b885d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Cf.pl", "type": "file" }, { - "bom-ref": "d3d90a1177cb9d55", + "bom-ref": "411602a1222df17f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Ea.pl", "type": "file" }, { - "bom-ref": "683d808ba7451975", + "bom-ref": "d31407230b37bf7f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/EqUIdeo.pl", "type": "file" }, { - "bom-ref": "c3279148f30a4fcf", + "bom-ref": "a2cadfcff13fcd99", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/GCB.pl", "type": "file" }, { - "bom-ref": "78d46a0a09d1545d", + "bom-ref": "af67351a7ede03bb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Gc.pl", "type": "file" }, { - "bom-ref": "030c85ff3ec8cb12", + "bom-ref": "3fbf8672f8b6ffe8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Hst.pl", "type": "file" }, { - "bom-ref": "c384a0f691e3f133", + "bom-ref": "edfb333e1864abb9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Identif2.pl", "type": "file" }, { - "bom-ref": "b952de14a0a96d95", + "bom-ref": "dd3a3648e854e09b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Identifi.pl", "type": "file" }, { - "bom-ref": "ac491a3a5857c302", + "bom-ref": "a9b0b345ae5fa2dc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/InPC.pl", "type": "file" }, { - "bom-ref": "c95639a1e84bf778", + "bom-ref": "a33cf1b196d02c8e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/InSC.pl", "type": "file" }, { - "bom-ref": "529a2288b02d00e2", + "bom-ref": "e306fab8378aae04", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Isc.pl", "type": "file" }, { - "bom-ref": "688c3121df37d75a", + "bom-ref": "9b21c78582261ea4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Jg.pl", "type": "file" }, { - "bom-ref": "65c5c0b8a682bda5", + "bom-ref": "424904a2b6734543", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Jt.pl", "type": "file" }, { - "bom-ref": "f9bc2b0903d460d2", + "bom-ref": "6c06420536c7d774", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Lb.pl", "type": "file" }, { - "bom-ref": "0ad66c9bb92ec1bc", + "bom-ref": "a65597fd5919bafa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Lc.pl", "type": "file" }, { - "bom-ref": "713cb5a42f39f567", + "bom-ref": "2e5958bbb3fd7699", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NFCQC.pl", "type": "file" }, { - "bom-ref": "a0d3d971a0b1c401", + "bom-ref": "c5a9d5ccb9cab87f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NFDQC.pl", "type": "file" }, { - "bom-ref": "8c86fe438644413a", + "bom-ref": "1780990d993b48a8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NFKCCF.pl", "type": "file" }, { - "bom-ref": "02829c49e1a78bc6", + "bom-ref": "f174572795475b6c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NFKCQC.pl", "type": "file" }, { - "bom-ref": "8004ffa68877b9d6", + "bom-ref": "f9c62bb99067bbf0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NFKDQC.pl", "type": "file" }, { - "bom-ref": "b0c490958bfb9d0d", + "bom-ref": "89aee975f029aaef", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Na1.pl", "type": "file" }, { - "bom-ref": "ef3e922febb53d0d", + "bom-ref": "3a6c7b80bb6b4deb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NameAlia.pl", "type": "file" }, { - "bom-ref": "edbc9d49da86e7aa", + "bom-ref": "8c7767cfc8316b0c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Nt.pl", "type": "file" }, { - "bom-ref": "ecba92435d6fb0bc", + "bom-ref": "19ca1407ab8952aa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Nv.pl", "type": "file" }, { - "bom-ref": "a8a95491fe5f388a", + "bom-ref": "f0acede5280fc0d0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/PerlDeci.pl", "type": "file" }, { - "bom-ref": "0f64eae5c9aea95a", + "bom-ref": "70117cf8ccd40384", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/SB.pl", "type": "file" }, { - "bom-ref": "9ba887fae8c876ab", + "bom-ref": "5e8849acb1ab0c01", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Sc.pl", "type": "file" }, { - "bom-ref": "94d2ce2c4635bccb", + "bom-ref": "3f6cfbf1d752d6bd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Scx.pl", "type": "file" }, { - "bom-ref": "e2cb354c3f88f983", + "bom-ref": "501fa479880bbbb5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Tc.pl", "type": "file" }, { - "bom-ref": "1a6faf15f1a7542f", + "bom-ref": "5c0909246915b85d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Uc.pl", "type": "file" }, { - "bom-ref": "77c2d557ce68524e", + "bom-ref": "f67e8b9e27928094", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Vo.pl", "type": "file" }, { - "bom-ref": "846a896465da80e7", + "bom-ref": "9148ce8ba00c158d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/WB.pl", "type": "file" }, { - "bom-ref": "aaa59a563f848fe4", + "bom-ref": "80c1c71069707146", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/_PerlLB.pl", "type": "file" }, { - "bom-ref": "b9e7986302b6a12d", + "bom-ref": "929d94cb6ddc44bb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/_PerlSCX.pl", "type": "file" }, { - "bom-ref": "3567c8196d526406", + "bom-ref": "5e9dbfdcb117a6b0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/NA.pl", "type": "file" }, { - "bom-ref": "9f4534aa5b60b1b9", + "bom-ref": "a216b8b17d9def03", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V100.pl", "type": "file" }, { - "bom-ref": "f231f3f8e72fdd59", + "bom-ref": "af0e644b3e8b5cb3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V11.pl", "type": "file" }, { - "bom-ref": "cea8eba2a9e59638", + "bom-ref": "9018fa1daf1f03f6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V110.pl", "type": "file" }, { - "bom-ref": "8a262763f9406ec8", + "bom-ref": "af3844380e34943e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V120.pl", "type": "file" }, { - "bom-ref": "1f0bc5c5396bd77f", + "bom-ref": "3e514f2e08929079", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V130.pl", "type": "file" }, { - "bom-ref": "a377b8172aeec61c", + "bom-ref": "6b492c1909fa1656", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V140.pl", "type": "file" }, { - "bom-ref": "657405722a4e99ba", + "bom-ref": "0539307256aa00e0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V150.pl", "type": "file" }, { - "bom-ref": "2babe8d62ee71626", + "bom-ref": "8b9e225d3c873760", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V20.pl", "type": "file" }, { - "bom-ref": "6e1c2077e35955e5", + "bom-ref": "49d8ec0d13c00e2f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V30.pl", "type": "file" }, { - "bom-ref": "eb2a9aab2e8a0831", + "bom-ref": "a77c4a40389bad27", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V31.pl", "type": "file" }, { - "bom-ref": "b8c2a7e315db39e4", + "bom-ref": "a3065f5fee68f00a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V32.pl", "type": "file" }, { - "bom-ref": "40ac4b6538da6a5b", + "bom-ref": "b2995b592e9dd44d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V40.pl", "type": "file" }, { - "bom-ref": "d800f9cab62d5b4f", + "bom-ref": "42582e40a596125d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V41.pl", "type": "file" }, { - "bom-ref": "bea6ce1ce722fd18", + "bom-ref": "dc89729ea17c2202", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V50.pl", "type": "file" }, { - "bom-ref": "345e7d2664fc5a59", + "bom-ref": "2fee0427b1b3bb97", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V51.pl", "type": "file" }, { - "bom-ref": "698021487449169d", + "bom-ref": "b63a01a523d47f57", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V52.pl", "type": "file" }, { - "bom-ref": "72a6ba31a610b0b1", + "bom-ref": "a68bb1f60446bd9b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V60.pl", "type": "file" }, { - "bom-ref": "ab12e96e18913604", + "bom-ref": "3658fdb92f4133c2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V61.pl", "type": "file" }, { - "bom-ref": "7589015d716b543b", + "bom-ref": "de362a619266f4e9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V70.pl", "type": "file" }, { - "bom-ref": "055e650e13a1c88e", + "bom-ref": "dbbf4f058ebf9944", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V80.pl", "type": "file" }, { - "bom-ref": "22f950723f4985b6", + "bom-ref": "fd95ce5bb0ca584c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V90.pl", "type": "file" }, { - "bom-ref": "1eb64678878030ed", + "bom-ref": "3bf472e5d869588f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Alpha/Y.pl", "type": "file" }, { - "bom-ref": "0d67ebce14a26119", + "bom-ref": "bd2befcbf8859053", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/AL.pl", "type": "file" }, { - "bom-ref": "88e2f7682d8dda6e", + "bom-ref": "6200c9b8f9fd5c40", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/AN.pl", "type": "file" }, { - "bom-ref": "43d025be0a76d2d6", + "bom-ref": "d70158a939241c20", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/B.pl", "type": "file" }, { - "bom-ref": "a4d82361f7ebec46", + "bom-ref": "918fce4d6b023318", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/BN.pl", "type": "file" }, { - "bom-ref": "655e0c02198f73a7", + "bom-ref": "5017afcd76b85a75", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/CS.pl", "type": "file" }, { - "bom-ref": "09ffd55c1ac5ec37", + "bom-ref": "0bfc017fa49c3451", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/EN.pl", "type": "file" }, { - "bom-ref": "3d0a3cae488be7ad", + "bom-ref": "34599c63321ae5ef", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/ES.pl", "type": "file" }, { - "bom-ref": "1697274bfb753476", + "bom-ref": "adb3c9afd8718b84", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/ET.pl", "type": "file" }, { - "bom-ref": "e5158bc4c3ec9e92", + "bom-ref": "b02136e8fa0515c0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/L.pl", "type": "file" }, { - "bom-ref": "a0d3a5b6da831a4c", + "bom-ref": "34e44c9e79b1db06", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/NSM.pl", "type": "file" }, { - "bom-ref": "edb61cf2dcb355c0", + "bom-ref": "03d704277604c156", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/ON.pl", "type": "file" }, { - "bom-ref": "8f2ed570ce477d8e", + "bom-ref": "0432df053d3fe84c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/R.pl", "type": "file" }, { - "bom-ref": "0b475b33ae56a613", + "bom-ref": "2d0e56905722d8c1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/WS.pl", "type": "file" }, { - "bom-ref": "4c5a0b52375f5823", + "bom-ref": "ee1fb94a439876d5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/BidiC/Y.pl", "type": "file" }, { - "bom-ref": "5d3af489979a5400", + "bom-ref": "497bfa9c20d63b32", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/BidiM/Y.pl", "type": "file" }, { - "bom-ref": "9a8d344183ca9120", + "bom-ref": "4d0139d0b64f74e6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Blk/NB.pl", "type": "file" }, { - "bom-ref": "e05be677755f8e83", + "bom-ref": "de247523761fd585", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bpt/C.pl", "type": "file" }, { - "bom-ref": "b9dabd32c4dc5e6a", + "bom-ref": "da899bb938de6750", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bpt/N.pl", "type": "file" }, { - "bom-ref": "edadec943119862f", + "bom-ref": "4d563229ee2b2bad", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bpt/O.pl", "type": "file" }, { - "bom-ref": "6511c7cdcdbc7769", + "bom-ref": "18c88106bed18917", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CE/Y.pl", "type": "file" }, { - "bom-ref": "737a67d373846d54", + "bom-ref": "f7358fe375bb6de2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CI/Y.pl", "type": "file" }, { - "bom-ref": "640d10a271a4c3e7", + "bom-ref": "86dd165f0cb96fbd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWCF/Y.pl", "type": "file" }, { - "bom-ref": "d30cf7d8579d5387", + "bom-ref": "c4408cd4f4836fad", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWCM/Y.pl", "type": "file" }, { - "bom-ref": "cc43c0ff9de54249", + "bom-ref": "87af2ee980acc287", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWKCF/Y.pl", "type": "file" }, { - "bom-ref": "df939d48358da49e", + "bom-ref": "28d33033b9f4ddb0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWL/Y.pl", "type": "file" }, { - "bom-ref": "e97ce37c11693ea9", + "bom-ref": "d321a8f02759dbf3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWT/Y.pl", "type": "file" }, { - "bom-ref": "2e3b3b38647f7c18", + "bom-ref": "f81d4365d275d4fe", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWU/Y.pl", "type": "file" }, { - "bom-ref": "a0b4efcc888cf665", + "bom-ref": "6eb92eff832bcac3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Cased/Y.pl", "type": "file" }, { - "bom-ref": "dc0ce944516c0cd1", + "bom-ref": "bec65d4c72841c3b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/A.pl", "type": "file" }, { - "bom-ref": "3daf6bfc1c4b59c3", + "bom-ref": "d9abd5f4c7ec2885", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/AL.pl", "type": "file" }, { - "bom-ref": "2a8a749ec569ca7e", + "bom-ref": "c022890493fc57d8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/AR.pl", "type": "file" }, { - "bom-ref": "da76a1df9ff6123c", + "bom-ref": "39f97a034b0f5652", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/ATAR.pl", "type": "file" }, { - "bom-ref": "cb659865c21fbb50", + "bom-ref": "f5273fd72fbe9c36", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/B.pl", "type": "file" }, { - "bom-ref": "e51bdcfe8f06e24a", + "bom-ref": "649b79e9f0566704", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/BR.pl", "type": "file" }, { - "bom-ref": "09c94e8b1e6ead9e", + "bom-ref": "0f434248726d8bac", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/DB.pl", "type": "file" }, { - "bom-ref": "874a0f13672dcc24", + "bom-ref": "b366dcb74619aa46", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/NK.pl", "type": "file" }, { - "bom-ref": "f9595cfb814e9dc9", + "bom-ref": "dbe9d40cfca007e7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/NR.pl", "type": "file" }, { - "bom-ref": "37f87457ba33bcd9", + "bom-ref": "12ff10d45f25d36f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/OV.pl", "type": "file" }, { - "bom-ref": "f24014542aa47920", + "bom-ref": "1267089c046d769e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/VR.pl", "type": "file" }, { - "bom-ref": "cc64f00074ccb62b", + "bom-ref": "6582d87472639771", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CompEx/Y.pl", "type": "file" }, { - "bom-ref": "6ae5c70811e0e1e9", + "bom-ref": "dcdd5e58cf8c289b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/DI/Y.pl", "type": "file" }, { - "bom-ref": "c16aab8d7293ca19", + "bom-ref": "58a70d5e68e309cb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dash/Y.pl", "type": "file" }, { - "bom-ref": "bb10c6287c04f7b6", + "bom-ref": "f05ae4539d3ec26c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dep/Y.pl", "type": "file" }, { - "bom-ref": "3db0feda10486f3a", + "bom-ref": "68d224a427f1fdc8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dia/Y.pl", "type": "file" }, { - "bom-ref": "4d5a5d6d952d8df1", + "bom-ref": "b56981f8a816f757", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Com.pl", "type": "file" }, { - "bom-ref": "64b7631b1ac95443", + "bom-ref": "aabbf90eb024363d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Enc.pl", "type": "file" }, { - "bom-ref": "56face8029e8a367", + "bom-ref": "277c683fb3165f95", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Fin.pl", "type": "file" }, { - "bom-ref": "6c95a971b6b461e4", + "bom-ref": "ba8f15679e2b74c2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Font.pl", "type": "file" }, { - "bom-ref": "9b5fe723009ed41c", + "bom-ref": "10b402c080e73eca", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Init.pl", "type": "file" }, { - "bom-ref": "fc459302c68c5549", + "bom-ref": "59e9a2881ef14927", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Iso.pl", "type": "file" }, { - "bom-ref": "e669fdc4c144041e", + "bom-ref": "4b33517471dc336c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Med.pl", "type": "file" }, { - "bom-ref": "77a34c8b927a9673", + "bom-ref": "c848151ba8096e1d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Nar.pl", "type": "file" }, { - "bom-ref": "1e85e39280a88340", + "bom-ref": "e1c27f7980273092", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Nb.pl", "type": "file" }, { - "bom-ref": "53548dc2cf1a677d", + "bom-ref": "ee7d85dcf1ca3ecf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/NonCanon.pl", "type": "file" }, { - "bom-ref": "1e5632f706cd5458", + "bom-ref": "a8c0196691dd466a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Sqr.pl", "type": "file" }, { - "bom-ref": "3fbb21400e065241", + "bom-ref": "936b88e6d2018b4b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Sub.pl", "type": "file" }, { - "bom-ref": "e529c7c3a2f8144f", + "bom-ref": "a09c27d640343bb1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Sup.pl", "type": "file" }, { - "bom-ref": "9d70e97ca7b7010b", + "bom-ref": "a60b92b50348c9b1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Vert.pl", "type": "file" }, { - "bom-ref": "1a85fac0adad171b", + "bom-ref": "a6bc4bc0b5ccbdb9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/EBase/Y.pl", "type": "file" }, { - "bom-ref": "0e84f1a4d46716c7", + "bom-ref": "71f1f4231b7603cd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/EComp/Y.pl", "type": "file" }, { - "bom-ref": "9f578b938934a06d", + "bom-ref": "91b861c9ad7468c3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/EPres/Y.pl", "type": "file" }, { - "bom-ref": "d7783ba34b1ccb25", + "bom-ref": "ce0791510a81f7c7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ea/A.pl", "type": "file" }, { - "bom-ref": "69b705f880c28047", + "bom-ref": "4c60a066cc8bdd99", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ea/H.pl", "type": "file" }, { - "bom-ref": "4f65b08c83c044a9", + "bom-ref": "71f3c26e2e5ed057", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ea/N.pl", "type": "file" }, { - "bom-ref": "247e425d2e708f26", + "bom-ref": "cd810f91b879c1a0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ea/Na.pl", "type": "file" }, { - "bom-ref": "05ab58c699d2bd72", + "bom-ref": "d48dada6503b6ce4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ea/W.pl", "type": "file" }, { - "bom-ref": "f92df226f746fae2", + "bom-ref": "65970a0145284624", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Emoji/Y.pl", "type": "file" }, { - "bom-ref": "2d6432eca537f916", + "bom-ref": "36c3c770a6a09c44", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ext/Y.pl", "type": "file" }, { - "bom-ref": "baf2e4fd552776b1", + "bom-ref": "6d23edca1aed5467", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/ExtPict/Y.pl", "type": "file" }, { - "bom-ref": "2d5db76829550c7a", + "bom-ref": "af663f23467b1514", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/CN.pl", "type": "file" }, { - "bom-ref": "e01fefa8b782aee9", + "bom-ref": "7b35599d6582cd17", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/EX.pl", "type": "file" }, { - "bom-ref": "b3912ae2b6a97beb", + "bom-ref": "4efaeb6ee9c3d215", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/LV.pl", "type": "file" }, { - "bom-ref": "79bfd689bd0f4306", + "bom-ref": "6109c982a106010c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/LVT.pl", "type": "file" }, { - "bom-ref": "b30412017b0b6187", + "bom-ref": "89fc55a633dacd51", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/PP.pl", "type": "file" }, { - "bom-ref": "aec0e48ee6e3aa47", + "bom-ref": "ebad8aa6be0dacdd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/SM.pl", "type": "file" }, { - "bom-ref": "7fe03194e8f518fa", + "bom-ref": "d6f238ba03510080", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/XX.pl", "type": "file" }, { - "bom-ref": "8280024d54c3ec56", + "bom-ref": "e018b0eb460f7aec", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/C.pl", "type": "file" }, { - "bom-ref": "184027ab1b3da588", + "bom-ref": "9e4a2f9d068d7942", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Cf.pl", "type": "file" }, { - "bom-ref": "fe18dfc6822ea8aa", + "bom-ref": "f7ba762e8908ebac", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Cn.pl", "type": "file" }, { - "bom-ref": "b46e74785e4d6dc7", + "bom-ref": "3c7749d2f3a85261", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/L.pl", "type": "file" }, { - "bom-ref": "5179a274df56630c", + "bom-ref": "816f62f80ab1ef2a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/LC.pl", "type": "file" }, { - "bom-ref": "6a07508f7cf07f8e", + "bom-ref": "f7ff0107d48f2f60", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Ll.pl", "type": "file" }, { - "bom-ref": "18f937c3465eea2f", + "bom-ref": "567e4dc5f0809c85", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Lm.pl", "type": "file" }, { - "bom-ref": "b2ad252d40b45fad", + "bom-ref": "2423ae02601442b3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Lo.pl", "type": "file" }, { - "bom-ref": "74228db304eedbd7", + "bom-ref": "79f45b7e44242c75", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Lu.pl", "type": "file" }, { - "bom-ref": "504b7256a4ce6dc8", + "bom-ref": "83db16593cdca482", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/M.pl", "type": "file" }, { - "bom-ref": "d88d27199b4c52ec", + "bom-ref": "2cd50c0ad8ca1016", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Mc.pl", "type": "file" }, { - "bom-ref": "71ca34b399a6931f", + "bom-ref": "dd1c3d32391c21c9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Me.pl", "type": "file" }, { - "bom-ref": "29156399c6cf6662", + "bom-ref": "7055d29ccc1669f8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Mn.pl", "type": "file" }, { - "bom-ref": "414d481f30ce7f4a", + "bom-ref": "3c20f994803ec714", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/N.pl", "type": "file" }, { - "bom-ref": "73990a37f95d64c6", + "bom-ref": "4174d7a446d95900", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Nd.pl", "type": "file" }, { - "bom-ref": "0d4ba54e95f5644d", + "bom-ref": "44e9cf196edd7dd7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Nl.pl", "type": "file" }, { - "bom-ref": "d9bb09c32e248e51", + "bom-ref": "d7c1f82605f41c53", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/No.pl", "type": "file" }, { - "bom-ref": "49dadb9c1d13a2c8", + "bom-ref": "97bf4d418066a236", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/P.pl", "type": "file" }, { - "bom-ref": "8ce795d87ab7f78d", + "bom-ref": "eadca3700a0a19ef", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Pc.pl", "type": "file" }, { - "bom-ref": "0feb3fd4d3695952", + "bom-ref": "5f89c9c1670d6214", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Pd.pl", "type": "file" }, { - "bom-ref": "9667752705a86ac8", + "bom-ref": "75f622f5cf032ca6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Pe.pl", "type": "file" }, { - "bom-ref": "17df05b701fbe5dc", + "bom-ref": "88ba90a09c8d08a6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Pf.pl", "type": "file" }, { - "bom-ref": "28cf785741e0c826", + "bom-ref": "24ef631077ef89ac", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Pi.pl", "type": "file" }, { - "bom-ref": "61b6d7b5f79e10c5", + "bom-ref": "b72937744d6b2ca7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Po.pl", "type": "file" }, { - "bom-ref": "68c6c725e47ffce2", + "bom-ref": "1cf370f472243cf0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Ps.pl", "type": "file" }, { - "bom-ref": "f608fb3acf3a61cb", + "bom-ref": "c77f516ba11d4dd9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/S.pl", "type": "file" }, { - "bom-ref": "9260d3b8eecff2c0", + "bom-ref": "fda51d882e2ee72e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Sc.pl", "type": "file" }, { - "bom-ref": "133d57c08a362bc4", + "bom-ref": "c1dd86b2f11d9efa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Sk.pl", "type": "file" }, { - "bom-ref": "b2b4f64c75838d42", + "bom-ref": "fb3eb3ccf69a0510", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Sm.pl", "type": "file" }, { - "bom-ref": "35c373cb6cba20ca", + "bom-ref": "6ec1da28051a1230", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/So.pl", "type": "file" }, { - "bom-ref": "7e48b445d3264aca", + "bom-ref": "6e0e1322d737696c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Z.pl", "type": "file" }, { - "bom-ref": "b248620408233879", + "bom-ref": "45cab91e6e17d1bf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Zs.pl", "type": "file" }, { - "bom-ref": "3a236103fc31e241", + "bom-ref": "ea8303d8ded79ad3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GrBase/Y.pl", "type": "file" }, { - "bom-ref": "ecdd6e38c3698057", + "bom-ref": "ffd8ae4e4a9d4231", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GrExt/Y.pl", "type": "file" }, { - "bom-ref": "d1966dbc1bbbb41f", + "bom-ref": "4d57db60d9fdf3dd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Hex/Y.pl", "type": "file" }, { - "bom-ref": "8d418ddbd76ae9b5", + "bom-ref": "2097bb4673f8866b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Hst/NA.pl", "type": "file" }, { - "bom-ref": "a0f8a2c1db7adda4", + "bom-ref": "d6589ccfb7cde47a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Hyphen/T.pl", "type": "file" }, { - "bom-ref": "ada9c3ebb58eb5dc", + "bom-ref": "4f023805d3427166", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IDC/Y.pl", "type": "file" }, { - "bom-ref": "6caa0353eb09fe66", + "bom-ref": "5d8662156e1177f4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IDS/Y.pl", "type": "file" }, { - "bom-ref": "9d3ec3259d50774a", + "bom-ref": "c52bb99ec1657dbc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdStatus/Allowed.pl", "type": "file" }, { - "bom-ref": "bcf2a12975f417b8", + "bom-ref": "f76df0aa2c1d6eee", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdStatus/Restrict.pl", "type": "file" }, { - "bom-ref": "31f400544c03efa3", + "bom-ref": "c5a1ff4cf7934f01", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/DefaultI.pl", "type": "file" }, { - "bom-ref": "07d1d7dccea18c01", + "bom-ref": "f6f86309cc830497", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Exclusio.pl", "type": "file" }, { - "bom-ref": "af7894fffca446ac", + "bom-ref": "65f03f286e0ffe32", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Inclusio.pl", "type": "file" }, { - "bom-ref": "2c195834370ae437", + "bom-ref": "05e77430179c3bad", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/LimitedU.pl", "type": "file" }, { - "bom-ref": "afa39c09ae8fecd8", + "bom-ref": "fb43fb3912f121f6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/NotChara.pl", "type": "file" }, { - "bom-ref": "059583824ea859f0", + "bom-ref": "df013310de9e282a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/NotNFKC.pl", "type": "file" }, { - "bom-ref": "c67a3037dd956fc3", + "bom-ref": "7a19de6163307205", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/NotXID.pl", "type": "file" }, { - "bom-ref": "7cacd702b16eb629", + "bom-ref": "751797dadd1bd033", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Obsolete.pl", "type": "file" }, { - "bom-ref": "a759f1f13dbc2021", + "bom-ref": "6bd84c4044b9af9f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Recommen.pl", "type": "file" }, { - "bom-ref": "8decbb5540cb037a", + "bom-ref": "4bb46fdcf79f5918", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Technica.pl", "type": "file" }, { - "bom-ref": "828b74d651761842", + "bom-ref": "308b5545e2092ff8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Uncommon.pl", "type": "file" }, { - "bom-ref": "28e71a87ce7a9332", + "bom-ref": "6e442d0eb4caba54", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ideo/Y.pl", "type": "file" }, { - "bom-ref": "2f1635ec78c72624", + "bom-ref": "8f5c32bf8ac0d976", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/10_0.pl", "type": "file" }, { - "bom-ref": "f7fa287d129ad1b4", + "bom-ref": "ab6b2766a17882e2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/11_0.pl", "type": "file" }, { - "bom-ref": "aa20cec8ea71a156", + "bom-ref": "44aac138afdcda50", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/12_0.pl", "type": "file" }, { - "bom-ref": "8e5fb05a7972cadc", + "bom-ref": "1e3b92427e7d571e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/12_1.pl", "type": "file" }, { - "bom-ref": "66de67057cfd0f4b", + "bom-ref": "50c313d835200a39", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/13_0.pl", "type": "file" }, { - "bom-ref": "5a1c2c6464ee9ea2", + "bom-ref": "4a50c82c53c962f8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/14_0.pl", "type": "file" }, { - "bom-ref": "38d06c354bd00e2c", + "bom-ref": "d11124936e66816e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/15_0.pl", "type": "file" }, { - "bom-ref": "02b68db765ae96cf", + "bom-ref": "7d43c0324765984d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/2_0.pl", "type": "file" }, { - "bom-ref": "a522f94bf1443914", + "bom-ref": "8a38880f611a5ed2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/2_1.pl", "type": "file" }, { - "bom-ref": "6b0a1aca7ac6be49", + "bom-ref": "e806d882b4fdd1df", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/3_0.pl", "type": "file" }, { - "bom-ref": "dcec773dcb97435c", + "bom-ref": "3e3a62523df60d5e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/3_1.pl", "type": "file" }, { - "bom-ref": "9589381c9a983aa8", + "bom-ref": "9869099f7f67fcea", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/3_2.pl", "type": "file" }, { - "bom-ref": "e60f7a1a1dac12bf", + "bom-ref": "b60dfa049d9b9d91", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/4_0.pl", "type": "file" }, { - "bom-ref": "864e1e12618dc045", + "bom-ref": "2c3a1211afe0f9af", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/4_1.pl", "type": "file" }, { - "bom-ref": "816a77fe1e89b00a", + "bom-ref": "a16ba64233db77ec", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/5_0.pl", "type": "file" }, { - "bom-ref": "933d9bfa3d2d6873", + "bom-ref": "1e43a9982c14ccf1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/5_1.pl", "type": "file" }, { - "bom-ref": "01f0608d305565d4", + "bom-ref": "ca1919859c162672", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/5_2.pl", "type": "file" }, { - "bom-ref": "0f35004b05a00445", + "bom-ref": "6b7c73455524a7a3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/6_0.pl", "type": "file" }, { - "bom-ref": "ff0f3d54692c8399", + "bom-ref": "cda6f750e255025b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/6_1.pl", "type": "file" }, { - "bom-ref": "f00d29ff8348d94e", + "bom-ref": "1c23aba2c1894050", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/6_2.pl", "type": "file" }, { - "bom-ref": "01254c2fd9a43b3f", + "bom-ref": "e82b32e2b41a5ff5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/6_3.pl", "type": "file" }, { - "bom-ref": "c46cac030c974065", + "bom-ref": "d3717360fdaf2a83", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/7_0.pl", "type": "file" }, { - "bom-ref": "b870aab3cb2b3d98", + "bom-ref": "845fbd50d72e2836", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/8_0.pl", "type": "file" }, { - "bom-ref": "9482acd49727a81f", + "bom-ref": "225a6ab427f3a309", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/9_0.pl", "type": "file" }, { - "bom-ref": "337b671571201fa3", + "bom-ref": "5eb73b931e682419", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/Bottom.pl", "type": "file" }, { - "bom-ref": "936d3ae1377bf9ff", + "bom-ref": "29305470f4b90d69", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/BottomAn.pl", "type": "file" }, { - "bom-ref": "991d3ec8a9b6f60b", + "bom-ref": "5807adac4878506d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/Left.pl", "type": "file" }, { - "bom-ref": "7dcf5708ebbe4614", + "bom-ref": "eb411ef8227b042e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/LeftAndR.pl", "type": "file" }, { - "bom-ref": "a9afd577af8df8da", + "bom-ref": "0d72c7373bc7e920", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/NA.pl", "type": "file" }, { - "bom-ref": "e03b24a95757c52d", + "bom-ref": "21007fda51653053", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/Overstru.pl", "type": "file" }, { - "bom-ref": "4cc42a9c7cd2983b", + "bom-ref": "6f660667c0ae80c5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/Right.pl", "type": "file" }, { - "bom-ref": "11583864390edf5f", + "bom-ref": "0a0be3ee5f161d15", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/Top.pl", "type": "file" }, { - "bom-ref": "0f2244c10138162a", + "bom-ref": "933e065709279e10", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/TopAndBo.pl", "type": "file" }, { - "bom-ref": "2300f9fc4eaa2344", + "bom-ref": "bd0ac76898230312", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/TopAndL2.pl", "type": "file" }, { - "bom-ref": "75709d2b76a36981", + "bom-ref": "228d612139de05d3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/TopAndLe.pl", "type": "file" }, { - "bom-ref": "ea46bd86cde61af3", + "bom-ref": "b940687f6a9e912d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/TopAndRi.pl", "type": "file" }, { - "bom-ref": "7508b0bf5b6eb46c", + "bom-ref": "786ec8c9fb7b4f7a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/VisualOr.pl", "type": "file" }, { - "bom-ref": "298cbe5db14bc669", + "bom-ref": "4bb90a956e575d5f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Avagraha.pl", "type": "file" }, { - "bom-ref": "6f1cbf7a4bc11b33", + "bom-ref": "854cc97f8ce06c19", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Bindu.pl", "type": "file" }, { - "bom-ref": "41d573ccf6d119d9", + "bom-ref": "86b0ac800f0eea53", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Cantilla.pl", "type": "file" }, { - "bom-ref": "d272424766f37233", + "bom-ref": "8da823833e7528e9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona2.pl", "type": "file" }, { - "bom-ref": "e56d03f820b2d14b", + "bom-ref": "dc1aa529031ab60d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona3.pl", "type": "file" }, { - "bom-ref": "0946bab7e3abfdfd", + "bom-ref": "e21444cc1269c2c3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona4.pl", "type": "file" }, { - "bom-ref": "474801e2e6ac158c", + "bom-ref": "f98ebece9ced3eca", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona5.pl", "type": "file" }, { - "bom-ref": "b95d0c47325d9d90", + "bom-ref": "4528e8d157c5df3e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona6.pl", "type": "file" }, { - "bom-ref": "f518e26d65179a3c", + "bom-ref": "b30a1acb892176a2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona7.pl", "type": "file" }, { - "bom-ref": "2bcd205c34ca7f17", + "bom-ref": "3e33560470d42879", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona8.pl", "type": "file" }, { - "bom-ref": "539d2443a5de354d", + "bom-ref": "88e48806a83ffebf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona9.pl", "type": "file" }, { - "bom-ref": "108e20719252083b", + "bom-ref": "4040224efc1adde5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consonan.pl", "type": "file" }, { - "bom-ref": "c05cc8b756920483", + "bom-ref": "f53d24625308c919", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Geminati.pl", "type": "file" }, { - "bom-ref": "4ecd3643dcee465b", + "bom-ref": "a64d9acda370d7fd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Invisibl.pl", "type": "file" }, { - "bom-ref": "eb7a884f3e9ae227", + "bom-ref": "16ad9f20a4b4cf59", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Nukta.pl", "type": "file" }, { - "bom-ref": "c3e233fc3f8e74c8", + "bom-ref": "c969e44c15d1241a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Number.pl", "type": "file" }, { - "bom-ref": "9e6393daeedef28e", + "bom-ref": "b0e055816535f990", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Other.pl", "type": "file" }, { - "bom-ref": "61a32716c10f762c", + "bom-ref": "9588e173c8289046", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/PureKill.pl", "type": "file" }, { - "bom-ref": "bc695921a7a82b7e", + "bom-ref": "10ca1b48226449d8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Syllable.pl", "type": "file" }, { - "bom-ref": "eac39f713b1e5fff", + "bom-ref": "1591fb1becd02c91", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/ToneMark.pl", "type": "file" }, { - "bom-ref": "33f34a38b48d5340", + "bom-ref": "4266fef3066411a2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Virama.pl", "type": "file" }, { - "bom-ref": "169296c05fc8b082", + "bom-ref": "4b90f16f2e777280", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Visarga.pl", "type": "file" }, { - "bom-ref": "81478a51ec0d3745", + "bom-ref": "c7a5113727121877", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Vowel.pl", "type": "file" }, { - "bom-ref": "e58dd937095f2a8e", + "bom-ref": "d26cacbc5686d48c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/VowelDep.pl", "type": "file" }, { - "bom-ref": "35264b7d6d406a75", + "bom-ref": "1c188da645399a1b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/VowelInd.pl", "type": "file" }, { - "bom-ref": "e5acebee3fb6be0c", + "bom-ref": "4e345bc1bde58fb6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Ain.pl", "type": "file" }, { - "bom-ref": "3b17b460cfcddb87", + "bom-ref": "d72abd4e9483fe61", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Alef.pl", "type": "file" }, { - "bom-ref": "984d0edc5578011f", + "bom-ref": "cd2e6ee6668ad5c1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Beh.pl", "type": "file" }, { - "bom-ref": "43c880f15a5618a8", + "bom-ref": "9307c1fb83062022", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Dal.pl", "type": "file" }, { - "bom-ref": "bbd21b1256819e7a", + "bom-ref": "92309cc39d51373c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/FarsiYeh.pl", "type": "file" }, { - "bom-ref": "800264c6d82bdd53", + "bom-ref": "fe83c7afcd448ab9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Feh.pl", "type": "file" }, { - "bom-ref": "d5bb1855bc22237f", + "bom-ref": "11ca3fdb1610aab5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Gaf.pl", "type": "file" }, { - "bom-ref": "b6734a8bbbfb37d5", + "bom-ref": "7820ccbb26b81d2b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Hah.pl", "type": "file" }, { - "bom-ref": "d63f3ceba0c5d55c", + "bom-ref": "8013194843ce4a4e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/HanifiRo.pl", "type": "file" }, { - "bom-ref": "a67cb23f6d76ab45", + "bom-ref": "fe3f75c746327f73", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Kaf.pl", "type": "file" }, { - "bom-ref": "b08eeebf46bd0df9", + "bom-ref": "8d3b11932bf01a93", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Lam.pl", "type": "file" }, { - "bom-ref": "4cdc39efe4805e6c", + "bom-ref": "e442526249a994e6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/NoJoinin.pl", "type": "file" }, { - "bom-ref": "493c50773032d657", + "bom-ref": "ee8b6dc46900d6e5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Noon.pl", "type": "file" }, { - "bom-ref": "97b61f85af366354", + "bom-ref": "970a7bd400fcbd6e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Qaf.pl", "type": "file" }, { - "bom-ref": "645a1f46f8ce39b4", + "bom-ref": "48081d9b350252aa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Reh.pl", "type": "file" }, { - "bom-ref": "ce94336716118c42", + "bom-ref": "14a2fd523b13f484", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Sad.pl", "type": "file" }, { - "bom-ref": "768f9584677c96cd", + "bom-ref": "88be03c157b4b7b7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Seen.pl", "type": "file" }, { - "bom-ref": "53626a5ea65cbbe0", + "bom-ref": "afc4ec7bd5b68c2a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Tah.pl", "type": "file" }, { - "bom-ref": "d3ef369c16b4a87b", + "bom-ref": "2c14a0f7a5426295", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Waw.pl", "type": "file" }, { - "bom-ref": "f0c2e19faf939baf", + "bom-ref": "1bcc8c381924ae1d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Yeh.pl", "type": "file" }, { - "bom-ref": "9003ec8ba38b3e9f", + "bom-ref": "53325f0131ed9bfd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/C.pl", "type": "file" }, { - "bom-ref": "2ac9c1916de0cbd5", + "bom-ref": "9017de7379f67d3b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/D.pl", "type": "file" }, { - "bom-ref": "f2f2dadd2530cf97", + "bom-ref": "30fa4fd43e7a4435", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/L.pl", "type": "file" }, { - "bom-ref": "a21edd21a453c886", + "bom-ref": "d653818c5e8801a8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/R.pl", "type": "file" }, { - "bom-ref": "cb5de92768ce17cc", + "bom-ref": "fd282bf8f899fd36", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/T.pl", "type": "file" }, { - "bom-ref": "86db47b96e112f55", + "bom-ref": "20964d39c2845aab", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/U.pl", "type": "file" }, { - "bom-ref": "49fd35ee3f850cbb", + "bom-ref": "729dbdff762d4df5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/AI.pl", "type": "file" }, { - "bom-ref": "0d62f2d4cdce87f5", + "bom-ref": "c136c460439b6dc3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/AL.pl", "type": "file" }, { - "bom-ref": "b3d4247efbf75de5", + "bom-ref": "97dd447e6b26dfef", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/BA.pl", "type": "file" }, { - "bom-ref": "7582bb350ba462f2", + "bom-ref": "e68fe8746e07accc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/BB.pl", "type": "file" }, { - "bom-ref": "42da66b82f75d35d", + "bom-ref": "e803eb9f62ad8227", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/CJ.pl", "type": "file" }, { - "bom-ref": "57bc160cb1138e45", + "bom-ref": "f74d0c50ee1b2047", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/CL.pl", "type": "file" }, { - "bom-ref": "925ec7209c5fc7f7", + "bom-ref": "c9d392077e807d15", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/CM.pl", "type": "file" }, { - "bom-ref": "2fea84e24b549e83", + "bom-ref": "7a9570efe0b16b91", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/EX.pl", "type": "file" }, { - "bom-ref": "676f3c6a148dd55b", + "bom-ref": "d5760d21730ec13d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/GL.pl", "type": "file" }, { - "bom-ref": "ce5467d330a8926a", + "bom-ref": "c6662c634f5ee378", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/ID.pl", "type": "file" }, { - "bom-ref": "c90c39f20542797c", + "bom-ref": "594ba2df55f5da0a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/IN.pl", "type": "file" }, { - "bom-ref": "6242e36660cad61d", + "bom-ref": "3eaf832c05fc2987", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/IS.pl", "type": "file" }, { - "bom-ref": "bd0fff761bce9bc4", + "bom-ref": "6b819a634d17b6be", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/NS.pl", "type": "file" }, { - "bom-ref": "e5cc0b509fa4800a", + "bom-ref": "2de049ab2c95f98c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/NU.pl", "type": "file" }, { - "bom-ref": "368f648904cb516d", + "bom-ref": "a85f62f16761100f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/OP.pl", "type": "file" }, { - "bom-ref": "82300718bc5c0880", + "bom-ref": "69bfe641329fad46", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/PO.pl", "type": "file" }, { - "bom-ref": "200dd3b13fe72481", + "bom-ref": "c7a34fb885b2fdbf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/PR.pl", "type": "file" }, { - "bom-ref": "bb8b0b244fad0726", + "bom-ref": "65d5509aea75494c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/QU.pl", "type": "file" }, { - "bom-ref": "369a814fc78db7a2", + "bom-ref": "892671bbb56bff6c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/SA.pl", "type": "file" }, { - "bom-ref": "a658f8fb0d20326c", + "bom-ref": "3e1c686a648746ca", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/XX.pl", "type": "file" }, { - "bom-ref": "8613628ee389a041", + "bom-ref": "bb29fb371510eefb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lower/Y.pl", "type": "file" }, { - "bom-ref": "2f5628d2223b5dd3", + "bom-ref": "6fc794c088fae60d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Math/Y.pl", "type": "file" }, { - "bom-ref": "84a56d0db4a5c987", + "bom-ref": "542c6887750cf945", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFCQC/M.pl", "type": "file" }, { - "bom-ref": "ff6a2cfbbb48f4df", + "bom-ref": "bdd40a492e6d64ad", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFCQC/Y.pl", "type": "file" }, { - "bom-ref": "88e5ef5431980943", + "bom-ref": "9bf03bdf87078f19", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFDQC/N.pl", "type": "file" }, { - "bom-ref": "15f1f03c560ac34d", + "bom-ref": "bd7842ca8f33f687", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFDQC/Y.pl", "type": "file" }, { - "bom-ref": "026b4bb205f0e1ad", + "bom-ref": "b54b551f8701d67b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFKCQC/N.pl", "type": "file" }, { - "bom-ref": "abd3b942b347a1d2", + "bom-ref": "1f5cac4d4757fde8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFKCQC/Y.pl", "type": "file" }, { - "bom-ref": "9d748be63d19f80c", + "bom-ref": "c76e6f6c16aa5ece", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFKDQC/N.pl", "type": "file" }, { - "bom-ref": "430c943e555ff79f", + "bom-ref": "f83fc05116186f75", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFKDQC/Y.pl", "type": "file" }, { - "bom-ref": "42ba702ce79cffe4", + "bom-ref": "28fe63bc5f368666", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nt/Di.pl", "type": "file" }, { - "bom-ref": "a2d442e19223cb3c", + "bom-ref": "704859679ecc7eb2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nt/None.pl", "type": "file" }, { - "bom-ref": "ed233775285b6712", + "bom-ref": "f89c4571cc0237ec", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nt/Nu.pl", "type": "file" }, { - "bom-ref": "5f246107d0217144", + "bom-ref": "05fa164f23473ed6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/0.pl", "type": "file" }, { - "bom-ref": "7a9bfd9b72334e86", + "bom-ref": "8598c72ca8d4527c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1.pl", "type": "file" }, { - "bom-ref": "25464ff84e373868", + "bom-ref": "c579f7fc982e7d0e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/10.pl", "type": "file" }, { - "bom-ref": "6b2a8d88a3b03e1f", + "bom-ref": "39f787716e100325", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/100.pl", "type": "file" }, { - "bom-ref": "8d59fcd4fd162945", + "bom-ref": "75e2537b155432f3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1000.pl", "type": "file" }, { - "bom-ref": "7d3a507daa9afe37", + "bom-ref": "a6f13f03cc688e21", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/10000.pl", "type": "file" }, { - "bom-ref": "f9d68cab2daca562", + "bom-ref": "bacc99b46a4455f0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/100000.pl", "type": "file" }, { - "bom-ref": "69c4f7ea9259ac2f", + "bom-ref": "97c636e03497a9ed", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/11.pl", "type": "file" }, { - "bom-ref": "8601db7dc6c1e585", + "bom-ref": "493c1c3b68a41257", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/12.pl", "type": "file" }, { - "bom-ref": "8cfb951e5cd75ed6", + "bom-ref": "53c34914608213f0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/13.pl", "type": "file" }, { - "bom-ref": "55ec89468f3ef5db", + "bom-ref": "f906e270dd7482e9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/14.pl", "type": "file" }, { - "bom-ref": "81b37a8f8a674038", + "bom-ref": "f1856ee3c4fbe0a2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/15.pl", "type": "file" }, { - "bom-ref": "bda6af72c3386d1f", + "bom-ref": "61f1924322112c0d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/16.pl", "type": "file" }, { - "bom-ref": "4659a92c852b1949", + "bom-ref": "7668699a274a2493", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/17.pl", "type": "file" }, { - "bom-ref": "401d35ec01c6fd57", + "bom-ref": "8742df35b3be2079", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/18.pl", "type": "file" }, { - "bom-ref": "39c9f9ae23a89210", + "bom-ref": "e9821c0af4ddcb46", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/19.pl", "type": "file" }, { - "bom-ref": "62034743eda9f765", + "bom-ref": "3a2c491eeb57c347", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_16.pl", "type": "file" }, { - "bom-ref": "f9afcd074f3aab9a", + "bom-ref": "e43e18f039c71f84", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_2.pl", "type": "file" }, { - "bom-ref": "f1eba06a68b8a24b", + "bom-ref": "ad8dd2b5f5f27829", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_3.pl", "type": "file" }, { - "bom-ref": "0f0469a6f871ee8a", + "bom-ref": "ae066c3905739d9c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_4.pl", "type": "file" }, { - "bom-ref": "2a6d6771eed6e6eb", + "bom-ref": "61b7dbbaec18a415", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_6.pl", "type": "file" }, { - "bom-ref": "c22c8262645d0ef0", + "bom-ref": "5fc3f40cc7572a72", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_8.pl", "type": "file" }, { - "bom-ref": "ac9f6990cecbb559", + "bom-ref": "8bda15ca5379c4d7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/2.pl", "type": "file" }, { - "bom-ref": "da1885e0067ad8f6", + "bom-ref": "5129cb6089909ef0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/20.pl", "type": "file" }, { - "bom-ref": "2c140d8851691e62", + "bom-ref": "20f708e917c2b89c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/200.pl", "type": "file" }, { - "bom-ref": "4be3d271e947619d", + "bom-ref": "60de1fbb6358f7c7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/2000.pl", "type": "file" }, { - "bom-ref": "1bffac2ed442d679", + "bom-ref": "04b18b8a5cc6542b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/20000.pl", "type": "file" }, { - "bom-ref": "e4950d9059c70130", + "bom-ref": "1de3c29ff6797fea", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/2_3.pl", "type": "file" }, { - "bom-ref": "45dc6d5b69ee8dc0", + "bom-ref": "f29216553d1a75c2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/3.pl", "type": "file" }, { - "bom-ref": "94db13708600293a", + "bom-ref": "b1f7b3e268e8c7cc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/30.pl", "type": "file" }, { - "bom-ref": "4e2ca4e73002456e", + "bom-ref": "1dd38a3c0566773c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/300.pl", "type": "file" }, { - "bom-ref": "2bc4006f9f746e18", + "bom-ref": "5e70e38944a94cf6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/3000.pl", "type": "file" }, { - "bom-ref": "45b897f6381fd03b", + "bom-ref": "eaaf1f0f8f9a43e9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/30000.pl", "type": "file" }, { - "bom-ref": "31b4052ba493235b", + "bom-ref": "ace342a35f005dbd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/3_16.pl", "type": "file" }, { - "bom-ref": "8300c93d2a3b90d8", + "bom-ref": "afe1a62706bb61ba", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/3_4.pl", "type": "file" }, { - "bom-ref": "4d6c54670c4110af", + "bom-ref": "994e8f37fcdefb9d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/4.pl", "type": "file" }, { - "bom-ref": "51010b83250e4c9d", + "bom-ref": "4dafda2c9df3ace3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/40.pl", "type": "file" }, { - "bom-ref": "20b864400f55903b", + "bom-ref": "8bca04f1b2954c2d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/400.pl", "type": "file" }, { - "bom-ref": "4db47dbda7ac524b", + "bom-ref": "c751ed3ccd87299d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/4000.pl", "type": "file" }, { - "bom-ref": "1355850c30d4e69a", + "bom-ref": "07a56d3d6ace6778", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/40000.pl", "type": "file" }, { - "bom-ref": "23d94f1ce422ae0d", + "bom-ref": "fe18183b405ffce7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/5.pl", "type": "file" }, { - "bom-ref": "54a6ac168eac55e6", + "bom-ref": "0610a3dc9d543b84", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/50.pl", "type": "file" }, { - "bom-ref": "11e4a1813c4a5b37", + "bom-ref": "611c4953146926bd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/500.pl", "type": "file" }, { - "bom-ref": "5be79769b94fe650", + "bom-ref": "acc786cb0f645b4a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/5000.pl", "type": "file" }, { - "bom-ref": "e0303c56998dfc0b", + "bom-ref": "cc770612bbf90fb1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/50000.pl", "type": "file" }, { - "bom-ref": "125181db9a3a9182", + "bom-ref": "bb2ab4e936fae95c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/6.pl", "type": "file" }, { - "bom-ref": "6e5cee11b92b4ec1", + "bom-ref": "4b6427231646c417", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/60.pl", "type": "file" }, { - "bom-ref": "23842a42f1d48196", + "bom-ref": "2b24f760a8f5d104", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/600.pl", "type": "file" }, { - "bom-ref": "c386c8c0ac74ab8e", + "bom-ref": "faf40d10833d39bc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/6000.pl", "type": "file" }, { - "bom-ref": "b39f5be0f702468c", + "bom-ref": "5c7a6402ab7646b2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/60000.pl", "type": "file" }, { - "bom-ref": "bdc72cd56dbf0a63", + "bom-ref": "e8d045984333ed39", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/7.pl", "type": "file" }, { - "bom-ref": "147a19995e2bac34", + "bom-ref": "1945fdc257de755a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/70.pl", "type": "file" }, { - "bom-ref": "81ba54ecb00ec07a", + "bom-ref": "f211b86374410fc8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/700.pl", "type": "file" }, { - "bom-ref": "c4658970a562d105", + "bom-ref": "02132123e64a1b53", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/7000.pl", "type": "file" }, { - "bom-ref": "117423afb030888b", + "bom-ref": "73d2815151cd7e5d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/70000.pl", "type": "file" }, { - "bom-ref": "c63252699850ef93", + "bom-ref": "ae006e07d07d19c1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/8.pl", "type": "file" }, { - "bom-ref": "d77c9f463770380d", + "bom-ref": "045b9f52d93a0a83", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/80.pl", "type": "file" }, { - "bom-ref": "aa0732703adc13e8", + "bom-ref": "93d4da6997e303b2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/800.pl", "type": "file" }, { - "bom-ref": "72263445caee3688", + "bom-ref": "c0a88bb508a702d2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/8000.pl", "type": "file" }, { - "bom-ref": "fad98eba8acb8bca", + "bom-ref": "413ab1c5f1653fe0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/80000.pl", "type": "file" }, { - "bom-ref": "cbc1c5fba646863e", + "bom-ref": "28ef99bd11303a70", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/9.pl", "type": "file" }, { - "bom-ref": "bb56f2479cf97566", + "bom-ref": "6693249751543394", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/90.pl", "type": "file" }, { - "bom-ref": "60a6ff9c8dda7a36", + "bom-ref": "1798e6d739d6f940", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/900.pl", "type": "file" }, { - "bom-ref": "dfaab0a7bdba3982", + "bom-ref": "7588026a38969bb0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/9000.pl", "type": "file" }, { - "bom-ref": "4f95c7c62605a483", + "bom-ref": "57de6a6db8efb46d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/90000.pl", "type": "file" }, { - "bom-ref": "d873884c8e709d43", + "bom-ref": "2bad535f292ddd59", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/PCM/Y.pl", "type": "file" }, { - "bom-ref": "9df3ebf1aa9fc004", + "bom-ref": "5b65126e6b4999be", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/PatSyn/Y.pl", "type": "file" }, { - "bom-ref": "abdefd42a60158bf", + "bom-ref": "c611bdbe6645118d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Alnum.pl", "type": "file" }, { - "bom-ref": "7a831d75e8c590df", + "bom-ref": "c91c9ff6cdd4d2d9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Assigned.pl", "type": "file" }, { - "bom-ref": "481252c7a3636b02", + "bom-ref": "bed9da46e9eea458", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Blank.pl", "type": "file" }, { - "bom-ref": "73fa98e68bfd5ce3", + "bom-ref": "563a769302e184c1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Graph.pl", "type": "file" }, { - "bom-ref": "fe6fffc7ff475316", + "bom-ref": "d613cac1489e2dbc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/PerlWord.pl", "type": "file" }, { - "bom-ref": "1bb4f418a7e4e997", + "bom-ref": "4b14a316a1757ae5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/PosixPun.pl", "type": "file" }, { - "bom-ref": "0c3320c386620b7a", + "bom-ref": "c01afd31b4ce26bc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Print.pl", "type": "file" }, { - "bom-ref": "dc7ea8325841ca2c", + "bom-ref": "574cd57434a3ff9e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/SpacePer.pl", "type": "file" }, { - "bom-ref": "bcd78aefee4e0010", + "bom-ref": "800fbc8417f75e6e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Title.pl", "type": "file" }, { - "bom-ref": "f2e389dfe246a134", + "bom-ref": "ca4745f65dfbe566", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Word.pl", "type": "file" }, { - "bom-ref": "6db77a603ccaeea0", + "bom-ref": "1e22053d64eef0c2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/XPosixPu.pl", "type": "file" }, { - "bom-ref": "29d1627e05a70b58", + "bom-ref": "a71c86ccb0038cea", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlAny.pl", "type": "file" }, { - "bom-ref": "567a985d6b893f96", + "bom-ref": "5f645e0b1b041c18", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlCh2.pl", "type": "file" }, { - "bom-ref": "a1556a80c7ad9ef7", + "bom-ref": "241f469cee0e207d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlCha.pl", "type": "file" }, { - "bom-ref": "43790cff7868a5de", + "bom-ref": "da50e3281138ccbc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlFol.pl", "type": "file" }, { - "bom-ref": "095bf8ed334f6a3b", + "bom-ref": "2c4fb03d52b48825", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlIDC.pl", "type": "file" }, { - "bom-ref": "a83da8816641557f", + "bom-ref": "e9bfdd1ee1f5de25", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlIDS.pl", "type": "file" }, { - "bom-ref": "799c3aa684eef4ee", + "bom-ref": "2e907980f20dc528", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlIsI.pl", "type": "file" }, { - "bom-ref": "865f266d16ec58ae", + "bom-ref": "67c0a879fa8e9fec", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlNch.pl", "type": "file" }, { - "bom-ref": "e822c650ee451213", + "bom-ref": "c396570b0a670f91", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlPat.pl", "type": "file" }, { - "bom-ref": "fdb36ec116e7e684", + "bom-ref": "0ecfc56b8c3a1c1a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlPr2.pl", "type": "file" }, { - "bom-ref": "737e230788ba7490", + "bom-ref": "595409155c33f4ce", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlPro.pl", "type": "file" }, { - "bom-ref": "d27572c1c30f6335", + "bom-ref": "3e466f629f0af157", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlQuo.pl", "type": "file" }, { - "bom-ref": "1d101451718b20aa", + "bom-ref": "14525f4c626978b0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/QMark/Y.pl", "type": "file" }, { - "bom-ref": "f8e6ce610f71bc58", + "bom-ref": "50b53e4faf873c82", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/AT.pl", "type": "file" }, { - "bom-ref": "c0071b084ebf3786", + "bom-ref": "87b6b4cfb65b6200", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/CL.pl", "type": "file" }, { - "bom-ref": "28268deff68d4a57", + "bom-ref": "279212cdc5696859", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/EX.pl", "type": "file" }, { - "bom-ref": "e26cd69c8a741f96", + "bom-ref": "d3d014318a0ac69c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/FO.pl", "type": "file" }, { - "bom-ref": "90ed80b15d262a9a", + "bom-ref": "205f0ed29fd7f248", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/LE.pl", "type": "file" }, { - "bom-ref": "8363e44ee5a2d6ae", + "bom-ref": "f488feb6ab3696f0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/LO.pl", "type": "file" }, { - "bom-ref": "74510274ce51d742", + "bom-ref": "2315f72c250aaf90", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/NU.pl", "type": "file" }, { - "bom-ref": "bc9f5eb00cd04214", + "bom-ref": "be7f0a83f4134b36", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/SC.pl", "type": "file" }, { - "bom-ref": "1940c6e2249b9ad4", + "bom-ref": "5c96156a0c8f6132", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/ST.pl", "type": "file" }, { - "bom-ref": "b6bfa6b230242d6c", + "bom-ref": "fb7f4929a569fb22", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/Sp.pl", "type": "file" }, { - "bom-ref": "e79f72ff619384a4", + "bom-ref": "2690e9391127c886", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/UP.pl", "type": "file" }, { - "bom-ref": "5052510f971d57ec", + "bom-ref": "579b950ec79f1a26", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/XX.pl", "type": "file" }, { - "bom-ref": "a25960ef3e1c7769", + "bom-ref": "e92f7f27efc3cf87", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SD/Y.pl", "type": "file" }, { - "bom-ref": "865c9138cfdccc30", + "bom-ref": "a9b49f6a07175532", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/STerm/Y.pl", "type": "file" }, { - "bom-ref": "55f185e38ce53a67", + "bom-ref": "2acdeb6bdd03ff19", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Arab.pl", "type": "file" }, { - "bom-ref": "254e8d09f67eeacb", + "bom-ref": "a68814662c62c501", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Beng.pl", "type": "file" }, { - "bom-ref": "090dfb1ed0598b76", + "bom-ref": "d079044ac5e58798", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Cprt.pl", "type": "file" }, { - "bom-ref": "69563bde7471f358", + "bom-ref": "68aa890462a3032e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Cyrl.pl", "type": "file" }, { - "bom-ref": "647e57bdb23b1520", + "bom-ref": "78e900330ba530e2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Deva.pl", "type": "file" }, { - "bom-ref": "5c483eada2e74c6e", + "bom-ref": "2b7c1b8f8499b378", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Dupl.pl", "type": "file" }, { - "bom-ref": "26dfe0ec58429184", + "bom-ref": "d5dc17b0d0264766", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Geor.pl", "type": "file" }, { - "bom-ref": "1c9a0bb95d0939cf", + "bom-ref": "3f74f952d02f8c09", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Glag.pl", "type": "file" }, { - "bom-ref": "af522fc313e51a6c", + "bom-ref": "7245a227da38151a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Gong.pl", "type": "file" }, { - "bom-ref": "6c222f354c66124c", + "bom-ref": "662f76422661047e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Gonm.pl", "type": "file" }, { - "bom-ref": "104820a2ecaced9f", + "bom-ref": "7aadd2b4ea74e35d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Gran.pl", "type": "file" }, { - "bom-ref": "55d0174c52ee40b4", + "bom-ref": "6bca96cd8a63384e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Grek.pl", "type": "file" }, { - "bom-ref": "f67d72945d87c60e", + "bom-ref": "f7d10b8a763154c4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Gujr.pl", "type": "file" }, { - "bom-ref": "1dd8a05e440f475e", + "bom-ref": "9be115c6b17dc0d4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Guru.pl", "type": "file" }, { - "bom-ref": "b00113360811ead2", + "bom-ref": "d785d7df3063b9e0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Han.pl", "type": "file" }, { - "bom-ref": "828bd42de3bbdcff", + "bom-ref": "5d2ae55338a0471d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Hang.pl", "type": "file" }, { - "bom-ref": "acd127aa4f28a8a9", + "bom-ref": "85ddb1b7576dae33", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Hira.pl", "type": "file" }, { - "bom-ref": "47cd466d72776d65", + "bom-ref": "b4d378e8501d38c3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Kana.pl", "type": "file" }, { - "bom-ref": "14e2056972cc2940", + "bom-ref": "bbedd1dda55b1cf6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Knda.pl", "type": "file" }, { - "bom-ref": "d5749ed4e0e365db", + "bom-ref": "ae6afdaf3c598dcd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Latn.pl", "type": "file" }, { - "bom-ref": "7680126a7e09856a", + "bom-ref": "c6dfd35290450850", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Limb.pl", "type": "file" }, { - "bom-ref": "b335e661bfa5ec1e", + "bom-ref": "e0723999602514f0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Linb.pl", "type": "file" }, { - "bom-ref": "6719cd231a72a5e6", + "bom-ref": "422fa6abc03a5bbc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Mlym.pl", "type": "file" }, { - "bom-ref": "0ab95e1161df1021", + "bom-ref": "2cbb490bc39e3ea7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Mong.pl", "type": "file" }, { - "bom-ref": "45a4f650c2fd08c5", + "bom-ref": "47a5c6686c034497", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Mult.pl", "type": "file" }, { - "bom-ref": "07685151214a95ef", + "bom-ref": "698412b3b522a5f1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Orya.pl", "type": "file" }, { - "bom-ref": "6624a28d0f9307a1", + "bom-ref": "a09f205df3329c5b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Sinh.pl", "type": "file" }, { - "bom-ref": "5aa9e4bac153b487", + "bom-ref": "989f49bb232cc771", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Syrc.pl", "type": "file" }, { - "bom-ref": "166fae7ef03ae7ae", + "bom-ref": "567adc869798da70", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Taml.pl", "type": "file" }, { - "bom-ref": "05f744fbf83e0d47", + "bom-ref": "07fa14517678fa25", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Telu.pl", "type": "file" }, { - "bom-ref": "f95cd550b099dd18", + "bom-ref": "aaea78ade13adb46", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Zinh.pl", "type": "file" }, { - "bom-ref": "c05154d8fbc9ab0c", + "bom-ref": "ab8316f806b2424a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Zyyy.pl", "type": "file" }, { - "bom-ref": "8d4602eec14c7bf8", + "bom-ref": "9359c6795198801e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Adlm.pl", "type": "file" }, { - "bom-ref": "fdd4b48e880bb59f", + "bom-ref": "a5489fae4f78482d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Arab.pl", "type": "file" }, { - "bom-ref": "5fd718724bb7d15d", + "bom-ref": "3fc4e93884908c93", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Armn.pl", "type": "file" }, { - "bom-ref": "0edb411872d22022", + "bom-ref": "c53a969199cf6890", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Beng.pl", "type": "file" }, { - "bom-ref": "c36b219ed51f75d6", + "bom-ref": "c8031de4cf37d1a4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Bhks.pl", "type": "file" }, { - "bom-ref": "5eba129bd63c2b76", + "bom-ref": "af798499899e48d8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Bopo.pl", "type": "file" }, { - "bom-ref": "f5fe6aab4a81a165", + "bom-ref": "3c425a35a0c96b57", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Cakm.pl", "type": "file" }, { - "bom-ref": "f163a1e33e842ec9", + "bom-ref": "be252527310dc9e3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Cham.pl", "type": "file" }, { - "bom-ref": "10af86a7c8e09cc2", + "bom-ref": "635716d09cf4cc8c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Copt.pl", "type": "file" }, { - "bom-ref": "bc77cccb52b8dd9c", + "bom-ref": "4c9c4d18f389b276", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Cprt.pl", "type": "file" }, { - "bom-ref": "fd26c530f7ac3733", + "bom-ref": "c51e12dc9262b7ed", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Cyrl.pl", "type": "file" }, { - "bom-ref": "98a60d0f6b361c42", + "bom-ref": "53f7efba989218dc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Deva.pl", "type": "file" }, { - "bom-ref": "faf8792edb549761", + "bom-ref": "64519b7a97ad5ac3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Diak.pl", "type": "file" }, { - "bom-ref": "4373f7931c050660", + "bom-ref": "0f6c536645c17982", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Dupl.pl", "type": "file" }, { - "bom-ref": "0119cede4917f169", + "bom-ref": "0260a6cea892377f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Ethi.pl", "type": "file" }, { - "bom-ref": "7c2a56006679e548", + "bom-ref": "64deb864a1286cf2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Geor.pl", "type": "file" }, { - "bom-ref": "90ed3e60fa73d920", + "bom-ref": "342008c4209c08da", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Glag.pl", "type": "file" }, { - "bom-ref": "e06877551e6f06f5", + "bom-ref": "2f16ee785f335b0b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Gong.pl", "type": "file" }, { - "bom-ref": "eefdc2bcf94a7feb", + "bom-ref": "aab18642baf5758d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Gonm.pl", "type": "file" }, { - "bom-ref": "3537571a650c633c", + "bom-ref": "1eabe36af0b05fb2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Gran.pl", "type": "file" }, { - "bom-ref": "9b5cee73eb1c6345", + "bom-ref": "80530860c96718c7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Grek.pl", "type": "file" }, { - "bom-ref": "0c44624ec678e989", + "bom-ref": "df4f873c30283c0f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Gujr.pl", "type": "file" }, { - "bom-ref": "01e6a7b417a1b62e", + "bom-ref": "b01178934a59c9d0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Guru.pl", "type": "file" }, { - "bom-ref": "41afcd1d7beadba9", + "bom-ref": "24d25b9340cc74db", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Han.pl", "type": "file" }, { - "bom-ref": "0afb8744f1e0aacd", + "bom-ref": "0f0e5bf9df46e2bb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Hang.pl", "type": "file" }, { - "bom-ref": "210bc15400928916", + "bom-ref": "899a7b31d5a97cbc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Hebr.pl", "type": "file" }, { - "bom-ref": "a3c7c3828b9c6ab7", + "bom-ref": "a7baf22f898db711", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Hira.pl", "type": "file" }, { - "bom-ref": "7e981079344f9519", + "bom-ref": "233fa470f209cf83", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Hmng.pl", "type": "file" }, { - "bom-ref": "7462c0ef87ea5d24", + "bom-ref": "01666c51300313a6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Hmnp.pl", "type": "file" }, { - "bom-ref": "c38a04df24ee3781", + "bom-ref": "c58f7bfc43e0d623", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Kana.pl", "type": "file" }, { - "bom-ref": "47815e30be09a264", + "bom-ref": "93e6ba320ec039a2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Khar.pl", "type": "file" }, { - "bom-ref": "be4d8be70774a2f0", + "bom-ref": "8d9c9e7ad0716d8a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Khmr.pl", "type": "file" }, { - "bom-ref": "1def45714a3c6ad0", + "bom-ref": "c89a2c2e1d912282", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Khoj.pl", "type": "file" }, { - "bom-ref": "451d16920ae88860", + "bom-ref": "6f3f31227426349e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Knda.pl", "type": "file" }, { - "bom-ref": "90d72f17b48cc653", + "bom-ref": "370d4230b99d94c5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Kthi.pl", "type": "file" }, { - "bom-ref": "c89bf329f6652dcf", + "bom-ref": "77dd7b3c37357bd9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Lana.pl", "type": "file" }, { - "bom-ref": "69c3d53ba086da37", + "bom-ref": "419bb750d8cc218d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Lao.pl", "type": "file" }, { - "bom-ref": "f555b30977765fff", + "bom-ref": "2a0856a5a00ef58d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Latn.pl", "type": "file" }, { - "bom-ref": "5cafa98a9f1da15e", + "bom-ref": "d018846610ded47c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Limb.pl", "type": "file" }, { - "bom-ref": "ab5d4b6974e0d032", + "bom-ref": "b9e38ca3822f220c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Lina.pl", "type": "file" }, { - "bom-ref": "95e2c5d8efa32154", + "bom-ref": "53a9de1fec1e062e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Linb.pl", "type": "file" }, { - "bom-ref": "3d085cb30f37ce5e", + "bom-ref": "f920aa29f3b57020", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Mlym.pl", "type": "file" }, { - "bom-ref": "6870a67f6c342f9d", + "bom-ref": "160d3bd094f4aea7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Mong.pl", "type": "file" }, { - "bom-ref": "17261c1dfcd4e469", + "bom-ref": "38030f353dd26eab", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Mult.pl", "type": "file" }, { - "bom-ref": "9be1740bc1ce4d11", + "bom-ref": "db0cc3a7d7d4a0d3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Mymr.pl", "type": "file" }, { - "bom-ref": "6910bf6b32d35dc7", + "bom-ref": "9a4f30a4d4d428dd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Nand.pl", "type": "file" }, { - "bom-ref": "6730257934373f0f", + "bom-ref": "e69eb7a0933b9495", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Nko.pl", "type": "file" }, { - "bom-ref": "94908c477bbd8beb", + "bom-ref": "e431733a497af4f9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Orya.pl", "type": "file" }, { - "bom-ref": "310e9269e804235b", + "bom-ref": "96a73c33090fbff9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Phlp.pl", "type": "file" }, { - "bom-ref": "66e7b07cc1f34909", + "bom-ref": "cb8b10d676605717", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Rohg.pl", "type": "file" }, { - "bom-ref": "84b116dc6a440c3f", + "bom-ref": "de1eec44e309747d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Shrd.pl", "type": "file" }, { - "bom-ref": "91ecae042f96b25e", + "bom-ref": "afb37bcad67e59e4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Sind.pl", "type": "file" }, { - "bom-ref": "fabd76f05ce1c102", + "bom-ref": "c7ff4e92de5f9498", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Sinh.pl", "type": "file" }, { - "bom-ref": "7dc26dc4b5214eb2", + "bom-ref": "8a66dc11476dbe88", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Syrc.pl", "type": "file" }, { - "bom-ref": "9a13fe72e9258a5b", + "bom-ref": "b79d0bdb941192f9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Tagb.pl", "type": "file" }, { - "bom-ref": "881b3ecabe531864", + "bom-ref": "ee7a3161303d4946", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Takr.pl", "type": "file" }, { - "bom-ref": "01de77a65b727f7a", + "bom-ref": "069a9425a51ab08c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Talu.pl", "type": "file" }, { - "bom-ref": "0a6a616ffabe7f68", + "bom-ref": "7db0ec5e7ba33f9e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Taml.pl", "type": "file" }, { - "bom-ref": "ec74cbe0bceda936", + "bom-ref": "aa626f9d9fd1b5ec", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Tang.pl", "type": "file" }, { - "bom-ref": "c7f346a02bfa71a5", + "bom-ref": "8c674fdeeab98777", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Telu.pl", "type": "file" }, { - "bom-ref": "7d4c0e50ed570e14", + "bom-ref": "5174416241c1ff3e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Thaa.pl", "type": "file" }, { - "bom-ref": "8af6a72a6007d59c", + "bom-ref": "c55d936714d282f2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Tibt.pl", "type": "file" }, { - "bom-ref": "d7fd5396ffcc9059", + "bom-ref": "cf19b6a291aff6db", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Tirh.pl", "type": "file" }, { - "bom-ref": "725a59fec4681d61", + "bom-ref": "2c508c72b3166cd3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Vith.pl", "type": "file" }, { - "bom-ref": "ab12d055c3265c56", + "bom-ref": "7bf5ce0f39d181e0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Xsux.pl", "type": "file" }, { - "bom-ref": "3d368f471bed5f1b", + "bom-ref": "436e66f9825ff885", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Yezi.pl", "type": "file" }, { - "bom-ref": "9f0f79d75fda4a1b", + "bom-ref": "e079ee0b915b8731", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Yi.pl", "type": "file" }, { - "bom-ref": "94023a7042ba4174", + "bom-ref": "f3670541c4c1649e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Zinh.pl", "type": "file" }, { - "bom-ref": "80b8226456cc9e9c", + "bom-ref": "f9b2c287d7204c46", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Zyyy.pl", "type": "file" }, { - "bom-ref": "8cb57b37023791cd", + "bom-ref": "f866ed7f870afa1f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Zzzz.pl", "type": "file" }, { - "bom-ref": "4dec868cf0cfaae4", + "bom-ref": "2d037c751df4c1aa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Term/Y.pl", "type": "file" }, { - "bom-ref": "9261462ea3f144af", + "bom-ref": "d98dc99bd9f1865d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/UIdeo/Y.pl", "type": "file" }, { - "bom-ref": "67724280eeeceacc", + "bom-ref": "07bfd89abcecf7ae", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Upper/Y.pl", "type": "file" }, { - "bom-ref": "4d0572d9398729c7", + "bom-ref": "a4b82e1b1e22c61d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/VS/Y.pl", "type": "file" }, { - "bom-ref": "60c6728f66ffc770", + "bom-ref": "2c510e6277a4d476", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Vo/R.pl", "type": "file" }, { - "bom-ref": "a526f91bf130ec14", + "bom-ref": "32b068a8f5c2e086", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Vo/Tr.pl", "type": "file" }, { - "bom-ref": "8273e4bae319fa28", + "bom-ref": "4ffc8ccdce6e84a2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Vo/Tu.pl", "type": "file" }, { - "bom-ref": "ed4442895cfb0af8", + "bom-ref": "886ddf5ba3646072", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Vo/U.pl", "type": "file" }, { - "bom-ref": "5ceaa545ad329a5e", + "bom-ref": "c356c6770e1e3608", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/EX.pl", "type": "file" }, { - "bom-ref": "be50cc0ee76169c1", + "bom-ref": "f0db10f39bc37e53", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/Extend.pl", "type": "file" }, { - "bom-ref": "6529281accda6a27", + "bom-ref": "cd571595cc4455b9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/FO.pl", "type": "file" }, { - "bom-ref": "1e2461bcc3ff446b", + "bom-ref": "151b76d5a978f731", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/HL.pl", "type": "file" }, { - "bom-ref": "d864850938eff954", + "bom-ref": "100e00b92e5ee16e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/KA.pl", "type": "file" }, { - "bom-ref": "6c7b3c0da4bc3a38", + "bom-ref": "cca75d1011ce11b2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/LE.pl", "type": "file" }, { - "bom-ref": "4574b8b0ccacf1ac", + "bom-ref": "960bee9ec43cfd4a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/MB.pl", "type": "file" }, { - "bom-ref": "8f6579abf7541d16", + "bom-ref": "bf6ac90194cb3a08", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/ML.pl", "type": "file" }, { - "bom-ref": "dd94b665511ee06a", + "bom-ref": "6316c390f398ff00", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/MN.pl", "type": "file" }, { - "bom-ref": "aa710bd9815b2b1f", + "bom-ref": "9c6ce688449cd97d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/NU.pl", "type": "file" }, { - "bom-ref": "fdb691b2c0f8a565", + "bom-ref": "5715d258c3dd788b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/WSegSpac.pl", "type": "file" }, { - "bom-ref": "3c2d6d4a2e3622a0", + "bom-ref": "7651911b347e617a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/XX.pl", "type": "file" }, { - "bom-ref": "aa2b638f285a3c3a", + "bom-ref": "8308f43432ac8ca8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/XIDC/Y.pl", "type": "file" }, { - "bom-ref": "44a34628d6719838", + "bom-ref": "e618bf8a19ec4eee", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/XIDS/Y.pl", "type": "file" }, { - "bom-ref": "43ac070d70eb0c6f", + "bom-ref": "e1f04019c00991d1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/utf8.pm", "type": "file" }, { - "bom-ref": "c18d5f0748b0f7fa", + "bom-ref": "627198ef2a925f50", "name": "/usr/lib/x86_64-linux-gnu/perl-base/vars.pm", "type": "file" }, { - "bom-ref": "7feace6d099e19ca", + "bom-ref": "197486771a893aa8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/warnings.pm", "type": "file" }, { - "bom-ref": "b7bb08c979a9237d", + "bom-ref": "05b41eb51af550eb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/warnings/register.pm", "type": "file" }, { - "bom-ref": "2d89511dab79340c", + "bom-ref": "c16b80f4818f0ec4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/B.pm", "type": "file" }, { - "bom-ref": "ce220e4f0c934208", + "bom-ref": "c6acff06b72eb5c0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/B/Concise.pm", "type": "file" }, { - "bom-ref": "4c75c42a64b2dbb4", + "bom-ref": "c0bd6b3022a2cad0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/B/Showlex.pm", "type": "file" }, { - "bom-ref": "b859bbb5d9a25992", + "bom-ref": "9ab1bba08f0ebefe", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/B/Terse.pm", "type": "file" }, { - "bom-ref": "330a0d3b93cd1f60", + "bom-ref": "2693c28c0dbc827c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/B/Xref.pm", "type": "file" }, { - "bom-ref": "603bdada96224f29", + "bom-ref": "4f0d9f1dfd50ec31", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/EXTERN.h", "type": "file" }, { - "bom-ref": "23a30ea5f44ea5d7", + "bom-ref": "3f9d11c6266fb987", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/INTERN.h", "type": "file" }, { - "bom-ref": "97ee896d67ffb564", + "bom-ref": "d212d0bfb1885b30", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/XSUB.h", "type": "file" }, { - "bom-ref": "5cb5a00b67b24f93", + "bom-ref": "3c5646394c0a08ff", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/av.h", "type": "file" }, { - "bom-ref": "50170a3e7df2f534", + "bom-ref": "920a1be4250a21a8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/bitcount.h", "type": "file" }, { - "bom-ref": "57133ed6d4886090", + "bom-ref": "4c1ef1f8eaba7674", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/charclass_invlists.h", "type": "file" }, { - "bom-ref": "5432b15210fecb31", + "bom-ref": "5682dac28a1e0c6d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/config.h", "type": "file" }, { - "bom-ref": "2d1db6d7dd665705", + "bom-ref": "60dfcb2adda5e049", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/cop.h", "type": "file" }, { - "bom-ref": "51cdb911babdafb8", + "bom-ref": "7bb925f22c812fa8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/cv.h", "type": "file" }, { - "bom-ref": "ed338e942ef4cfc1", + "bom-ref": "40dd0009980db771", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/dosish.h", "type": "file" }, { - "bom-ref": "b710170a43144679", + "bom-ref": "655fcf85a3d974b1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/ebcdic_tables.h", "type": "file" }, { - "bom-ref": "7f402cf23161a360", + "bom-ref": "c5552a20db29c730", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/embed.h", "type": "file" }, { - "bom-ref": "4a4b431a697897a3", + "bom-ref": "9b8d5d9da6f33913", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/embedvar.h", "type": "file" }, { - "bom-ref": "9fa0f825ee740fac", + "bom-ref": "63553fab91411d14", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/fakesdio.h", "type": "file" }, { - "bom-ref": "1b8c9e7632b4b282", + "bom-ref": "b7a6e05d0e5b1482", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/feature.h", "type": "file" }, { - "bom-ref": "0204d95dbff17bc7", + "bom-ref": "4eeef7ffd392aaf7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/form.h", "type": "file" }, { - "bom-ref": "0e91c63b9b4aeef4", + "bom-ref": "f8a4634345f0a7c4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/git_version.h", "type": "file" }, { - "bom-ref": "e45361a63cf6ea34", + "bom-ref": "4aba16a0a47798e4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/gv.h", "type": "file" }, { - "bom-ref": "de4764f835fdacd3", + "bom-ref": "5f4ec3d004c066b7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/handy.h", "type": "file" }, { - "bom-ref": "fb27d98864f3ad73", + "bom-ref": "99f90a9f823c63af", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/hv.h", "type": "file" }, { - "bom-ref": "88caf4b7f56a733a", + "bom-ref": "6c14d10aede7aefa", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/hv_func.h", "type": "file" }, { - "bom-ref": "3023e98682bba790", + "bom-ref": "acab27e9ae95beb0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/hv_macro.h", "type": "file" }, { - "bom-ref": "19d1a629722ba068", + "bom-ref": "e374f029844c71cc", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/inline.h", "type": "file" }, { - "bom-ref": "e95327e3f76625a5", + "bom-ref": "d948ac8e1faa8935", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/intrpvar.h", "type": "file" }, { - "bom-ref": "19b5783cbbb090a1", + "bom-ref": "426f14027c776471", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/invlist_inline.h", "type": "file" }, { - "bom-ref": "052103fb74426dac", + "bom-ref": "1708907ebac074c8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/iperlsys.h", "type": "file" }, { - "bom-ref": "e5faa9878d7e0345", + "bom-ref": "cbd5ea2206a146a9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/keywords.h", "type": "file" }, { - "bom-ref": "3c74adb549234b89", + "bom-ref": "42e2936555764291", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/l1_char_class_tab.h", "type": "file" }, { - "bom-ref": "9c6e1d6658424c09", + "bom-ref": "6b7c7b21d06fbf05", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/malloc_ctl.h", "type": "file" }, { - "bom-ref": "bb6cf033a18d813c", + "bom-ref": "45a3fdc30ebd2110", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/metaconfig.h", "type": "file" }, { - "bom-ref": "0870b2e4150c22af", + "bom-ref": "6d78fb292dd6a1ef", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/mg.h", "type": "file" }, { - "bom-ref": "d7b2d7345a7035b0", + "bom-ref": "0a9234ade0b97a90", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/mg_data.h", "type": "file" }, { - "bom-ref": "28d05267ceead596", + "bom-ref": "4c15c56c3b9091ee", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/mg_raw.h", "type": "file" }, { - "bom-ref": "fff7654e8fcddb53", + "bom-ref": "03528cbd73dca32f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/mg_vtable.h", "type": "file" }, { - "bom-ref": "122a62a050c2c98d", + "bom-ref": "f3a9bd88f5b5dde9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/mydtrace.h", "type": "file" }, { - "bom-ref": "0bfb5608ad1514ad", + "bom-ref": "9d3d67cc074db891", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/nostdio.h", "type": "file" }, { - "bom-ref": "fede38b52f18f55b", + "bom-ref": "adaf1b05a38066f7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/op.h", "type": "file" }, { - "bom-ref": "287fcb0e9f729615", + "bom-ref": "55fc313566581309", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/op_reg_common.h", "type": "file" }, { - "bom-ref": "368d7fabc184c71b", + "bom-ref": "dee08e50cc50fa9b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/opcode.h", "type": "file" }, { - "bom-ref": "0b63581e4afc3f9c", + "bom-ref": "75e3fbd61cf86a9c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/opnames.h", "type": "file" }, { - "bom-ref": "b59ae3e0f9638a78", + "bom-ref": "6be69144a0c8c67c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/overload.h", "type": "file" }, { - "bom-ref": "0ef2d80835c7e494", + "bom-ref": "e1534e775bbb3d9c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/pad.h", "type": "file" }, { - "bom-ref": "0c1e484617391ed0", + "bom-ref": "f7f61da2c42e7694", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/parser.h", "type": "file" }, { - "bom-ref": "4e6659187c777e6f", + "bom-ref": "acc8167668100a63", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/patchlevel-debian.h", "type": "file" }, { - "bom-ref": "b7fb04ce21bd3479", + "bom-ref": "14437d70474fcfe1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/patchlevel.h", "type": "file" }, { - "bom-ref": "54129414a2e6b551", + "bom-ref": "955ea06e796ccc09", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perl.h", "type": "file" }, { - "bom-ref": "75bf6b552ac91972", + "bom-ref": "cc81d7585cbee7c2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perl_inc_macro.h", "type": "file" }, { - "bom-ref": "69d25a35d361f251", + "bom-ref": "d9ab7cb330e63895", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perl_langinfo.h", "type": "file" }, { - "bom-ref": "16d8f5e76a35688d", + "bom-ref": "406363e2c7b002b1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perl_siphash.h", "type": "file" }, { - "bom-ref": "2db97f969a7dc28a", + "bom-ref": "01994e433b85c0ea", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perlapi.h", "type": "file" }, { - "bom-ref": "b72db2f2f27d5ed4", + "bom-ref": "55f309c98e4d36d4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perlio.h", "type": "file" }, { - "bom-ref": "40af6b43c217f657", + "bom-ref": "648fd4d92fafb47f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perliol.h", "type": "file" }, { - "bom-ref": "b4e8e84712db798e", + "bom-ref": "6aede10916b8c8ea", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perlsdio.h", "type": "file" }, { - "bom-ref": "4afd1d7d4c94967f", + "bom-ref": "1b93501e8286509f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perlstatic.h", "type": "file" }, { - "bom-ref": "3e03f7a35155941a", + "bom-ref": "cd8d55c9b0ee3b92", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perlvars.h", "type": "file" }, { - "bom-ref": "b532f378db03107d", + "bom-ref": "48111ebd3c067e05", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perly.h", "type": "file" }, { - "bom-ref": "f3f50f86a71051be", + "bom-ref": "1f5c492d5df7e492", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/pp.h", "type": "file" }, { - "bom-ref": "9703338b3b09e020", + "bom-ref": "93fb4b637ecfa4b4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/pp_proto.h", "type": "file" }, { - "bom-ref": "1e586ff11acee477", + "bom-ref": "767e6b6b3582c6cb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/proto.h", "type": "file" }, { - "bom-ref": "08feb8a837a4506f", + "bom-ref": "a2bcc140125fb8a7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/reentr.h", "type": "file" }, { - "bom-ref": "f2579daf8d7e7380", + "bom-ref": "8d4c8d92c3baeb48", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/regcharclass.h", "type": "file" }, { - "bom-ref": "79cb5306e649d9b0", + "bom-ref": "9d5536eae1582744", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/regcomp.h", "type": "file" }, { - "bom-ref": "3dc7a235890e9b20", + "bom-ref": "e7eba925df86059c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/regcomp_internal.h", "type": "file" }, { - "bom-ref": "ee8a1ccc1c87c6bf", + "bom-ref": "e8c6a019b8bb076b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/regexp.h", "type": "file" }, { - "bom-ref": "29f3541f4df848c9", + "bom-ref": "6995fb001a8e5b61", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/reginline.h", "type": "file" }, { - "bom-ref": "f9c38517a34c197d", + "bom-ref": "a22655cfb3111ecd", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/regnodes.h", "type": "file" }, { - "bom-ref": "6cfa01a0da255978", + "bom-ref": "5fc945c02054c8f0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/sbox32_hash.h", "type": "file" }, { - "bom-ref": "ae07454d8ad9250c", + "bom-ref": "74377cfa238ea51c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/scope.h", "type": "file" }, { - "bom-ref": "cf8b1bf8d4477668", + "bom-ref": "59ef39e3289d6fb8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/scope_types.h", "type": "file" }, { - "bom-ref": "1b2ff419edbf91e1", + "bom-ref": "addbd82157fed959", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/sv.h", "type": "file" }, { - "bom-ref": "588bc417f6906a6c", + "bom-ref": "0a446a90f2be0b28", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/sv_inline.h", "type": "file" }, { - "bom-ref": "8521ec0bfe486b98", + "bom-ref": "868a763b6d4896b0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/thread.h", "type": "file" }, { - "bom-ref": "a279cc72f21bf7d6", + "bom-ref": "b4065d4b61387fe2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/time64.h", "type": "file" }, { - "bom-ref": "3dc36f2944681036", + "bom-ref": "cc69caa9e1ccf3ba", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/time64_config.h", "type": "file" }, { - "bom-ref": "9fad847c1ff1a1f9", + "bom-ref": "aed7b0d69c8a1bfd", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/uconfig.h", "type": "file" }, { - "bom-ref": "04017104afbc4d75", + "bom-ref": "2dd9ae087898c7dd", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/uni_keywords.h", "type": "file" }, { - "bom-ref": "d0e5794c400c1f21", + "bom-ref": "eaac0aa345e4c5d5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/unicode_constants.h", "type": "file" }, { - "bom-ref": "cdd03142943339aa", + "bom-ref": "8c0cd5e3c0da5d0e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/unixish.h", "type": "file" }, { - "bom-ref": "24458cac60fa4d8e", + "bom-ref": "626b6429dd8a45d2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/utf8.h", "type": "file" }, { - "bom-ref": "8086b8ddf63719f7", + "bom-ref": "d1380ebf30be1ab3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/utfebcdic.h", "type": "file" }, { - "bom-ref": "8950f8865ecf9d96", + "bom-ref": "44f32dd69523ab72", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/util.h", "type": "file" }, { - "bom-ref": "b4c3e119cd7cb2d0", + "bom-ref": "13bb041a22e64a2c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/uudmap.h", "type": "file" }, { - "bom-ref": "a8006ecdeb39faf9", + "bom-ref": "11ff3c61a213d44d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/vutil.h", "type": "file" }, { - "bom-ref": "8b6aae3587f28d32", + "bom-ref": "21e0bf8877e2dcb2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/warnings.h", "type": "file" }, { - "bom-ref": "95a59a4a39209492", + "bom-ref": "fca0dddbb6faa3ba", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/zaphod32_hash.h", "type": "file" }, { - "bom-ref": "45a5e5b530fcaf52", + "bom-ref": "f122f105a14d82e6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Compress/Raw/Bzip2.pm", "type": "file" }, { - "bom-ref": "6796bceaed105bb7", + "bom-ref": "0c26f115b0813517", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Compress/Raw/Zlib.pm", "type": "file" }, { - "bom-ref": "fe1799ba6683aa93", + "bom-ref": "7faade546bf58ed3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Config.pm", "type": "file" }, { - "bom-ref": "603a744ecfed855a", + "bom-ref": "4eb12e4b9c643e26", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Config.pod", "type": "file" }, { - "bom-ref": "b4531302ff2afa8f", + "bom-ref": "88723d1e447622bb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Config_git.pl", "type": "file" }, { - "bom-ref": "b58f6b4d89d07224", + "bom-ref": "237f0730310d75b8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Config_heavy.pl", "type": "file" }, { - "bom-ref": "ef7845c07bc42c13", + "bom-ref": "cca3555a233f1d8b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Cwd.pm", "type": "file" }, { - "bom-ref": "a7c8fedc8dfccf21", + "bom-ref": "4cb0121f12f536c1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/DB_File.pm", "type": "file" }, { - "bom-ref": "e33d688f01dac3b4", + "bom-ref": "7236ed9262de2e30", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Data/Dumper.pm", "type": "file" }, { - "bom-ref": "952f661cb6408cdd", + "bom-ref": "4688c9e59a219f8d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Devel/PPPort.pm", "type": "file" }, { - "bom-ref": "5e30ac5e5bc2ce5f", + "bom-ref": "2b084bc47e1595b3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Devel/Peek.pm", "type": "file" }, { - "bom-ref": "8d835e41661ce74b", + "bom-ref": "6460685c35d0a21b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Digest/MD5.pm", "type": "file" }, { - "bom-ref": "4ff3da87689db2ef", + "bom-ref": "ab4c8229478526f7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Digest/SHA.pm", "type": "file" }, { - "bom-ref": "dfcaef1f36ae564b", + "bom-ref": "4cd6cf90ea2bc3ab", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/DynaLoader.pm", "type": "file" }, { - "bom-ref": "b46bdc81f397e231", + "bom-ref": "7ad334dab4b21719", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode.pm", "type": "file" }, { - "bom-ref": "bee2f251e37816bd", + "bom-ref": "d165dabbab453771", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Alias.pm", "type": "file" }, { - "bom-ref": "db485609a1c1865c", + "bom-ref": "4b43b04f79bb064c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Byte.pm", "type": "file" }, { - "bom-ref": "71dd3dd3b67c717c", + "bom-ref": "4b059d32992cd814", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/CJKConstants.pm", "type": "file" }, { - "bom-ref": "32e78e5f5ace6136", + "bom-ref": "aad80a700890deae", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/CN.pm", "type": "file" }, { - "bom-ref": "ef3ffcd9b519ffd7", + "bom-ref": "d87d15df0d891127", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/CN/HZ.pm", "type": "file" }, { - "bom-ref": "ca9a2c13e5264959", + "bom-ref": "8f3fa1490767573d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Config.pm", "type": "file" }, { - "bom-ref": "ab2349db2cc22594", + "bom-ref": "237d88199c40bcd0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/EBCDIC.pm", "type": "file" }, { - "bom-ref": "97249d2c7f095ad9", + "bom-ref": "b5412d56a3ac05c9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Encoder.pm", "type": "file" }, { - "bom-ref": "ba22b3eca54c2feb", + "bom-ref": "3075cc1a111919b3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Encoding.pm", "type": "file" }, { - "bom-ref": "30f4c47d410bc154", + "bom-ref": "bf3adfcbe24cb060", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/GSM0338.pm", "type": "file" }, { - "bom-ref": "529a2733e60ce04c", + "bom-ref": "106458d8299d760c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Guess.pm", "type": "file" }, { - "bom-ref": "796000e2e1ff1675", + "bom-ref": "d21ca526de9acf25", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/JP.pm", "type": "file" }, { - "bom-ref": "90adc3adc0c71cde", + "bom-ref": "9822a5b91a65f6ea", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/JP/H2Z.pm", "type": "file" }, { - "bom-ref": "339b3dd527badfbf", + "bom-ref": "508e47959a9b9753", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/JP/JIS7.pm", "type": "file" }, { - "bom-ref": "10778c54d7c3945b", + "bom-ref": "0eb0e9c71cd050e7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/KR.pm", "type": "file" }, { - "bom-ref": "9e0aeeb254524f2e", + "bom-ref": "5a5fd6b08d339a62", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/KR/2022_KR.pm", "type": "file" }, { - "bom-ref": "c6e593cf08fe1056", + "bom-ref": "d0bd0d193ff700fa", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/MIME/Header.pm", "type": "file" }, { - "bom-ref": "a5cc279e97750318", + "bom-ref": "76e8ea34b0577cb0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/MIME/Header/ISO_2022_JP.pm", "type": "file" }, { - "bom-ref": "df0a97f25846f5f9", + "bom-ref": "fd1f0512241fbfa5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/MIME/Name.pm", "type": "file" }, { - "bom-ref": "daa4a8ac9b332d60", + "bom-ref": "ecac86c456044a44", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Symbol.pm", "type": "file" }, { - "bom-ref": "abb2689ede4d9d58", + "bom-ref": "9586fa5dca4c49b4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/TW.pm", "type": "file" }, { - "bom-ref": "38cb94486c4c8c84", + "bom-ref": "cae18ab138b949c8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Unicode.pm", "type": "file" }, { - "bom-ref": "853f1f538ae70d73", + "bom-ref": "b2da2f54bafcbf37", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Unicode/UTF7.pm", "type": "file" }, { - "bom-ref": "c720320705be27a9", + "bom-ref": "b7f3e28a38c403e1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Errno.pm", "type": "file" }, { - "bom-ref": "29235862e0fa0fb2", + "bom-ref": "45804fa0030bd4ca", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Fcntl.pm", "type": "file" }, { - "bom-ref": "2810361a3a593603", + "bom-ref": "51dcb52421490fab", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/DosGlob.pm", "type": "file" }, { - "bom-ref": "10521afc456adbf4", + "bom-ref": "06bb5d42a6b74530", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Glob.pm", "type": "file" }, { - "bom-ref": "3350d990ebd9e466", + "bom-ref": "62f18b8d61b14486", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec.pm", "type": "file" }, { - "bom-ref": "4f9030251073864e", + "bom-ref": "3657c80901d5cc82", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/AmigaOS.pm", "type": "file" }, { - "bom-ref": "26ec90a0a25a8271", + "bom-ref": "2b1e4569862e5bb5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Cygwin.pm", "type": "file" }, { - "bom-ref": "9d088ff47193982c", + "bom-ref": "87d106eaa1d4b46c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Epoc.pm", "type": "file" }, { - "bom-ref": "a789b0416c63da27", + "bom-ref": "3fa74b706d5e6d17", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Functions.pm", "type": "file" }, { - "bom-ref": "ce47089dd63a66d0", + "bom-ref": "ff86207f765f4d0c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Mac.pm", "type": "file" }, { - "bom-ref": "d93fc60c7f856e7a", + "bom-ref": "2653c5e9d8b4fa1e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/OS2.pm", "type": "file" }, { - "bom-ref": "58c2de6656dc9fc0", + "bom-ref": "80e03c7da076da28", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Unix.pm", "type": "file" }, { - "bom-ref": "793e8a4da1a3f4e8", + "bom-ref": "c8448cd6a6705538", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/VMS.pm", "type": "file" }, { - "bom-ref": "24c67b3d9b0f29dd", + "bom-ref": "4bc89068f55b9ba9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Win32.pm", "type": "file" }, { - "bom-ref": "256df5a8694e6d1e", + "bom-ref": "34af6868b8d79dae", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Filter/Util/Call.pm", "type": "file" }, { - "bom-ref": "e4c9f156f35b2647", + "bom-ref": "41a508edd2ab2b7b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/GDBM_File.pm", "type": "file" }, { - "bom-ref": "522bc9f1d1383366", + "bom-ref": "9b9445feed65edde", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Hash/Util.pm", "type": "file" }, { - "bom-ref": "12ab40b85ef63b9e", + "bom-ref": "e851abf2b7b56ff2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Hash/Util/FieldHash.pm", "type": "file" }, { - "bom-ref": "66a5d75f7dd944fa", + "bom-ref": "ed1de8f08d4cd242", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/I18N/Langinfo.pm", "type": "file" }, { - "bom-ref": "b0fcec0cab6964da", + "bom-ref": "342007e5598c9bb6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO.pm", "type": "file" }, { - "bom-ref": "ecb7e68c46f67623", + "bom-ref": "31ad6031bfa7d2bb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Dir.pm", "type": "file" }, { - "bom-ref": "507ad46857c4d20f", + "bom-ref": "93e2c8a77e0770ff", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/File.pm", "type": "file" }, { - "bom-ref": "76d9469b9420a00f", + "bom-ref": "31d0a9f0ceb20677", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Handle.pm", "type": "file" }, { - "bom-ref": "6b98c0ba97e77af5", + "bom-ref": "dee74e9feb586961", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Pipe.pm", "type": "file" }, { - "bom-ref": "956e30e5f38172fd", + "bom-ref": "e6b79fba781c0581", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Poll.pm", "type": "file" }, { - "bom-ref": "ee9dcb83a4ac2952", + "bom-ref": "f2c8ef05d79696ba", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Seekable.pm", "type": "file" }, { - "bom-ref": "2c93c60d65a8f861", + "bom-ref": "9f64ece4d905e145", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Select.pm", "type": "file" }, { - "bom-ref": "2cad40da9f53ba46", + "bom-ref": "f584d31e4bbb6f62", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Socket.pm", "type": "file" }, { - "bom-ref": "6db1e66f8e017634", + "bom-ref": "6fb97a8d6a51dec4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Socket/INET.pm", "type": "file" }, { - "bom-ref": "1b272fa020db4f6c", + "bom-ref": "db37a121c373e948", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Socket/UNIX.pm", "type": "file" }, { - "bom-ref": "30f2476fcf8681ad", + "bom-ref": "8eb06e90e0dd7ded", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IPC/Msg.pm", "type": "file" }, { - "bom-ref": "959d7eacd5924df6", + "bom-ref": "88f2bb82e0500e56", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IPC/Semaphore.pm", "type": "file" }, { - "bom-ref": "28f9aaeec81d0208", + "bom-ref": "42c57cef18805ae8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IPC/SharedMem.pm", "type": "file" }, { - "bom-ref": "2b6c2122db0c1637", + "bom-ref": "cd838eefde70fbd7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IPC/SysV.pm", "type": "file" }, { - "bom-ref": "ea7c44ccf7f8ad4c", + "bom-ref": "5897f6cf1a9ba024", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/List/Util.pm", "type": "file" }, { - "bom-ref": "c6893d91b80e440a", + "bom-ref": "a323e4b9473d676a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/List/Util/XS.pm", "type": "file" }, { - "bom-ref": "57ab09b8900d2f54", + "bom-ref": "908f314e25f1e04c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/MIME/Base64.pm", "type": "file" }, { - "bom-ref": "221c22d64c28b874", + "bom-ref": "98a6d192b41463dc", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/MIME/QuotedPrint.pm", "type": "file" }, { - "bom-ref": "cc94d1f9e2169945", + "bom-ref": "0175f5dd1f340285", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Math/BigInt/FastCalc.pm", "type": "file" }, { - "bom-ref": "144368e4a10bdf2f", + "bom-ref": "e210722864aa23cb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/NDBM_File.pm", "type": "file" }, { - "bom-ref": "bcee5dc1aad137f8", + "bom-ref": "fd45892581777950", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/O.pm", "type": "file" }, { - "bom-ref": "45dcce77387e9392", + "bom-ref": "82d7e520bc476252", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/ODBM_File.pm", "type": "file" }, { - "bom-ref": "17799f45219b866e", + "bom-ref": "b531dfe5c380281a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Opcode.pm", "type": "file" }, { - "bom-ref": "0e65c67d523f6f58", + "bom-ref": "375bbce07ea1d1a4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/POSIX.pm", "type": "file" }, { - "bom-ref": "833be93af595b72c", + "bom-ref": "127a859d319a8a00", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/POSIX.pod", "type": "file" }, { - "bom-ref": "2974b08d9172ed19", + "bom-ref": "d0c1b8c7df7528e5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/PerlIO/encoding.pm", "type": "file" }, { - "bom-ref": "0ff1aec23cd36b2d", + "bom-ref": "5e47e9788ab01929", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/PerlIO/mmap.pm", "type": "file" }, { - "bom-ref": "ad29b7cee8d91d21", + "bom-ref": "dd227975dd6830c1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/PerlIO/scalar.pm", "type": "file" }, { - "bom-ref": "eac7e845938387af", + "bom-ref": "991c7076dcae8aeb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/PerlIO/via.pm", "type": "file" }, { - "bom-ref": "77f4241c9bd2a47b", + "bom-ref": "c71b662ecba052cf", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/SDBM_File.pm", "type": "file" }, { - "bom-ref": "270339d3f8ae3811", + "bom-ref": "82eec4755aee3395", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Scalar/Util.pm", "type": "file" }, { - "bom-ref": "05a3029e82acd8d6", + "bom-ref": "655511838a045d22", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Socket.pm", "type": "file" }, { - "bom-ref": "931fde2c742ff612", + "bom-ref": "dc80bdd2c7b141aa", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Storable.pm", "type": "file" }, { - "bom-ref": "14f299bafbc92db7", + "bom-ref": "89ed75445a42a507", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Sub/Util.pm", "type": "file" }, { - "bom-ref": "de77934e92f5b6fd", + "bom-ref": "399378fd3e2f8799", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Sys/Hostname.pm", "type": "file" }, { - "bom-ref": "a8f59a45b166fff9", + "bom-ref": "b5e5c92e454d6185", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Sys/Syslog.pm", "type": "file" }, { - "bom-ref": "8205f23feb39b7c7", + "bom-ref": "c26b2369667177a7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Time/HiRes.pm", "type": "file" }, { - "bom-ref": "d19bcbad187f2c1c", + "bom-ref": "8569b0c1e4ed6f10", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Time/Piece.pm", "type": "file" }, { - "bom-ref": "fa9ccbf5b30757c4", + "bom-ref": "f85a68f1030eb9dc", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Time/Seconds.pm", "type": "file" }, { - "bom-ref": "e25412a616cda22d", + "bom-ref": "cb6b40b287251075", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Unicode/Collate.pm", "type": "file" }, { - "bom-ref": "6f6274b4867849c3", + "bom-ref": "e0fd3d29ba1e430f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Unicode/Collate/Locale.pm", "type": "file" }, { - "bom-ref": "eee6aa8300e5e556", + "bom-ref": "adf504810642a65a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Unicode/Normalize.pm", "type": "file" }, { - "bom-ref": "916882882336ca3a", + "bom-ref": "1c36ec356102519e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/_h2ph_pre.ph", "type": "file" }, { - "bom-ref": "a5e849cfc7dbcb41", + "bom-ref": "3e618c875ae8974d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/bitsperlong.ph", "type": "file" }, { - "bom-ref": "4bdb246bd7ffed33", + "bom-ref": "eb259ba97145527f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/ioctl.ph", "type": "file" }, { - "bom-ref": "19319cc8ce22b4b7", + "bom-ref": "04e19b56c02a9bd7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/ioctls.ph", "type": "file" }, { - "bom-ref": "0324c6734e09afb3", + "bom-ref": "af432cf13a0b8343", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/posix_types.ph", "type": "file" }, { - "bom-ref": "8b144e2d35c0f609", + "bom-ref": "67808ed4a327bd39", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/socket.ph", "type": "file" }, { - "bom-ref": "dbe6eb641885be24", + "bom-ref": "6be389e2890c5398", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/sockios.ph", "type": "file" }, { - "bom-ref": "168f3556ef80c479", + "bom-ref": "3d50ba783dc60ca5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/termbits-common.ph", "type": "file" }, { - "bom-ref": "035a7450285756a7", + "bom-ref": "23d0b60539a0529f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/termbits.ph", "type": "file" }, { - "bom-ref": "17f647fc3250dbaa", + "bom-ref": "bf9bdc958be33a4e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/termios.ph", "type": "file" }, { - "bom-ref": "eaf5c66530793b4e", + "bom-ref": "1374a2148c34cd92", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/bitsperlong.ph", "type": "file" }, { - "bom-ref": "4b82df5d56a46adb", + "bom-ref": "4019ee47d23a2a57", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/ioctl.ph", "type": "file" }, { - "bom-ref": "3b5a09479824bf4b", + "bom-ref": "4b304e399a75a37b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/ioctls.ph", "type": "file" }, { - "bom-ref": "b98a4b119000acc8", + "bom-ref": "88b259edc6eb290c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/posix_types.ph", "type": "file" }, { - "bom-ref": "5d191f6425ced97a", + "bom-ref": "12e01044d0cd047a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/posix_types_32.ph", "type": "file" }, { - "bom-ref": "1a77f69c21bda051", + "bom-ref": "5b55e9f68466fb1d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/posix_types_64.ph", "type": "file" }, { - "bom-ref": "4509d099e988c1ac", + "bom-ref": "b15fa4a1c2a9adb4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/posix_types_x32.ph", "type": "file" }, { - "bom-ref": "098cd2ff9ee3496a", + "bom-ref": "9ce833c37875b9ee", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/socket.ph", "type": "file" }, { - "bom-ref": "66bf02d921e07267", + "bom-ref": "b42529940455e587", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/sockios.ph", "type": "file" }, { - "bom-ref": "072435f94f5e693b", + "bom-ref": "4609e3395fc3c7eb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/termbits.ph", "type": "file" }, { - "bom-ref": "422b014c708222ee", + "bom-ref": "aa448ee1a2dddcc6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/termios.ph", "type": "file" }, { - "bom-ref": "8aeddfb40f31ba6a", + "bom-ref": "64c4d9cf9177499e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/unistd.ph", "type": "file" }, { - "bom-ref": "767e59145a194e6a", + "bom-ref": "f8643eeae0b78bd6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/unistd_32.ph", "type": "file" }, { - "bom-ref": "adab9c85c37ff7ca", + "bom-ref": "5e91a244232d17e6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/unistd_64.ph", "type": "file" }, { - "bom-ref": "200edb0dd4021743", + "bom-ref": "dacf457ed35d868b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/unistd_x32.ph", "type": "file" }, { - "bom-ref": "bde04d1db42e71e2", + "bom-ref": "5c529b3e1d2f113e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/attributes.pm", "type": "file" }, { - "bom-ref": "f4f17a0cfb88d7f9", + "bom-ref": "1a7f00fa2211005d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/B/B.so", "type": "file" }, { - "bom-ref": "8b015cc3df198059", + "bom-ref": "72219765e901a1c1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Compress/Raw/Bzip2/Bzip2.so", "type": "file" }, { - "bom-ref": "2cb1b0301bb2d9bb", + "bom-ref": "4bcf976e5a8a6e33", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Compress/Raw/Zlib/Zlib.so", "type": "file" }, { - "bom-ref": "001274ac639d415b", + "bom-ref": "dcde8330b62a8163", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Cwd/Cwd.so", "type": "file" }, { - "bom-ref": "08c2c4ac7c5944aa", + "bom-ref": "230af106cb79914e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/DB_File/DB_File.so", "type": "file" }, { - "bom-ref": "92f50cc82908006d", + "bom-ref": "51a3add819862779", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Data/Dumper/Dumper.so", "type": "file" }, { - "bom-ref": "6965cae35a1607fa", + "bom-ref": "9a68c23587b3b33e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Devel/Peek/Peek.so", "type": "file" }, { - "bom-ref": "6ecc2ca133936f4c", + "bom-ref": "7d691a416cf66364", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Digest/MD5/MD5.so", "type": "file" }, { - "bom-ref": "49325d5be14b1f67", + "bom-ref": "815dbb175c8c3f87", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Digest/SHA/SHA.so", "type": "file" }, { - "bom-ref": "d502ff1403c52576", + "bom-ref": "341939371d16dfd6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/Byte/Byte.so", "type": "file" }, { - "bom-ref": "6b3652d3d4194383", + "bom-ref": "98f1383fb3821847", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/CN/CN.so", "type": "file" }, { - "bom-ref": "1c816ee6c9113e02", + "bom-ref": "2e7261901f5cc232", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/EBCDIC/EBCDIC.so", "type": "file" }, { - "bom-ref": "6a11a1ad368792b6", + "bom-ref": "414b6de74cf0b2de", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/Encode.so", "type": "file" }, { - "bom-ref": "6f3669802c91d0a3", + "bom-ref": "b0ab9926529da033", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/JP/JP.so", "type": "file" }, { - "bom-ref": "4886beb93f4e9e13", + "bom-ref": "f86e7cff4b501c77", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/KR/KR.so", "type": "file" }, { - "bom-ref": "eac38ce76890a8f9", + "bom-ref": "5b8ecbbd001ce191", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/Symbol/Symbol.so", "type": "file" }, { - "bom-ref": "42a3cf7a66bb7b5b", + "bom-ref": "02a2ad1000483fe3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/TW/TW.so", "type": "file" }, { - "bom-ref": "ef97a263c91aadf6", + "bom-ref": "5b1b3722450d3132", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/Unicode/Unicode.so", "type": "file" }, { - "bom-ref": "0d3c854a19be7548", + "bom-ref": "7bbf05f3381c9048", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Fcntl/Fcntl.so", "type": "file" }, { - "bom-ref": "8169cb4606bb0b88", + "bom-ref": "527a8f84e7441730", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/File/DosGlob/DosGlob.so", "type": "file" }, { - "bom-ref": "f050cc7992fc8911", + "bom-ref": "e25f2b19aa804b55", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/File/Glob/Glob.so", "type": "file" }, { - "bom-ref": "8daf7a2684e138e1", + "bom-ref": "f714745950a9fbb5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Filter/Util/Call/Call.so", "type": "file" }, { - "bom-ref": "a37ccd2ace703f48", + "bom-ref": "c3f6750911e228c8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/GDBM_File/GDBM_File.so", "type": "file" }, { - "bom-ref": "25eac4d14baa4410", + "bom-ref": "13bb89370536f574", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Hash/Util/FieldHash/FieldHash.so", "type": "file" }, { - "bom-ref": "6593d7136ac98fc4", + "bom-ref": "69cfa29d3383ca50", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Hash/Util/Util.so", "type": "file" }, { - "bom-ref": "f772548c4a1895cd", + "bom-ref": "e1ae0406b7a893c5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/I18N/Langinfo/Langinfo.so", "type": "file" }, { - "bom-ref": "7e9606ea36f5e5f9", + "bom-ref": "e4951afc814deb91", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/IO/IO.so", "type": "file" }, { - "bom-ref": "ced132529143d790", + "bom-ref": "9c3cd7467c982444", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/IPC/SysV/SysV.so", "type": "file" }, { - "bom-ref": "4c7f26b40606d654", + "bom-ref": "e611ef0e6fda7d54", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/List/Util/Util.so", "type": "file" }, { - "bom-ref": "dbfc1997d0ac20b3", + "bom-ref": "ee35c94fd75baa5f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/MIME/Base64/Base64.so", "type": "file" }, { - "bom-ref": "cf01bb0edbfcb028", + "bom-ref": "5d62d29d3ea3c178", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Math/BigInt/FastCalc/FastCalc.so", "type": "file" }, { - "bom-ref": "a2630c9c2f70ca17", + "bom-ref": "6f60f9cdf8363633", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/NDBM_File/NDBM_File.so", "type": "file" }, { - "bom-ref": "0335c899de7ed287", + "bom-ref": "794a202ba4423b7f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/ODBM_File/ODBM_File.so", "type": "file" }, { - "bom-ref": "6d7cb5f611c8cadb", + "bom-ref": "9f8bbcc7096df037", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Opcode/Opcode.so", "type": "file" }, { - "bom-ref": "c4343a63533a3c56", + "bom-ref": "8414382991d0ebf2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/POSIX/POSIX.so", "type": "file" }, { - "bom-ref": "a7ab59a551799c80", + "bom-ref": "d53ae6ee922a6290", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/PerlIO/encoding/encoding.so", "type": "file" }, { - "bom-ref": "9d0ca62fa76ca667", + "bom-ref": "fda176135a1e5893", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/PerlIO/mmap/mmap.so", "type": "file" }, { - "bom-ref": "34ebcc7df7a974a8", + "bom-ref": "49301db304c407b4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/PerlIO/scalar/scalar.so", "type": "file" }, { - "bom-ref": "341a1c804fcb927b", + "bom-ref": "8559b9d12c7867bb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/PerlIO/via/via.so", "type": "file" }, { - "bom-ref": "965335e723632b7b", + "bom-ref": "00be69ce46f526f3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/SDBM_File/SDBM_File.so", "type": "file" }, { - "bom-ref": "028bb40a876059b6", + "bom-ref": "951898563823ed5e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Socket/Socket.so", "type": "file" }, { - "bom-ref": "c30a320ab1b31ea6", + "bom-ref": "d6829fbfa398d4ca", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Storable/Storable.so", "type": "file" }, { - "bom-ref": "5926053a07ad6320", + "bom-ref": "93e70b4707a9fe60", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Sys/Hostname/Hostname.so", "type": "file" }, { - "bom-ref": "abd3b873bba88607", + "bom-ref": "6306e175b2790abf", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Sys/Syslog/Syslog.so", "type": "file" }, { - "bom-ref": "3a7d1522eff6323a", + "bom-ref": "1569382ff1c45512", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Time/HiRes/HiRes.so", "type": "file" }, { - "bom-ref": "2b27807407100e49", + "bom-ref": "d37d69070094ea05", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Time/Piece/Piece.so", "type": "file" }, { - "bom-ref": "9ddc940f1d5a9f1a", + "bom-ref": "945694eceaa55912", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Unicode/Collate/Collate.so", "type": "file" }, { - "bom-ref": "644e689d2a871f12", + "bom-ref": "e752f217ddc0ce0e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Unicode/Normalize/Normalize.so", "type": "file" }, { - "bom-ref": "f07c7621b598994d", + "bom-ref": "4bf3b1662b11ca49", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/attributes/attributes.so", "type": "file" }, { - "bom-ref": "c971835034b07d42", + "bom-ref": "8b6cac8cbe39ce52", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/mro/mro.so", "type": "file" }, { - "bom-ref": "b758fb7a859acaa0", + "bom-ref": "84bfb4974502c760", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/re/re.so", "type": "file" }, { - "bom-ref": "f42c8ca6df22762f", + "bom-ref": "6d7e9141c9eb10e3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/threads/shared/shared.so", "type": "file" }, { - "bom-ref": "7ac6496f5e415c44", + "bom-ref": "dc3804fe368bf99c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/threads/threads.so", "type": "file" }, { - "bom-ref": "836f77363b285b32", + "bom-ref": "968f068d7b07063a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/atomic_wide_counter.ph", "type": "file" }, { - "bom-ref": "9d52b0308a013bcd", + "bom-ref": "927cd7843655d86d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/byteswap.ph", "type": "file" }, { - "bom-ref": "02a1b261676f230b", + "bom-ref": "d0f499024227a87b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/confname.ph", "type": "file" }, { - "bom-ref": "47e5f6f75555a043", + "bom-ref": "6ac0eb5339291fbf", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/endian.ph", "type": "file" }, { - "bom-ref": "bc96ce59931ad75d", + "bom-ref": "6b2efabf19401dd1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/endianness.ph", "type": "file" }, { - "bom-ref": "6979fe991f4cc774", + "bom-ref": "584a8863631551ec", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/environments.ph", "type": "file" }, { - "bom-ref": "73e40cba7d810505", + "bom-ref": "9cd16aa6c66c00c5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/floatn-common.ph", "type": "file" }, { - "bom-ref": "8fb46cc89861848c", + "bom-ref": "9b7ea662406e37c4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/floatn.ph", "type": "file" }, { - "bom-ref": "2a1e9b1d2f430638", + "bom-ref": "1dda03cd7bc62bf8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/getopt_core.ph", "type": "file" }, { - "bom-ref": "64006c4845554db7", + "bom-ref": "c6f06bdb8bff0637", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/getopt_posix.ph", "type": "file" }, { - "bom-ref": "f1614c0548749442", + "bom-ref": "65b1b34a28a337ee", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/ioctl-types.ph", "type": "file" }, { - "bom-ref": "48751224b245386a", + "bom-ref": "4d6d624ab4dcde2e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/ioctls.ph", "type": "file" }, { - "bom-ref": "26528e10b8879876", + "bom-ref": "83feaf777e1ba972", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/long-double.ph", "type": "file" }, { - "bom-ref": "08dcd937dde1c562", + "bom-ref": "001e933a3ad1ffca", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/posix_opt.ph", "type": "file" }, { - "bom-ref": "ea500f522cb12e68", + "bom-ref": "c9469b28b3c963c4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/pthreadtypes-arch.ph", "type": "file" }, { - "bom-ref": "03eb10c8a7dd621e", + "bom-ref": "3c12d7b65ca69c3e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/pthreadtypes.ph", "type": "file" }, { - "bom-ref": "9b40e826ae4dee7a", + "bom-ref": "9bd35bef30d0baf6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/select-decl.ph", "type": "file" }, { - "bom-ref": "7b190a0928854723", + "bom-ref": "ee7b6906078ce29f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/select.ph", "type": "file" }, { - "bom-ref": "d4201f80eb6cca26", + "bom-ref": "7763002e69555e4e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/select2.ph", "type": "file" }, { - "bom-ref": "091e5a7d4649674c", + "bom-ref": "43c5c2e3f6dfe80c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigaction.ph", "type": "file" }, { - "bom-ref": "8fd6d6d9cdd45b5c", + "bom-ref": "746d3221ce799f38", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigcontext.ph", "type": "file" }, { - "bom-ref": "3267379a7c5d4c77", + "bom-ref": "54a337202fc72d87", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigevent-consts.ph", "type": "file" }, { - "bom-ref": "b89375b5332c9a0c", + "bom-ref": "5849b276244eda6c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/siginfo-arch.ph", "type": "file" }, { - "bom-ref": "da60c2426dea8d27", + "bom-ref": "5c79a73f0959738b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/siginfo-consts-arch.ph", "type": "file" }, { - "bom-ref": "6f934369b694b729", + "bom-ref": "702df73297f2b4c9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/siginfo-consts.ph", "type": "file" }, { - "bom-ref": "841e44d43d388ec3", + "bom-ref": "201fe3d247d413ff", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/signal_ext.ph", "type": "file" }, { - "bom-ref": "03eadfbf4d06a7f7", + "bom-ref": "182c0de15799e2e7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/signum-arch.ph", "type": "file" }, { - "bom-ref": "efec0ded1d771d1b", + "bom-ref": "55648a6b296a93af", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/signum-generic.ph", "type": "file" }, { - "bom-ref": "cd6ea92953e5e2e3", + "bom-ref": "5e2cbc58d9e96e8b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigstack.ph", "type": "file" }, { - "bom-ref": "325945243d053887", + "bom-ref": "dfdff7bf46c8316f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigstksz.ph", "type": "file" }, { - "bom-ref": "bba790d6b4f80f1a", + "bom-ref": "dedf45fb3f342a9e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigthread.ph", "type": "file" }, { - "bom-ref": "442dd5b7da2bc866", + "bom-ref": "2372e30839dab09a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sockaddr.ph", "type": "file" }, { - "bom-ref": "a562da426123ff16", + "bom-ref": "769288f1590dc0a2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/socket-constants.ph", "type": "file" }, { - "bom-ref": "5aba13ee0e61df4d", + "bom-ref": "2d521d10e8b3c5f9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/socket.ph", "type": "file" }, { - "bom-ref": "9a30f6f6f177fd7c", + "bom-ref": "c2dd18fbcb20c658", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/socket2.ph", "type": "file" }, { - "bom-ref": "af77050eb9d6fd1d", + "bom-ref": "97b8e7eea95bc855", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/socket_type.ph", "type": "file" }, { - "bom-ref": "024268163ffeceb0", + "bom-ref": "ab211811f34f5210", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/ss_flags.ph", "type": "file" }, { - "bom-ref": "e75058a86f6ee8e0", + "bom-ref": "cfdd4a0211a818c0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/stdint-intn.ph", "type": "file" }, { - "bom-ref": "3536f83dc9ced562", + "bom-ref": "4054b6411000eb4a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/struct_mutex.ph", "type": "file" }, { - "bom-ref": "e171912c592740ad", + "bom-ref": "d0b151d6ea661331", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/struct_rwlock.ph", "type": "file" }, { - "bom-ref": "e5dbb7b7c93c4021", + "bom-ref": "a8100a3a96331b05", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/syscall.ph", "type": "file" }, { - "bom-ref": "4f5f40c48a83e52c", + "bom-ref": "bc4d5869203ba98c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/syslog-decl.ph", "type": "file" }, { - "bom-ref": "68ec96d2ae4b06bc", + "bom-ref": "cf78e01a3faf230c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/syslog-ldbl.ph", "type": "file" }, { - "bom-ref": "75658dfa451f6497", + "bom-ref": "0755dcec77108bc7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/syslog-path.ph", "type": "file" }, { - "bom-ref": "1ca67a75be631e22", + "bom-ref": "b229e96245feec0a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/syslog.ph", "type": "file" }, { - "bom-ref": "50c648d7ea25ab7e", + "bom-ref": "ca1594975080cdee", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/thread-shared-types.ph", "type": "file" }, { - "bom-ref": "f98a1534ade16fb1", + "bom-ref": "93c91467c2fd74a9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/time64.ph", "type": "file" }, { - "bom-ref": "c8f3d13d905c57fd", + "bom-ref": "54d88b21da1550a5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/timesize.ph", "type": "file" }, { - "bom-ref": "56133387637608fb", + "bom-ref": "f5ef5489d4af6de7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types.ph", "type": "file" }, { - "bom-ref": "d9beb4a5f02cc511", + "bom-ref": "7270b198c85d76d1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/__sigset_t.ph", "type": "file" }, { - "bom-ref": "9ccd67c90c11d6e0", + "bom-ref": "3b626da85106d968", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/__sigval_t.ph", "type": "file" }, { - "bom-ref": "69bd63cfd1cc902a", + "bom-ref": "749eb7dda7dc733e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/clock_t.ph", "type": "file" }, { - "bom-ref": "5aeb1e580f9f0b02", + "bom-ref": "79bb948be64f8a5e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/clockid_t.ph", "type": "file" }, { - "bom-ref": "745575f650395e7d", + "bom-ref": "bcd6802adb4e6be1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/idtype_t.ph", "type": "file" }, { - "bom-ref": "97ca649ee1f98855", + "bom-ref": "44ae2141d7cc2541", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/sig_atomic_t.ph", "type": "file" }, { - "bom-ref": "593037f88e952744", + "bom-ref": "4146bbef69e12df4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/sigevent_t.ph", "type": "file" }, { - "bom-ref": "563b8a2443d6bd5a", + "bom-ref": "435a368d7d58d062", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/siginfo_t.ph", "type": "file" }, { - "bom-ref": "9342270327ae6c9a", + "bom-ref": "fb6927ef2252723e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/sigset_t.ph", "type": "file" }, { - "bom-ref": "c6d51ec8d707131e", + "bom-ref": "822b2754158f3ffe", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/sigval_t.ph", "type": "file" }, { - "bom-ref": "0242e88cc8f3ede8", + "bom-ref": "2f782980c6464b68", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/stack_t.ph", "type": "file" }, { - "bom-ref": "696d0c35b74690a9", + "bom-ref": "532a9759ad8af8a5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_iovec.ph", "type": "file" }, { - "bom-ref": "eca7e8dfbf80fe8f", + "bom-ref": "60eb7996efe436e7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_osockaddr.ph", "type": "file" }, { - "bom-ref": "d87e122872c46531", + "bom-ref": "63e4ff3c4ae1f6a1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_rusage.ph", "type": "file" }, { - "bom-ref": "48cf1c6e5411e896", + "bom-ref": "6cb31a1a996455f2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_sigstack.ph", "type": "file" }, { - "bom-ref": "e1ad0a7228c543f4", + "bom-ref": "dcedc8bbd7acd8d4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_timespec.ph", "type": "file" }, { - "bom-ref": "002ff164bff52bff", + "bom-ref": "fc252773524a933f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_timeval.ph", "type": "file" }, { - "bom-ref": "7905ae176851e508", + "bom-ref": "acaf7e84ca8463e0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/time_t.ph", "type": "file" }, { - "bom-ref": "0311549993e1c0fd", + "bom-ref": "02181e558e73a105", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/timer_t.ph", "type": "file" }, { - "bom-ref": "af8a0ff3bbbab262", + "bom-ref": "80fa322f79f5b0a6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/typesizes.ph", "type": "file" }, { - "bom-ref": "114ef78f8ff6cb64", + "bom-ref": "9ec45e035ac09bfc", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/uintn-identity.ph", "type": "file" }, { - "bom-ref": "95d1f849bdafe541", + "bom-ref": "3c16a9aac4f9f531", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/unistd-decl.ph", "type": "file" }, { - "bom-ref": "28b5f6a9af5df3cd", + "bom-ref": "72b2a556a9631bb1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/unistd.ph", "type": "file" }, { - "bom-ref": "bedfef27d14d5ce2", + "bom-ref": "983c621628bcd526", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/unistd_ext.ph", "type": "file" }, { - "bom-ref": "facc5fc232ff7204", + "bom-ref": "af580b4bbde28670", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/waitflags.ph", "type": "file" }, { - "bom-ref": "26718ceea46acd79", + "bom-ref": "e7e8f53725067301", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/waitstatus.ph", "type": "file" }, { - "bom-ref": "7ebc61131abc1d8a", + "bom-ref": "1df508c238840492", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/wordsize.ph", "type": "file" }, { - "bom-ref": "ec47ec484bc6817f", + "bom-ref": "570d05b503b4c70f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/encoding.pm", "type": "file" }, { - "bom-ref": "395b15d13b88341b", + "bom-ref": "4bd41318b01d68ef", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/endian.ph", "type": "file" }, { - "bom-ref": "e8c257e52c56cf8a", + "bom-ref": "7ade5226c2571932", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/errno.ph", "type": "file" }, { - "bom-ref": "c676fbc505cba638", + "bom-ref": "9dbead788039f390", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/features-time64.ph", "type": "file" }, { - "bom-ref": "7a77932a573e0ab2", + "bom-ref": "bd4b9187a197afe6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/features.ph", "type": "file" }, { - "bom-ref": "7d56b0f340d3a9f8", + "bom-ref": "b7fb33b508503e08", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/gnu/stubs-64.ph", "type": "file" }, { - "bom-ref": "b6d0a8fd2e095236", + "bom-ref": "6bb12f7b797b9102", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/gnu/stubs.ph", "type": "file" }, { - "bom-ref": "0291e9bda7dda2e0", + "bom-ref": "c9d4a6b41b8d9dd0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/lib.pm", "type": "file" }, { - "bom-ref": "863bca60be89b8a9", + "bom-ref": "70a501513c685c61", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/linux/ioctl.ph", "type": "file" }, { - "bom-ref": "2571342c655239b7", + "bom-ref": "8be19f05a29f57e7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/linux/posix_types.ph", "type": "file" }, { - "bom-ref": "a884f757d951785d", + "bom-ref": "014a86e360192b29", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/linux/stddef.ph", "type": "file" }, { - "bom-ref": "a5da9fd4289697bf", + "bom-ref": "e3f82514700f1b2f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/mro.pm", "type": "file" }, { - "bom-ref": "181de30c935848e7", + "bom-ref": "554ccf5a543c33e7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/ops.pm", "type": "file" }, { - "bom-ref": "8a8051e7d8763f65", + "bom-ref": "b14f45d07ba3778d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/re.pm", "type": "file" }, { - "bom-ref": "f853b62768cf32f1", + "bom-ref": "d7cb207ffacc67d5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/signal.ph", "type": "file" }, { - "bom-ref": "2353cef9ec86fca0", + "bom-ref": "94c550e59d4a3a38", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/stdarg.ph", "type": "file" }, { - "bom-ref": "3053d45d760eef3a", + "bom-ref": "d461058b4e6ce3b2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/stdc-predef.ph", "type": "file" }, { - "bom-ref": "2596adbea77c6899", + "bom-ref": "e0104e833da54fcd", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/stddef.ph", "type": "file" }, { - "bom-ref": "b2bda7e4a6bd121f", + "bom-ref": "ccbc8e5da24a08fb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/cdefs.ph", "type": "file" }, { - "bom-ref": "7404e8be8cae0872", + "bom-ref": "8e42a96904cf83e6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/ioctl.ph", "type": "file" }, { - "bom-ref": "1a2fb25d11d48f0e", + "bom-ref": "e152bc9134ea4e8a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/select.ph", "type": "file" }, { - "bom-ref": "636262332efb50ec", + "bom-ref": "eabfb91e8f16ec34", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/socket.ph", "type": "file" }, { - "bom-ref": "21f388e334cf2b0c", + "bom-ref": "663cdb483d2200d0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/syscall.ph", "type": "file" }, { - "bom-ref": "85b45de8fcc42979", + "bom-ref": "4d3872da0e74433d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/syslog.ph", "type": "file" }, { - "bom-ref": "b99ac181efbaa825", + "bom-ref": "70503884036b0e9d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/time.ph", "type": "file" }, { - "bom-ref": "f43bfd6a4f2f1ced", + "bom-ref": "010af272e04c81f1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/ttydefaults.ph", "type": "file" }, { - "bom-ref": "69e5dce665d6c89c", + "bom-ref": "bd2cd8a274aa687c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/types.ph", "type": "file" }, { - "bom-ref": "e363dfa0419b5cea", + "bom-ref": "503d79ef6684b0de", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/ucontext.ph", "type": "file" }, { - "bom-ref": "694172fb33d33eaf", + "bom-ref": "7aa3e18af789483b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/wait.ph", "type": "file" }, { - "bom-ref": "f65a8088c735a948", + "bom-ref": "a8fda29495646678", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/syscall.ph", "type": "file" }, { - "bom-ref": "a283168da1b19d68", + "bom-ref": "b925a39ca4d64c44", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sysexits.ph", "type": "file" }, { - "bom-ref": "cc643821dcccdc00", + "bom-ref": "d21b316274ec27d0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/syslimits.ph", "type": "file" }, { - "bom-ref": "0c8d8fa3e913f54a", + "bom-ref": "b0e9ec93dd80b486", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/syslog.ph", "type": "file" }, { - "bom-ref": "b8c7b86dd8623daa", + "bom-ref": "82341ecd7f8a349a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/threads.pm", "type": "file" }, { - "bom-ref": "887fb7d97267f732", + "bom-ref": "38ca1b65ba206bca", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/threads/shared.pm", "type": "file" }, { - "bom-ref": "367eede1c5c88f5b", + "bom-ref": "a4729d2ff2fa8adf", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/unistd.ph", "type": "file" }, { - "bom-ref": "91b122050993898d", + "bom-ref": "c284ba8992fcd6f9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/wait.ph", "type": "file" }, { - "bom-ref": "0cf5f11021e0f5c0", + "bom-ref": "91d6c4fee80f5894", "name": "/usr/lib/x86_64-linux-gnu/perl/debian-config-data-5.38.2/README", "type": "file" }, { - "bom-ref": "684d48c5aa967aa4", + "bom-ref": "d0adc3fae9922858", "name": "/usr/lib/x86_64-linux-gnu/perl/debian-config-data-5.38.2/config.sh.debug.gz", "type": "file" }, { - "bom-ref": "92a0120712ea1e42", + "bom-ref": "264b7b7b73260306", "name": "/usr/lib/x86_64-linux-gnu/perl/debian-config-data-5.38.2/config.sh.shared.gz", "type": "file" }, { - "bom-ref": "f157bc133bba7016", + "bom-ref": "48bfac5eaadf9aa6", "name": "/usr/lib/x86_64-linux-gnu/perl/debian-config-data-5.38.2/config.sh.static.gz", "type": "file" }, { - "bom-ref": "9736151252d3d58a", + "bom-ref": "871cfdf4389f899e", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/expat.pc", "type": "file" }, { - "bom-ref": "40a2b2e3123afecb", + "bom-ref": "8d8d609dbc4c1948", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/level-zero.pc", "type": "file" }, { - "bom-ref": "61b761d6c2eec7c4", + "bom-ref": "86667acaa54f5b7c", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libxcrypt.pc", "type": "file" }, { - "bom-ref": "c1bbb66eece1c6df", + "bom-ref": "f9e967b7e88271ac", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libze_loader.pc", "type": "file" }, { - "bom-ref": "d13583e387973948", + "bom-ref": "5be659045ddc8bbc", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/python-3.12-embed.pc", "type": "file" }, { - "bom-ref": "505bdd3471c55c4e", + "bom-ref": "36c3215499994dee", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/python-3.12.pc", "type": "file" }, { - "bom-ref": "8cd0c7ef314a05ad", + "bom-ref": "143f0e43f0359319", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/zlib.pc", "type": "file" }, { - "bom-ref": "50114f2b59935fe9", + "bom-ref": "5de4e7df074a66b9", "name": "/usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-16.1.so", "type": "file" }, { - "bom-ref": "ce3c1513ff054c49", + "bom-ref": "4b75cca99c1fa6ed", "name": "/usr/lib/x86_64-linux-gnu/rcrt1.o", "type": "file" }, { - "bom-ref": "3cbff87678f15530", + "bom-ref": "f4f6562f7f38ab98", "name": "/usr/lib/x86_64-linux-gnu/rsocket/librspreload.so", "type": "file" }, { - "bom-ref": "4642889836c023b9", + "bom-ref": "41ed1736bfba32cd", "name": "/usr/lib/x86_64-linux-gnu/sasl2/libsasldb.so.2.0.25", "type": "file" }, { - "bom-ref": "5844de10c8095280", + "bom-ref": "9d7d14b98f2caaa2", "name": "/usr/lib/x86_64-linux-gnu/security/pam_access.so", "type": "file" }, { - "bom-ref": "9e521cbeb5a3c98b", + "bom-ref": "e6584e49cf0cbf19", "name": "/usr/lib/x86_64-linux-gnu/security/pam_debug.so", "type": "file" }, { - "bom-ref": "f962a96974e14a27", + "bom-ref": "be4bb0b2efb458bd", "name": "/usr/lib/x86_64-linux-gnu/security/pam_deny.so", "type": "file" }, { - "bom-ref": "b3ff12a47da56b41", + "bom-ref": "add5f14a1257e707", "name": "/usr/lib/x86_64-linux-gnu/security/pam_echo.so", "type": "file" }, { - "bom-ref": "f630951a9f58fe02", + "bom-ref": "6a3e8a6ba7ad4060", "name": "/usr/lib/x86_64-linux-gnu/security/pam_env.so", "type": "file" }, { - "bom-ref": "a19f4abb037b7bce", + "bom-ref": "e3d34f6a3bf162ec", "name": "/usr/lib/x86_64-linux-gnu/security/pam_exec.so", "type": "file" }, { - "bom-ref": "819b280a1087f6a5", + "bom-ref": "6a1aea4017af920b", "name": "/usr/lib/x86_64-linux-gnu/security/pam_extrausers.so", "type": "file" }, { - "bom-ref": "2759789b7b894351", + "bom-ref": "74555fe3f9844063", "name": "/usr/lib/x86_64-linux-gnu/security/pam_faildelay.so", "type": "file" }, { - "bom-ref": "f9abf987fdb4d4fb", + "bom-ref": "5ff061511c8d3415", "name": "/usr/lib/x86_64-linux-gnu/security/pam_faillock.so", "type": "file" }, { - "bom-ref": "ec10e95c28598ef2", + "bom-ref": "803ba0ecd421e698", "name": "/usr/lib/x86_64-linux-gnu/security/pam_filter.so", "type": "file" }, { - "bom-ref": "1412190b9914d678", + "bom-ref": "e15bc02503ae10c2", "name": "/usr/lib/x86_64-linux-gnu/security/pam_ftp.so", "type": "file" }, { - "bom-ref": "5b7ddaa9fedd2627", + "bom-ref": "b8f13da52f0676e1", "name": "/usr/lib/x86_64-linux-gnu/security/pam_group.so", "type": "file" }, { - "bom-ref": "415418aae034f10e", + "bom-ref": "c8a0c1953ab51d94", "name": "/usr/lib/x86_64-linux-gnu/security/pam_issue.so", "type": "file" }, { - "bom-ref": "3a2d7d54c96e25a5", + "bom-ref": "a434a72eef1a116f", "name": "/usr/lib/x86_64-linux-gnu/security/pam_keyinit.so", "type": "file" }, { - "bom-ref": "0a17f650d870cdae", + "bom-ref": "fdd605e79c3d5bdc", "name": "/usr/lib/x86_64-linux-gnu/security/pam_limits.so", "type": "file" }, { - "bom-ref": "29c963bc7eaf2ef0", + "bom-ref": "3517d124d5ba1362", "name": "/usr/lib/x86_64-linux-gnu/security/pam_listfile.so", "type": "file" }, { - "bom-ref": "26e13f03d07efb68", + "bom-ref": "8c4644c78bc84072", "name": "/usr/lib/x86_64-linux-gnu/security/pam_localuser.so", "type": "file" }, { - "bom-ref": "e733717e906d38d8", + "bom-ref": "b37212bd871e4fd2", "name": "/usr/lib/x86_64-linux-gnu/security/pam_loginuid.so", "type": "file" }, { - "bom-ref": "6ab6c1e509759788", + "bom-ref": "dfb2e12c1f8afd7a", "name": "/usr/lib/x86_64-linux-gnu/security/pam_mail.so", "type": "file" }, { - "bom-ref": "cb8c647b97cec5d0", + "bom-ref": "d9c050279051cc4e", "name": "/usr/lib/x86_64-linux-gnu/security/pam_mkhomedir.so", "type": "file" }, { - "bom-ref": "d657be243ba28322", + "bom-ref": "6167961dcbda7940", "name": "/usr/lib/x86_64-linux-gnu/security/pam_motd.so", "type": "file" }, { - "bom-ref": "a3dff9a191194458", + "bom-ref": "00d6dca7034cefde", "name": "/usr/lib/x86_64-linux-gnu/security/pam_namespace.so", "type": "file" }, { - "bom-ref": "1e3e1d1bff049422", + "bom-ref": "322f0c01395a5984", "name": "/usr/lib/x86_64-linux-gnu/security/pam_nologin.so", "type": "file" }, { - "bom-ref": "b53f3364532e4424", + "bom-ref": "b5735a022e790c0e", "name": "/usr/lib/x86_64-linux-gnu/security/pam_permit.so", "type": "file" }, { - "bom-ref": "4d8fcd232bed269b", + "bom-ref": "e72c6626b6c3ff4d", "name": "/usr/lib/x86_64-linux-gnu/security/pam_pwhistory.so", "type": "file" }, { - "bom-ref": "bce1700eb6300aea", + "bom-ref": "441880fef5828fec", "name": "/usr/lib/x86_64-linux-gnu/security/pam_rhosts.so", "type": "file" }, { - "bom-ref": "63a0dbcf96a093d6", + "bom-ref": "357adbafcc94c71c", "name": "/usr/lib/x86_64-linux-gnu/security/pam_rootok.so", "type": "file" }, { - "bom-ref": "c1293113bef7eef3", + "bom-ref": "27fb962624fae559", "name": "/usr/lib/x86_64-linux-gnu/security/pam_securetty.so", "type": "file" }, { - "bom-ref": "46e1d7ec65e1b049", + "bom-ref": "8c44aa6e4101f9bb", "name": "/usr/lib/x86_64-linux-gnu/security/pam_selinux.so", "type": "file" }, { - "bom-ref": "36090fa775c16a78", + "bom-ref": "5b55f09a76e32ebe", "name": "/usr/lib/x86_64-linux-gnu/security/pam_sepermit.so", "type": "file" }, { - "bom-ref": "db226fcfaf9912ea", + "bom-ref": "d27f6506a9454250", "name": "/usr/lib/x86_64-linux-gnu/security/pam_setquota.so", "type": "file" }, { - "bom-ref": "ff8142f9b9ab0046", + "bom-ref": "984283d4833f2b74", "name": "/usr/lib/x86_64-linux-gnu/security/pam_shells.so", "type": "file" }, { - "bom-ref": "5d35f010fc63fe04", + "bom-ref": "45373316afbb6bf6", "name": "/usr/lib/x86_64-linux-gnu/security/pam_stress.so", "type": "file" }, { - "bom-ref": "9a72150b60c64126", + "bom-ref": "c4a21f4e2837c9e4", "name": "/usr/lib/x86_64-linux-gnu/security/pam_succeed_if.so", "type": "file" }, { - "bom-ref": "b910cfc3cd7d800f", + "bom-ref": "bea69893dd3d6bc6", + "name": "/usr/lib/x86_64-linux-gnu/security/pam_systemd.so", + "type": "file" + }, + { + "bom-ref": "66c5fbb8c938f9fa", + "name": "/usr/lib/x86_64-linux-gnu/security/pam_systemd_loadkey.so", + "type": "file" + }, + { + "bom-ref": "cb6f2b4335db5809", "name": "/usr/lib/x86_64-linux-gnu/security/pam_time.so", "type": "file" }, { - "bom-ref": "adc0414b68073168", + "bom-ref": "9c8176241eed44fa", "name": "/usr/lib/x86_64-linux-gnu/security/pam_timestamp.so", "type": "file" }, { - "bom-ref": "701e82614da10d2b", + "bom-ref": "3bf18d0f971db539", "name": "/usr/lib/x86_64-linux-gnu/security/pam_tty_audit.so", "type": "file" }, { - "bom-ref": "72553be6c7d3498f", + "bom-ref": "17a9f9342514a9f9", "name": "/usr/lib/x86_64-linux-gnu/security/pam_umask.so", "type": "file" }, { - "bom-ref": "fab247d568f888bc", + "bom-ref": "70f12d022fbafb7a", "name": "/usr/lib/x86_64-linux-gnu/security/pam_unix.so", "type": "file" }, { - "bom-ref": "0ceca96eda7e2c74", + "bom-ref": "06209dd0862fb972", "name": "/usr/lib/x86_64-linux-gnu/security/pam_userdb.so", "type": "file" }, { - "bom-ref": "66bb9ee5e4a7acb2", + "bom-ref": "70b1fc1da9e78fb8", "name": "/usr/lib/x86_64-linux-gnu/security/pam_usertype.so", "type": "file" }, { - "bom-ref": "86aff63cb03d8e00", + "bom-ref": "37dacd6d62d3a48e", "name": "/usr/lib/x86_64-linux-gnu/security/pam_warn.so", "type": "file" }, { - "bom-ref": "df99447edd9a6d7b", + "bom-ref": "aa56699199ad4ad1", "name": "/usr/lib/x86_64-linux-gnu/security/pam_wheel.so", "type": "file" }, { - "bom-ref": "50e628294e4ed543", + "bom-ref": "71b369a68bc652e5", "name": "/usr/lib/x86_64-linux-gnu/security/pam_xauth.so", "type": "file" }, { - "bom-ref": "2c27303173d26467", + "bom-ref": "56e8a5b7e41fd761", "name": "/usr/lib/x86_64-linux-gnu/systemd/libsystemd-core-255.so", "type": "file" }, { - "bom-ref": "3b0602e39eb788a2", + "bom-ref": "4a893cc73c70fea0", "name": "/usr/lib/x86_64-linux-gnu/systemd/libsystemd-shared-255.so", "type": "file" }, { - "bom-ref": "0432d318863e25ba", + "bom-ref": "c43bbd462094b7c6", "name": "/usr/lib/x86_64-linux-gnu/vdpau/libvdpau_trace.so.1.0.0", "type": "file" }, { - "bom-ref": "2b98e148efd5f34d", + "bom-ref": "726231e38bc87f11", "name": "/usr/lib/x86_64-linux-gnu/vpl/libvpl_wayland.so", "type": "file" }, { - "bom-ref": "085f8aa4aa9bd8a7", + "bom-ref": "03bcafbb1592a78d", "name": "/usr/libexec/coreutils/libstdbuf.so", "type": "file" }, { - "bom-ref": "cacc9cc4afa8da85", + "bom-ref": "30ca7ba0f6d948ef", "name": "/usr/libexec/dpkg/dpkg-db-backup", "type": "file" }, { - "bom-ref": "40b184b04c217822", + "bom-ref": "01d16bd73e428ae0", "name": "/usr/libexec/dpkg/dpkg-db-keeper", "type": "file" }, { - "bom-ref": "8efed8123a410b2b", + "bom-ref": "df473f95a615c8ff", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/cc1", "type": "file" }, { - "bom-ref": "568ecb4806c40a62", + "bom-ref": "32bf05a365d21c16", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus", "type": "file" }, { - "bom-ref": "6167dc4eead1233b", + "bom-ref": "85abff93be30c1eb", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/collect2", "type": "file" }, { - "bom-ref": "fef1486f51ef5987", + "bom-ref": "0d0cc9631a974807", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/g++-mapper-server", "type": "file" }, { - "bom-ref": "13a9048682ee3abc", + "bom-ref": "52ff36fd65d47f64", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so", "type": "file" }, { - "bom-ref": "c372954498fb02b1", + "bom-ref": "6023ef6c9db9dd29", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper", "type": "file" }, { - "bom-ref": "75225bb17192ba98", + "bom-ref": "58a19256e31aeef0", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/lto1", "type": "file" }, { - "bom-ref": "49dfff2e0636b677", + "bom-ref": "341b57d1561e4e1e", + "name": "/usr/libexec/packagekit-direct", + "type": "file" + }, + { + "bom-ref": "d7ff6fd6877901fa", + "name": "/usr/libexec/packagekitd", + "type": "file" + }, + { + "bom-ref": "1001c22527b392fa", + "name": "/usr/libexec/pk-debconf-helper", + "type": "file" + }, + { + "bom-ref": "960f37a24eec9f4b", + "name": "/usr/libexec/pk-offline-update", + "type": "file" + }, + { + "bom-ref": "9d0b2cf0b17d1e9c", "name": "/usr/local/lib/igc2/NOTICES.txt", "type": "file" }, { - "bom-ref": "a6a40747887d464f", - "name": "/usr/local/lib/libiga64.so.2.34.4+1778234987", + "bom-ref": "1721f96d92aca0ef", + "name": "/usr/local/lib/libiga64.so.2.38.2+1782393643", "type": "file" }, { - "bom-ref": "f147950283fd1cbd", - "name": "/usr/local/lib/libigc.so.2.34.4+1778234987", + "bom-ref": "b58c0fbb6725fad4", + "name": "/usr/local/lib/libigc.so.2.38.2+1782393643", "type": "file" }, { - "bom-ref": "5397783636630d17", - "name": "/usr/local/lib/libigdfcl.so.2.34.4+1778234987", + "bom-ref": "0bb65981d2370996", + "name": "/usr/local/lib/libigdfcl.so.2.38.2+1782393643", "type": "file" }, { - "bom-ref": "68829b6f145da8e9", - "name": "/usr/local/lib/libopencl-clang2.so.16", + "bom-ref": "0b659449d28632cc", + "name": "/usr/local/lib/libopencl-clang2.so.17", "type": "file" }, { - "bom-ref": "be95eb151052af5d", + "bom-ref": "ff1bfe0f360d3527", "name": "/usr/sbin/add-shell", "type": "file" }, { - "bom-ref": "b6652ae0846e89eb", + "bom-ref": "35e9c126cce4a289", "name": "/usr/sbin/adduser", "type": "file" }, { - "bom-ref": "89de58d20c2942c8", + "bom-ref": "683f13329962a9c8", "name": "/usr/sbin/agetty", "type": "file" }, { - "bom-ref": "a32e9a915b5e9cb7", + "bom-ref": "74d95c4f328df735", "name": "/usr/sbin/badblocks", "type": "file" }, { - "bom-ref": "864bdd208919251b", + "bom-ref": "9d440bf6040ceaef", "name": "/usr/sbin/blkdiscard", "type": "file" }, { - "bom-ref": "ac1fb462f4bd2695", + "bom-ref": "2fd0d62150195c31", "name": "/usr/sbin/blkid", "type": "file" }, { - "bom-ref": "3b3443437635a2e2", + "bom-ref": "b7bdc667ebde349e", "name": "/usr/sbin/blkzone", "type": "file" }, { - "bom-ref": "b3c38508660e4c4b", + "bom-ref": "b1a4b39189fb332b", "name": "/usr/sbin/blockdev", "type": "file" }, { - "bom-ref": "604bac0a39cfd573", + "bom-ref": "6a192d6e90206651", + "name": "/usr/sbin/capsh", + "type": "file" + }, + { + "bom-ref": "1a3237e16b736eff", "name": "/usr/sbin/chcpu", "type": "file" }, { - "bom-ref": "f2e28f08316df20b", + "bom-ref": "0b8187199d64ac41", "name": "/usr/sbin/chgpasswd", "type": "file" }, { - "bom-ref": "bd0ac61e49c79bd0", + "bom-ref": "4633d80da2e48778", "name": "/usr/sbin/chmem", "type": "file" }, { - "bom-ref": "0bb2d3dc441465ff", + "bom-ref": "f594983ebb192035", "name": "/usr/sbin/chpasswd", "type": "file" }, { - "bom-ref": "db82a979925eac43", + "bom-ref": "cd20a27acb5c3be9", "name": "/usr/sbin/chroot", "type": "file" }, { - "bom-ref": "f886a54ccc0e767c", + "bom-ref": "8b253513e4cac2fe", "name": "/usr/sbin/cppw", "type": "file" }, { - "bom-ref": "e91c68091e09a428", + "bom-ref": "ba6c1b28d1bd6308", "name": "/usr/sbin/ctrlaltdel", "type": "file" }, { - "bom-ref": "6119fcbe7c4e3996", + "bom-ref": "210cbfb21075f474", "name": "/usr/sbin/debugfs", "type": "file" }, { - "bom-ref": "c9f619745685664b", + "bom-ref": "d53f024a9252076d", "name": "/usr/sbin/deluser", "type": "file" }, { - "bom-ref": "8d14292445f7eb4d", + "bom-ref": "c34a651081376677", "name": "/usr/sbin/dpkg-preconfigure", "type": "file" }, { - "bom-ref": "63811fad26c2b3ab", + "bom-ref": "6ace43814dc9e3d1", "name": "/usr/sbin/dpkg-reconfigure", "type": "file" }, { - "bom-ref": "95340ef7aa87a327", + "bom-ref": "b1473df42a560afd", "name": "/usr/sbin/dumpe2fs", "type": "file" }, { - "bom-ref": "a1263e49ec03a513", + "bom-ref": "05b1009625fc7f9d", "name": "/usr/sbin/e2freefrag", "type": "file" }, { - "bom-ref": "e6303a71f8d75f56", + "bom-ref": "66c2e35133243ce4", "name": "/usr/sbin/e2fsck", "type": "file" }, { - "bom-ref": "798e18d0972fa110", + "bom-ref": "7a237669975bff82", "name": "/usr/sbin/e2image", "type": "file" }, { - "bom-ref": "09afcbfd080abb86", + "bom-ref": "839da6806496dd60", "name": "/usr/sbin/e2scrub", "type": "file" }, { - "bom-ref": "14c602c895995115", + "bom-ref": "6e162a84c51c9d17", "name": "/usr/sbin/e2scrub_all", "type": "file" }, { - "bom-ref": "df2560927f64d86f", + "bom-ref": "01dd225dec942021", "name": "/usr/sbin/e2undo", "type": "file" }, { - "bom-ref": "e3ff47da8d468420", + "bom-ref": "bd9e9ae990a6275e", "name": "/usr/sbin/e4crypt", "type": "file" }, { - "bom-ref": "a39af65b4e599ecc", + "bom-ref": "c6fa74a244d6e65a", "name": "/usr/sbin/e4defrag", "type": "file" }, { - "bom-ref": "39f74586deaff5cc", + "bom-ref": "75f28b0c3c30c782", "name": "/usr/sbin/faillock", "type": "file" }, { - "bom-ref": "72ab0f73c1dbd1d4", + "bom-ref": "6c2156fb7eea6a02", "name": "/usr/sbin/filefrag", "type": "file" }, { - "bom-ref": "d651be3bbe260e48", + "bom-ref": "9ef8f649a997706c", "name": "/usr/sbin/findfs", "type": "file" }, { - "bom-ref": "475f5a65ac132617", + "bom-ref": "05066e3408a94ce3", "name": "/usr/sbin/fsck", "type": "file" }, { - "bom-ref": "40dff303d3c9a305", + "bom-ref": "6a6aa1bc4f32c3a1", "name": "/usr/sbin/fsck.cramfs", "type": "file" }, { - "bom-ref": "0154c7dbbe93424c", + "bom-ref": "7e9a87edd8beae1c", "name": "/usr/sbin/fsck.minix", "type": "file" }, { - "bom-ref": "3daf368b53e8d8bb", + "bom-ref": "2bf674d3449f5fa3", "name": "/usr/sbin/fsfreeze", "type": "file" }, { - "bom-ref": "89bc019b26e37d35", + "bom-ref": "39e169b12c65916b", "name": "/usr/sbin/fstab-decode", "type": "file" }, { - "bom-ref": "a36ac68d2abdb7ae", + "bom-ref": "5e401425fd9807e2", "name": "/usr/sbin/fstrim", "type": "file" }, { - "bom-ref": "c0ff83c61393d595", + "bom-ref": "28b3e774a1e46fba", + "name": "/usr/sbin/getcap", + "type": "file" + }, + { + "bom-ref": "7940d3de7b210940", + "name": "/usr/sbin/getpcaps", + "type": "file" + }, + { + "bom-ref": "4c3e47f100fce38b", "name": "/usr/sbin/groupadd", "type": "file" }, { - "bom-ref": "7ed18c4babda8944", + "bom-ref": "888c84ed5cd32bca", "name": "/usr/sbin/groupdel", "type": "file" }, { - "bom-ref": "f073c99d3762f091", + "bom-ref": "dc6839d0ccdfa787", "name": "/usr/sbin/groupmems", "type": "file" }, { - "bom-ref": "7ce7e2f488432288", + "bom-ref": "e376968f853a00fa", "name": "/usr/sbin/groupmod", "type": "file" }, { - "bom-ref": "ce9b945769141c3c", + "bom-ref": "0130c6f4fa62c872", "name": "/usr/sbin/grpck", "type": "file" }, { - "bom-ref": "4030d76e20452cce", + "bom-ref": "9ef84970c967fb4c", "name": "/usr/sbin/grpconv", "type": "file" }, { - "bom-ref": "e5d543ae6a1a70c2", + "bom-ref": "f203b72ba5adb280", "name": "/usr/sbin/grpunconv", "type": "file" }, { - "bom-ref": "73bceeeed9397c96", + "bom-ref": "5e7f77f1361b0e7c", "name": "/usr/sbin/iconvconfig", "type": "file" }, { - "bom-ref": "d08462bbf88795ac", + "bom-ref": "981dc07e8970dd4c", + "name": "/usr/sbin/install-sgmlcatalog", + "type": "file" + }, + { + "bom-ref": "f12ae71c9e7448ba", "name": "/usr/sbin/installkernel", "type": "file" }, { - "bom-ref": "a92961577dbd60b4", + "bom-ref": "f2715235566b28e2", "name": "/usr/sbin/invoke-rc.d", "type": "file" }, { - "bom-ref": "82681c7bbd800e0b", + "bom-ref": "a23d71e5d2aeae93", "name": "/usr/sbin/isosize", "type": "file" }, { - "bom-ref": "c54bc2d2a2036fbf", + "bom-ref": "d4b16c8a5e66f8b7", "name": "/usr/sbin/iwpmd", "type": "file" }, { - "bom-ref": "bc00872c9b8b1b1b", + "bom-ref": "d74af5db685233cd", "name": "/usr/sbin/killall5", "type": "file" }, { - "bom-ref": "a7c4f0b929e567b1", + "bom-ref": "eeefd2241e1f5689", "name": "/usr/sbin/ldattach", "type": "file" }, { - "bom-ref": "bc8df2badfd30404", + "bom-ref": "b4387c0d7113b98a", "name": "/usr/sbin/ldconfig", "type": "file" }, { - "bom-ref": "e4cd2fbad0f7c51b", + "bom-ref": "1d0f75efea652809", "name": "/usr/sbin/ldconfig.real", "type": "file" }, { - "bom-ref": "40422fb933751605", + "bom-ref": "5b64f31a356e6df3", "name": "/usr/sbin/logsave", "type": "file" }, { - "bom-ref": "5d8ee46115dca002", + "bom-ref": "4b2b416b8aa72322", "name": "/usr/sbin/losetup", "type": "file" }, { - "bom-ref": "86c80426c0de874c", + "bom-ref": "7848a83ec3355242", "name": "/usr/sbin/mke2fs", "type": "file" }, { - "bom-ref": "c1a53af0b0b1eee2", + "bom-ref": "311cd089ed4e76aa", "name": "/usr/sbin/mkfs", "type": "file" }, { - "bom-ref": "6cbe1fd166fff35d", + "bom-ref": "b980ae390c59ed11", "name": "/usr/sbin/mkfs.bfs", "type": "file" }, { - "bom-ref": "0f0ffc8aa73e97dd", + "bom-ref": "998f0043e3d46709", "name": "/usr/sbin/mkfs.cramfs", "type": "file" }, { - "bom-ref": "d5864ec7555aa00a", + "bom-ref": "6001a4529f9de1ae", "name": "/usr/sbin/mkfs.minix", "type": "file" }, { - "bom-ref": "3f4b3c30b74eea24", + "bom-ref": "48e592b5250e4546", "name": "/usr/sbin/mkhomedir_helper", "type": "file" }, { - "bom-ref": "6b9c7af712c60e7b", + "bom-ref": "97e047609bf2462d", "name": "/usr/sbin/mklost+found", "type": "file" }, { - "bom-ref": "aa1305a9c35c5f7b", + "bom-ref": "1e7ab9e6fd7db6ab", "name": "/usr/sbin/mkswap", "type": "file" }, { - "bom-ref": "4e802dd18ae7ecab", + "bom-ref": "a14ad33e94b1c241", "name": "/usr/sbin/newusers", "type": "file" }, { - "bom-ref": "cb9734a80e777868", + "bom-ref": "3fbd76e860e6f362", "name": "/usr/sbin/nologin", "type": "file" }, { - "bom-ref": "df5b6f2f345e1773", + "bom-ref": "1501675b4d71ac85", "name": "/usr/sbin/pam-auth-update", "type": "file" }, { - "bom-ref": "fa3f4614e6bd1dc9", + "bom-ref": "2e729a53569fdd6f", "name": "/usr/sbin/pam_extrausers_chkpwd", "type": "file" }, { - "bom-ref": "b2408d344c6e294c", + "bom-ref": "f45e5e06ea52f3a6", "name": "/usr/sbin/pam_extrausers_update", "type": "file" }, { - "bom-ref": "9f8f90c6df84e814", + "bom-ref": "e32179267c2f015a", "name": "/usr/sbin/pam_getenv", "type": "file" }, { - "bom-ref": "ec064bf66991b5f8", + "bom-ref": "0c28b88408cb8e3a", "name": "/usr/sbin/pam_namespace_helper", "type": "file" }, { - "bom-ref": "06a646f01ba99a60", + "bom-ref": "5d54385bf51a7842", "name": "/usr/sbin/pam_timestamp_check", "type": "file" }, { - "bom-ref": "742f4f3092f80afb", + "bom-ref": "775f8e4ea96ea0d3", "name": "/usr/sbin/pivot_root", "type": "file" }, { - "bom-ref": "b9d7ac4656ca7662", + "bom-ref": "8ace7ce55a2aba4c", "name": "/usr/sbin/pwck", "type": "file" }, { - "bom-ref": "35e211edce4b88c9", + "bom-ref": "890b2a43848c779b", "name": "/usr/sbin/pwconv", "type": "file" }, { - "bom-ref": "e6221cbc3ea4dc20", + "bom-ref": "fb55206925666556", "name": "/usr/sbin/pwhistory_helper", "type": "file" }, { - "bom-ref": "f7c3980fecea14ef", + "bom-ref": "4f7f395f2a34a8e5", "name": "/usr/sbin/pwunconv", "type": "file" }, { - "bom-ref": "b837230e2f5552dd", + "bom-ref": "f4e9e79377daa6dd", "name": "/usr/sbin/rdma-ndd", "type": "file" }, { - "bom-ref": "13d87c291b5a3403", + "bom-ref": "ea7763c7f9edc9d7", "name": "/usr/sbin/readprofile", "type": "file" }, { - "bom-ref": "94d9f6c8e0cb9ff0", + "bom-ref": "481e8159ae995f42", "name": "/usr/sbin/remove-shell", "type": "file" }, { - "bom-ref": "89a1d7ca932a96e6", + "bom-ref": "ccfa3d14298517d4", "name": "/usr/sbin/resize2fs", "type": "file" }, { - "bom-ref": "86537fe4bbae2644", + "bom-ref": "935c2eeb4f0771ae", "name": "/usr/sbin/rmt-tar", "type": "file" }, { - "bom-ref": "2bfe98380da84178", + "bom-ref": "4a77401d9707fa3c", "name": "/usr/sbin/rtcwake", "type": "file" }, { - "bom-ref": "a9e000fd0d57d3e2", + "bom-ref": "be7e83cf3f131d62", "name": "/usr/sbin/runuser", "type": "file" }, { - "bom-ref": "1c4f4fb3de2ab0b7", + "bom-ref": "b8248f2283efd2f5", "name": "/usr/sbin/service", "type": "file" }, { - "bom-ref": "b3e9bad308c4e931", + "bom-ref": "2ee9ef5f3be58c34", + "name": "/usr/sbin/setcap", + "type": "file" + }, + { + "bom-ref": "f90c44c1136847a3", "name": "/usr/sbin/shadowconfig", "type": "file" }, { - "bom-ref": "fcb269b9f73703ba", + "bom-ref": "f972ef4cb50d57e4", "name": "/usr/sbin/start-stop-daemon", "type": "file" }, { - "bom-ref": "b0f1df1845d37e54", + "bom-ref": "63ebd4591b7e4a2c", "name": "/usr/sbin/sulogin", "type": "file" }, { - "bom-ref": "2e63b17a855e22b0", + "bom-ref": "135643ecff603204", "name": "/usr/sbin/swaplabel", "type": "file" }, { - "bom-ref": "7771122686758a66", + "bom-ref": "3f184bbe38680292", "name": "/usr/sbin/swapoff", "type": "file" }, { - "bom-ref": "81c06f9d08499200", + "bom-ref": "aadcbbb1f5118ed4", "name": "/usr/sbin/swapon", "type": "file" }, { - "bom-ref": "bdc151e786e79721", + "bom-ref": "5aa5e2271f98251d", "name": "/usr/sbin/switch_root", "type": "file" }, { - "bom-ref": "27b4971342054cd8", + "bom-ref": "7efe3982da6b4d1a", "name": "/usr/sbin/sysctl", "type": "file" }, { - "bom-ref": "b454318e5023b150", + "bom-ref": "c0090b57e3c4e8ce", "name": "/usr/sbin/tarcat", "type": "file" }, { - "bom-ref": "20811b5d66c481fd", + "bom-ref": "ff56b1b9b6de5a37", "name": "/usr/sbin/tune2fs", "type": "file" }, { - "bom-ref": "1f40af9e5af8bbc3", + "bom-ref": "15cb679c69363e31", "name": "/usr/sbin/unix_chkpwd", "type": "file" }, { - "bom-ref": "61879829e903100b", + "bom-ref": "c48ee4693216b419", "name": "/usr/sbin/unix_update", "type": "file" }, { - "bom-ref": "50c8070c2eb5b130", + "bom-ref": "17d19b4ebe458884", "name": "/usr/sbin/update-ca-certificates", "type": "file" }, { - "bom-ref": "ee133ba973f4ecd0", + "bom-ref": "5ac09adc6a454d45", + "name": "/usr/sbin/update-catalog", + "type": "file" + }, + { + "bom-ref": "0ee66a2845ab75e2", "name": "/usr/sbin/update-passwd", "type": "file" }, { - "bom-ref": "9cf28585e84bdcee", + "bom-ref": "fa087535af08bc34", "name": "/usr/sbin/update-rc.d", "type": "file" }, { - "bom-ref": "6664971d02973577", + "bom-ref": "aa782e66fdcc9eed", "name": "/usr/sbin/update-shells", "type": "file" }, { - "bom-ref": "785a2ec123d7d4bd", + "bom-ref": "8658f30ebdae9fbe", + "name": "/usr/sbin/update-xmlcatalog", + "type": "file" + }, + { + "bom-ref": "b714bb26cd0dda57", "name": "/usr/sbin/useradd", "type": "file" }, { - "bom-ref": "45e8a8e47e7cb047", + "bom-ref": "119da02cad832839", "name": "/usr/sbin/userdel", "type": "file" }, { - "bom-ref": "d8c8f553ad000e6a", + "bom-ref": "4d9225027084c1b0", "name": "/usr/sbin/usermod", "type": "file" }, { - "bom-ref": "16f36c3575a40159", + "bom-ref": "467f5d3d6675b86f", "name": "/usr/sbin/vipw", "type": "file" }, { - "bom-ref": "b3dc1311efdd2ccd", + "bom-ref": "16b6355eb1c75dc5", "name": "/usr/sbin/wipefs", "type": "file" }, { - "bom-ref": "d28b934439a5d6a6", + "bom-ref": "ebe796baa789ab90", "name": "/usr/sbin/zic", "type": "file" }, { - "bom-ref": "f28774aa16862964", + "bom-ref": "d06210ad1199ac04", "name": "/usr/sbin/zramctl", "type": "file" }, { - "bom-ref": "5b4e9c809e9d667d", + "bom-ref": "75783dc677f06ba8", + "name": "/usr/share/PackageKit/helpers/apt/pkconffile.nodiff", + "type": "file" + }, + { + "bom-ref": "63480f672656acfe", + "name": "/usr/share/PackageKit/helpers/test_spawn/search-name.sh", + "type": "file" + }, + { + "bom-ref": "df095bb10e00606d", "name": "/usr/share/X11/XErrorDB", "type": "file" }, { - "bom-ref": "f789385a6c67331d", + "bom-ref": "6f72d5a999840d29", "name": "/usr/share/X11/locale/C/Compose", "type": "file" }, { - "bom-ref": "3ff0004680ded233", + "bom-ref": "b948fee255298ba7", "name": "/usr/share/X11/locale/C/XI18N_OBJS", "type": "file" }, { - "bom-ref": "4d87bf936e72d2c9", + "bom-ref": "a45868dd9d366e89", "name": "/usr/share/X11/locale/C/XLC_LOCALE", "type": "file" }, { - "bom-ref": "cd6f4d302f1cdd79", + "bom-ref": "b021c93b407e9d69", "name": "/usr/share/X11/locale/am_ET.UTF-8/Compose", "type": "file" }, { - "bom-ref": "99d02720659268e5", + "bom-ref": "afaae4012602a04d", "name": "/usr/share/X11/locale/am_ET.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "237971b20d2ee139", + "bom-ref": "4df7ad493b2a0a1d", "name": "/usr/share/X11/locale/am_ET.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "949414abf37c63fd", + "bom-ref": "1441d4387a8cfc49", "name": "/usr/share/X11/locale/armscii-8/Compose", "type": "file" }, { - "bom-ref": "1e69b29321690f87", + "bom-ref": "75707f799b6436d7", "name": "/usr/share/X11/locale/armscii-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "e152a7b8a60f993b", + "bom-ref": "1b96cd6fc0a7a38b", "name": "/usr/share/X11/locale/armscii-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "62e415ae2701a8b9", + "bom-ref": "5a04fa919470d369", "name": "/usr/share/X11/locale/compose.dir", "type": "file" }, { - "bom-ref": "ae23f2413da7cbf2", + "bom-ref": "dd248ddb9b0473e2", "name": "/usr/share/X11/locale/cs_CZ.UTF-8/Compose", "type": "file" }, { - "bom-ref": "d7eaaf903a446609", + "bom-ref": "0ce869f8b019a4a5", "name": "/usr/share/X11/locale/cs_CZ.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "2395a56c28e0fc0f", + "bom-ref": "20c762d8981a0a33", "name": "/usr/share/X11/locale/cs_CZ.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "0836d66837086bb5", + "bom-ref": "67a76416ed65c6ed", "name": "/usr/share/X11/locale/el_GR.UTF-8/Compose", "type": "file" }, { - "bom-ref": "5efed20b68808bfc", + "bom-ref": "64e0b0eafb0c5710", "name": "/usr/share/X11/locale/el_GR.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "8d21b077f7343e02", + "bom-ref": "710538fed6bfcb82", "name": "/usr/share/X11/locale/el_GR.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "8886b683109ad08e", + "bom-ref": "e0b2e9532c2d1bce", "name": "/usr/share/X11/locale/en_US.UTF-8/Compose", "type": "file" }, { - "bom-ref": "382acdf6f2094114", + "bom-ref": "c52c5e0f6c51f964", "name": "/usr/share/X11/locale/en_US.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "bbdb1cf281ae3855", + "bom-ref": "d620dde7a02fdfd9", "name": "/usr/share/X11/locale/en_US.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "4596ec677e9634fc", + "bom-ref": "3c9f1226840e267c", "name": "/usr/share/X11/locale/fi_FI.UTF-8/Compose", "type": "file" }, { - "bom-ref": "5a30048be55142ed", + "bom-ref": "380e6d9c4d81d485", "name": "/usr/share/X11/locale/fi_FI.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "1b9014ca3e4a9532", + "bom-ref": "8ec85093b74061ae", "name": "/usr/share/X11/locale/fi_FI.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "732c7a93940234ed", + "bom-ref": "34f4c948a0d5e925", "name": "/usr/share/X11/locale/georgian-academy/Compose", "type": "file" }, { - "bom-ref": "db9bcaf52af7c7d8", + "bom-ref": "1b07c613c56b9c18", "name": "/usr/share/X11/locale/georgian-academy/XI18N_OBJS", "type": "file" }, { - "bom-ref": "655c0eeaf0d25c83", + "bom-ref": "bd2525a3bc0d7fcb", "name": "/usr/share/X11/locale/georgian-academy/XLC_LOCALE", "type": "file" }, { - "bom-ref": "6921a091fac62dfa", + "bom-ref": "9765fdc220215aea", "name": "/usr/share/X11/locale/georgian-ps/Compose", "type": "file" }, { - "bom-ref": "92bcb53dab8571f1", + "bom-ref": "739583bc96ba2ad1", "name": "/usr/share/X11/locale/georgian-ps/XI18N_OBJS", "type": "file" }, { - "bom-ref": "828772a773b68898", + "bom-ref": "3eb4f0c24cf6d0cc", "name": "/usr/share/X11/locale/georgian-ps/XLC_LOCALE", "type": "file" }, { - "bom-ref": "03fb218d64082356", + "bom-ref": "6b8386042eff980a", "name": "/usr/share/X11/locale/ibm-cp1133/Compose", "type": "file" }, { - "bom-ref": "91d83008129a3144", + "bom-ref": "ba9e5948e7e52be4", "name": "/usr/share/X11/locale/ibm-cp1133/XI18N_OBJS", "type": "file" }, { - "bom-ref": "e43365013f6b18a5", + "bom-ref": "b189e6ee2374963d", "name": "/usr/share/X11/locale/ibm-cp1133/XLC_LOCALE", "type": "file" }, { - "bom-ref": "209f30d0a44b2994", + "bom-ref": "9932171c354f2dec", "name": "/usr/share/X11/locale/iscii-dev/Compose", "type": "file" }, { - "bom-ref": "b579b282a948598c", + "bom-ref": "92f767453a17591c", "name": "/usr/share/X11/locale/iscii-dev/XI18N_OBJS", "type": "file" }, { - "bom-ref": "e5da4abba395f8fb", + "bom-ref": "02b2e38ccf3be8ab", "name": "/usr/share/X11/locale/iscii-dev/XLC_LOCALE", "type": "file" }, { - "bom-ref": "607c4278e9229a31", + "bom-ref": "39e7a7099ba1a901", "name": "/usr/share/X11/locale/isiri-3342/Compose", "type": "file" }, { - "bom-ref": "9a26d9f270100998", + "bom-ref": "13d39c999c4b4228", "name": "/usr/share/X11/locale/isiri-3342/XI18N_OBJS", "type": "file" }, { - "bom-ref": "0ba0d9260ad9921a", + "bom-ref": "fcbc3bcc8646a702", "name": "/usr/share/X11/locale/isiri-3342/XLC_LOCALE", "type": "file" }, { - "bom-ref": "18123aba92e5f0eb", + "bom-ref": "f1968de17f2109b3", "name": "/usr/share/X11/locale/iso8859-1/Compose", "type": "file" }, { - "bom-ref": "fe204b917b69991e", + "bom-ref": "869c7b45d8ef98f2", "name": "/usr/share/X11/locale/iso8859-1/XI18N_OBJS", "type": "file" }, { - "bom-ref": "96178041d9f692d8", + "bom-ref": "5626d18163a03548", "name": "/usr/share/X11/locale/iso8859-1/XLC_LOCALE", "type": "file" }, { - "bom-ref": "ffa433beff4ef254", + "bom-ref": "26ce1ae6cbdba354", "name": "/usr/share/X11/locale/iso8859-10/Compose", "type": "file" }, { - "bom-ref": "7971d336daf93e10", + "bom-ref": "ddfb1f7f9e887870", "name": "/usr/share/X11/locale/iso8859-10/XI18N_OBJS", "type": "file" }, { - "bom-ref": "31b4832d261739f1", + "bom-ref": "bc58b2b73e3bdae9", "name": "/usr/share/X11/locale/iso8859-10/XLC_LOCALE", "type": "file" }, { - "bom-ref": "f95240dbfd0a0fef", + "bom-ref": "c7796f0f0aca823b", "name": "/usr/share/X11/locale/iso8859-11/Compose", "type": "file" }, { - "bom-ref": "6dbabbadb1e4989f", + "bom-ref": "d22444977622e3a3", "name": "/usr/share/X11/locale/iso8859-11/XI18N_OBJS", "type": "file" }, { - "bom-ref": "2cd42ea47da1c28d", + "bom-ref": "4cc823d0a74f0035", "name": "/usr/share/X11/locale/iso8859-11/XLC_LOCALE", "type": "file" }, { - "bom-ref": "b666cacfb5223f04", + "bom-ref": "694ee6c95a313e08", "name": "/usr/share/X11/locale/iso8859-13/Compose", "type": "file" }, { - "bom-ref": "b05af89466c72331", + "bom-ref": "3aedf46e43d962e5", "name": "/usr/share/X11/locale/iso8859-13/XI18N_OBJS", "type": "file" }, { - "bom-ref": "78ef615d2c6957c9", + "bom-ref": "1b53ca44387e9069", "name": "/usr/share/X11/locale/iso8859-13/XLC_LOCALE", "type": "file" }, { - "bom-ref": "685f53112ae3f67a", + "bom-ref": "4760d30b5630cbbe", "name": "/usr/share/X11/locale/iso8859-14/Compose", "type": "file" }, { - "bom-ref": "6c11c8d8458401ac", + "bom-ref": "12d97d114d60fe28", "name": "/usr/share/X11/locale/iso8859-14/XI18N_OBJS", "type": "file" }, { - "bom-ref": "7d9edcad3128039d", + "bom-ref": "0e11f2ce580e0319", "name": "/usr/share/X11/locale/iso8859-14/XLC_LOCALE", "type": "file" }, { - "bom-ref": "acf6a1e8bb64208c", + "bom-ref": "0d43090653044308", "name": "/usr/share/X11/locale/iso8859-15/Compose", "type": "file" }, { - "bom-ref": "857b1758f8cb3783", + "bom-ref": "c99834f3ec786a6b", "name": "/usr/share/X11/locale/iso8859-15/XI18N_OBJS", "type": "file" }, { - "bom-ref": "02269165f5517439", + "bom-ref": "576da8d490acace1", "name": "/usr/share/X11/locale/iso8859-15/XLC_LOCALE", "type": "file" }, { - "bom-ref": "b830b60fd0991bc0", + "bom-ref": "9a22fa6054e3b648", "name": "/usr/share/X11/locale/iso8859-2/Compose", "type": "file" }, { - "bom-ref": "1117146d3d3e08eb", + "bom-ref": "5f0de5861bd0f873", "name": "/usr/share/X11/locale/iso8859-2/XI18N_OBJS", "type": "file" }, { - "bom-ref": "b2c2d9d161ea973a", + "bom-ref": "ed5838d9294bbe42", "name": "/usr/share/X11/locale/iso8859-2/XLC_LOCALE", "type": "file" }, { - "bom-ref": "327c212c0a510bb7", + "bom-ref": "f9d20432dea57dcf", "name": "/usr/share/X11/locale/iso8859-3/Compose", "type": "file" }, { - "bom-ref": "1552226d5bfc9a6d", + "bom-ref": "ecef29a383746e45", "name": "/usr/share/X11/locale/iso8859-3/XI18N_OBJS", "type": "file" }, { - "bom-ref": "1202d14846e48598", + "bom-ref": "5512d974c1040aa4", "name": "/usr/share/X11/locale/iso8859-3/XLC_LOCALE", "type": "file" }, { - "bom-ref": "1f88b3cf15301c02", + "bom-ref": "f8da8ce2c837b94a", "name": "/usr/share/X11/locale/iso8859-4/Compose", "type": "file" }, { - "bom-ref": "85b8c790dcac8fbd", + "bom-ref": "59265a7eedb44d41", "name": "/usr/share/X11/locale/iso8859-4/XI18N_OBJS", "type": "file" }, { - "bom-ref": "173bc2bad8637a60", + "bom-ref": "3b212a95f315ae9c", "name": "/usr/share/X11/locale/iso8859-4/XLC_LOCALE", "type": "file" }, { - "bom-ref": "7a00b8fdfdd44371", + "bom-ref": "b665dd130ffdc631", "name": "/usr/share/X11/locale/iso8859-5/Compose", "type": "file" }, { - "bom-ref": "175257d564f227a0", + "bom-ref": "4cf31a1c735d37c4", "name": "/usr/share/X11/locale/iso8859-5/XI18N_OBJS", "type": "file" }, { - "bom-ref": "08e3b91a3a766c82", + "bom-ref": "559d63a74ef2af52", "name": "/usr/share/X11/locale/iso8859-5/XLC_LOCALE", "type": "file" }, { - "bom-ref": "f16154069ca32526", + "bom-ref": "ac1ee127b5a97062", "name": "/usr/share/X11/locale/iso8859-6/Compose", "type": "file" }, { - "bom-ref": "795cd047e121a1f9", + "bom-ref": "de1a3d248ae4f0f5", "name": "/usr/share/X11/locale/iso8859-6/XI18N_OBJS", "type": "file" }, { - "bom-ref": "f054b88d7eca84a6", + "bom-ref": "012f200e20e673ee", "name": "/usr/share/X11/locale/iso8859-6/XLC_LOCALE", "type": "file" }, { - "bom-ref": "0d034d33b7fc2b64", + "bom-ref": "a3dea134e6de0918", "name": "/usr/share/X11/locale/iso8859-7/Compose", "type": "file" }, { - "bom-ref": "7bb6408174b529a4", + "bom-ref": "c9241bd4624e481c", "name": "/usr/share/X11/locale/iso8859-7/XI18N_OBJS", "type": "file" }, { - "bom-ref": "f7608d6b3822ef96", + "bom-ref": "a378e0d8aef8c85a", "name": "/usr/share/X11/locale/iso8859-7/XLC_LOCALE", "type": "file" }, { - "bom-ref": "0a9cddb69c05da7f", + "bom-ref": "443bc4bcd8c48893", "name": "/usr/share/X11/locale/iso8859-8/Compose", "type": "file" }, { - "bom-ref": "639a006763fec09e", + "bom-ref": "179277c2763f42e2", "name": "/usr/share/X11/locale/iso8859-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "57eeba5b2d77c08b", + "bom-ref": "fefd164ae9ef37c3", "name": "/usr/share/X11/locale/iso8859-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "7a22b9a50ef6af1e", + "bom-ref": "a2fb7c7c127bab1e", "name": "/usr/share/X11/locale/iso8859-9/Compose", "type": "file" }, { - "bom-ref": "521833072c52e9e1", + "bom-ref": "3cd0fc779e12e741", "name": "/usr/share/X11/locale/iso8859-9/XI18N_OBJS", "type": "file" }, { - "bom-ref": "42a06e2b08f620b1", + "bom-ref": "8d46a82a77ba7231", "name": "/usr/share/X11/locale/iso8859-9/XLC_LOCALE", "type": "file" }, { - "bom-ref": "c67322897444be9d", + "bom-ref": "7039e812d0b496a9", "name": "/usr/share/X11/locale/iso8859-9e/Compose", "type": "file" }, { - "bom-ref": "1c520af4d7325889", + "bom-ref": "66836a118e3e39e1", "name": "/usr/share/X11/locale/iso8859-9e/XI18N_OBJS", "type": "file" }, { - "bom-ref": "2ac3332d31db423d", + "bom-ref": "d4a8ce6bd82fa8ad", "name": "/usr/share/X11/locale/iso8859-9e/XLC_LOCALE", "type": "file" }, { - "bom-ref": "6e2d0a9ef74c4663", + "bom-ref": "190e4dcecc585677", "name": "/usr/share/X11/locale/ja.JIS/Compose", "type": "file" }, { - "bom-ref": "49eb3443ebfdd42f", + "bom-ref": "a86c1fa08e7328a7", "name": "/usr/share/X11/locale/ja.JIS/XI18N_OBJS", "type": "file" }, { - "bom-ref": "66a09322746cf2c9", + "bom-ref": "dbdcee4bf8e58ea9", "name": "/usr/share/X11/locale/ja.JIS/XLC_LOCALE", "type": "file" }, { - "bom-ref": "453f3da3901f7838", + "bom-ref": "2b19379337a44b70", "name": "/usr/share/X11/locale/ja.SJIS/Compose", "type": "file" }, { - "bom-ref": "fbe675e263bce22d", + "bom-ref": "83ecc88f72b1b991", "name": "/usr/share/X11/locale/ja.SJIS/XI18N_OBJS", "type": "file" }, { - "bom-ref": "a7fcdc0b9307c944", + "bom-ref": "9d59e476abdf22b4", "name": "/usr/share/X11/locale/ja.SJIS/XLC_LOCALE", "type": "file" }, { - "bom-ref": "ae4b8e21b35dde74", + "bom-ref": "92fcbb3d319a99c4", "name": "/usr/share/X11/locale/ja/Compose", "type": "file" }, { - "bom-ref": "918363ac461f5f0b", + "bom-ref": "33c2bb0626881d33", "name": "/usr/share/X11/locale/ja/XI18N_OBJS", "type": "file" }, { - "bom-ref": "0595015e4bcb8068", + "bom-ref": "426ca5bf0d81bb5c", "name": "/usr/share/X11/locale/ja/XLC_LOCALE", "type": "file" }, { - "bom-ref": "09f16ea81932d364", + "bom-ref": "17beba10317b31b8", "name": "/usr/share/X11/locale/ja_JP.UTF-8/Compose", "type": "file" }, { - "bom-ref": "e30b2ff488f2cd6b", + "bom-ref": "367e016998b3514b", "name": "/usr/share/X11/locale/ja_JP.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "a64fdb7b7317e1fd", + "bom-ref": "57cfb45dfec79ef9", "name": "/usr/share/X11/locale/ja_JP.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "711a23beb75ba383", + "bom-ref": "e9a4c68d780e190f", "name": "/usr/share/X11/locale/km_KH.UTF-8/Compose", "type": "file" }, { - "bom-ref": "a73cfcc5aac318b4", + "bom-ref": "daecc019d8399038", "name": "/usr/share/X11/locale/km_KH.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "a0cdc9196d5975bc", + "bom-ref": "5331a06e5cde9d88", "name": "/usr/share/X11/locale/km_KH.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "2436093ef1a3bc86", + "bom-ref": "85c314d4e539256e", "name": "/usr/share/X11/locale/ko/Compose", "type": "file" }, { - "bom-ref": "f70a3a09d59f7ce3", + "bom-ref": "718cc62eb869308f", "name": "/usr/share/X11/locale/ko/XI18N_OBJS", "type": "file" }, { - "bom-ref": "7db6f43fe37ed7b2", + "bom-ref": "fe1cc21ce80eda2e", "name": "/usr/share/X11/locale/ko/XLC_LOCALE", "type": "file" }, { - "bom-ref": "8c815fa56b5b8e5a", + "bom-ref": "020b1f65970c25ee", "name": "/usr/share/X11/locale/ko_KR.UTF-8/Compose", "type": "file" }, { - "bom-ref": "2befa15bafe8eefa", + "bom-ref": "c64e5cd245e26cbe", "name": "/usr/share/X11/locale/ko_KR.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "8bf44bfdaa1cd9f6", + "bom-ref": "58074a160f7d9bc2", "name": "/usr/share/X11/locale/ko_KR.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "b7200d0ecb76633f", + "bom-ref": "99deeaaf5da8a8d3", "name": "/usr/share/X11/locale/koi8-c/Compose", "type": "file" }, { - "bom-ref": "d901d0adad95401d", + "bom-ref": "0e73dea77a3d83c9", "name": "/usr/share/X11/locale/koi8-c/XI18N_OBJS", "type": "file" }, { - "bom-ref": "3504232a6a30505b", + "bom-ref": "d49d86bd588378a7", "name": "/usr/share/X11/locale/koi8-c/XLC_LOCALE", "type": "file" }, { - "bom-ref": "5d1c9b5dce253b59", + "bom-ref": "472980f80a2dac05", "name": "/usr/share/X11/locale/koi8-r/Compose", "type": "file" }, { - "bom-ref": "03dded815e0c2ca8", + "bom-ref": "0e5d6f664e1550b0", "name": "/usr/share/X11/locale/koi8-r/XI18N_OBJS", "type": "file" }, { - "bom-ref": "a198a410d365dbad", + "bom-ref": "efde7c21e17c13ad", "name": "/usr/share/X11/locale/koi8-r/XLC_LOCALE", "type": "file" }, { - "bom-ref": "f5860fd06e6819f6", + "bom-ref": "9b862b59236c2e72", "name": "/usr/share/X11/locale/koi8-u/Compose", "type": "file" }, { - "bom-ref": "3653f4b45a0cf631", + "bom-ref": "bdbc2b2d39fc8319", "name": "/usr/share/X11/locale/koi8-u/XI18N_OBJS", "type": "file" }, { - "bom-ref": "2ded2f1bcc25bd5a", + "bom-ref": "ed61ab152404f926", "name": "/usr/share/X11/locale/koi8-u/XLC_LOCALE", "type": "file" }, { - "bom-ref": "15f4842736684fab", + "bom-ref": "31228a53b46ebe53", "name": "/usr/share/X11/locale/locale.alias", "type": "file" }, { - "bom-ref": "3ea2d1acd606fdae", + "bom-ref": "c6ab976427dc233e", "name": "/usr/share/X11/locale/locale.dir", "type": "file" }, { - "bom-ref": "bba0c0360085d4cb", + "bom-ref": "1d33c5fe60b51107", "name": "/usr/share/X11/locale/microsoft-cp1251/Compose", "type": "file" }, { - "bom-ref": "ff0aaeca7611403a", + "bom-ref": "aef3d20296d62dc2", "name": "/usr/share/X11/locale/microsoft-cp1251/XI18N_OBJS", "type": "file" }, { - "bom-ref": "f144d4cb9b25d8b2", + "bom-ref": "7aeb40f5caf4338a", "name": "/usr/share/X11/locale/microsoft-cp1251/XLC_LOCALE", "type": "file" }, { - "bom-ref": "256874ef30d78ebc", + "bom-ref": "e43d793040f4c8a8", "name": "/usr/share/X11/locale/microsoft-cp1255/Compose", "type": "file" }, { - "bom-ref": "3f5e002b54bdfdda", + "bom-ref": "c498285e7d6f0a92", "name": "/usr/share/X11/locale/microsoft-cp1255/XI18N_OBJS", "type": "file" }, { - "bom-ref": "8bafe8de620d7e81", + "bom-ref": "8edd2835713d39c5", "name": "/usr/share/X11/locale/microsoft-cp1255/XLC_LOCALE", "type": "file" }, { - "bom-ref": "9857faf6e968f614", + "bom-ref": "3da0f6e505ab10fc", "name": "/usr/share/X11/locale/microsoft-cp1256/Compose", "type": "file" }, { - "bom-ref": "52a4365338547fea", + "bom-ref": "2bf215b6c42fe976", "name": "/usr/share/X11/locale/microsoft-cp1256/XI18N_OBJS", "type": "file" }, { - "bom-ref": "4bf217e7b7fa42dd", + "bom-ref": "52ec363bc22e6c91", "name": "/usr/share/X11/locale/microsoft-cp1256/XLC_LOCALE", "type": "file" }, { - "bom-ref": "cf04d78e2a9f53d5", + "bom-ref": "49c238229ab02199", "name": "/usr/share/X11/locale/mulelao-1/Compose", "type": "file" }, { - "bom-ref": "04995a4282800df3", + "bom-ref": "07aefd6135d58ef7", "name": "/usr/share/X11/locale/mulelao-1/XI18N_OBJS", "type": "file" }, { - "bom-ref": "92de3a270f0eda31", + "bom-ref": "67131c8904359061", "name": "/usr/share/X11/locale/mulelao-1/XLC_LOCALE", "type": "file" }, { - "bom-ref": "237a487cbd4330a2", + "bom-ref": "8378eafb92da965a", "name": "/usr/share/X11/locale/nokhchi-1/Compose", "type": "file" }, { - "bom-ref": "a586a7263dfd96bf", + "bom-ref": "1b21418e5685db0b", "name": "/usr/share/X11/locale/nokhchi-1/XI18N_OBJS", "type": "file" }, { - "bom-ref": "53efcda80e9a77ba", + "bom-ref": "edcf7fe02783162e", "name": "/usr/share/X11/locale/nokhchi-1/XLC_LOCALE", "type": "file" }, { - "bom-ref": "b43ddb35c5f7e418", + "bom-ref": "68a0c0dc4acfd1c0", "name": "/usr/share/X11/locale/pt_BR.UTF-8/Compose", "type": "file" }, { - "bom-ref": "aad7f1c7e98028ec", + "bom-ref": "9fd5faa249720360", "name": "/usr/share/X11/locale/pt_BR.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "55395a8179bb66f9", + "bom-ref": "548ee393e85bc211", "name": "/usr/share/X11/locale/pt_BR.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "026110ec9ba3bec4", + "bom-ref": "dcc44301a2be8aac", "name": "/usr/share/X11/locale/pt_PT.UTF-8/Compose", "type": "file" }, { - "bom-ref": "51668404af7a816d", + "bom-ref": "61a9ce98aaf04ad5", "name": "/usr/share/X11/locale/pt_PT.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "310b26444dcdbb1a", + "bom-ref": "385052a061c297ee", "name": "/usr/share/X11/locale/pt_PT.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "4705b56145c777e7", + "bom-ref": "542703ecfbe85e57", "name": "/usr/share/X11/locale/ru_RU.UTF-8/Compose", "type": "file" }, { - "bom-ref": "a040616c8bcfe09b", + "bom-ref": "bd39253aa1db481b", "name": "/usr/share/X11/locale/ru_RU.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "bb80bd9ecc0cb7b8", + "bom-ref": "a609f221b9df1e30", "name": "/usr/share/X11/locale/ru_RU.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "c9cd6af85859d03c", + "bom-ref": "a9b4d528f30a59d8", "name": "/usr/share/X11/locale/sr_RS.UTF-8/Compose", "type": "file" }, { - "bom-ref": "af48dbef2cce5c67", + "bom-ref": "9aee4fef46ac908b", "name": "/usr/share/X11/locale/sr_RS.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "17a634e84a46e35c", + "bom-ref": "2ee7847cd376de98", "name": "/usr/share/X11/locale/sr_RS.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "8a46a6f4b11093e3", + "bom-ref": "007014588d1b779b", "name": "/usr/share/X11/locale/tatar-cyr/Compose", "type": "file" }, { - "bom-ref": "4fcad75355b20c57", + "bom-ref": "f34e54d7f25ee483", "name": "/usr/share/X11/locale/tatar-cyr/XI18N_OBJS", "type": "file" }, { - "bom-ref": "3241ce8317588050", + "bom-ref": "91ea03576daceda0", "name": "/usr/share/X11/locale/tatar-cyr/XLC_LOCALE", "type": "file" }, { - "bom-ref": "5e92167694f24f63", + "bom-ref": "ec1b6950de5c19e3", "name": "/usr/share/X11/locale/th_TH.UTF-8/Compose", "type": "file" }, { - "bom-ref": "ec39c821571ff10c", + "bom-ref": "7a221a9574184eec", "name": "/usr/share/X11/locale/th_TH.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "93387c88c2826f6c", + "bom-ref": "8e48a80f75faef18", "name": "/usr/share/X11/locale/th_TH.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "0d03c70869edbe7f", + "bom-ref": "f06afca918112cd7", "name": "/usr/share/X11/locale/th_TH/Compose", "type": "file" }, { - "bom-ref": "f75c6847d827e120", + "bom-ref": "00f6d4e06b8410f4", "name": "/usr/share/X11/locale/th_TH/XI18N_OBJS", "type": "file" }, { - "bom-ref": "0ed881fcdacfdd76", + "bom-ref": "e1e6252b3a5abe6a", "name": "/usr/share/X11/locale/th_TH/XLC_LOCALE", "type": "file" }, { - "bom-ref": "596ea884fc6f6947", + "bom-ref": "b15ba377454a0d2f", "name": "/usr/share/X11/locale/tscii-0/Compose", "type": "file" }, { - "bom-ref": "790084e7f6d8d843", + "bom-ref": "7eec1378034e4447", "name": "/usr/share/X11/locale/tscii-0/XI18N_OBJS", "type": "file" }, { - "bom-ref": "c9860240c1cb59b9", + "bom-ref": "4f73ff6ed7f66f35", "name": "/usr/share/X11/locale/tscii-0/XLC_LOCALE", "type": "file" }, { - "bom-ref": "d9f573bbae5bc728", + "bom-ref": "be622c8d28ae3568", "name": "/usr/share/X11/locale/vi_VN.tcvn/Compose", "type": "file" }, { - "bom-ref": "6a9da363a6892b1b", + "bom-ref": "566f60ee1684db97", "name": "/usr/share/X11/locale/vi_VN.tcvn/XI18N_OBJS", "type": "file" }, { - "bom-ref": "9cae71ec45a60767", + "bom-ref": "390621d79f1086f3", "name": "/usr/share/X11/locale/vi_VN.tcvn/XLC_LOCALE", "type": "file" }, { - "bom-ref": "244ff281dd73aca9", + "bom-ref": "89de4a55e48e36b1", "name": "/usr/share/X11/locale/vi_VN.viscii/Compose", "type": "file" }, { - "bom-ref": "7ad53e7cb1f76628", + "bom-ref": "e4934b5f879bfad4", "name": "/usr/share/X11/locale/vi_VN.viscii/XI18N_OBJS", "type": "file" }, { - "bom-ref": "f96a98d78891740e", + "bom-ref": "1018809bce0eacc2", "name": "/usr/share/X11/locale/vi_VN.viscii/XLC_LOCALE", "type": "file" }, { - "bom-ref": "dc0a0a4f7885eb50", + "bom-ref": "5049d051e16d06ec", "name": "/usr/share/X11/locale/zh_CN.UTF-8/Compose", "type": "file" }, { - "bom-ref": "97a5d77714335875", + "bom-ref": "4f90668337b8b431", "name": "/usr/share/X11/locale/zh_CN.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "0a2b2bbfdd984237", + "bom-ref": "159774e2380e06a7", "name": "/usr/share/X11/locale/zh_CN.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "70851480b4addb4e", + "bom-ref": "b924ca0ce1d5032e", "name": "/usr/share/X11/locale/zh_CN.gb18030/Compose", "type": "file" }, { - "bom-ref": "2be628d91b3e0f80", + "bom-ref": "0b5d62232945448c", "name": "/usr/share/X11/locale/zh_CN.gb18030/XI18N_OBJS", "type": "file" }, { - "bom-ref": "d6a1a53ef65c408b", + "bom-ref": "6ed6b0d67097229f", "name": "/usr/share/X11/locale/zh_CN.gb18030/XLC_LOCALE", "type": "file" }, { - "bom-ref": "ddfe7344339741c4", + "bom-ref": "932ec4ec8b1ed3d0", "name": "/usr/share/X11/locale/zh_CN.gbk/Compose", "type": "file" }, { - "bom-ref": "a67f2268b31f4d2d", + "bom-ref": "3d587ba4df1fa7dd", "name": "/usr/share/X11/locale/zh_CN.gbk/XI18N_OBJS", "type": "file" }, { - "bom-ref": "40f9489c72cade1f", + "bom-ref": "d3be6c018ef8e1df", "name": "/usr/share/X11/locale/zh_CN.gbk/XLC_LOCALE", "type": "file" }, { - "bom-ref": "80c7d47a43e6dd23", + "bom-ref": "6ff8d512935d572b", "name": "/usr/share/X11/locale/zh_CN/Compose", "type": "file" }, { - "bom-ref": "7b6fcab957047b07", + "bom-ref": "f496305efc86ccb3", "name": "/usr/share/X11/locale/zh_CN/XI18N_OBJS", "type": "file" }, { - "bom-ref": "9b882ede288787a7", + "bom-ref": "e801e332714a43eb", "name": "/usr/share/X11/locale/zh_CN/XLC_LOCALE", "type": "file" }, { - "bom-ref": "88c7e47f92c7708f", + "bom-ref": "3132b5ce22517b77", "name": "/usr/share/X11/locale/zh_HK.UTF-8/Compose", "type": "file" }, { - "bom-ref": "3a88898cd0cbc10c", + "bom-ref": "235076387c749108", "name": "/usr/share/X11/locale/zh_HK.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "625beaf95750b89e", + "bom-ref": "1febc0d440dc1a3e", "name": "/usr/share/X11/locale/zh_HK.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "6ebe3cdee822c8d4", + "bom-ref": "b5796fcb0543d7b4", "name": "/usr/share/X11/locale/zh_HK.big5/Compose", "type": "file" }, { - "bom-ref": "7c4934942cd1421c", + "bom-ref": "66e8a0315c7a1fa0", "name": "/usr/share/X11/locale/zh_HK.big5/XI18N_OBJS", "type": "file" }, { - "bom-ref": "36fbaaa9ba9c3cef", + "bom-ref": "a9edcdc636e25dd7", "name": "/usr/share/X11/locale/zh_HK.big5/XLC_LOCALE", "type": "file" }, { - "bom-ref": "f969b7dd501af7fa", + "bom-ref": "7e485ded2522694a", "name": "/usr/share/X11/locale/zh_HK.big5hkscs/Compose", "type": "file" }, { - "bom-ref": "99075197c694d042", + "bom-ref": "851b9f1f3a8eedfe", "name": "/usr/share/X11/locale/zh_HK.big5hkscs/XI18N_OBJS", "type": "file" }, { - "bom-ref": "803c7fad6979c7a5", + "bom-ref": "7fbf1d9a2b3e9005", "name": "/usr/share/X11/locale/zh_HK.big5hkscs/XLC_LOCALE", "type": "file" }, { - "bom-ref": "92826b2300730d1b", + "bom-ref": "19471fd77273cd73", "name": "/usr/share/X11/locale/zh_TW.UTF-8/Compose", "type": "file" }, { - "bom-ref": "33c81c310380ff9b", + "bom-ref": "46392cf35d5f535b", "name": "/usr/share/X11/locale/zh_TW.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "978dcbcbe5bf79cc", + "bom-ref": "f87411523be1d04c", "name": "/usr/share/X11/locale/zh_TW.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "d34959110ea374d8", + "bom-ref": "ddb089255bb0b8d8", "name": "/usr/share/X11/locale/zh_TW.big5/Compose", "type": "file" }, { - "bom-ref": "911d143db0934209", + "bom-ref": "4bb757fcf16b6081", "name": "/usr/share/X11/locale/zh_TW.big5/XI18N_OBJS", "type": "file" }, { - "bom-ref": "147d2c6c4249f385", + "bom-ref": "7d4c641fa8d89ec9", "name": "/usr/share/X11/locale/zh_TW.big5/XLC_LOCALE", "type": "file" }, { - "bom-ref": "148c2d4a598cb5ed", + "bom-ref": "06743c74a967cee5", "name": "/usr/share/X11/locale/zh_TW/Compose", "type": "file" }, { - "bom-ref": "2eb60d5419d73919", + "bom-ref": "de46edac203208f9", "name": "/usr/share/X11/locale/zh_TW/XI18N_OBJS", "type": "file" }, { - "bom-ref": "a4679895d16396ff", + "bom-ref": "0da12202d3897137", "name": "/usr/share/X11/locale/zh_TW/XLC_LOCALE", "type": "file" }, { - "bom-ref": "88a100e984364643", + "bom-ref": "cd70753789a36577", "name": "/usr/share/X11/xkb/compat/README", "type": "file" }, { - "bom-ref": "c5f3a14ee7ec9a92", + "bom-ref": "3168af9d3b4809f2", "name": "/usr/share/X11/xkb/compat/accessx", "type": "file" }, { - "bom-ref": "3325f408d8c64f0d", + "bom-ref": "34ff0206a0cb722d", "name": "/usr/share/X11/xkb/compat/basic", "type": "file" }, { - "bom-ref": "19dc972dc3272553", + "bom-ref": "7cb28a304387c35f", "name": "/usr/share/X11/xkb/compat/caps", "type": "file" }, { - "bom-ref": "fe196da1ee4e378d", + "bom-ref": "c4b1b3a476d658b9", "name": "/usr/share/X11/xkb/compat/complete", "type": "file" }, { - "bom-ref": "2372b69b057e41c9", + "bom-ref": "c9a6bca4e1e29a19", "name": "/usr/share/X11/xkb/compat/iso9995", "type": "file" }, { - "bom-ref": "6dba022a1eae11ad", + "bom-ref": "91bc5a258080ea69", "name": "/usr/share/X11/xkb/compat/japan", "type": "file" }, { - "bom-ref": "1cabf0cbb51c8dab", + "bom-ref": "121ae02e30821803", "name": "/usr/share/X11/xkb/compat/ledcaps", "type": "file" }, { - "bom-ref": "b071cce11e82c0a8", + "bom-ref": "00bed522d59d65c0", "name": "/usr/share/X11/xkb/compat/ledcompose", "type": "file" }, { - "bom-ref": "fa097fade6589930", + "bom-ref": "a271709848c2da7c", "name": "/usr/share/X11/xkb/compat/lednum", "type": "file" }, { - "bom-ref": "4d64567724dccd25", + "bom-ref": "d066197454ae5289", "name": "/usr/share/X11/xkb/compat/ledscroll", "type": "file" }, { - "bom-ref": "ed141948c642e1c1", + "bom-ref": "595d4a77fee2d2d1", "name": "/usr/share/X11/xkb/compat/level5", "type": "file" }, { - "bom-ref": "f9ebdd65c569426a", + "bom-ref": "87f64efb0f9fdf9a", "name": "/usr/share/X11/xkb/compat/misc", "type": "file" }, { - "bom-ref": "2c65b5de2f25d237", + "bom-ref": "ae8d278ea2ebd03b", "name": "/usr/share/X11/xkb/compat/mousekeys", "type": "file" }, { - "bom-ref": "d11a77f1b051ef47", + "bom-ref": "c758c50712953eef", "name": "/usr/share/X11/xkb/compat/olpc", "type": "file" }, { - "bom-ref": "bb0e32ceb9601211", + "bom-ref": "8da17571ebc947c5", "name": "/usr/share/X11/xkb/compat/pc", "type": "file" }, { - "bom-ref": "9869bebfa248b45f", + "bom-ref": "e0ad9db8e6273e07", "name": "/usr/share/X11/xkb/compat/pc98", "type": "file" }, { - "bom-ref": "de93b4a37c04bcb4", + "bom-ref": "67bfc7645448c490", "name": "/usr/share/X11/xkb/compat/xfree86", "type": "file" }, { - "bom-ref": "586ace9fe1348308", + "bom-ref": "e9d5f7323689ff44", "name": "/usr/share/X11/xkb/compat/xtest", "type": "file" }, { - "bom-ref": "f84bd04b7fd9cd58", + "bom-ref": "d5f2e0a51c4944e8", "name": "/usr/share/X11/xkb/geometry/README", "type": "file" }, { - "bom-ref": "c4277cef8c76a354", + "bom-ref": "755e3ea0d6a7deec", "name": "/usr/share/X11/xkb/geometry/amiga", "type": "file" }, { - "bom-ref": "dce67ea1ca4df796", + "bom-ref": "9f7985716e16db8a", "name": "/usr/share/X11/xkb/geometry/ataritt", "type": "file" }, { - "bom-ref": "2e8b4c778fb47411", + "bom-ref": "d37944623767068d", "name": "/usr/share/X11/xkb/geometry/chicony", "type": "file" }, { - "bom-ref": "35a4a7818b922d1d", + "bom-ref": "9ae1a7f3a006ba0d", "name": "/usr/share/X11/xkb/geometry/dell", "type": "file" }, { - "bom-ref": "b8006753fe094cbd", + "bom-ref": "30ed529fb7bede25", "name": "/usr/share/X11/xkb/geometry/digital_vndr/lk", "type": "file" }, { - "bom-ref": "a6b15127e366c9a1", + "bom-ref": "b48f7d2424bb0881", "name": "/usr/share/X11/xkb/geometry/digital_vndr/pc", "type": "file" }, { - "bom-ref": "2384fd3f0e155ddf", + "bom-ref": "b2221684c3086b6f", "name": "/usr/share/X11/xkb/geometry/digital_vndr/unix", "type": "file" }, { - "bom-ref": "5d9dc43734b26d09", + "bom-ref": "472852a839888959", "name": "/usr/share/X11/xkb/geometry/everex", "type": "file" }, { - "bom-ref": "9f4d98e05958b866", + "bom-ref": "19180e5475554c62", "name": "/usr/share/X11/xkb/geometry/fujitsu", "type": "file" }, { - "bom-ref": "50732e072ed19289", + "bom-ref": "e131fb19e1a73571", "name": "/usr/share/X11/xkb/geometry/hhk", "type": "file" }, { - "bom-ref": "77f04a8978ed7c23", + "bom-ref": "1b6d9ad916f5f8d7", "name": "/usr/share/X11/xkb/geometry/hp", "type": "file" }, { - "bom-ref": "f419b4c6bdf68bf1", + "bom-ref": "ef5f8f43d67bc52d", "name": "/usr/share/X11/xkb/geometry/keytronic", "type": "file" }, { - "bom-ref": "bae13b5e2e932754", + "bom-ref": "8ff8c641f8878890", "name": "/usr/share/X11/xkb/geometry/kinesis", "type": "file" }, { - "bom-ref": "0875469f249e4d28", + "bom-ref": "47637e28454e51d4", "name": "/usr/share/X11/xkb/geometry/macintosh", "type": "file" }, { - "bom-ref": "f6b10c979f0092d2", + "bom-ref": "c33536881901d932", "name": "/usr/share/X11/xkb/geometry/microsoft", "type": "file" }, { - "bom-ref": "eec709de4fda2cce", + "bom-ref": "0f0bb8d4704bd5fa", "name": "/usr/share/X11/xkb/geometry/nec", "type": "file" }, { - "bom-ref": "71f4a10704cd58ca", + "bom-ref": "1fd4585d16956ae6", "name": "/usr/share/X11/xkb/geometry/nokia", "type": "file" }, { - "bom-ref": "792953c457fb1d27", + "bom-ref": "8bc6a00647959993", "name": "/usr/share/X11/xkb/geometry/northgate", "type": "file" }, { - "bom-ref": "66349450ffebde24", + "bom-ref": "e3b73f7a18148b98", "name": "/usr/share/X11/xkb/geometry/pc", "type": "file" }, { - "bom-ref": "386cc5e75481e08c", + "bom-ref": "f9fb10834de3cb60", "name": "/usr/share/X11/xkb/geometry/sanwa", "type": "file" }, { - "bom-ref": "3839a67fead0b07d", + "bom-ref": "adb22f6e79cff761", "name": "/usr/share/X11/xkb/geometry/sgi_vndr/O2", "type": "file" }, { - "bom-ref": "6ba6714816fc8dcb", + "bom-ref": "67f94048a057e80b", "name": "/usr/share/X11/xkb/geometry/sgi_vndr/indigo", "type": "file" }, { - "bom-ref": "ba4494204e402b72", + "bom-ref": "a0f38b7de9605316", "name": "/usr/share/X11/xkb/geometry/sgi_vndr/indy", "type": "file" }, { - "bom-ref": "43fef7511c8105d5", + "bom-ref": "82c3b454344bb09d", "name": "/usr/share/X11/xkb/geometry/sony", "type": "file" }, { - "bom-ref": "cbe22f76a5bb7df9", + "bom-ref": "e9794f27961515e9", "name": "/usr/share/X11/xkb/geometry/steelseries", "type": "file" }, { - "bom-ref": "e025be499d6953c5", + "bom-ref": "98b36dfea6ce9349", "name": "/usr/share/X11/xkb/geometry/sun", "type": "file" }, { - "bom-ref": "4f77dc922837407b", + "bom-ref": "872638c414fd5083", "name": "/usr/share/X11/xkb/geometry/teck", "type": "file" }, { - "bom-ref": "ee96234edafa4246", + "bom-ref": "b704d6aebec684a2", "name": "/usr/share/X11/xkb/geometry/thinkpad", "type": "file" }, { - "bom-ref": "f6b7d7f2f5c52b3a", + "bom-ref": "ca26853d55c1d326", "name": "/usr/share/X11/xkb/geometry/typematrix", "type": "file" }, { - "bom-ref": "43b8120bcbca78a7", + "bom-ref": "f92809af23069f0f", "name": "/usr/share/X11/xkb/geometry/winbook", "type": "file" }, { - "bom-ref": "0915a48c0d97f150", + "bom-ref": "6b7693baea420cf0", "name": "/usr/share/X11/xkb/keycodes/README", "type": "file" }, { - "bom-ref": "1bc9532a79b9a0cd", + "bom-ref": "5dccb6ffababa401", "name": "/usr/share/X11/xkb/keycodes/aliases", "type": "file" }, { - "bom-ref": "cb2c23f762e94e79", + "bom-ref": "3158ae33180799e1", "name": "/usr/share/X11/xkb/keycodes/amiga", "type": "file" }, { - "bom-ref": "047d86308baf2c66", + "bom-ref": "1c219519ab98cf2a", "name": "/usr/share/X11/xkb/keycodes/ataritt", "type": "file" }, { - "bom-ref": "8627fd5eb21cba94", + "bom-ref": "36f4df9bdf1afe58", "name": "/usr/share/X11/xkb/keycodes/digital_vndr/lk", "type": "file" }, { - "bom-ref": "16a92872f3d1e503", + "bom-ref": "e99af090effa09ab", "name": "/usr/share/X11/xkb/keycodes/digital_vndr/pc", "type": "file" }, { - "bom-ref": "8e36d737ffe92e47", + "bom-ref": "7ec639a8001b4e93", "name": "/usr/share/X11/xkb/keycodes/empty", "type": "file" }, { - "bom-ref": "6f17e32cd326f417", + "bom-ref": "47fb59c94f67e7eb", "name": "/usr/share/X11/xkb/keycodes/evdev", "type": "file" }, { - "bom-ref": "3618ade3311a0c7c", + "bom-ref": "b1cca41483be8a90", "name": "/usr/share/X11/xkb/keycodes/fujitsu", "type": "file" }, { - "bom-ref": "e04f84cbdd06f367", + "bom-ref": "1ccbfa98022d7d87", "name": "/usr/share/X11/xkb/keycodes/hp", "type": "file" }, { - "bom-ref": "59ee9f50ed6e8728", + "bom-ref": "04a4efd365e575b4", "name": "/usr/share/X11/xkb/keycodes/ibm", "type": "file" }, { - "bom-ref": "bfd41b3e07d99137", + "bom-ref": "27cf9cf623c57267", "name": "/usr/share/X11/xkb/keycodes/jolla", "type": "file" }, { - "bom-ref": "6398d9fbcac5da2b", + "bom-ref": "9cebbcae76e96acb", "name": "/usr/share/X11/xkb/keycodes/macintosh", "type": "file" }, { - "bom-ref": "ad21d2bf688f1c0b", + "bom-ref": "7533bbb7daefbfbb", "name": "/usr/share/X11/xkb/keycodes/olpc", "type": "file" }, { - "bom-ref": "86a4649fabe546fb", + "bom-ref": "797b0994ccc6d617", "name": "/usr/share/X11/xkb/keycodes/sgi_vndr/indigo", "type": "file" }, { - "bom-ref": "24b36612f35f5792", + "bom-ref": "07703b04254ec2be", "name": "/usr/share/X11/xkb/keycodes/sgi_vndr/indy", "type": "file" }, { - "bom-ref": "65a69743f855f8c6", + "bom-ref": "db385aa898251c2a", "name": "/usr/share/X11/xkb/keycodes/sgi_vndr/iris", "type": "file" }, { - "bom-ref": "a7fbdf28115a9473", + "bom-ref": "486fcb8f7f49467b", "name": "/usr/share/X11/xkb/keycodes/sony", "type": "file" }, { - "bom-ref": "2a29d512680e9747", + "bom-ref": "8e1177deef124f13", "name": "/usr/share/X11/xkb/keycodes/sun", "type": "file" }, { - "bom-ref": "f678f8d54ac9a34d", + "bom-ref": "a0980abf471e4905", "name": "/usr/share/X11/xkb/keycodes/xfree86", "type": "file" }, { - "bom-ref": "df507db2a37b2a80", + "bom-ref": "18ad3b7ba65774c0", "name": "/usr/share/X11/xkb/keycodes/xfree98", "type": "file" }, { - "bom-ref": "a6745fee89c1931b", + "bom-ref": "6af5913010761357", "name": "/usr/share/X11/xkb/rules/README", "type": "file" }, { - "bom-ref": "3cbbd80cf40d7db1", + "bom-ref": "46a622c87e75b315", "name": "/usr/share/X11/xkb/rules/base", "type": "file" }, { - "bom-ref": "d9c8d24c79b93118", + "bom-ref": "85787db967f1c86c", "name": "/usr/share/X11/xkb/rules/base.extras.xml", "type": "file" }, { - "bom-ref": "f5bd6e0aec09c4df", + "bom-ref": "54ee3246c5e460c3", "name": "/usr/share/X11/xkb/rules/base.lst", "type": "file" }, { - "bom-ref": "2015eb4e109f1817", + "bom-ref": "485410d02fb1dd93", "name": "/usr/share/X11/xkb/rules/base.xml", "type": "file" }, { - "bom-ref": "b90e6e23f4524bc7", + "bom-ref": "eb4523c9dfef8b8f", "name": "/usr/share/X11/xkb/rules/evdev", "type": "file" }, { - "bom-ref": "21b5e347b1df7a44", + "bom-ref": "d646820f3429195c", "name": "/usr/share/X11/xkb/rules/evdev.extras.xml", "type": "file" }, { - "bom-ref": "e09cf7d8b2d086cd", + "bom-ref": "bb4ee437d97c5669", "name": "/usr/share/X11/xkb/rules/evdev.lst", "type": "file" }, { - "bom-ref": "9b7aeb1fc2228c95", + "bom-ref": "8a01a53dad3887b5", "name": "/usr/share/X11/xkb/rules/evdev.xml", "type": "file" }, { - "bom-ref": "7ea778d2ed9cd723", + "bom-ref": "0325ab29f2a0e257", "name": "/usr/share/X11/xkb/rules/xfree98", "type": "file" }, { - "bom-ref": "88895faf95431c7f", + "bom-ref": "9a810ebf997d1a9b", "name": "/usr/share/X11/xkb/rules/xkb.dtd", "type": "file" }, { - "bom-ref": "4469c3573ec06b2d", + "bom-ref": "229c9de8ebe71c31", "name": "/usr/share/X11/xkb/symbols/af", "type": "file" }, { - "bom-ref": "dccd7e2a9f9ec2d4", + "bom-ref": "a3bc5ed4bf3fd44c", "name": "/usr/share/X11/xkb/symbols/al", "type": "file" }, { - "bom-ref": "afe39fe8817763ea", + "bom-ref": "e1a352f833549fbe", "name": "/usr/share/X11/xkb/symbols/altwin", "type": "file" }, { - "bom-ref": "5ddef33581fc183a", + "bom-ref": "c099e7945de063a6", "name": "/usr/share/X11/xkb/symbols/am", "type": "file" }, { - "bom-ref": "28aead376e54f495", + "bom-ref": "585d2609c9149a91", "name": "/usr/share/X11/xkb/symbols/ancient", "type": "file" }, { - "bom-ref": "77bdd6573d030369", + "bom-ref": "24f844041b56ae19", "name": "/usr/share/X11/xkb/symbols/apl", "type": "file" }, { - "bom-ref": "9fbdbe472d8e5bc2", + "bom-ref": "24e1ad59ab246712", "name": "/usr/share/X11/xkb/symbols/ara", "type": "file" }, { - "bom-ref": "a130163e80d6384c", + "bom-ref": "4363a49dc52ccd94", "name": "/usr/share/X11/xkb/symbols/at", "type": "file" }, { - "bom-ref": "37db591c702628ba", + "bom-ref": "fd648702261d68ea", "name": "/usr/share/X11/xkb/symbols/au", "type": "file" }, { - "bom-ref": "2b8216a9d003284f", + "bom-ref": "8f66d8194a3f168b", "name": "/usr/share/X11/xkb/symbols/az", "type": "file" }, { - "bom-ref": "3a040d6055817e06", + "bom-ref": "e51eba9137c170be", "name": "/usr/share/X11/xkb/symbols/ba", "type": "file" }, { - "bom-ref": "79dcb9f96a4b866b", + "bom-ref": "67c73a442a80bb47", "name": "/usr/share/X11/xkb/symbols/bd", "type": "file" }, { - "bom-ref": "ee918050520d0f9d", + "bom-ref": "81d1dd4673262915", "name": "/usr/share/X11/xkb/symbols/be", "type": "file" }, { - "bom-ref": "18c29a9be055919d", + "bom-ref": "9339aefa6ae729c1", "name": "/usr/share/X11/xkb/symbols/bg", "type": "file" }, { - "bom-ref": "8c364e6287a6581c", + "bom-ref": "6cea4fa0c3ede5f4", "name": "/usr/share/X11/xkb/symbols/bqn", "type": "file" }, { - "bom-ref": "c8ce67e57d3d7742", + "bom-ref": "b23e659ab7356e4a", "name": "/usr/share/X11/xkb/symbols/br", "type": "file" }, { - "bom-ref": "42712533126f27e9", + "bom-ref": "b1db739206c29135", "name": "/usr/share/X11/xkb/symbols/brai", "type": "file" }, { - "bom-ref": "196587e264600eb4", + "bom-ref": "ea93bbf1350dab78", "name": "/usr/share/X11/xkb/symbols/bt", "type": "file" }, { - "bom-ref": "9fb3be5f2a362654", + "bom-ref": "4500a78b53dcdd64", "name": "/usr/share/X11/xkb/symbols/bw", "type": "file" }, { - "bom-ref": "f6e2f6274fec0e3d", + "bom-ref": "49cec337ef56edcd", "name": "/usr/share/X11/xkb/symbols/by", "type": "file" }, { - "bom-ref": "aca4053f73c77131", + "bom-ref": "8745f46f0c93032d", "name": "/usr/share/X11/xkb/symbols/ca", "type": "file" }, { - "bom-ref": "c7387079d2ba7f42", + "bom-ref": "ada0b8a939449916", "name": "/usr/share/X11/xkb/symbols/capslock", "type": "file" }, { - "bom-ref": "9fc591650418f9a2", + "bom-ref": "e90a3a2683a218ba", "name": "/usr/share/X11/xkb/symbols/cd", "type": "file" }, { - "bom-ref": "27f368e38b4325e9", + "bom-ref": "d7ff9252def9f949", "name": "/usr/share/X11/xkb/symbols/ch", "type": "file" }, { - "bom-ref": "f551fa224d9af270", + "bom-ref": "9cc6fd5e7736e810", "name": "/usr/share/X11/xkb/symbols/cm", "type": "file" }, { - "bom-ref": "4f1184704549b3da", + "bom-ref": "8157746470c28416", "name": "/usr/share/X11/xkb/symbols/cn", "type": "file" }, { - "bom-ref": "f4b42062e45724a8", + "bom-ref": "da9b7de16c58f0a4", "name": "/usr/share/X11/xkb/symbols/compose", "type": "file" }, { - "bom-ref": "bc7dcf416c9f7b5d", + "bom-ref": "0948990785814231", "name": "/usr/share/X11/xkb/symbols/ctrl", "type": "file" }, { - "bom-ref": "bfc18bfe7f336597", + "bom-ref": "b8acdd740c26ca57", "name": "/usr/share/X11/xkb/symbols/cz", "type": "file" }, { - "bom-ref": "4a36b1c49e47d59d", + "bom-ref": "734e4073883e9381", "name": "/usr/share/X11/xkb/symbols/de", "type": "file" }, { - "bom-ref": "7b9d92691acffe15", + "bom-ref": "87efc71f8c30cf21", "name": "/usr/share/X11/xkb/symbols/digital_vndr/lk", "type": "file" }, { - "bom-ref": "b3e6b305aeda0eb6", + "bom-ref": "98ee19e19d80d53e", "name": "/usr/share/X11/xkb/symbols/digital_vndr/pc", "type": "file" }, { - "bom-ref": "d25a932db24452fc", + "bom-ref": "fd56c5bc827c9c24", "name": "/usr/share/X11/xkb/symbols/digital_vndr/us", "type": "file" }, { - "bom-ref": "6d642026bd4eb211", + "bom-ref": "10b7d95d5aa35645", "name": "/usr/share/X11/xkb/symbols/digital_vndr/vt", "type": "file" }, { - "bom-ref": "e5a2c6b999a4897d", + "bom-ref": "b5512ff9b7f6c745", "name": "/usr/share/X11/xkb/symbols/dk", "type": "file" }, { - "bom-ref": "6ddef6bc4df4323d", + "bom-ref": "24391b5a9c4689a5", "name": "/usr/share/X11/xkb/symbols/dz", "type": "file" }, { - "bom-ref": "a9bfcd1a789e2895", + "bom-ref": "0dc0b525578cde65", "name": "/usr/share/X11/xkb/symbols/ee", "type": "file" }, { - "bom-ref": "dc63a1dca92866d7", + "bom-ref": "2eefc677e5380323", "name": "/usr/share/X11/xkb/symbols/eg", "type": "file" }, { - "bom-ref": "24ead27409c187b3", + "bom-ref": "acd43961f1883beb", "name": "/usr/share/X11/xkb/symbols/empty", "type": "file" }, { - "bom-ref": "430d16541464ce8a", + "bom-ref": "325226f182e83de6", "name": "/usr/share/X11/xkb/symbols/epo", "type": "file" }, { - "bom-ref": "f38bc711e197c0d3", + "bom-ref": "4b64eb2b51b17fd7", "name": "/usr/share/X11/xkb/symbols/es", "type": "file" }, { - "bom-ref": "e71835af6ce9d3b1", + "bom-ref": "e4421e2d0c374b19", "name": "/usr/share/X11/xkb/symbols/et", "type": "file" }, { - "bom-ref": "a201fc9eeb3ababd", + "bom-ref": "498ea351e456b0f5", "name": "/usr/share/X11/xkb/symbols/eu", "type": "file" }, { - "bom-ref": "531e3fbeba326952", + "bom-ref": "899cc9d1658092be", "name": "/usr/share/X11/xkb/symbols/eurosign", "type": "file" }, { - "bom-ref": "27099482ce059b8c", + "bom-ref": "dc0fc92c6b827ce4", "name": "/usr/share/X11/xkb/symbols/fi", "type": "file" }, { - "bom-ref": "60e66d72cbb9968a", + "bom-ref": "4cc0f91452a4c94e", "name": "/usr/share/X11/xkb/symbols/fo", "type": "file" }, { - "bom-ref": "3281ae18d1352e31", + "bom-ref": "dab05d44ca432439", "name": "/usr/share/X11/xkb/symbols/fr", "type": "file" }, { - "bom-ref": "620b2ab212ae753e", + "bom-ref": "7239e2f1e0a57396", "name": "/usr/share/X11/xkb/symbols/fujitsu_vndr/jp", "type": "file" }, { - "bom-ref": "fdc0adfcb8a6576e", + "bom-ref": "a8357a012b40f826", "name": "/usr/share/X11/xkb/symbols/fujitsu_vndr/us", "type": "file" }, { - "bom-ref": "7d01988dddd78734", + "bom-ref": "4ae9a242ff61e5d4", "name": "/usr/share/X11/xkb/symbols/gb", "type": "file" }, { - "bom-ref": "e14c5f90e4f9958c", + "bom-ref": "97a00b4d84232190", "name": "/usr/share/X11/xkb/symbols/ge", "type": "file" }, { - "bom-ref": "f981aaafb89d13cb", + "bom-ref": "a810ca276b8a0dcf", "name": "/usr/share/X11/xkb/symbols/gh", "type": "file" }, { - "bom-ref": "712255cfd42a2d84", + "bom-ref": "3f1d6a4a1256a1f0", "name": "/usr/share/X11/xkb/symbols/gn", "type": "file" }, { - "bom-ref": "7e79c46c298d786c", + "bom-ref": "53b0505905c01c38", "name": "/usr/share/X11/xkb/symbols/gr", "type": "file" }, { - "bom-ref": "6875d143cf4b3644", + "bom-ref": "058c2dee7ea4f404", "name": "/usr/share/X11/xkb/symbols/group", "type": "file" }, { - "bom-ref": "1887888d62b64cca", + "bom-ref": "3ddaaf52213bda96", "name": "/usr/share/X11/xkb/symbols/hp_vndr/us", "type": "file" }, { - "bom-ref": "e6146583198ac532", + "bom-ref": "8e0a6b6873d83f6a", "name": "/usr/share/X11/xkb/symbols/hr", "type": "file" }, { - "bom-ref": "e2a10c67d7724124", + "bom-ref": "55de14655f4fd3ec", "name": "/usr/share/X11/xkb/symbols/hu", "type": "file" }, { - "bom-ref": "4765117b75a4054d", + "bom-ref": "823915e990d247b5", "name": "/usr/share/X11/xkb/symbols/id", "type": "file" }, { - "bom-ref": "0cac6fcf94864245", + "bom-ref": "e55be87d537dd291", "name": "/usr/share/X11/xkb/symbols/ie", "type": "file" }, { - "bom-ref": "05447cbb6507c7e6", + "bom-ref": "8377fa2831ed9b2a", "name": "/usr/share/X11/xkb/symbols/il", "type": "file" }, { - "bom-ref": "c9d355dd674e0f23", + "bom-ref": "4c376017a573fcb7", "name": "/usr/share/X11/xkb/symbols/in", "type": "file" }, { - "bom-ref": "313481d4dab471f0", + "bom-ref": "47f763bf7e550a0c", "name": "/usr/share/X11/xkb/symbols/inet", "type": "file" }, { - "bom-ref": "0c265a0939bcd47c", + "bom-ref": "5fccc6a1841c5e2c", "name": "/usr/share/X11/xkb/symbols/iq", "type": "file" }, { - "bom-ref": "938b8eb79b2944e5", + "bom-ref": "90af34c5623e661d", "name": "/usr/share/X11/xkb/symbols/ir", "type": "file" }, { - "bom-ref": "6d2cef783994a7c8", + "bom-ref": "7334228b1e0d2abc", "name": "/usr/share/X11/xkb/symbols/is", "type": "file" }, { - "bom-ref": "b94403f4d5b59bf5", + "bom-ref": "0442d2c4acca1cad", "name": "/usr/share/X11/xkb/symbols/it", "type": "file" }, { - "bom-ref": "55cf7367d12e0bb0", + "bom-ref": "1d92c8834b8100f8", "name": "/usr/share/X11/xkb/symbols/jolla_vndr/sbj", "type": "file" }, { - "bom-ref": "24c88251c99c6d13", + "bom-ref": "e235ceb6566c2633", "name": "/usr/share/X11/xkb/symbols/jp", "type": "file" }, { - "bom-ref": "fa9319db3f7e6390", + "bom-ref": "81ffb55056422ad0", "name": "/usr/share/X11/xkb/symbols/ke", "type": "file" }, { - "bom-ref": "903c92a6b4c921fe", + "bom-ref": "096861f9beee1be6", "name": "/usr/share/X11/xkb/symbols/keypad", "type": "file" }, { - "bom-ref": "6fab09bc964d9187", + "bom-ref": "08e25cd89c2dd1b3", "name": "/usr/share/X11/xkb/symbols/kg", "type": "file" }, { - "bom-ref": "62d23557fd46b028", + "bom-ref": "9229008b877f4a30", "name": "/usr/share/X11/xkb/symbols/kh", "type": "file" }, { - "bom-ref": "30e960b7625b4585", + "bom-ref": "234ad4ea6b9f1539", "name": "/usr/share/X11/xkb/symbols/kpdl", "type": "file" }, { - "bom-ref": "82beda9b0dd31fbf", + "bom-ref": "040e0d0d7df6a21f", "name": "/usr/share/X11/xkb/symbols/kr", "type": "file" }, { - "bom-ref": "7af2390d2f44e828", + "bom-ref": "f9682824aac9ce90", "name": "/usr/share/X11/xkb/symbols/kz", "type": "file" }, { - "bom-ref": "a3e508d5bf211ab2", + "bom-ref": "ba3c49c4112fec8e", "name": "/usr/share/X11/xkb/symbols/la", "type": "file" }, { - "bom-ref": "613a1854c874971a", + "bom-ref": "167608dcd7843f1a", "name": "/usr/share/X11/xkb/symbols/latam", "type": "file" }, { - "bom-ref": "6f6d81d085a50ec9", + "bom-ref": "3c50b3d6963e125d", "name": "/usr/share/X11/xkb/symbols/latin", "type": "file" }, { - "bom-ref": "714fe33e08533efc", + "bom-ref": "9a7dbfcb49c37bd0", "name": "/usr/share/X11/xkb/symbols/level2", "type": "file" }, { - "bom-ref": "7e6f1ef53c04fde1", + "bom-ref": "039811a85e728039", "name": "/usr/share/X11/xkb/symbols/level3", "type": "file" }, { - "bom-ref": "818b354df1d29dd3", + "bom-ref": "59f793db305b4d43", "name": "/usr/share/X11/xkb/symbols/level5", "type": "file" }, { - "bom-ref": "116947d87f9f58dc", + "bom-ref": "1caa4ccb772e9a98", "name": "/usr/share/X11/xkb/symbols/lk", "type": "file" }, { - "bom-ref": "b0cd2541566d0e3c", + "bom-ref": "afbf407ae05c7894", "name": "/usr/share/X11/xkb/symbols/lt", "type": "file" }, { - "bom-ref": "61926d9b9748a9a0", + "bom-ref": "115864fd903dafa8", "name": "/usr/share/X11/xkb/symbols/lv", "type": "file" }, { - "bom-ref": "37bf0450da7ba9be", + "bom-ref": "6c301af49f68c85e", "name": "/usr/share/X11/xkb/symbols/ma", "type": "file" }, { - "bom-ref": "b2a6451825d590de", + "bom-ref": "2b64c7417af9008a", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/apple", "type": "file" }, { - "bom-ref": "3a51a0cedf9c0bf9", + "bom-ref": "4bed44d0e8f6303d", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/ch", "type": "file" }, { - "bom-ref": "2466e9d9c3e30de0", + "bom-ref": "2d66b8a4c983e9c0", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/de", "type": "file" }, { - "bom-ref": "b15c210128787d25", + "bom-ref": "78fca91258f6b6d1", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/dk", "type": "file" }, { - "bom-ref": "0cec2fea0b2a7e02", + "bom-ref": "df1faaf7ba2df8fe", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/fi", "type": "file" }, { - "bom-ref": "314375436a6168ce", + "bom-ref": "3e945eeefc6a5126", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/fr", "type": "file" }, { - "bom-ref": "77bd7ef08e7f741a", + "bom-ref": "05e3e49a4958b236", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/gb", "type": "file" }, { - "bom-ref": "4fcfe6024ffb968e", + "bom-ref": "94b8ac56ae4a85b6", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/is", "type": "file" }, { - "bom-ref": "d8d8b548bfbccba6", + "bom-ref": "1a3849d770270032", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/it", "type": "file" }, { - "bom-ref": "6cb71f13f8378ae6", + "bom-ref": "e8ac983320f10206", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/jp", "type": "file" }, { - "bom-ref": "8ba04dd20a2d7e5a", + "bom-ref": "e827f5bfe0004c2a", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/latam", "type": "file" }, { - "bom-ref": "c5a01ce67bbf4671", + "bom-ref": "a3ec3cc0de4fe119", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/nl", "type": "file" }, { - "bom-ref": "1be78046cf872752", + "bom-ref": "71e642328af90812", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/no", "type": "file" }, { - "bom-ref": "4e140cc76e1c1122", + "bom-ref": "f52a8c0ec32fe692", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/pt", "type": "file" }, { - "bom-ref": "0f64cd7beadf07a6", + "bom-ref": "69c90c6b33479772", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/se", "type": "file" }, { - "bom-ref": "63c72e22e0cbed9e", + "bom-ref": "a6e30dc4d0122432", "name": "/usr/share/X11/xkb/symbols/macintosh_vndr/us", "type": "file" }, { - "bom-ref": "d54ebc3b73f44310", + "bom-ref": "dc879fa353b84358", "name": "/usr/share/X11/xkb/symbols/md", "type": "file" }, { - "bom-ref": "50ed07a5ed8c1902", + "bom-ref": "ac9b753912d67512", "name": "/usr/share/X11/xkb/symbols/me", "type": "file" }, { - "bom-ref": "0bd3719b73e61501", + "bom-ref": "4a30ba0c3b10cb09", "name": "/usr/share/X11/xkb/symbols/mk", "type": "file" }, { - "bom-ref": "577031906136d645", + "bom-ref": "bd6425fff58ac1b1", "name": "/usr/share/X11/xkb/symbols/ml", "type": "file" }, { - "bom-ref": "1df377d517ba75b6", + "bom-ref": "a5d2262118101f3a", "name": "/usr/share/X11/xkb/symbols/mm", "type": "file" }, { - "bom-ref": "03c7d535232d7faa", + "bom-ref": "fd8fc299a0659002", "name": "/usr/share/X11/xkb/symbols/mn", "type": "file" }, { - "bom-ref": "2aced76ccc231ecd", + "bom-ref": "8c3dadff8864888d", "name": "/usr/share/X11/xkb/symbols/mt", "type": "file" }, { - "bom-ref": "e2487a3b15e4b2b1", + "bom-ref": "d5f4bf60c714cc7d", "name": "/usr/share/X11/xkb/symbols/mv", "type": "file" }, { - "bom-ref": "aee7d750f5e4852a", + "bom-ref": "a6cf8eb978038bba", "name": "/usr/share/X11/xkb/symbols/my", "type": "file" }, { - "bom-ref": "a71c36a7a22c6679", + "bom-ref": "c3634c01d69ec4e5", "name": "/usr/share/X11/xkb/symbols/nbsp", "type": "file" }, { - "bom-ref": "e80866bd19ff1548", + "bom-ref": "fbdf000afe30a88c", "name": "/usr/share/X11/xkb/symbols/nec_vndr/jp", "type": "file" }, { - "bom-ref": "6fd8d5af8d685f2a", + "bom-ref": "3da769c7e78a2a9a", "name": "/usr/share/X11/xkb/symbols/ng", "type": "file" }, { - "bom-ref": "c4db068b22cee8cf", + "bom-ref": "b1a59a589410cffb", "name": "/usr/share/X11/xkb/symbols/nl", "type": "file" }, { - "bom-ref": "c6cbf80f7be36a21", + "bom-ref": "c551364f9f8d6fb5", "name": "/usr/share/X11/xkb/symbols/no", "type": "file" }, { - "bom-ref": "cecceb11c3fe64c4", + "bom-ref": "1a8fcf12b308e654", "name": "/usr/share/X11/xkb/symbols/nokia_vndr/rx-44", "type": "file" }, { - "bom-ref": "12e53b61daf2874b", + "bom-ref": "35899f31d132e49f", "name": "/usr/share/X11/xkb/symbols/nokia_vndr/rx-51", "type": "file" }, { - "bom-ref": "5d23aab06a1274fb", + "bom-ref": "9e0fd6d3b28484df", "name": "/usr/share/X11/xkb/symbols/nokia_vndr/su-8w", "type": "file" }, { - "bom-ref": "cb303fdc8ce93302", + "bom-ref": "1664dda7d16e7ae6", "name": "/usr/share/X11/xkb/symbols/np", "type": "file" }, { - "bom-ref": "537dad207757605b", + "bom-ref": "877b575a2d35c2cf", "name": "/usr/share/X11/xkb/symbols/nz", "type": "file" }, { - "bom-ref": "110e29fdd1452962", + "bom-ref": "f5eff0ae1f2b1636", "name": "/usr/share/X11/xkb/symbols/olpc", "type": "file" }, { - "bom-ref": "6bc4160f70ca44ab", + "bom-ref": "3deda8aa41edfeaf", "name": "/usr/share/X11/xkb/symbols/parens", "type": "file" }, { - "bom-ref": "1a9df796848fe1a5", + "bom-ref": "7f97c93afb4ab809", "name": "/usr/share/X11/xkb/symbols/pc", "type": "file" }, { - "bom-ref": "18ca5b2bebe23154", + "bom-ref": "86644d078dc6f0e8", "name": "/usr/share/X11/xkb/symbols/ph", "type": "file" }, { - "bom-ref": "7068682eb66ea921", + "bom-ref": "2c06634e4a229375", "name": "/usr/share/X11/xkb/symbols/pk", "type": "file" }, { - "bom-ref": "bdb1477f0c381d55", + "bom-ref": "8280c4cd45a9dee1", "name": "/usr/share/X11/xkb/symbols/pl", "type": "file" }, { - "bom-ref": "7d7b1631da79e97a", + "bom-ref": "a0c5237f69fdf106", "name": "/usr/share/X11/xkb/symbols/pt", "type": "file" }, { - "bom-ref": "9da3806e05b1d80f", + "bom-ref": "81914a639db30793", "name": "/usr/share/X11/xkb/symbols/ro", "type": "file" }, { - "bom-ref": "53d233019c7c65c4", + "bom-ref": "bbe07e9792ae8544", "name": "/usr/share/X11/xkb/symbols/rs", "type": "file" }, { - "bom-ref": "08bf68d94aefd0f4", + "bom-ref": "c0f739c0e1037b20", "name": "/usr/share/X11/xkb/symbols/ru", "type": "file" }, { - "bom-ref": "f1c4a28bf34c8f81", + "bom-ref": "a5c5948bc721e2e1", "name": "/usr/share/X11/xkb/symbols/rupeesign", "type": "file" }, { - "bom-ref": "9d08df6fc1fe4faf", + "bom-ref": "3a71f1bbe178e3c3", "name": "/usr/share/X11/xkb/symbols/se", "type": "file" }, { - "bom-ref": "14fac87c35ac221e", + "bom-ref": "e5a255169df79eda", "name": "/usr/share/X11/xkb/symbols/sgi_vndr/jp", "type": "file" }, { - "bom-ref": "54a47ed3c70dc14b", + "bom-ref": "10b72de17c9b6337", "name": "/usr/share/X11/xkb/symbols/sharp_vndr/sl-c3x00", "type": "file" }, { - "bom-ref": "5cf60c24d4d69148", + "bom-ref": "c8a4ecdf60f7d2f0", "name": "/usr/share/X11/xkb/symbols/sharp_vndr/ws003sh", "type": "file" }, { - "bom-ref": "8df4f4769acc24b5", + "bom-ref": "f6c5d57ead787981", "name": "/usr/share/X11/xkb/symbols/sharp_vndr/ws007sh", "type": "file" }, { - "bom-ref": "400bc37456fc9411", + "bom-ref": "2f158a410928f425", "name": "/usr/share/X11/xkb/symbols/sharp_vndr/ws011sh", "type": "file" }, { - "bom-ref": "62df5645156ffe42", + "bom-ref": "5a17570959a796be", "name": "/usr/share/X11/xkb/symbols/sharp_vndr/ws020sh", "type": "file" }, { - "bom-ref": "1568efe42683325a", + "bom-ref": "5291b335ae21b94e", "name": "/usr/share/X11/xkb/symbols/shift", "type": "file" }, { - "bom-ref": "9aaee77b4ae3e39b", + "bom-ref": "5953d0ad762ea85b", "name": "/usr/share/X11/xkb/symbols/si", "type": "file" }, { - "bom-ref": "54f44daf01d18872", + "bom-ref": "e2e77409c3893c1a", "name": "/usr/share/X11/xkb/symbols/sk", "type": "file" }, { - "bom-ref": "484dc963ced6dfab", + "bom-ref": "b4fbb4d1ee0809db", "name": "/usr/share/X11/xkb/symbols/sn", "type": "file" }, { - "bom-ref": "7dceb9b02f353842", + "bom-ref": "bc1f6824aad28c5a", "name": "/usr/share/X11/xkb/symbols/sony_vndr/us", "type": "file" }, { - "bom-ref": "91dc86413f0efdc3", + "bom-ref": "6b617d25949f8e6b", "name": "/usr/share/X11/xkb/symbols/srvr_ctrl", "type": "file" }, { - "bom-ref": "9a641cc000f66312", + "bom-ref": "2c758acf2af8aa42", "name": "/usr/share/X11/xkb/symbols/sun_vndr/ara", "type": "file" }, { - "bom-ref": "91825d36bd4a786f", + "bom-ref": "36d1b6d01bbafbd7", "name": "/usr/share/X11/xkb/symbols/sun_vndr/be", "type": "file" }, { - "bom-ref": "cc2dee5eae10fa1a", + "bom-ref": "75fab912c54c3692", "name": "/usr/share/X11/xkb/symbols/sun_vndr/br", "type": "file" }, { - "bom-ref": "0185b87b006d389a", + "bom-ref": "287eabb59f98e59a", "name": "/usr/share/X11/xkb/symbols/sun_vndr/ca", "type": "file" }, { - "bom-ref": "6da5efebd35dd03b", + "bom-ref": "bb3e8093e120a107", "name": "/usr/share/X11/xkb/symbols/sun_vndr/ch", "type": "file" }, { - "bom-ref": "d38b5afc6fe5b85a", + "bom-ref": "76dc4b403567f312", "name": "/usr/share/X11/xkb/symbols/sun_vndr/cz", "type": "file" }, { - "bom-ref": "d75724483ed50b7d", + "bom-ref": "119614ac00b0d701", "name": "/usr/share/X11/xkb/symbols/sun_vndr/de", "type": "file" }, { - "bom-ref": "f42c4bf73d2553e2", + "bom-ref": "a5e8489ee68b3282", "name": "/usr/share/X11/xkb/symbols/sun_vndr/dk", "type": "file" }, { - "bom-ref": "b2f8c9692c46cb91", + "bom-ref": "65ca5c8d2244c1bd", "name": "/usr/share/X11/xkb/symbols/sun_vndr/ee", "type": "file" }, { - "bom-ref": "0360d7b2a5053a55", + "bom-ref": "9faaf264558f8ff1", "name": "/usr/share/X11/xkb/symbols/sun_vndr/es", "type": "file" }, { - "bom-ref": "605235863cbff128", + "bom-ref": "f8475688438777a8", "name": "/usr/share/X11/xkb/symbols/sun_vndr/fi", "type": "file" }, { - "bom-ref": "8ff781d065a33f8e", + "bom-ref": "86d172d636d64f3e", "name": "/usr/share/X11/xkb/symbols/sun_vndr/fr", "type": "file" }, { - "bom-ref": "729bb871ecf13afd", + "bom-ref": "37da8f15418935ad", "name": "/usr/share/X11/xkb/symbols/sun_vndr/gb", "type": "file" }, { - "bom-ref": "9c0c3de9871bf3d4", + "bom-ref": "5a6adefbc594a110", "name": "/usr/share/X11/xkb/symbols/sun_vndr/gr", "type": "file" }, { - "bom-ref": "3ac3fc0426c9c7f4", + "bom-ref": "8b48fd18adb38b10", "name": "/usr/share/X11/xkb/symbols/sun_vndr/it", "type": "file" }, { - "bom-ref": "de0fff77480d8948", + "bom-ref": "871ec7ec019bc2c8", "name": "/usr/share/X11/xkb/symbols/sun_vndr/jp", "type": "file" }, { - "bom-ref": "6cd76ff99b40a540", + "bom-ref": "b14d67270aa0be78", "name": "/usr/share/X11/xkb/symbols/sun_vndr/kr", "type": "file" }, { - "bom-ref": "7501f4d4a586cf1f", + "bom-ref": "907f52494103b217", "name": "/usr/share/X11/xkb/symbols/sun_vndr/lt", "type": "file" }, { - "bom-ref": "d22795d4e18a681a", + "bom-ref": "3d1acafe77cd430e", "name": "/usr/share/X11/xkb/symbols/sun_vndr/lv", "type": "file" }, { - "bom-ref": "975bf931f8440e60", + "bom-ref": "7b6f4beeef11da14", "name": "/usr/share/X11/xkb/symbols/sun_vndr/nl", "type": "file" }, { - "bom-ref": "af9c8bfdb4d2b257", + "bom-ref": "7f020aea6531cc6b", "name": "/usr/share/X11/xkb/symbols/sun_vndr/no", "type": "file" }, { - "bom-ref": "58952c5441e3e579", + "bom-ref": "509ea322301da4fd", "name": "/usr/share/X11/xkb/symbols/sun_vndr/pl", "type": "file" }, { - "bom-ref": "9ca5d47d934802f7", + "bom-ref": "f2509cc5c674c9eb", "name": "/usr/share/X11/xkb/symbols/sun_vndr/pt", "type": "file" }, { - "bom-ref": "b0a936f38616e1c1", + "bom-ref": "dab4bbc3c842a3d9", "name": "/usr/share/X11/xkb/symbols/sun_vndr/ro", "type": "file" }, { - "bom-ref": "c9c7023efef6ce9b", + "bom-ref": "6d9878353ced2213", "name": "/usr/share/X11/xkb/symbols/sun_vndr/ru", "type": "file" }, { - "bom-ref": "461861df8e89e31a", + "bom-ref": "f33c9bfb291e4dae", "name": "/usr/share/X11/xkb/symbols/sun_vndr/se", "type": "file" }, { - "bom-ref": "fedc2500f44fbc7c", + "bom-ref": "b38b1fc7bf1deb38", "name": "/usr/share/X11/xkb/symbols/sun_vndr/sk", "type": "file" }, { - "bom-ref": "868e7155ce08b9d4", + "bom-ref": "abc9fabc9c1b3e78", "name": "/usr/share/X11/xkb/symbols/sun_vndr/solaris", "type": "file" }, { - "bom-ref": "99cdc52c12e8b5b6", + "bom-ref": "79ce5788e355331a", "name": "/usr/share/X11/xkb/symbols/sun_vndr/tr", "type": "file" }, { - "bom-ref": "90b7d489cf5ff493", + "bom-ref": "ca5059289a17dfb3", "name": "/usr/share/X11/xkb/symbols/sun_vndr/tw", "type": "file" }, { - "bom-ref": "ec3989215f34cd64", + "bom-ref": "7a6cbbae31fdc350", "name": "/usr/share/X11/xkb/symbols/sun_vndr/ua", "type": "file" }, { - "bom-ref": "7e44b7449e27a893", + "bom-ref": "eecc58a1213e3547", "name": "/usr/share/X11/xkb/symbols/sun_vndr/us", "type": "file" }, { - "bom-ref": "f36703c51e21a9bb", + "bom-ref": "bae1b1dafdb6a83b", "name": "/usr/share/X11/xkb/symbols/sy", "type": "file" }, { - "bom-ref": "2f963adf8d73098d", + "bom-ref": "d195c012d581b049", "name": "/usr/share/X11/xkb/symbols/terminate", "type": "file" }, { - "bom-ref": "fe578ab265921df8", + "bom-ref": "6cb34f5f6cef8438", "name": "/usr/share/X11/xkb/symbols/tg", "type": "file" }, { - "bom-ref": "40a9f9897c2597d0", + "bom-ref": "bbeeac497681153c", "name": "/usr/share/X11/xkb/symbols/th", "type": "file" }, { - "bom-ref": "7e09f5a570384ff2", + "bom-ref": "a171f3e7f19961b6", "name": "/usr/share/X11/xkb/symbols/tj", "type": "file" }, { - "bom-ref": "725a7c9113a0129f", + "bom-ref": "dab25ba1d778b163", "name": "/usr/share/X11/xkb/symbols/tm", "type": "file" }, { - "bom-ref": "267f5874cb7b2749", + "bom-ref": "cfdf59412be66d19", "name": "/usr/share/X11/xkb/symbols/tr", "type": "file" }, { - "bom-ref": "cce3b920301a0dfd", + "bom-ref": "3f7a8264316e5485", "name": "/usr/share/X11/xkb/symbols/trans", "type": "file" }, { - "bom-ref": "f24645cfa6094c07", + "bom-ref": "211f473013c9c3eb", "name": "/usr/share/X11/xkb/symbols/tw", "type": "file" }, { - "bom-ref": "2cc3aedb18627b3e", + "bom-ref": "f622672b23207106", "name": "/usr/share/X11/xkb/symbols/typo", "type": "file" }, { - "bom-ref": "0385157d4fcc0c1f", + "bom-ref": "e0d5cacfec47fc4f", "name": "/usr/share/X11/xkb/symbols/tz", "type": "file" }, { - "bom-ref": "7870b86d3c247d90", + "bom-ref": "8517afd06af57758", "name": "/usr/share/X11/xkb/symbols/ua", "type": "file" }, { - "bom-ref": "0e9baf22a770f2ff", + "bom-ref": "4c002b0ea720604f", "name": "/usr/share/X11/xkb/symbols/us", "type": "file" }, { - "bom-ref": "16d2bbb6bde25111", + "bom-ref": "ee298177540c0ba5", "name": "/usr/share/X11/xkb/symbols/uz", "type": "file" }, { - "bom-ref": "09b2033aec72889b", + "bom-ref": "11599731911c4207", "name": "/usr/share/X11/xkb/symbols/vn", "type": "file" }, { - "bom-ref": "5f54a79af4d80d8c", + "bom-ref": "aabde59cf7d83e14", "name": "/usr/share/X11/xkb/symbols/xfree68_vndr/amiga", "type": "file" }, { - "bom-ref": "469be5bca8cf54f0", + "bom-ref": "cc4a7a0105f54838", "name": "/usr/share/X11/xkb/symbols/xfree68_vndr/ataritt", "type": "file" }, { - "bom-ref": "af68b471203a1c61", + "bom-ref": "149032f285821ccd", "name": "/usr/share/X11/xkb/symbols/za", "type": "file" }, { - "bom-ref": "9c5906f67ef94604", + "bom-ref": "378df030eb3a1814", "name": "/usr/share/X11/xkb/types/README", "type": "file" }, { - "bom-ref": "8d5ff4b3908f6125", + "bom-ref": "f0fec992a7f72291", "name": "/usr/share/X11/xkb/types/basic", "type": "file" }, { - "bom-ref": "132a790f7873a3d5", + "bom-ref": "989601e7a9d77d45", "name": "/usr/share/X11/xkb/types/cancel", "type": "file" }, { - "bom-ref": "c2ce1831b22158e3", + "bom-ref": "077e07327240bde3", "name": "/usr/share/X11/xkb/types/caps", "type": "file" }, { - "bom-ref": "9e7c8d503e178783", + "bom-ref": "bd22421242360cb3", "name": "/usr/share/X11/xkb/types/complete", "type": "file" }, { - "bom-ref": "407d85a5e94b303e", + "bom-ref": "25a846975b1c38b6", "name": "/usr/share/X11/xkb/types/default", "type": "file" }, { - "bom-ref": "46c2588480253fed", + "bom-ref": "c4e5ff391eac5e7d", "name": "/usr/share/X11/xkb/types/extra", "type": "file" }, { - "bom-ref": "ffcd00979fe58a0a", + "bom-ref": "cea20fd191d8c652", "name": "/usr/share/X11/xkb/types/iso9995", "type": "file" }, { - "bom-ref": "9ec15eb2f4131c8a", + "bom-ref": "c1044c45829a77fe", "name": "/usr/share/X11/xkb/types/level5", "type": "file" }, { - "bom-ref": "029cc2e2259cf79f", + "bom-ref": "8de1593088b48343", "name": "/usr/share/X11/xkb/types/mousekeys", "type": "file" }, { - "bom-ref": "880876a056201d46", + "bom-ref": "6fc8cf915dbc783e", "name": "/usr/share/X11/xkb/types/nokia", "type": "file" }, { - "bom-ref": "231abb1f5c881363", + "bom-ref": "efd55a43bed7ecef", "name": "/usr/share/X11/xkb/types/numpad", "type": "file" }, { - "bom-ref": "937ece960cd847f1", + "bom-ref": "9cccb53f36c8e061", "name": "/usr/share/X11/xkb/types/pc", "type": "file" }, { - "bom-ref": "65fac9a082765435", + "bom-ref": "f6010cc7e0ee05dd", "name": "/usr/share/aclocal/expat.m4", "type": "file" }, { - "bom-ref": "1a807daa2519858e", + "bom-ref": "84680d9943f7c802", "name": "/usr/share/alsa/alsa.conf", "type": "file" }, { - "bom-ref": "57cb500e179634d0", + "bom-ref": "e445ee964f7b12d0", "name": "/usr/share/alsa/cards/AACI.conf", "type": "file" }, { - "bom-ref": "ffb6417dca549159", + "bom-ref": "6425edaa462d009d", "name": "/usr/share/alsa/cards/ATIIXP-MODEM.conf", "type": "file" }, { - "bom-ref": "09657e4d1f8e2b81", + "bom-ref": "a5f4c6ce1c69d445", "name": "/usr/share/alsa/cards/ATIIXP-SPDMA.conf", "type": "file" }, { - "bom-ref": "321061ea6dfe796b", + "bom-ref": "853ba04cb04e03c7", "name": "/usr/share/alsa/cards/ATIIXP.conf", "type": "file" }, { - "bom-ref": "158235d27ddf713f", + "bom-ref": "3958699071b35aa3", "name": "/usr/share/alsa/cards/AU8810.conf", "type": "file" }, { - "bom-ref": "268f1ff47b96e2c8", + "bom-ref": "2ec2aa1574733bc4", "name": "/usr/share/alsa/cards/AU8820.conf", "type": "file" }, { - "bom-ref": "5a0fae3a30f7ce15", + "bom-ref": "dd91c2f22acb7341", "name": "/usr/share/alsa/cards/AU8830.conf", "type": "file" }, { - "bom-ref": "cc27cc9e07fd4958", + "bom-ref": "7d59bf444e35775c", "name": "/usr/share/alsa/cards/Audigy.conf", "type": "file" }, { - "bom-ref": "a588242e7db6ec06", + "bom-ref": "bd6f9c95ab887632", "name": "/usr/share/alsa/cards/Audigy2.conf", "type": "file" }, { - "bom-ref": "686af78e851abdf6", + "bom-ref": "1c84000ab7e3220e", "name": "/usr/share/alsa/cards/Aureon51.conf", "type": "file" }, { - "bom-ref": "f9cf8e01eb4d6548", + "bom-ref": "18dcd3225f0af090", "name": "/usr/share/alsa/cards/Aureon71.conf", "type": "file" }, { - "bom-ref": "4c2d2e8ea890896b", + "bom-ref": "033fff12a203a927", "name": "/usr/share/alsa/cards/CA0106.conf", "type": "file" }, { - "bom-ref": "828646d66cd14309", + "bom-ref": "cbf3a7e0b7c12191", "name": "/usr/share/alsa/cards/CMI8338-SWIEC.conf", "type": "file" }, { - "bom-ref": "df5b6fda953f61a3", + "bom-ref": "a58a71303260beff", "name": "/usr/share/alsa/cards/CMI8338.conf", "type": "file" }, { - "bom-ref": "76b8ed20de1f718a", + "bom-ref": "a8ca98cb4d4a9a5a", "name": "/usr/share/alsa/cards/CMI8738-MC6.conf", "type": "file" }, { - "bom-ref": "67718d22b63d7c90", + "bom-ref": "1f3a227a47646200", "name": "/usr/share/alsa/cards/CMI8738-MC8.conf", "type": "file" }, { - "bom-ref": "a62464ce0fdc5822", + "bom-ref": "56caa98bb899ea4e", "name": "/usr/share/alsa/cards/CMI8788.conf", "type": "file" }, { - "bom-ref": "7eb342760221c397", + "bom-ref": "bd0c6523929ce757", "name": "/usr/share/alsa/cards/CS46xx.conf", "type": "file" }, { - "bom-ref": "ef7ed9fbc0561732", + "bom-ref": "c991beee71e0c8a2", "name": "/usr/share/alsa/cards/EMU10K1.conf", "type": "file" }, { - "bom-ref": "93f63521071da8d4", + "bom-ref": "37e4d8c7b59bca80", "name": "/usr/share/alsa/cards/EMU10K1X.conf", "type": "file" }, { - "bom-ref": "54f8e9bed9478246", + "bom-ref": "dd4cd3182390041a", "name": "/usr/share/alsa/cards/ENS1370.conf", "type": "file" }, { - "bom-ref": "f0ea392d8b194148", + "bom-ref": "90caac3d865309b8", "name": "/usr/share/alsa/cards/ENS1371.conf", "type": "file" }, { - "bom-ref": "9082d08187b36013", + "bom-ref": "f8716c5a22961be7", "name": "/usr/share/alsa/cards/ES1968.conf", "type": "file" }, { - "bom-ref": "8c0008801a5ec773", + "bom-ref": "aa8cbdded612c753", "name": "/usr/share/alsa/cards/Echo_Echo3G.conf", "type": "file" }, { - "bom-ref": "2388c467e98097de", + "bom-ref": "2423dacc524e943e", "name": "/usr/share/alsa/cards/FM801.conf", "type": "file" }, { - "bom-ref": "2e434f753f7621ef", + "bom-ref": "5e98f65cfb22e14b", "name": "/usr/share/alsa/cards/FWSpeakers.conf", "type": "file" }, { - "bom-ref": "ca987ded25d13c34", + "bom-ref": "bf5fdc6a7d761918", "name": "/usr/share/alsa/cards/FireWave.conf", "type": "file" }, { - "bom-ref": "7ca4b2d2b6d68935", + "bom-ref": "9a1345fb9006cf59", "name": "/usr/share/alsa/cards/GUS.conf", "type": "file" }, { - "bom-ref": "081081a3535a1858", + "bom-ref": "cb793c9df208cacc", "name": "/usr/share/alsa/cards/HDA-Intel.conf", "type": "file" }, { - "bom-ref": "0cf09615f78a5c6f", + "bom-ref": "ae6d12cd5b33b79b", "name": "/usr/share/alsa/cards/HdmiLpeAudio.conf", "type": "file" }, { - "bom-ref": "6b1f8c14a716a3ba", + "bom-ref": "96c1e84833c932d2", "name": "/usr/share/alsa/cards/ICE1712.conf", "type": "file" }, { - "bom-ref": "b6884f691cbcd076", + "bom-ref": "06c3051ed179e09a", "name": "/usr/share/alsa/cards/ICE1724.conf", "type": "file" }, { - "bom-ref": "a50a5230b81ca992", + "bom-ref": "713d307f18c01f36", "name": "/usr/share/alsa/cards/ICH-MODEM.conf", "type": "file" }, { - "bom-ref": "92fa3738f0839f8b", + "bom-ref": "a1acfc5467e770cf", "name": "/usr/share/alsa/cards/ICH.conf", "type": "file" }, { - "bom-ref": "57b7a270aaeaf850", + "bom-ref": "d69475f57da2c608", "name": "/usr/share/alsa/cards/ICH4.conf", "type": "file" }, { - "bom-ref": "4e563a941c7c7e85", + "bom-ref": "521482c81d7b86fd", "name": "/usr/share/alsa/cards/Loopback.conf", "type": "file" }, { - "bom-ref": "5c1a523c40e259e2", + "bom-ref": "64602f8c4bfadc72", "name": "/usr/share/alsa/cards/Maestro3.conf", "type": "file" }, { - "bom-ref": "483324e54e919b06", + "bom-ref": "9409d178ec9543a6", "name": "/usr/share/alsa/cards/NFORCE.conf", "type": "file" }, { - "bom-ref": "b16f889cce5e93fd", + "bom-ref": "18a829aaf5ef4305", "name": "/usr/share/alsa/cards/PC-Speaker.conf", "type": "file" }, { - "bom-ref": "54c95bce31b213fc", + "bom-ref": "7f6f46de7c81e684", "name": "/usr/share/alsa/cards/PMac.conf", "type": "file" }, { - "bom-ref": "cdd2d9bb72a2590c", + "bom-ref": "33fe6eab00604ccc", "name": "/usr/share/alsa/cards/PMacToonie.conf", "type": "file" }, { - "bom-ref": "c243e3c6322d2306", + "bom-ref": "9135697d692350de", "name": "/usr/share/alsa/cards/PS3.conf", "type": "file" }, { - "bom-ref": "bbd6c76182e202d1", + "bom-ref": "6d43ec3904b7cce1", "name": "/usr/share/alsa/cards/RME9636.conf", "type": "file" }, { - "bom-ref": "defc97445134bcbf", + "bom-ref": "7a6d5f4720dafba7", "name": "/usr/share/alsa/cards/RME9652.conf", "type": "file" }, { - "bom-ref": "6c9410ee961b73b1", + "bom-ref": "57e886ab7a58e58d", "name": "/usr/share/alsa/cards/SB-XFi.conf", "type": "file" }, { - "bom-ref": "a0e1286e176f96d6", + "bom-ref": "8c7e5102453b22c6", "name": "/usr/share/alsa/cards/SI7018.conf", "type": "file" }, { - "bom-ref": "66f261a2ec2fc816", + "bom-ref": "9e6d1608b7094fe6", "name": "/usr/share/alsa/cards/TRID4DWAVENX.conf", "type": "file" }, { - "bom-ref": "61bf965e1d710489", + "bom-ref": "5bb12be2a546a499", "name": "/usr/share/alsa/cards/USB-Audio.conf", "type": "file" }, { - "bom-ref": "294b9813acbfd048", + "bom-ref": "a3434b5ad3122078", "name": "/usr/share/alsa/cards/VIA686A.conf", "type": "file" }, { - "bom-ref": "d52ceec99d627e26", + "bom-ref": "566609d51af2219a", "name": "/usr/share/alsa/cards/VIA8233.conf", "type": "file" }, { - "bom-ref": "d13dfec99b7a67b5", + "bom-ref": "aff374e631d8f55d", "name": "/usr/share/alsa/cards/VIA8233A.conf", "type": "file" }, { - "bom-ref": "b75eca5f0ea21624", + "bom-ref": "7f49eb15ab306fc8", "name": "/usr/share/alsa/cards/VIA8237.conf", "type": "file" }, { - "bom-ref": "5afa5040455b1c1f", + "bom-ref": "f40f169c09889133", "name": "/usr/share/alsa/cards/VX222.conf", "type": "file" }, { - "bom-ref": "dfd37085a035d9b6", + "bom-ref": "5c40283dd036c4b2", "name": "/usr/share/alsa/cards/VXPocket.conf", "type": "file" }, { - "bom-ref": "0e45247951963b2f", + "bom-ref": "d33d05e13528308b", "name": "/usr/share/alsa/cards/VXPocket440.conf", "type": "file" }, { - "bom-ref": "d20d5318193d326a", + "bom-ref": "9aff1095c0a8927e", "name": "/usr/share/alsa/cards/YMF744.conf", "type": "file" }, { - "bom-ref": "3b8946f864c98432", + "bom-ref": "0a21a030304edd26", "name": "/usr/share/alsa/cards/aliases.conf", "type": "file" }, { - "bom-ref": "b5764b0005b76b06", + "bom-ref": "006467ba56dc7e26", "name": "/usr/share/alsa/cards/pistachio-card.conf", "type": "file" }, { - "bom-ref": "85970ef6099b28ab", + "bom-ref": "b65ee2597cb0c9a3", "name": "/usr/share/alsa/cards/vc4-hdmi.conf", "type": "file" }, { - "bom-ref": "7d222bbe91b84238", + "bom-ref": "b0bb33643cf90020", "name": "/usr/share/alsa/ctl/default.conf", "type": "file" }, { - "bom-ref": "0d1d583c3a58060b", + "bom-ref": "7d8de21c52a74007", "name": "/usr/share/alsa/pcm/center_lfe.conf", "type": "file" }, { - "bom-ref": "eba576653fcdf62d", + "bom-ref": "93dccbafa9f8c751", "name": "/usr/share/alsa/pcm/default.conf", "type": "file" }, { - "bom-ref": "59070e1155bf8ef6", + "bom-ref": "991883d09fc8f2b2", "name": "/usr/share/alsa/pcm/dmix.conf", "type": "file" }, { - "bom-ref": "6df5f50304211e4a", + "bom-ref": "672c01b8afa6ebe6", "name": "/usr/share/alsa/pcm/dpl.conf", "type": "file" }, { - "bom-ref": "e4b7c44f06102ab9", + "bom-ref": "47df0cc26db2482d", "name": "/usr/share/alsa/pcm/dsnoop.conf", "type": "file" }, { - "bom-ref": "0415dffa53820232", + "bom-ref": "9491b64084d8f892", "name": "/usr/share/alsa/pcm/front.conf", "type": "file" }, { - "bom-ref": "3be8df106eef1953", + "bom-ref": "9e267a39334ac07f", "name": "/usr/share/alsa/pcm/hdmi.conf", "type": "file" }, { - "bom-ref": "d5a6ae095aa47e5d", + "bom-ref": "ca8abf093b919595", "name": "/usr/share/alsa/pcm/iec958.conf", "type": "file" }, { - "bom-ref": "539c3d2fa283c398", + "bom-ref": "d7ebb4affb573fdc", "name": "/usr/share/alsa/pcm/modem.conf", "type": "file" }, { - "bom-ref": "e91a6ea901d33017", + "bom-ref": "09b8c9136442511f", "name": "/usr/share/alsa/pcm/rear.conf", "type": "file" }, { - "bom-ref": "89fd46fbb2927416", + "bom-ref": "c38f58f59b84d63a", "name": "/usr/share/alsa/pcm/side.conf", "type": "file" }, { - "bom-ref": "2324671f98ec43c0", + "bom-ref": "28204b870ba98d04", "name": "/usr/share/alsa/pcm/surround21.conf", "type": "file" }, { - "bom-ref": "54ebf2273c9ea7fd", + "bom-ref": "57f4496f0198ce91", "name": "/usr/share/alsa/pcm/surround40.conf", "type": "file" }, { - "bom-ref": "4185d94b0e68b6ca", + "bom-ref": "a3c57ac6930be546", "name": "/usr/share/alsa/pcm/surround41.conf", "type": "file" }, { - "bom-ref": "846321ddd7ae25bd", + "bom-ref": "3c3576f9dbab20ed", "name": "/usr/share/alsa/pcm/surround50.conf", "type": "file" }, { - "bom-ref": "51919d22134c6e00", + "bom-ref": "e2245f12290e5374", "name": "/usr/share/alsa/pcm/surround51.conf", "type": "file" }, { - "bom-ref": "be0ee941b83b3de0", + "bom-ref": "d9364922d62336bc", "name": "/usr/share/alsa/pcm/surround71.conf", "type": "file" }, { - "bom-ref": "4d3642b8453da2e5", + "bom-ref": "592005a8af761fbd", "name": "/usr/share/applications/python3.12.desktop", "type": "file" }, { - "bom-ref": "71cd0e97dcf594c4", + "bom-ref": "3b73c82bd7810258", "name": "/usr/share/applications/vim.desktop", "type": "file" }, { - "bom-ref": "49673fe04e78e3e4", + "bom-ref": "d481e1874697bd10", "name": "/usr/share/apport/package-hooks/source_fontconfig.py", "type": "file" }, { - "bom-ref": "bbec5c09a516d865", + "bom-ref": "48dad2672e42376f", "name": "/usr/share/apport/package-hooks/source_shadow.py", "type": "file" }, { - "bom-ref": "e06d1039a76312e7", + "bom-ref": "c7c0d257abb2b76d", "name": "/usr/share/apport/package-hooks/systemd.py", "type": "file" }, { - "bom-ref": "727e69982e86e235", + "bom-ref": "da123d79e0583505", "name": "/usr/share/apport/package-hooks/udev.py", "type": "file" }, { - "bom-ref": "2e3981c702aa7d76", + "bom-ref": "49ba91dd0201b9e0", "name": "/usr/share/base-files/dot.bashrc", "type": "file" }, { - "bom-ref": "2d21742ac9aa9e04", + "bom-ref": "e13ff97044ed8872", "name": "/usr/share/base-files/dot.profile", "type": "file" }, { - "bom-ref": "d0ce26beaef333f5", + "bom-ref": "0f968b5f3c83d0cf", "name": "/usr/share/base-files/dot.profile.md5sums", "type": "file" }, { - "bom-ref": "28dd1fe3e6865ccc", + "bom-ref": "d10714534d47a65e", "name": "/usr/share/base-files/info.dir", "type": "file" }, { - "bom-ref": "1cdc268f97c82680", + "bom-ref": "df1fde35726f5a46", "name": "/usr/share/base-files/motd", "type": "file" }, { - "bom-ref": "68abc4418c5c0644", + "bom-ref": "54d154489a454982", "name": "/usr/share/base-files/networks", "type": "file" }, { - "bom-ref": "e9bca239264d9f57", + "bom-ref": "e5f6161f5fe77e19", "name": "/usr/share/base-files/profile", "type": "file" }, { - "bom-ref": "1d37005c42893627", + "bom-ref": "94daf59c71b01bd5", "name": "/usr/share/base-files/profile.md5sums", "type": "file" }, { - "bom-ref": "ec0360f25baf11b4", + "bom-ref": "9b7ecf0ab13e8516", "name": "/usr/share/base-files/staff-group-for-usr-local", "type": "file" }, { - "bom-ref": "4d641337dad37018", + "bom-ref": "2598e85a85cba57a", "name": "/usr/share/base-passwd/group.master", "type": "file" }, { - "bom-ref": "033ef14afd202027", + "bom-ref": "aeb49cd7afa89bed", "name": "/usr/share/base-passwd/passwd.master", "type": "file" }, { - "bom-ref": "2867f164ad97a9f2", + "bom-ref": "4af5368504dab624", + "name": "/usr/share/bash-completion/completions/add-apt-repository", + "type": "file" + }, + { + "bom-ref": "12e8e92d2d17bd2a", "name": "/usr/share/bash-completion/completions/addpart", "type": "file" }, { - "bom-ref": "feb887601abeb281", + "bom-ref": "d5385356292cfc8f", "name": "/usr/share/bash-completion/completions/apt", "type": "file" }, { - "bom-ref": "3f17cab106d2c117", + "bom-ref": "2c4a92364d5dc83f", "name": "/usr/share/bash-completion/completions/blkdiscard", "type": "file" }, { - "bom-ref": "d292d4add1b28e5a", + "bom-ref": "3f6bc70dc2f36fbe", "name": "/usr/share/bash-completion/completions/blkid", "type": "file" }, { - "bom-ref": "a8013f7ec5e5b244", + "bom-ref": "7cb131c175f98808", "name": "/usr/share/bash-completion/completions/blkzone", "type": "file" }, { - "bom-ref": "a3de64dbdfc0ff72", + "bom-ref": "a697d8c04a655a8e", "name": "/usr/share/bash-completion/completions/blockdev", "type": "file" }, { - "bom-ref": "e9cd2a40e54fefc0", + "bom-ref": "6f3e570faf142be6", "name": "/usr/share/bash-completion/completions/busctl", "type": "file" }, { - "bom-ref": "9b6fccea7fb9541d", + "bom-ref": "6bac09076d2616a1", "name": "/usr/share/bash-completion/completions/chcpu", "type": "file" }, { - "bom-ref": "1e015e74b1af7135", + "bom-ref": "5aa88719026e5ac5", "name": "/usr/share/bash-completion/completions/chmem", "type": "file" }, { - "bom-ref": "c59278ccdc6a3448", + "bom-ref": "3af49d62d179c124", "name": "/usr/share/bash-completion/completions/chrt", "type": "file" }, { - "bom-ref": "de91aa4c3a5f294f", + "bom-ref": "0a83652eeeadd18b", "name": "/usr/share/bash-completion/completions/ctrlaltdel", "type": "file" }, { - "bom-ref": "7fa60af42d880370", + "bom-ref": "f08925126b36eef6", "name": "/usr/share/bash-completion/completions/debconf", "type": "file" }, { - "bom-ref": "3b26c4bf6212eecb", + "bom-ref": "4162fac3f3c2957f", "name": "/usr/share/bash-completion/completions/delpart", "type": "file" }, { - "bom-ref": "649d4ae01496335c", + "bom-ref": "158c0bdfa645284c", "name": "/usr/share/bash-completion/completions/dmesg", "type": "file" }, { - "bom-ref": "9be60c9a2fa5ff02", + "bom-ref": "0cb130f29e323aca", "name": "/usr/share/bash-completion/completions/fallocate", "type": "file" }, { - "bom-ref": "cfa4c2299e2b9dad", + "bom-ref": "7a779e24a3e3bfc9", "name": "/usr/share/bash-completion/completions/findfs", "type": "file" }, { - "bom-ref": "f64079acbfae4147", + "bom-ref": "5698d72d8fba5f03", "name": "/usr/share/bash-completion/completions/findmnt", "type": "file" }, { - "bom-ref": "f71854866e667e65", + "bom-ref": "f443341a8e380845", "name": "/usr/share/bash-completion/completions/flock", "type": "file" }, { - "bom-ref": "840a0d969a3d21db", + "bom-ref": "d985053470079bf3", "name": "/usr/share/bash-completion/completions/fsck", "type": "file" }, { - "bom-ref": "f884016ff126c723", + "bom-ref": "38c35159c5b7dccf", "name": "/usr/share/bash-completion/completions/fsck.cramfs", "type": "file" }, { - "bom-ref": "1ffdd6d43711b994", + "bom-ref": "24f54059ea6cd40c", "name": "/usr/share/bash-completion/completions/fsck.minix", "type": "file" }, { - "bom-ref": "a35f4aef3af4ce7d", + "bom-ref": "d25636c41e3e3871", "name": "/usr/share/bash-completion/completions/fsfreeze", "type": "file" }, { - "bom-ref": "36f559206d07e378", + "bom-ref": "dbb6856fed03ab60", "name": "/usr/share/bash-completion/completions/fstrim", "type": "file" }, { - "bom-ref": "8207c8907edb59bf", + "bom-ref": "2d1574a95e6b4e12", + "name": "/usr/share/bash-completion/completions/gapplication", + "type": "file" + }, + { + "bom-ref": "0be8126db720b29f", + "name": "/usr/share/bash-completion/completions/gdbus", + "type": "file" + }, + { + "bom-ref": "62bf8a75e53a61cf", "name": "/usr/share/bash-completion/completions/getopt", "type": "file" }, { - "bom-ref": "3a8292b66c84dfe5", + "bom-ref": "5646078818828b45", + "name": "/usr/share/bash-completion/completions/gio", + "type": "file" + }, + { + "bom-ref": "3b5136e07a14cb9d", "name": "/usr/share/bash-completion/completions/git", "type": "file" }, { - "bom-ref": "b84e3c72ae0831fc", + "bom-ref": "717cae15e82f0f6d", + "name": "/usr/share/bash-completion/completions/gresource", + "type": "file" + }, + { + "bom-ref": "7d4b0c75877fb63d", + "name": "/usr/share/bash-completion/completions/gsettings", + "type": "file" + }, + { + "bom-ref": "8c6687b5fbadd264", "name": "/usr/share/bash-completion/completions/hardlink", "type": "file" }, { - "bom-ref": "00936ec115c1eb73", + "bom-ref": "e31239518ba849d5", "name": "/usr/share/bash-completion/completions/hostnamectl", "type": "file" }, { - "bom-ref": "a6554d1a46ac0fa1", + "bom-ref": "39b209b82492eea5", "name": "/usr/share/bash-completion/completions/ionice", "type": "file" }, { - "bom-ref": "9634859c4fd032da", + "bom-ref": "f707327cef856dfa", "name": "/usr/share/bash-completion/completions/ipcmk", "type": "file" }, { - "bom-ref": "7af97229407c3da2", + "bom-ref": "9bbdec5420e7b1d6", "name": "/usr/share/bash-completion/completions/ipcrm", "type": "file" }, { - "bom-ref": "f87537df8814984c", + "bom-ref": "5e5c6cf1e9878ac4", "name": "/usr/share/bash-completion/completions/ipcs", "type": "file" }, { - "bom-ref": "23d6c6da8758c2a0", + "bom-ref": "be1a9b921c084464", "name": "/usr/share/bash-completion/completions/isosize", "type": "file" }, { - "bom-ref": "3381ee76f506fe0e", + "bom-ref": "b3968964cd8e9e9c", "name": "/usr/share/bash-completion/completions/journalctl", "type": "file" }, { - "bom-ref": "2e3ebf3117cf5374", + "bom-ref": "c0a90f1b8a57f0d6", "name": "/usr/share/bash-completion/completions/kernel-install", "type": "file" }, { - "bom-ref": "79d3dc5f263d1960", + "bom-ref": "0032fb7fbf94f0d8", "name": "/usr/share/bash-completion/completions/last", "type": "file" }, { - "bom-ref": "c2461fb1a9d5c6ca", + "bom-ref": "7fcc26dba1d75536", "name": "/usr/share/bash-completion/completions/ldattach", "type": "file" }, { - "bom-ref": "a33f681a9741bc81", + "bom-ref": "49179c43c262115f", "name": "/usr/share/bash-completion/completions/localectl", "type": "file" }, { - "bom-ref": "8098e7d8e8f42ed2", + "bom-ref": "a97d028e480975ba", "name": "/usr/share/bash-completion/completions/logger", "type": "file" }, { - "bom-ref": "92dc3b4de9d66b1c", + "bom-ref": "2fb3b16d53744672", "name": "/usr/share/bash-completion/completions/loginctl", "type": "file" }, { - "bom-ref": "999eaa7b19f3884f", + "bom-ref": "0a572b4772b4390f", "name": "/usr/share/bash-completion/completions/losetup", "type": "file" }, { - "bom-ref": "66be9071bf1887fd", + "bom-ref": "5a819c465b704e31", "name": "/usr/share/bash-completion/completions/lsblk", "type": "file" }, { - "bom-ref": "55182fe91e1f3ea9", + "bom-ref": "d06d2cc138bf7c7d", "name": "/usr/share/bash-completion/completions/lscpu", "type": "file" }, { - "bom-ref": "efecbcefabc122ef", + "bom-ref": "e33e1fa6a7ee12a3", "name": "/usr/share/bash-completion/completions/lsipc", "type": "file" }, { - "bom-ref": "1892a162f20fbc7a", + "bom-ref": "a3bebe414f8f5622", "name": "/usr/share/bash-completion/completions/lslocks", "type": "file" }, { - "bom-ref": "ae802798617156f7", + "bom-ref": "c9a5723ead70d39b", "name": "/usr/share/bash-completion/completions/lslogins", "type": "file" }, { - "bom-ref": "a156aa33a2ca6d23", + "bom-ref": "ec233539b725a623", "name": "/usr/share/bash-completion/completions/lsmem", "type": "file" }, { - "bom-ref": "1b12e02e20a29659", + "bom-ref": "f16a843fb61b41b9", "name": "/usr/share/bash-completion/completions/lsns", "type": "file" }, { - "bom-ref": "fd5aeaaa1ad66ed4", + "bom-ref": "0406c29d4e2006bc", "name": "/usr/share/bash-completion/completions/mcookie", "type": "file" }, { - "bom-ref": "7291fd6f1778131c", + "bom-ref": "2a46d77afd2ca44c", "name": "/usr/share/bash-completion/completions/mesg", "type": "file" }, { - "bom-ref": "c5188457f2a68e8b", + "bom-ref": "773c77b5bc8a580f", "name": "/usr/share/bash-completion/completions/mkfs", "type": "file" }, { - "bom-ref": "c070f9837b462d08", + "bom-ref": "25a346a615b5df7c", "name": "/usr/share/bash-completion/completions/mkfs.bfs", "type": "file" }, { - "bom-ref": "46a07b055f28a557", + "bom-ref": "f70a9a3e9b809f43", "name": "/usr/share/bash-completion/completions/mkfs.cramfs", "type": "file" }, { - "bom-ref": "ae39b6658e954c0f", + "bom-ref": "b85af9cb387efdb3", "name": "/usr/share/bash-completion/completions/mkfs.minix", "type": "file" }, { - "bom-ref": "ae8dddcceddb0bec", + "bom-ref": "58fc1845ec7ba818", "name": "/usr/share/bash-completion/completions/mkswap", "type": "file" }, { - "bom-ref": "842d2933c5be3710", + "bom-ref": "cd98198731e71810", "name": "/usr/share/bash-completion/completions/more", "type": "file" }, { - "bom-ref": "5f6589c66fa39603", + "bom-ref": "573e02bf8b44b717", "name": "/usr/share/bash-completion/completions/mount", "type": "file" }, { - "bom-ref": "ce17c5ba56922572", + "bom-ref": "b9e94fe53747c836", "name": "/usr/share/bash-completion/completions/mountpoint", "type": "file" }, { - "bom-ref": "8961a128b832c8e8", + "bom-ref": "f0fe8a4d570bf4f4", "name": "/usr/share/bash-completion/completions/namei", "type": "file" }, { - "bom-ref": "9071bc4750252a27", + "bom-ref": "9a42f55d6f9963f9", "name": "/usr/share/bash-completion/completions/networkctl", "type": "file" }, { - "bom-ref": "5f421ca1246ed315", + "bom-ref": "bcf8d400080f7e7d", "name": "/usr/share/bash-completion/completions/nsenter", "type": "file" }, { - "bom-ref": "b744edf38d0579a7", + "bom-ref": "06d5bba317ed7d23", "name": "/usr/share/bash-completion/completions/partx", "type": "file" }, { - "bom-ref": "dcf0db2d4b887235", + "bom-ref": "185aceaae7c4ef41", "name": "/usr/share/bash-completion/completions/pivot_root", "type": "file" }, { - "bom-ref": "e6de5fef7d75fc2e", + "bom-ref": "20fccb34d7962a7e", "name": "/usr/share/bash-completion/completions/prlimit", "type": "file" }, { - "bom-ref": "10301b6a3dcb8390", + "bom-ref": "2449ba503d17b314", "name": "/usr/share/bash-completion/completions/readprofile", "type": "file" }, { - "bom-ref": "a5064eb300c5edd7", + "bom-ref": "147d364b3e53ba2f", "name": "/usr/share/bash-completion/completions/renice", "type": "file" }, { - "bom-ref": "218d139a9fbd723e", + "bom-ref": "1cbdad0f08bf26da", "name": "/usr/share/bash-completion/completions/resizepart", "type": "file" }, { - "bom-ref": "fe4594193612b967", + "bom-ref": "34d5c10706743b0f", "name": "/usr/share/bash-completion/completions/rev", "type": "file" }, { - "bom-ref": "490d9ffccbd5d2e7", + "bom-ref": "83dbaaf21f5c1027", "name": "/usr/share/bash-completion/completions/rtcwake", "type": "file" }, { - "bom-ref": "29ae7c84372bc683", + "bom-ref": "870be8b6537dd9cb", "name": "/usr/share/bash-completion/completions/script", "type": "file" }, { - "bom-ref": "be5928323a6e08b1", + "bom-ref": "488bc0824741e469", "name": "/usr/share/bash-completion/completions/scriptlive", "type": "file" }, { - "bom-ref": "f0edb96d8df05e44", + "bom-ref": "1e9ffb895d0b75b0", "name": "/usr/share/bash-completion/completions/scriptreplay", "type": "file" }, { - "bom-ref": "f28fae8db5bd28bb", + "bom-ref": "aad1cd320b5ae9ab", "name": "/usr/share/bash-completion/completions/setarch", "type": "file" }, { - "bom-ref": "13bef07a2a4835df", + "bom-ref": "e53c1a2b13dc4783", "name": "/usr/share/bash-completion/completions/setpriv", "type": "file" }, { - "bom-ref": "9d459832e40c0a75", + "bom-ref": "c5ef8fb6de58f579", "name": "/usr/share/bash-completion/completions/setsid", "type": "file" }, { - "bom-ref": "7a4720355107a4fc", + "bom-ref": "db23bd0b6d2c314c", "name": "/usr/share/bash-completion/completions/setterm", "type": "file" }, { - "bom-ref": "b99c982d11b64ef2", + "bom-ref": "2f62cea2d4a31562", "name": "/usr/share/bash-completion/completions/su", "type": "file" }, { - "bom-ref": "61ce62fc39ab8625", + "bom-ref": "69cc847d02e0d73d", "name": "/usr/share/bash-completion/completions/swaplabel", "type": "file" }, { - "bom-ref": "a5c15d8c13e80ace", + "bom-ref": "0de30a5ec1daa412", "name": "/usr/share/bash-completion/completions/swapoff", "type": "file" }, { - "bom-ref": "d5111d04602fe5da", + "bom-ref": "19ed6917f81ac0a2", "name": "/usr/share/bash-completion/completions/swapon", "type": "file" }, { - "bom-ref": "7608e6ab31e016ba", + "bom-ref": "aae7ec19df082c10", "name": "/usr/share/bash-completion/completions/systemctl", "type": "file" }, { - "bom-ref": "44316febaac76690", + "bom-ref": "6dbdd5960575cca2", "name": "/usr/share/bash-completion/completions/systemd-analyze", "type": "file" }, { - "bom-ref": "1a0a9592bcb0b9e7", + "bom-ref": "e18cc3fb5d97f909", "name": "/usr/share/bash-completion/completions/systemd-cat", "type": "file" }, { - "bom-ref": "f41ac43cf97f72e6", + "bom-ref": "99472c29418ea52c", "name": "/usr/share/bash-completion/completions/systemd-cgls", "type": "file" }, { - "bom-ref": "f6ff33306933fbbb", + "bom-ref": "e2cf90432877790d", "name": "/usr/share/bash-completion/completions/systemd-cgtop", "type": "file" }, { - "bom-ref": "6143e0acc91da019", + "bom-ref": "79a36ca9860b49db", "name": "/usr/share/bash-completion/completions/systemd-cryptenroll", "type": "file" }, { - "bom-ref": "2b7a7707c685d540", + "bom-ref": "2276acfaf100af22", "name": "/usr/share/bash-completion/completions/systemd-delta", "type": "file" }, { - "bom-ref": "3fa56cea1792b0af", + "bom-ref": "08f3941313a4b639", "name": "/usr/share/bash-completion/completions/systemd-detect-virt", "type": "file" }, { - "bom-ref": "b1ab4c1c409e50e9", + "bom-ref": "a2ff733481b26103", "name": "/usr/share/bash-completion/completions/systemd-dissect", "type": "file" }, { - "bom-ref": "372b80475692c73d", + "bom-ref": "3fc4140438d0748f", "name": "/usr/share/bash-completion/completions/systemd-id128", "type": "file" }, { - "bom-ref": "b0d28e58477ea6ad", + "bom-ref": "4f33376ccbb1da1b", "name": "/usr/share/bash-completion/completions/systemd-path", "type": "file" }, { - "bom-ref": "4153ed84aa0bf1ae", + "bom-ref": "f700631e0a839078", "name": "/usr/share/bash-completion/completions/systemd-run", "type": "file" }, { - "bom-ref": "777770a05da1e862", + "bom-ref": "e4096eae2d66fb7c", "name": "/usr/share/bash-completion/completions/systemd-sysext", "type": "file" }, { - "bom-ref": "1b0ba3968b254ca6", + "bom-ref": "352f0ac59727bdd6", "name": "/usr/share/bash-completion/completions/taskset", "type": "file" }, { - "bom-ref": "95f38efb34e4d693", + "bom-ref": "baad215a5abc9e35", "name": "/usr/share/bash-completion/completions/timedatectl", "type": "file" }, { - "bom-ref": "2a809374fe991a58", + "bom-ref": "0dfa5349360c3dc4", "name": "/usr/share/bash-completion/completions/uclampset", "type": "file" }, { - "bom-ref": "11fb7995586d6631", + "bom-ref": "75aba1dea7b64d79", "name": "/usr/share/bash-completion/completions/udevadm", "type": "file" }, { - "bom-ref": "2d0376fa91fa0aa3", + "bom-ref": "60f55b71c4f08ad7", "name": "/usr/share/bash-completion/completions/umount", "type": "file" }, { - "bom-ref": "cc6580ada1a6db8b", + "bom-ref": "3bb9f81f7ef652db", "name": "/usr/share/bash-completion/completions/unshare", "type": "file" }, { - "bom-ref": "0169b0da48ae73da", + "bom-ref": "3ab591b6b55ec61e", "name": "/usr/share/bash-completion/completions/utmpdump", "type": "file" }, { - "bom-ref": "2afa291096068c4f", + "bom-ref": "ba6e6c7bbc6e3feb", "name": "/usr/share/bash-completion/completions/wall", "type": "file" }, { - "bom-ref": "bd54c197143824c9", + "bom-ref": "3295b339c88ab799", "name": "/usr/share/bash-completion/completions/wdctl", "type": "file" }, { - "bom-ref": "039525600c06bd84", + "bom-ref": "369e166e20311678", "name": "/usr/share/bash-completion/completions/whereis", "type": "file" }, { - "bom-ref": "cc71c0ada4723a1a", + "bom-ref": "aa6dc9d5c39b002a", "name": "/usr/share/bash-completion/completions/wipefs", "type": "file" }, { - "bom-ref": "6b516f1bf8febc5e", + "bom-ref": "62f9b3343d6bfb9a", "name": "/usr/share/bash-completion/completions/zramctl", "type": "file" }, { - "bom-ref": "cc297c52c0d81c53", + "bom-ref": "0a4dbde5c8fbabcf", "name": "/usr/share/binfmts/python3.12", "type": "file" }, { - "bom-ref": "44bef926458617a6", + "bom-ref": "40ef71fb033643f8", "name": "/usr/share/bug/apt/script", "type": "file" }, { - "bom-ref": "53b43b02bd293f70", + "bom-ref": "527e471fd9d459fc", "name": "/usr/share/bug/binutils/presubj", "type": "file" }, { - "bom-ref": "cb9e3b4b0bbf12c1", + "bom-ref": "d23e604bc0beab12", + "name": "/usr/share/bug/dbus/control", + "type": "file" + }, + { + "bom-ref": "3b75cf1d40f7c26f", "name": "/usr/share/bug/dpkg", "type": "file" }, { - "bom-ref": "4f68c42c161da9b4", + "bom-ref": "bb1f85f9b5fe5280", "name": "/usr/share/bug/dpkg-dev", "type": "file" }, { - "bom-ref": "50563fd1730cbf27", + "bom-ref": "0a8bfd04efaf1e39", "name": "/usr/share/bug/init-system-helpers/control", "type": "file" }, { - "bom-ref": "70dfeddb8e549da8", + "bom-ref": "7e4f0c92ae9fd30a", "name": "/usr/share/bug/libcryptsetup12", "type": "file" }, { - "bom-ref": "9a508b2a724b6c11", + "bom-ref": "d020d3f952bea729", "name": "/usr/share/bug/libdpkg-perl", "type": "file" }, { - "bom-ref": "b12618afb139e9fe", + "bom-ref": "a2207e7b62d57ff2", "name": "/usr/share/bug/libgbm1/control", "type": "file" }, { - "bom-ref": "67ec710c12809170", + "bom-ref": "a6ef9821aa90dff4", "name": "/usr/share/bug/libgbm1/script", "type": "file" }, { - "bom-ref": "5d745cfa4931e9ba", + "bom-ref": "3032351e1a2662da", "name": "/usr/share/bug/libgl1-mesa-dri/control", "type": "file" }, { - "bom-ref": "e48350f0bd966dee", + "bom-ref": "ced2e1ef3983774a", "name": "/usr/share/bug/libgl1-mesa-dri/script", "type": "file" }, { - "bom-ref": "9f0a2f0f14341acb", + "bom-ref": "0cb25a85786be74f", "name": "/usr/share/bug/libgl1/control", "type": "file" }, { - "bom-ref": "cf46103b54c0794f", + "bom-ref": "a057b39c12ed6ec7", "name": "/usr/share/bug/libglvnd0/control", "type": "file" }, { - "bom-ref": "24bd41c199d0f385", + "bom-ref": "2317e51ea965e741", "name": "/usr/share/bug/libglx-mesa0/control", "type": "file" }, { - "bom-ref": "de36fdd55751ab29", + "bom-ref": "38157e0608864e09", "name": "/usr/share/bug/libglx-mesa0/script", "type": "file" }, { - "bom-ref": "ad4121525db90bcb", + "bom-ref": "6ce2d79fa146a7fb", "name": "/usr/share/bug/libglx0/control", "type": "file" }, { - "bom-ref": "4e7ef0096f22844c", + "bom-ref": "2d74cd375a61a450", "name": "/usr/share/bug/libvdpau1", "type": "file" }, { - "bom-ref": "0a9671316e12768b", + "bom-ref": "e5381283616ad3c7", "name": "/usr/share/bug/media-types/presubj", "type": "file" }, { - "bom-ref": "0bbc52c5bd44b545", + "bom-ref": "bde99f2866504779", "name": "/usr/share/bug/mesa-libgallium/control", "type": "file" }, { - "bom-ref": "9c61c2263f44ddde", + "bom-ref": "cdf7bbebe15a4796", "name": "/usr/share/bug/mesa-libgallium/script", "type": "file" }, { - "bom-ref": "b80ea7fb273a4dbf", + "bom-ref": "9820bf9a86dd615a", + "name": "/usr/share/bug/polkitd/control", + "type": "file" + }, + { + "bom-ref": "587082b04c0c8705", "name": "/usr/share/bug/procps/presubj", "type": "file" }, { - "bom-ref": "ee76ec5e4340acf9", + "bom-ref": "236bde02b7e39a8b", "name": "/usr/share/bug/systemd/control", "type": "file" }, { - "bom-ref": "24b71190f7e584a8", + "bom-ref": "696318f182419f8e", "name": "/usr/share/bug/systemd/script", "type": "file" }, { - "bom-ref": "31215b11ecf58698", + "bom-ref": "009e5a5323f78b14", "name": "/usr/share/bug/udev/control", "type": "file" }, { - "bom-ref": "49a28409591e3511", + "bom-ref": "a4dbde8404b7c46d", "name": "/usr/share/bug/udev/script", "type": "file" }, { - "bom-ref": "e049760731d13c50", + "bom-ref": "a0e33c589eea34b4", "name": "/usr/share/bug/vim/presubj", "type": "file" }, { - "bom-ref": "dc0d88245656ed8a", + "bom-ref": "90978ea2e64b2462", "name": "/usr/share/bug/vim/script", "type": "file" }, { - "bom-ref": "654f879c6975295f", + "bom-ref": "73dd007aef2c1a7f", "name": "/usr/share/build-essential/essential-packages-list", "type": "file" }, { - "bom-ref": "9d131a112b05a67e", + "bom-ref": "645cb8dabe56c802", "name": "/usr/share/build-essential/list", "type": "file" }, { - "bom-ref": "7907379ee6e658ad", + "bom-ref": "80f88a17b6804d25", "name": "/usr/share/ca-certificates/mozilla/ACCVRAIZ1.crt", "type": "file" }, { - "bom-ref": "ae1009c6be5c63ff", + "bom-ref": "8109281e1b0c68ef", "name": "/usr/share/ca-certificates/mozilla/AC_RAIZ_FNMT-RCM.crt", "type": "file" }, { - "bom-ref": "d7635d1044c5e9f8", + "bom-ref": "71b4ec0b011ac97c", "name": "/usr/share/ca-certificates/mozilla/AC_RAIZ_FNMT-RCM_SERVIDORES_SEGUROS.crt", "type": "file" }, { - "bom-ref": "6e049c6afe3368bb", + "bom-ref": "1b4fb70ff315391f", "name": "/usr/share/ca-certificates/mozilla/ANF_Secure_Server_Root_CA.crt", "type": "file" }, { - "bom-ref": "f9c0a35110d40436", + "bom-ref": "d22f00e11522c11a", "name": "/usr/share/ca-certificates/mozilla/Actalis_Authentication_Root_CA.crt", "type": "file" }, { - "bom-ref": "0ebfa0e92b816a6e", + "bom-ref": "e94c1ec64b006c66", "name": "/usr/share/ca-certificates/mozilla/Amazon_Root_CA_1.crt", "type": "file" }, { - "bom-ref": "7f6c1f272435511d", + "bom-ref": "58d1b336a593d4f5", "name": "/usr/share/ca-certificates/mozilla/Amazon_Root_CA_2.crt", "type": "file" }, { - "bom-ref": "63c82198bcfb8854", + "bom-ref": "80f8aa68004a55e8", "name": "/usr/share/ca-certificates/mozilla/Amazon_Root_CA_3.crt", "type": "file" }, { - "bom-ref": "79be83d3e6b9d8db", + "bom-ref": "d7fd8e3ef151da2b", "name": "/usr/share/ca-certificates/mozilla/Amazon_Root_CA_4.crt", "type": "file" }, { - "bom-ref": "86095923f8323f98", + "bom-ref": "012aa35364ac67b4", "name": "/usr/share/ca-certificates/mozilla/Atos_TrustedRoot_2011.crt", "type": "file" }, { - "bom-ref": "b5ffc86819dc5163", + "bom-ref": "f27779f9f7519da3", "name": "/usr/share/ca-certificates/mozilla/Atos_TrustedRoot_Root_CA_ECC_TLS_2021.crt", "type": "file" }, { - "bom-ref": "c208ff8c415f884e", + "bom-ref": "8d875ddfaef3306e", "name": "/usr/share/ca-certificates/mozilla/Atos_TrustedRoot_Root_CA_RSA_TLS_2021.crt", "type": "file" }, { - "bom-ref": "7d6cd43b2a19e6e2", + "bom-ref": "cb6af4a2e9672bfa", "name": "/usr/share/ca-certificates/mozilla/Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068.crt", "type": "file" }, { - "bom-ref": "8c24ef702bc5b6a1", + "bom-ref": "73c7317a454e7dcd", "name": "/usr/share/ca-certificates/mozilla/BJCA_Global_Root_CA1.crt", "type": "file" }, { - "bom-ref": "93246cced40acbb4", + "bom-ref": "e76e297160c9f808", "name": "/usr/share/ca-certificates/mozilla/BJCA_Global_Root_CA2.crt", "type": "file" }, { - "bom-ref": "b8ce3ebc87ad30d9", + "bom-ref": "8b17b52f381c2041", "name": "/usr/share/ca-certificates/mozilla/Buypass_Class_2_Root_CA.crt", "type": "file" }, { - "bom-ref": "42b3a84c9f6f9287", + "bom-ref": "5ad0cc4bc5e6ea7f", "name": "/usr/share/ca-certificates/mozilla/Buypass_Class_3_Root_CA.crt", "type": "file" }, { - "bom-ref": "d3b91c05a8b2466b", + "bom-ref": "110bd9593c7cd283", "name": "/usr/share/ca-certificates/mozilla/CA_Disig_Root_R2.crt", "type": "file" }, { - "bom-ref": "57694b60a5cbbec4", + "bom-ref": "fc31b55ddbce9e28", "name": "/usr/share/ca-certificates/mozilla/CFCA_EV_ROOT.crt", "type": "file" }, { - "bom-ref": "cec1a8ac063958c4", + "bom-ref": "c9e5a190f6f3c200", "name": "/usr/share/ca-certificates/mozilla/COMODO_ECC_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "3cb15114a878b4f3", + "bom-ref": "107adcc7bff76fa7", "name": "/usr/share/ca-certificates/mozilla/COMODO_RSA_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "71cd6a04ce8851a3", + "bom-ref": "95766180b3854c4b", "name": "/usr/share/ca-certificates/mozilla/Certainly_Root_E1.crt", "type": "file" }, { - "bom-ref": "985a7a12d77a9b86", + "bom-ref": "afcbb6403caaba2e", "name": "/usr/share/ca-certificates/mozilla/Certainly_Root_R1.crt", "type": "file" }, { - "bom-ref": "ceac6189844fbf73", + "bom-ref": "a60e7623772e8697", "name": "/usr/share/ca-certificates/mozilla/Certigna_Root_CA.crt", "type": "file" }, { - "bom-ref": "e14be0f955c25f06", + "bom-ref": "a065bea774afb54e", "name": "/usr/share/ca-certificates/mozilla/Certum_EC-384_CA.crt", "type": "file" }, { - "bom-ref": "56bde05d50c69948", + "bom-ref": "35a29c8150fef810", "name": "/usr/share/ca-certificates/mozilla/Certum_Trusted_Network_CA.crt", "type": "file" }, { - "bom-ref": "d7b55ea994aeb62d", + "bom-ref": "297fd89b968b3579", "name": "/usr/share/ca-certificates/mozilla/Certum_Trusted_Network_CA_2.crt", "type": "file" }, { - "bom-ref": "5c8037a5c636e0e9", + "bom-ref": "3b91cbe2b90a7f39", "name": "/usr/share/ca-certificates/mozilla/Certum_Trusted_Root_CA.crt", "type": "file" }, { - "bom-ref": "8559398ad0f7a7c0", + "bom-ref": "f00cb1e13ca4fc30", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_BR_Root_CA_1_2020.crt", "type": "file" }, { - "bom-ref": "c854073ad48afffb", + "bom-ref": "e1901e6e82466807", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_BR_Root_CA_2_2023.crt", "type": "file" }, { - "bom-ref": "ee3420e7aed7d687", + "bom-ref": "a15c55997af111cb", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_EV_Root_CA_1_2020.crt", "type": "file" }, { - "bom-ref": "91b2adc674cdd922", + "bom-ref": "8eca8594d09c4eb6", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_EV_Root_CA_2_2023.crt", "type": "file" }, { - "bom-ref": "9af95a7dbf07e480", + "bom-ref": "a9a6a36ff1647898", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_Root_Class_3_CA_2_2009.crt", "type": "file" }, { - "bom-ref": "6297a4ccc4cd2f60", + "bom-ref": "1a40acc34f543cdc", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_Root_Class_3_CA_2_EV_2009.crt", "type": "file" }, { - "bom-ref": "b50c1c0927411acb", + "bom-ref": "7ab0a6b7f3e6c07f", "name": "/usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_G2.crt", "type": "file" }, { - "bom-ref": "69e4cb27425864c7", + "bom-ref": "fd2ce97370c27dfb", "name": "/usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_G3.crt", "type": "file" }, { - "bom-ref": "89f96a1d413022e8", + "bom-ref": "c58479bed9333b7c", "name": "/usr/share/ca-certificates/mozilla/DigiCert_Global_Root_G2.crt", "type": "file" }, { - "bom-ref": "5a3f32de148b47ac", + "bom-ref": "33e82882a33ac7a8", "name": "/usr/share/ca-certificates/mozilla/DigiCert_Global_Root_G3.crt", "type": "file" }, { - "bom-ref": "567815668a825c39", + "bom-ref": "d8167a20d2111625", "name": "/usr/share/ca-certificates/mozilla/DigiCert_TLS_ECC_P384_Root_G5.crt", "type": "file" }, { - "bom-ref": "27f07edeb7d3c950", + "bom-ref": "1e3da5de22cf9c14", "name": "/usr/share/ca-certificates/mozilla/DigiCert_TLS_RSA4096_Root_G5.crt", "type": "file" }, { - "bom-ref": "3df40a74f0bc9d32", + "bom-ref": "29a436c02544b982", "name": "/usr/share/ca-certificates/mozilla/DigiCert_Trusted_Root_G4.crt", "type": "file" }, { - "bom-ref": "9d90899ecade6907", + "bom-ref": "80cea0f1a1994b0f", "name": "/usr/share/ca-certificates/mozilla/Entrust_Root_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "fb50bd1147a6fc18", + "bom-ref": "41bafaf044eb09f4", "name": "/usr/share/ca-certificates/mozilla/GDCA_TrustAUTH_R5_ROOT.crt", "type": "file" }, { - "bom-ref": "49197bc7eba0f350", + "bom-ref": "96ca10e65534ff3c", "name": "/usr/share/ca-certificates/mozilla/GTS_Root_R1.crt", "type": "file" }, { - "bom-ref": "909b87b9a32c9e77", + "bom-ref": "9ad78aa9aae1595f", "name": "/usr/share/ca-certificates/mozilla/GTS_Root_R3.crt", "type": "file" }, { - "bom-ref": "f56f832cca4e4ed3", + "bom-ref": "ac6cb7fbd431276b", "name": "/usr/share/ca-certificates/mozilla/GTS_Root_R4.crt", "type": "file" }, { - "bom-ref": "3271ee813acaa75e", + "bom-ref": "e8b5f385bcd69ace", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_ECC_Root_CA_-_R4.crt", "type": "file" }, { - "bom-ref": "181d88c0d75ba386", + "bom-ref": "3ee6745a8cbd628e", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_ECC_Root_CA_-_R5.crt", "type": "file" }, { - "bom-ref": "80f032b2dbc6d795", + "bom-ref": "7c557379825b3ba5", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_Root_CA_-_R3.crt", "type": "file" }, { - "bom-ref": "a68239cfde8c9131", + "bom-ref": "717e9a06ebde7825", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_Root_CA_-_R6.crt", "type": "file" }, { - "bom-ref": "8ee5b16f0b4e3064", + "bom-ref": "899bd0b5ad614868", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_Root_E46.crt", "type": "file" }, { - "bom-ref": "a719fb3ef675984a", + "bom-ref": "4ebb6aac6a96a08a", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_Root_R46.crt", "type": "file" }, { - "bom-ref": "296b8626562ee38f", + "bom-ref": "157c10a493383a4b", "name": "/usr/share/ca-certificates/mozilla/Go_Daddy_Root_Certificate_Authority_-_G2.crt", "type": "file" }, { - "bom-ref": "068fb225fd01e269", + "bom-ref": "607284ed12908715", "name": "/usr/share/ca-certificates/mozilla/HARICA_TLS_ECC_Root_CA_2021.crt", "type": "file" }, { - "bom-ref": "025dd1b858960c80", + "bom-ref": "42331ac052ec1fc8", "name": "/usr/share/ca-certificates/mozilla/HARICA_TLS_RSA_Root_CA_2021.crt", "type": "file" }, { - "bom-ref": "d338d471657a4c5d", + "bom-ref": "32697c6fa79685d1", "name": "/usr/share/ca-certificates/mozilla/Hellenic_Academic_and_Research_Institutions_ECC_RootCA_2015.crt", "type": "file" }, { - "bom-ref": "2f686f8d36728c01", + "bom-ref": "c63b48116cd13c05", "name": "/usr/share/ca-certificates/mozilla/Hellenic_Academic_and_Research_Institutions_RootCA_2015.crt", "type": "file" }, { - "bom-ref": "df8cba8ab93a02f3", + "bom-ref": "2ce76ca090ad131b", "name": "/usr/share/ca-certificates/mozilla/HiPKI_Root_CA_-_G1.crt", "type": "file" }, { - "bom-ref": "6780d11d74487f97", + "bom-ref": "44162719e733120f", "name": "/usr/share/ca-certificates/mozilla/Hongkong_Post_Root_CA_3.crt", "type": "file" }, { - "bom-ref": "99b8102113fdf891", + "bom-ref": "d8afb266114d8c4d", "name": "/usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt", "type": "file" }, { - "bom-ref": "7a4c4dd9b269d96e", + "bom-ref": "1867e484c11ab246", "name": "/usr/share/ca-certificates/mozilla/ISRG_Root_X2.crt", "type": "file" }, { - "bom-ref": "2f7312ce8a3e7864", + "bom-ref": "fc9e2c9164dd5ccc", "name": "/usr/share/ca-certificates/mozilla/IdenTrust_Commercial_Root_CA_1.crt", "type": "file" }, { - "bom-ref": "761080383f07716d", + "bom-ref": "49a1189b712b28bd", "name": "/usr/share/ca-certificates/mozilla/IdenTrust_Public_Sector_Root_CA_1.crt", "type": "file" }, { - "bom-ref": "e7caf24b02ca592c", + "bom-ref": "e96a5c7a08abae3c", "name": "/usr/share/ca-certificates/mozilla/Izenpe.com.crt", "type": "file" }, { - "bom-ref": "f3c197834f00502b", + "bom-ref": "6d762879f7f14ed7", "name": "/usr/share/ca-certificates/mozilla/Microsec_e-Szigno_Root_CA_2009.crt", "type": "file" }, { - "bom-ref": "3b629f33fac74826", + "bom-ref": "ac9c6faae915e6f2", "name": "/usr/share/ca-certificates/mozilla/Microsoft_ECC_Root_Certificate_Authority_2017.crt", "type": "file" }, { - "bom-ref": "c6b2da2620fca0a9", + "bom-ref": "c2755db0a905a821", "name": "/usr/share/ca-certificates/mozilla/Microsoft_RSA_Root_Certificate_Authority_2017.crt", "type": "file" }, { - "bom-ref": "4c74563fec445a9d", + "bom-ref": "9486b14cfe0a2181", "name": "/usr/share/ca-certificates/mozilla/NAVER_Global_Root_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "9e62a6d2e4a76024", + "bom-ref": "10b4c4307661204c", "name": "/usr/share/ca-certificates/mozilla/NetLock_Arany_=Class_Gold=_F\u0151tan\u00fas\u00edtv\u00e1ny.crt", "type": "file" }, { - "bom-ref": "4d230db50da20ca6", + "bom-ref": "961dc8f54f442016", "name": "/usr/share/ca-certificates/mozilla/OISTE_Server_Root_ECC_G1.crt", "type": "file" }, { - "bom-ref": "6c65fd7edc5d5d46", + "bom-ref": "b7cc92c2f97c09f2", "name": "/usr/share/ca-certificates/mozilla/OISTE_Server_Root_RSA_G1.crt", "type": "file" }, { - "bom-ref": "58d197c21e18e64c", + "bom-ref": "33f8c948e359aeb0", "name": "/usr/share/ca-certificates/mozilla/OISTE_WISeKey_Global_Root_GB_CA.crt", "type": "file" }, { - "bom-ref": "05ac469033e9428c", + "bom-ref": "128a4a30c85e5730", "name": "/usr/share/ca-certificates/mozilla/OISTE_WISeKey_Global_Root_GC_CA.crt", "type": "file" }, { - "bom-ref": "df12b6823cca65f3", + "bom-ref": "ec1e02d4c5029fbf", "name": "/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_1_G3.crt", "type": "file" }, { - "bom-ref": "c6ce57e9006e2018", + "bom-ref": "8efcfa954d85c528", "name": "/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_2_G3.crt", "type": "file" }, { - "bom-ref": "6797a6ff22e0aaf9", + "bom-ref": "4e11cfa8a131e021", "name": "/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_3_G3.crt", "type": "file" }, { - "bom-ref": "22189822ab4e82da", + "bom-ref": "f11ddfa7517d1bc6", "name": "/usr/share/ca-certificates/mozilla/SSL.com_EV_Root_Certification_Authority_ECC.crt", "type": "file" }, { - "bom-ref": "60cccf6deff2473c", + "bom-ref": "f821d153a86e0d3c", "name": "/usr/share/ca-certificates/mozilla/SSL.com_EV_Root_Certification_Authority_RSA_R2.crt", "type": "file" }, { - "bom-ref": "aaacffdec9bb2b61", + "bom-ref": "23c5c16c28e057f5", "name": "/usr/share/ca-certificates/mozilla/SSL.com_Root_Certification_Authority_ECC.crt", "type": "file" }, { - "bom-ref": "1048dddd42a9c2e3", + "bom-ref": "f467284da1534653", "name": "/usr/share/ca-certificates/mozilla/SSL.com_Root_Certification_Authority_RSA.crt", "type": "file" }, { - "bom-ref": "90fe29f7228ad4f2", + "bom-ref": "1967884fa72c8bde", "name": "/usr/share/ca-certificates/mozilla/SSL.com_TLS_ECC_Root_CA_2022.crt", "type": "file" }, { - "bom-ref": "232ca3d2354c1fa4", + "bom-ref": "eaed5f0c63b329ec", "name": "/usr/share/ca-certificates/mozilla/SSL.com_TLS_RSA_Root_CA_2022.crt", "type": "file" }, { - "bom-ref": "b6d0d417808c3158", + "bom-ref": "d3311e8adc6f1e50", "name": "/usr/share/ca-certificates/mozilla/SZAFIR_ROOT_CA2.crt", "type": "file" }, { - "bom-ref": "820b904fed01d8a7", + "bom-ref": "783177a47f9d829f", "name": "/usr/share/ca-certificates/mozilla/Sectigo_Public_Server_Authentication_Root_E46.crt", "type": "file" }, { - "bom-ref": "1097766d9cec4646", + "bom-ref": "c64a6f62fe158096", "name": "/usr/share/ca-certificates/mozilla/Sectigo_Public_Server_Authentication_Root_R46.crt", "type": "file" }, { - "bom-ref": "d575e25dbbedff35", + "bom-ref": "1f15aa9f3bac09b5", "name": "/usr/share/ca-certificates/mozilla/SecureSign_Root_CA12.crt", "type": "file" }, { - "bom-ref": "65286f223f5935d8", + "bom-ref": "10f567b9e526df34", "name": "/usr/share/ca-certificates/mozilla/SecureSign_Root_CA14.crt", "type": "file" }, { - "bom-ref": "813b41004dd3cf4e", + "bom-ref": "b9ddcdbbec83603a", "name": "/usr/share/ca-certificates/mozilla/SecureSign_Root_CA15.crt", "type": "file" }, { - "bom-ref": "ed6f677834432b08", + "bom-ref": "983d75fc52f0c844", "name": "/usr/share/ca-certificates/mozilla/Security_Communication_ECC_RootCA1.crt", "type": "file" }, { - "bom-ref": "aacb08498f5bae4b", + "bom-ref": "b7a0f5b5c7c91ec7", "name": "/usr/share/ca-certificates/mozilla/Security_Communication_RootCA2.crt", "type": "file" }, { - "bom-ref": "2c1f0d9d3e36e034", + "bom-ref": "1a27ca31d97d0ff8", "name": "/usr/share/ca-certificates/mozilla/Starfield_Root_Certificate_Authority_-_G2.crt", "type": "file" }, { - "bom-ref": "d7d342a7e22fa68e", + "bom-ref": "0af259161019dd02", "name": "/usr/share/ca-certificates/mozilla/Starfield_Services_Root_Certificate_Authority_-_G2.crt", "type": "file" }, { - "bom-ref": "cefe7dff21d072ed", + "bom-ref": "5ae1053f544f69b1", "name": "/usr/share/ca-certificates/mozilla/SwissSign_RSA_TLS_Root_CA_2022_-_1.crt", "type": "file" }, { - "bom-ref": "fa8bec9f46d022a3", + "bom-ref": "a693ebd612c2762f", "name": "/usr/share/ca-certificates/mozilla/T-TeleSec_GlobalRoot_Class_2.crt", "type": "file" }, { - "bom-ref": "16d40d6783cfa220", + "bom-ref": "a58c97d534a09f0c", "name": "/usr/share/ca-certificates/mozilla/T-TeleSec_GlobalRoot_Class_3.crt", "type": "file" }, { - "bom-ref": "149ffc5a71d93abc", + "bom-ref": "2dfb23fe66f4e748", "name": "/usr/share/ca-certificates/mozilla/TUBITAK_Kamu_SM_SSL_Kok_Sertifikasi_-_Surum_1.crt", "type": "file" }, { - "bom-ref": "032419e74924a77f", + "bom-ref": "6b9d9be668be4a67", "name": "/usr/share/ca-certificates/mozilla/TWCA_CYBER_Root_CA.crt", "type": "file" }, { - "bom-ref": "a10d6f72f32fa390", + "bom-ref": "964a319ba6cac4a4", "name": "/usr/share/ca-certificates/mozilla/TWCA_Global_Root_CA.crt", "type": "file" }, { - "bom-ref": "b29dc21b615d1285", + "bom-ref": "47187b81c58e6d4d", "name": "/usr/share/ca-certificates/mozilla/TWCA_Root_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "4e5d87a5ccbd319b", + "bom-ref": "fef616fe315b8e37", "name": "/usr/share/ca-certificates/mozilla/Telekom_Security_TLS_ECC_Root_2020.crt", "type": "file" }, { - "bom-ref": "40898f283dc9df3f", + "bom-ref": "534b25a0f95ac077", "name": "/usr/share/ca-certificates/mozilla/Telekom_Security_TLS_RSA_Root_2023.crt", "type": "file" }, { - "bom-ref": "d4a44d53ae52e392", + "bom-ref": "c1cad5e2000ee7de", "name": "/usr/share/ca-certificates/mozilla/Telia_Root_CA_v2.crt", "type": "file" }, { - "bom-ref": "a92a16833dcad868", + "bom-ref": "8c7e792cee4facb4", "name": "/usr/share/ca-certificates/mozilla/TrustAsia_Global_Root_CA_G3.crt", "type": "file" }, { - "bom-ref": "d9a7e5a99766b3e9", + "bom-ref": "4098f4766edcaa7d", "name": "/usr/share/ca-certificates/mozilla/TrustAsia_Global_Root_CA_G4.crt", "type": "file" }, { - "bom-ref": "b1c665080b46be32", + "bom-ref": "cd3da14452921856", "name": "/usr/share/ca-certificates/mozilla/TrustAsia_TLS_ECC_Root_CA.crt", "type": "file" }, { - "bom-ref": "d4d89613383bb3b6", + "bom-ref": "990641cfef462ac6", "name": "/usr/share/ca-certificates/mozilla/TrustAsia_TLS_RSA_Root_CA.crt", "type": "file" }, { - "bom-ref": "40cfd87f525fb166", + "bom-ref": "ffd4fbf9863548be", "name": "/usr/share/ca-certificates/mozilla/TunTrust_Root_CA.crt", "type": "file" }, { - "bom-ref": "6cd13b093be8492a", + "bom-ref": "4a0111f1e7ba8602", "name": "/usr/share/ca-certificates/mozilla/UCA_Extended_Validation_Root.crt", "type": "file" }, { - "bom-ref": "5107a57580e53e7f", + "bom-ref": "f183724d4e7d276f", "name": "/usr/share/ca-certificates/mozilla/UCA_Global_G2_Root.crt", "type": "file" }, { - "bom-ref": "2537425bc3e19db4", + "bom-ref": "ad654e67634eb808", "name": "/usr/share/ca-certificates/mozilla/USERTrust_ECC_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "27581948a9c38e3c", + "bom-ref": "6471ed557b9f5ea4", "name": "/usr/share/ca-certificates/mozilla/USERTrust_RSA_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "3bc391f6d2cf4552", + "bom-ref": "abe10218a41c60a6", "name": "/usr/share/ca-certificates/mozilla/certSIGN_Root_CA_G2.crt", "type": "file" }, { - "bom-ref": "37727195b87a911d", + "bom-ref": "58a8ec0908b964e1", "name": "/usr/share/ca-certificates/mozilla/e-Szigno_Root_CA_2017.crt", "type": "file" }, { - "bom-ref": "9a50e916d090f072", + "bom-ref": "94340138c584e31e", "name": "/usr/share/ca-certificates/mozilla/e-Szigno_TLS_Root_CA_2023.crt", "type": "file" }, { - "bom-ref": "7620c25d45fa8f1d", + "bom-ref": "baa8ddb2ae39f0cd", "name": "/usr/share/ca-certificates/mozilla/ePKI_Root_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "19b48a83c98b2b77", + "bom-ref": "e31df0090a8cbbbb", "name": "/usr/share/ca-certificates/mozilla/emSign_ECC_Root_CA_-_C3.crt", "type": "file" }, { - "bom-ref": "f4c109dd4c97842e", + "bom-ref": "67ad8273c0fb49b6", "name": "/usr/share/ca-certificates/mozilla/emSign_ECC_Root_CA_-_G3.crt", "type": "file" }, { - "bom-ref": "be66bc5ce5dfa619", + "bom-ref": "dcfeff6d8e49b5c9", "name": "/usr/share/ca-certificates/mozilla/emSign_Root_CA_-_C1.crt", "type": "file" }, { - "bom-ref": "f1a6ea19603ee24b", + "bom-ref": "413ba8653ab5f4f3", "name": "/usr/share/ca-certificates/mozilla/emSign_Root_CA_-_G1.crt", "type": "file" }, { - "bom-ref": "19b1f32bc66f46d8", + "bom-ref": "703c874bd7b2802c", "name": "/usr/share/ca-certificates/mozilla/vTrus_ECC_Root_CA.crt", "type": "file" }, { - "bom-ref": "a9a50a6f5bf54459", + "bom-ref": "597823665c02c14d", "name": "/usr/share/ca-certificates/mozilla/vTrus_Root_CA.crt", "type": "file" }, { - "bom-ref": "ca393444c4a00e5f", + "bom-ref": "459f569751501375", "name": "/usr/share/common-licenses/Apache-2.0", "type": "file" }, { - "bom-ref": "dec294925b69ba33", + "bom-ref": "3c0a15df700e8311", "name": "/usr/share/common-licenses/Artistic", "type": "file" }, { - "bom-ref": "a3c1d7168bfe5fda", + "bom-ref": "0ce918d1786388d8", "name": "/usr/share/common-licenses/BSD", "type": "file" }, { - "bom-ref": "d3ad7336735909aa", + "bom-ref": "53c8f16bbd2a9ac8", "name": "/usr/share/common-licenses/CC0-1.0", "type": "file" }, { - "bom-ref": "188fbb72d5e6326d", + "bom-ref": "fc1c0778ea3902c7", "name": "/usr/share/common-licenses/GFDL-1.2", "type": "file" }, { - "bom-ref": "2f4f75e2b727d977", + "bom-ref": "4723ef60aa67d6a5", "name": "/usr/share/common-licenses/GFDL-1.3", "type": "file" }, { - "bom-ref": "454ff69080f4e7b3", + "bom-ref": "2d7ad81b11ae1f49", "name": "/usr/share/common-licenses/GPL-1", "type": "file" }, { - "bom-ref": "6eb75f19b04d3f3f", + "bom-ref": "0f32f1bc1dd83475", "name": "/usr/share/common-licenses/GPL-2", "type": "file" }, { - "bom-ref": "ec9f9611beaed123", + "bom-ref": "517921fd558e31bd", "name": "/usr/share/common-licenses/GPL-3", "type": "file" }, { - "bom-ref": "8c799a08fa988c2d", + "bom-ref": "35515f79e8b5136b", "name": "/usr/share/common-licenses/LGPL-2", "type": "file" }, { - "bom-ref": "75358eae894d9d2a", + "bom-ref": "90832218f537ff78", "name": "/usr/share/common-licenses/LGPL-2.1", "type": "file" }, { - "bom-ref": "569ebb8f452ecaa8", + "bom-ref": "5a2053826d0fabb6", "name": "/usr/share/common-licenses/LGPL-3", "type": "file" }, { - "bom-ref": "ae89dc7ff824914b", + "bom-ref": "82a7a4ba2072bd09", "name": "/usr/share/common-licenses/MPL-1.1", "type": "file" }, { - "bom-ref": "f67f781a4173fa24", + "bom-ref": "cc08cf41cf5bd7fe", "name": "/usr/share/common-licenses/MPL-2.0", "type": "file" }, { - "bom-ref": "371a5104fa3237ba", + "bom-ref": "a428878883af02a8", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.LogControl1.xml", "type": "file" }, { - "bom-ref": "e96fbdd2160ca984", + "bom-ref": "df178b7babadf4a5", + "name": "/usr/share/dbus-1/interfaces/org.freedesktop.PackageKit.Transaction.xml", + "type": "file" + }, + { + "bom-ref": "7662e455bf796d24", + "name": "/usr/share/dbus-1/interfaces/org.freedesktop.PackageKit.xml", + "type": "file" + }, + { + "bom-ref": "8b728760fa6a07de", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.home1.Home.xml", "type": "file" }, { - "bom-ref": "1be364fd19eb0f47", + "bom-ref": "afb42536cd4b2109", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.home1.Manager.xml", "type": "file" }, { - "bom-ref": "a4b1cb62a2e036ce", + "bom-ref": "9cc634510b34e7f0", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.hostname1.xml", "type": "file" }, { - "bom-ref": "7368913fdb3e57bc", + "bom-ref": "452abe5f0b1d562a", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.import1.Manager.xml", "type": "file" }, { - "bom-ref": "9f66a90069fee192", + "bom-ref": "87d6c3c02e0acf08", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.import1.Transfer.xml", "type": "file" }, { - "bom-ref": "9c6a76f32668c5b8", + "bom-ref": "e672e70701027d52", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.locale1.xml", "type": "file" }, { - "bom-ref": "2f122524e8f5dd92", + "bom-ref": "1a692eab2637ff98", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.login1.Manager.xml", "type": "file" }, { - "bom-ref": "6cd8596d3c324a0f", + "bom-ref": "7ade263c65900789", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.login1.Seat.xml", "type": "file" }, { - "bom-ref": "f6704180f036de70", + "bom-ref": "0e84d58259da6a42", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.login1.Session.xml", "type": "file" }, { - "bom-ref": "8c76ebf014a705da", + "bom-ref": "a74cfbc26fcf6678", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.login1.User.xml", "type": "file" }, { - "bom-ref": "725acfa094bb0b06", + "bom-ref": "71649dda6ac30d7c", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.machine1.Image.xml", "type": "file" }, { - "bom-ref": "5d2d08524ba1a4f9", + "bom-ref": "29f5769d85c4111f", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.machine1.Machine.xml", "type": "file" }, { - "bom-ref": "8f6936f9050d6d72", + "bom-ref": "e8f775558673300c", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.machine1.Manager.xml", "type": "file" }, { - "bom-ref": "85d3121449ce2a25", + "bom-ref": "6cd544857f4d5187", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.network1.DHCPServer.xml", "type": "file" }, { - "bom-ref": "44e9ff44795181b1", + "bom-ref": "e82d06784fe7bd2b", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.network1.DHCPv4Client.xml", "type": "file" }, { - "bom-ref": "0cc2a0ff892554e8", + "bom-ref": "03cef1af9cf25d56", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.network1.DHCPv6Client.xml", "type": "file" }, { - "bom-ref": "c73414df84178557", + "bom-ref": "ca3dd36a008e3201", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.network1.Link.xml", "type": "file" }, { - "bom-ref": "f87b69977a3a0398", + "bom-ref": "45a78c6bf3ee35a2", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.network1.Manager.xml", "type": "file" }, { - "bom-ref": "146d237c029ae2f4", + "bom-ref": "bac0ea8df1a0a30e", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.network1.Network.xml", "type": "file" }, { - "bom-ref": "62ef1c363bf0b24b", + "bom-ref": "c982d4242aa47281", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.oom1.Manager.xml", "type": "file" }, { - "bom-ref": "1b1c431de6ed7064", + "bom-ref": "72899287fc65a7e6", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.portable1.Image.xml", "type": "file" }, { - "bom-ref": "624e71231a9ca48d", + "bom-ref": "b81a3ef57020cbd3", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.portable1.Manager.xml", "type": "file" }, { - "bom-ref": "672c4fa9a307ff43", + "bom-ref": "272668cb886849a9", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.resolve1.DnssdService.xml", "type": "file" }, { - "bom-ref": "b36cf8d235d27a4c", + "bom-ref": "be66a3f00aaae62e", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.resolve1.Link.xml", "type": "file" }, { - "bom-ref": "92bf598f34bf851c", + "bom-ref": "a5cc6bb1e04922ee", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.resolve1.Manager.xml", "type": "file" }, { - "bom-ref": "1b7a8079a9b22266", + "bom-ref": "983af8acdc93072c", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Automount.xml", "type": "file" }, { - "bom-ref": "2dcabb750f0a9538", + "bom-ref": "3d759cddd549b506", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Device.xml", "type": "file" }, { - "bom-ref": "52cf604cf9eba44e", + "bom-ref": "b9be385682b5cc94", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Job.xml", "type": "file" }, { - "bom-ref": "6aef19caf36b167b", + "bom-ref": "a235ea2add36f999", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Manager.xml", "type": "file" }, { - "bom-ref": "f19b58cfc15664fb", + "bom-ref": "6754daf28d983459", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Mount.xml", "type": "file" }, { - "bom-ref": "c9925fb5e2ed8214", + "bom-ref": "39730e5299fb8c66", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Path.xml", "type": "file" }, { - "bom-ref": "c023fd4930020d82", + "bom-ref": "a25a4063e2f6684c", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Scope.xml", "type": "file" }, { - "bom-ref": "703730bce22b8513", + "bom-ref": "f5b4a399414cb49d", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Service.xml", "type": "file" }, { - "bom-ref": "5ca4602e28be1d16", + "bom-ref": "53bbcb9b9ed4eea4", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Slice.xml", "type": "file" }, { - "bom-ref": "eec5ca3f6ee67f6e", + "bom-ref": "d18bcdffdbbae98c", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Socket.xml", "type": "file" }, { - "bom-ref": "e112491a062e21e5", + "bom-ref": "79b920abe4721c9f", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Swap.xml", "type": "file" }, { - "bom-ref": "ace74e98400d2ef2", + "bom-ref": "487e8e47d6583fb8", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Target.xml", "type": "file" }, { - "bom-ref": "82a6e38fe9419327", + "bom-ref": "8c4b007c8f0b1251", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Timer.xml", "type": "file" }, { - "bom-ref": "a38255c10e4caa8c", + "bom-ref": "42d106e2d8089232", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Unit.xml", "type": "file" }, { - "bom-ref": "c11e6c6286856d0c", + "bom-ref": "1714fe74d1e0753a", "name": "/usr/share/dbus-1/interfaces/org.freedesktop.timedate1.xml", "type": "file" }, { - "bom-ref": "b93322ff5387ca0a", + "bom-ref": "8f3da8d82fcca048", + "name": "/usr/share/dbus-1/session.conf", + "type": "file" + }, + { + "bom-ref": "d065938b965c2e3b", + "name": "/usr/share/dbus-1/system-services/com.ubuntu.SoftwareProperties.service", + "type": "file" + }, + { + "bom-ref": "fb38dbef60e755ae", + "name": "/usr/share/dbus-1/system-services/org.freedesktop.PackageKit.service", + "type": "file" + }, + { + "bom-ref": "a417d2b0096dbbf7", + "name": "/usr/share/dbus-1/system-services/org.freedesktop.PolicyKit1.service", + "type": "file" + }, + { + "bom-ref": "1b652444bce817f4", "name": "/usr/share/dbus-1/system-services/org.freedesktop.hostname1.service", "type": "file" }, { - "bom-ref": "adffd377bdd43e70", + "bom-ref": "72c0e1e994d348ca", "name": "/usr/share/dbus-1/system-services/org.freedesktop.locale1.service", "type": "file" }, { - "bom-ref": "044aa6e4e8087bd7", + "bom-ref": "0423bcdac93a7af5", "name": "/usr/share/dbus-1/system-services/org.freedesktop.login1.service", "type": "file" }, { - "bom-ref": "a03a5b172c36820f", + "bom-ref": "c1d8635d10390e2d", "name": "/usr/share/dbus-1/system-services/org.freedesktop.network1.service", "type": "file" }, { - "bom-ref": "b9be1f8f8ef3a5a7", + "bom-ref": "b8028d2edc328889", "name": "/usr/share/dbus-1/system-services/org.freedesktop.systemd1.service", "type": "file" }, { - "bom-ref": "920ba6f87a9e4c26", + "bom-ref": "a17095da73234ac4", "name": "/usr/share/dbus-1/system-services/org.freedesktop.timedate1.service", "type": "file" }, { - "bom-ref": "6ee3feafc818ea0e", + "bom-ref": "4d9cf3ec2cb62965", + "name": "/usr/share/dbus-1/system.conf", + "type": "file" + }, + { + "bom-ref": "04d94e7ea8594cf0", + "name": "/usr/share/dbus-1/system.d/org.freedesktop.PackageKit.conf", + "type": "file" + }, + { + "bom-ref": "2c808465520348ab", + "name": "/usr/share/dbus-1/system.d/org.freedesktop.PolicyKit1.conf", + "type": "file" + }, + { + "bom-ref": "bc61946c3acd9248", "name": "/usr/share/dbus-1/system.d/org.freedesktop.hostname1.conf", "type": "file" }, { - "bom-ref": "0ea578dd72833428", + "bom-ref": "7b562990d7dace82", "name": "/usr/share/dbus-1/system.d/org.freedesktop.locale1.conf", "type": "file" }, { - "bom-ref": "d8cd1186ae52defc", + "bom-ref": "20b69aa265f22c16", "name": "/usr/share/dbus-1/system.d/org.freedesktop.login1.conf", "type": "file" }, { - "bom-ref": "539de798ab5e3548", + "bom-ref": "0b031bb54c8bee4a", "name": "/usr/share/dbus-1/system.d/org.freedesktop.network1.conf", "type": "file" }, { - "bom-ref": "9376a7ba0af89f39", + "bom-ref": "15173adea94bc40f", "name": "/usr/share/dbus-1/system.d/org.freedesktop.systemd1.conf", "type": "file" }, { - "bom-ref": "10bed1d2f0d2cba4", + "bom-ref": "2c8cf7ae06dbb6a2", "name": "/usr/share/dbus-1/system.d/org.freedesktop.timedate1.conf", "type": "file" }, { - "bom-ref": "4b5072c57dad5e9f", + "bom-ref": "2d6d702f2eca6095", "name": "/usr/share/debconf/confmodule", "type": "file" }, { - "bom-ref": "8b98a6b0ffd0d72a", + "bom-ref": "a14c7d8b0bae27b4", "name": "/usr/share/debconf/confmodule.sh", "type": "file" }, { - "bom-ref": "aad06a61594f68e9", + "bom-ref": "8f9d9d92170ccbe7", "name": "/usr/share/debconf/debconf.conf", "type": "file" }, { - "bom-ref": "7fbbfea05d8a217e", + "bom-ref": "c1a43f22564924ac", "name": "/usr/share/debconf/fix_db.pl", "type": "file" }, { - "bom-ref": "a4b7fc090475e2e2", + "bom-ref": "26b8fde0fa496e7c", "name": "/usr/share/debconf/frontend", "type": "file" }, { - "bom-ref": "989af783ef881b30", + "bom-ref": "d43d759b2acc367e", + "name": "/usr/share/debhelper/autoscripts/postinst-xmlcatalog", + "type": "file" + }, + { + "bom-ref": "42a3eeac58d24173", + "name": "/usr/share/debhelper/autoscripts/postrm-xmlcatalog", + "type": "file" + }, + { + "bom-ref": "ccd9a74974393c03", + "name": "/usr/share/debhelper/autoscripts/prerm-xmlcatalog", + "type": "file" + }, + { + "bom-ref": "7adfd575c73a7db6", "name": "/usr/share/debianutils/shells", "type": "file" }, { - "bom-ref": "495cab88b6a4bf06", + "bom-ref": "9ae75914e3657988", "name": "/usr/share/debianutils/shells.d/bash", "type": "file" }, { - "bom-ref": "517d91bdbe2ea3fb", + "bom-ref": "ed55283a3d394ded", "name": "/usr/share/debianutils/shells.d/dash", "type": "file" }, { - "bom-ref": "b01c3b3d1f1e768a", + "bom-ref": "bbeae492c704f75c", + "name": "/usr/share/distro-info/debian.csv", + "type": "file" + }, + { + "bom-ref": "be6e4ff05d9f08ad", + "name": "/usr/share/distro-info/devuan.csv", + "type": "file" + }, + { + "bom-ref": "c83f32b66d48465f", + "name": "/usr/share/distro-info/elxr.csv", + "type": "file" + }, + { + "bom-ref": "ed03d1d5fb073647", + "name": "/usr/share/distro-info/ubuntu.csv", + "type": "file" + }, + { + "bom-ref": "f5441085c4f631ac", "name": "/usr/share/doc-base/base-passwd.users-and-groups", "type": "file" }, { - "bom-ref": "2b05f9b5b7c6c336", + "bom-ref": "16839cad6c7cccc4", "name": "/usr/share/doc-base/findutils.findutils", "type": "file" }, { - "bom-ref": "ba240671afdc92ff", + "bom-ref": "97a5d9fd1cde1567", "name": "/usr/share/doc-base/fontconfig.fontconfig-user", "type": "file" }, { - "bom-ref": "40ee6111644a0e81", + "bom-ref": "848818ad1b982561", "name": "/usr/share/doc-base/libexpat1-dev.expat", "type": "file" }, { - "bom-ref": "bc8874d0f2b60d98", + "bom-ref": "05825fb5b27b3c9c", "name": "/usr/share/doc-base/libpng16-16t64.libpng16", "type": "file" }, { - "bom-ref": "bd6b22c657bccb34", + "bom-ref": "19eb8cf916605f70", "name": "/usr/share/doc-base/ocl-icd-libopencl1.ocl-icd-libopencl1", "type": "file" }, { - "bom-ref": "cec35de354305c36", + "bom-ref": "51d6bf611a41eb36", "name": "/usr/share/doc-base/python3.python-policy", "type": "file" }, { - "bom-ref": "a2c446aa2b6c9a65", + "bom-ref": "4b6f076895f21de1", "name": "/usr/share/doc-base/shared-mime-info.shared-mime-info", "type": "file" }, { - "bom-ref": "125fa3436e045c8f", + "bom-ref": "f2c70549ab088295", "name": "/usr/share/doc/adduser/changelog.gz", "type": "file" }, { - "bom-ref": "8c5c7cd5b6d271ad", + "bom-ref": "eb3f1bec5d3bca4f", "name": "/usr/share/doc/adduser/copyright", "type": "file" }, { - "bom-ref": "702e19594cba9cc4", + "bom-ref": "6282c0bd1851134a", "name": "/usr/share/doc/apt/copyright", "type": "file" }, { - "bom-ref": "3cf71a0ca8481d0a", + "bom-ref": "2fcdb63e7e7c2dfc", "name": "/usr/share/doc/base-files/changelog.gz", "type": "file" }, { - "bom-ref": "ae8fa69d33f879dc", + "bom-ref": "4eebff58e79b72d2", "name": "/usr/share/doc/base-files/copyright", "type": "file" }, { - "bom-ref": "c10b058a078a5de9", + "bom-ref": "60f483560c815d4f", "name": "/usr/share/doc/base-passwd/changelog.gz", "type": "file" }, { - "bom-ref": "308e93c149c158c6", + "bom-ref": "2df86abd728b8e34", "name": "/usr/share/doc/base-passwd/copyright", "type": "file" }, { - "bom-ref": "0431b7bf53349679", + "bom-ref": "b24abba4a9667d17", "name": "/usr/share/doc/bash/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c0b10ccf42da92a7", + "bom-ref": "51756b4e73a92be1", "name": "/usr/share/doc/bash/copyright", "type": "file" }, { - "bom-ref": "f30b396de2598321", + "bom-ref": "f01c5f8f878b4395", "name": "/usr/share/doc/binutils-common/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "3d18b39de9e1c9f1", + "bom-ref": "fb7d6846e2a60f05", "name": "/usr/share/doc/binutils-common/copyright", "type": "file" }, { - "bom-ref": "dac6e0635731443e", + "bom-ref": "3f46d6ccfe07a9de", "name": "/usr/share/doc/binutils/copyright", "type": "file" }, { - "bom-ref": "b2442a38a620cf96", + "bom-ref": "3722e97c0b85bb7e", "name": "/usr/share/doc/bsdutils/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "63ec0b5ad8778234", + "bom-ref": "dc5c833cdf3d4ec0", "name": "/usr/share/doc/bsdutils/copyright", "type": "file" }, { - "bom-ref": "d16ce59d81369be2", + "bom-ref": "ef84e2ad7a44eaf6", "name": "/usr/share/doc/build-essential/changelog.gz", "type": "file" }, { - "bom-ref": "463a0c1c7daad822", + "bom-ref": "6c8b9540a09e5302", "name": "/usr/share/doc/build-essential/copyright", "type": "file" }, { - "bom-ref": "1f1488164e732a6c", + "bom-ref": "e602c6528feb149c", "name": "/usr/share/doc/bzip2/copyright", "type": "file" }, { - "bom-ref": "dc9e5b711a0548f4", + "bom-ref": "2cdee7f88ce47a54", "name": "/usr/share/doc/ca-certificates/changelog.gz", "type": "file" }, { - "bom-ref": "d9fbdfee33a99cce", + "bom-ref": "ccae7b1cd6367896", "name": "/usr/share/doc/ca-certificates/copyright", "type": "file" }, { - "bom-ref": "66fc3d2e258d047d", + "bom-ref": "dd08fcc4db443491", "name": "/usr/share/doc/ca-certificates/examples/ca-certificates-local/debian/copyright", "type": "file" }, { - "bom-ref": "a078addc6d19b24a", + "bom-ref": "386c7a034c3dd01c", "name": "/usr/share/doc/coreutils/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c283e18731ea9d0e", + "bom-ref": "ac0bcc4fa4455188", "name": "/usr/share/doc/coreutils/copyright", "type": "file" }, { - "bom-ref": "67e75b1bde80dc40", + "bom-ref": "32a4dbb0ea0402c0", "name": "/usr/share/doc/cpp-x86-64-linux-gnu/changelog.gz", "type": "file" }, { - "bom-ref": "430f76db13a09a96", + "bom-ref": "ad57c9ee7523697e", "name": "/usr/share/doc/cpp-x86-64-linux-gnu/copyright", "type": "file" }, { - "bom-ref": "d06e448e235af64d", + "bom-ref": "7f2fde9bf82c6585", "name": "/usr/share/doc/curl/copyright", "type": "file" }, { - "bom-ref": "60b09292d5f1b2ac", + "bom-ref": "1bb6622afcbfcdbe", "name": "/usr/share/doc/dash/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c4684fb9572b6e7d", + "bom-ref": "84f53684d58d71ef", "name": "/usr/share/doc/dash/copyright", "type": "file" }, { - "bom-ref": "d58097c254ffb197", + "bom-ref": "21e43142e365a967", + "name": "/usr/share/doc/dbus-bin/copyright", + "type": "file" + }, + { + "bom-ref": "3df43b61bb0e5142", + "name": "/usr/share/doc/dbus-daemon/copyright", + "type": "file" + }, + { + "bom-ref": "6f836925e4b4e739", + "name": "/usr/share/doc/dbus-session-bus-common/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "b4d35b1c73956f2e", + "name": "/usr/share/doc/dbus-session-bus-common/copyright", + "type": "file" + }, + { + "bom-ref": "b0561841e91ec104", + "name": "/usr/share/doc/dbus-system-bus-common/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "187b2d32ee5d432f", + "name": "/usr/share/doc/dbus-system-bus-common/copyright", + "type": "file" + }, + { + "bom-ref": "2229969880297401", + "name": "/usr/share/doc/dbus/copyright", + "type": "file" + }, + { + "bom-ref": "3ceb28ec508dac99", "name": "/usr/share/doc/debconf/changelog.gz", "type": "file" }, { - "bom-ref": "c8056f69a7379446", + "bom-ref": "8e89dc825e724a68", "name": "/usr/share/doc/debconf/copyright", "type": "file" }, { - "bom-ref": "60616be2cdc56d1a", + "bom-ref": "17ba7e5f4707b92c", "name": "/usr/share/doc/debianutils/changelog.gz", "type": "file" }, { - "bom-ref": "f4dc9475d7c55461", + "bom-ref": "b45a8a86bc3ff0d7", "name": "/usr/share/doc/debianutils/copyright", "type": "file" }, { - "bom-ref": "29175f4ce9bec16f", + "bom-ref": "8a9f12ff7055d445", "name": "/usr/share/doc/diffutils/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "0443b92e6ca5b8e4", + "bom-ref": "24fc1c4eb7a9058e", "name": "/usr/share/doc/diffutils/copyright", "type": "file" }, { - "bom-ref": "9804d2012e501ddd", + "bom-ref": "8bc251ba2b7ef2f3", + "name": "/usr/share/doc/distro-info-data/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "f1cade8e63866e89", + "name": "/usr/share/doc/distro-info-data/copyright", + "type": "file" + }, + { + "bom-ref": "6d990a4d2f926de1", "name": "/usr/share/doc/dpkg-dev/copyright", "type": "file" }, { - "bom-ref": "26006e50fba8cc32", + "bom-ref": "106b86047a73a478", "name": "/usr/share/doc/dpkg/changelog.gz", "type": "file" }, { - "bom-ref": "ecf0636101592551", + "bom-ref": "59b292943e6650ef", "name": "/usr/share/doc/dpkg/copyright", "type": "file" }, { - "bom-ref": "d665632a262de8ac", + "bom-ref": "672956f0f5919e16", "name": "/usr/share/doc/e2fsprogs/copyright", "type": "file" }, { - "bom-ref": "a2f97f5837b4d828", + "bom-ref": "4ff1b4cd534f246c", "name": "/usr/share/doc/ffmpeg/copyright", "type": "file" }, { - "bom-ref": "fca72bdedff63eb4", + "bom-ref": "2064b5c4a45dc622", "name": "/usr/share/doc/findutils/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "4bca3f64e3a458e9", + "bom-ref": "284bee269cc96e8f", "name": "/usr/share/doc/findutils/copyright", "type": "file" }, { - "bom-ref": "2c12830edf5346fd", + "bom-ref": "5bcbb01e86ffa731", "name": "/usr/share/doc/fontconfig-config/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "03b2db236aceb52b", + "bom-ref": "a1006570be270663", "name": "/usr/share/doc/fontconfig-config/copyright", "type": "file" }, { - "bom-ref": "87c5ad43bd7eac0d", + "bom-ref": "4ddc5410a3b83c09", "name": "/usr/share/doc/fontconfig/copyright", "type": "file" }, { - "bom-ref": "43822e80f23f9f0a", + "bom-ref": "ba3baff4383b8fe6", "name": "/usr/share/doc/fonts-dejavu-core/copyright", "type": "file" }, { - "bom-ref": "b06318f6f1e6b467", + "bom-ref": "7ebe4d6b50375be7", "name": "/usr/share/doc/fonts-dejavu-mono/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "374d702c4baf879d", + "bom-ref": "9fc28ae5f86a3921", "name": "/usr/share/doc/fonts-dejavu-mono/copyright", "type": "file" }, { - "bom-ref": "6416291c7d8ce337", + "bom-ref": "d076495b9b95e35b", "name": "/usr/share/doc/gcc-13-base/C++/changelog.gz", "type": "file" }, { - "bom-ref": "40e2ac82b45d3926", + "bom-ref": "1e707dc92eeb485e", "name": "/usr/share/doc/gcc-13-base/C++/changelog.libstdc++.gz", "type": "file" }, { - "bom-ref": "d1f48d6a8894de85", + "bom-ref": "2b6581e759190251", "name": "/usr/share/doc/gcc-13-base/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8aa4fb8cf92d7d3a", + "bom-ref": "5217ff8a51169c4a", "name": "/usr/share/doc/gcc-13-base/changelog.gz", "type": "file" }, { - "bom-ref": "2b2c92be17afe555", + "bom-ref": "cb4efdf40f821af1", "name": "/usr/share/doc/gcc-13-base/copyright", "type": "file" }, { - "bom-ref": "606c8b7c028b49bd", + "bom-ref": "186a5bbed598f355", "name": "/usr/share/doc/gcc-13-base/gcc/changelog.gz", "type": "file" }, { - "bom-ref": "420b90d291b71c60", + "bom-ref": "f5f7090daa0fedac", "name": "/usr/share/doc/gcc-13-base/gomp/changelog.gz", "type": "file" }, { - "bom-ref": "909ae334edc4d5f0", + "bom-ref": "9f639c44ce76b34c", "name": "/usr/share/doc/gcc-13-base/itm/changelog.gz", "type": "file" }, { - "bom-ref": "5a7e2bc4fc37eca0", + "bom-ref": "3feeb0be595b6ebc", "name": "/usr/share/doc/gcc-13-base/quadmath/changelog.gz", "type": "file" }, { - "bom-ref": "6faa62be0e22f8ad", + "bom-ref": "a7770908240a1271", "name": "/usr/share/doc/gcc-13-base/sanitizer/changelog.gz", "type": "file" }, { - "bom-ref": "61f02555cfb1657a", + "bom-ref": "91bf1a0fe4620b34", "name": "/usr/share/doc/gcc-14-base/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b31354745350de44", + "bom-ref": "de36c584000590d6", "name": "/usr/share/doc/gcc-14-base/copyright", "type": "file" }, { - "bom-ref": "f490fb538583fa0b", + "bom-ref": "b7f93c08a9f0be36", + "name": "/usr/share/doc/gir1.2-girepository-2.0/copyright", + "type": "file" + }, + { + "bom-ref": "730f2bc5cd7b2785", + "name": "/usr/share/doc/gir1.2-glib-2.0/copyright", + "type": "file" + }, + { + "bom-ref": "f2eb17b7b6cd4759", + "name": "/usr/share/doc/gir1.2-packagekitglib-1.0/copyright", + "type": "file" + }, + { + "bom-ref": "8aafe057619b3e6f", "name": "/usr/share/doc/git-man/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "e272e63a49a59c46", + "bom-ref": "53a6474239d28c66", "name": "/usr/share/doc/git-man/copyright", "type": "file" }, { - "bom-ref": "e26af1f9128d56cd", + "bom-ref": "f5dda85771ebba21", "name": "/usr/share/doc/git/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f429719e49753b31", + "bom-ref": "24ac12a841d012a1", "name": "/usr/share/doc/git/copyright", "type": "file" }, { - "bom-ref": "0320373e022e5b6a", + "bom-ref": "2e7e6ea3161570aa", "name": "/usr/share/doc/gpg/copyright", "type": "file" }, { - "bom-ref": "9e793287a4983722", + "bom-ref": "e3c2b190cd6ff5ea", "name": "/usr/share/doc/gpgconf/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "cae583cf90ce19c0", + "bom-ref": "7faa5af56d5d0870", "name": "/usr/share/doc/gpgconf/copyright", "type": "file" }, { - "bom-ref": "895cd56139745868", + "bom-ref": "f77ab506c2356d42", "name": "/usr/share/doc/gpgv/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8f197151a2b9cb0d", + "bom-ref": "9cfa86c8178c4e43", "name": "/usr/share/doc/gpgv/copyright", "type": "file" }, { - "bom-ref": "827c8b36a9484a21", + "bom-ref": "0d5a7a769184802f", "name": "/usr/share/doc/grep/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "2e12f00187d0b953", + "bom-ref": "b5769fcb4bbc2721", "name": "/usr/share/doc/grep/copyright", "type": "file" }, { - "bom-ref": "925e73c678b4fa7f", + "bom-ref": "3cf6ffe6c9584cd1", "name": "/usr/share/doc/gzip/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "ba16e17d27b68af8", + "bom-ref": "c584622bf6f720c2", "name": "/usr/share/doc/gzip/copyright", "type": "file" }, { - "bom-ref": "c61d80f100ecb6b2", + "bom-ref": "db6eaa4ff268bba0", "name": "/usr/share/doc/hostname/changelog.gz", "type": "file" }, { - "bom-ref": "e5307a4cad36f6b0", + "bom-ref": "f66cb36ed40e38fa", "name": "/usr/share/doc/hostname/copyright", "type": "file" }, { - "bom-ref": "b40885e3ee462f2c", + "bom-ref": "c8f1d6c9c599d148", "name": "/usr/share/doc/ibverbs-providers/copyright", "type": "file" }, { - "bom-ref": "d4d5544b9040dd69", + "bom-ref": "accd3adec767e99f", "name": "/usr/share/doc/init-system-helpers/changelog.gz", "type": "file" }, { - "bom-ref": "6e3a933c61aefce2", + "bom-ref": "7e982683f3b88c20", "name": "/usr/share/doc/init-system-helpers/copyright", "type": "file" }, { - "bom-ref": "2c915c505de1baf9", + "bom-ref": "9484b2f5f12cd628", + "name": "/usr/share/doc/intel-media-va-driver-non-free/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "d2b2f74c38ecb363", + "name": "/usr/share/doc/intel-media-va-driver-non-free/copyright", + "type": "file" + }, + { + "bom-ref": "fa2eb6587e93ed82", + "name": "/usr/share/doc/intel-metrics-discovery/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "acdb41b7d1e280f3", + "name": "/usr/share/doc/intel-metrics-discovery/copyright", + "type": "file" + }, + { + "bom-ref": "c74864a8a496e720", + "name": "/usr/share/doc/intel-metrics-library/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "ed85c17a0f604b76", + "name": "/usr/share/doc/intel-metrics-library/copyright", + "type": "file" + }, + { + "bom-ref": "cab4f79ba3f6371e", "name": "/usr/share/doc/intel-ocloc/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "531ad6d74c449a9e", + "bom-ref": "ae6042185e0fdd5d", "name": "/usr/share/doc/intel-ocloc/copyright", "type": "file" }, { - "bom-ref": "8e56b0f117c740f3", + "bom-ref": "69ccf0379ddfd2cc", "name": "/usr/share/doc/intel-opencl-icd/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "3da713944e960e80", + "bom-ref": "f5d204d5573f3e6f", "name": "/usr/share/doc/intel-opencl-icd/copyright", "type": "file" }, { - "bom-ref": "8c4aa6853ef753cc", + "bom-ref": "09dd6a05e78d9ad9", + "name": "/usr/share/doc/iso-codes/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "e224c8d6b42e1043", + "name": "/usr/share/doc/iso-codes/copyright", + "type": "file" + }, + { + "bom-ref": "9b2afada0989ce0e", "name": "/usr/share/doc/libacl1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "62a0fb9e95b87704", + "bom-ref": "f77c65edc8acbf92", "name": "/usr/share/doc/libacl1/copyright", "type": "file" }, { - "bom-ref": "39b34cf25d052682", + "bom-ref": "c426a8f464a042ea", "name": "/usr/share/doc/libaio-dev/copyright", "type": "file" }, { - "bom-ref": "7d4d26d6b94d4ac8", + "bom-ref": "7ffed0e456fddc14", "name": "/usr/share/doc/libaio1t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "165be4aa9069321d", + "bom-ref": "a97ce4c4d9151205", "name": "/usr/share/doc/libaio1t64/copyright", "type": "file" }, { - "bom-ref": "dc9ae781700f2829", + "bom-ref": "50ab938257e2d819", "name": "/usr/share/doc/libaom3/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "930d16d8ad332662", + "bom-ref": "ba945106cf8f93ca", "name": "/usr/share/doc/libaom3/copyright", "type": "file" }, { - "bom-ref": "c89ffb95e78ba966", + "bom-ref": "686a8c9ffee96bc6", "name": "/usr/share/doc/libapparmor1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "38a8266371b9c8cd", + "bom-ref": "c7bead3ad5527495", "name": "/usr/share/doc/libapparmor1/copyright", "type": "file" }, { - "bom-ref": "657ceb13c99f81ef", + "bom-ref": "fba696aeb30206df", + "name": "/usr/share/doc/libappstream5/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "5195c3d2b0ed5e78", + "name": "/usr/share/doc/libappstream5/copyright", + "type": "file" + }, + { + "bom-ref": "9bf5c078a4610e85", "name": "/usr/share/doc/libapt-pkg6.0t64/changelog.gz", "type": "file" }, { - "bom-ref": "10ae040d308f1fe5", + "bom-ref": "52c7c30d40d184fb", "name": "/usr/share/doc/libapt-pkg6.0t64/copyright", "type": "file" }, { - "bom-ref": "fb8396429be760dc", + "bom-ref": "4c8a7209249f71e2", "name": "/usr/share/doc/libargon2-1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8b6262fa3e645de1", + "bom-ref": "19651353b8fab5a7", "name": "/usr/share/doc/libargon2-1/copyright", "type": "file" }, { - "bom-ref": "d59bd308e0e09cf4", + "bom-ref": "3677b51bf559add0", "name": "/usr/share/doc/libasound2-data/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "23ada310828060df", + "bom-ref": "446cb4aa8829e8db", "name": "/usr/share/doc/libasound2-data/copyright", "type": "file" }, { - "bom-ref": "14b5866f8cfc16e2", + "bom-ref": "8b1362147c0a2512", "name": "/usr/share/doc/libasound2t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "0cc4cbcb0420410a", + "bom-ref": "5e9ab14bebaf1a42", "name": "/usr/share/doc/libasound2t64/copyright", "type": "file" }, { - "bom-ref": "51fcbc2369c06450", + "bom-ref": "59fe34c17603e468", "name": "/usr/share/doc/libass9/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "9ab531dc31669967", + "bom-ref": "ab70ed9f912baa37", "name": "/usr/share/doc/libass9/copyright", "type": "file" }, { - "bom-ref": "d52e466356185659", + "bom-ref": "207d2e867c185c17", "name": "/usr/share/doc/libassuan0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "299685c23e0b5e02", + "bom-ref": "5fb5d1eeb80f6c30", "name": "/usr/share/doc/libassuan0/copyright", "type": "file" }, { - "bom-ref": "a9e37906e411c3fd", + "bom-ref": "4f23929a42349a81", "name": "/usr/share/doc/libasyncns0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "ba7dfb189587cb51", + "bom-ref": "62522654e406f395", "name": "/usr/share/doc/libasyncns0/copyright", "type": "file" }, { - "bom-ref": "b8b621363c3c3870", + "bom-ref": "8c7a899f41898abe", "name": "/usr/share/doc/libattr1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c103d2e5b4f42fe6", + "bom-ref": "d4fad473407af7f4", "name": "/usr/share/doc/libattr1/copyright", "type": "file" }, { - "bom-ref": "4281fd1b4c97a783", + "bom-ref": "2a71d5e839d072b1", "name": "/usr/share/doc/libaudit-common/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d7f70065280f0be2", + "bom-ref": "7b8a96ba8dab70d8", "name": "/usr/share/doc/libaudit-common/copyright", "type": "file" }, { - "bom-ref": "71aead32aca342d4", + "bom-ref": "c61e47366219a5a2", "name": "/usr/share/doc/libaudit1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "91228efc49d25080", + "bom-ref": "21e6053619e7b806", "name": "/usr/share/doc/libaudit1/copyright", "type": "file" }, { - "bom-ref": "1c81cdf34f05f44c", + "bom-ref": "5613cb0c3ec3a82c", "name": "/usr/share/doc/libavc1394-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "ec206da39185a76e", + "bom-ref": "6c8d4fb1fb63c1d6", "name": "/usr/share/doc/libavc1394-0/copyright", "type": "file" }, { - "bom-ref": "63a046c5381fe57f", + "bom-ref": "50cfc05f07ffeebf", "name": "/usr/share/doc/libavcodec60/copyright", "type": "file" }, { - "bom-ref": "ca3cf951ba92bd5a", + "bom-ref": "8c2e44f56052b85a", "name": "/usr/share/doc/libavdevice60/copyright", "type": "file" }, { - "bom-ref": "7040ab3565e3944f", + "bom-ref": "016308febb5b61bb", "name": "/usr/share/doc/libavfilter9/copyright", "type": "file" }, { - "bom-ref": "4f976a845dbde639", + "bom-ref": "b3dba15e70ffd881", "name": "/usr/share/doc/libavformat60/copyright", "type": "file" }, { - "bom-ref": "bede8362fbf294f7", + "bom-ref": "415ff4035b6289e3", "name": "/usr/share/doc/libavutil58/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "e36b2ac0cfe3d03b", + "bom-ref": "f57d4e9553c62167", "name": "/usr/share/doc/libavutil58/copyright", "type": "file" }, { - "bom-ref": "2b1b9d280d4dad75", + "bom-ref": "3050cef1384642a5", "name": "/usr/share/doc/libblas3/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "a7403e85f7b79f27", + "bom-ref": "c9c4126a59f8d2eb", "name": "/usr/share/doc/libblas3/copyright", "type": "file" }, { - "bom-ref": "87da0dd46a4bac27", + "bom-ref": "ecbe5dbc83e936f3", "name": "/usr/share/doc/libblkid1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "12fbddcc6b6a96ec", + "bom-ref": "de228468dbe747c8", "name": "/usr/share/doc/libblkid1/copyright", "type": "file" }, { - "bom-ref": "ee324789ee43e03c", + "bom-ref": "8d64e7618e28dd60", "name": "/usr/share/doc/libbluray2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8aaa180b69892967", + "bom-ref": "32bcf1f7fe1dbc63", "name": "/usr/share/doc/libbluray2/copyright", "type": "file" }, { - "bom-ref": "e5d8b9e3d5e66f03", + "bom-ref": "6cb4e317f4d09bdf", "name": "/usr/share/doc/libbrotli1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c5040ac2c4642aef", + "bom-ref": "236dd91568634533", "name": "/usr/share/doc/libbrotli1/copyright", "type": "file" }, { - "bom-ref": "c8aba9067ebf9c81", + "bom-ref": "96436c2ee6d39a3d", "name": "/usr/share/doc/libbs2b0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "38470abc07948d43", + "bom-ref": "622a0ca8e3d97597", "name": "/usr/share/doc/libbs2b0/copyright", "type": "file" }, { - "bom-ref": "1aac445470e7a7d8", + "bom-ref": "119d5d1926006a00", "name": "/usr/share/doc/libbsd0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "aae59bd7198c0423", + "bom-ref": "0f2d9216800e4efb", "name": "/usr/share/doc/libbsd0/copyright", "type": "file" }, { - "bom-ref": "cba0c39e39805437", + "bom-ref": "72721ab4eac241b9", "name": "/usr/share/doc/libbz2-1.0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "5eaf1c99e10c8bed", + "bom-ref": "72d18022dd2be8f7", "name": "/usr/share/doc/libbz2-1.0/copyright", "type": "file" }, { - "bom-ref": "318c338d7a07fb34", + "bom-ref": "6fdb5293ee058d46", "name": "/usr/share/doc/libc-bin/copyright", "type": "file" }, { - "bom-ref": "fc4a2a9f759c9704", + "bom-ref": "bb2fb687eef35910", "name": "/usr/share/doc/libc-dev-bin/copyright", "type": "file" }, { - "bom-ref": "a64f8a0081d92cbc", + "bom-ref": "561fd5dac87d46a0", "name": "/usr/share/doc/libc6-dev/copyright", "type": "file" }, { - "bom-ref": "08b7a551cc1987c3", + "bom-ref": "23f8b00cf9c5d8c1", "name": "/usr/share/doc/libc6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "ddd71398f2018fcc", + "bom-ref": "8b43b970cf2c28ca", "name": "/usr/share/doc/libc6/copyright", "type": "file" }, { - "bom-ref": "ec4b88438dcd480b", + "bom-ref": "04fe89490595a343", "name": "/usr/share/doc/libcaca0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "3c0f5b1ef9b0fecc", + "bom-ref": "58ed181da58c62a0", "name": "/usr/share/doc/libcaca0/copyright", "type": "file" }, { - "bom-ref": "dd82358ff81c8130", + "bom-ref": "80f63bc22238dc4c", "name": "/usr/share/doc/libcairo-gobject2/copyright", "type": "file" }, { - "bom-ref": "6e4ba2a660d43387", + "bom-ref": "c9a5a85d9814befb", "name": "/usr/share/doc/libcairo2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "0284bc6b46e3e9f7", + "bom-ref": "3ae0398a2b8169d7", "name": "/usr/share/doc/libcairo2/copyright", "type": "file" }, { - "bom-ref": "bcd426cd83424706", + "bom-ref": "47dbc74a37b928ac", "name": "/usr/share/doc/libcap-ng0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "9490e58b932ab89b", + "bom-ref": "32b4f9456f999aa5", "name": "/usr/share/doc/libcap-ng0/copyright", "type": "file" }, { - "bom-ref": "4f589e8b820e3a07", + "bom-ref": "2374dbe88d6b57a1", + "name": "/usr/share/doc/libcap2-bin/copyright", + "type": "file" + }, + { + "bom-ref": "f596f2f1bc2b0c21", "name": "/usr/share/doc/libcap2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "33b8521b11dc2096", + "bom-ref": "240b83981f2d382c", "name": "/usr/share/doc/libcap2/copyright", "type": "file" }, { - "bom-ref": "29803afb49e8548c", + "bom-ref": "a211895c2fb3d630", "name": "/usr/share/doc/libcdio-cdda2t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "fea08ba88eaae855", + "bom-ref": "9e0dd313529cc725", "name": "/usr/share/doc/libcdio-cdda2t64/copyright", "type": "file" }, { - "bom-ref": "e2a39fe038d2628d", + "bom-ref": "ee0b005ce7dc134d", "name": "/usr/share/doc/libcdio-paranoia2t64/copyright", "type": "file" }, { - "bom-ref": "f828ac55c14c6a47", + "bom-ref": "a08119312929b427", "name": "/usr/share/doc/libcdio19t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "893853f212a0fd86", + "bom-ref": "ca1d8c3de4bd31aa", "name": "/usr/share/doc/libcdio19t64/copyright", "type": "file" }, { - "bom-ref": "38a0603f67a0fc1b", + "bom-ref": "f9c7eab45e863ab7", "name": "/usr/share/doc/libchromaprint1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "415b360590246ab9", + "bom-ref": "db4651b607d66061", "name": "/usr/share/doc/libchromaprint1/copyright", "type": "file" }, { - "bom-ref": "616e701bef8dfd8e", + "bom-ref": "07782d5e31c25536", "name": "/usr/share/doc/libcjson1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8db02ea4e862614c", + "bom-ref": "35881a64116a9a80", "name": "/usr/share/doc/libcjson1/copyright", "type": "file" }, { - "bom-ref": "02373714912f8bce", + "bom-ref": "d3df1261d380771a", "name": "/usr/share/doc/libcodec2-1.2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f4310741c28f16a2", + "bom-ref": "c5acceaad543dffe", "name": "/usr/share/doc/libcodec2-1.2/copyright", "type": "file" }, { - "bom-ref": "98d2be3c71ad3afe", + "bom-ref": "23c92a7918dc660c", "name": "/usr/share/doc/libcom-err2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "1d6813cc8326564f", + "bom-ref": "e1ea796d9db8a321", "name": "/usr/share/doc/libcom-err2/copyright", "type": "file" }, { - "bom-ref": "26659172f6cf1e72", + "bom-ref": "9a7a2e5890803132", "name": "/usr/share/doc/libcrypt-dev/copyright", "type": "file" }, { - "bom-ref": "423e048e80e69fdc", + "bom-ref": "6f76b80d1b2bf5d2", "name": "/usr/share/doc/libcrypt1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "a3e55258adacb9c0", + "bom-ref": "a234fda39b70119a", "name": "/usr/share/doc/libcrypt1/copyright", "type": "file" }, { - "bom-ref": "81da0b81b9779b6e", + "bom-ref": "bb5a50173c53ac60", "name": "/usr/share/doc/libcryptsetup12/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "081ebfa851e304ab", + "bom-ref": "226711126026e509", "name": "/usr/share/doc/libcryptsetup12/copyright", "type": "file" }, { - "bom-ref": "9b76cdb261deefd4", + "bom-ref": "2cafd4f00014e710", "name": "/usr/share/doc/libctf-nobfd0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "21dd22f77b06032d", + "bom-ref": "3a32616c96762f21", "name": "/usr/share/doc/libctf-nobfd0/copyright", "type": "file" }, { - "bom-ref": "db84f1d2666fed03", + "bom-ref": "030d0637aec07793", "name": "/usr/share/doc/libcurl3t64-gnutls/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "229e0d215042fccd", + "bom-ref": "5348a745246a7715", "name": "/usr/share/doc/libcurl3t64-gnutls/copyright", "type": "file" }, { - "bom-ref": "0f6dd9ca90e073e9", + "bom-ref": "84ae6e679272ac3d", "name": "/usr/share/doc/libcurl4t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "bf732f6f7b7d74dd", + "bom-ref": "4251acf6ebf1a969", "name": "/usr/share/doc/libcurl4t64/copyright", "type": "file" }, { - "bom-ref": "7597b738ea8ad27c", + "bom-ref": "1788311cdcb7edf4", "name": "/usr/share/doc/libdatrie1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d0e02bdeb689c65b", + "bom-ref": "bcb877daf60b8a6b", "name": "/usr/share/doc/libdatrie1/copyright", "type": "file" }, { - "bom-ref": "5c074750d16e2005", + "bom-ref": "151133ea67028b8d", "name": "/usr/share/doc/libdav1d7/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "85abdaffaeffe3c5", + "bom-ref": "4e3ee649db962c2d", "name": "/usr/share/doc/libdav1d7/copyright", "type": "file" }, { - "bom-ref": "398ca22f27acc260", + "bom-ref": "634cd275e90154d6", "name": "/usr/share/doc/libdb5.3t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d17d35a22f8f983f", + "bom-ref": "c2418c51eec68905", "name": "/usr/share/doc/libdb5.3t64/copyright", "type": "file" }, { - "bom-ref": "eb794d1870306a83", + "bom-ref": "73b44e84efc2fffb", "name": "/usr/share/doc/libdbus-1-3/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f77c9f4d670b5d5a", + "bom-ref": "826ba81b4e6bc1ae", "name": "/usr/share/doc/libdbus-1-3/copyright", "type": "file" }, { - "bom-ref": "d3c00fde9baf3d11", + "bom-ref": "7a7a0ad314a4fb89", "name": "/usr/share/doc/libdc1394-25/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "1b5ab16186ea52c9", + "bom-ref": "a9ef287a104e3cf1", "name": "/usr/share/doc/libdc1394-25/copyright", "type": "file" }, { - "bom-ref": "f042de34598a2958", + "bom-ref": "05e03d6b02f89c52", "name": "/usr/share/doc/libdebconfclient0/changelog.gz", "type": "file" }, { - "bom-ref": "115620c3e09fbf75", + "bom-ref": "4a7c19a225b11bcb", "name": "/usr/share/doc/libdebconfclient0/copyright", "type": "file" }, { - "bom-ref": "c00a98d5ee7214e6", + "bom-ref": "ff35b5f8a7cde6de", "name": "/usr/share/doc/libdecor-0-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "ad0101af185efbac", + "bom-ref": "7915ff19c5f3082c", "name": "/usr/share/doc/libdecor-0-0/copyright", "type": "file" }, { - "bom-ref": "7dee14169889d98b", + "bom-ref": "02803e9b9948123b", "name": "/usr/share/doc/libdeflate0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "49774209a28b9b76", + "bom-ref": "88ab8ddaa1a69946", "name": "/usr/share/doc/libdeflate0/copyright", "type": "file" }, { - "bom-ref": "b3613dec0b945158", + "bom-ref": "7a203e4a13829922", "name": "/usr/share/doc/libdevmapper1.02.1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "56395b7e1a9ba652", + "bom-ref": "1c9f65e5ad2835cc", "name": "/usr/share/doc/libdevmapper1.02.1/copyright", "type": "file" }, { - "bom-ref": "a59d6a65e78ac58a", + "bom-ref": "7f3d961a46ff05c6", "name": "/usr/share/doc/libdpkg-perl/copyright", "type": "file" }, { - "bom-ref": "74dcfbcaf2810295", + "bom-ref": "202ad99ed9d131d5", "name": "/usr/share/doc/libdrm-amdgpu1/copyright", "type": "file" }, { - "bom-ref": "f1db5b9bda5cc2aa", + "bom-ref": "41099262c7b12b1a", "name": "/usr/share/doc/libdrm-common/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "40d20901c78e2c20", + "bom-ref": "7787464988ae096c", "name": "/usr/share/doc/libdrm-common/copyright", "type": "file" }, { - "bom-ref": "d7f69e67c4cc9712", + "bom-ref": "19ed91b1f0befe92", "name": "/usr/share/doc/libdrm-intel1/copyright", "type": "file" }, { - "bom-ref": "7f34f147cec4c12d", + "bom-ref": "248c194972a44c69", "name": "/usr/share/doc/libdrm2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "7a656583e27e1258", + "bom-ref": "ce99ec166375e1c0", "name": "/usr/share/doc/libdrm2/copyright", "type": "file" }, { - "bom-ref": "bf3fe16f5cf34dcb", + "bom-ref": "dc96002f51a16d22", + "name": "/usr/share/doc/libduktape207/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "7455db83c4a616e3", + "name": "/usr/share/doc/libduktape207/copyright", + "type": "file" + }, + { + "bom-ref": "d7b27660bc739d0e", + "name": "/usr/share/doc/libdw1t64/copyright", + "type": "file" + }, + { + "bom-ref": "e3ea4a201389b6ff", "name": "/usr/share/doc/libedit2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "3aaf59dc819b6446", + "bom-ref": "d0fa02f8049e7436", "name": "/usr/share/doc/libedit2/copyright", "type": "file" }, { - "bom-ref": "b768a7dfea5495ad", + "bom-ref": "58b8453a8aa902b9", "name": "/usr/share/doc/libelf1t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "5977c43ed18ca9e2", + "bom-ref": "5344b45943cb6e2a", "name": "/usr/share/doc/libelf1t64/copyright", "type": "file" }, { - "bom-ref": "c318d4f69e831f22", + "bom-ref": "83a93365cb05b696", "name": "/usr/share/doc/liberror-perl/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f39dd1f781f68b6a", + "bom-ref": "ba92ab04e161e476", "name": "/usr/share/doc/liberror-perl/copyright", "type": "file" }, { - "bom-ref": "f0178d8bf996954b", + "bom-ref": "2ad2206311a08c8f", "name": "/usr/share/doc/libexpat1-dev/copyright", "type": "file" }, { - "bom-ref": "5cce80d001d4af06", + "bom-ref": "5d1c4bf2ebf927ca", "name": "/usr/share/doc/libexpat1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "eb6277458ebfcaa3", + "bom-ref": "5b6b97002b25dc77", "name": "/usr/share/doc/libexpat1/copyright", "type": "file" }, { - "bom-ref": "c775eda1c08810b8", + "bom-ref": "afc46d559093115a", "name": "/usr/share/doc/libext2fs2t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "a298470504f3f3d4", + "bom-ref": "123495234cccc1f2", "name": "/usr/share/doc/libext2fs2t64/copyright", "type": "file" }, { - "bom-ref": "80a0f24e2d27ebec", + "bom-ref": "f80a31b5653b0242", "name": "/usr/share/doc/libfdisk1/copyright", "type": "file" }, { - "bom-ref": "8155518c15fdc6a5", + "bom-ref": "72717bb4faffbc7b", "name": "/usr/share/doc/libffi8/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "aaa60f1bd493e5a6", + "bom-ref": "53ef81eca8b0ab48", "name": "/usr/share/doc/libffi8/copyright", "type": "file" }, { - "bom-ref": "670a69547f9714f2", + "bom-ref": "aeac09ab071ef8e2", "name": "/usr/share/doc/libfftw3-double3/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8e026fae5162dd5b", + "bom-ref": "eaee57d428bea68b", "name": "/usr/share/doc/libfftw3-double3/copyright", "type": "file" }, { - "bom-ref": "2fcdb6cef3275933", + "bom-ref": "9b94c47c13de23cf", "name": "/usr/share/doc/libflac12t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "26f0e9cc86b623e4", + "bom-ref": "aad98e80f61013a0", "name": "/usr/share/doc/libflac12t64/copyright", "type": "file" }, { - "bom-ref": "277c71dbac7bfef3", + "bom-ref": "2d5219382848eb3b", "name": "/usr/share/doc/libflite1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "e3c09e6900efcaab", + "bom-ref": "07a23048a039a01b", "name": "/usr/share/doc/libflite1/copyright", "type": "file" }, { - "bom-ref": "49c3544f1f5d7b2e", + "bom-ref": "5e16a1cfee5efdc2", "name": "/usr/share/doc/libfontconfig1/copyright", "type": "file" }, { - "bom-ref": "aaad46215a52fb7b", + "bom-ref": "214acff15d9755af", "name": "/usr/share/doc/libfreetype6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "02657deb9d034e4f", + "bom-ref": "53eabaf8a3e531c7", "name": "/usr/share/doc/libfreetype6/copyright", "type": "file" }, { - "bom-ref": "969b98888edfed0c", + "bom-ref": "d2be50c480a286a4", "name": "/usr/share/doc/libfribidi0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8ef8bfcda8fb9fbb", + "bom-ref": "c65be0129137feff", "name": "/usr/share/doc/libfribidi0/copyright", "type": "file" }, { - "bom-ref": "ae3ee8f9b314a314", + "bom-ref": "b6ee844c697e454c", "name": "/usr/share/doc/libgbm1/copyright", "type": "file" }, { - "bom-ref": "a7b62dc132f4e9e6", + "bom-ref": "48e8c9baf07c859c", "name": "/usr/share/doc/libgcrypt20/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "10e1038bf25e6cd9", + "bom-ref": "c1ff8e261e4db173", "name": "/usr/share/doc/libgcrypt20/copyright", "type": "file" }, { - "bom-ref": "a4c4ee30a24fc73b", + "bom-ref": "683aa1a1f54a107f", "name": "/usr/share/doc/libgdbm-compat4t64/copyright", "type": "file" }, { - "bom-ref": "2e14d19ab0e7a479", + "bom-ref": "c0710a7b27e511e5", "name": "/usr/share/doc/libgdbm6t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "beefd7e0269ece3a", + "bom-ref": "4ddb9bf4c2e4267a", "name": "/usr/share/doc/libgdbm6t64/copyright", "type": "file" }, { - "bom-ref": "318af60f8ce67de1", + "bom-ref": "d9b48640182e1fe1", "name": "/usr/share/doc/libgdk-pixbuf-2.0-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d419d27de944b754", + "bom-ref": "29c774010f654a2c", "name": "/usr/share/doc/libgdk-pixbuf-2.0-0/copyright", "type": "file" }, { - "bom-ref": "127f709b72496e19", + "bom-ref": "3ef3067ffdc57855", "name": "/usr/share/doc/libgdk-pixbuf2.0-common/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8b7fc1c12e8f886b", + "bom-ref": "2a4a7056dc8578cf", "name": "/usr/share/doc/libgdk-pixbuf2.0-common/copyright", "type": "file" }, { - "bom-ref": "58e57e7cc4269446", + "bom-ref": "21cad094cbdaa833", + "name": "/usr/share/doc/libgirepository-1.0-1/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "130a8966caa7ca77", + "name": "/usr/share/doc/libgirepository-1.0-1/copyright", + "type": "file" + }, + { + "bom-ref": "d7c27fa4f429736e", "name": "/usr/share/doc/libgl1-mesa-dri/copyright", "type": "file" }, { - "bom-ref": "5c4f0788cc1a4075", + "bom-ref": "bf0e304cb691c5fd", "name": "/usr/share/doc/libgl1/copyright", "type": "file" }, { - "bom-ref": "698e6585a409ac15", + "bom-ref": "413ea4bf4e9fb101", "name": "/usr/share/doc/libglib2.0-0t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "e5c974e40f2a83d2", + "bom-ref": "062330e13cfd29c2", "name": "/usr/share/doc/libglib2.0-0t64/copyright", "type": "file" }, { - "bom-ref": "f0dbb8aabb325fc8", + "bom-ref": "7be7c0d97d7a3a65", + "name": "/usr/share/doc/libglib2.0-bin/copyright", + "type": "file" + }, + { + "bom-ref": "2b8317420304f8c0", + "name": "/usr/share/doc/libglib2.0-data/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "338fdf5d90c932fe", + "name": "/usr/share/doc/libglib2.0-data/copyright", + "type": "file" + }, + { + "bom-ref": "1a360eb0bde5a348", "name": "/usr/share/doc/libglvnd0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b30fae07b100daee", + "bom-ref": "7ff9082209d9b3de", "name": "/usr/share/doc/libglvnd0/copyright", "type": "file" }, { - "bom-ref": "fc80bb2fee8ad12f", + "bom-ref": "ac9f94ee32ee619f", "name": "/usr/share/doc/libglx-mesa0/copyright", "type": "file" }, { - "bom-ref": "089c4cd0300439eb", + "bom-ref": "6695fd799ec6650f", "name": "/usr/share/doc/libglx0/copyright", "type": "file" }, { - "bom-ref": "c431aba8bad9a38e", + "bom-ref": "d1f2d493b6895ba6", "name": "/usr/share/doc/libgme0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "bd9c648159507ef9", + "bom-ref": "d15aa08e0a9b380d", "name": "/usr/share/doc/libgme0/copyright", "type": "file" }, { - "bom-ref": "1e8d55e786f358b8", + "bom-ref": "7bdfd4cd3d7bef82", "name": "/usr/share/doc/libgmp10/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "4840df243a0b93c8", + "bom-ref": "2561b10e584f6812", "name": "/usr/share/doc/libgmp10/copyright", "type": "file" }, { - "bom-ref": "9bd7e750eafc7288", + "bom-ref": "0b8f54e0587b833e", "name": "/usr/share/doc/libgnutls30t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "25fa4417ddc0919f", + "bom-ref": "640b1a5b5905f731", "name": "/usr/share/doc/libgnutls30t64/copyright", "type": "file" }, { - "bom-ref": "d7a07c084e8a4264", + "bom-ref": "4b92049a25e88396", "name": "/usr/share/doc/libgpg-error0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "cd4ce14df304bdaf", + "bom-ref": "0eb49bc93e8698c5", "name": "/usr/share/doc/libgpg-error0/copyright", "type": "file" }, { - "bom-ref": "31061f50ef6a9394", + "bom-ref": "00807cd52ed05f4c", "name": "/usr/share/doc/libgpm2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "4245868f9e0de794", + "bom-ref": "63ba66bee78b451c", "name": "/usr/share/doc/libgpm2/copyright", "type": "file" }, { - "bom-ref": "fdd104b552825b0c", + "bom-ref": "e18aae19f8ba2fdc", "name": "/usr/share/doc/libgraphite2-3/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b5b0bf9738dfe449", + "bom-ref": "db1be997ca077235", "name": "/usr/share/doc/libgraphite2-3/copyright", "type": "file" }, { - "bom-ref": "85291ad110565af1", + "bom-ref": "5e782b735596ce19", "name": "/usr/share/doc/libgsm1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c01f50bf168d8759", + "bom-ref": "10f2fa6be1309719", "name": "/usr/share/doc/libgsm1/copyright", "type": "file" }, { - "bom-ref": "1d7e46b9a4242b37", + "bom-ref": "955e566b81309173", "name": "/usr/share/doc/libgssapi-krb5-2/copyright", "type": "file" }, { - "bom-ref": "40c79c0d5657094e", + "bom-ref": "ba6d35060054d73a", + "name": "/usr/share/doc/libgstreamer1.0-0/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "a9bef90a50b74529", + "name": "/usr/share/doc/libgstreamer1.0-0/copyright", + "type": "file" + }, + { + "bom-ref": "0d121e104e9bbf62", "name": "/usr/share/doc/libharfbuzz0b/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "48c47ad95b789809", + "bom-ref": "9b2fd3dd03f2fab1", "name": "/usr/share/doc/libharfbuzz0b/copyright", "type": "file" }, { - "bom-ref": "38859f89a8d9c8eb", + "bom-ref": "37d1367c1f8e141d", "name": "/usr/share/doc/libhogweed6t64/copyright", "type": "file" }, { - "bom-ref": "fa4275dd96768618", + "bom-ref": "57cddbf7ab449386", + "name": "/usr/share/doc/libhwloc15/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "009e955193b8d8b2", + "name": "/usr/share/doc/libhwloc15/copyright", + "type": "file" + }, + { + "bom-ref": "2bb5b5e58d4ce858", "name": "/usr/share/doc/libhwy1t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "6f4693cb7960d3f8", + "bom-ref": "a3d0adef77c02ff0", "name": "/usr/share/doc/libhwy1t64/copyright", "type": "file" }, { - "bom-ref": "fe3ac2b3dabc3a1e", + "bom-ref": "6622c8e5aec603fa", "name": "/usr/share/doc/libibmad5/copyright", "type": "file" }, { - "bom-ref": "06df7cdca743978a", + "bom-ref": "495f37fb46a11036", "name": "/usr/share/doc/libibumad3/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "26c4ee1ecd08d2db", + "bom-ref": "a346d89301d3d22f", "name": "/usr/share/doc/libibumad3/copyright", "type": "file" }, { - "bom-ref": "c96fb72f8615f83b", + "bom-ref": "c9d7cab61dacb09f", "name": "/usr/share/doc/libibverbs1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "52398f208ccab3e8", + "bom-ref": "8095548dfcf1f34c", "name": "/usr/share/doc/libibverbs1/copyright", "type": "file" }, { - "bom-ref": "ac43cb4ac4e53be2", + "bom-ref": "3d2b5be6e971b9e2", "name": "/usr/share/doc/libice6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "47b8064dd3555614", + "bom-ref": "7b755a388a07d260", "name": "/usr/share/doc/libice6/copyright", "type": "file" }, { - "bom-ref": "fcd6d3bb28ff132c", + "bom-ref": "184a57dd908b3164", "name": "/usr/share/doc/libicu74/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "fdeb514b07a27c3d", + "bom-ref": "2d6f9aa6cf6c9a61", "name": "/usr/share/doc/libicu74/copyright", "type": "file" }, { - "bom-ref": "eaa7e14929fba458", + "bom-ref": "5e6a602fe057ffda", "name": "/usr/share/doc/libidn2-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "fcfe42ff96a7a9a8", + "bom-ref": "2aed2aa88b23e536", "name": "/usr/share/doc/libidn2-0/copyright", "type": "file" }, { - "bom-ref": "6456d74ccf3e02d4", + "bom-ref": "a0a5602d0d583ea8", "name": "/usr/share/doc/libiec61883-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "36dcdae5ddc8cffe", + "bom-ref": "9bdf38bbbe658902", "name": "/usr/share/doc/libiec61883-0/copyright", "type": "file" }, { - "bom-ref": "48aaa9fd9086d21f", - "name": "/usr/share/doc/libigdgmm12/changelog.gz", + "bom-ref": "6bc0f3c2fab527b1", + "name": "/usr/share/doc/libigdgmm12/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c37374f7eeb8ed2b", + "bom-ref": "53f39e369e0a8f35", "name": "/usr/share/doc/libigdgmm12/copyright", "type": "file" }, { - "bom-ref": "58582a1765dc1621", + "bom-ref": "aabc5e6f2b1e23a7", + "name": "/usr/share/doc/libigsc1/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "4da8da83bb23d6f2", + "name": "/usr/share/doc/libigsc1/copyright", + "type": "file" + }, + { + "bom-ref": "9a6727062488f43d", "name": "/usr/share/doc/libisl23/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "a81dc24955730f15", + "bom-ref": "fc41e70e75a04fd1", "name": "/usr/share/doc/libisl23/copyright", "type": "file" }, { - "bom-ref": "a64eb34ea5da2812", + "bom-ref": "2e4bf939e73cd20e", "name": "/usr/share/doc/libjack-jackd2-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d9fc75f7b1881225", + "bom-ref": "93b7b8ea28432329", "name": "/usr/share/doc/libjack-jackd2-0/copyright", "type": "file" }, { - "bom-ref": "a74088517f90dbaa", + "bom-ref": "0a7f3d1bf2ce4aee", "name": "/usr/share/doc/libjansson4/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f70f25d899005fd8", + "bom-ref": "6312f8f37570dde0", "name": "/usr/share/doc/libjansson4/copyright", "type": "file" }, { - "bom-ref": "7e11841b4508bfcf", + "bom-ref": "bb53efcda4cac517", "name": "/usr/share/doc/libjbig0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "32f23a0a11160abd", + "bom-ref": "9ed7c4c634f576b1", "name": "/usr/share/doc/libjbig0/copyright", "type": "file" }, { - "bom-ref": "a58204b0b9c20cc6", + "bom-ref": "2603a616b79747be", "name": "/usr/share/doc/libjpeg-turbo8/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "705c79f858c244be", + "bom-ref": "d883811ec5dfd45e", "name": "/usr/share/doc/libjpeg-turbo8/copyright", "type": "file" }, { - "bom-ref": "0aea8856da2bbad0", + "bom-ref": "304d2165055e0928", "name": "/usr/share/doc/libjpeg8/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "3abacdea9d939efc", + "bom-ref": "3a3faffad8471514", "name": "/usr/share/doc/libjpeg8/copyright", "type": "file" }, { - "bom-ref": "06d858a03492cc38", + "bom-ref": "6ae84b96c9fdb88e", "name": "/usr/share/doc/libjson-c5/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "dd69125aa81d9c28", + "bom-ref": "534f4ce427c57112", "name": "/usr/share/doc/libjson-c5/copyright", "type": "file" }, { - "bom-ref": "ca3ac0914511368e", + "bom-ref": "77549f70557f6732", "name": "/usr/share/doc/libjxl0.7/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "870bb4640de79b9a", + "bom-ref": "65b77dd438ebc13a", "name": "/usr/share/doc/libjxl0.7/copyright", "type": "file" }, { - "bom-ref": "b848f829d349e155", + "bom-ref": "27e1d377b5767c0d", "name": "/usr/share/doc/libk5crypto3/copyright", "type": "file" }, { - "bom-ref": "545246cdcefbf8dc", + "bom-ref": "74335a5ced576e40", "name": "/usr/share/doc/libkeyutils1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "236a1f86413d2ccb", + "bom-ref": "9ab04bc004227463", "name": "/usr/share/doc/libkeyutils1/copyright", "type": "file" }, { - "bom-ref": "5c794cebb90493cf", + "bom-ref": "635807177bc6ea3d", "name": "/usr/share/doc/libkmod2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c9146212a7a2e192", + "bom-ref": "0401db1cc8eeeb40", "name": "/usr/share/doc/libkmod2/copyright", "type": "file" }, { - "bom-ref": "c6552b1b67aac608", + "bom-ref": "d28ab95acd1c10f4", "name": "/usr/share/doc/libkrb5-3/copyright", "type": "file" }, { - "bom-ref": "e82f8019ce887cfd", + "bom-ref": "879178726297d1b9", "name": "/usr/share/doc/libkrb5support0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "20157a00c6ae3ad9", + "bom-ref": "145c1c52748e3f1d", "name": "/usr/share/doc/libkrb5support0/copyright", "type": "file" }, { - "bom-ref": "1ccb6604ba5d1998", + "bom-ref": "b3b64da5f131daac", "name": "/usr/share/doc/liblapack3/copyright", "type": "file" }, { - "bom-ref": "5db4d7587d638e6e", + "bom-ref": "e339da9b98d614ca", "name": "/usr/share/doc/liblcms2-2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8cb042ca7b20d62d", + "bom-ref": "4ebdf6491337b201", "name": "/usr/share/doc/liblcms2-2/copyright", "type": "file" }, { - "bom-ref": "d2be2a170b0e4228", + "bom-ref": "188fc8f5d1349d40", "name": "/usr/share/doc/libldap2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f8579ba721d5a057", + "bom-ref": "fffecc5fabc91287", "name": "/usr/share/doc/libldap2/copyright", "type": "file" }, { - "bom-ref": "6de802853febe2a2", + "bom-ref": "f1b1def74fa125ee", "name": "/usr/share/doc/liblerc4/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "93445ee90daf074d", + "bom-ref": "30417562b59b9095", "name": "/usr/share/doc/liblerc4/copyright", "type": "file" }, { - "bom-ref": "89e73bc5db88d86b", + "bom-ref": "b4fe4c017334c7a7", "name": "/usr/share/doc/liblilv-0-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "4c8f2eb2fef4110a", + "bom-ref": "41c772cc18a93e0a", "name": "/usr/share/doc/liblilv-0-0/copyright", "type": "file" }, { - "bom-ref": "05cb691790c1df0f", + "bom-ref": "43372a04191a9c87", "name": "/usr/share/doc/libllvm20/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "2d75bf3830a7ab56", + "bom-ref": "05f6a521639e726e", "name": "/usr/share/doc/libllvm20/copyright", "type": "file" }, { - "bom-ref": "c9428130985c78f6", + "bom-ref": "a6c63140f9224648", "name": "/usr/share/doc/liblz4-1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b4ddcb86e60bd937", + "bom-ref": "c0986387e2ba62e9", "name": "/usr/share/doc/liblz4-1/copyright", "type": "file" }, { - "bom-ref": "0af7f1a740b2d550", + "bom-ref": "3b6e03ff5a11449e", "name": "/usr/share/doc/liblzma5/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "466062e40e5f53b5", + "bom-ref": "3b84207f55d18b57", "name": "/usr/share/doc/liblzma5/copyright", "type": "file" }, { - "bom-ref": "b70952fb7b56eb2c", + "bom-ref": "06fe2774b70065fc", "name": "/usr/share/doc/libmbedcrypto7t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "fdfcc7627ebb552e", + "bom-ref": "939ae22e6adcd3a6", "name": "/usr/share/doc/libmbedcrypto7t64/copyright", "type": "file" }, { - "bom-ref": "2820917486422f49", + "bom-ref": "23fc809db6a27c43", "name": "/usr/share/doc/libmd0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "14230422af66a205", + "bom-ref": "7e51faa5a769267b", "name": "/usr/share/doc/libmd0/copyright", "type": "file" }, { - "bom-ref": "7ab63e74290969e7", + "bom-ref": "1b2696be83896c1c", + "name": "/usr/share/doc/libmetee-dev/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "d0cdc4abae7c552a", + "name": "/usr/share/doc/libmetee-dev/copyright", + "type": "file" + }, + { + "bom-ref": "5b52c7e4135cd58c", + "name": "/usr/share/doc/libmetee6/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "658df2b74c09aee1", + "name": "/usr/share/doc/libmetee6/copyright", + "type": "file" + }, + { + "bom-ref": "aed271b3632c0d3c", + "name": "/usr/share/doc/libmfx-gen1.2/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "3cf5d8d2a30ddce5", + "name": "/usr/share/doc/libmfx-gen1.2/copyright", + "type": "file" + }, + { + "bom-ref": "8802373ffd7da347", "name": "/usr/share/doc/libmount1/copyright", "type": "file" }, { - "bom-ref": "25979a2ebe6acf0c", + "bom-ref": "e7a3b867f23e951c", "name": "/usr/share/doc/libmp3lame0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "0a280ff5417dd6aa", + "bom-ref": "f50c6b2fe84624ea", "name": "/usr/share/doc/libmp3lame0/copyright", "type": "file" }, { - "bom-ref": "421b38fbed3fc8f6", + "bom-ref": "45dc86d464f56686", "name": "/usr/share/doc/libmpc3/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "42af4211eed1808b", + "bom-ref": "c5c50554045c4427", "name": "/usr/share/doc/libmpc3/copyright", "type": "file" }, { - "bom-ref": "c72784eddc60b268", + "bom-ref": "f12fdbb79605e728", "name": "/usr/share/doc/libmpfr6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "559f7badf06c3133", + "bom-ref": "551d1a49afba7207", "name": "/usr/share/doc/libmpfr6/copyright", "type": "file" }, { - "bom-ref": "e6ecb8a0ec5786ca", + "bom-ref": "c1746166047b171a", "name": "/usr/share/doc/libmpg123-0t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "4fa8d37eb2033e36", + "bom-ref": "776711814d64255a", "name": "/usr/share/doc/libmpg123-0t64/copyright", "type": "file" }, { - "bom-ref": "29fc355398dfcfd4", + "bom-ref": "89a523c5428fe844", "name": "/usr/share/doc/libmysofa1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "63c7c2406d11e529", + "bom-ref": "f89319f7fccf8855", "name": "/usr/share/doc/libmysofa1/copyright", "type": "file" }, { - "bom-ref": "b7b9f85ad8cb0a07", + "bom-ref": "a607a0d943ed12f1", "name": "/usr/share/doc/libnettle8t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f678a04fb9ed3bad", + "bom-ref": "2fcc587d9d75c2a3", "name": "/usr/share/doc/libnettle8t64/copyright", "type": "file" }, { - "bom-ref": "f1f47bf4ebb2bc9d", + "bom-ref": "2629b076a1dc3fb5", "name": "/usr/share/doc/libnghttp2-14/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "369bd8d536271e5d", + "bom-ref": "ce85c78a11496569", "name": "/usr/share/doc/libnghttp2-14/copyright", "type": "file" }, { - "bom-ref": "532347a8ff76c85f", + "bom-ref": "d5422948e661ef0f", "name": "/usr/share/doc/libnl-3-200/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "39172ac39baac482", + "bom-ref": "9fe16f695b8378aa", "name": "/usr/share/doc/libnl-3-200/copyright", "type": "file" }, { - "bom-ref": "26f5bc46a2e60245", + "bom-ref": "ded9e0fe2b40e735", "name": "/usr/share/doc/libnl-route-3-200/copyright", "type": "file" }, { - "bom-ref": "ab72fa5fc2f4dfd2", + "bom-ref": "63964bb046a5ec4e", "name": "/usr/share/doc/libnorm1t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "cfff34410c5a9d7b", + "bom-ref": "36cb421efc6ead3f", "name": "/usr/share/doc/libnorm1t64/copyright", "type": "file" }, { - "bom-ref": "0fed2eb645961430", + "bom-ref": "322c37b9f223f936", "name": "/usr/share/doc/libnpth0t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "21feac5b8aac7e7e", + "bom-ref": "3dc5a3f6bd5e57cc", "name": "/usr/share/doc/libnpth0t64/copyright", "type": "file" }, { - "bom-ref": "e062b098f0b5adf6", + "bom-ref": "ce0ef349d8afe75e", "name": "/usr/share/doc/libnuma1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "08d6383f1bcd1621", + "bom-ref": "ee5b1a3b26dcdb15", "name": "/usr/share/doc/libnuma1/copyright", "type": "file" }, { - "bom-ref": "9dc9b2f9d0109e64", + "bom-ref": "543bd744295d7cd8", "name": "/usr/share/doc/libogg0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "73b2778893448bc8", + "bom-ref": "0f87cefb212a6a14", "name": "/usr/share/doc/libogg0/copyright", "type": "file" }, { - "bom-ref": "0653c81ab7c34298", + "bom-ref": "bdef6ca351dca7ac", "name": "/usr/share/doc/libopenal-data/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "fda99ecdf73020f5", + "bom-ref": "0d9c6f7353bbf731", "name": "/usr/share/doc/libopenal-data/copyright", "type": "file" }, { - "bom-ref": "9a49d8a51c9ee186", + "bom-ref": "a99ca442859f0e6e", "name": "/usr/share/doc/libopenal1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "40fd1d9bf04de11f", + "bom-ref": "e33c162bd4f7446b", "name": "/usr/share/doc/libopenal1/copyright", "type": "file" }, { - "bom-ref": "90046d06f8b88d23", + "bom-ref": "8b88b3f8dab254eb", "name": "/usr/share/doc/libopenjp2-7/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "e0a4334a69e0efc0", + "bom-ref": "821700674868388c", "name": "/usr/share/doc/libopenjp2-7/copyright", "type": "file" }, { - "bom-ref": "739dc2cd40f56445", + "bom-ref": "012ecb660f3db769", "name": "/usr/share/doc/libopenmpt0t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "54727dde7ff5ad3e", + "bom-ref": "4e20201524ea419e", "name": "/usr/share/doc/libopenmpt0t64/copyright", "type": "file" }, { - "bom-ref": "3bba47ca4c76e938", + "bom-ref": "85368bf07116db98", "name": "/usr/share/doc/libopus0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "1760f1719646ab4c", + "bom-ref": "0c570c88facaa25c", "name": "/usr/share/doc/libopus0/copyright", "type": "file" }, { - "bom-ref": "6bd53cbd4a4be682", + "bom-ref": "869f0b9db4640be4", "name": "/usr/share/doc/libp11-kit0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "3cbde3b4e5237713", + "bom-ref": "5130dc9520669ebd", "name": "/usr/share/doc/libp11-kit0/copyright", "type": "file" }, { - "bom-ref": "000ed226d1efc063", + "bom-ref": "4646233ad6ff24f2", + "name": "/usr/share/doc/libpackagekit-glib2-18/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "fe5d54a35d6b8e09", + "name": "/usr/share/doc/libpackagekit-glib2-18/copyright", + "type": "file" + }, + { + "bom-ref": "1da8901e1c912569", "name": "/usr/share/doc/libpam-modules-bin/copyright", "type": "file" }, { - "bom-ref": "876da6ea2482af7b", + "bom-ref": "2889c532987b1fbd", "name": "/usr/share/doc/libpam-modules/copyright", "type": "file" }, { - "bom-ref": "732c1a2de7d6eb78", + "bom-ref": "39a6672e24ef1e12", "name": "/usr/share/doc/libpam-runtime/copyright", "type": "file" }, { - "bom-ref": "affb8fff0a39ea34", + "bom-ref": "4ca9c236d4df89fa", + "name": "/usr/share/doc/libpam-systemd/copyright", + "type": "file" + }, + { + "bom-ref": "e9dec439c69d8f76", "name": "/usr/share/doc/libpam0g/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "980204231b24b40c", + "bom-ref": "ae837f98e1a80552", "name": "/usr/share/doc/libpam0g/copyright", "type": "file" }, { - "bom-ref": "6b690352f60ad29f", + "bom-ref": "caa1974aad0fed87", "name": "/usr/share/doc/libpango-1.0-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "ffc64fed7c5dc839", + "bom-ref": "8a9ec3a0253b1a8d", "name": "/usr/share/doc/libpango-1.0-0/copyright", "type": "file" }, { - "bom-ref": "e42b451fbf1d05d4", + "bom-ref": "c00fabedf3a2ae04", "name": "/usr/share/doc/libpangocairo-1.0-0/copyright", "type": "file" }, { - "bom-ref": "c8b0eea589e345ea", + "bom-ref": "697c422fecab05f6", "name": "/usr/share/doc/libpangoft2-1.0-0/copyright", "type": "file" }, { - "bom-ref": "0b410654964f810d", + "bom-ref": "cb343ad310f5dc39", "name": "/usr/share/doc/libpciaccess0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "95112e7aac6473da", + "bom-ref": "8faeb029b4b77ec6", "name": "/usr/share/doc/libpciaccess0/copyright", "type": "file" }, { - "bom-ref": "6c0dbb42e5d1ef94", + "bom-ref": "66ce9846e67d10a6", "name": "/usr/share/doc/libpcre2-8-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "6f8467f6a65dcd9d", + "bom-ref": "019a85e7da7314fb", "name": "/usr/share/doc/libpcre2-8-0/copyright", "type": "file" }, { - "bom-ref": "6deac95e6d19d50a", + "bom-ref": "b88543790ee7e712", "name": "/usr/share/doc/libperl5.38t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "47f69d58a6d495c1", + "bom-ref": "e628868d3561d289", "name": "/usr/share/doc/libperl5.38t64/copyright", "type": "file" }, { - "bom-ref": "8727597c52ef2b09", + "bom-ref": "e97d4463fb6f1b39", "name": "/usr/share/doc/libpgm-5.3-0t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "95c8da7ddf23e11c", + "bom-ref": "d08cef5f3a91b788", "name": "/usr/share/doc/libpgm-5.3-0t64/copyright", "type": "file" }, { - "bom-ref": "4ac4396c8bdc925a", + "bom-ref": "f12e76493b884d9a", "name": "/usr/share/doc/libpixman-1-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "986dcf1788fff710", + "bom-ref": "2d7d04dddc60b1d8", "name": "/usr/share/doc/libpixman-1-0/copyright", "type": "file" }, { - "bom-ref": "b2d1fc3e361ee4b5", + "bom-ref": "decd654ddd0f9b85", "name": "/usr/share/doc/libplacebo338/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "797b43fe85b03e56", + "bom-ref": "51fd00019e6f04ca", "name": "/usr/share/doc/libplacebo338/copyright", "type": "file" }, { - "bom-ref": "4d6c6054d85c0fdf", + "bom-ref": "706b866ffe06aadb", "name": "/usr/share/doc/libpng16-16t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "90e24bf167a3e053", + "bom-ref": "7d84be9a1a5b9faf", "name": "/usr/share/doc/libpng16-16t64/copyright", "type": "file" }, { - "bom-ref": "d75617e17fd35241", + "bom-ref": "1e9a94998e15c6b9", "name": "/usr/share/doc/libpocketsphinx3/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "9df2631365453f65", + "bom-ref": "9c6f83ecfbefbb85", "name": "/usr/share/doc/libpocketsphinx3/copyright", "type": "file" }, { - "bom-ref": "0d8bb0db3252700f", + "bom-ref": "fcc1ca1c125aff8c", + "name": "/usr/share/doc/libpolkit-agent-1-0/copyright", + "type": "file" + }, + { + "bom-ref": "b9c4d408a194f707", + "name": "/usr/share/doc/libpolkit-gobject-1-0/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "139fb58ba1f575ea", + "name": "/usr/share/doc/libpolkit-gobject-1-0/copyright", + "type": "file" + }, + { + "bom-ref": "9ed8aa61a459d573", "name": "/usr/share/doc/libpostproc57/copyright", "type": "file" }, { - "bom-ref": "160c563252d9f5e2", + "bom-ref": "d40f54ef6e94f6d0", "name": "/usr/share/doc/libproc2-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "ee85878278e642ed", + "bom-ref": "23ed0ecc4b4450cf", "name": "/usr/share/doc/libproc2-0/copyright", "type": "file" }, { - "bom-ref": "bd61e550abb34c6f", + "bom-ref": "d03ceb7cf767c3d7", "name": "/usr/share/doc/libpsl5t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "0537a6cff43c0b3c", + "bom-ref": "f1bda5308c6d2db0", "name": "/usr/share/doc/libpsl5t64/copyright", "type": "file" }, { - "bom-ref": "7c24896f94455e8d", + "bom-ref": "19242e2577c967e1", "name": "/usr/share/doc/libpulse0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "931eea05b4868fcd", + "bom-ref": "58d878f30680d36d", "name": "/usr/share/doc/libpulse0/copyright", "type": "file" }, { - "bom-ref": "627ffcfecba55651", + "bom-ref": "c9e89bc5e94043f9", "name": "/usr/share/doc/libpython3-stdlib/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "25f5e844d8025fd1", + "bom-ref": "c25939d9efcc0f4d", "name": "/usr/share/doc/libpython3-stdlib/copyright", "type": "file" }, { - "bom-ref": "d6715c3ed23f6a7f", + "bom-ref": "c5ff4eb3579d350b", "name": "/usr/share/doc/libpython3.12-minimal/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "cb7121a868d521d3", + "bom-ref": "a1767dfb73063457", "name": "/usr/share/doc/libpython3.12-minimal/copyright", "type": "file" }, { - "bom-ref": "acb0c1077a8e85b3", + "bom-ref": "72f2117f1b7b850b", "name": "/usr/share/doc/librabbitmq4/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "a2aeee6ab233e7a8", + "bom-ref": "6af6469186ecb334", "name": "/usr/share/doc/librabbitmq4/copyright", "type": "file" }, { - "bom-ref": "e149ed4e632e062e", + "bom-ref": "6baf586742cb650e", "name": "/usr/share/doc/librav1e0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "6fc3470e604fdd47", + "bom-ref": "1922ae68ce2ab96f", "name": "/usr/share/doc/librav1e0/copyright", "type": "file" }, { - "bom-ref": "d707e9f0b883cdde", + "bom-ref": "d884a4a0c75d01be", "name": "/usr/share/doc/libraw1394-11/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d31cd6e282b16953", + "bom-ref": "f0f64f9cb766b16f", "name": "/usr/share/doc/libraw1394-11/copyright", "type": "file" }, { - "bom-ref": "94c4de5884c81c97", + "bom-ref": "9123899ef7c805cb", "name": "/usr/share/doc/librdmacm1t64/copyright", "type": "file" }, { - "bom-ref": "790f009c5574a806", + "bom-ref": "3a1760ff21425be6", "name": "/usr/share/doc/libreadline8t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "880bc64073b1ec41", + "bom-ref": "acb31d81922971e9", "name": "/usr/share/doc/libreadline8t64/copyright", "type": "file" }, { - "bom-ref": "5daa828c2f6d3ad0", + "bom-ref": "0b9096033d1d827c", "name": "/usr/share/doc/librist4/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b20591f5564e5845", + "bom-ref": "c6913ef3d9ad39e1", "name": "/usr/share/doc/librist4/copyright", "type": "file" }, { - "bom-ref": "f7121806d54badd7", + "bom-ref": "b4fd10a0bb106637", "name": "/usr/share/doc/librsvg2-2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "4c8a62ba4a66b894", + "bom-ref": "a8017d72a63a14d0", "name": "/usr/share/doc/librsvg2-2/copyright", "type": "file" }, { - "bom-ref": "e7f451ea1e63002a", + "bom-ref": "92c36b98dc25853a", "name": "/usr/share/doc/librtmp1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f1001ec59a815b29", + "bom-ref": "bdd3a15cbe127bc5", "name": "/usr/share/doc/librtmp1/copyright", "type": "file" }, { - "bom-ref": "408d38ff2d681a84", + "bom-ref": "fc8e993cb7c2fd04", "name": "/usr/share/doc/librubberband2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "98ba81038eab1475", + "bom-ref": "5183ecc84a18c68d", "name": "/usr/share/doc/librubberband2/copyright", "type": "file" }, { - "bom-ref": "46e9326dfa30ef5f", + "bom-ref": "1788037dea7d01db", "name": "/usr/share/doc/libsamplerate0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "6f57665c156d1d86", + "bom-ref": "306efec2b6e5ef32", "name": "/usr/share/doc/libsamplerate0/copyright", "type": "file" }, { - "bom-ref": "13c66ab861807d0f", + "bom-ref": "93e4e187c3209ce7", "name": "/usr/share/doc/libsasl2-2/copyright", "type": "file" }, { - "bom-ref": "b65018554a3c8e38", + "bom-ref": "7361fdb1fb125a78", "name": "/usr/share/doc/libsasl2-modules-db/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "911f32950fa8e40a", + "bom-ref": "5937071bdf410052", "name": "/usr/share/doc/libsasl2-modules-db/copyright", "type": "file" }, { - "bom-ref": "27f15e5f6b66500f", + "bom-ref": "caf2d48a4d767c7f", "name": "/usr/share/doc/libsdl2-2.0-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "3fe4c5a8903acad4", + "bom-ref": "50aa33ae86639194", "name": "/usr/share/doc/libsdl2-2.0-0/copyright", "type": "file" }, { - "bom-ref": "e597ce15b3fb04a0", + "bom-ref": "1c3016c170630b32", "name": "/usr/share/doc/libseccomp2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "336136cf712c97d0", + "bom-ref": "cd478c9dd9f523ae", "name": "/usr/share/doc/libseccomp2/copyright", "type": "file" }, { - "bom-ref": "9f462d51bd6177a7", + "bom-ref": "f289d6aae145a8f9", "name": "/usr/share/doc/libselinux1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "7be4c0e744b78e0c", + "bom-ref": "d41ed3490935b332", "name": "/usr/share/doc/libselinux1/copyright", "type": "file" }, { - "bom-ref": "2a96b9cf06dbceb4", + "bom-ref": "ac94176d21b28e36", "name": "/usr/share/doc/libsemanage-common/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "870e39f2c99aeb34", + "bom-ref": "ca4cc04ee0cb3faa", "name": "/usr/share/doc/libsemanage-common/copyright", "type": "file" }, { - "bom-ref": "0eb38609f634987f", + "bom-ref": "bec01bb5da4d1e39", "name": "/usr/share/doc/libsemanage2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "7e4e62fe416a36a2", + "bom-ref": "4c88761d1ed1ed24", "name": "/usr/share/doc/libsemanage2/copyright", "type": "file" }, { - "bom-ref": "4f30b3f75283ac06", + "bom-ref": "26e5d7a20d207306", "name": "/usr/share/doc/libsensors-config/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d7d94e296f2035a5", + "bom-ref": "1acf42a756704af5", "name": "/usr/share/doc/libsensors-config/copyright", "type": "file" }, { - "bom-ref": "b53f38c1d122f119", + "bom-ref": "25fffffbae0af05d", "name": "/usr/share/doc/libsensors5/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "907a39677fd610b6", + "bom-ref": "0ad629bcb4d3952a", "name": "/usr/share/doc/libsensors5/copyright", "type": "file" }, { - "bom-ref": "a2b302988c30fe8a", + "bom-ref": "9570b14c9b3dfd28", "name": "/usr/share/doc/libsepol2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "747c95c5a61c8b6b", + "bom-ref": "7cb56987dbb6ad55", "name": "/usr/share/doc/libsepol2/copyright", "type": "file" }, { - "bom-ref": "565eda96c5cf76a0", + "bom-ref": "7782e83f4a931058", "name": "/usr/share/doc/libserd-0-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "1597c1af3d7370a8", + "bom-ref": "9703f8514c945b58", "name": "/usr/share/doc/libserd-0-0/copyright", "type": "file" }, { - "bom-ref": "e283ec5369e66955", + "bom-ref": "cb0f80ef80a3a7b1", "name": "/usr/share/doc/libsframe1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b7f055f57eec1f82", + "bom-ref": "2eb1125b8b6b044a", "name": "/usr/share/doc/libsframe1/copyright", "type": "file" }, { - "bom-ref": "1df6e83c2489bf56", + "bom-ref": "dae193d6c20f5232", "name": "/usr/share/doc/libsharpyuv0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "0f52af07290bc821", + "bom-ref": "72b65a35381ef9b5", "name": "/usr/share/doc/libsharpyuv0/copyright", "type": "file" }, { - "bom-ref": "b62d61bcf2bc387b", + "bom-ref": "86c8e6bc4d7f343f", "name": "/usr/share/doc/libshine3/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "667c11f2b0122158", + "bom-ref": "a1dffde01e979fac", "name": "/usr/share/doc/libshine3/copyright", "type": "file" }, { - "bom-ref": "89b4ad2c9c7bf164", + "bom-ref": "2b5d4c10a3a786d8", "name": "/usr/share/doc/libslang2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "0c31ae74436f41d5", + "bom-ref": "4032d6a806fbdf11", "name": "/usr/share/doc/libslang2/copyright", "type": "file" }, { - "bom-ref": "50a7657453030a63", + "bom-ref": "0849d70b7a4f897b", "name": "/usr/share/doc/libsm6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "dbb36f77e6b743ba", + "bom-ref": "0588e66eeedaa39a", "name": "/usr/share/doc/libsm6/copyright", "type": "file" }, { - "bom-ref": "909e7b6d664d7d08", + "bom-ref": "d298a679d6aa424c", "name": "/usr/share/doc/libsmartcols1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "fd7ded1b15415f53", + "bom-ref": "a9455e072cc4949b", "name": "/usr/share/doc/libsmartcols1/copyright", "type": "file" }, { - "bom-ref": "aca4cfb46bab63f5", + "bom-ref": "8d829b63f44b8fd5", "name": "/usr/share/doc/libsnappy1v5/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "5151ae852992a0fc", + "bom-ref": "35f2558c780ac984", "name": "/usr/share/doc/libsnappy1v5/copyright", "type": "file" }, { - "bom-ref": "e9ef8645efb2ecbd", + "bom-ref": "f454f9df0feeb955", "name": "/usr/share/doc/libsndfile1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f86cc8fef312dfa9", + "bom-ref": "43b830664a04f3d9", "name": "/usr/share/doc/libsndfile1/copyright", "type": "file" }, { - "bom-ref": "615045eee8176d9e", + "bom-ref": "8c13d0e090b12bae", "name": "/usr/share/doc/libsndio7.0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8f230b5a6fefe5bc", + "bom-ref": "88e810b6722e10a8", "name": "/usr/share/doc/libsndio7.0/copyright", "type": "file" }, { - "bom-ref": "a739c78b4e6dd16a", + "bom-ref": "09f0f7e6586aa58a", "name": "/usr/share/doc/libsodium23/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8cfcbb7596d1f22f", + "bom-ref": "6496aa8d9361cf87", "name": "/usr/share/doc/libsodium23/copyright", "type": "file" }, { - "bom-ref": "46ac19c415f4cd08", + "bom-ref": "5d455a54b160fef8", "name": "/usr/share/doc/libsord-0-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b292851021c4a4db", + "bom-ref": "188de558dd3abcab", "name": "/usr/share/doc/libsord-0-0/copyright", "type": "file" }, { - "bom-ref": "036dec1609840d05", + "bom-ref": "a89c272ef284c669", "name": "/usr/share/doc/libsoxr0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "a4eea6765b96e064", + "bom-ref": "79a396e8ba163398", "name": "/usr/share/doc/libsoxr0/copyright", "type": "file" }, { - "bom-ref": "af9efb69c1316af8", + "bom-ref": "0ba780d46f189d94", "name": "/usr/share/doc/libspeex1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8623c2f9bf7631e5", + "bom-ref": "e9ad88eb5ccae99d", "name": "/usr/share/doc/libspeex1/copyright", "type": "file" }, { - "bom-ref": "c2a7872ba50ab86c", + "bom-ref": "c36f51668d83da30", "name": "/usr/share/doc/libsphinxbase3t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "73d407f2b05ea72a", + "bom-ref": "f0a1072fa0f74d0a", "name": "/usr/share/doc/libsphinxbase3t64/copyright", "type": "file" }, { - "bom-ref": "527b2d5bdd3abfd2", + "bom-ref": "f458519506b09b3a", "name": "/usr/share/doc/libsqlite3-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "a401ffc89c0096e7", + "bom-ref": "df8578c19aff1aab", "name": "/usr/share/doc/libsqlite3-0/copyright", "type": "file" }, { - "bom-ref": "9d0fb821874411a2", + "bom-ref": "fa84be91ec2d1dd6", "name": "/usr/share/doc/libsratom-0-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b583a5e169b7d25a", + "bom-ref": "547875128df78cb6", "name": "/usr/share/doc/libsratom-0-0/copyright", "type": "file" }, { - "bom-ref": "097379ea1fa29056", + "bom-ref": "010c22b962797482", "name": "/usr/share/doc/libsrt1.5-gnutls/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "6c4a051a68bf459c", + "bom-ref": "bff33805177de524", "name": "/usr/share/doc/libsrt1.5-gnutls/copyright", "type": "file" }, { - "bom-ref": "71a40afd53bfa0e3", + "bom-ref": "17b45c52be6544c9", "name": "/usr/share/doc/libss2/copyright", "type": "file" }, { - "bom-ref": "13b487c383983d93", + "bom-ref": "7e2a0af9d937c7e7", "name": "/usr/share/doc/libssh-4/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "079ed0731fbdd1d2", + "bom-ref": "f686f9c0ac6fca66", "name": "/usr/share/doc/libssh-4/copyright", "type": "file" }, { - "bom-ref": "3442f8468463de76", + "bom-ref": "2e6c833be9531e76", "name": "/usr/share/doc/libssh-gcrypt-4/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "2f23c45ded421490", + "bom-ref": "f4a6e0f61e951cf0", "name": "/usr/share/doc/libssh-gcrypt-4/copyright", "type": "file" }, { - "bom-ref": "8b843df5908b68ea", + "bom-ref": "5d6527153a58cf5a", "name": "/usr/share/doc/libssl3t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d9d0047ec8f44dfc", + "bom-ref": "97a3f9dfd6c55f54", "name": "/usr/share/doc/libssl3t64/copyright", "type": "file" }, { - "bom-ref": "082fb4a10eba926f", + "bom-ref": "2a98b719334aa2e1", + "name": "/usr/share/doc/libstemmer0d/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "b324ee038a505b6e", + "name": "/usr/share/doc/libstemmer0d/copyright", + "type": "file" + }, + { + "bom-ref": "d82009077ad90a37", "name": "/usr/share/doc/libsvtav1enc1d1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c9e076ff2f0a7cb2", + "bom-ref": "d4cea5e2311b9836", "name": "/usr/share/doc/libsvtav1enc1d1/copyright", "type": "file" }, { - "bom-ref": "4da80a4c43461def", + "bom-ref": "dbd13901fa4a710b", "name": "/usr/share/doc/libswresample4/copyright", "type": "file" }, { - "bom-ref": "d831db044f473332", + "bom-ref": "af6bde80b527920a", "name": "/usr/share/doc/libswscale7/copyright", "type": "file" }, { - "bom-ref": "af75fc9dba3a173f", + "bom-ref": "0f136ef592dbc2b9", "name": "/usr/share/doc/libsystemd-shared/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "1a07283a0173c3ca", + "bom-ref": "6a48f9b55f2f63cc", "name": "/usr/share/doc/libsystemd-shared/copyright", "type": "file" }, { - "bom-ref": "f05a60123cb92556", + "bom-ref": "71461f2b2a43f3ae", "name": "/usr/share/doc/libsystemd0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "bd4a10da3da59adc", + "bom-ref": "3778121b70aa4104", "name": "/usr/share/doc/libsystemd0/copyright", "type": "file" }, { - "bom-ref": "e4b4ede61cf7b800", + "bom-ref": "2b6f77f2fa81e81a", "name": "/usr/share/doc/libtasn1-6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "6d7857751bb45902", + "bom-ref": "0d1c9665722c9478", "name": "/usr/share/doc/libtasn1-6/copyright", "type": "file" }, { - "bom-ref": "db2d48c1f88fb60f", + "bom-ref": "bdf8de9b3f80e8df", "name": "/usr/share/doc/libthai-data/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "71706ba1dbdbd700", + "bom-ref": "b9df3d3a2406cbc8", "name": "/usr/share/doc/libthai-data/copyright", "type": "file" }, { - "bom-ref": "d3a9131c6f8d7356", + "bom-ref": "71645a3cd7c06856", "name": "/usr/share/doc/libthai0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "4ca1a56a7b33f694", + "bom-ref": "1556a21616625354", "name": "/usr/share/doc/libthai0/copyright", "type": "file" }, { - "bom-ref": "7bc9785db5b92e5e", + "bom-ref": "1fc9960ba98decca", "name": "/usr/share/doc/libtheora0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "de39596c128ef3b7", + "bom-ref": "84c3ee801516dd1f", "name": "/usr/share/doc/libtheora0/copyright", "type": "file" }, { - "bom-ref": "a1048ec4f235a04e", + "bom-ref": "50ff4d288d0390aa", "name": "/usr/share/doc/libtiff6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "30bc435d7a20e304", + "bom-ref": "a056cada33ad5a5c", "name": "/usr/share/doc/libtiff6/copyright", "type": "file" }, { - "bom-ref": "820906739fa64e39", + "bom-ref": "3d5eaa0cc6978c8b", "name": "/usr/share/doc/libtinfo6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "e0a7d71a07402c5b", + "bom-ref": "cc598d89d546d439", "name": "/usr/share/doc/libtinfo6/copyright", "type": "file" }, { - "bom-ref": "c90ce32e49cb941d", + "bom-ref": "2a1943ddbd962439", "name": "/usr/share/doc/libtwolame0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "7631dee4fe1bdb70", + "bom-ref": "ee816742d748fdc0", "name": "/usr/share/doc/libtwolame0/copyright", "type": "file" }, { - "bom-ref": "7f3c693117477045", + "bom-ref": "c45b6cc519b0d961", "name": "/usr/share/doc/libudev1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "07a63c6baa11a19b", + "bom-ref": "06b02734c8a68c9b", "name": "/usr/share/doc/libudev1/copyright", "type": "file" }, { - "bom-ref": "834a782525b5939b", + "bom-ref": "e8382b963e9d5c87", "name": "/usr/share/doc/libudfread0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b912ffd1c0f7d0c0", + "bom-ref": "6d1e088b32375888", "name": "/usr/share/doc/libudfread0/copyright", "type": "file" }, { - "bom-ref": "06379032a38a1812", + "bom-ref": "0b67e964dfdbf09a", "name": "/usr/share/doc/libunibreak5/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "823efc5c0823e9f2", + "bom-ref": "9106ab77720d75ea", "name": "/usr/share/doc/libunibreak5/copyright", "type": "file" }, { - "bom-ref": "e544f07c79ba92ab", + "bom-ref": "1ef5ea5aff8f77a1", "name": "/usr/share/doc/libunistring5/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "e2e469ef96f99b0a", + "bom-ref": "5e97692edd4fa99c", "name": "/usr/share/doc/libunistring5/copyright", "type": "file" }, { - "bom-ref": "8d6f4ffb1c96f78e", + "bom-ref": "249c084fbdec7094", + "name": "/usr/share/doc/libunwind8/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "30e5540bb092a438", + "name": "/usr/share/doc/libunwind8/copyright", + "type": "file" + }, + { + "bom-ref": "99b489bc325d52b2", "name": "/usr/share/doc/libusb-1.0-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d98203cc1dbd54a2", + "bom-ref": "3f9ce90d2b5422f6", "name": "/usr/share/doc/libusb-1.0-0/copyright", "type": "file" }, { - "bom-ref": "d9a659873ad11412", + "bom-ref": "1b151f6a7741c792", "name": "/usr/share/doc/libuuid1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "36b86b4b1e20aee6", + "bom-ref": "b3eb97847fec036e", "name": "/usr/share/doc/libuuid1/copyright", "type": "file" }, { - "bom-ref": "da27029df4340c88", + "bom-ref": "530180a65fe930d3", + "name": "/usr/share/doc/libva-drm2/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "4672b660b1382a82", + "name": "/usr/share/doc/libva-drm2/changelog.gz", + "type": "file" + }, + { + "bom-ref": "43391b754a43980a", "name": "/usr/share/doc/libva-drm2/copyright", "type": "file" }, { - "bom-ref": "71c8fa39ff2b0a2a", + "bom-ref": "cbf87d01a7366f97", + "name": "/usr/share/doc/libva-x11-2/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "92b6eeffba7c770d", + "name": "/usr/share/doc/libva-x11-2/changelog.gz", + "type": "file" + }, + { + "bom-ref": "b80b2d7419b57bc0", "name": "/usr/share/doc/libva-x11-2/copyright", "type": "file" }, { - "bom-ref": "718fbd071ce8d147", + "bom-ref": "473927b11dd6f269", "name": "/usr/share/doc/libva2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "ea0fae880bf186c0", + "bom-ref": "831f6ecac481e669", + "name": "/usr/share/doc/libva2/changelog.gz", + "type": "file" + }, + { + "bom-ref": "b00d4ece0f0a28fe", "name": "/usr/share/doc/libva2/copyright", "type": "file" }, { - "bom-ref": "10befe751b73a398", + "bom-ref": "d713021250124f6c", "name": "/usr/share/doc/libvdpau1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8024db5066c619b1", + "bom-ref": "dc4362992052eaf5", "name": "/usr/share/doc/libvdpau1/copyright", "type": "file" }, { - "bom-ref": "c17cf772d41cf305", + "bom-ref": "77feea1349aceab9", "name": "/usr/share/doc/libvidstab1.1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "6c8dc86e9396facd", + "bom-ref": "2aacf66d539fcbfd", "name": "/usr/share/doc/libvidstab1.1/copyright", "type": "file" }, { - "bom-ref": "6c73e01cdbaae808", + "bom-ref": "e089e3e4bf6be5b8", "name": "/usr/share/doc/libvorbis0a/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "9fa8065be6fb7218", + "bom-ref": "31f252745ea5f69c", "name": "/usr/share/doc/libvorbis0a/copyright", "type": "file" }, { - "bom-ref": "161ced6d188bf476", + "bom-ref": "c6d59a6099d62d8e", "name": "/usr/share/doc/libvorbisenc2/copyright", "type": "file" }, { - "bom-ref": "7c0373ab86846598", + "bom-ref": "092d9468be94656c", "name": "/usr/share/doc/libvorbisfile3/copyright", "type": "file" }, { - "bom-ref": "f706fe84dbae8a6b", + "bom-ref": "7ca9a0c7c45d9acf", "name": "/usr/share/doc/libvpl2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "093ae192cd521f96", + "bom-ref": "b0b16bde336199c2", "name": "/usr/share/doc/libvpl2/copyright", "type": "file" }, { - "bom-ref": "89d52091ead5dd3b", + "bom-ref": "d2ea989d0a285a4f", "name": "/usr/share/doc/libvpx9/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d6c5da44ba404115", + "bom-ref": "000a1c642b308b2d", "name": "/usr/share/doc/libvpx9/copyright", "type": "file" }, { - "bom-ref": "fffa66addaffe3bc", + "bom-ref": "4660206283e4eda0", "name": "/usr/share/doc/libvulkan1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "82e019fa05879586", + "bom-ref": "ce76400a86457b86", "name": "/usr/share/doc/libvulkan1/copyright", "type": "file" }, { - "bom-ref": "af683fc8cd4df177", + "bom-ref": "a04b197aad7d9057", "name": "/usr/share/doc/libwayland-client0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "e96c9c4fc02d7b88", + "bom-ref": "3b6983ec837c9c04", "name": "/usr/share/doc/libwayland-client0/copyright", "type": "file" }, { - "bom-ref": "e8569c4b74f5ada4", + "bom-ref": "414ee75551140cc8", "name": "/usr/share/doc/libwayland-cursor0/copyright", "type": "file" }, { - "bom-ref": "2d982a2df0ade521", + "bom-ref": "6b8523dc26c58639", "name": "/usr/share/doc/libwayland-egl1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c48f3d38410cdc51", + "bom-ref": "37ac2a7f3d570d85", "name": "/usr/share/doc/libwayland-egl1/copyright", "type": "file" }, { - "bom-ref": "7cfff8250ae3f584", + "bom-ref": "8495df36ccf80354", "name": "/usr/share/doc/libwebp7/copyright", "type": "file" }, { - "bom-ref": "3e93ec452c7ea7ee", + "bom-ref": "1135b22b7bcaa3d6", "name": "/usr/share/doc/libwebpmux3/copyright", "type": "file" }, { - "bom-ref": "3c97dc5a1377b148", + "bom-ref": "0137431a2369b95c", "name": "/usr/share/doc/libx11-6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "ab4b492f93183b25", + "bom-ref": "583a95039882d46d", "name": "/usr/share/doc/libx11-6/copyright", "type": "file" }, { - "bom-ref": "3640da117f407675", + "bom-ref": "a3beab434c5b7b15", "name": "/usr/share/doc/libx11-data/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "4af5780e624c3d3b", + "bom-ref": "7a1a5b0c7c3deb27", "name": "/usr/share/doc/libx11-data/copyright", "type": "file" }, { - "bom-ref": "c0b919f8b9c49e6d", + "bom-ref": "fdd5890bdc100cc1", "name": "/usr/share/doc/libx11-xcb1/copyright", "type": "file" }, { - "bom-ref": "7cace123d538601e", + "bom-ref": "e9b7dba749386f52", "name": "/usr/share/doc/libx264-164/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "05f3d18c7f53762d", + "bom-ref": "4d51bc791852d381", "name": "/usr/share/doc/libx264-164/copyright", "type": "file" }, { - "bom-ref": "9f85c6f01ce0b7ec", + "bom-ref": "207d50ef8849d2a0", "name": "/usr/share/doc/libx265-199/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "6caf6cb396b910a9", + "bom-ref": "708e8217dcf3b4b5", "name": "/usr/share/doc/libx265-199/copyright", "type": "file" }, { - "bom-ref": "383e6e815a39fdf8", + "bom-ref": "5d46f1141c02c678", "name": "/usr/share/doc/libxau6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "06a9f8543088815c", + "bom-ref": "8d0e5e1c0c9a2d04", "name": "/usr/share/doc/libxau6/copyright", "type": "file" }, { - "bom-ref": "f7cc6b0adc8c9056", + "bom-ref": "ecdb140b9d83901e", "name": "/usr/share/doc/libxcb-dri3-0/copyright", "type": "file" }, { - "bom-ref": "0a4ace93ced67458", + "bom-ref": "6b699836a69c44d0", "name": "/usr/share/doc/libxcb-glx0/copyright", "type": "file" }, { - "bom-ref": "9825ccd14dbbd0cf", + "bom-ref": "d5fc824ebfd221ab", "name": "/usr/share/doc/libxcb-present0/copyright", "type": "file" }, { - "bom-ref": "1b72ef4a39ac4300", + "bom-ref": "8904e76beb9d9354", "name": "/usr/share/doc/libxcb-randr0/copyright", "type": "file" }, { - "bom-ref": "f883c0addaa88146", + "bom-ref": "2b7e113d105fdb8e", "name": "/usr/share/doc/libxcb-render0/copyright", "type": "file" }, { - "bom-ref": "1b8479c9cd732639", + "bom-ref": "2112528655e73fc1", "name": "/usr/share/doc/libxcb-shape0/copyright", "type": "file" }, { - "bom-ref": "c12e3c9b6fc2c2bc", + "bom-ref": "929cfc1551bef1a4", "name": "/usr/share/doc/libxcb-shm0/copyright", "type": "file" }, { - "bom-ref": "54606d456996921b", + "bom-ref": "aec5d24cf0bea5a3", "name": "/usr/share/doc/libxcb-sync1/copyright", "type": "file" }, { - "bom-ref": "e23ea45607850eba", + "bom-ref": "c7e7bbf83722a55e", "name": "/usr/share/doc/libxcb-xfixes0/copyright", "type": "file" }, { - "bom-ref": "df72d576ac1fb282", + "bom-ref": "e87c5abee6ddca92", "name": "/usr/share/doc/libxcb1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f0ab0f9f905f2d2b", + "bom-ref": "8ab700b62256083f", "name": "/usr/share/doc/libxcb1/copyright", "type": "file" }, { - "bom-ref": "b493ca0d5f1e2e03", + "bom-ref": "7e59f57734d91fc3", "name": "/usr/share/doc/libxcursor1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "466c1d2ec5bbf3c8", + "bom-ref": "c273aa19492ce944", "name": "/usr/share/doc/libxcursor1/copyright", "type": "file" }, { - "bom-ref": "378ccfb2e5c3c95d", + "bom-ref": "e48228a62f0c66e5", "name": "/usr/share/doc/libxdmcp6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "3372315b026281a2", + "bom-ref": "d21a3bf679d31096", "name": "/usr/share/doc/libxdmcp6/copyright", "type": "file" }, { - "bom-ref": "99be6d601e1e8699", + "bom-ref": "0cc9b04f05e6654d", "name": "/usr/share/doc/libxext6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c72dc7ccdd66d7f5", + "bom-ref": "7a10c7169ee91655", "name": "/usr/share/doc/libxext6/copyright", "type": "file" }, { - "bom-ref": "9bc3512f19bc9152", + "bom-ref": "dc02e47e168e2d5a", "name": "/usr/share/doc/libxfixes3/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "43c7f18763eee830", + "bom-ref": "f0a3b5af5c689ce4", "name": "/usr/share/doc/libxfixes3/copyright", "type": "file" }, { - "bom-ref": "f7eb371a7ea86804", + "bom-ref": "aee1a74523607cb0", "name": "/usr/share/doc/libxi6/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "59ba13185e64b6fb", + "bom-ref": "6ad2b623f47d1907", "name": "/usr/share/doc/libxi6/copyright", "type": "file" }, { - "bom-ref": "6c4899e9bc83d2d8", + "bom-ref": "1fd634d59d930270", "name": "/usr/share/doc/libxkbcommon0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d08968a4e1740076", + "bom-ref": "61d40090e4a4c6d6", "name": "/usr/share/doc/libxkbcommon0/copyright", "type": "file" }, { - "bom-ref": "6f7e5dd61c3a0629", + "bom-ref": "9117c2eedd601d69", "name": "/usr/share/doc/libxml2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "7105e3fddb05e5b8", + "bom-ref": "65639fe4f18c3a14", "name": "/usr/share/doc/libxml2/copyright", "type": "file" }, { - "bom-ref": "d3b741c074c31fbc", + "bom-ref": "5f46c07ad4b41dc5", + "name": "/usr/share/doc/libxmlb2/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "b38304044f9319e4", + "name": "/usr/share/doc/libxmlb2/copyright", + "type": "file" + }, + { + "bom-ref": "aa87c9ab023cadb0", "name": "/usr/share/doc/libxrandr2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f019ccd7dedcac48", + "bom-ref": "1ff6032074f1d7d4", "name": "/usr/share/doc/libxrandr2/copyright", "type": "file" }, { - "bom-ref": "fac3287842472774", + "bom-ref": "1a9cec0dc4147e00", "name": "/usr/share/doc/libxrender1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "99feba6ee9e98767", + "bom-ref": "8531a0b577be6c2b", "name": "/usr/share/doc/libxrender1/copyright", "type": "file" }, { - "bom-ref": "fc0a515233510223", + "bom-ref": "de0bbf9f7a80d74f", "name": "/usr/share/doc/libxshmfence1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c00ff20d98927ac7", + "bom-ref": "bf2c80ccb9b84c13", "name": "/usr/share/doc/libxshmfence1/copyright", "type": "file" }, { - "bom-ref": "ac47f8ead5cfe3c5", + "bom-ref": "02c6a756ab88104d", "name": "/usr/share/doc/libxss1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "7556c31699587ee2", + "bom-ref": "ddcad70006c50306", "name": "/usr/share/doc/libxss1/copyright", "type": "file" }, { - "bom-ref": "c065bf186e010c49", + "bom-ref": "f22086b747ac70bd", "name": "/usr/share/doc/libxv1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "bb2ccbf15d846372", + "bom-ref": "32a1d3cef2bd0852", "name": "/usr/share/doc/libxv1/copyright", "type": "file" }, { - "bom-ref": "1ebfbf701edef85b", + "bom-ref": "a981efc763ff4d5b", "name": "/usr/share/doc/libxvidcore4/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "4ff683909fe3378b", + "bom-ref": "8fcc8be308ef9877", "name": "/usr/share/doc/libxvidcore4/copyright", "type": "file" }, { - "bom-ref": "ccef3301167d2044", + "bom-ref": "1806877fdb165c70", "name": "/usr/share/doc/libxxf86vm1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "1e785247c9d9f31b", + "bom-ref": "370b2b2637ad4b7f", "name": "/usr/share/doc/libxxf86vm1/copyright", "type": "file" }, { - "bom-ref": "9f060d52d5f5d419", + "bom-ref": "fcb86b728037da3f", "name": "/usr/share/doc/libxxhash0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "84c0aada4b5a063d", + "bom-ref": "99d7e2154cef252f", "name": "/usr/share/doc/libxxhash0/copyright", "type": "file" }, { - "bom-ref": "36de20e57134c416", + "bom-ref": "0b83f0e2c7fe1a1c", + "name": "/usr/share/doc/libyaml-0-2/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "f758fc887fbfc3df", + "name": "/usr/share/doc/libyaml-0-2/copyright", + "type": "file" + }, + { + "bom-ref": "58bc4bf4a6ac15a9", "name": "/usr/share/doc/libze-intel-gpu1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "26723de8e095666c", + "bom-ref": "0429d2220683d47f", "name": "/usr/share/doc/libze-intel-gpu1/copyright", "type": "file" }, { - "bom-ref": "3ed1182f305384d1", + "bom-ref": "5131ffd790daede5", "name": "/usr/share/doc/libzimg2/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "64d54a3b73ce2cbd", + "bom-ref": "5ee1eef209b945dd", "name": "/usr/share/doc/libzimg2/copyright", "type": "file" }, { - "bom-ref": "336121d8511da01d", + "bom-ref": "6b27d4d540bef461", "name": "/usr/share/doc/libzix-0-0/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "09a8ae04cfe7ba78", + "bom-ref": "245d2b156bc44118", "name": "/usr/share/doc/libzix-0-0/copyright", "type": "file" }, { - "bom-ref": "fb5e4972294683a6", + "bom-ref": "c984d550ea8a8ce2", "name": "/usr/share/doc/libzmq5/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "73fc90e883074ac1", + "bom-ref": "f85b80cfa382f71d", "name": "/usr/share/doc/libzmq5/copyright", "type": "file" }, { - "bom-ref": "feab7aa4c8c346f0", + "bom-ref": "51390935e54d02c6", "name": "/usr/share/doc/libzstd1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "3a51cdbc80c28c5c", + "bom-ref": "a21cc8ebb031d59a", "name": "/usr/share/doc/libzstd1/copyright", "type": "file" }, { - "bom-ref": "e362f0a67416619d", + "bom-ref": "34c5c6dbfbec242d", "name": "/usr/share/doc/libzvbi-common/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c84125a2103f2cef", + "bom-ref": "87e0709e97bc64ef", "name": "/usr/share/doc/libzvbi-common/copyright", "type": "file" }, { - "bom-ref": "9860a74499774602", + "bom-ref": "3fd825e3a8fa60ba", "name": "/usr/share/doc/libzvbi0t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "54d651497ce31730", + "bom-ref": "bece68d1686292e0", "name": "/usr/share/doc/libzvbi0t64/copyright", "type": "file" }, { - "bom-ref": "8ec70252560b294c", + "bom-ref": "8322f33d6e0e6cec", "name": "/usr/share/doc/linux-libc-dev/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "5baab81489c284db", + "bom-ref": "bd15ed033ac90923", "name": "/usr/share/doc/linux-libc-dev/copyright", "type": "file" }, { - "bom-ref": "267be7f646ea1ee6", + "bom-ref": "ee771d0d424b5f44", "name": "/usr/share/doc/login/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "dbe2503a46f64f8a", + "bom-ref": "ea52662ccd3740bc", "name": "/usr/share/doc/login/copyright", "type": "file" }, { - "bom-ref": "cba28450586ab938", + "bom-ref": "9cdf01d197435452", "name": "/usr/share/doc/logsave/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "fe34f165a18e8ba2", + "bom-ref": "234c09d0c1bfbf44", "name": "/usr/share/doc/logsave/copyright", "type": "file" }, { - "bom-ref": "bc14081bc099f178", + "bom-ref": "a43d2cd6c4c02208", "name": "/usr/share/doc/lsb-release/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b6173a969e1281d3", + "bom-ref": "37aed4535680baf3", "name": "/usr/share/doc/lsb-release/copyright", "type": "file" }, { - "bom-ref": "f2b9ef60155491f8", + "bom-ref": "6aef89f69a622efc", "name": "/usr/share/doc/lto-disabled-list/changelog.gz", "type": "file" }, { - "bom-ref": "7e4c632eb55ab01b", + "bom-ref": "91d14bc7a5a07127", "name": "/usr/share/doc/lto-disabled-list/copyright", "type": "file" }, { - "bom-ref": "a5c66dc003e180c6", + "bom-ref": "1d7e69bfcd7e4fae", "name": "/usr/share/doc/make/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "356045c05e2ced43", + "bom-ref": "0cbbba9feb8dddfb", "name": "/usr/share/doc/make/copyright", "type": "file" }, { - "bom-ref": "81d6750044634aff", + "bom-ref": "b680b1cee1f76345", "name": "/usr/share/doc/mawk/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b5527b8872d6eb9f", + "bom-ref": "e50e1c8653fdae99", "name": "/usr/share/doc/mawk/copyright", "type": "file" }, { - "bom-ref": "e6bf9ceeac8ededf", + "bom-ref": "df8a43b7138e2fc7", "name": "/usr/share/doc/media-types/changelog.gz", "type": "file" }, { - "bom-ref": "d109c7cdf5c9990a", + "bom-ref": "97957c7b4d25d4d6", "name": "/usr/share/doc/media-types/copyright", "type": "file" }, { - "bom-ref": "c4d151eb10671c76", + "bom-ref": "251245c55f567776", "name": "/usr/share/doc/mesa-libgallium/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d288e8522ffc87dc", + "bom-ref": "c4a2c13c4d6ff0f8", "name": "/usr/share/doc/mesa-libgallium/copyright", "type": "file" }, { - "bom-ref": "8128905f2eec57b8", + "bom-ref": "702360280e6a77bc", "name": "/usr/share/doc/mount/copyright", "type": "file" }, { - "bom-ref": "a9e1ab188b7a49f5", + "bom-ref": "469fe83b6ad7319b", "name": "/usr/share/doc/ncurses-base/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "1d2f50be5aac7b1c", + "bom-ref": "8f0ad552c94e44ce", "name": "/usr/share/doc/ncurses-base/copyright", "type": "file" }, { - "bom-ref": "7fa772e73315942e", + "bom-ref": "6187ff23fe82a3f4", "name": "/usr/share/doc/ncurses-bin/copyright", "type": "file" }, { - "bom-ref": "6f927dfc96b23ab7", + "bom-ref": "c4e8e667fc8922cf", "name": "/usr/share/doc/netbase/changelog.gz", "type": "file" }, { - "bom-ref": "4e10fa8edf60c23f", + "bom-ref": "92b7e797d7682b57", "name": "/usr/share/doc/netbase/copyright", "type": "file" }, { - "bom-ref": "a793340918226352", + "bom-ref": "026a95b425ea512e", "name": "/usr/share/doc/numactl/copyright", "type": "file" }, { - "bom-ref": "f07dcc0130ebc4b8", + "bom-ref": "05ef9b1f9e737054", "name": "/usr/share/doc/ocl-icd-libopencl1/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "fb8528a9acf0e9e2", + "bom-ref": "3e06c4ebed42b20e", "name": "/usr/share/doc/ocl-icd-libopencl1/copyright", "type": "file" }, { - "bom-ref": "6954610f44c6113d", + "bom-ref": "8ecc8da5499c7f04", + "name": "/usr/share/doc/packagekit/copyright", + "type": "file" + }, + { + "bom-ref": "1945e6fb1b7024e3", "name": "/usr/share/doc/passwd/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "5640cd0b35ba1337", + "bom-ref": "b811a2cbfb6cc601", "name": "/usr/share/doc/passwd/copyright", "type": "file" }, { - "bom-ref": "f36b759f0dba578e", + "bom-ref": "8a1b6e5820ea6b82", "name": "/usr/share/doc/patch/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "77af9f5ec4e2b96d", + "bom-ref": "e5a8fa5e4fb233a1", "name": "/usr/share/doc/patch/copyright", "type": "file" }, { - "bom-ref": "dfd15d4c9ccf2f7c", + "bom-ref": "56ac03b37e0eeb5e", "name": "/usr/share/doc/perl-base/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "11a602ad1daec18c", + "bom-ref": "42f92060cb6df07e", "name": "/usr/share/doc/perl-base/copyright", "type": "file" }, { - "bom-ref": "6417c20285463168", + "bom-ref": "edcdc047b7d27674", "name": "/usr/share/doc/perl-modules-5.38/copyright", "type": "file" }, { - "bom-ref": "70effcd9b3ca57bf", + "bom-ref": "9ca84d9a84c583c7", "name": "/usr/share/doc/perl/copyright", "type": "file" }, { - "bom-ref": "94dcfb127d564ff3", + "bom-ref": "e541bb9b1eafc03c", + "name": "/usr/share/doc/polkitd/copyright", + "type": "file" + }, + { + "bom-ref": "79d1424985c0ef2d", "name": "/usr/share/doc/procps/copyright", "type": "file" }, { - "bom-ref": "9452ebfadf033564", + "bom-ref": "fd6d1943aa018c10", + "name": "/usr/share/doc/python-apt-common/changelog.gz", + "type": "file" + }, + { + "bom-ref": "f99295534c504cb2", + "name": "/usr/share/doc/python-apt-common/copyright", + "type": "file" + }, + { + "bom-ref": "4ee724a6d1a79ba6", + "name": "/usr/share/doc/python3-apt/changelog.gz", + "type": "file" + }, + { + "bom-ref": "654e756c9967334d", + "name": "/usr/share/doc/python3-apt/copyright", + "type": "file" + }, + { + "bom-ref": "c0f718fceec4bbb1", + "name": "/usr/share/doc/python3-blinker/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "2fba893dbeb9f85b", + "name": "/usr/share/doc/python3-blinker/copyright", + "type": "file" + }, + { + "bom-ref": "c5af412183437981", + "name": "/usr/share/doc/python3-cffi-backend/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "2593d458f7899cb6", + "name": "/usr/share/doc/python3-cffi-backend/copyright", + "type": "file" + }, + { + "bom-ref": "c8376d77079905ca", + "name": "/usr/share/doc/python3-cryptography/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "e805723212707d34", + "name": "/usr/share/doc/python3-cryptography/copyright", + "type": "file" + }, + { + "bom-ref": "df92a30dd528b7a8", + "name": "/usr/share/doc/python3-dbus/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "affb363d662a707c", + "name": "/usr/share/doc/python3-dbus/copyright", + "type": "file" + }, + { + "bom-ref": "94faff46a2f14476", + "name": "/usr/share/doc/python3-distro/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "b0a589105f8c7865", + "name": "/usr/share/doc/python3-distro/copyright", + "type": "file" + }, + { + "bom-ref": "38155cfaf8bb9090", + "name": "/usr/share/doc/python3-gi/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "8dcf79f3accd8dfe", + "name": "/usr/share/doc/python3-gi/copyright", + "type": "file" + }, + { + "bom-ref": "838c6cf6b610077f", + "name": "/usr/share/doc/python3-httplib2/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "6443c5354f90cf22", + "name": "/usr/share/doc/python3-httplib2/copyright", + "type": "file" + }, + { + "bom-ref": "dc9ac615d19060ad", + "name": "/usr/share/doc/python3-jwt/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "09f1d7b55dcba8e3", + "name": "/usr/share/doc/python3-jwt/copyright", + "type": "file" + }, + { + "bom-ref": "c040e0b4e178cbd0", + "name": "/usr/share/doc/python3-launchpadlib/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "9441542a7c52c76e", + "name": "/usr/share/doc/python3-launchpadlib/copyright", + "type": "file" + }, + { + "bom-ref": "03b558aed2930881", + "name": "/usr/share/doc/python3-lazr.restfulclient/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "c822039f4e6fbeaa", + "name": "/usr/share/doc/python3-lazr.restfulclient/copyright", + "type": "file" + }, + { + "bom-ref": "404e577a97073c8a", + "name": "/usr/share/doc/python3-lazr.uri/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "ccee24a48f4871a8", + "name": "/usr/share/doc/python3-lazr.uri/copyright", + "type": "file" + }, + { + "bom-ref": "0bb9bd2f4958ccb4", "name": "/usr/share/doc/python3-minimal/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c8c35889e24fee73", + "bom-ref": "5cc2b29252c0dc43", "name": "/usr/share/doc/python3-minimal/copyright", "type": "file" }, { - "bom-ref": "f1951005014d214c", + "bom-ref": "a9b4185d702d1174", + "name": "/usr/share/doc/python3-oauthlib/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "1b64928c409dc754", + "name": "/usr/share/doc/python3-oauthlib/copyright", + "type": "file" + }, + { + "bom-ref": "351f9714604209d8", "name": "/usr/share/doc/python3-pip/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "5be3f352a395fc30", + "bom-ref": "c5a8a450db31a2e4", "name": "/usr/share/doc/python3-pip/copyright", "type": "file" }, { - "bom-ref": "8815fb553b122865", + "bom-ref": "3cdf6b77e326ff15", "name": "/usr/share/doc/python3-pkg-resources/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "e3a44379a5118eb9", + "bom-ref": "f6d438517dbf9959", "name": "/usr/share/doc/python3-pkg-resources/copyright", "type": "file" }, { - "bom-ref": "85c57e94adf64068", + "bom-ref": "fe0876a9cfea35aa", + "name": "/usr/share/doc/python3-pyparsing/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "11201f54da278681", + "name": "/usr/share/doc/python3-pyparsing/copyright", + "type": "file" + }, + { + "bom-ref": "1f9976d638ce1b28", "name": "/usr/share/doc/python3-setuptools/copyright", "type": "file" }, { - "bom-ref": "d8fdd4d1816ef5be", + "bom-ref": "723bc0f82162a24e", + "name": "/usr/share/doc/python3-six/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "f415c87988cd74ce", + "name": "/usr/share/doc/python3-six/copyright", + "type": "file" + }, + { + "bom-ref": "0c428679d61d1870", + "name": "/usr/share/doc/python3-software-properties/changelog.gz", + "type": "file" + }, + { + "bom-ref": "fe1c4d354e1fb707", + "name": "/usr/share/doc/python3-software-properties/copyright", + "type": "file" + }, + { + "bom-ref": "c9b8f3dc12d5e668", + "name": "/usr/share/doc/python3-wadllib/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "d0466b5b58b1ec16", + "name": "/usr/share/doc/python3-wadllib/copyright", + "type": "file" + }, + { + "bom-ref": "2317b952946bd066", "name": "/usr/share/doc/python3-wheel/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "813e4a3b0f4ad600", + "bom-ref": "6b8533e9b0f8cb2c", "name": "/usr/share/doc/python3-wheel/copyright", "type": "file" }, { - "bom-ref": "59798d6909690ad3", + "bom-ref": "5b28a5bb1cd785c3", "name": "/usr/share/doc/python3.12-minimal/copyright", "type": "file" }, { - "bom-ref": "417dd0c05312cb4e", + "bom-ref": "fdc9d698a31e6ae6", "name": "/usr/share/doc/python3.12/copyright", "type": "file" }, { - "bom-ref": "66214841ad655249", + "bom-ref": "0f865857bfe4ce59", "name": "/usr/share/doc/python3/copyright", "type": "file" }, { - "bom-ref": "3e8e140a66ba97f9", + "bom-ref": "29c2ec2f8aa12f81", "name": "/usr/share/doc/rdma-core/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "19399e6b9091ad80", + "bom-ref": "2ab1d6866e1eaefc", "name": "/usr/share/doc/rdma-core/copyright", "type": "file" }, { - "bom-ref": "3580f67e4444ee1b", + "bom-ref": "6330a3c44551571f", "name": "/usr/share/doc/readline-common/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "64108c476e4d762f", + "bom-ref": "4861eb935363b187", "name": "/usr/share/doc/readline-common/copyright", "type": "file" }, { - "bom-ref": "69e56e06e3199f93", + "bom-ref": "350cc6de27113fdf", "name": "/usr/share/doc/rpcsvc-proto/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "73b3f613ccaa254a", + "bom-ref": "699076a5094170d6", "name": "/usr/share/doc/rpcsvc-proto/copyright", "type": "file" }, { - "bom-ref": "05ada3c23b5a6c21", + "bom-ref": "d7e76e02d3519a47", "name": "/usr/share/doc/sed/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8673057e04ec356f", + "bom-ref": "71f7b57680968f29", "name": "/usr/share/doc/sed/copyright", "type": "file" }, { - "bom-ref": "ed8e4d656df052af", + "bom-ref": "14b9590f246d5df5", "name": "/usr/share/doc/sensible-utils/changelog.gz", "type": "file" }, { - "bom-ref": "83933088670158cd", + "bom-ref": "c0a45ec25afbb377", "name": "/usr/share/doc/sensible-utils/copyright", "type": "file" }, { - "bom-ref": "edb7b065d17edd83", + "bom-ref": "3ec283dc1ad0e504", + "name": "/usr/share/doc/sgml-base/changelog.gz", + "type": "file" + }, + { + "bom-ref": "8528810a4572d7eb", + "name": "/usr/share/doc/sgml-base/copyright", + "type": "file" + }, + { + "bom-ref": "eb4b9db28477954f", "name": "/usr/share/doc/shared-mime-info/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "a9ba18922a157902", + "bom-ref": "9175240cf62026ea", "name": "/usr/share/doc/shared-mime-info/copyright", "type": "file" }, { - "bom-ref": "644a7755c8384fe2", + "bom-ref": "0cc33146f5bfa390", + "name": "/usr/share/doc/software-properties-common/copyright", + "type": "file" + }, + { + "bom-ref": "c81a8a2d9943c128", "name": "/usr/share/doc/systemd-dev/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "5570f0a3fd548b1d", + "bom-ref": "86dfdf003e398587", "name": "/usr/share/doc/systemd-dev/copyright", "type": "file" }, { - "bom-ref": "5841160b9e2e3c08", + "bom-ref": "ac644f88d9f44f08", + "name": "/usr/share/doc/systemd-sysv/copyright", + "type": "file" + }, + { + "bom-ref": "833add2f781bfc8a", "name": "/usr/share/doc/systemd/copyright", "type": "file" }, { - "bom-ref": "8732cd9c0b0d48a1", + "bom-ref": "d077ffc0586d8353", "name": "/usr/share/doc/sysvinit-utils/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "00a90e475a8288e5", + "bom-ref": "53d09ef001b376ab", "name": "/usr/share/doc/sysvinit-utils/copyright", "type": "file" }, { - "bom-ref": "328977fd5ddfd714", + "bom-ref": "e38ef4d8a3558b9e", "name": "/usr/share/doc/tar/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "fb63fbe2fd708a5a", + "bom-ref": "174f466621b8f61c", "name": "/usr/share/doc/tar/copyright", "type": "file" }, { - "bom-ref": "411b382ce4180641", + "bom-ref": "54509006ec0f2425", "name": "/usr/share/doc/tzdata/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "d45b873482cb5233", + "bom-ref": "768a3db7b304a173", "name": "/usr/share/doc/tzdata/copyright", "type": "file" }, { - "bom-ref": "0fb956c986005fd3", + "bom-ref": "ff439694594082c9", "name": "/usr/share/doc/ubuntu-keyring/changelog.gz", "type": "file" }, { - "bom-ref": "9b6609cb020e30de", + "bom-ref": "a19ce125ab9439b0", "name": "/usr/share/doc/ubuntu-keyring/copyright", "type": "file" }, { - "bom-ref": "9b1178e6484418e1", + "bom-ref": "0ca0c3d1c4dd9055", "name": "/usr/share/doc/udev/copyright", "type": "file" }, { - "bom-ref": "481d76ab5db922a7", + "bom-ref": "a6e9db82728d1bf1", "name": "/usr/share/doc/unminimize/changelog.gz", "type": "file" }, { - "bom-ref": "14d9375496df87a7", + "bom-ref": "da331e73c8afc221", "name": "/usr/share/doc/unminimize/copyright", "type": "file" }, { - "bom-ref": "e7804cac75acc996", + "bom-ref": "8d21d17216f99182", "name": "/usr/share/doc/util-linux/copyright", "type": "file" }, { - "bom-ref": "703e0a008fa3794d", + "bom-ref": "4ac3f8244e1921ad", "name": "/usr/share/doc/vim-common/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "42b8e5f1272565b4", + "bom-ref": "c26efac62c1e4a1c", "name": "/usr/share/doc/vim-common/copyright", "type": "file" }, { - "bom-ref": "e76eb8df194ca0ca", + "bom-ref": "6f41bf7452cd7dde", "name": "/usr/share/doc/vim-runtime/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "cb762892d7895f3e", + "bom-ref": "5e04c25f0ddcad52", "name": "/usr/share/doc/vim-runtime/copyright", "type": "file" }, { - "bom-ref": "7a7b714939f38abf", + "bom-ref": "5b8e27c7f0c9dfef", "name": "/usr/share/doc/vim/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "eeb075fbb9d0a2b2", + "bom-ref": "8d76cd3a9302987e", "name": "/usr/share/doc/vim/copyright", "type": "file" }, { - "bom-ref": "0f04e6e109312c06", + "bom-ref": "4d19e6505297649a", "name": "/usr/share/doc/wget/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "edf60dabbab39d37", + "bom-ref": "bfcdeac85aa8a63b", "name": "/usr/share/doc/wget/copyright", "type": "file" }, { - "bom-ref": "c2efc25f3bf6eeda", + "bom-ref": "dbf1311eb149d1b6", "name": "/usr/share/doc/x11-common/changelog.gz", "type": "file" }, { - "bom-ref": "505a10b221414eaa", + "bom-ref": "2eb65a07c88bfc8a", "name": "/usr/share/doc/x11-common/copyright", "type": "file" }, { - "bom-ref": "e3260869cd8c978a", + "bom-ref": "669bb66975ee404a", "name": "/usr/share/doc/xkb-data/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "4edce02c364848c7", + "bom-ref": "e254f30d3f61ce77", "name": "/usr/share/doc/xkb-data/copyright", "type": "file" }, { - "bom-ref": "9391ce5c39ea2dd8", + "bom-ref": "23b0cdd90e4dcbb4", + "name": "/usr/share/doc/xml-core/changelog.gz", + "type": "file" + }, + { + "bom-ref": "5c5a18a87bd0000a", + "name": "/usr/share/doc/xml-core/copyright", + "type": "file" + }, + { + "bom-ref": "0cc1cba1bb4bef86", + "name": "/usr/share/doc/xpu-smi/changelog.Debian.gz", + "type": "file" + }, + { + "bom-ref": "604fd886f0cca45d", + "name": "/usr/share/doc/xpu-smi/copyright", + "type": "file" + }, + { + "bom-ref": "9dc28cfbec491300", "name": "/usr/share/doc/xz-utils/copyright", "type": "file" }, { - "bom-ref": "efb3dbbd8ec56a47", + "bom-ref": "b77606cefa299f53", "name": "/usr/share/doc/zlib1g-dev/copyright", "type": "file" }, { - "bom-ref": "c7d67c409810337a", + "bom-ref": "ba86caa362430c80", "name": "/usr/share/doc/zlib1g/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "cee7eb751ff4c407", + "bom-ref": "17cc31e99f228b49", "name": "/usr/share/doc/zlib1g/copyright", "type": "file" }, { - "bom-ref": "7bf35cd3dae3be8e", + "bom-ref": "56599016aad86b9c", "name": "/usr/share/dot.bashrc", "type": "file" }, { - "bom-ref": "d7c1848a81f534a4", + "bom-ref": "c598be4c425d3a72", "name": "/usr/share/dot.profile", "type": "file" }, { - "bom-ref": "246dd4f773622159", + "bom-ref": "c80232bd8e895a4b", "name": "/usr/share/dot.profile.md5sums", "type": "file" }, { - "bom-ref": "6cb21a2c90062d67", + "bom-ref": "292f5a3870e816a9", "name": "/usr/share/dpkg/abitable", "type": "file" }, { - "bom-ref": "0f8d806cad72a079", + "bom-ref": "6ae395a96f1c9b01", "name": "/usr/share/dpkg/architecture.mk", "type": "file" }, { - "bom-ref": "0bfe5d853ea30a61", + "bom-ref": "742355ed637f7ec9", "name": "/usr/share/dpkg/buildapi.mk", "type": "file" }, { - "bom-ref": "ed76f0a6a5fdeb73", + "bom-ref": "ec3e1c312cde6393", "name": "/usr/share/dpkg/buildflags.mk", "type": "file" }, { - "bom-ref": "f0b2b597a1fb9a76", + "bom-ref": "75264e76b526d692", "name": "/usr/share/dpkg/buildopts.mk", "type": "file" }, { - "bom-ref": "979e241f50fb52bd", + "bom-ref": "8d431d8f9c74e995", "name": "/usr/share/dpkg/buildtools.mk", "type": "file" }, { - "bom-ref": "09ea821a3449aa1c", + "bom-ref": "ca6da35a9bbe04fa", "name": "/usr/share/dpkg/cputable", "type": "file" }, { - "bom-ref": "72601110b618b1be", + "bom-ref": "8681cbf95c99e7d2", "name": "/usr/share/dpkg/default.mk", "type": "file" }, { - "bom-ref": "f7b176a46a715410", + "bom-ref": "d27713e3ab6af81c", "name": "/usr/share/dpkg/no-pie-compile.specs", "type": "file" }, { - "bom-ref": "09921c0ab3263b2a", + "bom-ref": "d4012ae29b423eae", "name": "/usr/share/dpkg/no-pie-link.specs", "type": "file" }, { - "bom-ref": "3ab8edfc64fa0fad", + "bom-ref": "9af20862afb5e293", "name": "/usr/share/dpkg/ostable", "type": "file" }, { - "bom-ref": "5f403fe23fafd45e", + "bom-ref": "2aaab1d3f05e41b6", "name": "/usr/share/dpkg/pie-compile.specs", "type": "file" }, { - "bom-ref": "4ae86161b148f872", + "bom-ref": "50efd9125b4a9176", "name": "/usr/share/dpkg/pie-link.specs", "type": "file" }, { - "bom-ref": "8658046e941b6a10", + "bom-ref": "a7f8aecb21c0e930", "name": "/usr/share/dpkg/pkg-info.mk", "type": "file" }, { - "bom-ref": "200a27df4e4090f0", + "bom-ref": "258c31a7f9e53e12", "name": "/usr/share/dpkg/sh/dpkg-error.sh", "type": "file" }, { - "bom-ref": "2e5c44c4f735e720", + "bom-ref": "3ae864466d788172", "name": "/usr/share/dpkg/tupletable", "type": "file" }, { - "bom-ref": "21b78c6a3f125dd9", + "bom-ref": "3eaf92ae14860275", "name": "/usr/share/dpkg/vendor.mk", "type": "file" }, { - "bom-ref": "f8f92d553eccd046", + "bom-ref": "e900bade57479f8e", "name": "/usr/share/drirc.d/00-mesa-defaults.conf", "type": "file" }, { - "bom-ref": "73d9595405a07483", + "bom-ref": "2c4dd8b2718a278f", "name": "/usr/share/ffmpeg/ffprobe.xsd", "type": "file" }, { - "bom-ref": "0246c4cca15f57f9", + "bom-ref": "56c4008bfc372415", "name": "/usr/share/ffmpeg/libvpx-1080p.ffpreset", "type": "file" }, { - "bom-ref": "835ad550c11b896c", + "bom-ref": "d806dc037674dad0", "name": "/usr/share/ffmpeg/libvpx-1080p50_60.ffpreset", "type": "file" }, { - "bom-ref": "e5494a3cc53a1ecf", + "bom-ref": "92cb09f1eb17bdc7", "name": "/usr/share/ffmpeg/libvpx-360p.ffpreset", "type": "file" }, { - "bom-ref": "76d0b0372c0a25fb", + "bom-ref": "2555ff67cb77adaf", "name": "/usr/share/ffmpeg/libvpx-720p.ffpreset", "type": "file" }, { - "bom-ref": "ba79803fd52f082a", + "bom-ref": "7e0b46e169f78cca", "name": "/usr/share/ffmpeg/libvpx-720p50_60.ffpreset", "type": "file" }, { - "bom-ref": "b7ead2a622e9ca3f", + "bom-ref": "28e86f5565fff4bb", "name": "/usr/share/fontconfig/conf.avail/05-reset-dirs-sample.conf", "type": "file" }, { - "bom-ref": "dca90b38aa0b81cc", + "bom-ref": "510e468ec9679c7c", "name": "/usr/share/fontconfig/conf.avail/09-autohint-if-no-hinting.conf", "type": "file" }, { - "bom-ref": "09c708c96bed4500", + "bom-ref": "e89ef0a5736c0500", "name": "/usr/share/fontconfig/conf.avail/10-autohint.conf", "type": "file" }, { - "bom-ref": "c8704a424996d897", + "bom-ref": "4a1d713944a8e5b3", "name": "/usr/share/fontconfig/conf.avail/10-hinting-full.conf", "type": "file" }, { - "bom-ref": "db9b6b534b89aa1a", + "bom-ref": "74942e60ad1ad5b6", "name": "/usr/share/fontconfig/conf.avail/10-hinting-medium.conf", "type": "file" }, { - "bom-ref": "4552d4ab53b41cf9", + "bom-ref": "f0c229c65f323175", "name": "/usr/share/fontconfig/conf.avail/10-hinting-none.conf", "type": "file" }, { - "bom-ref": "b6efb5098d728b49", + "bom-ref": "57d69545e46aeff1", "name": "/usr/share/fontconfig/conf.avail/10-hinting-slight.conf", "type": "file" }, { - "bom-ref": "212e2bdbb62d64e1", + "bom-ref": "dc6f5d1ba5230341", "name": "/usr/share/fontconfig/conf.avail/10-no-antialias.conf", "type": "file" }, { - "bom-ref": "789ede54e61fc845", + "bom-ref": "c57355276a8e8491", "name": "/usr/share/fontconfig/conf.avail/10-scale-bitmap-fonts.conf", "type": "file" }, { - "bom-ref": "a89a67fa938b82b0", + "bom-ref": "83ee7dfb4fc48c08", "name": "/usr/share/fontconfig/conf.avail/10-sub-pixel-bgr.conf", "type": "file" }, { - "bom-ref": "9b243eea85078334", + "bom-ref": "4dee07b4065e4b50", "name": "/usr/share/fontconfig/conf.avail/10-sub-pixel-none.conf", "type": "file" }, { - "bom-ref": "e4cc53bced87b6b4", + "bom-ref": "0dc63549762bdf34", "name": "/usr/share/fontconfig/conf.avail/10-sub-pixel-rgb.conf", "type": "file" }, { - "bom-ref": "e2fab0c452d5aa92", + "bom-ref": "0e256a194c1423be", "name": "/usr/share/fontconfig/conf.avail/10-sub-pixel-vbgr.conf", "type": "file" }, { - "bom-ref": "901f76bc90725776", + "bom-ref": "1c6a41bcf2a9110a", "name": "/usr/share/fontconfig/conf.avail/10-sub-pixel-vrgb.conf", "type": "file" }, { - "bom-ref": "941b8bd4353334ce", + "bom-ref": "eecfebb5323a8366", "name": "/usr/share/fontconfig/conf.avail/10-unhinted.conf", "type": "file" }, { - "bom-ref": "b7f85540aa54bc4a", + "bom-ref": "5359641f9c17faba", "name": "/usr/share/fontconfig/conf.avail/10-yes-antialias.conf", "type": "file" }, { - "bom-ref": "08511da62bbee1f9", + "bom-ref": "3ae843da8261bc61", "name": "/usr/share/fontconfig/conf.avail/11-lcdfilter-default.conf", "type": "file" }, { - "bom-ref": "b94b1cccc2c22ac8", + "bom-ref": "9a2e026412b87f78", "name": "/usr/share/fontconfig/conf.avail/11-lcdfilter-legacy.conf", "type": "file" }, { - "bom-ref": "3bf7e6a0203292b0", + "bom-ref": "10cdb04f183b6fe4", "name": "/usr/share/fontconfig/conf.avail/11-lcdfilter-light.conf", "type": "file" }, { - "bom-ref": "6e7f4a56ebdb1014", + "bom-ref": "ac442fac8cd8880c", "name": "/usr/share/fontconfig/conf.avail/11-lcdfilter-none.conf", "type": "file" }, { - "bom-ref": "82173131954f7412", + "bom-ref": "cf06d28ed533bf6e", "name": "/usr/share/fontconfig/conf.avail/20-unhint-small-vera.conf", "type": "file" }, { - "bom-ref": "2153e09c55e884f6", + "bom-ref": "382d9cd5976c3a1a", "name": "/usr/share/fontconfig/conf.avail/25-unhint-nonlatin.conf", "type": "file" }, { - "bom-ref": "5566424a333e5346", + "bom-ref": "6efe6c707fc993f6", "name": "/usr/share/fontconfig/conf.avail/30-metric-aliases.conf", "type": "file" }, { - "bom-ref": "034a83ba3eb454fb", + "bom-ref": "37ccc8943f67492b", "name": "/usr/share/fontconfig/conf.avail/35-lang-normalize.conf", "type": "file" }, { - "bom-ref": "34b4c51fc3d4d931", + "bom-ref": "724cb897196d1e89", "name": "/usr/share/fontconfig/conf.avail/40-nonlatin.conf", "type": "file" }, { - "bom-ref": "41c9febe601168e7", + "bom-ref": "a16e43e406a470b7", "name": "/usr/share/fontconfig/conf.avail/45-generic.conf", "type": "file" }, { - "bom-ref": "8e0fcfd5d2d6b0a7", + "bom-ref": "db46bd82d0af234b", "name": "/usr/share/fontconfig/conf.avail/45-latin.conf", "type": "file" }, { - "bom-ref": "3925b714d3d20911", + "bom-ref": "7d15edb2083ab2cd", "name": "/usr/share/fontconfig/conf.avail/48-spacing.conf", "type": "file" }, { - "bom-ref": "8c647320bd3e15c3", + "bom-ref": "0bc3e150e0253b2b", "name": "/usr/share/fontconfig/conf.avail/49-sansserif.conf", "type": "file" }, { - "bom-ref": "25eb384b2e8c38c3", + "bom-ref": "00d825006324c297", "name": "/usr/share/fontconfig/conf.avail/50-user.conf", "type": "file" }, { - "bom-ref": "aaad87559e237c71", + "bom-ref": "7f0a0fa3b3d72f8d", "name": "/usr/share/fontconfig/conf.avail/51-local.conf", "type": "file" }, { - "bom-ref": "8acc0364e4f8413f", + "bom-ref": "99e2be801644089f", "name": "/usr/share/fontconfig/conf.avail/53-monospace-lcd-filter.conf", "type": "file" }, { - "bom-ref": "b9a7842c6ca5b8da", + "bom-ref": "58e4459fd232f6b6", "name": "/usr/share/fontconfig/conf.avail/60-generic.conf", "type": "file" }, { - "bom-ref": "dc6a30f7feb6bd4c", + "bom-ref": "beeeb475d638cafc", "name": "/usr/share/fontconfig/conf.avail/60-latin.conf", "type": "file" }, { - "bom-ref": "e315dd307874136e", + "bom-ref": "943935fc84676b32", "name": "/usr/share/fontconfig/conf.avail/65-fonts-persian.conf", "type": "file" }, { - "bom-ref": "555e76c814970aa8", + "bom-ref": "23d043631543eec4", "name": "/usr/share/fontconfig/conf.avail/65-khmer.conf", "type": "file" }, { - "bom-ref": "6b21cce43413a5d2", + "bom-ref": "9376b740a00662f2", "name": "/usr/share/fontconfig/conf.avail/65-nonlatin.conf", "type": "file" }, { - "bom-ref": "b52d436ec670a54a", + "bom-ref": "59ec26369d1e0cde", "name": "/usr/share/fontconfig/conf.avail/69-unifont.conf", "type": "file" }, { - "bom-ref": "6bdabd32d96425bc", + "bom-ref": "caa208094f91f50c", "name": "/usr/share/fontconfig/conf.avail/70-force-bitmaps.conf", "type": "file" }, { - "bom-ref": "1b1f003b0e0e3348", + "bom-ref": "086c0107dc5112e4", "name": "/usr/share/fontconfig/conf.avail/70-no-bitmaps-and-emoji.conf", "type": "file" }, { - "bom-ref": "7b6079557d38dac9", + "bom-ref": "e92cd0bfc6882889", "name": "/usr/share/fontconfig/conf.avail/70-no-bitmaps-except-emoji.conf", "type": "file" }, { - "bom-ref": "9179158e2ab181f3", + "bom-ref": "edbb5bfe34ad3843", "name": "/usr/share/fontconfig/conf.avail/70-no-bitmaps.conf", "type": "file" }, { - "bom-ref": "a340e716241b8656", + "bom-ref": "a604e6df4aa1978e", "name": "/usr/share/fontconfig/conf.avail/70-yes-bitmaps.conf", "type": "file" }, { - "bom-ref": "b7b4a0c07702fba6", + "bom-ref": "49330a36693a018a", "name": "/usr/share/fontconfig/conf.avail/80-delicious.conf", "type": "file" }, { - "bom-ref": "7a7edd581dbecfe3", + "bom-ref": "48e3f0f4177fe61f", "name": "/usr/share/fontconfig/conf.avail/90-synthetic.conf", "type": "file" }, { - "bom-ref": "45601a9b8e832fdb", + "bom-ref": "f141537f11bb4d1f", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", "type": "file" }, { - "bom-ref": "fd69e6683e086c0d", + "bom-ref": "c5b981236b327f25", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", "type": "file" }, { - "bom-ref": "6474c4469d6898d5", + "bom-ref": "8a7093966e930e09", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf", "type": "file" }, { - "bom-ref": "3cb37f15ad7d0917", + "bom-ref": "1e876d44e21af32b", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSansMono-BoldOblique.ttf", "type": "file" }, { - "bom-ref": "9c85b83e1a672d02", + "bom-ref": "1f94e52f42a78386", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Oblique.ttf", "type": "file" }, { - "bom-ref": "599be8554ffa2f42", + "bom-ref": "f09a7bf898160a22", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", "type": "file" }, { - "bom-ref": "5304dafbf1411724", + "bom-ref": "1e2f78c30d68a4e8", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf", "type": "file" }, { - "bom-ref": "e4f0fd3dcd1aefe2", + "bom-ref": "bb2407fb42690b52", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf", "type": "file" }, { - "bom-ref": "c4e48e6a4f463ea4", + "bom-ref": "2ec3b7684cc1d0b2", "name": "/usr/share/gcc/python/libstdcxx/__init__.py", "type": "file" }, { - "bom-ref": "f9e26f32f76d92d7", + "bom-ref": "3195500b9bd009c5", "name": "/usr/share/gcc/python/libstdcxx/v6/__init__.py", "type": "file" }, { - "bom-ref": "3afb410ba84fced7", + "bom-ref": "57d734576bcd1b9d", "name": "/usr/share/gcc/python/libstdcxx/v6/printers.py", "type": "file" }, { - "bom-ref": "4dbc79cdc5d2d964", + "bom-ref": "f516b362dea03bba", "name": "/usr/share/gcc/python/libstdcxx/v6/xmethods.py", "type": "file" }, { - "bom-ref": "dd485ae8cfdd49fc", + "bom-ref": "c999f8abe793bab0", "name": "/usr/share/gdb/auto-load/lib/x86_64-linux-gnu/libc.so.6-gdb.py", "type": "file" }, { - "bom-ref": "7f8f111b6dd1f457", + "bom-ref": "52089238a29b2233", "name": "/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libisl.so.23.3.0-gdb.py", "type": "file" }, { - "bom-ref": "98b47fff9e53d537", + "bom-ref": "1947547b80de844d", "name": "/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33-gdb.py", "type": "file" }, { - "bom-ref": "acb4aa859f107781", + "bom-ref": "cb9a45651700cf05", "name": "/usr/share/gettext/its/shared-mime-info.its", "type": "file" }, { - "bom-ref": "46a02b52ba1c61bd", + "bom-ref": "cd04440720e16821", "name": "/usr/share/gettext/its/shared-mime-info.loc", "type": "file" }, { - "bom-ref": "96a277455fe537cc", + "bom-ref": "3a64366fd432e6d0", "name": "/usr/share/git-core/contrib/hooks/post-receive-email", "type": "file" }, { - "bom-ref": "8301df32d7c80706", + "bom-ref": "acdd24f741d0861e", "name": "/usr/share/git-core/contrib/hooks/pre-auto-gc-battery", "type": "file" }, { - "bom-ref": "342a0d02640b94e5", + "bom-ref": "d70f67f5d8572551", "name": "/usr/share/git-core/contrib/hooks/setgitperms.perl", "type": "file" }, { - "bom-ref": "bbbaf0c071702786", + "bom-ref": "b3f8badf0f48b67a", "name": "/usr/share/git-core/contrib/hooks/update-paranoid", "type": "file" }, { - "bom-ref": "1d7cb42d446948a9", + "bom-ref": "07c69f8a673bd0d5", "name": "/usr/share/git-core/templates/description", "type": "file" }, { - "bom-ref": "d987140b82f31fa5", + "bom-ref": "04e3f85b863187bd", "name": "/usr/share/git-core/templates/hooks/applypatch-msg.sample", "type": "file" }, { - "bom-ref": "4ae34dfcc53622f3", + "bom-ref": "b289e7922ea26617", "name": "/usr/share/git-core/templates/hooks/commit-msg.sample", "type": "file" }, { - "bom-ref": "026b717b2923109f", + "bom-ref": "0484d3ba15ff085b", "name": "/usr/share/git-core/templates/hooks/fsmonitor-watchman.sample", "type": "file" }, { - "bom-ref": "d515d6a8f4fe72a8", + "bom-ref": "b9fe1208687bb9ec", "name": "/usr/share/git-core/templates/hooks/post-update.sample", "type": "file" }, { - "bom-ref": "406a44eaa5bfe2a3", + "bom-ref": "c95186cc210e6a1f", "name": "/usr/share/git-core/templates/hooks/pre-applypatch.sample", "type": "file" }, { - "bom-ref": "49ef826912d80304", + "bom-ref": "605e62beb1da5be4", "name": "/usr/share/git-core/templates/hooks/pre-commit.sample", "type": "file" }, { - "bom-ref": "94efc27954881c72", + "bom-ref": "ce7068e1e4c5d966", "name": "/usr/share/git-core/templates/hooks/pre-merge-commit.sample", "type": "file" }, { - "bom-ref": "9db42aef1115546f", + "bom-ref": "cc680fba89bd6ebb", "name": "/usr/share/git-core/templates/hooks/pre-push.sample", "type": "file" }, { - "bom-ref": "066f3cae536c9044", + "bom-ref": "a40ec9fe88f3aae8", "name": "/usr/share/git-core/templates/hooks/pre-rebase.sample", "type": "file" }, { - "bom-ref": "68d8595cb4ab6da1", + "bom-ref": "62610b728782c88d", "name": "/usr/share/git-core/templates/hooks/pre-receive.sample", "type": "file" }, { - "bom-ref": "616905a6565ce924", + "bom-ref": "11f8564db35379f4", "name": "/usr/share/git-core/templates/hooks/prepare-commit-msg.sample", "type": "file" }, { - "bom-ref": "e3f84b70c473950c", + "bom-ref": "7fca46548decd17c", "name": "/usr/share/git-core/templates/hooks/push-to-checkout.sample", "type": "file" }, { - "bom-ref": "e58633705400dc26", + "bom-ref": "503a12e4d5c10136", "name": "/usr/share/git-core/templates/hooks/sendemail-validate.sample", "type": "file" }, { - "bom-ref": "7c8167710f180ce8", + "bom-ref": "2b71bf4ba9fb3a38", "name": "/usr/share/git-core/templates/hooks/update.sample", "type": "file" }, { - "bom-ref": "b34ea19f7aaa34f2", + "bom-ref": "0a3ea6b83db89ea6", "name": "/usr/share/git-core/templates/info/exclude", "type": "file" }, { - "bom-ref": "8176a024a6a17978", + "bom-ref": "228093dcad32e8e0", "name": "/usr/share/gitweb/gitweb.cgi", "type": "file" }, { - "bom-ref": "6b3ee2aa2d37cea1", + "bom-ref": "20758e375b4cb9e5", "name": "/usr/share/gitweb/static/git-favicon.png", "type": "file" }, { - "bom-ref": "6fffad10f3a2a135", + "bom-ref": "fdd85b3d6d7ab825", "name": "/usr/share/gitweb/static/git-logo.png", "type": "file" }, { - "bom-ref": "38bddb5d69509556", + "bom-ref": "d053aeed59260aa2", "name": "/usr/share/gitweb/static/gitweb.css", "type": "file" }, { - "bom-ref": "dbe38ea5eebddfea", + "bom-ref": "47812d34218eacba", "name": "/usr/share/gitweb/static/gitweb.js", "type": "file" }, { - "bom-ref": "06d36e26b43dbbaf", + "bom-ref": "f3474910de10b983", "name": "/usr/share/gnupg/distsigkey.gpg", "type": "file" }, { - "bom-ref": "75124d6a41bc99de", + "bom-ref": "324520be66222b1e", "name": "/usr/share/icons/hicolor/48x48/apps/gvim.png", "type": "file" }, { - "bom-ref": "a16dfe465849007b", + "bom-ref": "c60ddc69e9ab23ab", "name": "/usr/share/icons/hicolor/scalable/apps/gvim.svg", "type": "file" }, { - "bom-ref": "14d4c22e00a4ded0", + "bom-ref": "691a84159a8c7348", "name": "/usr/share/icons/locolor/16x16/apps/gvim.png", "type": "file" }, { - "bom-ref": "110acc5a3370f1d1", + "bom-ref": "b1bb0eb96a5b0055", "name": "/usr/share/icons/locolor/32x32/apps/gvim.png", "type": "file" }, { - "bom-ref": "bc911dd2642edfd8", + "bom-ref": "6f12f254d92c3e2a", "name": "/usr/share/info.dir", "type": "file" }, { - "bom-ref": "843ae8abd2923e1d", + "bom-ref": "8a0fbc91c5f121d3", "name": "/usr/share/info/coreutils.info.gz", "type": "file" }, { - "bom-ref": "94db359076507c4f", + "bom-ref": "63c08f1bfb3b36f1", "name": "/usr/share/info/diffutils.info.gz", "type": "file" }, { - "bom-ref": "30978273aa2e58aa", + "bom-ref": "2ccef9e3dc6b52e0", "name": "/usr/share/info/find-maint.info.gz", "type": "file" }, { - "bom-ref": "b1d35c2a15cf3eae", + "bom-ref": "850a98d1ae58ef08", "name": "/usr/share/info/find.info-1.gz", "type": "file" }, { - "bom-ref": "e2eab6af1e0a89f4", + "bom-ref": "78bf100f958cea3a", "name": "/usr/share/info/find.info-2.gz", "type": "file" }, { - "bom-ref": "20f5a3e586332a78", + "bom-ref": "e79459025493580a", "name": "/usr/share/info/find.info.gz", "type": "file" }, { - "bom-ref": "49f51d576aad28cc", + "bom-ref": "95081f42eb99b252", "name": "/usr/share/info/grep.info.gz", "type": "file" }, { - "bom-ref": "cc323ec43def3d21", + "bom-ref": "dc1b1685b70698eb", "name": "/usr/share/info/gzip.info.gz", "type": "file" }, { - "bom-ref": "36e7b42bb7fb0451", + "bom-ref": "5a6b489af08fc8f1", "name": "/usr/share/info/rluserman.info.gz", "type": "file" }, { - "bom-ref": "0c99010a3f4ee764", + "bom-ref": "21b07cae54dfbcfe", "name": "/usr/share/info/sed.info.gz", "type": "file" }, { - "bom-ref": "17b29025bf5d948b", + "bom-ref": "aaaef88106aa754b", "name": "/usr/share/info/wget.info.gz", "type": "file" }, { - "bom-ref": "c5baa5e1232fbfe3", + "bom-ref": "d48290036e8c9a0f", "name": "/usr/share/initramfs-tools/hooks/udev", "type": "file" }, { - "bom-ref": "27be78bec408f7d5", + "bom-ref": "74fb8d642b42df9d", "name": "/usr/share/initramfs-tools/scripts/init-bottom/udev", "type": "file" }, { - "bom-ref": "cea331a30330077c", + "bom-ref": "aa98fd3c32a98ad8", "name": "/usr/share/initramfs-tools/scripts/init-top/udev", "type": "file" }, { - "bom-ref": "a3e6d50d15be1e88", + "bom-ref": "83492f669442c422", + "name": "/usr/share/iso-codes/json/iso_15924.json", + "type": "file" + }, + { + "bom-ref": "0786a3e579ac853d", + "name": "/usr/share/iso-codes/json/iso_3166-1.json", + "type": "file" + }, + { + "bom-ref": "412b834fd8655ac1", + "name": "/usr/share/iso-codes/json/iso_3166-2.json", + "type": "file" + }, + { + "bom-ref": "0bd6d27f1e7f96b7", + "name": "/usr/share/iso-codes/json/iso_3166-3.json", + "type": "file" + }, + { + "bom-ref": "b0844475358dd1eb", + "name": "/usr/share/iso-codes/json/iso_4217.json", + "type": "file" + }, + { + "bom-ref": "20bd74c674bcbc77", + "name": "/usr/share/iso-codes/json/iso_639-2.json", + "type": "file" + }, + { + "bom-ref": "6a1b6417a7c0433b", + "name": "/usr/share/iso-codes/json/iso_639-3.json", + "type": "file" + }, + { + "bom-ref": "b229f4b00c0844c8", + "name": "/usr/share/iso-codes/json/iso_639-5.json", + "type": "file" + }, + { + "bom-ref": "28951f6992dbd805", + "name": "/usr/share/iso-codes/json/schema-15924.json", + "type": "file" + }, + { + "bom-ref": "001b158b2546eedd", + "name": "/usr/share/iso-codes/json/schema-3166-1.json", + "type": "file" + }, + { + "bom-ref": "87e8389b19d2f23d", + "name": "/usr/share/iso-codes/json/schema-3166-2.json", + "type": "file" + }, + { + "bom-ref": "1fbc1ed445cfcada", + "name": "/usr/share/iso-codes/json/schema-3166-3.json", + "type": "file" + }, + { + "bom-ref": "f37f50f45656db70", + "name": "/usr/share/iso-codes/json/schema-4217.json", + "type": "file" + }, + { + "bom-ref": "5cba2a49681158d2", + "name": "/usr/share/iso-codes/json/schema-639-2.json", + "type": "file" + }, + { + "bom-ref": "88665d1d68fcb5ff", + "name": "/usr/share/iso-codes/json/schema-639-3.json", + "type": "file" + }, + { + "bom-ref": "8c2e0c15fa83fffb", + "name": "/usr/share/iso-codes/json/schema-639-5.json", + "type": "file" + }, + { + "bom-ref": "afa9e6a90dc14712", "name": "/usr/share/keyrings/ubuntu-archive-keyring.gpg", "type": "file" }, { - "bom-ref": "c7f9a7dca731f701", + "bom-ref": "80525a9d4c43af0b", "name": "/usr/share/keyrings/ubuntu-archive-removed-keys.gpg", "type": "file" }, { - "bom-ref": "d4e5b30581d1ab1e", + "bom-ref": "768ab01df9114b88", "name": "/usr/share/keyrings/ubuntu-cloudimage-keyring.gpg", "type": "file" }, { - "bom-ref": "8d7b474f8836e7be", + "bom-ref": "980d943c138c7c70", "name": "/usr/share/keyrings/ubuntu-cloudimage-removed-keys.gpg", "type": "file" }, { - "bom-ref": "d52ce7a866ae1974", + "bom-ref": "b45fcc019113a15e", "name": "/usr/share/keyrings/ubuntu-master-keyring.gpg", "type": "file" }, { - "bom-ref": "3269cf17264930cd", + "bom-ref": "d44a2f8b3744567f", "name": "/usr/share/libc-bin/nsswitch.conf", "type": "file" }, { - "bom-ref": "ea2df90379deb253", + "bom-ref": "91ffdbb9d37343fb", "name": "/usr/share/libdrm/amdgpu.ids", "type": "file" }, { - "bom-ref": "e4bb6a556d1a5f8e", + "bom-ref": "eed6ec8adc0e3c1c", "name": "/usr/share/libgcrypt20/clean-up-unmanaged-libraries", "type": "file" }, { - "bom-ref": "3945e28d27ba7296", + "bom-ref": "dbd9a22320ad647e", "name": "/usr/share/libmysofa/MIT_KEMAR_normal_pinna.sofa", "type": "file" }, { - "bom-ref": "ae045ba3b77e5ee4", + "bom-ref": "892f6f71d636f01c", "name": "/usr/share/libthai/thbrk.tri", "type": "file" }, { - "bom-ref": "c8385b0d5e6cb63c", + "bom-ref": "67da137e579a02b6", "name": "/usr/share/lintian/overrides/apt", "type": "file" }, { - "bom-ref": "8fb2938d8db92d77", + "bom-ref": "8e1770698f884f59", "name": "/usr/share/lintian/overrides/base-files", "type": "file" }, { - "bom-ref": "d8a10960d427745d", + "bom-ref": "eae3feb059a40993", "name": "/usr/share/lintian/overrides/base-passwd", "type": "file" }, { - "bom-ref": "8307cceed18875fb", + "bom-ref": "4589d25b0dc585fd", "name": "/usr/share/lintian/overrides/bash", "type": "file" }, { - "bom-ref": "a52300758d05798f", + "bom-ref": "0fea514246f0b90b", "name": "/usr/share/lintian/overrides/binutils", "type": "file" }, { - "bom-ref": "a796b0817c891cde", + "bom-ref": "8ad1afd0145bdf3e", "name": "/usr/share/lintian/overrides/binutils-common", "type": "file" }, { - "bom-ref": "5763fbe35ac2b066", + "bom-ref": "190775f5ccc4227a", "name": "/usr/share/lintian/overrides/binutils-x86-64-linux-gnu", "type": "file" }, { - "bom-ref": "0cc55bc532a20437", + "bom-ref": "800141afcb0648d7", "name": "/usr/share/lintian/overrides/bsdutils", "type": "file" }, { - "bom-ref": "18f0bcfb557fceec", + "bom-ref": "752b0fc9b616e3e4", "name": "/usr/share/lintian/overrides/cpp-13-x86-64-linux-gnu", "type": "file" }, { - "bom-ref": "4ae518e246d28012", + "bom-ref": "be81a1b31d026c02", "name": "/usr/share/lintian/overrides/cpp-x86-64-linux-gnu", "type": "file" }, { - "bom-ref": "e1545d5d718b818e", + "bom-ref": "10d662f8b03e8830", "name": "/usr/share/lintian/overrides/dash", "type": "file" }, { - "bom-ref": "3348b85b944cc772", + "bom-ref": "137c4d32b6d3981a", + "name": "/usr/share/lintian/overrides/dbus", + "type": "file" + }, + { + "bom-ref": "76a41ce9919cf95d", + "name": "/usr/share/lintian/overrides/dbus-session-bus-common", + "type": "file" + }, + { + "bom-ref": "ecf0f1fbb8081acc", + "name": "/usr/share/lintian/overrides/dbus-system-bus-common", + "type": "file" + }, + { + "bom-ref": "5da6c718a7f87ee0", "name": "/usr/share/lintian/overrides/debconf", "type": "file" }, { - "bom-ref": "f1aa57c2a192a25c", + "bom-ref": "867dbf64ab56d9e6", "name": "/usr/share/lintian/overrides/dpkg", "type": "file" }, { - "bom-ref": "a93f946fe6cdf9bc", + "bom-ref": "922ea62fc7283c8a", "name": "/usr/share/lintian/overrides/e2fsprogs", "type": "file" }, { - "bom-ref": "202c102c2f96c5d0", + "bom-ref": "8fc54406fae16a20", "name": "/usr/share/lintian/overrides/ffmpeg", "type": "file" }, { - "bom-ref": "153811035c51a032", + "bom-ref": "50754dfee6874412", "name": "/usr/share/lintian/overrides/g++-13-x86-64-linux-gnu", "type": "file" }, { - "bom-ref": "358aeab3f7646fc0", + "bom-ref": "4f8bf68e9f5bccdc", "name": "/usr/share/lintian/overrides/gcc-13-x86-64-linux-gnu", "type": "file" }, { - "bom-ref": "97c48d5435fa4979", + "bom-ref": "d62cd48ee3b3af99", "name": "/usr/share/lintian/overrides/git", "type": "file" }, { - "bom-ref": "2270fc37e3ed0436", + "bom-ref": "4605897c7b8809f2", "name": "/usr/share/lintian/overrides/ibverbs-providers", "type": "file" }, { - "bom-ref": "cf71d8ce4b368867", + "bom-ref": "2c4e93dba95196ad", "name": "/usr/share/lintian/overrides/libacl1", "type": "file" }, { - "bom-ref": "998940dbceeb3993", + "bom-ref": "9bce1e3b613e489d", "name": "/usr/share/lintian/overrides/libapt-pkg6.0t64", "type": "file" }, { - "bom-ref": "b32911e3a84ca48c", + "bom-ref": "8189229c623df8a4", "name": "/usr/share/lintian/overrides/libasan8", "type": "file" }, { - "bom-ref": "533c7e8cb015a846", + "bom-ref": "692b9af0dcb27fba", "name": "/usr/share/lintian/overrides/libasound2t64", "type": "file" }, { - "bom-ref": "f8e5b380db4caf53", + "bom-ref": "1969c7a67580aae1", "name": "/usr/share/lintian/overrides/libattr1", "type": "file" }, { - "bom-ref": "3b115a16a0660ad7", + "bom-ref": "e417bc67aca579bf", "name": "/usr/share/lintian/overrides/libavcodec60", "type": "file" }, { - "bom-ref": "c18f21b83f70ffb3", + "bom-ref": "359110f2ce4227bf", "name": "/usr/share/lintian/overrides/libavfilter9", "type": "file" }, { - "bom-ref": "27d3cb9490d65372", + "bom-ref": "1ff8b43a6ff271be", "name": "/usr/share/lintian/overrides/libavutil58", "type": "file" }, { - "bom-ref": "510fb301c9314c53", + "bom-ref": "919956c1a271d25b", "name": "/usr/share/lintian/overrides/libbinutils", "type": "file" }, { - "bom-ref": "3035af55e4b7314b", + "bom-ref": "812d61afad7ff2b3", "name": "/usr/share/lintian/overrides/libblas3", "type": "file" }, { - "bom-ref": "7d0171de6d4b38e2", + "bom-ref": "a121d2c449b3ac36", "name": "/usr/share/lintian/overrides/libblkid1", "type": "file" }, { - "bom-ref": "9cf8d1249d7e4ee0", + "bom-ref": "a580bd4d2211d814", "name": "/usr/share/lintian/overrides/libbrotli1", "type": "file" }, { - "bom-ref": "8f25c6552b7a55cb", + "bom-ref": "b8280204e124cb2f", "name": "/usr/share/lintian/overrides/libbsd0", "type": "file" }, { - "bom-ref": "df695e926bad6c90", + "bom-ref": "504e1f223314b0be", "name": "/usr/share/lintian/overrides/libc-bin", "type": "file" }, { - "bom-ref": "a5d7eff32314b673", + "bom-ref": "a862549f0fed97e1", "name": "/usr/share/lintian/overrides/libc6", "type": "file" }, { - "bom-ref": "c919d58bf8bc35a0", + "bom-ref": "d759b61a31e67ff4", "name": "/usr/share/lintian/overrides/libc6-dev", "type": "file" }, { - "bom-ref": "ea4bc1da618d231e", + "bom-ref": "9f1f306a8757695a", "name": "/usr/share/lintian/overrides/libcairo-gobject2", "type": "file" }, { - "bom-ref": "a7abab8486046c5d", + "bom-ref": "e8111ac2729e0123", + "name": "/usr/share/lintian/overrides/libcap2-bin", + "type": "file" + }, + { + "bom-ref": "1d5b1f76fc06b50d", "name": "/usr/share/lintian/overrides/libcdio-cdda2t64", "type": "file" }, { - "bom-ref": "4a94cf7b239f40ae", + "bom-ref": "162065d3620c4446", "name": "/usr/share/lintian/overrides/libcdio-paranoia2t64", "type": "file" }, { - "bom-ref": "1912b9efe1f44f6b", + "bom-ref": "5e9fd8d038a25543", "name": "/usr/share/lintian/overrides/libcdio19t64", "type": "file" }, { - "bom-ref": "ba736c9d8c289544", + "bom-ref": "47959d6304992af2", "name": "/usr/share/lintian/overrides/libcryptsetup12", "type": "file" }, { - "bom-ref": "0efb69402ffc84ec", + "bom-ref": "5c56c5e160c16f14", "name": "/usr/share/lintian/overrides/libcurl3t64-gnutls", "type": "file" }, { - "bom-ref": "baa722b0d43e7836", + "bom-ref": "b8497710c21251d6", "name": "/usr/share/lintian/overrides/libcurl4t64", "type": "file" }, { - "bom-ref": "4b6a45d25db7d956", + "bom-ref": "ffd6e9731a0b7924", "name": "/usr/share/lintian/overrides/libdb5.3t64", "type": "file" }, { - "bom-ref": "c04c3d6d08dbb67b", + "bom-ref": "93c012e67d589c1b", "name": "/usr/share/lintian/overrides/libedit2", "type": "file" }, { - "bom-ref": "e2f70173f6584a21", + "bom-ref": "ebb5f706abc37d6f", "name": "/usr/share/lintian/overrides/libext2fs2t64", "type": "file" }, { - "bom-ref": "a86d492e538ed991", + "bom-ref": "7b399003cb1a537b", "name": "/usr/share/lintian/overrides/libfdisk1", "type": "file" }, { - "bom-ref": "37dd756c5cd0db3b", + "bom-ref": "981bd325261c283f", "name": "/usr/share/lintian/overrides/libflac12t64", "type": "file" }, { - "bom-ref": "9ce6e42d627c2331", + "bom-ref": "ec3596a8cca31c15", "name": "/usr/share/lintian/overrides/libflite1", "type": "file" }, { - "bom-ref": "8d350b50dc6216b2", + "bom-ref": "59b3b1301cf3ce0a", "name": "/usr/share/lintian/overrides/libgbm1", "type": "file" }, { - "bom-ref": "08eed8e53063c6f3", + "bom-ref": "7238577b0dd246ad", "name": "/usr/share/lintian/overrides/libgcc-s1", "type": "file" }, { - "bom-ref": "11bbcc66ce8910dc", + "bom-ref": "c9d5161a2d055fc0", "name": "/usr/share/lintian/overrides/libgdbm-compat4t64", "type": "file" }, { - "bom-ref": "abc0a866d047e6d8", + "bom-ref": "256e690d77ed0640", "name": "/usr/share/lintian/overrides/libgdbm6t64", "type": "file" }, { - "bom-ref": "2dd45570c9411918", + "bom-ref": "e3e9f497e4d7e0c5", + "name": "/usr/share/lintian/overrides/libgirepository-1.0-1", + "type": "file" + }, + { + "bom-ref": "75eeaac2a2af4378", "name": "/usr/share/lintian/overrides/libglib2.0-0t64", "type": "file" }, { - "bom-ref": "a1e073cfece908f7", + "bom-ref": "664d4714798bc91e", + "name": "/usr/share/lintian/overrides/libglib2.0-bin", + "type": "file" + }, + { + "bom-ref": "ba3ccdd0dd411123", "name": "/usr/share/lintian/overrides/libglvnd0", "type": "file" }, { - "bom-ref": "878a093ba543cfab", + "bom-ref": "0441c11f07e905ad", "name": "/usr/share/lintian/overrides/libgnutls30t64", "type": "file" }, { - "bom-ref": "037fdfd15852fb53", + "bom-ref": "44dec36901cbd067", "name": "/usr/share/lintian/overrides/libgssapi-krb5-2", "type": "file" }, { - "bom-ref": "2d442a20b4e21913", + "bom-ref": "eebc159f9f3dbce5", + "name": "/usr/share/lintian/overrides/libgstreamer1.0-0", + "type": "file" + }, + { + "bom-ref": "d0c197b570c2e945", "name": "/usr/share/lintian/overrides/libhogweed6t64", "type": "file" }, { - "bom-ref": "528b883853ffc108", + "bom-ref": "36365bb74a2718d8", "name": "/usr/share/lintian/overrides/libhwasan0", "type": "file" }, { - "bom-ref": "253e59e501a77ba3", + "bom-ref": "83ebac68615cbfd7", "name": "/usr/share/lintian/overrides/libhwy1t64", "type": "file" }, { - "bom-ref": "8522eeec1b88fc9c", + "bom-ref": "332ae3da19f256f0", "name": "/usr/share/lintian/overrides/libicu74", "type": "file" }, { - "bom-ref": "35302c36e4086ae7", + "bom-ref": "f2644a92e8b9efad", "name": "/usr/share/lintian/overrides/libidn2-0", "type": "file" }, { - "bom-ref": "198c4d2ab499fc1c", + "bom-ref": "97c214978a076400", "name": "/usr/share/lintian/overrides/libjack-jackd2-0", "type": "file" }, { - "bom-ref": "16b22118aa5b0e7b", + "bom-ref": "50cf3a8084808cb3", "name": "/usr/share/lintian/overrides/libjpeg-turbo8", "type": "file" }, { - "bom-ref": "69298edc3e905e6e", + "bom-ref": "b4b072f3b7bbba22", "name": "/usr/share/lintian/overrides/libkrb5-3", "type": "file" }, { - "bom-ref": "22c535097044a565", + "bom-ref": "2f6c8fbe9de84b71", "name": "/usr/share/lintian/overrides/libkrb5support0", "type": "file" }, { - "bom-ref": "21e002bfbfc6558f", + "bom-ref": "f0bcf39a63ff0ebb", "name": "/usr/share/lintian/overrides/liblapack3", "type": "file" }, { - "bom-ref": "46c97dff08d1de69", + "bom-ref": "7aacd91ac2c262e1", "name": "/usr/share/lintian/overrides/libllvm20", "type": "file" }, { - "bom-ref": "7386893d84da0af5", + "bom-ref": "844c28accbea6d35", "name": "/usr/share/lintian/overrides/liblsan0", "type": "file" }, { - "bom-ref": "7bc31c0a1df2520a", + "bom-ref": "f349d653561443de", "name": "/usr/share/lintian/overrides/libmbedcrypto7t64", "type": "file" }, { - "bom-ref": "3ddc14bdcf444cef", + "bom-ref": "067e49aec19e87f9", + "name": "/usr/share/lintian/overrides/libmetee-dev", + "type": "file" + }, + { + "bom-ref": "a8670bda521fa553", "name": "/usr/share/lintian/overrides/libmount1", "type": "file" }, { - "bom-ref": "4a0d96935f12e5fd", + "bom-ref": "8d53d6dd5e8972e5", "name": "/usr/share/lintian/overrides/libmpg123-0t64", "type": "file" }, { - "bom-ref": "44b5f814463bee55", + "bom-ref": "d844a2180ef225c3", "name": "/usr/share/lintian/overrides/libnettle8t64", "type": "file" }, { - "bom-ref": "f5b17b460e6418d4", + "bom-ref": "7579d52fddb2afd4", "name": "/usr/share/lintian/overrides/libnorm1t64", "type": "file" }, { - "bom-ref": "41b9ed0cfee95b94", + "bom-ref": "b9bc85727216b4fa", "name": "/usr/share/lintian/overrides/libnpth0t64", "type": "file" }, { - "bom-ref": "6274d2ff360ef3f7", + "bom-ref": "e2e0f5a2d94ec4ab", "name": "/usr/share/lintian/overrides/libopenmpt0t64", "type": "file" }, { - "bom-ref": "02494b3d4f330438", + "bom-ref": "3c56a1ca218668a6", "name": "/usr/share/lintian/overrides/libpam-modules", "type": "file" }, { - "bom-ref": "afa0899818da14b2", + "bom-ref": "f7a3ea765f31f440", "name": "/usr/share/lintian/overrides/libpam-modules-bin", "type": "file" }, { - "bom-ref": "c4c8666f6f9c517e", + "bom-ref": "bd83eb80ca901378", "name": "/usr/share/lintian/overrides/libpam-runtime", "type": "file" }, { - "bom-ref": "1037ed42612e1c76", + "bom-ref": "2954135703783add", + "name": "/usr/share/lintian/overrides/libpam-systemd", + "type": "file" + }, + { + "bom-ref": "3fc2184f7a1cf4dc", "name": "/usr/share/lintian/overrides/libpam0g", "type": "file" }, { - "bom-ref": "bddaea7328b35b84", + "bom-ref": "3ece5569ecae90c0", "name": "/usr/share/lintian/overrides/libperl5.38t64", "type": "file" }, { - "bom-ref": "87420342fb61d4ab", + "bom-ref": "e5bc0649dcc82fb7", "name": "/usr/share/lintian/overrides/libpgm-5.3-0t64", "type": "file" }, { - "bom-ref": "d6b5105134b91c41", + "bom-ref": "a6a342184044e385", "name": "/usr/share/lintian/overrides/libpixman-1-0", "type": "file" }, { - "bom-ref": "10af505bf11c878f", + "bom-ref": "5350843a714937f3", "name": "/usr/share/lintian/overrides/libpng16-16t64", "type": "file" }, { - "bom-ref": "1e05dc3bb82c0e6a", + "bom-ref": "15e466153f34e456", "name": "/usr/share/lintian/overrides/libpostproc57", "type": "file" }, { - "bom-ref": "079e5fb7dc789931", + "bom-ref": "233be8d713f56c81", "name": "/usr/share/lintian/overrides/libpsl5t64", "type": "file" }, { - "bom-ref": "2584abc22aa55c68", + "bom-ref": "cd0ea64c05df28b0", "name": "/usr/share/lintian/overrides/libpython3.12-dev", "type": "file" }, { - "bom-ref": "5e5fc2bcd581a981", + "bom-ref": "9b7b4186868b173d", "name": "/usr/share/lintian/overrides/libpython3.12-minimal", "type": "file" }, { - "bom-ref": "722d36e5a04a11ce", + "bom-ref": "50aee1f91e6cf782", "name": "/usr/share/lintian/overrides/libpython3.12-stdlib", "type": "file" }, { - "bom-ref": "1454e1525f06d165", + "bom-ref": "047162e021610409", "name": "/usr/share/lintian/overrides/libpython3.12t64", "type": "file" }, { - "bom-ref": "cd9a10ddf50580c2", + "bom-ref": "f2f6320965141712", "name": "/usr/share/lintian/overrides/librdmacm1t64", "type": "file" }, { - "bom-ref": "bbcd9ce5f6d87807", + "bom-ref": "43cef2ffd2efa6af", "name": "/usr/share/lintian/overrides/librsvg2-2", "type": "file" }, { - "bom-ref": "d1ff0a37ad96857e", + "bom-ref": "8c053c3ea3fc4ec6", "name": "/usr/share/lintian/overrides/libslang2", "type": "file" }, { - "bom-ref": "4a7ed7ddaccbf834", + "bom-ref": "c3d25cc37c0386d8", "name": "/usr/share/lintian/overrides/libsmartcols1", "type": "file" }, { - "bom-ref": "cd9149e0276169f6", + "bom-ref": "3417c09c4bb9b51e", "name": "/usr/share/lintian/overrides/libsphinxbase3t64", "type": "file" }, { - "bom-ref": "278967b48a3fad22", + "bom-ref": "f42b483d958db89a", "name": "/usr/share/lintian/overrides/libsrt1.5-gnutls", "type": "file" }, { - "bom-ref": "a180989bf73d2ef5", + "bom-ref": "f980ac7b0195b8e1", "name": "/usr/share/lintian/overrides/libssh-4", "type": "file" }, { - "bom-ref": "cff0472f8cdec985", + "bom-ref": "af9c5bd3b5bb009d", "name": "/usr/share/lintian/overrides/libssh-gcrypt-4", "type": "file" }, { - "bom-ref": "d7e72b7d43ae146c", + "bom-ref": "5b9cf2719fd39f5c", "name": "/usr/share/lintian/overrides/libssl3t64", "type": "file" }, { - "bom-ref": "ff773fd2e248fb94", + "bom-ref": "17fe39f00205a7f8", "name": "/usr/share/lintian/overrides/libswresample4", "type": "file" }, { - "bom-ref": "8af0055460407500", + "bom-ref": "58dcb341eac77ad0", "name": "/usr/share/lintian/overrides/libswscale7", "type": "file" }, { - "bom-ref": "b136d5b2ad7a9fa0", + "bom-ref": "771af6c96975018a", "name": "/usr/share/lintian/overrides/libsystemd-shared", "type": "file" }, { - "bom-ref": "cc0a53dbf673fc10", + "bom-ref": "5c22f8222f6d8730", "name": "/usr/share/lintian/overrides/libtsan2", "type": "file" }, { - "bom-ref": "a416cd137a5077e0", + "bom-ref": "e8d21e92c965053c", "name": "/usr/share/lintian/overrides/libubsan1", "type": "file" }, { - "bom-ref": "cf6c610fae365d3a", + "bom-ref": "001fe935944a1bc6", "name": "/usr/share/lintian/overrides/libvorbis0a", "type": "file" }, { - "bom-ref": "7c85b1f57ea936db", + "bom-ref": "f3effc96aac80853", "name": "/usr/share/lintian/overrides/libx11-6", "type": "file" }, { - "bom-ref": "96fbb324492c8caa", + "bom-ref": "af48589c7639e422", "name": "/usr/share/lintian/overrides/libxml2", "type": "file" }, { - "bom-ref": "39213be4f5e34d47", + "bom-ref": "46907520904d6d47", "name": "/usr/share/lintian/overrides/libzvbi0t64", "type": "file" }, { - "bom-ref": "adfd6ad6a35fc03c", + "bom-ref": "fedca955aa023c0a", "name": "/usr/share/lintian/overrides/login", "type": "file" }, { - "bom-ref": "fa6ef51ce6ff23d5", + "bom-ref": "db74bfacdf9a9a89", "name": "/usr/share/lintian/overrides/mesa-libgallium", "type": "file" }, { - "bom-ref": "ea397aca027604a5", + "bom-ref": "48f3edde93ab41d1", "name": "/usr/share/lintian/overrides/mount", "type": "file" }, { - "bom-ref": "08b1104bf40ccc60", + "bom-ref": "eb19dfcb511a737e", "name": "/usr/share/lintian/overrides/ncurses-base", "type": "file" }, { - "bom-ref": "1b14fbe4977cd425", + "bom-ref": "4126b8f19a289a35", "name": "/usr/share/lintian/overrides/ocl-icd-libopencl1", "type": "file" }, { - "bom-ref": "df0939fdb05995ba", + "bom-ref": "293bacf3f8788dca", "name": "/usr/share/lintian/overrides/openssl", "type": "file" }, { - "bom-ref": "a4f0251f7f5963a9", + "bom-ref": "f04a7bfb9b7212ea", + "name": "/usr/share/lintian/overrides/packagekit", + "type": "file" + }, + { + "bom-ref": "1e6460dd7512bcab", "name": "/usr/share/lintian/overrides/passwd", "type": "file" }, { - "bom-ref": "dc6871a7659de604", + "bom-ref": "20139f1241491cb4", "name": "/usr/share/lintian/overrides/perl", "type": "file" }, { - "bom-ref": "5bda1ad6ea799e1a", + "bom-ref": "48e90b0439037be4", "name": "/usr/share/lintian/overrides/perl-base", "type": "file" }, { - "bom-ref": "cfd433e5e7fdf3a2", + "bom-ref": "2939aa92887e13be", + "name": "/usr/share/lintian/overrides/polkitd", + "type": "file" + }, + { + "bom-ref": "c0ff043f70e7366c", "name": "/usr/share/lintian/overrides/procps", "type": "file" }, { - "bom-ref": "d7c8054a40c2ee27", + "bom-ref": "f4ea451d28029ebf", "name": "/usr/share/lintian/overrides/python3", "type": "file" }, { - "bom-ref": "29f9e9735aef0dbf", + "bom-ref": "523fcd8218f1c0e8", + "name": "/usr/share/lintian/overrides/python3-apt", + "type": "file" + }, + { + "bom-ref": "6301feec82ad8aed", + "name": "/usr/share/lintian/overrides/python3-dbus", + "type": "file" + }, + { + "bom-ref": "c91b03c1684123ef", "name": "/usr/share/lintian/overrides/python3-pip", "type": "file" }, { - "bom-ref": "06d3a0d2d1ab1f89", + "bom-ref": "0064b44193de4fb5", "name": "/usr/share/lintian/overrides/python3.12", "type": "file" }, { - "bom-ref": "148a690746e1507f", + "bom-ref": "abb633858219a48b", "name": "/usr/share/lintian/overrides/python3.12-minimal", "type": "file" }, { - "bom-ref": "a977c29df6680b49", + "bom-ref": "75ed558a4553fbe9", "name": "/usr/share/lintian/overrides/rdma-core", "type": "file" }, { - "bom-ref": "3d7a04a0de09e699", + "bom-ref": "54b9ebf74496313d", "name": "/usr/share/lintian/overrides/readline-common", "type": "file" }, { - "bom-ref": "d3dcab8ccfaad447", + "bom-ref": "45666dfc35c23988", + "name": "/usr/share/lintian/overrides/sgml-base", + "type": "file" + }, + { + "bom-ref": "3a29ec0bf023f215", "name": "/usr/share/lintian/overrides/systemd", "type": "file" }, { - "bom-ref": "d473144a57f98eea", + "bom-ref": "33a08677135b2f5a", "name": "/usr/share/lintian/overrides/tzdata", "type": "file" }, { - "bom-ref": "675f1566a7bbf243", + "bom-ref": "f2ed26b315a1d03b", "name": "/usr/share/lintian/overrides/udev", "type": "file" }, { - "bom-ref": "b013976bfd105e8b", + "bom-ref": "eafe8fb858570d6f", "name": "/usr/share/lintian/overrides/util-linux", "type": "file" }, { - "bom-ref": "9f0aa8610241a0a5", + "bom-ref": "34b8b9ba9538b31d", "name": "/usr/share/lintian/overrides/vim", "type": "file" }, { - "bom-ref": "133e98654f179a56", + "bom-ref": "7618a7d05e7cc0b6", "name": "/usr/share/lintian/overrides/vim-common", "type": "file" }, { - "bom-ref": "8351d67c958ce210", + "bom-ref": "9bb3f260e57630d4", "name": "/usr/share/lintian/overrides/vim-runtime", "type": "file" }, { - "bom-ref": "8776f058f1e13b9a", + "bom-ref": "5be4d34ee6b3ab86", "name": "/usr/share/lintian/overrides/x11-common", "type": "file" }, { - "bom-ref": "333d7d1bbb66c3f9", + "bom-ref": "81cb682e1cb30897", + "name": "/usr/share/lintian/overrides/xml-core", + "type": "file" + }, + { + "bom-ref": "1dc067008c052a6f", "name": "/usr/share/lintian/profiles/dpkg/main.profile", "type": "file" }, { - "bom-ref": "153576c012e5df4d", + "bom-ref": "0eebb9a1de6ed391", "name": "/usr/share/lto-disabled-list/lto-disabled-list", "type": "file" }, { - "bom-ref": "6c0fe7ee1f40f44a", + "bom-ref": "326944c89d8732e8", "name": "/usr/share/menu/bash", "type": "file" }, { - "bom-ref": "f807bd984413cedb", + "bom-ref": "c0dbc3ea74d82761", "name": "/usr/share/menu/dash", "type": "file" }, { - "bom-ref": "c2a65d070b7bab1c", + "bom-ref": "752d39b0ad319e8c", + "name": "/usr/share/metainfo/org.freedesktop.packagekit.metainfo.xml", + "type": "file" + }, + { + "bom-ref": "c8d80dc84e14bd2c", "name": "/usr/share/mime/packages/freedesktop.org.xml", "type": "file" }, { - "bom-ref": "cae991443a67f37b", + "bom-ref": "583c4e24bec841d1", "name": "/usr/share/motd", "type": "file" }, { - "bom-ref": "a52a0f7270dab225", + "bom-ref": "268a2672a45a4da7", "name": "/usr/share/networks", "type": "file" }, { - "bom-ref": "398f6ce0e5bffb8f", + "bom-ref": "381cfbe67e25e08b", "name": "/usr/share/openal/alsoftrc.sample", "type": "file" }, { - "bom-ref": "88d1587932b0f57c", + "bom-ref": "f67719ee1d4e84d8", "name": "/usr/share/openal/hrtf/Default HRTF.mhr", "type": "file" }, { - "bom-ref": "d8a70eae02652d70", + "bom-ref": "7be27131f08ae89c", "name": "/usr/share/openal/presets/3D7.1.ambdec", "type": "file" }, { - "bom-ref": "25e9f7e27c3cc821", + "bom-ref": "84d5c8f1aaca33c1", "name": "/usr/share/openal/presets/hex-quad.ambdec", "type": "file" }, { - "bom-ref": "52e9a5b6198601de", + "bom-ref": "6b9dc1fbec8dc8ca", "name": "/usr/share/openal/presets/hexagon.ambdec", "type": "file" }, { - "bom-ref": "09113550c5ed097a", + "bom-ref": "710b4cd276b5cd86", "name": "/usr/share/openal/presets/itu5.1-nocenter.ambdec", "type": "file" }, { - "bom-ref": "b3d3efca53f7012d", + "bom-ref": "47dac012b814f239", "name": "/usr/share/openal/presets/itu5.1.ambdec", "type": "file" }, { - "bom-ref": "e067610ddcf88d40", + "bom-ref": "a192c47a86e87604", "name": "/usr/share/openal/presets/presets.txt", "type": "file" }, { - "bom-ref": "39a47ceb354048d4", + "bom-ref": "2511cfd7646f5420", "name": "/usr/share/openal/presets/rectangle.ambdec", "type": "file" }, { - "bom-ref": "580c19913dbce611", + "bom-ref": "e1d4bd83b5a5d339", "name": "/usr/share/openal/presets/square.ambdec", "type": "file" }, { - "bom-ref": "ba61e2b46b15c06c", + "bom-ref": "a60c76a8cb62476a", "name": "/usr/share/pam-configs/mkhomedir", "type": "file" }, { - "bom-ref": "d40d77c08bc44866", + "bom-ref": "6af1fe3c0e441033", + "name": "/usr/share/pam-configs/systemd", + "type": "file" + }, + { + "bom-ref": "5fce63066528791c", "name": "/usr/share/pam-configs/unix", "type": "file" }, { - "bom-ref": "50ead9f7a8eb3b57", + "bom-ref": "e46b64093ce7fc25", "name": "/usr/share/pam/common-account", "type": "file" }, { - "bom-ref": "77f0d425636f94a0", + "bom-ref": "579ed002f9460b4e", "name": "/usr/share/pam/common-account.md5sums", "type": "file" }, { - "bom-ref": "134c7db5190dabe5", + "bom-ref": "de618ae873f3675b", "name": "/usr/share/pam/common-auth", "type": "file" }, { - "bom-ref": "65bf43dbc4e2cbca", + "bom-ref": "417a7b6c77cc5cec", "name": "/usr/share/pam/common-auth.md5sums", "type": "file" }, { - "bom-ref": "3ade956bd6939fa3", + "bom-ref": "8a54a3ae06c79f39", "name": "/usr/share/pam/common-password", "type": "file" }, { - "bom-ref": "86dc44363c8683f1", + "bom-ref": "232ff4a218136463", "name": "/usr/share/pam/common-password.md5sums", "type": "file" }, { - "bom-ref": "f2c0e36dad2d8b53", + "bom-ref": "2bc496d1d0703431", "name": "/usr/share/pam/common-session", "type": "file" }, { - "bom-ref": "bca93c9765b3a9da", + "bom-ref": "004068442c0ff3ac", "name": "/usr/share/pam/common-session-noninteractive", "type": "file" }, { - "bom-ref": "43dc67a410cea9b6", + "bom-ref": "270070d6fd84d864", "name": "/usr/share/pam/common-session-noninteractive.md5sums", "type": "file" }, { - "bom-ref": "ba863345b054293f", + "bom-ref": "2191c00291d49b81", "name": "/usr/share/pam/common-session.md5sums", "type": "file" }, { - "bom-ref": "f6ec6c5575e3fe07", + "bom-ref": "6658b2669b60f627", "name": "/usr/share/perl/5.38.2/AnyDBM_File.pm", "type": "file" }, { - "bom-ref": "76de1ab399290a5d", + "bom-ref": "f0cb80ca4834533d", "name": "/usr/share/perl/5.38.2/App/Cpan.pm", "type": "file" }, { - "bom-ref": "ab4e2d840f33f264", + "bom-ref": "9a00c08378c0b4fc", "name": "/usr/share/perl/5.38.2/App/Prove.pm", "type": "file" }, { - "bom-ref": "350fb99c0fa35d5f", + "bom-ref": "e9cd49fe342691d7", "name": "/usr/share/perl/5.38.2/App/Prove/State.pm", "type": "file" }, { - "bom-ref": "3675b047fc3cc9e4", + "bom-ref": "62f55091b05f6788", "name": "/usr/share/perl/5.38.2/App/Prove/State/Result.pm", "type": "file" }, { - "bom-ref": "ffecffe715df145e", + "bom-ref": "93a92ff1a2743b26", "name": "/usr/share/perl/5.38.2/App/Prove/State/Result/Test.pm", "type": "file" }, { - "bom-ref": "90669cbec8075781", + "bom-ref": "ca836c9b7cd3f3b9", "name": "/usr/share/perl/5.38.2/Archive/Tar.pm", "type": "file" }, { - "bom-ref": "d848282d4b9b0b2e", + "bom-ref": "5ac0e3156679ec7e", "name": "/usr/share/perl/5.38.2/Archive/Tar/Constant.pm", "type": "file" }, { - "bom-ref": "d644e0c3008a826b", + "bom-ref": "93f382c4d418cf07", "name": "/usr/share/perl/5.38.2/Archive/Tar/File.pm", "type": "file" }, { - "bom-ref": "319dce975f35e431", + "bom-ref": "62fb2919d0f11c8d", "name": "/usr/share/perl/5.38.2/Attribute/Handlers.pm", "type": "file" }, { - "bom-ref": "523ce4067f852969", + "bom-ref": "cb1c0000c705573d", "name": "/usr/share/perl/5.38.2/AutoLoader.pm", "type": "file" }, { - "bom-ref": "6fde41cf154f58c9", + "bom-ref": "56c0d4e849371b59", "name": "/usr/share/perl/5.38.2/AutoSplit.pm", "type": "file" }, { - "bom-ref": "a324edcdc91836f1", + "bom-ref": "d25b96041e5031f1", "name": "/usr/share/perl/5.38.2/B/Deparse.pm", "type": "file" }, { - "bom-ref": "66387483a00cf56a", + "bom-ref": "5ab3fe600d230556", "name": "/usr/share/perl/5.38.2/B/Op_private.pm", "type": "file" }, { - "bom-ref": "b120b07505fc1b59", + "bom-ref": "cbfeab83add03cc5", "name": "/usr/share/perl/5.38.2/Benchmark.pm", "type": "file" }, { - "bom-ref": "b1c7eefc7cd29cc8", + "bom-ref": "60ca486ab5af3d14", "name": "/usr/share/perl/5.38.2/CORE.pod", "type": "file" }, { - "bom-ref": "93ddad9965498cb5", + "bom-ref": "c1f7850d86988d11", "name": "/usr/share/perl/5.38.2/CPAN.pm", "type": "file" }, { - "bom-ref": "6c6eb1ca9f6bd68c", + "bom-ref": "4e34f968ab25fab4", "name": "/usr/share/perl/5.38.2/CPAN/API/HOWTO.pod", "type": "file" }, { - "bom-ref": "df19e3940ca10e7a", + "bom-ref": "b094351fa61a6956", "name": "/usr/share/perl/5.38.2/CPAN/Author.pm", "type": "file" }, { - "bom-ref": "4c4920ff16e239d7", + "bom-ref": "35e91e6a3a0bbec3", "name": "/usr/share/perl/5.38.2/CPAN/Bundle.pm", "type": "file" }, { - "bom-ref": "fd879ecf994d8f37", + "bom-ref": "806fb39d7fdc19db", "name": "/usr/share/perl/5.38.2/CPAN/CacheMgr.pm", "type": "file" }, { - "bom-ref": "b7360b1f5907c748", + "bom-ref": "3118e01e55d7321c", "name": "/usr/share/perl/5.38.2/CPAN/Complete.pm", "type": "file" }, { - "bom-ref": "12a130e95be4c49a", + "bom-ref": "eaf548a618d612b2", "name": "/usr/share/perl/5.38.2/CPAN/Debug.pm", "type": "file" }, { - "bom-ref": "357bdddcc139385f", + "bom-ref": "6d5694fa39eedf3b", "name": "/usr/share/perl/5.38.2/CPAN/DeferredCode.pm", "type": "file" }, { - "bom-ref": "21024b68de60dcca", + "bom-ref": "cbfc345260e8b97a", "name": "/usr/share/perl/5.38.2/CPAN/Distribution.pm", "type": "file" }, { - "bom-ref": "a5ccfadf123b6746", + "bom-ref": "bf555179f9c62c66", "name": "/usr/share/perl/5.38.2/CPAN/Distroprefs.pm", "type": "file" }, { - "bom-ref": "416385910d516912", + "bom-ref": "e994706ff6bba0a6", "name": "/usr/share/perl/5.38.2/CPAN/Distrostatus.pm", "type": "file" }, { - "bom-ref": "60b5291e7b0b3b0f", + "bom-ref": "a0091281fa7a2fb7", "name": "/usr/share/perl/5.38.2/CPAN/Exception/RecursiveDependency.pm", "type": "file" }, { - "bom-ref": "f9ecefdac98d35f6", + "bom-ref": "1d0f28489e805ae2", "name": "/usr/share/perl/5.38.2/CPAN/Exception/blocked_urllist.pm", "type": "file" }, { - "bom-ref": "e81cb8288986fcb9", + "bom-ref": "6eb9fd0700206ca5", "name": "/usr/share/perl/5.38.2/CPAN/Exception/yaml_not_installed.pm", "type": "file" }, { - "bom-ref": "158193085641eb6a", + "bom-ref": "d1d99d9b540c2352", "name": "/usr/share/perl/5.38.2/CPAN/Exception/yaml_process_error.pm", "type": "file" }, { - "bom-ref": "bb85e9491477854f", + "bom-ref": "891ce25605ab806f", "name": "/usr/share/perl/5.38.2/CPAN/FTP.pm", "type": "file" }, { - "bom-ref": "2f6b2fe03d2a6885", + "bom-ref": "55bb53a4db7714d1", "name": "/usr/share/perl/5.38.2/CPAN/FTP/netrc.pm", "type": "file" }, { - "bom-ref": "8a60d15c248189dc", + "bom-ref": "5d9c21d2429a4f50", "name": "/usr/share/perl/5.38.2/CPAN/FirstTime.pm", "type": "file" }, { - "bom-ref": "cfa50400950ad75e", + "bom-ref": "da16e47c9faa10f2", "name": "/usr/share/perl/5.38.2/CPAN/HTTP/Client.pm", "type": "file" }, { - "bom-ref": "1595282bac4d75da", + "bom-ref": "7bdf2c3453af8372", "name": "/usr/share/perl/5.38.2/CPAN/HTTP/Credentials.pm", "type": "file" }, { - "bom-ref": "4b2ff6d6623280f2", + "bom-ref": "4ede80811bbcf73e", "name": "/usr/share/perl/5.38.2/CPAN/HandleConfig.pm", "type": "file" }, { - "bom-ref": "5b44c0bf298260c5", + "bom-ref": "c2ff4883b704d2d9", "name": "/usr/share/perl/5.38.2/CPAN/Index.pm", "type": "file" }, { - "bom-ref": "c4dffbffb8be3da3", + "bom-ref": "89a287a84cc0602f", "name": "/usr/share/perl/5.38.2/CPAN/InfoObj.pm", "type": "file" }, { - "bom-ref": "e58dbbd2b8a2b014", + "bom-ref": "e5724cf7f424e47c", "name": "/usr/share/perl/5.38.2/CPAN/Kwalify.pm", "type": "file" }, { - "bom-ref": "7a3456e018cd059b", + "bom-ref": "bd6e4820041ffc8b", "name": "/usr/share/perl/5.38.2/CPAN/Kwalify/distroprefs.dd", "type": "file" }, { - "bom-ref": "a68410a0fd857954", + "bom-ref": "03d4c1c11ed18ebc", "name": "/usr/share/perl/5.38.2/CPAN/Kwalify/distroprefs.yml", "type": "file" }, { - "bom-ref": "583cc01b752f3caa", + "bom-ref": "81cacaf6ff255f4a", "name": "/usr/share/perl/5.38.2/CPAN/LWP/UserAgent.pm", "type": "file" }, { - "bom-ref": "8cbc3c18c3a22115", + "bom-ref": "e54c847e259996e1", "name": "/usr/share/perl/5.38.2/CPAN/Meta.pm", "type": "file" }, { - "bom-ref": "9546cf2b5614a7d5", + "bom-ref": "1e21501d932ec4d9", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Converter.pm", "type": "file" }, { - "bom-ref": "265ddaf8ef14ddbb", + "bom-ref": "385ce006afec7bef", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Feature.pm", "type": "file" }, { - "bom-ref": "d153436a26449f47", + "bom-ref": "d5639cb0163a978f", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History.pm", "type": "file" }, { - "bom-ref": "38712e081b1c8518", + "bom-ref": "47b8e9aa8eeb2584", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History/Meta_1_0.pod", "type": "file" }, { - "bom-ref": "3cf616a922426fb4", + "bom-ref": "4eb62b9367ea64f4", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History/Meta_1_1.pod", "type": "file" }, { - "bom-ref": "cc99372c00f06bc7", + "bom-ref": "25b36fc374d37e7f", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History/Meta_1_2.pod", "type": "file" }, { - "bom-ref": "df2354ae1cc4a1f3", + "bom-ref": "76e482660ae1846f", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History/Meta_1_3.pod", "type": "file" }, { - "bom-ref": "60336d29e4c5fb95", + "bom-ref": "cf172613f26f7d41", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History/Meta_1_4.pod", "type": "file" }, { - "bom-ref": "8e823ad83373879f", + "bom-ref": "a9f66a35e84c635f", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Merge.pm", "type": "file" }, { - "bom-ref": "2308ae27e26a6177", + "bom-ref": "07037a10a96e997b", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Prereqs.pm", "type": "file" }, { - "bom-ref": "d67d7d763d5e6400", + "bom-ref": "0116fbddcca58b28", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Requirements.pm", "type": "file" }, { - "bom-ref": "58cf3dfc84905fce", + "bom-ref": "938e747b9dab6306", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Spec.pm", "type": "file" }, { - "bom-ref": "16408a9d124038ec", + "bom-ref": "8b4926ce0880d44c", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Validator.pm", "type": "file" }, { - "bom-ref": "0d6458d9659ba23e", + "bom-ref": "7e7b57c14aad389a", "name": "/usr/share/perl/5.38.2/CPAN/Meta/YAML.pm", "type": "file" }, { - "bom-ref": "095b1ccbe5e87bd2", + "bom-ref": "12f75fafc7b24a2e", "name": "/usr/share/perl/5.38.2/CPAN/Mirrors.pm", "type": "file" }, { - "bom-ref": "696c8f8d86e02680", + "bom-ref": "062ce1f4a62e080c", "name": "/usr/share/perl/5.38.2/CPAN/Module.pm", "type": "file" }, { - "bom-ref": "749dac7f06730e36", + "bom-ref": "030e907705ff6686", "name": "/usr/share/perl/5.38.2/CPAN/Nox.pm", "type": "file" }, { - "bom-ref": "7a86ac80013927c2", + "bom-ref": "aef00049382c1702", "name": "/usr/share/perl/5.38.2/CPAN/Plugin.pm", "type": "file" }, { - "bom-ref": "6a51d05e1932c990", + "bom-ref": "68ca046c53c34c20", "name": "/usr/share/perl/5.38.2/CPAN/Plugin/Specfile.pm", "type": "file" }, { - "bom-ref": "e3ce6d653d1b16ff", + "bom-ref": "490d7896840d10f7", "name": "/usr/share/perl/5.38.2/CPAN/Prompt.pm", "type": "file" }, { - "bom-ref": "554d4c820a2ea7d0", + "bom-ref": "b8d9631df3bfa964", "name": "/usr/share/perl/5.38.2/CPAN/Queue.pm", "type": "file" }, { - "bom-ref": "2ec5b756d0025f8c", + "bom-ref": "f6da30fc1d6055a8", "name": "/usr/share/perl/5.38.2/CPAN/Shell.pm", "type": "file" }, { - "bom-ref": "8e62332e51ca5f58", + "bom-ref": "c63d34f4840e1e20", "name": "/usr/share/perl/5.38.2/CPAN/Tarzip.pm", "type": "file" }, { - "bom-ref": "b7da2933a705aa03", + "bom-ref": "54dc45cf0d457e37", "name": "/usr/share/perl/5.38.2/CPAN/URL.pm", "type": "file" }, { - "bom-ref": "555491197f8b0d07", + "bom-ref": "c004b452e35a7b63", "name": "/usr/share/perl/5.38.2/CPAN/Version.pm", "type": "file" }, { - "bom-ref": "a640060802cd795a", + "bom-ref": "6e41bbf78a4996f6", "name": "/usr/share/perl/5.38.2/Carp.pm", "type": "file" }, { - "bom-ref": "2d5d4bced2d329a8", + "bom-ref": "5f98920975a98644", "name": "/usr/share/perl/5.38.2/Carp/Heavy.pm", "type": "file" }, { - "bom-ref": "6ee857326c4bd068", + "bom-ref": "c61b630463193b7c", "name": "/usr/share/perl/5.38.2/Class/Struct.pm", "type": "file" }, { - "bom-ref": "cd04d754e018b8b5", + "bom-ref": "b73327bf9473cf1d", "name": "/usr/share/perl/5.38.2/Compress/Zlib.pm", "type": "file" }, { - "bom-ref": "893a36dc47e6a53b", + "bom-ref": "279e1f1b248d0abf", "name": "/usr/share/perl/5.38.2/Config/Extensions.pm", "type": "file" }, { - "bom-ref": "cd4ffb2a016fd99d", + "bom-ref": "69bda5685206e841", "name": "/usr/share/perl/5.38.2/Config/Perl/V.pm", "type": "file" }, { - "bom-ref": "75f2aa7724db76b0", + "bom-ref": "79277ba35cb58ddc", "name": "/usr/share/perl/5.38.2/DB.pm", "type": "file" }, { - "bom-ref": "a67a41910b2d2896", + "bom-ref": "2ca2c60885589f7a", "name": "/usr/share/perl/5.38.2/DBM_Filter.pm", "type": "file" }, { - "bom-ref": "5775f917c8ce57fe", + "bom-ref": "0c92a3e018d98cd2", "name": "/usr/share/perl/5.38.2/DBM_Filter/compress.pm", "type": "file" }, { - "bom-ref": "d97a8330e7e28a96", + "bom-ref": "07f06c832c79e2ea", "name": "/usr/share/perl/5.38.2/DBM_Filter/encode.pm", "type": "file" }, { - "bom-ref": "84b32ff594c3fdbb", + "bom-ref": "f68da5951524900b", "name": "/usr/share/perl/5.38.2/DBM_Filter/int32.pm", "type": "file" }, { - "bom-ref": "5c6ee35c4c487570", + "bom-ref": "4088dc0e798d9b1c", "name": "/usr/share/perl/5.38.2/DBM_Filter/null.pm", "type": "file" }, { - "bom-ref": "b0c1c8cdc2e8aa94", + "bom-ref": "47d77f65ddd5329c", "name": "/usr/share/perl/5.38.2/DBM_Filter/utf8.pm", "type": "file" }, { - "bom-ref": "5dcaf0e4f67102fb", + "bom-ref": "d8eed47a9e7b94f7", "name": "/usr/share/perl/5.38.2/Devel/SelfStubber.pm", "type": "file" }, { - "bom-ref": "8ee73cdf5bc8e1f0", + "bom-ref": "f1fb7da58217849c", "name": "/usr/share/perl/5.38.2/Digest.pm", "type": "file" }, { - "bom-ref": "8d406ca6b9d2acb6", + "bom-ref": "63d632e4e931ef02", "name": "/usr/share/perl/5.38.2/Digest/base.pm", "type": "file" }, { - "bom-ref": "02196506bd4eecba", + "bom-ref": "4e0fee09f35dfeca", "name": "/usr/share/perl/5.38.2/Digest/file.pm", "type": "file" }, { - "bom-ref": "a074bf5e4f317794", + "bom-ref": "5a78ba33e2157858", "name": "/usr/share/perl/5.38.2/DirHandle.pm", "type": "file" }, { - "bom-ref": "5994d1a1d1b603d3", + "bom-ref": "3721d14cea8f0157", "name": "/usr/share/perl/5.38.2/Dumpvalue.pm", "type": "file" }, { - "bom-ref": "5e8f37d9245bcb89", + "bom-ref": "ba74a207b957704d", "name": "/usr/share/perl/5.38.2/Encode/Changes.e2x", "type": "file" }, { - "bom-ref": "cb54ee81fdb84921", + "bom-ref": "ad9f9a3c83ad54a1", "name": "/usr/share/perl/5.38.2/Encode/ConfigLocal_PM.e2x", "type": "file" }, { - "bom-ref": "131046a11819be21", + "bom-ref": "adc2cb57719941d5", "name": "/usr/share/perl/5.38.2/Encode/Makefile_PL.e2x", "type": "file" }, { - "bom-ref": "c82b96615d85ff17", + "bom-ref": "a83fa22c412f96d3", "name": "/usr/share/perl/5.38.2/Encode/PerlIO.pod", "type": "file" }, { - "bom-ref": "3d4786972c9ed08f", + "bom-ref": "aefaf66836890acb", "name": "/usr/share/perl/5.38.2/Encode/README.e2x", "type": "file" }, { - "bom-ref": "590109e759e4a1f4", + "bom-ref": "e76b3bd611c617f8", "name": "/usr/share/perl/5.38.2/Encode/Supported.pod", "type": "file" }, { - "bom-ref": "e8a422942cb336c5", + "bom-ref": "342e4d6e71b25c05", "name": "/usr/share/perl/5.38.2/Encode/_PM.e2x", "type": "file" }, { - "bom-ref": "c0a0b6c8d6cc3aa7", + "bom-ref": "987775ffafd7179f", "name": "/usr/share/perl/5.38.2/Encode/_T.e2x", "type": "file" }, { - "bom-ref": "1ebd86661f21c607", + "bom-ref": "8613189fd9c07e7b", "name": "/usr/share/perl/5.38.2/Encode/encode.h", "type": "file" }, { - "bom-ref": "cef312092db54372", + "bom-ref": "6d3507a35bed960e", "name": "/usr/share/perl/5.38.2/English.pm", "type": "file" }, { - "bom-ref": "197d8a2c2f2a6a75", + "bom-ref": "ea57e62cffe3faa1", "name": "/usr/share/perl/5.38.2/Env.pm", "type": "file" }, { - "bom-ref": "96a9b4390fdfa558", + "bom-ref": "666f0f0a3098ec18", "name": "/usr/share/perl/5.38.2/Exporter.pm", "type": "file" }, { - "bom-ref": "6376c6d458593754", + "bom-ref": "1df07ba7dc776854", "name": "/usr/share/perl/5.38.2/Exporter/Heavy.pm", "type": "file" }, { - "bom-ref": "48be87f96067c7a3", + "bom-ref": "f8eb24484e1be587", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder.pm", "type": "file" }, { - "bom-ref": "aa18979730aff981", + "bom-ref": "c678b631ad24da95", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Base.pm", "type": "file" }, { - "bom-ref": "ce32dc60c09223b5", + "bom-ref": "d0ddf89944a4ef75", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/Unix.pm", "type": "file" }, { - "bom-ref": "3ae36e61cea6eb9f", + "bom-ref": "89b37a77c776d2b7", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/VMS.pm", "type": "file" }, { - "bom-ref": "4c4c413c77eeed83", + "bom-ref": "4fe917a391d4693b", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/Windows.pm", "type": "file" }, { - "bom-ref": "2546b4bad32eb98f", + "bom-ref": "137f79c475de9b3b", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/Windows/BCC.pm", "type": "file" }, { - "bom-ref": "3f56a408da624ef1", + "bom-ref": "c0c89317429ab799", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/Windows/GCC.pm", "type": "file" }, { - "bom-ref": "0ada7f949f9c9b58", + "bom-ref": "cafba984008e6648", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/Windows/MSVC.pm", "type": "file" }, { - "bom-ref": "cfb3292646972ac2", + "bom-ref": "0953cfd05ba54c92", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/aix.pm", "type": "file" }, { - "bom-ref": "a591d90b2d0beeec", + "bom-ref": "01a481a2d1516c38", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/android.pm", "type": "file" }, { - "bom-ref": "bb7b8ce0b949a20a", + "bom-ref": "496c1fd0032f10d6", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/cygwin.pm", "type": "file" }, { - "bom-ref": "3ad6f4f9e93ce3fd", + "bom-ref": "045f008c6d6388a9", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/darwin.pm", "type": "file" }, { - "bom-ref": "d9fabe7456a703b9", + "bom-ref": "b63c14d86c9239bd", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/dec_osf.pm", "type": "file" }, { - "bom-ref": "36173eb19cdbf066", + "bom-ref": "5d566bd9d3e159da", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/os2.pm", "type": "file" }, { - "bom-ref": "bccadda3fbd18f43", + "bom-ref": "b7dba935baa7a3cf", "name": "/usr/share/perl/5.38.2/ExtUtils/Command.pm", "type": "file" }, { - "bom-ref": "b72dd7d327c5e281", + "bom-ref": "0e46191e4c75b7d1", "name": "/usr/share/perl/5.38.2/ExtUtils/Command/MM.pm", "type": "file" }, { - "bom-ref": "366c2d1b2d59fcd2", + "bom-ref": "84cbcf9de6390846", "name": "/usr/share/perl/5.38.2/ExtUtils/Constant.pm", "type": "file" }, { - "bom-ref": "228c0e7bf5398b57", + "bom-ref": "5b9c5024e4272e47", "name": "/usr/share/perl/5.38.2/ExtUtils/Constant/Base.pm", "type": "file" }, { - "bom-ref": "95ece68f81beb8ec", + "bom-ref": "8040fd7b246a3838", "name": "/usr/share/perl/5.38.2/ExtUtils/Constant/ProxySubs.pm", "type": "file" }, { - "bom-ref": "c053acec0690e110", + "bom-ref": "ff1f5a8cd8ede654", "name": "/usr/share/perl/5.38.2/ExtUtils/Constant/Utils.pm", "type": "file" }, { - "bom-ref": "f2ddb7274189068a", + "bom-ref": "a651fc79dfd370c6", "name": "/usr/share/perl/5.38.2/ExtUtils/Constant/XS.pm", "type": "file" }, { - "bom-ref": "cbd93505de93a58a", + "bom-ref": "651e4b41243726da", "name": "/usr/share/perl/5.38.2/ExtUtils/Embed.pm", "type": "file" }, { - "bom-ref": "61daa5bb96675a03", + "bom-ref": "643efad2a4a1ae53", "name": "/usr/share/perl/5.38.2/ExtUtils/Install.pm", "type": "file" }, { - "bom-ref": "0624cc825e02aa0e", + "bom-ref": "915ef6197448e466", "name": "/usr/share/perl/5.38.2/ExtUtils/Installed.pm", "type": "file" }, { - "bom-ref": "01879b29cd3bb0e9", + "bom-ref": "d568e6cc5b8a8429", "name": "/usr/share/perl/5.38.2/ExtUtils/Liblist.pm", "type": "file" }, { - "bom-ref": "32118a45470ee5ff", + "bom-ref": "73a420129f3e0477", "name": "/usr/share/perl/5.38.2/ExtUtils/Liblist/Kid.pm", "type": "file" }, { - "bom-ref": "a27a6db2b2016b09", + "bom-ref": "f5e873ca440ba849", "name": "/usr/share/perl/5.38.2/ExtUtils/MANIFEST.SKIP", "type": "file" }, { - "bom-ref": "18b23e95fa97b184", + "bom-ref": "9eecbcb764916154", "name": "/usr/share/perl/5.38.2/ExtUtils/MM.pm", "type": "file" }, { - "bom-ref": "9e9958752f5074a0", + "bom-ref": "14aaaccad8c7e4f4", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_AIX.pm", "type": "file" }, { - "bom-ref": "984109bac04688bc", + "bom-ref": "3a4a71b87b12bee8", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Any.pm", "type": "file" }, { - "bom-ref": "e31177f4949bd666", + "bom-ref": "c146d0c3ffee4052", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_BeOS.pm", "type": "file" }, { - "bom-ref": "186fa1b5af4e1e1e", + "bom-ref": "3d6ec0c8c1e6b55a", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Cygwin.pm", "type": "file" }, { - "bom-ref": "33c52c13996845ce", + "bom-ref": "6a8671c3f7b7171a", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_DOS.pm", "type": "file" }, { - "bom-ref": "ec878c258d91aec4", + "bom-ref": "686d3da075b079f0", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Darwin.pm", "type": "file" }, { - "bom-ref": "cf365631696273e5", + "bom-ref": "0743dde42e7daf25", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_MacOS.pm", "type": "file" }, { - "bom-ref": "b0e84ec8c86aa72d", + "bom-ref": "1961ea230d71c6f5", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_NW5.pm", "type": "file" }, { - "bom-ref": "008af00b95c8112f", + "bom-ref": "0c9a85e3118b304b", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_OS2.pm", "type": "file" }, { - "bom-ref": "5d15f49c1e8ded90", + "bom-ref": "911923682c356278", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_OS390.pm", "type": "file" }, { - "bom-ref": "b3ef24e1bbdfbe9b", + "bom-ref": "d9925574f1227433", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_QNX.pm", "type": "file" }, { - "bom-ref": "cad5b58815581ab2", + "bom-ref": "1ec440faecdcfc06", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_UWIN.pm", "type": "file" }, { - "bom-ref": "9cf707f470ce86af", + "bom-ref": "63beed47c26258a3", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Unix.pm", "type": "file" }, { - "bom-ref": "a7bab5d7a70bd674", + "bom-ref": "be7451d0abf9c184", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_VMS.pm", "type": "file" }, { - "bom-ref": "0db55ee849c707fd", + "bom-ref": "ca30a7c718a856bd", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_VOS.pm", "type": "file" }, { - "bom-ref": "39e6366434c5a252", + "bom-ref": "b173777d930f1316", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Win32.pm", "type": "file" }, { - "bom-ref": "7190c6f0c241e7f0", + "bom-ref": "b412ca42e506eb6c", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Win95.pm", "type": "file" }, { - "bom-ref": "e288b3daadc1c7a0", + "bom-ref": "6b4b059105a2de8c", "name": "/usr/share/perl/5.38.2/ExtUtils/MY.pm", "type": "file" }, { - "bom-ref": "7ae7bfdf46dcbe74", + "bom-ref": "ffcd212f553f8214", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker.pm", "type": "file" }, { - "bom-ref": "248fe0fd07eddfae", + "bom-ref": "60cd4dcc5600ee9a", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker/Config.pm", "type": "file" }, { - "bom-ref": "c39eb365bfe225bc", + "bom-ref": "05f5d7af91149048", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker/FAQ.pod", "type": "file" }, { - "bom-ref": "4b40cc8659ea8d83", + "bom-ref": "da5fb8269ed1c11f", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker/Locale.pm", "type": "file" }, { - "bom-ref": "9d1fb61c67935200", + "bom-ref": "ebc01f797d5f4598", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker/Tutorial.pod", "type": "file" }, { - "bom-ref": "27d7c06702fa2cb1", + "bom-ref": "f26ebee4ca1982d9", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker/version.pm", "type": "file" }, { - "bom-ref": "cadd0d96bf6a873e", + "bom-ref": "9dc0830fb0d874d2", "name": "/usr/share/perl/5.38.2/ExtUtils/Manifest.pm", "type": "file" }, { - "bom-ref": "7cc76ac2c3d3efd6", + "bom-ref": "029023d46af96c72", "name": "/usr/share/perl/5.38.2/ExtUtils/Miniperl.pm", "type": "file" }, { - "bom-ref": "a0a8c055a854108a", + "bom-ref": "dbf1136b0a253bb2", "name": "/usr/share/perl/5.38.2/ExtUtils/Mkbootstrap.pm", "type": "file" }, { - "bom-ref": "ef68a495616a7adb", + "bom-ref": "54812b0cfa703a3b", "name": "/usr/share/perl/5.38.2/ExtUtils/Mksymlists.pm", "type": "file" }, { - "bom-ref": "7f9637a46d0b53a9", + "bom-ref": "076cd829c527de1d", "name": "/usr/share/perl/5.38.2/ExtUtils/PL2Bat.pm", "type": "file" }, { - "bom-ref": "70642ae4209ab8d8", + "bom-ref": "d0ae57b103c5e730", "name": "/usr/share/perl/5.38.2/ExtUtils/Packlist.pm", "type": "file" }, { - "bom-ref": "b8efe3e28c2d9ff9", + "bom-ref": "6134ea2630451b09", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS.pm", "type": "file" }, { - "bom-ref": "238d2449852a09a4", + "bom-ref": "1927681d0c5968dc", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS.pod", "type": "file" }, { - "bom-ref": "95a5363260b34fa5", + "bom-ref": "2b6a78ec062df261", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS/Constants.pm", "type": "file" }, { - "bom-ref": "03b07034d9584765", + "bom-ref": "f27f1b61953edcc5", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS/CountLines.pm", "type": "file" }, { - "bom-ref": "993d174088277694", + "bom-ref": "8730eb44ba27cde0", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS/Eval.pm", "type": "file" }, { - "bom-ref": "4786ab7db60324f8", + "bom-ref": "ddaee18b6cfec8ec", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS/Utilities.pm", "type": "file" }, { - "bom-ref": "0c8fde6114ffb243", + "bom-ref": "5eaf8fb661e1f847", "name": "/usr/share/perl/5.38.2/ExtUtils/Typemaps.pm", "type": "file" }, { - "bom-ref": "bae664d0d12855bc", + "bom-ref": "47b7da2f065983a0", "name": "/usr/share/perl/5.38.2/ExtUtils/Typemaps/Cmd.pm", "type": "file" }, { - "bom-ref": "d1019a485d091515", + "bom-ref": "458abb2972ba8019", "name": "/usr/share/perl/5.38.2/ExtUtils/Typemaps/InputMap.pm", "type": "file" }, { - "bom-ref": "a0e7fba08ef3630d", + "bom-ref": "4bcac0c5f6cbac01", "name": "/usr/share/perl/5.38.2/ExtUtils/Typemaps/OutputMap.pm", "type": "file" }, { - "bom-ref": "d2eb2501ba1dcc30", + "bom-ref": "fbdd5b6a43008534", "name": "/usr/share/perl/5.38.2/ExtUtils/Typemaps/Type.pm", "type": "file" }, { - "bom-ref": "32384751eec3b508", + "bom-ref": "2bec0087649a3d44", "name": "/usr/share/perl/5.38.2/ExtUtils/testlib.pm", "type": "file" }, { - "bom-ref": "260dec6cf4df5763", + "bom-ref": "703cd7c75f46aad3", "name": "/usr/share/perl/5.38.2/ExtUtils/typemap", "type": "file" }, { - "bom-ref": "6e37bcc9fd8b4aff", + "bom-ref": "9d9c605a7f4af21f", "name": "/usr/share/perl/5.38.2/ExtUtils/xsubpp", "type": "file" }, { - "bom-ref": "0a836ad4353b10e8", + "bom-ref": "3ef232c7c7941d48", "name": "/usr/share/perl/5.38.2/Fatal.pm", "type": "file" }, { - "bom-ref": "7ce53f4e9a20981e", + "bom-ref": "ef79ed60afcfcdfe", "name": "/usr/share/perl/5.38.2/File/Basename.pm", "type": "file" }, { - "bom-ref": "9596a3692ee75c3f", + "bom-ref": "d6d399a577430acf", "name": "/usr/share/perl/5.38.2/File/Compare.pm", "type": "file" }, { - "bom-ref": "07558fa42e2c5950", + "bom-ref": "879ee30213c13bd4", "name": "/usr/share/perl/5.38.2/File/Copy.pm", "type": "file" }, { - "bom-ref": "c3677a3f48d587e1", + "bom-ref": "9fab1e271d1aba15", "name": "/usr/share/perl/5.38.2/File/Fetch.pm", "type": "file" }, { - "bom-ref": "04bbf78ea3ff0509", + "bom-ref": "cb43e25383ceb5bd", "name": "/usr/share/perl/5.38.2/File/Find.pm", "type": "file" }, { - "bom-ref": "31ee433144c078ee", + "bom-ref": "a18bed5a65ea851e", "name": "/usr/share/perl/5.38.2/File/GlobMapper.pm", "type": "file" }, { - "bom-ref": "cea6adbc2d9e82e9", + "bom-ref": "8c3f6e33c9e2416d", "name": "/usr/share/perl/5.38.2/File/Path.pm", "type": "file" }, { - "bom-ref": "05ec3b88c5351f6a", + "bom-ref": "5ecb10e3481e4da2", "name": "/usr/share/perl/5.38.2/File/Temp.pm", "type": "file" }, { - "bom-ref": "67cbe4ec25b5da4d", + "bom-ref": "8012a292a7adcb6d", "name": "/usr/share/perl/5.38.2/File/stat.pm", "type": "file" }, { - "bom-ref": "5b6fede3df8f1dd7", + "bom-ref": "f0671bfa0a99fb17", "name": "/usr/share/perl/5.38.2/FileCache.pm", "type": "file" }, { - "bom-ref": "86f94869d5854150", + "bom-ref": "c6850da796cf8e50", "name": "/usr/share/perl/5.38.2/FileHandle.pm", "type": "file" }, { - "bom-ref": "b3b277bf02d9445a", + "bom-ref": "2f6fe9d467c6125a", "name": "/usr/share/perl/5.38.2/Filter/Simple.pm", "type": "file" }, { - "bom-ref": "ee8e93a67b4b3833", + "bom-ref": "6a5980f257736d87", "name": "/usr/share/perl/5.38.2/FindBin.pm", "type": "file" }, { - "bom-ref": "a6d003ad78b05a08", + "bom-ref": "802080155591c7b4", "name": "/usr/share/perl/5.38.2/Getopt/Long.pm", "type": "file" }, { - "bom-ref": "4644f99450ff2ca3", + "bom-ref": "c5e2cbd2992c5fab", "name": "/usr/share/perl/5.38.2/Getopt/Std.pm", "type": "file" }, { - "bom-ref": "0106b07e44b15f97", + "bom-ref": "6d0cecc4e459abaf", "name": "/usr/share/perl/5.38.2/HTTP/Tiny.pm", "type": "file" }, { - "bom-ref": "221421dcb48cb252", + "bom-ref": "22f7720fdf9e6752", "name": "/usr/share/perl/5.38.2/I18N/Collate.pm", "type": "file" }, { - "bom-ref": "3731331381f06416", + "bom-ref": "119de1af2b631b0a", "name": "/usr/share/perl/5.38.2/I18N/LangTags.pm", "type": "file" }, { - "bom-ref": "5df3bc64b3f45485", + "bom-ref": "0c9ed4ed93d0183d", "name": "/usr/share/perl/5.38.2/I18N/LangTags/Detect.pm", "type": "file" }, { - "bom-ref": "fff8be025d6904e8", + "bom-ref": "4500b49b97acd4a0", "name": "/usr/share/perl/5.38.2/I18N/LangTags/List.pm", "type": "file" }, { - "bom-ref": "e19403286fc8324a", + "bom-ref": "a40fe5fab1a75566", "name": "/usr/share/perl/5.38.2/IO/Compress/Adapter/Bzip2.pm", "type": "file" }, { - "bom-ref": "bf782236f70fb783", + "bom-ref": "2e4dba45705050e7", "name": "/usr/share/perl/5.38.2/IO/Compress/Adapter/Deflate.pm", "type": "file" }, { - "bom-ref": "b6e3b7dfc2caf41a", + "bom-ref": "2635a36babc09706", "name": "/usr/share/perl/5.38.2/IO/Compress/Adapter/Identity.pm", "type": "file" }, { - "bom-ref": "5961b3ecac83478b", + "bom-ref": "013de6fb6d95873f", "name": "/usr/share/perl/5.38.2/IO/Compress/Base.pm", "type": "file" }, { - "bom-ref": "a44d6bc1b52d7286", + "bom-ref": "fa2404c60b57411a", "name": "/usr/share/perl/5.38.2/IO/Compress/Base/Common.pm", "type": "file" }, { - "bom-ref": "c13428c5f5325b37", + "bom-ref": "f44a05f73c807a9f", "name": "/usr/share/perl/5.38.2/IO/Compress/Bzip2.pm", "type": "file" }, { - "bom-ref": "6c4c1aac03bea72b", + "bom-ref": "08fd038a3980725f", "name": "/usr/share/perl/5.38.2/IO/Compress/Deflate.pm", "type": "file" }, { - "bom-ref": "3af499676c465ef8", + "bom-ref": "02567103dc693fdc", "name": "/usr/share/perl/5.38.2/IO/Compress/FAQ.pod", "type": "file" }, { - "bom-ref": "022e87bed736a18a", + "bom-ref": "ad4725830407934e", "name": "/usr/share/perl/5.38.2/IO/Compress/Gzip.pm", "type": "file" }, { - "bom-ref": "8dcc5e8ca00270c6", + "bom-ref": "4d101bd3f591635a", "name": "/usr/share/perl/5.38.2/IO/Compress/Gzip/Constants.pm", "type": "file" }, { - "bom-ref": "a77d0c2dc3e254ad", + "bom-ref": "dbb79e0f13cbd661", "name": "/usr/share/perl/5.38.2/IO/Compress/RawDeflate.pm", "type": "file" }, { - "bom-ref": "24f845ebafb27687", + "bom-ref": "f07b7b57b6e2fc03", "name": "/usr/share/perl/5.38.2/IO/Compress/Zip.pm", "type": "file" }, { - "bom-ref": "a80b6f7bf2381f05", + "bom-ref": "d47032f86dc95b41", "name": "/usr/share/perl/5.38.2/IO/Compress/Zip/Constants.pm", "type": "file" }, { - "bom-ref": "c4bbf72026f347ec", + "bom-ref": "5a5f79954cf82744", "name": "/usr/share/perl/5.38.2/IO/Compress/Zlib/Constants.pm", "type": "file" }, { - "bom-ref": "d06d817fcf21803d", + "bom-ref": "9cde2a21e77f5031", "name": "/usr/share/perl/5.38.2/IO/Compress/Zlib/Extra.pm", "type": "file" }, { - "bom-ref": "d39a2b95dde299ce", + "bom-ref": "d3bed016cea10d82", "name": "/usr/share/perl/5.38.2/IO/Socket/IP.pm", "type": "file" }, { - "bom-ref": "ecf43bcdb5c0cc11", + "bom-ref": "2cb34ac1bd5ab31d", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Adapter/Bunzip2.pm", "type": "file" }, { - "bom-ref": "c5166fb5dcf185d1", + "bom-ref": "cbc895ef4a3d851d", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Adapter/Identity.pm", "type": "file" }, { - "bom-ref": "3ad165d3d1a0fa9d", + "bom-ref": "ee99ea380a160569", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Adapter/Inflate.pm", "type": "file" }, { - "bom-ref": "c608793194351669", + "bom-ref": "1da414ba7dcf16c1", "name": "/usr/share/perl/5.38.2/IO/Uncompress/AnyInflate.pm", "type": "file" }, { - "bom-ref": "2bfda9fc6bf2b4a9", + "bom-ref": "d8abbed63772a92d", "name": "/usr/share/perl/5.38.2/IO/Uncompress/AnyUncompress.pm", "type": "file" }, { - "bom-ref": "03f6953d96ca0791", + "bom-ref": "d6a128a388d98345", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Base.pm", "type": "file" }, { - "bom-ref": "a4c237842033f6cb", + "bom-ref": "90c667c658e271ff", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Bunzip2.pm", "type": "file" }, { - "bom-ref": "cb140f9b6fff5e3f", + "bom-ref": "28f16c073fe4a103", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Gunzip.pm", "type": "file" }, { - "bom-ref": "9a305448d87245e5", + "bom-ref": "189354f37468ed7d", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Inflate.pm", "type": "file" }, { - "bom-ref": "468b6a51ec59f0ac", + "bom-ref": "572e4956ff85808c", "name": "/usr/share/perl/5.38.2/IO/Uncompress/RawInflate.pm", "type": "file" }, { - "bom-ref": "b330a51f05559a02", + "bom-ref": "f809efbf837c25b2", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Unzip.pm", "type": "file" }, { - "bom-ref": "f17b9e7a7fb4d05c", + "bom-ref": "f6028566d0921ae8", "name": "/usr/share/perl/5.38.2/IO/Zlib.pm", "type": "file" }, { - "bom-ref": "3766aaf3e35bf1c0", + "bom-ref": "a3470af25c863a08", "name": "/usr/share/perl/5.38.2/IPC/Cmd.pm", "type": "file" }, { - "bom-ref": "0942f71ac2f97f9f", + "bom-ref": "463d12130173632f", "name": "/usr/share/perl/5.38.2/IPC/Open2.pm", "type": "file" }, { - "bom-ref": "77c9d21fe697c4ec", + "bom-ref": "9f5551660d8a41ac", "name": "/usr/share/perl/5.38.2/IPC/Open3.pm", "type": "file" }, { - "bom-ref": "428799a0aef33afb", + "bom-ref": "dc17b2a2e841edc7", "name": "/usr/share/perl/5.38.2/Internals.pod", "type": "file" }, { - "bom-ref": "e96820e748e08fa7", + "bom-ref": "084d2db3cebd56f7", "name": "/usr/share/perl/5.38.2/JSON/PP.pm", "type": "file" }, { - "bom-ref": "f15296b721e2de6f", + "bom-ref": "17414aee6730781b", "name": "/usr/share/perl/5.38.2/JSON/PP/Boolean.pm", "type": "file" }, { - "bom-ref": "6c175bd415e4efb9", + "bom-ref": "750c515a68cb6b0d", "name": "/usr/share/perl/5.38.2/Locale/Maketext.pm", "type": "file" }, { - "bom-ref": "834653c976bcf756", + "bom-ref": "a9aa494ffd53e516", "name": "/usr/share/perl/5.38.2/Locale/Maketext.pod", "type": "file" }, { - "bom-ref": "f69f649438926b6a", + "bom-ref": "c9f25c6b60827b72", "name": "/usr/share/perl/5.38.2/Locale/Maketext/Cookbook.pod", "type": "file" }, { - "bom-ref": "63b7db90887367b0", + "bom-ref": "27e6cbeba5649fcc", "name": "/usr/share/perl/5.38.2/Locale/Maketext/Guts.pm", "type": "file" }, { - "bom-ref": "8bc05ed673530e09", + "bom-ref": "10ea18878ca60821", "name": "/usr/share/perl/5.38.2/Locale/Maketext/GutsLoader.pm", "type": "file" }, { - "bom-ref": "ed3219c2a4392dc2", + "bom-ref": "2c36826cefe69b52", "name": "/usr/share/perl/5.38.2/Locale/Maketext/Simple.pm", "type": "file" }, { - "bom-ref": "9eed65a2877a8882", + "bom-ref": "10613e86c6ec29ee", "name": "/usr/share/perl/5.38.2/Locale/Maketext/TPJ13.pod", "type": "file" }, { - "bom-ref": "85eba76de571bddf", + "bom-ref": "9f62afcbb44b999b", "name": "/usr/share/perl/5.38.2/Math/BigFloat.pm", "type": "file" }, { - "bom-ref": "b9b830682f1d12b2", + "bom-ref": "8a68e524f3ba04da", "name": "/usr/share/perl/5.38.2/Math/BigFloat/Trace.pm", "type": "file" }, { - "bom-ref": "dbc01b634c8353dd", + "bom-ref": "8f0deb312abd2a29", "name": "/usr/share/perl/5.38.2/Math/BigInt.pm", "type": "file" }, { - "bom-ref": "074b86eca8f8e589", + "bom-ref": "3fd761480fc28a85", "name": "/usr/share/perl/5.38.2/Math/BigInt/Calc.pm", "type": "file" }, { - "bom-ref": "57ea18720b4cb3c5", + "bom-ref": "6eef8c8875e0d871", "name": "/usr/share/perl/5.38.2/Math/BigInt/Lib.pm", "type": "file" }, { - "bom-ref": "2ce8ba946cfd36de", + "bom-ref": "f01498598b5615ce", "name": "/usr/share/perl/5.38.2/Math/BigInt/Trace.pm", "type": "file" }, { - "bom-ref": "d5b4c3d0511d8b8f", + "bom-ref": "75bf5616ce572a87", "name": "/usr/share/perl/5.38.2/Math/BigRat.pm", "type": "file" }, { - "bom-ref": "f2bc11a301f5f16e", + "bom-ref": "0524279c540e8ca6", "name": "/usr/share/perl/5.38.2/Math/BigRat/Trace.pm", "type": "file" }, { - "bom-ref": "9a02b4a49ec7231e", + "bom-ref": "f64187b17c793d9e", "name": "/usr/share/perl/5.38.2/Math/Complex.pm", "type": "file" }, { - "bom-ref": "8593f468b5425b12", + "bom-ref": "d610706f02833186", "name": "/usr/share/perl/5.38.2/Math/Trig.pm", "type": "file" }, { - "bom-ref": "e9922a9780dc394f", + "bom-ref": "f57236656618b0b7", "name": "/usr/share/perl/5.38.2/Memoize.pm", "type": "file" }, { - "bom-ref": "8162d2c1de778e0a", + "bom-ref": "c2a89a6b7b97c34a", "name": "/usr/share/perl/5.38.2/Memoize/AnyDBM_File.pm", "type": "file" }, { - "bom-ref": "0c9de2e28216e06a", + "bom-ref": "2476ed8894c858ee", "name": "/usr/share/perl/5.38.2/Memoize/Expire.pm", "type": "file" }, { - "bom-ref": "1f424ac04fdc6383", + "bom-ref": "e1e7e398a3c110df", "name": "/usr/share/perl/5.38.2/Memoize/NDBM_File.pm", "type": "file" }, { - "bom-ref": "c2c45b640ca968ad", + "bom-ref": "6cbb63b600c4a545", "name": "/usr/share/perl/5.38.2/Memoize/SDBM_File.pm", "type": "file" }, { - "bom-ref": "3bc8f688533a36c4", + "bom-ref": "4ff4ecfeb79c394c", "name": "/usr/share/perl/5.38.2/Memoize/Storable.pm", "type": "file" }, { - "bom-ref": "4387c49b8ef3769f", + "bom-ref": "f7e974f69bdb22d7", "name": "/usr/share/perl/5.38.2/Module/CoreList.pm", "type": "file" }, { - "bom-ref": "85e2c7c6c6646e40", + "bom-ref": "cb23d1ba26215cb0", "name": "/usr/share/perl/5.38.2/Module/CoreList.pod", "type": "file" }, { - "bom-ref": "bb3b1f4ac8686259", + "bom-ref": "c3f5f482edfece89", "name": "/usr/share/perl/5.38.2/Module/CoreList/Utils.pm", "type": "file" }, { - "bom-ref": "bbdede06c06d887a", + "bom-ref": "48680c3b55505e1a", "name": "/usr/share/perl/5.38.2/Module/Load.pm", "type": "file" }, { - "bom-ref": "7131bd2b75edc545", + "bom-ref": "2fdb9af2e162e605", "name": "/usr/share/perl/5.38.2/Module/Load/Conditional.pm", "type": "file" }, { - "bom-ref": "b667bb1b3450e217", + "bom-ref": "9d5fe66b5c1421ff", "name": "/usr/share/perl/5.38.2/Module/Loaded.pm", "type": "file" }, { - "bom-ref": "5171d6fb2b24484d", + "bom-ref": "0889cc9c73444c0d", "name": "/usr/share/perl/5.38.2/Module/Metadata.pm", "type": "file" }, { - "bom-ref": "cd9cba524162bd0c", + "bom-ref": "11dbb7b6b3570d54", "name": "/usr/share/perl/5.38.2/NEXT.pm", "type": "file" }, { - "bom-ref": "18baf1fe9a9ebadf", + "bom-ref": "10ebca39cb72c3b7", "name": "/usr/share/perl/5.38.2/Net/Cmd.pm", "type": "file" }, { - "bom-ref": "a8227623fec326af", + "bom-ref": "a84feb17dc626577", "name": "/usr/share/perl/5.38.2/Net/Config.pm", "type": "file" }, { - "bom-ref": "0a40296ca3cd60ff", + "bom-ref": "7f94d385a152dc07", "name": "/usr/share/perl/5.38.2/Net/Domain.pm", "type": "file" }, { - "bom-ref": "5b4d65da1cc64ece", + "bom-ref": "54f1d81b79e8312a", "name": "/usr/share/perl/5.38.2/Net/FTP.pm", "type": "file" }, { - "bom-ref": "e461c48be8c80fc1", + "bom-ref": "2c3a035f0724c0e5", "name": "/usr/share/perl/5.38.2/Net/FTP/A.pm", "type": "file" }, { - "bom-ref": "9155cff69380a7a0", + "bom-ref": "b07628e18b20c174", "name": "/usr/share/perl/5.38.2/Net/FTP/E.pm", "type": "file" }, { - "bom-ref": "6d976d8459f6bc92", + "bom-ref": "e36798cea59efac2", "name": "/usr/share/perl/5.38.2/Net/FTP/I.pm", "type": "file" }, { - "bom-ref": "6d7a2ede595e0158", + "bom-ref": "706cb738920887e8", "name": "/usr/share/perl/5.38.2/Net/FTP/L.pm", "type": "file" }, { - "bom-ref": "53edb2b5b16dfc45", + "bom-ref": "998c166efa5ad9d9", "name": "/usr/share/perl/5.38.2/Net/FTP/dataconn.pm", "type": "file" }, { - "bom-ref": "237874ffb3f77af7", + "bom-ref": "97f91ec4339cf8d3", "name": "/usr/share/perl/5.38.2/Net/NNTP.pm", "type": "file" }, { - "bom-ref": "49301c83c3f6075e", + "bom-ref": "dbb3b9d026b8daca", "name": "/usr/share/perl/5.38.2/Net/Netrc.pm", "type": "file" }, { - "bom-ref": "143898b8dc5ac88b", + "bom-ref": "4393f53fc27e4177", "name": "/usr/share/perl/5.38.2/Net/POP3.pm", "type": "file" }, { - "bom-ref": "5ef5872582f8a54f", + "bom-ref": "120a48120ee0d327", "name": "/usr/share/perl/5.38.2/Net/Ping.pm", "type": "file" }, { - "bom-ref": "d9e0084be33616f8", + "bom-ref": "7be93c110c8314fc", "name": "/usr/share/perl/5.38.2/Net/SMTP.pm", "type": "file" }, { - "bom-ref": "c042ba5709418f85", + "bom-ref": "f366c1fb5e79f8b9", "name": "/usr/share/perl/5.38.2/Net/Time.pm", "type": "file" }, { - "bom-ref": "34b8746fa90c6a61", + "bom-ref": "83073f62875b0d51", "name": "/usr/share/perl/5.38.2/Net/hostent.pm", "type": "file" }, { - "bom-ref": "c3b5e46a12121a92", + "bom-ref": "8054bd9dcbb1d4ce", "name": "/usr/share/perl/5.38.2/Net/libnetFAQ.pod", "type": "file" }, { - "bom-ref": "bf9e39ec1d71d44d", + "bom-ref": "60d8c47ffd522429", "name": "/usr/share/perl/5.38.2/Net/netent.pm", "type": "file" }, { - "bom-ref": "37371072eb57d68d", + "bom-ref": "2067f06ae461f181", "name": "/usr/share/perl/5.38.2/Net/protoent.pm", "type": "file" }, { - "bom-ref": "44b26aab3522c6bf", + "bom-ref": "b4377e78a459e75f", "name": "/usr/share/perl/5.38.2/Net/servent.pm", "type": "file" }, { - "bom-ref": "aad39e11b6fccb43", + "bom-ref": "221e96dbb87ec3e7", "name": "/usr/share/perl/5.38.2/Params/Check.pm", "type": "file" }, { - "bom-ref": "39e63eb73b1c4c8a", + "bom-ref": "20c06b492d1a01de", "name": "/usr/share/perl/5.38.2/Parse/CPAN/Meta.pm", "type": "file" }, { - "bom-ref": "f2f7061260c6003d", + "bom-ref": "26032c8ff7667d51", "name": "/usr/share/perl/5.38.2/Perl/OSType.pm", "type": "file" }, { - "bom-ref": "b22345606253383b", + "bom-ref": "3238c0abe915463f", "name": "/usr/share/perl/5.38.2/PerlIO.pm", "type": "file" }, { - "bom-ref": "cc95b012e468e28a", + "bom-ref": "8771b62a9691385a", "name": "/usr/share/perl/5.38.2/PerlIO/via/QuotedPrint.pm", "type": "file" }, { - "bom-ref": "0ae36bd40a07f971", + "bom-ref": "3ce337539496fd99", "name": "/usr/share/perl/5.38.2/Pod/Checker.pm", "type": "file" }, { - "bom-ref": "ecc7f3077e5b8b35", + "bom-ref": "556fec6382279491", "name": "/usr/share/perl/5.38.2/Pod/Escapes.pm", "type": "file" }, { - "bom-ref": "31bafb90e32e7acb", + "bom-ref": "21cdb9b74716e74f", "name": "/usr/share/perl/5.38.2/Pod/Functions.pm", "type": "file" }, { - "bom-ref": "aa12acd23ae72928", + "bom-ref": "54157988f0618550", "name": "/usr/share/perl/5.38.2/Pod/Html.pm", "type": "file" }, { - "bom-ref": "0be60605b4a7a286", + "bom-ref": "dc25866b7fe95cbe", "name": "/usr/share/perl/5.38.2/Pod/Html/Util.pm", "type": "file" }, { - "bom-ref": "6a6755a81392d2ce", + "bom-ref": "20cf1b9d01a0fd22", "name": "/usr/share/perl/5.38.2/Pod/Man.pm", "type": "file" }, { - "bom-ref": "76364f31fbdf7c93", + "bom-ref": "b9af6cd56761bf8b", "name": "/usr/share/perl/5.38.2/Pod/ParseLink.pm", "type": "file" }, { - "bom-ref": "0e4ce4f7b9a34a9e", + "bom-ref": "914299f7408d390e", "name": "/usr/share/perl/5.38.2/Pod/Perldoc.pm", "type": "file" }, { - "bom-ref": "d1a0d50848e8be33", + "bom-ref": "c7406858bc01505b", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/BaseTo.pm", "type": "file" }, { - "bom-ref": "fdeab6eeb90ff366", + "bom-ref": "b8fb5e30779ddd26", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/GetOptsOO.pm", "type": "file" }, { - "bom-ref": "0186982a95b0e507", + "bom-ref": "e5b36555413d825f", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToANSI.pm", "type": "file" }, { - "bom-ref": "51d0334a7e02b4d0", + "bom-ref": "fe12e1c61f4b3c34", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToChecker.pm", "type": "file" }, { - "bom-ref": "bf527d7bc5a315bd", + "bom-ref": "c5d1f64c5574b799", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToMan.pm", "type": "file" }, { - "bom-ref": "93b10f6fb2dd18ab", + "bom-ref": "f1d18c570abdda4b", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToNroff.pm", "type": "file" }, { - "bom-ref": "a223a4d075c2c478", + "bom-ref": "48cb81b7efb41f10", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToPod.pm", "type": "file" }, { - "bom-ref": "b093a81660694331", + "bom-ref": "d336a6fc5eaff651", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToRtf.pm", "type": "file" }, { - "bom-ref": "1e0f093d39968edf", + "bom-ref": "1c8e39182c9ec20f", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToTerm.pm", "type": "file" }, { - "bom-ref": "385a006cb141a39d", + "bom-ref": "454489661b225add", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToText.pm", "type": "file" }, { - "bom-ref": "a432ba21f6a6c059", + "bom-ref": "07062c06321ba361", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToTk.pm", "type": "file" }, { - "bom-ref": "5e0b6a2af7a397fb", + "bom-ref": "45f30bd67df2a93b", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToXml.pm", "type": "file" }, { - "bom-ref": "c75d9d334dee5b50", + "bom-ref": "cb91667dc50da020", "name": "/usr/share/perl/5.38.2/Pod/Simple.pm", "type": "file" }, { - "bom-ref": "2b02da99695e6e6c", + "bom-ref": "abc80f1bbe59fa54", "name": "/usr/share/perl/5.38.2/Pod/Simple.pod", "type": "file" }, { - "bom-ref": "db8115fa7a2a367c", + "bom-ref": "46a25b7929c5fa1c", "name": "/usr/share/perl/5.38.2/Pod/Simple/BlackBox.pm", "type": "file" }, { - "bom-ref": "20509f135eabd84c", + "bom-ref": "8140c4ca6ec25e64", "name": "/usr/share/perl/5.38.2/Pod/Simple/Checker.pm", "type": "file" }, { - "bom-ref": "3cac4b825c98af71", + "bom-ref": "43fc57108421a4a1", "name": "/usr/share/perl/5.38.2/Pod/Simple/Debug.pm", "type": "file" }, { - "bom-ref": "801c5fdfbf75ef38", + "bom-ref": "a829154a14bf3478", "name": "/usr/share/perl/5.38.2/Pod/Simple/DumpAsText.pm", "type": "file" }, { - "bom-ref": "ccc3e3703661ef28", + "bom-ref": "6400f30fc75fe46c", "name": "/usr/share/perl/5.38.2/Pod/Simple/DumpAsXML.pm", "type": "file" }, { - "bom-ref": "4cc5ae953439bc98", + "bom-ref": "b054824a059e13f0", "name": "/usr/share/perl/5.38.2/Pod/Simple/HTML.pm", "type": "file" }, { - "bom-ref": "31a820f404007454", + "bom-ref": "356b07a971bad5c4", "name": "/usr/share/perl/5.38.2/Pod/Simple/HTMLBatch.pm", "type": "file" }, { - "bom-ref": "c27f5cd20becafca", + "bom-ref": "4557885a9746f11a", "name": "/usr/share/perl/5.38.2/Pod/Simple/HTMLLegacy.pm", "type": "file" }, { - "bom-ref": "2c82f992c1671d6b", + "bom-ref": "c66d2f67b9a642fb", "name": "/usr/share/perl/5.38.2/Pod/Simple/JustPod.pm", "type": "file" }, { - "bom-ref": "1ceed53dbf1804a6", + "bom-ref": "ddb36a23fc8d127a", "name": "/usr/share/perl/5.38.2/Pod/Simple/LinkSection.pm", "type": "file" }, { - "bom-ref": "b3ae29492df10dc7", + "bom-ref": "247cbd6492f63a83", "name": "/usr/share/perl/5.38.2/Pod/Simple/Methody.pm", "type": "file" }, { - "bom-ref": "664f9aabd5e4cbd2", + "bom-ref": "9f218ca7b05d31da", "name": "/usr/share/perl/5.38.2/Pod/Simple/Progress.pm", "type": "file" }, { - "bom-ref": "86c0090928df458e", + "bom-ref": "608b02f244a5e622", "name": "/usr/share/perl/5.38.2/Pod/Simple/PullParser.pm", "type": "file" }, { - "bom-ref": "cb972e669d470a1f", + "bom-ref": "61d6e13af922ccc3", "name": "/usr/share/perl/5.38.2/Pod/Simple/PullParserEndToken.pm", "type": "file" }, { - "bom-ref": "ec81e84cfbf419c2", + "bom-ref": "c3f3b6c7fd638fc6", "name": "/usr/share/perl/5.38.2/Pod/Simple/PullParserStartToken.pm", "type": "file" }, { - "bom-ref": "dcc943ca0ca1906f", + "bom-ref": "a886e20292cbd7bf", "name": "/usr/share/perl/5.38.2/Pod/Simple/PullParserTextToken.pm", "type": "file" }, { - "bom-ref": "aae36929c5882064", + "bom-ref": "77955b3ec5851104", "name": "/usr/share/perl/5.38.2/Pod/Simple/PullParserToken.pm", "type": "file" }, { - "bom-ref": "2c5aedd7bffd1cd8", + "bom-ref": "1d6ec729b85a26b4", "name": "/usr/share/perl/5.38.2/Pod/Simple/RTF.pm", "type": "file" }, { - "bom-ref": "5f6ec38d7b5c7772", + "bom-ref": "748e9c46ae7ea86a", "name": "/usr/share/perl/5.38.2/Pod/Simple/Search.pm", "type": "file" }, { - "bom-ref": "4b6805d90af89d4e", + "bom-ref": "1699d0d001887b66", "name": "/usr/share/perl/5.38.2/Pod/Simple/SimpleTree.pm", "type": "file" }, { - "bom-ref": "31f335f7193dfd0d", + "bom-ref": "19e3a93425a42d91", "name": "/usr/share/perl/5.38.2/Pod/Simple/Subclassing.pod", "type": "file" }, { - "bom-ref": "ad5eef06dbc11e7b", + "bom-ref": "3092abf1979c1d9f", "name": "/usr/share/perl/5.38.2/Pod/Simple/Text.pm", "type": "file" }, { - "bom-ref": "4b18c48d3f424c22", + "bom-ref": "c39dcdd2c2c1d966", "name": "/usr/share/perl/5.38.2/Pod/Simple/TextContent.pm", "type": "file" }, { - "bom-ref": "811fb5c686151d5d", + "bom-ref": "27095c5aca5de799", "name": "/usr/share/perl/5.38.2/Pod/Simple/TiedOutFH.pm", "type": "file" }, { - "bom-ref": "3ed7e4b28282868d", + "bom-ref": "6a962917ceb751c1", "name": "/usr/share/perl/5.38.2/Pod/Simple/Transcode.pm", "type": "file" }, { - "bom-ref": "bd6e472695403bb9", + "bom-ref": "3845dbdf6a4f50f1", "name": "/usr/share/perl/5.38.2/Pod/Simple/TranscodeDumb.pm", "type": "file" }, { - "bom-ref": "c9e894fff677c2de", + "bom-ref": "184989bda11e1d3a", "name": "/usr/share/perl/5.38.2/Pod/Simple/TranscodeSmart.pm", "type": "file" }, { - "bom-ref": "9fafc655598be9c4", + "bom-ref": "4ca0f3710c8d8dec", "name": "/usr/share/perl/5.38.2/Pod/Simple/XHTML.pm", "type": "file" }, { - "bom-ref": "0f0df2d2145b782a", + "bom-ref": "cf13b61407e5349e", "name": "/usr/share/perl/5.38.2/Pod/Simple/XMLOutStream.pm", "type": "file" }, { - "bom-ref": "80f3388ed342b021", + "bom-ref": "3f7438f1cdacd221", "name": "/usr/share/perl/5.38.2/Pod/Text.pm", "type": "file" }, { - "bom-ref": "5d56bb6b46a7f565", + "bom-ref": "a18b3107e10426bd", "name": "/usr/share/perl/5.38.2/Pod/Text/Color.pm", "type": "file" }, { - "bom-ref": "9ff2102fb3176bb6", + "bom-ref": "0153e9e27426a77e", "name": "/usr/share/perl/5.38.2/Pod/Text/Overstrike.pm", "type": "file" }, { - "bom-ref": "6b7949f16c7bdf16", + "bom-ref": "c592e26efaf2f44a", "name": "/usr/share/perl/5.38.2/Pod/Text/Termcap.pm", "type": "file" }, { - "bom-ref": "a73205be6688a37e", + "bom-ref": "a73d57e71cc07232", "name": "/usr/share/perl/5.38.2/Pod/Usage.pm", "type": "file" }, { - "bom-ref": "bc369b3859e84683", + "bom-ref": "7dc15d41cee39bcf", "name": "/usr/share/perl/5.38.2/Safe.pm", "type": "file" }, { - "bom-ref": "2dd070f83e3a774d", + "bom-ref": "2cbe348dcb9a9b75", "name": "/usr/share/perl/5.38.2/Search/Dict.pm", "type": "file" }, { - "bom-ref": "cdc1e19686e2791c", + "bom-ref": "6a50ede575f25320", "name": "/usr/share/perl/5.38.2/SelectSaver.pm", "type": "file" }, { - "bom-ref": "ef29924bb8f86465", + "bom-ref": "9c69840865347265", "name": "/usr/share/perl/5.38.2/SelfLoader.pm", "type": "file" }, { - "bom-ref": "428d13acc0be9c00", + "bom-ref": "b281cb6a426b5194", "name": "/usr/share/perl/5.38.2/Symbol.pm", "type": "file" }, { - "bom-ref": "439da0ca4e2feba2", + "bom-ref": "d0d2003c3f5f9106", "name": "/usr/share/perl/5.38.2/TAP/Base.pm", "type": "file" }, { - "bom-ref": "281b5cee0b76e8e8", + "bom-ref": "0dc4782a2de5e1f8", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Base.pm", "type": "file" }, { - "bom-ref": "6c47439a81c7d1b2", + "bom-ref": "4fda0611aedb758e", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Color.pm", "type": "file" }, { - "bom-ref": "a1ecb8bdc98ef007", + "bom-ref": "cd1772ebf26037cf", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Console.pm", "type": "file" }, { - "bom-ref": "537270d618d1c3b7", + "bom-ref": "850e4bb8383deecf", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Console/ParallelSession.pm", "type": "file" }, { - "bom-ref": "64bfe8e6804e1a5d", + "bom-ref": "f6024011a21838e5", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Console/Session.pm", "type": "file" }, { - "bom-ref": "5964b32b90fb20c7", + "bom-ref": "0b816ceded3bab23", "name": "/usr/share/perl/5.38.2/TAP/Formatter/File.pm", "type": "file" }, { - "bom-ref": "b7ae92d531550ea9", + "bom-ref": "a42c5668ccf7effd", "name": "/usr/share/perl/5.38.2/TAP/Formatter/File/Session.pm", "type": "file" }, { - "bom-ref": "4ed8fb7bec48b6a6", + "bom-ref": "b999ed3c70c50946", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Session.pm", "type": "file" }, { - "bom-ref": "025a016d67aa1097", + "bom-ref": "2a3e527f9d92af2b", "name": "/usr/share/perl/5.38.2/TAP/Harness.pm", "type": "file" }, { - "bom-ref": "6da5734b318f14d1", + "bom-ref": "c3d0633638692cc9", "name": "/usr/share/perl/5.38.2/TAP/Harness/Beyond.pod", "type": "file" }, { - "bom-ref": "60a55580467e1865", + "bom-ref": "2d410b8208df0c11", "name": "/usr/share/perl/5.38.2/TAP/Harness/Env.pm", "type": "file" }, { - "bom-ref": "3393a4e7a47a8812", + "bom-ref": "64c1887cdf6c06e2", "name": "/usr/share/perl/5.38.2/TAP/Object.pm", "type": "file" }, { - "bom-ref": "294dc36bbc095691", + "bom-ref": "0e88a18cdeae2a95", "name": "/usr/share/perl/5.38.2/TAP/Parser.pm", "type": "file" }, { - "bom-ref": "e7619ca175374fda", + "bom-ref": "23d503fb6dea233a", "name": "/usr/share/perl/5.38.2/TAP/Parser/Aggregator.pm", "type": "file" }, { - "bom-ref": "465358815e693a96", + "bom-ref": "9c83d3044542bfa2", "name": "/usr/share/perl/5.38.2/TAP/Parser/Grammar.pm", "type": "file" }, { - "bom-ref": "90804f3648ac7f0a", + "bom-ref": "5e1c0e8a5a1aea2a", "name": "/usr/share/perl/5.38.2/TAP/Parser/Iterator.pm", "type": "file" }, { - "bom-ref": "3f1a3e178f737981", + "bom-ref": "b0a2464d59c7f611", "name": "/usr/share/perl/5.38.2/TAP/Parser/Iterator/Array.pm", "type": "file" }, { - "bom-ref": "d2dd36c54b416914", + "bom-ref": "0572726d5d8854f0", "name": "/usr/share/perl/5.38.2/TAP/Parser/Iterator/Process.pm", "type": "file" }, { - "bom-ref": "b5fe148fa59fcdba", + "bom-ref": "ac641b73fe38aede", "name": "/usr/share/perl/5.38.2/TAP/Parser/Iterator/Stream.pm", "type": "file" }, { - "bom-ref": "70d5f0d80e2ff33a", + "bom-ref": "cc43dd885c16002a", "name": "/usr/share/perl/5.38.2/TAP/Parser/IteratorFactory.pm", "type": "file" }, { - "bom-ref": "99a058723dcd6ebf", + "bom-ref": "8b0d28f647696893", "name": "/usr/share/perl/5.38.2/TAP/Parser/Multiplexer.pm", "type": "file" }, { - "bom-ref": "339feee7e3337205", + "bom-ref": "3d2a23ec26533189", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result.pm", "type": "file" }, { - "bom-ref": "42d85f1bc9fb4e55", + "bom-ref": "627b7f72294c2281", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Bailout.pm", "type": "file" }, { - "bom-ref": "41bf3106a3378cf5", + "bom-ref": "beec7ed91df67e7d", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Comment.pm", "type": "file" }, { - "bom-ref": "1c0d4b112b84a612", + "bom-ref": "20a2324f57e648fe", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Plan.pm", "type": "file" }, { - "bom-ref": "92038a031b74e9f4", + "bom-ref": "b8f2190f5ea8ad28", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Pragma.pm", "type": "file" }, { - "bom-ref": "8ab54b645b0dcb3c", + "bom-ref": "b0fe8ad8bf7035dc", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Test.pm", "type": "file" }, { - "bom-ref": "039119c1ff070100", + "bom-ref": "de78912246141ea8", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Unknown.pm", "type": "file" }, { - "bom-ref": "3cb43d6ecddbe717", + "bom-ref": "05ec6cd4f64f9c7f", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Version.pm", "type": "file" }, { - "bom-ref": "a5aeaa33ed92b36d", + "bom-ref": "02bd7d24fb6420e9", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/YAML.pm", "type": "file" }, { - "bom-ref": "8e2c9d4d469bc704", + "bom-ref": "78d52299313633d0", "name": "/usr/share/perl/5.38.2/TAP/Parser/ResultFactory.pm", "type": "file" }, { - "bom-ref": "dddf37c192edd1c5", + "bom-ref": "a88eb52e3c35831d", "name": "/usr/share/perl/5.38.2/TAP/Parser/Scheduler.pm", "type": "file" }, { - "bom-ref": "4d3f308a0dd14e4a", + "bom-ref": "c167b931e9cb8ae6", "name": "/usr/share/perl/5.38.2/TAP/Parser/Scheduler/Job.pm", "type": "file" }, { - "bom-ref": "f4b5e722ff4c6483", + "bom-ref": "224d6b6694a2a43f", "name": "/usr/share/perl/5.38.2/TAP/Parser/Scheduler/Spinner.pm", "type": "file" }, { - "bom-ref": "05e6d8fa32e6f068", + "bom-ref": "03673003682808b8", "name": "/usr/share/perl/5.38.2/TAP/Parser/Source.pm", "type": "file" }, { - "bom-ref": "7339dd9fbae303dc", + "bom-ref": "c1ad08902f3c7200", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler.pm", "type": "file" }, { - "bom-ref": "5b1bd9f0a6559a46", + "bom-ref": "f7e086ff20a24bda", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler/Executable.pm", "type": "file" }, { - "bom-ref": "3878a661067962de", + "bom-ref": "054c41ce4aa53f76", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler/File.pm", "type": "file" }, { - "bom-ref": "c06bbbc295938449", + "bom-ref": "5d29441645f186d5", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler/Handle.pm", "type": "file" }, { - "bom-ref": "9494c80ff0ff14e7", + "bom-ref": "3fbf3e96bb44cb27", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler/Perl.pm", "type": "file" }, { - "bom-ref": "73635b2802bcf1c2", + "bom-ref": "4274ce030aa1b862", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler/RawTAP.pm", "type": "file" }, { - "bom-ref": "95e5ab9f5fb52166", + "bom-ref": "a1261f58c758986a", "name": "/usr/share/perl/5.38.2/TAP/Parser/YAMLish/Reader.pm", "type": "file" }, { - "bom-ref": "bf8eec5a2fb3a66c", + "bom-ref": "9271cdbfae9a0afc", "name": "/usr/share/perl/5.38.2/TAP/Parser/YAMLish/Writer.pm", "type": "file" }, { - "bom-ref": "201f52c985bb1ff8", + "bom-ref": "92ad8d8c48ab75d4", "name": "/usr/share/perl/5.38.2/Term/ANSIColor.pm", "type": "file" }, { - "bom-ref": "0b9e473b6e0a660a", + "bom-ref": "e575fd8d88e73122", "name": "/usr/share/perl/5.38.2/Term/Cap.pm", "type": "file" }, { - "bom-ref": "499e5f7109035b84", + "bom-ref": "4b765c90c0d23474", "name": "/usr/share/perl/5.38.2/Term/Complete.pm", "type": "file" }, { - "bom-ref": "e9bd507ec09fe3b5", + "bom-ref": "7a527936b11461ad", "name": "/usr/share/perl/5.38.2/Term/ReadLine.pm", "type": "file" }, { - "bom-ref": "5f8fbf2c523270f7", + "bom-ref": "dbd636caf9299f27", "name": "/usr/share/perl/5.38.2/Test.pm", "type": "file" }, { - "bom-ref": "39f4be4f7fbcb08e", + "bom-ref": "5b83f24834b2e11a", "name": "/usr/share/perl/5.38.2/Test/Builder.pm", "type": "file" }, { - "bom-ref": "da398365dc73a39a", + "bom-ref": "b66d90e7e0c9032e", "name": "/usr/share/perl/5.38.2/Test/Builder/Formatter.pm", "type": "file" }, { - "bom-ref": "e77bea85190383eb", + "bom-ref": "6fa798ba6c8f0d6b", "name": "/usr/share/perl/5.38.2/Test/Builder/IO/Scalar.pm", "type": "file" }, { - "bom-ref": "e899137792e5d73d", + "bom-ref": "68fd26fe1fa0c97d", "name": "/usr/share/perl/5.38.2/Test/Builder/Module.pm", "type": "file" }, { - "bom-ref": "c3d0b64b01a64959", + "bom-ref": "bb7aa7a554f23545", "name": "/usr/share/perl/5.38.2/Test/Builder/Tester.pm", "type": "file" }, { - "bom-ref": "1099ac6598011e74", + "bom-ref": "6d469403e27dfa14", "name": "/usr/share/perl/5.38.2/Test/Builder/Tester/Color.pm", "type": "file" }, { - "bom-ref": "770f8c9f1294286a", + "bom-ref": "c7291e884b9f7956", "name": "/usr/share/perl/5.38.2/Test/Builder/TodoDiag.pm", "type": "file" }, { - "bom-ref": "0bdaf2b2bf68f8ad", + "bom-ref": "4890ee80770d3845", "name": "/usr/share/perl/5.38.2/Test/Harness.pm", "type": "file" }, { - "bom-ref": "abecc93bb20ec94b", + "bom-ref": "58598412e80e4ec7", "name": "/usr/share/perl/5.38.2/Test/More.pm", "type": "file" }, { - "bom-ref": "503649a459db9852", + "bom-ref": "2f90999d9d145e5a", "name": "/usr/share/perl/5.38.2/Test/Simple.pm", "type": "file" }, { - "bom-ref": "08da6f8d814c3e84", + "bom-ref": "bab80b069ef7dc34", "name": "/usr/share/perl/5.38.2/Test/Tester.pm", "type": "file" }, { - "bom-ref": "2100bc882138c97b", + "bom-ref": "3fbedd1ae58e337b", "name": "/usr/share/perl/5.38.2/Test/Tester/Capture.pm", "type": "file" }, { - "bom-ref": "e5c288ed19ddae06", + "bom-ref": "121dd2b9ba51b6b6", "name": "/usr/share/perl/5.38.2/Test/Tester/CaptureRunner.pm", "type": "file" }, { - "bom-ref": "bc179f93c64f1b53", + "bom-ref": "3561eff9eef74fe3", "name": "/usr/share/perl/5.38.2/Test/Tester/Delegate.pm", "type": "file" }, { - "bom-ref": "de6ec9d36f0b71f9", + "bom-ref": "c0868fe358f3195d", "name": "/usr/share/perl/5.38.2/Test/Tutorial.pod", "type": "file" }, { - "bom-ref": "2f6743dcbb9a81f3", + "bom-ref": "29a84361b359b207", "name": "/usr/share/perl/5.38.2/Test/use/ok.pm", "type": "file" }, { - "bom-ref": "2d7129ec82c2dbde", + "bom-ref": "dea2c1917ac6dcda", "name": "/usr/share/perl/5.38.2/Test2.pm", "type": "file" }, { - "bom-ref": "577ecf82dab7fd03", + "bom-ref": "03cec072c5c28a7b", "name": "/usr/share/perl/5.38.2/Test2/API.pm", "type": "file" }, { - "bom-ref": "f6101e022157a700", + "bom-ref": "c9d8b4be838891cc", "name": "/usr/share/perl/5.38.2/Test2/API/Breakage.pm", "type": "file" }, { - "bom-ref": "70045ab723946be7", + "bom-ref": "81e9fc37d114059f", "name": "/usr/share/perl/5.38.2/Test2/API/Context.pm", "type": "file" }, { - "bom-ref": "f30f52423e7b3af0", + "bom-ref": "20f84b72a26fcae0", "name": "/usr/share/perl/5.38.2/Test2/API/Instance.pm", "type": "file" }, { - "bom-ref": "c50fce86aebddafa", + "bom-ref": "3fd0653f7a7cc8c2", "name": "/usr/share/perl/5.38.2/Test2/API/InterceptResult.pm", "type": "file" }, { - "bom-ref": "3bc69612fd037854", + "bom-ref": "df4cefd8ae38c90c", "name": "/usr/share/perl/5.38.2/Test2/API/InterceptResult/Event.pm", "type": "file" }, { - "bom-ref": "0ce793befda17f65", + "bom-ref": "ab7b13ce5168afcd", "name": "/usr/share/perl/5.38.2/Test2/API/InterceptResult/Facet.pm", "type": "file" }, { - "bom-ref": "719140ca787d3c81", + "bom-ref": "1df81babc26891f9", "name": "/usr/share/perl/5.38.2/Test2/API/InterceptResult/Hub.pm", "type": "file" }, { - "bom-ref": "1fb746114eef6133", + "bom-ref": "4cdb80d83701bfe3", "name": "/usr/share/perl/5.38.2/Test2/API/InterceptResult/Squasher.pm", "type": "file" }, { - "bom-ref": "0b0e8b69ed53adfd", + "bom-ref": "959da8d0276d5171", "name": "/usr/share/perl/5.38.2/Test2/API/Stack.pm", "type": "file" }, { - "bom-ref": "9fd8245d61635636", + "bom-ref": "2858c2b78109f5f6", "name": "/usr/share/perl/5.38.2/Test2/Event.pm", "type": "file" }, { - "bom-ref": "b6a641aa4aaa696a", + "bom-ref": "713562228dbf5dee", "name": "/usr/share/perl/5.38.2/Test2/Event/Bail.pm", "type": "file" }, { - "bom-ref": "bd837c7e4c018462", + "bom-ref": "cb0adef39b0217da", "name": "/usr/share/perl/5.38.2/Test2/Event/Diag.pm", "type": "file" }, { - "bom-ref": "1c71cd999eadae3b", + "bom-ref": "c083649081d915cf", "name": "/usr/share/perl/5.38.2/Test2/Event/Encoding.pm", "type": "file" }, { - "bom-ref": "24d56154809518d8", + "bom-ref": "06b1a86d06ecbf60", "name": "/usr/share/perl/5.38.2/Test2/Event/Exception.pm", "type": "file" }, { - "bom-ref": "02a0bba1ce540972", + "bom-ref": "b0763db36bbd9482", "name": "/usr/share/perl/5.38.2/Test2/Event/Fail.pm", "type": "file" }, { - "bom-ref": "56661a19665de06c", + "bom-ref": "5479c1a35a385e64", "name": "/usr/share/perl/5.38.2/Test2/Event/Generic.pm", "type": "file" }, { - "bom-ref": "5684a2beda964a0b", + "bom-ref": "dfdca8664ebe7017", "name": "/usr/share/perl/5.38.2/Test2/Event/Note.pm", "type": "file" }, { - "bom-ref": "3f2a9135a9c096d8", + "bom-ref": "673ad175e7d5f218", "name": "/usr/share/perl/5.38.2/Test2/Event/Ok.pm", "type": "file" }, { - "bom-ref": "db3a36bec2f3270f", + "bom-ref": "2d447b3fb0189bfb", "name": "/usr/share/perl/5.38.2/Test2/Event/Pass.pm", "type": "file" }, { - "bom-ref": "8f24b94e8873b3b7", + "bom-ref": "f581eef3bf9ed23b", "name": "/usr/share/perl/5.38.2/Test2/Event/Plan.pm", "type": "file" }, { - "bom-ref": "3c63afd19231e316", + "bom-ref": "5f90d7284b486766", "name": "/usr/share/perl/5.38.2/Test2/Event/Skip.pm", "type": "file" }, { - "bom-ref": "6481769211b68429", + "bom-ref": "d604af4d0cca72f1", "name": "/usr/share/perl/5.38.2/Test2/Event/Subtest.pm", "type": "file" }, { - "bom-ref": "bbb76427eb222955", + "bom-ref": "1963e1a0f676ca99", "name": "/usr/share/perl/5.38.2/Test2/Event/TAP/Version.pm", "type": "file" }, { - "bom-ref": "7dfcb48dd69567e5", + "bom-ref": "03915e64043f6389", "name": "/usr/share/perl/5.38.2/Test2/Event/V2.pm", "type": "file" }, { - "bom-ref": "b062cf1d17d05d91", + "bom-ref": "e18632d1474613cd", "name": "/usr/share/perl/5.38.2/Test2/Event/Waiting.pm", "type": "file" }, { - "bom-ref": "0dcd7d02ddc8a026", + "bom-ref": "3adccc2fc2933c9e", "name": "/usr/share/perl/5.38.2/Test2/EventFacet.pm", "type": "file" }, { - "bom-ref": "1c20aaa58961b57e", + "bom-ref": "c8b686d4fdf8fad6", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/About.pm", "type": "file" }, { - "bom-ref": "e0d29b8879cddc2b", + "bom-ref": "a830a9b453381033", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Amnesty.pm", "type": "file" }, { - "bom-ref": "944e60574204b065", + "bom-ref": "3704c705c19918a5", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Assert.pm", "type": "file" }, { - "bom-ref": "96868e99f7b9e8a0", + "bom-ref": "629df0beccc413f0", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Control.pm", "type": "file" }, { - "bom-ref": "a8147b89f352fd39", + "bom-ref": "62a9bfc020b8ebc5", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Error.pm", "type": "file" }, { - "bom-ref": "d4f7a7203aea52d4", + "bom-ref": "fa0f15b70389f6f4", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Hub.pm", "type": "file" }, { - "bom-ref": "9c615220c9d80b68", + "bom-ref": "db1afc24cc796000", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Info.pm", "type": "file" }, { - "bom-ref": "facd30c4faab165a", + "bom-ref": "378bc31589590e4a", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Info/Table.pm", "type": "file" }, { - "bom-ref": "28c5cdf7b31cfbfa", + "bom-ref": "64c7a90d8b91bda6", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Meta.pm", "type": "file" }, { - "bom-ref": "86d6721ce6c72549", + "bom-ref": "f67f61bd303757c5", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Parent.pm", "type": "file" }, { - "bom-ref": "694930f15947f80d", + "bom-ref": "fe813a95e1dbfe15", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Plan.pm", "type": "file" }, { - "bom-ref": "b12144be322f1b7f", + "bom-ref": "5d47af56e58d354b", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Render.pm", "type": "file" }, { - "bom-ref": "e05272b6a0555d4d", + "bom-ref": "136868b613cd3c81", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Trace.pm", "type": "file" }, { - "bom-ref": "f1fc80db3f204854", + "bom-ref": "4cd3c3b9cf220998", "name": "/usr/share/perl/5.38.2/Test2/Formatter.pm", "type": "file" }, { - "bom-ref": "189d3136798eec37", + "bom-ref": "af6f841f84269873", "name": "/usr/share/perl/5.38.2/Test2/Formatter/TAP.pm", "type": "file" }, { - "bom-ref": "3c5f9b8bce1b0396", + "bom-ref": "3dcfb1748017a8ca", "name": "/usr/share/perl/5.38.2/Test2/Hub.pm", "type": "file" }, { - "bom-ref": "7a36f14160daf5b5", + "bom-ref": "06e49bf3aceb53f5", "name": "/usr/share/perl/5.38.2/Test2/Hub/Interceptor.pm", "type": "file" }, { - "bom-ref": "d4cb8f0a04a7d704", + "bom-ref": "ab95ba2912726e10", "name": "/usr/share/perl/5.38.2/Test2/Hub/Interceptor/Terminator.pm", "type": "file" }, { - "bom-ref": "d554bc744070408a", + "bom-ref": "874a3eabf03eee9a", "name": "/usr/share/perl/5.38.2/Test2/Hub/Subtest.pm", "type": "file" }, { - "bom-ref": "ffec31e5f80a3eb5", + "bom-ref": "d1141aa79be127c1", "name": "/usr/share/perl/5.38.2/Test2/IPC.pm", "type": "file" }, { - "bom-ref": "77f576bfdab3d8cd", + "bom-ref": "a88a133a65b29359", "name": "/usr/share/perl/5.38.2/Test2/IPC/Driver.pm", "type": "file" }, { - "bom-ref": "2074d629698d832a", + "bom-ref": "a54d432be0a9094e", "name": "/usr/share/perl/5.38.2/Test2/IPC/Driver/Files.pm", "type": "file" }, { - "bom-ref": "d5d04668e17ac39f", + "bom-ref": "d99288ed69c7ed23", "name": "/usr/share/perl/5.38.2/Test2/Tools/Tiny.pm", "type": "file" }, { - "bom-ref": "cea9a908acff1d32", + "bom-ref": "d31c58f7883d4e56", "name": "/usr/share/perl/5.38.2/Test2/Transition.pod", "type": "file" }, { - "bom-ref": "e8a2cd2c9180ad75", + "bom-ref": "88561140a9834389", "name": "/usr/share/perl/5.38.2/Test2/Util.pm", "type": "file" }, { - "bom-ref": "c70d46a26b725127", + "bom-ref": "24fdea62ea9d7a7f", "name": "/usr/share/perl/5.38.2/Test2/Util/ExternalMeta.pm", "type": "file" }, { - "bom-ref": "aadd75dbb7a9d8f6", + "bom-ref": "5fc9e599db3c2b4e", "name": "/usr/share/perl/5.38.2/Test2/Util/Facets2Legacy.pm", "type": "file" }, { - "bom-ref": "2fc4eab051208595", + "bom-ref": "ff4c25dc22114595", "name": "/usr/share/perl/5.38.2/Test2/Util/HashBase.pm", "type": "file" }, { - "bom-ref": "5b98a87589ab68de", + "bom-ref": "f86c8f67d4cdf4b2", "name": "/usr/share/perl/5.38.2/Test2/Util/Trace.pm", "type": "file" }, { - "bom-ref": "5af69608fb9def6f", + "bom-ref": "b1d86b2517e26e93", "name": "/usr/share/perl/5.38.2/Text/Abbrev.pm", "type": "file" }, { - "bom-ref": "10f244b1979d8a5a", + "bom-ref": "993372f7aa4cefc6", "name": "/usr/share/perl/5.38.2/Text/Balanced.pm", "type": "file" }, { - "bom-ref": "c8b497a312f0d428", + "bom-ref": "338c18a14417b988", "name": "/usr/share/perl/5.38.2/Text/ParseWords.pm", "type": "file" }, { - "bom-ref": "aa44abf3afaebda0", + "bom-ref": "74eb0bdbb8007d0c", "name": "/usr/share/perl/5.38.2/Text/Tabs.pm", "type": "file" }, { - "bom-ref": "dd38e91031dfe154", + "bom-ref": "016aaf2c000e1280", "name": "/usr/share/perl/5.38.2/Text/Wrap.pm", "type": "file" }, { - "bom-ref": "e0c47a7a2ac04532", + "bom-ref": "0e2cac822cf6244e", "name": "/usr/share/perl/5.38.2/Thread.pm", "type": "file" }, { - "bom-ref": "98d713eda0769a17", + "bom-ref": "67205799d170f5bb", "name": "/usr/share/perl/5.38.2/Thread/Queue.pm", "type": "file" }, { - "bom-ref": "e5bbfbc2dd7dff0c", + "bom-ref": "d6c4ca969c2b0324", "name": "/usr/share/perl/5.38.2/Thread/Semaphore.pm", "type": "file" }, { - "bom-ref": "1550686e574c9a6f", + "bom-ref": "708955bce41db277", "name": "/usr/share/perl/5.38.2/Tie/Array.pm", "type": "file" }, { - "bom-ref": "c3e2b96be1b6607f", + "bom-ref": "4436b6b4411d2a23", "name": "/usr/share/perl/5.38.2/Tie/File.pm", "type": "file" }, { - "bom-ref": "25ad85b3bb873f3d", + "bom-ref": "654080896ff16895", "name": "/usr/share/perl/5.38.2/Tie/Handle.pm", "type": "file" }, { - "bom-ref": "957035def9c3e373", + "bom-ref": "7226cd0ee7954653", "name": "/usr/share/perl/5.38.2/Tie/Hash.pm", "type": "file" }, { - "bom-ref": "ae7dc110900f34b6", + "bom-ref": "5095ca3d026a65ae", "name": "/usr/share/perl/5.38.2/Tie/Hash/NamedCapture.pm", "type": "file" }, { - "bom-ref": "18f24e3dd6dae544", + "bom-ref": "1a894bfc33e75288", "name": "/usr/share/perl/5.38.2/Tie/Memoize.pm", "type": "file" }, { - "bom-ref": "abfcd880742f064e", + "bom-ref": "2b8f2c1144cf2ce6", "name": "/usr/share/perl/5.38.2/Tie/RefHash.pm", "type": "file" }, { - "bom-ref": "6a09f47dd3cb97e0", + "bom-ref": "8381711f2a4931e4", "name": "/usr/share/perl/5.38.2/Tie/Scalar.pm", "type": "file" }, { - "bom-ref": "48304e3793addaaa", + "bom-ref": "3f42eea647d87a42", "name": "/usr/share/perl/5.38.2/Tie/StdHandle.pm", "type": "file" }, { - "bom-ref": "10041e2f2ea7aee9", + "bom-ref": "31212a7aca3b0e45", "name": "/usr/share/perl/5.38.2/Tie/SubstrHash.pm", "type": "file" }, { - "bom-ref": "96a5d974673e492b", + "bom-ref": "c0e1ea18606fe81b", "name": "/usr/share/perl/5.38.2/Time/Local.pm", "type": "file" }, { - "bom-ref": "7dd9bc8581908733", + "bom-ref": "5d4d89cd521d479f", "name": "/usr/share/perl/5.38.2/Time/gmtime.pm", "type": "file" }, { - "bom-ref": "bcc9a9dc7f36a026", + "bom-ref": "6d29b03d9b16f482", "name": "/usr/share/perl/5.38.2/Time/localtime.pm", "type": "file" }, { - "bom-ref": "6dba3df4ff3d4eed", + "bom-ref": "685cc7c98f1cf551", "name": "/usr/share/perl/5.38.2/Time/tm.pm", "type": "file" }, { - "bom-ref": "bd165212f220eb6d", + "bom-ref": "8f52ac4eb3181e4d", "name": "/usr/share/perl/5.38.2/UNIVERSAL.pm", "type": "file" }, { - "bom-ref": "be7c43865664a271", + "bom-ref": "84cb4c5f7b0f7d61", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/Big5.pm", "type": "file" }, { - "bom-ref": "54f93098284e4638", + "bom-ref": "19265e4bbf126a28", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/GB2312.pm", "type": "file" }, { - "bom-ref": "505a35620ee721f5", + "bom-ref": "ab4083feb7cedb39", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/JISX0208.pm", "type": "file" }, { - "bom-ref": "13f74f2d8f40366e", + "bom-ref": "dbf27d78dcd41676", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/Korean.pm", "type": "file" }, { - "bom-ref": "1712bb83dd5494c8", + "bom-ref": "89085f9782660f00", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/Pinyin.pm", "type": "file" }, { - "bom-ref": "4f81e98248a231b5", + "bom-ref": "174153118826cb61", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/Stroke.pm", "type": "file" }, { - "bom-ref": "b5211e3858564ddd", + "bom-ref": "d5d31282100630e1", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/Zhuyin.pm", "type": "file" }, { - "bom-ref": "9bbcc4faaa673c83", + "bom-ref": "7bf7dd18419f0887", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/af.pl", "type": "file" }, { - "bom-ref": "5faa43f3c41925e0", + "bom-ref": "26a59007cfcc92b8", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ar.pl", "type": "file" }, { - "bom-ref": "f0a457e061e832f2", + "bom-ref": "4ac71390ab28a702", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/as.pl", "type": "file" }, { - "bom-ref": "37299a0cc3025c13", + "bom-ref": "0ec94006ceece3db", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/az.pl", "type": "file" }, { - "bom-ref": "596c3acb440117f5", + "bom-ref": "e3a9a37f0b4868e5", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/be.pl", "type": "file" }, { - "bom-ref": "b5035b97cf6a477a", + "bom-ref": "b285cfb36853ba12", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/bn.pl", "type": "file" }, { - "bom-ref": "4f840f14c5c952e6", + "bom-ref": "816c069949fad2ba", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ca.pl", "type": "file" }, { - "bom-ref": "600235a074275f16", + "bom-ref": "ea62699446d3ca7e", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/cs.pl", "type": "file" }, { - "bom-ref": "b428c620b6458cb6", + "bom-ref": "d49e4bcc45240e36", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/cu.pl", "type": "file" }, { - "bom-ref": "d7695cc635a9fecf", + "bom-ref": "56883fa90886e74f", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/cy.pl", "type": "file" }, { - "bom-ref": "38e3757e153522a4", + "bom-ref": "a17e4f958345b5d4", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/da.pl", "type": "file" }, { - "bom-ref": "8f79562682d7f7c0", + "bom-ref": "153dc7e3581dd2b0", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/de_at_ph.pl", "type": "file" }, { - "bom-ref": "deed7260f35dec0b", + "bom-ref": "568097a60c919ab3", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/de_phone.pl", "type": "file" }, { - "bom-ref": "3187af4a2ffa12ca", + "bom-ref": "079958462dd19d1a", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/dsb.pl", "type": "file" }, { - "bom-ref": "964378413608cbad", + "bom-ref": "d75200041a8c9ce1", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ee.pl", "type": "file" }, { - "bom-ref": "59f96920a82d6d9b", + "bom-ref": "ef357d577de8349b", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/eo.pl", "type": "file" }, { - "bom-ref": "f14312534567dd27", + "bom-ref": "36897fc1d0ec3563", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/es.pl", "type": "file" }, { - "bom-ref": "75139acc768d5ec4", + "bom-ref": "20aec52c2fdc2628", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/es_trad.pl", "type": "file" }, { - "bom-ref": "5323e1d9290269a4", + "bom-ref": "124f2c89e2559574", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/et.pl", "type": "file" }, { - "bom-ref": "014760c5c630b326", + "bom-ref": "b3dda443f36784fa", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fa.pl", "type": "file" }, { - "bom-ref": "9fdd6a4b8ba8e5cc", + "bom-ref": "17d71f015d9b2fa8", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fi.pl", "type": "file" }, { - "bom-ref": "8f5032098dc92581", + "bom-ref": "e41062c3dbe12efd", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fi_phone.pl", "type": "file" }, { - "bom-ref": "60694adaa911ff2e", + "bom-ref": "36c4e7cca5e2d0e6", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fil.pl", "type": "file" }, { - "bom-ref": "3cb34fdecc619e85", + "bom-ref": "2d74f9487449f1b9", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fo.pl", "type": "file" }, { - "bom-ref": "b24fcfc72ba8f2a1", + "bom-ref": "ad5a34cd6490b291", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fr_ca.pl", "type": "file" }, { - "bom-ref": "b562dd921b620c62", + "bom-ref": "222a2b3dc823ef12", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/gu.pl", "type": "file" }, { - "bom-ref": "ff7e3e551f29f9fe", + "bom-ref": "78fbec29d25ca476", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ha.pl", "type": "file" }, { - "bom-ref": "ebc344972b4667cc", + "bom-ref": "cab529ded23a7a20", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/haw.pl", "type": "file" }, { - "bom-ref": "698cfa9ed07cd739", + "bom-ref": "f80248fbe3f48a25", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/he.pl", "type": "file" }, { - "bom-ref": "7cc8d95412c6da7f", + "bom-ref": "d892cce74d41c0f7", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/hi.pl", "type": "file" }, { - "bom-ref": "4385b2d026700061", + "bom-ref": "6331795b00441a29", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/hr.pl", "type": "file" }, { - "bom-ref": "0e38e61d58cb7764", + "bom-ref": "7f3b900f01595ab0", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/hu.pl", "type": "file" }, { - "bom-ref": "0511d135aa5db774", + "bom-ref": "6daff757f4868454", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/hy.pl", "type": "file" }, { - "bom-ref": "d4e3ed9903b0ce79", + "bom-ref": "6aca303dc9cf7ce5", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ig.pl", "type": "file" }, { - "bom-ref": "08a22c9cd5d1d85e", + "bom-ref": "934de1fe0b69af46", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/is.pl", "type": "file" }, { - "bom-ref": "199f83061d89c4e1", + "bom-ref": "d1f1185186d5eea1", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ja.pl", "type": "file" }, { - "bom-ref": "64f7e504762e0a8f", + "bom-ref": "466fc65d1ee340cf", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/kk.pl", "type": "file" }, { - "bom-ref": "d241de382480d954", + "bom-ref": "12d70404536dda6c", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/kl.pl", "type": "file" }, { - "bom-ref": "e6ba7f4017d62c1d", + "bom-ref": "838bd792c7ee0249", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/kn.pl", "type": "file" }, { - "bom-ref": "8975ecb29d0ca2f7", + "bom-ref": "d66f98e1260efb67", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ko.pl", "type": "file" }, { - "bom-ref": "155079d2ea5fd0ee", + "bom-ref": "53cc8c21a0afe34a", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/kok.pl", "type": "file" }, { - "bom-ref": "a6c1dfb3efb31e27", + "bom-ref": "13453b6235184a67", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/lkt.pl", "type": "file" }, { - "bom-ref": "f160cf546a2baffc", + "bom-ref": "4f51269b4f3595c4", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ln.pl", "type": "file" }, { - "bom-ref": "42fbea0a60109c7e", + "bom-ref": "e7a183705553d7fe", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/lt.pl", "type": "file" }, { - "bom-ref": "fd5bebd7a05f1d03", + "bom-ref": "16f1636d69bf34ff", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/lv.pl", "type": "file" }, { - "bom-ref": "e13467d365831175", + "bom-ref": "e5be5874cfac77dd", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/mk.pl", "type": "file" }, { - "bom-ref": "01713dd5aa426e6c", + "bom-ref": "21ed79b6da3972f4", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ml.pl", "type": "file" }, { - "bom-ref": "b88592e75c48e6c5", + "bom-ref": "a22e516e7f94b839", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/mr.pl", "type": "file" }, { - "bom-ref": "0c9881830e8e9633", + "bom-ref": "e8ebd9811924d15b", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/mt.pl", "type": "file" }, { - "bom-ref": "351b808d983ae832", + "bom-ref": "cc73b0475c358ffa", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/nb.pl", "type": "file" }, { - "bom-ref": "693cd610bef0fee1", + "bom-ref": "99e5d6e67361b781", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/nn.pl", "type": "file" }, { - "bom-ref": "40de0983e226a95c", + "bom-ref": "bf0ee311fff244f4", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/nso.pl", "type": "file" }, { - "bom-ref": "47fd3e62f592f824", + "bom-ref": "bcdaa125016e4d88", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/om.pl", "type": "file" }, { - "bom-ref": "6bb521ae619d8021", + "bom-ref": "ed22bb80f072ef25", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/or.pl", "type": "file" }, { - "bom-ref": "db7b0b7d9ebd5285", + "bom-ref": "9e653cd7d77e9db1", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/pa.pl", "type": "file" }, { - "bom-ref": "7d77a44c2b614d25", + "bom-ref": "fd82bcfe9f1b13c9", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/pl.pl", "type": "file" }, { - "bom-ref": "2902fc634aea8786", + "bom-ref": "fd4bfc06a8ffcd56", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ro.pl", "type": "file" }, { - "bom-ref": "372e86a5b7f0b0df", + "bom-ref": "d73be944e832f7fb", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sa.pl", "type": "file" }, { - "bom-ref": "c8def312135b5760", + "bom-ref": "dcea5e11e1cccaac", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/se.pl", "type": "file" }, { - "bom-ref": "ad9f706d5964d07c", + "bom-ref": "86f86b776b0f3fb0", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/si.pl", "type": "file" }, { - "bom-ref": "29241474de0763e7", + "bom-ref": "f155f811faab3577", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/si_dict.pl", "type": "file" }, { - "bom-ref": "7c4ea5e96af27161", + "bom-ref": "7461ace7aa1dd971", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sk.pl", "type": "file" }, { - "bom-ref": "926b4c823e794fcf", + "bom-ref": "e61150b3dd864077", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sl.pl", "type": "file" }, { - "bom-ref": "950c1acf2016e0f0", + "bom-ref": "95a0370f165093e8", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sq.pl", "type": "file" }, { - "bom-ref": "1fda486d9a0917b1", + "bom-ref": "cff8b850fa6207b1", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sr.pl", "type": "file" }, { - "bom-ref": "a0e8ae2c5a06b483", + "bom-ref": "a0d5ca7314f03103", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sv.pl", "type": "file" }, { - "bom-ref": "033ed57325ea0e2e", + "bom-ref": "688c1347524b4d72", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sv_refo.pl", "type": "file" }, { - "bom-ref": "283b7ba1907f84ac", + "bom-ref": "0d1b6ad591778ce8", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ta.pl", "type": "file" }, { - "bom-ref": "8732deb0ff365729", + "bom-ref": "b899e9e80c9299c5", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/te.pl", "type": "file" }, { - "bom-ref": "45635abed127af82", + "bom-ref": "4de67b8b2f6e07de", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/th.pl", "type": "file" }, { - "bom-ref": "215dd46f67b479bf", + "bom-ref": "7b68b6a4b5db1927", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/tn.pl", "type": "file" }, { - "bom-ref": "ba0740eea2731525", + "bom-ref": "e5889c3c20c4d181", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/to.pl", "type": "file" }, { - "bom-ref": "1d4b8d95ef1018f5", + "bom-ref": "bd88ec5f2afadc91", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/tr.pl", "type": "file" }, { - "bom-ref": "2c3333a50c1594e1", + "bom-ref": "56b0ce54f720099d", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ug_cyrl.pl", "type": "file" }, { - "bom-ref": "d753327c72f95ae7", + "bom-ref": "10eb6e3f552cdfc3", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/uk.pl", "type": "file" }, { - "bom-ref": "e391960e7e9ed096", + "bom-ref": "af66e697cfc58e7a", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ur.pl", "type": "file" }, { - "bom-ref": "532b89fe94cef188", + "bom-ref": "a95f9a0189d2d5d4", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/vi.pl", "type": "file" }, { - "bom-ref": "d900a797f559bf25", + "bom-ref": "b333e59e04dea4ad", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/vo.pl", "type": "file" }, { - "bom-ref": "516034eec671483a", + "bom-ref": "a58ad68d7ced60a2", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/wae.pl", "type": "file" }, { - "bom-ref": "9830f9693557674b", + "bom-ref": "40c7967521e80023", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/wo.pl", "type": "file" }, { - "bom-ref": "5a26d35e87e5c317", + "bom-ref": "40701912df9dad3b", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/yo.pl", "type": "file" }, { - "bom-ref": "b0b46f7ed4b8d4ff", + "bom-ref": "646704c1869ba353", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh.pl", "type": "file" }, { - "bom-ref": "d253694674606cb0", + "bom-ref": "4bd3b2165a493258", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh_big5.pl", "type": "file" }, { - "bom-ref": "541638f59c6d7853", + "bom-ref": "c43f92bb16a04f57", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh_gb.pl", "type": "file" }, { - "bom-ref": "a2ffa4d45a5c9f9f", + "bom-ref": "7eceea42f8eb6d43", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh_pin.pl", "type": "file" }, { - "bom-ref": "848da63fb0f768eb", + "bom-ref": "f099c57cbb1cc97f", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh_strk.pl", "type": "file" }, { - "bom-ref": "f1ba557cc81e7268", + "bom-ref": "ea7d87e5872ad154", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh_zhu.pl", "type": "file" }, { - "bom-ref": "978026d986c34e80", + "bom-ref": "8df27c173d926fe0", "name": "/usr/share/perl/5.38.2/Unicode/Collate/allkeys.txt", "type": "file" }, { - "bom-ref": "83d3f08d1b1679b3", + "bom-ref": "97c2e072c3775d47", "name": "/usr/share/perl/5.38.2/Unicode/Collate/keys.txt", "type": "file" }, { - "bom-ref": "677b0f11fedc7d30", + "bom-ref": "e536bc34a8a1bb9c", "name": "/usr/share/perl/5.38.2/Unicode/UCD.pm", "type": "file" }, { - "bom-ref": "c13022acf9e37bfb", + "bom-ref": "0edacb130a92ec67", "name": "/usr/share/perl/5.38.2/User/grent.pm", "type": "file" }, { - "bom-ref": "49f22aa4793a4ddd", + "bom-ref": "ce8fa06eb2733a15", "name": "/usr/share/perl/5.38.2/User/pwent.pm", "type": "file" }, { - "bom-ref": "ebff62110ce09d39", + "bom-ref": "67947b7e643c0951", "name": "/usr/share/perl/5.38.2/XSLoader.pm", "type": "file" }, { - "bom-ref": "7244d3c25652809c", + "bom-ref": "b6e33f005f134724", "name": "/usr/share/perl/5.38.2/_charnames.pm", "type": "file" }, { - "bom-ref": "485651e50e71ebda", + "bom-ref": "250a4adb67ebbf12", "name": "/usr/share/perl/5.38.2/autodie.pm", "type": "file" }, { - "bom-ref": "c3bb181db1e1f6e9", + "bom-ref": "269af56d6e973801", "name": "/usr/share/perl/5.38.2/autodie/Scope/Guard.pm", "type": "file" }, { - "bom-ref": "69a268df69ec4622", + "bom-ref": "f9970e7a6ce9f5c2", "name": "/usr/share/perl/5.38.2/autodie/Scope/GuardStack.pm", "type": "file" }, { - "bom-ref": "cf6b007ddc581070", + "bom-ref": "dbe848e06a38f42c", "name": "/usr/share/perl/5.38.2/autodie/Util.pm", "type": "file" }, { - "bom-ref": "dc24d9079138a821", + "bom-ref": "ffdf3a475a5baf01", "name": "/usr/share/perl/5.38.2/autodie/exception.pm", "type": "file" }, { - "bom-ref": "16558bceccf6f4be", + "bom-ref": "06e97728aae80d5a", "name": "/usr/share/perl/5.38.2/autodie/exception/system.pm", "type": "file" }, { - "bom-ref": "e0d42d50410ee573", + "bom-ref": "8e74a7b02b6a0c5b", "name": "/usr/share/perl/5.38.2/autodie/hints.pm", "type": "file" }, { - "bom-ref": "a776bbcc136245b5", + "bom-ref": "400d408884963621", "name": "/usr/share/perl/5.38.2/autodie/skip.pm", "type": "file" }, { - "bom-ref": "fd98dff5ded5b54e", + "bom-ref": "1f793ec3b8fb0006", "name": "/usr/share/perl/5.38.2/autouse.pm", "type": "file" }, { - "bom-ref": "22ac048dbfba6f3f", + "bom-ref": "f8892aef99579b93", "name": "/usr/share/perl/5.38.2/base.pm", "type": "file" }, { - "bom-ref": "992e75346ef602ae", + "bom-ref": "45cf86309446f3a2", "name": "/usr/share/perl/5.38.2/bigfloat.pm", "type": "file" }, { - "bom-ref": "464d94b20a92fffa", + "bom-ref": "92f0f2a4e3cdfc2e", "name": "/usr/share/perl/5.38.2/bigint.pm", "type": "file" }, { - "bom-ref": "a141feff01884258", + "bom-ref": "71f2e9e291e6e02c", "name": "/usr/share/perl/5.38.2/bignum.pm", "type": "file" }, { - "bom-ref": "70023bf7d46702a6", + "bom-ref": "2b58557912618ec6", "name": "/usr/share/perl/5.38.2/bigrat.pm", "type": "file" }, { - "bom-ref": "07aa61bd81c3ee64", + "bom-ref": "389ca3079883cba8", "name": "/usr/share/perl/5.38.2/blib.pm", "type": "file" }, { - "bom-ref": "dd89fc45551619e6", + "bom-ref": "2089d9b64e4c1fd2", "name": "/usr/share/perl/5.38.2/builtin.pm", "type": "file" }, { - "bom-ref": "51a44eec4f4837b9", + "bom-ref": "a5d04de373dfa12d", "name": "/usr/share/perl/5.38.2/bytes.pm", "type": "file" }, { - "bom-ref": "3d20e6e1b0330e0f", + "bom-ref": "e512138da14633eb", "name": "/usr/share/perl/5.38.2/bytes_heavy.pl", "type": "file" }, { - "bom-ref": "76e6bb5284059172", + "bom-ref": "f703e3c99acdb722", "name": "/usr/share/perl/5.38.2/charnames.pm", "type": "file" }, { - "bom-ref": "801e8751ad45cd38", + "bom-ref": "a0c7b79ec90f8f44", "name": "/usr/share/perl/5.38.2/constant.pm", "type": "file" }, { - "bom-ref": "de19c04cc5fbdc05", + "bom-ref": "875e1ee8f8513371", "name": "/usr/share/perl/5.38.2/deprecate.pm", "type": "file" }, { - "bom-ref": "c0adf20347663229", + "bom-ref": "7ef4db0329791b55", "name": "/usr/share/perl/5.38.2/diagnostics.pm", "type": "file" }, { - "bom-ref": "2f0b228ba3acac54", + "bom-ref": "25636e190e014068", "name": "/usr/share/perl/5.38.2/dumpvar.pl", "type": "file" }, { - "bom-ref": "9755945d9d40d0fe", + "bom-ref": "d7ebeb005ec1236a", "name": "/usr/share/perl/5.38.2/encoding/warnings.pm", "type": "file" }, { - "bom-ref": "f61a3335320732b9", + "bom-ref": "ac7fe8fccec9e099", "name": "/usr/share/perl/5.38.2/experimental.pm", "type": "file" }, { - "bom-ref": "911531784141a4aa", + "bom-ref": "f23535d6099ffa76", "name": "/usr/share/perl/5.38.2/feature.pm", "type": "file" }, { - "bom-ref": "283604197f21821e", + "bom-ref": "918c33b0aefdb056", "name": "/usr/share/perl/5.38.2/fields.pm", "type": "file" }, { - "bom-ref": "9ae85cc67f2f5c85", + "bom-ref": "fc5b3f4b3bb67e61", "name": "/usr/share/perl/5.38.2/filetest.pm", "type": "file" }, { - "bom-ref": "ab3f6ea04980781f", + "bom-ref": "4ab8ec219a60c537", "name": "/usr/share/perl/5.38.2/if.pm", "type": "file" }, { - "bom-ref": "03a3cc178feb9a2e", + "bom-ref": "4d6cde694547c3ea", "name": "/usr/share/perl/5.38.2/integer.pm", "type": "file" }, { - "bom-ref": "530927212bea406e", + "bom-ref": "15c9f9aed5e103ce", "name": "/usr/share/perl/5.38.2/less.pm", "type": "file" }, { - "bom-ref": "6a98b6c608fd6ecf", + "bom-ref": "bbdb45467620f22b", "name": "/usr/share/perl/5.38.2/locale.pm", "type": "file" }, { - "bom-ref": "a44672f53cf92c3a", + "bom-ref": "96f4a3ec9000af3e", "name": "/usr/share/perl/5.38.2/meta_notation.pm", "type": "file" }, { - "bom-ref": "9ffd7b501d46d509", + "bom-ref": "a15e25905b339149", "name": "/usr/share/perl/5.38.2/ok.pm", "type": "file" }, { - "bom-ref": "21b2df7a275b47e8", + "bom-ref": "8ee34b91c9d2d6a0", "name": "/usr/share/perl/5.38.2/open.pm", "type": "file" }, { - "bom-ref": "49b419535488ba97", + "bom-ref": "c78dd4f37d1a0a03", "name": "/usr/share/perl/5.38.2/overload.pm", "type": "file" }, { - "bom-ref": "9d09942f3f40ca52", + "bom-ref": "e8f0ff86992afeea", "name": "/usr/share/perl/5.38.2/overload/numbers.pm", "type": "file" }, { - "bom-ref": "e507b663ff0d221b", + "bom-ref": "f9b20e87eadbb4c7", "name": "/usr/share/perl/5.38.2/overloading.pm", "type": "file" }, { - "bom-ref": "14b4bad6528462aa", + "bom-ref": "596dce39c80c7f6a", "name": "/usr/share/perl/5.38.2/parent.pm", "type": "file" }, { - "bom-ref": "e9d1852e41dc6945", + "bom-ref": "21496a37e3762851", "name": "/usr/share/perl/5.38.2/perl5db.pl", "type": "file" }, { - "bom-ref": "3d81b5cfe17de658", + "bom-ref": "e8ed58624a78ad74", "name": "/usr/share/perl/5.38.2/perlfaq.pm", "type": "file" }, { - "bom-ref": "1865d063646f727b", + "bom-ref": "0beb9675f3ac8cbb", "name": "/usr/share/perl/5.38.2/pod/perldiag.pod", "type": "file" }, { - "bom-ref": "f8180a4acbccc78f", + "bom-ref": "df20c95f06881843", "name": "/usr/share/perl/5.38.2/sigtrap.pm", "type": "file" }, { - "bom-ref": "5f3cbc1f9bd1e5dc", + "bom-ref": "86b1183f8380a414", "name": "/usr/share/perl/5.38.2/sort.pm", "type": "file" }, { - "bom-ref": "9a5eeabd94e3a18f", + "bom-ref": "13ddd71ffd5da7b7", "name": "/usr/share/perl/5.38.2/stable.pm", "type": "file" }, { - "bom-ref": "965616618c01aa8b", + "bom-ref": "f00815c81ededadb", "name": "/usr/share/perl/5.38.2/strict.pm", "type": "file" }, { - "bom-ref": "24f8e7612b03d01c", + "bom-ref": "dfe981aae0fa04e0", "name": "/usr/share/perl/5.38.2/subs.pm", "type": "file" }, { - "bom-ref": "e3f8eb2fd65acace", + "bom-ref": "a04241043e5fa84a", "name": "/usr/share/perl/5.38.2/unicore/Blocks.txt", "type": "file" }, { - "bom-ref": "4e8926eb85b415ea", + "bom-ref": "fa1aa56bc0f29fe6", "name": "/usr/share/perl/5.38.2/unicore/CombiningClass.pl", "type": "file" }, { - "bom-ref": "f0f705884a8c3512", + "bom-ref": "80b386ac5fd21b8a", "name": "/usr/share/perl/5.38.2/unicore/Decomposition.pl", "type": "file" }, { - "bom-ref": "ee9abb8bfe7c1ece", + "bom-ref": "18555be9a979395a", "name": "/usr/share/perl/5.38.2/unicore/Name.pl", "type": "file" }, { - "bom-ref": "d43eb602f1f2000d", + "bom-ref": "e7ae4550e0aeeb91", "name": "/usr/share/perl/5.38.2/unicore/Name.pm", "type": "file" }, { - "bom-ref": "61f097dda4116082", + "bom-ref": "abdea72c8c812dda", "name": "/usr/share/perl/5.38.2/unicore/NamedSequences.txt", "type": "file" }, { - "bom-ref": "09e3e9928a5584e0", + "bom-ref": "0292a727604c566c", "name": "/usr/share/perl/5.38.2/unicore/SpecialCasing.txt", "type": "file" }, { - "bom-ref": "4798fbee038f346e", + "bom-ref": "1f201a1205f47f16", "name": "/usr/share/perl/5.38.2/unicore/TestNorm.pl", "type": "file" }, { - "bom-ref": "ed137346c3bd02d3", + "bom-ref": "4bde6ec754e894df", "name": "/usr/share/perl/5.38.2/unicore/To/Age.pl", "type": "file" }, { - "bom-ref": "acbf6504f46f4263", + "bom-ref": "48b5607294186583", "name": "/usr/share/perl/5.38.2/unicore/To/Bc.pl", "type": "file" }, { - "bom-ref": "ff5861e0e7bb2b3a", + "bom-ref": "eb19684d207224fa", "name": "/usr/share/perl/5.38.2/unicore/To/Bmg.pl", "type": "file" }, { - "bom-ref": "166d267fcb9733be", + "bom-ref": "843f3bf6c05d222e", "name": "/usr/share/perl/5.38.2/unicore/To/Bpb.pl", "type": "file" }, { - "bom-ref": "ecf88176d19370b6", + "bom-ref": "c40672d99ed2693a", "name": "/usr/share/perl/5.38.2/unicore/To/Bpt.pl", "type": "file" }, { - "bom-ref": "1dd48a8d9723ce2d", + "bom-ref": "4da699e180745ed9", "name": "/usr/share/perl/5.38.2/unicore/To/Cf.pl", "type": "file" }, { - "bom-ref": "ff212ec339144a3c", + "bom-ref": "5e8d7ef5ffda0498", "name": "/usr/share/perl/5.38.2/unicore/To/Ea.pl", "type": "file" }, { - "bom-ref": "4e831d7e0e43aa75", + "bom-ref": "9c8490e5f75593d5", "name": "/usr/share/perl/5.38.2/unicore/To/EqUIdeo.pl", "type": "file" }, { - "bom-ref": "9225bb79ce63b06e", + "bom-ref": "6507644768c77792", "name": "/usr/share/perl/5.38.2/unicore/To/GCB.pl", "type": "file" }, { - "bom-ref": "315f6ff7a1f682f7", + "bom-ref": "76db456b4f6f9ddb", "name": "/usr/share/perl/5.38.2/unicore/To/Gc.pl", "type": "file" }, { - "bom-ref": "7a3cc241a7a79195", + "bom-ref": "33f6d17bfdfd496d", "name": "/usr/share/perl/5.38.2/unicore/To/Hst.pl", "type": "file" }, { - "bom-ref": "fd113e64a1e3d24b", + "bom-ref": "4c86999c720a70b3", "name": "/usr/share/perl/5.38.2/unicore/To/Identif2.pl", "type": "file" }, { - "bom-ref": "40a7b23d73ae35b4", + "bom-ref": "2fa5883d3f068ce8", "name": "/usr/share/perl/5.38.2/unicore/To/Identifi.pl", "type": "file" }, { - "bom-ref": "a0d3e57db105bf26", + "bom-ref": "7a3c76f3e08591f2", "name": "/usr/share/perl/5.38.2/unicore/To/InPC.pl", "type": "file" }, { - "bom-ref": "6a57488cc458ece5", + "bom-ref": "cc39b5423ab9f6f9", "name": "/usr/share/perl/5.38.2/unicore/To/InSC.pl", "type": "file" }, { - "bom-ref": "b118971a2a6ff3f7", + "bom-ref": "93b32d35ea000103", "name": "/usr/share/perl/5.38.2/unicore/To/Isc.pl", "type": "file" }, { - "bom-ref": "2291940574fc7e0a", + "bom-ref": "7a8e47fcd88e4efe", "name": "/usr/share/perl/5.38.2/unicore/To/Jg.pl", "type": "file" }, { - "bom-ref": "6f6d0d226dba7032", + "bom-ref": "fcd9b214e56d1cfa", "name": "/usr/share/perl/5.38.2/unicore/To/Jt.pl", "type": "file" }, { - "bom-ref": "68df64be102f5234", + "bom-ref": "ffc215f4c5fa4fe4", "name": "/usr/share/perl/5.38.2/unicore/To/Lb.pl", "type": "file" }, { - "bom-ref": "ca3f05abe6a7ca76", + "bom-ref": "f6e3a1f679409676", "name": "/usr/share/perl/5.38.2/unicore/To/Lc.pl", "type": "file" }, { - "bom-ref": "d80e870f7c36e519", + "bom-ref": "f0fe05b12dccf981", "name": "/usr/share/perl/5.38.2/unicore/To/NFCQC.pl", "type": "file" }, { - "bom-ref": "1c56688322a980ef", + "bom-ref": "26d9594e9625cbd3", "name": "/usr/share/perl/5.38.2/unicore/To/NFDQC.pl", "type": "file" }, { - "bom-ref": "a70845658fbb378b", + "bom-ref": "2f873a5b1d404edf", "name": "/usr/share/perl/5.38.2/unicore/To/NFKCCF.pl", "type": "file" }, { - "bom-ref": "1ef45d77363f383e", + "bom-ref": "e4f4c94d846ec9fa", "name": "/usr/share/perl/5.38.2/unicore/To/NFKCQC.pl", "type": "file" }, { - "bom-ref": "1cbff32c69ea6f34", + "bom-ref": "9cbe28ee8c112f84", "name": "/usr/share/perl/5.38.2/unicore/To/NFKDQC.pl", "type": "file" }, { - "bom-ref": "f89f25a95a0d9d0b", + "bom-ref": "c640bf435d3fcd8b", "name": "/usr/share/perl/5.38.2/unicore/To/Na1.pl", "type": "file" }, { - "bom-ref": "89378c9808d69670", + "bom-ref": "5ee7d18a638feb74", "name": "/usr/share/perl/5.38.2/unicore/To/NameAlia.pl", "type": "file" }, { - "bom-ref": "7222fa27f48c0a12", + "bom-ref": "3846c7b1bd948a4e", "name": "/usr/share/perl/5.38.2/unicore/To/Nt.pl", "type": "file" }, { - "bom-ref": "dec57139bef0cf2a", + "bom-ref": "33323078671eb22e", "name": "/usr/share/perl/5.38.2/unicore/To/Nv.pl", "type": "file" }, { - "bom-ref": "4ad303aa78d6fee6", + "bom-ref": "367cc15f81042272", "name": "/usr/share/perl/5.38.2/unicore/To/PerlDeci.pl", "type": "file" }, { - "bom-ref": "a43c0f415a738a42", + "bom-ref": "75022d5345cddef2", "name": "/usr/share/perl/5.38.2/unicore/To/SB.pl", "type": "file" }, { - "bom-ref": "c5855bcde1d158e5", + "bom-ref": "fc6002744ec78999", "name": "/usr/share/perl/5.38.2/unicore/To/Sc.pl", "type": "file" }, { - "bom-ref": "372ea10f4f2e042e", + "bom-ref": "1d98da0a4629bc46", "name": "/usr/share/perl/5.38.2/unicore/To/Scx.pl", "type": "file" }, { - "bom-ref": "d796812ea9cd1af8", + "bom-ref": "7946e60e6c456d1c", "name": "/usr/share/perl/5.38.2/unicore/To/Tc.pl", "type": "file" }, { - "bom-ref": "4b5fae83f4fbbd3e", + "bom-ref": "25f8714dad841f46", "name": "/usr/share/perl/5.38.2/unicore/To/Uc.pl", "type": "file" }, { - "bom-ref": "0af9c9338c6baa53", + "bom-ref": "ee7eef1ba1b992d7", "name": "/usr/share/perl/5.38.2/unicore/To/Vo.pl", "type": "file" }, { - "bom-ref": "db5a4193079eecda", + "bom-ref": "5da68d545367d89e", "name": "/usr/share/perl/5.38.2/unicore/To/WB.pl", "type": "file" }, { - "bom-ref": "f5e26a8ac6421a82", + "bom-ref": "2cfab3a65243051e", "name": "/usr/share/perl/5.38.2/unicore/To/_PerlLB.pl", "type": "file" }, { - "bom-ref": "63fed363971b5c3e", + "bom-ref": "88fdab7c25b2840e", "name": "/usr/share/perl/5.38.2/unicore/To/_PerlSCX.pl", "type": "file" }, { - "bom-ref": "f76bd4f75eacb413", + "bom-ref": "a723aa0d65f7a4ef", "name": "/usr/share/perl/5.38.2/unicore/UCD.pl", "type": "file" }, { - "bom-ref": "eeccbb07e73689af", + "bom-ref": "b0a8b7e370eb808b", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/NA.pl", "type": "file" }, { - "bom-ref": "20aca6162f0ea729", + "bom-ref": "a600707d422f5b61", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V100.pl", "type": "file" }, { - "bom-ref": "985f720c5a35766d", + "bom-ref": "b0608b95aa613255", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V11.pl", "type": "file" }, { - "bom-ref": "56da13ba4ea9e3bb", + "bom-ref": "6955413019fdfd5f", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V110.pl", "type": "file" }, { - "bom-ref": "b92bbc83b97a6118", + "bom-ref": "48a9cef5bc00d964", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V120.pl", "type": "file" }, { - "bom-ref": "8b44b114a1204361", + "bom-ref": "65cf4a10f75a1f41", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V130.pl", "type": "file" }, { - "bom-ref": "4e3f71fe7bedc56f", + "bom-ref": "329bf19cb93b9847", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V140.pl", "type": "file" }, { - "bom-ref": "4a819d36de2d8e65", + "bom-ref": "fc536bcf8c9dbdad", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V150.pl", "type": "file" }, { - "bom-ref": "9432b3d286c3dafa", + "bom-ref": "c9bf09cb30232122", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V20.pl", "type": "file" }, { - "bom-ref": "7d3b147667c68a6c", + "bom-ref": "a850ee8ae3011888", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V30.pl", "type": "file" }, { - "bom-ref": "83bdf4997cc4d9d2", + "bom-ref": "8ab773d0c3552452", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V31.pl", "type": "file" }, { - "bom-ref": "61eb9ab3c056857f", + "bom-ref": "1dc33e97924ac447", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V32.pl", "type": "file" }, { - "bom-ref": "b5938cb290e1048e", + "bom-ref": "ca1b6039667989ae", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V40.pl", "type": "file" }, { - "bom-ref": "bd8a8c2b24ba14b1", + "bom-ref": "12e7db3d6e7194e1", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V41.pl", "type": "file" }, { - "bom-ref": "5d13b2e0041acd11", + "bom-ref": "8188757ddfc8e611", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V50.pl", "type": "file" }, { - "bom-ref": "85ea0904f49dbb63", + "bom-ref": "341948f5bef9312b", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V51.pl", "type": "file" }, { - "bom-ref": "a123e6cd4ed48dd6", + "bom-ref": "f16e7be5af3d75ce", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V52.pl", "type": "file" }, { - "bom-ref": "3820efa2d669a285", + "bom-ref": "12690158f7c013a9", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V60.pl", "type": "file" }, { - "bom-ref": "b2813921fb2c3f97", + "bom-ref": "bfc7cc53f118c8a3", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V61.pl", "type": "file" }, { - "bom-ref": "0debfd3380dbf9c7", + "bom-ref": "1ad85b095b28f0cb", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V70.pl", "type": "file" }, { - "bom-ref": "c6dd5e2f0e4769ea", + "bom-ref": "bdeb2f219b647026", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V80.pl", "type": "file" }, { - "bom-ref": "d9f6bbe2c08ecbfb", + "bom-ref": "be3f921461000f77", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V90.pl", "type": "file" }, { - "bom-ref": "50a0fd54b56a6697", + "bom-ref": "4286f1da3ab25a77", "name": "/usr/share/perl/5.38.2/unicore/lib/Alpha/Y.pl", "type": "file" }, { - "bom-ref": "4221733328231b3f", + "bom-ref": "28b765f96761324b", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/AL.pl", "type": "file" }, { - "bom-ref": "c804f7167103a132", + "bom-ref": "90cb80bc90b1bfee", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/AN.pl", "type": "file" }, { - "bom-ref": "93c2b4a79748ad4b", + "bom-ref": "94de629a5ee7c70b", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/B.pl", "type": "file" }, { - "bom-ref": "8382d38601736a75", + "bom-ref": "af50fd88a3e08141", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/BN.pl", "type": "file" }, { - "bom-ref": "1327617f91cf41f2", + "bom-ref": "7d6bf6db4082b546", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/CS.pl", "type": "file" }, { - "bom-ref": "9b8a1b153e38b8e1", + "bom-ref": "5815453ce4ffc6ad", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/EN.pl", "type": "file" }, { - "bom-ref": "4963b613e23383b9", + "bom-ref": "d1afefdc0f21392d", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/ES.pl", "type": "file" }, { - "bom-ref": "7f9d139611e53e26", + "bom-ref": "630944c2c15f391e", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/ET.pl", "type": "file" }, { - "bom-ref": "b6c220afae6a1594", + "bom-ref": "69be872bb34c3c28", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/L.pl", "type": "file" }, { - "bom-ref": "af8450c8ecb87a4b", + "bom-ref": "d3d676e261863b1f", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/NSM.pl", "type": "file" }, { - "bom-ref": "39a4771c70992f19", + "bom-ref": "505fb3ba8fcbce05", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/ON.pl", "type": "file" }, { - "bom-ref": "3bc010854be9e5e2", + "bom-ref": "62e30680a031c95e", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/R.pl", "type": "file" }, { - "bom-ref": "2d18f4647351751f", + "bom-ref": "7588b28366f48657", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/WS.pl", "type": "file" }, { - "bom-ref": "0899480ea9d74179", + "bom-ref": "55896f012b5b6645", "name": "/usr/share/perl/5.38.2/unicore/lib/BidiC/Y.pl", "type": "file" }, { - "bom-ref": "5f1fb87035345748", + "bom-ref": "a7ccbae447e9ad1c", "name": "/usr/share/perl/5.38.2/unicore/lib/BidiM/Y.pl", "type": "file" }, { - "bom-ref": "85b41cc179fc947e", + "bom-ref": "e508aa8bee5001f6", "name": "/usr/share/perl/5.38.2/unicore/lib/Blk/NB.pl", "type": "file" }, { - "bom-ref": "34641cffa53089f0", + "bom-ref": "187572d9fe0ab6d8", "name": "/usr/share/perl/5.38.2/unicore/lib/Bpt/C.pl", "type": "file" }, { - "bom-ref": "f83b72dda7d73faf", + "bom-ref": "fccbe679dceb3687", "name": "/usr/share/perl/5.38.2/unicore/lib/Bpt/N.pl", "type": "file" }, { - "bom-ref": "9f1dfd16cf0be6c3", + "bom-ref": "6d1076c86e997297", "name": "/usr/share/perl/5.38.2/unicore/lib/Bpt/O.pl", "type": "file" }, { - "bom-ref": "434b96d19826d790", + "bom-ref": "eeacc3677af1a79c", "name": "/usr/share/perl/5.38.2/unicore/lib/CE/Y.pl", "type": "file" }, { - "bom-ref": "aca4ad855cdaefc0", + "bom-ref": "0f20e6a95830888c", "name": "/usr/share/perl/5.38.2/unicore/lib/CI/Y.pl", "type": "file" }, { - "bom-ref": "6bfe06111e48a47a", + "bom-ref": "75434360e47a0132", "name": "/usr/share/perl/5.38.2/unicore/lib/CWCF/Y.pl", "type": "file" }, { - "bom-ref": "454a771488eb0507", + "bom-ref": "6c3c1e106af4d4cf", "name": "/usr/share/perl/5.38.2/unicore/lib/CWCM/Y.pl", "type": "file" }, { - "bom-ref": "eb56ee9770f69e12", + "bom-ref": "1e350ec14e74ef9a", "name": "/usr/share/perl/5.38.2/unicore/lib/CWKCF/Y.pl", "type": "file" }, { - "bom-ref": "654fb19f486ae8e5", + "bom-ref": "3d1b616613930485", "name": "/usr/share/perl/5.38.2/unicore/lib/CWL/Y.pl", "type": "file" }, { - "bom-ref": "a98bbada5671aba1", + "bom-ref": "c1a2f313e9ccd2cd", "name": "/usr/share/perl/5.38.2/unicore/lib/CWT/Y.pl", "type": "file" }, { - "bom-ref": "3841d45c4dd8a4e7", + "bom-ref": "721a8fbdfdc6d34f", "name": "/usr/share/perl/5.38.2/unicore/lib/CWU/Y.pl", "type": "file" }, { - "bom-ref": "68381969590f0487", + "bom-ref": "de1acce388b1ff23", "name": "/usr/share/perl/5.38.2/unicore/lib/Cased/Y.pl", "type": "file" }, { - "bom-ref": "8e4f432d67d17276", + "bom-ref": "97397e02e2da064e", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/A.pl", "type": "file" }, { - "bom-ref": "a862191c71904ce8", + "bom-ref": "ae85c9baa5ab302c", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/AL.pl", "type": "file" }, { - "bom-ref": "b932949930ec8dfd", + "bom-ref": "85aadb883dc4fb3d", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/AR.pl", "type": "file" }, { - "bom-ref": "97a4ca0e0265715d", + "bom-ref": "88b9ecfeedc010b5", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/ATAR.pl", "type": "file" }, { - "bom-ref": "fe264aa7d0e2b1a8", + "bom-ref": "8f5c174d1e0d8484", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/B.pl", "type": "file" }, { - "bom-ref": "25a236cfc9b56921", + "bom-ref": "bb75d4a00a343839", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/BR.pl", "type": "file" }, { - "bom-ref": "2b105f9165d939ee", + "bom-ref": "4c320e8d6dea624a", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/DB.pl", "type": "file" }, { - "bom-ref": "824c5039e938d827", + "bom-ref": "e467a4da28f2ccbb", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/NK.pl", "type": "file" }, { - "bom-ref": "c6fb9544d15b044b", + "bom-ref": "af887b1551b717bb", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/NR.pl", "type": "file" }, { - "bom-ref": "43a52c1148ffb7ec", + "bom-ref": "cfc64ffa5fd98d98", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/OV.pl", "type": "file" }, { - "bom-ref": "03e75643696538e7", + "bom-ref": "cbe1c456cbd35937", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/VR.pl", "type": "file" }, { - "bom-ref": "285d35293fa9cecd", + "bom-ref": "74375bc12927b9fd", "name": "/usr/share/perl/5.38.2/unicore/lib/CompEx/Y.pl", "type": "file" }, { - "bom-ref": "f274f07c2401cb5a", + "bom-ref": "3c8365dc06e50f2a", "name": "/usr/share/perl/5.38.2/unicore/lib/DI/Y.pl", "type": "file" }, { - "bom-ref": "1bd0caabac7cfcaf", + "bom-ref": "be7f2796b22566c7", "name": "/usr/share/perl/5.38.2/unicore/lib/Dash/Y.pl", "type": "file" }, { - "bom-ref": "a6e1015278d84efb", + "bom-ref": "d91b6a77b58ebe07", "name": "/usr/share/perl/5.38.2/unicore/lib/Dep/Y.pl", "type": "file" }, { - "bom-ref": "95700dde88d70c0c", + "bom-ref": "c74d3398b67203d4", "name": "/usr/share/perl/5.38.2/unicore/lib/Dia/Y.pl", "type": "file" }, { - "bom-ref": "26be70f2434c8908", + "bom-ref": "366809328fadf978", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Com.pl", "type": "file" }, { - "bom-ref": "f85694e74d104a8b", + "bom-ref": "7ec2ac9c324474bf", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Enc.pl", "type": "file" }, { - "bom-ref": "91da4d802b05feb1", + "bom-ref": "80b287925dbb8ab9", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Fin.pl", "type": "file" }, { - "bom-ref": "44ef6f590e874704", + "bom-ref": "c62628e7d3364a4c", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Font.pl", "type": "file" }, { - "bom-ref": "5130ced6495d845d", + "bom-ref": "79db878baed88075", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Init.pl", "type": "file" }, { - "bom-ref": "4162e5f6504b725b", + "bom-ref": "6870c165ea97f597", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Iso.pl", "type": "file" }, { - "bom-ref": "5d41ccf2e4526e68", + "bom-ref": "692e3b80f0435b58", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Med.pl", "type": "file" }, { - "bom-ref": "e980e8b8c3a9b28c", + "bom-ref": "3b2db7b8d94a370c", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Nar.pl", "type": "file" }, { - "bom-ref": "ecb942b11f65bef3", + "bom-ref": "1e7c405bfb0f6037", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Nb.pl", "type": "file" }, { - "bom-ref": "5c7ecfca2e804fb0", + "bom-ref": "12988d5d33760330", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/NonCanon.pl", "type": "file" }, { - "bom-ref": "5e7420ac7e53b858", + "bom-ref": "717e0c4e9a209594", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Sqr.pl", "type": "file" }, { - "bom-ref": "67e5d4a897779028", + "bom-ref": "fb88cf3c8fbf9094", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Sub.pl", "type": "file" }, { - "bom-ref": "453728fd9fa61907", + "bom-ref": "aeac35ad7731895b", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Sup.pl", "type": "file" }, { - "bom-ref": "38a00366836c4057", + "bom-ref": "ec377ab3fd39ce9b", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Vert.pl", "type": "file" }, { - "bom-ref": "f7f852c00dd1bc48", + "bom-ref": "6de4519965227684", "name": "/usr/share/perl/5.38.2/unicore/lib/EBase/Y.pl", "type": "file" }, { - "bom-ref": "df23bc6c79d916ec", + "bom-ref": "faca97f2f5a551ec", "name": "/usr/share/perl/5.38.2/unicore/lib/EComp/Y.pl", "type": "file" }, { - "bom-ref": "8bae9fc432be740a", + "bom-ref": "1b409df6c96e5d46", "name": "/usr/share/perl/5.38.2/unicore/lib/EPres/Y.pl", "type": "file" }, { - "bom-ref": "d430aa76f6e47fea", + "bom-ref": "bfdeae9aa3afedba", "name": "/usr/share/perl/5.38.2/unicore/lib/Ea/A.pl", "type": "file" }, { - "bom-ref": "e19e93eadd34612b", + "bom-ref": "3d03f273f750a2db", "name": "/usr/share/perl/5.38.2/unicore/lib/Ea/H.pl", "type": "file" }, { - "bom-ref": "224dba889e88a26b", + "bom-ref": "50a14e42bbb825b3", "name": "/usr/share/perl/5.38.2/unicore/lib/Ea/N.pl", "type": "file" }, { - "bom-ref": "2146512c190a96b7", + "bom-ref": "c7c4cdabd0190c0f", "name": "/usr/share/perl/5.38.2/unicore/lib/Ea/Na.pl", "type": "file" }, { - "bom-ref": "e53bedb284330892", + "bom-ref": "807d089c12828df2", "name": "/usr/share/perl/5.38.2/unicore/lib/Ea/W.pl", "type": "file" }, { - "bom-ref": "cae64e33349fdbb8", + "bom-ref": "2ad5caec53074c34", "name": "/usr/share/perl/5.38.2/unicore/lib/Emoji/Y.pl", "type": "file" }, { - "bom-ref": "014081e050b78334", + "bom-ref": "057c2cbb098e23c8", "name": "/usr/share/perl/5.38.2/unicore/lib/Ext/Y.pl", "type": "file" }, { - "bom-ref": "2b5a36176531b201", + "bom-ref": "f8ea1f4ce2b720e9", "name": "/usr/share/perl/5.38.2/unicore/lib/ExtPict/Y.pl", "type": "file" }, { - "bom-ref": "c24aefca4057ef01", + "bom-ref": "8a98c61435fbc5d5", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/CN.pl", "type": "file" }, { - "bom-ref": "46c868a6a76e2e92", + "bom-ref": "dc37e932b21d7c6e", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/EX.pl", "type": "file" }, { - "bom-ref": "1b968c7569c42b45", + "bom-ref": "7df11194ea777c9d", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/LV.pl", "type": "file" }, { - "bom-ref": "75a5452ec4453b77", + "bom-ref": "7250525961ba8bd3", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/LVT.pl", "type": "file" }, { - "bom-ref": "a05fb007579c8469", + "bom-ref": "623d0669735ac6dd", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/PP.pl", "type": "file" }, { - "bom-ref": "02f74bd71681da02", + "bom-ref": "a400e103bb797dd2", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/SM.pl", "type": "file" }, { - "bom-ref": "962288d874097979", + "bom-ref": "61d1b718d128e2a1", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/XX.pl", "type": "file" }, { - "bom-ref": "8ee004240f0c5f63", + "bom-ref": "0cfa5bc0665df1a3", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/C.pl", "type": "file" }, { - "bom-ref": "62511b1f40ad2bbb", + "bom-ref": "ed0df7b1a5fea22f", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Cf.pl", "type": "file" }, { - "bom-ref": "f154f3f5a25d29ea", + "bom-ref": "8eddd4c3ccf60872", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Cn.pl", "type": "file" }, { - "bom-ref": "1d9e19bf0b7193c5", + "bom-ref": "d132ec966c72df6d", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/L.pl", "type": "file" }, { - "bom-ref": "7fd5cdc216731be9", + "bom-ref": "f69b8a510c18b20d", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/LC.pl", "type": "file" }, { - "bom-ref": "93924f4703caf3b3", + "bom-ref": "8c04aed4f108da0f", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Ll.pl", "type": "file" }, { - "bom-ref": "7027a33f40760692", + "bom-ref": "5897a12485cbdc12", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Lm.pl", "type": "file" }, { - "bom-ref": "8e1573f8ac6cf8cd", + "bom-ref": "13707743b1d1afb5", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Lo.pl", "type": "file" }, { - "bom-ref": "7a0a748d8df11721", + "bom-ref": "4651652d79505c41", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Lu.pl", "type": "file" }, { - "bom-ref": "bd7e325ac64694b9", + "bom-ref": "918ce148b5a39c4d", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/M.pl", "type": "file" }, { - "bom-ref": "67e71ba6e23236f3", + "bom-ref": "19e6a0c534dd79d3", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Mc.pl", "type": "file" }, { - "bom-ref": "2e81fac3b254cca9", + "bom-ref": "a9837fec2a107bed", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Me.pl", "type": "file" }, { - "bom-ref": "779f04c7e4feaa27", + "bom-ref": "d2d91c3f131fedb7", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Mn.pl", "type": "file" }, { - "bom-ref": "04a8c44e0ddf12a2", + "bom-ref": "5401721cf807f20e", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/N.pl", "type": "file" }, { - "bom-ref": "afdbdbd4e39e420b", + "bom-ref": "264ce116a74c7ee3", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Nd.pl", "type": "file" }, { - "bom-ref": "063a411f405445fc", + "bom-ref": "b8f689a6327613a4", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Nl.pl", "type": "file" }, { - "bom-ref": "74824aee9fd2796f", + "bom-ref": "bf76c2256c72c6e3", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/No.pl", "type": "file" }, { - "bom-ref": "3febb7344d59bef5", + "bom-ref": "fd765cb4e6d97899", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/P.pl", "type": "file" }, { - "bom-ref": "4695aece00e810ab", + "bom-ref": "277146395ef5fc4f", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Pc.pl", "type": "file" }, { - "bom-ref": "86deb24f08489b67", + "bom-ref": "25dfd1197dd41263", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Pd.pl", "type": "file" }, { - "bom-ref": "975fbfb138290a74", + "bom-ref": "4cafc29935347ea0", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Pe.pl", "type": "file" }, { - "bom-ref": "6ceb4f14b703b6fb", + "bom-ref": "1d64cba4d972f0df", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Pf.pl", "type": "file" }, { - "bom-ref": "2cd85263b0c3358b", + "bom-ref": "23a1200a8efc5e9f", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Pi.pl", "type": "file" }, { - "bom-ref": "d5d4ecae12313152", + "bom-ref": "a4916b8df888e372", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Po.pl", "type": "file" }, { - "bom-ref": "5d94238a40d95956", + "bom-ref": "08644e1f3fe0907e", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Ps.pl", "type": "file" }, { - "bom-ref": "f9d5794824f02c09", + "bom-ref": "f4149be3d157af89", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/S.pl", "type": "file" }, { - "bom-ref": "bad4c2c896b45d4d", + "bom-ref": "4436c34323802d59", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Sc.pl", "type": "file" }, { - "bom-ref": "ad9a2ee3312863be", + "bom-ref": "c9ae9f1c7aa9bdca", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Sk.pl", "type": "file" }, { - "bom-ref": "23b2da6a3fcd3f51", + "bom-ref": "b66f766b47ff9911", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Sm.pl", "type": "file" }, { - "bom-ref": "48c3f8e984165ce1", + "bom-ref": "03d1bf0653fd6569", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/So.pl", "type": "file" }, { - "bom-ref": "666867415d41da99", + "bom-ref": "266c33275fb94f59", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Z.pl", "type": "file" }, { - "bom-ref": "0d37b8c9ee62f835", + "bom-ref": "4a7656335b0cabed", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Zs.pl", "type": "file" }, { - "bom-ref": "f6ef1a214d3346f5", + "bom-ref": "9d9552d65d18cd15", "name": "/usr/share/perl/5.38.2/unicore/lib/GrBase/Y.pl", "type": "file" }, { - "bom-ref": "6b2374126b8cb124", + "bom-ref": "9ce6082df0d61614", "name": "/usr/share/perl/5.38.2/unicore/lib/GrExt/Y.pl", "type": "file" }, { - "bom-ref": "c53b9522383bad0e", + "bom-ref": "037570bd7ae8a692", "name": "/usr/share/perl/5.38.2/unicore/lib/Hex/Y.pl", "type": "file" }, { - "bom-ref": "99efaedd976ad197", + "bom-ref": "70c243472607d337", "name": "/usr/share/perl/5.38.2/unicore/lib/Hst/NA.pl", "type": "file" }, { - "bom-ref": "4e6bd1a03437d60d", + "bom-ref": "821be6de639ea84d", "name": "/usr/share/perl/5.38.2/unicore/lib/Hyphen/T.pl", "type": "file" }, { - "bom-ref": "15c0cdb2c803d6d5", + "bom-ref": "c928312a6840f6a5", "name": "/usr/share/perl/5.38.2/unicore/lib/IDC/Y.pl", "type": "file" }, { - "bom-ref": "12f47b8f553d1f0a", + "bom-ref": "cce23140bcf1ef16", "name": "/usr/share/perl/5.38.2/unicore/lib/IDS/Y.pl", "type": "file" }, { - "bom-ref": "eaa9668daf79beae", + "bom-ref": "7564068f6438cf6e", "name": "/usr/share/perl/5.38.2/unicore/lib/IdStatus/Allowed.pl", "type": "file" }, { - "bom-ref": "e1e8e442eaa1ef26", + "bom-ref": "db3f704d726be946", "name": "/usr/share/perl/5.38.2/unicore/lib/IdStatus/Restrict.pl", "type": "file" }, { - "bom-ref": "853b8be5c4170c91", + "bom-ref": "d6466f8838ce324d", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/DefaultI.pl", "type": "file" }, { - "bom-ref": "38a5c27a66b9de05", + "bom-ref": "72f40abb000e44ed", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Exclusio.pl", "type": "file" }, { - "bom-ref": "b72eb00c56e2276f", + "bom-ref": "a8ff652ceb7c1967", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Inclusio.pl", "type": "file" }, { - "bom-ref": "dcea02f2dfac0c9b", + "bom-ref": "231d394f7cf56bcf", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/LimitedU.pl", "type": "file" }, { - "bom-ref": "c1d1114f48638eba", + "bom-ref": "ebfccfca8841b13e", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/NotChara.pl", "type": "file" }, { - "bom-ref": "0a15ac05f75954d6", + "bom-ref": "085392991cadd6aa", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/NotNFKC.pl", "type": "file" }, { - "bom-ref": "486c48076b16e903", + "bom-ref": "68147f8964a7823b", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/NotXID.pl", "type": "file" }, { - "bom-ref": "06d320916e22e628", + "bom-ref": "24d30af57a0867a4", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Obsolete.pl", "type": "file" }, { - "bom-ref": "40422e2f14d340c5", + "bom-ref": "4567443c21cfd03d", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Recommen.pl", "type": "file" }, { - "bom-ref": "14242b4504343eed", + "bom-ref": "8010210f174ba5e1", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Technica.pl", "type": "file" }, { - "bom-ref": "4d54f7b7414a9750", + "bom-ref": "17a2d36b6f40ad3c", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Uncommon.pl", "type": "file" }, { - "bom-ref": "064b736b6b9726cc", + "bom-ref": "857939aa547410b0", "name": "/usr/share/perl/5.38.2/unicore/lib/Ideo/Y.pl", "type": "file" }, { - "bom-ref": "2de097c2a0eb7862", + "bom-ref": "054492133509e5da", "name": "/usr/share/perl/5.38.2/unicore/lib/In/10_0.pl", "type": "file" }, { - "bom-ref": "6ab592c933458db6", + "bom-ref": "0f7dc25ac1f6b2ea", "name": "/usr/share/perl/5.38.2/unicore/lib/In/11_0.pl", "type": "file" }, { - "bom-ref": "0d17084dc4035b89", + "bom-ref": "f8ea4b17f573d40d", "name": "/usr/share/perl/5.38.2/unicore/lib/In/12_0.pl", "type": "file" }, { - "bom-ref": "40660a8fe5595b44", + "bom-ref": "e8d15800295b6914", "name": "/usr/share/perl/5.38.2/unicore/lib/In/12_1.pl", "type": "file" }, { - "bom-ref": "1da581e4b7cc8e69", + "bom-ref": "ae72eea1c1be4e65", "name": "/usr/share/perl/5.38.2/unicore/lib/In/13_0.pl", "type": "file" }, { - "bom-ref": "511b8e1af56ebace", + "bom-ref": "722546a40a849c2a", "name": "/usr/share/perl/5.38.2/unicore/lib/In/14_0.pl", "type": "file" }, { - "bom-ref": "6cee23097e2f46d6", + "bom-ref": "27692ca5c9101b16", "name": "/usr/share/perl/5.38.2/unicore/lib/In/15_0.pl", "type": "file" }, { - "bom-ref": "f3a3703bb0e84a29", + "bom-ref": "725a01e368b6f4b9", "name": "/usr/share/perl/5.38.2/unicore/lib/In/2_0.pl", "type": "file" }, { - "bom-ref": "d9d74ce9994f1510", + "bom-ref": "971a30ccfbbf409c", "name": "/usr/share/perl/5.38.2/unicore/lib/In/2_1.pl", "type": "file" }, { - "bom-ref": "298959c425cfc576", + "bom-ref": "ff16540a8e533a72", "name": "/usr/share/perl/5.38.2/unicore/lib/In/3_0.pl", "type": "file" }, { - "bom-ref": "4eb00bd630d79443", + "bom-ref": "b1bdcfa191ebab9b", "name": "/usr/share/perl/5.38.2/unicore/lib/In/3_1.pl", "type": "file" }, { - "bom-ref": "1f8d78e7dea8dc01", + "bom-ref": "0f2d1a0b4bf1aa55", "name": "/usr/share/perl/5.38.2/unicore/lib/In/3_2.pl", "type": "file" }, { - "bom-ref": "59b8112e0682267f", + "bom-ref": "3c96e2d07062ff77", "name": "/usr/share/perl/5.38.2/unicore/lib/In/4_0.pl", "type": "file" }, { - "bom-ref": "271f6ab611f0fe18", + "bom-ref": "0cd3abd1b54f8960", "name": "/usr/share/perl/5.38.2/unicore/lib/In/4_1.pl", "type": "file" }, { - "bom-ref": "4bd9120615b3aa90", + "bom-ref": "5558bd1e48c10030", "name": "/usr/share/perl/5.38.2/unicore/lib/In/5_0.pl", "type": "file" }, { - "bom-ref": "6d1cbe7a6f4ca744", + "bom-ref": "8bbb23609bad04d0", "name": "/usr/share/perl/5.38.2/unicore/lib/In/5_1.pl", "type": "file" }, { - "bom-ref": "13ec07049d80ccfd", + "bom-ref": "48f229cb72b14b1d", "name": "/usr/share/perl/5.38.2/unicore/lib/In/5_2.pl", "type": "file" }, { - "bom-ref": "9ed87840a3847d98", + "bom-ref": "9c027ffa0edc3710", "name": "/usr/share/perl/5.38.2/unicore/lib/In/6_0.pl", "type": "file" }, { - "bom-ref": "a7e5145c64228f11", + "bom-ref": "5e76607bf84d4859", "name": "/usr/share/perl/5.38.2/unicore/lib/In/6_1.pl", "type": "file" }, { - "bom-ref": "7291d114f5d84d98", + "bom-ref": "0181acb6d2d11244", "name": "/usr/share/perl/5.38.2/unicore/lib/In/6_2.pl", "type": "file" }, { - "bom-ref": "cd9162a65c267dee", + "bom-ref": "76346746af4e180a", "name": "/usr/share/perl/5.38.2/unicore/lib/In/6_3.pl", "type": "file" }, { - "bom-ref": "ddea62354a153b6a", + "bom-ref": "5768129370ce5b36", "name": "/usr/share/perl/5.38.2/unicore/lib/In/7_0.pl", "type": "file" }, { - "bom-ref": "e191ba43e7f0532d", + "bom-ref": "675ddd71cfc745a1", "name": "/usr/share/perl/5.38.2/unicore/lib/In/8_0.pl", "type": "file" }, { - "bom-ref": "923d38ef8376b3b5", + "bom-ref": "8167161608cf6d01", "name": "/usr/share/perl/5.38.2/unicore/lib/In/9_0.pl", "type": "file" }, { - "bom-ref": "77f60f9559614983", + "bom-ref": "5fcd95499d8a52b7", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/Bottom.pl", "type": "file" }, { - "bom-ref": "a572f0e2dc46c223", + "bom-ref": "8a095d4da585dbb7", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/BottomAn.pl", "type": "file" }, { - "bom-ref": "4e999ba37c82ddc8", + "bom-ref": "f5e97a4c62fd38f4", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/Left.pl", "type": "file" }, { - "bom-ref": "9bb45e44603a25d0", + "bom-ref": "ffed36be47766914", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/LeftAndR.pl", "type": "file" }, { - "bom-ref": "9d5830bbbe526cc0", + "bom-ref": "fcb834a131feb9c8", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/NA.pl", "type": "file" }, { - "bom-ref": "797a3d98d17e66c9", + "bom-ref": "d6cd15765cc266cd", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/Overstru.pl", "type": "file" }, { - "bom-ref": "83a4d2ec920fec39", + "bom-ref": "a6db39da1fd58079", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/Right.pl", "type": "file" }, { - "bom-ref": "1ef0a85481421d4c", + "bom-ref": "14b00a3cce289194", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/Top.pl", "type": "file" }, { - "bom-ref": "efb2529b277b3b59", + "bom-ref": "fdffb75c4526a239", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/TopAndBo.pl", "type": "file" }, { - "bom-ref": "8e0bb313e6f152e3", + "bom-ref": "b7e411b449756ce7", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/TopAndL2.pl", "type": "file" }, { - "bom-ref": "27c3d00eced8ec0d", + "bom-ref": "8cdf15a2ae708749", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/TopAndLe.pl", "type": "file" }, { - "bom-ref": "4b88196feb15d3e5", + "bom-ref": "451e6a48173cf89d", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/TopAndRi.pl", "type": "file" }, { - "bom-ref": "a5f8ab30efc34178", + "bom-ref": "a3c0c258b00024dc", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/VisualOr.pl", "type": "file" }, { - "bom-ref": "3f1e6359721bfbab", + "bom-ref": "30ddddf06ba39117", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Avagraha.pl", "type": "file" }, { - "bom-ref": "0b53f1df9ec21782", + "bom-ref": "b4dabaa935f952b2", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Bindu.pl", "type": "file" }, { - "bom-ref": "cb554985541dd9a9", + "bom-ref": "3bc8ea7492220625", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Cantilla.pl", "type": "file" }, { - "bom-ref": "5a71dfda0a7db20d", + "bom-ref": "616df5928b096141", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona2.pl", "type": "file" }, { - "bom-ref": "a37a32adc6daea8b", + "bom-ref": "381c115a22a6e34b", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona3.pl", "type": "file" }, { - "bom-ref": "14c0a03cc50dbfb8", + "bom-ref": "e66b11509b18863c", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona4.pl", "type": "file" }, { - "bom-ref": "bfc68188ad99eaeb", + "bom-ref": "7e9286ab74258823", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona5.pl", "type": "file" }, { - "bom-ref": "9926f8a3aab083fd", + "bom-ref": "ebdcf708a30fc1ed", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona6.pl", "type": "file" }, { - "bom-ref": "7998e935caeda13f", + "bom-ref": "d7ec8987b26b7517", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona7.pl", "type": "file" }, { - "bom-ref": "746b090c842bf11f", + "bom-ref": "4375a1120e9b5707", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona8.pl", "type": "file" }, { - "bom-ref": "0b18a9596648b4d2", + "bom-ref": "df2a1842eeaa845a", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona9.pl", "type": "file" }, { - "bom-ref": "1ae685645b6e02af", + "bom-ref": "3930a1000da830c3", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consonan.pl", "type": "file" }, { - "bom-ref": "d1a2ce0694db9662", + "bom-ref": "abf62b21636c9c5a", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Geminati.pl", "type": "file" }, { - "bom-ref": "69a59e524d61b866", + "bom-ref": "40ddc3090e4473de", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Invisibl.pl", "type": "file" }, { - "bom-ref": "c45b12c5af87558d", + "bom-ref": "c54114ffd101ed75", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Nukta.pl", "type": "file" }, { - "bom-ref": "f6301138957aa308", + "bom-ref": "a1bf15b9ed7ae8bc", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Number.pl", "type": "file" }, { - "bom-ref": "6521cd1dcb1fa21d", + "bom-ref": "b9e068910b26db7d", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Other.pl", "type": "file" }, { - "bom-ref": "c8f2663fb738dd64", + "bom-ref": "f500e7862531d0dc", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/PureKill.pl", "type": "file" }, { - "bom-ref": "bc4da2b240794bca", + "bom-ref": "c4b33fc728da5172", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Syllable.pl", "type": "file" }, { - "bom-ref": "34670ff0065c2b36", + "bom-ref": "70230825751b5742", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/ToneMark.pl", "type": "file" }, { - "bom-ref": "9d972de3fe5927b1", + "bom-ref": "3433b446f5ac078d", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Virama.pl", "type": "file" }, { - "bom-ref": "797797fbe4e9f169", + "bom-ref": "7aa11f77619a8ab1", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Visarga.pl", "type": "file" }, { - "bom-ref": "0bfbc4743403b611", + "bom-ref": "0b5ea8c0481f6e85", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Vowel.pl", "type": "file" }, { - "bom-ref": "8fbc68ee68902217", + "bom-ref": "d24ec40b18a25307", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/VowelDep.pl", "type": "file" }, { - "bom-ref": "91ca899bcbcb947b", + "bom-ref": "f56da195e9fcf00b", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/VowelInd.pl", "type": "file" }, { - "bom-ref": "e0618e25c549c59e", + "bom-ref": "db2479301a0b6de2", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Ain.pl", "type": "file" }, { - "bom-ref": "d58b2112ca86d76f", + "bom-ref": "cb3dbe9d9ae93cf7", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Alef.pl", "type": "file" }, { - "bom-ref": "997c5ef6a2fb4efe", + "bom-ref": "d33673d724e86312", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Beh.pl", "type": "file" }, { - "bom-ref": "ef95876b03ea27af", + "bom-ref": "ce58288c3bfbd7f7", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Dal.pl", "type": "file" }, { - "bom-ref": "1a554806028acebb", + "bom-ref": "04c246f8b29f9503", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/FarsiYeh.pl", "type": "file" }, { - "bom-ref": "8206d45cb76377d9", + "bom-ref": "112b1e9f97a9b975", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Feh.pl", "type": "file" }, { - "bom-ref": "8ab9a08f3e6afec7", + "bom-ref": "88d703e51ecc6f5f", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Gaf.pl", "type": "file" }, { - "bom-ref": "4356f4bbdb9ed2cc", + "bom-ref": "f614815f9d517c04", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Hah.pl", "type": "file" }, { - "bom-ref": "7b5aeb46e98784d0", + "bom-ref": "7de9d904f8af5168", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/HanifiRo.pl", "type": "file" }, { - "bom-ref": "132e83bc8d43b027", + "bom-ref": "6735b336ffe3dcc7", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Kaf.pl", "type": "file" }, { - "bom-ref": "a0285bf753a556c8", + "bom-ref": "5a16c4d21b8a02b8", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Lam.pl", "type": "file" }, { - "bom-ref": "9cba51a68a2c2c8b", + "bom-ref": "f28a7432f2cb8883", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/NoJoinin.pl", "type": "file" }, { - "bom-ref": "cd67c081ddacf305", + "bom-ref": "6778f37ca59ccfc1", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Noon.pl", "type": "file" }, { - "bom-ref": "4a503216a9fd0ece", + "bom-ref": "9efd89c83d3ea796", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Qaf.pl", "type": "file" }, { - "bom-ref": "6e0fe539af3a92a6", + "bom-ref": "097f5054f7e65f02", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Reh.pl", "type": "file" }, { - "bom-ref": "d04e420c8f11f8db", + "bom-ref": "038d8b42ef00960b", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Sad.pl", "type": "file" }, { - "bom-ref": "c33ebadff732f6d6", + "bom-ref": "d7fa2bb8f254cb36", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Seen.pl", "type": "file" }, { - "bom-ref": "0e5b0b18c7b40c6c", + "bom-ref": "f6ad37d1b2032520", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Tah.pl", "type": "file" }, { - "bom-ref": "8805634a11435acc", + "bom-ref": "dff52d910abfaba0", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Waw.pl", "type": "file" }, { - "bom-ref": "36f13da585411286", + "bom-ref": "bf98c92348b9de86", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Yeh.pl", "type": "file" }, { - "bom-ref": "3807a2325f1c1de4", + "bom-ref": "1c622cb7d033f59c", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/C.pl", "type": "file" }, { - "bom-ref": "3ba7ebbe6f3ae0d9", + "bom-ref": "c21da8621498c475", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/D.pl", "type": "file" }, { - "bom-ref": "9854fdf23bafe094", + "bom-ref": "3e056807c3a878b8", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/L.pl", "type": "file" }, { - "bom-ref": "0411482975084a5d", + "bom-ref": "3363bb255d303b69", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/R.pl", "type": "file" }, { - "bom-ref": "ac2953a132646424", + "bom-ref": "f087bbe42e235e88", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/T.pl", "type": "file" }, { - "bom-ref": "1b428b40c3ef431a", + "bom-ref": "edc745557a304a9a", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/U.pl", "type": "file" }, { - "bom-ref": "27df69d1e7ce8f2c", + "bom-ref": "b557abbbc21b66c0", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/AI.pl", "type": "file" }, { - "bom-ref": "d558da3f6647e733", + "bom-ref": "2ca13594838c2ecf", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/AL.pl", "type": "file" }, { - "bom-ref": "c985027491896e4e", + "bom-ref": "0449bdee136fa48e", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/BA.pl", "type": "file" }, { - "bom-ref": "78657fbed993a0b1", + "bom-ref": "c9c2f0e9ce4546e1", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/BB.pl", "type": "file" }, { - "bom-ref": "7bc5c41934186aaf", + "bom-ref": "eb92b58fdf7b5447", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/CJ.pl", "type": "file" }, { - "bom-ref": "a4542fb0bfded811", + "bom-ref": "1116cfca68c36c31", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/CL.pl", "type": "file" }, { - "bom-ref": "0733e9c711853f88", + "bom-ref": "cc08dd10ee175d84", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/CM.pl", "type": "file" }, { - "bom-ref": "2f10e8b2037eddb3", + "bom-ref": "017e85834e9409bb", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/EX.pl", "type": "file" }, { - "bom-ref": "5067ae87d435c6c1", + "bom-ref": "b923b9cc6781bf11", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/GL.pl", "type": "file" }, { - "bom-ref": "52e6e1d13d1c4f9a", + "bom-ref": "b32c741243ea47ea", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/ID.pl", "type": "file" }, { - "bom-ref": "3a7debcf8df74921", + "bom-ref": "a08ac3653980b57d", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/IN.pl", "type": "file" }, { - "bom-ref": "b033c62d8e5320e0", + "bom-ref": "b955f0f51569c85c", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/IS.pl", "type": "file" }, { - "bom-ref": "292dfddf86cf5856", + "bom-ref": "14cd08ff6596e726", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/NS.pl", "type": "file" }, { - "bom-ref": "a079d9be895df617", + "bom-ref": "80a69392d1ff6c37", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/NU.pl", "type": "file" }, { - "bom-ref": "177ec810c70a526b", + "bom-ref": "02b540b19e00c5db", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/OP.pl", "type": "file" }, { - "bom-ref": "ae85587daf444943", + "bom-ref": "a918ef6e99b41f0f", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/PO.pl", "type": "file" }, { - "bom-ref": "296c34ed2ffc1d8f", + "bom-ref": "f9b45fac8be80abb", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/PR.pl", "type": "file" }, { - "bom-ref": "9776c543394d50c5", + "bom-ref": "a6a4a17d52f26b11", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/QU.pl", "type": "file" }, { - "bom-ref": "a726e95ba495eb47", + "bom-ref": "fb1a051f8cc35ccf", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/SA.pl", "type": "file" }, { - "bom-ref": "92df073613e78baf", + "bom-ref": "532139a081ff5d87", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/XX.pl", "type": "file" }, { - "bom-ref": "35fe3d6bd138d821", + "bom-ref": "9de45701db73cac9", "name": "/usr/share/perl/5.38.2/unicore/lib/Lower/Y.pl", "type": "file" }, { - "bom-ref": "d4f26d77e9c8135e", + "bom-ref": "2eda8b78d661c8ba", "name": "/usr/share/perl/5.38.2/unicore/lib/Math/Y.pl", "type": "file" }, { - "bom-ref": "adf0a4ea5593eb61", + "bom-ref": "aa318d9dd7cd6bd5", "name": "/usr/share/perl/5.38.2/unicore/lib/NFCQC/M.pl", "type": "file" }, { - "bom-ref": "2aa05d7e66ba1092", + "bom-ref": "9b938e4d5ce5d432", "name": "/usr/share/perl/5.38.2/unicore/lib/NFCQC/Y.pl", "type": "file" }, { - "bom-ref": "b91b14e6297f61e0", + "bom-ref": "fc3fc00578d19c24", "name": "/usr/share/perl/5.38.2/unicore/lib/NFDQC/N.pl", "type": "file" }, { - "bom-ref": "59263ac7d272fcd1", + "bom-ref": "0bebf4c11cc7e211", "name": "/usr/share/perl/5.38.2/unicore/lib/NFDQC/Y.pl", "type": "file" }, { - "bom-ref": "70255ea177c84f40", + "bom-ref": "50a4cffab525aa00", "name": "/usr/share/perl/5.38.2/unicore/lib/NFKCQC/N.pl", "type": "file" }, { - "bom-ref": "c176ce0f5bb32796", + "bom-ref": "08919b7364bfe432", "name": "/usr/share/perl/5.38.2/unicore/lib/NFKCQC/Y.pl", "type": "file" }, { - "bom-ref": "7cc9d04a8110f043", + "bom-ref": "9b317d6ed5e83c1f", "name": "/usr/share/perl/5.38.2/unicore/lib/NFKDQC/N.pl", "type": "file" }, { - "bom-ref": "2250329a1a5bc2e1", + "bom-ref": "7f36d5b38ba9f179", "name": "/usr/share/perl/5.38.2/unicore/lib/NFKDQC/Y.pl", "type": "file" }, { - "bom-ref": "fd7bb2b81670eb13", + "bom-ref": "e2e290ffb441358b", "name": "/usr/share/perl/5.38.2/unicore/lib/Nt/Di.pl", "type": "file" }, { - "bom-ref": "ba52bb9984f6ac0a", + "bom-ref": "d18e47205a2dcdfa", "name": "/usr/share/perl/5.38.2/unicore/lib/Nt/None.pl", "type": "file" }, { - "bom-ref": "c422743a4ebc330b", + "bom-ref": "da7fa559ee956ce3", "name": "/usr/share/perl/5.38.2/unicore/lib/Nt/Nu.pl", "type": "file" }, { - "bom-ref": "aa5df9da6576f49a", + "bom-ref": "a6ed1f69ba4cc202", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/0.pl", "type": "file" }, { - "bom-ref": "f1bc364fcfc4227b", + "bom-ref": "ec72f6f893ecc20b", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1.pl", "type": "file" }, { - "bom-ref": "f35ac95b1203e200", + "bom-ref": "3a25c1564a2036e0", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/10.pl", "type": "file" }, { - "bom-ref": "ebcacf3227c9074e", + "bom-ref": "10d2597742b2d91a", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/100.pl", "type": "file" }, { - "bom-ref": "b5b7c007e759d90d", + "bom-ref": "bf668d92e9262a8d", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1000.pl", "type": "file" }, { - "bom-ref": "2d60d1e2a5fa321a", + "bom-ref": "e11a1017dd8db74e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/10000.pl", "type": "file" }, { - "bom-ref": "cc45fef1f1b2b5d5", + "bom-ref": "644a90dd8d94766d", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/100000.pl", "type": "file" }, { - "bom-ref": "cec479c6644610e0", + "bom-ref": "1704ae7b72487228", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/11.pl", "type": "file" }, { - "bom-ref": "67c2286821409d3d", + "bom-ref": "3bd0608e47f4abb9", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/12.pl", "type": "file" }, { - "bom-ref": "4b52a7d2c8e5534d", + "bom-ref": "ed997e6dafe9b1d1", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/13.pl", "type": "file" }, { - "bom-ref": "7e0d2abae242efd0", + "bom-ref": "27375198f1ad5a3c", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/14.pl", "type": "file" }, { - "bom-ref": "b7758ccb5c3f5bf8", + "bom-ref": "0a1bbff2ee02b614", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/15.pl", "type": "file" }, { - "bom-ref": "e8810d511a95f9e0", + "bom-ref": "d04d3acd83dc3b00", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/16.pl", "type": "file" }, { - "bom-ref": "f13a24d2596330c4", + "bom-ref": "898166d219a661f8", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/17.pl", "type": "file" }, { - "bom-ref": "a86a5cb4901072be", + "bom-ref": "a877062125db8b5e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/18.pl", "type": "file" }, { - "bom-ref": "4952143ea1fa76fa", + "bom-ref": "08ee8817f9f1be36", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/19.pl", "type": "file" }, { - "bom-ref": "b6af24f257f02a09", + "bom-ref": "24b061770a820409", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_16.pl", "type": "file" }, { - "bom-ref": "22955f810b8965cb", + "bom-ref": "0920b076d9234d53", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_2.pl", "type": "file" }, { - "bom-ref": "7625d090177442c0", + "bom-ref": "5c791e27fd9e0a00", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_3.pl", "type": "file" }, { - "bom-ref": "d76c7f5657443100", + "bom-ref": "a16a9a50f7c4b198", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_4.pl", "type": "file" }, { - "bom-ref": "1415ab136eb5bf16", + "bom-ref": "5ebf52651d412096", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_6.pl", "type": "file" }, { - "bom-ref": "54e62da99d12551a", + "bom-ref": "eef7346082b72dd2", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_8.pl", "type": "file" }, { - "bom-ref": "9d3657a68dc41e28", + "bom-ref": "8fed2a950a539e60", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/2.pl", "type": "file" }, { - "bom-ref": "333d536e0f10dafa", + "bom-ref": "0593a46a69bab49e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/20.pl", "type": "file" }, { - "bom-ref": "a21165c123205118", + "bom-ref": "1724712abac15a44", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/200.pl", "type": "file" }, { - "bom-ref": "68094fbb38acc04a", + "bom-ref": "cd54d8695f8eaa5e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/2000.pl", "type": "file" }, { - "bom-ref": "06299a4ad7b92a82", + "bom-ref": "b2721fdbf949476a", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/20000.pl", "type": "file" }, { - "bom-ref": "1261c917114da846", + "bom-ref": "c203aad04e91fe9e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/2_3.pl", "type": "file" }, { - "bom-ref": "9fb3b9efdc6c10ff", + "bom-ref": "f4a66b22a1f07f1b", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/3.pl", "type": "file" }, { - "bom-ref": "96145acae01d3a27", + "bom-ref": "4075ed8a3c3413d7", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/30.pl", "type": "file" }, { - "bom-ref": "792bec2082218b8e", + "bom-ref": "de9695ea1b12489e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/300.pl", "type": "file" }, { - "bom-ref": "07fc0271c2ad3cfa", + "bom-ref": "d763fc482ec88b56", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/3000.pl", "type": "file" }, { - "bom-ref": "f8a91b38f22c5dac", + "bom-ref": "8c93751491082368", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/30000.pl", "type": "file" }, { - "bom-ref": "c9b2483c029846d1", + "bom-ref": "ceeab7e3647715c1", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/3_16.pl", "type": "file" }, { - "bom-ref": "907230e03a110923", + "bom-ref": "be19523218cf05ab", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/3_4.pl", "type": "file" }, { - "bom-ref": "1e537bf655ba5a18", + "bom-ref": "652d8b27f0019520", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/4.pl", "type": "file" }, { - "bom-ref": "46b638ece3fc876c", + "bom-ref": "6e1e602e991ecee0", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/40.pl", "type": "file" }, { - "bom-ref": "67f87520417e7642", + "bom-ref": "9862612d8fdcdbe6", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/400.pl", "type": "file" }, { - "bom-ref": "eebbccaa26baa13a", + "bom-ref": "41ab4dd8f5d1246e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/4000.pl", "type": "file" }, { - "bom-ref": "5eb81c5a53d0081d", + "bom-ref": "d9ebd1942f9106bd", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/40000.pl", "type": "file" }, { - "bom-ref": "a3763f7131b327cb", + "bom-ref": "5be72d5339876ef3", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/5.pl", "type": "file" }, { - "bom-ref": "90dd7623c7a92e77", + "bom-ref": "38087e9a63083f6b", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/50.pl", "type": "file" }, { - "bom-ref": "b6503dce9ff9389e", + "bom-ref": "82055def03f9ded6", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/500.pl", "type": "file" }, { - "bom-ref": "56bd0f77104714ed", + "bom-ref": "c6859a0d2684802d", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/5000.pl", "type": "file" }, { - "bom-ref": "9be26d723f03c2b7", + "bom-ref": "858a70428496fa3f", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/50000.pl", "type": "file" }, { - "bom-ref": "92ac6361f59bb31f", + "bom-ref": "e61342daab25e3d7", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/6.pl", "type": "file" }, { - "bom-ref": "f6e84080ba433140", + "bom-ref": "db2dcdffdddc1328", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/60.pl", "type": "file" }, { - "bom-ref": "47aa099fa96b1028", + "bom-ref": "2504c2a3681f4d50", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/600.pl", "type": "file" }, { - "bom-ref": "f77f4456a2e2a960", + "bom-ref": "d2862ff5ecdc1dd0", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/6000.pl", "type": "file" }, { - "bom-ref": "925dc50e8937902e", + "bom-ref": "487e159acff927a2", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/60000.pl", "type": "file" }, { - "bom-ref": "3730461549d2d455", + "bom-ref": "7a2ded87d61f1759", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/7.pl", "type": "file" }, { - "bom-ref": "2a19e2ce8a242ad2", + "bom-ref": "c6b41b1f0081c622", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/70.pl", "type": "file" }, { - "bom-ref": "b725f4e4cf3fddee", + "bom-ref": "c784d3d44ec0eb6e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/700.pl", "type": "file" }, { - "bom-ref": "2f6268aa3b350f35", + "bom-ref": "abe307c18694e7d5", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/7000.pl", "type": "file" }, { - "bom-ref": "8171dd27455a6c0f", + "bom-ref": "dbfeeeabe9b9ea57", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/70000.pl", "type": "file" }, { - "bom-ref": "c7e85c48b8e18a6a", + "bom-ref": "6113f57b528946da", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/8.pl", "type": "file" }, { - "bom-ref": "01ca0af3421fa6c4", + "bom-ref": "5b7b63ea4d091e90", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/80.pl", "type": "file" }, { - "bom-ref": "d5e1d2b1037e3d24", + "bom-ref": "aa4ebed49ff246f4", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/800.pl", "type": "file" }, { - "bom-ref": "fce4e13b7971b194", + "bom-ref": "e59916a2093b1680", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/8000.pl", "type": "file" }, { - "bom-ref": "66447363bfbc7773", + "bom-ref": "96d06dac96d831cb", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/80000.pl", "type": "file" }, { - "bom-ref": "b574c643adc8ccd3", + "bom-ref": "e96e96bbb9161de7", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/9.pl", "type": "file" }, { - "bom-ref": "b2b22b9d03ade7f4", + "bom-ref": "d797608a79426c18", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/90.pl", "type": "file" }, { - "bom-ref": "3add5fc839829ed7", + "bom-ref": "40773821d8d6b77f", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/900.pl", "type": "file" }, { - "bom-ref": "0236f9485e7fe65d", + "bom-ref": "196de8c5c2d6b6a1", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/9000.pl", "type": "file" }, { - "bom-ref": "9e08504739751fe3", + "bom-ref": "913ad10c78e1917f", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/90000.pl", "type": "file" }, { - "bom-ref": "d46268962c9a64f6", + "bom-ref": "51cca7603d1a71ee", "name": "/usr/share/perl/5.38.2/unicore/lib/PCM/Y.pl", "type": "file" }, { - "bom-ref": "ccc9617274225c0f", + "bom-ref": "3078a64be5d8cb37", "name": "/usr/share/perl/5.38.2/unicore/lib/PatSyn/Y.pl", "type": "file" }, { - "bom-ref": "4a9967c7c06b435f", + "bom-ref": "e11987006309b35b", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Alnum.pl", "type": "file" }, { - "bom-ref": "757281b02dea7ac5", + "bom-ref": "9338775629b87239", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Assigned.pl", "type": "file" }, { - "bom-ref": "1c7215bfab19ef69", + "bom-ref": "b0722190b8ded245", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Blank.pl", "type": "file" }, { - "bom-ref": "09bc7818a1be21a0", + "bom-ref": "3b4bfcc741e2b484", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Graph.pl", "type": "file" }, { - "bom-ref": "8969c19d120e6a07", + "bom-ref": "0741e934789521ef", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/PerlWord.pl", "type": "file" }, { - "bom-ref": "03b9024610f9b520", + "bom-ref": "2bd63b64dbab8ee8", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/PosixPun.pl", "type": "file" }, { - "bom-ref": "b1e1e49840c0becb", + "bom-ref": "b6a14e095cc3c8c3", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Print.pl", "type": "file" }, { - "bom-ref": "c3b9a76c9f2b08a8", + "bom-ref": "fd2f3a6a876ac3f4", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/SpacePer.pl", "type": "file" }, { - "bom-ref": "d3c6226598fd4776", + "bom-ref": "3f92b2ffefa389a2", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Title.pl", "type": "file" }, { - "bom-ref": "acc03e6e43d94130", + "bom-ref": "2586a3edaebb8e68", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Word.pl", "type": "file" }, { - "bom-ref": "6382dcd2f2a2e558", + "bom-ref": "9d1e5979911beca4", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/XPosixPu.pl", "type": "file" }, { - "bom-ref": "3e2411a58c76c660", + "bom-ref": "7b0b36c82523d774", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlAny.pl", "type": "file" }, { - "bom-ref": "2c4828728bd7145e", + "bom-ref": "04a9d067d47080fe", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlCh2.pl", "type": "file" }, { - "bom-ref": "5f01cdec7f525ed7", + "bom-ref": "98858ab9e3108233", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlCha.pl", "type": "file" }, { - "bom-ref": "a591f13c4410f5eb", + "bom-ref": "50d8553c4c759aab", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlFol.pl", "type": "file" }, { - "bom-ref": "25a57281c61f8a4e", + "bom-ref": "34a1c0abdee7296e", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlIDC.pl", "type": "file" }, { - "bom-ref": "41ee0911a94cb687", + "bom-ref": "af9efa12b806b57f", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlIDS.pl", "type": "file" }, { - "bom-ref": "1cf06b2496a2b28e", + "bom-ref": "4dfafdac8dc586b6", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlIsI.pl", "type": "file" }, { - "bom-ref": "bd1b19522cd6e08d", + "bom-ref": "5490813ab2b2b6e5", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlNch.pl", "type": "file" }, { - "bom-ref": "3f85613d9f604d65", + "bom-ref": "e92e8a3d91544775", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlPat.pl", "type": "file" }, { - "bom-ref": "6fd091d1ffc8b68c", + "bom-ref": "d5e197011a8f4740", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlPr2.pl", "type": "file" }, { - "bom-ref": "49cc2bcb4088447b", + "bom-ref": "69f7a9560830c587", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlPro.pl", "type": "file" }, { - "bom-ref": "ae2454f36f7ff4ec", + "bom-ref": "470712dea247b5d4", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlQuo.pl", "type": "file" }, { - "bom-ref": "0112aec7cb4207eb", + "bom-ref": "53c789081c19973f", "name": "/usr/share/perl/5.38.2/unicore/lib/QMark/Y.pl", "type": "file" }, { - "bom-ref": "544478d6973e38a3", + "bom-ref": "12b6ff5958d4ffaf", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/AT.pl", "type": "file" }, { - "bom-ref": "fcc3e45178e88492", + "bom-ref": "558d18fa567c5352", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/CL.pl", "type": "file" }, { - "bom-ref": "9a8cc22b8ff69951", + "bom-ref": "c7e9fe6aa5788905", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/EX.pl", "type": "file" }, { - "bom-ref": "9cfaea0ba73a2aff", + "bom-ref": "3baf8c50b890a5ef", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/FO.pl", "type": "file" }, { - "bom-ref": "0fe228185d019b7d", + "bom-ref": "6c4b8e497c9c0529", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/LE.pl", "type": "file" }, { - "bom-ref": "add04934b059d2a9", + "bom-ref": "373810369584df45", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/LO.pl", "type": "file" }, { - "bom-ref": "f87ce5d7f0edabdf", + "bom-ref": "24e07282b5a11bf3", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/NU.pl", "type": "file" }, { - "bom-ref": "eda45fd13345e1c6", + "bom-ref": "375702d4e0000ebe", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/SC.pl", "type": "file" }, { - "bom-ref": "e824d04c6d682266", + "bom-ref": "751a6698a9a54c6e", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/ST.pl", "type": "file" }, { - "bom-ref": "5414666f0d1e30cb", + "bom-ref": "a85521f689bde92f", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/Sp.pl", "type": "file" }, { - "bom-ref": "592b132045d1dd0f", + "bom-ref": "8636e2323c263d37", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/UP.pl", "type": "file" }, { - "bom-ref": "de24162d9c4fbc45", + "bom-ref": "c0c9c2adb768b3d5", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/XX.pl", "type": "file" }, { - "bom-ref": "b114ffb7a3e73f70", + "bom-ref": "d5bb305b6ec018d0", "name": "/usr/share/perl/5.38.2/unicore/lib/SD/Y.pl", "type": "file" }, { - "bom-ref": "674bfd29e98d1507", + "bom-ref": "c5fcc78613463077", "name": "/usr/share/perl/5.38.2/unicore/lib/STerm/Y.pl", "type": "file" }, { - "bom-ref": "cd89d40de86db753", + "bom-ref": "1a9a8ce7aab6f193", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Arab.pl", "type": "file" }, { - "bom-ref": "0b1af69d24dbb523", + "bom-ref": "b074d6d890e0385b", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Beng.pl", "type": "file" }, { - "bom-ref": "722a56db25562acf", + "bom-ref": "0655b42513206b6f", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Cprt.pl", "type": "file" }, { - "bom-ref": "f8d73629f9f986d4", + "bom-ref": "6f40f74ad74efc88", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Cyrl.pl", "type": "file" }, { - "bom-ref": "de30377c2876948d", + "bom-ref": "7a39fe1af558a811", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Deva.pl", "type": "file" }, { - "bom-ref": "4867f430e6e30230", + "bom-ref": "c020347b53ebabdc", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Dupl.pl", "type": "file" }, { - "bom-ref": "b07a8058d944d923", + "bom-ref": "ccb4130aa0553e63", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Geor.pl", "type": "file" }, { - "bom-ref": "70f16b672f35719d", + "bom-ref": "7fbd30a76b0fb821", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Glag.pl", "type": "file" }, { - "bom-ref": "fead55754a425e3d", + "bom-ref": "1a5f53cbf5781031", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Gong.pl", "type": "file" }, { - "bom-ref": "1bc76ecae87dffe7", + "bom-ref": "5e77b49fbf97d963", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Gonm.pl", "type": "file" }, { - "bom-ref": "18503cbca1ea81bf", + "bom-ref": "e1e85a46e0f3256f", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Gran.pl", "type": "file" }, { - "bom-ref": "dbad3e75f979f99b", + "bom-ref": "fa5dc0d4cbdf463b", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Grek.pl", "type": "file" }, { - "bom-ref": "f86c2353aca95397", + "bom-ref": "0cbb5b5a36ccb95f", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Gujr.pl", "type": "file" }, { - "bom-ref": "d78cb73c9e2512e1", + "bom-ref": "58eb72739a6aa735", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Guru.pl", "type": "file" }, { - "bom-ref": "34a368fe59c04fac", + "bom-ref": "001e0b15d8808d90", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Han.pl", "type": "file" }, { - "bom-ref": "f08382140d569cf8", + "bom-ref": "a900eaa2d942c0e8", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Hang.pl", "type": "file" }, { - "bom-ref": "6aecfffb4b828197", + "bom-ref": "01784550328e1403", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Hira.pl", "type": "file" }, { - "bom-ref": "15134a9a16e4a49d", + "bom-ref": "6c2e2d16c155238d", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Kana.pl", "type": "file" }, { - "bom-ref": "a91c47c16cb0bbbb", + "bom-ref": "61a7c754180ac843", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Knda.pl", "type": "file" }, { - "bom-ref": "75b3dd8e04c0fd36", + "bom-ref": "509b066af07d267e", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Latn.pl", "type": "file" }, { - "bom-ref": "3f8bff4c834ff866", + "bom-ref": "91680678bc2f43b2", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Limb.pl", "type": "file" }, { - "bom-ref": "97455ee7235ed203", + "bom-ref": "772f3fc68c3a8613", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Linb.pl", "type": "file" }, { - "bom-ref": "5fa46af3a0d49c63", + "bom-ref": "475e59804448e4f7", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Mlym.pl", "type": "file" }, { - "bom-ref": "e2d1c62ded965180", + "bom-ref": "976b482c8ff4bcec", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Mong.pl", "type": "file" }, { - "bom-ref": "6af44786aeaa76ab", + "bom-ref": "bbe317fa249c9e23", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Mult.pl", "type": "file" }, { - "bom-ref": "bea76afa443ba4a0", + "bom-ref": "3fcc085f629e0b2c", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Orya.pl", "type": "file" }, { - "bom-ref": "f5e95b93c9544a30", + "bom-ref": "429584b4106e63a0", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Sinh.pl", "type": "file" }, { - "bom-ref": "ce2652caf8e5ae3e", + "bom-ref": "05ef9d9e8719eaf2", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Syrc.pl", "type": "file" }, { - "bom-ref": "fd15b00a441c35d6", + "bom-ref": "56af55af7f7cc25e", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Taml.pl", "type": "file" }, { - "bom-ref": "bb0c35eaf73b5abf", + "bom-ref": "bade0534f3db8f3f", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Telu.pl", "type": "file" }, { - "bom-ref": "5b08ddd9bdfc7cbf", + "bom-ref": "61e473b84c25075f", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Zinh.pl", "type": "file" }, { - "bom-ref": "2d21e76de2a216f7", + "bom-ref": "a873abcdfdc2c50b", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Zyyy.pl", "type": "file" }, { - "bom-ref": "53bfeba69ab602c5", + "bom-ref": "bc2dbaa2e249524d", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Adlm.pl", "type": "file" }, { - "bom-ref": "129dee72fb2efefb", + "bom-ref": "9fabc40d6833c173", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Arab.pl", "type": "file" }, { - "bom-ref": "c0aa04d1a1eea61d", + "bom-ref": "6660085cbd8400b5", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Armn.pl", "type": "file" }, { - "bom-ref": "2ff0a7637079c5fe", + "bom-ref": "096d11d1f734a5c2", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Beng.pl", "type": "file" }, { - "bom-ref": "16d4364f21c14a7d", + "bom-ref": "bca4a775bac7e201", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Bhks.pl", "type": "file" }, { - "bom-ref": "97ad7a8b2892dfb7", + "bom-ref": "bb3ba9af8d9adc97", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Bopo.pl", "type": "file" }, { - "bom-ref": "978a32dc6a8da44d", + "bom-ref": "1658a0e7b1ba9975", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Cakm.pl", "type": "file" }, { - "bom-ref": "b20375fc7f4298bb", + "bom-ref": "b6544d2061c325f7", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Cham.pl", "type": "file" }, { - "bom-ref": "2d7fa9e6d65403f4", + "bom-ref": "316f05c21662469c", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Copt.pl", "type": "file" }, { - "bom-ref": "ce153e0e96bf5374", + "bom-ref": "bfcb232539f50670", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Cprt.pl", "type": "file" }, { - "bom-ref": "baddd1598306b2f3", + "bom-ref": "2107c800e65c5b0b", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Cyrl.pl", "type": "file" }, { - "bom-ref": "2a82393bae88e36e", + "bom-ref": "4c3ac3a3fc5fa342", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Deva.pl", "type": "file" }, { - "bom-ref": "6ae63c89388131ce", + "bom-ref": "c19df5bdf3056fc2", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Diak.pl", "type": "file" }, { - "bom-ref": "2c1cf849a727d4d2", + "bom-ref": "db9052d736352c32", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Dupl.pl", "type": "file" }, { - "bom-ref": "c6d837529b405e38", + "bom-ref": "cc71b197c6b573b4", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Ethi.pl", "type": "file" }, { - "bom-ref": "0d8ba24d1273378c", + "bom-ref": "f47e82dff1ca9ea0", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Geor.pl", "type": "file" }, { - "bom-ref": "8760cf0df8be883e", + "bom-ref": "f189c3d088a11ada", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Glag.pl", "type": "file" }, { - "bom-ref": "8ef171c3a5610ad9", + "bom-ref": "b3bd9f1ab2588e55", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Gong.pl", "type": "file" }, { - "bom-ref": "cba64a04592776ba", + "bom-ref": "7280aa51fb9821d6", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Gonm.pl", "type": "file" }, { - "bom-ref": "a1f5d5493a165c3a", + "bom-ref": "377b4c242f84beba", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Gran.pl", "type": "file" }, { - "bom-ref": "3f95fd147a9ed0df", + "bom-ref": "f6d4f608a7f87437", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Grek.pl", "type": "file" }, { - "bom-ref": "a3468d10c9af4582", + "bom-ref": "36e91e871d838c3a", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Gujr.pl", "type": "file" }, { - "bom-ref": "a2be73ca284c51af", + "bom-ref": "8bfa175aa3f62843", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Guru.pl", "type": "file" }, { - "bom-ref": "ce9cdeb72c2d8a87", + "bom-ref": "da95ddf680ff18e3", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Han.pl", "type": "file" }, { - "bom-ref": "7f0c3d202f3428c6", + "bom-ref": "06b18c7d7a48b40a", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Hang.pl", "type": "file" }, { - "bom-ref": "b11bc396e5c7e61b", + "bom-ref": "5d64e50b4b69f023", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Hebr.pl", "type": "file" }, { - "bom-ref": "dca643ecd9552434", + "bom-ref": "93f4011140a8859c", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Hira.pl", "type": "file" }, { - "bom-ref": "49dc876e8e608a9f", + "bom-ref": "aa200a071d67ad5f", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Hmng.pl", "type": "file" }, { - "bom-ref": "0c3c8bb63c3509b6", + "bom-ref": "8a8c29ec688b9ece", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Hmnp.pl", "type": "file" }, { - "bom-ref": "ef071ffafa992f63", + "bom-ref": "7935705b916cf91b", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Kana.pl", "type": "file" }, { - "bom-ref": "60724366969006e5", + "bom-ref": "ac3341d0a26f1329", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Khar.pl", "type": "file" }, { - "bom-ref": "8858d0dcfb219406", + "bom-ref": "620dde2f758ba28a", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Khmr.pl", "type": "file" }, { - "bom-ref": "6c1fa3199e6ecbe6", + "bom-ref": "3f3283d2ca18084a", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Khoj.pl", "type": "file" }, { - "bom-ref": "f0ed6383cb3ce928", + "bom-ref": "8ba1a81d711d3984", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Knda.pl", "type": "file" }, { - "bom-ref": "e804ff5b03695f22", + "bom-ref": "c40a0d8f1ddb455e", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Kthi.pl", "type": "file" }, { - "bom-ref": "520c7dec98489739", + "bom-ref": "792dad25f3bdd2ed", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Lana.pl", "type": "file" }, { - "bom-ref": "6c2165e369787825", + "bom-ref": "4a002e086b858671", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Lao.pl", "type": "file" }, { - "bom-ref": "1ed670dc9fb7b287", + "bom-ref": "57780bfae4d4bdcb", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Latn.pl", "type": "file" }, { - "bom-ref": "f049c8c37b2f90c9", + "bom-ref": "1b01094224108abd", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Limb.pl", "type": "file" }, { - "bom-ref": "b74bf60fdbffce42", + "bom-ref": "87c1a08e662b3aae", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Lina.pl", "type": "file" }, { - "bom-ref": "88bc090314d4e474", + "bom-ref": "12898f803b9910fc", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Linb.pl", "type": "file" }, { - "bom-ref": "66558128bc59d6e8", + "bom-ref": "51a1cac5f80df8bc", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Mlym.pl", "type": "file" }, { - "bom-ref": "533d162c17bec123", + "bom-ref": "748ddbce8165834f", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Mong.pl", "type": "file" }, { - "bom-ref": "cb8938b987adab20", + "bom-ref": "626525d6bcb6bf00", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Mult.pl", "type": "file" }, { - "bom-ref": "e3b08423137f7f77", + "bom-ref": "b83e2637f22f8d0f", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Mymr.pl", "type": "file" }, { - "bom-ref": "5fab28f27bce9af2", + "bom-ref": "a93acf27b4e32f12", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Nand.pl", "type": "file" }, { - "bom-ref": "7aa4f3836d8e1343", + "bom-ref": "a4348e5d10f2113b", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Nko.pl", "type": "file" }, { - "bom-ref": "54140a24b76bc07e", + "bom-ref": "dcb358b54a0e2a06", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Orya.pl", "type": "file" }, { - "bom-ref": "2ce903cda824ddb7", + "bom-ref": "8532d3a698e2be43", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Phlp.pl", "type": "file" }, { - "bom-ref": "39cb0a8d00ef7af7", + "bom-ref": "017ea47c7e8cc047", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Rohg.pl", "type": "file" }, { - "bom-ref": "b0ef93a4d8b68fed", + "bom-ref": "30812828e6152d5d", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Shrd.pl", "type": "file" }, { - "bom-ref": "c8dcbb14519a60ad", + "bom-ref": "96fb0a861cb57d89", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Sind.pl", "type": "file" }, { - "bom-ref": "524e817e98efe39b", + "bom-ref": "11f108d6748260db", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Sinh.pl", "type": "file" }, { - "bom-ref": "f8bf995d220c34e4", + "bom-ref": "1eca02af5547f2ec", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Syrc.pl", "type": "file" }, { - "bom-ref": "e4f3a1b5a13e57d7", + "bom-ref": "acb338fc8391c9cb", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Tagb.pl", "type": "file" }, { - "bom-ref": "c40551cf63fca653", + "bom-ref": "bea5b83ff39020bf", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Takr.pl", "type": "file" }, { - "bom-ref": "4093a39f4ee8aeac", + "bom-ref": "d8fb3b4195c3c0a8", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Talu.pl", "type": "file" }, { - "bom-ref": "698d84ad02f2456f", + "bom-ref": "08a1d262256e187b", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Taml.pl", "type": "file" }, { - "bom-ref": "d8099d09f67b8772", + "bom-ref": "0e2ffde521cf5536", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Tang.pl", "type": "file" }, { - "bom-ref": "53a00637cbece886", + "bom-ref": "faab4cd528b8ab9a", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Telu.pl", "type": "file" }, { - "bom-ref": "2a10bd1d663194b5", + "bom-ref": "91234c9599dca00d", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Thaa.pl", "type": "file" }, { - "bom-ref": "5418a6fbb7853ef3", + "bom-ref": "2805a6a4e83b25af", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Tibt.pl", "type": "file" }, { - "bom-ref": "bc7259285805fc59", + "bom-ref": "71b0c89c90b08341", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Tirh.pl", "type": "file" }, { - "bom-ref": "fa96893bb3ddd331", + "bom-ref": "4826c1f4f82d6689", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Vith.pl", "type": "file" }, { - "bom-ref": "f5ee7c00bfa5cffc", + "bom-ref": "0d922935fdcae9f0", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Xsux.pl", "type": "file" }, { - "bom-ref": "e91cc4c3eab218ea", + "bom-ref": "7425cfd0788bda46", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Yezi.pl", "type": "file" }, { - "bom-ref": "0b22795b0a1162b4", + "bom-ref": "0df4402302aa5a14", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Yi.pl", "type": "file" }, { - "bom-ref": "1e326ed62d20a64a", + "bom-ref": "2e1bcef7a39229ba", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Zinh.pl", "type": "file" }, { - "bom-ref": "30582988625db0c3", + "bom-ref": "b37acdc9bf1a48c7", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Zyyy.pl", "type": "file" }, { - "bom-ref": "c1846df0aac5e255", + "bom-ref": "10877377946860ad", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Zzzz.pl", "type": "file" }, { - "bom-ref": "a634b757b54679d4", + "bom-ref": "f4561fb18dba334c", "name": "/usr/share/perl/5.38.2/unicore/lib/Term/Y.pl", "type": "file" }, { - "bom-ref": "9dec8469d676eec6", + "bom-ref": "239e8fd2d625f31e", "name": "/usr/share/perl/5.38.2/unicore/lib/UIdeo/Y.pl", "type": "file" }, { - "bom-ref": "3f4986322bb0673d", + "bom-ref": "15a0894334549829", "name": "/usr/share/perl/5.38.2/unicore/lib/Upper/Y.pl", "type": "file" }, { - "bom-ref": "e8169c069f036f98", + "bom-ref": "01c17a883eacc588", "name": "/usr/share/perl/5.38.2/unicore/lib/VS/Y.pl", "type": "file" }, { - "bom-ref": "84ba4a4d3dfc4a63", + "bom-ref": "f247a2215d7b537b", "name": "/usr/share/perl/5.38.2/unicore/lib/Vo/R.pl", "type": "file" }, { - "bom-ref": "e29643a5a9de75e3", + "bom-ref": "7ddff96b065fafdf", "name": "/usr/share/perl/5.38.2/unicore/lib/Vo/Tr.pl", "type": "file" }, { - "bom-ref": "40823a3506622a1a", + "bom-ref": "602686c53999a94a", "name": "/usr/share/perl/5.38.2/unicore/lib/Vo/Tu.pl", "type": "file" }, { - "bom-ref": "be11856e0b3cb82a", + "bom-ref": "0ef10e6b0952b2b2", "name": "/usr/share/perl/5.38.2/unicore/lib/Vo/U.pl", "type": "file" }, { - "bom-ref": "d6aed3a83fdc8ad8", + "bom-ref": "2166914451080670", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/EX.pl", "type": "file" }, { - "bom-ref": "441bdf9d300e8f6a", + "bom-ref": "18da39b2ec89bffa", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/Extend.pl", "type": "file" }, { - "bom-ref": "a59834efdf42a21e", + "bom-ref": "0514aa00b56bcab6", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/FO.pl", "type": "file" }, { - "bom-ref": "fb317f92acd5429c", + "bom-ref": "3d7db6ba74ec68ec", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/HL.pl", "type": "file" }, { - "bom-ref": "e82541a7b891afbd", + "bom-ref": "2839afc0115733f1", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/KA.pl", "type": "file" }, { - "bom-ref": "e9af4877ae7d28b1", + "bom-ref": "ce1432f60895d491", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/LE.pl", "type": "file" }, { - "bom-ref": "ebb248e4741e27ad", + "bom-ref": "b6c8536e9a17949d", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/MB.pl", "type": "file" }, { - "bom-ref": "ffe19ddc8c3b5cb9", + "bom-ref": "5cc8bbedac145aad", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/ML.pl", "type": "file" }, { - "bom-ref": "22c9ac046e420cd5", + "bom-ref": "6b3263880d3db82d", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/MN.pl", "type": "file" }, { - "bom-ref": "35a7c52b9226fa39", + "bom-ref": "2dae6ec0829c86b1", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/NU.pl", "type": "file" }, { - "bom-ref": "50c0094f1870bddf", + "bom-ref": "886167a12ac95457", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/WSegSpac.pl", "type": "file" }, { - "bom-ref": "6ff966be0ac2eaed", + "bom-ref": "7b5edf1bfe696195", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/XX.pl", "type": "file" }, { - "bom-ref": "1ccf8fe59614696e", + "bom-ref": "0c99c4cb80c121e2", "name": "/usr/share/perl/5.38.2/unicore/lib/XIDC/Y.pl", "type": "file" }, { - "bom-ref": "b8a7a4e5aa926645", + "bom-ref": "94957c07896738a5", "name": "/usr/share/perl/5.38.2/unicore/lib/XIDS/Y.pl", "type": "file" }, { - "bom-ref": "976efbaf730bf20c", + "bom-ref": "7a3e4e8b4d77a370", "name": "/usr/share/perl/5.38.2/unicore/uni_keywords.pl", "type": "file" }, { - "bom-ref": "bd2219ef72addf8e", + "bom-ref": "3d26afc0e2625b1e", "name": "/usr/share/perl/5.38.2/unicore/version", "type": "file" }, { - "bom-ref": "8351c93ba4216609", + "bom-ref": "c922d52dbaaf62e1", "name": "/usr/share/perl/5.38.2/utf8.pm", "type": "file" }, { - "bom-ref": "31a978cda78e1e33", + "bom-ref": "bbffbcb3c21b7f9b", "name": "/usr/share/perl/5.38.2/vars.pm", "type": "file" }, { - "bom-ref": "bab11d04467a32a0", + "bom-ref": "1a4147293a5c53f8", "name": "/usr/share/perl/5.38.2/version.pm", "type": "file" }, { - "bom-ref": "e7835aafab1f6c5d", + "bom-ref": "6f4015c6b4f1f1b1", "name": "/usr/share/perl/5.38.2/version.pod", "type": "file" }, { - "bom-ref": "d9dfe30bf117a6e3", + "bom-ref": "936711a7b78104b7", "name": "/usr/share/perl/5.38.2/version/Internals.pod", "type": "file" }, { - "bom-ref": "6ce25c7cd3d751c8", + "bom-ref": "e7f507b67ac01fc0", "name": "/usr/share/perl/5.38.2/version/regex.pm", "type": "file" }, { - "bom-ref": "b2980a5730501f14", + "bom-ref": "2fe1b13159e3dd34", "name": "/usr/share/perl/5.38.2/vmsish.pm", "type": "file" }, { - "bom-ref": "aa0f10132bcb17e5", + "bom-ref": "cc9321083079f711", "name": "/usr/share/perl/5.38.2/warnings.pm", "type": "file" }, { - "bom-ref": "73b120b40d322cfe", + "bom-ref": "a2b1ec5fafddf71e", "name": "/usr/share/perl/5.38.2/warnings/register.pm", "type": "file" }, { - "bom-ref": "7fb84373c5155670", + "bom-ref": "87f7e3692856d1e2", "name": "/usr/share/perl5/Debconf/AutoSelect.pm", "type": "file" }, { - "bom-ref": "d97c613a6984a401", + "bom-ref": "4a2f642f7ce723df", "name": "/usr/share/perl5/Debconf/Base.pm", "type": "file" }, { - "bom-ref": "637a798e01a54c79", + "bom-ref": "67e258e966a0c62f", "name": "/usr/share/perl5/Debconf/Client/ConfModule.pm", "type": "file" }, { - "bom-ref": "069ac5d9e41840e0", + "bom-ref": "0750710e8a151d0e", "name": "/usr/share/perl5/Debconf/ConfModule.pm", "type": "file" }, { - "bom-ref": "00f849322f8715aa", + "bom-ref": "c2540961ef60b2dc", "name": "/usr/share/perl5/Debconf/Config.pm", "type": "file" }, { - "bom-ref": "bc892360b5a5a8cd", + "bom-ref": "6f62ed9fc53796eb", "name": "/usr/share/perl5/Debconf/Db.pm", "type": "file" }, { - "bom-ref": "925e0bdec958c06d", + "bom-ref": "3fe0625cd5c3f533", "name": "/usr/share/perl5/Debconf/DbDriver.pm", "type": "file" }, { - "bom-ref": "9ebc6a52cddcd175", + "bom-ref": "ad831ce43039d00f", "name": "/usr/share/perl5/Debconf/DbDriver/Backup.pm", "type": "file" }, { - "bom-ref": "1909a437983ee025", + "bom-ref": "1d466773a660da6b", "name": "/usr/share/perl5/Debconf/DbDriver/Cache.pm", "type": "file" }, { - "bom-ref": "7988ca14ac151057", + "bom-ref": "11f07f33df9f5ef9", "name": "/usr/share/perl5/Debconf/DbDriver/Copy.pm", "type": "file" }, { - "bom-ref": "18638ef4fc3bbb46", + "bom-ref": "a095656bc35073ac", "name": "/usr/share/perl5/Debconf/DbDriver/Debug.pm", "type": "file" }, { - "bom-ref": "7de14b678fdf5563", + "bom-ref": "b9a2a95234365bfd", "name": "/usr/share/perl5/Debconf/DbDriver/DirTree.pm", "type": "file" }, { - "bom-ref": "3064df52455e2ffe", + "bom-ref": "6328c590058a98b0", "name": "/usr/share/perl5/Debconf/DbDriver/Directory.pm", "type": "file" }, { - "bom-ref": "36660e6aa3c318d6", + "bom-ref": "10d5af188f321224", "name": "/usr/share/perl5/Debconf/DbDriver/File.pm", "type": "file" }, { - "bom-ref": "6549f5b2c7d6c995", + "bom-ref": "94a4b9ccf235d2cb", "name": "/usr/share/perl5/Debconf/DbDriver/LDAP.pm", "type": "file" }, { - "bom-ref": "8db91f5a7801d2b4", + "bom-ref": "a165a8f2c4713616", "name": "/usr/share/perl5/Debconf/DbDriver/PackageDir.pm", "type": "file" }, { - "bom-ref": "e670ab4324985a6a", + "bom-ref": "246733ccac585e10", "name": "/usr/share/perl5/Debconf/DbDriver/Pipe.pm", "type": "file" }, { - "bom-ref": "79d3ccc21695bb64", + "bom-ref": "e1aa034af97c9272", "name": "/usr/share/perl5/Debconf/DbDriver/Stack.pm", "type": "file" }, { - "bom-ref": "e0e95f1ee33f971a", + "bom-ref": "ab530fe730fef450", "name": "/usr/share/perl5/Debconf/Element.pm", "type": "file" }, { - "bom-ref": "1a573f6b7f63bda2", + "bom-ref": "e895db37b2fea8ac", "name": "/usr/share/perl5/Debconf/Element/Dialog/Boolean.pm", "type": "file" }, { - "bom-ref": "75c3f39226397c68", + "bom-ref": "7d0abd358c6ad96e", "name": "/usr/share/perl5/Debconf/Element/Dialog/Error.pm", "type": "file" }, { - "bom-ref": "66ec1cd762fa75ee", + "bom-ref": "0fb6b9d46b614978", "name": "/usr/share/perl5/Debconf/Element/Dialog/Multiselect.pm", "type": "file" }, { - "bom-ref": "30bf51d977cab023", + "bom-ref": "269b2e55cdf13f15", "name": "/usr/share/perl5/Debconf/Element/Dialog/Note.pm", "type": "file" }, { - "bom-ref": "134eea4ae92b2af7", + "bom-ref": "4ebb435445e1cdad", "name": "/usr/share/perl5/Debconf/Element/Dialog/Password.pm", "type": "file" }, { - "bom-ref": "e050c1748fbd06ac", + "bom-ref": "b0179f0c60ea6b46", "name": "/usr/share/perl5/Debconf/Element/Dialog/Progress.pm", "type": "file" }, { - "bom-ref": "a7ef3e9224a36274", + "bom-ref": "e89b9d9e32dc51c2", "name": "/usr/share/perl5/Debconf/Element/Dialog/Select.pm", "type": "file" }, { - "bom-ref": "834f9ca42d1b3d14", + "bom-ref": "c6b184b521ffdfb6", "name": "/usr/share/perl5/Debconf/Element/Dialog/String.pm", "type": "file" }, { - "bom-ref": "53065cf30b380a48", + "bom-ref": "aff10c8f3ac60c9a", "name": "/usr/share/perl5/Debconf/Element/Dialog/Text.pm", "type": "file" }, { - "bom-ref": "b76bd6ceafa89d45", + "bom-ref": "2f5bb4db907f7ba7", "name": "/usr/share/perl5/Debconf/Element/Editor/Boolean.pm", "type": "file" }, { - "bom-ref": "3869b0589b5e82eb", + "bom-ref": "f03be877f0606355", "name": "/usr/share/perl5/Debconf/Element/Editor/Error.pm", "type": "file" }, { - "bom-ref": "e30593ff1e502be3", + "bom-ref": "69178a608e0ffae5", "name": "/usr/share/perl5/Debconf/Element/Editor/Multiselect.pm", "type": "file" }, { - "bom-ref": "24296a7d842c8a49", + "bom-ref": "d1585bb809f33bbf", "name": "/usr/share/perl5/Debconf/Element/Editor/Note.pm", "type": "file" }, { - "bom-ref": "e3215f65155e440e", + "bom-ref": "0fab2034d277f030", "name": "/usr/share/perl5/Debconf/Element/Editor/Password.pm", "type": "file" }, { - "bom-ref": "e196973f135d3ac1", + "bom-ref": "3a21c045c415c5ab", "name": "/usr/share/perl5/Debconf/Element/Editor/Progress.pm", "type": "file" }, { - "bom-ref": "ac00cee7284e09f9", + "bom-ref": "3d3edd8ab65a9f47", "name": "/usr/share/perl5/Debconf/Element/Editor/Select.pm", "type": "file" }, { - "bom-ref": "0f5ebedc35eae2ac", + "bom-ref": "ed38a23560970cfe", "name": "/usr/share/perl5/Debconf/Element/Editor/String.pm", "type": "file" }, { - "bom-ref": "a92a4e1b86c46af3", + "bom-ref": "13548087ccee3aad", "name": "/usr/share/perl5/Debconf/Element/Editor/Text.pm", "type": "file" }, { - "bom-ref": "87f1476a0e0a609e", + "bom-ref": "9d9a4b1b0ed72338", "name": "/usr/share/perl5/Debconf/Element/Gnome.pm", "type": "file" }, { - "bom-ref": "95a77c4006297e29", + "bom-ref": "94168cb8df9dfe9f", "name": "/usr/share/perl5/Debconf/Element/Gnome/Boolean.pm", "type": "file" }, { - "bom-ref": "3703e1367f20456b", + "bom-ref": "4daead5976d969b5", "name": "/usr/share/perl5/Debconf/Element/Gnome/Error.pm", "type": "file" }, { - "bom-ref": "b0dc69259eec0c07", + "bom-ref": "53c9068c39ab33e5", "name": "/usr/share/perl5/Debconf/Element/Gnome/Multiselect.pm", "type": "file" }, { - "bom-ref": "aeb4ad4f88143357", + "bom-ref": "bc6f3d1228dfd941", "name": "/usr/share/perl5/Debconf/Element/Gnome/Note.pm", "type": "file" }, { - "bom-ref": "c23d3659617c6735", + "bom-ref": "01e64a2b19f23eab", "name": "/usr/share/perl5/Debconf/Element/Gnome/Password.pm", "type": "file" }, { - "bom-ref": "a36e45cca3c4138d", + "bom-ref": "175609cf2932c52b", "name": "/usr/share/perl5/Debconf/Element/Gnome/Progress.pm", "type": "file" }, { - "bom-ref": "3cbec29acdda220e", + "bom-ref": "af5aedb88e2f3538", "name": "/usr/share/perl5/Debconf/Element/Gnome/Select.pm", "type": "file" }, { - "bom-ref": "37d47f0646cffb83", + "bom-ref": "6c0bf8a9d8e69931", "name": "/usr/share/perl5/Debconf/Element/Gnome/String.pm", "type": "file" }, { - "bom-ref": "8097e9b203b52690", + "bom-ref": "60a12233a0bf8cd2", "name": "/usr/share/perl5/Debconf/Element/Gnome/Text.pm", "type": "file" }, { - "bom-ref": "8669b41c076dae42", + "bom-ref": "a56127b011f7dc38", "name": "/usr/share/perl5/Debconf/Element/Multiselect.pm", "type": "file" }, { - "bom-ref": "0245e00e85514948", + "bom-ref": "24126efb43c13b66", "name": "/usr/share/perl5/Debconf/Element/Noninteractive.pm", "type": "file" }, { - "bom-ref": "92a3574cc9fd8793", + "bom-ref": "39c13ad225c0fea5", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Boolean.pm", "type": "file" }, { - "bom-ref": "6f6278cd94b93ae9", + "bom-ref": "e8bddf31a7081823", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Error.pm", "type": "file" }, { - "bom-ref": "dd6cc6c0e16e485e", + "bom-ref": "a352f680a5a7c558", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Multiselect.pm", "type": "file" }, { - "bom-ref": "f2b304a63bf1e2b9", + "bom-ref": "79b93c9badce2c2b", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Note.pm", "type": "file" }, { - "bom-ref": "1040a8aded7b5544", + "bom-ref": "34710b4f81674dce", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Password.pm", "type": "file" }, { - "bom-ref": "56b35657ea8d7b99", + "bom-ref": "897f69e9cd2f6967", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Progress.pm", "type": "file" }, { - "bom-ref": "065a2d56e10147c0", + "bom-ref": "7d66e02ee24bfb72", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Select.pm", "type": "file" }, { - "bom-ref": "a4f711082a949ea3", + "bom-ref": "470780463f98ea01", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/String.pm", "type": "file" }, { - "bom-ref": "fc0e55e68b753635", + "bom-ref": "3ade678b47faa5c3", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Text.pm", "type": "file" }, { - "bom-ref": "587143a3773dd827", + "bom-ref": "d0d820ad99c8d5d5", "name": "/usr/share/perl5/Debconf/Element/Select.pm", "type": "file" }, { - "bom-ref": "7a258224b4af1fcd", + "bom-ref": "2e734910bcb139db", "name": "/usr/share/perl5/Debconf/Element/Teletype/Boolean.pm", "type": "file" }, { - "bom-ref": "1e68d361becdf2c0", + "bom-ref": "37ee053d4ecea8fa", "name": "/usr/share/perl5/Debconf/Element/Teletype/Error.pm", "type": "file" }, { - "bom-ref": "2b62cc73b14801ad", + "bom-ref": "d5da861e501a80a3", "name": "/usr/share/perl5/Debconf/Element/Teletype/Multiselect.pm", "type": "file" }, { - "bom-ref": "b466c26888826b0a", + "bom-ref": "766f45dbbdb75458", "name": "/usr/share/perl5/Debconf/Element/Teletype/Note.pm", "type": "file" }, { - "bom-ref": "4e0ec8fadac7b6eb", + "bom-ref": "537aa268383dc705", "name": "/usr/share/perl5/Debconf/Element/Teletype/Password.pm", "type": "file" }, { - "bom-ref": "996328698538f7a7", + "bom-ref": "0737e405fa0a4a39", "name": "/usr/share/perl5/Debconf/Element/Teletype/Progress.pm", "type": "file" }, { - "bom-ref": "6dedc2828dd62c58", + "bom-ref": "0e370c2d72514842", "name": "/usr/share/perl5/Debconf/Element/Teletype/Select.pm", "type": "file" }, { - "bom-ref": "d79489cef793e962", + "bom-ref": "8209e28027f66418", "name": "/usr/share/perl5/Debconf/Element/Teletype/String.pm", "type": "file" }, { - "bom-ref": "e8125841eaf1a41b", + "bom-ref": "98e8dae369a94dd1", "name": "/usr/share/perl5/Debconf/Element/Teletype/Text.pm", "type": "file" }, { - "bom-ref": "b38c1ec2da218077", + "bom-ref": "e70a7acdb78ca845", "name": "/usr/share/perl5/Debconf/Element/Web/Boolean.pm", "type": "file" }, { - "bom-ref": "5986588ab167f2c2", + "bom-ref": "6c330b61c583f1a4", "name": "/usr/share/perl5/Debconf/Element/Web/Error.pm", "type": "file" }, { - "bom-ref": "571fb2e2a2393a39", + "bom-ref": "2d56e828d2f97fa3", "name": "/usr/share/perl5/Debconf/Element/Web/Multiselect.pm", "type": "file" }, { - "bom-ref": "13a484f67be0142a", + "bom-ref": "091a7c86e025bf8c", "name": "/usr/share/perl5/Debconf/Element/Web/Note.pm", "type": "file" }, { - "bom-ref": "c989a68c86fe0f7f", + "bom-ref": "bbf3a243bf191d4d", "name": "/usr/share/perl5/Debconf/Element/Web/Password.pm", "type": "file" }, { - "bom-ref": "871089476342097e", + "bom-ref": "4911957dd9bc9580", "name": "/usr/share/perl5/Debconf/Element/Web/Progress.pm", "type": "file" }, { - "bom-ref": "ae4cf91281be7fa8", + "bom-ref": "d786e639d8310b46", "name": "/usr/share/perl5/Debconf/Element/Web/Select.pm", "type": "file" }, { - "bom-ref": "2919c0b13c961c32", + "bom-ref": "d302c619f4abb438", "name": "/usr/share/perl5/Debconf/Element/Web/String.pm", "type": "file" }, { - "bom-ref": "6125a8532166535f", + "bom-ref": "4459ed184d4c1b11", "name": "/usr/share/perl5/Debconf/Element/Web/Text.pm", "type": "file" }, { - "bom-ref": "a429485034b19803", + "bom-ref": "63c605e313d705e1", "name": "/usr/share/perl5/Debconf/Encoding.pm", "type": "file" }, { - "bom-ref": "770130fa394a070a", + "bom-ref": "e3fb287100856228", "name": "/usr/share/perl5/Debconf/Format.pm", "type": "file" }, { - "bom-ref": "5ab1d8dc88b4ac87", + "bom-ref": "f0d0419ca853e379", "name": "/usr/share/perl5/Debconf/Format/822.pm", "type": "file" }, { - "bom-ref": "63d6274e2e8a2cdc", + "bom-ref": "9a334ac813420002", "name": "/usr/share/perl5/Debconf/FrontEnd.pm", "type": "file" }, { - "bom-ref": "26a59a230530d0ec", + "bom-ref": "8bc31026c1af18c2", "name": "/usr/share/perl5/Debconf/FrontEnd/Dialog.pm", "type": "file" }, { - "bom-ref": "516b0e587fd6a591", + "bom-ref": "d396b3330b33e2fb", "name": "/usr/share/perl5/Debconf/FrontEnd/Editor.pm", "type": "file" }, { - "bom-ref": "cd54ad4582b64d78", + "bom-ref": "04ca4e5506b1b79a", "name": "/usr/share/perl5/Debconf/FrontEnd/Gnome.pm", "type": "file" }, { - "bom-ref": "874fcf88672ae2ff", + "bom-ref": "e06c877a876603f5", "name": "/usr/share/perl5/Debconf/FrontEnd/Kde.pm", "type": "file" }, { - "bom-ref": "fbba017863620519", + "bom-ref": "9c0bb010ac4562d7", "name": "/usr/share/perl5/Debconf/FrontEnd/Noninteractive.pm", "type": "file" }, { - "bom-ref": "b96fe8d966b9e80d", + "bom-ref": "53105615e7e5511b", "name": "/usr/share/perl5/Debconf/FrontEnd/Passthrough.pm", "type": "file" }, { - "bom-ref": "30c8c449c2609b34", + "bom-ref": "49cf889daba191ee", "name": "/usr/share/perl5/Debconf/FrontEnd/Readline.pm", "type": "file" }, { - "bom-ref": "1744c33fe7888c94", + "bom-ref": "b016752bd550da0a", "name": "/usr/share/perl5/Debconf/FrontEnd/ScreenSize.pm", "type": "file" }, { - "bom-ref": "95a18455732da96f", + "bom-ref": "76f6b46c8dba8961", "name": "/usr/share/perl5/Debconf/FrontEnd/Teletype.pm", "type": "file" }, { - "bom-ref": "d76280663bde72f6", + "bom-ref": "39358dd4267ec328", "name": "/usr/share/perl5/Debconf/FrontEnd/Text.pm", "type": "file" }, { - "bom-ref": "47bcd8d984c08f94", + "bom-ref": "a1c8f6cc404df412", "name": "/usr/share/perl5/Debconf/FrontEnd/Web.pm", "type": "file" }, { - "bom-ref": "8f9a7427fa787229", + "bom-ref": "e00e8b3ce6ef01c7", "name": "/usr/share/perl5/Debconf/Gettext.pm", "type": "file" }, { - "bom-ref": "f0cb409853d30c9f", + "bom-ref": "be5731654ee851a5", "name": "/usr/share/perl5/Debconf/Iterator.pm", "type": "file" }, { - "bom-ref": "7f4df48225fd0ff5", + "bom-ref": "1a7dc9f36defe85b", "name": "/usr/share/perl5/Debconf/Log.pm", "type": "file" }, { - "bom-ref": "27320d453707616f", + "bom-ref": "6093a50c8d7e83dd", "name": "/usr/share/perl5/Debconf/Path.pm", "type": "file" }, { - "bom-ref": "2700de00434d344b", + "bom-ref": "27ef4f8c3844fadd", "name": "/usr/share/perl5/Debconf/Priority.pm", "type": "file" }, { - "bom-ref": "93c8843e9c96a087", + "bom-ref": "7356dd29b04ad04d", "name": "/usr/share/perl5/Debconf/Question.pm", "type": "file" }, { - "bom-ref": "545fdf6d7ef329ed", + "bom-ref": "bfd7644865572c53", "name": "/usr/share/perl5/Debconf/Template.pm", "type": "file" }, { - "bom-ref": "400f09d5362cef1f", + "bom-ref": "7faff2692c2019a1", "name": "/usr/share/perl5/Debconf/Template/Transient.pm", "type": "file" }, { - "bom-ref": "574450d8a0d87ef3", + "bom-ref": "fa88089c1ac63c6d", "name": "/usr/share/perl5/Debconf/TmpFile.pm", "type": "file" }, { - "bom-ref": "d951d4a31b47ad3d", + "bom-ref": "2d4f33f4f99715e7", "name": "/usr/share/perl5/Debian/AdduserCommon.pm", "type": "file" }, { - "bom-ref": "8f1b3e8d414c6a95", + "bom-ref": "e0e5b57da0a0bcc3", "name": "/usr/share/perl5/Debian/AdduserLogging.pm", "type": "file" }, { - "bom-ref": "3b7e18b502c38cd2", + "bom-ref": "f8d5eaa73bf298b0", "name": "/usr/share/perl5/Debian/AdduserRetvalues.pm", "type": "file" }, { - "bom-ref": "5191399563a9a4d5", + "bom-ref": "d4e66b49000ee0d7", "name": "/usr/share/perl5/Debian/DebConf/Client/ConfModule.pm", "type": "file" }, { - "bom-ref": "bebba036318e113e", + "bom-ref": "b5bc9fec6e667889", + "name": "/usr/share/perl5/Debian/Debhelper/Sequence/xml_core.pm", + "type": "file" + }, + { + "bom-ref": "6ab6a9c241fcbf96", "name": "/usr/share/perl5/Dpkg.pm", "type": "file" }, { - "bom-ref": "91ed66de851e5c49", + "bom-ref": "4220998c8573cd91", "name": "/usr/share/perl5/Dpkg/Arch.pm", "type": "file" }, { - "bom-ref": "3d65c11c48bbd82f", + "bom-ref": "492e8315fd11c39b", "name": "/usr/share/perl5/Dpkg/Build/Info.pm", "type": "file" }, { - "bom-ref": "d36c838c5e6eb8bb", + "bom-ref": "435bfe59b1fd3387", "name": "/usr/share/perl5/Dpkg/BuildAPI.pm", "type": "file" }, { - "bom-ref": "4995965013407059", + "bom-ref": "61b9074068e23da9", "name": "/usr/share/perl5/Dpkg/BuildEnv.pm", "type": "file" }, { - "bom-ref": "d682eac54f51fe89", + "bom-ref": "b43dc12f0a03d235", "name": "/usr/share/perl5/Dpkg/BuildFlags.pm", "type": "file" }, { - "bom-ref": "39e126dffafee461", + "bom-ref": "776741cd9619b181", "name": "/usr/share/perl5/Dpkg/BuildInfo.pm", "type": "file" }, { - "bom-ref": "591adb97850da0ae", + "bom-ref": "b2898e80dffec516", "name": "/usr/share/perl5/Dpkg/BuildOptions.pm", "type": "file" }, { - "bom-ref": "5fb7c75b4031e7bf", + "bom-ref": "d3f9493501ed33a7", "name": "/usr/share/perl5/Dpkg/BuildProfiles.pm", "type": "file" }, { - "bom-ref": "426ab8545a670605", + "bom-ref": "1f4e056d1349b649", "name": "/usr/share/perl5/Dpkg/BuildTree.pm", "type": "file" }, { - "bom-ref": "d23bf81a73eb7f83", + "bom-ref": "a8464b82b0515943", "name": "/usr/share/perl5/Dpkg/BuildTypes.pm", "type": "file" }, { - "bom-ref": "943bf60c3f7e9bfc", + "bom-ref": "da871aa56a2cf658", "name": "/usr/share/perl5/Dpkg/Changelog.pm", "type": "file" }, { - "bom-ref": "3b9b8f6198985f83", + "bom-ref": "df5d2d107b7e0ae7", "name": "/usr/share/perl5/Dpkg/Changelog/Debian.pm", "type": "file" }, { - "bom-ref": "05ca87151d15c47b", + "bom-ref": "683eb4b379d21ba7", "name": "/usr/share/perl5/Dpkg/Changelog/Entry.pm", "type": "file" }, { - "bom-ref": "b62aa60cbf0a9325", + "bom-ref": "2a8e7db3fabf10c1", "name": "/usr/share/perl5/Dpkg/Changelog/Entry/Debian.pm", "type": "file" }, { - "bom-ref": "f53e77f2ef5f1e68", + "bom-ref": "ce5261ee398e236c", "name": "/usr/share/perl5/Dpkg/Changelog/Parse.pm", "type": "file" }, { - "bom-ref": "175e6efdfb4bf0e6", + "bom-ref": "7fcae90cf0aded9e", "name": "/usr/share/perl5/Dpkg/Checksums.pm", "type": "file" }, { - "bom-ref": "c633832d3fa2f594", + "bom-ref": "91739b7a8637de78", "name": "/usr/share/perl5/Dpkg/Compression.pm", "type": "file" }, { - "bom-ref": "631eeb3e1d75253b", + "bom-ref": "44edfe4867f150b7", "name": "/usr/share/perl5/Dpkg/Compression/FileHandle.pm", "type": "file" }, { - "bom-ref": "a5b7da51a6ae604b", + "bom-ref": "24356756732d1397", "name": "/usr/share/perl5/Dpkg/Compression/Process.pm", "type": "file" }, { - "bom-ref": "a85b8698a3fb3c11", + "bom-ref": "a2901f06a891f2ed", "name": "/usr/share/perl5/Dpkg/Conf.pm", "type": "file" }, { - "bom-ref": "d1e95d106a21a526", + "bom-ref": "e376a7fa9a3096e2", "name": "/usr/share/perl5/Dpkg/Control.pm", "type": "file" }, { - "bom-ref": "6fdfde5a12414592", + "bom-ref": "baa7604f1a53ff42", "name": "/usr/share/perl5/Dpkg/Control/Changelog.pm", "type": "file" }, { - "bom-ref": "43ec5ba51c92d74d", + "bom-ref": "f87eeae21032330d", "name": "/usr/share/perl5/Dpkg/Control/Fields.pm", "type": "file" }, { - "bom-ref": "01a276fb014682bb", + "bom-ref": "a0de2c290bf0d08b", "name": "/usr/share/perl5/Dpkg/Control/FieldsCore.pm", "type": "file" }, { - "bom-ref": "183c88cb22634ef8", + "bom-ref": "0ab097a5a21f502c", "name": "/usr/share/perl5/Dpkg/Control/Hash.pm", "type": "file" }, { - "bom-ref": "5565cc4d98588e64", + "bom-ref": "a0d2481df495117c", "name": "/usr/share/perl5/Dpkg/Control/HashCore.pm", "type": "file" }, { - "bom-ref": "b334efebdaa47a95", + "bom-ref": "22d0ed434d63601d", "name": "/usr/share/perl5/Dpkg/Control/HashCore/Tie.pm", "type": "file" }, { - "bom-ref": "699e0dd5d74ec9f2", + "bom-ref": "a529a96a1024961a", "name": "/usr/share/perl5/Dpkg/Control/Info.pm", "type": "file" }, { - "bom-ref": "63f7f59bed83ab54", + "bom-ref": "a28b3dedd5f173cc", "name": "/usr/share/perl5/Dpkg/Control/Tests.pm", "type": "file" }, { - "bom-ref": "e70ef86dc0438df9", + "bom-ref": "603947b55b336839", "name": "/usr/share/perl5/Dpkg/Control/Tests/Entry.pm", "type": "file" }, { - "bom-ref": "fa548b95b54055ac", + "bom-ref": "b13b8c9d6796c864", "name": "/usr/share/perl5/Dpkg/Control/Types.pm", "type": "file" }, { - "bom-ref": "4b046274ade9202c", + "bom-ref": "56bfc8e43d0e80a0", "name": "/usr/share/perl5/Dpkg/Deps.pm", "type": "file" }, { - "bom-ref": "9d3b39882b684d0d", + "bom-ref": "d705cdd22de6f36d", "name": "/usr/share/perl5/Dpkg/Deps/AND.pm", "type": "file" }, { - "bom-ref": "dd1c38cb6fc9b2e4", + "bom-ref": "ce9591db1ab4b8e0", "name": "/usr/share/perl5/Dpkg/Deps/KnownFacts.pm", "type": "file" }, { - "bom-ref": "e5204e061ce6c853", + "bom-ref": "4e7f0c982c5318a7", "name": "/usr/share/perl5/Dpkg/Deps/Multiple.pm", "type": "file" }, { - "bom-ref": "1c728a9776510421", + "bom-ref": "e7ce5f3c2653c539", "name": "/usr/share/perl5/Dpkg/Deps/OR.pm", "type": "file" }, { - "bom-ref": "7bf0fbda87c4601d", + "bom-ref": "a3d64a7ec93767ed", "name": "/usr/share/perl5/Dpkg/Deps/Simple.pm", "type": "file" }, { - "bom-ref": "720e9e94a871ad07", + "bom-ref": "4aca1cc3d6496b8b", "name": "/usr/share/perl5/Dpkg/Deps/Union.pm", "type": "file" }, { - "bom-ref": "37ce0355d3768164", + "bom-ref": "ac75b0eae151b878", "name": "/usr/share/perl5/Dpkg/Dist/Files.pm", "type": "file" }, { - "bom-ref": "1ddc396eb7633317", + "bom-ref": "4ae308fbb5f621b3", "name": "/usr/share/perl5/Dpkg/ErrorHandling.pm", "type": "file" }, { - "bom-ref": "02bb73e636cb4d05", + "bom-ref": "1a211ce52bfd2ac1", "name": "/usr/share/perl5/Dpkg/Exit.pm", "type": "file" }, { - "bom-ref": "a3f32eb28b3748b0", + "bom-ref": "eb13f4db924b68d0", "name": "/usr/share/perl5/Dpkg/File.pm", "type": "file" }, { - "bom-ref": "25567f5f88a929a2", + "bom-ref": "31a12ab3fa74ca42", "name": "/usr/share/perl5/Dpkg/Getopt.pm", "type": "file" }, { - "bom-ref": "05416c258894d63d", + "bom-ref": "bef054c2493b2c55", "name": "/usr/share/perl5/Dpkg/Gettext.pm", "type": "file" }, { - "bom-ref": "7a9342cab1c6d9e8", + "bom-ref": "e67ed5e53e8d3690", "name": "/usr/share/perl5/Dpkg/IPC.pm", "type": "file" }, { - "bom-ref": "1997acb1b44a41f9", + "bom-ref": "1488005f1149452d", "name": "/usr/share/perl5/Dpkg/Index.pm", "type": "file" }, { - "bom-ref": "1a7785c67c683f99", + "bom-ref": "e739e660af3cd0e9", "name": "/usr/share/perl5/Dpkg/Interface/Storable.pm", "type": "file" }, { - "bom-ref": "573f43cd69faf61d", + "bom-ref": "8e1dbf0d720c9d05", "name": "/usr/share/perl5/Dpkg/Lock.pm", "type": "file" }, { - "bom-ref": "07e7b915f154d3b7", + "bom-ref": "767dd4a4880fd99b", "name": "/usr/share/perl5/Dpkg/OpenPGP.pm", "type": "file" }, { - "bom-ref": "a908184b005090e2", + "bom-ref": "89b03112dc33ccae", "name": "/usr/share/perl5/Dpkg/OpenPGP/Backend.pm", "type": "file" }, { - "bom-ref": "732c6d0dd49d7cfa", + "bom-ref": "2ccb156957d86bf6", "name": "/usr/share/perl5/Dpkg/OpenPGP/Backend/GnuPG.pm", "type": "file" }, { - "bom-ref": "eeb96b51361a0328", + "bom-ref": "0730a50ba228c40c", "name": "/usr/share/perl5/Dpkg/OpenPGP/Backend/SOP.pm", "type": "file" }, { - "bom-ref": "eec17af3c9c5cb99", + "bom-ref": "9c074f17ef2caaf5", "name": "/usr/share/perl5/Dpkg/OpenPGP/Backend/Sequoia.pm", "type": "file" }, { - "bom-ref": "8d3e6f33159f722f", + "bom-ref": "05c51037e6895a23", "name": "/usr/share/perl5/Dpkg/OpenPGP/ErrorCodes.pm", "type": "file" }, { - "bom-ref": "814ed364928715cc", + "bom-ref": "7bb60cfbdb0690a0", "name": "/usr/share/perl5/Dpkg/OpenPGP/KeyHandle.pm", "type": "file" }, { - "bom-ref": "7e7847c9f4132476", + "bom-ref": "70b739d333e84dca", "name": "/usr/share/perl5/Dpkg/Package.pm", "type": "file" }, { - "bom-ref": "6d3ec2b5e59efd65", + "bom-ref": "12dde248374fc1cd", "name": "/usr/share/perl5/Dpkg/Path.pm", "type": "file" }, { - "bom-ref": "1d113be227cacc14", + "bom-ref": "abda7d6bd0be8094", "name": "/usr/share/perl5/Dpkg/Shlibs.pm", "type": "file" }, { - "bom-ref": "feff22c5ec6eff33", + "bom-ref": "8d2578cc822abacf", "name": "/usr/share/perl5/Dpkg/Shlibs/Cppfilt.pm", "type": "file" }, { - "bom-ref": "bd14f5d5737fd8bd", + "bom-ref": "aa03b64ca6082941", "name": "/usr/share/perl5/Dpkg/Shlibs/Objdump.pm", "type": "file" }, { - "bom-ref": "0966605ea5da3457", + "bom-ref": "e3135f5d4a556caf", "name": "/usr/share/perl5/Dpkg/Shlibs/Objdump/Object.pm", "type": "file" }, { - "bom-ref": "95d4aa0380d8c802", + "bom-ref": "dbdeaf0e60540f9e", "name": "/usr/share/perl5/Dpkg/Shlibs/Symbol.pm", "type": "file" }, { - "bom-ref": "44745651b8364cf3", + "bom-ref": "78bcab4b5aaacc03", "name": "/usr/share/perl5/Dpkg/Shlibs/SymbolFile.pm", "type": "file" }, { - "bom-ref": "b75eeff0e65e7221", + "bom-ref": "f5935b063d8280b9", "name": "/usr/share/perl5/Dpkg/Source/Archive.pm", "type": "file" }, { - "bom-ref": "66e8ece0cf2be650", + "bom-ref": "c7284e732e9362ac", "name": "/usr/share/perl5/Dpkg/Source/BinaryFiles.pm", "type": "file" }, { - "bom-ref": "dd058517c86f1ced", + "bom-ref": "1fbd560882f56db1", "name": "/usr/share/perl5/Dpkg/Source/Format.pm", "type": "file" }, { - "bom-ref": "dc4964f1d91c6cb4", + "bom-ref": "50274c23cf9b7a70", "name": "/usr/share/perl5/Dpkg/Source/Functions.pm", "type": "file" }, { - "bom-ref": "96a2e7413e4042be", + "bom-ref": "6ba9af5474709852", "name": "/usr/share/perl5/Dpkg/Source/Package.pm", "type": "file" }, { - "bom-ref": "2d9fc3c70b90cc76", + "bom-ref": "f6f92dd08f9787ca", "name": "/usr/share/perl5/Dpkg/Source/Package/V1.pm", "type": "file" }, { - "bom-ref": "8b1c4e63bf570baf", + "bom-ref": "2cbc9f0eaf8e591f", "name": "/usr/share/perl5/Dpkg/Source/Package/V2.pm", "type": "file" }, { - "bom-ref": "56e3235f4575b7e9", + "bom-ref": "44c4a6b8995a4db9", "name": "/usr/share/perl5/Dpkg/Source/Package/V3/Bzr.pm", "type": "file" }, { - "bom-ref": "7fe8caca67734fe1", + "bom-ref": "46d2f82ae3be66a9", "name": "/usr/share/perl5/Dpkg/Source/Package/V3/Custom.pm", "type": "file" }, { - "bom-ref": "f7bceb13f89684dd", + "bom-ref": "9ea91a755d149715", "name": "/usr/share/perl5/Dpkg/Source/Package/V3/Git.pm", "type": "file" }, { - "bom-ref": "4eb78af9c2cd17e5", + "bom-ref": "05fc40f2b68d5969", "name": "/usr/share/perl5/Dpkg/Source/Package/V3/Native.pm", "type": "file" }, { - "bom-ref": "b4bf72e90e0a6022", + "bom-ref": "8108a5ec31b33aaa", "name": "/usr/share/perl5/Dpkg/Source/Package/V3/Quilt.pm", "type": "file" }, { - "bom-ref": "7e56a4d046c8f61f", + "bom-ref": "558d6e331f089683", "name": "/usr/share/perl5/Dpkg/Source/Patch.pm", "type": "file" }, { - "bom-ref": "df3b573cf940944a", + "bom-ref": "93b311b4d1efc662", "name": "/usr/share/perl5/Dpkg/Source/Quilt.pm", "type": "file" }, { - "bom-ref": "c3bc86c5a8acf935", + "bom-ref": "f2078f3aeb1e43fd", "name": "/usr/share/perl5/Dpkg/Substvars.pm", "type": "file" }, { - "bom-ref": "e7ab324425d53294", + "bom-ref": "17fca8548361c5c8", "name": "/usr/share/perl5/Dpkg/Vendor.pm", "type": "file" }, { - "bom-ref": "f892357e1cb33593", + "bom-ref": "d8003ed8c3260bfb", "name": "/usr/share/perl5/Dpkg/Vendor/Debian.pm", "type": "file" }, { - "bom-ref": "e13e96be49035797", + "bom-ref": "e844e9941020173b", "name": "/usr/share/perl5/Dpkg/Vendor/Default.pm", "type": "file" }, { - "bom-ref": "a70860fe09d9e64d", + "bom-ref": "fd3960dde40dbbd1", "name": "/usr/share/perl5/Dpkg/Vendor/Devuan.pm", "type": "file" }, { - "bom-ref": "1fe3cff93e91f062", + "bom-ref": "6e99f76f54b239ea", "name": "/usr/share/perl5/Dpkg/Vendor/Ubuntu.pm", "type": "file" }, { - "bom-ref": "cb8f926cbe8eb4c2", + "bom-ref": "76e379253c032016", "name": "/usr/share/perl5/Dpkg/Version.pm", "type": "file" }, { - "bom-ref": "9219de593ef286fe", + "bom-ref": "3887ae0908884cf2", "name": "/usr/share/perl5/Error.pm", "type": "file" }, { - "bom-ref": "e0a7454bbd6b49a0", + "bom-ref": "b826737f1b59acbc", "name": "/usr/share/perl5/Error/Simple.pm", "type": "file" }, { - "bom-ref": "64c2cb1262ebd5c0", + "bom-ref": "79a55b89e3876fd8", "name": "/usr/share/perl5/Git.pm", "type": "file" }, { - "bom-ref": "9d8411c4e28b8039", + "bom-ref": "9609246c545b1eb1", "name": "/usr/share/perl5/Git/I18N.pm", "type": "file" }, { - "bom-ref": "5a3c6eee629f6a79", + "bom-ref": "de16edd48000e0bd", "name": "/usr/share/perl5/Git/IndexInfo.pm", "type": "file" }, { - "bom-ref": "586b847139d67121", + "bom-ref": "e361103f25721ef9", "name": "/usr/share/perl5/Git/LoadCPAN.pm", "type": "file" }, { - "bom-ref": "62a0fb5dc61a9464", + "bom-ref": "3103d3c5bc16fd00", "name": "/usr/share/perl5/Git/LoadCPAN/Error.pm", "type": "file" }, { - "bom-ref": "560b63a0ba63e562", + "bom-ref": "18ce2aa96723de32", "name": "/usr/share/perl5/Git/LoadCPAN/Mail/Address.pm", "type": "file" }, { - "bom-ref": "fc8b38ac33a1cdac", + "bom-ref": "2c7d216a6adcf50c", "name": "/usr/share/perl5/Git/Packet.pm", "type": "file" }, { - "bom-ref": "dd4d60adf9ad3a66", + "bom-ref": "e743465f32120a64", "name": "/usr/share/pixmaps/debian-logo.png", "type": "file" }, { - "bom-ref": "fc89105764bdbc8c", + "bom-ref": "5ebc0d7cd58ea75c", "name": "/usr/share/pixmaps/python3.12.xpm", "type": "file" }, { - "bom-ref": "87a840cdb00238b1", + "bom-ref": "d188ab5a409a68a7", "name": "/usr/share/pixmaps/ubuntu-logo-text-dark.png", "type": "file" }, { - "bom-ref": "e9e67b87da59f4e4", + "bom-ref": "17419b2306bd5722", "name": "/usr/share/pixmaps/ubuntu-logo-text.png", "type": "file" }, { - "bom-ref": "d0a5ba0dd4996a21", + "bom-ref": "203ff6d71510d413", "name": "/usr/share/pixmaps/ubuntu-logo.svg", "type": "file" }, { - "bom-ref": "72c2f5f051e52f90", + "bom-ref": "a1aed33a760c9961", + "name": "/usr/share/pkgconfig/iso-codes.pc", + "type": "file" + }, + { + "bom-ref": "a9e0aeb6d38a4f20", "name": "/usr/share/pkgconfig/shared-mime-info.pc", "type": "file" }, { - "bom-ref": "e6309347c61bb6c6", + "bom-ref": "acd18632dfdcde04", "name": "/usr/share/pkgconfig/systemd.pc", "type": "file" }, { - "bom-ref": "6f72b8e5f9db8b83", + "bom-ref": "a00787613b152965", "name": "/usr/share/pkgconfig/udev.pc", "type": "file" }, { - "bom-ref": "2ae339751f79fde5", + "bom-ref": "7e7fd0db6184391d", "name": "/usr/share/pkgconfig/xkeyboard-config.pc", "type": "file" }, { - "bom-ref": "5d0e4bb323d215c8", + "bom-ref": "ad45e28b8c6b1dff", + "name": "/usr/share/polkit-1/actions/com.ubuntu.softwareproperties.policy", + "type": "file" + }, + { + "bom-ref": "68383a99c5785126", "name": "/usr/share/polkit-1/actions/org.dpkg.pkexec.update-alternatives.policy", "type": "file" }, { - "bom-ref": "9b947ef86c8f0de1", + "bom-ref": "6f0227fcd0c57bf3", "name": "/usr/share/polkit-1/actions/org.freedesktop.hostname1.policy", "type": "file" }, { - "bom-ref": "d65a50c8252f4e7e", + "bom-ref": "149ea734de2c5610", "name": "/usr/share/polkit-1/actions/org.freedesktop.locale1.policy", "type": "file" }, { - "bom-ref": "65b4a59c9ab55fca", + "bom-ref": "8be18a34897066c8", "name": "/usr/share/polkit-1/actions/org.freedesktop.login1.policy", "type": "file" }, { - "bom-ref": "dad0bf43b408761f", + "bom-ref": "1805d160130c4cf9", "name": "/usr/share/polkit-1/actions/org.freedesktop.network1.policy", "type": "file" }, { - "bom-ref": "4f3a681c19b93532", + "bom-ref": "e19770ae587ce269", + "name": "/usr/share/polkit-1/actions/org.freedesktop.packagekit.policy", + "type": "file" + }, + { + "bom-ref": "044f268490fe3957", + "name": "/usr/share/polkit-1/actions/org.freedesktop.policykit.policy", + "type": "file" + }, + { + "bom-ref": "b58aa80b5ee77a04", "name": "/usr/share/polkit-1/actions/org.freedesktop.systemd1.policy", "type": "file" }, { - "bom-ref": "9ebea27d1c36cbd8", + "bom-ref": "9b9ab7f6c37243f2", "name": "/usr/share/polkit-1/actions/org.freedesktop.timedate1.policy", "type": "file" }, { - "bom-ref": "d6a4786ad52b1e45", + "bom-ref": "41913ac326fcdf93", "name": "/usr/share/polkit-1/actions/org.freedesktop.timesync1.policy", "type": "file" }, { - "bom-ref": "9dc9caaf2f9e3d3b", + "bom-ref": "ce9fa3a42c058556", + "name": "/usr/share/polkit-1/policyconfig-1.dtd", + "type": "file" + }, + { + "bom-ref": "23db06bed28111d6", + "name": "/usr/share/polkit-1/rules.d/49-ubuntu-admin.rules", + "type": "file" + }, + { + "bom-ref": "0133317174c77e0c", + "name": "/usr/share/polkit-1/rules.d/50-default.rules", + "type": "file" + }, + { + "bom-ref": "d1597caa3237d0f2", + "name": "/usr/share/polkit-1/rules.d/org.freedesktop.packagekit.rules", + "type": "file" + }, + { + "bom-ref": "0c7fcf1f6a4ffe6d", "name": "/usr/share/polkit-1/rules.d/systemd-networkd.rules", "type": "file" }, { - "bom-ref": "5965f24e241d02c1", + "bom-ref": "4ceda8bc66ecb537", "name": "/usr/share/profile", "type": "file" }, { - "bom-ref": "bd3dd22f5858d066", + "bom-ref": "ab81b6df8d6fc95c", "name": "/usr/share/profile.md5sums", "type": "file" }, { - "bom-ref": "5b78887a728c4390", + "bom-ref": "3af02c75a15d9329", + "name": "/usr/share/python-apt/templates/Blankon.info", + "type": "file" + }, + { + "bom-ref": "aec6988c469f3c4f", + "name": "/usr/share/python-apt/templates/Blankon.mirrors", + "type": "file" + }, + { + "bom-ref": "92e07cb39c8ccd10", + "name": "/usr/share/python-apt/templates/Debian.info", + "type": "file" + }, + { + "bom-ref": "5e5b55a404be575d", + "name": "/usr/share/python-apt/templates/Debian.mirrors", + "type": "file" + }, + { + "bom-ref": "ed3c8db33178fc9f", + "name": "/usr/share/python-apt/templates/Kali.info", + "type": "file" + }, + { + "bom-ref": "79b2b749edd5bbdf", + "name": "/usr/share/python-apt/templates/Kali.mirrors", + "type": "file" + }, + { + "bom-ref": "5b8de23c695b878d", + "name": "/usr/share/python-apt/templates/Tanglu.info", + "type": "file" + }, + { + "bom-ref": "642a04b394079d8a", + "name": "/usr/share/python-apt/templates/Tanglu.mirrors", + "type": "file" + }, + { + "bom-ref": "b1da3bf472988739", + "name": "/usr/share/python-apt/templates/Ubuntu.info", + "type": "file" + }, + { + "bom-ref": "92f3c4173592de6c", + "name": "/usr/share/python-apt/templates/Ubuntu.mirrors", + "type": "file" + }, + { + "bom-ref": "476b1fb47bcdc9d6", + "name": "/usr/share/python-apt/templates/gNewSense.info", + "type": "file" + }, + { + "bom-ref": "9f4684a5a206f93a", + "name": "/usr/share/python-apt/templates/gNewSense.mirrors", + "type": "file" + }, + { + "bom-ref": "49d1e3ff1fa0e450", "name": "/usr/share/python3/debian_defaults", "type": "file" }, { - "bom-ref": "af60571405dd45c4", + "bom-ref": "29b4f063806a0fb0", "name": "/usr/share/python3/debpython/__init__.py", "type": "file" }, { - "bom-ref": "6038db3ad05af566", + "bom-ref": "18fd3d38fbd881c6", "name": "/usr/share/python3/debpython/files.py", "type": "file" }, { - "bom-ref": "b19c533a39b32289", + "bom-ref": "4abf5dcc7208d419", "name": "/usr/share/python3/debpython/interpreter.py", "type": "file" }, { - "bom-ref": "aab3bf796c040095", + "bom-ref": "0aed29b13fb935f5", "name": "/usr/share/python3/debpython/option.py", "type": "file" }, { - "bom-ref": "002330540f3cecdc", + "bom-ref": "bf58053db1120fa0", "name": "/usr/share/python3/debpython/version.py", "type": "file" }, { - "bom-ref": "e7d6607218042ea8", + "bom-ref": "c1625b5617836836", + "name": "/usr/share/python3/dist/python3-cryptography", + "type": "file" + }, + { + "bom-ref": "e448c5ce11136f57", + "name": "/usr/share/python3/dist/python3-six", + "type": "file" + }, + { + "bom-ref": "988270e5c83f68d8", "name": "/usr/share/python3/py3versions.py", "type": "file" }, { - "bom-ref": "6fa23762603e6041", + "bom-ref": "fe592d7ba863267d", "name": "/usr/share/python3/python.mk", "type": "file" }, { - "bom-ref": "cca95a25a6f1334e", + "bom-ref": "cb3f8060d2f1b352", "name": "/usr/share/python3/runtime.d/public_modules.rtinstall", "type": "file" }, { - "bom-ref": "00c8a811417ba0d1", + "bom-ref": "c12fa6e3c6e96bd9", "name": "/usr/share/python3/runtime.d/public_modules.rtremove", "type": "file" }, { - "bom-ref": "42d56c3f666f25ed", + "bom-ref": "d3e03c420e783b11", "name": "/usr/share/readline/inputrc", "type": "file" }, { - "bom-ref": "d058c6b0282dbc5d", + "bom-ref": "5ba499ad4ed5fd13", "name": "/usr/share/sensible-utils/bin/gettext", "type": "file" }, { - "bom-ref": "02dcdb421a02dea7", + "bom-ref": "64341142bc846df9", "name": "/usr/share/sensible-utils/bin/realpath", "type": "file" }, { - "bom-ref": "d651839037ad7de9", + "bom-ref": "0791a55afa323b6d", + "name": "/usr/share/sgml-base/catalog.centralized", + "type": "file" + }, + { + "bom-ref": "3a7077c1c0dbc99c", + "name": "/usr/share/sgml-base/catalog.super", + "type": "file" + }, + { + "bom-ref": "259dd55858a29798", + "name": "/usr/share/sgml-base/transitional.cat", + "type": "file" + }, + { + "bom-ref": "9100c055783a4267", + "name": "/usr/share/sgml/dtd/xml-core/catalog", + "type": "file" + }, + { + "bom-ref": "f3c95b24f473176b", "name": "/usr/share/staff-group-for-usr-local", "type": "file" }, { - "bom-ref": "408c9ebc74af29fa", + "bom-ref": "467833a4e2af0f28", "name": "/usr/share/systemd/kbd-model-map", "type": "file" }, { - "bom-ref": "0de611f198396d40", + "bom-ref": "af62700e2472d7aa", "name": "/usr/share/systemd/language-fallback-map", "type": "file" }, { - "bom-ref": "f026691aadc615b7", + "bom-ref": "6bd4914e5efbce71", "name": "/usr/share/systemd/tmp.mount", "type": "file" }, { - "bom-ref": "419ffe8a2b78c591", + "bom-ref": "76aece4c8c59c25f", "name": "/usr/share/tabset/std", "type": "file" }, { - "bom-ref": "e0a06dbd96a1a2fc", + "bom-ref": "635a70f74bd19952", "name": "/usr/share/tabset/stdcrt", "type": "file" }, { - "bom-ref": "ce46d67edadc3eb0", + "bom-ref": "33dcb9bac7a9306e", "name": "/usr/share/tabset/vt100", "type": "file" }, { - "bom-ref": "07726504621fc033", + "bom-ref": "f1976ad4d82b76bd", "name": "/usr/share/tabset/vt300", "type": "file" }, { - "bom-ref": "de807a8502c8cedc", + "bom-ref": "c0d91ed71d040f4e", "name": "/usr/share/terminfo/E/Eterm", "type": "file" }, { - "bom-ref": "611bd1c99891f8a0", + "bom-ref": "9b79ffe07255ec02", "name": "/usr/share/terminfo/a/ansi", "type": "file" }, { - "bom-ref": "94c45371ef0ea808", + "bom-ref": "f3302a9c55ce2066", "name": "/usr/share/terminfo/c/cons25", "type": "file" }, { - "bom-ref": "229184030c2f67eb", + "bom-ref": "520de8d48fa75661", "name": "/usr/share/terminfo/c/cygwin", "type": "file" }, { - "bom-ref": "78ab559da399e7a5", + "bom-ref": "b49f86dba0a3f4af", "name": "/usr/share/terminfo/d/dumb", "type": "file" }, { - "bom-ref": "7726a011303ed856", + "bom-ref": "82e3926cefc0b938", "name": "/usr/share/terminfo/h/hurd", "type": "file" }, { - "bom-ref": "97b96b19d3d217f3", + "bom-ref": "fd01f9f5cafda0d1", "name": "/usr/share/terminfo/l/linux", "type": "file" }, { - "bom-ref": "dfa9f6e4839daf99", + "bom-ref": "108f78729896418f", "name": "/usr/share/terminfo/m/mach", "type": "file" }, { - "bom-ref": "6905d4a645bc1c71", + "bom-ref": "8c45ceeb66bd2c27", "name": "/usr/share/terminfo/m/mach-bold", "type": "file" }, { - "bom-ref": "f10d6646050bcdd1", + "bom-ref": "c65b15c1ca3e762b", "name": "/usr/share/terminfo/m/mach-color", "type": "file" }, { - "bom-ref": "a78ad904c5d1560b", + "bom-ref": "965c840d27796635", "name": "/usr/share/terminfo/m/mach-gnu", "type": "file" }, { - "bom-ref": "046cc8489daaa6dc", + "bom-ref": "fde9db92a7cba496", "name": "/usr/share/terminfo/m/mach-gnu-color", "type": "file" }, { - "bom-ref": "f390a592de6d7e7a", + "bom-ref": "781bfd6dc0e830f0", "name": "/usr/share/terminfo/p/pcansi", "type": "file" }, { - "bom-ref": "6857e9a56802ffe8", + "bom-ref": "b42ad9969489bd52", "name": "/usr/share/terminfo/r/rxvt", "type": "file" }, { - "bom-ref": "23b57c3ae984dfcd", + "bom-ref": "05ab34a1dd422be7", "name": "/usr/share/terminfo/r/rxvt-basic", "type": "file" }, { - "bom-ref": "6caddc40e53e0ca5", + "bom-ref": "5983b5710cbd2edb", "name": "/usr/share/terminfo/r/rxvt-unicode", "type": "file" }, { - "bom-ref": "de72b525506f899f", + "bom-ref": "435a512bb6706755", "name": "/usr/share/terminfo/r/rxvt-unicode-256color", "type": "file" }, { - "bom-ref": "4f9cbd1171048477", + "bom-ref": "1e26c2320de1eb59", "name": "/usr/share/terminfo/s/screen", "type": "file" }, { - "bom-ref": "4d5d46b6c575e1c5", + "bom-ref": "649facd9a2d7799f", "name": "/usr/share/terminfo/s/screen-256color", "type": "file" }, { - "bom-ref": "34cffcf978c3791a", + "bom-ref": "c0c64fd9e63206b0", "name": "/usr/share/terminfo/s/screen-256color-bce", "type": "file" }, { - "bom-ref": "3f77e1d6925609e0", + "bom-ref": "ae7ba88d0ab4b162", "name": "/usr/share/terminfo/s/screen-bce", "type": "file" }, { - "bom-ref": "117ace99e3ffbee8", + "bom-ref": "b73f65e6aaca541e", "name": "/usr/share/terminfo/s/screen-s", "type": "file" }, { - "bom-ref": "36d38f1233723c40", + "bom-ref": "189dff3778292006", "name": "/usr/share/terminfo/s/screen-w", "type": "file" }, { - "bom-ref": "4fcf95aca7801967", + "bom-ref": "f2f78d13ffac3e2d", "name": "/usr/share/terminfo/s/screen.xterm-256color", "type": "file" }, { - "bom-ref": "500cdcd240415954", + "bom-ref": "42c5940f916d9a3a", "name": "/usr/share/terminfo/s/sun", "type": "file" }, { - "bom-ref": "0dbf9b7bb5aeed83", + "bom-ref": "36ea9f71992b9d4d", "name": "/usr/share/terminfo/t/tmux", "type": "file" }, { - "bom-ref": "74c55d0e0b860eee", + "bom-ref": "15ef8862cd8114ec", "name": "/usr/share/terminfo/t/tmux-256color", "type": "file" }, { - "bom-ref": "790c4bcadc608a1a", + "bom-ref": "d869c6a21af5d440", "name": "/usr/share/terminfo/v/vt100", "type": "file" }, { - "bom-ref": "6c63a4960925c8a1", + "bom-ref": "46c22dd9521812f7", "name": "/usr/share/terminfo/v/vt102", "type": "file" }, { - "bom-ref": "40b81251e01552c9", + "bom-ref": "791523e703c1ad87", "name": "/usr/share/terminfo/v/vt220", "type": "file" }, { - "bom-ref": "f579015683088c8c", + "bom-ref": "3a196f0e4dcf23c6", "name": "/usr/share/terminfo/v/vt52", "type": "file" }, { - "bom-ref": "a515780aacd5b5d4", + "bom-ref": "9bf5c43060e982fa", "name": "/usr/share/terminfo/w/wsvt25", "type": "file" }, { - "bom-ref": "1768beaa70ce660b", + "bom-ref": "0a77b4d07bb8c415", "name": "/usr/share/terminfo/w/wsvt25m", "type": "file" }, { - "bom-ref": "36108679005eee1c", + "bom-ref": "cd867521b814d5ee", "name": "/usr/share/terminfo/x/xterm", "type": "file" }, { - "bom-ref": "ef0419ff07127dfb", + "bom-ref": "b5f35aa871f68e15", "name": "/usr/share/terminfo/x/xterm-256color", "type": "file" }, { - "bom-ref": "4616c9cc4dae70b0", + "bom-ref": "fe49e4e426ad3ac2", "name": "/usr/share/terminfo/x/xterm-color", "type": "file" }, { - "bom-ref": "cdf60b9e95a9e4ff", + "bom-ref": "e9c8eb8996bdcba9", "name": "/usr/share/terminfo/x/xterm-mono", "type": "file" }, { - "bom-ref": "12b9b635a674fa86", + "bom-ref": "f817fee6b5257234", "name": "/usr/share/terminfo/x/xterm-r5", "type": "file" }, { - "bom-ref": "34ec2d3e3fa5c846", + "bom-ref": "f580a8e4a9f44390", "name": "/usr/share/terminfo/x/xterm-r6", "type": "file" }, { - "bom-ref": "52bd7e58b8be346a", + "bom-ref": "8d52553783030248", "name": "/usr/share/terminfo/x/xterm-vt220", "type": "file" }, { - "bom-ref": "e035347d83085591", + "bom-ref": "df1d678de9f8fbab", "name": "/usr/share/terminfo/x/xterm-xfree86", "type": "file" }, { - "bom-ref": "59831faaaa0d46ad", + "bom-ref": "2819828e054df8c5", "name": "/usr/share/util-linux/logcheck/ignore.d.server/util-linux", "type": "file" }, { - "bom-ref": "fcfccce515f4e5e9", + "bom-ref": "958038b3445a7925", "name": "/usr/share/vim/vim91/autoload/RstFold.vim", "type": "file" }, { - "bom-ref": "1b6333c411a65f39", + "bom-ref": "c14dcc999063434d", "name": "/usr/share/vim/vim91/autoload/ada.vim", "type": "file" }, { - "bom-ref": "7379efdecbd007a0", + "bom-ref": "48b678cad4d5759c", "name": "/usr/share/vim/vim91/autoload/adacomplete.vim", "type": "file" }, { - "bom-ref": "c10f94bd6353680b", + "bom-ref": "a766379a0628e0df", "name": "/usr/share/vim/vim91/autoload/bitbake.vim", "type": "file" }, { - "bom-ref": "f3f1d00f238e1f38", + "bom-ref": "a5532e60f10d7280", "name": "/usr/share/vim/vim91/autoload/cargo.vim", "type": "file" }, { - "bom-ref": "fa57b742fd62899b", + "bom-ref": "c58ee58d7947277b", "name": "/usr/share/vim/vim91/autoload/ccomplete.vim", "type": "file" }, { - "bom-ref": "74f31c1593a081d2", + "bom-ref": "669e4e36f323f60a", "name": "/usr/share/vim/vim91/autoload/clojurecomplete.vim", "type": "file" }, { - "bom-ref": "db44c85512406bca", + "bom-ref": "a91c1d0ae35da3da", "name": "/usr/share/vim/vim91/autoload/context.vim", "type": "file" }, { - "bom-ref": "7835425bd87be2c5", + "bom-ref": "a18438eda8ee21b1", "name": "/usr/share/vim/vim91/autoload/contextcomplete.vim", "type": "file" }, { - "bom-ref": "d5518299849c73e0", + "bom-ref": "ffe1e9c16a26ca90", "name": "/usr/share/vim/vim91/autoload/csscomplete.vim", "type": "file" }, { - "bom-ref": "0d7c635977a4570a", + "bom-ref": "1df0f762c701355e", "name": "/usr/share/vim/vim91/autoload/decada.vim", "type": "file" }, { - "bom-ref": "a637412aa6457707", + "bom-ref": "f143494935b7c9eb", "name": "/usr/share/vim/vim91/autoload/dist/ft.vim", "type": "file" }, { - "bom-ref": "c05dcc2c917b2310", + "bom-ref": "05117175d03c5e10", "name": "/usr/share/vim/vim91/autoload/dist/json.vim", "type": "file" }, { - "bom-ref": "46cdc3ed273b2ae2", + "bom-ref": "9e68309d5110839a", "name": "/usr/share/vim/vim91/autoload/dist/man.vim", "type": "file" }, { - "bom-ref": "2992fc05ad585f66", + "bom-ref": "d3a61cfa05ae2b9e", "name": "/usr/share/vim/vim91/autoload/dist/script.vim", "type": "file" }, { - "bom-ref": "f75e66b8b98f3c44", + "bom-ref": "30d70a56877f0714", "name": "/usr/share/vim/vim91/autoload/dist/vim.vim", "type": "file" }, { - "bom-ref": "342b73ba5d4c1b52", + "bom-ref": "14cbe6f64d04f51a", "name": "/usr/share/vim/vim91/autoload/dist/vim9.vim", "type": "file" }, { - "bom-ref": "b83ad990607f0c73", + "bom-ref": "8bc5487dba9dee07", "name": "/usr/share/vim/vim91/autoload/dist/vimindent.vim", "type": "file" }, { - "bom-ref": "00a4db20bc5417c9", + "bom-ref": "9debc70232591b1d", "name": "/usr/share/vim/vim91/autoload/freebasic.vim", "type": "file" }, { - "bom-ref": "1c79fc3340d4a8b1", + "bom-ref": "eab29c75d08cbebd", "name": "/usr/share/vim/vim91/autoload/getscript.vim", "type": "file" }, { - "bom-ref": "0706b53cf1697f84", + "bom-ref": "96dd68d41f5af7e0", "name": "/usr/share/vim/vim91/autoload/gnat.vim", "type": "file" }, { - "bom-ref": "8ef1ccea42feee28", + "bom-ref": "73916797b17bbfd4", "name": "/usr/share/vim/vim91/autoload/gzip.vim", "type": "file" }, { - "bom-ref": "42c4a0ccfd06c831", + "bom-ref": "4bf008724102516d", "name": "/usr/share/vim/vim91/autoload/haskellcomplete.vim", "type": "file" }, { - "bom-ref": "6209963f29a3d1ac", + "bom-ref": "b1aa09cc6e053234", "name": "/usr/share/vim/vim91/autoload/htmlcomplete.vim", "type": "file" }, { - "bom-ref": "397838f74697a8dd", + "bom-ref": "5c79cb2b3c7dcfa1", "name": "/usr/share/vim/vim91/autoload/javascriptcomplete.vim", "type": "file" }, { - "bom-ref": "113c60e6aaf4d91f", + "bom-ref": "250f3ed852213503", "name": "/usr/share/vim/vim91/autoload/modula2.vim", "type": "file" }, { - "bom-ref": "b8ab8a4e03b73d90", + "bom-ref": "0e78e3b8633ba870", "name": "/usr/share/vim/vim91/autoload/netrw.vim", "type": "file" }, { - "bom-ref": "6c292647014c323d", + "bom-ref": "ddc70ef4e653785d", "name": "/usr/share/vim/vim91/autoload/netrwFileHandlers.vim", "type": "file" }, { - "bom-ref": "8eb69c77044984ff", + "bom-ref": "9fa6c12b159108df", "name": "/usr/share/vim/vim91/autoload/netrwSettings.vim", "type": "file" }, { - "bom-ref": "3dc70a1aa1750472", + "bom-ref": "b92b89ed41d847be", "name": "/usr/share/vim/vim91/autoload/netrw_gitignore.vim", "type": "file" }, { - "bom-ref": "9dee1bf263dd154e", + "bom-ref": "9cf96f27ef79e38e", "name": "/usr/share/vim/vim91/autoload/paste.vim", "type": "file" }, { - "bom-ref": "e2abb108c595aa41", + "bom-ref": "0b3123ce97de6799", "name": "/usr/share/vim/vim91/autoload/phpcomplete.vim", "type": "file" }, { - "bom-ref": "3c27b8f7c0df84c4", + "bom-ref": "e50d1ab51cd8e5fc", "name": "/usr/share/vim/vim91/autoload/python.vim", "type": "file" }, { - "bom-ref": "7bc7335b1a652605", + "bom-ref": "38e2c086248f7181", "name": "/usr/share/vim/vim91/autoload/python3complete.vim", "type": "file" }, { - "bom-ref": "907df85d00aff3e9", + "bom-ref": "0255ce5aead731e9", "name": "/usr/share/vim/vim91/autoload/pythoncomplete.vim", "type": "file" }, { - "bom-ref": "37f2498ad8b73cf0", + "bom-ref": "fbe7d31e5fc7017c", "name": "/usr/share/vim/vim91/autoload/racket.vim", "type": "file" }, { - "bom-ref": "62d8ce71d1073425", + "bom-ref": "69f8311c9bc67a9d", "name": "/usr/share/vim/vim91/autoload/rubycomplete.vim", "type": "file" }, { - "bom-ref": "87c3990410914497", + "bom-ref": "952f07829a289043", "name": "/usr/share/vim/vim91/autoload/rust.vim", "type": "file" }, { - "bom-ref": "181a24843ff6596d", + "bom-ref": "0ac606378967df3d", "name": "/usr/share/vim/vim91/autoload/rustfmt.vim", "type": "file" }, { - "bom-ref": "441b31a21d4fc38b", + "bom-ref": "fa2e97660a54a143", "name": "/usr/share/vim/vim91/autoload/spellfile.vim", "type": "file" }, { - "bom-ref": "e30a2e7045bc55ef", + "bom-ref": "67b5cb39621a80ff", "name": "/usr/share/vim/vim91/autoload/sqlcomplete.vim", "type": "file" }, { - "bom-ref": "88137b783a83a012", + "bom-ref": "9300000918ab108e", "name": "/usr/share/vim/vim91/autoload/syntaxcomplete.vim", "type": "file" }, { - "bom-ref": "c9b70db0c23cef20", + "bom-ref": "be5b523412b7c7f4", "name": "/usr/share/vim/vim91/autoload/tar.vim", "type": "file" }, { - "bom-ref": "78d9755761289797", + "bom-ref": "02cfcbe6665b8813", "name": "/usr/share/vim/vim91/autoload/tohtml.vim", "type": "file" }, { - "bom-ref": "20b42d7d25cbc50e", + "bom-ref": "cc4fadd8c5d0ff4a", "name": "/usr/share/vim/vim91/autoload/typeset.vim", "type": "file" }, { - "bom-ref": "7c0ca4b8b3df17cc", + "bom-ref": "8c4abd700726c5f8", "name": "/usr/share/vim/vim91/autoload/vimball.vim", "type": "file" }, { - "bom-ref": "44005fce1d11cc3f", + "bom-ref": "3b1cc9f70ef00eef", "name": "/usr/share/vim/vim91/autoload/xml/html32.vim", "type": "file" }, { - "bom-ref": "65dd3b00e315bcf7", + "bom-ref": "eeab1de76eb7b74b", "name": "/usr/share/vim/vim91/autoload/xml/html401f.vim", "type": "file" }, { - "bom-ref": "9f7116282351ed95", + "bom-ref": "dab11473bc20c7b5", "name": "/usr/share/vim/vim91/autoload/xml/html401s.vim", "type": "file" }, { - "bom-ref": "c940bddbd6cc2012", + "bom-ref": "9ed7b3c31d5fcae6", "name": "/usr/share/vim/vim91/autoload/xml/html401t.vim", "type": "file" }, { - "bom-ref": "88c5b8a850d4afb0", + "bom-ref": "e25382a49be28bb4", "name": "/usr/share/vim/vim91/autoload/xml/html40f.vim", "type": "file" }, { - "bom-ref": "b6810780ae91ae45", + "bom-ref": "e31b821e42ab1d09", "name": "/usr/share/vim/vim91/autoload/xml/html40s.vim", "type": "file" }, { - "bom-ref": "4b9d1fcb501f887e", + "bom-ref": "dd4ebcce72cac73e", "name": "/usr/share/vim/vim91/autoload/xml/html40t.vim", "type": "file" }, { - "bom-ref": "142070ad42785468", + "bom-ref": "b1069be5669c7e98", "name": "/usr/share/vim/vim91/autoload/xml/xhtml10f.vim", "type": "file" }, { - "bom-ref": "0758863f594387e6", + "bom-ref": "c2709ef912fb2e56", "name": "/usr/share/vim/vim91/autoload/xml/xhtml10s.vim", "type": "file" }, { - "bom-ref": "01a90c5737b82375", + "bom-ref": "e34bbb1a7809e3e1", "name": "/usr/share/vim/vim91/autoload/xml/xhtml10t.vim", "type": "file" }, { - "bom-ref": "4b44aa1f94313f11", + "bom-ref": "79da704b352074a9", "name": "/usr/share/vim/vim91/autoload/xml/xhtml11.vim", "type": "file" }, { - "bom-ref": "1f1ea6a9166e4224", + "bom-ref": "454224c0520673d4", "name": "/usr/share/vim/vim91/autoload/xml/xsd.vim", "type": "file" }, { - "bom-ref": "0dacb3c5b16d8a75", + "bom-ref": "aa4112a4802eb081", "name": "/usr/share/vim/vim91/autoload/xml/xsl.vim", "type": "file" }, { - "bom-ref": "7616e8455bbf86cf", + "bom-ref": "0c3fd55fe4ccff4b", "name": "/usr/share/vim/vim91/autoload/xmlcomplete.vim", "type": "file" }, { - "bom-ref": "7788abebee3d18a8", + "bom-ref": "dffcdc5a3c5d1234", "name": "/usr/share/vim/vim91/autoload/xmlformat.vim", "type": "file" }, { - "bom-ref": "f259a2f496539b13", + "bom-ref": "202ea9c070046b7b", "name": "/usr/share/vim/vim91/autoload/zig/fmt.vim", "type": "file" }, { - "bom-ref": "1acbeed1065c0199", + "bom-ref": "b49deca9968808f5", "name": "/usr/share/vim/vim91/autoload/zip.vim", "type": "file" }, { - "bom-ref": "221ed7277092a5a9", + "bom-ref": "4f4152cbbb4e4bb5", "name": "/usr/share/vim/vim91/bugreport.vim", "type": "file" }, { - "bom-ref": "fec95f84e4d5c853", + "bom-ref": "5fa80fc5c4a53b0f", "name": "/usr/share/vim/vim91/colors/blue.vim", "type": "file" }, { - "bom-ref": "6a8e074aeb9146d1", + "bom-ref": "25f5064f2db4bec9", "name": "/usr/share/vim/vim91/colors/darkblue.vim", "type": "file" }, { - "bom-ref": "52d5ee168ef1ac62", + "bom-ref": "6f007800d978f4ae", "name": "/usr/share/vim/vim91/colors/default.vim", "type": "file" }, { - "bom-ref": "c541e75ae0a82c97", + "bom-ref": "2d6c844ef0e28cfb", "name": "/usr/share/vim/vim91/colors/delek.vim", "type": "file" }, { - "bom-ref": "d9c3b8f90d592fe4", + "bom-ref": "e5ad06f2dcda893c", "name": "/usr/share/vim/vim91/colors/desert.vim", "type": "file" }, { - "bom-ref": "9832f0622f23894e", + "bom-ref": "23c5bca42479e4d2", "name": "/usr/share/vim/vim91/colors/elflord.vim", "type": "file" }, { - "bom-ref": "a5f875f45d2980ea", + "bom-ref": "c98be97b0f866962", "name": "/usr/share/vim/vim91/colors/evening.vim", "type": "file" }, { - "bom-ref": "58e2f7932af56cd8", + "bom-ref": "ca4ab0a9fe82984c", "name": "/usr/share/vim/vim91/colors/habamax.vim", "type": "file" }, { - "bom-ref": "fcc9487edb49b58d", + "bom-ref": "78ecc051c26569cd", "name": "/usr/share/vim/vim91/colors/industry.vim", "type": "file" }, { - "bom-ref": "8382c519f841464c", + "bom-ref": "1b724c431be4eddc", "name": "/usr/share/vim/vim91/colors/koehler.vim", "type": "file" }, { - "bom-ref": "be32e185da9ddf4a", + "bom-ref": "7e16f6c92265f162", "name": "/usr/share/vim/vim91/colors/lists/csscolors.vim", "type": "file" }, { - "bom-ref": "272a5d5e7524c025", + "bom-ref": "cdd61341c41c17e1", "name": "/usr/share/vim/vim91/colors/lists/default.vim", "type": "file" }, { - "bom-ref": "b37c2fea519f51a4", + "bom-ref": "ef096e02b4973ff8", "name": "/usr/share/vim/vim91/colors/lunaperche.vim", "type": "file" }, { - "bom-ref": "c263f6e42d30372f", + "bom-ref": "3ef1a2622b3c6b9f", "name": "/usr/share/vim/vim91/colors/morning.vim", "type": "file" }, { - "bom-ref": "77b016a3b5175347", + "bom-ref": "9e79090b8792c7e3", "name": "/usr/share/vim/vim91/colors/murphy.vim", "type": "file" }, { - "bom-ref": "89b99339ce75c417", + "bom-ref": "af00ea05e2f78a37", "name": "/usr/share/vim/vim91/colors/pablo.vim", "type": "file" }, { - "bom-ref": "6227c43cfa32898e", + "bom-ref": "a0f4bb360a2f62da", "name": "/usr/share/vim/vim91/colors/peachpuff.vim", "type": "file" }, { - "bom-ref": "c6d6bd2096ed545e", + "bom-ref": "eeacf64dc1bdb4f6", "name": "/usr/share/vim/vim91/colors/quiet.vim", "type": "file" }, { - "bom-ref": "8c72fe1afe09c8d0", + "bom-ref": "633ca6439026b8a4", "name": "/usr/share/vim/vim91/colors/retrobox.vim", "type": "file" }, { - "bom-ref": "780c0b09d6f8451e", + "bom-ref": "0023692b248159b6", "name": "/usr/share/vim/vim91/colors/ron.vim", "type": "file" }, { - "bom-ref": "2316af0a9cd67831", + "bom-ref": "7f2e1507170791c1", "name": "/usr/share/vim/vim91/colors/shine.vim", "type": "file" }, { - "bom-ref": "c22c5fa1bba9a5e6", + "bom-ref": "70ab2615706ad7e2", "name": "/usr/share/vim/vim91/colors/slate.vim", "type": "file" }, { - "bom-ref": "06e09a86e10ab0c6", + "bom-ref": "fe0695b1543a8a1a", "name": "/usr/share/vim/vim91/colors/sorbet.vim", "type": "file" }, { - "bom-ref": "ac360d2f02808917", + "bom-ref": "c7bd29e0b3493987", "name": "/usr/share/vim/vim91/colors/tools/check_colors.vim", "type": "file" }, { - "bom-ref": "43e8af01ca27749f", + "bom-ref": "296226dc0c5aeedf", "name": "/usr/share/vim/vim91/colors/torte.vim", "type": "file" }, { - "bom-ref": "61c9be9d92f6ace8", + "bom-ref": "8f774a337a1e1334", "name": "/usr/share/vim/vim91/colors/wildcharm.vim", "type": "file" }, { - "bom-ref": "92e0911c1c464641", + "bom-ref": "b7b7d33c0d42d42d", "name": "/usr/share/vim/vim91/colors/zaibatsu.vim", "type": "file" }, { - "bom-ref": "4c09cc2f5a2ec611", + "bom-ref": "dfc02dbaa14e2b51", "name": "/usr/share/vim/vim91/colors/zellner.vim", "type": "file" }, { - "bom-ref": "f9565fe87acd5c6f", + "bom-ref": "e0cea0d38d12833f", "name": "/usr/share/vim/vim91/compiler/ant.vim", "type": "file" }, { - "bom-ref": "272145133f7a00ab", + "bom-ref": "c94f1f316d00e167", "name": "/usr/share/vim/vim91/compiler/bcc.vim", "type": "file" }, { - "bom-ref": "ce3abf078c32d592", + "bom-ref": "b66e1a3043523f96", "name": "/usr/share/vim/vim91/compiler/bdf.vim", "type": "file" }, { - "bom-ref": "6fd70b6d77a74a0a", + "bom-ref": "27fe67e43221bcae", "name": "/usr/share/vim/vim91/compiler/cargo.vim", "type": "file" }, { - "bom-ref": "3daa777ba8d6762a", + "bom-ref": "34083582d848ba76", "name": "/usr/share/vim/vim91/compiler/checkstyle.vim", "type": "file" }, { - "bom-ref": "6cc8d535fefcfa91", + "bom-ref": "a8df7db21b8d2791", "name": "/usr/share/vim/vim91/compiler/cm3.vim", "type": "file" }, { - "bom-ref": "8245f93532f53be3", + "bom-ref": "a41329958143ae33", "name": "/usr/share/vim/vim91/compiler/context.vim", "type": "file" }, { - "bom-ref": "985317c66379866d", + "bom-ref": "955f6e4ad93217cd", "name": "/usr/share/vim/vim91/compiler/cs.vim", "type": "file" }, { - "bom-ref": "5a5c13eaaa5c0407", + "bom-ref": "bfa105e99b8bd74f", "name": "/usr/share/vim/vim91/compiler/csslint.vim", "type": "file" }, { - "bom-ref": "7c9292919124912b", + "bom-ref": "26ec2316789ac80f", "name": "/usr/share/vim/vim91/compiler/cucumber.vim", "type": "file" }, { - "bom-ref": "9888abe63384105e", + "bom-ref": "13c12b085ff6b1d6", "name": "/usr/share/vim/vim91/compiler/dart.vim", "type": "file" }, { - "bom-ref": "82bc485dda78107e", + "bom-ref": "83c076859eac1c56", "name": "/usr/share/vim/vim91/compiler/dart2js.vim", "type": "file" }, { - "bom-ref": "04ad4cee57f799b8", + "bom-ref": "ebb74ecee62b2798", "name": "/usr/share/vim/vim91/compiler/dart2native.vim", "type": "file" }, { - "bom-ref": "f805ee123d856f8a", + "bom-ref": "86065f109f27d96e", "name": "/usr/share/vim/vim91/compiler/dartanalyser.vim", "type": "file" }, { - "bom-ref": "8b4baa7247e077dc", + "bom-ref": "931ff32b08ae9ee8", "name": "/usr/share/vim/vim91/compiler/dartdevc.vim", "type": "file" }, { - "bom-ref": "c79142952ef4c53a", + "bom-ref": "36df1232f3ca686e", "name": "/usr/share/vim/vim91/compiler/dartdoc.vim", "type": "file" }, { - "bom-ref": "174d196d4dadff67", + "bom-ref": "4e972fc1dedbdddb", "name": "/usr/share/vim/vim91/compiler/dartfmt.vim", "type": "file" }, { - "bom-ref": "22b191f30342c694", + "bom-ref": "68fa8ab15ab95ff4", "name": "/usr/share/vim/vim91/compiler/decada.vim", "type": "file" }, { - "bom-ref": "3538ca93b1a85942", + "bom-ref": "cedfe6b5765f0d46", "name": "/usr/share/vim/vim91/compiler/dot.vim", "type": "file" }, { - "bom-ref": "df72af6c217ed563", + "bom-ref": "1925140cb432e3ef", "name": "/usr/share/vim/vim91/compiler/dotnet.vim", "type": "file" }, { - "bom-ref": "171378b19b24e8ca", + "bom-ref": "30e34d7689c1fe32", "name": "/usr/share/vim/vim91/compiler/erlang.vim", "type": "file" }, { - "bom-ref": "7a894a13b0de9f05", + "bom-ref": "b57602995b16fc69", "name": "/usr/share/vim/vim91/compiler/eruby.vim", "type": "file" }, { - "bom-ref": "962e4706384bb72f", + "bom-ref": "ab1bb6f924c5ee2b", "name": "/usr/share/vim/vim91/compiler/eslint.vim", "type": "file" }, { - "bom-ref": "6771b4402860fcfc", + "bom-ref": "b9b19a6fb1f5fc28", "name": "/usr/share/vim/vim91/compiler/fbc.vim", "type": "file" }, { - "bom-ref": "64c96adf688b5602", + "bom-ref": "7c163eb32942bd86", "name": "/usr/share/vim/vim91/compiler/fortran_F.vim", "type": "file" }, { - "bom-ref": "cd5c9838dbfb804a", + "bom-ref": "470ee50edea89896", "name": "/usr/share/vim/vim91/compiler/fortran_cv.vim", "type": "file" }, { - "bom-ref": "af9c92a93f7e95e6", + "bom-ref": "f90166ba607bfc7a", "name": "/usr/share/vim/vim91/compiler/fortran_elf90.vim", "type": "file" }, { - "bom-ref": "08385b6f5457c10d", + "bom-ref": "d8eac6275d3c0835", "name": "/usr/share/vim/vim91/compiler/fortran_g77.vim", "type": "file" }, { - "bom-ref": "013e4c37bda1aa84", + "bom-ref": "1ef8f995c088b940", "name": "/usr/share/vim/vim91/compiler/fortran_lf95.vim", "type": "file" }, { - "bom-ref": "eedb0b638260144a", + "bom-ref": "4cb931aa4064131e", "name": "/usr/share/vim/vim91/compiler/fpc.vim", "type": "file" }, { - "bom-ref": "1dd5f82585858e99", + "bom-ref": "4e94937531329921", "name": "/usr/share/vim/vim91/compiler/g95.vim", "type": "file" }, { - "bom-ref": "44198ff3ff6b7ebd", + "bom-ref": "f3e0653bdb8e5ee9", "name": "/usr/share/vim/vim91/compiler/gawk.vim", "type": "file" }, { - "bom-ref": "fef11434d94c33a9", + "bom-ref": "964b8516d00b3d11", "name": "/usr/share/vim/vim91/compiler/gcc.vim", "type": "file" }, { - "bom-ref": "5a8b64c150e33995", + "bom-ref": "f12c63be2a589a51", "name": "/usr/share/vim/vim91/compiler/gfortran.vim", "type": "file" }, { - "bom-ref": "124700f121bdd018", + "bom-ref": "bc34548ec8c39a44", "name": "/usr/share/vim/vim91/compiler/ghc.vim", "type": "file" }, { - "bom-ref": "2b75e5e8c10d1d46", + "bom-ref": "783354b5f26a58e2", "name": "/usr/share/vim/vim91/compiler/gjs.vim", "type": "file" }, { - "bom-ref": "a0fc6b605cdb5c38", + "bom-ref": "85cccca60ff72fac", "name": "/usr/share/vim/vim91/compiler/gm2.vim", "type": "file" }, { - "bom-ref": "b4ad8017ebe2515b", + "bom-ref": "119d9a0d342ab0cf", "name": "/usr/share/vim/vim91/compiler/gnat.vim", "type": "file" }, { - "bom-ref": "ea1322198f125109", + "bom-ref": "740a256a992213a9", "name": "/usr/share/vim/vim91/compiler/go.vim", "type": "file" }, { - "bom-ref": "53d56f95362b25a3", + "bom-ref": "e38f62f4ec003ccf", "name": "/usr/share/vim/vim91/compiler/haml.vim", "type": "file" }, { - "bom-ref": "6d34946002189f86", + "bom-ref": "29e2e2315f5d3672", "name": "/usr/share/vim/vim91/compiler/hare.vim", "type": "file" }, { - "bom-ref": "69c00cf320ed7ece", + "bom-ref": "b7ebb7f85468b856", "name": "/usr/share/vim/vim91/compiler/hp_acc.vim", "type": "file" }, { - "bom-ref": "168bcc3d563ea05b", + "bom-ref": "0950cfbedb815f33", "name": "/usr/share/vim/vim91/compiler/icc.vim", "type": "file" }, { - "bom-ref": "a6211896fbe0b340", + "bom-ref": "86e065b2e7d61520", "name": "/usr/share/vim/vim91/compiler/icon.vim", "type": "file" }, { - "bom-ref": "087628d3f29d3dc1", + "bom-ref": "f0e3bbc24b432aed", "name": "/usr/share/vim/vim91/compiler/ifort.vim", "type": "file" }, { - "bom-ref": "1863d21ce7fe8f08", + "bom-ref": "90d8b378ccf57aa4", "name": "/usr/share/vim/vim91/compiler/intel.vim", "type": "file" }, { - "bom-ref": "cd351fd8ba8ac52c", + "bom-ref": "4ffe83bd91634ba0", "name": "/usr/share/vim/vim91/compiler/irix5_c.vim", "type": "file" }, { - "bom-ref": "40c5bcd670ad32ec", + "bom-ref": "9c896d372b3bae7c", "name": "/usr/share/vim/vim91/compiler/irix5_cpp.vim", "type": "file" }, { - "bom-ref": "85b2f180fbdf24d3", + "bom-ref": "43c3256c3f9d4d2b", "name": "/usr/share/vim/vim91/compiler/javac.vim", "type": "file" }, { - "bom-ref": "16185d8432ec8d9c", + "bom-ref": "6ab7de2980a48a64", "name": "/usr/share/vim/vim91/compiler/jest.vim", "type": "file" }, { - "bom-ref": "107190f48eb8622a", + "bom-ref": "24793a679e30c322", "name": "/usr/share/vim/vim91/compiler/jikes.vim", "type": "file" }, { - "bom-ref": "aaa41855b44e4150", + "bom-ref": "fb0725945047af4c", "name": "/usr/share/vim/vim91/compiler/jjs.vim", "type": "file" }, { - "bom-ref": "376b96c0ccdecde4", + "bom-ref": "55ebdf9eff975f3c", "name": "/usr/share/vim/vim91/compiler/jshint.vim", "type": "file" }, { - "bom-ref": "374edef73d04c035", + "bom-ref": "ecef375903e56329", "name": "/usr/share/vim/vim91/compiler/jsonlint.vim", "type": "file" }, { - "bom-ref": "d0ab80c946dd030e", + "bom-ref": "e714a14d74d582e6", "name": "/usr/share/vim/vim91/compiler/mcs.vim", "type": "file" }, { - "bom-ref": "66d82457d4778b8f", + "bom-ref": "2cceb27785fecd33", "name": "/usr/share/vim/vim91/compiler/mips_c.vim", "type": "file" }, { - "bom-ref": "bc583993b63f36cb", + "bom-ref": "e8d5457da3da84bf", "name": "/usr/share/vim/vim91/compiler/mipspro_c89.vim", "type": "file" }, { - "bom-ref": "c98320b7b07bd83a", + "bom-ref": "097278856cb8930e", "name": "/usr/share/vim/vim91/compiler/mipspro_cpp.vim", "type": "file" }, { - "bom-ref": "3f0de614f18b3c09", + "bom-ref": "052ca7c4b3c7f995", "name": "/usr/share/vim/vim91/compiler/modelsim_vcom.vim", "type": "file" }, { - "bom-ref": "218a32abb17599fe", + "bom-ref": "8585e45723143bc6", "name": "/usr/share/vim/vim91/compiler/msbuild.vim", "type": "file" }, { - "bom-ref": "67e130def2f30d89", + "bom-ref": "3f0541a3f2b59a61", "name": "/usr/share/vim/vim91/compiler/msvc.vim", "type": "file" }, { - "bom-ref": "03f8e51a976d2b66", + "bom-ref": "d82cf02bd39dc406", "name": "/usr/share/vim/vim91/compiler/neato.vim", "type": "file" }, { - "bom-ref": "cea73117f5ea74dd", + "bom-ref": "b2f0fe9655aed171", "name": "/usr/share/vim/vim91/compiler/ocaml.vim", "type": "file" }, { - "bom-ref": "7d842055a2b48db6", + "bom-ref": "316d033b8e41de0e", "name": "/usr/share/vim/vim91/compiler/onsgmls.vim", "type": "file" }, { - "bom-ref": "00d338504a51047c", + "bom-ref": "428f1bcf0a90bd10", "name": "/usr/share/vim/vim91/compiler/pbx.vim", "type": "file" }, { - "bom-ref": "3f479791164833b4", + "bom-ref": "e81914eb8f24ad20", "name": "/usr/share/vim/vim91/compiler/perl.vim", "type": "file" }, { - "bom-ref": "9cb16d237c73c088", + "bom-ref": "f70f85811eecdc44", "name": "/usr/share/vim/vim91/compiler/perlcritic.vim", "type": "file" }, { - "bom-ref": "c8f74305407f8d7b", + "bom-ref": "f9385377a97115f7", "name": "/usr/share/vim/vim91/compiler/php.vim", "type": "file" }, { - "bom-ref": "66306fe62b850874", + "bom-ref": "259246af239a6fdc", "name": "/usr/share/vim/vim91/compiler/podchecker.vim", "type": "file" }, { - "bom-ref": "a641440359e568a8", + "bom-ref": "7d63b76bb52f8a64", "name": "/usr/share/vim/vim91/compiler/powershell.vim", "type": "file" }, { - "bom-ref": "c9b02b2459786cf6", + "bom-ref": "9e5080de00633186", "name": "/usr/share/vim/vim91/compiler/pylint.vim", "type": "file" }, { - "bom-ref": "15b15f4791f18f1c", + "bom-ref": "b487289d755d6904", "name": "/usr/share/vim/vim91/compiler/pyunit.vim", "type": "file" }, { - "bom-ref": "e5d4232531b5a03f", + "bom-ref": "e391b22476beb103", "name": "/usr/share/vim/vim91/compiler/raco.vim", "type": "file" }, { - "bom-ref": "23e2761d2c85c834", + "bom-ref": "b32f214f1126c088", "name": "/usr/share/vim/vim91/compiler/racomake.vim", "type": "file" }, { - "bom-ref": "1a71d3c0ae9a92d9", + "bom-ref": "1e3a049a2d89d41d", "name": "/usr/share/vim/vim91/compiler/racosetup.vim", "type": "file" }, { - "bom-ref": "45a7936dc9712f6d", + "bom-ref": "b2e77e0d16cb5351", "name": "/usr/share/vim/vim91/compiler/racotest.vim", "type": "file" }, { - "bom-ref": "82c41880238d6239", + "bom-ref": "7e391fe7cea1aa3d", "name": "/usr/share/vim/vim91/compiler/rake.vim", "type": "file" }, { - "bom-ref": "3093ca49df43d3e3", + "bom-ref": "8631927c588af2f7", "name": "/usr/share/vim/vim91/compiler/rhino.vim", "type": "file" }, { - "bom-ref": "05de6c132c858201", + "bom-ref": "9652008f447aac3d", "name": "/usr/share/vim/vim91/compiler/rspec.vim", "type": "file" }, { - "bom-ref": "17d736d3d99b916d", + "bom-ref": "664c333095a46379", "name": "/usr/share/vim/vim91/compiler/rst.vim", "type": "file" }, { - "bom-ref": "2bb7ab74adf7055c", + "bom-ref": "cb16d071131f6598", "name": "/usr/share/vim/vim91/compiler/rubocop.vim", "type": "file" }, { - "bom-ref": "d0ffd826763600a2", + "bom-ref": "35c981585ae958ce", "name": "/usr/share/vim/vim91/compiler/ruby.vim", "type": "file" }, { - "bom-ref": "7e6dc9b9b6b2f25c", + "bom-ref": "e644ab879d1b3884", "name": "/usr/share/vim/vim91/compiler/rubyunit.vim", "type": "file" }, { - "bom-ref": "8f2e65bc61ac5ed6", + "bom-ref": "2eac76d8851046ca", "name": "/usr/share/vim/vim91/compiler/rustc.vim", "type": "file" }, { - "bom-ref": "74fc6b895bd304f4", + "bom-ref": "bdf6dd58c7c311ec", "name": "/usr/share/vim/vim91/compiler/sass.vim", "type": "file" }, { - "bom-ref": "a2362fb64911f65c", + "bom-ref": "5e1646447b52f9b0", "name": "/usr/share/vim/vim91/compiler/scdoc.vim", "type": "file" }, { - "bom-ref": "794f2899690337f0", + "bom-ref": "6d3c597ecd3cfa1c", "name": "/usr/share/vim/vim91/compiler/se.vim", "type": "file" }, { - "bom-ref": "ee562b9be8193543", + "bom-ref": "1be888caa3c746ab", "name": "/usr/share/vim/vim91/compiler/shellcheck.vim", "type": "file" }, { - "bom-ref": "bca43f2658f543c0", + "bom-ref": "a9eb139f6e7a1fa4", "name": "/usr/share/vim/vim91/compiler/sml.vim", "type": "file" }, { - "bom-ref": "968dac1b09e3e904", + "bom-ref": "d2e87c052929c004", "name": "/usr/share/vim/vim91/compiler/spectral.vim", "type": "file" }, { - "bom-ref": "eafef42dbe7f7b40", + "bom-ref": "b6d00f4ac84f99f0", "name": "/usr/share/vim/vim91/compiler/splint.vim", "type": "file" }, { - "bom-ref": "b76d2a4972458a98", + "bom-ref": "73f6746a51edaca8", "name": "/usr/share/vim/vim91/compiler/stack.vim", "type": "file" }, { - "bom-ref": "eb3dfa91db5f0ee4", + "bom-ref": "ae0c8dc8e22b9bcc", "name": "/usr/share/vim/vim91/compiler/standard.vim", "type": "file" }, { - "bom-ref": "949a3fe4d4665be5", + "bom-ref": "ec6cfed129b197cd", "name": "/usr/share/vim/vim91/compiler/stylelint.vim", "type": "file" }, { - "bom-ref": "9b466353983d7e23", + "bom-ref": "899c816ac0f203c7", "name": "/usr/share/vim/vim91/compiler/tcl.vim", "type": "file" }, { - "bom-ref": "fd3783367e1a477f", + "bom-ref": "796f9d7f1450cc13", "name": "/usr/share/vim/vim91/compiler/tex.vim", "type": "file" }, { - "bom-ref": "f25441af4996371b", + "bom-ref": "80d25b4f55b0361f", "name": "/usr/share/vim/vim91/compiler/tidy.vim", "type": "file" }, { - "bom-ref": "3476843b1cb025c5", + "bom-ref": "fe2b153234ff70f5", "name": "/usr/share/vim/vim91/compiler/ts-node.vim", "type": "file" }, { - "bom-ref": "6dd9adb66829e217", + "bom-ref": "8727bc0b85be8267", "name": "/usr/share/vim/vim91/compiler/tsc.vim", "type": "file" }, { - "bom-ref": "c27d553a1cf2d17b", + "bom-ref": "b46947507a3aaf7b", "name": "/usr/share/vim/vim91/compiler/typedoc.vim", "type": "file" }, { - "bom-ref": "ba6f98229bbf0674", + "bom-ref": "a9a361a2e0550e4c", "name": "/usr/share/vim/vim91/compiler/xbuild.vim", "type": "file" }, { - "bom-ref": "fb76c08760f8f855", + "bom-ref": "d0bd8fefbdb8a7a1", "name": "/usr/share/vim/vim91/compiler/xmllint.vim", "type": "file" }, { - "bom-ref": "c29c7ed6fcf4d67f", + "bom-ref": "fc523f3acecf024b", "name": "/usr/share/vim/vim91/compiler/xmlwf.vim", "type": "file" }, { - "bom-ref": "f82da44836543a80", + "bom-ref": "62543e5edb3decb4", "name": "/usr/share/vim/vim91/compiler/xo.vim", "type": "file" }, { - "bom-ref": "a0becfc1f02b3636", + "bom-ref": "235976f168af0fba", "name": "/usr/share/vim/vim91/compiler/yamllint.vim", "type": "file" }, { - "bom-ref": "4605130161fac804", + "bom-ref": "bd71870bdd5ea9d4", "name": "/usr/share/vim/vim91/compiler/zig.vim", "type": "file" }, { - "bom-ref": "963aaa1be2663d67", + "bom-ref": "e1ff61a27fe49b73", "name": "/usr/share/vim/vim91/compiler/zig_build.vim", "type": "file" }, { - "bom-ref": "59c918e973f86268", + "bom-ref": "dcfd72dcb79b7a48", "name": "/usr/share/vim/vim91/compiler/zig_build_exe.vim", "type": "file" }, { - "bom-ref": "8d18e4e7c0f3cd80", + "bom-ref": "2cb56316fdf2d840", "name": "/usr/share/vim/vim91/compiler/zig_test.vim", "type": "file" }, { - "bom-ref": "b2bf3940c5f1fc67", + "bom-ref": "eb38fea894c5dcef", "name": "/usr/share/vim/vim91/compiler/zsh.vim", "type": "file" }, { - "bom-ref": "e11adc8be20e9061", + "bom-ref": "42f3b00c80c95671", "name": "/usr/share/vim/vim91/debian.vim", "type": "file" }, { - "bom-ref": "138cf8ecb72294c9", + "bom-ref": "cccd7ef5092d467d", "name": "/usr/share/vim/vim91/defaults.vim", "type": "file" }, { - "bom-ref": "2fd9c2f5f53a5c65", + "bom-ref": "f46b68be45dc5b45", "name": "/usr/share/vim/vim91/delmenu.vim", "type": "file" }, { - "bom-ref": "cd99ac9d4a8c6019", + "bom-ref": "9e171e3230658181", "name": "/usr/share/vim/vim91/doc/arabic.txt", "type": "file" }, { - "bom-ref": "1ab6258242a78f66", + "bom-ref": "b520ecc3519e7436", "name": "/usr/share/vim/vim91/doc/autocmd.txt", "type": "file" }, { - "bom-ref": "82b826b426326877", + "bom-ref": "d49de67575838b7b", "name": "/usr/share/vim/vim91/doc/builtin.txt", "type": "file" }, { - "bom-ref": "b668508e447399e3", + "bom-ref": "45b1e83283b116f7", "name": "/usr/share/vim/vim91/doc/change.txt", "type": "file" }, { - "bom-ref": "5767ae0f48f4026c", + "bom-ref": "e5a11d880046efc4", "name": "/usr/share/vim/vim91/doc/channel.txt", "type": "file" }, { - "bom-ref": "798e05a1ad0492af", + "bom-ref": "95549dcef827992f", "name": "/usr/share/vim/vim91/doc/cmdline.txt", "type": "file" }, { - "bom-ref": "d4f85267e34747fe", + "bom-ref": "fba9369f52491902", "name": "/usr/share/vim/vim91/doc/debug.txt", "type": "file" }, { - "bom-ref": "eb1fbf72d1b1126f", + "bom-ref": "7159d827e0b984eb", "name": "/usr/share/vim/vim91/doc/debugger.txt", "type": "file" }, { - "bom-ref": "96b7b1282eabf8b7", + "bom-ref": "af41cd773e71565f", "name": "/usr/share/vim/vim91/doc/develop.txt", "type": "file" }, { - "bom-ref": "bc7ae4b1490d383e", + "bom-ref": "ec3fe71f70864366", "name": "/usr/share/vim/vim91/doc/diff.txt", "type": "file" }, { - "bom-ref": "0a85f05fa396db9a", + "bom-ref": "8b12381c409e9ce6", "name": "/usr/share/vim/vim91/doc/digraph.txt", "type": "file" }, { - "bom-ref": "da9ed67d88408e4b", + "bom-ref": "c4e23438d3c98ea3", "name": "/usr/share/vim/vim91/doc/editing.txt", "type": "file" }, { - "bom-ref": "2ea8a6e62294ece0", + "bom-ref": "4cb0291f11cde994", "name": "/usr/share/vim/vim91/doc/eval.txt", "type": "file" }, { - "bom-ref": "f7a5c3794428148d", + "bom-ref": "8d1665f01b460d7d", "name": "/usr/share/vim/vim91/doc/farsi.txt", "type": "file" }, { - "bom-ref": "c723ea1840d1080e", + "bom-ref": "c5348f2d1d0a484a", "name": "/usr/share/vim/vim91/doc/filetype.txt", "type": "file" }, { - "bom-ref": "8d0aa70b2b17eb73", + "bom-ref": "6c761651e526ebf3", "name": "/usr/share/vim/vim91/doc/fold.txt", "type": "file" }, { - "bom-ref": "f35c256502f65646", + "bom-ref": "f655d9c61ba1950e", "name": "/usr/share/vim/vim91/doc/ft_ada.txt", "type": "file" }, { - "bom-ref": "a539eb7f35fa22d0", + "bom-ref": "8e5b0a711920f8cc", "name": "/usr/share/vim/vim91/doc/ft_context.txt", "type": "file" }, { - "bom-ref": "c4e475966b2606f3", + "bom-ref": "93a801a1ae405acb", "name": "/usr/share/vim/vim91/doc/ft_mp.txt", "type": "file" }, { - "bom-ref": "ce3be56d04c49cb6", + "bom-ref": "44b4f658ab15e536", "name": "/usr/share/vim/vim91/doc/ft_ps1.txt", "type": "file" }, { - "bom-ref": "18a018c570a1c075", + "bom-ref": "4a23edc6942c697d", "name": "/usr/share/vim/vim91/doc/ft_raku.txt", "type": "file" }, { - "bom-ref": "bf6abc243ded1058", + "bom-ref": "bc8f63ab7458bf88", "name": "/usr/share/vim/vim91/doc/ft_rust.txt", "type": "file" }, { - "bom-ref": "6e72d9fb512a8957", + "bom-ref": "34385061658c45d7", "name": "/usr/share/vim/vim91/doc/ft_sql.txt", "type": "file" }, { - "bom-ref": "1943bc2317c397be", + "bom-ref": "21a3ccafe8891762", "name": "/usr/share/vim/vim91/doc/gui.txt", "type": "file" }, { - "bom-ref": "786c5550d8d1c13b", + "bom-ref": "1138294e366e0d7b", "name": "/usr/share/vim/vim91/doc/gui_w32.txt", "type": "file" }, { - "bom-ref": "675791110908087a", + "bom-ref": "8c2cb5a3df401206", "name": "/usr/share/vim/vim91/doc/gui_x11.txt", "type": "file" }, { - "bom-ref": "8c1368b32e9bdbcc", + "bom-ref": "cd3ef60443d409f8", "name": "/usr/share/vim/vim91/doc/hangulin.txt", "type": "file" }, { - "bom-ref": "2ed062a5e53c6c35", + "bom-ref": "d3f5af48c90f5db1", "name": "/usr/share/vim/vim91/doc/hebrew.txt", "type": "file" }, { - "bom-ref": "7335c4d25beb8b30", + "bom-ref": "e03a35c947067fb8", "name": "/usr/share/vim/vim91/doc/help.txt", "type": "file" }, { - "bom-ref": "fa74755db90f5003", + "bom-ref": "875431cb94211fb7", "name": "/usr/share/vim/vim91/doc/helphelp.txt", "type": "file" }, { - "bom-ref": "390d7549b3149a02", + "bom-ref": "fcf6e15167dd4f82", "name": "/usr/share/vim/vim91/doc/howto.txt", "type": "file" }, { - "bom-ref": "6331e81822435e9a", + "bom-ref": "8fb251a1f2333366", "name": "/usr/share/vim/vim91/doc/if_cscop.txt", "type": "file" }, { - "bom-ref": "49ff2414a3dfeb86", + "bom-ref": "2b2f435d3150fafe", "name": "/usr/share/vim/vim91/doc/if_lua.txt", "type": "file" }, { - "bom-ref": "bac262c0b96b6f9e", + "bom-ref": "27e237f3f1ad7fe2", "name": "/usr/share/vim/vim91/doc/if_mzsch.txt", "type": "file" }, { - "bom-ref": "3930bde15d3907bc", + "bom-ref": "1ab76c1acab6f5e0", "name": "/usr/share/vim/vim91/doc/if_ole.txt", "type": "file" }, { - "bom-ref": "7fd6470729974af8", + "bom-ref": "6e2301837de4e54c", "name": "/usr/share/vim/vim91/doc/if_perl.txt", "type": "file" }, { - "bom-ref": "6898e861e0d4f704", + "bom-ref": "db0ffb2daf361c44", "name": "/usr/share/vim/vim91/doc/if_pyth.txt", "type": "file" }, { - "bom-ref": "13206fcc85529091", + "bom-ref": "a65edfd47daf4659", "name": "/usr/share/vim/vim91/doc/if_ruby.txt", "type": "file" }, { - "bom-ref": "48ae247d4d2e2dd7", + "bom-ref": "4ddd45be0565e84b", "name": "/usr/share/vim/vim91/doc/if_sniff.txt", "type": "file" }, { - "bom-ref": "2668df7c30a06449", + "bom-ref": "e78db29fc4321c91", "name": "/usr/share/vim/vim91/doc/if_tcl.txt", "type": "file" }, { - "bom-ref": "b2e8110153cb33d1", + "bom-ref": "905c6a94f2dd3a11", "name": "/usr/share/vim/vim91/doc/indent.txt", "type": "file" }, { - "bom-ref": "2b67d9f476c99230", + "bom-ref": "26a0a77bf811f084", "name": "/usr/share/vim/vim91/doc/index.txt", "type": "file" }, { - "bom-ref": "5e2b3d1497070de4", + "bom-ref": "203ef2263d34ee40", "name": "/usr/share/vim/vim91/doc/insert.txt", "type": "file" }, { - "bom-ref": "5efc84b889f58a27", + "bom-ref": "734fa737d550dae7", "name": "/usr/share/vim/vim91/doc/intro.txt", "type": "file" }, { - "bom-ref": "5d01111596ca2f26", + "bom-ref": "f4a25727df74ae66", "name": "/usr/share/vim/vim91/doc/map.txt", "type": "file" }, { - "bom-ref": "99bb40f7a184fff2", + "bom-ref": "e69ef63d67c3bed2", "name": "/usr/share/vim/vim91/doc/mbyte.txt", "type": "file" }, { - "bom-ref": "52829af933f668bd", + "bom-ref": "39f2b7fc3ad27a15", "name": "/usr/share/vim/vim91/doc/message.txt", "type": "file" }, { - "bom-ref": "b2cf0178ba55c91a", + "bom-ref": "905508e40f0d37b2", "name": "/usr/share/vim/vim91/doc/mlang.txt", "type": "file" }, { - "bom-ref": "7f8d0b1f5b0d7389", + "bom-ref": "94df59c59bd87995", "name": "/usr/share/vim/vim91/doc/motion.txt", "type": "file" }, { - "bom-ref": "e07b331a4802adee", + "bom-ref": "b716d4e91c5b0d92", "name": "/usr/share/vim/vim91/doc/netbeans.txt", "type": "file" }, { - "bom-ref": "167a8e36893ff5ad", + "bom-ref": "481a4e89676fd331", "name": "/usr/share/vim/vim91/doc/options.txt", "type": "file" }, { - "bom-ref": "e8ac0b8361b32d5f", + "bom-ref": "af9528a1e6b8b54b", "name": "/usr/share/vim/vim91/doc/os_390.txt", "type": "file" }, { - "bom-ref": "4ef916da6e2856b5", + "bom-ref": "85e74d6260eb2af5", "name": "/usr/share/vim/vim91/doc/os_amiga.txt", "type": "file" }, { - "bom-ref": "6ecc34340e655e37", + "bom-ref": "2cf85fc89ae300ef", "name": "/usr/share/vim/vim91/doc/os_beos.txt", "type": "file" }, { - "bom-ref": "cf65fde37fafe188", + "bom-ref": "4e8329fc4e19846c", "name": "/usr/share/vim/vim91/doc/os_dos.txt", "type": "file" }, { - "bom-ref": "1d5cd38d146974e1", + "bom-ref": "a034bbc910d60fc1", "name": "/usr/share/vim/vim91/doc/os_haiku.txt", "type": "file" }, { - "bom-ref": "71947fd3ecfade1b", + "bom-ref": "d1a32ecf2f946197", "name": "/usr/share/vim/vim91/doc/os_mac.txt", "type": "file" }, { - "bom-ref": "4173907d21f9fcca", + "bom-ref": "46be6c117c25d3ee", "name": "/usr/share/vim/vim91/doc/os_mint.txt", "type": "file" }, { - "bom-ref": "934a4ad9bf918fd5", + "bom-ref": "086f2ccd2e311c95", "name": "/usr/share/vim/vim91/doc/os_msdos.txt", "type": "file" }, { - "bom-ref": "b0450d9f42474f11", + "bom-ref": "acd2dc56e8484b29", "name": "/usr/share/vim/vim91/doc/os_os2.txt", "type": "file" }, { - "bom-ref": "43381baf4e75864e", + "bom-ref": "bf2bc4fa8920f4c6", "name": "/usr/share/vim/vim91/doc/os_qnx.txt", "type": "file" }, { - "bom-ref": "5591a13a37a43a78", + "bom-ref": "4f6410b1db9c80b8", "name": "/usr/share/vim/vim91/doc/os_risc.txt", "type": "file" }, { - "bom-ref": "b7df17ba3e362a5b", + "bom-ref": "64ab339d509552bf", "name": "/usr/share/vim/vim91/doc/os_unix.txt", "type": "file" }, { - "bom-ref": "3807c07f780560e1", + "bom-ref": "e4f15e405da1c949", "name": "/usr/share/vim/vim91/doc/os_vms.txt", "type": "file" }, { - "bom-ref": "fd58885e5d057e39", + "bom-ref": "54051567754c9371", "name": "/usr/share/vim/vim91/doc/os_win32.txt", "type": "file" }, { - "bom-ref": "904639bb01481e3b", + "bom-ref": "203429f00dbe196b", "name": "/usr/share/vim/vim91/doc/pattern.txt", "type": "file" }, { - "bom-ref": "0b81f8847bc6279d", + "bom-ref": "c36e59168587aa31", "name": "/usr/share/vim/vim91/doc/pi_getscript.txt", "type": "file" }, { - "bom-ref": "2b5373385d321a46", + "bom-ref": "4ae9fe9b457669d6", "name": "/usr/share/vim/vim91/doc/pi_gzip.txt", "type": "file" }, { - "bom-ref": "0db146c50b31d8ea", + "bom-ref": "d10938f50bd58846", "name": "/usr/share/vim/vim91/doc/pi_logipat.txt", "type": "file" }, { - "bom-ref": "2e7c30dbcc5a2ef0", + "bom-ref": "b7b8f9c96622a31c", "name": "/usr/share/vim/vim91/doc/pi_netrw.txt", "type": "file" }, { - "bom-ref": "4539c67822a5cf88", + "bom-ref": "8c2f7f3c96b207b8", "name": "/usr/share/vim/vim91/doc/pi_paren.txt", "type": "file" }, { - "bom-ref": "c7facb09c556e34c", + "bom-ref": "731ded6fa27e3e68", "name": "/usr/share/vim/vim91/doc/pi_spec.txt", "type": "file" }, { - "bom-ref": "5bcca5fd3e22fc6d", + "bom-ref": "2d89fc4012556509", "name": "/usr/share/vim/vim91/doc/pi_tar.txt", "type": "file" }, { - "bom-ref": "ae49a0feb5708d8d", + "bom-ref": "b4bebc9d86bf69a1", "name": "/usr/share/vim/vim91/doc/pi_vimball.txt", "type": "file" }, { - "bom-ref": "17dabbe47743d743", + "bom-ref": "0dbf17eabdd7ab0b", "name": "/usr/share/vim/vim91/doc/pi_zip.txt", "type": "file" }, { - "bom-ref": "eb7987dd6078201f", + "bom-ref": "1dd46829a3f7d5a3", "name": "/usr/share/vim/vim91/doc/popup.txt", "type": "file" }, { - "bom-ref": "df9c6fce24abb0e4", + "bom-ref": "9988b31a76bd7e34", "name": "/usr/share/vim/vim91/doc/print.txt", "type": "file" }, { - "bom-ref": "2663e4553d776a52", + "bom-ref": "5ad143522846009a", "name": "/usr/share/vim/vim91/doc/quickfix.txt", "type": "file" }, { - "bom-ref": "3cc306dc6ec443f4", + "bom-ref": "42b9fced999a6368", "name": "/usr/share/vim/vim91/doc/quickref.txt", "type": "file" }, { - "bom-ref": "839f936308044b82", + "bom-ref": "43410025ceb0613e", "name": "/usr/share/vim/vim91/doc/quotes.txt", "type": "file" }, { - "bom-ref": "c31eccda86301743", + "bom-ref": "2619e5e4a7f1c737", "name": "/usr/share/vim/vim91/doc/recover.txt", "type": "file" }, { - "bom-ref": "0a0388880050c1e2", + "bom-ref": "531b78222b973bba", "name": "/usr/share/vim/vim91/doc/remote.txt", "type": "file" }, { - "bom-ref": "762f99c6b0523f4a", + "bom-ref": "55c15adef708f22a", "name": "/usr/share/vim/vim91/doc/repeat.txt", "type": "file" }, { - "bom-ref": "ece792404a384114", + "bom-ref": "474dbec661b9b058", "name": "/usr/share/vim/vim91/doc/rileft.txt", "type": "file" }, { - "bom-ref": "1c8df5004ab19b3b", + "bom-ref": "c5f1d22fe9f58053", "name": "/usr/share/vim/vim91/doc/russian.txt", "type": "file" }, { - "bom-ref": "d1cb7e8d2e4d9f3e", + "bom-ref": "3751355ac074a89a", "name": "/usr/share/vim/vim91/doc/scroll.txt", "type": "file" }, { - "bom-ref": "0355e046bc78a700", + "bom-ref": "2059923da2917bc4", "name": "/usr/share/vim/vim91/doc/sign.txt", "type": "file" }, { - "bom-ref": "1f04cd3544011a71", + "bom-ref": "6e9b1fb8664cb1f1", "name": "/usr/share/vim/vim91/doc/spell.txt", "type": "file" }, { - "bom-ref": "4e0f60faa8aab7f7", + "bom-ref": "2cce5caa4a891c77", "name": "/usr/share/vim/vim91/doc/sponsor.txt", "type": "file" }, { - "bom-ref": "7ef58f30d466d63c", + "bom-ref": "b2c219f4a6c350b4", "name": "/usr/share/vim/vim91/doc/starting.txt", "type": "file" }, { - "bom-ref": "0676b8d1a0286f7b", + "bom-ref": "69a870e2f52a68f7", "name": "/usr/share/vim/vim91/doc/syntax.txt", "type": "file" }, { - "bom-ref": "0101def7c883c930", + "bom-ref": "eeb88fa7f0346c64", "name": "/usr/share/vim/vim91/doc/tabpage.txt", "type": "file" }, { - "bom-ref": "52cfb37f0f6be162", + "bom-ref": "80bcbc55d9aa8e86", "name": "/usr/share/vim/vim91/doc/tags", "type": "file" }, { - "bom-ref": "8c2908e91d502c5d", + "bom-ref": "8949011d9fe6a961", "name": "/usr/share/vim/vim91/doc/tagsrch.txt", "type": "file" }, { - "bom-ref": "8a8ff36112136e0e", + "bom-ref": "fa6a3fa67645615e", "name": "/usr/share/vim/vim91/doc/term.txt", "type": "file" }, { - "bom-ref": "e365dd0ca3472d51", + "bom-ref": "bf7bc41e57382ef1", "name": "/usr/share/vim/vim91/doc/terminal.txt", "type": "file" }, { - "bom-ref": "38d8e756d09815b7", + "bom-ref": "170cb8aa3738944f", "name": "/usr/share/vim/vim91/doc/testing.txt", "type": "file" }, { - "bom-ref": "a161bb7a2d8a03b4", + "bom-ref": "4831efa82684dc34", "name": "/usr/share/vim/vim91/doc/textprop.txt", "type": "file" }, { - "bom-ref": "4d9b3d459762ae45", + "bom-ref": "763c6ac8b21c2c51", "name": "/usr/share/vim/vim91/doc/tips.txt", "type": "file" }, { - "bom-ref": "34aee8bebcf07197", + "bom-ref": "a07ae82dc1c8a797", "name": "/usr/share/vim/vim91/doc/todo.txt", "type": "file" }, { - "bom-ref": "da8088ce8496d21f", + "bom-ref": "716cf00641ba818b", "name": "/usr/share/vim/vim91/doc/uganda.txt", "type": "file" }, { - "bom-ref": "fa28b4a17a69e236", + "bom-ref": "d7ff376d6bdde56e", "name": "/usr/share/vim/vim91/doc/undo.txt", "type": "file" }, { - "bom-ref": "6d30b0749a2a5c01", + "bom-ref": "e9db39ac19f5d515", "name": "/usr/share/vim/vim91/doc/userfunc.txt", "type": "file" }, { - "bom-ref": "bdbacc86aa99e0b3", + "bom-ref": "83f08f384cc5d977", "name": "/usr/share/vim/vim91/doc/usr_01.txt", "type": "file" }, { - "bom-ref": "12ba82cb3f9b4f90", + "bom-ref": "85fd5abba74484e0", "name": "/usr/share/vim/vim91/doc/usr_02.txt", "type": "file" }, { - "bom-ref": "04b4b2782dec31a8", + "bom-ref": "ca7ba83f71fb56c4", "name": "/usr/share/vim/vim91/doc/usr_03.txt", "type": "file" }, { - "bom-ref": "bfa7e11a3308fb9e", + "bom-ref": "af162eb9e0da39c2", "name": "/usr/share/vim/vim91/doc/usr_04.txt", "type": "file" }, { - "bom-ref": "5d9665a6f60ccddc", + "bom-ref": "0ccea14807d56d34", "name": "/usr/share/vim/vim91/doc/usr_05.txt", "type": "file" }, { - "bom-ref": "b24c072809477143", + "bom-ref": "54b2fa66b4084247", "name": "/usr/share/vim/vim91/doc/usr_06.txt", "type": "file" }, { - "bom-ref": "7d5793d306f7d38a", + "bom-ref": "1c5e431068d3ac7a", "name": "/usr/share/vim/vim91/doc/usr_07.txt", "type": "file" }, { - "bom-ref": "0e551bf105dc67e4", + "bom-ref": "182b26f03d28c1d4", "name": "/usr/share/vim/vim91/doc/usr_08.txt", "type": "file" }, { - "bom-ref": "025daece24d3424c", + "bom-ref": "add6e3e990e32bd4", "name": "/usr/share/vim/vim91/doc/usr_09.txt", "type": "file" }, { - "bom-ref": "e71d6b09a3d5ca8b", + "bom-ref": "028fb328c6df5be7", "name": "/usr/share/vim/vim91/doc/usr_10.txt", "type": "file" }, { - "bom-ref": "22d3b20396baf631", + "bom-ref": "0906db9e1ca99f19", "name": "/usr/share/vim/vim91/doc/usr_11.txt", "type": "file" }, { - "bom-ref": "4c9de9661067aafb", + "bom-ref": "d383ff4b4bb4779b", "name": "/usr/share/vim/vim91/doc/usr_12.txt", "type": "file" }, { - "bom-ref": "e9eebe5706f81151", + "bom-ref": "954b970149262ca5", "name": "/usr/share/vim/vim91/doc/usr_20.txt", "type": "file" }, { - "bom-ref": "c548140b797d91f8", + "bom-ref": "8a1b79d753dc712c", "name": "/usr/share/vim/vim91/doc/usr_21.txt", "type": "file" }, { - "bom-ref": "19d5f21e798ef012", + "bom-ref": "3311e4db9d41c9fa", "name": "/usr/share/vim/vim91/doc/usr_22.txt", "type": "file" }, { - "bom-ref": "d42d7253370a895e", + "bom-ref": "ac82eb522979617a", "name": "/usr/share/vim/vim91/doc/usr_23.txt", "type": "file" }, { - "bom-ref": "1803167324d73033", + "bom-ref": "e43125dee45a5c67", "name": "/usr/share/vim/vim91/doc/usr_24.txt", "type": "file" }, { - "bom-ref": "a7991e12763b122a", + "bom-ref": "aef8dbaa0b3666e6", "name": "/usr/share/vim/vim91/doc/usr_25.txt", "type": "file" }, { - "bom-ref": "7dd84e18ce643889", + "bom-ref": "104eb4bd6affce51", "name": "/usr/share/vim/vim91/doc/usr_26.txt", "type": "file" }, { - "bom-ref": "e463db43435b3740", + "bom-ref": "98581a633e2680ac", "name": "/usr/share/vim/vim91/doc/usr_27.txt", "type": "file" }, { - "bom-ref": "f90fd34585616f03", + "bom-ref": "cfe9dae458a068f7", "name": "/usr/share/vim/vim91/doc/usr_28.txt", "type": "file" }, { - "bom-ref": "61781e25be9bdd00", + "bom-ref": "f3f77aed0aac4b54", "name": "/usr/share/vim/vim91/doc/usr_29.txt", "type": "file" }, { - "bom-ref": "e47a2e44021c8452", + "bom-ref": "a850d3eb9e6e49d2", "name": "/usr/share/vim/vim91/doc/usr_30.txt", "type": "file" }, { - "bom-ref": "e045339185919a36", + "bom-ref": "e626330aed2af4ee", "name": "/usr/share/vim/vim91/doc/usr_31.txt", "type": "file" }, { - "bom-ref": "385a2efe2fa2badb", + "bom-ref": "f12e72d19ba83d17", "name": "/usr/share/vim/vim91/doc/usr_32.txt", "type": "file" }, { - "bom-ref": "a18a75e058dfd830", + "bom-ref": "ab2f5742b2c58ccc", "name": "/usr/share/vim/vim91/doc/usr_40.txt", "type": "file" }, { - "bom-ref": "3849fb2c6f0ba9a9", + "bom-ref": "9d0b9f214460d505", "name": "/usr/share/vim/vim91/doc/usr_41.txt", "type": "file" }, { - "bom-ref": "3478bfb2be0b4a4e", + "bom-ref": "6eb11f699ed81a8e", "name": "/usr/share/vim/vim91/doc/usr_42.txt", "type": "file" }, { - "bom-ref": "d7d1dd24284f16ba", + "bom-ref": "dda6aab167078d26", "name": "/usr/share/vim/vim91/doc/usr_43.txt", "type": "file" }, { - "bom-ref": "c7c608c79f5d57d0", + "bom-ref": "e22a49467ddc43cc", "name": "/usr/share/vim/vim91/doc/usr_44.txt", "type": "file" }, { - "bom-ref": "5f744f042a4d6ae7", + "bom-ref": "2a3435dce7e3fb3f", "name": "/usr/share/vim/vim91/doc/usr_45.txt", "type": "file" }, { - "bom-ref": "fa318c672357a98d", + "bom-ref": "f7967b005702a60d", "name": "/usr/share/vim/vim91/doc/usr_50.txt", "type": "file" }, { - "bom-ref": "a9a98b5d9619e3ea", + "bom-ref": "6aca13e1f4dd4ad2", "name": "/usr/share/vim/vim91/doc/usr_51.txt", "type": "file" }, { - "bom-ref": "3d5313cd87cf983c", + "bom-ref": "d4a493f2462f0764", "name": "/usr/share/vim/vim91/doc/usr_52.txt", "type": "file" }, { - "bom-ref": "3e6e7e3b023fe980", + "bom-ref": "aa0edca7770a30c8", "name": "/usr/share/vim/vim91/doc/usr_90.txt", "type": "file" }, { - "bom-ref": "8ca7aeb905f7bb30", + "bom-ref": "ce20a0b7629cb26c", "name": "/usr/share/vim/vim91/doc/usr_toc.txt", "type": "file" }, { - "bom-ref": "b80deb1e01d1d72a", + "bom-ref": "99013c00e3cdf1da", "name": "/usr/share/vim/vim91/doc/various.txt", "type": "file" }, { - "bom-ref": "6badc19d55c86284", + "bom-ref": "9f5ffd83d6106070", "name": "/usr/share/vim/vim91/doc/version4.txt", "type": "file" }, { - "bom-ref": "bef2a9426b49074d", + "bom-ref": "79ea6b3e49b18051", "name": "/usr/share/vim/vim91/doc/version5.txt", "type": "file" }, { - "bom-ref": "f2c3bd779a856512", + "bom-ref": "2c832b8b3f95dac2", "name": "/usr/share/vim/vim91/doc/version6.txt", "type": "file" }, { - "bom-ref": "19227fe107b55ee9", + "bom-ref": "1b7273f32d7dfbcd", "name": "/usr/share/vim/vim91/doc/version7.txt", "type": "file" }, { - "bom-ref": "7a6fdf35836facad", + "bom-ref": "ea1c6e0c99f806f9", "name": "/usr/share/vim/vim91/doc/version8.txt", "type": "file" }, { - "bom-ref": "1e6ee5a8049fa63e", + "bom-ref": "9c7150c3e3cbd096", "name": "/usr/share/vim/vim91/doc/version9.txt", "type": "file" }, { - "bom-ref": "01ad1d4aa7fb29d5", + "bom-ref": "c3da8854b3cd8e51", "name": "/usr/share/vim/vim91/doc/vi_diff.txt", "type": "file" }, { - "bom-ref": "cbb6a2c865f79d8a", + "bom-ref": "c68c3a724a91833a", "name": "/usr/share/vim/vim91/doc/vim9.txt", "type": "file" }, { - "bom-ref": "cdb8ec23763dda6f", + "bom-ref": "bb73d4ada440a87b", "name": "/usr/share/vim/vim91/doc/vim9class.txt", "type": "file" }, { - "bom-ref": "1e850af34b64174c", + "bom-ref": "89c2becc95d74724", "name": "/usr/share/vim/vim91/doc/visual.txt", "type": "file" }, { - "bom-ref": "3b1cf925f362a5f1", + "bom-ref": "ba80ec51eed70921", "name": "/usr/share/vim/vim91/doc/windows.txt", "type": "file" }, { - "bom-ref": "ca237adee70d4a00", + "bom-ref": "90e4db60f5b4b1f8", "name": "/usr/share/vim/vim91/doc/workshop.txt", "type": "file" }, { - "bom-ref": "c43a1dec0e6d2320", + "bom-ref": "fd4f72e4b822749c", "name": "/usr/share/vim/vim91/evim.vim", "type": "file" }, { - "bom-ref": "e075076bc11e0b44", + "bom-ref": "17d7749a6748eb2c", "name": "/usr/share/vim/vim91/filetype.vim", "type": "file" }, { - "bom-ref": "2a872e96308800c1", + "bom-ref": "92dc84cac5ae5b31", "name": "/usr/share/vim/vim91/ftoff.vim", "type": "file" }, { - "bom-ref": "fe5311ca83a0d302", + "bom-ref": "0e4baf43f7b9218a", "name": "/usr/share/vim/vim91/ftplugin.vim", "type": "file" }, { - "bom-ref": "da4fd6c08d01b8e9", + "bom-ref": "bb4958897e56ec61", "name": "/usr/share/vim/vim91/ftplugin/8th.vim", "type": "file" }, { - "bom-ref": "889fe1e0bff2ab65", + "bom-ref": "452dec539e2638c9", "name": "/usr/share/vim/vim91/ftplugin/a2ps.vim", "type": "file" }, { - "bom-ref": "30dc7836be24f4dd", + "bom-ref": "1c76f6772d1db6bd", "name": "/usr/share/vim/vim91/ftplugin/aap.vim", "type": "file" }, { - "bom-ref": "da253ab16036ea00", + "bom-ref": "abeb6e34f58df0d8", "name": "/usr/share/vim/vim91/ftplugin/abap.vim", "type": "file" }, { - "bom-ref": "82f2928711716324", + "bom-ref": "d51dc6680a74ce2c", "name": "/usr/share/vim/vim91/ftplugin/abaqus.vim", "type": "file" }, { - "bom-ref": "61280da14b970ee2", + "bom-ref": "d08f327980cd666e", "name": "/usr/share/vim/vim91/ftplugin/ada.vim", "type": "file" }, { - "bom-ref": "ec2926dd732bc984", + "bom-ref": "242ee2f119beb098", "name": "/usr/share/vim/vim91/ftplugin/alsaconf.vim", "type": "file" }, { - "bom-ref": "0de2f00fb648e949", + "bom-ref": "55f4f809e04351a9", "name": "/usr/share/vim/vim91/ftplugin/ant.vim", "type": "file" }, { - "bom-ref": "a16b00e1cfd9ed86", + "bom-ref": "bdd39352cc23695a", "name": "/usr/share/vim/vim91/ftplugin/apache.vim", "type": "file" }, { - "bom-ref": "0d0a77cfe4133122", + "bom-ref": "24f8c05d00097686", "name": "/usr/share/vim/vim91/ftplugin/arch.vim", "type": "file" }, { - "bom-ref": "fd6cf8668ba65f8d", + "bom-ref": "5720b70814f91189", "name": "/usr/share/vim/vim91/ftplugin/art.vim", "type": "file" }, { - "bom-ref": "a2f6cd034b6670c2", + "bom-ref": "eee299d7d09a2226", "name": "/usr/share/vim/vim91/ftplugin/asm.vim", "type": "file" }, { - "bom-ref": "2fe33376a8b10f82", + "bom-ref": "e0c876b44876ec02", "name": "/usr/share/vim/vim91/ftplugin/aspvbs.vim", "type": "file" }, { - "bom-ref": "fc74f0355d272dd8", + "bom-ref": "f3be7931f7c997ec", "name": "/usr/share/vim/vim91/ftplugin/automake.vim", "type": "file" }, { - "bom-ref": "11c53bf71add1098", + "bom-ref": "9d25ad4d63e03a4c", "name": "/usr/share/vim/vim91/ftplugin/awk.vim", "type": "file" }, { - "bom-ref": "8ec333188ae60589", + "bom-ref": "d50c2e50ed75ac21", "name": "/usr/share/vim/vim91/ftplugin/bash.vim", "type": "file" }, { - "bom-ref": "4f4c6cc14c1b119f", + "bom-ref": "fe78551249f74c13", "name": "/usr/share/vim/vim91/ftplugin/basic.vim", "type": "file" }, { - "bom-ref": "03883c5c4c09d2e0", + "bom-ref": "3d94040e43958c4c", "name": "/usr/share/vim/vim91/ftplugin/bdf.vim", "type": "file" }, { - "bom-ref": "4df52ef3801e1a09", + "bom-ref": "0ee20491d4a71231", "name": "/usr/share/vim/vim91/ftplugin/bitbake.vim", "type": "file" }, { - "bom-ref": "83d135a77ab3ff45", + "bom-ref": "d696373bcd226fcd", "name": "/usr/share/vim/vim91/ftplugin/bst.vim", "type": "file" }, { - "bom-ref": "dd9a9fb12ac3c19d", + "bom-ref": "2a409ed61c3d9ffd", "name": "/usr/share/vim/vim91/ftplugin/btm.vim", "type": "file" }, { - "bom-ref": "0751703dce099e20", + "bom-ref": "c5a2160e1cfa95d0", "name": "/usr/share/vim/vim91/ftplugin/bzl.vim", "type": "file" }, { - "bom-ref": "0a526951cc411e55", + "bom-ref": "9f2ff7789de87595", "name": "/usr/share/vim/vim91/ftplugin/c.vim", "type": "file" }, { - "bom-ref": "1e9742e70f013b87", + "bom-ref": "2d05eb3899dfef63", "name": "/usr/share/vim/vim91/ftplugin/calendar.vim", "type": "file" }, { - "bom-ref": "77c9bcfeae85d60b", + "bom-ref": "134becdb7f50fd63", "name": "/usr/share/vim/vim91/ftplugin/cdrdaoconf.vim", "type": "file" }, { - "bom-ref": "e5c48e2f15651d43", + "bom-ref": "0138a9fa19f86f07", "name": "/usr/share/vim/vim91/ftplugin/cfg.vim", "type": "file" }, { - "bom-ref": "8054b854802248f5", + "bom-ref": "76a66813efe5c45d", "name": "/usr/share/vim/vim91/ftplugin/ch.vim", "type": "file" }, { - "bom-ref": "57299c5d0a51bf55", + "bom-ref": "a7dabae26e950089", "name": "/usr/share/vim/vim91/ftplugin/changelog.vim", "type": "file" }, { - "bom-ref": "50b287214da9059b", + "bom-ref": "aa8cc779502b2fc3", "name": "/usr/share/vim/vim91/ftplugin/chatito.vim", "type": "file" }, { - "bom-ref": "7e0d6c1ad2870341", + "bom-ref": "858f7e09e55161d1", "name": "/usr/share/vim/vim91/ftplugin/chicken.vim", "type": "file" }, { - "bom-ref": "a10316b8a0c33856", + "bom-ref": "59807838862fe616", "name": "/usr/share/vim/vim91/ftplugin/clojure.vim", "type": "file" }, { - "bom-ref": "4b069cb44fcc2b49", + "bom-ref": "4ba2d1e0f2320849", "name": "/usr/share/vim/vim91/ftplugin/cmake.vim", "type": "file" }, { - "bom-ref": "9424ffb3fe6719b4", + "bom-ref": "0018f04507d91768", "name": "/usr/share/vim/vim91/ftplugin/cobol.vim", "type": "file" }, { - "bom-ref": "f19f53cedeb98665", + "bom-ref": "72961c13987350d5", "name": "/usr/share/vim/vim91/ftplugin/conf.vim", "type": "file" }, { - "bom-ref": "d6d9aa42e517a0d2", + "bom-ref": "84c534b0133dc87e", "name": "/usr/share/vim/vim91/ftplugin/config.vim", "type": "file" }, { - "bom-ref": "b6ed33960d69ec5a", + "bom-ref": "95d56232cf318892", "name": "/usr/share/vim/vim91/ftplugin/confini.vim", "type": "file" }, { - "bom-ref": "5e440fa1cd65b1b2", + "bom-ref": "4a3a9c72c6320096", "name": "/usr/share/vim/vim91/ftplugin/context.vim", "type": "file" }, { - "bom-ref": "5f24d326dcca1799", + "bom-ref": "cf2e8bb50c993085", "name": "/usr/share/vim/vim91/ftplugin/corn.vim", "type": "file" }, { - "bom-ref": "9183e9ae061ef0af", + "bom-ref": "ad35fb19f2fa76bb", "name": "/usr/share/vim/vim91/ftplugin/cpp.vim", "type": "file" }, { - "bom-ref": "9e8ee2548236f743", + "bom-ref": "b29c993ac5766af7", "name": "/usr/share/vim/vim91/ftplugin/crm.vim", "type": "file" }, { - "bom-ref": "2cdba93e70befbfe", + "bom-ref": "896d014dd037957a", "name": "/usr/share/vim/vim91/ftplugin/crontab.vim", "type": "file" }, { - "bom-ref": "b50d9337dde1d58f", + "bom-ref": "fef3a940e0b95b7f", "name": "/usr/share/vim/vim91/ftplugin/cs.vim", "type": "file" }, { - "bom-ref": "02a19b1c028ba849", + "bom-ref": "fda8ff0206ea3841", "name": "/usr/share/vim/vim91/ftplugin/csc.vim", "type": "file" }, { - "bom-ref": "602c8b065d8243a7", + "bom-ref": "d3c44ad39efd9653", "name": "/usr/share/vim/vim91/ftplugin/csh.vim", "type": "file" }, { - "bom-ref": "b6f4dd3b801ceb96", + "bom-ref": "e5d98bc12440c0ae", "name": "/usr/share/vim/vim91/ftplugin/css.vim", "type": "file" }, { - "bom-ref": "2811988cf966da88", + "bom-ref": "3d461aa145ac0464", "name": "/usr/share/vim/vim91/ftplugin/cucumber.vim", "type": "file" }, { - "bom-ref": "2b9fa3cc5c167dfc", + "bom-ref": "307b37d64284ebf0", "name": "/usr/share/vim/vim91/ftplugin/cvsrc.vim", "type": "file" }, { - "bom-ref": "c2bf14dde96d2155", + "bom-ref": "f4ba278be4d75261", "name": "/usr/share/vim/vim91/ftplugin/debchangelog.vim", "type": "file" }, { - "bom-ref": "0bc90d570ac27463", + "bom-ref": "4c22cc460ab59dcb", "name": "/usr/share/vim/vim91/ftplugin/debcontrol.vim", "type": "file" }, { - "bom-ref": "b88a67a432cd100c", + "bom-ref": "9bc6e961ad53d5fc", "name": "/usr/share/vim/vim91/ftplugin/debsources.vim", "type": "file" }, { - "bom-ref": "940eafd78e0b3b9f", + "bom-ref": "6d64d7c4e3c37fd3", "name": "/usr/share/vim/vim91/ftplugin/denyhosts.vim", "type": "file" }, { - "bom-ref": "693bbb3cb075d8ff", + "bom-ref": "60b70044af5bfb73", "name": "/usr/share/vim/vim91/ftplugin/desktop.vim", "type": "file" }, { - "bom-ref": "7d7463e589052ede", + "bom-ref": "7300e6ac3180eaea", "name": "/usr/share/vim/vim91/ftplugin/dictconf.vim", "type": "file" }, { - "bom-ref": "4d8f341a07a4138e", + "bom-ref": "c3394474e2c102fe", "name": "/usr/share/vim/vim91/ftplugin/dictdconf.vim", "type": "file" }, { - "bom-ref": "3b2b8ef08c59aa13", + "bom-ref": "b6d9428ba1e61f0f", "name": "/usr/share/vim/vim91/ftplugin/diff.vim", "type": "file" }, { - "bom-ref": "ae2bd1f3b926c0c5", + "bom-ref": "2743a581d55ccf4d", "name": "/usr/share/vim/vim91/ftplugin/dircolors.vim", "type": "file" }, { - "bom-ref": "f8e207a6cd1670fe", + "bom-ref": "b969afa0b354860a", "name": "/usr/share/vim/vim91/ftplugin/docbk.vim", "type": "file" }, { - "bom-ref": "e737a9f0526f482a", + "bom-ref": "d256da471d5c9ad6", "name": "/usr/share/vim/vim91/ftplugin/dockerfile.vim", "type": "file" }, { - "bom-ref": "36d421ca19564077", + "bom-ref": "85213f42b9b0e537", "name": "/usr/share/vim/vim91/ftplugin/dosbatch.vim", "type": "file" }, { - "bom-ref": "2d3df9d2a9fa056c", + "bom-ref": "b521c8bee879a378", "name": "/usr/share/vim/vim91/ftplugin/dosini.vim", "type": "file" }, { - "bom-ref": "b44186705087d139", + "bom-ref": "11f34cb12be81aed", "name": "/usr/share/vim/vim91/ftplugin/dtd.vim", "type": "file" }, { - "bom-ref": "67d275decbb4b195", + "bom-ref": "6c8cd17317036069", "name": "/usr/share/vim/vim91/ftplugin/dtrace.vim", "type": "file" }, { - "bom-ref": "ff2b15aceb305ff0", + "bom-ref": "e08017e72b792158", "name": "/usr/share/vim/vim91/ftplugin/dune.vim", "type": "file" }, { - "bom-ref": "24531b748b19a16f", + "bom-ref": "a80907282059792b", "name": "/usr/share/vim/vim91/ftplugin/eiffel.vim", "type": "file" }, { - "bom-ref": "d9b4031894a31f79", + "bom-ref": "01b240744116829d", "name": "/usr/share/vim/vim91/ftplugin/elinks.vim", "type": "file" }, { - "bom-ref": "51a16349cea491ce", + "bom-ref": "21f137c267ee6586", "name": "/usr/share/vim/vim91/ftplugin/elixir.vim", "type": "file" }, { - "bom-ref": "aba37863ab9cad1d", + "bom-ref": "3bbffdadb07d99ad", "name": "/usr/share/vim/vim91/ftplugin/elm.vim", "type": "file" }, { - "bom-ref": "d70ae07f37d91a97", + "bom-ref": "710db2ef37356f93", "name": "/usr/share/vim/vim91/ftplugin/erlang.vim", "type": "file" }, { - "bom-ref": "cef034d3afc73ca7", + "bom-ref": "c1c2389fe07e5e63", "name": "/usr/share/vim/vim91/ftplugin/eruby.vim", "type": "file" }, { - "bom-ref": "ecd8bd63bdb9f269", + "bom-ref": "91b2fcfc8c1d85dd", "name": "/usr/share/vim/vim91/ftplugin/eterm.vim", "type": "file" }, { - "bom-ref": "bdc774dd38486e98", + "bom-ref": "855fc381ac2aa8b4", "name": "/usr/share/vim/vim91/ftplugin/expect.vim", "type": "file" }, { - "bom-ref": "4276f9f3b2189c4f", + "bom-ref": "07fba389541cdaa3", "name": "/usr/share/vim/vim91/ftplugin/falcon.vim", "type": "file" }, { - "bom-ref": "4bb5bc82b7933a87", + "bom-ref": "aa2917171e06cf83", "name": "/usr/share/vim/vim91/ftplugin/fennel.vim", "type": "file" }, { - "bom-ref": "d6974b55ffa14382", + "bom-ref": "0b204c214b0e3dfa", "name": "/usr/share/vim/vim91/ftplugin/fetchmail.vim", "type": "file" }, { - "bom-ref": "be64f8ccbd00cd28", + "bom-ref": "e8a9995308160b7c", "name": "/usr/share/vim/vim91/ftplugin/fish.vim", "type": "file" }, { - "bom-ref": "221f4ea7486608db", + "bom-ref": "4d44939ead96610f", "name": "/usr/share/vim/vim91/ftplugin/flexwiki.vim", "type": "file" }, { - "bom-ref": "42e1c7d1c6551764", + "bom-ref": "e30548882efb0cac", "name": "/usr/share/vim/vim91/ftplugin/forth.vim", "type": "file" }, { - "bom-ref": "1ae7e2211b86df86", + "bom-ref": "4f98a559f6b19d42", "name": "/usr/share/vim/vim91/ftplugin/fortran.vim", "type": "file" }, { - "bom-ref": "47df561e35d34bd1", + "bom-ref": "0a49e39aa8b1a5c1", "name": "/usr/share/vim/vim91/ftplugin/fpcmake.vim", "type": "file" }, { - "bom-ref": "b7d2819a1746052e", + "bom-ref": "8e27b99887b4b8c2", "name": "/usr/share/vim/vim91/ftplugin/framescript.vim", "type": "file" }, { - "bom-ref": "6dedb14dddf4fa58", + "bom-ref": "6836044fe3f38360", "name": "/usr/share/vim/vim91/ftplugin/freebasic.vim", "type": "file" }, { - "bom-ref": "891cab44d3d2d19f", + "bom-ref": "b25d49c06c1f0c17", "name": "/usr/share/vim/vim91/ftplugin/fstab.vim", "type": "file" }, { - "bom-ref": "0ffd471abeb415dc", + "bom-ref": "95efefd6880dd798", "name": "/usr/share/vim/vim91/ftplugin/fvwm.vim", "type": "file" }, { - "bom-ref": "87dfa71cf44101e0", + "bom-ref": "b9bb306ba1c4f2f0", "name": "/usr/share/vim/vim91/ftplugin/gdb.vim", "type": "file" }, { - "bom-ref": "f39cd7a30a19539c", + "bom-ref": "f55aa94337f2b3c4", "name": "/usr/share/vim/vim91/ftplugin/gdscript.vim", "type": "file" }, { - "bom-ref": "bb9aea85e7186df2", + "bom-ref": "0c3161702f454bae", "name": "/usr/share/vim/vim91/ftplugin/gdshader.vim", "type": "file" }, { - "bom-ref": "c1cbeca3e678d051", + "bom-ref": "8d3d1bfe99da49d9", "name": "/usr/share/vim/vim91/ftplugin/git.vim", "type": "file" }, { - "bom-ref": "02ce0479b64bbe1b", + "bom-ref": "0f1bcc8ceb7b07d7", "name": "/usr/share/vim/vim91/ftplugin/gitattributes.vim", "type": "file" }, { - "bom-ref": "1489380e478a8f14", + "bom-ref": "7d7ef5d057a8e4b0", "name": "/usr/share/vim/vim91/ftplugin/gitcommit.vim", "type": "file" }, { - "bom-ref": "299e2f68e5026af7", + "bom-ref": "e92ca4717cbdbf8b", "name": "/usr/share/vim/vim91/ftplugin/gitconfig.vim", "type": "file" }, { - "bom-ref": "9b125fc501d733fd", + "bom-ref": "56af0554f553de91", "name": "/usr/share/vim/vim91/ftplugin/gitignore.vim", "type": "file" }, { - "bom-ref": "712f32a189787758", + "bom-ref": "e555d3ca2cf1c1a0", "name": "/usr/share/vim/vim91/ftplugin/gitrebase.vim", "type": "file" }, { - "bom-ref": "48d48c892b7f1d2c", + "bom-ref": "6361e87998b74638", "name": "/usr/share/vim/vim91/ftplugin/gitsendemail.vim", "type": "file" }, { - "bom-ref": "d376696ccc50f8fc", + "bom-ref": "93f2f0903ef24750", "name": "/usr/share/vim/vim91/ftplugin/go.vim", "type": "file" }, { - "bom-ref": "c768ff02558d2856", + "bom-ref": "7bfa56ebe6c7da46", "name": "/usr/share/vim/vim91/ftplugin/gpg.vim", "type": "file" }, { - "bom-ref": "d686a4e57aa1068e", + "bom-ref": "69347e838c0fcea6", "name": "/usr/share/vim/vim91/ftplugin/gprof.vim", "type": "file" }, { - "bom-ref": "051db4af6ada7ac7", + "bom-ref": "e87081834367b2e7", "name": "/usr/share/vim/vim91/ftplugin/groovy.vim", "type": "file" }, { - "bom-ref": "9786a8e844ad1a89", + "bom-ref": "24615b76e019a46d", "name": "/usr/share/vim/vim91/ftplugin/group.vim", "type": "file" }, { - "bom-ref": "ae3fa44f534c534a", + "bom-ref": "290a328fab38e69a", "name": "/usr/share/vim/vim91/ftplugin/grub.vim", "type": "file" }, { - "bom-ref": "41965fdfadb24b28", + "bom-ref": "5dd1ed90bad190ec", "name": "/usr/share/vim/vim91/ftplugin/gyp.vim", "type": "file" }, { - "bom-ref": "7b5b19da0cb23014", + "bom-ref": "7e171db68554ffcc", "name": "/usr/share/vim/vim91/ftplugin/haml.vim", "type": "file" }, { - "bom-ref": "3cc77a73f512f931", + "bom-ref": "2f27d01130b75d59", "name": "/usr/share/vim/vim91/ftplugin/hamster.vim", "type": "file" }, { - "bom-ref": "69a1724ce43a5854", + "bom-ref": "d0be8e4a29d7a118", "name": "/usr/share/vim/vim91/ftplugin/hare.vim", "type": "file" }, { - "bom-ref": "97b516c2eb598534", + "bom-ref": "4ca9bd7bd29a2c74", "name": "/usr/share/vim/vim91/ftplugin/haskell.vim", "type": "file" }, { - "bom-ref": "2474ae0f9267bd5d", + "bom-ref": "7c8aa31b80591f4d", "name": "/usr/share/vim/vim91/ftplugin/heex.vim", "type": "file" }, { - "bom-ref": "dd757ee46b808a1d", + "bom-ref": "2e363113d1f8ae8d", "name": "/usr/share/vim/vim91/ftplugin/help.vim", "type": "file" }, { - "bom-ref": "e6e617b0a94ebf18", + "bom-ref": "e6922a313c60c674", "name": "/usr/share/vim/vim91/ftplugin/hgcommit.vim", "type": "file" }, { - "bom-ref": "0917ec4a31027f20", + "bom-ref": "2c396159480c5adc", "name": "/usr/share/vim/vim91/ftplugin/hog.vim", "type": "file" }, { - "bom-ref": "b990b8c0e1a05b9d", + "bom-ref": "c3b5ed5cb3117155", "name": "/usr/share/vim/vim91/ftplugin/hostconf.vim", "type": "file" }, { - "bom-ref": "9c23cba3f3b08b28", + "bom-ref": "f085b2407a23ba6c", "name": "/usr/share/vim/vim91/ftplugin/hostsaccess.vim", "type": "file" }, { - "bom-ref": "583f55da70b0dc16", + "bom-ref": "b4c3b02387d9ac16", "name": "/usr/share/vim/vim91/ftplugin/html.vim", "type": "file" }, { - "bom-ref": "26a134dc6921264d", + "bom-ref": "80452799a0b07e71", "name": "/usr/share/vim/vim91/ftplugin/htmldjango.vim", "type": "file" }, { - "bom-ref": "5bd1c358e034c3a3", + "bom-ref": "e412597938814963", "name": "/usr/share/vim/vim91/ftplugin/i3config.vim", "type": "file" }, { - "bom-ref": "23bba94e1b00f066", + "bom-ref": "ae597cc263c49402", "name": "/usr/share/vim/vim91/ftplugin/icon.vim", "type": "file" }, { - "bom-ref": "700222bb146d0708", + "bom-ref": "045b746666b5dd1c", "name": "/usr/share/vim/vim91/ftplugin/indent.vim", "type": "file" }, { - "bom-ref": "f3ae7f0c3e7a5233", + "bom-ref": "4a1a197eeaf6c17b", "name": "/usr/share/vim/vim91/ftplugin/initex.vim", "type": "file" }, { - "bom-ref": "944e57615452a536", + "bom-ref": "5b2ac05b1875581a", "name": "/usr/share/vim/vim91/ftplugin/ishd.vim", "type": "file" }, { - "bom-ref": "91f580c3a6be98ff", + "bom-ref": "53e7b47146bb71f3", "name": "/usr/share/vim/vim91/ftplugin/j.vim", "type": "file" }, { - "bom-ref": "da8286748c8c5a05", + "bom-ref": "acfebf2b11e04975", "name": "/usr/share/vim/vim91/ftplugin/java.vim", "type": "file" }, { - "bom-ref": "6107a6e8953b2b3b", + "bom-ref": "5971176192410a3f", "name": "/usr/share/vim/vim91/ftplugin/javascript.vim", "type": "file" }, { - "bom-ref": "5f705bb934b9c37a", + "bom-ref": "070f7c3bca8483b2", "name": "/usr/share/vim/vim91/ftplugin/javascriptreact.vim", "type": "file" }, { - "bom-ref": "ed9c9b5966798811", + "bom-ref": "30164966563320f5", "name": "/usr/share/vim/vim91/ftplugin/jproperties.vim", "type": "file" }, { - "bom-ref": "ef3da5564b648091", + "bom-ref": "514cc3ca484c0f31", "name": "/usr/share/vim/vim91/ftplugin/json.vim", "type": "file" }, { - "bom-ref": "c4b865abb4399854", + "bom-ref": "47ffb9f8b2657a6c", "name": "/usr/share/vim/vim91/ftplugin/json5.vim", "type": "file" }, { - "bom-ref": "e7d2f13950480965", + "bom-ref": "ff35c8b3ea66ba01", "name": "/usr/share/vim/vim91/ftplugin/jsonc.vim", "type": "file" }, { - "bom-ref": "d944483fb4b2816f", + "bom-ref": "7d10f1b8c6ec86c7", "name": "/usr/share/vim/vim91/ftplugin/jsonnet.vim", "type": "file" }, { - "bom-ref": "fe9910abbae5eee5", + "bom-ref": "db1324a96ebfcfa5", "name": "/usr/share/vim/vim91/ftplugin/jsp.vim", "type": "file" }, { - "bom-ref": "43b8c83dbc092bc9", + "bom-ref": "0a022ee4bcffefb5", "name": "/usr/share/vim/vim91/ftplugin/julia.vim", "type": "file" }, { - "bom-ref": "0b4f6e81a971989f", + "bom-ref": "be35d448f7df6b6f", "name": "/usr/share/vim/vim91/ftplugin/kconfig.vim", "type": "file" }, { - "bom-ref": "13e578225ba32350", + "bom-ref": "265f668a554da530", "name": "/usr/share/vim/vim91/ftplugin/kotlin.vim", "type": "file" }, { - "bom-ref": "cb2123cafa5cf611", + "bom-ref": "69b94a13bb369f8d", "name": "/usr/share/vim/vim91/ftplugin/kwt.vim", "type": "file" }, { - "bom-ref": "e130ce7dd06ed879", + "bom-ref": "60a52ec14bcdfde5", "name": "/usr/share/vim/vim91/ftplugin/ld.vim", "type": "file" }, { - "bom-ref": "f004d98cf5fd45a2", + "bom-ref": "04c3ba85a5ccf616", "name": "/usr/share/vim/vim91/ftplugin/less.vim", "type": "file" }, { - "bom-ref": "f724540819b6dd98", + "bom-ref": "4b834ce8fc295fcc", "name": "/usr/share/vim/vim91/ftplugin/lftp.vim", "type": "file" }, { - "bom-ref": "fcd4c0e75cda3d15", + "bom-ref": "f57ba0af2bdf48dd", "name": "/usr/share/vim/vim91/ftplugin/libao.vim", "type": "file" }, { - "bom-ref": "97b572c291b1aeb1", + "bom-ref": "01bef5f43f9a8dad", "name": "/usr/share/vim/vim91/ftplugin/limits.vim", "type": "file" }, { - "bom-ref": "71bd0d91efa3faa8", + "bom-ref": "048bc9fc5644e844", "name": "/usr/share/vim/vim91/ftplugin/liquid.vim", "type": "file" }, { - "bom-ref": "7105c9fe722d6373", + "bom-ref": "8c47812089ed6773", "name": "/usr/share/vim/vim91/ftplugin/lisp.vim", "type": "file" }, { - "bom-ref": "2ed08c9aa6eac03e", + "bom-ref": "35c556acc9e4530e", "name": "/usr/share/vim/vim91/ftplugin/livebook.vim", "type": "file" }, { - "bom-ref": "1453e5f666395b2a", + "bom-ref": "cfa071280d6f448e", "name": "/usr/share/vim/vim91/ftplugin/logcheck.vim", "type": "file" }, { - "bom-ref": "a13f815bcde3de84", + "bom-ref": "4291071621cf95bc", "name": "/usr/share/vim/vim91/ftplugin/loginaccess.vim", "type": "file" }, { - "bom-ref": "85dc5c52f3216141", + "bom-ref": "f10006ed99d1e5d1", "name": "/usr/share/vim/vim91/ftplugin/logindefs.vim", "type": "file" }, { - "bom-ref": "28da312aad4f320d", + "bom-ref": "7a06edcbebbd7381", "name": "/usr/share/vim/vim91/ftplugin/logtalk.dict", "type": "file" }, { - "bom-ref": "2a4113c7b58780e5", + "bom-ref": "b104e036a85209a9", "name": "/usr/share/vim/vim91/ftplugin/logtalk.vim", "type": "file" }, { - "bom-ref": "74de074ab713fabc", + "bom-ref": "d5a20a98644c5bd8", "name": "/usr/share/vim/vim91/ftplugin/lprolog.vim", "type": "file" }, { - "bom-ref": "72ca079eb0d5ea1a", + "bom-ref": "3cd804d552b4432a", "name": "/usr/share/vim/vim91/ftplugin/lua.vim", "type": "file" }, { - "bom-ref": "e48874831d29fb63", + "bom-ref": "c06c2884add16587", "name": "/usr/share/vim/vim91/ftplugin/luau.vim", "type": "file" }, { - "bom-ref": "6828155acba7acad", + "bom-ref": "7b3228acd6c86125", "name": "/usr/share/vim/vim91/ftplugin/lynx.vim", "type": "file" }, { - "bom-ref": "598871032f76fd34", + "bom-ref": "8eebc50741674bd8", "name": "/usr/share/vim/vim91/ftplugin/m3build.vim", "type": "file" }, { - "bom-ref": "941c242e36ecfd36", + "bom-ref": "8d34c1446f170f36", "name": "/usr/share/vim/vim91/ftplugin/m3quake.vim", "type": "file" }, { - "bom-ref": "3d211c55cea7a2c7", + "bom-ref": "6d7255d019155d67", "name": "/usr/share/vim/vim91/ftplugin/m4.vim", "type": "file" }, { - "bom-ref": "9a164ecf45468ae0", + "bom-ref": "f4aae5c74fa717c0", "name": "/usr/share/vim/vim91/ftplugin/mail.vim", "type": "file" }, { - "bom-ref": "6c6ff0909b45675c", + "bom-ref": "35c0c9c6466d9c60", "name": "/usr/share/vim/vim91/ftplugin/mailaliases.vim", "type": "file" }, { - "bom-ref": "47dfffbcf8255c66", + "bom-ref": "7534aa9122f3f1fa", "name": "/usr/share/vim/vim91/ftplugin/mailcap.vim", "type": "file" }, { - "bom-ref": "3b2a07b4561411c8", + "bom-ref": "2972a9af520fc994", "name": "/usr/share/vim/vim91/ftplugin/make.vim", "type": "file" }, { - "bom-ref": "cc5b114b824bfd0f", + "bom-ref": "7fa7fa63347fecb3", "name": "/usr/share/vim/vim91/ftplugin/man.vim", "type": "file" }, { - "bom-ref": "a09c206afb9b6480", + "bom-ref": "9dbc0b1489e9bca8", "name": "/usr/share/vim/vim91/ftplugin/manconf.vim", "type": "file" }, { - "bom-ref": "6698e5f9a588a76a", + "bom-ref": "50588fed12055ac2", "name": "/usr/share/vim/vim91/ftplugin/markdown.vim", "type": "file" }, { - "bom-ref": "bb605f2eb30e8acc", + "bom-ref": "27c089c1b470297c", "name": "/usr/share/vim/vim91/ftplugin/masm.vim", "type": "file" }, { - "bom-ref": "a170bd609facd3ca", + "bom-ref": "3353eead56757bc2", "name": "/usr/share/vim/vim91/ftplugin/matlab.vim", "type": "file" }, { - "bom-ref": "8a1bc3e1f077ea12", + "bom-ref": "9f3ec9f2b77d504a", "name": "/usr/share/vim/vim91/ftplugin/mermaid.vim", "type": "file" }, { - "bom-ref": "bc7c932176b860d6", + "bom-ref": "8ec1b7acaefb673a", "name": "/usr/share/vim/vim91/ftplugin/meson.vim", "type": "file" }, { - "bom-ref": "9efad2565b9eb43f", + "bom-ref": "7a2132e191cdaa83", "name": "/usr/share/vim/vim91/ftplugin/mf.vim", "type": "file" }, { - "bom-ref": "294cd0eb64b42b1f", + "bom-ref": "ddb58afbf6a87e57", "name": "/usr/share/vim/vim91/ftplugin/mma.vim", "type": "file" }, { - "bom-ref": "e1d4e345bde69af4", + "bom-ref": "07e0a0ca1b0e206c", "name": "/usr/share/vim/vim91/ftplugin/modconf.vim", "type": "file" }, { - "bom-ref": "4008d904ee13fb9e", + "bom-ref": "e2286a87c3b71ca6", "name": "/usr/share/vim/vim91/ftplugin/modula2.vim", "type": "file" }, { - "bom-ref": "5cd9c342dd300284", + "bom-ref": "0644150e95cd0738", "name": "/usr/share/vim/vim91/ftplugin/modula3.vim", "type": "file" }, { - "bom-ref": "63f77a12fb8160c8", + "bom-ref": "120de2fd9a4f1df4", "name": "/usr/share/vim/vim91/ftplugin/mp.vim", "type": "file" }, { - "bom-ref": "7d19777113644d18", + "bom-ref": "367b5ea11231b774", "name": "/usr/share/vim/vim91/ftplugin/mplayerconf.vim", "type": "file" }, { - "bom-ref": "0b38cdae416d3262", + "bom-ref": "81051ba405eb4596", "name": "/usr/share/vim/vim91/ftplugin/mrxvtrc.vim", "type": "file" }, { - "bom-ref": "6a584db15df53a89", + "bom-ref": "5ead6e76007530b5", "name": "/usr/share/vim/vim91/ftplugin/msmessages.vim", "type": "file" }, { - "bom-ref": "fb3c795c9022a709", + "bom-ref": "4edd99fa234d0975", "name": "/usr/share/vim/vim91/ftplugin/muttrc.vim", "type": "file" }, { - "bom-ref": "8f2a61012e072c75", + "bom-ref": "49bf4678b03ee0f5", "name": "/usr/share/vim/vim91/ftplugin/nanorc.vim", "type": "file" }, { - "bom-ref": "54010b278a802c5a", + "bom-ref": "c74a8ee064746f2e", "name": "/usr/share/vim/vim91/ftplugin/neomuttrc.vim", "type": "file" }, { - "bom-ref": "99d04692cd885093", + "bom-ref": "91cd5747f87b32fb", "name": "/usr/share/vim/vim91/ftplugin/netrc.vim", "type": "file" }, { - "bom-ref": "e7eef500d9a4faee", + "bom-ref": "1c687376ba039f62", "name": "/usr/share/vim/vim91/ftplugin/nginx.vim", "type": "file" }, { - "bom-ref": "490f17d9a928c425", + "bom-ref": "04d498abbb7e1c15", "name": "/usr/share/vim/vim91/ftplugin/nix.vim", "type": "file" }, { - "bom-ref": "d33a551bcbdbf7aa", + "bom-ref": "0c4f69e0aa8aea3a", "name": "/usr/share/vim/vim91/ftplugin/nroff.vim", "type": "file" }, { - "bom-ref": "6064277c19abfaf7", + "bom-ref": "176b4e9bca0f92d3", "name": "/usr/share/vim/vim91/ftplugin/nsis.vim", "type": "file" }, { - "bom-ref": "3ea210aeb42d30c0", + "bom-ref": "11b05e6c55d01568", "name": "/usr/share/vim/vim91/ftplugin/objc.vim", "type": "file" }, { - "bom-ref": "f8a9c946be0e57e4", + "bom-ref": "a158a3952ff7d968", "name": "/usr/share/vim/vim91/ftplugin/objdump.vim", "type": "file" }, { - "bom-ref": "f024d4af7b61ad62", + "bom-ref": "3ca204dffbeda556", "name": "/usr/share/vim/vim91/ftplugin/obse.vim", "type": "file" }, { - "bom-ref": "efa5ff7e909a521b", + "bom-ref": "43f3a9b9373e8957", "name": "/usr/share/vim/vim91/ftplugin/ocaml.vim", "type": "file" }, { - "bom-ref": "eddaf97edfa98611", + "bom-ref": "a83456b8045c34ed", "name": "/usr/share/vim/vim91/ftplugin/occam.vim", "type": "file" }, { - "bom-ref": "0d8dcf828fdf5557", + "bom-ref": "d0a4b2515dacfbcf", "name": "/usr/share/vim/vim91/ftplugin/octave.vim", "type": "file" }, { - "bom-ref": "2a3a72ac70a98027", + "bom-ref": "3244982c5fc866bb", "name": "/usr/share/vim/vim91/ftplugin/openvpn.vim", "type": "file" }, { - "bom-ref": "973cb569a0a4a6c1", + "bom-ref": "e7d92f767c5030c5", "name": "/usr/share/vim/vim91/ftplugin/pamconf.vim", "type": "file" }, { - "bom-ref": "ab61b0c85d2163a6", + "bom-ref": "221fd3001fe9f21e", "name": "/usr/share/vim/vim91/ftplugin/pascal.vim", "type": "file" }, { - "bom-ref": "45e881a782bca332", + "bom-ref": "16b2a28f69047786", "name": "/usr/share/vim/vim91/ftplugin/passwd.vim", "type": "file" }, { - "bom-ref": "81606d4c11ae6f95", + "bom-ref": "62f9035cc3972c51", "name": "/usr/share/vim/vim91/ftplugin/pbtxt.vim", "type": "file" }, { - "bom-ref": "3858f9fb2f82eca1", + "bom-ref": "5d4ba697404c436d", "name": "/usr/share/vim/vim91/ftplugin/pdf.vim", "type": "file" }, { - "bom-ref": "306ee7afae263ba8", + "bom-ref": "7c31da2c39937c74", "name": "/usr/share/vim/vim91/ftplugin/perl.vim", "type": "file" }, { - "bom-ref": "0bdbd4867a3df374", + "bom-ref": "912206cbad4777f8", "name": "/usr/share/vim/vim91/ftplugin/php.vim", "type": "file" }, { - "bom-ref": "d934fe24663c9892", + "bom-ref": "2bc862ffab7dbdfa", "name": "/usr/share/vim/vim91/ftplugin/pinfo.vim", "type": "file" }, { - "bom-ref": "dbf38ac492e28f43", + "bom-ref": "8cec5deb5af2ea07", "name": "/usr/share/vim/vim91/ftplugin/plaintex.vim", "type": "file" }, { - "bom-ref": "e57dae2b92949df1", + "bom-ref": "3d6160bf804fa625", "name": "/usr/share/vim/vim91/ftplugin/pod.vim", "type": "file" }, { - "bom-ref": "0557259f2901b14c", + "bom-ref": "60ca16a25ccbe744", "name": "/usr/share/vim/vim91/ftplugin/poefilter.vim", "type": "file" }, { - "bom-ref": "f6f6113b3d7e6c57", + "bom-ref": "7b1fc39e78378a1b", "name": "/usr/share/vim/vim91/ftplugin/poke.vim", "type": "file" }, { - "bom-ref": "fcda7085a0390089", + "bom-ref": "a90e454d92aaa989", "name": "/usr/share/vim/vim91/ftplugin/postscr.vim", "type": "file" }, { - "bom-ref": "898be968ac9c94ff", + "bom-ref": "27deb45e8bfc907b", "name": "/usr/share/vim/vim91/ftplugin/procmail.vim", "type": "file" }, { - "bom-ref": "0eaa0d9d06fea685", + "bom-ref": "912c9ad670222f45", "name": "/usr/share/vim/vim91/ftplugin/prolog.vim", "type": "file" }, { - "bom-ref": "e4ec2237c2057299", + "bom-ref": "ada0bf95e216e11d", "name": "/usr/share/vim/vim91/ftplugin/protocols.vim", "type": "file" }, { - "bom-ref": "1f1701fee678ffb9", + "bom-ref": "a64a5d5d52a7427d", "name": "/usr/share/vim/vim91/ftplugin/ps1.vim", "type": "file" }, { - "bom-ref": "52890d3632d56f19", + "bom-ref": "164072d0df9a0f3d", "name": "/usr/share/vim/vim91/ftplugin/ps1xml.vim", "type": "file" }, { - "bom-ref": "34c537df4583f7ce", + "bom-ref": "65e023fb72d804b6", "name": "/usr/share/vim/vim91/ftplugin/pymanifest.vim", "type": "file" }, { - "bom-ref": "5d8a37a6f59d49e3", + "bom-ref": "35a2d681e05bee17", "name": "/usr/share/vim/vim91/ftplugin/pyrex.vim", "type": "file" }, { - "bom-ref": "5563a7f50191108e", + "bom-ref": "65a1ba8cbbffe9ea", "name": "/usr/share/vim/vim91/ftplugin/python.vim", "type": "file" }, { - "bom-ref": "d28dc3793cbff0a1", + "bom-ref": "dac663c2c0fcfc31", "name": "/usr/share/vim/vim91/ftplugin/qb64.vim", "type": "file" }, { - "bom-ref": "802e5fab026963b6", + "bom-ref": "ad22e068dc2288a6", "name": "/usr/share/vim/vim91/ftplugin/qf.vim", "type": "file" }, { - "bom-ref": "1e12f04aee0bd0e2", + "bom-ref": "9b824539e42661ae", "name": "/usr/share/vim/vim91/ftplugin/qml.vim", "type": "file" }, { - "bom-ref": "74fbdafba15e40e2", + "bom-ref": "ad87bb5dea616672", "name": "/usr/share/vim/vim91/ftplugin/quake.vim", "type": "file" }, { - "bom-ref": "d49a916ce5bc6156", + "bom-ref": "766d51a9bc4a45a6", "name": "/usr/share/vim/vim91/ftplugin/quarto.vim", "type": "file" }, { - "bom-ref": "e3b6a6dbe00cad0f", + "bom-ref": "5d3110940b19b2fb", "name": "/usr/share/vim/vim91/ftplugin/r.vim", "type": "file" }, { - "bom-ref": "b541204675a6c2c1", + "bom-ref": "a884e66a1efd8bd5", "name": "/usr/share/vim/vim91/ftplugin/racc.vim", "type": "file" }, { - "bom-ref": "530f6a8cc809aff4", + "bom-ref": "d36fc7b61d4dba2c", "name": "/usr/share/vim/vim91/ftplugin/racket.vim", "type": "file" }, { - "bom-ref": "df2d214e858be890", + "bom-ref": "5154fe2d4c8af80c", "name": "/usr/share/vim/vim91/ftplugin/raku.vim", "type": "file" }, { - "bom-ref": "f199f733d9c03550", + "bom-ref": "6ebb496528b50f78", "name": "/usr/share/vim/vim91/ftplugin/readline.vim", "type": "file" }, { - "bom-ref": "29e70a168bd7da96", + "bom-ref": "6e760169ff2af29e", "name": "/usr/share/vim/vim91/ftplugin/registry.vim", "type": "file" }, { - "bom-ref": "eecca897e928daa7", + "bom-ref": "71365ac4c6c5ea57", "name": "/usr/share/vim/vim91/ftplugin/reva.vim", "type": "file" }, { - "bom-ref": "a7fcb7618db37233", + "bom-ref": "ac89ada0ba4d75af", "name": "/usr/share/vim/vim91/ftplugin/rhelp.vim", "type": "file" }, { - "bom-ref": "b8b2736340a16f3d", + "bom-ref": "5467bad4e1a47e71", "name": "/usr/share/vim/vim91/ftplugin/rmd.vim", "type": "file" }, { - "bom-ref": "91e0779a537819f2", + "bom-ref": "9e9a2267df488b86", "name": "/usr/share/vim/vim91/ftplugin/rnc.vim", "type": "file" }, { - "bom-ref": "89ba6f4c02d493ca", + "bom-ref": "afc8b9a390c8bbd6", "name": "/usr/share/vim/vim91/ftplugin/rnoweb.vim", "type": "file" }, { - "bom-ref": "644e71bce7629cfa", + "bom-ref": "de2bae85ff8cb286", "name": "/usr/share/vim/vim91/ftplugin/routeros.vim", "type": "file" }, { - "bom-ref": "00fbdbe5d6382699", + "bom-ref": "2506afed8b5e4891", "name": "/usr/share/vim/vim91/ftplugin/rpl.vim", "type": "file" }, { - "bom-ref": "9eeded0f6353432b", + "bom-ref": "56d03dc223a8b10b", "name": "/usr/share/vim/vim91/ftplugin/rrst.vim", "type": "file" }, { - "bom-ref": "acccde22246c4924", + "bom-ref": "b52cc5949473cbfc", "name": "/usr/share/vim/vim91/ftplugin/rst.vim", "type": "file" }, { - "bom-ref": "784a793dff19704d", + "bom-ref": "970bbaf9b4a568e1", "name": "/usr/share/vim/vim91/ftplugin/ruby.vim", "type": "file" }, { - "bom-ref": "c5d414c8fe442a97", + "bom-ref": "e9990463e95b6ccb", "name": "/usr/share/vim/vim91/ftplugin/rust.vim", "type": "file" }, { - "bom-ref": "12fb9ee407d2251c", + "bom-ref": "3b9f5847a25604d0", "name": "/usr/share/vim/vim91/ftplugin/sass.vim", "type": "file" }, { - "bom-ref": "f8d26d1632b0c472", + "bom-ref": "91cef6507975dcf6", "name": "/usr/share/vim/vim91/ftplugin/sbt.vim", "type": "file" }, { - "bom-ref": "cdc66d19f7b4d22e", + "bom-ref": "71d7538a2b6f1d22", "name": "/usr/share/vim/vim91/ftplugin/scala.vim", "type": "file" }, { - "bom-ref": "9f4ab66051f42eb8", + "bom-ref": "5f7319b739e78598", "name": "/usr/share/vim/vim91/ftplugin/scdoc.vim", "type": "file" }, { - "bom-ref": "1c2b5423c7f0987b", + "bom-ref": "22e6438352388687", "name": "/usr/share/vim/vim91/ftplugin/scheme.vim", "type": "file" }, { - "bom-ref": "59cef98e061e63f3", + "bom-ref": "2da414327b7ea5db", "name": "/usr/share/vim/vim91/ftplugin/screen.vim", "type": "file" }, { - "bom-ref": "7d2f28330cbe3f92", + "bom-ref": "5892322cb9508fda", "name": "/usr/share/vim/vim91/ftplugin/scss.vim", "type": "file" }, { - "bom-ref": "72962d1aa653de98", + "bom-ref": "4dce4cbbba133f5c", "name": "/usr/share/vim/vim91/ftplugin/sed.vim", "type": "file" }, { - "bom-ref": "dce8db200118a3c8", + "bom-ref": "cc3c8f6b29b966e8", "name": "/usr/share/vim/vim91/ftplugin/sensors.vim", "type": "file" }, { - "bom-ref": "a444808e8cf49561", + "bom-ref": "9d69b6ff8ad468b1", "name": "/usr/share/vim/vim91/ftplugin/services.vim", "type": "file" }, { - "bom-ref": "9d29aedcff7afa40", + "bom-ref": "0dd5a44c21a3cad0", "name": "/usr/share/vim/vim91/ftplugin/setserial.vim", "type": "file" }, { - "bom-ref": "f1489be0629aa381", + "bom-ref": "16629b3c90fb6761", "name": "/usr/share/vim/vim91/ftplugin/sexplib.vim", "type": "file" }, { - "bom-ref": "abb247cb3d345658", + "bom-ref": "1080125fdaecc974", "name": "/usr/share/vim/vim91/ftplugin/sgml.vim", "type": "file" }, { - "bom-ref": "83512f8075382000", + "bom-ref": "bc301b5b25503f1c", "name": "/usr/share/vim/vim91/ftplugin/sh.vim", "type": "file" }, { - "bom-ref": "64cb6e7f72cc892d", + "bom-ref": "b9d4bd294d542a59", "name": "/usr/share/vim/vim91/ftplugin/sieve.vim", "type": "file" }, { - "bom-ref": "2a609af5c47f3150", + "bom-ref": "db9cfc8e64e1955c", "name": "/usr/share/vim/vim91/ftplugin/slpconf.vim", "type": "file" }, { - "bom-ref": "e1912c31b21e9983", + "bom-ref": "920b80941538d477", "name": "/usr/share/vim/vim91/ftplugin/slpreg.vim", "type": "file" }, { - "bom-ref": "4ed1b79d82bfa0d2", + "bom-ref": "128f40009a126082", "name": "/usr/share/vim/vim91/ftplugin/slpspi.vim", "type": "file" }, { - "bom-ref": "c973ae839419acc8", + "bom-ref": "33292970e79b9284", "name": "/usr/share/vim/vim91/ftplugin/solidity.vim", "type": "file" }, { - "bom-ref": "a49519f05335bdf6", + "bom-ref": "88a08cf41290aade", "name": "/usr/share/vim/vim91/ftplugin/solution.vim", "type": "file" }, { - "bom-ref": "fad092427623be78", + "bom-ref": "d6a7c73d209c0c48", "name": "/usr/share/vim/vim91/ftplugin/spec.vim", "type": "file" }, { - "bom-ref": "aa314f2645e99276", + "bom-ref": "c9f3565ea3273a1a", "name": "/usr/share/vim/vim91/ftplugin/sql.vim", "type": "file" }, { - "bom-ref": "7d373a6a20aafbf6", + "bom-ref": "75c33b2bb6d693a6", "name": "/usr/share/vim/vim91/ftplugin/ssa.vim", "type": "file" }, { - "bom-ref": "2187f4aae9e2de49", + "bom-ref": "02e068c0058345c9", "name": "/usr/share/vim/vim91/ftplugin/sshconfig.vim", "type": "file" }, { - "bom-ref": "c5b81c7f72dab893", + "bom-ref": "fd120fc781f89b0b", "name": "/usr/share/vim/vim91/ftplugin/sudoers.vim", "type": "file" }, { - "bom-ref": "600a2bfb4c2c6e8f", + "bom-ref": "56fe0df26dc88d6f", "name": "/usr/share/vim/vim91/ftplugin/svg.vim", "type": "file" }, { - "bom-ref": "fcb77c05a501648d", + "bom-ref": "3014d9351e0ff8c1", "name": "/usr/share/vim/vim91/ftplugin/swayconfig.vim", "type": "file" }, { - "bom-ref": "848512b04730c45c", + "bom-ref": "ab0bf756202ec784", "name": "/usr/share/vim/vim91/ftplugin/swift.vim", "type": "file" }, { - "bom-ref": "199d2713b85be964", + "bom-ref": "6ef7a3080e33ffb4", "name": "/usr/share/vim/vim91/ftplugin/swiftgyb.vim", "type": "file" }, { - "bom-ref": "8905d8c283016a5c", + "bom-ref": "183b50545fe690c8", "name": "/usr/share/vim/vim91/ftplugin/swig.vim", "type": "file" }, { - "bom-ref": "77fc0d2d31e75bba", + "bom-ref": "4944ce7741a6baba", "name": "/usr/share/vim/vim91/ftplugin/sysctl.vim", "type": "file" }, { - "bom-ref": "d6bd8bb5828a4e4b", + "bom-ref": "c8f4cdb558bda857", "name": "/usr/share/vim/vim91/ftplugin/systemd.vim", "type": "file" }, { - "bom-ref": "9e734c45b505e745", + "bom-ref": "3ddd6c19c4cac509", "name": "/usr/share/vim/vim91/ftplugin/systemverilog.vim", "type": "file" }, { - "bom-ref": "57134d863782414e", + "bom-ref": "f8e289ca69fcf282", "name": "/usr/share/vim/vim91/ftplugin/tap.vim", "type": "file" }, { - "bom-ref": "bc9d80f32207af39", + "bom-ref": "0a2f3779fc72e701", "name": "/usr/share/vim/vim91/ftplugin/tcl.vim", "type": "file" }, { - "bom-ref": "5b361df41b31ac70", + "bom-ref": "0d33ce63831eb518", "name": "/usr/share/vim/vim91/ftplugin/tcsh.vim", "type": "file" }, { - "bom-ref": "2698de19391acee2", + "bom-ref": "a2771120ef967f3a", "name": "/usr/share/vim/vim91/ftplugin/terminfo.vim", "type": "file" }, { - "bom-ref": "d6a823bb74734d5d", + "bom-ref": "bf4c49c171cdd909", "name": "/usr/share/vim/vim91/ftplugin/tex.vim", "type": "file" }, { - "bom-ref": "95c038f1dc9465c4", + "bom-ref": "4f0019dfa4a9b488", "name": "/usr/share/vim/vim91/ftplugin/text.vim", "type": "file" }, { - "bom-ref": "9525bf6387068dc4", + "bom-ref": "e0b2f6b73d589fd8", "name": "/usr/share/vim/vim91/ftplugin/tidy.vim", "type": "file" }, { - "bom-ref": "a4ed0fc4bcc95b28", + "bom-ref": "ac0947e410dbd660", "name": "/usr/share/vim/vim91/ftplugin/tmux.vim", "type": "file" }, { - "bom-ref": "16a0cb1c183c2fe3", + "bom-ref": "09f3666354fc3223", "name": "/usr/share/vim/vim91/ftplugin/toml.vim", "type": "file" }, { - "bom-ref": "4ef08d5ce8fbc1aa", + "bom-ref": "9491dd0581005f1e", "name": "/usr/share/vim/vim91/ftplugin/treetop.vim", "type": "file" }, { - "bom-ref": "178fd94023915d25", + "bom-ref": "bdddea3dd0d17bfd", "name": "/usr/share/vim/vim91/ftplugin/tt2html.vim", "type": "file" }, { - "bom-ref": "24d1eca97f7b175f", + "bom-ref": "5980b940e96ce5f7", "name": "/usr/share/vim/vim91/ftplugin/typescript.vim", "type": "file" }, { - "bom-ref": "0f7d80a55c7dce37", + "bom-ref": "db6b04b282e98f9b", "name": "/usr/share/vim/vim91/ftplugin/typescriptreact.vim", "type": "file" }, { - "bom-ref": "0fd9a0447cc23b23", + "bom-ref": "a69e6b61f8af030f", "name": "/usr/share/vim/vim91/ftplugin/udevconf.vim", "type": "file" }, { - "bom-ref": "422ae98e1503af16", + "bom-ref": "74c10d3edb4b2956", "name": "/usr/share/vim/vim91/ftplugin/udevperm.vim", "type": "file" }, { - "bom-ref": "088b1dec0142cfeb", + "bom-ref": "80a4e08a1b8f7097", "name": "/usr/share/vim/vim91/ftplugin/udevrules.vim", "type": "file" }, { - "bom-ref": "f4de4cd1b85ed397", + "bom-ref": "d4347c512ebea147", "name": "/usr/share/vim/vim91/ftplugin/unison.vim", "type": "file" }, { - "bom-ref": "9e720b20b6a862cc", + "bom-ref": "509b37ac8c6aaca8", "name": "/usr/share/vim/vim91/ftplugin/updatedb.vim", "type": "file" }, { - "bom-ref": "c38a6ca6de002864", + "bom-ref": "81f4e8020c503f7c", "name": "/usr/share/vim/vim91/ftplugin/urlshortcut.vim", "type": "file" }, { - "bom-ref": "446d591c25c63f83", + "bom-ref": "8bda16a3a8b83f0b", "name": "/usr/share/vim/vim91/ftplugin/usd.vim", "type": "file" }, { - "bom-ref": "235d57a35af9a017", + "bom-ref": "07b7eea787142b0f", "name": "/usr/share/vim/vim91/ftplugin/vb.vim", "type": "file" }, { - "bom-ref": "4cfe6a8892550467", + "bom-ref": "7e03e05ebd18b45f", "name": "/usr/share/vim/vim91/ftplugin/vdf.vim", "type": "file" }, { - "bom-ref": "2a7bb0dab9bd132e", + "bom-ref": "207ba3ab0dc6546a", "name": "/usr/share/vim/vim91/ftplugin/verilog.vim", "type": "file" }, { - "bom-ref": "033e9f6c1a3aa339", + "bom-ref": "99e4e9c5073b7fb5", "name": "/usr/share/vim/vim91/ftplugin/vhdl.vim", "type": "file" }, { - "bom-ref": "41ea82a404928238", + "bom-ref": "136d135c22007f2c", "name": "/usr/share/vim/vim91/ftplugin/vim.vim", "type": "file" }, { - "bom-ref": "878a9d500dca159d", + "bom-ref": "27096d558a0c43e9", "name": "/usr/share/vim/vim91/ftplugin/vroom.vim", "type": "file" }, { - "bom-ref": "8ebfc684b94ee3d0", + "bom-ref": "7dce1c23a907df44", "name": "/usr/share/vim/vim91/ftplugin/vue.vim", "type": "file" }, { - "bom-ref": "da99552111b78d7c", + "bom-ref": "ac867892e2bbb830", "name": "/usr/share/vim/vim91/ftplugin/wat.vim", "type": "file" }, { - "bom-ref": "3b7ed94fc009cf63", + "bom-ref": "57729e5d69616b6f", "name": "/usr/share/vim/vim91/ftplugin/wget.vim", "type": "file" }, { - "bom-ref": "101d64f66f3f928e", + "bom-ref": "a511cd8cfd90416a", "name": "/usr/share/vim/vim91/ftplugin/wget2.vim", "type": "file" }, { - "bom-ref": "a58cff406afb8685", + "bom-ref": "baf8b30fe5ad8db9", "name": "/usr/share/vim/vim91/ftplugin/xcompose.vim", "type": "file" }, { - "bom-ref": "54cd865ec6ae4f8d", + "bom-ref": "e25e378f869fc6a5", "name": "/usr/share/vim/vim91/ftplugin/xdefaults.vim", "type": "file" }, { - "bom-ref": "2ff169c82e810bd0", + "bom-ref": "d0b3ad59ecb05c50", "name": "/usr/share/vim/vim91/ftplugin/xf86conf.vim", "type": "file" }, { - "bom-ref": "0727c10a4c442593", + "bom-ref": "442f5934d822d44b", "name": "/usr/share/vim/vim91/ftplugin/xhtml.vim", "type": "file" }, { - "bom-ref": "aec1cad502c11ae1", + "bom-ref": "3c90949fa1db1679", "name": "/usr/share/vim/vim91/ftplugin/xinetd.vim", "type": "file" }, { - "bom-ref": "6edcb22db568344a", + "bom-ref": "84d6aeb8362669c2", "name": "/usr/share/vim/vim91/ftplugin/xml.vim", "type": "file" }, { - "bom-ref": "f35b1b57a60384d5", + "bom-ref": "e43f2ef797d28ebd", "name": "/usr/share/vim/vim91/ftplugin/xmodmap.vim", "type": "file" }, { - "bom-ref": "9c3ddbdeb827e889", + "bom-ref": "c539cd30917d86a9", "name": "/usr/share/vim/vim91/ftplugin/xs.vim", "type": "file" }, { - "bom-ref": "c442d74be705c400", + "bom-ref": "abd4da3910a9d9c8", "name": "/usr/share/vim/vim91/ftplugin/xsd.vim", "type": "file" }, { - "bom-ref": "f9b7bc407481296f", + "bom-ref": "da2117c801012bdf", "name": "/usr/share/vim/vim91/ftplugin/xslt.vim", "type": "file" }, { - "bom-ref": "a71409f2995324ba", + "bom-ref": "ec9251e2daa58a6a", "name": "/usr/share/vim/vim91/ftplugin/yaml.vim", "type": "file" }, { - "bom-ref": "e1648bd151358055", + "bom-ref": "11702246b58cad51", "name": "/usr/share/vim/vim91/ftplugin/zig.vim", "type": "file" }, { - "bom-ref": "366bf73ce55987d6", + "bom-ref": "1c6167b035c1159a", "name": "/usr/share/vim/vim91/ftplugin/zimbu.vim", "type": "file" }, { - "bom-ref": "1b0acdd34245e4bc", + "bom-ref": "26970aacbd9c5290", "name": "/usr/share/vim/vim91/ftplugin/zsh.vim", "type": "file" }, { - "bom-ref": "ce6cba6a243e0b0c", + "bom-ref": "e2ce1a62ad27dc5c", "name": "/usr/share/vim/vim91/ftplugof.vim", "type": "file" }, { - "bom-ref": "a2f36f50c5ffb7af", + "bom-ref": "7d0372209c86ea8b", "name": "/usr/share/vim/vim91/gvimrc_example.vim", "type": "file" }, { - "bom-ref": "6cd9dc025cb9eae3", + "bom-ref": "98cc4b6e8c41539f", "name": "/usr/share/vim/vim91/import/dist/vimhelp.vim", "type": "file" }, { - "bom-ref": "044f1f08a6ed77d4", + "bom-ref": "03121683230540e4", "name": "/usr/share/vim/vim91/import/dist/vimhighlight.vim", "type": "file" }, { - "bom-ref": "47d57ad28185b0e0", + "bom-ref": "cbc3269cecab72ec", "name": "/usr/share/vim/vim91/indent.vim", "type": "file" }, { - "bom-ref": "b879d8bf93f04dc6", + "bom-ref": "b179376939823046", "name": "/usr/share/vim/vim91/indent/aap.vim", "type": "file" }, { - "bom-ref": "8c8744e36248f844", + "bom-ref": "01f8844e4acd1338", "name": "/usr/share/vim/vim91/indent/ada.vim", "type": "file" }, { - "bom-ref": "62fd528fdb9e7505", + "bom-ref": "fa766b4e592add8d", "name": "/usr/share/vim/vim91/indent/ant.vim", "type": "file" }, { - "bom-ref": "c4c2c4dd87feec50", + "bom-ref": "c0dad550d1d00c2c", "name": "/usr/share/vim/vim91/indent/automake.vim", "type": "file" }, { - "bom-ref": "3b36de35b5f86fed", + "bom-ref": "f00ad8787ff37c71", "name": "/usr/share/vim/vim91/indent/awk.vim", "type": "file" }, { - "bom-ref": "afe370e0697bf084", + "bom-ref": "865c795b8dd71ad8", "name": "/usr/share/vim/vim91/indent/bash.vim", "type": "file" }, { - "bom-ref": "21f94c44b3865133", + "bom-ref": "ae25be2cbdadd8e3", "name": "/usr/share/vim/vim91/indent/basic.vim", "type": "file" }, { - "bom-ref": "f11f66bd3ed0432b", + "bom-ref": "71f74bd0a335343b", "name": "/usr/share/vim/vim91/indent/bib.vim", "type": "file" }, { - "bom-ref": "f4448e15619c34ff", + "bom-ref": "0f5e0f5cbbed723f", "name": "/usr/share/vim/vim91/indent/bitbake.vim", "type": "file" }, { - "bom-ref": "06167aaf632d2dab", + "bom-ref": "c97dfa5ed7b4207f", "name": "/usr/share/vim/vim91/indent/bst.vim", "type": "file" }, { - "bom-ref": "4b063fec2d32e162", + "bom-ref": "75fc3f13d61cabe2", "name": "/usr/share/vim/vim91/indent/bzl.vim", "type": "file" }, { - "bom-ref": "6e49c0ab834010d9", + "bom-ref": "40affbbfdf1b61d5", "name": "/usr/share/vim/vim91/indent/c.vim", "type": "file" }, { - "bom-ref": "83567075e0338d2f", + "bom-ref": "7229280adf1ad3df", "name": "/usr/share/vim/vim91/indent/cdl.vim", "type": "file" }, { - "bom-ref": "9d9358e5706d5d6a", + "bom-ref": "f9d1d2584dfc518e", "name": "/usr/share/vim/vim91/indent/ch.vim", "type": "file" }, { - "bom-ref": "420cef35a7c7bea6", + "bom-ref": "f476b3c5ebca2ea2", "name": "/usr/share/vim/vim91/indent/chaiscript.vim", "type": "file" }, { - "bom-ref": "39f08cbb2f6cd98e", + "bom-ref": "9615ecbaef2e66fa", "name": "/usr/share/vim/vim91/indent/changelog.vim", "type": "file" }, { - "bom-ref": "3e078fe53f096f00", + "bom-ref": "2742acf38f75e310", "name": "/usr/share/vim/vim91/indent/chatito.vim", "type": "file" }, { - "bom-ref": "88f98eb9405e9fae", + "bom-ref": "891ff62f5d08d2f6", "name": "/usr/share/vim/vim91/indent/clojure.vim", "type": "file" }, { - "bom-ref": "6b48cd31de5791de", + "bom-ref": "2e828d2fad3bc72e", "name": "/usr/share/vim/vim91/indent/cmake.vim", "type": "file" }, { - "bom-ref": "a6a3aa24590ec29f", + "bom-ref": "d3c92450e7ba2f1f", "name": "/usr/share/vim/vim91/indent/cobol.vim", "type": "file" }, { - "bom-ref": "44df51a1a8b15941", + "bom-ref": "874e6c7fe22a2a39", "name": "/usr/share/vim/vim91/indent/config.vim", "type": "file" }, { - "bom-ref": "3144d4aa980e2cf2", + "bom-ref": "d81d71d3874fa6fe", "name": "/usr/share/vim/vim91/indent/context.vim", "type": "file" }, { - "bom-ref": "8c5dbf741dec6214", + "bom-ref": "4900681ffafcbad8", "name": "/usr/share/vim/vim91/indent/cpp.vim", "type": "file" }, { - "bom-ref": "1a67ecef1e32098f", + "bom-ref": "3130be23f0e85ef3", "name": "/usr/share/vim/vim91/indent/cs.vim", "type": "file" }, { - "bom-ref": "7c6c8abe429e3464", + "bom-ref": "d89a65a42ee7cf30", "name": "/usr/share/vim/vim91/indent/css.vim", "type": "file" }, { - "bom-ref": "356417c306702dec", + "bom-ref": "00bbac13b59a6fd4", "name": "/usr/share/vim/vim91/indent/cucumber.vim", "type": "file" }, { - "bom-ref": "1b9483585fbaef37", + "bom-ref": "64f67c58187acd7f", "name": "/usr/share/vim/vim91/indent/cuda.vim", "type": "file" }, { - "bom-ref": "73b47e9814174ddf", + "bom-ref": "8f5633e5c2bd57ef", "name": "/usr/share/vim/vim91/indent/d.vim", "type": "file" }, { - "bom-ref": "dce70792dff83307", + "bom-ref": "3ba0083c861887db", "name": "/usr/share/vim/vim91/indent/dictconf.vim", "type": "file" }, { - "bom-ref": "345bb68bfc528513", + "bom-ref": "1be84d087e71d5a7", "name": "/usr/share/vim/vim91/indent/dictdconf.vim", "type": "file" }, { - "bom-ref": "8c4987f013232e95", + "bom-ref": "ed61307663534571", "name": "/usr/share/vim/vim91/indent/docbk.vim", "type": "file" }, { - "bom-ref": "20cf9baf6d403f00", + "bom-ref": "eebc1abe0fbbf900", "name": "/usr/share/vim/vim91/indent/dosbatch.vim", "type": "file" }, { - "bom-ref": "744285a6beb6aec6", + "bom-ref": "71307168f7d8b38e", "name": "/usr/share/vim/vim91/indent/dtd.vim", "type": "file" }, { - "bom-ref": "a0a0006e80810420", + "bom-ref": "f8bb1b2991e487f8", "name": "/usr/share/vim/vim91/indent/dtrace.vim", "type": "file" }, { - "bom-ref": "ba68dd264fc4932a", + "bom-ref": "3c1a3741322a332e", "name": "/usr/share/vim/vim91/indent/dts.vim", "type": "file" }, { - "bom-ref": "5312f8f5452e8bf6", + "bom-ref": "d6e32792ae8ece9a", "name": "/usr/share/vim/vim91/indent/dune.vim", "type": "file" }, { - "bom-ref": "6dd12c4e062392e9", + "bom-ref": "904e2ec1193e9471", "name": "/usr/share/vim/vim91/indent/dylan.vim", "type": "file" }, { - "bom-ref": "02edb6773303aa8b", + "bom-ref": "b4230456810ae85f", "name": "/usr/share/vim/vim91/indent/eiffel.vim", "type": "file" }, { - "bom-ref": "72b327f9f23c8ef1", + "bom-ref": "51fd859ba7485b99", "name": "/usr/share/vim/vim91/indent/elm.vim", "type": "file" }, { - "bom-ref": "e17225d8fac05d13", + "bom-ref": "42073eca8c46223f", "name": "/usr/share/vim/vim91/indent/erlang.vim", "type": "file" }, { - "bom-ref": "98514548e5a29434", + "bom-ref": "f6168db89c4a9fd4", "name": "/usr/share/vim/vim91/indent/eruby.vim", "type": "file" }, { - "bom-ref": "4dcb0e83a615ec4a", + "bom-ref": "cb8905d5dab14892", "name": "/usr/share/vim/vim91/indent/eterm.vim", "type": "file" }, { - "bom-ref": "275c87715561fc05", + "bom-ref": "610c4488e0008a7d", "name": "/usr/share/vim/vim91/indent/expect.vim", "type": "file" }, { - "bom-ref": "c42d264fb8666b75", + "bom-ref": "93b50abf31db5879", "name": "/usr/share/vim/vim91/indent/falcon.vim", "type": "file" }, { - "bom-ref": "66089a7e121270bc", + "bom-ref": "f3d422e46c4e68a4", "name": "/usr/share/vim/vim91/indent/fennel.vim", "type": "file" }, { - "bom-ref": "8c97008c1083603c", + "bom-ref": "6d32d229b3d8baf4", "name": "/usr/share/vim/vim91/indent/fish.vim", "type": "file" }, { - "bom-ref": "43a87a83d8f61a5e", + "bom-ref": "1c8b640f53dee90e", "name": "/usr/share/vim/vim91/indent/fortran.vim", "type": "file" }, { - "bom-ref": "112a1cf4dcf03ccf", + "bom-ref": "cd37259f4f5b97f3", "name": "/usr/share/vim/vim91/indent/framescript.vim", "type": "file" }, { - "bom-ref": "0fd9a036030f2d84", + "bom-ref": "21f5efa0b4f0ef38", "name": "/usr/share/vim/vim91/indent/freebasic.vim", "type": "file" }, { - "bom-ref": "8268303e39fd671a", + "bom-ref": "0dad765c06e68812", "name": "/usr/share/vim/vim91/indent/gdscript.vim", "type": "file" }, { - "bom-ref": "9fee69846a45bc50", + "bom-ref": "1d2bd4216a67dc20", "name": "/usr/share/vim/vim91/indent/gitconfig.vim", "type": "file" }, { - "bom-ref": "a63a4566d21557c4", + "bom-ref": "1cc317486ac9f85c", "name": "/usr/share/vim/vim91/indent/gitolite.vim", "type": "file" }, { - "bom-ref": "28d32ab18bbb1635", + "bom-ref": "133bb433eb9490ed", "name": "/usr/share/vim/vim91/indent/go.vim", "type": "file" }, { - "bom-ref": "1aa056cebf668e8a", + "bom-ref": "8b6122091dd7cc66", "name": "/usr/share/vim/vim91/indent/gyp.vim", "type": "file" }, { - "bom-ref": "f2d239c3e229550e", + "bom-ref": "9117863d128d9e4a", "name": "/usr/share/vim/vim91/indent/haml.vim", "type": "file" }, { - "bom-ref": "0b30325bfd5d0f14", + "bom-ref": "50e56cd8b6f0cc0c", "name": "/usr/share/vim/vim91/indent/hamster.vim", "type": "file" }, { - "bom-ref": "9919aca6532413ce", + "bom-ref": "5cf34b0b1f2d5752", "name": "/usr/share/vim/vim91/indent/hare.vim", "type": "file" }, { - "bom-ref": "b3578704d7806e82", + "bom-ref": "73d18ad3b31c02f6", "name": "/usr/share/vim/vim91/indent/hog.vim", "type": "file" }, { - "bom-ref": "20a25f8451ea20fe", + "bom-ref": "ce3e293300fc13aa", "name": "/usr/share/vim/vim91/indent/html.vim", "type": "file" }, { - "bom-ref": "b7b8dad565e5d1cb", + "bom-ref": "3a61132bfd209dff", "name": "/usr/share/vim/vim91/indent/htmldjango.vim", "type": "file" }, { - "bom-ref": "f4d8211befa06c8d", + "bom-ref": "b833ddbbed7ab149", "name": "/usr/share/vim/vim91/indent/idlang.vim", "type": "file" }, { - "bom-ref": "2b7c620f2570dd1e", + "bom-ref": "bec490982a6ee352", "name": "/usr/share/vim/vim91/indent/ishd.vim", "type": "file" }, { - "bom-ref": "4f183bd0f7c825cd", + "bom-ref": "503f137c5f370cdd", "name": "/usr/share/vim/vim91/indent/j.vim", "type": "file" }, { - "bom-ref": "69954dbb07969a4b", + "bom-ref": "d5b48cd081799d2f", "name": "/usr/share/vim/vim91/indent/java.vim", "type": "file" }, { - "bom-ref": "de367892bc694051", + "bom-ref": "98bd36462fac3c59", "name": "/usr/share/vim/vim91/indent/javascript.vim", "type": "file" }, { - "bom-ref": "642d4c24ec85389d", + "bom-ref": "1edb8a6d18180d01", "name": "/usr/share/vim/vim91/indent/javascriptreact.vim", "type": "file" }, { - "bom-ref": "62d71ea64b2b81f3", + "bom-ref": "86e78bdf92ba3aa7", "name": "/usr/share/vim/vim91/indent/json.vim", "type": "file" }, { - "bom-ref": "d94366461c411389", + "bom-ref": "968a3a8c1b32c6d5", "name": "/usr/share/vim/vim91/indent/jsonc.vim", "type": "file" }, { - "bom-ref": "6ad808bd88700b1b", + "bom-ref": "93b9f756969a6cdf", "name": "/usr/share/vim/vim91/indent/jsp.vim", "type": "file" }, { - "bom-ref": "7d7e54bc66010b11", + "bom-ref": "efd48243525e8e99", "name": "/usr/share/vim/vim91/indent/julia.vim", "type": "file" }, { - "bom-ref": "99c6dab74c4ca599", + "bom-ref": "2d3476bb7f7ca1d1", "name": "/usr/share/vim/vim91/indent/kotlin.vim", "type": "file" }, { - "bom-ref": "2d18836241583fcf", + "bom-ref": "b05bcb20d55c8993", "name": "/usr/share/vim/vim91/indent/krl.vim", "type": "file" }, { - "bom-ref": "68a27d262159b815", + "bom-ref": "05086a3d4679e1c1", "name": "/usr/share/vim/vim91/indent/ld.vim", "type": "file" }, { - "bom-ref": "6b8a80f2cc99f38e", + "bom-ref": "67b673bb34b2aa7e", "name": "/usr/share/vim/vim91/indent/less.vim", "type": "file" }, { - "bom-ref": "2fa00852e9182fe0", + "bom-ref": "7beaf960ba380ae4", "name": "/usr/share/vim/vim91/indent/lifelines.vim", "type": "file" }, { - "bom-ref": "f318eff6c0dc9512", + "bom-ref": "599849fbe311540e", "name": "/usr/share/vim/vim91/indent/liquid.vim", "type": "file" }, { - "bom-ref": "3cc71f9330eb3285", + "bom-ref": "6c5ef18fb45e487d", "name": "/usr/share/vim/vim91/indent/lisp.vim", "type": "file" }, { - "bom-ref": "8cc1a4ed36657408", + "bom-ref": "05940c4ba0ca13bc", "name": "/usr/share/vim/vim91/indent/livebook.vim", "type": "file" }, { - "bom-ref": "68548ae4beef4300", + "bom-ref": "a03ebc467e267a64", "name": "/usr/share/vim/vim91/indent/logtalk.vim", "type": "file" }, { - "bom-ref": "62ebbba13281a1e0", + "bom-ref": "010b0c109fc2bf14", "name": "/usr/share/vim/vim91/indent/lua.vim", "type": "file" }, { - "bom-ref": "8b6215366ac8400b", + "bom-ref": "544dbb049b1227a7", "name": "/usr/share/vim/vim91/indent/luau.vim", "type": "file" }, { - "bom-ref": "e42ec31ab0d30e22", + "bom-ref": "75bbae1628cfa876", "name": "/usr/share/vim/vim91/indent/mail.vim", "type": "file" }, { - "bom-ref": "ec4673d985835b69", + "bom-ref": "fe698e39d0873b25", "name": "/usr/share/vim/vim91/indent/make.vim", "type": "file" }, { - "bom-ref": "4d814178bec10b03", + "bom-ref": "f2af2a5b77e5f887", "name": "/usr/share/vim/vim91/indent/matlab.vim", "type": "file" }, { - "bom-ref": "3fff26613671cb74", + "bom-ref": "3c251bf781b765b8", "name": "/usr/share/vim/vim91/indent/meson.vim", "type": "file" }, { - "bom-ref": "5cdf8970902a0e61", + "bom-ref": "24794298a177cf71", "name": "/usr/share/vim/vim91/indent/mf.vim", "type": "file" }, { - "bom-ref": "bf11bc617222d441", + "bom-ref": "cbb08021fd92935d", "name": "/usr/share/vim/vim91/indent/mma.vim", "type": "file" }, { - "bom-ref": "e3f85646517abe38", + "bom-ref": "62dcfbc86a93f8c0", "name": "/usr/share/vim/vim91/indent/mp.vim", "type": "file" }, { - "bom-ref": "d5bd35333dfaab40", + "bom-ref": "9805d56db65d73ec", "name": "/usr/share/vim/vim91/indent/nginx.vim", "type": "file" }, { - "bom-ref": "a90c846336c1445e", + "bom-ref": "5c330b63513063ca", "name": "/usr/share/vim/vim91/indent/nsis.vim", "type": "file" }, { - "bom-ref": "f554a26dd258b34c", + "bom-ref": "49df3c898c8eb0d0", "name": "/usr/share/vim/vim91/indent/objc.vim", "type": "file" }, { - "bom-ref": "d93d7ed0f95b4bab", + "bom-ref": "328f4879669e8c97", "name": "/usr/share/vim/vim91/indent/obse.vim", "type": "file" }, { - "bom-ref": "9d1b9cb158d86eeb", + "bom-ref": "d16aac3bbde9a46b", "name": "/usr/share/vim/vim91/indent/ocaml.vim", "type": "file" }, { - "bom-ref": "8372aa7763ff69d7", + "bom-ref": "fce3cc6a56b44bdf", "name": "/usr/share/vim/vim91/indent/occam.vim", "type": "file" }, { - "bom-ref": "da20b79fcf9113ff", + "bom-ref": "b25d66ef7c51f0cb", "name": "/usr/share/vim/vim91/indent/pascal.vim", "type": "file" }, { - "bom-ref": "f5817944e5ec5914", + "bom-ref": "09836c94810ca128", "name": "/usr/share/vim/vim91/indent/perl.vim", "type": "file" }, { - "bom-ref": "d19954acd70b8362", + "bom-ref": "48af1a9b742f1876", "name": "/usr/share/vim/vim91/indent/php.vim", "type": "file" }, { - "bom-ref": "b879b11a7b2a69dd", + "bom-ref": "29785318f2318af9", "name": "/usr/share/vim/vim91/indent/postscr.vim", "type": "file" }, { - "bom-ref": "8c3aeb94119c2406", + "bom-ref": "f92ad23588ba486a", "name": "/usr/share/vim/vim91/indent/pov.vim", "type": "file" }, { - "bom-ref": "11eaeecd92b25625", + "bom-ref": "35b14b9e87a1ee2d", "name": "/usr/share/vim/vim91/indent/prolog.vim", "type": "file" }, { - "bom-ref": "e2709815c6d8d6ff", + "bom-ref": "a31d95e61c33d877", "name": "/usr/share/vim/vim91/indent/ps1.vim", "type": "file" }, { - "bom-ref": "4f9045f33ed43a55", + "bom-ref": "5ac42d75979c7169", "name": "/usr/share/vim/vim91/indent/pyrex.vim", "type": "file" }, { - "bom-ref": "e0992614115737f0", + "bom-ref": "904e31e9802bc9b8", "name": "/usr/share/vim/vim91/indent/python.vim", "type": "file" }, { - "bom-ref": "039cd91ba2473bc5", + "bom-ref": "17a1fc25b3e15ad9", "name": "/usr/share/vim/vim91/indent/qb64.vim", "type": "file" }, { - "bom-ref": "61111304d3485332", + "bom-ref": "f57a12e4d91a48b2", "name": "/usr/share/vim/vim91/indent/qml.vim", "type": "file" }, { - "bom-ref": "7a636711012115c4", + "bom-ref": "43647615e723e174", "name": "/usr/share/vim/vim91/indent/quarto.vim", "type": "file" }, { - "bom-ref": "6871d06e18cfe839", + "bom-ref": "18a46370dbcc2bfd", "name": "/usr/share/vim/vim91/indent/r.vim", "type": "file" }, { - "bom-ref": "7c0b8dc64b2d6dd0", + "bom-ref": "d3f91c3c520fafb8", "name": "/usr/share/vim/vim91/indent/racket.vim", "type": "file" }, { - "bom-ref": "239d96eceb05e183", + "bom-ref": "e9f8ee9bd4bbaedb", "name": "/usr/share/vim/vim91/indent/raku.vim", "type": "file" }, { - "bom-ref": "c540f05deba60ffc", + "bom-ref": "af5f2419160a1554", "name": "/usr/share/vim/vim91/indent/raml.vim", "type": "file" }, { - "bom-ref": "fd5546e4b7351d8d", + "bom-ref": "767c5ea421d77705", "name": "/usr/share/vim/vim91/indent/rapid.vim", "type": "file" }, { - "bom-ref": "76edb1cb9f1609ac", + "bom-ref": "8d6812fbb856dec0", "name": "/usr/share/vim/vim91/indent/readline.vim", "type": "file" }, { - "bom-ref": "a363e09f39f93867", + "bom-ref": "6aca832fa2f3062f", "name": "/usr/share/vim/vim91/indent/rhelp.vim", "type": "file" }, { - "bom-ref": "13349efcbf06711c", + "bom-ref": "9cfaaa7d34a5e254", "name": "/usr/share/vim/vim91/indent/rmd.vim", "type": "file" }, { - "bom-ref": "43d2694b47468c5e", + "bom-ref": "4c25e6c3b5e7859e", "name": "/usr/share/vim/vim91/indent/rnoweb.vim", "type": "file" }, { - "bom-ref": "2bea4fa0fd1688f4", + "bom-ref": "5ab74311b7da7738", "name": "/usr/share/vim/vim91/indent/rpl.vim", "type": "file" }, { - "bom-ref": "84df62caec89de07", + "bom-ref": "d39638b2bbcc495b", "name": "/usr/share/vim/vim91/indent/rrst.vim", "type": "file" }, { - "bom-ref": "f1a277c0daca32e1", + "bom-ref": "17da31f8aee8ea29", "name": "/usr/share/vim/vim91/indent/rst.vim", "type": "file" }, { - "bom-ref": "2918aeb7fc30695e", + "bom-ref": "818e713928dffd86", "name": "/usr/share/vim/vim91/indent/ruby.vim", "type": "file" }, { - "bom-ref": "c8557b0083f938e9", + "bom-ref": "0144236826ad96cd", "name": "/usr/share/vim/vim91/indent/rust.vim", "type": "file" }, { - "bom-ref": "0f769f38141d6392", + "bom-ref": "4e1366a7687e6996", "name": "/usr/share/vim/vim91/indent/sas.vim", "type": "file" }, { - "bom-ref": "8d7b5fba2ed6c507", + "bom-ref": "3dd24cae6925d6ef", "name": "/usr/share/vim/vim91/indent/sass.vim", "type": "file" }, { - "bom-ref": "957fcb32ec562f80", + "bom-ref": "14d0aa00eebfa804", "name": "/usr/share/vim/vim91/indent/scala.vim", "type": "file" }, { - "bom-ref": "b6071e1339f83352", + "bom-ref": "58a15b7386cd34de", "name": "/usr/share/vim/vim91/indent/scheme.vim", "type": "file" }, { - "bom-ref": "3731dfc2ff96040c", + "bom-ref": "d8a69f8f1590867c", "name": "/usr/share/vim/vim91/indent/scss.vim", "type": "file" }, { - "bom-ref": "e19124c469e2099a", + "bom-ref": "7e01d306093c0396", "name": "/usr/share/vim/vim91/indent/sdl.vim", "type": "file" }, { - "bom-ref": "f169847bd5308a3f", + "bom-ref": "d2ffb215b8cb6327", "name": "/usr/share/vim/vim91/indent/sh.vim", "type": "file" }, { - "bom-ref": "241073863d1701e6", + "bom-ref": "593d596d734065c6", "name": "/usr/share/vim/vim91/indent/sml.vim", "type": "file" }, { - "bom-ref": "3ba4ce9f0902d32b", + "bom-ref": "4c2814c351085153", "name": "/usr/share/vim/vim91/indent/solidity.vim", "type": "file" }, { - "bom-ref": "ef3cea410b697ffa", + "bom-ref": "fb4fe00b505dc21e", "name": "/usr/share/vim/vim91/indent/sql.vim", "type": "file" }, { - "bom-ref": "532a1e78bd452cc9", + "bom-ref": "266bc0b6c40bed09", "name": "/usr/share/vim/vim91/indent/sqlanywhere.vim", "type": "file" }, { - "bom-ref": "fe71562115cf1e31", + "bom-ref": "22c31faaa73aad3d", "name": "/usr/share/vim/vim91/indent/sshconfig.vim", "type": "file" }, { - "bom-ref": "5126a92326e12cc0", + "bom-ref": "bd933a201746634c", "name": "/usr/share/vim/vim91/indent/systemverilog.vim", "type": "file" }, { - "bom-ref": "a27e446b7e431a89", + "bom-ref": "1887a3b7525caa09", "name": "/usr/share/vim/vim91/indent/tcl.vim", "type": "file" }, { - "bom-ref": "28aba7dde771735f", + "bom-ref": "594dbbd99246eee3", "name": "/usr/share/vim/vim91/indent/tcsh.vim", "type": "file" }, { - "bom-ref": "cfb952d651ac7b0d", + "bom-ref": "908ecaec42184c99", "name": "/usr/share/vim/vim91/indent/teraterm.vim", "type": "file" }, { - "bom-ref": "e67c0d32942f06fd", + "bom-ref": "e0baf14e63ea677d", "name": "/usr/share/vim/vim91/indent/tex.vim", "type": "file" }, { - "bom-ref": "3a022d94e7d99bdc", + "bom-ref": "02c704e58d9186b4", "name": "/usr/share/vim/vim91/indent/tf.vim", "type": "file" }, { - "bom-ref": "afb29b811f4bc12e", + "bom-ref": "ecf06d35ac1c6bee", "name": "/usr/share/vim/vim91/indent/tilde.vim", "type": "file" }, { - "bom-ref": "fe2bac039cbdcc2a", + "bom-ref": "49d21dc9c6d5bffa", "name": "/usr/share/vim/vim91/indent/treetop.vim", "type": "file" }, { - "bom-ref": "cd4c250d9216d97f", + "bom-ref": "ca02fbf492e923df", "name": "/usr/share/vim/vim91/indent/typescript.vim", "type": "file" }, { - "bom-ref": "46596dc0fe99f584", + "bom-ref": "d98954d8dc1e2d30", "name": "/usr/share/vim/vim91/indent/typescriptreact.vim", "type": "file" }, { - "bom-ref": "0d4945af71b1c3ff", + "bom-ref": "bff299ed177c50f7", "name": "/usr/share/vim/vim91/indent/vb.vim", "type": "file" }, { - "bom-ref": "ad18d6bd95cff7a8", + "bom-ref": "61548a7b1258e304", "name": "/usr/share/vim/vim91/indent/verilog.vim", "type": "file" }, { - "bom-ref": "e1fcc138ed56b26e", + "bom-ref": "35093cc1a2f5863e", "name": "/usr/share/vim/vim91/indent/vhdl.vim", "type": "file" }, { - "bom-ref": "3f3444ac9d41d578", + "bom-ref": "76c0bd2ed027a6d4", "name": "/usr/share/vim/vim91/indent/vim.vim", "type": "file" }, { - "bom-ref": "19701d0c4a1ab2e0", + "bom-ref": "afbbe6ea98be046c", "name": "/usr/share/vim/vim91/indent/vroom.vim", "type": "file" }, { - "bom-ref": "225267c308a80639", + "bom-ref": "a8a4a5089370d9ed", "name": "/usr/share/vim/vim91/indent/vue.vim", "type": "file" }, { - "bom-ref": "e6f35a37de222366", + "bom-ref": "eca5aff00554e112", "name": "/usr/share/vim/vim91/indent/wat.vim", "type": "file" }, { - "bom-ref": "375febb8993bdbde", + "bom-ref": "8a0a31880a103cc2", "name": "/usr/share/vim/vim91/indent/xf86conf.vim", "type": "file" }, { - "bom-ref": "d75f25309c66c52c", + "bom-ref": "ce2cbd4b1a0d61d4", "name": "/usr/share/vim/vim91/indent/xhtml.vim", "type": "file" }, { - "bom-ref": "59aeacb1c04e4494", + "bom-ref": "3c97dc4ad8a99130", "name": "/usr/share/vim/vim91/indent/xinetd.vim", "type": "file" }, { - "bom-ref": "8dda25078b05d58d", + "bom-ref": "a63405b85c4e0931", "name": "/usr/share/vim/vim91/indent/xml.vim", "type": "file" }, { - "bom-ref": "42a3586a0974fdde", + "bom-ref": "fe97291f891f1956", "name": "/usr/share/vim/vim91/indent/xsd.vim", "type": "file" }, { - "bom-ref": "74f9ef8d77da6925", + "bom-ref": "585c58e74b058219", "name": "/usr/share/vim/vim91/indent/xslt.vim", "type": "file" }, { - "bom-ref": "0214eb02686a1172", + "bom-ref": "d80faa91aba89dba", "name": "/usr/share/vim/vim91/indent/yacc.vim", "type": "file" }, { - "bom-ref": "0e8fba109ab94df0", + "bom-ref": "6716a0023dbbfea0", "name": "/usr/share/vim/vim91/indent/yaml.vim", "type": "file" }, { - "bom-ref": "6677d69126efbdab", + "bom-ref": "4f6cbaaedc97149b", "name": "/usr/share/vim/vim91/indent/zig.vim", "type": "file" }, { - "bom-ref": "0ce58fefa3e916d1", + "bom-ref": "68d3c5d499990ae9", "name": "/usr/share/vim/vim91/indent/zimbu.vim", "type": "file" }, { - "bom-ref": "70c9e058eb482c35", + "bom-ref": "3fa5d5990178dadd", "name": "/usr/share/vim/vim91/indent/zsh.vim", "type": "file" }, { - "bom-ref": "f8ee8b60b6245563", + "bom-ref": "985bfb3a710a413f", "name": "/usr/share/vim/vim91/indoff.vim", "type": "file" }, { - "bom-ref": "b8e6ea3c4696fb6e", + "bom-ref": "abdc1aa7f7f2163e", "name": "/usr/share/vim/vim91/keymap/accents.vim", "type": "file" }, { - "bom-ref": "35c5bfe0c20c52b5", + "bom-ref": "805b76f5bc05d125", "name": "/usr/share/vim/vim91/keymap/arabic.vim", "type": "file" }, { - "bom-ref": "896cce935de61b5a", + "bom-ref": "da5c3e47fafae2fa", "name": "/usr/share/vim/vim91/keymap/arabic_utf-8.vim", "type": "file" }, { - "bom-ref": "12eb0f589bfe3e6a", + "bom-ref": "82933ad394dcfa12", "name": "/usr/share/vim/vim91/keymap/armenian-eastern_utf-8.vim", "type": "file" }, { - "bom-ref": "c8bde80e0af8704a", + "bom-ref": "bd16f8e8b31b9fae", "name": "/usr/share/vim/vim91/keymap/armenian-western_utf-8.vim", "type": "file" }, { - "bom-ref": "46ef10d201ae68ee", + "bom-ref": "bf5bb1730d26653e", "name": "/usr/share/vim/vim91/keymap/belarusian-jcuken.vim", "type": "file" }, { - "bom-ref": "34bf6200a156728c", + "bom-ref": "5c48c8d5b9a2d60c", "name": "/usr/share/vim/vim91/keymap/bulgarian-bds.vim", "type": "file" }, { - "bom-ref": "9a125d1438dfaa30", + "bom-ref": "53e4b59c12826410", "name": "/usr/share/vim/vim91/keymap/bulgarian-phonetic.vim", "type": "file" }, { - "bom-ref": "031b27702ee498af", + "bom-ref": "86d9374ae0b82c93", "name": "/usr/share/vim/vim91/keymap/canfr-win.vim", "type": "file" }, { - "bom-ref": "ab3e5155c0462798", + "bom-ref": "ade79133a0843960", "name": "/usr/share/vim/vim91/keymap/croatian.vim", "type": "file" }, { - "bom-ref": "0544aee5b08ba541", + "bom-ref": "1a5b1ff2186cb701", "name": "/usr/share/vim/vim91/keymap/croatian_cp1250.vim", "type": "file" }, { - "bom-ref": "709753ff7a7bb487", + "bom-ref": "ae4595a344808b1b", "name": "/usr/share/vim/vim91/keymap/croatian_iso-8859-2.vim", "type": "file" }, { - "bom-ref": "ef09ae6a5361a3a7", + "bom-ref": "c90a2e610303d8a3", "name": "/usr/share/vim/vim91/keymap/croatian_utf-8.vim", "type": "file" }, { - "bom-ref": "2b56a36651cc6fb7", + "bom-ref": "2ba1e055f05e3c67", "name": "/usr/share/vim/vim91/keymap/czech.vim", "type": "file" }, { - "bom-ref": "5ce61103d7c56990", + "bom-ref": "f021da966e91fc1c", "name": "/usr/share/vim/vim91/keymap/czech_utf-8.vim", "type": "file" }, { - "bom-ref": "e7de7c5d26b57a6f", + "bom-ref": "2dfe243eefd53507", "name": "/usr/share/vim/vim91/keymap/dvorak.vim", "type": "file" }, { - "bom-ref": "ee3b37c92ee3ce83", + "bom-ref": "dd65c95bf33ee12f", "name": "/usr/share/vim/vim91/keymap/esperanto.vim", "type": "file" }, { - "bom-ref": "1e99501fb6ded4fb", + "bom-ref": "a0e111bff011c80b", "name": "/usr/share/vim/vim91/keymap/esperanto_utf-8.vim", "type": "file" }, { - "bom-ref": "25b464778856f4c9", + "bom-ref": "7ffa482aa8853505", "name": "/usr/share/vim/vim91/keymap/french-azerty.vim", "type": "file" }, { - "bom-ref": "b6c6131b7f1b756a", + "bom-ref": "f29716e199992aea", "name": "/usr/share/vim/vim91/keymap/german-qwertz.vim", "type": "file" }, { - "bom-ref": "0622600210881090", + "bom-ref": "88846018aff166f0", "name": "/usr/share/vim/vim91/keymap/greek.vim", "type": "file" }, { - "bom-ref": "a6a0c77b800a1a0b", + "bom-ref": "2a452b7a3c992613", "name": "/usr/share/vim/vim91/keymap/greek_cp1253.vim", "type": "file" }, { - "bom-ref": "5f4681fa236aa372", + "bom-ref": "9ce79195d3727d76", "name": "/usr/share/vim/vim91/keymap/greek_cp737.vim", "type": "file" }, { - "bom-ref": "e3c78430266d70b9", + "bom-ref": "4d2a6d93adfea995", "name": "/usr/share/vim/vim91/keymap/greek_iso-8859-7.vim", "type": "file" }, { - "bom-ref": "138343150c9b6a6e", + "bom-ref": "2ebf9637d0d4c2e6", "name": "/usr/share/vim/vim91/keymap/greek_utf-8.vim", "type": "file" }, { - "bom-ref": "f18614097b8cc453", + "bom-ref": "fdf4b23f91cb5f8f", "name": "/usr/share/vim/vim91/keymap/hebrew.vim", "type": "file" }, { - "bom-ref": "4b815a71b5c55a5a", + "bom-ref": "c07118de26db877a", "name": "/usr/share/vim/vim91/keymap/hebrew_cp1255.vim", "type": "file" }, { - "bom-ref": "4044a85f30d4e569", + "bom-ref": "02703c21342c211d", "name": "/usr/share/vim/vim91/keymap/hebrew_iso-8859-8.vim", "type": "file" }, { - "bom-ref": "9dddf95fc1394258", + "bom-ref": "8870f4e83f39f52c", "name": "/usr/share/vim/vim91/keymap/hebrew_utf-8.vim", "type": "file" }, { - "bom-ref": "67ab6ad1cf47f928", + "bom-ref": "b4f2ff09c7f81a84", "name": "/usr/share/vim/vim91/keymap/hebrewp.vim", "type": "file" }, { - "bom-ref": "406ddb6a3cb65e4b", + "bom-ref": "1a5420fc7cb35b9b", "name": "/usr/share/vim/vim91/keymap/hebrewp_cp1255.vim", "type": "file" }, { - "bom-ref": "74f392e2a5224f8c", + "bom-ref": "437fc55629c41328", "name": "/usr/share/vim/vim91/keymap/hebrewp_iso-8859-8.vim", "type": "file" }, { - "bom-ref": "d10541620806acb7", + "bom-ref": "dbea2d206ac95657", "name": "/usr/share/vim/vim91/keymap/hebrewp_utf-8.vim", "type": "file" }, { - "bom-ref": "662fc6cd156d997b", + "bom-ref": "369197275222fef7", "name": "/usr/share/vim/vim91/keymap/kana.vim", "type": "file" }, { - "bom-ref": "9e026b88c1473500", + "bom-ref": "66882b147edb189c", "name": "/usr/share/vim/vim91/keymap/kazakh-jcuken.vim", "type": "file" }, { - "bom-ref": "7bb0dc5fc6c5ddb0", + "bom-ref": "926528bf80e352c8", "name": "/usr/share/vim/vim91/keymap/korean-dubeolsik_utf-8.vim", "type": "file" }, { - "bom-ref": "b667f2e1102c48bc", + "bom-ref": "3f07d8f345d5dfb0", "name": "/usr/share/vim/vim91/keymap/korean.vim", "type": "file" }, { - "bom-ref": "c9741b8cd34d501f", + "bom-ref": "8d1ac015799f7e27", "name": "/usr/share/vim/vim91/keymap/lithuanian-baltic.vim", "type": "file" }, { - "bom-ref": "e35506a40505e4c2", + "bom-ref": "f299ed79ca646db6", "name": "/usr/share/vim/vim91/keymap/magyar_utf-8.vim", "type": "file" }, { - "bom-ref": "15e497827d26587d", + "bom-ref": "a6b6a2eab6fa6c79", "name": "/usr/share/vim/vim91/keymap/mongolian_utf-8.vim", "type": "file" }, { - "bom-ref": "8c8a4b9133e884f4", + "bom-ref": "00fa3e640d511d18", "name": "/usr/share/vim/vim91/keymap/oldturkic-orkhon_utf-8.vim", "type": "file" }, { - "bom-ref": "921434f181404570", + "bom-ref": "f320dd0c49a1ed24", "name": "/usr/share/vim/vim91/keymap/oldturkic-yenisei_utf-8.vim", "type": "file" }, { - "bom-ref": "6df8ff6a2379417c", + "bom-ref": "0a2480e93c8a88a0", "name": "/usr/share/vim/vim91/keymap/persian-iranian_utf-8.vim", "type": "file" }, { - "bom-ref": "711444b9924aa23f", + "bom-ref": "70f0caab2df350cb", "name": "/usr/share/vim/vim91/keymap/persian.vim", "type": "file" }, { - "bom-ref": "4a5c40b01c31911f", + "bom-ref": "e2a7d1a4ce0f4ba7", "name": "/usr/share/vim/vim91/keymap/pinyin.vim", "type": "file" }, { - "bom-ref": "2dd039903c1ef13e", + "bom-ref": "8f97333ce75a920a", "name": "/usr/share/vim/vim91/keymap/polish-slash.vim", "type": "file" }, { - "bom-ref": "9ba8deb6a5a49c65", + "bom-ref": "4be0c23df8262465", "name": "/usr/share/vim/vim91/keymap/polish-slash_cp1250.vim", "type": "file" }, { - "bom-ref": "11609e6ac80e61bb", + "bom-ref": "c730a40a34637f53", "name": "/usr/share/vim/vim91/keymap/polish-slash_cp852.vim", "type": "file" }, { - "bom-ref": "2bfee43505a69f32", + "bom-ref": "b1682046f1fc36d2", "name": "/usr/share/vim/vim91/keymap/polish-slash_iso-8859-2.vim", "type": "file" }, { - "bom-ref": "2abd01490d48680c", + "bom-ref": "834be9e65aaf86b8", "name": "/usr/share/vim/vim91/keymap/polish-slash_utf-8.vim", "type": "file" }, { - "bom-ref": "afcc1c14abdec084", + "bom-ref": "e57cd8a12b2baae4", "name": "/usr/share/vim/vim91/keymap/russian-dvorak.vim", "type": "file" }, { - "bom-ref": "e9034897d40712e9", + "bom-ref": "d0486d7bd92eedf5", "name": "/usr/share/vim/vim91/keymap/russian-jcuken.vim", "type": "file" }, { - "bom-ref": "41b85755ac367fa8", + "bom-ref": "029bbe90407304a0", "name": "/usr/share/vim/vim91/keymap/russian-jcukenmac.vim", "type": "file" }, { - "bom-ref": "6378f414f3b24971", + "bom-ref": "1d0b91edac5b51c9", "name": "/usr/share/vim/vim91/keymap/russian-jcukenwin.vim", "type": "file" }, { - "bom-ref": "b9a709d6ed50aad3", + "bom-ref": "0ff5c909fec2c14f", "name": "/usr/share/vim/vim91/keymap/russian-jcukenwintype.vim", "type": "file" }, { - "bom-ref": "42146dfa33824fe8", + "bom-ref": "b8517bea38bb33cc", "name": "/usr/share/vim/vim91/keymap/russian-typograph.vim", "type": "file" }, { - "bom-ref": "177a49b5a68d847a", + "bom-ref": "9046c6856076e756", "name": "/usr/share/vim/vim91/keymap/russian-yawerty.vim", "type": "file" }, { - "bom-ref": "3b950c7a06b171b7", + "bom-ref": "33d83383dd52d21b", "name": "/usr/share/vim/vim91/keymap/serbian-latin.vim", "type": "file" }, { - "bom-ref": "4acc084d186cb833", + "bom-ref": "9f310150f3b4f1e3", "name": "/usr/share/vim/vim91/keymap/serbian-latin_utf-8.vim", "type": "file" }, { - "bom-ref": "05e734c828065423", + "bom-ref": "39c6c69687656f7b", "name": "/usr/share/vim/vim91/keymap/serbian.vim", "type": "file" }, { - "bom-ref": "9e272027c18110f1", + "bom-ref": "6b1ec0dd4af9f2cd", "name": "/usr/share/vim/vim91/keymap/serbian_cp1250.vim", "type": "file" }, { - "bom-ref": "31494e4ff9346cf0", + "bom-ref": "2cd338280557db30", "name": "/usr/share/vim/vim91/keymap/serbian_cp1251.vim", "type": "file" }, { - "bom-ref": "824b1e94b6529842", + "bom-ref": "1883003cd5408fc2", "name": "/usr/share/vim/vim91/keymap/serbian_iso-8859-2.vim", "type": "file" }, { - "bom-ref": "b5d6c0a5725f9974", + "bom-ref": "0eeaf0abac97adf4", "name": "/usr/share/vim/vim91/keymap/serbian_iso-8859-5.vim", "type": "file" }, { - "bom-ref": "07418af619dc4923", + "bom-ref": "8d9c276b29635abb", "name": "/usr/share/vim/vim91/keymap/serbian_utf-8.vim", "type": "file" }, { - "bom-ref": "54e7a2a1397c7385", + "bom-ref": "92fb11ae57664c25", "name": "/usr/share/vim/vim91/keymap/sinhala-phonetic_utf-8.vim", "type": "file" }, { - "bom-ref": "9a0bbacec1e7f062", + "bom-ref": "3da3dee10d5c55ca", "name": "/usr/share/vim/vim91/keymap/sinhala.vim", "type": "file" }, { - "bom-ref": "0b84970cd7d13ac6", + "bom-ref": "67d53460cb5ef336", "name": "/usr/share/vim/vim91/keymap/slovak.vim", "type": "file" }, { - "bom-ref": "68994f90b1123a23", + "bom-ref": "c6b1612d8c5d0e57", "name": "/usr/share/vim/vim91/keymap/slovak_cp1250.vim", "type": "file" }, { - "bom-ref": "2c102ff2be7205a1", + "bom-ref": "39511601a87d4add", "name": "/usr/share/vim/vim91/keymap/slovak_iso-8859-2.vim", "type": "file" }, { - "bom-ref": "cb0e744d94b948c5", + "bom-ref": "c4b5fcec99ef4c79", "name": "/usr/share/vim/vim91/keymap/slovak_utf-8.vim", "type": "file" }, { - "bom-ref": "a4f20adcdf3a569f", + "bom-ref": "d848462101622ddb", "name": "/usr/share/vim/vim91/keymap/tamil_tscii.vim", "type": "file" }, { - "bom-ref": "8623581a42429168", + "bom-ref": "66f6376e5dbf3ee0", "name": "/usr/share/vim/vim91/keymap/thaana-phonetic_utf-8.vim", "type": "file" }, { - "bom-ref": "e163a7147c0a4e44", + "bom-ref": "ee07d9c61959cda4", "name": "/usr/share/vim/vim91/keymap/thaana.vim", "type": "file" }, { - "bom-ref": "7bbf50f3e544a991", + "bom-ref": "ab7ea11f554a061d", "name": "/usr/share/vim/vim91/keymap/turkish-f.vim", "type": "file" }, { - "bom-ref": "acab8e0af48a3acf", + "bom-ref": "89538b629265f09b", "name": "/usr/share/vim/vim91/keymap/turkish-q.vim", "type": "file" }, { - "bom-ref": "4fb3914d6f9ae5ef", + "bom-ref": "123997464d4d7bf3", "name": "/usr/share/vim/vim91/keymap/ukrainian-dvorak.vim", "type": "file" }, { - "bom-ref": "e18f9ce7c959e819", + "bom-ref": "74e89ca23629a3fd", "name": "/usr/share/vim/vim91/keymap/ukrainian-jcuken.vim", "type": "file" }, { - "bom-ref": "6b27e1f3adfa4204", + "bom-ref": "b6f7ab0194fdab20", "name": "/usr/share/vim/vim91/keymap/vietnamese-telex_utf-8.vim", "type": "file" }, { - "bom-ref": "eed2ace63469288f", + "bom-ref": "45a2f8918969bcff", "name": "/usr/share/vim/vim91/keymap/vietnamese-viqr_utf-8.vim", "type": "file" }, { - "bom-ref": "f4cc2d13e285a76e", + "bom-ref": "554f6142f212de5e", "name": "/usr/share/vim/vim91/keymap/vietnamese-vni_utf-8.vim", "type": "file" }, { - "bom-ref": "1251b0c800cb1487", + "bom-ref": "4f13d137c744c017", "name": "/usr/share/vim/vim91/lang/af/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "09d50c0d6c4f7070", + "bom-ref": "c7bd21629e476614", "name": "/usr/share/vim/vim91/lang/ca/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "89123bfbb60c0fe6", + "bom-ref": "8aca6351ccb03942", "name": "/usr/share/vim/vim91/lang/cs.cp1250/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "947d6e1032d5bd37", + "bom-ref": "a0294194643dbd43", "name": "/usr/share/vim/vim91/lang/cs/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "640c4e7d79971046", + "bom-ref": "71d19cf6919f6912", "name": "/usr/share/vim/vim91/lang/da/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "a10fd280a748f63b", + "bom-ref": "8e0ec0553829b387", "name": "/usr/share/vim/vim91/lang/de/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "0bf5b015a9bd532e", + "bom-ref": "8c71c2b8b24a50fe", "name": "/usr/share/vim/vim91/lang/en_GB/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "2535dc78d955a716", + "bom-ref": "a73fd255fdddf496", "name": "/usr/share/vim/vim91/lang/eo/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "06e459c50f90ee7f", + "bom-ref": "5303ae5d8a08383f", "name": "/usr/share/vim/vim91/lang/es/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "4d51a1c1ebdf1d71", + "bom-ref": "5cf5e36f83979a95", "name": "/usr/share/vim/vim91/lang/fi/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "2960d4f665276081", + "bom-ref": "864378faee394d4d", "name": "/usr/share/vim/vim91/lang/fr/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "faf5fcabcbc09e92", + "bom-ref": "ab6c42cc0f2a712e", "name": "/usr/share/vim/vim91/lang/ga/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "ff984457f703e7a9", + "bom-ref": "d78b9d037b95a54d", "name": "/usr/share/vim/vim91/lang/hu/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "27cf6f3de5a9c26e", + "bom-ref": "2a3c5496e2c1b626", "name": "/usr/share/vim/vim91/lang/it/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "00baa579b34b0961", + "bom-ref": "6968fc7126a850fd", "name": "/usr/share/vim/vim91/lang/ja.euc-jp/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "d76db5f7aa43fcd8", + "bom-ref": "b3d2f90e7aacb944", "name": "/usr/share/vim/vim91/lang/ja.sjis/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "7bb0a61da0a8589c", + "bom-ref": "2f73a166375b4f7c", "name": "/usr/share/vim/vim91/lang/ja/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "d199edb040a24c9a", + "bom-ref": "d19a177d44f64f2e", "name": "/usr/share/vim/vim91/lang/ko.UTF-8/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "cdd399207ec59b7b", + "bom-ref": "642432c5a0c0e9db", "name": "/usr/share/vim/vim91/lang/ko/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "15b29eb576035f28", + "bom-ref": "bda957eb3f8e494c", "name": "/usr/share/vim/vim91/lang/lv/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "ba5dfa5f9a2328ea", + "bom-ref": "5f5b971a4e78ab06", "name": "/usr/share/vim/vim91/lang/menu_af.latin1.vim", "type": "file" }, { - "bom-ref": "a371d1035a71809c", + "bom-ref": "502f3485d6070980", "name": "/usr/share/vim/vim91/lang/menu_af.utf-8.vim", "type": "file" }, { - "bom-ref": "45c2f64d2234389e", + "bom-ref": "2232a97edc8a2e16", "name": "/usr/share/vim/vim91/lang/menu_af_af.latin1.vim", "type": "file" }, { - "bom-ref": "d408e6b6a81f8534", + "bom-ref": "c538cf697dd13a10", "name": "/usr/share/vim/vim91/lang/menu_af_af.utf-8.vim", "type": "file" }, { - "bom-ref": "0500f6aa785a2079", + "bom-ref": "36c5460628a6bfbd", "name": "/usr/share/vim/vim91/lang/menu_ca.latin1.vim", "type": "file" }, { - "bom-ref": "90a410fbc3265889", + "bom-ref": "3ab94b161c983c19", "name": "/usr/share/vim/vim91/lang/menu_ca.utf-8.vim", "type": "file" }, { - "bom-ref": "52ed2dd9bc7af3bf", + "bom-ref": "3d92148e5f7b54d3", "name": "/usr/share/vim/vim91/lang/menu_ca_es.latin1.vim", "type": "file" }, { - "bom-ref": "70cf65c3b08462c5", + "bom-ref": "fc4f98eff74524c5", "name": "/usr/share/vim/vim91/lang/menu_ca_es.utf-8.vim", "type": "file" }, { - "bom-ref": "9ac78e195330a008", + "bom-ref": "633dcbd64f5ac6c0", "name": "/usr/share/vim/vim91/lang/menu_chinese(gb)_gb.936.vim", "type": "file" }, { - "bom-ref": "5df7da8f3dda1acb", + "bom-ref": "26c9d6e10bb34c7b", "name": "/usr/share/vim/vim91/lang/menu_chinese(taiwan)_taiwan.950.vim", "type": "file" }, { - "bom-ref": "239e379fbda59b2e", + "bom-ref": "2120132ce7dbff42", "name": "/usr/share/vim/vim91/lang/menu_chinese_gb.936.vim", "type": "file" }, { - "bom-ref": "949203a9c88a0cb7", + "bom-ref": "2d6e4e8ea9ecadbf", "name": "/usr/share/vim/vim91/lang/menu_chinese_taiwan.950.vim", "type": "file" }, { - "bom-ref": "42e965bedbea9674", + "bom-ref": "4591b366c6dfcea8", "name": "/usr/share/vim/vim91/lang/menu_cs.cp1250.vim", "type": "file" }, { - "bom-ref": "a6a876a21e3ac27e", + "bom-ref": "6f8e31552211aee6", "name": "/usr/share/vim/vim91/lang/menu_cs.latin1.vim", "type": "file" }, { - "bom-ref": "2987338bc69785f6", + "bom-ref": "710034625e4df41e", "name": "/usr/share/vim/vim91/lang/menu_cs_cz.cp1250.vim", "type": "file" }, { - "bom-ref": "73d5fad336b44d8e", + "bom-ref": "689cefa700b4ae1a", "name": "/usr/share/vim/vim91/lang/menu_cs_cz.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "8578cd73d224afad", + "bom-ref": "e27396d54ca16fed", "name": "/usr/share/vim/vim91/lang/menu_cs_cz.latin1.vim", "type": "file" }, { - "bom-ref": "a2f55081f9352c2b", + "bom-ref": "d483394930e000bf", "name": "/usr/share/vim/vim91/lang/menu_cs_cz.utf-8.vim", "type": "file" }, { - "bom-ref": "dc26c4baf3a70dbd", + "bom-ref": "fb5fe6282b90eef5", "name": "/usr/share/vim/vim91/lang/menu_czech_czech_republic.1250.vim", "type": "file" }, { - "bom-ref": "9e00240b856ce64c", + "bom-ref": "758b7f85a8d21204", "name": "/usr/share/vim/vim91/lang/menu_czech_czech_republic.1252.vim", "type": "file" }, { - "bom-ref": "ff84c0d5b38ffcc4", + "bom-ref": "a0d91980a21af828", "name": "/usr/share/vim/vim91/lang/menu_czech_czech_republic.ascii.vim", "type": "file" }, { - "bom-ref": "92dbfab213954426", + "bom-ref": "6472c3003bc9f5b6", "name": "/usr/share/vim/vim91/lang/menu_da.latin1.vim", "type": "file" }, { - "bom-ref": "ca479f14b337b842", + "bom-ref": "73103c9a319fd692", "name": "/usr/share/vim/vim91/lang/menu_da.utf-8.vim", "type": "file" }, { - "bom-ref": "5771584f117f9c2b", + "bom-ref": "2c96a56680a2748b", "name": "/usr/share/vim/vim91/lang/menu_de.latin1.vim", "type": "file" }, { - "bom-ref": "d22f6afc0d0a2d48", + "bom-ref": "bc602def11918d3c", "name": "/usr/share/vim/vim91/lang/menu_de.utf-8.vim", "type": "file" }, { - "bom-ref": "ddc9916ca157dcc4", + "bom-ref": "58aa075b2611c2a4", "name": "/usr/share/vim/vim91/lang/menu_de_de.latin1.vim", "type": "file" }, { - "bom-ref": "647c45bb498c88ad", + "bom-ref": "6de6c477d0d92bf9", "name": "/usr/share/vim/vim91/lang/menu_de_de.utf-8.vim", "type": "file" }, { - "bom-ref": "5731270a0af1d961", + "bom-ref": "1471c972212f0f71", "name": "/usr/share/vim/vim91/lang/menu_en_gb.latin1.vim", "type": "file" }, { - "bom-ref": "9068292092b28254", + "bom-ref": "361e15cf0e41c958", "name": "/usr/share/vim/vim91/lang/menu_en_gb.utf-8.vim", "type": "file" }, { - "bom-ref": "08c0c810476efa6d", + "bom-ref": "86d3b0c86f68ab01", "name": "/usr/share/vim/vim91/lang/menu_english_united_kingdom.1252.vim", "type": "file" }, { - "bom-ref": "22af588494fee420", + "bom-ref": "a45a403b765f8af8", "name": "/usr/share/vim/vim91/lang/menu_english_united_kingdom.ascii.vim", "type": "file" }, { - "bom-ref": "af73a22cc2304d73", + "bom-ref": "a9a8a94a8212113b", "name": "/usr/share/vim/vim91/lang/menu_eo.utf-8.vim", "type": "file" }, { - "bom-ref": "959b9cdc6b969f41", + "bom-ref": "5e82b93d76ce7831", "name": "/usr/share/vim/vim91/lang/menu_eo_eo.utf-8.vim", "type": "file" }, { - "bom-ref": "a87a7293e151d426", + "bom-ref": "a3669963ac91414a", "name": "/usr/share/vim/vim91/lang/menu_eo_xx.utf-8.vim", "type": "file" }, { - "bom-ref": "dbd8b86b6af118ec", + "bom-ref": "008565792a7e85bc", "name": "/usr/share/vim/vim91/lang/menu_es.latin1.vim", "type": "file" }, { - "bom-ref": "6945253c7e509258", + "bom-ref": "771378607a1a952c", "name": "/usr/share/vim/vim91/lang/menu_es.utf-8.vim", "type": "file" }, { - "bom-ref": "70523f17c570689f", + "bom-ref": "0f76c8885e95aa4b", "name": "/usr/share/vim/vim91/lang/menu_es_es.latin1.vim", "type": "file" }, { - "bom-ref": "1a11b75d8de57255", + "bom-ref": "388eb5a49b90657d", "name": "/usr/share/vim/vim91/lang/menu_es_es.utf-8.vim", "type": "file" }, { - "bom-ref": "b30c5dfa2beac5a6", + "bom-ref": "c93b0542413e4072", "name": "/usr/share/vim/vim91/lang/menu_fi.latin1.vim", "type": "file" }, { - "bom-ref": "36408be16671c983", + "bom-ref": "4e8989e31a07edc7", "name": "/usr/share/vim/vim91/lang/menu_fi.utf-8.vim", "type": "file" }, { - "bom-ref": "cac7ec9cb2411aae", + "bom-ref": "b91507b59ebc887a", "name": "/usr/share/vim/vim91/lang/menu_fi_fi.latin1.vim", "type": "file" }, { - "bom-ref": "3f37bf7aed7288c8", + "bom-ref": "2c0b6399b1c45cec", "name": "/usr/share/vim/vim91/lang/menu_fi_fi.utf-8.vim", "type": "file" }, { - "bom-ref": "85d0b3c15eb57b11", + "bom-ref": "c2d42b31f740a2fd", "name": "/usr/share/vim/vim91/lang/menu_finnish_finland.1252.vim", "type": "file" }, { - "bom-ref": "7fc65bf681f15061", + "bom-ref": "8365480efc99d391", "name": "/usr/share/vim/vim91/lang/menu_fr.latin1.vim", "type": "file" }, { - "bom-ref": "e79441e1fcac7265", + "bom-ref": "1f4d368a06ed75e5", "name": "/usr/share/vim/vim91/lang/menu_fr.utf-8.vim", "type": "file" }, { - "bom-ref": "733b947eb05d4aad", + "bom-ref": "87b5a65aab24a6dd", "name": "/usr/share/vim/vim91/lang/menu_fr_fr.latin1.vim", "type": "file" }, { - "bom-ref": "5bc8d1dd5f937f6e", + "bom-ref": "7ca1965b0ac5a04a", "name": "/usr/share/vim/vim91/lang/menu_fr_fr.utf-8.vim", "type": "file" }, { - "bom-ref": "02154e4354cb6a56", + "bom-ref": "9f1a2f55ce8440ca", "name": "/usr/share/vim/vim91/lang/menu_french_france.1252.vim", "type": "file" }, { - "bom-ref": "bf76d1495d3ea6ed", + "bom-ref": "8dbcc23215ff260d", "name": "/usr/share/vim/vim91/lang/menu_german_germany.1252.vim", "type": "file" }, { - "bom-ref": "83346591aeb27af9", + "bom-ref": "1f5c04ec01ed71a5", "name": "/usr/share/vim/vim91/lang/menu_hu.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "e64a232d22465d7a", + "bom-ref": "ada1b8cf2e2d6602", "name": "/usr/share/vim/vim91/lang/menu_hu.utf-8.vim", "type": "file" }, { - "bom-ref": "1f0ce62c37f657c2", + "bom-ref": "9b3dda83e6a09f82", "name": "/usr/share/vim/vim91/lang/menu_hu_hu.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "faebcd62868197db", + "bom-ref": "9bf3825f0182e71b", "name": "/usr/share/vim/vim91/lang/menu_hu_hu.utf-8.vim", "type": "file" }, { - "bom-ref": "b994f63e456d72bb", + "bom-ref": "9146d22f209ef553", "name": "/usr/share/vim/vim91/lang/menu_is.latin1.vim", "type": "file" }, { - "bom-ref": "327d3d4fe62864c2", + "bom-ref": "3342ad4cf2b3dcde", "name": "/usr/share/vim/vim91/lang/menu_is.utf-8.vim", "type": "file" }, { - "bom-ref": "a4c0727c52737b1e", + "bom-ref": "d7d1662201b1735e", "name": "/usr/share/vim/vim91/lang/menu_is_is.latin1.vim", "type": "file" }, { - "bom-ref": "9d277e5f3dedd592", + "bom-ref": "f79a425adab14e22", "name": "/usr/share/vim/vim91/lang/menu_is_is.utf-8.vim", "type": "file" }, { - "bom-ref": "bf00232f07223bbe", + "bom-ref": "ef3ae6aae7519752", "name": "/usr/share/vim/vim91/lang/menu_it.latin1.vim", "type": "file" }, { - "bom-ref": "c77cb1ae1bed8415", + "bom-ref": "6000e98eb7a096ed", "name": "/usr/share/vim/vim91/lang/menu_it.utf-8.vim", "type": "file" }, { - "bom-ref": "14456258ca421d3e", + "bom-ref": "f8c36457c255dc6e", "name": "/usr/share/vim/vim91/lang/menu_it_it.latin1.vim", "type": "file" }, { - "bom-ref": "2bac1e8b86d1407f", + "bom-ref": "b73a323bf564346f", "name": "/usr/share/vim/vim91/lang/menu_it_it.utf-8.vim", "type": "file" }, { - "bom-ref": "a66c926ebaecd6ba", + "bom-ref": "a6a9d6a2d1b01b52", "name": "/usr/share/vim/vim91/lang/menu_italian_italy.1252.vim", "type": "file" }, { - "bom-ref": "fd27da772306d8e2", + "bom-ref": "d41d6a4f3cfd52fe", "name": "/usr/share/vim/vim91/lang/menu_ja.cp932.vim", "type": "file" }, { - "bom-ref": "8dc4162204a166b4", + "bom-ref": "c51592ba9b65a198", "name": "/usr/share/vim/vim91/lang/menu_ja.euc-jp.vim", "type": "file" }, { - "bom-ref": "4bac71d88bd7977b", + "bom-ref": "571f2ced3d398217", "name": "/usr/share/vim/vim91/lang/menu_ja.eucjp.vim", "type": "file" }, { - "bom-ref": "919adfc196e6065e", + "bom-ref": "d7af12bff84b4666", "name": "/usr/share/vim/vim91/lang/menu_ja.ujis.vim", "type": "file" }, { - "bom-ref": "58add204769a3cdc", + "bom-ref": "75d43cf5eec3d510", "name": "/usr/share/vim/vim91/lang/menu_ja.utf-8.vim", "type": "file" }, { - "bom-ref": "8b45e1f1f7ce2dcd", + "bom-ref": "2cb8d04d3b67f7fd", "name": "/usr/share/vim/vim91/lang/menu_ja_jp.cp932.vim", "type": "file" }, { - "bom-ref": "14d623d931487914", + "bom-ref": "80c1bbf58de1a450", "name": "/usr/share/vim/vim91/lang/menu_ja_jp.euc-jp.vim", "type": "file" }, { - "bom-ref": "3a3791767712a7d9", + "bom-ref": "8f8c73ab2a21165d", "name": "/usr/share/vim/vim91/lang/menu_ja_jp.eucjp.vim", "type": "file" }, { - "bom-ref": "6d41ed17f45dffad", + "bom-ref": "c84761d68c97ce2d", "name": "/usr/share/vim/vim91/lang/menu_ja_jp.ujis.vim", "type": "file" }, { - "bom-ref": "65d51095cdc511ac", + "bom-ref": "86e90c2361b67070", "name": "/usr/share/vim/vim91/lang/menu_ja_jp.utf-8.vim", "type": "file" }, { - "bom-ref": "18225bda692d68fc", + "bom-ref": "ab98bc12d3fd8b90", "name": "/usr/share/vim/vim91/lang/menu_japanese_japan.932.vim", "type": "file" }, { - "bom-ref": "8562897c76426556", + "bom-ref": "abbce53992c5f2f2", "name": "/usr/share/vim/vim91/lang/menu_ko.utf-8.vim", "type": "file" }, { - "bom-ref": "ff06ab1e365b3eba", + "bom-ref": "65c1f58ee46f5dde", "name": "/usr/share/vim/vim91/lang/menu_ko_kr.euckr.vim", "type": "file" }, { - "bom-ref": "f36e8024c336fbc7", + "bom-ref": "cdfd0af5e564827f", "name": "/usr/share/vim/vim91/lang/menu_ko_kr.utf-8.vim", "type": "file" }, { - "bom-ref": "cbbafbb993ba24da", + "bom-ref": "8197cd84e0644fb2", "name": "/usr/share/vim/vim91/lang/menu_ko_kr.vim", "type": "file" }, { - "bom-ref": "47664d90255c1952", + "bom-ref": "0917afd2a901c3ca", "name": "/usr/share/vim/vim91/lang/menu_nl.latin1.vim", "type": "file" }, { - "bom-ref": "15b3acb9daae30ed", + "bom-ref": "decf8a9ddc867a89", "name": "/usr/share/vim/vim91/lang/menu_nl.utf-8.vim", "type": "file" }, { - "bom-ref": "2d681860dc32e3d0", + "bom-ref": "3053f542a4ffd9e4", "name": "/usr/share/vim/vim91/lang/menu_nl_nl.latin1.vim", "type": "file" }, { - "bom-ref": "36c0cfca4e14e212", + "bom-ref": "336ff43bfcc8e3ea", "name": "/usr/share/vim/vim91/lang/menu_nl_nl.utf-8.vim", "type": "file" }, { - "bom-ref": "15eeba320031d96e", + "bom-ref": "164795674b428702", "name": "/usr/share/vim/vim91/lang/menu_no.latin1.vim", "type": "file" }, { - "bom-ref": "0781e3844414f19a", + "bom-ref": "bc4f39a3cf895ee6", "name": "/usr/share/vim/vim91/lang/menu_no.utf-8.vim", "type": "file" }, { - "bom-ref": "8c32bb8ad88d9d87", + "bom-ref": "10784335a4ba631b", "name": "/usr/share/vim/vim91/lang/menu_no_no.latin1.vim", "type": "file" }, { - "bom-ref": "4c6cd1fdf0b5f0d1", + "bom-ref": "67177e94663dae5d", "name": "/usr/share/vim/vim91/lang/menu_no_no.utf-8.vim", "type": "file" }, { - "bom-ref": "6dcf1936b259aae1", + "bom-ref": "e5a8fa9d25e93f39", "name": "/usr/share/vim/vim91/lang/menu_pl.cp1250.vim", "type": "file" }, { - "bom-ref": "ce6861d8b8e3f1e8", + "bom-ref": "18185a398f084e34", "name": "/usr/share/vim/vim91/lang/menu_pl_pl.cp1250.vim", "type": "file" }, { - "bom-ref": "d2894727e27b3afa", + "bom-ref": "0680163d0e728a3a", "name": "/usr/share/vim/vim91/lang/menu_pl_pl.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "b061e5b41aec9b0e", + "bom-ref": "a20a3a6e1c345786", "name": "/usr/share/vim/vim91/lang/menu_pl_pl.utf-8.vim", "type": "file" }, { - "bom-ref": "6da8f0ed4f317665", + "bom-ref": "10e99a4750b6a259", "name": "/usr/share/vim/vim91/lang/menu_polish_poland.1250.vim", "type": "file" }, { - "bom-ref": "8abe4d39bf005bc2", + "bom-ref": "d9e1fefa9b18d596", "name": "/usr/share/vim/vim91/lang/menu_pt_br.latin1.vim", "type": "file" }, { - "bom-ref": "5da4fa994cef909f", + "bom-ref": "f5e46e65012f8fc7", "name": "/usr/share/vim/vim91/lang/menu_pt_br.utf-8.vim", "type": "file" }, { - "bom-ref": "a64d8671cf207191", + "bom-ref": "fd948ade1c8370f9", "name": "/usr/share/vim/vim91/lang/menu_pt_br.vim", "type": "file" }, { - "bom-ref": "d63505887c97b6f8", + "bom-ref": "247be6c100773120", "name": "/usr/share/vim/vim91/lang/menu_pt_pt.latin1.vim", "type": "file" }, { - "bom-ref": "dbc36c42e721cf76", + "bom-ref": "8070b66669abf1b2", "name": "/usr/share/vim/vim91/lang/menu_pt_pt.utf-8.vim", "type": "file" }, { - "bom-ref": "fc69cd0b1322b41e", + "bom-ref": "7a59c55567311dda", "name": "/usr/share/vim/vim91/lang/menu_pt_pt.vim", "type": "file" }, { - "bom-ref": "24a90cba516c6db1", + "bom-ref": "7dee4e7b3b051959", "name": "/usr/share/vim/vim91/lang/menu_ru.cp1251.vim", "type": "file" }, { - "bom-ref": "82fffffdea78ad31", + "bom-ref": "3ebdaf69f560b451", "name": "/usr/share/vim/vim91/lang/menu_ru.koi8-r.vim", "type": "file" }, { - "bom-ref": "206c24c2bb705964", + "bom-ref": "a6343b2301133d10", "name": "/usr/share/vim/vim91/lang/menu_ru.utf-8.vim", "type": "file" }, { - "bom-ref": "5f2beac0b08222c5", + "bom-ref": "fb8b92745b77b019", "name": "/usr/share/vim/vim91/lang/menu_ru.vim", "type": "file" }, { - "bom-ref": "a39040d0e980a11c", + "bom-ref": "15fedf83276be4cc", "name": "/usr/share/vim/vim91/lang/menu_ru_ru.cp1251.vim", "type": "file" }, { - "bom-ref": "04cf630c0a01dfd6", + "bom-ref": "37ebe0a4b85c2572", "name": "/usr/share/vim/vim91/lang/menu_ru_ru.koi8-r.vim", "type": "file" }, { - "bom-ref": "900d95ead13f04fa", + "bom-ref": "e02cff7bda8fd2fa", "name": "/usr/share/vim/vim91/lang/menu_ru_ru.utf-8.vim", "type": "file" }, { - "bom-ref": "c46d876a54cc034e", + "bom-ref": "85ce1e94e63cd61e", "name": "/usr/share/vim/vim91/lang/menu_ru_ru.vim", "type": "file" }, { - "bom-ref": "58d26a3a361daaab", + "bom-ref": "617184c60b7b27ff", "name": "/usr/share/vim/vim91/lang/menu_sk.cp1250.vim", "type": "file" }, { - "bom-ref": "9a92988642a7e2c9", + "bom-ref": "bb5f5e8d5965c77d", "name": "/usr/share/vim/vim91/lang/menu_sk_sk.1250.vim", "type": "file" }, { - "bom-ref": "7649a531524745ed", + "bom-ref": "408704e159d68279", "name": "/usr/share/vim/vim91/lang/menu_sk_sk.cp1250.vim", "type": "file" }, { - "bom-ref": "a7c7d48ddddfb00a", + "bom-ref": "c24bac698b152a5a", "name": "/usr/share/vim/vim91/lang/menu_sk_sk.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "1c47653fc84d8a0e", + "bom-ref": "2a1d2515a0e2c336", "name": "/usr/share/vim/vim91/lang/menu_sk_sk.vim", "type": "file" }, { - "bom-ref": "a5900b3ec2613dd1", + "bom-ref": "5a7809c7e9f95f0d", "name": "/usr/share/vim/vim91/lang/menu_sl_si.cp1250.vim", "type": "file" }, { - "bom-ref": "c2b55d0e20e6df51", + "bom-ref": "81d1b783df1f2e09", "name": "/usr/share/vim/vim91/lang/menu_sl_si.latin2.vim", "type": "file" }, { - "bom-ref": "265a5e912e3484f2", + "bom-ref": "581a643577ac75ee", "name": "/usr/share/vim/vim91/lang/menu_sl_si.utf-8.vim", "type": "file" }, { - "bom-ref": "053872a99922e932", + "bom-ref": "f58602096353de5e", "name": "/usr/share/vim/vim91/lang/menu_slovak_slovak_republic.1250.vim", "type": "file" }, { - "bom-ref": "5fe69aba5115be90", + "bom-ref": "9abdf0dbad51ea58", "name": "/usr/share/vim/vim91/lang/menu_spanish_spain.850.vim", "type": "file" }, { - "bom-ref": "c3cf5762f501ee00", + "bom-ref": "8a0361f3adecffd0", "name": "/usr/share/vim/vim91/lang/menu_sr.utf-8.vim", "type": "file" }, { - "bom-ref": "d2c0ef259a1efcb1", + "bom-ref": "d66f18eb968dc3c5", "name": "/usr/share/vim/vim91/lang/menu_sr_rs.ascii.vim", "type": "file" }, { - "bom-ref": "9cef6a40f6e93d1f", + "bom-ref": "6f5275c8689d8053", "name": "/usr/share/vim/vim91/lang/menu_sr_rs.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "7064c0655e0d7016", + "bom-ref": "53587107ba6a88f6", "name": "/usr/share/vim/vim91/lang/menu_sr_rs.iso_8859-5.vim", "type": "file" }, { - "bom-ref": "87d075bf353f084f", + "bom-ref": "7845cba5a846c7c7", "name": "/usr/share/vim/vim91/lang/menu_sr_rs.utf-8.vim", "type": "file" }, { - "bom-ref": "c436922824caf8f8", + "bom-ref": "746f2424539ffb58", "name": "/usr/share/vim/vim91/lang/menu_sr_yu.ascii.vim", "type": "file" }, { - "bom-ref": "54f6bbea2037eaff", + "bom-ref": "e4514b5ab0cf53af", "name": "/usr/share/vim/vim91/lang/menu_sr_yu.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "61a8c395a2761b1e", + "bom-ref": "8f0e269683920c8e", "name": "/usr/share/vim/vim91/lang/menu_sr_yu.iso_8859-5.vim", "type": "file" }, { - "bom-ref": "79b9d5eb4dfd9c27", + "bom-ref": "2d40bb8e8655019b", "name": "/usr/share/vim/vim91/lang/menu_sr_yu.utf-8.vim", "type": "file" }, { - "bom-ref": "10cd7cf26f09d3ed", + "bom-ref": "e8defbc80923e351", "name": "/usr/share/vim/vim91/lang/menu_sv.latin1.vim", "type": "file" }, { - "bom-ref": "0885c523a67b22d6", + "bom-ref": "4d43ca91785fe4f2", "name": "/usr/share/vim/vim91/lang/menu_sv.utf-8.vim", "type": "file" }, { - "bom-ref": "9e43aaa07d50f081", + "bom-ref": "caea5670e8557899", "name": "/usr/share/vim/vim91/lang/menu_sv_se.latin1.vim", "type": "file" }, { - "bom-ref": "d93fd8575ef9a466", + "bom-ref": "4681c930e9613226", "name": "/usr/share/vim/vim91/lang/menu_sv_se.utf-8.vim", "type": "file" }, { - "bom-ref": "4db6593e2311d90e", + "bom-ref": "b65dc2af5a01075e", "name": "/usr/share/vim/vim91/lang/menu_tr.cp1254.vim", "type": "file" }, { - "bom-ref": "5cca05f7ddad183e", + "bom-ref": "53a754bd3d7417ce", "name": "/usr/share/vim/vim91/lang/menu_tr.iso_8859-9.vim", "type": "file" }, { - "bom-ref": "c70799ffa8d781fd", + "bom-ref": "7be761ad4c868599", "name": "/usr/share/vim/vim91/lang/menu_tr.utf-8.vim", "type": "file" }, { - "bom-ref": "6d12c9c054203cc1", + "bom-ref": "fd21dfe3c6ec3ec1", "name": "/usr/share/vim/vim91/lang/menu_tr_tr.cp1254.vim", "type": "file" }, { - "bom-ref": "4e44586bb4c24709", + "bom-ref": "322ccf03ce9ca21d", "name": "/usr/share/vim/vim91/lang/menu_tr_tr.iso_8859-9.vim", "type": "file" }, { - "bom-ref": "ae4ac9631c4c8d44", + "bom-ref": "dd12bf97649286a0", "name": "/usr/share/vim/vim91/lang/menu_tr_tr.utf-8.vim", "type": "file" }, { - "bom-ref": "98746e653167b79d", + "bom-ref": "346a2f6fd954decd", "name": "/usr/share/vim/vim91/lang/menu_uk_ua.cp1251.vim", "type": "file" }, { - "bom-ref": "4c57c50e0307f9bc", + "bom-ref": "55477434e86d4f44", "name": "/usr/share/vim/vim91/lang/menu_uk_ua.koi8-u.vim", "type": "file" }, { - "bom-ref": "651d4039594c768c", + "bom-ref": "6d3198e521f9fb9c", "name": "/usr/share/vim/vim91/lang/menu_uk_ua.utf-8.vim", "type": "file" }, { - "bom-ref": "7a06c18b19d0d9db", + "bom-ref": "1b4b4b11e7623b63", "name": "/usr/share/vim/vim91/lang/menu_vi_vn.vim", "type": "file" }, { - "bom-ref": "2f35261f9279b1b0", + "bom-ref": "699176b7cc9039ac", "name": "/usr/share/vim/vim91/lang/menu_zh.big5.vim", "type": "file" }, { - "bom-ref": "b6adc2f00b6f30a0", + "bom-ref": "d325854e7bb37610", "name": "/usr/share/vim/vim91/lang/menu_zh.cp936.vim", "type": "file" }, { - "bom-ref": "838e3d6174125fa9", + "bom-ref": "5bea70c5c40d9a35", "name": "/usr/share/vim/vim91/lang/menu_zh.cp950.vim", "type": "file" }, { - "bom-ref": "0b72d8880fb53ab4", + "bom-ref": "c01b5e7034578744", "name": "/usr/share/vim/vim91/lang/menu_zh.gb2312.vim", "type": "file" }, { - "bom-ref": "bd8f40e9fabe28d2", + "bom-ref": "622e4e21189d420a", "name": "/usr/share/vim/vim91/lang/menu_zh_cn.18030.vim", "type": "file" }, { - "bom-ref": "f26e6c088dc0ee4a", + "bom-ref": "893f22d454f7575a", "name": "/usr/share/vim/vim91/lang/menu_zh_cn.cp936.vim", "type": "file" }, { - "bom-ref": "5ec9702d5a7238a3", + "bom-ref": "207682f9c79ec847", "name": "/usr/share/vim/vim91/lang/menu_zh_cn.gb2312.vim", "type": "file" }, { - "bom-ref": "ee53aaf30c18019a", + "bom-ref": "1aed2ed1a44f1772", "name": "/usr/share/vim/vim91/lang/menu_zh_cn.gbk.vim", "type": "file" }, { - "bom-ref": "e5ce80a5400ed93b", + "bom-ref": "b904e99c2ff169b3", "name": "/usr/share/vim/vim91/lang/menu_zh_cn.utf-8.vim", "type": "file" }, { - "bom-ref": "01c0ec1318f52f5d", + "bom-ref": "f0caead3f9a81171", "name": "/usr/share/vim/vim91/lang/menu_zh_tw.big5.vim", "type": "file" }, { - "bom-ref": "fb08d0fbf0c62e4f", + "bom-ref": "97ea00d1d0ea4437", "name": "/usr/share/vim/vim91/lang/menu_zh_tw.cp950.vim", "type": "file" }, { - "bom-ref": "fb1b055ff29388a5", + "bom-ref": "4d5ec25d2dbb9c2d", "name": "/usr/share/vim/vim91/lang/menu_zh_tw.utf-8.vim", "type": "file" }, { - "bom-ref": "d7acdd3dafff9dfc", + "bom-ref": "ecf9e17db2370f6c", "name": "/usr/share/vim/vim91/lang/nb/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "4dea2b0ebd3eee73", + "bom-ref": "b332119a0c50d01b", "name": "/usr/share/vim/vim91/lang/nl/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "cc2d3a84807758c3", + "bom-ref": "ee24c0cd3aad515f", "name": "/usr/share/vim/vim91/lang/no/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "e10f73a84ebd3d9c", + "bom-ref": "048bdaa5780af6f0", "name": "/usr/share/vim/vim91/lang/pl.UTF-8/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "9afbf0d1e2414ba4", + "bom-ref": "a11ea7604fcf5c00", "name": "/usr/share/vim/vim91/lang/pl.cp1250/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "67f9c2fe3650628c", + "bom-ref": "50dbc8db1a675de8", "name": "/usr/share/vim/vim91/lang/pl/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "8bb14628f6a6dbc1", + "bom-ref": "e32a5e1eb78f48b1", "name": "/usr/share/vim/vim91/lang/pt_BR/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "bb0944ec3a6ff4b2", + "bom-ref": "1ae5d1b937e5099a", "name": "/usr/share/vim/vim91/lang/ru.cp1251/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "f2cd2e1ab9b17bbc", + "bom-ref": "08e6b9c0ab48f0dc", "name": "/usr/share/vim/vim91/lang/ru/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "6186915b8d1896fd", + "bom-ref": "d700d86bb04f9db5", "name": "/usr/share/vim/vim91/lang/sk.cp1250/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "e71c5135c032fab7", + "bom-ref": "501f59dcd0930d67", "name": "/usr/share/vim/vim91/lang/sk/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "506e6ceffdd26e1b", + "bom-ref": "39669fb77670ae3b", "name": "/usr/share/vim/vim91/lang/sr/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "08de361717045ef3", + "bom-ref": "0b2f521e096fe5fb", "name": "/usr/share/vim/vim91/lang/sv/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "e29127ad18c5222f", + "bom-ref": "502ba0783300f33f", "name": "/usr/share/vim/vim91/lang/tr/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "48dac84709052db2", + "bom-ref": "0b1e2f2d54cf43da", "name": "/usr/share/vim/vim91/lang/uk.cp1251/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "f23d687c17b455fd", + "bom-ref": "a37a5be0afedab25", "name": "/usr/share/vim/vim91/lang/uk/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "f391da5cc715f246", + "bom-ref": "63501740863e5f72", "name": "/usr/share/vim/vim91/lang/vi/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "68ce5e37c1d58f3b", + "bom-ref": "3394787e0939ad2b", "name": "/usr/share/vim/vim91/lang/zh_CN.UTF-8/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "da4ef5a7ac2eeeae", + "bom-ref": "65e019b82f8ef9d2", "name": "/usr/share/vim/vim91/lang/zh_CN.cp936/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "d26dcaf88082d6ff", + "bom-ref": "5eb2a110636aca4b", "name": "/usr/share/vim/vim91/lang/zh_CN/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "2c90569fd201e22c", + "bom-ref": "293ee938160f9fe0", "name": "/usr/share/vim/vim91/lang/zh_TW.UTF-8/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "d329b3d13d2f1f12", + "bom-ref": "db6660bfc6c4d256", "name": "/usr/share/vim/vim91/lang/zh_TW/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "4b10c2d724ab5d4f", + "bom-ref": "38ef009117f6ee17", "name": "/usr/share/vim/vim91/macros/editexisting.vim", "type": "file" }, { - "bom-ref": "475af660057f0791", + "bom-ref": "1528f0a5a7c3271d", "name": "/usr/share/vim/vim91/macros/hanoi/click.me", "type": "file" }, { - "bom-ref": "8bd5d414fc46e8e6", + "bom-ref": "c65b66b18c660dda", "name": "/usr/share/vim/vim91/macros/hanoi/hanoi.vim", "type": "file" }, { - "bom-ref": "93dd10ce67e4abba", + "bom-ref": "707c18aba101e24e", "name": "/usr/share/vim/vim91/macros/hanoi/poster", "type": "file" }, { - "bom-ref": "4a0261261a1ebcab", + "bom-ref": "c54ae9b2e51c7f63", "name": "/usr/share/vim/vim91/macros/justify.vim", "type": "file" }, { - "bom-ref": "da39554584a14a40", + "bom-ref": "6c1d73bfad531a74", "name": "/usr/share/vim/vim91/macros/less.bat", "type": "file" }, { - "bom-ref": "bfbfda207824a9d6", + "bom-ref": "2310caa0f095907a", "name": "/usr/share/vim/vim91/macros/less.sh", "type": "file" }, { - "bom-ref": "c47f8cbd4a7173b7", + "bom-ref": "81183d80e0ea67bf", "name": "/usr/share/vim/vim91/macros/less.vim", "type": "file" }, { - "bom-ref": "cc9a8b57b83f5761", + "bom-ref": "7624da1ee04bff99", "name": "/usr/share/vim/vim91/macros/life/click.me", "type": "file" }, { - "bom-ref": "ed6da13383e1ef62", + "bom-ref": "556ff8e650aed0e2", "name": "/usr/share/vim/vim91/macros/life/life.vim", "type": "file" }, { - "bom-ref": "5039549e56caf40a", + "bom-ref": "17cffe7d43b2c34e", "name": "/usr/share/vim/vim91/macros/matchit.vim", "type": "file" }, { - "bom-ref": "62ae83219250b06a", + "bom-ref": "5b4a4a54b16509f2", "name": "/usr/share/vim/vim91/macros/maze/Makefile", "type": "file" }, { - "bom-ref": "3cd313f153bce284", + "bom-ref": "5892e56361add0a8", "name": "/usr/share/vim/vim91/macros/maze/maze.c", "type": "file" }, { - "bom-ref": "0d9295cccb41c284", + "bom-ref": "1210b183b002b914", "name": "/usr/share/vim/vim91/macros/maze/maze_5.78", "type": "file" }, { - "bom-ref": "ee4f89c930708a06", + "bom-ref": "26660938011623e6", "name": "/usr/share/vim/vim91/macros/maze/maze_mac", "type": "file" }, { - "bom-ref": "1f6599cbf4beee6c", + "bom-ref": "d28e529faf0b7738", "name": "/usr/share/vim/vim91/macros/maze/mazeansi.c", "type": "file" }, { - "bom-ref": "5e8837607eee7fd1", + "bom-ref": "1ba40dc2af7a9d45", "name": "/usr/share/vim/vim91/macros/maze/mazeclean.c", "type": "file" }, { - "bom-ref": "17d302b935db411d", + "bom-ref": "f0a0338fe7f51989", "name": "/usr/share/vim/vim91/macros/maze/poster", "type": "file" }, { - "bom-ref": "14ffda9a85530bfd", + "bom-ref": "a0eb3129e0abe275", "name": "/usr/share/vim/vim91/macros/shellmenu.vim", "type": "file" }, { - "bom-ref": "7d134382266e4d37", + "bom-ref": "7daf82c2a9427eff", "name": "/usr/share/vim/vim91/macros/swapmous.vim", "type": "file" }, { - "bom-ref": "64e248eb78d6a05f", + "bom-ref": "f885c4fac966be8f", "name": "/usr/share/vim/vim91/macros/urm/examples", "type": "file" }, { - "bom-ref": "2ee79149270c0bca", + "bom-ref": "c5fe7c866b0838ee", "name": "/usr/share/vim/vim91/macros/urm/urm", "type": "file" }, { - "bom-ref": "d15f8ef7575f5325", + "bom-ref": "f73d1b00e48c8065", "name": "/usr/share/vim/vim91/macros/urm/urm.vim", "type": "file" }, { - "bom-ref": "77fbd04cdf34c288", + "bom-ref": "bdde01973554a30c", "name": "/usr/share/vim/vim91/menu.vim", "type": "file" }, { - "bom-ref": "74cc88c77c1a80ac", + "bom-ref": "e467966304bcaa0c", "name": "/usr/share/vim/vim91/mswin.vim", "type": "file" }, { - "bom-ref": "9c522861133c4f73", + "bom-ref": "d19bd85353a9d7df", "name": "/usr/share/vim/vim91/optwin.vim", "type": "file" }, { - "bom-ref": "151e8b7cffa4e287", + "bom-ref": "004dcc773d547a53", "name": "/usr/share/vim/vim91/pack/dist/opt/cfilter/plugin/cfilter.vim", "type": "file" }, { - "bom-ref": "9513cf425ece98cc", + "bom-ref": "c52b3cecad4bad8c", "name": "/usr/share/vim/vim91/pack/dist/opt/dvorak/dvorak/disable.vim", "type": "file" }, { - "bom-ref": "54435bde4511b81a", + "bom-ref": "c8dffb78aab46226", "name": "/usr/share/vim/vim91/pack/dist/opt/dvorak/dvorak/enable.vim", "type": "file" }, { - "bom-ref": "4257148b15ff7246", + "bom-ref": "c282986274eb6fba", "name": "/usr/share/vim/vim91/pack/dist/opt/dvorak/plugin/dvorak.vim", "type": "file" }, { - "bom-ref": "7bcf15712daa8ee5", + "bom-ref": "d7fbf7064119c2e9", "name": "/usr/share/vim/vim91/pack/dist/opt/editexisting/plugin/editexisting.vim", "type": "file" }, { - "bom-ref": "6715d5dec064168f", + "bom-ref": "61f15f87d80882ff", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/.editorconfig", "type": "file" }, { - "bom-ref": "791b6f1772defc2b", + "bom-ref": "75e59a1f4812a8cb", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/CONTRIBUTORS", "type": "file" }, { - "bom-ref": "47965e698e130280", + "bom-ref": "1366e25ed8523d60", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/LICENSE", "type": "file" }, { - "bom-ref": "fc4405e6c4e3f90f", + "bom-ref": "4a5f2bb27d49738f", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/LICENSE.PSF", "type": "file" }, { - "bom-ref": "3b6b5277c554f2b7", + "bom-ref": "bb55627986ceca4b", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/README.md", "type": "file" }, { - "bom-ref": "9b6b74c7cc10dd7f", + "bom-ref": "3acc8321cedf4453", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig.vim", "type": "file" }, { - "bom-ref": "39f5fe9ab8fb5bad", + "bom-ref": "8bb16de9b5e623a5", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig_core.vim", "type": "file" }, { - "bom-ref": "1ffb30e32cbaa713", + "bom-ref": "0fc4df33ed30ac9f", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig_core/fnmatch.vim", "type": "file" }, { - "bom-ref": "14a92d0543db8462", + "bom-ref": "f9eedb17680cd6a6", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig_core/handler.vim", "type": "file" }, { - "bom-ref": "cf422f6fc2b3d272", + "bom-ref": "2570fa74c0bd2e2e", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig_core/ini.vim", "type": "file" }, { - "bom-ref": "e2c46e63d98839b1", + "bom-ref": "b66e47472e243321", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig_core/util.vim", "type": "file" }, { - "bom-ref": "c98ff79b78f6fdee", + "bom-ref": "2054fb2ab5afd3ce", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/doc/editorconfig.txt", "type": "file" }, { - "bom-ref": "ac48925dbcd970fa", + "bom-ref": "4a845f5221ceb372", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/doc/tags", "type": "file" }, { - "bom-ref": "c65049148f04e736", + "bom-ref": "55bb9aacc1fa4586", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/ftdetect/editorconfig.vim", "type": "file" }, { - "bom-ref": "bc4c4844b4de96e3", + "bom-ref": "4e4c3dddb52e38cf", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/mkzip.sh", "type": "file" }, { - "bom-ref": "f98d2e70f4d0b271", + "bom-ref": "747e34ce4c939eb1", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/plugin/editorconfig.vim", "type": "file" }, { - "bom-ref": "a9c6c0ff32306ae0", + "bom-ref": "9ecfcdd12580e510", "name": "/usr/share/vim/vim91/pack/dist/opt/justify/plugin/justify.vim", "type": "file" }, { - "bom-ref": "92224d0710e80055", + "bom-ref": "d07251ed4ce1dc15", "name": "/usr/share/vim/vim91/pack/dist/opt/matchit/autoload/matchit.vim", "type": "file" }, { - "bom-ref": "6f6b687ba8d83893", + "bom-ref": "50bb78599c3b865f", "name": "/usr/share/vim/vim91/pack/dist/opt/matchit/doc/matchit.txt", "type": "file" }, { - "bom-ref": "7912844bf60d5d1b", + "bom-ref": "dd6df91e4b6b41eb", "name": "/usr/share/vim/vim91/pack/dist/opt/matchit/doc/tags", "type": "file" }, { - "bom-ref": "472a52520c10bc7b", + "bom-ref": "bb7c4cb6832b5b3f", "name": "/usr/share/vim/vim91/pack/dist/opt/matchit/plugin/matchit.vim", "type": "file" }, { - "bom-ref": "2122a9a81bcd6b81", + "bom-ref": "3c5afe41c7e97245", "name": "/usr/share/vim/vim91/pack/dist/opt/shellmenu/plugin/shellmenu.vim", "type": "file" }, { - "bom-ref": "e02138e86e799540", + "bom-ref": "fbf0005f22efb9f0", "name": "/usr/share/vim/vim91/pack/dist/opt/swapmouse/plugin/swapmouse.vim", "type": "file" }, { - "bom-ref": "c3ec1a1f3573193e", + "bom-ref": "621ae32f26a199ee", "name": "/usr/share/vim/vim91/pack/dist/opt/termdebug/plugin/termdebug.vim", "type": "file" }, { - "bom-ref": "b4053dce80eb9e6b", + "bom-ref": "7410e4b5c80f1503", "name": "/usr/share/vim/vim91/plugin/getscriptPlugin.vim", "type": "file" }, { - "bom-ref": "a893bd1c897c0212", + "bom-ref": "1a4ef4154e05ea32", "name": "/usr/share/vim/vim91/plugin/gzip.vim", "type": "file" }, { - "bom-ref": "3676831f35afed60", + "bom-ref": "224b1b583a95ee20", "name": "/usr/share/vim/vim91/plugin/logiPat.vim", "type": "file" }, { - "bom-ref": "912eeb4e1da1e6c3", + "bom-ref": "27402cad869b0b43", "name": "/usr/share/vim/vim91/plugin/manpager.vim", "type": "file" }, { - "bom-ref": "00dc3f8f597ed34b", + "bom-ref": "e8e5ae48f39cfb2f", "name": "/usr/share/vim/vim91/plugin/matchparen.vim", "type": "file" }, { - "bom-ref": "663f68511d801b54", + "bom-ref": "404b4d93ba2cdccc", "name": "/usr/share/vim/vim91/plugin/netrwPlugin.vim", "type": "file" }, { - "bom-ref": "e5c557212734b210", + "bom-ref": "095c349e94096328", "name": "/usr/share/vim/vim91/plugin/rrhelper.vim", "type": "file" }, { - "bom-ref": "b5c4c2c6047bbd8e", + "bom-ref": "3caf34f65c2032da", "name": "/usr/share/vim/vim91/plugin/spellfile.vim", "type": "file" }, { - "bom-ref": "ccf85b33ac143ea5", + "bom-ref": "c2af6641816fe32d", "name": "/usr/share/vim/vim91/plugin/tarPlugin.vim", "type": "file" }, { - "bom-ref": "abe1750b0bcb3d14", + "bom-ref": "0c7cae26b1aab58c", "name": "/usr/share/vim/vim91/plugin/tohtml.vim", "type": "file" }, { - "bom-ref": "7aa695ad3a2c955f", + "bom-ref": "3fac85e76eaa2ddf", "name": "/usr/share/vim/vim91/plugin/vimballPlugin.vim", "type": "file" }, { - "bom-ref": "140274dbc4035845", + "bom-ref": "02eca8c2d0bb7ea9", "name": "/usr/share/vim/vim91/plugin/zipPlugin.vim", "type": "file" }, { - "bom-ref": "25e170ae9195a1ca", + "bom-ref": "5c2cdca7791ebc82", "name": "/usr/share/vim/vim91/print/ascii.ps", "type": "file" }, { - "bom-ref": "c049b5e2add502dd", + "bom-ref": "8541069f58750859", "name": "/usr/share/vim/vim91/print/cidfont.ps", "type": "file" }, { - "bom-ref": "940ea2ae32dbc05a", + "bom-ref": "9601ec96609b3d6e", "name": "/usr/share/vim/vim91/print/cns_roman.ps", "type": "file" }, { - "bom-ref": "d02e7d1ca186fa08", + "bom-ref": "5af859bc65b8cf84", "name": "/usr/share/vim/vim91/print/cp1250.ps", "type": "file" }, { - "bom-ref": "f012087cd631dfb2", + "bom-ref": "40152105bef42886", "name": "/usr/share/vim/vim91/print/cp1251.ps", "type": "file" }, { - "bom-ref": "97618f760091474f", + "bom-ref": "96833a32169f277f", "name": "/usr/share/vim/vim91/print/cp1252.ps", "type": "file" }, { - "bom-ref": "06ac3d0b4a4f24fa", + "bom-ref": "2c9fb01d47fe51de", "name": "/usr/share/vim/vim91/print/cp1253.ps", "type": "file" }, { - "bom-ref": "bcf38939b48cd7fc", + "bom-ref": "7c0d5871d0d5e2f8", "name": "/usr/share/vim/vim91/print/cp1254.ps", "type": "file" }, { - "bom-ref": "713f7a4f51844152", + "bom-ref": "26e209b62848eb56", "name": "/usr/share/vim/vim91/print/cp1255.ps", "type": "file" }, { - "bom-ref": "f8b21c5ed733ca7b", + "bom-ref": "2d3e77a89ec176c7", "name": "/usr/share/vim/vim91/print/cp1257.ps", "type": "file" }, { - "bom-ref": "cc2154abb646b47b", + "bom-ref": "62646e26e29d253b", "name": "/usr/share/vim/vim91/print/dec-mcs.ps", "type": "file" }, { - "bom-ref": "ec1ee1150ec6ccf5", + "bom-ref": "2816eac3ae98ca7d", "name": "/usr/share/vim/vim91/print/ebcdic-uk.ps", "type": "file" }, { - "bom-ref": "c28fe0d0cb6ecae9", + "bom-ref": "05852ddb9299cd79", "name": "/usr/share/vim/vim91/print/gb_roman.ps", "type": "file" }, { - "bom-ref": "718a7831feb9ca50", + "bom-ref": "b6f2cd5d3d5e4724", "name": "/usr/share/vim/vim91/print/hp-roman8.ps", "type": "file" }, { - "bom-ref": "b678c033cdcf2c9b", + "bom-ref": "0d61189f8248c297", "name": "/usr/share/vim/vim91/print/iso-8859-10.ps", "type": "file" }, { - "bom-ref": "af7a0d09b7d87430", + "bom-ref": "ba2b5dc2ffd8e3a8", "name": "/usr/share/vim/vim91/print/iso-8859-11.ps", "type": "file" }, { - "bom-ref": "cc4a04b3873bd622", + "bom-ref": "87bd9ecbcc3de0ea", "name": "/usr/share/vim/vim91/print/iso-8859-13.ps", "type": "file" }, { - "bom-ref": "1a41444e8db2c512", + "bom-ref": "06e9f688e42fdcb6", "name": "/usr/share/vim/vim91/print/iso-8859-14.ps", "type": "file" }, { - "bom-ref": "082663e91832115f", + "bom-ref": "f109403819f9ffcb", "name": "/usr/share/vim/vim91/print/iso-8859-15.ps", "type": "file" }, { - "bom-ref": "543b742d47346cb1", + "bom-ref": "3c460fa62ebdd4bd", "name": "/usr/share/vim/vim91/print/iso-8859-2.ps", "type": "file" }, { - "bom-ref": "201ffa4726e405a8", + "bom-ref": "8e7ea1ba39b418ec", "name": "/usr/share/vim/vim91/print/iso-8859-3.ps", "type": "file" }, { - "bom-ref": "2bfe8659d991299e", + "bom-ref": "d83471b1eea3e5c6", "name": "/usr/share/vim/vim91/print/iso-8859-4.ps", "type": "file" }, { - "bom-ref": "8aec095a7fab8a91", + "bom-ref": "a1c9e147c10eb035", "name": "/usr/share/vim/vim91/print/iso-8859-5.ps", "type": "file" }, { - "bom-ref": "ad05e8539b33118d", + "bom-ref": "349df8f2ae444cc1", "name": "/usr/share/vim/vim91/print/iso-8859-7.ps", "type": "file" }, { - "bom-ref": "bb623bf712866ef8", + "bom-ref": "08470f2933f0392c", "name": "/usr/share/vim/vim91/print/iso-8859-8.ps", "type": "file" }, { - "bom-ref": "7be989c86bcb0b0e", + "bom-ref": "4cbe5e5a2c09e7d6", "name": "/usr/share/vim/vim91/print/iso-8859-9.ps", "type": "file" }, { - "bom-ref": "4e301de4b1140a4d", + "bom-ref": "7c91303f04448f85", "name": "/usr/share/vim/vim91/print/jis_roman.ps", "type": "file" }, { - "bom-ref": "ae281c5fe41d53b1", + "bom-ref": "bcacc72b4f3835e5", "name": "/usr/share/vim/vim91/print/koi8-r.ps", "type": "file" }, { - "bom-ref": "df62423b25b4994c", + "bom-ref": "8ea279b8c641bd00", "name": "/usr/share/vim/vim91/print/koi8-u.ps", "type": "file" }, { - "bom-ref": "849a1c0b3a82e218", + "bom-ref": "c8ba4a555582b684", "name": "/usr/share/vim/vim91/print/ks_roman.ps", "type": "file" }, { - "bom-ref": "d42f2ca29508dc17", + "bom-ref": "e01d6f1175d3ace7", "name": "/usr/share/vim/vim91/print/latin1.ps", "type": "file" }, { - "bom-ref": "c4740e1b82628530", + "bom-ref": "b35bd36f21991b90", "name": "/usr/share/vim/vim91/print/mac-roman.ps", "type": "file" }, { - "bom-ref": "3f98711d6f49327d", + "bom-ref": "fc2141d7e449e575", "name": "/usr/share/vim/vim91/print/prolog.ps", "type": "file" }, { - "bom-ref": "4a5d4c54f5ce4b28", + "bom-ref": "aea035ea19e3638c", "name": "/usr/share/vim/vim91/scripts.vim", "type": "file" }, { - "bom-ref": "19c81ebc6778b806", + "bom-ref": "b11b546821b81bea", "name": "/usr/share/vim/vim91/spell/check_locales.vim", "type": "file" }, { - "bom-ref": "04f4d40e7f6eaed6", + "bom-ref": "b8654c404467c39e", "name": "/usr/share/vim/vim91/spell/cleanadd.vim", "type": "file" }, { - "bom-ref": "8174b34722dea96a", + "bom-ref": "eb0ea65647667bfe", "name": "/usr/share/vim/vim91/spell/en.ascii.spl", "type": "file" }, { - "bom-ref": "7e5d103b4fb15d5e", + "bom-ref": "cee2283a5203bb3a", "name": "/usr/share/vim/vim91/spell/en.ascii.sug", "type": "file" }, { - "bom-ref": "bb6edae72eb98998", + "bom-ref": "c9ec9f4444bac780", "name": "/usr/share/vim/vim91/spell/en.latin1.spl", "type": "file" }, { - "bom-ref": "87f63e3e2bc3ca5c", + "bom-ref": "5ec67c6f20423c2c", "name": "/usr/share/vim/vim91/spell/en.latin1.sug", "type": "file" }, { - "bom-ref": "eba1ffb3f347900a", + "bom-ref": "6eefe4fddd7c0e32", "name": "/usr/share/vim/vim91/spell/en.utf-8.spl", "type": "file" }, { - "bom-ref": "fec5be1ceed3dd18", + "bom-ref": "c8e5cad1061ea318", "name": "/usr/share/vim/vim91/spell/en.utf-8.sug", "type": "file" }, { - "bom-ref": "e98bddc096c88245", + "bom-ref": "99ac7b29b2980245", "name": "/usr/share/vim/vim91/spell/fixdup.vim", "type": "file" }, { - "bom-ref": "e411fa76f564a859", + "bom-ref": "c8a39a4d12532d6d", "name": "/usr/share/vim/vim91/spell/he.vim", "type": "file" }, { - "bom-ref": "13a75d0bcf5780d4", + "bom-ref": "8cb6ac3320ad8884", "name": "/usr/share/vim/vim91/spell/spell.vim", "type": "file" }, { - "bom-ref": "481c4c18316bb697", + "bom-ref": "f29b667f15a20ebf", "name": "/usr/share/vim/vim91/spell/yi.vim", "type": "file" }, { - "bom-ref": "764ca20e632cfb95", + "bom-ref": "843d841351cac599", "name": "/usr/share/vim/vim91/synmenu.vim", "type": "file" }, { - "bom-ref": "0f94acdfdb38585e", + "bom-ref": "f5fe5d89570162c2", "name": "/usr/share/vim/vim91/syntax/2html.vim", "type": "file" }, { - "bom-ref": "b7255a4a5246982b", + "bom-ref": "b5c3cfc123fbf497", "name": "/usr/share/vim/vim91/syntax/8th.vim", "type": "file" }, { - "bom-ref": "c550d090f040db8f", + "bom-ref": "5e25d03d3468c987", "name": "/usr/share/vim/vim91/syntax/a2ps.vim", "type": "file" }, { - "bom-ref": "468c0b72cb6347a1", + "bom-ref": "406c48b1b132bce5", "name": "/usr/share/vim/vim91/syntax/a65.vim", "type": "file" }, { - "bom-ref": "9da8aebd558621f9", + "bom-ref": "7814e492adf2340d", "name": "/usr/share/vim/vim91/syntax/aap.vim", "type": "file" }, { - "bom-ref": "b265eb5c4e429be4", + "bom-ref": "45dfa1ae8879590c", "name": "/usr/share/vim/vim91/syntax/abap.vim", "type": "file" }, { - "bom-ref": "0464ada3ee14e6dd", + "bom-ref": "0c9f30b96f012f85", "name": "/usr/share/vim/vim91/syntax/abaqus.vim", "type": "file" }, { - "bom-ref": "8d30d958f4641feb", + "bom-ref": "0441eb000613c0cb", "name": "/usr/share/vim/vim91/syntax/abc.vim", "type": "file" }, { - "bom-ref": "4b317f4d2b2d821c", + "bom-ref": "6f6f1bf79ba12554", "name": "/usr/share/vim/vim91/syntax/abel.vim", "type": "file" }, { - "bom-ref": "773370fd5c4e62e0", + "bom-ref": "f4c361fa41f988f8", "name": "/usr/share/vim/vim91/syntax/acedb.vim", "type": "file" }, { - "bom-ref": "ce2e1789e0e95d57", + "bom-ref": "cb8b1092afab1523", "name": "/usr/share/vim/vim91/syntax/ada.vim", "type": "file" }, { - "bom-ref": "0c51d15754f92ba6", + "bom-ref": "6215a5c67b29ab46", "name": "/usr/share/vim/vim91/syntax/aflex.vim", "type": "file" }, { - "bom-ref": "fa830176e6da8ae9", + "bom-ref": "40f0a5a042d03699", "name": "/usr/share/vim/vim91/syntax/ahdl.vim", "type": "file" }, { - "bom-ref": "9f31c1a627e93624", + "bom-ref": "2ffbbbe8fed986c4", "name": "/usr/share/vim/vim91/syntax/aidl.vim", "type": "file" }, { - "bom-ref": "7c322defdf41d0c7", + "bom-ref": "1301d64bd5764efb", "name": "/usr/share/vim/vim91/syntax/alsaconf.vim", "type": "file" }, { - "bom-ref": "5a5647e0fd7a5abf", + "bom-ref": "cdc3f0ce6f1d85eb", "name": "/usr/share/vim/vim91/syntax/amiga.vim", "type": "file" }, { - "bom-ref": "4999825520f9cef6", + "bom-ref": "442838cbc50d9006", "name": "/usr/share/vim/vim91/syntax/aml.vim", "type": "file" }, { - "bom-ref": "ddb801cee40e447b", + "bom-ref": "1fc01a0ae1af134f", "name": "/usr/share/vim/vim91/syntax/ampl.vim", "type": "file" }, { - "bom-ref": "535470c8108dcb25", + "bom-ref": "c05d72777f58a679", "name": "/usr/share/vim/vim91/syntax/ant.vim", "type": "file" }, { - "bom-ref": "e70d0e1b80db5a47", + "bom-ref": "8f7a037ab2c6ea67", "name": "/usr/share/vim/vim91/syntax/antlr.vim", "type": "file" }, { - "bom-ref": "1553318b954b996f", + "bom-ref": "3515696d63bb77ab", "name": "/usr/share/vim/vim91/syntax/apache.vim", "type": "file" }, { - "bom-ref": "99c7439241efdc5b", + "bom-ref": "d82987bf830fe5bf", "name": "/usr/share/vim/vim91/syntax/apachestyle.vim", "type": "file" }, { - "bom-ref": "1d4653cfa6f84f83", + "bom-ref": "f58b4e7e94e8640f", "name": "/usr/share/vim/vim91/syntax/aptconf.vim", "type": "file" }, { - "bom-ref": "3c8e0911c8984b0f", + "bom-ref": "e6e7e510f9144867", "name": "/usr/share/vim/vim91/syntax/arch.vim", "type": "file" }, { - "bom-ref": "daa1132297a7992d", + "bom-ref": "607be56e678114b1", "name": "/usr/share/vim/vim91/syntax/arduino.vim", "type": "file" }, { - "bom-ref": "2f5622a30f29a9d4", + "bom-ref": "8791500fdafd4d80", "name": "/usr/share/vim/vim91/syntax/art.vim", "type": "file" }, { - "bom-ref": "bdf3a1de0689bbb3", + "bom-ref": "48b1b41d4a6abb53", "name": "/usr/share/vim/vim91/syntax/asciidoc.vim", "type": "file" }, { - "bom-ref": "caeea8f7ad53b804", + "bom-ref": "d275a9351ca4c8a4", "name": "/usr/share/vim/vim91/syntax/asm.vim", "type": "file" }, { - "bom-ref": "098fd5cfa3c8dd72", + "bom-ref": "799812d1124aaa1a", "name": "/usr/share/vim/vim91/syntax/asm68k.vim", "type": "file" }, { - "bom-ref": "4e12222832415833", + "bom-ref": "c1ec3340a92d94af", "name": "/usr/share/vim/vim91/syntax/asmh8300.vim", "type": "file" }, { - "bom-ref": "31358617d789fb9d", + "bom-ref": "61016c133fb66045", "name": "/usr/share/vim/vim91/syntax/asn.vim", "type": "file" }, { - "bom-ref": "5ac95de8b7c245ce", + "bom-ref": "51ec81b48885176e", "name": "/usr/share/vim/vim91/syntax/aspperl.vim", "type": "file" }, { - "bom-ref": "25ddb747d712a2d6", + "bom-ref": "37be2fe3330995c6", "name": "/usr/share/vim/vim91/syntax/aspvbs.vim", "type": "file" }, { - "bom-ref": "571aea93d4d3e936", + "bom-ref": "031651bfc7b381a6", "name": "/usr/share/vim/vim91/syntax/asterisk.vim", "type": "file" }, { - "bom-ref": "e2f1221ab08f1286", + "bom-ref": "1d044d43e5ba88a2", "name": "/usr/share/vim/vim91/syntax/asteriskvm.vim", "type": "file" }, { - "bom-ref": "fd08ff3372903fe3", + "bom-ref": "9331472428fccacb", "name": "/usr/share/vim/vim91/syntax/atlas.vim", "type": "file" }, { - "bom-ref": "dbaadc11fffb1c03", + "bom-ref": "20cdcbd592655403", "name": "/usr/share/vim/vim91/syntax/autodoc.vim", "type": "file" }, { - "bom-ref": "f2fad4b2ee7745f8", + "bom-ref": "6521568101d21a00", "name": "/usr/share/vim/vim91/syntax/autohotkey.vim", "type": "file" }, { - "bom-ref": "071f964e853752a6", + "bom-ref": "4c9e4ab8bd45e466", "name": "/usr/share/vim/vim91/syntax/autoit.vim", "type": "file" }, { - "bom-ref": "ef9c72003e3ad4b7", + "bom-ref": "19c58289abea2b6f", "name": "/usr/share/vim/vim91/syntax/automake.vim", "type": "file" }, { - "bom-ref": "139d3d3649e7b281", + "bom-ref": "da6e82e6d8531315", "name": "/usr/share/vim/vim91/syntax/ave.vim", "type": "file" }, { - "bom-ref": "888050bab5df27e0", + "bom-ref": "409dc565e3abb86c", "name": "/usr/share/vim/vim91/syntax/avra.vim", "type": "file" }, { - "bom-ref": "f607e8635d236ac8", + "bom-ref": "93e41badd711cce4", "name": "/usr/share/vim/vim91/syntax/awk.vim", "type": "file" }, { - "bom-ref": "196f1587c41a9912", + "bom-ref": "c067fae5c2a4677e", "name": "/usr/share/vim/vim91/syntax/ayacc.vim", "type": "file" }, { - "bom-ref": "8c8320d1bedcd103", + "bom-ref": "98d151d41fc4e03f", "name": "/usr/share/vim/vim91/syntax/b.vim", "type": "file" }, { - "bom-ref": "19ec410f3ea9a4e9", + "bom-ref": "8f7ad29069da0e99", "name": "/usr/share/vim/vim91/syntax/baan.vim", "type": "file" }, { - "bom-ref": "6072d3ca53785799", + "bom-ref": "d32d2d612c98ebed", "name": "/usr/share/vim/vim91/syntax/bash.vim", "type": "file" }, { - "bom-ref": "9ccf89d40e844b4a", + "bom-ref": "9c549f27d2130f46", "name": "/usr/share/vim/vim91/syntax/basic.vim", "type": "file" }, { - "bom-ref": "f3b6eb0dddd8ab0f", + "bom-ref": "eb325a74fe1eecc7", "name": "/usr/share/vim/vim91/syntax/bc.vim", "type": "file" }, { - "bom-ref": "170b10214ac38e25", + "bom-ref": "77229bd60e31757d", "name": "/usr/share/vim/vim91/syntax/bdf.vim", "type": "file" }, { - "bom-ref": "c486c7a8f4b91968", + "bom-ref": "4df9a4eb72b2d4b8", "name": "/usr/share/vim/vim91/syntax/bib.vim", "type": "file" }, { - "bom-ref": "8d210c3f20b3842a", + "bom-ref": "3ffb3fce57268156", "name": "/usr/share/vim/vim91/syntax/bindzone.vim", "type": "file" }, { - "bom-ref": "8b438a964a1440b9", + "bom-ref": "c2a75f914d5d4c31", "name": "/usr/share/vim/vim91/syntax/bitbake.vim", "type": "file" }, { - "bom-ref": "3ceba6c56c403f8f", + "bom-ref": "e613b282a4cc4e47", "name": "/usr/share/vim/vim91/syntax/blank.vim", "type": "file" }, { - "bom-ref": "af25785ded4e22e7", + "bom-ref": "3c6ab1875a7cf8a3", "name": "/usr/share/vim/vim91/syntax/bsdl.vim", "type": "file" }, { - "bom-ref": "ccb8c7b599495e61", + "bom-ref": "d078b79f20e2b5fd", "name": "/usr/share/vim/vim91/syntax/bst.vim", "type": "file" }, { - "bom-ref": "f7451f0b056eedd3", + "bom-ref": "01dbbd8ce8d37533", "name": "/usr/share/vim/vim91/syntax/btm.vim", "type": "file" }, { - "bom-ref": "38c29aea5ea62e4d", + "bom-ref": "7eeba6b6304e9f4d", "name": "/usr/share/vim/vim91/syntax/bzl.vim", "type": "file" }, { - "bom-ref": "b5021ea62cd89966", + "bom-ref": "b674e3de3b0fca42", "name": "/usr/share/vim/vim91/syntax/bzr.vim", "type": "file" }, { - "bom-ref": "0debc541cd5cee25", + "bom-ref": "b544357c844b035d", "name": "/usr/share/vim/vim91/syntax/c.vim", "type": "file" }, { - "bom-ref": "623a092ef4bdaae2", + "bom-ref": "29d9dc2aa991ddba", "name": "/usr/share/vim/vim91/syntax/cabal.vim", "type": "file" }, { - "bom-ref": "5305b90103795d49", + "bom-ref": "b58f24b07c1e0181", "name": "/usr/share/vim/vim91/syntax/cabalconfig.vim", "type": "file" }, { - "bom-ref": "0faa396ff8bea953", + "bom-ref": "b5398cd40ac13c0f", "name": "/usr/share/vim/vim91/syntax/cabalproject.vim", "type": "file" }, { - "bom-ref": "df59e6ca8a7c3a16", + "bom-ref": "83ee08525526ad76", "name": "/usr/share/vim/vim91/syntax/calendar.vim", "type": "file" }, { - "bom-ref": "f74a5d976adf2f40", + "bom-ref": "0be2d74e5ad3e230", "name": "/usr/share/vim/vim91/syntax/catalog.vim", "type": "file" }, { - "bom-ref": "a9caba4441b7b8c6", + "bom-ref": "f0d1a38b0bb60bc2", "name": "/usr/share/vim/vim91/syntax/cdl.vim", "type": "file" }, { - "bom-ref": "5bb301b9d244c3e4", + "bom-ref": "e33ff0901ee08080", "name": "/usr/share/vim/vim91/syntax/cdrdaoconf.vim", "type": "file" }, { - "bom-ref": "16cd5e63d4ddfe12", + "bom-ref": "a349abaca9a4e6c2", "name": "/usr/share/vim/vim91/syntax/cdrtoc.vim", "type": "file" }, { - "bom-ref": "8df8d88dfe0bf7b2", + "bom-ref": "45506b2dae8565da", "name": "/usr/share/vim/vim91/syntax/cf.vim", "type": "file" }, { - "bom-ref": "3764ddbd93d97f53", + "bom-ref": "fbbc0a6beba7d1bb", "name": "/usr/share/vim/vim91/syntax/cfg.vim", "type": "file" }, { - "bom-ref": "bd9a9d3b46532f0e", + "bom-ref": "09e4f76d882b9fee", "name": "/usr/share/vim/vim91/syntax/ch.vim", "type": "file" }, { - "bom-ref": "d23937461014c4c0", + "bom-ref": "d107aa15772c3770", "name": "/usr/share/vim/vim91/syntax/chaiscript.vim", "type": "file" }, { - "bom-ref": "20f7276c2c35b8e3", + "bom-ref": "aeb3115d5fd9e687", "name": "/usr/share/vim/vim91/syntax/change.vim", "type": "file" }, { - "bom-ref": "aecbd046ba221a02", + "bom-ref": "661cd02d2926e322", "name": "/usr/share/vim/vim91/syntax/changelog.vim", "type": "file" }, { - "bom-ref": "d6b0a5f5b026f0d6", + "bom-ref": "2a0b720f7886f512", "name": "/usr/share/vim/vim91/syntax/chaskell.vim", "type": "file" }, { - "bom-ref": "535cc045568b114a", + "bom-ref": "35be1ba676deded6", "name": "/usr/share/vim/vim91/syntax/chatito.vim", "type": "file" }, { - "bom-ref": "85af90cd45f8761c", + "bom-ref": "f4ba238442fa82e0", "name": "/usr/share/vim/vim91/syntax/cheetah.vim", "type": "file" }, { - "bom-ref": "a0d1b1a37140b53a", + "bom-ref": "1f1df865dfe3b9ca", "name": "/usr/share/vim/vim91/syntax/chicken.vim", "type": "file" }, { - "bom-ref": "45321f644ea96a56", + "bom-ref": "8d33604166fd45a6", "name": "/usr/share/vim/vim91/syntax/chill.vim", "type": "file" }, { - "bom-ref": "7a7ab58d686592a8", + "bom-ref": "358a1c440b8c2838", "name": "/usr/share/vim/vim91/syntax/chordpro.vim", "type": "file" }, { - "bom-ref": "d8f923a87c0724a8", + "bom-ref": "56a4ad0066b0ec5c", "name": "/usr/share/vim/vim91/syntax/cl.vim", "type": "file" }, { - "bom-ref": "a119cade7069710b", + "bom-ref": "6b1b47d9d2545f03", "name": "/usr/share/vim/vim91/syntax/clean.vim", "type": "file" }, { - "bom-ref": "9c0093c56b356503", + "bom-ref": "a7a5433089ee9567", "name": "/usr/share/vim/vim91/syntax/clipper.vim", "type": "file" }, { - "bom-ref": "064d0bffbea8d99d", + "bom-ref": "6ef3481f0ea4d419", "name": "/usr/share/vim/vim91/syntax/clojure.vim", "type": "file" }, { - "bom-ref": "d8368e6febdcb785", + "bom-ref": "51dfe4a6fed55db5", "name": "/usr/share/vim/vim91/syntax/cmake.vim", "type": "file" }, { - "bom-ref": "ef7af5e8865ff93a", + "bom-ref": "b1525f1a98ae8cde", "name": "/usr/share/vim/vim91/syntax/cmod.vim", "type": "file" }, { - "bom-ref": "34b14da256b4cd16", + "bom-ref": "c6197c9df195420e", "name": "/usr/share/vim/vim91/syntax/cmusrc.vim", "type": "file" }, { - "bom-ref": "b48c675096cd5869", + "bom-ref": "addbc00e6862b909", "name": "/usr/share/vim/vim91/syntax/cobol.vim", "type": "file" }, { - "bom-ref": "977f4d462c2dcaf0", + "bom-ref": "a48f30ff73200db8", "name": "/usr/share/vim/vim91/syntax/coco.vim", "type": "file" }, { - "bom-ref": "c59f237934b2a91f", + "bom-ref": "c9943ce172cb61f7", "name": "/usr/share/vim/vim91/syntax/colortest.vim", "type": "file" }, { - "bom-ref": "07d83836ac09aae4", + "bom-ref": "f17b341313f7ce9c", "name": "/usr/share/vim/vim91/syntax/conaryrecipe.vim", "type": "file" }, { - "bom-ref": "f16d29d7bfad9ea3", + "bom-ref": "a8e96d6cbd044dff", "name": "/usr/share/vim/vim91/syntax/conf.vim", "type": "file" }, { - "bom-ref": "256c3257fbd5f7ed", + "bom-ref": "06999facc60cd86d", "name": "/usr/share/vim/vim91/syntax/config.vim", "type": "file" }, { - "bom-ref": "4ae9c454e5958f04", + "bom-ref": "ff4a4355d2ab60a8", "name": "/usr/share/vim/vim91/syntax/confini.vim", "type": "file" }, { - "bom-ref": "640c622f04d02f71", + "bom-ref": "c90ac0b7afc71e01", "name": "/usr/share/vim/vim91/syntax/context.vim", "type": "file" }, { - "bom-ref": "efdf91951bbdedab", + "bom-ref": "55a1390b37d52037", "name": "/usr/share/vim/vim91/syntax/cpp.vim", "type": "file" }, { - "bom-ref": "e79546ba8a2c0179", + "bom-ref": "6533c2b099fdbab1", "name": "/usr/share/vim/vim91/syntax/crm.vim", "type": "file" }, { - "bom-ref": "8ac8fa217259e347", + "bom-ref": "941d89c9f5aeebb7", "name": "/usr/share/vim/vim91/syntax/crontab.vim", "type": "file" }, { - "bom-ref": "d52489e5100ba437", + "bom-ref": "90b1a83ae8015f3f", "name": "/usr/share/vim/vim91/syntax/cs.vim", "type": "file" }, { - "bom-ref": "6261ce13c8fcfafd", + "bom-ref": "99a73dc2d5906f6d", "name": "/usr/share/vim/vim91/syntax/csc.vim", "type": "file" }, { - "bom-ref": "8f3a593e7c409376", + "bom-ref": "24c8ee8bd5229e82", "name": "/usr/share/vim/vim91/syntax/csdl.vim", "type": "file" }, { - "bom-ref": "1dedeefde184e1c1", + "bom-ref": "a25b4d32d29ad07d", "name": "/usr/share/vim/vim91/syntax/csh.vim", "type": "file" }, { - "bom-ref": "820797fedda10c84", + "bom-ref": "3e0d22788cb40ca0", "name": "/usr/share/vim/vim91/syntax/csp.vim", "type": "file" }, { - "bom-ref": "f7b77c0936d20e42", + "bom-ref": "d60243ca6cfc08c6", "name": "/usr/share/vim/vim91/syntax/css.vim", "type": "file" }, { - "bom-ref": "cbb4b4c22b4a81e0", + "bom-ref": "43b5513e8d111614", "name": "/usr/share/vim/vim91/syntax/cterm.vim", "type": "file" }, { - "bom-ref": "d961eee438cbaf4b", + "bom-ref": "150d5677fef93fd7", "name": "/usr/share/vim/vim91/syntax/ctrlh.vim", "type": "file" }, { - "bom-ref": "00667763bc4b8840", + "bom-ref": "84ac8fc9af8bde08", "name": "/usr/share/vim/vim91/syntax/cucumber.vim", "type": "file" }, { - "bom-ref": "4f4424fd8e67fa43", + "bom-ref": "a65960c35001747f", "name": "/usr/share/vim/vim91/syntax/cuda.vim", "type": "file" }, { - "bom-ref": "ef63cea27e4a4292", + "bom-ref": "de64ad553d0b15be", "name": "/usr/share/vim/vim91/syntax/cupl.vim", "type": "file" }, { - "bom-ref": "8973e11c128bb046", + "bom-ref": "fdf66ca76580edf6", "name": "/usr/share/vim/vim91/syntax/cuplsim.vim", "type": "file" }, { - "bom-ref": "f2eacf7041eceefe", + "bom-ref": "8b79b8d561b03922", "name": "/usr/share/vim/vim91/syntax/cvs.vim", "type": "file" }, { - "bom-ref": "e67e7c18c17db91f", + "bom-ref": "bc9aaac7ba9a825b", "name": "/usr/share/vim/vim91/syntax/cvsrc.vim", "type": "file" }, { - "bom-ref": "f6b30032855b6c63", + "bom-ref": "b4e9482051007b8b", "name": "/usr/share/vim/vim91/syntax/cweb.vim", "type": "file" }, { - "bom-ref": "b89497525e35b29a", + "bom-ref": "29422b7db9771b9e", "name": "/usr/share/vim/vim91/syntax/cynlib.vim", "type": "file" }, { - "bom-ref": "4c89daaf98c220c5", + "bom-ref": "df3e8fdcc29933ed", "name": "/usr/share/vim/vim91/syntax/cynpp.vim", "type": "file" }, { - "bom-ref": "ddf9a7f4209e157e", + "bom-ref": "3cec9a1d2c0fa62e", "name": "/usr/share/vim/vim91/syntax/d.vim", "type": "file" }, { - "bom-ref": "e4d77320fa3a58e3", + "bom-ref": "733596bfb20af7bb", "name": "/usr/share/vim/vim91/syntax/dart.vim", "type": "file" }, { - "bom-ref": "40e8cc213a16170b", + "bom-ref": "9236c1659e335033", "name": "/usr/share/vim/vim91/syntax/datascript.vim", "type": "file" }, { - "bom-ref": "e16df8ec72f5c650", + "bom-ref": "42974f0bc3275234", "name": "/usr/share/vim/vim91/syntax/dcd.vim", "type": "file" }, { - "bom-ref": "01a2cc3f28b1545b", + "bom-ref": "bedcf1e627b92f1b", "name": "/usr/share/vim/vim91/syntax/dcl.vim", "type": "file" }, { - "bom-ref": "d7eb8bfedabe7058", + "bom-ref": "f9e866fa37d8f76c", "name": "/usr/share/vim/vim91/syntax/deb822sources.vim", "type": "file" }, { - "bom-ref": "48c48d1fcb18b7f7", + "bom-ref": "9c90c3d82d442873", "name": "/usr/share/vim/vim91/syntax/debchangelog.vim", "type": "file" }, { - "bom-ref": "4f77b324e0b7d913", + "bom-ref": "841390f1fdb4eabf", "name": "/usr/share/vim/vim91/syntax/debcontrol.vim", "type": "file" }, { - "bom-ref": "682d8e86df008435", + "bom-ref": "f5b0809368b449c5", "name": "/usr/share/vim/vim91/syntax/debcopyright.vim", "type": "file" }, { - "bom-ref": "e2cf1905341a4bf4", + "bom-ref": "1d3fd3e51dcb6ac0", "name": "/usr/share/vim/vim91/syntax/debsources.vim", "type": "file" }, { - "bom-ref": "ceb69a6deab64bc5", + "bom-ref": "968d1d2b652678dd", "name": "/usr/share/vim/vim91/syntax/def.vim", "type": "file" }, { - "bom-ref": "716d2c568b0ef2ce", + "bom-ref": "a3fac8c3152b71ae", "name": "/usr/share/vim/vim91/syntax/denyhosts.vim", "type": "file" }, { - "bom-ref": "ab397f03b6732ff7", + "bom-ref": "29c7aa4cf63dccd3", "name": "/usr/share/vim/vim91/syntax/dep3patch.vim", "type": "file" }, { - "bom-ref": "79d31830fbfe91fd", + "bom-ref": "96fb1e3a6c0c7c69", "name": "/usr/share/vim/vim91/syntax/desc.vim", "type": "file" }, { - "bom-ref": "c4875536ab8ba16c", + "bom-ref": "61e7f97027c6e5d8", "name": "/usr/share/vim/vim91/syntax/desktop.vim", "type": "file" }, { - "bom-ref": "0b23992cca6926de", + "bom-ref": "e274c105de4d5462", "name": "/usr/share/vim/vim91/syntax/dictconf.vim", "type": "file" }, { - "bom-ref": "036d4a3ca386fbf6", + "bom-ref": "e7b95a90b774cc66", "name": "/usr/share/vim/vim91/syntax/dictdconf.vim", "type": "file" }, { - "bom-ref": "44c364c502fcedf7", + "bom-ref": "afce0e539140f2ff", "name": "/usr/share/vim/vim91/syntax/diff.vim", "type": "file" }, { - "bom-ref": "3c8bc60d9e237b93", + "bom-ref": "b5286c6203a7558b", "name": "/usr/share/vim/vim91/syntax/dircolors.vim", "type": "file" }, { - "bom-ref": "cbffb7d61e9c79f1", + "bom-ref": "f287ff9408083901", "name": "/usr/share/vim/vim91/syntax/dirpager.vim", "type": "file" }, { - "bom-ref": "0c740f139dca278c", + "bom-ref": "e10b532d4eaefd5c", "name": "/usr/share/vim/vim91/syntax/diva.vim", "type": "file" }, { - "bom-ref": "cb859236b9f63378", + "bom-ref": "910b45a268746d28", "name": "/usr/share/vim/vim91/syntax/django.vim", "type": "file" }, { - "bom-ref": "0c3a82d73f144369", + "bom-ref": "cd12e5f5bec5a0dd", "name": "/usr/share/vim/vim91/syntax/dns.vim", "type": "file" }, { - "bom-ref": "20b914c5569075c0", + "bom-ref": "bcba1bb6fb37665c", "name": "/usr/share/vim/vim91/syntax/dnsmasq.vim", "type": "file" }, { - "bom-ref": "8faaebf54fede3fc", + "bom-ref": "672ba0ceb8ccb0c8", "name": "/usr/share/vim/vim91/syntax/docbk.vim", "type": "file" }, { - "bom-ref": "289bb39142fdd789", + "bom-ref": "4513f347a87bb9e9", "name": "/usr/share/vim/vim91/syntax/docbksgml.vim", "type": "file" }, { - "bom-ref": "add0ec52bfd5c9f4", + "bom-ref": "a4d14a4f6338719c", "name": "/usr/share/vim/vim91/syntax/docbkxml.vim", "type": "file" }, { - "bom-ref": "4a903ca398481d03", + "bom-ref": "e33a664825110d73", "name": "/usr/share/vim/vim91/syntax/dockerfile.vim", "type": "file" }, { - "bom-ref": "05a3e23a98f79503", + "bom-ref": "de6011e70f93125b", "name": "/usr/share/vim/vim91/syntax/dosbatch.vim", "type": "file" }, { - "bom-ref": "09317cf4e9e79519", + "bom-ref": "693db4a37686cf59", "name": "/usr/share/vim/vim91/syntax/dosini.vim", "type": "file" }, { - "bom-ref": "1459b19fe0eb67e5", + "bom-ref": "282419a82a7417d1", "name": "/usr/share/vim/vim91/syntax/dot.vim", "type": "file" }, { - "bom-ref": "725bc5f98add66d1", + "bom-ref": "83ffd6ee76b9fa95", "name": "/usr/share/vim/vim91/syntax/doxygen.vim", "type": "file" }, { - "bom-ref": "ad72add6314fc92d", + "bom-ref": "914eb78310984485", "name": "/usr/share/vim/vim91/syntax/dracula.vim", "type": "file" }, { - "bom-ref": "7ffdc420504f1435", + "bom-ref": "972e15439673939d", "name": "/usr/share/vim/vim91/syntax/dsl.vim", "type": "file" }, { - "bom-ref": "b3340ac7359108d5", + "bom-ref": "001cd1496174235d", "name": "/usr/share/vim/vim91/syntax/dtd.vim", "type": "file" }, { - "bom-ref": "ae82ede8fe31982f", + "bom-ref": "9ab289ca91c60813", "name": "/usr/share/vim/vim91/syntax/dtml.vim", "type": "file" }, { - "bom-ref": "a7cb70c0e5953aed", + "bom-ref": "6d8438e06a635d81", "name": "/usr/share/vim/vim91/syntax/dtrace.vim", "type": "file" }, { - "bom-ref": "aaaccf97eab4cb6b", + "bom-ref": "443cfa074459344b", "name": "/usr/share/vim/vim91/syntax/dts.vim", "type": "file" }, { - "bom-ref": "447171c5e4928f7b", + "bom-ref": "e0586fe3efb33e67", "name": "/usr/share/vim/vim91/syntax/dune.vim", "type": "file" }, { - "bom-ref": "1081faa2edbd3812", + "bom-ref": "ec68aabe9699008e", "name": "/usr/share/vim/vim91/syntax/dylan.vim", "type": "file" }, { - "bom-ref": "aace83340d111679", + "bom-ref": "71905f164fe983e1", "name": "/usr/share/vim/vim91/syntax/dylanintr.vim", "type": "file" }, { - "bom-ref": "fd03cfff4c7e7b6b", + "bom-ref": "31d7bf021c9a24d7", "name": "/usr/share/vim/vim91/syntax/dylanlid.vim", "type": "file" }, { - "bom-ref": "87ed6dd71bd5cb67", + "bom-ref": "adc98b5a7e1ab26b", "name": "/usr/share/vim/vim91/syntax/ecd.vim", "type": "file" }, { - "bom-ref": "542fdcf896c4c071", + "bom-ref": "d7d2bfc43fbd05c5", "name": "/usr/share/vim/vim91/syntax/edif.vim", "type": "file" }, { - "bom-ref": "697ada67ad39cc4b", + "bom-ref": "a10fc34547b654d3", "name": "/usr/share/vim/vim91/syntax/editorconfig.vim", "type": "file" }, { - "bom-ref": "1ea1e1fce1575529", + "bom-ref": "a7f241c7840ec235", "name": "/usr/share/vim/vim91/syntax/eiffel.vim", "type": "file" }, { - "bom-ref": "cff8156d5742b091", + "bom-ref": "b895b7f9e4d16919", "name": "/usr/share/vim/vim91/syntax/elf.vim", "type": "file" }, { - "bom-ref": "5debc57502bcebd8", + "bom-ref": "26932268c0b17d58", "name": "/usr/share/vim/vim91/syntax/elinks.vim", "type": "file" }, { - "bom-ref": "d7212a658b933123", + "bom-ref": "af1de319c5e9d7bf", "name": "/usr/share/vim/vim91/syntax/elm.vim", "type": "file" }, { - "bom-ref": "ffca2f5d0c73023f", + "bom-ref": "1405ec8fc000e153", "name": "/usr/share/vim/vim91/syntax/elmfilt.vim", "type": "file" }, { - "bom-ref": "2bfdba0edc425ff6", + "bom-ref": "ae0fc05a62c8fdde", "name": "/usr/share/vim/vim91/syntax/erlang.vim", "type": "file" }, { - "bom-ref": "01fda63c8a82cc40", + "bom-ref": "15f8610ecefeb9b4", "name": "/usr/share/vim/vim91/syntax/eruby.vim", "type": "file" }, { - "bom-ref": "afd797693b56b5ba", + "bom-ref": "a9228051a534e226", "name": "/usr/share/vim/vim91/syntax/esmtprc.vim", "type": "file" }, { - "bom-ref": "7a28ae2acce54993", + "bom-ref": "d306d5f451cef4a3", "name": "/usr/share/vim/vim91/syntax/esqlc.vim", "type": "file" }, { - "bom-ref": "c3df938176747dde", + "bom-ref": "880e56702595f62e", "name": "/usr/share/vim/vim91/syntax/esterel.vim", "type": "file" }, { - "bom-ref": "8dd05037a277334a", + "bom-ref": "a7a0507511695a7a", "name": "/usr/share/vim/vim91/syntax/eterm.vim", "type": "file" }, { - "bom-ref": "31fb642b7173c22f", + "bom-ref": "450d42125f78e757", "name": "/usr/share/vim/vim91/syntax/euphoria3.vim", "type": "file" }, { - "bom-ref": "cdd5192bb3fec98a", + "bom-ref": "bbd04bac51248176", "name": "/usr/share/vim/vim91/syntax/euphoria4.vim", "type": "file" }, { - "bom-ref": "a01ec7b88585d8bc", + "bom-ref": "f84b3615a8ada968", "name": "/usr/share/vim/vim91/syntax/eviews.vim", "type": "file" }, { - "bom-ref": "3f26cd27f46ca700", + "bom-ref": "218537eac6267b8c", "name": "/usr/share/vim/vim91/syntax/exim.vim", "type": "file" }, { - "bom-ref": "f25e6515b0dda706", + "bom-ref": "4890b130270fe262", "name": "/usr/share/vim/vim91/syntax/expect.vim", "type": "file" }, { - "bom-ref": "4068d9e161c97f94", + "bom-ref": "25b8cd18c54d6d8c", "name": "/usr/share/vim/vim91/syntax/exports.vim", "type": "file" }, { - "bom-ref": "6bc2476b8a505477", + "bom-ref": "7ae36426111dbf9b", "name": "/usr/share/vim/vim91/syntax/falcon.vim", "type": "file" }, { - "bom-ref": "b4aaf65df80b89ff", + "bom-ref": "23488de3360fafcf", "name": "/usr/share/vim/vim91/syntax/fan.vim", "type": "file" }, { - "bom-ref": "f280bcc2499d0b70", + "bom-ref": "7220ef28990658d4", "name": "/usr/share/vim/vim91/syntax/fasm.vim", "type": "file" }, { - "bom-ref": "4dda023c4f5a19d3", + "bom-ref": "b183d737744b5ae7", "name": "/usr/share/vim/vim91/syntax/fdcc.vim", "type": "file" }, { - "bom-ref": "18b1a8c96d2c7408", + "bom-ref": "051aac8504da92dc", "name": "/usr/share/vim/vim91/syntax/fetchmail.vim", "type": "file" }, { - "bom-ref": "6abe66d65b94b377", + "bom-ref": "0dff971e74de5e8f", "name": "/usr/share/vim/vim91/syntax/fgl.vim", "type": "file" }, { - "bom-ref": "d1fad315c7aa5d12", + "bom-ref": "1054ee193b0adfd2", "name": "/usr/share/vim/vim91/syntax/fish.vim", "type": "file" }, { - "bom-ref": "b68ea6b1247e605b", + "bom-ref": "ae0617c90fb64567", "name": "/usr/share/vim/vim91/syntax/flexwiki.vim", "type": "file" }, { - "bom-ref": "2d2cd5b25f26a162", + "bom-ref": "fc4676848ec2f3ee", "name": "/usr/share/vim/vim91/syntax/focexec.vim", "type": "file" }, { - "bom-ref": "f42353ae87bdaf2d", + "bom-ref": "3968bdb517610f25", "name": "/usr/share/vim/vim91/syntax/form.vim", "type": "file" }, { - "bom-ref": "df8e06b5b7cecd34", + "bom-ref": "c8b2569c056af2c0", "name": "/usr/share/vim/vim91/syntax/forth.vim", "type": "file" }, { - "bom-ref": "6fe70fc6b3602e1e", + "bom-ref": "ea9f8a99a14a524e", "name": "/usr/share/vim/vim91/syntax/fortran.vim", "type": "file" }, { - "bom-ref": "cae256024b46e08b", + "bom-ref": "e6a29cffd06c38e7", "name": "/usr/share/vim/vim91/syntax/foxpro.vim", "type": "file" }, { - "bom-ref": "0d3fc4680646edb5", + "bom-ref": "fac763ca8a8b1005", "name": "/usr/share/vim/vim91/syntax/fpcmake.vim", "type": "file" }, { - "bom-ref": "529b5f711f8c4a5e", + "bom-ref": "4b93272ed3621a5e", "name": "/usr/share/vim/vim91/syntax/framescript.vim", "type": "file" }, { - "bom-ref": "72e4cd45d9bae188", + "bom-ref": "17a7c9f2a32cdfb4", "name": "/usr/share/vim/vim91/syntax/freebasic.vim", "type": "file" }, { - "bom-ref": "2a0ac6943ae19f85", + "bom-ref": "b1a689e88609bfb9", "name": "/usr/share/vim/vim91/syntax/fstab.vim", "type": "file" }, { - "bom-ref": "3e64acf6afbd8e70", + "bom-ref": "8884b4cc83b2d12c", "name": "/usr/share/vim/vim91/syntax/fvwm.vim", "type": "file" }, { - "bom-ref": "8f07a05b5cda8568", + "bom-ref": "0418b3f739438b98", "name": "/usr/share/vim/vim91/syntax/fvwm2m4.vim", "type": "file" }, { - "bom-ref": "ad71c43fed729fa8", + "bom-ref": "5c2475e302b2e3b8", "name": "/usr/share/vim/vim91/syntax/gdb.vim", "type": "file" }, { - "bom-ref": "b26a95c8760e1db8", + "bom-ref": "9545f56c5623bf2c", "name": "/usr/share/vim/vim91/syntax/gdmo.vim", "type": "file" }, { - "bom-ref": "acd119346f4294b8", + "bom-ref": "270d42a6835c6bfc", "name": "/usr/share/vim/vim91/syntax/gdresource.vim", "type": "file" }, { - "bom-ref": "10313137e872774b", + "bom-ref": "31a958b4e065bebf", "name": "/usr/share/vim/vim91/syntax/gdscript.vim", "type": "file" }, { - "bom-ref": "3997603ddc85c934", + "bom-ref": "66e0cc61be300148", "name": "/usr/share/vim/vim91/syntax/gdshader.vim", "type": "file" }, { - "bom-ref": "6f7d602d15e3bb9d", + "bom-ref": "e80d3338bbae4501", "name": "/usr/share/vim/vim91/syntax/gedcom.vim", "type": "file" }, { - "bom-ref": "9773f60d9cc46391", + "bom-ref": "f76c2e39ebf9d6b9", "name": "/usr/share/vim/vim91/syntax/gemtext.vim", "type": "file" }, { - "bom-ref": "fada23011d8ffcad", + "bom-ref": "fff635eabd501065", "name": "/usr/share/vim/vim91/syntax/gift.vim", "type": "file" }, { - "bom-ref": "a0896bccd0ced0d3", + "bom-ref": "ea6da8cac5c43b0f", "name": "/usr/share/vim/vim91/syntax/git.vim", "type": "file" }, { - "bom-ref": "27fac25aa2c833d8", + "bom-ref": "160a3b2142a1220c", "name": "/usr/share/vim/vim91/syntax/gitattributes.vim", "type": "file" }, { - "bom-ref": "c73a03683a57258a", + "bom-ref": "85f8e9caf11f2456", "name": "/usr/share/vim/vim91/syntax/gitcommit.vim", "type": "file" }, { - "bom-ref": "7e0a5f1235f28e9a", + "bom-ref": "3838be221ba81be2", "name": "/usr/share/vim/vim91/syntax/gitconfig.vim", "type": "file" }, { - "bom-ref": "bb78b048ca8732e5", + "bom-ref": "9b02acd216513b39", "name": "/usr/share/vim/vim91/syntax/gitignore.vim", "type": "file" }, { - "bom-ref": "a28f047c75e345fa", + "bom-ref": "ec15f2e64676ba82", "name": "/usr/share/vim/vim91/syntax/gitolite.vim", "type": "file" }, { - "bom-ref": "869171b7fe416b3d", + "bom-ref": "7b18f6f6e7cc6a05", "name": "/usr/share/vim/vim91/syntax/gitrebase.vim", "type": "file" }, { - "bom-ref": "da37b11894d77a8d", + "bom-ref": "e48984078fb50585", "name": "/usr/share/vim/vim91/syntax/gitsendemail.vim", "type": "file" }, { - "bom-ref": "49b0daf0c2947ec6", + "bom-ref": "3be5b56f9ab60d9a", "name": "/usr/share/vim/vim91/syntax/gkrellmrc.vim", "type": "file" }, { - "bom-ref": "f1b4a81a09bb732f", + "bom-ref": "4119bfb88fc2e18f", "name": "/usr/share/vim/vim91/syntax/gnash.vim", "type": "file" }, { - "bom-ref": "71952e108041ceda", + "bom-ref": "3bba007ef6115696", "name": "/usr/share/vim/vim91/syntax/gnuplot.vim", "type": "file" }, { - "bom-ref": "68532b6bf94fab72", + "bom-ref": "dd031376a856448e", "name": "/usr/share/vim/vim91/syntax/go.vim", "type": "file" }, { - "bom-ref": "849fadca612e6693", + "bom-ref": "67a31d0bab86ce77", "name": "/usr/share/vim/vim91/syntax/godoc.vim", "type": "file" }, { - "bom-ref": "d4123de13677d56d", + "bom-ref": "b0562b0bdcd22aa5", "name": "/usr/share/vim/vim91/syntax/gp.vim", "type": "file" }, { - "bom-ref": "c8085fab9455c708", + "bom-ref": "d67333439d5b2d70", "name": "/usr/share/vim/vim91/syntax/gpg.vim", "type": "file" }, { - "bom-ref": "10228dca8cec5e79", + "bom-ref": "ed6acfb261fe12a9", "name": "/usr/share/vim/vim91/syntax/gprof.vim", "type": "file" }, { - "bom-ref": "7b9a09c355819dca", + "bom-ref": "7992b5e7936e9056", "name": "/usr/share/vim/vim91/syntax/grads.vim", "type": "file" }, { - "bom-ref": "1c2bdf0c5a999967", + "bom-ref": "b2be246a881370df", "name": "/usr/share/vim/vim91/syntax/gretl.vim", "type": "file" }, { - "bom-ref": "8f25a154a9804e54", + "bom-ref": "1da90204ef4b1a34", "name": "/usr/share/vim/vim91/syntax/groff.vim", "type": "file" }, { - "bom-ref": "591d614f41926bdf", + "bom-ref": "56f1f1dead291697", "name": "/usr/share/vim/vim91/syntax/groovy.vim", "type": "file" }, { - "bom-ref": "7b6b44c61ad7c185", + "bom-ref": "a62c59e99b7d8fed", "name": "/usr/share/vim/vim91/syntax/group.vim", "type": "file" }, { - "bom-ref": "4498bb8903967e6b", + "bom-ref": "964060814666b1c7", "name": "/usr/share/vim/vim91/syntax/grub.vim", "type": "file" }, { - "bom-ref": "7e3d9350c5969e5b", + "bom-ref": "09db76c7707e197f", "name": "/usr/share/vim/vim91/syntax/gsp.vim", "type": "file" }, { - "bom-ref": "cd7f4aea03c516d8", + "bom-ref": "4d149dcdc4dd8298", "name": "/usr/share/vim/vim91/syntax/gtkrc.vim", "type": "file" }, { - "bom-ref": "3bb8afd50a998da7", + "bom-ref": "e17cc6f1971cb41f", "name": "/usr/share/vim/vim91/syntax/gvpr.vim", "type": "file" }, { - "bom-ref": "3aed63807e023043", + "bom-ref": "99a10b787d1dbd17", "name": "/usr/share/vim/vim91/syntax/gyp.vim", "type": "file" }, { - "bom-ref": "d9e52695f00e823d", + "bom-ref": "24f16dd369171611", "name": "/usr/share/vim/vim91/syntax/haml.vim", "type": "file" }, { - "bom-ref": "8374eb208016b95b", + "bom-ref": "68880830e5a81eab", "name": "/usr/share/vim/vim91/syntax/hamster.vim", "type": "file" }, { - "bom-ref": "5ed6a64cdbbadb13", + "bom-ref": "12c10f4d3479e43f", "name": "/usr/share/vim/vim91/syntax/hare.vim", "type": "file" }, { - "bom-ref": "940c7b518b841357", + "bom-ref": "323d6d577b1b7d7f", "name": "/usr/share/vim/vim91/syntax/haskell.vim", "type": "file" }, { - "bom-ref": "ea0a03a6c9f913fc", + "bom-ref": "568db80109f974a4", "name": "/usr/share/vim/vim91/syntax/haste.vim", "type": "file" }, { - "bom-ref": "eb5ba3fe49788235", + "bom-ref": "e8768b7f6e4d9079", "name": "/usr/share/vim/vim91/syntax/hastepreproc.vim", "type": "file" }, { - "bom-ref": "86e4b6d6e1941bc7", + "bom-ref": "8d534a290c31ea7f", "name": "/usr/share/vim/vim91/syntax/hb.vim", "type": "file" }, { - "bom-ref": "292f55870fcc658a", + "bom-ref": "7dfced9c2675ee32", "name": "/usr/share/vim/vim91/syntax/help.vim", "type": "file" }, { - "bom-ref": "895ce7deb7081ba6", + "bom-ref": "d0761f839a0b9752", "name": "/usr/share/vim/vim91/syntax/help_ru.vim", "type": "file" }, { - "bom-ref": "13611d3a4b922c62", + "bom-ref": "48e4665b68cad512", "name": "/usr/share/vim/vim91/syntax/hercules.vim", "type": "file" }, { - "bom-ref": "90bee544ecd11020", + "bom-ref": "2d678e986d3bb864", "name": "/usr/share/vim/vim91/syntax/hex.vim", "type": "file" }, { - "bom-ref": "7c0d6b371f91f027", + "bom-ref": "81df22aa2213c917", "name": "/usr/share/vim/vim91/syntax/hgcommit.vim", "type": "file" }, { - "bom-ref": "766b588862d90b92", + "bom-ref": "9c4a5ba6a7ea5f9a", "name": "/usr/share/vim/vim91/syntax/hitest.vim", "type": "file" }, { - "bom-ref": "c085051562a09e49", + "bom-ref": "1e5109c8df156d35", "name": "/usr/share/vim/vim91/syntax/hlsplaylist.vim", "type": "file" }, { - "bom-ref": "8ac5ca9b35ff3083", + "bom-ref": "ac6b46c5b910713b", "name": "/usr/share/vim/vim91/syntax/hog.vim", "type": "file" }, { - "bom-ref": "5e8311211d906d68", + "bom-ref": "ac9ae6aea9b1de50", "name": "/usr/share/vim/vim91/syntax/hollywood.vim", "type": "file" }, { - "bom-ref": "fa0c2b88e30294f3", + "bom-ref": "6753c52fc79db97f", "name": "/usr/share/vim/vim91/syntax/hostconf.vim", "type": "file" }, { - "bom-ref": "2bdf455900630ad0", + "bom-ref": "312b14d636328158", "name": "/usr/share/vim/vim91/syntax/hostsaccess.vim", "type": "file" }, { - "bom-ref": "ba0b1fa8b6c22b98", + "bom-ref": "20fa0e645e3b5be4", "name": "/usr/share/vim/vim91/syntax/html.vim", "type": "file" }, { - "bom-ref": "19eb33e2792f4ed5", + "bom-ref": "2f1ee9c9a2700e21", "name": "/usr/share/vim/vim91/syntax/htmlcheetah.vim", "type": "file" }, { - "bom-ref": "d30b9a4ce89e866c", + "bom-ref": "faf2142690a04034", "name": "/usr/share/vim/vim91/syntax/htmldjango.vim", "type": "file" }, { - "bom-ref": "1aa8e078ce833479", + "bom-ref": "dac632b4309edcf9", "name": "/usr/share/vim/vim91/syntax/htmlm4.vim", "type": "file" }, { - "bom-ref": "8482303724f59e01", + "bom-ref": "36485ae42ce90749", "name": "/usr/share/vim/vim91/syntax/htmlos.vim", "type": "file" }, { - "bom-ref": "8ac46f623d345438", + "bom-ref": "578f5fdc8bf023f8", "name": "/usr/share/vim/vim91/syntax/i3config.vim", "type": "file" }, { - "bom-ref": "24dcced911523e44", + "bom-ref": "19e36993dfb82ed4", "name": "/usr/share/vim/vim91/syntax/ia64.vim", "type": "file" }, { - "bom-ref": "1a37b6f36f5ced4c", + "bom-ref": "232d7e870596176c", "name": "/usr/share/vim/vim91/syntax/ibasic.vim", "type": "file" }, { - "bom-ref": "534fefea7dfc5e74", + "bom-ref": "55bd60b0f829a9a8", "name": "/usr/share/vim/vim91/syntax/icemenu.vim", "type": "file" }, { - "bom-ref": "71011a5ea8c7f068", + "bom-ref": "00a5e321c3b048dc", "name": "/usr/share/vim/vim91/syntax/icon.vim", "type": "file" }, { - "bom-ref": "454ee030c5d89646", + "bom-ref": "78a717bc2eb63b72", "name": "/usr/share/vim/vim91/syntax/idl.vim", "type": "file" }, { - "bom-ref": "0fcfc30ae6c2066a", + "bom-ref": "7b8a866f3f5ba326", "name": "/usr/share/vim/vim91/syntax/idlang.vim", "type": "file" }, { - "bom-ref": "d8e61c8803438977", + "bom-ref": "eacd12af05525c27", "name": "/usr/share/vim/vim91/syntax/indent.vim", "type": "file" }, { - "bom-ref": "2cecf76dc3279fd0", + "bom-ref": "95e68b599637aaf0", "name": "/usr/share/vim/vim91/syntax/inform.vim", "type": "file" }, { - "bom-ref": "d4ed46e8052484e5", + "bom-ref": "35d997b865deaf95", "name": "/usr/share/vim/vim91/syntax/initex.vim", "type": "file" }, { - "bom-ref": "a9bcedf255a8024f", + "bom-ref": "be10292afc23a30f", "name": "/usr/share/vim/vim91/syntax/initng.vim", "type": "file" }, { - "bom-ref": "583ffd0127d59914", + "bom-ref": "7698f0df7caca3e0", "name": "/usr/share/vim/vim91/syntax/inittab.vim", "type": "file" }, { - "bom-ref": "477650e738aaa4d9", + "bom-ref": "74c388f93b7054f9", "name": "/usr/share/vim/vim91/syntax/ipfilter.vim", "type": "file" }, { - "bom-ref": "77701a6864d64773", + "bom-ref": "c4c358e59804ec73", "name": "/usr/share/vim/vim91/syntax/ishd.vim", "type": "file" }, { - "bom-ref": "b5737b2d927098f4", + "bom-ref": "9550477902f49c14", "name": "/usr/share/vim/vim91/syntax/iss.vim", "type": "file" }, { - "bom-ref": "888c8a5fbeccbb5c", + "bom-ref": "c85b865843713800", "name": "/usr/share/vim/vim91/syntax/ist.vim", "type": "file" }, { - "bom-ref": "40c98d4b0f1148c6", + "bom-ref": "7f19b4ef086294ba", "name": "/usr/share/vim/vim91/syntax/j.vim", "type": "file" }, { - "bom-ref": "87dbe04b4dc6aa2f", + "bom-ref": "ab5c56bf229a53f7", "name": "/usr/share/vim/vim91/syntax/jal.vim", "type": "file" }, { - "bom-ref": "db3e886234758f08", + "bom-ref": "681d7d17217a324c", "name": "/usr/share/vim/vim91/syntax/jam.vim", "type": "file" }, { - "bom-ref": "378283c836a2a575", + "bom-ref": "c8d4c0b9126e0381", "name": "/usr/share/vim/vim91/syntax/jargon.vim", "type": "file" }, { - "bom-ref": "1c9f5f0718bd5a0a", + "bom-ref": "8dad3dc97a3de15e", "name": "/usr/share/vim/vim91/syntax/java.vim", "type": "file" }, { - "bom-ref": "f717d79d353de2c2", + "bom-ref": "431c2720607ffdee", "name": "/usr/share/vim/vim91/syntax/javacc.vim", "type": "file" }, { - "bom-ref": "e33d512cc1aefd11", + "bom-ref": "7bfd7ef89009a7f9", "name": "/usr/share/vim/vim91/syntax/javascript.vim", "type": "file" }, { - "bom-ref": "f4648d13f257eb87", + "bom-ref": "7cacb1dfca4c632f", "name": "/usr/share/vim/vim91/syntax/javascriptreact.vim", "type": "file" }, { - "bom-ref": "9acd26284b1ccd3a", + "bom-ref": "795ec2256a76c91e", "name": "/usr/share/vim/vim91/syntax/jess.vim", "type": "file" }, { - "bom-ref": "7e9d3f47f012d912", + "bom-ref": "a4910a632ef70a3e", "name": "/usr/share/vim/vim91/syntax/jgraph.vim", "type": "file" }, { - "bom-ref": "84a01c789a71ec62", + "bom-ref": "233e779aa677f632", "name": "/usr/share/vim/vim91/syntax/jovial.vim", "type": "file" }, { - "bom-ref": "163ac2ec3f19c9a1", + "bom-ref": "03cc977a1fcbb3c5", "name": "/usr/share/vim/vim91/syntax/jproperties.vim", "type": "file" }, { - "bom-ref": "4927150b5b4d4289", + "bom-ref": "8501642ddcddfa49", "name": "/usr/share/vim/vim91/syntax/json.vim", "type": "file" }, { - "bom-ref": "f5462a27e0de2ecf", + "bom-ref": "94b6a8719472c287", "name": "/usr/share/vim/vim91/syntax/json5.vim", "type": "file" }, { - "bom-ref": "7b657b5e95c2577d", + "bom-ref": "a5f43046e7178f4d", "name": "/usr/share/vim/vim91/syntax/jsonc.vim", "type": "file" }, { - "bom-ref": "d795eec6b77ecd4c", + "bom-ref": "8c281528411c4380", "name": "/usr/share/vim/vim91/syntax/jsp.vim", "type": "file" }, { - "bom-ref": "5c18317ab6385186", + "bom-ref": "e69ec872a4c142e2", "name": "/usr/share/vim/vim91/syntax/julia.vim", "type": "file" }, { - "bom-ref": "2d09f5da0391f452", + "bom-ref": "cc006ba09d899c62", "name": "/usr/share/vim/vim91/syntax/kconfig.vim", "type": "file" }, { - "bom-ref": "19a3fe28ece67278", + "bom-ref": "aaf0ff59033583e8", "name": "/usr/share/vim/vim91/syntax/kivy.vim", "type": "file" }, { - "bom-ref": "cc04a53c021aa55e", + "bom-ref": "2fe3a409a7e43b36", "name": "/usr/share/vim/vim91/syntax/kix.vim", "type": "file" }, { - "bom-ref": "b90af4e51ee6a39a", + "bom-ref": "ec4773f819a3aee2", "name": "/usr/share/vim/vim91/syntax/kotlin.vim", "type": "file" }, { - "bom-ref": "fae6f4027a69482f", + "bom-ref": "1f8a281ff1f2e84f", "name": "/usr/share/vim/vim91/syntax/krl.vim", "type": "file" }, { - "bom-ref": "35feeb861d512da0", + "bom-ref": "9592c80721241db4", "name": "/usr/share/vim/vim91/syntax/kscript.vim", "type": "file" }, { - "bom-ref": "2f8a04ced11b33d8", + "bom-ref": "ef4382ef0e04bdd0", "name": "/usr/share/vim/vim91/syntax/kwt.vim", "type": "file" }, { - "bom-ref": "6a3f69819770d0d3", + "bom-ref": "84581f861a41285f", "name": "/usr/share/vim/vim91/syntax/lace.vim", "type": "file" }, { - "bom-ref": "31a7f354b9191489", + "bom-ref": "7c692cba12b3d249", "name": "/usr/share/vim/vim91/syntax/latte.vim", "type": "file" }, { - "bom-ref": "d441619fd3d94eeb", + "bom-ref": "183b54b47354c8cf", "name": "/usr/share/vim/vim91/syntax/lc.vim", "type": "file" }, { - "bom-ref": "08d0986f3a1fa93b", + "bom-ref": "70a27c2b8c54f563", "name": "/usr/share/vim/vim91/syntax/ld.vim", "type": "file" }, { - "bom-ref": "e2532e3c42124c9a", + "bom-ref": "955ca7b56b710b02", "name": "/usr/share/vim/vim91/syntax/ldapconf.vim", "type": "file" }, { - "bom-ref": "769cad84f49268f9", + "bom-ref": "15359c0dbd6b0e85", "name": "/usr/share/vim/vim91/syntax/ldif.vim", "type": "file" }, { - "bom-ref": "95ba9879dd8b9891", + "bom-ref": "130e8964b094b49d", "name": "/usr/share/vim/vim91/syntax/less.vim", "type": "file" }, { - "bom-ref": "0a4827caac47a1a0", + "bom-ref": "efb214ca6d7a35f4", "name": "/usr/share/vim/vim91/syntax/lex.vim", "type": "file" }, { - "bom-ref": "6856dae97b7bf411", + "bom-ref": "2d659c63c09f95d1", "name": "/usr/share/vim/vim91/syntax/lftp.vim", "type": "file" }, { - "bom-ref": "65eb80cbc9f8afff", + "bom-ref": "23dd75b560633c7b", "name": "/usr/share/vim/vim91/syntax/lhaskell.vim", "type": "file" }, { - "bom-ref": "6057a8a42ef881b5", + "bom-ref": "4fa0a16a63b03a3d", "name": "/usr/share/vim/vim91/syntax/libao.vim", "type": "file" }, { - "bom-ref": "f402148c06a5a9dc", + "bom-ref": "ca580aa086c228d4", "name": "/usr/share/vim/vim91/syntax/lifelines.vim", "type": "file" }, { - "bom-ref": "419136225aa78baa", + "bom-ref": "c35290c7d7dbd302", "name": "/usr/share/vim/vim91/syntax/lilo.vim", "type": "file" }, { - "bom-ref": "7c78df25011b901c", + "bom-ref": "4ac7948ee9dbce0c", "name": "/usr/share/vim/vim91/syntax/limits.vim", "type": "file" }, { - "bom-ref": "854ff6fd22bb21c1", + "bom-ref": "b9b7ad8c534245b9", "name": "/usr/share/vim/vim91/syntax/liquid.vim", "type": "file" }, { - "bom-ref": "01325de9ae3c5bf0", + "bom-ref": "735c052577323528", "name": "/usr/share/vim/vim91/syntax/lisp.vim", "type": "file" }, { - "bom-ref": "543e5d50dd09d2a3", + "bom-ref": "67d504a46f6250a3", "name": "/usr/share/vim/vim91/syntax/lite.vim", "type": "file" }, { - "bom-ref": "88ab37ac0cdd2c0b", + "bom-ref": "27f1b93b4eba19b3", "name": "/usr/share/vim/vim91/syntax/litestep.vim", "type": "file" }, { - "bom-ref": "80d426fad128fed4", + "bom-ref": "ddbd8066fe996d14", "name": "/usr/share/vim/vim91/syntax/livebook.vim", "type": "file" }, { - "bom-ref": "2cb3055f7797c020", + "bom-ref": "e9b0c752fff28ce0", "name": "/usr/share/vim/vim91/syntax/loginaccess.vim", "type": "file" }, { - "bom-ref": "4d8ce6a302ed249d", + "bom-ref": "6bdfc77d9ea86381", "name": "/usr/share/vim/vim91/syntax/logindefs.vim", "type": "file" }, { - "bom-ref": "ff2545fdcf294798", + "bom-ref": "4b19e2b48559dbec", "name": "/usr/share/vim/vim91/syntax/logtalk.vim", "type": "file" }, { - "bom-ref": "456b4730f3b2819c", + "bom-ref": "9d857ffe31d55cc4", "name": "/usr/share/vim/vim91/syntax/lotos.vim", "type": "file" }, { - "bom-ref": "4c3c4f71123b8fee", + "bom-ref": "4db3150b73011b4a", "name": "/usr/share/vim/vim91/syntax/lout.vim", "type": "file" }, { - "bom-ref": "b4ec8b173b640848", + "bom-ref": "3e9bf727df627ca8", "name": "/usr/share/vim/vim91/syntax/lpc.vim", "type": "file" }, { - "bom-ref": "effadd35685a8e11", + "bom-ref": "a56ebc6167cabecd", "name": "/usr/share/vim/vim91/syntax/lprolog.vim", "type": "file" }, { - "bom-ref": "9ec942dd80815581", + "bom-ref": "a23a6ab17cabd8b9", "name": "/usr/share/vim/vim91/syntax/lscript.vim", "type": "file" }, { - "bom-ref": "67add5aef4b9b115", + "bom-ref": "2159a8dd6edeb925", "name": "/usr/share/vim/vim91/syntax/lsl.vim", "type": "file" }, { - "bom-ref": "56f35dc1179bb572", + "bom-ref": "2b75e97e7d33e16e", "name": "/usr/share/vim/vim91/syntax/lss.vim", "type": "file" }, { - "bom-ref": "cd639fcda0c3058e", + "bom-ref": "ea998a429d6af3ea", "name": "/usr/share/vim/vim91/syntax/lua.vim", "type": "file" }, { - "bom-ref": "0465895bfd777d27", + "bom-ref": "130a1c582d3b8d97", "name": "/usr/share/vim/vim91/syntax/luau.vim", "type": "file" }, { - "bom-ref": "cacccf786b6bbb4f", + "bom-ref": "27912e3f785c5c5b", "name": "/usr/share/vim/vim91/syntax/lynx.vim", "type": "file" }, { - "bom-ref": "b24828d84d0f4642", + "bom-ref": "ac48bffb0b3edeae", "name": "/usr/share/vim/vim91/syntax/lyrics.vim", "type": "file" }, { - "bom-ref": "27e7f733b5c42648", + "bom-ref": "0c50043330310b00", "name": "/usr/share/vim/vim91/syntax/m3build.vim", "type": "file" }, { - "bom-ref": "ca6293c89e630861", + "bom-ref": "aa93d66a87f4cb2d", "name": "/usr/share/vim/vim91/syntax/m3quake.vim", "type": "file" }, { - "bom-ref": "1ba3a27446024be8", + "bom-ref": "a4024e4b9d69e84c", "name": "/usr/share/vim/vim91/syntax/m4.vim", "type": "file" }, { - "bom-ref": "f1c5c9a0a7903622", + "bom-ref": "5af242dca3761e56", "name": "/usr/share/vim/vim91/syntax/mail.vim", "type": "file" }, { - "bom-ref": "b77e35def81fcdbf", + "bom-ref": "28594096dac5c7af", "name": "/usr/share/vim/vim91/syntax/mailaliases.vim", "type": "file" }, { - "bom-ref": "9243955ce6144be6", + "bom-ref": "b7925bd820f17e22", "name": "/usr/share/vim/vim91/syntax/mailcap.vim", "type": "file" }, { - "bom-ref": "8fe3063912bcaf87", + "bom-ref": "41d8ed7f4f1800eb", "name": "/usr/share/vim/vim91/syntax/make.vim", "type": "file" }, { - "bom-ref": "18eecddfceec1692", + "bom-ref": "5d53a424c5663ba2", "name": "/usr/share/vim/vim91/syntax/mallard.vim", "type": "file" }, { - "bom-ref": "73ff3576a3190497", + "bom-ref": "fca710c470ef290f", "name": "/usr/share/vim/vim91/syntax/man.vim", "type": "file" }, { - "bom-ref": "5595251fd496dbe4", + "bom-ref": "efb90ae863e067f0", "name": "/usr/share/vim/vim91/syntax/manconf.vim", "type": "file" }, { - "bom-ref": "5d8274cdcb474678", + "bom-ref": "4d6b40498f0ae4b0", "name": "/usr/share/vim/vim91/syntax/manual.vim", "type": "file" }, { - "bom-ref": "e11bd9fc2b5d957b", + "bom-ref": "4b4d3865be7a566f", "name": "/usr/share/vim/vim91/syntax/maple.vim", "type": "file" }, { - "bom-ref": "8d5f546929708232", + "bom-ref": "0e96f03fbd087a66", "name": "/usr/share/vim/vim91/syntax/markdown.vim", "type": "file" }, { - "bom-ref": "6f1fb33042375458", + "bom-ref": "1a983122361338cc", "name": "/usr/share/vim/vim91/syntax/masm.vim", "type": "file" }, { - "bom-ref": "3513445247894206", + "bom-ref": "d9818ae32de7deea", "name": "/usr/share/vim/vim91/syntax/mason.vim", "type": "file" }, { - "bom-ref": "f983aa97a866c209", + "bom-ref": "8fbffc2ee3168f6d", "name": "/usr/share/vim/vim91/syntax/master.vim", "type": "file" }, { - "bom-ref": "058f320904f73ade", + "bom-ref": "05fa6c08a50c3256", "name": "/usr/share/vim/vim91/syntax/matlab.vim", "type": "file" }, { - "bom-ref": "b25e565a4f7bf091", + "bom-ref": "c1e325ddbe5294f1", "name": "/usr/share/vim/vim91/syntax/maxima.vim", "type": "file" }, { - "bom-ref": "e8777f42170934af", + "bom-ref": "49a2ccd19c7e3757", "name": "/usr/share/vim/vim91/syntax/mel.vim", "type": "file" }, { - "bom-ref": "5f05d62f7abf9f67", + "bom-ref": "1d981ebacafffaef", "name": "/usr/share/vim/vim91/syntax/mermaid.vim", "type": "file" }, { - "bom-ref": "b40e334efbc642e6", + "bom-ref": "9094bbc35a912dca", "name": "/usr/share/vim/vim91/syntax/meson.vim", "type": "file" }, { - "bom-ref": "12daf3ba6c683f46", + "bom-ref": "00ed271b502f1692", "name": "/usr/share/vim/vim91/syntax/messages.vim", "type": "file" }, { - "bom-ref": "1a97d9ff066ca0bc", + "bom-ref": "9e13bf83981ea84c", "name": "/usr/share/vim/vim91/syntax/mf.vim", "type": "file" }, { - "bom-ref": "dec145af879e47e4", + "bom-ref": "df72c477f856e2ec", "name": "/usr/share/vim/vim91/syntax/mgl.vim", "type": "file" }, { - "bom-ref": "73fabea9eb0fdf16", + "bom-ref": "580b36d9480992f2", "name": "/usr/share/vim/vim91/syntax/mgp.vim", "type": "file" }, { - "bom-ref": "e7d13654ec3c4f8e", + "bom-ref": "9da932f4c5b08592", "name": "/usr/share/vim/vim91/syntax/mib.vim", "type": "file" }, { - "bom-ref": "278cbc24c90cfa46", + "bom-ref": "bffdaf140b44076e", "name": "/usr/share/vim/vim91/syntax/mix.vim", "type": "file" }, { - "bom-ref": "650678dc38774f23", + "bom-ref": "bfb1844f88304793", "name": "/usr/share/vim/vim91/syntax/mma.vim", "type": "file" }, { - "bom-ref": "cb459d3a56ee9dcc", + "bom-ref": "a00158637613f2a8", "name": "/usr/share/vim/vim91/syntax/mmix.vim", "type": "file" }, { - "bom-ref": "fdd7a228769219b2", + "bom-ref": "d2ee4708652576d6", "name": "/usr/share/vim/vim91/syntax/mmp.vim", "type": "file" }, { - "bom-ref": "d6f4a0d2923708b4", + "bom-ref": "aa4186aaa9318570", "name": "/usr/share/vim/vim91/syntax/modconf.vim", "type": "file" }, { - "bom-ref": "cee83c25a8051045", + "bom-ref": "b96c13cbfc2d0899", "name": "/usr/share/vim/vim91/syntax/model.vim", "type": "file" }, { - "bom-ref": "a8b7e0d8cdfe86be", + "bom-ref": "44c10cee6850b81e", "name": "/usr/share/vim/vim91/syntax/modsim3.vim", "type": "file" }, { - "bom-ref": "23b9f20a4a595ce0", + "bom-ref": "9a6db59664276f00", "name": "/usr/share/vim/vim91/syntax/modula2.vim", "type": "file" }, { - "bom-ref": "7bd593f0e81d48df", + "bom-ref": "e3eaec75bf679eef", "name": "/usr/share/vim/vim91/syntax/modula2/opt/iso.vim", "type": "file" }, { - "bom-ref": "b1d0b277fb8c10d8", + "bom-ref": "cb3a584b5c8b054c", "name": "/usr/share/vim/vim91/syntax/modula2/opt/pim.vim", "type": "file" }, { - "bom-ref": "dbb5bfcbb2d1bf0f", + "bom-ref": "cd20ad5cd06ea3b3", "name": "/usr/share/vim/vim91/syntax/modula2/opt/r10.vim", "type": "file" }, { - "bom-ref": "fe8fe1c418249f70", + "bom-ref": "dceb049c46ebef44", "name": "/usr/share/vim/vim91/syntax/modula3.vim", "type": "file" }, { - "bom-ref": "e8185c421af3dbcd", + "bom-ref": "26dab43d560e6999", "name": "/usr/share/vim/vim91/syntax/mojo.vim", "type": "file" }, { - "bom-ref": "ed8f6695c6b8c3a2", + "bom-ref": "d4bbdfcaee130a8e", "name": "/usr/share/vim/vim91/syntax/monk.vim", "type": "file" }, { - "bom-ref": "4c8fada9107adea3", + "bom-ref": "90b15ca808365447", "name": "/usr/share/vim/vim91/syntax/moo.vim", "type": "file" }, { - "bom-ref": "f76e5ab0a48e7bd4", + "bom-ref": "9e3ce2bfd9003bf0", "name": "/usr/share/vim/vim91/syntax/mp.vim", "type": "file" }, { - "bom-ref": "a7467dd984989884", + "bom-ref": "4efe904c4c0dd364", "name": "/usr/share/vim/vim91/syntax/mplayerconf.vim", "type": "file" }, { - "bom-ref": "428efe0232df6f7d", + "bom-ref": "249502ab04046dd5", "name": "/usr/share/vim/vim91/syntax/mrxvtrc.vim", "type": "file" }, { - "bom-ref": "3b563a6bec548711", + "bom-ref": "45aace849ea45b25", "name": "/usr/share/vim/vim91/syntax/msidl.vim", "type": "file" }, { - "bom-ref": "79d591ce8dae180f", + "bom-ref": "341bc800fd846823", "name": "/usr/share/vim/vim91/syntax/msmessages.vim", "type": "file" }, { - "bom-ref": "016cb0d13bc7c22e", + "bom-ref": "2303075ff1856fd2", "name": "/usr/share/vim/vim91/syntax/msql.vim", "type": "file" }, { - "bom-ref": "764667960ed7af71", + "bom-ref": "831357230b937bf9", "name": "/usr/share/vim/vim91/syntax/mupad.vim", "type": "file" }, { - "bom-ref": "25877f72535d5576", + "bom-ref": "bd3c6920e4315baa", "name": "/usr/share/vim/vim91/syntax/murphi.vim", "type": "file" }, { - "bom-ref": "9536403e836e0ed9", + "bom-ref": "5b04c6e166178761", "name": "/usr/share/vim/vim91/syntax/mush.vim", "type": "file" }, { - "bom-ref": "a3e3f25bfbbdd5f1", + "bom-ref": "4a5b3b4ff9ab0761", "name": "/usr/share/vim/vim91/syntax/muttrc.vim", "type": "file" }, { - "bom-ref": "2cd2dc37a9db8d30", + "bom-ref": "be7f595efc61e814", "name": "/usr/share/vim/vim91/syntax/mysql.vim", "type": "file" }, { - "bom-ref": "a45ba4d74e5276a9", + "bom-ref": "55e5414e36549ca9", "name": "/usr/share/vim/vim91/syntax/n1ql.vim", "type": "file" }, { - "bom-ref": "0409440d7c17e629", + "bom-ref": "79ec18b96e4621b9", "name": "/usr/share/vim/vim91/syntax/named.vim", "type": "file" }, { - "bom-ref": "2dc248db016daac8", + "bom-ref": "f9852d77a77d2648", "name": "/usr/share/vim/vim91/syntax/nanorc.vim", "type": "file" }, { - "bom-ref": "b5c4e0c30b25d0e3", + "bom-ref": "b5ad60619134082f", "name": "/usr/share/vim/vim91/syntax/nasm.vim", "type": "file" }, { - "bom-ref": "c57c1819faddf020", + "bom-ref": "b36f8a2dc1f7ab3c", "name": "/usr/share/vim/vim91/syntax/nastran.vim", "type": "file" }, { - "bom-ref": "ed75c41731d7a46b", + "bom-ref": "b1f744a217e82a63", "name": "/usr/share/vim/vim91/syntax/natural.vim", "type": "file" }, { - "bom-ref": "f9509e31436c7f90", + "bom-ref": "b39de015c3fbba24", "name": "/usr/share/vim/vim91/syntax/ncf.vim", "type": "file" }, { - "bom-ref": "e11b64de6a010c29", + "bom-ref": "1d9c8223c3c376f9", "name": "/usr/share/vim/vim91/syntax/neomuttrc.vim", "type": "file" }, { - "bom-ref": "5b265080ed8abc82", + "bom-ref": "f6873ba12b1dc1e6", "name": "/usr/share/vim/vim91/syntax/netrc.vim", "type": "file" }, { - "bom-ref": "d10045687689c706", + "bom-ref": "e5602bd2d6f02942", "name": "/usr/share/vim/vim91/syntax/netrw.vim", "type": "file" }, { - "bom-ref": "e9f0c35585d94e67", + "bom-ref": "e00dac728f5e72c7", "name": "/usr/share/vim/vim91/syntax/nginx.vim", "type": "file" }, { - "bom-ref": "9002d12770683841", + "bom-ref": "b4208370d4f57c41", "name": "/usr/share/vim/vim91/syntax/ninja.vim", "type": "file" }, { - "bom-ref": "24e644bb8fc95919", + "bom-ref": "aae1917b8ceae2b9", "name": "/usr/share/vim/vim91/syntax/nix.vim", "type": "file" }, { - "bom-ref": "faf06a711d6e5869", + "bom-ref": "977a1e811b51899d", "name": "/usr/share/vim/vim91/syntax/nosyntax.vim", "type": "file" }, { - "bom-ref": "ff613ccc2b95ced7", + "bom-ref": "d8f1c207e1802c7f", "name": "/usr/share/vim/vim91/syntax/nqc.vim", "type": "file" }, { - "bom-ref": "83dcc080652910a1", + "bom-ref": "9274cb1386cb64d9", "name": "/usr/share/vim/vim91/syntax/nroff.vim", "type": "file" }, { - "bom-ref": "911a4b1b0569c159", + "bom-ref": "4846b5ee4216ea69", "name": "/usr/share/vim/vim91/syntax/nsis.vim", "type": "file" }, { - "bom-ref": "1c0540c0c53a47ef", + "bom-ref": "fc437cd3e4c181ab", "name": "/usr/share/vim/vim91/syntax/obj.vim", "type": "file" }, { - "bom-ref": "98659e051425ab48", + "bom-ref": "0908ab29cbb2c880", "name": "/usr/share/vim/vim91/syntax/objc.vim", "type": "file" }, { - "bom-ref": "d0cef727b0aaf4cb", + "bom-ref": "9156c7f8d14d353f", "name": "/usr/share/vim/vim91/syntax/objcpp.vim", "type": "file" }, { - "bom-ref": "f978dbe4728a3c2e", + "bom-ref": "d32a88f1fbb6b3ae", "name": "/usr/share/vim/vim91/syntax/obse.vim", "type": "file" }, { - "bom-ref": "577d7cd60d50b5ac", + "bom-ref": "24ba0e696d946ecc", "name": "/usr/share/vim/vim91/syntax/ocaml.vim", "type": "file" }, { - "bom-ref": "69bf84f2bd1c3f54", + "bom-ref": "5c69f38801ad8500", "name": "/usr/share/vim/vim91/syntax/occam.vim", "type": "file" }, { - "bom-ref": "9961bc1e88472a98", + "bom-ref": "83d9cb521190478c", "name": "/usr/share/vim/vim91/syntax/omnimark.vim", "type": "file" }, { - "bom-ref": "1f7f6ea68b58f48c", + "bom-ref": "5e035ec1623c72f4", "name": "/usr/share/vim/vim91/syntax/opam.vim", "type": "file" }, { - "bom-ref": "acc676d5f4f71e47", + "bom-ref": "661d7a0014d2973f", "name": "/usr/share/vim/vim91/syntax/openroad.vim", "type": "file" }, { - "bom-ref": "f750c8172acaadfd", + "bom-ref": "79761cab79735895", "name": "/usr/share/vim/vim91/syntax/openscad.vim", "type": "file" }, { - "bom-ref": "9006b413133240ff", + "bom-ref": "5ebed86f4c015d17", "name": "/usr/share/vim/vim91/syntax/openvpn.vim", "type": "file" }, { - "bom-ref": "d1382a2d73d45196", + "bom-ref": "81ecd58231998d5e", "name": "/usr/share/vim/vim91/syntax/opl.vim", "type": "file" }, { - "bom-ref": "807aefab31f06a02", + "bom-ref": "beb6b919e227bba2", "name": "/usr/share/vim/vim91/syntax/ora.vim", "type": "file" }, { - "bom-ref": "d002ad8b3d6a1e73", + "bom-ref": "87ea6a0bbf9e11db", "name": "/usr/share/vim/vim91/syntax/pacmanlog.vim", "type": "file" }, { - "bom-ref": "558ea3613dc4ac01", + "bom-ref": "1fe73dce25aaae8d", "name": "/usr/share/vim/vim91/syntax/pamconf.vim", "type": "file" }, { - "bom-ref": "76b0952d53d2611a", + "bom-ref": "7c5ce3533d50db3a", "name": "/usr/share/vim/vim91/syntax/pamenv.vim", "type": "file" }, { - "bom-ref": "eb68f84fe971903c", + "bom-ref": "73da2be9be26c788", "name": "/usr/share/vim/vim91/syntax/papp.vim", "type": "file" }, { - "bom-ref": "ead70345a3b78a05", + "bom-ref": "ea99cad31ad0f401", "name": "/usr/share/vim/vim91/syntax/pascal.vim", "type": "file" }, { - "bom-ref": "f6e387adbec3c6cb", + "bom-ref": "90e472d6b042667b", "name": "/usr/share/vim/vim91/syntax/passwd.vim", "type": "file" }, { - "bom-ref": "6c311def6961dff1", + "bom-ref": "ad269b75f855b8d9", "name": "/usr/share/vim/vim91/syntax/pbtxt.vim", "type": "file" }, { - "bom-ref": "24d2e11d385197b6", + "bom-ref": "3afb2b12653ad2da", "name": "/usr/share/vim/vim91/syntax/pcap.vim", "type": "file" }, { - "bom-ref": "26e09338a9e976e5", + "bom-ref": "0e93cd9673b6ae05", "name": "/usr/share/vim/vim91/syntax/pccts.vim", "type": "file" }, { - "bom-ref": "db53f1af8e03d75a", + "bom-ref": "801818a4986c23de", "name": "/usr/share/vim/vim91/syntax/pdf.vim", "type": "file" }, { - "bom-ref": "cc0ae37859afcdbb", + "bom-ref": "d5dfbd0297c37b23", "name": "/usr/share/vim/vim91/syntax/perl.vim", "type": "file" }, { - "bom-ref": "c5e8f0555e57067d", + "bom-ref": "7ab5f4ebfbec2489", "name": "/usr/share/vim/vim91/syntax/pf.vim", "type": "file" }, { - "bom-ref": "9e7694db904ed43f", + "bom-ref": "b5942ea5f3108027", "name": "/usr/share/vim/vim91/syntax/pfmain.vim", "type": "file" }, { - "bom-ref": "fa41fcee0d0cef7d", + "bom-ref": "71b3e381e9da0015", "name": "/usr/share/vim/vim91/syntax/php.vim", "type": "file" }, { - "bom-ref": "aaee6216a79fea4d", + "bom-ref": "5989088e735bf445", "name": "/usr/share/vim/vim91/syntax/phtml.vim", "type": "file" }, { - "bom-ref": "dc59df9fb73ebecb", + "bom-ref": "3f6a76880a9401d7", "name": "/usr/share/vim/vim91/syntax/pic.vim", "type": "file" }, { - "bom-ref": "9fce4dc5f80787a8", + "bom-ref": "76b3597e67a74654", "name": "/usr/share/vim/vim91/syntax/pike.vim", "type": "file" }, { - "bom-ref": "c83f8419c26d630e", + "bom-ref": "bdd0f55998a308aa", "name": "/usr/share/vim/vim91/syntax/pilrc.vim", "type": "file" }, { - "bom-ref": "c00b910d0ad8ec2d", + "bom-ref": "e03777afaab64769", "name": "/usr/share/vim/vim91/syntax/pine.vim", "type": "file" }, { - "bom-ref": "e90bcfcac7840a1b", + "bom-ref": "462f7e52dbecfaef", "name": "/usr/share/vim/vim91/syntax/pinfo.vim", "type": "file" }, { - "bom-ref": "384f45180ee0e1dc", + "bom-ref": "15c3806f779165a8", "name": "/usr/share/vim/vim91/syntax/plaintex.vim", "type": "file" }, { - "bom-ref": "f6668b00a7c60510", + "bom-ref": "7af63d292e723d2c", "name": "/usr/share/vim/vim91/syntax/pli.vim", "type": "file" }, { - "bom-ref": "c9d2a50ccd2e7210", + "bom-ref": "52d4b113b2ab0b14", "name": "/usr/share/vim/vim91/syntax/plm.vim", "type": "file" }, { - "bom-ref": "3a9f13bde71f48f0", + "bom-ref": "b2d49f1dd90ed554", "name": "/usr/share/vim/vim91/syntax/plp.vim", "type": "file" }, { - "bom-ref": "420cd5b41147beee", + "bom-ref": "059cfb6b16ffc2e2", "name": "/usr/share/vim/vim91/syntax/plsql.vim", "type": "file" }, { - "bom-ref": "8cbd8d555095c432", + "bom-ref": "121f4857f85ceaaa", "name": "/usr/share/vim/vim91/syntax/po.vim", "type": "file" }, { - "bom-ref": "fcd8dee8edfd4dae", + "bom-ref": "183259e7a5794ede", "name": "/usr/share/vim/vim91/syntax/pod.vim", "type": "file" }, { - "bom-ref": "ea35c22e16d5aed8", + "bom-ref": "a56c458dadc4a620", "name": "/usr/share/vim/vim91/syntax/poefilter.vim", "type": "file" }, { - "bom-ref": "be90ea6f8320e480", + "bom-ref": "79a2cd793f1ae3d8", "name": "/usr/share/vim/vim91/syntax/poke.vim", "type": "file" }, { - "bom-ref": "a8a89b134e46cabc", + "bom-ref": "9a279271e77b8074", "name": "/usr/share/vim/vim91/syntax/postscr.vim", "type": "file" }, { - "bom-ref": "44565bc14ca921e8", + "bom-ref": "b91be533e70360b0", "name": "/usr/share/vim/vim91/syntax/pov.vim", "type": "file" }, { - "bom-ref": "e2a7b7b9e0f2051e", + "bom-ref": "a9b7812d98d70a52", "name": "/usr/share/vim/vim91/syntax/povini.vim", "type": "file" }, { - "bom-ref": "a01bb79524cf5e60", + "bom-ref": "0366cf1a211f90dc", "name": "/usr/share/vim/vim91/syntax/ppd.vim", "type": "file" }, { - "bom-ref": "9d2b872a7c70b6c0", + "bom-ref": "c3073145dbcbfc68", "name": "/usr/share/vim/vim91/syntax/ppwiz.vim", "type": "file" }, { - "bom-ref": "b2cbdba043cf8bae", + "bom-ref": "20a4c8381aa4c586", "name": "/usr/share/vim/vim91/syntax/prescribe.vim", "type": "file" }, { - "bom-ref": "4e86692d7d5a0236", + "bom-ref": "a57ee463cd19007e", "name": "/usr/share/vim/vim91/syntax/privoxy.vim", "type": "file" }, { - "bom-ref": "3817cb7e6d6891b9", + "bom-ref": "1ad76c7946d9a7e5", "name": "/usr/share/vim/vim91/syntax/procmail.vim", "type": "file" }, { - "bom-ref": "83d1dcaacc37ca46", + "bom-ref": "8e3185226e6dc98a", "name": "/usr/share/vim/vim91/syntax/progress.vim", "type": "file" }, { - "bom-ref": "409a3354183f1d24", + "bom-ref": "43d002b44f06c7c0", "name": "/usr/share/vim/vim91/syntax/prolog.vim", "type": "file" }, { - "bom-ref": "d2a12cbd326a65f8", + "bom-ref": "fcd38520bbda9ca0", "name": "/usr/share/vim/vim91/syntax/promela.vim", "type": "file" }, { - "bom-ref": "c00e0f1045efe33f", + "bom-ref": "dcfded91baf8110f", "name": "/usr/share/vim/vim91/syntax/proto.vim", "type": "file" }, { - "bom-ref": "accff9422b93ef2b", + "bom-ref": "1e6ff9afca1532f3", "name": "/usr/share/vim/vim91/syntax/protocols.vim", "type": "file" }, { - "bom-ref": "c3c85252e6c95f1f", + "bom-ref": "b4975f576aefd3bb", "name": "/usr/share/vim/vim91/syntax/ps1.vim", "type": "file" }, { - "bom-ref": "40a3f1831e947097", + "bom-ref": "db463ef87807744b", "name": "/usr/share/vim/vim91/syntax/ps1xml.vim", "type": "file" }, { - "bom-ref": "cf242b5fa6c8ddd0", + "bom-ref": "397a46944deb36dc", "name": "/usr/share/vim/vim91/syntax/psf.vim", "type": "file" }, { - "bom-ref": "3a39de0d1bb8191e", + "bom-ref": "666e5c7911b74be2", "name": "/usr/share/vim/vim91/syntax/psl.vim", "type": "file" }, { - "bom-ref": "0f23943f1580df5b", + "bom-ref": "da5d876a40ef9f13", "name": "/usr/share/vim/vim91/syntax/ptcap.vim", "type": "file" }, { - "bom-ref": "d34c2c68ad876ca7", + "bom-ref": "3d45087c1f58eda3", "name": "/usr/share/vim/vim91/syntax/purifylog.vim", "type": "file" }, { - "bom-ref": "24030895f411a0ad", + "bom-ref": "518c4fcd79657ba1", "name": "/usr/share/vim/vim91/syntax/pymanifest.vim", "type": "file" }, { - "bom-ref": "76589271f162deac", + "bom-ref": "754420f5cb52a838", "name": "/usr/share/vim/vim91/syntax/pyrex.vim", "type": "file" }, { - "bom-ref": "4c7161c688473f0d", + "bom-ref": "685e26c0de8ab515", "name": "/usr/share/vim/vim91/syntax/python.vim", "type": "file" }, { - "bom-ref": "0dc12500f388e9f8", + "bom-ref": "ba66baba1469d098", "name": "/usr/share/vim/vim91/syntax/python2.vim", "type": "file" }, { - "bom-ref": "4b66e8c407bd63cd", + "bom-ref": "6e4310700cc056fd", "name": "/usr/share/vim/vim91/syntax/qb64.vim", "type": "file" }, { - "bom-ref": "70e5d49c93ce798c", + "bom-ref": "51ed5a32d3e26f94", "name": "/usr/share/vim/vim91/syntax/qf.vim", "type": "file" }, { - "bom-ref": "b005ab168841f88b", + "bom-ref": "87bfe60c9f6b19af", "name": "/usr/share/vim/vim91/syntax/qml.vim", "type": "file" }, { - "bom-ref": "f6317b650cfeabc6", + "bom-ref": "3703f9fea200fb3a", "name": "/usr/share/vim/vim91/syntax/quake.vim", "type": "file" }, { - "bom-ref": "38461b2599a217f3", + "bom-ref": "d4fcf097c0d2d04b", "name": "/usr/share/vim/vim91/syntax/quarto.vim", "type": "file" }, { - "bom-ref": "1b54e96635cfbdd5", + "bom-ref": "4e831b346c409c81", "name": "/usr/share/vim/vim91/syntax/r.vim", "type": "file" }, { - "bom-ref": "e2f686648c3c4a64", + "bom-ref": "a8a9d537377114d8", "name": "/usr/share/vim/vim91/syntax/racc.vim", "type": "file" }, { - "bom-ref": "72cd1d4a3b157377", + "bom-ref": "506b401c7d05a893", "name": "/usr/share/vim/vim91/syntax/racket.vim", "type": "file" }, { - "bom-ref": "0e98fa7fb9cdbb53", + "bom-ref": "abf379f5a53329b7", "name": "/usr/share/vim/vim91/syntax/radiance.vim", "type": "file" }, { - "bom-ref": "514869754b2d203d", + "bom-ref": "dd84b1457b2af389", "name": "/usr/share/vim/vim91/syntax/raku.vim", "type": "file" }, { - "bom-ref": "aee459b8e83a927c", + "bom-ref": "a3fbd24ae23752d0", "name": "/usr/share/vim/vim91/syntax/raml.vim", "type": "file" }, { - "bom-ref": "74459cb93c9b5a24", + "bom-ref": "39d96bf4c7c38524", "name": "/usr/share/vim/vim91/syntax/rapid.vim", "type": "file" }, { - "bom-ref": "42aa6825d1c49c0b", + "bom-ref": "0eaeb128e5d0a56f", "name": "/usr/share/vim/vim91/syntax/ratpoison.vim", "type": "file" }, { - "bom-ref": "8ccdbfa8d11db211", + "bom-ref": "7274d31a5269a841", "name": "/usr/share/vim/vim91/syntax/rc.vim", "type": "file" }, { - "bom-ref": "972e3e2e904c4a8e", + "bom-ref": "0a1a8f0f4783dbaa", "name": "/usr/share/vim/vim91/syntax/rcs.vim", "type": "file" }, { - "bom-ref": "7d113e188562f7c5", + "bom-ref": "4fa05a4b05625191", "name": "/usr/share/vim/vim91/syntax/rcslog.vim", "type": "file" }, { - "bom-ref": "34f6b2278c00458c", + "bom-ref": "3e29a79db3e9dc24", "name": "/usr/share/vim/vim91/syntax/readline.vim", "type": "file" }, { - "bom-ref": "084c7724de9c7225", + "bom-ref": "e78d05290880c3f5", "name": "/usr/share/vim/vim91/syntax/rebol.vim", "type": "file" }, { - "bom-ref": "4fc1e34812380822", + "bom-ref": "9576b642341e6c22", "name": "/usr/share/vim/vim91/syntax/redif.vim", "type": "file" }, { - "bom-ref": "af22b2a6cbbe3d77", + "bom-ref": "d660b3965afd08b7", "name": "/usr/share/vim/vim91/syntax/registry.vim", "type": "file" }, { - "bom-ref": "aaa186a7463e6497", + "bom-ref": "6f6c861dce305ed3", "name": "/usr/share/vim/vim91/syntax/rego.vim", "type": "file" }, { - "bom-ref": "f1727adcbc162e3e", + "bom-ref": "c37536bfbaa5cdae", "name": "/usr/share/vim/vim91/syntax/remind.vim", "type": "file" }, { - "bom-ref": "f8b0fe7ffd6b0025", + "bom-ref": "a2d10f154fcfbf0d", "name": "/usr/share/vim/vim91/syntax/resolv.vim", "type": "file" }, { - "bom-ref": "348c17c17d2d3bcd", + "bom-ref": "dd21a819ef095b91", "name": "/usr/share/vim/vim91/syntax/reva.vim", "type": "file" }, { - "bom-ref": "7dab07db61facb1e", + "bom-ref": "537995706cc68022", "name": "/usr/share/vim/vim91/syntax/rexx.vim", "type": "file" }, { - "bom-ref": "147bbb791186e75c", + "bom-ref": "b953a01983cc6878", "name": "/usr/share/vim/vim91/syntax/rhelp.vim", "type": "file" }, { - "bom-ref": "dbcefeab5af6a790", + "bom-ref": "8473c28a2f8c5a0c", "name": "/usr/share/vim/vim91/syntax/rib.vim", "type": "file" }, { - "bom-ref": "d87c15c86ed64ee4", + "bom-ref": "11611b3a9f2c8440", "name": "/usr/share/vim/vim91/syntax/rmd.vim", "type": "file" }, { - "bom-ref": "c817fc5ce71d9b54", + "bom-ref": "7dd9d82ba7b6ef98", "name": "/usr/share/vim/vim91/syntax/rnc.vim", "type": "file" }, { - "bom-ref": "cda72a6758197c60", + "bom-ref": "c4c9058eee0507cc", "name": "/usr/share/vim/vim91/syntax/rng.vim", "type": "file" }, { - "bom-ref": "a7517ba0cb206342", + "bom-ref": "64c49b23af98a5ae", "name": "/usr/share/vim/vim91/syntax/rnoweb.vim", "type": "file" }, { - "bom-ref": "59b52bcd4a5f0b92", + "bom-ref": "fc778399815bc092", "name": "/usr/share/vim/vim91/syntax/robots.vim", "type": "file" }, { - "bom-ref": "992b58f53ebd1021", + "bom-ref": "134bf7e183617b0d", "name": "/usr/share/vim/vim91/syntax/routeros.vim", "type": "file" }, { - "bom-ref": "6bb7e5255111dee3", + "bom-ref": "be63f712c9004a93", "name": "/usr/share/vim/vim91/syntax/rpcgen.vim", "type": "file" }, { - "bom-ref": "9fc88c95bb10ea2a", + "bom-ref": "24b8950d8d1897da", "name": "/usr/share/vim/vim91/syntax/rpl.vim", "type": "file" }, { - "bom-ref": "19d124fafd2cad55", + "bom-ref": "aaa01e37fdd5a539", "name": "/usr/share/vim/vim91/syntax/rrst.vim", "type": "file" }, { - "bom-ref": "9f4ebc13ad1b71a0", + "bom-ref": "4a305ff8adcfb888", "name": "/usr/share/vim/vim91/syntax/rst.vim", "type": "file" }, { - "bom-ref": "a442ac16e6f95af4", + "bom-ref": "994b61ebc94ffd38", "name": "/usr/share/vim/vim91/syntax/rtf.vim", "type": "file" }, { - "bom-ref": "aee3df891ac7071b", + "bom-ref": "49db332d6d385c5f", "name": "/usr/share/vim/vim91/syntax/ruby.vim", "type": "file" }, { - "bom-ref": "00b3034da1205d1c", + "bom-ref": "1a92a1f6b7269488", "name": "/usr/share/vim/vim91/syntax/rust.vim", "type": "file" }, { - "bom-ref": "770909880617ef77", + "bom-ref": "d45bf060578d2587", "name": "/usr/share/vim/vim91/syntax/samba.vim", "type": "file" }, { - "bom-ref": "3b6ebfe41f6c2eb4", + "bom-ref": "a41a8f7c194779b4", "name": "/usr/share/vim/vim91/syntax/sas.vim", "type": "file" }, { - "bom-ref": "864859bee733d561", + "bom-ref": "32f81426af6cb2f9", "name": "/usr/share/vim/vim91/syntax/sass.vim", "type": "file" }, { - "bom-ref": "64239e3938bd803e", + "bom-ref": "716b6c82de435bee", "name": "/usr/share/vim/vim91/syntax/sather.vim", "type": "file" }, { - "bom-ref": "400a2a1556ff5588", + "bom-ref": "8e7d68bbb9a86cc0", "name": "/usr/share/vim/vim91/syntax/sbt.vim", "type": "file" }, { - "bom-ref": "00e9eb4b57f08a88", + "bom-ref": "2724876d8ef1e7c0", "name": "/usr/share/vim/vim91/syntax/scala.vim", "type": "file" }, { - "bom-ref": "8b2e23ea8c14a66d", + "bom-ref": "c2fae4b186fff569", "name": "/usr/share/vim/vim91/syntax/scdoc.vim", "type": "file" }, { - "bom-ref": "961e99a8f7d920c3", + "bom-ref": "e15ee1ea85dfa81f", "name": "/usr/share/vim/vim91/syntax/scheme.vim", "type": "file" }, { - "bom-ref": "bc1e7ef5a5e29602", + "bom-ref": "246c1ebf9befa812", "name": "/usr/share/vim/vim91/syntax/scilab.vim", "type": "file" }, { - "bom-ref": "6d4b9ed4e283ee74", + "bom-ref": "0b1edc6175f59780", "name": "/usr/share/vim/vim91/syntax/screen.vim", "type": "file" }, { - "bom-ref": "0eff1b60269b27ab", + "bom-ref": "755926e3a9f9bed7", "name": "/usr/share/vim/vim91/syntax/scss.vim", "type": "file" }, { - "bom-ref": "d3ebb96c6856fa45", + "bom-ref": "7b77118d21ba891d", "name": "/usr/share/vim/vim91/syntax/sd.vim", "type": "file" }, { - "bom-ref": "de890dbd1e757449", + "bom-ref": "fb33d6eb76349511", "name": "/usr/share/vim/vim91/syntax/sdc.vim", "type": "file" }, { - "bom-ref": "342e32606dd7a466", + "bom-ref": "afdd28fa7cf11886", "name": "/usr/share/vim/vim91/syntax/sdl.vim", "type": "file" }, { - "bom-ref": "4dbc72e7265e6024", + "bom-ref": "f43930b8272eef68", "name": "/usr/share/vim/vim91/syntax/sed.vim", "type": "file" }, { - "bom-ref": "f97bbafa56a0ee18", + "bom-ref": "6c2c5aa435b34fe8", "name": "/usr/share/vim/vim91/syntax/sendpr.vim", "type": "file" }, { - "bom-ref": "14060b22f4684858", + "bom-ref": "8458144522594294", "name": "/usr/share/vim/vim91/syntax/sensors.vim", "type": "file" }, { - "bom-ref": "93c4be1906042d95", + "bom-ref": "5ff2fa2ff3662d11", "name": "/usr/share/vim/vim91/syntax/services.vim", "type": "file" }, { - "bom-ref": "593d831c590e9553", + "bom-ref": "d928fb677e9263cb", "name": "/usr/share/vim/vim91/syntax/setserial.vim", "type": "file" }, { - "bom-ref": "ba283fd1280769ae", + "bom-ref": "3bd9eed4b2fd208a", "name": "/usr/share/vim/vim91/syntax/sexplib.vim", "type": "file" }, { - "bom-ref": "3ec6e136cb58e72d", + "bom-ref": "6ca8544c71106e11", "name": "/usr/share/vim/vim91/syntax/sgml.vim", "type": "file" }, { - "bom-ref": "99cefaa53a0ffef0", + "bom-ref": "08f82839f6e763bc", "name": "/usr/share/vim/vim91/syntax/sgmldecl.vim", "type": "file" }, { - "bom-ref": "2f0b26c288f4e6de", + "bom-ref": "8b69ece85440cc8a", "name": "/usr/share/vim/vim91/syntax/sgmllnx.vim", "type": "file" }, { - "bom-ref": "16de16d431142c8a", + "bom-ref": "31f9855c7fee7b42", "name": "/usr/share/vim/vim91/syntax/sh.vim", "type": "file" }, { - "bom-ref": "d9f5b8b74c6e7214", + "bom-ref": "bf4e03c78ba39eb8", "name": "/usr/share/vim/vim91/syntax/shared/context-data-context.vim", "type": "file" }, { - "bom-ref": "05e76be572251809", + "bom-ref": "31c5b271eb2db3a9", "name": "/usr/share/vim/vim91/syntax/shared/context-data-interfaces.vim", "type": "file" }, { - "bom-ref": "6615d6afb5f60fed", + "bom-ref": "046127978efab191", "name": "/usr/share/vim/vim91/syntax/shared/context-data-metafun.vim", "type": "file" }, { - "bom-ref": "c951e0a2c885a870", + "bom-ref": "fdbc3a3a3d696020", "name": "/usr/share/vim/vim91/syntax/shared/context-data-tex.vim", "type": "file" }, { - "bom-ref": "598fe3e72abc28d7", + "bom-ref": "3110a28210e54c2f", "name": "/usr/share/vim/vim91/syntax/shared/debversions.vim", "type": "file" }, { - "bom-ref": "08f587c595bf218f", + "bom-ref": "0d6d7ed4e2f761af", "name": "/usr/share/vim/vim91/syntax/shared/hgcommitDiff.vim", "type": "file" }, { - "bom-ref": "607ece072f30ec98", + "bom-ref": "0e1dc2069df4ec38", "name": "/usr/share/vim/vim91/syntax/shared/typescriptcommon.vim", "type": "file" }, { - "bom-ref": "7cd1e1fe5d6851d8", + "bom-ref": "af120db40d5ec4ec", "name": "/usr/share/vim/vim91/syntax/sicad.vim", "type": "file" }, { - "bom-ref": "0523f1d1b11ab513", + "bom-ref": "14b766500f19c98b", "name": "/usr/share/vim/vim91/syntax/sieve.vim", "type": "file" }, { - "bom-ref": "c55eac49714176b1", + "bom-ref": "39b5f280b6fc8285", "name": "/usr/share/vim/vim91/syntax/sil.vim", "type": "file" }, { - "bom-ref": "85d5b2494f9ce05b", + "bom-ref": "11f93873048ce217", "name": "/usr/share/vim/vim91/syntax/simula.vim", "type": "file" }, { - "bom-ref": "d6cf31dfb1078252", + "bom-ref": "bf7c0ef1a12c03c2", "name": "/usr/share/vim/vim91/syntax/sinda.vim", "type": "file" }, { - "bom-ref": "0938f10740d41411", + "bom-ref": "7d40f763d1cecf8d", "name": "/usr/share/vim/vim91/syntax/sindacmp.vim", "type": "file" }, { - "bom-ref": "409dcd82bcad57b8", + "bom-ref": "3ee5cde265e07b58", "name": "/usr/share/vim/vim91/syntax/sindaout.vim", "type": "file" }, { - "bom-ref": "eb5aa3ad57f784dc", + "bom-ref": "a2da95fc75ba1a08", "name": "/usr/share/vim/vim91/syntax/sisu.vim", "type": "file" }, { - "bom-ref": "d56b690a88857a34", + "bom-ref": "d913794fa9db9810", "name": "/usr/share/vim/vim91/syntax/skill.vim", "type": "file" }, { - "bom-ref": "b28eec9204274e10", + "bom-ref": "d011effa8a318af0", "name": "/usr/share/vim/vim91/syntax/sl.vim", "type": "file" }, { - "bom-ref": "079cc31ad1da4dc9", + "bom-ref": "1c450d6cb0060d11", "name": "/usr/share/vim/vim91/syntax/slang.vim", "type": "file" }, { - "bom-ref": "31cca22b29b5f2c1", + "bom-ref": "4941c319021a96f1", "name": "/usr/share/vim/vim91/syntax/slice.vim", "type": "file" }, { - "bom-ref": "27e2c03f041c3b27", + "bom-ref": "2cc4f9ef77b8c3af", "name": "/usr/share/vim/vim91/syntax/slpconf.vim", "type": "file" }, { - "bom-ref": "5efa8240e0e5cc92", + "bom-ref": "153607cb5818c59e", "name": "/usr/share/vim/vim91/syntax/slpreg.vim", "type": "file" }, { - "bom-ref": "8d4bbe63f89aafef", + "bom-ref": "aaee6a2390303cd3", "name": "/usr/share/vim/vim91/syntax/slpspi.vim", "type": "file" }, { - "bom-ref": "f96fe45ee8b933b2", + "bom-ref": "e841cb66b2d2a9c2", "name": "/usr/share/vim/vim91/syntax/slrnrc.vim", "type": "file" }, { - "bom-ref": "8da6aacccc26038b", + "bom-ref": "97855996dd08f21b", "name": "/usr/share/vim/vim91/syntax/slrnsc.vim", "type": "file" }, { - "bom-ref": "81e5ca11313764ca", + "bom-ref": "0913199ff6bbad02", "name": "/usr/share/vim/vim91/syntax/sm.vim", "type": "file" }, { - "bom-ref": "654c666ed61b5423", + "bom-ref": "44dd048e97917907", "name": "/usr/share/vim/vim91/syntax/smarty.vim", "type": "file" }, { - "bom-ref": "eaab8cdc8c7d3aae", + "bom-ref": "d0c34b810edbc772", "name": "/usr/share/vim/vim91/syntax/smcl.vim", "type": "file" }, { - "bom-ref": "59db153394fca9bb", + "bom-ref": "d406b14bf86ac777", "name": "/usr/share/vim/vim91/syntax/smil.vim", "type": "file" }, { - "bom-ref": "2f6ff00a734b8a00", + "bom-ref": "61adfdc63a608798", "name": "/usr/share/vim/vim91/syntax/smith.vim", "type": "file" }, { - "bom-ref": "d382ff302c906ac3", + "bom-ref": "1e6f7fb0871d0cc3", "name": "/usr/share/vim/vim91/syntax/sml.vim", "type": "file" }, { - "bom-ref": "0a72ce357e8e2acb", + "bom-ref": "d7f25609f238b3cb", "name": "/usr/share/vim/vim91/syntax/snnsnet.vim", "type": "file" }, { - "bom-ref": "13d36879afa32b3d", + "bom-ref": "e14414281b4409d5", "name": "/usr/share/vim/vim91/syntax/snnspat.vim", "type": "file" }, { - "bom-ref": "8c4728e290c9dcdb", + "bom-ref": "e0ae2e375e97d873", "name": "/usr/share/vim/vim91/syntax/snnsres.vim", "type": "file" }, { - "bom-ref": "1f5df186c6680084", + "bom-ref": "ceacbd7dc65c51f8", "name": "/usr/share/vim/vim91/syntax/snobol4.vim", "type": "file" }, { - "bom-ref": "83d0e96cec5787f3", + "bom-ref": "2300ce5bdba810f7", "name": "/usr/share/vim/vim91/syntax/solidity.vim", "type": "file" }, { - "bom-ref": "974c021bc326a543", + "bom-ref": "32926201f5d19867", "name": "/usr/share/vim/vim91/syntax/spec.vim", "type": "file" }, { - "bom-ref": "6f2ed78053b9c727", + "bom-ref": "643efec4662be063", "name": "/usr/share/vim/vim91/syntax/specman.vim", "type": "file" }, { - "bom-ref": "2dcc0a83fde7deee", + "bom-ref": "68044fd51740c862", "name": "/usr/share/vim/vim91/syntax/spice.vim", "type": "file" }, { - "bom-ref": "2c5b2dfbe6666823", + "bom-ref": "cedd4bfdebc2f6e7", "name": "/usr/share/vim/vim91/syntax/splint.vim", "type": "file" }, { - "bom-ref": "6cecf1bf3e6de624", + "bom-ref": "fbec54c0b47106c8", "name": "/usr/share/vim/vim91/syntax/spup.vim", "type": "file" }, { - "bom-ref": "d081865abed229cb", + "bom-ref": "736c4c991ab48a23", "name": "/usr/share/vim/vim91/syntax/spyce.vim", "type": "file" }, { - "bom-ref": "4ccfddfb38057511", + "bom-ref": "94d547076e5b1cc9", "name": "/usr/share/vim/vim91/syntax/sql.vim", "type": "file" }, { - "bom-ref": "f5de626ce61cc731", + "bom-ref": "2e136198831d4b59", "name": "/usr/share/vim/vim91/syntax/sqlanywhere.vim", "type": "file" }, { - "bom-ref": "019effed5afef5a3", + "bom-ref": "8382d2ba7ef4a247", "name": "/usr/share/vim/vim91/syntax/sqlforms.vim", "type": "file" }, { - "bom-ref": "889d0a123616f919", + "bom-ref": "49f4aed86519fce9", "name": "/usr/share/vim/vim91/syntax/sqlhana.vim", "type": "file" }, { - "bom-ref": "27809e7344fb9dc2", + "bom-ref": "51c230971da7a84e", "name": "/usr/share/vim/vim91/syntax/sqlinformix.vim", "type": "file" }, { - "bom-ref": "ad924ece40c1eccd", + "bom-ref": "bb44e153038e1541", "name": "/usr/share/vim/vim91/syntax/sqlj.vim", "type": "file" }, { - "bom-ref": "a949efbfbe0a707f", + "bom-ref": "bb7bc2d00674680f", "name": "/usr/share/vim/vim91/syntax/sqloracle.vim", "type": "file" }, { - "bom-ref": "68b46e39b7a0321f", + "bom-ref": "a8dddbba977d5717", "name": "/usr/share/vim/vim91/syntax/sqr.vim", "type": "file" }, { - "bom-ref": "6c4d2858f09721bd", + "bom-ref": "9ccf9c4801fe1569", "name": "/usr/share/vim/vim91/syntax/squid.vim", "type": "file" }, { - "bom-ref": "1d4f453026896e99", + "bom-ref": "4aef85bf28da7a79", "name": "/usr/share/vim/vim91/syntax/squirrel.vim", "type": "file" }, { - "bom-ref": "17bd6db1ce9797f7", + "bom-ref": "23ad12e144d02bc3", "name": "/usr/share/vim/vim91/syntax/srec.vim", "type": "file" }, { - "bom-ref": "90d6cd9c2b994f75", + "bom-ref": "14126bc6a5be2181", "name": "/usr/share/vim/vim91/syntax/srt.vim", "type": "file" }, { - "bom-ref": "0cdbe5104b1d734f", + "bom-ref": "d00191a499b9c4f3", "name": "/usr/share/vim/vim91/syntax/ssa.vim", "type": "file" }, { - "bom-ref": "c85cb64829425163", + "bom-ref": "0bb429fb66a593a7", "name": "/usr/share/vim/vim91/syntax/sshconfig.vim", "type": "file" }, { - "bom-ref": "c0042769c59003c9", + "bom-ref": "d9dee8f1f4c33085", "name": "/usr/share/vim/vim91/syntax/sshdconfig.vim", "type": "file" }, { - "bom-ref": "641f53eaa02c4cf6", + "bom-ref": "d9b5ef4f4a0b8142", "name": "/usr/share/vim/vim91/syntax/st.vim", "type": "file" }, { - "bom-ref": "668fd3a03f0fc36f", + "bom-ref": "ff24da5aa8d1d407", "name": "/usr/share/vim/vim91/syntax/stata.vim", "type": "file" }, { - "bom-ref": "ac316da0b2a38ef9", + "bom-ref": "6c281caeec9e7f95", "name": "/usr/share/vim/vim91/syntax/stp.vim", "type": "file" }, { - "bom-ref": "733839bf61631bef", + "bom-ref": "4afa3b9d137946b3", "name": "/usr/share/vim/vim91/syntax/strace.vim", "type": "file" }, { - "bom-ref": "019932ff1210ceb9", + "bom-ref": "eafa9418cfd21239", "name": "/usr/share/vim/vim91/syntax/structurizr.vim", "type": "file" }, { - "bom-ref": "5d9dcc875de0bedd", + "bom-ref": "4309d439e9eaafed", "name": "/usr/share/vim/vim91/syntax/sudoers.vim", "type": "file" }, { - "bom-ref": "c6bec2343cd40cf8", + "bom-ref": "c6ddb8cbb891b970", "name": "/usr/share/vim/vim91/syntax/svg.vim", "type": "file" }, { - "bom-ref": "6d7fcf6bcd5816c3", + "bom-ref": "372cb4ae2e3fae27", "name": "/usr/share/vim/vim91/syntax/svn.vim", "type": "file" }, { - "bom-ref": "1346565a8c657c28", + "bom-ref": "6fd39fa02df66fc0", "name": "/usr/share/vim/vim91/syntax/swayconfig.vim", "type": "file" }, { - "bom-ref": "5f59903c097146dd", + "bom-ref": "d69d11648ce06029", "name": "/usr/share/vim/vim91/syntax/swift.vim", "type": "file" }, { - "bom-ref": "4467fb60e359c5f2", + "bom-ref": "c5bbdb5c22f8a74a", "name": "/usr/share/vim/vim91/syntax/swiftgyb.vim", "type": "file" }, { - "bom-ref": "add90ea89192f92c", + "bom-ref": "de5da79ee044a480", "name": "/usr/share/vim/vim91/syntax/swig.vim", "type": "file" }, { - "bom-ref": "57ad6a43a079537d", + "bom-ref": "3005d62f74fb4c01", "name": "/usr/share/vim/vim91/syntax/syncolor.vim", "type": "file" }, { - "bom-ref": "fda96233039e618a", + "bom-ref": "c4f8741d3637673a", "name": "/usr/share/vim/vim91/syntax/synload.vim", "type": "file" }, { - "bom-ref": "a4b1c74557249a46", + "bom-ref": "4578633f7e9047a2", "name": "/usr/share/vim/vim91/syntax/syntax.vim", "type": "file" }, { - "bom-ref": "e7b3bf737a1b7b35", + "bom-ref": "d66ed29ceea8d85d", "name": "/usr/share/vim/vim91/syntax/sysctl.vim", "type": "file" }, { - "bom-ref": "62b138fc88ac9878", + "bom-ref": "a09c7fdaa890bc4c", "name": "/usr/share/vim/vim91/syntax/systemd.vim", "type": "file" }, { - "bom-ref": "22823e12793edc70", + "bom-ref": "a5cbf8f20b3bcf40", "name": "/usr/share/vim/vim91/syntax/systemverilog.vim", "type": "file" }, { - "bom-ref": "7ddfd0064266d967", + "bom-ref": "3962abf38804cbeb", "name": "/usr/share/vim/vim91/syntax/tads.vim", "type": "file" }, { - "bom-ref": "81ab0bb000555b0f", + "bom-ref": "e3a62f7730866d3f", "name": "/usr/share/vim/vim91/syntax/tags.vim", "type": "file" }, { - "bom-ref": "5d235e0ace029634", + "bom-ref": "19a0cbdc11308d0c", "name": "/usr/share/vim/vim91/syntax/tak.vim", "type": "file" }, { - "bom-ref": "ce143afe9610ad81", + "bom-ref": "e84aeb8eee0f7205", "name": "/usr/share/vim/vim91/syntax/takcmp.vim", "type": "file" }, { - "bom-ref": "f14fa46f25e88a48", + "bom-ref": "2736fe01da815e44", "name": "/usr/share/vim/vim91/syntax/takout.vim", "type": "file" }, { - "bom-ref": "011e6eb25b98afdd", + "bom-ref": "b6280722e03f2bdd", "name": "/usr/share/vim/vim91/syntax/tap.vim", "type": "file" }, { - "bom-ref": "488dc86fd20c702a", + "bom-ref": "c6811dce8b7f10ca", "name": "/usr/share/vim/vim91/syntax/tar.vim", "type": "file" }, { - "bom-ref": "9e77f0458eea4238", + "bom-ref": "a22f041e86514dac", "name": "/usr/share/vim/vim91/syntax/taskdata.vim", "type": "file" }, { - "bom-ref": "717b8b11a0b741d6", + "bom-ref": "c1ac0521b2111a7e", "name": "/usr/share/vim/vim91/syntax/taskedit.vim", "type": "file" }, { - "bom-ref": "8f6bfff0ddf7c67e", + "bom-ref": "f5483a5f083cb79e", "name": "/usr/share/vim/vim91/syntax/tasm.vim", "type": "file" }, { - "bom-ref": "ea76c1107422da22", + "bom-ref": "7cda62843a7afefa", "name": "/usr/share/vim/vim91/syntax/tcl.vim", "type": "file" }, { - "bom-ref": "63644eb140f9118c", + "bom-ref": "64c1b857540d8908", "name": "/usr/share/vim/vim91/syntax/tcsh.vim", "type": "file" }, { - "bom-ref": "f40a7991a10916d7", + "bom-ref": "8783a86f49d827eb", "name": "/usr/share/vim/vim91/syntax/template.vim", "type": "file" }, { - "bom-ref": "9084ada3920f61b3", + "bom-ref": "c037687c0a79ba77", "name": "/usr/share/vim/vim91/syntax/teraterm.vim", "type": "file" }, { - "bom-ref": "9b9d7167bac16f23", + "bom-ref": "8a126a4566804e5f", "name": "/usr/share/vim/vim91/syntax/terminfo.vim", "type": "file" }, { - "bom-ref": "9364a47c77db45d5", + "bom-ref": "009e974c398eb2a9", "name": "/usr/share/vim/vim91/syntax/tex.vim", "type": "file" }, { - "bom-ref": "5f061ba64bd37a19", + "bom-ref": "5262d5ec7c110115", "name": "/usr/share/vim/vim91/syntax/texinfo.vim", "type": "file" }, { - "bom-ref": "684a6a958bf65af5", + "bom-ref": "4c1566aa0b9e0771", "name": "/usr/share/vim/vim91/syntax/texmf.vim", "type": "file" }, { - "bom-ref": "1cb19aa2b91b5e11", + "bom-ref": "e8d8ba7a157f4c0d", "name": "/usr/share/vim/vim91/syntax/tf.vim", "type": "file" }, { - "bom-ref": "bbe6e09b7dd4f9ff", + "bom-ref": "d719236475d8327b", "name": "/usr/share/vim/vim91/syntax/tidy.vim", "type": "file" }, { - "bom-ref": "6052d05d37bc6c7d", + "bom-ref": "19cb3846c7464e15", "name": "/usr/share/vim/vim91/syntax/tilde.vim", "type": "file" }, { - "bom-ref": "ea4bd6089b09419a", + "bom-ref": "3a6f3185d737d20a", "name": "/usr/share/vim/vim91/syntax/tli.vim", "type": "file" }, { - "bom-ref": "32c37129bbe73546", + "bom-ref": "b3bde77efc898e4e", "name": "/usr/share/vim/vim91/syntax/tmux.vim", "type": "file" }, { - "bom-ref": "1a163fff5e919f18", + "bom-ref": "042bb9025635df94", "name": "/usr/share/vim/vim91/syntax/toml.vim", "type": "file" }, { - "bom-ref": "f169c0fcdaff3c68", + "bom-ref": "615ce36a5a710918", "name": "/usr/share/vim/vim91/syntax/tpp.vim", "type": "file" }, { - "bom-ref": "75d84d7a739e6c11", + "bom-ref": "0ec5bb6f403b2101", "name": "/usr/share/vim/vim91/syntax/trasys.vim", "type": "file" }, { - "bom-ref": "5c803e8edfea94a7", + "bom-ref": "57eb56e136a90497", "name": "/usr/share/vim/vim91/syntax/treetop.vim", "type": "file" }, { - "bom-ref": "adddc826d17a32a9", + "bom-ref": "b6d4b59bc251fed1", "name": "/usr/share/vim/vim91/syntax/trustees.vim", "type": "file" }, { - "bom-ref": "e033960ec388c4b6", + "bom-ref": "8dbc6e546b9b9266", "name": "/usr/share/vim/vim91/syntax/tsalt.vim", "type": "file" }, { - "bom-ref": "860a7b3e026733fc", + "bom-ref": "81fe131be19ddf60", "name": "/usr/share/vim/vim91/syntax/tsscl.vim", "type": "file" }, { - "bom-ref": "b16cde749c012b5a", + "bom-ref": "d5775b945b3859aa", "name": "/usr/share/vim/vim91/syntax/tssgm.vim", "type": "file" }, { - "bom-ref": "e1f7501cc4eca88b", + "bom-ref": "048e1c377d90791b", "name": "/usr/share/vim/vim91/syntax/tssop.vim", "type": "file" }, { - "bom-ref": "e383482a6ca51a64", + "bom-ref": "1af3bfe6b5e546dc", "name": "/usr/share/vim/vim91/syntax/tt2.vim", "type": "file" }, { - "bom-ref": "a9256505b278ba81", + "bom-ref": "a8e227049d06882d", "name": "/usr/share/vim/vim91/syntax/tt2html.vim", "type": "file" }, { - "bom-ref": "9dc3ca02c77b324f", + "bom-ref": "4a3a4111fb015b5b", "name": "/usr/share/vim/vim91/syntax/tt2js.vim", "type": "file" }, { - "bom-ref": "2fbdd5da5459aa8e", + "bom-ref": "fe0427b63248fcd6", "name": "/usr/share/vim/vim91/syntax/typescript.vim", "type": "file" }, { - "bom-ref": "921e7477e4c367fd", + "bom-ref": "a5097c036f9f674d", "name": "/usr/share/vim/vim91/syntax/typescriptreact.vim", "type": "file" }, { - "bom-ref": "0d89823e50b7b1a9", + "bom-ref": "37a7bf46ba866e29", "name": "/usr/share/vim/vim91/syntax/uc.vim", "type": "file" }, { - "bom-ref": "7bbb52a39415fafd", + "bom-ref": "3fa81f1e3d58a085", "name": "/usr/share/vim/vim91/syntax/udevconf.vim", "type": "file" }, { - "bom-ref": "4935a9625fdd10c8", + "bom-ref": "99cb26703f5ffc00", "name": "/usr/share/vim/vim91/syntax/udevperm.vim", "type": "file" }, { - "bom-ref": "6a9f4020fa88dd6b", + "bom-ref": "30422b0d2efaf873", "name": "/usr/share/vim/vim91/syntax/udevrules.vim", "type": "file" }, { - "bom-ref": "5ab8588848014b9f", + "bom-ref": "bc725a3700a72287", "name": "/usr/share/vim/vim91/syntax/uil.vim", "type": "file" }, { - "bom-ref": "fab3077d2cc77c4e", + "bom-ref": "3319bdbdcd279c7a", "name": "/usr/share/vim/vim91/syntax/unison.vim", "type": "file" }, { - "bom-ref": "16f2a6fae75a8e66", + "bom-ref": "8f7b493888b6dfb6", "name": "/usr/share/vim/vim91/syntax/updatedb.vim", "type": "file" }, { - "bom-ref": "ad536e4dae999c9b", + "bom-ref": "dfb952a30d480da3", "name": "/usr/share/vim/vim91/syntax/upstart.vim", "type": "file" }, { - "bom-ref": "02a3e65b7691e30d", + "bom-ref": "c259557896fbd42d", "name": "/usr/share/vim/vim91/syntax/upstreamdat.vim", "type": "file" }, { - "bom-ref": "79075e28068d9cca", + "bom-ref": "f5bffa3276f437be", "name": "/usr/share/vim/vim91/syntax/upstreaminstalllog.vim", "type": "file" }, { - "bom-ref": "d3433e71e41b88e8", + "bom-ref": "2cfd34ee34b4aac8", "name": "/usr/share/vim/vim91/syntax/upstreamlog.vim", "type": "file" }, { - "bom-ref": "0cff4bffe06377ba", + "bom-ref": "86fc203565ebb682", "name": "/usr/share/vim/vim91/syntax/upstreamrpt.vim", "type": "file" }, { - "bom-ref": "0fb5b15c62d8e1b0", + "bom-ref": "4ab8fcf6bf2b3a50", "name": "/usr/share/vim/vim91/syntax/urlshortcut.vim", "type": "file" }, { - "bom-ref": "385047055d1ae0f3", + "bom-ref": "023dd0fca9b384db", "name": "/usr/share/vim/vim91/syntax/usserverlog.vim", "type": "file" }, { - "bom-ref": "3a644b2c20a23a21", + "bom-ref": "9de624126afd96d1", "name": "/usr/share/vim/vim91/syntax/usw2kagtlog.vim", "type": "file" }, { - "bom-ref": "b3ae98f319c9d65e", + "bom-ref": "e79ed2e6e1fa32c2", "name": "/usr/share/vim/vim91/syntax/valgrind.vim", "type": "file" }, { - "bom-ref": "e5d50e144323a021", + "bom-ref": "e9f651f10ecc4711", "name": "/usr/share/vim/vim91/syntax/vb.vim", "type": "file" }, { - "bom-ref": "91d812fc2a5e8405", + "bom-ref": "ace9d5cded926ae5", "name": "/usr/share/vim/vim91/syntax/vdf.vim", "type": "file" }, { - "bom-ref": "7b870898e3fb72cc", + "bom-ref": "dea4eba0daab29c8", "name": "/usr/share/vim/vim91/syntax/vera.vim", "type": "file" }, { - "bom-ref": "1d89782039849cfe", + "bom-ref": "5be4f2b21a09f9c6", "name": "/usr/share/vim/vim91/syntax/verilog.vim", "type": "file" }, { - "bom-ref": "a320851b2afd675e", + "bom-ref": "27f72dea48560072", "name": "/usr/share/vim/vim91/syntax/verilogams.vim", "type": "file" }, { - "bom-ref": "008a83bdc0ad2f8d", + "bom-ref": "c71091904d799dcd", "name": "/usr/share/vim/vim91/syntax/vgrindefs.vim", "type": "file" }, { - "bom-ref": "ede530199f69686c", + "bom-ref": "54b3e91001342a20", "name": "/usr/share/vim/vim91/syntax/vhdl.vim", "type": "file" }, { - "bom-ref": "4f4f9d68e63aff6d", + "bom-ref": "c9e955cca75837c9", "name": "/usr/share/vim/vim91/syntax/vim.vim", "type": "file" }, { - "bom-ref": "ebf87aea5eb90e53", + "bom-ref": "210d2e3c066e9b2b", "name": "/usr/share/vim/vim91/syntax/viminfo.vim", "type": "file" }, { - "bom-ref": "954c4041a8e57f79", + "bom-ref": "8c40f75df407595d", "name": "/usr/share/vim/vim91/syntax/virata.vim", "type": "file" }, { - "bom-ref": "e93019b80548dcab", + "bom-ref": "5fd67bd6d58d76a3", "name": "/usr/share/vim/vim91/syntax/vmasm.vim", "type": "file" }, { - "bom-ref": "1cdfcede51cb304c", + "bom-ref": "03d999725d6502c4", "name": "/usr/share/vim/vim91/syntax/voscm.vim", "type": "file" }, { - "bom-ref": "3458cac4afe27cfe", + "bom-ref": "80d47912e452f4d2", "name": "/usr/share/vim/vim91/syntax/vrml.vim", "type": "file" }, { - "bom-ref": "a14d4b7c94246423", + "bom-ref": "8a5833777f2baee3", "name": "/usr/share/vim/vim91/syntax/vroom.vim", "type": "file" }, { - "bom-ref": "6e4a5a8613b47d18", + "bom-ref": "5dc6f6cb0f644cdc", "name": "/usr/share/vim/vim91/syntax/vsejcl.vim", "type": "file" }, { - "bom-ref": "5dc5cbabe157e7ec", + "bom-ref": "a21c03d97f084954", "name": "/usr/share/vim/vim91/syntax/vue.vim", "type": "file" }, { - "bom-ref": "4dce5af537fbd08b", + "bom-ref": "8b69ef6117677cb3", "name": "/usr/share/vim/vim91/syntax/wat.vim", "type": "file" }, { - "bom-ref": "6414b7a5a5671c8f", + "bom-ref": "ae0a923abe59d9ab", "name": "/usr/share/vim/vim91/syntax/wdiff.vim", "type": "file" }, { - "bom-ref": "b6c4af0a69d616ae", + "bom-ref": "62bc174753136e7a", "name": "/usr/share/vim/vim91/syntax/wdl.vim", "type": "file" }, { - "bom-ref": "a45c76f59e23d87a", + "bom-ref": "f30b04c2ec5ccc62", "name": "/usr/share/vim/vim91/syntax/web.vim", "type": "file" }, { - "bom-ref": "f4a4e008dc108ea3", + "bom-ref": "6de6d5e496d4ad63", "name": "/usr/share/vim/vim91/syntax/webmacro.vim", "type": "file" }, { - "bom-ref": "4b53de9c6d49eccf", + "bom-ref": "6f9dc98a7b7de21f", "name": "/usr/share/vim/vim91/syntax/wget.vim", "type": "file" }, { - "bom-ref": "0584b58aa457c446", + "bom-ref": "c25df3e97e471646", "name": "/usr/share/vim/vim91/syntax/wget2.vim", "type": "file" }, { - "bom-ref": "3d35b3013cd5a508", + "bom-ref": "e021f1a4f32a404c", "name": "/usr/share/vim/vim91/syntax/whitespace.vim", "type": "file" }, { - "bom-ref": "1ce8eb9faf076a84", + "bom-ref": "20d21f6da9469dfc", "name": "/usr/share/vim/vim91/syntax/winbatch.vim", "type": "file" }, { - "bom-ref": "4f68826410aa3b37", + "bom-ref": "2547748a780d851f", "name": "/usr/share/vim/vim91/syntax/wml.vim", "type": "file" }, { - "bom-ref": "7986477fef1bcdeb", + "bom-ref": "ef5a61e7531e7767", "name": "/usr/share/vim/vim91/syntax/wsh.vim", "type": "file" }, { - "bom-ref": "5143e6c942701843", + "bom-ref": "d20013798c209063", "name": "/usr/share/vim/vim91/syntax/wsml.vim", "type": "file" }, { - "bom-ref": "600aa15d6528e8a8", + "bom-ref": "17e2af30e8a8cd34", "name": "/usr/share/vim/vim91/syntax/wvdial.vim", "type": "file" }, { - "bom-ref": "f461d8590ec0872f", + "bom-ref": "50bf772f692ddd87", "name": "/usr/share/vim/vim91/syntax/xbl.vim", "type": "file" }, { - "bom-ref": "4392696ed398bfc1", + "bom-ref": "9654b126c71014ed", "name": "/usr/share/vim/vim91/syntax/xcompose.vim", "type": "file" }, { - "bom-ref": "f04517cf4a207c93", + "bom-ref": "e25c4f548c4f0ad3", "name": "/usr/share/vim/vim91/syntax/xdefaults.vim", "type": "file" }, { - "bom-ref": "c8b7fce0fde961a0", + "bom-ref": "399aa287a78c7870", "name": "/usr/share/vim/vim91/syntax/xf86conf.vim", "type": "file" }, { - "bom-ref": "b3e1efbf65b423ed", + "bom-ref": "d4136d05dc454311", "name": "/usr/share/vim/vim91/syntax/xhtml.vim", "type": "file" }, { - "bom-ref": "61901190f201aaf3", + "bom-ref": "ee864c765574b0d7", "name": "/usr/share/vim/vim91/syntax/xinetd.vim", "type": "file" }, { - "bom-ref": "e67891e08c6053e8", + "bom-ref": "f7fac655c756c300", "name": "/usr/share/vim/vim91/syntax/xkb.vim", "type": "file" }, { - "bom-ref": "9ff9859547a41663", + "bom-ref": "263df4f6dc6d1343", "name": "/usr/share/vim/vim91/syntax/xmath.vim", "type": "file" }, { - "bom-ref": "a259458840f99be6", + "bom-ref": "48ef352ce550d3fe", "name": "/usr/share/vim/vim91/syntax/xml.vim", "type": "file" }, { - "bom-ref": "c499bd5f755a4346", + "bom-ref": "d71ae1c415ff7af6", "name": "/usr/share/vim/vim91/syntax/xmodmap.vim", "type": "file" }, { - "bom-ref": "7b97dd09237d6533", + "bom-ref": "85801d0951f7cd47", "name": "/usr/share/vim/vim91/syntax/xpm.vim", "type": "file" }, { - "bom-ref": "52de533709e1a213", + "bom-ref": "e0a8ec4ffe5c5ba7", "name": "/usr/share/vim/vim91/syntax/xpm2.vim", "type": "file" }, { - "bom-ref": "b4b3e5c127a5a99c", + "bom-ref": "b194215afaabbbb4", "name": "/usr/share/vim/vim91/syntax/xquery.vim", "type": "file" }, { - "bom-ref": "e68173d41a6456f2", + "bom-ref": "889aa819ae9dd196", "name": "/usr/share/vim/vim91/syntax/xs.vim", "type": "file" }, { - "bom-ref": "cebff6501626f7eb", + "bom-ref": "6d5916f053c6997b", "name": "/usr/share/vim/vim91/syntax/xsd.vim", "type": "file" }, { - "bom-ref": "ccad5a94ede9b687", + "bom-ref": "3e147a027955108f", "name": "/usr/share/vim/vim91/syntax/xslt.vim", "type": "file" }, { - "bom-ref": "0d104ee881bf9068", + "bom-ref": "4108b656058751d4", "name": "/usr/share/vim/vim91/syntax/xxd.vim", "type": "file" }, { - "bom-ref": "fa30e58bee9260f2", + "bom-ref": "2405325ff78ffc72", "name": "/usr/share/vim/vim91/syntax/yacc.vim", "type": "file" }, { - "bom-ref": "4f8808b8c89d6d47", + "bom-ref": "5374b0224e54ed9b", "name": "/usr/share/vim/vim91/syntax/yaml.vim", "type": "file" }, { - "bom-ref": "cdcb25e106ca6466", + "bom-ref": "802b7bfa5e25c40e", "name": "/usr/share/vim/vim91/syntax/z8a.vim", "type": "file" }, { - "bom-ref": "f783a1899d8f73d2", + "bom-ref": "8872fe75ad15c662", "name": "/usr/share/vim/vim91/syntax/zig.vim", "type": "file" }, { - "bom-ref": "7d533e6ae9fd2350", + "bom-ref": "4c94e8383f125ab8", "name": "/usr/share/vim/vim91/syntax/zimbu.vim", "type": "file" }, { - "bom-ref": "a96d25783e15489e", + "bom-ref": "185cc6a4a27d7036", "name": "/usr/share/vim/vim91/syntax/zir.vim", "type": "file" }, { - "bom-ref": "7c4c921ee6ce4d91", + "bom-ref": "45a9e6363bea8441", "name": "/usr/share/vim/vim91/syntax/zserio.vim", "type": "file" }, { - "bom-ref": "1f1956470874fbf4", + "bom-ref": "9a55f20127680868", "name": "/usr/share/vim/vim91/syntax/zsh.vim", "type": "file" }, { - "bom-ref": "09aa8ae653510354", + "bom-ref": "972b75ae75aada7c", "name": "/usr/share/vim/vim91/tutor/README.ru.utf-8.txt", "type": "file" }, { - "bom-ref": "8ba4097c0417a627", + "bom-ref": "6cb90a9821458c57", "name": "/usr/share/vim/vim91/tutor/tutor", "type": "file" }, { - "bom-ref": "7891c9ef88706670", + "bom-ref": "0b8ad928f0455394", "name": "/usr/share/vim/vim91/tutor/tutor.bar", "type": "file" }, { - "bom-ref": "9cd380b2e730eabd", + "bom-ref": "6b7d90d47fa4aad5", "name": "/usr/share/vim/vim91/tutor/tutor.bar.utf-8", "type": "file" }, { - "bom-ref": "815e40af63632b10", + "bom-ref": "665094902a61487c", "name": "/usr/share/vim/vim91/tutor/tutor.bg.utf-8", "type": "file" }, { - "bom-ref": "3b8bf181132905d7", + "bom-ref": "43da726cdebfee2f", "name": "/usr/share/vim/vim91/tutor/tutor.ca", "type": "file" }, { - "bom-ref": "ee6c901820376bdb", + "bom-ref": "a384d0352cc30f5f", "name": "/usr/share/vim/vim91/tutor/tutor.ca.utf-8", "type": "file" }, { - "bom-ref": "349f35b33c3d52dd", + "bom-ref": "88f7c5d4a75accfd", "name": "/usr/share/vim/vim91/tutor/tutor.cs", "type": "file" }, { - "bom-ref": "8ada37aa44aadaea", + "bom-ref": "ae6da2d6dfd8e35e", "name": "/usr/share/vim/vim91/tutor/tutor.cs.cp1250", "type": "file" }, { - "bom-ref": "d942b1525a420cbb", + "bom-ref": "dd6550013d5ba013", "name": "/usr/share/vim/vim91/tutor/tutor.cs.utf-8", "type": "file" }, { - "bom-ref": "987fadd48b61dd8b", + "bom-ref": "461aafb1f28a5bb7", "name": "/usr/share/vim/vim91/tutor/tutor.da", "type": "file" }, { - "bom-ref": "96deb9e95ffb2014", + "bom-ref": "4ae521efed6dd77c", "name": "/usr/share/vim/vim91/tutor/tutor.da.utf-8", "type": "file" }, { - "bom-ref": "2da6c2d606539ad2", + "bom-ref": "1e925c7f92b30932", "name": "/usr/share/vim/vim91/tutor/tutor.de", "type": "file" }, { - "bom-ref": "c97d274c6eb2a5c1", + "bom-ref": "62966647e0e2f25d", "name": "/usr/share/vim/vim91/tutor/tutor.de.utf-8", "type": "file" }, { - "bom-ref": "be8939860463d782", + "bom-ref": "c69da535e88fe83a", "name": "/usr/share/vim/vim91/tutor/tutor.el", "type": "file" }, { - "bom-ref": "4edba2655c54d2c7", + "bom-ref": "70fa53bbcb9b10bb", "name": "/usr/share/vim/vim91/tutor/tutor.el.cp737", "type": "file" }, { - "bom-ref": "fac6f13fe38d8cb6", + "bom-ref": "2422df9382779086", "name": "/usr/share/vim/vim91/tutor/tutor.el.utf-8", "type": "file" }, { - "bom-ref": "9d1f20a9c7aadd71", + "bom-ref": "0044b65a0b1615f9", "name": "/usr/share/vim/vim91/tutor/tutor.eo", "type": "file" }, { - "bom-ref": "8e0f9d2944617d09", + "bom-ref": "0c7a3c18dd667949", "name": "/usr/share/vim/vim91/tutor/tutor.eo.utf-8", "type": "file" }, { - "bom-ref": "b06c719b119f3f95", + "bom-ref": "cbfa6d52eb1d9981", "name": "/usr/share/vim/vim91/tutor/tutor.es", "type": "file" }, { - "bom-ref": "bee6ebd8fd63198f", + "bom-ref": "fb76a9b9acabd17b", "name": "/usr/share/vim/vim91/tutor/tutor.es.utf-8", "type": "file" }, { - "bom-ref": "8aa5f6251868571e", + "bom-ref": "469e498d4d2575d2", "name": "/usr/share/vim/vim91/tutor/tutor.fr", "type": "file" }, { - "bom-ref": "4bb587ab5923c925", + "bom-ref": "2e71229c166da509", "name": "/usr/share/vim/vim91/tutor/tutor.fr.utf-8", "type": "file" }, { - "bom-ref": "5da0aeea149722e4", + "bom-ref": "389a233e1c3e2074", "name": "/usr/share/vim/vim91/tutor/tutor.hr", "type": "file" }, { - "bom-ref": "c88f3e18c1b7f040", + "bom-ref": "b0960d7ce71fc3e0", "name": "/usr/share/vim/vim91/tutor/tutor.hr.cp1250", "type": "file" }, { - "bom-ref": "712bb00eb8f63b4a", + "bom-ref": "eb330d8653bdc6ea", "name": "/usr/share/vim/vim91/tutor/tutor.hr.utf-8", "type": "file" }, { - "bom-ref": "18b7aba4b2c92337", + "bom-ref": "e7ef90871b260cdf", "name": "/usr/share/vim/vim91/tutor/tutor.hu", "type": "file" }, { - "bom-ref": "ca20686f7d33c3af", + "bom-ref": "9d00df222011a3c3", "name": "/usr/share/vim/vim91/tutor/tutor.hu.cp1250", "type": "file" }, { - "bom-ref": "8d09385f7cb11b3c", + "bom-ref": "d97868d19f0ff98c", "name": "/usr/share/vim/vim91/tutor/tutor.hu.utf-8", "type": "file" }, { - "bom-ref": "e6567ab3c569a91b", + "bom-ref": "5485c1ce5c2b3c27", "name": "/usr/share/vim/vim91/tutor/tutor.it", "type": "file" }, { - "bom-ref": "7a899d54c8321390", + "bom-ref": "3ad840194dd2aed0", "name": "/usr/share/vim/vim91/tutor/tutor.it.utf-8", "type": "file" }, { - "bom-ref": "6d593b135caf9c3a", + "bom-ref": "38c585d0802a156e", "name": "/usr/share/vim/vim91/tutor/tutor.ja.euc", "type": "file" }, { - "bom-ref": "b9c9c18971c9d110", + "bom-ref": "f4c20d9f171b6a2c", "name": "/usr/share/vim/vim91/tutor/tutor.ja.sjis", "type": "file" }, { - "bom-ref": "51958d335472b581", + "bom-ref": "1faade0938fca0c1", "name": "/usr/share/vim/vim91/tutor/tutor.ja.utf-8", "type": "file" }, { - "bom-ref": "a02874e35c5616b7", + "bom-ref": "3acdfd3d51730ec3", "name": "/usr/share/vim/vim91/tutor/tutor.ko", "type": "file" }, { - "bom-ref": "e6ec68fc83b96af1", + "bom-ref": "a3ec87e175c07329", "name": "/usr/share/vim/vim91/tutor/tutor.ko.euc", "type": "file" }, { - "bom-ref": "2c15bb2d045f0168", + "bom-ref": "11c4a48066773a90", "name": "/usr/share/vim/vim91/tutor/tutor.ko.utf-8", "type": "file" }, { - "bom-ref": "fff96c9a2465833e", + "bom-ref": "e77c4cc01a49ff2e", "name": "/usr/share/vim/vim91/tutor/tutor.lv.utf-8", "type": "file" }, { - "bom-ref": "a71f723abf742a27", + "bom-ref": "b21ad7b01309dbcf", "name": "/usr/share/vim/vim91/tutor/tutor.nb", "type": "file" }, { - "bom-ref": "5bc754126ee47480", + "bom-ref": "b7a31b4fb745e3d0", "name": "/usr/share/vim/vim91/tutor/tutor.nb.utf-8", "type": "file" }, { - "bom-ref": "8026f0aaafc2b9c2", + "bom-ref": "49438bfa9fdcec46", "name": "/usr/share/vim/vim91/tutor/tutor.nl", "type": "file" }, { - "bom-ref": "40fcb0a231005870", + "bom-ref": "5cecc2b0527e61dc", "name": "/usr/share/vim/vim91/tutor/tutor.nl.utf-8", "type": "file" }, { - "bom-ref": "cd9dffd7a90b1d48", + "bom-ref": "4fed49a73f0df07c", "name": "/usr/share/vim/vim91/tutor/tutor.no", "type": "file" }, { - "bom-ref": "6081215be25f771b", + "bom-ref": "bb8f366f7c0dd84f", "name": "/usr/share/vim/vim91/tutor/tutor.no.utf-8", "type": "file" }, { - "bom-ref": "295b147d313813dd", + "bom-ref": "a315979e2186831d", "name": "/usr/share/vim/vim91/tutor/tutor.pl", "type": "file" }, { - "bom-ref": "1fa76f49066d109e", + "bom-ref": "ed2962d78b786e2a", "name": "/usr/share/vim/vim91/tutor/tutor.pl.cp1250", "type": "file" }, { - "bom-ref": "b27288fb097838f0", + "bom-ref": "b2130d273d7e79cc", "name": "/usr/share/vim/vim91/tutor/tutor.pl.utf-8", "type": "file" }, { - "bom-ref": "6f9327adfe56bd2b", + "bom-ref": "69621d77aae670d7", "name": "/usr/share/vim/vim91/tutor/tutor.pt", "type": "file" }, { - "bom-ref": "30147b708b77356d", + "bom-ref": "055848a41f0745d5", "name": "/usr/share/vim/vim91/tutor/tutor.pt.utf-8", "type": "file" }, { - "bom-ref": "70e0aff804d8f062", + "bom-ref": "d51df3b5c197efc6", "name": "/usr/share/vim/vim91/tutor/tutor.ru", "type": "file" }, { - "bom-ref": "11d3bd4560c43360", + "bom-ref": "d6617cd2a3e2f2ac", "name": "/usr/share/vim/vim91/tutor/tutor.ru.cp1251", "type": "file" }, { - "bom-ref": "11a27b4e150b1c94", + "bom-ref": "514f7e1478d4d408", "name": "/usr/share/vim/vim91/tutor/tutor.ru.utf-8", "type": "file" }, { - "bom-ref": "06c5814cf64987ca", + "bom-ref": "1847cee0b66cc016", "name": "/usr/share/vim/vim91/tutor/tutor.sk", "type": "file" }, { - "bom-ref": "81e2681c050bffec", + "bom-ref": "1e7a8c61b61307a8", "name": "/usr/share/vim/vim91/tutor/tutor.sk.cp1250", "type": "file" }, { - "bom-ref": "86800e586e96826f", + "bom-ref": "6b54cdcc61ef4253", "name": "/usr/share/vim/vim91/tutor/tutor.sk.utf-8", "type": "file" }, { - "bom-ref": "b0d4f763891138bd", + "bom-ref": "aafd667c8e5241f9", "name": "/usr/share/vim/vim91/tutor/tutor.sr.cp1250", "type": "file" }, { - "bom-ref": "38dcb613aa097f36", + "bom-ref": "c2832efcefda93d2", "name": "/usr/share/vim/vim91/tutor/tutor.sr.utf-8", "type": "file" }, { - "bom-ref": "7831c82c531c391a", + "bom-ref": "9dd2980927ad6182", "name": "/usr/share/vim/vim91/tutor/tutor.sv", "type": "file" }, { - "bom-ref": "638d5107cfa0f2d6", + "bom-ref": "4eaa459970e04d92", "name": "/usr/share/vim/vim91/tutor/tutor.sv.utf-8", "type": "file" }, { - "bom-ref": "5c5c34776e813d9b", + "bom-ref": "7f7749194d0fb08f", "name": "/usr/share/vim/vim91/tutor/tutor.tr.iso9", "type": "file" }, { - "bom-ref": "4566e56c84036aeb", + "bom-ref": "5ff350fcb54694eb", "name": "/usr/share/vim/vim91/tutor/tutor.tr.utf-8", "type": "file" }, { - "bom-ref": "7b3fb02894715804", + "bom-ref": "7deab785f5acb640", "name": "/usr/share/vim/vim91/tutor/tutor.uk.utf-8", "type": "file" }, { - "bom-ref": "652428071f7833de", + "bom-ref": "9ad7c79e681f6fb2", "name": "/usr/share/vim/vim91/tutor/tutor.utf-8", "type": "file" }, { - "bom-ref": "12fa8d9a8f0f22a5", + "bom-ref": "181f5ad8d8e3dc25", "name": "/usr/share/vim/vim91/tutor/tutor.vi.utf-8", "type": "file" }, { - "bom-ref": "069f9619436de067", + "bom-ref": "47c3657426a21adf", "name": "/usr/share/vim/vim91/tutor/tutor.vim", "type": "file" }, { - "bom-ref": "0b5828afc05a4b44", + "bom-ref": "7e8c9c1168e47760", "name": "/usr/share/vim/vim91/tutor/tutor.zh.big5", "type": "file" }, { - "bom-ref": "053c923d320fdfce", + "bom-ref": "8de01e60b9760a3e", "name": "/usr/share/vim/vim91/tutor/tutor.zh.euc", "type": "file" }, { - "bom-ref": "042a059ce7fadeda", + "bom-ref": "9ea783cda08c5abe", "name": "/usr/share/vim/vim91/tutor/tutor.zh.utf-8", "type": "file" }, { - "bom-ref": "6119bdc0af3c4502", + "bom-ref": "eca8e5f15e2f0cd6", "name": "/usr/share/vim/vim91/tutor/tutor.zh_cn.utf-8", "type": "file" }, { - "bom-ref": "f53711fc900167ec", + "bom-ref": "2851f8c9caa9b814", "name": "/usr/share/vim/vim91/tutor/tutor.zh_tw.utf-8", "type": "file" }, { - "bom-ref": "34bd6f3c22defe54", + "bom-ref": "50dd205b1f9ee204", "name": "/usr/share/vim/vim91/vimrc_example.vim", "type": "file" }, { - "bom-ref": "e94533c157b5dcc6", + "bom-ref": "59cc30d7dc1bb6cb", + "name": "/usr/share/xml-core/catalog.footer", + "type": "file" + }, + { + "bom-ref": "4494280aa23b4da4", + "name": "/usr/share/xml-core/catalog.header", + "type": "file" + }, + { + "bom-ref": "5848b79afb6918d2", "name": "/usr/share/xml/fontconfig/fonts.dtd", "type": "file" }, { - "bom-ref": "6f9350715f05135e", + "bom-ref": "d5730dc308ed2ac6", + "name": "/usr/share/xml/iso-codes/iso_15924.xml", + "type": "file" + }, + { + "bom-ref": "1cfd2cf19689f195", + "name": "/usr/share/xml/iso-codes/iso_3166-1.xml", + "type": "file" + }, + { + "bom-ref": "b0bebeade166a9a4", + "name": "/usr/share/xml/iso-codes/iso_3166-2.xml", + "type": "file" + }, + { + "bom-ref": "0f874a5577d7dac4", + "name": "/usr/share/xml/iso-codes/iso_3166-3.xml", + "type": "file" + }, + { + "bom-ref": "df74891df23009d1", + "name": "/usr/share/xml/iso-codes/iso_4217.xml", + "type": "file" + }, + { + "bom-ref": "363aab46faaf5627", + "name": "/usr/share/xml/iso-codes/iso_639-2.xml", + "type": "file" + }, + { + "bom-ref": "453fb39d3d17dc6c", + "name": "/usr/share/xml/iso-codes/iso_639-3.xml", + "type": "file" + }, + { + "bom-ref": "e75baec76f73a625", + "name": "/usr/share/xml/iso-codes/iso_639-5.xml", + "type": "file" + }, + { + "bom-ref": "4fd9ceba282527f5", + "name": "/usr/share/xml/polkit-1/catalog.xml", + "type": "file" + }, + { + "bom-ref": "15be311992eef6f1", + "name": "/usr/share/xml/schema/xml-core/catalog.dtd", + "type": "file" + }, + { + "bom-ref": "628ffa37bfd8aff5", + "name": "/usr/share/xml/schema/xml-core/catalog.xml", + "type": "file" + }, + { + "bom-ref": "c864e9f94482a53e", + "name": "/usr/share/xml/schema/xml-core/tr9401.dtd", + "type": "file" + }, + { + "bom-ref": "462bfe1a52e72122", + "name": "/usr/share/xpum/resources/config/device_thresholds.json", + "type": "file" + }, + { + "bom-ref": "92dc5769a72e8560", + "name": "/usr/share/xpum/resources/config/pci.conf", + "type": "file" + }, + { + "bom-ref": "68fae90dafe1e14e", + "name": "/usr/share/xpum/resources/config/pci.ids", + "type": "file" + }, + { + "bom-ref": "5a9327d4be16ec6e", "name": "/usr/share/zoneinfo/Africa/Abidjan", "type": "file" }, { - "bom-ref": "a24bba54aad31ecf", + "bom-ref": "050004e9f29094c3", "name": "/usr/share/zoneinfo/Africa/Accra", "type": "file" }, { - "bom-ref": "4c2a6cf24e818d53", + "bom-ref": "2d227d9b4ecf1e6f", "name": "/usr/share/zoneinfo/Africa/Addis_Ababa", "type": "file" }, { - "bom-ref": "de7b30629a7012e1", + "bom-ref": "ef7afc9b4c7d28f9", "name": "/usr/share/zoneinfo/Africa/Algiers", "type": "file" }, { - "bom-ref": "ee35ef14efb86238", + "bom-ref": "9b2bde60ff22c400", "name": "/usr/share/zoneinfo/Africa/Asmara", "type": "file" }, { - "bom-ref": "2684cb9b817d13c1", + "bom-ref": "53dbc72926a99e85", "name": "/usr/share/zoneinfo/Africa/Bamako", "type": "file" }, { - "bom-ref": "e1c31672a16a3e26", + "bom-ref": "89648fd1aa25203e", "name": "/usr/share/zoneinfo/Africa/Bangui", "type": "file" }, { - "bom-ref": "b934cdc2d69065da", + "bom-ref": "853587bbc4652cb6", "name": "/usr/share/zoneinfo/Africa/Banjul", "type": "file" }, { - "bom-ref": "1924d7ee55a72409", + "bom-ref": "afa4f2a39a74ec25", "name": "/usr/share/zoneinfo/Africa/Bissau", "type": "file" }, { - "bom-ref": "92d1aa54e959d4cc", + "bom-ref": "f9b18afc6e199ab0", "name": "/usr/share/zoneinfo/Africa/Blantyre", "type": "file" }, { - "bom-ref": "1c25c0762b5ca39c", + "bom-ref": "5b858d0a8d4e3dfc", "name": "/usr/share/zoneinfo/Africa/Brazzaville", "type": "file" }, { - "bom-ref": "e8061010e841d87a", + "bom-ref": "74d1cc4dddd798fe", "name": "/usr/share/zoneinfo/Africa/Bujumbura", "type": "file" }, { - "bom-ref": "ffd873a83dbe348f", + "bom-ref": "7912f0c1d22d3bbb", "name": "/usr/share/zoneinfo/Africa/Cairo", "type": "file" }, { - "bom-ref": "0fa3cc12d8509613", + "bom-ref": "eaa00bd0b0e0d4b3", "name": "/usr/share/zoneinfo/Africa/Casablanca", "type": "file" }, { - "bom-ref": "444c8a82de322071", + "bom-ref": "fd7523d4b14efdc5", "name": "/usr/share/zoneinfo/Africa/Ceuta", "type": "file" }, { - "bom-ref": "4c8b278945be7713", + "bom-ref": "a3f786d7f1ef65e7", "name": "/usr/share/zoneinfo/Africa/Conakry", "type": "file" }, { - "bom-ref": "09870743eba1e5ef", + "bom-ref": "b59cf474b3f794e3", "name": "/usr/share/zoneinfo/Africa/Dakar", "type": "file" }, { - "bom-ref": "05a4e8fe25e9254c", + "bom-ref": "a03c3e0ed7f62bf8", "name": "/usr/share/zoneinfo/Africa/Dar_es_Salaam", "type": "file" }, { - "bom-ref": "bf55286cd55b7ab5", + "bom-ref": "68ef3eb4644fa861", "name": "/usr/share/zoneinfo/Africa/Djibouti", "type": "file" }, { - "bom-ref": "8d3f49f02432b43a", + "bom-ref": "d0101d599edc7ee2", "name": "/usr/share/zoneinfo/Africa/Douala", "type": "file" }, { - "bom-ref": "e18d8780466662f2", + "bom-ref": "9c0414d70073b02e", "name": "/usr/share/zoneinfo/Africa/El_Aaiun", "type": "file" }, { - "bom-ref": "ac23eb12d54ff9aa", + "bom-ref": "e52fd4921fa92b06", "name": "/usr/share/zoneinfo/Africa/Freetown", "type": "file" }, { - "bom-ref": "e06caee5b08c3b15", + "bom-ref": "70ec14c1411c343d", "name": "/usr/share/zoneinfo/Africa/Gaborone", "type": "file" }, { - "bom-ref": "db1f792051c78fe5", + "bom-ref": "657f582ad7e7cf3d", "name": "/usr/share/zoneinfo/Africa/Harare", "type": "file" }, { - "bom-ref": "eeb624b7e4489439", + "bom-ref": "d92d39c240add171", "name": "/usr/share/zoneinfo/Africa/Johannesburg", "type": "file" }, { - "bom-ref": "5fdfd2e46599349e", + "bom-ref": "a0849c4bd48d7da2", "name": "/usr/share/zoneinfo/Africa/Juba", "type": "file" }, { - "bom-ref": "83132b2cd0607ef2", + "bom-ref": "c721efd7687d947a", "name": "/usr/share/zoneinfo/Africa/Kampala", "type": "file" }, { - "bom-ref": "801a03e411bed272", + "bom-ref": "ae5da429e57be52e", "name": "/usr/share/zoneinfo/Africa/Khartoum", "type": "file" }, { - "bom-ref": "3496d6643feb9c63", + "bom-ref": "377366c1eb613363", "name": "/usr/share/zoneinfo/Africa/Kigali", "type": "file" }, { - "bom-ref": "72662d30a757d0e5", + "bom-ref": "caeca169c5390fdd", "name": "/usr/share/zoneinfo/Africa/Kinshasa", "type": "file" }, { - "bom-ref": "597069056c8e8613", + "bom-ref": "39e4b4dc80421737", "name": "/usr/share/zoneinfo/Africa/Lagos", "type": "file" }, { - "bom-ref": "dbc942b8a15dd75a", + "bom-ref": "59dfbbfbaeec9c2e", "name": "/usr/share/zoneinfo/Africa/Libreville", "type": "file" }, { - "bom-ref": "6f19be8e0fde8e74", + "bom-ref": "db996edcff4531ac", "name": "/usr/share/zoneinfo/Africa/Lome", "type": "file" }, { - "bom-ref": "8f7417e1aa0035cd", + "bom-ref": "6b7b23caa1293bf1", "name": "/usr/share/zoneinfo/Africa/Luanda", "type": "file" }, { - "bom-ref": "cb1ee985fae40eb7", + "bom-ref": "728baf70b4f5360b", "name": "/usr/share/zoneinfo/Africa/Lubumbashi", "type": "file" }, { - "bom-ref": "147818e8643e42fd", + "bom-ref": "305f0e13013b34b5", "name": "/usr/share/zoneinfo/Africa/Lusaka", "type": "file" }, { - "bom-ref": "2191b95ca773b33e", + "bom-ref": "82c36ecd9ae6780a", "name": "/usr/share/zoneinfo/Africa/Malabo", "type": "file" }, { - "bom-ref": "8c0310d7a69e307a", + "bom-ref": "425188c270072db6", "name": "/usr/share/zoneinfo/Africa/Maputo", "type": "file" }, { - "bom-ref": "154edd0c03e48ece", + "bom-ref": "a66dbf60ad2cfab2", "name": "/usr/share/zoneinfo/Africa/Maseru", "type": "file" }, { - "bom-ref": "5815b7285abbd545", + "bom-ref": "edcae18f1b794c59", "name": "/usr/share/zoneinfo/Africa/Mbabane", "type": "file" }, { - "bom-ref": "ec8a7f3f4f31b4f3", + "bom-ref": "0d4fd73abd91f0c7", "name": "/usr/share/zoneinfo/Africa/Mogadishu", "type": "file" }, { - "bom-ref": "95741bc520d4af26", + "bom-ref": "63bcd7c2b4bcde2e", "name": "/usr/share/zoneinfo/Africa/Monrovia", "type": "file" }, { - "bom-ref": "02381c4abf7fd131", + "bom-ref": "f9dd869c79d5b311", "name": "/usr/share/zoneinfo/Africa/Nairobi", "type": "file" }, { - "bom-ref": "d45e2128b8038d98", + "bom-ref": "4b3093a8a851c538", "name": "/usr/share/zoneinfo/Africa/Ndjamena", "type": "file" }, { - "bom-ref": "6af66c04184f1c1d", + "bom-ref": "d3f2c1c838332d69", "name": "/usr/share/zoneinfo/Africa/Niamey", "type": "file" }, { - "bom-ref": "1379afc6522a5784", + "bom-ref": "a18be5845a8d6d18", "name": "/usr/share/zoneinfo/Africa/Nouakchott", "type": "file" }, { - "bom-ref": "1388693ac4ed4e29", + "bom-ref": "7ea8161baa18fb65", "name": "/usr/share/zoneinfo/Africa/Ouagadougou", "type": "file" }, { - "bom-ref": "3c25c0b1b32d63ba", + "bom-ref": "749cd624ed16230a", "name": "/usr/share/zoneinfo/Africa/Porto-Novo", "type": "file" }, { - "bom-ref": "860529ff5e1ab2ce", + "bom-ref": "d990b8b4f17e7bbe", "name": "/usr/share/zoneinfo/Africa/Sao_Tome", "type": "file" }, { - "bom-ref": "b60d4121d5aef8ed", + "bom-ref": "575acf0d0dd08505", "name": "/usr/share/zoneinfo/Africa/Tripoli", "type": "file" }, { - "bom-ref": "08c01f928495ddce", + "bom-ref": "588710cce6fbdf6a", "name": "/usr/share/zoneinfo/Africa/Tunis", "type": "file" }, { - "bom-ref": "f5281d8e439f58ce", + "bom-ref": "2823945468c6e53a", "name": "/usr/share/zoneinfo/Africa/Windhoek", "type": "file" }, { - "bom-ref": "0b856729afec2526", + "bom-ref": "1b8af7c4651245be", "name": "/usr/share/zoneinfo/America/Adak", "type": "file" }, { - "bom-ref": "7ea3c2d1183d37e2", + "bom-ref": "52309dd7c16cfbaa", "name": "/usr/share/zoneinfo/America/Anchorage", "type": "file" }, { - "bom-ref": "85dbfd52ebcf8839", + "bom-ref": "7305cb48a28a4669", "name": "/usr/share/zoneinfo/America/Anguilla", "type": "file" }, { - "bom-ref": "5e7f270ccaca221c", + "bom-ref": "f53155e31060e6d8", "name": "/usr/share/zoneinfo/America/Antigua", "type": "file" }, { - "bom-ref": "15f5094f624c9178", + "bom-ref": "0dcca5527d4e78a0", "name": "/usr/share/zoneinfo/America/Araguaina", "type": "file" }, { - "bom-ref": "0a28dec7adf24cfd", + "bom-ref": "9a50ca1b4b5a6d49", "name": "/usr/share/zoneinfo/America/Argentina/Buenos_Aires", "type": "file" }, { - "bom-ref": "1feba622c34aef6f", + "bom-ref": "ea1f6e9e0126c5a3", "name": "/usr/share/zoneinfo/America/Argentina/Catamarca", "type": "file" }, { - "bom-ref": "7b3e4c0da70d2dd3", + "bom-ref": "9d035bd9eebe3453", "name": "/usr/share/zoneinfo/America/Argentina/Cordoba", "type": "file" }, { - "bom-ref": "c7c675ef1c344046", + "bom-ref": "dbc8f606caf749d6", "name": "/usr/share/zoneinfo/America/Argentina/Jujuy", "type": "file" }, { - "bom-ref": "4c96da2c07c18ec4", + "bom-ref": "d1b873bf99498044", "name": "/usr/share/zoneinfo/America/Argentina/La_Rioja", "type": "file" }, { - "bom-ref": "4fc3d5130662f895", + "bom-ref": "6dd44cdb4106b149", "name": "/usr/share/zoneinfo/America/Argentina/Mendoza", "type": "file" }, { - "bom-ref": "9dd9e9d774a56aa7", + "bom-ref": "cc11222e985468af", "name": "/usr/share/zoneinfo/America/Argentina/Rio_Gallegos", "type": "file" }, { - "bom-ref": "c0445706e20ed3b2", + "bom-ref": "b1dd1ac1269b7cae", "name": "/usr/share/zoneinfo/America/Argentina/Salta", "type": "file" }, { - "bom-ref": "a1dbacf318f6df25", + "bom-ref": "7e148d2c568a96c5", "name": "/usr/share/zoneinfo/America/Argentina/San_Juan", "type": "file" }, { - "bom-ref": "5cd56adbb78ea4d9", + "bom-ref": "b8c3d5ec340239ed", "name": "/usr/share/zoneinfo/America/Argentina/San_Luis", "type": "file" }, { - "bom-ref": "3da13015f4367a8b", + "bom-ref": "668e49c9bdfa096f", "name": "/usr/share/zoneinfo/America/Argentina/Tucuman", "type": "file" }, { - "bom-ref": "d5152f87cf894eb3", + "bom-ref": "10263909c840679b", "name": "/usr/share/zoneinfo/America/Argentina/Ushuaia", "type": "file" }, { - "bom-ref": "ed3cc56b6b050c90", + "bom-ref": "d67380fb672fe628", "name": "/usr/share/zoneinfo/America/Aruba", "type": "file" }, { - "bom-ref": "95f391581227ecd9", + "bom-ref": "39e60720ac030229", "name": "/usr/share/zoneinfo/America/Asuncion", "type": "file" }, { - "bom-ref": "382afff094534e32", + "bom-ref": "2fea6ee674c230c6", "name": "/usr/share/zoneinfo/America/Atikokan", "type": "file" }, { - "bom-ref": "b99a4091a14407c7", + "bom-ref": "35dc630dda242cef", "name": "/usr/share/zoneinfo/America/Bahia", "type": "file" }, { - "bom-ref": "d7702b07482bef71", + "bom-ref": "976690f129d91e21", "name": "/usr/share/zoneinfo/America/Bahia_Banderas", "type": "file" }, { - "bom-ref": "a2f74dd7fdabdf1e", + "bom-ref": "a9a35e89f3144a1e", "name": "/usr/share/zoneinfo/America/Barbados", "type": "file" }, { - "bom-ref": "5206c2dff08940db", + "bom-ref": "92045138ddb11f6b", "name": "/usr/share/zoneinfo/America/Belem", "type": "file" }, { - "bom-ref": "3682072e825765e6", + "bom-ref": "0e0ca78551b11c8a", "name": "/usr/share/zoneinfo/America/Belize", "type": "file" }, { - "bom-ref": "c0a5992a035565c0", + "bom-ref": "131eaa5ae8086e48", "name": "/usr/share/zoneinfo/America/Blanc-Sablon", "type": "file" }, { - "bom-ref": "10215ae7665165e9", + "bom-ref": "278123366e98c171", "name": "/usr/share/zoneinfo/America/Boa_Vista", "type": "file" }, { - "bom-ref": "d4f62275f1b082a0", + "bom-ref": "152a54ab5cfa0728", "name": "/usr/share/zoneinfo/America/Bogota", "type": "file" }, { - "bom-ref": "b4fa05539664a44f", + "bom-ref": "e66538c75d1c590b", "name": "/usr/share/zoneinfo/America/Boise", "type": "file" }, { - "bom-ref": "e26c77e4703628dd", + "bom-ref": "6336d1ed5f9e8151", "name": "/usr/share/zoneinfo/America/Cambridge_Bay", "type": "file" }, { - "bom-ref": "e583de64933ad850", + "bom-ref": "a2896e649b303518", "name": "/usr/share/zoneinfo/America/Campo_Grande", "type": "file" }, { - "bom-ref": "50a1401f077703dc", + "bom-ref": "216195da72dde79c", "name": "/usr/share/zoneinfo/America/Cancun", "type": "file" }, { - "bom-ref": "0145f3793bdcb6a7", + "bom-ref": "1372251334ed614f", "name": "/usr/share/zoneinfo/America/Caracas", "type": "file" }, { - "bom-ref": "17f024de5e119232", + "bom-ref": "53661e631fc56b42", "name": "/usr/share/zoneinfo/America/Cayenne", "type": "file" }, { - "bom-ref": "64335d7537f5a5ed", + "bom-ref": "6803d916d4846691", "name": "/usr/share/zoneinfo/America/Cayman", "type": "file" }, { - "bom-ref": "19f460d5bf34ec9d", + "bom-ref": "f7d7a02fd34f9b15", "name": "/usr/share/zoneinfo/America/Chicago", "type": "file" }, { - "bom-ref": "de67092b420590dd", + "bom-ref": "37357908d0827a3d", "name": "/usr/share/zoneinfo/America/Chihuahua", "type": "file" }, { - "bom-ref": "f856034201643712", + "bom-ref": "9104fb3362baf16e", "name": "/usr/share/zoneinfo/America/Ciudad_Juarez", "type": "file" }, { - "bom-ref": "4242732e01ed9a53", + "bom-ref": "6a948593175653eb", "name": "/usr/share/zoneinfo/America/Costa_Rica", "type": "file" }, { - "bom-ref": "9dbfbd6250f1e3b3", + "bom-ref": "c5ce3e0e45edf84f", "name": "/usr/share/zoneinfo/America/Coyhaique", "type": "file" }, { - "bom-ref": "6953ad46cc2b24ef", + "bom-ref": "1e912e3ffb0d9793", "name": "/usr/share/zoneinfo/America/Creston", "type": "file" }, { - "bom-ref": "8d22e83f6cb8e0e4", + "bom-ref": "c111caae673bd048", "name": "/usr/share/zoneinfo/America/Cuiaba", "type": "file" }, { - "bom-ref": "273985465d5bdea9", + "bom-ref": "958aaaefd92d5e85", "name": "/usr/share/zoneinfo/America/Curacao", "type": "file" }, { - "bom-ref": "f69253bc59a2047d", + "bom-ref": "fedff05b48e4c461", "name": "/usr/share/zoneinfo/America/Danmarkshavn", "type": "file" }, { - "bom-ref": "65d9fa9d2c2fd8d1", + "bom-ref": "20578b44d6ea51bd", "name": "/usr/share/zoneinfo/America/Dawson", "type": "file" }, { - "bom-ref": "788252af3a5b0ac8", + "bom-ref": "c536756201d400c8", "name": "/usr/share/zoneinfo/America/Dawson_Creek", "type": "file" }, { - "bom-ref": "45f37e17a7462e89", + "bom-ref": "d379937657199a39", "name": "/usr/share/zoneinfo/America/Denver", "type": "file" }, { - "bom-ref": "491ca45d6a767849", + "bom-ref": "02f22c9f49003fc9", "name": "/usr/share/zoneinfo/America/Detroit", "type": "file" }, { - "bom-ref": "53397aca0babf8f3", + "bom-ref": "797e5cc5d6810507", "name": "/usr/share/zoneinfo/America/Dominica", "type": "file" }, { - "bom-ref": "985c81e8670b3ec0", + "bom-ref": "dc5d80435317f400", "name": "/usr/share/zoneinfo/America/Edmonton", "type": "file" }, { - "bom-ref": "efd91e8b197f2220", + "bom-ref": "ca1f20712a671fd8", "name": "/usr/share/zoneinfo/America/Eirunepe", "type": "file" }, { - "bom-ref": "59a7c48a3aa7b774", + "bom-ref": "b70551ad5ed572a0", "name": "/usr/share/zoneinfo/America/El_Salvador", "type": "file" }, { - "bom-ref": "eae2e9c59a615a54", + "bom-ref": "4d8d160192dd1614", "name": "/usr/share/zoneinfo/America/Fort_Nelson", "type": "file" }, { - "bom-ref": "3697262262033f4e", + "bom-ref": "a6d5bbfcd3630c42", "name": "/usr/share/zoneinfo/America/Fortaleza", "type": "file" }, { - "bom-ref": "ddd328eff04c29e8", + "bom-ref": "dc11d70f2d3304a8", "name": "/usr/share/zoneinfo/America/Glace_Bay", "type": "file" }, { - "bom-ref": "c22b89d30b806315", + "bom-ref": "240c10621014ecb9", "name": "/usr/share/zoneinfo/America/Goose_Bay", "type": "file" }, { - "bom-ref": "f453541ef1be7485", + "bom-ref": "b1dff3c7fcd8d2f5", "name": "/usr/share/zoneinfo/America/Grand_Turk", "type": "file" }, { - "bom-ref": "d3b55a43413fd014", + "bom-ref": "f1c0de68cebb9e0c", "name": "/usr/share/zoneinfo/America/Grenada", "type": "file" }, { - "bom-ref": "ca673f14bcb7057d", + "bom-ref": "d36bfc4e884718c1", "name": "/usr/share/zoneinfo/America/Guadeloupe", "type": "file" }, { - "bom-ref": "a9a42620090b00f2", + "bom-ref": "e9d17bb5ec942dda", "name": "/usr/share/zoneinfo/America/Guatemala", "type": "file" }, { - "bom-ref": "cc99af543e02af83", + "bom-ref": "31c4c8202f7ef963", "name": "/usr/share/zoneinfo/America/Guayaquil", "type": "file" }, { - "bom-ref": "21dadbe022bc8fac", + "bom-ref": "ccfb30249201fe1c", "name": "/usr/share/zoneinfo/America/Guyana", "type": "file" }, { - "bom-ref": "f12d321613fd80dd", + "bom-ref": "ac51ea5115fc98d5", "name": "/usr/share/zoneinfo/America/Halifax", "type": "file" }, { - "bom-ref": "2183d4e7a6cf69ad", + "bom-ref": "fdef8a94a4c9fce1", "name": "/usr/share/zoneinfo/America/Havana", "type": "file" }, { - "bom-ref": "1a9c973f75baab6d", + "bom-ref": "470ff51bc3ca810d", "name": "/usr/share/zoneinfo/America/Hermosillo", "type": "file" }, { - "bom-ref": "60594c705cf00629", + "bom-ref": "eb66b725dbc3a7ed", "name": "/usr/share/zoneinfo/America/Indiana/Indianapolis", "type": "file" }, { - "bom-ref": "5a5ccd0edb50d060", + "bom-ref": "c010a0b3f475f318", "name": "/usr/share/zoneinfo/America/Indiana/Knox", "type": "file" }, { - "bom-ref": "4de8c24543b8776a", + "bom-ref": "ec301b4287af2ab6", "name": "/usr/share/zoneinfo/America/Indiana/Marengo", "type": "file" }, { - "bom-ref": "08656852ffbf3eab", + "bom-ref": "e91ac05a543b4003", "name": "/usr/share/zoneinfo/America/Indiana/Petersburg", "type": "file" }, { - "bom-ref": "aaf499b1e5cc0207", + "bom-ref": "80e8132b711b99ef", "name": "/usr/share/zoneinfo/America/Indiana/Tell_City", "type": "file" }, { - "bom-ref": "ffbc9654a820c432", + "bom-ref": "6809b8176da63b52", "name": "/usr/share/zoneinfo/America/Indiana/Vevay", "type": "file" }, { - "bom-ref": "010b64423daa66be", + "bom-ref": "058678bd924ad612", "name": "/usr/share/zoneinfo/America/Indiana/Vincennes", "type": "file" }, { - "bom-ref": "669ffe2206825c12", + "bom-ref": "e79010f44f55f40e", "name": "/usr/share/zoneinfo/America/Indiana/Winamac", "type": "file" }, { - "bom-ref": "17ecd9fb9f42d4d7", + "bom-ref": "12c461789c91c623", "name": "/usr/share/zoneinfo/America/Inuvik", "type": "file" }, { - "bom-ref": "1d3231ea98cbd087", + "bom-ref": "e1cbb18519ba9be3", "name": "/usr/share/zoneinfo/America/Iqaluit", "type": "file" }, { - "bom-ref": "06896fb56d933390", + "bom-ref": "7f1c9181331de830", "name": "/usr/share/zoneinfo/America/Jamaica", "type": "file" }, { - "bom-ref": "4e11b9dc4e60aae7", + "bom-ref": "cf7c9237bb443e8b", "name": "/usr/share/zoneinfo/America/Juneau", "type": "file" }, { - "bom-ref": "8f7fddb5c52f1f1a", + "bom-ref": "91fb9c1764d058e6", "name": "/usr/share/zoneinfo/America/Kentucky/Louisville", "type": "file" }, { - "bom-ref": "e721ae9117538ab7", + "bom-ref": "a6792594cd92043b", "name": "/usr/share/zoneinfo/America/Kentucky/Monticello", "type": "file" }, { - "bom-ref": "87c8f199fc7c06ca", + "bom-ref": "5724f3968baf06a2", "name": "/usr/share/zoneinfo/America/La_Paz", "type": "file" }, { - "bom-ref": "808a2895a5e441ad", + "bom-ref": "afbbb692ea4ae095", "name": "/usr/share/zoneinfo/America/Lima", "type": "file" }, { - "bom-ref": "77d2e4789d7a4002", + "bom-ref": "2ad7beb848458dd6", "name": "/usr/share/zoneinfo/America/Los_Angeles", "type": "file" }, { - "bom-ref": "1996ec52f006ade6", + "bom-ref": "10154243692f3dfa", "name": "/usr/share/zoneinfo/America/Maceio", "type": "file" }, { - "bom-ref": "bc4c558eca658a91", + "bom-ref": "4416182a7417e259", "name": "/usr/share/zoneinfo/America/Managua", "type": "file" }, { - "bom-ref": "4d5ad2baec90c579", + "bom-ref": "e545115191725659", "name": "/usr/share/zoneinfo/America/Manaus", "type": "file" }, { - "bom-ref": "941b2a99a3163ab7", + "bom-ref": "c300063a76e47093", "name": "/usr/share/zoneinfo/America/Martinique", "type": "file" }, { - "bom-ref": "240f8c48688d79fd", + "bom-ref": "b63ca18372370c59", "name": "/usr/share/zoneinfo/America/Matamoros", "type": "file" }, { - "bom-ref": "7b4e1b8dca2331f7", + "bom-ref": "3e193a4e79992143", "name": "/usr/share/zoneinfo/America/Mazatlan", "type": "file" }, { - "bom-ref": "ebf348119c973871", + "bom-ref": "b7b477f1f3d7d569", "name": "/usr/share/zoneinfo/America/Menominee", "type": "file" }, { - "bom-ref": "ae10256956522485", + "bom-ref": "bdab1b15977438b9", "name": "/usr/share/zoneinfo/America/Merida", "type": "file" }, { - "bom-ref": "b04e1cc5e61b4cb9", + "bom-ref": "bd5c3a7828e8afe5", "name": "/usr/share/zoneinfo/America/Metlakatla", "type": "file" }, { - "bom-ref": "f4f645bf8cc27b81", + "bom-ref": "4f2855ec6e938d8d", "name": "/usr/share/zoneinfo/America/Mexico_City", "type": "file" }, { - "bom-ref": "79e3e6297849508a", + "bom-ref": "8136e6b400d18fbe", "name": "/usr/share/zoneinfo/America/Miquelon", "type": "file" }, { - "bom-ref": "2c101e27c9c28fcb", + "bom-ref": "e57e774aa87cb073", "name": "/usr/share/zoneinfo/America/Moncton", "type": "file" }, { - "bom-ref": "fdc6dad6cb27bb57", + "bom-ref": "8bc5b0e073400503", "name": "/usr/share/zoneinfo/America/Monterrey", "type": "file" }, { - "bom-ref": "e15e4dab6006af7d", + "bom-ref": "b21e7dd280733d8d", "name": "/usr/share/zoneinfo/America/Montevideo", "type": "file" }, { - "bom-ref": "b50b9e018d10816f", + "bom-ref": "25897b0e9b7aeadf", "name": "/usr/share/zoneinfo/America/Montserrat", "type": "file" }, { - "bom-ref": "e68e752be0450887", + "bom-ref": "04500e3001c3b57b", "name": "/usr/share/zoneinfo/America/Nassau", "type": "file" }, { - "bom-ref": "3db7293b00330196", + "bom-ref": "313d444e992ef906", "name": "/usr/share/zoneinfo/America/New_York", "type": "file" }, { - "bom-ref": "8b9f1d3fb20db8e3", + "bom-ref": "3ec7820be3ffdb37", "name": "/usr/share/zoneinfo/America/Nome", "type": "file" }, { - "bom-ref": "c2c5004c976f26d6", + "bom-ref": "f3ebbef503dc81f6", "name": "/usr/share/zoneinfo/America/Noronha", "type": "file" }, { - "bom-ref": "12e6eb8667db3102", + "bom-ref": "0f41ac91772c68f6", "name": "/usr/share/zoneinfo/America/North_Dakota/Beulah", "type": "file" }, { - "bom-ref": "0eea618c78b16e9c", + "bom-ref": "7d1cbf5d63fc9460", "name": "/usr/share/zoneinfo/America/North_Dakota/Center", "type": "file" }, { - "bom-ref": "aa216fec83ec427a", + "bom-ref": "7019765e5fe8201e", "name": "/usr/share/zoneinfo/America/North_Dakota/New_Salem", "type": "file" }, { - "bom-ref": "a91a4f031bbf6f7b", + "bom-ref": "57649c9cb80347df", "name": "/usr/share/zoneinfo/America/Nuuk", "type": "file" }, { - "bom-ref": "2a26acf4cf2fffc9", + "bom-ref": "44164c070540eb51", "name": "/usr/share/zoneinfo/America/Ojinaga", "type": "file" }, { - "bom-ref": "7356439071664af7", + "bom-ref": "4f3d5cbe6bef0c67", "name": "/usr/share/zoneinfo/America/Panama", "type": "file" }, { - "bom-ref": "1d6b8a4d90160241", + "bom-ref": "b1dd4da63990e811", "name": "/usr/share/zoneinfo/America/Paramaribo", "type": "file" }, { - "bom-ref": "79189ef29db3a672", + "bom-ref": "6d11a84a6cb29582", "name": "/usr/share/zoneinfo/America/Phoenix", "type": "file" }, { - "bom-ref": "e66e68e8dfb19659", + "bom-ref": "f46c56bc8a3dc845", "name": "/usr/share/zoneinfo/America/Port-au-Prince", "type": "file" }, { - "bom-ref": "3e54318f3805112a", + "bom-ref": "7a0a7070521d2b52", "name": "/usr/share/zoneinfo/America/Port_of_Spain", "type": "file" }, { - "bom-ref": "69553d1bcdb402e0", + "bom-ref": "f7c339dd77a03fec", "name": "/usr/share/zoneinfo/America/Porto_Velho", "type": "file" }, { - "bom-ref": "3d858b5d4af71686", + "bom-ref": "2bd4739dac92a46a", "name": "/usr/share/zoneinfo/America/Puerto_Rico", "type": "file" }, { - "bom-ref": "404f68243958a9a6", + "bom-ref": "ae58efcd84162272", "name": "/usr/share/zoneinfo/America/Punta_Arenas", "type": "file" }, { - "bom-ref": "66a1351f13f29df2", + "bom-ref": "ea54b20a1bdd85f2", "name": "/usr/share/zoneinfo/America/Rankin_Inlet", "type": "file" }, { - "bom-ref": "61100917c8cf3f64", + "bom-ref": "0a4dc2eac5c68a8c", "name": "/usr/share/zoneinfo/America/Recife", "type": "file" }, { - "bom-ref": "5440f2014ffcea0d", + "bom-ref": "7d608f17afe34acd", "name": "/usr/share/zoneinfo/America/Regina", "type": "file" }, { - "bom-ref": "9234a43bfa8d9cba", + "bom-ref": "04ae2155e1f16ef2", "name": "/usr/share/zoneinfo/America/Resolute", "type": "file" }, { - "bom-ref": "55aa8553e1b662da", + "bom-ref": "027029914cc3f84e", "name": "/usr/share/zoneinfo/America/Rio_Branco", "type": "file" }, { - "bom-ref": "375b944747859dab", + "bom-ref": "0b91c465b6005f87", "name": "/usr/share/zoneinfo/America/Santarem", "type": "file" }, { - "bom-ref": "c1600bd67e0e1798", + "bom-ref": "0458c28f643732dc", "name": "/usr/share/zoneinfo/America/Santiago", "type": "file" }, { - "bom-ref": "a59e50c467efdb90", + "bom-ref": "f85207ca04846f14", "name": "/usr/share/zoneinfo/America/Santo_Domingo", "type": "file" }, { - "bom-ref": "fdce85462b527552", + "bom-ref": "f8803e0c32663ee2", "name": "/usr/share/zoneinfo/America/Sao_Paulo", "type": "file" }, { - "bom-ref": "a3991a8f9edd27a2", + "bom-ref": "9b7504de834e7bc2", "name": "/usr/share/zoneinfo/America/Scoresbysund", "type": "file" }, { - "bom-ref": "bfddaf10d6eeca4d", + "bom-ref": "4f1d6c02a20f1225", "name": "/usr/share/zoneinfo/America/Sitka", "type": "file" }, { - "bom-ref": "885b9aca0d03baca", + "bom-ref": "abfd3c7157bcba7a", "name": "/usr/share/zoneinfo/America/St_Johns", "type": "file" }, { - "bom-ref": "f2665432c84733dd", + "bom-ref": "53a0936446a86cdd", "name": "/usr/share/zoneinfo/America/St_Kitts", "type": "file" }, { - "bom-ref": "7a4ffa90564453b6", + "bom-ref": "728b63c86b94bdaa", "name": "/usr/share/zoneinfo/America/St_Lucia", "type": "file" }, { - "bom-ref": "72e8160f36c99d67", + "bom-ref": "08df3d1440d7ad4b", "name": "/usr/share/zoneinfo/America/St_Thomas", "type": "file" }, { - "bom-ref": "80b8da915e007fd3", + "bom-ref": "ef045d24e79ef487", "name": "/usr/share/zoneinfo/America/St_Vincent", "type": "file" }, { - "bom-ref": "8d7efa77c94de3c5", + "bom-ref": "b0b8e1c5b53d5211", "name": "/usr/share/zoneinfo/America/Swift_Current", "type": "file" }, { - "bom-ref": "8b609c0e4c017266", + "bom-ref": "d9a68abcdd2a4fbe", "name": "/usr/share/zoneinfo/America/Tegucigalpa", "type": "file" }, { - "bom-ref": "bd5bcde23961ff1e", + "bom-ref": "5b0e01df883d15d2", "name": "/usr/share/zoneinfo/America/Thule", "type": "file" }, { - "bom-ref": "89bc4ae7d012c70d", + "bom-ref": "c21ca619aab0db69", "name": "/usr/share/zoneinfo/America/Tijuana", "type": "file" }, { - "bom-ref": "16ee815ad43ccadf", + "bom-ref": "30e086230badeb6f", "name": "/usr/share/zoneinfo/America/Toronto", "type": "file" }, { - "bom-ref": "cbb5842aec6099e7", + "bom-ref": "90169405e6ae592f", "name": "/usr/share/zoneinfo/America/Tortola", "type": "file" }, { - "bom-ref": "1b009f0369de902c", + "bom-ref": "3005dae3413a1fec", "name": "/usr/share/zoneinfo/America/Vancouver", "type": "file" }, { - "bom-ref": "2f58f0b1367a68c5", + "bom-ref": "4ea5c68bee378f7d", "name": "/usr/share/zoneinfo/America/Whitehorse", "type": "file" }, { - "bom-ref": "ccd02da07d3c64be", + "bom-ref": "54845afcaa0937fe", "name": "/usr/share/zoneinfo/America/Winnipeg", "type": "file" }, { - "bom-ref": "26208f235b8e176e", + "bom-ref": "c645cfdf9e987f6e", "name": "/usr/share/zoneinfo/America/Yakutat", "type": "file" }, { - "bom-ref": "9b3443f245aa2527", + "bom-ref": "2eb0d4700d37b9ff", "name": "/usr/share/zoneinfo/Antarctica/Casey", "type": "file" }, { - "bom-ref": "7e486bc5bd6bd960", + "bom-ref": "3dc631ccfa36c33c", "name": "/usr/share/zoneinfo/Antarctica/Davis", "type": "file" }, { - "bom-ref": "c2492db77d97f112", + "bom-ref": "e9617f71f08fab32", "name": "/usr/share/zoneinfo/Antarctica/DumontDUrville", "type": "file" }, { - "bom-ref": "d1c057c776d615d4", + "bom-ref": "8c6a26742f516210", "name": "/usr/share/zoneinfo/Antarctica/Macquarie", "type": "file" }, { - "bom-ref": "1a9882435559d2fe", + "bom-ref": "af0cbcf33952bfd6", "name": "/usr/share/zoneinfo/Antarctica/Mawson", "type": "file" }, { - "bom-ref": "cf119285fd8e42f1", + "bom-ref": "4580ba29611fdfcd", "name": "/usr/share/zoneinfo/Antarctica/McMurdo", "type": "file" }, { - "bom-ref": "b9969d8dc4b32868", + "bom-ref": "e8c0408226179908", "name": "/usr/share/zoneinfo/Antarctica/Palmer", "type": "file" }, { - "bom-ref": "367fb9b95c038195", + "bom-ref": "81c6587ac5388345", "name": "/usr/share/zoneinfo/Antarctica/Rothera", "type": "file" }, { - "bom-ref": "79a318fb117974c1", + "bom-ref": "0b6b34b090e947f9", "name": "/usr/share/zoneinfo/Antarctica/Syowa", "type": "file" }, { - "bom-ref": "28121281daff2dae", + "bom-ref": "3eaa81f7c878b4c6", "name": "/usr/share/zoneinfo/Antarctica/Troll", "type": "file" }, { - "bom-ref": "6c5cfcb1d6a5dc46", + "bom-ref": "a599a81007182c8a", "name": "/usr/share/zoneinfo/Antarctica/Vostok", "type": "file" }, { - "bom-ref": "94b8c79e5f2465a9", + "bom-ref": "4af2ec6dab821a41", "name": "/usr/share/zoneinfo/Asia/Aden", "type": "file" }, { - "bom-ref": "e3d79fea8f61592c", + "bom-ref": "a44dbe3d07982f38", "name": "/usr/share/zoneinfo/Asia/Almaty", "type": "file" }, { - "bom-ref": "d3c93399efbcd17a", + "bom-ref": "d81279522f269b4a", "name": "/usr/share/zoneinfo/Asia/Amman", "type": "file" }, { - "bom-ref": "5022251dba7c1839", + "bom-ref": "c7bfa183f7973d41", "name": "/usr/share/zoneinfo/Asia/Anadyr", "type": "file" }, { - "bom-ref": "a1573061e1a40707", + "bom-ref": "b157f5336512c30f", "name": "/usr/share/zoneinfo/Asia/Aqtau", "type": "file" }, { - "bom-ref": "f09ecffc8f9fbeff", + "bom-ref": "58f4156906aa718b", "name": "/usr/share/zoneinfo/Asia/Aqtobe", "type": "file" }, { - "bom-ref": "74d03c3c7119c155", + "bom-ref": "618c0c0fecf2bc99", "name": "/usr/share/zoneinfo/Asia/Ashgabat", "type": "file" }, { - "bom-ref": "9c7366e19f1c142e", + "bom-ref": "6e420e1aba2b1d8a", "name": "/usr/share/zoneinfo/Asia/Atyrau", "type": "file" }, { - "bom-ref": "902226676f8204dd", + "bom-ref": "d44a4be6f2fd5b5d", "name": "/usr/share/zoneinfo/Asia/Baghdad", "type": "file" }, { - "bom-ref": "1e86462e14eea644", + "bom-ref": "5786528635d96968", "name": "/usr/share/zoneinfo/Asia/Bahrain", "type": "file" }, { - "bom-ref": "3f28d46a658e83f5", + "bom-ref": "857a11b2e0400e09", "name": "/usr/share/zoneinfo/Asia/Baku", "type": "file" }, { - "bom-ref": "d3b4bdaf3e5f9a71", + "bom-ref": "6d06036cfa6a3c55", "name": "/usr/share/zoneinfo/Asia/Bangkok", "type": "file" }, { - "bom-ref": "8717f2622b2f197c", + "bom-ref": "786b79a69fff70fc", "name": "/usr/share/zoneinfo/Asia/Barnaul", "type": "file" }, { - "bom-ref": "cc99ef8bac000a24", + "bom-ref": "642a7ff9716a0488", "name": "/usr/share/zoneinfo/Asia/Beirut", "type": "file" }, { - "bom-ref": "1cbf2c03367fb070", + "bom-ref": "e80b3d2a8371fc6c", "name": "/usr/share/zoneinfo/Asia/Bishkek", "type": "file" }, { - "bom-ref": "49e7d7f3d4439821", + "bom-ref": "ad0bf72278f80079", "name": "/usr/share/zoneinfo/Asia/Brunei", "type": "file" }, { - "bom-ref": "b212d2080fba7d1f", + "bom-ref": "7398567a4dcd7c4f", "name": "/usr/share/zoneinfo/Asia/Chita", "type": "file" }, { - "bom-ref": "e9f39ab3cfd2f973", + "bom-ref": "afe7eb76813ff377", "name": "/usr/share/zoneinfo/Asia/Colombo", "type": "file" }, { - "bom-ref": "23ca0b0b6dc4679e", + "bom-ref": "66098e17a8c2d106", "name": "/usr/share/zoneinfo/Asia/Damascus", "type": "file" }, { - "bom-ref": "376d3b78aea74dcd", + "bom-ref": "0a123715512755d9", "name": "/usr/share/zoneinfo/Asia/Dhaka", "type": "file" }, { - "bom-ref": "db0f8686d5eee586", + "bom-ref": "d1d400c46fc017c6", "name": "/usr/share/zoneinfo/Asia/Dili", "type": "file" }, { - "bom-ref": "2def2cfb3a90fec1", + "bom-ref": "65ec482473b3a5d1", "name": "/usr/share/zoneinfo/Asia/Dubai", "type": "file" }, { - "bom-ref": "aa038cceb1fadd79", + "bom-ref": "665fa4991328f4ad", "name": "/usr/share/zoneinfo/Asia/Dushanbe", "type": "file" }, { - "bom-ref": "1778810194c66251", + "bom-ref": "2a8e2b02bc9d5b4d", "name": "/usr/share/zoneinfo/Asia/Famagusta", "type": "file" }, { - "bom-ref": "8dd2809d705229c5", + "bom-ref": "c7ec4c811262f645", "name": "/usr/share/zoneinfo/Asia/Gaza", "type": "file" }, { - "bom-ref": "fd675e44ee11b119", + "bom-ref": "31f7fe33b2d04641", "name": "/usr/share/zoneinfo/Asia/Hebron", "type": "file" }, { - "bom-ref": "95c89037920dd14d", + "bom-ref": "e422043110ab2ef1", "name": "/usr/share/zoneinfo/Asia/Ho_Chi_Minh", "type": "file" }, { - "bom-ref": "4b1a80d23bd1a77d", + "bom-ref": "55b2a1ccd69ab7d1", "name": "/usr/share/zoneinfo/Asia/Hong_Kong", "type": "file" }, { - "bom-ref": "400fe739460cf693", + "bom-ref": "f585f8d0533b6197", "name": "/usr/share/zoneinfo/Asia/Hovd", "type": "file" }, { - "bom-ref": "aaf7e0d524ff0a93", + "bom-ref": "d2c47ed698760207", "name": "/usr/share/zoneinfo/Asia/Irkutsk", "type": "file" }, { - "bom-ref": "41ec639efbc9f151", + "bom-ref": "bcf47b2fc2638dd5", "name": "/usr/share/zoneinfo/Asia/Jakarta", "type": "file" }, { - "bom-ref": "6960361b37b53ea4", + "bom-ref": "79f13ab0e887fa44", "name": "/usr/share/zoneinfo/Asia/Jayapura", "type": "file" }, { - "bom-ref": "72675b6dea81ef48", + "bom-ref": "f548855d80be7730", "name": "/usr/share/zoneinfo/Asia/Jerusalem", "type": "file" }, { - "bom-ref": "cee4c84960ad2f11", + "bom-ref": "ef8ebab91b3db891", "name": "/usr/share/zoneinfo/Asia/Kabul", "type": "file" }, { - "bom-ref": "c58c07793bf92e47", + "bom-ref": "543397c507223513", "name": "/usr/share/zoneinfo/Asia/Kamchatka", "type": "file" }, { - "bom-ref": "032b470974eb9a59", + "bom-ref": "ecdbf9aae5df196d", "name": "/usr/share/zoneinfo/Asia/Karachi", "type": "file" }, { - "bom-ref": "6a64545a0f84a3b9", + "bom-ref": "79878d8ade56fdfd", "name": "/usr/share/zoneinfo/Asia/Kathmandu", "type": "file" }, { - "bom-ref": "a582d15815bd459a", + "bom-ref": "859d1ae10f432b96", "name": "/usr/share/zoneinfo/Asia/Khandyga", "type": "file" }, { - "bom-ref": "40a1a358d6ad372a", + "bom-ref": "580c03f797123466", "name": "/usr/share/zoneinfo/Asia/Kolkata", "type": "file" }, { - "bom-ref": "663eb66694c4ec7c", + "bom-ref": "ce98ea8acc347b0c", "name": "/usr/share/zoneinfo/Asia/Krasnoyarsk", "type": "file" }, { - "bom-ref": "7a2bdf192ce16d67", + "bom-ref": "56fa1ee807557e63", "name": "/usr/share/zoneinfo/Asia/Kuala_Lumpur", "type": "file" }, { - "bom-ref": "f99061f4d61fdae6", + "bom-ref": "717599e25db4a302", "name": "/usr/share/zoneinfo/Asia/Kuching", "type": "file" }, { - "bom-ref": "87231f026f344134", + "bom-ref": "10b79967de53c6dc", "name": "/usr/share/zoneinfo/Asia/Kuwait", "type": "file" }, { - "bom-ref": "6f26080f9210fd97", + "bom-ref": "f8aa320151b722d7", "name": "/usr/share/zoneinfo/Asia/Macau", "type": "file" }, { - "bom-ref": "00944d6f4379d87e", + "bom-ref": "456eafdf6a4958a2", "name": "/usr/share/zoneinfo/Asia/Magadan", "type": "file" }, { - "bom-ref": "16d6a90688dfd1d2", + "bom-ref": "7d68501f46a9fcaa", "name": "/usr/share/zoneinfo/Asia/Makassar", "type": "file" }, { - "bom-ref": "0ba928891d14187a", + "bom-ref": "b678eca3c1e59036", "name": "/usr/share/zoneinfo/Asia/Manila", "type": "file" }, { - "bom-ref": "36cc61b796c411fe", + "bom-ref": "d23febc9d1ab1fda", "name": "/usr/share/zoneinfo/Asia/Muscat", "type": "file" }, { - "bom-ref": "6a8659a68d7130a8", + "bom-ref": "71e797a1664a37d8", "name": "/usr/share/zoneinfo/Asia/Nicosia", "type": "file" }, { - "bom-ref": "809f7d7ba9a2f3fd", + "bom-ref": "9b75e651e4d41eb9", "name": "/usr/share/zoneinfo/Asia/Novokuznetsk", "type": "file" }, { - "bom-ref": "9499c391a349e71f", + "bom-ref": "ff954219c5197a2f", "name": "/usr/share/zoneinfo/Asia/Novosibirsk", "type": "file" }, { - "bom-ref": "ed53492a1f3da74e", + "bom-ref": "7f27a4dddbd3836e", "name": "/usr/share/zoneinfo/Asia/Omsk", "type": "file" }, { - "bom-ref": "487487a2d8fa8d65", + "bom-ref": "b60981e676dd924d", "name": "/usr/share/zoneinfo/Asia/Oral", "type": "file" }, { - "bom-ref": "b4e353ad29fae568", + "bom-ref": "40e452f2aebb3a30", "name": "/usr/share/zoneinfo/Asia/Phnom_Penh", "type": "file" }, { - "bom-ref": "ec9c4bfdf7ca0a6a", + "bom-ref": "dd211e679df9bb3e", "name": "/usr/share/zoneinfo/Asia/Pontianak", "type": "file" }, { - "bom-ref": "2f194b8c4b8aaf7d", + "bom-ref": "210788bf16b29355", "name": "/usr/share/zoneinfo/Asia/Pyongyang", "type": "file" }, { - "bom-ref": "743910a8ef356edc", + "bom-ref": "7943a5a58c706ed4", "name": "/usr/share/zoneinfo/Asia/Qatar", "type": "file" }, { - "bom-ref": "4ca801e1beab417d", + "bom-ref": "3b1dc91bd2c353b1", "name": "/usr/share/zoneinfo/Asia/Qostanay", "type": "file" }, { - "bom-ref": "9835f4234a4e3e2e", + "bom-ref": "4c2823d9f4bc28de", "name": "/usr/share/zoneinfo/Asia/Qyzylorda", "type": "file" }, { - "bom-ref": "52fe848ae4a91711", + "bom-ref": "30a6a0121fef3de1", "name": "/usr/share/zoneinfo/Asia/Riyadh", "type": "file" }, { - "bom-ref": "ad710c38925f5e29", + "bom-ref": "cceb99e79f770b11", "name": "/usr/share/zoneinfo/Asia/Sakhalin", "type": "file" }, { - "bom-ref": "9952d9063cb0eed6", + "bom-ref": "1a95e781e37b9c2a", "name": "/usr/share/zoneinfo/Asia/Samarkand", "type": "file" }, { - "bom-ref": "4bad98b0b8cf684d", + "bom-ref": "3b8296ca5e4b2721", "name": "/usr/share/zoneinfo/Asia/Seoul", "type": "file" }, { - "bom-ref": "d57793b2734b94d8", + "bom-ref": "f688dd37cef43868", "name": "/usr/share/zoneinfo/Asia/Shanghai", "type": "file" }, { - "bom-ref": "2347875d73c74498", + "bom-ref": "808734528bc786ac", "name": "/usr/share/zoneinfo/Asia/Singapore", "type": "file" }, { - "bom-ref": "3f7d7a0ad14981bf", + "bom-ref": "0ba4da0b4b3454d7", "name": "/usr/share/zoneinfo/Asia/Srednekolymsk", "type": "file" }, { - "bom-ref": "3be716b6d76a06b7", + "bom-ref": "35f1e8fc8350a6ef", "name": "/usr/share/zoneinfo/Asia/Taipei", "type": "file" }, { - "bom-ref": "4d5ece4a6fe38f4c", + "bom-ref": "20a5732a5cd07bf0", "name": "/usr/share/zoneinfo/Asia/Tashkent", "type": "file" }, { - "bom-ref": "d9426f85195f75c7", + "bom-ref": "a7b5cde7ad83b89b", "name": "/usr/share/zoneinfo/Asia/Tbilisi", "type": "file" }, { - "bom-ref": "6204a00e8760e6f4", + "bom-ref": "9c208ecc5f768254", "name": "/usr/share/zoneinfo/Asia/Tehran", "type": "file" }, { - "bom-ref": "6d12bd257cb0827c", + "bom-ref": "c796ed773d36f1f0", "name": "/usr/share/zoneinfo/Asia/Thimphu", "type": "file" }, { - "bom-ref": "18625271da970453", + "bom-ref": "3e2fea530ed923a7", "name": "/usr/share/zoneinfo/Asia/Tokyo", "type": "file" }, { - "bom-ref": "ef1be1780e6926b3", + "bom-ref": "ae54ef4dce7af58b", "name": "/usr/share/zoneinfo/Asia/Tomsk", "type": "file" }, { - "bom-ref": "d590ed1e28aa9034", + "bom-ref": "67c34bdaddcfd1a8", "name": "/usr/share/zoneinfo/Asia/Ulaanbaatar", "type": "file" }, { - "bom-ref": "c2a96743ccf15af9", + "bom-ref": "5509f999598be371", "name": "/usr/share/zoneinfo/Asia/Urumqi", "type": "file" }, { - "bom-ref": "f77193e0f118461b", + "bom-ref": "6016485035431faf", "name": "/usr/share/zoneinfo/Asia/Ust-Nera", "type": "file" }, { - "bom-ref": "a4b07710cfd79fda", + "bom-ref": "cf347d39aa2052b2", "name": "/usr/share/zoneinfo/Asia/Vientiane", "type": "file" }, { - "bom-ref": "f4daddaa708c2cc3", + "bom-ref": "6541098b6371de1f", "name": "/usr/share/zoneinfo/Asia/Vladivostok", "type": "file" }, { - "bom-ref": "997691ec1a0e97a2", + "bom-ref": "6efe186cc7f65c8e", "name": "/usr/share/zoneinfo/Asia/Yakutsk", "type": "file" }, { - "bom-ref": "56c537e32c8683d4", + "bom-ref": "a1fe5ac3cbe4e078", "name": "/usr/share/zoneinfo/Asia/Yangon", "type": "file" }, { - "bom-ref": "9b5e9cd1d47e72d5", + "bom-ref": "1365a1a163742cd5", "name": "/usr/share/zoneinfo/Asia/Yekaterinburg", "type": "file" }, { - "bom-ref": "6b10f560128d8ab7", + "bom-ref": "9c88099332c94eab", "name": "/usr/share/zoneinfo/Asia/Yerevan", "type": "file" }, { - "bom-ref": "3a494140cc095d7e", + "bom-ref": "152cbfeb594087ca", "name": "/usr/share/zoneinfo/Atlantic/Azores", "type": "file" }, { - "bom-ref": "c00a2c80b34c68a7", + "bom-ref": "e9856e0046221c6b", "name": "/usr/share/zoneinfo/Atlantic/Bermuda", "type": "file" }, { - "bom-ref": "23e28fbd3eef7840", + "bom-ref": "c5db82e142293e4c", "name": "/usr/share/zoneinfo/Atlantic/Canary", "type": "file" }, { - "bom-ref": "5610389d0d97c6a8", + "bom-ref": "1fd1d54b1f0246d8", "name": "/usr/share/zoneinfo/Atlantic/Cape_Verde", "type": "file" }, { - "bom-ref": "de650fb2097e8fad", + "bom-ref": "fe959e29d2715e65", "name": "/usr/share/zoneinfo/Atlantic/Faroe", "type": "file" }, { - "bom-ref": "ec206127728993ec", + "bom-ref": "b3a7755377b9737c", "name": "/usr/share/zoneinfo/Atlantic/Madeira", "type": "file" }, { - "bom-ref": "16079090d7c76864", + "bom-ref": "af5389489ae2a018", "name": "/usr/share/zoneinfo/Atlantic/Reykjavik", "type": "file" }, { - "bom-ref": "069f185f0a0e8798", + "bom-ref": "4fc4dfad0ab5aab4", "name": "/usr/share/zoneinfo/Atlantic/South_Georgia", "type": "file" }, { - "bom-ref": "5e5dda6e3bdcaedc", + "bom-ref": "2c340b9fbb40aac8", "name": "/usr/share/zoneinfo/Atlantic/St_Helena", "type": "file" }, { - "bom-ref": "9d35ce4f8f1e15e4", + "bom-ref": "2949f1ddaaa73190", "name": "/usr/share/zoneinfo/Atlantic/Stanley", "type": "file" }, { - "bom-ref": "4243321342348664", + "bom-ref": "0cdcc011696beffc", "name": "/usr/share/zoneinfo/Australia/Adelaide", "type": "file" }, { - "bom-ref": "49a7bf519d2fe33d", + "bom-ref": "f6f425035a5e7689", "name": "/usr/share/zoneinfo/Australia/Brisbane", "type": "file" }, { - "bom-ref": "aea685e6e2a26d1f", + "bom-ref": "2898677720c6596f", "name": "/usr/share/zoneinfo/Australia/Broken_Hill", "type": "file" }, { - "bom-ref": "7256d515291ad5a6", + "bom-ref": "be87feb865de6b66", "name": "/usr/share/zoneinfo/Australia/Darwin", "type": "file" }, { - "bom-ref": "f3ce24b3ad553f78", + "bom-ref": "73f5e6e97053e928", "name": "/usr/share/zoneinfo/Australia/Eucla", "type": "file" }, { - "bom-ref": "3a303e82fdc2894e", + "bom-ref": "85f8a49cd03d3982", "name": "/usr/share/zoneinfo/Australia/Hobart", "type": "file" }, { - "bom-ref": "471e5555f23a60e4", + "bom-ref": "6a114f3a0f7c09d8", "name": "/usr/share/zoneinfo/Australia/Lindeman", "type": "file" }, { - "bom-ref": "ba0758caa4c78ad8", + "bom-ref": "2f695419e54f4560", "name": "/usr/share/zoneinfo/Australia/Lord_Howe", "type": "file" }, { - "bom-ref": "6a7b7d9db552d0a8", + "bom-ref": "27b13da8fc2568c4", "name": "/usr/share/zoneinfo/Australia/Melbourne", "type": "file" }, { - "bom-ref": "64034907ca622443", + "bom-ref": "2156d845aaf2b477", "name": "/usr/share/zoneinfo/Australia/Perth", "type": "file" }, { - "bom-ref": "784bec7ce5b39277", + "bom-ref": "f4078b77f330eebf", "name": "/usr/share/zoneinfo/Australia/Sydney", "type": "file" }, { - "bom-ref": "6c610aedeff76605", + "bom-ref": "f91374b109d53759", "name": "/usr/share/zoneinfo/CET", "type": "file" }, { - "bom-ref": "d01dd762444da01e", + "bom-ref": "3523d54766bb30c6", "name": "/usr/share/zoneinfo/CST6CDT", "type": "file" }, { - "bom-ref": "0c2f46f3d3d3d0f0", + "bom-ref": "a574bc4c61100f68", "name": "/usr/share/zoneinfo/EET", "type": "file" }, { - "bom-ref": "8f76a3099f80856a", + "bom-ref": "0481f1a2b001a752", "name": "/usr/share/zoneinfo/EST", "type": "file" }, { - "bom-ref": "c2af9c3336983ef8", + "bom-ref": "ea08b8868b129f70", "name": "/usr/share/zoneinfo/EST5EDT", "type": "file" }, { - "bom-ref": "431ff8890124b330", + "bom-ref": "2a95ca5b685c6d10", "name": "/usr/share/zoneinfo/Etc/GMT", "type": "file" }, { - "bom-ref": "1df937dbed9c1343", + "bom-ref": "302beabff964e16b", "name": "/usr/share/zoneinfo/Etc/GMT+1", "type": "file" }, { - "bom-ref": "b7b93c9c0c2e0ba7", + "bom-ref": "5541113ec020edab", "name": "/usr/share/zoneinfo/Etc/GMT+10", "type": "file" }, { - "bom-ref": "2e70d8b103173212", + "bom-ref": "44d16fbe98851922", "name": "/usr/share/zoneinfo/Etc/GMT+11", "type": "file" }, { - "bom-ref": "53695c45c62b7e93", + "bom-ref": "e3d4732678790f47", "name": "/usr/share/zoneinfo/Etc/GMT+12", "type": "file" }, { - "bom-ref": "6c15e4d3253bd8b4", + "bom-ref": "8c03ab7d2dab3c88", "name": "/usr/share/zoneinfo/Etc/GMT+2", "type": "file" }, { - "bom-ref": "d2d2d8bf1fa70803", + "bom-ref": "01f2c8f390baba23", "name": "/usr/share/zoneinfo/Etc/GMT+3", "type": "file" }, { - "bom-ref": "6e2a26aee5854a05", + "bom-ref": "52984f4dfb031cbd", "name": "/usr/share/zoneinfo/Etc/GMT+4", "type": "file" }, { - "bom-ref": "4cba9d981f9bbb66", + "bom-ref": "5fb60f7996af0cfe", "name": "/usr/share/zoneinfo/Etc/GMT+5", "type": "file" }, { - "bom-ref": "1ab77fd4a610d5d7", + "bom-ref": "14e01518a26a6053", "name": "/usr/share/zoneinfo/Etc/GMT+6", "type": "file" }, { - "bom-ref": "cfa2dd66eab5b31d", + "bom-ref": "956509c4e14aea21", "name": "/usr/share/zoneinfo/Etc/GMT+7", "type": "file" }, { - "bom-ref": "f105b0363d3fd130", + "bom-ref": "ba1b9751cec71344", "name": "/usr/share/zoneinfo/Etc/GMT+8", "type": "file" }, { - "bom-ref": "a7e8fd805fbdbde3", + "bom-ref": "1d5d20d38f34ab27", "name": "/usr/share/zoneinfo/Etc/GMT+9", "type": "file" }, { - "bom-ref": "8f6ab54f18425a25", + "bom-ref": "bd909c54ade36aa9", "name": "/usr/share/zoneinfo/Etc/GMT-1", "type": "file" }, { - "bom-ref": "6ed7c1e956aa1c52", + "bom-ref": "1bb084722f5725c2", "name": "/usr/share/zoneinfo/Etc/GMT-10", "type": "file" }, { - "bom-ref": "945d170f0b81c665", + "bom-ref": "427635b97883d969", "name": "/usr/share/zoneinfo/Etc/GMT-11", "type": "file" }, { - "bom-ref": "0f64e108751082f2", + "bom-ref": "f7d48a07057bb3c2", "name": "/usr/share/zoneinfo/Etc/GMT-12", "type": "file" }, { - "bom-ref": "0e562fa1ba5f0555", + "bom-ref": "6295d8af91996ae5", "name": "/usr/share/zoneinfo/Etc/GMT-13", "type": "file" }, { - "bom-ref": "4a9315e64df894c8", + "bom-ref": "2cdcb7521a467cbc", "name": "/usr/share/zoneinfo/Etc/GMT-14", "type": "file" }, { - "bom-ref": "753435c2d2789098", + "bom-ref": "f445eec5e5ae5f74", "name": "/usr/share/zoneinfo/Etc/GMT-2", "type": "file" }, { - "bom-ref": "fe79bd66ccd34a6e", + "bom-ref": "917214ea14acdfa2", "name": "/usr/share/zoneinfo/Etc/GMT-3", "type": "file" }, { - "bom-ref": "e0888855920e5a24", + "bom-ref": "cc4186a9b1cde57c", "name": "/usr/share/zoneinfo/Etc/GMT-4", "type": "file" }, { - "bom-ref": "31c704a133453625", + "bom-ref": "d2596934d98ac6c9", "name": "/usr/share/zoneinfo/Etc/GMT-5", "type": "file" }, { - "bom-ref": "3b37874ddb40f2ab", + "bom-ref": "655d3b951b589b1f", "name": "/usr/share/zoneinfo/Etc/GMT-6", "type": "file" }, { - "bom-ref": "c462d6fca90552b8", + "bom-ref": "aebe8f9fe300c830", "name": "/usr/share/zoneinfo/Etc/GMT-7", "type": "file" }, { - "bom-ref": "cdf3a1c8baddb11e", + "bom-ref": "b3b154e5d1b17c9a", "name": "/usr/share/zoneinfo/Etc/GMT-8", "type": "file" }, { - "bom-ref": "e21b8f7b7c268d41", + "bom-ref": "566388312b225739", "name": "/usr/share/zoneinfo/Etc/GMT-9", "type": "file" }, { - "bom-ref": "78c648ae73598da2", + "bom-ref": "567aa6903afb207a", "name": "/usr/share/zoneinfo/Etc/UTC", "type": "file" }, { - "bom-ref": "f12cfa46f1bc5ad4", + "bom-ref": "99d0448234a88d8c", "name": "/usr/share/zoneinfo/Europe/Amsterdam", "type": "file" }, { - "bom-ref": "78c076b22348779a", + "bom-ref": "3c56ef1a55773a8a", "name": "/usr/share/zoneinfo/Europe/Andorra", "type": "file" }, { - "bom-ref": "4d5a0dc44bbd0b07", + "bom-ref": "6036e9f45619b377", "name": "/usr/share/zoneinfo/Europe/Astrakhan", "type": "file" }, { - "bom-ref": "0f23e56600eeb24c", + "bom-ref": "c218ec4f8ccf7098", "name": "/usr/share/zoneinfo/Europe/Athens", "type": "file" }, { - "bom-ref": "889a6d06c8fec218", + "bom-ref": "3d369fd9bc68a4ac", "name": "/usr/share/zoneinfo/Europe/Belgrade", "type": "file" }, { - "bom-ref": "e22ca86a4369de16", + "bom-ref": "7c4c345a0f1162c6", "name": "/usr/share/zoneinfo/Europe/Berlin", "type": "file" }, { - "bom-ref": "4597364efdfe3d0c", + "bom-ref": "705b1e0fbadc216c", "name": "/usr/share/zoneinfo/Europe/Brussels", "type": "file" }, { - "bom-ref": "a0b4f0860be252de", + "bom-ref": "acbea8f2a578982a", "name": "/usr/share/zoneinfo/Europe/Bucharest", "type": "file" }, { - "bom-ref": "e2ce03f6d72237d5", + "bom-ref": "a90cf447c768ee55", "name": "/usr/share/zoneinfo/Europe/Budapest", "type": "file" }, { - "bom-ref": "eb619ba485a88697", + "bom-ref": "2b5576f53d24581b", "name": "/usr/share/zoneinfo/Europe/Chisinau", "type": "file" }, { - "bom-ref": "d5d50f02efda29e5", + "bom-ref": "09372245ae379bc5", "name": "/usr/share/zoneinfo/Europe/Copenhagen", "type": "file" }, { - "bom-ref": "cefbfbd62d484306", + "bom-ref": "ef070fe35116e36e", "name": "/usr/share/zoneinfo/Europe/Dublin", "type": "file" }, { - "bom-ref": "05540d073820f97a", + "bom-ref": "44893b94e249673a", "name": "/usr/share/zoneinfo/Europe/Gibraltar", "type": "file" }, { - "bom-ref": "29c98b1b2fd7b77e", + "bom-ref": "9a2d529fbf049d86", "name": "/usr/share/zoneinfo/Europe/Guernsey", "type": "file" }, { - "bom-ref": "feb2ee3a9906fecc", + "bom-ref": "640ccc86cff9c6f4", "name": "/usr/share/zoneinfo/Europe/Helsinki", "type": "file" }, { - "bom-ref": "259e2a668f8a5972", + "bom-ref": "78aee2b20b751f96", "name": "/usr/share/zoneinfo/Europe/Isle_of_Man", "type": "file" }, { - "bom-ref": "8be596e6fedaac12", + "bom-ref": "6d5277314d27fbfe", "name": "/usr/share/zoneinfo/Europe/Istanbul", "type": "file" }, { - "bom-ref": "3390a334ee1eab96", + "bom-ref": "261aee24d88137ca", "name": "/usr/share/zoneinfo/Europe/Jersey", "type": "file" }, { - "bom-ref": "b4b0445bc12f88d2", + "bom-ref": "b1e6b1e7cf6e72ea", "name": "/usr/share/zoneinfo/Europe/Kaliningrad", "type": "file" }, { - "bom-ref": "98c4e5fe42d32282", + "bom-ref": "e363f96ef63f1072", "name": "/usr/share/zoneinfo/Europe/Kirov", "type": "file" }, { - "bom-ref": "98b0095e334eed95", + "bom-ref": "3d324cdca6632965", "name": "/usr/share/zoneinfo/Europe/Kyiv", "type": "file" }, { - "bom-ref": "2001a825f7db9d2e", + "bom-ref": "53f7efd4dc613256", "name": "/usr/share/zoneinfo/Europe/Lisbon", "type": "file" }, { - "bom-ref": "4257721f2b06c548", + "bom-ref": "c84294310cb95750", "name": "/usr/share/zoneinfo/Europe/Ljubljana", "type": "file" }, { - "bom-ref": "53d30865a4af57e9", + "bom-ref": "9701fb414543bc5d", "name": "/usr/share/zoneinfo/Europe/London", "type": "file" }, { - "bom-ref": "72f961a73eaacbee", + "bom-ref": "ca95aae3f69fe2b2", "name": "/usr/share/zoneinfo/Europe/Luxembourg", "type": "file" }, { - "bom-ref": "ef883c78597fbf89", + "bom-ref": "b47f16e130036395", "name": "/usr/share/zoneinfo/Europe/Madrid", "type": "file" }, { - "bom-ref": "dce2c84a1ff83a11", + "bom-ref": "82127e4d648ec8c1", "name": "/usr/share/zoneinfo/Europe/Malta", "type": "file" }, { - "bom-ref": "f03995ae1d339947", + "bom-ref": "c0a8267e6ec8875b", "name": "/usr/share/zoneinfo/Europe/Minsk", "type": "file" }, { - "bom-ref": "30453231caf4b297", + "bom-ref": "df5507332cc907b7", "name": "/usr/share/zoneinfo/Europe/Monaco", "type": "file" }, { - "bom-ref": "f69d3a117151d333", + "bom-ref": "dfda8dd4ca754803", "name": "/usr/share/zoneinfo/Europe/Moscow", "type": "file" }, { - "bom-ref": "42efce0d9be48f11", + "bom-ref": "7cb32ea1cfef74d9", "name": "/usr/share/zoneinfo/Europe/Oslo", "type": "file" }, { - "bom-ref": "cdb556d80166f79e", + "bom-ref": "f05f6c1d2c104f82", "name": "/usr/share/zoneinfo/Europe/Paris", "type": "file" }, { - "bom-ref": "3654d3c8d584e697", + "bom-ref": "6ba82efb463437a7", "name": "/usr/share/zoneinfo/Europe/Prague", "type": "file" }, { - "bom-ref": "56adbf87fdfb1644", + "bom-ref": "a029172d8c57173c", "name": "/usr/share/zoneinfo/Europe/Riga", "type": "file" }, { - "bom-ref": "eca8d979f914b5d5", + "bom-ref": "1e827ff32877ac59", "name": "/usr/share/zoneinfo/Europe/Rome", "type": "file" }, { - "bom-ref": "d147252894fb5b04", + "bom-ref": "bc6e8c9a6edf81b4", "name": "/usr/share/zoneinfo/Europe/Samara", "type": "file" }, { - "bom-ref": "159ca20d95e6aaa5", + "bom-ref": "bc5f619665286039", "name": "/usr/share/zoneinfo/Europe/Sarajevo", "type": "file" }, { - "bom-ref": "66a3ea672e7958e4", + "bom-ref": "23cee9b9c76827b4", "name": "/usr/share/zoneinfo/Europe/Saratov", "type": "file" }, { - "bom-ref": "9acb416b6bc5787b", + "bom-ref": "5add22e8c7f5624b", "name": "/usr/share/zoneinfo/Europe/Simferopol", "type": "file" }, { - "bom-ref": "dd8ffdbaea16eebb", + "bom-ref": "a518c22d5db72fff", "name": "/usr/share/zoneinfo/Europe/Skopje", "type": "file" }, { - "bom-ref": "2b8daa70f0e6a582", + "bom-ref": "a664158a14cefd4e", "name": "/usr/share/zoneinfo/Europe/Sofia", "type": "file" }, { - "bom-ref": "f311d5988d0214b2", + "bom-ref": "329502fd513a7b62", "name": "/usr/share/zoneinfo/Europe/Stockholm", "type": "file" }, { - "bom-ref": "d28b4f302f975012", + "bom-ref": "cdeef413bd3fa48e", "name": "/usr/share/zoneinfo/Europe/Tallinn", "type": "file" }, { - "bom-ref": "86926682bc429aea", + "bom-ref": "8d750126b340a6f6", "name": "/usr/share/zoneinfo/Europe/Tirane", "type": "file" }, { - "bom-ref": "d583064bebcdf89a", + "bom-ref": "6e22fe9e48c2ac02", "name": "/usr/share/zoneinfo/Europe/Ulyanovsk", "type": "file" }, { - "bom-ref": "7e6f770b4b25d6f6", + "bom-ref": "6b7168e6571bdc0e", "name": "/usr/share/zoneinfo/Europe/Vaduz", "type": "file" }, { - "bom-ref": "b5265f362f632ba5", + "bom-ref": "180f3a8d55f06aad", "name": "/usr/share/zoneinfo/Europe/Vienna", "type": "file" }, { - "bom-ref": "d709cedc15c16b2c", + "bom-ref": "e1796661eca8bfd4", "name": "/usr/share/zoneinfo/Europe/Vilnius", "type": "file" }, { - "bom-ref": "b7b8917a1371d218", + "bom-ref": "954b3f637f951008", "name": "/usr/share/zoneinfo/Europe/Volgograd", "type": "file" }, { - "bom-ref": "fb434f798570fd7b", + "bom-ref": "15794eff6114890f", "name": "/usr/share/zoneinfo/Europe/Warsaw", "type": "file" }, { - "bom-ref": "fa49d4543c940626", + "bom-ref": "31aeedbbf8062ba2", "name": "/usr/share/zoneinfo/Europe/Zagreb", "type": "file" }, { - "bom-ref": "649bd45fe3d47bc0", + "bom-ref": "17567783c3d04dbc", "name": "/usr/share/zoneinfo/Europe/Zurich", "type": "file" }, { - "bom-ref": "1757112693e8f6f2", + "bom-ref": "fa070c856eec2f26", "name": "/usr/share/zoneinfo/Factory", "type": "file" }, { - "bom-ref": "3fa4de250d43d3c3", + "bom-ref": "d566cf318d5f4dfb", "name": "/usr/share/zoneinfo/HST", "type": "file" }, { - "bom-ref": "d291914ae5bc65fe", + "bom-ref": "be49567cb65331b6", "name": "/usr/share/zoneinfo/Indian/Antananarivo", "type": "file" }, { - "bom-ref": "d06fd746f6ad3db9", + "bom-ref": "4f674f8ee2eb1f71", "name": "/usr/share/zoneinfo/Indian/Chagos", "type": "file" }, { - "bom-ref": "932128ec432955f3", + "bom-ref": "0489d8a6fc76eb33", "name": "/usr/share/zoneinfo/Indian/Christmas", "type": "file" }, { - "bom-ref": "3ea4f6880865ee8d", + "bom-ref": "765e75f7d871de29", "name": "/usr/share/zoneinfo/Indian/Cocos", "type": "file" }, { - "bom-ref": "0bd29a07f691ec71", + "bom-ref": "a77b3827a71d730d", "name": "/usr/share/zoneinfo/Indian/Comoro", "type": "file" }, { - "bom-ref": "e024f3e670b85f33", + "bom-ref": "3697ca10194c5787", "name": "/usr/share/zoneinfo/Indian/Kerguelen", "type": "file" }, { - "bom-ref": "d1cf19941f945a1a", + "bom-ref": "e66552a2708780c2", "name": "/usr/share/zoneinfo/Indian/Mahe", "type": "file" }, { - "bom-ref": "adb38b28d9dc21b8", + "bom-ref": "6d726e9a6d716b98", "name": "/usr/share/zoneinfo/Indian/Maldives", "type": "file" }, { - "bom-ref": "5e778981be5fc68f", + "bom-ref": "deb2c36d9f8b3b3b", "name": "/usr/share/zoneinfo/Indian/Mauritius", "type": "file" }, { - "bom-ref": "a5161dd8bd316b24", + "bom-ref": "b67154c244b48ab4", "name": "/usr/share/zoneinfo/Indian/Mayotte", "type": "file" }, { - "bom-ref": "945a94cae70ddf67", + "bom-ref": "5500014b5d011f8b", "name": "/usr/share/zoneinfo/Indian/Reunion", "type": "file" }, { - "bom-ref": "5cefcbbf399da976", + "bom-ref": "828a90a5ab20153a", "name": "/usr/share/zoneinfo/MET", "type": "file" }, { - "bom-ref": "4c7d236e5f89fd09", + "bom-ref": "18268624d6fcc945", "name": "/usr/share/zoneinfo/MST", "type": "file" }, { - "bom-ref": "7796ad78a8f77419", + "bom-ref": "71cf6cf75bb08029", "name": "/usr/share/zoneinfo/MST7MDT", "type": "file" }, { - "bom-ref": "1ba8e224bbe6ea1c", + "bom-ref": "b49b60c53378dde4", "name": "/usr/share/zoneinfo/PST8PDT", "type": "file" }, { - "bom-ref": "fc95aac3640795ac", + "bom-ref": "61fc8f0b321a3a7c", "name": "/usr/share/zoneinfo/Pacific/Apia", "type": "file" }, { - "bom-ref": "80887274a68b2ed3", + "bom-ref": "02d970d7a762db1b", "name": "/usr/share/zoneinfo/Pacific/Auckland", "type": "file" }, { - "bom-ref": "eb1e42baccd4b5fd", + "bom-ref": "bb48d1b7c5a4e90d", "name": "/usr/share/zoneinfo/Pacific/Bougainville", "type": "file" }, { - "bom-ref": "b13ee9d7137df872", + "bom-ref": "e87b3e2a29bb1426", "name": "/usr/share/zoneinfo/Pacific/Chatham", "type": "file" }, { - "bom-ref": "9378437492f91981", + "bom-ref": "784c84954e78d689", "name": "/usr/share/zoneinfo/Pacific/Chuuk", "type": "file" }, { - "bom-ref": "1dd225383bc28ab8", + "bom-ref": "b5ad08ca0d09af54", "name": "/usr/share/zoneinfo/Pacific/Easter", "type": "file" }, { - "bom-ref": "b51e9c23b3ed5ab8", + "bom-ref": "1a1b4d9c0480c4d8", "name": "/usr/share/zoneinfo/Pacific/Efate", "type": "file" }, { - "bom-ref": "20c8e801423beda8", + "bom-ref": "40cf617bbc0a6340", "name": "/usr/share/zoneinfo/Pacific/Fakaofo", "type": "file" }, { - "bom-ref": "da483f71f8948600", + "bom-ref": "d7129dc60335eba0", "name": "/usr/share/zoneinfo/Pacific/Fiji", "type": "file" }, { - "bom-ref": "0e1d91ec9bd9ad2e", + "bom-ref": "115d83f08e733c36", "name": "/usr/share/zoneinfo/Pacific/Funafuti", "type": "file" }, { - "bom-ref": "0c127cb21aa1c46e", + "bom-ref": "01ace05e22bf757a", "name": "/usr/share/zoneinfo/Pacific/Galapagos", "type": "file" }, { - "bom-ref": "3201c7c567933125", + "bom-ref": "8e1a07cb6ce262bd", "name": "/usr/share/zoneinfo/Pacific/Gambier", "type": "file" }, { - "bom-ref": "6d1993d2dcbfcd5d", + "bom-ref": "db79d06314273465", "name": "/usr/share/zoneinfo/Pacific/Guadalcanal", "type": "file" }, { - "bom-ref": "81e74469d48526fa", + "bom-ref": "1ca8e59c18a69926", "name": "/usr/share/zoneinfo/Pacific/Guam", "type": "file" }, { - "bom-ref": "bcf463eb22ae126d", + "bom-ref": "9fd6d3192df5fd05", "name": "/usr/share/zoneinfo/Pacific/Honolulu", "type": "file" }, { - "bom-ref": "e8af798d268a1411", + "bom-ref": "6e7bafb2c5181c71", "name": "/usr/share/zoneinfo/Pacific/Kanton", "type": "file" }, { - "bom-ref": "77959d4f0d0b93b3", + "bom-ref": "7498c27d7a7a29f3", "name": "/usr/share/zoneinfo/Pacific/Kiritimati", "type": "file" }, { - "bom-ref": "ab7c8f165d2be250", + "bom-ref": "2d722635d1fde948", "name": "/usr/share/zoneinfo/Pacific/Kosrae", "type": "file" }, { - "bom-ref": "610de88e51d1cab9", + "bom-ref": "ffeaccc8df169c21", "name": "/usr/share/zoneinfo/Pacific/Kwajalein", "type": "file" }, { - "bom-ref": "bf8faf9a54713e24", + "bom-ref": "90b46a9cc9eee114", "name": "/usr/share/zoneinfo/Pacific/Majuro", "type": "file" }, { - "bom-ref": "eee9a3b4f6eb8476", + "bom-ref": "2a13566747a4cfb2", "name": "/usr/share/zoneinfo/Pacific/Marquesas", "type": "file" }, { - "bom-ref": "497e602ca3ff143b", + "bom-ref": "316afa60211dc653", "name": "/usr/share/zoneinfo/Pacific/Midway", "type": "file" }, { - "bom-ref": "a93edbd95fe18564", + "bom-ref": "44264bc2ed7a1f50", "name": "/usr/share/zoneinfo/Pacific/Nauru", "type": "file" }, { - "bom-ref": "cb091c63b602ac60", + "bom-ref": "457c35d848e476dc", "name": "/usr/share/zoneinfo/Pacific/Niue", "type": "file" }, { - "bom-ref": "37c0f726a8041853", + "bom-ref": "5d01d5aee8500e9b", "name": "/usr/share/zoneinfo/Pacific/Norfolk", "type": "file" }, { - "bom-ref": "0b464a4075632601", + "bom-ref": "342e5fc8cb99fae5", "name": "/usr/share/zoneinfo/Pacific/Noumea", "type": "file" }, { - "bom-ref": "139d5d20c9df30c8", + "bom-ref": "755c2079428d0c44", "name": "/usr/share/zoneinfo/Pacific/Pago_Pago", "type": "file" }, { - "bom-ref": "368b6d1d9aa70537", + "bom-ref": "062490f2c1b643ff", "name": "/usr/share/zoneinfo/Pacific/Palau", "type": "file" }, { - "bom-ref": "21411d13c5d0f19f", + "bom-ref": "8f73e282cd0a9e77", "name": "/usr/share/zoneinfo/Pacific/Pitcairn", "type": "file" }, { - "bom-ref": "2711c3da677e2ca6", + "bom-ref": "e56d40a42a620a46", "name": "/usr/share/zoneinfo/Pacific/Pohnpei", "type": "file" }, { - "bom-ref": "7a02827e3d188990", + "bom-ref": "72f71789ef043b68", "name": "/usr/share/zoneinfo/Pacific/Port_Moresby", "type": "file" }, { - "bom-ref": "4886ca0b9dcab40e", + "bom-ref": "2ffd48534b6dfe0e", "name": "/usr/share/zoneinfo/Pacific/Rarotonga", "type": "file" }, { - "bom-ref": "31b4c376d053ae2f", + "bom-ref": "900311e26a1de72b", "name": "/usr/share/zoneinfo/Pacific/Saipan", "type": "file" }, { - "bom-ref": "a1a5dc4dc029984c", + "bom-ref": "b5163a8d5d0f6ce4", "name": "/usr/share/zoneinfo/Pacific/Tahiti", "type": "file" }, { - "bom-ref": "a8e68ed0a0ca1a71", + "bom-ref": "0b67a71c4e521059", "name": "/usr/share/zoneinfo/Pacific/Tarawa", "type": "file" }, { - "bom-ref": "f44a0487302155bd", + "bom-ref": "b309c601fa7cadb5", "name": "/usr/share/zoneinfo/Pacific/Tongatapu", "type": "file" }, { - "bom-ref": "65e9e9f3981b37a3", + "bom-ref": "acb5826136bf467f", "name": "/usr/share/zoneinfo/Pacific/Wake", "type": "file" }, { - "bom-ref": "50fc3b32b0a82322", + "bom-ref": "8a7f863626fbef46", "name": "/usr/share/zoneinfo/Pacific/Wallis", "type": "file" }, { - "bom-ref": "f5f7f10f2835c904", + "bom-ref": "a71221f6a54be448", "name": "/usr/share/zoneinfo/WET", "type": "file" }, { - "bom-ref": "cf2bb580d99c050e", + "bom-ref": "0950777461ffc042", "name": "/usr/share/zoneinfo/iso3166.tab", "type": "file" }, { - "bom-ref": "4e5296c64ebc4d46", + "bom-ref": "78127f924ee1ad7e", "name": "/usr/share/zoneinfo/leap-seconds.list", "type": "file" }, { - "bom-ref": "054b0d57de81024b", + "bom-ref": "118984db76f67383", "name": "/usr/share/zoneinfo/leapseconds", "type": "file" }, { - "bom-ref": "987c8fb981e74875", + "bom-ref": "0bcf59f95daba5d5", "name": "/usr/share/zoneinfo/tzdata.zi", "type": "file" }, { - "bom-ref": "dee169d7df6c3915", + "bom-ref": "b51ced5d148f8235", "name": "/usr/share/zoneinfo/zone.tab", "type": "file" }, { - "bom-ref": "22536c0ec97ecb26", + "bom-ref": "143df3816fda12de", "name": "/usr/share/zoneinfo/zone1970.tab", "type": "file" }, { - "bom-ref": "97cc9b8df3bbf4cb", + "bom-ref": "8e16a2bc10ccad9f", "name": "/usr/share/zoneinfo/zonenow.tab", "type": "file" }, { - "bom-ref": "51b4a40d867e83aa", + "bom-ref": "639da50739c17258", "name": "/usr/share/zsh/vendor-completions/_bootctl", "type": "file" }, { - "bom-ref": "8e5c8bd9d9ec04ed", + "bom-ref": "7a81c9cd26505e53", "name": "/usr/share/zsh/vendor-completions/_busctl", "type": "file" }, { - "bom-ref": "084a916320e87878", + "bom-ref": "f12dbed09359e9b8", "name": "/usr/share/zsh/vendor-completions/_curl", "type": "file" }, { - "bom-ref": "490914b099aea81f", + "bom-ref": "7333bca2ef7ff1ff", "name": "/usr/share/zsh/vendor-completions/_dpkg-parsechangelog", "type": "file" }, { - "bom-ref": "5fbfa2eeccded23d", + "bom-ref": "634d65ce9bc92d43", "name": "/usr/share/zsh/vendor-completions/_hostnamectl", "type": "file" }, { - "bom-ref": "b1b4bb7461b98d5a", + "bom-ref": "5eaa6333fcc03d24", "name": "/usr/share/zsh/vendor-completions/_journalctl", "type": "file" }, { - "bom-ref": "39e56416efd23082", + "bom-ref": "fb3906b889eeda68", "name": "/usr/share/zsh/vendor-completions/_kernel-install", "type": "file" }, { - "bom-ref": "b3653e8ec7f3990e", + "bom-ref": "17b24a77cba8f890", "name": "/usr/share/zsh/vendor-completions/_localectl", "type": "file" }, { - "bom-ref": "195beccb81aadd5b", + "bom-ref": "7b1d296485612e55", "name": "/usr/share/zsh/vendor-completions/_loginctl", "type": "file" }, { - "bom-ref": "a2f80835fd6c94ce", + "bom-ref": "0348a4b9d64df608", "name": "/usr/share/zsh/vendor-completions/_networkctl", "type": "file" }, { - "bom-ref": "36cc221b08632ea9", + "bom-ref": "0a076564b22069ef", "name": "/usr/share/zsh/vendor-completions/_sd_hosts_or_user_at_host", "type": "file" }, { - "bom-ref": "da91ac8b69f43e89", + "bom-ref": "7fbf5cf8aafbd3eb", "name": "/usr/share/zsh/vendor-completions/_sd_outputmodes", "type": "file" }, { - "bom-ref": "3db95e4d7e8a9235", + "bom-ref": "2a432b01a9d353bb", "name": "/usr/share/zsh/vendor-completions/_sd_unit_files", "type": "file" }, { - "bom-ref": "5bea144ba3c33f7e", + "bom-ref": "25d14281a33f3cb4", "name": "/usr/share/zsh/vendor-completions/_systemctl", "type": "file" }, { - "bom-ref": "daf634e71366b8db", + "bom-ref": "3fd96bad0a2baf05", "name": "/usr/share/zsh/vendor-completions/_systemd", "type": "file" }, { - "bom-ref": "fc0c28d7d9638b8d", + "bom-ref": "30f1bb0e3b86247f", "name": "/usr/share/zsh/vendor-completions/_systemd-analyze", "type": "file" }, { - "bom-ref": "ba301f3ebc48d1ce", + "bom-ref": "2388b20d36381aa0", "name": "/usr/share/zsh/vendor-completions/_systemd-delta", "type": "file" }, { - "bom-ref": "acc312837d6bb94c", + "bom-ref": "e23375af521dcbb2", "name": "/usr/share/zsh/vendor-completions/_systemd-inhibit", "type": "file" }, { - "bom-ref": "b715b834fe6e508e", + "bom-ref": "70ef7001722f1a90", "name": "/usr/share/zsh/vendor-completions/_systemd-path", "type": "file" }, { - "bom-ref": "36249fb3909370f3", + "bom-ref": "f05de0e543993b59", "name": "/usr/share/zsh/vendor-completions/_systemd-run", "type": "file" }, { - "bom-ref": "da3359744c3e3e9c", + "bom-ref": "78230535d369e41a", "name": "/usr/share/zsh/vendor-completions/_systemd-tmpfiles", "type": "file" }, { - "bom-ref": "d52025a175609f18", + "bom-ref": "8ccc1cfe3c78c29a", "name": "/usr/share/zsh/vendor-completions/_timedatectl", "type": "file" }, { - "bom-ref": "427f9513850180f0", + "bom-ref": "059f4ab0ef0574f4", "name": "/usr/share/zsh/vendor-completions/_udevadm", "type": "file" }, { - "bom-ref": "1ff751359654e334", + "bom-ref": "cbde3258ba5a6f0c", "name": "/usr/src/python3.12/Grammar/python.gram", "type": "file" }, { - "bom-ref": "3601ecfa0e020f7f", + "bom-ref": "50e3bcd3d44366b7", "name": "/usr/src/python3.12/Parser/Python.asdl", "type": "file" }, { - "bom-ref": "858a402171af76c1", + "bom-ref": "ab13db92a5aa0ef7", "name": "/var/lib/dpkg/info/adduser.conffiles", "type": "file" }, { - "bom-ref": "8194397c93352df7", + "bom-ref": "a677842e60ecb3ed", "name": "/var/lib/dpkg/info/adduser.list", "type": "file" }, { - "bom-ref": "58667daefe19a9df", + "bom-ref": "c9064925aed6d4f5", "name": "/var/lib/dpkg/info/adduser.md5sums", "type": "file" }, { - "bom-ref": "16cefcafbdc4e930", + "bom-ref": "b888dc474ea0509e", "name": "/var/lib/dpkg/info/adduser.postrm", "type": "file" }, { - "bom-ref": "1b95c6979aba912d", + "bom-ref": "66e63ead9559b8df", "name": "/var/lib/dpkg/info/adduser.preinst", "type": "file" }, { - "bom-ref": "93c96150a42b349b", + "bom-ref": "52dc00731615dcb9", "name": "/var/lib/dpkg/info/apt.conffiles", "type": "file" }, { - "bom-ref": "b9277b381871d39a", + "bom-ref": "3acb0fed75034818", "name": "/var/lib/dpkg/info/apt.list", "type": "file" }, { - "bom-ref": "7d44bf0f32f413bf", + "bom-ref": "7e7a58167fe04fc9", "name": "/var/lib/dpkg/info/apt.md5sums", "type": "file" }, { - "bom-ref": "407c27cd3ab57859", + "bom-ref": "ad28bc0e5d8cbc2b", "name": "/var/lib/dpkg/info/apt.postinst", "type": "file" }, { - "bom-ref": "3d6aac7dcea74285", + "bom-ref": "9eba1fe4b8a790ef", "name": "/var/lib/dpkg/info/apt.postrm", "type": "file" }, { - "bom-ref": "7c18cec9fdc15eec", + "bom-ref": "d433c8e6b3eb9fca", "name": "/var/lib/dpkg/info/apt.preinst", "type": "file" }, { - "bom-ref": "0a815afd9f312d6a", + "bom-ref": "5bed6f6f7cd9247c", "name": "/var/lib/dpkg/info/apt.prerm", "type": "file" }, { - "bom-ref": "55f6c02408c9532a", + "bom-ref": "1d6045ad5ae216c4", "name": "/var/lib/dpkg/info/apt.shlibs", "type": "file" }, { - "bom-ref": "1fcb9fa61137d734", + "bom-ref": "f9c5a6396419a716", "name": "/var/lib/dpkg/info/apt.triggers", "type": "file" }, { - "bom-ref": "60f0663a338bd445", + "bom-ref": "55640a0d0ecc2867", "name": "/var/lib/dpkg/info/base-files.conffiles", "type": "file" }, { - "bom-ref": "95583f64ab0a8176", + "bom-ref": "82134d78872ab298", "name": "/var/lib/dpkg/info/base-files.list", "type": "file" }, { - "bom-ref": "1554b81fa95b2235", + "bom-ref": "855be37482b5019b", "name": "/var/lib/dpkg/info/base-files.md5sums", "type": "file" }, { - "bom-ref": "6297178958ff0d95", + "bom-ref": "1ac8daddf62a075f", "name": "/var/lib/dpkg/info/base-files.postinst", "type": "file" }, { - "bom-ref": "063b3378ce4ec6a0", + "bom-ref": "01055836b5ac5cee", "name": "/var/lib/dpkg/info/base-files.postrm", "type": "file" }, { - "bom-ref": "6f9d1a8a0ce6cf80", + "bom-ref": "1beb465894dd6d86", "name": "/var/lib/dpkg/info/base-files.preinst", "type": "file" }, { - "bom-ref": "51aa60e78afc6517", + "bom-ref": "36eb957e4b93dd31", "name": "/var/lib/dpkg/info/base-files.prerm", "type": "file" }, { - "bom-ref": "3a77d36b537f9b1b", + "bom-ref": "b0c7592b4c865171", "name": "/var/lib/dpkg/info/base-files.triggers", "type": "file" }, { - "bom-ref": "82d38362d7614e11", + "bom-ref": "32eb7cac39eec047", "name": "/var/lib/dpkg/info/base-passwd.list", "type": "file" }, { - "bom-ref": "cb26d6dc488daaee", + "bom-ref": "2d1490c7d45193bc", "name": "/var/lib/dpkg/info/base-passwd.md5sums", "type": "file" }, { - "bom-ref": "7c1ee1b2e86154a6", + "bom-ref": "ba57570d41a8b158", "name": "/var/lib/dpkg/info/base-passwd.postinst", "type": "file" }, { - "bom-ref": "904f510e6e5b09f5", + "bom-ref": "4de16b0445e4c257", "name": "/var/lib/dpkg/info/base-passwd.postrm", "type": "file" }, { - "bom-ref": "79a5e66630345be7", + "bom-ref": "6a00fb143254f6e1", "name": "/var/lib/dpkg/info/base-passwd.preinst", "type": "file" }, { - "bom-ref": "4284aa6bce5beb53", + "bom-ref": "444f54ee390f1c51", "name": "/var/lib/dpkg/info/base-passwd.templates", "type": "file" }, { - "bom-ref": "388e0cdc88f9c76c", + "bom-ref": "39bbbf7ba16d094e", "name": "/var/lib/dpkg/info/bash.conffiles", "type": "file" }, { - "bom-ref": "2f01413e80777955", + "bom-ref": "42e2a9e8fcd6c6cb", "name": "/var/lib/dpkg/info/bash.list", "type": "file" }, { - "bom-ref": "f9a9825bafb92491", + "bom-ref": "92869ddcc3cb9103", "name": "/var/lib/dpkg/info/bash.md5sums", "type": "file" }, { - "bom-ref": "9bb729af206928d8", + "bom-ref": "a1d75c82b9ab3b4e", "name": "/var/lib/dpkg/info/bash.postinst", "type": "file" }, { - "bom-ref": "cf74a68ce966514a", + "bom-ref": "fdbcdbd18872f58c", "name": "/var/lib/dpkg/info/bash.postrm", "type": "file" }, { - "bom-ref": "c581920a6b8e9725", + "bom-ref": "951c05cdb0a6f80b", "name": "/var/lib/dpkg/info/bash.prerm", "type": "file" }, { - "bom-ref": "7dbad2eeba309f55", + "bom-ref": "a0ba13a4286daab5", "name": "/var/lib/dpkg/info/binutils-common:amd64.conffiles", "type": "file" }, { - "bom-ref": "a24d72de223a485c", + "bom-ref": "934d13e3f52669e0", "name": "/var/lib/dpkg/info/binutils-common:amd64.md5sums", "type": "file" }, { - "bom-ref": "82094d13dabe2384", + "bom-ref": "83c5e75d00c88034", "name": "/var/lib/dpkg/info/binutils-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "6ef0800ad6a2ed81", + "bom-ref": "c08eb4c247ecd61d", "name": "/var/lib/dpkg/info/binutils-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "c47172790a6d9bd9", + "bom-ref": "7ca30ab6b209f1d5", "name": "/var/lib/dpkg/info/binutils.list", "type": "file" }, { - "bom-ref": "ebed8bd119a2e67e", + "bom-ref": "ead17a00f9117812", "name": "/var/lib/dpkg/info/binutils.md5sums", "type": "file" }, { - "bom-ref": "5d37ee885539d28a", + "bom-ref": "01a5d6a3e2838c06", "name": "/var/lib/dpkg/info/bsdutils.list", "type": "file" }, { - "bom-ref": "c324e1bea7adabb9", + "bom-ref": "f3e5694fb531c3ed", "name": "/var/lib/dpkg/info/bsdutils.md5sums", "type": "file" }, { - "bom-ref": "655650bb76c639fb", + "bom-ref": "7178ce2f43e573f7", "name": "/var/lib/dpkg/info/build-essential.list", "type": "file" }, { - "bom-ref": "8550e72339bab170", + "bom-ref": "58a82fecc13545a4", "name": "/var/lib/dpkg/info/build-essential.md5sums", "type": "file" }, { - "bom-ref": "1f31f07d97f55937", + "bom-ref": "eccdd5124ed06d63", "name": "/var/lib/dpkg/info/bzip2.list", "type": "file" }, { - "bom-ref": "76e145bf7b6664c8", + "bom-ref": "3314fb0b6d1b6390", "name": "/var/lib/dpkg/info/bzip2.md5sums", "type": "file" }, { - "bom-ref": "dadf30750737f852", + "bom-ref": "05b605b62c8a1a52", "name": "/var/lib/dpkg/info/ca-certificates.config", "type": "file" }, { - "bom-ref": "88309bbf87337bed", + "bom-ref": "97673a08c9d83c15", "name": "/var/lib/dpkg/info/ca-certificates.list", "type": "file" }, { - "bom-ref": "f50f7937f4d22bd3", + "bom-ref": "53891c43a19d1cab", "name": "/var/lib/dpkg/info/ca-certificates.md5sums", "type": "file" }, { - "bom-ref": "71b41c05f2a5ebaa", + "bom-ref": "0843c5219165de22", "name": "/var/lib/dpkg/info/ca-certificates.postinst", "type": "file" }, { - "bom-ref": "73909d0278110e3b", + "bom-ref": "5ebcc196524e2567", "name": "/var/lib/dpkg/info/ca-certificates.postrm", "type": "file" }, { - "bom-ref": "9946763f6bdb2e53", + "bom-ref": "11d449bac5efcc63", "name": "/var/lib/dpkg/info/ca-certificates.templates", "type": "file" }, { - "bom-ref": "e0d0fa8a938bb156", + "bom-ref": "e3974a7dd37db9ee", "name": "/var/lib/dpkg/info/ca-certificates.triggers", "type": "file" }, { - "bom-ref": "88cf645892756478", + "bom-ref": "44c98c65ef546312", "name": "/var/lib/dpkg/info/coreutils.list", "type": "file" }, { - "bom-ref": "3b84e88d34b6ca34", + "bom-ref": "f6883a27ba6c9e96", "name": "/var/lib/dpkg/info/coreutils.md5sums", "type": "file" }, { - "bom-ref": "4317132b21ebd45c", + "bom-ref": "b40da7432262ff04", "name": "/var/lib/dpkg/info/cpp-13-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "94c5ed3522130bad", + "bom-ref": "c03b072b18572975", "name": "/var/lib/dpkg/info/cpp-13-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "6b57beba4eb87b36", + "bom-ref": "9e336857e36c4c5a", "name": "/var/lib/dpkg/info/cpp-13.list", "type": "file" }, { - "bom-ref": "1281d9d185bab5e4", + "bom-ref": "3250fb82aac6ea3c", "name": "/var/lib/dpkg/info/cpp-13.md5sums", "type": "file" }, { - "bom-ref": "ef3bfebe8dc1874c", + "bom-ref": "9c5fd16faf7ca03c", "name": "/var/lib/dpkg/info/cpp-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "9671dd9d1b3d02ef", + "bom-ref": "4defa5a34b2cabe3", "name": "/var/lib/dpkg/info/cpp-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "b72f942d4f501f5c", + "bom-ref": "625255e41a335aa4", "name": "/var/lib/dpkg/info/cpp.list", "type": "file" }, { - "bom-ref": "a0726f693b52a89f", + "bom-ref": "ab9b968a85b45d4b", "name": "/var/lib/dpkg/info/cpp.md5sums", "type": "file" }, { - "bom-ref": "d9b9af56018736f0", + "bom-ref": "50b8bc843781113c", "name": "/var/lib/dpkg/info/cpp.postinst", "type": "file" }, { - "bom-ref": "bf769bbb32dcba1f", + "bom-ref": "de467662ad17a853", "name": "/var/lib/dpkg/info/cpp.postrm", "type": "file" }, { - "bom-ref": "6be5f1b474a928aa", + "bom-ref": "0cf740e8fe6cbdaa", "name": "/var/lib/dpkg/info/cpp.preinst", "type": "file" }, { - "bom-ref": "49eb5f18fd8e34f2", + "bom-ref": "b4d5924fc300f9ea", "name": "/var/lib/dpkg/info/cpp.prerm", "type": "file" }, { - "bom-ref": "95351feb5e636a55", + "bom-ref": "efa7153f01429add", "name": "/var/lib/dpkg/info/curl.list", "type": "file" }, { - "bom-ref": "41505909f0be2dd5", + "bom-ref": "03bd893ca612b7d1", "name": "/var/lib/dpkg/info/curl.md5sums", "type": "file" }, { - "bom-ref": "de3699c743d0080c", + "bom-ref": "179a99d65b29c142", "name": "/var/lib/dpkg/info/dash.list", "type": "file" }, { - "bom-ref": "0041539ad7f3fa38", + "bom-ref": "83e9dceaf450f2a2", "name": "/var/lib/dpkg/info/dash.md5sums", "type": "file" }, { - "bom-ref": "ce9901a2e2c60d2e", + "bom-ref": "574cf9c4ff4d6528", "name": "/var/lib/dpkg/info/dash.postinst", "type": "file" }, { - "bom-ref": "9cd940c15795446b", + "bom-ref": "1ab7749550c8a745", "name": "/var/lib/dpkg/info/dash.postrm", "type": "file" }, { - "bom-ref": "cba476894a943574", + "bom-ref": "bc6c07f34021f066", "name": "/var/lib/dpkg/info/dash.prerm", "type": "file" }, { - "bom-ref": "ea28e17db6fe1f54", + "bom-ref": "a27181998ef96922", + "name": "/var/lib/dpkg/info/dbus-bin.list", + "type": "file" + }, + { + "bom-ref": "72e2ab2f7f928861", + "name": "/var/lib/dpkg/info/dbus-bin.md5sums", + "type": "file" + }, + { + "bom-ref": "ef59f17c03a869f8", + "name": "/var/lib/dpkg/info/dbus-daemon.list", + "type": "file" + }, + { + "bom-ref": "7075ea0801860d72", + "name": "/var/lib/dpkg/info/dbus-daemon.md5sums", + "type": "file" + }, + { + "bom-ref": "875cb9b074ee3501", + "name": "/var/lib/dpkg/info/dbus-daemon.postinst", + "type": "file" + }, + { + "bom-ref": "5c43286de8df71ca", + "name": "/var/lib/dpkg/info/dbus-daemon.postrm", + "type": "file" + }, + { + "bom-ref": "c1092404755ba92a", + "name": "/var/lib/dpkg/info/dbus-session-bus-common.list", + "type": "file" + }, + { + "bom-ref": "b6deae9fd8224d58", + "name": "/var/lib/dpkg/info/dbus-session-bus-common.md5sums", + "type": "file" + }, + { + "bom-ref": "b99aeccfef4418ea", + "name": "/var/lib/dpkg/info/dbus-system-bus-common.list", + "type": "file" + }, + { + "bom-ref": "90fc4803a3e2caf6", + "name": "/var/lib/dpkg/info/dbus-system-bus-common.md5sums", + "type": "file" + }, + { + "bom-ref": "23a4b8ecc1b55a4d", + "name": "/var/lib/dpkg/info/dbus-system-bus-common.postinst", + "type": "file" + }, + { + "bom-ref": "0985383a4eedbf82", + "name": "/var/lib/dpkg/info/dbus.conffiles", + "type": "file" + }, + { + "bom-ref": "d8177624a6093577", + "name": "/var/lib/dpkg/info/dbus.list", + "type": "file" + }, + { + "bom-ref": "236ddd07d203d0c2", + "name": "/var/lib/dpkg/info/dbus.md5sums", + "type": "file" + }, + { + "bom-ref": "02f5b0240aa11af7", + "name": "/var/lib/dpkg/info/dbus.postinst", + "type": "file" + }, + { + "bom-ref": "a2c02f6e34696e40", + "name": "/var/lib/dpkg/info/dbus.postrm", + "type": "file" + }, + { + "bom-ref": "019d4977d1d8c434", + "name": "/var/lib/dpkg/info/dbus.preinst", + "type": "file" + }, + { + "bom-ref": "4faeae46ee9a299c", + "name": "/var/lib/dpkg/info/dbus.prerm", + "type": "file" + }, + { + "bom-ref": "381d222f120a037d", + "name": "/var/lib/dpkg/info/dbus.triggers", + "type": "file" + }, + { + "bom-ref": "cd79182f0780dc2a", "name": "/var/lib/dpkg/info/debconf.conffiles", "type": "file" }, { - "bom-ref": "3f9ebcce5e4ddab4", + "bom-ref": "e982998c88a41306", "name": "/var/lib/dpkg/info/debconf.config", "type": "file" }, { - "bom-ref": "6dbefb0cfce8ada5", + "bom-ref": "5c07b4d037abc2c7", "name": "/var/lib/dpkg/info/debconf.list", "type": "file" }, { - "bom-ref": "a14714b86275729a", + "bom-ref": "b4f8ed1cfe63aebc", "name": "/var/lib/dpkg/info/debconf.md5sums", "type": "file" }, { - "bom-ref": "51a6bdb8ce5a4dd2", + "bom-ref": "ec2298121ecdcb30", "name": "/var/lib/dpkg/info/debconf.postinst", "type": "file" }, { - "bom-ref": "99c63321512ac969", + "bom-ref": "c48e304a429963a3", "name": "/var/lib/dpkg/info/debconf.templates", "type": "file" }, { - "bom-ref": "c654f62f481b1966", + "bom-ref": "7f6f0145a502db3c", "name": "/var/lib/dpkg/info/debianutils.list", "type": "file" }, { - "bom-ref": "5dc1883edd064996", + "bom-ref": "ec637540e02d1254", "name": "/var/lib/dpkg/info/debianutils.md5sums", "type": "file" }, { - "bom-ref": "fe321164e299a1c5", + "bom-ref": "0950eb6f30500f3b", "name": "/var/lib/dpkg/info/debianutils.postinst", "type": "file" }, { - "bom-ref": "0080e26a5bc173be", + "bom-ref": "f5ec21dee4249528", "name": "/var/lib/dpkg/info/debianutils.postrm", "type": "file" }, { - "bom-ref": "dee1a26156d6e95f", + "bom-ref": "c91e6077eecd7999", "name": "/var/lib/dpkg/info/debianutils.prerm", "type": "file" }, { - "bom-ref": "aee7fb9e2046c51a", + "bom-ref": "b883fb0a58c6476c", "name": "/var/lib/dpkg/info/debianutils.triggers", "type": "file" }, { - "bom-ref": "c00fce8bab93e08c", + "bom-ref": "e945ed58e9921bfa", "name": "/var/lib/dpkg/info/diffutils.list", "type": "file" }, { - "bom-ref": "04f6beaff6af5977", + "bom-ref": "9291b3c79ddf0c7d", "name": "/var/lib/dpkg/info/diffutils.md5sums", "type": "file" }, { - "bom-ref": "cd8ecb0318821504", + "bom-ref": "072841666bcdad95", + "name": "/var/lib/dpkg/info/distro-info-data.list", + "type": "file" + }, + { + "bom-ref": "753ebe20416d1154", + "name": "/var/lib/dpkg/info/distro-info-data.md5sums", + "type": "file" + }, + { + "bom-ref": "006e1e677874df68", "name": "/var/lib/dpkg/info/dpkg-dev.conffiles", "type": "file" }, { - "bom-ref": "758aa880b735725a", + "bom-ref": "5952ef51f809415a", "name": "/var/lib/dpkg/info/dpkg-dev.list", "type": "file" }, { - "bom-ref": "abaa2c09dd934507", + "bom-ref": "3823b37639030b53", "name": "/var/lib/dpkg/info/dpkg-dev.md5sums", "type": "file" }, { - "bom-ref": "203e086d2eb249ae", + "bom-ref": "11ff2548d89f8594", "name": "/var/lib/dpkg/info/dpkg.conffiles", "type": "file" }, { - "bom-ref": "debd762d46e5eed9", + "bom-ref": "dc3d5171a78fd1a7", "name": "/var/lib/dpkg/info/dpkg.list", "type": "file" }, { - "bom-ref": "bd50d6e92689905b", + "bom-ref": "2af7234f7f7e8619", "name": "/var/lib/dpkg/info/dpkg.md5sums", "type": "file" }, { - "bom-ref": "2e1b0e1c34e30bfc", + "bom-ref": "a6e56b7a06a88d96", "name": "/var/lib/dpkg/info/dpkg.postinst", "type": "file" }, { - "bom-ref": "187b3b40bfe97fa5", + "bom-ref": "3aa9e4b40875bfb7", "name": "/var/lib/dpkg/info/dpkg.postrm", "type": "file" }, { - "bom-ref": "d9053ec3fd0c04af", + "bom-ref": "e3099249223aa695", "name": "/var/lib/dpkg/info/e2fsprogs.conffiles", "type": "file" }, { - "bom-ref": "eb88821f44aa42c2", + "bom-ref": "f060a0c31c8eb230", "name": "/var/lib/dpkg/info/e2fsprogs.list", "type": "file" }, { - "bom-ref": "1f0ac8baf075ebe6", + "bom-ref": "855289b0fdeec724", "name": "/var/lib/dpkg/info/e2fsprogs.md5sums", "type": "file" }, { - "bom-ref": "76e86ea3e6054483", + "bom-ref": "3ab0f7f537f96e75", "name": "/var/lib/dpkg/info/e2fsprogs.postinst", "type": "file" }, { - "bom-ref": "cf4a262fd9f2f75a", + "bom-ref": "91321fae16bfba10", "name": "/var/lib/dpkg/info/e2fsprogs.postrm", "type": "file" }, { - "bom-ref": "51a7fe479b50aa1a", + "bom-ref": "c99f3fd1d315c438", "name": "/var/lib/dpkg/info/e2fsprogs.preinst", "type": "file" }, { - "bom-ref": "7e77183a0def0705", + "bom-ref": "993dbb0604a70213", "name": "/var/lib/dpkg/info/e2fsprogs.prerm", "type": "file" }, { - "bom-ref": "b45956bc58bd92b5", + "bom-ref": "6688a6eb856d2195", "name": "/var/lib/dpkg/info/ffmpeg.list", "type": "file" }, { - "bom-ref": "6d928a59f58b0a47", + "bom-ref": "e44d46db52d68eaf", "name": "/var/lib/dpkg/info/ffmpeg.md5sums", "type": "file" }, { - "bom-ref": "cb93e2ebecb42477", + "bom-ref": "ac137c3c42f6c5dd", "name": "/var/lib/dpkg/info/findutils.list", "type": "file" }, { - "bom-ref": "b214b697e7e9c0c3", + "bom-ref": "3d50b75dc43c882d", "name": "/var/lib/dpkg/info/findutils.md5sums", "type": "file" }, { - "bom-ref": "a55ce67f84d43601", + "bom-ref": "cd43ff4e5dabb4d9", "name": "/var/lib/dpkg/info/fontconfig-config.conffiles", "type": "file" }, { - "bom-ref": "5e285eb307499254", + "bom-ref": "77df73136d3f0828", "name": "/var/lib/dpkg/info/fontconfig-config.list", "type": "file" }, { - "bom-ref": "132a5e93a34bafd3", + "bom-ref": "6c205c32f6a644bb", "name": "/var/lib/dpkg/info/fontconfig-config.md5sums", "type": "file" }, { - "bom-ref": "a9195b6d64b1c7fb", + "bom-ref": "e21ec8aebd5a68f7", "name": "/var/lib/dpkg/info/fontconfig-config.postinst", "type": "file" }, { - "bom-ref": "89faf06c2390b80a", + "bom-ref": "e795b5c51b4588ee", "name": "/var/lib/dpkg/info/fontconfig-config.postrm", "type": "file" }, { - "bom-ref": "cd99e769885bdc7d", + "bom-ref": "e5339eccd813ab01", "name": "/var/lib/dpkg/info/fontconfig-config.preinst", "type": "file" }, { - "bom-ref": "95cab6ff29a8cbf5", + "bom-ref": "b9bdc633c3793689", "name": "/var/lib/dpkg/info/fontconfig-config.prerm", "type": "file" }, { - "bom-ref": "8b54d8124c172c71", + "bom-ref": "86c5eed643e60eb1", "name": "/var/lib/dpkg/info/fontconfig.list", "type": "file" }, { - "bom-ref": "10bf2b6332072fd6", + "bom-ref": "6dc031908fe72faa", "name": "/var/lib/dpkg/info/fontconfig.md5sums", "type": "file" }, { - "bom-ref": "c6013024fe05cf3b", + "bom-ref": "c127ffa4f11564b7", "name": "/var/lib/dpkg/info/fontconfig.postinst", "type": "file" }, { - "bom-ref": "3658c37c7c9a7a93", + "bom-ref": "1f7eb749ffc6868b", "name": "/var/lib/dpkg/info/fontconfig.postrm", "type": "file" }, { - "bom-ref": "50dbbc26aebb4fa4", + "bom-ref": "a4e37fdd10239304", "name": "/var/lib/dpkg/info/fontconfig.triggers", "type": "file" }, { - "bom-ref": "5bef604e635d823e", + "bom-ref": "b41fe0dc81042f9a", "name": "/var/lib/dpkg/info/fonts-dejavu-core.conffiles", "type": "file" }, { - "bom-ref": "35d0c115e9d48156", + "bom-ref": "a2b9f5faa6dc3c3e", "name": "/var/lib/dpkg/info/fonts-dejavu-core.list", "type": "file" }, { - "bom-ref": "4a64cec150979c6d", + "bom-ref": "da931ca15eb67275", "name": "/var/lib/dpkg/info/fonts-dejavu-core.md5sums", "type": "file" }, { - "bom-ref": "d796eae12d5d7be1", + "bom-ref": "0c1b89512e5135e9", "name": "/var/lib/dpkg/info/fonts-dejavu-core.postinst", "type": "file" }, { - "bom-ref": "340baba9ad545b36", + "bom-ref": "7a939f22b52689ce", "name": "/var/lib/dpkg/info/fonts-dejavu-core.postrm", "type": "file" }, { - "bom-ref": "0a01b0f80337e7a5", + "bom-ref": "6151cfb9792e0c2d", "name": "/var/lib/dpkg/info/fonts-dejavu-core.preinst", "type": "file" }, { - "bom-ref": "7726d67c3e7f454f", + "bom-ref": "68cd18ae0d5950cb", "name": "/var/lib/dpkg/info/fonts-dejavu-core.prerm", "type": "file" }, { - "bom-ref": "a40d31b40bf4b4b8", + "bom-ref": "6d7494c7e9e1259c", "name": "/var/lib/dpkg/info/fonts-dejavu-mono.conffiles", "type": "file" }, { - "bom-ref": "1b6d7fe51a936b29", + "bom-ref": "22ee800c71629d5d", "name": "/var/lib/dpkg/info/fonts-dejavu-mono.list", "type": "file" }, { - "bom-ref": "bd8512b3c62e65d8", + "bom-ref": "e87f066ada0b2464", "name": "/var/lib/dpkg/info/fonts-dejavu-mono.md5sums", "type": "file" }, { - "bom-ref": "3c081cd8d5292ad3", + "bom-ref": "8739a4316668e203", "name": "/var/lib/dpkg/info/g++-13-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "4f77ddae5825c1d9", + "bom-ref": "e0819043312625d9", "name": "/var/lib/dpkg/info/g++-13-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "5f9c95097a241f5a", + "bom-ref": "db845a2f4e16c18a", "name": "/var/lib/dpkg/info/g++-13.list", "type": "file" }, { - "bom-ref": "40703c99022c52e8", + "bom-ref": "75f11d0b9df6060c", "name": "/var/lib/dpkg/info/g++-13.md5sums", "type": "file" }, { - "bom-ref": "2893d9b4d38a42df", + "bom-ref": "ec4522c01e81fc1f", "name": "/var/lib/dpkg/info/g++-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "ce66d83e24910b10", + "bom-ref": "44d33f8fbf1cba68", "name": "/var/lib/dpkg/info/g++-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "8cd3fdd184ca5d73", + "bom-ref": "b549aa7732a80b83", "name": "/var/lib/dpkg/info/g++.list", "type": "file" }, { - "bom-ref": "b543d0a8545bfdf4", + "bom-ref": "9810f69baea9ebb0", "name": "/var/lib/dpkg/info/g++.md5sums", "type": "file" }, { - "bom-ref": "ebaafd29c77ee4c0", + "bom-ref": "9df8d1be03e2cc10", "name": "/var/lib/dpkg/info/g++.postinst", "type": "file" }, { - "bom-ref": "e3545b18f0c89319", + "bom-ref": "e1bb363a66b7cc49", "name": "/var/lib/dpkg/info/g++.prerm", "type": "file" }, { - "bom-ref": "3188bdb673946a5e", + "bom-ref": "8c288c265a353f1a", "name": "/var/lib/dpkg/info/gcc-13-base:amd64.md5sums", "type": "file" }, { - "bom-ref": "83f2b307c57e580f", + "bom-ref": "84ec72ddac2fc1ff", "name": "/var/lib/dpkg/info/gcc-13-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "82d6b07d77895798", + "bom-ref": "b40d96a5e7746120", "name": "/var/lib/dpkg/info/gcc-13-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "34931c86bfd31bae", + "bom-ref": "7d5c63abde554d66", "name": "/var/lib/dpkg/info/gcc-13.list", "type": "file" }, { - "bom-ref": "49eea879e480996d", + "bom-ref": "6f836db6120e0355", "name": "/var/lib/dpkg/info/gcc-13.md5sums", "type": "file" }, { - "bom-ref": "3cefb7e0f2057ad0", + "bom-ref": "6e7c39f155714f06", "name": "/var/lib/dpkg/info/gcc-14-base:amd64.md5sums", "type": "file" }, { - "bom-ref": "c9fc3d555111421c", + "bom-ref": "82d50d203dce8e88", "name": "/var/lib/dpkg/info/gcc-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "9854f50ee45199cd", + "bom-ref": "cc1a5c19692c1cf1", "name": "/var/lib/dpkg/info/gcc-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "36f80b001c6f7af1", + "bom-ref": "949ec2702fd8db65", "name": "/var/lib/dpkg/info/gcc.list", "type": "file" }, { - "bom-ref": "79b0d82e595fac1e", + "bom-ref": "b0b76ba5e4df315e", "name": "/var/lib/dpkg/info/gcc.md5sums", "type": "file" }, { - "bom-ref": "bff813540760b6bd", + "bom-ref": "2d82bd1a535e00bd", "name": "/var/lib/dpkg/info/gcc.postinst", "type": "file" }, { - "bom-ref": "83df4f13521160c6", + "bom-ref": "648df62beed173c6", "name": "/var/lib/dpkg/info/gcc.prerm", "type": "file" }, { - "bom-ref": "48e6699fa5331957", + "bom-ref": "51122ee56c684fd5", + "name": "/var/lib/dpkg/info/gir1.2-girepository-2.0:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "7fcadbb1997672bf", + "name": "/var/lib/dpkg/info/gir1.2-glib-2.0:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "2a9b1ad00a221979", + "name": "/var/lib/dpkg/info/gir1.2-packagekitglib-1.0.list", + "type": "file" + }, + { + "bom-ref": "37e797cbce63ba97", + "name": "/var/lib/dpkg/info/gir1.2-packagekitglib-1.0.md5sums", + "type": "file" + }, + { + "bom-ref": "87cd655f2eac323b", "name": "/var/lib/dpkg/info/git-man.list", "type": "file" }, { - "bom-ref": "093037d5fc039414", + "bom-ref": "9f0ec5f5790dad54", "name": "/var/lib/dpkg/info/git-man.md5sums", "type": "file" }, { - "bom-ref": "ae3a86ae8b415562", + "bom-ref": "acc3ef28852008ca", "name": "/var/lib/dpkg/info/git.conffiles", "type": "file" }, { - "bom-ref": "4970a6e14a811dfc", + "bom-ref": "5bdca3d6802c6b7c", "name": "/var/lib/dpkg/info/git.list", "type": "file" }, { - "bom-ref": "0b25153807f46781", + "bom-ref": "d12cd38d38998ca5", "name": "/var/lib/dpkg/info/git.md5sums", "type": "file" }, { - "bom-ref": "2e22ad453a59210a", + "bom-ref": "2de5cbf7104bba8e", "name": "/var/lib/dpkg/info/git.postinst", "type": "file" }, { - "bom-ref": "f0f75ed16472653e", + "bom-ref": "fcf7aa5ec65a4ebe", "name": "/var/lib/dpkg/info/git.postrm", "type": "file" }, { - "bom-ref": "713b7c8aba70ba90", + "bom-ref": "109be79a4d2ba198", "name": "/var/lib/dpkg/info/git.preinst", "type": "file" }, { - "bom-ref": "64da08f6c7b0cca9", + "bom-ref": "b9e2da3b0a2b99b9", "name": "/var/lib/dpkg/info/git.prerm", "type": "file" }, { - "bom-ref": "d63309c8bb7b4102", + "bom-ref": "11fcac80d2f00ede", "name": "/var/lib/dpkg/info/gpg.list", "type": "file" }, { - "bom-ref": "82d161143c2f2d2f", + "bom-ref": "9ea6763905d0f353", "name": "/var/lib/dpkg/info/gpg.md5sums", "type": "file" }, { - "bom-ref": "ffab03d0a70f3051", + "bom-ref": "447de2f732327009", "name": "/var/lib/dpkg/info/gpgconf.list", "type": "file" }, { - "bom-ref": "6dc97b521a703214", + "bom-ref": "00c519081e212a04", "name": "/var/lib/dpkg/info/gpgconf.md5sums", "type": "file" }, { - "bom-ref": "3d2583930fe8d874", + "bom-ref": "19384011b550491a", "name": "/var/lib/dpkg/info/gpgv.list", "type": "file" }, { - "bom-ref": "39b75a37f848bdf4", + "bom-ref": "62906bc006a80986", "name": "/var/lib/dpkg/info/gpgv.md5sums", "type": "file" }, { - "bom-ref": "43b78e2c6ae77666", + "bom-ref": "30a7825a7f6af478", "name": "/var/lib/dpkg/info/grep.list", "type": "file" }, { - "bom-ref": "b9a2724d0ab14a2d", + "bom-ref": "bf1e683dd3f702df", "name": "/var/lib/dpkg/info/grep.md5sums", "type": "file" }, { - "bom-ref": "55f8551cea42bd2b", + "bom-ref": "c5afc438a276c425", "name": "/var/lib/dpkg/info/gzip.list", "type": "file" }, { - "bom-ref": "67b3ca78aea1eea7", + "bom-ref": "61a98e5a9cd00319", "name": "/var/lib/dpkg/info/gzip.md5sums", "type": "file" }, { - "bom-ref": "a79e502d91a8205f", + "bom-ref": "3f70f5312197a219", "name": "/var/lib/dpkg/info/gzip.postinst", "type": "file" }, { - "bom-ref": "86deb193df8d6608", + "bom-ref": "f38340bf5fab1696", "name": "/var/lib/dpkg/info/gzip.preinst", "type": "file" }, { - "bom-ref": "233f77f6ffda54ba", + "bom-ref": "271690a630107ec8", "name": "/var/lib/dpkg/info/hostname.list", "type": "file" }, { - "bom-ref": "96d559d21b9622ff", + "bom-ref": "6bfcdd31b7411245", "name": "/var/lib/dpkg/info/hostname.md5sums", "type": "file" }, { - "bom-ref": "4b44b18c769bffee", + "bom-ref": "104b70bb85b41526", "name": "/var/lib/dpkg/info/ibverbs-providers:amd64.conffiles", "type": "file" }, { - "bom-ref": "2b47a4f0eb6c5ed2", + "bom-ref": "9f41f96f615528ba", "name": "/var/lib/dpkg/info/ibverbs-providers:amd64.md5sums", "type": "file" }, { - "bom-ref": "7744eadca4b09f16", + "bom-ref": "3f5d8d0ef02bbeb4", "name": "/var/lib/dpkg/info/init-system-helpers.list", "type": "file" }, { - "bom-ref": "f076064806fbd340", + "bom-ref": "834c891924cefaaa", "name": "/var/lib/dpkg/info/init-system-helpers.md5sums", "type": "file" }, { - "bom-ref": "54ff44d454f58279", + "bom-ref": "ea2a270d6fde2d26", "name": "/var/lib/dpkg/info/intel-igc-core-2.list", "type": "file" }, { - "bom-ref": "f1153429791182b5", + "bom-ref": "7448db64965162ce", "name": "/var/lib/dpkg/info/intel-igc-core-2.md5sums", "type": "file" }, { - "bom-ref": "15422ccf7d4fe3a5", + "bom-ref": "728f3044931feb3e", "name": "/var/lib/dpkg/info/intel-igc-opencl-2.list", "type": "file" }, { - "bom-ref": "c70ad7d4ecc06589", + "bom-ref": "c6c30cc16a8a20ca", "name": "/var/lib/dpkg/info/intel-igc-opencl-2.md5sums", "type": "file" }, { - "bom-ref": "1f636495701139d4", - "name": "/var/lib/dpkg/info/intel-ocloc.list", + "bom-ref": "d259a87a23c2f671", + "name": "/var/lib/dpkg/info/intel-media-va-driver-non-free:amd64.md5sums", "type": "file" }, { - "bom-ref": "a68208e37b8933bd", - "name": "/var/lib/dpkg/info/intel-ocloc.md5sums", + "bom-ref": "4ce4de20d866c877", + "name": "/var/lib/dpkg/info/intel-metrics-discovery.list", "type": "file" }, { - "bom-ref": "0be6e3d571e4f218", - "name": "/var/lib/dpkg/info/intel-ocloc.postinst", + "bom-ref": "d50fb7af2919dfdc", + "name": "/var/lib/dpkg/info/intel-metrics-discovery.md5sums", "type": "file" }, { - "bom-ref": "33bba8f11d0da065", - "name": "/var/lib/dpkg/info/intel-ocloc.prerm", + "bom-ref": "dc0f5b92eb8c4b11", + "name": "/var/lib/dpkg/info/intel-metrics-discovery.shlibs", "type": "file" }, { - "bom-ref": "7a3eaab7c1907c9e", - "name": "/var/lib/dpkg/info/intel-opencl-icd.conffiles", + "bom-ref": "e5dd081c7e56f334", + "name": "/var/lib/dpkg/info/intel-metrics-discovery.triggers", "type": "file" }, { - "bom-ref": "bb593e8f161b0f3e", - "name": "/var/lib/dpkg/info/intel-opencl-icd.list", + "bom-ref": "8333bc55dfaf7881", + "name": "/var/lib/dpkg/info/intel-metrics-library.list", "type": "file" }, { - "bom-ref": "68ee002a266a4bc7", - "name": "/var/lib/dpkg/info/intel-opencl-icd.md5sums", + "bom-ref": "539a6ca998d740e0", + "name": "/var/lib/dpkg/info/intel-metrics-library.md5sums", + "type": "file" + }, + { + "bom-ref": "258b54ae14f4c3b9", + "name": "/var/lib/dpkg/info/intel-metrics-library.shlibs", + "type": "file" + }, + { + "bom-ref": "be61faa1d8da591f", + "name": "/var/lib/dpkg/info/intel-metrics-library.triggers", + "type": "file" + }, + { + "bom-ref": "8be2a4f1194008ab", + "name": "/var/lib/dpkg/info/intel-ocloc.list", "type": "file" }, { - "bom-ref": "db7d93122ebfa7c7", - "name": "/var/lib/dpkg/info/level-zero-devel.list", + "bom-ref": "ea202d042cacf392", + "name": "/var/lib/dpkg/info/intel-ocloc.md5sums", "type": "file" }, { - "bom-ref": "c999b92ec6f04e71", - "name": "/var/lib/dpkg/info/level-zero-devel.md5sums", + "bom-ref": "068395126b15bc53", + "name": "/var/lib/dpkg/info/intel-ocloc.postinst", "type": "file" }, { - "bom-ref": "bb86d1b8335a0502", - "name": "/var/lib/dpkg/info/level-zero.list", + "bom-ref": "4b6233a1f7e609ae", + "name": "/var/lib/dpkg/info/intel-ocloc.prerm", "type": "file" }, { - "bom-ref": "c22267496b02923b", - "name": "/var/lib/dpkg/info/level-zero.md5sums", + "bom-ref": "02d4ac2233c272f5", + "name": "/var/lib/dpkg/info/intel-opencl-icd.conffiles", "type": "file" }, { - "bom-ref": "a1ba0f38a62fa491", - "name": "/var/lib/dpkg/info/level-zero.postinst", + "bom-ref": "3be985e67aa0caed", + "name": "/var/lib/dpkg/info/intel-opencl-icd.list", "type": "file" }, { - "bom-ref": "eb8f7ae7303f90eb", - "name": "/var/lib/dpkg/info/level-zero.postrm", + "bom-ref": "1b81c6903324b3b4", + "name": "/var/lib/dpkg/info/intel-opencl-icd.md5sums", "type": "file" }, { - "bom-ref": "2eed621029dd8867", + "bom-ref": "e2d15e3f60c4e2ff", + "name": "/var/lib/dpkg/info/iso-codes.list", + "type": "file" + }, + { + "bom-ref": "bd179f58b5fadfff", + "name": "/var/lib/dpkg/info/iso-codes.md5sums", + "type": "file" + }, + { + "bom-ref": "983b6e966bc8f3fd", "name": "/var/lib/dpkg/info/libacl1:amd64.md5sums", "type": "file" }, { - "bom-ref": "1bcf10e681d87c6e", + "bom-ref": "900892bf9664cb3e", "name": "/var/lib/dpkg/info/libaio-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "04f7b3fd8c720ef5", + "bom-ref": "690ba42e59dcd03d", "name": "/var/lib/dpkg/info/libaio1t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "df2f1ae88941291f", + "bom-ref": "7b25444d68b60c43", "name": "/var/lib/dpkg/info/libaom3:amd64.md5sums", "type": "file" }, { - "bom-ref": "d7c55144dae1c406", + "bom-ref": "5d2483a2be91a9c6", "name": "/var/lib/dpkg/info/libapparmor1:amd64.md5sums", "type": "file" }, { - "bom-ref": "48e3c0a9364d1671", + "bom-ref": "5d45ea1bc94366c3", + "name": "/var/lib/dpkg/info/libappstream5:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "9b0966d8d1fada03", "name": "/var/lib/dpkg/info/libapt-pkg6.0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "c24eadf1b970bc8a", + "bom-ref": "f191aa9c603eb73c", "name": "/var/lib/dpkg/info/libargon2-1:amd64.md5sums", "type": "file" }, { - "bom-ref": "e8813ba1145ec7bf", + "bom-ref": "e4a1cd224b4c2993", "name": "/var/lib/dpkg/info/libasan8:amd64.md5sums", "type": "file" }, { - "bom-ref": "c4c48284f65e30dd", + "bom-ref": "dda2373dd2665c21", "name": "/var/lib/dpkg/info/libasound2-data.list", "type": "file" }, { - "bom-ref": "3f171fa077655a01", + "bom-ref": "2d7e95008c8f8d49", "name": "/var/lib/dpkg/info/libasound2-data.md5sums", "type": "file" }, { - "bom-ref": "f2a6042df9423110", + "bom-ref": "d3985bc1247e3350", "name": "/var/lib/dpkg/info/libasound2t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "8ed1085a8f466412", + "bom-ref": "71614cc45c013a3e", "name": "/var/lib/dpkg/info/libass9:amd64.md5sums", "type": "file" }, { - "bom-ref": "6ec6d01766f6a4f7", + "bom-ref": "8080642d3c5aaec5", "name": "/var/lib/dpkg/info/libassuan0:amd64.md5sums", "type": "file" }, { - "bom-ref": "5a1898ba516a616e", + "bom-ref": "27f3200abdff6e46", "name": "/var/lib/dpkg/info/libasyncns0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e444060b1ba6cd51", + "bom-ref": "2ce2fea02e3c0f95", "name": "/var/lib/dpkg/info/libatomic1:amd64.md5sums", "type": "file" }, { - "bom-ref": "5306a081cc2ec71b", + "bom-ref": "033d40daa3045e2d", "name": "/var/lib/dpkg/info/libattr1:amd64.conffiles", "type": "file" }, { - "bom-ref": "85df8e50f45948bf", + "bom-ref": "47017f8f3b775aa9", "name": "/var/lib/dpkg/info/libattr1:amd64.md5sums", "type": "file" }, { - "bom-ref": "b178120586cda6a4", + "bom-ref": "70827acc980970ee", "name": "/var/lib/dpkg/info/libaudit-common.conffiles", "type": "file" }, { - "bom-ref": "00cca4d5627c634a", + "bom-ref": "5b9605c2aaaa58d4", "name": "/var/lib/dpkg/info/libaudit-common.list", "type": "file" }, { - "bom-ref": "7702145f5f8d9913", + "bom-ref": "ba31b263d2827571", "name": "/var/lib/dpkg/info/libaudit-common.md5sums", "type": "file" }, { - "bom-ref": "c17a8f3ac266da3e", + "bom-ref": "fc2e2f8844b1b520", "name": "/var/lib/dpkg/info/libaudit1:amd64.md5sums", "type": "file" }, { - "bom-ref": "496b66b4c54a9d0f", + "bom-ref": "da51936ae9184483", "name": "/var/lib/dpkg/info/libavc1394-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "11988d9c61005d0f", + "bom-ref": "445efb786f2d05fb", "name": "/var/lib/dpkg/info/libavcodec60:amd64.md5sums", "type": "file" }, { - "bom-ref": "f1c882b1ec07f809", + "bom-ref": "3e4196a04e858d65", "name": "/var/lib/dpkg/info/libavdevice60:amd64.md5sums", "type": "file" }, { - "bom-ref": "a6b1df088d632aff", + "bom-ref": "09d11085a450475f", "name": "/var/lib/dpkg/info/libavfilter9:amd64.md5sums", "type": "file" }, { - "bom-ref": "0c4edc5847e0cf38", + "bom-ref": "e88c2097260b9320", "name": "/var/lib/dpkg/info/libavformat60:amd64.md5sums", "type": "file" }, { - "bom-ref": "f71b40132932a1ac", + "bom-ref": "a974ce85c83cf4c8", "name": "/var/lib/dpkg/info/libavutil58:amd64.md5sums", "type": "file" }, { - "bom-ref": "52acbc3bcbfc8ff5", + "bom-ref": "36ef7a63571a7ddd", "name": "/var/lib/dpkg/info/libbinutils:amd64.md5sums", "type": "file" }, { - "bom-ref": "b908d6d6acbb7081", + "bom-ref": "1db6f8bb8951ca25", "name": "/var/lib/dpkg/info/libblas3:amd64.md5sums", "type": "file" }, { - "bom-ref": "2375e00cd60c0c75", + "bom-ref": "617f8c9b71b036ad", "name": "/var/lib/dpkg/info/libblkid1:amd64.md5sums", "type": "file" }, { - "bom-ref": "a3c115a0ff065c6e", + "bom-ref": "bd0d8266660f98d2", "name": "/var/lib/dpkg/info/libbluray2:amd64.md5sums", "type": "file" }, { - "bom-ref": "f17f1579048b9346", + "bom-ref": "50431b9bf25207ca", "name": "/var/lib/dpkg/info/libbrotli1:amd64.md5sums", "type": "file" }, { - "bom-ref": "db2ba6273d327802", + "bom-ref": "8679c7e5a0129bf2", "name": "/var/lib/dpkg/info/libbs2b0:amd64.md5sums", "type": "file" }, { - "bom-ref": "5a178978e704cfd6", + "bom-ref": "14d6b444d83ecbc2", "name": "/var/lib/dpkg/info/libbsd0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e1540ff75f0af45a", + "bom-ref": "5499465422648a74", "name": "/var/lib/dpkg/info/libbz2-1.0:amd64.md5sums", "type": "file" }, { - "bom-ref": "a09b56d852b6b18a", + "bom-ref": "de62855da389594c", "name": "/var/lib/dpkg/info/libc-bin.conffiles", "type": "file" }, { - "bom-ref": "d8cedcaea9a13519", + "bom-ref": "233a83ce75d777bb", "name": "/var/lib/dpkg/info/libc-bin.list", "type": "file" }, { - "bom-ref": "9a22785167b15199", + "bom-ref": "955dbe3dbdcb73cb", "name": "/var/lib/dpkg/info/libc-bin.md5sums", "type": "file" }, { - "bom-ref": "fa5287fab517b8c4", + "bom-ref": "aa74f0c7d5fdbc5a", "name": "/var/lib/dpkg/info/libc-bin.postinst", "type": "file" }, { - "bom-ref": "31fc59504d29035d", + "bom-ref": "c9d259de74abb853", "name": "/var/lib/dpkg/info/libc-bin.triggers", "type": "file" }, { - "bom-ref": "7e20b0b5ffa9cbd8", + "bom-ref": "e5389ea2075381d0", "name": "/var/lib/dpkg/info/libc-dev-bin.list", "type": "file" }, { - "bom-ref": "6583ccc83c90a3aa", + "bom-ref": "966eb8f2b744bb72", "name": "/var/lib/dpkg/info/libc-dev-bin.md5sums", "type": "file" }, { - "bom-ref": "3fa99265227a8101", + "bom-ref": "820ed004d448b03d", "name": "/var/lib/dpkg/info/libc6-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "cf87b5cb6a447dcb", + "bom-ref": "dc4540e64819bced", "name": "/var/lib/dpkg/info/libc6:amd64.conffiles", "type": "file" }, { - "bom-ref": "2cfba24efe8ab3d4", + "bom-ref": "b57092fc0e71283e", "name": "/var/lib/dpkg/info/libc6:amd64.md5sums", "type": "file" }, { - "bom-ref": "d8c75d81e6aea58e", + "bom-ref": "f363bb98deeeaeea", "name": "/var/lib/dpkg/info/libcaca0:amd64.md5sums", "type": "file" }, { - "bom-ref": "3e594f687990b956", + "bom-ref": "0777f9300e928aee", "name": "/var/lib/dpkg/info/libcairo-gobject2:amd64.md5sums", "type": "file" }, { - "bom-ref": "4bfa256c3769d5a3", + "bom-ref": "97afa96786f1cca7", "name": "/var/lib/dpkg/info/libcairo2:amd64.md5sums", "type": "file" }, { - "bom-ref": "3a4cb2dd381fb046", + "bom-ref": "978d8b861e46f4b0", "name": "/var/lib/dpkg/info/libcap-ng0:amd64.md5sums", "type": "file" }, { - "bom-ref": "10d0a5e85638c0ab", + "bom-ref": "25107f966c2a6e9c", + "name": "/var/lib/dpkg/info/libcap2-bin.list", + "type": "file" + }, + { + "bom-ref": "5138e6e34e85d455", + "name": "/var/lib/dpkg/info/libcap2-bin.md5sums", + "type": "file" + }, + { + "bom-ref": "113dfe1a2dd6106d", "name": "/var/lib/dpkg/info/libcap2:amd64.md5sums", "type": "file" }, { - "bom-ref": "9fe0a13821b2a8f6", + "bom-ref": "4cad0ec4d603c2de", "name": "/var/lib/dpkg/info/libcc1-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "4511d5ac5b208341", + "bom-ref": "4de9961002cc1865", "name": "/var/lib/dpkg/info/libcdio-cdda2t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "d280144167918a71", + "bom-ref": "2b9889aafc828869", "name": "/var/lib/dpkg/info/libcdio-paranoia2t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "656e8afd29664ac9", + "bom-ref": "ecb3b371c02ac33d", "name": "/var/lib/dpkg/info/libcdio19t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "1b6d1fdbdb52c0f5", + "bom-ref": "45c2383579d03951", "name": "/var/lib/dpkg/info/libchromaprint1:amd64.md5sums", "type": "file" }, { - "bom-ref": "18ad773f39db598d", + "bom-ref": "25734114cd85cc09", "name": "/var/lib/dpkg/info/libcjson1:amd64.md5sums", "type": "file" }, { - "bom-ref": "b84e640aee709375", + "bom-ref": "bb5a0a6fad4cc589", "name": "/var/lib/dpkg/info/libcodec2-1.2:amd64.md5sums", "type": "file" }, { - "bom-ref": "dbae91e03e55f9c7", + "bom-ref": "0f601aaca53d5a55", "name": "/var/lib/dpkg/info/libcom-err2:amd64.md5sums", "type": "file" }, { - "bom-ref": "90519cc7576e27f0", + "bom-ref": "c25a3986822230f0", "name": "/var/lib/dpkg/info/libcrypt-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "96d9a0fd934d3bda", + "bom-ref": "01ee1d9a794c0030", "name": "/var/lib/dpkg/info/libcrypt1:amd64.md5sums", "type": "file" }, { - "bom-ref": "fe39ae9f86f64088", + "bom-ref": "81413feda6fd90ba", "name": "/var/lib/dpkg/info/libcryptsetup12:amd64.md5sums", "type": "file" }, { - "bom-ref": "05ff293b3de7a87a", + "bom-ref": "0f96e53a4ac0ac02", "name": "/var/lib/dpkg/info/libctf-nobfd0:amd64.md5sums", "type": "file" }, { - "bom-ref": "1c3b63f574812d0b", + "bom-ref": "d7f23bc12f5cf0bf", "name": "/var/lib/dpkg/info/libctf0:amd64.md5sums", "type": "file" }, { - "bom-ref": "1c45fc6525b0942f", + "bom-ref": "9b001fd613378e6b", "name": "/var/lib/dpkg/info/libcurl3t64-gnutls:amd64.md5sums", "type": "file" }, { - "bom-ref": "ef80673343c904cd", + "bom-ref": "035ebc8b0f45d829", "name": "/var/lib/dpkg/info/libcurl4t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "e5a33cc287845d4d", + "bom-ref": "6bf3d841f85ae5dd", "name": "/var/lib/dpkg/info/libdatrie1:amd64.md5sums", "type": "file" }, { - "bom-ref": "581c322fc29ec9b2", + "bom-ref": "779db21af059567a", "name": "/var/lib/dpkg/info/libdav1d7:amd64.md5sums", "type": "file" }, { - "bom-ref": "94cf357de4fc8d13", + "bom-ref": "eb37d9105b24ca6d", "name": "/var/lib/dpkg/info/libdb5.3t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "cb7481f745597987", + "bom-ref": "cb73892afa2c20d3", "name": "/var/lib/dpkg/info/libdbus-1-3:amd64.md5sums", "type": "file" }, { - "bom-ref": "521c56ee2cfd4280", + "bom-ref": "8aeea28a3dfe31a0", "name": "/var/lib/dpkg/info/libdc1394-25:amd64.md5sums", "type": "file" }, { - "bom-ref": "d19f6f887ed8e73c", + "bom-ref": "35b9cef7c2900276", "name": "/var/lib/dpkg/info/libdebconfclient0:amd64.md5sums", "type": "file" }, { - "bom-ref": "9aade284cc1c411e", + "bom-ref": "4a670afc5ee55732", "name": "/var/lib/dpkg/info/libdecor-0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "42fdd4d52718ad68", + "bom-ref": "48316ad54086882c", "name": "/var/lib/dpkg/info/libdeflate0:amd64.md5sums", "type": "file" }, { - "bom-ref": "3959fb7d83935b89", + "bom-ref": "229ac2b23a7e9e67", "name": "/var/lib/dpkg/info/libdevmapper1.02.1:amd64.md5sums", "type": "file" }, { - "bom-ref": "04be20ae2ef61ce3", + "bom-ref": "ef51ba52457424bf", "name": "/var/lib/dpkg/info/libdpkg-perl.list", "type": "file" }, { - "bom-ref": "430e2f654325eadb", + "bom-ref": "aa064b7d74c43b87", "name": "/var/lib/dpkg/info/libdpkg-perl.md5sums", "type": "file" }, { - "bom-ref": "626b6006f018e92d", + "bom-ref": "6f189cafff95d5b5", "name": "/var/lib/dpkg/info/libdrm-amdgpu1:amd64.md5sums", "type": "file" }, { - "bom-ref": "3f25936f0f6c6379", + "bom-ref": "2b502b810a1eaa3d", "name": "/var/lib/dpkg/info/libdrm-common.list", "type": "file" }, { - "bom-ref": "89568d6e99b757d8", + "bom-ref": "5c8bd7229ea45a2c", "name": "/var/lib/dpkg/info/libdrm-common.md5sums", "type": "file" }, { - "bom-ref": "cd422cef01f62307", + "bom-ref": "c12a1b18006a21c3", "name": "/var/lib/dpkg/info/libdrm-intel1:amd64.md5sums", "type": "file" }, { - "bom-ref": "e875a838e64c2d71", + "bom-ref": "244005226aac0b89", "name": "/var/lib/dpkg/info/libdrm2:amd64.md5sums", "type": "file" }, { - "bom-ref": "dd6c645945b0016d", + "bom-ref": "67d9c4547d46ca21", + "name": "/var/lib/dpkg/info/libduktape207:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "66ae3f8fb91bc163", + "name": "/var/lib/dpkg/info/libdw1t64:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "79e428ec1c927e91", "name": "/var/lib/dpkg/info/libedit2:amd64.md5sums", "type": "file" }, { - "bom-ref": "eaf5611d73abe434", + "bom-ref": "cf5cdfe191ae0a14", "name": "/var/lib/dpkg/info/libelf1t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "a12b17ae47096ad0", + "bom-ref": "b40f1b0b0fbe5f98", "name": "/var/lib/dpkg/info/liberror-perl.list", "type": "file" }, { - "bom-ref": "1116d757ea696077", + "bom-ref": "adde336d70cfe233", "name": "/var/lib/dpkg/info/liberror-perl.md5sums", "type": "file" }, { - "bom-ref": "72daefbeba13e097", + "bom-ref": "417419339b875c0b", "name": "/var/lib/dpkg/info/libexpat1-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "f5192381ed63eb93", + "bom-ref": "1922cba892337fb3", "name": "/var/lib/dpkg/info/libexpat1:amd64.md5sums", "type": "file" }, { - "bom-ref": "b343043fe052d9f4", + "bom-ref": "77a6fbf767b18afe", "name": "/var/lib/dpkg/info/libext2fs2t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "99ac527599e56eb3", + "bom-ref": "bbd9d0c6a6198771", "name": "/var/lib/dpkg/info/libfdisk1:amd64.md5sums", "type": "file" }, { - "bom-ref": "a7bdc3db39191821", + "bom-ref": "26215ae65f0b6593", "name": "/var/lib/dpkg/info/libffi8:amd64.md5sums", "type": "file" }, { - "bom-ref": "5d55228e587474f4", + "bom-ref": "f49ed760f34ca718", "name": "/var/lib/dpkg/info/libfftw3-double3:amd64.md5sums", "type": "file" }, { - "bom-ref": "613caef952fec52b", + "bom-ref": "bdb43d5de6eea13b", "name": "/var/lib/dpkg/info/libflac12t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "82f7a4c9d79cb2ab", + "bom-ref": "e561c4e67c846447", "name": "/var/lib/dpkg/info/libflite1:amd64.md5sums", "type": "file" }, { - "bom-ref": "4b7edfa44479abea", + "bom-ref": "93915e1bd4fa00e6", "name": "/var/lib/dpkg/info/libfontconfig1:amd64.md5sums", "type": "file" }, { - "bom-ref": "8cdba46fb62d5920", + "bom-ref": "5d565d95b637b39c", "name": "/var/lib/dpkg/info/libfreetype6:amd64.md5sums", "type": "file" }, { - "bom-ref": "425aec45997415d3", + "bom-ref": "36958d79d45a7d43", "name": "/var/lib/dpkg/info/libfribidi0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e42ed16c233df10e", + "bom-ref": "c862013582c497f6", "name": "/var/lib/dpkg/info/libgbm1:amd64.md5sums", "type": "file" }, { - "bom-ref": "428c1f0f3bf86eda", + "bom-ref": "06c848b72319a596", "name": "/var/lib/dpkg/info/libgcc-13-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "43fbc84d170e475f", + "bom-ref": "414561adc78c5a55", "name": "/var/lib/dpkg/info/libgcc-s1:amd64.md5sums", "type": "file" }, { - "bom-ref": "43e9da1dd161e6be", + "bom-ref": "f1073a009ab95068", "name": "/var/lib/dpkg/info/libgcrypt20:amd64.md5sums", "type": "file" }, { - "bom-ref": "53fc4ad92ed75d7c", + "bom-ref": "e34024c870f41244", "name": "/var/lib/dpkg/info/libgdbm-compat4t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "c779e30ceae43b82", + "bom-ref": "c78cca33684c9dfe", "name": "/var/lib/dpkg/info/libgdbm6t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "aafcf3d0423cf3bc", + "bom-ref": "93aa8e453a09d340", "name": "/var/lib/dpkg/info/libgdk-pixbuf-2.0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "84a6dbd22926179f", + "bom-ref": "627e01a49c03d7f7", "name": "/var/lib/dpkg/info/libgdk-pixbuf2.0-common.list", "type": "file" }, { - "bom-ref": "d0685defa13cd3f5", + "bom-ref": "91dceef59084d6e5", "name": "/var/lib/dpkg/info/libgdk-pixbuf2.0-common.md5sums", "type": "file" }, { - "bom-ref": "a5ea6d9e9cd5f972", + "bom-ref": "3d328e3528f9e26e", "name": "/var/lib/dpkg/info/libgfortran5:amd64.md5sums", "type": "file" }, { - "bom-ref": "47e765720240f2d5", + "bom-ref": "0ba04f7cd5d1bfd7", + "name": "/var/lib/dpkg/info/libgirepository-1.0-1:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "5ce2d6c25f961b15", "name": "/var/lib/dpkg/info/libgl1-mesa-dri:amd64.md5sums", "type": "file" }, { - "bom-ref": "9a042e6cdde1d4dc", + "bom-ref": "8a82773b6afbfad0", "name": "/var/lib/dpkg/info/libgl1:amd64.md5sums", "type": "file" }, { - "bom-ref": "e7648be763137a94", + "bom-ref": "eea0922f3c0613f4", "name": "/var/lib/dpkg/info/libglib2.0-0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "433d1dac769b85b9", + "bom-ref": "5788280aa25b98d7", + "name": "/var/lib/dpkg/info/libglib2.0-bin.list", + "type": "file" + }, + { + "bom-ref": "92d37f484fc9d413", + "name": "/var/lib/dpkg/info/libglib2.0-bin.md5sums", + "type": "file" + }, + { + "bom-ref": "3e38c658618df057", + "name": "/var/lib/dpkg/info/libglib2.0-data.list", + "type": "file" + }, + { + "bom-ref": "9745d0f053daf5d8", + "name": "/var/lib/dpkg/info/libglib2.0-data.md5sums", + "type": "file" + }, + { + "bom-ref": "5338063864a49c89", "name": "/var/lib/dpkg/info/libglvnd0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e7b398468c9c81b6", + "bom-ref": "db1470f4eff52936", "name": "/var/lib/dpkg/info/libglx-mesa0:amd64.md5sums", "type": "file" }, { - "bom-ref": "fece06430d3a945f", + "bom-ref": "99e23da5eda57693", "name": "/var/lib/dpkg/info/libglx0:amd64.md5sums", "type": "file" }, { - "bom-ref": "781c05e0d7bcabf0", + "bom-ref": "163a00a06ae3b0dc", "name": "/var/lib/dpkg/info/libgme0:amd64.md5sums", "type": "file" }, { - "bom-ref": "a634bda5549c22b4", + "bom-ref": "6b35a3023c741096", "name": "/var/lib/dpkg/info/libgmp10:amd64.md5sums", "type": "file" }, { - "bom-ref": "88a76ee2d6be1b30", + "bom-ref": "cd608075c6108fae", "name": "/var/lib/dpkg/info/libgnutls30t64:amd64.conffiles", "type": "file" }, { - "bom-ref": "549269493085520e", + "bom-ref": "eaf6a8540ce48e5c", "name": "/var/lib/dpkg/info/libgnutls30t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "7f95799717cf225b", + "bom-ref": "320d98a622ab625b", "name": "/var/lib/dpkg/info/libgomp1:amd64.md5sums", "type": "file" }, { - "bom-ref": "6b5e772ff6c5d356", + "bom-ref": "588ec544e77288bc", "name": "/var/lib/dpkg/info/libgpg-error0:amd64.md5sums", "type": "file" }, { - "bom-ref": "4a95a28afd90c267", + "bom-ref": "6ec46a452e4eaae7", "name": "/var/lib/dpkg/info/libgpm2:amd64.md5sums", "type": "file" }, { - "bom-ref": "c7c28004ed8535da", + "bom-ref": "08fc7b87a2a36516", "name": "/var/lib/dpkg/info/libgprofng0:amd64.md5sums", "type": "file" }, { - "bom-ref": "81068248c6399348", + "bom-ref": "c3b58beacb49d430", "name": "/var/lib/dpkg/info/libgraphite2-3:amd64.md5sums", "type": "file" }, { - "bom-ref": "4da17105dc5ee725", + "bom-ref": "a4d141a8c70b723d", "name": "/var/lib/dpkg/info/libgsm1:amd64.md5sums", "type": "file" }, { - "bom-ref": "e1de1a091f73bddc", + "bom-ref": "490db9f098bb9c9c", "name": "/var/lib/dpkg/info/libgssapi-krb5-2:amd64.md5sums", "type": "file" }, { - "bom-ref": "115cbd359a060116", + "bom-ref": "d4697ad1e7c56503", + "name": "/var/lib/dpkg/info/libgstreamer1.0-0:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "b5b207a06a2d41ee", "name": "/var/lib/dpkg/info/libharfbuzz0b:amd64.md5sums", "type": "file" }, { - "bom-ref": "1f3b4576eca389be", + "bom-ref": "8c81c2ea4effe55c", "name": "/var/lib/dpkg/info/libhogweed6t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "765c4af921de772c", + "bom-ref": "c788d27b5ad36290", "name": "/var/lib/dpkg/info/libhwasan0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e3ed36e4a9f085ef", + "bom-ref": "f7460be65fdb9c28", + "name": "/var/lib/dpkg/info/libhwloc15:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "8e891c7767dbea87", "name": "/var/lib/dpkg/info/libhwy1t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "b62d04cdfbb9d554", + "bom-ref": "5640301dfe0bba90", "name": "/var/lib/dpkg/info/libibmad5:amd64.md5sums", "type": "file" }, { - "bom-ref": "5226bf73300c1000", + "bom-ref": "bfff28ba5826edd4", "name": "/var/lib/dpkg/info/libibumad3:amd64.md5sums", "type": "file" }, { - "bom-ref": "10dcd9f8b8d3e79e", + "bom-ref": "2adc979d00d55c06", "name": "/var/lib/dpkg/info/libibverbs1:amd64.md5sums", "type": "file" }, { - "bom-ref": "373e04c9888be918", + "bom-ref": "2481cd7eb6634a68", "name": "/var/lib/dpkg/info/libice6:amd64.md5sums", "type": "file" }, { - "bom-ref": "75488f63e7e2aad4", + "bom-ref": "ee645b7ef7140f3c", "name": "/var/lib/dpkg/info/libicu74:amd64.md5sums", "type": "file" }, { - "bom-ref": "a0c1faddc7268016", + "bom-ref": "20adf1bf21c7f654", "name": "/var/lib/dpkg/info/libidn2-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "c95fb73b8fb5bd7b", + "bom-ref": "fb65afe384370d03", "name": "/var/lib/dpkg/info/libiec61883-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "f1dd55fa760d2b89", + "bom-ref": "e6b8d20af170c8bf", "name": "/var/lib/dpkg/info/libigdgmm12:amd64.md5sums", "type": "file" }, { - "bom-ref": "8365aec2398ec679", + "bom-ref": "1624da7dbcd03fc1", + "name": "/var/lib/dpkg/info/libigsc1.list", + "type": "file" + }, + { + "bom-ref": "0e219da8854c4488", + "name": "/var/lib/dpkg/info/libigsc1.md5sums", + "type": "file" + }, + { + "bom-ref": "ee5ac1fab3a645c5", + "name": "/var/lib/dpkg/info/libigsc1.shlibs", + "type": "file" + }, + { + "bom-ref": "39ceabb022f0a6d0", + "name": "/var/lib/dpkg/info/libigsc1.triggers", + "type": "file" + }, + { + "bom-ref": "afe2331e345beb45", "name": "/var/lib/dpkg/info/libisl23:amd64.md5sums", "type": "file" }, { - "bom-ref": "e51c4adb591a6dfd", + "bom-ref": "a5735c0aed5377dd", "name": "/var/lib/dpkg/info/libitm1:amd64.md5sums", "type": "file" }, { - "bom-ref": "eb7f51f1599a69ec", + "bom-ref": "0db5d19ace64f80c", "name": "/var/lib/dpkg/info/libjack-jackd2-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "857d03dc96dcd77b", + "bom-ref": "72e48dbc436c7c1f", "name": "/var/lib/dpkg/info/libjansson4:amd64.md5sums", "type": "file" }, { - "bom-ref": "514f99f2191ca928", + "bom-ref": "7aac2ee1dbcbc1bc", "name": "/var/lib/dpkg/info/libjbig0:amd64.md5sums", "type": "file" }, { - "bom-ref": "a10e5f019361b86a", + "bom-ref": "a5231c0c45bf9e82", "name": "/var/lib/dpkg/info/libjpeg-turbo8:amd64.md5sums", "type": "file" }, { - "bom-ref": "dac6cf41e9795c5e", + "bom-ref": "6ff015a4086d539a", "name": "/var/lib/dpkg/info/libjpeg8:amd64.md5sums", "type": "file" }, { - "bom-ref": "d0157fbe1ee66826", + "bom-ref": "4640786c00af57f8", "name": "/var/lib/dpkg/info/libjson-c5:amd64.md5sums", "type": "file" }, { - "bom-ref": "026713ca9e126b55", + "bom-ref": "0133e5adf6fc70a1", "name": "/var/lib/dpkg/info/libjxl0.7:amd64.md5sums", "type": "file" }, { - "bom-ref": "58f76918be6c8773", + "bom-ref": "5ea0492f57465d93", "name": "/var/lib/dpkg/info/libk5crypto3:amd64.md5sums", "type": "file" }, { - "bom-ref": "f6aa3a56a2c9ea45", + "bom-ref": "d4b2124829dd1ced", "name": "/var/lib/dpkg/info/libkeyutils1:amd64.md5sums", "type": "file" }, { - "bom-ref": "6f1b1927ff89d28b", + "bom-ref": "c8d5eb8d4aaf87d1", "name": "/var/lib/dpkg/info/libkmod2:amd64.md5sums", "type": "file" }, { - "bom-ref": "e34b42b65bd60e7e", + "bom-ref": "911ec1c0db4011ee", "name": "/var/lib/dpkg/info/libkrb5-3:amd64.md5sums", "type": "file" }, { - "bom-ref": "734f193f3447c716", + "bom-ref": "5a37d875ce0fedae", "name": "/var/lib/dpkg/info/libkrb5support0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e86c6c4eb5788a85", + "bom-ref": "11fd660851d68d39", "name": "/var/lib/dpkg/info/liblapack3:amd64.md5sums", "type": "file" }, { - "bom-ref": "835ad326f7f961dd", + "bom-ref": "7419fd8112b8f171", "name": "/var/lib/dpkg/info/liblcms2-2:amd64.md5sums", "type": "file" }, { - "bom-ref": "eb16915bd23aeab1", + "bom-ref": "4849bd8de24d5ead", "name": "/var/lib/dpkg/info/libldap2:amd64.md5sums", "type": "file" }, { - "bom-ref": "a7d598b1192c51ee", + "bom-ref": "e3a0063f5fcf3d62", "name": "/var/lib/dpkg/info/liblerc4:amd64.md5sums", "type": "file" }, { - "bom-ref": "32695fb056398e65", + "bom-ref": "8cf4664fe2b201f5", "name": "/var/lib/dpkg/info/liblilv-0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "8744756a1b547249", + "bom-ref": "2d01e27ff2883d89", "name": "/var/lib/dpkg/info/libllvm20:amd64.md5sums", "type": "file" }, { - "bom-ref": "90f582fe68592118", + "bom-ref": "218fbf5305c72db4", "name": "/var/lib/dpkg/info/liblsan0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e76585c3574943c9", + "bom-ref": "2b63631b776805b7", "name": "/var/lib/dpkg/info/liblz4-1:amd64.md5sums", "type": "file" }, { - "bom-ref": "2705eb4165d9bdf7", + "bom-ref": "15279c11c82ef301", "name": "/var/lib/dpkg/info/liblzma5:amd64.md5sums", "type": "file" }, { - "bom-ref": "761bf9e1fe0f2378", + "bom-ref": "1e3738a6cec70410", "name": "/var/lib/dpkg/info/libmbedcrypto7t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "c2301fa9e5f6cfd7", + "bom-ref": "84438ff94dc145dd", "name": "/var/lib/dpkg/info/libmd0:amd64.md5sums", "type": "file" }, { - "bom-ref": "05ee346bfa71f248", + "bom-ref": "d448df09cd8919f9", + "name": "/var/lib/dpkg/info/libmetee-dev:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "ebba1b1ebe3540fe", + "name": "/var/lib/dpkg/info/libmetee6:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "92a937e5bfbc9cf8", + "name": "/var/lib/dpkg/info/libmfx-gen1.2.list", + "type": "file" + }, + { + "bom-ref": "66c59139c4cda479", + "name": "/var/lib/dpkg/info/libmfx-gen1.2.md5sums", + "type": "file" + }, + { + "bom-ref": "8ad72b710372987f", + "name": "/var/lib/dpkg/info/libmfx-gen1.2.shlibs", + "type": "file" + }, + { + "bom-ref": "445f11acd8d7f204", + "name": "/var/lib/dpkg/info/libmfx-gen1.2.triggers", + "type": "file" + }, + { + "bom-ref": "20fa98fe12529464", "name": "/var/lib/dpkg/info/libmount1:amd64.md5sums", "type": "file" }, { - "bom-ref": "3ad95da2dbfd5d4b", + "bom-ref": "eefa50a921189bc7", "name": "/var/lib/dpkg/info/libmp3lame0:amd64.md5sums", "type": "file" }, { - "bom-ref": "967458dea2786006", + "bom-ref": "124e96d2a5528bfe", "name": "/var/lib/dpkg/info/libmpc3:amd64.md5sums", "type": "file" }, { - "bom-ref": "29c1027206ba74f3", + "bom-ref": "01c4df9ede4acedb", "name": "/var/lib/dpkg/info/libmpfr6:amd64.md5sums", "type": "file" }, { - "bom-ref": "f5480535c0a3ae83", + "bom-ref": "490eb8fa14c1678b", "name": "/var/lib/dpkg/info/libmpg123-0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "ae1cc8a11540dd67", + "bom-ref": "7f9e8b8f4001d96f", "name": "/var/lib/dpkg/info/libmysofa1:amd64.md5sums", "type": "file" }, { - "bom-ref": "7b13ee7fcbd46f82", + "bom-ref": "6be1787c6cf4e5fc", "name": "/var/lib/dpkg/info/libncursesw6:amd64.md5sums", "type": "file" }, { - "bom-ref": "f88e022728662171", + "bom-ref": "1daa7961fbf89c5b", "name": "/var/lib/dpkg/info/libnettle8t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "5651b7fdf543fdb1", + "bom-ref": "8013a5b835f4ec7d", "name": "/var/lib/dpkg/info/libnghttp2-14:amd64.md5sums", "type": "file" }, { - "bom-ref": "1b70e1958fb50c97", + "bom-ref": "a87f6d9bf0dd89c3", "name": "/var/lib/dpkg/info/libnl-3-200:amd64.conffiles", "type": "file" }, { - "bom-ref": "60e5fab1ce17b3d5", + "bom-ref": "bc8f2b859ccb2711", "name": "/var/lib/dpkg/info/libnl-3-200:amd64.md5sums", "type": "file" }, { - "bom-ref": "1e36b0b868217399", + "bom-ref": "fed2298b74a4d205", "name": "/var/lib/dpkg/info/libnl-route-3-200:amd64.md5sums", "type": "file" }, { - "bom-ref": "3e4d7716a7a96642", + "bom-ref": "1f7d6db532d65bfe", "name": "/var/lib/dpkg/info/libnorm1t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "34e1f7a730979040", + "bom-ref": "1dc71080cb8bc5e2", "name": "/var/lib/dpkg/info/libnpth0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "e38ae6fc1c06a11e", + "bom-ref": "79f233b95591c4c2", "name": "/var/lib/dpkg/info/libnuma1:amd64.md5sums", "type": "file" }, { - "bom-ref": "a2e5f75b532ee445", + "bom-ref": "42b0380d5a7556a1", "name": "/var/lib/dpkg/info/libogg0:amd64.md5sums", "type": "file" }, { - "bom-ref": "a19fa3dbdd2edbb1", + "bom-ref": "1b7f7d3b229a9e49", "name": "/var/lib/dpkg/info/libopenal-data.conffiles", "type": "file" }, { - "bom-ref": "42f4f7f624fc80fe", + "bom-ref": "4802f9ac75ecc2f2", "name": "/var/lib/dpkg/info/libopenal-data.list", "type": "file" }, { - "bom-ref": "e9ecbdbb447aa538", + "bom-ref": "0282965a75900f8c", "name": "/var/lib/dpkg/info/libopenal-data.md5sums", "type": "file" }, { - "bom-ref": "61d3487287d1314d", + "bom-ref": "32c8a3e29eac856d", "name": "/var/lib/dpkg/info/libopenal1:amd64.md5sums", "type": "file" }, { - "bom-ref": "e4056ffbc1f6d578", + "bom-ref": "c95a4da64d072094", "name": "/var/lib/dpkg/info/libopenjp2-7:amd64.md5sums", "type": "file" }, { - "bom-ref": "b92d82fa9d59a141", + "bom-ref": "dd46bea11e01c2d9", "name": "/var/lib/dpkg/info/libopenmpt0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "b382c3e6d8e819b3", + "bom-ref": "4031b4f03f34cd4f", "name": "/var/lib/dpkg/info/libopus0:amd64.md5sums", "type": "file" }, { - "bom-ref": "490eb336370887dc", + "bom-ref": "cd516d33a153011a", "name": "/var/lib/dpkg/info/libp11-kit0:amd64.md5sums", "type": "file" }, { - "bom-ref": "13d545f620b9ffa4", + "bom-ref": "73a9f8a2e996eb2c", + "name": "/var/lib/dpkg/info/libpackagekit-glib2-18:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "9c5df69397d304ba", "name": "/var/lib/dpkg/info/libpam-modules-bin.list", "type": "file" }, { - "bom-ref": "96c73078d9c89b96", + "bom-ref": "a057ffc866b0ca68", "name": "/var/lib/dpkg/info/libpam-modules-bin.md5sums", "type": "file" }, { - "bom-ref": "7f968128faf54b23", + "bom-ref": "bb4b45e8bea0a041", "name": "/var/lib/dpkg/info/libpam-modules-bin.postinst", "type": "file" }, { - "bom-ref": "0e7c30ee2d5c8776", + "bom-ref": "7f2059d041a006e4", "name": "/var/lib/dpkg/info/libpam-modules-bin.postrm", "type": "file" }, { - "bom-ref": "96ca381df51263a4", + "bom-ref": "477c03c9f412d05a", "name": "/var/lib/dpkg/info/libpam-modules-bin.prerm", "type": "file" }, { - "bom-ref": "1a2ece60b049b3ee", + "bom-ref": "2a394519269ec708", "name": "/var/lib/dpkg/info/libpam-modules:amd64.conffiles", "type": "file" }, { - "bom-ref": "653806b5fb6bef2c", + "bom-ref": "3a633f30b9c5bbe6", "name": "/var/lib/dpkg/info/libpam-modules:amd64.md5sums", "type": "file" }, { - "bom-ref": "830e09f77d646cfa", + "bom-ref": "1eb575e75e533cc0", "name": "/var/lib/dpkg/info/libpam-runtime.conffiles", "type": "file" }, { - "bom-ref": "f0566e9fa56c498f", + "bom-ref": "884b6b0344c7b785", "name": "/var/lib/dpkg/info/libpam-runtime.list", "type": "file" }, { - "bom-ref": "36e18a75e8462216", + "bom-ref": "54f26121451cd7bc", "name": "/var/lib/dpkg/info/libpam-runtime.md5sums", "type": "file" }, { - "bom-ref": "94c60c2614280af0", + "bom-ref": "e7585340b1037d9a", "name": "/var/lib/dpkg/info/libpam-runtime.postinst", "type": "file" }, { - "bom-ref": "86707f302dc20285", + "bom-ref": "04a26b79cf41be13", "name": "/var/lib/dpkg/info/libpam-runtime.postrm", "type": "file" }, { - "bom-ref": "b328151b03b788f1", + "bom-ref": "8f61603207922a0b", "name": "/var/lib/dpkg/info/libpam-runtime.prerm", "type": "file" }, { - "bom-ref": "639193cceaf9e571", + "bom-ref": "23a7fd2e526ef9f7", "name": "/var/lib/dpkg/info/libpam-runtime.templates", "type": "file" }, { - "bom-ref": "41f4789d95bf7af0", + "bom-ref": "7b76f91ba79f5db6", + "name": "/var/lib/dpkg/info/libpam-systemd:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "7a472678d693dd86", "name": "/var/lib/dpkg/info/libpam0g:amd64.md5sums", "type": "file" }, { - "bom-ref": "58bd88dd23b11597", + "bom-ref": "e723fbafa9a60ad3", "name": "/var/lib/dpkg/info/libpango-1.0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "b55c46aa7b23ff27", + "bom-ref": "95791df3dcd71423", "name": "/var/lib/dpkg/info/libpangocairo-1.0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "b4252d6817067df9", + "bom-ref": "f67bbe1513398b81", "name": "/var/lib/dpkg/info/libpangoft2-1.0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e07cbf3202880e1d", + "bom-ref": "12048ca2b7cefe59", "name": "/var/lib/dpkg/info/libpciaccess0:amd64.md5sums", "type": "file" }, { - "bom-ref": "d105280e6a337b04", + "bom-ref": "9dfb975c8e4354c6", "name": "/var/lib/dpkg/info/libpcre2-8-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "2d692fe0076a0e4e", + "bom-ref": "1e3d38c838d2aeb2", "name": "/var/lib/dpkg/info/libperl5.38t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "3ba4849e2274a9f8", + "bom-ref": "c8e98c637771e758", "name": "/var/lib/dpkg/info/libpgm-5.3-0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "da9d7ac1b7f9c2da", + "bom-ref": "368baf2a9d27b6b2", "name": "/var/lib/dpkg/info/libpixman-1-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e677fe9c34b3e5f5", + "bom-ref": "1cdb630de9e28db9", "name": "/var/lib/dpkg/info/libplacebo338:amd64.md5sums", "type": "file" }, { - "bom-ref": "22eea96e5a7cb490", + "bom-ref": "ccf056f771598f08", "name": "/var/lib/dpkg/info/libpng16-16t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "d9e91a14d68a9489", + "bom-ref": "eb4c07dea9f03405", "name": "/var/lib/dpkg/info/libpocketsphinx3:amd64.md5sums", "type": "file" }, { - "bom-ref": "0b4a874ebb1bc96a", + "bom-ref": "504197549f420b18", + "name": "/var/lib/dpkg/info/libpolkit-agent-1-0:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "6bbf5c6cb28421ac", + "name": "/var/lib/dpkg/info/libpolkit-gobject-1-0:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "6018bd079362139e", "name": "/var/lib/dpkg/info/libpostproc57:amd64.md5sums", "type": "file" }, { - "bom-ref": "8ac6cd37c022364e", + "bom-ref": "df43fe716e13fa00", "name": "/var/lib/dpkg/info/libproc2-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "07d5b90dd57af283", + "bom-ref": "a6ff5a8e246cd78f", "name": "/var/lib/dpkg/info/libpsl5t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "028542fa6abab91c", + "bom-ref": "e2ab9326935c01dc", "name": "/var/lib/dpkg/info/libpulse0:amd64.conffiles", "type": "file" }, { - "bom-ref": "aaabfaecf6fab98f", + "bom-ref": "68e8c3fa345c8787", "name": "/var/lib/dpkg/info/libpulse0:amd64.md5sums", "type": "file" }, { - "bom-ref": "00ae93ac955e9192", + "bom-ref": "126d7b0cfb6ee056", "name": "/var/lib/dpkg/info/libpython3-stdlib:amd64.md5sums", "type": "file" }, { - "bom-ref": "cabc2481dd7fed3c", + "bom-ref": "c541b172ee794bac", "name": "/var/lib/dpkg/info/libpython3.12-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "450937faa14f9843", + "bom-ref": "0c175846e662477b", "name": "/var/lib/dpkg/info/libpython3.12-minimal:amd64.conffiles", "type": "file" }, { - "bom-ref": "6609d27aec6d932e", + "bom-ref": "06c6c6cd8dbcd8d2", "name": "/var/lib/dpkg/info/libpython3.12-minimal:amd64.md5sums", "type": "file" }, { - "bom-ref": "37d303b436fdaca4", + "bom-ref": "a1bcac7ed50da4d8", "name": "/var/lib/dpkg/info/libpython3.12-stdlib:amd64.md5sums", "type": "file" }, { - "bom-ref": "afa0bb115d6b0b29", + "bom-ref": "b3ad59a5ddcc4955", "name": "/var/lib/dpkg/info/libpython3.12t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "5efec0bd2cc82243", + "bom-ref": "2f514bbc2d76db27", "name": "/var/lib/dpkg/info/libquadmath0:amd64.md5sums", "type": "file" }, { - "bom-ref": "623bb756c3d46bc5", + "bom-ref": "c0b40203b4b84e2d", "name": "/var/lib/dpkg/info/librabbitmq4:amd64.md5sums", "type": "file" }, { - "bom-ref": "9a4c6f1b7b72549f", + "bom-ref": "3f03868313afcf6f", "name": "/var/lib/dpkg/info/librav1e0:amd64.md5sums", "type": "file" }, { - "bom-ref": "de01040cb60cad45", + "bom-ref": "8453d36f0b66fbcd", "name": "/var/lib/dpkg/info/libraw1394-11:amd64.md5sums", "type": "file" }, { - "bom-ref": "8a4eaee61cc62ab7", + "bom-ref": "d277e29fcb9f2ec3", "name": "/var/lib/dpkg/info/librdmacm1t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "953a02f67ae6afb7", + "bom-ref": "f22b877fd615553b", "name": "/var/lib/dpkg/info/libreadline8t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "3053b9bfdb43ae21", + "bom-ref": "0c667c9ae6cf7725", "name": "/var/lib/dpkg/info/librist4:amd64.md5sums", "type": "file" }, { - "bom-ref": "5dcbea0f404b79fb", + "bom-ref": "3362901451e4fc03", "name": "/var/lib/dpkg/info/librsvg2-2:amd64.md5sums", "type": "file" }, { - "bom-ref": "d0c3a968a4caed83", + "bom-ref": "2dcf482829ad2ce3", "name": "/var/lib/dpkg/info/librtmp1:amd64.md5sums", "type": "file" }, { - "bom-ref": "36ce278d2e7988bf", + "bom-ref": "a38e00224e7f6b0b", "name": "/var/lib/dpkg/info/librubberband2:amd64.md5sums", "type": "file" }, { - "bom-ref": "4d82f67f3442f54b", + "bom-ref": "8d4cbd16d1a0af8f", "name": "/var/lib/dpkg/info/libsamplerate0:amd64.md5sums", "type": "file" }, { - "bom-ref": "677b3ae77d57a6e5", + "bom-ref": "3aa0cd03f123cb21", "name": "/var/lib/dpkg/info/libsasl2-2:amd64.md5sums", "type": "file" }, { - "bom-ref": "0ff86225fada2c13", + "bom-ref": "c4f05ca9c21a05b7", "name": "/var/lib/dpkg/info/libsasl2-modules-db:amd64.md5sums", "type": "file" }, { - "bom-ref": "a40da21d6435d5f9", + "bom-ref": "1cbe60e2b5b5a89d", "name": "/var/lib/dpkg/info/libsdl2-2.0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "18b03371b390d281", + "bom-ref": "2fdeaa5037e9cf7b", "name": "/var/lib/dpkg/info/libseccomp2:amd64.md5sums", "type": "file" }, { - "bom-ref": "a30ee8e063a818bd", + "bom-ref": "cce829c5f436d09f", "name": "/var/lib/dpkg/info/libselinux1:amd64.md5sums", "type": "file" }, { - "bom-ref": "f0cacad27b2426a8", + "bom-ref": "7427cc49b2ed4da6", "name": "/var/lib/dpkg/info/libsemanage-common.conffiles", "type": "file" }, { - "bom-ref": "bd2727b68ba31786", + "bom-ref": "1fa49a854489ba40", "name": "/var/lib/dpkg/info/libsemanage-common.list", "type": "file" }, { - "bom-ref": "72bc47bd3576e05f", + "bom-ref": "19de93d1934c59a5", "name": "/var/lib/dpkg/info/libsemanage-common.md5sums", "type": "file" }, { - "bom-ref": "fc117b3a424195b5", + "bom-ref": "d61bc84950a0cd17", "name": "/var/lib/dpkg/info/libsemanage2:amd64.md5sums", "type": "file" }, { - "bom-ref": "1b1c81dfc2946f13", + "bom-ref": "90fffa47c3b2ee03", "name": "/var/lib/dpkg/info/libsensors-config.conffiles", "type": "file" }, { - "bom-ref": "2debe26eeca714e4", + "bom-ref": "6664434910396b78", "name": "/var/lib/dpkg/info/libsensors-config.list", "type": "file" }, { - "bom-ref": "802e68b1b54aee88", + "bom-ref": "b582a1f7f300b8a0", "name": "/var/lib/dpkg/info/libsensors-config.md5sums", "type": "file" }, { - "bom-ref": "a778463ad7b1d0ee", + "bom-ref": "e3f8c34ca4e087be", "name": "/var/lib/dpkg/info/libsensors5:amd64.md5sums", "type": "file" }, { - "bom-ref": "adf1b642e0e0caad", + "bom-ref": "8019131f4800a3df", "name": "/var/lib/dpkg/info/libsepol2:amd64.md5sums", "type": "file" }, { - "bom-ref": "f78ba87baaeb19ed", + "bom-ref": "51daaf0ad09ac405", "name": "/var/lib/dpkg/info/libserd-0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "f3c35765f3f2b7ac", + "bom-ref": "30b7e8ec2ab4c5b4", "name": "/var/lib/dpkg/info/libsframe1:amd64.md5sums", "type": "file" }, { - "bom-ref": "ef575f75d8fa624a", + "bom-ref": "6c73ce28f0e991de", "name": "/var/lib/dpkg/info/libsharpyuv0:amd64.md5sums", "type": "file" }, { - "bom-ref": "f7f679ed5ba45416", + "bom-ref": "d166a3d52170799a", "name": "/var/lib/dpkg/info/libshine3:amd64.md5sums", "type": "file" }, { - "bom-ref": "c03f8f58e992bbaa", + "bom-ref": "9527bb148bd5fd2a", "name": "/var/lib/dpkg/info/libslang2:amd64.md5sums", "type": "file" }, { - "bom-ref": "e2a840364dc31681", + "bom-ref": "d6d022e6bb984451", "name": "/var/lib/dpkg/info/libsm6:amd64.md5sums", "type": "file" }, { - "bom-ref": "c5e9e7c92fa68e8a", + "bom-ref": "e2ae86b71fca7f9e", "name": "/var/lib/dpkg/info/libsmartcols1:amd64.md5sums", "type": "file" }, { - "bom-ref": "dd15575d687d9bb6", + "bom-ref": "e4aee6347d4b1ef2", "name": "/var/lib/dpkg/info/libsnappy1v5:amd64.md5sums", "type": "file" }, { - "bom-ref": "0939dcebe6d1075d", + "bom-ref": "d505cc546ab21da9", "name": "/var/lib/dpkg/info/libsndfile1:amd64.md5sums", "type": "file" }, { - "bom-ref": "3a5a1aee5adefd53", + "bom-ref": "7bc8e72c5e0f6287", "name": "/var/lib/dpkg/info/libsndio7.0:amd64.md5sums", "type": "file" }, { - "bom-ref": "cc2896f8bee745a1", + "bom-ref": "2e45146e777b51a1", "name": "/var/lib/dpkg/info/libsodium23:amd64.md5sums", "type": "file" }, { - "bom-ref": "aaa09f3520a6d593", + "bom-ref": "a6ede0c7c389d2b7", "name": "/var/lib/dpkg/info/libsord-0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "2e3fda3ef02d7f72", + "bom-ref": "4ec446fc0125b0da", "name": "/var/lib/dpkg/info/libsoxr0:amd64.md5sums", "type": "file" }, { - "bom-ref": "1e32d7d7de81b5e2", + "bom-ref": "174db3fbd035a0c2", "name": "/var/lib/dpkg/info/libspeex1:amd64.md5sums", "type": "file" }, { - "bom-ref": "f6f6298b1e2e3495", + "bom-ref": "0484bf7992c4e0a1", "name": "/var/lib/dpkg/info/libsphinxbase3t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "4cf7c19229504c16", + "bom-ref": "df8ccf467dc82b5a", "name": "/var/lib/dpkg/info/libsqlite3-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "1f430b6aef326057", + "bom-ref": "b6c917a53b956883", "name": "/var/lib/dpkg/info/libsratom-0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "d7f31eabf0a75627", + "bom-ref": "ce4a65ee0854d78b", "name": "/var/lib/dpkg/info/libsrt1.5-gnutls:amd64.md5sums", "type": "file" }, { - "bom-ref": "a17f5d1cf38194d3", + "bom-ref": "8d1204f7f6f7e769", "name": "/var/lib/dpkg/info/libss2:amd64.md5sums", "type": "file" }, { - "bom-ref": "1a218e19d4394c5a", + "bom-ref": "c13b577653d40e22", "name": "/var/lib/dpkg/info/libssh-4:amd64.md5sums", "type": "file" }, { - "bom-ref": "0a72954b547c2327", + "bom-ref": "2ca5b2811e31bf87", "name": "/var/lib/dpkg/info/libssh-gcrypt-4:amd64.md5sums", "type": "file" }, { - "bom-ref": "e394f8deab358855", + "bom-ref": "f3130a2c1fd514f9", "name": "/var/lib/dpkg/info/libssl3t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "9feaa75e204d874a", + "bom-ref": "31e0cc99d627051a", "name": "/var/lib/dpkg/info/libstdc++-13-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "8b65bd8df4238b25", + "bom-ref": "b213ae457ca206a7", "name": "/var/lib/dpkg/info/libstdc++6:amd64.md5sums", "type": "file" }, { - "bom-ref": "e627d4906b282fb3", + "bom-ref": "64d05b941b970515", + "name": "/var/lib/dpkg/info/libstemmer0d:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "f9efad04e9cb58d7", "name": "/var/lib/dpkg/info/libsvtav1enc1d1:amd64.md5sums", "type": "file" }, { - "bom-ref": "18eef528a9b07508", + "bom-ref": "89bb18ceb8a34c88", "name": "/var/lib/dpkg/info/libswresample4:amd64.md5sums", "type": "file" }, { - "bom-ref": "0d363fcb45bee33a", + "bom-ref": "da6d94bf6af386a2", "name": "/var/lib/dpkg/info/libswscale7:amd64.md5sums", "type": "file" }, { - "bom-ref": "9fa45e318b3eb608", + "bom-ref": "b8f93e30dc6dc626", "name": "/var/lib/dpkg/info/libsystemd-shared:amd64.md5sums", "type": "file" }, { - "bom-ref": "cfa5631af83a39fd", + "bom-ref": "26edbd72f026f995", "name": "/var/lib/dpkg/info/libsystemd0:amd64.md5sums", "type": "file" }, { - "bom-ref": "0dff4a18c93b452c", + "bom-ref": "198cdb9162e607c6", "name": "/var/lib/dpkg/info/libtasn1-6:amd64.md5sums", "type": "file" }, { - "bom-ref": "55c9a1d30c77a26d", + "bom-ref": "9186aa8f6d1f27b5", "name": "/var/lib/dpkg/info/libthai-data.list", "type": "file" }, { - "bom-ref": "279606036714d5ca", + "bom-ref": "18bf78bc978343fe", "name": "/var/lib/dpkg/info/libthai-data.md5sums", "type": "file" }, { - "bom-ref": "ccd080db422f4c04", + "bom-ref": "094f8b21fd39a490", "name": "/var/lib/dpkg/info/libthai0:amd64.md5sums", "type": "file" }, { - "bom-ref": "616aed2006f6602a", + "bom-ref": "9be31677c5aa437a", "name": "/var/lib/dpkg/info/libtheora0:amd64.md5sums", "type": "file" }, { - "bom-ref": "cd43302ce23fef1c", + "bom-ref": "0ffefa036c95b930", "name": "/var/lib/dpkg/info/libtiff6:amd64.md5sums", "type": "file" }, { - "bom-ref": "2c1efe10d38be0e0", + "bom-ref": "c12d65031eb79686", "name": "/var/lib/dpkg/info/libtinfo6:amd64.md5sums", "type": "file" }, { - "bom-ref": "22a9840766cedf0c", + "bom-ref": "02f694efca7c7788", "name": "/var/lib/dpkg/info/libtsan2:amd64.md5sums", "type": "file" }, { - "bom-ref": "489df8727f6c1f26", + "bom-ref": "aecf17d1b319df56", "name": "/var/lib/dpkg/info/libtwolame0:amd64.md5sums", "type": "file" }, { - "bom-ref": "43e34d339b80db60", + "bom-ref": "f224c27ff6636848", "name": "/var/lib/dpkg/info/libubsan1:amd64.md5sums", "type": "file" }, { - "bom-ref": "20b41e677f8b5668", + "bom-ref": "3ced188da3ce2a4c", "name": "/var/lib/dpkg/info/libudev1:amd64.md5sums", "type": "file" }, { - "bom-ref": "86c76ef98816e107", + "bom-ref": "6fbcc981b072ea3b", "name": "/var/lib/dpkg/info/libudfread0:amd64.md5sums", "type": "file" }, { - "bom-ref": "476effd830924a38", + "bom-ref": "2636fb9820a44f40", "name": "/var/lib/dpkg/info/libunibreak5:amd64.md5sums", "type": "file" }, { - "bom-ref": "09f937257e394f3a", + "bom-ref": "40062f71f9527aec", "name": "/var/lib/dpkg/info/libunistring5:amd64.md5sums", "type": "file" }, { - "bom-ref": "ff638a44b13898d1", + "bom-ref": "0e3daacab4273662", + "name": "/var/lib/dpkg/info/libunwind8:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "0a16deae28eadb71", "name": "/var/lib/dpkg/info/libusb-1.0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "335f95eebe1a898a", + "bom-ref": "6c9444062172fe2e", "name": "/var/lib/dpkg/info/libuuid1:amd64.md5sums", "type": "file" }, { - "bom-ref": "3bc88eff993b850c", + "bom-ref": "45ca23ab19651262", "name": "/var/lib/dpkg/info/libva-drm2:amd64.md5sums", "type": "file" }, { - "bom-ref": "b406c7b42afa59b6", + "bom-ref": "e9d6c849029833e0", "name": "/var/lib/dpkg/info/libva-x11-2:amd64.md5sums", "type": "file" }, { - "bom-ref": "979584d7be5dce4e", + "bom-ref": "aa23b478916f07b4", "name": "/var/lib/dpkg/info/libva2:amd64.md5sums", "type": "file" }, { - "bom-ref": "8fa37a617f1cbf3b", + "bom-ref": "1fb2ba8a1c184e9b", "name": "/var/lib/dpkg/info/libvdpau1:amd64.conffiles", "type": "file" }, { - "bom-ref": "d03f8ee722cfca8a", + "bom-ref": "a6e40ff00c97baca", "name": "/var/lib/dpkg/info/libvdpau1:amd64.md5sums", "type": "file" }, { - "bom-ref": "f491698935afa81a", + "bom-ref": "e6a2ad06d5eaa31e", "name": "/var/lib/dpkg/info/libvidstab1.1:amd64.md5sums", "type": "file" }, { - "bom-ref": "00abea8a5b190c5d", + "bom-ref": "a2e04dd8ab220aa1", "name": "/var/lib/dpkg/info/libvorbis0a:amd64.md5sums", "type": "file" }, { - "bom-ref": "6f61e21f7c39df99", + "bom-ref": "167ea4cc1e36ea21", "name": "/var/lib/dpkg/info/libvorbisenc2:amd64.md5sums", "type": "file" }, { - "bom-ref": "193c3d3fde6b5c0e", + "bom-ref": "33ead0e04721cd7e", "name": "/var/lib/dpkg/info/libvorbisfile3:amd64.md5sums", "type": "file" }, { - "bom-ref": "510ac42629e3854a", + "bom-ref": "6efa22c379a95156", "name": "/var/lib/dpkg/info/libvpl2.list", "type": "file" }, { - "bom-ref": "c9316f7bc72371b3", + "bom-ref": "4cf001e5a55c6f87", "name": "/var/lib/dpkg/info/libvpl2.md5sums", "type": "file" }, { - "bom-ref": "0c38a28048fddc7c", + "bom-ref": "02cd3a1c90008ec4", "name": "/var/lib/dpkg/info/libvpl2.shlibs", "type": "file" }, { - "bom-ref": "37930a301a6e03e6", + "bom-ref": "799dffc6eb672e36", "name": "/var/lib/dpkg/info/libvpl2.triggers", "type": "file" }, { - "bom-ref": "41197d9d8a36c123", + "bom-ref": "7cc46e7aef2c4e17", "name": "/var/lib/dpkg/info/libvpx9:amd64.md5sums", "type": "file" }, { - "bom-ref": "9381290268d55859", + "bom-ref": "f475e0a514ee9da5", "name": "/var/lib/dpkg/info/libvulkan1:amd64.md5sums", "type": "file" }, { - "bom-ref": "016a7a98b85aa854", + "bom-ref": "06db999a69660c00", "name": "/var/lib/dpkg/info/libwayland-client0:amd64.md5sums", "type": "file" }, { - "bom-ref": "de778473a60a0c65", + "bom-ref": "71c0089f9e43130d", "name": "/var/lib/dpkg/info/libwayland-cursor0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e9a54b413996af73", + "bom-ref": "b500eaa4bda4729b", "name": "/var/lib/dpkg/info/libwayland-egl1:amd64.md5sums", "type": "file" }, { - "bom-ref": "e1c071e1db70baf5", + "bom-ref": "cac7a4aeacc137e1", "name": "/var/lib/dpkg/info/libwebp7:amd64.md5sums", "type": "file" }, { - "bom-ref": "a17ac98fe9108ea6", + "bom-ref": "0d830ba8fb989926", "name": "/var/lib/dpkg/info/libwebpmux3:amd64.md5sums", "type": "file" }, { - "bom-ref": "b89e8fa1fa39aae6", + "bom-ref": "8d24f824f3be161e", "name": "/var/lib/dpkg/info/libx11-6:amd64.md5sums", "type": "file" }, { - "bom-ref": "b0b724b0798896b3", + "bom-ref": "38b8eb78ba3b5aa3", "name": "/var/lib/dpkg/info/libx11-data.list", "type": "file" }, { - "bom-ref": "ec9e62207bf8324f", + "bom-ref": "1faec7d77d533c1f", "name": "/var/lib/dpkg/info/libx11-data.md5sums", "type": "file" }, { - "bom-ref": "2aa4b5ea19393e46", + "bom-ref": "c448949b2af00dd6", "name": "/var/lib/dpkg/info/libx11-xcb1:amd64.md5sums", "type": "file" }, { - "bom-ref": "880f3583e8944794", + "bom-ref": "9bb7fdda2a994938", "name": "/var/lib/dpkg/info/libx264-164:amd64.md5sums", "type": "file" }, { - "bom-ref": "96d845eb14c4f548", + "bom-ref": "c375ed1a82e17cfc", "name": "/var/lib/dpkg/info/libx265-199:amd64.md5sums", "type": "file" }, { - "bom-ref": "633dbe68f1eb7e30", + "bom-ref": "dc0112a36083bc24", "name": "/var/lib/dpkg/info/libxau6:amd64.md5sums", "type": "file" }, { - "bom-ref": "c4f0a4c615f5f225", + "bom-ref": "7616ca1c45829345", "name": "/var/lib/dpkg/info/libxcb-dri3-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "c8b159a4bfd4d23a", + "bom-ref": "1c48a8877bb988ce", "name": "/var/lib/dpkg/info/libxcb-glx0:amd64.md5sums", "type": "file" }, { - "bom-ref": "dc93a44a6c52e0eb", + "bom-ref": "60e054f08b373ac7", "name": "/var/lib/dpkg/info/libxcb-present0:amd64.md5sums", "type": "file" }, { - "bom-ref": "181dcf6853a0839c", + "bom-ref": "b6c9dece7b0d9760", "name": "/var/lib/dpkg/info/libxcb-randr0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e7dd5a6854d6dd9b", + "bom-ref": "ffcbffad9dd29227", "name": "/var/lib/dpkg/info/libxcb-render0:amd64.md5sums", "type": "file" }, { - "bom-ref": "9c0a9de59a112b4f", + "bom-ref": "e7861c9745ec5fd7", "name": "/var/lib/dpkg/info/libxcb-shape0:amd64.md5sums", "type": "file" }, { - "bom-ref": "b5a9e8b13dde3bd8", + "bom-ref": "cc6db0ee8d627de4", "name": "/var/lib/dpkg/info/libxcb-shm0:amd64.md5sums", "type": "file" }, { - "bom-ref": "5762b106abdee132", + "bom-ref": "29e3ad882aa448b6", "name": "/var/lib/dpkg/info/libxcb-sync1:amd64.md5sums", "type": "file" }, { - "bom-ref": "2b2836978ba769a4", + "bom-ref": "8adaa6971106522c", "name": "/var/lib/dpkg/info/libxcb-xfixes0:amd64.md5sums", "type": "file" }, { - "bom-ref": "633d2d0655a4b6f2", + "bom-ref": "e59e8519fbd85172", "name": "/var/lib/dpkg/info/libxcb1:amd64.md5sums", "type": "file" }, { - "bom-ref": "81274684da63df91", + "bom-ref": "93537b2ff1487f55", "name": "/var/lib/dpkg/info/libxcursor1:amd64.md5sums", "type": "file" }, { - "bom-ref": "fb0ec03d5f80e307", + "bom-ref": "6f8593b5ef7f3ca3", "name": "/var/lib/dpkg/info/libxdmcp6:amd64.md5sums", "type": "file" }, { - "bom-ref": "0f662de26617dec8", + "bom-ref": "bed889860c951080", "name": "/var/lib/dpkg/info/libxext6:amd64.md5sums", "type": "file" }, { - "bom-ref": "2b8aee6ec61b178a", + "bom-ref": "67bc6a1b83aea40a", "name": "/var/lib/dpkg/info/libxfixes3:amd64.md5sums", "type": "file" }, { - "bom-ref": "d8f9b4413aaac867", + "bom-ref": "c64f3f1df94ea483", "name": "/var/lib/dpkg/info/libxi6:amd64.md5sums", "type": "file" }, { - "bom-ref": "35bb0ee11a98951c", + "bom-ref": "dd6fda8c4aa36b70", "name": "/var/lib/dpkg/info/libxkbcommon0:amd64.md5sums", "type": "file" }, { - "bom-ref": "b132189c9fd0122b", + "bom-ref": "b37f9f453449972f", "name": "/var/lib/dpkg/info/libxml2:amd64.md5sums", "type": "file" }, { - "bom-ref": "020b1374996ef207", + "bom-ref": "c126ab9629693a9a", + "name": "/var/lib/dpkg/info/libxmlb2:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "82d5823f9aca5683", "name": "/var/lib/dpkg/info/libxrandr2:amd64.md5sums", "type": "file" }, { - "bom-ref": "3e2b9d3c3530a21b", + "bom-ref": "f29b61378feefb0b", "name": "/var/lib/dpkg/info/libxrender1:amd64.md5sums", "type": "file" }, { - "bom-ref": "535388073560228f", + "bom-ref": "9bc7f9ecc12e55af", "name": "/var/lib/dpkg/info/libxshmfence1:amd64.md5sums", "type": "file" }, { - "bom-ref": "a8b6e3b78ee0dbfb", + "bom-ref": "2082efea6e77f9bb", "name": "/var/lib/dpkg/info/libxss1:amd64.md5sums", "type": "file" }, { - "bom-ref": "45456250597544c3", + "bom-ref": "95849eebf2127a8b", "name": "/var/lib/dpkg/info/libxv1:amd64.md5sums", "type": "file" }, { - "bom-ref": "9702d0f53c65a63a", + "bom-ref": "dcc4269e750b76de", "name": "/var/lib/dpkg/info/libxvidcore4:amd64.md5sums", "type": "file" }, { - "bom-ref": "3f51ce85c0537d64", + "bom-ref": "8e364ccda7c7f6bc", "name": "/var/lib/dpkg/info/libxxf86vm1:amd64.md5sums", "type": "file" }, { - "bom-ref": "a194b599d9169514", + "bom-ref": "e258d12cf8d2044a", "name": "/var/lib/dpkg/info/libxxhash0:amd64.md5sums", "type": "file" }, { - "bom-ref": "c0ef2d5936ab8b5e", + "bom-ref": "fdbbe9ece6b5ea3c", + "name": "/var/lib/dpkg/info/libyaml-0-2:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "391df9f24340432a", + "name": "/var/lib/dpkg/info/libze-dev.list", + "type": "file" + }, + { + "bom-ref": "c78ab8f29ac45885", + "name": "/var/lib/dpkg/info/libze-dev.md5sums", + "type": "file" + }, + { + "bom-ref": "b25d95191ff43fe9", "name": "/var/lib/dpkg/info/libze-intel-gpu1.list", "type": "file" }, { - "bom-ref": "d3b0bd052c385dd2", + "bom-ref": "1001acb3506b1505", "name": "/var/lib/dpkg/info/libze-intel-gpu1.md5sums", "type": "file" }, { - "bom-ref": "487c62c3f02e0be5", + "bom-ref": "a0220639f72ee0ce", "name": "/var/lib/dpkg/info/libze-intel-gpu1.shlibs", "type": "file" }, { - "bom-ref": "cdb0a3d4656c7425", + "bom-ref": "f072a632d4787192", "name": "/var/lib/dpkg/info/libze-intel-gpu1.triggers", "type": "file" }, { - "bom-ref": "6389a627b44b5c4c", + "bom-ref": "c8eaebc0e071a5e8", + "name": "/var/lib/dpkg/info/libze1.list", + "type": "file" + }, + { + "bom-ref": "834b9442bc7cdf7d", + "name": "/var/lib/dpkg/info/libze1.md5sums", + "type": "file" + }, + { + "bom-ref": "bebd28c9334028e1", + "name": "/var/lib/dpkg/info/libze1.postinst", + "type": "file" + }, + { + "bom-ref": "10ed876524e366b9", + "name": "/var/lib/dpkg/info/libze1.postrm", + "type": "file" + }, + { + "bom-ref": "46a69e26ecd079d0", "name": "/var/lib/dpkg/info/libzimg2:amd64.md5sums", "type": "file" }, { - "bom-ref": "4f93b1983822679a", + "bom-ref": "a678383bc0f18fae", "name": "/var/lib/dpkg/info/libzix-0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "58e909c85e05aa9e", + "bom-ref": "262c36739e5ec26e", "name": "/var/lib/dpkg/info/libzmq5:amd64.md5sums", "type": "file" }, { - "bom-ref": "8a16d451e6b8319d", + "bom-ref": "50c9a5fc03f8be37", "name": "/var/lib/dpkg/info/libzstd1:amd64.md5sums", "type": "file" }, { - "bom-ref": "a7158ee5448653da", + "bom-ref": "1f92fb3df90d7c36", "name": "/var/lib/dpkg/info/libzvbi-common.list", "type": "file" }, { - "bom-ref": "3898fb802044270a", + "bom-ref": "38e45702f8b4fdb2", "name": "/var/lib/dpkg/info/libzvbi-common.md5sums", "type": "file" }, { - "bom-ref": "d2d162a3a1ef8a6c", + "bom-ref": "2bce110644a1ad40", "name": "/var/lib/dpkg/info/libzvbi0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "27c699912f31e13d", + "bom-ref": "c4d304d3bb8a0169", "name": "/var/lib/dpkg/info/linux-libc-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "babc349a8d4fc8a9", + "bom-ref": "52cd186fa299b6cb", "name": "/var/lib/dpkg/info/login.conffiles", "type": "file" }, { - "bom-ref": "26b887f6ce28a498", + "bom-ref": "bd7b740e347e3b3e", "name": "/var/lib/dpkg/info/login.list", "type": "file" }, { - "bom-ref": "d8a138d5a988549d", + "bom-ref": "8e84de1061fbb053", "name": "/var/lib/dpkg/info/login.md5sums", "type": "file" }, { - "bom-ref": "25b562cb0a7f2940", + "bom-ref": "b795f5d0c57d4ff6", "name": "/var/lib/dpkg/info/login.postinst", "type": "file" }, { - "bom-ref": "71ae208b8221640d", + "bom-ref": "cb997c96fc0b64d7", "name": "/var/lib/dpkg/info/login.postrm", "type": "file" }, { - "bom-ref": "ee1f3d7f67fe37f2", + "bom-ref": "6d67dc90c75618b0", "name": "/var/lib/dpkg/info/login.preinst", "type": "file" }, { - "bom-ref": "2429b3b9a7dcf9b1", + "bom-ref": "3960e9f87a2c21e3", "name": "/var/lib/dpkg/info/login.prerm", "type": "file" }, { - "bom-ref": "ef2c127fbda2d1a0", + "bom-ref": "8b802a4c215f4132", "name": "/var/lib/dpkg/info/logsave.list", "type": "file" }, { - "bom-ref": "ca718b2e7497928f", + "bom-ref": "c6c1df6454ff1049", "name": "/var/lib/dpkg/info/logsave.md5sums", "type": "file" }, { - "bom-ref": "2c8da533433d3e59", + "bom-ref": "ccaf70ebe230ca35", "name": "/var/lib/dpkg/info/lsb-release.list", "type": "file" }, { - "bom-ref": "40a255fa1ff3c2d4", + "bom-ref": "d27612ed9534ce58", "name": "/var/lib/dpkg/info/lsb-release.md5sums", "type": "file" }, { - "bom-ref": "ff2b0e535e683dbe", + "bom-ref": "8d6d7247251695f2", "name": "/var/lib/dpkg/info/lto-disabled-list.list", "type": "file" }, { - "bom-ref": "f1ab19d6fb4d9ff0", + "bom-ref": "d7f2aaaded7cc82c", "name": "/var/lib/dpkg/info/lto-disabled-list.md5sums", "type": "file" }, { - "bom-ref": "c91f9278625d6471", + "bom-ref": "92783948f37212d1", "name": "/var/lib/dpkg/info/make.list", "type": "file" }, { - "bom-ref": "2002e565a70d8558", + "bom-ref": "07e278194d8fa7f4", "name": "/var/lib/dpkg/info/make.md5sums", "type": "file" }, { - "bom-ref": "4fe0c0095549ad07", + "bom-ref": "7493c51846e86ac9", "name": "/var/lib/dpkg/info/mawk.list", "type": "file" }, { - "bom-ref": "1bc9d1fb40dec649", + "bom-ref": "cd517642599a99eb", "name": "/var/lib/dpkg/info/mawk.md5sums", "type": "file" }, { - "bom-ref": "9fe637b6c7f13265", + "bom-ref": "485ea96968cbd103", "name": "/var/lib/dpkg/info/mawk.postinst", "type": "file" }, { - "bom-ref": "e71ef8d8294cdab1", + "bom-ref": "ee877eb33e7ab7bf", "name": "/var/lib/dpkg/info/mawk.prerm", "type": "file" }, { - "bom-ref": "e4c9c92666342c42", + "bom-ref": "b7c6e645995c140e", "name": "/var/lib/dpkg/info/media-types.conffiles", "type": "file" }, { - "bom-ref": "3378964a476b56e8", + "bom-ref": "9897c9ac4946dd24", "name": "/var/lib/dpkg/info/media-types.list", "type": "file" }, { - "bom-ref": "7330c8ac01b2e3bc", + "bom-ref": "a0d8b18242598f10", "name": "/var/lib/dpkg/info/media-types.md5sums", "type": "file" }, { - "bom-ref": "159fa4b7a5b9ddb4", + "bom-ref": "4d1b5a73cd7aa588", "name": "/var/lib/dpkg/info/mesa-libgallium:amd64.md5sums", "type": "file" }, { - "bom-ref": "f71800f4a6fa43c6", + "bom-ref": "895cd8cc91d7ddca", "name": "/var/lib/dpkg/info/mount.list", "type": "file" }, { - "bom-ref": "70c872811598df43", + "bom-ref": "2bb587c90884feb3", "name": "/var/lib/dpkg/info/mount.md5sums", "type": "file" }, { - "bom-ref": "b8798d66fb3856c6", + "bom-ref": "d37049b2b39448ac", "name": "/var/lib/dpkg/info/ncurses-base.conffiles", "type": "file" }, { - "bom-ref": "4b2f26c24b12df5d", + "bom-ref": "47d16f2f89671373", "name": "/var/lib/dpkg/info/ncurses-base.list", "type": "file" }, { - "bom-ref": "a0f906792330540d", + "bom-ref": "c96bd4e9e4fcf0b7", "name": "/var/lib/dpkg/info/ncurses-base.md5sums", "type": "file" }, { - "bom-ref": "5c46065a6ee7f95a", + "bom-ref": "1beb9a2d61780254", "name": "/var/lib/dpkg/info/ncurses-bin.list", "type": "file" }, { - "bom-ref": "1d288bbdb94130c5", + "bom-ref": "c2fb19e64268950f", "name": "/var/lib/dpkg/info/ncurses-bin.md5sums", "type": "file" }, { - "bom-ref": "325e77ffc173d597", + "bom-ref": "6180f0a891aa57e3", "name": "/var/lib/dpkg/info/netbase.conffiles", "type": "file" }, { - "bom-ref": "2851c24ba2399302", + "bom-ref": "c44242fca334fee6", "name": "/var/lib/dpkg/info/netbase.list", "type": "file" }, { - "bom-ref": "9323439ee5328ad9", + "bom-ref": "03757e9b4bb6fad9", "name": "/var/lib/dpkg/info/netbase.md5sums", "type": "file" }, { - "bom-ref": "49d664d6f746d3e6", + "bom-ref": "85ebc799f77d20fa", "name": "/var/lib/dpkg/info/netbase.postinst", "type": "file" }, { - "bom-ref": "9ec4c6a8d01fa688", + "bom-ref": "1e125a386f22e7cc", "name": "/var/lib/dpkg/info/netbase.postrm", "type": "file" }, { - "bom-ref": "7e1ba499f2c69727", + "bom-ref": "c1baa2664d6a3517", "name": "/var/lib/dpkg/info/numactl.list", "type": "file" }, { - "bom-ref": "6b701f62a2ba3d33", + "bom-ref": "6c0d90318de99767", "name": "/var/lib/dpkg/info/numactl.md5sums", "type": "file" }, { - "bom-ref": "adc147f75293afd2", + "bom-ref": "571d787c4f8a663e", "name": "/var/lib/dpkg/info/ocl-icd-libopencl1:amd64.md5sums", "type": "file" }, { - "bom-ref": "edd79ec38f209121", + "bom-ref": "5fe70c3e7d688229", "name": "/var/lib/dpkg/info/openssl.conffiles", "type": "file" }, { - "bom-ref": "fdc7ef51fdb77aca", + "bom-ref": "78500960f618af46", "name": "/var/lib/dpkg/info/openssl.list", "type": "file" }, { - "bom-ref": "8194cfbb116f179a", + "bom-ref": "42b34ae36863ae56", "name": "/var/lib/dpkg/info/openssl.md5sums", "type": "file" }, { - "bom-ref": "28640f0bac6589ae", + "bom-ref": "d5917eab045e95aa", "name": "/var/lib/dpkg/info/openssl.postinst", "type": "file" }, { - "bom-ref": "08f3f0c1e4ca82b4", + "bom-ref": "460941932a96dce3", + "name": "/var/lib/dpkg/info/packagekit.conffiles", + "type": "file" + }, + { + "bom-ref": "96b0927856975804", + "name": "/var/lib/dpkg/info/packagekit.list", + "type": "file" + }, + { + "bom-ref": "ae034172ee5b049b", + "name": "/var/lib/dpkg/info/packagekit.md5sums", + "type": "file" + }, + { + "bom-ref": "f3bc177d3e4c6cc3", + "name": "/var/lib/dpkg/info/packagekit.postinst", + "type": "file" + }, + { + "bom-ref": "f6e63a779ffed25e", + "name": "/var/lib/dpkg/info/packagekit.postrm", + "type": "file" + }, + { + "bom-ref": "e8ffb5cab8b555ce", "name": "/var/lib/dpkg/info/passwd.conffiles", "type": "file" }, { - "bom-ref": "ebd42af579e3a1ff", + "bom-ref": "41220f2cce8826f1", "name": "/var/lib/dpkg/info/passwd.list", "type": "file" }, { - "bom-ref": "d9720ec3ba360f23", + "bom-ref": "a3919067672964b9", "name": "/var/lib/dpkg/info/passwd.md5sums", "type": "file" }, { - "bom-ref": "c336a70361ce91d1", + "bom-ref": "ebbfcd59ad539ebf", "name": "/var/lib/dpkg/info/passwd.postinst", "type": "file" }, { - "bom-ref": "4df55bcaf99e4998", + "bom-ref": "959edca9eed1db26", "name": "/var/lib/dpkg/info/passwd.postrm", "type": "file" }, { - "bom-ref": "d5cb4cdf8c9c2445", + "bom-ref": "cc8279fbf3f0a567", "name": "/var/lib/dpkg/info/passwd.preinst", "type": "file" }, { - "bom-ref": "50931b4f5fabf124", + "bom-ref": "5701408f0d58622e", "name": "/var/lib/dpkg/info/passwd.prerm", "type": "file" }, { - "bom-ref": "cbacfb57c04782c7", + "bom-ref": "14880163ce3dda17", "name": "/var/lib/dpkg/info/patch.list", "type": "file" }, { - "bom-ref": "eb419b35368379d3", + "bom-ref": "08686cbf0a05a7b7", "name": "/var/lib/dpkg/info/patch.md5sums", "type": "file" }, { - "bom-ref": "a0580bb5281e56e2", + "bom-ref": "cf1c25d7536f9b1c", "name": "/var/lib/dpkg/info/perl-base.list", "type": "file" }, { - "bom-ref": "ffaa172a1ee8313b", + "bom-ref": "2ca7aecd011c247d", "name": "/var/lib/dpkg/info/perl-base.md5sums", "type": "file" }, { - "bom-ref": "a40873cddbf7ec4f", + "bom-ref": "05b8f81524f55a11", "name": "/var/lib/dpkg/info/perl-base.postinst", "type": "file" }, { - "bom-ref": "8158eba4ea15a1e1", + "bom-ref": "3897c5f4440adf83", "name": "/var/lib/dpkg/info/perl-base.postrm", "type": "file" }, { - "bom-ref": "8dce75e59d7a9f37", + "bom-ref": "ed1bb1d8c38542f5", "name": "/var/lib/dpkg/info/perl-base.preinst", "type": "file" }, { - "bom-ref": "b115f6af5350e002", + "bom-ref": "c85be269d7839324", "name": "/var/lib/dpkg/info/perl-base.prerm", "type": "file" }, { - "bom-ref": "12dce58de7118d94", + "bom-ref": "746a0a2f4f7f3ccc", "name": "/var/lib/dpkg/info/perl-modules-5.38.list", "type": "file" }, { - "bom-ref": "0d16e53152be7ce5", + "bom-ref": "f1ad8c28d225bbe5", "name": "/var/lib/dpkg/info/perl-modules-5.38.md5sums", "type": "file" }, { - "bom-ref": "40f748f8ded19491", + "bom-ref": "97670538a615322d", "name": "/var/lib/dpkg/info/perl.conffiles", "type": "file" }, { - "bom-ref": "6654095596db2d0f", + "bom-ref": "30ee36df48adf673", "name": "/var/lib/dpkg/info/perl.list", "type": "file" }, { - "bom-ref": "5a714697c7c84d93", + "bom-ref": "7533c07ec4f5f513", "name": "/var/lib/dpkg/info/perl.md5sums", "type": "file" }, { - "bom-ref": "864dc9164d4000af", + "bom-ref": "753efa9419576e63", "name": "/var/lib/dpkg/info/perl.postinst", "type": "file" }, { - "bom-ref": "8caf9d12dc774427", + "bom-ref": "825021239e1e7f97", "name": "/var/lib/dpkg/info/perl.postrm", "type": "file" }, { - "bom-ref": "a936a8878bd6ed71", + "bom-ref": "9c4c79bf671d18a9", "name": "/var/lib/dpkg/info/perl.preinst", "type": "file" }, { - "bom-ref": "e9e599aa64bbff44", + "bom-ref": "228c9b702653ddb4", "name": "/var/lib/dpkg/info/perl.prerm", "type": "file" }, { - "bom-ref": "043d3ba2ee46e716", + "bom-ref": "9742f1a7200ed13f", + "name": "/var/lib/dpkg/info/polkitd.list", + "type": "file" + }, + { + "bom-ref": "5c194a8935082b98", + "name": "/var/lib/dpkg/info/polkitd.md5sums", + "type": "file" + }, + { + "bom-ref": "8a3c6dd05511a3f1", + "name": "/var/lib/dpkg/info/polkitd.postinst", + "type": "file" + }, + { + "bom-ref": "1d34f6155c2f4eda", + "name": "/var/lib/dpkg/info/polkitd.postrm", + "type": "file" + }, + { + "bom-ref": "31812f7f05940325", + "name": "/var/lib/dpkg/info/polkitd.preinst", + "type": "file" + }, + { + "bom-ref": "b47d541118ffa25e", + "name": "/var/lib/dpkg/info/polkitd.prerm", + "type": "file" + }, + { + "bom-ref": "c8e3ceaf34cd8ab0", "name": "/var/lib/dpkg/info/procps.conffiles", "type": "file" }, { - "bom-ref": "7af00981faeabb65", + "bom-ref": "f24344f05f22e9f7", "name": "/var/lib/dpkg/info/procps.list", "type": "file" }, { - "bom-ref": "d58403d269127a0a", + "bom-ref": "f3aa756d207f8820", "name": "/var/lib/dpkg/info/procps.md5sums", "type": "file" }, { - "bom-ref": "24759d0d4e53d447", + "bom-ref": "6b721a05472d22a9", "name": "/var/lib/dpkg/info/procps.postinst", "type": "file" }, { - "bom-ref": "2fd6a03c5492c7de", + "bom-ref": "320aa65c3c1be82c", "name": "/var/lib/dpkg/info/procps.postrm", "type": "file" }, { - "bom-ref": "eca99ae95b5075d3", + "bom-ref": "a611ccf26f43f945", "name": "/var/lib/dpkg/info/procps.preinst", "type": "file" }, { - "bom-ref": "e254baf71984d692", + "bom-ref": "3179838c24d1a8ac", "name": "/var/lib/dpkg/info/procps.prerm", "type": "file" }, { - "bom-ref": "d5232afaa47d37ea", + "bom-ref": "984d96b28b6e0bcf", + "name": "/var/lib/dpkg/info/python-apt-common.list", + "type": "file" + }, + { + "bom-ref": "802ee56b16519312", + "name": "/var/lib/dpkg/info/python-apt-common.md5sums", + "type": "file" + }, + { + "bom-ref": "6b6faf9249645e65", + "name": "/var/lib/dpkg/info/python3-apt.list", + "type": "file" + }, + { + "bom-ref": "bce99a548082d1c1", + "name": "/var/lib/dpkg/info/python3-apt.md5sums", + "type": "file" + }, + { + "bom-ref": "582f44708f0608e2", + "name": "/var/lib/dpkg/info/python3-apt.postinst", + "type": "file" + }, + { + "bom-ref": "5d4bedf471e06d7a", + "name": "/var/lib/dpkg/info/python3-apt.prerm", + "type": "file" + }, + { + "bom-ref": "c385053a9cecb4ee", + "name": "/var/lib/dpkg/info/python3-blinker.list", + "type": "file" + }, + { + "bom-ref": "c0c66c894918c8d9", + "name": "/var/lib/dpkg/info/python3-blinker.md5sums", + "type": "file" + }, + { + "bom-ref": "9c00157311bc8822", + "name": "/var/lib/dpkg/info/python3-blinker.postinst", + "type": "file" + }, + { + "bom-ref": "57cc440c2bf61213", + "name": "/var/lib/dpkg/info/python3-blinker.prerm", + "type": "file" + }, + { + "bom-ref": "c82304b89526077e", + "name": "/var/lib/dpkg/info/python3-cffi-backend:amd64.md5sums", + "type": "file" + }, + { + "bom-ref": "67aab94020db9b48", + "name": "/var/lib/dpkg/info/python3-cryptography.list", + "type": "file" + }, + { + "bom-ref": "b92a43c49c65192e", + "name": "/var/lib/dpkg/info/python3-cryptography.md5sums", + "type": "file" + }, + { + "bom-ref": "b3bbaf2a1e79d65e", + "name": "/var/lib/dpkg/info/python3-cryptography.postinst", + "type": "file" + }, + { + "bom-ref": "88e28ae30b7e5244", + "name": "/var/lib/dpkg/info/python3-cryptography.prerm", + "type": "file" + }, + { + "bom-ref": "f0888d1c104f5aa3", + "name": "/var/lib/dpkg/info/python3-dbus.list", + "type": "file" + }, + { + "bom-ref": "35287d86bfca2c9a", + "name": "/var/lib/dpkg/info/python3-dbus.md5sums", + "type": "file" + }, + { + "bom-ref": "ca1bfe3dbfff8c70", + "name": "/var/lib/dpkg/info/python3-dbus.postinst", + "type": "file" + }, + { + "bom-ref": "abc8553bdf2ad378", + "name": "/var/lib/dpkg/info/python3-dbus.prerm", + "type": "file" + }, + { + "bom-ref": "f2f6b7e91213dd65", + "name": "/var/lib/dpkg/info/python3-distro.list", + "type": "file" + }, + { + "bom-ref": "35f2de89bdefd167", + "name": "/var/lib/dpkg/info/python3-distro.md5sums", + "type": "file" + }, + { + "bom-ref": "ca9e4fdd7e8ec373", + "name": "/var/lib/dpkg/info/python3-distro.postinst", + "type": "file" + }, + { + "bom-ref": "2918d93a4673869c", + "name": "/var/lib/dpkg/info/python3-distro.prerm", + "type": "file" + }, + { + "bom-ref": "63e6f26cd9f2b5dd", + "name": "/var/lib/dpkg/info/python3-gi.list", + "type": "file" + }, + { + "bom-ref": "8c75fdc58e889f35", + "name": "/var/lib/dpkg/info/python3-gi.md5sums", + "type": "file" + }, + { + "bom-ref": "319dcca8c22bf010", + "name": "/var/lib/dpkg/info/python3-gi.postinst", + "type": "file" + }, + { + "bom-ref": "77912ec774bb6312", + "name": "/var/lib/dpkg/info/python3-gi.prerm", + "type": "file" + }, + { + "bom-ref": "706e76bd15880dbd", + "name": "/var/lib/dpkg/info/python3-httplib2.list", + "type": "file" + }, + { + "bom-ref": "bee3fb134f2ee9b4", + "name": "/var/lib/dpkg/info/python3-httplib2.md5sums", + "type": "file" + }, + { + "bom-ref": "69057277728ceb3d", + "name": "/var/lib/dpkg/info/python3-httplib2.postinst", + "type": "file" + }, + { + "bom-ref": "4eddd5ce0ff9275c", + "name": "/var/lib/dpkg/info/python3-httplib2.prerm", + "type": "file" + }, + { + "bom-ref": "efd52f0adbf94904", + "name": "/var/lib/dpkg/info/python3-jwt.list", + "type": "file" + }, + { + "bom-ref": "27c81e7ed27c7ff2", + "name": "/var/lib/dpkg/info/python3-jwt.md5sums", + "type": "file" + }, + { + "bom-ref": "57c741e75facb5ca", + "name": "/var/lib/dpkg/info/python3-jwt.postinst", + "type": "file" + }, + { + "bom-ref": "e83c3f1453534d3c", + "name": "/var/lib/dpkg/info/python3-jwt.prerm", + "type": "file" + }, + { + "bom-ref": "9822361efe28fcc9", + "name": "/var/lib/dpkg/info/python3-launchpadlib.list", + "type": "file" + }, + { + "bom-ref": "2e042a28b7696d26", + "name": "/var/lib/dpkg/info/python3-launchpadlib.md5sums", + "type": "file" + }, + { + "bom-ref": "f98c1ab9f68198e9", + "name": "/var/lib/dpkg/info/python3-launchpadlib.postinst", + "type": "file" + }, + { + "bom-ref": "6faf728f40bcd499", + "name": "/var/lib/dpkg/info/python3-launchpadlib.postrm", + "type": "file" + }, + { + "bom-ref": "ac3cbc9e040c49cf", + "name": "/var/lib/dpkg/info/python3-launchpadlib.prerm", + "type": "file" + }, + { + "bom-ref": "6e9d54ede1ee64f5", + "name": "/var/lib/dpkg/info/python3-lazr.restfulclient.list", + "type": "file" + }, + { + "bom-ref": "c1b6cf1c1f54221e", + "name": "/var/lib/dpkg/info/python3-lazr.restfulclient.md5sums", + "type": "file" + }, + { + "bom-ref": "54c0a8ceb66af295", + "name": "/var/lib/dpkg/info/python3-lazr.restfulclient.postinst", + "type": "file" + }, + { + "bom-ref": "a59a9d6e97763748", + "name": "/var/lib/dpkg/info/python3-lazr.restfulclient.prerm", + "type": "file" + }, + { + "bom-ref": "39ab1e7fb4bac486", + "name": "/var/lib/dpkg/info/python3-lazr.uri.list", + "type": "file" + }, + { + "bom-ref": "a09e79d571f8571b", + "name": "/var/lib/dpkg/info/python3-lazr.uri.md5sums", + "type": "file" + }, + { + "bom-ref": "560da005b3bd4adc", + "name": "/var/lib/dpkg/info/python3-lazr.uri.postinst", + "type": "file" + }, + { + "bom-ref": "3169d864e83bdcf9", + "name": "/var/lib/dpkg/info/python3-lazr.uri.prerm", + "type": "file" + }, + { + "bom-ref": "77c44419f56c6ef6", "name": "/var/lib/dpkg/info/python3-minimal.list", "type": "file" }, { - "bom-ref": "f94b78a13b0c948d", + "bom-ref": "be72c5eec2710765", "name": "/var/lib/dpkg/info/python3-minimal.md5sums", "type": "file" }, { - "bom-ref": "5a6f024fd8977279", + "bom-ref": "b19d6c539c42a40d", "name": "/var/lib/dpkg/info/python3-minimal.postinst", "type": "file" }, { - "bom-ref": "becb3f56ae326a41", + "bom-ref": "25bdf249ee7e5efd", "name": "/var/lib/dpkg/info/python3-minimal.prerm", "type": "file" }, { - "bom-ref": "f3de1e932b242791", + "bom-ref": "c25c6e090bcdb8f4", + "name": "/var/lib/dpkg/info/python3-oauthlib.list", + "type": "file" + }, + { + "bom-ref": "ffcbb508ba047b65", + "name": "/var/lib/dpkg/info/python3-oauthlib.md5sums", + "type": "file" + }, + { + "bom-ref": "85e057a48e92ff27", + "name": "/var/lib/dpkg/info/python3-oauthlib.postinst", + "type": "file" + }, + { + "bom-ref": "80bfea3caf38c8f9", + "name": "/var/lib/dpkg/info/python3-oauthlib.prerm", + "type": "file" + }, + { + "bom-ref": "bd3f53fd38a55111", "name": "/var/lib/dpkg/info/python3-pip.list", "type": "file" }, { - "bom-ref": "828266420c0a0c0b", + "bom-ref": "a16fa0572e542de7", "name": "/var/lib/dpkg/info/python3-pip.md5sums", "type": "file" }, { - "bom-ref": "d705b71bae4e5600", + "bom-ref": "46ae2e0a3f246f44", "name": "/var/lib/dpkg/info/python3-pip.postinst", "type": "file" }, { - "bom-ref": "7e9d42c1781551a7", + "bom-ref": "f516210a8efda6cf", "name": "/var/lib/dpkg/info/python3-pip.prerm", "type": "file" }, { - "bom-ref": "966f173aaf47418d", + "bom-ref": "2610c828ce8d9e09", "name": "/var/lib/dpkg/info/python3-pkg-resources.list", "type": "file" }, { - "bom-ref": "436f49508b978cd2", + "bom-ref": "5ce4af9a4468fb52", "name": "/var/lib/dpkg/info/python3-pkg-resources.md5sums", "type": "file" }, { - "bom-ref": "864831f5230a3b11", + "bom-ref": "37e5fff4ff1a83f1", "name": "/var/lib/dpkg/info/python3-pkg-resources.postinst", "type": "file" }, { - "bom-ref": "ef519de60272a02c", + "bom-ref": "f6c4fbf27125bd7c", "name": "/var/lib/dpkg/info/python3-pkg-resources.prerm", "type": "file" }, { - "bom-ref": "c0ba883e33c9ab66", + "bom-ref": "e260c7132c406a3b", + "name": "/var/lib/dpkg/info/python3-pyparsing.list", + "type": "file" + }, + { + "bom-ref": "0c37fc0c1158a80e", + "name": "/var/lib/dpkg/info/python3-pyparsing.md5sums", + "type": "file" + }, + { + "bom-ref": "27d08ab1e7f1fa64", + "name": "/var/lib/dpkg/info/python3-pyparsing.postinst", + "type": "file" + }, + { + "bom-ref": "8fa4d58062c0574f", + "name": "/var/lib/dpkg/info/python3-pyparsing.prerm", + "type": "file" + }, + { + "bom-ref": "5f8cfcde4897cc2e", "name": "/var/lib/dpkg/info/python3-setuptools.list", "type": "file" }, { - "bom-ref": "e9ddb8081364aa6a", + "bom-ref": "8dc23ed25b4a523a", "name": "/var/lib/dpkg/info/python3-setuptools.md5sums", "type": "file" }, { - "bom-ref": "deb537c22bfef152", + "bom-ref": "e40e5f4697285422", "name": "/var/lib/dpkg/info/python3-setuptools.postinst", "type": "file" }, { - "bom-ref": "bac0f0a12ebded07", + "bom-ref": "bbd4b5a552465603", "name": "/var/lib/dpkg/info/python3-setuptools.prerm", "type": "file" }, { - "bom-ref": "91cef6a7a4613f18", + "bom-ref": "59b74c554c79c992", + "name": "/var/lib/dpkg/info/python3-six.list", + "type": "file" + }, + { + "bom-ref": "48c78447b0a9eb78", + "name": "/var/lib/dpkg/info/python3-six.md5sums", + "type": "file" + }, + { + "bom-ref": "72910c2beb5d8961", + "name": "/var/lib/dpkg/info/python3-six.postinst", + "type": "file" + }, + { + "bom-ref": "acd37633492b019a", + "name": "/var/lib/dpkg/info/python3-six.prerm", + "type": "file" + }, + { + "bom-ref": "62dccc71b8fdd4b7", + "name": "/var/lib/dpkg/info/python3-software-properties.list", + "type": "file" + }, + { + "bom-ref": "1170d662a139d216", + "name": "/var/lib/dpkg/info/python3-software-properties.md5sums", + "type": "file" + }, + { + "bom-ref": "7f8cc25ab1f575dd", + "name": "/var/lib/dpkg/info/python3-software-properties.postinst", + "type": "file" + }, + { + "bom-ref": "fc35f661e6d70343", + "name": "/var/lib/dpkg/info/python3-software-properties.prerm", + "type": "file" + }, + { + "bom-ref": "7e08fca6e2ebcd6c", + "name": "/var/lib/dpkg/info/python3-wadllib.list", + "type": "file" + }, + { + "bom-ref": "2749157e032f5186", + "name": "/var/lib/dpkg/info/python3-wadllib.md5sums", + "type": "file" + }, + { + "bom-ref": "ebbee692287acde7", + "name": "/var/lib/dpkg/info/python3-wadllib.postinst", + "type": "file" + }, + { + "bom-ref": "13f59860abeb7932", + "name": "/var/lib/dpkg/info/python3-wadllib.prerm", + "type": "file" + }, + { + "bom-ref": "993a01dfbb4a2114", "name": "/var/lib/dpkg/info/python3-wheel.list", "type": "file" }, { - "bom-ref": "eb00fcd3cbd6e0a6", + "bom-ref": "85ac5974ebfaaf92", "name": "/var/lib/dpkg/info/python3-wheel.md5sums", "type": "file" }, { - "bom-ref": "e2cb5fee33d45b1d", + "bom-ref": "53f16bb448022129", "name": "/var/lib/dpkg/info/python3-wheel.postinst", "type": "file" }, { - "bom-ref": "41876a18419d7cc7", + "bom-ref": "6a4b19a587abba3b", "name": "/var/lib/dpkg/info/python3-wheel.prerm", "type": "file" }, { - "bom-ref": "c6a9a1dceb526ac6", + "bom-ref": "cb9cc941cc72b932", "name": "/var/lib/dpkg/info/python3.12-dev.list", "type": "file" }, { - "bom-ref": "2e118a69e2f9ee1d", + "bom-ref": "41d8a5444a223b7d", "name": "/var/lib/dpkg/info/python3.12-dev.md5sums", "type": "file" }, { - "bom-ref": "1a46a5e02228ca5a", + "bom-ref": "64605f135690fa7a", "name": "/var/lib/dpkg/info/python3.12-minimal.list", "type": "file" }, { - "bom-ref": "91e223923d73582a", + "bom-ref": "318b7e11fb0be922", "name": "/var/lib/dpkg/info/python3.12-minimal.md5sums", "type": "file" }, { - "bom-ref": "2df8254ff7c774f8", + "bom-ref": "a0a62fc94d06b584", "name": "/var/lib/dpkg/info/python3.12-minimal.postinst", "type": "file" }, { - "bom-ref": "40dd51d801f5fc60", + "bom-ref": "1bbe996c3bae1434", "name": "/var/lib/dpkg/info/python3.12-minimal.postrm", "type": "file" }, { - "bom-ref": "9d3c3663c8cf0ead", + "bom-ref": "de4ce6a3ebd04855", "name": "/var/lib/dpkg/info/python3.12-minimal.preinst", "type": "file" }, { - "bom-ref": "6c13c88fba1dbf83", + "bom-ref": "f69366b1641d8dc3", "name": "/var/lib/dpkg/info/python3.12-minimal.prerm", "type": "file" }, { - "bom-ref": "c2368f700fe0967e", + "bom-ref": "96356a226eae57ca", "name": "/var/lib/dpkg/info/python3.12.list", "type": "file" }, { - "bom-ref": "4690933703ddfffb", + "bom-ref": "868615929ea309a3", "name": "/var/lib/dpkg/info/python3.12.md5sums", "type": "file" }, { - "bom-ref": "9bc36d2f16e8ec04", + "bom-ref": "fd89f04122128720", "name": "/var/lib/dpkg/info/python3.12.postinst", "type": "file" }, { - "bom-ref": "de9335bc45932784", + "bom-ref": "5020fd6818ed7fe4", "name": "/var/lib/dpkg/info/python3.12.prerm", "type": "file" }, { - "bom-ref": "bd4d16e0f263a75b", + "bom-ref": "f4c7b27be2e29b7f", "name": "/var/lib/dpkg/info/python3.list", "type": "file" }, { - "bom-ref": "018519a62a7047cc", + "bom-ref": "f68a223965c47ec8", "name": "/var/lib/dpkg/info/python3.md5sums", "type": "file" }, { - "bom-ref": "d21c5080e8962254", + "bom-ref": "fb192efc4de0ad58", "name": "/var/lib/dpkg/info/python3.postinst", "type": "file" }, { - "bom-ref": "aff71ae6c5453ec9", + "bom-ref": "f446da112077b465", "name": "/var/lib/dpkg/info/python3.postrm", "type": "file" }, { - "bom-ref": "96664e94254c2814", + "bom-ref": "d34f550173374a74", "name": "/var/lib/dpkg/info/python3.preinst", "type": "file" }, { - "bom-ref": "0dc93ba85c45e35c", + "bom-ref": "5e5c42ebfb4d6894", "name": "/var/lib/dpkg/info/python3.prerm", "type": "file" }, { - "bom-ref": "d69ddd4ddafd5d43", + "bom-ref": "f81b980d3a788817", "name": "/var/lib/dpkg/info/rdma-core.conffiles", "type": "file" }, { - "bom-ref": "eba339ae72beaf12", + "bom-ref": "4c8f2dc364c74b56", "name": "/var/lib/dpkg/info/rdma-core.list", "type": "file" }, { - "bom-ref": "f55507178f9ad26a", + "bom-ref": "c7abf138d756a7a2", "name": "/var/lib/dpkg/info/rdma-core.md5sums", "type": "file" }, { - "bom-ref": "0a1284bbc05655a1", + "bom-ref": "20da743fcc06f6e9", "name": "/var/lib/dpkg/info/rdma-core.postinst", "type": "file" }, { - "bom-ref": "33383cbc74f9c4cb", + "bom-ref": "1e6e1f9b75564e3b", "name": "/var/lib/dpkg/info/rdma-core.postrm", "type": "file" }, { - "bom-ref": "806683e105cb0f2b", + "bom-ref": "3292cec22e637b03", "name": "/var/lib/dpkg/info/rdma-core.preinst", "type": "file" }, { - "bom-ref": "823fdfec59bb241a", + "bom-ref": "ad59411a4f9c345e", "name": "/var/lib/dpkg/info/rdma-core.prerm", "type": "file" }, { - "bom-ref": "554cb8e19ebb0f07", + "bom-ref": "399b6f4b77abba6b", "name": "/var/lib/dpkg/info/readline-common.list", "type": "file" }, { - "bom-ref": "c1f8d32dabd4e2df", + "bom-ref": "777780500a916953", "name": "/var/lib/dpkg/info/readline-common.md5sums", "type": "file" }, { - "bom-ref": "f64c032a6da24fb8", + "bom-ref": "b168aeb89648127c", "name": "/var/lib/dpkg/info/readline-common.postinst", "type": "file" }, { - "bom-ref": "d25167a0d4c74666", + "bom-ref": "dbfe2f75b07c8a7a", "name": "/var/lib/dpkg/info/readline-common.postrm", "type": "file" }, { - "bom-ref": "d60df98e9aa58167", + "bom-ref": "002fe1e3380da2ef", "name": "/var/lib/dpkg/info/rpcsvc-proto.list", "type": "file" }, { - "bom-ref": "a452fa048aebb047", + "bom-ref": "505d94e7e877e44b", "name": "/var/lib/dpkg/info/rpcsvc-proto.md5sums", "type": "file" }, { - "bom-ref": "5b0af8db5632e4ab", + "bom-ref": "5d3440242cfbc635", "name": "/var/lib/dpkg/info/sed.list", "type": "file" }, { - "bom-ref": "6c4706a590c0427e", + "bom-ref": "02e29de630429360", "name": "/var/lib/dpkg/info/sed.md5sums", "type": "file" }, { - "bom-ref": "988d57db7609bbc0", + "bom-ref": "238c516dd039dc9a", "name": "/var/lib/dpkg/info/sensible-utils.list", "type": "file" }, { - "bom-ref": "f741f48874c98b36", + "bom-ref": "76486fd7b8454a60", "name": "/var/lib/dpkg/info/sensible-utils.md5sums", "type": "file" }, { - "bom-ref": "90b1bde617c7e0fe", + "bom-ref": "7aaa6a6eff25ea66", + "name": "/var/lib/dpkg/info/sgml-base.list", + "type": "file" + }, + { + "bom-ref": "6a42d85e71d424f8", + "name": "/var/lib/dpkg/info/sgml-base.md5sums", + "type": "file" + }, + { + "bom-ref": "270829b4060102e9", + "name": "/var/lib/dpkg/info/sgml-base.postinst", + "type": "file" + }, + { + "bom-ref": "51a214f0844e79b2", + "name": "/var/lib/dpkg/info/sgml-base.postrm", + "type": "file" + }, + { + "bom-ref": "27702fa09a2f2c0a", + "name": "/var/lib/dpkg/info/sgml-base.preinst", + "type": "file" + }, + { + "bom-ref": "deff939eb9046499", + "name": "/var/lib/dpkg/info/sgml-base.prerm", + "type": "file" + }, + { + "bom-ref": "7da3851e29453b74", + "name": "/var/lib/dpkg/info/sgml-base.triggers", + "type": "file" + }, + { + "bom-ref": "40a20b5a979c7c56", "name": "/var/lib/dpkg/info/shared-mime-info.list", "type": "file" }, { - "bom-ref": "dd965b899f4004e1", + "bom-ref": "599928bd49c52591", "name": "/var/lib/dpkg/info/shared-mime-info.md5sums", "type": "file" }, { - "bom-ref": "8c06a1774c4a5786", + "bom-ref": "ecf3fa9d8080c102", "name": "/var/lib/dpkg/info/shared-mime-info.postinst", "type": "file" }, { - "bom-ref": "d67703a7ddba78bf", + "bom-ref": "85597de7b0cd582f", "name": "/var/lib/dpkg/info/shared-mime-info.postrm", "type": "file" }, { - "bom-ref": "1f8b7b478824e920", + "bom-ref": "e318f0565b16c6b4", "name": "/var/lib/dpkg/info/shared-mime-info.triggers", "type": "file" }, { - "bom-ref": "b4748635eb62f3c5", + "bom-ref": "74a6201bf2c633dc", + "name": "/var/lib/dpkg/info/software-properties-common.conffiles", + "type": "file" + }, + { + "bom-ref": "c1ced75e08855cb2", + "name": "/var/lib/dpkg/info/software-properties-common.list", + "type": "file" + }, + { + "bom-ref": "f54a9742da591d53", + "name": "/var/lib/dpkg/info/software-properties-common.md5sums", + "type": "file" + }, + { + "bom-ref": "4f24d1206c9a0ab0", + "name": "/var/lib/dpkg/info/software-properties-common.postinst", + "type": "file" + }, + { + "bom-ref": "ce7c023f58e559ef", + "name": "/var/lib/dpkg/info/software-properties-common.prerm", + "type": "file" + }, + { + "bom-ref": "33c3bad447414d03", "name": "/var/lib/dpkg/info/systemd-dev.list", "type": "file" }, { - "bom-ref": "b0f886b5c2e31722", + "bom-ref": "b743c284eec3ad80", "name": "/var/lib/dpkg/info/systemd-dev.md5sums", "type": "file" }, { - "bom-ref": "a4f1eaa0eae09e3f", + "bom-ref": "f98806b7ea519001", + "name": "/var/lib/dpkg/info/systemd-sysv.list", + "type": "file" + }, + { + "bom-ref": "8781b829523f1d69", + "name": "/var/lib/dpkg/info/systemd-sysv.md5sums", + "type": "file" + }, + { + "bom-ref": "c540c2d606737a2b", + "name": "/var/lib/dpkg/info/systemd-sysv.postinst", + "type": "file" + }, + { + "bom-ref": "4f5b742d49b0eed1", "name": "/var/lib/dpkg/info/systemd.conffiles", "type": "file" }, { - "bom-ref": "8a0f30b2c134f5f1", + "bom-ref": "4522c3d76960a5cf", "name": "/var/lib/dpkg/info/systemd.list", "type": "file" }, { - "bom-ref": "cdcb117c14b5629f", + "bom-ref": "1bf143477c07c2ed", "name": "/var/lib/dpkg/info/systemd.md5sums", "type": "file" }, { - "bom-ref": "9833e9c6cb728cb7", + "bom-ref": "94954bbe2ac98319", "name": "/var/lib/dpkg/info/systemd.postinst", "type": "file" }, { - "bom-ref": "cad99c6bcb553813", + "bom-ref": "60b1ece0e2755fbd", "name": "/var/lib/dpkg/info/systemd.postrm", "type": "file" }, { - "bom-ref": "9fd882f2acff398d", + "bom-ref": "09de46d36e959ebf", "name": "/var/lib/dpkg/info/systemd.preinst", "type": "file" }, { - "bom-ref": "ace74b0b2b5cc170", + "bom-ref": "3d4dc8bdc4083cea", "name": "/var/lib/dpkg/info/systemd.prerm", "type": "file" }, { - "bom-ref": "eb03eb44029714d8", + "bom-ref": "fdd2b8ea7a435a72", "name": "/var/lib/dpkg/info/systemd.triggers", "type": "file" }, { - "bom-ref": "8991a00cc4db2dff", + "bom-ref": "d66566e493920a91", "name": "/var/lib/dpkg/info/sysvinit-utils.list", "type": "file" }, { - "bom-ref": "822b81f0b1a1e0c8", + "bom-ref": "eb238d7c79ebccca", "name": "/var/lib/dpkg/info/sysvinit-utils.md5sums", "type": "file" }, { - "bom-ref": "db3b4071eac8d945", + "bom-ref": "d4c19803ccbb645b", "name": "/var/lib/dpkg/info/tar.list", "type": "file" }, { - "bom-ref": "468d800792bf3bfc", + "bom-ref": "b56af8aeb96f7356", "name": "/var/lib/dpkg/info/tar.md5sums", "type": "file" }, { - "bom-ref": "fa1843146cf5fe99", + "bom-ref": "cacbeb39a80766f3", "name": "/var/lib/dpkg/info/tar.postinst", "type": "file" }, { - "bom-ref": "a5920b562acfc307", + "bom-ref": "757dfea9007794dd", "name": "/var/lib/dpkg/info/tar.prerm", "type": "file" }, { - "bom-ref": "1dfc0c0e38dab43d", + "bom-ref": "8fda71539da75ac1", "name": "/var/lib/dpkg/info/tzdata.config", "type": "file" }, { - "bom-ref": "1c9bd284577b0d10", + "bom-ref": "0e745811badcd8d0", "name": "/var/lib/dpkg/info/tzdata.list", "type": "file" }, { - "bom-ref": "ff76e0486cbc37da", + "bom-ref": "81fbd75eea7f93ba", "name": "/var/lib/dpkg/info/tzdata.md5sums", "type": "file" }, { - "bom-ref": "9db8b9476f20e015", + "bom-ref": "29c0332bfb5be635", "name": "/var/lib/dpkg/info/tzdata.postinst", "type": "file" }, { - "bom-ref": "897170314e5692b3", + "bom-ref": "acfdac68aea25503", "name": "/var/lib/dpkg/info/tzdata.postrm", "type": "file" }, { - "bom-ref": "9e9e1bc092baaa08", + "bom-ref": "c278653748b2cd74", "name": "/var/lib/dpkg/info/tzdata.templates", "type": "file" }, { - "bom-ref": "9875a0af1a2ddac6", + "bom-ref": "3d097d5560ef2108", "name": "/var/lib/dpkg/info/ubuntu-keyring.list", "type": "file" }, { - "bom-ref": "4065a98167860c47", + "bom-ref": "213d7129f68be4ed", "name": "/var/lib/dpkg/info/ubuntu-keyring.md5sums", "type": "file" }, { - "bom-ref": "d52022a886a3c09f", + "bom-ref": "538b0ad71e1b04b5", "name": "/var/lib/dpkg/info/ubuntu-keyring.postinst", "type": "file" }, { - "bom-ref": "9d591f4b1d05b3d3", + "bom-ref": "fef498789187e807", "name": "/var/lib/dpkg/info/udev.conffiles", "type": "file" }, { - "bom-ref": "cacf19324d86b78d", + "bom-ref": "c703bd700260eb15", "name": "/var/lib/dpkg/info/udev.list", "type": "file" }, { - "bom-ref": "a45f0e9b448fd781", + "bom-ref": "76cb2e07abbd0159", "name": "/var/lib/dpkg/info/udev.md5sums", "type": "file" }, { - "bom-ref": "7c2b180ceaa3effc", + "bom-ref": "be18f599b42d91e8", "name": "/var/lib/dpkg/info/udev.postinst", "type": "file" }, { - "bom-ref": "22771e8cd8b70ccf", + "bom-ref": "2bf750b4969c250f", "name": "/var/lib/dpkg/info/udev.postrm", "type": "file" }, { - "bom-ref": "bc7b37ff50024ce8", + "bom-ref": "730153011ba27650", "name": "/var/lib/dpkg/info/udev.preinst", "type": "file" }, { - "bom-ref": "90264e20b28f5a03", + "bom-ref": "fad58c134d5a5b27", "name": "/var/lib/dpkg/info/udev.prerm", "type": "file" }, { - "bom-ref": "7f24193f6f04653e", + "bom-ref": "e2800bf953d1ab3a", "name": "/var/lib/dpkg/info/udev.triggers", "type": "file" }, { - "bom-ref": "8b987e410feff8ae", + "bom-ref": "ea53049c6c3d8450", "name": "/var/lib/dpkg/info/unminimize.list", "type": "file" }, { - "bom-ref": "fb0ee4030b7fa61e", + "bom-ref": "29e18f1cec1916a0", "name": "/var/lib/dpkg/info/unminimize.md5sums", "type": "file" }, { - "bom-ref": "1b34fc556fbb1982", + "bom-ref": "217411b93f18bc40", "name": "/var/lib/dpkg/info/unminimize.postinst", "type": "file" }, { - "bom-ref": "f13ac5924aec5726", + "bom-ref": "f6d8c9a7fa0ae912", "name": "/var/lib/dpkg/info/util-linux.conffiles", "type": "file" }, { - "bom-ref": "19890d9ba9b7d331", + "bom-ref": "bc167d0f03f2f2d9", "name": "/var/lib/dpkg/info/util-linux.list", "type": "file" }, { - "bom-ref": "f5ac6fde9ad2cc66", + "bom-ref": "c154fd5bde8ddb72", "name": "/var/lib/dpkg/info/util-linux.md5sums", "type": "file" }, { - "bom-ref": "35b3762b78e1220c", + "bom-ref": "15814bd53e87ae50", "name": "/var/lib/dpkg/info/util-linux.postinst", "type": "file" }, { - "bom-ref": "33e0a9a891c64cf4", + "bom-ref": "ea954a0dd1e16b6c", "name": "/var/lib/dpkg/info/util-linux.postrm", "type": "file" }, { - "bom-ref": "8efdbe9e90097589", + "bom-ref": "590985fc277bb611", "name": "/var/lib/dpkg/info/util-linux.prerm", "type": "file" }, { - "bom-ref": "fb318a6bebac7979", + "bom-ref": "4cfda97c4cc641d5", "name": "/var/lib/dpkg/info/vim-common.conffiles", "type": "file" }, { - "bom-ref": "b4b12fab6073c94e", + "bom-ref": "1ea2f149c51b7bc2", "name": "/var/lib/dpkg/info/vim-common.list", "type": "file" }, { - "bom-ref": "dd16643fe90f414a", + "bom-ref": "64b20c249a80b00a", "name": "/var/lib/dpkg/info/vim-common.md5sums", "type": "file" }, { - "bom-ref": "f912c1d4485234be", + "bom-ref": "42ca674fecdaaf16", "name": "/var/lib/dpkg/info/vim-common.postinst", "type": "file" }, { - "bom-ref": "8e4fb8b383676d11", + "bom-ref": "68b9d32e70a9fc79", "name": "/var/lib/dpkg/info/vim-common.postrm", "type": "file" }, { - "bom-ref": "82a58514027ad1e1", + "bom-ref": "2298cde1523e47b1", "name": "/var/lib/dpkg/info/vim-runtime.list", "type": "file" }, { - "bom-ref": "7634941f301ced96", + "bom-ref": "8016b0d27250747e", "name": "/var/lib/dpkg/info/vim-runtime.md5sums", "type": "file" }, { - "bom-ref": "1be8a72fae0489e1", + "bom-ref": "f32e4df518436659", "name": "/var/lib/dpkg/info/vim-runtime.postinst", "type": "file" }, { - "bom-ref": "c70af46b5a3b4b19", + "bom-ref": "b0e19531758175c9", "name": "/var/lib/dpkg/info/vim-runtime.postrm", "type": "file" }, { - "bom-ref": "f660bbd202825f6c", + "bom-ref": "5b5cc01739ef73ec", "name": "/var/lib/dpkg/info/vim-runtime.preinst", "type": "file" }, { - "bom-ref": "19f03349f58af68f", + "bom-ref": "ffabdae091877d8b", "name": "/var/lib/dpkg/info/vim.list", "type": "file" }, { - "bom-ref": "a8523d92ff3d4d05", + "bom-ref": "0f35efd4290ac641", "name": "/var/lib/dpkg/info/vim.md5sums", "type": "file" }, { - "bom-ref": "16dce2444846594e", + "bom-ref": "30bc9f3b87620316", "name": "/var/lib/dpkg/info/vim.postinst", "type": "file" }, { - "bom-ref": "5bf6bb20603532fe", + "bom-ref": "b72c62a7ae5c1b52", "name": "/var/lib/dpkg/info/vim.prerm", "type": "file" }, { - "bom-ref": "310595773de9f017", + "bom-ref": "7c77ccc66d90d4af", "name": "/var/lib/dpkg/info/wget.conffiles", "type": "file" }, { - "bom-ref": "1168872a67c0b51f", + "bom-ref": "249be6549a7ebca7", "name": "/var/lib/dpkg/info/wget.list", "type": "file" }, { - "bom-ref": "5343f1a48a3c5438", + "bom-ref": "6c08548d8b45eba4", "name": "/var/lib/dpkg/info/wget.md5sums", "type": "file" }, { - "bom-ref": "f3e94e83ad0f75d6", + "bom-ref": "35c330952ea86dce", "name": "/var/lib/dpkg/info/x11-common.conffiles", "type": "file" }, { - "bom-ref": "a9d6e5f085d2b6ee", + "bom-ref": "f59572d67fb153ea", "name": "/var/lib/dpkg/info/x11-common.list", "type": "file" }, { - "bom-ref": "3a9998f2f8372387", + "bom-ref": "219795ff893bad8f", "name": "/var/lib/dpkg/info/x11-common.md5sums", "type": "file" }, { - "bom-ref": "818d067811d4677d", + "bom-ref": "5598a547fbb640cd", "name": "/var/lib/dpkg/info/x11-common.postinst", "type": "file" }, { - "bom-ref": "7e5400c4e77c2a19", + "bom-ref": "d0bda4c8fc5fb2d1", "name": "/var/lib/dpkg/info/x11-common.postrm", "type": "file" }, { - "bom-ref": "095c7b44adaaf163", + "bom-ref": "2a0ec8d17d4328fb", "name": "/var/lib/dpkg/info/x11-common.preinst", "type": "file" }, { - "bom-ref": "dddf607973f6289e", + "bom-ref": "c9cdca91d00e9476", "name": "/var/lib/dpkg/info/x11-common.prerm", "type": "file" }, { - "bom-ref": "45412d2d95e37db0", + "bom-ref": "d5fead42a4f841c4", "name": "/var/lib/dpkg/info/xkb-data.list", "type": "file" }, { - "bom-ref": "d63c92e2e8b09496", + "bom-ref": "405e7c0d37baa222", "name": "/var/lib/dpkg/info/xkb-data.md5sums", "type": "file" }, { - "bom-ref": "d0b5ccbd3ef74dfb", + "bom-ref": "3b72bce89060dda6", + "name": "/var/lib/dpkg/info/xml-core.conffiles", + "type": "file" + }, + { + "bom-ref": "18556cafad9f98b4", + "name": "/var/lib/dpkg/info/xml-core.list", + "type": "file" + }, + { + "bom-ref": "ee471d3244d37d11", + "name": "/var/lib/dpkg/info/xml-core.md5sums", + "type": "file" + }, + { + "bom-ref": "fc23cbe7a2ecd719", + "name": "/var/lib/dpkg/info/xml-core.postinst", + "type": "file" + }, + { + "bom-ref": "8264688f766daf21", + "name": "/var/lib/dpkg/info/xml-core.postrm", + "type": "file" + }, + { + "bom-ref": "627884d3e7d09ab5", + "name": "/var/lib/dpkg/info/xml-core.preinst", + "type": "file" + }, + { + "bom-ref": "65d7cb1bd57cff91", + "name": "/var/lib/dpkg/info/xml-core.prerm", + "type": "file" + }, + { + "bom-ref": "8cfc455b972075e7", + "name": "/var/lib/dpkg/info/xml-core.triggers", + "type": "file" + }, + { + "bom-ref": "61d98d165ea03610", + "name": "/var/lib/dpkg/info/xpu-smi.list", + "type": "file" + }, + { + "bom-ref": "7a95c40d9882fe71", + "name": "/var/lib/dpkg/info/xpu-smi.md5sums", + "type": "file" + }, + { + "bom-ref": "9e7fadf0fd089173", "name": "/var/lib/dpkg/info/xz-utils.list", "type": "file" }, { - "bom-ref": "d435c71f0fd9a450", + "bom-ref": "1ff5f843754ebcac", "name": "/var/lib/dpkg/info/xz-utils.md5sums", "type": "file" }, { - "bom-ref": "fd3d81738d61735a", + "bom-ref": "85d17fb0188be772", "name": "/var/lib/dpkg/info/xz-utils.postinst", "type": "file" }, { - "bom-ref": "fbc4960b52e21d1f", + "bom-ref": "7f49d4a6d0c2778b", "name": "/var/lib/dpkg/info/xz-utils.prerm", "type": "file" }, { - "bom-ref": "5bb033f6e338934f", + "bom-ref": "5b6e0c48af0aa8df", "name": "/var/lib/dpkg/info/zlib1g-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "24af40020cfe6ad0", + "bom-ref": "169fce359b65a192", "name": "/var/lib/dpkg/info/zlib1g:amd64.md5sums", "type": "file" }, { - "bom-ref": "53361d54855c3218", + "bom-ref": "a3ad7c69d369445c", "name": "/var/lib/dpkg/status", "type": "file" }, { - "bom-ref": "7a67140b65358433", + "bom-ref": "4d2859e57d8daa47", + "name": "/var/lib/polkit-1/localauthority/10-vendor.d/org.freedesktop.packagekit.pkla", + "type": "file" + }, + { + "bom-ref": "420fdf6dab435d96", "name": "/workspace/vllm/tests/vllm_test_utils/vllm_test_utils.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "26be83286d9939cb", + "bom-ref": "bfed7291a0b0a486", "name": "/workspace/vllm/tests/vllm_test_utils/vllm_test_utils.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "fb364e0e50a73028", + "bom-ref": "424994f2b10781c9", "name": "/workspace/vllm/vllm.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "f9a056049ac69d04", + "bom-ref": "5e590a37c8748905", "name": "/workspace/vllm/vllm.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "0fcaaf2133b0bb32", + "bom-ref": "0d81dbdd1b350d18", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", @@ -73852,14 +78262,14 @@ "version": "1.1.0.14" }, { - "bom-ref": "349f54306ad27277", + "bom-ref": "4744a497d2fced9d", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "4744a497d2fced9d", + "bom-ref": "55f1b3750150cc5f", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", @@ -73873,42 +78283,42 @@ "version": "1.1.0.14" }, { - "bom-ref": "6b08798de1f5c1e3", + "bom-ref": "6ce8d8a87e6c8909", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "6ce8d8a87e6c8909", + "bom-ref": "7c861fa6a6654d53", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "a88018710aa2d75d", + "bom-ref": "7ff9447f8fc29172", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "b0da8da07656841f", + "bom-ref": "84f382516d4210cb", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "b9a3418f3becb307", + "bom-ref": "b0da8da07656841f", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "c1fec96f98c7b3d3", + "bom-ref": "bf08ecf23ef769ef", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", @@ -73923,8 +78333,8 @@ }, { "author": "The Abseil Authors", - "bom-ref": "pkg:pypi/absl-py@2.4.0?package-id=ea8c18f8e4467b64", - "cpe": "cpe:2.3:a:abseil_authors_project:python-absl-py:2.4.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/absl-py@2.5.0?package-id=11da695aeb28a565", + "cpe": "cpe:2.3:a:abseil_authors_project:python-absl-py:2.5.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -73933,14 +78343,14 @@ } ], "name": "absl-py", - "purl": "pkg:pypi/absl-py@2.4.0", + "purl": "pkg:pypi/absl-py@2.5.0", "type": "library", - "version": "2.4.0" + "version": "2.5.0" }, { "author": "The Hugging Face team ", - "bom-ref": "pkg:pypi/accelerate@1.13.0?package-id=90cfe9d5dfb077c7", - "cpe": "cpe:2.3:a:hugging_face_team_project:python-accelerate:1.13.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/accelerate@1.14.0?package-id=241ff8029aeae56c", + "cpe": "cpe:2.3:a:hugging_face_team_project:python-accelerate:1.14.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -73949,9 +78359,9 @@ } ], "name": "accelerate", - "purl": "pkg:pypi/accelerate@1.13.0", + "purl": "pkg:pypi/accelerate@1.14.0", "type": "library", - "version": "1.13.0" + "version": "1.14.0" }, { "bom-ref": "pkg:deb/ubuntu/adduser@3.137ubuntu1?arch=all&distro=ubuntu-24.04&package-id=98299e49069387ec", @@ -74006,6 +78416,22 @@ "type": "library", "version": "0.8.4" }, + { + "author": "Patrick Arminio", + "bom-ref": "pkg:pypi/agent-detector@2.0.0?package-id=19632adab308fce5", + "cpe": "cpe:2.3:a:patrick_arminio_project:python-agent-detector:2.0.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], + "name": "agent-detector", + "purl": "pkg:pypi/agent-detector@2.0.0", + "type": "library", + "version": "2.0.0" + }, { "bom-ref": "pkg:cargo/aho-corasick@1.1.4?package-id=f531798ba3c006fa", "cpe": "cpe:2.3:a:aho-corasick:aho-corasick:1.1.4:*:*:*:*:*:*:*", @@ -74024,8 +78450,8 @@ }, { "author": "J. Nick Koston ", - "bom-ref": "pkg:pypi/aiohappyeyeballs@2.6.1?package-id=dfab8016c86d6738", - "cpe": "cpe:2.3:a:python-aiohappyeyeballs:python-aiohappyeyeballs:2.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/aiohappyeyeballs@2.7.1?package-id=8cd3687d69d06003", + "cpe": "cpe:2.3:a:python-aiohappyeyeballs:python-aiohappyeyeballs:2.7.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -74034,13 +78460,13 @@ } ], "name": "aiohappyeyeballs", - "purl": "pkg:pypi/aiohappyeyeballs@2.6.1", + "purl": "pkg:pypi/aiohappyeyeballs@2.7.1", "type": "library", - "version": "2.6.1" + "version": "2.7.1" }, { "author": "J. Nick Koston ", - "bom-ref": "pkg:pypi/aiohappyeyeballs@2.7.1?package-id=8cd3687d69d06003", + "bom-ref": "pkg:pypi/aiohappyeyeballs@2.7.1?package-id=bfb9214c148573dd", "cpe": "cpe:2.3:a:python-aiohappyeyeballs:python-aiohappyeyeballs:2.7.1:*:*:*:*:*:*:*", "licenses": [ { @@ -74055,17 +78481,17 @@ "version": "2.7.1" }, { - "bom-ref": "pkg:pypi/aiohttp@3.13.4?package-id=d3758f933178cee2", - "cpe": "cpe:2.3:a:python-aiohttp:python-aiohttp:3.13.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/aiohttp@3.14.3?package-id=55b929515486b482", + "cpe": "cpe:2.3:a:python-aiohttp:python-aiohttp:3.14.3:*:*:*:*:*:*:*", "licenses": [ { "expression": "Apache-2.0 AND MIT" } ], "name": "aiohttp", - "purl": "pkg:pypi/aiohttp@3.13.4", + "purl": "pkg:pypi/aiohttp@3.14.3", "type": "library", - "version": "3.13.4" + "version": "3.14.3" }, { "bom-ref": "pkg:pypi/aiohttp@3.14.3?package-id=82c4217a1d6d3154", @@ -74111,9 +78537,25 @@ "version": "1.4.0" }, { - "author": "Vladimir I. Iglovikov, Mikhail Druzhinin, Alex Parinov, Alexander Buslaev, Eugene Khvedchenya", - "bom-ref": "pkg:pypi/albumentations@1.4.6?package-id=7ee4560937cff75e", - "cpe": "cpe:2.3:a:vladimir_i__iglovikov\\,_mikhail_druzhinin\\,_alex_parinov\\,_alexander_buslaev\\,_eugene_khvedchenya_project:python-albumentations:1.4.6:*:*:*:*:*:*:*", + "author": "Vladimir Iglovikov", + "bom-ref": "pkg:pypi/albucore@0.0.24?package-id=332d1603fc4a5f61", + "cpe": "cpe:2.3:a:vladimir_iglovikov_project:python-albucore:0.0.24:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], + "name": "albucore", + "purl": "pkg:pypi/albucore@0.0.24", + "type": "library", + "version": "0.0.24" + }, + { + "author": "Vladimir Iglovikov", + "bom-ref": "pkg:pypi/albumentations@2.0.8?package-id=44aaba53cc04714a", + "cpe": "cpe:2.3:a:vladimir_iglovikov_project:python-albumentations:2.0.8:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -74122,9 +78564,9 @@ } ], "name": "albumentations", - "purl": "pkg:pypi/albumentations@1.4.6", + "purl": "pkg:pypi/albumentations@2.0.8", "type": "library", - "version": "1.4.6" + "version": "2.0.8" }, { "bom-ref": "pkg:cargo/allocator-api2@0.2.21?package-id=46814b7a4b358087", @@ -74142,6 +78584,22 @@ "type": "library", "version": "0.2.21" }, + { + "bom-ref": "pkg:cargo/ambient-authority@0.0.2?package-id=13646077a6d05597", + "cpe": "cpe:2.3:a:ambient-authority:ambient-authority:0.0.2:*:*:*:*:*:*:*", + "name": "ambient-authority", + "purl": "pkg:cargo/ambient-authority@0.0.2", + "type": "library", + "version": "0.0.2" + }, + { + "bom-ref": "pkg:cargo/ambient-authority@0.0.2?package-id=61d8633848b721c4", + "cpe": "cpe:2.3:a:ambient-authority:ambient-authority:0.0.2:*:*:*:*:*:*:*", + "name": "ambient-authority", + "purl": "pkg:cargo/ambient-authority@0.0.2", + "type": "library", + "version": "0.0.2" + }, { "bom-ref": "pkg:cargo/ambient-id@0.0.11?package-id=436febde916ab080", "cpe": "cpe:2.3:a:ambient-id:ambient-id:0.0.11:*:*:*:*:*:*:*", @@ -74160,8 +78618,8 @@ }, { "author": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "bom-ref": "pkg:pypi/annotated-doc@0.0.4?package-id=0585140d79352e3d", - "cpe": "cpe:2.3:a:python-annotated-doc:python-annotated-doc:0.0.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/annotated-doc@0.0.5?package-id=d6ca2f15fbd1b7ac", + "cpe": "cpe:2.3:a:python-annotated-doc:python-annotated-doc:0.0.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -74170,18 +78628,25 @@ } ], "name": "annotated-doc", - "purl": "pkg:pypi/annotated-doc@0.0.4", + "purl": "pkg:pypi/annotated-doc@0.0.5", "type": "library", - "version": "0.0.4" + "version": "0.0.5" }, { "author": "Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Samuel Colvin , Zac Hatfield-Dodds ", - "bom-ref": "pkg:pypi/annotated-types@0.7.0?package-id=e98d74072b7bed10", - "cpe": "cpe:2.3:a:adrian_garcia_badaracco_\\<1755071\\+adriangb_project:python-annotated-types:0.7.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/annotated-types@0.8.0?package-id=18c4d87dcbbc721f", + "cpe": "cpe:2.3:a:adrian_garcia_badaracco_\\<1755071\\+adriangb_project:python-annotated-types:0.8.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], "name": "annotated-types", - "purl": "pkg:pypi/annotated-types@0.7.0", + "purl": "pkg:pypi/annotated-types@0.8.0", "type": "library", - "version": "0.7.0" + "version": "0.8.0" }, { "bom-ref": "pkg:cargo/anstream@1.0.0?package-id=834b1bbc005f19a9", @@ -74249,8 +78714,8 @@ }, { "author": "Anthropic ", - "bom-ref": "pkg:pypi/anthropic@0.112.0?package-id=054ebaa949816203", - "cpe": "cpe:2.3:a:anthropic_\\", - "bom-ref": "pkg:pypi/anyio@4.13.0?package-id=b37b33dde0d84034", - "cpe": "cpe:2.3:a:python-anyio:python-anyio:4.13.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/anyio@4.14.2?package-id=0ae9ac1564977a22", + "cpe": "cpe:2.3:a:python-anyio:python-anyio:4.14.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -74291,14 +78756,14 @@ } ], "name": "anyio", - "purl": "pkg:pypi/anyio@4.13.0", + "purl": "pkg:pypi/anyio@4.14.2", "type": "library", - "version": "4.13.0" + "version": "4.14.2" }, { "author": "TVM FFI team", - "bom-ref": "pkg:pypi/apache-tvm-ffi@0.1.12?package-id=d1e6576e5392c22f", - "cpe": "cpe:2.3:a:apache:python-apache-tvm-ffi:0.1.12:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/apache-tvm-ffi@0.1.13.post3?package-id=4ba17286b545920d", + "cpe": "cpe:2.3:a:apache:python-apache-tvm-ffi:0.1.13.post3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -74307,25 +78772,9 @@ } ], "name": "apache-tvm-ffi", - "purl": "pkg:pypi/apache-tvm-ffi@0.1.12", - "type": "library", - "version": "0.1.12" - }, - { - "author": "holger krekel", - "bom-ref": "pkg:pypi/apipkg@2.0.0?package-id=74e4c3552c2bc37b", - "cpe": "cpe:2.3:a:holger_krekel_project:python-apipkg:2.0.0:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "name": "apipkg", - "purl": "pkg:pypi/apipkg@2.0.0", + "purl": "pkg:pypi/apache-tvm-ffi@0.1.13.post3", "type": "library", - "version": "2.0.0" + "version": "0.1.13.post3" }, { "bom-ref": "pkg:deb/ubuntu/apt@2.8.3?arch=amd64&distro=ubuntu-24.04&package-id=bfe0855a529838fa", @@ -74358,6 +78807,22 @@ "type": "library", "version": "2.8.3" }, + { + "bom-ref": "pkg:cargo/archive-trait@0.0.14?package-id=44af111b9816b640", + "cpe": "cpe:2.3:a:archive-trait:archive-trait:0.0.14:*:*:*:*:*:*:*", + "name": "archive-trait", + "purl": "pkg:cargo/archive-trait@0.0.14", + "type": "library", + "version": "0.0.14" + }, + { + "bom-ref": "pkg:cargo/archive-trait@0.0.14?package-id=866c778687eed319", + "cpe": "cpe:2.3:a:archive-trait:archive-trait:0.0.14:*:*:*:*:*:*:*", + "name": "archive-trait", + "purl": "pkg:cargo/archive-trait@0.0.14", + "type": "library", + "version": "0.0.14" + }, { "bom-ref": "pkg:cargo/arcstr@1.2.0?package-id=0993d26ab39c6e28", "cpe": "cpe:2.3:a:arcstr:arcstr:1.2.0:*:*:*:*:*:*:*", @@ -74375,12 +78840,44 @@ "version": "1.2.0" }, { - "bom-ref": "pkg:pypi/arctic-inference@0.1.1?package-id=75986238e0917bcd", - "cpe": "cpe:2.3:a:python-arctic-inference:python-arctic-inference:0.1.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/arctic-inference@0.2.0?package-id=840c12cfc1e9b5fa", + "cpe": "cpe:2.3:a:python-arctic-inference:python-arctic-inference:0.2.0:*:*:*:*:*:*:*", "name": "arctic-inference", - "purl": "pkg:pypi/arctic-inference@0.1.1", + "purl": "pkg:pypi/arctic-inference@0.2.0", "type": "library", - "version": "0.1.1" + "version": "0.2.0" + }, + { + "bom-ref": "pkg:cargo/arrayref@0.3.9?package-id=6d40584318218d7b", + "cpe": "cpe:2.3:a:arrayref:arrayref:0.3.9:*:*:*:*:*:*:*", + "name": "arrayref", + "purl": "pkg:cargo/arrayref@0.3.9", + "type": "library", + "version": "0.3.9" + }, + { + "bom-ref": "pkg:cargo/arrayref@0.3.9?package-id=7b22e40b2b3cb467", + "cpe": "cpe:2.3:a:arrayref:arrayref:0.3.9:*:*:*:*:*:*:*", + "name": "arrayref", + "purl": "pkg:cargo/arrayref@0.3.9", + "type": "library", + "version": "0.3.9" + }, + { + "bom-ref": "pkg:cargo/arrayvec@0.7.8?package-id=9d0d8ffa6d10e552", + "cpe": "cpe:2.3:a:arrayvec:arrayvec:0.7.8:*:*:*:*:*:*:*", + "name": "arrayvec", + "purl": "pkg:cargo/arrayvec@0.7.8", + "type": "library", + "version": "0.7.8" + }, + { + "bom-ref": "pkg:cargo/arrayvec@0.7.8?package-id=b4976d009ec9fac3", + "cpe": "cpe:2.3:a:arrayvec:arrayvec:0.7.8:*:*:*:*:*:*:*", + "name": "arrayvec", + "purl": "pkg:cargo/arrayvec@0.7.8", + "type": "library", + "version": "0.7.8" }, { "bom-ref": "pkg:cargo/asn1-rs@0.7.1?package-id=9d071798a5179b29", @@ -74527,36 +79024,36 @@ "version": "0.9.1" }, { - "bom-ref": "pkg:cargo/astral-tl@0.7.11?package-id=9155575dba326a5f", - "cpe": "cpe:2.3:a:astral-tl:astral-tl:0.7.11:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/astral-tl@0.8.0?package-id=4f60f758e01bd367", + "cpe": "cpe:2.3:a:astral-tl:astral-tl:0.8.0:*:*:*:*:*:*:*", "name": "astral-tl", - "purl": "pkg:cargo/astral-tl@0.7.11", + "purl": "pkg:cargo/astral-tl@0.8.0", "type": "library", - "version": "0.7.11" + "version": "0.8.0" }, { - "bom-ref": "pkg:cargo/astral-tl@0.7.11?package-id=a0d7a3c24197d815", - "cpe": "cpe:2.3:a:astral-tl:astral-tl:0.7.11:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/astral-tl@0.8.0?package-id=85f2b8d9d3bb4e47", + "cpe": "cpe:2.3:a:astral-tl:astral-tl:0.8.0:*:*:*:*:*:*:*", "name": "astral-tl", - "purl": "pkg:cargo/astral-tl@0.7.11", + "purl": "pkg:cargo/astral-tl@0.8.0", "type": "library", - "version": "0.7.11" + "version": "0.8.0" }, { - "bom-ref": "pkg:cargo/astral-tokio-tar@0.6.4?package-id=02c0f2739f764417", - "cpe": "cpe:2.3:a:astral:astral-tokio-tar:0.6.4:*:*:*:*:rust:*:*", + "bom-ref": "pkg:cargo/astral-tokio-tar@0.7.0?package-id=da8e863344c6f1c9", + "cpe": "cpe:2.3:a:astral:astral-tokio-tar:0.7.0:*:*:*:*:rust:*:*", "name": "astral-tokio-tar", - "purl": "pkg:cargo/astral-tokio-tar@0.6.4", + "purl": "pkg:cargo/astral-tokio-tar@0.7.0", "type": "library", - "version": "0.6.4" + "version": "0.7.0" }, { - "bom-ref": "pkg:cargo/astral-tokio-tar@0.6.4?package-id=a711d9e74cdb5b34", - "cpe": "cpe:2.3:a:astral:astral-tokio-tar:0.6.4:*:*:*:*:rust:*:*", + "bom-ref": "pkg:cargo/astral-tokio-tar@0.7.0?package-id=fb0fbd24c1bdcb96", + "cpe": "cpe:2.3:a:astral:astral-tokio-tar:0.7.0:*:*:*:*:rust:*:*", "name": "astral-tokio-tar", - "purl": "pkg:cargo/astral-tokio-tar@0.6.4", + "purl": "pkg:cargo/astral-tokio-tar@0.7.0", "type": "library", - "version": "0.6.4" + "version": "0.7.0" }, { "bom-ref": "pkg:cargo/astral-version-ranges@0.2.2?package-id=093d74854fea7eb8", @@ -74575,20 +79072,20 @@ "version": "0.2.2" }, { - "bom-ref": "pkg:cargo/astral_async_http_range_reader@0.11.0?package-id=2584976090e846f5", - "cpe": "cpe:2.3:a:astral-async-http-range-reader:astral-async-http-range-reader:0.11.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/astral_async_http_range_reader@0.11.1?package-id=54c9f7df85ff170a", + "cpe": "cpe:2.3:a:astral-async-http-range-reader:astral-async-http-range-reader:0.11.1:*:*:*:*:*:*:*", "name": "astral_async_http_range_reader", - "purl": "pkg:cargo/astral_async_http_range_reader@0.11.0", + "purl": "pkg:cargo/astral_async_http_range_reader@0.11.1", "type": "library", - "version": "0.11.0" + "version": "0.11.1" }, { - "bom-ref": "pkg:cargo/astral_async_http_range_reader@0.11.0?package-id=c8ed70d32ec5c309", - "cpe": "cpe:2.3:a:astral-async-http-range-reader:astral-async-http-range-reader:0.11.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/astral_async_http_range_reader@0.11.1?package-id=eb7af14394275fe1", + "cpe": "cpe:2.3:a:astral-async-http-range-reader:astral-async-http-range-reader:0.11.1:*:*:*:*:*:*:*", "name": "astral_async_http_range_reader", - "purl": "pkg:cargo/astral_async_http_range_reader@0.11.0", + "purl": "pkg:cargo/astral_async_http_range_reader@0.11.1", "type": "library", - "version": "0.11.0" + "version": "0.11.1" }, { "bom-ref": "pkg:cargo/astral_async_zip@0.0.20?package-id=3f3039c5457d5e92", @@ -74671,20 +79168,20 @@ "version": "1.1.1" }, { - "bom-ref": "pkg:cargo/async-trait@0.1.89?package-id=9bab0f4f32c1644c", - "cpe": "cpe:2.3:a:async-trait:async-trait:0.1.89:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/async-trait@0.1.91?package-id=4a5e5c9e10134055", + "cpe": "cpe:2.3:a:async-trait:async-trait:0.1.91:*:*:*:*:*:*:*", "name": "async-trait", - "purl": "pkg:cargo/async-trait@0.1.89", + "purl": "pkg:cargo/async-trait@0.1.91", "type": "library", - "version": "0.1.89" + "version": "0.1.91" }, { - "bom-ref": "pkg:cargo/async-trait@0.1.89?package-id=d0e17665fc44d406", - "cpe": "cpe:2.3:a:async-trait:async-trait:0.1.89:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/async-trait@0.1.91?package-id=e46cd140397ca864", + "cpe": "cpe:2.3:a:async-trait:async-trait:0.1.91:*:*:*:*:*:*:*", "name": "async-trait", - "purl": "pkg:cargo/async-trait@0.1.89", + "purl": "pkg:cargo/async-trait@0.1.91", "type": "library", - "version": "0.1.89" + "version": "0.1.91" }, { "bom-ref": "pkg:cargo/atomic-waker@1.1.2?package-id=7cb38e08b0bd54e6", @@ -74736,8 +79233,8 @@ }, { "author": "Adrian Sampson ", - "bom-ref": "pkg:pypi/audioread@3.0.1?package-id=67af068e7c0a26c8", - "cpe": "cpe:2.3:a:adrian_sampson_\\", + "bom-ref": "pkg:pypi/blinker@1.7.0?package-id=0219946f1667c99f", + "cpe": "cpe:2.3:a:jason_kirtland_\\", - "bom-ref": "pkg:pypi/bm25s@0.2.13?package-id=100d9138898bcfcc", - "cpe": "cpe:2.3:a:bm25s_project:python-bm25s:0.2.13:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], + "bom-ref": "pkg:pypi/bm25s@0.3.10?package-id=70a6e0fed73a0595", + "cpe": "cpe:2.3:a:bm25s_project:python-bm25s:0.3.10:*:*:*:*:*:*:*", "name": "bm25s", - "purl": "pkg:pypi/bm25s@0.2.13", + "purl": "pkg:pypi/bm25s@0.3.10", "type": "library", - "version": "0.2.13" + "version": "0.3.10" }, { "bom-ref": "pkg:cargo/borrow-or-share@0.2.4?package-id=16b7539489a8b6d3", @@ -75279,8 +79794,8 @@ "version": "0.2.14" }, { - "bom-ref": "pkg:deb/ubuntu/bsdutils@1%3A2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&package-id=3c0ad287e54229a6&upstream=util-linux%402.39.3-9ubuntu6.5", - "cpe": "cpe:2.3:a:bsdutils:bsdutils:1\\:2.39.3-9ubuntu6.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/bsdutils@1%3A2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&package-id=3f97bf43ff1778dc&upstream=util-linux%402.39.3-9ubuntu6.6", + "cpe": "cpe:2.3:a:bsdutils:bsdutils:1\\:2.39.3-9ubuntu6.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -75365,9 +79880,9 @@ ], "name": "bsdutils", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/bsdutils@1%3A2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&upstream=util-linux%402.39.3-9ubuntu6.5", + "purl": "pkg:deb/ubuntu/bsdutils@1%3A2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&upstream=util-linux%402.39.3-9ubuntu6.6", "type": "library", - "version": "1:2.39.3-9ubuntu6.5" + "version": "1:2.39.3-9ubuntu6.6" }, { "bom-ref": "pkg:cargo/bstr@1.12.1?package-id=27a5ee374b4d6995", @@ -75402,20 +79917,20 @@ "version": "12.10ubuntu1" }, { - "bom-ref": "pkg:cargo/bytecheck@0.8.2?package-id=0d4adede77a5c0c5", - "cpe": "cpe:2.3:a:bytecheck:bytecheck:0.8.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/bytecheck@0.8.3?package-id=26fb82d7511a3a7e", + "cpe": "cpe:2.3:a:bytecheck:bytecheck:0.8.3:*:*:*:*:*:*:*", "name": "bytecheck", - "purl": "pkg:cargo/bytecheck@0.8.2", + "purl": "pkg:cargo/bytecheck@0.8.3", "type": "library", - "version": "0.8.2" + "version": "0.8.3" }, { - "bom-ref": "pkg:cargo/bytecheck@0.8.2?package-id=af843acafb4d61a9", - "cpe": "cpe:2.3:a:bytecheck:bytecheck:0.8.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/bytecheck@0.8.3?package-id=5ae6895e2c5a2ddb", + "cpe": "cpe:2.3:a:bytecheck:bytecheck:0.8.3:*:*:*:*:*:*:*", "name": "bytecheck", - "purl": "pkg:cargo/bytecheck@0.8.2", + "purl": "pkg:cargo/bytecheck@0.8.3", "type": "library", - "version": "0.8.2" + "version": "0.8.3" }, { "bom-ref": "pkg:cargo/bytemuck@1.25.0?package-id=4691f2e92ae7ed04", @@ -75466,8 +79981,8 @@ "version": "1.12.1" }, { - "bom-ref": "pkg:deb/ubuntu/bzip2@1.0.8-5.1build0.1?arch=amd64&distro=ubuntu-24.04&package-id=6dbe1f804b1b7dd5", - "cpe": "cpe:2.3:a:bzip2:bzip2:1.0.8-5.1build0.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/bzip2@1.0.8-5.1ubuntu0.1?arch=amd64&distro=ubuntu-24.04&package-id=6e53b1117a29fd64", + "cpe": "cpe:2.3:a:bzip2:bzip2:1.0.8-5.1ubuntu0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -75482,9 +79997,9 @@ ], "name": "bzip2", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/bzip2@1.0.8-5.1build0.1?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/bzip2@1.0.8-5.1ubuntu0.1?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "1.0.8-5.1build0.1" + "version": "1.0.8-5.1ubuntu0.1" }, { "bom-ref": "pkg:deb/ubuntu/ca-certificates@20260601~24.04.1?arch=all&distro=ubuntu-24.04&package-id=90dbb1a8b8c2da5c", @@ -75514,8 +80029,8 @@ }, { "author": "Thomas Kemmer ", - "bom-ref": "pkg:pypi/cachetools@7.1.4?package-id=abedf8c21907c3d0", - "cpe": "cpe:2.3:a:thomas_kemmer_\\", - "bom-ref": "pkg:pypi/cbor2@6.1.2?package-id=b5e8f797fd68f776", - "cpe": "cpe:2.3:a:agronholm:cbor2:6.1.2:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/cbor2@6.1.4?package-id=fb8f03710d41f515", + "cpe": "cpe:2.3:a:agronholm:cbor2:6.1.4:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -75588,14 +80135,14 @@ } ], "name": "cbor2", - "purl": "pkg:pypi/cbor2@6.1.2", + "purl": "pkg:pypi/cbor2@6.1.4", "type": "library", - "version": "6.1.2" + "version": "6.1.4" }, { "author": "Kenneth Reitz ", - "bom-ref": "pkg:pypi/certifi@2026.2.25?package-id=ffc5ab6c6d4e6705", - "cpe": "cpe:2.3:a:certifi:certifi:2026.2.25:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/certifi@2026.7.22?package-id=a5b53b0c072beae6", + "cpe": "cpe:2.3:a:certifi:certifi:2026.7.22:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -75604,25 +80151,25 @@ } ], "name": "certifi", - "purl": "pkg:pypi/certifi@2026.2.25", + "purl": "pkg:pypi/certifi@2026.7.22", "type": "library", - "version": "2026.2.25" + "version": "2026.7.22" }, { "author": "Armin Rigo, Maciej Fijalkowski", - "bom-ref": "pkg:pypi/cffi@2.0.0?package-id=c1ac36eb7a5a6311", - "cpe": "cpe:2.3:a:armin_rigo\\,_maciej_fijalkowski_project:python-cffi:2.0.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/cffi@2.1.1?package-id=60ec72492c9bd24a", + "cpe": "cpe:2.3:a:armin_rigo\\,_maciej_fijalkowski_project:python-cffi:2.1.1:*:*:*:*:*:*:*", "licenses": [ { "license": { - "id": "MIT" + "id": "MIT-0" } } ], "name": "cffi", - "purl": "pkg:pypi/cffi@2.0.0", + "purl": "pkg:pypi/cffi@2.1.1", "type": "library", - "version": "2.0.0" + "version": "2.1.1" }, { "bom-ref": "pkg:cargo/cfg-if@1.0.4?package-id=629075812686903b", @@ -75642,19 +80189,19 @@ }, { "author": "Mark Pilgrim ", - "bom-ref": "pkg:pypi/chardet@5.2.0?package-id=b4c5f525ab660406", - "cpe": "cpe:2.3:a:mark_pilgrim_project:python-chardet:5.2.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/chardet@6.0.0.post1?package-id=f74af3780d594c1e", + "cpe": "cpe:2.3:a:mark_pilgrim_\\", - "bom-ref": "pkg:pypi/charset-normalizer@3.4.6?package-id=c9f4cf8927d7ed99", - "cpe": "cpe:2.3:a:\\\"ahmed_r__tahri\\\"_\\", @@ -75721,36 +80268,36 @@ "version": "0.4.4" }, { - "bom-ref": "pkg:cargo/clap@4.6.4?package-id=4de0e5100151f5b1", - "cpe": "cpe:2.3:a:clap:clap:4.6.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/clap@4.6.6?package-id=0b927352ada6ddfa", + "cpe": "cpe:2.3:a:clap:clap:4.6.6:*:*:*:*:*:*:*", "name": "clap", - "purl": "pkg:cargo/clap@4.6.4", + "purl": "pkg:cargo/clap@4.6.6", "type": "library", - "version": "4.6.4" + "version": "4.6.6" }, { - "bom-ref": "pkg:cargo/clap@4.6.4?package-id=77fd476d265d26a7", - "cpe": "cpe:2.3:a:clap:clap:4.6.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/clap@4.6.6?package-id=e48b668a7357cf33", + "cpe": "cpe:2.3:a:clap:clap:4.6.6:*:*:*:*:*:*:*", "name": "clap", - "purl": "pkg:cargo/clap@4.6.4", + "purl": "pkg:cargo/clap@4.6.6", "type": "library", - "version": "4.6.4" + "version": "4.6.6" }, { - "bom-ref": "pkg:cargo/clap_builder@4.6.2?package-id=da4fe0332ab2124a", - "cpe": "cpe:2.3:a:clap-builder:clap-builder:4.6.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/clap_builder@4.6.6?package-id=125af9102cb9108f", + "cpe": "cpe:2.3:a:clap-builder:clap-builder:4.6.6:*:*:*:*:*:*:*", "name": "clap_builder", - "purl": "pkg:cargo/clap_builder@4.6.2", + "purl": "pkg:cargo/clap_builder@4.6.6", "type": "library", - "version": "4.6.2" + "version": "4.6.6" }, { - "bom-ref": "pkg:cargo/clap_builder@4.6.2?package-id=f88ca8e3708f4b91", - "cpe": "cpe:2.3:a:clap-builder:clap-builder:4.6.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/clap_builder@4.6.6?package-id=d2e45eba1cf8af2c", + "cpe": "cpe:2.3:a:clap-builder:clap-builder:4.6.6:*:*:*:*:*:*:*", "name": "clap_builder", - "purl": "pkg:cargo/clap_builder@4.6.2", + "purl": "pkg:cargo/clap_builder@4.6.6", "type": "library", - "version": "4.6.2" + "version": "4.6.6" }, { "bom-ref": "pkg:cargo/clap_complete@4.6.0?package-id=8565abff521ae562", @@ -75877,8 +80424,8 @@ }, { "author": "Jean-Christophe Fillion-Robin ", - "bom-ref": "pkg:pypi/cmake@4.4.2?package-id=61a480ada804ace8", - "cpe": "cpe:2.3:a:jean_christophe_fillion_robin_\\", - "bom-ref": "pkg:pypi/coverage@7.13.5?package-id=a6e3e3056ef5d5ba", - "cpe": "cpe:2.3:a:ned_batchelder_and_253_others_project:python-coverage:7.13.5:*:*:*:*:*:*:*", + "author": "Ned Batchelder and 263 others ", + "bom-ref": "pkg:pypi/coverage@7.15.4?package-id=1116d29771803e12", + "cpe": "cpe:2.3:a:ned_batchelder_and_263_others_project:python-coverage:7.15.4:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -76129,9 +80692,9 @@ } ], "name": "coverage", - "purl": "pkg:pypi/coverage@7.13.5", + "purl": "pkg:pypi/coverage@7.15.4", "type": "library", - "version": "7.13.5" + "version": "7.15.4" }, { "bom-ref": "pkg:deb/ubuntu/cpp@4%3A13.2.0-7ubuntu1?arch=amd64&distro=ubuntu-24.04&package-id=eb3e4a5365ae61d2&upstream=gcc-defaults%401.214ubuntu1", @@ -76353,17 +80916,45 @@ }, { "author": "The Python Cryptographic Authority and individual contributors ", - "bom-ref": "pkg:pypi/cryptography@49.0.0?package-id=e96547be6491aad8", - "cpe": "cpe:2.3:a:cryptography.io:cryptography:49.0.0:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/cryptography@41.0.7?package-id=10851c6f62cd71db", + "cpe": "cpe:2.3:a:cryptography.io:cryptography:41.0.7:*:*:*:*:python:*:*", + "licenses": [ + { + "expression": "Apache-2.0 OR BSD-3-Clause" + } + ], + "name": "cryptography", + "purl": "pkg:pypi/cryptography@41.0.7", + "type": "library", + "version": "41.0.7" + }, + { + "author": "The Python Cryptographic Authority and individual contributors ", + "bom-ref": "pkg:pypi/cryptography@41.0.7?package-id=4fb75bcf5cd65cf7", + "cpe": "cpe:2.3:a:cryptography.io:cryptography:41.0.7:*:*:*:*:python:*:*", + "licenses": [ + { + "expression": "Apache-2.0 OR BSD-3-Clause" + } + ], + "name": "cryptography", + "purl": "pkg:pypi/cryptography@41.0.7", + "type": "library", + "version": "41.0.7" + }, + { + "author": "The Python Cryptographic Authority and individual contributors ", + "bom-ref": "pkg:pypi/cryptography@50.0.0?package-id=62fa1d57d57a173a", + "cpe": "cpe:2.3:a:cryptography.io:cryptography:50.0.0:*:*:*:*:python:*:*", "licenses": [ { "expression": "Apache-2.0 OR BSD-3-Clause" } ], "name": "cryptography", - "purl": "pkg:pypi/cryptography@49.0.0", + "purl": "pkg:pypi/cryptography@50.0.0", "type": "library", - "version": "49.0.0" + "version": "50.0.0" }, { "bom-ref": "pkg:cargo/csv@1.4.0?package-id=2aea87ed2ca90fb4", @@ -76430,8 +81021,8 @@ "version": "0.4.2" }, { - "bom-ref": "pkg:deb/ubuntu/curl@8.5.0-2ubuntu10.11?arch=amd64&distro=ubuntu-24.04&package-id=4e44815b16375016", - "cpe": "cpe:2.3:a:curl:curl:8.5.0-2ubuntu10.11:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/curl@8.5.0-2ubuntu10.13?arch=amd64&distro=ubuntu-24.04&package-id=594eac251cca4bde", + "cpe": "cpe:2.3:a:curl:curl:8.5.0-2ubuntu10.13:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -76486,9 +81077,9 @@ ], "name": "curl", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/curl@8.5.0-2ubuntu10.11?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/curl@8.5.0-2ubuntu10.13?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "8.5.0-2ubuntu10.11" + "version": "8.5.0-2ubuntu10.13" }, { "bom-ref": "pkg:cargo/cyclonedx-bom@0.8.1?package-id=1da1252df691f760", @@ -76554,25 +81145,25 @@ "version": "0.5.12-6ubuntu5" }, { - "bom-ref": "pkg:cargo/data-encoding@2.11.0?package-id=bfa774b530207f65", - "cpe": "cpe:2.3:a:data-encoding:data-encoding:2.11.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/data-encoding@2.11.1?package-id=05fb76eecb60dc40", + "cpe": "cpe:2.3:a:data-encoding:data-encoding:2.11.1:*:*:*:*:*:*:*", "name": "data-encoding", - "purl": "pkg:cargo/data-encoding@2.11.0", + "purl": "pkg:cargo/data-encoding@2.11.1", "type": "library", - "version": "2.11.0" + "version": "2.11.1" }, { - "bom-ref": "pkg:cargo/data-encoding@2.11.0?package-id=e0d3e9655c5cc596", - "cpe": "cpe:2.3:a:data-encoding:data-encoding:2.11.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/data-encoding@2.11.1?package-id=2abba0f9129f1d56", + "cpe": "cpe:2.3:a:data-encoding:data-encoding:2.11.1:*:*:*:*:*:*:*", "name": "data-encoding", - "purl": "pkg:cargo/data-encoding@2.11.0", + "purl": "pkg:cargo/data-encoding@2.11.1", "type": "library", - "version": "2.11.0" + "version": "2.11.1" }, { "author": "Tsuyoshi Hombashi ", - "bom-ref": "pkg:pypi/dataproperty@1.1.0?package-id=ba0d8639059a0363", - "cpe": "cpe:2.3:a:tsuyoshi_hombashi_project:python-dataproperty:1.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/dataproperty@1.1.1?package-id=595c3d4c3caeb3c3", + "cpe": "cpe:2.3:a:tsuyoshi_hombashi_project:python-dataproperty:1.1.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -76581,14 +81172,14 @@ } ], "name": "dataproperty", - "purl": "pkg:pypi/dataproperty@1.1.0", + "purl": "pkg:pypi/dataproperty@1.1.1", "type": "library", - "version": "1.1.0" + "version": "1.1.1" }, { "author": "HuggingFace Inc. ", - "bom-ref": "pkg:pypi/datasets@4.8.4?package-id=4fbdfccae2867247", - "cpe": "cpe:2.3:a:huggingface_inc__project:python-datasets:4.8.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/datasets@5.0.1?package-id=7189179ca3c0d101", + "cpe": "cpe:2.3:a:huggingface_inc__project:python-datasets:5.0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -76597,9 +81188,379 @@ } ], "name": "datasets", - "purl": "pkg:pypi/datasets@4.8.4", + "purl": "pkg:pypi/datasets@5.0.1", "type": "library", - "version": "4.8.4" + "version": "5.0.1" + }, + { + "bom-ref": "pkg:deb/ubuntu/dbus@1.14.10-4ubuntu4.1?arch=amd64&distro=ubuntu-24.04&package-id=2cef6fa65c81d1a0", + "cpe": "cpe:2.3:a:dbus:dbus:1.14.10-4ubuntu4.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.1" + } + }, + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "name": "BSD-3-clause-generic" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "FSF-unlimited-permission" + } + }, + { + "license": { + "name": "Tcl-BSDish" + } + }, + { + "license": { + "name": "autoconf-archive-permissive" + } + }, + { + "license": { + "name": "g10-permissive" + } + } + ], + "name": "dbus", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/dbus@1.14.10-4ubuntu4.1?arch=amd64&distro=ubuntu-24.04", + "type": "library", + "version": "1.14.10-4ubuntu4.1" + }, + { + "bom-ref": "pkg:deb/ubuntu/dbus-bin@1.14.10-4ubuntu4.1?arch=amd64&distro=ubuntu-24.04&package-id=2ade109c2ce28594&upstream=dbus", + "cpe": "cpe:2.3:a:dbus-bin:dbus-bin:1.14.10-4ubuntu4.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.1" + } + }, + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "name": "BSD-3-clause-generic" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "FSF-unlimited-permission" + } + }, + { + "license": { + "name": "Tcl-BSDish" + } + }, + { + "license": { + "name": "autoconf-archive-permissive" + } + }, + { + "license": { + "name": "g10-permissive" + } + } + ], + "name": "dbus-bin", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/dbus-bin@1.14.10-4ubuntu4.1?arch=amd64&distro=ubuntu-24.04&upstream=dbus", + "type": "library", + "version": "1.14.10-4ubuntu4.1" + }, + { + "bom-ref": "pkg:deb/ubuntu/dbus-daemon@1.14.10-4ubuntu4.1?arch=amd64&distro=ubuntu-24.04&package-id=6f3598c4e663079e&upstream=dbus", + "cpe": "cpe:2.3:a:dbus-daemon:dbus-daemon:1.14.10-4ubuntu4.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.1" + } + }, + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "name": "BSD-3-clause-generic" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "FSF-unlimited-permission" + } + }, + { + "license": { + "name": "Tcl-BSDish" + } + }, + { + "license": { + "name": "autoconf-archive-permissive" + } + }, + { + "license": { + "name": "g10-permissive" + } + } + ], + "name": "dbus-daemon", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/dbus-daemon@1.14.10-4ubuntu4.1?arch=amd64&distro=ubuntu-24.04&upstream=dbus", + "type": "library", + "version": "1.14.10-4ubuntu4.1" + }, + { + "bom-ref": "pkg:pypi/dbus-python@1.3.2?package-id=ab2038e3d3c30660", + "cpe": "cpe:2.3:a:python-dbus-python:python-dbus-python:1.3.2:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "Expat (MIT/X11)" + } + } + ], + "name": "dbus-python", + "purl": "pkg:pypi/dbus-python@1.3.2", + "type": "library", + "version": "1.3.2" + }, + { + "bom-ref": "pkg:deb/ubuntu/dbus-session-bus-common@1.14.10-4ubuntu4.1?arch=all&distro=ubuntu-24.04&package-id=f2fd35ab3b3e54ed&upstream=dbus", + "cpe": "cpe:2.3:a:dbus-session-bus-common:dbus-session-bus-common:1.14.10-4ubuntu4.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.1" + } + }, + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "name": "BSD-3-clause-generic" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "FSF-unlimited-permission" + } + }, + { + "license": { + "name": "Tcl-BSDish" + } + }, + { + "license": { + "name": "autoconf-archive-permissive" + } + }, + { + "license": { + "name": "g10-permissive" + } + } + ], + "name": "dbus-session-bus-common", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/dbus-session-bus-common@1.14.10-4ubuntu4.1?arch=all&distro=ubuntu-24.04&upstream=dbus", + "type": "library", + "version": "1.14.10-4ubuntu4.1" + }, + { + "bom-ref": "pkg:deb/ubuntu/dbus-system-bus-common@1.14.10-4ubuntu4.1?arch=all&distro=ubuntu-24.04&package-id=bd0fe2d33f2b964c&upstream=dbus", + "cpe": "cpe:2.3:a:dbus-system-bus-common:dbus-system-bus-common:1.14.10-4ubuntu4.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.1" + } + }, + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "name": "BSD-3-clause-generic" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "FSF-unlimited-permission" + } + }, + { + "license": { + "name": "Tcl-BSDish" + } + }, + { + "license": { + "name": "autoconf-archive-permissive" + } + }, + { + "license": { + "name": "g10-permissive" + } + } + ], + "name": "dbus-system-bus-common", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/dbus-system-bus-common@1.14.10-4ubuntu4.1?arch=all&distro=ubuntu-24.04&upstream=dbus", + "type": "library", + "version": "1.14.10-4ubuntu4.1" }, { "bom-ref": "pkg:cargo/deadpool@0.12.3?package-id=18666283dd2a7ca1", @@ -76682,8 +81643,8 @@ }, { "author": "Michele Simionato ", - "bom-ref": "pkg:pypi/decorator@5.2.1?package-id=b0b52270a216bce1", - "cpe": "cpe:2.3:a:python:decorator:5.2.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/decorator@5.3.1?package-id=dc425a89850df382", + "cpe": "cpe:2.3:a:python:decorator:5.3.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -76692,9 +81653,9 @@ } ], "name": "decorator", - "purl": "pkg:pypi/decorator@5.2.1", + "purl": "pkg:pypi/decorator@5.3.1", "type": "library", - "version": "5.2.1" + "version": "5.3.1" }, { "bom-ref": "pkg:cargo/defmt@1.1.0?package-id=22db4479714dc97a", @@ -76744,6 +81705,22 @@ "type": "library", "version": "1.0.0" }, + { + "author": "Christian Heimes ", + "bom-ref": "pkg:pypi/defusedxml@0.7.1?package-id=fd1a281335bea2b4", + "cpe": "cpe:2.3:a:christian_heimes_project:python-defusedxml:0.7.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "PSFL" + } + } + ], + "name": "defusedxml", + "purl": "pkg:pypi/defusedxml@0.7.1", + "type": "library", + "version": "0.7.1" + }, { "author": "Kaichao You ", "bom-ref": "pkg:pypi/depyf@0.20.0?package-id=8f509084e535f6e8", @@ -77043,6 +82020,22 @@ "type": "library", "version": "0.2.5" }, + { + "author": "Nir Cohen ", + "bom-ref": "pkg:pypi/distro@1.9.0?package-id=11d935058498a00f", + "cpe": "cpe:2.3:a:nir_cohen_project:python-distro:1.9.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "Apache License, Version 2.0" + } + } + ], + "name": "distro", + "purl": "pkg:pypi/distro@1.9.0", + "type": "library", + "version": "1.9.0" + }, { "author": "Nir Cohen ", "bom-ref": "pkg:pypi/distro@1.9.0?package-id=725a363ecd5fa714", @@ -77059,6 +82052,22 @@ "type": "library", "version": "1.9.0" }, + { + "bom-ref": "pkg:deb/ubuntu/distro-info-data@0.72-0ubuntu0.24.04.1?arch=all&distro=ubuntu-24.04&package-id=869e1091b62b44c8", + "cpe": "cpe:2.3:a:distro-info-data:distro-info-data:0.72-0ubuntu0.24.04.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "ISC" + } + } + ], + "name": "distro-info-data", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/distro-info-data@0.72-0ubuntu0.24.04.1?arch=all&distro=ubuntu-24.04", + "type": "library", + "version": "0.72-0ubuntu0.24.04.1" + }, { "bom-ref": "pkg:cargo/dlv-list@0.5.2?package-id=cf5ed38cf8260426", "cpe": "cpe:2.3:a:dlv-list:dlv-list:0.5.2:*:*:*:*:*:*:*", @@ -77092,8 +82101,8 @@ "version": "2.8.0" }, { - "bom-ref": "pkg:pypi/docker@7.1.0?package-id=a6b671b95073f5e2", - "cpe": "cpe:2.3:a:python-docker:python-docker:7.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/docker@7.2.0?package-id=102603c1ed9c730e", + "cpe": "cpe:2.3:a:python-docker:python-docker:7.2.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -77102,9 +82111,9 @@ } ], "name": "docker", - "purl": "pkg:pypi/docker@7.1.0", + "purl": "pkg:pypi/docker@7.2.0", "type": "library", - "version": "7.1.0" + "version": "7.2.0" }, { "author": "Vladimir Keleshev ", @@ -77375,20 +82384,20 @@ "version": "0.8.35" }, { - "bom-ref": "pkg:cargo/encoding_rs_io@0.1.7?package-id=09fd1128a4b6f6c8", - "cpe": "cpe:2.3:a:encoding-rs-io:encoding-rs-io:0.1.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/encoding_rs_io@0.1.8?package-id=a04ebc31b5ce8f15", + "cpe": "cpe:2.3:a:encoding-rs-io:encoding-rs-io:0.1.8:*:*:*:*:*:*:*", "name": "encoding_rs_io", - "purl": "pkg:cargo/encoding_rs_io@0.1.7", + "purl": "pkg:cargo/encoding_rs_io@0.1.8", "type": "library", - "version": "0.1.7" + "version": "0.1.8" }, { - "bom-ref": "pkg:cargo/encoding_rs_io@0.1.7?package-id=db54260a0eedb88b", - "cpe": "cpe:2.3:a:encoding-rs-io:encoding-rs-io:0.1.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/encoding_rs_io@0.1.8?package-id=a89fdf2f5ae9e0e5", + "cpe": "cpe:2.3:a:encoding-rs-io:encoding-rs-io:0.1.8:*:*:*:*:*:*:*", "name": "encoding_rs_io", - "purl": "pkg:cargo/encoding_rs_io@0.1.7", + "purl": "pkg:cargo/encoding_rs_io@0.1.8", "type": "library", - "version": "0.1.7" + "version": "0.1.8" }, { "bom-ref": "pkg:cargo/endi@1.1.1?package-id=911573c7fd9b0993", @@ -77471,8 +82480,8 @@ "version": "0.3.14" }, { - "bom-ref": "pkg:maven/com.google.errorprone/error_prone_annotations@2.18.0?package-id=28e6bf7e8033acd0", - "cpe": "cpe:2.3:a:error-prone-annotations:error-prone-annotations:2.18.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:maven/com.google.errorprone/error_prone_annotations@2.27.0?package-id=52036c3226ea844f", + "cpe": "cpe:2.3:a:error-prone-annotations:error-prone-annotations:2.27.0:*:*:*:*:*:*:*", "group": "com.google.errorprone", "licenses": [ { @@ -77483,9 +82492,9 @@ } ], "name": "error_prone_annotations", - "purl": "pkg:maven/com.google.errorprone/error_prone_annotations@2.18.0", + "purl": "pkg:maven/com.google.errorprone/error_prone_annotations@2.27.0", "type": "library", - "version": "2.18.0" + "version": "2.27.0" }, { "bom-ref": "pkg:cargo/etcetera@0.11.0?package-id=d2cb2b2b70e049aa", @@ -77562,8 +82571,8 @@ }, { "author": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "bom-ref": "pkg:pypi/fastapi@0.135.2?package-id=6cf66ab45174b837", - "cpe": "cpe:2.3:a:python-fastapi:python-fastapi:0.135.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/fastapi@0.136.3?package-id=2f1179de8cc07191", + "cpe": "cpe:2.3:a:python-fastapi:python-fastapi:0.136.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -77572,14 +82581,14 @@ } ], "name": "fastapi", - "purl": "pkg:pypi/fastapi@0.135.2", + "purl": "pkg:pypi/fastapi@0.136.3", "type": "library", - "version": "0.135.2" + "version": "0.136.3" }, { "author": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "bom-ref": "pkg:pypi/fastapi-cli@0.0.27?package-id=242801976d85073e", - "cpe": "cpe:2.3:a:python-fastapi-cli:python-fastapi-cli:0.0.27:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/fastapi-cli@0.0.32?package-id=43dac633bb4d986b", + "cpe": "cpe:2.3:a:python-fastapi-cli:python-fastapi-cli:0.0.32:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -77588,14 +82597,14 @@ } ], "name": "fastapi-cli", - "purl": "pkg:pypi/fastapi-cli@0.0.27", + "purl": "pkg:pypi/fastapi-cli@0.0.32", "type": "library", - "version": "0.0.27" + "version": "0.0.32" }, { "author": "Patrick Arminio ", - "bom-ref": "pkg:pypi/fastapi-cloud-cli@0.21.0?package-id=4aecfe418d25723b", - "cpe": "cpe:2.3:a:patrick_arminio_\\", @@ -77742,16 +82751,16 @@ "version": "7:6.1.1-3ubuntu5" }, { - "bom-ref": "pkg:generic/ffmpeg@8.0.1?package-id=801b4a170aabd72f", - "cpe": "cpe:2.3:a:ffmpeg:ffmpeg:8.0.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:generic/ffmpeg@8.1.1?package-id=85be8d21d269494f", + "cpe": "cpe:2.3:a:ffmpeg:ffmpeg:8.1.1:*:*:*:*:*:*:*", "name": "ffmpeg", - "purl": "pkg:generic/ffmpeg@8.0.1", + "purl": "pkg:generic/ffmpeg@8.1.1", "type": "application", - "version": "8.0.1" + "version": "8.1.1" }, { - "bom-ref": "pkg:pypi/filelock@3.25.2?package-id=b90d7a9a8288fc21", - "cpe": "cpe:2.3:a:python-filelock:python-filelock:3.25.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/filelock@3.32.3?package-id=b43fb02b1f19655a", + "cpe": "cpe:2.3:a:python-filelock:python-filelock:3.32.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -77760,9 +82769,9 @@ } ], "name": "filelock", - "purl": "pkg:pypi/filelock@3.25.2", + "purl": "pkg:pypi/filelock@3.32.3", "type": "library", - "version": "3.25.2" + "version": "3.32.3" }, { "bom-ref": "pkg:cargo/filetime@0.2.29?package-id=1e4e8ff4adfaa847", @@ -78145,8 +83154,24 @@ "version": "3.3.1" }, { - "bom-ref": "pkg:pypi/fsspec@2026.2.0?package-id=5ffa0b3d54cf5b64", - "cpe": "cpe:2.3:a:python-fsspec:python-fsspec:2026.2.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/fs-set-times@0.20.3?package-id=43646d6b810a8794", + "cpe": "cpe:2.3:a:fs-set-times:fs-set-times:0.20.3:*:*:*:*:*:*:*", + "name": "fs-set-times", + "purl": "pkg:cargo/fs-set-times@0.20.3", + "type": "library", + "version": "0.20.3" + }, + { + "bom-ref": "pkg:cargo/fs-set-times@0.20.3?package-id=88cefaa43bbee8f4", + "cpe": "cpe:2.3:a:fs-set-times:fs-set-times:0.20.3:*:*:*:*:*:*:*", + "name": "fs-set-times", + "purl": "pkg:cargo/fs-set-times@0.20.3", + "type": "library", + "version": "0.20.3" + }, + { + "bom-ref": "pkg:pypi/fsspec@2026.6.0?package-id=3eddaa28b7465843", + "cpe": "cpe:2.3:a:python-fsspec:python-fsspec:2026.6.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -78155,9 +83180,9 @@ } ], "name": "fsspec", - "purl": "pkg:pypi/fsspec@2026.2.0", + "purl": "pkg:pypi/fsspec@2026.6.0", "type": "library", - "version": "2026.2.0" + "version": "2026.6.0" }, { "bom-ref": "pkg:maven/de.ruedigermoeller/fst@2.57?package-id=ba66c44638075d8d", @@ -78564,6 +83589,294 @@ "type": "library", "version": "0.4.3" }, + { + "bom-ref": "pkg:deb/ubuntu/gir1.2-girepository-2.0@1.80.1-1?arch=amd64&distro=ubuntu-24.04&package-id=f76ea6b024529c84&upstream=gobject-introspection", + "cpe": "cpe:2.3:a:gir1.2-girepository-2.0:gir1.2-girepository-2.0:1.80.1-1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.0" + } + }, + { + "license": { + "id": "Apache-2.0" + } + }, + { + "license": { + "id": "BSD-2-Clause" + } + }, + { + "license": { + "id": "CC-BY-SA-3.0" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "FSFAP" + } + }, + { + "license": { + "id": "FSFULLR" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.0-only" + } + }, + { + "license": { + "id": "LGPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "id": "MPL-1.1" + } + }, + { + "license": { + "id": "Unicode-DFS-2016" + } + }, + { + "license": { + "id": "bzip2-1.0.6" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "GPL" + } + }, + { + "license": { + "name": "Kuchling-PD" + } + }, + { + "license": { + "name": "Plumb-PD" + } + } + ], + "name": "gir1.2-girepository-2.0", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/gir1.2-girepository-2.0@1.80.1-1?arch=amd64&distro=ubuntu-24.04&upstream=gobject-introspection", + "type": "library", + "version": "1.80.1-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/gir1.2-glib-2.0@2.80.0-6ubuntu3.8?arch=amd64&distro=ubuntu-24.04&package-id=be19a3f704748abd&upstream=glib2.0", + "cpe": "cpe:2.3:a:gir1.2-glib-2.0:gir1.2-glib-2.0:2.80.0-6ubuntu3.8:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.0" + } + }, + { + "license": { + "id": "Apache-2.0" + } + }, + { + "license": { + "id": "CC-BY-SA-3.0" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "FSFULLR" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.0-only" + } + }, + { + "license": { + "id": "LGPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "id": "MPL-1.1" + } + }, + { + "license": { + "id": "Unicode-DFS-2016" + } + }, + { + "license": { + "id": "bzip2-1.0.6" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "Iconv-PD" + } + }, + { + "license": { + "name": "Janik-permissive" + } + }, + { + "license": { + "name": "Kuchling-PD" + } + }, + { + "license": { + "name": "Mingw-PD" + } + }, + { + "license": { + "name": "Plumb-PD" + } + }, + { + "license": { + "name": "cmph" + } + }, + { + "license": { + "name": "old-glib-tests" + } + } + ], + "name": "gir1.2-glib-2.0", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/gir1.2-glib-2.0@2.80.0-6ubuntu3.8?arch=amd64&distro=ubuntu-24.04&upstream=glib2.0", + "type": "library", + "version": "2.80.0-6ubuntu3.8" + }, + { + "bom-ref": "pkg:deb/ubuntu/gir1.2-packagekitglib-1.0@1.2.8-2ubuntu1.5?arch=amd64&distro=ubuntu-24.04&package-id=2d3816a76148728c&upstream=packagekit", + "cpe": "cpe:2.3:a:gir1.2-packagekitglib-1.0:gir1.2-packagekitglib-1.0:1.2.8-2ubuntu1.5:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "FSFAP" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + } + ], + "name": "gir1.2-packagekitglib-1.0", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/gir1.2-packagekitglib-1.0@1.2.8-2ubuntu1.5?arch=amd64&distro=ubuntu-24.04&upstream=packagekit", + "type": "library", + "version": "1.2.8-2ubuntu1.5" + }, { "bom-ref": "pkg:deb/ubuntu/git@1%3A2.43.0-1ubuntu7.3?arch=amd64&distro=ubuntu-24.04&package-id=8da8a7d75fe5f6ac", "cpe": "cpe:2.3:a:git:git:1\\:2.43.0-1ubuntu7.3:*:*:*:*:*:*:*", @@ -78783,20 +84096,20 @@ "version": "0.3.4" }, { - "bom-ref": "pkg:cargo/globset@0.4.19?package-id=4415d997ca22acb4", - "cpe": "cpe:2.3:a:globset:globset:0.4.19:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/globset@0.4.20?package-id=7fff9fc0c56b47c9", + "cpe": "cpe:2.3:a:globset:globset:0.4.20:*:*:*:*:*:*:*", "name": "globset", - "purl": "pkg:cargo/globset@0.4.19", + "purl": "pkg:cargo/globset@0.4.20", "type": "library", - "version": "0.4.19" + "version": "0.4.20" }, { - "bom-ref": "pkg:cargo/globset@0.4.19?package-id=954e57d56204052c", - "cpe": "cpe:2.3:a:globset:globset:0.4.19:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/globset@0.4.20?package-id=d44bfb454427b6c5", + "cpe": "cpe:2.3:a:globset:globset:0.4.20:*:*:*:*:*:*:*", "name": "globset", - "purl": "pkg:cargo/globset@0.4.19", + "purl": "pkg:cargo/globset@0.4.20", "type": "library", - "version": "0.4.19" + "version": "0.4.20" }, { "bom-ref": "pkg:cargo/globwalk@0.9.1?package-id=898ca481599bbd96", @@ -78832,8 +84145,8 @@ }, { "author": "Google LLC ", - "bom-ref": "pkg:pypi/googleapis-common-protos@1.75.0?package-id=eb24888ab80ddd59", - "cpe": "cpe:2.3:a:google_llc_\\", - "purl": "pkg:deb/ubuntu/gpg@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpg@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&package-id=01dc27f70abb0078&upstream=gnupg2", - "cpe": "cpe:2.3:a:gpgconf:gpgconf:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&package-id=9ff230767a747dbe&upstream=gnupg2", + "cpe": "cpe:2.3:a:gpgconf:gpgconf:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -79004,13 +84317,13 @@ ], "name": "gpgconf", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&package-id=c523498c8ece7464&upstream=gnupg2", - "cpe": "cpe:2.3:a:gpgv:gpgv:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&package-id=db9250ad2fb3f819&upstream=gnupg2", + "cpe": "cpe:2.3:a:gpgv:gpgv:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -79085,22 +84398,22 @@ ], "name": "gpgv", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:pypi/gpt-oss@0.0.8?package-id=56a36e17864661e9", - "cpe": "cpe:2.3:a:python-gpt-oss:python-gpt-oss:0.0.8:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/gpt-oss@0.0.9?package-id=1a2d3c88388f320c", + "cpe": "cpe:2.3:a:python-gpt-oss:python-gpt-oss:0.0.9:*:*:*:*:*:*:*", "name": "gpt-oss", - "purl": "pkg:pypi/gpt-oss@0.0.8", + "purl": "pkg:pypi/gpt-oss@0.0.9", "type": "library", - "version": "0.0.8" + "version": "0.0.9" }, { "author": "Christoph Zwerschke ", - "bom-ref": "pkg:pypi/graphql-core@3.2.8?package-id=776ad73eec85efe1", - "cpe": "cpe:2.3:a:christoph_zwerschke_project:python-graphql-core:3.2.8:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/graphql-core@3.2.11?package-id=2bc5cc17c7911c64", + "cpe": "cpe:2.3:a:christoph_zwerschke_project:python-graphql-core:3.2.11:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -79109,9 +84422,9 @@ } ], "name": "graphql-core", - "purl": "pkg:pypi/graphql-core@3.2.8", + "purl": "pkg:pypi/graphql-core@3.2.11", "type": "library", - "version": "3.2.8" + "version": "3.2.11" }, { "bom-ref": "pkg:deb/ubuntu/grep@3.11-4build1?arch=amd64&distro=ubuntu-24.04&package-id=f0aa2fa812feea5d", @@ -79136,8 +84449,8 @@ }, { "author": "The gRPC Authors ", - "bom-ref": "pkg:pypi/grpcio@1.81.1?package-id=8526b4ce411bc046", - "cpe": "cpe:2.3:a:grpc_authors_\\", - "bom-ref": "pkg:pypi/grpcio-tools@1.83.0?package-id=2b6ad55753e0cc02", - "cpe": "cpe:2.3:a:grpc_authors_\\", - "bom-ref": "pkg:pypi/harfile@0.4.0?package-id=d7a8c1c6d4761e47", - "cpe": "cpe:2.3:a:dmitry_dygalo_\\", @@ -79496,20 +84809,20 @@ "version": "2025.4.15" }, { - "bom-ref": "pkg:cargo/http@1.4.2?package-id=a2ba3e4a9ab14183", - "cpe": "cpe:2.3:a:http:http:1.4.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/http@1.5.0?package-id=01c7f707e650eba1", + "cpe": "cpe:2.3:a:http:http:1.5.0:*:*:*:*:*:*:*", "name": "http", - "purl": "pkg:cargo/http@1.4.2", + "purl": "pkg:cargo/http@1.5.0", "type": "library", - "version": "1.4.2" + "version": "1.5.0" }, { - "bom-ref": "pkg:cargo/http@1.4.2?package-id=e1553ace6b4ae6ea", - "cpe": "cpe:2.3:a:http:http:1.4.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/http@1.5.0?package-id=3a054e6eb284b6ab", + "cpe": "cpe:2.3:a:http:http:1.5.0:*:*:*:*:*:*:*", "name": "http", - "purl": "pkg:cargo/http@1.4.2", + "purl": "pkg:cargo/http@1.5.0", "type": "library", - "version": "1.4.2" + "version": "1.5.0" }, { "bom-ref": "pkg:cargo/http-body@1.0.1?package-id=305fe6806c282d02", @@ -79632,6 +84945,22 @@ "type": "library", "version": "1.0.3" }, + { + "author": "Joe Gregorio ", + "bom-ref": "pkg:pypi/httplib2@0.20.4?package-id=dd7e48fc5226ff53", + "cpe": "cpe:2.3:a:httplib2_project:httplib2:0.20.4:*:*:*:*:python:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], + "name": "httplib2", + "purl": "pkg:pypi/httplib2@0.20.4", + "type": "library", + "version": "0.20.4" + }, { "author": "Yury Selivanov ", "bom-ref": "pkg:pypi/httptools@0.8.0?package-id=8d5f9dfe7a7f7bb3", @@ -79664,22 +84993,6 @@ "type": "library", "version": "0.28.1" }, - { - "author": "Florimond Manca ", - "bom-ref": "pkg:pypi/httpx-sse@0.4.3?package-id=6ffc4ec5121e4e83", - "cpe": "cpe:2.3:a:florimond_manca_\\", "bom-ref": "pkg:pypi/httpx2@2.10.0?package-id=ccc6d9cc91fd3b29", @@ -79698,8 +85011,8 @@ }, { "author": "Hugging Face, Inc. ", - "bom-ref": "pkg:pypi/huggingface-hub@1.22.0?package-id=b61742da64eacb43", - "cpe": "cpe:2.3:a:hugging_face\\,_inc__project:python-huggingface-hub:1.22.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/huggingface-hub@1.28.0?package-id=6522806551573232", + "cpe": "cpe:2.3:a:hugging_face\\,_inc__project:python-huggingface-hub:1.28.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -79708,9 +85021,9 @@ } ], "name": "huggingface-hub", - "purl": "pkg:pypi/huggingface-hub@1.22.0", + "purl": "pkg:pypi/huggingface-hub@1.28.0", "type": "library", - "version": "1.22.0" + "version": "1.28.0" }, { "bom-ref": "pkg:cargo/hybrid-array@0.4.13?package-id=d8be31a3c14e9cec", @@ -79778,8 +85091,8 @@ }, { "author": "\"David R. MacIver and Zac Hatfield-Dodds\" ", - "bom-ref": "pkg:pypi/hypothesis@6.151.10?package-id=aafeba3deb8df99a", - "cpe": "cpe:2.3:a:\\\"david_r__maciver_and_zac_hatfield_dodds\\\"_\\", - "bom-ref": "pkg:pypi/hypothesis-graphql@0.12.0?package-id=6b02cc664336c40e", - "cpe": "cpe:2.3:a:dmitry_dygalo_\\", @@ -80005,8 +85318,8 @@ }, { "author": "Kim Davies ", - "bom-ref": "pkg:pypi/idna@3.11?package-id=417bfadea9ae2d0b", - "cpe": "cpe:2.3:a:kjd:internationalized_domain_names_in_applications:3.11:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/idna@3.15?package-id=0aadcb825804df13", + "cpe": "cpe:2.3:a:kjd:internationalized_domain_names_in_applications:3.15:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -80015,13 +85328,13 @@ } ], "name": "idna", - "purl": "pkg:pypi/idna@3.11", + "purl": "pkg:pypi/idna@3.15", "type": "library", - "version": "3.11" + "version": "3.15" }, { "author": "Kim Davies ", - "bom-ref": "pkg:pypi/idna@3.18?package-id=a6a4e5d752ca7013", + "bom-ref": "pkg:pypi/idna@3.18?package-id=0eb48bc867ad9ce6", "cpe": "cpe:2.3:a:kjd:internationalized_domain_names_in_applications:3.18:*:*:*:*:python:*:*", "licenses": [ { @@ -80052,34 +85365,34 @@ "version": "1.2.1" }, { - "bom-ref": "pkg:cargo/ignore@0.4.31?package-id=3013d9912213bc76", - "cpe": "cpe:2.3:a:ignore:ignore:0.4.31:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/ignore@0.4.33?package-id=1e1757a154058fb3", + "cpe": "cpe:2.3:a:ignore:ignore:0.4.33:*:*:*:*:*:*:*", "name": "ignore", - "purl": "pkg:cargo/ignore@0.4.31", + "purl": "pkg:cargo/ignore@0.4.33", "type": "library", - "version": "0.4.31" + "version": "0.4.33" }, { - "bom-ref": "pkg:cargo/ignore@0.4.31?package-id=5e62ff488e938663", - "cpe": "cpe:2.3:a:ignore:ignore:0.4.31:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/ignore@0.4.33?package-id=7367c84dac385693", + "cpe": "cpe:2.3:a:ignore:ignore:0.4.33:*:*:*:*:*:*:*", "name": "ignore", - "purl": "pkg:cargo/ignore@0.4.31", + "purl": "pkg:cargo/ignore@0.4.33", "type": "library", - "version": "0.4.31" + "version": "0.4.33" }, { "author": "Rodrigo Tobar , Ivan Sagalaev ", - "bom-ref": "pkg:pypi/ijson@3.5.0?package-id=413015f1be40fddb", - "cpe": "cpe:2.3:a:rodrigo_tobar_\\", "bom-ref": "pkg:pypi/impi-rt@2021.18.0?package-id=3660bfdea8a541c4", @@ -80193,22 +85490,6 @@ "type": "library", "version": "2.0.7" }, - { - "author": "Ronny Pfannschmidt, Holger Krekel ", - "bom-ref": "pkg:pypi/iniconfig@1.1.1?package-id=116d924a442d5df3", - "cpe": "cpe:2.3:a:ronny_pfannschmidt\\,_holger_krekel_project:python-iniconfig:1.1.1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "MIT License" - } - } - ], - "name": "iniconfig", - "purl": "pkg:pypi/iniconfig@1.1.1", - "type": "library", - "version": "1.1.1" - }, { "author": "Ronny Pfannschmidt , Holger Krekel ", "bom-ref": "pkg:pypi/iniconfig@2.3.0?package-id=03bb60dd39b11164", @@ -80332,26 +85613,79 @@ "version": "2026.0.0" }, { - "bom-ref": "pkg:deb/ubuntu/intel-igc-core-2@2.34.4?arch=amd64&distro=ubuntu-24.04&package-id=ca3ce2bfd7b8a31f", - "cpe": "cpe:2.3:a:intel-igc-core-2:intel-igc-core-2:2.34.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/intel-igc-core-2@2.38.2?arch=amd64&distro=ubuntu-24.04&package-id=a8a03a24f41430c1", + "cpe": "cpe:2.3:a:intel-igc-core-2:intel-igc-core-2:2.38.2:*:*:*:*:*:*:*", "name": "intel-igc-core-2", "publisher": "intel", - "purl": "pkg:deb/ubuntu/intel-igc-core-2@2.34.4?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/intel-igc-core-2@2.38.2?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "2.34.4" + "version": "2.38.2" }, { - "bom-ref": "pkg:deb/ubuntu/intel-igc-opencl-2@2.34.4?arch=amd64&distro=ubuntu-24.04&package-id=f625908371ebae0a", - "cpe": "cpe:2.3:a:intel-igc-opencl-2:intel-igc-opencl-2:2.34.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/intel-igc-opencl-2@2.38.2?arch=amd64&distro=ubuntu-24.04&package-id=23abfac74978b5fd", + "cpe": "cpe:2.3:a:intel-igc-opencl-2:intel-igc-opencl-2:2.38.2:*:*:*:*:*:*:*", "name": "intel-igc-opencl-2", "publisher": "intel", - "purl": "pkg:deb/ubuntu/intel-igc-opencl-2@2.34.4?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/intel-igc-opencl-2@2.38.2?arch=amd64&distro=ubuntu-24.04", + "type": "library", + "version": "2.38.2" + }, + { + "bom-ref": "pkg:deb/ubuntu/intel-media-va-driver-non-free@26.3.2-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&package-id=ede4cf9d5d91e523&upstream=intel-media-driver-non-free", + "cpe": "cpe:2.3:a:intel-media-va-driver-non-free:intel-media-va-driver-non-free:26.3.2-1\\~24.04\\~ppa1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "name": "Expat" + } + } + ], + "name": "intel-media-va-driver-non-free", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/intel-media-va-driver-non-free@26.3.2-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&upstream=intel-media-driver-non-free", "type": "library", - "version": "2.34.4" + "version": "26.3.2-1~24.04~ppa1" }, { - "bom-ref": "pkg:deb/ubuntu/intel-ocloc@26.18.38308.1-0?arch=amd64&distro=ubuntu-24.04&package-id=9cc70a41a4a474b1&upstream=intel-compute-runtime", - "cpe": "cpe:2.3:a:intel-ocloc:intel-ocloc:26.18.38308.1-0:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/intel-metrics-discovery@1.14.188-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&package-id=2c2daddc1153597f&upstream=metrics-discovery", + "cpe": "cpe:2.3:a:intel-metrics-discovery:intel-metrics-discovery:1.14.188-1\\~24.04\\~ppa1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], + "name": "intel-metrics-discovery", + "publisher": "Intel Graphics Team ", + "purl": "pkg:deb/ubuntu/intel-metrics-discovery@1.14.188-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&upstream=metrics-discovery", + "type": "library", + "version": "1.14.188-1~24.04~ppa1" + }, + { + "bom-ref": "pkg:deb/ubuntu/intel-metrics-library@1.0.231-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&package-id=6f1f6e9c6b366cff&upstream=metrics-library", + "cpe": "cpe:2.3:a:intel-metrics-library:intel-metrics-library:1.0.231-1\\~24.04\\~ppa1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], + "name": "intel-metrics-library", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/intel-metrics-library@1.0.231-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&upstream=metrics-library", + "type": "library", + "version": "1.0.231-1~24.04~ppa1" + }, + { + "bom-ref": "pkg:deb/ubuntu/intel-ocloc@26.27.39122.11-0?arch=amd64&distro=ubuntu-24.04&package-id=fecb2579993c9578&upstream=intel-compute-runtime", + "cpe": "cpe:2.3:a:intel-ocloc:intel-ocloc:26.27.39122.11-0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -80371,13 +85705,13 @@ ], "name": "intel-ocloc", "publisher": "Intel Graphics Team ", - "purl": "pkg:deb/ubuntu/intel-ocloc@26.18.38308.1-0?arch=amd64&distro=ubuntu-24.04&upstream=intel-compute-runtime", + "purl": "pkg:deb/ubuntu/intel-ocloc@26.27.39122.11-0?arch=amd64&distro=ubuntu-24.04&upstream=intel-compute-runtime", "type": "library", - "version": "26.18.38308.1-0" + "version": "26.27.39122.11-0" }, { - "bom-ref": "pkg:deb/ubuntu/intel-opencl-icd@26.18.38308.1-0?arch=amd64&distro=ubuntu-24.04&package-id=532cc16cbdaaec1a&upstream=intel-compute-runtime", - "cpe": "cpe:2.3:a:intel-opencl-icd:intel-opencl-icd:26.18.38308.1-0:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/intel-opencl-icd@26.27.39122.11-0?arch=amd64&distro=ubuntu-24.04&package-id=e49d49d791072c36&upstream=intel-compute-runtime", + "cpe": "cpe:2.3:a:intel-opencl-icd:intel-opencl-icd:26.27.39122.11-0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -80397,9 +85731,9 @@ ], "name": "intel-opencl-icd", "publisher": "Intel Graphics Team ", - "purl": "pkg:deb/ubuntu/intel-opencl-icd@26.18.38308.1-0?arch=amd64&distro=ubuntu-24.04&upstream=intel-compute-runtime", + "purl": "pkg:deb/ubuntu/intel-opencl-icd@26.27.39122.11-0?arch=amd64&distro=ubuntu-24.04&upstream=intel-compute-runtime", "type": "library", - "version": "26.18.38308.1-0" + "version": "26.27.39122.11-0" }, { "author": "Intel Corporation ", @@ -80481,6 +85815,54 @@ "type": "library", "version": "0.3.3" }, + { + "bom-ref": "pkg:cargo/io-extras@0.19.0?package-id=bd89813b149ed714", + "cpe": "cpe:2.3:a:io-extras:io-extras:0.19.0:*:*:*:*:*:*:*", + "name": "io-extras", + "purl": "pkg:cargo/io-extras@0.19.0", + "type": "library", + "version": "0.19.0" + }, + { + "bom-ref": "pkg:cargo/io-extras@0.19.0?package-id=ee39db3a1a30e2f9", + "cpe": "cpe:2.3:a:io-extras:io-extras:0.19.0:*:*:*:*:*:*:*", + "name": "io-extras", + "purl": "pkg:cargo/io-extras@0.19.0", + "type": "library", + "version": "0.19.0" + }, + { + "bom-ref": "pkg:cargo/io-lifetimes@2.0.4?package-id=35a9ad1a5447658f", + "cpe": "cpe:2.3:a:io-lifetimes:io-lifetimes:2.0.4:*:*:*:*:*:*:*", + "name": "io-lifetimes", + "purl": "pkg:cargo/io-lifetimes@2.0.4", + "type": "library", + "version": "2.0.4" + }, + { + "bom-ref": "pkg:cargo/io-lifetimes@2.0.4?package-id=601cbbde3dd23f94", + "cpe": "cpe:2.3:a:io-lifetimes:io-lifetimes:2.0.4:*:*:*:*:*:*:*", + "name": "io-lifetimes", + "purl": "pkg:cargo/io-lifetimes@2.0.4", + "type": "library", + "version": "2.0.4" + }, + { + "bom-ref": "pkg:cargo/io-lifetimes@3.0.1?package-id=a428414741487e31", + "cpe": "cpe:2.3:a:io-lifetimes:io-lifetimes:3.0.1:*:*:*:*:*:*:*", + "name": "io-lifetimes", + "purl": "pkg:cargo/io-lifetimes@3.0.1", + "type": "library", + "version": "3.0.1" + }, + { + "bom-ref": "pkg:cargo/io-lifetimes@3.0.1?package-id=a44ee7ef9dc6c357", + "cpe": "cpe:2.3:a:io-lifetimes:io-lifetimes:3.0.1:*:*:*:*:*:*:*", + "name": "io-lifetimes", + "purl": "pkg:cargo/io-lifetimes@3.0.1", + "type": "library", + "version": "3.0.1" + }, { "bom-ref": "pkg:cargo/ipnet@2.12.0?package-id=b8efa5b65616fd34", "cpe": "cpe:2.3:a:ipnet:ipnet:2.12.0:*:*:*:*:*:*:*", @@ -80513,38 +85895,6 @@ "type": "library", "version": "0.7.10" }, - { - "bom-ref": "pkg:cargo/is-docker@0.2.0?package-id=3fb226015ef7df9b", - "cpe": "cpe:2.3:a:is-docker:is-docker:0.2.0:*:*:*:*:*:*:*", - "name": "is-docker", - "purl": "pkg:cargo/is-docker@0.2.0", - "type": "library", - "version": "0.2.0" - }, - { - "bom-ref": "pkg:cargo/is-docker@0.2.0?package-id=e609b8521384689e", - "cpe": "cpe:2.3:a:is-docker:is-docker:0.2.0:*:*:*:*:*:*:*", - "name": "is-docker", - "purl": "pkg:cargo/is-docker@0.2.0", - "type": "library", - "version": "0.2.0" - }, - { - "bom-ref": "pkg:cargo/is-wsl@0.4.0?package-id=a16ab300592b845e", - "cpe": "cpe:2.3:a:is-wsl:is-wsl:0.4.0:*:*:*:*:*:*:*", - "name": "is-wsl", - "purl": "pkg:cargo/is-wsl@0.4.0", - "type": "library", - "version": "0.4.0" - }, - { - "bom-ref": "pkg:cargo/is-wsl@0.4.0?package-id=e6408140937e2c47", - "cpe": "cpe:2.3:a:is-wsl:is-wsl:0.4.0:*:*:*:*:*:*:*", - "name": "is-wsl", - "purl": "pkg:cargo/is-wsl@0.4.0", - "type": "library", - "version": "0.4.0" - }, { "bom-ref": "pkg:cargo/is_ci@1.2.0?package-id=1340d668d5eee933", "cpe": "cpe:2.3:a:is-ci:is-ci:1.2.0:*:*:*:*:*:*:*", @@ -80577,6 +85927,27 @@ "type": "library", "version": "1.70.2" }, + { + "bom-ref": "pkg:deb/ubuntu/iso-codes@4.16.0-1?arch=all&distro=ubuntu-24.04&package-id=7d1ceeb8ae6b0794", + "cpe": "cpe:2.3:a:iso-codes:iso-codes:4.16.0-1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + } + ], + "name": "iso-codes", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/iso-codes@4.16.0-1?arch=all&distro=ubuntu-24.04", + "type": "library", + "version": "4.16.0-1" + }, { "bom-ref": "pkg:maven/com.sun.istack/istack-commons-runtime@3.0.5?package-id=923810847a137a89", "cpe": "cpe:2.3:a:istack-commons-runtime:istack-commons-runtime:3.0.5:*:*:*:*:*:*:*", @@ -80636,8 +86007,8 @@ "version": "2.8" }, { - "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.18.6?package-id=29b5d488409fc739", - "cpe": "cpe:2.3:a:com.fasterxml.jackson.core:jackson-annotations:2.18.6:*:*:*:*:*:*:*", + "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.18.8?package-id=8a1a5b6d3d39b176", + "cpe": "cpe:2.3:a:com.fasterxml.jackson.core:jackson-annotations:2.18.8:*:*:*:*:*:*:*", "group": "com.fasterxml.jackson.core", "licenses": [ { @@ -80648,13 +86019,13 @@ } ], "name": "jackson-annotations", - "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.18.6", + "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.18.8", "type": "library", - "version": "2.18.6" + "version": "2.18.8" }, { - "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-core@2.18.6?package-id=4e0dcf2d7f7b984a", - "cpe": "cpe:2.3:a:com.fasterxml.jackson.core:jackson-core:2.18.6:*:*:*:*:*:*:*", + "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-core@2.18.8?package-id=4662221de5913a5d", + "cpe": "cpe:2.3:a:com.fasterxml.jackson.core:jackson-core:2.18.8:*:*:*:*:*:*:*", "group": "com.fasterxml.jackson.core", "licenses": [ { @@ -80665,13 +86036,13 @@ } ], "name": "jackson-core", - "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-core@2.18.6", + "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-core@2.18.8", "type": "library", - "version": "2.18.6" + "version": "2.18.8" }, { - "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.18.6?package-id=aff0bc257c29ad89", - "cpe": "cpe:2.3:a:com.fasterxml.jackson.core:jackson-databind:2.18.6:*:*:*:*:*:*:*", + "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.18.8?package-id=47d641fb77223041", + "cpe": "cpe:2.3:a:com.fasterxml.jackson.core:jackson-databind:2.18.8:*:*:*:*:*:*:*", "group": "com.fasterxml.jackson.core", "licenses": [ { @@ -80682,9 +86053,9 @@ } ], "name": "jackson-databind", - "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.18.6", + "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.18.8", "type": "library", - "version": "2.18.6" + "version": "2.18.8" }, { "author": "\"Jason R. Coombs\" ", @@ -80850,8 +86221,8 @@ }, { "author": "Samuel Colvin ", - "bom-ref": "pkg:pypi/jiter@0.15.0?package-id=e5d129d24ff385dd", - "cpe": "cpe:2.3:a:samuel_colvin_\\", @@ -80997,8 +86368,8 @@ }, { "author": "Dmitry Dygalo ", - "bom-ref": "pkg:pypi/jsonschema-rs@0.45.0?package-id=96601d9cb237c702", - "cpe": "cpe:2.3:a:dmitry_dygalo_\\", @@ -81045,20 +86416,36 @@ "version": "3.0.2" }, { - "author": "Brian Beyer ", - "bom-ref": "pkg:pypi/junit-xml@1.9?package-id=ac218ad8641b41c3", - "cpe": "cpe:2.3:a:brian_beyer_project:python-junit-xml:1.9:*:*:*:*:*:*:*", + "author": "Jupyter Development Team ", + "bom-ref": "pkg:pypi/jupyter-client@8.9.1?package-id=ae5f98040814ccc9", + "cpe": "cpe:2.3:a:jupyter_development_team_\\", + "bom-ref": "pkg:pypi/jupyter-core@5.9.1?package-id=4b49d641a65e4d67", + "cpe": "cpe:2.3:a:jupyter_development_team_\\", @@ -81076,6 +86463,52 @@ "type": "library", "version": "1.2.2" }, + { + "author": "The Launchpad developers ", + "bom-ref": "pkg:pypi/launchpadlib@1.11.0?package-id=cffadfd6c947109e", + "cpe": "cpe:2.3:a:launchpad_developers_project:python-launchpadlib:1.11.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "LGPL v3" + } + } + ], + "name": "launchpadlib", + "purl": "pkg:pypi/launchpadlib@1.11.0", + "type": "library", + "version": "1.11.0" + }, + { + "bom-ref": "pkg:pypi/lazr-restfulclient@0.14.6?package-id=01bb16c825e29c06", + "cpe": "cpe:2.3:a:python-lazr-restfulclient:python-lazr-restfulclient:0.14.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "LGPL v3" + } + } + ], + "name": "lazr-restfulclient", + "purl": "pkg:pypi/lazr-restfulclient@0.14.6", + "type": "library", + "version": "0.14.6" + }, + { + "bom-ref": "pkg:pypi/lazr-uri@1.0.6?package-id=4dfba58e4434511d", + "cpe": "cpe:2.3:a:python-lazr-uri:python-lazr-uri:1.0.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "LGPL v3" + } + } + ], + "name": "lazr-uri", + "purl": "pkg:pypi/lazr-uri@1.0.6", + "type": "library", + "version": "1.0.6" + }, { "author": "Scientific Python Developers", "bom-ref": "pkg:pypi/lazy-loader@0.5?package-id=1d77a08aa270f6c9", @@ -81108,24 +86541,6 @@ "type": "library", "version": "1.5.0" }, - { - "bom-ref": "pkg:deb/ubuntu/level-zero@1.28.2?arch=amd64&distro=ubuntu-24.04&package-id=296827add61d2256", - "cpe": "cpe:2.3:a:level-zero:level-zero:1.28.2:*:*:*:*:*:*:*", - "name": "level-zero", - "publisher": "Intel Corporation", - "purl": "pkg:deb/ubuntu/level-zero@1.28.2?arch=amd64&distro=ubuntu-24.04", - "type": "library", - "version": "1.28.2" - }, - { - "bom-ref": "pkg:deb/ubuntu/level-zero-devel@1.28.2?arch=amd64&distro=ubuntu-24.04&package-id=c95356307ad2e210", - "cpe": "cpe:2.3:a:level-zero-devel:level-zero-devel:1.28.2:*:*:*:*:*:*:*", - "name": "level-zero-devel", - "publisher": "Intel Corporation", - "purl": "pkg:deb/ubuntu/level-zero-devel@1.28.2?arch=amd64&distro=ubuntu-24.04", - "type": "library", - "version": "1.28.2" - }, { "bom-ref": "pkg:deb/ubuntu/libacl1@2.3.2-1build1.1?arch=amd64&distro=ubuntu-24.04&package-id=bb3fa210c4617fe7&upstream=acl", "cpe": "cpe:2.3:a:libacl1:libacl1:2.3.2-1build1.1:*:*:*:*:*:*:*", @@ -81271,6 +86686,47 @@ "type": "library", "version": "4.0.1really4.0.1-0ubuntu0.24.04.7" }, + { + "bom-ref": "pkg:deb/ubuntu/libappstream5@1.0.2-1build6?arch=amd64&distro=ubuntu-24.04&package-id=4089f14ab5565c7e&upstream=appstream", + "cpe": "cpe:2.3:a:libappstream5:libappstream5:1.0.2-1build6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "FSFAP" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "name": "SIL-1.1" + } + } + ], + "name": "libappstream5", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libappstream5@1.0.2-1build6?arch=amd64&distro=ubuntu-24.04&upstream=appstream", + "type": "library", + "version": "1.0.2-1build6" + }, { "bom-ref": "pkg:deb/ubuntu/libapt-pkg6.0t64@2.8.3?arch=amd64&distro=ubuntu-24.04&package-id=13d506459809d51e&upstream=apt", "cpe": "cpe:2.3:a:libapt-pkg6.0t64:libapt-pkg6.0t64:2.8.3:*:*:*:*:*:*:*", @@ -82172,8 +87628,8 @@ "version": "3.12.0-3build1.1" }, { - "bom-ref": "pkg:deb/ubuntu/libblkid1@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&package-id=39ee0553a5289e3b&upstream=util-linux", - "cpe": "cpe:2.3:a:libblkid1:libblkid1:2.39.3-9ubuntu6.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libblkid1@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&package-id=cb5c6761273d29c4&upstream=util-linux", + "cpe": "cpe:2.3:a:libblkid1:libblkid1:2.39.3-9ubuntu6.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -82258,9 +87714,9 @@ ], "name": "libblkid1", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libblkid1@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", + "purl": "pkg:deb/ubuntu/libblkid1@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", "type": "library", - "version": "2.39.3-9ubuntu6.5" + "version": "2.39.3-9ubuntu6.6" }, { "bom-ref": "pkg:deb/ubuntu/libbluray2@1%3A1.3.4-1build1?arch=amd64&distro=ubuntu-24.04&package-id=81cc88a9078730a9&upstream=libbluray", @@ -82447,8 +87903,8 @@ "version": "0.12.1-1build1.1" }, { - "bom-ref": "pkg:deb/ubuntu/libbz2-1.0@1.0.8-5.1build0.1?arch=amd64&distro=ubuntu-24.04&package-id=c666aef9f22ed237&upstream=bzip2", - "cpe": "cpe:2.3:a:libbz2-1.0:libbz2-1.0:1.0.8-5.1build0.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libbz2-1.0@1.0.8-5.1ubuntu0.1?arch=amd64&distro=ubuntu-24.04&package-id=5582c2344a08500a&upstream=bzip2", + "cpe": "cpe:2.3:a:libbz2-1.0:libbz2-1.0:1.0.8-5.1ubuntu0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -82463,25 +87919,25 @@ ], "name": "libbz2-1.0", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libbz2-1.0@1.0.8-5.1build0.1?arch=amd64&distro=ubuntu-24.04&upstream=bzip2", + "purl": "pkg:deb/ubuntu/libbz2-1.0@1.0.8-5.1ubuntu0.1?arch=amd64&distro=ubuntu-24.04&upstream=bzip2", "type": "library", - "version": "1.0.8-5.1build0.1" + "version": "1.0.8-5.1ubuntu0.1" }, { - "bom-ref": "pkg:cargo/libc@0.2.186?package-id=65b525c65f5e9a9a", - "cpe": "cpe:2.3:a:libc:libc:0.2.186:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/libc@0.2.189?package-id=1c5390c6fa78fa40", + "cpe": "cpe:2.3:a:libc:libc:0.2.189:*:*:*:*:*:*:*", "name": "libc", - "purl": "pkg:cargo/libc@0.2.186", + "purl": "pkg:cargo/libc@0.2.189", "type": "library", - "version": "0.2.186" + "version": "0.2.189" }, { - "bom-ref": "pkg:cargo/libc@0.2.186?package-id=806612faf0289334", - "cpe": "cpe:2.3:a:libc:libc:0.2.186:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/libc@0.2.189?package-id=3926eba4485a5e2c", + "cpe": "cpe:2.3:a:libc:libc:0.2.189:*:*:*:*:*:*:*", "name": "libc", - "purl": "pkg:cargo/libc@0.2.186", + "purl": "pkg:cargo/libc@0.2.189", "type": "library", - "version": "0.2.186" + "version": "0.2.189" }, { "bom-ref": "pkg:deb/ubuntu/libc-bin@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&package-id=63563c936750dadd&upstream=glibc", @@ -82692,6 +88148,32 @@ "type": "library", "version": "1:2.66-5ubuntu2.4" }, + { + "bom-ref": "pkg:deb/ubuntu/libcap2-bin@1%3A2.66-5ubuntu2.4?arch=amd64&distro=ubuntu-24.04&package-id=f6cd0fe1c968a215&upstream=libcap2", + "cpe": "cpe:2.3:a:libcap2-bin:libcap2-bin:1\\:2.66-5ubuntu2.4:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + } + ], + "name": "libcap2-bin", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libcap2-bin@1%3A2.66-5ubuntu2.4?arch=amd64&distro=ubuntu-24.04&upstream=libcap2", + "type": "library", + "version": "1:2.66-5ubuntu2.4" + }, { "bom-ref": "pkg:deb/ubuntu/libcc1-0@14.2.0-4ubuntu2~24.04.1?arch=amd64&distro=ubuntu-24.04&package-id=bca106ece20e2bce&upstream=gcc-14", "cpe": "cpe:2.3:a:libcc1-0:libcc1-0:14.2.0-4ubuntu2\\~24.04.1:*:*:*:*:*:*:*", @@ -83031,8 +88513,8 @@ "version": "2.42-4ubuntu2.10" }, { - "bom-ref": "pkg:deb/ubuntu/libcurl3t64-gnutls@8.5.0-2ubuntu10.11?arch=amd64&distro=ubuntu-24.04&package-id=628c0489d7d85266&upstream=curl", - "cpe": "cpe:2.3:a:libcurl3t64-gnutls:libcurl3t64-gnutls:8.5.0-2ubuntu10.11:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcurl3t64-gnutls@8.5.0-2ubuntu10.13?arch=amd64&distro=ubuntu-24.04&package-id=8fe4f02fb76d35fc&upstream=curl", + "cpe": "cpe:2.3:a:libcurl3t64-gnutls:libcurl3t64-gnutls:8.5.0-2ubuntu10.13:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -83087,13 +88569,13 @@ ], "name": "libcurl3t64-gnutls", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libcurl3t64-gnutls@8.5.0-2ubuntu10.11?arch=amd64&distro=ubuntu-24.04&upstream=curl", + "purl": "pkg:deb/ubuntu/libcurl3t64-gnutls@8.5.0-2ubuntu10.13?arch=amd64&distro=ubuntu-24.04&upstream=curl", "type": "library", - "version": "8.5.0-2ubuntu10.11" + "version": "8.5.0-2ubuntu10.13" }, { - "bom-ref": "pkg:deb/ubuntu/libcurl4t64@8.5.0-2ubuntu10.11?arch=amd64&distro=ubuntu-24.04&package-id=e9ac01a38580c34f&upstream=curl", - "cpe": "cpe:2.3:a:libcurl4t64:libcurl4t64:8.5.0-2ubuntu10.11:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcurl4t64@8.5.0-2ubuntu10.13?arch=amd64&distro=ubuntu-24.04&package-id=60f45532d20a92b5&upstream=curl", + "cpe": "cpe:2.3:a:libcurl4t64:libcurl4t64:8.5.0-2ubuntu10.13:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -83148,9 +88630,9 @@ ], "name": "libcurl4t64", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libcurl4t64@8.5.0-2ubuntu10.11?arch=amd64&distro=ubuntu-24.04&upstream=curl", + "purl": "pkg:deb/ubuntu/libcurl4t64@8.5.0-2ubuntu10.13?arch=amd64&distro=ubuntu-24.04&upstream=curl", "type": "library", - "version": "8.5.0-2ubuntu10.11" + "version": "8.5.0-2ubuntu10.13" }, { "bom-ref": "pkg:deb/ubuntu/libdatrie1@0.2.13-3build1?arch=amd64&distro=ubuntu-24.04&package-id=fb35af23ae239c6a&upstream=libdatrie", @@ -83556,6 +89038,98 @@ "type": "library", "version": "2.4.125-1ubuntu0.1~24.04.2" }, + { + "bom-ref": "pkg:deb/ubuntu/libduktape207@2.7.0%2Btests-0ubuntu3?arch=amd64&distro=ubuntu-24.04&package-id=5503f43325512731&upstream=duktape", + "cpe": "cpe:2.3:a:libduktape207:libduktape207:2.7.0\\+tests-0ubuntu3:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "name": "CC0" + } + }, + { + "license": { + "name": "expat" + } + }, + { + "license": { + "name": "unicode" + } + } + ], + "name": "libduktape207", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libduktape207@2.7.0%2Btests-0ubuntu3?arch=amd64&distro=ubuntu-24.04&upstream=duktape", + "type": "library", + "version": "2.7.0+tests-0ubuntu3" + }, + { + "bom-ref": "pkg:deb/ubuntu/libdw1t64@0.190-1.1ubuntu0.1?arch=amd64&distro=ubuntu-24.04&package-id=98f54f254c58862c&upstream=elfutils", + "cpe": "cpe:2.3:a:libdw1t64:libdw1t64:0.190-1.1ubuntu0.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-2-Clause" + } + }, + { + "license": { + "id": "GFDL-1.3-only" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "GFDL-NIV-1.3" + } + } + ], + "name": "libdw1t64", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libdw1t64@0.190-1.1ubuntu0.1?arch=amd64&distro=ubuntu-24.04&upstream=elfutils", + "type": "library", + "version": "0.190-1.1ubuntu0.1" + }, { "bom-ref": "pkg:deb/ubuntu/libedit2@3.1-20230828-1build1?arch=amd64&distro=ubuntu-24.04&package-id=3c9fe12754aeb21a&upstream=libedit", "cpe": "cpe:2.3:a:libedit2:libedit2:3.1-20230828-1build1:*:*:*:*:*:*:*", @@ -83753,8 +89327,8 @@ "version": "1.47.0-2.4~exp1ubuntu4.1" }, { - "bom-ref": "pkg:deb/ubuntu/libfdisk1@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&package-id=8968c1cb06a70f19&upstream=util-linux", - "cpe": "cpe:2.3:a:libfdisk1:libfdisk1:2.39.3-9ubuntu6.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libfdisk1@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&package-id=bfcdcd32b1aca8de&upstream=util-linux", + "cpe": "cpe:2.3:a:libfdisk1:libfdisk1:2.39.3-9ubuntu6.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -83839,9 +89413,9 @@ ], "name": "libfdisk1", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libfdisk1@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", + "purl": "pkg:deb/ubuntu/libfdisk1@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", "type": "library", - "version": "2.39.3-9ubuntu6.5" + "version": "2.39.3-9ubuntu6.6" }, { "bom-ref": "pkg:deb/ubuntu/libffi8@3.4.6-1build1?arch=amd64&distro=ubuntu-24.04&package-id=10f8f209c4e6c059&upstream=libffi", @@ -84419,6 +89993,127 @@ "type": "library", "version": "14.2.0-4ubuntu2~24.04.1" }, + { + "bom-ref": "pkg:deb/ubuntu/libgirepository-1.0-1@1.80.1-1?arch=amd64&distro=ubuntu-24.04&package-id=c6d7c92f7a986d86&upstream=gobject-introspection", + "cpe": "cpe:2.3:a:libgirepository-1.0-1:libgirepository-1.0-1:1.80.1-1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.0" + } + }, + { + "license": { + "id": "Apache-2.0" + } + }, + { + "license": { + "id": "BSD-2-Clause" + } + }, + { + "license": { + "id": "CC-BY-SA-3.0" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "FSFAP" + } + }, + { + "license": { + "id": "FSFULLR" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.0-only" + } + }, + { + "license": { + "id": "LGPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "id": "MPL-1.1" + } + }, + { + "license": { + "id": "Unicode-DFS-2016" + } + }, + { + "license": { + "id": "bzip2-1.0.6" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "GPL" + } + }, + { + "license": { + "name": "Kuchling-PD" + } + }, + { + "license": { + "name": "Plumb-PD" + } + } + ], + "name": "libgirepository-1.0-1", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libgirepository-1.0-1@1.80.1-1?arch=amd64&distro=ubuntu-24.04&upstream=gobject-introspection", + "type": "library", + "version": "1.80.1-1" + }, { "bom-ref": "pkg:deb/ubuntu/libgl1@1.7.0-1build1?arch=amd64&distro=ubuntu-24.04&package-id=8b7b59828393111d&upstream=libglvnd", "cpe": "cpe:2.3:a:libgl1:libgl1:1.7.0-1build1:*:*:*:*:*:*:*", @@ -84672,6 +90367,268 @@ "type": "library", "version": "2.80.0-6ubuntu3.8" }, + { + "bom-ref": "pkg:deb/ubuntu/libglib2.0-bin@2.80.0-6ubuntu3.8?arch=amd64&distro=ubuntu-24.04&package-id=8d7e778b50c0b3e3&upstream=glib2.0", + "cpe": "cpe:2.3:a:libglib2.0-bin:libglib2.0-bin:2.80.0-6ubuntu3.8:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.0" + } + }, + { + "license": { + "id": "Apache-2.0" + } + }, + { + "license": { + "id": "CC-BY-SA-3.0" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "FSFULLR" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.0-only" + } + }, + { + "license": { + "id": "LGPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "id": "MPL-1.1" + } + }, + { + "license": { + "id": "Unicode-DFS-2016" + } + }, + { + "license": { + "id": "bzip2-1.0.6" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "Iconv-PD" + } + }, + { + "license": { + "name": "Janik-permissive" + } + }, + { + "license": { + "name": "Kuchling-PD" + } + }, + { + "license": { + "name": "Mingw-PD" + } + }, + { + "license": { + "name": "Plumb-PD" + } + }, + { + "license": { + "name": "cmph" + } + }, + { + "license": { + "name": "old-glib-tests" + } + } + ], + "name": "libglib2.0-bin", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libglib2.0-bin@2.80.0-6ubuntu3.8?arch=amd64&distro=ubuntu-24.04&upstream=glib2.0", + "type": "library", + "version": "2.80.0-6ubuntu3.8" + }, + { + "bom-ref": "pkg:deb/ubuntu/libglib2.0-data@2.80.0-6ubuntu3.8?arch=all&distro=ubuntu-24.04&package-id=d264ce395dfe9c71&upstream=glib2.0", + "cpe": "cpe:2.3:a:libglib2.0-data:libglib2.0-data:2.80.0-6ubuntu3.8:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.0" + } + }, + { + "license": { + "id": "Apache-2.0" + } + }, + { + "license": { + "id": "CC-BY-SA-3.0" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "FSFULLR" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.0-only" + } + }, + { + "license": { + "id": "LGPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "id": "MPL-1.1" + } + }, + { + "license": { + "id": "Unicode-DFS-2016" + } + }, + { + "license": { + "id": "bzip2-1.0.6" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "Iconv-PD" + } + }, + { + "license": { + "name": "Janik-permissive" + } + }, + { + "license": { + "name": "Kuchling-PD" + } + }, + { + "license": { + "name": "Mingw-PD" + } + }, + { + "license": { + "name": "Plumb-PD" + } + }, + { + "license": { + "name": "cmph" + } + }, + { + "license": { + "name": "old-glib-tests" + } + } + ], + "name": "libglib2.0-data", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libglib2.0-data@2.80.0-6ubuntu3.8?arch=all&distro=ubuntu-24.04&upstream=glib2.0", + "type": "library", + "version": "2.80.0-6ubuntu3.8" + }, { "bom-ref": "pkg:deb/ubuntu/libglvnd0@1.7.0-1build1?arch=amd64&distro=ubuntu-24.04&package-id=60197ea8767d01fa&upstream=libglvnd", "cpe": "cpe:2.3:a:libglvnd0:libglvnd0:1.7.0-1build1:*:*:*:*:*:*:*", @@ -85100,8 +91057,8 @@ "version": "1.0.22-1build1" }, { - "bom-ref": "pkg:deb/ubuntu/libgssapi-krb5-2@1.20.1-6ubuntu2.7?arch=amd64&distro=ubuntu-24.04&package-id=af05af509294f576&upstream=krb5", - "cpe": "cpe:2.3:a:libgssapi-krb5-2:libgssapi-krb5-2:1.20.1-6ubuntu2.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libgssapi-krb5-2@1.20.1-6ubuntu2.8?arch=amd64&distro=ubuntu-24.04&package-id=2bf94f981c7e1a79&upstream=krb5", + "cpe": "cpe:2.3:a:libgssapi-krb5-2:libgssapi-krb5-2:1.20.1-6ubuntu2.8:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -85111,9 +91068,25 @@ ], "name": "libgssapi-krb5-2", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libgssapi-krb5-2@1.20.1-6ubuntu2.7?arch=amd64&distro=ubuntu-24.04&upstream=krb5", + "purl": "pkg:deb/ubuntu/libgssapi-krb5-2@1.20.1-6ubuntu2.8?arch=amd64&distro=ubuntu-24.04&upstream=krb5", + "type": "library", + "version": "1.20.1-6ubuntu2.8" + }, + { + "bom-ref": "pkg:deb/ubuntu/libgstreamer1.0-0@1.24.2-1ubuntu0.1?arch=amd64&distro=ubuntu-24.04&package-id=980a79c4749f8d8f&upstream=gstreamer1.0", + "cpe": "cpe:2.3:a:libgstreamer1.0-0:libgstreamer1.0-0:1.24.2-1ubuntu0.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "sha256:de00f8e299a9ed1bd23e7a0c2fe31051c8f99546359be75f33b98e3f0328d68a" + } + } + ], + "name": "libgstreamer1.0-0", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libgstreamer1.0-0@1.24.2-1ubuntu0.1?arch=amd64&distro=ubuntu-24.04&upstream=gstreamer1.0", "type": "library", - "version": "1.20.1-6ubuntu2.7" + "version": "1.24.2-1ubuntu0.1" }, { "bom-ref": "pkg:deb/ubuntu/libharfbuzz0b@8.3.0-2build2?arch=amd64&distro=ubuntu-24.04&package-id=c3005cb1b8d81dce&upstream=harfbuzz", @@ -85298,6 +91271,22 @@ "type": "library", "version": "14.2.0-4ubuntu2~24.04.1" }, + { + "bom-ref": "pkg:deb/ubuntu/libhwloc15@2.10.0-1build1?arch=amd64&distro=ubuntu-24.04&package-id=cdc5635c553a92ef&upstream=hwloc", + "cpe": "cpe:2.3:a:libhwloc15:libhwloc15:2.10.0-1build1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "sha256:ef9d59c01a1296041369997b7c684867fe58473d02ae575aca6454c9db2297fc" + } + } + ], + "name": "libhwloc15", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libhwloc15@2.10.0-1build1?arch=amd64&distro=ubuntu-24.04&upstream=hwloc", + "type": "library", + "version": "2.10.0-1build1" + }, { "bom-ref": "pkg:deb/ubuntu/libhwy1t64@1.0.7-8.1build1?arch=amd64&distro=ubuntu-24.04&package-id=592bae877493a92a&upstream=highway", "cpe": "cpe:2.3:a:libhwy1t64:libhwy1t64:1.0.7-8.1build1:*:*:*:*:*:*:*", @@ -85567,8 +91556,8 @@ "version": "1.2.0-6build1" }, { - "bom-ref": "pkg:deb/ubuntu/libigdgmm12@22.10.0?arch=amd64&distro=ubuntu-24.04&package-id=4b43a1a3852d7e6f&upstream=intel-gmmlib", - "cpe": "cpe:2.3:a:libigdgmm12:libigdgmm12:22.10.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libigdgmm12@22.10.1-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&package-id=5c9e32361744933f&upstream=intel-gmmlib", + "cpe": "cpe:2.3:a:libigdgmm12:libigdgmm12:22.10.1-1\\~24.04\\~ppa1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -85577,20 +91566,41 @@ }, { "license": { - "id": "MIT" + "name": "Expat" + } + } + ], + "name": "libigdgmm12", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libigdgmm12@22.10.1-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&upstream=intel-gmmlib", + "type": "library", + "version": "22.10.1-1~24.04~ppa1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libigsc1@1.2.0-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&package-id=dba688cc1d37039c&upstream=igsc", + "cpe": "cpe:2.3:a:libigsc1:libigsc1:1.2.0-1\\~24.04\\~ppa1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "Apache-2.0" } }, { "license": { - "name": "Expat" + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" } } ], - "name": "libigdgmm12", - "publisher": "Intel Graphics Team ", - "purl": "pkg:deb/ubuntu/libigdgmm12@22.10.0?arch=amd64&distro=ubuntu-24.04&upstream=intel-gmmlib", + "name": "libigsc1", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libigsc1@1.2.0-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&upstream=igsc", "type": "library", - "version": "22.10.0" + "version": "1.2.0-1~24.04~ppa1" }, { "bom-ref": "pkg:deb/ubuntu/libisl23@0.26-3build1.1?arch=amd64&distro=ubuntu-24.04&package-id=bb90a6d750928a00&upstream=isl", @@ -85847,8 +91857,8 @@ "version": "0.7.0-10.2ubuntu6.1" }, { - "bom-ref": "pkg:deb/ubuntu/libk5crypto3@1.20.1-6ubuntu2.7?arch=amd64&distro=ubuntu-24.04&package-id=2aa6f114e5fd29e5&upstream=krb5", - "cpe": "cpe:2.3:a:libk5crypto3:libk5crypto3:1.20.1-6ubuntu2.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libk5crypto3@1.20.1-6ubuntu2.8?arch=amd64&distro=ubuntu-24.04&package-id=f1255dc99d2fc6d2&upstream=krb5", + "cpe": "cpe:2.3:a:libk5crypto3:libk5crypto3:1.20.1-6ubuntu2.8:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -85858,9 +91868,9 @@ ], "name": "libk5crypto3", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libk5crypto3@1.20.1-6ubuntu2.7?arch=amd64&distro=ubuntu-24.04&upstream=krb5", + "purl": "pkg:deb/ubuntu/libk5crypto3@1.20.1-6ubuntu2.8?arch=amd64&distro=ubuntu-24.04&upstream=krb5", "type": "library", - "version": "1.20.1-6ubuntu2.7" + "version": "1.20.1-6ubuntu2.8" }, { "bom-ref": "pkg:deb/ubuntu/libkeyutils1@1.6.3-3build1?arch=amd64&distro=ubuntu-24.04&package-id=215205ffd55438a3&upstream=keyutils", @@ -85925,8 +91935,8 @@ "version": "31+20240202-2ubuntu7.2" }, { - "bom-ref": "pkg:deb/ubuntu/libkrb5-3@1.20.1-6ubuntu2.7?arch=amd64&distro=ubuntu-24.04&package-id=088516840325a193&upstream=krb5", - "cpe": "cpe:2.3:a:libkrb5-3:libkrb5-3:1.20.1-6ubuntu2.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libkrb5-3@1.20.1-6ubuntu2.8?arch=amd64&distro=ubuntu-24.04&package-id=4ae54ac52e78d530&upstream=krb5", + "cpe": "cpe:2.3:a:libkrb5-3:libkrb5-3:1.20.1-6ubuntu2.8:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -85936,13 +91946,13 @@ ], "name": "libkrb5-3", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libkrb5-3@1.20.1-6ubuntu2.7?arch=amd64&distro=ubuntu-24.04&upstream=krb5", + "purl": "pkg:deb/ubuntu/libkrb5-3@1.20.1-6ubuntu2.8?arch=amd64&distro=ubuntu-24.04&upstream=krb5", "type": "library", - "version": "1.20.1-6ubuntu2.7" + "version": "1.20.1-6ubuntu2.8" }, { - "bom-ref": "pkg:deb/ubuntu/libkrb5support0@1.20.1-6ubuntu2.7?arch=amd64&distro=ubuntu-24.04&package-id=7416f2c3deb79297&upstream=krb5", - "cpe": "cpe:2.3:a:libkrb5support0:libkrb5support0:1.20.1-6ubuntu2.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libkrb5support0@1.20.1-6ubuntu2.8?arch=amd64&distro=ubuntu-24.04&package-id=3362d8c0ab244708&upstream=krb5", + "cpe": "cpe:2.3:a:libkrb5support0:libkrb5support0:1.20.1-6ubuntu2.8:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -85952,9 +91962,9 @@ ], "name": "libkrb5support0", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libkrb5support0@1.20.1-6ubuntu2.7?arch=amd64&distro=ubuntu-24.04&upstream=krb5", + "purl": "pkg:deb/ubuntu/libkrb5support0@1.20.1-6ubuntu2.8?arch=amd64&distro=ubuntu-24.04&upstream=krb5", "type": "library", - "version": "1.20.1-6ubuntu2.7" + "version": "1.20.1-6ubuntu2.8" }, { "bom-ref": "pkg:deb/ubuntu/liblapack3@3.12.0-3build1.1?arch=amd64&distro=ubuntu-24.04&package-id=d3d55df185481826&upstream=lapack", @@ -86419,8 +92429,66 @@ "version": "1.1.0-2build1.1" }, { - "bom-ref": "pkg:deb/ubuntu/libmount1@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&package-id=9c3ce62925a3c63c&upstream=util-linux", - "cpe": "cpe:2.3:a:libmount1:libmount1:2.39.3-9ubuntu6.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libmetee-dev@6.2.1-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&package-id=6994388a61adcc2e&upstream=metee", + "cpe": "cpe:2.3:a:libmetee-dev:libmetee-dev:6.2.1-1\\~24.04\\~ppa1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + } + ], + "name": "libmetee-dev", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libmetee-dev@6.2.1-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&upstream=metee", + "type": "library", + "version": "6.2.1-1~24.04~ppa1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libmetee6@6.2.1-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&package-id=3279d5a2e7fd7549&upstream=metee", + "cpe": "cpe:2.3:a:libmetee6:libmetee6:6.2.1-1\\~24.04\\~ppa1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + } + ], + "name": "libmetee6", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libmetee6@6.2.1-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&upstream=metee", + "type": "library", + "version": "6.2.1-1~24.04~ppa1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libmfx-gen1.2@26.3.2-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&package-id=7bf3e6c26f3f00c9&upstream=onevpl-intel-gpu", + "cpe": "cpe:2.3:a:libmfx-gen1.2:libmfx-gen1.2:26.3.2-1\\~24.04\\~ppa1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], + "name": "libmfx-gen1.2", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libmfx-gen1.2@26.3.2-1~24.04~ppa1?arch=amd64&distro=ubuntu-24.04&upstream=onevpl-intel-gpu", + "type": "library", + "version": "26.3.2-1~24.04~ppa1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libmount1@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&package-id=c02905cff08d2f0f&upstream=util-linux", + "cpe": "cpe:2.3:a:libmount1:libmount1:2.39.3-9ubuntu6.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -86505,9 +92573,9 @@ ], "name": "libmount1", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libmount1@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", + "purl": "pkg:deb/ubuntu/libmount1@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", "type": "library", - "version": "2.39.3-9ubuntu6.5" + "version": "2.39.3-9ubuntu6.6" }, { "bom-ref": "pkg:deb/ubuntu/libmp3lame0@3.100-6build1?arch=amd64&distro=ubuntu-24.04&package-id=7462636fad632bfe&upstream=lame", @@ -87214,6 +93282,42 @@ "type": "library", "version": "0.25.3-4ubuntu2.1" }, + { + "bom-ref": "pkg:deb/ubuntu/libpackagekit-glib2-18@1.2.8-2ubuntu1.5?arch=amd64&distro=ubuntu-24.04&package-id=97be3a42f6d4fca3&upstream=packagekit", + "cpe": "cpe:2.3:a:libpackagekit-glib2-18:libpackagekit-glib2-18:1.2.8-2ubuntu1.5:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "FSFAP" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + } + ], + "name": "libpackagekit-glib2-18", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libpackagekit-glib2-18@1.2.8-2ubuntu1.5?arch=amd64&distro=ubuntu-24.04&upstream=packagekit", + "type": "library", + "version": "1.2.8-2ubuntu1.5" + }, { "bom-ref": "pkg:deb/ubuntu/libpam-modules@1.5.3-5ubuntu5.6?arch=amd64&distro=ubuntu-24.04&package-id=0ccc4a05333c0d49&upstream=pam", "cpe": "cpe:2.3:a:libpam-modules:libpam-modules:1.5.3-5ubuntu5.6:*:*:*:*:*:*:*", @@ -87412,6 +93516,52 @@ "type": "library", "version": "1.5.3-5ubuntu5.6" }, + { + "bom-ref": "pkg:deb/ubuntu/libpam-systemd@255.4-1ubuntu8.17?arch=amd64&distro=ubuntu-24.04&package-id=7d2d78cfe619105e&upstream=systemd", + "cpe": "cpe:2.3:a:libpam-systemd:libpam-systemd:255.4-1ubuntu8.17:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "public-domain" + } + } + ], + "name": "libpam-systemd", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libpam-systemd@255.4-1ubuntu8.17?arch=amd64&distro=ubuntu-24.04&upstream=systemd", + "type": "library", + "version": "255.4-1ubuntu8.17" + }, { "bom-ref": "pkg:deb/ubuntu/libpam0g@1.5.3-5ubuntu5.6?arch=amd64&distro=ubuntu-24.04&package-id=dad7001a8bf38e58&upstream=pam", "cpe": "cpe:2.3:a:libpam0g:libpam0g:1.5.3-5ubuntu5.6:*:*:*:*:*:*:*", @@ -87744,8 +93894,8 @@ "version": "10.42-4ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04&package-id=ef575a83048d5729&upstream=perl", - "cpe": "cpe:2.3:a:libperl5.38t64:libperl5.38t64:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.4?arch=amd64&distro=ubuntu-24.04&package-id=22cc5f7281ccfb2f&upstream=perl", + "cpe": "cpe:2.3:a:libperl5.38t64:libperl5.38t64:5.38.2-3.2ubuntu0.4:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -87865,9 +94015,9 @@ ], "name": "libperl5.38t64", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04&upstream=perl", + "purl": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.4?arch=amd64&distro=ubuntu-24.04&upstream=perl", "type": "library", - "version": "5.38.2-3.2ubuntu0.3" + "version": "5.38.2-3.2ubuntu0.4" }, { "bom-ref": "pkg:deb/ubuntu/libpgm-5.3-0t64@5.3.128~dfsg-2.1build1?arch=amd64&distro=ubuntu-24.04&package-id=367e9295bad5c27f&upstream=libpgm", @@ -88043,6 +94193,68 @@ "type": "library", "version": "0.8.0+real5prealpha+1-15ubuntu5" }, + { + "bom-ref": "pkg:deb/ubuntu/libpolkit-agent-1-0@124-2ubuntu1.24.04.3?arch=amd64&distro=ubuntu-24.04&package-id=8937c57abd97e7b2&upstream=policykit-1", + "cpe": "cpe:2.3:a:libpolkit-agent-1-0:libpolkit-agent-1-0:124-2ubuntu1.24.04.3:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + }, + { + "license": { + "id": "LGPL-2.0-only" + } + }, + { + "license": { + "id": "LGPL-2.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + } + ], + "name": "libpolkit-agent-1-0", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libpolkit-agent-1-0@124-2ubuntu1.24.04.3?arch=amd64&distro=ubuntu-24.04&upstream=policykit-1", + "type": "library", + "version": "124-2ubuntu1.24.04.3" + }, + { + "bom-ref": "pkg:deb/ubuntu/libpolkit-gobject-1-0@124-2ubuntu1.24.04.3?arch=amd64&distro=ubuntu-24.04&package-id=9060b73f37dd5bb7&upstream=policykit-1", + "cpe": "cpe:2.3:a:libpolkit-gobject-1-0:libpolkit-gobject-1-0:124-2ubuntu1.24.04.3:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + }, + { + "license": { + "id": "LGPL-2.0-only" + } + }, + { + "license": { + "id": "LGPL-2.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + } + ], + "name": "libpolkit-gobject-1-0", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libpolkit-gobject-1-0@124-2ubuntu1.24.04.3?arch=amd64&distro=ubuntu-24.04&upstream=policykit-1", + "type": "library", + "version": "124-2ubuntu1.24.04.3" + }, { "bom-ref": "pkg:deb/ubuntu/libpostproc57@7%3A6.1.1-3ubuntu5?arch=amd64&distro=ubuntu-24.04&package-id=eb624053a8d145e1&upstream=ffmpeg", "cpe": "cpe:2.3:a:libpostproc57:libpostproc57:7\\:6.1.1-3ubuntu5:*:*:*:*:*:*:*", @@ -88274,8 +94486,8 @@ "version": "3.12.3-0ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=25f9b0ec56a4aae7&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12-dev:libpython3.12-dev:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&package-id=376fc87237cdeda3&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12-dev:libpython3.12-dev:3.12.3-1ubuntu0.16:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -88285,13 +94497,13 @@ ], "name": "libpython3.12-dev", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.15" + "version": "3.12.3-1ubuntu0.16" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=28dc77ed8fdebdba&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12-minimal:libpython3.12-minimal:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&package-id=ffb701fe36ced51c&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12-minimal:libpython3.12-minimal:3.12.3-1ubuntu0.16:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -88301,13 +94513,13 @@ ], "name": "libpython3.12-minimal", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.15" + "version": "3.12.3-1ubuntu0.16" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=c96b098f30c0767b&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12-stdlib:libpython3.12-stdlib:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&package-id=34cf72aa2254b15b&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12-stdlib:libpython3.12-stdlib:3.12.3-1ubuntu0.16:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -88317,13 +94529,13 @@ ], "name": "libpython3.12-stdlib", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.15" + "version": "3.12.3-1ubuntu0.16" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=a0fdbbbee53b20d5&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12t64:libpython3.12t64:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&package-id=c6592031a4c3ffc2&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12t64:libpython3.12t64:3.12.3-1ubuntu0.16:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -88333,9 +94545,9 @@ ], "name": "libpython3.12t64", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.15" + "version": "3.12.3-1ubuntu0.16" }, { "bom-ref": "pkg:deb/ubuntu/libquadmath0@14.2.0-4ubuntu2~24.04.1?arch=amd64&distro=ubuntu-24.04&package-id=d34fd062630a22ee&upstream=gcc-14", @@ -88354,8 +94566,8 @@ "version": "14.2.0-4ubuntu2~24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/librabbitmq4@0.11.0-1ubuntu0.1?arch=amd64&distro=ubuntu-24.04&package-id=39add358bdd6c595&upstream=librabbitmq", - "cpe": "cpe:2.3:a:librabbitmq4:librabbitmq4:0.11.0-1ubuntu0.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/librabbitmq4@0.11.0-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=26e361aabef78bca&upstream=librabbitmq", + "cpe": "cpe:2.3:a:librabbitmq4:librabbitmq4:0.11.0-1ubuntu0.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -88370,9 +94582,9 @@ ], "name": "librabbitmq4", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/librabbitmq4@0.11.0-1ubuntu0.1?arch=amd64&distro=ubuntu-24.04&upstream=librabbitmq", + "purl": "pkg:deb/ubuntu/librabbitmq4@0.11.0-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&upstream=librabbitmq", "type": "library", - "version": "0.11.0-1ubuntu0.1" + "version": "0.11.0-1ubuntu0.2" }, { "bom-ref": "pkg:deb/ubuntu/librav1e0@0.7.1-2?arch=amd64&distro=ubuntu-24.04&package-id=936c68cfd1aa9c90&upstream=rust-rav1e", @@ -88541,8 +94753,8 @@ }, { "author": "Brian McFee, librosa development team ", - "bom-ref": "pkg:pypi/librosa@0.10.2.post1?package-id=4ae8bea6809f1751", - "cpe": "cpe:2.3:a:brian_mcfee\\,_librosa_development_team_project:python-librosa:0.10.2.post1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/librosa@1.0.0?package-id=4aecebe45ff0cec2", + "cpe": "cpe:2.3:a:brian_mcfee\\,_librosa_development_team_project:python-librosa:1.0.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -88551,9 +94763,9 @@ } ], "name": "librosa", - "purl": "pkg:pypi/librosa@0.10.2.post1", + "purl": "pkg:pypi/librosa@1.0.0", "type": "library", - "version": "0.10.2.post1" + "version": "1.0.0" }, { "bom-ref": "pkg:deb/ubuntu/librsvg2-2@2.58.0%2Bdfsg-1build1?arch=amd64&distro=ubuntu-24.04&package-id=3e21742d39cf764c&upstream=librsvg", @@ -89331,8 +95543,8 @@ "version": "2:1.2.3-1build3" }, { - "bom-ref": "pkg:deb/ubuntu/libsmartcols1@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&package-id=e9ce5bacf834f391&upstream=util-linux", - "cpe": "cpe:2.3:a:libsmartcols1:libsmartcols1:2.39.3-9ubuntu6.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libsmartcols1@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&package-id=e0380baf79d39c85&upstream=util-linux", + "cpe": "cpe:2.3:a:libsmartcols1:libsmartcols1:2.39.3-9ubuntu6.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -89417,9 +95629,9 @@ ], "name": "libsmartcols1", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libsmartcols1@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", + "purl": "pkg:deb/ubuntu/libsmartcols1@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", "type": "library", - "version": "2.39.3-9ubuntu6.5" + "version": "2.39.3-9ubuntu6.6" }, { "bom-ref": "pkg:deb/ubuntu/libsnappy1v5@1.1.10-1build1?arch=amd64&distro=ubuntu-24.04&package-id=c68a0ef279cd5e55&upstream=snappy", @@ -89899,8 +96111,8 @@ "version": "1.47.0-2.4~exp1ubuntu4.1" }, { - "bom-ref": "pkg:deb/ubuntu/libssh-4@0.10.6-2ubuntu0.4?arch=amd64&distro=ubuntu-24.04&package-id=8316d9307af50d93&upstream=libssh", - "cpe": "cpe:2.3:a:libssh-4:libssh-4:0.10.6-2ubuntu0.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libssh-4@0.10.6-2ubuntu0.5?arch=amd64&distro=ubuntu-24.04&package-id=b1981afa1eb37bc4&upstream=libssh", + "cpe": "cpe:2.3:a:libssh-4:libssh-4:0.10.6-2ubuntu0.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -89930,13 +96142,13 @@ ], "name": "libssh-4", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libssh-4@0.10.6-2ubuntu0.4?arch=amd64&distro=ubuntu-24.04&upstream=libssh", + "purl": "pkg:deb/ubuntu/libssh-4@0.10.6-2ubuntu0.5?arch=amd64&distro=ubuntu-24.04&upstream=libssh", "type": "library", - "version": "0.10.6-2ubuntu0.4" + "version": "0.10.6-2ubuntu0.5" }, { - "bom-ref": "pkg:deb/ubuntu/libssh-gcrypt-4@0.10.6-2ubuntu0.4?arch=amd64&distro=ubuntu-24.04&package-id=8edf4362192d8f4b&upstream=libssh", - "cpe": "cpe:2.3:a:libssh-gcrypt-4:libssh-gcrypt-4:0.10.6-2ubuntu0.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libssh-gcrypt-4@0.10.6-2ubuntu0.5?arch=amd64&distro=ubuntu-24.04&package-id=d835c1583c9dff60&upstream=libssh", + "cpe": "cpe:2.3:a:libssh-gcrypt-4:libssh-gcrypt-4:0.10.6-2ubuntu0.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -89966,13 +96178,13 @@ ], "name": "libssh-gcrypt-4", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libssh-gcrypt-4@0.10.6-2ubuntu0.4?arch=amd64&distro=ubuntu-24.04&upstream=libssh", + "purl": "pkg:deb/ubuntu/libssh-gcrypt-4@0.10.6-2ubuntu0.5?arch=amd64&distro=ubuntu-24.04&upstream=libssh", "type": "library", - "version": "0.10.6-2ubuntu0.4" + "version": "0.10.6-2ubuntu0.5" }, { - "bom-ref": "pkg:deb/ubuntu/libssl3t64@3.0.13-0ubuntu3.12?arch=amd64&distro=ubuntu-24.04&package-id=dadaa29a63de436b&upstream=openssl", - "cpe": "cpe:2.3:a:libssl3t64:libssl3t64:3.0.13-0ubuntu3.12:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libssl3t64@3.0.13-0ubuntu3.15?arch=amd64&distro=ubuntu-24.04&package-id=2ac4adc4c7fa0d45&upstream=openssl", + "cpe": "cpe:2.3:a:libssl3t64:libssl3t64:3.0.13-0ubuntu3.15:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -89997,9 +96209,9 @@ ], "name": "libssl3t64", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libssl3t64@3.0.13-0ubuntu3.12?arch=amd64&distro=ubuntu-24.04&upstream=openssl", + "purl": "pkg:deb/ubuntu/libssl3t64@3.0.13-0ubuntu3.15?arch=amd64&distro=ubuntu-24.04&upstream=openssl", "type": "library", - "version": "3.0.13-0ubuntu3.12" + "version": "3.0.13-0ubuntu3.15" }, { "bom-ref": "pkg:deb/ubuntu/libstdc%2B%2B-13-dev@13.3.0-6ubuntu2~24.04.1?arch=amd64&distro=ubuntu-24.04&package-id=6d29a9ad939d0d4b&upstream=gcc-13", @@ -90033,6 +96245,22 @@ "type": "library", "version": "14.2.0-4ubuntu2~24.04.1" }, + { + "bom-ref": "pkg:deb/ubuntu/libstemmer0d@2.2.0-4build1?arch=amd64&distro=ubuntu-24.04&package-id=74e4f6c187163ae6&upstream=snowball", + "cpe": "cpe:2.3:a:libstemmer0d:libstemmer0d:2.2.0-4build1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "BSD-3-snowball" + } + } + ], + "name": "libstemmer0d", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libstemmer0d@2.2.0-4build1?arch=amd64&distro=ubuntu-24.04&upstream=snowball", + "type": "library", + "version": "2.2.0-4build1" + }, { "bom-ref": "pkg:deb/ubuntu/libsvtav1enc1d1@1.7.0%2Bdfsg-2build1?arch=amd64&distro=ubuntu-24.04&package-id=b16564eda3b1cdae&upstream=svt-av1", "cpe": "cpe:2.3:a:libsvtav1enc1d1:libsvtav1enc1d1:1.7.0\\+dfsg-2build1:*:*:*:*:*:*:*", @@ -90721,6 +96949,32 @@ "type": "library", "version": "1.1-2build1.1" }, + { + "bom-ref": "pkg:deb/ubuntu/libunwind8@1.6.2-3build1.1?arch=amd64&distro=ubuntu-24.04&package-id=134be7779d1fbc68&upstream=libunwind", + "cpe": "cpe:2.3:a:libunwind8:libunwind8:1.6.2-3build1.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + } + ], + "name": "libunwind8", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libunwind8@1.6.2-3build1.1?arch=amd64&distro=ubuntu-24.04&upstream=libunwind", + "type": "library", + "version": "1.6.2-3build1.1" + }, { "bom-ref": "pkg:deb/ubuntu/libusb-1.0-0@2%3A1.0.27-1?arch=amd64&distro=ubuntu-24.04&package-id=0704e1fc9a746797&upstream=libusb-1.0", "cpe": "cpe:2.3:a:libusb-1.0-0:libusb-1.0-0:2\\:1.0.27-1:*:*:*:*:*:*:*", @@ -90738,8 +96992,8 @@ "version": "2:1.0.27-1" }, { - "bom-ref": "pkg:deb/ubuntu/libuuid1@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&package-id=12e93d3f2a68625a&upstream=util-linux", - "cpe": "cpe:2.3:a:libuuid1:libuuid1:2.39.3-9ubuntu6.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libuuid1@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&package-id=ee5b3d781052e1ec&upstream=util-linux", + "cpe": "cpe:2.3:a:libuuid1:libuuid1:2.39.3-9ubuntu6.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -90824,13 +97078,13 @@ ], "name": "libuuid1", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libuuid1@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", + "purl": "pkg:deb/ubuntu/libuuid1@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", "type": "library", - "version": "2.39.3-9ubuntu6.5" + "version": "2.39.3-9ubuntu6.6" }, { - "bom-ref": "pkg:deb/ubuntu/libva-drm2@2.20.0-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=f1a9b0839060a0be&upstream=libva", - "cpe": "cpe:2.3:a:libva-drm2:libva-drm2:2.20.0-2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libva-drm2@2.24.1-1~24.04~ppa2?arch=amd64&distro=ubuntu-24.04&package-id=c805c488ea21fad4&upstream=libva", + "cpe": "cpe:2.3:a:libva-drm2:libva-drm2:2.24.1-1\\~24.04\\~ppa2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -90859,14 +97113,14 @@ } ], "name": "libva-drm2", - "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libva-drm2@2.20.0-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&upstream=libva", + "publisher": "Debian Multimedia Maintainers ", + "purl": "pkg:deb/ubuntu/libva-drm2@2.24.1-1~24.04~ppa2?arch=amd64&distro=ubuntu-24.04&upstream=libva", "type": "library", - "version": "2.20.0-2ubuntu0.2" + "version": "2.24.1-1~24.04~ppa2" }, { - "bom-ref": "pkg:deb/ubuntu/libva-x11-2@2.20.0-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=f320a947c812f8e9&upstream=libva", - "cpe": "cpe:2.3:a:libva-x11-2:libva-x11-2:2.20.0-2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libva-x11-2@2.24.1-1~24.04~ppa2?arch=amd64&distro=ubuntu-24.04&package-id=3f445f16a8b0ce59&upstream=libva", + "cpe": "cpe:2.3:a:libva-x11-2:libva-x11-2:2.24.1-1\\~24.04\\~ppa2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -90895,14 +97149,14 @@ } ], "name": "libva-x11-2", - "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libva-x11-2@2.20.0-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&upstream=libva", + "publisher": "Debian Multimedia Maintainers ", + "purl": "pkg:deb/ubuntu/libva-x11-2@2.24.1-1~24.04~ppa2?arch=amd64&distro=ubuntu-24.04&upstream=libva", "type": "library", - "version": "2.20.0-2ubuntu0.2" + "version": "2.24.1-1~24.04~ppa2" }, { - "bom-ref": "pkg:deb/ubuntu/libva2@2.20.0-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=7953241b8263a0f9&upstream=libva", - "cpe": "cpe:2.3:a:libva2:libva2:2.20.0-2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libva2@2.24.1-1~24.04~ppa2?arch=amd64&distro=ubuntu-24.04&package-id=cabeffd87f2ecdef&upstream=libva", + "cpe": "cpe:2.3:a:libva2:libva2:2.24.1-1\\~24.04\\~ppa2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -90931,10 +97185,10 @@ } ], "name": "libva2", - "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libva2@2.20.0-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&upstream=libva", + "publisher": "Debian Multimedia Maintainers ", + "purl": "pkg:deb/ubuntu/libva2@2.24.1-1~24.04~ppa2?arch=amd64&distro=ubuntu-24.04&upstream=libva", "type": "library", - "version": "2.20.0-2ubuntu0.2" + "version": "2.24.1-1~24.04~ppa2" }, { "bom-ref": "pkg:deb/ubuntu/libvdpau1@1.5-2build1?arch=amd64&distro=ubuntu-24.04&package-id=8523691fb2c890cc&upstream=libvdpau", @@ -91682,6 +97936,32 @@ "type": "library", "version": "2.9.14+dfsg-1.3ubuntu3.8" }, + { + "bom-ref": "pkg:deb/ubuntu/libxmlb2@0.3.24-1~ubuntu0.24.04.1?arch=amd64&distro=ubuntu-24.04&package-id=c43af1f6bc61d1b8&upstream=libxmlb", + "cpe": "cpe:2.3:a:libxmlb2:libxmlb2:0.3.24-1\\~ubuntu0.24.04.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + } + ], + "name": "libxmlb2", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libxmlb2@0.3.24-1~ubuntu0.24.04.1?arch=amd64&distro=ubuntu-24.04&upstream=libxmlb", + "type": "library", + "version": "0.3.24-1~ubuntu0.24.04.1" + }, { "bom-ref": "pkg:deb/ubuntu/libxrandr2@2%3A1.5.2-2build1?arch=amd64&distro=ubuntu-24.04&package-id=9b013452b7e60350&upstream=libxrandr", "cpe": "cpe:2.3:a:libxrandr2:libxrandr2:2\\:1.5.2-2build1:*:*:*:*:*:*:*", @@ -91841,8 +98121,38 @@ "version": "0.8.2-2build1" }, { - "bom-ref": "pkg:deb/ubuntu/libze-intel-gpu1@26.18.38308.1-0?arch=amd64&distro=ubuntu-24.04&package-id=c095f7f943068402&upstream=intel-compute-runtime", - "cpe": "cpe:2.3:a:libze-intel-gpu1:libze-intel-gpu1:26.18.38308.1-0:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libyaml-0-2@0.2.5-1build1?arch=amd64&distro=ubuntu-24.04&package-id=a0a0e0fe562c4afe&upstream=libyaml", + "cpe": "cpe:2.3:a:libyaml-0-2:libyaml-0-2:0.2.5-1build1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "permissive" + } + } + ], + "name": "libyaml-0-2", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libyaml-0-2@0.2.5-1build1?arch=amd64&distro=ubuntu-24.04&upstream=libyaml", + "type": "library", + "version": "0.2.5-1build1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libze-dev@1.32.0?arch=amd64&distro=ubuntu-24.04&package-id=828c1804d227c567", + "cpe": "cpe:2.3:a:libze-dev:libze-dev:1.32.0:*:*:*:*:*:*:*", + "name": "libze-dev", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libze-dev@1.32.0?arch=amd64&distro=ubuntu-24.04", + "type": "library", + "version": "1.32.0" + }, + { + "bom-ref": "pkg:deb/ubuntu/libze-intel-gpu1@26.27.39122.11-0?arch=amd64&distro=ubuntu-24.04&package-id=7949a168b853ce77&upstream=intel-compute-runtime", + "cpe": "cpe:2.3:a:libze-intel-gpu1:libze-intel-gpu1:26.27.39122.11-0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -91862,9 +98172,18 @@ ], "name": "libze-intel-gpu1", "publisher": "Intel Graphics Team ", - "purl": "pkg:deb/ubuntu/libze-intel-gpu1@26.18.38308.1-0?arch=amd64&distro=ubuntu-24.04&upstream=intel-compute-runtime", + "purl": "pkg:deb/ubuntu/libze-intel-gpu1@26.27.39122.11-0?arch=amd64&distro=ubuntu-24.04&upstream=intel-compute-runtime", "type": "library", - "version": "26.18.38308.1-0" + "version": "26.27.39122.11-0" + }, + { + "bom-ref": "pkg:deb/ubuntu/libze1@1.32.0?arch=amd64&distro=ubuntu-24.04&package-id=a72d8f476545dced", + "cpe": "cpe:2.3:a:libze1:libze1:1.32.0:*:*:*:*:*:*:*", + "name": "libze1", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/libze1@1.32.0?arch=amd64&distro=ubuntu-24.04", + "type": "library", + "version": "1.32.0" }, { "bom-ref": "pkg:deb/ubuntu/libzimg2@3.0.5%2Bds1-1build1?arch=amd64&distro=ubuntu-24.04&package-id=fa56a66a1f0a261f&upstream=zimg", @@ -92088,8 +98407,8 @@ "version": "0.2.42-2" }, { - "bom-ref": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-137.137?arch=amd64&distro=ubuntu-24.04&package-id=4edd5978b8a69a3e&upstream=linux", - "cpe": "cpe:2.3:a:linux-libc-dev:linux-libc-dev:6.8.0-137.137:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-139.139?arch=amd64&distro=ubuntu-24.04&package-id=23033b06645f6f4a&upstream=linux", + "cpe": "cpe:2.3:a:linux-libc-dev:linux-libc-dev:6.8.0-139.139:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -92099,9 +98418,9 @@ ], "name": "linux-libc-dev", "publisher": "Ubuntu Kernel Team ", - "purl": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-137.137?arch=amd64&distro=ubuntu-24.04&upstream=linux", + "purl": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-139.139?arch=amd64&distro=ubuntu-24.04&upstream=linux", "type": "library", - "version": "6.8.0-137.137" + "version": "6.8.0-139.139" }, { "bom-ref": "pkg:cargo/linux-raw-sys@0.12.1?package-id=3a535813fa5cc67d", @@ -92238,8 +98557,8 @@ "version": "0.4.29" }, { - "bom-ref": "pkg:maven/org.apache.logging.log4j/log4j-api@2.25.3?package-id=18f29d260f75afb3", - "cpe": "cpe:2.3:a:apache:log4j-api:2.25.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:maven/org.apache.logging.log4j/log4j-api@2.25.4?package-id=05bce79ce455c3cd", + "cpe": "cpe:2.3:a:apache:log4j-api:2.25.4:*:*:*:*:*:*:*", "group": "org.apache.logging.log4j", "licenses": [ { @@ -92250,13 +98569,13 @@ } ], "name": "log4j-api", - "purl": "pkg:maven/org.apache.logging.log4j/log4j-api@2.25.3", + "purl": "pkg:maven/org.apache.logging.log4j/log4j-api@2.25.4", "type": "library", - "version": "2.25.3" + "version": "2.25.4" }, { - "bom-ref": "pkg:maven/org.apache.logging.log4j/log4j-core@2.25.3?package-id=241e2fa7cb3458cf", - "cpe": "cpe:2.3:a:apache:log4j-core:2.25.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:maven/org.apache.logging.log4j/log4j-core@2.25.4?package-id=728e3d6c01935799", + "cpe": "cpe:2.3:a:apache:log4j-core:2.25.4:*:*:*:*:*:*:*", "group": "org.apache.logging.log4j", "licenses": [ { @@ -92267,13 +98586,13 @@ } ], "name": "log4j-core", - "purl": "pkg:maven/org.apache.logging.log4j/log4j-core@2.25.3", + "purl": "pkg:maven/org.apache.logging.log4j/log4j-core@2.25.4", "type": "library", - "version": "2.25.3" + "version": "2.25.4" }, { - "bom-ref": "pkg:maven/org.apache.logging.log4j/log4j-slf4j-impl@2.25.3?package-id=871ef5b6ab7a081a", - "cpe": "cpe:2.3:a:apache:log4j-slf4j-impl:2.25.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:maven/org.apache.logging.log4j/log4j-slf4j-impl@2.25.4?package-id=f5f6d3d14c01cf5b", + "cpe": "cpe:2.3:a:apache:log4j-slf4j-impl:2.25.4:*:*:*:*:*:*:*", "group": "org.apache.logging.log4j", "licenses": [ { @@ -92284,9 +98603,9 @@ } ], "name": "log4j-slf4j-impl", - "purl": "pkg:maven/org.apache.logging.log4j/log4j-slf4j-impl@2.25.3", + "purl": "pkg:maven/org.apache.logging.log4j/log4j-slf4j-impl@2.25.4", "type": "library", - "version": "2.25.3" + "version": "2.25.4" }, { "bom-ref": "pkg:deb/ubuntu/login@1%3A4.13%2Bdfsg1-4ubuntu3.2?arch=amd64&distro=ubuntu-24.04&package-id=271cbc4b0386e5d1&upstream=shadow", @@ -92444,8 +98763,8 @@ }, { "author": "lxml dev team ", - "bom-ref": "pkg:pypi/lxml@6.0.2?package-id=4c6d92becefab0b1", - "cpe": "cpe:2.3:a:lxml:lxml:6.0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/lxml@6.1.1?package-id=bf71da88b0b17e4d", + "cpe": "cpe:2.3:a:lxml:lxml:6.1.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -92454,9 +98773,9 @@ } ], "name": "lxml", - "purl": "pkg:pypi/lxml@6.0.2", + "purl": "pkg:pypi/lxml@6.1.1", "type": "library", - "version": "6.0.2" + "version": "6.1.1" }, { "bom-ref": "pkg:maven/com.sun.mail/mailapi@1.6.2?package-id=ab576963a5cb2008", @@ -92506,12 +98825,12 @@ }, { "author": "Chris Sewell ", - "bom-ref": "pkg:pypi/markdown-it-py@4.0.0?package-id=611ec5987c877b68", - "cpe": "cpe:2.3:a:chris_sewell_\\", - "bom-ref": "pkg:pypi/mbstrdecoder@1.1.4?package-id=008e5a318c86552e", - "cpe": "cpe:2.3:a:tsuyoshi_hombashi_project:python-mbstrdecoder:1.1.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/mbstrdecoder@1.1.5?package-id=fd8cde8b6c3f5fc7", + "cpe": "cpe:2.3:a:tsuyoshi_hombashi_project:python-mbstrdecoder:1.1.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -92582,14 +98917,14 @@ } ], "name": "mbstrdecoder", - "purl": "pkg:pypi/mbstrdecoder@1.1.4", + "purl": "pkg:pypi/mbstrdecoder@1.1.5", "type": "library", - "version": "1.1.4" + "version": "1.1.5" }, { - "author": "Anthropic, PBC.", - "bom-ref": "pkg:pypi/mcp@1.28.1?package-id=509ba9cb86959ba1", - "cpe": "cpe:2.3:a:anthropic\\,_pbc__project:python-mcp:1.28.1:*:*:*:*:*:*:*", + "author": "Model Context Protocol a Series of LF Projects, LLC.", + "bom-ref": "pkg:pypi/mcp@2.0.0?package-id=18d9717ce2d12384", + "cpe": "cpe:2.3:a:model_context_protocol_a_series_of_lf_projects\\,_llc__project:python-mcp:2.0.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -92598,9 +98933,9 @@ } ], "name": "mcp", - "purl": "pkg:pypi/mcp@1.28.1", + "purl": "pkg:pypi/mcp@2.0.0", "type": "library", - "version": "1.28.1" + "version": "2.0.0" }, { "author": "Model Context Protocol a Series of LF Projects, LLC.", @@ -92877,8 +99212,8 @@ }, { "author": "Mistral AI ", - "bom-ref": "pkg:pypi/mistral-common@1.11.6?package-id=6145831f01a5bb09", - "cpe": "cpe:2.3:a:mistral_ai_\\", @@ -92925,8 +99260,8 @@ }, { "author": "ModelScope team ", - "bom-ref": "pkg:pypi/modelscope@1.35.3?package-id=bfa13b263b50c98c", - "cpe": "cpe:2.3:a:modelscope_team_project:python-modelscope:1.35.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/modelscope@1.37.1?package-id=0ad7f7bfa8c422e7", + "cpe": "cpe:2.3:a:modelscope_team_project:python-modelscope:1.37.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -92935,13 +99270,13 @@ } ], "name": "modelscope", - "purl": "pkg:pypi/modelscope@1.35.3", + "purl": "pkg:pypi/modelscope@1.37.1", "type": "library", - "version": "1.35.3" + "version": "1.37.1" }, { "author": "Erik Rose ", - "bom-ref": "pkg:pypi/more-itertools@10.8.0?package-id=741b5f48ca271850", + "bom-ref": "pkg:pypi/more-itertools@10.8.0?package-id=b02be4e724b7f616", "cpe": "cpe:2.3:a:erik_rose_\\", - "bom-ref": "pkg:pypi/more-itertools@10.8.0?package-id=b02be4e724b7f616", - "cpe": "cpe:2.3:a:erik_rose_\\", - "purl": "pkg:deb/ubuntu/mount@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", + "purl": "pkg:deb/ubuntu/mount@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&upstream=util-linux", "type": "library", - "version": "2.39.3-9ubuntu6.5" + "version": "2.39.3-9ubuntu6.6" }, { "bom-ref": "pkg:cargo/moxcms@0.8.1?package-id=682f3b00944efdb3", @@ -93116,8 +99451,8 @@ }, { "author": "Inada Naoki ", - "bom-ref": "pkg:pypi/msgpack@1.1.2?package-id=224b4d3e2aa5dda0", - "cpe": "cpe:2.3:a:msgpack:messagepack:1.1.2:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/msgpack@1.2.1?package-id=4d464b0b562d9402", + "cpe": "cpe:2.3:a:inada_naoki_\\, Kenneth Enevoldsen , Nouamane Tazi , Nils Reimers ", - "bom-ref": "pkg:pypi/mteb@2.12.7?package-id=12b43d78899918e1", - "cpe": "cpe:2.3:a:mteb_contributors_\\", @@ -93243,12 +99578,28 @@ }, { "author": "Wenzel Jakob ", - "bom-ref": "pkg:pypi/nanobind@2.14.0?package-id=123eb8ddfa4fa4cf", - "cpe": "cpe:2.3:a:wenzel_jakob_\\>", + "bom-ref": "pkg:pypi/narwhals@2.24.0?package-id=ce90606606705fb0", + "cpe": "cpe:2.3:a:marco_gorelli_\\", - "bom-ref": "pkg:pypi/nixl@1.2.0?package-id=7d4e056177623fa0", - "cpe": "cpe:2.3:a:nixl_developers_\\", - "bom-ref": "pkg:pypi/nixl-cu12@1.2.0?package-id=132cf60948a5afb7", - "cpe": "cpe:2.3:a:nixl_developers_\\", - "bom-ref": "pkg:pypi/nltk@3.9.4?package-id=ac620e5706f112ba", - "cpe": "cpe:2.3:a:nltk:nltk:3.9.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nltk@3.10.3?package-id=6e5df7384ec8674b", + "cpe": "cpe:2.3:a:nltk:nltk:3.10.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -93421,9 +99772,9 @@ } ], "name": "nltk", - "purl": "pkg:pypi/nltk@3.9.4", + "purl": "pkg:pypi/nltk@3.10.3", "type": "library", - "version": "3.9.4" + "version": "3.10.3" }, { "bom-ref": "pkg:cargo/nom@7.1.3?package-id=ac5a9324368077f4", @@ -93682,8 +100033,8 @@ }, { "author": "Travis E. Oliphant et al.", - "bom-ref": "pkg:pypi/numpy@2.2.6?package-id=a6970cb4009207c9", - "cpe": "cpe:2.3:a:travis_e__oliphant_et_al__project:python-numpy:2.2.6:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/numpy@2.3.5?package-id=296d971482b9240b", + "cpe": "cpe:2.3:a:travis_e__oliphant_et_al__project:python-numpy:2.3.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -93692,9 +100043,25 @@ } ], "name": "numpy", - "purl": "pkg:pypi/numpy@2.2.6", + "purl": "pkg:pypi/numpy@2.3.5", "type": "library", - "version": "2.2.6" + "version": "2.3.5" + }, + { + "author": "The OAuthlib Community ", + "bom-ref": "pkg:pypi/oauthlib@3.2.2?package-id=227422ec0b539ec7", + "cpe": "cpe:2.3:a:oauthlib_community_project:python-oauthlib:3.2.2:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "BSD" + } + } + ], + "name": "oauthlib", + "purl": "pkg:pypi/oauthlib@3.2.2", + "type": "library", + "version": "3.2.2" }, { "bom-ref": "pkg:deb/ubuntu/ocl-icd-libopencl1@2.3.2-1build1?arch=amd64&distro=ubuntu-24.04&package-id=f2dddf9743d9c53c&upstream=ocl-icd", @@ -93872,26 +100239,10 @@ "type": "library", "version": "2026.0.0" }, - { - "bom-ref": "pkg:cargo/open@5.4.0?package-id=5072e5873127e547", - "cpe": "cpe:2.3:a:open:open:5.4.0:*:*:*:*:*:*:*", - "name": "open", - "purl": "pkg:cargo/open@5.4.0", - "type": "library", - "version": "5.4.0" - }, - { - "bom-ref": "pkg:cargo/open@5.4.0?package-id=7816dcfd20ad1df1", - "cpe": "cpe:2.3:a:open:open:5.4.0:*:*:*:*:*:*:*", - "name": "open", - "purl": "pkg:cargo/open@5.4.0", - "type": "library", - "version": "5.4.0" - }, { "author": "OpenAI ", - "bom-ref": "pkg:pypi/openai@2.44.0?package-id=efcb464813419564", - "cpe": "cpe:2.3:a:openai_\\", - "purl": "pkg:deb/ubuntu/openssl@3.0.13-0ubuntu3.12?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/openssl@3.0.13-0ubuntu3.15?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "3.0.13-0ubuntu3.12" + "version": "3.0.13-0ubuntu3.15" }, { "bom-ref": "pkg:cargo/openssl-probe@0.2.1?package-id=6907daea4d59b766", @@ -93954,8 +100327,8 @@ }, { "author": "OpenTelemetry Authors ", - "bom-ref": "pkg:pypi/opentelemetry-api@1.43.0?package-id=325f8c68826fd7da", - "cpe": "cpe:2.3:a:opentelemetry_authors_\\", - "bom-ref": "pkg:pypi/opentelemetry-exporter-otlp@1.43.0?package-id=38592b489e58ac23", - "cpe": "cpe:2.3:a:opentelemetry_authors_\\", - "bom-ref": "pkg:pypi/opentelemetry-exporter-otlp-proto-common@1.43.0?package-id=44818bf0ae29b046", - "cpe": "cpe:2.3:a:opentelemetry_authors_\\", - "bom-ref": "pkg:pypi/opentelemetry-exporter-otlp-proto-grpc@1.43.0?package-id=3d4220ad02ac2eec", - "cpe": "cpe:2.3:a:opentelemetry_authors_\\", - "bom-ref": "pkg:pypi/opentelemetry-exporter-otlp-proto-http@1.43.0?package-id=cdffb5e3caeda188", - "cpe": "cpe:2.3:a:opentelemetry_authors_\\", - "bom-ref": "pkg:pypi/opentelemetry-proto@1.43.0?package-id=405cffb26b7c249a", - "cpe": "cpe:2.3:a:opentelemetry_authors_\\", - "bom-ref": "pkg:pypi/opentelemetry-sdk@1.43.0?package-id=e5763f2aa4251451", - "cpe": "cpe:2.3:a:opentelemetry_authors_\\", - "bom-ref": "pkg:pypi/opentelemetry-semantic-conventions@0.64b0?package-id=3f2637a7a52859ed", - "cpe": "cpe:2.3:a:opentelemetry_authors_\\, Nir Gazit , Tomer Friedman ", @@ -94208,9 +100581,45 @@ "type": "library", "version": "4.3.0" }, + { + "bom-ref": "pkg:deb/ubuntu/packagekit@1.2.8-2ubuntu1.5?arch=amd64&distro=ubuntu-24.04&package-id=de0a323b0d7f7375", + "cpe": "cpe:2.3:a:packagekit:packagekit:1.2.8-2ubuntu1.5:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "FSFAP" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + } + ], + "name": "packagekit", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/packagekit@1.2.8-2ubuntu1.5?arch=amd64&distro=ubuntu-24.04", + "type": "library", + "version": "1.2.8-2ubuntu1.5" + }, { "author": "Donald Stufft ", - "bom-ref": "pkg:pypi/packaging@26.0?package-id=3de18eb6fde98363", + "bom-ref": "pkg:pypi/packaging@26.0?package-id=5876734fcd6fa9ab", "cpe": "cpe:2.3:a:donald_stufft_\\", - "bom-ref": "pkg:pypi/packaging@26.0?package-id=5876734fcd6fa9ab", - "cpe": "cpe:2.3:a:donald_stufft_\\", - "bom-ref": "pkg:pypi/pandas@3.0.1?package-id=3df5bc841ab31dd3", - "cpe": "cpe:2.3:a:pandas_development_team_\\", - "purl": "pkg:deb/ubuntu/perl@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/perl@5.38.2-3.2ubuntu0.4?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "5.38.2-3.2ubuntu0.3" + "version": "5.38.2-3.2ubuntu0.4" }, { - "bom-ref": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04&package-id=fa96e1f25c487296&upstream=perl", - "cpe": "cpe:2.3:a:perl-base:perl-base:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.4?arch=amd64&distro=ubuntu-24.04&package-id=2847427c32c5ff15&upstream=perl", + "cpe": "cpe:2.3:a:perl-base:perl-base:5.38.2-3.2ubuntu0.4:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -94744,13 +101153,13 @@ ], "name": "perl-base", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04&upstream=perl", + "purl": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.4?arch=amd64&distro=ubuntu-24.04&upstream=perl", "type": "library", - "version": "5.38.2-3.2ubuntu0.3" + "version": "5.38.2-3.2ubuntu0.4" }, { - "bom-ref": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.3?arch=all&distro=ubuntu-24.04&package-id=20c721d316783591&upstream=perl", - "cpe": "cpe:2.3:a:perl-modules-5.38:perl-modules-5.38:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.4?arch=all&distro=ubuntu-24.04&package-id=f516420ada14c6e6&upstream=perl", + "cpe": "cpe:2.3:a:perl-modules-5.38:perl-modules-5.38:5.38.2-3.2ubuntu0.4:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -94870,9 +101279,9 @@ ], "name": "perl-modules-5.38", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.3?arch=all&distro=ubuntu-24.04&upstream=perl", + "purl": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.4?arch=all&distro=ubuntu-24.04&upstream=perl", "type": "library", - "version": "5.38.2-3.2ubuntu0.3" + "version": "5.38.2-3.2ubuntu0.4" }, { "bom-ref": "pkg:cargo/pest@2.8.6?package-id=460dafb2abc3600a", @@ -94955,9 +101364,9 @@ "version": "0.8.3" }, { - "author": "\"Jeffrey A. Clark\" ", - "bom-ref": "pkg:pypi/pillow@12.1.1?package-id=40eeaca49371d852", - "cpe": "cpe:2.3:a:\\\"jeffrey_a__clark\\\"_\\", + "bom-ref": "pkg:pypi/pillow@12.3.0?package-id=31dbf659f6d88d7f", + "cpe": "cpe:2.3:a:jeffrey_\\'alex\\'_clark_\\", - "bom-ref": "pkg:pypi/pip@26.2.1?package-id=e917edfb3a9fc430", + "bom-ref": "pkg:pypi/pip@26.2.1?package-id=5b2d24c2b0eafa45", "cpe": "cpe:2.3:a:pip_developers_\\", @@ -95162,8 +101571,8 @@ }, { "author": "Ritchie Vink ", - "bom-ref": "pkg:pypi/polars@1.39.3?package-id=6f68f1e8e3c224c0", - "cpe": "cpe:2.3:a:ritchie_vink_\\", - "bom-ref": "pkg:pypi/polars-runtime-32@1.39.3?package-id=5461e34a0dc84691", - "cpe": "cpe:2.3:a:ritchie_vink_\\", + "purl": "pkg:deb/ubuntu/polkitd@124-2ubuntu1.24.04.3?arch=amd64&distro=ubuntu-24.04&upstream=policykit-1", + "type": "library", + "version": "124-2ubuntu1.24.04.3" }, { "author": "The Pooch Developers ", - "bom-ref": "pkg:pypi/pooch@1.8.2?package-id=071a0d31e5d38e69", - "cpe": "cpe:2.3:a:pooch_developers_\\", - "bom-ref": "pkg:pypi/portalocker@3.2.0?package-id=4f0cf5737cdb6f76", - "cpe": "cpe:2.3:a:rick_van_hattem_\\>", + "bom-ref": "pkg:pypi/portalocker@4.1.0?package-id=62956bb6f3bc1d2e", + "cpe": "cpe:2.3:a:rick_van_hattem_\\", - "bom-ref": "pkg:pypi/prometheus-client@0.25.0?package-id=9371c05e9212082b", - "cpe": "cpe:2.3:a:prometheus_authors_\\", - "bom-ref": "pkg:pypi/prometheus-fastapi-instrumentator@8.0.2?package-id=b5ed2522dd289bb6", - "cpe": "cpe:2.3:a:python-prometheus-fastapi-instrumentator:python-prometheus-fastapi-instrumentator:8.0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/prometheus-fastapi-instrumentator@8.1.0?package-id=5ac161b87a9f57e4", + "cpe": "cpe:2.3:a:python-prometheus-fastapi-instrumentator:python-prometheus-fastapi-instrumentator:8.1.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -95508,14 +101955,14 @@ } ], "name": "prometheus-fastapi-instrumentator", - "purl": "pkg:pypi/prometheus-fastapi-instrumentator@8.0.2", + "purl": "pkg:pypi/prometheus-fastapi-instrumentator@8.1.0", "type": "library", - "version": "8.0.2" + "version": "8.1.0" }, { "author": "Andrew Svetlov ", - "bom-ref": "pkg:pypi/propcache@0.4.1?package-id=df6a317b26e5f6ad", - "cpe": "cpe:2.3:a:andrew_svetlov_project:python-propcache:0.4.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/propcache@0.5.2?package-id=0f634a62c1647bca", + "cpe": "cpe:2.3:a:andrew_svetlov_project:python-propcache:0.5.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -95524,9 +101971,9 @@ } ], "name": "propcache", - "purl": "pkg:pypi/propcache@0.4.1", + "purl": "pkg:pypi/propcache@0.5.2", "type": "library", - "version": "0.4.1" + "version": "0.5.2" }, { "author": "Andrew Svetlov ", @@ -95640,22 +102087,6 @@ "type": "library", "version": "0.1.28" }, - { - "author": "holger krekel, Ronny Pfannschmidt, Benjamin Peterson and others ", - "bom-ref": "pkg:pypi/py@1.11.0?package-id=be5124545c603c87", - "cpe": "cpe:2.3:a:holger_krekel\\,_ronny_pfannschmidt\\,_benjamin_peterson_and_others_project:python-py:1.11.0:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "MIT license" - } - } - ], - "name": "py", - "purl": "pkg:pypi/py@1.11.0", - "type": "library", - "version": "1.11.0" - }, { "author": "Matthew Brennan Jones ", "bom-ref": "pkg:pypi/py-cpuinfo@9.0.0?package-id=811f5066ffa409cf", @@ -95673,8 +102104,8 @@ "version": "9.0.0" }, { - "bom-ref": "pkg:pypi/pyarrow@23.0.1?package-id=e1cd03de742ecb11", - "cpe": "cpe:2.3:a:python-pyarrow:python-pyarrow:23.0.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pyarrow@25.0.1?package-id=3c5e1846aab0a2ee", + "cpe": "cpe:2.3:a:python-pyarrow:python-pyarrow:25.0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -95683,14 +102114,14 @@ } ], "name": "pyarrow", - "purl": "pkg:pypi/pyarrow@23.0.1", + "purl": "pkg:pypi/pyarrow@25.0.1", "type": "library", - "version": "23.0.1" + "version": "25.0.1" }, { "author": "Matthieu Darbois", - "bom-ref": "pkg:pypi/pybase64@1.4.3?package-id=2ba5e3d7e6a6496b", - "cpe": "cpe:2.3:a:matthieu_darbois_project:python-pybase64:1.4.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pybase64@1.5.0?package-id=4d46156ef8c55529", + "cpe": "cpe:2.3:a:matthieu_darbois_project:python-pybase64:1.5.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -95699,9 +102130,9 @@ } ], "name": "pybase64", - "purl": "pkg:pypi/pybase64@1.4.3", + "purl": "pkg:pypi/pybase64@1.5.0", "type": "library", - "version": "1.4.3" + "version": "1.5.0" }, { "author": "Christian Theune ", @@ -95752,9 +102183,9 @@ "version": "3.23.0" }, { - "author": "Samuel Colvin , Eric Jolibois , Hasan Ramezani , Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Terrence Dorsey , David Montague , Serge Matveenko , Marcelo Trylesinski , Sydney Runkle , David Hewitt , Alex Hall , Victorien Plot , Douwe Maan ", - "bom-ref": "pkg:pypi/pydantic@2.12.5?package-id=c7eb108f1cb903ab", - "cpe": "cpe:2.3:a:samuel_colvin_\\, Eric Jolibois , Hasan Ramezani , Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Terrence Dorsey , David Montague , Serge Matveenko , Marcelo Trylesinski , Sydney Runkle , David Hewitt , Alex Hall , Victorien Plot ", + "bom-ref": "pkg:pypi/pydantic@2.13.4?package-id=61e8ecc30d242811", + "cpe": "cpe:2.3:a:samuel_colvin_\\, Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, David Montague , David Hewitt , Sydney Runkle , Victorien Plot ", - "bom-ref": "pkg:pypi/pydantic-core@2.41.5?package-id=1c8bc4228b255138", - "cpe": "cpe:2.3:a:samuel_colvin_\\, Yasser Tahiri ", @@ -95801,8 +102232,8 @@ }, { "author": "Samuel Colvin , Eric Jolibois , Hasan Ramezani ", - "bom-ref": "pkg:pypi/pydantic-settings@2.14.2?package-id=3ee3547dcb4d7077", - "cpe": "cpe:2.3:a:pydantic:pydantic-settings:2.14.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pydantic-settings@2.15.0?package-id=8f58c1592fe9d013", + "cpe": "cpe:2.3:a:python-pydantic-settings:python-pydantic-settings:2.15.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -95811,14 +102242,14 @@ } ], "name": "pydantic-settings", - "purl": "pkg:pypi/pydantic-settings@2.14.2", + "purl": "pkg:pypi/pydantic-settings@2.15.0", "type": "library", - "version": "2.14.2" + "version": "2.15.0" }, { "author": "Eli Bendersky ", - "bom-ref": "pkg:pypi/pyelftools@0.32?package-id=ad7d70e345b3c1fa", - "cpe": "cpe:2.3:a:eli_bendersky_project:python-pyelftools:0.32:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pyelftools@0.33?package-id=b379cad01a019c36", + "cpe": "cpe:2.3:a:eli_bendersky_\\", - "bom-ref": "pkg:pypi/pygments@2.20.0?package-id=09dd9e6d7865d26e", - "cpe": "cpe:2.3:a:georg_brandl_\\", + "bom-ref": "pkg:pypi/pygobject@3.48.2?package-id=8b01ff27411ee1f1", + "cpe": "cpe:2.3:a:james_henstridge_project:python-pygobject:3.48.2:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "GNU LGPL" + } + } + ], + "name": "pygobject", + "purl": "pkg:pypi/pygobject@3.48.2", + "type": "library", + "version": "3.48.2" }, { "author": "Jose Padilla ", @@ -95863,10 +102310,35 @@ "type": "library", "version": "2.13.0" }, + { + "author": "Jose Padilla ", + "bom-ref": "pkg:pypi/pyjwt@2.7.0?package-id=6e8fecd30857fb34", + "cpe": "cpe:2.3:a:jose_padilla_project:python-pyjwt:2.7.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], + "name": "pyjwt", + "purl": "pkg:pypi/pyjwt@2.7.0", + "type": "library", + "version": "2.7.0" + }, + { + "author": "Paul McGuire ", + "bom-ref": "pkg:pypi/pyparsing@3.1.1?package-id=169d73a55342862a", + "cpe": "cpe:2.3:a:paul_mcguire_\\", - "bom-ref": "pkg:pypi/pyrate-limiter@4.1.0?package-id=b6a41d1255dc54d0", - "cpe": "cpe:2.3:a:python-pyrate-limiter:python-pyrate-limiter:4.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pyrate-limiter@4.4.0?package-id=f44e332b20a94c36", + "cpe": "cpe:2.3:a:python-pyrate-limiter:python-pyrate-limiter:4.4.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -95875,14 +102347,14 @@ } ], "name": "pyrate-limiter", - "purl": "pkg:pypi/pyrate-limiter@4.1.0", + "purl": "pkg:pypi/pyrate-limiter@4.4.0", "type": "library", - "version": "4.1.0" + "version": "4.4.0" }, { "author": "Richard Boulton ", - "bom-ref": "pkg:pypi/pystemmer@3.0.0?package-id=d9e8672ca5b566c3", - "cpe": "cpe:2.3:a:richard_boulton_project:python-pystemmer:3.0.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pystemmer@3.1.0?package-id=cc8aa581e65e81a9", + "cpe": "cpe:2.3:a:richard_boulton_project:python-pystemmer:3.1.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -95891,9 +102363,9 @@ } ], "name": "pystemmer", - "purl": "pkg:pypi/pystemmer@3.0.0", + "purl": "pkg:pypi/pystemmer@3.1.0", "type": "library", - "version": "3.0.0" + "version": "3.1.0" }, { "author": "Tsuyoshi Hombashi ", @@ -95912,9 +102384,9 @@ "version": "1.2.1" }, { - "author": "Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin, Others (See AUTHORS)", - "bom-ref": "pkg:pypi/pytest@9.0.2?package-id=0036109652db91f8", - "cpe": "cpe:2.3:a:holger_krekel\\,_bruno_oliveira\\,_ronny_pfannschmidt\\,_floris_bruynooghe\\,_brianna_laugher\\,_florian_bruhin\\,_others_\\(see_authors\\)_project:python-pytest:9.0.2:*:*:*:*:*:*:*", + "author": "Brianna Laugher, Bruno Oliveira, Floris Bruynooghe, Freya Bruhin, Holger Krekel, Others (See AUTHORS), Ronny Pfannschmidt", + "bom-ref": "pkg:pypi/pytest@9.1.1?package-id=619d15ac7c16970c", + "cpe": "cpe:2.3:a:brianna_laugher\\,_bruno_oliveira\\,_floris_bruynooghe\\,_freya_bruhin\\,_holger_krekel\\,_others_\\(see_authors\\)\\,_ronny_pfannschmidt_project:python-pytest:9.1.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -95923,14 +102395,14 @@ } ], "name": "pytest", - "purl": "pkg:pypi/pytest@9.0.2", + "purl": "pkg:pypi/pytest@9.1.1", "type": "library", - "version": "9.0.2" + "version": "9.1.1" }, { "author": "Tin Tvrtkovi\u0107 ", - "bom-ref": "pkg:pypi/pytest-asyncio@1.3.0?package-id=9558533adddfbe2c", - "cpe": "cpe:2.3:a:python-pytest-asyncio:python-pytest-asyncio:1.3.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pytest-asyncio@1.4.0?package-id=89b07689765d1738", + "cpe": "cpe:2.3:a:python-pytest-asyncio:python-pytest-asyncio:1.4.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -95939,14 +102411,14 @@ } ], "name": "pytest-asyncio", - "purl": "pkg:pypi/pytest-asyncio@1.3.0", + "purl": "pkg:pypi/pytest-asyncio@1.4.0", "type": "library", - "version": "1.3.0" + "version": "1.4.0" }, { "author": "Marc Schlaich ", - "bom-ref": "pkg:pypi/pytest-cov@6.3.0?package-id=8179b4caffc1f214", - "cpe": "cpe:2.3:a:marc_schlaich_project:python-pytest-cov:6.3.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pytest-cov@7.1.0?package-id=7351c84cac0d152b", + "cpe": "cpe:2.3:a:marc_schlaich_\\", - "bom-ref": "pkg:pypi/pytest-forked@1.6.0?package-id=e1479661e1e11370", - "cpe": "cpe:2.3:a:python-pytest-forked:python-pytest-forked:1.6.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pytest-forked@1.7.5?package-id=b0178484bd7a12fe", + "cpe": "cpe:2.3:a:python-pytest-forked:python-pytest-forked:1.7.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -95971,25 +102443,25 @@ } ], "name": "pytest-forked", - "purl": "pkg:pypi/pytest-forked@1.6.0", + "purl": "pkg:pypi/pytest-forked@1.7.5", "type": "library", - "version": "1.6.0" + "version": "1.7.5" }, { "author": "Leah Klearman ", - "bom-ref": "pkg:pypi/pytest-rerunfailures@14.0?package-id=289ab56c4ddb1ea4", - "cpe": "cpe:2.3:a:leah_klearman_\\", - "bom-ref": "pkg:pypi/pytest-timeout@2.3.1?package-id=b38124d9d6d57aa9", - "cpe": "cpe:2.3:a:floris_bruynooghe_project:python-pytest-timeout:2.3.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pytest-timeout@2.4.0?package-id=b570ce87dc7f3614", + "cpe": "cpe:2.3:a:floris_bruynooghe_project:python-pytest-timeout:2.4.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -96018,9 +102490,51 @@ } ], "name": "pytest-timeout", - "purl": "pkg:pypi/pytest-timeout@2.3.1", + "purl": "pkg:pypi/pytest-timeout@2.4.0", "type": "library", - "version": "2.3.1" + "version": "2.4.0" + }, + { + "author": "APT Development Team ", + "bom-ref": "pkg:pypi/python-apt@2.7.7%2Bubuntu5.3?package-id=f8e7e54817c92207", + "cpe": "cpe:2.3:a:apt_development_team_project:python-apt:2.7.7\\+ubuntu5.3:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "GNU GPL" + } + } + ], + "name": "python-apt", + "purl": "pkg:pypi/python-apt@2.7.7%2Bubuntu5.3", + "type": "library", + "version": "2.7.7+ubuntu5.3" + }, + { + "bom-ref": "pkg:deb/ubuntu/python-apt-common@2.7.7ubuntu5.3?arch=all&distro=ubuntu-24.04&package-id=9b6b8ef6d4c84f50&upstream=python-apt", + "cpe": "cpe:2.3:a:python-apt-common:python-apt-common:2.7.7ubuntu5.3:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "name": "Permissive" + } + } + ], + "name": "python-apt-common", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python-apt-common@2.7.7ubuntu5.3?arch=all&distro=ubuntu-24.04&upstream=python-apt", + "type": "library", + "version": "2.7.7ubuntu5.3" }, { "author": "Gustavo Niemeyer ", @@ -96040,8 +102554,8 @@ }, { "author": "Saurabh Kumar ", - "bom-ref": "pkg:pypi/python-dotenv@1.2.2?package-id=5ae69ebf532b4f05", - "cpe": "cpe:2.3:a:saurabh-kumar:python-dotenv:1.2.2:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/python-dotenv@1.2.3?package-id=cb7eb966c4f9d910", + "cpe": "cpe:2.3:a:saurabh-kumar:python-dotenv:1.2.3:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -96050,14 +102564,14 @@ } ], "name": "python-dotenv", - "purl": "pkg:pypi/python-dotenv@1.2.2", + "purl": "pkg:pypi/python-dotenv@1.2.3", "type": "library", - "version": "1.2.2" + "version": "1.2.3" }, { "author": "Zakaria Zajac , Nicholas Hairs ", - "bom-ref": "pkg:pypi/python-json-logger@4.1.0?package-id=d3d9183ca23b09ae", - "cpe": "cpe:2.3:a:nhairs:python_json_logger:4.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/python-json-logger@4.2.0?package-id=eed0f3d38a1c57ac", + "cpe": "cpe:2.3:a:nhairs:python_json_logger:4.2.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -96066,9 +102580,9 @@ } ], "name": "python-json-logger", - "purl": "pkg:pypi/python-json-logger@4.1.0", + "purl": "pkg:pypi/python-json-logger@4.2.0", "type": "library", - "version": "4.1.0" + "version": "4.2.0" }, { "author": "Andrew Dunham ", @@ -96102,6 +102616,298 @@ "type": "library", "version": "3.12.3-0ubuntu2.1" }, + { + "bom-ref": "pkg:deb/ubuntu/python3-apt@2.7.7ubuntu5.3?arch=amd64&distro=ubuntu-24.04&package-id=2d58bc46e58af2c5&upstream=python-apt", + "cpe": "cpe:2.3:a:python3-apt:python3-apt:2.7.7ubuntu5.3:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "name": "Permissive" + } + } + ], + "name": "python3-apt", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-apt@2.7.7ubuntu5.3?arch=amd64&distro=ubuntu-24.04&upstream=python-apt", + "type": "library", + "version": "2.7.7ubuntu5.3" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-blinker@1.7.0-1?arch=all&distro=ubuntu-24.04&package-id=2a01c0b25b9dcc97&upstream=blinker", + "cpe": "cpe:2.3:a:python3-blinker:python3-blinker:1.7.0-1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "name": "Expat" + } + } + ], + "name": "python3-blinker", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-blinker@1.7.0-1?arch=all&distro=ubuntu-24.04&upstream=blinker", + "type": "library", + "version": "1.7.0-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-cffi-backend@1.16.0-2build1?arch=amd64&distro=ubuntu-24.04&package-id=801b71ce622de8e1&upstream=python-cffi", + "cpe": "cpe:2.3:a:python3-cffi-backend:python3-cffi-backend:1.16.0-2build1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "Expat" + } + } + ], + "name": "python3-cffi-backend", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-cffi-backend@1.16.0-2build1?arch=amd64&distro=ubuntu-24.04&upstream=python-cffi", + "type": "library", + "version": "1.16.0-2build1" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-cryptography@41.0.7-4ubuntu0.4?arch=amd64&distro=ubuntu-24.04&package-id=3e32ecc296d034de&upstream=python-cryptography", + "cpe": "cpe:2.3:a:python3-cryptography:python3-cryptography:41.0.7-4ubuntu0.4:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + }, + { + "license": { + "name": "Apache" + } + }, + { + "license": { + "name": "Expat" + } + } + ], + "name": "python3-cryptography", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-cryptography@41.0.7-4ubuntu0.4?arch=amd64&distro=ubuntu-24.04&upstream=python-cryptography", + "type": "library", + "version": "41.0.7-4ubuntu0.4" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-dbus@1.3.2-5build3?arch=amd64&distro=ubuntu-24.04&package-id=f7ad0676e08bb287&upstream=dbus-python", + "cpe": "cpe:2.3:a:python3-dbus:python3-dbus:1.3.2-5build3:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "AFL-2.1" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + } + ], + "name": "python3-dbus", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-dbus@1.3.2-5build3?arch=amd64&distro=ubuntu-24.04&upstream=dbus-python", + "type": "library", + "version": "1.3.2-5build3" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-distro@1.9.0-1?arch=all&distro=ubuntu-24.04&package-id=5e3e0bddcea198cf&upstream=python-distro", + "cpe": "cpe:2.3:a:python3-distro:python3-distro:1.9.0-1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + } + ], + "name": "python3-distro", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-distro@1.9.0-1?arch=all&distro=ubuntu-24.04&upstream=python-distro", + "type": "library", + "version": "1.9.0-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-gi@3.48.2-1?arch=amd64&distro=ubuntu-24.04&package-id=1c179e48df150b75&upstream=pygobject", + "cpe": "cpe:2.3:a:python3-gi:python3-gi:3.48.2-1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "LGPL-2.0-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "name": "Expat" + } + } + ], + "name": "python3-gi", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-gi@3.48.2-1?arch=amd64&distro=ubuntu-24.04&upstream=pygobject", + "type": "library", + "version": "3.48.2-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-httplib2@0.20.4-3ubuntu0.1?arch=all&distro=ubuntu-24.04&package-id=b8ae828e68652456&upstream=python-httplib2", + "cpe": "cpe:2.3:a:python3-httplib2:python3-httplib2:0.20.4-3ubuntu0.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "MPL-1.1" + } + }, + { + "license": { + "name": "BSD-3" + } + }, + { + "license": { + "name": "Expat" + } + } + ], + "name": "python3-httplib2", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-httplib2@0.20.4-3ubuntu0.1?arch=all&distro=ubuntu-24.04&upstream=python-httplib2", + "type": "library", + "version": "0.20.4-3ubuntu0.1" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-jwt@2.7.0-1ubuntu0.1?arch=all&distro=ubuntu-24.04&package-id=4f654c2f1296f777&upstream=pyjwt", + "cpe": "cpe:2.3:a:python3-jwt:python3-jwt:2.7.0-1ubuntu0.1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "Expat" + } + } + ], + "name": "python3-jwt", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-jwt@2.7.0-1ubuntu0.1?arch=all&distro=ubuntu-24.04&upstream=pyjwt", + "type": "library", + "version": "2.7.0-1ubuntu0.1" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-launchpadlib@1.11.0-6?arch=all&distro=ubuntu-24.04&package-id=f3e8cf0964e6d7d6&upstream=python-launchpadlib", + "cpe": "cpe:2.3:a:python3-launchpadlib:python3-launchpadlib:1.11.0-6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + } + ], + "name": "python3-launchpadlib", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-launchpadlib@1.11.0-6?arch=all&distro=ubuntu-24.04&upstream=python-launchpadlib", + "type": "library", + "version": "1.11.0-6" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-lazr.restfulclient@0.14.6-1?arch=all&distro=ubuntu-24.04&package-id=e8b49acc73d801da&upstream=lazr.restfulclient", + "cpe": "cpe:2.3:a:python3-lazr.restfulclient:python3-lazr.restfulclient:0.14.6-1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + } + ], + "name": "python3-lazr.restfulclient", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-lazr.restfulclient@0.14.6-1?arch=all&distro=ubuntu-24.04&upstream=lazr.restfulclient", + "type": "library", + "version": "0.14.6-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-lazr.uri@1.0.6-3?arch=all&distro=ubuntu-24.04&package-id=91cb57d8438a86bd&upstream=lazr.uri", + "cpe": "cpe:2.3:a:python3-lazr.uri:python3-lazr.uri:1.0.6-3:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "LGPL-3.0-only" + } + } + ], + "name": "python3-lazr.uri", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-lazr.uri@1.0.6-3?arch=all&distro=ubuntu-24.04&upstream=lazr.uri", + "type": "library", + "version": "1.0.6-3" + }, { "bom-ref": "pkg:deb/ubuntu/python3-minimal@3.12.3-0ubuntu2.1?arch=amd64&distro=ubuntu-24.04&package-id=41ed7e9f5b1e212a&upstream=python3-defaults", "cpe": "cpe:2.3:a:python3-minimal:python3-minimal:3.12.3-0ubuntu2.1:*:*:*:*:*:*:*", @@ -96118,6 +102924,22 @@ "type": "library", "version": "3.12.3-0ubuntu2.1" }, + { + "bom-ref": "pkg:deb/ubuntu/python3-oauthlib@3.2.2-1?arch=all&distro=ubuntu-24.04&package-id=6acef014d4e24f34&upstream=python-oauthlib", + "cpe": "cpe:2.3:a:python3-oauthlib:python3-oauthlib:3.2.2-1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ], + "name": "python3-oauthlib", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-oauthlib@3.2.2-1?arch=all&distro=ubuntu-24.04&upstream=python-oauthlib", + "type": "library", + "version": "3.2.2-1" + }, { "bom-ref": "pkg:deb/ubuntu/python3-pip@24.0%2Bdfsg-1ubuntu1.3?arch=all&distro=ubuntu-24.04&package-id=3f87d1fc68fb25c8&upstream=python-pip", "cpe": "cpe:2.3:a:python3-pip:python3-pip:24.0\\+dfsg-1ubuntu1.3:*:*:*:*:*:*:*", @@ -96200,6 +103022,47 @@ "type": "library", "version": "68.1.2-2ubuntu1.2" }, + { + "bom-ref": "pkg:deb/ubuntu/python3-pyparsing@3.1.1-1?arch=all&distro=ubuntu-24.04&package-id=b6198b6764a463ab&upstream=pyparsing", + "cpe": "cpe:2.3:a:python3-pyparsing:python3-pyparsing:3.1.1-1:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-2-Clause" + } + }, + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "MIT/X11" + } + }, + { + "license": { + "name": "ellis-and-grant" + } + }, + { + "license": { + "name": "salvolainen" + } + } + ], + "name": "python3-pyparsing", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-pyparsing@3.1.1-1?arch=all&distro=ubuntu-24.04&upstream=pyparsing", + "type": "library", + "version": "3.1.1-1" + }, { "bom-ref": "pkg:deb/ubuntu/python3-setuptools@68.1.2-2ubuntu1.2?arch=all&distro=ubuntu-24.04&package-id=8093c108f57fd984&upstream=setuptools", "cpe": "cpe:2.3:a:python3-setuptools:python3-setuptools:68.1.2-2ubuntu1.2:*:*:*:*:*:*:*", @@ -96226,6 +103089,69 @@ "type": "library", "version": "68.1.2-2ubuntu1.2" }, + { + "bom-ref": "pkg:deb/ubuntu/python3-six@1.16.0-4?arch=all&distro=ubuntu-24.04&package-id=7bf436c24d74a56f&upstream=six", + "cpe": "cpe:2.3:a:python3-six:python3-six:1.16.0-4:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "Expat" + } + } + ], + "name": "python3-six", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-six@1.16.0-4?arch=all&distro=ubuntu-24.04&upstream=six", + "type": "library", + "version": "1.16.0-4" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-software-properties@0.99.49.4?arch=all&distro=ubuntu-24.04&package-id=bd19f210efb72493&upstream=software-properties", + "cpe": "cpe:2.3:a:python3-software-properties:python3-software-properties:0.99.49.4:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + } + ], + "name": "python3-software-properties", + "publisher": "Michael Vogt ", + "purl": "pkg:deb/ubuntu/python3-software-properties@0.99.49.4?arch=all&distro=ubuntu-24.04&upstream=software-properties", + "type": "library", + "version": "0.99.49.4" + }, + { + "bom-ref": "pkg:deb/ubuntu/python3-wadllib@1.3.6-5?arch=all&distro=ubuntu-24.04&package-id=c1ba73a4a8e59a5d&upstream=python-wadllib", + "cpe": "cpe:2.3:a:python3-wadllib:python3-wadllib:1.3.6-5:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "LGPL-3.0-only" + } + } + ], + "name": "python3-wadllib", + "publisher": "Ubuntu Developers ", + "purl": "pkg:deb/ubuntu/python3-wadllib@1.3.6-5?arch=all&distro=ubuntu-24.04&upstream=python-wadllib", + "type": "library", + "version": "1.3.6-5" + }, { "bom-ref": "pkg:deb/ubuntu/python3-wheel@0.42.0-2?arch=all&distro=ubuntu-24.04&package-id=574f460cd4a2d5b5&upstream=wheel", "cpe": "cpe:2.3:a:python3-wheel:python3-wheel:0.42.0-2:*:*:*:*:*:*:*", @@ -96258,8 +103184,8 @@ "version": "0.42.0-2" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=101771d0ff82c5a2", - "cpe": "cpe:2.3:a:python3.12:python3.12:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&package-id=1d1052317e4cd7d5", + "cpe": "cpe:2.3:a:python3.12:python3.12:3.12.3-1ubuntu0.16:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -96269,13 +103195,13 @@ ], "name": "python3.12", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "3.12.3-1ubuntu0.15" + "version": "3.12.3-1ubuntu0.16" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=684c4b125a202066&upstream=python3.12", - "cpe": "cpe:2.3:a:python3.12-dev:python3.12-dev:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&package-id=05a4484e670048ba&upstream=python3.12", + "cpe": "cpe:2.3:a:python3.12-dev:python3.12-dev:3.12.3-1ubuntu0.16:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -96285,13 +103211,13 @@ ], "name": "python3.12-dev", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.15" + "version": "3.12.3-1ubuntu0.16" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=03edc68efb481cf4&upstream=python3.12", - "cpe": "cpe:2.3:a:python3.12-minimal:python3.12-minimal:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&package-id=f1a9287a53bec8ac&upstream=python3.12", + "cpe": "cpe:2.3:a:python3.12-minimal:python3.12-minimal:3.12.3-1ubuntu0.16:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -96301,9 +103227,9 @@ ], "name": "python3.12-minimal", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.16?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.15" + "version": "3.12.3-1ubuntu0.16" }, { "author": "Christophe Van Gysel -> forked by Terrier team ", @@ -96316,8 +103242,8 @@ }, { "author": "Stuart Bishop ", - "bom-ref": "pkg:pypi/pytz@2026.1.post1?package-id=9802c001b0845ffd", - "cpe": "cpe:2.3:a:stuart_bishop_project:python-pytz:2026.1.post1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pytz@2026.3.post1?package-id=fba06844ba19acc6", + "cpe": "cpe:2.3:a:stuart_bishop_project:python-pytz:2026.3.post1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -96326,9 +103252,9 @@ } ], "name": "pytz", - "purl": "pkg:pypi/pytz@2026.1.post1", + "purl": "pkg:pypi/pytz@2026.3.post1", "type": "library", - "version": "2026.1.post1" + "version": "2026.3.post1" }, { "author": "Kirill Simonov ", @@ -96588,17 +103514,24 @@ }, { "author": "Max Bachmann ", - "bom-ref": "pkg:pypi/rapidfuzz@3.12.1?package-id=0ab30153d1529e48", - "cpe": "cpe:2.3:a:max_bachmann_\\", - "bom-ref": "pkg:pypi/ray@2.57.0?package-id=7f8d879e53976591", - "cpe": "cpe:2.3:a:ray_team_project:python-ray:2.57.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/ray@2.58.0?package-id=432860e3490334d8", + "cpe": "cpe:2.3:a:ray_team_project:python-ray:2.58.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -96607,9 +103540,9 @@ } ], "name": "ray", - "purl": "pkg:pypi/ray@2.57.0", + "purl": "pkg:pypi/ray@2.58.0", "type": "library", - "version": "2.57.0" + "version": "2.58.0" }, { "bom-ref": "pkg:maven/ray_dist/ray_dist?package-id=533768a7113b450e", @@ -96619,7 +103552,7 @@ "hashes": [ { "alg": "SHA-1", - "content": "2ecde77180424f3d378c95b12305dbb22cd832f1" + "content": "aa0b8ce77a319275553b0a9a051685bff26199e2" } ], "type": "build-meta", @@ -96848,33 +103781,33 @@ }, { "author": "Matthew Barnett ", - "bom-ref": "pkg:pypi/regex@2026.3.32?package-id=c09de27cb25ed522", - "cpe": "cpe:2.3:a:matthew_barnett_\\", - "bom-ref": "pkg:pypi/requests@2.33.1?package-id=f3d3b37b86ad0e22", - "cpe": "cpe:2.3:a:python:requests:2.33.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/requests@2.34.2?package-id=2c9652705912f6c0", + "cpe": "cpe:2.3:a:python:requests:2.34.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -97064,9 +103997,9 @@ } ], "name": "requests", - "purl": "pkg:pypi/requests@2.33.1", + "purl": "pkg:pypi/requests@2.34.2", "type": "library", - "version": "2.33.1" + "version": "2.34.2" }, { "bom-ref": "pkg:cargo/reqwest@0.13.4?package-id=98db7c863649a6cb", @@ -97102,8 +104035,8 @@ }, { "author": "Will McGugan ", - "bom-ref": "pkg:pypi/rich@14.3.3?package-id=fe0967f86acaa006", - "cpe": "cpe:2.3:a:will_mcgugan_project:python-rich:14.3.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/rich@15.0.0?package-id=324256f01cec9e77", + "cpe": "cpe:2.3:a:will_mcgugan_project:python-rich:15.0.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -97112,13 +104045,13 @@ } ], "name": "rich", - "purl": "pkg:pypi/rich@14.3.3", + "purl": "pkg:pypi/rich@15.0.0", "type": "library", - "version": "14.3.3" + "version": "15.0.0" }, { - "bom-ref": "pkg:pypi/rich-toolkit@0.20.1?package-id=92080585804cb56b", - "cpe": "cpe:2.3:a:python-rich-toolkit:python-rich-toolkit:0.20.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/rich-toolkit@0.20.3?package-id=175e16db3cf19939", + "cpe": "cpe:2.3:a:python-rich-toolkit:python-rich-toolkit:0.20.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -97127,14 +104060,14 @@ } ], "name": "rich-toolkit", - "purl": "pkg:pypi/rich-toolkit@0.20.1", + "purl": "pkg:pypi/rich-toolkit@0.20.3", "type": "library", - "version": "0.20.1" + "version": "0.20.3" }, { "author": "Patrick Arminio ", - "bom-ref": "pkg:pypi/rignore@0.7.6?package-id=2e478775404f1abb", - "cpe": "cpe:2.3:a:patrick_arminio_\\", - "bom-ref": "pkg:pypi/rpds-py@0.30.0?package-id=6841f54331fbecdd", - "cpe": "cpe:2.3:a:julian_berman_\\", - "bom-ref": "pkg:pypi/schemathesis@4.14.2?package-id=f086b56ff615fbe7", - "cpe": "cpe:2.3:a:dmitry_dygalo_\\, Tom Aarsen ", - "bom-ref": "pkg:pypi/sentence-transformers@5.3.0?package-id=261f237a4c1ffd6d", - "cpe": "cpe:2.3:a:python-sentence-transformers:python-sentence-transformers:5.3.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/sentence-transformers@5.7.0?package-id=4aea7fbc3f682d3f", + "cpe": "cpe:2.3:a:python-sentence-transformers:python-sentence-transformers:5.7.0:*:*:*:*:*:*:*", "licenses": [ { "license": { - "name": "Apache 2.0" + "id": "Apache-2.0" } } ], "name": "sentence-transformers", - "purl": "pkg:pypi/sentence-transformers@5.3.0", + "purl": "pkg:pypi/sentence-transformers@5.7.0", "type": "library", - "version": "5.3.0" + "version": "5.7.0" }, { "author": "Taku Kudo ", @@ -97880,8 +104814,8 @@ }, { "author": "Sentry Team and Contributors ", - "bom-ref": "pkg:pypi/sentry-sdk@2.63.0?package-id=091ed7d3706cd005", - "cpe": "cpe:2.3:a:sentry:sentry_software_development_kit:2.63.0:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/sentry-sdk@2.68.0?package-id=0a8d97ff09d25837", + "cpe": "cpe:2.3:a:sentry:sentry_software_development_kit:2.68.0:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -97890,9 +104824,9 @@ } ], "name": "sentry-sdk", - "purl": "pkg:pypi/sentry-sdk@2.63.0", + "purl": "pkg:pypi/sentry-sdk@2.68.0", "type": "library", - "version": "2.63.0" + "version": "2.68.0" }, { "bom-ref": "pkg:cargo/serde@1.0.229?package-id=91316271b6b5c27e", @@ -98058,8 +104992,8 @@ }, { "author": "Ronny Pfannschmidt ", - "bom-ref": "pkg:pypi/setuptools-scm@10.2.1?package-id=3f1eb93c14dc965e", - "cpe": "cpe:2.3:a:ronny_pfannschmidt_\\", + "purl": "pkg:deb/ubuntu/sgml-base@1.31?arch=all&distro=ubuntu-24.04", "type": "library", - "version": "10.2.1" + "version": "1.31" }, { "bom-ref": "pkg:cargo/sha1@0.11.0?package-id=23be39ab28509762", @@ -98281,20 +105236,52 @@ "version": "2.7.0" }, { - "bom-ref": "pkg:cargo/similar@3.1.1?package-id=066a88d9e1ab7759", - "cpe": "cpe:2.3:a:similar:similar:3.1.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/similar@3.1.2?package-id=67e7afcd0fd31f72", + "cpe": "cpe:2.3:a:similar:similar:3.1.2:*:*:*:*:*:*:*", "name": "similar", - "purl": "pkg:cargo/similar@3.1.1", + "purl": "pkg:cargo/similar@3.1.2", "type": "library", - "version": "3.1.1" + "version": "3.1.2" }, { - "bom-ref": "pkg:cargo/similar@3.1.1?package-id=45027bca46cce886", - "cpe": "cpe:2.3:a:similar:similar:3.1.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/similar@3.1.2?package-id=edc9ebd5a6281f7f", + "cpe": "cpe:2.3:a:similar:similar:3.1.2:*:*:*:*:*:*:*", "name": "similar", - "purl": "pkg:cargo/similar@3.1.1", + "purl": "pkg:cargo/similar@3.1.2", "type": "library", - "version": "3.1.1" + "version": "3.1.2" + }, + { + "author": "Ash Vardanian <1983160+ashvardanian@users.noreply.github.com>", + "bom-ref": "pkg:pypi/simsimd@6.5.16?package-id=6befb4681388e33d", + "cpe": "cpe:2.3:a:1983160\\+ashvardanian_project:python-simsimd:6.5.16:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + } + ], + "name": "simsimd", + "purl": "pkg:pypi/simsimd@6.5.16", + "type": "library", + "version": "6.5.16" + }, + { + "author": "Benjamin Peterson ", + "bom-ref": "pkg:pypi/six@1.16.0?package-id=64e630b32a1bc827", + "cpe": "cpe:2.3:a:benjamin_peterson_project:python-six:1.16.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], + "name": "six", + "purl": "pkg:pypi/six@1.16.0", + "type": "library", + "version": "1.16.0" }, { "author": "Benjamin Peterson ", @@ -98399,6 +105386,37 @@ "type": "library", "version": "0.6.3" }, + { + "bom-ref": "pkg:deb/ubuntu/software-properties-common@0.99.49.4?arch=all&distro=ubuntu-24.04&package-id=332e8a42171c60e6&upstream=software-properties", + "cpe": "cpe:2.3:a:software-properties-common:software-properties-common:0.99.49.4:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + } + ], + "name": "software-properties-common", + "publisher": "Michael Vogt ", + "purl": "pkg:deb/ubuntu/software-properties-common@0.99.49.4?arch=all&distro=ubuntu-24.04&upstream=software-properties", + "type": "library", + "version": "0.99.49.4" + }, { "author": "Grant Jenks ", "bom-ref": "pkg:pypi/sortedcontainers@2.4.0?package-id=9945be258ffb9440", @@ -98416,9 +105434,9 @@ "version": "2.4.0" }, { - "author": "Bastian Bechtold ", - "bom-ref": "pkg:pypi/soundfile@0.13.1?package-id=f9abe992c9513de2", - "cpe": "cpe:2.3:a:bastian_bechtold_project:python-soundfile:0.13.1:*:*:*:*:*:*:*", + "author": "Bastian Bechtold ", + "bom-ref": "pkg:pypi/soundfile@0.14.0?package-id=87680d88954b6022", + "cpe": "cpe:2.3:a:bastian_bechtold_project:python-soundfile:0.14.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -98427,34 +105445,41 @@ } ], "name": "soundfile", - "purl": "pkg:pypi/soundfile@0.13.1", + "purl": "pkg:pypi/soundfile@0.14.0", "type": "library", - "version": "0.13.1" + "version": "0.14.0" }, { "author": "KEUM Myungchul", - "bom-ref": "pkg:pypi/soxr@0.5.0.post1?package-id=5bd975cc0341148b", - "cpe": "cpe:2.3:a:keum_myungchul_project:python-soxr:0.5.0.post1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/soxr@1.1.0?package-id=73e5ccef0c2e82a7", + "cpe": "cpe:2.3:a:keum_myungchul_project:python-soxr:1.1.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "LGPL-2.1-or-later" + } + } + ], "name": "soxr", - "purl": "pkg:pypi/soxr@0.5.0.post1", + "purl": "pkg:pypi/soxr@1.1.0", "type": "library", - "version": "0.5.0.post1" + "version": "1.1.0" }, { - "bom-ref": "pkg:cargo/spdx@0.13.4?package-id=a13d0f5a3683d388", - "cpe": "cpe:2.3:a:spdx:spdx:0.13.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/spdx@0.13.5?package-id=23c62010ff194991", + "cpe": "cpe:2.3:a:spdx:spdx:0.13.5:*:*:*:*:*:*:*", "name": "spdx", - "purl": "pkg:cargo/spdx@0.13.4", + "purl": "pkg:cargo/spdx@0.13.5", "type": "library", - "version": "0.13.4" + "version": "0.13.5" }, { - "bom-ref": "pkg:cargo/spdx@0.13.4?package-id=c74caae1d2654430", - "cpe": "cpe:2.3:a:spdx:spdx:0.13.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/spdx@0.13.5?package-id=767c1ada032ef545", + "cpe": "cpe:2.3:a:spdx:spdx:0.13.5:*:*:*:*:*:*:*", "name": "spdx", - "purl": "pkg:cargo/spdx@0.13.4", + "purl": "pkg:cargo/spdx@0.13.5", "type": "library", - "version": "0.13.4" + "version": "0.13.5" }, { "bom-ref": "pkg:cargo/spin@0.9.8?package-id=985cd653e952ca2a", @@ -98506,8 +105531,8 @@ }, { "author": "sysid ", - "bom-ref": "pkg:pypi/sse-starlette@3.4.5?package-id=24dcc5351c5381e1", - "cpe": "cpe:2.3:a:python-sse-starlette:python-sse-starlette:3.4.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/sse-starlette@3.4.8?package-id=3a37b72589374c41", + "cpe": "cpe:2.3:a:python-sse-starlette:python-sse-starlette:3.4.8:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -98516,9 +105541,9 @@ } ], "name": "sse-starlette", - "purl": "pkg:pypi/sse-starlette@3.4.5", + "purl": "pkg:pypi/sse-starlette@3.4.8", "type": "library", - "version": "3.4.5" + "version": "3.4.8" }, { "bom-ref": "pkg:cargo/stable_deref_trait@1.2.1?package-id=160125333ed79404", @@ -98538,8 +105563,8 @@ }, { "author": "Tom Christie ", - "bom-ref": "pkg:pypi/starlette@1.3.1?package-id=a5d07076c316d4aa", - "cpe": "cpe:2.3:a:encode:starlette:1.3.1:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/starlette@1.6.0?package-id=4b398be1fca4cfc7", + "cpe": "cpe:2.3:a:encode:starlette:1.6.0:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -98548,9 +105573,9 @@ } ], "name": "starlette", - "purl": "pkg:pypi/starlette@1.3.1", + "purl": "pkg:pypi/starlette@1.6.0", "type": "library", - "version": "1.3.1" + "version": "1.6.0" }, { "author": "Marcelo Trylesinski ", @@ -98568,6 +105593,22 @@ "type": "library", "version": "0.4.1" }, + { + "author": "Ash Vardanian <1983160+ashvardanian@users.noreply.github.com>", + "bom-ref": "pkg:pypi/stringzilla@5.1.2?package-id=9771bb28a94d9491", + "cpe": "cpe:2.3:a:1983160\\+ashvardanian_project:python-stringzilla:5.1.2:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + } + ], + "name": "stringzilla", + "purl": "pkg:pypi/stringzilla@5.1.2", + "type": "library", + "version": "5.1.2" + }, { "bom-ref": "pkg:cargo/strip-ansi-escapes@0.2.1?package-id=0a18a8bd39bf4505", "cpe": "cpe:2.3:a:strip-ansi-escapes:strip-ansi-escapes:0.2.1:*:*:*:*:*:*:*", @@ -98602,17 +105643,17 @@ }, { "author": "Hynek Schlawack ", - "bom-ref": "pkg:pypi/structlog@25.5.0?package-id=9bcc11abc2db80d8", - "cpe": "cpe:2.3:a:hynek_schlawack_\\", + "purl": "pkg:deb/ubuntu/systemd-sysv@255.4-1ubuntu8.17?arch=amd64&distro=ubuntu-24.04&upstream=systemd", + "type": "library", + "version": "255.4-1ubuntu8.17" + }, { "bom-ref": "pkg:deb/ubuntu/sysvinit-utils@3.08-6ubuntu3?arch=amd64&distro=ubuntu-24.04&package-id=c997e4113ef7ac60&upstream=sysvinit", "cpe": "cpe:2.3:a:sysvinit-utils:sysvinit-utils:3.08-6ubuntu3:*:*:*:*:*:*:*", @@ -98904,8 +106007,8 @@ }, { "author": "Tsuyoshi Hombashi ", - "bom-ref": "pkg:pypi/tabledata@1.3.4?package-id=1ade76d0dbc0a34d", - "cpe": "cpe:2.3:a:tsuyoshi_hombashi_project:python-tabledata:1.3.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/tabledata@1.3.5?package-id=f09431a0defa36fb", + "cpe": "cpe:2.3:a:tsuyoshi_hombashi_project:python-tabledata:1.3.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -98914,9 +106017,9 @@ } ], "name": "tabledata", - "purl": "pkg:pypi/tabledata@1.3.4", + "purl": "pkg:pypi/tabledata@1.3.5", "type": "library", - "version": "1.3.4" + "version": "1.3.5" }, { "author": "Sergey Astanin ", @@ -98985,6 +106088,38 @@ "type": "library", "version": "1.35+dfsg-3ubuntu0.4" }, + { + "bom-ref": "pkg:cargo/tar-codec@0.0.14?package-id=54984d78c7de053e", + "cpe": "cpe:2.3:a:tar-codec:tar-codec:0.0.14:*:*:*:*:*:*:*", + "name": "tar-codec", + "purl": "pkg:cargo/tar-codec@0.0.14", + "type": "library", + "version": "0.0.14" + }, + { + "bom-ref": "pkg:cargo/tar-codec@0.0.14?package-id=fe1fe7eef9ea3d22", + "cpe": "cpe:2.3:a:tar-codec:tar-codec:0.0.14:*:*:*:*:*:*:*", + "name": "tar-codec", + "purl": "pkg:cargo/tar-codec@0.0.14", + "type": "library", + "version": "0.0.14" + }, + { + "bom-ref": "pkg:cargo/tar-framing@0.0.14?package-id=8bc625c8c071beea", + "cpe": "cpe:2.3:a:tar-framing:tar-framing:0.0.14:*:*:*:*:*:*:*", + "name": "tar-framing", + "purl": "pkg:cargo/tar-framing@0.0.14", + "type": "library", + "version": "0.0.14" + }, + { + "bom-ref": "pkg:cargo/tar-framing@0.0.14?package-id=ead7f1cb36bf5089", + "cpe": "cpe:2.3:a:tar-framing:tar-framing:0.0.14:*:*:*:*:*:*:*", + "name": "tar-framing", + "purl": "pkg:cargo/tar-framing@0.0.14", + "type": "library", + "version": "0.0.14" + }, { "bom-ref": "pkg:cargo/target-lexicon@0.13.5?package-id=5293718b315d1b89", "cpe": "cpe:2.3:a:target-lexicon:target-lexicon:0.13.5:*:*:*:*:*:*:*", @@ -99019,8 +106154,8 @@ }, { "author": "Ionel Cristian M\u0103rie\u0219 ", - "bom-ref": "pkg:pypi/tblib@3.1.0?package-id=563fb48cf7f8ebb5", - "cpe": "cpe:2.3:a:contact_project:python-tblib:3.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/tblib@3.2.2?package-id=dac111533075700d", + "cpe": "cpe:2.3:a:python-tblib:python-tblib:3.2.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -99029,9 +106164,9 @@ } ], "name": "tblib", - "purl": "pkg:pypi/tblib@3.1.0", + "purl": "pkg:pypi/tblib@3.2.2", "type": "library", - "version": "3.1.0" + "version": "3.2.2" }, { "author": "Intel Corporation ", @@ -99225,26 +106360,10 @@ "type": "library", "version": "3.6.0" }, - { - "author": "Christoph Gohlke ", - "bom-ref": "pkg:pypi/tifffile@2026.3.3?package-id=22089cb796ec8896", - "cpe": "cpe:2.3:a:christoph_gohlke_project:python-tifffile:2026.3.3:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "BSD-3-Clause" - } - } - ], - "name": "tifffile", - "purl": "pkg:pypi/tifffile@2026.3.3", - "type": "library", - "version": "2026.3.3" - }, { "author": "Shantanu Jain ", - "bom-ref": "pkg:pypi/tiktoken@0.12.0?package-id=28f3b85c0aef07eb", - "cpe": "cpe:2.3:a:shantanu_jain_project:python-tiktoken:0.12.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/tiktoken@0.14.0?package-id=aa1e2796e2dfbcd8", + "cpe": "cpe:2.3:a:shantanu_jain_project:python-tiktoken:0.14.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -99253,9 +106372,9 @@ } ], "name": "tiktoken", - "purl": "pkg:pypi/tiktoken@0.12.0", + "purl": "pkg:pypi/tiktoken@0.14.0", "type": "library", - "version": "0.12.0" + "version": "0.14.0" }, { "bom-ref": "pkg:cargo/tikv-jemalloc-sys@0.6.1%2B5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7?package-id=a44dbf140625b8df", @@ -99323,8 +106442,8 @@ }, { "author": "Ross Wightman ", - "bom-ref": "pkg:pypi/timm@1.0.17?package-id=9459fe23887ddc58", - "cpe": "cpe:2.3:a:ross_wightman_\\", - "bom-ref": "pkg:pypi/torchcodec@0.15.0%2Bcpu?package-id=6b1f5e36519e26aa", - "cpe": "cpe:2.3:a:pytorch_team_\\", @@ -99602,6 +106721,22 @@ "type": "library", "version": "0.28.0+xpu" }, + { + "author": "Facebook ", + "bom-ref": "pkg:pypi/tornado@6.5.8?package-id=17439f5725a21fd5", + "cpe": "cpe:2.3:a:python_tornado_project:python-tornado:6.5.8:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + } + ], + "name": "tornado", + "purl": "pkg:pypi/tornado@6.5.8", + "type": "library", + "version": "6.5.8" + }, { "bom-ref": "pkg:cargo/tower@0.5.3?package-id=683c8d9928ad9b59", "cpe": "cpe:2.3:a:tower:tower:0.5.3:*:*:*:*:*:*:*", @@ -99667,17 +106802,17 @@ "version": "0.3.3" }, { - "bom-ref": "pkg:pypi/tqdm@4.67.3?package-id=acccbd05f3fb32a1", - "cpe": "cpe:2.3:a:python-tqdm:python-tqdm:4.67.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/tqdm@4.70.0?package-id=565d02f6ef3e5ea8", + "cpe": "cpe:2.3:a:python-tqdm:python-tqdm:4.70.0:*:*:*:*:*:*:*", "licenses": [ { "expression": "MPL-2.0 AND MIT" } ], "name": "tqdm", - "purl": "pkg:pypi/tqdm@4.67.3", + "purl": "pkg:pypi/tqdm@4.70.0", "type": "library", - "version": "4.67.3" + "version": "4.70.0" }, { "bom-ref": "pkg:cargo/tracing@0.1.44?package-id=9274aeed277fc61c", @@ -99775,10 +106910,26 @@ "type": "library", "version": "0.4.1" }, + { + "author": "IPython Development Team ", + "bom-ref": "pkg:pypi/traitlets@5.16.1?package-id=db80d42091f2e590", + "cpe": "cpe:2.3:a:ipython_development_team_\\", - "bom-ref": "pkg:pypi/transformers@5.14.1?package-id=87857c3a58ff67e1", - "cpe": "cpe:2.3:a:hugging_face_team_\\(past_and_future\\)_with_the_help_of_all_our_contributors_\\(https\\:\\/\\/github_com\\/huggingface\\/transformers\\/graphs\\/contributors\\)_project:python-transformers:5.14.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/transformers@5.15.0?package-id=e130863ba5a59631", + "cpe": "cpe:2.3:a:hugging_face_team_\\(past_and_future\\)_with_the_help_of_all_our_contributors_\\(https\\:\\/\\/github_com\\/huggingface\\/transformers\\/graphs\\/contributors\\)_project:python-transformers:5.15.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -99787,9 +106938,25 @@ } ], "name": "transformers", - "purl": "pkg:pypi/transformers@5.14.1", + "purl": "pkg:pypi/transformers@5.15.0", + "type": "library", + "version": "5.15.0" + }, + { + "author": "Intel Triton Team", + "bom-ref": "pkg:pypi/triton@3.7.2%2Bxpu?package-id=3b0ddd00351cbe1d", + "cpe": "cpe:2.3:a:intel_triton_team_project:python-triton:3.7.2\\+xpu:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], + "name": "triton", + "purl": "pkg:pypi/triton@3.7.2%2Bxpu", "type": "library", - "version": "5.14.1" + "version": "3.7.2+xpu" }, { "author": "Philippe Tillet ", @@ -99882,8 +107049,8 @@ }, { "author": "Tsuyoshi Hombashi ", - "bom-ref": "pkg:pypi/typepy@1.3.4?package-id=bc0f2e1eec929b0e", - "cpe": "cpe:2.3:a:tsuyoshi_hombashi_project:python-typepy:1.3.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/typepy@1.3.5?package-id=53ca667f866654b9", + "cpe": "cpe:2.3:a:tsuyoshi_hombashi_project:python-typepy:1.3.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -99892,14 +107059,14 @@ } ], "name": "typepy", - "purl": "pkg:pypi/typepy@1.3.4", + "purl": "pkg:pypi/typepy@1.3.5", "type": "library", - "version": "1.3.4" + "version": "1.3.5" }, { "author": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "bom-ref": "pkg:pypi/typer@0.24.1?package-id=6cd32cefae5a386d", - "cpe": "cpe:2.3:a:python-typer:python-typer:0.24.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/typer@0.27.1?package-id=863d2510e03f25cc", + "cpe": "cpe:2.3:a:python-typer:python-typer:0.27.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -99908,14 +107075,14 @@ } ], "name": "typer", - "purl": "pkg:pypi/typer@0.24.1", + "purl": "pkg:pypi/typer@0.27.1", "type": "library", - "version": "0.24.1" + "version": "0.27.1" }, { "author": "\"Guido van Rossum, Jukka Lehtosalo, \u0141ukasz Langa, Michael Lee\" ", - "bom-ref": "pkg:pypi/typing-extensions@4.15.0?package-id=aa27d309f141d928", - "cpe": "cpe:2.3:a:python-typing-extensions:python-typing-extensions:4.15.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/typing-extensions@4.16.0?package-id=217703537faf9175", + "cpe": "cpe:2.3:a:python-typing-extensions:python-typing-extensions:4.16.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -99924,13 +107091,13 @@ } ], "name": "typing-extensions", - "purl": "pkg:pypi/typing-extensions@4.15.0", + "purl": "pkg:pypi/typing-extensions@4.16.0", "type": "library", - "version": "4.15.0" + "version": "4.16.0" }, { "author": "\"Guido van Rossum, Jukka Lehtosalo, \u0141ukasz Langa, Michael Lee\" ", - "bom-ref": "pkg:pypi/typing-extensions@4.16.0?package-id=217703537faf9175", + "bom-ref": "pkg:pypi/typing-extensions@4.16.0?package-id=795eaecf125b753a", "cpe": "cpe:2.3:a:python-typing-extensions:python-typing-extensions:4.16.0:*:*:*:*:*:*:*", "licenses": [ { @@ -99946,8 +107113,8 @@ }, { "author": "Victorien Plot ", - "bom-ref": "pkg:pypi/typing-inspection@0.4.2?package-id=0fc9503677d43122", - "cpe": "cpe:2.3:a:victorien_plot_\\", - "bom-ref": "pkg:pypi/urllib3@2.6.3?package-id=00945306cfbeec7a", - "cpe": "cpe:2.3:a:python:urllib3:2.6.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/urllib3@2.7.0?package-id=54c7be273b9272f9", + "cpe": "cpe:2.3:a:python:urllib3:2.7.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -100284,9 +107451,9 @@ } ], "name": "urllib3", - "purl": "pkg:pypi/urllib3@2.6.3", + "purl": "pkg:pypi/urllib3@2.7.0", "type": "library", - "version": "2.6.3" + "version": "2.7.0" }, { "bom-ref": "pkg:cargo/utf8_iter@1.0.4?package-id=309057352ede1400", @@ -100321,8 +107488,8 @@ "version": "0.2.2" }, { - "bom-ref": "pkg:deb/ubuntu/util-linux@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04&package-id=5b3469dc9628ba1a", - "cpe": "cpe:2.3:a:util-linux:util-linux:2.39.3-9ubuntu6.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/util-linux@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04&package-id=f1e4c52ae1a4fa42", + "cpe": "cpe:2.3:a:util-linux:util-linux:2.39.3-9ubuntu6.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -100407,9 +107574,9 @@ ], "name": "util-linux", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/util-linux@2.39.3-9ubuntu6.5?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/util-linux@2.39.3-9ubuntu6.6?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "2.39.3-9ubuntu6.5" + "version": "2.39.3-9ubuntu6.6" }, { "bom-ref": "1b7bc154cfd6a021", @@ -100434,1049 +107601,1049 @@ "version": "1.24.0" }, { - "bom-ref": "pkg:cargo/uv@0.12.3?package-id=9cf5de6671249808", - "cpe": "cpe:2.3:a:uv:uv:0.12.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv@0.12.11?package-id=2b78658c7f6c7b7c", + "cpe": "cpe:2.3:a:uv:uv:0.12.11:*:*:*:*:*:*:*", "name": "uv", - "purl": "pkg:cargo/uv@0.12.3", + "purl": "pkg:cargo/uv@0.12.11", "type": "library", - "version": "0.12.3" + "version": "0.12.11" }, { - "bom-ref": "pkg:cargo/uv@0.12.3?package-id=f538612b1e093f51", - "cpe": "cpe:2.3:a:uv:uv:0.12.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv@0.12.11?package-id=830db0a097de4bb1", + "cpe": "cpe:2.3:a:uv:uv:0.12.11:*:*:*:*:*:*:*", "name": "uv", - "purl": "pkg:cargo/uv@0.12.3", + "purl": "pkg:cargo/uv@0.12.11", "type": "library", - "version": "0.12.3" + "version": "0.12.11" }, { - "bom-ref": "pkg:cargo/uv-audit@0.0.70?package-id=11ab7b7939786bf9", - "cpe": "cpe:2.3:a:uv-audit:uv-audit:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-audit@0.0.78?package-id=198030400a8121d6", + "cpe": "cpe:2.3:a:uv-audit:uv-audit:0.0.78:*:*:*:*:*:*:*", "name": "uv-audit", - "purl": "pkg:cargo/uv-audit@0.0.70", + "purl": "pkg:cargo/uv-audit@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-audit@0.0.70?package-id=1df938bba8219299", - "cpe": "cpe:2.3:a:uv-audit:uv-audit:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-audit@0.0.78?package-id=ded8d7859524ebcb", + "cpe": "cpe:2.3:a:uv-audit:uv-audit:0.0.78:*:*:*:*:*:*:*", "name": "uv-audit", - "purl": "pkg:cargo/uv-audit@0.0.70", + "purl": "pkg:cargo/uv-audit@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-auth@0.0.70?package-id=7858578b962a124b", - "cpe": "cpe:2.3:a:uv-auth:uv-auth:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-auth@0.0.78?package-id=01aff6d9dd319f36", + "cpe": "cpe:2.3:a:uv-auth:uv-auth:0.0.78:*:*:*:*:*:*:*", "name": "uv-auth", - "purl": "pkg:cargo/uv-auth@0.0.70", + "purl": "pkg:cargo/uv-auth@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-auth@0.0.70?package-id=fced6354b0f21421", - "cpe": "cpe:2.3:a:uv-auth:uv-auth:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-auth@0.0.78?package-id=9dd6ea5387503770", + "cpe": "cpe:2.3:a:uv-auth:uv-auth:0.0.78:*:*:*:*:*:*:*", "name": "uv-auth", - "purl": "pkg:cargo/uv-auth@0.0.70", + "purl": "pkg:cargo/uv-auth@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-bin-install@0.0.70?package-id=29dd6b49e54685e3", - "cpe": "cpe:2.3:a:uv-bin-install:uv-bin-install:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-bin-install@0.0.78?package-id=2859c8f670cd8401", + "cpe": "cpe:2.3:a:uv-bin-install:uv-bin-install:0.0.78:*:*:*:*:*:*:*", "name": "uv-bin-install", - "purl": "pkg:cargo/uv-bin-install@0.0.70", + "purl": "pkg:cargo/uv-bin-install@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-bin-install@0.0.70?package-id=3cc9b12a8ca4a6c0", - "cpe": "cpe:2.3:a:uv-bin-install:uv-bin-install:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-bin-install@0.0.78?package-id=315eb142b815a764", + "cpe": "cpe:2.3:a:uv-bin-install:uv-bin-install:0.0.78:*:*:*:*:*:*:*", "name": "uv-bin-install", - "purl": "pkg:cargo/uv-bin-install@0.0.70", + "purl": "pkg:cargo/uv-bin-install@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-build-backend@0.0.70?package-id=4a57ae9f5ff3e28b", - "cpe": "cpe:2.3:a:uv-build-backend:uv-build-backend:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-build-backend@0.0.78?package-id=75bbf29bcacbd64c", + "cpe": "cpe:2.3:a:uv-build-backend:uv-build-backend:0.0.78:*:*:*:*:*:*:*", "name": "uv-build-backend", - "purl": "pkg:cargo/uv-build-backend@0.0.70", + "purl": "pkg:cargo/uv-build-backend@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-build-backend@0.0.70?package-id=ea90ddfee6665372", - "cpe": "cpe:2.3:a:uv-build-backend:uv-build-backend:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-build-backend@0.0.78?package-id=b9bd21926aace913", + "cpe": "cpe:2.3:a:uv-build-backend:uv-build-backend:0.0.78:*:*:*:*:*:*:*", "name": "uv-build-backend", - "purl": "pkg:cargo/uv-build-backend@0.0.70", + "purl": "pkg:cargo/uv-build-backend@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-build-frontend@0.0.70?package-id=1074b42cacbc1088", - "cpe": "cpe:2.3:a:uv-build-frontend:uv-build-frontend:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-build-frontend@0.0.78?package-id=253398b947b23456", + "cpe": "cpe:2.3:a:uv-build-frontend:uv-build-frontend:0.0.78:*:*:*:*:*:*:*", "name": "uv-build-frontend", - "purl": "pkg:cargo/uv-build-frontend@0.0.70", + "purl": "pkg:cargo/uv-build-frontend@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-build-frontend@0.0.70?package-id=8fdd6fe3675d2b11", - "cpe": "cpe:2.3:a:uv-build-frontend:uv-build-frontend:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-build-frontend@0.0.78?package-id=e0aa4bba18c92a77", + "cpe": "cpe:2.3:a:uv-build-frontend:uv-build-frontend:0.0.78:*:*:*:*:*:*:*", "name": "uv-build-frontend", - "purl": "pkg:cargo/uv-build-frontend@0.0.70", + "purl": "pkg:cargo/uv-build-frontend@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-cache@0.0.70?package-id=215f72e1f376872f", - "cpe": "cpe:2.3:a:uv-cache:uv-cache:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-cache@0.0.78?package-id=96ffcbdb0420cf2c", + "cpe": "cpe:2.3:a:uv-cache:uv-cache:0.0.78:*:*:*:*:*:*:*", "name": "uv-cache", - "purl": "pkg:cargo/uv-cache@0.0.70", + "purl": "pkg:cargo/uv-cache@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-cache@0.0.70?package-id=4504c2c2bd511b10", - "cpe": "cpe:2.3:a:uv-cache:uv-cache:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-cache@0.0.78?package-id=b1914e30d7c2fde2", + "cpe": "cpe:2.3:a:uv-cache:uv-cache:0.0.78:*:*:*:*:*:*:*", "name": "uv-cache", - "purl": "pkg:cargo/uv-cache@0.0.70", + "purl": "pkg:cargo/uv-cache@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-cache-info@0.0.70?package-id=92d56f2983be56fa", - "cpe": "cpe:2.3:a:uv-cache-info:uv-cache-info:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-cache-info@0.0.78?package-id=0a3fa0bb62529acf", + "cpe": "cpe:2.3:a:uv-cache-info:uv-cache-info:0.0.78:*:*:*:*:*:*:*", "name": "uv-cache-info", - "purl": "pkg:cargo/uv-cache-info@0.0.70", + "purl": "pkg:cargo/uv-cache-info@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-cache-info@0.0.70?package-id=a088e6b6737a2e8d", - "cpe": "cpe:2.3:a:uv-cache-info:uv-cache-info:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-cache-info@0.0.78?package-id=c5a0f64ddc650736", + "cpe": "cpe:2.3:a:uv-cache-info:uv-cache-info:0.0.78:*:*:*:*:*:*:*", "name": "uv-cache-info", - "purl": "pkg:cargo/uv-cache-info@0.0.70", + "purl": "pkg:cargo/uv-cache-info@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-cache-key@0.0.70?package-id=8d75293560250678", - "cpe": "cpe:2.3:a:uv-cache-key:uv-cache-key:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-cache-key@0.0.78?package-id=edac4f76c21f3ed9", + "cpe": "cpe:2.3:a:uv-cache-key:uv-cache-key:0.0.78:*:*:*:*:*:*:*", "name": "uv-cache-key", - "purl": "pkg:cargo/uv-cache-key@0.0.70", + "purl": "pkg:cargo/uv-cache-key@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-cache-key@0.0.70?package-id=be9f861152327db2", - "cpe": "cpe:2.3:a:uv-cache-key:uv-cache-key:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-cache-key@0.0.78?package-id=f2bc93f5c11225bb", + "cpe": "cpe:2.3:a:uv-cache-key:uv-cache-key:0.0.78:*:*:*:*:*:*:*", "name": "uv-cache-key", - "purl": "pkg:cargo/uv-cache-key@0.0.70", + "purl": "pkg:cargo/uv-cache-key@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-cli@0.0.70?package-id=a696761e6b50ebe7", - "cpe": "cpe:2.3:a:uv-cli:uv-cli:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-cli@0.0.78?package-id=1bdab6405e3cdf32", + "cpe": "cpe:2.3:a:uv-cli:uv-cli:0.0.78:*:*:*:*:*:*:*", "name": "uv-cli", - "purl": "pkg:cargo/uv-cli@0.0.70", + "purl": "pkg:cargo/uv-cli@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-cli@0.0.70?package-id=d6daa9152ef939e6", - "cpe": "cpe:2.3:a:uv-cli:uv-cli:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-cli@0.0.78?package-id=21f897ad767a3e6a", + "cpe": "cpe:2.3:a:uv-cli:uv-cli:0.0.78:*:*:*:*:*:*:*", "name": "uv-cli", - "purl": "pkg:cargo/uv-cli@0.0.70", + "purl": "pkg:cargo/uv-cli@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-client@0.0.70?package-id=3427d918d4ce7423", - "cpe": "cpe:2.3:a:uv-client:uv-client:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-client@0.0.78?package-id=31b561458c4a30ce", + "cpe": "cpe:2.3:a:uv-client:uv-client:0.0.78:*:*:*:*:*:*:*", "name": "uv-client", - "purl": "pkg:cargo/uv-client@0.0.70", + "purl": "pkg:cargo/uv-client@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-client@0.0.70?package-id=40ba085bf2ba2b30", - "cpe": "cpe:2.3:a:uv-client:uv-client:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-client@0.0.78?package-id=381e2d766b3990e5", + "cpe": "cpe:2.3:a:uv-client:uv-client:0.0.78:*:*:*:*:*:*:*", "name": "uv-client", - "purl": "pkg:cargo/uv-client@0.0.70", + "purl": "pkg:cargo/uv-client@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-configuration@0.0.70?package-id=94395046bf237194", - "cpe": "cpe:2.3:a:uv-configuration:uv-configuration:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-configuration@0.0.78?package-id=4c07d129fb1cbd94", + "cpe": "cpe:2.3:a:uv-configuration:uv-configuration:0.0.78:*:*:*:*:*:*:*", "name": "uv-configuration", - "purl": "pkg:cargo/uv-configuration@0.0.70", + "purl": "pkg:cargo/uv-configuration@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-configuration@0.0.70?package-id=99e4435a60ec950b", - "cpe": "cpe:2.3:a:uv-configuration:uv-configuration:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-configuration@0.0.78?package-id=8d12dafbb0b54845", + "cpe": "cpe:2.3:a:uv-configuration:uv-configuration:0.0.78:*:*:*:*:*:*:*", "name": "uv-configuration", - "purl": "pkg:cargo/uv-configuration@0.0.70", + "purl": "pkg:cargo/uv-configuration@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-console@0.0.70?package-id=696cab2b8f23eecd", - "cpe": "cpe:2.3:a:uv-console:uv-console:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-console@0.0.78?package-id=957a36d3a6c2b512", + "cpe": "cpe:2.3:a:uv-console:uv-console:0.0.78:*:*:*:*:*:*:*", "name": "uv-console", - "purl": "pkg:cargo/uv-console@0.0.70", + "purl": "pkg:cargo/uv-console@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-console@0.0.70?package-id=6d3899078ec9a8b0", - "cpe": "cpe:2.3:a:uv-console:uv-console:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-console@0.0.78?package-id=c5700594a1de5aa7", + "cpe": "cpe:2.3:a:uv-console:uv-console:0.0.78:*:*:*:*:*:*:*", "name": "uv-console", - "purl": "pkg:cargo/uv-console@0.0.70", + "purl": "pkg:cargo/uv-console@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-dirs@0.0.70?package-id=17c80973809fcc0a", - "cpe": "cpe:2.3:a:uv-dirs:uv-dirs:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-dirs@0.0.78?package-id=36a01e194a03cd07", + "cpe": "cpe:2.3:a:uv-dirs:uv-dirs:0.0.78:*:*:*:*:*:*:*", "name": "uv-dirs", - "purl": "pkg:cargo/uv-dirs@0.0.70", + "purl": "pkg:cargo/uv-dirs@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-dirs@0.0.70?package-id=4066a848c831f292", - "cpe": "cpe:2.3:a:uv-dirs:uv-dirs:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-dirs@0.0.78?package-id=4773ee194c6d99fa", + "cpe": "cpe:2.3:a:uv-dirs:uv-dirs:0.0.78:*:*:*:*:*:*:*", "name": "uv-dirs", - "purl": "pkg:cargo/uv-dirs@0.0.70", + "purl": "pkg:cargo/uv-dirs@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-dispatch@0.0.70?package-id=a16215bb65166d39", - "cpe": "cpe:2.3:a:uv-dispatch:uv-dispatch:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-dispatch@0.0.78?package-id=b7f6369524048d55", + "cpe": "cpe:2.3:a:uv-dispatch:uv-dispatch:0.0.78:*:*:*:*:*:*:*", "name": "uv-dispatch", - "purl": "pkg:cargo/uv-dispatch@0.0.70", + "purl": "pkg:cargo/uv-dispatch@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-dispatch@0.0.70?package-id=d3a661a3b5164010", - "cpe": "cpe:2.3:a:uv-dispatch:uv-dispatch:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-dispatch@0.0.78?package-id=e4c125070bbdaf5a", + "cpe": "cpe:2.3:a:uv-dispatch:uv-dispatch:0.0.78:*:*:*:*:*:*:*", "name": "uv-dispatch", - "purl": "pkg:cargo/uv-dispatch@0.0.70", + "purl": "pkg:cargo/uv-dispatch@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-distribution@0.0.70?package-id=b9f5c520e8061e36", - "cpe": "cpe:2.3:a:uv-distribution:uv-distribution:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-distribution@0.0.78?package-id=45772e6e6961925a", + "cpe": "cpe:2.3:a:uv-distribution:uv-distribution:0.0.78:*:*:*:*:*:*:*", "name": "uv-distribution", - "purl": "pkg:cargo/uv-distribution@0.0.70", + "purl": "pkg:cargo/uv-distribution@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-distribution@0.0.70?package-id=bcd4e46a18cbf368", - "cpe": "cpe:2.3:a:uv-distribution:uv-distribution:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-distribution@0.0.78?package-id=758d5905c31e40a2", + "cpe": "cpe:2.3:a:uv-distribution:uv-distribution:0.0.78:*:*:*:*:*:*:*", "name": "uv-distribution", - "purl": "pkg:cargo/uv-distribution@0.0.70", + "purl": "pkg:cargo/uv-distribution@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-distribution-filename@0.0.70?package-id=8acf3c3048483f80", - "cpe": "cpe:2.3:a:uv-distribution-filename:uv-distribution-filename:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-distribution-filename@0.0.78?package-id=77ed76e4826ac6b2", + "cpe": "cpe:2.3:a:uv-distribution-filename:uv-distribution-filename:0.0.78:*:*:*:*:*:*:*", "name": "uv-distribution-filename", - "purl": "pkg:cargo/uv-distribution-filename@0.0.70", + "purl": "pkg:cargo/uv-distribution-filename@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-distribution-filename@0.0.70?package-id=b17071acd3cb903c", - "cpe": "cpe:2.3:a:uv-distribution-filename:uv-distribution-filename:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-distribution-filename@0.0.78?package-id=bcc00eb76153c38b", + "cpe": "cpe:2.3:a:uv-distribution-filename:uv-distribution-filename:0.0.78:*:*:*:*:*:*:*", "name": "uv-distribution-filename", - "purl": "pkg:cargo/uv-distribution-filename@0.0.70", + "purl": "pkg:cargo/uv-distribution-filename@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-distribution-types@0.0.70?package-id=341a0e7a6cff0d7e", - "cpe": "cpe:2.3:a:uv-distribution-types:uv-distribution-types:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-distribution-types@0.0.78?package-id=2a5246aef010be48", + "cpe": "cpe:2.3:a:uv-distribution-types:uv-distribution-types:0.0.78:*:*:*:*:*:*:*", "name": "uv-distribution-types", - "purl": "pkg:cargo/uv-distribution-types@0.0.70", + "purl": "pkg:cargo/uv-distribution-types@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-distribution-types@0.0.70?package-id=98b1220daa4a4acd", - "cpe": "cpe:2.3:a:uv-distribution-types:uv-distribution-types:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-distribution-types@0.0.78?package-id=f5b69c9b0c996edc", + "cpe": "cpe:2.3:a:uv-distribution-types:uv-distribution-types:0.0.78:*:*:*:*:*:*:*", "name": "uv-distribution-types", - "purl": "pkg:cargo/uv-distribution-types@0.0.70", + "purl": "pkg:cargo/uv-distribution-types@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-errors@0.0.70?package-id=4d4fb02862a176f5", - "cpe": "cpe:2.3:a:uv-errors:uv-errors:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-errors@0.0.78?package-id=60bf685fa7cb81f2", + "cpe": "cpe:2.3:a:uv-errors:uv-errors:0.0.78:*:*:*:*:*:*:*", "name": "uv-errors", - "purl": "pkg:cargo/uv-errors@0.0.70", + "purl": "pkg:cargo/uv-errors@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-errors@0.0.70?package-id=d0eb9a028adfdecc", - "cpe": "cpe:2.3:a:uv-errors:uv-errors:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-errors@0.0.78?package-id=e55c18be8e6f0b92", + "cpe": "cpe:2.3:a:uv-errors:uv-errors:0.0.78:*:*:*:*:*:*:*", "name": "uv-errors", - "purl": "pkg:cargo/uv-errors@0.0.70", + "purl": "pkg:cargo/uv-errors@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-extract@0.0.70?package-id=1529201acbd56b3b", - "cpe": "cpe:2.3:a:uv-extract:uv-extract:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-extract@0.0.78?package-id=93c52d23c941f6b0", + "cpe": "cpe:2.3:a:uv-extract:uv-extract:0.0.78:*:*:*:*:*:*:*", "name": "uv-extract", - "purl": "pkg:cargo/uv-extract@0.0.70", + "purl": "pkg:cargo/uv-extract@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-extract@0.0.70?package-id=8003cd89158c7c4b", - "cpe": "cpe:2.3:a:uv-extract:uv-extract:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-extract@0.0.78?package-id=a682531a3ca4e331", + "cpe": "cpe:2.3:a:uv-extract:uv-extract:0.0.78:*:*:*:*:*:*:*", "name": "uv-extract", - "purl": "pkg:cargo/uv-extract@0.0.70", + "purl": "pkg:cargo/uv-extract@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-fastid@0.0.70?package-id=49d6e47a998ab658", - "cpe": "cpe:2.3:a:uv-fastid:uv-fastid:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-fastid@0.0.78?package-id=5a6d1f098840fccf", + "cpe": "cpe:2.3:a:uv-fastid:uv-fastid:0.0.78:*:*:*:*:*:*:*", "name": "uv-fastid", - "purl": "pkg:cargo/uv-fastid@0.0.70", + "purl": "pkg:cargo/uv-fastid@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-fastid@0.0.70?package-id=863e75ef2ffd9911", - "cpe": "cpe:2.3:a:uv-fastid:uv-fastid:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-fastid@0.0.78?package-id=c1611643551efdde", + "cpe": "cpe:2.3:a:uv-fastid:uv-fastid:0.0.78:*:*:*:*:*:*:*", "name": "uv-fastid", - "purl": "pkg:cargo/uv-fastid@0.0.70", + "purl": "pkg:cargo/uv-fastid@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-flags@0.0.70?package-id=920ed03af060ffcc", - "cpe": "cpe:2.3:a:uv-flags:uv-flags:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-flags@0.0.78?package-id=84a936d1e6b21eb0", + "cpe": "cpe:2.3:a:uv-flags:uv-flags:0.0.78:*:*:*:*:*:*:*", "name": "uv-flags", - "purl": "pkg:cargo/uv-flags@0.0.70", + "purl": "pkg:cargo/uv-flags@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-flags@0.0.70?package-id=9b88dcc89e1aa075", - "cpe": "cpe:2.3:a:uv-flags:uv-flags:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-flags@0.0.78?package-id=8f7e4c88d2c24a8e", + "cpe": "cpe:2.3:a:uv-flags:uv-flags:0.0.78:*:*:*:*:*:*:*", "name": "uv-flags", - "purl": "pkg:cargo/uv-flags@0.0.70", + "purl": "pkg:cargo/uv-flags@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-fs@0.0.70?package-id=6edecbf4fcb1bd7d", - "cpe": "cpe:2.3:a:uv-fs:uv-fs:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-fs@0.0.78?package-id=510c68f456024723", + "cpe": "cpe:2.3:a:uv-fs:uv-fs:0.0.78:*:*:*:*:*:*:*", "name": "uv-fs", - "purl": "pkg:cargo/uv-fs@0.0.70", + "purl": "pkg:cargo/uv-fs@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-fs@0.0.70?package-id=a5e10a9b3fd06724", - "cpe": "cpe:2.3:a:uv-fs:uv-fs:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-fs@0.0.78?package-id=fad9af6f14d59d1d", + "cpe": "cpe:2.3:a:uv-fs:uv-fs:0.0.78:*:*:*:*:*:*:*", "name": "uv-fs", - "purl": "pkg:cargo/uv-fs@0.0.70", + "purl": "pkg:cargo/uv-fs@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-git@0.0.70?package-id=662f3c978dc73c49", - "cpe": "cpe:2.3:a:uv-git:uv-git:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-git@0.0.78?package-id=6607d25faa5e7272", + "cpe": "cpe:2.3:a:uv-git:uv-git:0.0.78:*:*:*:*:*:*:*", "name": "uv-git", - "purl": "pkg:cargo/uv-git@0.0.70", + "purl": "pkg:cargo/uv-git@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-git@0.0.70?package-id=b991dbbcd89580d0", - "cpe": "cpe:2.3:a:uv-git:uv-git:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-git@0.0.78?package-id=a73b0d7037689bff", + "cpe": "cpe:2.3:a:uv-git:uv-git:0.0.78:*:*:*:*:*:*:*", "name": "uv-git", - "purl": "pkg:cargo/uv-git@0.0.70", + "purl": "pkg:cargo/uv-git@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-git-types@0.0.70?package-id=4c33dcb5875c2100", - "cpe": "cpe:2.3:a:uv-git-types:uv-git-types:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-git-types@0.0.78?package-id=27303a809781af0a", + "cpe": "cpe:2.3:a:uv-git-types:uv-git-types:0.0.78:*:*:*:*:*:*:*", "name": "uv-git-types", - "purl": "pkg:cargo/uv-git-types@0.0.70", + "purl": "pkg:cargo/uv-git-types@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-git-types@0.0.70?package-id=927b52c636dac7c1", - "cpe": "cpe:2.3:a:uv-git-types:uv-git-types:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-git-types@0.0.78?package-id=813e1ca4df25bb95", + "cpe": "cpe:2.3:a:uv-git-types:uv-git-types:0.0.78:*:*:*:*:*:*:*", "name": "uv-git-types", - "purl": "pkg:cargo/uv-git-types@0.0.70", + "purl": "pkg:cargo/uv-git-types@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-globfilter@0.0.70?package-id=beb0cf0553ac45f8", - "cpe": "cpe:2.3:a:uv-globfilter:uv-globfilter:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-globfilter@0.0.78?package-id=81fa11867c66b595", + "cpe": "cpe:2.3:a:uv-globfilter:uv-globfilter:0.0.78:*:*:*:*:*:*:*", "name": "uv-globfilter", - "purl": "pkg:cargo/uv-globfilter@0.0.70", + "purl": "pkg:cargo/uv-globfilter@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-globfilter@0.0.70?package-id=d0619278ee65d9b7", - "cpe": "cpe:2.3:a:uv-globfilter:uv-globfilter:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-globfilter@0.0.78?package-id=a9db6a34d4c72e40", + "cpe": "cpe:2.3:a:uv-globfilter:uv-globfilter:0.0.78:*:*:*:*:*:*:*", "name": "uv-globfilter", - "purl": "pkg:cargo/uv-globfilter@0.0.70", + "purl": "pkg:cargo/uv-globfilter@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-install-wheel@0.0.70?package-id=863378d0aa42265b", - "cpe": "cpe:2.3:a:uv-install-wheel:uv-install-wheel:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-install-wheel@0.0.78?package-id=289a7042077c8b20", + "cpe": "cpe:2.3:a:uv-install-wheel:uv-install-wheel:0.0.78:*:*:*:*:*:*:*", "name": "uv-install-wheel", - "purl": "pkg:cargo/uv-install-wheel@0.0.70", + "purl": "pkg:cargo/uv-install-wheel@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-install-wheel@0.0.70?package-id=942d41a6325a790b", - "cpe": "cpe:2.3:a:uv-install-wheel:uv-install-wheel:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-install-wheel@0.0.78?package-id=99e2eee0c7453449", + "cpe": "cpe:2.3:a:uv-install-wheel:uv-install-wheel:0.0.78:*:*:*:*:*:*:*", "name": "uv-install-wheel", - "purl": "pkg:cargo/uv-install-wheel@0.0.70", + "purl": "pkg:cargo/uv-install-wheel@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-installer@0.0.70?package-id=0c12ea3065462d4e", - "cpe": "cpe:2.3:a:uv-installer:uv-installer:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-installer@0.0.78?package-id=1fa0a5189e2e661c", + "cpe": "cpe:2.3:a:uv-installer:uv-installer:0.0.78:*:*:*:*:*:*:*", "name": "uv-installer", - "purl": "pkg:cargo/uv-installer@0.0.70", + "purl": "pkg:cargo/uv-installer@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-installer@0.0.70?package-id=1eaf39df80911f82", - "cpe": "cpe:2.3:a:uv-installer:uv-installer:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-installer@0.0.78?package-id=a95416c98f0af1f4", + "cpe": "cpe:2.3:a:uv-installer:uv-installer:0.0.78:*:*:*:*:*:*:*", "name": "uv-installer", - "purl": "pkg:cargo/uv-installer@0.0.70", + "purl": "pkg:cargo/uv-installer@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-keyring@0.0.70?package-id=4bfdfc7107f57c4c", - "cpe": "cpe:2.3:a:uv-keyring:uv-keyring:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-keyring@0.0.78?package-id=a430fb55833a75e5", + "cpe": "cpe:2.3:a:uv-keyring:uv-keyring:0.0.78:*:*:*:*:*:*:*", "name": "uv-keyring", - "purl": "pkg:cargo/uv-keyring@0.0.70", + "purl": "pkg:cargo/uv-keyring@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-keyring@0.0.70?package-id=6b89b203fb99cef3", - "cpe": "cpe:2.3:a:uv-keyring:uv-keyring:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-keyring@0.0.78?package-id=faad277f7fe1189a", + "cpe": "cpe:2.3:a:uv-keyring:uv-keyring:0.0.78:*:*:*:*:*:*:*", "name": "uv-keyring", - "purl": "pkg:cargo/uv-keyring@0.0.70", + "purl": "pkg:cargo/uv-keyring@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-logging@0.0.70?package-id=65760edcef2edc2a", - "cpe": "cpe:2.3:a:uv-logging:uv-logging:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-logging@0.0.78?package-id=1e89b9212a7413dd", + "cpe": "cpe:2.3:a:uv-logging:uv-logging:0.0.78:*:*:*:*:*:*:*", "name": "uv-logging", - "purl": "pkg:cargo/uv-logging@0.0.70", + "purl": "pkg:cargo/uv-logging@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-logging@0.0.70?package-id=8443714d93f87404", - "cpe": "cpe:2.3:a:uv-logging:uv-logging:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-logging@0.0.78?package-id=7f29396d121defec", + "cpe": "cpe:2.3:a:uv-logging:uv-logging:0.0.78:*:*:*:*:*:*:*", "name": "uv-logging", - "purl": "pkg:cargo/uv-logging@0.0.70", + "purl": "pkg:cargo/uv-logging@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-metadata@0.0.70?package-id=49d3c836135ca9e0", - "cpe": "cpe:2.3:a:uv-metadata:uv-metadata:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-metadata@0.0.78?package-id=25bd1ea05c2b367c", + "cpe": "cpe:2.3:a:uv-metadata:uv-metadata:0.0.78:*:*:*:*:*:*:*", "name": "uv-metadata", - "purl": "pkg:cargo/uv-metadata@0.0.70", + "purl": "pkg:cargo/uv-metadata@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-metadata@0.0.70?package-id=679507f507ec7467", - "cpe": "cpe:2.3:a:uv-metadata:uv-metadata:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-metadata@0.0.78?package-id=696418bd499e29d7", + "cpe": "cpe:2.3:a:uv-metadata:uv-metadata:0.0.78:*:*:*:*:*:*:*", "name": "uv-metadata", - "purl": "pkg:cargo/uv-metadata@0.0.70", + "purl": "pkg:cargo/uv-metadata@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-netrc@0.0.70?package-id=1cacb4753cd81f10", - "cpe": "cpe:2.3:a:uv-netrc:uv-netrc:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-netrc@0.0.78?package-id=1db0b3b66ad60006", + "cpe": "cpe:2.3:a:uv-netrc:uv-netrc:0.0.78:*:*:*:*:*:*:*", "name": "uv-netrc", - "purl": "pkg:cargo/uv-netrc@0.0.70", + "purl": "pkg:cargo/uv-netrc@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-netrc@0.0.70?package-id=2e972ac91640e87c", - "cpe": "cpe:2.3:a:uv-netrc:uv-netrc:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-netrc@0.0.78?package-id=92fb84066170e154", + "cpe": "cpe:2.3:a:uv-netrc:uv-netrc:0.0.78:*:*:*:*:*:*:*", "name": "uv-netrc", - "purl": "pkg:cargo/uv-netrc@0.0.70", + "purl": "pkg:cargo/uv-netrc@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-normalize@0.0.70?package-id=38a24d450d4cd6a3", - "cpe": "cpe:2.3:a:uv-normalize:uv-normalize:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-normalize@0.0.78?package-id=3eec5f712d65bd18", + "cpe": "cpe:2.3:a:uv-normalize:uv-normalize:0.0.78:*:*:*:*:*:*:*", "name": "uv-normalize", - "purl": "pkg:cargo/uv-normalize@0.0.70", + "purl": "pkg:cargo/uv-normalize@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-normalize@0.0.70?package-id=8d80bca68b7fce49", - "cpe": "cpe:2.3:a:uv-normalize:uv-normalize:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-normalize@0.0.78?package-id=a8e1788798f86a64", + "cpe": "cpe:2.3:a:uv-normalize:uv-normalize:0.0.78:*:*:*:*:*:*:*", "name": "uv-normalize", - "purl": "pkg:cargo/uv-normalize@0.0.70", + "purl": "pkg:cargo/uv-normalize@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-once-map@0.0.70?package-id=08a6b7647fbd3b17", - "cpe": "cpe:2.3:a:uv-once-map:uv-once-map:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-once-map@0.0.78?package-id=285478baec6fc69f", + "cpe": "cpe:2.3:a:uv-once-map:uv-once-map:0.0.78:*:*:*:*:*:*:*", "name": "uv-once-map", - "purl": "pkg:cargo/uv-once-map@0.0.70", + "purl": "pkg:cargo/uv-once-map@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-once-map@0.0.70?package-id=90fe6f4ba4af252c", - "cpe": "cpe:2.3:a:uv-once-map:uv-once-map:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-once-map@0.0.78?package-id=56c8016f79764cba", + "cpe": "cpe:2.3:a:uv-once-map:uv-once-map:0.0.78:*:*:*:*:*:*:*", "name": "uv-once-map", - "purl": "pkg:cargo/uv-once-map@0.0.70", + "purl": "pkg:cargo/uv-once-map@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-options-metadata@0.0.70?package-id=271603cb0a3abddd", - "cpe": "cpe:2.3:a:uv-options-metadata:uv-options-metadata:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-options-metadata@0.0.78?package-id=3397033e775076e5", + "cpe": "cpe:2.3:a:uv-options-metadata:uv-options-metadata:0.0.78:*:*:*:*:*:*:*", "name": "uv-options-metadata", - "purl": "pkg:cargo/uv-options-metadata@0.0.70", + "purl": "pkg:cargo/uv-options-metadata@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-options-metadata@0.0.70?package-id=60976f291b16d4cf", - "cpe": "cpe:2.3:a:uv-options-metadata:uv-options-metadata:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-options-metadata@0.0.78?package-id=8feb6d181c674de2", + "cpe": "cpe:2.3:a:uv-options-metadata:uv-options-metadata:0.0.78:*:*:*:*:*:*:*", "name": "uv-options-metadata", - "purl": "pkg:cargo/uv-options-metadata@0.0.70", + "purl": "pkg:cargo/uv-options-metadata@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-pep440@0.0.70?package-id=12b5fcebef43156f", - "cpe": "cpe:2.3:a:uv-pep440:uv-pep440:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-pep440@0.0.78?package-id=05d4ec93745c9474", + "cpe": "cpe:2.3:a:uv-pep440:uv-pep440:0.0.78:*:*:*:*:*:*:*", "name": "uv-pep440", - "purl": "pkg:cargo/uv-pep440@0.0.70", + "purl": "pkg:cargo/uv-pep440@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-pep440@0.0.70?package-id=e92360c981858004", - "cpe": "cpe:2.3:a:uv-pep440:uv-pep440:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-pep440@0.0.78?package-id=e25e7ae4ee5aff04", + "cpe": "cpe:2.3:a:uv-pep440:uv-pep440:0.0.78:*:*:*:*:*:*:*", "name": "uv-pep440", - "purl": "pkg:cargo/uv-pep440@0.0.70", + "purl": "pkg:cargo/uv-pep440@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-pep508@0.0.70?package-id=5387cb4d91004239", - "cpe": "cpe:2.3:a:uv-pep508:uv-pep508:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-pep508@0.0.78?package-id=8db6507eec01cfd3", + "cpe": "cpe:2.3:a:uv-pep508:uv-pep508:0.0.78:*:*:*:*:*:*:*", "name": "uv-pep508", - "purl": "pkg:cargo/uv-pep508@0.0.70", + "purl": "pkg:cargo/uv-pep508@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-pep508@0.0.70?package-id=5660c2cd600c65f7", - "cpe": "cpe:2.3:a:uv-pep508:uv-pep508:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-pep508@0.0.78?package-id=934d4f5102c12358", + "cpe": "cpe:2.3:a:uv-pep508:uv-pep508:0.0.78:*:*:*:*:*:*:*", "name": "uv-pep508", - "purl": "pkg:cargo/uv-pep508@0.0.70", + "purl": "pkg:cargo/uv-pep508@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-performance-memory-allocator@0.0.70?package-id=0b714de9d407de66", - "cpe": "cpe:2.3:a:uv-performance-memory-allocator:uv-performance-memory-allocator:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-performance-memory-allocator@0.0.78?package-id=7da69bcd1d7d908c", + "cpe": "cpe:2.3:a:uv-performance-memory-allocator:uv-performance-memory-allocator:0.0.78:*:*:*:*:*:*:*", "name": "uv-performance-memory-allocator", - "purl": "pkg:cargo/uv-performance-memory-allocator@0.0.70", + "purl": "pkg:cargo/uv-performance-memory-allocator@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-performance-memory-allocator@0.0.70?package-id=55ec58cf87f527e2", - "cpe": "cpe:2.3:a:uv-performance-memory-allocator:uv-performance-memory-allocator:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-performance-memory-allocator@0.0.78?package-id=9b6984f2df5a0cd9", + "cpe": "cpe:2.3:a:uv-performance-memory-allocator:uv-performance-memory-allocator:0.0.78:*:*:*:*:*:*:*", "name": "uv-performance-memory-allocator", - "purl": "pkg:cargo/uv-performance-memory-allocator@0.0.70", + "purl": "pkg:cargo/uv-performance-memory-allocator@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-platform@0.0.70?package-id=4942df268097c679", - "cpe": "cpe:2.3:a:uv-platform:uv-platform:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-platform@0.0.78?package-id=3135458d86193de2", + "cpe": "cpe:2.3:a:uv-platform:uv-platform:0.0.78:*:*:*:*:*:*:*", "name": "uv-platform", - "purl": "pkg:cargo/uv-platform@0.0.70", + "purl": "pkg:cargo/uv-platform@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-platform@0.0.70?package-id=5b73619c1d96ad8e", - "cpe": "cpe:2.3:a:uv-platform:uv-platform:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-platform@0.0.78?package-id=b635a5dacc8790ac", + "cpe": "cpe:2.3:a:uv-platform:uv-platform:0.0.78:*:*:*:*:*:*:*", "name": "uv-platform", - "purl": "pkg:cargo/uv-platform@0.0.70", + "purl": "pkg:cargo/uv-platform@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-platform-tags@0.0.70?package-id=f30a7c66551e7765", - "cpe": "cpe:2.3:a:uv-platform-tags:uv-platform-tags:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-platform-tags@0.0.78?package-id=a2fe49527e181885", + "cpe": "cpe:2.3:a:uv-platform-tags:uv-platform-tags:0.0.78:*:*:*:*:*:*:*", "name": "uv-platform-tags", - "purl": "pkg:cargo/uv-platform-tags@0.0.70", + "purl": "pkg:cargo/uv-platform-tags@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-platform-tags@0.0.70?package-id=f9272fe722c4cee4", - "cpe": "cpe:2.3:a:uv-platform-tags:uv-platform-tags:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-platform-tags@0.0.78?package-id=ddd1f138a669f29e", + "cpe": "cpe:2.3:a:uv-platform-tags:uv-platform-tags:0.0.78:*:*:*:*:*:*:*", "name": "uv-platform-tags", - "purl": "pkg:cargo/uv-platform-tags@0.0.70", + "purl": "pkg:cargo/uv-platform-tags@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-preview@0.0.70?package-id=4132f47350bc90d9", - "cpe": "cpe:2.3:a:uv-preview:uv-preview:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-preview@0.0.78?package-id=7d6d8677cfe69655", + "cpe": "cpe:2.3:a:uv-preview:uv-preview:0.0.78:*:*:*:*:*:*:*", "name": "uv-preview", - "purl": "pkg:cargo/uv-preview@0.0.70", + "purl": "pkg:cargo/uv-preview@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-preview@0.0.70?package-id=faf2790949497797", - "cpe": "cpe:2.3:a:uv-preview:uv-preview:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-preview@0.0.78?package-id=e35c58a07993fcaa", + "cpe": "cpe:2.3:a:uv-preview:uv-preview:0.0.78:*:*:*:*:*:*:*", "name": "uv-preview", - "purl": "pkg:cargo/uv-preview@0.0.70", + "purl": "pkg:cargo/uv-preview@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-publish@0.0.70?package-id=e6375ffa4f305655", - "cpe": "cpe:2.3:a:uv-publish:uv-publish:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-publish@0.0.78?package-id=aa10bb8e3f874c3c", + "cpe": "cpe:2.3:a:uv-publish:uv-publish:0.0.78:*:*:*:*:*:*:*", "name": "uv-publish", - "purl": "pkg:cargo/uv-publish@0.0.70", + "purl": "pkg:cargo/uv-publish@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-publish@0.0.70?package-id=f291f14e0e2ea9f1", - "cpe": "cpe:2.3:a:uv-publish:uv-publish:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-publish@0.0.78?package-id=adf27a09616585eb", + "cpe": "cpe:2.3:a:uv-publish:uv-publish:0.0.78:*:*:*:*:*:*:*", "name": "uv-publish", - "purl": "pkg:cargo/uv-publish@0.0.70", + "purl": "pkg:cargo/uv-publish@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-pypi-types@0.0.70?package-id=7cad15158b93b603", - "cpe": "cpe:2.3:a:uv-pypi-types:uv-pypi-types:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-pypi-types@0.0.78?package-id=0d9a9f4965cfb932", + "cpe": "cpe:2.3:a:uv-pypi-types:uv-pypi-types:0.0.78:*:*:*:*:*:*:*", "name": "uv-pypi-types", - "purl": "pkg:cargo/uv-pypi-types@0.0.70", + "purl": "pkg:cargo/uv-pypi-types@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-pypi-types@0.0.70?package-id=bcc452b11329552a", - "cpe": "cpe:2.3:a:uv-pypi-types:uv-pypi-types:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-pypi-types@0.0.78?package-id=9c373928ef78a303", + "cpe": "cpe:2.3:a:uv-pypi-types:uv-pypi-types:0.0.78:*:*:*:*:*:*:*", "name": "uv-pypi-types", - "purl": "pkg:cargo/uv-pypi-types@0.0.70", + "purl": "pkg:cargo/uv-pypi-types@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-python@0.0.70?package-id=6fa987c786f61a44", - "cpe": "cpe:2.3:a:uv-python:uv-python:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-python@0.0.78?package-id=29b1a28b2754bd07", + "cpe": "cpe:2.3:a:uv-python:uv-python:0.0.78:*:*:*:*:*:*:*", "name": "uv-python", - "purl": "pkg:cargo/uv-python@0.0.70", + "purl": "pkg:cargo/uv-python@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-python@0.0.70?package-id=da60c88f69d9f41b", - "cpe": "cpe:2.3:a:uv-python:uv-python:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-python@0.0.78?package-id=ac762b247f41d78e", + "cpe": "cpe:2.3:a:uv-python:uv-python:0.0.78:*:*:*:*:*:*:*", "name": "uv-python", - "purl": "pkg:cargo/uv-python@0.0.70", + "purl": "pkg:cargo/uv-python@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-redacted@0.0.70?package-id=6607e072afb76903", - "cpe": "cpe:2.3:a:uv-redacted:uv-redacted:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-redacted@0.0.78?package-id=3b86c5640e430f16", + "cpe": "cpe:2.3:a:uv-redacted:uv-redacted:0.0.78:*:*:*:*:*:*:*", "name": "uv-redacted", - "purl": "pkg:cargo/uv-redacted@0.0.70", + "purl": "pkg:cargo/uv-redacted@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-redacted@0.0.70?package-id=ef2b72c709c8ea31", - "cpe": "cpe:2.3:a:uv-redacted:uv-redacted:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-redacted@0.0.78?package-id=769ad237b2b85a32", + "cpe": "cpe:2.3:a:uv-redacted:uv-redacted:0.0.78:*:*:*:*:*:*:*", "name": "uv-redacted", - "purl": "pkg:cargo/uv-redacted@0.0.70", + "purl": "pkg:cargo/uv-redacted@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-requirements@0.0.70?package-id=54d508c19b3d127d", - "cpe": "cpe:2.3:a:uv-requirements:uv-requirements:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-requirements@0.0.78?package-id=0411385430cb4b9a", + "cpe": "cpe:2.3:a:uv-requirements:uv-requirements:0.0.78:*:*:*:*:*:*:*", "name": "uv-requirements", - "purl": "pkg:cargo/uv-requirements@0.0.70", + "purl": "pkg:cargo/uv-requirements@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-requirements@0.0.70?package-id=efac5f015b676b9d", - "cpe": "cpe:2.3:a:uv-requirements:uv-requirements:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-requirements@0.0.78?package-id=7dcade9c9c25688f", + "cpe": "cpe:2.3:a:uv-requirements:uv-requirements:0.0.78:*:*:*:*:*:*:*", "name": "uv-requirements", - "purl": "pkg:cargo/uv-requirements@0.0.70", + "purl": "pkg:cargo/uv-requirements@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-requirements-txt@0.0.70?package-id=0e63d7677179080b", - "cpe": "cpe:2.3:a:uv-requirements-txt:uv-requirements-txt:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-requirements-txt@0.0.78?package-id=2ef020ff77b97607", + "cpe": "cpe:2.3:a:uv-requirements-txt:uv-requirements-txt:0.0.78:*:*:*:*:*:*:*", "name": "uv-requirements-txt", - "purl": "pkg:cargo/uv-requirements-txt@0.0.70", + "purl": "pkg:cargo/uv-requirements-txt@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-requirements-txt@0.0.70?package-id=6b73494288bfa47d", - "cpe": "cpe:2.3:a:uv-requirements-txt:uv-requirements-txt:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-requirements-txt@0.0.78?package-id=409a3809bfc72452", + "cpe": "cpe:2.3:a:uv-requirements-txt:uv-requirements-txt:0.0.78:*:*:*:*:*:*:*", "name": "uv-requirements-txt", - "purl": "pkg:cargo/uv-requirements-txt@0.0.70", + "purl": "pkg:cargo/uv-requirements-txt@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-resolver@0.0.70?package-id=2ef9f3f793ee6202", - "cpe": "cpe:2.3:a:uv-resolver:uv-resolver:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-resolver@0.0.78?package-id=47c6b863f21a6850", + "cpe": "cpe:2.3:a:uv-resolver:uv-resolver:0.0.78:*:*:*:*:*:*:*", "name": "uv-resolver", - "purl": "pkg:cargo/uv-resolver@0.0.70", + "purl": "pkg:cargo/uv-resolver@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-resolver@0.0.70?package-id=b09e6be2d472dc44", - "cpe": "cpe:2.3:a:uv-resolver:uv-resolver:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-resolver@0.0.78?package-id=b7c67e77ef642023", + "cpe": "cpe:2.3:a:uv-resolver:uv-resolver:0.0.78:*:*:*:*:*:*:*", "name": "uv-resolver", - "purl": "pkg:cargo/uv-resolver@0.0.70", + "purl": "pkg:cargo/uv-resolver@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-scripts@0.0.70?package-id=c035455536fb7bf5", - "cpe": "cpe:2.3:a:uv-scripts:uv-scripts:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-scripts@0.0.78?package-id=2d5fcd36146189fa", + "cpe": "cpe:2.3:a:uv-scripts:uv-scripts:0.0.78:*:*:*:*:*:*:*", "name": "uv-scripts", - "purl": "pkg:cargo/uv-scripts@0.0.70", + "purl": "pkg:cargo/uv-scripts@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-scripts@0.0.70?package-id=d86cefba67edc9f6", - "cpe": "cpe:2.3:a:uv-scripts:uv-scripts:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-scripts@0.0.78?package-id=6ed079be320a3f67", + "cpe": "cpe:2.3:a:uv-scripts:uv-scripts:0.0.78:*:*:*:*:*:*:*", "name": "uv-scripts", - "purl": "pkg:cargo/uv-scripts@0.0.70", + "purl": "pkg:cargo/uv-scripts@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-settings@0.0.70?package-id=f340d5d62bd81214", - "cpe": "cpe:2.3:a:uv-settings:uv-settings:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-settings@0.0.78?package-id=98ae8c9cf87c592b", + "cpe": "cpe:2.3:a:uv-settings:uv-settings:0.0.78:*:*:*:*:*:*:*", "name": "uv-settings", - "purl": "pkg:cargo/uv-settings@0.0.70", + "purl": "pkg:cargo/uv-settings@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-settings@0.0.70?package-id=fd82ddec16672490", - "cpe": "cpe:2.3:a:uv-settings:uv-settings:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-settings@0.0.78?package-id=be753c584c307cb6", + "cpe": "cpe:2.3:a:uv-settings:uv-settings:0.0.78:*:*:*:*:*:*:*", "name": "uv-settings", - "purl": "pkg:cargo/uv-settings@0.0.70", + "purl": "pkg:cargo/uv-settings@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-shell@0.0.70?package-id=5a5435e5984db67c", - "cpe": "cpe:2.3:a:uv-shell:uv-shell:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-shell@0.0.78?package-id=47c302f8a18e3e5c", + "cpe": "cpe:2.3:a:uv-shell:uv-shell:0.0.78:*:*:*:*:*:*:*", "name": "uv-shell", - "purl": "pkg:cargo/uv-shell@0.0.70", + "purl": "pkg:cargo/uv-shell@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-shell@0.0.70?package-id=a17cc30980f500b5", - "cpe": "cpe:2.3:a:uv-shell:uv-shell:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-shell@0.0.78?package-id=f781ddee1ff95a55", + "cpe": "cpe:2.3:a:uv-shell:uv-shell:0.0.78:*:*:*:*:*:*:*", "name": "uv-shell", - "purl": "pkg:cargo/uv-shell@0.0.70", + "purl": "pkg:cargo/uv-shell@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-small-str@0.0.70?package-id=b1aa5123611ce245", - "cpe": "cpe:2.3:a:uv-small-str:uv-small-str:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-small-str@0.0.78?package-id=4f9eab7caec67656", + "cpe": "cpe:2.3:a:uv-small-str:uv-small-str:0.0.78:*:*:*:*:*:*:*", "name": "uv-small-str", - "purl": "pkg:cargo/uv-small-str@0.0.70", + "purl": "pkg:cargo/uv-small-str@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-small-str@0.0.70?package-id=eedc91e483dbda32", - "cpe": "cpe:2.3:a:uv-small-str:uv-small-str:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-small-str@0.0.78?package-id=557cede4f53004cc", + "cpe": "cpe:2.3:a:uv-small-str:uv-small-str:0.0.78:*:*:*:*:*:*:*", "name": "uv-small-str", - "purl": "pkg:cargo/uv-small-str@0.0.70", + "purl": "pkg:cargo/uv-small-str@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-state@0.0.70?package-id=88e5b32e05737f82", - "cpe": "cpe:2.3:a:uv-state:uv-state:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-state@0.0.78?package-id=35734df178b5e340", + "cpe": "cpe:2.3:a:uv-state:uv-state:0.0.78:*:*:*:*:*:*:*", "name": "uv-state", - "purl": "pkg:cargo/uv-state@0.0.70", + "purl": "pkg:cargo/uv-state@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-state@0.0.70?package-id=9d3416f4b4b7ff21", - "cpe": "cpe:2.3:a:uv-state:uv-state:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-state@0.0.78?package-id=f954cefe2f6da2ef", + "cpe": "cpe:2.3:a:uv-state:uv-state:0.0.78:*:*:*:*:*:*:*", "name": "uv-state", - "purl": "pkg:cargo/uv-state@0.0.70", + "purl": "pkg:cargo/uv-state@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-static@0.0.70?package-id=9b73e6fd96777a4f", - "cpe": "cpe:2.3:a:uv-static:uv-static:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-static@0.0.78?package-id=4a524d369e1e9b9b", + "cpe": "cpe:2.3:a:uv-static:uv-static:0.0.78:*:*:*:*:*:*:*", "name": "uv-static", - "purl": "pkg:cargo/uv-static@0.0.70", + "purl": "pkg:cargo/uv-static@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-static@0.0.70?package-id=f73d2faa7ef659a4", - "cpe": "cpe:2.3:a:uv-static:uv-static:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-static@0.0.78?package-id=6e8ffb0813cc2e5b", + "cpe": "cpe:2.3:a:uv-static:uv-static:0.0.78:*:*:*:*:*:*:*", "name": "uv-static", - "purl": "pkg:cargo/uv-static@0.0.70", + "purl": "pkg:cargo/uv-static@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-test@0.0.70?package-id=ac175c0632abfe89", - "cpe": "cpe:2.3:a:uv-test:uv-test:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-test@0.0.78?package-id=06b028dcf9bc73c2", + "cpe": "cpe:2.3:a:uv-test:uv-test:0.0.78:*:*:*:*:*:*:*", "name": "uv-test", - "purl": "pkg:cargo/uv-test@0.0.70", + "purl": "pkg:cargo/uv-test@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-test@0.0.70?package-id=fe28877042572348", - "cpe": "cpe:2.3:a:uv-test:uv-test:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-test@0.0.78?package-id=3d272e33cb7df433", + "cpe": "cpe:2.3:a:uv-test:uv-test:0.0.78:*:*:*:*:*:*:*", "name": "uv-test", - "purl": "pkg:cargo/uv-test@0.0.70", + "purl": "pkg:cargo/uv-test@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-toml@0.0.70?package-id=612d33d44c6d88e9", - "cpe": "cpe:2.3:a:uv-toml:uv-toml:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-toml@0.0.78?package-id=4ec7df8bee653bc7", + "cpe": "cpe:2.3:a:uv-toml:uv-toml:0.0.78:*:*:*:*:*:*:*", "name": "uv-toml", - "purl": "pkg:cargo/uv-toml@0.0.70", + "purl": "pkg:cargo/uv-toml@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-toml@0.0.70?package-id=e76be011b9429779", - "cpe": "cpe:2.3:a:uv-toml:uv-toml:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-toml@0.0.78?package-id=fc6eb239fc174228", + "cpe": "cpe:2.3:a:uv-toml:uv-toml:0.0.78:*:*:*:*:*:*:*", "name": "uv-toml", - "purl": "pkg:cargo/uv-toml@0.0.70", + "purl": "pkg:cargo/uv-toml@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-tool@0.0.70?package-id=104f4ab6ea506e32", - "cpe": "cpe:2.3:a:uv-tool:uv-tool:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-tool@0.0.78?package-id=4001bff8332f525b", + "cpe": "cpe:2.3:a:uv-tool:uv-tool:0.0.78:*:*:*:*:*:*:*", "name": "uv-tool", - "purl": "pkg:cargo/uv-tool@0.0.70", + "purl": "pkg:cargo/uv-tool@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-tool@0.0.70?package-id=b63816cb24b51f0b", - "cpe": "cpe:2.3:a:uv-tool:uv-tool:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-tool@0.0.78?package-id=cf48981d1790a499", + "cpe": "cpe:2.3:a:uv-tool:uv-tool:0.0.78:*:*:*:*:*:*:*", "name": "uv-tool", - "purl": "pkg:cargo/uv-tool@0.0.70", + "purl": "pkg:cargo/uv-tool@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-torch@0.0.70?package-id=3be323edeefa50bc", - "cpe": "cpe:2.3:a:uv-torch:uv-torch:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-torch@0.0.78?package-id=1915cbbbc9d714f8", + "cpe": "cpe:2.3:a:uv-torch:uv-torch:0.0.78:*:*:*:*:*:*:*", "name": "uv-torch", - "purl": "pkg:cargo/uv-torch@0.0.70", + "purl": "pkg:cargo/uv-torch@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-torch@0.0.70?package-id=6cb440c62cf40c29", - "cpe": "cpe:2.3:a:uv-torch:uv-torch:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-torch@0.0.78?package-id=89b7313071a0b2a2", + "cpe": "cpe:2.3:a:uv-torch:uv-torch:0.0.78:*:*:*:*:*:*:*", "name": "uv-torch", - "purl": "pkg:cargo/uv-torch@0.0.70", + "purl": "pkg:cargo/uv-torch@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-trampoline-builder@0.0.70?package-id=4be1348a5b7d3ea9", - "cpe": "cpe:2.3:a:uv-trampoline-builder:uv-trampoline-builder:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-trampoline-builder@0.0.78?package-id=6fc640e4e5e94396", + "cpe": "cpe:2.3:a:uv-trampoline-builder:uv-trampoline-builder:0.0.78:*:*:*:*:*:*:*", "name": "uv-trampoline-builder", - "purl": "pkg:cargo/uv-trampoline-builder@0.0.70", + "purl": "pkg:cargo/uv-trampoline-builder@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-trampoline-builder@0.0.70?package-id=d4eb62ca76e72a7d", - "cpe": "cpe:2.3:a:uv-trampoline-builder:uv-trampoline-builder:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-trampoline-builder@0.0.78?package-id=ffb38f113753ed09", + "cpe": "cpe:2.3:a:uv-trampoline-builder:uv-trampoline-builder:0.0.78:*:*:*:*:*:*:*", "name": "uv-trampoline-builder", - "purl": "pkg:cargo/uv-trampoline-builder@0.0.70", + "purl": "pkg:cargo/uv-trampoline-builder@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-types@0.0.70?package-id=34da8a26116b2c8f", - "cpe": "cpe:2.3:a:uv-types:uv-types:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-types@0.0.78?package-id=789e48d34f95d5d2", + "cpe": "cpe:2.3:a:uv-types:uv-types:0.0.78:*:*:*:*:*:*:*", "name": "uv-types", - "purl": "pkg:cargo/uv-types@0.0.70", + "purl": "pkg:cargo/uv-types@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-types@0.0.70?package-id=edc698e1171eec02", - "cpe": "cpe:2.3:a:uv-types:uv-types:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-types@0.0.78?package-id=f697ce517bc413c4", + "cpe": "cpe:2.3:a:uv-types:uv-types:0.0.78:*:*:*:*:*:*:*", "name": "uv-types", - "purl": "pkg:cargo/uv-types@0.0.70", + "purl": "pkg:cargo/uv-types@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-unix@0.0.70?package-id=588fdf74e2ea90a6", - "cpe": "cpe:2.3:a:uv-unix:uv-unix:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-unix@0.0.78?package-id=1c6d04b4b0f48ac5", + "cpe": "cpe:2.3:a:uv-unix:uv-unix:0.0.78:*:*:*:*:*:*:*", "name": "uv-unix", - "purl": "pkg:cargo/uv-unix@0.0.70", + "purl": "pkg:cargo/uv-unix@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-unix@0.0.70?package-id=ae52f8666cc81c6d", - "cpe": "cpe:2.3:a:uv-unix:uv-unix:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-unix@0.0.78?package-id=f50fa248c3ddba2d", + "cpe": "cpe:2.3:a:uv-unix:uv-unix:0.0.78:*:*:*:*:*:*:*", "name": "uv-unix", - "purl": "pkg:cargo/uv-unix@0.0.70", + "purl": "pkg:cargo/uv-unix@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-version@0.12.3?package-id=391334153204a0f4", - "cpe": "cpe:2.3:a:uv-version:uv-version:0.12.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-version@0.12.11?package-id=02b9160bee707bba", + "cpe": "cpe:2.3:a:uv-version:uv-version:0.12.11:*:*:*:*:*:*:*", "name": "uv-version", - "purl": "pkg:cargo/uv-version@0.12.3", + "purl": "pkg:cargo/uv-version@0.12.11", "type": "library", - "version": "0.12.3" + "version": "0.12.11" }, { - "bom-ref": "pkg:cargo/uv-version@0.12.3?package-id=72cac4445208a7a5", - "cpe": "cpe:2.3:a:uv-version:uv-version:0.12.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-version@0.12.11?package-id=71cd2dbb27956ba2", + "cpe": "cpe:2.3:a:uv-version:uv-version:0.12.11:*:*:*:*:*:*:*", "name": "uv-version", - "purl": "pkg:cargo/uv-version@0.12.3", + "purl": "pkg:cargo/uv-version@0.12.11", "type": "library", - "version": "0.12.3" + "version": "0.12.11" }, { - "bom-ref": "pkg:cargo/uv-virtualenv@0.0.70?package-id=7ddf1517c99d7c79", - "cpe": "cpe:2.3:a:uv-virtualenv:uv-virtualenv:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-virtualenv@0.0.78?package-id=57c7923fda05db4b", + "cpe": "cpe:2.3:a:uv-virtualenv:uv-virtualenv:0.0.78:*:*:*:*:*:*:*", "name": "uv-virtualenv", - "purl": "pkg:cargo/uv-virtualenv@0.0.70", + "purl": "pkg:cargo/uv-virtualenv@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-virtualenv@0.0.70?package-id=cb09fa8be2723257", - "cpe": "cpe:2.3:a:uv-virtualenv:uv-virtualenv:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-virtualenv@0.0.78?package-id=e7ede56c1a4d48f3", + "cpe": "cpe:2.3:a:uv-virtualenv:uv-virtualenv:0.0.78:*:*:*:*:*:*:*", "name": "uv-virtualenv", - "purl": "pkg:cargo/uv-virtualenv@0.0.70", + "purl": "pkg:cargo/uv-virtualenv@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-warnings@0.0.70?package-id=504c1bed0c82ad5c", - "cpe": "cpe:2.3:a:uv-warnings:uv-warnings:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-warnings@0.0.78?package-id=5532909901631c27", + "cpe": "cpe:2.3:a:uv-warnings:uv-warnings:0.0.78:*:*:*:*:*:*:*", "name": "uv-warnings", - "purl": "pkg:cargo/uv-warnings@0.0.70", + "purl": "pkg:cargo/uv-warnings@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-warnings@0.0.70?package-id=c0b984f9f559cb72", - "cpe": "cpe:2.3:a:uv-warnings:uv-warnings:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-warnings@0.0.78?package-id=a92b0b944aaa2c3e", + "cpe": "cpe:2.3:a:uv-warnings:uv-warnings:0.0.78:*:*:*:*:*:*:*", "name": "uv-warnings", - "purl": "pkg:cargo/uv-warnings@0.0.70", + "purl": "pkg:cargo/uv-warnings@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-workspace@0.0.70?package-id=ac20a2c2ef6bd330", - "cpe": "cpe:2.3:a:uv-workspace:uv-workspace:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-workspace@0.0.78?package-id=288e8e46802520b3", + "cpe": "cpe:2.3:a:uv-workspace:uv-workspace:0.0.78:*:*:*:*:*:*:*", "name": "uv-workspace", - "purl": "pkg:cargo/uv-workspace@0.0.70", + "purl": "pkg:cargo/uv-workspace@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { - "bom-ref": "pkg:cargo/uv-workspace@0.0.70?package-id=c5de02560af35b80", - "cpe": "cpe:2.3:a:uv-workspace:uv-workspace:0.0.70:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/uv-workspace@0.0.78?package-id=a0ec76a1628571df", + "cpe": "cpe:2.3:a:uv-workspace:uv-workspace:0.0.78:*:*:*:*:*:*:*", "name": "uv-workspace", - "purl": "pkg:cargo/uv-workspace@0.0.70", + "purl": "pkg:cargo/uv-workspace@0.0.78", "type": "library", - "version": "0.0.70" + "version": "0.0.78" }, { "author": "Tom Christie ", - "bom-ref": "pkg:pypi/uvicorn@0.42.0?package-id=06fdb7f8d20624af", - "cpe": "cpe:2.3:a:tom_christie_\\", @@ -101507,8 +108674,8 @@ }, { "author": "Ronny Pfannschmidt ", - "bom-ref": "pkg:pypi/vcs-versioning@2.2.4?package-id=e4156a74ac0a8d16", - "cpe": "cpe:2.3:a:ronny_pfannschmidt_\\", - "purl": "pkg:deb/ubuntu/vim@2%3A9.1.0016-1ubuntu7.18?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/vim@2%3A9.1.0016-1ubuntu7.20?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "2:9.1.0016-1ubuntu7.18" + "version": "2:9.1.0016-1ubuntu7.20" }, { - "bom-ref": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.18?arch=all&distro=ubuntu-24.04&package-id=929a76fb58d04c40&upstream=vim", - "cpe": "cpe:2.3:a:vim-common:vim-common:2\\:9.1.0016-1ubuntu7.18:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.20?arch=all&distro=ubuntu-24.04&package-id=0733bd7d2218bd62&upstream=vim", + "cpe": "cpe:2.3:a:vim-common:vim-common:2\\:9.1.0016-1ubuntu7.20:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -101779,13 +108946,13 @@ ], "name": "vim-common", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.18?arch=all&distro=ubuntu-24.04&upstream=vim", + "purl": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.20?arch=all&distro=ubuntu-24.04&upstream=vim", "type": "library", - "version": "2:9.1.0016-1ubuntu7.18" + "version": "2:9.1.0016-1ubuntu7.20" }, { - "bom-ref": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.18?arch=all&distro=ubuntu-24.04&package-id=3976fdc69eb2c527&upstream=vim", - "cpe": "cpe:2.3:a:vim-runtime:vim-runtime:2\\:9.1.0016-1ubuntu7.18:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.20?arch=all&distro=ubuntu-24.04&package-id=4bdd33951d615455&upstream=vim", + "cpe": "cpe:2.3:a:vim-runtime:vim-runtime:2\\:9.1.0016-1ubuntu7.20:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -101910,14 +109077,14 @@ ], "name": "vim-runtime", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.18?arch=all&distro=ubuntu-24.04&upstream=vim", + "purl": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.20?arch=all&distro=ubuntu-24.04&upstream=vim", "type": "library", - "version": "2:9.1.0016-1ubuntu7.18" + "version": "2:9.1.0016-1ubuntu7.20" }, { "author": "vLLM Team", - "bom-ref": "pkg:pypi/vllm@0.27.1%2Bxpu?package-id=ce3ff6aa5a0090aa", - "cpe": "cpe:2.3:a:vllm_team_project:python-vllm:0.27.1\\+xpu:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/vllm@0.29.0%2Bxpu?package-id=c1230af9e01ecc7b", + "cpe": "cpe:2.3:a:vllm_team_project:python-vllm:0.29.0\\+xpu:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -101926,14 +109093,14 @@ } ], "name": "vllm", - "purl": "pkg:pypi/vllm@0.27.1%2Bxpu", + "purl": "pkg:pypi/vllm@0.29.0%2Bxpu", "type": "library", - "version": "0.27.1+xpu" + "version": "0.29.0+xpu" }, { "author": "vLLM Team", - "bom-ref": "pkg:pypi/vllm@0.27.1%2Bxpu?package-id=f2dc20990fe8aaf8", - "cpe": "cpe:2.3:a:vllm_team_project:python-vllm:0.27.1\\+xpu:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/vllm@0.29.0%2Bxpu?package-id=f67fea7d5020aec6", + "cpe": "cpe:2.3:a:vllm_team_project:python-vllm:0.29.0\\+xpu:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", @@ -101948,9 +109115,9 @@ } ], "name": "vllm", - "purl": "pkg:pypi/vllm@0.27.1%2Bxpu", + "purl": "pkg:pypi/vllm@0.29.0%2Bxpu", "type": "library", - "version": "0.27.1+xpu" + "version": "0.29.0+xpu" }, { "bom-ref": "pkg:pypi/vllm-test-utils@0.1?package-id=7008fbaadac06731", @@ -101961,7 +109128,7 @@ "version": "0.1" }, { - "bom-ref": "pkg:pypi/vllm-test-utils@0.1?package-id=b61b5375ffa84f2c", + "bom-ref": "pkg:pypi/vllm-test-utils@0.1?package-id=cd74c1d8c18625ee", "cpe": "cpe:2.3:a:python-vllm-test-utils:python-vllm-test-utils:0.1:*:*:*:*:*:*:*", "externalReferences": [ { @@ -101976,14 +109143,8 @@ }, { "author": "vLLM Team", - "bom-ref": "pkg:pypi/vllm-xpu-kernels@0.1.12?package-id=cf0602653d2368d1", - "cpe": "cpe:2.3:a:python-vllm-xpu-kernels:python-vllm-xpu-kernels:0.1.12:*:*:*:*:*:*:*", - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/vllm-project/vllm-xpu-kernels/releases/download/v0.1.12/vllm_xpu_kernels-0.1.12-cp38-abi3-manylinux_2_28_x86_64.whl" - } - ], + "bom-ref": "pkg:pypi/vllm-xpu-kernels@0.1.14.1?package-id=a032831609e35ed7", + "cpe": "cpe:2.3:a:python-vllm-xpu-kernels:python-vllm-xpu-kernels:0.1.14.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -101992,9 +109153,9 @@ } ], "name": "vllm-xpu-kernels", - "purl": "pkg:pypi/vllm-xpu-kernels@0.1.12", + "purl": "pkg:pypi/vllm-xpu-kernels@0.1.14.1", "type": "library", - "version": "0.1.12" + "version": "0.1.14.1" }, { "bom-ref": "pkg:cargo/vte@0.14.1?package-id=46db5e5c2c0918f1", @@ -102012,6 +109173,21 @@ "type": "library", "version": "0.14.1" }, + { + "bom-ref": "pkg:pypi/wadllib@1.3.6?package-id=1314e9945ddd3063", + "cpe": "cpe:2.3:a:python-wadllib:python-wadllib:1.3.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "LGPL v3" + } + } + ], + "name": "wadllib", + "purl": "pkg:pypi/wadllib@1.3.6", + "type": "library", + "version": "1.3.6" + }, { "bom-ref": "pkg:cargo/wait-timeout@0.2.1?package-id=0ad040d0aee329c1", "cpe": "cpe:2.3:a:wait-timeout:wait-timeout:0.2.1:*:*:*:*:*:*:*", @@ -102094,8 +109270,8 @@ }, { "author": "Aymeric Augustin ", - "bom-ref": "pkg:pypi/websockets@16.0?package-id=d46e3f90a6ad3c49", - "cpe": "cpe:2.3:a:aymeric_augustin_\\", - "purl": "pkg:deb/ubuntu/wget@1.21.4-1ubuntu4.4?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/wget@1.21.4-1ubuntu4.5?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "1.21.4-1ubuntu4.4" + "version": "1.21.4-1ubuntu4.5" }, { "author": "Daniel Holth ", @@ -102166,8 +109342,8 @@ }, { "author": "Daniel Holth ", - "bom-ref": "pkg:pypi/wheel@0.47.0?package-id=e76dd67596ccfad7", - "cpe": "cpe:2.3:a:daniel_holth_\\", + "purl": "pkg:deb/ubuntu/xml-core@0.19?arch=all&distro=ubuntu-24.04", + "type": "library", + "version": "0.19" + }, { "bom-ref": "pkg:cargo/xml-rs@0.8.28?package-id=21d848ad18029c9c", "cpe": "cpe:2.3:a:xml-rs:xml-rs:0.8.28:*:*:*:*:*:*:*", @@ -102356,21 +109553,47 @@ "type": "library", "version": "0.8.28" }, + { + "bom-ref": "pkg:deb/ubuntu/xpu-smi@2.1.0%2B26.33.6468cec-1~24.04?arch=amd64&distro=ubuntu-24.04&package-id=af1529fff7f62de5&upstream=xpumanager", + "cpe": "cpe:2.3:a:xpu-smi:xpu-smi:2.1.0\\+26.33.6468cec-1\\~24.04:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "MIT" + } + } + ], + "name": "xpu-smi", + "publisher": "Intel Graphics Team ", + "purl": "pkg:deb/ubuntu/xpu-smi@2.1.0%2B26.33.6468cec-1~24.04?arch=amd64&distro=ubuntu-24.04&upstream=xpumanager", + "type": "library", + "version": "2.1.0+26.33.6468cec-1~24.04" + }, { "author": "Yue Du ", - "bom-ref": "pkg:pypi/xxhash@3.6.0?package-id=16ed8606ea02f0c1", - "cpe": "cpe:2.3:a:ifduyue_project:python-xxhash:3.6.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/xxhash@4.0.1?package-id=ed96ebd092054729", + "cpe": "cpe:2.3:a:ifduyue_project:python-xxhash:4.0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { - "name": "BSD" + "id": "BSD-2-Clause" } } ], "name": "xxhash", - "purl": "pkg:pypi/xxhash@3.6.0", + "purl": "pkg:pypi/xxhash@4.0.1", "type": "library", - "version": "3.6.0" + "version": "4.0.1" }, { "bom-ref": "pkg:deb/ubuntu/xz-utils@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=amd64&distro=ubuntu-24.04&package-id=9627186b7212a7e3", @@ -102455,8 +109678,8 @@ }, { "author": "Andrew Svetlov ", - "bom-ref": "pkg:pypi/yarl@1.23.0?package-id=629aa31f8518ab0e", - "cpe": "cpe:2.3:a:andrew_svetlov_project:python-yarl:1.23.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/yarl@1.24.5?package-id=98549cc29830b392", + "cpe": "cpe:2.3:a:andrew_svetlov_project:python-yarl:1.24.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -102465,9 +109688,9 @@ } ], "name": "yarl", - "purl": "pkg:pypi/yarl@1.23.0", + "purl": "pkg:pypi/yarl@1.24.5", "type": "library", - "version": "1.23.0" + "version": "1.24.5" }, { "author": "Andrew Svetlov ", @@ -102566,36 +109789,36 @@ "version": "4.3.2" }, { - "bom-ref": "pkg:cargo/zerocopy@0.8.42?package-id=17b704336c487cce", - "cpe": "cpe:2.3:a:zerocopy:zerocopy:0.8.42:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/zerocopy@0.8.56?package-id=6ec9c276302cd399", + "cpe": "cpe:2.3:a:zerocopy:zerocopy:0.8.56:*:*:*:*:*:*:*", "name": "zerocopy", - "purl": "pkg:cargo/zerocopy@0.8.42", + "purl": "pkg:cargo/zerocopy@0.8.56", "type": "library", - "version": "0.8.42" + "version": "0.8.56" }, { - "bom-ref": "pkg:cargo/zerocopy@0.8.42?package-id=7182e8135232aeea", - "cpe": "cpe:2.3:a:zerocopy:zerocopy:0.8.42:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/zerocopy@0.8.56?package-id=b4dfe5c53fbc4d3d", + "cpe": "cpe:2.3:a:zerocopy:zerocopy:0.8.56:*:*:*:*:*:*:*", "name": "zerocopy", - "purl": "pkg:cargo/zerocopy@0.8.42", + "purl": "pkg:cargo/zerocopy@0.8.56", "type": "library", - "version": "0.8.42" + "version": "0.8.56" }, { - "bom-ref": "pkg:cargo/zerocopy-derive@0.8.42?package-id=4116fb68f181a5fa", - "cpe": "cpe:2.3:a:zerocopy-derive:zerocopy-derive:0.8.42:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/zerocopy-derive@0.8.56?package-id=693e0568743cc5c1", + "cpe": "cpe:2.3:a:zerocopy-derive:zerocopy-derive:0.8.56:*:*:*:*:*:*:*", "name": "zerocopy-derive", - "purl": "pkg:cargo/zerocopy-derive@0.8.42", + "purl": "pkg:cargo/zerocopy-derive@0.8.56", "type": "library", - "version": "0.8.42" + "version": "0.8.56" }, { - "bom-ref": "pkg:cargo/zerocopy-derive@0.8.42?package-id=f37ec2d0a35dfbf7", - "cpe": "cpe:2.3:a:zerocopy-derive:zerocopy-derive:0.8.42:*:*:*:*:*:*:*", + "bom-ref": "pkg:cargo/zerocopy-derive@0.8.56?package-id=b28024e2f22b6e6d", + "cpe": "cpe:2.3:a:zerocopy-derive:zerocopy-derive:0.8.56:*:*:*:*:*:*:*", "name": "zerocopy-derive", - "purl": "pkg:cargo/zerocopy-derive@0.8.42", + "purl": "pkg:cargo/zerocopy-derive@0.8.56", "type": "library", - "version": "0.8.42" + "version": "0.8.56" }, { "bom-ref": "pkg:cargo/zerofrom@0.1.6?package-id=64b09cadf60d61eb", @@ -102726,8 +109949,8 @@ "version": "0.6.3" }, { - "bom-ref": "pkg:deb/ubuntu/zlib1g@1%3A1.3.dfsg-3.1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&package-id=ac4c65178408e21f&upstream=zlib", - "cpe": "cpe:2.3:a:zlib1g:zlib1g:1\\:1.3.dfsg-3.1ubuntu2.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/zlib1g@1%3A1.3.dfsg-3.1ubuntu2.2?arch=amd64&distro=ubuntu-24.04&package-id=14cfe0f375d6d1af&upstream=zlib", + "cpe": "cpe:2.3:a:zlib1g:zlib1g:1\\:1.3.dfsg-3.1ubuntu2.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -102737,13 +109960,13 @@ ], "name": "zlib1g", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/zlib1g@1%3A1.3.dfsg-3.1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&upstream=zlib", + "purl": "pkg:deb/ubuntu/zlib1g@1%3A1.3.dfsg-3.1ubuntu2.2?arch=amd64&distro=ubuntu-24.04&upstream=zlib", "type": "library", - "version": "1:1.3.dfsg-3.1ubuntu2.1" + "version": "1:1.3.dfsg-3.1ubuntu2.2" }, { - "bom-ref": "pkg:deb/ubuntu/zlib1g-dev@1%3A1.3.dfsg-3.1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&package-id=43d31e8e8a318d50&upstream=zlib", - "cpe": "cpe:2.3:a:zlib1g-dev:zlib1g-dev:1\\:1.3.dfsg-3.1ubuntu2.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/zlib1g-dev@1%3A1.3.dfsg-3.1ubuntu2.2?arch=amd64&distro=ubuntu-24.04&package-id=4a2fc1815d87d0fd&upstream=zlib", + "cpe": "cpe:2.3:a:zlib1g-dev:zlib1g-dev:1\\:1.3.dfsg-3.1ubuntu2.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -102753,9 +109976,9 @@ ], "name": "zlib1g-dev", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/zlib1g-dev@1%3A1.3.dfsg-3.1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&upstream=zlib", + "purl": "pkg:deb/ubuntu/zlib1g-dev@1%3A1.3.dfsg-3.1ubuntu2.2?arch=amd64&distro=ubuntu-24.04&upstream=zlib", "type": "library", - "version": "1:1.3.dfsg-3.1ubuntu2.1" + "version": "1:1.3.dfsg-3.1ubuntu2.2" }, { "bom-ref": "pkg:cargo/zmij@1.0.21?package-id=49b74de9bbaab046", @@ -102872,10 +110095,10 @@ ], "metadata": { "component": { - "bom-ref": "0f6edf9c44a300bd", + "bom-ref": "b32f0df0b50f9392", "name": "vllm/vllm-openai-xpu", "type": "container", - "version": "v0.27.1" + "version": "v0.29.0" }, "properties": [ { @@ -102889,12 +110112,12 @@ "author": "anchore", "name": "syft", "type": "application", - "version": "1.51.0" + "version": "1.49.0" } ] } }, - "serialNumber": "urn:uuid:79bbb587-01d6-5ec6-9eda-2d8026e249bb", + "serialNumber": "urn:uuid:7662fe04-9eb1-5ea2-800d-14c6a4b0e5b8", "specVersion": "1.7", "version": 1 } diff --git a/container/context.yaml b/container/context.yaml index 6012465f4eb8..d5ae3e3c28a6 100644 --- a/container/context.yaml +++ b/container/context.yaml @@ -89,12 +89,9 @@ vllm: xpu: base_image: vllm/vllm-openai-xpu runtime_image: vllm/vllm-openai-xpu - base_image_tag: v0.27.1 - runtime_image_tag: v0.27.1 - # Cross-reference: BaseOmniHandler filters unsupported parallel fields for - # this older Omni schema. Remove that workaround when bumping this pin. - vllm_omni_ref: "v0.27.0rc1" - baseline_sbom: vllm-openai-xpu@3309c2e1 + base_image_tag: v0.29.0 + runtime_image_tag: v0.29.0 + baseline_sbom: vllm-openai-xpu@96db42e2 cpu: base_image: ubuntu runtime_image: vllm/vllm-openai-cpu From b40d169e0ad50d9eb86e449c5212afae7f493e37 Mon Sep 17 00:00:00 2001 From: Pei Li Date: Mon, 21 Sep 2026 11:28:16 -0700 Subject: [PATCH 138/191] fix(frontend): make the HTTP listen backlog configurable, default 4096 (#15080) Signed-off-by: Pei Li --- .../components/frontend-configuration.mdx | 8 ++ lib/llm/src/http/service/service_v2.rs | 86 +++++++++++++++++-- lib/runtime/src/config/environment_names.rs | 4 + 3 files changed, 91 insertions(+), 7 deletions(-) diff --git a/docs/fern/pages/reference/components/frontend-configuration.mdx b/docs/fern/pages/reference/components/frontend-configuration.mdx index 76179995cdbc..29175d0993ef 100644 --- a/docs/fern/pages/reference/components/frontend-configuration.mdx +++ b/docs/fern/pages/reference/components/frontend-configuration.mdx @@ -69,6 +69,14 @@ The Rust HTTP server also reads these environment variables, which are not expos See [Runtime Configuration](runtime-configuration.mdx) for `DYN_TCP_MAX_MESSAGE_SIZE`. + + Listen backlog of the frontend socket, for both plain HTTP and TLS, capped by + the kernel at `net.core.somaxconn`. Raise it when many clients open connections + within a few seconds (for example a load client with one connection per + session): connections that arrive while the accept queue is full are delayed + or, depending on the host's TCP settings, fail. + + Maximum time the Frontend waits for admitted HTTP response bodies and `/v1/realtime` WebSocket tasks to finish after shutdown begins. New inference requests are rejected while draining. diff --git a/lib/llm/src/http/service/service_v2.rs b/lib/llm/src/http/service/service_v2.rs index bcdbc5d06a5d..28f91b230037 100644 --- a/lib/llm/src/http/service/service_v2.rs +++ b/lib/llm/src/http/service/service_v2.rs @@ -872,9 +872,7 @@ impl HttpService { /// Like [`spawn`], but uses a caller-provided pre-bound listener. Closes the TOCTOU /// port-allocation gap for tests that need to know the bound port up front. Not - /// supported in TLS mode: TLS uses `axum_server::bind_rustls`, which owns its own - /// bind, so a pre-bound listener cannot be threaded through and dropping it before - /// `bind_rustls` would just re-open the same race. Returns an error if invoked on a + /// supported in TLS mode, which binds internally. Returns an error if invoked on a /// service built with `enable_tls(true)`. /// /// [`spawn`]: HttpService::spawn @@ -924,8 +922,7 @@ impl HttpService { if self.enable_tls { if listener.is_some() { return Err(anyhow::anyhow!( - "Pre-bound listener is not supported in TLS mode; \ - axum_server::bind_rustls owns its own bind. \ + "Pre-bound listener is not supported in TLS mode. \ Use run()/spawn() (which bind internally) when enable_tls is set." )); } @@ -950,7 +947,18 @@ impl HttpService { let config = RustlsConfig::from_config(Arc::new(server_config)); let handle = tls_handle.unwrap_or_default(); - let server = axum_server::bind_rustls(addr, config) + let std_listener = bind_listener(addr) + .and_then(|l| l.into_std()) + .map_err(|e| { + tracing::error!( + protocol = %protocol, + address = %address, + error = %e, + "Failed to bind server to address" + ); + anyhow::anyhow!("Failed to start {} server on {}: {}", protocol, address, e) + })?; + let server = axum_server::from_tcp_rustls(std_listener, config) .handle(handle.clone()) .serve(router.into_make_service()); @@ -1002,7 +1010,7 @@ impl HttpService { let addr: SocketAddr = address .parse() .map_err(|e| anyhow::anyhow!("Invalid address '{}': {}", address, e))?; - tokio::net::TcpListener::bind(addr).await.map_err(|e| { + bind_listener(addr).map_err(|e| { tracing::error!( protocol = %protocol, address = %address, @@ -1132,6 +1140,35 @@ fn get_graceful_shutdown_timeout() -> usize { .unwrap_or(5) } +const DEFAULT_LISTEN_BACKLOG: u32 = 4096; + +// `listen(2)` takes an `int`; anything above `i32::MAX` would go negative. +fn parse_listen_backlog(value: Result) -> u32 { + value + .ok() + .and_then(|s| s.trim().parse::().ok()) + .filter(|n| (1..=i32::MAX as u32).contains(n)) + .unwrap_or(DEFAULT_LISTEN_BACKLOG) +} + +fn listen_backlog() -> u32 { + parse_listen_backlog(std::env::var(env_llm::DYN_HTTP_LISTEN_BACKLOG)) +} + +/// `tokio::net::TcpListener::bind` listens with a backlog of 128. A few thousand +/// clients connecting within seconds overflow that, and overflowed connections +/// are delayed or, depending on host TCP settings, fail. +fn bind_listener(addr: SocketAddr) -> std::io::Result { + let socket = if addr.is_ipv4() { + tokio::net::TcpSocket::new_v4()? + } else { + tokio::net::TcpSocket::new_v6()? + }; + socket.set_reuseaddr(true)?; + socket.bind(addr)?; + socket.listen(listen_backlog()) +} + /// Environment variable to set the metrics endpoint path (default: `/metrics`) static HTTP_SVC_METRICS_PATH_ENV: &str = "DYN_HTTP_SVC_METRICS_PATH"; /// Environment variable to set the models endpoint path (default: `/v1/models`) @@ -2702,6 +2739,41 @@ mod tests { assert_eq!(parse_sse_keep_alive(Ok(u64::MAX.to_string())), expected); } + #[test] + fn test_listen_backlog_env_var() { + assert_eq!( + parse_listen_backlog(Err(std::env::VarError::NotPresent)), + DEFAULT_LISTEN_BACKLOG + ); + assert_eq!( + parse_listen_backlog(Ok("0".to_string())), + DEFAULT_LISTEN_BACKLOG + ); + assert_eq!( + parse_listen_backlog(Ok("invalid".to_string())), + DEFAULT_LISTEN_BACKLOG + ); + assert_eq!( + parse_listen_backlog(Ok((i32::MAX as u32 + 1).to_string())), + DEFAULT_LISTEN_BACKLOG + ); + assert_eq!( + parse_listen_backlog(Ok(i32::MAX.to_string())), + i32::MAX as u32 + ); + assert_eq!(parse_listen_backlog(Ok(" 8192 ".to_string())), 8192); + } + + #[tokio::test] + async fn test_bind_listener_accepts_connections() { + let listener = bind_listener("127.0.0.1:0".parse().unwrap()).unwrap(); + let addr = listener.local_addr().unwrap(); + assert_ne!(addr.port(), 0); + let client = tokio::net::TcpStream::connect(addr).await.unwrap(); + let (_server_side, peer) = listener.accept().await.unwrap(); + assert_eq!(peer, client.local_addr().unwrap()); + } + #[test] fn test_sse_keep_alive_for_deferred_response() { let configured = Duration::from_millis(5000); diff --git a/lib/runtime/src/config/environment_names.rs b/lib/runtime/src/config/environment_names.rs index 54bf191dda91..d890c824584b 100644 --- a/lib/runtime/src/config/environment_names.rs +++ b/lib/runtime/src/config/environment_names.rs @@ -368,6 +368,9 @@ pub mod llm { /// HTTP body size limit in MB pub const DYN_HTTP_BODY_LIMIT_MB: &str = "DYN_HTTP_BODY_LIMIT_MB"; + /// Listen backlog of the frontend HTTP/HTTPS socket (default 4096). + pub const DYN_HTTP_LISTEN_BACKLOG: &str = "DYN_HTTP_LISTEN_BACKLOG"; + pub const DYN_HTTP_GRACEFUL_SHUTDOWN_TIMEOUT_SECS: &str = "DYN_HTTP_GRACEFUL_SHUTDOWN_TIMEOUT_SECS"; @@ -1082,6 +1085,7 @@ mod tests { kvbm::leader::DYN_KVBM_LEADER_ZMQ_ACK_PORT, // LLM llm::DYN_HTTP_BODY_LIMIT_MB, + llm::DYN_HTTP_LISTEN_BACKLOG, llm::DYN_HTTP_GRACEFUL_SHUTDOWN_TIMEOUT_SECS, llm::DYN_HTTP_OVERLOAD_STATUS_CODE, llm::DYN_HTTP_BACKEND_STREAM_TIMEOUT_SECS, From e0c29aedab16a5a948c7b33eb051f1ce4320de8e Mon Sep 17 00:00:00 2001 From: yunzhoul-nv <232973175+yunzhoul-nv@users.noreply.github.com> Date: Mon, 21 Sep 2026 12:02:52 -0700 Subject: [PATCH 139/191] fix(recipes): merge shared DGD environment variables by name (#15064) Signed-off-by: yunzhoul-nv <232973175+yunzhoul-nv@users.noreply.github.com> --- recipes/CONTRIBUTING.md | 64 ++++++- .../dynamo-openapi/dynamo-openapi.json | 13 ++ recipes/templates/kustomize/README.md | 23 ++- .../dynamo-openapi/dynamo-openapi.json | 13 ++ .../dynamo-openapi/kustomization.yaml | 5 +- scripts/generate_kustomize_openapi.py | 21 +++ tests/test_generate_kustomize_openapi.py | 156 ++++++++++++++++++ 7 files changed, 286 insertions(+), 9 deletions(-) diff --git a/recipes/CONTRIBUTING.md b/recipes/CONTRIBUTING.md index 36814e529694..a88d2b5bfd8e 100644 --- a/recipes/CONTRIBUTING.md +++ b/recipes/CONTRIBUTING.md @@ -201,10 +201,11 @@ The render convention is: `unfold` renders each selected source into an ordinary Component under the public overlay's `components/` directory at the selected path. Users never need Jinja to inspect or apply that overlay. -- Legacy strategic-merge bases that patch Dynamo CRDs include the central +- Bases that use strategic merge patches against Dynamo CRDs include the central `recipes/kustomize/components/dynamo-openapi/` Component. Its generated - schema is derived from every operator CRD and lets strategic merge patches - merge CRD map lists such as `env` by name. The beta cluster starter carries + schema is derived from every operator CRD, with an additional Kustomize-only + merge rule for beta DGD `spec.env`. Shared `spec.env` and container `env` + entries merge by `name`. The beta cluster starter carries a generated copy of the same schema so that its strategic merge networking Components and hook patches merge by name; its guarded JSON 6902 Components do not depend on it. @@ -214,6 +215,63 @@ The render convention is: Within the legacy alpha matrix path, prefer resource-shaped Kustomize merge patches where possible. For other Custom Resource Definition (CRD) list fields, include the complete intended list in the merge patch unless the schema supplies an OpenAPI merge key. In the beta cluster starter, use guarded JSON 6902 for the structural Components whose correctness depends on canonical list positions and fail-loud preconditions, and strategic merge patches addressed by name for the networking Components and hook patches. +With the schema loaded, a strategic merge patch adds new environment names, +updates matching entries, and preserves entries omitted from the patch. For a +beta DGD named `example`, the following patch updates an existing `HF_HOME` and +adds `UCX_TLS`, while preserving an existing `MODEL_NAME`: + +```yaml +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: example +spec: + env: + - name: HF_HOME + value: /cluster-cache + - name: UCX_TLS + value: rc_x +``` + +Matching entries merge field by field. When switching from a literal `value` +to `valueFrom`, explicitly remove the old field with `value: null`. Otherwise, +the render retains both fields, and a non-empty `value` conflicts with +`valueFrom`: + +```yaml +apiVersion: nvidia.com/v1beta1 +kind: DynamoGraphDeployment +metadata: + name: example +spec: + env: + - name: HF_HOME + value: null + valueFrom: + configMapKeyRef: + name: cache-config + key: path +``` + +For the reverse transition, set `valueFrom: null` alongside the new `value`. +Both patches preserve unrelated environment entries. These are ordinary +Kustomize patches; the beta cluster starter validator's stricter patch contract +rejects null deletions and `$patch` directives. + +This rule applies during Kustomize rendering. It does not change the operator +CRD or DGDR override semantics, where shared `spec.env` remains an atomic list. +JSON 6902 `add` operations at `/spec/env/-` still append literally and can create +duplicate names. With duplicates present, a later strategic merge patch can +silently ignore the requested update even when Kustomize exits successfully. +For example, with v5.8.1, starting with `UCX_NET_DEVICES: ens2f0`, appending the +same name with `eth0`, then merging `mlx5_0` renders `eth0`. Keep names unique +throughout patch layering; update an existing entry with a strategic merge +patch or a guarded JSON 6902 replacement instead of appending the same name. + +Regenerate both checked-in schema copies with +`python3 scripts/generate_kustomize_openapi.py`; refresh the schema in an older +copied cluster starter to use the shared-env merge rule. + Edit the Kustomize source, not the generated manifests. A recipe matrix is an explicit `.kustomize-matrix.yaml` beside the recipe. It names the Kustomize `source`, a `nameTemplate`, and matrix dimensions. Every dimension value has a diff --git a/recipes/kustomize/components/dynamo-openapi/dynamo-openapi.json b/recipes/kustomize/components/dynamo-openapi/dynamo-openapi.json index f11f380929f5..e39725c8e1e0 100644 --- a/recipes/kustomize/components/dynamo-openapi/dynamo-openapi.json +++ b/recipes/kustomize/components/dynamo-openapi/dynamo-openapi.json @@ -2898,6 +2898,19 @@ "type": "array", "x-kubernetes-patch-merge-key": "name", "x-kubernetes-patch-strategy": "merge" + }, + "env": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" } }, "type": "object" diff --git a/recipes/templates/kustomize/README.md b/recipes/templates/kustomize/README.md index f2293ad645c2..11ba97b6ea53 100644 --- a/recipes/templates/kustomize/README.md +++ b/recipes/templates/kustomize/README.md @@ -47,11 +47,21 @@ positional structure (`cache-binding`, `registry-credentials`, `probes`, `scheduling`, `placement`) use guarded JSON 6902 patches. The networking Components and the case-local hook patches use strategic merge patches that address components, containers, environment entries, and volumes by name. Merge -patches depend on the `components/dynamo-openapi` schema Component, a generated -copy of the Dynamo CRD merge keys that the root Kustomization selects first. +patches depend on the `components/dynamo-openapi` schema Component, which the +root Kustomization selects first. The schema is generated from the Dynamo CRDs +with an additional Kustomize-only merge rule for shared beta DGD `spec.env`. +Both shared and container environment entries merge by `name`: patches add new +names, update matching entries, and preserve unmentioned entries. The +[recipe contribution guide](../../CONTRIBUTING.md#contribute-a-variant) shows a +shared-env patch and explains the boundary with operator-side overrides. +Refresh `components/dynamo-openapi/dynamo-openapi.json` in older private copies +from this starter to pick up the rule. + The validator lowers every merge patch into guarded JSON 6902 operations against the accumulated document, so both styles replay through one contract; merge-patch shape failures use the `merge-patch` diagnostic. +The shared-env schema rule does not expand the starter validator's worker-only +networking contract. ## Install the pinned renderer @@ -500,8 +510,10 @@ review it as a separate compatibility path. ### Duplicate environment append -Kustomize can successfully append a second environment entry with the same -name. In the v5.8.1 verification fixture, a base value of `ens2f0` followed by +JSON 6902 `add` operations at an environment list's `/-` path append literally, +even when the OpenAPI schema is loaded. Unlike strategic merge patches, they +can append a second entry with the same name. In the v5.8.1 verification fixture, +a base value of `ens2f0` followed by the Component value `eth0` rendered this contiguous excerpt: ```yaml @@ -514,6 +526,9 @@ the Component value `eth0` rendered this contiguous excerpt: ``` Kubernetes does not make this a safe override contract. +A later strategic merge patch can silently retain a duplicate's value instead +of the requested update, even when Kustomize exits successfully. Keep +environment names unique before applying subsequent patches. `scripts/validate-recipe-kustomization.py` rejects the duplicate at the layer that appends it. Override a Component-added value with a guarded `test` plus `replace` in the case patch instead of appending the same name again. diff --git a/recipes/templates/kustomize/components/dynamo-openapi/dynamo-openapi.json b/recipes/templates/kustomize/components/dynamo-openapi/dynamo-openapi.json index f11f380929f5..e39725c8e1e0 100644 --- a/recipes/templates/kustomize/components/dynamo-openapi/dynamo-openapi.json +++ b/recipes/templates/kustomize/components/dynamo-openapi/dynamo-openapi.json @@ -2898,6 +2898,19 @@ "type": "array", "x-kubernetes-patch-merge-key": "name", "x-kubernetes-patch-strategy": "merge" + }, + "env": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" } }, "type": "object" diff --git a/recipes/templates/kustomize/components/dynamo-openapi/kustomization.yaml b/recipes/templates/kustomize/components/dynamo-openapi/kustomization.yaml index 8aeb039c0060..6614ac5c519b 100644 --- a/recipes/templates/kustomize/components/dynamo-openapi/kustomization.yaml +++ b/recipes/templates/kustomize/components/dynamo-openapi/kustomization.yaml @@ -17,8 +17,9 @@ apiVersion: kustomize.config.k8s.io/v1alpha1 kind: Component # Strategic merge schema for the Dynamo CRDs. Kustomize needs it to merge -# spec.components, containers, env, volumeMounts, and volumes by key instead of -# replacing those lists. dynamo-openapi.json is generated; regenerate it with +# spec.components, containers, shared spec.env, container env, volumeMounts, +# and volumes by key. Shared beta spec.env has a Kustomize-only merge-by-name +# rule; the operator CRD is unchanged. Regenerate dynamo-openapi.json with # python3 scripts/generate_kustomize_openapi.py from the repository root. openapi: path: dynamo-openapi.json diff --git a/scripts/generate_kustomize_openapi.py b/scripts/generate_kustomize_openapi.py index 1bbd6ec86658..326824103a32 100644 --- a/scripts/generate_kustomize_openapi.py +++ b/scripts/generate_kustomize_openapi.py @@ -92,6 +92,8 @@ def pruned_schema(source: Any) -> dict[str, Any] | None: def crd_definitions(crd_path: Path) -> dict[str, dict[str, Any]]: + """Generate CRD merge definitions, including Kustomize-only overrides.""" + crd = yaml.safe_load(crd_path.read_text(encoding="utf-8")) if not isinstance(crd, dict): raise TypeError(f"{crd_path} must contain one CustomResourceDefinition") @@ -120,6 +122,25 @@ def crd_definitions(crd_path: Path) -> dict[str, dict[str, Any]]: continue spec_schema = pruned_schema(source_schema.get("properties", {}).get("spec")) + if spec_schema is not None and (group, version, kind) == ( + "nvidia.com", + "v1beta1", + "DynamoGraphDeployment", + ): + # Merge shared environment entries by name in Kustomize without + # changing the CRD's server-side apply ownership semantics. + env_schema = source_schema["properties"]["spec"]["properties"].get("env") + if env_schema is None: + raise ValueError( + f"{crd_path}: {group}/{version} {kind} schema is missing spec.env" + ) + spec_schema["properties"]["env"] = pruned_schema( + { + **env_schema, + "x-kubernetes-list-type": "map", + "x-kubernetes-list-map-keys": ["name"], + } + ) definition_name = f"{group}.{version}.{kind}" properties: dict[str, Any] = { "apiVersion": {"type": "string"}, diff --git a/tests/test_generate_kustomize_openapi.py b/tests/test_generate_kustomize_openapi.py index 1311bdca8767..2d5bf1d82cda 100644 --- a/tests/test_generate_kustomize_openapi.py +++ b/tests/test_generate_kustomize_openapi.py @@ -2,6 +2,10 @@ # SPDX-License-Identifier: Apache-2.0 import importlib.util import json +import os +import shutil +import subprocess +import sys from pathlib import Path import pytest @@ -63,3 +67,155 @@ def test_generated_dgd_schema_merges_main_container_env_by_name(): assert env["x-kubernetes-patch-strategy"] == "merge" assert env["x-kubernetes-patch-merge-key"] == "name" + + +def test_generated_beta_dgd_schema_merges_shared_env_by_name(): + generator = load_generator_module() + schema = json.loads(generator.generated_schema()) + dgd = schema["definitions"]["nvidia.com.v1beta1.DynamoGraphDeployment"] + env = dgd["properties"]["spec"]["properties"]["env"] + + assert env["x-kubernetes-patch-strategy"] == "merge" + assert env["x-kubernetes-patch-merge-key"] == "name" + + +def test_missing_beta_shared_env_schema_reports_input_error( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture +): + generator = load_generator_module() + crd = yaml.safe_load( + (generator.CRD_DIR / "nvidia.com_dynamographdeployments.yaml").read_text( + encoding="utf-8" + ) + ) + beta = next( + version for version in crd["spec"]["versions"] if version["name"] == "v1beta1" + ) + del beta["schema"]["openAPIV3Schema"]["properties"]["spec"]["properties"]["env"] + crd_path = tmp_path / "dgd.yaml" + crd_path.write_text(yaml.safe_dump(crd), encoding="utf-8") + monkeypatch.setattr(generator, "CRD_DIR", tmp_path) + monkeypatch.setattr(sys, "argv", [str(SCRIPT_PATH), "--check"]) + + assert generator.main() == 1 + error = capsys.readouterr().err + assert str(crd_path) in error + assert "nvidia.com/v1beta1 DynamoGraphDeployment" in error + assert "spec.env" in error + assert "Traceback" not in error + + +@pytest.mark.timeout(30) +@pytest.mark.parametrize( + "base_env,patch_env,expected_env", + [ + pytest.param( + {"name": "HF_HOME", "value": "/model-cache"}, + {"name": "UCX_TLS", "value": "rc_x"}, + [ + {"name": "MODEL_NAME", "value": "test-model"}, + {"name": "HF_HOME", "value": "/model-cache"}, + {"name": "UCX_TLS", "value": "rc_x"}, + ], + id="add-variable", + ), + pytest.param( + {"name": "HF_HOME", "value": "/model-cache"}, + {"name": "HF_HOME", "value": "/cluster-cache"}, + [ + {"name": "MODEL_NAME", "value": "test-model"}, + {"name": "HF_HOME", "value": "/cluster-cache"}, + ], + id="update-variable", + ), + pytest.param( + {"name": "HF_HOME", "value": "/model-cache"}, + { + "name": "HF_HOME", + "value": None, + "valueFrom": { + "configMapKeyRef": {"name": "cache-config", "key": "path"} + }, + }, + [ + {"name": "MODEL_NAME", "value": "test-model"}, + { + "name": "HF_HOME", + "valueFrom": { + "configMapKeyRef": {"name": "cache-config", "key": "path"} + }, + }, + ], + id="literal-to-value-from", + ), + pytest.param( + { + "name": "HF_HOME", + "valueFrom": { + "configMapKeyRef": {"name": "cache-config", "key": "path"} + }, + }, + {"name": "HF_HOME", "valueFrom": None, "value": "/cluster-cache"}, + [ + {"name": "MODEL_NAME", "value": "test-model"}, + {"name": "HF_HOME", "value": "/cluster-cache"}, + ], + id="value-from-to-literal", + ), + ], +) +def test_generated_beta_dgd_schema_preserves_shared_env( + tmp_path: Path, base_env: dict, patch_env: dict, expected_env: list[dict] +): + """Preserve unrelated variables while merging entries and clearing old sources.""" + executable = os.environ.get("KUSTOMIZE_BIN") or shutil.which("kustomize") + if executable is None: + pytest.skip("kustomize is required for the shared environment merge test") + + generator = load_generator_module() + (tmp_path / "schema.json").write_text( + generator.generated_schema(), encoding="utf-8" + ) + base = { + "apiVersion": "nvidia.com/v1beta1", + "kind": "DynamoGraphDeployment", + "metadata": {"name": "env-merge"}, + "spec": { + "env": [ + {"name": "MODEL_NAME", "value": "test-model"}, + base_env, + ] + }, + } + patch = { + "apiVersion": "nvidia.com/v1beta1", + "kind": "DynamoGraphDeployment", + "metadata": {"name": "env-merge"}, + "spec": {"env": [patch_env]}, + } + kustomization = { + "apiVersion": "kustomize.config.k8s.io/v1beta1", + "kind": "Kustomization", + "resources": ["base.yaml"], + "openapi": {"path": "schema.json"}, + "patches": [{"path": "patch.yaml"}], + } + for name, document in ( + ("base.yaml", base), + ("patch.yaml", patch), + ("kustomization.yaml", kustomization), + ): + (tmp_path / name).write_text(yaml.safe_dump(document), encoding="utf-8") + + result = subprocess.run( + [executable, "build", str(tmp_path)], + capture_output=True, + text=True, + timeout=20, + check=True, + ) + env = yaml.safe_load(result.stdout)["spec"]["env"] + assert {entry["name"]: entry for entry in env} == { + entry["name"]: entry for entry in expected_env + } + assert len(env) == len(expected_env), "shared environment contains duplicate names" From 90a9ab3e6858d86959de58742db98ae1cf4d89b5 Mon Sep 17 00:00:00 2001 From: bzsuni <86399306+bzsuni@users.noreply.github.com> Date: Tue, 22 Sep 2026 03:29:15 +0800 Subject: [PATCH 140/191] fix(runtime): scope endpoint routing and cleanup by full identity (#14723) Signed-off-by: bzsuni --- lib/runtime/src/component/endpoint.rs | 21 +- .../pipeline/network/ingress/nats_server.rs | 43 +++- .../network/ingress/shared_tcp_endpoint.rs | 207 +++++++++++++----- .../network/ingress/unified_server.rs | 90 ++++++-- lib/runtime/src/transports/tcp.rs | 12 + 5 files changed, 290 insertions(+), 83 deletions(-) diff --git a/lib/runtime/src/component/endpoint.rs b/lib/runtime/src/component/endpoint.rs index 1997b6a05035..9c6e618b97d4 100644 --- a/lib/runtime/src/component/endpoint.rs +++ b/lib/runtime/src/component/endpoint.rs @@ -18,7 +18,7 @@ use crate::{ }, protocols::EndpointId, traits::DistributedRuntimeProvider, - transports::nats, + transports::{nats, tcp}, }; fn endpoint_device_type() -> Option { @@ -253,7 +253,7 @@ impl EndpointConfigBuilder { "Unable to register service for discovery" ); let _ = server - .unregister_endpoint(&endpoint_name_for_task, connection_id) + .unregister_endpoint_instance(&endpoint_id, connection_id) .await; if let Some(tracker) = tracker_clone { tracker.unregister_endpoint(); @@ -287,7 +287,7 @@ impl EndpointConfigBuilder { ); if let Err(e) = server_for_cleanup - .unregister_endpoint(&endpoint_name_for_cleanup, connection_id) + .unregister_endpoint_instance(&endpoint_id, connection_id) .await { tracing::warn!( @@ -317,7 +317,7 @@ impl EndpointConfigBuilder { /// /// This function handles both health check and discovery transport building. /// All transport modes use consistent addressing: -/// - TCP: Includes instance_id and endpoint name for routing (e.g., host:port/instance_id_hex/endpoint_name) +/// - TCP: Includes instance ID, namespace, component, and endpoint name in the request path /// - NATS: Uses subject-based addressing (unique per endpoint) /// /// # Errors @@ -344,7 +344,11 @@ fn tcp_transport_type( endpoint_id: &EndpointId, connection_id: u64, ) -> TransportType { - TransportType::Tcp(format!("{address}/{connection_id:x}/{}", endpoint_id.name)) + // Clients forward the discovered path unchanged; ingress uses the same key. + TransportType::Tcp(format!( + "{address}/{}", + tcp::instance_path(endpoint_id, connection_id) + )) } /// Build transport type, ensuring TCP server is initialized when needed. @@ -468,8 +472,11 @@ mod tests { }; for (address, expected) in [ - ("192.0.2.10:1234", "192.0.2.10:1234/2a/generate"), - ("[2001:db8::10]:1234", "[2001:db8::10]:1234/2a/generate"), + ("192.0.2.10:1234", "192.0.2.10:1234/2a/ns/worker/generate"), + ( + "[2001:db8::10]:1234", + "[2001:db8::10]:1234/2a/ns/worker/generate", + ), ] { let transport = tcp_transport_type(address.parse().unwrap(), &endpoint_id, 0x2a); assert_eq!(transport.address(), expected); diff --git a/lib/runtime/src/pipeline/network/ingress/nats_server.rs b/lib/runtime/src/pipeline/network/ingress/nats_server.rs index 55143f7691bd..cc56d8e3320f 100644 --- a/lib/runtime/src/pipeline/network/ingress/nats_server.rs +++ b/lib/runtime/src/pipeline/network/ingress/nats_server.rs @@ -8,9 +8,9 @@ //! a unified multiplexed approach consistent with TCP server. use super::*; -use crate::SystemHealth; use crate::config::HealthStatus; use crate::pipeline::network::ingress::push_endpoint::PushEndpoint; +use crate::{SystemHealth, protocols::EndpointId}; use anyhow::Result; use async_trait::async_trait; use dashmap::DashMap; @@ -26,7 +26,7 @@ use tokio_util::sync::CancellationToken; pub struct NatsMultiplexedServer { nats_client: async_nats::Client, component_registry: crate::component::Registry, - handlers: Arc>, + handlers: Arc>, cancellation_token: CancellationToken, } @@ -35,9 +35,7 @@ struct EndpointTask { join_handle: tokio::task::JoinHandle<()>, } -/// NATS subject and handler-map key for one endpoint instance. Several instances in one -/// process can register the same endpoint name, so the key must carry the instance id; -/// register and unregister must agree on it or a teardown removes the wrong task, or none. +/// Subject suffix within a NATS service group; the group supplies the namespace and component. fn instance_subject(endpoint_name: &str, instance_id: u64) -> String { format!("{endpoint_name}-{instance_id:x}") } @@ -106,6 +104,11 @@ impl super::unified_server::RequestPlaneServer for NatsMultiplexedServer { tracing::info!("Successfully retrieved service group"); let endpoint_with_id = instance_subject(&endpoint_name, instance_id); + let endpoint_id = EndpointId { + namespace: namespace.clone(), + component: component_name.clone(), + name: endpoint_name.clone(), + }; // Create NATS service endpoint with the full subject let service_endpoint = service_group @@ -181,7 +184,7 @@ impl super::unified_server::RequestPlaneServer for NatsMultiplexedServer { // Store task info for later cleanup self.handlers.insert( - endpoint_with_id, + (endpoint_id, instance_id), EndpointTask { cancel_token: endpoint_cancel, join_handle, @@ -192,8 +195,32 @@ impl super::unified_server::RequestPlaneServer for NatsMultiplexedServer { } async fn unregister_endpoint(&self, endpoint_name: &str, instance_id: u64) -> Result<()> { + let endpoint_id = { + let mut matches = self.handlers.iter().filter(|entry| { + entry.key().0.name == endpoint_name && entry.key().1 == instance_id + }); + let endpoint_id = matches.next().map(|entry| entry.key().0.clone()); + anyhow::ensure!( + matches.next().is_none(), + "Ambiguous endpoint {endpoint_name}/{instance_id:x}; use unregister_endpoint_instance" + ); + endpoint_id + }; + if let Some(endpoint_id) = endpoint_id { + self.unregister_endpoint_instance(&endpoint_id, instance_id) + .await?; + } + Ok(()) + } + + async fn unregister_endpoint_instance( + &self, + endpoint_id: &EndpointId, + instance_id: u64, + ) -> Result<()> { + let endpoint_name = &endpoint_id.name; let endpoint_with_id = instance_subject(endpoint_name, instance_id); - if let Some((_, task)) = self.handlers.remove(&endpoint_with_id) { + if let Some((_, task)) = self.handlers.remove(&(endpoint_id.clone(), instance_id)) { tracing::info!( endpoint_name = %endpoint_name, endpoint_with_id = %endpoint_with_id, @@ -249,7 +276,7 @@ mod tests { assert_ne!( instance_subject("generate", 0xa), instance_subject("generate", 0xb), - "two instances of one endpoint name must not share a handler-map key" + "two instances of one endpoint name must not share a subject suffix" ); } } diff --git a/lib/runtime/src/pipeline/network/ingress/shared_tcp_endpoint.rs b/lib/runtime/src/pipeline/network/ingress/shared_tcp_endpoint.rs index 6a0e25329ebf..0f769dcf52b1 100644 --- a/lib/runtime/src/pipeline/network/ingress/shared_tcp_endpoint.rs +++ b/lib/runtime/src/pipeline/network/ingress/shared_tcp_endpoint.rs @@ -13,6 +13,7 @@ use crate::metrics::work_handler_pool::{ WORK_HANDLER_QUEUE_DEPTH, }; use crate::pipeline::network::PushWorkHandler; +use crate::{protocols::EndpointId, transports::tcp::instance_path}; use anyhow::{Context, Result}; use bytes::Bytes; use dashmap::DashMap; @@ -89,13 +90,6 @@ struct WorkItem { endpoint_name: String, } -/// Handler-map key and request path for one endpoint instance. Several instances in one process -/// share this server, so the key must carry the instance id; register and unregister must agree on -/// the format or a teardown removes the wrong handler, or none. -fn instance_path(endpoint_name: &str, instance_id: u64) -> String { - format!("{instance_id:x}/{endpoint_name}") -} - /// Shared TCP server that handles multiple endpoints on a single port pub struct SharedTcpServer { handlers: Arc>>, @@ -744,8 +738,13 @@ impl super::unified_server::RequestPlaneServer for SharedTcpServer { component_name: String, system_health: Arc>, ) -> Result<()> { + let endpoint_id = EndpointId { + namespace: namespace.clone(), + component: component_name.clone(), + name: endpoint_name.clone(), + }; self.register_endpoint( - instance_path(&endpoint_name, instance_id), + instance_path(&endpoint_id, instance_id), service_handler, instance_id, namespace, @@ -757,8 +756,30 @@ impl super::unified_server::RequestPlaneServer for SharedTcpServer { } async fn unregister_endpoint(&self, endpoint_name: &str, instance_id: u64) -> Result<()> { - // Other instances in this process may serve the same endpoint name; remove only ours. - self.remove_handler(&instance_path(endpoint_name, instance_id), endpoint_name) + let path = { + let mut matches = self.handlers.iter().filter(|entry| { + entry.value().endpoint_name == endpoint_name + && entry.value().instance_id == instance_id + }); + let path = matches.next().map(|entry| entry.key().clone()); + anyhow::ensure!( + matches.next().is_none(), + "Ambiguous endpoint {endpoint_name}/{instance_id:x}; use unregister_endpoint_instance" + ); + path + }; + if let Some(path) = path { + self.remove_handler(&path, endpoint_name).await; + } + Ok(()) + } + + async fn unregister_endpoint_instance( + &self, + endpoint_id: &EndpointId, + instance_id: u64, + ) -> Result<()> { + self.remove_handler(&instance_path(endpoint_id, instance_id), &endpoint_id.name) .await; Ok(()) } @@ -1003,70 +1024,146 @@ mod tests { tracing::info!("Test passed: unregister_endpoint properly waited for inflight TCP request"); } - async fn send_ack(client: &TcpRequestClient, addr: SocketAddr, path: &str) -> Bytes { + async fn send_ack(client: &TcpRequestClient, address: &str) -> Bytes { tokio::time::timeout( Duration::from_secs(5), client.send_request( - format!("{addr}/{path}"), + address.to_string(), Bytes::from_static(b"payload"), Headers::new(), ), ) .await - .unwrap_or_else(|_| panic!("no ACK within 5s for {path}")) + .unwrap_or_else(|_| panic!("no ACK within 5s for {address}")) .expect("request-plane send should succeed") } #[tokio::test] - async fn unregister_endpoint_removes_only_the_callers_instance() { - crate::logging::init(); + async fn unregister_endpoint_removes_only_the_matching_endpoint_instance() { + let endpoint = EndpointId { + namespace: "test_namespace".into(), + component: "test_component".into(), + name: "generate".into(), + }; + let survivors = [ + (endpoint.clone(), 0xb), + ( + EndpointId { + namespace: "other_namespace".into(), + ..endpoint.clone() + }, + 0xa, + ), + ( + EndpointId { + component: "other_component".into(), + ..endpoint.clone() + }, + 0xa, + ), + ]; - let cancellation_token = CancellationToken::new(); - let server = - SharedTcpServer::new("127.0.0.1:0".parse().unwrap(), cancellation_token.clone()) + let id = |namespace: &str, component: &str, name: &str| EndpointId { + namespace: namespace.into(), + component: component.into(), + name: name.into(), + }; + let cases = survivors + .into_iter() + .map(|(survivor, instance_id)| (endpoint.clone(), survivor, instance_id)) + .chain([ + (id("a/b", "c", "d"), id("a", "b/c", "d"), 0xa), + (id("a", "b/c", "d"), id("a", "b", "c/d"), 0xa), + (id("a/b", "c", "d"), id("a%2Fb", "c", "d"), 0xa), + ]); + + for (endpoint, survivor_endpoint, survivor_id) in cases { + let cancel = CancellationToken::new(); + let server = + SharedTcpServer::new("127.0.0.1:0".parse().unwrap(), cancel.clone()).unwrap(); + let addr = server.clone().bind_and_start().await.unwrap(); + let plane: &dyn RequestPlaneServer = server.as_ref(); + let removed = Arc::new(SlowMockHandler::new(Duration::ZERO)); + let survivor = Arc::new(SlowMockHandler::new(Duration::ZERO)); + for (id, instance_id, handler) in [ + (&endpoint, 0xa, removed.clone()), + (&survivor_endpoint, survivor_id, survivor.clone()), + ] { + plane + .register_endpoint( + id.name.clone(), + handler, + instance_id, + id.namespace.clone(), + id.component.clone(), + ready_system_health(), + ) + .await + .unwrap(); + } + + if survivor_id == 0xa && survivor_endpoint.name == endpoint.name { + assert!( + plane + .unregister_endpoint(&endpoint.name, 0xa) + .await + .is_err() + ); + } + + // The second registration must not redirect requests for the first. + let client = TcpRequestClient::new().unwrap(); + let removed_address = format!("{addr}/{}", instance_path(&endpoint, 0xa)); + assert!(send_ack(&client, &removed_address).await.is_empty()); + let delivered_to_removed = tokio::time::timeout(Duration::from_secs(5), async { + tokio::select! { + _ = removed.request_started.notified() => true, + _ = survivor.request_started.notified() => false, + } + }) + .await + .expect("a registered handler should receive the request"); + assert!( + delivered_to_removed, + "request redirected to {survivor_endpoint:?}/{survivor_id:x}" + ); + + // Removing one registration must preserve every distinct endpoint instance. + plane + .unregister_endpoint_instance(&endpoint, 0xa) + .await .unwrap(); - let addr = server.clone().bind_and_start().await.unwrap(); + let address = format!("{addr}/{}", instance_path(&survivor_endpoint, survivor_id)); + let ack = send_ack(&client, &address).await; + assert!( + ack.is_empty(), + "survivor {survivor_endpoint:?}/{survivor_id:x} rejected: {ack:?}" + ); + tokio::time::timeout(Duration::from_secs(5), survivor.request_started.notified()) + .await + .expect("surviving handler should receive the request"); - let system_health = ready_system_health(); - let plane: &dyn RequestPlaneServer = server.as_ref(); - let removed = Arc::new(SlowMockHandler::new(Duration::ZERO)); - let survivor = Arc::new(SlowMockHandler::new(Duration::ZERO)); - for (instance_id, handler) in [(0xa_u64, removed), (0xb_u64, survivor.clone())] { + let ack = send_ack(&client, &removed_address).await; + assert!( + ack.starts_with(crate::pipeline::network::ACK_UNAVAILABLE_PREFIX.as_bytes()), + "removed endpoint must reject new requests: {ack:?}" + ); + // With one match left, the original API must still remove that registration. plane - .register_endpoint( - "generate".to_string(), - handler as Arc, - instance_id, - "test_namespace".to_string(), - "test_component".to_string(), - system_health.clone(), - ) + .unregister_endpoint(&survivor_endpoint.name, survivor_id) .await .unwrap(); + assert!( + send_ack(&client, &address) + .await + .starts_with(crate::pipeline::network::ACK_UNAVAILABLE_PREFIX.as_bytes()) + ); + plane + .unregister_endpoint(&survivor_endpoint.name, survivor_id) + .await + .unwrap(); + cancel.cancel(); } - - plane.unregister_endpoint("generate", 0xa).await.unwrap(); - - let client = TcpRequestClient::new().unwrap(); - - let ack = send_ack(&client, addr, "b/generate").await; - assert!( - ack.is_empty(), - "surviving instance should return the success ACK, got {:?}", - String::from_utf8_lossy(&ack) - ); - tokio::time::timeout(Duration::from_secs(5), survivor.request_started.notified()) - .await - .expect("surviving instance's handler should still receive requests"); - - let ack = send_ack(&client, addr, "a/generate").await; - assert!( - ack.starts_with(crate::pipeline::network::ACK_UNAVAILABLE_PREFIX.as_bytes()), - "removed instance should be rejected on the ACK, got {:?}", - String::from_utf8_lossy(&ack) - ); - - cancellation_token.cancel(); } ///////////////////// TESTS FOR CONCURRENCY BOUNDING ///////////////////// diff --git a/lib/runtime/src/pipeline/network/ingress/unified_server.rs b/lib/runtime/src/pipeline/network/ingress/unified_server.rs index 15a506b68a7b..cb23317ad299 100644 --- a/lib/runtime/src/pipeline/network/ingress/unified_server.rs +++ b/lib/runtime/src/pipeline/network/ingress/unified_server.rs @@ -8,7 +8,7 @@ //! a consistent interface for endpoint registration and management. use super::*; -use crate::SystemHealth; +use crate::{SystemHealth, protocols::EndpointId}; use anyhow::Result; use async_trait::async_trait; use parking_lot::Mutex; @@ -72,21 +72,27 @@ pub trait RequestPlaneServer: Send + Sync { system_health: Arc>, ) -> Result<()>; - /// Unregister an endpoint from the server + /// Unregister an endpoint by name and instance ID. /// - /// # Arguments - /// - /// * `endpoint_name` - Name of the endpoint to unregister - /// * `instance_id` - Instance identifier the endpoint was registered with. Several - /// instances in one process can register the same `endpoint_name` on a shared server, - /// so the pair identifies exactly one registration. - /// - /// # Returns - /// - /// Returns `Ok(())` if unregistration succeeds or endpoint doesn't exist. - /// Errors are only returned for transport-specific failures. + /// Built-in servers return an error without removing a handler if multiple namespaces + /// or components match. Use [`Self::unregister_endpoint_instance`] to disambiguate. + /// An endpoint that is not registered is a no-op. async fn unregister_endpoint(&self, endpoint_name: &str, instance_id: u64) -> Result<()>; + /// Unregister the handler with the namespace, component, name, and instance ID + /// used at registration. An endpoint that is not registered is a no-op. + /// + /// The default delegates to the name-based method for existing implementations. + /// Servers supporting same-named endpoints across components should override it. + async fn unregister_endpoint_instance( + &self, + endpoint_id: &EndpointId, + instance_id: u64, + ) -> Result<()> { + self.unregister_endpoint(&endpoint_id.name, instance_id) + .await + } + /// Get server bind address or identifier /// /// Returns a transport-specific address string: @@ -118,3 +124,61 @@ pub trait RequestPlaneServer: Send + Sync { /// - Server encountered a fatal error fn is_healthy(&self) -> bool; } + +#[cfg(test)] +mod tests { + use super::*; + + #[derive(Default)] + struct LegacyServer { + removed: Mutex>, + } + + #[async_trait] + impl RequestPlaneServer for LegacyServer { + async fn register_endpoint( + &self, + _: String, + _: Arc, + _: u64, + _: String, + _: String, + _: Arc>, + ) -> Result<()> { + unreachable!() + } + + async fn unregister_endpoint(&self, endpoint_name: &str, instance_id: u64) -> Result<()> { + *self.removed.lock() = Some((endpoint_name.to_string(), instance_id)); + Ok(()) + } + + fn address(&self) -> String { + unreachable!() + } + + fn transport_name(&self) -> &'static str { + unreachable!() + } + + fn is_healthy(&self) -> bool { + unreachable!() + } + } + + #[tokio::test] + async fn full_identity_cleanup_delegates_for_legacy_implementations() { + let server = LegacyServer::default(); + let endpoint_id = EndpointId { + namespace: "test_namespace".into(), + component: "test_component".into(), + name: "generate".into(), + }; + let plane: &dyn RequestPlaneServer = &server; + plane + .unregister_endpoint_instance(&endpoint_id, 0xa) + .await + .unwrap(); + assert_eq!(*server.removed.lock(), Some(("generate".into(), 0xa))); + } +} diff --git a/lib/runtime/src/transports/tcp.rs b/lib/runtime/src/transports/tcp.rs index d35c8126579d..55a8ee5a0ea7 100644 --- a/lib/runtime/src/transports/tcp.rs +++ b/lib/runtime/src/transports/tcp.rs @@ -2,3 +2,15 @@ // SPDX-License-Identifier: Apache-2.0 pub use crate::pipeline::network::tcp::{client, server}; + +/// Opaque TCP request path for an endpoint instance, shared by discovery and ingress. +/// Escape separators and literal percent signs so field boundaries remain unambiguous. +pub(crate) fn instance_path(endpoint: &crate::protocols::EndpointId, instance_id: u64) -> String { + let escape = |field: &str| field.replace('%', "%25").replace('/', "%2F"); + format!( + "{instance_id:x}/{}/{}/{}", + escape(&endpoint.namespace), + escape(&endpoint.component), + escape(&endpoint.name), + ) +} From d2b021f112a9d5f5d9269ae1b7a7ffac30cb1c53 Mon Sep 17 00:00:00 2001 From: Yuewei Na <248773860+nv-yna@users.noreply.github.com> Date: Mon, 21 Sep 2026 13:25:12 -0700 Subject: [PATCH 141/191] feat(tokenspeed): support disaggregation with native KV routing (#9237) Signed-off-by: Yuewei Na Co-authored-by: Yuewei Na --- components/src/dynamo/tokenspeed/args.py | 16 +- components/src/dynamo/tokenspeed/disagg.py | 144 +++++ components/src/dynamo/tokenspeed/kv_events.py | 51 ++ .../src/dynamo/tokenspeed/llm_engine.py | 122 +++- .../tests/test_tokenspeed_disagg.py | 561 ++++++++++++++++++ .../tests/test_tokenspeed_llm_engine.py | 64 ++ 6 files changed, 949 insertions(+), 9 deletions(-) create mode 100644 components/src/dynamo/tokenspeed/disagg.py create mode 100644 components/src/dynamo/tokenspeed/kv_events.py create mode 100644 components/src/dynamo/tokenspeed/tests/test_tokenspeed_disagg.py diff --git a/components/src/dynamo/tokenspeed/args.py b/components/src/dynamo/tokenspeed/args.py index c499f45d1d50..5a9405d32c74 100644 --- a/components/src/dynamo/tokenspeed/args.py +++ b/components/src/dynamo/tokenspeed/args.py @@ -17,7 +17,12 @@ DynamoRuntimeArgGroup, DynamoRuntimeConfig, ) +from dynamo.common.constants import DisaggregationMode from dynamo.common.utils.runtime import parse_endpoint +from dynamo.tokenspeed.disagg import ( + resolve_disaggregation_mode, + validate_disagg_compatibility, +) DEFAULT_ENDPOINT_COMPONENT = "backend" DEFAULT_ENDPOINT_NAME = "generate" @@ -25,6 +30,7 @@ class Config(DynamoRuntimeConfig): component: str + disaggregation_mode: DisaggregationMode = DisaggregationMode.AGGREGATED use_kv_events: bool = False model: str @@ -33,7 +39,8 @@ class Config(DynamoRuntimeConfig): def validate(self) -> None: DynamoRuntimeConfig.validate(self) - self.use_kv_events = False + self.disaggregation_mode = resolve_disaggregation_mode(self.server_args) + validate_disagg_compatibility(self.disaggregation_mode, self.server_args) @register_encoder(Config) @@ -95,9 +102,14 @@ def parse_args(argv: Optional[Sequence[str]] = None) -> Config: else: config.custom_jinja_template = None + component = ( + "prefill" + if config.disaggregation_mode == DisaggregationMode.PREFILL + else DEFAULT_ENDPOINT_COMPONENT + ) endpoint = ( config.endpoint - or f"dyn://{config.namespace}.{DEFAULT_ENDPOINT_COMPONENT}.{DEFAULT_ENDPOINT_NAME}" + or f"dyn://{config.namespace}.{component}.{DEFAULT_ENDPOINT_NAME}" ) parsed_namespace, parsed_component_name, parsed_endpoint_name = parse_endpoint( endpoint diff --git a/components/src/dynamo/tokenspeed/disagg.py b/components/src/dynamo/tokenspeed/disagg.py new file mode 100644 index 000000000000..b171e372bb0e --- /dev/null +++ b/components/src/dynamo/tokenspeed/disagg.py @@ -0,0 +1,144 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""TokenSpeed's Mooncake bootstrap protocol for Dynamo P/D workers.""" + +from __future__ import annotations + +import ipaddress +import os +import secrets +import socket +from typing import Any + +from dynamo.common.constants import DisaggregationMode +from dynamo.llm.exceptions import InvalidArgument + +BOOTSTRAP_HOST_ENV = "DYN_TOKENSPEED_BOOTSTRAP_HOST" + + +def resolve_disaggregation_mode(server_args: Any) -> DisaggregationMode: + value = getattr(server_args, "disaggregation_mode", None) + if value in (None, "null", "aggregated"): + return DisaggregationMode.AGGREGATED + if value not in ("prefill", "decode"): + raise ValueError(f"Unsupported TokenSpeed disaggregation mode: {value!r}") + return DisaggregationMode(value) + + +def attention_dp_size(server_args: Any) -> int: + mapping = getattr(server_args, "mapping", None) + attention = getattr(mapping, "attn", None) + return int( + getattr(attention, "dp_size", None) + or getattr(server_args, "data_parallel_size", None) + or getattr(server_args, "dp_size", None) + or 1 + ) + + +def cache_block_size(server_args: Any) -> int | None: + # TokenSpeed renamed block_size to prefix_granularity when physical pages + # and reusable-prefix identity became separate concepts. Router blocks track + # the prefix identity carried by KV events, not physical allocation pages. + value = getattr(server_args, "prefix_granularity", None) + if value is None: + value = getattr(server_args, "block_size", None) + return int(value) if value is not None else None + + +def validate_disagg_compatibility(mode: DisaggregationMode, server_args: Any) -> None: + if mode == DisaggregationMode.AGGREGATED: + return + if ( + getattr(server_args, "disaggregation_transfer_backend", "mooncake") + != "mooncake" + ): + raise ValueError("Dynamo TokenSpeed disaggregation requires Mooncake") + if attention_dp_size(server_args) != 1: + # TokenSpeed assigns P/D requests by bootstrap_room modulo DP size. + # Dynamo's selected cache-owning DP rank must not be silently ignored. + raise ValueError( + "Dynamo TokenSpeed disaggregation requires attention DP=1; " + "use independent workers for multiple prefill/decode replicas" + ) + if (cache_block_size(server_args) or 0) <= 0: + raise ValueError( + "TokenSpeed disaggregation requires a positive --prefix-granularity (--block-size)" + ) + + +def runtime_disaggregated_endpoint(server_args: Any) -> tuple[str, int]: + """Advertise a peer-reachable host; the environment opts into single-host use.""" + port = getattr(server_args, "disaggregation_bootstrap_port", None) + if port is None or not 0 < int(port) < 65536: + raise ValueError("TokenSpeed prefill requires a valid bootstrap port") + explicit_host = os.environ.get(BOOTSTRAP_HOST_ENV) + host = explicit_host or getattr(server_args, "host", None) + try: + address = ipaddress.ip_address(host.strip("[]")) if host else None + except ValueError: + address = None # Hostnames are valid advertised addresses too. + if ( + not host + or (address is not None and address.is_unspecified) + or ( + not explicit_host + and ((address is not None and address.is_loopback) or host == "localhost") + ) + ): + # ServerArgs.host defaults to loopback. Mooncake's bootstrap server + # binds all interfaces, so derive the advertisement independently. + try: + host = socket.gethostbyname(socket.gethostname()) + except socket.gaierror as exc: + raise ValueError( + f"Cannot determine TokenSpeed bootstrap host; set {BOOTSTRAP_HOST_ENV} " + "to an address reachable by decode workers" + ) from exc + address = ipaddress.ip_address(host) + if address.is_loopback or address.is_unspecified: + raise ValueError( + "TokenSpeed bootstrap host resolves to a local-only address; " + f"set {BOOTSTRAP_HOST_ENV} to an address reachable by decode workers" + ) + return str(host), int(port) + + +def bootstrap_kwargs( + request: dict[str, Any], + mode: DisaggregationMode, + prefill_endpoint: tuple[str, int] | None = None, +) -> dict[str, Any]: + """Validate the handoff, creating a room for synchronous prefill if needed.""" + if mode == DisaggregationMode.AGGREGATED: + return {} + info = request.get("bootstrap_info") + if info is None and mode == DisaggregationMode.PREFILL and prefill_endpoint: + prefill_host, prefill_port = prefill_endpoint + info = { + "bootstrap_host": prefill_host, + "bootstrap_port": prefill_port, + # Match the router's signed-64-bit room range and attention DP=1. + "bootstrap_room": secrets.randbits(63), + } + if not isinstance(info, dict): + raise InvalidArgument( + f"TokenSpeed {mode.value} worker requires bootstrap_info from " + "Dynamo's prefill router" + ) + host, port, room = ( + info.get(f"bootstrap_{key}") for key in ("host", "port", "room") + ) + if ( + not isinstance(host, str) + or not host + or isinstance(port, bool) + or not isinstance(port, int) + or not 0 < port < 65536 + or isinstance(room, bool) + or not isinstance(room, int) + or not 0 <= room < 2**64 + ): + raise InvalidArgument("Invalid TokenSpeed bootstrap host, port, or room") + return {"bootstrap_host": host, "bootstrap_port": port, "bootstrap_room": room} diff --git a/components/src/dynamo/tokenspeed/kv_events.py b/components/src/dynamo/tokenspeed/kv_events.py new file mode 100644 index 000000000000..fead11d2314b --- /dev/null +++ b/components/src/dynamo/tokenspeed/kv_events.py @@ -0,0 +1,51 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Describe TokenSpeed's native KV event stream to the common Worker.""" + +from __future__ import annotations + +import json +from typing import Any + +from dynamo.common.backend.publisher import ZmqSource + + +def kv_events_config_dict(raw: Any) -> dict[str, Any]: + if raw is None or raw == "": + return {} + config = json.loads(raw) if isinstance(raw, str) else raw + if not isinstance(config, dict): + raise ValueError("TokenSpeed --kv-events-config must be a JSON object") + return dict(config) + + +def kv_events_enabled(config: dict[str, Any]) -> bool: + enabled = config.get("enable_kv_cache_events", False) + if not isinstance(enabled, bool): + raise ValueError("TokenSpeed enable_kv_cache_events must be a JSON boolean") + return enabled and config.get("publisher", "zmq") != "null" + + +def kv_event_source(config: dict[str, Any]) -> ZmqSource: + if config.get("replay_endpoint") is not None: + raise ValueError( + "Dynamo TokenSpeed KV events do not support replay_endpoint; " + "remove it from --kv-events-config" + ) + if (config.get("publisher") or "zmq") != "zmq": + raise ValueError("Dynamo TokenSpeed KV events require the zmq publisher") + endpoint = config["endpoint"] + if not isinstance(endpoint, str): + raise ValueError("TokenSpeed KV event endpoint must be a string") + # TokenSpeed binds wildcard TCP endpoints and IPC endpoints. Other TCP + # addresses make its publisher connect, which cannot pair with Worker's SUB. + if endpoint.startswith("tcp://*:"): + endpoint = endpoint.replace("tcp://*:", "tcp://127.0.0.1:", 1) + elif endpoint.startswith("tcp://[::]:"): + endpoint = endpoint.replace("tcp://[::]:", "tcp://[::1]:", 1) + elif not endpoint.startswith("ipc://"): + raise ValueError( + "TokenSpeed KV events require a binding endpoint: ipc://... or tcp://*:PORT" + ) + return ZmqSource(endpoint=endpoint, topic=config.get("topic", ""), dp_rank=0) diff --git a/components/src/dynamo/tokenspeed/llm_engine.py b/components/src/dynamo/tokenspeed/llm_engine.py index 2a9f74aa773d..837e0cc4d59f 100644 --- a/components/src/dynamo/tokenspeed/llm_engine.py +++ b/components/src/dynamo/tokenspeed/llm_engine.py @@ -9,6 +9,7 @@ import json import logging import re +import tempfile from collections.abc import AsyncGenerator from typing import Any @@ -20,12 +21,27 @@ LLMEngine, LlmRegistration, ) +from dynamo.common.backend.publisher import KvEventSource, ZmqSource from dynamo.common.backend.worker import WorkerConfig +from dynamo.common.constants import DisaggregationMode from dynamo.common.utils.engine_response import normalize_finish_reason from dynamo.common.utils.structural_tag import serialize_structural_tag from dynamo.llm import ModelInput from dynamo.llm.exceptions import InvalidArgument from dynamo.tokenspeed.args import parse_args +from dynamo.tokenspeed.disagg import ( + attention_dp_size, + bootstrap_kwargs, + cache_block_size, + resolve_disaggregation_mode, + runtime_disaggregated_endpoint, + validate_disagg_compatibility, +) +from dynamo.tokenspeed.kv_events import ( + kv_event_source, + kv_events_config_dict, + kv_events_enabled, +) logger = logging.getLogger(__name__) @@ -33,9 +49,14 @@ class TokenspeedLLMEngine(LLMEngine): def __init__(self, server_args: Any): self.server_args = server_args + self.disaggregation_mode = resolve_disaggregation_mode(server_args) + self._bootstrap_endpoint: tuple[str, int] | None = None + self._kv_source: ZmqSource | None = None + self._kv_event_dir: tempfile.TemporaryDirectory | None = None self.engine = None self._model_max_len: int | None = None self._active_rids_by_context: dict[str, list[str]] = {} + self._cancelled_contexts: set[str] = set() @classmethod async def from_args( @@ -52,7 +73,13 @@ async def from_args( return engine, worker_config async def start(self, worker_id: int) -> EngineConfig: - del worker_id # tokenspeed has no cluster-wide ID needs + del worker_id + validate_disagg_compatibility(self.disaggregation_mode, self.server_args) + bootstrap_host, bootstrap_port = None, None + if self.disaggregation_mode == DisaggregationMode.PREFILL: + self._bootstrap_endpoint = runtime_disaggregated_endpoint(self.server_args) + bootstrap_host, bootstrap_port = self._bootstrap_endpoint + self._configure_kv_events() # The Dynamo response layer expects per-chunk token deltas. self.server_args.stream_output = True self.engine = _tokenspeed_engine_cls()(server_args=self.server_args) @@ -66,7 +93,7 @@ async def start(self, worker_id: int) -> EngineConfig: or getattr(self.server_args, "max_model_len", None) ) - block_size = _optional_int(getattr(self.server_args, "block_size", None)) + block_size = cache_block_size(self.server_args) max_total_tokens = _optional_int( scheduler_info.get("max_total_num_tokens") or getattr(self.server_args, "max_total_tokens", None) @@ -88,6 +115,8 @@ async def start(self, worker_id: int) -> EngineConfig: served_model_name=self.server_args.served_model_name, llm=LlmRegistration( context_length=self._model_max_len, + bootstrap_host=bootstrap_host, + bootstrap_port=bootstrap_port, kv_cache_block_size=block_size, total_kv_blocks=total_kv_blocks, max_num_seqs=_optional_int( @@ -98,18 +127,62 @@ async def start(self, worker_id: int) -> EngineConfig: ), ) + def _configure_kv_events(self) -> None: + config = kv_events_config_dict( + getattr(self.server_args, "kv_events_config", None) + ) + if not kv_events_enabled(config): + return + if not getattr(self.server_args, "enable_prefix_caching", True): + # Native publisher construction is independent of prefix caching. + config["enable_kv_cache_events"] = False + config["publisher"] = "null" + self.server_args.kv_events_config = json.dumps(config) + logger.warning( + "TokenSpeed KV events were requested but enable_prefix_caching=False " + "(--disable-prefix-caching); no KV events will be published" + ) + return + if attention_dp_size(self.server_args) != 1: + raise ValueError( + "TokenSpeed KV-aware routing currently requires attention DP=1; " + "use independent worker replicas" + ) + if (cache_block_size(self.server_args) or 0) <= 0: + raise ValueError( + "TokenSpeed KV events require a positive --prefix-granularity (--block-size)" + ) + if not config.get("endpoint"): + self._kv_event_dir = tempfile.TemporaryDirectory( + prefix="dynamo-tokenspeed-" + ) + config["endpoint"] = f"ipc://{self._kv_event_dir.name}/kv-events" + self._kv_source = kv_event_source(config) + self.server_args.kv_events_config = json.dumps(config) + + async def kv_event_sources(self) -> list[KvEventSource]: + return [self._kv_source] if self._kv_source is not None else [] + async def generate( self, request: GenerateRequest, context: Context ) -> AsyncGenerator[GenerateChunk, None]: - assert self.engine is not None, "Engine not initialized" + if self.engine is None: + raise RuntimeError("Engine not initialized") + bootstrap = bootstrap_kwargs( + request, self.disaggregation_mode, self._bootstrap_endpoint + ) _validate_single_choice_sampling(request) sampling_params = build_sampling_params(request, self._model_max_len) + if self.disaggregation_mode == DisaggregationMode.PREFILL: + sampling_params["max_new_tokens"] = 1 + sampling_params.pop("min_new_tokens", None) token_ids = request.get("token_ids", []) obj = _generate_req_input_cls()( input_ids=token_ids, sampling_params=sampling_params, stream=True, + **bootstrap, ) request_id = context.id() @@ -119,6 +192,19 @@ async def generate( emitted_completion_tokens = 0 try: + if self.disaggregation_mode == DisaggregationMode.PREFILL: + # The router needs a handoff even when it supplied the bootstrap + # address. Preserve its trace identity; fallback rooms use the + # same validated parameters passed to the native prefill engine. + yield { + "token_ids": [], + "disaggregated_params": request.get("bootstrap_info") or bootstrap, + } + # Native abort_request ignores unknown RIDs. An abort while the + # handoff was yielded must therefore prevent native submission. + if request_id is not None and request_id in self._cancelled_contexts: + yield {"token_ids": [], "finish_reason": "cancelled"} + return async for out in self.engine.tokenizer_manager.generate_request(obj): delta_out, emitted_completion_tokens = _completion_delta_output( out, emitted_completion_tokens @@ -127,21 +213,32 @@ async def generate( finally: if request_id is not None: self._active_rids_by_context.pop(request_id, None) + self._cancelled_contexts.discard(request_id) async def abort(self, context: Context) -> None: request_id = context.id() if self.engine is None or request_id is None: return + if request_id in self._active_rids_by_context: + self._cancelled_contexts.add(request_id) rids = self._active_rids_by_context.get(request_id, [request_id]) for rid in rids: self.engine.tokenizer_manager.abort_request(rid) logger.debug("Aborted TokenSpeed request %s", rid) async def cleanup(self) -> None: - if self.engine is not None: - self.engine.shutdown() - logger.info("TokenSpeed engine shutdown") + engine, self.engine = self.engine, None + try: + if engine is not None: + engine.shutdown() + logger.info("TokenSpeed engine shutdown") + finally: + self._bootstrap_endpoint = None + self._kv_source = None + if self._kv_event_dir is not None: + self._kv_event_dir.cleanup() + self._kv_event_dir = None def build_sampling_params( @@ -305,7 +402,18 @@ def _finish_reason_type(finish_reason: Any) -> str: if hasattr(finish_reason, "to_json"): finish_reason = finish_reason.to_json() if isinstance(finish_reason, dict): - return str(finish_reason.get("type") or "unknown") + reason = str(finish_reason.get("type") or "unknown") + if reason == "abort": + message = finish_reason.get("message") or "Unknown backend error" + # ABORT_CODE.UnknownError (522) also represents client cancellation. + # Only TransferFailed (521), NumericalError (523), or an explicit + # transfer failure are errors. Current PD hooks use 522 with text. + transfer_failed = "transfer" in message.lower() and ( + "failed" in message.lower() or "timed out" in message.lower() + ) + if finish_reason.get("err_type") in (521, 523) or transfer_failed: + raise RuntimeError(f"TokenSpeed generation aborted: {message}") + return reason return str(finish_reason) diff --git a/components/src/dynamo/tokenspeed/tests/test_tokenspeed_disagg.py b/components/src/dynamo/tokenspeed/tests/test_tokenspeed_disagg.py new file mode 100644 index 000000000000..3e0670200d1f --- /dev/null +++ b/components/src/dynamo/tokenspeed/tests/test_tokenspeed_disagg.py @@ -0,0 +1,561 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Adapter contract tests; native TokenSpeed/GPU processes are replaced at the boundary.""" + +import json +from pathlib import Path +from types import SimpleNamespace +from unittest.mock import Mock + +import pytest + +from dynamo.common.constants import DisaggregationMode +from dynamo.llm.exceptions import InvalidArgument +from dynamo.tokenspeed import args, disagg, llm_engine +from dynamo.tokenspeed.disagg import BOOTSTRAP_HOST_ENV +from dynamo.tokenspeed.llm_engine import TokenspeedLLMEngine + +pytestmark = [pytest.mark.unit, pytest.mark.gpu_0, pytest.mark.pre_merge] + + +def server_args(**overrides): + values = dict( + model="test-model", + served_model_name="test-model", + disaggregation_mode="null", + disaggregation_transfer_backend="mooncake", + disaggregation_bootstrap_port=9000, + host="127.0.0.1", + mapping=SimpleNamespace(attn=SimpleNamespace(dp_size=1)), + prefix_granularity=64, + max_model_len=4096, + max_total_tokens=4096, + enable_prefix_caching=True, + kv_events_config=None, + ) + values.update(overrides) + return SimpleNamespace(**values) + + +@pytest.fixture +def native_engine(monkeypatch): + monkeypatch.delenv(BOOTSTRAP_HOST_ENV, raising=False) + native = Mock() + native.scheduler_info = { + "max_model_len": 8192, + "max_total_num_tokens": 8192, + "max_num_seqs": 32, + } + constructor = Mock(return_value=native) + monkeypatch.setattr(llm_engine, "_tokenspeed_engine_cls", lambda: constructor) + monkeypatch.setattr(llm_engine, "_generate_req_input_cls", lambda: SimpleNamespace) + return native, constructor + + +@pytest.mark.parametrize( + "mode,component,expected", + [ + ("null", "backend", DisaggregationMode.AGGREGATED), + ("prefill", "prefill", DisaggregationMode.PREFILL), + ("decode", "backend", DisaggregationMode.DECODE), + ], +) +@pytest.mark.parametrize("explicit_endpoint", [False, True]) +async def test_cli_registers_worker_role( + monkeypatch, mode, component, expected, explicit_endpoint +): + class NativeArgs: + @staticmethod + def add_cli_args(parser): + parser.add_argument("--model") + parser.add_argument("--disaggregation-mode", default="null") + + @staticmethod + def from_cli_args(parsed): + return server_args(**vars(parsed)) + + monkeypatch.setattr(args, "_server_args_cls", lambda: NativeArgs) + cli = [ + "--model", + "test-model", + "--disaggregation-mode", + mode, + "--namespace", + "test", + ] + if explicit_endpoint: + cli += ["--endpoint", "dyn://custom.worker.generate"] + _, config = await TokenspeedLLMEngine.from_args(cli) + assert config.disaggregation_mode == expected + assert config.component == ("worker" if explicit_endpoint else component) + assert config.namespace == ("custom" if explicit_endpoint else "test") + assert config.endpoint == "generate" + + +@pytest.mark.parametrize("mode", ["prefill", "decode", "null"]) +@pytest.mark.parametrize("legacy_block_size", [False, True]) +async def test_registration_advertises_prefill_bootstrap_only( + monkeypatch, native_engine, mode, legacy_block_size +): + monkeypatch.setenv(BOOTSTRAP_HOST_ENV, "prefill.example") + native_args = server_args(disaggregation_mode=mode) + if legacy_block_size: + native_args.block_size = native_args.prefix_granularity + del native_args.prefix_granularity + engine = TokenspeedLLMEngine(native_args) + try: + registration = await engine.start(worker_id=1) + assert registration.llm.context_length == 8192 + assert registration.llm.total_kv_blocks == 128 + assert registration.llm.kv_cache_block_size == 64 + assert registration.llm.bootstrap_host == ( + "prefill.example" if mode == "prefill" else None + ) + assert registration.llm.bootstrap_port == (9000 if mode == "prefill" else None) + finally: + await engine.cleanup() + + +@pytest.mark.parametrize("mode", ["prefill", "decode"]) +async def test_generate_forwards_handoff_and_preserves_decode_budget( + native_engine, mode +): + native, _ = native_engine + inputs = [] + + async def generate(obj): + inputs.append(obj) + yield { + "output_ids": [10, 11, 20], + "meta_info": {"completion_tokens": 1, "finish_reason": {"type": "length"}}, + } + + native.tokenizer_manager.generate_request = generate + engine = TokenspeedLLMEngine( + server_args(disaggregation_mode=mode, host="prefill.example") + ) + await engine.start(worker_id=1) + request = { + "token_ids": [10, 11], + "stop_conditions": {"max_tokens": 30, "min_tokens": 10}, + "bootstrap_info": { + "bootstrap_host": "selected-prefill.example", + "bootstrap_port": 9010, + "bootstrap_room": 0, + "handoff_id": "1cfe6c6e-d8c8-4bea-a0a6-ccde2bd97c54", + }, + } + context = SimpleNamespace(id=lambda: "request-1") + try: + chunks = [chunk async for chunk in engine.generate(request, context)] + if mode == "prefill": + assert chunks[0] == { + "token_ids": [], + "disaggregated_params": request["bootstrap_info"], + } + assert chunks[1]["token_ids"] == [20] + else: + assert chunks[0]["token_ids"] == [20] + assert inputs[0].rid == "request-1" + assert inputs[0].bootstrap_host == "selected-prefill.example" + assert inputs[0].bootstrap_port == 9010 + assert inputs[0].bootstrap_room == 0 + assert not hasattr(inputs[0], "handoff_id") + if mode == "prefill": + assert inputs[0].sampling_params["max_new_tokens"] == 1 + assert "min_new_tokens" not in inputs[0].sampling_params + else: + assert inputs[0].sampling_params["max_new_tokens"] == 30 + assert inputs[0].sampling_params["min_new_tokens"] == 10 + assert engine._active_rids_by_context == {} + finally: + await engine.cleanup() + + +@pytest.mark.parametrize( + "bootstrap", + [ + None, + {}, + {"bootstrap_host": "", "bootstrap_port": 9000, "bootstrap_room": 1}, + {"bootstrap_host": "p", "bootstrap_port": 65536, "bootstrap_room": 1}, + {"bootstrap_host": "p", "bootstrap_port": 9000, "bootstrap_room": -1}, + {"bootstrap_host": "p", "bootstrap_port": 9000, "bootstrap_room": True}, + {"bootstrap_host": "p", "bootstrap_port": 9000, "bootstrap_room": 2**64}, + ], +) +async def test_bad_handoff_rejected_before_native_request(native_engine, bootstrap): + native, _ = native_engine + engine = TokenspeedLLMEngine(server_args(disaggregation_mode="decode")) + await engine.start(worker_id=1) + try: + with pytest.raises(InvalidArgument, match="bootstrap"): + async for _ in engine.generate( + {"token_ids": [1], "bootstrap_info": bootstrap}, + SimpleNamespace(id=lambda: "bad"), + ): + pass + native.tokenizer_manager.generate_request.assert_not_called() + finally: + await engine.cleanup() + + +@pytest.mark.parametrize( + "overrides,message", + [ + ( + {"mapping": SimpleNamespace(attn=SimpleNamespace(dp_size=2))}, + "attention DP=1", + ), + ({"disaggregation_transfer_backend": "fake"}, "Mooncake"), + ({"prefix_granularity": 0}, "positive --prefix-granularity"), + ({"prefix_granularity": -1}, "positive --prefix-granularity"), + ], +) +async def test_unsupported_disagg_fails_before_start(native_engine, overrides, message): + _, constructor = native_engine + engine = TokenspeedLLMEngine(server_args(disaggregation_mode="decode", **overrides)) + with pytest.raises(ValueError, match=message): + await engine.start(worker_id=1) + constructor.assert_not_called() + await engine.cleanup() + + +async def test_kv_sources_use_unique_ipc_endpoints_and_cleanup(native_engine): + engines = [ + TokenspeedLLMEngine( + server_args(kv_events_config='{"enable_kv_cache_events":true}') + ) + for _ in range(2) + ] + paths = [] + try: + for engine in engines: + await engine.start(worker_id=1) + [source] = await engine.kv_event_sources() + native_config = json.loads(engine.server_args.kv_events_config) + assert source.endpoint == native_config["endpoint"] + assert source.dp_rank == 0 + assert source.endpoint.startswith("ipc://") + paths.append(Path(source.endpoint.removeprefix("ipc://")).parent) + assert paths[-1].is_dir() + assert paths[0] != paths[1] + finally: + for engine in engines: + await engine.cleanup() + await engine.cleanup() + assert all(not path.exists() for path in paths) + + +@pytest.mark.parametrize( + "native_config,expected", + [ + ({"endpoint": "tcp://*:19000"}, "tcp://127.0.0.1:19000"), + ({"endpoint": "ipc:///test-events", "publisher": None}, "ipc:///test-events"), + ], +) +async def test_kv_source_matches_native_bind_and_topic( + native_engine, native_config, expected +): + native_config.update(enable_kv_cache_events=True, topic="kv") + engine = TokenspeedLLMEngine( + server_args(kv_events_config=json.dumps(native_config)) + ) + try: + await engine.start(worker_id=1) + [source] = await engine.kv_event_sources() + assert source.endpoint == expected + assert source.topic == "kv" + assert json.loads(engine.server_args.kv_events_config) == native_config + finally: + await engine.cleanup() + + +@pytest.mark.parametrize( + "overrides", + [ + {"kv_events_config": None}, + {"kv_events_config": '{"enable_kv_cache_events":false}'}, + {"kv_events_config": '{"enable_kv_cache_events":true,"publisher":"null"}'}, + { + "kv_events_config": '{"enable_kv_cache_events":true}', + "enable_prefix_caching": False, + }, + ], +) +async def test_disabled_kv_events_have_no_source(native_engine, overrides, caplog): + native, constructor = native_engine + native_configs = [] + + def construct(*, server_args): + native_configs.append(json.loads(server_args.kv_events_config or "{}")) + return native + + constructor.side_effect = construct + engine = TokenspeedLLMEngine(server_args(**overrides)) + try: + await engine.start(worker_id=1) + assert await engine.kv_event_sources() == [] + if overrides.get("enable_prefix_caching") is False: + assert native_configs[0]["enable_kv_cache_events"] is False + assert native_configs[0]["publisher"] == "null" + assert "enable_prefix_caching=False" in caplog.text + assert "KV events" in caplog.text + else: + assert caplog.text == "" + finally: + await engine.cleanup() + + +async def test_connecting_native_publisher_is_rejected(native_engine): + _, constructor = native_engine + engine = TokenspeedLLMEngine( + server_args( + kv_events_config=json.dumps( + { + "enable_kv_cache_events": True, + "endpoint": "tcp://127.0.0.1:19000", + } + ) + ) + ) + with pytest.raises(ValueError, match="binding endpoint"): + await engine.start(worker_id=1) + constructor.assert_not_called() + await engine.cleanup() + + +async def test_failed_start_cleans_up_event_endpoint(native_engine): + _, constructor = native_engine + constructor.side_effect = RuntimeError("native startup failed") + engine = TokenspeedLLMEngine( + server_args(kv_events_config='{"enable_kv_cache_events":true}') + ) + with pytest.raises(RuntimeError, match="native startup failed"): + await engine.start(worker_id=1) + path = Path( + json.loads(engine.server_args.kv_events_config)["endpoint"].removeprefix( + "ipc://" + ) + ).parent + await engine.cleanup() + assert not path.exists() + assert await engine.kv_event_sources() == [] + + +@pytest.mark.parametrize("enabled", ["false", "true", None, 1]) +async def test_non_boolean_event_flag_rejected_before_start(native_engine, enabled): + _, constructor = native_engine + engine = TokenspeedLLMEngine( + server_args( + kv_events_config=json.dumps( + { + "enable_kv_cache_events": enabled, + } + ) + ) + ) + with pytest.raises(ValueError, match="JSON boolean"): + await engine.start(worker_id=1) + constructor.assert_not_called() + await engine.cleanup() + + +@pytest.mark.parametrize("host", ["127.0.0.1", "0.0.0.0", "::", "::1", "localhost"]) +@pytest.mark.parametrize("address", ["127.0.1.1", "0.0.0.0"]) +async def test_prefill_rejects_local_only_derived_advertisement( + monkeypatch, native_engine, host, address +): + monkeypatch.delenv(BOOTSTRAP_HOST_ENV, raising=False) + monkeypatch.setattr(disagg.socket, "gethostbyname", lambda _: address) + _, constructor = native_engine + engine = TokenspeedLLMEngine(server_args(disaggregation_mode="prefill", host=host)) + with pytest.raises(ValueError, match=BOOTSTRAP_HOST_ENV): + await engine.start(worker_id=1) + constructor.assert_not_called() + await engine.cleanup() + + +@pytest.mark.parametrize("host", ["127.0.0.1", "0.0.0.0", "::", "::1", "localhost"]) +async def test_prefill_derives_non_loopback_advertisement( + monkeypatch, native_engine, host +): + monkeypatch.setattr(disagg.socket, "gethostbyname", lambda _: "192.0.2.10") + engine = TokenspeedLLMEngine(server_args(disaggregation_mode="prefill", host=host)) + try: + config = await engine.start(worker_id=1) + assert config.llm.bootstrap_host == "192.0.2.10" + finally: + await engine.cleanup() + + +async def test_explicit_loopback_prefill_allowed_for_single_host( + monkeypatch, native_engine +): + monkeypatch.setenv(BOOTSTRAP_HOST_ENV, "127.0.0.1") + engine = TokenspeedLLMEngine(server_args(disaggregation_mode="prefill")) + try: + config = await engine.start(worker_id=1) + assert config.llm.bootstrap_host == "127.0.0.1" + finally: + await engine.cleanup() + + +@pytest.mark.parametrize("explicit_null", [False, True]) +async def test_prefill_creates_handoff_when_router_has_no_bootstrap_endpoint( + monkeypatch, native_engine, explicit_null +): + """The synchronous path supplies the same fresh room to prefill and decode.""" + native, _ = native_engine + inputs = [] + rooms = Mock(side_effect=[17, 23]) + monkeypatch.setattr( + disagg, "secrets", SimpleNamespace(randbits=rooms), raising=False + ) + + async def generate(obj): + inputs.append(obj) + yield {"output_ids": [20], "meta_info": {"completion_tokens": 1}} + + native.tokenizer_manager.generate_request = generate + engine = TokenspeedLLMEngine( + server_args(disaggregation_mode="prefill", host="prefill.example") + ) + registration = await engine.start(worker_id=1) + try: + for index, room in enumerate([17, 23]): + request = {"token_ids": [10, 11], "stop_conditions": {"max_tokens": 30}} + if explicit_null: + request["bootstrap_info"] = None + stream = engine.generate(request, SimpleNamespace(id=lambda: "fallback")) + try: + first = await anext(stream) + assert first["token_ids"] == [] + handoff = first["disaggregated_params"] + assert handoff == { + "bootstrap_host": registration.llm.bootstrap_host, + "bootstrap_port": registration.llm.bootstrap_port, + "bootstrap_room": room, + } + assert len(inputs) == index + chunks = [chunk async for chunk in stream] + assert chunks[0]["token_ids"] == [20] + for key, value in handoff.items(): + assert getattr(inputs[index], key) == value + assert ( + disagg.bootstrap_kwargs( + {"bootstrap_info": handoff}, DisaggregationMode.DECODE + ) + == handoff + ) + assert engine._active_rids_by_context == {} + finally: + await stream.aclose() + assert rooms.call_count == 2 + rooms.assert_called_with(63) + finally: + await engine.cleanup() + + +@pytest.mark.parametrize("router_bootstrap", [False, True]) +@pytest.mark.parametrize("cancel", [False, True]) +async def test_prefill_cancellation_after_handoff_prevents_submission( + native_engine, router_bootstrap, cancel +): + """An abort before native admission survives resuming the handoff stream.""" + native, _ = native_engine + submitted = [] + + async def generate(obj): + submitted.append(obj.rid) + yield {"output_ids": [20], "meta_info": {"finish_reason": {"type": "length"}}} + + native.tokenizer_manager.generate_request = generate + engine = TokenspeedLLMEngine( + server_args(disaggregation_mode="prefill", host="prefill.example") + ) + registration = await engine.start(worker_id=1) + request = {"token_ids": [10, 11]} + if router_bootstrap: + request["bootstrap_info"] = { + "bootstrap_host": registration.llm.bootstrap_host, + "bootstrap_port": registration.llm.bootstrap_port, + "bootstrap_room": 1, + } + context = SimpleNamespace(id=lambda: "handoff-cancel") + stream = engine.generate(request, context) + try: + first = await anext(stream) + assert first["disaggregated_params"] + assert submitted == [] + if cancel: + await engine.abort(context) + await engine.abort(context) + chunks = [chunk async for chunk in stream] + assert submitted == ([] if cancel else ["handoff-cancel"]) + assert chunks[-1]["finish_reason"] == ("cancelled" if cancel else "length") + assert engine._active_rids_by_context == {} + # Reusing the context must not inherit cancellation from the old stream. + chunks = [chunk async for chunk in engine.generate(request, context)] + assert chunks[-1]["finish_reason"] == "length" + assert submitted[-1] == "handoff-cancel" + finally: + await stream.aclose() + await engine.cleanup() + + +async def test_cancelled_native_stream_preserves_cancelled_finish(native_engine): + native, _ = native_engine + aborted = set() + native.tokenizer_manager.abort_request.side_effect = aborted.add + + async def generate(obj): + yield {"output_ids": [20]} + assert obj.rid in aborted + yield { + "output_ids": [], + "meta_info": { + "finish_reason": { + "type": "abort", + "message": "AbortReq from client", + "err_type": 522, + } + }, + } + + native.tokenizer_manager.generate_request = generate + engine = TokenspeedLLMEngine(server_args()) + await engine.start(worker_id=1) + context = SimpleNamespace(id=lambda: "stream-cancel") + stream = engine.generate({"token_ids": [10]}, context) + try: + assert (await anext(stream))["token_ids"] == [20] + await engine.abort(context) + chunks = [chunk async for chunk in stream] + assert chunks[-1]["finish_reason"] == "cancelled" + assert engine._active_rids_by_context == {} + finally: + await stream.aclose() + await engine.cleanup() + + +async def test_kv_replay_rejected_before_native_start(native_engine, tmp_path): + _, constructor = native_engine + engine = TokenspeedLLMEngine( + server_args( + kv_events_config=json.dumps( + { + "enable_kv_cache_events": True, + "endpoint": f"ipc://{tmp_path}/events", + "replay_endpoint": f"ipc://{tmp_path}/replay", + } + ) + ) + ) + try: + with pytest.raises(ValueError, match="replay_endpoint"): + await engine.start(worker_id=1) + constructor.assert_not_called() + finally: + await engine.cleanup() diff --git a/components/src/dynamo/tokenspeed/tests/test_tokenspeed_llm_engine.py b/components/src/dynamo/tokenspeed/tests/test_tokenspeed_llm_engine.py index c7957fc647da..e915d378a57c 100644 --- a/components/src/dynamo/tokenspeed/tests/test_tokenspeed_llm_engine.py +++ b/components/src/dynamo/tokenspeed/tests/test_tokenspeed_llm_engine.py @@ -179,6 +179,41 @@ def test_convert_output_to_chunk_normalizes_abort_finish_reason(): assert chunk["finish_reason"] == "cancelled" +@pytest.mark.parametrize("as_object", [False, True]) +@pytest.mark.parametrize( + "message,err_type", + [ + ("PD/EPD remote transfer failed or timed out", "UnknownError"), + ("PD/EPD remote transfer failed or timed out", 522), + ("kv transfer failed", None), + ("remote peer disconnected", 521), + ("NaN in logits", 523), + ], +) +def test_convert_output_preserves_native_failure(as_object, message, err_type): + reason = { + "type": "abort", + "message": message, + "err_type": err_type, + } + if as_object: + + class FinishReason: + def to_json(self): + return reason + + finish_reason = FinishReason() + else: + finish_reason = reason + with pytest.raises(RuntimeError, match=message): + convert_output_to_chunk( + { + "output_ids": [], + "meta_info": {"finish_reason": finish_reason}, + } + ) + + def test_validate_single_choice_sampling_rejects_n_greater_than_one(): with pytest.raises(InvalidArgument, match="n=2"): _validate_single_choice_sampling( @@ -209,3 +244,32 @@ def test_completion_delta_output_preserves_later_token_delta(): assert emitted == 2 assert delta_out["output_ids"] == [100] + + +@pytest.mark.parametrize("as_object", [False, True]) +@pytest.mark.parametrize( + "message", + [ + "request was cancelled", + "generation stopped by content filter", + "Abort before prefill", + "AbortReq from client", + "Aborted by AbortReq.", + "Aborted by pause", + ], +) +@pytest.mark.parametrize("err_type", [None, 522]) +def test_convert_output_preserves_native_cancellation(as_object, message, err_type): + reason = {"type": "abort", "message": message, "err_type": err_type} + + class FinishReason: + def to_json(self): + return reason + + chunk = convert_output_to_chunk( + { + "output_ids": [], + "meta_info": {"finish_reason": FinishReason() if as_object else reason}, + } + ) + assert chunk["finish_reason"] == "cancelled" From 163b47ae01923f5a0eb8c9c2bc08b69fabe825c8 Mon Sep 17 00:00:00 2001 From: Thomas Montfort <61255722+tmonty12@users.noreply.github.com> Date: Mon, 21 Sep 2026 17:18:52 -0700 Subject: [PATCH 142/191] docs(operator): refresh API references and platform upgrade notes (#15023) Signed-off-by: Thomas Montfort --- .github/workflows/shared-copy.yml | 2 +- deploy/helm/charts/platform/README.md | 190 +++++++++++++----- deploy/helm/charts/platform/README.md.gotmpl | 190 +++++++++++++----- deploy/operator/AGENTS.md | 28 +++ deploy/operator/Makefile | 1 + .../dynamocomponentdeployment_types.go | 2 +- .../dynamocomponentdeployment_types.go | 2 +- ...nvidia.com_dynamocomponentdeployments.yaml | 4 +- .../nvidia.com_dynamographdeployments.yaml | 4 +- .../operator/internal/features/runtime/doc.go | 2 +- .../internal/runtimeversion/runtimeversion.go | 6 +- docs/fern/AGENTS.md | 8 +- .../runtime-containers.md | 2 +- .../additional-resources/api-reference-k8s.md | 8 +- .../dynamo-component-deployment.mdx | 43 +++- .../dynamo-graph-deployment-request.mdx | 8 +- .../dynamo-graph-deployment.mdx | 64 +++++- .../kubernetes-api/full-api-reference.mdx | 8 +- .../guidelines/kubernetes-api-reference.md | 10 +- 19 files changed, 444 insertions(+), 138 deletions(-) diff --git a/.github/workflows/shared-copy.yml b/.github/workflows/shared-copy.yml index 51f3fa8b9b81..a995b1728ea8 100644 --- a/.github/workflows/shared-copy.yml +++ b/.github/workflows/shared-copy.yml @@ -31,7 +31,7 @@ on: default: '' outputs: runtime_version: - description: 'Dynamo runtime compatibility version from Cargo.toml' + description: 'Dynamo runtime version from Cargo.toml' value: ${{ jobs.copy-to-acr.outputs.runtime_version }} image_tag: description: 'Image tag published to ACR' diff --git a/deploy/helm/charts/platform/README.md b/deploy/helm/charts/platform/README.md index 311baf30551a..6fb79a2f3147 100644 --- a/deploy/helm/charts/platform/README.md +++ b/deploy/helm/charts/platform/README.md @@ -39,23 +39,86 @@ The Dynamo Platform Helm chart deploys the complete Dynamo Kubernetes Platform i - Container registry access (if using private images) - TLS certificate infrastructure for admission webhooks (auto-generated by the operator's built-in cert-controller by default, or [cert-manager](https://cert-manager.io/), or externally managed) -## 🔄 Upgrading Notes +## Upgrading -### Runtime version override for custom runtime images (v1.4.0+) +Releases are listed newest first. Read bottom-up through releases newer than your installed version, +up to your target version. Each entry describes changes introduced in that release. Releases and +categories without migration notes recorded here are omitted. For supported Grove and KAI Scheduler +versions, see the [compatibility matrix](#kai-scheduler-and-grove-configuration). -Each `DynamoGraphDeployment` (DGD) or standalone `DynamoComponentDeployment` (DCD) -component now resolves its Dynamo runtime compatibility version from its main container image. -Use a semantic-version image tag such as `:1.4.0`, or set -`runtimeVersionOverride` to the compatible Dynamo runtime version when the image uses a digest, -custom build tag, or mutable non-semantic-version tag such as `:latest`. The override takes -precedence over the image-derived version only when the operator selects runtime-version-specific -flags, environment variables, and behavior. It never changes the image reference or rendered Pod: -the configured image, including `:latest`, runs unchanged. +### v1.5.0 + +#### CRD and admission breaking changes + +##### EPP runtime version and configuration + +**Change:** Admission now requires a resolvable Dynamo runtime version for standalone EPP DCDs, +as it already did for EPP components in a DGD. In v1.4.x, standalone DCDs could omit +`runtimeVersionOverride` even when their image tag had no parseable semantic version, including EPP. +Standalone non-EPP DCDs retain that exemption. + +For EPP images resolving to runtime 1.5.0 or later, admission now rejects `eppConfig`: native Rust EPP +does not use it. For older EPP runtimes, `eppConfig` remains required. + +**Affected:** Standalone EPP DCDs using images without a parseable semantic-version tag, and EPP +components in either DGDs or standalone DCDs upgrading to a runtime 1.5.0 or later image. + +**Action:** Set `runtimeVersionOverride` to the Dynamo runtime actually contained in the image when +the tag cannot provide it. When upgrading an EPP image to runtime 1.5.0 or later, remove `eppConfig` +and update any runtime override in the same change. Retain `eppConfig` for older EPP images. + +**Existing deployments:** Unchanged pre-existing violations remain admissible during unrelated +updates. Changing the component type, image, override, or `eppConfig` revalidates the EPP +configuration requirement. + +#### Dependency compatibility + +**Affected:** Deployments using Grove or KAI Scheduler, whether bundled with this chart or managed +separately. + +| Dependency | Bundled version | Operator action | +|------------|-----------------|-----------------| +| Grove | `v0.1.0-alpha.13` | Upgrade externally managed Grove and its CRDs with Dynamo. The chart now enables the bundled CRD installer, which applies Grove CRDs before its operator starts. | +| KAI Scheduler | `v0.17.0` | Upgrade externally managed KAI Scheduler. For both bundled and externally managed installations, apply the staleness setting below when using Grove's KAI backend. | + +Grove `v0.1.0-alpha.13` enables its `kai-scheduler` backend by default. When that profile is active, +Grove owns PodGroup termination timing. Disable KAI's independent stale PodGroup eviction: + +- For bundled KAI, set `kai-scheduler.scheduler.args.default-staleness-grace-period` to `"-1s"` in + the platform chart values. The chart rejects installation of both bundled subcharts without this + setting. +- For externally managed KAI, set `scheduler.args.default-staleness-grace-period` to `"-1s"` in + the KAI Scheduler chart values. + +Keep KAI's normal cleanup behavior when using KAI without Grove or when an externally managed Grove +has that profile disabled. + +### v1.4.0 + +#### CRD and admission breaking changes + +##### Runtime version required for custom images + +**Change:** Components resolve their Dynamo runtime version from the main container +image tag or `runtimeVersionOverride`. The override takes precedence when the operator selects +runtime-specific flags, environment variables, and behavior; it does not change the image reference. +Admission rejects a new DGD component whose main image has no parseable semantic-version tag unless +`runtimeVersionOverride` is set. It also rejects a new DGDR whose nonempty `spec.image` has no +parseable semantic-version tag unless `spec.runtimeVersionOverride` is set. An omitted DGDR image +does not require an override. + +**Affected:** DGD components using digest-only references, custom build tags, or mutable tags such as +`latest`, and DGDRs specifying those images in `spec.image`. + +**Action:** Use a semantic-version image tag such as `:1.4.0`, or set `runtimeVersionOverride` to the +Dynamo runtime version actually contained in the image before submitting a new component or changing +its image. For a DGDR, set `spec.runtimeVersionOverride` to describe its `spec.image`. This override +also supplies the default for generated components; an explicit component override takes precedence. ```yaml components: - name: worker - runtimeVersionOverride: 1.4.0 + runtimeVersionOverride: "1.4.0" podTemplate: spec: containers: @@ -63,40 +126,44 @@ components: image: registry.example/my-runtime:build-20260723 ``` -Admission requires every new component's main-container image. In `v1beta1`, set -`spec.components[*].podTemplate.spec.containers[name=main].image` for a DGD, or -`spec.podTemplate.spec.containers[name=main].image` for a standalone DCD. In `v1alpha1`, set -`spec.services..extraPodSpec.mainContainer.image` for a DGD, or -`spec.extraPodSpec.mainContainer.image` for a standalone DCD. These fields were not previously -required by Dynamo admission, but were effectively required: Kubernetes rejects the rendered Pod -specification when its main container has no image. - -After upgrading the CRDs and operator, admission denies a new DGD component when its main image is -not tagged with a semantic version and `runtimeVersionOverride` is unset. The same applies to a -DGDR whose `spec.image` is not tagged with a semantic version. This includes digest references, -custom tags, and `:latest`. Controller-generated standalone DCDs may omit the override. - -These requirements are ratcheted on updates: a pre-existing component with an unchanged missing -pod configuration or main image remains admissible, as does an unchanged non-semantic-version -image without an override. Adding or changing an image applies the current validation, and removing -an existing pod configuration or main image is rejected. Changing the image to a -non-semantic-version tag requires setting `runtimeVersionOverride` to that image's Dynamo runtime -compatibility version in the same update. - -### Bundled NATS is now disabled by default - -The bundled NATS subchart is no longer installed by default because Dynamo's default request and -event planes use TCP and ZMQ, respectively. This is a breaking change for existing releases that -previously relied on the chart's implicit `global.nats.install=true` default. - -During an upgrade, accepting the new default removes the bundled NATS resources and removes -`NATS_SERVER` from operator-managed workload specifications. That environment change can trigger -rolling updates as those workloads are reconciled. Before disabling NATS, verify that the deployment -does not use an explicit NATS-based feature such as `DYN_EVENT_PLANE=nats`, legacy -`DYN_REQUEST_PLANE=nats`, or a NATS request-trace sink. +**Existing deployments:** An unchanged non-semantic-version image without an override remains +admissible during unrelated updates. Changing the image or override revalidates the requirement; +enabling `spec.autoApply` on a DGDR also revalidates it. In v1.4.x, standalone DCDs, including EPP, +may omit the override. See the v1.5.0 entry for the EPP exception introduced in that release, and the +[DCD runtime version reference](../../../../docs/fern/pages/reference/kubernetes-api/dynamo-component-deployment.mdx#runtime-version-compatibility) +for additional guidance, including rollout effects when changing the override. -To retain bundled NATS and avoid a rolling update caused by removing `NATS_SERVER`, explicitly -preserve the previous setting during the upgrade: +##### Main-container image required on admission + +**Change:** Admission requires every new component's main-container image. Previously, Kubernetes +rejected the rendered Pod when its main container had no image; Dynamo now rejects the resource at +admission. + +**Affected:** New DGD components and standalone DCDs that omit the main image. + +**Action:** Supply the image at the path for the submitted API version: + +| Resource | `v1beta1` | `v1alpha1` | +|----------|-----------|------------| +| DGD | `spec.components[*].podTemplate.spec.containers[name=main].image` | `spec.services..extraPodSpec.mainContainer.image` | +| DCD | `spec.podTemplate.spec.containers[name=main].image` | `spec.extraPodSpec.mainContainer.image` | + +**Existing deployments:** Components with unchanged missing pod configuration or main images remain +admissible during unrelated updates. Adding or changing an image applies the current validation; +removing an existing pod configuration or main image is rejected. + +#### Platform chart breaking changes + +##### Bundled NATS disabled by default + +**Change:** `global.nats.install` now defaults to `false` because Dynamo's default request and event +planes use TCP and ZMQ, respectively. + +**Affected:** Releases relying on the previous chart default of `global.nats.install=true`. + +**Action:** Before disabling NATS, verify that no deployment uses an explicit NATS-based feature, +such as `DYN_EVENT_PLANE=nats`, legacy `DYN_REQUEST_PLANE=nats`, or a NATS request-trace sink. To retain +bundled NATS, explicitly preserve the previous setting during the upgrade: ```bash helm upgrade \ @@ -105,11 +172,34 @@ helm upgrade \ Deployments using an external NATS server should continue to set `dynamo-operator.natsAddr` instead. -### Webhooks are now mandatory (v1.0.0+) +**Existing deployments:** Accepting the new default removes bundled NATS resources and removes +`NATS_SERVER` from operator-managed workload specifications. That environment change can trigger +rolling updates as workloads are reconciled. + +#### Dependency compatibility + +| Dependency | Bundled version | Operator action | +|------------|-----------------|-----------------| +| Grove | `v0.1.0-alpha.12-rc1` | Upgrade Grove with Dynamo. Dynamo 1.4.x expects the `ClusterTopologyBinding` API; Dynamo 1.3.x expects the earlier `ClusterTopology` API and is incompatible with the newer API. | + +### v1.0.0 + +#### Platform chart breaking changes -The `webhook.enabled` Helm value has been removed. Admission webhooks are now a required component of the operator and cannot be disabled. This change aligns with the upcoming addition of CRD conversion webhooks, which are mandatory for multi-version API support. +##### Admission webhooks are mandatory -No action is required for most upgrades — the operator's built-in cert-controller automatically generates and rotates TLS certificates at startup. If you use cert-manager or externally managed certificates, ensure your existing configuration is correct before upgrading. +**Change:** The `webhook.enabled` Helm value has been removed. Admission webhooks are required and +cannot be disabled. + +**Affected:** Installations that previously disabled admission webhooks or managed their certificates +separately. + +**Action:** Remove `webhook.enabled` from custom values. The operator's built-in cert-controller +generates and rotates TLS certificates at startup by default. If using cert-manager or externally +managed certificates, verify the certificate configuration before upgrading. + +**Existing deployments:** Installations already using admission webhooks with the default certificate +management require no additional action for this change. --- @@ -293,9 +383,9 @@ For **production environments**, Kai Scheduler and Grove should be installed sep | 1.4.x | >= v0.13.4 | >= v0.1.0-alpha.12-rc1 | | 1.5.x | >= v0.17.0 | >= v0.1.0-alpha.13 | -Grove should be upgraded in lockstep with Dynamo while Grove APIs are not stable. Dynamo 1.3.x expects Grove's earlier `ClusterTopology` API and is incompatible with the newer `ClusterTopologyBinding` API; Dynamo 1.4.x expects `ClusterTopologyBinding`. - -Grove `v0.1.0-alpha.13` enables its `kai-scheduler` backend by default. When Grove's `kai-scheduler` profile is active, disable KAI's independent stale PodGroup eviction by setting `scheduler.args.default-staleness-grace-period` to `"-1s"` in the KAI Scheduler chart; Grove owns PodGroup termination timing. Keep KAI's normal cleanup behavior when using KAI without Grove or when an externally managed Grove has that profile disabled. The bundled Grove subchart also enables its CRD installer so new and updated Grove CRDs are applied before its operator starts during upgrades. +Upgrade Grove in lockstep with Dynamo while Grove APIs are not stable. See the +[v1.4.0 upgrade notes](#v140) for the topology API transition and the +[v1.5.0 upgrade notes](#v150) for Grove CRD installation and the required KAI staleness setting. After installing them separately, enable Dynamo integration: diff --git a/deploy/helm/charts/platform/README.md.gotmpl b/deploy/helm/charts/platform/README.md.gotmpl index e2817409ad38..ed9f7495d559 100644 --- a/deploy/helm/charts/platform/README.md.gotmpl +++ b/deploy/helm/charts/platform/README.md.gotmpl @@ -39,23 +39,86 @@ The Dynamo Platform Helm chart deploys the complete Dynamo Kubernetes Platform i - Container registry access (if using private images) - TLS certificate infrastructure for admission webhooks (auto-generated by the operator's built-in cert-controller by default, or [cert-manager](https://cert-manager.io/), or externally managed) -## 🔄 Upgrading Notes +## Upgrading -### Runtime version override for custom runtime images (v1.4.0+) +Releases are listed newest first. Read bottom-up through releases newer than your installed version, +up to your target version. Each entry describes changes introduced in that release. Releases and +categories without migration notes recorded here are omitted. For supported Grove and KAI Scheduler +versions, see the [compatibility matrix](#kai-scheduler-and-grove-configuration). -Each `DynamoGraphDeployment` (DGD) or standalone `DynamoComponentDeployment` (DCD) -component now resolves its Dynamo runtime compatibility version from its main container image. -Use a semantic-version image tag such as `:1.4.0`, or set -`runtimeVersionOverride` to the compatible Dynamo runtime version when the image uses a digest, -custom build tag, or mutable non-semantic-version tag such as `:latest`. The override takes -precedence over the image-derived version only when the operator selects runtime-version-specific -flags, environment variables, and behavior. It never changes the image reference or rendered Pod: -the configured image, including `:latest`, runs unchanged. +### v1.5.0 + +#### CRD and admission breaking changes + +##### EPP runtime version and configuration + +**Change:** Admission now requires a resolvable Dynamo runtime version for standalone EPP DCDs, +as it already did for EPP components in a DGD. In v1.4.x, standalone DCDs could omit +`runtimeVersionOverride` even when their image tag had no parseable semantic version, including EPP. +Standalone non-EPP DCDs retain that exemption. + +For EPP images resolving to runtime 1.5.0 or later, admission now rejects `eppConfig`: native Rust EPP +does not use it. For older EPP runtimes, `eppConfig` remains required. + +**Affected:** Standalone EPP DCDs using images without a parseable semantic-version tag, and EPP +components in either DGDs or standalone DCDs upgrading to a runtime 1.5.0 or later image. + +**Action:** Set `runtimeVersionOverride` to the Dynamo runtime actually contained in the image when +the tag cannot provide it. When upgrading an EPP image to runtime 1.5.0 or later, remove `eppConfig` +and update any runtime override in the same change. Retain `eppConfig` for older EPP images. + +**Existing deployments:** Unchanged pre-existing violations remain admissible during unrelated +updates. Changing the component type, image, override, or `eppConfig` revalidates the EPP +configuration requirement. + +#### Dependency compatibility + +**Affected:** Deployments using Grove or KAI Scheduler, whether bundled with this chart or managed +separately. + +| Dependency | Bundled version | Operator action | +|------------|-----------------|-----------------| +| Grove | `v0.1.0-alpha.13` | Upgrade externally managed Grove and its CRDs with Dynamo. The chart now enables the bundled CRD installer, which applies Grove CRDs before its operator starts. | +| KAI Scheduler | `v0.17.0` | Upgrade externally managed KAI Scheduler. For both bundled and externally managed installations, apply the staleness setting below when using Grove's KAI backend. | + +Grove `v0.1.0-alpha.13` enables its `kai-scheduler` backend by default. When that profile is active, +Grove owns PodGroup termination timing. Disable KAI's independent stale PodGroup eviction: + +- For bundled KAI, set `kai-scheduler.scheduler.args.default-staleness-grace-period` to `"-1s"` in + the platform chart values. The chart rejects installation of both bundled subcharts without this + setting. +- For externally managed KAI, set `scheduler.args.default-staleness-grace-period` to `"-1s"` in + the KAI Scheduler chart values. + +Keep KAI's normal cleanup behavior when using KAI without Grove or when an externally managed Grove +has that profile disabled. + +### v1.4.0 + +#### CRD and admission breaking changes + +##### Runtime version required for custom images + +**Change:** Components resolve their Dynamo runtime version from the main container +image tag or `runtimeVersionOverride`. The override takes precedence when the operator selects +runtime-specific flags, environment variables, and behavior; it does not change the image reference. +Admission rejects a new DGD component whose main image has no parseable semantic-version tag unless +`runtimeVersionOverride` is set. It also rejects a new DGDR whose nonempty `spec.image` has no +parseable semantic-version tag unless `spec.runtimeVersionOverride` is set. An omitted DGDR image +does not require an override. + +**Affected:** DGD components using digest-only references, custom build tags, or mutable tags such as +`latest`, and DGDRs specifying those images in `spec.image`. + +**Action:** Use a semantic-version image tag such as `:1.4.0`, or set `runtimeVersionOverride` to the +Dynamo runtime version actually contained in the image before submitting a new component or changing +its image. For a DGDR, set `spec.runtimeVersionOverride` to describe its `spec.image`. This override +also supplies the default for generated components; an explicit component override takes precedence. ```yaml components: - name: worker - runtimeVersionOverride: 1.4.0 + runtimeVersionOverride: "1.4.0" podTemplate: spec: containers: @@ -63,40 +126,44 @@ components: image: registry.example/my-runtime:build-20260723 ``` -Admission requires every new component's main-container image. In `v1beta1`, set -`spec.components[*].podTemplate.spec.containers[name=main].image` for a DGD, or -`spec.podTemplate.spec.containers[name=main].image` for a standalone DCD. In `v1alpha1`, set -`spec.services..extraPodSpec.mainContainer.image` for a DGD, or -`spec.extraPodSpec.mainContainer.image` for a standalone DCD. These fields were not previously -required by Dynamo admission, but were effectively required: Kubernetes rejects the rendered Pod -specification when its main container has no image. - -After upgrading the CRDs and operator, admission denies a new DGD component when its main image is -not tagged with a semantic version and `runtimeVersionOverride` is unset. The same applies to a -DGDR whose `spec.image` is not tagged with a semantic version. This includes digest references, -custom tags, and `:latest`. Controller-generated standalone DCDs may omit the override. - -These requirements are ratcheted on updates: a pre-existing component with an unchanged missing -pod configuration or main image remains admissible, as does an unchanged non-semantic-version -image without an override. Adding or changing an image applies the current validation, and removing -an existing pod configuration or main image is rejected. Changing the image to a -non-semantic-version tag requires setting `runtimeVersionOverride` to that image's Dynamo runtime -compatibility version in the same update. - -### Bundled NATS is now disabled by default - -The bundled NATS subchart is no longer installed by default because Dynamo's default request and -event planes use TCP and ZMQ, respectively. This is a breaking change for existing releases that -previously relied on the chart's implicit `global.nats.install=true` default. - -During an upgrade, accepting the new default removes the bundled NATS resources and removes -`NATS_SERVER` from operator-managed workload specifications. That environment change can trigger -rolling updates as those workloads are reconciled. Before disabling NATS, verify that the deployment -does not use an explicit NATS-based feature such as `DYN_EVENT_PLANE=nats`, legacy -`DYN_REQUEST_PLANE=nats`, or a NATS request-trace sink. +**Existing deployments:** An unchanged non-semantic-version image without an override remains +admissible during unrelated updates. Changing the image or override revalidates the requirement; +enabling `spec.autoApply` on a DGDR also revalidates it. In v1.4.x, standalone DCDs, including EPP, +may omit the override. See the v1.5.0 entry for the EPP exception introduced in that release, and the +[DCD runtime version reference](../../../../docs/fern/pages/reference/kubernetes-api/dynamo-component-deployment.mdx#runtime-version-compatibility) +for additional guidance, including rollout effects when changing the override. -To retain bundled NATS and avoid a rolling update caused by removing `NATS_SERVER`, explicitly -preserve the previous setting during the upgrade: +##### Main-container image required on admission + +**Change:** Admission requires every new component's main-container image. Previously, Kubernetes +rejected the rendered Pod when its main container had no image; Dynamo now rejects the resource at +admission. + +**Affected:** New DGD components and standalone DCDs that omit the main image. + +**Action:** Supply the image at the path for the submitted API version: + +| Resource | `v1beta1` | `v1alpha1` | +|----------|-----------|------------| +| DGD | `spec.components[*].podTemplate.spec.containers[name=main].image` | `spec.services..extraPodSpec.mainContainer.image` | +| DCD | `spec.podTemplate.spec.containers[name=main].image` | `spec.extraPodSpec.mainContainer.image` | + +**Existing deployments:** Components with unchanged missing pod configuration or main images remain +admissible during unrelated updates. Adding or changing an image applies the current validation; +removing an existing pod configuration or main image is rejected. + +#### Platform chart breaking changes + +##### Bundled NATS disabled by default + +**Change:** `global.nats.install` now defaults to `false` because Dynamo's default request and event +planes use TCP and ZMQ, respectively. + +**Affected:** Releases relying on the previous chart default of `global.nats.install=true`. + +**Action:** Before disabling NATS, verify that no deployment uses an explicit NATS-based feature, +such as `DYN_EVENT_PLANE=nats`, legacy `DYN_REQUEST_PLANE=nats`, or a NATS request-trace sink. To retain +bundled NATS, explicitly preserve the previous setting during the upgrade: ```bash helm upgrade \ @@ -105,11 +172,34 @@ helm upgrade \ Deployments using an external NATS server should continue to set `dynamo-operator.natsAddr` instead. -### Webhooks are now mandatory (v1.0.0+) +**Existing deployments:** Accepting the new default removes bundled NATS resources and removes +`NATS_SERVER` from operator-managed workload specifications. That environment change can trigger +rolling updates as workloads are reconciled. + +#### Dependency compatibility + +| Dependency | Bundled version | Operator action | +|------------|-----------------|-----------------| +| Grove | `v0.1.0-alpha.12-rc1` | Upgrade Grove with Dynamo. Dynamo 1.4.x expects the `ClusterTopologyBinding` API; Dynamo 1.3.x expects the earlier `ClusterTopology` API and is incompatible with the newer API. | + +### v1.0.0 + +#### Platform chart breaking changes -The `webhook.enabled` Helm value has been removed. Admission webhooks are now a required component of the operator and cannot be disabled. This change aligns with the upcoming addition of CRD conversion webhooks, which are mandatory for multi-version API support. +##### Admission webhooks are mandatory -No action is required for most upgrades — the operator's built-in cert-controller automatically generates and rotates TLS certificates at startup. If you use cert-manager or externally managed certificates, ensure your existing configuration is correct before upgrading. +**Change:** The `webhook.enabled` Helm value has been removed. Admission webhooks are required and +cannot be disabled. + +**Affected:** Installations that previously disabled admission webhooks or managed their certificates +separately. + +**Action:** Remove `webhook.enabled` from custom values. The operator's built-in cert-controller +generates and rotates TLS certificates at startup by default. If using cert-manager or externally +managed certificates, verify the certificate configuration before upgrading. + +**Existing deployments:** Installations already using admission webhooks with the default certificate +management require no additional action for this change. --- @@ -204,9 +294,9 @@ For **production environments**, Kai Scheduler and Grove should be installed sep | 1.4.x | >= v0.13.4 | >= v0.1.0-alpha.12-rc1 | | 1.5.x | >= v0.17.0 | >= v0.1.0-alpha.13 | -Grove should be upgraded in lockstep with Dynamo while Grove APIs are not stable. Dynamo 1.3.x expects Grove's earlier `ClusterTopology` API and is incompatible with the newer `ClusterTopologyBinding` API; Dynamo 1.4.x expects `ClusterTopologyBinding`. - -Grove `v0.1.0-alpha.13` enables its `kai-scheduler` backend by default. When Grove's `kai-scheduler` profile is active, disable KAI's independent stale PodGroup eviction by setting `scheduler.args.default-staleness-grace-period` to `"-1s"` in the KAI Scheduler chart; Grove owns PodGroup termination timing. Keep KAI's normal cleanup behavior when using KAI without Grove or when an externally managed Grove has that profile disabled. The bundled Grove subchart also enables its CRD installer so new and updated Grove CRDs are applied before its operator starts during upgrades. +Upgrade Grove in lockstep with Dynamo while Grove APIs are not stable. See the +[v1.4.0 upgrade notes](#v140) for the topology API transition and the +[v1.5.0 upgrade notes](#v150) for Grove CRD installation and the required KAI staleness setting. After installing them separately, enable Dynamo integration: diff --git a/deploy/operator/AGENTS.md b/deploy/operator/AGENTS.md index b4a22a24eebc..2f6cad009c61 100644 --- a/deploy/operator/AGENTS.md +++ b/deploy/operator/AGENTS.md @@ -9,6 +9,34 @@ SPDX-License-Identifier: Apache-2.0 - Keep chart-only grants in the manual section of the platform chart's `../helm/charts/platform/components/operator/templates/manager-rbac.yaml`. +## Kubernetes API Documentation + +- `make generate-api-docs` generates + `docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md` + (relative to the repository root) from Go API types and comments, then runs + `docs/fern/scripts/gen_kubernetes_api.py` to render `full-api-reference.mdx`. + `make check` depends on this target and checks for uncommitted changes. Regenerate + and commit both generated files when their source changes; do not edit them by hand. +- The sibling `dynamo-graph-deployment.mdx`, + `dynamo-graph-deployment-request.mdx`, and `dynamo-component-deployment.mdx` + pages are **manually maintained**. Neither generation command updates them, + and passing `make check` does not prove they match the API. +- When changing API fields, defaults, validation, or controller/webhook behavior, + update the affected curated pages in the same PR. Check their spec, status, + nested types, examples, and compatibility notes against the Go source and + regenerated reference. Shared component fields belong in the DCD page; the + DGD page links there rather than duplicating the field inventory. +- When introducing CRD/admission or platform chart breaking changes, or dependency + compatibility changes that require migration, update the platform README's + `Upgrading` section in the same PR. Edit + `../helm/charts/platform/README.md.gotmpl` and run `make generate-helm-docs` + from `deploy/operator`; do not edit the generated `README.md` by hand. Place + the note under the release that introduces the change and the appropriate + category, stating affected deployments, required actions, and behavior for + existing deployments. Verify release attribution against the code and dependencies. +- Follow the [Kubernetes API reference authoring guide](../../docs/fern/templates/guidelines/kubernetes-api-reference.md) + for the source-of-truth order, page structure, and validation commands. + ## Reconciliation and Admission Semantics - Reconciler state convergence must be level-based. Derive actions from desired diff --git a/deploy/operator/Makefile b/deploy/operator/Makefile index 5383594d2a0f..485b13a4dbc9 100644 --- a/deploy/operator/Makefile +++ b/deploy/operator/Makefile @@ -660,6 +660,7 @@ generate-api-docs: crd-ref-docs ## Generate API reference documentation from CRD @echo "✅ Concatenated header.md, api_reference.md, and footer.md" # Post-process duplicate anchors and fields pruned from standalone DCD CRDs. python3 docs/fix-api-anchors.py ../../docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md + python3 ../../docs/fern/scripts/gen_kubernetes_api.py HELM_CHART_DIR := ../helm/charts/platform diff --git a/deploy/operator/api/v1alpha1/dynamocomponentdeployment_types.go b/deploy/operator/api/v1alpha1/dynamocomponentdeployment_types.go index f8832fa5c324..044ff3ab4589 100644 --- a/deploy/operator/api/v1alpha1/dynamocomponentdeployment_types.go +++ b/deploy/operator/api/v1alpha1/dynamocomponentdeployment_types.go @@ -78,7 +78,7 @@ type DynamoComponentDeploymentSharedSpec struct { // SubComponentType indicates the sub-role of this component (for example, "prefill"). SubComponentType string `json:"subComponentType,omitempty"` - // RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's + // RuntimeVersionOverride declares the Dynamo runtime version in this component's // main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable // semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is // not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". diff --git a/deploy/operator/api/v1beta1/dynamocomponentdeployment_types.go b/deploy/operator/api/v1beta1/dynamocomponentdeployment_types.go index 082e7d81df3c..cdcbe6165412 100644 --- a/deploy/operator/api/v1beta1/dynamocomponentdeployment_types.go +++ b/deploy/operator/api/v1beta1/dynamocomponentdeployment_types.go @@ -107,7 +107,7 @@ type DynamoComponentDeploymentSharedSpec struct { // +optional ComponentType ComponentType `json:"type,omitempty"` - // RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's + // RuntimeVersionOverride declares the Dynamo runtime version in this component's // main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has // no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the // parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for diff --git a/deploy/operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml b/deploy/operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml index 737b042a2471..a1019fb74e8b 100644 --- a/deploy/operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml +++ b/deploy/operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml @@ -19614,7 +19614,7 @@ spec: x-kubernetes-list-type: map runtimeVersionOverride: description: |- - RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's + RuntimeVersionOverride declares the Dynamo runtime version in this component's main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". @@ -36790,7 +36790,7 @@ spec: x-kubernetes-list-type: map runtimeVersionOverride: description: |- - RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's + RuntimeVersionOverride declares the Dynamo runtime version in this component's main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for diff --git a/deploy/operator/config/crd/bases/nvidia.com_dynamographdeployments.yaml b/deploy/operator/config/crd/bases/nvidia.com_dynamographdeployments.yaml index 8cde37c3d564..cde71bd5c142 100644 --- a/deploy/operator/config/crd/bases/nvidia.com_dynamographdeployments.yaml +++ b/deploy/operator/config/crd/bases/nvidia.com_dynamographdeployments.yaml @@ -20006,7 +20006,7 @@ spec: x-kubernetes-list-type: map runtimeVersionOverride: description: |- - RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's + RuntimeVersionOverride declares the Dynamo runtime version in this component's main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". @@ -37402,7 +37402,7 @@ spec: x-kubernetes-list-type: map runtimeVersionOverride: description: |- - RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's + RuntimeVersionOverride declares the Dynamo runtime version in this component's main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for diff --git a/deploy/operator/internal/features/runtime/doc.go b/deploy/operator/internal/features/runtime/doc.go index efc4630fdc95..e7b24b35fa66 100644 --- a/deploy/operator/internal/features/runtime/doc.go +++ b/deploy/operator/internal/features/runtime/doc.go @@ -4,7 +4,7 @@ */ // Package runtime defines explicit feature gates controlled by the Dynamo -// runtime compatibility version. +// runtime version. // // Runtime gates make rendered defaults stable across operator upgrades. A // runtime version change is the trigger for adopting new defaults, while diff --git a/deploy/operator/internal/runtimeversion/runtimeversion.go b/deploy/operator/internal/runtimeversion/runtimeversion.go index 2961886e3596..eab91c6c48d8 100644 --- a/deploy/operator/internal/runtimeversion/runtimeversion.go +++ b/deploy/operator/internal/runtimeversion/runtimeversion.go @@ -16,7 +16,7 @@ import ( var imageTagPattern = regexp.MustCompile(`^[vV]?(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-((?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$`) -// Version identifies a runtime compatibility version by semver core. +// Version identifies a runtime version by semver core. type Version struct { Major uint64 Minor uint64 @@ -38,7 +38,7 @@ func (v Version) Compare(other Version) int { ) } -// Parse returns the compatibility version represented by an explicit override. +// Parse returns the runtime version represented by an explicit override. func Parse(value string) (Version, error) { version, err := semver.StrictNewVersion(value) if err != nil { @@ -47,7 +47,7 @@ func Parse(value string) (Version, error) { return fromSemver(version), nil } -// ParseImageVersion returns a normalized compatibility version from an image tag. +// ParseImageVersion returns a normalized runtime version from an image tag. func ParseImageVersion(image string) (Version, error) { tag := imageTag(image) if tag == "" { diff --git a/docs/fern/AGENTS.md b/docs/fern/AGENTS.md index a8567931c7b8..a7cfbb5e542f 100644 --- a/docs/fern/AGENTS.md +++ b/docs/fern/AGENTS.md @@ -99,14 +99,14 @@ python3 docs/fern/scripts/gen_python_api.py # writes into gitignored path The full Kubernetes reference has two stages, and the first lives outside `docs/`. `make generate-api-docs` in `deploy/operator/` runs `crd-ref-docs` over the CRD Go types to produce -`pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md`. -`gen_kubernetes_api.py` parses that committed Markdown and renders only `full-api-reference.mdx`. It +`pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md`, then invokes +`gen_kubernetes_api.py` to render `full-api-reference.mdx`. The renderer alone never reads the Go types, so changing a type and rerunning it alone is a no-op — refresh the intermediate first. ```bash -make -C deploy/operator generate-api-docs # Go types -> api-reference-k8s.md -python3 docs/fern/scripts/gen_kubernetes_api.py # that Markdown -> full-api-reference.mdx +make -C deploy/operator generate-api-docs # Go types -> raw Markdown -> full MDX +python3 docs/fern/scripts/gen_kubernetes_api.py # rerender MDX from existing raw Markdown only ``` The `Generated API References` pre-merge job runs the Python/Rust generators in write mode (a diff --git a/docs/fern/pages/developer-guide/advanced-customizations/writing-custom-backends/runtime-containers.md b/docs/fern/pages/developer-guide/advanced-customizations/writing-custom-backends/runtime-containers.md index 041f3feb0e71..29892bc2fe47 100644 --- a/docs/fern/pages/developer-guide/advanced-customizations/writing-custom-backends/runtime-containers.md +++ b/docs/fern/pages/developer-guide/advanced-customizations/writing-custom-backends/runtime-containers.md @@ -72,7 +72,7 @@ ENTRYPOINT ["my-backend"] ## Declare the Runtime Version for Kubernetes When you deploy a custom image with a `DynamoGraphDeployment` (DGD) or standalone -`DynamoComponentDeployment` (DCD), admission determines the Dynamo runtime compatibility version +`DynamoComponentDeployment` (DCD), admission determines the Dynamo runtime version from the component's main-container image tag. The tag itself must be a semantic version. Tags such as `1.5.0`, `v1.5.0`, and `1.5.0-cuda13` can provide the version. Set `runtimeVersionOverride` when the image is tagless, digest-only, uses a tag such as `latest`, diff --git a/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md b/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md index 5023b97435c2..95588aed422b 100644 --- a/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md +++ b/docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md @@ -321,7 +321,7 @@ _Appears in:_ | `serviceName` _string_ | The name of the component | | | | `componentType` _string_ | ComponentType indicates the role of this component (for example, "main"). | | | | `subComponentType` _string_ | SubComponentType indicates the sub-role of this component (for example, "prefill"). | | | -| `runtimeVersionOverride` _string_ | RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's
main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable
semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is
not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0".
It does not change the image. Setting or changing an override that resolves to version 1.5.0 or
later may trigger a rollout. Keep it consistent with the image's runtime version. | | Pattern: `^(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})$`
Optional: \{\}
| +| `runtimeVersionOverride` _string_ | RuntimeVersionOverride declares the Dynamo runtime version in this component's
main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable
semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is
not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0".
It does not change the image. Setting or changing an override that resolves to version 1.5.0 or
later may trigger a rollout. Keep it consistent with the image's runtime version. | | Pattern: `^(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})$`
Optional: \{\}
| | `globalDynamoNamespace` _boolean_ | GlobalDynamoNamespace indicates that the Component will be placed in the global Dynamo namespace | | | | `resources` _[Resources](#resources)_ | Resources requested and limits for this component, including CPU, memory,
GPUs/devices, and any runtime-specific resources. | | | | `autoscaling` _[Autoscaling](#autoscaling)_ | Deprecated: This field is deprecated and ignored. Use DynamoGraphDeploymentScalingAdapter
with HPA, KEDA, or Planner for autoscaling instead. See docs/kubernetes/autoscaling.md
for migration guidance. This field will be removed in a future API version. | | | @@ -367,7 +367,7 @@ _Appears in:_ | `serviceName` _string_ | The name of the component | | | | `componentType` _string_ | ComponentType indicates the role of this component (for example, "main"). | | | | `subComponentType` _string_ | SubComponentType indicates the sub-role of this component (for example, "prefill"). | | | -| `runtimeVersionOverride` _string_ | RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's
main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable
semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is
not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0".
It does not change the image. Setting or changing an override that resolves to version 1.5.0 or
later may trigger a rollout. Keep it consistent with the image's runtime version. | | Pattern: `^(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})$`
Optional: \{\}
| +| `runtimeVersionOverride` _string_ | RuntimeVersionOverride declares the Dynamo runtime version in this component's
main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable
semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is
not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0".
It does not change the image. Setting or changing an override that resolves to version 1.5.0 or
later may trigger a rollout. Keep it consistent with the image's runtime version. | | Pattern: `^(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})$`
Optional: \{\}
| | `globalDynamoNamespace` _boolean_ | GlobalDynamoNamespace indicates that the Component will be placed in the global Dynamo namespace | | | | `resources` _[Resources](#resources)_ | Resources requested and limits for this component, including CPU, memory,
GPUs/devices, and any runtime-specific resources. | | | | `autoscaling` _[Autoscaling](#autoscaling)_ | Deprecated: This field is deprecated and ignored. Use DynamoGraphDeploymentScalingAdapter
with HPA, KEDA, or Planner for autoscaling instead. See docs/kubernetes/autoscaling.md
for migration guidance. This field will be removed in a future API version. | | | @@ -1890,7 +1890,7 @@ _Appears in:_ | `providerOverride` _[ProviderOverride](#provideroverride)_ | providerOverride configures the primary Grove unit representing this DGD
component. With apiVersion `grove.io/v1alpha1`, target is
`PodCliqueTemplateSpec` for a single-node component or
`PodCliqueScalingGroupConfig` for a PCSG-backed component; value may set
only `topologyConstraint`. Standalone DCD OpenAPI omits this field. | | Optional: \{\}
| | `name` _string_ | name is the stable logical identifier for this component within its
DynamoGraphDeployment. It must be unique within the parent's
`spec.components` list.
For standalone DynamoComponentDeployment objects, the defaulting webhook
populates `name` from `metadata.name` on admission, so users
typically do not need to set it explicitly.
`name` is decoupled from the underlying Kubernetes resource name so that
the operator can rename child workloads (e.g. suffixing worker DCDs with
a hash during rolling updates) without losing the stable identity that
downstream consumers (labels, status maps, DGDSA references, planner
RBAC, EPP filters) depend on. | | MaxLength: 63
MinLength: 1
Pattern: `^[A-Za-z0-9]([-A-Za-z0-9]*[A-Za-z0-9])?$`
Required: \{\}
| | `type` _[ComponentType](#componenttype)_ | type indicates the role of this component within a Dynamo graph. Drives
port mapping, frontend detection, planner RBAC, and the pod label
`nvidia.com/dynamo-component-type`. Because `prefill` and `decode` are
first-class values, users can set them directly. | | Enum: [frontend worker prefill decode planner epp]
Optional: \{\}
| -| `runtimeVersionOverride` _string_ | RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's
main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has
no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the
parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for
example "1.4.0". It does not change the image. Setting or changing an override that resolves to
version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. | | Pattern: `^(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})$`
Optional: \{\}
| +| `runtimeVersionOverride` _string_ | RuntimeVersionOverride declares the Dynamo runtime version in this component's
main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has
no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the
parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for
example "1.4.0". It does not change the image. Setting or changing an override that resolves to
version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. | | Pattern: `^(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})$`
Optional: \{\}
| | `globalDynamoNamespace` _boolean_ | globalDynamoNamespace places the component in the global Dynamo
namespace rather than the per-deployment namespace derived from the
DGD name. | | Optional: \{\}
| | `podTemplate` _[PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core)_ | podTemplate defines the component's Pod configuration. New components must
include a container named "main" with a non-empty image. Existing components
created without a podTemplate may remain unchanged. The operator merges
defaults into the main container.
For DGD components whose main image tag is not a Dynamo semantic version,
set runtimeVersionOverride explicitly.
All other containers are user-managed sidecars and must specify their
required fields, including image. | | Optional: \{\}
| | `replicas` _integer_ | replicas is the desired number of Pods for this component. When
`scalingAdapter` is set on this component, this field is managed by
the DynamoGraphDeploymentScalingAdapter and should not be modified
directly. | | Minimum: 0
Optional: \{\}
| @@ -1923,7 +1923,7 @@ _Appears in:_ | `backendFramework` _string_ | backendFramework specifies the backend framework. | | Enum: [sglang vllm trtllm]
| | `name` _string_ | name is the stable logical identifier for this component within its
DynamoGraphDeployment. It must be unique within the parent's
`spec.components` list.
For standalone DynamoComponentDeployment objects, the defaulting webhook
populates `name` from `metadata.name` on admission, so users
typically do not need to set it explicitly.
`name` is decoupled from the underlying Kubernetes resource name so that
the operator can rename child workloads (e.g. suffixing worker DCDs with
a hash during rolling updates) without losing the stable identity that
downstream consumers (labels, status maps, DGDSA references, planner
RBAC, EPP filters) depend on. | | MaxLength: 63
MinLength: 1
Pattern: `^[A-Za-z0-9]([-A-Za-z0-9]*[A-Za-z0-9])?$`
Required: \{\}
| | `type` _[ComponentType](#componenttype)_ | type indicates the role of this component within a Dynamo graph. Drives
port mapping, frontend detection, planner RBAC, and the pod label
`nvidia.com/dynamo-component-type`. Because `prefill` and `decode` are
first-class values, users can set them directly. | | Enum: [frontend worker prefill decode planner epp]
Optional: \{\}
| -| `runtimeVersionOverride` _string_ | RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's
main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has
no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the
parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for
example "1.4.0". It does not change the image. Setting or changing an override that resolves to
version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. | | Pattern: `^(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})$`
Optional: \{\}
| +| `runtimeVersionOverride` _string_ | RuntimeVersionOverride declares the Dynamo runtime version in this component's
main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has
no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the
parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for
example "1.4.0". It does not change the image. Setting or changing an override that resolves to
version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. | | Pattern: `^(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})\.(0\|[1-9][0-9]\{0,3\})$`
Optional: \{\}
| | `globalDynamoNamespace` _boolean_ | globalDynamoNamespace places the component in the global Dynamo
namespace rather than the per-deployment namespace derived from the
DGD name. | | Optional: \{\}
| | `podTemplate` _[PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core)_ | podTemplate defines the component's Pod configuration. New components must
include a container named "main" with a non-empty image. Existing components
created without a podTemplate may remain unchanged. The operator merges
defaults into the main container.
For DGD components whose main image tag is not a Dynamo semantic version,
set runtimeVersionOverride explicitly.
All other containers are user-managed sidecars and must specify their
required fields, including image. | | Optional: \{\}
| | `replicas` _integer_ | replicas is the desired number of Pods for this component. When
`scalingAdapter` is set on this component, this field is managed by
the DynamoGraphDeploymentScalingAdapter and should not be modified
directly. | | Minimum: 0
Optional: \{\}
| diff --git a/docs/fern/pages/reference/kubernetes-api/dynamo-component-deployment.mdx b/docs/fern/pages/reference/kubernetes-api/dynamo-component-deployment.mdx index 46b3e6ce269a..27c36d2b25d7 100644 --- a/docs/fern/pages/reference/kubernetes-api/dynamo-component-deployment.mdx +++ b/docs/fern/pages/reference/kubernetes-api/dynamo-component-deployment.mdx @@ -45,24 +45,36 @@ The DCD spec is `backendFramework` plus the [shared component spec](#shared-comp ### Shared component spec -These fields are shared between a standalone DCD and each entry of a DGD `spec.components` list. In a DGD, prefix them with `spec.components[*]`. +These fields are shared between a standalone DCD and each entry of a DGD `spec.components` list, except where a field is marked DGD-only. In a DGD, prefix them with `spec.components[*]`. + + + Customizes the primary Grove unit for a component embedded in a DGD. Standalone DCD OpenAPI omits this field. Use `apiVersion: grove.io/v1alpha1`; the target is `PodCliqueTemplateSpec` for a component backed by a PodClique or `PodCliqueScalingGroupConfig` for one backed by a scaling group. The `value` may set only `topologyConstraint`. See [ProviderOverride](dynamo-graph-deployment.mdx#provideroverride). + Stable logical identifier for the component, unique within its parent DGD's `spec.components` list. Must match `^[A-Za-z0-9]([-A-Za-z0-9]*[A-Za-z0-9])?$`, 1–63 characters. For a standalone DCD the defaulting webhook populates `name` from `metadata.name`, so you rarely set it explicitly. The name is decoupled from the underlying workload name so the operator can rename child workloads (for example, hash-suffixing worker DCDs during a rolling update) without losing the identity that labels, status maps, scaling adapters, planner RBAC, and EPP filters depend on. - Role of the component within the graph. Drives port mapping, frontend detection, planner RBAC, and the pod label `nvidia.com/dynamo-component-type`. `prefill` and `decode` are first-class values for disaggregated serving and can be set directly. At most one component per graph may be `epp`. + Role of the component within the graph. Drives port mapping, frontend detection, planner RBAC, and the pod label `nvidia.com/dynamo-component-type`. `prefill` and `decode` are first-class values for disaggregated serving and can be set directly. At most one component per graph may be `epp`. Immutable after it is set. Allowed values: frontend worker prefill decode planner epp + + Declares the Dynamo runtime version in the component's `main` image, taking precedence over the image tag. Use canonical `MAJOR.MINOR.PATCH`, for example `"1.4.0"`, with each part between `0` and `9999` and no leading zeros, `v` prefix, prerelease suffix, or build metadata. This field does not change the image. See [Runtime Version Compatibility](#runtime-version-compatibility) for admission requirements and rollout behavior. + + Desired number of complete component instances. For a single-node component, each instance is one pod. For a multinode component, each instance contains all of its roles. Minimum `0`. When `scalingAdapter` is set, this field is owned by the [DynamoGraphDeploymentScalingAdapter](full-api-reference.mdx#dynamographdeploymentscalingadapter) and should not be modified directly. + + Minimum complete component replicas guaranteed to be gang-scheduled before a shortfall triggers gang termination. Supported only for Grove-backed DGD components, where it defaults to `1`; rejected for non-Grove deployments. Minimum `1` and immutable after creation. Positive `replicas` must be at least this value. Scaling to `0` is allowed and retains `minAvailable` for the next scale-up. + + - Pod template for the component's pods. The operator injects its defaults (image, command, env, ports, probes, resources, volume mounts) into the container named `main`, merging your overrides by name. If no `main` container is present, the operator generates one. Every other container is treated as a user-managed sidecar and receives no injected defaults — sidecars must specify their own required fields such as `image`. Replaces the ten separate per-component fields (`resources`, `envs`, `livenessProbe`, and so on) that existed in `v1alpha1`. + Pod template for the component's pods. New components must include a container named `main` with a non-empty `image`; the operator injects command, environment, port, probe, resource, and volume-mount defaults into that container, merging your overrides by name. Existing components created without a main image may retain that omission on unrelated updates. For DGD components whose image has no parseable semantic-version tag, set `runtimeVersionOverride`. Every other container is treated as a user-managed sidecar and receives no injected defaults — sidecars must specify their own required fields such as `image`. Replaces the ten separate per-component fields (`resources`, `envs`, `livenessProbe`, and so on) that existed in `v1alpha1`. core/v1.PodTemplateSpec @@ -89,7 +101,12 @@ These fields are shared between a standalone DCD and each entry of a DGD `spec.c Logical cardinality of the role in one complete component instance. For multinode, admission defaults and persists an omitted value as `leader: 1` or `worker: multinode.nodeCount - 1`; an explicit value must match that fixed shape.
- Provider configuration for the workload unit generated for this role. Available only on components embedded in a DGD; standalone DCD OpenAPI omits this field. + Provider configuration for the workload unit generated for this role. Available only on components embedded in a DGD; standalone DCD OpenAPI omits this field. For Grove multinode leader and worker roles, use target `PodCliqueTemplateSpec`; only `topologyConstraint` is allowed in `value`. Role overrides are not supported for inter-pod GMS components. See [ProviderOverride](dynamo-graph-deployment.mdx#provideroverride). + + + Reserved for role-specific pod configuration. No component type supports this field in this release; admission rejects it. Use the component-level `podTemplate` instead. + + core/v1.PodTemplateSpec @@ -170,6 +187,14 @@ These fields are shared between a standalone DCD and each entry of a DGD `spec.c See: [ExperimentalSpec](#experimentalspec)
+## Runtime Version Compatibility + +DGD admission requires `runtimeVersionOverride` when the `main` image has no parseable semantic-version tag. Also set it when a parseable tag does not represent the Dynamo runtime version in the image. The override must describe the Dynamo runtime actually contained in the image. + +When updating an image to a different Dynamo runtime version, update any configured `runtimeVersionOverride` in the same change, or remove it if the new image tag correctly identifies the runtime version. The operator uses the resolved runtime version to select feature gates that control how it renders the component's PodSpec, including flags, environment variables, and probes. For Dynamo 1.5.0 and later, changing the override alone may change the rendered PodSpec or worker revision and trigger a rollout, even when the image reference is unchanged. Keep the override aligned with the Dynamo runtime actually contained in the image. + +For components generated by a DGDR, an explicit component override takes precedence over the DGDR-level default. See [Profiler image version compatibility](dynamo-graph-deployment-request.mdx#profiler-image-version-compatibility). + ## Status The operator maintains observed state under `status`. @@ -246,6 +271,16 @@ Groups opt-in preview features for a component. Referenced by `experimental`. Ne
+ + Configures experimental Grove workload rendering for a component in a DGD. Requires the Grove pathway. + + + + + When `true`, renders a single-node component as a `PodCliqueScalingGroup` with one single-pod PodClique per replica. The first `minAvailable` replicas join the deployment's base PodGang; each additional replica gets a separate PodGang. `false` or omission retains automatic selection: multinode and inter-pod GMS components use scaling groups, while other single-node components use a PodClique. Immutable after creation. + + + Configures container-image snapshotting and restore for the component. Set `checkpoint.enabled: true` to opt in; omit `checkpointRef` for a DGD-managed automatic checkpoint, or set it to restore a `PodSnapshot` in the same namespace. diff --git a/docs/fern/pages/reference/kubernetes-api/dynamo-graph-deployment-request.mdx b/docs/fern/pages/reference/kubernetes-api/dynamo-graph-deployment-request.mdx index dd5c05e86664..b5c76d62e129 100644 --- a/docs/fern/pages/reference/kubernetes-api/dynamo-graph-deployment-request.mdx +++ b/docs/fern/pages/reference/kubernetes-api/dynamo-graph-deployment-request.mdx @@ -13,7 +13,7 @@ This page documents the `nvidia.com/v1beta1` API — the served, storage version ## Spec reference -Only `model` is required; every other field has a default or is auto-detected. +Only `model` is unconditionally required by the schema. Admission rejects a new DGDR whose supplied `spec.image` has no parseable semantic-version tag unless `spec.runtimeVersionOverride` is set. When `spec.image` is omitted, the operator supplies a versioned default as described below. Model to deploy — a HuggingFace ID (for example `Qwen/Qwen3-0.6B`, `meta-llama/Llama-3-70b`) or a private model name. Must be non-empty. @@ -24,7 +24,9 @@ Only `model` is required; every other field has a default or is auto-detected. - Dynamo runtime version propagated to generated DGD components when `image` has no parseable semantic-version tag or its tag does not identify the intended runtime. + Required when `spec.image` is set and has no parseable semantic-version tag, such as `latest`, a custom build tag, or a digest-only reference. Also supplies the default Dynamo runtime version for generated DGD components that do not set their own override. An explicit component value in `overrides.dgd` takes precedence. Set this when an effective generated component image has no parseable semantic-version tag or its tag does not identify the intended Dynamo runtime. + + Use canonical `MAJOR.MINOR.PATCH`, for example `"1.4.0"`, with each part between `0` and `9999` and no leading zeros, `v` prefix, prerelease suffix, or build metadata. This field does not change any image. See [Profiler image version compatibility](#profiler-image-version-compatibility). @@ -72,7 +74,7 @@ These updates do not modify `status.profilingResults.selectedConfig` or the forbidden after profiling starts. When the DGDR-level field is unset, each effective generated DGD component -follows the DGD component rules independently. An overridden image without a +follows the [component runtime version rules](dynamo-component-deployment.mdx#runtime-version-compatibility) independently. An overridden image without a parseable semantic-version tag requires `runtimeVersionOverride` on that component. diff --git a/docs/fern/pages/reference/kubernetes-api/dynamo-graph-deployment.mdx b/docs/fern/pages/reference/kubernetes-api/dynamo-graph-deployment.mdx index 8f37c5ef3aa6..eea2e16287ec 100644 --- a/docs/fern/pages/reference/kubernetes-api/dynamo-graph-deployment.mdx +++ b/docs/fern/pages/reference/kubernetes-api/dynamo-graph-deployment.mdx @@ -28,6 +28,11 @@ spec: - name: frontend type: frontend replicas: 1 + podTemplate: + spec: + containers: + - name: main + image: nvcr.io/nvidia/ai-dynamo/dynamo-frontend:1.4.0 - name: worker type: worker replicas: 1 @@ -44,6 +49,14 @@ spec: Components deployed as part of this graph. Each entry carries its own stable logical `name` (unique within the list, case-insensitively). Component types are repeatable except `type: epp`, which may appear at most once. Maximum 25 components. For the full per-component field set, see [DCD Reference — Shared component spec](dynamo-component-deployment.mdx#shared-component-spec). + + Each new component must supply a `podTemplate.spec.containers` entry named `main` with a non-empty `image`. For an image without a parseable semantic-version tag, set `spec.components[*].runtimeVersionOverride` to the image's Dynamo runtime version. Also set it when the tag identifies a different version, such as the inference engine's version. See [Runtime Version Compatibility](dynamo-component-deployment.mdx#runtime-version-compatibility). DGD has no graph-level `runtimeVersionOverride`; the DGDR-level field supplies a default when generating components. + + + + Customizes the root resource generated by the selected workload provider. Currently supported only for Grove, with `apiVersion: grove.io/v1alpha1` and target `PodCliqueSet`. The `value` may set only `spec.template.topologyConstraint`. This field cannot select or change the provider. See [ProviderOverride](#provideroverride). + + Backend framework for the graph. Sets backend-specific defaults the operator injects into each component's `main` container. @@ -69,7 +82,7 @@ spec: - Restart policy for the graph. Change `restart.id` to trigger a restart. + Restart policy for the graph. Must be unset on creation; set or change `restart.id` on an existing DGD to trigger a restart. @@ -206,9 +219,40 @@ The operator maintains observed state under `status`.
+ + Scheduler placement score and reporting state. The schema is available, but the controller does not yet populate this field. + + + + + Worst placement score across relevant scheduler placement units. Minimum `0`, maximum `1`; higher is better. Scores are comparable only between DGDs using the same scheduler scoring contract and version. + + + `Reported` means every scored placement unit has a score; `Partial` means only some do. `Unsupported` means the backend exposes no score. `Unknown` means scoring is supported but the current value is indeterminate, and `score` must be absent. + + Allowed values: Reported Partial Unsupported Unknown + + + ## Additional Types -Nested struct types referenced by the status fields above, broken out here to keep the field lists shallow. Types prefixed `core/v1.` or `metav1.` are standard Kubernetes types and link to their Go package documentation instead of being expanded. +Nested struct types referenced by the fields above, broken out here to keep the field lists shallow. Types prefixed `core/v1.` or `metav1.` are standard Kubernetes types and link to their Go package documentation instead of being expanded. + +### ProviderOverride + +A sparse provider-native fragment, supported only for Grove-backed DGD resources. The same shape is used at graph, component, and role scope; the location determines the allowed target. Standalone DCDs do not support provider overrides. + + + Provider schema version. Must be `grove.io/v1alpha1`. + + + + Provider resource or embedded schema. Admission resolves and persists this value when omitted. Graph scope uses `PodCliqueSet`; component scope uses `PodCliqueTemplateSpec` or `PodCliqueScalingGroupConfig` according to the component shape; multinode leader and worker roles use `PodCliqueTemplateSpec`. Other targets are rejected. + + + + Sparse fragment of the target schema. `PodCliqueSet` accepts only `spec.template.topologyConstraint`; `PodCliqueTemplateSpec` and `PodCliqueScalingGroupConfig` accept only `topologyConstraint`. Other fields are rejected. + ### ComponentReplicaStatus @@ -224,6 +268,18 @@ Replica information for a single component, keyed by component name in `status.c Underlying Kubernetes resource names for this Dynamo component. During normal operation this contains a single name; during rolling updates it contains both the old and new resource names. + + Effective Dynamo runtime namespace for the component. Workers may include a generation suffix; non-workers use the base namespace. During a rolling update, worker status retains the old active revision's namespace until cutover completes. + + + + GPUs assigned to one inference engine across all nodes of a component replica, excluding independent auxiliary GPU allocations. A reported `0` means the engine has no GPUs; consult `gpusPerReplica` for auxiliary allocations. Minimum `0`. + + + + Unique GPU allocation added by scaling the component up by one replica, across all nodes, application and initialization phases, and provider-owned pods. Scalar GPUs use the effective Kubernetes pod scheduling footprint; shared DRA claims count once. A reported `0` means a resolved non-GPU allocation; omission means no current shape is available. Minimum `0`. + + Total number of non-terminated replicas. Minimum `0`. @@ -240,6 +296,10 @@ Replica information for a single component, keyed by component name in `status.c Number of available replicas. Populated for `Deployment` and `PodCliqueScalingGroup`; not available for `PodClique` or `LeaderWorkerSet`. Minimum `0`. + + Replicas scheduled by the backend, in complete Dynamo component-replica units rather than raw pod counts. Helps distinguish scheduling shortfalls from runtime readiness. Omitted when the backend cannot report a reliable count; absence means not reported, not zero scheduled. Minimum `0`. + + ### ComponentCheckpointStatus Checkpoint information for a single component, keyed by component name in `status.checkpoints`. diff --git a/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx b/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx index 3dbf22a26d99..9da87d955fdb 100644 --- a/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx +++ b/docs/fern/pages/reference/kubernetes-api/full-api-reference.mdx @@ -385,7 +385,7 @@ SubComponentType indicates the sub-role of this component (for example, "prefill -RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". It does not change the image. Setting or changing an override that resolves to version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. +RuntimeVersionOverride declares the Dynamo runtime version in this component's main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". It does not change the image. Setting or changing an override that resolves to version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. **Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$` Optional: \{\} @@ -552,7 +552,7 @@ SubComponentType indicates the sub-role of this component (for example, "prefill -RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". It does not change the image. Setting or changing an override that resolves to version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. +RuntimeVersionOverride declares the Dynamo runtime version in this component's main image. DGD admission requires it when spec.extraPodSpec.mainContainer.image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". It does not change the image. Setting or changing an override that resolves to version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. **Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$` Optional: \{\} @@ -2628,7 +2628,7 @@ See [ComponentType](#componenttype). -RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". It does not change the image. Setting or changing an override that resolves to version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. +RuntimeVersionOverride declares the Dynamo runtime version in this component's main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". It does not change the image. Setting or changing an override that resolves to version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. **Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$` Optional: \{\} @@ -2737,7 +2737,7 @@ See [ComponentType](#componenttype). -RuntimeVersionOverride declares the Dynamo runtime compatibility version in this component's main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". It does not change the image. Setting or changing an override that resolves to version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. +RuntimeVersionOverride declares the Dynamo runtime version in this component's main image. DGD admission requires it when spec.podTemplate.spec.containers[name=main].image has no parseable semantic-version tag; controller-generated DCDs may omit it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". It does not change the image. Setting or changing an override that resolves to version 1.5.0 or later may trigger a rollout. Keep it consistent with the image's runtime version. **Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$` Optional: \{\} diff --git a/docs/fern/templates/guidelines/kubernetes-api-reference.md b/docs/fern/templates/guidelines/kubernetes-api-reference.md index 0ada203b3b93..ca5280b5b754 100644 --- a/docs/fern/templates/guidelines/kubernetes-api-reference.md +++ b/docs/fern/templates/guidelines/kubernetes-api-reference.md @@ -39,9 +39,9 @@ maximum, or pattern. Confirm those facts against the regenerated full reference ## Generate the Full Reference -The generation pipeline has two explicit stages. +The generation pipeline has two stages. `make -C deploy/operator generate-api-docs` runs both. -### Generate the raw CRD reference +### Generate both reference files Run: @@ -59,13 +59,14 @@ This target: `docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md`. 4. Runs `deploy/operator/docs/fix-api-anchors.py` to disambiguate type anchors shared by multiple API versions and remove known unresolved type links. +5. Runs `docs/fern/scripts/gen_kubernetes_api.py` to render `full-api-reference.mdx`. The footer contains operator-injected defaults and implementation notes that do not come directly from CRD schema types. -### Render the full Fern page +### Rerender the full Fern page -Run: +To rerender MDX from the existing raw Markdown without regenerating it from Go, run: ```bash python3 docs/fern/scripts/gen_kubernetes_api.py @@ -228,7 +229,6 @@ Run the generation and focused tests: ```bash make -C deploy/operator generate-api-docs -python3 docs/fern/scripts/gen_kubernetes_api.py python3 -m pytest -q \ docs/fern/scripts/tests/test_gen_kubernetes_api.py \ docs/fern/scripts/tests/test_api_reference_regressions.py From f3c7c225aa3d1a117b7c1bddefcd98b1772db558 Mon Sep 17 00:00:00 2001 From: Tushar Sharma Date: Mon, 21 Sep 2026 17:19:59 -0700 Subject: [PATCH 143/191] fix(ci): fail test jobs whose pytest stage was cut off mid-run (#14759) Signed-off-by: Tushar Sharma --- .github/actions/pytest-local/action.yml | 17 ++++- .github/workflows/shared-test.yml | 97 +++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) diff --git a/.github/actions/pytest-local/action.yml b/.github/actions/pytest-local/action.yml index 34e07bbf6a0a..d3ce10dead83 100644 --- a/.github/actions/pytest-local/action.yml +++ b/.github/actions/pytest-local/action.yml @@ -176,10 +176,19 @@ runs: # Artifacts go to the GitHub Actions checkout so the per-job upload in # shared-test.yml can find them. TEST_RESULTS_DIR="${GITHUB_WORKSPACE}/test-results" - mkdir -p "${TEST_RESULTS_DIR}" + mkdir -p "${TEST_RESULTS_DIR}/status" chmod 777 "${TEST_RESULTS_DIR}" echo "📁 Test results will be saved to: ${TEST_RESULTS_DIR}" + # Emptied up front so the file read at the end of the job can only have + # come from this run of this stage. Truncated rather than removed: the + # distroless planner test image ships no rm (see the tool list in + # container/Dockerfile.test), and an empty file is the better signal + # anyway - absent means the stage never started, empty means it started + # and was cut off before recording an exit code. + STATUS_FILE="${TEST_RESULTS_DIR}/status/${STR_TEST_TYPE}.exitcode" + : > "${STATUS_FILE}" + # NVMe guard: GPU runners mount ${NVME_DIR} (nvme-scratch emptyDir, NVMe-backed via # instanceStorePolicy: RAID0). CPU/ARM runners have no ${NVME_DIR} mount. if [[ -d "${NVME_DIR}" ]]; then @@ -303,6 +312,12 @@ runs: echo "⚠️ JUnit XML file not found - test results may not be available for upload" fi + # Checked by "Verify test stages completed" in shared-test.yml, which + # cannot use the exit below or $GITHUB_ENV: a truncated script is still + # reported as a successful step and its $GITHUB_ENV writes are dropped. + # Keep this last - its absence is what proves the script was truncated. + echo "${TEST_EXIT_CODE}" > "${STATUS_FILE}" + exit ${TEST_EXIT_CODE} # conftest.py's autouse `logger` fixture writes every test's full root-logger diff --git a/.github/workflows/shared-test.yml b/.github/workflows/shared-test.yml index c0fc2e8af477..40296f984b7d 100644 --- a/.github/workflows/shared-test.yml +++ b/.github/workflows/shared-test.yml @@ -286,6 +286,7 @@ jobs: fi - name: Run CPU-only tests (parallelized) + id: cpu-only-tests if: ${{ inputs.run_cpu_only_tests }} timeout-minutes: ${{ inputs.cpu_only_test_timeout_minutes }} uses: $/.github/actions/pytest-local @@ -301,6 +302,7 @@ jobs: enable_coverage: ${{ inputs.enable_coverage }} gpu_tests: 'false' - name: Run CPU end-to-end tests (isolated) + id: cpu-e2e-tests # Long-lived deployment tests should not compete with the xdist unit # pool or retry until the parent step kills the runner container. if: ${{ !cancelled() && steps.checkout.outcome == 'success' && inputs.run_cpu_e2e_tests }} @@ -319,6 +321,7 @@ jobs: gpu_tests: 'false' dd_flaky_retry_enabled: 'false' - name: Run GPU tests (parallel) + id: gpu-parallel-tests timeout-minutes: ${{ inputs.gpu_test_timeout_minutes }} if: ${{ matrix.platform == 'amd64' && inputs.run_gpu_tests && inputs.run_gpu_parallel_tests }} uses: $/.github/actions/pytest-local @@ -338,6 +341,7 @@ jobs: gpu_tests: 'true' verify_gpu: ${{ inputs.verify_gpu }} - name: Run GPU tests (sequential) + id: gpu-sequential-tests timeout-minutes: ${{ inputs.gpu_test_timeout_minutes }} # !cancelled() so a parallel-stage failure doesn't hide sequential results, # but require checkout to have succeeded so an infra/prereq failure (e.g. the @@ -372,3 +376,96 @@ jobs: path: test-results/pytest_test_report_*.xml retention-days: 7 if-no-files-found: warn + + # A stage cut off mid-run is still reported as a successful step, so real + # test failures go green. Take the verdict only from the status file + # pytest-local writes last, never from the step outcome. Placed after the + # upload so results survive a failure here, and once per job rather than + # per stage to avoid three more container-hook round trips. + - name: Verify test stages completed + if: ${{ !cancelled() && steps.checkout.outcome == 'success' }} + shell: bash + env: + STAGE_OUTCOMES: | + pre_merge_cpu ${{ steps.cpu-only-tests.outcome }} + pre_merge_cpu_e2e ${{ steps.cpu-e2e-tests.outcome }} + pre_merge_gpu_parallel ${{ steps.gpu-parallel-tests.outcome }} + pre_merge_gpu ${{ steps.gpu-sequential-tests.outcome }} + run: | + # Runs inside the job's test container. The planner image is + # distroless and ships only the binaries listed in + # container/Dockerfile.test, so this stays on bash builtins. + set -uo pipefail + status_dir="${GITHUB_WORKSPACE}/test-results/status" + failed=0 + checked="" + + while read -r stage outcome; do + [[ -z "${stage}" ]] && continue + exitcode_file="${status_dir}/${stage}.exitcode" + + case "${outcome}" in + ''|skipped) + # An unresolvable id renders empty, which would otherwise read + # as "skipped" and exempt a stage that really ran. + if [[ -f "${exitcode_file}" ]]; then + echo "❌ ${stage}: wrote a status file but its outcome is" + echo " '${outcome:-}'. Its id in STAGE_OUTCOMES does not" + echo " resolve, so the stage ran unverified." + failed=1 + else + echo "⏭️ ${stage}: did not run" + fi + ;; + success) + if [[ ! -f "${exitcode_file}" ]]; then + echo "❌ ${stage}: reported success but wrote no status file." + echo " Its script did not run to completion, so the result is" + echo " unknown and cannot be treated as a pass." + failed=1 + else + # An empty file means the stage created it on entry and never + # reached the line that records an exit code. read is a + # builtin and returns non-zero on an empty file. + code="" + read -r code < "${exitcode_file}" || true + if [[ -z "${code}" ]]; then + echo "❌ ${stage}: reported success but recorded no exit code." + echo " Its script was cut off mid-run, so the result is" + echo " unknown and cannot be treated as a pass." + failed=1 + elif [[ "${code}" != "0" ]]; then + echo "❌ ${stage}: pytest exited ${code}" + failed=1 + else + echo "✅ ${stage}: pytest exited 0" + fi + fi + ;; + *) + echo "❌ ${stage}: step outcome '${outcome}'" + failed=1 + ;; + esac + checked+=" ${stage}" + done <<< "${STAGE_OUTCOMES}" + + # A stage added above but not listed here would escape this check. + shopt -s nullglob + for f in "${status_dir}"/*.exitcode; do + stage="${f##*/}" + stage="${stage%.exitcode}" + if [[ " ${checked} " != *" ${stage} "* ]]; then + echo "❌ ${stage}: ran but is not listed in STAGE_OUTCOMES, so its" + echo " result is unverified. Add it to this step." + failed=1 + fi + done + + # Without this the checks tab shows only "Process completed with exit + # code 1" and the stage name stays buried in this step's log. + if [[ "${failed}" -ne 0 ]]; then + echo "::error title=Test stage verification failed::A pytest stage did not record a passing result. See this step's log for the stage." + fi + + exit "${failed}" From 7d4c346fa028198dc624881e1a024a0ccff3aceb Mon Sep 17 00:00:00 2001 From: jthomson04 Date: Mon, 21 Sep 2026 18:29:39 -0700 Subject: [PATCH 144/191] fix(mocker): return token IDs from distributed workers (#15148) Signed-off-by: jthomson04 --- lib/llm/src/entrypoint.rs | 4 +++- lib/llm/src/entrypoint/input/endpoint.rs | 24 ++++++------------- tests/router/test_mocker_output_replay_e2e.py | 8 +++++-- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/lib/llm/src/entrypoint.rs b/lib/llm/src/entrypoint.rs index cdbd80f5f18f..c1924d20fec8 100644 --- a/lib/llm/src/entrypoint.rs +++ b/lib/llm/src/entrypoint.rs @@ -103,7 +103,9 @@ pub enum EngineConfig { model: Box, }, - /// A Tokens engine receives tokens, expects to be wrapped with pre/post processors that handle tokenization. + /// A token engine receives preprocessed requests and emits raw engine output. + /// Distributed endpoints forward that output; standalone HTTP, gRPC, and + /// interactive inputs apply local pre/post-processing. InProcessTokens { engine: ExecutionContext, model: Box, diff --git a/lib/llm/src/entrypoint/input/endpoint.rs b/lib/llm/src/entrypoint/input/endpoint.rs index 32e5b627de95..eeb458d31590 100644 --- a/lib/llm/src/entrypoint/input/endpoint.rs +++ b/lib/llm/src/entrypoint/input/endpoint.rs @@ -4,11 +4,11 @@ use std::{future::Future, pin::Pin, sync::Arc}; use crate::{ - backend::{Backend, ExecutionContext}, + backend::ExecutionContext, engines::StreamingEngineAdapter, first_token::{FirstTokenNotifier, FirstTokenSource}, model_type::{ModelInput, ModelType}, - preprocessor::{BackendOutput, PreprocessedRequest}, + preprocessor::PreprocessedRequest, types::{ Annotated, openai::chat_completions::{ @@ -20,8 +20,8 @@ use crate::{ use dynamo_runtime::engine::AsyncEngineStream; use dynamo_runtime::pipeline::{ - AsyncEngine, AsyncEngineContextProvider, Context, Error, ManyOut, Operator, ResponseStream, - SegmentSource, ServiceBackend, SingleIn, Source, async_trait, network::Ingress, + AsyncEngine, AsyncEngineContextProvider, Context, Error, ManyOut, ResponseStream, SingleIn, + async_trait, network::Ingress, }; use dynamo_runtime::{DistributedRuntime, protocols::EndpointId}; use futures::StreamExt; @@ -140,19 +140,9 @@ pub async fn run( None => engine, }; - // Pre-processing is done ingress-side, so it should be already done. - let frontend = SegmentSource::< - SingleIn, - ManyOut>, - >::new(); - let backend = Backend::from_mdc(model.card()).into_operator(); - let engine = ServiceBackend::from_engine(inner_engine); - let pipeline = frontend - .link(backend.forward_edge())? - .link(engine)? - .link(backend.backward_edge())? - .link_terminal(frontend)?; - let ingress = Ingress::for_pipeline(pipeline)?; + // The frontend owns tokenization and detokenization. Send raw engine + // output so distributed token workers exercise that same path. + let ingress = Ingress::for_engine(inner_engine)?; // The disaggregation role is carried by `worker_type`, not // `model_type`. Prefill workers register with an empty diff --git a/tests/router/test_mocker_output_replay_e2e.py b/tests/router/test_mocker_output_replay_e2e.py index c36f2f2d4edb..d8583f9a7d64 100644 --- a/tests/router/test_mocker_output_replay_e2e.py +++ b/tests/router/test_mocker_output_replay_e2e.py @@ -74,6 +74,10 @@ async def _collect_output_token_ids( if not isinstance(response, dict): continue + # Distributed workers leave detokenization to the frontend. + assert response.get("text") is None, response + assert response.get("tokens") is None, response + token_ids = response.get("token_ids") if isinstance(token_ids, list): output_token_ids.extend(token_ids) @@ -181,8 +185,8 @@ def test_mocker_output_replay_generate_from_request_multi_turn( replay_trace_path = tmp_path / "response-replay.jsonl" # The final generated token does not have KV yet. Generate one extra token # so the first full output block is actually cached for the next turn. - first_output_token_ids = list(range(200_001, 200_001 + BLOCK_SIZE + 1)) - second_output_token_ids = [300_001, 300_002, 300_003, 300_004] + first_output_token_ids = list(range(1000, 1000 + BLOCK_SIZE + 1)) + second_output_token_ids = [2000, 2001, 2002, 2003] _write_response_replay_trace( replay_trace_path, [ From 07caf939988cfd4021e78c03aa934b34053af687 Mon Sep 17 00:00:00 2001 From: Pei Li Date: Mon, 21 Sep 2026 20:13:57 -0700 Subject: [PATCH 145/191] feat(router): bind subagents under their parent session's group (#14521) Signed-off-by: Pei Li Co-authored-by: Claude Fable 5.1 --- .../router/configuration-and-tuning.md | 6 + lib/llm/src/kv_router/routing_host.rs | 27 ++- lib/llm/src/kv_router/routing_host/tests.rs | 194 +++++++++++++++++- lib/llm/src/session_affinity/mod.rs | 9 + lib/llm/src/session_affinity/tests.rs | 19 +- 5 files changed, 252 insertions(+), 3 deletions(-) diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md index 08026aa76981..d93b3a217a68 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md @@ -270,6 +270,12 @@ The first successfully dispatched request binds the session ID to its selected w | `hard` | Default. Exact-dispatch to the stored target. If the worker or rank is no longer valid, invalidate the binding and retry normal selection once | | `soft` | Pass the stored target through the normal selection pipeline as an advisory target. The built-in selector retains it while eligible; a custom policy can choose another worker | +**Experimental.** Available since v1.6. When session affinity is enabled (`--router-session-affinity-ttl-secs`), a request that carries a parent session id binds under an internal key derived from that parent id instead of its own session, so the subagents of one parent share a binding while the parent keeps its own. Dynamo's affinity coordinator owns that binding: it commits only after a successful dispatch, is version-checked against concurrent updates, expires on the same TTL, and counts against the same global entry limit as any session binding. A request that carries an explicit worker target stays on its own session, so it is neither rejected against the group nor able to move it. Under the default `hard` mode the group is pinned to its first worker and does not migrate because of load; the binding resets only when the target becomes unusable or dispatch fails. + +One behavior is known and unresolved: because siblings share one binding, a concurrent fan-out waits for the first sibling's dispatch to commit before the others are placed. + +Dynamo resolves the parent session id from the agent headers it already recognizes (`X-Dynamo-Parent-Session-ID`, `x-claude-code-parent-agent-id`, `x-codex-parent-thread-id`, `x-parent-session-id`). On a backend that routes again internally the group can still split across ranks: with TensorRT-LLM's `attention_dp_config.kv_cache_routing_conversation_affinity` enabled, set `--conversation-affinity-dp-rank-source dynamo` so the attention-DP rank Dynamo selects is the one the engine records. + For soft affinity, Dynamo commits a changed binding after dispatch returns a response stream. Selection, setup, or dispatch failure before that point leaves the old binding intact. A later stream error or cancellation does not roll back the rebind. Explicit request targets remain exact in both modes. ```bash diff --git a/lib/llm/src/kv_router/routing_host.rs b/lib/llm/src/kv_router/routing_host.rs index a9f259d7c3ea..f7648ee73829 100644 --- a/lib/llm/src/kv_router/routing_host.rs +++ b/lib/llm/src/kv_router/routing_host.rs @@ -41,7 +41,7 @@ use crate::{ }, session_affinity::{ AffinityCoordinator, AffinityTarget, Hold, SessionAffinityMode, affinity_id, - explicit_target, from_table, invalid_argument, + explicit_target, from_table, invalid_argument, subagent_group_affinity_id, }, }; @@ -583,6 +583,28 @@ impl RoutingHost { } } + /// The group key for a subagent: a request that carries a parent session id binds under the + /// parent's group instead of its own session, so siblings share a worker while the parent + /// keeps its own binding. An explicit per-request target stays on the request's own session so + /// it cannot be rejected against, or rebind, the group. + fn group_binding_id( + &self, + request: &SingleIn, + explicit: Option, + ) -> Option> { + if explicit.is_some() { + return None; + } + let parent_session_id = request + .content() + .agent_context + .as_ref() + .and_then(|context| context.parent_session_id.as_deref())?; + Some(Arc::new(SessionAffinityId::new( + subagent_group_affinity_id(parent_session_id), + ))) + } + /// Commit a held session to the dispatched worker; a request without a /// session passes its stream through. fn bind_affinity( @@ -709,6 +731,9 @@ impl RoutingHost { return Ok((select(None).await?, None)); }; let explicit = explicit_target(request.content(), phase)?; + let session_id = self + .group_binding_id(request, explicit) + .unwrap_or(session_id); if is_query_only { let target = affinity.query_target(&session_id, explicit)?; return Ok((select(target).await?, None)); diff --git a/lib/llm/src/kv_router/routing_host/tests.rs b/lib/llm/src/kv_router/routing_host/tests.rs index 25eaa3eb288f..fe0c2e535dab 100644 --- a/lib/llm/src/kv_router/routing_host/tests.rs +++ b/lib/llm/src/kv_router/routing_host/tests.rs @@ -41,7 +41,7 @@ use crate::{ lora::{LoraReplicaConfig, LoraRoutingTable, LoraStateTracker}, migration::Migration, protocols::common::{ - extensions::{SESSION_AFFINITY_CONTEXT_KEY, SessionAffinityId}, + extensions::{AgentContextBuilder, SESSION_AFFINITY_CONTEXT_KEY, SessionAffinityId}, preprocessor::{MmRoutingInfo, RoutingHints}, timing::RequestTracker, }, @@ -3969,3 +3969,195 @@ async fn explicit_worker_disappearing_after_preview_is_not_revalidated() { drop(host); runtime.shutdown(); } + +fn subagent_request( + session_id: &str, + parent_session_id: Option<&str>, +) -> SingleIn { + let mut agent_context = AgentContextBuilder::default(); + agent_context.session_id(session_id.to_string()); + if let Some(parent_session_id) = parent_session_id { + agent_context.parent_session_id(parent_session_id.to_string()); + } + let mut content = request(); + content.agent_context = Some(agent_context.build().unwrap()); + let mut request = Context::new(content); + request.insert( + SESSION_AFFINITY_CONTEXT_KEY, + SessionAffinityId::new(session_id), + ); + request +} + +fn parent_group_id(parent_session_id: &str) -> SessionAffinityId { + SessionAffinityId::new(crate::session_affinity::subagent_group_affinity_id( + parent_session_id, + )) +} + +async fn affinity_mode_host(namespace: &str) -> (Runtime, RoutingHost) { + let runtime = Runtime::from_current().unwrap(); + let distributed = DistributedRuntime::new(runtime.clone(), DistributedConfig::process_local()) + .await + .unwrap(); + let endpoint = distributed + .namespace(namespace.to_string()) + .unwrap() + .component("workers".to_string()) + .unwrap() + .endpoint("generate".to_string()); + let client = endpoint.client().await.unwrap(); + endpoint.register_endpoint_instance().await.unwrap(); + client.wait_for_instances().await.unwrap(); + let load_context = test_load_context(&client).await; + let inner = PushRouter::from_client(client, RouterMode::RoundRobin) + .await + .unwrap(); + let coordinator = AffinityCoordinator::new( + Duration::from_secs(60), + crate::session_affinity::SessionAffinityMode::Hard, + ) + .unwrap(); + let host = + RoutingHost::new_builtin_with_coordinator(inner, load_context, Some(coordinator)).unwrap(); + (runtime, host) +} + +#[tokio::test] +#[serial_test::serial] +async fn parent_group_binding_resolves_siblings_to_one_key() { + let (runtime, host) = affinity_mode_host("subagent-group-binding").await; + + let key = |request: &SingleIn| { + host.group_binding_id(request, None) + .unwrap_or_else(|| { + crate::session_affinity::affinity_id(request) + .unwrap() + .unwrap() + }) + .as_str() + .to_string() + }; + + let sibling_a = key(&subagent_request("child-1", Some("parent-1"))); + let sibling_b = key(&subagent_request("child-2", Some("parent-1"))); + let other_parent = key(&subagent_request("child-3", Some("parent-2"))); + let main_agent = key(&subagent_request("parent-1", None)); + + assert_eq!(sibling_a, sibling_b); + assert_ne!(sibling_a, other_parent); + assert_ne!(sibling_a, main_agent); + assert_eq!(main_agent, "parent-1"); + + runtime.shutdown(); +} + +#[tokio::test] +#[serial_test::serial] +async fn parent_group_binding_offers_siblings_the_committed_worker() { + let workers = [7u64, 9] + .into_iter() + .map(|worker_id| (worker_id, ModelRuntimeConfig::default())) + .collect(); + let (router, runtime) = + router_with_worker_configs(Some(Duration::from_secs(60)), workers).await; + + let offered = async |request: &SingleIn| { + router + .select_with_session_affinity( + request, + RequestPhase::Aggregated, + false, + &CleanupBudget::default(), + |target| std::future::ready(Ok(target)), + ) + .await + .unwrap() + }; + + let first = subagent_request("child-1", Some("parent-1")); + let (offered_first, hold) = offered(&first).await; + assert_eq!(offered_first, None, "a new group starts unbound"); + let mut stream = router + .bind_affinity( + hold, + AffinityTarget::new(7, Some(0)), + ResponseStream::new( + Box::pin(stream::iter([Annotated::from_data( + LLMEngineOutput::default(), + )])), + first.context(), + ), + ) + .unwrap(); + while stream.next().await.is_some() {} + + let sibling = subagent_request("child-2", Some("parent-1")); + let (offered_sibling, _) = offered(&sibling).await; + assert_eq!(offered_sibling, Some(AffinityTarget::new(7, Some(0)))); + + let other_parent = subagent_request("child-3", Some("parent-2")); + let (offered_other, _) = offered(&other_parent).await; + assert_eq!( + offered_other, None, + "a different parent is a different group" + ); + + runtime.shutdown(); +} + +#[tokio::test] +#[serial_test::serial] +async fn hard_parent_group_recovers_when_the_bound_worker_leaves() { + let workers = [7u64, 9] + .into_iter() + .map(|worker_id| (worker_id, ModelRuntimeConfig::default())) + .collect(); + let (router, runtime) = + router_with_worker_configs(Some(Duration::from_secs(60)), workers).await; + let affinity = router.affinity.as_ref().unwrap(); + let group = parent_group_id("parent-1"); + + let Hold::Initialize(initializer) = affinity.acquire(&group, None).await.unwrap() else { + panic!("the first subagent must initialize the group"); + }; + drop( + initializer + .commit(crate::session_affinity::to_table(AffinityTarget::new( + 7, + Some(0), + ))) + .unwrap(), + ); + assert_eq!( + affinity.query_target(&group, None).unwrap(), + Some(AffinityTarget::new(7, Some(0))) + ); + + // Worker 7 leaves the pool. Hard mode must invalidate the dead pin and retry unbound rather + // than fail every sibling until the TTL expires. + router.inner.client.override_discovered_instances(vec![9]); + router.inner.client.override_instance_avail(vec![9]); + let sibling = subagent_request("child-2", Some("parent-1")); + let (selected, operation) = router + .select_with_session_affinity( + &sibling, + RequestPhase::Aggregated, + false, + &CleanupBudget::default(), + |target: Option| { + // The dead pin is rejected at dispatch time; the unbound retry is accepted. + std::future::ready(match target { + Some(target) if target.worker_id == 7 => Err(anyhow::anyhow!("worker gone")), + other => Ok(other), + }) + }, + ) + .await + .unwrap(); + assert_eq!(selected, None, "the retry runs unbound"); + assert!(matches!(operation, Some(Hold::Initialize(_)))); + assert_eq!(affinity.query_target(&group, None).unwrap(), None); + + runtime.shutdown(); +} diff --git a/lib/llm/src/session_affinity/mod.rs b/lib/llm/src/session_affinity/mod.rs index b0dd066ec75f..db66e3e14bc1 100644 --- a/lib/llm/src/session_affinity/mod.rs +++ b/lib/llm/src/session_affinity/mod.rs @@ -20,6 +20,15 @@ pub use dynamo_kv_router::services::selection::affinity::{ pub type LlmResponse = crate::types::Annotated; +/// The binding key for the subagents of one parent session. +/// +/// The `\u{1}` prefix cannot appear in an HTTP header value, so no client can claim this key as +/// its own session id; the constant length keeps a long parent id from overflowing the limit. +pub(crate) fn subagent_group_affinity_id(parent_session_id: &str) -> String { + let digest = blake3::hash(parent_session_id.as_bytes()); + format!("\u{1}sg:{}", digest.to_hex()) +} + pub(crate) async fn create_affinity_coordinator( ttl: Option, mode: SessionAffinityMode, diff --git a/lib/llm/src/session_affinity/tests.rs b/lib/llm/src/session_affinity/tests.rs index 0a19f68c90a8..496c5f2c889c 100644 --- a/lib/llm/src/session_affinity/tests.rs +++ b/lib/llm/src/session_affinity/tests.rs @@ -15,7 +15,7 @@ use super::SessionAffinityMode::{Hard, Soft}; use super::{ AffinityCoordinator, AffinityTarget, Hold, LlmResponse, affinity_id, coordinator::{ReplicaApplyOutcome, tracked_stream}, - explicit_target, to_table, + explicit_target, subagent_group_affinity_id, to_table, }; use crate::{ preprocessor::PreprocessedRequest, @@ -27,6 +27,7 @@ use crate::{ }, types::Annotated, }; +use dynamo_kv_router::services::selection::affinity::MAX_SESSION_AFFINITY_ID_BYTES; fn session_id() -> SessionAffinityId { SessionAffinityId::new("session-1") @@ -875,3 +876,19 @@ async fn session_affinity_completion_restores_expired_remote_binding() { Some(replicated_target) ); } + +#[test] +fn a_subagent_group_id_is_namespaced_and_fixed_size() { + let a = subagent_group_affinity_id("parent-1"); + let b = subagent_group_affinity_id("parent-1"); + let c = subagent_group_affinity_id("parent-2"); + assert_eq!(a, b); + assert_ne!(a, c); + assert!( + a.starts_with("\u{1}sg:"), + "the key must be un-claimable via a header value" + ); + let long = subagent_group_affinity_id(&"p".repeat(10_000)); + assert_eq!(long.len(), a.len()); + assert!(long.len() <= MAX_SESSION_AFFINITY_ID_BYTES); +} From 00207840f88a89401669b258a00a1c5a43228143 Mon Sep 17 00:00:00 2001 From: jthomson04 Date: Mon, 21 Sep 2026 20:15:11 -0700 Subject: [PATCH 146/191] test(bindings): remove cancellation test timing races (#14974) Signed-off-by: jthomson04 --- .../tests/cancellation/test_cancellation.py | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/lib/bindings/python/tests/cancellation/test_cancellation.py b/lib/bindings/python/tests/cancellation/test_cancellation.py index 9171e015b6ac..7dd06a02b007 100644 --- a/lib/bindings/python/tests/cancellation/test_cancellation.py +++ b/lib/bindings/python/tests/cancellation/test_cancellation.py @@ -11,6 +11,7 @@ pytest.mark.gpu_0, pytest.mark.pre_merge, pytest.mark.unit, + pytest.mark.timeout(30), ] @@ -23,6 +24,7 @@ def __init__(self): self.context_is_stopped = False self.context_is_killed = False self.context_metadata: dict[str, str] = {} + self.context_cancelled = asyncio.Event() async def generate(self, request, context): print("################## generate called ######################") @@ -53,6 +55,7 @@ async def _generate_until_context_cancelled(self, request, context): self.context_is_stopped = True self.context_is_killed = context.is_killed() self.context_metadata = dict(context.metadata.items()) + self.context_cancelled.set() raise asyncio.CancelledError if context.is_killed(): @@ -60,6 +63,7 @@ async def _generate_until_context_cancelled(self, request, context): self.context_is_stopped = context.is_stopped() self.context_is_killed = True self.context_metadata = dict(context.metadata.items()) + self.context_cancelled.set() raise asyncio.CancelledError await asyncio.sleep(0.1) @@ -83,6 +87,7 @@ async def _generate_until_context_cancelled_with_metadata(self, request, context self.context_is_stopped = True self.context_is_killed = context.is_killed() self.context_metadata = dict(context.metadata.items()) + self.context_cancelled.set() raise asyncio.CancelledError if context.is_killed(): @@ -90,6 +95,7 @@ async def _generate_until_context_cancelled_with_metadata(self, request, context self.context_is_stopped = context.is_stopped() self.context_is_killed = True self.context_metadata = dict(context.metadata.items()) + self.context_cancelled.set() raise asyncio.CancelledError await asyncio.sleep(0.1) @@ -221,8 +227,7 @@ async def test_client_context_cancel(temp_file_store, server, client): iteration_count += 1 - # Give server a moment to process the cancellation - await asyncio.sleep(0.2) + await asyncio.wait_for(handler.context_cancelled.wait(), timeout=5) # Verify server detected the cancellation assert handler.context_is_stopped @@ -256,7 +261,7 @@ async def test_client_context_cancel_preserves_metadata( iteration_count += 1 - await asyncio.sleep(0.2) + await asyncio.wait_for(handler.context_cancelled.wait(), timeout=5) assert handler.context_is_stopped assert not handler.context_is_killed @@ -350,6 +355,18 @@ async def test_server_raise_cancelled(temp_file_store, server, client): assert not handler.context_is_killed +async def _wait_for_cancelled_request(request, handler): + stream = await request + # Cancellation propagates asynchronously, so responses can arrive before it completes. + try: + async for _ in stream: + pass + except ValueError as error: + if str(error) != "Cancelled: CancelledError": + raise + await handler.context_cancelled.wait() + + @pytest.mark.forked @pytest.mark.asyncio @pytest.mark.parametrize("request_plane", ["nats", "tcp"], indirect=True) @@ -358,15 +375,8 @@ async def test_client_context_already_cancelled(temp_file_store, server, client) context = Context() context.stop_generating() # TODO: (DIS-830) The outgoing call should raise if context is cancelled - stream = await client.generate("_generate_until_context_cancelled", context=context) - - async for _ in stream: - raise AssertionError( - "Request should be cancelled before any responses are generated" - ) - - # Give server a moment to update status - await asyncio.sleep(0.2) + request = client.generate("_generate_until_context_cancelled", context=context) + await asyncio.wait_for(_wait_for_cancelled_request(request, handler), timeout=5) # Verify server context cancellation status assert handler.context_is_stopped @@ -384,15 +394,7 @@ async def test_client_context_cancel_before_await_request( request = client.generate("_generate_until_context_cancelled", context=context) context.stop_generating() # TODO: (DIS-830) The outgoing call should raise if context is cancelled - stream = await request - - async for _ in stream: - raise AssertionError( - "Request should be cancelled before any responses are generated" - ) - - # Give server a moment to update status - await asyncio.sleep(0.2) + await asyncio.wait_for(_wait_for_cancelled_request(request, handler), timeout=5) # Verify server context cancellation status assert handler.context_is_stopped From da27aa78dcadbb2239273cd9b4c0a0167e14b507 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Mon, 21 Sep 2026 21:48:39 -0700 Subject: [PATCH 147/191] fix(frontend): complete tool calls after early finish (#15129) Signed-off-by: Biswa Panda --- .../protocols/anthropic/stream_converter.rs | 400 ++++++++++++++++-- 1 file changed, 372 insertions(+), 28 deletions(-) diff --git a/lib/llm/src/protocols/anthropic/stream_converter.rs b/lib/llm/src/protocols/anthropic/stream_converter.rs index 625126190595..7e7d33118df2 100644 --- a/lib/llm/src/protocols/anthropic/stream_converter.rs +++ b/lib/llm/src/protocols/anthropic/stream_converter.rs @@ -46,6 +46,7 @@ pub struct AnthropicStreamConverter { // Tool call tracking tool_call_states: Vec, tool_blocks_flushed: bool, + tool_flush_requested: bool, // Block index counter next_block_index: u32, // Stop reason @@ -64,6 +65,8 @@ struct ToolCallState { /// every `input_json_delta` with the final token count. Snapshotting per /// fragment preserves the per-chunk cumulative count instead. argument_fragments: Vec<(String, AnthropicUsage)>, + has_emitted: bool, + needs_flush: bool, } impl ToolCallState { @@ -96,6 +99,7 @@ impl AnthropicStreamConverter { saw_backend_usage: false, tool_call_states: Vec::new(), tool_blocks_flushed: false, + tool_flush_requested: false, next_block_index: 0, stop_reason: None, } @@ -142,10 +146,16 @@ impl AnthropicStreamConverter { backend_id: String::new(), name: String::new(), argument_fragments: Vec::new(), + has_emitted: false, + needs_flush: false, }); } let state = &mut self.tool_call_states[tool_call_index]; + if state.has_emitted || self.tool_blocks_flushed { + return; + } + state.needs_flush = true; if let Some(id) = &tool_call.id { state.backend_id = id.clone(); } @@ -169,11 +179,12 @@ impl AnthropicStreamConverter { #[allow(clippy::type_complexity)] fn drain_buffered_tool_events( &mut self, + is_final: bool, ) -> Vec<(&'static str, AnthropicStreamEvent, Option)> { if self.tool_blocks_flushed { return Vec::new(); } - self.tool_blocks_flushed = true; + self.tool_blocks_flushed = is_final; let mut events = Vec::new(); let mut block_index = self.next_block_index; @@ -186,28 +197,38 @@ impl AnthropicStreamConverter { // call and must not make an earlier ready call look like the truncation target. let last_call = self.tool_call_states.len().checked_sub(1); + let mut has_emitted = self.tool_call_states.iter().any(|call| call.has_emitted); let call_limit = if self .api_context .as_ref() .is_some_and(|ctx| ctx.disable_parallel_tool_use) { - 1 + usize::from(!has_emitted) } else { usize::MAX }; for (call_index, tool_call) in self .tool_call_states - .iter() + .iter_mut() .enumerate() .filter(|(_, tool_call)| tool_call.is_emit_ready()) .take(call_limit) + .filter(|(_, tool_call)| !tool_call.has_emitted && (is_final || tool_call.needs_flush)) { let raw: String = tool_call .argument_fragments .iter() .map(|(arguments, _)| arguments.as_str()) .collect(); + // While the stream is live, a call whose arguments have not started yet is + // indistinguishable from a parameterless call. Emitting it now would close + // the block and discard the fragments that follow, so leave it pending and + // let the final drain decide. + if !is_final && raw.is_empty() { + continue; + } + tool_call.needs_flush = false; let arguments_are_valid = if raw.is_empty() { // An empty argument string is valid for a completed call, but at a // token-limit finish it means generation stopped immediately after @@ -216,7 +237,8 @@ impl AnthropicStreamConverter { } else { serde_json::from_str::(&raw).is_ok() }; - let repair = truncated && Some(call_index) == last_call && !arguments_are_valid; + let repair = + is_final && truncated && Some(call_index) == last_call && !arguments_are_valid; let repaired_input = repair .then(|| super::types::tool_use_input(&tool_call.name, &raw, true)) .flatten(); @@ -277,13 +299,13 @@ impl AnthropicStreamConverter { None, )); block_index += 1; + tool_call.has_emitted = true; + has_emitted = true; } // Mirrors `chat_completion_to_anthropic_response`: telling the client to run a // tool while emitting no `tool_use` block leaves a turn it cannot send back. - if block_index == self.next_block_index - && self.stop_reason == Some(AnthropicStopReason::ToolUse) - { + if is_final && !has_emitted && self.stop_reason == Some(AnthropicStopReason::ToolUse) { tracing::warn!( "every tool_use block was suppressed; reporting end_turn instead of tool_use" ); @@ -294,8 +316,12 @@ impl AnthropicStreamConverter { events } - fn append_buffered_tool_events(&mut self, events: &mut Vec>) { - for (event_type, event, usage_override) in self.drain_buffered_tool_events() { + fn append_buffered_tool_events( + &mut self, + events: &mut Vec>, + is_final: bool, + ) { + for (event_type, event, usage_override) in self.drain_buffered_tool_events(is_final) { // Route through serialize_event so tool-argument `content_block_delta` // chunks also carry the per-chunk usage triple. Fragments carry the // snapshot taken when their chunk was processed; everything else uses @@ -435,13 +461,12 @@ impl AnthropicStreamConverter { // of this call (record_usage / the fallback above already ran). let usage_snapshot = self.usage.clone(); - let mut should_flush_tool_blocks = false; for choice in &chunk.inner.choices { let delta = &choice.delta; // Track finish reason if let Some(ref fr) = choice.finish_reason { - should_flush_tool_blocks |= matches!( + self.tool_flush_requested |= matches!( fr, dynamo_protocols::types::FinishReason::ToolCalls | dynamo_protocols::types::FinishReason::FunctionCall @@ -591,8 +616,8 @@ impl AnthropicStreamConverter { // `Stop` to `ToolCalls` after emitting tool-call chunks; interrupted // `Length`/`ContentFilter` streams use the EOF fallback below. Flush only // after every choice and delta in the terminal chunk has been recorded. - if should_flush_tool_blocks { - self.append_buffered_tool_events(events); + if self.tool_flush_requested && self.stop_reason == Some(AnthropicStopReason::ToolUse) { + self.append_buffered_tool_events(events, false); } } @@ -631,7 +656,7 @@ impl AnthropicStreamConverter { // EOF remains a fallback for backends that omit a terminal finish reason. // If a finish chunk already flushed these blocks, this is a no-op. - self.append_buffered_tool_events(events); + self.append_buffered_tool_events(events, true); // Emit message_delta with stop_reason and real token usage from engine let message_delta = AnthropicStreamEvent::MessageDelta { @@ -753,12 +778,11 @@ impl AnthropicStreamConverter { let usage_snapshot = self.usage.clone(); - let mut should_flush_tool_blocks = false; for choice in &chunk.inner.choices { let delta = &choice.delta; if let Some(ref fr) = choice.finish_reason { - should_flush_tool_blocks |= matches!( + self.tool_flush_requested |= matches!( fr, dynamo_protocols::types::FinishReason::ToolCalls | dynamo_protocols::types::FinishReason::FunctionCall @@ -889,8 +913,8 @@ impl AnthropicStreamConverter { // Keep this test path aligned with `process_chunk`: normal tool-call // streams carry a tool-call finish reason, while interrupted streams use // the EOF fallback in `emit_end_events_tagged`. - if should_flush_tool_blocks { - for (event_type, event, _usage) in self.drain_buffered_tool_events() { + if self.tool_flush_requested && self.stop_reason == Some(AnthropicStopReason::ToolUse) { + for (event_type, event, _usage) in self.drain_buffered_tool_events(false) { events.push(make_tagged_event(event_type, &event)); } } @@ -926,7 +950,7 @@ impl AnthropicStreamConverter { } // EOF fallback; a finish-triggered drain leaves no events here. - for (event_type, event, _usage) in self.drain_buffered_tool_events() { + for (event_type, event, _usage) in self.drain_buffered_tool_events(true) { events.push(make_tagged_event(event_type, &event)); } @@ -1051,6 +1075,321 @@ mod tests { .collect() } + async fn sse_values(events: Vec>) -> Vec { + use axum::response::{IntoResponse, Sse}; + + let body = Sse::new(futures::stream::iter(events)) + .into_response() + .into_body(); + let bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap(); + std::str::from_utf8(&bytes) + .unwrap() + .lines() + .filter_map(|line| line.strip_prefix("data: ")) + .map(|data| serde_json::from_str(data).unwrap()) + .collect() + } + + #[rstest::rstest] + #[case(FinishReason::ToolCalls)] + #[case(FinishReason::FunctionCall)] + #[tokio::test] + async fn test_early_finish_waits_for_complete_arguments(#[case] reason: FinishReason) { + let mut conv = AnthropicStreamConverter::new("test-model".into(), 5); + let mut events = Vec::new(); + for chunk in [ + tool_call_chunk(0, Some("call_1"), Some("read_file"), Some("")), + tool_call_chunk(0, None, None, Some("{\"path\":")), + finish_chunk(reason), + tool_call_chunk(0, None, None, Some("\"/tmp/example")), + finish_chunk(reason), + ] { + conv.append_chunk_events(&chunk, &mut events); + assert!(events.is_empty()); + } + + conv.append_chunk_events( + &tool_call_chunk(0, None, None, Some(".txt\"}")), + &mut events, + ); + let values = sse_values(events).await; + assert_eq!( + values + .iter() + .map(|v| v["type"].as_str().unwrap()) + .collect::>(), + [ + "content_block_start", + "content_block_delta", + "content_block_delta", + "content_block_delta", + "content_block_delta", + "content_block_stop" + ] + ); + assert!(values.iter().all(|v| v["index"] == 0)); + assert_eq!(values[0]["content_block"]["name"], "read_file"); + assert!( + values[0]["content_block"]["id"] + .as_str() + .unwrap() + .starts_with("toolu_") + ); + let arguments: String = values + .iter() + .filter_map(|v| v["delta"]["partial_json"].as_str()) + .collect(); + assert_eq!( + serde_json::from_str::(&arguments).unwrap(), + serde_json::json!({"path": "/tmp/example.txt"}) + ); + assert_eq!( + values[1..5] + .iter() + .map(|v| v["usage"]["output_tokens"].as_u64().unwrap()) + .collect::>(), + [1, 2, 3, 4] + ); + + let mut events = Vec::new(); + conv.append_chunk_events(&finish_chunk(reason), &mut events); + conv.append_chunk_events(&usage_chunk(5, None, 9), &mut events); + assert!(events.is_empty()); + conv.append_end_events(&mut events); + let values = sse_values(events).await; + assert_eq!(values.len(), 2); + assert_eq!(values[0]["type"], "message_delta"); + assert_eq!(values[0]["delta"]["stop_reason"], "tool_use"); + assert_eq!(values[0]["usage"]["output_tokens"], 9); + assert_eq!(values[1]["type"], "message_stop"); + } + + #[rstest::rstest] + #[case(false, false)] + #[case(false, true)] + #[case(true, false)] + #[case(true, true)] + #[tokio::test] + async fn test_pending_call_survives_partial_flush( + #[case] disable_parallel_tool_use: bool, + #[case] delayed_identity: bool, + ) { + let mut conv = AnthropicStreamConverter::with_context( + "test-model".into(), + 0, + AnthropicContext { + disable_parallel_tool_use, + ..Default::default() + }, + ); + let mut events = Vec::new(); + let pending = if delayed_identity { + tool_call_chunk(0, None, None, Some("{}")) + } else { + tool_call_chunk(0, Some("call_0"), Some("first"), Some("{\"path\":")) + }; + conv.append_chunk_events(&pending, &mut events); + conv.append_chunk_events( + &tool_call_chunk(1, Some("call_1"), Some("second"), Some("{}")), + &mut events, + ); + assert!(events.is_empty()); + conv.append_chunk_events(&finish_chunk(FinishReason::ToolCalls), &mut events); + let first_flush = sse_values(events).await; + let second_emits = !disable_parallel_tool_use || delayed_identity; + if second_emits { + assert_eq!(first_flush.len(), 3); + assert_eq!(first_flush[0]["content_block"]["name"], "second"); + assert_eq!(first_flush[0]["index"], 0); + assert_eq!(first_flush[2]["type"], "content_block_stop"); + } else { + assert!(first_flush.is_empty()); + } + + let mut events = Vec::new(); + let completion = if delayed_identity { + tool_call_chunk(0, Some("call_0"), Some("first"), None) + } else { + tool_call_chunk(0, None, None, Some("\"/tmp/example.txt\"}")) + }; + conv.append_chunk_events(&completion, &mut events); + let late_flush = sse_values(events).await; + if disable_parallel_tool_use && second_emits { + assert!(late_flush.is_empty()); + } else { + assert_eq!(late_flush.len(), if delayed_identity { 3 } else { 4 }); + assert_eq!(late_flush[0]["content_block"]["name"], "first"); + assert!( + late_flush + .iter() + .all(|v| v["index"] == u32::from(second_emits)) + ); + assert_eq!(late_flush.last().unwrap()["type"], "content_block_stop"); + } + + let mut events = Vec::new(); + conv.append_chunk_events(&finish_chunk(FinishReason::ToolCalls), &mut events); + assert!(events.is_empty()); + conv.append_end_events(&mut events); + let terminal = sse_values(events).await; + assert_eq!(terminal.len(), 2); + assert_eq!(terminal[0]["delta"]["stop_reason"], "tool_use"); + } + + #[rstest::rstest] + #[case(false, false)] + #[case(true, false)] + #[case(false, true)] + #[tokio::test] + async fn test_pending_call_finalization( + #[case] has_complete_call: bool, + #[case] backend_error: bool, + ) { + let mut conv = AnthropicStreamConverter::new("test-model".into(), 0); + let mut events = Vec::new(); + if has_complete_call { + conv.append_chunk_events( + &tool_call_chunk(0, Some("call_0"), Some("complete"), Some("{}")), + &mut events, + ); + } + conv.append_chunk_events( + &tool_call_chunk(1, Some("call_1"), Some("pending"), Some("{\"path\":")), + &mut events, + ); + conv.append_chunk_events(&finish_chunk(FinishReason::ToolCalls), &mut events); + assert_eq!(events.len(), if has_complete_call { 3 } else { 0 }); + events.clear(); + if backend_error { + conv.append_error_events(&mut events); + let terminal = sse_values(events).await; + assert_eq!(terminal.len(), 1); + assert_eq!(terminal[0]["type"], "error"); + } else { + conv.append_end_events(&mut events); + let terminal = sse_values(events).await; + assert_eq!(terminal.len(), 2); + assert_eq!(terminal[0]["type"], "message_delta"); + assert_eq!( + terminal[0]["delta"]["stop_reason"], + if has_complete_call { + "tool_use" + } else { + "end_turn" + } + ); + assert_eq!(terminal[1]["type"], "message_stop"); + } + } + + #[rstest::rstest] + #[case(None)] + #[case(Some(""))] + #[case(Some("{}"))] + #[tokio::test] + async fn test_parameterless_call_completes_on_finish(#[case] arguments: Option<&str>) { + let mut conv = AnthropicStreamConverter::new("test-model".into(), 0); + let mut events = Vec::new(); + conv.append_chunk_events( + &tool_call_chunk(0, Some("call_0"), Some("no_parameters"), arguments), + &mut events, + ); + conv.append_chunk_events(&finish_chunk(FinishReason::ToolCalls), &mut events); + let values = sse_values(events).await; + // Only arguments that already parse can close mid-stream. A call whose + // arguments are still absent or empty waits for the final drain, where + // late fragments can no longer arrive. + let closes_on_finish = arguments.is_some_and(|arguments| !arguments.is_empty()); + if closes_on_finish { + assert_eq!( + values + .iter() + .map(|v| v["type"].as_str().unwrap()) + .collect::>(), + [ + "content_block_start", + "content_block_delta", + "content_block_stop" + ] + ); + } else { + assert!(values.is_empty()); + } + + let terminal = sse_values(conv.emit_end_events()).await; + let mut expected = Vec::new(); + if !closes_on_finish { + expected.push("content_block_start"); + if arguments.is_some() { + expected.push("content_block_delta"); + } + expected.push("content_block_stop"); + } + expected.extend(["message_delta", "message_stop"]); + assert_eq!( + terminal + .iter() + .map(|v| v["type"].as_str().unwrap()) + .collect::>(), + expected + ); + let block_start = if closes_on_finish { + &values[0] + } else { + &terminal[0] + }; + assert_eq!(block_start["content_block"]["name"], "no_parameters"); + assert_eq!(block_start["content_block"]["input"], serde_json::json!({})); + assert_eq!( + terminal[expected.len() - 2]["delta"]["stop_reason"], + "tool_use" + ); + } + + #[tokio::test] + async fn test_identity_only_call_keeps_late_arguments() { + let mut conv = AnthropicStreamConverter::new("test-model".into(), 0); + let mut events = Vec::new(); + conv.append_chunk_events( + &tool_call_chunk(0, Some("call_0"), Some("read_file"), None), + &mut events, + ); + conv.append_chunk_events(&finish_chunk(FinishReason::ToolCalls), &mut events); + assert!( + events.is_empty(), + "a call with no arguments yet must not close while the stream is live" + ); + + conv.append_chunk_events( + &tool_call_chunk(0, None, None, Some("{\"path\":\"/tmp/example.txt\"}")), + &mut events, + ); + let values = sse_values(events).await; + assert_eq!( + values + .iter() + .map(|v| v["type"].as_str().unwrap()) + .collect::>(), + [ + "content_block_start", + "content_block_delta", + "content_block_stop" + ] + ); + assert_eq!(values[0]["content_block"]["name"], "read_file"); + assert_eq!( + serde_json::from_str::( + values[1]["delta"]["partial_json"].as_str().unwrap() + ) + .unwrap(), + serde_json::json!({"path": "/tmp/example.txt"}) + ); + + let terminal = sse_values(conv.emit_end_events()).await; + assert_eq!(terminal.len(), 2); + assert_eq!(terminal[0]["delta"]["stop_reason"], "tool_use"); + } + #[test] fn test_append_events_reuse_caller_storage() { let mut conv = AnthropicStreamConverter::new("test-model".into(), 0); @@ -1423,13 +1762,22 @@ mod tests { let mut chunk = tool_call_chunk(0, Some("call-1"), Some("Read"), None); chunk.inner.choices[0].finish_reason = Some(FinishReason::FunctionCall); - let finish = conv.process_chunk_tagged(&chunk); + // The call carries no argument fragment, so it stays pending while the + // stream is live and is emitted once EOF rules out later fragments. + assert!(conv.process_chunk_tagged(&chunk).is_empty()); + + let terminal = conv.emit_end_events_tagged(); assert_eq!( - event_types(&finish), - vec!["content_block_start", "content_block_stop"] + event_types(&terminal), + vec![ + "content_block_start", + "content_block_stop", + "message_delta", + "message_stop" + ] ); assert!(matches!( - &finish[0].data, + &terminal[0].data, AnthropicStreamEvent::ContentBlockStart { content_block: AnthropicResponseContentBlock::ToolUse { id, name, input }, .. @@ -1438,10 +1786,6 @@ mod tests { && name == "Read" && input == &serde_json::json!({}) )); - assert_eq!( - event_types(&conv.emit_end_events_tagged()), - vec!["message_delta", "message_stop"] - ); } #[test] @@ -1705,7 +2049,7 @@ mod tests { assert_eq!(conv.usage.output_tokens, 2); let fragment_outputs: Vec = conv - .drain_buffered_tool_events() + .drain_buffered_tool_events(true) .iter() .filter_map(|(event_type, event, usage)| match (event_type, event) { ( From f36d2fab37fd379c248a8ccd71d9ed88c584cce7 Mon Sep 17 00:00:00 2001 From: "bin.pan" Date: Tue, 22 Sep 2026 13:35:29 +0800 Subject: [PATCH 148/191] fix(multimodal): return 400 for malformed data: URIs instead of opaque 500 (#14603) Signed-off-by: bin Co-authored-by: Ryan McCormick --- .../dynamo/common/multimodal/image_loader.py | 23 ++++- .../tests/multimodal/test_image_loader.py | 83 +++++++++++++++++++ 2 files changed, 104 insertions(+), 2 deletions(-) diff --git a/components/src/dynamo/common/multimodal/image_loader.py b/components/src/dynamo/common/multimodal/image_loader.py index 1cc22929d18c..fa30d2441c24 100644 --- a/components/src/dynamo/common/multimodal/image_loader.py +++ b/components/src/dynamo/common/multimodal/image_loader.py @@ -185,7 +185,7 @@ async def _fetch_and_process(self, image_url: str) -> Image.Image: raise ValueError(f"Failed to load image: '{image_url}': {e}") from e except Exception as e: logger.error(f"{type(e).__name__} loading image: '{image_url}': {e}") - raise ValueError(f"Failed to load image: '{image_url}': {e}") from e + raise async def _fetch_and_cache(self, key: str, image_url: str) -> Image.Image: """Shared task: fetch, cache, then remove from _inflight.""" @@ -254,7 +254,7 @@ async def load_image(self, image_url: str) -> Image.Image: except Image.UnidentifiedImageError as e: logger.error(f"Unsupported image format decoding: '{image_url}'") raise HttpStatusError(415, "Unsupported Media Type", image_url) from e - except Exception as e: + except ValueError as e: if "Unsupported image format" in str(e): logger.error(f"Unsupported image format decoding: '{image_url}'") raise HttpStatusError( @@ -262,6 +262,14 @@ async def load_image(self, image_url: str) -> Image.Image: ) from e logger.error(f"{type(e).__name__} decoding image: '{image_url}': {e}") raise ValueError(f"Failed to decoding image: '{image_url}': {e}") from e + except OSError as e: + logger.error(f"Invalid or truncated image data: '{image_url}'") + raise HttpStatusError( + 400, "Invalid or truncated image data", image_url + ) from e + except Exception: + logger.error(f"Unexpected error decoding image: '{image_url}'") + raise # It's not file:, http:, https:, or data: raise ValueError(f"Invalid image source scheme: {parsed_url.scheme}") @@ -315,6 +323,9 @@ async def load_image_batch( client-error code instead of 500. UrlValidationError: If a media URL is rejected by the SSRF policy; preserved as a ValueError so the frontend returns a 4xx, not 500. + ValueError: If any image fails client-side input validation (e.g. + a malformed data: URI — invalid base64, missing ;base64 marker, + or non-image MIME). Exception: If any image fails to load for any other reason ValueError: If enable_frontend_decoding=True but nixl_connector is None ValueError: If a UUID-only slot is received without opting in @@ -360,6 +371,7 @@ async def load_image_batch( collective_exceptions = "" status_error: HttpStatusError | None = None url_error: UrlValidationError | None = None + value_error: ValueError | None = None for media_item, future_idx in zip( image_mm_items, slot_to_future_idx, strict=True ): @@ -389,6 +401,10 @@ async def load_image_batch( # preserve it so the frontend still gets a 4xx, not a 500. elif url_error is None and isinstance(result, UrlValidationError): url_error = result + # The bindings map ValueError to Backend(InvalidArgument) → 400, + # so preserve the type so the frontend still gets a 4xx. + elif value_error is None and isinstance(result, ValueError): + value_error = result continue loaded_images.append(result) @@ -398,6 +414,9 @@ async def load_image_batch( if url_error is not None: raise url_error + if value_error is not None: + raise value_error + if collective_exceptions: raise Exception(collective_exceptions) diff --git a/components/src/dynamo/common/tests/multimodal/test_image_loader.py b/components/src/dynamo/common/tests/multimodal/test_image_loader.py index 647e43b0a401..330603b96869 100644 --- a/components/src/dynamo/common/tests/multimodal/test_image_loader.py +++ b/components/src/dynamo/common/tests/multimodal/test_image_loader.py @@ -405,6 +405,89 @@ async def test_image_batch_prioritizes_typed_client_error( assert exc_info.value is client_error +@pytest.mark.parametrize( + "bad_url", + [ + "data:image/png;base64,not!!!base64!!!", + "data:image/png,abc", + ], + ids=["invalid-base64", "missing-base64-marker"], +) +async def test_malformed_data_url_batch_raises_value_error( + loader: ImageLoader, bad_url: str +) -> None: + """A malformed data: URI is a client error. The batch path must preserve + ValueError — the bindings map it to Backend(InvalidArgument) → 4xx.""" + with pytest.raises(ValueError) as exc_info: + await loader.load_image_batch([{URL_VARIANT_KEY: bad_url}]) + + assert not isinstance(exc_info.value, UrlValidationError) + assert "Failed to decoding image" in str(exc_info.value) + + +async def test_unexpected_decoder_error_not_wrapped_as_value_error( + loader: ImageLoader, +) -> None: + """An unexpected decoder failure must not be + classified as a client validation error: it propagates unchanged from + load_image and the batch path folds it into a generic Exception, so the + frontend answers 500, not 400.""" + loader._open_image = AsyncMock( # type: ignore[method-assign] + side_effect=RuntimeError("decode engine fault") + ) + + with pytest.raises(RuntimeError, match="decode engine fault"): + await loader.load_image("data:image/png;base64,aGVsbG8=") + + with pytest.raises(Exception) as exc_info: + await loader.load_image_batch( + [{URL_VARIANT_KEY: "data:image/png;base64,aGVsbG8="}] + ) + assert not isinstance(exc_info.value, ValueError) + assert "decode engine fault" in str(exc_info.value) + + +async def test_truncated_data_url_batch_raises_400(loader: ImageLoader) -> None: + """Truncated image bytes are malformed client input, not a server fault: + the batch path should return 400.""" + img = Image.new("RGB", (64, 64), color="red") + buf = BytesIO() + img.save(buf, format="JPEG") + truncated_url = ( + f"data:image/jpeg;base64,{base64.b64encode(buf.getvalue()[:-20]).decode()}" + ) + + with pytest.raises(HttpStatusError) as exc_info: + await loader.load_image_batch([{URL_VARIANT_KEY: truncated_url}]) + assert exc_info.value.status == 400 + assert "Invalid or truncated image data" in exc_info.value.message + + +async def test_unexpected_http_decoder_error_not_wrapped_as_value_error( + loader: ImageLoader, +) -> None: + """An unexpected decoder failure on a fetched image must not be + classified as a client validation error: it propagates unchanged + from load_image and the batch path folds it into a generic Exception, + so the frontend answers 500, not 400. + """ + loader._open_image = AsyncMock( # type: ignore[method-assign] + side_effect=OSError("image file is truncated") + ) + mock_fetch = _mock_fetch_bytes() + + with patch(_FETCH_BYTES_PATH, mock_fetch): + with pytest.raises(OSError, match="truncated"): + await loader.load_image("https://example.com/img.png") + + with pytest.raises(Exception) as exc_info: + await loader.load_image_batch( + [{URL_VARIANT_KEY: "https://example.com/img.png"}] + ) + assert not isinstance(exc_info.value, ValueError) + assert "truncated" in str(exc_info.value) + + async def test_cache_is_lru_not_fifo(loader: ImageLoader) -> None: """Accessing a cached entry should protect it from eviction (LRU, not FIFO).""" loader._cache_size = 3 From 843d92a7e4170ef6daf8a27aac906af6917bc376 Mon Sep 17 00:00:00 2001 From: Dong Xu Date: Mon, 21 Sep 2026 22:42:09 -0700 Subject: [PATCH 149/191] fix(frontend): integrate Kimi dynamic tools from frontend-crates (#14755) Signed-off-by: doxu Signed-off-by: Ryan McCormick Co-authored-by: Ryan McCormick --- Cargo.lock | 48 +-- Cargo.toml | 8 +- lib/bindings/kvbm/Cargo.lock | 16 +- lib/bindings/python/Cargo.lock | 16 +- lib/bindings/python/Cargo.toml | 2 +- lib/llm/src/http/service.rs | 103 ++++- lib/llm/src/preprocessor.rs | 351 ++++++++++++++++-- lib/llm/src/preprocessor/tool_choice.rs | 213 ++++++++++- lib/llm/src/protocols/anthropic/types.rs | 3 + .../src/protocols/openai/chat_completions.rs | 155 +++++++- lib/llm/src/protocols/openai/responses/mod.rs | 26 +- lib/llm/src/protocols/openai/validate.rs | 102 ++++- .../tests/parallel_tool_call_integration.rs | 1 + 13 files changed, 937 insertions(+), 107 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index de42eda60c5b..d8aaf0bfd39b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1563,7 +1563,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -2336,7 +2336,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -2853,9 +2853,9 @@ dependencies = [ [[package]] name = "dynamo-parsers" -version = "8.1.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78ad3396a91e388a6ab6e4e9f66236238793076b5d0b80c37671134f54bcfa5" +checksum = "e316d4d0f5082257f1629ca61973eafc17cee3e6ee0c24f7a55a61beeff40d97" dependencies = [ "aho-corasick", "anyhow", @@ -2893,9 +2893,9 @@ dependencies = [ [[package]] name = "dynamo-protocols" -version = "5.4.3" +version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cdacfc1398779cf173d5ff54438d9f14682f76875b6879853a84cc7d646228" +checksum = "daa8a16e9007c954f01ac9b4e48cb9eacd43e890edf747c92f7bbbddbb6fee4d" dependencies = [ "async-openai", "derive_builder", @@ -2910,9 +2910,9 @@ dependencies = [ [[package]] name = "dynamo-renderer" -version = "5.2.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4609cdbd65f8bd15c74f4531c1560d04496e8737dfb6b65b45487644b878963" +checksum = "821803eae0bcf87a9dc0ecdf9ff8a146a5de18ccfe39f341365676abbc747e61" dependencies = [ "anyhow", "chrono", @@ -3089,9 +3089,9 @@ dependencies = [ [[package]] name = "dynamo-tokenizers" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed232a9d254149a4e2e14f0a7d77f59bd64161964c0ba55267beea3955650faa" +checksum = "aa6031ec0ca72092e6469ff659ddf9dbf5034110aa9de387ffbfb17e24a4d5d7" dependencies = [ "aho-corasick", "anyhow", @@ -3367,7 +3367,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -4931,7 +4931,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -6401,7 +6401,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -7568,8 +7568,8 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ - "heck 0.5.0", - "itertools 0.14.0", + "heck 0.4.1", + "itertools 0.10.5", "log", "multimap", "once_cell", @@ -7588,8 +7588,8 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ - "heck 0.5.0", - "itertools 0.14.0", + "heck 0.4.1", + "itertools 0.10.5", "log", "multimap", "petgraph 0.8.3", @@ -7610,7 +7610,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.117", @@ -7623,7 +7623,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.117", @@ -7841,7 +7841,7 @@ dependencies = [ "once_cell", "socket2 0.6.4", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -8561,7 +8561,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.12.1", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -8629,7 +8629,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -9740,7 +9740,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix 1.1.4", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -11343,7 +11343,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 04bd36aaa6d2..91875c508763 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,8 +62,8 @@ aisimulate-core = { version = "=0.12.0" } dynamo-runtime = { path = "lib/runtime", version = "1.6.0" } dynamo-llm = { path = "lib/llm", version = "1.6.0" } dynamo-rl = { path = "lib/rl", version = "1.6.0" } -dynamo-tokenizers = { version = "=1.8.1" } -dynamo-renderer = { version = "=5.2.0" } +dynamo-tokenizers = { version = "=1.8.2" } +dynamo-renderer = { version = "=5.3.1" } dynamo-tokens = { path = "lib/tokens", version = "1.6.0" } dynamo-truthy = { path = "lib/truthy", version = "1.6.0" } dynamo-data-gen = { path = "lib/data-gen", version = "1.6.0" } @@ -71,8 +71,8 @@ dynamo-kv-hashing = { path = "lib/kv-hashing", version = "1.6.0" } dynamo-memory = { path = "lib/memory", version = "1.6.0" } dynamo-mocker = { path = "lib/mocker", version = "1.6.0" } dynamo-kv-router = { path = "lib/kv-router", version = "1.6.0" } -dynamo-protocols = { version = "=5.4.3" } -dynamo-parsers = { version = "8.1.0" } +dynamo-protocols = { version = "=6.0.1" } +dynamo-parsers = { version = "9.0.0" } # Published on crates.io. To see all available versions: # web: https://crates.io/crates/dynamo-parsers-v2/versions diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index eee0b73ed25a..64bf1e40381c 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -2272,9 +2272,9 @@ dependencies = [ [[package]] name = "dynamo-parsers" -version = "8.1.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78ad3396a91e388a6ab6e4e9f66236238793076b5d0b80c37671134f54bcfa5" +checksum = "e316d4d0f5082257f1629ca61973eafc17cee3e6ee0c24f7a55a61beeff40d97" dependencies = [ "aho-corasick", "anyhow", @@ -2312,9 +2312,9 @@ dependencies = [ [[package]] name = "dynamo-protocols" -version = "5.4.3" +version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cdacfc1398779cf173d5ff54438d9f14682f76875b6879853a84cc7d646228" +checksum = "daa8a16e9007c954f01ac9b4e48cb9eacd43e890edf747c92f7bbbddbb6fee4d" dependencies = [ "async-openai", "derive_builder", @@ -2329,9 +2329,9 @@ dependencies = [ [[package]] name = "dynamo-renderer" -version = "5.2.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4609cdbd65f8bd15c74f4531c1560d04496e8737dfb6b65b45487644b878963" +checksum = "821803eae0bcf87a9dc0ecdf9ff8a146a5de18ccfe39f341365676abbc747e61" dependencies = [ "anyhow", "chrono", @@ -2440,9 +2440,9 @@ dependencies = [ [[package]] name = "dynamo-tokenizers" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed232a9d254149a4e2e14f0a7d77f59bd64161964c0ba55267beea3955650faa" +checksum = "aa6031ec0ca72092e6469ff659ddf9dbf5034110aa9de387ffbfb17e24a4d5d7" dependencies = [ "aho-corasick", "anyhow", diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index 54ee7cebaf90..8d117a461fc3 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -2332,9 +2332,9 @@ dependencies = [ [[package]] name = "dynamo-parsers" -version = "8.1.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78ad3396a91e388a6ab6e4e9f66236238793076b5d0b80c37671134f54bcfa5" +checksum = "e316d4d0f5082257f1629ca61973eafc17cee3e6ee0c24f7a55a61beeff40d97" dependencies = [ "aho-corasick", "anyhow", @@ -2372,9 +2372,9 @@ dependencies = [ [[package]] name = "dynamo-protocols" -version = "5.4.3" +version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cdacfc1398779cf173d5ff54438d9f14682f76875b6879853a84cc7d646228" +checksum = "daa8a16e9007c954f01ac9b4e48cb9eacd43e890edf747c92f7bbbddbb6fee4d" dependencies = [ "async-openai", "derive_builder", @@ -2435,9 +2435,9 @@ dependencies = [ [[package]] name = "dynamo-renderer" -version = "5.2.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4609cdbd65f8bd15c74f4531c1560d04496e8737dfb6b65b45487644b878963" +checksum = "821803eae0bcf87a9dc0ecdf9ff8a146a5de18ccfe39f341365676abbc747e61" dependencies = [ "anyhow", "chrono", @@ -2585,9 +2585,9 @@ dependencies = [ [[package]] name = "dynamo-tokenizers" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed232a9d254149a4e2e14f0a7d77f59bd64161964c0ba55267beea3955650faa" +checksum = "aa6031ec0ca72092e6469ff659ddf9dbf5034110aa9de387ffbfb17e24a4d5d7" dependencies = [ "aho-corasick", "anyhow", diff --git a/lib/bindings/python/Cargo.toml b/lib/bindings/python/Cargo.toml index 8ead4c72ec59..4645acf8374e 100644 --- a/lib/bindings/python/Cargo.toml +++ b/lib/bindings/python/Cargo.toml @@ -63,7 +63,7 @@ request-trace-s3 = ["dynamo-llm/request-trace-s3"] aisimulate-core = { version = "=0.12.0", optional = true, features = ["python"] } dynamo-runtime = { path = "../../runtime" } dynamo-mocker = { path = "../../mocker" } -dynamo-parsers = { version = "8.1.0" } +dynamo-parsers = { version = "9.0.0" } dynamo-backend-common = { path = "../../backend-common" } dynamo-sidecar-common = { path = "../../sidecar/common" } dynamo-sglang-sidecar = { path = "../../sidecar/sglang" } diff --git a/lib/llm/src/http/service.rs b/lib/llm/src/http/service.rs index f4d2a5fbe838..f7c8fda93f84 100644 --- a/lib/llm/src/http/service.rs +++ b/lib/llm/src/http/service.rs @@ -61,8 +61,8 @@ fn apply_request_tool_call_parsing_options( .as_ref() .unwrap_or(&ChatCompletionToolChoiceOption::Auto); let converted_tool_choice = crate::preprocessor::tool_choice::convert_tool_choice(tool_choice); - let tools = request.inner.tools.as_deref().unwrap_or(&[]); - let converted_tools = crate::preprocessor::tool_choice::convert_tools(tools); + let effective_tools = crate::preprocessor::tool_choice::effective_tools(&request.inner)?; + let converted_tools = crate::preprocessor::tool_choice::convert_tools(effective_tools.as_ref()); let uses_structural_tag = crate::preprocessor::structural_tag::structural_tag_decision( parsing_options.tool_call_parser.as_deref(), &converted_tool_choice, @@ -73,12 +73,14 @@ fn apply_request_tool_call_parsing_options( parsing_options.exclude_tools_when_tool_choice_none, )? .is_required(); - let guided_tool_constraint = crate::preprocessor::tool_choice::guided_tool_constraint( - request, - parsing_options.tool_call_parser.as_deref(), - parsing_options.reasoning_parser.as_deref(), - uses_structural_tag, - )?; + let guided_tool_constraint = + crate::preprocessor::tool_choice::guided_tool_constraint_with_effective_tools( + request, + parsing_options.tool_call_parser.as_deref(), + parsing_options.reasoning_parser.as_deref(), + uses_structural_tag, + effective_tools.as_ref(), + )?; Ok(parsing_options .with_guided_tool_constraint(guided_tool_constraint) .with_tool_call_parsing_enabled(tool_call_parsing_enabled) @@ -111,6 +113,91 @@ mod tests { serde_json::from_value(value).expect("request must deserialize") } + fn dynamic_request(tool_choice: Option) -> NvCreateChatCompletionRequest { + let mut value = json!({ + "model": "test-model", + "messages": [ + { + "role": "system", + "content": "", + "tools": [{ + "name": "lookup", + "parameters": { + "type": "object", + "properties": {"query": {"type": "string"}} + }, + "strict": true + }] + }, + {"role": "user", "content": "test"} + ] + }); + if let Some(tool_choice) = tool_choice { + value["tool_choice"] = tool_choice; + } + serde_json::from_value(value).expect("dynamic request must deserialize") + } + + #[test] + fn kimi_k3_dynamic_tools_enable_response_parsing_without_a_top_level_sentinel() { + let parsing_options = ParsingOptions { + tool_call_parser: Some("kimi_k3".to_string()), + ..Default::default() + }; + let result = + apply_request_tool_call_parsing_options(parsing_options, &dynamic_request(None)) + .expect("dynamic tools must configure parsing"); + + assert!(!result.suppress_tool_calls); + assert_eq!(result.tools.len(), 1); + assert_eq!(result.tools[0].name, "lookup"); + assert_eq!(result.tools[0].strict, Some(true)); + } + + #[test] + fn kimi_k3_named_dynamic_tool_uses_structural_tag_policy() { + let parsing_options = ParsingOptions { + tool_call_parser: Some("kimi_k3".to_string()), + ..Default::default() + }; + let result = apply_request_tool_call_parsing_options( + parsing_options, + &dynamic_request(Some( + json!({"type": "function", "function": {"name": "lookup"}}), + )), + ) + .expect("named dynamic tool choice must configure parsing"); + + assert!(!result.suppress_tool_calls); + assert_eq!( + result.guided_tool_constraint, + GuidedToolConstraint::StructuralTag + ); + assert_eq!(result.tools.len(), 1); + assert_eq!(result.tools[0].name, "lookup"); + } + + #[test] + fn dynamic_tools_with_tool_choice_none_still_suppress_calls() { + let parsing_options = ParsingOptions { + tool_call_parser: Some("kimi_k3".to_string()), + ..Default::default() + }; + let result = apply_request_tool_call_parsing_options( + parsing_options, + &dynamic_request(Some(json!("none"))), + ) + .expect("tool_choice none must remain valid"); + + assert!(result.suppress_tool_calls); + assert_eq!(result.guided_tool_constraint, GuidedToolConstraint::None); + assert_eq!( + result.tools.len(), + 1, + "declarations remain available to parsers" + ); + } + // A Kimi K2 pair with a forced/named tool_choice must resolve to the real // structural-tag decision computed by the single shared owner, // `structural_tag::structural_tag_decision`, not to a second, independently diff --git a/lib/llm/src/preprocessor.rs b/lib/llm/src/preprocessor.rs index eda9f851ed4c..6fed161eb04f 100644 --- a/lib/llm/src/preprocessor.rs +++ b/lib/llm/src/preprocessor.rs @@ -3066,11 +3066,7 @@ impl OpenAIPreprocessor { request: &R, hidden_stop_token_ids: &mut Vec, ) -> Result> { - let has_tools = request - .tools() - .as_ref() - .and_then(|tools| tools.len()) - .is_some_and(|len| len > 0); + let has_tools = Self::request_has_effective_tools(request); let tool_choice_none = request .tool_choice() .as_ref() @@ -3120,6 +3116,26 @@ impl OpenAIPreprocessor { Ok(visible_stop_token_ids) } + fn request_has_effective_tools(request: &R) -> bool { + // `OAIChatLikeRequest` has no equivalent method, so this generic path mirrors + // `CreateChatCompletionRequest::has_effective_tools`; + // `effective_tool_predicates_match_protocol_definition` pins parity. + request + .tools() + .as_ref() + .and_then(|tools| tools.len()) + .is_some_and(|len| len > 0) + || request.typed_messages().is_some_and(|messages| { + messages.iter().any(|message| { + matches!( + message, + dynamo_protocols::types::ChatCompletionRequestMessage::System(system) + if system.tools.as_ref().is_some_and(|tools| !tools.is_empty()) + ) + }) + }) + } + fn should_keep_tool_parser_end_tokens_visible(has_tools: bool, tool_choice_none: bool) -> bool { has_tools && !tool_choice_none } @@ -4792,11 +4808,7 @@ impl OpenAIPreprocessor { .as_deref() .is_some_and(|parser| matches!(parser, "kimi_k3" | "kimi-k3")); let tool_call_parsing_enabled = Self::tool_call_parsing_enabled(request); - let has_tools = request - .inner - .tools - .as_ref() - .is_some_and(|tools| !tools.is_empty()); + let has_tools = request.inner.has_effective_tools(); let should_jail = if tool_call_parsing_enabled || parser_unwraps_all_kimi_k3_responses { Self::should_apply_tool_jail( effective_tool_call_parser.as_ref(), @@ -4903,16 +4915,9 @@ impl OpenAIPreprocessor { // it does not need the same entry gate. // if let ToolProcessingRoute::MuseUnified(family) = &tool_processing_route { - let tool_definitions = request.inner.tools.as_ref().map(|tools| { - tools - .iter() - .map(|tool| dynamo_parsers::tool_calling::ToolDefinition { - name: tool.function.name.clone(), - parameters: tool.function.parameters.clone(), - strict: tool.function.strict, - }) - .collect() - }); + let tool_definitions = + crate::preprocessor::tool_choice::effective_tool_definitions(&request.inner)?; + let tool_definitions = (!tool_definitions.is_empty()).then_some(tool_definitions); let unified: Pin + Send>> = Box::pin(tool_parser_v2::apply_unified_stream( stream, @@ -4928,16 +4933,9 @@ impl OpenAIPreprocessor { } if let ToolProcessingRoute::Unified(family) = &tool_processing_route { - let tool_definitions = request.inner.tools.as_ref().map(|tools| { - tools - .iter() - .map(|tool| dynamo_parsers::tool_calling::ToolDefinition { - name: tool.function.name.clone(), - parameters: tool.function.parameters.clone(), - strict: tool.function.strict, - }) - .collect() - }); + let tool_definitions = + crate::preprocessor::tool_choice::effective_tool_definitions(&request.inner)?; + let tool_definitions = (!tool_definitions.is_empty()).then_some(tool_definitions); let unified: Pin + Send>> = Box::pin(unified_parser::apply_stream_with_constraint( stream, @@ -5061,16 +5059,9 @@ impl OpenAIPreprocessor { let tool_call_parsing_enabled = Self::tool_call_parsing_enabled(request); // Convert OpenAI tools to parser ToolDefinition format before applying jail - let tool_definitions = request.inner.tools.as_ref().map(|tools| { - tools - .iter() - .map(|tool| dynamo_parsers::tool_calling::ToolDefinition { - name: tool.function.name.clone(), - parameters: tool.function.parameters.clone(), - strict: tool.function.strict, - }) - .collect() - }); + let tool_definitions = + crate::preprocessor::tool_choice::effective_tool_definitions(&request.inner)?; + let tool_definitions = (!tool_definitions.is_empty()).then_some(tool_definitions); let transformed_stream: Pin + Send>> = match tool_processing_route { @@ -8185,6 +8176,188 @@ mod tests { ); } + #[test] + fn effective_tool_predicates_match_protocol_definition() { + let cases = [ + ( + "no tools", + serde_json::json!({ + "model": "test-model", + "messages": [{"role": "user", "content": "test"}] + }), + ), + ( + "empty top-level tools", + serde_json::json!({ + "model": "test-model", + "messages": [{"role": "user", "content": "test"}], + "tools": [] + }), + ), + ( + "top-level tools", + serde_json::json!({ + "model": "test-model", + "messages": [{"role": "user", "content": "test"}], + "tools": [{ + "type": "function", + "function": { + "name": "lookup", + "parameters": {"type": "object"} + } + }] + }), + ), + ( + "empty system tools", + serde_json::json!({ + "model": "test-model", + "messages": [ + {"role": "system", "content": "", "tools": []}, + {"role": "user", "content": "test"} + ] + }), + ), + ( + "system tools", + serde_json::json!({ + "model": "test-model", + "messages": [ + {"role": "system", "content": "", "tools": [{"name": "lookup"}]}, + {"role": "user", "content": "test"} + ] + }), + ), + ( + "later system tools", + serde_json::json!({ + "model": "test-model", + "messages": [ + {"role": "system", "content": "", "tools": []}, + {"role": "user", "content": "test"}, + {"role": "system", "content": "", "tools": [{"name": "lookup"}]} + ] + }), + ), + ]; + + for (case, value) in cases { + let request: NvCreateChatCompletionRequest = + serde_json::from_value(value).expect("request must deserialize"); + assert_eq!( + OpenAIPreprocessor::request_has_effective_tools(&request), + request.inner.has_effective_tools(), + "effective-tool predicates diverged for {case}" + ); + } + + let developer_tools = + serde_json::from_value::(serde_json::json!({ + "model": "test-model", + "messages": [ + {"role": "developer", "content": "policy", "tools": [{"name": "lookup"}]}, + {"role": "user", "content": "test"} + ] + })); + match developer_tools { + Ok(request) => assert_eq!( + OpenAIPreprocessor::request_has_effective_tools(&request), + request.inner.has_effective_tools(), + "generic predicate must track newly supported developer tools" + ), + Err(error) => assert!( + error + .to_string() + .contains("`tools` is only accepted on system messages, not on role developer"), + "unexpected developer-tools rejection: {error}" + ), + } + } + + const HARMONY_CALL_TOKEN_ID: TokenIdType = 42; + + struct HiddenStopTokenizer; + + impl crate::tokenizers::traits::Encoder for HiddenStopTokenizer { + fn encode(&self, input: &str) -> anyhow::Result { + if input != "<|call|>" { + anyhow::bail!("unexpected Harmony tool-call end token {input:?}"); + } + Ok(Encoding::Sp(vec![HARMONY_CALL_TOKEN_ID])) + } + + fn encode_batch(&self, inputs: &[&str]) -> anyhow::Result> { + inputs.iter().map(|input| self.encode(input)).collect() + } + } + + impl crate::tokenizers::traits::Decoder for HiddenStopTokenizer { + fn decode( + &self, + _token_ids: &[TokenIdType], + _skip_special_tokens: bool, + ) -> anyhow::Result { + Ok(crate::tokenizers::traits::DecodeResult::Complete( + String::new(), + )) + } + } + + impl Tokenizer for HiddenStopTokenizer {} + + fn hidden_stop_preprocessor() -> OpenAIPreprocessor { + let mdc = ModelDeploymentCard::load_from_disk( + "tests/data/sample-models/mock-llama-3.1-8b-instruct", + None, + ) + .unwrap(); + let mut preprocessor = match Arc::try_unwrap(OpenAIPreprocessor::new(mdc).unwrap()) { + Ok(preprocessor) => preprocessor, + Err(_) => panic!("test preprocessor unexpectedly shared"), + }; + preprocessor.tool_call_parser = Some("harmony".to_string()); + preprocessor.tokenizer = Arc::new(HiddenStopTokenizer); + preprocessor + } + + #[test] + fn hidden_stop_path_recognizes_dynamic_system_tools_and_tool_choice_none() { + let dynamic: NvCreateChatCompletionRequest = serde_json::from_value(serde_json::json!({ + "model": "moonshotai/Kimi-K3", + "messages": [ + {"role": "system", "content": "", "tools": [{"name": "lookup"}]}, + {"role": "user", "content": "test"} + ] + })) + .unwrap(); + let none: NvCreateChatCompletionRequest = serde_json::from_value(serde_json::json!({ + "model": "moonshotai/Kimi-K3", + "messages": [ + {"role": "system", "content": "", "tools": [{"name": "lookup"}]}, + {"role": "user", "content": "test"} + ], + "tool_choice": "none" + })) + .unwrap(); + assert!(dynamic.inner.tools.is_none()); + assert!(none.inner.tools.is_none()); + + let preprocessor = hidden_stop_preprocessor(); + let mut dynamic_hidden = vec![HARMONY_CALL_TOKEN_ID, 7]; + let dynamic_visible = preprocessor + .remove_tool_parser_end_tokens_from_hidden_stops(&dynamic, &mut dynamic_hidden) + .unwrap(); + assert_eq!(dynamic_visible, [HARMONY_CALL_TOKEN_ID]); + assert_eq!(dynamic_hidden, [7]); + + let mut none_hidden = vec![HARMONY_CALL_TOKEN_ID, 7]; + let none_visible = preprocessor + .remove_tool_parser_end_tokens_from_hidden_stops(&none, &mut none_hidden) + .unwrap(); + assert!(none_visible.is_empty()); + assert_eq!(none_hidden, [HARMONY_CALL_TOKEN_ID, 7]); + } + async fn apply_kimi_k3_no_tools( leaked_reasoning: &str, ) -> Vec> { @@ -8214,6 +8387,53 @@ mod tests { .await } + async fn apply_kimi_k3_dynamic_tools( + leaked_reasoning: &str, + ) -> Vec> { + let request: NvCreateChatCompletionRequest = serde_json::from_value(serde_json::json!({ + "model": "moonshotai/Kimi-K3", + "messages": [ + { + "role": "system", + "content": "", + "tools": [{ + "name": "lookup", + "parameters": { + "type": "object", + "properties": {"query": {"type": "string"}}, + "required": ["query"] + } + }] + }, + {"role": "user", "content": "test"} + ] + })) + .unwrap(); + let tool_call_parsing_enabled = OpenAIPreprocessor::tool_call_parsing_enabled(&request); + assert!( + tool_call_parsing_enabled, + "dynamic system tools grant tool-call response permission" + ); + let tool_definitions = + crate::preprocessor::tool_choice::effective_tool_definitions(&request.inner).unwrap(); + + let jailed = OpenAIPreprocessor::apply_tool_calling_jail( + Some("kimi_k3".to_string()), + request.inner.tool_choice.clone(), + Some(tool_definitions), + false, + false, + stream::iter(vec![ + kimi_k3_reasoning_chunk(leaked_reasoning), + terminal_chat_stream_chunk(), + ]), + ); + + OpenAIPreprocessor::apply_tool_call_response_policy(jailed, tool_call_parsing_enabled) + .collect() + .await + } + #[tokio::test] async fn test_kimi_k3_no_tools_preserves_decoded_content_and_reasoning() { let responses = apply_kimi_k3_no_tools(concat!( @@ -8326,6 +8546,57 @@ mod tests { ); } + #[tokio::test] + async fn test_kimi_k3_dynamic_only_tools_survive_stream_and_batch_response_policy() { + let responses = apply_kimi_k3_dynamic_tools(concat!( + "Use the dynamic lookup tool.", + "<|open|>tools<|sep|>", + "<|open|>call tool=\"lookup\" index=\"1\"<|sep|>", + "<|open|>argument key=\"query\" type=\"string\"<|sep|>weather", + "<|close|>argument<|sep|>", + "<|close|>call<|sep|>", + "<|close|>tools<|sep|>", + "<|close|>message<|sep|>", + "<|end_of_msg|>" + )) + .await; + + let choices: Vec<_> = responses + .iter() + .flat_map(|response| response.data.iter()) + .flat_map(|data| data.inner.choices.iter()) + .collect(); + assert!( + choices + .iter() + .any(|choice| choice.delta.tool_calls.is_some()), + "streaming output must retain a dynamically declared tool call" + ); + assert!( + choices + .iter() + .any(|choice| choice.finish_reason == Some(FinishReason::ToolCalls)), + "streaming finish reason must remain tool_calls" + ); + + let response = + crate::protocols::openai::chat_completions::aggregator::DeltaAggregator::apply( + stream::iter(responses), + crate::protocols::openai::ParsingOptions::new(None, None), + ) + .await + .unwrap(); + let choice = &response.inner.choices[0]; + let calls = choice + .message + .tool_calls + .as_ref() + .expect("batch output must retain the dynamic call"); + assert_eq!(calls.len(), 1); + assert_eq!(calls[0].function.name, "lookup"); + assert_eq!(choice.finish_reason, Some(FinishReason::ToolCalls)); + } + #[test] fn prompt_invalid_request_maps_to_invalid_argument() { let error = PromptRenderError::invalid_request("unsupported model parameter").into(); diff --git a/lib/llm/src/preprocessor/tool_choice.rs b/lib/llm/src/preprocessor/tool_choice.rs index 1511aeba93d2..e14ca420239f 100644 --- a/lib/llm/src/preprocessor/tool_choice.rs +++ b/lib/llm/src/preprocessor/tool_choice.rs @@ -3,15 +3,19 @@ //! Tool-choice guided decoding policy for OpenAI chat requests. +use std::borrow::Cow; + use crate::preprocessor::{OpenAIPreprocessor, PreprocessedRequest}; -use crate::protocols::openai::GuidedToolConstraint; use crate::protocols::openai::chat_completions::NvCreateChatCompletionRequest; use crate::protocols::openai::tools::{ ToolChoiceGuidance, get_tool_choice_guidance_from_tools, validate_openai_tool_choice, }; +use crate::protocols::openai::{GuidedToolConstraint, validate}; use dynamo_parsers::tool_calling::{ToolChoice, ToolDefinition}; -use dynamo_protocols::types::{ChatCompletionTool, ChatCompletionToolChoiceOption, ResponseFormat}; +use dynamo_protocols::types::{ + ChatCompletionTool, ChatCompletionToolChoiceOption, CreateChatCompletionRequest, ResponseFormat, +}; use dynamo_runtime::error::{DynamoError, ErrorType}; /// Tool names and parser diagnostics can contain request data, so this helper does not mark its message public. @@ -27,11 +31,13 @@ impl OpenAIPreprocessor { /// /// A configured parser describes the model's wire format; it does not grant /// every request permission to return tool calls. Permission depends only on - /// whether the request supplies tools and whether `tool_choice` forbids them. + /// whether the request supplies effective tools and whether `tool_choice` + /// forbids them. Effective tools include both the OpenAI top-level list and + /// Kimi-style dynamic declarations carried by system messages. /// Assistant-output constraints apply to assistant content and do not revoke /// an `auto` request's ability to choose a tool call. pub(crate) fn tool_call_parsing_enabled(request: &NvCreateChatCompletionRequest) -> bool { - if request.inner.tools.as_ref().is_none_or(Vec::is_empty) { + if !request.inner.has_effective_tools() { return false; } @@ -68,7 +74,7 @@ impl OpenAIPreprocessor { .tool_choice .as_ref() .unwrap_or(&ChatCompletionToolChoiceOption::Auto); - let tools = request.inner.tools.as_deref().unwrap_or(&[]); + let tools = effective_tools(&request.inner)?; let is_forced_tool_choice = matches!( tool_choice, ChatCompletionToolChoiceOption::Required | ChatCompletionToolChoiceOption::Named(_) @@ -101,7 +107,7 @@ impl OpenAIPreprocessor { if self.apply_tool_choice_structural_tag( &convert_tool_choice(tool_choice), - &convert_tools(tools), + &convert_tools(tools.as_ref()), request.inner.parallel_tool_calls, prompt_injected_reasoning, common_request, @@ -130,7 +136,7 @@ impl OpenAIPreprocessor { match get_tool_choice_guidance_from_tools( Some(tool_choice), - Some(tools), + Some(tools.as_ref()), request.inner.parallel_tool_calls, ) { Ok(Some(guidance)) => { @@ -201,6 +207,26 @@ pub(crate) fn convert_tools(tools: &[ChatCompletionTool]) -> Vec .collect() } +/// Normalize and validate all tools visible to the model without rewriting the request. +/// +/// Top-level OpenAI tools remain first. Kimi-style tools declared on system +/// messages follow in message order and may use either the wrapped OpenAI form +/// or Kimi's bare function-schema form. This view is used only by validation, +/// parser, and guided-decoding policy; dynamic declarations stay at their +/// original message positions for prompt rendering and KV-cache correctness. +pub(crate) fn effective_tools( + request: &CreateChatCompletionRequest, +) -> Result, DynamoError> { + validate::validated_effective_tools(request) + .map_err(|error| invalid_argument(error.to_string())) +} + +pub(crate) fn effective_tool_definitions( + request: &CreateChatCompletionRequest, +) -> Result, DynamoError> { + effective_tools(request).map(|tools| convert_tools(tools.as_ref())) +} + /// The guided-tool constraint a request implies, given what the structural-tag stage /// already decided. /// @@ -214,6 +240,28 @@ pub(crate) fn guided_tool_constraint( tool_call_parser: Option<&str>, reasoning_parser: Option<&str>, uses_structural_tag: bool, +) -> Result { + if uses_structural_tag { + return Ok(GuidedToolConstraint::StructuralTag); + } + let tools = effective_tools(&request.inner)?; + guided_tool_constraint_with_effective_tools( + request, + tool_call_parser, + reasoning_parser, + false, + tools.as_ref(), + ) +} + +/// Derive the guided-tool constraint from an effective tool set the caller has +/// already normalized and validated through [`effective_tools`]. +pub(crate) fn guided_tool_constraint_with_effective_tools( + request: &NvCreateChatCompletionRequest, + tool_call_parser: Option<&str>, + reasoning_parser: Option<&str>, + uses_structural_tag: bool, + tools: &[ChatCompletionTool], ) -> Result { if uses_structural_tag { return Ok(GuidedToolConstraint::StructuralTag); @@ -223,7 +271,7 @@ pub(crate) fn guided_tool_constraint( .tool_choice .as_ref() .unwrap_or(&ChatCompletionToolChoiceOption::Auto); - validate_openai_tool_choice(Some(tool_choice), request.inner.tools.as_deref()) + validate_openai_tool_choice(Some(tool_choice), Some(tools)) .map_err(|error| invalid_argument(error.to_string()))?; let is_forced_tool_choice = matches!( tool_choice, @@ -247,7 +295,6 @@ pub(crate) fn guided_tool_constraint( // `apply_tool_choice_guided_decoding` does, instead of blindly installing a // constraint for a `tool_choice` that names a tool absent from `tools` (or an // empty `tools` list under `tool_choice: "required"`). - let tools = request.inner.tools.as_deref().unwrap_or(&[]); match get_tool_choice_guidance_from_tools( Some(tool_choice), Some(tools), @@ -350,6 +397,128 @@ mod tests { } } + #[test] + fn effective_tools_borrows_top_level_tools_without_dynamic_declarations() { + let request = request(json!({"tools": tools()})); + let top_level = request.inner.tools.as_deref().unwrap(); + + let effective = effective_tools(&request.inner).expect("top-level tools must validate"); + + assert!(matches!(&effective, Cow::Borrowed(_))); + assert!(std::ptr::eq(effective.as_ptr(), top_level.as_ptr())); + } + + #[test] + fn dynamic_system_tools_enable_parsing_and_honor_tool_choice_none() { + for (tool_choice, expected) in [(None, true), (Some(json!("none")), false)] { + let mut extra = json!({ + "messages": [ + { + "role": "system", + "content": "", + "tools": [{"name": "lookup", "parameters": {"type": "object"}}] + }, + {"role": "user", "content": "look it up"} + ] + }); + if let Some(tool_choice) = tool_choice { + extra["tool_choice"] = tool_choice; + } + assert_eq!( + OpenAIPreprocessor::tool_call_parsing_enabled(&request(extra)), + expected, + ); + } + } + + #[test] + fn effective_tools_preserve_order_and_normalize_wrapped_and_bare_shapes() { + let request = request(json!({ + "tools": [{ + "type": "function", + "function": {"name": "static_tool", "parameters": {"type": "object"}} + }], + "messages": [ + {"role": "user", "content": "start"}, + { + "role": "system", + "content": "", + "tools": [{ + "type": "function", + "function": { + "name": "wrapped_dynamic", + "parameters": {"type": "object", "properties": {"x": {"type": "integer"}}}, + "strict": true + } + }] + }, + { + "role": "system", + "content": "", + "tools": [{ + "name": "bare_dynamic", + "description": "bare form", + "parameters": {"type": "object", "properties": {}}, + "strict": false, + "vendor_hint": "kept only in the original message" + }] + }, + {"role": "user", "content": "continue"} + ] + })); + + let normalized = effective_tools(&request.inner).expect("dynamic tools must normalize"); + assert!(matches!(&normalized, Cow::Owned(_))); + assert_eq!( + normalized + .iter() + .map(|tool| tool.function.name.as_str()) + .collect::>(), + ["static_tool", "wrapped_dynamic", "bare_dynamic"] + ); + assert_eq!(normalized[1].function.strict, Some(true)); + assert_eq!(normalized[2].function.strict, Some(false)); + assert_eq!( + normalized[2].function.description.as_deref(), + Some("bare form") + ); + let original = serde_json::to_value(&request.inner.messages).unwrap(); + assert_eq!( + original[2]["tools"][0]["vendor_hint"], "kept only in the original message", + "normalization must not rewrite dynamic message declarations" + ); + } + + #[test] + fn effective_tools_reject_invalid_dynamic_metadata() { + for (field, value) in [ + ("strict", json!("yes")), + ("parameters", json!([])), + ("description", json!(7)), + ] { + let mut tool = json!({"name": "lookup"}); + tool[field] = value; + let request = request(json!({ + "messages": [ + {"role": "system", "content": "", "tools": [tool]}, + {"role": "user", "content": "go"} + ] + })); + let error = effective_tools(&request.inner).expect_err("invalid field must fail"); + assert!(error.to_string().contains(field), "{field}: {error}"); + } + + let request = request(json!({ + "messages": [ + {"role": "system", "content": "", "tools": [{"name": "bad name"}]}, + {"role": "user", "content": "go"} + ] + })); + let error = effective_tools(&request.inner).expect_err("invalid name must fail"); + assert_eq!(error.error_type(), ErrorType::InvalidArgument); + assert!(error.to_string().contains("has an invalid name")); + } + #[test] fn assistant_constraints_do_not_revoke_auto_tool_permission() { let constraints = [ @@ -509,4 +678,30 @@ mod tests { ); } } + + #[test] + fn kimi_k3_forced_choices_accept_dynamic_system_tools() { + for tool_choice in [ + json!("required"), + json!({"type": "function", "function": {"name": "lookup"}}), + ] { + let request = request(json!({ + "messages": [ + { + "role": "system", + "content": "", + "tools": [{"name": "lookup", "parameters": {"type": "object"}}] + }, + {"role": "user", "content": "go"} + ], + "tool_choice": tool_choice + })); + assert_eq!( + guided_tool_constraint(&request, Some("kimi_k3"), None, false) + .expect("dynamic forced choice must validate"), + GuidedToolConstraint::None, + "K3 forced choices use native XTML rather than guided JSON" + ); + } + } } diff --git a/lib/llm/src/protocols/anthropic/types.rs b/lib/llm/src/protocols/anthropic/types.rs index 008747c6c40c..0cc333c7d1a6 100644 --- a/lib/llm/src/protocols/anthropic/types.rs +++ b/lib/llm/src/protocols/anthropic/types.rs @@ -38,6 +38,7 @@ fn push_system_message(content: String, messages: &mut Vec for NvCreateChatCompletionRequest { audio: None, tool_calls: None, function_call: None, + partial: None, }, )); } @@ -475,6 +477,7 @@ fn convert_assistant_blocks( tool_calls: tc, #[allow(deprecated)] function_call: None, + partial: None, }, )); } diff --git a/lib/llm/src/protocols/openai/chat_completions.rs b/lib/llm/src/protocols/openai/chat_completions.rs index 9080f03b63a3..42459d4cf40c 100644 --- a/lib/llm/src/protocols/openai/chat_completions.rs +++ b/lib/llm/src/protocols/openai/chat_completions.rs @@ -635,8 +635,8 @@ impl ValidateRequest for NvCreateChatCompletionRequest { // none for stream_options validate::validate_temperature(self.inner.temperature)?; validate::validate_top_p(self.inner.top_p)?; - validate::validate_tools(&self.inner.tools.as_deref())?; - validate::validate_tool_choice(&self.inner.tool_choice, self.inner.tools.as_deref())?; + let effective_tools = validate::validated_effective_tools(&self.inner)?; + validate::validate_tool_choice(&self.inner.tool_choice, Some(effective_tools.as_ref()))?; // none for parallel_tool_calls validate::validate_user(self.inner.user.as_deref())?; // none for function call @@ -1111,6 +1111,157 @@ mod tests { ); } + #[test] + fn test_kimi_extensions_survive_nv_request_roundtrip() { + let request: NvCreateChatCompletionRequest = serde_json::from_value(json!({ + "model": "moonshotai/Kimi-K3", + "messages": [ + {"role": "system", "tools": [{"name": "lookup"}]}, + {"role": "user", "content": "Hello"}, + {"role": "assistant", "content": "The answer is", "partial": true} + ], + "prompt_cache_key": "session-key" + })) + .expect("Kimi extensions must deserialize through the Dynamo wrapper"); + + assert!(request.unsupported_fields.is_empty()); + ValidateRequest::validate(&request).expect("Kimi extensions must pass request validation"); + assert!(request.inner.has_effective_tools()); + assert!(request.inner.effective_tool_contains("lookup")); + + let serialized = serde_json::to_value(&request).unwrap(); + assert_eq!(serialized["messages"][0]["tools"][0]["name"], "lookup"); + assert_eq!(serialized["messages"][2]["partial"], true); + assert_eq!(serialized["messages"][2]["content"], "The answer is"); + assert_eq!(serialized["prompt_cache_key"], "session-key"); + } + + #[test] + fn test_system_message_without_content_or_tools_is_still_rejected() { + let request = serde_json::from_value::(json!({ + "model": "test-model", + "messages": [ + {"role": "system"}, + {"role": "user", "content": "Hello"} + ] + })); + assert!(request.is_err()); + } + + #[test] + fn test_validate_forced_tool_choice_accepts_dynamic_system_tools() { + for tool_choice in [ + json!("required"), + json!({"type": "function", "function": {"name": "lookup"}}), + ] { + let request_json = json!({ + "model": "test-model", + "messages": [ + { + "role": "system", + "content": "", + "tools": [{"name": "lookup", "parameters": {"type": "object"}}] + }, + {"role": "user", "content": "Hello"} + ], + "tool_choice": tool_choice + }); + let request: NvCreateChatCompletionRequest = serde_json::from_value(request_json) + .expect("dynamic-tool request must deserialize"); + ValidateRequest::validate(&request) + .expect("dynamic tools must satisfy forced tool_choice validation"); + } + } + + #[test] + fn test_validate_named_tool_choice_rejects_absent_dynamic_tool() { + let request_json = json!({ + "model": "test-model", + "messages": [ + { + "role": "system", + "content": "", + "tools": [{"name": "lookup"}] + }, + {"role": "user", "content": "Hello"} + ], + "tool_choice": { + "type": "function", + "function": {"name": "missing"} + } + }); + let request: NvCreateChatCompletionRequest = + serde_json::from_value(request_json).expect("request must deserialize"); + let error = ValidateRequest::validate(&request).expect_err("missing tool must fail"); + assert!( + error + .to_string() + .contains("tool named \"missing\" in tool_choice is not present in tools") + ); + } + + #[test] + fn test_validate_rejects_invalid_dynamic_tool_names() { + for (name, expected_error) in [ + ("bad name".to_string(), "has an invalid name".to_string()), + ( + "x".repeat(validate::MAX_FUNCTION_NAME_LENGTH + 1), + format!( + "exceeds {} character limit", + validate::MAX_FUNCTION_NAME_LENGTH + ), + ), + ] { + let request: NvCreateChatCompletionRequest = serde_json::from_value(json!({ + "model": "test-model", + "messages": [ + {"role": "system", "tools": [{"name": name}]}, + {"role": "user", "content": "Hello"} + ] + })) + .expect("dynamic-tool request must deserialize"); + + let error = ValidateRequest::validate(&request) + .expect_err("invalid dynamic tool name must fail validation"); + assert!( + error.to_string().contains(&expected_error), + "unexpected validation error: {error}" + ); + } + } + + #[test] + fn test_validate_rejects_combined_effective_tool_count_over_limit() { + let tools = (0..validate::MAX_TOOLS) + .map(|index| { + json!({ + "type": "function", + "function": {"name": format!("tool_{index}")} + }) + }) + .collect::>(); + let request: NvCreateChatCompletionRequest = serde_json::from_value(json!({ + "model": "test-model", + "messages": [ + {"role": "system", "tools": [{"name": "dynamic_tool"}]}, + {"role": "user", "content": "Hello"} + ], + "tools": tools + })) + .expect("combined-tool request must deserialize"); + + let error = ValidateRequest::validate(&request) + .expect_err("combined effective tool count over the limit must fail validation"); + assert!( + error.to_string().contains(&format!( + "Maximum of {} tools are supported, got {}", + validate::MAX_TOOLS, + validate::MAX_TOOLS + 1 + )), + "unexpected validation error: {error}" + ); + } + #[test] fn test_validate_rejects_zero_max_tokens() { let request_json = json!({ diff --git a/lib/llm/src/protocols/openai/responses/mod.rs b/lib/llm/src/protocols/openai/responses/mod.rs index f91030697956..54695018e96a 100644 --- a/lib/llm/src/protocols/openai/responses/mod.rs +++ b/lib/llm/src/protocols/openai/responses/mod.rs @@ -497,6 +497,7 @@ impl PendingAssistant { }, #[allow(deprecated)] function_call: None, + partial: None, }, )); } @@ -524,6 +525,7 @@ fn convert_input_items_to_messages( text, ), name: None, + tools: None, }, ) } @@ -637,6 +639,7 @@ fn convert_input_items_to_messages( ChatCompletionRequestSystemMessage { content: ChatCompletionRequestSystemMessageContent::Text(text), name: None, + tools: None, }, )); } @@ -891,6 +894,7 @@ impl TryFrom for NvCreateChatCompletionRequest { ChatCompletionRequestSystemMessage { content: ChatCompletionRequestSystemMessageContent::Text(instructions.clone()), name: None, + tools: None, }, )); } @@ -951,6 +955,7 @@ impl TryFrom for NvCreateChatCompletionRequest { ChatCompletionRequestMessage::System(ChatCompletionRequestSystemMessage { content: ChatCompletionRequestSystemMessageContent::Text(combined), name: None, + tools: None, }), ); } @@ -1932,7 +1937,14 @@ mod tests { })), InputItem::Item(Item::FunctionCallOutput(FunctionCallOutputItemParam { call_id: "call_123".into(), - output: FunctionCallOutput::Text(r#"{"temp":"72F"}"#.into()), + output: FunctionCallOutput::Content(vec![ + InputContent::InputText(InputTextContent { + text: "{\"temp\":\"".into(), + }), + InputContent::InputText(InputTextContent { + text: "72F\"}".into(), + }), + ]), id: None, status: None, })), @@ -1953,7 +1965,17 @@ mod tests { messages[1], ChatCompletionRequestMessage::Assistant(_) )); - assert!(matches!(messages[2], ChatCompletionRequestMessage::Tool(_))); + match &messages[2] { + ChatCompletionRequestMessage::Tool(tool) => { + assert_eq!(tool.tool_call_id, "call_123"); + assert!(matches!( + &tool.content, + ChatCompletionRequestToolMessageContent::Text(text) + if text == r#"{"temp":"72F"}"# + )); + } + other => panic!("expected tool message, got {other:?}"), + } } #[test] diff --git a/lib/llm/src/protocols/openai/validate.rs b/lib/llm/src/protocols/openai/validate.rs index 1f5e04ba85d2..c96473435e0b 100644 --- a/lib/llm/src/protocols/openai/validate.rs +++ b/lib/llm/src/protocols/openai/validate.rs @@ -1,11 +1,15 @@ // SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -use std::{fmt::Display, sync::LazyLock}; +use std::{borrow::Cow, fmt::Display, sync::LazyLock}; +use dynamo_protocols::types::{ + ChatCompletionTool, ChatCompletionToolType, CreateChatCompletionRequest, FunctionObject, +}; use dynamo_runtime::config::{ env_is_truthy, environment_names::llm::DYN_IGNORE_OPENAI_FE_UNSUPPORTED_FIELDS, }; +use serde_json::Value; use super::common_ext::{CommonExtProvider, extract_guided_decoding_options}; use super::tools::{ToolChoiceError, validate_openai_tool_choice}; @@ -538,6 +542,102 @@ pub fn validate_top_logprobs(top_logprobs: Option) -> Result<(), anyhow::Err Ok(()) } +pub(crate) fn validated_effective_tools( + request: &CreateChatCompletionRequest, +) -> Result, anyhow::Error> { + let dynamic_tools = request + .dynamic_system_tools() + .enumerate() + .map(|(index, tool)| normalize_dynamic_system_tool(tool, index)) + .collect::, _>>()?; + + let tools = if dynamic_tools.is_empty() { + Cow::Borrowed(request.tools.as_deref().unwrap_or_default()) + } else { + let mut tools = request.tools.clone().unwrap_or_default(); + tools.extend(dynamic_tools); + Cow::Owned(tools) + }; + + validate_tools(&Some(tools.as_ref()))?; + Ok(tools) +} + +fn normalize_dynamic_system_tool( + tool: &Value, + index: usize, +) -> Result { + let object = tool.as_object().ok_or_else(|| { + anyhow::anyhow!("dynamic system tool at index {index} must be a JSON object") + })?; + let function = match (object.get("type"), object.get("function")) { + (Some(Value::String(kind)), Some(Value::Object(function))) if kind == "function" => { + function + } + (Some(kind), _) if kind.as_str() != Some("function") => { + anyhow::bail!("dynamic system tool at index {index} must have type=\"function\""); + } + (Some(_), _) => { + anyhow::bail!( + "dynamic system tool at index {index} with type=\"function\" needs a function object" + ); + } + (None, Some(_)) => { + anyhow::bail!( + "dynamic system tool at index {index} with a function field needs type=\"function\"" + ); + } + (None, None) => object, + }; + + let name = function + .get("name") + .and_then(Value::as_str) + .filter(|name| !name.is_empty()) + .ok_or_else(|| { + anyhow::anyhow!("dynamic system tool at index {index} needs a non-empty string name") + })?; + let description = optional_dynamic_string(function.get("description"), "description", index)?; + let parameters = match function.get("parameters") { + None | Some(Value::Null) => None, + Some(parameters @ Value::Object(_)) => Some(parameters.clone()), + Some(_) => { + anyhow::bail!( + "dynamic system tool at index {index} parameters must be a JSON Schema object" + ); + } + }; + let strict = match function.get("strict") { + None | Some(Value::Null) => None, + Some(Value::Bool(strict)) => Some(*strict), + Some(_) => { + anyhow::bail!("dynamic system tool at index {index} strict must be a boolean"); + } + }; + + Ok(ChatCompletionTool { + r#type: ChatCompletionToolType::Function, + function: FunctionObject { + name: name.to_string(), + description, + parameters, + strict, + }, + }) +} + +fn optional_dynamic_string( + value: Option<&Value>, + field: &str, + index: usize, +) -> Result, anyhow::Error> { + match value { + None | Some(Value::Null) => Ok(None), + Some(Value::String(value)) => Ok(Some(value.clone())), + Some(_) => anyhow::bail!("dynamic system tool at index {index} {field} must be a string"), + } +} + /// Validates tools array pub fn validate_tools( tools: &Option<&[dynamo_protocols::types::ChatCompletionTool]>, diff --git a/lib/llm/tests/parallel_tool_call_integration.rs b/lib/llm/tests/parallel_tool_call_integration.rs index 0f13b02c37fa..dfd0310492a8 100644 --- a/lib/llm/tests/parallel_tool_call_integration.rs +++ b/lib/llm/tests/parallel_tool_call_integration.rs @@ -29,6 +29,7 @@ fn create_mock_chat_completion_request() -> NvCreateChatCompletionRequest { "You MUST use two tools in parallel to resolve the user request: call get_current_weather for each city AND call is_holiday_today to check if today is a holiday. Do not answer without using both tools.".to_string() ), name: None, + tools: None, } ), dynamo_protocols::types::ChatCompletionRequestMessage::User( From 7a96c165ff0185159f4c7094b152e9cacb4d8e65 Mon Sep 17 00:00:00 2001 From: Mingyuan Ma <111467530+Victor49152@users.noreply.github.com> Date: Mon, 21 Sep 2026 23:25:01 -0700 Subject: [PATCH 150/191] fix: Update Qwen Utils to Match DeepStack Vision Embedding Size (#11244) Signed-off-by: Mingyuan Ma --- .../vllm/multimodal_utils/models/qwen.py | 10 +++- .../test_vllm_request_processor.py | 47 ++++++++++++++++++- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/components/src/dynamo/vllm/multimodal_utils/models/qwen.py b/components/src/dynamo/vllm/multimodal_utils/models/qwen.py index 83122a3ad5e9..2657a40a23e9 100644 --- a/components/src/dynamo/vllm/multimodal_utils/models/qwen.py +++ b/components/src/dynamo/vllm/multimodal_utils/models/qwen.py @@ -23,6 +23,7 @@ class QwenGridParams: min_pixels: int max_pixels: int vision_hidden_dim: int + decode_embedding_dim: int def load_qwen_grid_params( @@ -65,6 +66,10 @@ def load_qwen_grid_params( vision_hidden_dim: int = getattr( vision_config, "out_hidden_size", vision_config.hidden_size ) + deepstack_visual_indexes = ( + getattr(vision_config, "deepstack_visual_indexes", []) or [] + ) + decode_embedding_dim = vision_hidden_dim * (1 + len(deepstack_visual_indexes)) return QwenGridParams( patch_size=patch_size, @@ -73,6 +78,7 @@ def load_qwen_grid_params( min_pixels=min_pixels, max_pixels=max_pixels, vision_hidden_dim=vision_hidden_dim, + decode_embedding_dim=decode_embedding_dim, ) except (OSError, ValueError) as exc: logger.warning( @@ -103,7 +109,7 @@ def _compute_qwen_grid_thw( Returns: (grid_thw, embeddings_shape) or (None, None) on failure. grid_thw: list of [grid_t, grid_h, grid_w] per image. - embeddings_shape: [total_tokens, vision_hidden_dim]. + embeddings_shape: [total_tokens, decode_embedding_dim]. """ if isinstance(image_data, Image.Image): images = [image_data] @@ -134,7 +140,7 @@ def _compute_qwen_grid_thw( grid_thw.append([grid_t, grid_h, grid_w]) total_tokens += (grid_t * grid_h * grid_w) // merge_sq - return grid_thw, [total_tokens, params.vision_hidden_dim] + return grid_thw, [total_tokens, params.decode_embedding_dim] def build_qwen_embedding_params( diff --git a/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_request_processor.py b/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_request_processor.py index 595142ef400b..a9784dce99c1 100644 --- a/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_request_processor.py +++ b/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_request_processor.py @@ -3,7 +3,7 @@ import base64 from types import SimpleNamespace -from unittest.mock import AsyncMock, MagicMock +from unittest.mock import AsyncMock, MagicMock, patch import numpy as np import pytest @@ -1345,6 +1345,7 @@ def test_qwen_handoff_applies_per_request_pixel_overrides(monkeypatch): min_pixels=65536, max_pixels=16777216, vision_hidden_dim=2048, + decode_embedding_dim=2048, ) captured = {} @@ -1390,12 +1391,13 @@ def test_qwen_handoff_computes_grid_for_pil_images(): min_pixels=65536, max_pixels=16777216, vision_hidden_dim=2048, + decode_embedding_dim=8192, ), ) assert result == { "image_grid_thw": [[1, 30, 40]], - "embeddings_shape": [300, 2048], + "embeddings_shape": [300, 8192], } @@ -1616,3 +1618,44 @@ def test_k3_long_prompt_splices_only_rare_pads(): assert result[10 : 10 + len(_K3_NATIVE_IDS)] == _K3_NATIVE_IDS assert result[-(len(_K3_NATIVE_IDS) + 9) : -9] == _K3_NATIVE_IDS assert len(result) == len(tokens) + 2 * (len(_K3_NATIVE_IDS) - 1) + + +class TestLoadQwenGridParams: + """Tests for embedding dimensions loaded from Qwen vision configs.""" + + @pytest.mark.parametrize( + ("deepstack_config", "expected_decode_embedding_dim"), + [ + pytest.param( + {"deepstack_visual_indexes": [8, 16, 24]}, 8192, id="deepstack" + ), + pytest.param({"deepstack_visual_indexes": []}, 2048, id="empty"), + pytest.param({"deepstack_visual_indexes": None}, 2048, id="none"), + pytest.param({}, 2048, id="missing"), + ], + ) + def test_decode_embedding_dim( + self, deepstack_config, expected_decode_embedding_dim + ): + processor = SimpleNamespace( + patch_size=16, merge_size=2, min_pixels=65536, max_pixels=16777216 + ) + vision_config = SimpleNamespace( + hidden_size=1024, out_hidden_size=2048, **deepstack_config + ) + with ( + patch.object( + qwen_mod.AutoImageProcessor, "from_pretrained", return_value=processor + ), + patch.object( + qwen_mod.AutoConfig, + "from_pretrained", + return_value=SimpleNamespace(vision_config=vision_config), + ), + ): + params = qwen_mod.load_qwen_grid_params("Qwen/Qwen3-VL-2B-Instruct") + + assert params is not None + assert params.vision_hidden_dim == 2048 + # DeepStack concatenates intermediate outputs with the final vision output. + assert params.decode_embedding_dim == expected_decode_embedding_dim From 8612fc179c438e603d9e247ef5b53446b27eaac2 Mon Sep 17 00:00:00 2001 From: Sumit884-byte Date: Tue, 22 Sep 2026 12:00:35 +0530 Subject: [PATCH 151/191] fix(frontend): prepend KServe batch dim for Triton metadata (#14996) Signed-off-by: Sumit Mishra Co-authored-by: Ryan McCormick --- lib/llm/src/grpc/service/kserve.rs | 14 ++++++++++--- lib/llm/src/grpc/service/tensor.rs | 33 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/lib/llm/src/grpc/service/kserve.rs b/lib/llm/src/grpc/service/kserve.rs index c39cd6ce6a09..3580afca0458 100644 --- a/lib/llm/src/grpc/service/kserve.rs +++ b/lib/llm/src/grpc/service/kserve.rs @@ -67,7 +67,9 @@ impl GrpcTuningConfig { use crate::grpc::service::dispatch_error_status; use crate::grpc::service::openai::completion_response_stream; -use crate::grpc::service::tensor::{ExtendedNvCreateTensorResponse, tensor_response_stream}; +use crate::grpc::service::tensor::{ + ExtendedNvCreateTensorResponse, kserve_metadata_shape, tensor_response_stream, +}; use std::convert::{TryFrom, TryInto}; use tonic::{Request, Response, Status, transport::Server}; @@ -686,7 +688,10 @@ impl GrpcInferenceService for KserveService { .and_then(|dt| dt.oip_name()) .unwrap_or("TYPE_INVALID") .to_string(), - shape: input.dims.clone(), + shape: kserve_metadata_shape( + &input.dims, + model_config.max_batch_size, + ), }) .collect(), outputs: model_config @@ -700,7 +705,10 @@ impl GrpcInferenceService for KserveService { .and_then(|dt| dt.oip_name()) .unwrap_or("TYPE_INVALID") .to_string(), - shape: output.dims.clone(), + shape: kserve_metadata_shape( + &output.dims, + model_config.max_batch_size, + ), }, ) .collect(), diff --git a/lib/llm/src/grpc/service/tensor.rs b/lib/llm/src/grpc/service/tensor.rs index ba6d2b16f571..f2f88590b034 100644 --- a/lib/llm/src/grpc/service/tensor.rs +++ b/lib/llm/src/grpc/service/tensor.rs @@ -854,6 +854,20 @@ impl DataType { } } +/// KServe v2 `ModelMetadata` wire shape for a Triton tensor. +/// +/// Triton's `ModelConfig` stores per-tensor `dims` without the batch dimension. +/// When `max_batch_size > 0`, native Triton's KServe adapter prepends `-1` +/// (variable batch) so clients can send batched inputs. Copying `dims` +/// verbatim drops that axis and KServe v2 clients reject the tensor. +pub fn kserve_metadata_shape(dims: &[i64], max_batch_size: i32) -> Vec { + if max_batch_size > 0 { + std::iter::once(-1).chain(dims.iter().copied()).collect() + } else { + dims.to_vec() + } +} + impl std::fmt::Display for tensor::DataType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match *self { @@ -1222,3 +1236,22 @@ mod oip_datatype_tests { } } } + +#[cfg(test)] +mod kserve_metadata_shape_tests { + use super::kserve_metadata_shape; + + #[test] + fn prepends_variable_batch_dim_when_batching_enabled() { + assert_eq!(kserve_metadata_shape(&[-1], 4), vec![-1, -1]); + assert_eq!(kserve_metadata_shape(&[768], 8), vec![-1, 768]); + assert_eq!(kserve_metadata_shape(&[], 1), vec![-1]); + } + + #[test] + fn leaves_dims_unchanged_when_batching_disabled() { + assert_eq!(kserve_metadata_shape(&[-1], 0), vec![-1]); + assert_eq!(kserve_metadata_shape(&[3, 224, 224], 0), vec![3, 224, 224]); + assert_eq!(kserve_metadata_shape(&[], 0), Vec::::new()); + } +} From 2e4998a30ccd6298d81c4263a49b6fa9a0b273c6 Mon Sep 17 00:00:00 2001 From: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> Date: Tue, 22 Sep 2026 12:20:05 +0000 Subject: [PATCH 152/191] docs: refresh community events Automated refresh from the public Dynamo Google Calendar. Generated by .github/workflows/community-events-refresh.yml. Signed-off-by: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> --- docs/fern/components/events.generated.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fern/components/events.generated.ts b/docs/fern/components/events.generated.ts index 7fae90668054..a94bd56c5780 100644 --- a/docs/fern/components/events.generated.ts +++ b/docs/fern/components/events.generated.ts @@ -22,7 +22,7 @@ export interface DynamoEvent { } /** Generation date in Pacific, YYYY-MM-DD. The calendar grid treats this as "today". */ -export const GENERATED_ON = "2026-09-21"; +export const GENERATED_ON = "2026-09-22"; export const UPCOMING_EVENTS: DynamoEvent[] = []; From f9a2485d44687014814252852010de8d8a97e2b0 Mon Sep 17 00:00:00 2001 From: jain-ria Date: Wed, 23 Sep 2026 00:35:44 +0800 Subject: [PATCH 153/191] fix(sglang): require incremental streaming in sidecar discovery (#15150) Signed-off-by: jain-ria --- lib/mocker/servers/sglang/src/server.rs | 1 + lib/sidecar/sglang/README.md | 8 +++---- lib/sidecar/sglang/src/client.rs | 32 ++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/lib/mocker/servers/sglang/src/server.rs b/lib/mocker/servers/sglang/src/server.rs index 0f53ab4ff20a..9a16f60558fa 100644 --- a/lib/mocker/servers/sglang/src/server.rs +++ b/lib/mocker/servers/sglang/src/server.rs @@ -204,6 +204,7 @@ impl SglangMockerService { pb::GetServerInfoResponse { json_info: json!({ "disaggregation_mode": self.config.mode.discovery_value(), + "incremental_streaming_output": true, "page_size": self.discovery.page_size, "max_total_num_tokens": self.discovery.max_total_num_tokens, "max_running_requests": self.discovery.max_running_requests, diff --git a/lib/sidecar/sglang/README.md b/lib/sidecar/sglang/README.md index da2c0330b66a..6342e51546a9 100644 --- a/lib/sidecar/sglang/README.md +++ b/lib/sidecar/sglang/README.md @@ -28,11 +28,9 @@ follow-up. Use `DYN_SIDECAR_GRPC_ENDPOINT` instead of `--grpc-endpoint` when the endpoint is provided through the environment. -Native Dynamo `/generate` requests are forwarded opaquely to SGLang's HTTP -endpoint using the gRPC host and the HTTP port returned by `GetServerInfo`. -The sidecar advertises this capability only after the HTTP health probe passes -and discovery confirms `--incremental-streaming-output`; otherwise it continues -serving the native gRPC path without advertising `/generate`. +Start SGLang with `--incremental-streaming-output`. The sidecar's gRPC streaming path expects each response to contain only new tokens; cumulative output would duplicate tokens and inflate completion-token counts. The sidecar checks `GetServerInfo` during discovery and rejects startup unless `incremental_streaming_output` is explicitly `true`. Unlike the in-process Python worker, the sidecar cannot set launch options on an already-running engine. + +Native Dynamo `/generate` requests are forwarded opaquely to SGLang's HTTP endpoint using the gRPC host and the HTTP port returned by `GetServerInfo`. The sidecar advertises this capability only after HTTP discovery and its health probe succeed; otherwise it continues serving the native gRPC path without advertising `/generate`. The sidecar discovers the model and tokenizer paths, served model name, parser defaults, worker role, context length, KV capacity, scheduler limits, data-parallel topology, and KV-event sources through SGLang's native discovery RPCs. Explicit Dynamo parser options override parser names discovered from SGLang. diff --git a/lib/sidecar/sglang/src/client.rs b/lib/sidecar/sglang/src/client.rs index 2a2be10f9c18..1d6b8ba2a428 100644 --- a/lib/sidecar/sglang/src/client.rs +++ b/lib/sidecar/sglang/src/client.rs @@ -229,6 +229,19 @@ fn parse_discovery( ) -> Result { let model_info = parse_json_object("GetModelInfo.json_info", &model.json_info)?; let server_info = parse_json_object("GetServerInfo.json_info", &server.json_info)?; + // Generate responses are forwarded as token deltas. Accepting cumulative + // output here would duplicate tokens and inflate completion usage. + if server_info + .get("incremental_streaming_output") + .and_then(Value::as_bool) + != Some(true) + { + return Err(invalid_arg( + "SGLang sidecar requires incremental streaming output; restart the SGLang server \ + with --incremental-streaming-output to prevent duplicated tokens and inflated \ + completion-token counts", + )); + } let model_path = if model.model_path.trim().is_empty() { model_info .get("model_path") @@ -378,7 +391,7 @@ mod tests { json_info: json!({"tokenizer_path": "tokenizer-repo"}).to_string(), }, pb::GetServerInfoResponse { - json_info: json!({}).to_string(), + json_info: json!({"incremental_streaming_output": true}).to_string(), }, Vec::new(), ) @@ -387,6 +400,23 @@ mod tests { assert_eq!(discovery.tokenizer_path, "tokenizer-repo"); } + #[test] + fn discovery_requires_incremental_streaming() { + let error = parse_discovery( + pb::GetModelInfoResponse { + model_path: "model-repo".to_string(), + json_info: "{}".to_string(), + }, + pb::GetServerInfoResponse { + json_info: json!({"incremental_streaming_output": false}).to_string(), + }, + Vec::new(), + ) + .unwrap_err() + .to_string(); + assert!(error.contains("--incremental-streaming-output"), "{error}"); + } + #[tokio::test] async fn discovery_deadline_bounds_a_half_open_peer() { let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); From 0b0ea869851b8f5812c30616be04e04b2c315f01 Mon Sep 17 00:00:00 2001 From: GLAMR Date: Tue, 22 Sep 2026 13:24:09 -0400 Subject: [PATCH 154/191] test(sglang): narrow the frontend port window in the tool-calling fixture (#15141) Signed-off-by: svc-glamr@nvidia.com --- tests/frontend/test_tool_calling_sglang.py | 32 ++++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/tests/frontend/test_tool_calling_sglang.py b/tests/frontend/test_tool_calling_sglang.py index e9e30c602b7f..f32cf6b0f2d0 100644 --- a/tests/frontend/test_tool_calling_sglang.py +++ b/tests/frontend/test_tool_calling_sglang.py @@ -28,10 +28,11 @@ import pytest from tests.conftest import EtcdServer, NatsServer +from tests.utils.constants import DynamoPortRange from tests.utils.gpu_args import build_gpu_mem_args from tests.utils.managed_process import ManagedProcess, check_health_ready from tests.utils.payloads import check_models_api -from tests.utils.port_utils import allocate_ports +from tests.utils.port_utils import allocate_port, deallocate_ports openai = pytest.importorskip("openai") OpenAI = openai.OpenAI @@ -270,14 +271,27 @@ def tool_calling_services( Yields the frontend HTTP port. """ topology: str = request.param - frontend_port, system_port, fpm_port = allocate_ports(count=3, start_port=10000) - + # Allocate from the disjoint bases in tests/utils/constants.py so this + # module cannot land on the window another suite allocates from. + allocated_ports: list[int] = [] + # Every allocation sits inside the try: each one registers its port before + # returning, so a raise from a later call would otherwise strand the + # earlier reservations. try: + system_port = allocate_port(DynamoPortRange.SERVE.value) + allocated_ports.append(system_port) + fpm_port = allocate_port(DynamoPortRange.FPM.value) + allocated_ports.append(fpm_port) + with WorkerProcess( request, system_port=system_port, fpm_port=fpm_port, topology=topology ): # Allow worker to register with discovery. time.sleep(2) + # allocate_port closes its probe socket, so the port is unowned + # until the frontend binds; take it here, after the engine boot. + frontend_port = allocate_port(DynamoPortRange.FRONTEND.value) + allocated_ports.append(frontend_port) with ToolCallingFrontendProcess( request, frontend_port=frontend_port, topology=topology ): @@ -294,9 +308,15 @@ def tool_calling_services( # / frontend process is gone before the next topology boots — otherwise # the next worker would race against pinned GPU memory or a stale # discovery registration. Followed by a brief settle delay so the OS - # reclaims bound ports and the GPU frees its VRAM. - _cleanup_sglang_stragglers() - time.sleep(3) + # reclaims bound ports and the GPU frees its VRAM. The registry + # entries are released last so no other test is handed a live port, + # and in a finally of their own so a raise from the sweep or the delay + # cannot leak them for the 900s the stale sweep takes to reclaim them. + try: + _cleanup_sglang_stragglers() + time.sleep(3) + finally: + deallocate_ports(allocated_ports) @pytest.fixture(scope="module") From d9eb42db1168131fdae318eef77255637e4d3495 Mon Sep 17 00:00:00 2001 From: jthomson04 Date: Tue, 22 Sep 2026 11:07:04 -0700 Subject: [PATCH 155/191] feat(sglang): support cache salt routing (#14803) Signed-off-by: jthomson04 --- components/src/dynamo/sglang/_compat.py | 13 +++++ .../src/dynamo/sglang/engine_generate.py | 12 +++++ .../request_handlers/llm/decode_handler.py | 5 ++ .../request_handlers/llm/prefill_handler.py | 5 +- components/src/dynamo/sglang/request_utils.py | 21 ++++++++ .../tests/test_sglang_decode_handler.py | 50 ++++++++++++++++++- .../tests/test_sglang_frontend_decoding.py | 49 ++++++++++++++++++ .../dynamo/sglang/tests/test_sglang_unit.py | 22 ++++++++ .../nvidia-request-extensions-nvext.md | 16 +++++- lib/kv-router/src/zmq_wire/deserialize.rs | 22 ++++++-- lib/kv-router/src/zmq_wire/tests.rs | 44 ++++++++++++++++ lib/llm/src/http/service/sglang_generate.rs | 23 +++++++++ lib/llm/src/protocols/sglang/generate.rs | 19 +++++++ tests/router/test_router_e2e_with_sglang.py | 28 +++++++++++ 14 files changed, 322 insertions(+), 7 deletions(-) create mode 100644 components/src/dynamo/sglang/request_utils.py diff --git a/components/src/dynamo/sglang/_compat.py b/components/src/dynamo/sglang/_compat.py index 518a0b777429..2393ac2eadf0 100644 --- a/components/src/dynamo/sglang/_compat.py +++ b/components/src/dynamo/sglang/_compat.py @@ -354,6 +354,18 @@ def filter_supported_async_generate_kwargs( return {key: value for key, value in kwargs.items() if key in supported_kwarg_names} +def cache_salt_kwargs(engine: Any, cache_salt: str | None) -> dict[str, Any]: + """Preserve cache isolation, rejecting salts an older engine cannot honor.""" + if not cache_salt: + return {} + # SGLang 0.5.11 in the XPU image lacks cache_salt. Remove this check when + # the XPU pin supports the explicit cache_salt argument (0.5.18+). + kwargs = filter_supported_async_generate_kwargs(engine, {"cache_salt": cache_salt}) + if "cache_salt" not in kwargs: + raise ValueError("cache_salt is not supported by the installed SGLang engine") + return kwargs + + def require_reasoning_kwargs(engine: Any, request: Mapping[str, Any]) -> dict[str, Any]: """Build the optional SGLang per-request reasoning-gate argument.""" require_reasoning = bool(request.get("require_reasoning", False)) @@ -368,6 +380,7 @@ def require_reasoning_kwargs(engine: Any, request: Mapping[str, Any]) -> dict[st __all__ = [ "ConfigArgumentMerger", + "cache_salt_kwargs", "ensure_sglang_tensor_image_size", "filter_supported_async_generate_kwargs", "get_encoder_preprocessor_modules", diff --git a/components/src/dynamo/sglang/engine_generate.py b/components/src/dynamo/sglang/engine_generate.py index 3ec185d718e0..0d37a487e99c 100644 --- a/components/src/dynamo/sglang/engine_generate.py +++ b/components/src/dynamo/sglang/engine_generate.py @@ -49,6 +49,7 @@ def build_native_generate_request( external_trace_header: dict[str, str] | None = None, routed_dp_rank: int | None = None, lora_path: str | None = None, + cache_salt: str | None = None, ) -> GenerateReqInput: """Reconstruct the installed SGLang version native request. @@ -64,6 +65,17 @@ def build_native_generate_request( request ID. """ payload = dict(native_payload) + salt = cache_salt if cache_salt is not None else payload.get("cache_salt") + if salt is None or salt == "": + payload.pop("cache_salt", None) + else: + # The separately pinned XPU release (0.5.11) silently ignores unknown + # dataclass fields. Remove this check when that pin supports cache_salt. + if "cache_salt" not in GenerateReqInput.__dataclass_fields__: + raise ValueError( + "cache_salt is not supported by the installed SGLang engine" + ) + payload["cache_salt"] = salt payload["input_ids"] = input_ids payload["rid"] = request_id payload["stream"] = True diff --git a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py index 808d1bcb39c9..c9524c20c869 100644 --- a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py +++ b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py @@ -22,6 +22,7 @@ from dynamo.llm import HttpError from dynamo.llm.exceptions import EngineShutdown from dynamo.sglang._compat import ( + cache_salt_kwargs, filter_supported_async_generate_kwargs, require_reasoning_kwargs, ) @@ -44,6 +45,7 @@ extract_media_urls, raise_if_unextracted_multimodal, ) +from dynamo.sglang.request_utils import request_cache_salt _SAMPLING_OPTION_FIELDS = ( "presence_penalty", @@ -550,6 +552,7 @@ def _native_generate_stream( ), routed_dp_rank=routing.get("dp_rank"), lora_path=self._resolve_lora(request), + cache_salt=request_cache_salt(request), ) return native_generate_stream(self.engine, native_request) @@ -673,6 +676,7 @@ async def generate( decode = await self.engine.async_generate( **input_param, **decode_mm_kwargs, + **cache_salt_kwargs(self.engine, request_cache_salt(request)), sampling_params=sampling_params, stream=True, **require_reasoning_kwargs(self.engine, request), @@ -758,6 +762,7 @@ async def generate( agg = await self.engine.async_generate( **input_param, + **cache_salt_kwargs(self.engine, request_cache_salt(request)), image_data=image_data, audio_data=audio_data, video_data=video_data, diff --git a/components/src/dynamo/sglang/request_handlers/llm/prefill_handler.py b/components/src/dynamo/sglang/request_handlers/llm/prefill_handler.py index a57e8fd353fa..8220c9250b7f 100644 --- a/components/src/dynamo/sglang/request_handlers/llm/prefill_handler.py +++ b/components/src/dynamo/sglang/request_handlers/llm/prefill_handler.py @@ -10,7 +10,7 @@ from dynamo._core import Context from dynamo.health_check import HEALTH_CHECK_KEY -from dynamo.sglang._compat import require_reasoning_kwargs +from dynamo.sglang._compat import cache_salt_kwargs, require_reasoning_kwargs from dynamo.sglang._disagg import validate_disagg_parallel_sampling from dynamo.sglang.agent_session import agent_session_kwargs from dynamo.sglang.args import Config @@ -31,6 +31,7 @@ build_disagg_mm_kwargs, raise_if_unextracted_multimodal, ) +from dynamo.sglang.request_utils import request_cache_salt # Sentinel value matching u32::MAX from the C/Go prefill-routing ABI. # This remains as a compatibility fallback for older callers that still encode @@ -198,6 +199,7 @@ async def generate( external_trace_header=trace_header, routed_dp_rank=dp_rank, lora_path=lora_path, + cache_salt=request_cache_salt(inner_request), ) submitted_request_id = _ordered_cancellation_request_id( sglang_request_id, @@ -216,6 +218,7 @@ async def generate( results = await self.engine.async_generate( **input_param, **mm_kwargs, + **cache_salt_kwargs(self.engine, request_cache_salt(inner_request)), sampling_params=sampling_params, stream=True, **require_reasoning_kwargs(self.engine, inner_request), diff --git a/components/src/dynamo/sglang/request_utils.py b/components/src/dynamo/sglang/request_utils.py new file mode 100644 index 000000000000..8d59a60ecf8f --- /dev/null +++ b/components/src/dynamo/sglang/request_utils.py @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +from collections.abc import Mapping +from typing import Any + + +def request_cache_salt(request: Mapping[str, Any]) -> str | None: + """Return the first non-empty cache salt, preferring resolved routing hints.""" + extra_args = request.get("extra_args") or {} + for source in ( + request.get("routing"), + extra_args.get("nvext") if isinstance(extra_args, Mapping) else None, + request.get("nvext"), + request, + ): + if isinstance(source, Mapping): + salt = source.get("cache_salt") + if salt: + return salt + return None diff --git a/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py b/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py index f17d78794370..45a395f37e52 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py +++ b/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py @@ -8,6 +8,7 @@ from unittest.mock import AsyncMock, Mock import pytest +from sglang.srt.managers.io_struct import GenerateReqInput from dynamo.common.constants import DisaggregationMode from dynamo.common.metadata_upload import MetadataUploader @@ -40,6 +41,7 @@ ) from dynamo.sglang.request_handlers.llm.prefill_handler import PrefillWorkerHandler from dynamo.sglang.request_handlers.multimodal.worker_handler import SglangUtils +from dynamo.sglang.request_utils import request_cache_salt pytestmark = [ pytest.mark.unit, @@ -364,8 +366,21 @@ async def stream(): assert not notified -def test_engine_generate_preserves_native_fields_and_overrides_worker_state(): +@pytest.mark.parametrize( + "body_salt,routing_salt,expected_salt", + [ + (None, None, None), + ("", None, None), + ("body-salt", None, "body-salt"), + ("body-salt", "", None), + ("body-salt", "tenant-a", "tenant-a"), + ], +) +def test_engine_generate_preserves_native_fields_and_overrides_worker_state( + body_salt, routing_salt, expected_salt +): request = { + "cache_salt": body_salt, "rid": "resolved-request", "sampling_params": { "max_new_tokens": 32, @@ -391,12 +406,14 @@ def test_engine_generate_preserves_native_fields_and_overrides_worker_state(): sampling_overrides={"n": 1, "max_new_tokens": 1}, bootstrap_host="prefill.internal", routed_dp_rank=3, + cache_salt=routing_salt, ) assert native.rid == "internal-request-id" assert native.input_ids == [7, 8] assert native.stream is True assert native.priority == 9 + assert native.cache_salt == expected_salt assert native.session_id == "session-1" assert native.return_logprob is True assert native.return_text_in_logprobs is True @@ -413,6 +430,37 @@ def test_engine_generate_preserves_native_fields_and_overrides_worker_state(): } +def test_native_generate_rejects_salt_without_engine_support(monkeypatch): + monkeypatch.delitem(GenerateReqInput.__dataclass_fields__, "cache_salt") + kwargs = {"input_ids": [1], "request_id": "request", "priority": None} + + with pytest.raises(ValueError, match="cache_salt is not supported"): + build_native_generate_request({"cache_salt": "tenant-a"}, **kwargs) + + native = build_native_generate_request({"cache_salt": ""}, **kwargs) + assert native.cache_salt is None + + +def test_request_cache_salt_precedence(): + request = { + "routing": {"cache_salt": "routing"}, + "extra_args": {"nvext": {"cache_salt": "extra"}}, + "nvext": {"cache_salt": "nvext"}, + "cache_salt": "body", + } + for source in [ + request["routing"], + request["extra_args"]["nvext"], + request["nvext"], + request, + ]: + assert request_cache_salt(request) == source["cache_salt"] + source["cache_salt"] = "" + assert request_cache_salt(request) is None + assert request_cache_salt({}) is None + assert request_cache_salt({"extra_args": [1], "cache_salt": "body"}) == "body" + + def test_engine_generate_requires_object_sampling_params_for_prefill_override(): request = {"sampling_params": [1, 2]} diff --git a/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py b/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py index d3dbe7113d0d..243ad08be1a9 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py +++ b/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py @@ -703,6 +703,55 @@ async def wait_forever(): return handler +@pytest.mark.asyncio +@pytest.mark.parametrize( + "mode", + [ + DisaggregationMode.AGGREGATED, + DisaggregationMode.PREFILL, + DisaggregationMode.DECODE, + ], +) +async def test_cache_salt_reaches_engine(mode, unused_tcp_port): + handler = ( + _new_prefill_handler() + if mode == DisaggregationMode.PREFILL + else _new_decode_handler(enable_frontend_decoding=False) + ) + handler.serving_mode = mode + recorder = _GenerateRecorder() + handler.engine = recorder + request = { + "token_ids": [1, 2, 3], + "routing": {"cache_salt": "tenant-a"}, + "extra_args": {"nvext": {"cache_salt": "body-salt"}}, + "bootstrap_info": { + "bootstrap_host": "prefill.invalid", + "bootstrap_port": unused_tcp_port, + "bootstrap_room": 7, + }, + } + routed_request = ( + {"request": request, "sampling_params": {}} + if mode == DisaggregationMode.PREFILL + else request + ) + + async for _ in handler.generate(routed_request, _Context()): + pass + + assert len(recorder.calls) == 1 + assert recorder.calls[0]["cache_salt"] == "tenant-a" + + del request["routing"] + del request["extra_args"] + async for _ in handler.generate(routed_request, _Context()): + pass + + assert len(recorder.calls) == 2 + assert "cache_salt" not in recorder.calls[1] + + @pytest.mark.asyncio async def test_aggregated_decode_omits_session_params_for_agent_context( session_agent_context: Dict[str, Any], diff --git a/components/src/dynamo/sglang/tests/test_sglang_unit.py b/components/src/dynamo/sglang/tests/test_sglang_unit.py index 5c31932bcd54..bb81b198cb72 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_unit.py +++ b/components/src/dynamo/sglang/tests/test_sglang_unit.py @@ -21,6 +21,7 @@ from dynamo.common.constants import DisaggregationMode, EmbeddingTransferMode from dynamo.common.snapshot.constants import SNAPSHOT_CONTROL_DIR_ENV from dynamo.sglang._compat import ( + cache_salt_kwargs, ensure_sglang_tensor_image_size, filter_supported_async_generate_kwargs, get_sglang_model_config, @@ -813,6 +814,27 @@ async def async_generate(self, input_ids=None, sampling_params=None): } +@pytest.mark.parametrize("salt", [None, "", "tenant-a"]) +def test_cache_salt_kwargs_for_older_engines(salt): + class OldEngine: + async def async_generate(self, input_ids=None): + return None + + if salt: + with pytest.raises(ValueError, match="cache_salt is not supported"): + cache_salt_kwargs(OldEngine(), salt) + else: + assert cache_salt_kwargs(OldEngine(), salt) == {} + + +def test_cache_salt_kwargs_preserves_supported_salt(): + class SaltedEngine: + async def async_generate(self, cache_salt=None): + return None + + assert cache_salt_kwargs(SaltedEngine(), "tenant-a") == {"cache_salt": "tenant-a"} + + def test_compat_keeps_async_generate_kwargs_for_newer_engines(): class NewEngine: async def async_generate(self, return_routed_experts=False): diff --git a/docs/fern/pages/developer-guide/additional-resources/nvidia-request-extensions-nvext.md b/docs/fern/pages/developer-guide/additional-resources/nvidia-request-extensions-nvext.md index 8a01c6ec5c16..fcd7a1bd4d24 100644 --- a/docs/fern/pages/developer-guide/additional-resources/nvidia-request-extensions-nvext.md +++ b/docs/fern/pages/developer-guide/additional-resources/nvidia-request-extensions-nvext.md @@ -36,7 +36,7 @@ Include `nvext` as a top-level field alongside standard OpenAI-compatible fields | `backend_instance_id` | `u64` | `None` | Router | Routes the request to a specific backend instance. | | `token_data` | `u32[]` | `None` | Preprocessor | Pre-tokenized prompt tokens. When present, the frontend skips tokenization. | | `max_thinking_tokens` | `u32` | `None` | Backend | Maximum thinking tokens allowed (passed through to backends). | -| `cache_salt` | `string` | `None` | Router / supported backends | Namespaces Dynamo KV routing. vLLM and TensorRT-LLM also isolate backend KV-cache reuse; see [Backend support](#backend-support). This is the recommended cache-isolation input. | +| `cache_salt` | `string` | `None` | Router / supported backends | Namespaces Dynamo KV routing. Supported backends also isolate backend KV-cache reuse; see [Backend support](#backend-support). This is the recommended cache-isolation input. | | `extra_fields` | `string[]` | `None` | Response builder | Fields to include in the response `nvext`. Supported: `"worker_id"`, `"timing"`, `"routed_experts"`, `"engine_data"`, `"stop_reason"`, `"detailed_finish_reason"`, `"prompt_token_ids"`, `"completion_token_ids"`, `"prompt_logprobs"`. | | `metadata_upload` | object | `None` | SGLang backend | Uploads final cumulative SGLang `meta_info` out of band. The object accepts one required `url` field. Requires an RL-enabled SGLang worker. | | `prefill_worker_id` | `u64` | `None` | Router | Routes the request to a specific prefill worker (disaggregated serving). | @@ -95,7 +95,19 @@ KV-cache entries: |---------|---------|----------| | vLLM | Supported | Router matching and backend KV-cache reuse are isolated by salt. | | TensorRT-LLM | Supported | Router matching and backend KV-cache reuse are isolated by salt. | -| SGLang | Not supported end to end | Dynamo request hashes are namespaced, but the embedded SGLang engine does not receive the salt. SGLang KV events and radix-cache reuse remain unsalted. Do not rely on `cache_salt` for tenant cache isolation with SGLang. | +| SGLang | Supported for Python text workers | Workers started with `python -m dynamo.sglang` isolate router matching and backend KV-cache reuse in aggregated and disaggregated text generation, including native `/generate`, with SGLang 0.5.18 and 0.5.19. | + +SGLang cache salt routing is available in Dynamo development builds that include +[PR #14803](https://github.com/ai-dynamo/dynamo/pull/14803). Updating SGLang alone does not +enable this support. The SGLang sidecar, dedicated multimodal workers, LoRA combinations, +diffusion, and storage extensions do not provide this cache salt isolation guarantee. + +Before sending salted requests to SGLang, update all Dynamo SGLang workers and router KV-event +consumers to a build with this support. Unsalted requests continue to work during the upgrade. +The pinned XPU image with SGLang 0.5.11 supports unsalted requests only; salted requests +produce an unsupported-feature error. +Native SGLang `/generate` accepts its top-level `cache_salt` body field as a string; it does not +use `x-tenant-id`. An empty string is treated as absent. Chat completion and completion requests accept three inputs, in descending precedence: diff --git a/lib/kv-router/src/zmq_wire/deserialize.rs b/lib/kv-router/src/zmq_wire/deserialize.rs index 62cc8493f087..1292ac33468b 100644 --- a/lib/kv-router/src/zmq_wire/deserialize.rs +++ b/lib/kv-router/src/zmq_wire/deserialize.rs @@ -33,6 +33,14 @@ impl<'de> Deserialize<'de> for RawKvEvent { struct RawKvEventVisitor; +/// SGLang appends typed metadata where vLLM carries its optional LoRA name. +#[derive(Deserialize)] +#[serde(untagged)] +enum BlockStoredNamespace { + LoraName(String), + SglangMetadata { cache_salt: String }, +} + impl<'de> Visitor<'de> for RawKvEventVisitor { type Value = RawKvEvent; @@ -203,7 +211,14 @@ impl<'de> Visitor<'de> for RawKvEventVisitor { // Position 5 was lora_id in older formats; consume and discard for compat. let _lora_id: Option = seq.next_element()?.unwrap_or(None); let medium: Option = normalize_medium(seq.next_element()?.unwrap_or(None)); - let lora_name: Option = seq.next_element()?.unwrap_or(None); + let namespace: Option = seq.next_element()?.unwrap_or(None); + let (lora_name, cache_namespace) = match namespace { + Some(BlockStoredNamespace::LoraName(name)) => (Some(name), None), + Some(BlockStoredNamespace::SglangMetadata { cache_salt }) => { + (None, (!cache_salt.is_empty()).then_some(cache_salt)) + } + None => (None, None), + }; let extra_keys: Option>>> = seq.next_element()?.unwrap_or(None); let mut trailing = std::array::from_fn(|_| None); @@ -220,8 +235,9 @@ impl<'de> Visitor<'de> for RawKvEventVisitor { let parsed = parse_block_stored_trailing::(trailing, trailing_len)?; - let cache_namespace = - extra_keys_to_cache_namespace(extra_keys.as_deref(), lora_name.as_deref()); + let cache_namespace = cache_namespace.or_else(|| { + extra_keys_to_cache_namespace(extra_keys.as_deref(), lora_name.as_deref()) + }); let block_mm_infos = parsed .block_mm_infos .or_else(|| extra_keys_to_block_mm_infos(extra_keys)); diff --git a/lib/kv-router/src/zmq_wire/tests.rs b/lib/kv-router/src/zmq_wire/tests.rs index b32782eff9d8..aa56e4e3a189 100644 --- a/lib/kv-router/src/zmq_wire/tests.rs +++ b/lib/kv-router/src/zmq_wire/tests.rs @@ -22,6 +22,50 @@ enum TestEventKind { BlockRemoved, } +#[test] +fn test_deserialize_sglang_cache_salt() { + for salt in [None, Some(""), Some("tenant-a")] { + let mut event = serde_json::json!(["BlockStored", [-123], null, [10, 11], 2, null, "GPU"]); + if let Some(salt) = salt { + event + .as_array_mut() + .unwrap() + .push(serde_json::json!({"cache_salt": salt})); + } + let raw: RawKvEvent = from_slice(&to_vec(&event).unwrap()).unwrap(); + let RawKvEvent::BlockStored { + cache_namespace, + lora_name, + .. + } = raw + else { + panic!("expected BlockStored"); + }; + assert_eq!( + cache_namespace.as_deref(), + salt.filter(|salt| !salt.is_empty()) + ); + assert_eq!(lora_name, None); + } + + for metadata in [ + serde_json::json!({}), + serde_json::json!({"cache_salt": 123}), + ] { + let event = serde_json::json!([ + "BlockStored", + [-123], + null, + [10, 11], + 2, + null, + "GPU", + metadata + ]); + assert!(from_slice::(&to_vec(&event).unwrap()).is_err()); + } +} + #[test] fn test_deserialize_bigram_block_stored_sequence() { let raw_event = ( diff --git a/lib/llm/src/http/service/sglang_generate.rs b/lib/llm/src/http/service/sglang_generate.rs index a0bdab11d7f3..36084ac0cc7b 100644 --- a/lib/llm/src/http/service/sglang_generate.rs +++ b/lib/llm/src/http/service/sglang_generate.rs @@ -201,6 +201,7 @@ fn preprocessed_request( let min_tokens = request.min_new_tokens().map_err(anyhow::Error::msg)?; let ignore_eos = request.ignore_eos().map_err(anyhow::Error::msg)?; let routing_priority = request.priority.unwrap_or_default(); + let cache_namespace = request.cache_namespace().map(str::to_owned); let (input_ids, worker_envelope) = request.into_worker_envelope(request_id); let mut extra_args = serde_json::Map::new(); extra_args.insert("sglang_tito".to_string(), worker_envelope); @@ -227,6 +228,7 @@ fn preprocessed_request( expected_output_tokens: max_tokens, priority_jump: Some(routing_priority.max(0) as f64), priority: Some(routing_priority), + cache_namespace, ..Default::default() })) .extra_args(Some(serde_json::Value::Object(extra_args))) @@ -482,6 +484,27 @@ mod tests { use crate::http::service::generate::tests::{WorkerUnavailableEngine, dispatch_test_context}; use crate::http::service::metrics::{Endpoint, RequestType, Status}; + #[test] + fn cache_salt_matches_routing_and_native_payload() { + for salt in [None, Some(""), Some("tenant-a")] { + let request: SglangGenerateRequest = serde_json::from_value(serde_json::json!({ + "input_ids": [1, 2], + "cache_salt": salt, + })) + .unwrap(); + let request = preprocessed_request(request, "test-model", None, "request-id").unwrap(); + let expected = salt.filter(|salt| !salt.is_empty()); + assert_eq!( + request.routing.unwrap().cache_namespace.as_deref(), + expected + ); + assert_eq!( + request.extra_args.unwrap()["sglang_tito"]["cache_salt"].as_str(), + expected, + ); + } + } + #[tokio::test] async fn worker_unavailable_dispatch_returns_503() { let engine: crate::types::openai::generate::GenerateStreamingEngine = diff --git a/lib/llm/src/protocols/sglang/generate.rs b/lib/llm/src/protocols/sglang/generate.rs index e2d22eef6058..001832938edb 100644 --- a/lib/llm/src/protocols/sglang/generate.rs +++ b/lib/llm/src/protocols/sglang/generate.rs @@ -35,6 +35,8 @@ pub struct SglangGenerateRequest { pub stream: bool, #[serde(default)] pub priority: Option, + #[serde(default)] + pub cache_salt: Option, #[serde(flatten)] passthrough: Map, } @@ -84,9 +86,16 @@ impl SglangGenerateRequest { sampling_field(self.sampling_params.as_ref(), "ignore_eos") } + pub fn cache_namespace(&self) -> Option<&str> { + self.cache_salt.as_deref().filter(|salt| !salt.is_empty()) + } + /// Move the native request into its routed input and opaque worker envelope. pub fn into_worker_envelope(self, request_id: &str) -> (Vec, Value) { let mut envelope = self.passthrough; + if let Some(salt) = self.cache_salt.filter(|salt| !salt.is_empty()) { + envelope.insert("cache_salt".to_string(), Value::String(salt)); + } envelope.insert( "sampling_params".to_string(), self.sampling_params @@ -103,6 +112,16 @@ impl SglangGenerateRequest { mod tests { use super::*; + #[test] + fn request_rejects_non_string_cache_salt() { + assert!( + serde_json::from_value::(serde_json::json!({ + "input_ids": [1], "cache_salt": 42 + })) + .is_err() + ); + } + #[test] fn request_preserves_native_body_opaquely() { let request: SglangGenerateRequest = serde_json::from_value(serde_json::json!({ diff --git a/tests/router/test_router_e2e_with_sglang.py b/tests/router/test_router_e2e_with_sglang.py index 5903fb3d426e..b44e2c515a8e 100644 --- a/tests/router/test_router_e2e_with_sglang.py +++ b/tests/router/test_router_e2e_with_sglang.py @@ -14,6 +14,7 @@ from tests.router.e2e_harness import ( ManagedEngineProcessMixin, run_basic_router_test, + run_cache_salt_isolation_test, run_disagg_router_decisions_test, run_indexers_sync_test, run_router_decisions_test, @@ -334,6 +335,33 @@ def test_router_decisions_sglang_multiple_workers( ) +@pytest.mark.e2e +@pytest.mark.model(MODEL_NAME) +@pytest.mark.pre_merge +@pytest.mark.gpu_1 +@pytest.mark.profiled_vram_gib(12.0) +@pytest.mark.requested_sglang_kv_tokens(2048) +@pytest.mark.timeout(300) +@pytest.mark.parametrize("request_plane", ["tcp"], indirect=True) +def test_router_cache_salt_isolation_sglang( + request, + runtime_services_dynamic_ports, + predownload_models, + set_ucx_tls_no_mm, + request_plane, +): + run_cache_salt_isolation_test( + engine_process_cls=SGLangProcess, + engine_args_name="sglang_args", + engine_args=SGLANG_ARGS, + request=request, + request_plane=request_plane, + model_name=MODEL_NAME, + block_size=PAGE_SIZE, + component_name="backend", + ) + + @pytest.mark.e2e @pytest.mark.model(MODEL_NAME) @pytest.mark.h100 From 5c0a79a2ad2db2faa9591877c989bbd0b545c3d4 Mon Sep 17 00:00:00 2001 From: cmdy Date: Wed, 23 Sep 2026 02:21:34 +0800 Subject: [PATCH 156/191] fix(sglang): handle structured output with reasoning enabled (#14465) Signed-off-by: cmdy --- .../src/dynamo/frontend/sglang_prepost.py | 25 ++- .../src/dynamo/frontend/sglang_processor.py | 10 +- .../tests/test_sglang_processor_unit.py | 199 +++++++++++++++++- 3 files changed, 219 insertions(+), 15 deletions(-) diff --git a/components/src/dynamo/frontend/sglang_prepost.py b/components/src/dynamo/frontend/sglang_prepost.py index dde1eb2ef4e6..f43d0a6e235e 100644 --- a/components/src/dynamo/frontend/sglang_prepost.py +++ b/components/src/dynamo/frontend/sglang_prepost.py @@ -347,14 +347,27 @@ def named_closed_zero_arg_tool(request: dict[str, Any]) -> str | None: return None -def _guided_tool_choice_requires_reasoning( - request: dict[str, Any], force_reasoning: bool +def _guided_output_requires_reasoning( + request: dict[str, Any], + force_reasoning: bool, + reasoning_parser_name: str | None = None, ) -> bool: - """Return whether SGLang should reason before guided tool-call JSON.""" + """Return whether SGLang should reason before guided output.""" + if not force_reasoning: + return False + tool_choice = request.get("tool_choice", "auto") - return force_reasoning and ( - tool_choice == "required" or _is_named_tool_choice(tool_choice) - ) + if tool_choice == "required" or _is_named_tool_choice(tool_choice): + return True + + # Explicit legacy constraints take precedence over response_format. + if legacy_guided_decoding(request): + return False + + response_format = request.get("response_format") + if not isinstance(response_format, dict) or reasoning_parser_name == "gpt-oss": + return False + return response_format.get("type") != "text" def _normalize_deepseek_v4_hint(value: Any) -> str: diff --git a/components/src/dynamo/frontend/sglang_processor.py b/components/src/dynamo/frontend/sglang_processor.py index b25de327a1a6..11c7e742b3e2 100644 --- a/components/src/dynamo/frontend/sglang_processor.py +++ b/components/src/dynamo/frontend/sglang_processor.py @@ -32,7 +32,7 @@ ToolCallParserType, _client_wants_separate_reasoning, _get_history_tool_calls_count, - _guided_tool_choice_requires_reasoning, + _guided_output_requires_reasoning, convert_tools, create_parsers, detect_force_reasoning_from_template, @@ -357,8 +357,8 @@ def _preprocess_worker( pre.guided_decoding, pre.tool_call_parser, pre.reasoning_parser, - require_reasoning=_guided_tool_choice_requires_reasoning( - request, pre.force_reasoning + require_reasoning=_guided_output_requires_reasoning( + request, pre.force_reasoning, _w_reasoning_parser_name ), ) @@ -615,8 +615,8 @@ async def _generator_inner( pre.guided_decoding, pre.tool_call_parser, pre.reasoning_parser, - require_reasoning=_guided_tool_choice_requires_reasoning( - request, pre.force_reasoning + require_reasoning=_guided_output_requires_reasoning( + request, pre.force_reasoning, self.reasoning_parser_name ), ) except PreprocessError as exc: diff --git a/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py b/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py index cbd97aee0205..b6a9c2b543ac 100644 --- a/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py +++ b/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py @@ -14,7 +14,7 @@ import json import sys import types -from concurrent.futures import ThreadPoolExecutor +from concurrent.futures import Future, ThreadPoolExecutor from contextlib import nullcontext import pytest @@ -37,7 +37,7 @@ SglangPreprocessResult, SglangStreamingPostProcessor, _flatten_message_content, - _guided_tool_choice_requires_reasoning, + _guided_output_requires_reasoning, _normalize_assistant_tool_call_arguments, _normalize_prompt_token_ids, _normalize_sglang_parser_name, @@ -1061,7 +1061,7 @@ def test_qwen_separate_reasoning_false_keeps_generation_gate(tokenizer, tool_cho assert result.force_reasoning is True assert result.reasoning_parser is None - assert _guided_tool_choice_requires_reasoning(request, result.force_reasoning) + assert _guided_output_requires_reasoning(request, result.force_reasoning) @pytest.mark.parametrize( @@ -1138,7 +1138,120 @@ def test_guided_tool_choice_requires_effective_reasoning( ): """Only reasoning-enabled required or named tools activate the gate.""" request = {"tool_choice": tool_choice} - assert _guided_tool_choice_requires_reasoning(request, force_reasoning) is expected + assert _guided_output_requires_reasoning(request, force_reasoning) is expected + + +@pytest.mark.core +def test_structured_response_requires_effective_reasoning(): + request = {"response_format": {"type": "json_schema"}} + + assert _guided_output_requires_reasoning(request, True, "deepseek-v4") is True + assert _guided_output_requires_reasoning(request, False, "deepseek-v4") is False + assert _guided_output_requires_reasoning(request, True, "gpt-oss") is False + assert not _guided_output_requires_reasoning( + {"response_format": {"type": "text"}}, True, "deepseek-v4" + ) + + +@pytest.mark.core +@pytest.mark.parametrize( + ("legacy_constraint", "expected"), + [ + ({"guided_regex": "trueish"}, False), + ({"guided_choice": []}, True), + ], +) +def test_structured_response_respects_legacy_constraint_precedence( + legacy_constraint, expected +): + request = {"response_format": {"type": "json_schema"}, **legacy_constraint} + + assert _guided_output_requires_reasoning(request, True, "qwen3") is expected + + +@pytest.mark.core +@pytest.mark.timeout(60) +@pytest.mark.parametrize( + ("use_pool", "thinking", "separate_reasoning", "legacy_regex"), + [ + pytest.param(False, True, True, False, id="inline-structured"), + pytest.param(False, False, True, False, id="inline-thinking-disabled"), + pytest.param(False, True, False, False, id="inline-separation-disabled"), + pytest.param(False, True, True, True, id="inline-legacy-regex"), + pytest.param(True, True, True, False, id="pool-structured"), + ], +) +def test_structured_response_generator_forwards_reasoning_gate( + tokenizer, monkeypatch, use_pool, thinking, separate_reasoning, legacy_regex +): + response_format = { + "type": "json_schema", + "json_schema": { + "name": "answer", + "schema": { + "type": "object", + "properties": {"answer": {"type": "integer"}}, + "required": ["answer"], + }, + }, + } + request = { + "model": MODEL, + "messages": [{"role": "user", "content": "Return answer 42 as JSON."}], + "response_format": response_format, + "chat_template_kwargs": {"enable_thinking": thinking}, + "separate_reasoning": separate_reasoning, + "stream": True, + } + if legacy_regex: + request["guided_regex"] = "trueish" + routed_engine = FakeRoutedEngine(items=[{"token_ids": [], "finish_reason": "stop"}]) + + class InlinePreprocessPool: + # Keep the real worker and pool generator path without spawning processes. + def submit(self, fn, *args): + future = Future() + future.set_result(fn(*args)) + return future + + if use_pool: + monkeypatch.setattr(sglang_processor_module, "_w_tokenizer", tokenizer) + monkeypatch.setattr(sglang_processor_module, "_w_tool_call_parser_name", None) + monkeypatch.setattr( + sglang_processor_module, "_w_reasoning_parser_name", "qwen3" + ) + monkeypatch.setattr( + sglang_processor_module, "_w_exclude_tools_when_tool_choice_none", True + ) + monkeypatch.setattr( + sglang_processor_module, "_w_template_force_reasoning", False + ) + monkeypatch.setattr(sglang_processor_module, "_w_default_thinking_mode", None) + processor = SglangProcessor( + tokenizer=tokenizer, + routed_engine=routed_engine, + tool_call_parser_name=None, + reasoning_parser_name="qwen3", + eos_token_ids=None, + preprocess_pool=InlinePreprocessPool() if use_pool else None, + ) + + async def collect(): + return [item async for item in processor.generator(request)] + + asyncio.run(collect()) + assert len(routed_engine.requests) == 1 + assert routed_engine.requests[0]["require_reasoning"] is ( + thinking and not legacy_regex + ) + if legacy_regex: + assert routed_engine.requests[0]["sampling_options"]["guided_decoding"] == { + "regex": "trueish" + } + else: + assert routed_engine.requests[0]["sampling_options"]["guided_decoding"] == { + "json": response_format["json_schema"]["schema"] + } class _CapturingReasoningParser: @@ -4451,6 +4564,84 @@ def test_required_tool_distinguishes_bare_json_from_reasoning( "city": "New York" } + @pytest.mark.core + @pytest.mark.timeout(60) + @pytest.mark.parametrize( + ("chunk_size", "finish_with_tokens"), [(1, False), (10000, True)] + ) + @pytest.mark.parametrize( + ("text", "expected_reasoning", "expected_content", "finish_reason"), + [ + ('{"answer":42}', '{"answer":42}', "", "stop"), + ('{"answer":42}', '{"answer":42}', "", "length"), + ( + '{"answer":41}{"answer":42}', + '{"answer":41}', + '{"answer":42}', + "stop", + ), + ], + ) + def test_structured_response_preserves_reasoning_boundaries( + self, + tokenizer, + chunk_size, + finish_with_tokens, + text, + expected_reasoning, + expected_content, + finish_reason, + ): + _, reasoning_parser = create_parsers( + {}, + tool_call_parser_name=None, + reasoning_parser_name="qwen3", + force_reasoning=True, + ) + assert reasoning_parser is not None + case_tokenizer = copy.deepcopy(tokenizer) + detector = reasoning_parser.detector + case_tokenizer.add_special_tokens( + { + "additional_special_tokens": [ + detector.think_start_token, + detector.think_end_token, + ] + } + ) + post = SglangStreamingPostProcessor( + tokenizer=case_tokenizer, + tool_call_parser=None, + reasoning_parser=reasoning_parser, + ) + token_ids = case_tokenizer.encode(text, add_special_tokens=False) + responses = [] + for offset in range(0, len(token_ids), chunk_size): + is_last = offset + chunk_size >= len(token_ids) + choice = post.process_output( + { + "token_ids": token_ids[offset : offset + chunk_size], + "finish_reason": ( + finish_reason if finish_with_tokens and is_last else None + ), + } + ) + if choice: + responses.append(choice) + if not finish_with_tokens: + terminal = post.process_output( + {"token_ids": [], "finish_reason": finish_reason} + ) + assert terminal is not None + responses.append(terminal) + content = "".join(item["delta"].get("content", "") for item in responses) + reasoning = "".join( + item["delta"].get("reasoning_content", "") for item in responses + ) + assert content == expected_content + assert reasoning == expected_reasoning + assert responses[-1]["finish_reason"] == finish_reason + # --------------------------------------------------------------------------- # Utility functions From 373bc9f92944507f8a82dd602dc391c0f83d61f1 Mon Sep 17 00:00:00 2001 From: GuanLuo <41310872+GuanLuo@users.noreply.github.com> Date: Tue, 22 Sep 2026 12:33:24 -0700 Subject: [PATCH 157/191] feat(vllm-omni): support FastH3 VSA (#14702) Signed-off-by: Guan Luo --- .../src/dynamo/common/configuration/utils.py | 4 +- components/src/dynamo/frontend/prepost.py | 16 +---- .../src/dynamo/frontend/vllm_protocol.py | 37 ++++++++++++ components/src/dynamo/vllm/omni/args.py | 53 +++++++++++----- .../dynamo/vllm/tests/omni/test_omni_args.py | 58 ++++++++++++++++++ .../vllm/tests/omni/test_omni_base_handler.py | 30 +++++++++- .../vllm/tests/test_vllm_renderer_api.py | 7 +-- .../backends/vllm-omni-configuration.mdx | 11 +++- .../diffusion/workflows/text-to-video.md | 22 +++++++ .../vllm/launch/agg_omni_minimax_h3.sh | 37 +++++++++++- .../vllm/launch/validate_omni_minimax_h3.sh | 60 +++++++++++++++++-- .../backends/vllm/omni/video_audio.Dockerfile | 14 ++++- tests/frontend/test_prepost.py | 8 +-- tests/frontend/test_prepost_mistral.py | 8 +-- 14 files changed, 300 insertions(+), 65 deletions(-) create mode 100644 components/src/dynamo/frontend/vllm_protocol.py diff --git a/components/src/dynamo/common/configuration/utils.py b/components/src/dynamo/common/configuration/utils.py index 79c07d33a28a..af2dae1d8a38 100644 --- a/components/src/dynamo/common/configuration/utils.py +++ b/components/src/dynamo/common/configuration/utils.py @@ -160,7 +160,7 @@ def add_negatable_bool_argument( *, flag_name: str, env_var: str, - default: bool, + default: Optional[bool], help: str, dest: Optional[str] = None, obsolete_flag: Optional[str] = None, @@ -173,7 +173,7 @@ def add_negatable_bool_argument( parser: ArgumentParser or argument group flag_name: Primary flag (must start with '--', e.g. "--enable-feature") env_var: Environment variable name (e.g., "DYN_ENABLE_FEATURE") - default: Default value + default: Default value. Use None when an omitted flag must remain unset. help: Help text dest: Optional destination name for the parsed value obsolete_flag: Optional obsolete/legacy flag (for help msg only, must start with '--') diff --git a/components/src/dynamo/frontend/prepost.py b/components/src/dynamo/frontend/prepost.py index 14d761d88dde..f7d4010e47a4 100644 --- a/components/src/dynamo/frontend/prepost.py +++ b/components/src/dynamo/frontend/prepost.py @@ -14,8 +14,6 @@ from functools import lru_cache, partial from typing import TYPE_CHECKING, Any, Protocol, TypeGuard, cast -from packaging.version import Version -from vllm import __version__ as vllm_version from vllm.entrypoints.chat_utils import make_tool_call_id from vllm.entrypoints.openai.chat_completion.protocol import ( ChatCompletionNamedFunction, @@ -31,24 +29,12 @@ from vllm.utils.async_utils import make_async from dynamo.common.utils.guided_json import admits_only_empty_object +from dynamo.frontend.vllm_protocol import DeltaFunctionCall, DeltaMessage, DeltaToolCall from dynamo.llm.exceptions import InvalidArgument from .thinking import apply_default_thinking_mode_to_template_kwargs from .utils import legacy_guided_decoding -if Version(vllm_version).release >= (0, 29): - from vllm.entrypoints.generate.base.protocol import ( - DeltaFunctionCall, - DeltaMessage, - DeltaToolCall, - ) -else: - from vllm.entrypoints.openai.engine.protocol import ( - DeltaFunctionCall, - DeltaMessage, - DeltaToolCall, - ) - if TYPE_CHECKING: from vllm.config import ModelConfig diff --git a/components/src/dynamo/frontend/vllm_protocol.py b/components/src/dynamo/frontend/vllm_protocol.py new file mode 100644 index 000000000000..fb9ceaee7ab2 --- /dev/null +++ b/components/src/dynamo/frontend/vllm_protocol.py @@ -0,0 +1,37 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Compatibility imports for vLLM's shared OpenAI protocol types.""" + +from importlib.util import find_spec + +try: + _HAS_GENERATE_PROTOCOL = ( + find_spec("vllm.entrypoints.generate.base.protocol") is not None + ) +except ModuleNotFoundError: + _HAS_GENERATE_PROTOCOL = False + +if _HAS_GENERATE_PROTOCOL: + # vLLM 0.29 moved the shared types out of the OpenAI engine package. + from vllm.entrypoints.generate.base.protocol import ( + DeltaFunctionCall, + DeltaMessage, + DeltaToolCall, + FunctionDefinition, + ) +else: + # vLLM 0.27 and 0.28 expose the same types at the legacy path. + from vllm.entrypoints.openai.engine.protocol import ( + DeltaFunctionCall, + DeltaMessage, + DeltaToolCall, + FunctionDefinition, + ) + +__all__ = [ + "DeltaFunctionCall", + "DeltaMessage", + "DeltaToolCall", + "FunctionDefinition", +] diff --git a/components/src/dynamo/vllm/omni/args.py b/components/src/dynamo/vllm/omni/args.py index b4ac027becef..f23f8d6e227f 100644 --- a/components/src/dynamo/vllm/omni/args.py +++ b/components/src/dynamo/vllm/omni/args.py @@ -30,6 +30,7 @@ add_argument, add_negatable_bool_argument, env_or_default, + parse_bool, ) from dynamo.common.constants import DisaggregationMode @@ -46,19 +47,20 @@ class OmniDiffusionKwargs: passthrough in base_handler is automatic. """ - enable_layerwise_offload: bool = False + enable_layerwise_offload: Optional[bool] = None layerwise_num_gpu_layers: int = 1 - vae_use_slicing: bool = False - vae_use_tiling: bool = False - boundary_ratio: float = 0.875 + vae_use_slicing: Optional[bool] = None + vae_use_tiling: Optional[bool] = None + boundary_ratio: Optional[float] = None flow_shift: Optional[float] = None cache_backend: Optional[str] = None cache_config: Optional[str] = None - enable_cache_dit_summary: bool = False - enable_cpu_offload: bool = False + enable_cache_dit_summary: Optional[bool] = None + enable_cpu_offload: Optional[bool] = None task_type: Optional[str] = None lora_path: Optional[list[str]] = None diffusion_attention_backend: Optional[str] = None + fastvideo_vsa_topk: Optional[int] = None enforce_eager: bool = False @@ -117,7 +119,8 @@ def add_arguments(self, parser) -> None: g, flag_name="--enable-layerwise-offload", env_var="DYN_OMNI_ENABLE_LAYERWISE_OFFLOAD", - default=False, + default=None, + env_value_type=parse_bool, help="Enable layerwise (blockwise) offloading on DiT modules to reduce GPU memory.", ) add_argument( @@ -132,25 +135,27 @@ def add_arguments(self, parser) -> None: g, flag_name="--vae-use-slicing", env_var="DYN_OMNI_VAE_USE_SLICING", - default=False, + default=None, + env_value_type=parse_bool, help="Enable VAE slicing for memory optimization in diffusion models.", ) add_negatable_bool_argument( g, flag_name="--vae-use-tiling", env_var="DYN_OMNI_VAE_USE_TILING", - default=False, + default=None, + env_value_type=parse_bool, help="Enable VAE tiling for memory optimization in diffusion models.", ) add_argument( g, flag_name="--boundary-ratio", env_var="DYN_OMNI_BOUNDARY_RATIO", - default=0.875, + default=None, arg_type=float, help=( "Boundary split ratio for low/high DiT transformers. " - "Default 0.875 uses both transformers for best quality. " + "When omitted, the model pipeline selects its default. " "Set to 1.0 to load only the low-noise transformer (saves memory)." ), ) @@ -185,14 +190,16 @@ def add_arguments(self, parser) -> None: g, flag_name="--enable-cache-dit-summary", env_var="DYN_OMNI_ENABLE_CACHE_DIT_SUMMARY", - default=False, + default=None, + env_value_type=parse_bool, help="Enable cache-dit summary logging after diffusion forward passes.", ) add_negatable_bool_argument( g, flag_name="--enable-cpu-offload", env_var="DYN_OMNI_ENABLE_CPU_OFFLOAD", - default=False, + default=None, + env_value_type=parse_bool, help="Enable CPU offloading for diffusion models to reduce GPU memory usage.", ) add_argument( @@ -221,6 +228,17 @@ def add_arguments(self, parser) -> None: default=None, help="vLLM-Omni diffusion attention backend.", ) + add_argument( + g, + flag_name="--fastvideo-vsa-topk", + env_var="DYN_OMNI_FASTVIDEO_VSA_TOPK", + default=None, + arg_type=int, + help=( + "Key/value blocks retained per query block by the " + "FASTVIDEO_VSA diffusion attention backend." + ), + ) add_negatable_bool_argument( g, flag_name="--enforce-eager", @@ -482,8 +500,15 @@ def validate(self) -> None: raise ValueError("--allgather-degree must be > 0") if self.parallel.text_encoder_tp_size <= 0: raise ValueError("--text-encoder-tp-size must be > 0") - if not (0 < self.diffusion.boundary_ratio <= 1): + if self.diffusion.boundary_ratio is not None and not ( + 0 < self.diffusion.boundary_ratio <= 1 + ): raise ValueError("--boundary-ratio must be in (0, 1]") + if ( + self.diffusion.fastvideo_vsa_topk is not None + and self.diffusion.fastvideo_vsa_topk <= 0 + ): + raise ValueError("--fastvideo-vsa-topk must be > 0") if self.stage_configs_path is None: if self.stage_id is not None: raise ValueError("--stage-id requires --stage-configs-path") diff --git a/components/src/dynamo/vllm/tests/omni/test_omni_args.py b/components/src/dynamo/vllm/tests/omni/test_omni_args.py index 346aa9dba1a2..0e2e7539d6ea 100644 --- a/components/src/dynamo/vllm/tests/omni/test_omni_args.py +++ b/components/src/dynamo/vllm/tests/omni/test_omni_args.py @@ -130,6 +130,57 @@ def test_ulysses_a2a_permute_parses_as_parallel_option(): assert args.ulysses_a2a_permute is True +def test_fastvideo_vsa_topk_parses_as_diffusion_option(): + parser = argparse.ArgumentParser() + OmniArgGroup().add_arguments(parser) + + args = parser.parse_args(["--fastvideo-vsa-topk", "64"]) + + assert args.fastvideo_vsa_topk == 64 + + +def test_diffusion_only_options_remain_unset_when_omitted(): + parser = argparse.ArgumentParser() + OmniArgGroup().add_arguments(parser) + + args = parser.parse_args([]) + + assert { + "enable_layerwise_offload": args.enable_layerwise_offload, + "vae_use_slicing": args.vae_use_slicing, + "vae_use_tiling": args.vae_use_tiling, + "boundary_ratio": args.boundary_ratio, + "enable_cache_dit_summary": args.enable_cache_dit_summary, + "enable_cpu_offload": args.enable_cpu_offload, + } == { + "enable_layerwise_offload": None, + "vae_use_slicing": None, + "vae_use_tiling": None, + "boundary_ratio": None, + "enable_cache_dit_summary": None, + "enable_cpu_offload": None, + } + + +def test_diffusion_bool_option_preserves_explicit_false(): + parser = argparse.ArgumentParser() + OmniArgGroup().add_arguments(parser) + + args = parser.parse_args(["--no-vae-use-tiling"]) + + assert args.vae_use_tiling is False + + +def test_diffusion_bool_environment_option_is_parsed(monkeypatch): + monkeypatch.setenv("DYN_OMNI_VAE_USE_TILING", "false") + parser = argparse.ArgumentParser() + OmniArgGroup().add_arguments(parser) + + args = parser.parse_args([]) + + assert args.vae_use_tiling is False + + @pytest.mark.parametrize("fps", [0, -1, -100]) def test_omni_config_invalid_video_fps(fps): config = _make_omni_config(default_video_fps=fps) @@ -165,6 +216,13 @@ def test_omni_config_valid_boundary_ratio(ratio): config.validate() +@pytest.mark.parametrize("topk", [0, -1]) +def test_omni_config_invalid_fastvideo_vsa_topk(topk): + config = _make_omni_config(fastvideo_vsa_topk=topk) + with pytest.raises(ValueError, match="--fastvideo-vsa-topk must be > 0"): + config.validate() + + def test_negative_stage_id_rejected(): config = _make_omni_config(stage_id=-1, stage_configs_path="/fake/path.yaml") with pytest.raises(ValueError, match="--stage-id must be >= 0"): diff --git a/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py b/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py index 1efcae11cf46..85a64496f1d9 100644 --- a/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py +++ b/components/src/dynamo/vllm/tests/omni/test_omni_base_handler.py @@ -23,6 +23,7 @@ pytest.mark.unit, pytest.mark.vllm, pytest.mark.gpu_0, + pytest.mark.xpu_1, pytest.mark.pre_merge, ] @@ -197,14 +198,39 @@ def test_model_defined_diffusion_fields_forwarded_to_async_omni(self): OmniDiffusionKwargs(), task_type="fl2va", lora_path=["/models/fasth3/adapter_model.safetensors"], - diffusion_attention_backend="TRTLLM_ATTN", + diffusion_attention_backend="FASTVIDEO_VSA", + fastvideo_vsa_topk=64, ) kwargs = _build_kwargs(config) assert kwargs["task_type"] == "fl2va" assert kwargs["lora_path"] == ["/models/fasth3/adapter_model.safetensors"] - assert kwargs["diffusion_attention_backend"] == "TRTLLM_ATTN" + assert kwargs["diffusion_attention_backend"] == "FASTVIDEO_VSA" + assert kwargs["fastvideo_vsa_topk"] == 64 + + def test_diffusion_only_defaults_not_forwarded_to_async_omni(self): + kwargs = _build_kwargs(_make_config()) + + for field in ( + "enable_layerwise_offload", + "vae_use_slicing", + "vae_use_tiling", + "boundary_ratio", + "enable_cache_dit_summary", + "enable_cpu_offload", + ): + assert field not in kwargs + + def test_explicit_false_diffusion_option_forwarded_to_async_omni(self): + config = _make_config() + config.diffusion = dataclasses.replace( + OmniDiffusionKwargs(), vae_use_tiling=False + ) + + kwargs = _build_kwargs(config) + + assert kwargs["vae_use_tiling"] is False def test_lora_disabled_resolves_no_capacity(self): config = _make_config() diff --git a/components/src/dynamo/vllm/tests/test_vllm_renderer_api.py b/components/src/dynamo/vllm/tests/test_vllm_renderer_api.py index 073582eba872..997734248ccb 100755 --- a/components/src/dynamo/vllm/tests/test_vllm_renderer_api.py +++ b/components/src/dynamo/vllm/tests/test_vllm_renderer_api.py @@ -16,18 +16,13 @@ import inspect import pytest -from packaging.version import Version # Import vllm first to ensure it's properly loaded before accessing submodules. _vllm = importlib.import_module("vllm") _chat_protocol = importlib.import_module( "vllm.entrypoints.openai.chat_completion.protocol" ) -_engine_protocol = importlib.import_module( - "vllm.entrypoints.generate.base.protocol" - if Version(_vllm.__version__).release >= (0, 29) - else "vllm.entrypoints.openai.engine.protocol" -) +_engine_protocol = importlib.import_module("dynamo.frontend.vllm_protocol") _inputs_data = importlib.import_module("vllm.inputs") _reasoning = importlib.import_module("vllm.reasoning") _sampling_params = importlib.import_module("vllm.sampling_params") diff --git a/docs/fern/pages/reference/backends/vllm-omni-configuration.mdx b/docs/fern/pages/reference/backends/vllm-omni-configuration.mdx index f1d224de3c8b..f39be88511a2 100644 --- a/docs/fern/pages/reference/backends/vllm-omni-configuration.mdx +++ b/docs/fern/pages/reference/backends/vllm-omni-configuration.mdx @@ -22,8 +22,8 @@ These are the vLLM-Omni orchestration flags. The omni worker also accepts the sa Path to stage config YAML (optional; vLLM-Omni uses model defaults if omitted). - - MoE expert switching boundary. + + MoE expert switching boundary. If omitted, the vLLM-Omni model pipeline selects its default. Scheduler flow_shift (5.0 for 720p, 12.0 for 480p). @@ -39,7 +39,12 @@ These are the vLLM-Omni orchestration flags. The omni worker also accepts the sa separate from request-time LoRA loading. - Default diffusion attention backend, such as `TRTLLM_ATTN` or `FLASH_ATTN`. + Default diffusion attention backend, such as `TRTLLM_ATTN`, `FLASH_ATTN`, or + `FASTVIDEO_VSA`. + + + Key/value blocks retained per query block by `FASTVIDEO_VSA`. The value must + be positive; FastH3 VSA starts with 64. ## Memory & Performance diff --git a/docs/fern/pages/use-cases/diffusion/workflows/text-to-video.md b/docs/fern/pages/use-cases/diffusion/workflows/text-to-video.md index 752f1191c429..be36bec12f9d 100644 --- a/docs/fern/pages/use-cases/diffusion/workflows/text-to-video.md +++ b/docs/fern/pages/use-cases/diffusion/workflows/text-to-video.md @@ -90,6 +90,8 @@ container/run.sh \ -e DYN_H3_MODEL_PATH \ -e DYN_H3_MODEL_REVISION \ -e DYN_H3_FASTH3_LORA_PATH \ + -e DYN_H3_FASTH3_VARIANT \ + -e DYN_H3_FASTVIDEO_VSA_TOPK \ -e HF_TOKEN \ -it ``` @@ -126,6 +128,26 @@ steps, omits request scheduler-shift overrides, and records request duration and adapter provenance. FastH3 v1 is T2VA-only and does not support CPU or layerwise offload. +To use FastH3 with Variable Sparse Attention (VSA), download a VSA adapter and +identify the variant to the launcher and qualification script: + +```bash +export DYN_H3_FASTH3_VARIANT=vsa-datafree +export DYN_H3_FASTH3_LORA_PATH="$(hf download \ + FastVideo/FastVideo-FastH3-4-step-Preview-v1-LoRA \ + vsa-datafree/adapter_model.safetensors \ + --revision bcf40ca6f457ed66f8badf13514943e390205fca)" +``` + +This path requires vLLM-Omni `v0.29.0rc1` or later. The video-audio overlay +pins `fastvideo-kernel==0.3.5`. For a `vsa-*` adapter, the launcher selects +`FASTVIDEO_VSA` and uses the portable Triton route, retaining 64 key/value +blocks per query block. Override the top-k value with +`DYN_H3_FASTVIDEO_VSA_TOPK`. FastH3 VSA supports pure Ulysses sequence +parallelism; ring and all-gather degrees must remain 1. Check the first-forward +worker logs for `FASTVIDEO_VSA H3 routing` and verify that it does not fall back +to dense SDPA. + Run the supplied end-to-end qualification against the same worker. It requests a 10-second clip, then verifies a non-empty H.264 stream at 24 FPS and a non-silent 32-kHz stereo AAC stream: diff --git a/examples/backends/vllm/launch/agg_omni_minimax_h3.sh b/examples/backends/vllm/launch/agg_omni_minimax_h3.sh index 626fac0d9da5..9c17fd7df370 100755 --- a/examples/backends/vllm/launch/agg_omni_minimax_h3.sh +++ b/examples/backends/vllm/launch/agg_omni_minimax_h3.sh @@ -9,7 +9,7 @@ trap 'echo Cleaning up...; kill 0' EXIT SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" source "$SCRIPT_DIR/../../../common/launch_utils.sh" -# MiniMax-H3 uses the four visible B200s for diffusion parallelism. The +# MiniMax-H3 uses the four visible GPUs for diffusion parallelism. The # text-generation KV-cache flags from gpu_utils.sh do not apply to this worker. MODEL="${DYN_H3_MODEL:-MiniMaxAI/MiniMax-H3}" @@ -22,8 +22,12 @@ TEXT_ENCODER_TP_SIZE="${DYN_H3_TEXT_ENCODER_TP_SIZE:-4}" # 448x256) do not leave ranks with empty tile lists. Larger workloads may opt # into the full DiT group size explicitly. VAE_PATCH_PARALLEL_SIZE="${DYN_H3_VAE_PATCH_PARALLEL_SIZE:-1}" -ATTENTION_BACKEND="${DYN_H3_ATTENTION_BACKEND:-TRTLLM_ATTN}" +RING_DEGREE="${DYN_H3_RING_DEGREE:-1}" +ALLGATHER_DEGREE="${DYN_H3_ALLGATHER_DEGREE:-1}" +ATTENTION_BACKEND="${DYN_H3_ATTENTION_BACKEND:-}" FASTH3_LORA_PATH="${DYN_H3_FASTH3_LORA_PATH:-}" +FASTH3_VARIANT="${DYN_H3_FASTH3_VARIANT:-}" +FASTVIDEO_VSA_TOPK="${DYN_H3_FASTVIDEO_VSA_TOPK:-64}" EXTRA_ARGS=() while [[ $# -gt 0 ]]; do @@ -61,11 +65,18 @@ done MODEL_PATH="${MODEL_PATH:-$MODEL}" FASTH3_ARGS=() +if [[ -n "$FASTH3_VARIANT" && -z "$FASTH3_LORA_PATH" ]]; then + echo "DYN_H3_FASTH3_VARIANT requires DYN_H3_FASTH3_LORA_PATH" >&2 + exit 1 +fi if [[ -n "$FASTH3_LORA_PATH" ]]; then if [[ ! -f "$FASTH3_LORA_PATH" ]]; then echo "FastH3 adapter not found: $FASTH3_LORA_PATH" >&2 exit 1 fi + if [[ -z "$FASTH3_VARIANT" ]]; then + FASTH3_VARIANT="$(basename "$(dirname "$FASTH3_LORA_PATH")")" + fi FASTH3_ARGS=(--lora-path "$FASTH3_LORA_PATH") EXAMPLE_INFERENCE_STEPS=4 EXAMPLE_SCHEDULER_FIELDS="" @@ -74,6 +85,26 @@ else EXAMPLE_SCHEDULER_FIELDS=$',\n "flow_shift": 12.0,\n "audio_flow_shift": 3.0' fi +if [[ "$FASTH3_VARIANT" == vsa-* ]]; then + ATTENTION_BACKEND="${ATTENTION_BACKEND:-FASTVIDEO_VSA}" + if [[ "$ATTENTION_BACKEND" != "FASTVIDEO_VSA" ]]; then + echo "FastH3 VSA requires DYN_H3_ATTENTION_BACKEND=FASTVIDEO_VSA" >&2 + exit 1 + fi + if [[ "$RING_DEGREE" != 1 || "$ALLGATHER_DEGREE" != 1 ]]; then + echo "FastH3 VSA supports pure Ulysses only; ring and all-gather degrees must be 1" >&2 + exit 1 + fi + if [[ ! "$FASTVIDEO_VSA_TOPK" =~ ^[1-9][0-9]*$ ]]; then + echo "DYN_H3_FASTVIDEO_VSA_TOPK must be a positive integer" >&2 + exit 1 + fi + python -c 'import fastvideo_kernel' + FASTH3_ARGS+=(--fastvideo-vsa-topk "$FASTVIDEO_VSA_TOPK") +else + ATTENTION_BACKEND="${ATTENTION_BACKEND:-TRTLLM_ATTN}" +fi + SERVED_MODEL_ARGS=() if [[ "$MODEL_PATH" != "$MODEL" ]]; then SERVED_MODEL_ARGS=(--served-model-name "$MODEL") @@ -140,6 +171,8 @@ DYN_SYSTEM_PORT="${DYN_SYSTEM_PORT:-8081}" \ --trust-remote-code \ --task-type fl2va \ --ulysses-degree "$ULYSSES_DEGREE" \ + --ring-degree "$RING_DEGREE" \ + --allgather-degree "$ALLGATHER_DEGREE" \ --text-encoder-tp-size "$TEXT_ENCODER_TP_SIZE" \ --vae-patch-parallel-size "$VAE_PATCH_PARALLEL_SIZE" \ --vae-use-tiling \ diff --git a/examples/backends/vllm/launch/validate_omni_minimax_h3.sh b/examples/backends/vllm/launch/validate_omni_minimax_h3.sh index 0cdb96d278ac..953fbce22a7c 100755 --- a/examples/backends/vllm/launch/validate_omni_minimax_h3.sh +++ b/examples/backends/vllm/launch/validate_omni_minimax_h3.sh @@ -9,8 +9,11 @@ API_URL="${DYN_H3_API_URL:-http://127.0.0.1:8000/v1/videos}" MODEL="${DYN_H3_MODEL:-MiniMaxAI/MiniMax-H3}" MODEL_REVISION="${DYN_H3_MODEL_REVISION:-42ed227ee7df40d41602854ae760620d6eb651fe}" FASTH3_LORA_PATH="${DYN_H3_FASTH3_LORA_PATH:-}" +FASTH3_VARIANT="${DYN_H3_FASTH3_VARIANT:-}" FASTH3_REVISION="${DYN_H3_FASTH3_REVISION:-bcf40ca6f457ed66f8badf13514943e390205fca}" -FASTH3_SHA256="${DYN_H3_FASTH3_SHA256:-4ce198c83132251b7fd0de2503823aa49c53983f068318f66cb19eaefb7fcc12}" +FASTH3_SHA256="${DYN_H3_FASTH3_SHA256:-}" +ATTENTION_BACKEND="${DYN_H3_ATTENTION_BACKEND:-}" +FASTVIDEO_VSA_TOPK="${DYN_H3_FASTVIDEO_VSA_TOPK:-64}" QUAL_DIR="${DYN_H3_QUAL_DIR:-/tmp/dynamo_minimax_h3_qualification}" OUTPUT_DIR="$QUAL_DIR/outputs" CASE_NAME="cat-playing-canon-in-d-grand-piano" @@ -40,11 +43,51 @@ fi mkdir -p "$OUTPUT_DIR" +if [[ -n "$FASTH3_VARIANT" && -z "$FASTH3_LORA_PATH" ]]; then + echo "DYN_H3_FASTH3_VARIANT requires DYN_H3_FASTH3_LORA_PATH" >&2 + exit 1 +fi if [[ -n "$FASTH3_LORA_PATH" ]]; then if [[ ! -f "$FASTH3_LORA_PATH" ]]; then echo "FastH3 adapter not found: $FASTH3_LORA_PATH" >&2 exit 1 fi + if [[ -z "$FASTH3_VARIANT" ]]; then + FASTH3_VARIANT="$(basename "$(dirname "$FASTH3_LORA_PATH")")" + fi + if [[ -z "$FASTH3_SHA256" ]]; then + case "$FASTH3_VARIANT" in + dense-datafree) + FASTH3_SHA256="4ce198c83132251b7fd0de2503823aa49c53983f068318f66cb19eaefb7fcc12" + ;; + vsa-datafree) + FASTH3_SHA256="42dc502a2078f166c396a1fa75f29728d1844363652d345d5ef3e2b444ed6470" + ;; + vsa-synthetic-step1300) + FASTH3_SHA256="de6af1ea8b2f4b31a7ac3752b4836f88671199fdf277a5dd922f9cca3bea7b65" + ;; + vsa-synthetic-step1900) + FASTH3_SHA256="bbac632dffb828d99123ab06c7ff3efc246351bed63d1860b4252e61dafeaed8" + ;; + *) + echo "Set DYN_H3_FASTH3_SHA256 for unrecognized variant: $FASTH3_VARIANT" >&2 + exit 1 + ;; + esac + fi + if [[ "$FASTH3_VARIANT" == vsa-* ]]; then + ATTENTION_BACKEND="${ATTENTION_BACKEND:-FASTVIDEO_VSA}" + if [[ "$ATTENTION_BACKEND" != "FASTVIDEO_VSA" ]]; then + echo "FastH3 VSA qualification requires FASTVIDEO_VSA" >&2 + exit 1 + fi + if [[ ! "$FASTVIDEO_VSA_TOPK" =~ ^[1-9][0-9]*$ ]]; then + echo "DYN_H3_FASTVIDEO_VSA_TOPK must be a positive integer" >&2 + exit 1 + fi + else + ATTENTION_BACKEND="${ATTENTION_BACKEND:-TRTLLM_ATTN}" + fi actual_fasth3_sha256="$(sha256sum "$FASTH3_LORA_PATH" | awk '{print $1}')" if [[ "$actual_fasth3_sha256" != "$FASTH3_SHA256" ]]; then echo "FastH3 adapter checksum mismatch: $actual_fasth3_sha256" >&2 @@ -90,8 +133,9 @@ import torch devices = [torch.cuda.get_device_name(index) for index in range(torch.cuda.device_count())] if len(devices) != 4: raise SystemExit(f"Expected exactly 4 visible GPUs, found {len(devices)}: {devices}") -if any("B200" not in device.upper() for device in devices): - raise SystemExit(f"Expected 4 B200 GPUs, found: {devices}") +supported_products = ("B200", "GB300") +if not any(all(product in device.upper() for device in devices) for product in supported_products): + raise SystemExit(f"Expected 4 identical B200 or GB300 GPUs, found: {devices}") with open(sys.argv[1], "w", encoding="utf-8") as output: json.dump({"visible_gpu_count": len(devices), "devices": devices}, output, indent=2) @@ -165,7 +209,8 @@ if grep -q 'mean_volume: -inf' "$AUDIO_STATS_FILE"; then fi sha256sum "$VIDEO_FILE" > "$SHA_FILE" -export DYNAMO_REVISION IMAGE_REF MODEL MODEL_REVISION FASTH3_LORA_PATH FASTH3_REVISION FASTH3_SHA256 +export DYNAMO_REVISION IMAGE_REF MODEL MODEL_REVISION FASTH3_LORA_PATH FASTH3_VARIANT +export FASTH3_REVISION FASTH3_SHA256 ATTENTION_BACKEND FASTVIDEO_VSA_TOPK python3 - "$METADATA_FILE" "$HARDWARE_FILE" "$REQUEST_FILE" "$TIMING_FILE" <<'PY' import importlib.metadata import json @@ -199,6 +244,7 @@ metadata = { "ai-dynamo": version("ai-dynamo"), "vllm": version("vllm"), "vllm-omni": version("vllm-omni"), + "fastvideo-kernel": version("fastvideo-kernel"), "av": version("av"), }, "hardware": hardware, @@ -209,7 +255,13 @@ if os.environ["FASTH3_LORA_PATH"]: "adapter_path": os.environ["FASTH3_LORA_PATH"], "adapter_revision": os.environ["FASTH3_REVISION"], "adapter_sha256": os.environ["FASTH3_SHA256"], + "variant": os.environ["FASTH3_VARIANT"], + "attention_backend": os.environ["ATTENTION_BACKEND"], } + if os.environ["FASTH3_VARIANT"].startswith("vsa-"): + metadata["fasth3"]["fastvideo_vsa_topk"] = int( + os.environ["FASTVIDEO_VSA_TOPK"] + ) with open(sys.argv[1], "w", encoding="utf-8") as output: json.dump(metadata, output, indent=2) output.write("\n") diff --git a/examples/backends/vllm/omni/video_audio.Dockerfile b/examples/backends/vllm/omni/video_audio.Dockerfile index fc42641e8dfc..9bd5514791ef 100644 --- a/examples/backends/vllm/omni/video_audio.Dockerfile +++ b/examples/backends/vllm/omni/video_audio.Dockerfile @@ -14,8 +14,9 @@ # limitations under the License. # Opt-in development and qualification overlay for vLLM-Omni models that -# generate joint video and audio. The standard Dynamo image intentionally -# remains on its royalty-free VP9-only media stack. +# generate joint video and audio, including FastH3 VSA. The standard Dynamo +# image intentionally remains on its royalty-free VP9-only media stack and +# does not acquire FastVideo's optional CUDA kernel. ARG BASE_IMAGE=dynamo:latest-vllm-runtime FROM ${BASE_IMAGE} @@ -28,12 +29,19 @@ RUN apt-get update \ && ln -sf /usr/bin/ffprobe /usr/local/bin/ffprobe \ && rm -rf /var/lib/apt/lists/* +# fastvideo-kernel 0.3.5's optional native extension targets torch 2.12, +# while the vLLM 0.29 image uses torch 2.13. FastH3 VSA uses the portable +# Triton path, so install without dependencies and do not require the native +# extension. Avoid importing the package while building because that initializes +# Triton, which requires a CUDA driver even though the image build does not. RUN uv pip install \ --system \ --no-deps \ av==18.0.0 \ + fastvideo-kernel==0.3.5 \ + && ffmpeg -hide_banner -encoders 2>/dev/null | grep -Eq '(^| )libx264( |$)' \ && python3 -c \ - 'import av; av.codec.Codec("h264", "w"); av.codec.Codec("aac", "w")' + 'from importlib.util import find_spec; import av; assert find_spec("fastvideo_kernel") is not None; av.codec.Codec("h264", "w"); av.codec.Codec("aac", "w")' RUN python3 <<'PY' import io diff --git a/tests/frontend/test_prepost.py b/tests/frontend/test_prepost.py index 0a779e82da2e..0f8fef369162 100644 --- a/tests/frontend/test_prepost.py +++ b/tests/frontend/test_prepost.py @@ -9,7 +9,6 @@ import json import pytest -from packaging.version import Version from .common import check_module_available @@ -21,12 +20,6 @@ "vllm.tool_parsers.qwen3_engine_tool_parser" ) or check_module_available("vllm.tool_parsers.qwen3coder_tool_parser") if HAS_VLLM: - from vllm import __version__ as vllm_version - - if Version(vllm_version).release >= (0, 29): - from vllm.entrypoints.generate.base.protocol import FunctionDefinition - else: - from vllm.entrypoints.openai.engine.protocol import FunctionDefinition from vllm.entrypoints.openai.chat_completion.protocol import ( ChatCompletionRequest, ChatCompletionToolsParam, @@ -36,6 +29,7 @@ from vllm.tool_parsers.hermes_tool_parser import Hermes2ProToolParser from dynamo.frontend.prepost import StreamingPostProcessor, _prepare_request + from dynamo.frontend.vllm_protocol import FunctionDefinition else: # Fake some types so that `pre-commit` passes class CompletionOutput: diff --git a/tests/frontend/test_prepost_mistral.py b/tests/frontend/test_prepost_mistral.py index 9e30da684ba6..8bb69ec2b0e6 100644 --- a/tests/frontend/test_prepost_mistral.py +++ b/tests/frontend/test_prepost_mistral.py @@ -9,19 +9,12 @@ import json import pytest -from packaging.version import Version from .common import check_module_available HAS_VLLM = check_module_available("vllm.entrypoints.openai.chat_completion.protocol") if HAS_VLLM: from mistral_common.tokens.tokenizers.base import SpecialTokens - from vllm import __version__ as vllm_version - - if Version(vllm_version).release >= (0, 29): - from vllm.entrypoints.generate.base.protocol import FunctionDefinition - else: - from vllm.entrypoints.openai.engine.protocol import FunctionDefinition from vllm.entrypoints.openai.chat_completion.protocol import ( ChatCompletionRequest, ChatCompletionToolsParam, @@ -33,6 +26,7 @@ from vllm.tool_parsers.mistral_tool_parser import MistralToolParser from dynamo.frontend.prepost import StreamingPostProcessor + from dynamo.frontend.vllm_protocol import FunctionDefinition MistralReasoningParser = ReasoningParserManager.get_reasoning_parser("mistral") else: From 70e094f650ab89eb81d359825adcb78fc9256aba Mon Sep 17 00:00:00 2001 From: Dong Xu Date: Tue, 22 Sep 2026 13:41:14 -0700 Subject: [PATCH 158/191] fix(sglang): propagate validation aborts as request errors (#15065) Signed-off-by: doxu --- .../src/dynamo/frontend/sglang_processor.py | 9 +- .../tests/test_sglang_processor_unit.py | 76 +++++- .../request_handlers/llm/decode_handler.py | 36 ++- .../tests/test_sglang_decode_handler.py | 225 +++++++++++++++++- lib/bindings/python/rust/errors.rs | 62 +++++ lib/bindings/python/rust/lib.rs | 7 +- 6 files changed, 394 insertions(+), 21 deletions(-) diff --git a/components/src/dynamo/frontend/sglang_processor.py b/components/src/dynamo/frontend/sglang_processor.py index 11c7e742b3e2..f464fd30ffb7 100644 --- a/components/src/dynamo/frontend/sglang_processor.py +++ b/components/src/dynamo/frontend/sglang_processor.py @@ -42,6 +42,7 @@ from .thinking import runtime_default_thinking_mode from .utils import ( PreprocessError, + as_error_envelope, extract_mm_urls, handle_engine_error, make_internal_error, @@ -867,7 +868,7 @@ def flush_pending( request_id, message, ) - yield make_internal_error(request_id, message) + yield as_error_envelope(make_internal_error(request_id, message)) break engine_response = dynamo_response.data() @@ -880,7 +881,9 @@ def flush_pending( not isinstance(engine_response, dict) or "token_ids" not in engine_response ): - yield handle_engine_error(engine_response, request_id, logger) + yield as_error_envelope( + handle_engine_error(engine_response, request_id, logger) + ) break new_ids = engine_response["token_ids"] @@ -943,7 +946,7 @@ def flush_pending( yield envelope if post.locally_finished: break - except Unknown: + except (InvalidArgument, Unknown): raise except Exception as e: logger.exception("Error generating response for request %s", request_id) diff --git a/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py b/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py index b6a9c2b543ac..cef49732c21e 100644 --- a/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py +++ b/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py @@ -4162,16 +4162,70 @@ async def collect(): return asyncio.run(collect()) - def test_routed_engine_is_error_yields_internal_error(self, tokenizer): - """is_error() True yields a single internal_error chunk with the comment text.""" + @pytest.mark.parametrize("after_output", [False, True]) + def test_routed_engine_is_error_yields_error_envelope(self, after_output): + """An annotated engine error terminates with a binding-compatible error frame.""" + prefix = [{"token_ids": [ord("A")]}] if after_output else [] items = self._run_stream( - tokenizer, - [FakeRoutedItem(None, is_error=True, comments=["backend disconnected"])], + self.ByteTokenizer(), + [ + *prefix, + FakeRoutedItem(None, is_error=True, comments=["backend disconnected"]), + {"token_ids": [], "finish_reason": "stop"}, + ], ) - assert len(items) == 1 - err = items[0]["error"] - assert err["type"] == "internal_error" - assert "backend disconnected" in err["message"] + assert len(items) == len(prefix) + 1 + if after_output: + assert items[0]["choices"][0]["delta"]["content"] == "A" + assert items[0]["choices"][0]["finish_reason"] is None + assert items[-1] == { + "_dynamo_annotated": True, + "event": "error", + "comment": ["backend disconnected"], + } + + @pytest.mark.parametrize("after_output", [False, True]) + def test_routed_validation_exception_preserves_type_and_message(self, after_output): + """A typed iterator failure survives before or after an emitted delta.""" + message = "Failed to compile json grammar: unsupported schema type" + + class FailingEngine: + async def generate(self, preprocessed, **kwargs): + """Model the routed iterator raising a native validation exception.""" + + async def stream(): + if after_output: + yield FakeRoutedItem({"token_ids": [ord("A")]}) + raise InvalidArgument(message) + + return stream() + + async def check(): + tokenizer = self.ByteTokenizer() + processor = SglangProcessor( + tokenizer=tokenizer, + routed_engine=FailingEngine(), + tool_call_parser_name=None, + reasoning_parser_name=None, + eos_token_ids=None, + ) + post = SglangStreamingPostProcessor( + tokenizer=tokenizer, tool_call_parser=None, reasoning_parser=None + ) + stream = processor._generate_and_stream( + "req-invalid", {"model": "test-model"}, {}, [], post + ) + if after_output: + first = await anext(stream) + assert first["data"]["choices"][0]["delta"]["content"] == "A" + assert first["data"]["choices"][0]["finish_reason"] is None + with pytest.raises(InvalidArgument) as error: + await anext(stream) + assert str(error.value) == message + with pytest.raises(StopAsyncIteration): + await anext(stream) + + asyncio.run(check()) def test_routed_engine_none_data_is_skipped(self, tokenizer): """data() is None (e.g. comment-only event) is skipped, not yielded as error.""" @@ -4193,7 +4247,11 @@ def test_malformed_engine_response_yields_engine_error(self, tokenizer): [{"status": "error", "message": "kv cache exhausted"}], ) assert len(items) == 1 - assert "error" in items[0] + assert items[0] == { + "_dynamo_annotated": True, + "event": "error", + "comment": ["kv cache exhausted"], + } def test_completed_batches_replace_decode_context(self): """Completed batches replace context instead of accumulating history.""" diff --git a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py index c9524c20c869..aa05d4f29a9d 100644 --- a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py +++ b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py @@ -20,7 +20,7 @@ from dynamo.common.multimodal.video_loader import VideoLoader from dynamo.common.utils.engine_response import normalize_finish_reason from dynamo.llm import HttpError -from dynamo.llm.exceptions import EngineShutdown +from dynamo.llm.exceptions import EngineShutdown, InvalidArgument from dynamo.sglang._compat import ( cache_salt_kwargs, filter_supported_async_generate_kwargs, @@ -57,6 +57,38 @@ "min_p", ) BYPASS_REMOTE_PREFILL_ANNOTATION = "x-bypass-remote-prefill" +_MAX_ABORT_MESSAGE_LENGTH = 8192 + + +def _raise_if_sglang_error(finish_reason: dict[str, Any]) -> None: + """Propagate error-bearing aborts before their placeholder output is emitted.""" + if finish_reason.get("type") != "abort": + return + + status_code = finish_reason.get("status_code") + if status_code is None and finish_reason.get("err_type") is None: + # SGLang also uses FINISH_ABORT for ordinary cancellation. Its default + # message is "Aborted", but both error metadata fields are absent/null. + return + + if ( + isinstance(status_code, bool) + or not isinstance(status_code, int) + or not 400 <= status_code < 600 + ): + status_code = 500 + + message = finish_reason.get("message") + if not isinstance(message, str) or not message: + message = "SGLang aborted the request with an error" + message = message[:_MAX_ABORT_MESSAGE_LENGTH] + + if status_code == 400: + # Explicit InvalidArgument keeps a client-visible validation message + # through Dynamo's Python/Rust boundary. Generic HttpError messages are + # diagnostic-only in the semantic error protocol. + raise InvalidArgument(message) + raise HttpError(status_code, message) def _raise_if_conditional_disagg_bypass(request: Dict[str, Any]) -> None: @@ -929,6 +961,7 @@ async def _process_token_stream( raise EngineShutdown( "Engine was shut down during token generation" ) + _raise_if_sglang_error(finish_reason) out["finish_reason"] = normalize_finish_reason( finish_reason["type"] ) @@ -1085,6 +1118,7 @@ async def _process_text_stream( raise EngineShutdown( "Engine was shut down during token generation" ) + _raise_if_sglang_error(finish_reason) finish_reason_type = normalize_finish_reason(finish_reason["type"]) else: finish_reason_type = None diff --git a/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py b/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py index 45a395f37e52..65580354b167 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py +++ b/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py @@ -263,19 +263,38 @@ async def wait_forever(): @pytest.mark.parametrize( "processor_name", ["_process_token_stream", "_process_text_stream"] ) -async def test_shutdown_abort_chunk_raises_engine_shutdown(processor_name): +@pytest.mark.parametrize( + "finish_reason", + [ + pytest.param({"type": "abort"}, id="cancellation"), + pytest.param( + { + "type": "abort", + "message": "Failed to compile json grammar", + "status_code": 400, + "err_type": "BadRequestError", + }, + id="validation-error", + ), + ], +) +async def test_shutdown_abort_chunk_raises_engine_shutdown( + processor_name, finish_reason +): + """Shutdown remains retryable even when its abort carries validation details.""" handler = _new_decode_handler() handler.shutdown_event = asyncio.Event() handler.shutdown_event.set() context = SimpleNamespace(id=lambda: "request-id", is_stopped=lambda: False) async def stream(): + """Yield the terminal abort from the shutting-down backend.""" yield { "text": "", "output_ids": [], "meta_info": { "id": "sglang-request-id", - "finish_reason": {"type": "abort"}, + "finish_reason": finish_reason, }, } @@ -284,6 +303,208 @@ async def stream(): pass +@pytest.fixture +def abort_context(): + """Track first-token notification without cancelling the test request.""" + return SimpleNamespace( + id=lambda: "request-id", + is_stopped=lambda: False, + notify_first_token=Mock(), + ) + + +def _abort_chunk(finish_reason): + """Model the placeholder token and text SGLang can emit after grammar failure.""" + return { + "output_ids": [101], + "text": "_color", + "meta_info": { + "id": "sglang-request-id", + "finish_reason": finish_reason, + "prompt_tokens": 1, + "completion_tokens": 1, + }, + } + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "processor_name", ["_process_token_stream", "_process_text_stream"] +) +@pytest.mark.parametrize( + ("status_code", "message", "err_type"), + [ + pytest.param( + 400, + "Failed to compile json grammar: [04:33:48] " + '/project/cpp/json_schema_converter.cc:2999: Unsupported type "invalid_type"\n', + "BadRequestError", + id="invalid-schema-type", + ), + pytest.param( + 422, + "Request validation failed", + "UnprocessableEntityError", + id="other-client-error", + ), + pytest.param( + 500, + "Grammar compiler failed internally", + "InternalServerError", + id="backend-server-error", + ), + ], +) +async def test_error_abort_preserves_http_error_before_output( + processor_name, status_code, message, err_type, abort_context +): + """Raise the backend error before exposing placeholder output or token timing.""" + handler = _new_decode_handler() + finish_reason = { + "type": "abort", + "message": message, + "status_code": status_code, + "err_type": err_type, + } + stream = getattr(handler, processor_name)( + _stream([_abort_chunk(finish_reason)]), abort_context + ) + + expected_error = InvalidArgument if status_code == 400 else HttpError + with pytest.raises(expected_error) as error: + await anext(stream) + + if status_code == 400: + assert str(error.value) == message + else: + assert error.value.code == status_code + assert error.value.message == message + abort_context.notify_first_token.assert_not_called() + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "processor_name", ["_process_token_stream", "_process_text_stream"] +) +async def test_error_abort_after_output_preserves_error_and_stops( + processor_name, abort_context +): + """Preserve an earlier delta, then terminate with the original validation error.""" + handler = _new_decode_handler() + normal_chunk = _abort_chunk(None) + normal_chunk["output_ids"] = [42] + normal_chunk["text"] = "hello" + message = "Failed to compile json grammar: unsupported schema type" + error_chunk = _abort_chunk( + { + "type": "abort", + "message": message, + "status_code": 400, + "err_type": "BadRequestError", + } + ) + stream = getattr(handler, processor_name)( + _stream([normal_chunk, error_chunk]), abort_context + ) + + first = await anext(stream) + if processor_name == "_process_token_stream": + assert first["token_ids"] == [42] + assert first.get("finish_reason") is None + else: + assert first["choices"][0]["delta"]["content"] == "hello" + assert first["choices"][0]["finish_reason"] is None + + with pytest.raises(InvalidArgument) as error: + await anext(stream) + assert str(error.value) == message + + # Neither the abort's placeholder nor a successful terminal chunk can follow. + with pytest.raises(StopAsyncIteration): + await anext(stream) + abort_context.notify_first_token.assert_called_once_with() + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "processor_name", ["_process_token_stream", "_process_text_stream"] +) +@pytest.mark.parametrize( + "status_fields", + [ + pytest.param({}, id="missing"), + pytest.param({"status_code": None}, id="null"), + pytest.param({"status_code": "400"}, id="string"), + pytest.param({"status_code": True}, id="boolean"), + pytest.param({"status_code": 400.0}, id="float"), + pytest.param({"status_code": 200}, id="success-status"), + pytest.param({"status_code": 302}, id="redirect-status"), + pytest.param({"status_code": 600}, id="out-of-range"), + ], +) +async def test_error_abort_with_missing_or_invalid_status_uses_server_error( + processor_name, status_fields, abort_context +): + """Malformed error metadata fails as a server error instead of a completion.""" + handler = _new_decode_handler() + message = "Failed to compile json grammar" + finish_reason = { + "type": "abort", + "message": message, + "err_type": "BadRequestError", + **status_fields, + } + stream = getattr(handler, processor_name)( + _stream([_abort_chunk(finish_reason)]), abort_context + ) + + with pytest.raises(HttpError) as error: + await anext(stream) + + assert error.value.code == 500 + assert error.value.message == message + abort_context.notify_first_token.assert_not_called() + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "processor_name", ["_process_token_stream", "_process_text_stream"] +) +@pytest.mark.parametrize( + "finish_fields", + [ + pytest.param({}, id="missing"), + pytest.param({"message": None}, id="null"), + pytest.param({"message": ""}, id="empty"), + pytest.param( + {"message": "Aborted", "status_code": None, "err_type": None}, + id="sglang-cancellation", + ), + ], +) +async def test_abort_without_error_details_remains_cancelled( + processor_name, finish_fields, abort_context +): + """An ordinary SGLang cancellation keeps its existing finish mapping.""" + handler = _new_decode_handler() + chunk = _abort_chunk({"type": "abort", **finish_fields}) + chunk["output_ids"] = [] + chunk["text"] = "" + + chunks = await _collect( + getattr(handler, processor_name)(_stream([chunk]), abort_context) + ) + + assert len(chunks) == 1 + if processor_name == "_process_token_stream": + assert chunks[0]["finish_reason"] == "cancelled" + assert chunks[0]["token_ids"] == [] + else: + assert chunks[0]["choices"][0]["finish_reason"] == "cancelled" + assert chunks[0]["choices"][0]["delta"]["content"] == "" + abort_context.notify_first_token.assert_not_called() + + @pytest.mark.asyncio @pytest.mark.parametrize( "processor_name", ["_process_token_stream", "_process_text_stream"] diff --git a/lib/bindings/python/rust/errors.rs b/lib/bindings/python/rust/errors.rs index afad4d96ce42..9fe735d0e7b6 100644 --- a/lib/bindings/python/rust/errors.rs +++ b/lib/bindings/python/rust/errors.rs @@ -12,6 +12,7 @@ //! in sync. use dynamo_runtime::error::{BackendError, DynamoError, ErrorClass}; +use dynamo_runtime::protocols::annotated::Annotated; use pyo3::prelude::*; use pyo3::types::PyModule; @@ -134,6 +135,32 @@ define_dynamo_exceptions!( (StreamIncomplete, BackendError::StreamIncomplete), ); +/// Preserve explicitly public validation errors across Rust-to-Python streams. +/// Other errors retain the iterator's existing `ValueError` behavior; diagnostic +/// text must never be promoted into a public `InvalidArgument` message. +pub(crate) fn check_response_error(response: Annotated) -> PyResult> { + if response.is_error() + && let Some(message) = response + .error + .as_ref() + .and_then(public_invalid_request_message) + { + return Err(InvalidArgument::new_err(message.to_owned())); + } + + response + .ok() + .map_err(pyo3::exceptions::PyValueError::new_err) +} + +fn public_invalid_request_message(error: &DynamoError) -> Option<&str> { + if error.class() == ErrorClass::InvalidRequest { + error.public_message() + } else { + None + } +} + /// Read `(code, message)` off a Python exception carrying an HTTP-style /// status. Accepts `.code` (matches [`HttpError`] in `http.rs`) or `.status` /// (matches `dynamo.common.http.HttpStatusError`) plus `.message`. @@ -218,6 +245,41 @@ mod tests { message: String, } + #[test] + fn invalid_request_conversion_uses_only_public_message() { + let error = DynamoError::builder() + .class(ErrorClass::InvalidRequest) + .diagnostic("private backend detail") + .public_message("Invalid JSON schema") + .build(); + assert_eq!( + public_invalid_request_message(&error), + Some("Invalid JSON schema") + ); + + let error = DynamoError::builder() + .class(ErrorClass::InvalidRequest) + .diagnostic("private validation detail") + .build(); + assert_eq!(public_invalid_request_message(&error), None); + } + + #[test] + fn other_error_classes_are_not_promoted_to_invalid_arguments() { + for class in [ + ErrorClass::Internal, + ErrorClass::Cancelled, + ErrorClass::Unavailable, + ] { + let error = DynamoError::builder() + .class(class) + .diagnostic("private backend detail") + .public_message("Public error message") + .build(); + assert_eq!(public_invalid_request_message(&error), None); + } + } + #[test] fn http_like_errors_support_semantic_and_legacy_readers() { for (code, expected_class) in [ diff --git a/lib/bindings/python/rust/lib.rs b/lib/bindings/python/rust/lib.rs index dbc5f06268f0..1a4b75f2729b 100644 --- a/lib/bindings/python/rust/lib.rs +++ b/lib/bindings/python/rust/lib.rs @@ -2276,12 +2276,7 @@ impl AsyncResponseStream { let value = rx.lock().await.recv().await; match value { Some(pyobj) => { - let pyobj = match pyobj.ok() { - Ok(pyobj) => pyobj, - Err(e) => { - return Err(PyErr::new::(e)); - } - }; + let pyobj = crate::errors::check_response_error(pyobj)?; if annotated { let object = Annotated { inner: pyobj }; From 21ff9e34d5f9248ae1198c4cb57b63123309fe3b Mon Sep 17 00:00:00 2001 From: Saravana Periyasamy Date: Tue, 22 Sep 2026 16:20:56 -0500 Subject: [PATCH 159/191] fix(ci): remove MinIO host port mappings (#15181) Signed-off-by: Saravana Periyasamy --- .github/workflows/shared-test.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/shared-test.yml b/.github/workflows/shared-test.yml index 40296f984b7d..30a8b58be273 100644 --- a/.github/workflows/shared-test.yml +++ b/.github/workflows/shared-test.yml @@ -220,9 +220,6 @@ jobs: MINIO_ROOT_PASSWORD: minioadmin MINIO_VOLUMES: /tmp/minio-data MINIO_CONSOLE_ADDRESS: ':9001' - ports: - - 9000:9000 - - 9001:9001 steps: - name: Checkout repository id: checkout From 4176e3db3d65ea9398f9e323ebe7bef81d374649 Mon Sep 17 00:00:00 2001 From: host452b <32806348+host452b@users.noreply.github.com> Date: Wed, 23 Sep 2026 05:26:50 +0800 Subject: [PATCH 160/191] fix(multimodal): enforce media download limits (#15005) Signed-off-by: host452b <32806348+host452b@users.noreply.github.com> --- .../dynamo/common/multimodal/audio_loader.py | 7 ++- .../dynamo/common/multimodal/image_loader.py | 15 ++++++- .../dynamo/common/multimodal/video_loader.py | 7 ++- .../tests/multimodal/test_audio_loader.py | 21 +++++++++ .../tests/multimodal/test_image_loader.py | 31 ++++++++++++- .../tests/multimodal/test_video_loader.py | 21 +++++++++ .../multimodal/encode_worker_handler.py | 33 +++++++++++--- .../test_sglang_multimodal_embedding_cache.py | 45 +++++++++++++++++-- .../tests/test_sglang_multimodal_video.py | 23 +++++++++- .../src/dynamo/trtllm/multimodal_processor.py | 8 +++- .../tests/test_trtllm_multimodal_processor.py | 24 +++++++++- .../video-decode-gpu-requirements.md | 1 + 12 files changed, 216 insertions(+), 20 deletions(-) diff --git a/components/src/dynamo/common/multimodal/audio_loader.py b/components/src/dynamo/common/multimodal/audio_loader.py index 15bb17b78930..79d4c3df631b 100644 --- a/components/src/dynamo/common/multimodal/audio_loader.py +++ b/components/src/dynamo/common/multimodal/audio_loader.py @@ -21,6 +21,8 @@ from dynamo.common.utils import nvtx_utils as _nvtx from dynamo.common.utils.runtime import run_async +from dynamo.common.http.media_reference import max_media_bytes # isort: skip + logger = logging.getLogger(__name__) # Constants for multimodal data variants @@ -128,7 +130,10 @@ async def _load_audio_with_vllm(self, audio_url: str) -> tuple[np.ndarray, float # data: and file:// never touch the network, so vLLM can handle them. if urlparse(normalized_url).scheme in ("http", "https"): content = await fetch_bytes( - normalized_url, self._http_timeout, policy=self._url_policy + normalized_url, + self._http_timeout, + policy=self._url_policy, + max_bytes=max_media_bytes(), ) return await asyncio.to_thread(media_io.load_bytes, content) diff --git a/components/src/dynamo/common/multimodal/image_loader.py b/components/src/dynamo/common/multimodal/image_loader.py index fa30d2441c24..77598db40533 100644 --- a/components/src/dynamo/common/multimodal/image_loader.py +++ b/components/src/dynamo/common/multimodal/image_loader.py @@ -23,6 +23,7 @@ HttpTimeoutError, fetch_bytes, ) +from ..http.media_reference import max_media_bytes from ..http.url_validator import ( UrlValidationError, UrlValidationPolicy, @@ -71,6 +72,7 @@ def __init__( http_timeout: float = 30.0, enable_frontend_decoding: bool = False, url_policy: UrlValidationPolicy | None = None, + max_bytes: int | None = None, ): """ Initialize the ImageLoader with caching, HTTP settings, and optional NIXL config for @@ -85,9 +87,12 @@ def __init__( decoded images directly from frontend memory, bypassing standard network transport. Defaults to False. url_policy: Policy for validating URLs. Defaults to UrlValidationPolicy.from_env(). + max_bytes: Maximum remote image size in bytes. When omitted, resolve + DYN_MM_MAX_FILE_SIZE_MB for each request. """ self._http_timeout = http_timeout self._cache_size = cache_size + self._configured_max_bytes = max_bytes self._image_cache: OrderedDict[str, Image.Image] = OrderedDict() self._inflight: dict[str, asyncio.Task[Image.Image]] = {} self._enable_frontend_decoding = enable_frontend_decoding @@ -100,6 +105,11 @@ def __init__( self._nixl_connector.initialize ) # Synchronously wait for async init + def _max_bytes(self) -> int: + if self._configured_max_bytes is not None: + return self._configured_max_bytes + return max_media_bytes() + @staticmethod def _open_image_sync(image_data: BytesIO) -> Image.Image: """Open, validate, and decode an image from raw bytes. Runs in a thread.""" @@ -135,7 +145,10 @@ async def _fetch_and_process(self, image_url: str) -> Image.Image: try: with _nvtx.annotate("mm:img:http_fetch", color="lime"): content = await fetch_bytes( - image_url, self._http_timeout, policy=self._url_policy + image_url, + self._http_timeout, + policy=self._url_policy, + max_bytes=self._max_bytes(), ) if not content: raise ValueError("Empty response content from image URL") diff --git a/components/src/dynamo/common/multimodal/video_loader.py b/components/src/dynamo/common/multimodal/video_loader.py index 042bd24b8f93..4c40cb75cb38 100644 --- a/components/src/dynamo/common/multimodal/video_loader.py +++ b/components/src/dynamo/common/multimodal/video_loader.py @@ -44,6 +44,8 @@ ) from dynamo.common.utils.runtime import run_async +from dynamo.common.http.media_reference import max_media_bytes # isort: skip + logger = logging.getLogger(__name__) @@ -171,7 +173,10 @@ async def _load_video_with_vllm( # data: and file:// never touch the network, so vLLM can handle them. if urlparse(normalized_url).scheme in ("http", "https"): content = await fetch_bytes( - normalized_url, self._http_timeout, policy=self._url_policy + normalized_url, + self._http_timeout, + policy=self._url_policy, + max_bytes=max_media_bytes(), ) return await self._decode_video_bytes(content, media_io) diff --git a/components/src/dynamo/common/tests/multimodal/test_audio_loader.py b/components/src/dynamo/common/tests/multimodal/test_audio_loader.py index a962fa76a0eb..d8a8cf9ac946 100644 --- a/components/src/dynamo/common/tests/multimodal/test_audio_loader.py +++ b/components/src/dynamo/common/tests/multimodal/test_audio_loader.py @@ -13,6 +13,8 @@ from dynamo.common.multimodal.codec_errors import MissingMediaDecoderError from dynamo.common.utils.install_media_decoders import VALIDATED_SPECS +from dynamo.common.http.media_reference import DYN_MM_MAX_FILE_SIZE_MB # isort: skip + pytestmark = [ pytest.mark.unit, pytest.mark.gpu_0, @@ -94,6 +96,25 @@ async def test_load_audio_rejects_empty_waveform(): await loader.load_audio("https://example.com/empty.wav") +@pytest.mark.asyncio +async def test_http_fetch_honors_configured_media_limit(monkeypatch): + monkeypatch.setenv(DYN_MM_MAX_FILE_SIZE_MB, "1") + loader = AudioLoader(url_policy=_permissive_http_policy()) + waveform = np.zeros(8, dtype=np.float32) + + class _MediaIO: + def load_bytes(self, content): + return waveform, 16000.0 + + mock_fetch = AsyncMock(return_value=b"audio") + monkeypatch.setattr(audio_loader_module, "fetch_bytes", mock_fetch) + monkeypatch.setattr(loader, "_create_vllm_audio_io", lambda: _MediaIO()) + + await loader._load_audio_with_vllm("https://example.com/limited.wav") + + assert mock_fetch.await_args.kwargs["max_bytes"] == 1024 * 1024 + + @pytest.mark.asyncio async def test_load_audio_batch_uses_url_loader(): loader = AudioLoader() diff --git a/components/src/dynamo/common/tests/multimodal/test_image_loader.py b/components/src/dynamo/common/tests/multimodal/test_image_loader.py index 330603b96869..f58473c8bda5 100644 --- a/components/src/dynamo/common/tests/multimodal/test_image_loader.py +++ b/components/src/dynamo/common/tests/multimodal/test_image_loader.py @@ -25,6 +25,7 @@ from PIL import Image from dynamo.common.http import HttpConnectionError, HttpStatusError, HttpTimeoutError +from dynamo.common.http.media_reference import DYN_MM_MAX_FILE_SIZE_MB from dynamo.common.http.url_validator import UrlValidationError, UrlValidationPolicy from dynamo.common.multimodal.image_loader import URL_VARIANT_KEY, ImageLoader @@ -73,7 +74,7 @@ def _mock_fetch_bytes( side_effect: If set, the mock raises this exception instead of returning. """ - async def _fetch(url, timeout, *, policy=None): + async def _fetch(url, timeout, *, policy=None, max_bytes=None): if delay > 0: await asyncio.sleep(delay) if side_effect is not None: @@ -207,6 +208,34 @@ async def test_http_timeout_raises_408(loader: ImageLoader) -> None: assert "https://example.com/img.png" in exc_info.value.url +async def test_http_fetch_honors_configured_media_limit( + loader: ImageLoader, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setenv(DYN_MM_MAX_FILE_SIZE_MB, "1") + mock_fetch = _mock_fetch_bytes() + + with patch(_FETCH_BYTES_PATH, mock_fetch): + await loader.load_image("https://example.com/limited.png") + + assert mock_fetch.await_args.kwargs["max_bytes"] == 1024 * 1024 + + +async def test_explicit_media_limit_overrides_environment( + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setenv(DYN_MM_MAX_FILE_SIZE_MB, "1") + loader = ImageLoader( + max_bytes=2 * 1024 * 1024, + url_policy=_permissive_policy(), + ) + mock_fetch = _mock_fetch_bytes() + + with patch(_FETCH_BYTES_PATH, mock_fetch): + await loader.load_image("https://example.com/explicit-limit.png") + + assert mock_fetch.await_args.kwargs["max_bytes"] == 2 * 1024 * 1024 + + async def test_http_connection_error_raises_400(loader: ImageLoader) -> None: """An unreachable user-supplied URL is a client error, so the frontend must surface 400 instead of an opaque 500.""" diff --git a/components/src/dynamo/common/tests/multimodal/test_video_loader.py b/components/src/dynamo/common/tests/multimodal/test_video_loader.py index b6b427c93c49..d7a4bd42d175 100644 --- a/components/src/dynamo/common/tests/multimodal/test_video_loader.py +++ b/components/src/dynamo/common/tests/multimodal/test_video_loader.py @@ -15,6 +15,8 @@ from dynamo.common.multimodal.video_loader import VideoLoader from dynamo.common.utils.install_media_decoders import VALIDATED_SPECS +from dynamo.common.http.media_reference import DYN_MM_MAX_FILE_SIZE_MB # isort: skip + pytestmark = [ pytest.mark.unit, pytest.mark.pre_merge, @@ -75,6 +77,25 @@ async def test_load_video_uses_vllm_media_connector(): assert loaded_metadata == metadata +@pytest.mark.asyncio +async def test_http_fetch_honors_configured_media_limit(monkeypatch): + monkeypatch.setenv(DYN_MM_MAX_FILE_SIZE_MB, "1") + loader = VideoLoader( + url_policy=UrlValidationPolicy(allow_http=True, allow_private_ips=True) + ) + frames = np.zeros((1, 2, 2, 3), dtype=np.uint8) + metadata = {"fps": 1.0, "frames_indices": [0], "total_num_frames": 1} + mock_fetch = AsyncMock(return_value=b"video") + mock_decode = AsyncMock(return_value=(frames, metadata)) + monkeypatch.setattr(video_loader_module, "fetch_bytes", mock_fetch) + monkeypatch.setattr(loader, "_create_vllm_video_io", lambda kwargs=None: object()) + monkeypatch.setattr(loader, "_decode_video_bytes", mock_decode) + + await loader._load_video_with_vllm("https://example.com/limited.mp4") + + assert mock_fetch.await_args.kwargs["max_bytes"] == 1024 * 1024 + + @pytest.mark.asyncio async def test_load_video_batch_uses_url_loader(): loader = VideoLoader() diff --git a/components/src/dynamo/sglang/request_handlers/multimodal/encode_worker_handler.py b/components/src/dynamo/sglang/request_handlers/multimodal/encode_worker_handler.py index 42209b9edd90..dafafbccef49 100644 --- a/components/src/dynamo/sglang/request_handlers/multimodal/encode_worker_handler.py +++ b/components/src/dynamo/sglang/request_handlers/multimodal/encode_worker_handler.py @@ -24,6 +24,7 @@ from dynamo._core import Client, Context from dynamo.common.http import fetch_bytes +from dynamo.common.http.media_reference import max_media_bytes from dynamo.common.http.url_validator import UrlValidationPolicy, validate_media_url from dynamo.common.memory.multimodal_embedding_cache_manager import ( CachedEmbedding, @@ -614,7 +615,12 @@ async def _maybe_nvdec_decoder(self, url: str) -> Optional[Any]: normalized = await validate_media_url(url, self._url_policy) scheme = urlparse(normalized).scheme if scheme in ("http", "https"): - content = await fetch_bytes(normalized, 30.0, policy=self._url_policy) + content = await fetch_bytes( + normalized, + 30.0, + policy=self._url_policy, + max_bytes=max_media_bytes(), + ) elif is_local_media_url(normalized): content = await read_local_media_bytes(normalized, self._url_policy) else: @@ -680,8 +686,9 @@ async def _build_encode_inputs( so SGLang does not re-download what we already validated and hold), or the original URL string when nothing was fetched. Non-video modalities and decoded inputs are returned unchanged. When - NVDEC is disabled or ineligible the URLs are returned policy-validated - and normalized, since SGLang fetches them with its own session. + NVDEC is disabled or ineligible, remote URLs are fetched under Dynamo's + policy and size limit and passed to SGLang as bytes; other URLs remain + policy-validated and normalized. Called from both the cached and uncached encode paths. The embedding cache is disabled by default, so routing this only through the cached @@ -691,9 +698,8 @@ async def _build_encode_inputs( return media_inputs if not self._nvdec_video_enabled(): # NVDEC off (CPU image, DYN_DISABLE_NVDEC, or a gated model type): - # these URLs go straight to SGLang's software path, which fetches - # them with its own session and never consults our url policy. Run - # the policy here so a source we would refuse is refused before + # these inputs go straight to SGLang's software path. Validate them + # here so a source we would refuse is refused before # SGLang can reach it -- and before we answer with anything about # this deployment, since a request we reject is not the place to # report which decoders are installed. @@ -713,7 +719,20 @@ async def _build_encode_inputs( and not _software_video_decoder_imports() ): raise video_decoder_missing("sglang", "decord2", "decord", None) - return validated + fetched_inputs: list[Any] = [] + for media_input in validated: + if isinstance(media_input, str) and urlparse(media_input).scheme in ( + "http", + "https", + ): + media_input = await fetch_bytes( + media_input, + 30.0, + policy=self._url_policy, + max_bytes=max_media_bytes(), + ) + fetched_inputs.append(media_input) + return fetched_inputs encode_inputs: list[Any] = [] for media_input in media_inputs: if not isinstance(media_input, str): diff --git a/components/src/dynamo/sglang/tests/test_sglang_multimodal_embedding_cache.py b/components/src/dynamo/sglang/tests/test_sglang_multimodal_embedding_cache.py index 4d53e0a7d1bc..5612bb555183 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_multimodal_embedding_cache.py +++ b/components/src/dynamo/sglang/tests/test_sglang_multimodal_embedding_cache.py @@ -18,6 +18,7 @@ HttpStatusError, HttpTimeoutError, ) +from dynamo.common.http.media_reference import DYN_MM_MAX_FILE_SIZE_MB from dynamo.common.http.url_validator import ( UrlValidationError, UrlValidationPolicy, @@ -309,11 +310,15 @@ async def test_encode_with_cache_reencodes_only_unkeyed_items( @pytest.mark.asyncio async def test_video_requests_reuse_cached_embeddings( cache_handler: MultimodalEncodeWorkerHandler, + monkeypatch, ) -> None: """Second identical video request should reuse cached embeddings.""" video_url = "https://example.com/clip.mp4" video_token_id = cache_handler.video_token_id + video_bytes = b"video-bytes" + fetch = AsyncMock(return_value=video_bytes) + monkeypatch.setattr(f"{_HANDLER_MOD}.fetch_bytes", fetch) cache_handler.encoder.encode_mock.return_value = ( torch.tensor([2, 3, 4]), @@ -370,8 +375,9 @@ async def _responses(): outputs_second.append(item) cache_handler.encoder.encode_mock.assert_awaited_once_with( - [video_url], Modality.VIDEO + [video_bytes], Modality.VIDEO ) + fetch.assert_awaited_once() assert outputs == [{"token_ids": [7]}] assert outputs_second == [{"token_ids": [7]}] @@ -400,9 +406,13 @@ async def _responses(): @pytest.mark.asyncio async def test_video_request_skips_cache_key_when_cache_is_disabled( cache_handler: MultimodalEncodeWorkerHandler, + monkeypatch, ) -> None: video_url = "https://example.com/clip.mp4" video_token_id = cache_handler.video_token_id + video_bytes = b"video-bytes" + fetch = AsyncMock(return_value=video_bytes) + monkeypatch.setattr(f"{_HANDLER_MOD}.fetch_bytes", fetch) cache_handler._embedding_cache = None cache_handler._image_loader = None cache_handler._media_cache_key = Mock( @@ -452,8 +462,9 @@ async def _responses(): assert outputs == [{"token_ids": [7]}] cache_handler._media_cache_key.assert_not_called() cache_handler.encoder.encode_mock.assert_awaited_once_with( - [video_url], Modality.VIDEO + [video_bytes], Modality.VIDEO ) + fetch.assert_awaited_once() def test_aux_value_for_item_rejects_mismatched_batched_lists() -> None: @@ -474,10 +485,13 @@ def test_aux_value_for_item_rejects_mismatched_batched_lists() -> None: @pytest.mark.asyncio async def test_video_cache_key_includes_sampling_config( cache_handler: MultimodalEncodeWorkerHandler, + monkeypatch, ) -> None: """Changing video sampling config should force a cache miss for the same URL.""" video_url = "https://example.com/clip.mp4" + fetch = AsyncMock(return_value=b"video-bytes") + monkeypatch.setattr(f"{_HANDLER_MOD}.fetch_bytes", fetch) cache_handler.encoder.encode_mock.return_value = ( torch.tensor([[2, 3, 4]]), torch.arange(24, dtype=torch.float32).reshape(6, 4), @@ -502,6 +516,7 @@ async def test_video_cache_key_includes_sampling_config( assert first_key != second_key assert cache_handler.encoder.encode_mock.await_count == 2 + assert fetch.await_count == 2 assert cache_handler._embedding_cache.get(first_key) is not None assert cache_handler._embedding_cache.get(second_key) is not None @@ -555,8 +570,8 @@ async def test_disabled_nvdec_without_software_decoder_is_actionable( async def test_disabled_nvdec_with_software_decoder_passes_urls( nvdec_handler, monkeypatch ) -> None: - """NVDEC off but a software decoder exists: URLs pass through unchanged - (SGLang fetches and decodes them itself, as before).""" + """NVDEC off but a software decoder exists: non-HTTP URLs pass through + unchanged for SGLang to decode.""" monkeypatch.setenv("DYN_DISABLE_NVDEC", "1") monkeypatch.setattr(f"{_HANDLER_MOD}._software_video_decoder_imports", lambda: True) @@ -564,6 +579,28 @@ async def test_disabled_nvdec_with_software_decoder_passes_urls( assert out == [_INLINE_VIDEO] +@pytest.mark.asyncio +async def test_disabled_nvdec_fetches_remote_video_with_configured_limit( + nvdec_handler, monkeypatch +) -> None: + """Remote URLs must not escape Dynamo's limit through SGLang's downloader.""" + monkeypatch.setenv("DYN_DISABLE_NVDEC", "1") + monkeypatch.setenv(DYN_MM_MAX_FILE_SIZE_MB, "1") + url = "https://example.com/clip.webm" + fetch = AsyncMock(return_value=b"video-bytes") + monkeypatch.setattr(f"{_HANDLER_MOD}.fetch_bytes", fetch) + + out = await nvdec_handler._build_encode_inputs([url], "VIDEO") + + assert out == [b"video-bytes"] + fetch.assert_awaited_once_with( + url, + 30.0, + policy=nvdec_handler._url_policy, + max_bytes=1024 * 1024, + ) + + def test_nvdec_video_enabled_gating(nvdec_handler, monkeypatch) -> None: monkeypatch.setattr(f"{_HANDLER_MOD}.nvdec_available", lambda: True) diff --git a/components/src/dynamo/sglang/tests/test_sglang_multimodal_video.py b/components/src/dynamo/sglang/tests/test_sglang_multimodal_video.py index ee450a0caed3..0bf70476f948 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_multimodal_video.py +++ b/components/src/dynamo/sglang/tests/test_sglang_multimodal_video.py @@ -6,6 +6,7 @@ import json from contextlib import asynccontextmanager from types import SimpleNamespace +from unittest.mock import AsyncMock import numpy as np import pytest @@ -660,7 +661,7 @@ async def test_vp9_without_software_decoder_is_actionable(monkeypatch): async def fake_validate(url, policy): return url - async def fake_fetch(url, timeout, policy=None): + async def fake_fetch(url, timeout, policy=None, max_bytes=None): return b"vp9-bytes" monkeypatch.setattr(ewh, "validate_media_url", fake_validate) @@ -688,7 +689,7 @@ async def test_vp9_with_software_decoder_passes_bytes_through(monkeypatch): async def fake_validate(url, policy): return url - async def fake_fetch(url, timeout, policy=None): + async def fake_fetch(url, timeout, policy=None, max_bytes=None): return b"vp9-bytes" monkeypatch.setattr(ewh, "validate_media_url", fake_validate) @@ -703,6 +704,24 @@ async def fake_fetch(url, timeout, policy=None): assert result == b"vp9-bytes" +@pytest.mark.asyncio +async def test_remote_video_fetch_honors_configured_media_limit(monkeypatch): + import dynamo.sglang.request_handlers.multimodal.encode_worker_handler as ewh + from dynamo.common.http.media_reference import DYN_MM_MAX_FILE_SIZE_MB + + monkeypatch.setenv(DYN_MM_MAX_FILE_SIZE_MB, "1") + fetch = AsyncMock(return_value=b"vp9-bytes") + monkeypatch.setattr(ewh, "fetch_bytes", fetch) + monkeypatch.setattr(ewh, "probe_video_codec", lambda b: "vp9") + monkeypatch.setattr(ewh, "should_use_nvdec", lambda c: False) + monkeypatch.setattr(ewh.importlib, "import_module", _selective_import({"decord"})) + + handler = _bare_handler() + await handler._maybe_nvdec_decoder("https://example.com/clip.webm") + + assert fetch.await_args.kwargs["max_bytes"] == 1024 * 1024 + + @pytest.mark.asyncio async def test_multimodal_decode_rejects_parallel_sampling_before_prefill_handoff(): """Reject multimodal n greater than one before contacting prefill.""" diff --git a/components/src/dynamo/trtllm/multimodal_processor.py b/components/src/dynamo/trtllm/multimodal_processor.py index 46dc23f2d008..9cf7a2f14bfb 100644 --- a/components/src/dynamo/trtllm/multimodal_processor.py +++ b/components/src/dynamo/trtllm/multimodal_processor.py @@ -163,7 +163,8 @@ def __init__( self.tokenizer = tokenizer_factory(model_dir) self.image_loader = ImageLoader( - enable_frontend_decoding=enable_frontend_decoding + enable_frontend_decoding=enable_frontend_decoding, + max_bytes=self.max_file_size_bytes, ) # Reuse the shared default so this preprocessor and the vLLM/SGLang @@ -588,7 +589,10 @@ async def process_openai_request( normalized_url = await validate_media_url(url, self._url_policy) if urlparse(normalized_url).scheme in ("http", "https"): content = await fetch_bytes( - normalized_url, 30.0, policy=self._url_policy + normalized_url, + 30.0, + policy=self._url_policy, + max_bytes=self.max_file_size_bytes, ) # Dual decode path: H.264/H.265 via NVDEC (hardware); other # codecs via the vendor cv2 loader. NVDEC failure falls back. diff --git a/components/src/dynamo/trtllm/tests/test_trtllm_multimodal_processor.py b/components/src/dynamo/trtllm/tests/test_trtllm_multimodal_processor.py index 735a599ac6e8..2fc370448d51 100644 --- a/components/src/dynamo/trtllm/tests/test_trtllm_multimodal_processor.py +++ b/components/src/dynamo/trtllm/tests/test_trtllm_multimodal_processor.py @@ -36,6 +36,23 @@ # sequential GPU stage so TensorRT-LLM initialization is shared. +def test_image_loader_uses_trtllm_configured_limit(monkeypatch) -> None: + image_loader = MagicMock() + monkeypatch.setattr(mmp, "ImageLoader", image_loader) + + MultimodalRequestProcessor( + model_type="multimodal", + model_dir="unused", + max_file_size_mb=200, + tokenizer=MagicMock(), + ) + + image_loader.assert_called_once_with( + enable_frontend_decoding=False, + max_bytes=200 * 1024 * 1024, + ) + + @pytest.mark.asyncio @pytest.mark.parametrize( "error", @@ -101,7 +118,12 @@ async def test_internal_video_uses_dynamo_fetcher_when_allowed(monkeypatch) -> N ep_disaggregated_params=None, ) - fetch.assert_awaited_once_with(url, 30.0, policy=processor._url_policy) + fetch.assert_awaited_once_with( + url, + 30.0, + policy=processor._url_policy, + max_bytes=processor.max_file_size_bytes, + ) assert load_video.await_args.args[0] != url diff --git a/docs/fern/pages/use-cases/multimodal-serving/video-decode-gpu-requirements.md b/docs/fern/pages/use-cases/multimodal-serving/video-decode-gpu-requirements.md index fa41b29c14f4..d12a713da732 100644 --- a/docs/fern/pages/use-cases/multimodal-serving/video-decode-gpu-requirements.md +++ b/docs/fern/pages/use-cases/multimodal-serving/video-decode-gpu-requirements.md @@ -206,6 +206,7 @@ NVDEC as above needs no additional change. Encode performance does not depend on | `DYN_DISABLE_NVDEC` | unset | Set to `1` to skip hardware decode. In a shipped image that leaves video input with no decoder at all, so it is a debugging switch rather than a fallback. Read as a boolean: `1`/`true`/`yes` disable, anything else does not. | | `DYN_NVDEC_GPU_ID` | `0` | GPU ordinal used for decode. | | `DYN_MM_VIDEO_NUM_FRAMES` | `32` | Frames sampled uniformly from each clip. | +| `DYN_MM_MAX_FILE_SIZE_MB` | `64` | Maximum size in MiB for each remote image, audio, or video download. TensorRT-LLM uses its backend-specific `--max-file-size-mb` option (`DYN_TRTLLM_MAX_FILE_SIZE_MB`) instead. | ## Sources From 3710f931f345a0e4e6481deccfcb274af9c95358 Mon Sep 17 00:00:00 2001 From: Dan Gil Date: Tue, 22 Sep 2026 16:33:47 -0500 Subject: [PATCH 161/191] fix(docs): keep tag copies of shared reference pages removed on main (#15185) Signed-off-by: Dan Gil Co-authored-by: Claude Opus 5.5 --- .github/workflows/fern-docs.yml | 19 +++++++++++++- docs/fern/scripts/simulate_docs_website.sh | 29 ++++++++++++++++++---- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/.github/workflows/fern-docs.yml b/.github/workflows/fern-docs.yml index e0ca0682d61b..592020588e56 100644 --- a/.github/workflows/fern-docs.yml +++ b/.github/workflows/fern-docs.yml @@ -903,7 +903,16 @@ jobs: echo "::error::$SHARED not found — the shared-reference exclusion would be a no-op and $TAG would freeze its own reference copy. If reference/general/ was renamed, update the path key in this workflow and in docs/fern/scripts/simulate_docs_website.sh." exit 1 fi - rm -rf "$SHARED" + # A page removed or moved on main after this tag was cut has no shared + # copy in pages-dev, so the tag keeps its own frozen copy of it. + while IFS= read -r f; do + rel="${f#docs-checkout/fern/pages-$TAG/}" + if [ -e "docs-checkout/fern/pages-dev/$rel" ]; then + rm -f "$f" + else + echo "::warning::$rel has no shared copy in pages-dev; $TAG keeps its own." + fi + done < <(find "$SHARED" -type f) find "docs-checkout/fern/pages-$TAG/reference" -type d -empty -delete 2>/dev/null || true - name: Snapshot translation mirrors @@ -1034,6 +1043,14 @@ jobs: # which invalidates the whole navigation against Fern's schema. perl -pi -e "s|path: \.\./pages-$TAG/reference/general/|path: ../pages-dev/reference/general/|g" "$VERSION_FILE" + # Pages the snapshot kept (no shared copy) stay on the frozen snapshot. + if [ -d "docs-checkout/fern/pages-$TAG/reference/general" ]; then + while IFS= read -r f; do + rel="${f#docs-checkout/fern/pages-$TAG/}" + perl -pi -e "s|path: \.\./pages-dev/\Q$rel\E|path: ../pages-$TAG/$rel|g" "$VERSION_FILE" + done < <(find "docs-checkout/fern/pages-$TAG/reference/general" -type f) + fi + if ! grep -q "path: \.\./pages-dev/reference/general/" "$VERSION_FILE"; then echo "::error::$VERSION_FILE has no shared reference/general/ paths after the revert; $TAG would freeze its own reference copy." exit 1 diff --git a/docs/fern/scripts/simulate_docs_website.sh b/docs/fern/scripts/simulate_docs_website.sh index 50cf5bd29d82..37b104946322 100755 --- a/docs/fern/scripts/simulate_docs_website.sh +++ b/docs/fern/scripts/simulate_docs_website.sh @@ -18,6 +18,8 @@ # frozen ../pages-/ snapshot. # 3. The pages- snapshot drops exactly the shared reference files and # keeps the versioned ones (runtime-config, observability). +# 11. A tag-only reference/general page (removed on main after the cut) stays +# in the snapshot, its nav stays on ../pages-/, and propagation keeps it. # 4. No React .tsx leaks into pages-dev/components/ (doc pages only). # 5. Pre-rework version files gain no shared-reference pointers. # 6. Round two: a page added to the General variant on a later main push @@ -150,7 +152,7 @@ propagate_shared_reference() { if [ "$(yq "[$GEN_SEL] | length" "$vfile")" != "0" ]; then ENTRIES="$WT/.ref_general.yml" \ yq -i "(.navigation[] | select(.tab == \"reference\") | .layout) |= - (load(strenv(ENTRIES)) + [.[] | select([.. | select(has(\"path\")) | .path] | any_c(test(\"/reference/general/\")) | not)])" "$vfile" + (load(strenv(ENTRIES)) + [.[] | select([.. | select(has(\"path\")) | .path] | any_c(test(\"/pages-dev/reference/general/\")) | not)])" "$vfile" fi done } @@ -185,9 +187,14 @@ cd "$WT" [ -f "fern/versions/$TAG.yml" ] && { echo "ERROR: versions/$TAG.yml already exists"; exit 1; } cp -r fern/pages-dev "fern/pages-$TAG" -# The shared group is a directory, so the drop is a plain path operation — no -# nav traversal, and no yq assignment against a file it only means to read. -rm -rf "fern/pages-$TAG/reference/general" +# A page the tag carries under reference/general/ that main has since removed. +TAG_ONLY="reference/general/sim-tag-only.mdx" +printf -- '---\ntitle: Sim Tag Only\n---\n\nTag-only fixture.\n' > "fern/pages-$TAG/$TAG_ONLY" +# Drop only the shared pages pages-dev still carries; the rest stay frozen. +while IFS= read -r f; do + rel="${f#fern/pages-"$TAG"/}" + [ -e "fern/pages-dev/$rel" ] && rm -f "$f" +done < <(find "fern/pages-$TAG/reference/general" -type f) find "fern/pages-$TAG/reference" -type d -empty -delete 2>/dev/null || true if [ -d "$SRC/translations" ]; then @@ -217,10 +224,16 @@ fi VERSION_FILE="fern/versions/$TAG.yml" cp fern/versions/dev.yml "$VERSION_FILE" perl -pi -e "s|path: \.\./pages-dev/|path: ../pages-$TAG/|g" "$VERSION_FILE" +FIXTURE_PATH="../pages-$TAG/$TAG_ONLY" yq -i '(.navigation[] | select(.tab == "reference") | .layout) += + [{"page": "Sim Tag Only", "path": strenv(FIXTURE_PATH), "slug": "sim-tag-only"}]' "$VERSION_FILE" # Text substitution, not a yq assignment: a yq assignment whose left-hand side # traverses a missing key auto-creates it, which is how the old `.variants[]` # form injected `variants: []` and invalidated the navigation. perl -pi -e "s|path: \.\./pages-$TAG/reference/general/|path: ../pages-dev/reference/general/|g" "$VERSION_FILE" +while IFS= read -r f; do + rel="${f#fern/pages-"$TAG"/}" + perl -pi -e "s|path: \.\./pages-dev/\Q$rel\E|path: ../pages-$TAG/$rel|g" "$VERSION_FILE" +done < <(find "fern/pages-$TAG/reference/general" -type f) perl -pi -e "s|href: /dynamo/dev/|href: /dynamo/$TAG/|g" "$VERSION_FILE" DEV_IDX=$(yq '.versions | to_entries | map(select(.value.display-name == "dev")) | .[0].key' fern/docs.yml) @@ -256,11 +269,15 @@ assert "2. $TAG.yml: reference/general shared ($shared pages-dev refs)" "$s1" [ "$frozen" -eq 1 ] && s2=ok || s2=FAIL assert "2. $TAG.yml: Components section frozen (runtime configuration)" "$s2" -[ ! -d "fern/pages-$TAG/reference/general" ] && \ +[ "$(find "fern/pages-$TAG/reference/general" -type f)" = "fern/pages-$TAG/$TAG_ONLY" ] && \ [ -e "fern/pages-$TAG/reference/components/runtime-configuration.mdx" ] && \ [ -d "fern/pages-$TAG/reference/observability" ] && s3=ok || s3=FAIL assert "3. snapshot drops shared files, keeps versioned reference/" "$s3" +grep -q "path: \.\./pages-$TAG/$TAG_ONLY" "$VERSION_FILE" && \ + ! grep -q "path: \.\./pages-dev/$TAG_ONLY" "$VERSION_FILE" && s12=ok || s12=FAIL +assert "11. tag-only reference/general page stays on pages-$TAG" "$s12" + # The find target must exist, or find errors to stderr, wc counts 0 and the # assertion reports ok on a failure — which it did once pages-dev/components/ # stopped existing. @@ -294,6 +311,8 @@ FAKE="$FAKE" yq -i '(.navigation[] | select(.tab == "reference") | .layout) += [ propagate_shared_reference grep -q "sim-test-page" "$VERSION_FILE" && s6=ok || s6=FAIL assert "6. round-two propagation reaches the cut version's nav" "$s6" +grep -q "path: \.\./pages-$TAG/$TAG_ONLY" "$VERSION_FILE" && s13=ok || s13=FAIL +assert "11. propagation keeps the tag-only page in the cut version's nav" "$s13" # Undo before fern check (the fake page has no backing file). Propagation # rewrites every synced version file, so scrub them all, not just the two # this test touched directly. From 4a0547f8ba2675f14d50e48d6aec53b1bc3cf3e3 Mon Sep 17 00:00:00 2001 From: GLAMR Date: Tue, 22 Sep 2026 17:56:01 -0400 Subject: [PATCH 162/191] fix(tests): pin SGLang router worker NCCL ports and gate on /health (#15099) Signed-off-by: svc-glamr@nvidia.com --- tests/router/test_router_e2e_with_sglang.py | 27 +++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/tests/router/test_router_e2e_with_sglang.py b/tests/router/test_router_e2e_with_sglang.py index b44e2c515a8e..3d8c1dc46f70 100644 --- a/tests/router/test_router_e2e_with_sglang.py +++ b/tests/router/test_router_e2e_with_sglang.py @@ -22,7 +22,7 @@ from tests.router.helper import generate_random_suffix from tests.utils.constants import DynamoPortRange from tests.utils.gpu_args import build_gpu_mem_args -from tests.utils.managed_process import ManagedProcess +from tests.utils.managed_process import ManagedProcess, check_health_ready from tests.utils.port_utils import ( allocate_contiguous_ports, allocate_port, @@ -125,9 +125,17 @@ def __init__( # it never binds this port -- the env var only flips the feature on. One # shared value across workers is therefore sufficient (no collision). self._fpm_port = allocate_port(DynamoPortRange.FPM.value) + # Pin the torch.distributed rendezvous port per worker: on the non-DP path + # SGLang probes and closes a port, so it can be taken before the real bind. + self._nccl_ports = [ + allocate_port(DynamoPortRange.NCCL.value) for _ in range(num_workers) + ] request.addfinalizer( lambda: deallocate_ports( - self._system_ports + self._kv_event_ports + [self._fpm_port] + self._system_ports + + self._kv_event_ports + + self._nccl_ports + + [self._fpm_port] ) ) @@ -228,6 +236,9 @@ def __init__( kv_events_config = f'{{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:{kv_events_port}"}}' command.extend(["--kv-events-config", kv_events_config]) + nccl_port = self._nccl_ports[worker_idx] + command.extend(["--nccl-port", str(nccl_port)]) + # Each SGLang worker needs a unique DYN_SYSTEM_PORT to avoid conflicts. # Ports are dynamically allocated for xdist-safe parallel execution. system_port = self._system_ports[worker_idx] @@ -255,7 +266,11 @@ def __init__( timeout=120, # Allow time for model loading display_output=True, health_check_ports=[], - health_check_urls=[], + # Gate each worker on its own /health, which reports ready once + # dynamo.sglang registers its health-check payload on generate. + health_check_urls=[ + (f"http://localhost:{system_port}/health", check_health_ready) + ], log_dir=request.node.name, terminate_all_matching_process_names=False, ) @@ -263,13 +278,15 @@ def __init__( if data_parallel_size is not None: logger.info( f"Created {data_parallel_size} DP ranks per worker on GPU(s) {gpu_device} " - f"({mem_budget}, system_port={system_port}, kv_port={kv_events_port}) " + f"({mem_budget}, system_port={system_port}, kv_port={kv_events_port}, " + f"nccl_port={nccl_port}) " f"with endpoint: {self.endpoint}" ) else: logger.info( f"Created SGLang worker {worker_idx} on GPU {gpu_device} " - f"({mem_budget}, system_port={system_port}, kv_port={kv_events_port}) " + f"({mem_budget}, system_port={system_port}, kv_port={kv_events_port}, " + f"nccl_port={nccl_port}) " f"with endpoint: {self.endpoint}" ) From cb94f10ad7f8f3d1441ac5c924a84b3bd7b0f82f Mon Sep 17 00:00:00 2001 From: jthomson04 Date: Tue, 22 Sep 2026 15:26:53 -0700 Subject: [PATCH 163/191] feat: Log frontend NUMA CPU affinity (#11184) Signed-off-by: jthomson04 --- .../src/dynamo/frontend/cpu_affinity.py | 68 +++++++++++++ components/src/dynamo/frontend/main.py | 2 + .../frontend/tests/test_cpu_affinity.py | 99 +++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 components/src/dynamo/frontend/cpu_affinity.py create mode 100644 components/src/dynamo/frontend/tests/test_cpu_affinity.py diff --git a/components/src/dynamo/frontend/cpu_affinity.py b/components/src/dynamo/frontend/cpu_affinity.py new file mode 100644 index 000000000000..3db1396c5b5e --- /dev/null +++ b/components/src/dynamo/frontend/cpu_affinity.py @@ -0,0 +1,68 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Warn when the frontend can run across multiple NUMA nodes.""" + +import logging +import os +from pathlib import Path + +_CPU_SYSFS_ROOT = Path("/sys/devices/system/cpu") + + +def _format_cpu_ranges(cpus: list[int]) -> str: + ranges: list[tuple[int, int]] = [] + for cpu in cpus: + if ranges and cpu == ranges[-1][1] + 1: + ranges[-1] = (ranges[-1][0], cpu) + else: + ranges.append((cpu, cpu)) + return ",".join( + str(start) if start == end else f"{start}-{end}" for start, end in ranges + ) + + +def warn_if_frontend_cpu_affinity_spans_numa_nodes( + logger: logging.Logger, +) -> None: + """Log a warning if the current CPU affinity covers multiple NUMA nodes.""" + + try: + cpus = sorted(os.sched_getaffinity(0)) + nodes = sorted( + { + node_path.name + for cpu in cpus + for node_path in (_CPU_SYSFS_ROOT / f"cpu{cpu}").glob("node[0-9]*") + } + ) + except (AttributeError, OSError) as error: + logger.debug("NUMA affinity check skipped: %s", error, exc_info=True) + return + + if not nodes: + logger.debug( + "NUMA affinity check skipped: no NUMA node links found for CPUs %s", + _format_cpu_ranges(cpus), + ) + return + + if len(nodes) == 1: + return + + border = "=" * 80 + logger.warning( + "%s\n" + "CRITICAL PERFORMANCE WARNING: Frontend CPU affinity spans " + "multiple NUMA nodes!\n" + "Running the frontend across multiple NUMA domains is known to cause " + "catastrophic performance issues.\n" + "Available CPUs: %s\n" + "NUMA nodes: %s\n" + "Pin the frontend to CPUs from a single NUMA node.\n" + "%s", + border, + _format_cpu_ranges(cpus), + ", ".join(nodes), + border, + ) diff --git a/components/src/dynamo/frontend/main.py b/components/src/dynamo/frontend/main.py index 5adfe3e34548..05dc905deb72 100644 --- a/components/src/dynamo/frontend/main.py +++ b/components/src/dynamo/frontend/main.py @@ -42,6 +42,7 @@ from dynamo.runtime import DistributedRuntime from dynamo.runtime.logging import configure_dynamo_logging +from .cpu_affinity import warn_if_frontend_cpu_affinity_spans_numa_nodes from .frontend_args import FrontendArgGroup, FrontendConfig if TYPE_CHECKING: @@ -396,6 +397,7 @@ async def async_main(): # it connects to NATS eagerly, so NATS (m)TLS env vars must already be set or # the CLI flags are silently ignored (unlike the lazily-dialed TCP planes). _export_transport_tls_env(config) + warn_if_frontend_cpu_affinity_spans_numa_nodes(logger) runtime = DistributedRuntime( loop, config.discovery_backend, diff --git a/components/src/dynamo/frontend/tests/test_cpu_affinity.py b/components/src/dynamo/frontend/tests/test_cpu_affinity.py new file mode 100644 index 000000000000..33f64cea1b79 --- /dev/null +++ b/components/src/dynamo/frontend/tests/test_cpu_affinity.py @@ -0,0 +1,99 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +import logging +import os +from pathlib import Path + +import pytest + +from dynamo.frontend import cpu_affinity +from dynamo.frontend.cpu_affinity import warn_if_frontend_cpu_affinity_spans_numa_nodes + +pytestmark = [pytest.mark.unit, pytest.mark.gpu_0, pytest.mark.pre_merge] + + +def _add_cpu(root: Path, cpu: int, node: int) -> None: + (root / f"cpu{cpu}" / f"node{node}").mkdir(parents=True) + + +def test_warns_when_affinity_spans_multiple_numa_nodes( + tmp_path: Path, + caplog: pytest.LogCaptureFixture, + monkeypatch: pytest.MonkeyPatch, +): + for cpu in (0, 1, 2, 3): + _add_cpu(tmp_path, cpu, 0) + for cpu in (8, 9): + _add_cpu(tmp_path, cpu, 1) + monkeypatch.setattr(cpu_affinity, "_CPU_SYSFS_ROOT", tmp_path) + monkeypatch.setattr(os, "sched_getaffinity", lambda _pid: {0, 1, 2, 3, 8, 9}) + logger = logging.getLogger("test.frontend.cpu_affinity.multiple") + + with caplog.at_level(logging.WARNING, logger=logger.name): + warn_if_frontend_cpu_affinity_spans_numa_nodes(logger) + + assert len(caplog.records) == 1 + message = caplog.records[0].getMessage() + assert "CRITICAL PERFORMANCE WARNING" in message + assert "Frontend CPU affinity spans multiple NUMA nodes" in message + assert ( + "Running the frontend across multiple NUMA domains is known to cause " + "catastrophic performance issues." + ) in message + assert "Available CPUs: 0-3,8-9" in message + assert "node0" in message + assert "node1" in message + + +@pytest.mark.parametrize( + ("cpus", "cpu_nodes", "debug_message"), + [ + pytest.param({0, 1}, [(0, 0), (1, 0)], None, id="same_node"), + pytest.param({8}, [], "no NUMA node links found", id="cpu_missing_from_sysfs"), + ], +) +def test_does_not_warn_without_multiple_detected_nodes( + tmp_path: Path, + caplog: pytest.LogCaptureFixture, + monkeypatch: pytest.MonkeyPatch, + cpus: set[int], + cpu_nodes: list[tuple[int, int]], + debug_message: str | None, +): + for cpu, node in cpu_nodes: + _add_cpu(tmp_path, cpu, node) + monkeypatch.setattr(cpu_affinity, "_CPU_SYSFS_ROOT", tmp_path) + monkeypatch.setattr(os, "sched_getaffinity", lambda _pid: cpus) + logger = logging.getLogger("test.frontend.cpu_affinity.silent") + + with caplog.at_level(logging.DEBUG, logger=logger.name): + warn_if_frontend_cpu_affinity_spans_numa_nodes(logger) + + assert not [ + record for record in caplog.records if record.levelno >= logging.WARNING + ] + if debug_message is None: + assert caplog.records == [] + else: + assert len(caplog.records) == 1 + assert debug_message in caplog.records[0].getMessage() + + +def test_affinity_failure_logs_debug_traceback_without_warning( + monkeypatch: pytest.MonkeyPatch, + caplog: pytest.LogCaptureFixture, +): + def fail_affinity(_pid: int) -> set[int]: + raise OSError("not permitted") + + monkeypatch.setattr(os, "sched_getaffinity", fail_affinity) + logger = logging.getLogger("test.frontend.cpu_affinity.failure") + + with caplog.at_level(logging.DEBUG, logger=logger.name): + warn_if_frontend_cpu_affinity_spans_numa_nodes(logger) + + assert len(caplog.records) == 1 + assert caplog.records[0].levelno == logging.DEBUG + assert "not permitted" in caplog.records[0].getMessage() + assert caplog.records[0].exc_info is not None From 8a6447484cfdb1a96cc1838e871a1295b6ffeb95 Mon Sep 17 00:00:00 2001 From: Shwetha Krishnamurthy Date: Tue, 22 Sep 2026 15:28:38 -0700 Subject: [PATCH 164/191] docs(recipes): group sidebar by provider and order engines and GPUs consistently (#15142) Signed-off-by: shwetha-krishnamurthy Co-authored-by: Claude Fable 5.1 --- .../assets/img/recipes/providers/lgai.webp | Bin 0 -> 2446 bytes .../recipes/providers/thinkingmachines.png | Bin 3098 -> 0 bytes .../recipes/providers/thinkingmachines.webp | Bin 0 -> 2794 bytes docs/fern/index.yml | 212 +++++++++++------- docs/fern/pages/recipes/_catalog/index.yaml | 30 +-- .../model-recipes/deepseek-v4-flash.mdx | 4 +- .../model-recipes/deepseek-v4-pro-0813.mdx | 4 +- .../recipes/model-recipes/deepseek-v4-pro.mdx | 4 +- .../recipes/model-recipes/gemma-4-31b.mdx | 4 +- .../pages/recipes/model-recipes/glm-5-2.mdx | 4 +- .../recipes/model-recipes/glm-5-3-flash.mdx | 4 +- .../recipes/model-recipes/gpt-oss-120b.mdx | 4 +- .../recipes/model-recipes/inkling-nvfp4.mdx | 4 +- .../pages/recipes/model-recipes/kimi-k2-6.mdx | 4 +- .../pages/recipes/model-recipes/kimi-k3.mdx | 12 +- .../model-recipes/nemotron-3-5-lightning.mdx | 8 +- .../model-recipes/nemotron-3-super.mdx | 4 +- .../pages/recipes/model-recipes/overview.mdx | 87 +++---- .../model-recipes/qwen-3-8-2-4t-a95b-fp8.mdx | 8 +- .../model-recipes/qwen3-235b-a22b-fp8.mdx | 4 +- .../recipes/model-recipes/qwen3-6-35b-a3b.mdx | 4 +- 21 files changed, 226 insertions(+), 179 deletions(-) create mode 100644 docs/fern/assets/img/recipes/providers/lgai.webp delete mode 100644 docs/fern/assets/img/recipes/providers/thinkingmachines.png create mode 100644 docs/fern/assets/img/recipes/providers/thinkingmachines.webp diff --git a/docs/fern/assets/img/recipes/providers/lgai.webp b/docs/fern/assets/img/recipes/providers/lgai.webp new file mode 100644 index 0000000000000000000000000000000000000000..93526b71b22424dd77642f9678600796ea6d381c GIT binary patch literal 2446 zcmV;9332vPNk&G72><|BMM6+kP&il$0000G0002T0074T06|PpNKgO(00CeWNs=P} zTK2#QGoy^9me8+@jtGTG8!&bplRxuHAoG`32p|xTvVaQ&Vo{VdPX3es(AXk3VuQIff$~{e`)>0s(+YA>3{YQ&5!K8>-@|A zEdIy)E$-R=@72fppHN@%-|)KG{RqEk{X2b>zij_-egXem|M&KP@4a^A{<^*H0C$9b zfZ$bxKjv$*nir9cLHA)v?L!ysr>U?vxM2-+7k=7$n*vbf7n)kT@NOP0U4ry`radoV zE38rwM&XF^lkH`ov4OlQy~N%c+bYWBh^YUz>=S0XW6;y4P-fBU*?Q6(wWN%iaIP~V znKFMx7XBjrj2>e;vN_;#);{g_O!W$wZYF>)&BZO6Stogq8 zd`P7RCX2q*nA& z+eZ#rzkpQ_Qur9!4uqQ)@+T#M@%lFP!8=5VjDP!eLB`YgQ+@`<&3t>`KTgevQDykg z5lAF{*YB?m^+9oLF!u=eOo7=HmY$}-;`Do=0092~xEKH|dr1D_<7fE0YJ*xLb)MP^ zRlC98sVQk0d0-N>q>ZW~|D8HKM*$WT|L^Q`kZT`bY7rRnDwDTN!T&GwwT*{QrU zh9l3yFCI^MgtMfYSXk}Q-J2CMk%R?Kh&sc*e@IoD>8QDPq?aQ9Z^ynn|qpq zbt75e_dL=iD_sXcc{mkdvD1y-cY%eJQW_bz)6p+xgBLQ)cj@|UVG3ltbI^OGHPlob z$O;Hp1pyO@(IG%58kpfjm7yZr3wURq`)ORen1zygdZ(F ziP(?Z#SXH>s)`d0@`l`P535#d9<;wEmJ}PpIk4Rrnd+j<$s~(6?E%wY?OFk?;fR*( z1T_pjktc$3vWeM_ujrBV+Y$UBK+1cwr$@;vBj%kH59DS1+PG@b&wBs$%!mS-$H2e6 z`d>bj<0?6J2)N1a(A>^gY;X#T?)qHES%TWhcYZm(uy=rHwEgC#X!Z}Q=S5$(wnXk_ zRO$ThpA0MkCMJ_7{>2;4*&uWhm_B-Ev@SL%-2rjda_TkfDBnwksq`ahte}dkWk-;? zz0WiX(UiE7yvGwSL$pNu%sUSb5RyBLMf1MZN=QPv<|~LZg=Q4*bjPSD&^6XV*VP&J z^H?t+hn36qD7?nuvMYV)27JyOq6vUkm^kSao~|1hho{VP>N0*1rwCxx_OBfM#F)Vy z(EpLQgeZcVrq2iXZS0aL5 zb5M?xX&upsum~pKo=}Lwn>cCwn#-asQU2CMX*VXQT8wfK0z|R7$P9M8!Utqyq**q! zNlU&rE^4)#(;rG~Z5Uv0|Aq+p7*+N+)n+?tghv}#yn{f)|DB!gW2y*;ihc#JTNSaN zrXq$H-EBIq8kBLw^&OZY1)!viE6W5UNeZMqfO9QGxttI{lco=S#`Bd-A;dRG(O)(o zWw?N&F0(|J1d-)LY&Kq5tOL{x8|ijio$dMG6NW{1zatkDiXj4K(uo9`UNu$FcL{g_8e^uFU^Wy z6Y(JJL>=bA6@Iva+e`53JIE-@=hsN*P)@G_#1S}J%M3-!%8rfxH35M24#5wxFt58Y zu4Q4{7`F;%V;;I0vJMfIRm6fyN4fkU_ezI*;i$$Wyw5{^3}T-@RZ-&&A3Ox)ld_Ty zlj4msMEo(_xIp86)K+$R%XR(V6YXZxZ`$4`&j;>g z+gHO)I(C818Gz4G<#ZbtZ!ykEK@}qArVaFK28AoK5U(bx2V_B=|#VABa=)+=8K&8r7TcOVN6;PH&+n5TTqtCbhy<5nW5Mj z47>*%XeEO$&dusE%x#MIx2zfsY&azZ^trPx{D1awro2l%IpFK$q6+0Nw9*6FzBgVH zTu58J`uVvnfM9sSDf%Xp&w3Kqhiy`c99*|daXlRW*WLDVWdkSRrkVO)#h3ykGl!aV z>QlZ)G`k{5vtwAK&{5f&z&vq3&Pf~ho;H{8}iodNG#?c?96;W2vxAe!nQ{BpW4 z)Uf@4VVD<*+ff3J+k^?OS%9dqc%duS%a5d={agV}HOXe*xK}(hSqzrpMVb^Q@jw6z McmMzZ000000GGY4(f|Me literal 0 HcmV?d00001 diff --git a/docs/fern/assets/img/recipes/providers/thinkingmachines.png b/docs/fern/assets/img/recipes/providers/thinkingmachines.png deleted file mode 100644 index ab123ea67a0454980d4232b488058929a62db348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3098 zcmeHJX*(N;77l5XTAD7_A~9vqvBg%^BxQdeegFV)-2Ae! z&0&B2pF9RSth)Um4FEu3+T7T{F3N4S&^f?vL?n6Sk|xOeVO!gd_LH2HD}H5mLC?p9 zpB}jvjteN)R`km(`C%h_kuMPN&T=?UJ5c$1MN;WU^^99`{?`gF&8nY*$O~VV$?moh zP8tTE+j0r85PajK_GWN#9C9tF6V2?)Z}?O1@zFP|6*BkWptW(3?vq9`r=SJ}iV+db zA3|I2U%Tgz8gyOBWLcv7a+_Y9=03gDqx#w9Ezn5$eepYlUpMEIID@(1TR9YA$>OlX zTk>CI_Kc$I1N(r-2AQQ2cm}t|ql(BlRAulnt#*z{SmAt+tQ#EdFkqmzu>L1B z1V?JkbzwOQZY9*L&LK*WNaTZg2fMZJ?i{?N*u-vAl!8=uKCnG@dMABo;`#Z*xZ{`> zCPKsJw+XEm@4%^UoSWpr1{Ce5u+G%u`Ns92zib^<^;CfqqoWJMU%ytbqoPw6yPo3s zrOd?MMNq{hJn+Q7KyxGr-KR{rlRU(H@}EmpRnaj!8rnu(G0~#Y?XqAtSVxOTkr0kon0-xR z#??8otLJJ z)zC0pg@PA~BL7;%1j8StJzTf#4#~KFIpGK-VHhC{`TVV3BYJlFMwM%G(ue7gwkJ*} z^*5gNFYYJ6N-rF2i*9Wbr@K@D-xJTy%HL(`>f1SJr^Iv0%oe#ZVnTYfAy$1H7!l4z zHLmRnKv9?^jr@m<|Hh!N_Nj_^HK1FfRt| zJxDZhK43cUerUzLlU{jx3V@-jN9tunlD6hnE63>mzS^MYM7cDx)eu`uKq4!K>Ha8me%D~c2h(@SY=>>Pffaiei zr-6xK$^jq;mUXQ9WWjj3>1w^4-COK=6B*4|rO%Ef)k_2dkN*TY1(Lu#<)vo32l}uo zC^emr`x!~GTy{8k;ys{DDXIzDBU6BZB2F16Ut120x_#6P{}nz%56DOa?Aj2v4eQ7=0P;o_4fm}Mhtsm<%TgAI#S|}7&S=w3% z!!_mj=c@i(gb0c};1rN^P{6H@u_dLIG2zbWu%}t zS5QGY{0)`T5T@XMowXT`~=MjOJJM{hxMU_!g8ATEMBPpIgKDl52E=d^3{+X%D*gT;#GIy$V)&VxA_k|Jzp zP16+M1&l}Dh-mQEA2zpd`}>1x147$}+G^-@ws%xhD#(!a0xmgYp_3z??N9vBinnx#2 z1T6k0*W)v`oycfH7kZCC$B?kT5m#Y)rEkk#UD%J_>qD{~&O0w-kH2l3elWP`FF|~p z3C20lFFxrB@Vk8*8R>TcjXF_JX&-=5FcIYxFGD*2CGXd)xY)bzR~l>^){JaV(xN{> zM(4xF1;}W@bu)-aqrH7Lv@u0~Y*WWi{LBioCrjbeGZC>a->98<4N^y}4LVo$E60m5 zT0rcl`U1hK2(^y~+Z&FF3cWLZBh#g&v^`F+BM!&*1K~V1uI`_3L|%>xsRO4RdVYYp M$yMVTLyyG20ZWJK8UO$Q diff --git a/docs/fern/assets/img/recipes/providers/thinkingmachines.webp b/docs/fern/assets/img/recipes/providers/thinkingmachines.webp new file mode 100644 index 0000000000000000000000000000000000000000..a54b3d865ece1e9bce0c95c98e58321ab113023e GIT binary patch literal 2794 zcmVe;)o*{!{#i?T`7-|NsB~z5k&95BU4;WAktDAMSs`eoFm>|0Mo#{(JkE z`9J$VmAwe#tsY67lU&=`@^TTU;PQyT&INIe8d`_;94=9VM z^1$rFI9Z?Ty7l)azogUgo{714yVwP)`*E>WIJ$2RzF z+2M2TT!Z#(Gia^?zVl%JRqh6fG~q7+qwyH!tM~ap>e-C}l4I^vpb+F^K{%3OcNZ5; zqynyQ_L$v@un%JIcX(ATev4Kw#Z^^RRaI40RaI40RaI40RZ+kI{{QNO02WCiFt~Dn z;bDLOs32{~m-GR;o@lH8{*ZW=bBqy^NKfIB{oHG#^)IEw$Wi8h7WF$W2g2YpO*lHJbEOpfZ25fofP3lc5zhX@?+PE2F|62_HYo6=|xdr%?B%uD;tM7Hx25}GQ zHeZR+$_j6523l)m~y<{gq%qWt(d;&6VF_H z7S_~qZkLG0G@#Hj&i{iVhefiX4$qwSB2tj{lhWrf{h%~|v9n>B(WmfYQ%Cu{hZ~i( zmK#L4n>``r1*}!of#Zw_bZ?5@%1A*`kw39}@gog}%9X3Ax4RKfCL>gpu)9^7>;7f7 zX$|qW$jJ;@B+=jPrhyK3C|q*tV7#l$qA6f~P5Dr%yT*4C3^?6evmPFJuT38zsfA`<*yd+39uddy5y!Z8h4n3lZU<&Dyb zq#*BM^-$+_dI1>4u_d$8;aEhina4kflS^X6Ww}V*d@f%it+__KjZHwd2fpD z=5k3E%g*P)lxVgx5M}+}=}}q3O676ana5SnWz=Aj3LTf>PpLzC=;^0yfJEftZv5kk zIL|yKhNKGf7>Y_&)VtVc&IwQa=Z#iHTk^T-I^5Lz4(`^bz|_`)8j=)IHBgt?t5PC- zt`ie@SJB=iK8}=94?KJevw!Bb;fJo$ns`VF^T{F^nalLYIp1=lm`qz_k_{qyrL;#} z9*!{mQ#TAq_FULy*_Wh3u^E36a4xb`pcXC-8xe1{BkN0T{z1}&W6&KX(o1@;Y%a*C z+-Jn>#5^u!@zKX0^8wiC#ei-?2?FeTo}L4?)AwigYhPSqXD70LCCLFh5;`B7!8ShM zw1R4@f86oq>|e5X3X_jv#B?-vEW61LUw}mm$s<9Hm?EHlAK*@0UEpCZfVf}(T_iaF zhZA&w2ofLt4>&6)Es2~cd2FWTZ0wLpzidM3AVa_^>kyt?iGpj?*z3oG#G?Nd;kX-4 zag?@^M8cMtks-aSbdv?_eSH8rGW223G4 zFS%#sgd)$@QSHSbg^7sGEFk}J}!=@ld6)_x*OeNekE+r#}&s2OwDRyJ} zXgyiC>5Q(|%woM6VXI!_e(9!_lzJ@zaOSdf&CwT_!oPJ86#rDbagE@(M|SU{yGC&r zHUBYIxXS5UuB6XsC=A%Be3Ad$a0mh=T%yjFdqbhJ>FK8v(vo~kqd+B zLjMPs`qPpa0|xZFMUZ4`-n~Ou(|`G4d9%M2>J5*hPkC~h%M!aCb@L0o>d)`_>x#mA znPDf97t#Om!R0nDYLI^0gha~ny@SwYG0$4!UNBHr{BGx!5)a}|5s~h)ZL79B*p%)- z9#D~R>Q4(Hd7vh8XTi5^Y?EZ{3vGN@{=Rx=J_u?J{MUHGd9j*TZ)J#KL2i8i`pNyE zJTd6fFSi8nzXx?7dq8}qwq+tk za8C*YCehu`F~=eC>e9K8i%SaPWuI5%S~eBn9QO4R`F5w1hR6jW;CB zMvB}PPh=tQi**Bkku_LGw{f|~_rlz{pOYn4WxiQ-@q(Ak_EZvoi#rhs%;-Nl8@(n; zbK*8|l%b;RN6IZnFx$t?sN6;{gx#;I=|t4DNBm(N^2qlmIR5us(40teHY;0 zsIe^X%^ha`(@F1EiC3Tz=4RQq(SC`!}5cp%~(MC)He5v7C^uz@-3W&tz(VJ#y- zNJdYc+(PpWs$r0l1u5O1i2D0?zMxg$7fp^w_<+h=si)MoL`}JRT$kQc37_({QMAI& zFYh#2bX`G|OUfu+EPZEw!B~`?SD;O0)4+E3f3`#t<4u-2$nHOH_39dkKFWT=0hyDv z$(vHXv7rbcp++#WYCFu^la&Tc&GQD2ENi0AjD6v+X5UkGl0XTNsa!L+ZRBy#Gm@ zxH4Rn8K^fCKa=ahbE1s<6x7E3=>nSLXKFroIqdq<@T^TVL=Yt)ZusXJ!ub_91$7h+9s98`Z4H@o09V2P*h9`XgH zz>S&xZSH3`2?nWN_Rg}M_C`WcZ^At#I~~DxbbC^CQq1@=S-f2>3UCBe{t`N8h*cyl zh8{7qJKxzHm$!S0HK70z$Vk>^V+;T0P;$rgV<-yk`}e-4tvC6XeXw5iV~F1*c!8Ia wO@wFQw_NaArCF0r5B>kWxhqN)pI9l7IUlajgeXlilS3@WGuzQMhI{}300zK~>Hq)$ literal 0 HcmV?d00001 diff --git a/docs/fern/index.yml b/docs/fern/index.yml index fdde93e1bc46..04d43938d2df 100644 --- a/docs/fern/index.yml +++ b/docs/fern/index.yml @@ -785,81 +785,127 @@ navigation: - page: Overview path: pages/recipes/model-recipes/overview.mdx slug: browse - - page: K-EXAONE 2.0 - path: pages/recipes/model-recipes/k-exaone-2.mdx - slug: k-exaone-2 - - page: Gemma-4-31B - path: pages/recipes/model-recipes/gemma-4-31b.mdx - slug: gemma-4-31b - - page: DeepSeek-V4.1-Flash - path: pages/recipes/model-recipes/deepseek-v4-1-flash.mdx - slug: deepseek-v4-1-flash - - page: GLM-5.3-Flash - path: pages/recipes/model-recipes/glm-5-3-flash.mdx - slug: glm-5-3-flash - - page: A.X-K2 - path: pages/recipes/model-recipes/ax-k2.mdx - slug: ax-k2 - - page: Kimi-K3 - path: pages/recipes/model-recipes/kimi-k3.mdx - slug: kimi-k3 - - page: Solar Open2 250B - path: pages/recipes/model-recipes/solar-open2-250b.mdx - slug: solar-open2-250b - - page: Qwen3.8-Flash-Next - path: pages/recipes/model-recipes/qwen-3-8-flash-next.mdx - slug: qwen-3-8-flash-next - - page: Qwen3.8-2.4T-A95B - path: pages/recipes/model-recipes/qwen-3-8-2-4t-a95b-fp8.mdx - slug: qwen-3-8-2-4t-a95b-fp8 - - page: GLM-5.3/5.2 - path: pages/recipes/model-recipes/glm-5-2.mdx - slug: glm-5-2 - - page: Inkling NVFP4 - path: pages/recipes/model-recipes/inkling-nvfp4.mdx - slug: inkling - - page: Kimi-K2.6 - path: pages/recipes/model-recipes/kimi-k2-6.mdx - slug: kimi-k2-6 - - page: Nemotron 3.5 Lightning - path: pages/recipes/model-recipes/nemotron-3-5-lightning.mdx - slug: nemotron-3-5-lightning - - page: Nemotron 3 Ultra - path: pages/recipes/model-recipes/nemotron-3-ultra.mdx - slug: nemotron-3-ultra - - page: Nemotron 3 Super - path: pages/recipes/model-recipes/nemotron-3-super.mdx - slug: nemotron-3-super - - page: GLM-5 NVFP4 - path: pages/recipes/model-recipes/glm-5-nvfp4.mdx - slug: glm-5-nvfp4 - - page: DeepSeek-V4-Pro - path: pages/recipes/model-recipes/deepseek-v4-pro.mdx - slug: deepseek-v4-pro - - page: DeepSeek-V4-Pro-0813 - path: pages/recipes/model-recipes/deepseek-v4-pro-0813.mdx - slug: deepseek-v4-pro-0813 - - page: DeepSeek-V4-Flash - path: pages/recipes/model-recipes/deepseek-v4-flash.mdx - slug: deepseek-v4-flash - - page: GPT-OSS-120B - path: pages/recipes/model-recipes/gpt-oss-120b.mdx - slug: gpt-oss-120b - - page: Qwen3-32B - path: pages/recipes/model-recipes/qwen3-32b.mdx - slug: qwen3-32b - - page: Qwen3.5-122B-A10B - path: pages/recipes/model-recipes/qwen3-5-122b.mdx - slug: qwen3-5-122b - - page: Qwen3-235B-A22B FP8 - path: pages/recipes/model-recipes/qwen3-235b-a22b-fp8.mdx - slug: qwen3-235b-a22b-fp8 - - page: Qwen3-32B FP8 - path: pages/recipes/model-recipes/qwen3-32b-fp8.mdx - slug: qwen3-32b-fp8 - - page: Qwen3.6-35B-A3B - path: pages/recipes/model-recipes/qwen3-6-35b-a3b.mdx - slug: qwen3-6-35b-a3b + # Grouped by model provider. Each group uses skip-slug so page URLs + # stay /recipes/; within a group, newest models come first. + - section: Z.ai + skip-slug: true + collapsed: true + contents: + - page: GLM-5.3-Flash + path: pages/recipes/model-recipes/glm-5-3-flash.mdx + slug: glm-5-3-flash + - page: GLM-5.3/5.2 + path: pages/recipes/model-recipes/glm-5-2.mdx + slug: glm-5-2 + - page: GLM-5 NVFP4 + path: pages/recipes/model-recipes/glm-5-nvfp4.mdx + slug: glm-5-nvfp4 + - section: Moonshot AI + skip-slug: true + collapsed: true + contents: + - page: Kimi-K3 + path: pages/recipes/model-recipes/kimi-k3.mdx + slug: kimi-k3 + - page: Kimi-K2.6 + path: pages/recipes/model-recipes/kimi-k2-6.mdx + slug: kimi-k2-6 + - section: DeepSeek + skip-slug: true + collapsed: true + contents: + - page: DeepSeek-V4.1-Flash + path: pages/recipes/model-recipes/deepseek-v4-1-flash.mdx + slug: deepseek-v4-1-flash + - page: DeepSeek-V4-Pro + path: pages/recipes/model-recipes/deepseek-v4-pro.mdx + slug: deepseek-v4-pro + - page: DeepSeek-V4-Pro-0813 + path: pages/recipes/model-recipes/deepseek-v4-pro-0813.mdx + slug: deepseek-v4-pro-0813 + - page: DeepSeek-V4-Flash + path: pages/recipes/model-recipes/deepseek-v4-flash.mdx + slug: deepseek-v4-flash + - section: Qwen + skip-slug: true + collapsed: true + contents: + - page: Qwen3.8-Flash-Next + path: pages/recipes/model-recipes/qwen-3-8-flash-next.mdx + slug: qwen-3-8-flash-next + - page: Qwen3.8-2.4T-A95B + path: pages/recipes/model-recipes/qwen-3-8-2-4t-a95b-fp8.mdx + slug: qwen-3-8-2-4t-a95b-fp8 + - page: Qwen3.6-35B-A3B + path: pages/recipes/model-recipes/qwen3-6-35b-a3b.mdx + slug: qwen3-6-35b-a3b + - page: Qwen3.5-122B-A10B + path: pages/recipes/model-recipes/qwen3-5-122b.mdx + slug: qwen3-5-122b + - page: Qwen3-235B-A22B FP8 + path: pages/recipes/model-recipes/qwen3-235b-a22b-fp8.mdx + slug: qwen3-235b-a22b-fp8 + - page: Qwen3-32B + path: pages/recipes/model-recipes/qwen3-32b.mdx + slug: qwen3-32b + - page: Qwen3-32B FP8 + path: pages/recipes/model-recipes/qwen3-32b-fp8.mdx + slug: qwen3-32b-fp8 + - section: NVIDIA + skip-slug: true + collapsed: true + contents: + - page: Nemotron 3.5 Lightning + path: pages/recipes/model-recipes/nemotron-3-5-lightning.mdx + slug: nemotron-3-5-lightning + - page: Nemotron 3 Ultra + path: pages/recipes/model-recipes/nemotron-3-ultra.mdx + slug: nemotron-3-ultra + - page: Nemotron 3 Super + path: pages/recipes/model-recipes/nemotron-3-super.mdx + slug: nemotron-3-super + - section: Google + skip-slug: true + collapsed: true + contents: + - page: Gemma-4-31B + path: pages/recipes/model-recipes/gemma-4-31b.mdx + slug: gemma-4-31b + - section: Thinking Machines + skip-slug: true + collapsed: true + contents: + - page: Inkling NVFP4 + path: pages/recipes/model-recipes/inkling-nvfp4.mdx + slug: inkling + - section: OpenAI + skip-slug: true + collapsed: true + contents: + - page: GPT-OSS-120B + path: pages/recipes/model-recipes/gpt-oss-120b.mdx + slug: gpt-oss-120b + - section: LG AI Research + skip-slug: true + collapsed: true + contents: + - page: K-EXAONE 2.0 + path: pages/recipes/model-recipes/k-exaone-2.mdx + slug: k-exaone-2 + - section: SK Telecom + skip-slug: true + collapsed: true + contents: + - page: A.X-K2 + path: pages/recipes/model-recipes/ax-k2.mdx + slug: ax-k2 + - section: Upstage + skip-slug: true + collapsed: true + contents: + - page: Solar Open2 250B + path: pages/recipes/model-recipes/solar-open2-250b.mdx + slug: solar-open2-250b # ==================== Kubernetes Templates ==================== - section: Kubernetes Templates @@ -868,12 +914,12 @@ navigation: - section: DGD collapsed: open-by-default contents: - - page: vLLM - path: pages/recipes/kubernetes-templates/dgd/vllm.mdx - - page: TensorRT-LLM - path: pages/recipes/kubernetes-templates/dgd/tensorrt-llm.mdx - page: SGLang path: pages/recipes/kubernetes-templates/dgd/sglang.mdx + - page: TensorRT-LLM + path: pages/recipes/kubernetes-templates/dgd/tensorrt-llm.mdx + - page: vLLM + path: pages/recipes/kubernetes-templates/dgd/vllm.mdx - page: DGDR path: pages/recipes/kubernetes-templates/dgdr.mdx @@ -882,12 +928,12 @@ navigation: slug: cli-templates icon: rectangle-terminal contents: - - page: vLLM - path: pages/recipes/cli-templates/vllm.mdx - - page: TensorRT-LLM - path: pages/recipes/cli-templates/tensorrt-llm.mdx - page: SGLang path: pages/recipes/cli-templates/sglang.mdx + - page: TensorRT-LLM + path: pages/recipes/cli-templates/tensorrt-llm.mdx + - page: vLLM + path: pages/recipes/cli-templates/vllm.mdx # ==================== Feature Benchmarks ==================== # Evidence pages behind the recipes: controlled A/B benchmarks whose diff --git a/docs/fern/pages/recipes/_catalog/index.yaml b/docs/fern/pages/recipes/_catalog/index.yaml index 98b7ff09e7ef..916b70ffadb9 100644 --- a/docs/fern/pages/recipes/_catalog/index.yaml +++ b/docs/fern/pages/recipes/_catalog/index.yaml @@ -10,30 +10,30 @@ # active ones in recipes/.yaml. schema_version: 1 recipes: -- gemma4-31b -- deepseek-v4-1-flash - glm-5-3-flash -- ax-k2 -- k-exaone-2 -- kimi-k3 -- qwen-3-8-flash-next -- qwen-3-8-2-4t-a95b-fp8 - glm-5-2 -- inkling -- kimi-k2-6 -- nemotron-3-5-lightning -- nemotron-3-ultra -- nemotron-3-super - glm-5-nvfp4 +- kimi-k3 +- kimi-k2-6 +- deepseek-v4-1-flash - deepseek-v4-pro - deepseek-v4-pro-0813 - deepseek-v4-flash -- gpt-oss-120b -- qwen3-32b +- qwen-3-8-flash-next +- qwen-3-8-2-4t-a95b-fp8 +- qwen3-6-35b-a3b - qwen3-5-122b - qwen3-235b-a22b-fp8 +- qwen3-32b - qwen3-32b-fp8 -- qwen3-6-35b-a3b +- nemotron-3-5-lightning +- nemotron-3-ultra +- nemotron-3-super +- gemma4-31b +- inkling +- gpt-oss-120b +- k-exaone-2 +- ax-k2 deferred_recipes: - qwen3-6-35b - kimi-k2-5 diff --git a/docs/fern/pages/recipes/model-recipes/deepseek-v4-flash.mdx b/docs/fern/pages/recipes/model-recipes/deepseek-v4-flash.mdx index 48e2e451b942..efdd3db24ceb 100644 --- a/docs/fern/pages/recipes/model-recipes/deepseek-v4-flash.mdx +++ b/docs/fern/pages/recipes/model-recipes/deepseek-v4-flash.mdx @@ -15,10 +15,10 @@ Each target below is an agentic-workload vLLM deployment of DeepSeek-V4-Flash

Choose your deployment target

GPU - - + +
Topology diff --git a/docs/fern/pages/recipes/model-recipes/deepseek-v4-pro-0813.mdx b/docs/fern/pages/recipes/model-recipes/deepseek-v4-pro-0813.mdx index bc886c1b708a..0f6dd358ddc7 100644 --- a/docs/fern/pages/recipes/model-recipes/deepseek-v4-pro-0813.mdx +++ b/docs/fern/pages/recipes/model-recipes/deepseek-v4-pro-0813.mdx @@ -15,10 +15,10 @@ Each target below is a Dynamo + vLLM deployment of DeepSeek-V4-Pro-0813 — a 1.

Choose your deployment target

GPU - - + +
Topology diff --git a/docs/fern/pages/recipes/model-recipes/deepseek-v4-pro.mdx b/docs/fern/pages/recipes/model-recipes/deepseek-v4-pro.mdx index f610ade84f15..309c3c8b54fe 100644 --- a/docs/fern/pages/recipes/model-recipes/deepseek-v4-pro.mdx +++ b/docs/fern/pages/recipes/model-recipes/deepseek-v4-pro.mdx @@ -15,10 +15,10 @@ Each target below is an agentic-workload vLLM deployment of DeepSeek-V4-Pro —

Choose your deployment target

GPU - - + +
Topology diff --git a/docs/fern/pages/recipes/model-recipes/gemma-4-31b.mdx b/docs/fern/pages/recipes/model-recipes/gemma-4-31b.mdx index 318216deba56..9499a24102cd 100644 --- a/docs/fern/pages/recipes/model-recipes/gemma-4-31b.mdx +++ b/docs/fern/pages/recipes/model-recipes/gemma-4-31b.mdx @@ -19,12 +19,12 @@ Pick your GPU architecture; every command on this page updates to match.

Choose your deployment target

GPU + + - -
Checkpoint nvidia/Gemma-4-31B-IT-NVFP4 + google/gemma-4-31B-it-assistant diff --git a/docs/fern/pages/recipes/model-recipes/glm-5-2.mdx b/docs/fern/pages/recipes/model-recipes/glm-5-2.mdx index 4a3b559260f1..43853f1ac26d 100644 --- a/docs/fern/pages/recipes/model-recipes/glm-5-2.mdx +++ b/docs/fern/pages/recipes/model-recipes/glm-5-2.mdx @@ -15,10 +15,10 @@ Each target below is a Dynamo + SGLang deployment of Z.AI's GLM-5.3/5.2 tuned fo

Choose your deployment target

GPU - - + +
Topology diff --git a/docs/fern/pages/recipes/model-recipes/glm-5-3-flash.mdx b/docs/fern/pages/recipes/model-recipes/glm-5-3-flash.mdx index aee1cafac59d..6fd58e718a67 100644 --- a/docs/fern/pages/recipes/model-recipes/glm-5-3-flash.mdx +++ b/docs/fern/pages/recipes/model-recipes/glm-5-3-flash.mdx @@ -17,10 +17,10 @@ Each target below is an NVIDIA Dynamo + vLLM deployment of Z.AI's GLM-5.3-Flash,

Choose your deployment target

GPU - - + +
Topology diff --git a/docs/fern/pages/recipes/model-recipes/gpt-oss-120b.mdx b/docs/fern/pages/recipes/model-recipes/gpt-oss-120b.mdx index 88a995464ce6..a2becab1c084 100644 --- a/docs/fern/pages/recipes/model-recipes/gpt-oss-120b.mdx +++ b/docs/fern/pages/recipes/model-recipes/gpt-oss-120b.mdx @@ -15,10 +15,10 @@ Validated deployment targets for `openai/gpt-oss-120b` (MXFP4 MoE, 128 experts,

Choose your deployment target

GPU - - + +
diff --git a/docs/fern/pages/recipes/model-recipes/inkling-nvfp4.mdx b/docs/fern/pages/recipes/model-recipes/inkling-nvfp4.mdx index e04495be3f85..728d0cbcda47 100644 --- a/docs/fern/pages/recipes/model-recipes/inkling-nvfp4.mdx +++ b/docs/fern/pages/recipes/model-recipes/inkling-nvfp4.mdx @@ -15,10 +15,10 @@ Deployments for `thinkingmachines/Inkling-NVFP4` — the NVFP4-quantized checkpo

Choose your deployment target

GPU - - + +
Topology diff --git a/docs/fern/pages/recipes/model-recipes/kimi-k2-6.mdx b/docs/fern/pages/recipes/model-recipes/kimi-k2-6.mdx index ce8e871a8027..3e313ebb4888 100644 --- a/docs/fern/pages/recipes/model-recipes/kimi-k2-6.mdx +++ b/docs/fern/pages/recipes/model-recipes/kimi-k2-6.mdx @@ -15,10 +15,10 @@ Each target below is a validated aggregated vLLM deployment of Kimi-K2.6 — tex

Choose your deployment target

GPU - - + +
Workload diff --git a/docs/fern/pages/recipes/model-recipes/kimi-k3.mdx b/docs/fern/pages/recipes/model-recipes/kimi-k3.mdx index 033f90fd7fe2..2375ecdcc76a 100644 --- a/docs/fern/pages/recipes/model-recipes/kimi-k3.mdx +++ b/docs/fern/pages/recipes/model-recipes/kimi-k3.mdx @@ -23,19 +23,19 @@ Each target below is a Dynamo + vLLM or SGLang deployment of Moonshot AI's Kimi-

Choose your deployment target

Framework - - + +
GPU - - - - + + + +
Topology diff --git a/docs/fern/pages/recipes/model-recipes/nemotron-3-5-lightning.mdx b/docs/fern/pages/recipes/model-recipes/nemotron-3-5-lightning.mdx index 70ba1e7caae7..0c11269956e6 100644 --- a/docs/fern/pages/recipes/model-recipes/nemotron-3-5-lightning.mdx +++ b/docs/fern/pages/recipes/model-recipes/nemotron-3-5-lightning.mdx @@ -15,23 +15,23 @@ This recipe deploys the NVFP4 or BF16 variant of `NVIDIA-Nemotron-3.5-Lightning-

Choose your deployment target

GPU - - + +
Topology + + - -
Checkpoint nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16 diff --git a/docs/fern/pages/recipes/model-recipes/nemotron-3-super.mdx b/docs/fern/pages/recipes/model-recipes/nemotron-3-super.mdx index e25e86c5758f..e095147f0e14 100644 --- a/docs/fern/pages/recipes/model-recipes/nemotron-3-super.mdx +++ b/docs/fern/pages/recipes/model-recipes/nemotron-3-super.mdx @@ -15,10 +15,10 @@ Each target below is a validated aggregated vLLM deployment of Nemotron-3-Super

Choose your deployment target

GPU - - + +
Workload diff --git a/docs/fern/pages/recipes/model-recipes/overview.mdx b/docs/fern/pages/recipes/model-recipes/overview.mdx index b08cccca2554..75c412cacc4f 100644 --- a/docs/fern/pages/recipes/model-recipes/overview.mdx +++ b/docs/fern/pages/recipes/model-recipes/overview.mdx @@ -14,17 +14,17 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor - + + + + - - - - - - + + + @@ -51,48 +51,49 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
Provider
- + + + + - - - - - - -
+ + + +
Runtime
- + -
+
Hardware
+ - -
+
-
+

Qwen3.6-35B-A3B

Qwen

SGLang recipes for agentic traffic on B200, GB200, or H200, with FP8 KV caching, prefix caching, and speculative decoding.

-
SGLang1x B200 · 1x GB200 · 1x H200Agentic · MTP
+
SGLang1x H200 · 1x B200 · 1x GB200Agentic · MTP
Open recipe
+

K-EXAONE 2.0

LG AI Research

750B-A37B MoE in NVFP4 on B200, aggregated or disaggregated 1P1D, with MTP speculative decoding and KV-aware routing on an 8K/1K chat trace.

vLLM4x/8x B200Chat trace replay
Open recipe
-
+

Gemma-4-31B

Google / NVIDIA

@@ -110,13 +111,13 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
SGLang8x GB200Day-0 · up to 1M context
Open recipe
-
+

GLM-5.3-Flash

Z.AI

vLLM recipes for agentic traffic on GB200 or H200, aggregated or 1P1D disaggregated with KV-aware routing, NIXL KV transfer, and H200 MTP7.

-
vLLM4x/8x GB200 · 8x/16x H200Agentic · up to 1M context
+
vLLM8x/16x H200 · 4x/8x GB200Agentic · up to 1M context
Open recipe
@@ -129,43 +130,43 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor Open recipe
-
+

Kimi-K3

Moonshot / NVIDIA

Kimi-K3 recipes for vLLM on H200, GB200, and GB300, plus SGLang on GB200 and GB300.

-
vLLM · SGLangH200 · GB200 · GB300Day-0
+
SGLang · vLLMH200 · GB200 · GB300Day-0
Open recipe
-
+

Qwen3.8-2.4T-A95B

Qwen

vLLM and SGLang recipes for chat and agentic traffic on GB300 or GB200, aggregated or disaggregated, with KV-aware routing, MTP speculation, and FP8 weights/KV over MNNVL.

-
vLLM + SGLang16x GB300 · 16x GB200Chat + agentic · 262K context
+
vLLM + SGLang16x GB200 · 16x GB300Chat + agentic · 262K context
Open recipe
-
+

GLM-5.3/5.2

Z.AI / NVIDIA

SGLang recipes for long-context agentic traffic on B200 (NVFP4) or H200 (FP8), aggregated or disaggregated, with KV-aware routing, EAGLE MTP speculation, and HiCache CPU offload.

-
SGLang4x/12x B200 · 8x/16x H200Agentic · up to 500K context
+
SGLang8x/16x H200 · 4x/12x B200Agentic · up to 500K context
Open recipe
- +

Inkling NVFP4

Thinking Machines

Thinking Machines' first open-weights model — a multimodal MoE with controllable reasoning effort. vLLM GB300 targets serve agentic traffic at 1M context with MTP speculation and KV-aware routing, aggregated or disaggregated; the Day-0 SGLang B200 target adds image and audio input.

-
vLLM · SGLang8x GB300 / 8x B200Agentic · 1M contextText + image + audio
+
SGLang · vLLM8x GB300 / 8x B200Agentic · 1M contextText + image + audio
Open recipe
-
+

Kimi-K2.6

Moonshot / NVIDIA

@@ -174,7 +175,7 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
vLLM4x B200 / 8x H200Chat + agentic
Open recipe
-
+

Nemotron 3.5 Lightning

NVIDIA

@@ -183,7 +184,7 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
vLLM + TRT-LLM1-4x GPUAgentic · 1M context
Open recipe
-
+

Nemotron 3 Ultra

NVIDIA

@@ -192,7 +193,7 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
vLLM4x B200 / 8x H200Chat + agentic
Open recipe
-
+

Nemotron 3 Super

NVIDIA

@@ -210,7 +211,7 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
SGLang20x GB200Long output / static ISL-OSL
Open recipe
-
+

DeepSeek-V4-Pro

NVIDIA checkpoint / DeepSeek

@@ -219,7 +220,7 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
vLLM8–32x B200/H200Agentic
Open recipe
-
+

DeepSeek-V4-Pro-0813

DeepSeek

@@ -228,7 +229,7 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
vLLM8–16x GB200/H200Agentic1M ctx
Open recipe
-
+

DeepSeek-V4-Flash

NVIDIA checkpoint / DeepSeek

@@ -237,13 +238,13 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
vLLM4–28x B200/H200Agentic
Open recipe
-
+

GPT-OSS-120B

OpenAI

TensorRT-LLM GB200 targets for static traffic plus vLLM B200/H200 agentic targets (agg + disagg) with KV-aware routing and EAGLE3 speculative decoding.

-
TRT-LLM + vLLMGB200 · B200 · H200Static + agentic
+
TRT-LLM + vLLMH200 · B200 · GB200Static + agentic
Open recipe
@@ -255,7 +256,7 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
vLLM16x H200Multi-turn conversationRelated benchmark
Open recipe
-
+

Qwen3.5-122B-A10B

Qwen

@@ -264,7 +265,7 @@ Start with the model, runtime, and hardware you need to run. Model cards are sor
vLLM2-4x B200/H200Agentic trace replay
Open recipe
-
+

Qwen3-235B-A22B FP8

Qwen

diff --git a/docs/fern/pages/recipes/model-recipes/qwen-3-8-2-4t-a95b-fp8.mdx b/docs/fern/pages/recipes/model-recipes/qwen-3-8-2-4t-a95b-fp8.mdx index 452efe67eb59..129e10d0061f 100644 --- a/docs/fern/pages/recipes/model-recipes/qwen-3-8-2-4t-a95b-fp8.mdx +++ b/docs/fern/pages/recipes/model-recipes/qwen-3-8-2-4t-a95b-fp8.mdx @@ -16,10 +16,10 @@ Each target below is a Dynamo + vLLM or SGLang deployment of [Qwen3.8-2.4T-A95B]

Choose your deployment target

GPU - - + +
Topology @@ -30,10 +30,10 @@ Each target below is a Dynamo + vLLM or SGLang deployment of [Qwen3.8-2.4T-A95B]
Engine - - + +
Checkpoint Qwen/Qwen3.8-2.4T-A95B-FP8 diff --git a/docs/fern/pages/recipes/model-recipes/qwen3-235b-a22b-fp8.mdx b/docs/fern/pages/recipes/model-recipes/qwen3-235b-a22b-fp8.mdx index 399eab7055f2..15f37a49eea8 100644 --- a/docs/fern/pages/recipes/model-recipes/qwen3-235b-a22b-fp8.mdx +++ b/docs/fern/pages/recipes/model-recipes/qwen3-235b-a22b-fp8.mdx @@ -15,10 +15,10 @@ Each target below is a validated TensorRT-LLM deployment of Qwen3-235B-A22B-FP8

Choose your deployment target

GPU - - + +
Topology diff --git a/docs/fern/pages/recipes/model-recipes/qwen3-6-35b-a3b.mdx b/docs/fern/pages/recipes/model-recipes/qwen3-6-35b-a3b.mdx index 97e9b6811021..0b5920cf58fb 100644 --- a/docs/fern/pages/recipes/model-recipes/qwen3-6-35b-a3b.mdx +++ b/docs/fern/pages/recipes/model-recipes/qwen3-6-35b-a3b.mdx @@ -15,12 +15,12 @@ These aggregated recipes serve the agentic workload with `nvidia/Qwen3.6-35B-A3B

Choose your deployment target

GPU + + - -
Checkpoint nvidia/Qwen3.6-35B-A3B-NVFP4 From 9c70a961422cabb0ab248aa9eff8613a856c689c Mon Sep 17 00:00:00 2001 From: Sai Kiran Polisetty Date: Wed, 23 Sep 2026 04:47:15 +0530 Subject: [PATCH 165/191] fix(llm): echo Responses API request metadata (#15102) Signed-off-by: Sai Kiran Polisetty Co-authored-by: Ryan McCormick --- lib/llm/src/http/service/openai.rs | 1 + lib/llm/src/protocols/openai/responses/mod.rs | 3 +- .../openai/responses/stream_converter.rs | 3 +- lib/llm/tests/responses_http_replay.rs | 94 +++++++++++++++++++ 4 files changed, 98 insertions(+), 3 deletions(-) diff --git a/lib/llm/src/http/service/openai.rs b/lib/llm/src/http/service/openai.rs index 4ab8316685a5..1ae70b4df47a 100644 --- a/lib/llm/src/http/service/openai.rs +++ b/lib/llm/src/http/service/openai.rs @@ -4174,6 +4174,7 @@ async fn responses( temperature: request.inner.temperature, top_p: request.inner.top_p, max_output_tokens: request.inner.max_output_tokens, + metadata: request.inner.metadata.clone(), parallel_tool_calls: request.inner.parallel_tool_calls, store: request.inner.store, tools: request.inner.tools.clone(), diff --git a/lib/llm/src/protocols/openai/responses/mod.rs b/lib/llm/src/protocols/openai/responses/mod.rs index 54695018e96a..c1d8fbfb2bce 100644 --- a/lib/llm/src/protocols/openai/responses/mod.rs +++ b/lib/llm/src/protocols/openai/responses/mod.rs @@ -1036,6 +1036,7 @@ pub struct ResponseParams { pub temperature: Option, pub top_p: Option, pub max_output_tokens: Option, + pub metadata: Option>, pub parallel_tool_calls: Option, pub store: Option, pub tools: Option>, @@ -1312,7 +1313,7 @@ pub fn chat_completion_to_response( output, // Spec-required defaults (OpenResponses requires these as non-null) background: Some(false), - metadata: Some(HashMap::new()), + metadata: Some(params.metadata.clone().unwrap_or_default()), parallel_tool_calls: params.parallel_tool_calls.or(Some(true)), temperature: params.temperature.or(Some(1.0)), text: Some(params.text.clone().unwrap_or(ResponseTextParam { diff --git a/lib/llm/src/protocols/openai/responses/stream_converter.rs b/lib/llm/src/protocols/openai/responses/stream_converter.rs index 2efdf20d7db9..af072fa532c8 100644 --- a/lib/llm/src/protocols/openai/responses/stream_converter.rs +++ b/lib/llm/src/protocols/openai/responses/stream_converter.rs @@ -9,7 +9,6 @@ //! `response.output_text.done` -> `response.content_part.done` -> //! `response.output_item.done` -> `response.completed` -> `[DONE]` -use std::collections::HashMap; use std::time::{SystemTime, UNIX_EPOCH}; use axum::response::sse::Event; @@ -295,7 +294,7 @@ impl ResponseStreamConverter { output, // Echo request params with spec-required defaults for omitted fields background: Some(false), - metadata: Some(HashMap::new()), + metadata: Some(self.params.metadata.clone().unwrap_or_default()), parallel_tool_calls: self.params.parallel_tool_calls.or(Some(true)), temperature: self.params.temperature.or(Some(1.0)), text: Some(self.params.text.clone().unwrap_or(ResponseTextParam { diff --git a/lib/llm/tests/responses_http_replay.rs b/lib/llm/tests/responses_http_replay.rs index 99d54d8557d0..9a5df394676b 100644 --- a/lib/llm/tests/responses_http_replay.rs +++ b/lib/llm/tests/responses_http_replay.rs @@ -228,6 +228,100 @@ fn event_position(events: &[http_harness::JsonSseEvent], event_type: &str) -> us .unwrap_or_else(|| panic!("missing {event_type} event")) } +fn assert_streamed_response_metadata(events: &[http_harness::JsonSseEvent], expected: &Value) { + let response_events: Vec<_> = events + .iter() + .filter_map(|event| { + event + .data + .get("response") + .map(|response| (event.event.as_str(), response)) + }) + .collect(); + assert!( + !response_events.is_empty(), + "stream did not contain any response objects" + ); + for (event_type, response) in response_events { + assert_eq!( + &response["metadata"], expected, + "unexpected metadata in {event_type}" + ); + } +} + +#[tokio::test] +#[serial] +async fn request_metadata_is_preserved_for_unary_and_streaming_responses() { + temp_env::async_with_vars(ENV, async { + let script = load_agent_fixture("text.sse").await.unwrap(); + let svc = HarnessService::start(vec![script; 6]).await; + let metadata_cases = [ + ( + "populated", + Some(json!({ + "trace_id": "synthetic-123", + "tenant": "test" + })), + ), + ("explicitly empty", Some(json!({}))), + ("absent", None), + ]; + + for (case, request_metadata) in &metadata_cases { + for stream in [false, true] { + let mut body = json!({ + "model": MODEL, + "input": "Say hi.", + "stream": stream, + "max_output_tokens": 20, + }); + if let Some(metadata) = request_metadata { + body["metadata"] = metadata.clone(); + } + + let response = post_responses(&svc, &body).await; + assert_eq!( + response.status(), + reqwest::StatusCode::OK, + "unexpected status for {case} metadata with stream={stream}" + ); + let expected_response_metadata = + request_metadata.clone().unwrap_or_else(|| json!({})); + if stream { + let events = parse_json_sse(&response.text().await.unwrap()) + .await + .unwrap(); + assert_streamed_response_metadata(&events, &expected_response_metadata); + } else { + let response_body: Value = response.json().await.unwrap(); + assert_eq!( + response_body["metadata"], expected_response_metadata, + "unexpected metadata for {case} unary response" + ); + } + } + } + + let requests = svc.engine.take_requests().await; + assert_eq!(requests.len(), 6); + for (request, (_, expected_metadata)) in requests.iter().zip( + metadata_cases + .iter() + .flat_map(|metadata_case| [metadata_case, metadata_case]), + ) { + assert_eq!( + request.inner.metadata.as_ref(), + expected_metadata.as_ref(), + "translated request did not preserve metadata presence" + ); + } + assert_eq!(svc.engine.remaining_scripts().await, 0); + svc.shutdown().await; + }) + .await; +} + #[tokio::test] #[serial] async fn unary_text_baseline() { From 6e21a3a646308250fe9c6ba2f4775f6301884eb1 Mon Sep 17 00:00:00 2001 From: JulienDarve <86800349+JulienDarve@users.noreply.github.com> Date: Tue, 22 Sep 2026 17:13:33 -0700 Subject: [PATCH 166/191] fix(sidecar): register engine-reported vLLM KV block sizes (#14673) Signed-off-by: Julien Darve --- lib/mocker/servers/vllm/src/server.rs | 2 +- lib/sidecar/vllm/src/engine.rs | 5 +- lib/sidecar/vllm/src/model.rs | 35 ++++++++++++-- lib/sidecar/vllm/src/tests.rs | 66 +++++++++++++++++++++++++-- 4 files changed, 96 insertions(+), 12 deletions(-) diff --git a/lib/mocker/servers/vllm/src/server.rs b/lib/mocker/servers/vllm/src/server.rs index 3d344e541c0e..04be2c5f95e7 100644 --- a/lib/mocker/servers/vllm/src/server.rs +++ b/lib/mocker/servers/vllm/src/server.rs @@ -142,8 +142,8 @@ impl VllmMockerService { anyhow::anyhow!("max_num_batched_tokens exceeds the Control API range") })? .unwrap_or_default(), + effective_attention_block_size: Some(engine_args.block_size as u64), rl_capabilities: None, - ..Default::default() }; // The wire role is separate from the aggregated scheduler used to // emulate disaggregated requests. diff --git a/lib/sidecar/vllm/src/engine.rs b/lib/sidecar/vllm/src/engine.rs index 76675b442d7c..a37df6356569 100644 --- a/lib/sidecar/vllm/src/engine.rs +++ b/lib/sidecar/vllm/src/engine.rs @@ -153,7 +153,7 @@ impl VllmSidecarEngine { .sidecar .common .exclude_tools_when_tool_choice_none, - enable_kv_routing: true, + enable_kv_routing: !mode.is_encode(), disaggregation_mode: mode, route_to_encoder: args.sidecar.common.route_to_encoder, enable_rl, @@ -691,6 +691,7 @@ impl LLMEngine for VllmSidecarEngine { let (model, server) = client.discover(startup_deadline).await?; let observed = DiscoveredModel::from_proto(model, server)?; self.model.ensure_startup_compatible(&observed)?; + let engine_config = observed.engine_config(!self.mode.is_encode())?; let connection_count = client.connection_count(); self.client .set(client) @@ -703,7 +704,7 @@ impl LLMEngine for VllmSidecarEngine { mode = %self.mode, "vLLM gRPC services are ready" ); - Ok(observed.engine_config()) + Ok(engine_config) } async fn generate( diff --git a/lib/sidecar/vllm/src/model.rs b/lib/sidecar/vllm/src/model.rs index b5983f2d7460..c2f4d9c1c433 100644 --- a/lib/sidecar/vllm/src/model.rs +++ b/lib/sidecar/vllm/src/model.rs @@ -169,9 +169,17 @@ impl DiscoveredModel { .map_err(|error| client::protocol_error(error.to_string())) } - pub(crate) fn engine_config(&self) -> EngineConfig { + pub(crate) fn engine_config( + &self, + enable_kv_routing: bool, + ) -> Result { let parallelism = self.server.parallelism.as_ref(); - EngineConfig { + let kv_cache_block_size = if enable_kv_routing { + self.kv_cache_block_size()? + } else { + None + }; + Ok(EngineConfig { model: self.source.clone(), served_model_name: Some(self.served_name.clone()), model_aliases: self.identity.aliases.clone(), @@ -183,8 +191,10 @@ impl DiscoveredModel { .collect(), llm: Some(LlmRegistration { context_length: nonzero(self.server.max_model_len), - kv_cache_block_size: nonzero(self.server.kv_block_size), - total_kv_blocks: self.total_kv_blocks_per_rank(), + kv_cache_block_size, + total_kv_blocks: enable_kv_routing + .then(|| self.total_kv_blocks_per_rank()) + .flatten(), max_num_seqs: nonzero(self.server.max_running_requests), max_num_batched_tokens: nonzero(self.server.max_batched_tokens), max_gpu_lora_count: self.supports_lora().then_some(self.max_loras()), @@ -192,7 +202,22 @@ impl DiscoveredModel { data_parallel_start_rank: parallelism.map(|_| self.data_parallel_range.start), ..Default::default() }), - } + }) + } + + fn kv_cache_block_size(&self) -> Result, DynamoError> { + let Some(block_size) = self.server.effective_attention_block_size else { + return Ok(nonzero(self.server.kv_block_size)); + }; + let block_size = u32::try_from(block_size) + .ok() + .and_then(nonzero) + .ok_or_else(|| { + client::protocol_error(format!( + "invalid effective_attention_block_size {block_size}; KV routing requires a nonzero size that fits u32" + )) + })?; + Ok(Some(block_size)) } pub(crate) fn data_parallel_range(&self) -> &Range { diff --git a/lib/sidecar/vllm/src/tests.rs b/lib/sidecar/vllm/src/tests.rs index af29e5fe96a8..f5fe81ffce20 100644 --- a/lib/sidecar/vllm/src/tests.rs +++ b/lib/sidecar/vllm/src/tests.rs @@ -632,13 +632,15 @@ fn engine_config_advertises_supported_capabilities() { let model = DiscoveredModel::from_proto(model_info(), server_info()).expect("valid discovery"); assert!( !model - .engine_config() + .engine_config(true) + .expect("valid KV metadata") .runtime_data .contains_key("vllm_inference_v1_generate") ); assert_eq!( model - .engine_config() + .engine_config(true) + .expect("valid KV metadata") .runtime_data .get(dynamo_llm::lora::LORA_REQUIRES_REGISTRATION), Some(&json!(true)) @@ -1400,6 +1402,54 @@ fn discovery_rejects_nonzero_dp_start_without_local_size() { assert!(DiscoveredModel::from_proto(model_info(), server).is_err()); } +#[test] +fn engine_config_uses_effective_attention_block_size() { + for (case, dcp, physical, reported, expected) in [ + ("DCP=1", 1, 16, Some(16), Ok(Some(16))), + ("DCP=2", 2, 16, Some(32), Ok(Some(32))), + ("engine is authoritative", 2, 16, Some(64), Ok(Some(64))), + ("legacy DCP=1", 1, 16, None, Ok(Some(16))), + ("legacy DCP=2", 2, 16, None, Ok(Some(16))), + ("legacy unknown size", 1, 0, None, Ok(None)), + ("zero", 1, 16, Some(0), Err("nonzero size")), + ( + "overflow", + 1, + 16, + Some(u64::from(u32::MAX) + 1), + Err("fits u32"), + ), + ] { + let mut server = server_info(); + server + .parallelism + .as_mut() + .unwrap() + .decode_context_parallel_size = dcp; + server.kv_block_size = physical; + server.effective_attention_block_size = reported; + let model = DiscoveredModel::from_proto(model_info(), server).unwrap(); + let result = model.engine_config(true); + match expected { + Ok(size) => { + let registration = result.unwrap().llm.unwrap(); + assert_eq!(registration.kv_cache_block_size, size, "{case}"); + assert_eq!(registration.total_kv_blocks, Some(2048), "{case}"); + } + Err(message) => assert!(result.unwrap_err().to_string().contains(message), "{case}"), + } + let registration = model.engine_config(false).unwrap().llm.unwrap(); + assert_eq!( + registration.kv_cache_block_size, None, + "{case}: KV routing disabled" + ); + assert_eq!( + registration.total_kv_blocks, None, + "{case}: KV routing disabled" + ); + } +} + #[test] fn engine_config_normalizes_total_kv_blocks_per_dp_rank() { let mut server = server_info(); @@ -1412,7 +1462,11 @@ fn engine_config_normalizes_total_kv_blocks_per_dp_rank() { let model = DiscoveredModel::from_proto(model_info(), server).expect("valid discovery metadata"); - let registration = model.engine_config().llm.expect("LLM registration"); + let registration = model + .engine_config(true) + .expect("valid KV metadata") + .llm + .expect("LLM registration"); assert_eq!(registration.total_kv_blocks, Some(2048)); } @@ -1425,7 +1479,11 @@ fn engine_config_handles_zero_and_inexact_aggregate_kv_capacity() { let model = DiscoveredModel::from_proto(model_info(), server).expect("valid discovery metadata"); - let registration = model.engine_config().llm.expect("LLM registration"); + let registration = model + .engine_config(true) + .expect("valid KV metadata") + .llm + .expect("LLM registration"); assert_eq!( registration.total_kv_blocks, expected_per_rank_blocks, From dbca8daab2343d8264129615fde0723df87bb64b Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Tue, 22 Sep 2026 18:33:05 -0700 Subject: [PATCH 167/191] feat(vllm): forward preprocessed multimodal features (#14244) --- Cargo.lock | 2 + lib/bindings/python/Cargo.lock | 2 + lib/llm/src/http/service/generate.rs | 183 ++++--- lib/llm/src/protocols/common.rs | 21 + lib/llm/src/protocols/openai/generate.rs | 67 +++ lib/mocker/servers/vllm/src/server.rs | 2 +- lib/mocker/servers/vllm/tests/common/mod.rs | 7 +- lib/sidecar/vllm/Cargo.toml | 2 + lib/sidecar/vllm/README.md | 18 +- lib/sidecar/vllm/src/convert.rs | 457 ++++++++++++++-- lib/sidecar/vllm/src/engine.rs | 8 +- lib/sidecar/vllm/src/model.rs | 15 +- lib/sidecar/vllm/src/tests.rs | 552 +++++++++++++++++++- 13 files changed, 1199 insertions(+), 137 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d8aaf0bfd39b..78289466e00e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3188,6 +3188,7 @@ dependencies = [ "anyhow", "async-stream", "async-trait", + "base64 0.22.1", "clap", "dynamo-backend-common", "dynamo-llm", @@ -3195,6 +3196,7 @@ dependencies = [ "dynamo-sidecar-common", "futures", "prost-types 0.14.3", + "serde", "serde_json", "tempfile", "tokio", diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index 8d117a461fc3..6f8ff8c80676 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -2655,6 +2655,7 @@ dependencies = [ "anyhow", "async-stream", "async-trait", + "base64 0.22.1", "clap", "dynamo-backend-common", "dynamo-llm", @@ -2662,6 +2663,7 @@ dependencies = [ "dynamo-sidecar-common", "futures", "prost-types 0.14.4", + "serde", "serde_json", "tokio", "tokio-util", diff --git a/lib/llm/src/http/service/generate.rs b/lib/llm/src/http/service/generate.rs index 13224c8a86ea..cd340a6fc91e 100644 --- a/lib/llm/src/http/service/generate.rs +++ b/lib/llm/src/http/service/generate.rs @@ -20,6 +20,7 @@ use axum::{ response::{IntoResponse, Response}, routing::post, }; +use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64_STANDARD}; use dynamo_runtime::pipeline::{AsyncEngineContext, AsyncEngineContextProvider, Context}; use futures::StreamExt; use serde::Serialize; @@ -36,6 +37,7 @@ use super::openai::{ }; use super::{RouteDoc, service_v2}; use crate::local_model::runtime_config::VLLM_INFERENCE_V1_GENERATE_CAPABILITY; +use crate::protocols::common::preprocessed_mm_identifier; use crate::protocols::common::preprocessor::{MmRoutingInfo, PreprocessedRequest}; use crate::protocols::common::timing::RequestTracker; use crate::protocols::openai::generate::{ @@ -311,8 +313,9 @@ fn intersecting_mm_ranges<'a>( /// Build the routing-only token sequence used by vLLM KV events for multimodal /// prompts. The caller-provided `features` object remains opaque to execution; -/// this projection reads only the hashes and placeholder ranges required to -/// make request-side KV hashes match worker-side event hashes. +/// this projection derives content-bound identities from the inline kwargs and +/// combines them with placeholder ranges so request-side KV hashes match +/// worker-side event hashes. fn generate_mm_routing_info( request: &GenerateRequest, kv_cache_block_size: u32, @@ -337,10 +340,15 @@ fn generate_mm_routing_info( .get("mm_placeholders") .and_then(serde_json::Value::as_object) .ok_or("features.mm_placeholders must be a JSON object")?; + let kwargs_data = features + .get("kwargs_data") + .and_then(serde_json::Value::as_object) + .ok_or("features.kwargs_data must be a JSON object")?; if mm_hashes .keys() .chain(mm_placeholders.keys()) + .chain(kwargs_data.keys()) .any(|modality| modality != "image") { return Err("exact /generate MM routing currently supports image placeholders only"); @@ -349,28 +357,48 @@ fn generate_mm_routing_info( return Err("KV cache block size must be non-zero"); } - let (hashes, placeholders) = match (mm_hashes.get("image"), mm_placeholders.get("image")) { - (None, None) => return Ok(None), - (Some(hashes), Some(placeholders)) => ( + let (hashes, placeholders, kwargs) = match ( + mm_hashes.get("image"), + mm_placeholders.get("image"), + kwargs_data.get("image"), + ) { + (None, None, None) => return Ok(None), + (Some(hashes), Some(placeholders), Some(kwargs)) => ( hashes .as_array() .ok_or("features.mm_hashes.image must be an array")?, placeholders .as_array() .ok_or("features.mm_placeholders.image must be an array")?, + kwargs + .as_array() + .ok_or("features.kwargs_data.image must be an array")?, ), - _ => return Err("image hashes and placeholders must both be present"), + _ => return Err("image hashes, placeholders, and kwargs_data must all be present"), }; - if hashes.len() != placeholders.len() { - return Err("image hashes and placeholders must have equal lengths"); + if hashes.len() != placeholders.len() || hashes.len() != kwargs.len() { + return Err("image hashes, placeholders, and kwargs_data must have equal lengths"); } let mut ranges: Vec = Vec::with_capacity(hashes.len()); - for (hash, placeholder) in hashes.iter().zip(placeholders) { - let hash = hash + for ((producer_hash, placeholder), encoded_kwargs) in + hashes.iter().zip(placeholders).zip(kwargs) + { + producer_hash .as_str() - .and_then(dynamo_kv_router::protocols::hash_mm_identifier) + .filter(|hash| !hash.is_empty()) .ok_or("multimodal hashes must be non-empty strings")?; + let raw_kwargs = BASE64_STANDARD + .decode( + encoded_kwargs + .as_str() + .filter(|value| !value.is_empty()) + .ok_or("multimodal kwargs_data must contain non-empty base64 strings")?, + ) + .map_err(|_| "multimodal kwargs_data must contain valid base64")?; + let identifier = preprocessed_mm_identifier("image", &raw_kwargs); + let hash = dynamo_kv_router::protocols::hash_mm_identifier(&identifier) + .ok_or("content-derived multimodal identifier must not be empty")?; let placeholder = placeholder .as_object() .ok_or("multimodal placeholders must be JSON objects")?; @@ -594,14 +622,13 @@ fn preprocessed_from_generate_with_tracker( .project_output_options() .map_err(anyhow::Error::msg)?; let routing_priority = dynamo_routing_priority(request.priority); - // With vLLM's default `enable_tower_connector_lora=false`, MM identifiers - // are adapter-invariant and `lora_name` separately salts LM KV hashes. When - // tower/connector LoRA is enabled for an adapter request, fall back to - // token-only routing because vLLM scopes the MM identity by that adapter. - let mm_routing = if tower_connector_lora_enabled && lora_name.is_some() { + // The sidecar protocol does not expose whether tower/connector LoRA is + // active, so conservatively treat every adapter's MM identity as scoped. + let mm_routing = if lora_name.is_some() { tracing::debug!( target: "mm_routing", - "tower/connector LoRA is active; using token-only multimodal routing" + tower_connector_lora_enabled, + "LoRA request uses token-only multimodal routing" ); None } else { @@ -1908,7 +1935,7 @@ pub(crate) mod tests { {"offset": 2, "length": 3}, {"offset": 7, "length": 2} ]}, - "kwargs_data": {"image": ["opaque-a", "opaque-b"]} + "kwargs_data": {"image": ["b3BhcXVlLWE=", "b3BhcXVlLWI="]} } }); let request: GenerateRequest = @@ -1923,8 +1950,18 @@ pub(crate) mod tests { ) .expect("build request"); - let pad_a = dynamo_kv_router::protocols::pad_value_for_mm_hash(0xaaaaaaaaaaaaaaaa); - let pad_b = dynamo_kv_router::protocols::pad_value_for_mm_hash(0xbbbbbbbbbbbbbbbb); + let hash_a = dynamo_kv_router::protocols::hash_mm_identifier(&preprocessed_mm_identifier( + "image", + b"opaque-a", + )) + .expect("content-derived hash"); + let hash_b = dynamo_kv_router::protocols::hash_mm_identifier(&preprocessed_mm_identifier( + "image", + b"opaque-b", + )) + .expect("content-derived hash"); + let pad_a = dynamo_kv_router::protocols::pad_value_for_mm_hash(hash_a); + let pad_b = dynamo_kv_router::protocols::pad_value_for_mm_hash(hash_b); let mm = preprocessed .mm_routing_info .as_ref() @@ -1952,49 +1989,40 @@ pub(crate) mod tests { .as_ref() .and_then(|extra| extra.get("dynamo_mm_routing_hashes")), Some(&serde_json::json!([ - format!("{}{}", "a".repeat(16), "0".repeat(48)), - format!("{}{}", "b".repeat(16), "0".repeat(48)) + crate::protocols::common::preprocessed_mm_routing_hash("image", b"opaque-a"), + crate::protocols::common::preprocessed_mm_routing_hash("image", b"opaque-b") ])) ); // A frontend-approved, marker-form hash must produce the same KV hash - // on the request and event paths, including ordinary language-only LoRA. + // on the request and event paths. let mm_identifier = "1234567890abcdef".repeat(4); let request: GenerateRequest = serde_json::from_value(serde_json::json!({ "token_ids": [10, 99, 99, 20], "sampling_params": {}, "features": { "mm_hashes": {"image": [mm_identifier.clone()]}, - "mm_placeholders": {"image": [{"offset": 1, "length": 2}]} + "mm_placeholders": {"image": [{"offset": 1, "length": 2}]}, + "kwargs_data": {"image": ["cm91dGluZy1h"]} } })) .expect("deserialize request"); let preprocessed = preprocessed_from_generate( request, - "adapter-a", + "test-model", None, "resolved-request", - routing_metadata(4, false, Some("adapter-a")), + routing_metadata(4, false, None), ) - .expect("build LoRA request"); + .expect("build request"); let routing = preprocessed .mm_routing_info .as_ref() - .expect("language-only LoRA keeps exact MM routing"); - assert_eq!( - preprocessed - .routing - .as_ref() - .and_then(|routing| routing.lora_name.as_deref()), - Some("adapter-a") - ); + .expect("base request keeps exact MM routing"); let request_hashes = dynamo_kv_router::protocols::compute_block_hash_for_seq( &routing.routing_token_ids, 4, - dynamo_kv_router::protocols::BlockHashOptions { - lora_name: Some("adapter-a"), - ..Default::default() - }, + dynamo_kv_router::protocols::BlockHashOptions::default(), ); let marked_identifier = preprocessed .extra_args @@ -2022,7 +2050,6 @@ pub(crate) mod tests { 7, &[10, 99, 99, 20], dynamo_kv_router::zmq_wire::StoredBlockOptions { - lora_name: Some("adapter-a"), mm_extra_info: Some(event_mm_info), image_token_id: Some(99), ..Default::default() @@ -2044,15 +2071,18 @@ pub(crate) mod tests { "offset": 1, "length": 3, "is_embed": [true, false, true] - }]} + }]}, + "kwargs_data": {"image": ["c3BhcnNl"]} } })) .expect("deserialize request"); let routing = generate_mm_routing_info(&request, 5) .expect("valid sparse MM routing metadata") .expect("MM routing projection"); - let mm_hash = dynamo_kv_router::protocols::hash_mm_identifier(mm_identifier) - .expect("non-empty identifier"); + let mm_hash = dynamo_kv_router::protocols::hash_mm_identifier(&preprocessed_mm_identifier( + "image", b"sparse", + )) + .expect("content-derived identifier"); let pad = dynamo_kv_router::protocols::pad_value_for_mm_hash(mm_hash); assert_eq!(routing.info.routing_token_ids, vec![10, pad, 42, pad, 20]); @@ -2062,7 +2092,8 @@ pub(crate) mod tests { serde_json::json!([10, 99, 42, 99, 20]), serde_json::json!({ "mm_hashes": {"image": ["image-0"]}, - "mm_placeholders": {"image": [{"offset": 1, "length": 3}]} + "mm_placeholders": {"image": [{"offset": 1, "length": 3}]}, + "kwargs_data": {"image": ["c3BhcnNl"]} }), "mixed multimodal placeholder spans require is_embed", ), @@ -2071,7 +2102,8 @@ pub(crate) mod tests { serde_json::json!([99, 10, 99, 99, 20]), serde_json::json!({ "mm_hashes": {"image": ["image-0"]}, - "mm_placeholders": {"image": [{"offset": 2, "length": 2}]} + "mm_placeholders": {"image": [{"offset": 2, "length": 2}]}, + "kwargs_data": {"image": ["c3BhcnNl"]} }), "image tokens must be covered by multimodal placeholder ranges", ), @@ -2083,7 +2115,8 @@ pub(crate) mod tests { "mm_placeholders": {"image": [ {"offset": 1, "length": 3, "is_embed": [true, false, true]}, {"offset": 5, "length": 1} - ]} + ]}, + "kwargs_data": {"image": ["c3BhcnNlLWE=", "c3BhcnNlLWI="]} }), "sparse multimodal layout cannot be normalized exactly by worker events", ), @@ -2218,7 +2251,8 @@ pub(crate) mod tests { "sampling_params": {}, "features": { "mm_hashes": {"image": ["image-0"]}, - "mm_placeholders": {"image": [{"offset": 1, "length": 2}]} + "mm_placeholders": {"image": [{"offset": 1, "length": 2}]}, + "kwargs_data": {"image": ["YmFzZS1pbWFnZQ=="]} } }); let base_request: GenerateRequest = @@ -2236,30 +2270,39 @@ pub(crate) mod tests { "the worker setting alone does not activate adapter-scoped MM identity" ); - let adapter_request: GenerateRequest = - serde_json::from_value(raw.clone()).expect("deserialize adapter request"); - let adapter = preprocessed_from_generate( - adapter_request, - "adapter-a", - None, - "resolved-request", - routing_metadata(4, true, Some("adapter-a")), - ) - .expect("build adapter request"); - assert!(adapter.mm_routing_info.is_none()); - assert_eq!( - adapter - .routing + for tower_connector_lora_enabled in [false, true] { + let adapter_request: GenerateRequest = + serde_json::from_value(raw.clone()).expect("deserialize adapter request"); + let adapter = preprocessed_from_generate( + adapter_request, + "adapter-a", + None, + "resolved-request", + routing_metadata(4, tower_connector_lora_enabled, Some("adapter-a")), + ) + .expect("build adapter request"); + assert!(adapter.mm_routing_info.is_none()); + assert_eq!( + adapter + .routing + .as_ref() + .and_then(|routing| routing.lora_name.as_deref()), + Some("adapter-a") + ); + assert!( + adapter + .extra_args + .as_ref() + .and_then(|extra| extra.get("dynamo_mm_routing_hashes")) + .is_none() + ); + let envelope = adapter + .extra_args .as_ref() - .and_then(|routing| routing.lora_name.as_deref()), - Some("adapter-a") - ); - let envelope = adapter - .extra_args - .as_ref() - .and_then(|extra| extra.get("vllm_tito")) - .expect("vllm_tito envelope"); - assert_eq!(envelope["features"], raw["features"]); + .and_then(|extra| extra.get("vllm_tito")) + .expect("vllm_tito envelope"); + assert_eq!(envelope["features"], raw["features"]); + } } #[test] diff --git a/lib/llm/src/protocols/common.rs b/lib/llm/src/protocols/common.rs index c36d6bef9045..981907f360e5 100644 --- a/lib/llm/src/protocols/common.rs +++ b/lib/llm/src/protocols/common.rs @@ -17,12 +17,33 @@ use anyhow::Result; use derive_builder::Builder; use dynamo_runtime::error::{DynamoError, ErrorType}; use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; use super::TokenIdType; use dynamo_protocols::types::StopReason; /// Maximum nesting depth allowed in guided_grammar EBNF strings. const MAX_GRAMMAR_NESTING_DEPTH: usize = 500; +const PREPROCESSED_MM_ID_DOMAIN: &[u8] = b"vllm.grpc.preprocessed-mm.v1"; + +/// Return a content-bound identity shared by frontend routing and vLLM workers. +pub fn preprocessed_mm_identifier(modality: &str, raw_kwargs: &[u8]) -> String { + let mut hasher = Sha256::new(); + hasher.update(PREPROCESSED_MM_ID_DOMAIN); + hasher.update((modality.len() as u64).to_be_bytes()); + hasher.update(modality.as_bytes()); + hasher.update((raw_kwargs.len() as u64).to_be_bytes()); + hasher.update(raw_kwargs); + format!("grpc-mm:{:x}", hasher.finalize()) +} + +/// Return the KV-event marker for a content-bound preprocessed-media identity. +pub fn preprocessed_mm_routing_hash(modality: &str, raw_kwargs: &[u8]) -> String { + let identifier = preprocessed_mm_identifier(modality, raw_kwargs); + let hash = dynamo_kv_router::protocols::hash_mm_identifier(&identifier) + .expect("content-derived multimodal identity is non-empty"); + dynamo_kv_router::zmq_wire::mark_mm_hash_for_extra_key(hash) +} pub(crate) fn invalid_argument_error(message: impl Into) -> anyhow::Error { let message = message.into(); diff --git a/lib/llm/src/protocols/openai/generate.rs b/lib/llm/src/protocols/openai/generate.rs index 97411fefaa07..d6c7f47a3447 100644 --- a/lib/llm/src/protocols/openai/generate.rs +++ b/lib/llm/src/protocols/openai/generate.rs @@ -379,6 +379,8 @@ pub struct GenerateResponseChoice { pub finish_reason: Option, pub routed_experts: Option, + + pub sampling_mask: Option>>, } /// Token-in/token-out generation response. @@ -407,6 +409,7 @@ struct GenerateChoiceAcc { logprobs: Option>, finish_reason: Option, routed_experts: Option, + sampling_mask: Option>>, } impl GenerateChoiceAcc { @@ -461,6 +464,7 @@ impl GenerateChoiceAcc { logprobs, finish_reason, routed_experts, + sampling_mask, } = self; let logprobs = if options.include_logprobs { let content = logprobs.ok_or_else(|| { @@ -479,12 +483,22 @@ impl GenerateChoiceAcc { None }; + if let Some(rows) = sampling_mask.as_ref() { + anyhow::ensure!( + rows.len() == token_ids.len(), + "generate choice {index} returned {} sampling-mask positions for {} tokens", + rows.len(), + token_ids.len() + ); + } + Ok(GenerateResponseChoice { index, token_ids: Some(token_ids), logprobs, finish_reason, routed_experts, + sampling_mask, }) } } @@ -627,6 +641,7 @@ impl GenerateAggregator { logprobs: None, finish_reason: None, routed_experts: None, + sampling_mask: None, }); if let Some(engine_data) = output.engine_data.as_ref() { if let Some(routed_experts) = engine_data.get("routed_experts") { @@ -636,6 +651,13 @@ impl GenerateAggregator { })?, ); } + if let Some(sampling_mask) = engine_data.get("sampling_mask") { + choice.sampling_mask = Some( + serde_json::from_value(sampling_mask.clone()).map_err(|error| { + anyhow::anyhow!("invalid generate sampling_mask payload: {error}") + })?, + ); + } if let Some(kv_transfer_params) = engine_data.get("kv_transfer_params") { self.kv_transfer_params = Some(kv_transfer_params.clone()); self.kv_transfer_params_from_engine_data = true; @@ -962,6 +984,7 @@ mod tests { logprobs: None, finish_reason: None, routed_experts: None, + sampling_mask: None, }], prompt_logprobs: None, kv_transfer_params: None, @@ -976,6 +999,7 @@ mod tests { assert_eq!(value["kv_transfer_params"], Value::Null); assert_eq!(value["choices"][0]["token_ids"], Value::Null); assert_eq!(value["choices"][0]["logprobs"], Value::Null); + assert_eq!(value["choices"][0]["sampling_mask"], Value::Null); assert_eq!(value["choices"][0]["finish_reason"], Value::Null); assert_eq!(value["choices"][0]["routed_experts"], Value::Null); @@ -1148,6 +1172,7 @@ mod tests { finish_reason: Some(crate::protocols::common::FinishReason::Length), engine_data: Some(json!({ "routed_experts": "encoded-experts", + "sampling_mask": [[7, 11], [13, 17, 19]], "kv_transfer_params": {"connector": "x"} })), ..Default::default() @@ -1173,6 +1198,10 @@ mod tests { response.choices[0].routed_experts.as_deref(), Some("encoded-experts") ); + assert_eq!( + response.choices[0].sampling_mask, + Some(vec![vec![7, 11], vec![13, 17, 19]]) + ); let logprobs = response.choices[0] .logprobs .as_ref() @@ -1266,6 +1295,44 @@ mod tests { ); } + #[tokio::test] + async fn generate_response_rejects_malformed_sampling_mask() { + let stream = futures::stream::iter([Annotated::from_data(LLMEngineOutput { + token_ids: vec![100], + index: Some(0), + finish_reason: Some(crate::protocols::common::FinishReason::Stop), + engine_data: Some(json!({"sampling_mask": "invalid"})), + ..Default::default() + })]); + + let error = GenerateResponse::from_annotated_stream(stream, "req-mask".to_string()) + .await + .expect_err("malformed sampling mask must fail"); + + assert!( + error + .to_string() + .contains("invalid generate sampling_mask payload") + ); + } + + #[tokio::test] + async fn generate_response_rejects_sampling_mask_length_mismatch() { + let stream = futures::stream::iter([Annotated::from_data(LLMEngineOutput { + token_ids: vec![100], + index: Some(0), + finish_reason: Some(crate::protocols::common::FinishReason::Stop), + engine_data: Some(json!({"sampling_mask": [[1], [2]]})), + ..Default::default() + })]); + + let error = GenerateResponse::from_annotated_stream(stream, "req-mask".to_string()) + .await + .expect_err("misaligned sampling mask must fail"); + + assert!(error.to_string().contains("sampling-mask positions")); + } + #[tokio::test] async fn generate_response_uses_terminal_kv_transfer_fallback() { let stream = futures::stream::iter([Annotated::from_data(LLMEngineOutput { diff --git a/lib/mocker/servers/vllm/src/server.rs b/lib/mocker/servers/vllm/src/server.rs index 04be2c5f95e7..9baef04c92bd 100644 --- a/lib/mocker/servers/vllm/src/server.rs +++ b/lib/mocker/servers/vllm/src/server.rs @@ -113,10 +113,10 @@ impl VllmMockerService { tensor_parallel_size: 1, pipeline_parallel_size: 1, data_parallel_size: engine_args.dp_size, + data_parallel_size_local: engine_args.dp_size, data_parallel_rank: DP_RANK, decode_context_parallel_size: 1, world_size: 1, - ..Default::default() }), max_model_len: engine_args .max_model_len diff --git a/lib/mocker/servers/vllm/tests/common/mod.rs b/lib/mocker/servers/vllm/tests/common/mod.rs index 358f86e06d01..b265cd2f7f0c 100644 --- a/lib/mocker/servers/vllm/tests/common/mod.rs +++ b/lib/mocker/servers/vllm/tests/common/mod.rs @@ -7,7 +7,7 @@ use std::sync::Arc; use std::time::Duration; use dynamo_backend_common::{ - GenerateContext, KvEventSource, LLMEngine, PreprocessedRequest, StopConditions, + GenerateContext, KvEventSource, LLMEngine, PreprocessedRequest, SamplingOptions, StopConditions, }; use dynamo_kv_router::indexer::{KvIndexerInterface, KvIndexerMetrics, LocalKvIndexer}; use dynamo_kv_router::protocols::{ @@ -23,7 +23,10 @@ async fn generate(engine: &impl LLMEngine, tokens: Vec) { let request = PreprocessedRequest::builder() .model("mocker-model".to_string()) .token_ids(tokens) - .sampling_options(Default::default()) + .sampling_options(SamplingOptions { + temperature: Some(0.0), + ..Default::default() + }) .output_options(Default::default()) .stop_conditions(StopConditions { max_tokens: Some(1), diff --git a/lib/sidecar/vllm/Cargo.toml b/lib/sidecar/vllm/Cargo.toml index ac46a114436a..cbf5122d42b3 100644 --- a/lib/sidecar/vllm/Cargo.toml +++ b/lib/sidecar/vllm/Cargo.toml @@ -24,8 +24,10 @@ dynamo-sidecar-common = { workspace = true, features = ["tonic-v14"] } anyhow = { workspace = true } async-stream = { workspace = true } async-trait = { workspace = true } +base64 = "0.22" clap = { version = "4", features = ["derive", "env"] } futures = { workspace = true } +serde = { workspace = true } serde_json = { workspace = true } tokio = { workspace = true } tokio-util = { workspace = true } diff --git a/lib/sidecar/vllm/README.md b/lib/sidecar/vllm/README.md index 284c1de19736..e2cae9709283 100644 --- a/lib/sidecar/vllm/README.md +++ b/lib/sidecar/vllm/README.md @@ -37,12 +37,13 @@ It is a standalone Rust executable and is also compiled into - Data-parallel rank routing and KV-event source discovery - Capability-gated RL pause/resume, sleep/wake, weight-transfer, and weight-version controls through native gRPC - Image, video, and audio URL and data-URI inputs; cache UUIDs remain image-only +- Preprocessed image features with dense placeholders, plus sparse placeholders when the renderer preserves `is_embed`. Sparse layouts such as Nemotron-H Omni require a vLLM revision containing [vllm-project/vllm#54548](https://github.com/vllm-project/vllm/pull/54548) on Python renderer round-trips. - Dynamic LoRA load, unload, list, discovery, and request selection when vLLM enables LoRA - Opaque encoder-cache handoff through vLLM `ec_transfer_params` Audio and video gRPC inputs are not available in vLLM `0.28.0`. They require a later vLLM release. -The sidecar does not support beam search, `n > 1`, or Dynamo tool-call and reasoning parsers. The sidecar does not support `input_audio`, `file://` media, `use_audio_in_video` or other `mm_processor_kwargs`, preprocessed multimodal features, decoded RDMA media, UUID-only media, or audio/video cache UUIDs. Encoder disaggregation is image-only in this release. Direct vLLM gRPC callers can send raw media bytes, but Dynamo's current `MultimodalData` representation cannot. Parser defaults returned by Control are intentionally not advertised to the Dynamo frontend because the current inference protocol does not preserve all parser-related request semantics. +The sidecar does not support beam search, `n > 1`, or Dynamo tool-call and reasoning parsers. The sidecar does not support `input_audio`, `file://` media, `use_audio_in_video` or other `mm_processor_kwargs`, decoded RDMA media, UUID-only media, or audio/video cache UUIDs. Encoder disaggregation is image-only in this release. The Dynamo frontend accepts inline media through OpenAI-compatible `data:` URLs; it does not expose a separate raw-byte media variant. Parser defaults returned by Control are intentionally not advertised to the Dynamo frontend because the current inference protocol does not preserve all parser-related request semantics. In prefill/decode deployments, both engines independently prepare the original media. Reusing only the prefill-expanded prompt IDs is insufficient because KV transfer does not carry model-specific multimodal position metadata. @@ -120,18 +121,9 @@ to that port to trusted consumers because KV events contain request token IDs. ### Native Generate compatibility -`vllm-proto 0.3.0` does not include the native sampling JSON extension proposed -in [vLLM #56421](https://github.com/vllm-project/vllm/pull/56421). The sidecar -therefore does not advertise `vllm_inference_v1_generate`. Aggregated and decode -requests from v1.4 frontends can still use the legacy -`extra_args.vllm_tito.sampling_params` envelope for controls already preserved -in the typed request: `max_tokens`, `min_tokens`, `ignore_eos`, `logprobs`, -`prompt_logprobs`, and `skip_special_tokens`. Other sampling settings fail -with an explicit unsupported-request error. -Use the chat/completions APIs with the supported typed controls instead. -Prefill and encode still use their canonical one-token request; they do not -apply decode sampling JSON. Native Generate can be enabled after an upstream -protocol release includes both the payload and its capability flag. +`vllm-proto 0.3.0` does not include the native sampling JSON extension proposed in [vLLM #56421](https://github.com/vllm-project/vllm/pull/56421), so the sidecar projects typed controls into the gRPC request and advertises `vllm_inference_v1_generate`. During rolling upgrades, v1.4 frontends can supply the legacy `extra_args.vllm_tito.sampling_params` envelope; canonical typed fields take precedence when both are present. Requests that rely on distinctions proto 0.3 cannot represent, such as explicit `top_k=0`, `top_k=-1`, or `min_p=0`, fail explicitly instead of silently changing sampling behavior. + +Prefill and encode use their canonical one-token request and do not apply decode sampling controls. ### Runtime compatibility diff --git a/lib/sidecar/vllm/src/convert.rs b/lib/sidecar/vllm/src/convert.rs index 103c28dabec9..21fafe0d701f 100644 --- a/lib/sidecar/vllm/src/convert.rs +++ b/lib/sidecar/vllm/src/convert.rs @@ -1,12 +1,15 @@ // SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -use std::sync::Arc; +use std::{collections::BTreeMap, sync::Arc}; +use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64_STANDARD}; use dynamo_backend_common::{ DisaggregationMode, DynamoError, GuidedDecodingOptions, LLMEngineOutput, MultimodalData, PrefillResult, PreprocessedRequest, StopReason, TopLogprob, usage, }; +use dynamo_llm::protocols::common::{preprocessed_mm_identifier, preprocessed_mm_routing_hash}; +use serde::{Deserialize, de::DeserializeOwned}; use crate::client; use crate::json::{json_to_struct, struct_to_json}; @@ -21,6 +24,49 @@ const AUDIO_URL_KEY: &str = "audio_url"; // Must match DYNAMO_CACHE_SALT_PREFIX in lib/kv-router/src/zmq_wire/extra_keys.rs. const DYNAMO_CACHE_SALT_PREFIX: &str = "dynamo-cache-salt:"; +const MAX_PREPROCESSED_MM_BYTES: usize = 16 * 1024 * 1024; + +#[derive(Debug, Deserialize)] +#[serde(deny_unknown_fields)] +struct VllmTitoFeatures { + mm_hashes: BTreeMap>, + mm_placeholders: BTreeMap>, + kwargs_data: BTreeMap>, + #[serde(default, rename = "mm_metadata")] + _mm_metadata: Option, +} + +#[derive(Debug, Deserialize)] +#[serde(deny_unknown_fields)] +struct VllmTitoPlaceholder { + offset: u64, + length: u64, + #[serde(default)] + is_embed: Option>, +} + +fn request_has_raw_media(request: &PreprocessedRequest) -> bool { + request + .multi_modal_data + .as_ref() + .is_some_and(|media| media.values().any(|items| !items.is_empty())) +} + +fn request_has_preprocessed_media(request: &PreprocessedRequest) -> bool { + request + .extra_args + .as_ref() + .and_then(serde_json::Value::as_object) + .and_then(|extra| extra.get("vllm_tito")) + .and_then(serde_json::Value::as_object) + .and_then(|envelope| envelope.get("features")) + .is_some_and(|features| !features.is_null()) +} + +pub(crate) fn request_has_multimodal_input(request: &PreprocessedRequest) -> bool { + request_has_raw_media(request) || request_has_preprocessed_media(request) +} + pub(crate) fn build_generate_request( request: PreprocessedRequest, request_id: String, @@ -33,43 +79,69 @@ pub(crate) fn build_generate_request( if !mode.is_prefill() && !mode.is_encode() && let Some(sampling) = vllm_tito_sampling(&request.extra_args)? - && let Some(key) = sampling.keys().find(|key| { + { + if legacy_bool(sampling, "return_token_ids")? == Some(false) { + return Err(client::invalid_argument( + "extra_args.vllm_tito.sampling_params.return_token_ids must be true for vLLM gRPC", + )); + } + if let Some(key) = sampling.keys().find(|key| { !matches!( key.as_str(), - "max_tokens" + "temperature" + | "top_p" + | "top_k" + | "seed" + | "max_tokens" | "min_tokens" + | "min_p" + | "frequency_penalty" + | "presence_penalty" + | "repetition_penalty" + | "stop_token_ids" | "ignore_eos" | "logprobs" | "prompt_logprobs" | "skip_special_tokens" + | "return_token_ids" + | "skip_reading_prefix_cache" ) - }) - { - return Err(client::invalid_argument(format!( - "extra_args.vllm_tito.sampling_params.{key} is not supported by the sidecar; use the chat/completions API" - ))); + }) { + return Err(client::invalid_argument(format!( + "extra_args.vllm_tito.sampling_params.{key} is not supported by the sidecar; use the chat/completions API" + ))); + } } - let has_media = request - .multi_modal_data - .as_ref() - .is_some_and(|media| media.values().any(|items| !items.is_empty())); - // Decode receives prompt KV from prefill, but vLLM still needs the original - // media metadata to initialize model-specific multimodal positions (for - // example Qwen-VL mRoPE). A full KV hit prevents duplicate prompt compute. + let has_raw_media = request_has_raw_media(&request); + let has_preprocessed_media = request_has_preprocessed_media(&request); + let has_raw_media_metadata = has_raw_media + || request + .multi_modal_uuids + .as_ref() + .is_some_and(|uuids| uuids.values().any(|items| !items.is_empty())); + if has_raw_media && has_preprocessed_media { + return Err(client::invalid_argument( + "raw multimodal data and preprocessed features cannot be mixed", + )); + } + let has_media = has_raw_media || has_preprocessed_media; let has_images = request .multi_modal_data .as_ref() .and_then(|media| media.get(IMAGE_URL_KEY)) .is_some_and(|items| !items.is_empty()); - // Each engine must prepare multimodal inputs independently so model-specific - // position metadata matches the transferred KV state. let forwarded_image_uuids = if has_images { forwarded_image_uuids(&request)? } else { None }; - let media = build_media(&request, forwarded_image_uuids.as_deref())?; + let raw_media = if has_raw_media_metadata { + build_media(&request, forwarded_image_uuids.as_deref())? + } else { + Vec::new() + }; + let prompt_token_count = request.token_ids.len(); let mut prefill_result = request.prefill_result; let token_ids = Arc::unwrap_or_clone(request.token_ids); if mode.is_decode() && has_media { @@ -110,7 +182,32 @@ pub(crate) fn build_generate_request( let stop_conditions = request.stop_conditions; let encoder_result = request.encoder_result; let mut extra_args = request.extra_args; - consume_vllm_tito(&mut extra_args)?; + let features = consume_vllm_tito(&mut extra_args)?; + let routing_hashes = consume_preprocessed_mm_routing_hashes(&mut extra_args)?; + if features.is_none() && routing_hashes.is_some() { + return Err(client::invalid_argument( + "dynamo_mm_routing_hashes requires preprocessed multimodal features", + )); + } + let media = if let Some(features) = features { + build_preprocessed_media( + features, + prompt_token_count, + routing_hashes.as_deref(), + &lora_name, + )? + } else { + raw_media + }; + if mode.is_encode() + && media + .iter() + .any(|item| item.modality() != pb::Modality::Image) + { + return Err(client::invalid_argument( + "encode requests support image media only", + )); + } consume_redundant_nvext(&mut extra_args, cache_salt.as_deref())?; if has_media && let Some(serde_json::Value::Object(extra)) = extra_args.as_mut() { // These fields are already represented by token_ids and media. @@ -126,7 +223,7 @@ pub(crate) fn build_generate_request( prompt: Some(pb::generate_request::Prompt::TokenIds(pb::TokenIds { ids: token_ids, })), - temperature: sampling.temperature, + temperature: sampling.temperature.or(Some(1.0)), sampling: Some(pb::RandomSampling { num_sequences: 1, top_k: normalize_top_k(sampling.top_k)?, @@ -200,6 +297,55 @@ pub(crate) fn normalize_response_options( .and_then(serde_json::Value::as_object) .and_then(|envelope| envelope.get("kv_transfer_params")) .cloned(); + let legacy_skip_prefix_cache = legacy_bool(&sampling, "skip_reading_prefix_cache")?; + hydrate_option( + &mut request.sampling_options.temperature, + &sampling, + "temperature", + )?; + hydrate_option(&mut request.sampling_options.top_p, &sampling, "top_p")?; + hydrate_option(&mut request.sampling_options.top_k, &sampling, "top_k")?; + hydrate_option(&mut request.sampling_options.min_p, &sampling, "min_p")?; + hydrate_option(&mut request.sampling_options.seed, &sampling, "seed")?; + hydrate_option( + &mut request.sampling_options.presence_penalty, + &sampling, + "presence_penalty", + )?; + hydrate_option( + &mut request.sampling_options.frequency_penalty, + &sampling, + "frequency_penalty", + )?; + hydrate_option( + &mut request.sampling_options.repetition_penalty, + &sampling, + "repetition_penalty", + )?; + hydrate_option( + &mut request.stop_conditions.max_tokens, + &sampling, + "max_tokens", + )?; + hydrate_option( + &mut request.stop_conditions.min_tokens, + &sampling, + "min_tokens", + )?; + if request.stop_conditions.stop_token_ids.is_none() + && request.stop_conditions.stop_token_ids_hidden.is_none() + { + hydrate_option( + &mut request.stop_conditions.stop_token_ids, + &sampling, + "stop_token_ids", + )?; + } + hydrate_option( + &mut request.stop_conditions.ignore_eos, + &sampling, + "ignore_eos", + )?; if request.output_options.logprobs.is_none() { request.output_options.logprobs = legacy_logprob_count(&sampling, "logprobs")?; } @@ -219,9 +365,40 @@ pub(crate) fn normalize_response_options( { extra.insert("kv_transfer_params".to_string(), legacy_kv_transfer); } + if let Some(legacy_skip_prefix_cache) = legacy_skip_prefix_cache + && let Some(extra) = request + .extra_args + .as_mut() + .and_then(serde_json::Value::as_object_mut) + && !extra.contains_key("skip_reading_prefix_cache") + { + extra.insert( + "skip_reading_prefix_cache".to_string(), + serde_json::Value::Bool(legacy_skip_prefix_cache), + ); + } Ok(request) } +fn hydrate_option( + target: &mut Option, + sampling: &serde_json::Map, + field: &str, +) -> Result<(), DynamoError> { + if target.is_some() { + return Ok(()); + } + let Some(value) = sampling.get(field).filter(|value| !value.is_null()) else { + return Ok(()); + }; + *target = Some(serde_json::from_value(value.clone()).map_err(|error| { + client::invalid_argument(format!( + "extra_args.vllm_tito.sampling_params.{field} is invalid: {error}" + )) + })?); + Ok(()) +} + fn vllm_tito_sampling( extra_args: &Option, ) -> Result>, DynamoError> { @@ -280,20 +457,22 @@ fn legacy_logprob_count( } } -fn consume_vllm_tito(extra_args: &mut Option) -> Result<(), DynamoError> { +fn consume_vllm_tito( + extra_args: &mut Option, +) -> Result, DynamoError> { let Some(serde_json::Value::Object(extra)) = extra_args.as_mut() else { - return Ok(()); + return Ok(None); }; let Some(envelope) = extra.remove("vllm_tito") else { - return Ok(()); + return Ok(None); }; - let serde_json::Value::Object(envelope) = envelope else { + let serde_json::Value::Object(mut envelope) = envelope else { return Err(client::invalid_argument( "extra_args.vllm_tito must be a JSON object", )); }; - for key in envelope.keys() { - if !matches!( + for (key, value) in &envelope { + let supported = matches!( key.as_str(), "request_id" | "sampling_params" @@ -303,13 +482,52 @@ fn consume_vllm_tito(extra_args: &mut Option) -> Result<(), D | "cache_salt" | "priority" | "kv_transfer_params" - ) { + | "features" + ); + let nullable_renderer_metadata = value.is_null() + && matches!( + key.as_str(), + "assistant_tokens_mask" + | "token_offsets" + | "content_parts" + | "return_token_ids" + | "ec_transfer_params" + ); + if !supported && !nullable_renderer_metadata { return Err(client::invalid_argument(format!( "extra_args.vllm_tito.{key} is not supported by vLLM gRPC" ))); } } - Ok(()) + let Some(features) = envelope.remove("features") else { + return Ok(None); + }; + if features.is_null() { + return Ok(None); + } + serde_json::from_value(features).map(Some).map_err(|error| { + client::invalid_argument(format!("extra_args.vllm_tito.features is invalid: {error}")) + }) +} + +fn consume_preprocessed_mm_routing_hashes( + extra_args: &mut Option, +) -> Result>, DynamoError> { + let Some(serde_json::Value::Object(extra)) = extra_args.as_mut() else { + return Ok(None); + }; + let Some(value) = extra.remove("dynamo_mm_routing_hashes") else { + return Ok(None); + }; + let hashes: Vec = serde_json::from_value(value).map_err(|error| { + client::invalid_argument(format!("dynamo_mm_routing_hashes is invalid: {error}")) + })?; + if hashes.iter().any(String::is_empty) { + return Err(client::invalid_argument( + "dynamo_mm_routing_hashes entries must not be empty", + )); + } + Ok(Some(hashes)) } fn consume_redundant_nvext( extra_args: &mut Option, @@ -558,6 +776,170 @@ fn build_media( Ok(media) } +fn build_preprocessed_media( + features: VllmTitoFeatures, + prompt_token_count: usize, + routing_hashes: Option<&[String]>, + lora_name: &str, +) -> Result, DynamoError> { + if features.mm_hashes.is_empty() { + return Err(client::invalid_argument( + "preprocessed multimodal features must not be empty", + )); + } + if features + .mm_hashes + .keys() + .ne(features.mm_placeholders.keys()) + || features.mm_hashes.keys().ne(features.kwargs_data.keys()) + { + return Err(client::invalid_argument( + "preprocessed multimodal feature modalities must match", + )); + } + + let image_count = features.mm_hashes.get("image").map_or(0, Vec::len); + if let Some(routing_hashes) = routing_hashes + && routing_hashes.len() != image_count + { + return Err(client::invalid_argument(format!( + "dynamo_mm_routing_hashes has {} entries for {image_count} images", + routing_hashes.len() + ))); + } + + let mut decoded_bytes = 0usize; + let mut media = Vec::new(); + for (modality_name, producer_hashes) in &features.mm_hashes { + let modality = match modality_name.as_str() { + "image" => pb::Modality::Image, + "video" => pb::Modality::Video, + "audio" => pb::Modality::Audio, + _ => { + return Err(client::invalid_argument(format!( + "vLLM gRPC does not support preprocessed modality `{modality_name}`" + ))); + } + }; + let placeholders = &features.mm_placeholders[modality_name]; + let kwargs_data = &features.kwargs_data[modality_name]; + if producer_hashes.len() != placeholders.len() || producer_hashes.len() != kwargs_data.len() + { + return Err(client::invalid_argument(format!( + "preprocessed modality `{modality_name}` has mismatched item counts" + ))); + } + + for (index, ((producer_hash, placeholder), encoded_kwargs)) in producer_hashes + .iter() + .zip(placeholders) + .zip(kwargs_data) + .enumerate() + { + if producer_hash.is_empty() { + return Err(client::invalid_argument(format!( + "preprocessed modality `{modality_name}` item {index} has an empty hash" + ))); + } + if placeholder.length == 0 { + return Err(client::invalid_argument(format!( + "preprocessed modality `{modality_name}` item {index} has an empty placeholder" + ))); + } + let end = placeholder + .offset + .checked_add(placeholder.length) + .ok_or_else(|| client::invalid_argument("multimodal placeholder range overflow"))?; + if end > prompt_token_count as u64 { + return Err(client::invalid_argument(format!( + "preprocessed modality `{modality_name}` item {index} placeholder exceeds the prompt" + ))); + } + // An empty mask is vLLM's dense-placeholder representation. Sparse + // layouts require a renderer that preserves `is_embed` on the wire. + let is_embed = placeholder.is_embed.clone().unwrap_or_default(); + if !is_embed.is_empty() && is_embed.len() as u64 != placeholder.length { + return Err(client::invalid_argument(format!( + "preprocessed modality `{modality_name}` item {index} is_embed length does not match its placeholder" + ))); + } + + let kwargs = decode_preprocessed_kwargs(encoded_kwargs, &mut decoded_bytes)?; + let mm_hash = preprocessed_mm_identifier(modality_name, &kwargs); + let expected_routing_marker = (modality == pb::Modality::Image) + .then(|| routing_hashes.and_then(|hashes| hashes.get(index))) + .flatten(); + if let Some(expected) = expected_routing_marker + && expected != &preprocessed_mm_routing_hash(modality_name, &kwargs) + { + return Err(client::invalid_argument(format!( + "dynamo_mm_routing_hashes[{index}] does not match the preprocessed image payload" + ))); + } + let identifier = if lora_name.is_empty() { + expected_routing_marker + .cloned() + .unwrap_or_else(|| mm_hash.clone()) + } else { + format!("{lora_name}:{mm_hash}") + }; + media.push(pb::MediaItem { + modality: modality as i32, + source: Some(pb::media_item::Source::Features( + pb::PreprocessedMediaFeatures { + kwargs: Some(kwargs), + identifier: identifier.clone(), + offset: placeholder.offset, + length: placeholder.length, + mm_hash: Some(mm_hash), + is_embed, + }, + )), + mime_type: String::new(), + uuid: String::new(), + }); + } + } + Ok(media) +} + +fn decode_preprocessed_kwargs( + encoded: &str, + decoded_bytes: &mut usize, +) -> Result, DynamoError> { + if encoded.is_empty() { + return Err(client::invalid_argument( + "preprocessed multimodal kwargs must not be empty", + )); + } + let remaining = MAX_PREPROCESSED_MM_BYTES.saturating_sub(*decoded_bytes); + let max_encoded = remaining.saturating_add(2) / 3 * 4 + 4; + if encoded.len() > max_encoded { + return Err(client::invalid_argument(format!( + "preprocessed multimodal kwargs exceed {MAX_PREPROCESSED_MM_BYTES} decoded bytes" + ))); + } + let kwargs = BASE64_STANDARD.decode(encoded).map_err(|error| { + client::invalid_argument(format!( + "preprocessed multimodal kwargs are not valid base64: {error}" + )) + })?; + if kwargs.is_empty() { + return Err(client::invalid_argument( + "preprocessed multimodal kwargs must not decode to an empty payload", + )); + } + *decoded_bytes = decoded_bytes + .checked_add(kwargs.len()) + .filter(|total| *total <= MAX_PREPROCESSED_MM_BYTES) + .ok_or_else(|| { + client::invalid_argument(format!( + "preprocessed multimodal kwargs exceed {MAX_PREPROCESSED_MM_BYTES} decoded bytes" + )) + })?; + Ok(kwargs) +} + fn top_n_candidates(count: u32) -> Result { if count == u32::MAX { return Ok(pb::CandidateTokens { @@ -784,13 +1166,10 @@ fn validate_request( } if request.mm_processor_kwargs.is_some() { return Err(client::invalid_argument( - "preprocessed multimodal features are not supported by vLLM gRPC", + "mm_processor_kwargs are not supported by vLLM gRPC", )); } - let has_media = request - .multi_modal_data - .as_ref() - .is_some_and(|media| media.values().any(|items| !items.is_empty())); + let has_media = request_has_multimodal_input(request); if mode.is_encode() && !has_media { return Err(client::invalid_argument( "encode requests require multimodal media", @@ -842,6 +1221,18 @@ fn validate_request( if sampling.use_beam_search.unwrap_or(false) { return Err(client::invalid_argument("beam search is not supported")); } + if !mode.is_prefill() && !mode.is_encode() { + if matches!(sampling.top_k, Some(-1 | 0)) { + return Err(client::invalid_argument( + "top_k=-1 or top_k=0 cannot be represented by vllm-proto 0.3", + )); + } + if sampling.min_p == Some(0.0) { + return Err(client::invalid_argument( + "min_p=0 cannot be represented by vllm-proto 0.3", + )); + } + } if let Some(length_penalty) = sampling.length_penalty && (length_penalty - 1.0).abs() > f32::EPSILON { diff --git a/lib/sidecar/vllm/src/engine.rs b/lib/sidecar/vllm/src/engine.rs index a37df6356569..70cc2fa258f8 100644 --- a/lib/sidecar/vllm/src/engine.rs +++ b/lib/sidecar/vllm/src/engine.rs @@ -23,6 +23,7 @@ use crate::args::Args; use crate::client::{self, CONTROL_SERVICE, INFERENCE_SERVICE, VllmClient}; use crate::convert::{ ResponseState, build_generate_request, data_parallel_rank, normalize_response_options, + request_has_multimodal_input, }; use crate::lora::{self, build_downloader, parse_load_lora, parse_lora_name, resolve_source_path}; use crate::model::DiscoveredModel; @@ -712,12 +713,7 @@ impl LLMEngine for VllmSidecarEngine { request: dynamo_backend_common::PreprocessedRequest, ctx: GenerateContext, ) -> Result>, DynamoError> { - if request - .multi_modal_data - .as_ref() - .is_some_and(|media| media.values().any(|items| !items.is_empty())) - && !self.model.supports_multimodal - { + if request_has_multimodal_input(&request) && !self.model.supports_multimodal { return Err(client::invalid_argument(format!( "model `{}` does not advertise multimodal support", self.model.served_name diff --git a/lib/sidecar/vllm/src/model.rs b/lib/sidecar/vllm/src/model.rs index c2f4d9c1c433..08528907a30b 100644 --- a/lib/sidecar/vllm/src/model.rs +++ b/lib/sidecar/vllm/src/model.rs @@ -6,6 +6,7 @@ use std::ops::Range; use dynamo_backend_common::{ DynamoError, EngineConfig, LlmRegistration, RlAdminBaseUrl, RlWorkerMetadata, }; +use dynamo_llm::local_model::runtime_config::VLLM_INFERENCE_V1_GENERATE_CAPABILITY; use crate::client; use crate::proto as pb; @@ -183,10 +184,16 @@ impl DiscoveredModel { model: self.source.clone(), served_model_name: Some(self.served_name.clone()), model_aliases: self.identity.aliases.clone(), - runtime_data: [( - dynamo_llm::lora::LORA_REQUIRES_REGISTRATION.to_string(), - serde_json::Value::Bool(true), - )] + runtime_data: [ + ( + dynamo_llm::lora::LORA_REQUIRES_REGISTRATION.to_string(), + serde_json::Value::Bool(true), + ), + ( + VLLM_INFERENCE_V1_GENERATE_CAPABILITY.to_string(), + serde_json::Value::Bool(true), + ), + ] .into_iter() .collect(), llm: Some(LlmRegistration { diff --git a/lib/sidecar/vllm/src/tests.rs b/lib/sidecar/vllm/src/tests.rs index f5fe81ffce20..493c848e1c21 100644 --- a/lib/sidecar/vllm/src/tests.rs +++ b/lib/sidecar/vllm/src/tests.rs @@ -19,6 +19,7 @@ use dynamo_backend_common::{ RlWorkerMetadata, SamplingOptions, StopConditions, }; use dynamo_llm::model_card::ModelDeploymentCard; +use dynamo_llm::protocols::common::preprocessed_mm_routing_hash; use dynamo_runtime::discovery::{DiscoveryInstance, DiscoveryQuery, DiscoverySpec}; use dynamo_runtime::distributed::DistributedConfig; use dynamo_runtime::traits::DistributedRuntimeProvider; @@ -630,12 +631,13 @@ fn server_info() -> pb::ServerInfo { #[test] fn engine_config_advertises_supported_capabilities() { let model = DiscoveredModel::from_proto(model_info(), server_info()).expect("valid discovery"); - assert!( - !model + assert_eq!( + model .engine_config(true) .expect("valid KV metadata") .runtime_data - .contains_key("vllm_inference_v1_generate") + .get("vllm_inference_v1_generate"), + Some(&json!(true)) ); assert_eq!( model @@ -1071,6 +1073,7 @@ fn compatibility_envelope_preserves_typed_controls() { }) .sampling_options(SamplingOptions { n: Some(1), + temperature: Some(1.0), ..Default::default() }) .output_options(OutputOptions::default()) @@ -1087,7 +1090,8 @@ fn compatibility_envelope_preserves_typed_controls() { "ignore_eos": true, "logprobs": 2, "prompt_logprobs": 3, - "skip_special_tokens": false + "skip_special_tokens": false, + "return_token_ids": true } } }))) @@ -1111,18 +1115,178 @@ fn compatibility_envelope_preserves_typed_controls() { Some(pb::candidate_tokens::Select::TopN(3)) ); assert_eq!(response.skip_special_tokens, Some(false)); + assert!(response.output_token_ids); + } +} + +#[test] +fn compatibility_envelope_accepts_sampling_projected_to_proto() { + for mode in [DisaggregationMode::Aggregated, DisaggregationMode::Decode] { + let mut request = request(); + if mode.is_decode() { + request.prefill_result = decode_request().prefill_result; + } + request.extra_args = Some(json!({ + "vllm_tito": { + "sampling_params": { + "temperature": 0.2, + "top_p": 0.9, + "top_k": 4, + "min_p": 0.1, + "seed": 123, + "presence_penalty": 0.3, + "frequency_penalty": 0.4, + "repetition_penalty": 1.1, + "max_tokens": 1, + "min_tokens": 1, + "stop_token_ids": [2], + "ignore_eos": true, + "logprobs": 1, + "prompt_logprobs": 1, + "skip_special_tokens": false + } + } + })); + let wire = build_generate_request(request, "native".to_string(), mode) + .expect("vllm-proto 0.3 preserves projected sampling controls"); + assert_eq!(wire.temperature, Some(0.2)); + let sampling = wire.sampling.expect("sampling"); + assert_eq!(sampling.top_p, 0.9); + assert_eq!(sampling.top_k, 4); + assert_eq!(sampling.min_p, 0.1); + assert_eq!(sampling.seed, Some(123)); + let decoding = wire.decoding.expect("decoding"); + assert_eq!(decoding.presence_penalty, 0.3); + assert_eq!(decoding.frequency_penalty, 0.4); + assert_eq!(decoding.repetition_penalty, 1.1); + assert_eq!(wire.stopping.expect("stopping").stop_token_ids, vec![2]); + } +} + +#[test] +fn released_envelope_hydrates_legacy_sampling_with_canonical_precedence() { + let mut legacy = request(); + legacy.sampling_options = SamplingOptions::default(); + legacy.stop_conditions = StopConditions::default(); + legacy.output_options = OutputOptions::default(); + legacy.extra_args = Some(json!({ + "vllm_tito": { + "sampling_params": { + "temperature": 0.8, + "top_p": 0.85, + "top_k": 7, + "min_p": 0.05, + "seed": 321, + "presence_penalty": 0.2, + "frequency_penalty": 0.3, + "repetition_penalty": 1.2, + "max_tokens": 9, + "min_tokens": 2, + "stop_token_ids": [42, 43], + "ignore_eos": true, + "logprobs": 2, + "prompt_logprobs": 3, + "skip_special_tokens": false + } + } + })); + + let legacy = normalize_response_options(legacy).expect("normalize v1.4 controls"); + assert_eq!(legacy.sampling_options.temperature, Some(0.8)); + assert_eq!(legacy.sampling_options.top_p, Some(0.85)); + assert_eq!(legacy.sampling_options.top_k, Some(7)); + assert_eq!(legacy.sampling_options.min_p, Some(0.05)); + assert_eq!(legacy.sampling_options.seed, Some(321)); + assert_eq!(legacy.sampling_options.presence_penalty, Some(0.2)); + assert_eq!(legacy.sampling_options.frequency_penalty, Some(0.3)); + assert_eq!(legacy.sampling_options.repetition_penalty, Some(1.2)); + assert_eq!(legacy.stop_conditions.max_tokens, Some(9)); + assert_eq!(legacy.stop_conditions.min_tokens, Some(2)); + assert_eq!(legacy.stop_conditions.stop_token_ids, Some(vec![42, 43])); + assert_eq!(legacy.stop_conditions.ignore_eos, Some(true)); + assert_eq!(legacy.output_options.logprobs, Some(2)); + assert_eq!(legacy.output_options.prompt_logprobs, Some(3)); + assert_eq!(legacy.output_options.skip_special_tokens, Some(false)); + + let mut canonical = legacy.clone(); + canonical.sampling_options.temperature = Some(0.4); + canonical.stop_conditions.stop_token_ids = Some(vec![7]); + let canonical = normalize_response_options(canonical).expect("keep canonical controls"); + assert_eq!(canonical.sampling_options.temperature, Some(0.4)); + assert_eq!(canonical.stop_conditions.stop_token_ids, Some(vec![7])); + + let mut canonical_hidden = legacy; + canonical_hidden.stop_conditions.stop_token_ids = None; + canonical_hidden.stop_conditions.stop_token_ids_hidden = Some(vec![7]); + let canonical_hidden = + normalize_response_options(canonical_hidden).expect("keep canonical hidden stops"); + assert_eq!(canonical_hidden.stop_conditions.stop_token_ids, None); + assert_eq!( + canonical_hidden.stop_conditions.stop_token_ids_hidden, + Some(vec![7]) + ); +} + +#[test] +fn native_generate_rejects_unrepresentable_sampling_controls() { + let mut defaults = request(); + defaults.sampling_options.temperature = None; + let wire = build_generate_request( + defaults, + "defaults".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("omitted rendered temperature resolves to the vLLM default"); + assert_eq!(wire.temperature, Some(1.0)); + + for top_k in [-1, 0] { + let mut disabled = request(); + disabled.sampling_options.top_k = Some(top_k); + let error = build_generate_request( + disabled, + "disabled".to_string(), + DisaggregationMode::Aggregated, + ) + .expect_err("disabled top_k cannot be represented by proto 0.3"); + assert!(error.to_string().contains("top_k")); } + + let mut disabled = request(); + disabled.sampling_options.min_p = Some(0.0); + let error = build_generate_request( + disabled, + "disabled".to_string(), + DisaggregationMode::Aggregated, + ) + .expect_err("disabled min_p cannot be represented by proto 0.3"); + assert!(error.to_string().contains("min_p")); } #[test] -fn native_sampling_is_rejected_instead_of_silently_discarded() { +fn compatibility_envelope_allows_projected_prefix_cache_bypass() { + let mut request = request(); + request.extra_args = Some(json!({ + "skip_reading_prefix_cache": true, + "vllm_tito": {"sampling_params": {"skip_reading_prefix_cache": true}} + })); + let wire = build_generate_request( + request, + "cache-bypass".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("projected cache bypass should be accepted"); + assert!(wire.kv.expect("kv options").bypass_prefix_cache); +} + +#[test] +fn compatibility_envelope_rejects_disabled_token_ids() { for mode in [DisaggregationMode::Aggregated, DisaggregationMode::Decode] { let mut request = request(); request.extra_args = Some(json!({ - "vllm_tito": {"sampling_params": {"temperature": 0.0}} + "vllm_tito": {"sampling_params": {"return_token_ids": false}} })); let error = build_generate_request(request, "native".to_string(), mode) - .expect_err("released protocol cannot preserve native sampling semantics"); + .expect_err("the gRPC response always requires output token ids"); assert_eq!( error.error_type(), ErrorType::Backend(BackendError::InvalidArgument) @@ -1130,7 +1294,74 @@ fn native_sampling_is_rejected_instead_of_silently_discarded() { assert!( error .to_string() - .contains("sampling_params.temperature is not supported") + .contains("sampling_params.return_token_ids must be true") + ); + } +} + +#[test] +fn rendered_null_passthrough_fields_are_ignored() { + const NULLABLE_RENDERER_FIELDS: [&str; 5] = [ + "assistant_tokens_mask", + "token_offsets", + "content_parts", + "return_token_ids", + "ec_transfer_params", + ]; + + let mut defaults_request = request(); + defaults_request.extra_args = Some(json!({ + "vllm_tito": { + "sampling_params": {}, + "assistant_tokens_mask": null, + "token_offsets": null, + "content_parts": null, + "return_token_ids": null, + "ec_transfer_params": null + } + })); + build_generate_request( + defaults_request, + "renderer-defaults".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("nullable stock-renderer metadata should be ignored"); + + for field in NULLABLE_RENDERER_FIELDS { + let mut request = request(); + request.extra_args = Some(json!({ + "vllm_tito": { + "sampling_params": {}, + field: true + } + })); + let error = build_generate_request( + request, + format!("unsupported-{field}"), + DisaggregationMode::Aggregated, + ) + .expect_err("non-null renderer metadata must not be discarded"); + assert!(error.to_string().contains(field)); + } +} + +#[test] +fn unprojected_native_sampling_is_rejected_instead_of_silently_discarded() { + for mode in [DisaggregationMode::Aggregated, DisaggregationMode::Decode] { + let mut request = request(); + request.extra_args = Some(json!({ + "vllm_tito": {"sampling_params": {"logit_bias": {"42": 1.0}}} + })); + let error = build_generate_request(request, "native".to_string(), mode) + .expect_err("unprojected sampling controls must not be discarded"); + assert_eq!( + error.error_type(), + ErrorType::Backend(BackendError::InvalidArgument) + ); + assert!( + error + .to_string() + .contains("sampling_params.logit_bias is not supported") ); } } @@ -3533,6 +3764,311 @@ async fn decode_cancellation_maps_premature_eof_to_cancelled() { assert_eq!(terminal.finish_reason, Some(FinishReason::Cancelled)); } +const VALID_MM_KWARGS_BASE64: &str = + "gaxwaXhlbF92YWx1ZXOCpGRhdGGTpXVpbnQ4kQPHAwMBAgOlZmllbGSSp2JhdGNoZWSBq2tlZXBfb25fY3B1wg=="; +const ALTERNATE_MM_KWARGS_BASE64: &str = + "gaxwaXhlbF92YWx1ZXOCpGRhdGGTpXVpbnQ4kQPHAwMBAgSlZmllbGSSp2JhdGNoZWSBq2tlZXBfb25fY3B1wg=="; + +fn request_with_preprocessed_features(features: serde_json::Value) -> PreprocessedRequest { + let mut request = request(); + request.extra_args = Some(json!({ + "vllm_tito": { + "request_id": "request-1", + "sampling_params": {}, + "stream": false, + "priority": 0, + "features": features + } + })); + request +} + +fn image_features(kwargs: &str) -> serde_json::Value { + json!({ + "mm_hashes": {"image": ["producer-image-hash"]}, + "mm_placeholders": {"image": [{"offset": 1, "length": 2}]}, + "kwargs_data": {"image": [kwargs]} + }) +} + +fn image_routing_marker(encoded_kwargs: &str) -> String { + use base64::Engine as _; + let kwargs = base64::engine::general_purpose::STANDARD + .decode(encoded_kwargs) + .expect("valid test kwargs"); + preprocessed_mm_routing_hash("image", &kwargs) +} + +#[test] +fn preprocessed_multimodal_features_are_forwarded_to_vllm_grpc() { + let request = request_with_preprocessed_features(image_features(VALID_MM_KWARGS_BASE64)); + let wire = build_generate_request( + request, + "request-1".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("preprocessed features should be forwarded"); + + let feature = match wire.media[0].source.as_ref() { + Some(pb::media_item::Source::Features(feature)) => feature, + other => panic!("expected preprocessed features, got {other:?}"), + }; + assert!(feature.identifier.starts_with("grpc-mm:")); + assert_eq!( + feature.mm_hash.as_deref(), + Some(feature.identifier.as_str()) + ); + assert_eq!((feature.offset, feature.length), (1, 2)); + assert_eq!(feature.kwargs.as_ref().map(Vec::len), Some(64)); + assert!(feature.is_embed.is_empty()); +} + +#[test] +fn preprocessed_sparse_embedding_mask_is_forwarded_to_vllm_grpc() { + let mut features = image_features(VALID_MM_KWARGS_BASE64); + features["mm_placeholders"]["image"][0]["offset"] = json!(0); + features["mm_placeholders"]["image"][0]["length"] = json!(3); + features["mm_placeholders"]["image"][0]["is_embed"] = json!([false, true, false]); + let wire = build_generate_request( + request_with_preprocessed_features(features), + "request-1".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("sparse embedding mask should be forwarded"); + + let Some(pb::media_item::Source::Features(feature)) = wire.media[0].source.as_ref() else { + panic!("expected preprocessed features") + }; + assert_eq!(feature.is_embed, vec![false, true, false]); +} + +#[test] +fn preprocessed_routing_identity_matches_inline_content() { + let marker = image_routing_marker(VALID_MM_KWARGS_BASE64); + let mut request = request_with_preprocessed_features(image_features(VALID_MM_KWARGS_BASE64)); + request + .extra_args + .as_mut() + .and_then(serde_json::Value::as_object_mut) + .expect("object extra_args") + .insert("dynamo_mm_routing_hashes".to_string(), json!([marker])); + let wire = build_generate_request( + request, + "request-1".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("matching content-derived routing identity"); + let Some(pb::media_item::Source::Features(feature)) = wire.media[0].source.as_ref() else { + panic!("expected preprocessed features") + }; + assert_eq!(feature.identifier, marker); + + let mut mismatched = + request_with_preprocessed_features(image_features(ALTERNATE_MM_KWARGS_BASE64)); + mismatched + .extra_args + .as_mut() + .and_then(serde_json::Value::as_object_mut) + .expect("object extra_args") + .insert( + "dynamo_mm_routing_hashes".to_string(), + json!([image_routing_marker(VALID_MM_KWARGS_BASE64)]), + ); + let error = build_generate_request( + mismatched, + "request-2".to_string(), + DisaggregationMode::Aggregated, + ) + .expect_err("routing identity from different content must be rejected"); + assert!(error.to_string().contains("does not match")); +} + +#[test] +fn preprocessed_multimodal_identifier_is_bound_to_inline_content() { + let first = build_generate_request( + request_with_preprocessed_features(image_features(VALID_MM_KWARGS_BASE64)), + "request-1".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("first feature should be forwarded"); + let second = build_generate_request( + request_with_preprocessed_features(image_features(ALTERNATE_MM_KWARGS_BASE64)), + "request-2".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("second feature should be forwarded"); + + let cache_key = |request: &pb::GenerateRequest| match request.media[0].source.as_ref() { + Some(pb::media_item::Source::Features(feature)) => feature.mm_hash.clone().unwrap(), + other => panic!("expected preprocessed features, got {other:?}"), + }; + assert_ne!(cache_key(&first), cache_key(&second)); +} + +#[test] +fn preprocessed_multimodal_identifier_is_scoped_by_lora() { + let build = |lora_name: Option<&str>| { + let mut request = + request_with_preprocessed_features(image_features(VALID_MM_KWARGS_BASE64)); + request.routing.as_mut().unwrap().lora_name = lora_name.map(str::to_string); + build_generate_request( + request, + "request-1".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("preprocessed features should be forwarded") + }; + fn feature(request: &pb::GenerateRequest) -> &pb::PreprocessedMediaFeatures { + match request.media[0].source.as_ref() { + Some(pb::media_item::Source::Features(feature)) => feature, + other => panic!("expected preprocessed features, got {other:?}"), + } + } + + let base = build(None); + let adapter_a = build(Some("adapter-a")); + let adapter_b = build(Some("adapter-b")); + let base_feature = feature(&base); + let adapter_a_feature = feature(&adapter_a); + let adapter_b_feature = feature(&adapter_b); + + assert_eq!( + base_feature.mm_hash.as_deref(), + Some(base_feature.identifier.as_str()) + ); + assert_eq!(adapter_a_feature.mm_hash, base_feature.mm_hash); + assert_eq!(adapter_b_feature.mm_hash, base_feature.mm_hash); + assert_eq!( + adapter_a_feature.identifier, + format!("adapter-a:{}", base_feature.identifier) + ); + assert_eq!( + adapter_b_feature.identifier, + format!("adapter-b:{}", base_feature.identifier) + ); + + let marker = image_routing_marker(VALID_MM_KWARGS_BASE64); + let mut routed_adapter = + request_with_preprocessed_features(image_features(VALID_MM_KWARGS_BASE64)); + routed_adapter.routing.as_mut().unwrap().lora_name = Some("adapter-a".to_string()); + routed_adapter + .extra_args + .as_mut() + .and_then(serde_json::Value::as_object_mut) + .expect("object extra_args") + .insert("dynamo_mm_routing_hashes".to_string(), json!([marker])); + let routed_adapter = build_generate_request( + routed_adapter, + "request-routed-adapter".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("adapter identity must remain scoped"); + assert_eq!( + feature(&routed_adapter).identifier, + adapter_a_feature.identifier + ); +} + +#[test] +fn renderer_mm_metadata_is_accepted_with_complete_inline_kwargs() { + let mut with_null = image_features(VALID_MM_KWARGS_BASE64); + with_null["mm_metadata"] = serde_json::Value::Null; + build_generate_request( + request_with_preprocessed_features(with_null), + "request-null-metadata".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("the vLLM renderer serializes mm_metadata as null"); + + let mut with_metadata = image_features(VALID_MM_KWARGS_BASE64); + with_metadata["mm_metadata"] = json!({"image": [{"image_grid_thw": [1, 2, 3]}]}); + build_generate_request( + request_with_preprocessed_features(with_metadata), + "request-non-null-metadata".to_string(), + DisaggregationMode::Aggregated, + ) + .expect("redundant renderer metadata is allowed with complete inline kwargs"); + + let mut metadata_only = image_features(VALID_MM_KWARGS_BASE64); + metadata_only["mm_metadata"] = json!({"image": [{"image_grid_thw": [1, 2, 3]}]}); + metadata_only + .as_object_mut() + .expect("feature object") + .remove("kwargs_data"); + let error = build_generate_request( + request_with_preprocessed_features(metadata_only), + "request-metadata-only".to_string(), + DisaggregationMode::Aggregated, + ) + .expect_err("renderer metadata without inline kwargs must fail closed"); + assert!(error.to_string().contains("kwargs_data")); +} + +#[test] +fn preprocessed_features_reject_routing_metadata_without_payload() { + let mut request = request(); + request + .extra_args + .as_mut() + .and_then(serde_json::Value::as_object_mut) + .expect("object extra_args") + .insert( + "dynamo_mm_routing_hashes".to_string(), + json!([image_routing_marker(VALID_MM_KWARGS_BASE64)]), + ); + let error = build_generate_request( + request, + "request-1".to_string(), + DisaggregationMode::Aggregated, + ) + .expect_err("routing metadata without features must be rejected"); + assert!(error.to_string().contains("requires preprocessed")); +} + +#[test] +fn preprocessed_features_cannot_mix_with_raw_media() { + let mut request = request_with_preprocessed_features(image_features(VALID_MM_KWARGS_BASE64)); + request.multi_modal_data = Some(std::collections::HashMap::from([( + "image_url".to_string(), + vec![MultimodalData::RawUrl( + "data:image/png;base64,iVBORw0KGgo=".to_string(), + )], + )])); + let error = build_generate_request( + request, + "request-1".to_string(), + DisaggregationMode::Aggregated, + ) + .expect_err("raw media and preprocessed features must not be mixed"); + assert!(error.to_string().contains("cannot be mixed")); +} + +#[tokio::test] +async fn preprocessed_multimodal_features_require_model_support() { + let engine = engine( + "http://127.0.0.1:9", + DisaggregationMode::Aggregated, + 1, + model_info(), + ); + let context = dynamo_backend_common::testing::mock_context(); + let result = engine + .generate( + request_with_preprocessed_features(image_features(VALID_MM_KWARGS_BASE64)), + GenerateContext::new(context, None), + ) + .await; + let error = match result { + Ok(_) => panic!("text-only model must reject preprocessed media before RPC submission"), + Err(error) => error, + }; + assert!( + error + .to_string() + .contains("does not advertise multimodal support") + ); +} + #[tokio::test] async fn unsupported_features_fail_before_rpc_submission() { let server = FakeServer::start(FakeVllm::default()).await; From f804218070779d0b476ef46b550c490dabb59621 Mon Sep 17 00:00:00 2001 From: ishandhanani <82981111+ishandhanani@users.noreply.github.com> Date: Tue, 22 Sep 2026 18:40:05 -0700 Subject: [PATCH 168/191] refactor(router): move default worker selection into builtin plugin (#14785) Signed-off-by: Ishan Dhanani --- .github/workflows/pre-merge.yml | 2 +- Cargo.lock | 8 + Cargo.toml | 1 + .../configuration/groups/kv_router_args.py | 5 +- deploy/inference-gateway/ext-proc/Cargo.toml | 1 + .../ext-proc/src/peer_discovery.rs | 6 +- .../ext-proc/src/selector.rs | 9 +- .../router/configuration-and-tuning.md | 6 +- .../router/custom-worker-selection.mdx | 146 +++--- .../router/router-operations.md | 2 +- .../components/frontend-configuration.mdx | 4 +- .../observability/metrics-catalog.mdx | 2 +- .../use-cases/agents/priority-scheduling.md | 2 +- .../router/custom-policy-example/README.md | 6 +- .../disagg-filter-score-pick/src/filter.rs | 2 +- .../disagg-filter-score-pick/src/scorer.rs | 49 +- .../simple-filter-score-pick/src/filter.rs | 2 +- .../simple-filter-score-pick/src/scorer.rs | 30 +- .../src/scorer/active_requests.rs | 19 +- .../src/scorer/uncached_blocks.rs | 19 +- lib/bench/kv_router/dc_ckf_relay_bench.rs | 2 +- lib/bindings/kvbm/Cargo.lock | 12 + lib/bindings/python/Cargo.lock | 4 + lib/bindings/python/Cargo.toml | 3 +- lib/bindings/python/rust/lib.rs | 27 +- lib/bindings/python/rust/llm/entrypoint.rs | 71 ++- lib/bindings/python/rust/llm/kv.rs | 8 +- lib/kv-router/Cargo.toml | 3 +- lib/kv-router/benches/selection_core.rs | 6 + lib/kv-router/benches/worker_selection.rs | 77 ++-- lib/kv-router/src/lib.rs | 10 +- lib/kv-router/src/plugins.rs | 13 + lib/kv-router/src/plugins/registry.rs | 65 ++- lib/kv-router/src/plugins/worker_selection.rs | 305 +------------ .../src/plugins/worker_selection/context.rs | 81 ++++ .../src/plugins/worker_selection/inputs.rs | 372 +++++++++++++++ lib/kv-router/src/scheduling/AGENTS.md | 6 +- lib/kv-router/src/scheduling/config.rs | 44 +- lib/kv-router/src/scheduling/local.rs | 119 ++--- lib/kv-router/src/scheduling/overlap.rs | 10 +- .../src/scheduling/overlap_refresh.rs | 4 +- lib/kv-router/src/scheduling/queue.rs | 30 +- lib/kv-router/src/scheduling/selector/mod.rs | 116 ++--- .../src/scheduling/selector/policy.rs | 341 ++++++++------ .../selector/{default.rs => reference.rs} | 131 ++++-- lib/kv-router/src/scheduling/types.rs | 4 +- .../src/services/selection/core/mod.rs | 7 +- .../src/services/selection/core/queries.rs | 2 +- .../src/services/selection/core/tests.rs | 18 +- .../src/services/selection/core/workers.rs | 7 +- .../src/services/selection/membership.rs | 6 + .../src/services/selection/service.rs | 64 ++- lib/kv-router/src/services/selection/tests.rs | 44 +- lib/kv-router/tests/plugin_api_compat.rs | 29 +- lib/llm/Cargo.toml | 1 + lib/llm/src/discovery/model_manager.rs | 19 +- lib/llm/src/discovery/watcher.rs | 42 +- lib/llm/src/entrypoint/input/http.rs | 4 +- lib/llm/src/kv_router.rs | 422 +++++++++++------- lib/llm/src/kv_router/embedded.rs | 5 +- lib/llm/src/kv_router/indexer/ingress.rs | 14 +- lib/llm/src/kv_router/indexer/mod.rs | 8 - lib/llm/src/kv_router/plugins.rs | 15 +- lib/mocker/Cargo.toml | 1 + .../offline/extensions/kv_router/mod.rs | 8 +- lib/mocker/src/replay/online/router.rs | 2 +- lib/mocker/src/replay/router_shared.rs | 5 +- lib/router-plugins/builtin/Cargo.toml | 14 + .../builtin/benches/default_lifecycle.rs | 92 ++++ .../builtin/benches/default_selection.rs | 232 ++++++++++ lib/router-plugins/builtin/src/default.rs | 63 +++ .../builtin/src/default/parameters.rs | 112 +++++ .../builtin/src/default/picker.rs | 163 +++++++ .../builtin/src/default/scorer.rs | 281 ++++++++++++ .../builtin/src/default/selector.rs | 87 ++++ lib/router-plugins/builtin/src/lib.rs | 30 +- .../builtin/src/two_tier_cost_fn.rs | 4 +- .../builtin/tests/batch_scoring.rs | 366 +++++++++++++++ .../builtin/tests/cache_inputs.rs | 244 ++++++++++ .../builtin/tests/default_lifecycle.rs | 143 ++++++ .../builtin/tests/default_policy.rs | 335 ++++++++++++++ .../builtin/tests/plugin_registry.rs | 108 +++++ .../builtin/tests/support/mod.rs | 92 ++++ 83 files changed, 4106 insertions(+), 1168 deletions(-) create mode 100644 lib/kv-router/src/plugins/worker_selection/context.rs create mode 100644 lib/kv-router/src/plugins/worker_selection/inputs.rs rename lib/kv-router/src/scheduling/selector/{default.rs => reference.rs} (94%) create mode 100644 lib/router-plugins/builtin/benches/default_lifecycle.rs create mode 100644 lib/router-plugins/builtin/benches/default_selection.rs create mode 100644 lib/router-plugins/builtin/src/default.rs create mode 100644 lib/router-plugins/builtin/src/default/parameters.rs create mode 100644 lib/router-plugins/builtin/src/default/picker.rs create mode 100644 lib/router-plugins/builtin/src/default/scorer.rs create mode 100644 lib/router-plugins/builtin/src/default/selector.rs create mode 100644 lib/router-plugins/builtin/tests/batch_scoring.rs create mode 100644 lib/router-plugins/builtin/tests/cache_inputs.rs create mode 100644 lib/router-plugins/builtin/tests/default_lifecycle.rs create mode 100644 lib/router-plugins/builtin/tests/default_policy.rs create mode 100644 lib/router-plugins/builtin/tests/plugin_registry.rs create mode 100644 lib/router-plugins/builtin/tests/support/mod.rs diff --git a/.github/workflows/pre-merge.yml b/.github/workflows/pre-merge.yml index 9a442fabb52c..470c972ca81b 100644 --- a/.github/workflows/pre-merge.yml +++ b/.github/workflows/pre-merge.yml @@ -541,7 +541,7 @@ jobs: working-directory: ${{ matrix.dir }} run: | # custom-policy is on by default; also lint it alongside the standalone selection - # service, and the build that links no worker-selection policies at all. + # service, and the build without the optional policy catalog. cargo clippy --locked --no-deps --features custom-policy,select-service --all-targets -- -D warnings cargo clippy --locked --no-deps --no-default-features --all-targets -- -D warnings - name: Lint feature-gated benchmark entrypoints diff --git a/Cargo.lock b/Cargo.lock index 78289466e00e..ac0aefa5a2ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2464,9 +2464,14 @@ dependencies = [ name = "dynamo-custom-policy-builtin" version = "1.6.0" dependencies = [ + "criterion", "dynamo-kv-router", + "fastrand", + "parking_lot", + "rustc-hash 2.1.2", "serde", "tempfile", + "tokio", ] [[package]] @@ -2565,6 +2570,7 @@ dependencies = [ "axum 0.8.4", "bytes", "dashmap", + "dynamo-custom-policy-builtin", "dynamo-kv-router", "dynamo-llm", "dynamo-protocols", @@ -2691,6 +2697,7 @@ dependencies = [ "derive_builder", "dialoguer", "dynamo-bench", + "dynamo-custom-policy-builtin", "dynamo-kv-router", "dynamo-memory", "dynamo-mocker", @@ -2806,6 +2813,7 @@ dependencies = [ "bytes", "dashmap", "derive_builder", + "dynamo-custom-policy-builtin", "dynamo-data-gen", "dynamo-kv-router", "dynamo-tokens", diff --git a/Cargo.toml b/Cargo.toml index 91875c508763..d80acd9a930a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,7 @@ repository = "https://github.com/ai-dynamo/dynamo.git" keywords = ["llm", "genai", "inference", "nvidia", "distributed"] [workspace.dependencies] +dynamo-custom-policy-builtin = { path = "lib/router-plugins/builtin", version = "1.6.0" } # Published separately by https://github.com/ai-dynamo/aisimulate. aisimulate-core = { version = "=0.12.0" } diff --git a/components/src/dynamo/common/configuration/groups/kv_router_args.py b/components/src/dynamo/common/configuration/groups/kv_router_args.py index 15f844989af7..0fc85150cfec 100644 --- a/components/src/dynamo/common/configuration/groups/kv_router_args.py +++ b/components/src/dynamo/common/configuration/groups/kv_router_args.py @@ -295,11 +295,12 @@ def add_arguments(self, parser) -> None: default=False, dest="load_aware", help=( - "KV Router: Enable load-aware routing without cache-reuse signals. " + "KV Router: Enable the load-aware routing preset. " "On the frontend, this implies --router-mode kv. " "This preset sets overlap_score_credit=0, disables KV events and " "KV-reuse assumptions, enables active-block " - "and prefill-token load tracking, and disables remote/shared cache indexers." + "and prefill-token load tracking, and disables remote/shared cache indexers. " + "The builtin policy does not request cache inputs in this mode." ), ) add_argument( diff --git a/deploy/inference-gateway/ext-proc/Cargo.toml b/deploy/inference-gateway/ext-proc/Cargo.toml index de1d14186130..812c89c740bf 100644 --- a/deploy/inference-gateway/ext-proc/Cargo.toml +++ b/deploy/inference-gateway/ext-proc/Cargo.toml @@ -16,6 +16,7 @@ name = "dynamo-ext-proc" path = "src/bin/dynamo-ext-proc.rs" [dependencies] +dynamo-custom-policy-builtin = { workspace = true } async-trait = { workspace = true } dynamo-kv-router = { workspace = true, features = [ "metrics", diff --git a/deploy/inference-gateway/ext-proc/src/peer_discovery.rs b/deploy/inference-gateway/ext-proc/src/peer_discovery.rs index 2d2270e858ec..271989cd10f3 100644 --- a/deploy/inference-gateway/ext-proc/src/peer_discovery.rs +++ b/deploy/inference-gateway/ext-proc/src/peer_discovery.rs @@ -268,9 +268,7 @@ mod tests { use axum::{Json, Router}; use dynamo_kv_router::WorkerType; use dynamo_kv_router::config::kv_router_config_from_dynamo_env; - use dynamo_kv_router::services::selection::{ - SelectionServiceBuilder, WorkerSelectionPolicyRegistry, - }; + use dynamo_kv_router::services::selection::SelectionServiceBuilder; use kube::Config; use tokio::net::TcpListener; use tokio::sync::Notify; @@ -285,7 +283,7 @@ mod tests { SelectionServiceBuilder::new( kv_router_config_from_dynamo_env(), WorkerType::Aggregated, - WorkerSelectionPolicyRegistry::default(), + dynamo_custom_policy_builtin::default_registry(), ) .indexer_threads(1) .replica_sync(listener_port, Vec::new()) diff --git a/deploy/inference-gateway/ext-proc/src/selector.rs b/deploy/inference-gateway/ext-proc/src/selector.rs index 2a96eec5e32b..790ea6d1510f 100644 --- a/deploy/inference-gateway/ext-proc/src/selector.rs +++ b/deploy/inference-gateway/ext-proc/src/selector.rs @@ -110,9 +110,12 @@ impl Selector { .await?; } - let mut builder = - SelectionServiceBuilder::new(kv_router_config, WorkerType::Aggregated, policy_registry) - .indexer_threads(cfg.selector_threads); + let mut builder = SelectionServiceBuilder::new( + kv_router_config, + WorkerType::Aggregated, + policy_registry.with_default_factory(dynamo_custom_policy_builtin::default_factory()), + ) + .indexer_threads(cfg.selector_threads); if let Some(peer_replication) = peer_replication { builder = builder.replica_sync(peer_replication.sync_port, Vec::new()); } diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md index d93b3a217a68..dd4e5eb54026 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md @@ -70,13 +70,13 @@ its configuration even if the endpoint is unchanged. ## Routing Behavior -- `--router-kv-overlap-score-credit`: Device-local prefix-overlap credit multiplier in the prefill cost calculation. It must be finite and nonnegative. Values greater than `1.0` give overlap extra credit, but the adjusted prefill contribution is clamped at zero. When set to `0`, the router ignores prefix caches and skips creating a local indexer. Defaults to `1.0`. +- `--router-kv-overlap-score-credit`: Device-local prefix-overlap credit multiplier in the prefill cost calculation. It must be finite and nonnegative. Values greater than `1.0` give overlap extra credit, but the adjusted prefill contribution is clamped at zero. When set to `0`, device-local overlap receives no score credit. Cache setup still follows the policy's `WorkerInputs::CACHE` declaration. Defaults to `1.0`. - `--router-kv-overlap-score-credit-decay`: Decays device-local overlap credit for workers whose active prefill load exceeds the least-loaded eligible worker. `0` disables decay. Defaults to 0. - `--router-prefill-load-scale`: Scale applied to adjusted prompt-side prefill load after device, lower-tier, and shared-cache credits are subtracted. Defaults to 1. - `--router-decode-active-request-weight`: Experimental finite, nonnegative block-equivalent decode cost added for each active request on a candidate worker. Defaults to 0. - `--router-host-cache-hit-weight`: Credit multiplier for host-pinned (CPU offload) prefix overlap, from 0.0 to 1.0. Symmetric to `--router-kv-overlap-score-credit` but applied to the host-pinned tier when a backend exposes CPU offload via a KV connector. Defaults to 0.75. - `--router-disk-cache-hit-weight`: Credit multiplier for disk/lower-tier (e.g. NVMe-backed) prefix overlap, from 0.0 to 1.0. Defaults to 0.25. -- `--load-aware`: Preset for load-aware KV routing without cache-reuse signals. On the frontend, it implies `--router-mode kv`. It sets `overlap_score_credit=0`, disables KV events and KV reuse assumptions, enables active-block and prefill-token load tracking, disables remote/shared cache indexers, and preserves `--router-prefill-load-scale`, `--router-host-cache-hit-weight`, and `--router-disk-cache-hit-weight`. +- `--load-aware`: Preset for load-aware KV routing. On the frontend, it implies `--router-mode kv`. It sets `overlap_score_credit=0`, disables KV events and KV reuse assumptions, enables active-block and prefill-token load tracking, disables remote/shared cache indexers, and preserves `--router-prefill-load-scale`, `--router-host-cache-hit-weight`, and `--router-disk-cache-hit-weight`. The policy's `WorkerInputs::CACHE` declaration still controls local approximate indexing; the builtin default declares `CACHE`. - `--router-temperature`: Controls worker selection randomness through softmax sampling of normalized router cost logits. A value of 0 (default) ensures deterministic selection of the lowest-cost worker, while higher values introduce more randomness. - `--router-conditional-disagg`: **Experimental.** Enables conditional disaggregation in frontend-embedded disaggregated serving. Requires `--router-mode kv`, `--router-kv-events`, separate prefill/decode worker pools, and decode-worker KV event publishing. Use `--router-conditional-disagg-config` for policy settings. See [Conditional Disaggregation](../../../advanced-customizations/conditional-disaggregation.md) for backend requirements and policy tuning. - `--router-track-prefill-tokens`: Enables prompt-side load accounting in the worker cost model. This should stay enabled if you want queue thresholds, `active_prefill_tokens`, and AIC prefill load decay to reflect prompt work. @@ -451,7 +451,7 @@ Use `--router-kv-overlap-score-credit-decay` to reduce that device-local credit Use `--load-aware` when you want the KV scheduler's active load model without prefix/cache reuse. This is equivalent to using KV mode with overlap credit set to 0, KV events disabled, KV reuse assumptions disabled, active load tracking enabled, and shared-cache routing disabled. `--router-prefill-load-scale` remains available to tune prompt-side load relative to decode blocks. -Deprecated: `--router-kv-overlap-score-weight`, `--kv-overlap-score-weight`, `DYN_ROUTER_KV_OVERLAP_SCORE_WEIGHT`, and `DYN_OVERLAP_SCORE_WEIGHT` are still accepted, but emit deprecation warnings. Nonzero legacy values map to `prefill_load_scale` to preserve existing behavior without changing overlap credit. A legacy value of 0 maps to both `prefill_load_scale=0` and `overlap_score_credit=0`, which preserves the old no-overlap/no-indexer behavior. If a deprecated overlap score weight is still present, it takes precedence over the newer prefill load scale field; a legacy value of 0 also takes precedence over the newer overlap credit field. When migrating to `--router-prefill-load-scale` or `DYN_ROUTER_PREFILL_LOAD_SCALE`, remove the deprecated flag, env var, or JSON field from the deployment config. Use `--router-kv-overlap-score-credit` or `DYN_ROUTER_KV_OVERLAP_SCORE_CREDIT` only when you mean to tune the cache-overlap credit itself. +Deprecated: `--router-kv-overlap-score-weight`, `--kv-overlap-score-weight`, `DYN_ROUTER_KV_OVERLAP_SCORE_WEIGHT`, and `DYN_OVERLAP_SCORE_WEIGHT` are still accepted, but emit deprecation warnings. Nonzero legacy values map to `prefill_load_scale` to preserve existing behavior without changing overlap credit. A legacy value of 0 maps to both `prefill_load_scale=0` and `overlap_score_credit=0`, which zeros those scoring weights. Indexer setup follows the policy's `WorkerInputs::CACHE` declaration independently of these values. If a deprecated overlap score weight is still present, it takes precedence over the newer prefill load scale field; a legacy value of 0 also takes precedence over the newer overlap credit field. When migrating to `--router-prefill-load-scale` or `DYN_ROUTER_PREFILL_LOAD_SCALE`, remove the deprecated flag, env var, or JSON field from the deployment config. Use `--router-kv-overlap-score-credit` or `DYN_ROUTER_KV_OVERLAP_SCORE_CREDIT` only when you mean to tune the cache-overlap credit itself. When migrating the deprecated overlap score weight, use `--router-prefill-load-scale` to preserve its scaling role. Tune `--router-kv-overlap-score-credit` separately only when you intend to change device-local cache credit; values above `1.0` are supported, with adjusted prefill cost clamped at zero. diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx index 5827ada9569d..a7030c8511a9 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx @@ -11,7 +11,7 @@ subtitle: Build Rust filters, scorers, and pickers for the Dynamo frontend or EP ## How It Works -This feature replaces the worker-ranking part of Dynamo's routing pipeline. A `WorkerFilter` can exclude a host-eligible worker, a `WorkerScorer` assigns a finite cost to each remaining worker, Dynamo adds costs from all configured scorers, and a `WorkerPicker` chooses one row from the scored candidates. Filters run in declaration order before scoring, and rejecting every worker returns an error. Lower costs rank first by convention, but the picker can implement deterministic selection, sampling, tie-breaking, or policy-local state. Dynamo continues to own discovery, eligibility, score validation, accounting, and reservation. +This feature replaces the worker-ranking part of Dynamo's routing pipeline. A `WorkerFilter` can exclude a host-eligible worker, a `WorkerScorer` assigns a finite cost to each remaining worker, Dynamo adds costs from all configured scorers, and a `WorkerPicker` chooses one row from the scored candidates. Filters run in declaration order. Each scorer receives all surviving workers in one call and writes one cost per worker. Rejecting every worker returns an error. Lower costs rank first by convention, but the picker can implement deterministic selection, sampling, tie-breaking, or policy-local state. Dynamo continues to own discovery, eligibility, score validation, accounting, and reservation. ```mermaid flowchart LR @@ -37,7 +37,7 @@ Write your own policy when no shipped policy expresses the rule you need. The re | Stage | Input | Output | Use this stage for | |---|---|---|---| | `WorkerFilter` | Request context and one host-eligible worker | Keep or reject | The rule is a hard requirement, not a ranking preference | -| `WorkerScorer` | Request context and one eligible worker | One finite cost | The rule ranks workers or adds a penalty | +| `WorkerScorer` | Request context, all surviving workers, and an aligned output slice | One finite cost per worker | The rule ranks workers or adds a penalty | | `WorkerPicker` | All eligible workers and their total costs | One row index | The rule samples, breaks ties, tracks policy state, or ignores total cost | | Policy factory | Router configuration, worker type, and routing partition | One `WorkerSelectionPolicy` | Prefill, decode, models, or routing groups need different components | @@ -50,12 +50,11 @@ Use `dynamo_kv_router::plugins` for plugin registration and these modules for pl | Module | Public API | |---|---| | `plugins::worker_selection` | `WorkerFilter`, `WorkerScorer`, `WorkerPicker`, `WorkerSelectionPolicy`, request context, worker signal accessors, configuration, and factories | -| `plugins::request_classifier` | `RequestClassifier`, `ClassifyRequest`, `ClassifyEvent`, configuration, and factories | | `plugins` | `RouterPluginRegistry` and the resolved `RouterPlugins` bundle | -The module organization changes no signal accessor, callback signature, signal meaning, or configuration format. Cache overlap, worker load, session metadata, and classification inputs retain their existing APIs. Dynamo owns scheduler queues, eligibility checks, reservations, lifecycle synchronization, and the default selector implementation. Low-level host interfaces such as `WorkerSelector` are used to connect Dynamo components; external plugins use `WorkerSelectionPolicy`. +Dynamo owns scheduler queues, eligibility checks, reservations, lifecycle synchronization, and the default selector implementation. Low-level host interfaces such as `WorkerSelector` are used to connect Dynamo components; external plugins use `WorkerSelectionPolicy`. -Existing plugin imports and the `WorkerSelectionPolicyRegistry` name remain available through compatibility re-exports until version 1.7. They refer to the same types and traits, so existing policies can register into `RouterPluginRegistry` without adapters. Migrate imports to `plugins::worker_selection` or `plugins::request_classifier`, rename the registry to `RouterPluginRegistry`, and use `register_worker_selection` for worker policies. The compatibility exports, registry alias, worker-only `register` method, and frontend `worker_selection_policy_factory` setter are scheduled for removal in 1.7. The signal methods themselves are unchanged. +Existing plugin imports and the `WorkerSelectionPolicyRegistry` name remain available through compatibility re-exports until version 1.7. They refer to the same types and traits, so existing policies can register into `RouterPluginRegistry` without adapters. Migrate imports to `plugins::worker_selection`, rename the registry to `RouterPluginRegistry`, and use `register_worker_selection` for worker policies. The compatibility exports, registry alias, worker-only `register` method, and frontend `worker_selection_policy_factory` setter are scheduled for removal in 1.7. ## Build the Policy @@ -125,7 +124,7 @@ impl WorkerFilter for MinimumDeviceOverlapFilter { fn keep( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, + candidate: WorkerCandidate<'_>, ) -> Result { let cache = candidate .cache() @@ -141,14 +140,13 @@ Pass filters to `WorkerSelectionPolicy::new_with_filters`. If the policy has no ### Score Workers -A scorer expresses a preference without excluding a worker. It returns one finite cost for one worker. Lower total cost is better by convention. +A scorer expresses a preference without excluding a worker. It writes one finite cost for each worker into a host-owned output slice. Lower total cost is better by convention. -This scorer uses the current number of active requests as its cost: +This scorer ranks workers by active requests above the batch minimum: ```rust use dynamo_kv_router::plugins::worker_selection::{ - WorkerCandidate, WorkerInputs, WorkerScorer, WorkerSelectionContext, - WorkerSelectionPolicyError, + WorkerCandidates, WorkerInputs, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicyError, }; struct ActiveRequestsScorer; @@ -161,16 +159,29 @@ impl WorkerScorer for ActiveRequestsScorer { fn score( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - let load = candidate - .load() - .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; - Ok(load.active_requests() as f64) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + let mut minimum = usize::MAX; + for candidate in candidates.iter() { + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + minimum = minimum.min(load.active_requests()); + } + for (candidate, cost) in candidates.iter().zip(costs) { + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + *cost = (load.active_requests() - minimum) as f64; + } + Ok(()) } } ``` +Dynamo calls `score` once per scorer after filtering. The output slice matches the candidate order and length. Write every entry with a finite cost; an unwritten or invalid cost stops selection before picking. + A policy can stack multiple scorers. Dynamo calls them in declaration order and adds their costs. Dynamo rejects a non-finite contribution or total. ### Pick a Worker @@ -320,59 +331,17 @@ cargo check --manifest-path "$POLICY_DIR/catalog/Cargo.toml" Add one focused test for each policy decision and one registration test for every type name. -## Register a Request Classifier - -**Experimental.** Request classifiers use the same statically linked catalog as worker filters, scorers, and pickers. Keep the catalog's single `register` function and call `register_request_classifier` for each classifier type. `RouterPluginRegistry` also accepts the existing worker-selection providers; `WorkerSelectionPolicyRegistry` remains an alias, so existing catalogs compile unchanged. - -Implement `RequestClassifier` in your policy crate. Its provider validates `RequestClassifierParameters` at startup and returns a `RequestClassifierFactory`: a closure that receives `RequestClassifierContext` and creates a fresh `Box` for each routed model. The shared router builder supplies the cached capacity context for both HTTP discovery and Python `KvRouter.generate`. Register that provider alongside your worker-selection providers: - -```rust -use std::sync::Arc; -use dynamo_kv_router::plugins::RouterPluginRegistry; - -pub fn register(registry: &mut RouterPluginRegistry) -> Result<(), Box> { - acme_worker_policy::register(registry)?; - registry.register_request_classifier("acme-admission", Arc::new(acme_admission::provider))?; - Ok(()) -} -``` - -The provider signature is: - -```rust -use dynamo_kv_router::plugins::request_classifier::{ - RequestClassifierFactory, RequestClassifierParameters, RequestClassifierProviderError, -}; - -pub fn provider( - parameters: &RequestClassifierParameters, -) -> Result; -``` - -Select the classifier in the same `--router-policy-config` YAML: - -```yaml -request_classifier: - type: acme-admission - parameters: - max_in_flight: 32 -``` - -The parameter mapping belongs to the plugin; `max_in_flight` above is an example plugin setting. Omit `request_classifier` to retain pass-through admission. Unknown types and invalid parameters fail startup. Build and link the catalog with the existing `custom-policy` workflow below; no second catalog export or build flag is required. - -The discovery-backed HTTP frontend and Python `KvRouter.generate` path install classifiers on their KV routers. Classification applies to decode/aggregated admission before queue ordering and worker selection. Selection is fixed at frontend startup and is process-wide; per-model queue profiles do not select different classifier types. A classifier can change the policy class, due time, and scheduling cost through the existing `ClassifyRequest` API. Dynamo retains queueing, worker selection, reservations, and lifecycle delivery. - -### Shared Plugin Construction +## Shared Plugin Construction The catalog registers plugin providers once. `RouterPluginRegistry::resolve_plugins` validates the selected configuration and returns a `RouterPlugins` bundle containing the configured factories. Both the HTTP frontend and Python router pass this bundle to the shared router construction path. Each router receives fresh plugin instances; factories run during construction, not for each request. -Rust embedders can use the same setup: +Rust embedders start with the host registry, which includes the default policy, then register their catalog: ```rust -use dynamo_kv_router::plugins::RouterPluginRegistry; use dynamo_llm::entrypoint::input::http::HttpFrontend; +use dynamo_llm::kv_router::plugins::router_plugin_registry; -let mut registry = RouterPluginRegistry::default(); +let mut registry = router_plugin_registry(); acme_routing_catalog::register(&mut registry)?; let plugins = registry.resolve_plugins(&kv_router_config)?; HttpFrontend::default() @@ -391,24 +360,22 @@ flowchart LR HTTP --> Build[Shared router construction] Python --> Build Build --> Selector[Per-router worker selector] - Build --> Classifier[Per-router request classifier] ``` -The host's `RouterPluginBuilder` passes worker selection through the shared selection core and installs the remaining plugins before the router is exposed to requests. The worker policy is constructed once per partition, including the probe for its required inputs. Adding another plugin trait requires a typed registration slot, a factory in the bundle, and its construction hook. Entry points continue to carry one bundle. Execution and lifecycle callbacks stay on each trait; the bundle does not add per-request dispatch. - -The compatibility paths described above remain available until 1.7. An empty bundle retains the default selector and pass-through admission. - -The disaggregated prefill hop and query-only probes do not run classifiers. Stateful low-level `best_worker` calls also lack classifier lifecycle enrollment. Offline replay and standalone selection reject `request_classifier` configuration because they cannot run its lifecycle. +Each worker policy is constructed once per routing partition. An empty bundle retains the default selector. ## Available Signals -Request context and worker identity are always available. Dynamo calculates optional per-worker signals only for groups that a filter, scorer, or picker requests. +Worker identity and ordinary request metadata are always available. Dynamo calculates optional per-worker signals only for groups that a filter, scorer, or picker requests. + +Routing cache resources start only if a component requests `CACHE`. `serve_indexer` and `enable_session_prefix_index` also require `CACHE`. ### Request Context | Accessor | Meaning | |---|---| -| `request_blocks()` | Incoming prompt size in KV blocks | +| `prompt_tokens()` | Exact incoming prompt token count | +| `request_blocks()` | Incoming prompt size in KV blocks, rounded up | | `block_size()` | Tokens in one KV block | | `tracks_prefill_tokens()` | Whether the request contributes to prefill-load tracking | | `session_context()` | Optional session metadata described below | @@ -466,17 +433,20 @@ If a component needs no optional worker data, return `WorkerInputs::NONE`. Combi | `CACHE` | `device_overlap_blocks()` | Device-resident prefix overlap in blocks | | `CACHE` | `host_overlap_blocks()` | Host-pinned prefix overlap in blocks | | `CACHE` | `disk_overlap_blocks()` | Disk prefix overlap in blocks | -| `CACHE` | `shared_beyond_device_blocks()` | Shared-cache hits beyond the device-resident prefix | +| `CACHE` | `accounting_cache_estimate()` | Accounting estimate as weighted KV blocks and rounded tokens; zero if missing, not clamped to prompt length | +| `CACHE` | `has_tier_matches()` | Whether the lookup contains any GPU, CPU, or disk matches before filtering; `false` means only accounting estimates or no cache data were supplied | +| `CACHE` | `shared_hits()` | `None` if no shared result was supplied; otherwise unweighted ranges with `total_hits` and `hits_beyond(prefix)` | +| `LOAD` | `is_available()` | Whether the host supplied a load observation; distinguishes missing data from an observed idle worker | | `LOAD` | `active_prefill_tokens()` | Tokens currently active in the worker's prefill stage | | `LOAD` | `decode_cost_blocks()` | Projected active decode footprint, including this request's additional active blocks | | `LOAD` | `active_requests()` | Requests currently active on the worker | | `PREFERRED_TAINT` | `preferred_taint_multiplier()` | Optional cost multiplier from matching preferred routing taints | -The cache accessors return raw tier counts. A missing tier or worker entry is zero; Dynamo does not substitute its weighted effective-overlap estimate. Each custom scorer chooses how to combine the raw counts. +The GPU, CPU, and disk overlap accessors return raw tier counts. A missing tier or worker entry is zero; Dynamo does not substitute its weighted effective-overlap estimate. Each custom scorer chooses how to combine the raw counts. -A filter or scorer reads requested groups through `WorkerCandidate::cache()` or `load()`. A picker reads index-aligned arrays through `WorkerInputView`. Each component must request every optional group that it reads. +A filter or scorer reads groups through `WorkerCandidate::cache()` or `load()`. A picker reads index-aligned views through `WorkerInputView`; its cache view supports `get(row)` and `iter()`. Each component must declare every group it reads; another component requesting a group does not grant access. -`WorkerCandidate::preferred_taint_multiplier()` and `ScoredWorkerCandidate::preferred_taint_multiplier()` return the optional cost multiplier from preferred routing constraints. A filter, scorer, or picker must request `WorkerInputs::PREFERRED_TAINT` before reading the multiplier. Without that declaration, Dynamo does not materialize the multiplier. Exact hard-pinned requests also do not materialize it. Required routing constraints remain host-enforced eligibility rules. +`WorkerCandidate::preferred_taint_multiplier()` and `ScoredWorkerCandidate::preferred_taint_multiplier()` return the optional cost multiplier from preferred routing constraints. A filter, scorer, or picker must request `WorkerInputs::PREFERRED_TAINT` before reading the multiplier. Without that declaration, the component receives `None`, even when another component requested the multiplier. Exact hard-pinned requests also do not materialize it. Required routing constraints remain host-enforced eligibility rules. ## Link the Policy Into Dynamo @@ -572,16 +542,6 @@ Standalone EPP supplies `WorkerType::Aggregated` because it selects from one ful -## Request Classifier Signals and Placement - -Rust request classifiers can defer admission while retaining independently pollable futures. `KvRouter::request_classifier_context()` supplies the router's cached worker view when constructing a classifier: - -- `block_size()` is the number of tokens per KV block. Each entry in `workers()` identifies a registered worker/rank and its advertised `total_kv_blocks()`, or `None` if capacity was not advertised. Their product is total capacity, not currently free space. The view follows existing discovery updates and does not probe worker health. -- `ClassifyRequest::progress()` returns a read-only context high-water mark, initialized from `input_tokens()` and raised by host observations of prompt plus generated tokens. Clones share a monotonic counter across migration retries. A new request lifecycle gets a fresh counter, even if it reuses a request ID. This measures logical tokens, not physical KV occupancy. -- `set_worker_selection_target(worker)` replaces the request's soft affinity preference; `clear_worker_selection_target()` removes that preference. Hard pins and caller eligibility constraints remain authoritative. A custom picker can fall back when the preferred worker is ineligible. The classifier's `Sent` event reports the worker actually used. - -Holding a classification future pauses admission before dispatch; it does not interrupt an already running generation. Worker filters, scorers, and pickers continue to own placement decisions within Dynamo's eligibility rules. - ## Policy Contract - Return `true` from a filter to keep a worker and `false` to reject it. @@ -596,3 +556,21 @@ Holding a classification future pauses admission before dispatch; it does not in - If a signal adds work, storage, allocation, or another scan, run the worker-selection benchmark. The [example README](https://github.com/ai-dynamo/dynamo/blob/main/examples/router/custom-policy-example/README.md) contains the in-tree package names and build-check commands. For the built-in cost model, see [Routing Concepts](routing-concepts.md). For the standalone selection lifecycle, see [Standalone Selection Service](standalone-selection.md). + +## Default Policy Plugin + +To give a worker role its own default-policy settings, select `dynamo-default-cost-fn`: + +```yaml +worker_selection: + aggregated: tuned-default + instances: + - name: tuned-default + type: dynamo-default-cost-fn + parameters: + overlap_score_credit: 1.0 + prefill_load_scale: 1.0 + router_temperature: 0.0 +``` + +The provider also accepts `overlap_score_credit_decay`, `decode_active_request_weight`, `host_cache_hit_weight`, `disk_cache_hit_weight`, and `shared_cache_multiplier`. Omitted parameters inherit router configuration. Values must be finite and non-negative. Per-request score and temperature overrides do not apply to this policy. The builtin skips cache inputs at zero overlap credit and for plain disaggregated decode. diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/router-operations.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/router-operations.md index 2f925bd67d0f..bbbf00ed09bf 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/router-operations.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/router-operations.md @@ -130,7 +130,7 @@ graph TD Request-plane transport is independent of KV event transport. The request plane (`DYN_REQUEST_PLANE` or `--request-plane`) controls how requests reach workers. ZMQ is the default event plane for every discovery backend, including etcd. Set `--event-plane nats` or `DYN_EVENT_PLANE=nats` to opt into NATS Core. With the default ZMQ event plane, the router does not require NATS; the selected discovery backend still determines whether etcd is required. When using the NATS event plane, NATS is initialized automatically; set `NATS_SERVER=nats://...` to override the default `localhost:4222`. -When `--router-kv-overlap-score-credit` is set to 0, no KV indexer is created and prefix matching is disabled. When `--no-router-kv-events` is set, a KV indexer is still created but no event subscriber is launched; the router predicts cache state from its own routing decisions using the selected approximate cache policy. +The worker-selection policy's `WorkerInputs::CACHE` declaration controls whether the router creates a routing indexer. Setting `--router-kv-overlap-score-credit` to 0 changes device-cache scoring but does not disable indexing. When the policy requests `CACHE` and `--no-router-kv-events` is set, the router creates an approximate indexer without an event subscriber and predicts cache state from its own routing decisions. A policy without `CACHE` starts neither an indexer nor an event subscriber. Backend KV event publishing is independent of the frontend's `--no-router-kv-events` flag. The frontend flag controls whether the router consumes events; backend flags control whether workers publish them. If the router is not consuming events, workers that still publish will waste resources but cause no harm. diff --git a/docs/fern/pages/reference/components/frontend-configuration.mdx b/docs/fern/pages/reference/components/frontend-configuration.mdx index 29175d0993ef..94f66f8502c7 100644 --- a/docs/fern/pages/reference/components/frontend-configuration.mdx +++ b/docs/fern/pages/reference/components/frontend-configuration.mdx @@ -135,13 +135,13 @@ router. See [Router Guide](../../developer-guide/knowledge-base/modular-componen ### KV scoring and cache locality - Preset for KV load-aware routing without cache-reuse signals; implies `--router-mode kv`. + Preset for KV load-aware routing; implies `--router-mode kv`. Disables device-cache credit, KV event consumption, and remote/shared cache indexers. The worker-selection policy's `CACHE` declaration still controls local approximate indexing. Environment variable: `DYN_ROUTER_LOAD_AWARE` - Credit multiplier for device-local prefix overlap. The value must be finite and nonnegative. + Credit multiplier for device-local prefix overlap. The value must be finite and nonnegative. Setting it to zero does not disable indexing; cache setup follows the worker-selection policy's `WorkerInputs::CACHE` declaration. Values greater than `1.0` give device overlap extra credit, but adjusted prefill cost is clamped at zero. See [Configuration and Tuning](../../developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md#tuning-guidelines). diff --git a/docs/fern/pages/reference/observability/metrics-catalog.mdx b/docs/fern/pages/reference/observability/metrics-catalog.mdx index a5962adcd4df..4a6c54d47466 100644 --- a/docs/fern/pages/reference/observability/metrics-catalog.mdx +++ b/docs/fern/pages/reference/observability/metrics-catalog.mdx @@ -348,7 +348,7 @@ The frontend registers these metrics when queueing is enabled by `--router-queue ### KV indexer metrics - KV cache events applied to the router's radix-tree index. Includes events applied to the device tier and lower tiers such as host-pinned memory and disk. Appears only when `--router-kv-overlap-score-credit` is greater than 0 and workers publish KV events. Labeled by `status` and `event_type` — see [Metric-specific labels](metric-labels.mdx#metric-specific-labels). + KV cache events applied to the router's radix-tree index. Includes events applied to the device tier and lower tiers such as host-pinned memory and disk. Appears when the worker-selection policy requests `WorkerInputs::CACHE`, the router consumes KV events, and workers publish them. Labeled by `status` and `event_type` — see [Metric-specific labels](metric-labels.mdx#metric-specific-labels). The standalone indexer exposes the device-tier-only counter `dynamo_kvrouter_kv_cache_events_applied`; see [Standalone KV Indexer](../../developer-guide/knowledge-base/modular-components/router/standalone-indexer.md). diff --git a/docs/fern/pages/use-cases/agents/priority-scheduling.md b/docs/fern/pages/use-cases/agents/priority-scheduling.md index e81785aaec9a..679967995425 100644 --- a/docs/fern/pages/use-cases/agents/priority-scheduling.md +++ b/docs/fern/pages/use-cases/agents/priority-scheduling.md @@ -52,7 +52,7 @@ The router queue only matters when requests are held before dispatch. If a reque (strict_priority, due_at, configured_policy_key) ``` -The strict tier is compared first. Within that tier, every request with a classifier-provided `due_at` is scheduled ahead of every request without one (an unset due time sorts last) before FCFS, LCFS, or Weighted Shortest Processing Time (WSPT) applies its configured policy key. Sustained deadline-bearing traffic can therefore starve non-deadline requests in the same class. A `due_at` is set only by a router request classifier; select a [linked request classifier](../../developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx#register-a-request-classifier) through router policy YAML. +The strict tier is compared first. Within that tier, every request with a classifier-provided `due_at` is scheduled ahead of every request without one (an unset due time sorts last) before FCFS, LCFS, or Weighted Shortest Processing Time (WSPT) applies its configured policy key. Sustained deadline-bearing traffic can therefore starve non-deadline requests in the same class. A `due_at` is set only by a router request classifier. The default policy is `fcfs`, which uses the priority value as a positive arrival-time bump. Higher values move the request earlier in the queue. Negative priority values are clamped to zero for router queueing, so a request cannot be pushed behind normal first-come, first-served ordering by sending a negative priority. diff --git a/examples/router/custom-policy-example/README.md b/examples/router/custom-policy-example/README.md index 15087c3bf518..7b26c598bc62 100644 --- a/examples/router/custom-policy-example/README.md +++ b/examples/router/custom-policy-example/README.md @@ -20,7 +20,9 @@ policy crate -> catalog crate -> router-policy YAML -> frontend or EPP binary Dynamo owns discovery, eligibility, queueing, validation, reservations, accounting, and metrics. A policy sees only eligible workers and returns one candidate row. -Preferred routing taints are optional candidate metadata. A filter, scorer, or picker must request `WorkerInputs::PREFERRED_TAINT` before reading `preferred_taint_multiplier()` from a candidate; otherwise, Dynamo does not materialize the multiplier. Exact hard-pinned requests also do not materialize it. Required routing taints remain Dynamo eligibility rules. +Declare `WorkerInputs::CACHE` to read cache data through `candidate.cache()` (filter/scorer) or `input.cache()` (picker); otherwise these return `None`. Each cache row includes worker overlaps, `has_tier_matches()`, and `shared_hits()`. + +Preferred routing taints are optional candidate metadata. A filter, scorer, or picker must request `WorkerInputs::PREFERRED_TAINT` before reading `preferred_taint_multiplier()` from a candidate; otherwise, that component receives `None`, even if another component requested it. Exact hard-pinned requests also do not materialize it. Required routing taints remain Dynamo eligibility rules. ## Pick a Starting Point @@ -31,7 +33,7 @@ Preferred routing taints are optional candidate metadata. A filter, scorer, or p | `disagg-filter-score-pick` | Prefill and decode workers each need the complete policy flow | | `simple-stacked-score-pick` | Multiple scorer costs compose before one picker runs | -The `simple-filter-score-pick` policy shows the complete pipeline. It filters on minimum device overlap and scores active requests. Its picker normally selects the lowest cost. Tool-result turns select the worker with the most device overlap through `session_context().input_trigger()`. +The `simple-filter-score-pick` policy filters on minimum device overlap and scores active requests above the least-loaded worker. Its picker normally selects the lowest cost. Tool-result turns select the worker with the most device overlap through `session_context().input_trigger()`. The [`soft-pin-repin` policy](soft-pin-repin/README.md) documents its load threshold, soft-binding behavior, and two-Mocker `A -> B -> B` walkthrough. diff --git a/examples/router/custom-policy-example/disagg-filter-score-pick/src/filter.rs b/examples/router/custom-policy-example/disagg-filter-score-pick/src/filter.rs index b2e83f2ad7d9..313b4d1dca76 100644 --- a/examples/router/custom-policy-example/disagg-filter-score-pick/src/filter.rs +++ b/examples/router/custom-policy-example/disagg-filter-score-pick/src/filter.rs @@ -19,7 +19,7 @@ impl WorkerFilter for MinimumDeviceOverlapFilter { fn keep( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, + candidate: WorkerCandidate<'_>, ) -> Result { let cache = candidate .cache() diff --git a/examples/router/custom-policy-example/disagg-filter-score-pick/src/scorer.rs b/examples/router/custom-policy-example/disagg-filter-score-pick/src/scorer.rs index ee666d84a31f..52a7f703a0b5 100644 --- a/examples/router/custom-policy-example/disagg-filter-score-pick/src/scorer.rs +++ b/examples/router/custom-policy-example/disagg-filter-score-pick/src/scorer.rs @@ -4,7 +4,8 @@ //! Load scorers for prefill and decode routing partitions. use dynamo_kv_router::{ - WorkerCandidate, WorkerInputs, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicyError, + WorkerCandidates, WorkerInputs, WorkerScorer, WorkerSelectionContext, + WorkerSelectionPolicyError, }; /// Scores prefill workers by active work and uncached request blocks. @@ -18,19 +19,23 @@ impl WorkerScorer for PrefillLoadScorer { fn score( &mut self, context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - let load = candidate - .load() - .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; - let cache = candidate - .cache() - .ok_or_else(|| WorkerSelectionPolicyError::failed("cache input unavailable"))?; - let active_prefill_blocks = - load.active_prefill_tokens() as f64 / context.block_size() as f64; - let uncached_request_blocks = - (context.request_blocks() as f64 - cache.device_overlap_blocks()).max(0.0); - Ok(active_prefill_blocks + uncached_request_blocks) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + let cache = candidate + .cache() + .ok_or_else(|| WorkerSelectionPolicyError::failed("cache input unavailable"))?; + let active_prefill_blocks = + load.active_prefill_tokens() as f64 / context.block_size() as f64; + let uncached_request_blocks = + (context.request_blocks() as f64 - cache.device_overlap_blocks()).max(0.0); + *cost = active_prefill_blocks + uncached_request_blocks; + } + Ok(()) } } @@ -47,11 +52,15 @@ impl WorkerScorer for DecodeLoadScorer { fn score( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - let load = candidate - .load() - .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; - Ok(load.decode_cost_blocks()) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + *cost = load.decode_cost_blocks(); + } + Ok(()) } } diff --git a/examples/router/custom-policy-example/simple-filter-score-pick/src/filter.rs b/examples/router/custom-policy-example/simple-filter-score-pick/src/filter.rs index 6fb790a8c5ec..78fd732503e9 100644 --- a/examples/router/custom-policy-example/simple-filter-score-pick/src/filter.rs +++ b/examples/router/custom-policy-example/simple-filter-score-pick/src/filter.rs @@ -22,7 +22,7 @@ impl WorkerFilter for MinimumDeviceOverlapFilter { fn keep( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, + candidate: WorkerCandidate<'_>, ) -> Result { let cache = candidate .cache() diff --git a/examples/router/custom-policy-example/simple-filter-score-pick/src/scorer.rs b/examples/router/custom-policy-example/simple-filter-score-pick/src/scorer.rs index a9429e55de94..13c3b3cfbd12 100644 --- a/examples/router/custom-policy-example/simple-filter-score-pick/src/scorer.rs +++ b/examples/router/custom-policy-example/simple-filter-score-pick/src/scorer.rs @@ -4,10 +4,11 @@ //! Active-request scorer for the `simple-filter-score-pick` policy. use dynamo_kv_router::plugins::worker_selection::{ - WorkerCandidate, WorkerInputs, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicyError, + WorkerCandidates, WorkerInputs, WorkerScorer, WorkerSelectionContext, + WorkerSelectionPolicyError, }; -/// Scores each candidate by its current number of active requests. +/// Scores active requests above the least-loaded surviving candidate. pub(crate) struct ActiveRequestsScorer; impl WorkerScorer for ActiveRequestsScorer { @@ -16,15 +17,26 @@ impl WorkerScorer for ActiveRequestsScorer { WorkerInputs::LOAD } - /// Returns the active-request count as a lower-is-better cost. + /// Find the batch minimum and write one relative load cost per worker. fn score( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - let load = candidate - .load() - .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; - Ok(load.active_requests() as f64) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + let mut minimum = usize::MAX; + for candidate in candidates.iter() { + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + minimum = minimum.min(load.active_requests()); + } + for (candidate, cost) in candidates.iter().zip(costs) { + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + *cost = (load.active_requests() - minimum) as f64; + } + Ok(()) } } diff --git a/examples/router/custom-policy-example/simple-stacked-score-pick/src/scorer/active_requests.rs b/examples/router/custom-policy-example/simple-stacked-score-pick/src/scorer/active_requests.rs index e57d17cafa0b..32f0dc766ace 100644 --- a/examples/router/custom-policy-example/simple-stacked-score-pick/src/scorer/active_requests.rs +++ b/examples/router/custom-policy-example/simple-stacked-score-pick/src/scorer/active_requests.rs @@ -4,7 +4,8 @@ //! Active-request cost for the stacked scorer stage. use dynamo_kv_router::{ - WorkerCandidate, WorkerInputs, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicyError, + WorkerCandidates, WorkerInputs, WorkerScorer, WorkerSelectionContext, + WorkerSelectionPolicyError, }; pub(crate) struct ActiveRequestsScorer; @@ -17,11 +18,15 @@ impl WorkerScorer for ActiveRequestsScorer { fn score( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - let load = candidate - .load() - .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; - Ok(load.active_requests() as f64) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + *cost = load.active_requests() as f64; + } + Ok(()) } } diff --git a/examples/router/custom-policy-example/simple-stacked-score-pick/src/scorer/uncached_blocks.rs b/examples/router/custom-policy-example/simple-stacked-score-pick/src/scorer/uncached_blocks.rs index 3c0ca010a4f0..63759d767a2b 100644 --- a/examples/router/custom-policy-example/simple-stacked-score-pick/src/scorer/uncached_blocks.rs +++ b/examples/router/custom-policy-example/simple-stacked-score-pick/src/scorer/uncached_blocks.rs @@ -4,7 +4,8 @@ //! Uncached-block cost for the stacked scorer stage. use dynamo_kv_router::{ - WorkerCandidate, WorkerInputs, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicyError, + WorkerCandidates, WorkerInputs, WorkerScorer, WorkerSelectionContext, + WorkerSelectionPolicyError, }; pub(crate) struct UncachedBlocksScorer; @@ -17,11 +18,15 @@ impl WorkerScorer for UncachedBlocksScorer { fn score( &mut self, context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - let cache = candidate - .cache() - .ok_or_else(|| WorkerSelectionPolicyError::failed("cache input unavailable"))?; - Ok((context.request_blocks() as f64 - cache.device_overlap_blocks()).max(0.0)) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + let cache = candidate + .cache() + .ok_or_else(|| WorkerSelectionPolicyError::failed("cache input unavailable"))?; + *cost = (context.request_blocks() as f64 - cache.device_overlap_blocks()).max(0.0); + } + Ok(()) } } diff --git a/lib/bench/kv_router/dc_ckf_relay_bench.rs b/lib/bench/kv_router/dc_ckf_relay_bench.rs index eb68905e8901..116995d4022d 100644 --- a/lib/bench/kv_router/dc_ckf_relay_bench.rs +++ b/lib/bench/kv_router/dc_ckf_relay_bench.rs @@ -992,7 +992,7 @@ async fn drive_phase( tokio::task::spawn_blocking(move || { let ready = Arc::new(Barrier::new(issuer_count + 1)); let start = Arc::new(Barrier::new(issuer_count + 1)); - let started = Arc::new(OnceLock::new()); + let started = Arc::new(OnceLock::::new()); let (elapsed, outputs) = std::thread::scope(|scope| { let mut handles = Vec::with_capacity(issuer_count); for (issuer, shard) in shards.into_iter().enumerate() { diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index 64bf1e40381c..692be12b8ebd 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -2054,6 +2054,16 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +[[package]] +name = "dynamo-custom-policy-builtin" +version = "1.6.0" +dependencies = [ + "dynamo-kv-router", + "fastrand", + "parking_lot", + "serde", +] + [[package]] name = "dynamo-data-gen" version = "1.6.0" @@ -2150,6 +2160,7 @@ dependencies = [ "derive-getters", "derive_builder", "dialoguer", + "dynamo-custom-policy-builtin", "dynamo-kv-router", "dynamo-memory", "dynamo-mocker", @@ -2248,6 +2259,7 @@ dependencies = [ "bytes", "dashmap", "derive_builder", + "dynamo-custom-policy-builtin", "dynamo-data-gen", "dynamo-kv-router", "dynamo-tokens", diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index 6f8ff8c80676..65272a5ef4f6 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -2106,6 +2106,8 @@ name = "dynamo-custom-policy-builtin" version = "1.6.0" dependencies = [ "dynamo-kv-router", + "fastrand", + "parking_lot", "serde", ] @@ -2205,6 +2207,7 @@ dependencies = [ "derive-getters", "derive_builder", "dialoguer", + "dynamo-custom-policy-builtin", "dynamo-kv-router", "dynamo-memory", "dynamo-mocker", @@ -2308,6 +2311,7 @@ dependencies = [ "bytes", "dashmap", "derive_builder", + "dynamo-custom-policy-builtin", "dynamo-data-gen", "dynamo-kv-router", "dynamo-tokens", diff --git a/lib/bindings/python/Cargo.toml b/lib/bindings/python/Cargo.toml index 4645acf8374e..571188d969c8 100644 --- a/lib/bindings/python/Cargo.toml +++ b/lib/bindings/python/Cargo.toml @@ -28,7 +28,6 @@ default = ["custom-policy"] # router-policy YAML without rebuilding. A private image replaces only the catalog dependency, so # its policies are added alongside the shipped ones rather than displacing them. custom-policy = [ - "dep:dynamo-custom-policy-builtin", "dep:dynamo-worker-selection-policy-catalog", "dynamo-kv-router/standalone-selection", ] @@ -98,7 +97,7 @@ uuid = { version = "1.18.1" } # kv-indexer / slot-tracker / shared kv-router types dynamo-kv-router = { path = "../../kv-router" } -dynamo-custom-policy-builtin = { path = "../../router-plugins/builtin", optional = true } +dynamo-custom-policy-builtin = { path = "../../router-plugins/builtin" } dynamo-worker-selection-policy-catalog = { path = "../../router-plugins/catalog", optional = true } clap = { version = "4.5", features = ["derive"], optional = true } tracing-subscriber = { version = "0.3", features = ["env-filter"], optional = true } diff --git a/lib/bindings/python/rust/lib.rs b/lib/bindings/python/rust/lib.rs index 1a4b75f2729b..12ff613ac5ae 100644 --- a/lib/bindings/python/rust/lib.rs +++ b/lib/bindings/python/rust/lib.rs @@ -40,7 +40,7 @@ use dynamo_runtime::{ traits::DistributedRuntimeProvider, }; -#[cfg(any(feature = "custom-policy", feature = "select-service"))] +#[cfg(feature = "select-service")] use dynamo_kv_router::plugins::RouterPluginRegistry; use dynamo_kv_router::{KvRouterConfig, plugins::RouterPlugins}; use dynamo_llm::entrypoint::RouterConfig; @@ -426,26 +426,29 @@ pub(crate) fn router_plugins(config: &KvRouterConfig) -> anyhow::Result RouterPluginRegistry { - #[cfg(feature = "custom-policy")] - { - dynamo_llm::kv_router::plugins::router_plugin_registry() - } - - #[cfg(not(feature = "custom-policy"))] - { - RouterPluginRegistry::default() - } + dynamo_llm::kv_router::plugins::router_plugin_registry() } #[cfg(feature = "custom-policy")] fn register_core_with_router_plugins(m: &Bound<'_, PyModule>) -> PyResult<()> { - let mut registry = RouterPluginRegistry::default(); + let mut registry = dynamo_kv_router::plugins::RouterPluginRegistry::default(); // The policies Dynamo ships register first, so a replaced catalog that reuses one of their // type names fails here instead of silently overriding it. dynamo_custom_policy_builtin::register(&mut registry) diff --git a/lib/bindings/python/rust/llm/entrypoint.rs b/lib/bindings/python/rust/llm/entrypoint.rs index 256f3b1e5ffc..7d1347bae907 100644 --- a/lib/bindings/python/rust/llm/entrypoint.rs +++ b/lib/bindings/python/rust/llm/entrypoint.rs @@ -1026,26 +1026,19 @@ pub fn run_input<'p>( .kv_router_config, ) .map_err(to_pyerr)?; - let has_router_plugin = !plugins.is_empty(); - if has_router_plugin - && !engine_config + validate_router_plugin_input( + &plugins, + &input_enum, + engine_config .inner .local_model() .router_config() .router_mode - .is_kv_routing() - { - return Err(PyValueError::new_err( - "linked router plugins require --router-mode kv", - )); - } - if has_router_plugin && !matches!(&input_enum, Input::Http) { - return Err(PyValueError::new_err( - "linked router plugins require HTTP frontend input", - )); - } + .is_kv_routing(), + ) + .map_err(PyValueError::new_err)?; crate::future_into_py(py, async move { - if has_router_plugin { + if matches!(&input_enum, Input::Http) { HttpFrontend::default() .frontend_route_extensions(frontend_route_extensions) .plugins(plugins) @@ -1066,9 +1059,57 @@ pub fn run_input<'p>( }) } +fn validate_router_plugin_input( + plugins: &dynamo_kv_router::plugins::RouterPlugins, + input: &Input, + is_kv_routing: bool, +) -> Result<(), &'static str> { + if plugins.has_custom_plugins() { + if !is_kv_routing { + return Err("linked router plugins require --router-mode kv"); + } + if !matches!(input, Input::Http) { + return Err("linked router plugins require HTTP frontend input"); + } + } + Ok(()) +} + pub fn to_pyerr(err: E) -> PyErr where E: Display, { PyException::new_err(format!("{}", err)) } + +#[cfg(test)] +mod plugin_input_tests { + use super::*; + use dynamo_kv_router::plugins::RouterPlugins; + + #[test] + fn resolved_builtin_supports_stock_inputs_and_routing_modes() { + let plugins = crate::router_plugins(&RsKvRouterConfig::default()).unwrap(); + assert!(plugins.worker_selection().is_some()); + for input in [Input::Http, Input::Grpc, Input::Stdin, Input::Text] { + for is_kv in [false, true] { + assert!(validate_router_plugin_input(&plugins, &input, is_kv).is_ok()); + } + } + } + + #[test] + fn explicit_policy_retains_frontend_restrictions() { + let plugins = RouterPlugins::default() + .with_worker_selection(dynamo_custom_policy_builtin::default_factory()); + assert!(validate_router_plugin_input(&plugins, &Input::Http, true).is_ok()); + assert_eq!( + validate_router_plugin_input(&plugins, &Input::Http, false), + Err("linked router plugins require --router-mode kv") + ); + assert_eq!( + validate_router_plugin_input(&plugins, &Input::Grpc, true), + Err("linked router plugins require HTTP frontend input") + ); + } +} diff --git a/lib/bindings/python/rust/llm/kv.rs b/lib/bindings/python/rust/llm/kv.rs index 10602d3dc5f4..f67ebf288eb7 100644 --- a/lib/bindings/python/rust/llm/kv.rs +++ b/lib/bindings/python/rust/llm/kv.rs @@ -1934,7 +1934,7 @@ async fn create_kv_router_from_endpoint( .as_ref() .map(|cfg| cfg.use_remote_indexer || cfg.serve_indexer) .unwrap_or(false); - let needs_policy_role = plugins.worker_selection().is_some(); + let needs_policy_role = plugins.has_custom_worker_selection(); let (model_name, policy_model_name, enable_eagle, worker_role, policy_worker_role, load_source) = { let maybe_card = if needs_model_name || needs_policy_role { let wait_secs: u64 = std::env::var("DYN_ROUTER_MODEL_CARD_WAIT_SECS") @@ -2032,7 +2032,11 @@ async fn create_kv_router_from_endpoint( // Preserve the model card's role and display name, which can differ // from the metric role and the routing partition name. - let plugins = if let Some(factory) = plugins.worker_selection().cloned() { + let plugins = if let Some(factory) = plugins + .worker_selection() + .filter(|_| needs_policy_role) + .cloned() + { let policy_worker_role = policy_worker_role .expect("a configured worker-selection policy waits for a typed model card above"); let policy_model_name = policy_model_name.unwrap_or_default(); diff --git a/lib/kv-router/Cargo.toml b/lib/kv-router/Cargo.toml index 2045158ecf18..420b11e87d31 100644 --- a/lib/kv-router/Cargo.toml +++ b/lib/kv-router/Cargo.toml @@ -103,8 +103,9 @@ harness = false [[bench]] name = "worker_selection" harness = false +required-features = ["bench"] [[bench]] name = "selection_core" harness = false -required-features = ["standalone-selection"] +required-features = ["standalone-selection", "bench"] diff --git a/lib/kv-router/benches/selection_core.rs b/lib/kv-router/benches/selection_core.rs index b472c21b1a99..cfe3bd52158e 100644 --- a/lib/kv-router/benches/selection_core.rs +++ b/lib/kv-router/benches/selection_core.rs @@ -45,6 +45,12 @@ fn core_with_workers( 1, CancellationToken::new(), SelectionCacheConfig::default(), + std::sync::Arc::new(|config, role, _| { + dynamo_kv_router::WorkerSelectionPolicy::reference( + config.clone(), + role.default_selector_label(), + ) + }), ) .expect("core"); runtime.block_on(async { diff --git a/lib/kv-router/benches/worker_selection.rs b/lib/kv-router/benches/worker_selection.rs index a0e9a51d28f1..c1af90cf007c 100644 --- a/lib/kv-router/benches/worker_selection.rs +++ b/lib/kv-router/benches/worker_selection.rs @@ -14,8 +14,8 @@ use dynamo_kv_router::protocols::{ }; use dynamo_kv_router::scheduling::{OverlapSignals, ScheduleMode}; use dynamo_kv_router::{ - DefaultWorkerSelector, KvRouterConfig, SchedulingRequest, WorkerCandidate, WorkerFilter, - WorkerInputView, WorkerInputs, WorkerLoadProjection, WorkerPicker, WorkerScorer, + DefaultWorkerSelector, KvRouterConfig, SchedulingRequest, WorkerCandidate, WorkerCandidates, + WorkerFilter, WorkerInputView, WorkerInputs, WorkerLoadProjection, WorkerPicker, WorkerScorer, WorkerSelectionContext, WorkerSelectionInput, WorkerSelectionPolicy, WorkerSelectionPolicyError, WorkerSelector, }; @@ -54,7 +54,7 @@ impl WorkerFilter for KeepAllFilter { fn keep( &mut self, _context: &WorkerSelectionContext<'_>, - _candidate: &WorkerCandidate, + _candidate: WorkerCandidate<'_>, ) -> Result { Ok(true) } @@ -70,20 +70,25 @@ impl WorkerScorer for BenchScorer { fn score( &mut self, context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - let cache = candidate - .cache() - .ok_or_else(|| WorkerSelectionPolicyError::failed("cache input unavailable"))?; - let load = candidate - .load() - .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; - let uncached_blocks = - (context.request_blocks() as f64 - cache.device_overlap_blocks()).max(0.0); - let load_blocks = load.active_prefill_tokens() as f64 / context.block_size() as f64 - + load.decode_cost_blocks() - + load.active_requests() as f64; - Ok((uncached_blocks + load_blocks) * candidate.preferred_taint_multiplier().unwrap_or(1.0)) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + let cache = candidate + .cache() + .ok_or_else(|| WorkerSelectionPolicyError::failed("cache input unavailable"))?; + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + let uncached_blocks = + (context.request_blocks() as f64 - cache.device_overlap_blocks()).max(0.0); + let load_blocks = load.active_prefill_tokens() as f64 / context.block_size() as f64 + + load.decode_cost_blocks() + + load.active_requests() as f64; + *cost = (uncached_blocks + load_blocks) + * candidate.preferred_taint_multiplier().unwrap_or(1.0); + } + Ok(()) } } @@ -99,20 +104,24 @@ impl WorkerScorer for IgnoringPreferenceScorer { fn score( &mut self, context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - let cache = candidate - .cache() - .ok_or_else(|| WorkerSelectionPolicyError::failed("cache input unavailable"))?; - let load = candidate - .load() - .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; - let uncached_blocks = - (context.request_blocks() as f64 - cache.device_overlap_blocks()).max(0.0); - let load_blocks = load.active_prefill_tokens() as f64 / context.block_size() as f64 - + load.decode_cost_blocks() - + load.active_requests() as f64; - Ok(uncached_blocks + load_blocks) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + let cache = candidate + .cache() + .ok_or_else(|| WorkerSelectionPolicyError::failed("cache input unavailable"))?; + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + let uncached_blocks = + (context.request_blocks() as f64 - cache.device_overlap_blocks()).max(0.0); + let load_blocks = load.active_prefill_tokens() as f64 / context.block_size() as f64 + + load.decode_cost_blocks() + + load.active_requests() as f64; + *cost = uncached_blocks + load_blocks; + } + Ok(()) } } @@ -145,8 +154,8 @@ fn fixture_with_preferred_taints( const PREFERRED_TAINTS: [&str; 4] = ["rack-a", "zone-a", "gpu-a", "node-a"]; assert!(preferred_taint_count <= PREFERRED_TAINTS.len()); let mut workers = HashMap::with_capacity(worker_count); - let mut effective_overlap_blocks = HashMap::with_capacity(worker_count); - let mut effective_cached_tokens = HashMap::with_capacity(worker_count); + let mut effective_overlap_blocks = FxHashMap::default(); + let mut effective_cached_tokens = FxHashMap::default(); let mut worker_loads = FxHashMap::with_capacity_and_hasher(worker_count, Default::default()); for worker_id in 0..worker_count as WorkerId { @@ -373,7 +382,7 @@ fn default_policy_wrapper(c: &mut Criterion) { for worker_count in [2, 32, 1_024] { let (workers, request) = fixture(worker_count); let direct = DefaultWorkerSelector::new(Some(config.clone()), "prefill"); - let policy = WorkerSelectionPolicy::default(config.clone(), "prefill"); + let policy = WorkerSelectionPolicy::reference(config.clone(), "prefill"); group.throughput(Throughput::Elements(worker_count as u64)); group.bench_with_input( diff --git a/lib/kv-router/src/lib.rs b/lib/kv-router/src/lib.rs index 2ce2cf9a14f9..0e2580e861ac 100644 --- a/lib/kv-router/src/lib.rs +++ b/lib/kv-router/src/lib.rs @@ -76,12 +76,14 @@ pub use scheduling::{ KvSchedulerError, PotentialLoad, SchedulingRequest, SchedulingResponse, SessionContext, WorkerSelectionInputTrigger, WorkerSelectionPolicyError, }; -pub use selector::{DefaultWorkerSelector, WorkerSelectionInput, WorkerSelector}; +#[cfg(any(test, feature = "bench"))] +pub use selector::DefaultWorkerSelector; +pub use selector::{WorkerSelectionInput, WorkerSelector}; // TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. pub use plugins::worker_selection::{ - ScoredWorkerCandidate, WorkerCacheInput, WorkerCandidate, WorkerFilter, WorkerInputView, - WorkerInputs, WorkerLoadInput, WorkerPicker, WorkerScorer, WorkerSelectionContext, - WorkerSelectionPolicy, + ScoredWorkerCandidate, WorkerCacheInput, WorkerCacheInputs, WorkerCandidate, WorkerCandidates, + WorkerFilter, WorkerInputView, WorkerInputs, WorkerLoadInput, WorkerPicker, WorkerScorer, + WorkerSelectionContext, WorkerSelectionPolicy, }; pub use session_prefix_index::{ LogicalNode, NodeId, SessionId, SessionPrefixIndexError, SessionPrefixIndexer, diff --git a/lib/kv-router/src/plugins.rs b/lib/kv-router/src/plugins.rs index ecc205c80937..f1eac4b52fc3 100644 --- a/lib/kv-router/src/plugins.rs +++ b/lib/kv-router/src/plugins.rs @@ -27,12 +27,14 @@ use worker_selection::WorkerSelectionPolicyFactory; #[derive(Clone, Default)] pub struct RouterPlugins { worker_selection: Option, + custom_worker_selection: bool, request_classifier: Option, } impl RouterPlugins { pub fn with_worker_selection(mut self, factory: WorkerSelectionPolicyFactory) -> Self { self.worker_selection = Some(factory); + self.custom_worker_selection = true; self } @@ -45,6 +47,17 @@ impl RouterPlugins { self.worker_selection.is_none() && self.request_classifier.is_none() } + /// Whether worker selection was explicitly supplied, rather than filled by the host default. + /// Hosts use this to require typed worker discovery without delaying stock router startup. + pub fn has_custom_worker_selection(&self) -> bool { + self.custom_worker_selection + } + + /// Whether explicit policy or classifier choices require custom-plugin frontend support. + pub fn has_custom_plugins(&self) -> bool { + self.custom_worker_selection || self.request_classifier.is_some() + } + pub fn worker_selection(&self) -> Option<&WorkerSelectionPolicyFactory> { self.worker_selection.as_ref() } diff --git a/lib/kv-router/src/plugins/registry.rs b/lib/kv-router/src/plugins/registry.rs index 5a48e7055bd8..f8d54c097b8b 100644 --- a/lib/kv-router/src/plugins/registry.rs +++ b/lib/kv-router/src/plugins/registry.rs @@ -13,7 +13,7 @@ use super::request_classifier::RequestClassifierRegistry; use super::request_classifier::{ RequestClassifierFactory, RequestClassifierProvider, RequestClassifierRegistryError, }; -use super::worker_selection::{WorkerSelectionPolicy, WorkerSelectionPolicyFactory}; +use super::worker_selection::WorkerSelectionPolicyFactory; use crate::WorkerType; use crate::config::KvRouterConfig; use crate::scheduling::config::WorkerSelectionPolicySelections; @@ -69,6 +69,7 @@ impl WorkerSelectionPolicyProviderError { pub struct RouterPluginRegistry { providers: HashMap, request_classifiers: RequestClassifierRegistry, + default_factory: Option, } /// Existing catalogs can retain their worker-selection registration signature. @@ -80,6 +81,8 @@ pub type WorkerSelectionPolicyRegistry = RouterPluginRegistry; pub enum WorkerSelectionPolicyRegistryError { #[error("worker-selection policy type must not be empty")] EmptyName, + #[error("routing host must supply a default worker-selection policy factory")] + MissingDefault, #[error("worker-selection policy type 'default' is reserved for Dynamo's built-in selector")] ReservedDefault, #[error("worker-selection policy type {name:?} is already registered")] @@ -99,6 +102,12 @@ pub enum WorkerSelectionPolicyRegistryError { } impl RouterPluginRegistry { + /// Supply the host default while preserving registered custom plugin types. + pub fn with_default_factory(mut self, factory: WorkerSelectionPolicyFactory) -> Self { + self.default_factory = Some(factory); + self + } + /// Resolve every configured plugin once before constructing any routers. pub fn resolve_plugins( &self, @@ -106,6 +115,10 @@ impl RouterPluginRegistry { ) -> Result { Ok(super::RouterPlugins { worker_selection: self.resolve(config)?, + custom_worker_selection: config + .selected_worker_selection_policy_instance() + .map_err(WorkerSelectionPolicyRegistryError::from)? + .is_some(), request_classifier: self.resolve_request_classifier(config)?, }) } @@ -215,23 +228,28 @@ impl RouterPluginRegistry { self.resolve_selected_cached(policy_config, selected.encode.as_deref(), &mut resolved)?; if aggregated.is_none() && prefill.is_none() && decode.is_none() && encode.is_none() { - return Ok(None); + return Ok(self.default_factory.clone()); } + let [aggregated, prefill, decode, encode] = [aggregated, prefill, decode, encode] + .map(|factory| factory.or_else(|| self.default_factory.clone())); + let required = |factory: Option| { + factory.ok_or(WorkerSelectionPolicyRegistryError::MissingDefault) + }; + let (aggregated, prefill, decode, encode) = ( + required(aggregated)?, + required(prefill)?, + required(decode)?, + required(encode)?, + ); Ok(Some(Arc::new(move |config, worker_type, partition| { let selected = match worker_type { - WorkerType::Aggregated => aggregated.as_ref(), - WorkerType::Prefill => prefill.as_ref(), - WorkerType::Decode => decode.as_ref(), - WorkerType::Encode => encode.as_ref(), + WorkerType::Aggregated => &aggregated, + WorkerType::Prefill => &prefill, + WorkerType::Decode => &decode, + WorkerType::Encode => &encode, }; - match selected { - Some(factory) => factory(config, worker_type, partition), - None => WorkerSelectionPolicy::default( - config.clone(), - worker_type.default_selector_label(), - ), - } + selected(config, worker_type, partition) }))) } @@ -262,10 +280,10 @@ impl RouterPluginRegistry { selected: Option<&str>, ) -> Result, WorkerSelectionPolicyRegistryError> { let Some(selected) = selected else { - return Ok(None); + return Ok(self.default_factory.clone()); }; if selected == "default" { - return Ok(None); + return Ok(self.default_factory.clone()); } let instance = config .and_then(|config| config.instance(selected)) @@ -527,6 +545,23 @@ worker_selection: ); } + #[test] + fn partial_role_selection_requires_an_explicit_fallback() { + let mut registry = WorkerSelectionPolicyRegistry::default(); + registry.register("alpha", Arc::new(provider)).unwrap(); + let config = config(); + let selections = WorkerSelectionPolicySelections { + aggregated: Some("first".to_string()), + prefill: None, + decode: None, + encode: None, + }; + assert!(matches!( + registry.resolve_selections(Some(&config), selections), + Err(WorkerSelectionPolicyRegistryError::MissingDefault) + )); + } + #[test] fn role_scoped_resolution_ignores_unlinked_policy_types_for_other_roles() { let policy_file = tempfile::NamedTempFile::new().unwrap(); diff --git a/lib/kv-router/src/plugins/worker_selection.rs b/lib/kv-router/src/plugins/worker_selection.rs index b16c5db7cb1e..6d50a3f8f477 100644 --- a/lib/kv-router/src/plugins/worker_selection.rs +++ b/lib/kv-router/src/plugins/worker_selection.rs @@ -4,6 +4,15 @@ //! Public filter, scorer, and picker contracts and their input signals. mod config; +mod context; +mod inputs; + +pub use context::WorkerSelectionContext; +pub(crate) use inputs::{CacheSnapshot, CandidateData, WorkerCacheData}; +pub use inputs::{ + ScoredWorkerCandidate, WorkerCacheInput, WorkerCacheInputs, WorkerCandidate, WorkerCandidates, + WorkerInputView, WorkerInputs, WorkerLoadInput, +}; pub use super::registry::{ WorkerSelectionPolicyParameters, WorkerSelectionPolicyProvider, @@ -16,13 +25,8 @@ pub use crate::scheduling::{ pub(crate) use config::RawWorkerSelectionConfig; pub use config::{WorkerSelectionConfig, WorkerSelectionInstance}; -use std::ops::BitOr; -use std::sync::Arc; - -use crate::protocols::{WorkerAffinityTarget, WorkerWithDpRank}; -use crate::scheduling::SchedulingRequest; -use crate::scheduling::selector::LogitWeights; use crate::{KvRouterConfig, RoutingPartitionRef, WorkerType}; +use std::sync::Arc; /// Factory that creates one worker-selection policy per routing partition. pub type WorkerSelectionPolicyFactory = Arc< @@ -31,95 +35,6 @@ pub type WorkerSelectionPolicyFactory = Arc< + Sync, >; -/// Request-level values available to custom filters, scorers, and pickers. -pub struct WorkerSelectionContext<'a> { - pub(crate) request: &'a SchedulingRequest, - pub(crate) request_id: &'a str, - pub(crate) request_blocks: u64, - pub(crate) block_size: u32, - pub(crate) track_prefill_tokens: bool, - pub(crate) weights: LogitWeights, - pub(crate) router_temperature_override: Option, -} - -/// One eligible worker and the optional inputs requested by a filter or scorer. -pub struct WorkerCandidate { - pub(crate) worker: WorkerWithDpRank, - pub(crate) inputs: WorkerInputs, - pub(crate) cache: WorkerCacheInput, - pub(crate) load: WorkerLoadInput, - pub(crate) preferred_taint_multiplier: Option, -} - -/// One eligible worker and its total cost after all scorers run. -#[derive(Clone, Copy)] -pub struct ScoredWorkerCandidate { - pub(crate) worker: WorkerWithDpRank, - pub(crate) cost: f64, - pub(crate) preferred_taint_multiplier: Option, -} - -/// Optional worker-signal groups requested by scorers and pickers. -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -pub struct WorkerInputs(u8); - -impl WorkerInputs { - /// Request no optional worker inputs. - pub const NONE: Self = Self(0); - /// Request KV-cache overlap inputs. - pub const CACHE: Self = Self(1 << 0); - /// Request active-load inputs. - pub const LOAD: Self = Self(1 << 1); - /// Request preferred-taint routing metadata. - pub const PREFERRED_TAINT: Self = Self(1 << 2); - /// Request host-owned active-request counts. - pub const OCCUPANCY: Self = Self(1 << 5); - pub(crate) const ALL: Self = Self(Self::CACHE.0 | Self::LOAD.0 | Self::PREFERRED_TAINT.0); - - pub const fn contains(self, other: Self) -> bool { - self.0 & other.0 == other.0 - } - - pub(crate) fn without(self, other: Self) -> Self { - Self(self.0 & !other.0) - } -} - -impl BitOr for WorkerInputs { - type Output = Self; - - fn bitor(self, rhs: Self) -> Self::Output { - Self(self.0 | rhs.0) - } -} - -/// KV-cache overlap values for one worker. -#[derive(Clone, Copy, Default)] -pub struct WorkerCacheInput { - pub(crate) effective_overlap_blocks: f64, - pub(crate) device_overlap_blocks: f64, - pub(crate) host_overlap_blocks: f64, - pub(crate) disk_overlap_blocks: f64, - pub(crate) shared_beyond_device_blocks: u32, -} - -/// Active-load values for one worker. -#[derive(Clone, Copy, Default)] -pub struct WorkerLoadInput { - pub(crate) raw_prefill_blocks: f64, - pub(crate) active_prefill_tokens: usize, - pub(crate) decode_cost_blocks: f64, - pub(crate) active_requests: usize, -} - -/// Borrowed, index-aligned view of one custom picker's requested worker inputs. -#[derive(Clone, Copy)] -pub struct WorkerInputView<'a> { - pub(crate) candidates: &'a [ScoredWorkerCandidate], - pub(crate) cache: Option<&'a [WorkerCacheInput]>, - pub(crate) load: Option<&'a [WorkerLoadInput]>, -} - /// Adds one finite cost contribution to each eligible worker. pub trait WorkerScorer: Send { /// Declare the worker-signal groups needed by this scorer. @@ -127,12 +42,20 @@ pub trait WorkerScorer: Send { WorkerInputs::NONE } - /// Return one finite, lower-is-better cost contribution for an eligible worker row. + /// Score every candidate that survived host eligibility and policy filters in one call. + /// The borrowed snapshot and its row order remain fixed for this selection. Each scorer + /// can access only its own declared optional inputs, even when other components request more. Empty candidate + /// sets skip scoring. Scorers run in declaration order; an error stops before picking. + /// + /// `costs` has the same length as `candidates` and is initialized to NaN before each call. + /// Write one finite, lower-is-better contribution to every slot. The host validates and adds + /// each contribution to that row's total. The candidate view and cost slice may not be retained after this call. fn score( &mut self, context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result; + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError>; } /// Filters run in declaration order for each candidate. Callback order across different @@ -148,7 +71,7 @@ pub trait WorkerFilter: Send { fn keep( &mut self, context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, + candidate: WorkerCandidate<'_>, ) -> Result; } @@ -167,187 +90,3 @@ pub trait WorkerPicker: Send { input: WorkerInputView<'_>, ) -> Result; } - -impl WorkerSelectionContext<'_> { - /// Return the incoming prompt size in KV blocks. - pub fn request_blocks(&self) -> u64 { - self.request_blocks - } - - /// Return the number of tokens in one KV block. - pub fn block_size(&self) -> u32 { - self.block_size - } - - /// Return whether this request contributes to prefill-load tracking. - pub fn tracks_prefill_tokens(&self) -> bool { - self.track_prefill_tokens - } - - /// Return the session metadata available to worker selection. - pub fn session_context(&self) -> Option<&SessionContext> { - self.request.session_context.as_ref() - } - - /// Return the session-affinity target resolved by the request host. - /// - /// The default selector treats an eligible target as exclusive. Custom policies receive it as - /// advisory context; it may be absent from their candidate set when unavailable or filtered. - pub fn affinity_target(&self) -> Option { - self.request.affinity_target - } - - /// Return the expected output length, if the request supplies one. - pub fn expected_output_tokens(&self) -> Option { - self.request.expected_output_tokens - } - - /// Return the request's scheduler priority boost. - pub fn priority_jump(&self) -> f64 { - self.request.priority_jump - } - - /// Return the request's strict integer priority. - pub fn strict_priority(&self) -> u32 { - self.request.strict_priority - } - - /// Return the request-level router temperature override, if present. - pub fn router_temperature_override(&self) -> Option { - self.router_temperature_override - } -} - -impl WorkerCandidate { - /// Return this candidate's worker ID and data-parallel rank. - pub fn worker(&self) -> WorkerWithDpRank { - self.worker - } - - /// Return KV-cache inputs when the component requested [`WorkerInputs::CACHE`]. - pub fn cache(&self) -> Option<&WorkerCacheInput> { - self.inputs - .contains(WorkerInputs::CACHE) - .then_some(&self.cache) - } - - /// Return active-load inputs when the component requested [`WorkerInputs::LOAD`]. - pub fn load(&self) -> Option<&WorkerLoadInput> { - self.inputs - .contains(WorkerInputs::LOAD) - .then_some(&self.load) - } - - /// Return the optional cost multiplier from preferred routing constraints when the component - /// requested [`WorkerInputs::PREFERRED_TAINT`]. - /// - /// Required routing constraints are enforced by host eligibility. This preferred value is - /// ordinary candidate metadata and is only materialized for components that declare the - /// capability. - pub fn preferred_taint_multiplier(&self) -> Option { - self.preferred_taint_multiplier - } - - pub(crate) fn with_inputs_from(&self, additional: &Self, inputs: WorkerInputs) -> Self { - debug_assert_eq!(self.worker, additional.worker); - Self { - worker: self.worker, - inputs, - cache: if inputs.contains(WorkerInputs::CACHE) { - if self.inputs.contains(WorkerInputs::CACHE) { - self.cache - } else { - additional.cache - } - } else { - WorkerCacheInput::default() - }, - load: if inputs.contains(WorkerInputs::LOAD) { - if self.inputs.contains(WorkerInputs::LOAD) { - self.load - } else { - additional.load - } - } else { - WorkerLoadInput::default() - }, - preferred_taint_multiplier: self - .preferred_taint_multiplier - .or(additional.preferred_taint_multiplier), - } - } -} - -impl ScoredWorkerCandidate { - /// Return this candidate's worker ID and data-parallel rank. - pub fn worker(&self) -> WorkerWithDpRank { - self.worker - } - - /// Return the sum of all scorer contributions for this candidate. - pub fn cost(&self) -> f64 { - self.cost - } - - /// Return the optional cost multiplier from preferred routing constraints when the picker - /// requested [`WorkerInputs::PREFERRED_TAINT`]. - pub fn preferred_taint_multiplier(&self) -> Option { - self.preferred_taint_multiplier - } -} - -impl WorkerCacheInput { - /// Return device-resident prefix overlap in KV blocks. - pub fn device_overlap_blocks(&self) -> f64 { - self.device_overlap_blocks - } - - /// Return host-pinned prefix overlap in KV blocks. - pub fn host_overlap_blocks(&self) -> f64 { - self.host_overlap_blocks - } - - /// Return disk prefix overlap in KV blocks. - pub fn disk_overlap_blocks(&self) -> f64 { - self.disk_overlap_blocks - } - - /// Return shared-cache hits beyond the device-resident prefix. - pub fn shared_beyond_device_blocks(&self) -> u32 { - self.shared_beyond_device_blocks - } -} - -impl WorkerLoadInput { - /// Return the tokens active in this worker's prefill stage. - pub fn active_prefill_tokens(&self) -> usize { - self.active_prefill_tokens - } - - /// Return the projected active decode footprint in KV blocks. - pub fn decode_cost_blocks(&self) -> f64 { - self.decode_cost_blocks - } - - /// Return this worker's active request count. - pub fn active_requests(&self) -> usize { - self.active_requests - } -} - -impl<'a> WorkerInputView<'a> { - /// Return the eligible candidates and their total costs. - pub fn candidates(self) -> &'a [ScoredWorkerCandidate] { - self.candidates - } - - /// Return index-aligned KV-cache inputs when the picker requested them. - pub fn cache(self) -> Option<&'a [WorkerCacheInput]> { - self.cache - } - - /// Return index-aligned active-load inputs when the picker requested them. - pub fn load(self) -> Option<&'a [WorkerLoadInput]> { - self.load - } -} diff --git a/lib/kv-router/src/plugins/worker_selection/context.rs b/lib/kv-router/src/plugins/worker_selection/context.rs new file mode 100644 index 000000000000..0b4c0cafc09c --- /dev/null +++ b/lib/kv-router/src/plugins/worker_selection/context.rs @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Request metadata available to worker-selection components. + +use super::SessionContext; +use crate::protocols::{WorkerAffinityTarget, WorkerWithDpRank}; +use crate::scheduling::SchedulingRequest; + +/// Request-level values available to custom filters, scorers, and pickers. +pub struct WorkerSelectionContext<'a> { + pub(crate) request: &'a SchedulingRequest, + pub(crate) request_blocks: u64, + pub(crate) block_size: u32, + pub(crate) track_prefill_tokens: bool, + pub(crate) pinned_worker: Option, + pub(crate) router_temperature_override: Option, +} + +impl WorkerSelectionContext<'_> { + /// The exact worker/rank imposed by the host for this selection, if any. + /// Includes explicit pins and eligible exclusive-affinity targets. This is + /// read-only routing metadata, not permission to change eligibility. + pub fn pinned_worker(&self) -> Option { + self.pinned_worker + } + + /// Exact incoming prompt length in tokens. Borrowed from this request; no rounding, + /// cache weighting, or additional storage is involved. + pub fn prompt_tokens(&self) -> usize { + self.request.isl_tokens + } + + /// Return the incoming prompt size in KV blocks. + pub fn request_blocks(&self) -> u64 { + self.request_blocks + } + + /// Return the number of tokens in one KV block. + pub fn block_size(&self) -> u32 { + self.block_size + } + + /// Return whether this request contributes to prefill-load tracking. + pub fn tracks_prefill_tokens(&self) -> bool { + self.track_prefill_tokens + } + + /// Return the session metadata available to worker selection. + pub fn session_context(&self) -> Option<&SessionContext> { + self.request.session_context.as_ref() + } + + /// Return the session-affinity target resolved by the request host. + /// + /// The default selector treats an eligible target as exclusive. Custom policies receive it as + /// advisory context; it may be absent from their candidate set when unavailable or filtered. + pub fn affinity_target(&self) -> Option { + self.request.affinity_target + } + + /// Return the expected output length, if the request supplies one. + pub fn expected_output_tokens(&self) -> Option { + self.request.expected_output_tokens + } + + /// Return the request's scheduler priority boost. + pub fn priority_jump(&self) -> f64 { + self.request.priority_jump + } + + /// Return the request's strict integer priority. + pub fn strict_priority(&self) -> u32 { + self.request.strict_priority + } + + /// Return the request-level router temperature override, if present. + pub fn router_temperature_override(&self) -> Option { + self.router_temperature_override + } +} diff --git a/lib/kv-router/src/plugins/worker_selection/inputs.rs b/lib/kv-router/src/plugins/worker_selection/inputs.rs new file mode 100644 index 000000000000..4ce3dd6aaf4c --- /dev/null +++ b/lib/kv-router/src/plugins/worker_selection/inputs.rs @@ -0,0 +1,372 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Worker input groups, stored snapshots, and component-scoped borrowed views. + +use crate::protocols::{SharedCacheHits, WorkerWithDpRank}; +use std::ops::BitOr; + +/// Host-owned row materialized once for the union of component input requirements. +pub(crate) struct CandidateData { + pub(crate) worker: WorkerWithDpRank, + pub(crate) inputs: WorkerInputs, + pub(crate) cache: WorkerCacheData, + pub(crate) load: WorkerLoadInput, + pub(crate) preferred_taint_multiplier: Option, +} + +/// A borrowed view of one worker, restricted to this component's declared inputs. +#[derive(Clone, Copy)] +pub struct WorkerCandidate<'a> { + data: &'a CandidateData, + inputs: WorkerInputs, + cache_snapshot: &'a CacheSnapshot<'a>, +} + +impl<'a> WorkerCandidate<'a> { + pub(crate) fn new( + data: &'a CandidateData, + inputs: WorkerInputs, + cache_snapshot: &'a CacheSnapshot<'a>, + ) -> Self { + Self { + data, + inputs, + cache_snapshot, + } + } + + /// Worker identity is always available. + pub fn worker(self) -> WorkerWithDpRank { + self.data.worker + } + + /// Read this worker's cache snapshot only when this component declared CACHE. + pub fn cache(self) -> Option> { + self.inputs + .contains(WorkerInputs::CACHE) + .then_some(WorkerCacheInput { + data: &self.data.cache, + snapshot: self.cache_snapshot, + }) + } + + /// Read this worker's load snapshot only when this component declared LOAD. + pub fn load(self) -> Option<&'a WorkerLoadInput> { + self.inputs + .contains(WorkerInputs::LOAD) + .then_some(&self.data.load) + } + + /// Preferred-taint cost multiplier, only when this component declared PREFERRED_TAINT. + /// None means no preference was supplied, access was not requested, or the host pinned the worker. + pub fn preferred_taint_multiplier(self) -> Option { + if self.inputs.contains(WorkerInputs::PREFERRED_TAINT) { + self.data.preferred_taint_multiplier + } else { + None + } + } +} + +/// Borrowed candidate batch restricted to one scorer's declared inputs. +/// All scorers see the same surviving workers in the same order. Creating or iterating this +/// view does not copy rows, allocate, or change another component's access. +#[derive(Clone, Copy)] +pub struct WorkerCandidates<'a> { + rows: &'a [CandidateData], + inputs: WorkerInputs, + cache_snapshot: &'a CacheSnapshot<'a>, +} + +impl<'a> WorkerCandidates<'a> { + pub(crate) fn new( + rows: &'a [CandidateData], + inputs: WorkerInputs, + cache_snapshot: &'a CacheSnapshot<'a>, + ) -> Self { + Self { + rows, + inputs, + cache_snapshot, + } + } + + /// Number of surviving workers, equal to the scorer's cost-buffer length. + pub fn len(self) -> usize { + self.rows.len() + } + + /// Whether the batch contains no workers. + pub fn is_empty(self) -> bool { + self.rows.is_empty() + } + + /// Borrow one row with this scorer's input permissions, or None for an out-of-range index. + pub fn get(self, row: usize) -> Option> { + self.rows + .get(row) + .map(|data| WorkerCandidate::new(data, self.inputs, self.cache_snapshot)) + } + + /// Iterate over the surviving workers without copying their data. + pub fn iter( + self, + ) -> impl ExactSizeIterator> + DoubleEndedIterator + Clone { + self.rows + .iter() + .map(move |data| WorkerCandidate::new(data, self.inputs, self.cache_snapshot)) + } +} + +/// One eligible worker and its total cost after all scorers run. +#[derive(Clone, Copy)] +pub struct ScoredWorkerCandidate { + pub(crate) worker: WorkerWithDpRank, + pub(crate) cost: f64, + pub(crate) preferred_taint_multiplier: Option, +} + +/// Optional worker-signal groups requested by scorers and pickers. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub struct WorkerInputs(u8); + +impl WorkerInputs { + /// Request no optional worker inputs. + pub const NONE: Self = Self(0); + /// Request worker KV-cache overlaps and shared-cache lookup results. + pub const CACHE: Self = Self(1 << 0); + /// Request active-load inputs. + pub const LOAD: Self = Self(1 << 1); + /// Request preferred-taint routing metadata. + pub const PREFERRED_TAINT: Self = Self(1 << 2); + /// Request host-owned active-request counts. + pub const OCCUPANCY: Self = Self(1 << 5); + #[cfg(any(test, feature = "bench"))] + pub(crate) const ALL: Self = Self(Self::CACHE.0 | Self::LOAD.0 | Self::PREFERRED_TAINT.0); + + pub const fn contains(self, other: Self) -> bool { + self.0 & other.0 == other.0 + } + + pub(crate) fn without(self, other: Self) -> Self { + Self(self.0 & !other.0) + } +} + +impl BitOr for WorkerInputs { + type Output = Self; + + fn bitor(self, rhs: Self) -> Self::Output { + Self(self.0 | rhs.0) + } +} + +/// Request-wide facts borrowed once for all cache views in a selection. +pub(crate) struct CacheSnapshot<'a> { + pub(crate) shared_hits: Option<&'a SharedCacheHits>, + pub(crate) has_tier_matches: bool, +} + +/// Numeric cache row retained in host buffers between selections. +#[derive(Clone, Copy, Default)] +pub(crate) struct WorkerCacheData { + pub(crate) effective_overlap_blocks: f64, + pub(crate) estimated_cached_tokens: usize, + pub(crate) device_overlap_blocks: f64, + pub(crate) host_overlap_blocks: f64, + pub(crate) disk_overlap_blocks: f64, +} + +/// Borrowed worker overlaps and shared-cache facts from one lookup snapshot. +/// Available only to components that declare [`WorkerInputs::CACHE`]. +#[derive(Clone, Copy)] +pub struct WorkerCacheInput<'a> { + data: &'a WorkerCacheData, + snapshot: &'a CacheSnapshot<'a>, +} + +/// Borrowed cache rows in the same order as a picker's candidates. +#[derive(Clone, Copy)] +pub struct WorkerCacheInputs<'a> { + pub(crate) rows: &'a [WorkerCacheData], + pub(crate) snapshot: &'a CacheSnapshot<'a>, +} + +impl<'a> WorkerCacheInputs<'a> { + /// Number of cache rows, equal to the picker candidate count. + pub fn len(self) -> usize { + self.rows.len() + } + + /// Whether there are no cache rows. + pub fn is_empty(self) -> bool { + self.rows.is_empty() + } + + /// Borrow one cache row, or None for an out-of-range index. + pub fn get(self, row: usize) -> Option> { + self.rows.get(row).map(|data| WorkerCacheInput { + data, + snapshot: self.snapshot, + }) + } + + /// Iterate over cache rows without copying their data. + pub fn iter( + self, + ) -> impl ExactSizeIterator> + DoubleEndedIterator + Clone { + self.rows.iter().map(move |data| WorkerCacheInput { + data, + snapshot: self.snapshot, + }) + } +} + +/// Active-load values for one worker. +#[derive(Clone, Copy, Default)] +pub struct WorkerLoadInput { + pub(crate) available: bool, + pub(crate) active_prefill_tokens: usize, + pub(crate) decode_cost_blocks: f64, + pub(crate) active_requests: usize, +} + +/// Borrowed, index-aligned view of one custom picker's requested worker inputs. +#[derive(Clone, Copy)] +pub struct WorkerInputView<'a> { + pub(crate) candidates: &'a [ScoredWorkerCandidate], + pub(crate) cache: Option>, + pub(crate) load: Option<&'a [WorkerLoadInput]>, +} + +impl CandidateData { + pub(crate) fn with_inputs_from(&self, additional: &Self, inputs: WorkerInputs) -> Self { + debug_assert_eq!(self.worker, additional.worker); + Self { + worker: self.worker, + inputs, + cache: if inputs.contains(WorkerInputs::CACHE) { + if self.inputs.contains(WorkerInputs::CACHE) { + self.cache + } else { + additional.cache + } + } else { + WorkerCacheData::default() + }, + load: if inputs.contains(WorkerInputs::LOAD) { + if self.inputs.contains(WorkerInputs::LOAD) { + self.load + } else { + additional.load + } + } else { + WorkerLoadInput::default() + }, + preferred_taint_multiplier: self + .preferred_taint_multiplier + .or(additional.preferred_taint_multiplier), + } + } +} + +impl ScoredWorkerCandidate { + /// Return this candidate's worker ID and data-parallel rank. + pub fn worker(&self) -> WorkerWithDpRank { + self.worker + } + + /// Return the sum of all scorer contributions for this candidate. + pub fn cost(&self) -> f64 { + self.cost + } + + /// Return the optional cost multiplier from preferred routing constraints when the picker + /// requested [`WorkerInputs::PREFERRED_TAINT`]. + pub fn preferred_taint_multiplier(&self) -> Option { + self.preferred_taint_multiplier + } +} + +impl<'a> WorkerCacheInput<'a> { + /// Unweighted shared-cache ranges in KV block positions, or None if no result was supplied. + /// The host owns this snapshot. It does not change during the callback, and may lag engine state. + /// Use `hits_beyond(prefix)` to exclude hits already covered by the policy's chosen prefix. + pub fn shared_hits(self) -> Option<&'a SharedCacheHits> { + self.snapshot.shared_hits + } + + /// Whether the request snapshot contains any tier-specific matches before worker filtering. + /// False means only accounting estimates (or no cache data) were supplied. This describes + /// observed matches, not worker cache capacity or whether a particular worker has a match. + pub fn has_tier_matches(self) -> bool { + self.snapshot.has_tier_matches + } + + /// Host accounting estimate for this worker, in weighted KV blocks and rounded tokens. + /// Lower-tier matches use the host's cache weights. Missing estimates are zero; + /// neither value is clamped to prompt length. This is the current lookup snapshot, + /// not a count of physically resident GPU tokens. Policy scores do not alter it. + pub fn accounting_cache_estimate(&self) -> (f64, usize) { + ( + self.data.effective_overlap_blocks, + self.data.estimated_cached_tokens, + ) + } + + /// Return device-resident prefix overlap in KV blocks. + pub fn device_overlap_blocks(&self) -> f64 { + self.data.device_overlap_blocks + } + + /// Return host-pinned prefix overlap in KV blocks. + pub fn host_overlap_blocks(&self) -> f64 { + self.data.host_overlap_blocks + } + + /// Return disk prefix overlap in KV blocks. + pub fn disk_overlap_blocks(&self) -> f64 { + self.data.disk_overlap_blocks + } +} + +impl WorkerLoadInput { + /// Whether the host supplied a load projection for this worker in this selection. + /// False distinguishes a missing observation from an observed idle worker. + pub fn is_available(&self) -> bool { + self.available + } + + /// Return the tokens active in this worker's prefill stage. + pub fn active_prefill_tokens(&self) -> usize { + self.active_prefill_tokens + } + + /// Return the projected active decode footprint in KV blocks. + pub fn decode_cost_blocks(&self) -> f64 { + self.decode_cost_blocks + } + + /// Return this worker's active request count. + pub fn active_requests(&self) -> usize { + self.active_requests + } +} + +impl<'a> WorkerInputView<'a> { + /// Return the eligible candidates and their total costs. + pub fn candidates(self) -> &'a [ScoredWorkerCandidate] { + self.candidates + } + + /// Return index-aligned KV-cache inputs when the picker requested them. + pub fn cache(self) -> Option> { + self.cache + } + + /// Return index-aligned active-load inputs when the picker requested them. + pub fn load(self) -> Option<&'a [WorkerLoadInput]> { + self.load + } +} diff --git a/lib/kv-router/src/scheduling/AGENTS.md b/lib/kv-router/src/scheduling/AGENTS.md index 8f80b3312e41..22d6d5289467 100644 --- a/lib/kv-router/src/scheduling/AGENTS.md +++ b/lib/kv-router/src/scheduling/AGENTS.md @@ -122,7 +122,7 @@ PolicyClassQueue("agents") ## Public Worker-Selection API -The `selector` module contains the public Rust contract for custom worker filters, scorers, and pickers. Treat each public item as a versioned external API. +The `plugins::worker_selection` module contains the public Rust contract for custom worker filters, scorers, and pickers. Treat each public item as a versioned external API. - Do not add a public field, accessor, input group, type, or re-export unless the task explicitly requires a new external policy capability. - An internal need in the default scorer, logging, tests, or SelectionService does not justify a public API addition. @@ -135,12 +135,12 @@ The `selector` module contains the public Rust contract for custom worker filter - Require callers to name each `WorkerInputs` group that they use. Do not add a public `ALL` shortcut. - Before you add a value to an existing input group, account for its calculation and retained-column cost for every policy that requests that group. - Do not pass the full `SchedulingRequest`, worker maps, router configuration internals, default-score weights, or host-owned eligibility and reservation state to custom policies. -- Keep `DefaultWorkerScorer` and `DefaultWorkerPicker` internal. External policies own their filters and both scoring and picking stages. +- The builtin default policy lives in `lib/router-plugins/builtin` and uses only the public policy API. Keep the reference selector test/benchmark-only. Plugins own their score calculation and worker choice. - Keep eligibility, picker-row validation, accounting, and reservation in the host path. Before each public API addition: 1. Search all accessors, re-exports, documentation, examples, and external-looking call sites. 2. Add one focused contract test that uses the new value through `WorkerFilter`, `WorkerScorer`, or `WorkerPicker`. -3. Update `docs/fern/pages/developer-guide/advanced-customizations/custom-worker-selection.mdx` and one canonical example. +3. Update `docs/fern/pages/developer-guide/knowledge-base/modular-components/router/custom-worker-selection.mdx` and one canonical example. 4. If the signal adds work, storage, allocation, or another scan to the selection path, run the worker-selection benchmark. diff --git a/lib/kv-router/src/scheduling/config.rs b/lib/kv-router/src/scheduling/config.rs index 4bc3e3c75043..d0802d296a68 100644 --- a/lib/kv-router/src/scheduling/config.rs +++ b/lib/kv-router/src/scheduling/config.rs @@ -1091,16 +1091,8 @@ fn validate_kv_router_config(config: &KvRouterConfig) -> Result<(), String> { "enable_session_prefix_index is not supported with use_remote_indexer=true".to_string(), ); } - if config.enable_session_prefix_index - && (!config.use_kv_events || config.overlap_score_credit <= 0.0) - { - return Err( - "enable_session_prefix_index requires use_kv_events=true and overlap_score_credit > 0" - .to_string(), - ); - } - if config.serve_indexer && config.overlap_score_credit == 0.0 { - return Err("serve_indexer requires overlap_score_credit > 0".to_string()); + if config.enable_session_prefix_index && !config.use_kv_events { + return Err("enable_session_prefix_index requires use_kv_events=true".to_string()); } if config.router_predicted_ttl_secs.is_some() && !config.use_kv_events { return Err("router_predicted_ttl_secs requires use_kv_events=true".to_string()); @@ -1583,18 +1575,6 @@ impl KvRouterConfig { precomputed_block_hashes, )) } - - /// Check if KV event subscription should be started. - /// - /// Returns false if: - /// - KV events are disabled (`use_kv_events=false`) - /// - Overlap scoring is disabled (`overlap_score_credit=0`) - /// - /// When false, the router skips starting the KV event subscription entirely, - /// avoiding the need to query workers for their local indexer state. - pub fn should_subscribe_to_kv_events(&self) -> bool { - self.use_kv_events && self.overlap_score_credit > 0.0 - } } fn random_sequence_hashes(num_blocks: usize) -> Vec { @@ -2484,7 +2464,6 @@ models: assert_eq!(config.overlap_score_credit, 0.0); assert_eq!(config.prefill_load_scale, 0.0); - assert!(!config.should_subscribe_to_kv_events()); } #[test] @@ -2585,14 +2564,17 @@ models: } #[test] - fn test_overlap_credit_zero_skips_kv_event_subscription() { - let config = KvRouterConfig { - overlap_score_credit: 0.0, - use_kv_events: true, - ..Default::default() - }; - - assert!(!config.should_subscribe_to_kv_events()); + fn indexer_features_do_not_depend_on_scoring_credit() { + for (serve_indexer, enable_session_prefix_index) in [(true, false), (false, true)] { + let config = KvRouterConfig { + overlap_score_credit: 0.0, + use_kv_events: true, + serve_indexer, + enable_session_prefix_index, + ..Default::default() + }; + assert!(config.validate().is_ok()); + } } #[test] diff --git a/lib/kv-router/src/scheduling/local.rs b/lib/kv-router/src/scheduling/local.rs index b850f9879374..332960b7a3bd 100644 --- a/lib/kv-router/src/scheduling/local.rs +++ b/lib/kv-router/src/scheduling/local.rs @@ -21,7 +21,7 @@ use super::queue::{ SchedulerQueue, }; use super::request_classifier::{RequestClassifierRuntime, RequestLifecycle}; -use super::selector::{DefaultWorkerSelector, WorkerSelector}; +use super::selector::WorkerSelector; use super::types::{ AdmissionAttempt, AdmittedSchedulingResponse, AdvisorySchedulingResponse, AttemptId, KvSchedulerError, NonMaxOverlapSelectionObserver, OverloadedWorkerProvider, PotentialLoad, @@ -45,8 +45,12 @@ enum WorkerConfigReconcileOutcome { Rejected, } -pub struct LocalScheduler -where +pub struct LocalScheduler< + P, + C, + Sel = super::selector::WorkerSelectionPolicy, + RF = NoopOverlapScoresRefresh, +> where P: SequencePublisher, C: WorkerConfigLike, Sel: WorkerSelector, @@ -451,8 +455,8 @@ where isl_tokens: usize, token_seq: Option>, tier_overlap_blocks: TierOverlapBlocks, - effective_overlap_blocks: HashMap, - effective_cached_tokens: HashMap, + effective_overlap_blocks: FxHashMap, + effective_cached_tokens: FxHashMap, router_config_override: Option<&super::config::RouterConfigOverride>, update_states: bool, lora_name: Option, @@ -498,8 +502,8 @@ where token_seq: Option>, block_hashes: Option>, tier_overlap_blocks: TierOverlapBlocks, - effective_overlap_blocks: HashMap, - effective_cached_tokens: HashMap, + effective_overlap_blocks: FxHashMap, + effective_cached_tokens: FxHashMap, router_config_override: Option<&super::config::RouterConfigOverride>, update_states: bool, lora_name: Option, @@ -542,8 +546,8 @@ where token_seq: Option>, block_hashes: Option>, tier_overlap_blocks: TierOverlapBlocks, - effective_overlap_blocks: HashMap, - effective_cached_tokens: HashMap, + effective_overlap_blocks: FxHashMap, + effective_cached_tokens: FxHashMap, router_config_override: Option<&super::config::RouterConfigOverride>, update_states: bool, lora_name: Option, @@ -810,7 +814,7 @@ where &self, token_seq: Option>, isl_tokens: usize, - effective_cached_tokens: HashMap, + effective_cached_tokens: FxHashMap, track_prefill_tokens: bool, ) -> Vec { let decay_now = Instant::now(); @@ -906,7 +910,7 @@ mod tests { monitor_worker_configs: bool, prefill_load_estimator: Option>, ) -> ( - Arc>, + Arc>, Arc>, watch::Sender>, CancellationToken, @@ -928,7 +932,7 @@ mod tests { prefill_load_estimator: Option>, replica_sync: bool, ) -> ( - Arc>, + Arc>, Arc>, watch::Sender>, CancellationToken, @@ -976,7 +980,9 @@ mod tests { } async fn wait_for_pending_count( - scheduler: &Arc>, + scheduler: &Arc< + LocalScheduler, + >, expected: usize, ) { tokio::time::timeout(Duration::from_millis(250), async { @@ -1038,7 +1044,8 @@ mod tests { scheduler.get_active_lora_counts(), HashMap::from([(String::from("adapter-a"), 1)]) ); - let loads = scheduler.get_potential_loads(Some(vec![1, 2, 3, 4]), 64, HashMap::new(), true); + let loads = + scheduler.get_potential_loads(Some(vec![1, 2, 3, 4]), 64, Default::default(), true); let worker_load = loads .iter() .find(|load| load.worker_id == response.best_worker.worker_id && load.dp_rank == 0) @@ -1058,7 +1065,7 @@ mod tests { .await .unwrap(); - let loads = scheduler.get_potential_loads(None, 0, HashMap::new(), false); + let loads = scheduler.get_potential_loads(None, 0, Default::default(), false); assert_eq!(loads[0].active_requests, 0); cancel_token.cancel(); } @@ -1136,12 +1143,13 @@ mod tests { .unwrap(); assert_eq!(calls.load(Ordering::Relaxed), 1); assert_eq!( - scheduler.get_potential_loads(None, 0, HashMap::new(), false)[0].active_requests, + scheduler.get_potential_loads(None, 0, FxHashMap::default(), false)[0].active_requests, 1 ); drop(booking.expect("admission must return an armed booking")); tokio::time::timeout(Duration::from_secs(1), async { - while scheduler.get_potential_loads(None, 0, HashMap::new(), false)[0].active_requests + while scheduler.get_potential_loads(None, 0, FxHashMap::default(), false)[0] + .active_requests != 0 { tokio::task::yield_now().await; @@ -1186,7 +1194,7 @@ mod tests { .await; assert!(matches!(result, Err(KvSchedulerError::DeadlineExceeded))); assert_eq!( - scheduler.get_potential_loads(None, 0, HashMap::new(), false)[0].active_requests, + scheduler.get_potential_loads(None, 0, FxHashMap::default(), false)[0].active_requests, 0 ); cancel_token.cancel(); @@ -1204,8 +1212,8 @@ mod tests { 64, None, TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -1243,8 +1251,8 @@ mod tests { 64, Some(vec![1, 2, 3, 4]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), Some(&crate::config::RouterConfigOverride { track_prefill_tokens: Some(false), ..Default::default() @@ -1292,8 +1300,8 @@ mod tests { 64, Some(vec![1, 2, 3, 4]), TierOverlapBlocks::default(), - HashMap::from([(worker, 0.75)]), - HashMap::from([(worker, 48)]), + FxHashMap::from_iter([(worker, 0.75)]), + FxHashMap::from_iter([(worker, 48)]), None, true, None, @@ -1339,8 +1347,8 @@ mod tests { 64, Some(vec![1, 2, 3, 4]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -1364,8 +1372,8 @@ mod tests { 64, Some(vec![5, 6, 7, 8]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -1410,8 +1418,8 @@ mod tests { 64, Some(vec![1, 2, 3, 4]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -1435,8 +1443,8 @@ mod tests { 64, Some(vec![5, 6, 7, 8]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -1495,8 +1503,8 @@ mod tests { 64, Some(vec![1, 2, 3, 4]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -1520,8 +1528,8 @@ mod tests { 64, Some(vec![5, 6, 7, 8]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -1579,8 +1587,8 @@ mod tests { 64, Some(vec![1, 2, 3, 4]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -1604,8 +1612,8 @@ mod tests { 64, Some(vec![5, 6, 7, 8]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -1661,8 +1669,8 @@ mod tests { 64, Some(vec![1, 2, 3, 4]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, Some("adapter-a".to_string()), @@ -1722,7 +1730,8 @@ mod tests { .collect(); expected.sort_by_key(|load| (load.worker_id, load.dp_rank)); - let mut actual = scheduler.get_potential_loads(Some(token_seq), 128, HashMap::new(), true); + let mut actual = + scheduler.get_potential_loads(Some(token_seq), 128, Default::default(), true); actual.sort_by_key(|load| (load.worker_id, load.dp_rank)); assert_eq!(actual.len(), expected.len()); @@ -1765,8 +1774,8 @@ mod tests { 100, Some(vec![1, 2, 3, 4]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -1783,7 +1792,7 @@ mod tests { tokio::time::advance(Duration::from_secs(6)).await; - let loads = scheduler.get_potential_loads(None, 0, HashMap::new(), true); + let loads = scheduler.get_potential_loads(None, 0, Default::default(), true); assert_eq!(loads.len(), 1); assert_eq!(loads[0].potential_prefill_tokens, 40); @@ -1798,7 +1807,7 @@ mod tests { assert_eq!( scheduler - .get_potential_loads(None, 64, HashMap::new(), true,) + .get_potential_loads(None, 64, Default::default(), true,) .len(), 1 ); @@ -1817,7 +1826,7 @@ mod tests { tokio::time::timeout(Duration::from_secs(1), async { loop { if scheduler - .get_potential_loads(None, 64, HashMap::new(), true) + .get_potential_loads(None, 64, Default::default(), true) .len() == 3 { @@ -1876,7 +1885,7 @@ mod tests { tokio::time::timeout(Duration::from_secs(1), async { loop { if scheduler - .get_potential_loads(None, 64, HashMap::new(), true) + .get_potential_loads(None, 64, Default::default(), true) .iter() .any(|load| load.worker_id == 1) { @@ -1931,7 +1940,7 @@ mod tests { tokio::time::timeout(Duration::from_secs(1), async { loop { if scheduler - .get_potential_loads(None, 64, HashMap::new(), true) + .get_potential_loads(None, 64, Default::default(), true) .is_empty() { break; @@ -1953,7 +1962,7 @@ mod tests { assert_eq!( scheduler - .get_potential_loads(None, 64, HashMap::new(), true) + .get_potential_loads(None, 64, Default::default(), true) .len(), 1 ); @@ -1965,7 +1974,7 @@ mod tests { tokio::time::sleep(Duration::from_millis(100)).await; - let loads = scheduler.get_potential_loads(None, 64, HashMap::new(), true); + let loads = scheduler.get_potential_loads(None, 64, Default::default(), true); assert_eq!(loads.len(), 1); assert_eq!(loads[0].worker_id, 0); @@ -1990,8 +1999,8 @@ mod tests { 64, Some(vec![11, 22]), TierOverlapBlocks::default(), - HashMap::new(), - HashMap::new(), + Default::default(), + Default::default(), None, true, None, @@ -2006,7 +2015,7 @@ mod tests { .await .unwrap(); - let loads = scheduler.get_potential_loads(None, 64, HashMap::new(), false); + let loads = scheduler.get_potential_loads(None, 64, Default::default(), false); assert_eq!(loads.len(), 1); assert_eq!(loads[0].potential_prefill_tokens, 64); diff --git a/lib/kv-router/src/scheduling/overlap.rs b/lib/kv-router/src/scheduling/overlap.rs index 217980b09aa8..2af77f2de30b 100644 --- a/lib/kv-router/src/scheduling/overlap.rs +++ b/lib/kv-router/src/scheduling/overlap.rs @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -use std::collections::{HashMap, HashSet}; +use std::collections::HashSet; use crate::config::{KvRouterConfig, RouterConfigOverride}; use crate::indexer::TieredMatchDetails; @@ -23,8 +23,8 @@ pub struct CacheHitEstimates { #[derive(Debug, Clone, Default)] pub struct OverlapSignals { pub tier_overlap_blocks: TierOverlapBlocks, - pub effective_overlap_blocks: HashMap, - pub effective_cached_tokens: HashMap, + pub effective_overlap_blocks: FxHashMap, + pub effective_cached_tokens: FxHashMap, } impl OverlapSignals { @@ -141,8 +141,8 @@ impl<'a> OverlapAnalysis<'a> { cache_hit_estimates_from_tiered_matches(self.config, self.block_size, self.tiered); OverlapSignals { tier_overlap_blocks: tier_overlap_blocks_from_tiered_matches(self.tiered), - effective_overlap_blocks: estimates.effective_overlap_blocks.into_iter().collect(), - effective_cached_tokens: estimates.cached_tokens.into_iter().collect(), + effective_overlap_blocks: estimates.effective_overlap_blocks, + effective_cached_tokens: estimates.cached_tokens, } } diff --git a/lib/kv-router/src/scheduling/overlap_refresh.rs b/lib/kv-router/src/scheduling/overlap_refresh.rs index cef255567898..0b6db53d6c01 100644 --- a/lib/kv-router/src/scheduling/overlap_refresh.rs +++ b/lib/kv-router/src/scheduling/overlap_refresh.rs @@ -277,8 +277,8 @@ mod tests { self.calls.fetch_add(1, Ordering::Relaxed); Some(RefreshedOverlap::from_overlap(OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::new(), - effective_cached_tokens: HashMap::new(), + effective_overlap_blocks: Default::default(), + effective_cached_tokens: Default::default(), })) } } diff --git a/lib/kv-router/src/scheduling/queue.rs b/lib/kv-router/src/scheduling/queue.rs index d120f186198c..ed5f28e1fcb1 100644 --- a/lib/kv-router/src/scheduling/queue.rs +++ b/lib/kv-router/src/scheduling/queue.rs @@ -24,7 +24,7 @@ use super::policy_queue::{PolicyQueue, QueueMetadata, QueueSnapshot}; use super::prefill_load::{PrefillLoadEstimator, effective_prefill_tokens}; use super::queue_admission::WorkerPlacement; use super::request_classifier::{ClassificationOverrides, ClassifyRequest}; -use super::selector::{DefaultWorkerSelector, WorkerSelectionInput, WorkerSelector}; +use super::selector::{WorkerSelectionInput, WorkerSelector}; use super::types::{ AdvisorySchedulingResponse, AdvisoryWorkerLoad, AttemptId, KvSchedulerError, NonMaxOverlapSelection, NonMaxOverlapSelectionObserver, OverloadedWorkerProvider, @@ -508,7 +508,7 @@ struct SchedulerQueueActor< pub struct SchedulerQueue< P: SequencePublisher, C: WorkerConfigLike, - Sel: WorkerSelector = DefaultWorkerSelector, + Sel: WorkerSelector = super::selector::WorkerSelectionPolicy, RF: OverlapScoresRefresh = NoopOverlapScoresRefresh, > { admission_tx: mpsc::Sender, @@ -2174,13 +2174,14 @@ mod tests { } } + #[allow(clippy::type_complexity)] fn make_queue( num_workers: usize, block_size: u32, isl: usize, threshold_frac: Option, ) -> ( - Arc>, + Arc>, Arc>, ) { let (queue, slots, _tx) = @@ -2245,7 +2246,7 @@ mod tests { threshold_frac: Option, prefill_load_estimator: Option>, ) -> ( - Arc>, + Arc>, Arc>, watch::Sender>, ) { @@ -2301,7 +2302,7 @@ mod tests { max_num_batched_tokens: usize, profile: PolicyProfile, ) -> ( - Arc>, + Arc>, Arc>, ) { let (queue, slots, _cfg_tx) = make_queue_with_profile_and_sender( @@ -2320,7 +2321,7 @@ mod tests { max_num_batched_tokens: usize, profile: PolicyProfile, ) -> ( - Arc>, + Arc>, Arc>, watch::Sender>, ) { @@ -2360,6 +2361,7 @@ mod tests { (queue, slots, cfg_tx) } + #[allow(clippy::type_complexity)] fn make_queue_with_providers( num_workers: usize, block_size: u32, @@ -2367,7 +2369,7 @@ mod tests { overloaded_worker_provider: Option, available_worker_provider: Option, ) -> ( - Arc>, + Arc>, Arc>, ) { let dp_range: HashMap = @@ -4062,7 +4064,7 @@ policy_classes: let (queue, _slots) = make_queue_with_providers(2, 16, 256, None, Some(provider)); let (mut request, _response) = make_request("adapter-request", 256); request.lora_name = Some("adapter".to_string()); - request.overlap.effective_cached_tokens = HashMap::from([ + request.overlap.effective_cached_tokens = FxHashMap::from_iter([ (WorkerWithDpRank::from_worker_id(0), 224), (WorkerWithDpRank::from_worker_id(1), 32), ]); @@ -4419,11 +4421,11 @@ policy_classes: }), overlap: OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::from([ + effective_overlap_blocks: rustc_hash::FxHashMap::from_iter([ (WorkerWithDpRank::new(0, 0), 1.0), (WorkerWithDpRank::new(1, 0), 9.0), ]), - effective_cached_tokens: HashMap::from([ + effective_cached_tokens: rustc_hash::FxHashMap::from_iter([ (WorkerWithDpRank::new(0, 0), 16), (WorkerWithDpRank::new(1, 0), 144), ]), @@ -4517,8 +4519,8 @@ policy_classes: }), overlap: OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::from([(worker, 5.0)]), - effective_cached_tokens: HashMap::from([(worker, 80)]), + effective_overlap_blocks: rustc_hash::FxHashMap::from_iter([(worker, 5.0)]), + effective_cached_tokens: rustc_hash::FxHashMap::from_iter([(worker, 80)]), }, }, }); @@ -4561,8 +4563,8 @@ policy_classes: let refresher = Arc::new(BlockingRefresher::new(RefreshedOverlap::from_overlap( OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::from([(worker, 7.0)]), - effective_cached_tokens: HashMap::from([(worker, 56)]), + effective_overlap_blocks: rustc_hash::FxHashMap::from_iter([(worker, 7.0)]), + effective_cached_tokens: rustc_hash::FxHashMap::from_iter([(worker, 56)]), }, ))); let (queue, slots) = make_queue_with_blocking_refresher( diff --git a/lib/kv-router/src/scheduling/selector/mod.rs b/lib/kv-router/src/scheduling/selector/mod.rs index 61b4f5c1c33b..27918d598ecd 100644 --- a/lib/kv-router/src/scheduling/selector/mod.rs +++ b/lib/kv-router/src/scheduling/selector/mod.rs @@ -3,26 +3,28 @@ use std::collections::HashMap; -mod default; mod policy; +#[cfg(any(test, feature = "bench"))] +mod reference; -pub use default::DefaultWorkerSelector; +#[cfg(any(test, feature = "bench"))] +pub use reference::DefaultWorkerSelector; -use default::{DefaultWorkerPicker, DefaultWorkerScorer}; // TODO(v1.7): Remove these compatibility re-exports; use crate::plugins instead. pub use crate::plugins::worker_selection::{ - ScoredWorkerCandidate, WorkerCacheInput, WorkerCandidate, WorkerFilter, WorkerInputView, - WorkerInputs, WorkerLoadInput, WorkerPicker, WorkerScorer, WorkerSelectionContext, + ScoredWorkerCandidate, WorkerCacheInput, WorkerCacheInputs, WorkerCandidate, WorkerCandidates, + WorkerFilter, WorkerInputView, WorkerInputs, WorkerLoadInput, WorkerPicker, WorkerScorer, + WorkerSelectionContext, }; +#[cfg(any(test, feature = "bench"))] +use reference::{DefaultWorkerPicker, DefaultWorkerScorer}; +use crate::plugins::worker_selection::{CacheSnapshot, CandidateData, WorkerCacheData}; pub use policy::WorkerSelectionPolicy; +use policy::{ComposedPolicyState, WorkerSelectionPolicyStateRef, collect_policy_candidates}; +#[cfg(any(test, feature = "bench"))] +use reference::pick_default_worker; -use default::{pick_default_worker, selection_weights}; -use policy::{ - CustomWorkerSelectionState, WorkerSelectionPolicyStateRef, collect_custom_candidates, -}; - -use super::config::KvRouterConfig; use super::filter::{RoutingEligibility, WorkerEligibilityError}; use super::types::{KvSchedulerError, SchedulingRequest, WorkerSelectionPolicyError}; use crate::protocols::{WorkerConfigLike, WorkerId, WorkerSelectionResult, WorkerWithDpRank}; @@ -126,30 +128,28 @@ impl<'a, C: WorkerConfigLike> WorkerSelectionInput<'a, C> { } } -#[derive(Debug, Clone, Copy)] -pub(crate) struct LogitWeights { - overlap_score_credit: f64, - overlap_score_credit_decay: f64, - prefill_load_scale: f64, - shared_cache_multiplier: f64, -} - struct MaterializedSelectionInput<'a> { request: &'a SchedulingRequest, context: WorkerSelectionContext<'a>, + cache_snapshot: CacheSnapshot<'a>, } impl<'a> MaterializedSelectionInput<'a> { - fn new(request: &'a SchedulingRequest, block_size: u32, weights: LogitWeights) -> Self { + fn new(request: &'a SchedulingRequest, block_size: u32) -> Self { Self { request, + cache_snapshot: CacheSnapshot { + shared_hits: request.shared_cache_hits.as_ref(), + has_tier_matches: !request.overlap.tier_overlap_blocks.device.is_empty() + || !request.overlap.tier_overlap_blocks.host_pinned.is_empty() + || !request.overlap.tier_overlap_blocks.disk.is_empty(), + }, context: WorkerSelectionContext { request, - request_id: request.mode.request_id().unwrap_or("-"), request_blocks: request.request_blocks(block_size), block_size, track_prefill_tokens: request.track_prefill_tokens, - weights, + pinned_worker: request.pinned_worker, router_temperature_override: request .router_config_override .as_ref() @@ -158,12 +158,13 @@ impl<'a> MaterializedSelectionInput<'a> { } } + #[inline(always)] fn row( &self, worker: WorkerWithDpRank, preferred_taint_multiplier: Option, inputs: WorkerInputs, - ) -> WorkerCandidate { + ) -> CandidateData { self.row_with_device_overlap( worker, preferred_taint_multiplier, @@ -172,16 +173,15 @@ impl<'a> MaterializedSelectionInput<'a> { ) } + #[inline(always)] fn row_with_device_overlap( &self, worker: WorkerWithDpRank, preferred_taint_multiplier: Option, inputs: WorkerInputs, select_device_overlap: impl FnOnce(f64, f64) -> f64, - ) -> WorkerCandidate { - let cached_tokens = if inputs.contains(WorkerInputs::CACHE) - || (inputs.contains(WorkerInputs::LOAD) && self.request.track_prefill_tokens) - { + ) -> CandidateData { + let cached_tokens = if inputs.contains(WorkerInputs::CACHE) { self.request.effective_cached_tokens_for(worker) } else { 0 @@ -204,14 +204,9 @@ impl<'a> MaterializedSelectionInput<'a> { .unwrap_or(0.0); let device_overlap_blocks = select_device_overlap(effective_overlap_blocks, reported_device_overlap_blocks); - let shared_beyond = |device_blocks: f64| { - self.request.shared_cache_hits.as_ref().map_or(0, |hits| { - // `hits_beyond` expects the unweighted device prefix depth. - hits.hits_beyond(device_blocks.round().max(0.0) as u32) - }) - }; - WorkerCacheInput { + WorkerCacheData { effective_overlap_blocks, + estimated_cached_tokens: cached_tokens, device_overlap_blocks, host_overlap_blocks: self .request @@ -229,31 +224,15 @@ impl<'a> MaterializedSelectionInput<'a> { .get(&worker) .copied() .unwrap_or(0) as f64, - shared_beyond_device_blocks: shared_beyond(device_overlap_blocks), } } else { - WorkerCacheInput::default() + WorkerCacheData::default() }; let load = if inputs.contains(WorkerInputs::LOAD) { - let raw_prefill_tokens = if self.request.track_prefill_tokens { - match worker_load { - Some(load) => { - // Preserve the legacy operation order when overlap exceeds the prompt. - let uncached_tokens = super::prefill_load::effective_prefill_tokens( - self.request.isl_tokens, - cached_tokens, - ); - let projected_tokens = load.active_prefill_tokens + uncached_tokens; - projected_tokens.saturating_add(cached_tokens) - } - None => self.request.isl_tokens, - } - } else { - 0 - } as f64; + let available = worker_load.is_some(); let worker_load = worker_load.unwrap_or_default(); WorkerLoadInput { - raw_prefill_blocks: raw_prefill_tokens / self.context.block_size as f64, + available, active_prefill_tokens: worker_load.active_prefill_tokens, decode_cost_blocks: worker_load.potential_decode_blocks() as f64, active_requests: worker_load.active_requests, @@ -262,7 +241,7 @@ impl<'a> MaterializedSelectionInput<'a> { WorkerLoadInput::default() }; - WorkerCandidate { + CandidateData { worker, inputs, cache, @@ -357,7 +336,6 @@ fn log_selection( // DefaultWorkerSelector and SelectionService both converge here. Only the scorer/picker stage is // dispatched; eligibility outcomes and result construction stay host-owned and shared. fn select_worker_with_policy( - kv_router_config: &KvRouterConfig, worker_type: &'static str, state: WorkerSelectionPolicyStateRef<'_>, workers: &HashMap, @@ -380,21 +358,22 @@ fn select_worker_with_policy( } } - let weights = selection_weights(kv_router_config, request); - let input = MaterializedSelectionInput::new(request, block_size, weights); + let mut input = MaterializedSelectionInput::new(request, block_size); + input.context.pinned_worker = eligibility.pinned_worker(); let selected = match state { - WorkerSelectionPolicyStateRef::Default(picker) => { + #[cfg(any(test, feature = "bench"))] + WorkerSelectionPolicyStateRef::Reference(kv_router_config, picker) => { let scorer = DefaultWorkerScorer { kv_router_config, worker_type, }; pick_default_worker(&scorer, picker, &input, workers, request, eligibility) } - WorkerSelectionPolicyStateRef::Custom(state) => { + WorkerSelectionPolicyStateRef::Composed(state) => { let mut state = state.borrow_mut(); let has_eligible_worker = - collect_custom_candidates(&mut state, &input, workers, request, eligibility)?; - let CustomWorkerSelectionState { + collect_policy_candidates(&mut state, &input, workers, request, eligibility)?; + let ComposedPolicyState { picker, picker_inputs, candidates, @@ -418,9 +397,12 @@ fn select_worker_with_policy( ); let picker_input = WorkerInputView { candidates, - cache: picker_inputs - .contains(WorkerInputs::CACHE) - .then_some(cache_inputs.as_slice()), + cache: picker_inputs.contains(WorkerInputs::CACHE).then_some( + WorkerCacheInputs { + rows: cache_inputs, + snapshot: &input.cache_snapshot, + }, + ), load: picker_inputs .contains(WorkerInputs::LOAD) .then_some(load_inputs.as_slice()), @@ -461,7 +443,7 @@ fn select_worker_with_policy( #[cfg(test)] mod test_support { - use std::collections::{HashMap, HashSet}; + use std::collections::HashSet; use rustc_hash::FxHashMap; @@ -504,8 +486,8 @@ mod test_support { isl_tokens, overlap: OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::default(), - effective_cached_tokens: HashMap::default(), + effective_overlap_blocks: Default::default(), + effective_cached_tokens: Default::default(), }, kv_transfer_candidates: None, retain_kv_transfer_chain: false, diff --git a/lib/kv-router/src/scheduling/selector/policy.rs b/lib/kv-router/src/scheduling/selector/policy.rs index 01213e781f67..8d6feeae81fe 100644 --- a/lib/kv-router/src/scheduling/selector/policy.rs +++ b/lib/kv-router/src/scheduling/selector/policy.rs @@ -4,59 +4,67 @@ use std::cell::RefCell; use std::collections::HashMap; +#[cfg(any(test, feature = "bench"))] +use super::DefaultWorkerPicker; use super::{ - DefaultWorkerPicker, MaterializedSelectionInput, WorkerSelectionInput, WorkerSelector, - select_worker_with_policy, + MaterializedSelectionInput, WorkerSelectionInput, WorkerSelector, select_worker_with_policy, }; + use crate::protocols::{WorkerConfigLike, WorkerId, WorkerSelectionResult}; use crate::scheduling::config::KvRouterConfig; use crate::scheduling::filter::RoutingEligibility; use crate::scheduling::types::{KvSchedulerError, SchedulingRequest, WorkerSelectionPolicyError}; use crate::plugins::worker_selection::{ - ScoredWorkerCandidate, WorkerCacheInput, WorkerCandidate, WorkerFilter, WorkerInputs, - WorkerLoadInput, WorkerPicker, WorkerScorer, WorkerSelectionContext, + CacheSnapshot, CandidateData, ScoredWorkerCandidate, WorkerCacheData, WorkerCandidate, + WorkerCandidates, WorkerFilter, WorkerInputs, WorkerLoadInput, WorkerPicker, WorkerScorer, + WorkerSelectionContext, }; #[cfg_attr(not(feature = "standalone-selection"), allow(dead_code))] pub(super) enum WorkerSelectionPolicyState { - Default(DefaultWorkerPicker), + #[cfg(any(test, feature = "bench"))] + Reference(Box, DefaultWorkerPicker), /// Policy-local state owned and called serially by one scheduler queue actor. - Custom(RefCell), + Composed(RefCell), } pub(super) enum WorkerSelectionPolicyStateRef<'a> { - Default(&'a DefaultWorkerPicker), - Custom(&'a RefCell), + #[cfg(any(test, feature = "bench"))] + Reference(&'a KvRouterConfig, &'a DefaultWorkerPicker), + Composed(&'a RefCell), } -pub(super) struct CustomWorkerSelectionState { - pub(super) filters: Vec>, - pub(super) scorers: Vec>, +pub(super) struct ComposedPolicyState { + pub(super) filters: Vec<(WorkerInputs, Box)>, + pub(super) scorers: Vec<(WorkerInputs, Box)>, pub(super) picker: Box, pub(super) filter_inputs: WorkerInputs, pub(super) scorer_picker_inputs: WorkerInputs, pub(super) picker_inputs: WorkerInputs, + unscored_candidates: Vec, + score_contributions: Vec, pub(super) candidates: Vec, - pub(super) cache_inputs: Vec, + pub(super) cache_inputs: Vec, pub(super) load_inputs: Vec, } /// Native scorer/picker composition for [`WorkerSelector`]. /// -/// SelectionService constructs the concrete default state unless a caller explicitly supplies -/// custom scorer and picker implementations through [`Self::new`]. +/// Routing hosts supply a policy factory. Both builtin and external policies compose +/// scorers and a picker through [`Self::new`], with optional filters through [`Self::new_with_filters`]. pub struct WorkerSelectionPolicy { - kv_router_config: KvRouterConfig, worker_label: &'static str, state: WorkerSelectionPolicyState, + exclusive_affinity: bool, } impl WorkerSelectionPolicy { - /// Build a custom policy with no filters. + /// Build a policy with no filters. /// /// `worker_label` identifies the worker pool in routing logs. A typed policy factory normally - /// passes [`crate::WorkerType::as_str`]. + /// passes [`crate::WorkerType::as_str`]. The config argument is retained for API compatibility; + /// policy parameters belong to the supplied scorers and picker and are not retained here. pub fn new( kv_router_config: KvRouterConfig, worker_label: &'static str, @@ -66,34 +74,48 @@ impl WorkerSelectionPolicy { Self::new_with_filters(kv_router_config, worker_label, Vec::new(), scorers, picker) } - /// Build a custom policy from ordered filters, additive scorers, and one picker. + /// Build a policy from ordered filters, additive scorers, and one picker. /// /// `worker_label` identifies the worker pool in routing logs. A typed policy factory normally - /// passes [`crate::WorkerType::as_str`]. + /// passes [`crate::WorkerType::as_str`]. The config argument is retained for API compatibility; + /// policy parameters belong to the supplied scorers and picker and are not retained here. pub fn new_with_filters( - kv_router_config: KvRouterConfig, + _kv_router_config: KvRouterConfig, worker_label: &'static str, filters: Vec>, scorers: Vec>, picker: Box, ) -> Self { let picker_inputs = picker.required_worker_inputs(); - let filter_inputs = filters.iter().fold(WorkerInputs::NONE, |inputs, filter| { - inputs | filter.required_worker_inputs() - }); - let scorer_picker_inputs = scorers.iter().fold(picker_inputs, |inputs, scorer| { - inputs | scorer.required_worker_inputs() - }); + // Freeze each declaration once; callbacks must not inherit another component's access. + let filters: Vec<_> = filters + .into_iter() + .map(|filter| (filter.required_worker_inputs(), filter)) + .collect(); + let scorers: Vec<_> = scorers + .into_iter() + .map(|scorer| (scorer.required_worker_inputs(), scorer)) + .collect(); + let filter_inputs = filters + .iter() + .fold(WorkerInputs::NONE, |inputs, (required, _)| { + inputs | *required + }); + let scorer_picker_inputs = scorers + .iter() + .fold(picker_inputs, |inputs, (required, _)| inputs | *required); Self { - kv_router_config, worker_label, - state: WorkerSelectionPolicyState::Custom(RefCell::new(CustomWorkerSelectionState { + exclusive_affinity: false, + state: WorkerSelectionPolicyState::Composed(RefCell::new(ComposedPolicyState { filters, scorers, picker, filter_inputs, scorer_picker_inputs, picker_inputs, + unscored_candidates: Vec::new(), + score_contributions: Vec::new(), candidates: Vec::new(), cache_inputs: Vec::new(), load_inputs: Vec::new(), @@ -101,47 +123,45 @@ impl WorkerSelectionPolicy { } } - /// Wrap Dynamo's built-in selector for a host that uses the policy selector type. + /// Ask the host to constrain selection to an eligible affinity target. + /// Explicit request pins remain mandatory regardless of this option. + pub fn with_exclusive_affinity(mut self, exclusive: bool) -> Self { + self.exclusive_affinity = exclusive; + self + } + + /// Construct the native reference implementation for parity tests and benchmarks. /// /// `worker_label` selects the built-in scoring and logging contract. Typed hosts use /// [`crate::WorkerType::default_selector_label`] to preserve Dynamo's historical behavior. - pub fn default(kv_router_config: KvRouterConfig, worker_label: &'static str) -> Self { + #[cfg(any(test, feature = "bench"))] + pub fn reference(kv_router_config: KvRouterConfig, worker_label: &'static str) -> Self { let picker = DefaultWorkerPicker::new(); Self { - kv_router_config, worker_label, - state: WorkerSelectionPolicyState::Default(picker), + exclusive_affinity: false, + state: WorkerSelectionPolicyState::Reference(Box::new(kv_router_config), picker), } } } #[inline(always)] -#[allow(clippy::too_many_arguments)] -fn push_scored_candidate( - context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - scorers: &mut [Box], +fn push_picker_candidate( + candidate: &CandidateData, + cost: f64, picker_inputs: WorkerInputs, candidates: &mut Vec, - cache_inputs: &mut Vec, + cache_inputs: &mut Vec, load_inputs: &mut Vec, -) -> Result<(), KvSchedulerError> { - let mut cost = 0.0; - for (scorer_index, scorer) in scorers.iter_mut().enumerate() { - let contribution = scorer.score(context, candidate)?; - cost += contribution; - if !contribution.is_finite() || !cost.is_finite() { - return Err(WorkerSelectionPolicyError::NonFiniteCost { - scorer_index, - row: candidates.len(), - } - .into()); - } - } +) { candidates.push(ScoredWorkerCandidate { worker: candidate.worker, cost, - preferred_taint_multiplier: candidate.preferred_taint_multiplier, + preferred_taint_multiplier: if picker_inputs.contains(WorkerInputs::PREFERRED_TAINT) { + candidate.preferred_taint_multiplier + } else { + None + }, }); if picker_inputs.contains(WorkerInputs::CACHE) { cache_inputs.push(candidate.cache); @@ -149,34 +169,86 @@ fn push_scored_candidate( if picker_inputs.contains(WorkerInputs::LOAD) { load_inputs.push(candidate.load); } - Ok(()) } -pub(super) fn collect_custom_candidates( - state: &mut CustomWorkerSelectionState, +impl ComposedPolicyState { + // Keep row construction and storage together to avoid passing a full row through a call. + #[inline(always)] + fn push_candidate(&mut self, candidate: CandidateData) { + // Build the picker's rows alongside the input snapshot. The scoring loop then only + // writes costs, without growing vectors or copying optional columns across trait calls. + push_picker_candidate( + &candidate, + 0.0, + self.picker_inputs, + &mut self.candidates, + &mut self.cache_inputs, + &mut self.load_inputs, + ); + if !self.scorers.is_empty() { + // Picker-only policies do not need a second copy of the worker inputs. + self.unscored_candidates.push(candidate); + } + } + + fn score_candidates( + &mut self, + context: &WorkerSelectionContext<'_>, + cache_snapshot: &CacheSnapshot<'_>, + ) -> Result<(), KvSchedulerError> { + let Self { + scorers, + unscored_candidates, + score_contributions, + candidates, + .. + } = self; + if unscored_candidates.is_empty() { + return Ok(()); + } + debug_assert_eq!(unscored_candidates.len(), candidates.len()); + score_contributions.resize(candidates.len(), f64::NAN); + for (scorer_index, (inputs, scorer)) in scorers.iter_mut().enumerate() { + score_contributions.fill(f64::NAN); + scorer.score( + context, + WorkerCandidates::new(unscored_candidates, *inputs, cache_snapshot), + score_contributions, + )?; + for (row, (contribution, scored)) in score_contributions + .iter() + .zip(candidates.iter_mut()) + .enumerate() + { + let cost = scored.cost + contribution; + if !contribution.is_finite() || !cost.is_finite() { + return Err( + WorkerSelectionPolicyError::NonFiniteCost { scorer_index, row }.into(), + ); + } + scored.cost = cost; + } + } + Ok(()) + } +} + +pub(super) fn collect_policy_candidates( + state: &mut ComposedPolicyState, input: &MaterializedSelectionInput<'_>, workers: &HashMap, request: &SchedulingRequest, eligibility: RoutingEligibility<'_>, ) -> Result { - let CustomWorkerSelectionState { - filters, - scorers, - filter_inputs, - scorer_picker_inputs, - picker_inputs, - candidates, - cache_inputs, - load_inputs, - .. - } = state; - candidates.clear(); - cache_inputs.clear(); - load_inputs.clear(); - if filters.is_empty() { + state.unscored_candidates.clear(); + state.candidates.clear(); + state.cache_inputs.clear(); + state.load_inputs.clear(); + if state.filters.is_empty() { let materialize_preferred_taint = eligibility.pinned_worker().is_none() - && scorer_picker_inputs.contains(WorkerInputs::PREFERRED_TAINT); - let mut error = None; + && state + .scorer_picker_inputs + .contains(WorkerInputs::PREFERRED_TAINT); eligibility.any_eligible_worker_rank(workers, |worker, config| { let preferred_taint_multiplier = if materialize_preferred_taint { request @@ -185,30 +257,21 @@ pub(super) fn collect_custom_candidates( } else { None }; - let candidate = input.row(worker, preferred_taint_multiplier, *scorer_picker_inputs); - if let Err(policy_error) = push_scored_candidate( - &input.context, - &candidate, - scorers, - *picker_inputs, - candidates, - cache_inputs, - load_inputs, - ) { - error = Some(policy_error); - return true; - } + let candidate = input.row( + worker, + preferred_taint_multiplier, + state.scorer_picker_inputs, + ); + state.push_candidate(candidate); false }); - if let Some(error) = error { - return Err(error); - } - return Ok(!candidates.is_empty()); + state.score_candidates(&input.context, &input.cache_snapshot)?; + return Ok(!state.candidates.is_empty()); } - let additional_inputs = scorer_picker_inputs.without(*filter_inputs); + let additional_inputs = state.scorer_picker_inputs.without(state.filter_inputs); let materialize_filter_preferred_taint = eligibility.pinned_worker().is_none() - && filter_inputs.contains(WorkerInputs::PREFERRED_TAINT); + && state.filter_inputs.contains(WorkerInputs::PREFERRED_TAINT); let materialize_additional_preferred_taint = eligibility.pinned_worker().is_none() && additional_inputs.contains(WorkerInputs::PREFERRED_TAINT); let mut has_eligible_worker = false; @@ -222,9 +285,16 @@ pub(super) fn collect_custom_candidates( } else { None }; - let filter_candidate = input.row(worker, filter_preferred_taint_multiplier, *filter_inputs); - for filter in filters.iter_mut() { - match filter.keep(&input.context, &filter_candidate) { + let filter_candidate = input.row( + worker, + filter_preferred_taint_multiplier, + state.filter_inputs, + ); + for (inputs, filter) in &mut state.filters { + match filter.keep( + &input.context, + WorkerCandidate::new(&filter_candidate, *inputs, &input.cache_snapshot), + ) { Ok(true) => {} Ok(false) => return false, Err(policy_error) => { @@ -246,36 +316,31 @@ pub(super) fn collect_custom_candidates( additional_preferred_taint_multiplier, additional_inputs, ); - let candidate = filter_candidate.with_inputs_from(&additional, *scorer_picker_inputs); - if let Err(policy_error) = push_scored_candidate( - &input.context, - &candidate, - scorers, - *picker_inputs, - candidates, - cache_inputs, - load_inputs, - ) { - error = Some(policy_error); - return true; - } + let candidate = filter_candidate.with_inputs_from(&additional, state.scorer_picker_inputs); + state.push_candidate(candidate); false }); if let Some(error) = error { return Err(error); } + state.score_candidates(&input.context, &input.cache_snapshot)?; Ok(has_eligible_worker) } impl WorkerSelector for WorkerSelectionPolicy { fn uses_exclusive_affinity_target(&self) -> bool { - matches!(&self.state, WorkerSelectionPolicyState::Default(_)) + #[cfg(any(test, feature = "bench"))] + if matches!(&self.state, WorkerSelectionPolicyState::Reference(..)) { + return true; + } + self.exclusive_affinity } fn required_worker_inputs(&self) -> WorkerInputs { match &self.state { - WorkerSelectionPolicyState::Default(_) => WorkerInputs::CACHE | WorkerInputs::LOAD, - WorkerSelectionPolicyState::Custom(state) => { + #[cfg(any(test, feature = "bench"))] + WorkerSelectionPolicyState::Reference(..) => WorkerInputs::CACHE | WorkerInputs::LOAD, + WorkerSelectionPolicyState::Composed(state) => { let state = state.borrow(); state.filter_inputs | state.scorer_picker_inputs } @@ -289,15 +354,15 @@ impl WorkerSelector for WorkerSelectionPolicy { ) -> Result { let (workers, request, eligibility, block_size) = input.into_configured()?; let state = match &self.state { - WorkerSelectionPolicyState::Default(picker) => { - WorkerSelectionPolicyStateRef::Default(picker) + #[cfg(any(test, feature = "bench"))] + WorkerSelectionPolicyState::Reference(config, picker) => { + WorkerSelectionPolicyStateRef::Reference(config, picker) } - WorkerSelectionPolicyState::Custom(state) => { - WorkerSelectionPolicyStateRef::Custom(state) + WorkerSelectionPolicyState::Composed(state) => { + WorkerSelectionPolicyStateRef::Composed(state) } }; select_worker_with_policy( - &self.kv_router_config, self.worker_label, state, workers, @@ -310,6 +375,9 @@ impl WorkerSelector for WorkerSelectionPolicy { #[cfg(test)] mod tests { + use crate::plugins::worker_selection::WorkerInputView; + use crate::protocols::WorkerWithDpRank; + use crate::scheduling::SessionContext; use std::{ cell::Cell, collections::{HashMap, HashSet}, @@ -320,9 +388,6 @@ mod tests { use super::super::DefaultWorkerSelector; use super::super::test_support::*; use super::*; - use crate::SessionContext; - use crate::plugins::worker_selection::WorkerInputView; - use crate::protocols::WorkerWithDpRank; use crate::scheduling::WorkerSelectionInputTrigger; fn uses_exclusive_affinity(selector: &impl WorkerSelector) -> bool { @@ -365,7 +430,7 @@ mod tests { 16, )) .unwrap(); - let policy = WorkerSelectionPolicy::default(config, "test"); + let policy = WorkerSelectionPolicy::reference(config, "test"); assert!(uses_exclusive_affinity(&policy)); let actual = policy .select_worker(WorkerSelectionInput::configured( @@ -456,10 +521,14 @@ mod tests { fn score( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - assert!(candidate.preferred_taint_multiplier().is_some()); - Ok(0.0) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + assert!(candidate.preferred_taint_multiplier().is_some()); + *cost = 0.0; + } + Ok(()) } } @@ -600,7 +669,12 @@ mod tests { input: WorkerInputView<'_>, ) -> Result { assert_eq!( - input.cache().expect("cache input")[0].device_overlap_blocks(), + input + .cache() + .expect("cache input") + .get(0) + .unwrap() + .device_overlap_blocks(), 0.0 ); Ok(0) @@ -742,7 +816,7 @@ mod tests { fn keep( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, + candidate: WorkerCandidate<'_>, ) -> Result { assert!(candidate.cache().is_none()); assert!(candidate.load().is_none()); @@ -761,8 +835,9 @@ mod tests { fn score( &mut self, _context: &WorkerSelectionContext<'_>, - _candidate: &WorkerCandidate, - ) -> Result { + _candidates: WorkerCandidates<'_>, + _costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { unreachable!("rejected worker must not reach scorers") } } @@ -799,7 +874,7 @@ mod tests { fn keep( &mut self, _context: &WorkerSelectionContext<'_>, - _candidate: &WorkerCandidate, + _candidate: WorkerCandidate<'_>, ) -> Result { Ok(true) } @@ -814,9 +889,13 @@ mod tests { fn score( &mut self, _context: &WorkerSelectionContext<'_>, - _candidate: &WorkerCandidate, - ) -> Result { - Ok(0.0) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (_candidate, cost) in candidates.iter().zip(costs) { + *cost = 0.0; + } + Ok(()) } } diff --git a/lib/kv-router/src/scheduling/selector/default.rs b/lib/kv-router/src/scheduling/selector/reference.rs similarity index 94% rename from lib/kv-router/src/scheduling/selector/default.rs rename to lib/kv-router/src/scheduling/selector/reference.rs index ad39dfc005f3..c551a00b135e 100644 --- a/lib/kv-router/src/scheduling/selector/default.rs +++ b/lib/kv-router/src/scheduling/selector/reference.rs @@ -10,8 +10,8 @@ use parking_lot::Mutex; use super::policy::WorkerSelectionPolicyStateRef; use super::{ - LogitWeights, MaterializedSelectionInput, WorkerCandidate, WorkerInputs, - WorkerSelectionContext, WorkerSelectionInput, WorkerSelector, select_worker_with_policy, + CandidateData, MaterializedSelectionInput, WorkerInputs, WorkerSelectionContext, + WorkerSelectionInput, WorkerSelector, select_worker_with_policy, }; use crate::protocols::{WorkerConfigLike, WorkerId, WorkerSelectionResult, WorkerWithDpRank}; use crate::scheduling::config::KvRouterConfig; @@ -88,6 +88,14 @@ fn softmax_sample_index( entries.len() - 1 } +#[derive(Debug, Clone, Copy)] +struct LogitWeights { + overlap_score_credit: f64, + overlap_score_credit_decay: f64, + prefill_load_scale: f64, + shared_cache_multiplier: f64, +} + /// Default implementation matching the Python _cost_function. pub struct DefaultWorkerSelector { pub kv_router_config: KvRouterConfig, @@ -102,6 +110,7 @@ pub(super) struct DefaultWorkerScorer { #[derive(Debug, Clone, Copy)] struct DefaultScoringContext { + weights: LogitWeights, min_active_prefill_tokens: usize, has_tier_overlap_blocks: bool, } @@ -192,7 +201,7 @@ impl DefaultWorkerScorer { } } -pub(super) fn selection_weights( +fn selection_weights( kv_router_config: &KvRouterConfig, request: &SchedulingRequest, ) -> LogitWeights { @@ -237,6 +246,7 @@ impl DefaultScoringContext { || !request.overlap.tier_overlap_blocks.host_pinned.is_empty() || !request.overlap.tier_overlap_blocks.disk.is_empty(); Self { + weights, min_active_prefill_tokens, has_tier_overlap_blocks, } @@ -256,7 +266,7 @@ fn default_row( context: DefaultScoringContext, worker: WorkerWithDpRank, preferred_taint_multiplier: Option, -) -> WorkerCandidate { +) -> CandidateData { input.row_with_device_overlap( worker, preferred_taint_multiplier, @@ -272,17 +282,23 @@ impl> DefaultWorkerScorer { &self, context: &WorkerSelectionContext<'_>, default_context: DefaultScoringContext, - row: &WorkerCandidate, + row: &CandidateData, formula_name: &'static str, ) -> f64 { let kv_router_config = self.kv_router_config.borrow(); - let weights = context.weights; + let weights = default_context.weights; let worker = row.worker; let cache = &row.cache; let load = &row.load; let effective_overlap_blocks = cache.effective_overlap_blocks; let device_overlap_blocks = cache.device_overlap_blocks; - let shared_beyond_device_blocks = cache.shared_beyond_device_blocks; + let shared_beyond_device_blocks = context + .request + .shared_cache_hits + .as_ref() + .map_or(0, |hits| { + hits.hits_beyond(device_overlap_blocks.round().max(0.0) as u32) + }); let shared_overlap_blocks = weights.shared_cache_multiplier * shared_beyond_device_blocks as f64; // Normalize backlog above the least-loaded eligible worker by this request's @@ -328,7 +344,7 @@ impl> DefaultWorkerScorer { // `SchedulerQueueActor` task, so the logging layer cannot attach request identity to // it, and this branch returns early without reaching them. tracing::debug!( - request_id = context.request_id, + request_id = context.request.mode.request_id().unwrap_or("-"), worker_type = self.worker_type, "{formula_name} for worker_id={} dp_rank={:?} with {effective_overlap_blocks:.2} effective cached blocks: {logit:.3} \ = max(0, decode_blocks - overlap_credit_blocks) + active_request_cost_blocks \ @@ -339,7 +355,21 @@ impl> DefaultWorkerScorer { return logit; } - let adjusted_prefill_blocks = (load.raw_prefill_blocks - overlap_credit_blocks).max(0.0); + // Keep reference-only arithmetic out of public worker-input rows, including + // benchmark builds: their layout must match the production plugin's inputs. + let raw_prefill_tokens = if context.track_prefill_tokens { + if load.available { + let cached_tokens = cache.estimated_cached_tokens; + let uncached_tokens = context.request.isl_tokens.saturating_sub(cached_tokens); + (load.active_prefill_tokens + uncached_tokens).saturating_add(cached_tokens) + } else { + context.request.isl_tokens + } + } else { + 0 + }; + let raw_prefill_blocks = raw_prefill_tokens as f64 / context.block_size as f64; + let adjusted_prefill_blocks = (raw_prefill_blocks - overlap_credit_blocks).max(0.0); let prefill_cost_blocks = weights.prefill_load_scale * adjusted_prefill_blocks; let logit = prefill_cost_blocks + decode_cost_blocks + active_request_cost_blocks; @@ -351,7 +381,7 @@ impl> DefaultWorkerScorer { // inside the macro so they cost nothing when DEBUG is disabled. if shared_beyond_device_blocks > 0 { tracing::debug!( - request_id = context.request_id, + request_id = context.request.mode.request_id().unwrap_or("-"), worker_type = self.worker_type, "{formula_name} for worker_id={} dp_rank={:?} with {effective_overlap_blocks:.2} effective cached blocks, \ {} shared blocks beyond device (multiplier={shared_cache_multiplier:.2}): {logit:.3} \ @@ -362,13 +392,13 @@ impl> DefaultWorkerScorer { worker.worker_id, worker.dp_rank, shared_beyond_device_blocks, - load.raw_prefill_blocks, + raw_prefill_blocks, shared_cache_multiplier = weights.shared_cache_multiplier, prefill_load_scale = weights.prefill_load_scale ); } else { tracing::debug!( - request_id = context.request_id, + request_id = context.request.mode.request_id().unwrap_or("-"), worker_type = self.worker_type, "{formula_name} for worker_id={} dp_rank={:?} with {effective_overlap_blocks:.2} effective cached blocks: {logit:.3} \ = prefill_load_scale * adjusted_prefill_blocks + decode_blocks + active_request_cost_blocks \ @@ -377,7 +407,7 @@ impl> DefaultWorkerScorer { overlap_credit_decay: {overlap_credit_decay:.3})", worker.worker_id, worker.dp_rank, - load.raw_prefill_blocks, + raw_prefill_blocks, prefill_load_scale = weights.prefill_load_scale ); } @@ -390,7 +420,7 @@ impl> DefaultWorkerScorer { &self, context: &WorkerSelectionContext<'_>, default_context: DefaultScoringContext, - row: &WorkerCandidate, + row: &CandidateData, ) -> f64 { let base_score = self.worker_logit(context, default_context, row, "Formula"); match row.preferred_taint_multiplier { @@ -420,8 +450,12 @@ pub(super) fn pick_default_worker( request: &SchedulingRequest, eligibility: RoutingEligibility<'_>, ) -> Option<(WorkerWithDpRank, f64)> { - let default_context = - DefaultScoringContext::new(workers, request, eligibility, input.context.weights); + let default_context = DefaultScoringContext::new( + workers, + request, + eligibility, + selection_weights(scorer.kv_router_config, request), + ); if let Some(worker) = eligibility.pinned_worker() { let row = default_row(input, default_context, worker, None); return Some(( @@ -554,9 +588,8 @@ impl WorkerSelector for DefaultWorkerSelector { ) -> Result { let (workers, request, eligibility, block_size) = input.into_configured()?; select_worker_with_policy( - &self.kv_router_config, self.worker_type, - WorkerSelectionPolicyStateRef::Default(&self.picker), + WorkerSelectionPolicyStateRef::Reference(&self.kv_router_config, &self.picker), workers, request, eligibility, @@ -585,7 +618,7 @@ mod tests { weights: LogitWeights, ) -> f64 { let workers = HashMap::from([(worker.worker_id, TaintedWorkerConfig::default())]); - let input = MaterializedSelectionInput::new(request, block_size, weights); + let input = MaterializedSelectionInput::new(request, block_size); let default_context = DefaultScoringContext::new(&workers, request, request.eligibility(), weights); DefaultWorkerScorer::new(selector.kv_router_config.clone(), selector.worker_type) @@ -673,8 +706,8 @@ mod tests { isl_tokens: 16, overlap: OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::default(), - effective_cached_tokens: HashMap::default(), + effective_overlap_blocks: Default::default(), + effective_cached_tokens: Default::default(), }, kv_transfer_candidates: None, retain_kv_transfer_chain: false, @@ -1076,8 +1109,8 @@ mod tests { isl_tokens: 16, overlap: OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::default(), - effective_cached_tokens: HashMap::default(), + effective_overlap_blocks: Default::default(), + effective_cached_tokens: Default::default(), }, kv_transfer_candidates: None, retain_kv_transfer_chain: false, @@ -1135,8 +1168,8 @@ mod tests { isl_tokens: 16, overlap: OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::default(), - effective_cached_tokens: HashMap::default(), + effective_overlap_blocks: Default::default(), + effective_cached_tokens: Default::default(), }, kv_transfer_candidates: None, retain_kv_transfer_chain: false, @@ -1212,8 +1245,8 @@ mod tests { isl_tokens: 16, overlap: OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::default(), - effective_cached_tokens: HashMap::default(), + effective_overlap_blocks: Default::default(), + effective_cached_tokens: Default::default(), }, kv_transfer_candidates: None, retain_kv_transfer_chain: false, @@ -1287,8 +1320,8 @@ mod tests { isl_tokens: 16, overlap: OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::default(), - effective_cached_tokens: HashMap::default(), + effective_overlap_blocks: Default::default(), + effective_cached_tokens: Default::default(), }, kv_transfer_candidates: None, retain_kv_transfer_chain: false, @@ -1358,8 +1391,8 @@ mod tests { isl_tokens: 16, overlap: OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::default(), - effective_cached_tokens: HashMap::default(), + effective_overlap_blocks: Default::default(), + effective_cached_tokens: Default::default(), }, kv_transfer_candidates: None, retain_kv_transfer_chain: false, @@ -1411,11 +1444,11 @@ mod tests { let isl = 4usize; let worker0 = WorkerWithDpRank::from_worker_id(0); - let mut effective_overlap_blocks = HashMap::new(); + let mut effective_overlap_blocks = rustc_hash::FxHashMap::default(); effective_overlap_blocks.insert(worker0, 2.0); // worker1 has 0 overlap (not in map) - let mut effective_cached_tokens = HashMap::new(); + let mut effective_cached_tokens = rustc_hash::FxHashMap::default(); effective_cached_tokens.insert(worker0, 2); let mut tier_overlap_blocks = crate::scheduling::TierOverlapBlocks::default(); @@ -1492,7 +1525,7 @@ mod tests { let worker0 = WorkerWithDpRank::from_worker_id(0); let worker1 = WorkerWithDpRank::from_worker_id(1); - let mut effective_cached_tokens = HashMap::new(); + let mut effective_cached_tokens = rustc_hash::FxHashMap::default(); effective_cached_tokens.insert(worker0, 32); let mut tier_overlap_blocks = crate::scheduling::TierOverlapBlocks::default(); @@ -1523,7 +1556,7 @@ mod tests { isl_tokens: isl, overlap: OverlapSignals { tier_overlap_blocks, - effective_overlap_blocks: HashMap::new(), + effective_overlap_blocks: Default::default(), effective_cached_tokens, }, kv_transfer_candidates: None, @@ -1798,7 +1831,7 @@ mod tests { let worker0 = WorkerWithDpRank::from_worker_id(0); let worker1 = WorkerWithDpRank::from_worker_id(1); - let mut effective_overlap_blocks = HashMap::new(); + let mut effective_overlap_blocks = rustc_hash::FxHashMap::default(); effective_overlap_blocks.insert(worker0, 4.0); let config = KvRouterConfig { @@ -1826,7 +1859,7 @@ mod tests { overlap: OverlapSignals { tier_overlap_blocks: Default::default(), effective_overlap_blocks, - effective_cached_tokens: HashMap::new(), + effective_cached_tokens: Default::default(), }, kv_transfer_candidates: None, retain_kv_transfer_chain: false, @@ -1877,16 +1910,30 @@ mod tests { prefill_load_scale: 1.0, shared_cache_multiplier: 1.0, }; - let input = MaterializedSelectionInput::new(&request, 16, weights); + let input = MaterializedSelectionInput::new(&request, 16); let default_context = DefaultScoringContext::new(&workers, &request, request.eligibility(), weights); let custom_row = input.row(worker, None, WorkerInputs::CACHE); let default_row = default_row(&input, default_context, worker, None); assert_eq!(custom_row.cache.device_overlap_blocks, 0.0); - assert_eq!(custom_row.cache.shared_beyond_device_blocks, 4); + assert_eq!( + request + .shared_cache_hits + .as_ref() + .unwrap() + .hits_beyond(custom_row.cache.device_overlap_blocks as u32), + 4 + ); assert_eq!(default_row.cache.device_overlap_blocks, 2.0); - assert_eq!(default_row.cache.shared_beyond_device_blocks, 2); + assert_eq!( + request + .shared_cache_hits + .as_ref() + .unwrap() + .hits_beyond(default_row.cache.device_overlap_blocks as u32), + 2 + ); } /// Without shared cache hits, the scoring should be unchanged. @@ -1898,7 +1945,7 @@ mod tests { let isl = 64usize; let worker0 = WorkerWithDpRank::from_worker_id(0); - let mut effective_overlap_blocks = HashMap::new(); + let mut effective_overlap_blocks = rustc_hash::FxHashMap::default(); effective_overlap_blocks.insert(worker0, 2.0); let config = KvRouterConfig::default(); @@ -1916,7 +1963,7 @@ mod tests { overlap: OverlapSignals { tier_overlap_blocks: Default::default(), effective_overlap_blocks, - effective_cached_tokens: HashMap::new(), + effective_cached_tokens: Default::default(), }, kv_transfer_candidates: None, retain_kv_transfer_chain: false, diff --git a/lib/kv-router/src/scheduling/types.rs b/lib/kv-router/src/scheduling/types.rs index 00b86e50f9d1..9400daf832a0 100644 --- a/lib/kv-router/src/scheduling/types.rs +++ b/lib/kv-router/src/scheduling/types.rs @@ -603,8 +603,8 @@ mod tests { session_context: None, overlap: OverlapSignals { tier_overlap_blocks: Default::default(), - effective_overlap_blocks: HashMap::default(), - effective_cached_tokens: HashMap::default(), + effective_overlap_blocks: Default::default(), + effective_cached_tokens: Default::default(), }, kv_transfer_candidates: None, retain_kv_transfer_chain: false, diff --git a/lib/kv-router/src/services/selection/core/mod.rs b/lib/kv-router/src/services/selection/core/mod.rs index bae4224752ff..404203b87640 100644 --- a/lib/kv-router/src/services/selection/core/mod.rs +++ b/lib/kv-router/src/services/selection/core/mod.rs @@ -276,7 +276,7 @@ pub struct SelectionCore { listens_for_kv_events: bool, indexer_registry: Arc, kv_router_config: crate::config::KvRouterConfig, - worker_selection_policy_factory: Option, + worker_selection_policy_factory: WorkerSelectionPolicyFactory, host: SelectionHost, worker_type: WorkerType, cancel_token: CancellationToken, @@ -327,6 +327,7 @@ impl SelectionCore { indexer_threads: usize, cancel_token: CancellationToken, cache_config: SelectionCacheConfig, + policy_factory: WorkerSelectionPolicyFactory, ) -> anyhow::Result { kv_router_config .validate_config() @@ -338,7 +339,7 @@ impl SelectionCore { indexer_threads, cancel_token, None, - None, + policy_factory, SelectionHost::default(), WorkerType::Aggregated, true, @@ -359,7 +360,7 @@ impl SelectionCore { indexer_threads: usize, cancel_token: CancellationToken, replica_config: Option, - worker_selection_policy_factory: Option, + worker_selection_policy_factory: WorkerSelectionPolicyFactory, host: SelectionHost, worker_type: WorkerType, signal_indexer_ready: bool, diff --git a/lib/kv-router/src/services/selection/core/queries.rs b/lib/kv-router/src/services/selection/core/queries.rs index 66d862bd08e6..46413b7782b2 100644 --- a/lib/kv-router/src/services/selection/core/queries.rs +++ b/lib/kv-router/src/services/selection/core/queries.rs @@ -25,7 +25,7 @@ impl SelectionCore { routing_group: entry.key.routing_group.clone(), loads: entry .scheduler - .get_potential_loads(None, 0, HashMap::new(), false), + .get_potential_loads(None, 0, Default::default(), false), pending_count: entry.scheduler.pending_count(), pending_isl_tokens: entry.scheduler.pending_isl_tokens(), }); diff --git a/lib/kv-router/src/services/selection/core/tests.rs b/lib/kv-router/src/services/selection/core/tests.rs index 3c2af0e9e2fd..ee7319628181 100644 --- a/lib/kv-router/src/services/selection/core/tests.rs +++ b/lib/kv-router/src/services/selection/core/tests.rs @@ -39,6 +39,9 @@ fn local_core_with( indexer_threads, cancel_token, SelectionCacheConfig::default(), + std::sync::Arc::new(|config, role, _| { + crate::WorkerSelectionPolicy::reference(config.clone(), role.default_selector_label()) + }), ) .expect("valid test config") } @@ -60,7 +63,14 @@ fn core_with( 1, CancellationToken::new(), None, - policy_factory, + policy_factory.unwrap_or_else(|| { + Arc::new(|config, role, _| { + crate::WorkerSelectionPolicy::reference( + config.clone(), + role.default_selector_label(), + ) + }) + }), host, worker_type, true, @@ -693,7 +703,11 @@ impl crate::scheduling::selector::WorkerPicker for CapturingPicker { .cache() .expect("CACHE inputs requested") .iter() - .map(|cache| cache.shared_beyond_device_blocks()) + .map(|cache| { + cache.shared_hits().map_or(0, |hits| { + hits.hits_beyond(cache.device_overlap_blocks().round().max(0.0) as u32) + }) + }) .collect(), }); Ok(0) diff --git a/lib/kv-router/src/services/selection/core/workers.rs b/lib/kv-router/src/services/selection/core/workers.rs index 2d87f3706c84..2423d8845bf7 100644 --- a/lib/kv-router/src/services/selection/core/workers.rs +++ b/lib/kv-router/src/services/selection/core/workers.rs @@ -316,9 +316,10 @@ impl SelectionCore { block_size, )) }); - let selector = self.worker_selection_policy_factory.as_ref().map_or_else( - || WorkerSelectionPolicy::default(self.kv_router_config.clone(), worker_label), - |factory| factory(&self.kv_router_config, self.worker_type, key.as_ref()), + let selector = (self.worker_selection_policy_factory)( + &self.kv_router_config, + self.worker_type, + key.as_ref(), ); let profile = self .kv_router_config diff --git a/lib/kv-router/src/services/selection/membership.rs b/lib/kv-router/src/services/selection/membership.rs index 9158303561fa..a5ff153f696e 100644 --- a/lib/kv-router/src/services/selection/membership.rs +++ b/lib/kv-router/src/services/selection/membership.rs @@ -218,6 +218,12 @@ mod tests { 1, CancellationToken::new(), SelectionCacheConfig::default(), + std::sync::Arc::new(|config, role, _| { + crate::WorkerSelectionPolicy::reference( + config.clone(), + role.default_selector_label(), + ) + }), ) .expect("valid test config"), ) diff --git a/lib/kv-router/src/services/selection/service.rs b/lib/kv-router/src/services/selection/service.rs index 1dc026914029..fedcbcc60eb5 100644 --- a/lib/kv-router/src/services/selection/service.rs +++ b/lib/kv-router/src/services/selection/service.rs @@ -158,10 +158,11 @@ impl SelectionServiceBuilder { anyhow::bail!("standalone selection does not support request_classifier plugins"); } let worker_selection_policy_factory = match self.worker_selection_policy_factory { - Some(factory) => Some(factory), + Some(factory) => factory, None => self .plugin_registry - .resolve_for_worker_type(&self.kv_router_config, self.worker_type)?, + .resolve_for_worker_type(&self.kv_router_config, self.worker_type)? + .ok_or(crate::plugins::WorkerSelectionPolicyRegistryError::MissingDefault)?, }; let tracking_hash = Arc::new(TrackingHashContext::from_config(&self.kv_router_config)?); let indexer_policy = IndexerPolicy::from_router_config(&self.kv_router_config)?; @@ -317,6 +318,12 @@ impl SelectionService { indexer_threads, cancel_token.clone(), SelectionCacheConfig::default(), + std::sync::Arc::new(|config, role, _| { + crate::WorkerSelectionPolicy::reference( + config.clone(), + role.default_selector_label(), + ) + }), ) .expect("valid test config"), ), @@ -522,6 +529,30 @@ mod tests { } } + fn test_registry() -> RouterPluginRegistry { + RouterPluginRegistry::default().with_default_factory(Arc::new(|config, role, _| { + crate::WorkerSelectionPolicy::reference(config.clone(), role.default_selector_label()) + })) + } + + #[tokio::test] + async fn missing_default_is_rejected_at_construction() { + let result = SelectionServiceBuilder::new( + test_config(), + WorkerType::Aggregated, + RouterPluginRegistry::default(), + ) + .build() + .await; + let Err(error) = result else { + panic!("missing default accepted") + }; + assert!(matches!( + error.downcast_ref::(), + Some(crate::plugins::WorkerSelectionPolicyRegistryError::MissingDefault) + )); + } + fn reserve_tcp_port() -> u16 { StdTcpListener::bind("127.0.0.1:0") .unwrap() @@ -600,7 +631,7 @@ worker_selection: match SelectionServiceBuilder::new( test_config(), WorkerType::Aggregated, - RouterPluginRegistry::default(), + test_registry(), ) .indexer_threads(1) .replica_sync(port, Vec::new()) @@ -619,15 +650,12 @@ worker_selection: #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn startup_and_shutdown_release_replica_resources() { let port = reserve_tcp_port(); - let failed = SelectionServiceBuilder::new( - test_config(), - WorkerType::Aggregated, - RouterPluginRegistry::default(), - ) - .indexer_threads(1) - .replica_sync(port, vec!["invalid".to_string()]) - .build() - .await; + let failed = + SelectionServiceBuilder::new(test_config(), WorkerType::Aggregated, test_registry()) + .indexer_threads(1) + .replica_sync(port, vec!["invalid".to_string()]) + .build() + .await; assert!(failed.is_err()); let service = build_on_port(port).await; @@ -674,14 +702,10 @@ worker_selection: let server = tokio::spawn(async move { axum::serve(listener, app).await }); let build = tokio::spawn( - SelectionServiceBuilder::new( - test_config(), - WorkerType::Aggregated, - RouterPluginRegistry::default(), - ) - .indexer_threads(1) - .indexer_peers(vec![peer_url]) - .build(), + SelectionServiceBuilder::new(test_config(), WorkerType::Aggregated, test_registry()) + .indexer_threads(1) + .indexer_peers(vec![peer_url]) + .build(), ); tokio::time::timeout(Duration::from_secs(3), gate.requested.notified()) .await diff --git a/lib/kv-router/src/services/selection/tests.rs b/lib/kv-router/src/services/selection/tests.rs index 78b9b62179ac..f2b6c73d5589 100644 --- a/lib/kv-router/src/services/selection/tests.rs +++ b/lib/kv-router/src/services/selection/tests.rs @@ -26,7 +26,7 @@ use crate::scheduling::WorkerSelectionPolicyError; use crate::scheduling::config::RouterConfigOverride; use crate::scheduling::overlap::build_overlap_scores_response; use crate::scheduling::selector::{ - WorkerCandidate, WorkerFilter, WorkerInputView, WorkerPicker, WorkerScorer, + WorkerCandidate, WorkerCandidates, WorkerFilter, WorkerInputView, WorkerPicker, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicy, }; use crate::{TrackingHashContext, TrackingHashScope}; @@ -51,9 +51,13 @@ impl WorkerScorer for WorkerIdScorer { fn score( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - Ok(candidate.worker().worker_id as f64) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + *cost = candidate.worker().worker_id as f64; + } + Ok(()) } } @@ -81,9 +85,13 @@ impl WorkerScorer for NonFiniteScorer { fn score( &mut self, _context: &WorkerSelectionContext<'_>, - _candidate: &WorkerCandidate, - ) -> Result { - Ok(f64::NAN) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (_candidate, cost) in candidates.iter().zip(costs) { + *cost = f64::NAN; + } + Ok(()) } } @@ -105,7 +113,7 @@ impl WorkerFilter for RejectAllFilter { fn keep( &mut self, _context: &WorkerSelectionContext<'_>, - _candidate: &WorkerCandidate, + _candidate: WorkerCandidate<'_>, ) -> Result { Ok(false) } @@ -117,7 +125,7 @@ impl WorkerFilter for RejectWorker { fn keep( &mut self, _context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, + candidate: WorkerCandidate<'_>, ) -> Result { Ok(candidate.worker().worker_id != self.0) } @@ -1783,7 +1791,14 @@ async fn selector_replica_sync_propagates_request_lifecycle() { config_a .service_builder( crate::WorkerType::Aggregated, - WorkerSelectionPolicyRegistry::default(), + WorkerSelectionPolicyRegistry::default().with_default_factory(Arc::new( + |config, role, _| { + crate::WorkerSelectionPolicy::reference( + config.clone(), + role.default_selector_label(), + ) + }, + )), ) .build() .await @@ -1793,7 +1808,14 @@ async fn selector_replica_sync_propagates_request_lifecycle() { SelectionServiceBuilder::new( test_config(), crate::WorkerType::Aggregated, - WorkerSelectionPolicyRegistry::default(), + WorkerSelectionPolicyRegistry::default().with_default_factory(Arc::new( + |config, role, _| { + crate::WorkerSelectionPolicy::reference( + config.clone(), + role.default_selector_label(), + ) + }, + )), ) .indexer_threads(1) .replica_sync(port_b, Vec::new()) diff --git a/lib/kv-router/tests/plugin_api_compat.rs b/lib/kv-router/tests/plugin_api_compat.rs index 27964d9da8a2..c93ae21d0c99 100644 --- a/lib/kv-router/tests/plugin_api_compat.rs +++ b/lib/kv-router/tests/plugin_api_compat.rs @@ -1,7 +1,8 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -//! Compile old plugin implementations against the canonical registry and contracts. +//! Compile legacy plugin import paths against the canonical registry and contracts. +//! Scorer implementations use the current batch signature; old scalar signatures must migrate. //! TODO(v1.7): Remove the legacy import coverage when the compatibility exports are removed. use std::sync::Arc; @@ -9,9 +10,9 @@ use std::sync::Arc; use dynamo_kv_router::plugins::{RouterPluginRegistry, request_classifier, worker_selection}; use dynamo_kv_router::scheduling::{ClassifyFuture, ClassifyRequest, RequestClassifier}; use dynamo_kv_router::{ - KvRouterConfig, RoutingPartitionRef, WorkerCandidate, WorkerFilter, WorkerInputView, - WorkerInputs, WorkerPicker, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicy, - WorkerSelectionPolicyError, WorkerType, + KvRouterConfig, RoutingPartitionRef, WorkerCandidate, WorkerCandidates, WorkerFilter, + WorkerInputView, WorkerInputs, WorkerPicker, WorkerScorer, WorkerSelectionContext, + WorkerSelectionPolicy, WorkerSelectionPolicyError, WorkerType, }; struct LegacyPolicy; @@ -24,7 +25,7 @@ impl WorkerFilter for LegacyPolicy { fn keep( &mut self, context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, + candidate: WorkerCandidate<'_>, ) -> Result { let _: Option<&dynamo_kv_router::SessionContext> = context.session_context(); let _: Option = context.expected_output_tokens(); @@ -41,12 +42,16 @@ impl WorkerScorer for LegacyPolicy { fn score( &mut self, context: &WorkerSelectionContext<'_>, - candidate: &WorkerCandidate, - ) -> Result { - let _: u64 = context.request_blocks(); - let _: u32 = context.block_size(); - let load = candidate.load().expect("requested load inputs"); - Ok(load.active_requests() as f64 + load.decode_cost_blocks()) + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + let _: u64 = context.request_blocks(); + let _: u32 = context.block_size(); + let load = candidate.load().expect("requested load inputs"); + *cost = load.active_requests() as f64 + load.decode_cost_blocks(); + } + Ok(()) } } @@ -110,7 +115,7 @@ fn legacy_plugins_resolve_through_the_common_registry() { .unwrap(); let registry: RouterPluginRegistry = registry; let policy = tempfile::NamedTempFile::new().unwrap(); - std::fs::write(policy.path(), "worker_selection:\n aggregated: legacy\n instances:\n - name: legacy\n type: legacy\n").unwrap(); + std::fs::write(policy.path(), "worker_selection:\n aggregated: legacy\n prefill: legacy\n decode: legacy\n encode: legacy\n instances:\n - name: legacy\n type: legacy\n").unwrap(); let config = KvRouterConfig { router_policy_config: Some(policy.path().display().to_string()), ..Default::default() diff --git a/lib/llm/Cargo.toml b/lib/llm/Cargo.toml index c847abc86e8f..084ae6e9dadf 100644 --- a/lib/llm/Cargo.toml +++ b/lib/llm/Cargo.toml @@ -71,6 +71,7 @@ harness = false required-features = ["media-ffmpeg"] [dependencies] +dynamo-custom-policy-builtin = { workspace = true } # repo dynamo-kv-router = { workspace = true, features = ["metrics", "runtime-protocols", "standalone-selection"] } dynamo-memory = { workspace = true } diff --git a/lib/llm/src/discovery/model_manager.rs b/lib/llm/src/discovery/model_manager.rs index 754c4631f7d0..641d89fb8c71 100644 --- a/lib/llm/src/discovery/model_manager.rs +++ b/lib/llm/src/discovery/model_manager.rs @@ -2323,19 +2323,12 @@ impl ModelManager { None }; - let kv_event_source_requirement = - KvEventSourceRequirement::derive(worker_role, &effective_kv_router_config); - let cache_required = wants_cache - || effective_kv_router_config.serve_indexer - || effective_kv_router_config.enable_session_prefix_index - || matches!( - kv_event_source_requirement, - KvEventSourceRequirement::ConditionalDisaggDecodeCache - | KvEventSourceRequirement::Unknown - ); - let kv_source_membership = if cache_required - && kv_event_source_requirement.should_subscribe(&effective_kv_router_config) - { + let kv_event_source_requirement = KvEventSourceRequirement::derive( + worker_role, + &effective_kv_router_config, + policy.inputs(), + ); + let kv_source_membership = if kv_event_source_requirement.should_subscribe() { Some( self.get_or_create_kv_source_membership_watch(&endpoint) .await?, diff --git a/lib/llm/src/discovery/watcher.rs b/lib/llm/src/discovery/watcher.rs index 0e805059ab0a..f5c7bb6adeef 100644 --- a/lib/llm/src/discovery/watcher.rs +++ b/lib/llm/src/discovery/watcher.rs @@ -29,9 +29,7 @@ use crate::{ entrypoint::{self, ChatEngineFactoryCallback, RouterConfig}, http::service::metrics::Metrics, kv_router::plugins::RouterPluginBuilder, - kv_router::{ - EncoderRouter, PrefillRouter, RouterLoadSource, RoutingLoadContext, SelectionPolicySource, - }, + kv_router::{EncoderRouter, PrefillRouter, RouterLoadSource, RoutingLoadContext}, local_model::runtime_config::{ TokenizerBackend, VLLM_INFERENCE_V1_GENERATE_CAPABILITY, VLLM_QWEN_VIDEO_PROCESSOR_CONTRACT_RUNTIME_KEY, @@ -414,7 +412,7 @@ impl ModelWatcher { card.download_config(self.local_model_path.as_deref()) .await?; - validate_policy_worker_role(card, &self.plugins.selection_policy())?; + validate_policy_worker_role(card, &self.plugins)?; // Prepare without exact video routing unless the cohort agreed on a contract. if spec.video_contract.is_none() @@ -1367,13 +1365,9 @@ fn effective_router_config<'a>( /// decode or aggregated, so it requires an explicit `worker_type`. fn validate_policy_worker_role( card: &ModelDeploymentCard, - policy: &SelectionPolicySource, + plugins: &RouterPluginBuilder, ) -> anyhow::Result<()> { - if matches!( - policy, - SelectionPolicySource::Factory(_) | SelectionPolicySource::Prepared(_) - ) && card.worker_type.is_none() - { + if plugins.has_custom_worker_selection() && card.worker_type.is_none() { anyhow::bail!( "custom worker-selection policies require model cards with an explicit worker_type" ); @@ -2139,7 +2133,7 @@ request_classifier: } }); let selectors = Arc::new(parking_lot::Mutex::new(Vec::new())); - let mut registry = dynamo_kv_router::plugins::RouterPluginRegistry::default(); + let mut registry = dynamo_custom_policy_builtin::default_registry(); registry .register_request_classifier("test", Arc::new(move |_| Ok(factory.clone()))) .unwrap(); @@ -2152,7 +2146,7 @@ request_classifier: let selectors = selectors.clone(); Ok(Arc::new(move |config, role, partition| { selectors.lock().push((role, partition.into_owned())); - dynamo_kv_router::WorkerSelectionPolicy::default( + dynamo_custom_policy_builtin::default_policy( config.clone(), role.default_selector_label(), ) @@ -2960,17 +2954,25 @@ request_classifier: } #[test] - fn custom_selector_requires_explicit_worker_type() { - let registry = SelectionPolicySource::Registry; - let factory = SelectionPolicySource::Factory(Arc::new(|_, _, _| { - unreachable!("role validation never constructs the policy") - })); + fn only_explicit_policies_require_typed_model_cards() { + let unresolved = RouterPluginBuilder::default(); + let resolved = dynamo_custom_policy_builtin::default_registry() + .resolve_plugins(&dynamo_kv_router::KvRouterConfig::default()) + .unwrap(); + assert!(resolved.worker_selection().is_some()); + let builtin = RouterPluginBuilder::new(resolved); + let custom = RouterPluginBuilder::new( + dynamo_kv_router::plugins::RouterPlugins::default().with_worker_selection(Arc::new( + |_, _, _| unreachable!("role validation never constructs the policy"), + )), + ); let mut card = ModelDeploymentCard::with_name_only("model"); - assert!(validate_policy_worker_role(&card, ®istry).is_ok()); - assert!(validate_policy_worker_role(&card, &factory).is_err()); + assert!(validate_policy_worker_role(&card, &unresolved).is_ok()); + assert!(validate_policy_worker_role(&card, &builtin).is_ok()); + assert!(validate_policy_worker_role(&card, &custom).is_err()); card.worker_type = Some(WorkerType::Decode); - assert!(validate_policy_worker_role(&card, &factory).is_ok()); + assert!(validate_policy_worker_role(&card, &custom).is_ok()); } #[test] diff --git a/lib/llm/src/entrypoint/input/http.rs b/lib/llm/src/entrypoint/input/http.rs index d01e28b5dfd4..b0f88f1f2b3f 100644 --- a/lib/llm/src/entrypoint/input/http.rs +++ b/lib/llm/src/entrypoint/input/http.rs @@ -102,7 +102,9 @@ impl HttpFrontend { { anyhow::bail!("request classifiers require --router-mode kv"); } - if !self.plugins.is_empty() && !matches!(&engine_config, EngineConfig::Dynamic { .. }) { + if self.plugins.has_custom_plugins() + && !matches!(&engine_config, EngineConfig::Dynamic { .. }) + { anyhow::bail!("custom router plugins require a dynamic engine"); } diff --git a/lib/llm/src/kv_router.rs b/lib/llm/src/kv_router.rs index 363adf9dd576..b6c5cb2e8d94 100644 --- a/lib/llm/src/kv_router.rs +++ b/lib/llm/src/kv_router.rs @@ -9,10 +9,12 @@ use std::{ }; use anyhow::Result; +#[cfg(test)] +use dynamo_kv_router::WorkerSelectionPolicy; use dynamo_kv_router::{ DEFAULT_ROUTING_GROUP, KvSchedulerError, PrefillLoadEstimator, RoutingPartitionRef, SessionPrefixIndexer, SharedKvCache, TrackingHashAlgorithm, TrackingHashContext, - TrackingHashScope, WorkerSelectionPolicy, WorkerSelectionPolicyFactory, + TrackingHashScope, WorkerSelectionPolicyFactory, config::{KvRouterConfig, RouterConfigOverride, min_initial_workers_from_env}, indexer::{ ApproximateLruIncarnation, ApproximateLruStats, KvRouterError, RoutingDecisionHashes, @@ -106,27 +108,23 @@ pub enum SelectionPolicySource { } impl SelectionPolicySource { - /// Resolve to the factory the partition will call. `label` is the worker - /// pool name the default policy logs under. + /// Resolve to the factory the partition will call. The label argument is retained for + /// compatibility; the factory receives the typed worker role. pub fn resolve( &self, config: &KvRouterConfig, worker_type: WorkerType, - label: &'static str, + _label: &'static str, ) -> Result { match self { Self::Factory(factory) => Ok(factory.clone()), Self::Prepared(prepared) => Ok(prepared.factory.clone()), - Self::Registry => Ok( - match worker_selection_policy_registry() - .resolve_for_worker_type(config, worker_type)? - { - Some(factory) => factory, - None => Arc::new(move |config: &KvRouterConfig, _worker_type, _partition| { - WorkerSelectionPolicy::default(config.clone(), label) - }), - }, - ), + Self::Registry => worker_selection_policy_registry() + .resolve_for_worker_type(config, worker_type)? + .ok_or_else(|| { + dynamo_kv_router::plugins::WorkerSelectionPolicyRegistryError::MissingDefault + .into() + }), } } @@ -141,16 +139,26 @@ impl SelectionPolicySource { label: &'static str, model_name: Option<&str>, ) -> Result { - if let Self::Prepared(prepared) = self { - return Ok(prepared); + let prepared = match self { + Self::Prepared(prepared) => prepared, + source => PreparedSelectionPolicy::prepare( + source.resolve(config, worker_type, label)?, + config, + worker_type, + model_name, + ), + }; + if !prepared.inputs().contains(WorkerInputs::CACHE) { + anyhow::ensure!( + !config.serve_indexer, + "serve_indexer requires the worker-selection policy to declare WorkerInputs::CACHE" + ); + anyhow::ensure!( + !config.enable_session_prefix_index, + "enable_session_prefix_index requires the worker-selection policy to declare WorkerInputs::CACHE" + ); } - let factory = self.resolve(config, worker_type, label)?; - Ok(PreparedSelectionPolicy::prepare( - factory, - config, - worker_type, - model_name, - )) + Ok(prepared) } } @@ -398,20 +406,24 @@ pub(crate) enum KvEventSourceRequirement { } impl KvEventSourceRequirement { - pub(crate) fn derive(worker_role: Option, config: &KvRouterConfig) -> Self { - let Some(worker_role) = worker_role else { - return Self::Unknown; - }; - if config.use_remote_indexer || !config.should_subscribe_to_kv_events() { + pub(crate) fn derive( + worker_role: Option, + config: &KvRouterConfig, + inputs: WorkerInputs, + ) -> Self { + if !inputs.contains(WorkerInputs::CACHE) + || config.use_remote_indexer + || !config.use_kv_events + { return Self::NotRequired; } match worker_role { - WorkerType::Prefill | WorkerType::Aggregated => Self::CacheAwareRouting, - WorkerType::Decode if config.conditional_disagg_enabled => { + Some(WorkerType::Decode) if config.conditional_disagg_enabled => { Self::ConditionalDisaggDecodeCache } - WorkerType::Decode | WorkerType::Encode => Self::NotRequired, + Some(_) => Self::CacheAwareRouting, + None => Self::Unknown, } } @@ -431,11 +443,8 @@ impl KvEventSourceRequirement { ) } - pub(crate) fn should_subscribe(self, config: &KvRouterConfig) -> bool { - match self { - Self::Unknown => !config.use_remote_indexer && config.should_subscribe_to_kv_events(), - requirement => requirement.requires_source(), - } + pub(crate) fn should_subscribe(self) -> bool { + self != Self::NotRequired } } @@ -737,16 +746,11 @@ impl KvRouter { let tracking_hash = TrackingHashContext::from_config(&kv_router_config)?; let tracking_model_name = resolve_tracking_model_name(tracking_hash.algorithm(), model_name.as_deref())?; - let kv_event_source_requirement = - KvEventSourceRequirement::derive(worker_role, &kv_router_config); - let cache_required = required_worker_inputs.contains(WorkerInputs::CACHE) - || kv_router_config.serve_indexer - || kv_router_config.enable_session_prefix_index - || matches!( - kv_event_source_requirement, - KvEventSourceRequirement::ConditionalDisaggDecodeCache - | KvEventSourceRequirement::Unknown - ); + let kv_event_source_requirement = KvEventSourceRequirement::derive( + worker_role, + &kv_router_config, + required_worker_inputs, + ); let component = endpoint.component(); // All chooser tasks are children of the routing load context owner. let cancellation_token = parent_token.child_token(); @@ -763,7 +767,7 @@ impl KvRouter { model_name: model_name.as_deref(), worker_role, metric_worker_type, - cache_required, + worker_inputs: required_worker_inputs, kv_event_source_requirement, kv_source_membership, cancellation_token: cancellation_token.clone(), @@ -773,7 +777,7 @@ impl KvRouter { let indexer = ingress.indexer().clone(); let approximate_lru_metrics = metrics::ApproximateLruMetrics::from_component(component); let configured_policy = kv_router_config.router_approximate_cache_policy.to_string(); - let effective_policy = if kv_router_config.overlap_score_credit <= 0.0 { + let effective_policy = if matches!(indexer, Indexer::None) { "disabled" } else if indexer.uses_approximate_lru() { "lru" @@ -1777,7 +1781,7 @@ impl KvRouter { Ok(self.selection.scheduler().get_potential_loads( maybe_seq_hashes, isl_tokens, - cache_hit_estimates.cached_tokens.into_iter().collect(), + cache_hit_estimates.cached_tokens, track_prefill_tokens, )) } @@ -2077,95 +2081,53 @@ mod tests { #[test] fn kv_event_source_requirement_matrix() { - let default = KvRouterConfig::default(); - let mut cases = vec![ - ( - Some(WorkerType::Prefill), - default.clone(), - KvEventSourceRequirement::CacheAwareRouting, - true, - ), - ( - Some(WorkerType::Aggregated), - default.clone(), - KvEventSourceRequirement::CacheAwareRouting, - true, - ), - ( - Some(WorkerType::Decode), - default.clone(), - KvEventSourceRequirement::NotRequired, - false, - ), - ( - Some(WorkerType::Encode), - default.clone(), - KvEventSourceRequirement::NotRequired, - false, - ), - ( - None, - default.clone(), - KvEventSourceRequirement::Unknown, - true, - ), - ]; - for policy in [ - dynamo_kv_router::ConditionalDisaggPolicyKind::IslBounding, - dynamo_kv_router::ConditionalDisaggPolicyKind::PrefillLoad, - dynamo_kv_router::ConditionalDisaggPolicyKind::IslOrLoad, - ] { - cases.push(( - Some(WorkerType::Decode), - KvRouterConfig { - conditional_disagg_enabled: true, - conditional_disagg_policy: policy, - ..default.clone() - }, - KvEventSourceRequirement::ConditionalDisaggDecodeCache, - true, - )); - } - for config in [ - KvRouterConfig { - use_remote_indexer: true, - ..Default::default() - }, - KvRouterConfig { - use_kv_events: false, - ..Default::default() - }, - KvRouterConfig { - overlap_score_credit: 0.0, - ..Default::default() - }, + for role in [ + None, + Some(WorkerType::Aggregated), + Some(WorkerType::Prefill), + Some(WorkerType::Decode), + Some(WorkerType::Encode), ] { - cases.extend([ - ( - None, - config.clone(), - KvEventSourceRequirement::Unknown, - false, - ), - ( - Some(WorkerType::Aggregated), - config.clone(), - KvEventSourceRequirement::NotRequired, - false, - ), - ( - Some(WorkerType::Decode), - config, - KvEventSourceRequirement::NotRequired, - false, - ), - ]); - } - - for (role, config, expected, should_subscribe) in cases { - let requirement = KvEventSourceRequirement::derive(role, &config); - assert_eq!(requirement, expected); - assert_eq!(requirement.should_subscribe(&config), should_subscribe); + for inputs in [WorkerInputs::LOAD, WorkerInputs::CACHE | WorkerInputs::LOAD] { + for overlap_score_credit in [0.0, 1.0, 2.0] { + for use_kv_events in [false, true] { + for use_remote_indexer in [false, true] { + for conditional_disagg_enabled in [false, true] { + let config = KvRouterConfig { + overlap_score_credit, + use_kv_events, + use_remote_indexer, + conditional_disagg_enabled, + ..Default::default() + }; + let expected = if !inputs.contains(WorkerInputs::CACHE) + || !use_kv_events + || use_remote_indexer + { + KvEventSourceRequirement::NotRequired + } else if role.is_none() { + KvEventSourceRequirement::Unknown + } else if role == Some(WorkerType::Decode) + && conditional_disagg_enabled + { + KvEventSourceRequirement::ConditionalDisaggDecodeCache + } else { + KvEventSourceRequirement::CacheAwareRouting + }; + let actual = + KvEventSourceRequirement::derive(role, &config, inputs); + assert_eq!(actual, expected); + assert_eq!( + actual.should_subscribe(), + inputs.contains(WorkerInputs::CACHE) + && use_kv_events + && !use_remote_indexer, + ); + } + } + } + } + } } } @@ -2212,9 +2174,10 @@ mod tests { .iter() .position(|candidate| candidate.worker() == self.worker) .ok_or_else(|| WorkerSelectionPolicyError::failed("fixed worker not eligible"))?; - let shared = input - .cache() - .map(|cache| cache[row].shared_beyond_device_blocks()) + let cache = input.cache().unwrap().get(row).unwrap(); + let shared = cache + .shared_hits() + .map(|hits| hits.hits_beyond(cache.device_overlap_blocks().round().max(0.0) as u32)) .filter(|blocks| *blocks > 0); assert_eq!(shared, self.expected_shared_blocks); Ok(row) @@ -2227,7 +2190,7 @@ mod tests { fn keep( &mut self, _context: &WorkerSelectionContext<'_>, - _candidate: &WorkerCandidate, + _candidate: WorkerCandidate<'_>, ) -> Result { Ok(false) } @@ -2290,7 +2253,7 @@ mod tests { "role-aware-subscription", HashMap::from([(7, ModelRuntimeConfig::default())]), 16, - SelectionPolicySource::Registry, + picker_policy(|| Box::new(LoadOnlyPicker)), None, worker_role, "decode", @@ -2353,21 +2316,132 @@ mod tests { } #[tokio::test] - async fn constructor_skips_sources_for_decode_but_preserves_unknown_behavior() { - let router = make_router_without_membership(Some(WorkerType::Decode)) - .await - .expect("ordinary decode must not require KV source membership"); - assert!(!router.ingress.has_subscription()); + async fn cache_inputs_control_indexer_and_subscription() { + for role in [None, Some(WorkerType::Aggregated), Some(WorkerType::Decode)] { + for use_kv_events in [false, true] { + for overlap_score_credit in [0.0, 1.0] { + for wants_cache in [false, true] { + let policy = if wants_cache { + fixed_policy(None, WorkerWithDpRank::from_worker_id(7)) + } else { + picker_policy(|| Box::new(LoadOnlyPicker)) + }; + let result = make_router( + "cache-input-gate", + HashMap::from([(7, ModelRuntimeConfig::default())]), + 16, + policy, + None, + role, + "decode", + KvRouterConfig { + use_kv_events, + overlap_score_credit, + conditional_disagg_enabled: true, + skip_initial_worker_wait: true, + router_event_threads: 1, + ..Default::default() + }, + ) + .await; + if wants_cache && use_kv_events { + // No membership watch was provided: reaching subscription setup is + // required even for zero scoring credit and decode/unknown roles. + let error = + result.err().expect("CACHE needs a source membership watch"); + assert!( + error + .to_string() + .contains("KV source membership watch is required") + ); + } else { + let router = result.unwrap(); + assert_eq!(matches!(router.indexer, Indexer::None), !wants_cache); + assert!(!router.ingress.has_subscription()); + router.cancellation_token.cancel(); + } + } + } + } + } + } - let error = make_router_without_membership(None) + #[tokio::test] + async fn builtin_load_only_modes_skip_indexing_and_subscriptions() { + for role in [WorkerType::Aggregated, WorkerType::Decode] { + let router = make_router( + "builtin-load-only", + HashMap::from([(7, ModelRuntimeConfig::default())]), + 2, + SelectionPolicySource::Registry, + None, + Some(role), + role.default_selector_label(), + KvRouterConfig { + overlap_score_credit: if role == WorkerType::Decode { 1.0 } else { 0.0 }, + use_kv_events: role == WorkerType::Decode, + router_assume_kv_reuse: false, + skip_initial_worker_wait: true, + ..Default::default() + }, + ) .await - .err() - .expect("unknown role must preserve config-driven subscription"); - assert!( - error - .to_string() - .contains("KV source membership watch is required") - ); + .unwrap(); + assert!( + !router + .required_worker_inputs() + .contains(WorkerInputs::CACHE) + ); + assert!(matches!(router.indexer, Indexer::None)); + assert!(!router.ingress.has_subscription()); + let tokens = vec![11, 12, 13, 14]; + for _ in 0..2 { + router + .record_routing_decision( + TokensWithHashes::new(tokens.clone(), 2), + WorkerWithDpRank::from_worker_id(7), + ) + .await + .unwrap(); + let FindBestMatchOutcome::Routed { cached_tokens, .. } = + find_best_match(&router, &tokens, false).await.unwrap() + else { + panic!("load-only request must route"); + }; + assert_eq!(cached_tokens, 0); + assert_eq!( + router + .prefill_load_hint_for(tokens.len(), cached_tokens, true) + .unwrap() + .initial_effective_prefill_tokens, + tokens.len() + ); + } + router.cancellation_token.cancel(); + } + } + + #[tokio::test] + async fn indexer_features_require_declared_cache_inputs() { + for feature in ["serve_indexer", "enable_session_prefix_index"] { + let config = KvRouterConfig { + serve_indexer: feature == "serve_indexer", + enable_session_prefix_index: feature == "enable_session_prefix_index", + overlap_score_credit: 0.0, + ..Default::default() + }; + config.validate().unwrap(); + let source = picker_policy(|| Box::new(LoadOnlyPicker)); + let error = source + .prepare(&config, WorkerType::Aggregated, "decode", Some("model")) + .err() + .expect("host features must not enable undeclared cache input"); + assert!(error.to_string().contains(feature)); + assert!(error.to_string().contains("WorkerInputs::CACHE")); + fixed_policy(None, WorkerWithDpRank::from_worker_id(7)) + .prepare(&config, WorkerType::Aggregated, "decode", Some("model")) + .expect("CACHE allows indexer features even with zero scoring credit"); + } } #[tokio::test] @@ -2551,24 +2625,42 @@ mod tests { async fn session_prefix_tracking_survives_shared_core_selection(#[case] threads: u32) { use dynamo_kv_router::protocols::{ExternalSequenceBlockHash, StorageTier}; - let router = make_router( - "session-prefix-core", - HashMap::from([(7, ModelRuntimeConfig::default())]), + let component = make_test_component("session-prefix-core").await; + let endpoint = component.endpoint("backend"); + let client = endpoint.client().await.unwrap(); + let (_tx, workers) = watch::channel(HashMap::from([(7, ModelRuntimeConfig::default())])); + let membership = crate::discovery::KvSourceMembershipCoordinator::start( + endpoint.id(), + workers.clone(), + component.drt().discovery(), + ) + .subscribe(); + let router = KvRouter::new_with_worker_role( + endpoint, + client, + workers, + Some(membership), 2, - SelectionPolicySource::Registry, - None, - Some(WorkerType::Decode), - "decode", - KvRouterConfig { + fixed_policy(None, WorkerWithDpRank::from_worker_id(7)), + Some(KvRouterConfig { enable_session_prefix_index: true, router_event_threads: threads, router_temperature: 0.0, + overlap_score_credit: 0.0, skip_initial_worker_wait: true, ..Default::default() - }, + }), + None, + Some(WorkerType::Decode), + "decode", + None, + false, + None, + None, ) .await .unwrap(); + assert!(router.ingress.has_subscription()); let session_index = router.session_prefix_index.as_ref().unwrap(); let worker = WorkerWithDpRank::new(7, 0); let tokens = [11, 12, 13, 14]; @@ -3231,7 +3323,7 @@ mod tests { let constructions = Arc::clone(&constructions); Arc::new(move |config: &KvRouterConfig, _, _| { constructions.fetch_add(1, Ordering::SeqCst); - WorkerSelectionPolicy::default(config.clone(), "decode") + dynamo_custom_policy_builtin::default_policy(config.clone(), "decode") }) }; let config = KvRouterConfig::default(); diff --git a/lib/llm/src/kv_router/embedded.rs b/lib/llm/src/kv_router/embedded.rs index 39a69a7c1131..583b5319042a 100644 --- a/lib/llm/src/kv_router/embedded.rs +++ b/lib/llm/src/kv_router/embedded.rs @@ -16,6 +16,7 @@ use anyhow::{Context, Result}; use dynamo_kv_router::WorkerType; use dynamo_kv_router::config::KvRouterConfig; use dynamo_kv_router::identity::RoutingPartitionId; +use dynamo_kv_router::plugins::RouterPluginRegistry; use dynamo_kv_router::protocols::{WorkerConfigLike, WorkerId, WorkerWithDpRank}; use dynamo_kv_router::scheduling::queue::DEFAULT_MAX_BATCHED_TOKENS; use dynamo_kv_router::scheduling::{ @@ -28,7 +29,7 @@ use dynamo_kv_router::services::selection::{ HostReplication, HostTelemetry, KvEventIngress, KvIndexSource, SelectionHost, SelectionOperation, SelectionOutcome, SelectionPartition, SelectionRun, SelectionScheduler, SelectionService, SelectionServiceBuilder, WorkerCatalogRecord, WorkerCatalogSource, - WorkerRequest, WorkerSelectionPolicyRegistry, + WorkerRequest, }; use dynamo_kv_router::{DEFAULT_ROUTING_GROUP, PrefillLoadEstimator, WorkerSelectionPolicyFactory}; use tokio_util::sync::CancellationToken; @@ -253,7 +254,7 @@ impl EmbeddedSelection { let service = SelectionServiceBuilder::new( args.kv_router_config.clone(), worker_type, - WorkerSelectionPolicyRegistry::default(), + RouterPluginRegistry::default(), ) .worker_selection_policy_factory(args.policy_factory) .host_manages_request_lifecycle() diff --git a/lib/llm/src/kv_router/indexer/ingress.rs b/lib/llm/src/kv_router/indexer/ingress.rs index 987144a41665..e3f2089cc849 100644 --- a/lib/llm/src/kv_router/indexer/ingress.rs +++ b/lib/llm/src/kv_router/indexer/ingress.rs @@ -13,7 +13,7 @@ use dynamo_kv_router::config::KvRouterConfig; use dynamo_kv_router::identity::RoutingPartitionId; use dynamo_kv_router::services::indexer::registry::WorkerRegistry; use dynamo_kv_router::services::selection::KvEventIngress; -use dynamo_kv_router::{SessionPrefixIndexer, WorkerType}; +use dynamo_kv_router::{SessionPrefixIndexer, WorkerInputs, WorkerType}; use dynamo_runtime::component::Endpoint; use tokio_util::sync::CancellationToken; @@ -31,8 +31,8 @@ pub(crate) struct RuntimeIngressArgs<'a> { pub model_name: Option<&'a str>, pub worker_role: Option, pub metric_worker_type: &'static str, - /// Whether any consumer needs KV knowledge; without it the index is `None`. - pub cache_required: bool, + /// Combined policy inputs. Without CACHE, no routing indexer is created. + pub worker_inputs: WorkerInputs, pub kv_event_source_requirement: KvEventSourceRequirement, pub kv_source_membership: Option, pub cancellation_token: CancellationToken, @@ -54,13 +54,14 @@ impl RuntimeIngress { model_name, worker_role, metric_worker_type, - cache_required, + worker_inputs, kv_event_source_requirement, kv_source_membership, cancellation_token, session_prefix_index, } = args; let component = endpoint.component(); + let cache_required = worker_inputs.contains(WorkerInputs::CACHE); let indexer = if cache_required { super::build( component, @@ -75,9 +76,7 @@ impl RuntimeIngress { Indexer::None }; - let subscription = if cache_required - && kv_event_source_requirement.should_subscribe(kv_router_config) - { + let subscription = if cache_required && kv_event_source_requirement.should_subscribe() { let membership_watch = kv_source_membership.ok_or_else(|| { anyhow::anyhow!( "KV source membership watch is required when local KV event subscription is enabled" @@ -102,7 +101,6 @@ impl RuntimeIngress { requirement = %kv_event_source_requirement, cache_required = cache_required, use_kv_events = kv_router_config.use_kv_events, - overlap_score_credit = kv_router_config.overlap_score_credit, use_remote_indexer = kv_router_config.use_remote_indexer, "Skipping KV event subscription" ); diff --git a/lib/llm/src/kv_router/indexer/mod.rs b/lib/llm/src/kv_router/indexer/mod.rs index 98d4800ee492..f74ab7d9b720 100644 --- a/lib/llm/src/kv_router/indexer/mod.rs +++ b/lib/llm/src/kv_router/indexer/mod.rs @@ -54,7 +54,6 @@ pub(crate) use recovery::{ #[derive(Debug, Clone, Copy, PartialEq, Eq)] enum ResolvedApproximatePrimaryPolicy { - Disabled, Ttl, Lru, TtlRemoteFallback, @@ -70,9 +69,6 @@ fn resolve_approximate_primary_policy( "router_approximate_cache_policy=lru requires use_kv_events=false; the local side indexer is TTL-only" ); } - if config.overlap_score_credit <= 0.0 { - return Ok(ResolvedApproximatePrimaryPolicy::Disabled); - } if config.use_kv_events || config.router_approximate_cache_policy == ApproximateCachePolicyKind::Ttl { @@ -94,10 +90,6 @@ pub(crate) async fn build( session_prefix_index: Option>, ) -> Result { let approximate_policy = resolve_approximate_primary_policy(kv_router_config)?; - if approximate_policy == ResolvedApproximatePrimaryPolicy::Disabled { - return Ok(Indexer::None); - } - if approximate_policy == ResolvedApproximatePrimaryPolicy::TtlRemoteFallback { tracing::warn!( use_remote_indexer = kv_router_config.use_remote_indexer, diff --git a/lib/llm/src/kv_router/plugins.rs b/lib/llm/src/kv_router/plugins.rs index 6d6354795702..08a2c6027b30 100644 --- a/lib/llm/src/kv_router/plugins.rs +++ b/lib/llm/src/kv_router/plugins.rs @@ -14,12 +14,17 @@ static INSTALLED_PLUGINS: OnceLock = OnceLock::new(); /// Install the linked catalog once for frontend and embedded router construction. /// Returns `false` if a catalog has already been installed. pub fn install_router_plugin_registry(registry: RouterPluginRegistry) -> bool { - INSTALLED_PLUGINS.set(registry).is_ok() + INSTALLED_PLUGINS + .set(registry.with_default_factory(dynamo_custom_policy_builtin::default_factory())) + .is_ok() } -/// The installed catalog, or an empty registry for Dynamo's default policies. +/// The installed catalog, or the required builtin default policy. pub fn router_plugin_registry() -> RouterPluginRegistry { - INSTALLED_PLUGINS.get().cloned().unwrap_or_default() + INSTALLED_PLUGINS + .get() + .cloned() + .unwrap_or_else(dynamo_custom_policy_builtin::default_registry) } /// Carries configured plugins through the host's shared router construction. @@ -47,6 +52,10 @@ impl RouterPluginBuilder { Ok(()) } + pub(crate) fn has_custom_worker_selection(&self) -> bool { + self.plugins.has_custom_worker_selection() + } + pub(crate) fn selection_policy(&self) -> SelectionPolicySource { self.plugins.worker_selection().cloned().map_or( SelectionPolicySource::Registry, diff --git a/lib/mocker/Cargo.toml b/lib/mocker/Cargo.toml index f5d35ed54b8d..ce60454d9871 100644 --- a/lib/mocker/Cargo.toml +++ b/lib/mocker/Cargo.toml @@ -22,6 +22,7 @@ test-support = [] zmq-events = ["dep:tmq"] [dependencies] +dynamo-custom-policy-builtin = { workspace = true } # repo aisimulate-core = { workspace = true } dynamo-data-gen = { workspace = true } diff --git a/lib/mocker/src/replay/offline/extensions/kv_router/mod.rs b/lib/mocker/src/replay/offline/extensions/kv_router/mod.rs index 4ea2d4de1258..dda39c90bc30 100644 --- a/lib/mocker/src/replay/offline/extensions/kv_router/mod.rs +++ b/lib/mocker/src/replay/offline/extensions/kv_router/mod.rs @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 +use dynamo_custom_policy_builtin::DefaultWorkerSelector; use std::borrow::Cow; use std::collections::HashMap; use std::fmt; @@ -22,10 +23,9 @@ use dynamo_kv_router::scheduling::{ }; use dynamo_kv_router::sequences::topology::WorkerDpRange; use dynamo_kv_router::{ - ActiveSequencesMultiWorker, DefaultWorkerSelector, RadixTree, RoutingPartitionRef, - SchedulingRequest, SequenceRequest, SessionContext, TrackingHashAlgorithm, TrackingHashContext, - TrackingHashScope, WorkerLoadProjection, WorkerSelectionInput, WorkerSelector, - scheduling::TierOverlapBlocks, + ActiveSequencesMultiWorker, RadixTree, RoutingPartitionRef, SchedulingRequest, SequenceRequest, + SessionContext, TrackingHashAlgorithm, TrackingHashContext, TrackingHashScope, + WorkerLoadProjection, WorkerSelectionInput, WorkerSelector, scheduling::TierOverlapBlocks, }; use dynamo_tokens::SequenceHash; use rustc_hash::FxHashMap; diff --git a/lib/mocker/src/replay/online/router.rs b/lib/mocker/src/replay/online/router.rs index f8489409d045..b03d6c39bcfe 100644 --- a/lib/mocker/src/replay/online/router.rs +++ b/lib/mocker/src/replay/online/router.rs @@ -372,7 +372,7 @@ impl KvReplayRouter { self.scheduler.get_potential_loads( None, isl_tokens, - std::collections::HashMap::new(), + Default::default(), track_prefill_tokens, ) } diff --git a/lib/mocker/src/replay/router_shared.rs b/lib/mocker/src/replay/router_shared.rs index 5859782f94b5..363af69eba6f 100644 --- a/lib/mocker/src/replay/router_shared.rs +++ b/lib/mocker/src/replay/router_shared.rs @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 +use dynamo_custom_policy_builtin::DefaultWorkerSelector; use std::collections::HashMap; use std::sync::Arc; @@ -11,9 +12,7 @@ use dynamo_kv_router::protocols::{ }; use dynamo_kv_router::scheduling::queue::DEFAULT_MAX_BATCHED_TOKENS; use dynamo_kv_router::sequences::SchedulerLoadSnapshot; -use dynamo_kv_router::{ - ActiveSequencesMultiWorker, DefaultWorkerSelector, LocalScheduler, SequencePublisher, -}; +use dynamo_kv_router::{ActiveSequencesMultiWorker, LocalScheduler, SequencePublisher}; #[derive(Clone, Copy, Debug, Default)] pub(super) struct ReplayNoopPublisher; diff --git a/lib/router-plugins/builtin/Cargo.toml b/lib/router-plugins/builtin/Cargo.toml index 68fdb47c1e13..f40f7023d22e 100644 --- a/lib/router-plugins/builtin/Cargo.toml +++ b/lib/router-plugins/builtin/Cargo.toml @@ -12,8 +12,22 @@ repository.workspace = true description = "Worker-selection policies Dynamo ships and always links" [dependencies] +fastrand = "2" +parking_lot.workspace = true dynamo-kv-router = { workspace = true, features = ["standalone-selection"] } serde.workspace = true [dev-dependencies] +tokio = { workspace = true, features = ["macros", "rt", "time"] } +dynamo-kv-router = { workspace = true, features = ["bench"] } +rustc-hash = "2.1.1" +criterion = "0.5" tempfile = { workspace = true } + +[[bench]] +name = "default_selection" +harness = false + +[[bench]] +name = "default_lifecycle" +harness = false diff --git a/lib/router-plugins/builtin/benches/default_lifecycle.rs b/lib/router-plugins/builtin/benches/default_lifecycle.rs new file mode 100644 index 000000000000..91bcbe91447e --- /dev/null +++ b/lib/router-plugins/builtin/benches/default_lifecycle.rs @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Includes load projection, selection, booking, and release in the shared core. +use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main}; +use dynamo_custom_policy_builtin::default_factory; +use dynamo_kv_router::services::selection::{ + PromptRequest, SelectAndReserveRequest, SelectionCacheConfig, SelectionCore, WorkerRequest, +}; +use dynamo_kv_router::{KvRouterConfig, WorkerSelectionPolicy, WorkerSelectionPolicyFactory}; +use std::sync::Arc; +use std::time::Duration; + +fn bench(c: &mut Criterion) { + let runtime = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + let _guard = runtime.enter(); + let mut group = c.benchmark_group("default_lifecycle"); + group + .warm_up_time(Duration::from_millis(200)) + .measurement_time(Duration::from_secs(1)) + .sample_size(30) + .nresamples(1_000); + for count in [8, 64, 512] { + let reference: WorkerSelectionPolicyFactory = Arc::new(|config, role, _| { + WorkerSelectionPolicy::reference(config.clone(), role.default_selector_label()) + }); + for (label, factory) in [("reference", reference), ("plugin", default_factory())] { + let core = SelectionCore::try_new_local( + KvRouterConfig { + use_kv_events: false, + router_queue_threshold: None, + ..Default::default() + }, + 1, + Default::default(), + SelectionCacheConfig::default(), + factory, + ) + .unwrap(); + runtime.block_on(async { + for worker_id in 0..count { + core.upsert_worker(WorkerRequest { + worker_id, + endpoint: Some(format!("http://worker-{worker_id}:8000")), + block_size: Some(16), + max_num_batched_tokens: Some(8192), + ..Default::default() + }) + .await + .unwrap(); + } + }); + group.bench_function(BenchmarkId::new(label, count), |b| { + b.iter(|| { + runtime.block_on(async { + let response = core + .select_and_reserve(SelectAndReserveRequest { + selection_id: Some("request".into()), + prompt: PromptRequest { + token_ids: Some((0..2048).collect()), + ..Default::default() + }, + model_name: "default".into(), + routing_group: "default".into(), + router_config_override: None, + expected_output_tokens: None, + priority_jump: None, + strict_priority: None, + session_id: None, + session_context: None, + affinity_target: None, + pinned_worker: None, + allowed_worker_ids: None, + routing_constraints: Default::default(), + }) + .await + .unwrap(); + criterion::black_box(response); + core.free_reservation("request").await.unwrap(); + }) + }); + }); + core.shutdown(); + } + } + group.finish(); +} +criterion_group!(benches, bench); +criterion_main!(benches); diff --git a/lib/router-plugins/builtin/benches/default_selection.rs b/lib/router-plugins/builtin/benches/default_selection.rs new file mode 100644 index 000000000000..b942b5605943 --- /dev/null +++ b/lib/router-plugins/builtin/benches/default_selection.rs @@ -0,0 +1,232 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +#[path = "../tests/support/mod.rs"] +mod support; +use criterion::{BenchmarkId, Criterion, black_box, criterion_group, criterion_main}; +use dynamo_custom_policy_builtin::default_policy; +use dynamo_kv_router::{KvRouterConfig, WorkerSelector}; +use std::alloc::{GlobalAlloc, Layout, System}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; +use std::time::Duration; +struct CountingAllocator; +static COUNTING: AtomicBool = AtomicBool::new(false); +static ALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +#[global_allocator] +static ALLOCATOR: CountingAllocator = CountingAllocator; +// SAFETY: every operation delegates to System with the original pointer and layout. +unsafe impl GlobalAlloc for CountingAllocator { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + } + unsafe { System.alloc(layout) } + } + unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { + unsafe { System.dealloc(ptr, layout) } + } + unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, size: usize) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + } + unsafe { System.realloc(ptr, layout, size) } + } +} +fn allocations(mut select: impl FnMut()) -> usize { + select(); // Warm retained buffers and thread-local RNG. + ALLOCATIONS.store(0, Ordering::Relaxed); + COUNTING.store(true, Ordering::Relaxed); + for _ in 0..100 { + select(); + } + COUNTING.store(false, Ordering::Relaxed); + ALLOCATIONS.load(Ordering::Relaxed) +} + +fn bench(c: &mut Criterion) { + let decay: f64 = std::env::var("DYN_BENCH_OVERLAP_DECAY") + .unwrap_or_else(|_| "0".into()) + .parse() + .unwrap(); + for temperature in [0.0, 0.7] { + let mut group = c.benchmark_group(format!("default_selection/t{temperature}")); + group + .warm_up_time(Duration::from_millis(200)) + .measurement_time(Duration::from_millis(500)) + .sample_size(30) + .nresamples(1_000); + for count in [8, 64, 256, 1024, 4096] { + let (workers, request) = support::fixture(count, 2048); + let config = KvRouterConfig { + router_temperature: temperature, + overlap_score_credit_decay: decay, + ..Default::default() + }; + let reference = + dynamo_kv_router::DefaultWorkerSelector::new(Some(config.clone()), "prefill"); + let plugin = default_policy(config, "prefill"); + let reference_allocs = allocations(|| { + black_box( + reference + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(), + ); + }); + let plugin_allocs = allocations(|| { + black_box( + plugin + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(), + ); + }); + eprintln!( + "allocations per 100 warm selections: temperature={temperature} workers={count} reference={reference_allocs} plugin={plugin_allocs}" + ); + group.bench_function(BenchmarkId::new("reference", count), |b| { + b.iter(|| { + black_box( + reference + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(), + ) + }) + }); + group.bench_function(BenchmarkId::new("plugin", count), |b| { + b.iter(|| { + black_box( + plugin + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(), + ) + }) + }); + } + group.finish(); + } +} + +struct LoadScorer(f64); +impl dynamo_kv_router::WorkerScorer for LoadScorer { + fn required_worker_inputs(&self) -> dynamo_kv_router::WorkerInputs { + dynamo_kv_router::WorkerInputs::LOAD + } + fn score( + &mut self, + _: &dynamo_kv_router::WorkerSelectionContext<'_>, + candidates: dynamo_kv_router::WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), dynamo_kv_router::WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + *cost = candidate.load().unwrap().active_requests() as f64 * self.0; + } + Ok(()) + } +} + +struct MinimumPicker; +impl dynamo_kv_router::WorkerPicker for MinimumPicker { + fn pick( + &mut self, + _: &dynamo_kv_router::WorkerSelectionContext<'_>, + input: dynamo_kv_router::WorkerInputView<'_>, + ) -> Result { + Ok(input + .candidates() + .iter() + .enumerate() + .min_by(|(_, a), (_, b)| a.cost().total_cmp(&b.cost())) + .unwrap() + .0) + } +} + +fn stacked(c: &mut Criterion) { + for scorer_count in [1, 2, 4] { + let mut group = c.benchmark_group(format!("stacked_scoring/s{scorer_count}")); + group + .warm_up_time(Duration::from_millis(200)) + .measurement_time(Duration::from_millis(500)) + .sample_size(30) + .nresamples(1_000); + for count in [8, 64, 1024, 4096] { + let (workers, request) = support::fixture(count, 2048); + let scorers = (0..scorer_count) + .map(|index| { + Box::new(LoadScorer((index + 1) as f64)) + as Box + }) + .collect(); + let policy = dynamo_kv_router::WorkerSelectionPolicy::new( + KvRouterConfig::default(), + "prefill", + scorers, + Box::new(MinimumPicker), + ); + let mut select = || { + black_box( + policy + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(), + ); + }; + let count_allocs = allocations(&mut select); + eprintln!( + "stacked allocations per 100 warm selections: scorers={scorer_count} workers={count} allocations={count_allocs}" + ); + group.bench_function(BenchmarkId::new("plugin", count), |b| b.iter(&mut select)); + } + group.finish(); + } +} + +// Shared ranges exercise both tier-aware scoring and the accounting-only fallback. +fn shared_cache(c: &mut Criterion) { + for tier_matches in [false, true] { + for range_count in [1, 5, 32] { + for credit in [0.0, 0.6] { + let mut group = c.benchmark_group(format!( + "shared_cache/tiers{tier_matches}/ranges{range_count}/credit{credit}" + )); + group + .warm_up_time(Duration::from_millis(200)) + .measurement_time(Duration::from_millis(500)) + .sample_size(30) + .nresamples(1_000); + for count in [8, 1024, 4096] { + let (workers, mut request) = support::fixture(count, 2048); + if !tier_matches { + request.overlap.tier_overlap_blocks = Default::default(); + } + request.shared_cache_hits = + Some(dynamo_kv_router::SharedCacheHits::from_ranges( + (0..range_count).map(|i| i * 4..i * 4 + 2).collect(), + )); + let policy = default_policy( + KvRouterConfig { + shared_cache_multiplier: credit, + overlap_score_credit_decay: 0.6, + ..Default::default() + }, + "prefill", + ); + let mut select = || { + black_box( + policy + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(), + ); + }; + let count_allocs = allocations(&mut select); + eprintln!( + "shared allocations per 100 warm selections: tiers={tier_matches} ranges={range_count} credit={credit} workers={count} allocations={count_allocs}" + ); + group + .bench_function(BenchmarkId::new("plugin", count), |b| b.iter(&mut select)); + } + group.finish(); + } + } + } +} + +criterion_group!(benches, bench, stacked, shared_cache); +criterion_main!(benches); diff --git a/lib/router-plugins/builtin/src/default.rs b/lib/router-plugins/builtin/src/default.rs new file mode 100644 index 000000000000..e6ab04b0b4d2 --- /dev/null +++ b/lib/router-plugins/builtin/src/default.rs @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! The default KV policy, composed from a scorer and a picker using the public plugin API. + +mod parameters; +mod picker; +mod scorer; +mod selector; + +use parameters::PolicyParameters; +pub(super) use parameters::register; +pub use selector::DefaultWorkerSelector; + +use dynamo_kv_router::KvRouterConfig; +use dynamo_kv_router::plugins::worker_selection::{ + WorkerSelectionPolicy, WorkerSelectionPolicyFactory, +}; +use parking_lot::Mutex; +use std::sync::Arc; + +/// Construct the builtin default from configured policy parameters. +/// Per-request score overrides are not used. Request load-tracking remains host-owned. +pub fn default_policy(config: KvRouterConfig, worker_label: &'static str) -> WorkerSelectionPolicy { + let parameters = PolicyParameters::from(&config); + policy_with_rng(config, parameters, worker_label, None, false) +} + +fn policy_with_rng( + config: KvRouterConfig, + parameters: PolicyParameters, + worker_label: &'static str, + rng: Option>>, + is_plain_decode: bool, +) -> WorkerSelectionPolicy { + let scorer = scorer::build(¶meters, worker_label, is_plain_decode); + let picker = picker::DefaultPicker::new(parameters.router_temperature, rng); + WorkerSelectionPolicy::new(config, worker_label, vec![scorer], Box::new(picker)) + .with_exclusive_affinity(true) +} + +/// Factory installed by routing hosts, including hosts without a custom catalog. +pub fn default_factory() -> WorkerSelectionPolicyFactory { + Arc::new(|config, role, _partition| { + policy_for_role(config.clone(), role, PolicyParameters::from(config)) + }) +} + +fn policy_for_role( + config: KvRouterConfig, + role: dynamo_kv_router::WorkerType, + parameters: PolicyParameters, +) -> WorkerSelectionPolicy { + let is_plain_decode = + role == dynamo_kv_router::WorkerType::Decode && !config.conditional_disagg_enabled; + policy_with_rng( + config, + parameters, + role.default_selector_label(), + None, + is_plain_decode, + ) +} diff --git a/lib/router-plugins/builtin/src/default/parameters.rs b/lib/router-plugins/builtin/src/default/parameters.rs new file mode 100644 index 000000000000..070cafc58740 --- /dev/null +++ b/lib/router-plugins/builtin/src/default/parameters.rs @@ -0,0 +1,112 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Startup parameters and provider registration for the default policy. + +use dynamo_kv_router::KvRouterConfig; +use dynamo_kv_router::plugins::{ + RouterPluginRegistry, WorkerSelectionPolicyProviderError, WorkerSelectionPolicyRegistryError, +}; +use std::sync::Arc; + +use super::policy_for_role; + +#[derive(Default, serde::Deserialize)] +#[serde(default, deny_unknown_fields)] +struct Parameters { + overlap_score_credit: Option, + overlap_score_credit_decay: Option, + prefill_load_scale: Option, + decode_active_request_weight: Option, + host_cache_hit_weight: Option, + disk_cache_hit_weight: Option, + shared_cache_multiplier: Option, + router_temperature: Option, +} + +/// Only the startup values consumed by the default scorer and picker. +#[derive(Clone, Copy)] +pub(super) struct PolicyParameters { + pub(super) overlap_score_credit: f64, + pub(super) overlap_score_credit_decay: f64, + pub(super) prefill_load_scale: f64, + pub(super) decode_active_request_weight: f64, + pub(super) host_cache_hit_weight: f64, + pub(super) disk_cache_hit_weight: f64, + pub(super) shared_cache_multiplier: f64, + pub(super) router_temperature: f64, +} + +impl From<&KvRouterConfig> for PolicyParameters { + fn from(config: &KvRouterConfig) -> Self { + Parameters::default().resolve(config) + } +} + +impl Parameters { + fn resolve(&self, config: &KvRouterConfig) -> PolicyParameters { + PolicyParameters { + overlap_score_credit: self + .overlap_score_credit + .unwrap_or(config.overlap_score_credit), + overlap_score_credit_decay: self + .overlap_score_credit_decay + .unwrap_or(config.overlap_score_credit_decay), + prefill_load_scale: self.prefill_load_scale.unwrap_or(config.prefill_load_scale), + decode_active_request_weight: self + .decode_active_request_weight + .unwrap_or(config.decode_active_request_weight), + host_cache_hit_weight: self + .host_cache_hit_weight + .unwrap_or(config.host_cache_hit_weight), + disk_cache_hit_weight: self + .disk_cache_hit_weight + .unwrap_or(config.disk_cache_hit_weight), + shared_cache_multiplier: self + .shared_cache_multiplier + .unwrap_or(config.shared_cache_multiplier), + router_temperature: self.router_temperature.unwrap_or(config.router_temperature), + } + } +} + +pub(crate) fn register( + registry: &mut RouterPluginRegistry, +) -> Result<(), WorkerSelectionPolicyRegistryError> { + registry.register_worker_selection( + "dynamo-default-cost-fn", + Arc::new(|parameters| { + let parameters: Parameters = parameters.deserialize()?; + for (name, value) in [ + ("overlap_score_credit", parameters.overlap_score_credit), + ( + "overlap_score_credit_decay", + parameters.overlap_score_credit_decay, + ), + ("prefill_load_scale", parameters.prefill_load_scale), + ( + "decode_active_request_weight", + parameters.decode_active_request_weight, + ), + ("host_cache_hit_weight", parameters.host_cache_hit_weight), + ("disk_cache_hit_weight", parameters.disk_cache_hit_weight), + ( + "shared_cache_multiplier", + parameters.shared_cache_multiplier, + ), + ("router_temperature", parameters.router_temperature), + ] { + if value.is_some_and(|value| !value.is_finite() || value < 0.0) { + return Err(WorkerSelectionPolicyProviderError::new(format!( + "{name} must be finite and non-negative" + ))); + } + } + Ok(Arc::new( + move |config: &KvRouterConfig, role, _partition| { + policy_for_role(config.clone(), role, parameters.resolve(config)) + }, + )) + }), + ) +} diff --git a/lib/router-plugins/builtin/src/default/picker.rs b/lib/router-plugins/builtin/src/default/picker.rs new file mode 100644 index 000000000000..8f42239e4100 --- /dev/null +++ b/lib/router-plugins/builtin/src/default/picker.rs @@ -0,0 +1,163 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Minimum-cost selection, tie-breaking, and temperature sampling of scored candidates. + +use dynamo_kv_router::plugins::worker_selection::{ + WorkerInputView, WorkerPicker, WorkerSelectionContext, WorkerSelectionPolicyError, +}; +use parking_lot::Mutex; +use std::sync::Arc; + +fn softmax_sample_index( + entries: &[T], + cost: impl Fn(&T) -> f64, + temperature: f64, + sample: f64, + probabilities: &mut Vec, +) -> usize { + assert!(!entries.is_empty(), "Empty entries for softmax sampling"); + debug_assert_ne!(temperature, 0.0); + + let (min_cost, max_cost) = entries + .iter() + .map(&cost) + .fold((f64::INFINITY, f64::NEG_INFINITY), |(lo, hi), cost| { + (lo.min(cost), hi.max(cost)) + }); + + probabilities.clear(); + if min_cost == max_cost { + probabilities.resize(entries.len(), 1.0 / entries.len() as f64); + } else { + let range = max_cost - min_cost; + let magnitude = if range.is_finite() { + 1.0 + } else { + min_cost.abs().max(max_cost.abs()) + }; + let min_normalized = min_cost / magnitude; + let scale = -1.0 / ((max_cost / magnitude - min_normalized) * temperature); + let max_scaled = min_normalized * scale; + probabilities.extend( + entries + .iter() + .map(|entry| (cost(entry) / magnitude * scale - max_scaled).exp()), + ); + } + + let sum: f64 = probabilities.iter().sum(); + for probability in probabilities.iter_mut() { + *probability /= sum; + } + let mut cumulative = 0.0; + for (row, probability) in probabilities.iter().enumerate() { + cumulative += probability; + if sample <= cumulative { + return row; + } + } + entries.len() - 1 +} + +pub(super) struct DefaultPicker { + temperature: f64, + rng: Option>>, + entries: Vec<(usize, f64)>, + probabilities: Vec, +} + +impl DefaultPicker { + pub(super) fn new(temperature: f64, rng: Option>>) -> Self { + Self { + temperature, + rng, + entries: Vec::new(), + probabilities: Vec::new(), + } + } +} + +impl WorkerPicker for DefaultPicker { + fn pick( + &mut self, + context: &WorkerSelectionContext<'_>, + input: WorkerInputView<'_>, + ) -> Result { + let candidates = input.candidates(); + if candidates.is_empty() { + return Err(WorkerSelectionPolicyError::failed("no eligible worker")); + } + if context.pinned_worker().is_some() { + return Ok(0); + } + if self.temperature == 0.0 && self.rng.is_none() { + let mut best_row = 0; + let mut best_cost = f64::INFINITY; + let mut ties = 0; + for (row, candidate) in candidates.iter().enumerate() { + let cost = candidate.cost(); + if cost < best_cost { + best_row = row; + best_cost = cost; + ties = 1; + } else if cost == best_cost { + ties += 1; + if fastrand::usize(0..ties) == 0 { + best_row = row; + } + } + } + return Ok(best_row); + } + let Some(rng) = &self.rng else { + return Ok(softmax_sample_index( + candidates, + |candidate| candidate.cost(), + self.temperature, + fastrand::f64(), + &mut self.probabilities, + )); + }; + self.entries.clear(); + self.entries.extend( + candidates + .iter() + .enumerate() + .map(|(row, candidate)| (row, candidate.cost())), + ); + // Canonical order is required only for deterministic replay, never for production ties. + self.entries.sort_unstable_by_key(|(row, _)| { + let worker = candidates[*row].worker(); + (worker.worker_id, worker.dp_rank) + }); + let mut rng = rng.lock(); + let selected = if self.temperature == 0.0 { + let mut best = 0; + let mut best_cost = f64::INFINITY; + let mut ties = 0; + for (index, (_, cost)) in self.entries.iter().enumerate() { + if *cost < best_cost { + best = index; + best_cost = *cost; + ties = 1; + } else if *cost == best_cost { + ties += 1; + if rng.usize(0..ties) == 0 { + best = index; + } + } + } + best + } else { + softmax_sample_index( + &self.entries, + |(_, cost)| *cost, + self.temperature, + rng.f64(), + &mut self.probabilities, + ) + }; + Ok(self.entries[selected].0) + } +} diff --git a/lib/router-plugins/builtin/src/default/scorer.rs b/lib/router-plugins/builtin/src/default/scorer.rs new file mode 100644 index 000000000000..57d3afdeab2a --- /dev/null +++ b/lib/router-plugins/builtin/src/default/scorer.rs @@ -0,0 +1,281 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Cache and load cost calculation. The host owns snapshots and validates finite scores. + +use super::parameters::PolicyParameters; +use dynamo_kv_router::plugins::worker_selection::{ + WorkerCandidate, WorkerCandidates, WorkerInputs, WorkerScorer, WorkerSelectionContext, + WorkerSelectionPolicyError, +}; + +/// Resolve optional terms once so disabled weights add neither branches nor conversions to +/// each worker score. The shared-cache specialization also omits range traversal code. +pub(super) fn build( + config: &PolicyParameters, + worker_label: &'static str, + is_plain_decode: bool, +) -> Box { + match ( + config.decode_active_request_weight != 0.0, + config.shared_cache_multiplier != 0.0, + ) { + (false, false) => Box::new(DefaultScorer::::new( + config, + worker_label, + is_plain_decode, + )), + (false, true) => Box::new(DefaultScorer::::new( + config, + worker_label, + is_plain_decode, + )), + (true, false) => Box::new(DefaultScorer::::new( + config, + worker_label, + is_plain_decode, + )), + (true, true) => Box::new(DefaultScorer::::new( + config, + worker_label, + is_plain_decode, + )), + } +} + +struct DefaultScorer { + overlap_score_credit: f64, + overlap_score_credit_decay: f64, + host_cache_hit_weight: f64, + disk_cache_hit_weight: f64, + shared_cache_multiplier: f64, + decode_active_request_weight: f64, + prefill_load_scale: f64, + is_decode: bool, + is_plain_decode: bool, + prepared: PreparedRequest, +} + +/// Values shared by every worker score in one selection. Preparation keeps their conversions +/// and role checks outside the per-worker calculation without changing floating-point arithmetic. +#[derive(Default)] +struct PreparedRequest { + min_prefill: usize, + block_size: IntegerDivisor, + request_blocks: IntegerDivisor, + overlap_credit: f64, + needs_decay: bool, + needs_decode_subtraction: bool, +} + +/// Division by a power-of-two integer has an exact reciprocal. Both inputs to this helper +/// originate as unsigned token/block counts, so neither result can underflow or overflow. +/// Other divisors retain ordinary division to preserve the score's rounding exactly. +#[derive(Clone, Copy)] +struct IntegerDivisor { + value: f64, + reciprocal: Option, +} + +impl IntegerDivisor { + fn new(value: u64) -> Self { + Self { + value: value as f64, + reciprocal: value.is_power_of_two().then(|| 1.0 / value as f64), + } + } + + #[inline] + fn divide(self, numerator: f64) -> f64 { + match self.reciprocal { + Some(reciprocal) => numerator * reciprocal, + None => numerator / self.value, + } + } +} + +impl Default for IntegerDivisor { + fn default() -> Self { + Self::new(1) + } +} + +impl + DefaultScorer +{ + pub(super) fn new( + config: &PolicyParameters, + worker_label: &'static str, + is_plain_decode: bool, + ) -> Self { + Self { + overlap_score_credit: config.overlap_score_credit, + overlap_score_credit_decay: config.overlap_score_credit_decay, + host_cache_hit_weight: config.host_cache_hit_weight, + disk_cache_hit_weight: config.disk_cache_hit_weight, + shared_cache_multiplier: config.shared_cache_multiplier, + decode_active_request_weight: config.decode_active_request_weight, + prefill_load_scale: config.prefill_load_scale, + is_decode: worker_label == "decode", + is_plain_decode, + prepared: PreparedRequest::default(), + } + } +} + +impl + DefaultScorer +{ + fn prepare( + &mut self, + context: &WorkerSelectionContext<'_>, + candidates: WorkerCandidates<'_>, + ) -> Result<(), WorkerSelectionPolicyError> { + // Plain disaggregated decode is load-only. Conditional decode retains cache credit. + let overlap_credit = if self.is_plain_decode && !context.tracks_prefill_tokens() { + 0.0 + } else { + self.overlap_score_credit + }; + self.prepared = PreparedRequest { + min_prefill: 0, + block_size: IntegerDivisor::new(u64::from(context.block_size())), + request_blocks: IntegerDivisor::new(context.request_blocks()), + overlap_credit, + needs_decay: context.tracks_prefill_tokens() && self.overlap_score_credit_decay > 0.0, + needs_decode_subtraction: self.is_decode + && !context.tracks_prefill_tokens() + && overlap_credit > 0.0, + }; + if self.prepared.needs_decay { + let mut minimum = usize::MAX; + for candidate in candidates.iter() { + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + minimum = minimum.min(load.active_prefill_tokens()); + } + self.prepared.min_prefill = minimum; + } + Ok(()) + } + + fn score_worker( + &mut self, + context: &WorkerSelectionContext<'_>, + candidate: WorkerCandidate<'_>, + ) -> Result { + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("load input unavailable"))?; + let (cached_tokens, credit) = if let Some(cache) = candidate.cache() { + let (estimated_overlap, cached_tokens) = cache.accounting_cache_estimate(); + let device = if cache.has_tier_matches() { + cache.device_overlap_blocks() + } else { + estimated_overlap + }; + let shared_credit = if SHARED_CREDIT { + let shared = cache + .shared_hits() + .map_or(0, |hits| hits.hits_beyond(device.round().max(0.0) as u32)); + self.shared_cache_multiplier * shared as f64 + } else { + // Preserve signed zero when the configured weight is -0.0. + self.shared_cache_multiplier + }; + let decay = if self.prepared.needs_decay { + let excess = self.prepared.block_size.divide( + load.active_prefill_tokens() + .saturating_sub(self.prepared.min_prefill) as f64, + ); + 1.0 / (1.0 + + self.overlap_score_credit_decay * self.prepared.request_blocks.divide(excess)) + } else { + 1.0 + }; + let credit = self.prepared.overlap_credit * decay * device + + self.host_cache_hit_weight * cache.host_overlap_blocks() + + self.disk_cache_hit_weight * cache.disk_overlap_blocks() + + shared_credit; + (cached_tokens, credit) + } else { + (0, 0.0) + }; + let request_cost = if REQUEST_COST { + self.decode_active_request_weight * load.active_requests() as f64 + } else { + self.decode_active_request_weight + }; + let logit = if self.prepared.needs_decode_subtraction { + (load.decode_cost_blocks() - credit).max(0.0) + request_cost + } else { + let raw_tokens = if !context.tracks_prefill_tokens() { + 0 + } else if load.is_available() { + let uncached = context.prompt_tokens().saturating_sub(cached_tokens); + (load.active_prefill_tokens() + uncached).saturating_add(cached_tokens) + } else { + context.prompt_tokens() + }; + let prefill = (self.prepared.block_size.divide(raw_tokens as f64) - credit).max(0.0); + self.prefill_load_scale * prefill + load.decode_cost_blocks() + request_cost + }; + let cost = logit * candidate.preferred_taint_multiplier().unwrap_or(1.0); + Ok(cost) + } +} + +impl WorkerScorer + for DefaultScorer +{ + fn required_worker_inputs(&self) -> WorkerInputs { + // The builtin's load-only modes must book the full prompt without cache credit. + // Hosts still start indexing solely from the policy's declared inputs. + let inputs = WorkerInputs::LOAD | WorkerInputs::PREFERRED_TAINT; + if !self.is_plain_decode && self.overlap_score_credit != 0.0 { + inputs | WorkerInputs::CACHE + } else { + inputs + } + } + + fn score( + &mut self, + context: &WorkerSelectionContext<'_>, + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + self.prepare(context, candidates)?; + for (candidate, cost) in candidates.iter().zip(costs) { + *cost = self.score_worker(context, candidate)?; + } + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::IntegerDivisor; + + #[test] + fn prepared_division_preserves_score_rounding() { + let counts = [0, 1, 7, 127, 2048, (1 << 53) - 1, 1 << 53, u64::MAX]; + for block_size in (0..32) + .map(|shift| 1u64 << shift) + .chain([3, 17, 63, u32::MAX as u64]) + { + for request_blocks in (0..64).map(|shift| 1u64 << shift).chain([3, 127, u64::MAX]) { + for count in counts { + let blocks = IntegerDivisor::new(block_size).divide(count as f64); + let expected = count as f64 / block_size as f64; + assert_eq!(blocks.to_bits(), expected.to_bits()); + assert_eq!( + IntegerDivisor::new(request_blocks).divide(blocks).to_bits(), + (expected / request_blocks as f64).to_bits(), + ); + } + } + } + } +} diff --git a/lib/router-plugins/builtin/src/default/selector.rs b/lib/router-plugins/builtin/src/default/selector.rs new file mode 100644 index 000000000000..1fb9caeeb9e2 --- /dev/null +++ b/lib/router-plugins/builtin/src/default/selector.rs @@ -0,0 +1,87 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Synchronous adapter for direct selection and deterministic replay. + +use dynamo_kv_router::plugins::worker_selection::{WorkerInputs, WorkerSelectionPolicy}; +use dynamo_kv_router::protocols::{WorkerConfigLike, WorkerSelectionResult}; +use dynamo_kv_router::{KvRouterConfig, KvSchedulerError, WorkerSelectionInput, WorkerSelector}; +use parking_lot::Mutex; +use std::sync::Arc; + +use super::policy_with_rng; + +/// Synchronous adapter for direct callers and replay. Scheduler actors use `default_policy` +/// directly and do not acquire this adapter's mutex. +pub struct DefaultWorkerSelector { + kv_router_config: KvRouterConfig, + worker_type: &'static str, + policy: Mutex, + rng: Option>>, +} +impl DefaultWorkerSelector { + pub fn new(config: Option, worker_type: &'static str) -> Self { + Self::with_rng(config.unwrap_or_default(), worker_type, None) + } + /// Construct a reproducible selector. Clones share its random stream. + pub fn new_seeded( + config: Option, + worker_type: &'static str, + seed: u64, + ) -> Self { + Self::with_rng( + config.unwrap_or_default(), + worker_type, + Some(Arc::new(Mutex::new(fastrand::Rng::with_seed(seed)))), + ) + } + fn with_rng( + config: KvRouterConfig, + worker_type: &'static str, + rng: Option>>, + ) -> Self { + Self { + policy: Mutex::new(policy_with_rng( + config.clone(), + super::PolicyParameters::from(&config), + worker_type, + rng.clone(), + false, + )), + kv_router_config: config, + worker_type, + rng, + } + } +} +impl Clone for DefaultWorkerSelector { + fn clone(&self) -> Self { + Self::with_rng( + self.kv_router_config.clone(), + self.worker_type, + self.rng.clone(), + ) + } +} +impl std::fmt::Debug for DefaultWorkerSelector { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DefaultWorkerSelector") + .field("kv_router_config", &self.kv_router_config) + .field("worker_type", &self.worker_type) + .finish_non_exhaustive() + } +} +impl WorkerSelector for DefaultWorkerSelector { + fn required_worker_inputs(&self) -> WorkerInputs { + >::required_worker_inputs(&self.policy.lock()) + } + fn uses_exclusive_affinity_target(&self) -> bool { + true + } + fn select_worker( + &self, + input: WorkerSelectionInput<'_, C>, + ) -> Result { + self.policy.lock().select_worker(input) + } +} diff --git a/lib/router-plugins/builtin/src/lib.rs b/lib/router-plugins/builtin/src/lib.rs index 06e8993e9303..84bb30b28e56 100644 --- a/lib/router-plugins/builtin/src/lib.rs +++ b/lib/router-plugins/builtin/src/lib.rs @@ -3,26 +3,23 @@ //! Worker-selection policies Dynamo ships. //! -//! Any build that enables the Python bindings' `custom-policy` feature links these, and that -//! feature is on by default, so a frontend deployment selects one through router-policy YAML -//! without rebuilding. A build with default features off, and the standalone EPP, link no catalog -//! at all and reject a configured policy type at startup. -//! -//! These do not go through the replaceable `dynamo-worker-selection-policy-catalog` alias, and they -//! register before it, so a custom image's catalog adds its policies alongside these rather than -//! displacing them. -//! -//! Each policy is one module here. To ship another, add a module and a line in [`register`], then -//! add a row to the policy table in the router configuration guide. Keep a policy in a single file -//! until it needs submodules, then promote it to a directory. If a policy ever needs a dependency -//! beyond `dynamo-kv-router`, put it behind its own default-on Cargo feature so a build can drop -//! it; every policy registered here is compiled into every artifact that links this crate. +//! Routing hosts always link the default through `default_registry`. The optional custom +//! catalog adds the named default and two-tier providers through `register`. The default +//! itself uses the same public candidate inputs and scorer/picker dispatch as external policies. +//! Sequence tracking, eligibility, and admission remain in dynamo-kv-router. +mod default; mod two_tier_cost_fn; +pub use default::{DefaultWorkerSelector, default_factory, default_policy}; + +/// Registry containing the required default only, without an optional policy catalog. +pub fn default_registry() -> RouterPluginRegistry { + RouterPluginRegistry::default().with_default_factory(default_factory()) +} use dynamo_kv_router::plugins::{RouterPluginRegistry, WorkerSelectionPolicyRegistryError}; -/// Register every policy Dynamo ships. +/// Register the named providers Dynamo ships, without changing the host's default factory. /// /// `default` is reserved by the registry for Dynamo's built-in worker selector, so no policy here /// can shadow it. A later catalog that reuses one of these type names fails registration rather @@ -30,6 +27,7 @@ use dynamo_kv_router::plugins::{RouterPluginRegistry, WorkerSelectionPolicyRegis pub fn register( registry: &mut RouterPluginRegistry, ) -> Result<(), WorkerSelectionPolicyRegistryError> { + default::register(registry)?; two_tier_cost_fn::register(registry) } @@ -55,7 +53,7 @@ mod tests { ..Default::default() }; - let mut registry = RouterPluginRegistry::default(); + let mut registry = default_registry(); register(&mut registry).unwrap(); let resolved = registry.resolve(&config); (config, resolved) diff --git a/lib/router-plugins/builtin/src/two_tier_cost_fn.rs b/lib/router-plugins/builtin/src/two_tier_cost_fn.rs index f4a2a3f3bf37..e77eda8b120c 100644 --- a/lib/router-plugins/builtin/src/two_tier_cost_fn.rs +++ b/lib/router-plugins/builtin/src/two_tier_cost_fn.rs @@ -31,7 +31,7 @@ use std::sync::Arc; use dynamo_kv_router::KvRouterConfig; use dynamo_kv_router::plugins::worker_selection::{ - WorkerCacheInput, WorkerInputView, WorkerInputs, WorkerLoadInput, WorkerPicker, + WorkerCacheInputs, WorkerInputView, WorkerInputs, WorkerLoadInput, WorkerPicker, WorkerSelectionContext, WorkerSelectionPolicy, WorkerSelectionPolicyError, WorkerSelectionPolicyFactory, }; @@ -97,7 +97,7 @@ fn least_loaded(load: &[WorkerLoadInput], rows: impl Iterator) -> fn select_row( parameters: &Parameters, - cache: &[WorkerCacheInput], + cache: WorkerCacheInputs<'_>, load: &[WorkerLoadInput], request_blocks: u64, ) -> Option { diff --git a/lib/router-plugins/builtin/tests/batch_scoring.rs b/lib/router-plugins/builtin/tests/batch_scoring.rs new file mode 100644 index 000000000000..16c0131a14e6 --- /dev/null +++ b/lib/router-plugins/builtin/tests/batch_scoring.rs @@ -0,0 +1,366 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Exercise the batch scoring contract using only public plugin inputs. +mod support; + +use std::sync::{Arc, Mutex}; + +use dynamo_kv_router::{ + KvRouterConfig, WorkerCandidate, WorkerCandidates, WorkerFilter, WorkerInputView, WorkerInputs, + WorkerPicker, WorkerScorer, WorkerSelectionContext, WorkerSelectionPolicy, + WorkerSelectionPolicyError, WorkerSelector, +}; +use support::fixture; + +#[derive(Debug, PartialEq)] +enum Call { + Score(usize, Vec), + Pick, +} + +struct RelativeLoadScorer { + index: usize, + calls: Arc>>, +} +impl WorkerScorer for RelativeLoadScorer { + fn required_worker_inputs(&self) -> WorkerInputs { + WorkerInputs::LOAD + } + + fn score( + &mut self, + context: &WorkerSelectionContext<'_>, + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + assert_eq!(context.prompt_tokens(), 17); + assert!(candidates.iter().all(|c| c.cache().is_none())); + let mut ids: Vec<_> = candidates.iter().map(|c| c.worker().worker_id).collect(); + ids.sort_unstable(); + self.calls + .lock() + .unwrap() + .push(Call::Score(self.index, ids)); + let minimum = candidates + .iter() + .map(|c| c.load().unwrap().active_requests()) + .min() + .unwrap(); + for (candidate, cost) in candidates.iter().zip(costs) { + *cost = (candidate.load().unwrap().active_requests() - minimum) as f64; + } + Ok(()) + } +} + +struct ExcludeWorkerOne; +impl WorkerFilter for ExcludeWorkerOne { + fn keep( + &mut self, + _: &WorkerSelectionContext<'_>, + candidate: WorkerCandidate<'_>, + ) -> Result { + Ok(candidate.worker().worker_id != 1) + } +} + +struct InspectCosts(Arc>>); +impl WorkerPicker for InspectCosts { + fn pick( + &mut self, + _: &WorkerSelectionContext<'_>, + input: WorkerInputView<'_>, + ) -> Result { + assert!(input.load().is_none()); + assert!(input.cache().is_none()); + self.0.lock().unwrap().push(Call::Pick); + for candidate in input.candidates() { + // Each scorer contributes the same relative count; the host adds both. + let expected = if candidate.worker().worker_id == 3 { + 0.0 + } else { + 6.0 + }; + assert_eq!(candidate.cost(), expected); + } + Ok(input + .candidates() + .iter() + .position(|c| c.cost() == 0.0) + .unwrap()) + } +} + +#[test] +fn scores_batches_from_surviving_workers_and_resets_each_selection() { + let (workers, mut request) = fixture(4, 17); + request.allowed_worker_ids = Some([1, 2, 3].into_iter().collect()); + let calls = Arc::new(Mutex::new(Vec::new())); + let policy = WorkerSelectionPolicy::new_with_filters( + KvRouterConfig::default(), + "test", + vec![Box::new(ExcludeWorkerOne)], + (0..2) + .map(|index| { + Box::new(RelativeLoadScorer { + index, + calls: calls.clone(), + }) as Box + }) + .collect(), + Box::new(InspectCosts(calls.clone())), + ); + // Excluded workers have zero load. Neither may lower the batch minimum. + for round in 0..3 { + for (worker, load) in &mut request.worker_loads { + load.active_requests = match worker.worker_id { + 2 => 10 + round * 10 + 3, + 3 => 10 + round * 10, + _ => 0, + }; + } + if round == 2 { + request.allowed_worker_ids = Some([3].into_iter().collect()); + } + let result = policy + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(); + assert_eq!(result.worker.worker_id, 3); + let mut calls = calls.lock().unwrap(); + let expected = if round == 2 { + vec![3, 3] + } else { + vec![2, 2, 3, 3] + }; + assert_eq!( + *calls, + vec![ + Call::Score(0, expected.clone()), + Call::Score(1, expected), + Call::Pick + ] + ); + calls.clear(); + } +} + +struct FailScoring(Arc>); +impl WorkerScorer for FailScoring { + fn score( + &mut self, + _: &WorkerSelectionContext<'_>, + _: WorkerCandidates<'_>, + _: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + *self.0.lock().unwrap() += 1; + Err(WorkerSelectionPolicyError::failed("score failed")) + } +} +struct NeverPick; +impl WorkerPicker for NeverPick { + fn pick( + &mut self, + _: &WorkerSelectionContext<'_>, + _: WorkerInputView<'_>, + ) -> Result { + panic!("failed or empty selections must stop before picking") + } +} + +#[test] +fn skips_scoring_for_empty_sets_and_aborts_on_error() { + let (workers, mut request) = fixture(2, 17); + let calls = Arc::new(Mutex::new(0)); + let policy = WorkerSelectionPolicy::new_with_filters( + KvRouterConfig::default(), + "test", + vec![Box::new(ExcludeWorkerOne)], + vec![Box::new(FailScoring(calls.clone()))], + Box::new(NeverPick), + ); + for allowed in [vec![], vec![1]] { + request.allowed_worker_ids = Some(allowed.into_iter().collect()); + assert!( + policy + .select_worker(support::selection_input(&workers, &request, 16)) + .is_err() + ); + assert_eq!(*calls.lock().unwrap(), 0); + } + request.allowed_worker_ids = None; + let error = policy + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap_err(); + assert!(error.to_string().contains("score failed")); + assert_eq!(*calls.lock().unwrap(), 1); +} + +#[test] +fn rejects_nonfinite_contributions_and_overflow_before_picking() { + struct Constant(f64); + impl WorkerScorer for Constant { + fn score( + &mut self, + _: &WorkerSelectionContext<'_>, + _: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + costs.fill(self.0); + Ok(()) + } + } + let (workers, request) = fixture(1, 17); + for costs in [ + vec![f64::NAN], + vec![f64::INFINITY], + vec![f64::MAX, f64::MAX], + ] { + let policy = WorkerSelectionPolicy::new( + KvRouterConfig::default(), + "test", + costs + .into_iter() + .map(|cost| Box::new(Constant(cost)) as Box) + .collect(), + Box::new(NeverPick), + ); + let error = policy + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap_err(); + assert!(error.to_string().contains("non-finite")); + } +} + +#[test] +fn picker_columns_and_costs_stay_aligned_after_a_scoring_error() { + struct FailSecondScoreOnce(usize); + impl WorkerScorer for FailSecondScoreOnce { + fn required_worker_inputs(&self) -> WorkerInputs { + WorkerInputs::LOAD + } + fn score( + &mut self, + _: &WorkerSelectionContext<'_>, + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + for (candidate, cost) in candidates.iter().zip(costs) { + self.0 += 1; + if self.0 == 2 { + return Err(WorkerSelectionPolicyError::failed("score failed")); + } + *cost = candidate.load().unwrap().active_requests() as f64; + } + Ok(()) + } + } + struct CheckColumns; + impl WorkerPicker for CheckColumns { + fn required_worker_inputs(&self) -> WorkerInputs { + WorkerInputs::CACHE | WorkerInputs::LOAD + } + fn pick( + &mut self, + _: &WorkerSelectionContext<'_>, + input: WorkerInputView<'_>, + ) -> Result { + let cache = input.cache().unwrap(); + let load = input.load().unwrap(); + assert_eq!(cache.len(), input.candidates().len()); + assert_eq!(load.len(), input.candidates().len()); + for (row, candidate) in input.candidates().iter().enumerate() { + let worker = candidate.worker(); + let expected_overlap = (worker.worker_id * 7 + u64::from(worker.dp_rank)) % 9; + assert_eq!( + cache.get(row).unwrap().device_overlap_blocks(), + expected_overlap as f64 + ); + assert_eq!(load[row].active_requests(), worker.worker_id as usize % 5); + assert_eq!(candidate.cost(), load[row].active_requests() as f64); + } + Ok(0) + } + } + let (workers, mut request) = fixture(8, 17); + let policy = WorkerSelectionPolicy::new_with_filters( + KvRouterConfig::default(), + "test", + vec![Box::new(ExcludeWorkerOne)], + vec![Box::new(FailSecondScoreOnce(0))], + Box::new(CheckColumns), + ); + let select = |request: &dynamo_kv_router::scheduling::SchedulingRequest| { + policy.select_worker(support::selection_input(&workers, request, 16)) + }; + assert!( + select(&request) + .unwrap_err() + .to_string() + .contains("score failed") + ); + request.allowed_worker_ids = Some([1, 3, 4].into_iter().collect()); + assert!([3, 4].contains(&select(&request).unwrap().worker.worker_id)); + request.allowed_worker_ids = None; + assert_ne!(select(&request).unwrap().worker.worker_id, 1); +} + +#[test] +fn unwritten_costs_cannot_reuse_a_previous_selection_or_scorer() { + struct Fill; + impl WorkerScorer for Fill { + fn score( + &mut self, + _: &WorkerSelectionContext<'_>, + _: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + costs.fill(7.0); + Ok(()) + } + } + struct OmitOnSecondCall(bool); + impl WorkerScorer for OmitOnSecondCall { + fn score( + &mut self, + _: &WorkerSelectionContext<'_>, + _: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + if std::mem::replace(&mut self.0, false) { + costs.fill(1.0); + } + Ok(()) + } + } + struct First; + impl WorkerPicker for First { + fn pick( + &mut self, + _: &WorkerSelectionContext<'_>, + input: WorkerInputView<'_>, + ) -> Result { + assert!(input.candidates().iter().all(|c| c.cost() == 8.0)); + Ok(0) + } + } + let (workers, request) = fixture(2, 17); + let policy = WorkerSelectionPolicy::new( + KvRouterConfig::default(), + "test", + vec![Box::new(Fill), Box::new(OmitOnSecondCall(true))], + Box::new(First), + ); + let select = || policy.select_worker(support::selection_input(&workers, &request, 16)); + select().unwrap(); + let error = select().unwrap_err(); + assert!(matches!( + error, + dynamo_kv_router::KvSchedulerError::WorkerSelectionPolicy( + WorkerSelectionPolicyError::NonFiniteCost { + scorer_index: 1, + row: 0 + } + ) + )); +} diff --git a/lib/router-plugins/builtin/tests/cache_inputs.rs b/lib/router-plugins/builtin/tests/cache_inputs.rs new file mode 100644 index 000000000000..f23ad8fcfdeb --- /dev/null +++ b/lib/router-plugins/builtin/tests/cache_inputs.rs @@ -0,0 +1,244 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +mod support; + +use dynamo_kv_router::{ + KvRouterConfig, SharedCacheHits, WorkerCacheInput, WorkerCandidate, WorkerCandidates, + WorkerFilter, WorkerInputView, WorkerInputs, WorkerPicker, WorkerScorer, + WorkerSelectionContext, WorkerSelectionPolicy, WorkerSelectionPolicyError, WorkerSelector, +}; +use std::sync::{ + Arc, + atomic::{AtomicUsize, Ordering}, +}; + +struct InputProbe { + inputs: WorkerInputs, + tier_matches: bool, + shared_hits: Option, + shared_identity: Arc, + declarations: Arc, + calls: Arc, +} + +impl InputProbe { + fn declare(&self) -> WorkerInputs { + self.declarations.fetch_add(1, Ordering::Relaxed); + self.inputs + } + + fn check_candidate(&self, candidate: WorkerCandidate<'_>) { + assert_eq!( + candidate.cache().is_some(), + self.inputs.contains(WorkerInputs::CACHE) + ); + assert_eq!( + candidate.load().is_some(), + self.inputs.contains(WorkerInputs::LOAD) + ); + assert_eq!( + candidate.preferred_taint_multiplier().is_some(), + self.inputs.contains(WorkerInputs::PREFERRED_TAINT) + ); + if let Some(cache) = candidate.cache() { + self.check_cache(cache); + assert_eq!( + cache.host_overlap_blocks(), + if self.tier_matches { 2.0 } else { 0.0 } + ); + } + if let Some(load) = candidate.load() { + assert!(load.is_available()); + } + } + + fn check(&self, context: &WorkerSelectionContext<'_>) { + self.calls.fetch_add(1, Ordering::Relaxed); + // Ordinary request context stays available without CACHE. + assert_eq!(context.prompt_tokens(), 17); + } + + fn check_cache(&self, cache: WorkerCacheInput<'_>) { + assert_eq!(cache.has_tier_matches(), self.tier_matches); + assert_eq!(cache.shared_hits().is_some(), self.shared_hits.is_some()); + if let Some(hits) = cache.shared_hits() { + assert_eq!(hits.hits_beyond(0), self.shared_hits.unwrap()); + let address = std::ptr::from_ref(hits) as usize; + if let Err(previous) = self.shared_identity.compare_exchange( + 0, + address, + Ordering::Relaxed, + Ordering::Relaxed, + ) { + assert_eq!(address, previous); + } + } + } +} + +impl WorkerFilter for InputProbe { + fn required_worker_inputs(&self) -> WorkerInputs { + self.declare() + } + + fn keep( + &mut self, + context: &WorkerSelectionContext<'_>, + candidate: WorkerCandidate<'_>, + ) -> Result { + self.check(context); + self.check_candidate(candidate); + Ok(true) + } +} + +impl WorkerScorer for InputProbe { + fn required_worker_inputs(&self) -> WorkerInputs { + self.declare() + } + + fn score( + &mut self, + context: &WorkerSelectionContext<'_>, + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + self.check(context); + assert_eq!(candidates.len(), costs.len()); + assert!(!candidates.is_empty()); + assert!(candidates.get(candidates.len()).is_none()); + for (row, candidate) in candidates.iter().enumerate() { + self.check_candidate(candidate); + let indexed = candidates.get(row).unwrap(); + self.check_candidate(indexed); + assert_eq!(indexed.worker(), candidate.worker()); + } + costs.fill(0.0); + Ok(()) + } +} + +impl WorkerPicker for InputProbe { + fn required_worker_inputs(&self) -> WorkerInputs { + self.declare() + } + + fn pick( + &mut self, + context: &WorkerSelectionContext<'_>, + input: WorkerInputView<'_>, + ) -> Result { + self.check(context); + assert_eq!( + input.cache().is_some(), + self.inputs.contains(WorkerInputs::CACHE) + ); + assert_eq!( + input.load().is_some(), + self.inputs.contains(WorkerInputs::LOAD) + ); + if let Some(cache) = input.cache() { + assert_eq!(cache.len(), input.candidates().len()); + assert!(!cache.is_empty()); + assert!(cache.get(cache.len()).is_none()); + for (row, entry) in cache.iter().enumerate() { + self.check_cache(entry); + self.check_cache(cache.get(row).unwrap()); + } + } + for candidate in input.candidates() { + assert_eq!( + candidate.preferred_taint_multiplier().is_some(), + self.inputs.contains(WorkerInputs::PREFERRED_TAINT) + ); + } + Ok(0) + } +} + +fn inputs(mask: usize) -> WorkerInputs { + [ + WorkerInputs::CACHE, + WorkerInputs::LOAD, + WorkerInputs::PREFERRED_TAINT, + ] + .into_iter() + .enumerate() + .fold(WorkerInputs::NONE, |inputs, (bit, group)| { + if mask & (1 << bit) == 0 { + inputs + } else { + inputs | group + } + }) +} + +#[test] +fn each_component_can_only_read_its_own_inputs() { + for filter_mask in 0..8 { + for scorer_mask in 0..8 { + for picker_mask in 0..8 { + for tier_matches in [false, true] { + for shared_hits in [None, Some(0), Some(4)] { + let (workers, mut request) = support::fixture(2, 17); + if !tier_matches { + request.overlap.tier_overlap_blocks = Default::default(); + } + request.shared_cache_hits = shared_hits.map(|count| { + SharedCacheHits::from_ranges(if count == 0 { + vec![] + } else { + vec![1..3, 5..7] + }) + }); + // Even unmatched preferences produce Some(1.0), so an undeclared + // component leaking another component's taint value fails this test. + request + .routing_constraints + .preferred_taints + .insert("preferred".into(), 1.0); + let declarations = Arc::new(AtomicUsize::new(0)); + let calls = Arc::new(AtomicUsize::new(0)); + let shared_identity = Arc::new(AtomicUsize::new(0)); + let probe = |mask| InputProbe { + inputs: inputs(mask), + tier_matches, + shared_hits, + shared_identity: shared_identity.clone(), + declarations: declarations.clone(), + calls: calls.clone(), + }; + let policy = WorkerSelectionPolicy::new_with_filters( + KvRouterConfig::default(), + "test", + vec![ + Box::new(probe(filter_mask)), + Box::new(probe(7 ^ filter_mask)), + ], + vec![ + Box::new(probe(scorer_mask)), + Box::new(probe(7 ^ scorer_mask)), + ], + Box::new(probe(picker_mask)), + ); + assert_eq!(declarations.load(Ordering::Relaxed), 5); + for _ in 0..2 { + policy + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(); + } + if let Some(hits) = request.shared_cache_hits.as_ref() { + assert_eq!( + shared_identity.load(Ordering::Relaxed), + std::ptr::from_ref(hits) as usize + ); + } + assert_eq!(calls.load(Ordering::Relaxed), 22); + assert_eq!(declarations.load(Ordering::Relaxed), 5); + } + } + } + } + } +} diff --git a/lib/router-plugins/builtin/tests/default_lifecycle.rs b/lib/router-plugins/builtin/tests/default_lifecycle.rs new file mode 100644 index 000000000000..857bbf38332b --- /dev/null +++ b/lib/router-plugins/builtin/tests/default_lifecycle.rs @@ -0,0 +1,143 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +use dynamo_custom_policy_builtin::default_factory; +use dynamo_kv_router::protocols::RoutingConstraints; +use dynamo_kv_router::services::selection::{ + PromptRequest, SelectAndReserveRequest, SelectionCacheConfig, SelectionCore, WorkerRequest, +}; +use dynamo_kv_router::{KvRouterConfig, RoutingPartitionId}; + +fn worker(worker_id: u64) -> WorkerRequest { + WorkerRequest { + worker_id, + model_name: "model".to_string(), + routing_group: "default".to_string(), + endpoint: Some(format!("http://worker-{worker_id}:8000")), + block_size: Some(4), + max_num_batched_tokens: Some(1024), + ..Default::default() + } +} + +fn reserve_request(selection_id: &str) -> SelectAndReserveRequest { + SelectAndReserveRequest { + model_name: "model".to_string(), + routing_group: "default".to_string(), + selection_id: Some(selection_id.to_string()), + prompt: PromptRequest { + token_ids: Some(vec![1, 2, 3, 4, 5]), + ..Default::default() + }, + router_config_override: None, + expected_output_tokens: None, + priority_jump: None, + strict_priority: None, + session_id: None, + session_context: None, + affinity_target: None, + pinned_worker: None, + allowed_worker_ids: None, + routing_constraints: RoutingConstraints::default(), + } +} + +#[tokio::test] +async fn shared_core_books_and_releases_with_the_builtin_default() { + let core = SelectionCore::try_new_local( + KvRouterConfig { + use_kv_events: false, + router_queue_threshold: None, + ..Default::default() + }, + 1, + Default::default(), + SelectionCacheConfig::default(), + default_factory(), + ) + .unwrap(); + core.upsert_worker(worker(1)).await.unwrap(); + let partition = core + .partition(&RoutingPartitionId::new("model", "default")) + .unwrap(); + assert!(!partition.scheduler().has_request("request")); + core.select_and_reserve(reserve_request("request")) + .await + .unwrap(); + assert!(partition.scheduler().has_request("request")); + core.prefill_complete("request").await.unwrap(); + core.free_reservation("request").await.unwrap(); + assert!(!partition.scheduler().has_request("request")); + assert!(core.free_reservation("request").await.is_err()); + core.shutdown(); +} + +#[tokio::test] +async fn scoring_error_does_not_book_and_allows_retry() { + use dynamo_kv_router::{ + WorkerCandidates, WorkerInputView, WorkerPicker, WorkerScorer, WorkerSelectionContext, + WorkerSelectionPolicy, WorkerSelectionPolicyError, + }; + use std::sync::Arc; + + struct FailOnce(bool); + impl WorkerScorer for FailOnce { + fn score( + &mut self, + _: &WorkerSelectionContext<'_>, + _: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + if std::mem::take(&mut self.0) { + return Err(WorkerSelectionPolicyError::failed("score failed")); + } + costs.fill(0.0); + Ok(()) + } + } + struct First; + impl WorkerPicker for First { + fn pick( + &mut self, + _: &WorkerSelectionContext<'_>, + _: WorkerInputView<'_>, + ) -> Result { + Ok(0) + } + } + let core = SelectionCore::try_new_local( + KvRouterConfig { + use_kv_events: false, + router_queue_threshold: None, + ..Default::default() + }, + 1, + Default::default(), + SelectionCacheConfig::default(), + Arc::new(|config, role, _| { + WorkerSelectionPolicy::new( + config.clone(), + role.default_selector_label(), + vec![Box::new(FailOnce(true))], + Box::new(First), + ) + }), + ) + .unwrap(); + core.upsert_worker(worker(1)).await.unwrap(); + let partition = core + .partition(&RoutingPartitionId::new("model", "default")) + .unwrap(); + let error = core + .select_and_reserve(reserve_request("request")) + .await + .unwrap_err(); + assert!(error.to_string().contains("score failed")); + assert!(!partition.scheduler().has_request("request")); + core.select_and_reserve(reserve_request("request")) + .await + .unwrap(); + assert!(partition.scheduler().has_request("request")); + core.free_reservation("request").await.unwrap(); + assert!(!partition.scheduler().has_request("request")); + core.shutdown(); +} diff --git a/lib/router-plugins/builtin/tests/default_policy.rs b/lib/router-plugins/builtin/tests/default_policy.rs new file mode 100644 index 000000000000..0694990a0bca --- /dev/null +++ b/lib/router-plugins/builtin/tests/default_policy.rs @@ -0,0 +1,335 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +mod support; +use dynamo_custom_policy_builtin::{DefaultWorkerSelector, default_policy, default_registry}; +use dynamo_kv_router::protocols::WorkerWithDpRank; +use dynamo_kv_router::{ + KvRouterConfig, RoutingPartitionRef, WorkerInputView, WorkerInputs, WorkerPicker, + WorkerSelectionContext, WorkerSelectionPolicy, WorkerSelectionPolicyError, WorkerSelector, + WorkerType, +}; +use support::*; + +#[test] +fn seeded_selection_matches_reference_across_cache_and_load_shapes() { + for temperature in [0.0, 0.7] { + for prompt in [1, 17, 127, 2048] { + for mode in 0..32 { + let (workers, mut request) = fixture(16, prompt); + let config = KvRouterConfig { + router_temperature: temperature, + overlap_score_credit_decay: 0.6, + host_cache_hit_weight: 0.25, + disk_cache_hit_weight: 0.1, + decode_active_request_weight: if mode & 8 == 0 { 0.0 } else { 0.7 }, + shared_cache_multiplier: if mode & 16 == 0 { 0.0 } else { 0.6 }, + ..Default::default() + }; + if mode % 8 >= 4 { + request.shared_cache_hits = + Some(dynamo_kv_router::SharedCacheHits::from_ranges(vec![ + 1..3, + 5..12, + ])); + } + match mode % 4 { + 1 => request.overlap.tier_overlap_blocks = Default::default(), + 2 => request.worker_loads.clear(), + 3 => request.track_prefill_tokens = false, + _ => {} + } + let reference = dynamo_kv_router::DefaultWorkerSelector::new_seeded( + Some(config.clone()), + "test", + 42, + ); + let plugin = DefaultWorkerSelector::new_seeded(Some(config), "test", 42); + for _ in 0..64 { + let input = support::selection_input(&workers, &request, 16); + let expected = reference.select_worker(input).unwrap(); + let actual = plugin.select_worker(input).unwrap(); + assert_eq!( + actual.worker, expected.worker, + "temperature={temperature} prompt={prompt} mode={mode}" + ); + assert_eq!(actual.cached_tokens, expected.cached_tokens); + assert_eq!( + actual.potential_decode_blocks, + expected.potential_decode_blocks + ); + } + } + } + } +} + +#[test] +fn unseeded_sampling_matches_reference_with_the_same_random_draw() { + for count in [1, 8, 64] { + for temperature in [0.1, 0.7, 1.0, 2.0] { + for equal_costs in [false, true] { + let (workers, mut request) = fixture(count, 2048); + if equal_costs { + request.worker_loads.clear(); + request.overlap = Default::default(); + } + let config = KvRouterConfig { + router_temperature: temperature, + ..Default::default() + }; + let reference = + dynamo_kv_router::DefaultWorkerSelector::new(Some(config.clone()), "prefill"); + let plugin = default_policy(config, "prefill"); + for seed in 0..64 { + let input = selection_input(&workers, &request, 16); + fastrand::seed(seed); + let expected = reference.select_worker(input).unwrap(); + let next_random = fastrand::u64(..); + fastrand::seed(seed); + let actual = plugin.select_worker(input).unwrap(); + assert_eq!(actual.worker, expected.worker); + assert_eq!(actual.cached_tokens, expected.cached_tokens); + assert_eq!(fastrand::u64(..), next_random); + } + } + } + } +} + +#[test] +fn unseeded_minimum_picker_only_selects_workers_tied_for_lowest_cost() { + let (workers, mut request) = fixture(8, 17); + let policy = default_policy( + KvRouterConfig { + overlap_score_credit: 0.0, + prefill_load_scale: 0.0, + decode_active_request_weight: 1.0, + ..Default::default() + }, + "prefill", + ); + for best in [[0, 1], [2, 5], [6, 7]] { + for (worker, load) in &mut request.worker_loads { + load.active_requests = if best.contains(&worker.worker_id) { + 0 + } else { + 10 + }; + load.active_decode_blocks = 0; + load.additional_active_blocks = 0; + } + for _ in 0..32 { + let selected = policy + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(); + assert!(best.contains(&selected.worker.worker_id)); + } + } +} + +#[test] +fn prepared_values_follow_each_request_when_reusing_a_policy() { + for label in ["prefill", "decode"] { + for temperature in [0.0, 0.7] { + let config = KvRouterConfig { + router_temperature: temperature, + overlap_score_credit_decay: 0.6, + host_cache_hit_weight: 0.25, + disk_cache_hit_weight: 0.1, + ..Default::default() + }; + let reference = dynamo_kv_router::DefaultWorkerSelector::new_seeded( + Some(config.clone()), + label, + 42, + ); + let plugin = DefaultWorkerSelector::new_seeded(Some(config), label, 42); + for round in 0..64 { + let prompt = [1, 17, 127, 2048][round % 4]; + let block_size = [8, 16, 32, 17, 3][round % 5]; + let (workers, mut request) = fixture(16, prompt); + request.track_prefill_tokens = round % 2 == 0; + if round % 3 == 0 { + request.overlap.tier_overlap_blocks = Default::default(); + } + if round % 5 == 0 { + request.worker_loads.clear(); + } else { + for load in request.worker_loads.values_mut() { + load.active_prefill_tokens += round * 19; + } + } + let input = support::selection_input(&workers, &request, block_size); + let expected = reference.select_worker(input).unwrap(); + let actual = plugin.select_worker(input).unwrap(); + assert_eq!( + actual.worker, expected.worker, + "label={label} temperature={temperature} round={round}" + ); + assert_eq!(actual.cached_tokens, expected.cached_tokens); + assert_eq!( + actual.potential_decode_blocks, + expected.potential_decode_blocks + ); + } + } + } +} + +#[test] +fn exact_prompt_and_accounting_inputs_are_available_to_external_pickers() { + struct Inspect; + impl WorkerPicker for Inspect { + fn required_worker_inputs(&self) -> WorkerInputs { + WorkerInputs::CACHE | WorkerInputs::LOAD + } + fn pick( + &mut self, + context: &WorkerSelectionContext<'_>, + input: WorkerInputView<'_>, + ) -> Result { + assert_eq!(context.prompt_tokens(), 17); + assert_eq!(context.request_blocks(), 2); + assert!(input.load().unwrap().iter().all(|load| load.is_available())); + for cache in input.cache().unwrap().iter() { + assert!(cache.has_tier_matches()); + let (blocks, tokens) = cache.accounting_cache_estimate(); + assert_eq!((blocks * 16.0) as usize, tokens); + } + Ok(0) + } + } + let (workers, mut request) = fixture(2, 17); + // Tier availability belongs to the lookup, even when its only entry is ineligible. + request.overlap.tier_overlap_blocks = Default::default(); + request + .overlap + .tier_overlap_blocks + .disk + .insert(WorkerWithDpRank::from_worker_id(999), 1); + WorkerSelectionPolicy::new(KvRouterConfig::default(), "test", vec![], Box::new(Inspect)) + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(); +} + +#[test] +fn configured_default_resolves_for_every_role_and_uses_exclusive_affinity() { + let registry = default_registry(); + for conditional_disagg_enabled in [false, true] { + for role in [ + WorkerType::Aggregated, + WorkerType::Prefill, + WorkerType::Decode, + WorkerType::Encode, + ] { + let config = KvRouterConfig { + conditional_disagg_enabled, + ..Default::default() + }; + let factory = registry + .resolve_for_worker_type(&config, role) + .unwrap() + .unwrap(); + let policy = factory(&config, role, RoutingPartitionRef::new("model", "default")); + let inputs = + >::required_worker_inputs( + &policy, + ); + assert_eq!( + inputs.contains(WorkerInputs::CACHE), + role != WorkerType::Decode || conditional_disagg_enabled + ); + assert!( + >::uses_exclusive_affinity_target( + &policy + ) + ); + } + } +} + +#[test] +fn mandatory_pin_is_preserved() { + let (workers, mut request) = fixture(4, 17); + request.pinned_worker = Some(WorkerWithDpRank::new(3, 1)); + let selected = default_policy(KvRouterConfig::default(), "test") + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(); + assert_eq!(Some(selected.worker), request.pinned_worker); +} + +#[test] +fn configured_parameters_replace_request_score_overrides() { + use dynamo_kv_router::RouterConfigOverride; + let (workers, mut request) = fixture(2, 160); + for (worker, load) in &mut request.worker_loads { + load.active_prefill_tokens = 0; + load.active_requests = 0; + load.active_decode_blocks = if worker.worker_id == 0 { 8 } else { 0 }; + load.additional_active_blocks = 0; + request + .overlap + .tier_overlap_blocks + .device + .insert(*worker, if worker.worker_id == 0 { 10 } else { 0 }); + } + request.router_config_override = Some(RouterConfigOverride { + overlap_score_credit: Some(0.0), + router_temperature: Some(10.0), + ..Default::default() + }); + let config = KvRouterConfig { + overlap_score_credit: 2.0, + host_cache_hit_weight: 0.0, + disk_cache_hit_weight: 0.0, + router_temperature: 0.0, + ..Default::default() + }; + let policy = default_policy(config, "prefill"); + for _ in 0..32 { + let result = policy + .select_worker(support::selection_input(&workers, &request, 16)) + .unwrap(); + assert_eq!(result.worker.worker_id, 0); + } +} + +#[test] +fn named_default_parameters_resolve_and_reject_invalid_values() { + use std::io::Write; + for (parameter, succeeds) in [ + ("overlap_score_credit: 2.0", true), + ("overlap_score_credit: -1.0", false), + ("unknown: 1", false), + ] { + let mut file = tempfile::NamedTempFile::new().unwrap(); + write!(file, "worker_selection:\n aggregated: tuned\n instances:\n - name: tuned\n type: dynamo-default-cost-fn\n parameters:\n {parameter}\n").unwrap(); + let config = KvRouterConfig { + router_policy_config: Some(file.path().display().to_string()), + ..Default::default() + }; + let mut registry = default_registry(); + dynamo_custom_policy_builtin::register(&mut registry).unwrap(); + assert_eq!(registry.resolve(&config).is_ok(), succeeds); + } +} + +#[test] +fn pin_does_not_advance_seeded_random_stream() { + let (workers, mut request) = fixture(8, 127); + let config = KvRouterConfig { + router_temperature: 0.7, + ..Default::default() + }; + let reference = + dynamo_kv_router::DefaultWorkerSelector::new_seeded(Some(config.clone()), "prefill", 42); + let plugin = DefaultWorkerSelector::new_seeded(Some(config), "prefill", 42); + for pinned in [true, false, true, false, false] { + request.pinned_worker = pinned.then_some(WorkerWithDpRank::new(3, 1)); + let input = support::selection_input(&workers, &request, 16); + assert_eq!( + reference.select_worker(input).unwrap().worker, + plugin.select_worker(input).unwrap().worker + ); + } +} diff --git a/lib/router-plugins/builtin/tests/plugin_registry.rs b/lib/router-plugins/builtin/tests/plugin_registry.rs new file mode 100644 index 000000000000..b63d13842bd8 --- /dev/null +++ b/lib/router-plugins/builtin/tests/plugin_registry.rs @@ -0,0 +1,108 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::sync::Arc; + +use dynamo_kv_router::plugins::RouterPlugins; +use dynamo_kv_router::plugins::request_classifier::{ + ClassifyFuture, ClassifyRequest, RequestClassifier, +}; +use dynamo_kv_router::{KvRouterConfig, RoutingPartitionRef, WorkerType}; + +struct PassThrough; + +impl RequestClassifier for PassThrough { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + Box::pin(async move { Ok(request) }) + } +} + +fn config(yaml: &str) -> (tempfile::NamedTempFile, KvRouterConfig) { + let file = tempfile::NamedTempFile::new().unwrap(); + std::fs::write(file.path(), yaml).unwrap(); + let config = KvRouterConfig { + router_policy_config: Some(file.path().display().to_string()), + ..Default::default() + }; + (file, config) +} + +#[test] +fn builtin_default_does_not_opt_into_custom_frontend_restrictions() { + let mut registry = dynamo_custom_policy_builtin::default_registry(); + dynamo_custom_policy_builtin::register(&mut registry).unwrap(); + let (_file, explicit_default) = config("worker_selection:\n aggregated: default\n"); + for config in [KvRouterConfig::default(), explicit_default] { + assert!(registry.resolve(&config).unwrap().is_some()); + let plugins = registry.resolve_plugins(&config).unwrap(); + assert!(plugins.worker_selection().is_some()); + assert!(!plugins.has_custom_worker_selection()); + assert!(!plugins.has_custom_plugins()); + } +} + +#[test] +fn builtin_registration_preserves_classifiers_and_resolves_mixed_pools() { + for selection in ["default", "named-default"] { + let mut registry = dynamo_custom_policy_builtin::default_registry(); + registry + .register_request_classifier( + "pass-through", + Arc::new(|_| Ok(Arc::new(|_| Box::new(PassThrough)))), + ) + .unwrap(); + // Registering named providers must preserve the fallback and classifier providers. + dynamo_custom_policy_builtin::register(&mut registry).unwrap(); + let (_file, config) = config(&format!( + r#" +request_classifier: + type: pass-through +worker_selection: + prefill: {selection} + instances: + - name: named-default + type: dynamo-default-cost-fn +"# + )); + let plugins = registry.resolve_plugins(&config).unwrap(); + assert!(!plugins.is_empty()); + assert!(plugins.request_classifier().is_some()); + assert!(plugins.worker_selection().is_some()); + assert!(plugins.has_custom_plugins()); + assert_eq!( + plugins.has_custom_worker_selection(), + selection != "default" + ); + // With only a classifier selected, the host still resolves the builtin policy. + let factory = registry.resolve(&config).unwrap().unwrap(); + for role in [ + WorkerType::Aggregated, + WorkerType::Prefill, + WorkerType::Decode, + WorkerType::Encode, + ] { + factory(&config, role, RoutingPartitionRef::new("model", "default")); + } + } +} + +#[test] +fn programmatic_factory_is_an_explicit_custom_selection() { + let plugins = RouterPlugins::default() + .with_worker_selection(dynamo_custom_policy_builtin::default_factory()); + assert!(plugins.has_custom_worker_selection()); + assert!(plugins.has_custom_plugins()); +} + +#[test] +fn registering_named_policies_does_not_replace_the_hosts_default() { + let fallback = dynamo_custom_policy_builtin::default_factory(); + let mut registry = dynamo_kv_router::plugins::RouterPluginRegistry::default() + .with_default_factory(fallback.clone()); + dynamo_custom_policy_builtin::register(&mut registry).unwrap(); + let resolved = registry + .resolve(&KvRouterConfig::default()) + .unwrap() + .unwrap(); + assert!(Arc::ptr_eq(&fallback, &resolved)); +} diff --git a/lib/router-plugins/builtin/tests/support/mod.rs b/lib/router-plugins/builtin/tests/support/mod.rs new file mode 100644 index 000000000000..86d0fc7e918f --- /dev/null +++ b/lib/router-plugins/builtin/tests/support/mod.rs @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +use dynamo_kv_router::protocols::{RoutingConstraints, WorkerConfigLike, WorkerWithDpRank}; +use dynamo_kv_router::scheduling::{OverlapSignals, ScheduleMode, SchedulingRequest}; +use dynamo_kv_router::{WorkerLoadProjection, WorkerSelectionInput}; +use std::collections::HashMap; + +#[derive(Clone, Copy)] +pub struct TestWorker; +impl WorkerConfigLike for TestWorker { + fn data_parallel_start_rank(&self) -> u32 { + 0 + } + fn data_parallel_size(&self) -> u32 { + 2 + } + fn max_num_batched_tokens(&self) -> Option { + None + } + fn total_kv_blocks(&self) -> Option { + Some(16384) + } +} + +pub fn fixture( + count: usize, + prompt_tokens: usize, +) -> (HashMap, SchedulingRequest) { + let mut request = SchedulingRequest { + mode: ScheduleMode::QueryOnly { request_id: None }, + token_seq: None, + isl_tokens: prompt_tokens, + lora_name: None, + expected_output_tokens: None, + affinity_target: None, + pinned_worker: None, + allowed_worker_ids: None, + routing_constraints: RoutingConstraints::default(), + router_config_override: None, + track_prefill_tokens: true, + priority_jump: 0.0, + strict_priority: 0, + policy_class: None, + session_context: None, + overlap: OverlapSignals::default(), + kv_transfer_candidates: None, + retain_kv_transfer_chain: false, + shared_cache_hits: None, + worker_loads: Default::default(), + resp_tx: None, + }; + let workers = (0..count as u64).map(|id| (id, TestWorker)).collect(); + for id in 0..count as u64 { + for dp_rank in 0..2 { + let w = WorkerWithDpRank::new(id, dp_rank); + let overlap = (id as usize * 7 + dp_rank as usize) % 9; + request + .overlap + .tier_overlap_blocks + .device + .insert(w, overlap); + request.overlap.tier_overlap_blocks.host_pinned.insert(w, 2); + request.overlap.tier_overlap_blocks.disk.insert(w, 1); + request + .overlap + .effective_overlap_blocks + .insert(w, overlap as f64 + 0.5); + request + .overlap + .effective_cached_tokens + .insert(w, overlap * 16 + 8); + request.worker_loads.insert( + w, + WorkerLoadProjection { + active_requests: id as usize % 5, + active_prefill_tokens: (id as usize % 7) * 19, + active_decode_blocks: id as usize % 11, + additional_active_blocks: 3, + }, + ); + } + } + (workers, request) +} + +pub fn selection_input<'a>( + workers: &'a HashMap, + request: &'a SchedulingRequest, + block_size: u32, +) -> WorkerSelectionInput<'a, TestWorker> { + WorkerSelectionInput::configured(workers, request, request.eligibility(), block_size) +} From 6fad666a74e365be7ec70834d786a7f59da2da6a Mon Sep 17 00:00:00 2001 From: cmdy Date: Wed, 23 Sep 2026 11:20:53 +0800 Subject: [PATCH 169/191] fix(frontend): accept null optional completion parameters (#14847) Signed-off-by: cmdy --- lib/llm/src/http/service/openai.rs | 98 +++++++++++++++++++ .../src/protocols/openai/chat_completions.rs | 7 +- lib/llm/src/protocols/openai/completions.rs | 7 +- lib/llm/src/protocols/openai/validate.rs | 98 +++++++++++++++++++ 4 files changed, 208 insertions(+), 2 deletions(-) diff --git a/lib/llm/src/http/service/openai.rs b/lib/llm/src/http/service/openai.rs index 1ae70b4df47a..f189ae0321f2 100644 --- a/lib/llm/src/http/service/openai.rs +++ b/lib/llm/src/http/service/openai.rs @@ -6147,6 +6147,104 @@ mod tests { assert_eq!(err.0, StatusCode::UNSUPPORTED_MEDIA_TYPE); } + #[test] + fn test_parse_completion_stream_options_null_flags() { + for (options, expected) in [ + (serde_json::json!(null), None), + (serde_json::json!({}), Some((false, false))), + ( + serde_json::json!({"continuous_usage_stats": null}), + Some((false, false)), + ), + ( + serde_json::json!({"continuous_usage_stats": true}), + Some((false, true)), + ), + ( + serde_json::json!({"include_usage": null}), + Some((false, false)), + ), + ( + serde_json::json!({"include_usage": true, "continuous_usage_stats": null}), + Some((true, false)), + ), + ( + serde_json::json!({"include_usage": null, "continuous_usage_stats": true}), + Some((false, true)), + ), + ] { + let mut payload = serde_json::json!({ + "model": "test-model", "stream": true, "stream_options": options, + "messages": [{"role": "user", "content": "hello"}], + }); + let chat: NvCreateChatCompletionRequest = + parse_json_request("chat completions", &serde_json::to_vec(&payload).unwrap()) + .unwrap(); + payload.as_object_mut().unwrap().remove("messages"); + payload["prompt"] = serde_json::json!("hello"); + let completion: NvCreateCompletionRequest = + parse_json_request("completions", &serde_json::to_vec(&payload).unwrap()).unwrap(); + crate::engines::ValidateRequest::validate(&chat).unwrap(); + crate::engines::ValidateRequest::validate(&completion).unwrap(); + for parsed in [chat.inner.stream_options, completion.inner.stream_options] { + assert_eq!( + parsed.map(|opts| (opts.include_usage, opts.continuous_usage_stats)), + expected + ); + } + } + } + + #[test] + fn test_parse_completion_stream_options_rejects_invalid_types() { + for options in [ + serde_json::json!(false), + serde_json::json!({"include_usage": "true", "continuous_usage_stats": null}), + serde_json::json!({"include_usage": null, "continuous_usage_stats": 0}), + ] { + let body = serde_json::to_vec(&serde_json::json!({ + "model": "test-model", "messages": [{"role": "user", "content": "hello"}], + "prompt": "hello", "stream_options": options, + })) + .unwrap(); + assert_eq!( + parse_json_request::("chat completions", &body) + .unwrap_err() + .0, + StatusCode::BAD_REQUEST + ); + assert_eq!( + parse_json_request::("completions", &body) + .unwrap_err() + .0, + StatusCode::BAD_REQUEST + ); + } + let body = + br#"{"model":"test-model","messages":42,"stream_options":{"include_usage":null}}"#; + assert_eq!( + parse_json_request::("chat completions", body) + .unwrap_err() + .0, + StatusCode::BAD_REQUEST + ); + } + + #[test] + fn test_parse_completion_stream_options_preserves_duplicate_field_errors() { + let chat_body = br#"{ + "model":"first-model", + "model":"second-model", + "messages":[{"role":"user","content":"hello"}], + "stream_options":{"include_usage":null} + }"#; + let chat_error = + parse_json_request::("chat completions", chat_body) + .unwrap_err(); + assert_eq!(chat_error.0, StatusCode::BAD_REQUEST); + assert!(chat_error.1.message.contains("duplicate field `model`")); + } + #[test] fn test_parse_chat_completion_request_escapes_control_chars_in_strings() { let body = b"{\"model\":\"test-model\",\"messages\":[{\"role\":\"user\",\"content\":\"log \x1b[33mPK\x03\x04\"}]}"; diff --git a/lib/llm/src/protocols/openai/chat_completions.rs b/lib/llm/src/protocols/openai/chat_completions.rs index 42459d4cf40c..b47135a8d634 100644 --- a/lib/llm/src/protocols/openai/chat_completions.rs +++ b/lib/llm/src/protocols/openai/chat_completions.rs @@ -130,7 +130,12 @@ pub struct NvCreateChatCompletionRequest { pub return_tokens_as_token_ids: Option, /// Catch-all for unsupported fields - checked during validation - #[serde(flatten, default, skip_serializing)] + #[serde( + flatten, + default, + skip_serializing, + deserialize_with = "validate::deserialize_extra_fields" + )] pub unsupported_fields: std::collections::HashMap, } diff --git a/lib/llm/src/protocols/openai/completions.rs b/lib/llm/src/protocols/openai/completions.rs index d27c824f05f9..7b67e690d2c1 100644 --- a/lib/llm/src/protocols/openai/completions.rs +++ b/lib/llm/src/protocols/openai/completions.rs @@ -50,7 +50,12 @@ pub struct NvCreateCompletionRequest { pub return_tokens_as_token_ids: Option, /// Catch-all for unsupported fields - checked during validation - #[serde(flatten, default, skip_serializing)] + #[serde( + flatten, + default, + skip_serializing, + deserialize_with = "validate::deserialize_extra_fields" + )] pub unsupported_fields: std::collections::HashMap, } diff --git a/lib/llm/src/protocols/openai/validate.rs b/lib/llm/src/protocols/openai/validate.rs index c96473435e0b..d17940ddf52e 100644 --- a/lib/llm/src/protocols/openai/validate.rs +++ b/lib/llm/src/protocols/openai/validate.rs @@ -116,6 +116,22 @@ pub const PASSTHROUGH_EXTRA_FIELDS: &[&str] = &[ "logprob_token_ids", ]; +/// Treat null passthrough fields as omitted while preserving unknown fields for validation. +pub(super) fn deserialize_extra_fields<'de, D>( + deserializer: D, +) -> Result, D::Error> +where + D: serde::Deserializer<'de>, +{ + use serde::Deserialize; + + let mut fields = + std::collections::HashMap::::deserialize(deserializer)?; + fields + .retain(|key, value| !value.is_null() || !PASSTHROUGH_EXTRA_FIELDS.contains(&key.as_str())); + Ok(fields) +} + static IGNORE_OPENAI_FE_UNSUPPORTED_FIELDS: LazyLock = LazyLock::new(|| env_is_truthy(DYN_IGNORE_OPENAI_FE_UNSUPPORTED_FIELDS)); @@ -1072,6 +1088,88 @@ mod tests { assert!(err.to_string().contains("schema` is required")); } + #[test] + fn null_passthrough_fields_are_omitted_from_chat_and_completion_requests() { + use crate::engines::ValidateRequest; + use crate::protocols::common::extensions::request_cache_salt; + use crate::protocols::openai::{ + OpenAIStopConditionsProvider, chat_completions::NvCreateChatCompletionRequest, + completions::NvCreateCompletionRequest, + }; + + let mut payload = json!({"model": "test-model"}); + for field in PASSTHROUGH_EXTRA_FIELDS { + payload[field] = serde_json::Value::Null; + } + + let mut chat_payload = payload.clone(); + chat_payload["messages"] = json!([{"role": "user", "content": "hello"}]); + let chat: NvCreateChatCompletionRequest = serde_json::from_value(chat_payload).unwrap(); + ValidateRequest::validate(&chat).unwrap(); + assert!(chat.unsupported_fields.is_empty()); + assert_eq!(chat.get_stop_token_ids(), None); + assert_eq!(request_cache_salt(&chat), None); + + payload["prompt"] = json!("hello"); + let completion: NvCreateCompletionRequest = serde_json::from_value(payload).unwrap(); + ValidateRequest::validate(&completion).unwrap(); + assert!(completion.unsupported_fields.is_empty()); + assert_eq!(completion.get_stop_token_ids(), None); + assert_eq!(request_cache_salt(&completion), None); + + let unknown_null: NvCreateChatCompletionRequest = serde_json::from_value(json!({ + "model": "test-model", + "messages": [{"role": "user", "content": "hello"}], + "experimental_field": null, + })) + .unwrap(); + assert_eq!( + unknown_null.unsupported_fields.get("experimental_field"), + Some(&serde_json::Value::Null) + ); + let err = ValidateRequest::validate(&unknown_null).unwrap_err(); + assert!(err.to_string().contains("experimental_field")); + } + + #[test] + fn extra_field_deserialization_preserves_non_null_values() { + #[derive(serde::Deserialize)] + struct ExtraFields { + #[serde(flatten, deserialize_with = "deserialize_extra_fields")] + fields: HashMap, + } + + let fields: ExtraFields = serde_json::from_value(json!({ + "cache_salt": "tenant", + "stop_token_ids": [], + "detokenize": false, + "allowed_token_ids": [1], + "bad_words_token_ids": [[2]], + "logprob_token_ids": [3], + })) + .unwrap(); + validate_no_unsupported_fields_with_ignore(&fields.fields, false).unwrap(); + assert_eq!(fields.fields.len(), PASSTHROUGH_EXTRA_FIELDS.len()); + assert_eq!(fields.fields["detokenize"], json!(false)); + assert_eq!(fields.fields["stop_token_ids"], json!([])); + + for (field, bad) in [ + ("cache_salt", json!(7)), + ("stop_token_ids", json!([null])), + ("detokenize", json!(0)), + ("allowed_token_ids", json!([-1])), + ("bad_words_token_ids", json!([1])), + ("logprob_token_ids", json!(["1"])), + ("experimental_field", json!({"nested": null})), + ] { + let fields: ExtraFields = serde_json::from_value(json!({field: bad})).unwrap(); + assert_eq!(fields.fields[field], bad); + let err = + validate_no_unsupported_fields_with_ignore(&fields.fields, false).unwrap_err(); + assert!(err.to_string().contains(field), "{err}"); + } + } + #[test] fn validate_no_unsupported_fields_accepts_logprob_token_ids() { let fields = HashMap::from([("logprob_token_ids".to_string(), json!([14, 15]))]); From 517572309e761a3b246690f26de2630cafc392a1 Mon Sep 17 00:00:00 2001 From: Thomas Montfort <61255722+tmonty12@users.noreply.github.com> Date: Tue, 22 Sep 2026 21:34:07 -0700 Subject: [PATCH 170/191] fix(runtime): publish topology policy from Rust workers (#14909) Signed-off-by: Thomas Montfort --- Cargo.lock | 1 + .../common/utils/tests/test_topology.py | 29 ++ .../src/dynamo/common/utils/topology.py | 26 +- lib/backend-common/Cargo.toml | 1 + lib/backend-common/src/lib.rs | 1 + lib/backend-common/src/topology.rs | 377 ++++++++++++++++++ lib/backend-common/src/worker.rs | 4 +- lib/llm/src/local_model/runtime_config.rs | 36 ++ 8 files changed, 467 insertions(+), 8 deletions(-) create mode 100644 lib/backend-common/src/topology.rs diff --git a/Cargo.lock b/Cargo.lock index ac0aefa5a2ab..156efa82cfaf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2411,6 +2411,7 @@ dependencies = [ "serde_json", "serial_test", "temp-env", + "tempfile", "tokio", "tokio-util", "tracing", diff --git a/components/src/dynamo/common/utils/tests/test_topology.py b/components/src/dynamo/common/utils/tests/test_topology.py index 8ae100b2375b..7d3fb27fc69f 100644 --- a/components/src/dynamo/common/utils/tests/test_topology.py +++ b/components/src/dynamo/common/utils/tests/test_topology.py @@ -114,6 +114,35 @@ def test_returns_empty_when_enabled_empty_string(self, monkeypatch): config = read_topology_config() assert not config.enabled + def test_alt_truthy_values_enable_topology(self, monkeypatch, tmp_path): + """parse_bool accepts '1', 'on', 'yes' as truthy; they enable topology like 'true'.""" + topology_dir = tmp_path / "topology" + topology_dir.mkdir() + (topology_dir / "zone").write_text("us-east-1a") + for value in ("1", "on", "yes"): + _enable_topology(monkeypatch, topology_dir) + monkeypatch.setenv("DYN_TOPOLOGY_ENABLED", value) + config = read_topology_config() + assert ( + config.enabled + ), f"expected enabled for DYN_TOPOLOGY_ENABLED={value!r}" + + def test_invalid_values_disable_with_warning(self, monkeypatch, caplog): + """Unrecognized values disable topology and log a warning instead of raising.""" + import logging + + for value in ("maybe", "2", "enabled", "truthy"): + monkeypatch.setenv("DYN_TOPOLOGY_ENABLED", value) + with caplog.at_level(logging.WARNING): + config = read_topology_config() + assert ( + not config.enabled + ), f"expected disabled for DYN_TOPOLOGY_ENABLED={value!r}" + assert any( + "DYN_TOPOLOGY_ENABLED" in r.message for r in caplog.records + ), f"expected warning for DYN_TOPOLOGY_ENABLED={value!r}" + caplog.clear() + def test_reads_all_non_hidden_topology_files(self, monkeypatch, tmp_path): """Reads every visible, non-empty file under the topology mount.""" topology_dir = tmp_path / "topology" diff --git a/components/src/dynamo/common/utils/topology.py b/components/src/dynamo/common/utils/topology.py index fb8590a9b378..112dbf60de12 100644 --- a/components/src/dynamo/common/utils/topology.py +++ b/components/src/dynamo/common/utils/topology.py @@ -10,7 +10,7 @@ derives canonical topology taints from the published topology domains. Environment variables: - DYN_TOPOLOGY_ENABLED: Set to "true" to enable topology reading. + DYN_TOPOLOGY_ENABLED: Set to a truthy value (true/1/on/yes) to enable; any other non-empty value is logged and ignored. DYN_TOPOLOGY_MOUNT_PATH: Directory containing topology domain files (default: /etc/dynamo/topology). DYN_KV_TRANSFER_DOMAIN: Which topology domain the router should enforce @@ -22,6 +22,7 @@ enforcement is "preferred". """ +import argparse import logging import os import sys @@ -29,6 +30,8 @@ from dataclasses import dataclass, field from pathlib import Path +from dynamo.common.configuration.utils import parse_bool + _TOPOLOGY_ENABLED_VAR = "DYN_TOPOLOGY_ENABLED" _TOPOLOGY_MOUNT_PATH_VAR = "DYN_TOPOLOGY_MOUNT_PATH" _KV_TRANSFER_DOMAIN_VAR = "DYN_KV_TRANSFER_DOMAIN" @@ -100,7 +103,7 @@ def _read_kv_transfer_policy() -> tuple[str, str | None, float | None]: if not kv_transfer_domain: logger.error( - "DYN_TOPOLOGY_ENABLED=true but %s is not set. The deployment " + "DYN_TOPOLOGY_ENABLED is set but %s is not set. The deployment " "environment must set the KV transfer domain when topology is " "enabled. Exiting.", _KV_TRANSFER_DOMAIN_VAR, @@ -119,7 +122,7 @@ def read_topology_config( The deployment environment injects env vars for topology location and transfer policy: - - DYN_TOPOLOGY_ENABLED=true + - DYN_TOPOLOGY_ENABLED=true # any truthy value (true/1/on/yes) enables - DYN_TOPOLOGY_MOUNT_PATH=/etc/dynamo/topology - DYN_KV_TRANSFER_DOMAIN=zone - DYN_KV_TRANSFER_ENFORCEMENT=required @@ -138,12 +141,21 @@ def read_topology_config( Empty config if topology is not enabled. Raises: - SystemExit: If DYN_TOPOLOGY_ENABLED=true but DYN_KV_TRANSFER_DOMAIN is + SystemExit: If DYN_TOPOLOGY_ENABLED is set but DYN_KV_TRANSFER_DOMAIN is not set, the transfer-domain topology file is still missing or empty after the timeout. """ - enabled = os.environ.get(_TOPOLOGY_ENABLED_VAR, "").strip().lower() - if enabled != "true": + raw = os.environ.get(_TOPOLOGY_ENABLED_VAR, "").strip() + try: + enabled = parse_bool(raw) + except argparse.ArgumentTypeError: + if raw: + logger.warning( + "Unrecognized DYN_TOPOLOGY_ENABLED=%r, treating as disabled; use 'true'/'false' (or 1/0, on/off, yes/no)", + raw, + ) + return TopologyConfig() + if not enabled: return TopologyConfig() ( @@ -173,7 +185,7 @@ def read_topology_config( if kv_transfer_domain not in topology_domains: logger.error( - "DYN_TOPOLOGY_ENABLED=true but topology file %s was not populated " + "DYN_TOPOLOGY_ENABLED is set but topology file %s was not populated " "within %.0fs. This indicates the configured topology source did " "not publish the selected transfer domain. Exiting.", transfer_domain_file, diff --git a/lib/backend-common/Cargo.toml b/lib/backend-common/Cargo.toml index d5d0b0793dfd..a6df3ccd7873 100644 --- a/lib/backend-common/Cargo.toml +++ b/lib/backend-common/Cargo.toml @@ -46,5 +46,6 @@ tracing-opentelemetry = { workspace = true } reqwest = { workspace = true } serde_json = { workspace = true } serial_test = "3" +tempfile = { workspace = true } temp-env = { version = "0.3.6", features = ["async_closure"] } tracing-subscriber = { workspace = true } diff --git a/lib/backend-common/src/lib.rs b/lib/backend-common/src/lib.rs index 5e3b9180a0f0..197b80e4fff0 100644 --- a/lib/backend-common/src/lib.rs +++ b/lib/backend-common/src/lib.rs @@ -25,6 +25,7 @@ pub mod snapshot_publisher; pub mod telemetry; #[cfg(any(test, feature = "testing"))] pub mod testing; +mod topology; #[cfg(debug_assertions)] mod validate; pub mod worker; diff --git a/lib/backend-common/src/topology.rs b/lib/backend-common/src/topology.rs new file mode 100644 index 000000000000..57940c0278ac --- /dev/null +++ b/lib/backend-common/src/topology.rs @@ -0,0 +1,377 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! File-backed worker topology, matching `dynamo.common.utils.topology`. + +use std::collections::HashMap; +use std::path::{Path, PathBuf}; +use std::time::Duration; + +use dynamo_llm::kv_router::protocols::KvTransferEnforcement; +use dynamo_llm::local_model::runtime_config::ModelRuntimeConfig; +use tokio::time::Instant; + +use dynamo_runtime::config::parse_bool; + +use crate::error::{BackendError, DynamoError, ErrorType}; + +const DEFAULT_MOUNT_PATH: &str = "/etc/dynamo/topology"; +const POLL_INTERVAL: Duration = Duration::from_secs(1); +const POLL_TIMEOUT: Duration = Duration::from_secs(30); + +/// Load deployment-provided topology before publishing the worker's model card. +/// Disabled topology leaves the runtime config untouched. Enabled topology must +/// resolve the selected transfer domain within the startup polling deadline. +pub(crate) async fn apply_topology_config( + runtime_config: &mut ModelRuntimeConfig, +) -> Result<(), DynamoError> { + apply_from_env( + runtime_config, + |name| std::env::var(name).ok(), + POLL_INTERVAL, + POLL_TIMEOUT, + ) + .await +} + +async fn apply_from_env( + runtime_config: &mut ModelRuntimeConfig, + env: impl Fn(&str) -> Option, + poll_interval: Duration, + poll_timeout: Duration, +) -> Result<(), DynamoError> { + let raw = env("DYN_TOPOLOGY_ENABLED").unwrap_or_default(); + let trimmed = raw.trim(); + match parse_bool(trimmed) { + Ok(true) => {} + Ok(false) => return Ok(()), + Err(_) => { + if !trimmed.is_empty() { + tracing::warn!( + value = %trimmed, + "Unrecognized DYN_TOPOLOGY_ENABLED value, treating as disabled; use \"true\"/\"false\" (or 1/0, on/off, yes/no)" + ); + } + return Ok(()); + } + } + + let domain = env("DYN_KV_TRANSFER_DOMAIN") + .map(|value| value.trim().to_owned()) + .filter(|value| !value.is_empty()) + .ok_or_else(|| { + invalid_config("DYN_TOPOLOGY_ENABLED is set but DYN_KV_TRANSFER_DOMAIN is not") + })?; + let enforcement = match env("DYN_KV_TRANSFER_ENFORCEMENT").as_deref() { + None | Some("required") => KvTransferEnforcement::Required, + Some("preferred") => KvTransferEnforcement::Preferred, + Some(value) => { + return Err(invalid_config(format!( + "DYN_KV_TRANSFER_ENFORCEMENT must be required or preferred, got {value:?}" + ))); + } + }; + let preferred_weight = env("DYN_KV_TRANSFER_PREFERRED_WEIGHT") + .filter(|value| !value.is_empty()) + .map(|value| { + value.trim().parse::().map_err(|error| { + invalid_config(format!("invalid DYN_KV_TRANSFER_PREFERRED_WEIGHT: {error}")) + }) + }) + .transpose()?; + let mount_path = PathBuf::from( + env("DYN_TOPOLOGY_MOUNT_PATH").unwrap_or_else(|| DEFAULT_MOUNT_PATH.to_owned()), + ); + + // Pod labels may be projected after the worker starts. Do not register a + // policy-less worker while waiting for the selected domain to appear. + let deadline = Instant::now() + poll_timeout; + let topology_domains = loop { + let domains = read_topology_domains(&mount_path).await; + if domains.contains_key(&domain) { + break domains; + } + let remaining = deadline.saturating_duration_since(Instant::now()); + if remaining.is_zero() { + return Err(invalid_config(format!( + "topology domain {domain:?} in {} was not populated within {poll_timeout:?}", + mount_path.display() + ))); + } + tracing::info!(%domain, path = %mount_path.display(), ?remaining, "Waiting for topology domain"); + tokio::time::sleep(poll_interval.min(remaining)).await; + }; + + runtime_config.topology_domains = topology_domains; + runtime_config.kv_transfer_domain = Some(domain); + runtime_config.kv_transfer_enforcement = Some(enforcement); + runtime_config.kv_transfer_preferred_weight = preferred_weight; + tracing::info!( + domains = ?runtime_config.topology_domains, + domain = ?runtime_config.kv_transfer_domain, + ?enforcement, + ?preferred_weight, + "Loaded worker topology" + ); + Ok(()) +} + +async fn read_topology_domains(mount_path: &Path) -> HashMap { + let mut domains = HashMap::new(); + let mut entries = match tokio::fs::read_dir(mount_path).await { + Ok(entries) => entries, + Err(error) => { + if error.kind() != std::io::ErrorKind::NotFound { + tracing::warn!(path = %mount_path.display(), %error, "Unable to list topology directory"); + } + return domains; + } + }; + loop { + let entry = match entries.next_entry().await { + Ok(Some(entry)) => entry, + Ok(None) => break, + Err(error) => { + tracing::warn!(path = %mount_path.display(), %error, "Unable to list topology entry"); + // Discard the partial scan so the bounded outer poll retries + // the directory, even if the transfer domain was already read. + return HashMap::new(); + } + }; + let name = entry.file_name(); + let Some(name) = name.to_str().filter(|name| !name.starts_with('.')) else { + continue; + }; + // Follow symlinks: Downward API files point through the hidden ..data + // directory, which itself must not become a published topology domain. + let path = entry.path(); + match tokio::fs::metadata(&path).await { + Ok(metadata) if metadata.is_file() => {} + Ok(_) => continue, + Err(error) => { + if error.kind() != std::io::ErrorKind::NotFound { + tracing::warn!(path = %path.display(), %error, "Unable to inspect topology file"); + } + continue; + } + } + match tokio::fs::read_to_string(&path).await { + Ok(value) if !value.trim().is_empty() => { + domains.insert(name.to_owned(), value.trim().to_owned()); + } + Ok(_) => {} + Err(error) => { + if error.kind() != std::io::ErrorKind::NotFound { + tracing::warn!(path = %path.display(), %error, "Unable to read topology file"); + } + } + } + } + domains +} + +fn invalid_config(message: impl Into) -> DynamoError { + DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::InvalidArgument)) + .message(message.into()) + .build() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn reads_projected_domains_and_required_or_preferred_policy() { + let dir = tempfile::tempdir().unwrap(); + let data = dir.path().join("..data"); + std::fs::create_dir(&data).unwrap(); + std::fs::write(data.join("zone"), " zone-a\n").unwrap(); + std::os::unix::fs::symlink("..data/zone", dir.path().join("zone")).unwrap(); + std::fs::write(dir.path().join("Rack"), "rack-1").unwrap(); + std::fs::write(dir.path().join("empty"), " \n").unwrap(); + std::fs::write(dir.path().join(".hidden"), "ignored").unwrap(); + std::fs::create_dir(dir.path().join("nested")).unwrap(); + for (enforcement, weight, expected) in [ + (None, None, KvTransferEnforcement::Required), + (Some("required"), None, KvTransferEnforcement::Required), + ( + Some("preferred"), + Some("0.85"), + KvTransferEnforcement::Preferred, + ), + ] { + let mut config = ModelRuntimeConfig::default(); + apply_from_env( + &mut config, + |name| match name { + "DYN_TOPOLOGY_ENABLED" => Some(" TRUE ".into()), + "DYN_TOPOLOGY_MOUNT_PATH" => Some(dir.path().display().to_string()), + "DYN_KV_TRANSFER_DOMAIN" => Some(" zone ".into()), + "DYN_KV_TRANSFER_ENFORCEMENT" => enforcement.map(str::to_owned), + "DYN_KV_TRANSFER_PREFERRED_WEIGHT" => weight.map(str::to_owned), + _ => None, + }, + POLL_INTERVAL, + POLL_TIMEOUT, + ) + .await + .unwrap(); + assert_eq!( + config.topology_domains, + HashMap::from([ + ("zone".into(), "zone-a".into()), + ("Rack".into(), "rack-1".into()) + ]) + ); + assert_eq!(config.kv_transfer_domain.as_deref(), Some("zone")); + assert_eq!(config.kv_transfer_enforcement, Some(expected)); + assert_eq!( + config.kv_transfer_preferred_weight, + weight.map(|v| v.parse::().unwrap()) + ); + } + } + + #[tokio::test] + async fn waits_for_delayed_projection() { + let dir = tempfile::tempdir().unwrap(); + let path = dir.path().join("topology"); + let mut config = ModelRuntimeConfig::default(); + let load = apply_from_env( + &mut config, + |name| match name { + "DYN_TOPOLOGY_ENABLED" => Some("true".into()), + "DYN_TOPOLOGY_MOUNT_PATH" => Some(path.display().to_string()), + "DYN_KV_TRANSFER_DOMAIN" => Some("zone".into()), + _ => None, + }, + Duration::from_millis(5), + Duration::from_secs(2), + ); + let publish = async { + tokio::time::sleep(Duration::from_millis(20)).await; + tokio::fs::create_dir(&path).await.unwrap(); + tokio::fs::write(path.join("zone"), "zone-a").await.unwrap(); + }; + let (result, ()) = tokio::join!(load, publish); + result.unwrap(); + assert_eq!(config.topology_domains["zone"], "zone-a"); + } + + #[tokio::test] + async fn missing_or_empty_transfer_domain_times_out() { + for contents in [None, Some(""), Some(" \n")] { + let dir = tempfile::tempdir().unwrap(); + if let Some(contents) = contents { + std::fs::write(dir.path().join("zone"), contents).unwrap(); + } + std::fs::write(dir.path().join("rack"), "rack-1").unwrap(); + let mut config = ModelRuntimeConfig::default(); + let error = apply_from_env( + &mut config, + |name| match name { + "DYN_TOPOLOGY_ENABLED" => Some("true".into()), + "DYN_TOPOLOGY_MOUNT_PATH" => Some(dir.path().display().to_string()), + "DYN_KV_TRANSFER_DOMAIN" => Some("zone".into()), + _ => None, + }, + Duration::from_millis(5), + Duration::from_millis(20), + ) + .await + .unwrap_err(); + assert!(error.to_string().contains("was not populated")); + assert_eq!( + error.error_type(), + ErrorType::Backend(BackendError::InvalidArgument) + ); + assert!(config.topology_domains.is_empty()); + } + } + + #[tokio::test] + async fn alt_truthy_values_enable_topology() { + // parse_bool accepts "1", "on", "yes" as truthy in addition to "true". + // Verify that the wider set enables topology so coverage tracks the helper. + let dir = tempfile::tempdir().unwrap(); + std::fs::write(dir.path().join("zone"), "zone-a").unwrap(); + for value in ["1", "on", "yes"] { + let mut config = ModelRuntimeConfig::default(); + apply_from_env( + &mut config, + |name| match name { + "DYN_TOPOLOGY_ENABLED" => Some(value.into()), + "DYN_TOPOLOGY_MOUNT_PATH" => Some(dir.path().display().to_string()), + "DYN_KV_TRANSFER_DOMAIN" => Some("zone".into()), + _ => None, + }, + POLL_INTERVAL, + POLL_TIMEOUT, + ) + .await + .unwrap_or_else(|e| panic!("alt truthy {value:?} must enable topology: {e}")); + assert!( + !config.topology_domains.is_empty(), + "expected topology enabled for DYN_TOPOLOGY_ENABLED={value:?}" + ); + } + } + + #[tokio::test] + async fn invalid_enabled_values_disable_and_warn() { + // Unrecognized values ("maybe", "2") must not crash the worker; + // they disable topology (Ok(()) with empty domains). + // Warning log coverage lives in the Python caplog test. + for value in ["maybe", "2", "enabled", "truthy"] { + let mut config = ModelRuntimeConfig::default(); + apply_from_env( + &mut config, + |name| match name { + "DYN_TOPOLOGY_ENABLED" => Some(value.into()), + _ => None, + }, + POLL_INTERVAL, + POLL_TIMEOUT, + ) + .await + .expect("invalid enabled value must not error"); + assert!( + config.topology_domains.is_empty(), + "expected topology disabled for DYN_TOPOLOGY_ENABLED={value:?}" + ); + } + } + + #[tokio::test] + async fn rejects_invalid_topology_env() { + let dir = tempfile::tempdir().unwrap(); + std::fs::write(dir.path().join("zone"), "zone-a").unwrap(); + for (domain, enforcement, weight) in [ + (None, None, None), + (Some(" "), None, None), + (Some("zone"), Some("fallback"), None), + (Some("zone"), Some("preferred"), Some("heavy")), + ] { + let error = apply_from_env( + &mut ModelRuntimeConfig::default(), + |name| match name { + "DYN_TOPOLOGY_ENABLED" => Some("true".into()), + "DYN_TOPOLOGY_MOUNT_PATH" => Some(dir.path().display().to_string()), + "DYN_KV_TRANSFER_DOMAIN" => domain.map(str::to_owned), + "DYN_KV_TRANSFER_ENFORCEMENT" => enforcement.map(str::to_owned), + "DYN_KV_TRANSFER_PREFERRED_WEIGHT" => weight.map(str::to_owned), + _ => None, + }, + POLL_INTERVAL, + Duration::ZERO, + ) + .await + .expect_err("invalid environment must fail parsing"); + assert_eq!( + error.error_type(), + ErrorType::Backend(BackendError::InvalidArgument) + ); + } + } +} diff --git a/lib/backend-common/src/worker.rs b/lib/backend-common/src/worker.rs index 97f37a2a6f20..4534c5909e2d 100644 --- a/lib/backend-common/src/worker.rs +++ b/lib/backend-common/src/worker.rs @@ -2128,7 +2128,7 @@ async fn build_local_model( ); } - let rt_cfg = ModelRuntimeConfig { + let mut rt_cfg = ModelRuntimeConfig { context_length: llm.context_length, total_kv_blocks: llm.total_kv_blocks, max_num_seqs: llm.max_num_seqs, @@ -2150,6 +2150,8 @@ async fn build_local_model( ..ModelRuntimeConfig::default() }; + crate::topology::apply_topology_config(&mut rt_cfg).await?; + let mut builder = LocalModelBuilder::default(); builder .model_name(served_name) diff --git a/lib/llm/src/local_model/runtime_config.rs b/lib/llm/src/local_model/runtime_config.rs index 5bf98898ebeb..3b92479925a9 100644 --- a/lib/llm/src/local_model/runtime_config.rs +++ b/lib/llm/src/local_model/runtime_config.rs @@ -624,6 +624,18 @@ fn validate_model_runtime_config(config: &ModelRuntimeConfig) -> Result<(), Vali )); } + // Range validation alone accepts NaN. Enforce finite routing weights + // here so every configuration source receives the same validation. + if config + .kv_transfer_preferred_weight + .is_some_and(|weight| !weight.is_finite()) + { + return Err(validation_error( + "invalid_kv_transfer_preferred_weight", + "kv_transfer_preferred_weight must be finite", + )); + } + if config.kv_transfer_preferred_weight.is_some() && !matches!( config.kv_transfer_enforcement, @@ -1285,6 +1297,13 @@ mod tests { #[test] fn test_validate_config_rejects_invalid_topology_components() { for config in [ + ModelRuntimeConfig { + topology_domains: HashMap::from([( + "zone".to_string(), + "invalid=value".to_string(), + )]), + ..Default::default() + }, ModelRuntimeConfig { topology_domains: HashMap::from([("".to_string(), "us-east-1a".to_string())]), ..Default::default() @@ -1301,6 +1320,23 @@ mod tests { } } + #[test] + fn test_validate_config_rejects_invalid_kv_transfer_weights() { + for weight in [f32::NAN, f32::INFINITY, f32::NEG_INFINITY, -0.1, 1.1] { + let config = ModelRuntimeConfig { + topology_domains: HashMap::from([("zone".to_string(), "zone-a".to_string())]), + kv_transfer_domain: Some("zone".to_string()), + kv_transfer_enforcement: Some(KvTransferEnforcement::Preferred), + kv_transfer_preferred_weight: Some(weight), + ..Default::default() + }; + assert!( + config.validate_config().is_err(), + "invalid preferred weight {weight} must be rejected" + ); + } + } + #[test] fn test_validate_config_rejects_transfer_domain_mismatch() { let config = ModelRuntimeConfig { From ff3ac59e83c73e03b98a5d0ec192ec28847130f7 Mon Sep 17 00:00:00 2001 From: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> Date: Wed, 23 Sep 2026 12:20:43 +0000 Subject: [PATCH 171/191] docs: refresh community events Automated refresh from the public Dynamo Google Calendar. Generated by .github/workflows/community-events-refresh.yml. Signed-off-by: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> --- docs/fern/components/events.generated.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fern/components/events.generated.ts b/docs/fern/components/events.generated.ts index a94bd56c5780..f0b84252e428 100644 --- a/docs/fern/components/events.generated.ts +++ b/docs/fern/components/events.generated.ts @@ -22,7 +22,7 @@ export interface DynamoEvent { } /** Generation date in Pacific, YYYY-MM-DD. The calendar grid treats this as "today". */ -export const GENERATED_ON = "2026-09-22"; +export const GENERATED_ON = "2026-09-23"; export const UPCOMING_EVENTS: DynamoEvent[] = []; From 80ae00240cb9c22394e03c2c56529e0991261221 Mon Sep 17 00:00:00 2001 From: Xianlu Bird Date: Wed, 23 Sep 2026 23:29:06 +0800 Subject: [PATCH 172/191] perf(frontend): avoid JSON round-trip for chunk metrics (#15115) Signed-off-by: xianlubird --- .../src/dynamo/frontend/sglang_processor.py | 8 +++- .../test_sglang_processor_metrics_unit.py | 46 ++++++++++++++----- .../tests/test_vllm_processor_unit.py | 19 ++++---- .../src/dynamo/frontend/vllm_processor.py | 8 +++- lib/llm/src/http/service/metrics.rs | 12 +++++ .../src/protocols/openai/chat_completions.rs | 2 +- 6 files changed, 68 insertions(+), 27 deletions(-) diff --git a/components/src/dynamo/frontend/sglang_processor.py b/components/src/dynamo/frontend/sglang_processor.py index f464fd30ffb7..ae534784615f 100644 --- a/components/src/dynamo/frontend/sglang_processor.py +++ b/components/src/dynamo/frontend/sglang_processor.py @@ -849,8 +849,12 @@ def flush_pending( cached_tokens = _cached_tokens_from_usage(usage_for_metrics) if cached_tokens is not None: metrics["cached_tokens"] = cached_tokens - envelope["event"] = "llm_metrics" - envelope["comment"] = [json.dumps(metrics)] + # Attach metrics to data when available; otherwise use an annotation. + if data := envelope.get("data"): + data["llm_metrics"] = metrics + else: + envelope["event"] = "llm_metrics" + envelope["comment"] = [json.dumps(metrics)] pending_token_ids = [] pending_log_probs = None diff --git a/components/src/dynamo/frontend/tests/test_sglang_processor_metrics_unit.py b/components/src/dynamo/frontend/tests/test_sglang_processor_metrics_unit.py index 2ea8e6dcd4a5..9b71534e07cd 100644 --- a/components/src/dynamo/frontend/tests/test_sglang_processor_metrics_unit.py +++ b/components/src/dynamo/frontend/tests/test_sglang_processor_metrics_unit.py @@ -5,7 +5,6 @@ import asyncio import importlib -import json import sys import types @@ -114,6 +113,11 @@ class _ReasoningParser: get_json_schema_constraint=lambda *args, **kwargs: None, ) _install_module(install_module, "sglang.srt.parser") + _install_module( + install_module, + "sglang.srt.parser.conversation", + chat_template_exists=lambda *_args, **_kwargs: False, + ) _install_module( install_module, "sglang.srt.parser.jinja_template_utils", @@ -150,6 +154,27 @@ def _load_processor_module(module_stubs): install_module, remove_module = module_stubs _install_sglang_stubs(install_module) _install_module(install_module, "dynamo._internal", ModelDeploymentCard=object) + _install_module(install_module, "dynamo.common.multimodal") + _install_module( + install_module, + "dynamo.common.multimodal.cache_uuid", + reject_unsupported_multimodal_uuids=lambda *_args, **_kwargs: None, + ) + _install_module( + install_module, + "dynamo.frontend.sglang_prepost", + ReasoningParser=object, + SglangStreamingPostProcessor=object, + ToolCallParserType=object, + _client_wants_separate_reasoning=lambda *_args, **_kwargs: False, + _get_history_tool_calls_count=lambda *_args, **_kwargs: 0, + _guided_tool_choice_requires_reasoning=lambda *_args, **_kwargs: False, + convert_tools=lambda *_args, **_kwargs: None, + create_parsers=lambda *_args, **_kwargs: (None, None), + detect_force_reasoning_from_template=lambda *_args, **_kwargs: False, + preprocess_chat_request=lambda *_args, **_kwargs: None, + resolve_skip_special_tokens=lambda *_args, **_kwargs: True, + ) _install_module( install_module, "dynamo.frontend.frontend_args", @@ -165,6 +190,7 @@ def _load_processor_module(module_stubs): _install_module( install_module, "dynamo.llm.exceptions", + HttpError=type("HttpError", (Exception,), {}), InvalidArgument=type("InvalidArgument", (Exception,), {}), Unknown=type("Unknown", (Exception,), {}), ) @@ -172,7 +198,7 @@ def _load_processor_module(module_stubs): return importlib.import_module("dynamo.frontend.sglang_processor") -def test_stream_emits_llm_metrics_annotation(module_stubs): +def test_stream_embeds_typed_llm_metrics(module_stubs): module = _load_processor_module(module_stubs) completion_usage = { "prompt_tokens": 10, @@ -209,15 +235,14 @@ async def collect(): ] items = asyncio.run(collect()) - metric_items = [item for item in items if item.get("event") == "llm_metrics"] - - assert len(metric_items) == 1 - envelope = metric_items[0] + assert len(items) == 1 + envelope = items[0] assert envelope["_dynamo_annotated"] is True assert envelope["data"]["usage"] == completion_usage - metrics = json.loads(envelope["comment"][0]) + assert "event" not in envelope + assert "comment" not in envelope # Zero counts are omitted (text-only request), mirroring the Rust skip-zero behavior. - assert metrics == { + assert envelope["data"]["llm_metrics"] == { "input_tokens": 10, "output_tokens": 3, "chunk_tokens": 3, @@ -278,9 +303,8 @@ async def collect(): ] items = asyncio.run(collect()) - metric_items = [item for item in items if item.get("event") == "llm_metrics"] - assert len(metric_items) == 1 - metrics = json.loads(metric_items[0]["comment"][0]) + assert len(items) == 1 + metrics = items[0]["data"]["llm_metrics"] assert metrics["image_count"] == 2 assert metrics["video_count"] == 1 # audio has zero parts, so the key is omitted from the emitted metrics. diff --git a/components/src/dynamo/frontend/tests/test_vllm_processor_unit.py b/components/src/dynamo/frontend/tests/test_vllm_processor_unit.py index 86593101f705..7dcbf4433c77 100644 --- a/components/src/dynamo/frontend/tests/test_vllm_processor_unit.py +++ b/components/src/dynamo/frontend/tests/test_vllm_processor_unit.py @@ -1686,8 +1686,6 @@ async def test_routed_stream_produces_openai_chunks(self, vllm_processor_module) chunks = await _run_generate(processor, _base_preproc()) - # One annotated envelope per iteration carries both data and the - # llm_metrics annotation; observer strips the annotation before SSE. assert len(chunks) == 1 envelope = chunks[0] @@ -1704,16 +1702,15 @@ async def test_routed_stream_produces_openai_chunks(self, vllm_processor_module) "created": envelope["data"]["created"], "model": MODEL, "object": "chat.completion.chunk", + "llm_metrics": { + "input_tokens": 3, + "output_tokens": 1, + "chunk_tokens": 1, + }, } - assert envelope["event"] == "llm_metrics" - assert len(envelope["comment"]) == 1 - # Zero counts are omitted (text-only request), mirroring the Rust skip-zero behavior. - assert json.loads(envelope["comment"][0]) == { - "input_tokens": 3, - "output_tokens": 1, - "chunk_tokens": 1, - } + assert "event" not in envelope + assert "comment" not in envelope @pytest.mark.asyncio async def test_routed_stream_emits_multimodal_counts(self, vllm_processor_module): @@ -1757,7 +1754,7 @@ async def test_routed_stream_emits_multimodal_counts(self, vllm_processor_module ) ] - metrics = json.loads(chunks[0]["comment"][0]) + metrics = chunks[0]["data"]["llm_metrics"] assert metrics["image_count"] == 2 assert metrics["video_count"] == 1 # audio has zero parts, so the key is omitted from the emitted metrics. diff --git a/components/src/dynamo/frontend/vllm_processor.py b/components/src/dynamo/frontend/vllm_processor.py index e3f294b1706b..7dc94fa03e15 100644 --- a/components/src/dynamo/frontend/vllm_processor.py +++ b/components/src/dynamo/frontend/vllm_processor.py @@ -1104,8 +1104,12 @@ async def _generate_and_stream( metrics["video_count"] = video_count if audio_count: metrics["audio_count"] = audio_count - envelope["event"] = "llm_metrics" - envelope["comment"] = [json.dumps(metrics)] + # Attach metrics to data when available; otherwise use an annotation. + if data := envelope.get("data"): + data["llm_metrics"] = metrics + else: + envelope["event"] = "llm_metrics" + envelope["comment"] = [json.dumps(metrics)] yield envelope _nvtx.end_range(rng_stream) diff --git a/lib/llm/src/http/service/metrics.rs b/lib/llm/src/http/service/metrics.rs index 537a074375e5..98816d58d917 100644 --- a/lib/llm/src/http/service/metrics.rs +++ b/lib/llm/src/http/service/metrics.rs @@ -3917,6 +3917,18 @@ mod tests { assert_eq!(with_json, without_json); assert!(with_json.get("llm_metrics").is_none()); + + let mut inbound_json = without_json; + inbound_json["llm_metrics"] = serde_json::json!({ + "input_tokens": 1, + "output_tokens": 2, + "chunk_tokens": 1, + "cached_tokens": 1, + "image_tokens": 300 + }); + let inbound: NvCreateChatCompletionStreamResponse = + serde_json::from_value(inbound_json).unwrap(); + assert_eq!(inbound.llm_metrics, with_metrics.llm_metrics); } #[test] diff --git a/lib/llm/src/protocols/openai/chat_completions.rs b/lib/llm/src/protocols/openai/chat_completions.rs index b47135a8d634..147fca4c533b 100644 --- a/lib/llm/src/protocols/openai/chat_completions.rs +++ b/lib/llm/src/protocols/openai/chat_completions.rs @@ -292,7 +292,7 @@ pub struct NvCreateChatCompletionStreamResponse { pub nvext: Option, /// Internal frontend metrics payload. This must never be serialized to /// client-facing OpenAI-compatible streams. - #[serde(skip)] + #[serde(default, skip_serializing)] pub llm_metrics: Option, } From a2e7da381e88169113dfa3fbaf8b055e9a7e100b Mon Sep 17 00:00:00 2001 From: Xianlu Bird Date: Wed, 23 Sep 2026 23:36:25 +0800 Subject: [PATCH 173/191] ci: retry transient compliance export failures (#14694) Signed-off-by: xianlubird --- .github/actions/compliance-extract/action.yml | 10 +- .../compliance-extract/extract-with-retry.sh | 41 ++++++ .../test_extract_with_retry.py | 118 ++++++++++++++++++ .pre-commit-config.yaml | 6 + 4 files changed, 169 insertions(+), 6 deletions(-) create mode 100755 .github/actions/compliance-extract/extract-with-retry.sh create mode 100644 .github/actions/compliance-extract/test_extract_with_retry.py diff --git a/.github/actions/compliance-extract/action.yml b/.github/actions/compliance-extract/action.yml index b470a2fa6935..076deaf5420c 100644 --- a/.github/actions/compliance-extract/action.yml +++ b/.github/actions/compliance-extract/action.yml @@ -130,7 +130,6 @@ runs: GIT_SHA: ${{ inputs.git_sha }} EPP_IMAGE: ${{ inputs.epp_image }} run: | - mkdir -p /tmp/compliance # Reuse the warm cache the build just populated by matching ALL the # cache-key-affecting build-args the build passed. Otherwise the shared # stages rebuild here instead of cache-hitting: @@ -174,7 +173,8 @@ runs: # --build-arg (it would clear the ARG and reintroduce the failure). EPP_IMAGE_ARG="" [ -n "${EPP_IMAGE:-}" ] && EPP_IMAGE_ARG="--build-arg EPP_IMAGE=${EPP_IMAGE}" - docker buildx build \ + bash "${{ github.action_path }}/extract-with-retry.sh" /tmp/compliance \ + docker buildx build \ --builder ${{ inputs.builder_name }} \ --platform ${{ inputs.platform }} \ --target compliance_artifact \ @@ -183,7 +183,6 @@ runs: --build-arg SCCACHE_BUCKET="${SCCACHE_BUCKET}" \ --build-arg SCCACHE_REGION="${SCCACHE_REGION}" \ $EPP_IMAGE_ARG \ - --output type=local,dest=/tmp/compliance \ --progress=plain \ -f "${DOCKERFILE_PATH}" \ $SECRET_ARGS \ @@ -357,7 +356,6 @@ runs: GIT_SHA: ${{ inputs.git_sha }} EPP_IMAGE: ${{ inputs.epp_image }} run: | - mkdir -p /tmp/sources # ENABLE_SOURCE_ARCHIVAL=true to actually run sources_collect; the other # build-args match the build so this shares the warm cache (same reason # as the compliance_artifact extract above). Same IRSA secrets too, so a @@ -385,7 +383,8 @@ runs: # resolves the GC'd default staging tag. Empty for non-frontend targets. EPP_IMAGE_ARG="" [ -n "${EPP_IMAGE:-}" ] && EPP_IMAGE_ARG="--build-arg EPP_IMAGE=${EPP_IMAGE}" - docker buildx build \ + bash "${{ github.action_path }}/extract-with-retry.sh" /tmp/sources \ + docker buildx build \ --builder ${{ inputs.builder_name }} \ --platform ${{ inputs.platform }} \ --target sources_archive \ @@ -395,7 +394,6 @@ runs: --build-arg SCCACHE_REGION="${SCCACHE_REGION}" \ --build-arg ENABLE_SOURCE_ARCHIVAL=true \ $EPP_IMAGE_ARG \ - --output type=local,dest=/tmp/sources \ --progress=plain \ -f "${DOCKERFILE_PATH}" \ $SECRET_ARGS \ diff --git a/.github/actions/compliance-extract/extract-with-retry.sh b/.github/actions/compliance-extract/extract-with-retry.sh new file mode 100755 index 000000000000..4feed8b62576 --- /dev/null +++ b/.github/actions/compliance-extract/extract-with-retry.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Retry only transient BuildKit transport failures, preserving each attempt's log. +set -euo pipefail + +destination=$1 +shift +attempt_root=$(mktemp -d "${RUNNER_TEMP:-${TMPDIR:-/tmp}}/compliance-extract.XXXXXX") +echo "Compliance extraction logs: ${attempt_root}" + +for attempt in 1 2 3; do + output="${attempt_root}/output-${attempt}" + log="${attempt_root}/attempt-${attempt}.log" + mkdir -p "$output" + status=0 + "$@" --output "type=local,dest=${output}" 2>&1 | tee "$log" || status=$? + if [ "$status" -eq 0 ]; then + # Publish only a complete export; failed attempts never reach consumers. + rm -rf -- "$destination" + mv -- "$output" "$destination" + exit 0 + fi + rm -rf -- "$output" + + # Inspect the terminal build error, not earlier warnings or command output. + error=$(grep '^ERROR:' "$log" | tail -n 1 || true) + if printf '%s\n' "$error" | grep -Eiq \ + '(process .*did not complete successfully|401 Unauthorized|403 Forbidden|denied:|manifest unknown)'; then + exit "$status" + fi + if [ "$attempt" -eq 3 ] || ! printf '%s\n' "$error" | grep -Eiq \ + '(Unavailable:.*error reading from server: (unexpected )?EOF|connection reset by peer|transport is closing|unexpected status.*(502 Bad Gateway|503 Service Unavailable|504 Gateway Timeout))'; then + exit "$status" + fi + delay=10 + [ "$attempt" -eq 2 ] && delay=30 + echo "::warning::Compliance extraction attempt ${attempt}/3 failed with a transient transport error; retrying in ${delay}s" + sleep "$delay" +done diff --git a/.github/actions/compliance-extract/test_extract_with_retry.py b/.github/actions/compliance-extract/test_extract_with_retry.py new file mode 100644 index 000000000000..616ae9342061 --- /dev/null +++ b/.github/actions/compliance-extract/test_extract_with_retry.py @@ -0,0 +1,118 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Exercise the real retry wrapper with a fake BuildKit command and sleep.""" + +import os +import subprocess +import tempfile +import unittest +from pathlib import Path + +SCRIPT = Path(__file__).with_name("extract-with-retry.sh") +TRANSIENT = "ERROR: failed to build: failed to solve: Unavailable: error reading from server: EOF" + + +class ExtractRetryTest(unittest.TestCase): + def run_extract(self, errors): + with tempfile.TemporaryDirectory() as temp: + root = Path(temp) + for index, error in enumerate(errors, 1): + (root / f"error-{index}").write_text(error) + fake = root / "build" + fake.write_text( + """#!/usr/bin/env bash +set -eu +count=0 +[ ! -f "$STATE/count" ] || count=$(cat "$STATE/count") +count=$((count + 1)) +echo "$count" > "$STATE/count" +for arg in "$@"; do + case "$arg" in type=local,dest=*) output=${arg#type=local,dest=} ;; esac +done +mkdir -p "$output" +echo "$count" > "$output/attempt-$count" +error="$STATE/error-$count" +if [ -s "$error" ]; then + cat "$error" + exit 7 +fi +""" + ) + fake.chmod(0o755) + sleep = root / "sleep" + sleep.write_text('#!/usr/bin/env bash\necho "$1" >> "$STATE/delays"\n') + sleep.chmod(0o755) + destination = root / "result" + env = dict( + os.environ, + STATE=temp, + RUNNER_TEMP=temp, + PATH=temp + os.pathsep + os.environ["PATH"], + ) + result = subprocess.run( + ["bash", str(SCRIPT), str(destination), str(fake)], + env=env, + capture_output=True, + text=True, + ) + count = int((root / "count").read_text()) + delays = ( + (root / "delays").read_text().splitlines() + if (root / "delays").exists() + else [] + ) + files = sorted(p.name for p in destination.glob("*")) + logs = list(root.glob("compliance-extract.*/attempt-*.log")) + self.assertEqual(len(logs), count) + return result.returncode, count, delays, files + + def test_success(self): + self.assertEqual(self.run_extract([""]), (0, 1, [], ["attempt-1"])) + + def test_transient_recovers_without_partial_files(self): + self.assertEqual( + self.run_extract([TRANSIENT, ""]), (0, 2, ["10"], ["attempt-2"]) + ) + + def test_exhaustion_preserves_failure(self): + self.assertEqual(self.run_extract([TRANSIENT] * 3), (7, 3, ["10", "30"], [])) + + def test_deterministic_errors_do_not_retry(self): + for error in [ + "ERROR: failed to solve: process did not complete: exit code: 1", + "ERROR: failed to authorize: 401 Unauthorized", + "ERROR: manifest unknown", + "No solution found when resolving dependencies", + ]: + with self.subTest(error=error): + self.assertEqual(self.run_extract([error]), (7, 1, [], [])) + + def test_earlier_transient_does_not_mask_terminal_failure(self): + self.assertEqual( + self.run_extract([TRANSIENT + "\nERROR: manifest unknown"]), (7, 1, [], []) + ) + + def test_other_transport_errors_recover(self): + for error in [ + "ERROR: failed to solve: connection reset by peer", + "ERROR: failed to solve: rpc error: transport is closing", + "ERROR: failed to solve: unexpected status from HEAD request: 503 Service Unavailable", + ]: + with self.subTest(error=error): + self.assertEqual( + self.run_extract([error, ""]), (0, 2, ["10"], ["attempt-2"]) + ) + + def test_build_command_containing_transport_text_does_not_retry(self): + error = 'ERROR: process "echo connection reset by peer" did not complete successfully: exit code: 1' + self.assertEqual(self.run_extract([error]), (7, 1, [], [])) + + def test_permanent_error_after_retry_stops(self): + self.assertEqual( + self.run_extract([TRANSIENT, "ERROR: manifest unknown"]), (7, 2, ["10"], []) + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 716dcb6f759c..76c9e1233e7f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -207,6 +207,12 @@ repos: # be a second copy to keep in sync. Full scan is well under 0.1s. files: ^\.github/ pass_filenames: false + - id: compliance-extract-selftest + name: Test compliance export retries + entry: python3 .github/actions/compliance-extract/test_extract_with_retry.py + language: python + pass_filenames: false + files: ^(\.github/actions/compliance-extract/|\.pre-commit-config\.yaml$) - id: check-action-pins-selftest name: Self-test the action-pin matcher entry: python3 scripts/check_action_pins.py --test From 0fac8e85d0c1a27bbd6b6d75d386b757e7f6f322 Mon Sep 17 00:00:00 2001 From: Xianlu Bird Date: Wed, 23 Sep 2026 23:37:36 +0800 Subject: [PATCH 174/191] fix(ci): harden DGDR profiling against disk pressure (#15034) Signed-off-by: xianlubird --- tests/deploy/dgdr_utils.py | 100 +++++++++++++++++++++++++++----- tests/deploy/test_dgdr_utils.py | 80 ++++++++++++++++++++++++- 2 files changed, 164 insertions(+), 16 deletions(-) diff --git a/tests/deploy/dgdr_utils.py b/tests/deploy/dgdr_utils.py index a5dbde5bdd57..0dd6dcac9e19 100644 --- a/tests/deploy/dgdr_utils.py +++ b/tests/deploy/dgdr_utils.py @@ -63,6 +63,29 @@ "totalGpus": 8, } +_CI_PROFILING_CONTAINER_DEFAULTS = { + "profiler": { + "resources": { + "requests": { + "cpu": "250m", + "memory": "512Mi", + "ephemeral-storage": "1Gi", + }, + "limits": {"ephemeral-storage": "4Gi"}, + } + }, + "output-copier": { + "resources": { + "requests": { + "cpu": "25m", + "memory": "64Mi", + "ephemeral-storage": "128Mi", + }, + "limits": {"ephemeral-storage": "256Mi"}, + } + }, +} + @dataclass(frozen=True) class DGDRTestConfig: @@ -91,6 +114,42 @@ def _deep_merge(target: dict[str, Any], source: dict[str, Any]) -> None: target[key] = copy.deepcopy(value) +def _deep_setdefault(target: dict[str, Any], defaults: dict[str, Any]) -> None: + for key, value in defaults.items(): + if key not in target: + target[key] = copy.deepcopy(value) + elif isinstance(value, dict) and isinstance(target[key], dict): + _deep_setdefault(target[key], value) + + +def _set_ci_profiling_job_defaults(spec: dict[str, Any]) -> None: + profiling_job = spec.setdefault("overrides", {}).setdefault("profilingJob", {}) + # Retry once so an evicted Pod can reschedule away from DiskPressure. + profiling_job.setdefault("backoffLimit", 1) + pod_spec = profiling_job.setdefault("template", {}).setdefault("spec", {}) + + containers = pod_spec.setdefault("containers", []) + containers_by_name = {container.get("name"): container for container in containers} + for name, defaults in _CI_PROFILING_CONTAINER_DEFAULTS.items(): + container = containers_by_name.get(name) + if container is None: + container = {"name": name} + containers.append(container) + _deep_setdefault(container, defaults) + + volumes = pod_spec.setdefault("volumes", []) + output_volume = next( + (volume for volume in volumes if volume.get("name") == "profiling-output"), + None, + ) + if output_volume is None: + output_volume = {"name": "profiling-output", "emptyDir": {}} + volumes.append(output_volume) + empty_dir = output_volume.get("emptyDir") + if isinstance(empty_dir, dict): + empty_dir.setdefault("sizeLimit", "1Gi") + + def unique_name(config_: DGDRTestConfig, suffix: str) -> str: """Return a short, collision-resistant Kubernetes resource name.""" @@ -149,24 +208,35 @@ def build_dgdr( profiling_job = spec.setdefault("overrides", {}).setdefault( "profilingJob", {} ) - profiling_job.setdefault("template", {}).setdefault("spec", {})[ - "containers" - ] = [ + containers = ( + profiling_job.setdefault("template", {}) + .setdefault("spec", {}) + .setdefault("containers", []) + ) + profiler = next( + ( + container + for container in containers + if container.get("name") == "profiler" + ), + None, + ) + if profiler is None: + profiler = {"name": "profiler"} + containers.append(profiler) + profiler.setdefault("env", []).append( { - "name": "profiler", - "env": [ - { - "name": "HF_TOKEN", - "valueFrom": { - "secretKeyRef": { - "name": config_.hf_token_secret, - "key": "HF_TOKEN", - } - }, + "name": "HF_TOKEN", + "valueFrom": { + "secretKeyRef": { + "name": config_.hf_token_secret, + "key": "HF_TOKEN", } - ], + }, } - ] + ) + + _set_ci_profiling_job_defaults(spec) return { "apiVersion": f"{DGDR_GROUP}/{DGDR_VERSION}", diff --git a/tests/deploy/test_dgdr_utils.py b/tests/deploy/test_dgdr_utils.py index a3c73a9a850d..c302424c9fd1 100644 --- a/tests/deploy/test_dgdr_utils.py +++ b/tests/deploy/test_dgdr_utils.py @@ -15,6 +15,7 @@ DGDRCleanupError, DGDRTestConfig, ManagedDGDR, + build_dgdr, parse_final_dgd, parse_served_model_ids, run_lifecycle, @@ -155,7 +156,84 @@ def test_manifest_does_not_pass_real_backend_args_to_mocker(backend: str) -> Non dgdr = dgdr_tests.manifest(manager, "mocker") - assert "overrides" not in dgdr["spec"] + overrides = dgdr["spec"]["overrides"] + assert "trustRemoteCode" not in overrides + assert "dgd" not in overrides + + +def test_build_dgdr_sets_ci_profiling_job_defaults() -> None: + dgdr = build_dgdr( + DGDRTestConfig(namespace="test-namespace", image="test"), + "test-request", + ) + + profiling_job = dgdr["spec"]["overrides"]["profilingJob"] + pod_spec = profiling_job["template"]["spec"] + containers = { + container["name"]: container["resources"] + for container in pod_spec["containers"] + } + + assert profiling_job["backoffLimit"] == 1 + assert containers == { + "profiler": { + "requests": { + "cpu": "250m", + "memory": "512Mi", + "ephemeral-storage": "1Gi", + }, + "limits": {"ephemeral-storage": "4Gi"}, + }, + "output-copier": { + "requests": { + "cpu": "25m", + "memory": "64Mi", + "ephemeral-storage": "128Mi", + }, + "limits": {"ephemeral-storage": "256Mi"}, + }, + } + assert pod_spec["volumes"] == [ + { + "name": "profiling-output", + "emptyDir": {"sizeLimit": "1Gi"}, + } + ] + + +def test_build_dgdr_preserves_pvc_backed_profiling_output() -> None: + dgdr = build_dgdr( + DGDRTestConfig(namespace="test-namespace", image="test"), + "test-request", + spec_overrides={ + "overrides": { + "profilingJob": { + "template": { + "spec": { + "volumes": [ + { + "name": "profiling-output", + "persistentVolumeClaim": { + "claimName": "profiling-pvc" + }, + } + ] + } + } + } + } + }, + ) + + volumes = dgdr["spec"]["overrides"]["profilingJob"]["template"]["spec"]["volumes"] + output_volume = next( + volume for volume in volumes if volume["name"] == "profiling-output" + ) + + assert output_volume == { + "name": "profiling-output", + "persistentVolumeClaim": {"claimName": "profiling-pvc"}, + } @pytest.mark.parametrize("content", ["not-json", '{"object": "list"}']) From 10577265026a874c143a9a045e591d331c2623e4 Mon Sep 17 00:00:00 2001 From: jthomson04 Date: Wed, 23 Sep 2026 10:05:32 -0700 Subject: [PATCH 175/191] perf(mocker): disable worker launch staggering by default (#15211) Signed-off-by: jthomson04 --- components/src/dynamo/mocker/args.py | 9 ++++----- .../pages/reference/components/mocker-cli-reference.mdx | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/components/src/dynamo/mocker/args.py b/components/src/dynamo/mocker/args.py index 6974ccf1b4fa..ac1ca233c5d5 100644 --- a/components/src/dynamo/mocker/args.py +++ b/components/src/dynamo/mocker/args.py @@ -588,12 +588,11 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace: parser.add_argument( "--stagger-delay", type=float, - default=-1.0, + default=0.0, help=( - "Delay in seconds between launching each worker to avoid overwhelming " - "etcd/NATS/frontend with many workers. Set to 0 to disable staggering. " - "Use -1 for auto mode (0.1s for 32-128 workers, 0.2s for >128 workers, 0 otherwise). " - "Default: -1 (auto)" + "Delay in seconds between launching each worker. " + "Set to 0 to disable staggering (default). " + "Use -1 for auto mode (0.1s for 33-128 workers, 0.2s for >128 workers, 0 otherwise)." ), ) parser.add_argument( diff --git a/docs/fern/pages/reference/components/mocker-cli-reference.mdx b/docs/fern/pages/reference/components/mocker-cli-reference.mdx index b29b9a248884..ec550e008dad 100644 --- a/docs/fern/pages/reference/components/mocker-cli-reference.mdx +++ b/docs/fern/pages/reference/components/mocker-cli-reference.mdx @@ -123,8 +123,8 @@ mode. one tokio runtime and thread pool. - - Delay between worker launches, in seconds. `0` disables; `-1` enables auto mode. + + Delay between worker launches, in seconds. `0` disables staggering (default); `-1` enables auto mode. ## Performance modeling From 4d60b59662e66eeb01a3d4fe45b6f085f2a14111 Mon Sep 17 00:00:00 2001 From: Alec <35311602+alec-flowers@users.noreply.github.com> Date: Wed, 23 Sep 2026 10:10:40 -0700 Subject: [PATCH 176/191] docs(readme): give SGLang and vLLM equal quickstart examples (#15220) Signed-off-by: Alec Flowers --- README.md | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8c217060da87..dd3b6c2e6247 100644 --- a/README.md +++ b/README.md @@ -138,15 +138,37 @@ the Gateway API setup, supported features, and configuration. ### Option A: Container (fastest) +Choose either vLLM or SGLang: + +#### vLLM + +```bash +# Pull a prebuilt container +docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.5.0 + +# Inside the container — start frontend and worker +python3 -m dynamo.frontend --http-port 8000 --discovery-backend file > /dev/null 2>&1 & +python3 -m dynamo.vllm --model Qwen/Qwen3-0.6B --discovery-backend file & + +# Once the worker is ready, send a request +curl -s localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{ + "model": "Qwen/Qwen3-0.6B", + "messages": [{"role": "user", "content": "Hello!"}], + "max_tokens": 100 +}' | jq +``` + +#### SGLang + ```bash -# Pull a prebuilt container (SGLang example) +# Pull a prebuilt container docker run --gpus all --network host --rm -it nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.0 # Inside the container — start frontend and worker python3 -m dynamo.frontend --http-port 8000 --discovery-backend file > /dev/null 2>&1 & python3 -m dynamo.sglang --model-path Qwen/Qwen3-0.6B --discovery-backend file & -# Send a request +# Once the worker is ready, send a request curl -s localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{ "model": "Qwen/Qwen3-0.6B", "messages": [{"role": "user", "content": "Hello!"}], @@ -154,19 +176,27 @@ curl -s localhost:8000/v1/chat/completions -H "Content-Type: application/json" - }' | jq ``` -Also available: [`tensorrtllm-runtime:1.5.0`](https://docs.nvidia.com/dynamo/resources/release-artifacts) and [`vllm-runtime:1.5.0`](https://docs.nvidia.com/dynamo/resources/release-artifacts). +Also available: [`tensorrtllm-runtime:1.5.0`](https://docs.nvidia.com/dynamo/resources/release-artifacts). ### Option B: Install from PyPI -Install [uv](https://github.com/astral-sh/uv) (`curl -LsSf https://astral.sh/uv/install.sh | sh`), then: +Install [uv](https://github.com/astral-sh/uv) (`curl -LsSf https://astral.sh/uv/install.sh | sh`), then choose your backend: + +#### vLLM + +```bash +uv pip install --prerelease=allow "ai-dynamo[vllm]" +``` + +#### SGLang ```bash -uv pip install --prerelease=allow "ai-dynamo[sglang]" # or [vllm] +uv pip install --prerelease=allow "ai-dynamo[sglang]" ``` > **Note:** TensorRT-LLM requires `pip` with `--extra-index-url https://pypi.nvidia.com`. See the [install guide](docs/fern/pages/cli/installation/install-dynamo.mdx) for TRT-LLM-specific instructions. -Then start the frontend and a worker as shown above. See the [full installation guide](docs/fern/pages/cli/installation/install-dynamo.mdx) for system dependencies and backend-specific notes. +Then start the frontend and the matching worker as shown above. See the [full installation guide](docs/fern/pages/cli/installation/install-dynamo.mdx) for system dependencies and backend-specific notes. ### Option C: Kubernetes (recommended) From cde7c9a8c5a7e30bb08c2fd44dd516410f0ad034 Mon Sep 17 00:00:00 2001 From: ishandhanani <82981111+ishandhanani@users.noreply.github.com> Date: Wed, 23 Sep 2026 10:58:11 -0700 Subject: [PATCH 177/191] feat(router): ship ThunderAgent as a builtin plugin (#15164) Signed-off-by: Ishan Dhanani --- Cargo.lock | 3 + .../router/configuration-and-tuning.md | 1 + .../use-cases/agents/priority-scheduling.md | 2 +- .../agents/thunderagent-program-scheduler.md | 84 +- lib/bindings/kvbm/Cargo.lock | 4 + lib/bindings/python/Cargo.lock | 4 + lib/bindings/python/Cargo.toml | 2 +- lib/router-plugins/builtin/Cargo.toml | 6 +- lib/router-plugins/builtin/src/lib.rs | 16 +- .../builtin/src/thunderagent/config.rs | 147 ++ .../builtin/src/thunderagent/mod.rs | 61 + .../request_classifier/capacity.rs | 114 ++ .../thunderagent/request_classifier/mod.rs | 1359 ++++++++++++++ .../request_classifier/scheduler.rs | 1636 +++++++++++++++++ .../src/thunderagent/worker_selection/mod.rs | 222 +++ 15 files changed, 3650 insertions(+), 11 deletions(-) create mode 100644 lib/router-plugins/builtin/src/thunderagent/config.rs create mode 100644 lib/router-plugins/builtin/src/thunderagent/mod.rs create mode 100644 lib/router-plugins/builtin/src/thunderagent/request_classifier/capacity.rs create mode 100644 lib/router-plugins/builtin/src/thunderagent/request_classifier/mod.rs create mode 100644 lib/router-plugins/builtin/src/thunderagent/request_classifier/scheduler.rs create mode 100644 lib/router-plugins/builtin/src/thunderagent/worker_selection/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 156efa82cfaf..d65485ec2701 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2465,6 +2465,7 @@ dependencies = [ name = "dynamo-custom-policy-builtin" version = "1.6.0" dependencies = [ + "async-trait", "criterion", "dynamo-kv-router", "fastrand", @@ -2472,7 +2473,9 @@ dependencies = [ "rustc-hash 2.1.2", "serde", "tempfile", + "thiserror 2.0.18", "tokio", + "tracing", ] [[package]] diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md index dd4e5eb54026..0b8ec9d9c642 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/configuration-and-tuning.md @@ -111,6 +111,7 @@ link no catalog and reject a configured policy type at startup. | Policy type | Behavior | |---|---| | `default` | Dynamo's built-in selector and cost model. Reserved; always available. | +| `thunderagent` | Honors the paired ThunderAgent classifier's worker/rank preference, then falls back to the least-loaded eligible worker. Enable both roles for program-aware admission and repacking; see [ThunderAgent Program Scheduler](../../../../use-cases/agents/thunderagent-program-scheduler.md#native-frontend-plugin). | | `dynamo-two-tier-cost-fn` | Ranks on two tiers instead of one additive cost: active-request load first, then device-KV prefix overlap. Prefers the worker holding the largest prefix overlap unless load is badly imbalanced. Thresholds and selection order ported from the experimental SGLang router's `cache_aware_zmq` policy. Thresholds are tunable; the defaults reproduce it exactly. | Write the instance into the same YAML file that `--router-policy-config` already points at: diff --git a/docs/fern/pages/use-cases/agents/priority-scheduling.md b/docs/fern/pages/use-cases/agents/priority-scheduling.md index 679967995425..342704fc14cd 100644 --- a/docs/fern/pages/use-cases/agents/priority-scheduling.md +++ b/docs/fern/pages/use-cases/agents/priority-scheduling.md @@ -52,7 +52,7 @@ The router queue only matters when requests are held before dispatch. If a reque (strict_priority, due_at, configured_policy_key) ``` -The strict tier is compared first. Within that tier, every request with a classifier-provided `due_at` is scheduled ahead of every request without one (an unset due time sorts last) before FCFS, LCFS, or Weighted Shortest Processing Time (WSPT) applies its configured policy key. Sustained deadline-bearing traffic can therefore starve non-deadline requests in the same class. A `due_at` is set only by a router request classifier. +The strict tier is compared first. Within that tier, every request with an internal `due_at` is scheduled ahead of every request without one (an unset due time sorts last) before FCFS, LCFS, or Weighted Shortest Processing Time (WSPT) applies its configured policy key. Sustained deadline-bearing traffic can therefore starve non-deadline requests in the same class. The default policy is `fcfs`, which uses the priority value as a positive arrival-time bump. Higher values move the request earlier in the queue. Negative priority values are clamped to zero for router queueing, so a request cannot be pushed behind normal first-come, first-served ordering by sending a negative priority. diff --git a/docs/fern/pages/use-cases/agents/thunderagent-program-scheduler.md b/docs/fern/pages/use-cases/agents/thunderagent-program-scheduler.md index 737aa0dbf7d5..a307f9b944e5 100644 --- a/docs/fern/pages/use-cases/agents/thunderagent-program-scheduler.md +++ b/docs/fern/pages/use-cases/agents/thunderagent-program-scheduler.md @@ -5,7 +5,89 @@ title: ThunderAgent Program Scheduler subtitle: Program-level scheduling with tool-boundary pause/resume on top of KV-aware routing --- -> **Experimental — not a released component.** Run it from a source checkout, not from a `pip install ai-dynamo`. The CLI flags, session headers, and lifecycle hooks are all unstable and will change. +**Experimental.** NVIDIA Dynamo includes a native ThunderAgent plugin for program-aware admission and worker placement. It runs inside the frontend and is enabled through router-policy YAML. It ports the scheduler from the [ThunderAgent](https://arxiv.org/abs/2602.13692) paper (Kang et al., 2026). + +## Native Frontend Plugin + +Use this path for aggregated serving through `dynamo.frontend`. It requires a Dynamo build that includes the `thunderagent` builtin plugin; older wheels and images do not recognize that type. The plugin is included in the builtin catalog without a separate ThunderAgent build feature. Admission behavior remains unchanged until the plugin is selected in YAML. + +Custom catalogs that already register `thunderagent` must remove that registration; duplicate type names fail startup. + +Save the following as `thunderagent.yaml`: + +```yaml +request_classifier: + type: thunderagent +worker_selection: + aggregated: thunderagent + instances: + - name: thunderagent + type: thunderagent +``` + +Start the frontend against your existing aggregated workers, using the same discovery configuration as the workers: + +```bash +python3 -m dynamo.frontend \ + --router-mode kv \ + --router-policy-config thunderagent.yaml \ + --router-session-affinity-ttl-secs 1800 \ + --router-session-affinity-mode soft +``` + +Send a stable `X-Dynamo-Session-ID` on every turn of an agent's reasoning and tool-use chain. Dynamo also accepts the [native agent headers](session-ids.mdx#native-agent-headers). Requests without session context pass through admission unchanged. At the end of a session, a dedicated minimal request with `X-Dynamo-Session-Final: true` releases the retained program state; otherwise idle retention expires it. + +Select both plugin roles. The classifier owns the program table and delays admission when a session is busy or paused. When it releases a request, it supplies a preferred worker/rank. The worker selector honors that target if it is eligible, falling back to the least-loaded eligible candidate otherwise. Soft session affinity allows this repacking; hard affinity would constrain the request before the selector can move it. The `Sent` event records the worker actually selected. + +```mermaid +flowchart LR + A[Request and session ID] --> B[ThunderAgent classifier] + B -->|Released request and preferred worker| C[Dynamo policy queue] + C --> D[ThunderAgent worker selector] + D --> E[Aggregated worker] + E -->|Progress and lifecycle events| B +``` + +The classifier uses each worker/rank's published GPU KV-block capacity and a logical token estimate from active and retained programs. It observes context growth during generation, then pauses and repacks programs between turns. This estimate is not physical KV occupancy and does not deduplicate shared prefixes or include host/offload capacity. Running generation is allowed to finish. + +### Native Plugin Parameters + +Set admission parameters under `request_classifier.parameters`. Leave worker-selection parameters empty. Unknown parameter names and invalid values fail startup. + +| Parameter | Default | Meaning | +|---|---|---| +| `pause_threshold` | `0.95` | Per-worker usage fraction that starts pausing programs. | +| `pause_target` | `0.80` | Usage fraction the pause cycle drains toward. | +| `resume_hysteresis` | `0.10` | Headroom below the pause threshold required for normal resume. | +| `resume_timeout_seconds` | `1800` | Maximum deferral before forced release on a live worker. This does not reject the request. | +| `session_retention_seconds` | `1800` | Retention period for an idle, continuing program. | +| `scheduler_interval_seconds` | `5` | Interval between pressure and resume decisions. | +| `acting_token_weight` | `1` | Capacity weight while the agent is doing tool work. | +| `acting_decay_tau_seconds` | `1` | Acting-token decay half-life used for timeout fallback placement. | +| `buffer_per_program` | `100` | Token headroom reserved for each active program. | +| `max_tracked_requests` | `10000` | Independent limits on tracked requests and retained programs. Requests fail classification at the request limit. New programs fail at the program limit if no idle program can be evicted. | + +The default deferral timeout permits waits of roughly 30 minutes under pressure. Set client deadlines to match the workload's acceptable wait. Router policy classes and queues still apply after classification releases a request. + +Program state is local to each frontend's router instance. This is not a cluster-wide admission budget; keep a session's turns on the same frontend when using multiple replicas. The native plugin has been exercised with aggregated vLLM workers. Standalone EPP and disaggregated deployment guidance are outside this example. + +The native plugin's classifier and worker selector register together in Dynamo's builtin catalog. It does not expose the Python prototype's soft-demotion controls, priority boosts, host-cache budget, or separate status endpoints described below. + +### Native Plugin Logs + +The plugin logs its interval, deferral timeout, and tracking limit at INFO when admission is enabled. A WARN event reports the number of programs forcibly resumed after reaching the deferral timeout. These requests continue processing; they are not rejected. Timeout warnings are aggregated into one event per scheduler tick. + +To see scheduler state changes, enable DEBUG for the `thunderagent` log target before starting the frontend: + +```bash +export DYN_LOG='info,thunderagent=debug' +``` + +Each changed tick reports counts of active, paused, and marked-for-pause programs, waiting requests, and tracked requests. Unchanged ticks are silent. Log snapshots use stored counts without scanning programs or requests, and log emission happens after releasing the scheduler lock. + +## Python Router Prototype + +The remaining sections describe the older standalone Python implementation. Run that prototype from a source checkout. Its CLI flags and observability endpoints differ from the native plugin above. `dynamo.thunderagent_router` is a standalone Dynamo router that schedules at the granularity of an agent run — the whole `LLM turn → tool call → next turn` loop — instead of individual requests. It wraps Dynamo's native KV router and adds a program-level scheduler with tool-boundary pause/resume on top of KV-aware routing, porting the scheduler from the [ThunderAgent](https://arxiv.org/abs/2602.13692) paper (Kang et al., 2026). diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index 692be12b8ebd..e465d7f74796 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -2058,10 +2058,14 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" name = "dynamo-custom-policy-builtin" version = "1.6.0" dependencies = [ + "async-trait", "dynamo-kv-router", "fastrand", "parking_lot", "serde", + "thiserror 2.0.18", + "tokio", + "tracing", ] [[package]] diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index 65272a5ef4f6..0382a7609981 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -2105,10 +2105,14 @@ dependencies = [ name = "dynamo-custom-policy-builtin" version = "1.6.0" dependencies = [ + "async-trait", "dynamo-kv-router", "fastrand", "parking_lot", "serde", + "thiserror 2.0.18", + "tokio", + "tracing", ] [[package]] diff --git a/lib/bindings/python/Cargo.toml b/lib/bindings/python/Cargo.toml index 571188d969c8..f282618c6fbe 100644 --- a/lib/bindings/python/Cargo.toml +++ b/lib/bindings/python/Cargo.toml @@ -23,7 +23,7 @@ crate-type = ["cdylib", "rlib"] [features] default = ["custom-policy"] -# Links the worker-selection policies Dynamo ships plus the replaceable catalog selected by the +# Links the router plugins Dynamo ships plus the replaceable catalog selected by the # dependency alias below. Enabled by default so a deployment can select a shipped policy through # router-policy YAML without rebuilding. A private image replaces only the catalog dependency, so # its policies are added alongside the shipped ones rather than displacing them. diff --git a/lib/router-plugins/builtin/Cargo.toml b/lib/router-plugins/builtin/Cargo.toml index f40f7023d22e..42636b70c7ab 100644 --- a/lib/router-plugins/builtin/Cargo.toml +++ b/lib/router-plugins/builtin/Cargo.toml @@ -9,13 +9,17 @@ authors.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -description = "Worker-selection policies Dynamo ships and always links" +description = "Router plugins shipped with Dynamo" [dependencies] fastrand = "2" parking_lot.workspace = true dynamo-kv-router = { workspace = true, features = ["standalone-selection"] } serde.workspace = true +async-trait.workspace = true +thiserror.workspace = true +tokio.workspace = true +tracing.workspace = true [dev-dependencies] tokio = { workspace = true, features = ["macros", "rt", "time"] } diff --git a/lib/router-plugins/builtin/src/lib.rs b/lib/router-plugins/builtin/src/lib.rs index 84bb30b28e56..1722ff618a91 100644 --- a/lib/router-plugins/builtin/src/lib.rs +++ b/lib/router-plugins/builtin/src/lib.rs @@ -1,14 +1,15 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -//! Worker-selection policies Dynamo ships. +//! Router plugins Dynamo ships. //! //! Routing hosts always link the default through `default_registry`. The optional custom -//! catalog adds the named default and two-tier providers through `register`. The default +//! catalog adds the named default, two-tier, and ThunderAgent providers through `register`. The default //! itself uses the same public candidate inputs and scorer/picker dispatch as external policies. //! Sequence tracking, eligibility, and admission remain in dynamo-kv-router. mod default; +mod thunderagent; mod two_tier_cost_fn; pub use default::{DefaultWorkerSelector, default_factory, default_policy}; @@ -17,22 +18,23 @@ pub fn default_registry() -> RouterPluginRegistry { RouterPluginRegistry::default().with_default_factory(default_factory()) } -use dynamo_kv_router::plugins::{RouterPluginRegistry, WorkerSelectionPolicyRegistryError}; +use dynamo_kv_router::plugins::{RouterPluginRegistry, RouterPluginRegistryError}; /// Register the named providers Dynamo ships, without changing the host's default factory. /// /// `default` is reserved by the registry for Dynamo's built-in worker selector, so no policy here /// can shadow it. A later catalog that reuses one of these type names fails registration rather /// than overriding it. -pub fn register( - registry: &mut RouterPluginRegistry, -) -> Result<(), WorkerSelectionPolicyRegistryError> { +pub fn register(registry: &mut RouterPluginRegistry) -> Result<(), RouterPluginRegistryError> { default::register(registry)?; - two_tier_cost_fn::register(registry) + two_tier_cost_fn::register(registry)?; + thunderagent::register(registry)?; + Ok(()) } #[cfg(test)] mod tests { + use dynamo_kv_router::plugins::WorkerSelectionPolicyRegistryError; use dynamo_kv_router::plugins::worker_selection::WorkerSelectionPolicyFactory; use dynamo_kv_router::{KvRouterConfig, RoutingPartitionRef, WorkerType}; diff --git a/lib/router-plugins/builtin/src/thunderagent/config.rs b/lib/router-plugins/builtin/src/thunderagent/config.rs new file mode 100644 index 000000000000..e8de846c1416 --- /dev/null +++ b/lib/router-plugins/builtin/src/thunderagent/config.rs @@ -0,0 +1,147 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::time::Duration; + +use serde::Deserialize; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum ConfigError { + #[error("invalid ThunderAgent configuration: {0}")] + Invalid(&'static str), +} + +#[derive(Debug, Clone, PartialEq, Deserialize)] +#[serde(default, deny_unknown_fields)] +pub struct ThunderAgentConfig { + pub pause_threshold: f64, + pub pause_target: f64, + pub resume_hysteresis: f64, + pub resume_timeout_seconds: f64, + pub session_retention_seconds: f64, + pub scheduler_interval_seconds: f64, + pub acting_token_weight: f64, + pub acting_decay_tau_seconds: f64, + pub buffer_per_program: usize, + pub max_tracked_requests: usize, +} + +impl Default for ThunderAgentConfig { + fn default() -> Self { + Self { + pause_threshold: 0.95, + pause_target: 0.80, + resume_hysteresis: 0.10, + resume_timeout_seconds: 1_800.0, + session_retention_seconds: 1_800.0, + scheduler_interval_seconds: 5.0, + acting_token_weight: 1.0, + acting_decay_tau_seconds: 1.0, + buffer_per_program: 100, + max_tracked_requests: 10_000, + } + } +} + +impl ThunderAgentConfig { + pub fn validate(&self) -> Result<(), ConfigError> { + validate_fraction(self.pause_threshold, "pause_threshold must be in [0, 1]")?; + validate_fraction(self.pause_target, "pause_target must be in [0, 1]")?; + if self.pause_target > self.pause_threshold { + return Err(ConfigError::Invalid( + "pause_target must not exceed pause_threshold", + )); + } + validate_fraction( + self.resume_hysteresis, + "resume_hysteresis must be in [0, 1]", + )?; + if self.resume_hysteresis > self.pause_threshold { + return Err(ConfigError::Invalid( + "resume_hysteresis must not exceed pause_threshold", + )); + } + validate_duration( + self.resume_timeout_seconds, + "resume_timeout_seconds must be positive", + )?; + validate_duration( + self.session_retention_seconds, + "session_retention_seconds must be positive", + )?; + validate_duration( + self.scheduler_interval_seconds, + "scheduler_interval_seconds must be positive", + )?; + if !self.acting_token_weight.is_finite() || self.acting_token_weight <= 0.0 { + return Err(ConfigError::Invalid( + "acting_token_weight must be finite and positive", + )); + } + if !self.acting_decay_tau_seconds.is_finite() || self.acting_decay_tau_seconds <= 0.0 { + return Err(ConfigError::Invalid( + "acting_decay_tau_seconds must be finite and positive", + )); + } + if self.max_tracked_requests == 0 { + return Err(ConfigError::Invalid( + "max_tracked_requests must be positive", + )); + } + Ok(()) + } + + pub(crate) fn resume_timeout(&self) -> Duration { + Duration::from_secs_f64(self.resume_timeout_seconds) + } + + pub(crate) fn session_retention(&self) -> Duration { + Duration::from_secs_f64(self.session_retention_seconds) + } + + pub(crate) fn scheduler_interval(&self) -> Duration { + Duration::from_secs_f64(self.scheduler_interval_seconds) + } +} + +fn validate_fraction(value: f64, message: &'static str) -> Result<(), ConfigError> { + if value.is_finite() && (0.0..=1.0).contains(&value) { + Ok(()) + } else { + Err(ConfigError::Invalid(message)) + } +} + +fn validate_duration(value: f64, message: &'static str) -> Result<(), ConfigError> { + match Duration::try_from_secs_f64(value) { + Ok(duration) if !duration.is_zero() => Ok(()), + _ => Err(ConfigError::Invalid(message)), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn validates_control_values() { + assert!(ThunderAgentConfig::default().validate().is_ok()); + assert!( + ThunderAgentConfig { + pause_target: 0.96, + ..Default::default() + } + .validate() + .is_err() + ); + assert!( + ThunderAgentConfig { + scheduler_interval_seconds: 0.0, + ..Default::default() + } + .validate() + .is_err() + ); + } +} diff --git a/lib/router-plugins/builtin/src/thunderagent/mod.rs b/lib/router-plugins/builtin/src/thunderagent/mod.rs new file mode 100644 index 000000000000..5dd048362f49 --- /dev/null +++ b/lib/router-plugins/builtin/src/thunderagent/mod.rs @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Program-aware admission and placement from the native ThunderAgent prototype. +//! +//! Ported from `ishandhanani/router-sandbox` at `0184d2d39826f7f39c0ca33ee32c4141e86c2792`. +//! The classifier owns program state; the stateless selector executes its preferred placement. + +mod config; +mod request_classifier; +mod worker_selection; + +use config::{ConfigError, ThunderAgentConfig}; + +use dynamo_kv_router::plugins::{RouterPluginRegistry, RouterPluginRegistryError}; + +const THUNDERAGENT_CLASSIFIER_TYPE: &str = "thunderagent"; + +/// Register ThunderAgent's classifier and worker selector in one plugin catalog. +pub(super) fn register( + registry: &mut RouterPluginRegistry, +) -> Result<(), RouterPluginRegistryError> { + worker_selection::register(registry)?; + request_classifier::register(registry)?; + Ok(()) +} + +#[cfg(test)] +mod tests { + #[test] + fn registers_classifier_and_worker_selector() { + let mut registry = crate::default_registry(); + crate::register(&mut registry).unwrap(); + let policy = tempfile::NamedTempFile::new().unwrap(); + std::fs::write( + policy.path(), + r#" +request_classifier: + type: thunderagent +worker_selection: + aggregated: thunderagent + instances: + - name: thunderagent + type: thunderagent +"#, + ) + .unwrap(); + let config = dynamo_kv_router::KvRouterConfig { + router_policy_config: Some(policy.path().display().to_string()), + ..Default::default() + }; + let plugins = registry.resolve_plugins(&config).unwrap(); + assert!(plugins.worker_selection().is_some()); + let factory = plugins.request_classifier().unwrap(); + let context = dynamo_kv_router::plugins::request_classifier::RequestClassifierContext::new( + 16, + Vec::new, + ); + let _classifier = factory(context); + } +} diff --git a/lib/router-plugins/builtin/src/thunderagent/request_classifier/capacity.rs b/lib/router-plugins/builtin/src/thunderagent/request_classifier/capacity.rs new file mode 100644 index 000000000000..fc24df2214d0 --- /dev/null +++ b/lib/router-plugins/builtin/src/thunderagent/request_classifier/capacity.rs @@ -0,0 +1,114 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::collections::{HashMap, HashSet}; +use std::sync::Arc; +use std::sync::atomic::{AtomicU64, Ordering}; + +use dynamo_kv_router::protocols::WorkerWithDpRank; + +/// Cached per-worker program-retention capacity derived from model deployment cards. +static NEXT_SNAPSHOT_ID: AtomicU64 = AtomicU64::new(1); + +#[derive(Debug)] +pub struct WorkerCapacitySnapshot { + id: u64, + capacities: HashMap, + live_workers: Option>, +} + +impl WorkerCapacitySnapshot { + /// Build a snapshot from the MDC-backed capacities currently available. + /// + /// An empty capacity map is treated as MDC cold start. Use + /// [`Self::with_live_workers`] to attach the independent discovery view. + pub fn new(capacities: impl IntoIterator) -> Self { + Self { + id: NEXT_SNAPSHOT_ID.fetch_add(1, Ordering::Relaxed), + capacities: capacities.into_iter().collect(), + live_workers: None, + } + } + + /// Attach an authoritative discovery snapshot for worker-removal detection. + pub fn with_live_workers( + mut self, + workers: impl IntoIterator, + ) -> Self { + self.live_workers = Some(workers.into_iter().collect()); + self + } + + pub(crate) fn is_empty(&self) -> bool { + self.capacities.is_empty() + } + + pub(crate) fn id(&self) -> u64 { + self.id + } + + pub(crate) fn has_usable_capacity(&self) -> bool { + self.capacities.keys().any(|&worker| self.is_live(worker)) + } + + pub(crate) fn has_live_worker(&self) -> bool { + self.live_workers + .as_ref() + .is_none_or(|workers| !workers.is_empty()) + } + + pub(crate) fn is_live(&self, worker: WorkerWithDpRank) -> bool { + self.live_workers + .as_ref() + .is_none_or(|workers| workers.contains(&worker)) + } + + pub(crate) fn has_liveness(&self) -> bool { + self.live_workers.is_some() + } + + pub(crate) fn iter(&self) -> impl Iterator + '_ { + self.capacities + .iter() + .map(|(&worker, &capacity)| (worker, capacity)) + } +} + +impl Default for WorkerCapacitySnapshot { + fn default() -> Self { + Self::new(std::iter::empty()) + } +} + +/// Supplies a non-blocking cached MDC capacity and discovery snapshot. +pub trait WorkerCapacityProvider: Send + Sync + 'static { + fn snapshot(&self) -> Arc; +} + +impl WorkerCapacityProvider for F +where + F: Fn() -> Arc + Send + Sync + 'static, +{ + fn snapshot(&self) -> Arc { + self() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn distinguishes_missing_capacity_from_worker_removal() { + let worker_with_card = WorkerWithDpRank::new(1, 0); + let live_without_card = WorkerWithDpRank::new(2, 0); + let removed = WorkerWithDpRank::new(3, 0); + let snapshot = WorkerCapacitySnapshot::new([(worker_with_card, 1_000)]) + .with_live_workers([worker_with_card, live_without_card]); + + assert!(snapshot.capacities.contains_key(&worker_with_card)); + assert!(!snapshot.capacities.contains_key(&live_without_card)); + assert!(snapshot.is_live(live_without_card)); + assert!(!snapshot.is_live(removed)); + } +} diff --git a/lib/router-plugins/builtin/src/thunderagent/request_classifier/mod.rs b/lib/router-plugins/builtin/src/thunderagent/request_classifier/mod.rs new file mode 100644 index 000000000000..9ba977dbfe98 --- /dev/null +++ b/lib/router-plugins/builtin/src/thunderagent/request_classifier/mod.rs @@ -0,0 +1,1359 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +mod capacity; +mod scheduler; + +pub use capacity::{WorkerCapacityProvider, WorkerCapacitySnapshot}; + +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::time::Instant; + +use async_trait::async_trait; +use dynamo_kv_router::plugins::RouterPluginRegistry; +use dynamo_kv_router::plugins::request_classifier::{ + ClassifierError, ClassifyEvent, ClassifyFuture, ClassifyRequest, RequestClassifier, + RequestClassifierContext, RequestClassifierFactory, RequestClassifierParameters, + RequestClassifierProviderError, RequestClassifierRegistryError, RequestProgress, +}; +use parking_lot::Mutex; +use thiserror::Error; +use tokio::sync::Notify; + +use self::scheduler::{RequestRegistration, State, WaitStatus}; +use super::{ConfigError, ThunderAgentConfig}; + +fn capacity_provider(context: RequestClassifierContext) -> Arc { + let block_size = u64::from(context.block_size()); + Arc::new(move || { + let workers = context.workers(); + let live_workers = workers.iter().map(|worker| worker.worker()); + let capacities = workers.iter().filter_map(|worker| { + let total_kv_blocks = worker.total_kv_blocks()?; + let capacity = total_kv_blocks.saturating_mul(block_size); + Some(( + worker.worker(), + usize::try_from(capacity).unwrap_or(usize::MAX), + )) + }); + Arc::new(WorkerCapacitySnapshot::new(capacities).with_live_workers(live_workers)) + }) +} + +fn classifier_provider( + parameters: &RequestClassifierParameters, +) -> Result { + let config: ThunderAgentConfig = parameters.deserialize()?; + config + .validate() + .map_err(|error| RequestClassifierProviderError::new(error.to_string()))?; + + Ok(Arc::new(move |context| { + let capacity_provider = capacity_provider(context); + Box::new( + ThunderAgentClassifier::new(config.clone(), capacity_provider) + .expect("ThunderAgent configuration was validated during catalog resolution"), + ) + })) +} + +pub(crate) fn register( + registry: &mut RouterPluginRegistry, +) -> Result<(), RequestClassifierRegistryError> { + registry.register_request_classifier( + super::THUNDERAGENT_CLASSIFIER_TYPE, + Arc::new(classifier_provider), + ) +} + +#[derive(Debug, Error)] +pub(crate) enum ThunderAgentError { + #[error("session-aware classification requires a request ID")] + MissingRequestId, + + #[error("request {0:?} is already active in the ThunderAgent classifier")] + DuplicateRequestId(String), + + #[error("request {0:?} ended while classification was pending")] + RequestEnded(String), + + #[error("ThunderAgent is already tracking its configured limit of {limit} requests")] + RequestLimitExceeded { limit: usize }, + + #[error("ThunderAgent is already tracking its configured limit of {limit} programs")] + ProgramLimitExceeded { limit: usize }, +} + +struct Inner { + state: Mutex, + capacity_provider: Arc, + scheduler_started: AtomicBool, +} + +impl Inner { + fn register( + &self, + request_id: String, + session_id: String, + input_tokens: usize, + progress: RequestProgress, + session_final: bool, + ) -> Result, ThunderAgentError> { + let capacities = self.capacity_provider.snapshot(); + self.state.lock().register( + RequestRegistration::new( + request_id, + session_id, + input_tokens, + progress, + session_final, + ), + &capacities, + Instant::now(), + ) + } + + fn start_scheduler(self: &Arc) { + if self + .scheduler_started + .compare_exchange(false, true, Ordering::AcqRel, Ordering::Acquire) + .is_err() + { + return; + } + let interval = self.state.lock().scheduler_interval(); + let inner = Arc::downgrade(self); + tokio::spawn(async move { + loop { + tokio::time::sleep(interval).await; + let Some(inner) = inner.upgrade() else { + break; + }; + inner.reconcile(); + } + }); + } + + fn reconcile(&self) { + if !self.state.lock().needs_reconcile() { + return; + } + let capacities = self.capacity_provider.snapshot(); + let debug_enabled = tracing::enabled!(target: "thunderagent", tracing::Level::DEBUG); + let warn_enabled = tracing::enabled!(target: "thunderagent", tracing::Level::WARN); + let (outcome, telemetry) = { + let mut state = self.state.lock(); + let outcome = state.reconcile(&capacities, Instant::now()); + if !outcome.changed || !(debug_enabled || warn_enabled && outcome.forced_resumes > 0) { + return; + } + (outcome, state.telemetry()) + }; + if outcome.forced_resumes > 0 { + tracing::warn!( + target: "thunderagent", + forced_resumes = outcome.forced_resumes, + waiting_requests = telemetry.waiting_requests, + "ThunderAgent deferral timeout forced program resumes" + ); + } + tracing::debug!( + target: "thunderagent", + programs = telemetry.programs, + active_programs = telemetry.active_programs, + paused_programs = telemetry.paused_programs, + marked_for_pause = telemetry.marked_for_pause, + waiting_requests = telemetry.waiting_requests, + tracked_requests = telemetry.tracked_requests, + "ThunderAgent scheduler state changed" + ); + } + + fn on_event(&self, event: ClassifyEvent) { + let request_id = match &event { + ClassifyEvent::Sent { request_id, .. } + | ClassifyEvent::Completed { request_id, .. } + | ClassifyEvent::Aborted { request_id, .. } => request_id, + _ => return, + }; + let mut state = self.state.lock(); + if !state.requests.contains_key(request_id) { + return; + } + let capacities = self.capacity_provider.snapshot(); + state.on_event(event, &capacities, Instant::now()); + } + + fn cancel_request(&self, request_id: &str, notify: &Arc) { + let mut state = self.state.lock(); + if state.wait_status(request_id, notify) == WaitStatus::Missing { + return; + } + let capacities = self.capacity_provider.snapshot(); + state.cancel_request(request_id, &capacities, Instant::now()); + } +} + +struct PendingClassification { + inner: Arc, + request_id: String, + notify: Arc, + armed: bool, +} + +impl PendingClassification { + fn new(inner: Arc, request_id: String, notify: Arc) -> Self { + Self { + inner, + request_id, + notify, + armed: true, + } + } + + fn disarm(&mut self) { + self.armed = false; + } +} + +impl Drop for PendingClassification { + fn drop(&mut self) { + if self.armed { + self.inner.cancel_request(&self.request_id, &self.notify); + } + } +} + +async fn await_release( + mut pending: PendingClassification, + value: T, +) -> Result<(T, Option), ThunderAgentError> { + pending.inner.start_scheduler(); + let inner = Arc::clone(&pending.inner); + let request_id = pending.request_id.clone(); + loop { + let notify = Arc::clone(&pending.notify); + let notified = notify.notified(); + let status = inner.state.lock().wait_status(&request_id, ¬ify); + match status { + WaitStatus::Released(worker) => { + pending.disarm(); + return Ok((value, worker)); + } + WaitStatus::Missing => { + pending.disarm(); + return Err(ThunderAgentError::RequestEnded(request_id)); + } + WaitStatus::Waiting => {} + } + notified.await; + } +} + +/// Program-aware flow control implemented on Dynamo's request-classifier seam. +pub struct ThunderAgentClassifier { + inner: Arc, +} + +impl ThunderAgentClassifier { + pub fn new( + config: ThunderAgentConfig, + capacity_provider: Arc, + ) -> Result { + config.validate()?; + tracing::info!( + target: "thunderagent", + scheduler_interval_seconds = config.scheduler_interval_seconds, + resume_timeout_seconds = config.resume_timeout_seconds, + max_tracked_requests = config.max_tracked_requests, + "ThunderAgent admission enabled" + ); + Ok(Self { + inner: Arc::new(Inner { + state: Mutex::new(State::new(config)), + capacity_provider, + scheduler_started: AtomicBool::new(false), + }), + }) + } +} + +#[async_trait] +impl RequestClassifier for ThunderAgentClassifier { + fn classify(&mut self, request: ClassifyRequest) -> ClassifyFuture { + let Some(session) = request.session_context() else { + return Box::pin(async move { Ok(request) }); + }; + let Some(request_id) = request.request_id().map(str::to_owned) else { + return Box::pin(async move { + Err(Box::new(ThunderAgentError::MissingRequestId) as Box) + }); + }; + let session_id = session.session_id().to_owned(); + let session_final = session.session_final() == Some(true); + let input_tokens = request.input_tokens(); + let progress = request.progress().clone(); + let notify = match self.inner.register( + request_id.clone(), + session_id, + input_tokens, + progress, + session_final, + ) { + Ok(notify) => notify, + Err(error) => { + return Box::pin(async move { Err(Box::new(error) as Box) }); + } + }; + + let inner = Arc::clone(&self.inner); + let pending = PendingClassification::new(inner, request_id, notify); + Box::pin(async move { + await_release(pending, request) + .await + .map(|(mut request, worker)| { + if let Some(worker) = worker { + request.set_worker_selection_target(worker); + } + request + }) + .map_err(|error| Box::new(error) as Box) + }) + } + + async fn on_event(&mut self, event: ClassifyEvent) { + self.inner.on_event(event); + } +} + +#[cfg(test)] +mod tests { + use std::time::Duration; + + use dynamo_kv_router::plugins::request_classifier::RequestClassifierWorker; + use dynamo_kv_router::protocols::WorkerWithDpRank; + + use super::scheduler::ProgramLifecycle; + use super::*; + + #[test] + fn derives_capacity_and_liveness_from_the_host_context() { + let worker_with_capacity = WorkerWithDpRank::new(1, 0); + let worker_without_capacity = WorkerWithDpRank::new(2, 0); + let context = RequestClassifierContext::new(16, move || { + vec![ + RequestClassifierWorker::new(worker_with_capacity, Some(10)), + RequestClassifierWorker::new(worker_without_capacity, None), + ] + }); + + let snapshot = capacity_provider(context).snapshot(); + assert_eq!( + snapshot.iter().collect::>(), + [(worker_with_capacity, 160)] + ); + assert!(snapshot.is_live(worker_with_capacity)); + assert!(snapshot.is_live(worker_without_capacity)); + } + + fn config() -> ThunderAgentConfig { + ThunderAgentConfig { + scheduler_interval_seconds: 0.005, + resume_timeout_seconds: 1.0, + session_retention_seconds: 1.0, + buffer_per_program: 0, + ..Default::default() + } + } + + fn capacities(values: &[(u64, usize)]) -> Arc { + Arc::new(WorkerCapacitySnapshot::new(values.iter().map( + |&(worker, capacity)| (WorkerWithDpRank::new(worker, 0), capacity), + ))) + } + + fn classifier(values: &[(u64, usize)]) -> ThunderAgentClassifier { + let snapshot = capacities(values); + let provider: Arc = Arc::new(move || Arc::clone(&snapshot)); + ThunderAgentClassifier::new(config(), provider).unwrap() + } + + #[test] + fn timeout_logs_are_aggregated_outside_the_lock_and_unchanged_ticks_are_silent() { + #[derive(Debug, PartialEq)] + struct Event { + level: tracing::Level, + forced_resumes: Option, + } + impl tracing::field::Visit for Event { + fn record_debug(&mut self, _: &tracing::field::Field, _: &dyn std::fmt::Debug) {} + fn record_u64(&mut self, field: &tracing::field::Field, value: u64) { + if field.name() == "forced_resumes" { + self.forced_resumes = Some(value); + } + } + } + struct Subscriber { + inner: std::sync::Weak, + max_level: tracing::Level, + events: Arc>>, + } + impl tracing::Subscriber for Subscriber { + fn enabled(&self, metadata: &tracing::Metadata<'_>) -> bool { + *metadata.level() <= self.max_level + } + fn new_span(&self, _: &tracing::span::Attributes<'_>) -> tracing::span::Id { + tracing::span::Id::from_u64(1) + } + fn record(&self, _: &tracing::span::Id, _: &tracing::span::Record<'_>) {} + fn record_follows_from(&self, _: &tracing::span::Id, _: &tracing::span::Id) {} + fn enter(&self, _: &tracing::span::Id) {} + fn exit(&self, _: &tracing::span::Id) {} + fn event(&self, event: &tracing::Event<'_>) { + assert!(self.inner.upgrade().unwrap().state.try_lock().is_some()); + let mut captured = Event { + level: *event.metadata().level(), + forced_resumes: None, + }; + event.record(&mut captured); + self.events.lock().push(captured); + } + } + + for max_level in [tracing::Level::INFO, tracing::Level::DEBUG] { + let classifier = classifier(&[(1, 100)]); + let capacity = capacities(&[(1, 100)]); + let now = Instant::now() - Duration::from_secs(2); + for id in ["first", "second"] { + classifier + .inner + .state + .lock() + .register( + RequestRegistration::new( + id.into(), + id.into(), + 120, + RequestProgress::new(120).0, + false, + ), + &capacity, + now, + ) + .unwrap(); + } + let events = Arc::new(Mutex::new(Vec::new())); + tracing::subscriber::with_default( + Subscriber { + inner: Arc::downgrade(&classifier.inner), + max_level, + events: Arc::clone(&events), + }, + || { + classifier.inner.reconcile(); + classifier.inner.reconcile(); + }, + ); + let mut expected = vec![Event { + level: tracing::Level::WARN, + forced_resumes: Some(2), + }]; + if max_level == tracing::Level::DEBUG { + expected.push(Event { + level: tracing::Level::DEBUG, + forced_resumes: None, + }); + } + assert_eq!(*events.lock(), expected); + } + } + + #[test] + fn marked_count_stays_current_after_completion_and_rollback() { + let mut state = State::new(config()); + let capacity = capacities(&[(1, 100)]); + let now = Instant::now(); + let (progress, updater) = RequestProgress::new(60); + state + .register( + RequestRegistration::new("first".into(), "first".into(), 60, progress, false), + &capacity, + now, + ) + .unwrap(); + state + .register( + RequestRegistration::new( + "second".into(), + "second".into(), + 30, + RequestProgress::new(30).0, + false, + ), + &capacity, + now, + ) + .unwrap(); + updater.update_context_tokens(120); + state.reconcile(&capacity, now); + assert_eq!(state.telemetry().marked_for_pause, 2); + state.cancel_request("first", &capacity, now); + assert_eq!(state.telemetry().marked_for_pause, 1); + state.on_event( + ClassifyEvent::Completed { + request_id: "second".into(), + worker: WorkerWithDpRank::new(1, 0), + context_tokens: Some(30), + }, + &capacity, + now, + ); + assert_eq!(state.telemetry().marked_for_pause, 0); + assert_eq!(state.telemetry().paused_programs, 1); + } + + fn status(state: &State, request_id: &str) -> WaitStatus { + state.wait_status(request_id, &state.requests[request_id].notify) + } + + fn register( + classifier: &ThunderAgentClassifier, + request_id: &str, + session_id: &str, + tokens: usize, + session_final: bool, + ) { + let (progress, _) = RequestProgress::new(tokens); + classifier + .inner + .register( + request_id.to_owned(), + session_id.to_owned(), + tokens, + progress, + session_final, + ) + .unwrap(); + } + + async fn release(classifier: &ThunderAgentClassifier, request_id: &str) { + await_release(pending(classifier, request_id), ()) + .await + .unwrap(); + } + + fn pending(classifier: &ThunderAgentClassifier, request_id: &str) -> PendingClassification { + let notify = classifier + .inner + .state + .lock() + .requests + .get(request_id) + .map(|request| Arc::clone(&request.notify)) + .unwrap(); + PendingClassification::new(Arc::clone(&classifier.inner), request_id.to_owned(), notify) + } + + async fn sent(classifier: &mut ThunderAgentClassifier, request_id: &str, worker: u64) { + classifier + .on_event(ClassifyEvent::Sent { + request_id: request_id.to_owned(), + worker: WorkerWithDpRank::new(worker, 0), + }) + .await; + } + + async fn completed(classifier: &mut ThunderAgentClassifier, request_id: &str, tokens: usize) { + classifier + .on_event(ClassifyEvent::Completed { + request_id: request_id.to_owned(), + worker: WorkerWithDpRank::new(1, 0), + context_tokens: Some(tokens), + }) + .await; + } + + #[test] + fn implements_request_classifier() { + fn assert_classifier() {} + assert_classifier::(); + } + + #[tokio::test] + async fn dropping_an_old_classification_preserves_a_reused_request_id() { + let mut classifier = classifier(&[(1, 1_000)]); + register(&classifier, "reused", "old-session", 100, false); + let old = await_release(pending(&classifier, "reused"), ()); + classifier.inner.on_event(ClassifyEvent::Aborted { + request_id: "reused".into(), + worker: None, + error: None, + }); + register(&classifier, "reused", "new-session", 100, false); + let replacement = pending(&classifier, "reused"); + + drop(old); + + assert!( + classifier + .inner + .state + .lock() + .requests + .contains_key("reused") + ); + await_release(replacement, ()).await.unwrap(); + completed(&mut classifier, "reused", 100).await; + } + + #[tokio::test] + async fn an_old_waiter_cannot_read_a_reused_request_id() { + use std::future::{Future, poll_fn}; + use std::task::Poll; + + let classifier = classifier(&[(1, 1_000)]); + register(&classifier, "reused", "old-session", 1_500, false); + let mut old = Box::pin(await_release(pending(&classifier, "reused"), ())); + assert!(poll_fn(|cx| Poll::Ready(old.as_mut().poll(cx).is_pending())).await); + classifier.inner.on_event(ClassifyEvent::Aborted { + request_id: "reused".into(), + worker: None, + error: None, + }); + register(&classifier, "reused", "new-session", 100, false); + + assert!(matches!(old.await, Err(ThunderAgentError::RequestEnded(id)) if id == "reused")); + assert!( + classifier + .inner + .state + .lock() + .requests + .contains_key("reused") + ); + } + + #[tokio::test] + async fn a_reused_request_id_does_not_revive_a_canceled_queue_entry() { + for replacement_session in ["session-a", "session-b"] { + let mut classifier = classifier(&[(1, 1_000)]); + register(&classifier, "first-a", "session-a", 100, false); + register(&classifier, "second-a", "session-a", 100, false); + register(&classifier, "reused", "session-a", 100, false); + register(&classifier, "tail-a", "session-a", 100, false); + drop(pending(&classifier, "reused")); + register(&classifier, "first-b", "session-b", 100, false); + register(&classifier, "reused", replacement_session, 100, false); + + completed(&mut classifier, "first-a", 100).await; + completed(&mut classifier, "second-a", 100).await; + assert!(matches!( + status(&classifier.inner.state.lock(), "tail-a"), + WaitStatus::Released(_) + )); + assert_eq!( + status(&classifier.inner.state.lock(), "reused"), + WaitStatus::Waiting + ); + + completed(&mut classifier, "tail-a", 100).await; + completed(&mut classifier, "first-b", 100).await; + assert!(matches!( + status(&classifier.inner.state.lock(), "reused"), + WaitStatus::Released(_) + )); + completed(&mut classifier, "reused", 100).await; + assert!(classifier.inner.state.lock().requests.is_empty()); + } + } + + #[test] + fn ignored_and_untracked_events_do_not_read_capacity() { + use std::sync::atomic::AtomicUsize; + + let reads = Arc::new(AtomicUsize::new(0)); + let snapshot = capacities(&[(1, 1_000)]); + let provider: Arc = { + let reads = Arc::clone(&reads); + Arc::new(move || { + reads.fetch_add(1, Ordering::Relaxed); + Arc::clone(&snapshot) + }) + }; + let classifier = ThunderAgentClassifier::new(config(), provider).unwrap(); + register(&classifier, "tracked", "session", 100, false); + reads.store(0, Ordering::Relaxed); + let worker = WorkerWithDpRank::new(1, 0); + for event in [ + ClassifyEvent::Responding { + request_id: "tracked".into(), + worker, + }, + ClassifyEvent::Responding { + request_id: "sessionless".into(), + worker, + }, + ClassifyEvent::Sent { + request_id: "sessionless".into(), + worker, + }, + ClassifyEvent::Completed { + request_id: "sessionless".into(), + worker, + context_tokens: Some(100), + }, + ClassifyEvent::Aborted { + request_id: "sessionless".into(), + worker: None, + error: None, + }, + ] { + classifier.inner.on_event(event); + } + assert_eq!(reads.load(Ordering::Relaxed), 0); + assert!( + classifier + .inner + .state + .lock() + .requests + .contains_key("tracked") + ); + } + + /// Run with `cargo test -p dynamo-custom-policy-builtin --release benchmark_ignored_events -- --ignored --nocapture`. + #[test] + #[ignore = "manual CPU benchmark"] + fn benchmark_ignored_events() { + use std::hint::black_box; + + for programs in [256, 10_000] { + let classifier = classifier(&[(1, 1_000_000)]); + register(&classifier, "tracked", "session", 100, false); + { + let mut state = classifier.inner.state.lock(); + for i in 1..programs { + let mut program = scheduler::Program::new(100); + program.assigned_worker = Some(WorkerWithDpRank::new(1, 0)); + state.programs.insert(format!("session-{i}"), program); + } + } + for responding in [true, false] { + let mut samples = Vec::new(); + for iteration in 0..35 { + let start = Instant::now(); + for _ in 0..100 { + let worker = WorkerWithDpRank::new(1, 0); + let event = if responding { + ClassifyEvent::Responding { + request_id: "tracked".into(), + worker, + } + } else { + ClassifyEvent::Completed { + request_id: "sessionless".into(), + worker, + context_tokens: None, + } + }; + classifier.inner.on_event(black_box(event)); + } + if iteration >= 5 { + samples.push(start.elapsed().as_nanos() / 100); + } + } + samples.sort_unstable(); + println!( + "programs={programs} responding={responding} median_ns={} p95_ns={}", + samples[samples.len() / 2], + samples[samples.len() * 95 / 100] + ); + } + } + } + + #[tokio::test] + async fn serializes_requests_for_one_session() { + let mut classifier = classifier(&[(1, 1_000)]); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + register(&classifier, "request-2", "session-a", 100, false); + + let second = tokio::spawn(await_release(pending(&classifier, "request-2"), ())); + tokio::task::yield_now().await; + assert!(!second.is_finished()); + + completed(&mut classifier, "request-1", 150).await; + second.await.unwrap().unwrap(); + } + + #[tokio::test] + async fn selects_a_worker_then_reconciles_the_sent_event() { + let mut classifier = classifier(&[(1, 300), (2, 1_000)]); + register(&classifier, "request-1", "session-a", 250, false); + release(&classifier, "request-1").await; + assert_eq!( + classifier.inner.state.lock().programs["session-a"].assigned_worker, + Some(WorkerWithDpRank::new(1, 0)) + ); + sent(&mut classifier, "request-1", 2).await; + assert_eq!( + classifier.inner.state.lock().programs["session-a"].assigned_worker, + Some(WorkerWithDpRank::new(2, 0)) + ); + } + + #[tokio::test] + async fn final_session_frees_capacity_at_admission_without_restoring_on_abort() { + let snapshot = capacities(&[(1, 250)]); + let provider: Arc = Arc::new(move || Arc::clone(&snapshot)); + let mut classifier = ThunderAgentClassifier::new( + ThunderAgentConfig { + scheduler_interval_seconds: 1.0, + ..config() + }, + provider, + ) + .unwrap(); + register(&classifier, "request-1", "session-a", 200, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + completed(&mut classifier, "request-1", 200).await; + + register(&classifier, "request-2", "session-b", 100, false); + assert_eq!( + status(&classifier.inner.state.lock(), "request-2"), + WaitStatus::Waiting + ); + + register(&classifier, "request-3", "session-a", 1, true); + release(&classifier, "request-3").await; + assert!( + !classifier + .inner + .state + .lock() + .programs + .contains_key("session-a") + ); + assert_eq!( + status(&classifier.inner.state.lock(), "request-2"), + WaitStatus::Waiting + ); + + let capacity = capacities(&[(1, 250)]); + classifier + .inner + .state + .lock() + .reconcile(&capacity, Instant::now()); + release(&classifier, "request-2").await; + + classifier + .on_event(ClassifyEvent::Aborted { + request_id: "request-3".to_owned(), + worker: Some(WorkerWithDpRank::new(1, 0)), + error: None, + }) + .await; + assert!( + !classifier + .inner + .state + .lock() + .programs + .contains_key("session-a") + ); + } + + #[tokio::test] + async fn final_session_waits_for_inflight_turn_then_removes_program() { + let mut classifier = classifier(&[(1, 1_000)]); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + register(&classifier, "request-2", "session-a", 1, true); + + assert_eq!( + status(&classifier.inner.state.lock(), "request-2"), + WaitStatus::Waiting + ); + assert!( + classifier + .inner + .state + .lock() + .programs + .contains_key("session-a") + ); + + completed(&mut classifier, "request-1", 150).await; + release(&classifier, "request-2").await; + assert!( + !classifier + .inner + .state + .lock() + .programs + .contains_key("session-a") + ); + } + + #[tokio::test] + async fn capacity_growth_resumes_a_pending_program() { + let current = Arc::new(Mutex::new(capacities(&[(1, 250)]))); + let provider: Arc = { + let current = Arc::clone(¤t); + Arc::new(move || Arc::clone(¤t.lock())) + }; + let mut classifier = ThunderAgentClassifier::new( + ThunderAgentConfig { + buffer_per_program: 100, + ..config() + }, + provider, + ) + .unwrap(); + + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + register(&classifier, "request-2", "session-b", 100, false); + assert_eq!( + status(&classifier.inner.state.lock(), "request-2"), + WaitStatus::Waiting + ); + + *current.lock() = capacities(&[(1, 500)]); + release(&classifier, "request-2").await; + } + + #[tokio::test] + async fn pressure_pauses_an_acting_program_and_capacity_resumes_it() { + let current = Arc::new(Mutex::new(capacities(&[(1, 500)]))); + let provider: Arc = { + let current = Arc::clone(¤t); + Arc::new(move || Arc::clone(¤t.lock())) + }; + let mut classifier = ThunderAgentClassifier::new( + ThunderAgentConfig { + buffer_per_program: 100, + scheduler_interval_seconds: 0.05, + ..config() + }, + provider, + ) + .unwrap(); + + register(&classifier, "request-1", "session-a", 400, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + completed(&mut classifier, "request-1", 400).await; + assert_eq!( + classifier.inner.state.lock().programs["session-a"].lifecycle, + ProgramLifecycle::Active + ); + tokio::time::timeout(Duration::from_millis(200), async { + loop { + if classifier.inner.state.lock().programs["session-a"].lifecycle + == ProgramLifecycle::Paused + { + break; + } + tokio::time::sleep(Duration::from_millis(1)).await; + } + }) + .await + .unwrap(); + + *current.lock() = capacities(&[(1, 1_000)]); + register(&classifier, "request-2", "session-a", 400, false); + tokio::time::timeout( + Duration::from_millis(200), + release(&classifier, "request-2"), + ) + .await + .unwrap(); + assert_eq!( + classifier.inner.state.lock().programs["session-a"].lifecycle, + ProgramLifecycle::Active + ); + } + + #[tokio::test] + async fn sent_event_reconciles_the_actual_worker() { + let mut classifier = classifier(&[(1, 1_000), (2, 1_000)]); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 2).await; + + assert_eq!( + classifier.inner.state.lock().programs["session-a"].assigned_worker, + Some(WorkerWithDpRank::new(2, 0)) + ); + } + + #[tokio::test] + async fn live_worker_without_a_model_card_keeps_its_session_assignment() { + let worker_1 = WorkerWithDpRank::new(1, 0); + let worker_2 = WorkerWithDpRank::new(2, 0); + let current = Arc::new(Mutex::new(Arc::new( + WorkerCapacitySnapshot::new([(worker_1, 1_000), (worker_2, 1_000)]) + .with_live_workers([worker_1, worker_2]), + ))); + let provider: Arc = { + let current = Arc::clone(¤t); + Arc::new(move || Arc::clone(¤t.lock())) + }; + let mut classifier = ThunderAgentClassifier::new(config(), provider).unwrap(); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + completed(&mut classifier, "request-1", 100).await; + + *current.lock() = Arc::new( + WorkerCapacitySnapshot::new([(worker_2, 1_000)]) + .with_live_workers([worker_1, worker_2]), + ); + register(&classifier, "request-2", "session-a", 100, false); + release(&classifier, "request-2").await; + + assert_eq!( + classifier.inner.state.lock().programs["session-a"].assigned_worker, + Some(worker_1) + ); + + completed(&mut classifier, "request-2", 100).await; + *current.lock() = Arc::new( + WorkerCapacitySnapshot::new([(worker_2, 1_000)]).with_live_workers([worker_2]), + ); + register(&classifier, "request-3", "session-a", 100, false); + release(&classifier, "request-3").await; + sent(&mut classifier, "request-3", 2).await; + assert_eq!( + classifier.inner.state.lock().programs["session-a"].assigned_worker, + Some(worker_2) + ); + } + + #[tokio::test] + async fn stale_capacity_card_is_not_used_for_assignment() { + let worker_1 = WorkerWithDpRank::new(1, 0); + let worker_2 = WorkerWithDpRank::new(2, 0); + let snapshot = Arc::new( + WorkerCapacitySnapshot::new([(worker_1, 1_000), (worker_2, 1_000)]) + .with_live_workers([worker_2]), + ); + let provider: Arc = Arc::new(move || Arc::clone(&snapshot)); + let mut classifier = ThunderAgentClassifier::new(config(), provider).unwrap(); + + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 2).await; + + assert_eq!( + classifier.inner.state.lock().programs["session-a"].assigned_worker, + Some(worker_2) + ); + } + + #[tokio::test] + async fn authoritative_empty_liveness_clears_the_last_assignment() { + let worker = WorkerWithDpRank::new(1, 0); + let current = Arc::new(Mutex::new(Arc::new( + WorkerCapacitySnapshot::new([(worker, 1_000)]).with_live_workers([worker]), + ))); + let provider: Arc = { + let current = Arc::clone(¤t); + Arc::new(move || Arc::clone(¤t.lock())) + }; + let mut classifier = ThunderAgentClassifier::new(config(), provider).unwrap(); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + completed(&mut classifier, "request-1", 100).await; + + *current.lock() = Arc::new( + WorkerCapacitySnapshot::default() + .with_live_workers(std::iter::empty::()), + ); + register(&classifier, "request-2", "session-a", 100, false); + release(&classifier, "request-2").await; + + assert_eq!( + classifier.inner.state.lock().programs["session-a"].assigned_worker, + None + ); + } + + #[tokio::test] + async fn missing_capacity_respects_pause_until_timeout() { + let worker = WorkerWithDpRank::new(1, 0); + let current = Arc::new(Mutex::new(Arc::new( + WorkerCapacitySnapshot::new([(worker, 250)]).with_live_workers([worker]), + ))); + let provider: Arc = { + let current = Arc::clone(¤t); + Arc::new(move || Arc::clone(¤t.lock())) + }; + let mut classifier = ThunderAgentClassifier::new( + ThunderAgentConfig { + buffer_per_program: 100, + resume_timeout_seconds: 0.02, + ..config() + }, + provider, + ) + .unwrap(); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + register(&classifier, "request-2", "session-b", 100, false); + assert_eq!( + status(&classifier.inner.state.lock(), "request-2"), + WaitStatus::Waiting + ); + + *current.lock() = Arc::new(WorkerCapacitySnapshot::default().with_live_workers([worker])); + tokio::time::sleep(Duration::from_millis(10)).await; + assert_eq!( + status(&classifier.inner.state.lock(), "request-2"), + WaitStatus::Waiting + ); + + tokio::time::timeout( + Duration::from_millis(100), + release(&classifier, "request-2"), + ) + .await + .unwrap(); + } + + #[tokio::test] + async fn retained_session_expires_before_its_next_request() { + let snapshot = capacities(&[(1, 1_000)]); + let provider: Arc = Arc::new(move || Arc::clone(&snapshot)); + let mut classifier = ThunderAgentClassifier::new( + ThunderAgentConfig { + session_retention_seconds: 0.005, + ..config() + }, + provider, + ) + .unwrap(); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + completed(&mut classifier, "request-1", 100).await; + tokio::time::sleep(Duration::from_millis(10)).await; + + register(&classifier, "request-2", "session-a", 100, false); + release(&classifier, "request-2").await; + + assert_eq!( + classifier.inner.state.lock().programs["session-a"].step_count, + 1 + ); + } + + #[test] + fn tracked_request_limit_is_enforced_before_allocating_state() { + let snapshot = capacities(&[(1, 1_000)]); + let provider: Arc = Arc::new(move || Arc::clone(&snapshot)); + let classifier = ThunderAgentClassifier::new( + ThunderAgentConfig { + max_tracked_requests: 1, + ..config() + }, + provider, + ) + .unwrap(); + register(&classifier, "request-1", "session-a", 100, false); + + let result = classifier.inner.register( + "request-2".into(), + "session-b".into(), + 100, + RequestProgress::new(100).0, + false, + ); + assert!(matches!( + result, + Err(ThunderAgentError::RequestLimitExceeded { limit: 1 }) + )); + assert_eq!(classifier.inner.state.lock().requests.len(), 1); + } + + #[tokio::test] + async fn retained_programs_are_bounded_by_the_tracking_limit() { + let snapshot = capacities(&[(1, 1_000)]); + let provider: Arc = Arc::new(move || Arc::clone(&snapshot)); + let mut classifier = ThunderAgentClassifier::new( + ThunderAgentConfig { + max_tracked_requests: 2, + ..config() + }, + provider, + ) + .unwrap(); + + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + completed(&mut classifier, "request-1", 100).await; + tokio::time::sleep(Duration::from_millis(1)).await; + register(&classifier, "request-2", "session-b", 100, false); + release(&classifier, "request-2").await; + completed(&mut classifier, "request-2", 100).await; + + register(&classifier, "request-3", "session-c", 100, false); + release(&classifier, "request-3").await; + + let state = classifier.inner.state.lock(); + assert_eq!(state.programs.len(), 2); + assert!(!state.programs.contains_key("session-a")); + assert!(state.programs.contains_key("session-b")); + assert!(state.programs.contains_key("session-c")); + } + + #[tokio::test] + async fn arrival_tombstones_are_compacted_amortized() { + let mut classifier = classifier(&[(1, 1_000)]); + for sequence in 0..2_000 { + let request_id = format!("request-{sequence}"); + let session_id = format!("session-{sequence}"); + register(&classifier, &request_id, &session_id, 1, true); + assert!(matches!( + status(&classifier.inner.state.lock(), &request_id), + WaitStatus::Released(_) + )); + completed(&mut classifier, &request_id, 1).await; + } + + let state = classifier.inner.state.lock(); + assert!(state.arrival_order.len() <= 256); + assert!(state.requests.is_empty()); + assert!(state.programs.is_empty()); + } + + #[test] + fn releases_a_large_backlog_without_per_release_linear_removal() { + const REQUESTS: usize = 5_000; + + let classifier = classifier(&[(1, 1)]); + for sequence in 0..REQUESTS { + register( + &classifier, + &format!("request-{sequence}"), + &format!("session-{sequence}"), + 100, + false, + ); + } + + let expanded = capacities(&[(1, 1_000_000)]); + let mut state = classifier.inner.state.lock(); + state.reconcile(&expanded, Instant::now()); + + assert_eq!( + (0..REQUESTS) + .filter(|sequence| { + matches!( + status(&state, &format!("request-{sequence}")), + WaitStatus::Released(_) + ) + }) + .count(), + REQUESTS + ); + assert!(state.arrival_order.len() <= 256); + } + + #[tokio::test] + async fn aborted_request_rolls_back_new_program() { + let mut classifier = classifier(&[(1, 1_000)]); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + classifier + .on_event(ClassifyEvent::Aborted { + request_id: "request-1".to_owned(), + worker: None, + error: None, + }) + .await; + + let state = classifier.inner.state.lock(); + assert!(!state.programs.contains_key("session-a")); + assert!(!state.requests.contains_key("request-1")); + } + + #[tokio::test] + async fn dropping_pending_classification_rolls_back_its_program() { + let mut classifier = classifier(&[(1, 100)]); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + register(&classifier, "request-2", "session-b", 100, false); + + let result = tokio::time::timeout( + Duration::from_millis(20), + await_release(pending(&classifier, "request-2"), ()), + ) + .await; + assert!(result.is_err()); + + let state = classifier.inner.state.lock(); + assert!(!state.programs.contains_key("session-b")); + assert!(!state.requests.contains_key("request-2")); + } + + #[tokio::test] + async fn dropping_an_unpolled_classification_rolls_back_its_program() { + let mut classifier = classifier(&[(1, 100)]); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + sent(&mut classifier, "request-1", 1).await; + register(&classifier, "request-2", "session-b", 100, false); + + let future = await_release(pending(&classifier, "request-2"), ()); + drop(future); + + let state = classifier.inner.state.lock(); + assert!(!state.programs.contains_key("session-b")); + assert!(!state.requests.contains_key("request-2")); + } + + #[tokio::test] + async fn timeout_forces_release_on_the_least_loaded_worker() { + let config = ThunderAgentConfig { + scheduler_interval_seconds: 0.005, + resume_timeout_seconds: 0.02, + session_retention_seconds: 1.0, + buffer_per_program: 0, + ..Default::default() + }; + let snapshot = capacities(&[(1, 100)]); + let provider: Arc = Arc::new(move || Arc::clone(&snapshot)); + let classifier = ThunderAgentClassifier::new(config, provider).unwrap(); + register(&classifier, "request-1", "session-a", 200, false); + + tokio::time::timeout( + Duration::from_millis(200), + release(&classifier, "request-1"), + ) + .await + .unwrap(); + assert_eq!( + status(&classifier.inner.state.lock(), "request-1"), + WaitStatus::Released(Some(WorkerWithDpRank::new(1, 0))) + ); + } + + #[tokio::test] + async fn cold_start_without_model_cards_flows_through() { + let classifier = classifier(&[]); + register(&classifier, "request-1", "session-a", 100, false); + release(&classifier, "request-1").await; + } +} diff --git a/lib/router-plugins/builtin/src/thunderagent/request_classifier/scheduler.rs b/lib/router-plugins/builtin/src/thunderagent/request_classifier/scheduler.rs new file mode 100644 index 000000000000..f5a2f03c000c --- /dev/null +++ b/lib/router-plugins/builtin/src/thunderagent/request_classifier/scheduler.rs @@ -0,0 +1,1636 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::cmp::Reverse; +use std::collections::{HashMap, HashSet, VecDeque}; +use std::sync::Arc; +use std::time::{Duration, Instant}; + +use dynamo_kv_router::plugins::request_classifier::{ClassifyEvent, RequestProgress}; +use dynamo_kv_router::protocols::WorkerWithDpRank; +use tokio::sync::Notify; + +use super::super::ThunderAgentConfig; +use super::ThunderAgentError; +use super::capacity::WorkerCapacitySnapshot; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum ProgramStatus { + Reasoning, + Acting, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum ProgramLifecycle { + Active, + Paused, +} + +#[derive(Debug, Clone)] +pub(crate) struct Program { + status: ProgramStatus, + pub(crate) lifecycle: ProgramLifecycle, + pub(crate) assigned_worker: Option, + token_total: usize, + request_progress: Option, + pub(crate) step_count: usize, + marked_for_pause: bool, + acting_since: Option, + deferred_since: Option, +} + +impl Program { + pub(crate) fn new(input_tokens: usize) -> Self { + Self { + status: ProgramStatus::Reasoning, + lifecycle: ProgramLifecycle::Active, + assigned_worker: None, + token_total: input_tokens, + request_progress: None, + step_count: 1, + marked_for_pause: false, + acting_since: None, + deferred_since: None, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum RequestPhase { + Waiting, + Released, +} + +pub(crate) struct RequestState { + session_id: String, + input_tokens: usize, + progress: RequestProgress, + session_final: bool, + phase: RequestPhase, + prior_program: Option, + began_program: bool, + placement_target: Option, + pub(crate) notify: Arc, +} + +pub(crate) struct RequestRegistration { + request_id: String, + session_id: String, + input_tokens: usize, + progress: RequestProgress, + session_final: bool, +} + +impl RequestRegistration { + pub(crate) fn new( + request_id: String, + session_id: String, + input_tokens: usize, + progress: RequestProgress, + session_final: bool, + ) -> Self { + Self { + request_id, + session_id, + input_tokens, + progress, + session_final, + } + } +} + +#[derive(Clone)] +pub(crate) struct WaitingRequest { + request_id: String, + notify: Arc, +} + +impl WaitingRequest { + fn is_waiting(&self, requests: &HashMap) -> bool { + requests.get(&self.request_id).is_some_and(|request| { + request.phase == RequestPhase::Waiting && Arc::ptr_eq(&self.notify, &request.notify) + }) + } +} + +#[derive(Default)] +struct SessionRequests { + current: Option, + waiting: VecDeque, + stale_waiting: usize, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum WaitStatus { + Waiting, + Released(Option), + Missing, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) struct StateTelemetry { + pub(crate) programs: usize, + pub(crate) active_programs: usize, + pub(crate) paused_programs: usize, + pub(crate) marked_for_pause: usize, + pub(crate) waiting_requests: usize, + pub(crate) tracked_requests: usize, +} + +pub(crate) struct ReconcileOutcome { + pub(crate) changed: bool, + pub(crate) forced_resumes: usize, +} + +#[derive(Default, Clone, Copy)] +struct WorkerUsage { + used: usize, + decayed: usize, +} + +#[derive(Default)] +struct PauseCandidates { + acting: Vec<(usize, String)>, + reasoning: Vec<(usize, String)>, +} + +impl WorkerUsage { + fn add_program(&mut self, normal: usize, decayed: usize, buffer: usize) { + self.used = self.used.saturating_add(normal).saturating_add(buffer); + self.decayed = self.decayed.saturating_add(decayed).saturating_add(buffer); + } + + fn remove_program(&mut self, normal: usize, decayed: usize, buffer: usize) { + self.used = self.used.saturating_sub(normal).saturating_sub(buffer); + self.decayed = self.decayed.saturating_sub(decayed).saturating_sub(buffer); + } +} + +pub(crate) struct State { + config: ThunderAgentConfig, + pub(crate) programs: HashMap, + paused_programs: HashSet, + marked_for_pause: usize, + normal_usage: HashMap, + pub(crate) requests: HashMap, + sessions: HashMap, + pub(crate) arrival_order: VecDeque, + waiting_arrivals: HashSet, + next_retention_expiry: Option, + capacity_snapshot_id: Option, +} + +impl State { + pub(crate) fn new(config: ThunderAgentConfig) -> Self { + Self { + config, + programs: HashMap::new(), + paused_programs: HashSet::new(), + marked_for_pause: 0, + normal_usage: HashMap::new(), + requests: HashMap::new(), + sessions: HashMap::new(), + arrival_order: VecDeque::new(), + waiting_arrivals: HashSet::new(), + next_retention_expiry: None, + capacity_snapshot_id: None, + } + } + + pub(crate) fn register( + &mut self, + request: RequestRegistration, + capacities: &WorkerCapacitySnapshot, + now: Instant, + ) -> Result, ThunderAgentError> { + let RequestRegistration { + request_id, + session_id, + input_tokens, + progress, + session_final, + } = request; + if self.requests.contains_key(&request_id) { + return Err(ThunderAgentError::DuplicateRequestId(request_id)); + } + if self.requests.len() >= self.config.max_tracked_requests { + return Err(ThunderAgentError::RequestLimitExceeded { + limit: self.config.max_tracked_requests, + }); + } + self.refresh_normal_usage(); + self.expire_retained_programs(now); + if !session_final { + self.ensure_program_capacity(&session_id)?; + } + self.clear_removed_workers(capacities); + let notify = Arc::new(Notify::new()); + // Keep registration identity with tombstones so reused IDs cannot revive them. + let waiting = WaitingRequest { + request_id: request_id.clone(), + notify: Arc::clone(¬ify), + }; + + self.sessions + .entry(session_id.clone()) + .or_default() + .waiting + .push_back(waiting.clone()); + self.arrival_order.push_back(waiting); + self.waiting_arrivals.insert(request_id.clone()); + self.requests.insert( + request_id.clone(), + RequestState { + session_id, + input_tokens, + progress, + session_final, + phase: RequestPhase::Waiting, + prior_program: None, + began_program: false, + placement_target: None, + notify: Arc::clone(¬ify), + }, + ); + + self.admit_request(&request_id, capacities, now); + self.compact_arrival_order(); + Ok(notify) + } + + pub(crate) fn wait_status(&self, request_id: &str, notify: &Arc) -> WaitStatus { + match self.requests.get(request_id) { + Some(request) if !Arc::ptr_eq(&request.notify, notify) => WaitStatus::Missing, + Some(request) if request.phase == RequestPhase::Waiting => WaitStatus::Waiting, + Some(request) => WaitStatus::Released(request.placement_target), + None => WaitStatus::Missing, + } + } + + pub(crate) fn telemetry(&self) -> StateTelemetry { + let paused_programs = self.paused_programs.len(); + StateTelemetry { + programs: self.programs.len(), + active_programs: self.programs.len().saturating_sub(paused_programs), + paused_programs, + marked_for_pause: self.marked_for_pause, + waiting_requests: self.waiting_arrivals.len(), + tracked_requests: self.requests.len(), + } + } + + fn ensure_program_capacity(&mut self, session_id: &str) -> Result<(), ThunderAgentError> { + if self.programs.contains_key(session_id) + || self.programs.len() < self.config.max_tracked_requests + { + return Ok(()); + } + + let evicted = self + .programs + .iter() + .filter(|(candidate, _)| !self.sessions.contains_key(candidate.as_str())) + .min_by_key(|(_, program)| program.acting_since) + .map(|(candidate, _)| candidate.clone()); + let Some(evicted) = evicted else { + return Err(ThunderAgentError::ProgramLimitExceeded { + limit: self.config.max_tracked_requests, + }); + }; + self.remove_program(&evicted); + Ok(()) + } + + fn program_charge(&self, program: &Program) -> Option<(WorkerWithDpRank, usize)> { + if program.lifecycle != ProgramLifecycle::Active { + return None; + } + let worker = program.assigned_worker?; + let tokens = if program.status == ProgramStatus::Acting { + scale_tokens( + current_token_total(program), + self.config.acting_token_weight, + ) + } else { + current_token_total(program) + }; + Some(( + worker, + tokens.saturating_add(self.config.buffer_per_program), + )) + } + + fn subtract_charge(&mut self, charge: Option<(WorkerWithDpRank, usize)>) { + let Some((worker, tokens)) = charge else { + return; + }; + let Some(used) = self.normal_usage.get_mut(&worker) else { + return; + }; + *used = used.saturating_sub(tokens); + if *used == 0 { + self.normal_usage.remove(&worker); + } + } + + fn add_charge(&mut self, charge: Option<(WorkerWithDpRank, usize)>) { + if let Some((worker, tokens)) = charge { + let used = self.normal_usage.entry(worker).or_default(); + *used = used.saturating_add(tokens); + } + } + + fn refresh_normal_usage(&mut self) { + let mut normal_usage = HashMap::::new(); + for program in self.programs.values() { + if let Some((worker, tokens)) = self.program_charge(program) { + let used = normal_usage.entry(worker).or_default(); + *used = used.saturating_add(tokens); + } + } + self.normal_usage = normal_usage; + } + + fn update_program( + &mut self, + session_id: &str, + update: impl FnOnce(&mut Program) -> R, + ) -> Option { + let program = self.programs.get(session_id)?; + let before = self.program_charge(program); + self.marked_for_pause -= usize::from(program.marked_for_pause); + self.subtract_charge(before); + let result = update(self.programs.get_mut(session_id)?); + let (after, paused, marked_for_pause) = self.programs.get(session_id).map(|program| { + ( + self.program_charge(program), + program.lifecycle == ProgramLifecycle::Paused, + program.marked_for_pause, + ) + })?; + self.marked_for_pause += usize::from(marked_for_pause); + self.add_charge(after); + if paused { + self.paused_programs.insert(session_id.to_owned()); + } else { + self.paused_programs.remove(session_id); + } + Some(result) + } + + fn insert_program(&mut self, session_id: String, program: Program) { + let charge = self.program_charge(&program); + let paused = program.lifecycle == ProgramLifecycle::Paused; + debug_assert!(!self.programs.contains_key(&session_id)); + self.marked_for_pause += usize::from(program.marked_for_pause); + self.programs.insert(session_id.clone(), program); + self.add_charge(charge); + if paused { + self.paused_programs.insert(session_id.clone()); + } + } + + fn remove_program(&mut self, session_id: &str) -> Option { + let program = self.programs.remove(session_id)?; + self.marked_for_pause -= usize::from(program.marked_for_pause); + let charge = self.program_charge(&program); + self.subtract_charge(charge); + self.paused_programs.remove(session_id); + Some(program) + } + + fn replace_program(&mut self, session_id: String, program: Program) { + self.remove_program(&session_id); + self.insert_program(session_id, program); + } + + pub(crate) fn reconcile( + &mut self, + capacities: &WorkerCapacitySnapshot, + now: Instant, + ) -> ReconcileOutcome { + self.refresh_normal_usage(); + let mut changed = self.expire_retained_programs(now); + changed |= self.clear_removed_workers(capacities); + changed |= self.admit_front_requests(capacities, now); + let mut usage = self.worker_usage(now); + changed |= self.greedy_resume(capacities, &mut usage, now); + let forced_resumes = self.force_timed_out(capacities, &mut usage, now); + changed |= forced_resumes > 0; + changed |= self.pause_until_safe(capacities, &mut usage, now); + self.compact_arrival_order(); + ReconcileOutcome { + changed, + forced_resumes, + } + } + + pub(crate) fn scheduler_interval(&self) -> Duration { + self.config.scheduler_interval() + } + + pub(crate) fn needs_reconcile(&self) -> bool { + !self.programs.is_empty() + } + + fn admit_front_requests(&mut self, capacities: &WorkerCapacitySnapshot, now: Instant) -> bool { + let candidates: Vec = self + .arrival_order + .iter() + .filter_map(|waiting| { + let request_id = &waiting.request_id; + let request = self.requests.get(request_id)?; + (request.phase == RequestPhase::Waiting + && Arc::ptr_eq(&waiting.notify, &request.notify) + && self.is_front_and_idle(request_id, request)) + .then(|| request_id.clone()) + }) + .collect(); + + let mut changed = false; + for request_id in candidates { + changed |= self.admit_request(&request_id, capacities, now); + } + changed + } + + fn admit_request( + &mut self, + request_id: &str, + capacities: &WorkerCapacitySnapshot, + now: Instant, + ) -> bool { + let Some(request) = self.requests.get(request_id) else { + return false; + }; + if request.phase != RequestPhase::Waiting || !self.is_front_and_idle(request_id, request) { + return false; + } + if request.session_final { + return self.begin_session_final(request_id); + } + if !self.begin_request(request_id) { + return false; + } + + let Some(request) = self.requests.get(request_id) else { + return false; + }; + let session_id = request.session_id.clone(); + let input_tokens = request.input_tokens; + let was_new = request.prior_program.is_none(); + let Some(program) = self.programs.get(&session_id) else { + return false; + }; + let lifecycle = program.lifecycle; + let assigned_worker = program.assigned_worker; + + if lifecycle == ProgramLifecycle::Paused { + return self.defer_program(&session_id, now); + } + + if !capacities.has_usable_capacity() { + return self.release_request( + request_id, + assigned_worker.filter(|worker| capacities.is_live(*worker)), + ); + } + + let mut changed = false; + if let Some(worker) = assigned_worker { + if capacities.is_live(worker) { + return self.release_request(request_id, Some(worker)); + } + self.set_assignment(&session_id, None); + changed = true; + } + + if was_new && !self.paused_programs.is_empty() { + return self.defer_program(&session_id, now) || changed; + } + + let required = self.request_cost(input_tokens); + let selected = capacities + .iter() + .filter(|(worker, _)| capacities.is_live(*worker)) + .filter_map(|(worker, capacity)| { + let used = self.normal_usage.get(&worker).copied().unwrap_or(0); + capacity + .checked_sub(used) + .is_some_and(|remaining| remaining >= required) + .then_some((worker, used)) + }) + .min_by_key(|(worker, used)| (*used, *worker)) + .map(|(worker, _)| worker); + match selected { + Some(worker) => self.release_request(request_id, Some(worker)) || changed, + None => self.defer_program(&session_id, now) || changed, + } + } + + fn begin_session_final(&mut self, request_id: &str) -> bool { + let Some(request) = self.requests.get(request_id) else { + return false; + }; + if request.began_program { + return false; + } + let session_id = request.session_id.clone(); + let assigned_worker = self + .programs + .get(&session_id) + .and_then(|program| program.assigned_worker); + self.remove_program(&session_id); + if let Some(request) = self.requests.get_mut(request_id) { + request.prior_program = None; + request.began_program = true; + } + self.release_request(request_id, assigned_worker) + } + + fn begin_request(&mut self, request_id: &str) -> bool { + let Some(request) = self.requests.get(request_id) else { + return false; + }; + if request.began_program { + return true; + } + let session_id = request.session_id.clone(); + let input_tokens = request.input_tokens; + let progress = request.progress.clone(); + let prior_program = self.programs.get(&session_id).cloned(); + + if self.programs.contains_key(&session_id) { + self.update_program(&session_id, |program| { + program.status = ProgramStatus::Reasoning; + if input_tokens > 0 { + program.token_total = input_tokens; + } + program.request_progress = Some(progress); + program.step_count = program.step_count.saturating_add(1); + program.acting_since = None; + }); + } else { + let mut program = Program::new(input_tokens); + program.request_progress = Some(progress); + self.insert_program(session_id, program); + } + if let Some(request) = self.requests.get_mut(request_id) { + request.prior_program = prior_program; + request.began_program = true; + } + true + } + + fn defer_program(&mut self, session_id: &str, now: Instant) -> bool { + let Some(program) = self.programs.get(session_id) else { + return false; + }; + let lifecycle_changed = program.lifecycle != ProgramLifecycle::Paused; + let timer_changed = program.deferred_since.is_none(); + let assignment_changed = program.assigned_worker.is_some(); + self.update_program(session_id, |program| { + program.lifecycle = ProgramLifecycle::Paused; + program.deferred_since.get_or_insert(now); + program.assigned_worker = None; + }); + lifecycle_changed || timer_changed || assignment_changed + } + + fn release_request(&mut self, request_id: &str, worker: Option) -> bool { + let Some(request) = self.requests.get(request_id) else { + return false; + }; + if request.phase != RequestPhase::Waiting + || !request.began_program + || !self.is_front_and_idle(request_id, request) + { + return false; + } + let session_id = request.session_id.clone(); + let session_final = request.session_final; + let program_assignment = self + .programs + .get(&session_id) + .and_then(|program| program.assigned_worker); + if !session_final && !self.programs.contains_key(&session_id) { + return false; + } + let assigned_worker = worker.or(program_assignment); + if self + .sessions + .get(&session_id) + .and_then(|session| session.waiting.front()) + .map(|waiting| waiting.request_id.as_str()) + != Some(request_id) + { + return false; + } + + if !session_final { + self.update_program(&session_id, |program| { + program.lifecycle = ProgramLifecycle::Active; + program.deferred_since = None; + program.assigned_worker = assigned_worker; + }); + } + + let Some(session) = self.sessions.get_mut(&session_id) else { + return false; + }; + session.waiting.pop_front(); + session.current = Some(request_id.to_owned()); + + let notify = if let Some(request) = self.requests.get_mut(request_id) { + request.phase = RequestPhase::Released; + request.placement_target = assigned_worker; + Arc::clone(&request.notify) + } else { + return false; + }; + self.remove_waiting_arrival(request_id); + notify.notify_waiters(); + true + } + + fn greedy_resume( + &mut self, + capacities: &WorkerCapacitySnapshot, + usage: &mut HashMap, + now: Instant, + ) -> bool { + let ceiling = (self.config.pause_threshold - self.config.resume_hysteresis).max(0.0); + let mut remaining: Vec<(WorkerWithDpRank, usize)> = capacities + .iter() + .filter(|(worker, _)| capacities.is_live(*worker)) + .filter_map(|(worker, capacity)| { + let limit = scale_tokens(capacity, ceiling); + let available = limit.saturating_sub(usage.get(&worker).map_or(0, |u| u.used)); + (available > self.config.buffer_per_program).then_some((worker, available)) + }) + .collect(); + sort_capacities(&mut remaining); + if remaining.is_empty() { + return false; + } + let original_remaining = remaining.clone(); + let mut paused: Vec = self + .paused_programs + .iter() + .filter(|session_id| self.programs.contains_key(*session_id)) + .cloned() + .collect(); + debug_assert!( + paused + .iter() + .all(|session_id| self.programs[session_id].assigned_worker.is_none()) + ); + paused.sort_unstable_by(|left, right| { + self.resume_group(left) + .cmp(&self.resume_group(right)) + .then_with(|| { + current_token_total(&self.programs[left]) + .cmp(¤t_token_total(&self.programs[right])) + }) + .then_with(|| left.cmp(right)) + }); + + let total_capacity = remaining + .iter() + .map(|(_, available)| *available) + .fold(0usize, usize::saturating_add); + let mut cumulative = 0usize; + let mut selected = paused + .into_iter() + .filter_map(|session_id| { + let required = self.buffered_program_tokens(&session_id); + (cumulative.saturating_add(required) <= total_capacity).then(|| { + cumulative = cumulative.saturating_add(required); + (session_id, required) + }) + }) + .collect::>(); + + selected.sort_unstable_by(|(left, _), (right, _)| { + current_token_total(&self.programs[right]) + .cmp(¤t_token_total(&self.programs[left])) + .then_with(|| left.cmp(right)) + }); + let mut packed_capacity = original_remaining; + let mut assignments = HashMap::with_capacity(selected.len()); + for (session_id, required) in &selected { + let Some(position) = packed_capacity + .iter() + .position(|(_, available)| *required <= *available) + else { + continue; + }; + let worker = packed_capacity[position].0; + assignments.insert(session_id.clone(), worker); + reserve_capacity( + &mut packed_capacity, + position, + *required, + self.config.buffer_per_program, + ); + } + + let mut changed = false; + for (session_id, required) in selected { + let Some(&worker) = assignments.get(&session_id) else { + continue; + }; + if self.resume_program(&session_id, Some(worker)) { + let Some(program) = self.programs.get(&session_id) else { + continue; + }; + let worker_usage = usage.entry(worker).or_default(); + worker_usage.used = worker_usage.used.saturating_add(required); + worker_usage.decayed = worker_usage + .decayed + .saturating_add(self.program_tokens(program, true, now)) + .saturating_add(self.config.buffer_per_program); + changed = true; + } + } + changed + } + + fn resume_group(&self, session_id: &str) -> u8 { + let program = &self.programs[session_id]; + if program.step_count <= 1 { + 1 + } else if program.status == ProgramStatus::Reasoning { + 0 + } else { + 2 + } + } + + fn buffered_program_tokens(&self, session_id: &str) -> usize { + current_token_total(&self.programs[session_id]) + .saturating_add(self.config.buffer_per_program) + } + + fn force_timed_out( + &mut self, + capacities: &WorkerCapacitySnapshot, + usage: &mut HashMap, + now: Instant, + ) -> usize { + let timeout = self.config.resume_timeout(); + let timed_out: Vec = self + .paused_programs + .iter() + .filter(|session_id| { + self.programs.get(*session_id).is_some_and(|program| { + program + .deferred_since + .is_some_and(|since| now.saturating_duration_since(since) >= timeout) + }) + }) + .cloned() + .collect(); + + let mut forced_resumes = 0; + for session_id in timed_out { + let target = capacities + .iter() + .filter(|(worker, _)| capacities.is_live(*worker)) + .max_by_key(|(worker, capacity)| { + ( + *capacity as i128 + - usage.get(worker).map_or(0, |usage| usage.decayed) as i128, + Reverse(*worker), + ) + }) + .map(|(worker, _)| worker); + if target.is_none() && !capacities.has_live_worker() { + continue; + } + if self.resume_program(&session_id, target) { + if let Some(worker) = target { + let Some(program) = self.programs.get(&session_id) else { + continue; + }; + usage.entry(worker).or_default().add_program( + self.program_tokens(program, false, now), + self.program_tokens(program, true, now), + self.config.buffer_per_program, + ); + } + forced_resumes += 1; + } + } + forced_resumes + } + + fn resume_program(&mut self, session_id: &str, worker: Option) -> bool { + let Some(program) = self.programs.get(session_id) else { + return false; + }; + if program.lifecycle != ProgramLifecycle::Paused { + return false; + } + self.update_program(session_id, |program| { + program.lifecycle = ProgramLifecycle::Active; + program.deferred_since = None; + program.assigned_worker = worker; + }); + + let pending = self.sessions.get(session_id).and_then(|session| { + session + .current + .is_none() + .then(|| { + session + .waiting + .front() + .map(|waiting| waiting.request_id.clone()) + }) + .flatten() + }); + if let Some(request_id) = pending { + self.release_request(&request_id, worker); + } + true + } + + fn pause_until_safe( + &mut self, + capacities: &WorkerCapacitySnapshot, + usage: &mut HashMap, + now: Instant, + ) -> bool { + let mut candidates = HashMap::::new(); + for (worker, capacity) in capacities.iter() { + let threshold = scale_tokens(capacity, self.config.pause_threshold); + if usage.get(&worker).map_or(0, |usage| usage.used) > threshold { + candidates.insert(worker, PauseCandidates::default()); + } + } + if candidates.is_empty() { + return false; + } + let single_worker = if candidates.len() == 1 { + candidates.keys().next().copied() + } else { + None + }; + + // Group after resumes and timeouts have updated assignments and usage. + // Only overloaded ranks need candidates; scan the program table once. + for (session_id, program) in &self.programs { + if program.lifecycle != ProgramLifecycle::Active || program.marked_for_pause { + continue; + } + let Some(worker) = program.assigned_worker else { + continue; + }; + // Avoid hashing unrelated ranks when only one rank needs pausing. + if single_worker.is_some_and(|single| worker != single) { + continue; + } + let Some(candidates) = candidates.get_mut(&worker) else { + continue; + }; + let group = match program.status { + ProgramStatus::Acting => &mut candidates.acting, + ProgramStatus::Reasoning => &mut candidates.reasoning, + }; + group.push((current_token_total(program), session_id.clone())); + } + + let mut changed = false; + for (worker, capacity) in capacities.iter() { + let Some(PauseCandidates { + mut acting, + mut reasoning, + }) = candidates.remove(&worker) + else { + continue; + }; + let target = scale_tokens(capacity, self.config.pause_target); + acting.sort_by_key(|(tokens, _)| *tokens); + reasoning.sort_by_key(|(tokens, _)| *tokens); + + for (_, session_id) in acting { + if usage.get(&worker).map_or(0, |usage| usage.used) <= target { + break; + } + let Some(program) = self.programs.get(&session_id) else { + continue; + }; + let normal = self.program_tokens(program, false, now); + let decayed = self.program_tokens(program, true, now); + if self.pause_acting(&session_id) { + usage.entry(worker).or_default().remove_program( + normal, + decayed, + self.config.buffer_per_program, + ); + changed = true; + } + } + if usage.get(&worker).map_or(0, |usage| usage.used) > target { + for (_, session_id) in reasoning { + if self + .programs + .get(&session_id) + .is_some_and(|program| !program.marked_for_pause) + { + self.update_program(&session_id, |program| { + program.marked_for_pause = true; + }); + changed = true; + } + } + } + } + changed + } + + fn pause_acting(&mut self, session_id: &str) -> bool { + let Some(program) = self.programs.get(session_id) else { + return false; + }; + if program.lifecycle != ProgramLifecycle::Active || program.status != ProgramStatus::Acting + { + return false; + } + self.update_program(session_id, |program| { + program.lifecycle = ProgramLifecycle::Paused; + program.assigned_worker = None; + }); + true + } + + pub(crate) fn on_event( + &mut self, + event: ClassifyEvent, + capacities: &WorkerCapacitySnapshot, + now: Instant, + ) -> bool { + self.refresh_normal_usage(); + match event { + ClassifyEvent::Sent { request_id, worker } => self.sent(&request_id, worker), + ClassifyEvent::Completed { + request_id, + context_tokens, + .. + } => self.finish_request(&request_id, true, context_tokens, capacities, now), + ClassifyEvent::Aborted { request_id, .. } => { + self.finish_request(&request_id, false, None, capacities, now) + } + ClassifyEvent::Responding { .. } => false, + _ => false, + } + } + + fn sent(&mut self, request_id: &str, worker: WorkerWithDpRank) -> bool { + let Some(request) = self.requests.get(request_id) else { + return false; + }; + if request.phase != RequestPhase::Released { + return false; + } + let session_id = request.session_id.clone(); + self.set_assignment(&session_id, Some(worker)); + true + } + + pub(crate) fn cancel_request( + &mut self, + request_id: &str, + capacities: &WorkerCapacitySnapshot, + now: Instant, + ) -> bool { + self.refresh_normal_usage(); + self.finish_request(request_id, false, None, capacities, now) + } + + fn finish_request( + &mut self, + request_id: &str, + completed: bool, + context_tokens: Option, + capacities: &WorkerCapacitySnapshot, + now: Instant, + ) -> bool { + let Some(request) = self.requests.remove(request_id) else { + return false; + }; + let notify = Arc::clone(&request.notify); + let was_waiting = self.remove_waiting_arrival(request_id); + + if let Some(session) = self.sessions.get_mut(&request.session_id) { + if session.current.as_deref() == Some(request_id) { + session.current = None; + } else if was_waiting { + session.stale_waiting = session.stale_waiting.saturating_add(1); + } + } + self.compact_session_waiting(&request.session_id); + + if request.session_final && request.began_program { + self.remove_program(&request.session_id); + } else if completed && request.phase == RequestPhase::Released { + let pause = self + .update_program(&request.session_id, |program| { + program.status = ProgramStatus::Acting; + program.token_total = + context_tokens.unwrap_or_else(|| request.progress.context_tokens()); + program.request_progress = None; + program.acting_since = Some(now); + program.deferred_since = None; + std::mem::take(&mut program.marked_for_pause) + }) + .unwrap_or(false); + if pause { + self.pause_acting(&request.session_id); + } + } else if request.began_program { + match request.prior_program { + Some(prior) => { + self.replace_program(request.session_id.clone(), prior); + } + None => { + self.remove_program(&request.session_id); + } + } + } + + let next = self.sessions.get(&request.session_id).and_then(|session| { + session + .current + .is_none() + .then(|| { + session + .waiting + .front() + .map(|waiting| waiting.request_id.clone()) + }) + .flatten() + }); + if let Some(next) = next { + self.admit_request(&next, capacities, now); + } + + if self + .sessions + .get(&request.session_id) + .is_some_and(|session| session.current.is_none() && session.waiting.is_empty()) + { + self.sessions.remove(&request.session_id); + } + self.schedule_retention_expiry(&request.session_id); + + self.compact_arrival_order(); + notify.notify_waiters(); + true + } + + fn compact_session_waiting(&mut self, session_id: &str) { + let Some(session) = self.sessions.get_mut(session_id) else { + return; + }; + while session + .waiting + .front() + .is_some_and(|waiting| !waiting.is_waiting(&self.requests)) + { + session.waiting.pop_front(); + session.stale_waiting = session.stale_waiting.saturating_sub(1); + } + + if session.stale_waiting >= 8 + && session.stale_waiting.saturating_mul(2) >= session.waiting.len() + { + session + .waiting + .retain(|waiting| waiting.is_waiting(&self.requests)); + session.stale_waiting = 0; + } + } + + fn clear_removed_workers(&mut self, capacities: &WorkerCapacitySnapshot) -> bool { + if self.capacity_snapshot_id == Some(capacities.id()) { + return false; + } + self.capacity_snapshot_id = Some(capacities.id()); + if capacities.is_empty() && !capacities.has_liveness() { + return false; + } + let removed: Vec = self + .programs + .iter() + .filter(|(_, program)| { + program + .assigned_worker + .is_some_and(|worker| !capacities.is_live(worker)) + }) + .map(|(session_id, _)| session_id.clone()) + .collect(); + for session_id in &removed { + self.set_assignment(session_id, None); + } + !removed.is_empty() + } + + fn expire_retained_programs(&mut self, now: Instant) -> bool { + if self + .next_retention_expiry + .is_none_or(|deadline| now < deadline) + { + return false; + } + + let retention = self.config.session_retention(); + let mut expired = Vec::new(); + let mut next_expiry = None; + for (session_id, program) in &self.programs { + let has_request = self + .sessions + .get(session_id) + .is_some_and(|session| session.current.is_some() || !session.waiting.is_empty()); + let Some(since) = (!has_request && program.status == ProgramStatus::Acting) + .then_some(program.acting_since) + .flatten() + else { + continue; + }; + let deadline = since + retention; + if now >= deadline { + expired.push(session_id.clone()); + } else { + next_expiry = + Some(next_expiry.map_or(deadline, |next: Instant| next.min(deadline))); + } + } + self.next_retention_expiry = next_expiry; + for session_id in &expired { + self.remove_program(session_id); + } + !expired.is_empty() + } + + fn schedule_retention_expiry(&mut self, session_id: &str) { + if self.sessions.contains_key(session_id) { + return; + } + let Some(program) = self.programs.get(session_id) else { + return; + }; + let Some(since) = (program.status == ProgramStatus::Acting) + .then_some(program.acting_since) + .flatten() + else { + return; + }; + let deadline = since + self.config.session_retention(); + self.next_retention_expiry = Some( + self.next_retention_expiry + .map_or(deadline, |next| next.min(deadline)), + ); + } + + fn worker_usage(&self, now: Instant) -> HashMap { + let mut usage = self.normal_worker_usage(); + for program in self.programs.values() { + if program.lifecycle == ProgramLifecycle::Active + && let Some(worker) = program.assigned_worker + { + let decayed = self + .program_tokens(program, true, now) + .saturating_add(self.config.buffer_per_program); + let worker_usage = usage.entry(worker).or_default(); + worker_usage.decayed = worker_usage.decayed.saturating_add(decayed); + } + } + usage + } + + fn normal_worker_usage(&self) -> HashMap { + self.normal_usage + .iter() + .map(|(&worker, &used)| (worker, WorkerUsage { used, decayed: 0 })) + .collect() + } + + fn program_tokens(&self, program: &Program, decayed: bool, now: Instant) -> usize { + let token_total = current_token_total(program); + if program.status != ProgramStatus::Acting { + return token_total; + } + let weight = if decayed { + let idle = program + .acting_since + .map_or(Duration::ZERO, |since| now.saturating_duration_since(since)); + 2.0_f64.powf(-idle.as_secs_f64() / self.config.acting_decay_tau_seconds) + } else { + self.config.acting_token_weight + }; + scale_tokens(token_total, weight) + } + + fn request_cost(&self, input_tokens: usize) -> usize { + input_tokens.saturating_add(self.config.buffer_per_program) + } + + fn set_assignment(&mut self, session_id: &str, worker: Option) { + self.update_program(session_id, |program| { + program.assigned_worker = worker; + }); + } + + fn is_front_and_idle(&self, request_id: &str, request: &RequestState) -> bool { + self.sessions + .get(&request.session_id) + .is_some_and(|session| { + session.current.is_none() + && session.waiting.front().is_some_and(|waiting| { + waiting.request_id == request_id + && Arc::ptr_eq(&waiting.notify, &request.notify) + }) + }) + } + + fn remove_waiting_arrival(&mut self, request_id: &str) -> bool { + self.waiting_arrivals.remove(request_id) + } + + fn compact_arrival_order(&mut self) { + let retained = self.waiting_arrivals.len(); + if self.arrival_order.len() <= retained.saturating_mul(2).saturating_add(256) { + return; + } + self.arrival_order + .retain(|waiting| waiting.is_waiting(&self.requests)); + } +} + +fn scale_tokens(tokens: usize, factor: f64) -> usize { + ((tokens as f64) * factor).clamp(0.0, usize::MAX as f64) as usize +} + +fn current_token_total(program: &Program) -> usize { + program + .request_progress + .as_ref() + .map_or(program.token_total, RequestProgress::context_tokens) +} + +fn sort_capacities(capacities: &mut [(WorkerWithDpRank, usize)]) { + capacities.sort_unstable_by_key(|(worker, remaining)| (Reverse(*remaining), *worker)); +} + +fn reserve_capacity( + capacities: &mut Vec<(WorkerWithDpRank, usize)>, + position: usize, + required: usize, + buffer_per_program: usize, +) { + let (worker, remaining) = capacities[position]; + debug_assert!(required <= remaining); + let updated = remaining - required; + if updated <= buffer_per_program { + capacities.remove(position); + } else { + capacities[position] = (worker, updated); + sort_capacities(capacities); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn state(config: ThunderAgentConfig) -> State { + State::new(config) + } + + fn capacities(values: &[(u64, usize)]) -> WorkerCapacitySnapshot { + WorkerCapacitySnapshot::new( + values + .iter() + .map(|&(worker, capacity)| (WorkerWithDpRank::new(worker, 0), capacity)), + ) + } + + fn paused_program(tokens: usize, now: Instant) -> Program { + Program { + status: ProgramStatus::Acting, + lifecycle: ProgramLifecycle::Paused, + assigned_worker: None, + token_total: tokens, + request_progress: None, + step_count: 2, + marked_for_pause: false, + acting_since: Some(now), + deferred_since: Some(now), + } + } + + #[test] + fn greedy_resume_selects_scalar_set_then_packs_largest_first() { + let now = Instant::now(); + let mut state = state(ThunderAgentConfig { + pause_threshold: 1.0, + resume_hysteresis: 0.0, + buffer_per_program: 100, + ..Default::default() + }); + for (session_id, tokens) in [("small", 1), ("medium", 100), ("large", 201)] { + state.insert_program(session_id.to_owned(), paused_program(tokens, now)); + } + let capacities = capacities(&[(1, 301), (2, 301)]); + let mut usage = state.worker_usage(now); + + assert!(state.greedy_resume(&capacities, &mut usage, now)); + assert!(state.paused_programs.is_empty()); + assert_eq!( + state.programs["large"].assigned_worker, + Some(WorkerWithDpRank::new(1, 0)) + ); + assert_eq!( + state.programs["medium"].assigned_worker, + Some(WorkerWithDpRank::new(2, 0)) + ); + assert_eq!( + state.programs["small"].assigned_worker, + Some(WorkerWithDpRank::new(2, 0)) + ); + } + + #[test] + fn assigned_continuation_releases_before_periodic_pressure() { + let now = Instant::now(); + let worker = WorkerWithDpRank::new(1, 0); + let mut state = state(ThunderAgentConfig { + pause_threshold: 0.50, + pause_target: 0.40, + buffer_per_program: 0, + ..Default::default() + }); + let mut program = Program::new(400); + program.status = ProgramStatus::Acting; + program.assigned_worker = Some(worker); + program.acting_since = Some(now); + state.insert_program("session-a".to_owned(), program); + let capacities = capacities(&[(1, 500)]); + + state + .register( + RequestRegistration::new( + "request-1".to_owned(), + "session-a".to_owned(), + 400, + RequestProgress::new(400).0, + false, + ), + &capacities, + now, + ) + .unwrap(); + + assert_eq!( + state.wait_status("request-1", &state.requests["request-1"].notify), + WaitStatus::Released(Some(worker)) + ); + assert_eq!( + state.programs["session-a"].lifecycle, + ProgramLifecycle::Active + ); + assert_eq!(state.programs["session-a"].assigned_worker, Some(worker)); + + state.reconcile(&capacities, now + state.config.scheduler_interval()); + assert!(state.programs["session-a"].marked_for_pause); + } + + #[test] + fn streamed_progress_updates_capacity_pressure_without_a_state_event() { + let now = Instant::now(); + let worker = WorkerWithDpRank::new(1, 0); + let mut state = state(ThunderAgentConfig { + pause_threshold: 0.50, + pause_target: 0.40, + buffer_per_program: 0, + ..Default::default() + }); + let capacities = capacities(&[(1, 1_000)]); + let (progress, progress_updater) = RequestProgress::new(100); + + state + .register( + RequestRegistration::new( + "request-1".to_owned(), + "session-a".to_owned(), + 100, + progress, + false, + ), + &capacities, + now, + ) + .unwrap(); + assert_eq!(state.worker_usage(now)[&worker].used, 100); + + progress_updater.update_context_tokens(750); + + state.reconcile(&capacities, now + state.config.scheduler_interval()); + assert_eq!(state.worker_usage(now)[&worker].used, 750); + assert!(state.programs["session-a"].marked_for_pause); + } + + #[test] + fn pause_isolates_worker_ranks_and_stops_acting_at_target() { + let now = Instant::now(); + let acting_rank = WorkerWithDpRank::new(7, 2); + let reasoning_rank = WorkerWithDpRank::new(7, 3); + let healthy_rank = WorkerWithDpRank::new(7, 4); + let other_worker = WorkerWithDpRank::new(8, 2); + let mut state = state(ThunderAgentConfig { + buffer_per_program: 0, + ..Default::default() + }); + for (id, worker, status, tokens) in [ + ("small", acting_rank, ProgramStatus::Acting, 200), + ("large", acting_rank, ProgramStatus::Acting, 300), + ("running", acting_rank, ProgramStatus::Reasoning, 500), + ("reasoning-a", reasoning_rank, ProgramStatus::Reasoning, 400), + ("reasoning-b", reasoning_rank, ProgramStatus::Reasoning, 600), + ("healthy", healthy_rank, ProgramStatus::Acting, 100), + ("other-worker", other_worker, ProgramStatus::Acting, 100), + ] { + let mut program = Program::new(tokens); + program.status = status; + program.assigned_worker = Some(worker); + program.acting_since = Some(now); + state.insert_program(id.into(), program); + } + state.insert_program("paused".into(), paused_program(100, now)); + state.insert_program("unassigned".into(), Program::new(10_000)); + let capacities = WorkerCapacitySnapshot::new( + [acting_rank, reasoning_rank, healthy_rank, other_worker] + .into_iter() + .map(|worker| (worker, 1_000)), + ); + let mut usage = state.worker_usage(now); + + assert!(state.pause_until_safe(&capacities, &mut usage, now)); + assert_eq!( + state.paused_programs, + HashSet::from(["small".into(), "paused".into()]) + ); + assert_eq!(usage[&acting_rank].used, 800); + assert_eq!(usage[&reasoning_rank].used, 1_000); + for id in ["reasoning-a", "reasoning-b"] { + assert!(state.programs[id].marked_for_pause); + assert_eq!(state.programs[id].assigned_worker, Some(reasoning_rank)); + } + for id in ["large", "running", "healthy", "other-worker", "unassigned"] { + assert!(!state.programs[id].marked_for_pause); + assert_eq!(state.programs[id].lifecycle, ProgramLifecycle::Active); + } + // Already-marked reasoning programs still consume capacity but cause no new pause. + assert!(!state.pause_until_safe(&capacities, &mut usage, now)); + } + + #[test] + fn equal_size_pause_candidates_keep_their_existing_order() { + let now = Instant::now(); + let worker = WorkerWithDpRank::new(1, 3); + let mut state = state(ThunderAgentConfig { + buffer_per_program: 0, + ..Default::default() + }); + for id in ["a", "b", "c"] { + let mut program = Program::new(100); + program.status = ProgramStatus::Acting; + program.assigned_worker = Some(worker); + state.insert_program(id.into(), program); + } + let first = state.programs.keys().next().unwrap().clone(); + let capacities = WorkerCapacitySnapshot::new([(worker, 300)]); + let mut usage = state.worker_usage(now); + + state.pause_until_safe(&capacities, &mut usage, now); + + assert_eq!(state.paused_programs, HashSet::from([first])); + } + + #[test] + fn pause_sees_a_request_force_resumed_in_the_same_reconcile() { + let now = Instant::now(); + let worker = WorkerWithDpRank::new(1, 2); + let capacities = WorkerCapacitySnapshot::new([(worker, 1_000)]); + let mut state = state(ThunderAgentConfig { + pause_threshold: 0.5, + pause_target: 0.4, + buffer_per_program: 0, + resume_timeout_seconds: 1.0, + ..Default::default() + }); + state + .register( + RequestRegistration::new( + "request".into(), + "session".into(), + 1_500, + RequestProgress::new(1_500).0, + false, + ), + &capacities, + now, + ) + .unwrap(); + assert_eq!( + state.wait_status("request", &state.requests["request"].notify), + WaitStatus::Waiting + ); + + state.reconcile(&capacities, now + Duration::from_secs(2)); + + assert_eq!( + state.wait_status("request", &state.requests["request"].notify), + WaitStatus::Released(Some(worker)) + ); + assert!(state.programs["session"].marked_for_pause); + } + + /// Run with `cargo test -p dynamo-custom-policy-builtin --release benchmark_pause_by_rank -- --ignored --nocapture`. + /// Reports the pause phase only; rebuilding program state and usage is outside the timer. + #[test] + #[ignore = "manual CPU benchmark"] + fn benchmark_pause_by_rank() { + use std::hint::black_box; + + for (program_count, rank_count, hot_ranks) in [ + (256, 2, 2), + (10_000, 128, 0), + (10_000, 128, 1), + (10_000, 128, 8), + (10_000, 128, 32), + (10_000, 128, 128), + ] { + let mut samples = Vec::new(); + let mut outcomes = None; + for iteration in 0..35 { + let now = Instant::now(); + let mut state = state(ThunderAgentConfig { + buffer_per_program: 0, + ..Default::default() + }); + for i in 0..program_count { + let mut program = Program::new(100 + i / rank_count); + program.assigned_worker = + Some(WorkerWithDpRank::new(1, (i % rank_count) as u32)); + if (i / rank_count) % 2 == 0 { + program.status = ProgramStatus::Acting; + program.acting_since = Some(now); + } + state.insert_program(format!("session-{i}"), program); + } + let mut usage = state.worker_usage(now); + let capacities = WorkerCapacitySnapshot::new((0..rank_count).map(|rank| { + let worker = WorkerWithDpRank::new(1, rank as u32); + let used = usage[&worker].used; + ( + worker, + if rank < hot_ranks { + used * 2 / 3 + } else { + used * 2 + }, + ) + })); + + let start = Instant::now(); + black_box(state.pause_until_safe( + black_box(&capacities), + black_box(&mut usage), + now, + )); + let elapsed = start.elapsed().as_nanos(); + let outcome = ( + state.paused_programs.len(), + state + .programs + .values() + .filter(|program| program.marked_for_pause) + .count(), + ); + assert_eq!(*outcomes.get_or_insert(outcome), outcome); + if iteration >= 5 { + samples.push(elapsed); + } + } + samples.sort_unstable(); + println!( + "programs={program_count} ranks={rank_count} hot={hot_ranks} median_ns={} p95_ns={} outcomes={outcomes:?}", + samples[samples.len() / 2], + samples[samples.len() * 95 / 100], + ); + } + } +} diff --git a/lib/router-plugins/builtin/src/thunderagent/worker_selection/mod.rs b/lib/router-plugins/builtin/src/thunderagent/worker_selection/mod.rs new file mode 100644 index 000000000000..e23e10fdb85d --- /dev/null +++ b/lib/router-plugins/builtin/src/thunderagent/worker_selection/mod.rs @@ -0,0 +1,222 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::sync::Arc; + +use dynamo_kv_router::WorkerType; +use dynamo_kv_router::plugins::RouterPluginRegistry; +use dynamo_kv_router::plugins::worker_selection::{ + WorkerCandidates, WorkerInputView, WorkerInputs, WorkerPicker, WorkerScorer, + WorkerSelectionContext, WorkerSelectionPolicy, WorkerSelectionPolicyError, + WorkerSelectionPolicyFactory, WorkerSelectionPolicyParameters, + WorkerSelectionPolicyProviderError, WorkerSelectionPolicyRegistryError, +}; + +use super::THUNDERAGENT_CLASSIFIER_TYPE; + +struct ThunderAgentScorer; + +impl WorkerScorer for ThunderAgentScorer { + fn required_worker_inputs(&self) -> WorkerInputs { + WorkerInputs::LOAD + } + + fn score( + &mut self, + context: &WorkerSelectionContext<'_>, + candidates: WorkerCandidates<'_>, + costs: &mut [f64], + ) -> Result<(), WorkerSelectionPolicyError> { + let block_size = f64::from(context.block_size()); + for (candidate, cost) in candidates.iter().zip(costs) { + let load = candidate + .load() + .ok_or_else(|| WorkerSelectionPolicyError::failed("worker load unavailable"))?; + *cost = load.active_prefill_tokens() as f64 + load.decode_cost_blocks() * block_size; + } + Ok(()) + } +} + +struct ThunderAgentPicker; + +impl WorkerPicker for ThunderAgentPicker { + fn pick( + &mut self, + context: &WorkerSelectionContext<'_>, + input: WorkerInputView<'_>, + ) -> Result { + let candidates = input.candidates(); + if let Some(target) = context.affinity_target() + && let Some(row) = candidates.iter().position(|candidate| { + candidate.worker().worker_id == target.worker_id + && target + .dp_rank + .is_none_or(|dp_rank| candidate.worker().dp_rank == dp_rank) + }) + { + return Ok(row); + } + + candidates + .iter() + .enumerate() + .min_by(|(_, left), (_, right)| { + left.cost() + .total_cmp(&right.cost()) + .then_with(|| left.worker().cmp(&right.worker())) + }) + .map(|(row, _)| row) + .ok_or_else(|| WorkerSelectionPolicyError::failed("no eligible worker")) + } +} + +#[derive(serde::Deserialize)] +#[serde(deny_unknown_fields)] +struct ThunderAgentSelectionParameters {} + +fn worker_selection_provider( + parameters: &WorkerSelectionPolicyParameters, +) -> Result { + let _: ThunderAgentSelectionParameters = parameters.deserialize()?; + Ok(Arc::new( + move |router, worker_type: WorkerType, _partition| { + WorkerSelectionPolicy::new( + router.clone(), + worker_type.as_str(), + vec![Box::new(ThunderAgentScorer)], + Box::new(ThunderAgentPicker), + ) + }, + )) +} + +pub(crate) fn register( + registry: &mut RouterPluginRegistry, +) -> Result<(), WorkerSelectionPolicyRegistryError> { + registry.register_worker_selection( + THUNDERAGENT_CLASSIFIER_TYPE, + Arc::new(worker_selection_provider), + ) +} + +#[cfg(test)] +mod tests { + use std::collections::HashMap; + + use dynamo_kv_router::protocols::{RoutingConstraints, WorkerConfigLike, WorkerWithDpRank}; + use dynamo_kv_router::scheduling::{OverlapSignals, ScheduleMode, SchedulingRequest}; + use dynamo_kv_router::{ + KvRouterConfig, WorkerLoadProjection, WorkerSelectionInput, WorkerSelectionPolicy, + WorkerSelector, + }; + + use super::*; + + struct TestWorker; + + impl WorkerConfigLike for TestWorker { + fn data_parallel_start_rank(&self) -> u32 { + 0 + } + + fn data_parallel_size(&self) -> u32 { + 1 + } + + fn max_num_batched_tokens(&self) -> Option { + None + } + + fn total_kv_blocks(&self) -> Option { + None + } + } + + fn request(target: WorkerWithDpRank) -> SchedulingRequest { + SchedulingRequest { + mode: ScheduleMode::QueryOnly { + request_id: Some("request".into()), + }, + token_seq: None, + isl_tokens: 16, + lora_name: None, + expected_output_tokens: None, + affinity_target: Some(target.into()), + pinned_worker: None, + allowed_worker_ids: None, + routing_constraints: RoutingConstraints::default(), + router_config_override: None, + track_prefill_tokens: true, + priority_jump: 0.0, + strict_priority: 0, + policy_class: None, + session_context: None, + overlap: OverlapSignals::default(), + kv_transfer_candidates: None, + retain_kv_transfer_chain: false, + shared_cache_hits: None, + worker_loads: Default::default(), + resp_tx: None, + } + } + + fn policy() -> WorkerSelectionPolicy { + WorkerSelectionPolicy::new( + KvRouterConfig::default(), + "test", + vec![Box::new(ThunderAgentScorer)], + Box::new(ThunderAgentPicker), + ) + } + + #[test] + fn honors_the_classifier_target_when_eligible() { + let worker_1 = WorkerWithDpRank::new(1, 0); + let worker_2 = WorkerWithDpRank::new(2, 0); + let workers = HashMap::from([(1, TestWorker), (2, TestWorker)]); + let request = request(worker_2); + + let selected = policy() + .select_worker(WorkerSelectionInput::configured( + &workers, + &request, + request.eligibility(), + 16, + )) + .unwrap(); + + assert_eq!(selected.worker, worker_2); + assert_ne!(selected.worker, worker_1); + } + + #[test] + fn falls_back_when_the_classifier_target_is_unavailable() { + let unavailable = WorkerWithDpRank::new(2, 0); + let worker = WorkerWithDpRank::new(4, 0); + let workers = HashMap::from([(1, TestWorker), (3, TestWorker), (4, TestWorker)]); + let mut request = request(unavailable); + // Scores at block size 16 are 161, 100, and 84; both load terms affect selection. + for (id, prefill_tokens, decode_blocks) in [(1, 1, 10), (3, 100, 0), (4, 20, 4)] { + request.worker_loads.insert( + WorkerWithDpRank::new(id, 0), + WorkerLoadProjection { + active_prefill_tokens: prefill_tokens, + active_decode_blocks: decode_blocks, + ..Default::default() + }, + ); + } + + let selected = policy() + .select_worker(WorkerSelectionInput::configured( + &workers, + &request, + request.eligibility(), + 16, + )) + .unwrap(); + + assert_eq!(selected.worker, worker); + } +} From ad8778fc40cfffc7e9ad857c4bab7c3f11704452 Mon Sep 17 00:00:00 2001 From: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> Date: Wed, 23 Sep 2026 18:18:13 +0000 Subject: [PATCH 178/191] docs: refresh community events Automated refresh from the public Dynamo Google Calendar. Generated by .github/workflows/community-events-refresh.yml. Signed-off-by: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> --- README.md | 2 +- docs/fern/components/events.generated.ts | 26 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index dd3b6c2e6247..385c058c9f5a 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,8 @@ Built in Rust for performance, Python for extensibility. | Date | Event | Location | |:-----|:------|:---------| +| Wed, Sep 23, 2026 | ~~[Dynamo community meeting](https://calendar.google.com/calendar/render?action=TEMPLATE&text=Dynamo+community+meeting&dates=20260923T173000Z%2F20260923T181500Z&location=https%3A%2F%2Fmeet.google.com%2Fheb-demu-qok)~~ | [Online](https://meet.google.com/heb-demu-qok) | | Thu, Sep 10, 2026 | ~~[Baseten x Dynamo x SGLang RL post training meetup](https://calendar.google.com/calendar/render?action=TEMPLATE&text=Baseten+x+Dynamo+x+SGLang+RL+post+training+meetup&dates=20260911T010000Z%2F20260911T040000Z&location=https%3A%2F%2Fluma.com%2FBaseDynSGL)~~ | [Luma](https://luma.com/BaseDynSGL) | -| Mon, Aug 24, 2026 | ~~[vLLM x Dynamo meetup](https://calendar.google.com/calendar/render?action=TEMPLATE&text=vLLM+x+Dynamo+meetup&dates=20260825T010000Z%2F20260825T040000Z&location=https%3A%2F%2Fluma.com%2Fr8o604o0)~~ | [Luma](https://luma.com/r8o604o0) | > Events are updated automatically. Subscribe to our [public calendar](https://calendar.google.com/calendar/embed?src=c_c2448d2efb09eac2ddee1f34524124135bd3f4554868769059105e18e1b97e8f%40group.calendar.google.com). diff --git a/docs/fern/components/events.generated.ts b/docs/fern/components/events.generated.ts index f0b84252e428..9e9642d3226a 100644 --- a/docs/fern/components/events.generated.ts +++ b/docs/fern/components/events.generated.ts @@ -27,6 +27,19 @@ export const GENERATED_ON = "2026-09-23"; export const UPCOMING_EVENTS: DynamoEvent[] = []; export const PAST_EVENTS: DynamoEvent[] = [ + { + "title": "Dynamo community meeting", + "start": "2026-09-23T17:30:00.000Z", + "month": "Sep", + "day": "23", + "year": "2026", + "dateLabel": "Wed, Sep 23, 2026", + "timeLabel": "10:30 AM", + "isPast": true, + "location": "Online", + "locationUrl": "https://meet.google.com/heb-demu-qok", + "addUrl": "https://calendar.google.com/calendar/render?action=TEMPLATE&text=Dynamo+community+meeting&dates=20260923T173000Z%2F20260923T181500Z&location=https%3A%2F%2Fmeet.google.com%2Fheb-demu-qok" + }, { "title": "Baseten x Dynamo x SGLang RL post training meetup", "start": "2026-09-11T01:00:00.000Z", @@ -91,18 +104,5 @@ export const PAST_EVENTS: DynamoEvent[] = [ "location": "Luma", "locationUrl": "https://luma.com/rxsn0u0h", "addUrl": "https://calendar.google.com/calendar/render?action=TEMPLATE&text=AI+Infra+Builders+Meetup+with+dstack%2C+Crusoe%2C+and+SGLang&dates=20260724T003000Z%2F20260724T043000Z&location=https%3A%2F%2Fluma.com%2Frxsn0u0h" - }, - { - "title": "Austin vLLM & llm-d AI Inference Meetup", - "start": "2026-07-16T22:00:00.000Z", - "month": "Jul", - "day": "16", - "year": "2026", - "dateLabel": "Thu, Jul 16, 2026", - "timeLabel": "3:00 PM", - "isPast": true, - "location": "Luma", - "locationUrl": "https://luma.com/rxmldtp2?tk=XiKvay", - "addUrl": "https://calendar.google.com/calendar/render?action=TEMPLATE&text=Austin+vLLM+%26+llm-d+AI+Inference+Meetup&dates=20260716T220000Z%2F20260716T230000Z&location=https%3A%2F%2Fluma.com%2Frxmldtp2%3Ftk%3DXiKvay&details=%3Cp%3E%E2%80%8B%3Cstrong%3E5%3A00PM+%E2%80%93+5%3A30PM+%E2%80%94+Doors+Open%2C+Check-In%3C%2Fstrong%3E%3Cbr%3E%3Cbr%3E%3Cstrong%3E5%3A30PM+%E2%80%93+5%3A40PM+%E2%80%94+Welcome+and+Opening+Remarks%3C%2Fstrong%3E%3C%2Fp%3E%3Cblockquote%3E%3Cp%3E%E2%80%8BJake+O%27Shea%2C+Principal%2C+Antler+%26amp%3B+Co-Founder+%2F+Organizer%2C+AITX%3Cbr%3ESasa+Zelenovic%2C+Sr.+Technical+Marketing+Manager%2C+Red+Hat+AI%3C%2Fp%3E%3C%2Fblockquote%3E%3Cp%3E%E2%80%8B%3Cstrong%3E5%3A40PM+%E2%80%93+6%3A10PM+%E2%80%94+Intro+to+vLLM+and+Project+Update%3C%2Fstrong%3E%3C%2Fp%3E%3Cblockquote%3E%3Cp%3E%E2%80%8BKyle+Sayers%2C+Sr.+Machine+Learning+Engineer%2C+Red+Hat+AI%3C%2Fp%3E%3C%2Fblockquote%3E%3Cp%3E%E2%80%8B%3Cstrong%3E6%3A10PM+%E2%80%93+6%3A30PM+%E2%80%94+Intro+to+Scalable%2C+Distributed+Inference+with+Kubernetes+and+llm-d%3C%2Fstrong%3E%3C%2Fp%3E%3Cblockquote%3E%3Cp%3E%E2%80%8BWill+Eaton%2C+Senior+Principal+Software+Engineer%2C+AI+Engineering%2C+Red+Hat+AI%3C%2Fp%3E%3C%2Fblockquote%3E%3Cp%3E%E2%80%8B%3Cstrong%3E6%3A30PM+%E2%80%93+6%3A45PM+%E2%80%94+NemoClaw%3A+Build+%26amp%3B+Deploy+Always-On+Agents%3C%2Fstrong%3E%3C%2Fp%3E%3Cblockquote%3E%3Cp%3E%E2%80%8BPatrick+Moorhead%2C+Technical+Marketing+Engineer%2C+AI%2C+NVIDIA%3C%2Fp%3E%3C%2Fblockquote%3E%3Cp%3E%E2%80%8B%3Cstrong%3E6%3A45PM+%E2%80%93+7%3A00PM+%E2%80%94+ModelExpress%3A+Fast+Weights+and+Compile+Caches+for+Inference+and+RL+Post-Training%3C%2Fstrong%3E%3C%2Fp%3E%3Cblockquote%3E%3Cp%3E%E2%80%8BGanesh+Kudleppanavar+-+Tech+Lead+Manager%2C+AI+Inference+NVIDIA%3C%2Fp%3E%3C%2Fblockquote%3E%3Cp%3E%E2%80%8B%3Cstrong%3E7%3A00PM+%E2%80%93+7%3A40PM+%E2%80%94+Hands-on+Workshop%3A+Getting+Started+with+Accurate+Model+Compression+and+Benchmarking%3C%2Fstrong%3E%3C%2Fp%3E%3Cblockquote%3E%3Cp%3E%E2%80%8BLegare+Kerrison%2C+Developer+Advocate%2C+Red+Hat+AI%3Cbr%3EGrace+Ableidinger%2C+Developer+Advocate%2C+Red+Hat+AI%3C%2Fp%3E%3C%2Fblockquote%3E%3Cp%3E%E2%80%8B%3Cstrong%3E7%3A40PM+%E2%80%93+8%3A00PM+%E2%80%94+Discussion+and+Q%26amp%3BA%3C%2Fstrong%3E%3C%2Fp%3E%3Cp%3E%E2%80%8B%3Cstrong%3E8%3A00PM+%E2%80%93+9%3A00PM+%E2%80%94+Networking%2C+Food+and+Drinks%3C%2Fstrong%3E%3C%2Fp%3E" } ]; From a83ba19b4e71d4bea568a30acee3432d6bbafe96 Mon Sep 17 00:00:00 2001 From: J Wyman Date: Wed, 23 Sep 2026 14:26:42 -0400 Subject: [PATCH 179/191] chore: Remove Defunct Triton Example (#15170) Signed-off-by: J Wyman --- .github/codeowners/areas.yaml | 5 - CODEOWNERS | 2 - examples/backends/tritonserver/Dockerfile | 34 --- examples/backends/tritonserver/Makefile | 104 -------- examples/backends/tritonserver/README.md | 235 ------------------ .../backends/tritonserver/launch/identity.sh | 129 ---------- .../model_repo/identity/1/.gitkeep | 0 .../model_repo/identity/config.pbtxt | 21 -- examples/backends/tritonserver/src/client.py | 117 --------- .../backends/tritonserver/src/tritonworker.py | 180 -------------- tests/frontend/grpc/test_tensor_parameters.py | 42 ---- 11 files changed, 869 deletions(-) delete mode 100644 examples/backends/tritonserver/Dockerfile delete mode 100644 examples/backends/tritonserver/Makefile delete mode 100644 examples/backends/tritonserver/README.md delete mode 100755 examples/backends/tritonserver/launch/identity.sh delete mode 100644 examples/backends/tritonserver/model_repo/identity/1/.gitkeep delete mode 100644 examples/backends/tritonserver/model_repo/identity/config.pbtxt delete mode 100755 examples/backends/tritonserver/src/client.py delete mode 100644 examples/backends/tritonserver/src/tritonworker.py diff --git a/.github/codeowners/areas.yaml b/.github/codeowners/areas.yaml index 792590248e98..ea6c2beedc4d 100644 --- a/.github/codeowners/areas.yaml +++ b/.github/codeowners/areas.yaml @@ -234,7 +234,6 @@ areas: - components/src/dynamo/common/utils/ - components/src/dynamo/experimental/ - examples/backends/sample/ - - examples/backends/tritonserver/ - examples/common/ - examples/custom_backend/ - lib/backend-common/ @@ -1276,10 +1275,6 @@ shared: owners: - ops - backend-vllm -- glob: examples/backends/tritonserver/Dockerfile - owners: - - runtime - - ops - glob: examples/diffusers/Dockerfile owners: - diffusion diff --git a/CODEOWNERS b/CODEOWNERS index 8c3d5ec3f670..c92d47e0dda8 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -241,7 +241,6 @@ /components/src/dynamo/common/ @ai-dynamo/dynamo-runtime-codeowners /tests/test_models_dir_flag.py @ai-dynamo/dynamo-runtime-codeowners /tests/report_pytest_markers.py @ai-dynamo/dynamo-runtime-codeowners -/examples/backends/tritonserver/ @ai-dynamo/dynamo-runtime-codeowners /tests/serve/multimodal_profiles/ @ai-dynamo/dynamo-runtime-codeowners /tests/test_predownload_models.py @ai-dynamo/dynamo-runtime-codeowners /components/src/dynamo/common/lora/ @ai-dynamo/dynamo-runtime-codeowners @@ -689,7 +688,6 @@ requirements.txt /components/src/dynamo/trtllm/publisher.py @ai-dynamo/dynamo-backend-trtllm-codeowners @ai-dynamo/dynamo-kv-memory-codeowners /container/deps/requirements.benchmark.txt @ai-dynamo/dynamo-ops-codeowners @ai-dynamo/dynamo-performance-codeowners /deploy/operator/internal/gpu/discovery.go @ai-dynamo/dynamo-operator-codeowners @ai-dynamo/dynamo-observability-codeowners -/examples/backends/tritonserver/Dockerfile @ai-dynamo/dynamo-runtime-codeowners @ai-dynamo/dynamo-ops-codeowners /lib/llm/src/block_manager/metrics_kvbm.rs @ai-dynamo/dynamo-kv-memory-codeowners @ai-dynamo/dynamo-observability-codeowners /components/src/dynamo/thunderagent_router/ @ai-dynamo/dynamo-router-codeowners @ai-dynamo/dynamo-agents-codeowners /components/src/dynamo/vllm/health_check.py @ai-dynamo/dynamo-backend-vllm-codeowners @ai-dynamo/dynamo-observability-codeowners diff --git a/examples/backends/tritonserver/Dockerfile b/examples/backends/tritonserver/Dockerfile deleted file mode 100644 index 438ba78049b6..000000000000 --- a/examples/backends/tritonserver/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -ARG DYNAMO_BASE_IMAGE="dynamo-base:latest" -ARG TRITON_SERVER_IMAGE="nvcr.io/nvidia/tritonserver:25.10-py3" - -FROM ${TRITON_SERVER_IMAGE} AS triton_source -# Ensure DCGM directory exists so COPY never fails when the source image omits it -RUN mkdir -p /usr/local/dcgm - -FROM ${DYNAMO_BASE_IMAGE} AS dynamo_base - -COPY --from=triton_source /opt/tritonserver /opt/tritonserver -COPY --from=triton_source /usr/local/dcgm /usr/local/dcgm -USER root -RUN --mount=type=bind,from=triton_source,source=/usr/lib/x86_64-linux-gnu,target=/triton_usr_lib \ - find /triton_usr_lib -name "libdcgm*.so*" -exec cp -a {} /lib/x86_64-linux-gnu/ \; -ENV BACKEND_DIR=/opt/tritonserver/backends -ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/usr/local/cuda/lib64:/opt/tritonserver/lib:/opt/tritonserver/backends:/usr/local/dcgm/lib64 -ENV PATH=/opt/tritonserver/bin:$PATH - -COPY --chown=dynamo: src/ /workspace/src/ -COPY --chown=dynamo: model_repo/ /workspace/model_repo/ -COPY --chown=dynamo: launch/ /workspace/launch/ - -WORKDIR /workspace -USER dynamo - -RUN uv pip install --no-cache-dir \ - 'tritonclient[grpc]==2.72.0' 'protobuf==6.33.6' 'grpcio>=1.81.1,<=1.83.1' \ - /opt/tritonserver/python/triton*.whl && \ - uv pip check -# Validate CUDA ABI compatibility at build time -RUN python3 -c "import tritonserver; import tritonclient.grpc; from pathlib import Path; from google.protobuf import text_format; from tritonclient.grpc import model_config_pb2; text_format.Parse(Path('model_repo/identity/config.pbtxt').read_text(), model_config_pb2.ModelConfig())" diff --git a/examples/backends/tritonserver/Makefile b/examples/backends/tritonserver/Makefile deleted file mode 100644 index 276eaf8cb8fb..000000000000 --- a/examples/backends/tritonserver/Makefile +++ /dev/null @@ -1,104 +0,0 @@ -# Makefile for Triton Server installation -# Builds Triton Server and copies artifacts only when necessary - -CURRENT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) -TMP_SERVER := /tmp/server -BUILD_INSTALL := $(TMP_SERVER)/build/install - -# Target directories -WHEELHOUSE_DIR := $(CURRENT_DIR)/wheelhouse -LIB_DIR := $(CURRENT_DIR)/lib -BIN_DIR := $(CURRENT_DIR)/bin -BACKEND_DIR := $(CURRENT_DIR)/backends -# Target files -TRITON_LIB := $(LIB_DIR)/libtritonserver.so -TRITON_BIN := $(BIN_DIR)/tritonserver -TRITON_WHEEL := $(WHEELHOUSE_DIR)/.wheel_marker - -# Main target - build everything -.PHONY: all -all: $(TRITON_LIB) $(TRITON_BIN) $(TRITON_WHEEL) $(BACKEND_DIR) - @echo "Triton Server installation complete." - @echo "Add to your environment:" - @echo " export LD_LIBRARY_PATH=$(LIB_DIR):$(BACKEND_DIR):\$$LD_LIBRARY_PATH" - @echo " export PATH=$(BIN_DIR):\$$PATH" - -# Clone the repository -$(TMP_SERVER): - @echo "Cloning Triton Server repository..." - cd /tmp && git clone https://github.com/triton-inference-server/server.git - -# Build Triton Server -$(BUILD_INSTALL)/lib/libtritonserver.so $(BUILD_INSTALL)/bin/tritonserver: $(TMP_SERVER) - @echo "Building Triton Server (this may take a while)..." - cd $(TMP_SERVER) && \ - uv venv .venv && \ - . .venv/bin/activate && \ - uv pip install distro requests && \ - python3 build.py \ - --enable-logging \ - --enable-stats \ - --enable-metrics \ - --endpoint=http \ - --backend=identity - -# Copy library -$(TRITON_LIB): $(BUILD_INSTALL)/lib/libtritonserver.so - @echo "Copying libtriton.so..." - @mkdir -p $(LIB_DIR) - cp $(BUILD_INSTALL)/lib/libtritonserver.so $(LIB_DIR)/ - -# Copy binary -$(TRITON_BIN): $(BUILD_INSTALL)/bin/tritonserver - @echo "Copying tritonserver binary..." - @mkdir -p $(BIN_DIR) - cp $(BUILD_INSTALL)/bin/tritonserver $(BIN_DIR)/ - -# Copy backends -$(BACKEND_DIR): $(BUILD_INSTALL)/backends - @echo "Copying backends..." - @mkdir -p $(BACKEND_DIR) - cp -r $(BUILD_INSTALL)/backends/* $(BACKEND_DIR)/ - -# Copy wheels -$(TRITON_WHEEL): $(BUILD_INSTALL)/lib/libtritonserver.so - @echo "Copying Python wheels..." - @mkdir -p $(WHEELHOUSE_DIR) - cp $(BUILD_INSTALL)/python/*.whl $(WHEELHOUSE_DIR)/ - @touch $(TRITON_WHEEL) - @echo "Triton Server wheel built successfully." - @ls -al $(WHEELHOUSE_DIR) - -# Clean installed artifacts (keeps the build) -.PHONY: clean -clean: - @echo "Cleaning installed artifacts..." - rm -rf $(WHEELHOUSE_DIR) $(LIB_DIR) $(BIN_DIR) - -# Full clean (removes everything including the cloned repo and build) -.PHONY: distclean -distclean: clean - @echo "Cleaning build directory..." - rm -rf $(TMP_SERVER) - -# Show what would be built -.PHONY: status -status: - @echo "Installation status:" - @echo " Repository: $(if $(wildcard $(TMP_SERVER)),✓ cloned,✗ not cloned)" - @echo " Built: $(if $(wildcard $(BUILD_INSTALL)/lib/libtritonserver.so),✓ yes,✗ no)" - @echo " Library: $(if $(wildcard $(TRITON_LIB)),✓ installed,✗ not installed)" - @echo " Binary: $(if $(wildcard $(TRITON_BIN)),✓ installed,✗ not installed)" - @echo " Wheels: $(if $(wildcard $(TRITON_WHEEL)),✓ installed,✗ not installed)" - -.PHONY: help -help: - @echo "Triton Server Installation Makefile" - @echo "" - @echo "Targets:" - @echo " all - Build and install Triton Server (default)" - @echo " clean - Remove installed artifacts (keeps build cache)" - @echo " distclean - Remove everything including build cache" - @echo " status - Show installation status" - @echo " help - Show this help message" - diff --git a/examples/backends/tritonserver/README.md b/examples/backends/tritonserver/README.md deleted file mode 100644 index 389e7cd52166..000000000000 --- a/examples/backends/tritonserver/README.md +++ /dev/null @@ -1,235 +0,0 @@ -# Triton Server Backend for Dynamo - -> **⚠️ Work in Progress / Proof of Concept** -> -> This example demonstrates integrating NVIDIA Triton Inference Server as a backend for Dynamo. -> It is currently a proof-of-concept and may require additional work for production use. - -## Overview - -This example shows how to run Triton Server models through Dynamo's distributed runtime, exposing them via the KServe gRPC protocol. The integration allows Triton models to benefit from Dynamo's service discovery, routing, and infrastructure. - -**Architecture:** - -``` -┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────────┐ -│ Triton Client │────▶│ Dynamo Frontend│────▶│ Dynamo Worker │ -│ (KServe gRPC) │ │ (port 8787) │ │ ┌───────────────────────┐ │ -└─────────────────┘ └─────────────────┘ │ │ Triton Server │ │ - │ │ │ (Python bindings) │ │ - ▼ │ └───────────────────────┘ │ - ┌─────────────────┐ └─────────────────────────────┘ - │ KV Store │ - └─────────────────┘ -``` - -## Prerequisites - -- NVIDIA GPU with CUDA support -- For local development: Python 3.10+ with Dynamo installed -- For container deployment: Docker with NVIDIA Container Toolkit - -## Quick Start - -### Option 1: Container Deployment - -#### Step 1: Build Container Images - -From the Dynamo repository root: - -```bash -# Build the base Dynamo image (CUDA 13.0) -python container/render.py --framework=dynamo --target=runtime --output-short-filename -docker build -f container/rendered.Dockerfile -t dynamo-base:latest . - -# Build the Triton worker image (defaults to tritonserver:25.10-py3, CUDA 13-compatible) -docker build \ - --build-arg DYNAMO_BASE_IMAGE=dynamo-base:latest \ - -t dynamo-triton:latest \ - examples/backends/tritonserver/ -``` - -> [!NOTE] -> The default `TRITON_SERVER_IMAGE` is `nvcr.io/nvidia/tritonserver:25.10-py3`. -> Rebuild `DYNAMO_BASE_IMAGE` from the same Dynamo checkout before building the Triton worker image. An older local `dynamo-base:latest` can retain `grpcio-tools` that requires protobuf 5, while this example installs protobuf 6. The build's `uv pip check` rejects that incompatible environment. If it reports this conflict, run both image-build commands above again. - -#### Step 2: Run the Container - -```bash -docker run --rm -it --gpus all --network host \ - dynamo-triton:latest \ - /workspace/launch/identity.sh -``` - -#### Step 3: Test the Deployment - -In another terminal: - -```bash -# Install client dependencies -pip install tritonclient[grpc] - -# Test with the client -cd examples/backends/tritonserver -python src/client.py --port 8000 -``` - -### Option 2: Local Development - -This requires Dynamo to be installed locally. - -```bash -# From the dynamo repo root -cd examples/backends/tritonserver - -# Build Triton Server (first time only, ~30 minutes) -make all - -# Install Python dependencies -pip install wheelhouse/tritonserver-*.whl -pip install tritonclient[grpc] - -# Launch the server -./launch/identity.sh - -# In another terminal, test with the client -python src/client.py -``` - -## Directory Structure - -``` -tritonserver/ -├── launch/ -│ └── identity.sh # Launch script (frontend + worker) -├── src/ -│ ├── tritonworker.py # Main Dynamo worker implementation -│ └── client.py # Test client (KServe gRPC) -├── model_repo/ -│ └── identity/ # Sample identity model -│ ├── config.pbtxt -│ └── 1/ -├── backends/ # Triton backends (built by `make all`) -├── lib/ # Triton libraries (built by `make all`) -├── wheelhouse/ # Python wheels (built by `make all`) -├── Dockerfile # Triton worker container -└── Makefile # Build Triton from source -``` - -## Configuration - -### Launch Script Options - -```bash -./launch/identity.sh --help - -Options: - --model-name Model name to load (default: identity) - --model-repository Path to model repository - --backend-directory Path to Triton backends - --log-verbose Triton log verbosity 0-6 (default: 1) - --discovery-backend Discovery backend: kubernetes, etcd, file, mem (default: file) -``` - -### Environment Variables - -| Variable | Description | Default | -|----------|-------------|---------| -| `BACKEND_DIR` | Path to Triton backends. The container image sets this to `/opt/tritonserver/backends`; local source builds use `backends/`. | `backends/` | -| `DYN_DISCOVERY_BACKEND` | Discovery backend: `kubernetes`, `etcd`, `file`, or `mem` | `file` | -| `DYN_LOG` | Log level (debug, info, warn, error) | `info` | -| `DYN_HTTP_PORT` | Frontend HTTP port | `8000` | -| `ETCD_ENDPOINTS` | etcd connection URL (only when `--discovery-backend etcd`) | `http://localhost:2379` | -| `NATS_SERVER` | NATS connection URL (only for distributed mode) | `nats://localhost:4222` | - -## Adding Your Own Models - -1. Create a model directory in `model_repo/`: - - ```text - model_repo/ - └── my_model/ - ├── config.pbtxt - └── 1/ - └── model.plan # or other model file - ``` - -2. Define the model config (`config.pbtxt`): - - ```protobuf - name: "my_model" - backend: "tensorrt" # or onnxruntime, python, etc. - max_batch_size: 8 - - input [ - { - name: "input" - data_type: TYPE_FP32 - dims: [3, 224, 224] - } - ] - output [ - { - name: "output" - data_type: TYPE_FP32 - dims: [1000] - } - ] - ``` - -3. Launch with your model: - - ```bash - ./launch/identity.sh --model-name my_model - ``` - -## Known Limitations - -- **Single model**: Currently loads one model at a time -- **Identity backend only**: The Makefile builds the identity backend by default; other backends require modifying the build configuration - -## Building Triton from Source - -Required for local development. The Makefile builds Triton Server and the identity backend. - -```bash -cd examples/backends/tritonserver - -# Build Triton Server (~30 minutes, clones and builds from source) -make all - -# Check build status -make status - -# This produces: -# lib/libtritonserver.so - Core library -# bin/tritonserver - Server binary -# backends/identity/ - Identity backend -# wheelhouse/*.whl - Python bindings - -# Clean up build artifacts -make clean # Remove installed artifacts -make distclean # Remove everything including build cache -``` - -To add other backends (TensorRT, ONNX, Python, etc.), edit the Makefile's `build.py` invocation to include additional `--backend=` flags. - -## Troubleshooting - -### "Model not found" error - -- Verify the model exists in `model_repo//` -- Check that `config.pbtxt` is valid -- Ensure the backend is available in `backends/` - -### Worker fails to start - -- Check `LD_LIBRARY_PATH` includes Triton libraries -- Verify GPU is available: `nvidia-smi` -- Increase log verbosity: `--log-verbose 6` - -## Related Documentation - -- [Dynamo Backend Guide](../../../docs/fern/pages/developer-guide/advanced-customizations/writing-custom-backends/writing-python-workers.md) -- [Triton Inference Server](https://github.com/triton-inference-server/server) -- [KServe Protocol](https://kserve.github.io/website/latest/modelserving/data_plane/v2_protocol/) diff --git a/examples/backends/tritonserver/launch/identity.sh b/examples/backends/tritonserver/launch/identity.sh deleted file mode 100755 index 0bda8f6a4e65..000000000000 --- a/examples/backends/tritonserver/launch/identity.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/bash -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Launch script for Triton Server backend with Dynamo -# This runs the frontend and triton worker on the same node - -set -e - -# Setup cleanup trap -cleanup() { - echo "Cleaning up background processes..." - kill $FRONTEND_PID 2>/dev/null || true - wait $FRONTEND_PID 2>/dev/null || true - echo "Cleanup complete." -} -trap cleanup EXIT INT TERM - -# Get the directory where this script is located -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -TRITON_DIR="$(dirname "$SCRIPT_DIR")" - -# Default values -MODEL_NAME="identity" -MODEL_REPO="${TRITON_DIR}/model_repo" -BACKEND_DIR="${BACKEND_DIR:-${TRITON_DIR}/backends}" -LOG_VERBOSE=1 -DISCOVERY_BACKEND="${DYN_DISCOVERY_BACKEND:-file}" # Default to file-based discovery (no etcd required) - -# Parse command line arguments -EXTRA_ARGS=() -while [[ $# -gt 0 ]]; do - case $1 in - --model-name) - MODEL_NAME="$2" - shift 2 - ;; - --model-repository) - MODEL_REPO="$2" - shift 2 - ;; - --backend-directory) - BACKEND_DIR="$2" - shift 2 - ;; - --log-verbose) - LOG_VERBOSE="$2" - shift 2 - ;; - --discovery-backend) - DISCOVERY_BACKEND="$2" - shift 2 - ;; - -h|--help) - echo "Usage: $0 [OPTIONS]" - echo "" - echo "Launch Triton Server backend with Dynamo frontend" - echo "" - echo "Options:" - echo " --model-name Model name to load (default: $MODEL_NAME)" - echo " --model-repository Path to model repository (default: $MODEL_REPO)" - echo " --backend-directory Path to Triton backends (default: $BACKEND_DIR)" - echo " --log-verbose Triton log verbosity 0-6 (default: $LOG_VERBOSE)" - echo " --discovery-backend Discovery backend: kubernetes, etcd, file, mem (default: $DISCOVERY_BACKEND)" - echo " -h, --help Show this help message" - echo "" - echo "Environment variables:" - echo " BACKEND_DIR Override default Triton backends path" - echo " DYN_DISCOVERY_BACKEND Discovery backend (default: file)" - echo " DYN_HTTP_PORT Frontend HTTP port (default: 8000)" - echo " DYN_SYSTEM_PORT Worker metrics port (default: 8081)" - echo "" - echo "Ports:" - echo " HTTP: 8000 (configurable via DYN_HTTP_PORT)" - echo " gRPC: 8787 (KServe gRPC for tensor models)" - echo "" - echo "Additional arguments will be passed to tritonworker.py" - exit 0 - ;; - *) - EXTRA_ARGS+=("$1") - shift - ;; - esac -done - -# Validate paths -if [[ ! -d "$MODEL_REPO" ]]; then - echo "Error: Model repository not found: $MODEL_REPO" - exit 1 -fi - -if [[ ! -d "$BACKEND_DIR" ]]; then - echo "Error: Backend directory not found: $BACKEND_DIR" - exit 1 -fi - -echo "=== Triton Server with Dynamo ===" -echo "Model name: $MODEL_NAME" -echo "Model repository: $MODEL_REPO" -echo "Backend directory: $BACKEND_DIR" -echo "Log verbose: $LOG_VERBOSE" -echo "Discovery: $DISCOVERY_BACKEND" -echo "" - -# Set library path for Triton -export LD_LIBRARY_PATH="${TRITON_DIR}/lib:${BACKEND_DIR}:${LD_LIBRARY_PATH:-}" - -# Export discovery backend setting for worker (read by @dynamo_worker decorator) -export DYN_DISCOVERY_BACKEND="$DISCOVERY_BACKEND" - -# Run frontend in background -# --kserve-grpc-server enables the KServe gRPC endpoint for tensor models -echo "Starting Dynamo frontend..." -python3 -m dynamo.frontend --kserve-grpc-server --discovery-backend "$DISCOVERY_BACKEND" & -FRONTEND_PID=$! - -# Give frontend time to start -sleep 2 - -# Run triton worker in foreground -echo "Starting Triton worker..." -DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT:-8081} \ -python3 "${TRITON_DIR}/src/tritonworker.py" \ - --model-name "$MODEL_NAME" \ - --model-repository "$MODEL_REPO" \ - --backend-directory "$BACKEND_DIR" \ - --log-verbose "$LOG_VERBOSE" \ - "${EXTRA_ARGS[@]}" diff --git a/examples/backends/tritonserver/model_repo/identity/1/.gitkeep b/examples/backends/tritonserver/model_repo/identity/1/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/examples/backends/tritonserver/model_repo/identity/config.pbtxt b/examples/backends/tritonserver/model_repo/identity/config.pbtxt deleted file mode 100644 index d29441908bcd..000000000000 --- a/examples/backends/tritonserver/model_repo/identity/config.pbtxt +++ /dev/null @@ -1,21 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -name: "identity" -backend: "identity" -max_batch_size: 1 - -input [ - { - name: "INPUT0" - data_type: TYPE_INT32 - dims: [-1] - } -] -output [ - { - name: "OUTPUT0" - data_type: TYPE_INT32 - dims: [-1] - } -] \ No newline at end of file diff --git a/examples/backends/tritonserver/src/client.py b/examples/backends/tritonserver/src/client.py deleted file mode 100755 index be28e85ac68c..000000000000 --- a/examples/backends/tritonserver/src/client.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python3 -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -""" -Test client for Triton Server backend via Dynamo KServe gRPC frontend. - -Usage: - # After starting the server with ./launch/identity.sh - python src/client.py - python src/client.py --model identity --shape 1 10 -""" - -import argparse - -import numpy as np -import tritonclient.grpc as triton_grpc -from tritonclient.utils import InferenceServerException - - -def main() -> None: - parser = argparse.ArgumentParser( - description="Send inference requests to Triton model via Dynamo frontend" - ) - parser.add_argument( - "--host", - default="127.0.0.1", - help="Host serving the gRPC endpoint (default: %(default)s)", - ) - parser.add_argument( - "--port", - type=int, - default=8787, - help="Port of the gRPC endpoint (default: %(default)s)", - ) - parser.add_argument( - "--model", - default="identity", - help="Model name to target (default: %(default)s)", - ) - parser.add_argument( - "--shape", - type=int, - nargs="+", - default=[1, 5], - help="Input tensor shape (default: 1 5)", - ) - parser.add_argument( - "--iterations", - type=int, - default=1, - help="Number of inference iterations (default: %(default)s)", - ) - - args = parser.parse_args() - - target = f"{args.host}:{args.port}" - print(f"Connecting to {target}...") - - try: - client = triton_grpc.InferenceServerClient(url=target) - except Exception as e: - print(f"Failed to connect: {e}") - return - - # Query model metadata - print(f"\nQuerying model '{args.model}' metadata...") - try: - metadata = client.get_model_metadata(args.model) - print(f" Name: {metadata.name}") - print( - f" Inputs: {[(i.name, i.datatype, list(i.shape)) for i in metadata.inputs]}" - ) - print( - f" Outputs: {[(o.name, o.datatype, list(o.shape)) for o in metadata.outputs]}" - ) - except InferenceServerException as e: - print(f" Could not get metadata: {e}") - print(" Proceeding with default INPUT0/OUTPUT0...") - - # Generate input data - shape = args.shape - input_size = int(np.prod(shape)) - input_data = np.arange(1, input_size + 1, dtype=np.int32).reshape(shape) - - print(f"\nRunning {args.iterations} inference iteration(s)...") - for i in range(args.iterations): - print(f"\n--- Iteration {i + 1} ---") - print(f"Input shape: {shape}") - print(f"Input data:\n{input_data}") - - # Create input tensor - input_tensor = triton_grpc.InferInput("INPUT0", shape, "INT32") - input_tensor.set_data_from_numpy(input_data) - - try: - response = client.infer(args.model, inputs=[input_tensor]) - - # Extract output - output_data = response.as_numpy("OUTPUT0") - print(f"Output shape: {output_data.shape}") - print(f"Output data:\n{output_data}") - - # Verify identity model (output should equal input) - if np.array_equal(input_data, output_data): - print("✓ Identity verification passed") - else: - print("✗ Identity verification failed - output differs from input") - - except InferenceServerException as e: - print(f"Inference failed: {e}") - - print("\nDone.") - - -if __name__ == "__main__": - main() diff --git a/examples/backends/tritonserver/src/tritonworker.py b/examples/backends/tritonserver/src/tritonworker.py deleted file mode 100644 index 3e3cd48119a3..000000000000 --- a/examples/backends/tritonserver/src/tritonworker.py +++ /dev/null @@ -1,180 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -import argparse -import asyncio -import logging -import os - -import numpy as np -import tritonclient.grpc.model_config_pb2 as mc -import tritonserver -import uvloop -from google.protobuf import text_format -from tritonclient.utils import triton_to_np_dtype - -from dynamo.llm import ModelInput, ModelType, WorkerType, register_model -from dynamo.runtime import DistributedRuntime, dynamo_worker -from dynamo.runtime.logging import configure_dynamo_logging - -logger = logging.getLogger(__name__) -configure_dynamo_logging(service_name="tritonserver", worker_id=0) - -# Mapping from Triton dtype (uppercase) to Dynamo dtype (camelCase) -TRITON_TO_DYNAMO_DTYPE = { - "BOOL": "Bool", - "UINT8": "Uint8", - "UINT16": "Uint16", - "UINT32": "Uint32", - "UINT64": "Uint64", - "INT8": "Int8", - "INT16": "Int16", - "INT32": "Int32", - "INT64": "Int64", - "FP16": "Float16", - "FP32": "Float32", - "FP64": "Float64", - "BYTES": "Bytes", -} - - -class RequestHandler: - def __init__(self, tritonserver: tritonserver.Server, model: tritonserver.Model): - self.tritonserver = tritonserver - self.model = model - - async def generate(self, request: dict) -> dict: - # Deserialize to numpy array - logger.debug(f"Received request: {request}") - - inference_request = self.model.create_request() - for tensor in request["tensors"]: - logger.debug(f"Tensor: {tensor}") - # Convert Triton dtype string ("INT32") to NumPy dtype (np.int32) for array construction - np_dtype = triton_to_np_dtype(tensor["metadata"]["data_type"].upper()) - arr = np.array(tensor["data"]["values"], dtype=np_dtype).reshape( - tensor["metadata"]["shape"] - ) - inference_request.inputs[tensor["metadata"]["name"]] = arr - - inference_responses = self.model.async_infer(inference_request) - async for inference_response in inference_responses: - response_tensors = [] - for output in self.model.metadata()["outputs"]: - output_data = np.from_dlpack(inference_response.outputs[output["name"]]) - response_arr = output_data - # Convert Triton dtype (e.g., "INT32") to Dynamo dtype (e.g., "Int32") - dtype_str = TRITON_TO_DYNAMO_DTYPE.get( - output["datatype"], output["datatype"] - ) - response_tensors.append( - { - "metadata": { - "name": output["name"], - "shape": list(response_arr.shape), - "data_type": dtype_str, - }, - "data": { - "data_type": dtype_str, - "values": response_arr.flatten().tolist(), - }, - } - ) - - response = { - "id": inference_response.request_id, - "model": inference_response.model.name, - "tensors": response_tensors, - } - - yield response - - -@dynamo_worker() -async def triton_worker(runtime: DistributedRuntime, args: argparse.Namespace): - logger.info("=" * 60) - logger.info("Starting Triton Worker for Dynamo") - logger.info("=" * 60) - logger.info( - f"Environment: ETCD_ENDPOINTS={os.environ.get('ETCD_ENDPOINTS', 'NOT SET')}" - ) - logger.info(f"Environment: NATS_SERVER={os.environ.get('NATS_SERVER', 'NOT SET')}") - logger.info( - f"Environment: DYN_DISCOVERY_BACKEND={os.environ.get('DYN_DISCOVERY_BACKEND', 'NOT SET')}" - ) - - endpoint = runtime.endpoint("triton.tritonserver.generate") - logger.info("✓ Created endpoint: triton/tritonserver/generate") - - model_repository = args.model_repository - model_name = args.model_name - backend_dir = args.backend_directory - - logger.info( - f"Initializing Triton Server with model_repository={model_repository}, backend_dir={backend_dir}" - ) - server = tritonserver.Server( - model_repository=model_repository, - backend_directory=backend_dir, - log_verbose=args.log_verbose, - model_control_mode=tritonserver.ModelControlMode.EXPLICIT, - ) - server.start(wait_until_ready=True) - logger.info("✓ Triton Server started") - - server.load(model_name) - model = server.model(model_name) - logger.info(f"✓ Model '{model_name}' loaded") - - # Read Triton model config from config.pbtxt - config_path = f"{model_repository}/{model_name}/config.pbtxt" - with open(config_path, "r") as f: - triton_model_config = text_format.Parse(f.read(), mc.ModelConfig()) - - logger.info(f"Loaded model config from {config_path}") - - # Set up model metadata for KServe frontend - model_config = { - "name": "", - "inputs": [], - "outputs": [], - "triton_model_config": triton_model_config.SerializeToString(), - } - - logger.info("Attempting to register model with Dynamo runtime...") - # Use register_model for tensor-based models (skips HuggingFace downloads) - await register_model( - ModelInput.Tensor, - ModelType.TensorBased, - endpoint, - model_name, # model_path (used as display name for tensor-based models) - worker_type=WorkerType.Aggregated, - tensor_model_config=model_config, - ) - logger.info( - f"✓ Successfully registered model '{model_name}' with endpoint triton/tritonserver/generate" - ) - - # Create handler and serve the endpoint - handler = RequestHandler(server, model) - logger.info("Starting to serve the endpoint...") - - await endpoint.serve_endpoint(handler.generate) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Triton worker for Dynamo") - parser.add_argument( - "--model-repository", - type=str, - default="model_repo", - help="Model repository directory", - ) - parser.add_argument("--model-name", type=str, default="identity", help="Model name") - parser.add_argument( - "--backend-directory", type=str, default="backends", help="Backend directory" - ) - parser.add_argument("--log-verbose", type=int, default=6, help="Log verbose level") - args = parser.parse_args() - - uvloop.install() - asyncio.run(triton_worker(args)) diff --git a/tests/frontend/grpc/test_tensor_parameters.py b/tests/frontend/grpc/test_tensor_parameters.py index c4aa6096218b..f56d789dc861 100644 --- a/tests/frontend/grpc/test_tensor_parameters.py +++ b/tests/frontend/grpc/test_tensor_parameters.py @@ -14,7 +14,6 @@ import logging import os import runpy -import shlex from pathlib import Path from typing import Any from unittest.mock import patch @@ -62,21 +61,6 @@ def _requirement(text: str, package: str) -> Requirement: return pins[0] -def _assert_triton_pins_match(frontend: str, dockerfile: str) -> None: - packages = ("tritonclient", "protobuf", "grpcio") - tokens = [ - token - for line in dockerfile.replace("\\\n", " ").splitlines() - if line.startswith("RUN uv pip install ") - for token in shlex.split(line)[4:] - if token.startswith(packages) - ] - for package in packages: - actual = _requirement("\n".join(tokens), package) - expected = _requirement(frontend, package) - assert actual == expected, f"Triton example {actual} differs from {expected}" - - @pytest.mark.unit @pytest.mark.pre_merge @pytest.mark.gpu_0 @@ -153,32 +137,6 @@ def import_with_error(name: str, *args: Any, **kwargs: Any) -> Any: @pytest.mark.gpu_0 @pytest.mark.parallel class TestDependencyGuards: - def test_triton_example_pins_match_frontend(self) -> None: - root = Path(__file__).resolve().parents[3] - frontend = (root / "container/deps/requirements.frontend.txt").read_text() - dockerfile = (root / "examples/backends/tritonserver/Dockerfile").read_text() - _assert_triton_pins_match(frontend, dockerfile) - - @pytest.mark.parametrize("package", ["tritonclient", "protobuf", "grpcio"]) - @pytest.mark.parametrize("mutation", ["changed", "missing", "duplicate"]) - def test_triton_example_pin_drift(self, package: str, mutation: str) -> None: - frontend = ( - "tritonclient[grpc]==2.72.0\nprotobuf==6.33.6\ngrpcio>=1.81.1,<=1.83.1" - ) - requirements = frontend.splitlines() - pin = next(value for value in requirements if value.startswith(package)) - replacement = { - "changed": f"{package}==1.0.0", - "missing": "", - "duplicate": f"'{pin}' '{pin}'", - }[mutation] - dockerfile = "RUN uv pip install " + " ".join(f"'{p}'" for p in requirements) - _assert_triton_pins_match(frontend, dockerfile) - with pytest.raises(AssertionError): - _assert_triton_pins_match( - frontend, dockerfile.replace(f"'{pin}'", replacement) - ) - @pytest.mark.parametrize( "pin", [ From 7472c23abfbbc56387d4fd44631b06a3f487f78e Mon Sep 17 00:00:00 2001 From: Qi Wang Date: Wed, 23 Sep 2026 12:41:07 -0700 Subject: [PATCH 180/191] feat(vllm): add external encoder handoff (#13293) Signed-off-by: furionw --- .../src/dynamo/common/backend/engine.py | 12 +- components/src/dynamo/vllm/handlers.py | 81 +++- .../custom_encoder/__init__.py | 2 + .../custom_encoder/adapter/linear.py | 67 ++- .../custom_encoder/backend/base.py | 11 +- .../custom_encoder/handoff.py | 442 ++++++++++++++++++ .../custom_encoder/handoff_consumer.py | 50 ++ .../test_vllm_external_handoff.py | 289 ++++++++++++ .../vllm/tests/test_vllm_handoff_consumer.py | 432 +++++++++++++++++ 9 files changed, 1349 insertions(+), 37 deletions(-) create mode 100644 components/src/dynamo/vllm/multimodal_utils/custom_encoder/handoff.py create mode 100644 components/src/dynamo/vllm/multimodal_utils/custom_encoder/handoff_consumer.py create mode 100644 components/src/dynamo/vllm/tests/multimodal_utils/custom_encoder/test_vllm_external_handoff.py create mode 100644 components/src/dynamo/vllm/tests/test_vllm_handoff_consumer.py diff --git a/components/src/dynamo/common/backend/engine.py b/components/src/dynamo/common/backend/engine.py index b0d4c2f2415a..476f54ca1035 100644 --- a/components/src/dynamo/common/backend/engine.py +++ b/components/src/dynamo/common/backend/engine.py @@ -44,11 +44,13 @@ class GenerateRequest(TypedDict, total=False): Multimodal keys (``multi_modal_data``, ``mm_processor_kwargs``, ``mm_routing_info``) are populated by the frontend preprocessor when - the request carries media. ``encoder_result`` is set by the - frontend when forwarding a request from an Encode worker - to a downstream Prefill/Aggregated peer; engines read it via - :func:`dynamo.common.backend.multimodal.require_encoder_result`. All - four are object-shaped (``dict``) by contract. + the request carries media. ``encoder_result`` may be set by the frontend + when forwarding a request from an Encode worker or by an application + orchestrator before calling an Aggregated peer; engines read it via + :func:`dynamo.common.backend.multimodal.require_encoder_result`. + ``encoder_result`` is deliberately opaque at this common layer; its + producer and consuming engine own the concrete schema. All four are + object-shaped (``dict``) by contract. ``model`` carries the requested model name (set by the Rust preprocessor). Engines that support dynamic LoRA read it to route a diff --git a/components/src/dynamo/vllm/handlers.py b/components/src/dynamo/vllm/handlers.py index 59fc0a8d0fed..36305c283051 100644 --- a/components/src/dynamo/vllm/handlers.py +++ b/components/src/dynamo/vllm/handlers.py @@ -106,6 +106,10 @@ VisionEncoderBackend, create_custom_encoder_adapter, ) +from .multimodal_utils.custom_encoder.handoff import external_encoder_request_conflicts +from .multimodal_utils.custom_encoder.handoff_consumer import ( + ExternalEncoderHandoffConsumer, +) from .multimodal_utils.prefill_worker_utils import MultiModalEmbeddingLoader from .multimodal_utils.request_processor import ( IMAGE_URL_KEY, @@ -3464,6 +3468,9 @@ def __init__( encode_worker_client=encode_worker_client, ) self._first_token_source = first_token_source + self._external_encoder_handoff_consumer: Optional[ + ExternalEncoderHandoffConsumer + ] = None async def generate(self, request, context): # Use context ID for request tracking and correlation @@ -3478,6 +3485,16 @@ async def generate(self, request, context): with time_and_log_code_section( f"[DECODE] request: {request_id} generate" ) as decode_timer: + if self.use_vllm_tokenizer and request.get("encoder_result") is not None: + yield { + "finish_reason": ( + "error: external encoder results require token-in/token-out " + "mode" + ), + "index": 0, + "token_ids": [], + } + return if self.use_vllm_tokenizer: # Text-in-text-out mode: use InputParamManager and OpenAI-compatible format generator = self._generate_text_mode(request, context, request_id) @@ -3597,6 +3614,41 @@ async def _assemble_custom_encoder_prompt( ) return prepared + async def _assemble_external_encoder_prompt( + self, + request: Dict[str, Any], + request_id: str, + ) -> EmbedsPrompt: + """Decode an external encoder result and prepare the vLLM prompt.""" + + conflicts = external_encoder_request_conflicts(request) + + if conflicts: + raise InvalidArgument( + "encoder_result is authoritative and cannot be combined with " + "multimodal inputs, transfer data, or routing metadata: " + f"{sorted(conflicts)}" + ) + encoder_result = request.get("encoder_result") + if not isinstance(encoder_result, Mapping): + raise InvalidArgument("encoder_result must be an object") + token_ids = request.get("token_ids") + if not isinstance(token_ids, list): + raise InvalidArgument("external encoder results require token_ids") + if self._external_encoder_handoff_consumer is None: + self._external_encoder_handoff_consumer = ExternalEncoderHandoffConsumer( + self.model_config, + self.config.engine_args, + ) + prompt = await asyncio.to_thread( + self._external_encoder_handoff_consumer.prepare_prompt, + encoder_result, + token_ids, + ) + + logger.debug("Request %s: prepared external encoder prompt", request_id) + return prompt + async def _generate_token_mode(self, request, context, request_id): """Generate tokens using internal protocol format (token-in-token-out).""" # Firstly extract disaggregated params from prefill result if available @@ -3622,10 +3674,29 @@ async def _generate_token_mode(self, request, context, request_id): ) is_decode_only = False mode = DisaggregationMode.AGGREGATED + + has_external_encoder_result = request.get("encoder_result") is not None + if has_external_encoder_result and mode != DisaggregationMode.AGGREGATED: + yield { + "finish_reason": ( + "error: external encoder results currently require an " + "aggregated vLLM worker" + ), + "index": 0, + "token_ids": [], + } + return has_mm_data = request.get("multi_modal_data") is not None - custom_prompt: EmbedsPrompt | TokensPrompt | None = None + assembled_prompt: EmbedsPrompt | TokensPrompt | None = None - if ( + if has_external_encoder_result: + assembled_prompt = await self._assemble_external_encoder_prompt( + request, request_id + ) + multi_modal_data = None + mm_processor_kwargs = None + pre_rendered = None + elif ( mode == DisaggregationMode.AGGREGATED and self._custom_encoder is not None and has_mm_data @@ -3636,7 +3707,7 @@ async def _generate_token_mode(self, request, context, request_id): # Failures propagate as exceptions; the bindings map the type to a # typed backend error, so an input fault answers 400 with its # message and an engine fault stays a retryable 5xx. - custom_prompt = await self._assemble_custom_encoder_prompt( + assembled_prompt = await self._assemble_custom_encoder_prompt( request, request_id, ) @@ -3671,8 +3742,8 @@ async def _generate_token_mode(self, request, context, request_id): # branches without spelling out the full union. prompt: Any with _nvtx.annotate("mm_backend:build_prompt", color="yellow"): - if custom_prompt is not None: - prompt = custom_prompt + if assembled_prompt is not None: + prompt = assembled_prompt elif pre_rendered is not None: # pre_rendered is a MultiModalInput dict with "type": "multimodal". # The engine's InputProcessor.process_inputs() will see the "type" diff --git a/components/src/dynamo/vllm/multimodal_utils/custom_encoder/__init__.py b/components/src/dynamo/vllm/multimodal_utils/custom_encoder/__init__.py index 0ad77988fceb..372da7871c2b 100644 --- a/components/src/dynamo/vllm/multimodal_utils/custom_encoder/__init__.py +++ b/components/src/dynamo/vllm/multimodal_utils/custom_encoder/__init__.py @@ -17,6 +17,7 @@ RawT, VisionEncoderBackend, ) +from dynamo.vllm.multimodal_utils.custom_encoder.handoff import ExternalEncoderHandoff __all__ = [ "AsyncVisionEncoder", @@ -24,6 +25,7 @@ "build_mixed_embeds", "CustomEncoderAdapter", "create_custom_encoder_adapter", + "ExternalEncoderHandoff", "ItemT", "Preprocessed", "Qwen3VLImageEncoding", diff --git a/components/src/dynamo/vllm/multimodal_utils/custom_encoder/adapter/linear.py b/components/src/dynamo/vllm/multimodal_utils/custom_encoder/adapter/linear.py index 742f1dda72a7..e0e167abb4a9 100644 --- a/components/src/dynamo/vllm/multimodal_utils/custom_encoder/adapter/linear.py +++ b/components/src/dynamo/vllm/multimodal_utils/custom_encoder/adapter/linear.py @@ -162,33 +162,22 @@ def _emit_text(text_ids: list[int]) -> None: return prompt_embeds, out_token_ids, is_token_ids -class LinearEmbedsAdapter(CustomEncoderAdapter[torch.Tensor]): - """Build mixed ``EmbedsPrompt`` inputs for a text-only decoder.""" +class LinearEmbedsPromptBuilder: + """Validate linear encoder artifacts and build a mixed vLLM prompt.""" - def __init__( - self, - backend: VisionEncoderBackend[Any, Any, torch.Tensor], - model_config: Any, - engine_args: Any, - ) -> None: + def __init__(self, model_config: Any, engine_args: Any) -> None: if model_config is None: raise ValueError("CustomEncoder requires the resolved vLLM ModelConfig") if _is_multimodal_model(model_config): raise ValueError( "CustomEncoder does not yet support this multimodal decoder; " - "the linear EmbedsPrompt adapter is only valid for text-only models" + "the linear EmbedsPrompt adapter is only valid for text-only decoders" ) if not getattr(engine_args, "enable_prompt_embeds", False): raise ValueError( "text-only CustomEncoder output requires --enable-prompt-embeds" ) - image_token_id = getattr(backend, "image_token_id", None) - if not isinstance(image_token_id, int) or isinstance(image_token_id, bool): - raise ValueError( - "text-only CustomEncoder output requires an integer image_token_id" - ) - self._image_token_id = image_token_id self._hidden_size = _hidden_size(model_config) model_dtype = getattr(model_config, "dtype", None) self._dtype = model_dtype if isinstance(model_dtype, torch.dtype) else None @@ -197,14 +186,15 @@ def prepare_prompt( self, token_ids: list[int], artifacts: Sequence[torch.Tensor], - ) -> EmbedsPrompt | TokensPrompt: - """Build a mixed prompt from per-image visual embedding tensors. + *, + image_token_id: int, + ) -> EmbedsPrompt: + """Build a mixed prompt from ordered per-image embedding tensors.""" - Each artifact must be a CPU tensor shaped - ``(n_visual_tokens, decoder_hidden_size)`` with the decoder's dtype. - Artifacts must appear in the same order as the image placeholders in - ``token_ids``. - """ + if not isinstance(image_token_id, int) or isinstance(image_token_id, bool): + raise ValueError( + "text-only CustomEncoder output requires an integer image_token_id" + ) rows = list(artifacts) for index, tensor in enumerate(rows): if not isinstance(tensor, torch.Tensor): @@ -224,10 +214,41 @@ def prepare_prompt( ) prompt_embeds, prompt_token_ids, prompt_is_token_ids = build_mixed_embeds( - token_ids, rows, self._image_token_id + token_ids, rows, image_token_id ) return EmbedsPrompt( prompt_embeds=prompt_embeds, prompt_token_ids=prompt_token_ids, prompt_is_token_ids=prompt_is_token_ids, ) + + +class LinearEmbedsAdapter(CustomEncoderAdapter[torch.Tensor]): + """Build mixed ``EmbedsPrompt`` inputs for a text-only decoder.""" + + def __init__( + self, + backend: VisionEncoderBackend[Any, Any, torch.Tensor], + model_config: Any, + engine_args: Any, + ) -> None: + image_token_id = getattr(backend, "image_token_id", None) + if not isinstance(image_token_id, int) or isinstance(image_token_id, bool): + raise ValueError( + "text-only CustomEncoder output requires an integer image_token_id" + ) + self._image_token_id = image_token_id + self._prompt_builder = LinearEmbedsPromptBuilder(model_config, engine_args) + + def prepare_prompt( + self, + token_ids: list[int], + artifacts: Sequence[torch.Tensor], + ) -> EmbedsPrompt | TokensPrompt: + """Build a mixed prompt from per-image visual embedding tensors.""" + + return self._prompt_builder.prepare_prompt( + token_ids, + artifacts, + image_token_id=self._image_token_id, + ) diff --git a/components/src/dynamo/vllm/multimodal_utils/custom_encoder/backend/base.py b/components/src/dynamo/vllm/multimodal_utils/custom_encoder/backend/base.py index ff3a9f008e48..97259af4920f 100644 --- a/components/src/dynamo/vllm/multimodal_utils/custom_encoder/backend/base.py +++ b/components/src/dynamo/vllm/multimodal_utils/custom_encoder/backend/base.py @@ -10,10 +10,13 @@ (the generic cross-request batcher) and ``AsyncVisionEncoder`` (the async request-API glue). This module defines only the contract those drivers call. -The encoder runs in the **same process** as the aggregated vLLM worker (no -separate encode worker, no NIXL transfer): it turns image inputs into ordered, -producer-defined artifacts. The resolved downstream decoder selects an adapter -that validates those artifacts and constructs the final engine prompt. +The backend runs in the same process as Dynamo's encoder driver and turns image +inputs into ordered, producer-defined artifacts. Inline mode hosts that driver +inside the aggregated vLLM worker. ``ExternalEncoderHandoff`` hosts the same +driver in an application worker, packages linear tensor artifacts for the +request plane, and lets stock aggregated vLLM reconstruct the same prompt. The +resolved downstream decoder adapter validates the artifacts and constructs the +final engine prompt in either placement. Division of labour (author vs. Dynamo): diff --git a/components/src/dynamo/vllm/multimodal_utils/custom_encoder/handoff.py b/components/src/dynamo/vllm/multimodal_utils/custom_encoder/handoff.py new file mode 100644 index 000000000000..7d3e401b97ca --- /dev/null +++ b/components/src/dynamo/vllm/multimodal_utils/custom_encoder/handoff.py @@ -0,0 +1,442 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""External handoff from a custom vision encoder to aggregated vLLM.""" + +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from dataclasses import dataclass +from math import prod +from types import MappingProxyType +from typing import Any, cast + +import torch + +from dynamo.common.backend import GenerateRequest +from dynamo.llm.exceptions import InvalidArgument +from dynamo.vllm.multimodal_utils.custom_encoder.async_encoder import AsyncVisionEncoder +from dynamo.vllm.multimodal_utils.custom_encoder.backend import VisionEncoderBackend + +EXTERNAL_ENCODER_RESULT_SCHEMA = "dynamo.external_encoder_result" +EXTERNAL_ENCODER_RESULT_VERSION = 0 +LINEAR_EMBEDDINGS_FORMAT = "linear_embeddings" +REQUEST_PLANE_TRANSPORT = "request_plane_msgpack" + +_IMAGE_URL = "image_url" +_URL = "Url" + +EXTERNAL_ENCODER_REQUEST_FIELDS = ( + "multi_modal_data", + "multi_modal_uuids", + "prompt_embeds", + "mm_processor_kwargs", + "mm_routing_info", + "media_io_kwargs", +) + +EXTERNAL_ENCODER_EXTRA_ARG_FIELDS = ( + "mm_processor_kwargs", + "mm_kwargs_shm", + "mm_kwargs_nixl", + "mm_hashes", + "mm_hashes_by_modality", + "mm_placeholders", + "mm_placeholders_by_modality", + "expanded_token_ids", +) + +_SUPPORTED_DTYPES: Mapping[str, torch.dtype] = MappingProxyType( + { + "bfloat16": torch.bfloat16, + "float16": torch.float16, + "float32": torch.float32, + } +) + + +def _check_keys(data: Mapping[str, Any], required: set[str], kind: str) -> None: + missing = required - set(data) + unknown = set(data) - required + if missing: + raise ValueError(f"{kind} missing fields: {sorted(missing)}") + if unknown: + raise ValueError(f"{kind} has unknown fields: {sorted(unknown)}") + + +def encode_request_plane_tensor(tensor: torch.Tensor) -> dict[str, Any]: + """Copy one CPU tensor into a MsgPack request-plane payload.""" + + if not isinstance(tensor, torch.Tensor): + raise TypeError( + "external encoder features must be a torch.Tensor; " + f"got {type(tensor).__name__}" + ) + if tensor.device.type != "cpu": + raise ValueError(f"external encoder tensor is on {tensor.device}; expected CPU") + if not tensor.is_contiguous(): + raise ValueError("external encoder tensor must be contiguous") + if tensor.dim() != 2 or any(dimension <= 0 for dimension in tensor.shape): + raise ValueError( + "external encoder tensor must be a non-empty 2D tensor; " + f"got shape {tuple(tensor.shape)}" + ) + dtype_name = str(tensor.dtype).removeprefix("torch.") + if dtype_name not in _SUPPORTED_DTYPES: + raise ValueError(f"unsupported external encoder tensor dtype {tensor.dtype}") + + raw = tensor.detach().view(torch.uint8).numpy().tobytes() + return { + "transport": REQUEST_PLANE_TRANSPORT, + "shape": list(tensor.shape), + "dtype": dtype_name, + "data": raw, + } + + +def _validate_request_plane_tensor_payload( + payload: Mapping[str, Any], +) -> tuple[tuple[int, int], torch.dtype, bytes]: + """Validate request-plane tensor metadata without allocating a tensor.""" + + if not isinstance(payload, Mapping): + raise ValueError("external encoder features must be an object") + _check_keys( + payload, + {"transport", "shape", "dtype", "data"}, + "external encoder features", + ) + if payload["transport"] != REQUEST_PLANE_TRANSPORT: + raise ValueError( + f"unsupported external encoder transport {payload['transport']!r}" + ) + + shape = payload["shape"] + if ( + not isinstance(shape, list) + or len(shape) != 2 + or any( + isinstance(dimension, bool) + or not isinstance(dimension, int) + or dimension <= 0 + for dimension in shape + ) + ): + raise ValueError( + "external encoder tensor shape must contain two positive integers" + ) + dtype_name = payload["dtype"] + if not isinstance(dtype_name, str) or dtype_name not in _SUPPORTED_DTYPES: + raise ValueError(f"unsupported external encoder tensor dtype {dtype_name!r}") + data = payload["data"] + if not isinstance(data, bytes): + raise ValueError("external encoder tensor data must be bytes") + + dtype = _SUPPORTED_DTYPES[dtype_name] + expected_bytes = prod(shape) * torch.empty((), dtype=dtype).element_size() + if len(data) != expected_bytes: + raise ValueError( + "external encoder tensor byte count does not match shape and dtype; " + f"expected {expected_bytes}, got {len(data)}" + ) + + return (shape[0], shape[1]), dtype, data + + +def decode_request_plane_tensor(payload: Mapping[str, Any]) -> torch.Tensor: + """Reconstruct an owned CPU tensor from a MsgPack request payload.""" + + shape, dtype, data = _validate_request_plane_tensor_payload(payload) + storage = torch.frombuffer(bytearray(data), dtype=torch.uint8) + return storage.view(dtype).reshape(shape) + + +@dataclass(frozen=True) +class ExternalEncoderResult: + """Versioned packed linear embeddings sent to aggregated vLLM.""" + + features: Mapping[str, Any] + row_splits: Sequence[int] + image_token_id: int + embedding_format: str = LINEAR_EMBEDDINGS_FORMAT + + def __post_init__(self) -> None: + if not isinstance(self.features, Mapping) or not self.features: + raise ValueError("external encoder features must be a non-empty object") + if self.embedding_format != LINEAR_EMBEDDINGS_FORMAT: + raise ValueError( + f"unsupported external encoder format {self.embedding_format!r}" + ) + shape, _, _ = _validate_request_plane_tensor_payload(self.features) + row_splits = tuple(self.row_splits) + if len(row_splits) < 2 or row_splits[0] != 0: + raise ValueError("external encoder row_splits must start at zero") + if any( + isinstance(value, bool) or not isinstance(value, int) or value < 0 + for value in row_splits + ): + raise ValueError( + "external encoder row_splits must contain non-negative integers" + ) + if any(left >= right for left, right in zip(row_splits, row_splits[1:])): + raise ValueError("external encoder row_splits must be strictly increasing") + if isinstance(self.image_token_id, bool) or not isinstance( + self.image_token_id, int + ): + raise ValueError("external encoder image_token_id must be an integer") + if self.image_token_id < 0: + raise ValueError("external encoder image_token_id must be non-negative") + if row_splits[-1] != shape[0]: + raise ValueError( + "external encoder row_splits do not cover the packed feature rows" + ) + + object.__setattr__(self, "features", MappingProxyType(dict(self.features))) + object.__setattr__(self, "row_splits", row_splits) + + @classmethod + def from_artifacts( + cls, + artifacts: Sequence[torch.Tensor], + *, + image_token_id: int, + ) -> "ExternalEncoderResult": + """Pack ordered per-image encoder artifacts into the wire contract.""" + + if not artifacts: + raise ValueError("external encoder returned no image artifacts") + + tensors: list[torch.Tensor] = [] + hidden_size: int | None = None + dtype: torch.dtype | None = None + row_splits = [0] + for index, artifact in enumerate(artifacts): + if not isinstance(artifact, torch.Tensor): + raise TypeError( + f"external encoder artifact {index} must be a torch.Tensor" + ) + if artifact.dim() != 2 or any(size <= 0 for size in artifact.shape): + raise ValueError( + f"external encoder artifact {index} must be a non-empty 2D tensor" + ) + if artifact.device.type != "cpu": + raise ValueError(f"external encoder artifact {index} must be on CPU") + if hidden_size is None: + hidden_size = artifact.shape[1] + dtype = artifact.dtype + elif artifact.shape[1] != hidden_size or artifact.dtype != dtype: + raise ValueError( + "external encoder artifacts must have one hidden size and dtype" + ) + tensors.append(artifact) + row_splits.append(row_splits[-1] + artifact.shape[0]) + + packed = torch.cat(tensors, dim=0).contiguous() + return cls( + features=encode_request_plane_tensor(packed), + row_splits=row_splits, + image_token_id=image_token_id, + ) + + def to_artifacts(self) -> list[torch.Tensor]: + """Decode the wire payload into ordered per-image embedding tensors.""" + + packed = decode_request_plane_tensor(self.features) + return [ + packed[start:end] + for start, end in zip(self.row_splits, self.row_splits[1:]) + ] + + def to_dict(self) -> dict[str, Any]: + """Return the versioned, MsgPack-compatible wire object.""" + + return { + "schema": EXTERNAL_ENCODER_RESULT_SCHEMA, + "version": EXTERNAL_ENCODER_RESULT_VERSION, + "format": self.embedding_format, + "features": dict(self.features), + "row_splits": list(self.row_splits), + "image_token_id": self.image_token_id, + } + + @classmethod + def from_dict(cls, data: Mapping[str, Any]) -> "ExternalEncoderResult": + """Validate and parse the versioned wire object.""" + + if not isinstance(data, Mapping): + raise ValueError("external encoder result must be an object") + _check_keys( + data, + { + "schema", + "version", + "format", + "features", + "row_splits", + "image_token_id", + }, + "external encoder result", + ) + if data["schema"] != EXTERNAL_ENCODER_RESULT_SCHEMA: + raise ValueError(f"unsupported external encoder schema {data['schema']!r}") + version = data["version"] + if ( + isinstance(version, bool) + or not isinstance(version, int) + or version != EXTERNAL_ENCODER_RESULT_VERSION + ): + raise ValueError(f"unsupported external encoder version {version!r}") + row_splits = data["row_splits"] + if not isinstance(row_splits, list): + raise ValueError("external encoder row_splits must be an array") + return cls( + features=data["features"], + row_splits=row_splits, + image_token_id=data["image_token_id"], + embedding_format=data["format"], + ) + + +def external_encoder_request_conflicts(request: Mapping[str, Any]) -> list[str]: + """Return source-side multimodal fields that conflict with encoder_result.""" + + conflicts = [ + key for key in EXTERNAL_ENCODER_REQUEST_FIELDS if request.get(key) is not None + ] + extra_args = request.get("extra_args") + if isinstance(extra_args, Mapping): + conflicts.extend( + f"extra_args.{key}" + for key in EXTERNAL_ENCODER_EXTRA_ARG_FIELDS + if extra_args.get(key) is not None + ) + return conflicts + + +def _extract_image_urls(request: Mapping[str, Any]) -> list[str]: + multimodal = request.get("multi_modal_data") or {} + if not isinstance(multimodal, Mapping): + raise InvalidArgument("multi_modal_data must be an object") + + unsupported = sorted( + key for key, value in multimodal.items() if key != _IMAGE_URL and value + ) + if unsupported: + raise InvalidArgument( + "external encoder supports image inputs only; " + f"got unsupported multimodal data: {unsupported}" + ) + + image_items = multimodal.get(_IMAGE_URL) or [] + if not isinstance(image_items, list) or not image_items: + raise InvalidArgument("external encoder requires at least one image") + + image_urls: list[str] = [] + for index, item in enumerate(image_items): + if not isinstance(item, Mapping): + raise InvalidArgument(f"image_url item {index} must be an object") + image_url = item.get(_URL) + if not isinstance(image_url, str) or not image_url: + raise InvalidArgument( + f"image_url item {index} must contain a non-empty 'Url' string" + ) + image_urls.append(image_url) + return image_urls + + +def _build_downstream_request( + request_value: Mapping[str, Any], + encoder_result: ExternalEncoderResult, + *, + target_model: str, +) -> GenerateRequest: + if not target_model: + raise ValueError("target_model must not be empty") + if request_value.get("encoder_result") is not None: + raise InvalidArgument("request already contains encoder_result") + if request_value.get("prompt_embeds") is not None: + raise InvalidArgument( + "external encoder result cannot be combined with prompt_embeds" + ) + + request = dict(request_value) + request["encoder_result"] = encoder_result.to_dict() + request["model"] = target_model + for field_name in EXTERNAL_ENCODER_REQUEST_FIELDS: + request.pop(field_name, None) + + extra_args = request.get("extra_args") + if isinstance(extra_args, Mapping): + copied_extra_args = dict(extra_args) + for field_name in EXTERNAL_ENCODER_EXTRA_ARG_FIELDS: + copied_extra_args.pop(field_name, None) + request["extra_args"] = copied_extra_args + + return cast(GenerateRequest, request) + + +class ExternalEncoderHandoff: + """Drive a ``VisionEncoderBackend`` and prepare a remote vLLM request.""" + + def __init__( + self, + backend: VisionEncoderBackend[str, Any, torch.Tensor], + *, + preprocess_concurrency: int | None = None, + name: str = "external-encoder", + ) -> None: + image_token_id = getattr(backend, "image_token_id", None) + if ( + not isinstance(image_token_id, int) + or isinstance(image_token_id, bool) + or image_token_id < 0 + ): + raise ValueError( + "external linear encoder requires a non-negative integer " + "image_token_id" + ) + self._image_token_id = image_token_id + self._encoder = AsyncVisionEncoder( + backend, + preprocess_concurrency=preprocess_concurrency, + name=name, + ) + + def load(self, model_id: str) -> None: + """Load the backend through Dynamo's maintained encoder driver.""" + + self._encoder.load(model_id) + + async def prepare_request( + self, + request: Mapping[str, Any], + *, + target_model: str, + ) -> GenerateRequest: + """Encode request images and return a sanitized downstream request.""" + + if not target_model: + raise ValueError("target_model must not be empty") + if request.get("encoder_result") is not None: + raise InvalidArgument("request already contains encoder_result") + if request.get("prompt_embeds") is not None: + raise InvalidArgument( + "external encoder result cannot be combined with prompt_embeds" + ) + + image_urls = _extract_image_urls(request) + artifacts = await self._encoder.encode(image_urls) + result = ExternalEncoderResult.from_artifacts( + artifacts, + image_token_id=self._image_token_id, + ) + return _build_downstream_request( + request, + result, + target_model=target_model, + ) + + def shutdown(self) -> None: + """Release the encoder driver and backend resources.""" + + self._encoder.shutdown() diff --git a/components/src/dynamo/vllm/multimodal_utils/custom_encoder/handoff_consumer.py b/components/src/dynamo/vllm/multimodal_utils/custom_encoder/handoff_consumer.py new file mode 100644 index 000000000000..d90d9e0764d8 --- /dev/null +++ b/components/src/dynamo/vllm/multimodal_utils/custom_encoder/handoff_consumer.py @@ -0,0 +1,50 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Consume an external custom encoder handoff in aggregated vLLM.""" + +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any + +from vllm.inputs import EmbedsPrompt + +from dynamo.llm.exceptions import InvalidArgument +from dynamo.vllm.multimodal_utils.custom_encoder.adapter.linear import ( + LinearEmbedsPromptBuilder, +) +from dynamo.vllm.multimodal_utils.custom_encoder.handoff import ExternalEncoderResult + + +class ExternalEncoderHandoffConsumer: + """Decode an encoder handoff into the aggregated worker's prompt.""" + + def __init__(self, model_config: Any, engine_args: Any) -> None: + try: + self._prompt_builder = LinearEmbedsPromptBuilder( + model_config, + engine_args, + ) + except (TypeError, ValueError) as error: + raise RuntimeError(str(error)) from error + + def prepare_prompt( + self, + encoder_result: Mapping[str, Any], + token_ids: list[int], + ) -> EmbedsPrompt: + """Decode packed feature rows and adapt them to vLLM mixed mode.""" + + try: + parsed = ExternalEncoderResult.from_dict(encoder_result) + artifacts = parsed.to_artifacts() + return self._prompt_builder.prepare_prompt( + token_ids, + artifacts, + image_token_id=parsed.image_token_id, + ) + except (TypeError, ValueError) as error: + raise InvalidArgument( + f"invalid external encoder result: {error}" + ) from error diff --git a/components/src/dynamo/vllm/tests/multimodal_utils/custom_encoder/test_vllm_external_handoff.py b/components/src/dynamo/vllm/tests/multimodal_utils/custom_encoder/test_vllm_external_handoff.py new file mode 100644 index 000000000000..b7d3cfbe8203 --- /dev/null +++ b/components/src/dynamo/vllm/tests/multimodal_utils/custom_encoder/test_vllm_external_handoff.py @@ -0,0 +1,289 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Tests for Dynamo's external custom-encoder handoff contract.""" + +from copy import deepcopy +from typing import Any + +import pytest +import torch + +from dynamo.llm.exceptions import InvalidArgument +from dynamo.vllm.multimodal_utils.custom_encoder import ( + ExternalEncoderHandoff, + VisionEncoderBackend, +) +from dynamo.vllm.multimodal_utils.custom_encoder.handoff import ( + ExternalEncoderResult, + decode_request_plane_tensor, + encode_request_plane_tensor, +) + +pytestmark = [ + pytest.mark.unit, + pytest.mark.pre_merge, + pytest.mark.vllm, + pytest.mark.gpu_0, + pytest.mark.multimodal, +] + + +@pytest.mark.parametrize("dtype", [torch.bfloat16, torch.float16, torch.float32]) +def test_request_plane_tensor_round_trip(dtype: torch.dtype) -> None: + tensor = torch.arange(12, dtype=dtype).reshape(3, 4) + + restored = decode_request_plane_tensor(encode_request_plane_tensor(tensor)) + + assert restored.is_contiguous() + assert restored.data_ptr() != tensor.data_ptr() + torch.testing.assert_close(restored, tensor) + + +@pytest.mark.parametrize( + "payload,match", + [ + ( + { + "transport": "request_plane_msgpack", + "shape": [1, 2], + "dtype": "float32", + "data": b"short", + }, + "byte count", + ), + ( + { + "transport": "request_plane_msgpack", + "shape": [1, 2], + "dtype": "float64", + "data": b"", + }, + "dtype", + ), + ( + { + "transport": "request_plane_msgpack", + "shape": [1, 2], + "dtype": "float32", + "data": [0, 1], + }, + "must be bytes", + ), + ], +) +def test_request_plane_tensor_rejects_malformed_payload( + payload: dict[str, Any], match: str +) -> None: + with pytest.raises(ValueError, match=match): + decode_request_plane_tensor(payload) + + +def test_request_plane_tensor_rejects_noncontiguous_input() -> None: + tensor = torch.ones((2, 3), dtype=torch.float32).transpose(0, 1) + + with pytest.raises(ValueError, match="contiguous"): + encode_request_plane_tensor(tensor) + + +def test_external_encoder_result_round_trip() -> None: + result = ExternalEncoderResult( + features=encode_request_plane_tensor(torch.ones((3, 4))), + row_splits=(0, 2, 3), + image_token_id=99, + ) + + restored = ExternalEncoderResult.from_dict(result.to_dict()) + + assert restored.row_splits == (0, 2, 3) + assert restored.image_token_id == 99 + assert restored.embedding_format == "linear_embeddings" + + +def test_external_encoder_result_packs_and_restores_artifacts_in_order() -> None: + artifacts = [ + torch.arange(8, dtype=torch.bfloat16).reshape(2, 4), + torch.full((1, 4), 12, dtype=torch.bfloat16), + ] + + result = ExternalEncoderResult.from_artifacts(artifacts, image_token_id=99) + restored = result.to_artifacts() + + assert result.row_splits == (0, 2, 3) + assert len(restored) == 2 + for actual, expected in zip(restored, artifacts): + torch.testing.assert_close(actual, expected) + + +@pytest.mark.parametrize( + "artifacts,match", + [ + ( + [torch.ones((1, 4)), torch.ones((1, 5))], + "hidden size and dtype", + ), + ( + [ + torch.ones((1, 4), dtype=torch.float16), + torch.ones((1, 4), dtype=torch.float32), + ], + "hidden size and dtype", + ), + ], +) +def test_external_encoder_result_rejects_incompatible_artifacts( + artifacts: list[torch.Tensor], match: str +) -> None: + with pytest.raises(ValueError, match=match): + ExternalEncoderResult.from_artifacts(artifacts, image_token_id=99) + + +def test_external_encoder_result_covers_packed_rows() -> None: + features = encode_request_plane_tensor(torch.ones((3, 4))) + + with pytest.raises(ValueError, match="do not cover"): + ExternalEncoderResult( + features=features, + row_splits=(0, 2), + image_token_id=99, + ) + + +def test_external_encoder_result_rejects_malformed_features() -> None: + class RowSplitsThatMustNotBeRead(list[int]): + def __iter__(self): + raise AssertionError("row_splits read before features were validated") + + with pytest.raises(ValueError, match="features missing fields"): + ExternalEncoderResult.from_dict( + { + "schema": "dynamo.external_encoder_result", + "version": 0, + "format": "linear_embeddings", + "features": {"unexpected": "field"}, + "row_splits": RowSplitsThatMustNotBeRead([0, 1]), + "image_token_id": 99, + } + ) + + +def test_external_encoder_result_rejects_empty_image() -> None: + features = encode_request_plane_tensor(torch.ones((3, 4))) + + with pytest.raises(ValueError, match="strictly increasing"): + ExternalEncoderResult( + features=features, + row_splits=(0, 0, 3), + image_token_id=99, + ) + + +class _Backend(VisionEncoderBackend): + image_token_id = 99 + + def __init__(self) -> None: + self.model_id: str | None = None + self.forward_calls: list[list[str]] = [] + self.closed = False + + def build(self, model_id: str) -> None: + self.model_id = model_id + + def forward_batch(self, items, target_bucket=None): + self.forward_calls.append(list(items)) + return [ + torch.full( + (2 if item == "first" else 1, 4), + float(len(item)), + dtype=torch.bfloat16, + ) + for item in items + ] + + def close(self) -> None: + self.closed = True + + +async def test_handoff_encodes_and_sanitizes_downstream_request() -> None: + backend = _Backend() + handoff = ExternalEncoderHandoff(backend) + request = { + "model": "encoder-model", + "token_ids": [1, 99, 2, 99], + "multi_modal_data": {"image_url": [{"Url": "first"}, {"Url": "second"}]}, + "multi_modal_uuids": {"image": ["one", "two"]}, + "mm_processor_kwargs": {"unused": True}, + "extra_args": { + "keep": "value", + "mm_hashes": ["one", "two"], + "expanded_token_ids": [1, 99, 2, 99], + }, + "sampling_options": {"max_tokens": 7}, + } + original = deepcopy(request) + + handoff.load("encoder-model") + try: + downstream = await handoff.prepare_request( + request, + target_model="decoder-model", + ) + finally: + handoff.shutdown() + + assert request == original + assert backend.model_id == "encoder-model" + assert backend.closed is True + assert [item for batch in backend.forward_calls for item in batch] == [ + "first", + "second", + ] + assert downstream["model"] == "decoder-model" + assert downstream["token_ids"] == [1, 99, 2, 99] + assert downstream["sampling_options"] == {"max_tokens": 7} + assert downstream["extra_args"] == {"keep": "value"} + assert "multi_modal_data" not in downstream + assert "multi_modal_uuids" not in downstream + assert "mm_processor_kwargs" not in downstream + + result = ExternalEncoderResult.from_dict(downstream["encoder_result"]) + assert result.row_splits == (0, 2, 3) + assert result.image_token_id == 99 + + +@pytest.mark.parametrize( + "request_value,match", + [ + ({"encoder_result": {}}, "already contains encoder_result"), + ({"prompt_embeds": []}, "cannot be combined with prompt_embeds"), + ({}, "at least one image"), + ( + {"multi_modal_data": {"audio_url": [{"Url": "audio"}]}}, + "image inputs only", + ), + ( + {"multi_modal_data": {"image_url": ["image"]}}, + "item 0 must be an object", + ), + ], +) +async def test_handoff_rejects_invalid_source_request( + request_value: dict[str, Any], match: str +) -> None: + handoff = ExternalEncoderHandoff(_Backend()) + + with pytest.raises(InvalidArgument, match=match): + await handoff.prepare_request(request_value, target_model="decoder-model") + + +async def test_handoff_rejects_empty_target_model_before_encoding() -> None: + backend = _Backend() + handoff = ExternalEncoderHandoff(backend) + + with pytest.raises(ValueError, match="target_model"): + await handoff.prepare_request( + {"multi_modal_data": {"image_url": [{"Url": "first"}]}}, + target_model="", + ) + + assert backend.forward_calls == [] diff --git a/components/src/dynamo/vllm/tests/test_vllm_handoff_consumer.py b/components/src/dynamo/vllm/tests/test_vllm_handoff_consumer.py new file mode 100644 index 000000000000..676415ddec76 --- /dev/null +++ b/components/src/dynamo/vllm/tests/test_vllm_handoff_consumer.py @@ -0,0 +1,432 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Tests for external encoder results consumed by stock vLLM.""" + +from collections.abc import Mapping +from threading import get_ident +from types import SimpleNamespace +from typing import Any +from unittest.mock import AsyncMock, MagicMock + +import pytest +import torch +from vllm.inputs import EmbedsPrompt + +from dynamo.llm.exceptions import InvalidArgument +from dynamo.vllm.constants import DisaggregationMode +from dynamo.vllm.handlers import BYPASS_REMOTE_PREFILL_ANNOTATION, DecodeWorkerHandler +from dynamo.vllm.multimodal_utils.custom_encoder import handoff as handoff_module +from dynamo.vllm.multimodal_utils.custom_encoder.adapter.linear import ( + LinearEmbedsAdapter, +) +from dynamo.vllm.multimodal_utils.custom_encoder.backend import VisionEncoderBackend +from dynamo.vllm.multimodal_utils.custom_encoder.handoff import ( + ExternalEncoderResult, + encode_request_plane_tensor, +) +from dynamo.vllm.multimodal_utils.custom_encoder.handoff_consumer import ( + ExternalEncoderHandoffConsumer, +) + +pytestmark = [ + pytest.mark.unit, + pytest.mark.pre_merge, + pytest.mark.vllm, + pytest.mark.gpu_0, + pytest.mark.multimodal, +] + +_HIDDEN = 4 +_IMAGE_TOKEN_ID = 99 + + +def _model_config( + *, + dtype: torch.dtype = torch.bfloat16, + multimodal: bool = False, +) -> SimpleNamespace: + return SimpleNamespace( + dtype=dtype, + get_hidden_size=lambda: _HIDDEN, + is_multimodal_model=multimodal, + ) + + +def _engine_args(*, enable_prompt_embeds: bool = True) -> SimpleNamespace: + return SimpleNamespace(enable_prompt_embeds=enable_prompt_embeds) + + +def _encoder_result( + packed: torch.Tensor | None = None, + *, + row_splits: tuple[int, ...] = (0, 2, 3), +) -> dict: + if packed is None: + packed = torch.arange(12, dtype=torch.bfloat16).reshape(3, _HIDDEN) + return ExternalEncoderResult( + features=encode_request_plane_tensor(packed), + row_splits=row_splits, + image_token_id=_IMAGE_TOKEN_ID, + ).to_dict() + + +def _handler( + mode: DisaggregationMode = DisaggregationMode.AGGREGATED, +) -> DecodeWorkerHandler: + handler = object.__new__(DecodeWorkerHandler) + handler.config = SimpleNamespace( + disaggregation_mode=mode, + engine_args=_engine_args(), + ) + handler.model_config = _model_config() + handler._external_encoder_handoff_consumer = None + handler._custom_encoder = None + return handler + + +def test_consumer_builds_mixed_prompt_from_request_plane_features() -> None: + packed = torch.arange(12, dtype=torch.bfloat16).reshape(3, _HIDDEN) + consumer = ExternalEncoderHandoffConsumer(_model_config(), _engine_args()) + + prompt = consumer.prepare_prompt( + _encoder_result(packed), + [1, _IMAGE_TOKEN_ID, 2, _IMAGE_TOKEN_ID, 3], + ) + + assert prompt["prompt_token_ids"] == [1, 99, 99, 2, 99, 3] + assert prompt["prompt_is_token_ids"] == [True, False, False, True, False, True] + torch.testing.assert_close(prompt["prompt_embeds"][1:3], packed[:2]) + torch.testing.assert_close(prompt["prompt_embeds"][4], packed[2]) + + +class _AdapterBackend(VisionEncoderBackend): + image_token_id = _IMAGE_TOKEN_ID + + def build(self, model_id: str) -> None: + pass + + def forward_batch(self, items, target_bucket=None): + raise NotImplementedError + + +def test_handoff_consumer_matches_inline_linear_adapter() -> None: + artifacts = [ + torch.arange(8, dtype=torch.bfloat16).reshape(2, _HIDDEN), + torch.full((1, _HIDDEN), 12, dtype=torch.bfloat16), + ] + token_ids = [1, _IMAGE_TOKEN_ID, 2, _IMAGE_TOKEN_ID, 3] + adapter = LinearEmbedsAdapter( + _AdapterBackend(), + _model_config(), + _engine_args(), + ) + consumer = ExternalEncoderHandoffConsumer(_model_config(), _engine_args()) + + inline_prompt = adapter.prepare_prompt(token_ids, artifacts) + remote_prompt = consumer.prepare_prompt( + ExternalEncoderResult.from_artifacts( + artifacts, + image_token_id=_IMAGE_TOKEN_ID, + ).to_dict(), + token_ids, + ) + + assert remote_prompt["prompt_token_ids"] == inline_prompt["prompt_token_ids"] + assert remote_prompt["prompt_is_token_ids"] == inline_prompt["prompt_is_token_ids"] + torch.testing.assert_close( + remote_prompt["prompt_embeds"], inline_prompt["prompt_embeds"] + ) + + +async def test_handler_reconstructs_prompt_off_event_loop( + monkeypatch: pytest.MonkeyPatch, +) -> None: + event_loop_thread = get_ident() + decode_thread: int | None = None + original_decode = handoff_module.decode_request_plane_tensor + + def tracked_decode(payload: Mapping[str, Any]) -> torch.Tensor: + nonlocal decode_thread + decode_thread = get_ident() + return original_decode(payload) + + monkeypatch.setattr( + handoff_module, + "decode_request_plane_tensor", + tracked_decode, + ) + handler = _handler() + handler._external_encoder_handoff_consumer = ExternalEncoderHandoffConsumer( + _model_config(), + _engine_args(), + ) + + await handler._assemble_external_encoder_prompt( + { + "encoder_result": _encoder_result(row_splits=(0, 3)), + "token_ids": [_IMAGE_TOKEN_ID], + }, + "req-1", + ) + + assert decode_thread is not None + assert decode_thread != event_loop_thread + + +@pytest.mark.parametrize( + "model_config,engine_args,match", + [ + (_model_config(multimodal=True), _engine_args(), "text-only decoder"), + (_model_config(), _engine_args(enable_prompt_embeds=False), "prompt-embeds"), + ], +) +def test_consumer_rejects_incompatible_decoder_configuration( + model_config: SimpleNamespace, + engine_args: SimpleNamespace, + match: str, +) -> None: + with pytest.raises(RuntimeError, match=match): + ExternalEncoderHandoffConsumer(model_config, engine_args) + + +@pytest.mark.parametrize( + "packed,row_splits,match", + [ + ( + torch.ones((3, _HIDDEN + 1), dtype=torch.bfloat16), + (0, 3), + "hidden size", + ), + ( + torch.ones((3, _HIDDEN), dtype=torch.float32), + (0, 3), + "expected decoder dtype", + ), + ], +) +def test_consumer_rejects_invalid_tensor( + packed: torch.Tensor, + row_splits: tuple[int, ...], + match: str, +) -> None: + consumer = ExternalEncoderHandoffConsumer(_model_config(), _engine_args()) + token_ids = [_IMAGE_TOKEN_ID] * (len(row_splits) - 1) + + with pytest.raises(InvalidArgument, match=match): + consumer.prepare_prompt( + _encoder_result(packed, row_splits=row_splits), + token_ids, + ) + + +def test_consumer_rejects_empty_image_row_split() -> None: + packed = torch.ones((2, _HIDDEN), dtype=torch.bfloat16) + encoder_result = _encoder_result(packed, row_splits=(0, 2)) + encoder_result["row_splits"] = [0, 0, 2] + consumer = ExternalEncoderHandoffConsumer(_model_config(), _engine_args()) + + with pytest.raises(InvalidArgument, match="strictly increasing"): + consumer.prepare_prompt( + encoder_result, + [_IMAGE_TOKEN_ID, _IMAGE_TOKEN_ID], + ) + + +def test_consumer_rejects_placeholder_count_mismatch() -> None: + consumer = ExternalEncoderHandoffConsumer(_model_config(), _engine_args()) + + with pytest.raises(InvalidArgument, match="placeholder tokens.*image tensors"): + consumer.prepare_prompt( + _encoder_result(), + [_IMAGE_TOKEN_ID], + ) + + +async def test_handler_assembles_external_prompt_through_handoff_consumer() -> None: + handler = _handler() + expected = EmbedsPrompt( + prompt_embeds=torch.ones((1, _HIDDEN), dtype=torch.bfloat16), + prompt_token_ids=[_IMAGE_TOKEN_ID], + prompt_is_token_ids=[False], + ) + consumer = SimpleNamespace(prepare_prompt=MagicMock(return_value=expected)) + handler._external_encoder_handoff_consumer = consumer + request = { + "token_ids": [_IMAGE_TOKEN_ID], + "encoder_result": _encoder_result(row_splits=(0, 3)), + "extra_args": {"nvext": {"extra_fields": ["engine_data"]}}, + } + + prompt = await handler._assemble_external_encoder_prompt(request, "req-1") + + assert prompt is expected + consumer.prepare_prompt.assert_called_once_with( + request["encoder_result"], + request["token_ids"], + ) + + +async def test_handler_rejects_external_result_in_text_mode() -> None: + handler = _handler() + handler.use_vllm_tokenizer = True + handler._first_token_source = None + handler._multimodal_request_processor = SimpleNamespace( + validate_multimodal_request=MagicMock() + ) + handler._generate_text_mode = MagicMock( + side_effect=AssertionError("text generator must not run") + ) + handler._generate_token_mode = MagicMock( + side_effect=AssertionError("token generator must not run") + ) + context = MagicMock() + context.id.return_value = "req-1" + + chunks = [ + chunk + async for chunk in handler.generate( + {"encoder_result": _encoder_result(row_splits=(0, 3))}, + context, + ) + ] + + assert chunks == [ + { + "finish_reason": ( + "error: external encoder results require token-in/token-out mode" + ), + "index": 0, + "token_ids": [], + } + ] + handler._generate_text_mode.assert_not_called() + handler._generate_token_mode.assert_not_called() + + +@pytest.mark.parametrize( + "field,value", + [ + ("multi_modal_data", {"image_url": [{"Url": "unused"}]}), + ("multi_modal_uuids", {"image": ["unused"]}), + ("prompt_embeds", "unused"), + ("mm_processor_kwargs", {}), + ("mm_routing_info", {}), + ("media_io_kwargs", {}), + ], +) +async def test_handler_rejects_competing_top_level_multimodal_fields( + field: str, + value: object, +) -> None: + handler = _handler() + request = { + "token_ids": [_IMAGE_TOKEN_ID], + "encoder_result": _encoder_result(row_splits=(0, 3)), + field: value, + } + + with pytest.raises(InvalidArgument, match=field): + await handler._assemble_external_encoder_prompt(request, "req-1") + + +@pytest.mark.parametrize( + "field", + [ + "mm_processor_kwargs", + "mm_kwargs_shm", + "mm_kwargs_nixl", + "mm_hashes", + "mm_hashes_by_modality", + "mm_placeholders", + "mm_placeholders_by_modality", + "expanded_token_ids", + ], +) +async def test_handler_rejects_competing_multimodal_extra_args(field: str) -> None: + handler = _handler() + request = { + "token_ids": [_IMAGE_TOKEN_ID], + "encoder_result": _encoder_result(row_splits=(0, 3)), + "extra_args": {field: {}}, + } + + with pytest.raises(InvalidArgument, match=rf"extra_args\.{field}"): + await handler._assemble_external_encoder_prompt(request, "req-1") + + +async def test_handler_propagates_external_encoder_runtime_failure() -> None: + handler = _handler() + handler._external_encoder_handoff_consumer = SimpleNamespace( + prepare_prompt=MagicMock(side_effect=RuntimeError("allocation failed")) + ) + request = { + "token_ids": [_IMAGE_TOKEN_ID], + "encoder_result": _encoder_result(row_splits=(0, 3)), + } + + with pytest.raises(RuntimeError, match="allocation failed"): + await handler._assemble_external_encoder_prompt(request, "req-1") + + +async def test_handler_rejects_external_result_on_disaggregated_worker() -> None: + handler = _handler(DisaggregationMode.DECODE) + + chunks = [ + chunk + async for chunk in handler._generate_token_mode( + {"encoder_result": _encoder_result(row_splits=(0, 3))}, + MagicMock(), + "req-1", + ) + ] + + assert len(chunks) == 1 + assert "aggregated vLLM worker" in chunks[0]["finish_reason"] + + +async def test_decode_bypass_selects_external_prompt_assembly() -> None: + handler = _handler(DisaggregationMode.DECODE) + handler._assemble_external_encoder_prompt = AsyncMock( + side_effect=InvalidArgument("stop after selection") + ) + request = { + "encoder_result": _encoder_result(row_splits=(0, 3)), + "annotations": [BYPASS_REMOTE_PREFILL_ANNOTATION], + } + + with pytest.raises(InvalidArgument, match="stop after selection"): + _ = [ + chunk + async for chunk in handler._generate_token_mode( + request, + MagicMock(), + "req-1", + ) + ] + handler._assemble_external_encoder_prompt.assert_awaited_once_with( + request, + "req-1", + ) + + +async def test_aggregated_token_path_selects_external_prompt_assembly() -> None: + handler = _handler() + handler._assemble_external_encoder_prompt = AsyncMock( + side_effect=InvalidArgument("stop after selection") + ) + request = {"encoder_result": _encoder_result(row_splits=(0, 3))} + + with pytest.raises(InvalidArgument, match="stop after selection"): + _ = [ + chunk + async for chunk in handler._generate_token_mode( + request, + MagicMock(), + "req-1", + ) + ] + handler._assemble_external_encoder_prompt.assert_awaited_once_with( + request, + "req-1", + ) From 9ae086bb94fe1d913086d629d8c2ea0c3169ed2b Mon Sep 17 00:00:00 2001 From: Roger Wang Date: Wed, 23 Sep 2026 13:33:38 -0700 Subject: [PATCH 181/191] feat(multimodal): shared encoded-image cache with session scoping (#14676) Signed-off-by: Dao007forever Signed-off-by: krishung5 Signed-off-by: furionw Co-authored-by: Dao007forever Co-authored-by: krishung5 Co-authored-by: furionw Co-authored-by: Claude Opus 5.5 (1M context) --- .pre-commit-config.yaml | 1 + .../dynamo/common/multimodal/image_loader.py | 137 +++++- .../common/multimodal/shared_image_cache.py | 217 +++++++++ .../tests/multimodal/test_image_loader.py | 461 +++++++++++++++++- .../multimodal/test_image_loader_metrics.py | 150 ++++++ .../src/dynamo/common/utils/prometheus.py | 133 +++++ .../request_handlers/llm/decode_handler.py | 10 +- .../multimodal/encode_worker_handler.py | 49 +- .../tests/test_sglang_frontend_decoding.py | 3 +- .../test_sglang_multimodal_embedding_cache.py | 41 ++ components/src/dynamo/trtllm/encode_helper.py | 15 +- .../trtllm/multimodal/embedding_fetcher.py | 32 +- .../src/dynamo/trtllm/multimodal_processor.py | 8 +- .../test_trtllm_embedding_fetcher.py | 69 +++ .../tests/test_trtllm_multimodal_processor.py | 6 +- .../encode_worker_handler.py | 71 ++- .../multimodal_utils/prefill_worker_utils.py | 55 ++- .../dynamo/vllm/multimodal_utils/protocol.py | 2 + .../multimodal_utils/request_processor.py | 6 +- .../test_vllm_embedding_loader.py | 122 +++++ .../test_vllm_request_processor.py | 53 +- .../tests/test_vllm_encode_worker_decoded.py | 50 +- .../vllm/tests/test_vllm_worker_factory.py | 40 ++ components/src/dynamo/vllm/worker_factory.py | 56 ++- container/deps/requirements.sglang.txt | 3 + container/deps/requirements.trtllm.txt | 3 + container/deps/requirements.vllm.txt | 3 + .../multimodal-serving/embedding-cache.md | 6 + .../use-cases/multimodal-serving/overview.md | 136 ++++++ lib/llm/src/preprocessor.rs | 69 ++- lib/llm/src/protocols/common/preprocessor.rs | 12 + pyproject.toml | 1 + 32 files changed, 1924 insertions(+), 96 deletions(-) create mode 100644 components/src/dynamo/common/multimodal/shared_image_cache.py create mode 100644 components/src/dynamo/common/tests/multimodal/test_image_loader_metrics.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 76c9e1233e7f..cd932c6295be 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -186,6 +186,7 @@ repos: - pytest-asyncio - tomli - pydantic + - redis>=6.2.0,<9.0.0 - filelock - pyyaml - prometheus_client>=0.23.1 diff --git a/components/src/dynamo/common/multimodal/image_loader.py b/components/src/dynamo/common/multimodal/image_loader.py index 77598db40533..034b9e0fd9d5 100644 --- a/components/src/dynamo/common/multimodal/image_loader.py +++ b/components/src/dynamo/common/multimodal/image_loader.py @@ -4,9 +4,11 @@ import asyncio import base64 import binascii +import hashlib import logging import os from collections import OrderedDict +from collections.abc import Mapping from io import BytesIO from typing import Any, Coroutine, Dict, Final, List, Literal, overload from urllib.parse import urlparse @@ -29,6 +31,7 @@ UrlValidationPolicy, validate_media_url, ) +from .shared_image_cache import SharedImageCache, SharedImageCacheStats logger = logging.getLogger(__name__) @@ -36,6 +39,47 @@ URL_VARIANT_KEY: Final = "Url" DECODED_VARIANT_KEY: Final = "Decoded" UUID_ONLY_VARIANT_KEY: Final = "UuidOnly" +IMAGE_CACHE_SCOPE_KEY: Final = "image_cache_scope" +IMAGE_CACHE_SESSION_SCOPED_ENV: Final = "DYN_MM_IMAGE_CACHE_SESSION_SCOPED" + + +def image_cache_scope_from_request(request: Mapping[str, Any]) -> str | None: + """Return a non-empty frontend-derived image-cache scope, if present.""" + scope = request.get(IMAGE_CACHE_SCOPE_KEY) + if not isinstance(scope, str): + return None + scope = scope.strip() + return scope or None + + +def image_cache_session_scoped_from_env() -> bool: + """Return whether multimodal caches must be partitioned by request scope.""" + value = os.environ.get(IMAGE_CACHE_SESSION_SCOPED_ENV, "0") + if value not in ("0", "1"): + raise ValueError( + f"{IMAGE_CACHE_SESSION_SCOPED_ENV} must be '0' or '1', got {value!r}" + ) + return value == "1" + + +def scope_image_cache_key( + cache_key: str, + cache_scope: str | None, + *, + session_scoped_cache: bool, +) -> str | None: + """Apply the common session-scope policy to a multimodal cache key. + + When session scoping is disabled, the original key remains stable. When it + is enabled, a valid scope partitions the key and a missing scope returns + ``None`` so the caller bypasses its cache. + """ + if not session_scoped_cache: + return cache_key + if cache_scope is None or not cache_scope.strip(): + return None + scope_digest = hashlib.sha256(cache_scope.strip().encode("utf-8")).hexdigest() + return f"{scope_digest}:{cache_key}" def _create_nixl_connector() -> Any: @@ -73,6 +117,7 @@ def __init__( enable_frontend_decoding: bool = False, url_policy: UrlValidationPolicy | None = None, max_bytes: int | None = None, + session_scoped_cache: bool | None = None, ): """ Initialize the ImageLoader with caching, HTTP settings, and optional NIXL config for @@ -89,12 +134,20 @@ def __init__( url_policy: Policy for validating URLs. Defaults to UrlValidationPolicy.from_env(). max_bytes: Maximum remote image size in bytes. When omitted, resolve DYN_MM_MAX_FILE_SIZE_MB for each request. + session_scoped_cache: Include a caller-provided cache scope in local, + in-flight, and shared-cache keys. ``None`` (default) reads + DYN_MM_IMAGE_CACHE_SESSION_SCOPED (default off). When enabled, + HTTP loads without a scope bypass all image caches. """ self._http_timeout = http_timeout self._cache_size = cache_size self._configured_max_bytes = max_bytes + if session_scoped_cache is None: + session_scoped_cache = image_cache_session_scoped_from_env() + self._session_scoped_cache = session_scoped_cache self._image_cache: OrderedDict[str, Image.Image] = OrderedDict() self._inflight: dict[str, asyncio.Task[Image.Image]] = {} + self._shared_image_cache = SharedImageCache.from_env() self._enable_frontend_decoding = enable_frontend_decoding self._url_policy = url_policy or UrlValidationPolicy.from_env() # Lazy-init NIXL connector only when frontend decoding is enabled @@ -110,6 +163,41 @@ def _max_bytes(self) -> int: return self._configured_max_bytes return max_media_bytes() + @property + def cache_entries(self) -> int: + """Current number of cached images (read by metrics export).""" + return len(self._image_cache) + + @property + def session_scoped_cache(self) -> bool: + """Whether all multimodal cache keys require a request scope.""" + return self._session_scoped_cache + + @property + def shared_image_cache_stats(self) -> SharedImageCacheStats | None: + """Latency samples for the optional shared encoded-image cache.""" + if self._shared_image_cache is None: + return None + return self._shared_image_cache.stats + + def _cache_key( + self, normalized_url: str, cache_scope: str | None = None + ) -> str | None: + """Return the LRU/inflight/shared-cache key for a validated http(s) URL. + + ``None`` means the caller must bypass all image caches: session + scoping is enabled but no valid scope was provided for this load. + """ + # Preserve path and query case: unlike the scheme and host, both may be + # case-sensitive and therefore identify different origin objects. + url_key = normalized_url + + return scope_image_cache_key( + url_key, + cache_scope, + session_scoped_cache=self._session_scoped_cache, + ) + @staticmethod def _open_image_sync(image_data: BytesIO) -> Image.Image: """Open, validate, and decode an image from raw bytes. Runs in a thread.""" @@ -136,13 +224,29 @@ def _cache_put(self, key: str, image: Image.Image) -> None: self._image_cache.popitem(last=False) self._image_cache[key] = image - async def _fetch_and_process(self, image_url: str) -> Image.Image: + async def _fetch_and_process(self, key: str | None, image_url: str) -> Image.Image: """Fetch image via HTTP(S), decode with PIL, return RGB Image. - All exception normalization happens here so shared callers - see identical error types. + Checks the optional shared encoded-image cache before hitting the + origin and refills it after a successful origin fetch. A ``None`` key + bypasses the shared cache (session scoping without a valid scope). + All exception normalization happens here so shared callers see + identical error types. """ try: + if self._shared_image_cache is not None and key is not None: + cached_content = await self._shared_image_cache.get(key) + if cached_content is not None: + try: + return await self._open_image(BytesIO(cached_content)) + except (OSError, ValueError) as exc: + logger.warning( + "Discarding invalid shared image cache entry for '%s': %s", + image_url[:80], + exc, + ) + await self._shared_image_cache.delete(key) + with _nvtx.annotate("mm:img:http_fetch", color="lime"): content = await fetch_bytes( image_url, @@ -154,7 +258,14 @@ async def _fetch_and_process(self, image_url: str) -> Image.Image: raise ValueError("Empty response content from image URL") image_data = BytesIO(content) - return await self._open_image(image_data) + image = await self._open_image(image_data) + if self._shared_image_cache is not None and key is not None: + # Cache fills are awaited deliberately so Redis acknowledges a + # successful write before this request returns. A cache outage + # remains fail-open, but can add up to the configured Redis I/O + # timeout to a miss; a bounded async queue could avoid that later. + await self._shared_image_cache.put(key, content) + return image except HttpStatusError as e: logger.error(f"HTTP {e.status} loading image: '{image_url}'") @@ -203,7 +314,7 @@ async def _fetch_and_process(self, image_url: str) -> Image.Image: async def _fetch_and_cache(self, key: str, image_url: str) -> Image.Image: """Shared task: fetch, cache, then remove from _inflight.""" try: - image = await self._fetch_and_process(image_url) + image = await self._fetch_and_process(key, image_url) self._cache_put(key, image) return image finally: @@ -221,7 +332,9 @@ async def _read_and_convert_nixl_image( return image if image.mode == "RGB" else image.convert("RGB") @_nvtx.annotate("mm:img:load_image", color="lime") - async def load_image(self, image_url: str) -> Image.Image: + async def load_image( + self, image_url: str, *, cache_scope: str | None = None + ) -> Image.Image: parsed_url = urlparse(image_url) if parsed_url.scheme in ("", "file"): raise ValueError( @@ -231,7 +344,10 @@ async def load_image(self, image_url: str) -> Image.Image: parsed_url = urlparse(normalized_url) if parsed_url.scheme in ("http", "https"): - key = normalized_url.lower() + key = self._cache_key(normalized_url, cache_scope) + + if key is None: + return await self._fetch_and_process(None, normalized_url) if key in self._image_cache: logger.debug(f"Image found in cache for URL: {image_url}") @@ -293,6 +409,7 @@ async def load_image_batch( image_mm_items: List[Dict[str, Any]], *, preserve_uuid_slots: Literal[False] = False, + cache_scope: str | None = None, ) -> list[Image.Image]: ... @@ -302,6 +419,7 @@ async def load_image_batch( image_mm_items: List[Dict[str, Any]], *, preserve_uuid_slots: Literal[True], + cache_scope: str | None = None, ) -> list[Image.Image | None]: ... @@ -310,6 +428,7 @@ async def load_image_batch( image_mm_items: List[Dict[str, Any]], *, preserve_uuid_slots: bool = False, + cache_scope: str | None = None, ) -> list[Any]: """ Load a batch of images from multimodal data items. @@ -324,6 +443,8 @@ async def load_image_batch( image_mm_items: List of multimodal data items for images preserve_uuid_slots: Allow UUID-only items and preserve their positions as None. This is enabled only by backends that resolve such slots. + cache_scope: Stable session or request identifier used when + DYN_MM_IMAGE_CACHE_SESSION_SCOPED is enabled. Returns: Loaded images, with None for UUID-only cache slots @@ -351,7 +472,7 @@ async def load_image_batch( # URL path: download and decode in Python backend url = item[URL_VARIANT_KEY] slot_to_future_idx.append(len(image_futures)) - image_futures.append(self.load_image(url)) + image_futures.append(self.load_image(url, cache_scope=cache_scope)) logger.debug(f"Preparing to load image from URL: {url[:80]}...") elif isinstance(item, dict) and DECODED_VARIANT_KEY in item: if self._enable_frontend_decoding: diff --git a/components/src/dynamo/common/multimodal/shared_image_cache.py b/components/src/dynamo/common/multimodal/shared_image_cache.py new file mode 100644 index 000000000000..297df02b3120 --- /dev/null +++ b/components/src/dynamo/common/multimodal/shared_image_cache.py @@ -0,0 +1,217 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Optional Redis Cluster-backed cache for encoded multimodal image bytes.""" + +import hashlib +import logging +import os +import threading +import time +from collections import defaultdict +from typing import cast + +from redis.asyncio.cluster import RedisCluster +from redis.asyncio.retry import Retry +from redis.backoff import NoBackoff +from redis.exceptions import RedisClusterException, RedisError + +logger = logging.getLogger(__name__) + +_ENABLED_ENV = "DYN_MM_SHARED_IMAGE_CACHE_ENABLED" +_URL_ENV = "DYN_MM_SHARED_IMAGE_CACHE_URL" +_TTL_ENV = "DYN_MM_SHARED_IMAGE_CACHE_TTL_SECS" +_CONNECT_TIMEOUT_ENV = "DYN_MM_SHARED_IMAGE_CACHE_CONNECT_TIMEOUT_SECS" +_IO_TIMEOUT_ENV = "DYN_MM_SHARED_IMAGE_CACHE_IO_TIMEOUT_SECS" +_MAX_PENDING_DURATIONS = 10_000 +_ERROR_WARNING_INTERVAL_SECONDS = 60.0 +# redis-py defines RedisClusterException outside the RedisError hierarchy. +_REDIS_OPERATION_ERRORS = (RedisError, RedisClusterException) + + +def _size_bucket(size_bytes: int | None) -> str: + if size_bytes is None: + return "unknown" + for upper_bound, label in ( + (64 * 1024, "le_64kib"), + (256 * 1024, "le_256kib"), + (1024 * 1024, "le_1mib"), + (4 * 1024 * 1024, "le_4mib"), + (16 * 1024 * 1024, "le_16mib"), + (32 * 1024 * 1024, "le_32mib"), + ): + if size_bytes <= upper_bound: + return label + return "gt_32mib" + + +class SharedImageCacheStats: + """Thread-safe buffer of Redis operation latency samples.""" + + def __init__(self) -> None: + self._lock = threading.Lock() + self._durations: defaultdict[tuple[str, str, str], list[float]] = defaultdict( + list + ) + self._pending_count = 0 + + def record( + self, operation: str, outcome: str, size_bucket: str, duration_s: float + ) -> None: + with self._lock: + if self._pending_count >= _MAX_PENDING_DURATIONS: + return + self._durations[(operation, outcome, size_bucket)].append(duration_s) + self._pending_count += 1 + + def snapshot_and_drain(self) -> dict[tuple[str, str, str], list[float]]: + """Atomically take all pending operation latency samples.""" + with self._lock: + durations = dict(self._durations) + self._durations.clear() + self._pending_count = 0 + return durations + + +class _RateLimitedErrorWarnings: + """Track cache failures and allow one aggregate warning per interval.""" + + def __init__(self, interval_seconds: float) -> None: + self._interval_seconds = interval_seconds + self._lock = threading.Lock() + self._last_warning_at: float | None = None + self._failures_since_warning = 0 + + def record(self, now: float) -> int | None: + """Return the failure count when a warning is due, otherwise ``None``.""" + with self._lock: + self._failures_since_warning += 1 + if ( + self._last_warning_at is not None + and now - self._last_warning_at < self._interval_seconds + ): + return None + failure_count = self._failures_since_warning + self._failures_since_warning = 0 + self._last_warning_at = now + return failure_count + + +class SharedImageCache: + """Fail-open Redis Cluster cache for compressed image payloads.""" + + def __init__(self, client: RedisCluster, ttl_seconds: int) -> None: + self._client = client + self._ttl_seconds = ttl_seconds + self.stats = SharedImageCacheStats() + self._error_warnings = _RateLimitedErrorWarnings( + _ERROR_WARNING_INTERVAL_SECONDS + ) + + @classmethod + def from_env(cls) -> "SharedImageCache | None": + """Build the cache when explicitly enabled, otherwise return ``None``.""" + enabled = os.environ.get(_ENABLED_ENV, "0") + if enabled not in ("0", "1"): + raise ValueError(f"{_ENABLED_ENV} must be '0' or '1', got {enabled!r}") + if enabled == "0": + return None + + url = os.environ.get(_URL_ENV) + if not url: + raise ValueError(f"{_URL_ENV} must be set when {_ENABLED_ENV}=1") + + ttl_seconds = int(os.environ.get(_TTL_ENV, "3600")) + if ttl_seconds <= 0: + raise ValueError(f"{_TTL_ENV} must be greater than zero") + + connect_timeout_seconds = float(os.environ.get(_CONNECT_TIMEOUT_ENV, "0.1")) + if connect_timeout_seconds <= 0: + raise ValueError(f"{_CONNECT_TIMEOUT_ENV} must be greater than zero") + + io_timeout_seconds = float(os.environ.get(_IO_TIMEOUT_ENV, "2.0")) + if io_timeout_seconds <= 0: + raise ValueError(f"{_IO_TIMEOUT_ENV} must be greater than zero") + + client = RedisCluster.from_url( + url, + decode_responses=False, + socket_connect_timeout=connect_timeout_seconds, + socket_timeout=io_timeout_seconds, + # Rediscover through the configured endpoint, typically a Kubernetes + # Service, instead of replacing it with the node addresses the + # cluster announces; those go stale once every node's IP changes. + # The async client accepts this from redis-py 6.2, our floor. + dynamic_startup_nodes=False, + # Fail fast: an origin fetch is cheaper than retrying a cache call. + retry=Retry(NoBackoff(), 0), + ) + # Do not log the URL: Redis URLs may contain credentials. + logger.info("Shared image cache enabled") + return cls(client, ttl_seconds) + + @staticmethod + def _key(cache_identity: str) -> str: + digest = hashlib.sha256(cache_identity.encode("utf-8")).hexdigest() + return f"dynamo:mm:image:{{{digest}}}:bytes" + + def _log_operation_error(self, operation: str, exc: Exception) -> None: + """Log each cache failure at debug and rate-limit aggregate warnings.""" + logger.debug("Shared image cache %s failed: %s", operation, exc) + failure_count = self._error_warnings.record(time.monotonic()) + if failure_count is not None: + logger.warning( + "Shared image cache unavailable; observed %d operation failure(s) " + "since the last warning or startup. Requests continue without " + "the shared cache; repeated failures are logged at debug level " + "for %.0f seconds.", + failure_count, + _ERROR_WARNING_INTERVAL_SECONDS, + ) + + async def get(self, cache_identity: str) -> bytes | None: + """Return cached encoded bytes, or ``None`` on a miss or cache error.""" + key = self._key(cache_identity) + started = time.perf_counter() + outcome = "error" + size_bucket = "unknown" + try: + value = await self._client.get(key) + except _REDIS_OPERATION_ERRORS as exc: + self._log_operation_error("read", exc) + return None + else: + outcome = "hit" if value is not None else "miss" + size_bucket = _size_bucket(len(value) if value is not None else None) + # RedisCluster.get() is typed for both decoded and binary clients, + # but this client is always configured with decode_responses=False. + return cast(bytes | None, value) + finally: + self.stats.record( + "get", outcome, size_bucket, time.perf_counter() - started + ) + + async def put(self, cache_identity: str, content: bytes) -> None: + """Store validated encoded bytes, ignoring cache availability errors.""" + key = self._key(cache_identity) + started = time.perf_counter() + outcome = "error" + size_bucket = _size_bucket(len(content)) + try: + await self._client.set(key, content, ex=self._ttl_seconds) + except _REDIS_OPERATION_ERRORS as exc: + self._log_operation_error("write", exc) + else: + outcome = "success" + finally: + self.stats.record( + "set", outcome, size_bucket, time.perf_counter() - started + ) + + async def delete(self, cache_identity: str) -> None: + """Remove a corrupt entry, ignoring cache availability errors.""" + key = self._key(cache_identity) + try: + await self._client.delete(key) + except _REDIS_OPERATION_ERRORS as exc: + self._log_operation_error("delete", exc) diff --git a/components/src/dynamo/common/tests/multimodal/test_image_loader.py b/components/src/dynamo/common/tests/multimodal/test_image_loader.py index f58473c8bda5..6b296e0aa111 100644 --- a/components/src/dynamo/common/tests/multimodal/test_image_loader.py +++ b/components/src/dynamo/common/tests/multimodal/test_image_loader.py @@ -17,17 +17,28 @@ import asyncio import base64 +import logging from io import BytesIO from unittest.mock import AsyncMock, patch import numpy as np import pytest from PIL import Image +from redis.exceptions import RedisClusterException, RedisError from dynamo.common.http import HttpConnectionError, HttpStatusError, HttpTimeoutError from dynamo.common.http.media_reference import DYN_MM_MAX_FILE_SIZE_MB from dynamo.common.http.url_validator import UrlValidationError, UrlValidationPolicy -from dynamo.common.multimodal.image_loader import URL_VARIANT_KEY, ImageLoader +from dynamo.common.multimodal.image_loader import ( + URL_VARIANT_KEY, + ImageLoader, + image_cache_scope_from_request, +) +from dynamo.common.multimodal.shared_image_cache import ( + SharedImageCache, + _RateLimitedErrorWarnings, + _size_bucket, +) pytestmark = [ pytest.mark.asyncio, @@ -37,6 +48,9 @@ ] _FETCH_BYTES_PATH = "dynamo.common.multimodal.image_loader.fetch_bytes" +_REDIS_CLUSTER_FACTORY_PATH = ( + "dynamo.common.multimodal.shared_image_cache.RedisCluster.from_url" +) def _make_png_bytes() -> bytes: @@ -538,3 +552,448 @@ async def test_cache_is_lru_not_fifo(loader: ImageLoader) -> None: assert "https://example.com/b.png" not in loader._image_cache assert "https://example.com/c.png" in loader._image_cache assert "https://example.com/d.png" in loader._image_cache + + +# --- Shared encoded-image cache --- + + +def _enable_shared_image_cache(monkeypatch, ttl_seconds: int = 3600) -> None: + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_ENABLED", "1") + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_URL", "redis://dragonfly.invalid") + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_TTL_SECS", str(ttl_seconds)) + + +@pytest.mark.parametrize( + ("size_bytes", "expected_bucket"), + [ + (10 * 1024, "le_64kib"), + (30 * 1024 * 1024, "le_32mib"), + (33 * 1024 * 1024, "gt_32mib"), + (None, "unknown"), + ], +) +async def test_shared_cache_size_buckets( + size_bytes: int | None, expected_bucket: str +) -> None: + assert _size_bucket(size_bytes) == expected_bucket + + +async def test_shared_cache_disabled_does_not_create_client(monkeypatch) -> None: + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_ENABLED", "0") + with patch(_REDIS_CLUSTER_FACTORY_PATH) as client_factory: + ImageLoader(cache_size=4, url_policy=_permissive_policy()) + + client_factory.assert_not_called() + + +async def test_shared_cache_requires_url_when_enabled(monkeypatch) -> None: + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_ENABLED", "1") + monkeypatch.delenv("DYN_MM_SHARED_IMAGE_CACHE_URL", raising=False) + + with pytest.raises(ValueError, match="DYN_MM_SHARED_IMAGE_CACHE_URL"): + ImageLoader(cache_size=4, url_policy=_permissive_policy()) + + +async def test_shared_cache_uses_split_timeouts(monkeypatch) -> None: + _enable_shared_image_cache(monkeypatch) + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_CONNECT_TIMEOUT_SECS", "0.25") + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_IO_TIMEOUT_SECS", "3.5") + + with patch(_REDIS_CLUSTER_FACTORY_PATH) as client_factory: + ImageLoader(cache_size=4, url_policy=_permissive_policy()) + + client_factory.assert_called_once() + args, kwargs = client_factory.call_args + retry = kwargs.pop("retry") + assert args == ("redis://dragonfly.invalid",) + assert kwargs == { + "decode_responses": False, + "socket_connect_timeout": 0.25, + "socket_timeout": 3.5, + "dynamic_startup_nodes": False, + } + # Retry has no __eq__ at the redis-py 6.2 floor; check the behavior instead. + assert retry.get_retries() == 0 + + +async def test_shared_cache_hit_skips_origin_fetch(monkeypatch) -> None: + _enable_shared_image_cache(monkeypatch) + client = AsyncMock() + client.get.return_value = PNG_BYTES + origin_fetch = _mock_fetch_bytes() + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + image = await shared_loader.load_image("https://example.com/img.png?sig=one") + + assert image.size == (2, 2) + origin_fetch.assert_not_awaited() + client.get.assert_awaited_once() + client.set.assert_not_awaited() + + +async def test_shared_cache_miss_writes_validated_origin_bytes(monkeypatch) -> None: + _enable_shared_image_cache(monkeypatch, ttl_seconds=123) + client = AsyncMock() + client.get.return_value = None + origin_fetch = _mock_fetch_bytes() + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + image = await shared_loader.load_image("https://example.com/img.png?sig=one") + + assert image.size == (2, 2) + origin_fetch.assert_awaited_once() + client.set.assert_awaited_once() + _, stored_content = client.set.await_args.args + assert stored_content == PNG_BYTES + assert client.set.await_args.kwargs == {"ex": 123} + + +async def test_shared_cache_does_not_write_invalid_origin_bytes(monkeypatch) -> None: + """Origin bytes must decode successfully before they enter the shared cache.""" + _enable_shared_image_cache(monkeypatch) + client = AsyncMock() + client.get.return_value = None + origin_fetch = _mock_fetch_bytes(content=b"not an image") + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + with pytest.raises(HttpStatusError) as exc_info: + await shared_loader.load_image("https://example.com/img.png") + + assert exc_info.value.status == 415 + origin_fetch.assert_awaited_once() + client.set.assert_not_awaited() + + +@pytest.mark.parametrize( + ("session_scoped_cache", "cache_scope"), + [(False, None), (True, "session-a"), (True, None)], + ids=["unscoped", "scoped", "missing-scope-cache-bypass"], +) +async def test_shared_cache_enabled_origin_fetch_uses_media_size_limit( + monkeypatch, + session_scoped_cache: bool, + cache_scope: str | None, +) -> None: + """Shared-cache configuration must cap even cache-bypassed downloads.""" + _enable_shared_image_cache(monkeypatch) + monkeypatch.setenv("DYN_MM_MAX_FILE_SIZE_MB", "7") + client = AsyncMock() + client.get.return_value = None + origin_fetch = _mock_fetch_bytes() + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader( + cache_size=4, + url_policy=_permissive_policy(), + session_scoped_cache=session_scoped_cache, + ) + await shared_loader.load_image( + "https://example.com/img.png", cache_scope=cache_scope + ) + + assert origin_fetch.await_args.kwargs["max_bytes"] == 7 * 1024 * 1024 + + +@pytest.mark.parametrize( + "cache_error", + [ + RedisError("cache unavailable"), + RedisClusterException("Timeout connecting to server"), + ], + ids=["redis-error", "redis-cluster-error"], +) +async def test_shared_cache_errors_fall_back_to_origin( + monkeypatch, cache_error: Exception +) -> None: + _enable_shared_image_cache(monkeypatch) + client = AsyncMock() + client.get.side_effect = cache_error + client.set.side_effect = cache_error + origin_fetch = _mock_fetch_bytes() + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + image = await shared_loader.load_image("https://example.com/img.png") + + assert image.size == (2, 2) + origin_fetch.assert_awaited_once() + client.set.assert_awaited_once() + + +async def test_shared_cache_outage_warnings_are_rate_limited(caplog) -> None: + client = AsyncMock() + client.get.side_effect = RedisError("read unavailable") + client.set.side_effect = RedisError("write unavailable") + client.delete.side_effect = RedisError("delete unavailable") + cache = SharedImageCache(client, ttl_seconds=3600) + + with caplog.at_level( + logging.DEBUG, + logger="dynamo.common.multimodal.shared_image_cache", + ): + assert await cache.get("image") is None + await cache.put("image", PNG_BYTES) + await cache.delete("image") + + warning_records = [ + record for record in caplog.records if record.levelno == logging.WARNING + ] + debug_messages = [ + record.getMessage() + for record in caplog.records + if record.levelno == logging.DEBUG + ] + assert len(warning_records) == 1 + assert ( + "Requests continue without the shared cache" in warning_records[0].getMessage() + ) + assert any("read failed" in message for message in debug_messages) + assert any("write failed" in message for message in debug_messages) + assert any("delete failed" in message for message in debug_messages) + + +async def test_shared_cache_outage_warning_repeats_periodically() -> None: + warnings = _RateLimitedErrorWarnings(interval_seconds=60.0) + + assert warnings.record(100.0) == 1 + assert warnings.record(101.0) is None + assert warnings.record(159.9) is None + assert warnings.record(160.0) == 3 + + +async def test_shared_cache_delete_cluster_error_falls_back_to_origin( + monkeypatch, +) -> None: + _enable_shared_image_cache(monkeypatch) + client = AsyncMock() + client.get.return_value = b"not an image" + client.delete.side_effect = RedisClusterException("Timeout connecting to server") + origin_fetch = _mock_fetch_bytes() + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + image = await shared_loader.load_image("https://example.com/img.png") + + assert image.size == (2, 2) + client.delete.assert_awaited_once() + origin_fetch.assert_awaited_once() + client.set.assert_awaited_once() + + +async def test_invalid_shared_cache_entry_is_deleted_and_refetched(monkeypatch) -> None: + _enable_shared_image_cache(monkeypatch) + client = AsyncMock() + client.get.return_value = b"not an image" + origin_fetch = _mock_fetch_bytes() + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + image = await shared_loader.load_image("https://example.com/img.png") + + assert image.size == (2, 2) + client.delete.assert_awaited_once() + origin_fetch.assert_awaited_once() + client.set.assert_awaited_once() + + +async def test_truncated_shared_cache_entry_is_deleted_and_refetched( + monkeypatch, +) -> None: + """Pillow reports some recognized-but-truncated images as plain OSError.""" + _enable_shared_image_cache(monkeypatch) + client = AsyncMock() + client.get.return_value = PNG_BYTES[:-30] + origin_fetch = _mock_fetch_bytes() + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + image = await shared_loader.load_image("https://example.com/img.png") + + assert image.size == (2, 2) + client.delete.assert_awaited_once() + origin_fetch.assert_awaited_once() + client.set.assert_awaited_once() + + +async def test_cache_key_preserves_url_path_and_query_case(monkeypatch) -> None: + _enable_shared_image_cache(monkeypatch) + client = AsyncMock() + client.get.return_value = None + origin_fetch = _mock_fetch_bytes() + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + await shared_loader.load_image("https://example.com/Image.png?sig=AbC") + await shared_loader.load_image("https://example.com/image.png?sig=abc") + + assert origin_fetch.await_count == 2 + assert client.get.await_count == 2 + assert ( + client.get.await_args_list[0].args[0] != client.get.await_args_list[1].args[0] + ) + + +# --- Session-scoped image cache --- + + +async def test_session_scoped_cache_partitions_local_and_shared_keys( + monkeypatch, +) -> None: + _enable_shared_image_cache(monkeypatch) + client = AsyncMock() + client.get.return_value = None + origin_fetch = _mock_fetch_bytes() + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader( + cache_size=4, + url_policy=_permissive_policy(), + session_scoped_cache=True, + ) + await shared_loader.load_image( + "https://example.com/img.png", cache_scope="session-a" + ) + await shared_loader.load_image( + "https://example.com/img.png", cache_scope="session-b" + ) + await shared_loader.load_image( + "https://example.com/img.png", cache_scope="session-a" + ) + + assert origin_fetch.await_count == 2 + assert client.get.await_count == 2 + assert client.set.await_count == 2 + assert ( + client.get.await_args_list[0].args[0] != client.get.await_args_list[1].args[0] + ) + + +async def test_session_scoped_cache_partitions_inflight_dedup(monkeypatch) -> None: + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_ENABLED", "0") + origin_fetch = _mock_fetch_bytes(delay=0.05) + shared_loader = ImageLoader( + cache_size=4, + url_policy=_permissive_policy(), + session_scoped_cache=True, + ) + + with patch(_FETCH_BYTES_PATH, origin_fetch): + await asyncio.gather( + shared_loader.load_image( + "https://example.com/img.png", cache_scope="session-a" + ), + shared_loader.load_image( + "https://example.com/img.png", cache_scope="session-a" + ), + shared_loader.load_image( + "https://example.com/img.png", cache_scope="session-b" + ), + ) + + assert origin_fetch.await_count == 2 + + +async def test_session_scope_is_ignored_when_flag_is_disabled(monkeypatch) -> None: + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_ENABLED", "0") + origin_fetch = _mock_fetch_bytes() + shared_loader = ImageLoader( + cache_size=4, + url_policy=_permissive_policy(), + session_scoped_cache=False, + ) + + with patch(_FETCH_BYTES_PATH, origin_fetch): + await shared_loader.load_image( + "https://example.com/img.png", cache_scope="session-a" + ) + await shared_loader.load_image( + "https://example.com/img.png", cache_scope="session-b" + ) + + origin_fetch.assert_awaited_once() + + +async def test_session_scoped_cache_can_be_enabled_by_env(monkeypatch) -> None: + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_ENABLED", "0") + monkeypatch.setenv("DYN_MM_IMAGE_CACHE_SESSION_SCOPED", "1") + origin_fetch = _mock_fetch_bytes() + shared_loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + + with patch(_FETCH_BYTES_PATH, origin_fetch): + await shared_loader.load_image( + "https://example.com/img.png", cache_scope="session-a" + ) + await shared_loader.load_image( + "https://example.com/img.png", cache_scope="session-b" + ) + + assert origin_fetch.await_count == 2 + + +async def test_session_scoped_cache_bypasses_when_scope_is_missing(monkeypatch) -> None: + _enable_shared_image_cache(monkeypatch) + client = AsyncMock() + origin_fetch = _mock_fetch_bytes() + + with ( + patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client), + patch(_FETCH_BYTES_PATH, origin_fetch), + ): + shared_loader = ImageLoader( + cache_size=4, + url_policy=_permissive_policy(), + session_scoped_cache=True, + ) + await shared_loader.load_image("https://example.com/img.png") + await shared_loader.load_image("https://example.com/img.png") + + assert origin_fetch.await_count == 2 + assert shared_loader.cache_entries == 0 + client.get.assert_not_awaited() + client.set.assert_not_awaited() + + +@pytest.mark.parametrize( + ("payload", "expected"), + [ + ({"image_cache_scope": " session-a "}, "session-a"), + ({"image_cache_scope": ""}, None), + ({"image_cache_scope": 123}, None), + ({}, None), + ], +) +async def test_image_cache_scope_from_request(payload, expected) -> None: + assert image_cache_scope_from_request(payload) == expected diff --git a/components/src/dynamo/common/tests/multimodal/test_image_loader_metrics.py b/components/src/dynamo/common/tests/multimodal/test_image_loader_metrics.py new file mode 100644 index 000000000000..ce42c14a5982 --- /dev/null +++ b/components/src/dynamo/common/tests/multimodal/test_image_loader_metrics.py @@ -0,0 +1,150 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Unit tests for the shared-cache portion of register_image_loader_metrics.""" + +import asyncio +from io import BytesIO +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest +from PIL import Image +from redis.exceptions import RedisError + +from dynamo.common.http.url_validator import UrlValidationPolicy +from dynamo.common.multimodal.image_loader import ImageLoader +from dynamo.common.utils.prometheus import register_image_loader_metrics + +pytestmark = [ + pytest.mark.asyncio, + pytest.mark.unit, + pytest.mark.gpu_0, + pytest.mark.pre_merge, +] + +_FETCH_BYTES_PATH = "dynamo.common.multimodal.image_loader.fetch_bytes" +_REDIS_CLUSTER_FACTORY_PATH = ( + "dynamo.common.multimodal.shared_image_cache.RedisCluster.from_url" +) + + +def _make_png_bytes() -> bytes: + img = Image.new("RGB", (2, 2), color="red") + buf = BytesIO() + img.save(buf, format="PNG") + return buf.getvalue() + + +PNG_BYTES = _make_png_bytes() + + +def _permissive_policy() -> UrlValidationPolicy: + return UrlValidationPolicy(allow_http=True, allow_private_ips=True) + + +def _mock_fetch_bytes( + content: bytes = PNG_BYTES, + delay: float = 0.0, + side_effect: Exception | None = None, +) -> AsyncMock: + async def _fetch(url, timeout, *, policy=None, max_bytes=None): + if delay > 0: + await asyncio.sleep(delay) + if side_effect is not None: + raise side_effect + return content + + return AsyncMock(side_effect=_fetch) + + +def _parse_metric( + text: str, name: str, label_substr: str | None = None +) -> float | None: + """Parse a metric value from Prometheus expfmt text, optionally filtered + by a label substring (e.g. 'outcome="miss"').""" + for line in text.split("\n"): + if line.startswith(name + "{") or line.startswith(name + " "): + if label_substr is not None and label_substr not in line: + continue + parts = line.rsplit(" ", 1) + if len(parts) == 2: + return float(parts[1]) + return None + + +async def test_shared_cache_get_set_duration_histograms(monkeypatch) -> None: + """Shared-cache timings are exported with bounded outcome labels.""" + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_ENABLED", "1") + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_URL", "redis://dragonfly.invalid") + client = AsyncMock() + client.get.return_value = None + + endpoint = MagicMock() + with patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client): + loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + register_image_loader_metrics(endpoint, loader, "m", "c") + endpoint.metrics.register_prometheus_typed_callback.assert_called_once() + callback = endpoint.metrics.register_prometheus_expfmt_callback.call_args[0][0] + typed_callback = endpoint.metrics.register_prometheus_typed_callback.call_args[0][0] + + with patch(_FETCH_BYTES_PATH, _mock_fetch_bytes()): + await loader.load_image("https://example.com/shared.png") + + typed_metrics = typed_callback() + assert any( + family[0] == "dynamo_component_image_shared_cache_get_duration_seconds" + for family in typed_metrics + ) + text = callback() + assert ( + _parse_metric( + text, + "dynamo_component_image_shared_cache_get_duration_seconds_count", + 'outcome="miss",size_bucket="unknown"', + ) + == 1.0 + ) + assert ( + _parse_metric( + text, + "dynamo_component_image_shared_cache_set_duration_seconds_count", + 'outcome="success",size_bucket="le_64kib"', + ) + == 1.0 + ) + + +async def test_shared_cache_error_duration_histograms(monkeypatch) -> None: + """Redis failures are timed while the loader still fails open.""" + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_ENABLED", "1") + monkeypatch.setenv("DYN_MM_SHARED_IMAGE_CACHE_URL", "redis://dragonfly.invalid") + client = AsyncMock() + client.get.side_effect = RedisError("read unavailable") + client.set.side_effect = RedisError("write unavailable") + + endpoint = MagicMock() + with patch(_REDIS_CLUSTER_FACTORY_PATH, return_value=client): + loader = ImageLoader(cache_size=4, url_policy=_permissive_policy()) + register_image_loader_metrics(endpoint, loader, "m", "c") + callback = endpoint.metrics.register_prometheus_expfmt_callback.call_args[0][0] + + with patch(_FETCH_BYTES_PATH, _mock_fetch_bytes()): + await loader.load_image("https://example.com/shared-error.png") + + text = callback() + assert ( + _parse_metric( + text, + "dynamo_component_image_shared_cache_get_duration_seconds_count", + 'outcome="error",size_bucket="unknown"', + ) + == 1.0 + ) + assert ( + _parse_metric( + text, + "dynamo_component_image_shared_cache_set_duration_seconds_count", + 'outcome="error",size_bucket="le_64kib"', + ) + == 1.0 + ) diff --git a/components/src/dynamo/common/utils/prometheus.py b/components/src/dynamo/common/utils/prometheus.py index 63c64612a2fa..7f226347caa3 100644 --- a/components/src/dynamo/common/utils/prometheus.py +++ b/components/src/dynamo/common/utils/prometheus.py @@ -29,6 +29,7 @@ from prometheus_client import CollectorRegistry from dynamo.common.memory import MultimodalEmbeddingCacheManager + from dynamo.common.multimodal.image_loader import ImageLoader # Auto-label injection: always injects dynamo_namespace, dynamo_component, dynamo_endpoint labels # into engine metrics based on the endpoint hierarchy. @@ -52,6 +53,38 @@ class EmbeddingCacheMetrics(str, enum.Enum): ENTRIES = f"{EMBEDDING_CACHE_METRIC_PREFIX}_entries" +# Single source of truth for image loader metric names. +IMAGE_LOADER_METRIC_PREFIX = f"{name_prefix.COMPONENT}_image" + + +class ImageLoaderMetrics(str, enum.Enum): + """Prometheus metric names for the multimodal image loader.""" + + CACHE_ENTRIES = f"{IMAGE_LOADER_METRIC_PREFIX}_cache_entries" + SHARED_CACHE_GET_DURATION_SECONDS = ( + f"{IMAGE_LOADER_METRIC_PREFIX}_shared_cache_get_duration_seconds" + ) + SHARED_CACHE_SET_DURATION_SECONDS = ( + f"{IMAGE_LOADER_METRIC_PREFIX}_shared_cache_set_duration_seconds" + ) + + +_SHARED_IMAGE_CACHE_DURATION_BUCKETS = ( + 0.001, + 0.0025, + 0.005, + 0.01, + 0.025, + 0.05, + 0.1, + 0.25, + 0.5, + 1.0, + 2.0, + 4.0, +) + + def register_engine_metrics_callback( endpoint: Endpoint, registry: "CollectorRegistry", @@ -674,3 +707,103 @@ def _collect_embedding_cache_typed() -> list: model_name, component_name, ) + + +def register_image_loader_metrics( + endpoint: "Endpoint", + loader: "ImageLoader", + model_name: str = "", + component_name: str = "", +) -> None: + """Register Prometheus metrics for an ImageLoader instance. + + Same mechanics as register_embedding_cache_metrics: a dedicated + CollectorRegistry (avoids prometheus_client import-ordering issues with + SGLang's multiprocess mode) and a threading.Lock against concurrent scrape + races. Shared-cache operation latencies are drained from the loader's + pending sample buffer and observed into the histograms once per scrape. + + Must be called AFTER engine initialization to ensure prometheus_client is + safe to import. + + Args: + endpoint: Dynamo Endpoint with metrics.register_prometheus_expfmt_callback(). + loader: The ImageLoader instance to observe. + model_name: Model name for the 'model' label. + component_name: Component name for the 'dynamo_component' label. + """ + from prometheus_client import CollectorRegistry, Gauge, Histogram, generate_latest + + registry = CollectorRegistry() + label_names = [labels.MODEL, labels.COMPONENT] + label_values = {labels.MODEL: model_name, labels.COMPONENT: component_name} + + ILM = ImageLoaderMetrics + + shared_cache_get_duration_histogram = Histogram( + ILM.SHARED_CACHE_GET_DURATION_SECONDS, + "Shared encoded-image cache GET latency in seconds by terminal outcome " + "and encoded payload size bucket.", + labelnames=label_names + ["outcome", "size_bucket"], + registry=registry, + buckets=_SHARED_IMAGE_CACHE_DURATION_BUCKETS, + ) + shared_cache_set_duration_histogram = Histogram( + ILM.SHARED_CACHE_SET_DURATION_SECONDS, + "Shared encoded-image cache SET latency in seconds by terminal outcome " + "and encoded payload size bucket.", + labelnames=label_names + ["outcome", "size_bucket"], + registry=registry, + buckets=_SHARED_IMAGE_CACHE_DURATION_BUCKETS, + ) + entries_gauge = Gauge( + ILM.CACHE_ENTRIES, + "Number of entries in the image cache.", + labelnames=label_names, + registry=registry, + ) + + lock = threading.Lock() + + def _refresh_locked() -> None: + shared_cache_stats = loader.shared_image_cache_stats + if shared_cache_stats is not None: + shared_cache_durations = shared_cache_stats.snapshot_and_drain() + for ( + operation, + outcome, + size_bucket, + ), samples in shared_cache_durations.items(): + histogram = ( + shared_cache_get_duration_histogram + if operation == "get" + else shared_cache_set_duration_histogram + ) + for duration in samples: + histogram.labels( + **label_values, + outcome=outcome, + size_bucket=size_bucket, + ).observe(duration) + + entries_gauge.labels(**label_values).set(loader.cache_entries) + + def _collect_image_loader_metrics() -> str: + """Callback invoked on each /metrics scrape.""" + with lock: + _refresh_locked() + return generate_latest(registry).decode("utf-8") + + def _collect_image_loader_typed() -> list: + """Return the same image-loader metrics for OTLP export.""" + with lock: + _refresh_locked() + return get_prometheus_typed(registry) + + endpoint.metrics.register_prometheus_expfmt_callback(_collect_image_loader_metrics) + endpoint.metrics.register_prometheus_typed_callback(_collect_image_loader_typed) + logging.info( + "Registered image loader metrics (model=%s, component=%s)", + model_name, + component_name, + ) diff --git a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py index aa05d4f29a9d..abd2573ee9d4 100644 --- a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py +++ b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py @@ -16,7 +16,10 @@ from dynamo.common.backend import logprobs as _shared_logprobs from dynamo.common.constants import DisaggregationMode from dynamo.common.metadata_upload import MetadataUploader -from dynamo.common.multimodal.image_loader import ImageLoader +from dynamo.common.multimodal.image_loader import ( + ImageLoader, + image_cache_scope_from_request, +) from dynamo.common.multimodal.video_loader import VideoLoader from dynamo.common.utils.engine_response import normalize_finish_reason from dynamo.llm import HttpError @@ -760,7 +763,10 @@ async def generate( assert self._image_loader is not None image_items = mm_data.get(IMAGE_URL_KEY) or [] if image_items: - image_data = await self._image_loader.load_image_batch(image_items) + image_data = await self._image_loader.load_image_batch( + image_items, + cache_scope=image_cache_scope_from_request(request), + ) else: image_data = None diff --git a/components/src/dynamo/sglang/request_handlers/multimodal/encode_worker_handler.py b/components/src/dynamo/sglang/request_handlers/multimodal/encode_worker_handler.py index dafafbccef49..7ff645abcce2 100644 --- a/components/src/dynamo/sglang/request_handlers/multimodal/encode_worker_handler.py +++ b/components/src/dynamo/sglang/request_handlers/multimodal/encode_worker_handler.py @@ -36,7 +36,13 @@ MissingMediaDecoderError, video_decoder_missing, ) -from dynamo.common.multimodal.image_loader import DECODED_VARIANT_KEY, URL_VARIANT_KEY +from dynamo.common.multimodal.image_loader import ( + DECODED_VARIANT_KEY, + URL_VARIANT_KEY, + image_cache_scope_from_request, + image_cache_session_scoped_from_env, + scope_image_cache_key, +) from dynamo.common.multimodal.media_descriptor import decoded_content_hash_key from dynamo.common.multimodal.media_source import ( is_local_media_url, @@ -264,6 +270,8 @@ class MultimodalEncodeWorkerHandler(BaseWorkerHandler[SglangMultimodalRequest, s tokens, transfers embeddings, and forwards to the PD worker. """ + _session_scoped_cache = False + def __init__( self, config: Config, @@ -277,6 +285,7 @@ def __init__( self.model = config.server_args.model_path self._missing_video_cache_key_config_warned = False self._decoded_content_hash_warning_emitted = False + self._session_scoped_cache = image_cache_session_scoped_from_env() self._image_loader: Optional[ImageLoader] = ( ImageLoader(enable_frontend_decoding=True) if config.dynamo_args.frontend_decoding @@ -937,14 +946,17 @@ def _parse_media_item(item: Any, media_name: str) -> tuple[str, Any]: return variant, item[variant] async def _prepare_image_inputs( - self, image_items: list[Any] + self, + image_items: list[Any], + cache_scope: str | None = None, ) -> tuple[list[Any], list[Optional[str]], dict[int, Optional[CachedEmbedding]],]: """Prepare MMEncoder inputs and aligned embedding-cache keys. URL variants stay as strings so the existing SGLang loading path is unchanged. Decoded variants are read from NIXL and become PIL Images. Their cache keys come from the canonical content hash serialized by the - Rust media decoder. + Rust media decoder. When session scoping is enabled, a missing scope + leaves both URL and decoded inputs unkeyed. """ encoder_inputs: list[Any] = [None] * len(image_items) cache_keys: list[Optional[str]] = [None] * len(image_items) @@ -962,7 +974,11 @@ async def _prepare_image_inputs( raise ValueError(f"Unsupported image data variant: {item}") encoder_inputs[index] = url if cache is not None: - cache_keys[index] = self._url_hash(url) + cache_keys[index] = scope_image_cache_key( + self._url_hash(url), + cache_scope, + session_scoped_cache=self._session_scoped_cache, + ) continue if not isinstance(value, dict): @@ -974,9 +990,8 @@ async def _prepare_image_inputs( ) if cache is not None: - cache_key = decoded_content_hash_key(value) - cache_keys[index] = cache_key - if cache_key is None: + content_hash = decoded_content_hash_key(value) + if content_hash is None: if not self._decoded_content_hash_warning_emitted: logger.warning( "Frontend-decoded image descriptor has a missing or invalid " @@ -986,10 +1001,17 @@ async def _prepare_image_inputs( ) self._decoded_content_hash_warning_emitted = True else: - cached_entry = cache.get(cache_key) - prechecked_entries[index] = cached_entry - if cached_entry is not None: - continue + cache_key = scope_image_cache_key( + content_hash, + cache_scope, + session_scoped_cache=self._session_scoped_cache, + ) + cache_keys[index] = cache_key + if cache_key is not None: + cached_entry = cache.get(cache_key) + prechecked_entries[index] = cached_entry + if cached_entry is not None: + continue decoded_items.append({DECODED_VARIANT_KEY: value}) decoded_indices.append(index) @@ -1049,7 +1071,10 @@ async def generate( image_inputs, image_cache_keys, image_prechecked_entries, - ) = await self._prepare_image_inputs(image_items) + ) = await self._prepare_image_inputs( + image_items, + cache_scope=image_cache_scope_from_request(raw_request), + ) video_cache_keys: list[Optional[str]] if self._embedding_cache is None: video_cache_keys = [None] * len(video_urls) diff --git a/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py b/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py index 243ad08be1a9..c116e8a8719d 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py +++ b/components/src/dynamo/sglang/tests/test_sglang_frontend_decoding.py @@ -542,6 +542,7 @@ async def fake_async_generate(**kwargs): request = { "token_ids": [1, 2, 3], + "image_cache_scope": "session-42", "multi_modal_data": {"image_url": [{"Decoded": decoded_metadata}]}, } @@ -549,7 +550,7 @@ async def fake_async_generate(**kwargs): pass image_loader.load_image_batch.assert_awaited_once_with( - [{"Decoded": decoded_metadata}] + [{"Decoded": decoded_metadata}], cache_scope="session-42" ) assert captured["image_data"] == [pil_stub] diff --git a/components/src/dynamo/sglang/tests/test_sglang_multimodal_embedding_cache.py b/components/src/dynamo/sglang/tests/test_sglang_multimodal_embedding_cache.py index 5612bb555183..e7eb141e5e1d 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_multimodal_embedding_cache.py +++ b/components/src/dynamo/sglang/tests/test_sglang_multimodal_embedding_cache.py @@ -182,6 +182,47 @@ async def test_encode_with_cache_partial_hit_and_reuse( assert torch.equal(full_embeddings2, full_embeddings) +@pytest.mark.asyncio +async def test_session_scope_partitions_image_embedding_keys( + cache_handler: MultimodalEncodeWorkerHandler, +) -> None: + """The same image URL in separate sessions must use separate entries.""" + cache_handler._session_scoped_cache = True + item = {"Url": "https://example.com/image.png"} + + _, first_keys, _ = await cache_handler._prepare_image_inputs( + [item], cache_scope="session-a" + ) + _, second_keys, _ = await cache_handler._prepare_image_inputs( + [item], cache_scope="session-b" + ) + _, first_keys_again, _ = await cache_handler._prepare_image_inputs( + [item], cache_scope="session-a" + ) + + assert first_keys[0] is not None + assert second_keys[0] is not None + assert first_keys[0] != second_keys[0] + assert first_keys_again == first_keys + + +@pytest.mark.asyncio +async def test_session_scoped_image_embedding_cache_bypasses_without_scope( + cache_handler: MultimodalEncodeWorkerHandler, +) -> None: + """Missing scope must not produce an image embedding-cache key.""" + cache_handler._session_scoped_cache = True + item = {"Url": "https://example.com/image.png"} + + _, missing_keys, _ = await cache_handler._prepare_image_inputs([item]) + _, blank_keys, _ = await cache_handler._prepare_image_inputs( + [item], cache_scope=" " + ) + + assert missing_keys == [None] + assert blank_keys == [None] + + def test_publish_cache_delta_delegates_to_publisher( cache_handler: MultimodalEncodeWorkerHandler, ) -> None: diff --git a/components/src/dynamo/trtllm/encode_helper.py b/components/src/dynamo/trtllm/encode_helper.py index 67301a3150c9..f8a48353b2c3 100644 --- a/components/src/dynamo/trtllm/encode_helper.py +++ b/components/src/dynamo/trtllm/encode_helper.py @@ -12,7 +12,10 @@ import dynamo.nixl_connect as nixl_connect from dynamo.common.http import HttpStatusError -from dynamo.common.multimodal.image_loader import ImageLoader +from dynamo.common.multimodal.image_loader import ( + ImageLoader, + image_cache_scope_from_request, +) from dynamo.trtllm.multimodal_processor import resolve_mm_processor_kwargs from dynamo.trtllm.utils.disagg_utils import DisaggregatedParamsCodec @@ -292,6 +295,7 @@ async def _process_full_epd_flow( model_type: str, engine, mm_processor_kwargs: Optional[dict] = None, + cache_scope: str | None = None, ): """ Process image URLs via TRT-LLM's MultimodalEncoder (full EPD flow). @@ -306,6 +310,8 @@ async def _process_full_epd_flow( model_dir: Path to model directory (unused; kept for API compatibility) model_type: Model type string (unused; kept for API compatibility) engine: TensorRTLLMEngine with MultimodalEncoder + mm_processor_kwargs: Optional model-specific preprocessing options + cache_scope: Optional frontend-derived image-cache isolation scope Yields: Response with ep_disaggregated_params, processed_prompt, and prompt_token_ids @@ -313,7 +319,9 @@ async def _process_full_epd_flow( # Load images with shared ImageLoader (async, same as multimodal_processor PD flow). image_items = [{"Url": u} for u in image_urls] image_loader = EncodeHelper._get_image_loader() - pil_images = await image_loader.load_image_batch(image_items) + pil_images = await image_loader.load_image_batch( + image_items, cache_scope=cache_scope + ) if not pil_images: logging.error("ENCODE WORKER: no images loaded from image_urls") yield {"ep_disaggregated_params": None} @@ -463,7 +471,8 @@ async def process_encode_request( model_dir, model_type, engine, - epd_mm_kwargs, + mm_processor_kwargs=epd_mm_kwargs, + cache_scope=image_cache_scope_from_request(request), ): yield response diff --git a/components/src/dynamo/trtllm/multimodal/embedding_fetcher.py b/components/src/dynamo/trtllm/multimodal/embedding_fetcher.py index c224008b1149..15400b880720 100644 --- a/components/src/dynamo/trtllm/multimodal/embedding_fetcher.py +++ b/components/src/dynamo/trtllm/multimodal/embedding_fetcher.py @@ -20,6 +20,11 @@ CachedEmbedding, MultimodalEmbeddingCacheManager, ) +from dynamo.common.multimodal.image_loader import ( + image_cache_scope_from_request, + image_cache_session_scoped_from_env, + scope_image_cache_key, +) from dynamo.trtllm.multimodal.cuda_ipc import extract_embeddings_from_handles from dynamo.trtllm.multimodal.hasher import MultimodalHasher from dynamo.trtllm.multimodal_processor import resolve_mm_processor_kwargs @@ -134,7 +139,8 @@ async def _fetch_embeddings_with_cache( Checks cache for each URL. Cached embeddings are reused directly. For uncached URLs, sends a single encode request for only those URLs, - then caches the results. + then caches the results. Session-scoped mode partitions keys by the + request's image-cache scope and bypasses the cache when the scope is absent. Args: image_urls: List of image URLs to encode @@ -172,19 +178,28 @@ async def _fetch_embeddings_with_cache( if not mm_kwargs: mm_kwargs = None - def _cache_key(url: str) -> str: + cache_scope = image_cache_scope_from_request(request) + session_scoped_cache = image_cache_session_scoped_from_env() + + def _cache_key(url: str) -> str | None: # JSON-encode the pair rather than concatenating: `url + salt` is ambiguous, # so a URL ending in another request's serialized overrides would collide # with it and be served the wrong embeddings. if mm_kwargs is None: - return MultimodalHasher.hash_bytes(url.encode()) - return MultimodalHasher.hash_bytes( - json.dumps([url, mm_kwargs], sort_keys=True, default=str).encode() + cache_key = MultimodalHasher.hash_bytes(url.encode()) + else: + cache_key = MultimodalHasher.hash_bytes( + json.dumps([url, mm_kwargs], sort_keys=True, default=str).encode() + ) + return scope_image_cache_key( + cache_key, + cache_scope, + session_scoped_cache=session_scoped_cache, ) for i, url in enumerate(image_urls): url_hash = _cache_key(url) - cached = cache.get(url_hash) + cached = cache.get(url_hash) if url_hash is not None else None if cached is not None: embeddings_with_index.append((i, cached.tensor)) else: @@ -219,8 +234,9 @@ def _cache_key(url: str) -> str: new_tensors = await extract_embeddings_from_handles(handles) # Cache new tensors (reuse hashes computed during cache lookup) - for url, url_hash, tensor in zip(uncached_urls, uncached_hashes, new_tensors): - cache.set(url_hash, CachedEmbedding(tensor=tensor)) + for url_hash, tensor in zip(uncached_hashes, new_tensors): + if url_hash is not None: + cache.set(url_hash, CachedEmbedding(tensor=tensor)) # Add new tensors to our list with their original indices for idx, tensor in zip(uncached_indices, new_tensors): diff --git a/components/src/dynamo/trtllm/multimodal_processor.py b/components/src/dynamo/trtllm/multimodal_processor.py index 9cf7a2f14bfb..3523063df6de 100644 --- a/components/src/dynamo/trtllm/multimodal_processor.py +++ b/components/src/dynamo/trtllm/multimodal_processor.py @@ -39,7 +39,10 @@ MissingMediaDecoderError, video_decoder_missing, ) -from dynamo.common.multimodal.image_loader import ImageLoader +from dynamo.common.multimodal.image_loader import ( + ImageLoader, + image_cache_scope_from_request, +) from dynamo.common.multimodal.media_source import describe_media_source from dynamo.common.multimodal.nvdec_decoder import probe_video_codec, should_use_nvdec from dynamo.common.multimodal.video_loader import VideoLoader @@ -517,7 +520,8 @@ async def process_openai_request( if image_urls: try: pil_images = await self.image_loader.load_image_batch( - image_urls + image_urls, + cache_scope=image_cache_scope_from_request(request), ) if pil_images: processed_mm_data["image"] = pil_images diff --git a/components/src/dynamo/trtllm/tests/multimodal/test_trtllm_embedding_fetcher.py b/components/src/dynamo/trtllm/tests/multimodal/test_trtllm_embedding_fetcher.py index 1212f1dfe586..ab35432e5de1 100644 --- a/components/src/dynamo/trtllm/tests/multimodal/test_trtllm_embedding_fetcher.py +++ b/components/src/dynamo/trtllm/tests/multimodal/test_trtllm_embedding_fetcher.py @@ -124,6 +124,75 @@ async def should_not_call(req: dict[str, Any]) -> None: assert len(result) == 2 assert torch.equal(result[0], embedding1) + @pytest.mark.asyncio + async def test_session_scope_partitions_embedding_cache( + self, monkeypatch, encoder_cache + ): + """The same URL in separate sessions must not share an embedding.""" + monkeypatch.setenv("DYN_MM_IMAGE_CACHE_SESSION_SCOPED", "1") + url = "http://example.com/img.jpg" + first_embedding = torch.ones(10, 256) + second_embedding = torch.ones(10, 256) * 2 + mock_client = create_mock_encode_client([first_embedding]) + + with patch( + "dynamo.trtllm.multimodal.embedding_fetcher.extract_embeddings_from_handles", + AsyncMock(side_effect=[[first_embedding], [second_embedding]]), + ) as extract: + first = await fetch_embeddings_from_encoder( + [url], + {"messages": [], "image_cache_scope": "session-a"}, + mock_client, + encoder_cache, + ) + second = await fetch_embeddings_from_encoder( + [url], + {"messages": [], "image_cache_scope": "session-b"}, + mock_client, + encoder_cache, + ) + first_again = await fetch_embeddings_from_encoder( + [url], + {"messages": [], "image_cache_scope": "session-a"}, + mock_client, + encoder_cache, + ) + + assert extract.await_count == 2 + assert torch.equal(first[0], first_embedding) + assert torch.equal(second[0], second_embedding) + assert torch.equal(first_again[0], first_embedding) + assert encoder_cache.stats["entries"] == 2 + + @pytest.mark.asyncio + async def test_session_scoped_embedding_cache_bypasses_without_scope( + self, monkeypatch, encoder_cache + ): + """Missing scope must neither read nor populate the embedding cache.""" + monkeypatch.setenv("DYN_MM_IMAGE_CACHE_SESSION_SCOPED", "1") + url = "http://example.com/img.jpg" + embeddings = [torch.ones(10, 256), torch.ones(10, 256) * 2] + mock_client = create_mock_encode_client([embeddings[0]]) + + with patch( + "dynamo.trtllm.multimodal.embedding_fetcher.extract_embeddings_from_handles", + AsyncMock(side_effect=[[embeddings[0]], [embeddings[1]]]), + ) as extract: + first = await fetch_embeddings_from_encoder( + [url], {"messages": []}, mock_client, encoder_cache + ) + second = await fetch_embeddings_from_encoder( + [url], + {"messages": [], "image_cache_scope": " "}, + mock_client, + encoder_cache, + ) + + assert extract.await_count == 2 + assert torch.equal(first[0], embeddings[0]) + assert torch.equal(second[0], embeddings[1]) + assert encoder_cache.stats["entries"] == 0 + @pytest.mark.asyncio async def test_no_cache_returns_disaggregated_params(self): """No cache: returns DisaggregatedParams directly, request updated with metadata.""" diff --git a/components/src/dynamo/trtllm/tests/test_trtllm_multimodal_processor.py b/components/src/dynamo/trtllm/tests/test_trtllm_multimodal_processor.py index 2fc370448d51..d25bee84094f 100644 --- a/components/src/dynamo/trtllm/tests/test_trtllm_multimodal_processor.py +++ b/components/src/dynamo/trtllm/tests/test_trtllm_multimodal_processor.py @@ -79,10 +79,11 @@ async def test_client_errors_propagate(error, monkeypatch) -> None: monkeypatch.setattr(mmp, "fetch_bytes", video_fetch) request = { + "image_cache_scope": "session-42", "multi_modal_data": { "image_url": [{"Url": "https://example.com/x.png"}], "video_url": [{"Url": "https://example.com/x.mp4"}], - } + }, } with pytest.raises(type(error)) as exc_info: await processor.process_openai_request( @@ -90,6 +91,9 @@ async def test_client_errors_propagate(error, monkeypatch) -> None: ) assert exc_info.value is error + processor.image_loader.load_image_batch.assert_awaited_once_with( + [{"Url": "https://example.com/x.png"}], cache_scope="session-42" + ) video_validate.assert_not_awaited() video_fetch.assert_not_awaited() diff --git a/components/src/dynamo/vllm/multimodal_handlers/encode_worker_handler.py b/components/src/dynamo/vllm/multimodal_handlers/encode_worker_handler.py index 1babae2f6fae..05d9c4dffbd5 100644 --- a/components/src/dynamo/vllm/multimodal_handlers/encode_worker_handler.py +++ b/components/src/dynamo/vllm/multimodal_handlers/encode_worker_handler.py @@ -23,7 +23,11 @@ NixlWriteEmbeddingSender, ) from dynamo.common.multimodal.embedding_transfer import AbstractEmbeddingSender -from dynamo.common.multimodal.image_loader import DECODED_VARIANT_KEY, URL_VARIANT_KEY +from dynamo.common.multimodal.image_loader import ( + DECODED_VARIANT_KEY, + URL_VARIANT_KEY, + scope_image_cache_key, +) from dynamo.common.multimodal.media_descriptor import decoded_content_hash_key from dynamo.common.utils import nvtx_utils as _nvtx from dynamo.common.utils.time_section import time_and_log_code_section @@ -215,13 +219,16 @@ def cleanup(self): (None, None) ) # Send sentinel value to stop the checker - def _image_cache_key(self, group_input) -> str | None: + def _image_cache_key( + self, group_input, cache_scope: str | None = None + ) -> str | None: """Validate one image group and return its embedding-cache key. URL images hash the URL (unchanged from the URL-only path). Frontend- decoded images reuse the canonical content hash serialized by the Rust media decoder; a missing or malformed hash returns ``None`` and the - item is encoded without caching. + item is encoded without caching. The ImageLoader's session-scoping + policy also applies to this embedding cache. """ if group_input is None: raise ValueError( @@ -238,28 +245,36 @@ def _image_cache_key(self, group_input) -> str | None: "Exactly one of image_url or image_decoded is allowed for the " "encode worker." ) + cache_key: str | None if has_url: - return get_embedding_hash(group_input.image_url) - if not self._enable_frontend_decoding: - raise ValueError( - "Received a frontend-decoded image but --frontend-decoding is " - "not enabled on the encode worker. Enable it on both the " - "frontend-facing worker and the encode worker." - ) - cache_key = decoded_content_hash_key(group_input.image_decoded) - if ( - cache_key is None - and self.embedding_cache_manager is not None - and not self._decoded_content_hash_warning_emitted - ): - logger.warning( - "Frontend-decoded image descriptor has a missing or invalid " - "canonical content_hash; this item will bypass the encode-worker " - "embedding cache. Ensure the frontend and encode worker use " - "compatible Dynamo versions and the descriptor is not corrupted." - ) - self._decoded_content_hash_warning_emitted = True - return cache_key + cache_key = get_embedding_hash(group_input.image_url) + else: + if not self._enable_frontend_decoding: + raise ValueError( + "Received a frontend-decoded image but --frontend-decoding is " + "not enabled on the encode worker. Enable it on both the " + "frontend-facing worker and the encode worker." + ) + cache_key = decoded_content_hash_key(group_input.image_decoded) + if ( + cache_key is None + and self.embedding_cache_manager is not None + and not self._decoded_content_hash_warning_emitted + ): + logger.warning( + "Frontend-decoded image descriptor has a missing or invalid " + "canonical content_hash; this item will bypass the encode-worker " + "embedding cache. Ensure the frontend and encode worker use " + "compatible Dynamo versions and the descriptor is not corrupted." + ) + self._decoded_content_hash_warning_emitted = True + if cache_key is None: + return None + return scope_image_cache_key( + cache_key, + cache_scope, + session_scoped_cache=self.image_loader.session_scoped_cache, + ) def _lookup_embedding_item(self, key: str | None) -> EmbeddingItem | None: """Return the cached embedding for ``key``, or ``None`` on a miss. @@ -358,7 +373,9 @@ async def generate( ) for idx in range(len(request.multimodal_inputs)): group_input = request.multimodal_inputs[idx].multimodal_input - embedding_key = self._image_cache_key(group_input) + embedding_key = self._image_cache_key( + group_input, request.image_cache_scope + ) cached_item = self._lookup_embedding_item(embedding_key) if cached_item is not None: embedding_lists[idx] = cached_item @@ -385,7 +402,9 @@ async def generate( wire_items.append( {DECODED_VARIANT_KEY: group_mm_input.image_decoded} ) - loaded_images = await self.image_loader.load_image_batch(wire_items) + loaded_images = await self.image_loader.load_image_batch( + wire_items, cache_scope=request.image_cache_scope + ) if loaded_images: with _nvtx.annotate( diff --git a/components/src/dynamo/vllm/multimodal_utils/prefill_worker_utils.py b/components/src/dynamo/vllm/multimodal_utils/prefill_worker_utils.py index 7b59bf66f84a..5918c7e90a60 100644 --- a/components/src/dynamo/vllm/multimodal_utils/prefill_worker_utils.py +++ b/components/src/dynamo/vllm/multimodal_utils/prefill_worker_utils.py @@ -17,7 +17,12 @@ AbstractEmbeddingReceiver, LocalEmbeddingReceiver, ) -from dynamo.common.multimodal.image_loader import DECODED_VARIANT_KEY, URL_VARIANT_KEY +from dynamo.common.multimodal.image_loader import ( + DECODED_VARIANT_KEY, + URL_VARIANT_KEY, + image_cache_session_scoped_from_env, + scope_image_cache_key, +) from dynamo.common.multimodal.media_descriptor import decoded_content_hash_key from dynamo.common.utils.time_section import time_and_log_code_section from dynamo.runtime import Client @@ -58,17 +63,33 @@ def parse_image_item(item: Any) -> tuple[str | None, Dict[str, Any] | None]: raise ValueError(f"Unsupported image item: {item!r}") -def _image_item_cache_key(item: Any) -> str | None: +def _image_item_cache_key( + item: Any, + *, + cache_scope: str | None = None, + session_scoped_cache: bool = False, +) -> str | None: """Embedding-cache key for one image wire item, or ``None`` if unkeyed. URL items hash the URL; frontend-decoded items reuse the canonical content hash serialized by the Rust media decoder. Decoded items with a - missing/malformed hash return ``None`` and simply bypass the cache. + missing/malformed hash return ``None`` and simply bypass the cache. When + session scoping is enabled, the common image-cache policy partitions the + key or bypasses the cache if no valid scope is present. """ url, decoded = parse_image_item(item) + cache_key: str | None if url is not None: - return get_embedding_hash(url) - return decoded_content_hash_key(decoded) + cache_key = get_embedding_hash(url) + else: + cache_key = decoded_content_hash_key(decoded) + if cache_key is None: + return None + return scope_image_cache_key( + cache_key, + cache_scope, + session_scoped_cache=session_scoped_cache, + ) SPLIT_ENCODE = int(os.getenv("DYN_SPLIT_ENCODE", 1)) @@ -245,6 +266,7 @@ async def _fetch_from_encode_workers( request_id: str, receiver: AbstractEmbeddingReceiver, context=None, + cache_scope: str | None = None, ) -> tuple[List[MultiModalGroup], _PendingRelease | None]: """Fan out image items (URL or frontend-decoded) to encode workers, load embeddings, and return ready groups. @@ -268,6 +290,7 @@ async def _fetch_from_encode_workers( sampling_params=VllmSamplingParams(), request_id=request_id, multimodal_inputs=[], + image_cache_scope=cache_scope, ) with time_and_log_code_section(f"[PREFILL] request: {request_id} dispatch encode"): @@ -349,14 +372,16 @@ async def _fetch_embeddings( receiver: AbstractEmbeddingReceiver, cache: MultimodalEmbeddingCacheManager | None = None, context=None, + cache_scope: str | None = None, + session_scoped_cache: bool = False, ) -> tuple[list[MultiModalGroup], _PendingRelease | None]: """Fetch multimodal embeddings with transparent cache-through. Pipeline: check_cache → fetch misses from encode workers → update_cache. When *cache* is ``None`` the cache steps are no-ops and all items go straight to the encode workers. Items without a cache key (e.g. a - frontend-decoded descriptor missing its content hash) are fetched and - not cached. + frontend-decoded descriptor missing its content hash, or a request missing + its required session scope) are fetched and not cached. For NIXL receivers the returned embeddings are zero-copy views. The returned ``_PendingRelease`` must be released after consuming the @@ -368,7 +393,11 @@ async def _fetch_embeddings( # ── 1. Check cache (no-op when cache is None) ──────────────────── for idx, item in enumerate(image_items): if cache is not None: - key = _image_item_cache_key(item) + key = _image_item_cache_key( + item, + cache_scope=cache_scope, + session_scoped_cache=session_scoped_cache, + ) cached = cache.get(key) if key is not None else None if cached is not None: logger.debug("[%s] Cache hit for image index %d", request_id, idx) @@ -391,6 +420,7 @@ async def _fetch_embeddings( request_id, receiver, context=context, + cache_scope=cache_scope, ) # ── 3. Update cache (no-op when cache is None) ────────────── @@ -421,10 +451,16 @@ def __init__( encode_worker_client: Client, receiver: AbstractEmbeddingReceiver, embedding_cache_manager: MultimodalEmbeddingCacheManager | None = None, + session_scoped_cache: bool | None = None, ): self._encode_worker_client = encode_worker_client self._receiver = receiver self._embedding_cache_manager = embedding_cache_manager + self._session_scoped_cache = ( + image_cache_session_scoped_from_env() + if session_scoped_cache is None + else session_scoped_cache + ) async def load_multimodal_embeddings( self, @@ -433,6 +469,7 @@ async def load_multimodal_embeddings( *, model: str, context=None, + cache_scope: str | None = None, ) -> Dict[str, Any]: """Fetch embeddings and build engine-ready ``multi_modal_data``. @@ -454,6 +491,8 @@ async def load_multimodal_embeddings( self._receiver, cache=self._embedding_cache_manager, context=context, + cache_scope=cache_scope, + session_scoped_cache=self._session_scoped_cache, ) multi_modal_data: Dict[str, Any] = {} diff --git a/components/src/dynamo/vllm/multimodal_utils/protocol.py b/components/src/dynamo/vllm/multimodal_utils/protocol.py index dfa9ec7c0096..2e3c45da38f6 100644 --- a/components/src/dynamo/vllm/multimodal_utils/protocol.py +++ b/components/src/dynamo/vllm/multimodal_utils/protocol.py @@ -194,6 +194,8 @@ class vLLMMultimodalRequest(vLLMGenerateRequest): # Add these fields for Qwen VL (mRoPE) decode-only worker image_grid_thw: Optional[List[List[int]]] = None embeddings_shape: Optional[List[int]] = None + # Opaque frontend-derived scope for encoded/decoded image caches. + image_cache_scope: Optional[str] = None class MyRequestOutput(BaseModel): diff --git a/components/src/dynamo/vllm/multimodal_utils/request_processor.py b/components/src/dynamo/vllm/multimodal_utils/request_processor.py index 84f205e716c8..a12513cb2d53 100644 --- a/components/src/dynamo/vllm/multimodal_utils/request_processor.py +++ b/components/src/dynamo/vllm/multimodal_utils/request_processor.py @@ -27,6 +27,7 @@ URL_VARIANT_KEY, UUID_ONLY_VARIANT_KEY, ImageLoader, + image_cache_scope_from_request, ) from dynamo.common.multimodal.mm_kwargs_transfer import ( MmKwargsNixlReceiver, @@ -552,6 +553,7 @@ async def extract_multimodal_data( request_id, model=self.model, context=context, + cache_scope=image_cache_scope_from_request(request), ) ) @@ -560,7 +562,9 @@ async def extract_multimodal_data( if image_key not in vllm_mm_data and image_items: with _nvtx.annotate("mm_backend:image_download", color="green"): images = await self.image_loader.load_image_batch( - image_items, preserve_uuid_slots=True + image_items, + cache_scope=image_cache_scope_from_request(request), + preserve_uuid_slots=True, ) if images: if self.use_unified_vision_chunk: diff --git a/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_embedding_loader.py b/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_embedding_loader.py index 202bda03904d..a520beb18bfc 100644 --- a/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_embedding_loader.py +++ b/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_embedding_loader.py @@ -3,6 +3,7 @@ """Unit tests for load_multimodal_embeddings in prefill_worker_utils.""" +import json from types import SimpleNamespace from unittest.mock import AsyncMock, Mock, patch @@ -88,6 +89,56 @@ def test_attach_coalesced_embedding_rejects_token_count_mismatch(): ) +@pytest.mark.asyncio +async def test_encode_worker_request_carries_image_cache_scope(): + """The prefill-to-encode hop must preserve frontend cache isolation.""" + captured_payloads = [] + + class _Response: + def __init__(self, payload: str): + self._payload = payload + + def data(self) -> str: + return self._payload + + async def _response_stream(payload: str): + yield _Response(payload) + + async def _round_robin(payload: str, *, context=None): + captured_payloads.append(payload) + response = json.loads(payload) + response["multimodal_inputs"][0]["serialized_request"] = { + "embeddings_shape": [1, 2, 3], + "embedding_dtype_str": "float16", + "serialized_request": "opaque", + } + return _response_stream(json.dumps(response)) + + client = Mock() + client.instance_ids.return_value = ["encode-0"] + client.round_robin = AsyncMock(side_effect=_round_robin) + + receiver = SimpleNamespace( + receive_embeddings=AsyncMock( + return_value=(7, torch.randn(1, 2, 3, dtype=DTYPE)) + ), + release_tensor=Mock(), + ) + groups, pending = await mod._fetch_from_encode_workers( + client, + ["https://example.com/image.png"], + "req-1", + receiver, + cache_scope="session-42", + ) + + assert len(groups) == 1 + assert pending is not None + assert json.loads(captured_payloads[0])["image_cache_scope"] == "session-42" + pending.release_all() + receiver.release_tensor.assert_called_once_with(7) + + class TestMultimodalEmbeddingLoader: @pytest.mark.asyncio async def test_all_cached(self): @@ -137,9 +188,11 @@ async def test_all_uncached_with_cache(self): [url], "req-1", model=MODEL, + cache_scope="session-42", ) mock_fetch.assert_awaited_once() + assert mock_fetch.call_args.kwargs["cache_scope"] == "session-42" assert torch.equal(mm_data["image"], tensor) key = mod.get_embedding_hash(url) @@ -147,6 +200,75 @@ async def test_all_uncached_with_cache(self): assert cached is not None assert torch.equal(cached.tensor, tensor) + @pytest.mark.asyncio + async def test_session_scope_partitions_embedding_cache(self): + """The same URL in separate sessions must not share an embedding.""" + cache = MultimodalEmbeddingCacheManager(capacity_bytes=1024 * 1024) + url = "http://img1.png" + first_tensor = torch.full((1, 10), 1.0, dtype=DTYPE) + second_tensor = torch.full((1, 10), 2.0, dtype=DTYPE) + groups = [ + MultiModalGroup(loaded_embedding=first_tensor), + MultiModalGroup(loaded_embedding=second_tensor), + ] + + with patch.object( + mod, + "_fetch_from_encode_workers", + new_callable=AsyncMock, + side_effect=[([groups[0]], None), ([groups[1]], None)], + ) as mock_fetch: + embedding_loader = mod.MultiModalEmbeddingLoader( + AsyncMock(), None, cache, session_scoped_cache=True + ) + first = await embedding_loader.load_multimodal_embeddings( + [url], "req-1", model=MODEL, cache_scope="session-a" + ) + second = await embedding_loader.load_multimodal_embeddings( + [url], "req-2", model=MODEL, cache_scope="session-b" + ) + first_again = await embedding_loader.load_multimodal_embeddings( + [url], "req-3", model=MODEL, cache_scope="session-a" + ) + + assert mock_fetch.await_count == 2 + assert torch.equal(first["image"], first_tensor) + assert torch.equal(second["image"], second_tensor) + assert torch.equal(first_again["image"], first_tensor) + assert cache.stats["entries"] == 2 + + @pytest.mark.asyncio + async def test_session_scoped_embedding_cache_bypasses_without_scope(self): + """Missing scope must neither read nor populate the embedding cache.""" + cache = MultimodalEmbeddingCacheManager(capacity_bytes=1024 * 1024) + url = "http://img1.png" + tensors = [ + torch.full((1, 10), 1.0, dtype=DTYPE), + torch.full((1, 10), 2.0, dtype=DTYPE), + ] + groups = [MultiModalGroup(loaded_embedding=tensor) for tensor in tensors] + + with patch.object( + mod, + "_fetch_from_encode_workers", + new_callable=AsyncMock, + side_effect=[([groups[0]], None), ([groups[1]], None)], + ) as mock_fetch: + embedding_loader = mod.MultiModalEmbeddingLoader( + AsyncMock(), None, cache, session_scoped_cache=True + ) + first = await embedding_loader.load_multimodal_embeddings( + [url], "req-1", model=MODEL + ) + second = await embedding_loader.load_multimodal_embeddings( + [url], "req-2", model=MODEL, cache_scope=" " + ) + + assert mock_fetch.await_count == 2 + assert torch.equal(first["image"], tensors[0]) + assert torch.equal(second["image"], tensors[1]) + assert cache.stats["entries"] == 0 + @pytest.mark.asyncio async def test_no_cache(self): """Without cache -> all URLs go to encode workers.""" diff --git a/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_request_processor.py b/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_request_processor.py index a9784dce99c1..65003097c401 100644 --- a/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_request_processor.py +++ b/components/src/dynamo/vllm/tests/multimodal_utils/test_vllm_request_processor.py @@ -99,13 +99,51 @@ async def test_extracts_mixed_url_data_url_and_decoded_media(): assert result == {"image": image, "video": video, "audio": [audio_a, audio_b]} processor.image_loader.load_image_batch.assert_awaited_once_with( - image_items, preserve_uuid_slots=True + image_items, cache_scope=None, preserve_uuid_slots=True ) processor.video_loader.load_video_batch.assert_awaited_once_with(video_items, {}) processor.audio_loader.load_audio_batch.assert_awaited_once_with(audio_items) processor.audio_loader.load_audio.assert_not_awaited() +@pytest.mark.asyncio +async def test_image_cache_uses_frontend_scope(): + processor = _processor() + image_items = [{"Url": "https://example.com/image.png"}] + + await processor.extract_multimodal_data( + { + "image_cache_scope": " session-42 ", + "multi_modal_data": {"image_url": image_items}, + }, + "request-1", + None, + ) + + processor.image_loader.load_image_batch.assert_awaited_once_with( + image_items, cache_scope="session-42", preserve_uuid_slots=True + ) + + +@pytest.mark.asyncio +async def test_image_cache_has_no_scope_for_malformed_scope(): + processor = _processor() + image_items = [{"Url": "https://example.com/image.png"}] + + await processor.extract_multimodal_data( + { + "image_cache_scope": " ", + "multi_modal_data": {"image_url": image_items}, + }, + "request-1", + None, + ) + + processor.image_loader.load_image_batch.assert_awaited_once_with( + image_items, cache_scope=None, preserve_uuid_slots=True + ) + + @pytest.mark.asyncio async def test_worker_video_media_io_kwargs_control_vllm_decode(monkeypatch): """Request-level video kwargs reach vLLM's media decoder. @@ -243,10 +281,11 @@ async def test_merges_encoder_images_with_local_video_and_decoded_fallback(): result = await processor.extract_multimodal_data( { + "image_cache_scope": "session-42", "multi_modal_data": { "image_url": [{"Url": "https://example.com/image.png"}], "video_url": [{"Url": "https://example.com/video.mp4"}], - } + }, }, "request-encoder", None, @@ -265,6 +304,12 @@ async def test_merges_encoder_images_with_local_video_and_decoded_fallback(): assert result == {"image": decoded_image} processor.embedding_loader.load_multimodal_embeddings.assert_awaited_once() + assert ( + processor.embedding_loader.load_multimodal_embeddings.call_args.kwargs[ + "cache_scope" + ] + == "session-42" + ) @pytest.mark.asyncio @@ -288,7 +333,7 @@ async def test_extracts_uuid_only_media_as_aligned_none_slots(): assert result == {"image": [image, None]} processor.image_loader.load_image_batch.assert_awaited_once_with( - image_items, preserve_uuid_slots=True + image_items, cache_scope=None, preserve_uuid_slots=True ) processor.embedding_loader.load_multimodal_embeddings.assert_not_awaited() @@ -307,7 +352,7 @@ async def test_extracts_uuid_only_unified_vision_chunk_as_bare_none_slot(): assert result == {"vision_chunk": [None]} processor.image_loader.load_image_batch.assert_awaited_once_with( - image_items, preserve_uuid_slots=True + image_items, cache_scope=None, preserve_uuid_slots=True ) diff --git a/components/src/dynamo/vllm/tests/test_vllm_encode_worker_decoded.py b/components/src/dynamo/vllm/tests/test_vllm_encode_worker_decoded.py index 2f73c373f3ea..5c2a6edc559c 100644 --- a/components/src/dynamo/vllm/tests/test_vllm_encode_worker_decoded.py +++ b/components/src/dynamo/vllm/tests/test_vllm_encode_worker_decoded.py @@ -33,7 +33,10 @@ def _handler( - *, frontend_decoding: bool, capacity_bytes: int = 1 << 20 + *, + frontend_decoding: bool, + capacity_bytes: int = 1 << 20, + session_scoped_cache: bool = False, ) -> EncodeWorkerHandler: """Build a handler without running __init__. @@ -45,6 +48,7 @@ def _handler( handler._enable_frontend_decoding = frontend_decoding handler._decoded_content_hash_warning_emitted = False handler.embedding_cache_manager = MultimodalEmbeddingCacheManager(capacity_bytes) + handler.image_loader = SimpleNamespace(session_scoped_cache=session_scoped_cache) return handler @@ -210,6 +214,50 @@ def test_cache_key_for_decoded_image_uses_content_hash(): assert handler._image_cache_key(group_input) == "0123456789abcdef" +@pytest.mark.parametrize( + ("frontend_decoding", "group_input"), + [ + (False, MultiModalInput(image_url="https://example.com/a.png")), + ( + True, + MultiModalInput( + image_decoded={ + "shape": [4, 4, 3], + "content_hash": "0123456789abcdef", + } + ), + ), + ], + ids=["url", "frontend-decoded"], +) +def test_session_scope_partitions_encode_worker_embedding_keys( + frontend_decoding, group_input +): + handler = _handler( + frontend_decoding=frontend_decoding, + session_scoped_cache=True, + ) + + first_key = handler._image_cache_key(group_input, "session-a") + second_key = handler._image_cache_key(group_input, "session-b") + + assert first_key is not None + assert second_key is not None + assert first_key != second_key + assert handler._image_cache_key(group_input, "session-a") == first_key + + +def test_session_scoped_encode_worker_embedding_cache_bypasses_without_scope(): + handler = _handler( + frontend_decoding=False, + session_scoped_cache=True, + ) + group_input = MultiModalInput(image_url="https://example.com/a.png") + + assert handler._image_cache_key(group_input) is None + assert handler._image_cache_key(group_input, " ") is None + + def test_decoded_image_without_hash_is_unkeyed_and_warns_once(caplog): handler = _handler(frontend_decoding=True) group_input = MultiModalInput(image_decoded={"shape": [4, 4, 3]}) diff --git a/components/src/dynamo/vllm/tests/test_vllm_worker_factory.py b/components/src/dynamo/vllm/tests/test_vllm_worker_factory.py index 32c2f09ffcf7..8d7fac4f9cb2 100644 --- a/components/src/dynamo/vllm/tests/test_vllm_worker_factory.py +++ b/components/src/dynamo/vllm/tests/test_vllm_worker_factory.py @@ -20,6 +20,7 @@ _await_benchmark_then_restore_workers, _DecodeWorkerLifecycle, _merge_benchmark_rank_results, + _register_request_cache_metrics, _stop_worker_gc_policy, _wait_and_load_benchmark, ) @@ -68,6 +69,45 @@ def _make_factory(**overrides) -> WorkerFactory: return WorkerFactory(**defaults) +def test_register_request_cache_metrics_includes_multimodal_image_loader(): + endpoint = Mock() + embedding_cache = object() + image_loader = object() + handler = SimpleNamespace( + embedding_cache_manager=embedding_cache, + _multimodal_request_processor=SimpleNamespace(image_loader=image_loader), + ) + config = SimpleNamespace( + enable_multimodal=True, + served_model_name="served-model", + model="source-model", + component="backend", + ) + + with ( + patch( + "dynamo.vllm.worker_factory.register_embedding_cache_metrics" + ) as register_embedding, + patch( + "dynamo.vllm.worker_factory.register_image_loader_metrics" + ) as register_image, + ): + _register_request_cache_metrics(endpoint, handler, config) + + register_embedding.assert_called_once_with( + endpoint=endpoint, + cache=embedding_cache, + model_name="served-model", + component_name="backend", + ) + register_image.assert_called_once_with( + endpoint=endpoint, + loader=image_loader, + model_name="served-model", + component_name="backend", + ) + + def test_decode_worker_lifecycle_cleanup_in_reverse_construction_order(): calls = [] shutdown_event = asyncio.Event() diff --git a/components/src/dynamo/vllm/worker_factory.py b/components/src/dynamo/vllm/worker_factory.py index adf8bb9f1fd2..83b1910c1935 100644 --- a/components/src/dynamo/vllm/worker_factory.py +++ b/components/src/dynamo/vllm/worker_factory.py @@ -27,6 +27,7 @@ from dynamo.common.utils.prometheus import ( LLMBackendMetrics, register_embedding_cache_metrics, + register_image_loader_metrics, ) from dynamo.llm import ModelInput, ModelType, WorkerType, register_model from dynamo.runtime import DistributedRuntime, Endpoint @@ -54,6 +55,37 @@ from .realtime import RealtimeHandler, RealtimeTranscriptionHandler from .state_agent import StateAgentLifecycle, state_agent_settings + +def _register_request_cache_metrics( + endpoint: Endpoint, + handler: Any, + config: Config, +) -> None: + """Register cache metrics owned by a vLLM request handler.""" + model_name = config.served_model_name or config.model + + embedding_cache = getattr(handler, "embedding_cache_manager", None) + if embedding_cache is not None: + register_embedding_cache_metrics( + endpoint=endpoint, + cache=embedding_cache, + model_name=model_name, + component_name=config.component, + ) + + if not config.enable_multimodal: + return + request_processor = getattr(handler, "_multimodal_request_processor", None) + image_loader = getattr(request_processor, "image_loader", None) + if image_loader is not None: + register_image_loader_metrics( + endpoint=endpoint, + loader=image_loader, + model_name=model_name, + component_name=config.component, + ) + + logger = logging.getLogger(__name__) # The active point has an 8s FPM deadline. ADP schedule/result, decision/commit, @@ -897,6 +929,12 @@ async def _create_multimodal_encode_worker( embedding_cache_capacity_gb=config.multimodal_embedding_cache_capacity_gb, ) await handler.async_init(runtime) + register_image_loader_metrics( + endpoint=generate_endpoint, + loader=handler.image_loader, + model_name=config.served_model_name or config.model, + component_name=config.component, + ) # Encode workers register a model card so the frontend's # serving-readiness gate can count them. The card carries no OpenAI @@ -1348,14 +1386,7 @@ async def _run_decode_worker( self.setup_metrics_collection(config, generate_endpoint, logger) - embedding_cache = getattr(handler, "embedding_cache_manager", None) - if embedding_cache is not None: - register_embedding_cache_metrics( - endpoint=generate_endpoint, - cache=embedding_cache, - model_name=config.served_model_name or config.model, - component_name=config.component, - ) + _register_request_cache_metrics(generate_endpoint, handler, config) # Register engine routes self.register_engine_routes( @@ -1652,14 +1683,7 @@ async def _run_prefill_worker( self.setup_metrics_collection(config, generate_endpoint, logger) - embedding_cache = getattr(handler, "embedding_cache_manager", None) - if embedding_cache is not None: - register_embedding_cache_metrics( - endpoint=generate_endpoint, - cache=embedding_cache, - model_name=config.served_model_name or config.model, - component_name=config.component, - ) + _register_request_cache_metrics(generate_endpoint, handler, config) # Register engine routes self.register_engine_routes( diff --git a/container/deps/requirements.sglang.txt b/container/deps/requirements.sglang.txt index 87fbef4ba8a1..be765e8a0a04 100644 --- a/container/deps/requirements.sglang.txt +++ b/container/deps/requirements.sglang.txt @@ -35,4 +35,7 @@ pillow>=12.3.0,<13 # bounded: this file installs with --force-reinstall # libavcodec that the codec gate rejects. Links libnvcuvid at runtime; requires # NVIDIA_DRIVER_CAPABILITIES to include "video" (set in sglang_runtime.Dockerfile). PyNvVideoCodec>=2.2.0 +# Dynamo installs with --no-deps, so the shared image-cache client must be +# installed explicitly even though the cache is disabled by default. +redis>=6.2.0,<9.0.0 zstandard==0.23.0 diff --git a/container/deps/requirements.trtllm.txt b/container/deps/requirements.trtllm.txt index 95633dc6a56c..5de6cee77c01 100644 --- a/container/deps/requirements.trtllm.txt +++ b/container/deps/requirements.trtllm.txt @@ -48,6 +48,9 @@ pillow>=12.3.0 # /opt/dynamo/venv copy; trtllm_runtime.Dockerfile raises the system one to the # same floor. Keep the two specifiers in step. PyNvVideoCodec>=2.2.0 +# Dynamo installs with --no-deps, so the shared image-cache client must be +# installed explicitly even though the cache is disabled by default. +redis>=6.2.0,<9.0.0 soupsieve>=2.8.4 # JupyterLab stack; see note above jupyter-server tornado>=6.5.6 # JupyterLab stack; see note above jupyter-server # Required by ai_dynamo_runtime (companion to msgspec above). diff --git a/container/deps/requirements.vllm.txt b/container/deps/requirements.vllm.txt index 5f787160bb68..993bee8fdde4 100644 --- a/container/deps/requirements.vllm.txt +++ b/container/deps/requirements.vllm.txt @@ -35,3 +35,6 @@ pillow>=12.3.0 # rejects; 2.2.0 bundles only libavutil + libavformat (container demux, no codec). # Requires NVIDIA_DRIVER_CAPABILITIES to include "video" or it cannot import. PyNvVideoCodec>=2.2.0 +# Dynamo installs with --no-deps, so declare the shared image-cache client +# explicitly instead of relying on LMCache's unbounded transitive dependency. +redis>=6.2.0,<9.0.0 diff --git a/docs/fern/pages/use-cases/multimodal-serving/embedding-cache.md b/docs/fern/pages/use-cases/multimodal-serving/embedding-cache.md index fa6f711f16f5..46ceb6bcd15e 100644 --- a/docs/fern/pages/use-cases/multimodal-serving/embedding-cache.md +++ b/docs/fern/pages/use-cases/multimodal-serving/embedding-cache.md @@ -59,6 +59,12 @@ If your workload consists entirely of unique multimodal content, the cache provi Set `--multimodal-embedding-cache-capacity-gb` based on your expected working set of unique multimodal content. A larger cache holds more embeddings but consumes more host memory. +> [!NOTE] +> If one image URL can return different content for different sessions, enable +> session-scoped caching as described in [Multimodal Model Serving](overview.md#session-scoping). +> Dynamo then partitions its image embedding caches by affinity scope and +> bypasses them when a request has no valid scope. + See the backend-specific documentation ([vLLM](../../developer-guide/knowledge-base/modular-components/backends/vllm/multimodal.md#embedding-cache), [TRT-LLM](../../developer-guide/knowledge-base/modular-components/backends/tensorrt-llm/multimodal.md#embedding-cache)) for more details. ## How It Works diff --git a/docs/fern/pages/use-cases/multimodal-serving/overview.md b/docs/fern/pages/use-cases/multimodal-serving/overview.md index 89b47f3785ce..09dc71d55aff 100644 --- a/docs/fern/pages/use-cases/multimodal-serving/overview.md +++ b/docs/fern/pages/use-cases/multimodal-serving/overview.md @@ -48,3 +48,139 @@ Reference implementations for deploying multimodal models for each backend: - [vLLM Multimodal](../../developer-guide/knowledge-base/modular-components/backends/vllm/multimodal.md) To use an author-provided custom vision tower or projector, see [Custom Vision Encoders](custom-vision-encoders.md). + +## Shared Image Download Cache + +The optional shared cache stores encoded bytes from HTTP and HTTPS image URLs +before image decoding. Workers can reuse those bytes across processes while +keeping their local decoded-image caches independent. Data URLs, +frontend-decoded NIXL inputs, video, and audio do not use this cache. + +### Backend Support + +| Backend | Mode | Shared encoded-image cache | +| --- | --- | --- | +| vLLM | Aggregated and disaggregated paths that load URLs through Dynamo `ImageLoader` | Supported | +| TensorRT-LLM | Aggregated and disaggregated paths that load URLs through Dynamo `ImageLoader` | Supported | +| SGLang | Standard URL loading | Not supported. Dynamo passes URL strings directly to SGLang. | +| SGLang | `--frontend-decoding` | Only URL items that still reach Dynamo `ImageLoader` can use the cache. NIXL-decoded items bypass it. | + +Dynamo does not provision or discover a cache service. Deploy Redis Cluster or +Dragonfly separately and provide a cluster endpoint that every participating +URL-loading worker can reach. The connection URL carries the endpoint, +authentication, and TLS choice. See [Cache Service Deployment](#cache-service-deployment) +for single-node and multi-node layouts. + +Set the following environment variables on every participating worker: + +| Environment variable | Default | Description | +| --- | --- | --- | +| `DYN_MM_SHARED_IMAGE_CACHE_ENABLED` | `0` | Set to `1` to enable the shared cache. | +| `DYN_MM_SHARED_IMAGE_CACHE_URL` | None | Redis Cluster or Dragonfly connection URL. Required when the cache is enabled. | +| `DYN_MM_SHARED_IMAGE_CACHE_TTL_SECS` | `3600` | Positive cache-entry lifetime in seconds. | +| `DYN_MM_SHARED_IMAGE_CACHE_CONNECT_TIMEOUT_SECS` | `0.1` | Positive connection timeout in seconds. | +| `DYN_MM_SHARED_IMAGE_CACHE_IO_TIMEOUT_SECS` | `2.0` | Positive Redis operation timeout in seconds. | +| `DYN_MM_MAX_FILE_SIZE_MB` | `64` | Maximum encoded image size downloaded from the origin, in MiB. The limit applies whether or not the shared cache is enabled, so oversized images are never stored in it. | +| `DYN_MM_IMAGE_CACHE_SESSION_SCOPED` | `0` | Set to `1` to partition Dynamo image and image-embedding caches by session affinity. | + +Store the full connection URL in a Kubernetes Secret and inject it into each +worker rather than placing credentials in a manifest: + +```yaml +env: + - name: DYN_MM_SHARED_IMAGE_CACHE_ENABLED + value: "1" + - name: DYN_MM_SHARED_IMAGE_CACHE_URL + valueFrom: + secretKeyRef: + name: multimodal-image-cache + key: connection-url + - name: DYN_MM_IMAGE_CACHE_SESSION_SCOPED + value: "1" +``` + +> [!WARNING] +> Use a `rediss://` URL unless Redis traffic is protected by equivalent +> transport encryption, such as an encrypted service mesh. A `redis://` URL +> sends cache data and any URL credentials without TLS and should be used only +> on an appropriately secured in-cluster network. + +Cache reads and fills run on the request path. A miss waits for Redis `SET` so +the fill completes before the request returns. Redis errors fail open, and each +cache operation is attempted once. While a cache node is unreachable, an image +load pays one failed `GET` and one failed `SET`: each is bounded by +`DYN_MM_SHARED_IMAGE_CACHE_CONNECT_TIMEOUT_SECS` when a new connection is +refused or times out, and by `DYN_MM_SHARED_IMAGE_CACHE_IO_TIMEOUT_SECS` when +an open connection stops responding. +Warnings are emitted initially and at most once per minute; individual +operation failures remain available at debug level. Dynamo does not currently +use a bounded asynchronous write queue. + +### Cache Service Deployment + +Dynamo uses the Redis Cluster protocol for both backends. The client uses +`DYN_MM_SHARED_IMAGE_CACHE_URL` only to discover the cluster: it reads the slot +map from that endpoint and then connects to each node at the address the node +announces. When a node stops responding, the client rediscovers through the same +URL, so point it at an address that survives cache restarts, such as a +Kubernetes Service that selects every cache node, not at an individual pod. +After a restart, the nodes announce their new addresses and workers pick them +up without restarting. Dynamo requires redis-py 6.2 or later. + +**Single-node Dragonfly.** Run Dragonfly with `--cluster_mode=emulated` so that +it answers Redis Cluster commands, and keep its default announced address (the +pod IP). Do not set `--cluster_announce_ip` to the host in +`DYN_MM_SHARED_IMAGE_CACHE_URL`: with redis-py 6.2 through 7.1, a node that +announces the same host and port as the URL removes the URL from the client's +rediscovery list after one failed operation. + +**Redis Cluster.** Run the nodes as a StatefulSet with a headless Service for +per-pod DNS names, plus a regular Service that selects every node for the URL. +Configure each node with: + +- `cluster-announce-ip` set to the pod IP, or `cluster-announce-hostname` set to + the pod's DNS name together with `cluster-preferred-endpoint-type hostname` + (Redis 7.0 or later). +- `cluster-require-full-coverage no`, so the remaining nodes keep serving while + one node is down. Images that hash to the unavailable node fall back to the + origin. +- A `nodes.conf` that persists across pod restarts, so a restarted node keeps its + identity and slots. A rolling restart then keeps the cluster available. If + every node restarts at once, all peer addresses change and the nodes need + their peers' new addresses before they can re-form the cluster. + +**Multi-node Dragonfly.** With `--cluster_mode=yes`, Dragonfly nodes do not +discover each other. A cluster orchestrator must push the slot map with +`DFLYCLUSTER CONFIG` and push it again whenever a node restarts, because the +map is kept in memory. Point the URL at a Service that selects every node, as +for Redis Cluster. + +### Session Scoping + +Enable `DYN_MM_IMAGE_CACHE_SESSION_SCOPED=1` when the same URL can resolve to +different content for different sessions. Dynamo derives the +scope from these headers, in precedence order: + +1. `x-dynamo-session-id` +2. Recognized agent headers: Claude Code `x-claude-code-session-id` (or + `x-claude-code-agent-id` for a child agent), Codex `thread-id`, then OpenCode + `x-session-id` + +Use `x-dynamo-session-id` to provide an explicit Dynamo session identity. +Dynamo normalizes it and the recognized agent headers into both an +`AgentContext` and the session affinity used for routing and image-cache +scoping. + +> [!WARNING] +> Session scoping partitions cache entries; it is not an authentication +> boundary. Unless a trusted proxy sets or overwrites `x-dynamo-session-id`, +> the caller controls the scope. Configure the proxy to derive this header +> from the authenticated identity on every request, and treat scope identifiers +> as secrets. A caller that learns another identifier can reuse cached content +> stored under that scope for the same URL. + +When session scoping is enabled, a missing or blank scope bypasses the local +decoded-image cache, in-flight request deduplication, the shared encoded-image +cache, and Dynamo-owned image embedding caches. A valid scope partitions all of +those caches. The scope does not partition backend KV cache keys; affinity can +route a session back to the same worker, but KV identity remains content-based. diff --git a/lib/llm/src/preprocessor.rs b/lib/llm/src/preprocessor.rs index 6fed161eb04f..6c0a5072a21e 100644 --- a/lib/llm/src/preprocessor.rs +++ b/lib/llm/src/preprocessor.rs @@ -1459,6 +1459,25 @@ fn attach_agent_context_from_context( } } +fn attach_image_cache_scope_from_context( + request: &mut PreprocessedRequest, + context: &PipelineContext<()>, +) { + use crate::protocols::common::extensions::{SESSION_AFFINITY_CONTEXT_KEY, SessionAffinityId}; + + if let Ok(session_affinity) = context.get::(SESSION_AFFINITY_CONTEXT_KEY) { + request.image_cache_scope = Some(session_affinity.as_str().to_owned()); + } +} + +fn attach_request_context_metadata( + request: &mut PreprocessedRequest, + context: &PipelineContext<()>, +) { + attach_agent_context_from_context(request, context); + attach_image_cache_scope_from_context(request, context); +} + /// Thin wrapper that prepares messages for MiniJinja. Normalizes historical /// `function.arguments` when the model opts in (GLM-5.2), and appends /// HuggingFace's unique continue-final-message marker when that flag is set. @@ -7154,7 +7173,7 @@ impl ) .instrument(preprocessing.clone()) .await?; - attach_agent_context_from_context(&mut common_request, &context); + attach_request_context_metadata(&mut common_request, &context); let guided_tool_constraint = self.apply_tool_choice_guided_decoding( &request, @@ -7363,7 +7382,7 @@ impl let mut common_request = builder.build()?; Self::validate_preprocessed_token_budget(&common_request, self.token_budget.as_ref())?; - attach_agent_context_from_context(&mut common_request, &context); + attach_request_context_metadata(&mut common_request, &context); let trace_state = crate::request_trace::build_request_end_trace_state( &common_request, @@ -10633,6 +10652,52 @@ mod tests { ); } + #[test] + fn attach_request_context_metadata_keeps_affinity_separate_from_agent_context() { + use crate::protocols::common::extensions::{ + SESSION_AFFINITY_CONTEXT_KEY, SessionAffinityId, + }; + + let agent_context = AgentContext { + session_id: "agent-session".to_string(), + parent_session_id: Some("agent-parent".to_string()), + session_final: None, + compaction: None, + input_trigger: None, + }; + let mut context = PipelineContext::new(()); + context.insert(AGENT_CONTEXT_CONTEXT_KEY, agent_context.clone()); + context.insert( + SESSION_AFFINITY_CONTEXT_KEY, + SessionAffinityId::new("routing-session"), + ); + let mut request = preprocessed_budget_request(None); + + attach_request_context_metadata(&mut request, &context); + + assert_eq!(request.agent_context.as_ref(), Some(&agent_context)); + assert_eq!( + request.image_cache_scope.as_deref(), + Some("routing-session") + ); + let wire = serde_json::to_value(&request).unwrap(); + assert_eq!(wire["agent_context"]["session_id"], "agent-session"); + assert_eq!(wire["image_cache_scope"], "routing-session"); + + let mut affinity_only_context = PipelineContext::new(()); + affinity_only_context.insert( + SESSION_AFFINITY_CONTEXT_KEY, + SessionAffinityId::new("routing-only"), + ); + let mut affinity_only_request = preprocessed_budget_request(None); + attach_request_context_metadata(&mut affinity_only_request, &affinity_only_context); + assert!(affinity_only_request.agent_context.is_none()); + assert_eq!( + affinity_only_request.image_cache_scope.as_deref(), + Some("routing-only") + ); + } + #[test] fn test_preprocessed_completion_budget_validation_and_deferral() { let text_request = preprocessed_budget_request(Some(8)); diff --git a/lib/llm/src/protocols/common/preprocessor.rs b/lib/llm/src/protocols/common/preprocessor.rs index df9efe1553ae..eb3a4d54cd7e 100644 --- a/lib/llm/src/protocols/common/preprocessor.rs +++ b/lib/llm/src/protocols/common/preprocessor.rs @@ -464,6 +464,18 @@ pub struct PreprocessedRequest { #[serde(default, skip_serializing_if = "Option::is_none")] pub agent_context: Option, + /// Opaque frontend-derived scope for partitioning backend `ImageLoader` + /// URL caches and Dynamo-owned image embedding caches. This does not + /// namespace engine KV caches. + /// + /// This is carried separately from `agent_context` because backends need + /// only the opaque cache scope, not agent lifecycle metadata. + /// The optional field is safe across rolling upgrades: older readers + /// ignore it and newer readers default it when an older frontend omits it. + #[builder(default)] + #[serde(default, skip_serializing_if = "Option::is_none")] + pub image_cache_scope: Option, + /// Multimodal processor kwargs forwarded to the backend engine /// (e.g. `{"use_audio_in_video": true}` for omni models). #[builder(default)] diff --git a/pyproject.toml b/pyproject.toml index 713f70b24b40..e5c5cfa9bff1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,7 @@ dependencies = [ "kubernetes>=32.0.1,<33.0.0", "prometheus_client>=0.23.1,<1.0", "msgspec>=0.19.0", + "redis>=6.2.0,<9.0.0", "zstandard>=0.23.0,<1.0", "pyzmq>=26.0.0", # typing.Self is 3.11+; declared minimum is 3.10 (see requires-python), From b759f3d8ff51aa049b48f5658d21bd1d89b35e07 Mon Sep 17 00:00:00 2001 From: GLAMR Date: Wed, 23 Sep 2026 17:57:24 -0400 Subject: [PATCH 182/191] fix(tests): resolve AISimulate from NVIDIA index in wheel smoke tests (#15090) Signed-off-by: svc-glamr@nvidia.com Signed-off-by: GLAMR --- .../test_aisimulate_consistency.py | 5 +++- tests/wheels/smoke_install.py | 24 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/tests/dependencies/test_aisimulate_consistency.py b/tests/dependencies/test_aisimulate_consistency.py index f3fa00f26f15..22630dd264fa 100644 --- a/tests/dependencies/test_aisimulate_consistency.py +++ b/tests/dependencies/test_aisimulate_consistency.py @@ -16,6 +16,8 @@ from packaging.utils import canonicalize_name from packaging.version import Version +from tests.wheels.smoke_install import AISIMULATE_FIND_LINKS + try: import tomllib except ModuleNotFoundError: # Python 3.10 @@ -148,7 +150,8 @@ def test_container_stages_the_published_aisimulate_wheel() -> None: assert "--only-binary=:all:" in wheel_builder assert "--no-deps" in wheel_builder assert "--no-index" in wheel_builder - assert "--find-links https://pypi.nvidia.com/aisimulate/" in wheel_builder + assert AISIMULATE_FIND_LINKS == "https://pypi.nvidia.com/aisimulate/" + assert f"--find-links {AISIMULATE_FIND_LINKS}" in wheel_builder assert "COPY aisimulate" not in wheel_builder assert "/opt/dynamo/aisimulate" not in wheel_builder assert not (ROOT / "aisimulate").exists() diff --git a/tests/wheels/smoke_install.py b/tests/wheels/smoke_install.py index d645cd1c8194..110077ff8fba 100644 --- a/tests/wheels/smoke_install.py +++ b/tests/wheels/smoke_install.py @@ -271,6 +271,11 @@ def create_venv(python_spec: str) -> Path: return venv_dir / "bin" / "python" +# For the pinned aisimulate 0.12.0 release, the public index carries only a placeholder +# sdist whose build backend downloads the real wheel; use NVIDIA's binary instead. +AISIMULATE_FIND_LINKS = "https://pypi.nvidia.com/aisimulate/" + + def pip_install(venv_python: Path, wheelhouse: Path, requirements: list[str]) -> None: # --find-links only registers search paths; nixl is pulled from nixl/ only when a # requirement (e.g. kvbm's nixl[cu12]) resolves to it, not installed on its own. @@ -278,7 +283,24 @@ def pip_install(venv_python: Path, wheelhouse: Path, requirements: list[str]) -> for path in (wheelhouse, wheelhouse / "nixl"): if path.exists(): find_links.extend(["--find-links", str(path)]) - run([str(venv_python), "-m", "pip", "install", *find_links, *requirements]) + # Planner and framework runtime wheelhouses stage their own aisimulate wheel. Offer + # NVIDIA's index only when that staged wheel is absent: pip ranks equal candidates + # without regard to where they came from, so registering both risks installing the + # remote copy in place of the artifact the image actually ships. + if not find_wheels(wheelhouse, "aisimulate"): + find_links.extend(["--find-links", AISIMULATE_FIND_LINKS]) + run( + [ + str(venv_python), + "-m", + "pip", + "install", + "--only-binary", + "aisimulate", + *find_links, + *requirements, + ] + ) def pip_check(venv_python: Path) -> None: From d4866f9521eb35350579dc2e199cf6f2ae849153 Mon Sep 17 00:00:00 2001 From: Dan Gil Date: Wed, 23 Sep 2026 16:57:27 -0500 Subject: [PATCH 183/191] docs(trtllm): correct the UCX env-var note and warn off the EFA host mount (#13048) Signed-off-by: Dan Gil --- .../tensorrt-llm-details/kv-cache-transfer.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/kv-cache-transfer.md b/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/kv-cache-transfer.md index 71214953371a..68ed85c78897 100644 --- a/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/kv-cache-transfer.md +++ b/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/kv-cache-transfer.md @@ -39,6 +39,8 @@ TensorRT-LLM can also leverage **UCX** (Unified Communication X) directly for KV The precedence above matches TensorRT-LLM 1.3.0rc22; check `CacheTransceiverConfig._resolve_default_backend` in `tensorrt_llm/llmapi/llm_args.py`. +The two paths produce different transceivers, which is how you tell them apart at runtime: direct UCX logs `UcxConnectionManager`, while NIXL with UCX underneath logs `NixlTransferAgent ... using NIXL backend: UCX`. Read the worker's startup log for the transceiver class rather than inferring it from the configuration. + ## AWS EFA On AWS, UCX uses the **SRD (Scalable Reliable Datagram)** transport over EFA devices. NIXL discovers EFA `rdmap*` devices automatically through UCX — no NIXL-level configuration changes are needed. @@ -55,7 +57,7 @@ On 1.2.1 the same image is tagged `1.2.1-efa-amd64`. Despite the suffix that tag See [Release Artifacts](../../../reference/general/release-artifacts.mdx) for all available EFA images. -- **Host-mount approach (ARM64 / GB200):** Instead of the pre-built image, you can run the standard `tensorrtllm-runtime` image and mount the EFA SDK from the host node, which keeps the SDK in step with the host driver. This is what we tested on GB200 NVL72: +- **Host-mount approach (ARM64 / GB200):** Instead of the pre-built image, you can run the standard `tensorrtllm-runtime` image and mount the EFA SDK from the host node, which keeps the SDK in step with the host driver: ```yaml volumeMounts: @@ -67,6 +69,11 @@ volumes: path: /opt/amazon/efa ``` +> [!WARNING] +> Do not use this host mount with the LIBFABRIC backend on ARM64 / GB200. With `cache_transceiver_config.backend: NIXL` and `TRTLLM_NIXL_KVCACHE_BACKEND=LIBFABRIC`, mounting the host `/opt/amazon/efa` makes NIXL fail to register CUDA VRAM with `fi_mr_reg failed: Bad address`. TensorRT-LLM asserts immediately after, and both the prefill and decode workers enter `CrashLoopBackOff`. +> +> Use the pre-built `-efa` image instead. Removing the mount and relying on the EFA SDK shipped in that image makes an otherwise identical deployment serve inference on the same pair of nodes. + **EFA resource requests:** ```yaml From cdb5c54824500da3ceb2dbb6b303f8e879462bd1 Mon Sep 17 00:00:00 2001 From: Ryan McCormick Date: Wed, 23 Sep 2026 15:21:18 -0700 Subject: [PATCH 184/191] test(frontend): fix SGLang metrics reasoning stub (#15238) Signed-off-by: Ryan McCormick --- .../dynamo/frontend/tests/test_sglang_processor_metrics_unit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/src/dynamo/frontend/tests/test_sglang_processor_metrics_unit.py b/components/src/dynamo/frontend/tests/test_sglang_processor_metrics_unit.py index 9b71534e07cd..a8bddea30c31 100644 --- a/components/src/dynamo/frontend/tests/test_sglang_processor_metrics_unit.py +++ b/components/src/dynamo/frontend/tests/test_sglang_processor_metrics_unit.py @@ -168,7 +168,7 @@ def _load_processor_module(module_stubs): ToolCallParserType=object, _client_wants_separate_reasoning=lambda *_args, **_kwargs: False, _get_history_tool_calls_count=lambda *_args, **_kwargs: 0, - _guided_tool_choice_requires_reasoning=lambda *_args, **_kwargs: False, + _guided_output_requires_reasoning=lambda *_args, **_kwargs: False, convert_tools=lambda *_args, **_kwargs: None, create_parsers=lambda *_args, **_kwargs: (None, None), detect_force_reasoning_from_template=lambda *_args, **_kwargs: False, From 00f0f591c03db468a32646d628af91877ded22c8 Mon Sep 17 00:00:00 2001 From: Kan Wu Date: Wed, 23 Sep 2026 16:32:49 -0700 Subject: [PATCH 185/191] fix(frontend): forward tool-message media in Python chat processors (#15237) Signed-off-by: Kan Wu Co-authored-by: Ryan McCormick --- .../frontend/tests/test_multimodal_utils.py | 16 ++++++++++++++++ components/src/dynamo/frontend/utils.py | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/components/src/dynamo/frontend/tests/test_multimodal_utils.py b/components/src/dynamo/frontend/tests/test_multimodal_utils.py index 49a0245f0ce0..4aaf68fd4aa6 100644 --- a/components/src/dynamo/frontend/tests/test_multimodal_utils.py +++ b/components/src/dynamo/frontend/tests/test_multimodal_utils.py @@ -140,6 +140,22 @@ def test_extracts_multiple_items_per_modality(): ) +def test_extracts_tool_message_media(): + messages = [ + { + "role": "tool", + "tool_call_id": "call_1", + "content": [ + {"type": "image_url", "image_url": {"url": "https://example.com/t.png"}} + ], + } + ] + assert extract_mm_urls(messages) == ( + {"image_url": [{"Url": "https://example.com/t.png"}]}, + None, + ) + + def test_ignores_non_user_messages(): messages = [ {"role": "system", "content": "You are helpful."}, diff --git a/components/src/dynamo/frontend/utils.py b/components/src/dynamo/frontend/utils.py index d9126a599bf1..9f667e7092af 100644 --- a/components/src/dynamo/frontend/utils.py +++ b/components/src/dynamo/frontend/utils.py @@ -165,7 +165,7 @@ def extract_mm_urls( has_user_uuid = False for msg in messages: - if not isinstance(msg, dict) or msg.get("role") != "user": + if not isinstance(msg, dict) or msg.get("role") not in ("user", "tool"): continue content = msg.get("content") if not isinstance(content, list): From a6a2001f06a503fb5f564083e718cc4b4218d0fa Mon Sep 17 00:00:00 2001 From: Dynamo Bot <170655669+dynamo-ops@users.noreply.github.com> Date: Wed, 23 Sep 2026 18:21:20 -0700 Subject: [PATCH 186/191] chore: bump trtllm to v1.3.0rc27 (#15060) Signed-off-by: dynamo-ops <170655669+dynamo-ops@users.noreply.github.com> Signed-off-by: Dmitry Tokarev Signed-off-by: tanmayv25 Co-authored-by: Dmitry Tokarev Co-authored-by: Claude Opus 5 Co-authored-by: tanmayv25 --- .../tests/multimodal/test_trtllm_cuda_ipc.py | 47 +- container/compliance/base_sboms/manifest.json | 22 +- ...x.json => release@2af29022-amd64.cdx.json} | 57560 ++++++++-------- ...x.json => release@2af29022-arm64.cdx.json} | 55920 ++++++++------- container/compliance/generators/dpkg.py | 94 +- container/compliance/license_overrides.yaml | 3 + container/compliance/policy/codec_policy.yaml | 31 +- .../compliance/tests/test_dpkg_generator.py | 230 + container/context.yaml | 4 +- .../deps/trtllm/_dynamo_pmix_hostname.py | 58 + container/dev/50-framework-paths.sh | 19 +- container/templates/trtllm_runtime.Dockerfile | 269 +- docs/fern/components/releases.data.ts | 2 +- .../pages/reference/general/compatibility.mdx | 2 +- .../general/releases-machine-readable.mdx | 2 +- pyproject.toml | 10 +- tests/dependencies/test_trtllm_mpi.py | 230 + 17 files changed, 60264 insertions(+), 54239 deletions(-) rename container/compliance/base_sboms/{release@2366e4b4-amd64.cdx.json => release@2af29022-amd64.cdx.json} (71%) rename container/compliance/base_sboms/{release@2366e4b4-arm64.cdx.json => release@2af29022-arm64.cdx.json} (70%) create mode 100644 container/compliance/tests/test_dpkg_generator.py create mode 100644 container/deps/trtllm/_dynamo_pmix_hostname.py create mode 100644 tests/dependencies/test_trtllm_mpi.py diff --git a/components/src/dynamo/trtllm/tests/multimodal/test_trtllm_cuda_ipc.py b/components/src/dynamo/trtllm/tests/multimodal/test_trtllm_cuda_ipc.py index 1ed0847c039d..4cabc5a98063 100644 --- a/components/src/dynamo/trtllm/tests/multimodal/test_trtllm_cuda_ipc.py +++ b/components/src/dynamo/trtllm/tests/multimodal/test_trtllm_cuda_ipc.py @@ -5,6 +5,7 @@ import asyncio import multiprocessing as mp +import traceback from multiprocessing.synchronize import Event as EventType from typing import Any, Callable @@ -76,10 +77,14 @@ def consumer_process( # Extract embedding via CUDA IPC - pass list of handles directly (async) result = asyncio.run(extract_embeddings_from_handles([handle])) - # Send result - result_queue.put(result[0]) + # Avoid sending a torch.Tensor through the queue. PyTorch's multiprocessing + # reducer would introduce a second shared-memory transfer that is unrelated + # to the CUDA IPC behavior under test. + tensor = result[0] + result_queue.put(("ok", tensor.device.type, tensor.numpy())) except Exception as e: print(f"Consumer error: {e}") + result_queue.put(("error", traceback.format_exc())) raise finally: # Always signal producer to exit @@ -89,6 +94,7 @@ def consumer_process( class TestExtractEmbeddingsFromHandles: """Tests for extract_embeddings_from_handles function.""" + @pytest.mark.timeout(60) def test_extracts_all_embeddings(self): """Test that embeddings are extracted successfully from GPU via CUDA IPC.""" ctx = mp.get_context("spawn") @@ -105,17 +111,32 @@ def test_extracts_all_embeddings(self): target=consumer_process, args=(handle_queue, result_queue, done_event) ) - producer.start() - consumer.start() - - # Get result tensor - result = result_queue.get(timeout=30) - - consumer.join(timeout=10) - producer.join(timeout=10) - - # Verify against expected tensor + started_processes: list[mp.Process] = [] + try: + producer.start() + started_processes.append(producer) + consumer.start() + started_processes.append(consumer) + + # Get the CPU result without invoking PyTorch's queue tensor reducer. + status, *payload = result_queue.get(timeout=30) + if status == "error": + pytest.fail(f"CUDA IPC consumer failed:\n{payload[0]}") + device_type, result_array = payload + finally: + done_event.set() + for process in reversed(started_processes): + process.join(timeout=10) + if process.is_alive(): + process.terminate() + process.join(timeout=10) + handle_queue.close() + result_queue.close() + + # Verify against expected tensor. Build it on the GPU like the producer: + # a float16 arange past 2048 rounds differently on CUDA and on the CPU. + result = torch.from_numpy(result_array) expected = _create_tensor_on_gpu().cpu() assert result.shape == expected.shape - assert result.device.type == "cpu" + assert device_type == "cpu" assert torch.equal(result, expected) diff --git a/container/compliance/base_sboms/manifest.json b/container/compliance/base_sboms/manifest.json index 8daa99bcab38..9b92225baad8 100644 --- a/container/compliance/base_sboms/manifest.json +++ b/container/compliance/base_sboms/manifest.json @@ -130,23 +130,23 @@ "platform": "linux/arm64" }, { - "baseline_digest": "sha256:2366e4b4bdb385fcb38642a4555cbd091c4f8b1a27ff567a47acbe815dd49e86", + "baseline_digest": "sha256:2af290225a38d163b26af3be48581a722db98a594e839ff1e3675cc2c69f1df8", "baseline_image": "nvcr.io/nvidia/tensorrt-llm/release", - "baseline_sbom": "release@2366e4b4-amd64.cdx.json", - "baseline_tag": "1.3.0rc25", - "from_digest": "sha256:2366e4b4bdb385fcb38642a4555cbd091c4f8b1a27ff567a47acbe815dd49e86", + "baseline_sbom": "release@2af29022-amd64.cdx.json", + "baseline_tag": "1.3.0rc27", + "from_digest": "sha256:2af290225a38d163b26af3be48581a722db98a594e839ff1e3675cc2c69f1df8", "from_image": "nvcr.io/nvidia/tensorrt-llm/release", - "from_tag": "1.3.0rc25", + "from_tag": "1.3.0rc27", "platform": "linux/amd64" }, { - "baseline_digest": "sha256:2366e4b4bdb385fcb38642a4555cbd091c4f8b1a27ff567a47acbe815dd49e86", + "baseline_digest": "sha256:2af290225a38d163b26af3be48581a722db98a594e839ff1e3675cc2c69f1df8", "baseline_image": "nvcr.io/nvidia/tensorrt-llm/release", - "baseline_sbom": "release@2366e4b4-arm64.cdx.json", - "baseline_tag": "1.3.0rc25", - "from_digest": "sha256:2366e4b4bdb385fcb38642a4555cbd091c4f8b1a27ff567a47acbe815dd49e86", + "baseline_sbom": "release@2af29022-arm64.cdx.json", + "baseline_tag": "1.3.0rc27", + "from_digest": "sha256:2af290225a38d163b26af3be48581a722db98a594e839ff1e3675cc2c69f1df8", "from_image": "nvcr.io/nvidia/tensorrt-llm/release", - "from_tag": "1.3.0rc25", + "from_tag": "1.3.0rc27", "platform": "linux/arm64" } ], @@ -162,6 +162,6 @@ "platform": "platform pinned for layer-prefix verification, e.g. linux/amd64" }, "format": "CycloneDX 1.6 JSON, slim filter (drop properties/hashes/dependencies; keep evidence). Hard cap 5 MB per file.", - "generated_at": "2026-09-18T02:12:55+00:00", + "generated_at": "2026-09-18T10:42:46+00:00", "schema_version": 2 } diff --git a/container/compliance/base_sboms/release@2366e4b4-amd64.cdx.json b/container/compliance/base_sboms/release@2af29022-amd64.cdx.json similarity index 71% rename from container/compliance/base_sboms/release@2366e4b4-amd64.cdx.json rename to container/compliance/base_sboms/release@2af29022-amd64.cdx.json index cd9d37508e90..4e7e2a303f3c 100644 --- a/container/compliance/base_sboms/release@2366e4b4-amd64.cdx.json +++ b/container/compliance/base_sboms/release@2af29022-amd64.cdx.json @@ -3,105029 +3,107184 @@ "bomFormat": "CycloneDX", "components": [ { - "bom-ref": "ad5c3409f062d7d2", + "bom-ref": "53691aef9f55f694", "name": "/etc/X11/Xreset", "type": "file" }, { - "bom-ref": "ecd74de39e3506c9", + "bom-ref": "0a2ed03f247f491b", "name": "/etc/X11/Xreset.d/README", "type": "file" }, { - "bom-ref": "2f7426fde330a2a8", + "bom-ref": "84ba556793fb6396", "name": "/etc/X11/Xresources/x11-common", "type": "file" }, { - "bom-ref": "b52b99513dfcb20f", + "bom-ref": "632c3746663f2d0d", "name": "/etc/X11/Xsession", "type": "file" }, { - "bom-ref": "c0098ae41b2a33a8", + "bom-ref": "093ef7bc7b83ff02", "name": "/etc/X11/Xsession.d/20x11-common_process-args", "type": "file" }, { - "bom-ref": "aaff3e05cb2935cb", + "bom-ref": "4845728556bf71a9", "name": "/etc/X11/Xsession.d/30x11-common_xresources", "type": "file" }, { - "bom-ref": "ff7746414836889d", + "bom-ref": "cc956b3189f12a5f", "name": "/etc/X11/Xsession.d/35x11-common_xhost-local", "type": "file" }, { - "bom-ref": "331ade0162429aa5", + "bom-ref": "cfbaa110e8c28b03", "name": "/etc/X11/Xsession.d/40x11-common_xsessionrc", "type": "file" }, { - "bom-ref": "f70291bac2f5c420", + "bom-ref": "1fe31fe38a33fffa", "name": "/etc/X11/Xsession.d/50x11-common_determine-startup", "type": "file" }, { - "bom-ref": "e646563eeae3c527", + "bom-ref": "0f942584a1c98dad", "name": "/etc/X11/Xsession.d/60x11-common_xdg_path", "type": "file" }, { - "bom-ref": "13ed07bed5b00b49", + "bom-ref": "e43ffddd41a12b70", "name": "/etc/X11/Xsession.d/90gpg-agent", "type": "file" }, { - "bom-ref": "73b5ea2e79df1da9", + "bom-ref": "24cca6d9d6fbe06b", "name": "/etc/X11/Xsession.d/90x11-common_ssh-agent", "type": "file" }, { - "bom-ref": "47ca1823251abb59", + "bom-ref": "69d3bea777ae0fa3", "name": "/etc/X11/Xsession.d/99x11-common_start", "type": "file" }, { - "bom-ref": "8dffb1c07ff252d2", + "bom-ref": "57cdd5de3cdef1f0", "name": "/etc/X11/Xsession.options", "type": "file" }, { - "bom-ref": "25acc048d325656e", + "bom-ref": "a57e37b6dc74fe44", "name": "/etc/X11/rgb.txt", "type": "file" }, { - "bom-ref": "4af5f6111ffbebdc", + "bom-ref": "830d7c23352be46b", "name": "/etc/adduser.conf", "type": "file" }, { - "bom-ref": "b93fec92198db30f", + "bom-ref": "f04643246eb7ab95", "name": "/etc/alternatives/README", "type": "file" }, { - "bom-ref": "d5313872b54dafa5", + "bom-ref": "0316c6a10a8462ab", "name": "/etc/apt/apt.conf.d/01-vendor-ubuntu", "type": "file" }, { - "bom-ref": "baf3d50adccccf52", + "bom-ref": "f4b94596efd90e14", "name": "/etc/apt/apt.conf.d/01autoremove", "type": "file" }, { - "bom-ref": "a3437c2c254c42c2", + "bom-ref": "3402f769ea958308", "name": "/etc/apt/apt.conf.d/70debconf", "type": "file" }, { - "bom-ref": "8f209b6ad7e1063a", + "bom-ref": "5c0ec00f0e75a544", "name": "/etc/apt/preferences.d/cuda-repository-pin-600", "type": "file" }, { - "bom-ref": "923f54fe9f98db65", + "bom-ref": "e2e334a916dd1797", "name": "/etc/apt/sources.list.d/cuda-ubuntu2404-x86_64.list", "type": "file" }, { - "bom-ref": "09d44816c778ce9d", + "bom-ref": "74293d9ba49e6597", "name": "/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg", "type": "file" }, { - "bom-ref": "ac2475f7acbd849b", + "bom-ref": "9efccb4ba1b7e501", "name": "/etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg", "type": "file" }, { - "bom-ref": "3b17e627b473a7ed", + "bom-ref": "5f2bfcd1b5ea1a52", "name": "/etc/bash.bashrc", "type": "file" }, { - "bom-ref": "7e0bd6e8cf2d4825", + "bom-ref": "782514498fea9788", "name": "/etc/bash_completion.d/git-prompt", "type": "file" }, { - "bom-ref": "ff314ff258f58ff5", + "bom-ref": "f126c0b03baa121f", "name": "/etc/bindresvport.blacklist", "type": "file" }, { - "bom-ref": "357fe6233e3abaef", + "bom-ref": "79ebaaca68413959", "name": "/etc/cron.d/e2scrub_all", "type": "file" }, { - "bom-ref": "91164b915d0f745c", + "bom-ref": "f930863663c3c92e", "name": "/etc/cron.daily/apt-compat", "type": "file" }, { - "bom-ref": "0ae6771a94c32bde", + "bom-ref": "e64da0a5df532f84", "name": "/etc/cron.daily/dpkg", "type": "file" }, { - "bom-ref": "bb719ac95b1d7ff3", + "bom-ref": "48d10fa5c323ff79", "name": "/etc/debconf.conf", "type": "file" }, { - "bom-ref": "bdb726bab80ca6c0", + "bom-ref": "b1fc398cca29d272", "name": "/etc/debian_version", "type": "file" }, { - "bom-ref": "d5dcb01d87f239ae", + "bom-ref": "0c162d5ff52613c8", "name": "/etc/debuginfod/elfutils.urls", "type": "file" }, { - "bom-ref": "526c99866468a320", + "bom-ref": "0d77f87e4ca03d92", "name": "/etc/default/useradd", "type": "file" }, { - "bom-ref": "1c48fa11390b1c23", + "bom-ref": "3ce9cdde2aad6074", "name": "/etc/deluser.conf", "type": "file" }, { - "bom-ref": "fe6e4575e38ae5ce", + "bom-ref": "3dc9e864fa3c104c", "name": "/etc/dpkg/dpkg.cfg", "type": "file" }, { - "bom-ref": "35d3110df77c47fa", + "bom-ref": "230e76ab35dc3640", "name": "/etc/dpkg/origins/debian", "type": "file" }, { - "bom-ref": "60f3c523d13b3d03", + "bom-ref": "c1760a40ffbca4e5", "name": "/etc/dpkg/origins/ubuntu", "type": "file" }, { - "bom-ref": "de3573e3c9a1f0db", + "bom-ref": "2f05c4989edf92e2", "name": "/etc/dpkg/shlibs.default", "type": "file" }, { - "bom-ref": "4d86d29fe3b65a47", + "bom-ref": "6bf90756ace5de92", "name": "/etc/dpkg/shlibs.override", "type": "file" }, { - "bom-ref": "8787ba64853186a4", + "bom-ref": "5c1612a8d3548772", "name": "/etc/e2scrub.conf", "type": "file" }, { - "bom-ref": "accd503e7244b15e", + "bom-ref": "34332264099bc638", "name": "/etc/emacs/site-start.d/50autoconf.el", "type": "file" }, { - "bom-ref": "bf95d7576370c636", + "bom-ref": "ecbb185118243352", "name": "/etc/ethertypes", "type": "file" }, { - "bom-ref": "98fb959d69389955", + "bom-ref": "4da847be8ee8741b", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-lgc-sans-mono.conf", "type": "file" }, { - "bom-ref": "93e4c0be9732e615", + "bom-ref": "15c76b1720960e97", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-lgc-sans.conf", "type": "file" }, { - "bom-ref": "2104adbcf4a80c53", + "bom-ref": "44f4a8b9d157d3a5", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-lgc-serif.conf", "type": "file" }, { - "bom-ref": "fd568a4f04eb9985", + "bom-ref": "14f28be1e3649e53", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-sans-mono.conf", "type": "file" }, { - "bom-ref": "8214a98b5e405eec", + "bom-ref": "1e23adcaa343324a", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-sans.conf", "type": "file" }, { - "bom-ref": "339ad2049e357d5b", + "bom-ref": "322f35791ea8d3e5", "name": "/etc/fonts/conf.avail/20-unhint-small-dejavu-serif.conf", "type": "file" }, { - "bom-ref": "5f334bfc49edabca", + "bom-ref": "b222fe5c1b33f650", "name": "/etc/fonts/conf.avail/57-dejavu-sans-mono.conf", "type": "file" }, { - "bom-ref": "a66238cd4b13367e", + "bom-ref": "828f4a3be282aab4", "name": "/etc/fonts/conf.avail/57-dejavu-sans.conf", "type": "file" }, { - "bom-ref": "bce15b50c90b701f", + "bom-ref": "25088cb0451617dd", "name": "/etc/fonts/conf.avail/57-dejavu-serif.conf", "type": "file" }, { - "bom-ref": "66bf65cf4e65185e", + "bom-ref": "2d6b11686541390c", "name": "/etc/fonts/conf.avail/58-dejavu-lgc-sans-mono.conf", "type": "file" }, { - "bom-ref": "8f0635841d3b294a", + "bom-ref": "397c63d318dcdec0", "name": "/etc/fonts/conf.avail/58-dejavu-lgc-sans.conf", "type": "file" }, { - "bom-ref": "9627e965ca1ddc8f", + "bom-ref": "6bca95d033d06751", "name": "/etc/fonts/conf.avail/58-dejavu-lgc-serif.conf", "type": "file" }, { - "bom-ref": "4d7a12a1da66c45a", + "bom-ref": "64d732cfeac67ee8", "name": "/etc/fonts/conf.d/README", "type": "file" }, { - "bom-ref": "ba908daec1a3fdb9", + "bom-ref": "dc99e6e5cd24e89f", "name": "/etc/fonts/fonts.conf", "type": "file" }, { - "bom-ref": "ac0ffef67539884e", + "bom-ref": "144c372fdf7315b8", "name": "/etc/gai.conf", "type": "file" }, { - "bom-ref": "51d5557037e52c11", + "bom-ref": "fdded1594643c07f", "name": "/etc/gdb/gdbinit", "type": "file" }, { - "bom-ref": "418ee019a4662142", + "bom-ref": "f20585e47c5ea0c4", "name": "/etc/gnutls/config", "type": "file" }, { - "bom-ref": "5081a62c5e847645", + "bom-ref": "0c61b9cbf168481b", "name": "/etc/gprofng.rc", "type": "file" }, { - "bom-ref": "7868e2cdeb2a1fee", + "bom-ref": "34f0e043183291f0", "name": "/etc/host.conf", "type": "file" }, { - "bom-ref": "87601333bdc4eab8", + "bom-ref": "32526888cccab5f2", "name": "/etc/init.d/procps", "type": "file" }, { - "bom-ref": "7a0bd06ef483a14e", + "bom-ref": "de22fcd3d56f2e78", "name": "/etc/init.d/x11-common", "type": "file" }, { - "bom-ref": "8137f073062e54ba", + "bom-ref": "b876224f0a22da78", "name": "/etc/issue", "type": "file" }, { - "bom-ref": "23c3973973794971", + "bom-ref": "630901b821898f4f", "name": "/etc/issue.net", "type": "file" }, { - "bom-ref": "5bf007710b4a6a45", + "bom-ref": "399a6df807af5513", "name": "/etc/ld.so.conf", "type": "file" }, { - "bom-ref": "72f81112ce9367fd", + "bom-ref": "3efabe1892448718", "name": "/etc/ld.so.conf.d/000_cuda.conf", "type": "file" }, { - "bom-ref": "ea3dfab53dc2484f", + "bom-ref": "65ff656f1474c66a", "name": "/etc/ld.so.conf.d/987_cuda-13.conf", "type": "file" }, { - "bom-ref": "61fd8cbd775b6617", - "name": "/etc/ld.so.conf.d/gds-13-2.conf", + "bom-ref": "fa9a3135f171feb0", + "name": "/etc/ld.so.conf.d/gds-13-4.conf", "type": "file" }, { - "bom-ref": "cb71689f23c652f6", + "bom-ref": "0856b3aaea7f94c4", "name": "/etc/ld.so.conf.d/libc.conf", "type": "file" }, { - "bom-ref": "fb4f212806cc69f6", + "bom-ref": "5b351a82ad3e138c", "name": "/etc/ld.so.conf.d/x86_64-linux-gnu.conf", "type": "file" }, { - "bom-ref": "89c1d8e085bf8826", + "bom-ref": "0552137df983145c", "name": "/etc/ld.so.conf.d/zz_i386-biarch-compat.conf", "type": "file" }, { - "bom-ref": "7b7a4b70d2542a68", + "bom-ref": "32e511fb94930c1e", "name": "/etc/legal", "type": "file" }, { - "bom-ref": "e5deb5959183bbad", + "bom-ref": "42f971bf624809ef", "name": "/etc/libaudit.conf", "type": "file" }, { - "bom-ref": "67118bd28b6d575a", + "bom-ref": "abc26e9b271eee45", "name": "/etc/libibverbs.d/bnxt_re.driver", "type": "file" }, { - "bom-ref": "0686c9b66a17f129", + "bom-ref": "b557f00a19be5c66", "name": "/etc/libibverbs.d/cxgb4.driver", "type": "file" }, { - "bom-ref": "4ee59793d7181f65", + "bom-ref": "5bd5b422099fa356", "name": "/etc/libibverbs.d/efa.driver", "type": "file" }, { - "bom-ref": "fa364c12c2fde148", + "bom-ref": "4cb1bf9a8dbd48f3", "name": "/etc/libibverbs.d/erdma.driver", "type": "file" }, { - "bom-ref": "b2e7ae9a7ae85e0e", + "bom-ref": "6a2774727edb9e45", "name": "/etc/libibverbs.d/hfi1verbs.driver", "type": "file" }, { - "bom-ref": "2138f0493ac3c5ff", + "bom-ref": "522a3c61a06208f4", "name": "/etc/libibverbs.d/hns.driver", "type": "file" }, { - "bom-ref": "2549d94efaf71b1c", + "bom-ref": "d2814a1e2b153707", + "name": "/etc/libibverbs.d/ionic.driver", + "type": "file" + }, + { + "bom-ref": "81a25e973b65061b", "name": "/etc/libibverbs.d/ipathverbs.driver", "type": "file" }, { - "bom-ref": "31d060a37d48f427", + "bom-ref": "48ba3142fdee8dd4", "name": "/etc/libibverbs.d/irdma.driver", "type": "file" }, { - "bom-ref": "ea7afeab24de923f", + "bom-ref": "1826f070b20daef4", "name": "/etc/libibverbs.d/mana.driver", "type": "file" }, { - "bom-ref": "0c2997ca876fc10f", + "bom-ref": "9175dd27f2d5d508", "name": "/etc/libibverbs.d/mlx4.driver", "type": "file" }, { - "bom-ref": "b2797c73bc74435e", + "bom-ref": "1cd439e69ba80839", "name": "/etc/libibverbs.d/mlx5.driver", "type": "file" }, { - "bom-ref": "fd818dbbcaa952e7", + "bom-ref": "ce3bea0b50e64a88", "name": "/etc/libibverbs.d/mthca.driver", "type": "file" }, { - "bom-ref": "c7463f35ca3dc0e3", + "bom-ref": "c8bf70db1b16be24", "name": "/etc/libibverbs.d/ocrdma.driver", "type": "file" }, { - "bom-ref": "9fb1cd735e0aeaa8", + "bom-ref": "78af3db3e9b9dc27", "name": "/etc/libibverbs.d/qedr.driver", "type": "file" }, { - "bom-ref": "8d5a8a4389708791", + "bom-ref": "f46df116de6ca3d2", "name": "/etc/libibverbs.d/rxe.driver", "type": "file" }, { - "bom-ref": "77b5a2eac1f2fd30", + "bom-ref": "7e4176e2b1814ffb", "name": "/etc/libibverbs.d/siw.driver", "type": "file" }, { - "bom-ref": "68e9f83fc511e79c", + "bom-ref": "15c86f59c0872ddb", "name": "/etc/libibverbs.d/vmw_pvrdma.driver", "type": "file" }, { - "bom-ref": "44ce11215b36c289", + "bom-ref": "b5d36b8f53aecc2e", "name": "/etc/libnl-3/classid", "type": "file" }, { - "bom-ref": "0d22627433cd00dc", + "bom-ref": "13228275b17575a3", "name": "/etc/libnl-3/pktloc", "type": "file" }, { - "bom-ref": "606275645d4544df", + "bom-ref": "9f24705d3c91b606", "name": "/etc/logcheck/ignore.d.server/gpg-agent", "type": "file" }, { - "bom-ref": "12c1a9b815a889c7", + "bom-ref": "bba68cb2dd70dd11", "name": "/etc/login.defs", "type": "file" }, { - "bom-ref": "9c7cef5906012f72", + "bom-ref": "10eca681ab20ee20", "name": "/etc/logrotate.d/alternatives", "type": "file" }, { - "bom-ref": "d12887a17ba3c287", + "bom-ref": "724d1a9b1a2c3281", "name": "/etc/logrotate.d/apt", "type": "file" }, { - "bom-ref": "2d005c7c9dbd0900", + "bom-ref": "2c64b299744aa332", "name": "/etc/logrotate.d/dpkg", "type": "file" }, { - "bom-ref": "be3d2d19232c01ee", + "bom-ref": "dd5779e8cc36c6a0", "name": "/etc/lsb-release", "type": "file" }, { - "bom-ref": "208f4472943fcc2e", + "bom-ref": "eeb5d449c08e4238", "name": "/etc/magic", "type": "file" }, { - "bom-ref": "9603d421ec846fa9", + "bom-ref": "c49939d121dc528f", "name": "/etc/magic.mime", "type": "file" }, { - "bom-ref": "f019352c0bbec095", + "bom-ref": "06c6222da17c0a7d", "name": "/etc/mime.types", "type": "file" }, { - "bom-ref": "d1c110d3dee73819", + "bom-ref": "5ceb4478e6b32ab7", "name": "/etc/mke2fs.conf", "type": "file" }, { - "bom-ref": "8fb6327781e04d4a", + "bom-ref": "a4e58e4ad8bf536e", "name": "/etc/nanorc", "type": "file" }, { - "bom-ref": "bee4dd04a0e3fbe6", + "bom-ref": "c4580ec13820fd54", "name": "/etc/pam.conf", "type": "file" }, { - "bom-ref": "9d904670d4b2de3b", + "bom-ref": "c0990dec9acb17c9", "name": "/etc/pam.d/chfn", "type": "file" }, { - "bom-ref": "51102e8215fa1c25", + "bom-ref": "3e04a8b60d4e5c67", "name": "/etc/pam.d/chpasswd", "type": "file" }, { - "bom-ref": "dad8193f1b598b57", + "bom-ref": "a62f642fb16e19b1", "name": "/etc/pam.d/chsh", "type": "file" }, { - "bom-ref": "23c15d8981594743", + "bom-ref": "98ef88598a70d23d", "name": "/etc/pam.d/login", "type": "file" }, { - "bom-ref": "81483a421c60db56", + "bom-ref": "8dc1e0325b113280", "name": "/etc/pam.d/newusers", "type": "file" }, { - "bom-ref": "4d416b548f63b58a", + "bom-ref": "6ddb59dd73bc61f0", "name": "/etc/pam.d/other", "type": "file" }, { - "bom-ref": "c10ff6d35b5edd16", + "bom-ref": "d749500ec867d380", "name": "/etc/pam.d/passwd", "type": "file" }, { - "bom-ref": "7be14f6091880878", + "bom-ref": "ec614d6faab59b26", "name": "/etc/pam.d/runuser", "type": "file" }, { - "bom-ref": "7f6b80c2d67daa92", + "bom-ref": "9bf76bdf8602d57c", "name": "/etc/pam.d/runuser-l", "type": "file" }, { - "bom-ref": "9b01a55a48cbc455", + "bom-ref": "218143f410662bc3", "name": "/etc/pam.d/su", "type": "file" }, { - "bom-ref": "4e91cdcc116c1d7f", + "bom-ref": "388266e05e76e831", "name": "/etc/pam.d/su-l", "type": "file" }, { - "bom-ref": "5f580e19f6edf264", + "bom-ref": "94138d2eeff4aa11", "name": "/etc/perl/Net/libnet.cfg", "type": "file" }, { - "bom-ref": "03b4a0cf9c4e2488", + "bom-ref": "7a7b0bd6b2a00dd2", "name": "/etc/profile.d/01-locale-fix.sh", "type": "file" }, { - "bom-ref": "01422008914adac3", + "bom-ref": "333dc6f79803f783", "name": "/etc/protocols", "type": "file" }, { - "bom-ref": "55d1fd45be163593", + "bom-ref": "32ebd466a26135af", "name": "/etc/python3.12/sitecustomize.py", "type": "file" }, { - "bom-ref": "25ece4246fa7f600", + "bom-ref": "d102682fa8ae71a8", "name": "/etc/rpc", "type": "file" }, { - "bom-ref": "29a6f197f05730ae", + "bom-ref": "f1d73ee05d82d250", "name": "/etc/security/access.conf", "type": "file" }, { - "bom-ref": "b77dfc32f7e1ce86", + "bom-ref": "34e616ebb3b2f87c", "name": "/etc/security/faillock.conf", "type": "file" }, { - "bom-ref": "922ec5603c0b588f", + "bom-ref": "ef20c6fbe09bcdad", "name": "/etc/security/group.conf", "type": "file" }, { - "bom-ref": "d8df4cb79db6aa37", + "bom-ref": "e712d7a1d5a0d2a5", "name": "/etc/security/limits.conf", "type": "file" }, { - "bom-ref": "0a24a54831126e80", + "bom-ref": "25a80d003bc7956a", "name": "/etc/security/namespace.conf", "type": "file" }, { - "bom-ref": "644fb905195cde8c", + "bom-ref": "740caae2c9aec7ae", "name": "/etc/security/namespace.init", "type": "file" }, { - "bom-ref": "389d08d971efe69c", + "bom-ref": "e755c2e2e14effa6", "name": "/etc/security/pam_env.conf", "type": "file" }, { - "bom-ref": "603bb56e95702e01", + "bom-ref": "309344d8e1e95acf", "name": "/etc/security/pwhistory.conf", "type": "file" }, { - "bom-ref": "a567c22b4b14bcfe", + "bom-ref": "c2240b3f4507bac4", "name": "/etc/security/sepermit.conf", "type": "file" }, { - "bom-ref": "f029d981d3a8ad10", + "bom-ref": "020358ca93e76962", "name": "/etc/security/time.conf", "type": "file" }, { - "bom-ref": "2f73a821836ddd35", + "bom-ref": "2bbb14e00b37863f", "name": "/etc/selinux/semanage.conf", "type": "file" }, { - "bom-ref": "16ab6598d1790448", + "bom-ref": "8ce94f8fe110db90", "name": "/etc/services", "type": "file" }, { - "bom-ref": "2fe5b6625008da97", - "name": "/etc/sgml/xml-core.cat", - "type": "file" - }, - { - "bom-ref": "02fb39b344be02e9", + "bom-ref": "e3fb071a9ba2ef97", "name": "/etc/skel/.bash_logout", "type": "file" }, { - "bom-ref": "7296acd3ce09b657", + "bom-ref": "74d902cca07a98a9", "name": "/etc/skel/.bashrc", "type": "file" }, { - "bom-ref": "bbed0a4dc9c86d7f", + "bom-ref": "bdf7fc101da8d53d", "name": "/etc/skel/.profile", "type": "file" }, { - "bom-ref": "e8b0d5b98fa3a3ef", + "bom-ref": "8ad499970bdb104a", "name": "/etc/ssh/ssh_config", "type": "file" }, { - "bom-ref": "ad91b324096b118a", + "bom-ref": "b3ca8c7ecbbaa632", "name": "/etc/ssl/openssl.cnf", "type": "file" }, { - "bom-ref": "d3b65aff817a428c", + "bom-ref": "7a51fd4c766fa986", "name": "/etc/sysctl.conf", "type": "file" }, { - "bom-ref": "2a80d319ad7af5d6", + "bom-ref": "556006d1c9f95518", "name": "/etc/sysctl.d/10-bufferbloat.conf", "type": "file" }, { - "bom-ref": "0b84d7ecd10d53a8", + "bom-ref": "8e8f94fca98d7956", "name": "/etc/sysctl.d/10-console-messages.conf", "type": "file" }, { - "bom-ref": "ed0f54ce93a7b0b0", + "bom-ref": "cf15f32fa3537702", "name": "/etc/sysctl.d/10-ipv6-privacy.conf", "type": "file" }, { - "bom-ref": "f047e86368653441", + "bom-ref": "057de15608d3c083", "name": "/etc/sysctl.d/10-kernel-hardening.conf", "type": "file" }, { - "bom-ref": "c00d9f2ad13d0076", + "bom-ref": "6996ade11895d244", "name": "/etc/sysctl.d/10-magic-sysrq.conf", "type": "file" }, { - "bom-ref": "a16dacdee89d1b33", + "bom-ref": "4ca3fdaaaa234965", "name": "/etc/sysctl.d/10-map-count.conf", "type": "file" }, { - "bom-ref": "4556cb1703376a38", + "bom-ref": "3ba8c6883753857e", "name": "/etc/sysctl.d/10-network-security.conf", "type": "file" }, { - "bom-ref": "8c6ba8d6f4340634", + "bom-ref": "631ee6508fb78e12", "name": "/etc/sysctl.d/10-ptrace.conf", "type": "file" }, { - "bom-ref": "ac2ec7e7e7b807a1", + "bom-ref": "1b67fc367f306267", "name": "/etc/sysctl.d/10-zeropage.conf", "type": "file" }, { - "bom-ref": "77ccd8383faf716b", + "bom-ref": "b728c16bac8c94c5", "name": "/etc/sysctl.d/README.sysctl", "type": "file" }, { - "bom-ref": "1cc35080ed8bf3a0", + "bom-ref": "facecdbe7ad07b26", "name": "/etc/terminfo/README", "type": "file" }, { - "bom-ref": "ccd935a5e6751e51", + "bom-ref": "9e4a29299a054d3b", "name": "/etc/ucf.conf", "type": "file" }, { - "bom-ref": "7ebe7db4ca032444", + "bom-ref": "a6a991246f72e31e", "name": "/etc/update-motd.d/00-header", "type": "file" }, { - "bom-ref": "701edecd48763c87", + "bom-ref": "98f339aef7753a6d", "name": "/etc/update-motd.d/10-help-text", "type": "file" }, { - "bom-ref": "2785af4c5f6f5c05", + "bom-ref": "97d4e390a7da4ed7", "name": "/etc/update-motd.d/50-motd-news", "type": "file" }, { - "bom-ref": "494c491886720c5e", + "bom-ref": "2577170a92cce00f", "name": "/etc/vim/vimrc", "type": "file" }, { - "bom-ref": "b9ff2f58b12e13de", + "bom-ref": "a565dd15c635c48b", "name": "/etc/vim/vimrc.tiny", "type": "file" }, { - "bom-ref": "04272e76a98e21e6", + "bom-ref": "52ff0bc412b614a5", "name": "/etc/wgetrc", "type": "file" }, { - "bom-ref": "0282e31c38c350c0", + "bom-ref": "89830ce66bb883de", "name": "/etc/xattr.conf", "type": "file" }, { - "bom-ref": "19b6c45ac5ad7c77", - "name": "/opt/hpcx/ompi5/share/hwloc/hwloc-ps.www/package.json", + "bom-ref": "5d492f7518fda123", + "name": "/opt/amazon/ofi-nccl/lib/libnccl-net-ofi.so", "type": "file" }, { - "bom-ref": "4f14da64e36347b3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/Archives/index.html", + "bom-ref": "5b8d85e022cee53b", + "name": "/opt/amazon/ofi-nccl/lib/libnccl-tuner-ofi.so", "type": "file" }, { - "bom-ref": "90c4697fcc9f67a2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/CopyrightAndLicenses/index.html", + "bom-ref": "5f57f5044022312d", + "name": "/opt/amazon/ofi-nccl/share/aws-ofi-nccl/xml/g5.48xl-topo.xml", "type": "file" }, { - "bom-ref": "3ad1b8a33583d4f2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/CustomizationGuide/index.html", + "bom-ref": "7d70eaa6242f40df", + "name": "/opt/amazon/ofi-nccl/share/aws-ofi-nccl/xml/p4d-24xl-topo.xml", "type": "file" }, { - "bom-ref": "1f8cdbc0c207eaea", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/Notices/notices.html", + "bom-ref": "b673504fb38a4c6f", + "name": "/opt/amazon/ofi-nccl/share/aws-ofi-nccl/xml/p4de-24xl-topo.xml", "type": "file" }, { - "bom-ref": "2cac68c22d796eb0", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/NsightCompute/index.html", + "bom-ref": "f955c186a353d789", + "name": "/opt/gcp/nccl-plugins/README", "type": "file" }, { - "bom-ref": "d0fe87080a43d25d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/NsightComputeCli/index.html", + "bom-ref": "3eaa26f2b320ece9", + "name": "/opt/gcp/nccl-plugins/configs/nccl.a3u.conf", "type": "file" }, { - "bom-ref": "9aca86ed4cc0643c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/NvRulesAPI/index.html", + "bom-ref": "a38428b32d9c17f9", + "name": "/opt/gcp/nccl-plugins/configs/nccl.a4.conf", "type": "file" }, { - "bom-ref": "79c1765e0d9ef0bc", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/OccupancyCalculatorPythonInterface/index.html", + "bom-ref": "f55e0db92433cecd", + "name": "/opt/gcp/nccl-plugins/configs/nccl.a4x.conf", "type": "file" }, { - "bom-ref": "452d0ee0d54155d0", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ProfilingGuide/index.html", + "bom-ref": "e24823796bba4abf", + "name": "/opt/gcp/nccl-plugins/configs/nccl.a4xmax.conf", "type": "file" }, { - "bom-ref": "470675c07b250ae4", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/PythonReportInterface/index.html", + "bom-ref": "3523eab5bbbdf243", + "name": "/opt/gcp/nccl-plugins/configs/nccl.a5x.conf", "type": "file" }, { - "bom-ref": "f47ab332792d3809", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/index.html", + "bom-ref": "827610d493d14169", + "name": "/opt/gcp/nccl-plugins/configs/nccl.conf", "type": "file" }, { - "bom-ref": "fabb81c24d2200bf", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/gpu-support.html", + "bom-ref": "e6f45e9194013d25", + "name": "/opt/gcp/nccl-plugins/configs/tuner_config_a3u.txtpb", "type": "file" }, { - "bom-ref": "1c3432095e240688", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/known-issues.html", + "bom-ref": "01a2ffd15f4219b2", + "name": "/opt/gcp/nccl-plugins/configs/tuner_config_a4.txtpb", "type": "file" }, { - "bom-ref": "e3d5870cc0877910", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/library-support-optix.html", + "bom-ref": "791af854a02a5925", + "name": "/opt/gcp/nccl-plugins/configs/tuner_config_default.txtpb", "type": "file" }, { - "bom-ref": "0706cebc8037a447", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/library-support-tile.html", + "bom-ref": "5493495731c0d10c", + "name": "/opt/gcp/nccl-plugins/lib64/libGPUViz.so", "type": "file" }, { - "bom-ref": "ff0837ad37076763", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/library-support.html", + "bom-ref": "eaff7305e52c47c6", + "name": "/opt/gcp/nccl-plugins/lib64/libnccl-env-gcp.so", "type": "file" }, { - "bom-ref": "f86cbf72cd156f68", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/platform-support.html", + "bom-ref": "9508513a5e140ec8", + "name": "/opt/gcp/nccl-plugins/lib64/libnccl-net-gcp.so", "type": "file" }, { - "bom-ref": "72e8c2cd2e0cb39b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/release-notes-older-versions.html", + "bom-ref": "e8c1af1148b865be", + "name": "/opt/gcp/nccl-plugins/lib64/libnccl-profiler-gcp.so", "type": "file" }, { - "bom-ref": "6fa37506655c685e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/release-notes.html", + "bom-ref": "6050fc0464bb538e", + "name": "/opt/gcp/nccl-plugins/lib64/libnccl-tuner-gcp.so", "type": "file" }, { - "bom-ref": "62e53ee9a37dd182", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/support.html", + "bom-ref": "44858be41b9b51e3", + "name": "/opt/gcp/nccl-plugins/scripts/gen_hostfiles.sh", "type": "file" }, { - "bom-ref": "1022c68fc69ad2ef", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/system-requirements.html", + "bom-ref": "fea841d627fdf7f7", + "name": "/opt/gcp/nccl-plugins/scripts/init_ssh.sh", "type": "file" }, { - "bom-ref": "11c57f85db766e35", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2019-1.html", + "bom-ref": "b88d7ed92e2f038e", + "name": "/opt/gcp/nccl-plugins/scripts/meshed_rc_pingpong.sh", "type": "file" }, { - "bom-ref": "efe4282f3b0a0a90", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2019-2.html", + "bom-ref": "29a0681dc9627221", + "name": "/opt/gcp/nccl-plugins/scripts/run_nccl_tests.sh", "type": "file" }, { - "bom-ref": "3ccb9ae8503bbbca", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2019-3-1.html", + "bom-ref": "1dc9d0249586be18", + "name": "/opt/gcp/nccl-plugins/scripts/set_nccl_env.sh", "type": "file" }, { - "bom-ref": "8d3223d9dfe96796", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2019-3.html", + "bom-ref": "882ff542d3af7a65", + "name": "/opt/gcp/nccl-plugins/scripts/show_gids.sh", "type": "file" }, { - "bom-ref": "b799f60c05e412c8", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2019-4.html", - "type": "file" - }, - { - "bom-ref": "ab273b7f6247773c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2019-5-1.html", - "type": "file" - }, - { - "bom-ref": "2e7b1a44e76dee64", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2019-5-2.html", - "type": "file" - }, - { - "bom-ref": "89855984281c3424", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2019-5-3.html", - "type": "file" - }, - { - "bom-ref": "07e5f92814816545", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2019-5.html", - "type": "file" - }, - { - "bom-ref": "380337e6d3f42646", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2020-1-1.html", - "type": "file" - }, - { - "bom-ref": "811230604c48fa4d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2020-1-2.html", + "bom-ref": "a2e8f28cec4440d4", + "name": "/opt/hpcx/ompi5/share/hwloc/hwloc-ps.www/package.json", "type": "file" }, { - "bom-ref": "8a521bfc4dac4942", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2020-1.html", + "bom-ref": "dfcb3b2fb6e97e1e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/Archives/index.html", "type": "file" }, { - "bom-ref": "32c563bc3eb410be", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2020-2-1.html", + "bom-ref": "df5ca32085155eb1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/ComputeTriage/index.html", "type": "file" }, { - "bom-ref": "55d411de612e70ae", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2020-2.html", + "bom-ref": "dd3d9db034e71fec", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/CopyrightAndLicenses/index.html", "type": "file" }, { - "bom-ref": "2cdcd6d831b12eab", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2020-3-1.html", + "bom-ref": "03abcee073a402db", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/CustomizationGuide/index.html", "type": "file" }, { - "bom-ref": "b8445ee717bb6e8a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2020-3.html", + "bom-ref": "5d6dd7e34bebf22e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/Notices/notices.html", "type": "file" }, { - "bom-ref": "80ccb9e45b5dac68", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-1-1.html", + "bom-ref": "dfc33f6ea99d7576", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/NsightCompute/index.html", "type": "file" }, { - "bom-ref": "868b912924eca681", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-1.html", + "bom-ref": "889f5805ef60c6e8", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/NsightComputeCli/index.html", "type": "file" }, { - "bom-ref": "cb2cc03e1a0a346d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-2-1.html", + "bom-ref": "acca12ceca719bfa", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/NvRulesAPI/index.html", "type": "file" }, { - "bom-ref": "d95ec238a4d269dc", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-2-2.html", + "bom-ref": "350e779712e73372", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/OccupancyCalculatorPythonInterface/index.html", "type": "file" }, { - "bom-ref": "e639b484ee6dbbf5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-2-3.html", + "bom-ref": "82d71bde3b653bac", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/ProfilingGuide/index.html", "type": "file" }, { - "bom-ref": "e20b9ed7e361ad4b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-2-4.html", + "bom-ref": "ebebc8b7248cf980", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/PythonReportInterface/index.html", "type": "file" }, { - "bom-ref": "325b0106e4424c84", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-2-5.html", + "bom-ref": "e8cbcd0fafe0d528", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/ReleaseNotes/index.html", "type": "file" }, { - "bom-ref": "5b3b5264bc78caeb", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-2-6.html", + "bom-ref": "6bc6eeb3e1fabcb5", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/Training/index.html", "type": "file" }, { - "bom-ref": "60ea2b965182f199", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-2-7.html", + "bom-ref": "3c1d40ff59a75b47", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/VERSION", "type": "file" }, { - "bom-ref": "b2892f6e1abc928c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-2-8.html", + "bom-ref": "dc11860d92bd0fed", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/add-remote-connection-private-key.png", "type": "file" }, { - "bom-ref": "259d5eb518faa619", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-2-9.html", + "bom-ref": "c52255cf268ec613", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/add-remote-connection.png", "type": "file" }, { - "bom-ref": "b0f6319f292197de", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-2.html", + "bom-ref": "5842ee00485c4d0d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/as-viewer-cam.png", "type": "file" }, { - "bom-ref": "39f6981057bf2bb2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-3-1.html", + "bom-ref": "5bab91463908fd94", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/as-viewer-display-filter.png", "type": "file" }, { - "bom-ref": "fb0bad2d358e24fc", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2021-3.html", + "bom-ref": "b3cc5f40a3d85ae6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/as-viewer-open-button.png", "type": "file" }, { - "bom-ref": "3412148d3bdf5d02", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2022-1-1.html", + "bom-ref": "95bc6cfe536126fb", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/as-viewer-property-filter.png", "type": "file" }, { - "bom-ref": "4c6797f6b99a74ce", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2022-1.html", + "bom-ref": "10f176cdcbcff11a", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/as-viewer-rendering-options.png", "type": "file" }, { - "bom-ref": "c23a99cb061b82b7", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2022-2-1.html", + "bom-ref": "5eaa07e04ef4e81e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/as-viewer.png", "type": "file" }, { - "bom-ref": "5d8d029f25290e2d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2022-2.html", + "bom-ref": "770a719db728ab4b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/baselines-multiple.png", "type": "file" }, { - "bom-ref": "bc1712695a4eef44", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2022-3.html", + "bom-ref": "b2cf1495ffe756be", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/baselines-tool-window.png", "type": "file" }, { - "bom-ref": "ddda3d5324f105c2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2022-4-1.html", + "bom-ref": "fb3a9abff0ed323e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/baselines.png", "type": "file" }, { - "bom-ref": "0214a7b7c5b22e12", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2022-4.html", + "bom-ref": "242d7c3a01524c26", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/clustering-matrix.png", "type": "file" }, { - "bom-ref": "a285a5b0baa45c6c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2023-1-1.html", + "bom-ref": "9770b54ed065cfe1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/clustering-tree.png", "type": "file" }, { - "bom-ref": "ec80db520dc6114f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2023-1.html", + "bom-ref": "4456ba8d8c02d3a3", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/clustering-window.png", "type": "file" }, { - "bom-ref": "136662ff2929b185", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2023-2-1.html", + "bom-ref": "1d8ec013ff53dfbc", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/compute-pipeline.svg", "type": "file" }, { - "bom-ref": "5722c39f479a69af", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2023-2-2.html", + "bom-ref": "0c177b970d71c50d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/connection-dialog.png", "type": "file" }, { - "bom-ref": "1ed2a968b6cb3758", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2023-2.html", + "bom-ref": "1c7b2e67f22c9fc6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/connection-menu.png", "type": "file" }, { - "bom-ref": "c3aee8c55c92afb9", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2023-3-1.html", + "bom-ref": "c2fea78d0badf8e9", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/cubin-viewer.png", "type": "file" }, { - "bom-ref": "93308b291f94a68a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2023-3.html", + "bom-ref": "a32dc8017947f77c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-11.png", "type": "file" }, { - "bom-ref": "02f762c15df935e0", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2024-1-1.html", + "bom-ref": "119af1b16963c1f0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-12.png", "type": "file" }, { - "bom-ref": "b22d88c952cd321e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2024-1.html", + "bom-ref": "93014bfae870d31a", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-13.png", "type": "file" }, { - "bom-ref": "610585ce769bdf7c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2024-2-1.html", + "bom-ref": "3b5665f5c7dde227", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-14.png", "type": "file" }, { - "bom-ref": "9ed43697d05472aa", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2024-2.html", + "bom-ref": "8b496565a8f21ce1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-15.png", "type": "file" }, { - "bom-ref": "a5c05c6b88459725", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2024-3-1.html", + "bom-ref": "50327982f154c59b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-16.png", "type": "file" }, { - "bom-ref": "fac532a9cfed5429", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2024-3-2.html", + "bom-ref": "2905c69bd22deb35", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-17.png", "type": "file" }, { - "bom-ref": "3d82b18f420a46d7", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2024-3.html", + "bom-ref": "7880e301f1157817", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-18.png", "type": "file" }, { - "bom-ref": "f68c1074bd58e23c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2024-4.html", + "bom-ref": "46e2fef40335a367", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-19.png", "type": "file" }, { - "bom-ref": "d5e9af80a0f5f2a6", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2025-1-1.html", + "bom-ref": "43a0d6a74bf71add", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-2.png", "type": "file" }, { - "bom-ref": "5657f9c911fb4325", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2025-1.html", + "bom-ref": "6476d4e0cffefdc5", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-20.png", "type": "file" }, { - "bom-ref": "c505a1f623bba959", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2025-2-1.html", + "bom-ref": "2b1b67c5eb7c696a", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-3.png", "type": "file" }, { - "bom-ref": "4ba0f8efadac3197", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2025-2.html", + "bom-ref": "f2ce5c237331a4a5", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-5.png", "type": "file" }, { - "bom-ref": "7d9a8f781ee52058", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2025-3-1.html", + "bom-ref": "0a477771c06415f1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-6.png", "type": "file" }, { - "bom-ref": "b8c10cbab0a25509", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2025-3.html", + "bom-ref": "42a78d78c3547407", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-7.png", "type": "file" }, { - "bom-ref": "bdcc989d8366b435", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2025-4-1.html", + "bom-ref": "99bff447f78e4ce4", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-8.png", "type": "file" }, { - "bom-ref": "93973917daf913c2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2025-4.html", + "bom-ref": "082534433d5a1e83", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/filter-example-9.png", "type": "file" }, { - "bom-ref": "57f3b31ae9db5537", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2026-1-1.html", + "bom-ref": "24d21ecbcff855af", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/green-contexts-details-page.png", "type": "file" }, { - "bom-ref": "0c3fde1ecccf6904", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/ReleaseNotes/topics/updates-2026-1.html", + "bom-ref": "fbb8cd3a6412e228", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/green-contexts-resource-tool-window-with-tpc-mask.png", "type": "file" }, { - "bom-ref": "023559a161ad5c9b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/Training/index.html", + "bom-ref": "29cbd8aecded27ef", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/green-contexts-session-page.png", "type": "file" }, { - "bom-ref": "674e3c770eab2b6d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/VERSION", + "bom-ref": "e556dc1943f50034", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/hw-model-l1tex-ga100-global.png", "type": "file" }, { - "bom-ref": "6a994ff75b515fff", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/add-remote-connection-private-key.png", + "bom-ref": "dbd2b7d1daef6652", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/hw-model-l1tex.png", "type": "file" }, { - "bom-ref": "cddf7f703343c188", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/add-remote-connection.png", + "bom-ref": "0bad7b2d35bfdfa2", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/hw-model-lts-ga100.png", "type": "file" }, { - "bom-ref": "d8380311b0ac67f5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/as-viewer-cam.png", + "bom-ref": "32e43cba38334e2d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/hw-model-lts.png", "type": "file" }, { - "bom-ref": "2311d49c254d433a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/as-viewer-display-filter.png", + "bom-ref": "3128671e191a7695", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/hw-model-sm.png", "type": "file" }, { - "bom-ref": "855f95d1bbc9ed92", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/as-viewer-open-button.png", + "bom-ref": "5e7186a6c93b0c31", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/integration-1.png", "type": "file" }, { - "bom-ref": "8712420dbdfd765b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/as-viewer-property-filter.png", + "bom-ref": "b15bf59eb531eeea", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/integration-2.png", "type": "file" }, { - "bom-ref": "09955f3f96da2a6c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/as-viewer-rendering-options.png", + "bom-ref": "d887940e8609bd59", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/integration-3.png", "type": "file" }, { - "bom-ref": "73ab727b1cd44e08", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/as-viewer.png", + "bom-ref": "ff3f111cc0cb94af", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/integration-4.png", "type": "file" }, { - "bom-ref": "56e4833768262448", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/baselines-multiple.png", + "bom-ref": "0e36c8ae1e510dce", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/main-menu.png", "type": "file" }, { - "bom-ref": "e9de841771a08bf9", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/baselines-tool-window.png", + "bom-ref": "68a1a1c73b15da4b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/memory-access-patterns.svg", "type": "file" }, { - "bom-ref": "2ba525103566f41e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/baselines.png", + "bom-ref": "96cae2341086cb20", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/memory-chart-a100.png", "type": "file" }, { - "bom-ref": "6f01f0663153d1b3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/clustering-matrix.png", + "bom-ref": "dc4ce6b7f3102e9f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/memory-contention.svg", "type": "file" }, { - "bom-ref": "e430e294b7088714", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/clustering-tree.png", + "bom-ref": "d9c0d1172bf9bcd3", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/memory-peak-mapping.png", "type": "file" }, { - "bom-ref": "29b96fc59a169cde", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/clustering-window.png", + "bom-ref": "9759d0a5315617a6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/memory-subsystem.svg", "type": "file" }, { - "bom-ref": "89092bf148d50e4c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/connection-dialog.png", + "bom-ref": "76792050b308e98e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/memory-tables-dram.png", "type": "file" }, { - "bom-ref": "16ce294848c10987", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/cubin-viewer.png", + "bom-ref": "2b661fbe23460411", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/memory-tables-l1.png", "type": "file" }, { - "bom-ref": "fabecdfac0ffac87", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-11.png", + "bom-ref": "bdca12b870cceda8", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/memory-tables-l2-evict-policy.png", "type": "file" }, { - "bom-ref": "dd22bc752731338a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-12.png", + "bom-ref": "ec756599c64fa69f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/memory-tables-l2.png", "type": "file" }, { - "bom-ref": "75a6d2b94e283e68", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-13.png", + "bom-ref": "4e05e9b871711498", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/memory-tables-smem.png", "type": "file" }, { - "bom-ref": "9a1ebc2ae98770aa", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-14.png", + "bom-ref": "993e96f9823f0164", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/mergetool-comment.png", "type": "file" }, { - "bom-ref": "368caec1909890e1", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-15.png", + "bom-ref": "f7da20cf95ed7213", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/mergetool-files.png", "type": "file" }, { - "bom-ref": "7cfb437afe46139a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-16.png", + "bom-ref": "7b3ad4757c10b2e0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/mergetool-metrics-sections.png", "type": "file" }, { - "bom-ref": "e754b403d109a25b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-2.png", + "bom-ref": "e73e3462fbb934bc", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/mergetool-metrics.png", "type": "file" }, { - "bom-ref": "e5e5b7f40dfcdb92", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-3.png", + "bom-ref": "30b773f06aaecdcb", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/mergetool-results.png", "type": "file" }, { - "bom-ref": "fa0caa3975a7dbff", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-5.png", + "bom-ref": "4eae68097df5af39", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/mps-observation-window-kernel.png", "type": "file" }, { - "bom-ref": "a15c21f4b078a857", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-6.png", + "bom-ref": "c898971046d34a90", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/mps-observation-window-range.png", "type": "file" }, { - "bom-ref": "cb7cd6d1cfa1f7da", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-7.png", + "bom-ref": "fd9f82702e21a544", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-chat.png", "type": "file" }, { - "bom-ref": "548c576f7488bda1", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-8.png", + "bom-ref": "711e6d68603ab142", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-context-attachment.png", "type": "file" }, { - "bom-ref": "8aac3aef133afb2d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/filter-example-9.png", + "bom-ref": "0659ff879bffc784", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-feedback.png", "type": "file" }, { - "bom-ref": "9838d91aafb9b8c3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/green-contexts-details-page.png", + "bom-ref": "f434bde0e6cea602", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-install-dialog.png", "type": "file" }, { - "bom-ref": "ad992314745828cb", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/green-contexts-resource-tool-window-with-tpc-mask.png", + "bom-ref": "44f82e9bb36a6d3f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-multi-chat.png", "type": "file" }, { - "bom-ref": "31c148c6dfd6992d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/green-contexts-session-page.png", + "bom-ref": "002311e89322ecb5", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-references.png", "type": "file" }, { - "bom-ref": "7d206d65bf7b6f18", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/hw-model-l1tex-ga100-global.png", + "bom-ref": "134112086c726cbe", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-report-query.png", "type": "file" }, { - "bom-ref": "d4c46a0e0320ae96", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/hw-model-l1tex.png", + "bom-ref": "db4a165c13d3f7c5", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-search-chat-bar.png", "type": "file" }, { - "bom-ref": "39fbdf38de07a6fd", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/hw-model-lts-ga100.png", + "bom-ref": "ea13a9d84f4bb520", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-settings.png", "type": "file" }, { - "bom-ref": "768690ffdc53f762", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/hw-model-lts.png", + "bom-ref": "7fc0bf334cbb56d0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-sign-in.png", "type": "file" }, { - "bom-ref": "589d15f39febe577", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/integration-1.png", + "bom-ref": "f08c807df9613d00", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-signed-in.png", "type": "file" }, { - "bom-ref": "f0f60bf63ee11649", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/integration-2.png", + "bom-ref": "eb94c82caf77e5b6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-start-page.png", "type": "file" }, { - "bom-ref": "aa4de917f1f276a5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/integration-3.png", + "bom-ref": "569775394d057413", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/nsight-copilot-thinking.png", "type": "file" }, { - "bom-ref": "cc35a67814b121b7", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/integration-4.png", + "bom-ref": "b7fb7064660aff46", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/occupancy-calculator-activity.png", "type": "file" }, { - "bom-ref": "32d5cb06c8e7b5d3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/main-menu.png", + "bom-ref": "245e3c166a62ba82", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/occupancy-calculator-from-header.png", "type": "file" }, { - "bom-ref": "ab3296cb89c4e824", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/memory-chart-a100.png", + "bom-ref": "16f3c8dc779eabb7", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/occupancy-calculator-from-section.png", "type": "file" }, { - "bom-ref": "47da75851b8809f8", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/memory-peak-mapping.png", + "bom-ref": "aeb093502695d0e0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/occupancy-calculator-gpu-data.png", "type": "file" }, { - "bom-ref": "2445184e11055a16", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/memory-tables-dram.png", + "bom-ref": "2369c5750c414027", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/occupancy-calculator-graphs.png", "type": "file" }, { - "bom-ref": "98b8a990b3a3dd7c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/memory-tables-l1.png", + "bom-ref": "54b2cb2e7ac06797", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/occupancy-calculator-tables.png", "type": "file" }, { - "bom-ref": "7920b677a8ed3bb2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/memory-tables-l2-evict-policy.png", + "bom-ref": "cc8e335aac1c4dfe", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/occupancy-calculator-utilization.png", "type": "file" }, { - "bom-ref": "557aaa00106c7f1f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/memory-tables-l2.png", + "bom-ref": "0bd8e85228a2cb82", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/occupancy-scheduling.svg", "type": "file" }, { - "bom-ref": "f0ccc7cde8e244a7", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/memory-tables-smem.png", + "bom-ref": "adcd9ecd3ad31033", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/options-profile.png", "type": "file" }, { - "bom-ref": "85d526965c524078", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/mergetool-comment.png", + "bom-ref": "778bc684d6bf67b5", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/pmsampling-misaligned-passes.png", "type": "file" }, { - "bom-ref": "e531a644c13bd58d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/mergetool-files.png", + "bom-ref": "71cb5230fc08ec2e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/pmsampling-tensor-example.png", "type": "file" }, { - "bom-ref": "f0a73b8a77561372", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/mergetool-metrics-sections.png", + "bom-ref": "cf92c22948113a25", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profile-series-action.png", "type": "file" }, { - "bom-ref": "9b7a7de27ac72f33", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/mergetool-metrics.png", + "bom-ref": "2cf46a86e1ea9086", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profile-series-dialog.png", "type": "file" }, { - "bom-ref": "d91997bce842132f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/mergetool-results.png", + "bom-ref": "1c509c289fb8ab39", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiled-process.png", "type": "file" }, { - "bom-ref": "34c3d37a1cf3fc85", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/mps-observation-window-kernel.png", + "bom-ref": "d4ae7c5552f22d59", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-header-filter-dialog.png", "type": "file" }, { - "bom-ref": "4efea565794b3541", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/mps-observation-window-range.png", + "bom-ref": "a2bd52c5cbc77010", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-header.png", "type": "file" }, { - "bom-ref": "305b27be68645872", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/occupancy-calculator-activity.png", + "bom-ref": "d51d2d9db06756a2", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-callstack-python.png", "type": "file" }, { - "bom-ref": "165aeaa5511c3d34", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/occupancy-calculator-from-header.png", + "bom-ref": "b200b685343f37b0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-callstack.png", "type": "file" }, { - "bom-ref": "294d9e0dd4f36f72", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/occupancy-calculator-from-section.png", + "bom-ref": "26d90ae370d0a871", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-correlation-navigation.png", "type": "file" }, { - "bom-ref": "300ec9a627dd4af2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/occupancy-calculator-gpu-data.png", + "bom-ref": "831286119873b55c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-details-comments.png", "type": "file" }, { - "bom-ref": "1c3a1a3fe8a6ae1a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/occupancy-calculator-graphs.png", + "bom-ref": "4db19815a4827f9f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-details-source-table.png", "type": "file" }, { - "bom-ref": "7ea5b221be3862ad", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/occupancy-calculator-tables.png", + "bom-ref": "995e18d301d1b565", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-details-timeline.png", "type": "file" }, { - "bom-ref": "cf9cd6e8b790a958", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/occupancy-calculator-utilization.png", + "bom-ref": "6e228647eb9d0c3a", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-fix-column.png", "type": "file" }, { - "bom-ref": "884d4589627499b0", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/options-profile.png", + "bom-ref": "d5d8f32cd12fc94e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-inline-functions-table.png", "type": "file" }, { - "bom-ref": "ce58663353397c37", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/pmsampling-misaligned-passes.png", + "bom-ref": "0e685d7cdaac008b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-instruction-mix-table.png", "type": "file" }, { - "bom-ref": "09b77d556d72bffb", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/pmsampling-tensor-example.png", + "bom-ref": "3bbe9f27c446a986", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-nvtx.png", "type": "file" }, { - "bom-ref": "e8a8c0064e80cb48", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profile-series-action.png", + "bom-ref": "81e929d0265cf531", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-register-dependencies-table.png", "type": "file" }, { - "bom-ref": "5721ce92317f936f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profile-series-dialog.png", + "bom-ref": "a73ce149ad384df0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-section-bodies.png", "type": "file" }, { - "bom-ref": "be90f541fe0bb977", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiled-process.png", + "bom-ref": "d2416763c6919fb6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-section-rooflines.png", "type": "file" }, { - "bom-ref": "0b258a450af32ee3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-header-filter-dialog.png", + "bom-ref": "979d44e4bbc65896", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-section-with-rule.png", "type": "file" }, { - "bom-ref": "8d352a477e1da293", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-header.png", + "bom-ref": "475ce0cca7689759", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-collapse.png", "type": "file" }, { - "bom-ref": "ab74fe784ecf5ea2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-callstack-python.png", + "bom-ref": "bc35a733f32416f1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-column-chooser.png", "type": "file" }, { - "bom-ref": "addc8094e73018af", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-callstack.png", + "bom-ref": "4c5d96a13170209f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-heatmap.png", "type": "file" }, { - "bom-ref": "8681edd9033cf30a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-correlation-navigation.png", + "bom-ref": "4a30cefcb2ca6895", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-markers-table.png", "type": "file" }, { - "bom-ref": "ef183a9a9050fba2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-details-comments.png", + "bom-ref": "755f3a097e120ceb", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-markers.png", "type": "file" }, { - "bom-ref": "9a8bab54eaea8d1e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-details-source-table.png", + "bom-ref": "359aade7fe1ddecc", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-navigate-by.png", "type": "file" }, { - "bom-ref": "aee1944e3a3e6326", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-details-timeline.png", + "bom-ref": "2c3cc2736a8615fb", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-profiles-button.png", "type": "file" }, { - "bom-ref": "837750969772f75e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-fix-column.png", + "bom-ref": "c65c10a44261ff01", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-profiles.png", "type": "file" }, { - "bom-ref": "6969216243d073a7", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-inline-functions-table.png", + "bom-ref": "8ec3b751a4efe0cd", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-register-dependencies.png", "type": "file" }, { - "bom-ref": "95685757530de368", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-instruction-mix-table.png", + "bom-ref": "a932b07db8da4d33", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-rel-abs.png", "type": "file" }, { - "bom-ref": "434ec574cafb7c25", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-nvtx.png", + "bom-ref": "4e51b1bac81383d7", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-resolve.png", "type": "file" }, { - "bom-ref": "e966099b56889832", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-register-dependencies-table.png", + "bom-ref": "45262ff31851087c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-search.png", "type": "file" }, { - "bom-ref": "e2efd7d85e9a0e9b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-section-bodies.png", + "bom-ref": "24b3bf922bf81d30", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source-statistics.png", "type": "file" }, { - "bom-ref": "1020492f2ae6f671", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-section-rooflines.png", + "bom-ref": "ad66c6cc50a97e36", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-source.png", "type": "file" }, { - "bom-ref": "892f67e27badd5a5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-section-with-rule.png", + "bom-ref": "1ce8297b8909bd74", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-summary-rules.png", "type": "file" }, { - "bom-ref": "28e25bc74b290d33", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-collapse.png", + "bom-ref": "98346d51fcc42f2f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-summary-table.png", "type": "file" }, { - "bom-ref": "a4497dd20245886e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-column-chooser.png", + "bom-ref": "51e1743bb6457f6a", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-summary.png", "type": "file" }, { - "bom-ref": "a3669e2480caf345", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-heatmap.png", + "bom-ref": "d6b26ee3d42be738", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/profiler-report-pages-symbol-labels.png", "type": "file" }, { - "bom-ref": "220037dadd2652fc", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-markers-table.png", + "bom-ref": "556bf12448f8dcbc", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/progress-log.png", "type": "file" }, { - "bom-ref": "33a1956f86eff4dc", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-markers.png", + "bom-ref": "5206caf546445aae", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/projects-explorer.png", "type": "file" }, { - "bom-ref": "8f92a038d238cf4b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-navigate-by.png", + "bom-ref": "68263a6e05db7303", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-baseline.png", "type": "file" }, { - "bom-ref": "aac03140f8aaf2b7", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-profiles-button.png", + "bom-ref": "8a29926a9a9543fe", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-interactive-profiling-api-stream.png", "type": "file" }, { - "bom-ref": "5a81971d008e697c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-profiles.png", + "bom-ref": "22824d4d1f3a9ef5", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-interactive-profiling-attach.png", "type": "file" }, { - "bom-ref": "276123f395aeea94", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-register-dependencies.png", + "bom-ref": "300bd93c04fba1c7", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-interactive-profiling-connect.png", "type": "file" }, { - "bom-ref": "eae44443b25d42f2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-rel-abs.png", + "bom-ref": "2854166aeacf61f2", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-interactive-profiling-connected.png", "type": "file" }, { - "bom-ref": "3dccf774151170c3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-resolve.png", + "bom-ref": "71712d19b5f564f2", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-interactive-profiling-next-launch.png", "type": "file" }, { - "bom-ref": "bda639ddc7e5609d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-search.png", + "bom-ref": "6d83cd6fbf3bf5fc", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-profiling-connect.png", "type": "file" }, { - "bom-ref": "77e5845bbe6e2c98", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source-statistics.png", + "bom-ref": "3d7d6bbea353ba8f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-profiling-options-sections.png", "type": "file" }, { - "bom-ref": "0ecd1789279015af", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-source.png", + "bom-ref": "ca9b3641758b5f35", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-report-summary.png", "type": "file" }, { - "bom-ref": "29de3334cd86e058", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-summary-rules.png", + "bom-ref": "9097e4adfb5a823c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-report.png", "type": "file" }, { - "bom-ref": "a797fe2e80819ded", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-summary-table.png", + "bom-ref": "3a4aaa95940d4135", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-rule.png", "type": "file" }, { - "bom-ref": "4abcf78d7f743c70", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-summary.png", + "bom-ref": "e51b932d09202d11", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-system-trace-connect.png", "type": "file" }, { - "bom-ref": "efb05074a0e654f2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/profiler-report-pages-symbol-labels.png", + "bom-ref": "44a929b0ae6f7e93", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-system-trace-options.png", "type": "file" }, { - "bom-ref": "e55939bf32ad7145", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/progress-log.png", + "bom-ref": "2081e80ce2213a8b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/quick-start-system-trace-timeline.png", "type": "file" }, { - "bom-ref": "1fa1e734c95a7929", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/projects-explorer.png", + "bom-ref": "e41e03617f048f91", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/regular-application-process.png", "type": "file" }, { - "bom-ref": "4679c583250b1ca6", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-baseline.png", + "bom-ref": "b5e0c901bdc88f7b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/replay-application-kernel-matching.png", "type": "file" }, { - "bom-ref": "bbe5174b1623016f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-interactive-profiling-api-stream.png", + "bom-ref": "bf0a14df7d072109", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/replay-application-range.png", "type": "file" }, { - "bom-ref": "ca07f8692bdfddc9", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-interactive-profiling-attach.png", + "bom-ref": "0d198c4f38cf064c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/replay-application.png", "type": "file" }, { - "bom-ref": "d50f4d7f95fc07bc", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-interactive-profiling-connect.png", + "bom-ref": "4371692f79561806", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/replay-kernel.png", "type": "file" }, { - "bom-ref": "14eaa3f37e6f99a3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-interactive-profiling-connected.png", + "bom-ref": "955707d14396d639", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/replay-range.png", "type": "file" }, { - "bom-ref": "add7dc3abd3d79c4", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-interactive-profiling-next-launch.png", + "bom-ref": "5417051c5cf0a35c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/replay-regular-execution.png", "type": "file" }, { - "bom-ref": "b03490366608c605", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-profiling-connect.png", + "bom-ref": "e0f79f9e5dd14dfa", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/roofline-analysis.png", "type": "file" }, { - "bom-ref": "9e34e4d7bbf7be2c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-profiling-options-sections.png", + "bom-ref": "3ac3e00508bc5383", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/roofline-overview.png", "type": "file" }, { - "bom-ref": "a715e67a29d869c7", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-report-summary.png", + "bom-ref": "4162398a74ac548f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/section-files-2.png", "type": "file" }, { - "bom-ref": "994679e7d522fdd3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-report.png", + "bom-ref": "c40496ff946f220d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/section-files.png", "type": "file" }, { - "bom-ref": "f3948c5e913b427b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-rule.png", + "bom-ref": "ca7604cfcc5be300", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/sm-selection-dialog.png", "type": "file" }, { - "bom-ref": "339a52ab91cba72f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-system-trace-connect.png", + "bom-ref": "63c1934af8bb508b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/source-comparison-diff-by-menu.png", "type": "file" }, { - "bom-ref": "8898159fe1fc202b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-system-trace-options.png", + "bom-ref": "e8e1c1caa73f2b9c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/source-comparison-document.png", "type": "file" }, { - "bom-ref": "5d95597ce344214a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/quick-start-system-trace-timeline.png", + "bom-ref": "61ada69947570a06", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/source-comparison-from-header.png", "type": "file" }, { - "bom-ref": "855789ca29b6d7ba", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/regular-application-process.png", + "bom-ref": "bb6bd9c9f4220126", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/source-comparison-navigation-buttons.png", "type": "file" }, { - "bom-ref": "e899945894e4712b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/replay-application-kernel-matching.png", + "bom-ref": "fb17e010e38d3a06", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/source-counters.png", "type": "file" }, { - "bom-ref": "a97681908922ca69", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/replay-application-range.png", + "bom-ref": "7a44b8bdb6560e2d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/status-banner.png", "type": "file" }, { - "bom-ref": "8e1798e9959bc8f3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/replay-application.png", + "bom-ref": "539964f39b6484b3", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-api-statistics.png", "type": "file" }, { - "bom-ref": "32e7ae41ecbe2906", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/replay-kernel.png", + "bom-ref": "1a9f6a385ed1a49d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-api-stream.png", "type": "file" }, { - "bom-ref": "f8c9a079a1547e5c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/replay-range.png", + "bom-ref": "9ab8fd5327f6b8a9", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-baselines.png", "type": "file" }, { - "bom-ref": "fa2cedddb3af6521", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/replay-regular-execution.png", + "bom-ref": "812012152c560d65", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-callstack.png", "type": "file" }, { - "bom-ref": "c0483d59758d61aa", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/roofline-analysis.png", + "bom-ref": "50cdd352ab92a27a", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-cuda-graph-viewer-interactive.png", "type": "file" }, { - "bom-ref": "6e4954abb988d2d3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/roofline-overview.png", + "bom-ref": "fe71ea447462ee63", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-cuda-graph-viewer-legend.png", "type": "file" }, { - "bom-ref": "dd849c79f3fb5357", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/section-files-2.png", + "bom-ref": "5cc17d31f3040fc0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-cuda-graph-viewer-report.png", "type": "file" }, { - "bom-ref": "49400b60ff3e417e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/section-files.png", + "bom-ref": "238aaa903ddcc779", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-cuda-graph-viewer.png", "type": "file" }, { - "bom-ref": "8c247e097c039300", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/sm-selection-dialog.png", + "bom-ref": "50f48eba0b9b2a90", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-device-information.png", "type": "file" }, { - "bom-ref": "caf673ae5418a969", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/source-comparison-diff-by-menu.png", + "bom-ref": "dc0fcb9daf852717", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-function-stats-tree.png", "type": "file" }, { - "bom-ref": "1851a5bb39e831a2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/source-comparison-document.png", + "bom-ref": "f985b3fd87426e07", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-function-stats.png", "type": "file" }, { - "bom-ref": "773549b922093eb1", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/source-comparison-from-header.png", + "bom-ref": "d60cfbe63b57568f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-launch-details.png", "type": "file" }, { - "bom-ref": "ddc6d142884c4c08", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/source-comparison-navigation-buttons.png", + "bom-ref": "02baf5e64e46d648", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-metric-details.png", "type": "file" }, { - "bom-ref": "1572d3c3adc219e5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/source-counters.png", + "bom-ref": "b67d7e2e3d23fb5e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-nsight-copilot.png", "type": "file" }, { - "bom-ref": "1fa75ed779957b50", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/status-banner.png", + "bom-ref": "d91efb8c38636cdd", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-nvtx-resources.png", "type": "file" }, { - "bom-ref": "4a62e7ded3d4d0ca", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-api-statistics.png", + "bom-ref": "94971cd078c9ec26", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-nvtx.png", "type": "file" }, { - "bom-ref": "7981e0af27feaf88", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-api-stream.png", + "bom-ref": "8bafefd0d1adc8dc", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-resources.png", "type": "file" }, { - "bom-ref": "cef65549378af144", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-baselines.png", + "bom-ref": "7f8203f672f0e8e9", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-search-results.png", "type": "file" }, { - "bom-ref": "bc53366cf68dd227", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-callstack.png", + "bom-ref": "07ab62a416c6a73c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-search.png", "type": "file" }, { - "bom-ref": "9b2afedcf90eeeec", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-cuda-graph-viewer.png", + "bom-ref": "a0ed6ae80c3f3c2d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-section-sets.png", "type": "file" }, { - "bom-ref": "593a06b484a9cd67", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-function-stats.png", + "bom-ref": "a34f024fbaa42ee8", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/tool-window-sections.png", "type": "file" }, { - "bom-ref": "d2a02c47bde8ee82", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-launch-details.png", + "bom-ref": "b92771f60ceb0685", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/triage-decision-0-flowchart.svg", "type": "file" }, { - "bom-ref": "2e3657c3a8a97f53", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-metric-details.png", + "bom-ref": "da0bd5f84cb62723", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/triage-decision-1-flowchart.svg", "type": "file" }, { - "bom-ref": "d2746615ad618fbe", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-nvtx-resources.png", + "bom-ref": "0581eb31aa6a7a9d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/triage-decision-2-flowchart.svg", "type": "file" }, { - "bom-ref": "09649c51ecf9d98a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-nvtx.png", + "bom-ref": "f42773fbf265f0ed", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/triage-decision-2a-flowchart.svg", "type": "file" }, { - "bom-ref": "d91f0c7f33159dff", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-resources.png", + "bom-ref": "9ce70aa077a4b445", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/triage-decision-3-flowchart.svg", "type": "file" }, { - "bom-ref": "d023c9763f635c1d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-search-results.png", + "bom-ref": "eafdad7452519ecd", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/triage-decision-4-flowchart.svg", "type": "file" }, { - "bom-ref": "2de6e6eb60f08588", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-search.png", + "bom-ref": "82d887bfbd970793", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/triage-decision-5-flowchart.svg", "type": "file" }, { - "bom-ref": "b7719a3913bc37b6", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-section-sets.png", + "bom-ref": "32dcf26aeba86bec", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/triage-decision-6-flowchart.svg", "type": "file" }, { - "bom-ref": "942fce0a8cb11437", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/tool-window-sections.png", + "bom-ref": "74509e7d5c6b7637", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/triage-decision-7-flowchart.svg", "type": "file" }, { - "bom-ref": "3481261b2708ad39", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_images/welcome-page.png", + "bom-ref": "a3d863cdedc7f740", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/triage-flowchart.svg", "type": "file" }, { - "bom-ref": "9c1bff7899dc60e2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_sphinx_design_static/design-style.b7bb847fb20b106c3d81b95245e65545.min.css", + "bom-ref": "d194744bf1e2a484", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_images/welcome-page.png", "type": "file" }, { - "bom-ref": "97a97bfc1bb9f798", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_sphinx_design_static/design-tabs.js", + "bom-ref": "85c2a095df249065", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_sphinx_design_static/design-tabs.js", "type": "file" }, { - "bom-ref": "585bec51cb6fb4fa", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/NVIDIA-LogoBlack.svg", + "bom-ref": "7c6846adeb764bac", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_sphinx_design_static/sphinx-design.min.css", "type": "file" }, { - "bom-ref": "b5d1e1b4ed51bee5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/NVIDIA-LogoWhite.svg", + "bom-ref": "c2b2b6224985ec17", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/basic.css", "type": "file" }, { - "bom-ref": "b9746a7293a1c9fc", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/api-styles-dark.css", + "bom-ref": "045f0acc080ebbb0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/css/custom.css", "type": "file" }, { - "bom-ref": "ce7fe9ece0eb9efb", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/api-styles.css", + "bom-ref": "a2cae3077791f3b1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/custom.css", "type": "file" }, { - "bom-ref": "55ec362bcad95353", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/basic.css", + "bom-ref": "3bab9980eaa4fc4e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/design-tabs.js", "type": "file" }, { - "bom-ref": "860dbfd636ea5e77", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/badge_only.css", + "bom-ref": "18ad1be06d57c3c7", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/doctools.js", "type": "file" }, { - "bom-ref": "113c4810889b8d49", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/Roboto-Slab-Bold.woff", + "bom-ref": "e2f791cd7dcb40e0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/documentation_options.js", "type": "file" }, { - "bom-ref": "0edd5135f2503915", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/Roboto-Slab-Bold.woff2", + "bom-ref": "6457dbb1bb3198c9", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/favicon.png", "type": "file" }, { - "bom-ref": "f662721f5c9b15a8", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/Roboto-Slab-Regular.woff", + "bom-ref": "941db8612a9aecbf", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/file.png", "type": "file" }, { - "bom-ref": "3c2c3eb3fdecf1e7", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/Roboto-Slab-Regular.woff2", + "bom-ref": "6cdd94a9d5fe1621", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/js/resizable-sidebars.js", "type": "file" }, { - "bom-ref": "1c8109e449135650", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/fontawesome-webfont.eot", + "bom-ref": "fadab684060a5b87", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/language_data.js", "type": "file" }, { - "bom-ref": "e0f9aef20d42b01f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/fontawesome-webfont.svg", + "bom-ref": "134935b290089275", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/lunr-search.js", "type": "file" }, { - "bom-ref": "26ea0b9aafcd3576", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/fontawesome-webfont.ttf", + "bom-ref": "4b7d8d2b653de38b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/lunr.min.js", "type": "file" }, { - "bom-ref": "39355781c64d8ba7", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/fontawesome-webfont.woff", + "bom-ref": "3ac2304a1a513c7d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/mermaid-init.js", "type": "file" }, { - "bom-ref": "faa91c77b7e4763a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/fontawesome-webfont.woff2", + "bom-ref": "e2d46c0808914267", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/minus.png", "type": "file" }, { - "bom-ref": "a023297d0726c756", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/lato-bold-italic.woff", + "bom-ref": "2cda94946cf737d0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/modal-table.js", "type": "file" }, { - "bom-ref": "844550b018ef7ffe", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/lato-bold-italic.woff2", + "bom-ref": "17c0e0d541ec29db", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/nsight-compute.ico", "type": "file" }, { - "bom-ref": "ce132a638a1b15bb", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/lato-bold.woff", + "bom-ref": "195a63c3f2d1c3b1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/nvidia-logo-horiz-rgb-1c-blk-for-screen.svg", "type": "file" }, { - "bom-ref": "82ff8553ec2e39cd", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/lato-bold.woff2", + "bom-ref": "283e3535fd2a6b89", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/nvidia-logo-horiz-rgb-1c-wht-for-screen.svg", "type": "file" }, { - "bom-ref": "51b0cfaebc9c4f8c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/lato-normal-italic.woff", + "bom-ref": "a0029147e01dc702", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/nvidia-logo-horiz-rgb-blk-for-screen.svg", "type": "file" }, { - "bom-ref": "6067c0e6ec982868", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/lato-normal-italic.woff2", + "bom-ref": "412a6eb83f9d3850", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/nvidia-logo-horiz-rgb-wht-for-screen.svg", "type": "file" }, { - "bom-ref": "d9691e3bde12fa36", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/lato-normal.woff", + "bom-ref": "f167c1880cbdeb45", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/plus.png", "type": "file" }, { - "bom-ref": "94bf5d04744c647c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/fonts/lato-normal.woff2", + "bom-ref": "ad612af88f7ce7be", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/pygments.css", "type": "file" }, { - "bom-ref": "ee43b94b80c31c96", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/css/theme.css", + "bom-ref": "1a71f072428bd251", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/scripts/bootstrap.js", "type": "file" }, { - "bom-ref": "7ff1f4b2bac0e978", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/design-style.b7bb847fb20b106c3d81b95245e65545.min.css", + "bom-ref": "b1eb78b76cd2dca3", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/scripts/bootstrap.js.LICENSE.txt", "type": "file" }, { - "bom-ref": "fb1b8ffcb5018c45", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/design-tabs.js", + "bom-ref": "150229b440d2e486", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/scripts/bootstrap.js.map", "type": "file" }, { - "bom-ref": "6421cfe3926490bd", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/doctools.js", + "bom-ref": "c90581a3e4607e0a", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/scripts/fontawesome.js", "type": "file" }, { - "bom-ref": "feb50d9938e1a7fd", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/documentation_options.js", + "bom-ref": "205fa973bc307a23", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/scripts/fontawesome.js.LICENSE.txt", "type": "file" }, { - "bom-ref": "130f201aef1c24f8", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/favicon.ico", + "bom-ref": "d351ba9b1ea698aa", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/scripts/fontawesome.js.map", "type": "file" }, { - "bom-ref": "d6d30f1beec848ed", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/file.png", + "bom-ref": "30ad26f5f498b80e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/scripts/nvidia-sphinx-theme.js", "type": "file" }, { - "bom-ref": "c5b91b5cd115dc7f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/jquery-3.5.1.js", + "bom-ref": "3b64d1593f105431", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/scripts/pydata-sphinx-theme.js", "type": "file" }, { - "bom-ref": "d79ab2d61af338d3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/jquery.js", + "bom-ref": "0a1e70d630b87711", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/scripts/pydata-sphinx-theme.js.map", "type": "file" }, { - "bom-ref": "678b1a25a71186fb", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/js/badge_only.js", + "bom-ref": "6f7efef6b4b7515d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/scrollspy-patch.js", "type": "file" }, { - "bom-ref": "c9fc7082fb6f07f7", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/js/html5shiv-printshiv.min.js", + "bom-ref": "58789b462a55e6e6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/searchtools.js", "type": "file" }, { - "bom-ref": "f8edf950c22f49c3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/js/html5shiv.min.js", + "bom-ref": "422f2e6934fd7eb5", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/sphinx-design.min.css", "type": "file" }, { - "bom-ref": "f6a6a00171c73e5f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/js/theme.js", + "bom-ref": "db72c1225bdc41df", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/sphinx_highlight.js", "type": "file" }, { - "bom-ref": "167a260bc6bed79d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/language_data.js", + "bom-ref": "ebfb4188c499ef46", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/styles/nvidia-sphinx-theme.css", "type": "file" }, { - "bom-ref": "c9ef4baa98f3b56e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/lunr.min.js", + "bom-ref": "072924acd6aebac6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/styles/nvidia-sphinx-theme.css.map", "type": "file" }, { - "bom-ref": "15e83b7d1f768089", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/lunr_search.js", + "bom-ref": "cc30543ea7e7b9e3", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/styles/pydata-sphinx-theme.css", "type": "file" }, { - "bom-ref": "ffe6e7fcdf01bd8c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/main_ov_logo_rect.png", + "bom-ref": "1c95d5164285ad44", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/styles/pydata-sphinx-theme.css.map", "type": "file" }, { - "bom-ref": "7c8f5898478dd808", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/main_ov_logo_square.png", + "bom-ref": "7f437a040ec7afbd", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/styles/theme.css", "type": "file" }, { - "bom-ref": "96e82ecb50132b44", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/mermaid-init.js", + "bom-ref": "079cfa650581880b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/twemoji.css", "type": "file" }, { - "bom-ref": "51a4da0fa593e34f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/minus.png", + "bom-ref": "d2e046ed08e711ba", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/twemoji.js", "type": "file" }, { - "bom-ref": "c5e5d19f424bb970", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/nsight-compute.ico", + "bom-ref": "9665fc92eed365d4", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf", "type": "file" }, { - "bom-ref": "06939e40f7f240f6", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/nsight-compute.png", + "bom-ref": "e35db3dee253e092", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2", "type": "file" }, { - "bom-ref": "4fcffee58b0da006", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/omni-style-dark.css", + "bom-ref": "024c1cff71fc099b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf", "type": "file" }, { - "bom-ref": "1bc5426feacf8db8", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/omni-style.css", + "bom-ref": "667fe1c6af800132", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2", "type": "file" }, { - "bom-ref": "732252bff3f30a61", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/plus.png", + "bom-ref": "8e80c23066df6327", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf", "type": "file" }, { - "bom-ref": "a658ad1a8c742fb2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/pygments.css", + "bom-ref": "e34757d9fab66b9f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2", "type": "file" }, { - "bom-ref": "7be8bc38aa8793cb", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/searchtools.js", + "bom-ref": "ddf7c48df542b1a8", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/version-patch.js", "type": "file" }, { - "bom-ref": "1cf57023be672277", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/social-media.js", + "bom-ref": "b8523f168ba50039", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/_static/webpack-macros.html", "type": "file" }, { - "bom-ref": "f5f960807783efa3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/theme-setter.js", + "bom-ref": "47bd8c1531288461", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/genindex.html", "type": "file" }, { - "bom-ref": "e3012c622f7e64f5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/theme-switcher-general.css", + "bom-ref": "27011a5323ecca2d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/index.html", "type": "file" }, { - "bom-ref": "db20773ad5b2437e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/twemoji.css", + "bom-ref": "2fe0406ad920f067", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/objects.inv", "type": "file" }, { - "bom-ref": "c2c342d2a7919d9f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/twemoji.js", + "bom-ref": "3cbbdd8fc905bc65", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/project.json", "type": "file" }, { - "bom-ref": "6a63072e1c996e30", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/underscore-1.13.1.js", + "bom-ref": "feb28ddd9ee84398", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/py-modindex.html", "type": "file" }, { - "bom-ref": "505695885609c6fd", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/underscore.js", + "bom-ref": "9d4ce2d0db3ce4be", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/search.html", "type": "file" }, { - "bom-ref": "a6bd4f61b9dd6fda", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/_static/version.js", + "bom-ref": "db84ead46ed58932", + "name": "/opt/nvidia/nsight-compute/2026.3.0/docs/searchindex.js", "type": "file" }, { - "bom-ref": "41a39e2499381a57", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/genindex.html", + "bom-ref": "8300460da6a53efc", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/Api/nvComputeInj.h", "type": "file" }, { - "bom-ref": "1ed82b0308638043", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/index.html", + "bom-ref": "1400e0eac94c314d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/FileFormat/CpuStacktrace.proto", "type": "file" }, { - "bom-ref": "677392365232ba8f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/objects.inv", + "bom-ref": "b6168e64bfd0aec4", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/FileFormat/Nvtx.proto", "type": "file" }, { - "bom-ref": "0f58be8d01fed533", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/project.json", + "bom-ref": "d2aeb9a4825e2da3", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/FileFormat/NvtxCategories.proto", "type": "file" }, { - "bom-ref": "3e0ebc133dbf525f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/py-modindex.html", + "bom-ref": "4c89f11fb71f1a26", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/FileFormat/ProfilerMetricOptions.proto", "type": "file" }, { - "bom-ref": "b7de34fa0715c954", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/search.html", + "bom-ref": "c925ca58ea25569c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/FileFormat/ProfilerReport.proto", "type": "file" }, { - "bom-ref": "6613eabd957517a9", - "name": "/opt/nvidia/nsight-compute/2026.1.1/docs/searchindex.js", + "bom-ref": "97128a6da707547c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/FileFormat/ProfilerReportCommon.proto", "type": "file" }, { - "bom-ref": "2eb79a60061cae50", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/FileFormat/CpuStacktrace.proto", + "bom-ref": "ec9bcca7516a2053", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/FileFormat/ProfilerResultsCommon.proto", "type": "file" }, { - "bom-ref": "95b56f913e413670", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/FileFormat/Nvtx.proto", + "bom-ref": "f7b1fd2e84fb81c4", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/FileFormat/ProfilerSection.proto", "type": "file" }, { - "bom-ref": "556f11da0bf8b1e0", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/FileFormat/NvtxCategories.proto", + "bom-ref": "98b5a4b1a1c9ca5e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/FileFormat/ProfilerStringTable.proto", "type": "file" }, { - "bom-ref": "135617423cbdcedb", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/FileFormat/ProfilerMetricOptions.proto", + "bom-ref": "cf532ab28d3f2c59", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/FileFormat/RuleResults.proto", "type": "file" }, { - "bom-ref": "fec2b5418f3e1908", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/FileFormat/ProfilerReport.proto", + "bom-ref": "f386e4fb6affd950", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/ReportUtils/ReportMergeTool", "type": "file" }, { - "bom-ref": "d6bf57c7af9f8382", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/FileFormat/ProfilerReportCommon.proto", + "bom-ref": "e54d5ee0c635cde7", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/RuleTemplates/AdvancedRuleTemplate.py", "type": "file" }, { - "bom-ref": "7bd0eee2a55b0027", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/FileFormat/ProfilerResultsCommon.proto", + "bom-ref": "fb87e69b40b1ceea", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/RuleTemplates/BasicKernelInfo.py", "type": "file" }, { - "bom-ref": "5e95b0c17773d0b8", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/FileFormat/ProfilerSection.proto", + "bom-ref": "2443e72bceadb602", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/RuleTemplates/BasicRuleTemplate.py", "type": "file" }, { - "bom-ref": "679c116ed805aaec", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/FileFormat/ProfilerStringTable.proto", + "bom-ref": "1c547d3ff235e289", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/RuleTemplates/RuleTemplate.section", "type": "file" }, { - "bom-ref": "a6754772745dfc19", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/FileFormat/RuleResults.proto", + "bom-ref": "7c134dfd2089a4a7", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/RuleTemplates/RuleTemplate2_table.chart", "type": "file" }, { - "bom-ref": "544fda8525f48226", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/ReportUtils/ReportMergeTool", + "bom-ref": "40b2f5a7a2155268", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/RuleTemplates/RuleTemplate_bar.chart", "type": "file" }, { - "bom-ref": "11d1792b7e4ff66d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/RuleTemplates/AdvancedRuleTemplate.py", + "bom-ref": "c5cc7cc37547a942", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/RuleTemplates/RuleTemplate_table.chart", "type": "file" }, { - "bom-ref": "306cc7d72ac4e4f2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/RuleTemplates/BasicKernelInfo.py", + "bom-ref": "5046e476d427314c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/RuleTemplates/RuleWithTable.py", "type": "file" }, { - "bom-ref": "b8412dda0dec0ed5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/RuleTemplates/BasicRuleTemplate.py", + "bom-ref": "690979dde4bffd6f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/RuleTemplates/SpeedupWithFocusMetrics.py", "type": "file" }, { - "bom-ref": "ff12409b42fb5e1d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/RuleTemplates/RuleTemplate.section", + "bom-ref": "17c61208ffaf3ead", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/python/ForumSearchTool.py", "type": "file" }, { - "bom-ref": "a964c219a8bd2562", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/RuleTemplates/RuleTemplate2_table.chart", + "bom-ref": "039bb25b20546d09", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/python/_ncu_occupancy.so", "type": "file" }, { - "bom-ref": "ceaa1ae9e216b3b3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/RuleTemplates/RuleTemplate_bar.chart", + "bom-ref": "a7c82688b781d6ac", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/python/_ncu_report.so", "type": "file" }, { - "bom-ref": "e7ba8a96905f330c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/RuleTemplates/RuleTemplate_table.chart", + "bom-ref": "a6fc4b3f599dccf1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/python/cacert.pem", "type": "file" }, { - "bom-ref": "b3e9acf91edb3a34", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/RuleTemplates/RuleWithTable.py", + "bom-ref": "7ba10b63b6ccad39", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/python/install_nsight_copilot_venv.py", "type": "file" }, { - "bom-ref": "7719e9368098f55f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/RuleTemplates/SpeedupWithFocusMetrics.py", + "bom-ref": "3226185447b0d013", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/python/ncu_occupancy.py", "type": "file" }, { - "bom-ref": "38e1cdcae0a8f2fd", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/python/ForumSearchTool.py", + "bom-ref": "f971602b66b24cda", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/python/ncu_report.py", "type": "file" }, { - "bom-ref": "51a384d0f39c43f9", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/python/_ncu_occupancy.so", + "bom-ref": "b0e69ccd33f7e5cd", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/python/nsight_copilot-0.1.0-constraints.txt", "type": "file" }, { - "bom-ref": "f283c28e1c01db89", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/python/_ncu_report.so", + "bom-ref": "cc4a9fcdd14b6dab", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/python/nsight_copilot-0.1.0-py3-none-any.whl", "type": "file" }, { - "bom-ref": "496931806c7df9b8", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/python/ncu_occupancy.py", + "bom-ref": "59b500492a4d6f1d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/instructionMix/README.TXT", "type": "file" }, { - "bom-ref": "b681e6b010d4d594", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/python/ncu_report.py", + "bom-ref": "d58a65fa0a024a53", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/instructionMix/instructionMix.cu", "type": "file" }, { - "bom-ref": "b1aac1ccfb2c7bf4", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/instructionMix/README.TXT", + "bom-ref": "75098c7353e8e602", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/instructionMix/sobelDouble.ncu-rep", "type": "file" }, { - "bom-ref": "616c24b22b5d2bbb", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/instructionMix/instructionMix.cu", + "bom-ref": "bd5c6e0ca70f0ca0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/instructionMix/sobelFloat.ncu-rep", "type": "file" }, { - "bom-ref": "110f9167bfce03f5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/instructionMix/sobelDouble.ncu-rep", + "bom-ref": "7db158339802cac3", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/interKernelCommunication/README.TXT", "type": "file" }, { - "bom-ref": "25610a528b590c62", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/instructionMix/sobelFloat.ncu-rep", + "bom-ref": "91bcb21679ff7552", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/interKernelCommunication/interKernelCommunication.cu", "type": "file" }, { - "bom-ref": "92de6e0094087e9a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/interKernelCommunication/README.TXT", + "bom-ref": "27655fd678f47ea8", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/sharedBankConflicts/README.TXT", "type": "file" }, { - "bom-ref": "b2677a1f7a6259e2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/interKernelCommunication/interKernelCommunication.cu", + "bom-ref": "02d29a20f536a423", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/sharedBankConflicts/sharedBankConflicts.cu", "type": "file" }, { - "bom-ref": "617b3294aaefe7b2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/sharedBankConflicts/README.TXT", + "bom-ref": "f447f97db3a848ea", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/sharedBankConflicts/transposeCoalesced.ncu-rep", "type": "file" }, { - "bom-ref": "347fc3896268ffb5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/sharedBankConflicts/sharedBankConflicts.cu", + "bom-ref": "6071ce3c8e06e4b1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/sharedBankConflicts/transposeNoBankConflicts.ncu-rep", "type": "file" }, { - "bom-ref": "fbfd4ee99adc726f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/sharedBankConflicts/transposeCoalesced.ncu-rep", + "bom-ref": "bda8d3703f12d0d4", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/uncoalescedGlobalAccesses/README.TXT", "type": "file" }, { - "bom-ref": "31a1efa6afe1064f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/sharedBankConflicts/transposeNoBankConflicts.ncu-rep", + "bom-ref": "70059b649dd3d296", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/uncoalescedGlobalAccesses/addConstDouble.ncu-rep", "type": "file" }, { - "bom-ref": "8a7317cc1a4b39f6", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/uncoalescedGlobalAccesses/README.TXT", + "bom-ref": "aa0ff5c343d3877c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/uncoalescedGlobalAccesses/addConstDouble3.ncu-rep", "type": "file" }, { - "bom-ref": "e4b5518eedfae58e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/uncoalescedGlobalAccesses/addConstDouble.ncu-rep", + "bom-ref": "a4edce6093a29d15", + "name": "/opt/nvidia/nsight-compute/2026.3.0/extras/samples/uncoalescedGlobalAccesses/uncoalescedGlobalAccesses.cu", "type": "file" }, { - "bom-ref": "2b33801f51278009", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/uncoalescedGlobalAccesses/addConstDouble3.ncu-rep", + "bom-ref": "5b9b7039ab1a4033", + "name": "/opt/nvidia/nsight-compute/2026.3.0/ncu", "type": "file" }, { - "bom-ref": "3683d4ff7d26406f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/extras/samples/uncoalescedGlobalAccesses/uncoalescedGlobalAccesses.cu", + "bom-ref": "78ae070907fe5210", + "name": "/opt/nvidia/nsight-compute/2026.3.0/ncu-ui", "type": "file" }, { - "bom-ref": "ebb2f306fae48c5d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/ncu", + "bom-ref": "8ce4f67a032a712c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/AchievedOccupancy.py", "type": "file" }, { - "bom-ref": "1d8f088894e87a96", - "name": "/opt/nvidia/nsight-compute/2026.1.1/ncu-ui", + "bom-ref": "ac322574db28f031", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/C2CLink.section", "type": "file" }, { - "bom-ref": "7a7820f9b8244a89", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/AchievedOccupancy.py", + "bom-ref": "e991ce1e0cb7e9e1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/CPIStall.py", "type": "file" }, { - "bom-ref": "b08b3d0c4dcb9b5c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/C2CLink.section", + "bom-ref": "cb150ef69d7d350e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/Compute.py", "type": "file" }, { - "bom-ref": "139369e61abfc3d2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/CPIStall.py", + "bom-ref": "9cebe79e709b5cfc", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/ComputeWorkloadAnalysis.section", "type": "file" }, { - "bom-ref": "6f58c496a293fb1b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/Compute.py", + "bom-ref": "1448a4635824f271", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/FPInstructions.py", "type": "file" }, { - "bom-ref": "16c81143264a37ba", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/ComputeWorkloadAnalysis.section", + "bom-ref": "2ab3a46b44f9f9af", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/HighPipeUtilization.py", "type": "file" }, { - "bom-ref": "36041ce0ff38eb35", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/FPInstructions.py", + "bom-ref": "f6f88cf11cb63768", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/InstructionStatistics.section", "type": "file" }, { - "bom-ref": "7782ac0b518568ee", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/HighPipeUtilization.py", + "bom-ref": "629f58a902f829fd", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/IssueSlotUtilization.py", "type": "file" }, { - "bom-ref": "df6d8d8701428c1f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/InstructionStatistics.section", + "bom-ref": "510b4fa50b3994a9", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/LaunchStatistics.py", "type": "file" }, { - "bom-ref": "b1141620d08e79d1", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/IssueSlotUtilization.py", + "bom-ref": "78431aa5b686c503", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/LaunchStatistics.section", "type": "file" }, { - "bom-ref": "3a8284e8bb15936c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/LaunchStatistics.py", + "bom-ref": "02fd84a8588c080a", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/LocalMemoryUsage.py", "type": "file" }, { - "bom-ref": "0a2f76c675d3a034", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/LaunchStatistics.section", + "bom-ref": "a833e77c8ee6ed03", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/Memory.py", "type": "file" }, { - "bom-ref": "abd34cbea2bc8378", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/LocalMemoryUsage.py", + "bom-ref": "89174ad48e90b1e6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/MemoryApertureUsage.py", "type": "file" }, { - "bom-ref": "a9d4815c2945f293", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/Memory.py", + "bom-ref": "e58e006c1f35c163", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/MemoryCacheAccessPattern.py", "type": "file" }, { - "bom-ref": "a1cb5e7455b4842c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/MemoryApertureUsage.py", + "bom-ref": "ea405726d2bd538f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/MemoryL2Compression.py", "type": "file" }, { - "bom-ref": "009170ad074418ed", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/MemoryCacheAccessPattern.py", + "bom-ref": "a6caf97430e38834", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/MemoryWorkloadAnalysis.section", "type": "file" }, { - "bom-ref": "422bd2bca3a94959", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/MemoryL2Compression.py", + "bom-ref": "eff0f02a0a0c4ff6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/MemoryWorkloadAnalysis_Chart.section", "type": "file" }, { - "bom-ref": "629052831e29e37a", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/MemoryWorkloadAnalysis.section", + "bom-ref": "88ad201157aa9f44", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/MemoryWorkloadAnalysis_Tables.section", "type": "file" }, { - "bom-ref": "2542fb89eedce4b1", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/MemoryWorkloadAnalysis_Chart.section", + "bom-ref": "5d4bf0b2f430924d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/MetricAggregation.py", "type": "file" }, { - "bom-ref": "2323be461b6b2902", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/MemoryWorkloadAnalysis_Tables.section", + "bom-ref": "47d5614cd8958368", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/NumaAffinity.section", "type": "file" }, { - "bom-ref": "2ad19a737ea75006", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/MetricAggregation.py", + "bom-ref": "6a2881ce22ad93b2", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/NvRules.py", "type": "file" }, { - "bom-ref": "b1f08ac885e087d4", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/NumaAffinity.section", + "bom-ref": "f5235a7e25cf7b82", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/Nvlink.section", "type": "file" }, { - "bom-ref": "3bccd7bac32ebb97", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/NvRules.py", + "bom-ref": "1457d5c3c62008e6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/Nvlink_Tables.section", "type": "file" }, { - "bom-ref": "d05eccceb4291f35", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/Nvlink.section", + "bom-ref": "98ae628bde84db6b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/Nvlink_Topology.section", "type": "file" }, { - "bom-ref": "84b6becf7693320f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/Nvlink_Tables.section", + "bom-ref": "80a5dc688567b291", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/Occupancy.section", "type": "file" }, { - "bom-ref": "7f79686b8de08d00", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/Nvlink_Topology.section", + "bom-ref": "89078e57eff5485f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/PCSamplingData.py", "type": "file" }, { - "bom-ref": "472cf6d11febc715", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/Occupancy.section", + "bom-ref": "a9f66fa48da4fca6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/PMSamplingData.py", "type": "file" }, { - "bom-ref": "9451fded98b3f016", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/PCSamplingData.py", + "bom-ref": "c5d1d37a771de0d8", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/PmSampling.section", "type": "file" }, { - "bom-ref": "5837b1fd07b9f464", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/PMSamplingData.py", + "bom-ref": "314607e5ec1ac7c0", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/RequestedMetrics.py", "type": "file" }, { - "bom-ref": "19ab381ce6293ad5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/PmSampling.section", + "bom-ref": "f6783eda110761dd", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SchedulerStatistics.section", "type": "file" }, { - "bom-ref": "4d45f7ef8e780033", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/PmSampling_WarpStates.section", + "bom-ref": "b951cb9e9e8025fd", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SharedMemoryConflicts.py", "type": "file" }, { - "bom-ref": "6e8ac8a8a974e804", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/RequestedMetrics.py", + "bom-ref": "d7fa309bca2db1cb", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SlowPipeLimiter.py", "type": "file" }, { - "bom-ref": "c68a07093f557786", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SchedulerStatistics.section", + "bom-ref": "2391498e2492a76a", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SourceCounters.section", "type": "file" }, { - "bom-ref": "8192d079ed8e1840", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SharedMemoryConflicts.py", + "bom-ref": "1b3d40369fe3432c", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SpeedOfLight.py", "type": "file" }, { - "bom-ref": "d5ab6cd9ae7e982e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SlowPipeLimiter.py", + "bom-ref": "7e0766633735ce77", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SpeedOfLight.section", "type": "file" }, { - "bom-ref": "2d01389c7211abe2", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SourceCounters.section", + "bom-ref": "813fe1ca95dce6a8", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SpeedOfLight_HierarchicalDoubleRooflineChart.section", "type": "file" }, { - "bom-ref": "040582e632061de9", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SpeedOfLight.py", + "bom-ref": "d3c192740a02c822", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SpeedOfLight_HierarchicalHalfRooflineChart.section", "type": "file" }, { - "bom-ref": "38b564719facf83b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SpeedOfLight.section", + "bom-ref": "b979febfe1d747a2", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SpeedOfLight_HierarchicalSingleRooflineChart.section", "type": "file" }, { - "bom-ref": "8541d771487c158b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SpeedOfLight_HierarchicalDoubleRooflineChart.section", + "bom-ref": "7b10e57d796c97db", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SpeedOfLight_HierarchicalTensorRooflineChart.section", "type": "file" }, { - "bom-ref": "cc54abab1c7a38ac", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SpeedOfLight_HierarchicalHalfRooflineChart.section", + "bom-ref": "0a632a1f209caf82", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SpeedOfLight_Roofline.py", "type": "file" }, { - "bom-ref": "bc0afd9c64b41415", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SpeedOfLight_HierarchicalSingleRooflineChart.section", + "bom-ref": "f08eb88ed635e026", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/SpeedOfLight_RooflineChart.section", "type": "file" }, { - "bom-ref": "6a8ed85f77218b3d", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SpeedOfLight_HierarchicalTensorRooflineChart.section", + "bom-ref": "a19fc4b6f446616d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/TableBuilder.py", "type": "file" }, { - "bom-ref": "62e5839720881dd5", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SpeedOfLight_Roofline.py", + "bom-ref": "0ce38b95498beae9", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/TheoreticalOccupancy.py", "type": "file" }, { - "bom-ref": "5d4cc566d188a7ca", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/SpeedOfLight_RooflineChart.section", + "bom-ref": "810bbf2a95c0476d", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/ThreadDivergence.py", "type": "file" }, { - "bom-ref": "f424aad6fe1a04ac", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/TableBuilder.py", + "bom-ref": "5643bf89305b31a1", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/Tile.py", "type": "file" }, { - "bom-ref": "39d895045aed7e20", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/TheoreticalOccupancy.py", + "bom-ref": "1400987ec8d07fd7", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/Tile.section", "type": "file" }, { - "bom-ref": "57327c746791549f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/ThreadDivergence.py", + "bom-ref": "567b04550a23d2b4", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/UncoalescedAccess.chart", "type": "file" }, { - "bom-ref": "eea546cf47fb3fe4", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/Tile.py", + "bom-ref": "3fdc60a8dfe5d17e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/UncoalescedAccess.py", "type": "file" }, { - "bom-ref": "ed7430234ec9a373", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/Tile.section", + "bom-ref": "c1dbb6fface186f7", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/UncoalescedSharedAccess.chart", "type": "file" }, { - "bom-ref": "7834d01e583ad9ec", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/UncoalescedAccess.chart", + "bom-ref": "37bae2178b9a684f", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/UncoalescedSharedAccess.py", "type": "file" }, { - "bom-ref": "6dae8606116b7a59", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/UncoalescedAccess.py", + "bom-ref": "34b3dfbccc60ae44", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/WarpStateStatistics.section", "type": "file" }, { - "bom-ref": "465a6702bf7c2e4b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/UncoalescedSharedAccess.chart", + "bom-ref": "1668a10d0fac8053", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/WorkloadDistribution.section", "type": "file" }, { - "bom-ref": "318ce10ea11f5f2e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/UncoalescedSharedAccess.py", + "bom-ref": "f531fefaf0d5401b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/WorkloadImbalance.py", "type": "file" }, { - "bom-ref": "ac7d62ff1cf8347e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/WarpStateStatistics.section", + "bom-ref": "332ed07ef75c1a9b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/gr10x_UTCMMA_Inference.section", "type": "file" }, { - "bom-ref": "6052014423208a66", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/WorkloadDistribution.section", + "bom-ref": "6beb6a45ff9fef1b", + "name": "/opt/nvidia/nsight-compute/2026.3.0/sections/gr10x_UTCMMA_Training.section", "type": "file" }, { - "bom-ref": "381e7e639738729e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/sections/WorkloadImbalance.py", + "bom-ref": "4c7817834bfe1049", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/TreeLauncherSubreaper", "type": "file" }, { - "bom-ref": "f224831bb4ad5b88", - "name": "/opt/nvidia/nsight-compute/2026.1.1/target/linux-desktop-glibc_2_11_3-x64/TreeLauncherSubreaper", + "bom-ref": "fac714da857865c6", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/TreeLauncherTargetLdPreloadHelper", "type": "file" }, { - "bom-ref": "c2f840aa04ddb2b3", - "name": "/opt/nvidia/nsight-compute/2026.1.1/target/linux-desktop-glibc_2_11_3-x64/TreeLauncherTargetLdPreloadHelper", + "bom-ref": "da13c2dbc998cb07", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/libInterceptorInjectionTarget.so", "type": "file" }, { - "bom-ref": "a8e704741845f20c", - "name": "/opt/nvidia/nsight-compute/2026.1.1/target/linux-desktop-glibc_2_11_3-x64/libInterceptorInjectionTarget.so", + "bom-ref": "09dcd1940eeda94e", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/libTreeLauncherPlaceholder.so", "type": "file" }, { - "bom-ref": "45ed17ce40eb535e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/target/linux-desktop-glibc_2_11_3-x64/libTreeLauncherPlaceholder.so", + "bom-ref": "13792794c3d0d2d8", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/libTreeLauncherTargetInjection.so", "type": "file" }, { - "bom-ref": "a160dd5425a2ad83", - "name": "/opt/nvidia/nsight-compute/2026.1.1/target/linux-desktop-glibc_2_11_3-x64/libTreeLauncherTargetInjection.so", + "bom-ref": "13eeff85ce337e37", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/libTreeLauncherTargetUpdatePreloadInjection.so", "type": "file" }, { - "bom-ref": "44f8ad80f07a21a1", - "name": "/opt/nvidia/nsight-compute/2026.1.1/target/linux-desktop-glibc_2_11_3-x64/libTreeLauncherTargetUpdatePreloadInjection.so", + "bom-ref": "b7ab72f3df1178f2", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/libcuda-injection.so", "type": "file" }, { - "bom-ref": "9ab3250c99047ac9", - "name": "/opt/nvidia/nsight-compute/2026.1.1/target/linux-desktop-glibc_2_11_3-x64/libcuda-injection.so", + "bom-ref": "37834bbaee2ae115", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/libnvperf_host.so", "type": "file" }, { - "bom-ref": "59675a66ed826e0e", - "name": "/opt/nvidia/nsight-compute/2026.1.1/target/linux-desktop-glibc_2_11_3-x64/libnvperf_host.so", + "bom-ref": "f9a6abb732ff1495", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/libnvperf_target.so", "type": "file" }, { - "bom-ref": "a0607222a4ecf08b", - "name": "/opt/nvidia/nsight-compute/2026.1.1/target/linux-desktop-glibc_2_11_3-x64/libnvperf_target.so", + "bom-ref": "f69551eddd8b0305", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/ncu", "type": "file" }, { - "bom-ref": "b9dabecde3b9461f", - "name": "/opt/nvidia/nsight-compute/2026.1.1/target/linux-desktop-glibc_2_11_3-x64/ncu", + "bom-ref": "c6dcd1967d83b486", + "name": "/opt/nvidia/nsight-compute/2026.3.0/target/linux-desktop-glibc_2_11_3-x64/nv-system-info-collector", "type": "file" }, { - "bom-ref": "a72b5c9d58becb0d", + "bom-ref": "b702ac8e324767a7", "name": "/opt/pytorch/ao/torchao.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "c1c87a4b1149292c", + "bom-ref": "ca5efc00eff03ac2", "name": "/opt/pytorch/ao/torchao.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "c7d9966ef9bce4c9", - "name": "/opt/pytorch/fuser/python/nvfuser.egg-info/PKG-INFO", - "type": "file" - }, - { - "bom-ref": "739f644ed01fe1b9", - "name": "/opt/pytorch/fuser/python/nvfuser.egg-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "5cb1f7b19f5d5f5b", - "name": "/opt/pytorch/fuser/third_party/flatbuffers/android/gradle/wrapper/gradle-wrapper.jar", - "type": "file" - }, - { - "bom-ref": "b609bdacc78d651e", - "name": "/opt/pytorch/fuser/third_party/flatbuffers/grpc/examples/ts/greeter/package.json", - "type": "file" - }, - { - "bom-ref": "f2ed999916706889", - "name": "/opt/pytorch/fuser/third_party/flatbuffers/kotlin/gradle/wrapper/gradle-wrapper.jar", - "type": "file" - }, - { - "bom-ref": "bb2ad34955b5eabf", - "name": "/opt/pytorch/fuser/third_party/flatbuffers/package.json", - "type": "file" - }, - { - "bom-ref": "9d7ba3d1cd607d9d", - "name": "/opt/pytorch/fuser/third_party/flatbuffers/snap/snapcraft.yaml", - "type": "file" - }, - { - "bom-ref": "45cec7ab6a1d2634", + "bom-ref": "872162b241d41c64", "name": "/opt/pytorch/pytorch/android/gradle/wrapper/gradle-wrapper.jar", "type": "file" }, { - "bom-ref": "869635299be0e07a", + "bom-ref": "5e46254a7d34b17a", "name": "/opt/pytorch/pytorch/android/libs/fbjni/gradle/wrapper/gradle-wrapper.jar", "type": "file" }, { - "bom-ref": "02b657eefe55bfc5", + "bom-ref": "1eff392294c40f59", "name": "/opt/pytorch/pytorch/third_party/VulkanMemoryAllocator/bin/VmaSample_Release_vs2022.exe", "type": "file" }, { - "bom-ref": "b22f35372759a519", + "bom-ref": "0a7fa187f15590e5", "name": "/opt/pytorch/pytorch/third_party/fbgemm/external/asmjit/db/package.json", "type": "file" }, { - "bom-ref": "9ccf7b3e2c9d4092", + "bom-ref": "d0898f7dfcf663f6", "name": "/opt/pytorch/pytorch/third_party/flatbuffers/android/gradle/wrapper/gradle-wrapper.jar", "type": "file" }, { - "bom-ref": "2513d471a8233978", + "bom-ref": "73ab5710830ccd70", "name": "/opt/pytorch/pytorch/third_party/flatbuffers/grpc/examples/ts/greeter/package.json", "type": "file" }, { - "bom-ref": "e60777e906b889a4", + "bom-ref": "53af389e961c4430", "name": "/opt/pytorch/pytorch/third_party/flatbuffers/kotlin/gradle/wrapper/gradle-wrapper.jar", "type": "file" }, { - "bom-ref": "2c7a25d3549a4840", + "bom-ref": "57b87d9614761e90", "name": "/opt/pytorch/pytorch/third_party/flatbuffers/package.json", "type": "file" }, { - "bom-ref": "19bee707a9877ccd", + "bom-ref": "13154fff5cb4f0e1", "name": "/opt/pytorch/pytorch/third_party/flatbuffers/snap/snapcraft.yaml", "type": "file" }, { - "bom-ref": "ac1cc97d80f730cc", + "bom-ref": "d36eb36249c3a808", "name": "/opt/pytorch/pytorch/third_party/flatbuffers/tests/ts/bazel_repository_test_dir/package.json", "type": "file" }, { - "bom-ref": "3c2e680b355c1466", + "bom-ref": "3c25ea5ae9e998ea", "name": "/opt/pytorch/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.5.2/debugger/package.json", "type": "file" }, { - "bom-ref": "5d895e663e501c21", + "bom-ref": "402e61e7d99b3c5d", "name": "/opt/pytorch/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.8.0/debugger/package.json", "type": "file" }, { - "bom-ref": "650c422c1e323b85", + "bom-ref": "b3fd914a6a79f135", "name": "/opt/pytorch/pytorch/third_party/mimalloc/bin/mimalloc-redirect-arm64.dll", "type": "file" }, { - "bom-ref": "0816a42ca1db03f0", + "bom-ref": "60c860ddf4f4b544", "name": "/opt/pytorch/pytorch/third_party/mimalloc/bin/mimalloc-redirect-arm64ec.dll", "type": "file" }, { - "bom-ref": "0d389666dfcaa0f0", + "bom-ref": "2c8c3183c0527868", "name": "/opt/pytorch/pytorch/third_party/mimalloc/bin/mimalloc-redirect.dll", "type": "file" }, { - "bom-ref": "6971f301beea0a40", + "bom-ref": "0dced9a248146140", "name": "/opt/pytorch/pytorch/third_party/mimalloc/bin/mimalloc-redirect32.dll", "type": "file" }, { - "bom-ref": "15d46cc7948cdedb", + "bom-ref": "b0ada23f2e2e188b", "name": "/opt/pytorch/pytorch/third_party/mimalloc/bin/minject-arm64.exe", "type": "file" }, { - "bom-ref": "f705bf49a07ba70b", + "bom-ref": "753d2dc0842393eb", "name": "/opt/pytorch/pytorch/third_party/mimalloc/bin/minject.exe", "type": "file" }, { - "bom-ref": "cc7d0b627848c8b6", + "bom-ref": "b2c1165c4abb6d76", "name": "/opt/pytorch/pytorch/third_party/mimalloc/bin/minject32.exe", "type": "file" }, { - "bom-ref": "ed184a2e4671db05", + "bom-ref": "5fba1d095435802f", "name": "/opt/pytorch/pytorch/third_party/onnx/onnx.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "f3c0204c8899dab2", + "bom-ref": "a521aafd21ba66ec", "name": "/opt/pytorch/pytorch/third_party/onnx/onnx.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "b1d46c99957dd414", - "name": "/opt/pytorch/pytorch/third_party/protobuf/js/package.json", - "type": "file" - }, - { - "bom-ref": "43a28dfda1c2d128", + "bom-ref": "adb21b8c0ef645b9", "name": "/opt/pytorch/torch_tensorrt/.github/actions/assigner/package.json", "type": "file" }, { - "bom-ref": "7351c5e6935a09fb", + "bom-ref": "9c2127d4ac810de5", "name": "/opt/pytorch/torchtitan/torchtitan.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "fafa8de2ea916ed9", + "bom-ref": "2117921d35006d1f", "name": "/opt/pytorch/torchtitan/torchtitan.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "ebab556075043d6e", + "bom-ref": "156ecad30962309c", "name": "/usr/bin/[", "type": "file" }, { - "bom-ref": "072534238de65329", + "bom-ref": "1640a335b4f29c63", "name": "/usr/bin/aclocal-1.16", "type": "file" }, { - "bom-ref": "dc0c0a12085b3383", + "bom-ref": "913707c45568546d", "name": "/usr/bin/acyclic", "type": "file" }, { - "bom-ref": "b8ac3c3ce1519152", + "bom-ref": "709cda32a9190b0c", "name": "/usr/bin/addpart", "type": "file" }, { - "bom-ref": "88b7466d42eddbc3", + "bom-ref": "85c17f82d2810e35", "name": "/usr/bin/apt", "type": "file" }, { - "bom-ref": "b1f0b716ca32a3b4", + "bom-ref": "08b640e539dfa03a", "name": "/usr/bin/apt-cache", "type": "file" }, { - "bom-ref": "07d528b4d2d71484", + "bom-ref": "d0c0cc3845d9e2d2", "name": "/usr/bin/apt-cdrom", "type": "file" }, { - "bom-ref": "9c68074cf998b67c", + "bom-ref": "01851bb819ac0dfe", "name": "/usr/bin/apt-config", "type": "file" }, { - "bom-ref": "c9e2f1b78a361211", + "bom-ref": "ad6aa713bfc94370", "name": "/usr/bin/apt-extracttemplates", "type": "file" }, { - "bom-ref": "066eeb4caab5c615", + "bom-ref": "454e531dae4720c0", "name": "/usr/bin/apt-ftparchive", "type": "file" }, { - "bom-ref": "2b8ddaf5f7f91d86", + "bom-ref": "6bf0eb272657fe98", "name": "/usr/bin/apt-get", "type": "file" }, { - "bom-ref": "10357bc4b30ecd7f", + "bom-ref": "667e1f36ed015f51", "name": "/usr/bin/apt-key", "type": "file" }, { - "bom-ref": "55739f93da04c1cc", + "bom-ref": "500b48df207b8e4e", "name": "/usr/bin/apt-mark", "type": "file" }, { - "bom-ref": "5f335090a3b28b4b", + "bom-ref": "a16b72e52aaf4962", "name": "/usr/bin/apt-sortpkgs", "type": "file" }, { - "bom-ref": "5179c2de058206a1", + "bom-ref": "8911e335f5afcfbf", "name": "/usr/bin/arch", "type": "file" }, { - "bom-ref": "a7ed860be00537c7", + "bom-ref": "5c39bb140e8e9db1", "name": "/usr/bin/asan_symbolize-18", "type": "file" }, { - "bom-ref": "b6182c0ea8c18f83", + "bom-ref": "1812a35d4cc7ff39", "name": "/usr/bin/autoconf", "type": "file" }, { - "bom-ref": "94d92d4cbda39351", + "bom-ref": "f802055588106f23", "name": "/usr/bin/autoheader", "type": "file" }, { - "bom-ref": "a35c868c6f7e09f1", + "bom-ref": "236dee878d273607", "name": "/usr/bin/autom4te", "type": "file" }, { - "bom-ref": "148a949760c39203", + "bom-ref": "5ad267f739e1807d", "name": "/usr/bin/automake-1.16", "type": "file" }, { - "bom-ref": "a9b18001eefd56f3", + "bom-ref": "f8b3a4f435cb5299", "name": "/usr/bin/autoreconf", "type": "file" }, { - "bom-ref": "ee4aa003edec91f2", + "bom-ref": "29652123c5cc33a4", "name": "/usr/bin/autoscan", "type": "file" }, { - "bom-ref": "bec4bd9cb59554cc", + "bom-ref": "ad9d047db3f52242", "name": "/usr/bin/autoupdate", "type": "file" }, { - "bom-ref": "9c1878145dddea22", + "bom-ref": "7ad3f96f88b68758", "name": "/usr/bin/b2sum", "type": "file" }, { - "bom-ref": "7cb105ce42871422", + "bom-ref": "6f845cb2b64cffa0", "name": "/usr/bin/base32", "type": "file" }, { - "bom-ref": "c97cf9a6f76c90b5", + "bom-ref": "4699f9e8dc0cdbc3", "name": "/usr/bin/base64", "type": "file" }, { - "bom-ref": "f6f1de91bc2ecb49", + "bom-ref": "108831f079946fe3", "name": "/usr/bin/basename", "type": "file" }, { - "bom-ref": "aac65e674eaa1305", + "bom-ref": "1469cfd9a30d97eb", "name": "/usr/bin/basenc", "type": "file" }, { - "bom-ref": "740c22d5303647f9", + "bom-ref": "6fed42ee7a9305cf", "name": "/usr/bin/bash", "type": "file" }, { - "bom-ref": "167a76437bb6dec5", + "bom-ref": "d9bb81f9a5422baf", "name": "/usr/bin/bashbug", "type": "file" }, { - "bom-ref": "bd74db3e2081ee5b", + "bom-ref": "81c61e8d83c9b2a9", "name": "/usr/bin/bcomps", "type": "file" }, { - "bom-ref": "4c61aa0640f72711", + "bom-ref": "eda3954801bbff08", "name": "/usr/bin/bunzip2", "type": "file" }, { - "bom-ref": "eb32ce9b9fe7aa7e", + "bom-ref": "abbb1a4a2276841b", "name": "/usr/bin/bzcat", "type": "file" }, { - "bom-ref": "3e72a9120b2321ff", + "bom-ref": "288c8e3a5f333826", "name": "/usr/bin/bzdiff", "type": "file" }, { - "bom-ref": "a8baf1808203a21f", + "bom-ref": "96bc4a8fb6874a02", "name": "/usr/bin/bzexe", "type": "file" }, { - "bom-ref": "1cb2ceaaaff84f38", + "bom-ref": "534dd050829529d1", "name": "/usr/bin/bzgrep", "type": "file" }, { - "bom-ref": "f58f66b387440626", + "bom-ref": "bbb74886429cfb0b", "name": "/usr/bin/bzip2", "type": "file" }, { - "bom-ref": "d8b3f1d635861931", + "bom-ref": "480b1c85bdbccb14", "name": "/usr/bin/bzip2recover", "type": "file" }, { - "bom-ref": "102257a9a2a8c028", + "bom-ref": "c45564c271221275", "name": "/usr/bin/bzmore", "type": "file" }, { - "bom-ref": "61d2e49774ecde06", + "bom-ref": "e976ad7d84dc34c3", "name": "/usr/bin/c89-gcc", "type": "file" }, { - "bom-ref": "572fdbcc5cfb3d7b", + "bom-ref": "46ca6c9710ce5e12", "name": "/usr/bin/c99-gcc", "type": "file" }, { - "bom-ref": "265080d72d448d70", + "bom-ref": "b04cf719f3e904a6", "name": "/usr/bin/c_rehash", "type": "file" }, { - "bom-ref": "f622e0ad913cfbee", + "bom-ref": "42f3db521d48f280", "name": "/usr/bin/cat", "type": "file" }, { - "bom-ref": "b2f1e5dbcf0a5fb5", + "bom-ref": "30367e6f32764caf", "name": "/usr/bin/ccache", "type": "file" }, { - "bom-ref": "53e88cd08380c02e", + "bom-ref": "16a36dbb460219ec", "name": "/usr/bin/ccomps", "type": "file" }, { - "bom-ref": "4a30e6216200d84b", + "bom-ref": "7152b2b5081a0d01", "name": "/usr/bin/chage", "type": "file" }, { - "bom-ref": "c7a954b767a7d875", + "bom-ref": "8a8204a8fb49a4bf", "name": "/usr/bin/chattr", "type": "file" }, { - "bom-ref": "72e0cee18672df57", + "bom-ref": "9737232b303b0915", "name": "/usr/bin/chcon", "type": "file" }, { - "bom-ref": "a0551a2d1990fb24", + "bom-ref": "c21ffa4ae0deaf3e", "name": "/usr/bin/chfn", "type": "file" }, { - "bom-ref": "10084a33414dde4e", + "bom-ref": "60b8cf1ab4fadff4", "name": "/usr/bin/chgrp", "type": "file" }, { - "bom-ref": "4ba1ea97899b51fc", + "bom-ref": "f8e8e73d7e7f5aa6", "name": "/usr/bin/chmod", "type": "file" }, { - "bom-ref": "5ee8af3421a2f0da", + "bom-ref": "56ce2b7693cdbdd4", "name": "/usr/bin/choom", "type": "file" }, { - "bom-ref": "bc6ca98f5d85de5a", + "bom-ref": "f7adc27b90668994", "name": "/usr/bin/chown", "type": "file" }, { - "bom-ref": "b70521788a064c50", + "bom-ref": "47f176ccb0ec3bd6", "name": "/usr/bin/chrt", "type": "file" }, { - "bom-ref": "b1eed58e7515e543", + "bom-ref": "c489957b4458d6dd", "name": "/usr/bin/chsh", "type": "file" }, { - "bom-ref": "b4b9ec7df4d71c6d", + "bom-ref": "25a2406aff5661df", "name": "/usr/bin/cksum", "type": "file" }, { - "bom-ref": "6dd9aa35a664548b", + "bom-ref": "dbc613f277c8ff65", "name": "/usr/bin/clear", "type": "file" }, { - "bom-ref": "541651effb35931d", + "bom-ref": "0164f20496d6e47f", "name": "/usr/bin/clear_console", "type": "file" }, { - "bom-ref": "df52a722389df164", + "bom-ref": "c92b42f5371ce8aa", "name": "/usr/bin/cluster", "type": "file" }, { - "bom-ref": "2fd287bcb36258dd", + "bom-ref": "bb0a8cd2c1a24c37", "name": "/usr/bin/cmp", "type": "file" }, { - "bom-ref": "2c989e5397fabbfc", + "bom-ref": "497c2ad66fb09256", "name": "/usr/bin/comm", "type": "file" }, { - "bom-ref": "0631cf811d53d867", + "bom-ref": "7d1a9f9788487a05", "name": "/usr/bin/compile_et", "type": "file" }, { - "bom-ref": "6c03c11cbfaba476", + "bom-ref": "0760d707276a41d7", "name": "/usr/bin/corelist", "type": "file" }, { - "bom-ref": "28bf8985adc3dca0", + "bom-ref": "c28ba2acfdea1fb6", "name": "/usr/bin/cp", "type": "file" }, { - "bom-ref": "323418c26ceafaa5", + "bom-ref": "a79cb6cb918e5370", "name": "/usr/bin/cpan", "type": "file" }, { - "bom-ref": "fcb756e78c7ff8aa", + "bom-ref": "cb9ef707eb54c883", "name": "/usr/bin/cpan5.38-x86_64-linux-gnu", "type": "file" }, { - "bom-ref": "0283ed8d532ab0e1", + "bom-ref": "7e5c17be1a6d9ca3", "name": "/usr/bin/csplit", "type": "file" }, { - "bom-ref": "230e471dece95686", + "bom-ref": "a873f6cb43db5ccc", "name": "/usr/bin/curl", "type": "file" }, { - "bom-ref": "1546f23a2e45233f", + "bom-ref": "f859b3c69847c6cd", "name": "/usr/bin/cut", "type": "file" }, { - "bom-ref": "1e60b2bbc0c148ac", + "bom-ref": "7bdf6e9758891a9e", "name": "/usr/bin/dash", "type": "file" }, { - "bom-ref": "0bc219b73e020080", + "bom-ref": "8a38a811cd4372c6", "name": "/usr/bin/date", "type": "file" }, { - "bom-ref": "2121b86b0e29a40d", + "bom-ref": "6a675c90ead5c9eb", "name": "/usr/bin/dd", "type": "file" }, { - "bom-ref": "dbabb90708dda698", + "bom-ref": "55a5b411aaea905e", "name": "/usr/bin/deb-systemd-helper", "type": "file" }, { - "bom-ref": "006c25442b5d593e", + "bom-ref": "5e825a5c2c891754", "name": "/usr/bin/deb-systemd-invoke", "type": "file" }, { - "bom-ref": "0ac8b2040f7a31e0", + "bom-ref": "dbc70a19456d665a", "name": "/usr/bin/debconf", "type": "file" }, { - "bom-ref": "66f39ca501845403", + "bom-ref": "b4452907e05c9fb5", "name": "/usr/bin/debconf-apt-progress", "type": "file" }, { - "bom-ref": "1decb23403036497", + "bom-ref": "7604cae4f9a85521", "name": "/usr/bin/debconf-communicate", "type": "file" }, { - "bom-ref": "95b79d505a3decca", + "bom-ref": "6b1d111b46fb8684", "name": "/usr/bin/debconf-copydb", "type": "file" }, { - "bom-ref": "86b07f17e41b973d", + "bom-ref": "4d92e216b6eb6707", "name": "/usr/bin/debconf-escape", "type": "file" }, { - "bom-ref": "931f308ea4499a0b", + "bom-ref": "8862f1b24693145d", "name": "/usr/bin/debconf-set-selections", "type": "file" }, { - "bom-ref": "72204d2c6ffd6a1e", + "bom-ref": "fcdb29e2e4390d5c", "name": "/usr/bin/debconf-show", "type": "file" }, { - "bom-ref": "655f2911ac0b08b3", + "bom-ref": "9cbca6e997c5a8e1", "name": "/usr/bin/delpart", "type": "file" }, { - "bom-ref": "604222ce72b89315", + "bom-ref": "6c3e6a6346ba20ef", "name": "/usr/bin/derb", "type": "file" }, { - "bom-ref": "44a273f8aefaebfb", + "bom-ref": "e5b8b2a8cc572a25", "name": "/usr/bin/df", "type": "file" }, { - "bom-ref": "407883b9bc2ade28", + "bom-ref": "b09f83f5051b9efe", "name": "/usr/bin/dh_autotools-dev_restoreconfig", "type": "file" }, { - "bom-ref": "194003484cdfc4ad", + "bom-ref": "f6f7c375f99d0497", "name": "/usr/bin/dh_autotools-dev_updateconfig", "type": "file" }, { - "bom-ref": "b7b670f25dd8e0da", - "name": "/usr/bin/dh_installxmlcatalogs", - "type": "file" - }, - { - "bom-ref": "ec296d0742d0b023", + "bom-ref": "f38b97092cce5655", "name": "/usr/bin/diff", "type": "file" }, { - "bom-ref": "93851e18cb93cf8e", + "bom-ref": "e04891b685af9f70", "name": "/usr/bin/diff3", "type": "file" }, { - "bom-ref": "36cf3c6afd61308b", + "bom-ref": "fc46cb5141a0d4bd", "name": "/usr/bin/diffimg", "type": "file" }, { - "bom-ref": "c19fcccf7e7371c2", + "bom-ref": "67f85c1a1bf22970", "name": "/usr/bin/dijkstra", "type": "file" }, { - "bom-ref": "5cb8ef50037088d9", + "bom-ref": "85a730e934ba908f", "name": "/usr/bin/dir", "type": "file" }, { - "bom-ref": "84b70a67a9a00cc2", + "bom-ref": "b72cd31dcd277dbc", "name": "/usr/bin/dircolors", "type": "file" }, { - "bom-ref": "1fa0656fae39eb5c", + "bom-ref": "a812f90f5fa2a1ff", "name": "/usr/bin/dirmngr", "type": "file" }, { - "bom-ref": "d8b27645c562161b", + "bom-ref": "f02dbed933f9d1c8", "name": "/usr/bin/dirmngr-client", "type": "file" }, { - "bom-ref": "2b3428e596924f63", + "bom-ref": "f0419c0e4cf9344d", "name": "/usr/bin/dirname", "type": "file" }, { - "bom-ref": "ad615d22e27a6006", + "bom-ref": "af83074dacd1625c", "name": "/usr/bin/dmesg", "type": "file" }, { - "bom-ref": "cbbc15eab9caa59a", + "bom-ref": "ed2211817e3f14e4", "name": "/usr/bin/dot_builtins", "type": "file" }, { - "bom-ref": "e02dac16b80f110f", + "bom-ref": "927c053bb87217ed", "name": "/usr/bin/dotty", "type": "file" }, { - "bom-ref": "2c228fceae119fdc", + "bom-ref": "e96d39c896d42c6b", "name": "/usr/bin/dpkg", "type": "file" }, { - "bom-ref": "1fab631725134b07", + "bom-ref": "c7cf80d16fa611e6", "name": "/usr/bin/dpkg-architecture", "type": "file" }, { - "bom-ref": "cd46d098f1c95f40", + "bom-ref": "9d6404f0f71dfc79", "name": "/usr/bin/dpkg-buildapi", "type": "file" }, { - "bom-ref": "7cd70ac35d452fd7", + "bom-ref": "657943b92255211e", "name": "/usr/bin/dpkg-buildflags", "type": "file" }, { - "bom-ref": "f0f780ffaeba8286", + "bom-ref": "60f108ee0ba8d5d7", "name": "/usr/bin/dpkg-buildpackage", "type": "file" }, { - "bom-ref": "29c1b035c14c4868", + "bom-ref": "3fae9600a2ecb699", "name": "/usr/bin/dpkg-buildtree", "type": "file" }, { - "bom-ref": "95c1bec3b1e070ae", + "bom-ref": "dc2ee56ba9065c4f", "name": "/usr/bin/dpkg-checkbuilddeps", "type": "file" }, { - "bom-ref": "bec2910669ab524d", + "bom-ref": "2cb4c56bf5d87e36", "name": "/usr/bin/dpkg-deb", "type": "file" }, { - "bom-ref": "ead9c50cdf1150f9", + "bom-ref": "06f77fe95ccea450", "name": "/usr/bin/dpkg-distaddfile", "type": "file" }, { - "bom-ref": "e8c4fcb4fb4cc94e", + "bom-ref": "0784703118725441", "name": "/usr/bin/dpkg-divert", "type": "file" }, { - "bom-ref": "b58011f64dcee297", + "bom-ref": "3dcf91d7f5b7c00a", "name": "/usr/bin/dpkg-genbuildinfo", "type": "file" }, { - "bom-ref": "dd17211a23d1b973", + "bom-ref": "98ee6118c4ad547a", "name": "/usr/bin/dpkg-genchanges", "type": "file" }, { - "bom-ref": "689de36a35397bf0", + "bom-ref": "c55f0b0c054fe5f9", "name": "/usr/bin/dpkg-gencontrol", "type": "file" }, { - "bom-ref": "ef1dbb9826477949", + "bom-ref": "34dfc75fbccb2d28", "name": "/usr/bin/dpkg-gensymbols", "type": "file" }, { - "bom-ref": "cfcf120f9e7fca97", + "bom-ref": "682a35956532c024", "name": "/usr/bin/dpkg-maintscript-helper", "type": "file" }, { - "bom-ref": "550857a6997366d6", + "bom-ref": "ed1547ad1bbd612f", "name": "/usr/bin/dpkg-mergechangelogs", "type": "file" }, { - "bom-ref": "6567c14412185067", + "bom-ref": "0394b41d3b5e5a7e", "name": "/usr/bin/dpkg-name", "type": "file" }, { - "bom-ref": "b124be8193eb0575", + "bom-ref": "8cffacfb7bf4f8e8", "name": "/usr/bin/dpkg-parsechangelog", "type": "file" }, { - "bom-ref": "054a3e1a1beaed2d", + "bom-ref": "ab527ff5f8919eee", "name": "/usr/bin/dpkg-query", "type": "file" }, { - "bom-ref": "0e825708cc613e36", + "bom-ref": "698890a1ec6605c9", "name": "/usr/bin/dpkg-realpath", "type": "file" }, { - "bom-ref": "4780e5d7b9757e71", + "bom-ref": "ab876f2eb5538b04", "name": "/usr/bin/dpkg-scanpackages", "type": "file" }, { - "bom-ref": "c87e604848596a93", + "bom-ref": "775b4d1a805c78fa", "name": "/usr/bin/dpkg-scansources", "type": "file" }, { - "bom-ref": "217363c834ebf985", + "bom-ref": "6db15c57e51d7850", "name": "/usr/bin/dpkg-shlibdeps", "type": "file" }, { - "bom-ref": "e26c2b74a71945d2", + "bom-ref": "c35858f838944ef3", "name": "/usr/bin/dpkg-source", "type": "file" }, { - "bom-ref": "29a6512ed0259222", + "bom-ref": "d489ff262b863941", "name": "/usr/bin/dpkg-split", "type": "file" }, { - "bom-ref": "4ebdeb7d3756fa9c", + "bom-ref": "e6f76b044b1500b3", "name": "/usr/bin/dpkg-statoverride", "type": "file" }, { - "bom-ref": "b2c0423bc9e363ae", + "bom-ref": "e66a302445cf35b1", "name": "/usr/bin/dpkg-trigger", "type": "file" }, { - "bom-ref": "50283d7ae5e19b69", + "bom-ref": "52f78d8afa22ed90", "name": "/usr/bin/dpkg-vendor", "type": "file" }, { - "bom-ref": "3ac8784c28f36313", + "bom-ref": "00e5c64511cacc19", "name": "/usr/bin/du", "type": "file" }, { - "bom-ref": "a3b06ca54a8c4fc1", + "bom-ref": "8f3716f12f9a3b6f", "name": "/usr/bin/echo", "type": "file" }, { - "bom-ref": "52de8b2d7f4ce1c3", + "bom-ref": "3d271962fe927315", "name": "/usr/bin/edgepaint", "type": "file" }, { - "bom-ref": "e301ef46f9ca072d", + "bom-ref": "fa8ca21f7c1452c7", "name": "/usr/bin/egrep", "type": "file" }, { - "bom-ref": "365564ada7c7b71a", + "bom-ref": "7080c6da2d570b8b", "name": "/usr/bin/enc2xs", "type": "file" }, { - "bom-ref": "2a698f96fe42eceb", + "bom-ref": "c039ea94c84bf67a", "name": "/usr/bin/encguess", "type": "file" }, { - "bom-ref": "af5dbd4c41810518", + "bom-ref": "6ccac63bfcd151fa", "name": "/usr/bin/env", "type": "file" }, { - "bom-ref": "bfe06b87bef4246f", + "bom-ref": "50b159d284c129e9", "name": "/usr/bin/expand", "type": "file" }, { - "bom-ref": "24b4545c475167f5", + "bom-ref": "9d97e6c2b167fc67", "name": "/usr/bin/expiry", "type": "file" }, { - "bom-ref": "437b0f1274bac8af", + "bom-ref": "b2279ede264e7149", "name": "/usr/bin/expr", "type": "file" }, { - "bom-ref": "764240395fefbc78", + "bom-ref": "20a74f634154e272", "name": "/usr/bin/factor", "type": "file" }, { - "bom-ref": "5da585fc2b710dd8", + "bom-ref": "a3cc0251523d23a6", "name": "/usr/bin/faillog", "type": "file" }, { - "bom-ref": "e76c65be61aa2e34", + "bom-ref": "77985a471d24859a", "name": "/usr/bin/fallocate", "type": "file" }, { - "bom-ref": "7619d3b96e9cfa3e", + "bom-ref": "7e5cda4e5afe19d0", "name": "/usr/bin/false", "type": "file" }, { - "bom-ref": "6db8f8f051faad72", + "bom-ref": "bed022bed021a3f8", "name": "/usr/bin/fc-cache", "type": "file" }, { - "bom-ref": "14f6885eab7945aa", + "bom-ref": "8dff030f8fe3fc48", "name": "/usr/bin/fc-cat", "type": "file" }, { - "bom-ref": "5f7748a1f42fc422", + "bom-ref": "ebce316d5b4f88f8", "name": "/usr/bin/fc-conflist", "type": "file" }, { - "bom-ref": "90805416428ef642", + "bom-ref": "f5229432d402e210", "name": "/usr/bin/fc-list", "type": "file" }, { - "bom-ref": "f3c52295c026cf30", + "bom-ref": "32f0e9caf992f2fa", "name": "/usr/bin/fc-match", "type": "file" }, { - "bom-ref": "6b3069c8c6bf5c7a", + "bom-ref": "981ce1d042f293cc", "name": "/usr/bin/fc-pattern", "type": "file" }, { - "bom-ref": "8a9dd9cc32fddd78", + "bom-ref": "b11e07481eea961a", "name": "/usr/bin/fc-query", "type": "file" }, { - "bom-ref": "32375e8c72bef461", + "bom-ref": "7a5ad7f46537521b", "name": "/usr/bin/fc-scan", "type": "file" }, { - "bom-ref": "b3a6d4c3616acf5f", + "bom-ref": "e2ccd9ccc59730e9", "name": "/usr/bin/fc-validate", "type": "file" }, { - "bom-ref": "2f0bfd0402514426", + "bom-ref": "d20d42fe8351bdb0", "name": "/usr/bin/fgrep", "type": "file" }, { - "bom-ref": "5fe679cba8e83de9", + "bom-ref": "87bd2a241ebcca93", "name": "/usr/bin/file", "type": "file" }, { - "bom-ref": "b5687976e1c99622", + "bom-ref": "a1aa31bee3d23ec8", "name": "/usr/bin/find", "type": "file" }, { - "bom-ref": "5bcd65e7790645b1", + "bom-ref": "f462c761696fed0f", "name": "/usr/bin/findmnt", "type": "file" }, { - "bom-ref": "c56cf1642039a616", + "bom-ref": "f01a75a474addd10", "name": "/usr/bin/flock", "type": "file" }, { - "bom-ref": "22fe90af14dbf129", + "bom-ref": "8978b4f789ce9953", "name": "/usr/bin/fmt", "type": "file" }, { - "bom-ref": "27b5573c7e76e40a", + "bom-ref": "a1edc91e94b060e0", "name": "/usr/bin/fold", "type": "file" }, { - "bom-ref": "bcda6ced634446b7", + "bom-ref": "78283158972cbfe1", "name": "/usr/bin/free", "type": "file" }, { - "bom-ref": "172476aae6925dcc", + "bom-ref": "5781b296338965f9", "name": "/usr/bin/funzip", "type": "file" }, { - "bom-ref": "168237203cebbf28", + "bom-ref": "6c4950d78f3470a6", "name": "/usr/bin/gc", "type": "file" }, { - "bom-ref": "8276ace9974e1503", + "bom-ref": "724ff1ef8a24ffa9", "name": "/usr/bin/gcore", "type": "file" }, { - "bom-ref": "ed7313b3830b1e97", + "bom-ref": "099258f83fdaa831", "name": "/usr/bin/gdb", "type": "file" }, { - "bom-ref": "8c8e49e3cfd69b15", + "bom-ref": "7887556b8946bf2b", "name": "/usr/bin/gdb-add-index", "type": "file" }, { - "bom-ref": "b6a54bac190011b0", + "bom-ref": "416150c0072ffc86", "name": "/usr/bin/gdbtui", "type": "file" }, { - "bom-ref": "f88c2581ee0b106a", + "bom-ref": "0c567f887166a1c0", "name": "/usr/bin/genbrk", "type": "file" }, { - "bom-ref": "88844a778d8f3d1d", + "bom-ref": "f05a4d9718d75557", "name": "/usr/bin/gencat", "type": "file" }, { - "bom-ref": "91b2153eef4bb245", + "bom-ref": "e8a2a115cb412543", "name": "/usr/bin/gencfu", "type": "file" }, { - "bom-ref": "8eaa8fa467dc29de", + "bom-ref": "7d7a57b09b72aeb8", "name": "/usr/bin/gencnval", "type": "file" }, { - "bom-ref": "6dba4839645eff55", + "bom-ref": "1e1a8ea878d7f84b", "name": "/usr/bin/gendict", "type": "file" }, { - "bom-ref": "c6c1c7817ebd34fb", + "bom-ref": "2dc9300d03789639", "name": "/usr/bin/genrb", "type": "file" }, { - "bom-ref": "f5e246fa43ee9b70", + "bom-ref": "c2951c29649cb682", "name": "/usr/bin/getconf", "type": "file" }, { - "bom-ref": "676b5459360fd78b", + "bom-ref": "dd732d164cf7fe75", "name": "/usr/bin/getent", "type": "file" }, { - "bom-ref": "84052d34f9c02fa2", + "bom-ref": "326c02ea47d5a174", "name": "/usr/bin/getopt", "type": "file" }, { - "bom-ref": "c3b83fbf33d48655", + "bom-ref": "e1ec844c5e46d6ec", "name": "/usr/bin/git", "type": "file" }, { - "bom-ref": "a27e89b4d091446a", + "bom-ref": "c4cfd727549b7330", "name": "/usr/bin/git-lfs", "type": "file" }, { - "bom-ref": "8553a22de2ec193f", + "bom-ref": "7cf1cd320ed00dba", "name": "/usr/bin/git-shell", "type": "file" }, { - "bom-ref": "1d71888e8272e31b", + "bom-ref": "8d301e6c75300b61", "name": "/usr/bin/gml2gv", "type": "file" }, { - "bom-ref": "1961a37bd831142d", + "bom-ref": "d32cb428d8356def", "name": "/usr/bin/gpasswd", "type": "file" }, { - "bom-ref": "ab8afce89fc3faf2", + "bom-ref": "62def8937057b085", "name": "/usr/bin/gpg", "type": "file" }, { - "bom-ref": "6253edac167d7b77", + "bom-ref": "cb191585e5e6dc3c", "name": "/usr/bin/gpg-agent", "type": "file" }, { - "bom-ref": "a97e185f94f2a9d5", + "bom-ref": "760ac7aa0f372882", "name": "/usr/bin/gpg-connect-agent", "type": "file" }, { - "bom-ref": "348074a1c27c2916", + "bom-ref": "4a15c7fb05e279cd", "name": "/usr/bin/gpgconf", "type": "file" }, { - "bom-ref": "d5463c8c4aa8da2b", + "bom-ref": "e213025cf8503750", "name": "/usr/bin/gpgparsemail", "type": "file" }, { - "bom-ref": "5b35454e079bc7c7", + "bom-ref": "f24c8416aca8adf8", "name": "/usr/bin/gpgsm", "type": "file" }, { - "bom-ref": "f094af06e816e111", + "bom-ref": "0e8c55e4eaf6d38e", "name": "/usr/bin/gpgsplit", "type": "file" }, { - "bom-ref": "43bde854537a8335", + "bom-ref": "2404c101b06612ae", "name": "/usr/bin/gpgtar", "type": "file" }, { - "bom-ref": "dd202aa2e0182842", + "bom-ref": "e6be5adb6db01b24", "name": "/usr/bin/gpgv", "type": "file" }, { - "bom-ref": "c69cbeedd5b9f5aa", + "bom-ref": "b725d02405d0a820", "name": "/usr/bin/graphml2gv", "type": "file" }, { - "bom-ref": "17544f4b158b1e3f", + "bom-ref": "6e2e0af60c0f3e01", "name": "/usr/bin/grep", "type": "file" }, { - "bom-ref": "0c3bdd33a75fc541", + "bom-ref": "abc0da3d0fa8fdbf", "name": "/usr/bin/groups", "type": "file" }, { - "bom-ref": "841df9bbf3ec43a4", + "bom-ref": "af23dcf632137372", "name": "/usr/bin/gunzip", "type": "file" }, { - "bom-ref": "0657e5953141478b", + "bom-ref": "78e2be97f153d399", "name": "/usr/bin/gv2gml", "type": "file" }, { - "bom-ref": "fef0cc1a811e3967", + "bom-ref": "ca19bc90338dcac9", "name": "/usr/bin/gvcolor", "type": "file" }, { - "bom-ref": "ba06f4ceb808e0f7", + "bom-ref": "81245ce4eed90efd", "name": "/usr/bin/gvgen", "type": "file" }, { - "bom-ref": "8226d3c2a99e8aec", + "bom-ref": "d702d38b396634aa", "name": "/usr/bin/gvmap", "type": "file" }, { - "bom-ref": "e0469a84e14cebd2", + "bom-ref": "b145760c2f025b00", "name": "/usr/bin/gvmap.sh", "type": "file" }, { - "bom-ref": "790c7fc883586039", + "bom-ref": "5ec50e3fae83d383", "name": "/usr/bin/gvpack", "type": "file" }, { - "bom-ref": "175a52a5020781d4", + "bom-ref": "cc0401d0e2a2aa02", "name": "/usr/bin/gvpr", "type": "file" }, { - "bom-ref": "9b0eaf060563fbfc", + "bom-ref": "85a95315958eb3aa", "name": "/usr/bin/gxl2gv", "type": "file" }, { - "bom-ref": "f4e829e7b06522be", + "bom-ref": "f2c2ff807a42ab3c", "name": "/usr/bin/gzexe", "type": "file" }, { - "bom-ref": "75bb37151cc6df9b", + "bom-ref": "bf569ccf1850cf91", "name": "/usr/bin/gzip", "type": "file" }, { - "bom-ref": "27590aa8044cae17", + "bom-ref": "5662ac699065124e", "name": "/usr/bin/h2ph", "type": "file" }, { - "bom-ref": "6e1bb5478b0a1a5f", + "bom-ref": "c9a61f51c53ece6e", "name": "/usr/bin/h2xs", "type": "file" }, { - "bom-ref": "d62c38cf8627d830", + "bom-ref": "88a5d403a126da1e", "name": "/usr/bin/hardlink", "type": "file" }, { - "bom-ref": "57e4d24fc82a921d", + "bom-ref": "fa2f88ece09c6667", "name": "/usr/bin/head", "type": "file" }, { - "bom-ref": "4484aa81c08f33d6", + "bom-ref": "fc7215e9bc307927", "name": "/usr/bin/helpztags", "type": "file" }, { - "bom-ref": "37e696a317cfc723", + "bom-ref": "7ea7e3472e4da565", "name": "/usr/bin/hostid", "type": "file" }, { - "bom-ref": "db79c96af421ec3e", + "bom-ref": "74de2e85a0ea44a8", "name": "/usr/bin/hostname", "type": "file" }, { - "bom-ref": "85c4f2fea67fffa8", + "bom-ref": "dd95c58023f3d96e", "name": "/usr/bin/iconv", "type": "file" }, { - "bom-ref": "956e1a47df84df72", + "bom-ref": "52ebaa23fa9e904c", "name": "/usr/bin/icuexportdata", "type": "file" }, { - "bom-ref": "e0db99140905af9d", + "bom-ref": "2cf89ae0df082ccf", "name": "/usr/bin/icuinfo", "type": "file" }, { - "bom-ref": "c7b84acb4ade66bb", + "bom-ref": "8fb061c4340ef7f9", "name": "/usr/bin/id", "type": "file" }, { - "bom-ref": "c8e17888438e7e0c", + "bom-ref": "e77b52e2e9c6594e", "name": "/usr/bin/ifnames", "type": "file" }, { - "bom-ref": "2f73a9ffbeb39941", + "bom-ref": "c85616b0656bdc4f", "name": "/usr/bin/infocmp", "type": "file" }, { - "bom-ref": "0c5591c77bf8edbe", + "bom-ref": "6bce2b8b03c63214", "name": "/usr/bin/install", "type": "file" }, { - "bom-ref": "dc90c91e7f0f3c8d", + "bom-ref": "fce5483d2ca83c38", "name": "/usr/bin/instmodsh", "type": "file" }, { - "bom-ref": "5a2c0a1bda437533", + "bom-ref": "83b22346a119b2f1", "name": "/usr/bin/ionice", "type": "file" }, { - "bom-ref": "1bcad982bcc217dd", + "bom-ref": "41ed0b302c0192ff", "name": "/usr/bin/ipcmk", "type": "file" }, { - "bom-ref": "12651f610d29e7a0", + "bom-ref": "b71b1f5b3573f752", "name": "/usr/bin/ipcrm", "type": "file" }, { - "bom-ref": "51ef0c13db17efbb", + "bom-ref": "7f7d21169740c97d", "name": "/usr/bin/ipcs", "type": "file" }, { - "bom-ref": "1b850d25d8de9bfc", + "bom-ref": "38c006901c958fb6", "name": "/usr/bin/ischroot", "type": "file" }, { - "bom-ref": "827080a5d512443d", + "bom-ref": "3e43763703c5d65b", "name": "/usr/bin/join", "type": "file" }, { - "bom-ref": "14089ae23cf26b32", + "bom-ref": "dc20c56711cefe6b", "name": "/usr/bin/jq", "type": "file" }, { - "bom-ref": "5966182bb5699bc8", + "bom-ref": "c146a00de8939ced", "name": "/usr/bin/json_pp", "type": "file" }, { - "bom-ref": "fc503efbf1163e69", + "bom-ref": "d6f097ea26474c1e", "name": "/usr/bin/kbxutil", "type": "file" }, { - "bom-ref": "1a1fa770e34e0e5b", + "bom-ref": "8f278acfb110c261", "name": "/usr/bin/kill", "type": "file" }, { - "bom-ref": "e4029e84f74f86e5", + "bom-ref": "6f301422b8455bbf", "name": "/usr/bin/krb5-config.mit", "type": "file" }, { - "bom-ref": "48e534cc75197bb0", + "bom-ref": "802ce25fee72c6f2", "name": "/usr/bin/last", "type": "file" }, { - "bom-ref": "3d33b2e17582a706", + "bom-ref": "8beb7838324c85c8", "name": "/usr/bin/lastlog", "type": "file" }, { - "bom-ref": "2ffc431c65074fa2", + "bom-ref": "94d7ba134943f5b8", "name": "/usr/bin/lcf", "type": "file" }, { - "bom-ref": "fe007054c8df2ec8", + "bom-ref": "f90dd276a7726566", "name": "/usr/bin/ldd", "type": "file" }, { - "bom-ref": "bcb4ce53bdc88793", + "bom-ref": "7a04943d6812e369", "name": "/usr/bin/lefty", "type": "file" }, { - "bom-ref": "4d438a692dc6085e", + "bom-ref": "5d714ee86420bc3e", "name": "/usr/bin/less", "type": "file" }, { - "bom-ref": "3428dc482337ecd0", + "bom-ref": "d4f6e9604d1fe418", "name": "/usr/bin/lessecho", "type": "file" }, { - "bom-ref": "683c1afebb50494d", + "bom-ref": "39dbed5e54abc7e5", "name": "/usr/bin/lesskey", "type": "file" }, { - "bom-ref": "68f87f784dbc455d", + "bom-ref": "4b0164af31cfa911", "name": "/usr/bin/lesspipe", "type": "file" }, { - "bom-ref": "b0453f05a85e140d", + "bom-ref": "1733b940eb40c4c0", "name": "/usr/bin/libnetcfg", "type": "file" }, { - "bom-ref": "b26ae1d1517d0340", + "bom-ref": "80403a14ec4d99f2", "name": "/usr/bin/libpng16-config", "type": "file" }, { - "bom-ref": "8b7248b19d2494a1", + "bom-ref": "d48c34b4bf68d687", "name": "/usr/bin/libtoolize", "type": "file" }, { - "bom-ref": "7cf4b40530d2d1ad", + "bom-ref": "22a7c89194d4a67b", "name": "/usr/bin/link", "type": "file" }, { - "bom-ref": "d379894b3eafca4d", + "bom-ref": "0a7bdfac00f1c74f", "name": "/usr/bin/ln", "type": "file" }, { - "bom-ref": "fe5451bee8abe2d9", + "bom-ref": "acad43bc7eac3093", "name": "/usr/bin/lneato", "type": "file" }, { - "bom-ref": "3533b1b98bd7cdb9", + "bom-ref": "db2928140515bc9f", "name": "/usr/bin/locale", "type": "file" }, { - "bom-ref": "04f6db83ea13c714", + "bom-ref": "2463d604118ee246", "name": "/usr/bin/locale-check", "type": "file" }, { - "bom-ref": "65420cbb97c723bb", + "bom-ref": "481405784799fca1", "name": "/usr/bin/localedef", "type": "file" }, { - "bom-ref": "3ed2e34bc0236cb7", + "bom-ref": "5a26b298e94313f5", "name": "/usr/bin/logger", "type": "file" }, { - "bom-ref": "2f87b522bedd17e0", + "bom-ref": "8a46ee45ccdab3ae", "name": "/usr/bin/login", "type": "file" }, { - "bom-ref": "8c70936e616105ea", + "bom-ref": "3372af2ed28177f4", "name": "/usr/bin/logname", "type": "file" }, { - "bom-ref": "a449838cadc77407", + "bom-ref": "828bccba2378ff05", "name": "/usr/bin/ls", "type": "file" }, { - "bom-ref": "594ff1303f1ca7c0", + "bom-ref": "b1ced84e296f48aa", "name": "/usr/bin/lsattr", "type": "file" }, { - "bom-ref": "89743c644f76ac64", + "bom-ref": "464556faa54530d6", "name": "/usr/bin/lsblk", "type": "file" }, { - "bom-ref": "d908da2efc9a63e6", + "bom-ref": "8bd02c24de616f10", "name": "/usr/bin/lscpu", "type": "file" }, { - "bom-ref": "d462eb59857cba4d", + "bom-ref": "06584dd418b3686b", "name": "/usr/bin/lsipc", "type": "file" }, { - "bom-ref": "133b0de3e1994da3", + "bom-ref": "d388770f051dc5d9", "name": "/usr/bin/lslocks", "type": "file" }, { - "bom-ref": "3353300b725e2345", + "bom-ref": "fd3617768f49d4c7", "name": "/usr/bin/lslogins", "type": "file" }, { - "bom-ref": "cf0a5a57bf8a397f", + "bom-ref": "cbdfc9a9dc7193f9", "name": "/usr/bin/lsmem", "type": "file" }, { - "bom-ref": "165e26f76087d6b3", + "bom-ref": "52e1b1effa6f3b7d", "name": "/usr/bin/lsns", "type": "file" }, { - "bom-ref": "e175a4a71a38b7dd", + "bom-ref": "248e3b54ce048096", "name": "/usr/bin/lspci", "type": "file" }, { - "bom-ref": "83d43fcb228bce19", + "bom-ref": "4091bb22ed44d978", "name": "/usr/bin/lspgpot", "type": "file" }, { - "bom-ref": "889ec168b27fafbb", + "bom-ref": "550fcebbc5359fb6", "name": "/usr/bin/lzmainfo", "type": "file" }, { - "bom-ref": "6d441272a6d0b29e", + "bom-ref": "ced982ea44e3808c", "name": "/usr/bin/m4", "type": "file" }, { - "bom-ref": "e228fb02b139aa47", + "bom-ref": "ecfd28cd53359952", "name": "/usr/bin/make", "type": "file" }, { - "bom-ref": "0b41ea03907d621e", + "bom-ref": "a101ce3390e78e17", "name": "/usr/bin/make-first-existing-target", "type": "file" }, { - "bom-ref": "c60da0250d65bbfe", + "bom-ref": "cbd64e23d330de5c", "name": "/usr/bin/makeconv", "type": "file" }, { - "bom-ref": "a8a64027fc77ed5b", + "bom-ref": "0026a6fd01421fa9", "name": "/usr/bin/mawk", "type": "file" }, { - "bom-ref": "ef110ea5cd4a4a70", + "bom-ref": "3ef204add7a79802", "name": "/usr/bin/mcookie", "type": "file" }, { - "bom-ref": "d209e3da2dda3d5a", + "bom-ref": "4e7d2c5bc559dd80", "name": "/usr/bin/md5sum", "type": "file" }, { - "bom-ref": "0efa15e633e33159", + "bom-ref": "a53e0d453b6e21c4", "name": "/usr/bin/memhog", "type": "file" }, { - "bom-ref": "19bc732a30bba1dd", + "bom-ref": "f9ba5c49e45682eb", "name": "/usr/bin/mesg", "type": "file" }, { - "bom-ref": "56f801243d1a1776", + "bom-ref": "6683fa090f3fec2b", "name": "/usr/bin/migrate-pubring-from-classic-gpg", "type": "file" }, { - "bom-ref": "b9eaba28a572cfa2", + "bom-ref": "acf1f385fc2fbb67", "name": "/usr/bin/migratepages", "type": "file" }, { - "bom-ref": "b94f3bc04a282259", + "bom-ref": "7d3c3c214ffcc614", "name": "/usr/bin/migspeed", "type": "file" }, { - "bom-ref": "06372f2c380a2a47", + "bom-ref": "e33e174c29ec82c5", "name": "/usr/bin/mingle", "type": "file" }, { - "bom-ref": "adea64f2ec7c7603", + "bom-ref": "859e13cbfb750799", "name": "/usr/bin/mkdir", "type": "file" }, { - "bom-ref": "74eef3328c9e6125", + "bom-ref": "047e1d218cd53097", "name": "/usr/bin/mkfifo", "type": "file" }, { - "bom-ref": "240bebfc0d0c3da3", + "bom-ref": "ce2a329bb5fc6511", "name": "/usr/bin/mknod", "type": "file" }, { - "bom-ref": "ea7e25e8f64dfd22", + "bom-ref": "b6fa608632138930", "name": "/usr/bin/mktemp", "type": "file" }, { - "bom-ref": "68d457e448377232", + "bom-ref": "5a6c082c7331777c", "name": "/usr/bin/mm2gv", "type": "file" }, { - "bom-ref": "336b22c5c759b0db", + "bom-ref": "1e04709836c968a5", "name": "/usr/bin/more", "type": "file" }, { - "bom-ref": "00a93124b39dc94b", + "bom-ref": "fe5a3b5063fad479", "name": "/usr/bin/mount", "type": "file" }, { - "bom-ref": "b39ce41532e9271b", + "bom-ref": "8f88ea596e0b4efd", "name": "/usr/bin/mountpoint", "type": "file" }, { - "bom-ref": "0b6c9fe6aabdcdf9", + "bom-ref": "a3ace79a94cb00eb", "name": "/usr/bin/mv", "type": "file" }, { - "bom-ref": "21a2c2388a040a56", + "bom-ref": "b1672f1f5a7e9174", "name": "/usr/bin/namei", "type": "file" }, { - "bom-ref": "de1d391b9ad3387c", + "bom-ref": "0924814f325cc090", "name": "/usr/bin/nano", "type": "file" }, { - "bom-ref": "0f08661e5faed66c", + "bom-ref": "f6624147e6e89106", "name": "/usr/bin/nasm", "type": "file" }, { - "bom-ref": "1107eb28315d9dd4", + "bom-ref": "3822cf939a9f3369", "name": "/usr/bin/ncclparam", "type": "file" }, { - "bom-ref": "c530bb1d8213ed60", + "bom-ref": "a93e9873a9dd0a4d", "name": "/usr/bin/ncclras", "type": "file" }, { - "bom-ref": "358826cff33bbe4b", + "bom-ref": "56290ebbb5651359", "name": "/usr/bin/ncurses6-config", "type": "file" }, { - "bom-ref": "17582fe76c7131ad", + "bom-ref": "2e2393f9ecc6b117", "name": "/usr/bin/ncursesw6-config", "type": "file" }, { - "bom-ref": "1b7e531d4de5d696", + "bom-ref": "549d8a643fc4f8e4", "name": "/usr/bin/ndisasm", "type": "file" }, { - "bom-ref": "eeef7e54b89462ac", + "bom-ref": "fd258751e6c8dcd6", "name": "/usr/bin/newgrp", "type": "file" }, { - "bom-ref": "64a7d04b9247de81", + "bom-ref": "624214905c50d28b", "name": "/usr/bin/nice", "type": "file" }, { - "bom-ref": "6fe5242e54d2a02d", + "bom-ref": "84947454f257a547", "name": "/usr/bin/ninja", "type": "file" }, { - "bom-ref": "8e2e354419f15e22", + "bom-ref": "693155212c47dac8", "name": "/usr/bin/nl", "type": "file" }, { - "bom-ref": "aebc398dc31f9158", + "bom-ref": "e2a014425e0eb756", "name": "/usr/bin/nohup", "type": "file" }, { - "bom-ref": "9bdb1bf32bbfcc2e", + "bom-ref": "1ce56fa9d7811174", "name": "/usr/bin/nop", "type": "file" }, { - "bom-ref": "38a62c1ae7feab8c", + "bom-ref": "561ad5ece08b7efa", "name": "/usr/bin/nproc", "type": "file" }, { - "bom-ref": "7761606a3c266c8e", + "bom-ref": "8f53f36edcc66fe0", "name": "/usr/bin/nsenter", "type": "file" }, { - "bom-ref": "0ced59371e38b446", + "bom-ref": "ead294f350d9701b", "name": "/usr/bin/numactl", "type": "file" }, { - "bom-ref": "9c7bb95aec4d2eab", + "bom-ref": "bb4f47886c4d7022", "name": "/usr/bin/numastat", "type": "file" }, { - "bom-ref": "6262c6d41d91227e", + "bom-ref": "d8b4215b121d04b4", "name": "/usr/bin/numfmt", "type": "file" }, { - "bom-ref": "00044c56314de800", + "bom-ref": "f98bb79b5976fccd", "name": "/usr/bin/nvshmem_13/examples/collective-launch", "type": "file" }, { - "bom-ref": "0a1bfac61398e11b", + "bom-ref": "ecc72b1df5ae76e2", "name": "/usr/bin/nvshmem_13/examples/dev-guide-ring", "type": "file" }, { - "bom-ref": "85d0a5213d829af1", + "bom-ref": "aa77ef8e36269040", "name": "/usr/bin/nvshmem_13/examples/dev-guide-ring-mpi", "type": "file" }, { - "bom-ref": "e77a8b9035cf52f4", + "bom-ref": "c0aa142102233175", "name": "/usr/bin/nvshmem_13/examples/moe_shuffle", "type": "file" }, { - "bom-ref": "052172ad5bd990af", + "bom-ref": "00aecd8dfd843536", "name": "/usr/bin/nvshmem_13/examples/mpi-based-init", "type": "file" }, { - "bom-ref": "685ea0a021e9098a", + "bom-ref": "d2166185d36e79f7", "name": "/usr/bin/nvshmem_13/examples/on-stream", "type": "file" }, { - "bom-ref": "b0d20cfe2c75c994", + "bom-ref": "f8cc31f776b3eb1d", "name": "/usr/bin/nvshmem_13/examples/put-block", "type": "file" }, { - "bom-ref": "ca0cef14ef4fe6a2", + "bom-ref": "d9644a177ca1b493", "name": "/usr/bin/nvshmem_13/examples/ring-bcast", "type": "file" }, { - "bom-ref": "88e45b9cadb297a5", + "bom-ref": "aa3d2d15dab1c020", "name": "/usr/bin/nvshmem_13/examples/ring-reduce", "type": "file" }, { - "bom-ref": "8952959c782a2413", + "bom-ref": "b5c79f7be75d2252", "name": "/usr/bin/nvshmem_13/examples/thread-group", "type": "file" }, { - "bom-ref": "da618e8786feece4", + "bom-ref": "882f252adf340763", + "name": "/usr/bin/nvshmem_13/examples/tma-smem", + "type": "file" + }, + { + "bom-ref": "5858dcac39810631", "name": "/usr/bin/nvshmem_13/examples/uid-based-init", "type": "file" }, { - "bom-ref": "01fee80a21f54363", + "bom-ref": "814d06d59dfa5a3e", "name": "/usr/bin/nvshmem_13/examples/user-buffer", "type": "file" }, { - "bom-ref": "4c0e5978e9295ef5", + "bom-ref": "4f7d6e417b3e5b5c", "name": "/usr/bin/nvshmem_13/hydra_nameserver", "type": "file" }, { - "bom-ref": "e42a0810d69f30f0", + "bom-ref": "914fc02501e24415", "name": "/usr/bin/nvshmem_13/hydra_persist", "type": "file" }, { - "bom-ref": "9709d9c30a7176a6", + "bom-ref": "848a87f70194d5e3", "name": "/usr/bin/nvshmem_13/hydra_pmi_proxy", "type": "file" }, { - "bom-ref": "e4344c927db36c42", + "bom-ref": "288b33e02e57fe6b", "name": "/usr/bin/nvshmem_13/nvshmem-info", "type": "file" }, { - "bom-ref": "5dce375881e4fb66", + "bom-ref": "76073b4d6cfec2ab", "name": "/usr/bin/nvshmem_13/nvshmrun.hydra", "type": "file" }, { - "bom-ref": "bbf38839643d8a52", + "bom-ref": "1cb31671535547f3", "name": "/usr/bin/nvshmem_13/perftest/device/coll/alltoall_latency", "type": "file" }, { - "bom-ref": "d9fcd155fefdd473", - "name": "/usr/bin/nvshmem_13/perftest/device/coll/alltoall_latency_bc.cubin", - "type": "file" - }, - { - "bom-ref": "f91efe4ccbbe50a9", + "bom-ref": "59295f3d3a168fdc", "name": "/usr/bin/nvshmem_13/perftest/device/coll/barrier_latency", "type": "file" }, { - "bom-ref": "cbd6f9028293d5f2", - "name": "/usr/bin/nvshmem_13/perftest/device/coll/barrier_latency_bc.cubin", - "type": "file" - }, - { - "bom-ref": "972fd27de2bc73e0", + "bom-ref": "c3da6329069d1d75", "name": "/usr/bin/nvshmem_13/perftest/device/coll/bcast_latency", "type": "file" }, { - "bom-ref": "204fcc35c2b21ad6", - "name": "/usr/bin/nvshmem_13/perftest/device/coll/bcast_latency_bc.cubin", - "type": "file" - }, - { - "bom-ref": "91ccef70aa5691c8", + "bom-ref": "217fcc428ba98c11", "name": "/usr/bin/nvshmem_13/perftest/device/coll/fcollect_latency", "type": "file" }, { - "bom-ref": "db3aa49e1fa03501", - "name": "/usr/bin/nvshmem_13/perftest/device/coll/fcollect_latency_bc.cubin", - "type": "file" - }, - { - "bom-ref": "79ff72edd45a67e1", + "bom-ref": "568e543191b400a0", "name": "/usr/bin/nvshmem_13/perftest/device/coll/reducescatter_latency", "type": "file" }, { - "bom-ref": "00ae3d3d0e527a69", - "name": "/usr/bin/nvshmem_13/perftest/device/coll/reducescatter_latency_bc.cubin", - "type": "file" - }, - { - "bom-ref": "012358558484723f", + "bom-ref": "fe3b75c4dee9ac9a", "name": "/usr/bin/nvshmem_13/perftest/device/coll/reduction_latency", "type": "file" }, { - "bom-ref": "d08b36838960c25b", - "name": "/usr/bin/nvshmem_13/perftest/device/coll/reduction_latency_bc.cubin", - "type": "file" - }, - { - "bom-ref": "1bc708dab481e777", + "bom-ref": "f14fd17f5a1535c2", "name": "/usr/bin/nvshmem_13/perftest/device/coll/sync_latency", "type": "file" }, { - "bom-ref": "722d9f22a4ce5a85", - "name": "/usr/bin/nvshmem_13/perftest/device/coll/sync_latency_bc.cubin", - "type": "file" - }, - { - "bom-ref": "5519c04349f5f269", + "bom-ref": "2b5265558dcd34dc", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_atomic_bw", "type": "file" }, { - "bom-ref": "cc0a02446adf210c", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_atomic_bw_bc.cubin", + "bom-ref": "eb225e252f9b723b", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_atomic_bw_ltoir.cubin", "type": "file" }, { - "bom-ref": "c0ac6ebe86a108ec", + "bom-ref": "90ccb08ef9bedce5", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_atomic_latency", "type": "file" }, { - "bom-ref": "ce490fdede75ac97", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_atomic_latency_bc.cubin", + "bom-ref": "55effedfc5351454", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_atomic_latency_ltoir.cubin", "type": "file" }, { - "bom-ref": "0a901a01c1ee33a3", + "bom-ref": "f1e1cb8dd08a05aa", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_atomic_ping_pong_latency", "type": "file" }, { - "bom-ref": "3114758274e0136b", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_atomic_ping_pong_latency_bc.cubin", + "bom-ref": "56e7a9a781e32079", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_atomic_ping_pong_latency_ltoir.cubin", "type": "file" }, { - "bom-ref": "4efd477797388eb6", + "bom-ref": "bfb3c979b2db4e81", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_flush_bench", + "type": "file" + }, + { + "bom-ref": "2e721c336088f653", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_g_bw", "type": "file" }, { - "bom-ref": "980a0ccbdba68601", + "bom-ref": "644364997802e718", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_g_latency", "type": "file" }, { - "bom-ref": "1d074f17134acfe5", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_g_latency_bc.cubin", + "bom-ref": "57287def43cfda63", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_g_latency_ltoir.cubin", "type": "file" }, { - "bom-ref": "a7667a806dd70844", + "bom-ref": "ee7342f537648c11", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_get_bw", "type": "file" }, { - "bom-ref": "e695e7bf51b09f3d", + "bom-ref": "975d6c87b1887028", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_get_latency", "type": "file" }, { - "bom-ref": "5e1fa28a58716836", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_get_latency_bc.cubin", + "bom-ref": "e6091eee5bdb8905", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_get_latency_ltoir.cubin", "type": "file" }, { - "bom-ref": "6cfe8880f90d5b04", + "bom-ref": "b94bcfeb35cfe661", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_p_bw", "type": "file" }, { - "bom-ref": "5f2af897bdb9e468", + "bom-ref": "4fc879a134bb2ae5", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_p_latency", "type": "file" }, { - "bom-ref": "2e21aed5baafc3ee", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_p_latency_bc.cubin", + "bom-ref": "b16e931e0fa4bd98", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_p_latency_ltoir.cubin", "type": "file" }, { - "bom-ref": "c2dabf6cb877f564", + "bom-ref": "ac5b990fc41aa2dd", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_p_ping_pong_latency", "type": "file" }, { - "bom-ref": "45be4754b908fca2", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_p_ping_pong_latency_bc.cubin", + "bom-ref": "dd5a8b2e927799e8", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_p_ping_pong_latency_ltoir.cubin", "type": "file" }, { - "bom-ref": "80c87f039240cf02", + "bom-ref": "d8f500552ed564a3", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_atomic_ping_pong_latency", "type": "file" }, { - "bom-ref": "691f196725c87a6a", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_atomic_ping_pong_latency_bc.cubin", + "bom-ref": "f8a3ab2f1b053656", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_atomic_ping_pong_latency_ltoir.cubin", "type": "file" }, { - "bom-ref": "80f357267b3ad24a", + "bom-ref": "c68df6ca26522c33", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_bw", "type": "file" }, { - "bom-ref": "1c734edff48c8ed7", + "bom-ref": "2a86be362bfefd7a", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_latency", "type": "file" }, { - "bom-ref": "d37b159a5d12a1ea", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_latency_bc.cubin", + "bom-ref": "b78a8926ec8d66f9", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_latency_ltoir.cubin", "type": "file" }, { - "bom-ref": "ae9bbbee2b92eeb5", + "bom-ref": "bf6fa0c5823b73ec", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_ping_pong_latency", "type": "file" }, { - "bom-ref": "979c7bf4f57f6a37", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_ping_pong_latency_bc.cubin", + "bom-ref": "ded8f477dfaebdf7", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_ping_pong_latency_ltoir.cubin", "type": "file" }, { - "bom-ref": "43c28c783083b1cd", + "bom-ref": "81b2381932125778", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_signal_ping_pong_latency", "type": "file" }, { - "bom-ref": "4817a421eb3ef764", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_signal_ping_pong_latency_bc.cubin", + "bom-ref": "91d26ef42b3c49c5", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_signal_ping_pong_latency_ltoir.cubin", + "type": "file" + }, + { + "bom-ref": "f4ca1f9df7502940", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_put_tma_bw", "type": "file" }, { - "bom-ref": "e44f2f7ac33aecc7", + "bom-ref": "f13f69f2de71ed4a", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_signal_ping_pong_latency", "type": "file" }, { - "bom-ref": "4d72020863255265", - "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_signal_ping_pong_latency_bc.cubin", + "bom-ref": "adf0a5d92383e5c7", + "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_signal_ping_pong_latency_ltoir.cubin", "type": "file" }, { - "bom-ref": "39bcec9abfa8b376", + "bom-ref": "90857bb6d31946df", "name": "/usr/bin/nvshmem_13/perftest/device/pt-to-pt/shmem_st_bw", "type": "file" }, { - "bom-ref": "25384205385592b1", + "bom-ref": "2d2725c310a17308", "name": "/usr/bin/nvshmem_13/perftest/device/tile/tile_allgather_latency", "type": "file" }, { - "bom-ref": "abc5b37f58125046", + "bom-ref": "f4497577a1dac02b", "name": "/usr/bin/nvshmem_13/perftest/device/tile/tile_allreduce_latency", "type": "file" }, { - "bom-ref": "061f56d2a34b6502", + "bom-ref": "a63ca9ca5577fba3", "name": "/usr/bin/nvshmem_13/perftest/host/coll/alltoall_on_stream", "type": "file" }, { - "bom-ref": "46d0cfc3e3a4f3b1", + "bom-ref": "f3ee811803d64e1c", "name": "/usr/bin/nvshmem_13/perftest/host/coll/barrier_all_on_stream", "type": "file" }, { - "bom-ref": "ac2a7096ef0308ba", + "bom-ref": "8460ebb9c60fc1bb", "name": "/usr/bin/nvshmem_13/perftest/host/coll/barrier_on_stream", "type": "file" }, { - "bom-ref": "d1fc27b58931275a", + "bom-ref": "f336d774be8b5193", "name": "/usr/bin/nvshmem_13/perftest/host/coll/broadcast_on_stream", "type": "file" }, { - "bom-ref": "3cfb9044df0500c0", + "bom-ref": "846fefdbc767bb59", "name": "/usr/bin/nvshmem_13/perftest/host/coll/fcollect_on_stream", "type": "file" }, { - "bom-ref": "6f10ccc7953c98c4", + "bom-ref": "36889a63c1d50fc5", "name": "/usr/bin/nvshmem_13/perftest/host/coll/reducescatter_on_stream", "type": "file" }, { - "bom-ref": "0786865445d95f01", + "bom-ref": "93d28e6861241a70", "name": "/usr/bin/nvshmem_13/perftest/host/coll/reduction_on_stream", "type": "file" }, { - "bom-ref": "ebfd2cb86be5b367", + "bom-ref": "0d5bfe375b09800e", "name": "/usr/bin/nvshmem_13/perftest/host/coll/sync_all_on_stream", "type": "file" }, { - "bom-ref": "2da980a5cf9c08f5", + "bom-ref": "20c133a129fe8704", "name": "/usr/bin/nvshmem_13/perftest/host/coll/sync_on_stream", "type": "file" }, { - "bom-ref": "76aba3b71d6787d4", + "bom-ref": "9c51b75d4873a5c9", "name": "/usr/bin/nvshmem_13/perftest/host/init/malloc", "type": "file" }, { - "bom-ref": "865b11f3ca17fc95", + "bom-ref": "360c50a0e386b264", "name": "/usr/bin/nvshmem_13/perftest/host/pt-to-pt/bw", "type": "file" }, { - "bom-ref": "d11fb69d2acd16ad", + "bom-ref": "515170da0a8e3c84", "name": "/usr/bin/nvshmem_13/perftest/host/pt-to-pt/latency", "type": "file" }, { - "bom-ref": "0ada14d1629b4c96", + "bom-ref": "653cc5cd05137a6f", "name": "/usr/bin/nvshmem_13/perftest/host/pt-to-pt/stream_latency", "type": "file" }, { - "bom-ref": "375a01053b40582a", + "bom-ref": "6ced01384d174134", "name": "/usr/bin/od", "type": "file" }, { - "bom-ref": "97678f1987cb1814", + "bom-ref": "d6fe714478264e5a", "name": "/usr/bin/openssl", "type": "file" }, { - "bom-ref": "133daae0b825382b", + "bom-ref": "463f313c8680e491", "name": "/usr/bin/partx", "type": "file" }, { - "bom-ref": "b0314632b5151e83", + "bom-ref": "ed6561a75e453411", "name": "/usr/bin/passwd", "type": "file" }, { - "bom-ref": "150330887628b0bf", + "bom-ref": "414e3db5d6f332e9", "name": "/usr/bin/paste", "type": "file" }, { - "bom-ref": "d1eed40c7f5bb739", + "bom-ref": "734f568d5a2da082", "name": "/usr/bin/patch", "type": "file" }, { - "bom-ref": "5f6983857d720823", + "bom-ref": "2643c547796ffe11", "name": "/usr/bin/patchelf", "type": "file" }, { - "bom-ref": "d2865184f54366bc", + "bom-ref": "08ee02736bbca0de", "name": "/usr/bin/pathchk", "type": "file" }, { - "bom-ref": "7dadb2973cd3dbf6", + "bom-ref": "77f8f688af74b964", "name": "/usr/bin/perl", "type": "file" }, { - "bom-ref": "5007bacb989de8c5", + "bom-ref": "4e5f41a703d3a3f4", "name": "/usr/bin/perl5.38-x86_64-linux-gnu", "type": "file" }, { - "bom-ref": "8beb2a0f20a736c5", + "bom-ref": "fee64c481ecee04f", "name": "/usr/bin/perl5.38.2", "type": "file" }, { - "bom-ref": "5e9d17ff21934dd2", + "bom-ref": "7172c9a3e3f1e35f", "name": "/usr/bin/perlbug", "type": "file" }, { - "bom-ref": "7b25998889fbbf43", + "bom-ref": "91d9d7202e3d78f2", "name": "/usr/bin/perldoc", "type": "file" }, { - "bom-ref": "87986c60362e649e", + "bom-ref": "4277934a44c52087", "name": "/usr/bin/perlivp", "type": "file" }, { - "bom-ref": "0c86ed1679024659", + "bom-ref": "3d0bbd8a1fc9d1d4", "name": "/usr/bin/perlthanks", "type": "file" }, { - "bom-ref": "90917b1118401966", + "bom-ref": "32142691801be02c", "name": "/usr/bin/pgrep", "type": "file" }, { - "bom-ref": "f6b31e6bc5d6f1a0", + "bom-ref": "2a0653a44d3cc3b5", "name": "/usr/bin/piconv", "type": "file" }, { - "bom-ref": "1dc25926836bcb9b", + "bom-ref": "3d5f217f952298cd", "name": "/usr/bin/pidwait", "type": "file" }, { - "bom-ref": "172e8c4582f5440c", + "bom-ref": "4bf7b7a8569c5826", "name": "/usr/bin/pigz", "type": "file" }, { - "bom-ref": "9cefca4d024b1703", + "bom-ref": "a841542a14eb2b72", "name": "/usr/bin/pinentry-curses", "type": "file" }, { - "bom-ref": "b12e6a892fdd435c", + "bom-ref": "fe14f0c91df48d92", "name": "/usr/bin/pinky", "type": "file" }, { - "bom-ref": "4148eed9b031a269", + "bom-ref": "6fb7addc7f3ada6b", "name": "/usr/bin/pip", "type": "file" }, { - "bom-ref": "ac4e85d7d2cfc90f", + "bom-ref": "a2b62010a1783239", "name": "/usr/bin/pip3", "type": "file" }, { - "bom-ref": "a1aab51fccecace4", + "bom-ref": "6fe4ae39213ea90e", "name": "/usr/bin/pip3.12", "type": "file" }, { - "bom-ref": "76f091df449f976f", + "bom-ref": "1936a8221b5a0273", "name": "/usr/bin/pkgconf", "type": "file" }, { - "bom-ref": "dda63e4ce5b9259e", + "bom-ref": "6ccf3b44a5d64904", "name": "/usr/bin/pkgdata", "type": "file" }, { - "bom-ref": "9cb3c6fcff7c5e00", + "bom-ref": "19a48ab76895a8f9", "name": "/usr/bin/pl2pm", "type": "file" }, { - "bom-ref": "00f8262ee0205626", + "bom-ref": "40ea16b73b48319c", "name": "/usr/bin/pldd", "type": "file" }, { - "bom-ref": "11861c21774756b5", + "bom-ref": "f0ce08f6c64de06b", "name": "/usr/bin/pmap", "type": "file" }, { - "bom-ref": "59a1e16b5dd36481", + "bom-ref": "62bef056dae86758", "name": "/usr/bin/pod2html", "type": "file" }, { - "bom-ref": "e01ddc742c634ac9", + "bom-ref": "915bcd12552c5960", "name": "/usr/bin/pod2man", "type": "file" }, { - "bom-ref": "fe8996cf33b89cd6", + "bom-ref": "602d5141c7c59f17", "name": "/usr/bin/pod2text", "type": "file" }, { - "bom-ref": "ed46465651807b24", + "bom-ref": "b89786a217d67dd9", "name": "/usr/bin/pod2usage", "type": "file" }, { - "bom-ref": "15b0178c9e4c5b63", + "bom-ref": "2d2395e81900f656", "name": "/usr/bin/podchecker", "type": "file" }, { - "bom-ref": "4d21a332533a729e", + "bom-ref": "c5b5cda63fc68f98", "name": "/usr/bin/pr", "type": "file" }, { - "bom-ref": "6047c757b6c1e28e", + "bom-ref": "a8d8ff3c72910628", "name": "/usr/bin/printenv", "type": "file" }, { - "bom-ref": "e28dc7c0e197223d", + "bom-ref": "aba67946dda108db", "name": "/usr/bin/printf", "type": "file" }, { - "bom-ref": "d24ca2fe4963bc3a", + "bom-ref": "f70f57c4d49a48d4", "name": "/usr/bin/prlimit", "type": "file" }, { - "bom-ref": "2742d6712115bb59", + "bom-ref": "a685d6c6bded8def", "name": "/usr/bin/protoc", "type": "file" }, { - "bom-ref": "2fe12a4b2927f3e3", + "bom-ref": "cacf734b9469e97a", "name": "/usr/bin/prove", "type": "file" }, { - "bom-ref": "50ffe1fd89c96ad0", + "bom-ref": "e7aeb37ce5fba106", "name": "/usr/bin/prune", "type": "file" }, { - "bom-ref": "04b02fb8c7f94714", + "bom-ref": "8da3f94b06525f5e", "name": "/usr/bin/ps", "type": "file" }, { - "bom-ref": "7deeaef8d0ea53e4", + "bom-ref": "17401efa9b599505", "name": "/usr/bin/ptar", "type": "file" }, { - "bom-ref": "76251154fa4c0cf3", + "bom-ref": "5d38b4ffd4b2e96a", "name": "/usr/bin/ptardiff", "type": "file" }, { - "bom-ref": "bee47c1d838ff061", + "bom-ref": "dcafad6fc74c99b8", "name": "/usr/bin/ptargrep", "type": "file" }, { - "bom-ref": "6e7092271db7962f", + "bom-ref": "c4dd903e6a9d0b59", "name": "/usr/bin/ptx", "type": "file" }, { - "bom-ref": "a3eba5b083d1205c", + "bom-ref": "42559265bbdf147e", "name": "/usr/bin/pwd", "type": "file" }, { - "bom-ref": "d2af2e57f25bab93", + "bom-ref": "ca1a2f28809a9371", "name": "/usr/bin/pwdx", "type": "file" }, { - "bom-ref": "dbd5c4adad6cdf54", + "bom-ref": "bc714f6492427b7e", "name": "/usr/bin/py3clean", "type": "file" }, { - "bom-ref": "57a535c7d8f94204", + "bom-ref": "7545254ff04e91ea", "name": "/usr/bin/py3compile", "type": "file" }, { - "bom-ref": "785f69fa6f2643a7", + "bom-ref": "ba855163a6896c31", "name": "/usr/bin/pydoc3.12", "type": "file" }, { - "bom-ref": "e2b16dabf4f1a2ed", + "bom-ref": "d74873b7213258c7", "name": "/usr/bin/pygettext3.12", "type": "file" }, { - "bom-ref": "44200aa3e06adb01", + "bom-ref": "86b4e754ff58b01f", "name": "/usr/bin/python3.12", "type": "file" }, { - "bom-ref": "f51a5707af5aa635", + "bom-ref": "d23321c394e71b23", "name": "/usr/bin/readlink", "type": "file" }, { - "bom-ref": "741f7de1ab7e2999", + "bom-ref": "285a442361075ca3", "name": "/usr/bin/realpath", "type": "file" }, { - "bom-ref": "a6322d4b2bd7ad0e", + "bom-ref": "8f7ef95776e15e44", "name": "/usr/bin/rename.ul", "type": "file" }, { - "bom-ref": "2230274522c7d668", + "bom-ref": "b8df22c5cf3a003e", "name": "/usr/bin/renice", "type": "file" }, { - "bom-ref": "1013a27c6e569374", + "bom-ref": "658f94120b97543e", "name": "/usr/bin/resizepart", "type": "file" }, { - "bom-ref": "c8b57779703013b2", + "bom-ref": "273ae13244cf57b8", "name": "/usr/bin/rev", "type": "file" }, { - "bom-ref": "c11737c996231039", + "bom-ref": "63b3ef97bdc9f6ab", "name": "/usr/bin/rgrep", "type": "file" }, { - "bom-ref": "1376a36f68c1e2ee", + "bom-ref": "659d8e71d78863d4", "name": "/usr/bin/rm", "type": "file" }, { - "bom-ref": "49c0937dd23474cd", + "bom-ref": "0f5a63da5ace622b", "name": "/usr/bin/rmdir", "type": "file" }, { - "bom-ref": "25fafb1f6291f50c", + "bom-ref": "ec23e52c6e88d3fb", "name": "/usr/bin/rpcgen", "type": "file" }, { - "bom-ref": "18fc571e17d36b18", + "bom-ref": "48bcebb5fbf6545e", "name": "/usr/bin/run-parts", "type": "file" }, { - "bom-ref": "94a0d891a31a2b3e", + "bom-ref": "ca6d8aac0d2675e4", "name": "/usr/bin/runcon", "type": "file" }, { - "bom-ref": "3bab64800d18a726", + "bom-ref": "67d0214c3a39fcd0", "name": "/usr/bin/savelog", "type": "file" }, { - "bom-ref": "52e7cccbec7e3134", + "bom-ref": "3a5f288c9a010f51", "name": "/usr/bin/scalar", "type": "file" }, { - "bom-ref": "959eba9266a33770", + "bom-ref": "78e39e628233c9ea", "name": "/usr/bin/sccmap", "type": "file" }, { - "bom-ref": "91340a482717fe98", + "bom-ref": "6550d2ba9f7ea849", "name": "/usr/bin/scp", "type": "file" }, { - "bom-ref": "6a28b2e54238d22b", + "bom-ref": "24e1ad5a338db491", "name": "/usr/bin/script", "type": "file" }, { - "bom-ref": "a3bf7e7a31a019c9", + "bom-ref": "35a80a46b67a9f37", "name": "/usr/bin/scriptlive", "type": "file" }, { - "bom-ref": "5c77d0c207f8f71d", + "bom-ref": "c123ff6191eb5497", "name": "/usr/bin/scriptreplay", "type": "file" }, { - "bom-ref": "8fcc8767e46a064f", + "bom-ref": "6f92134002ef7d7d", "name": "/usr/bin/sdiff", "type": "file" }, { - "bom-ref": "795618311a4d88e2", + "bom-ref": "4542b240e3d5ad78", "name": "/usr/bin/sed", "type": "file" }, { - "bom-ref": "310266e35616a5ec", + "bom-ref": "05f5b9746106f996", "name": "/usr/bin/select-editor", "type": "file" }, { - "bom-ref": "7f246fce652efeaa", + "bom-ref": "f5e74689af18caa4", "name": "/usr/bin/sensible-browser", "type": "file" }, { - "bom-ref": "21c18ada62dc2677", + "bom-ref": "1a1f09b2c59f473d", "name": "/usr/bin/sensible-editor", "type": "file" }, { - "bom-ref": "2dc2575efaffee89", + "bom-ref": "62e20dc0ffaad653", "name": "/usr/bin/sensible-pager", "type": "file" }, { - "bom-ref": "67d5b54e6de955a3", + "bom-ref": "a8811e2bb3ef8971", "name": "/usr/bin/sensible-terminal", "type": "file" }, { - "bom-ref": "5f26a2be5a1717bc", + "bom-ref": "1a8b42b0f0d9f866", "name": "/usr/bin/seq", "type": "file" }, { - "bom-ref": "48729e8a73fe48b3", + "bom-ref": "d0c2ade9f9cb7ba9", "name": "/usr/bin/setarch", "type": "file" }, { - "bom-ref": "e2c5da744535a000", + "bom-ref": "305469474960d17f", "name": "/usr/bin/setpci", "type": "file" }, { - "bom-ref": "ea9aaa31e0ff17f7", + "bom-ref": "486ca935e5023cd1", "name": "/usr/bin/setpriv", "type": "file" }, { - "bom-ref": "8a7923476464bf73", + "bom-ref": "9ddf82aa7ce81e3d", "name": "/usr/bin/setsid", "type": "file" }, { - "bom-ref": "fc22d19ddbfd3343", + "bom-ref": "cbacf5ce92f1079d", "name": "/usr/bin/setterm", "type": "file" }, { - "bom-ref": "8fbbc00cfa22b7fb", + "bom-ref": "b261ff0d54cfec62", "name": "/usr/bin/sftp", "type": "file" }, { - "bom-ref": "48b1e31812cc673f", + "bom-ref": "1e5d9724543a3e75", "name": "/usr/bin/sha1sum", "type": "file" }, { - "bom-ref": "569153c344d73ca1", + "bom-ref": "a995f0eedaeec363", "name": "/usr/bin/sha224sum", "type": "file" }, { - "bom-ref": "85cc2980ac6da9c9", + "bom-ref": "cc68690755af3987", "name": "/usr/bin/sha256sum", "type": "file" }, { - "bom-ref": "dd4bd0c29ee13fdf", + "bom-ref": "d962fb101b229bb9", "name": "/usr/bin/sha384sum", "type": "file" }, { - "bom-ref": "795ed4b5436ea98a", + "bom-ref": "8f9648b876ad13f0", "name": "/usr/bin/sha512sum", "type": "file" }, { - "bom-ref": "9261411c6ddc7c7d", + "bom-ref": "6e25664e1a7c3f70", "name": "/usr/bin/shasum", "type": "file" }, { - "bom-ref": "eee3d501343e1c23", + "bom-ref": "03bbdf0c32b90c6d", "name": "/usr/bin/shred", "type": "file" }, { - "bom-ref": "c734fa03988ad9e3", + "bom-ref": "2a412064c144509d", "name": "/usr/bin/shuf", "type": "file" }, { - "bom-ref": "b542b828d97e3c64", + "bom-ref": "804a45425d2f81c6", "name": "/usr/bin/skill", "type": "file" }, { - "bom-ref": "557c46318a6cdb2e", + "bom-ref": "4afc27c273c4c208", "name": "/usr/bin/slabtop", "type": "file" }, { - "bom-ref": "8b5d353ad2660e73", + "bom-ref": "f0e641983ab7bb01", "name": "/usr/bin/sleep", "type": "file" }, { - "bom-ref": "fa1ccc319c06848b", + "bom-ref": "3e74e507470ae7ed", "name": "/usr/bin/sort", "type": "file" }, { - "bom-ref": "081ab8aa52914145", + "bom-ref": "f1efbe6eb7c79ba3", "name": "/usr/bin/sox", "type": "file" }, { - "bom-ref": "48dbd9178b1dd2e6", + "bom-ref": "6116bc658fecd68b", "name": "/usr/bin/splain", "type": "file" }, { - "bom-ref": "5b28d1b55b7bef58", + "bom-ref": "1108bc6819a933d2", "name": "/usr/bin/split", "type": "file" }, { - "bom-ref": "3dd94f12f93e4255", + "bom-ref": "77bfe752e01c2500", "name": "/usr/bin/ssh", "type": "file" }, { - "bom-ref": "4a98894f2cd297e2", + "bom-ref": "0e08f5e6ca8bedf3", "name": "/usr/bin/ssh-add", "type": "file" }, { - "bom-ref": "dc70ec5f773d0f37", + "bom-ref": "007076c17958e03a", "name": "/usr/bin/ssh-agent", "type": "file" }, { - "bom-ref": "209a695242f808a7", + "bom-ref": "b9b1909caf8476b6", "name": "/usr/bin/ssh-argv0", "type": "file" }, { - "bom-ref": "d1763543a8fc2984", + "bom-ref": "dfbfc20d93816ed1", "name": "/usr/bin/ssh-copy-id", "type": "file" }, { - "bom-ref": "895dc3c42442a08f", + "bom-ref": "b2aea976678e1116", "name": "/usr/bin/ssh-keygen", "type": "file" }, { - "bom-ref": "27a7bcf1a240491e", + "bom-ref": "bbce8803f419a427", "name": "/usr/bin/ssh-keyscan", "type": "file" }, { - "bom-ref": "280ffc0c7abab904", + "bom-ref": "1358e05f33c27f92", "name": "/usr/bin/stat", "type": "file" }, { - "bom-ref": "1585b56ea8135db4", + "bom-ref": "f6b97a38ecb615aa", "name": "/usr/bin/stdbuf", "type": "file" }, { - "bom-ref": "3a66cb07d83778fd", + "bom-ref": "f1750413579b24a0", "name": "/usr/bin/streamzip", "type": "file" }, { - "bom-ref": "ce72323adcbc5269", + "bom-ref": "8f22ad3864e01703", "name": "/usr/bin/stty", "type": "file" }, { - "bom-ref": "ef71d3e019b092a6", + "bom-ref": "67ba9fa7b02a16b0", "name": "/usr/bin/su", "type": "file" }, { - "bom-ref": "701c9e78542fac7d", + "bom-ref": "d84b5fec7ecec1bb", "name": "/usr/bin/sum", "type": "file" }, { - "bom-ref": "5a2e209fb71346fd", + "bom-ref": "d586328d28eb2cef", "name": "/usr/bin/sync", "type": "file" }, { - "bom-ref": "2ded894b8a81f0ed", + "bom-ref": "c393798972ad1f2b", "name": "/usr/bin/tabs", "type": "file" }, { - "bom-ref": "0277e49ff719b549", + "bom-ref": "93fd36a6c6d841ff", "name": "/usr/bin/tac", "type": "file" }, { - "bom-ref": "3d53686afc7539c4", + "bom-ref": "a8c636ecba623d9a", "name": "/usr/bin/tail", "type": "file" }, { - "bom-ref": "5faf1d22080634d5", + "bom-ref": "afd2f794f2b56a6f", "name": "/usr/bin/tar", "type": "file" }, { - "bom-ref": "cac08faf601b32e5", + "bom-ref": "2a26e091add9f46f", "name": "/usr/bin/taskset", "type": "file" }, { - "bom-ref": "29d536f8b639db93", + "bom-ref": "5f3035e5f077d8e9", "name": "/usr/bin/tee", "type": "file" }, { - "bom-ref": "e19bad6a143c5c43", + "bom-ref": "fd756c809344badd", "name": "/usr/bin/tempfile", "type": "file" }, { - "bom-ref": "b3da365bc08462f3", + "bom-ref": "b339e2e1b91d1069", "name": "/usr/bin/test", "type": "file" }, { - "bom-ref": "99bfe7319b4facae", + "bom-ref": "6c64aec9f2ec5d5c", "name": "/usr/bin/tic", "type": "file" }, { - "bom-ref": "2447a2c7acd21ca3", + "bom-ref": "c63f1b1078f626ed", "name": "/usr/bin/timeout", "type": "file" }, { - "bom-ref": "404c1a56df50003f", + "bom-ref": "8659aa2636d3a20d", "name": "/usr/bin/tload", "type": "file" }, { - "bom-ref": "45a1a6a98b824ab8", + "bom-ref": "64da0d0ad884ec62", "name": "/usr/bin/toe", "type": "file" }, { - "bom-ref": "c41a306a2410d2c6", + "bom-ref": "b940f0369970011c", "name": "/usr/bin/top", "type": "file" }, { - "bom-ref": "7a1a91b0f06df23e", + "bom-ref": "c4531402654bb488", "name": "/usr/bin/touch", "type": "file" }, { - "bom-ref": "eda624cc6fbb50a9", + "bom-ref": "8be226a0e471070b", "name": "/usr/bin/tput", "type": "file" }, { - "bom-ref": "9f4d9f10e073d7be", + "bom-ref": "1187f9c027c20afc", "name": "/usr/bin/tr", "type": "file" }, { - "bom-ref": "4ddf42918f4f2c45", + "bom-ref": "cdf1f2edf7b5fe67", "name": "/usr/bin/tred", "type": "file" }, { - "bom-ref": "478d4546180d854c", + "bom-ref": "97d339ad98b39ef2", "name": "/usr/bin/true", "type": "file" }, { - "bom-ref": "6d35027719762b0a", + "bom-ref": "53fb078f0a87fb80", "name": "/usr/bin/truncate", "type": "file" }, { - "bom-ref": "277ed953639cba9a", + "bom-ref": "12980c5fe82b27d8", "name": "/usr/bin/tset", "type": "file" }, { - "bom-ref": "b0c8bbd5a1cd5ae9", + "bom-ref": "a1c91c3496d88993", "name": "/usr/bin/tsort", "type": "file" }, { - "bom-ref": "19990d77d3c988d2", + "bom-ref": "4aebb5762eb3e4cc", "name": "/usr/bin/tty", "type": "file" }, { - "bom-ref": "d488679d746ff93d", + "bom-ref": "b3858c538a170597", "name": "/usr/bin/tzselect", "type": "file" }, { - "bom-ref": "3896ec28deac9fa9", + "bom-ref": "6503de90195bcad3", "name": "/usr/bin/ucf", "type": "file" }, { - "bom-ref": "ed7b4ed4c4beb83d", + "bom-ref": "8545fef533b8cb33", "name": "/usr/bin/ucfq", "type": "file" }, { - "bom-ref": "58c28f315c4d3958", + "bom-ref": "be1def5ea053d0ea", "name": "/usr/bin/ucfr", "type": "file" }, { - "bom-ref": "dc0cfaa1a4ca2bd9", + "bom-ref": "7102af67dbc0e4a3", "name": "/usr/bin/uclampset", "type": "file" }, { - "bom-ref": "c6cafbd958c5dd14", + "bom-ref": "823f254b7c39faea", "name": "/usr/bin/uconv", "type": "file" }, { - "bom-ref": "2b696be27363b21d", + "bom-ref": "1c0979269a48ed53", "name": "/usr/bin/umount", "type": "file" }, { - "bom-ref": "fa93fa507497da1c", + "bom-ref": "2dfa2f53c9289cb2", "name": "/usr/bin/uname", "type": "file" }, { - "bom-ref": "3d1d580fc53563a3", + "bom-ref": "954ef03d849a3e01", "name": "/usr/bin/uncompress", "type": "file" }, { - "bom-ref": "6fcbac60b12045b6", + "bom-ref": "4ab4567d43b06398", "name": "/usr/bin/unexpand", "type": "file" }, { - "bom-ref": "d66a3c9f1eb184ed", + "bom-ref": "b612308b2635e467", "name": "/usr/bin/unflatten", "type": "file" }, { - "bom-ref": "2a626ace9ef44ef4", + "bom-ref": "baab49507612907e", "name": "/usr/bin/uniq", "type": "file" }, { - "bom-ref": "2d263354445f8d02", + "bom-ref": "2c101650d5f86964", "name": "/usr/bin/unlink", "type": "file" }, { - "bom-ref": "870503ee05e44f9d", + "bom-ref": "5aef897e0a202563", "name": "/usr/bin/unminimize", "type": "file" }, { - "bom-ref": "95955658229a471f", + "bom-ref": "da6f7a806be0dac1", "name": "/usr/bin/unpigz", "type": "file" }, { - "bom-ref": "6ce75ca2ef1f785a", + "bom-ref": "acfc90c219589c40", "name": "/usr/bin/unshare", "type": "file" }, { - "bom-ref": "dafdae4a5a09d1d1", + "bom-ref": "24b8ae6e8e822e84", "name": "/usr/bin/unzip", "type": "file" }, { - "bom-ref": "b54af5e35547b9dc", + "bom-ref": "e86f6f4baab5c8e9", "name": "/usr/bin/unzipsfx", "type": "file" }, { - "bom-ref": "8179512eebb98987", + "bom-ref": "62d55479bb5d6aa4", "name": "/usr/bin/update-alternatives", "type": "file" }, { - "bom-ref": "bf5b873e331c4502", + "bom-ref": "3fd5532530ff0cb8", "name": "/usr/bin/uptime", "type": "file" }, { - "bom-ref": "8040ab62ab169d62", + "bom-ref": "ee4803a1c542829c", "name": "/usr/bin/users", "type": "file" }, { - "bom-ref": "12bc9ff1f7134d53", + "bom-ref": "a7829a81b79297c9", "name": "/usr/bin/utmpdump", "type": "file" }, { - "bom-ref": "f6dd4e2eda8f55db", + "bom-ref": "178483beb8080a7d", "name": "/usr/bin/vdir", "type": "file" }, { - "bom-ref": "0bff8dfe34af3014", + "bom-ref": "9db10e187a5fba90", "name": "/usr/bin/vim.basic", "type": "file" }, { - "bom-ref": "ae1258418adacb1a", + "bom-ref": "2f256eebcba6b57b", "name": "/usr/bin/vim.tiny", "type": "file" }, { - "bom-ref": "f0590db6fcd15df7", + "bom-ref": "953257f486e3e655", "name": "/usr/bin/vimdot", "type": "file" }, { - "bom-ref": "6307e6eef612c329", + "bom-ref": "81788fad240f7cd1", "name": "/usr/bin/vimtutor", "type": "file" }, { - "bom-ref": "c6c6236bfc9a4a46", + "bom-ref": "432fe76f33c5de58", "name": "/usr/bin/vmstat", "type": "file" }, { - "bom-ref": "76f4216e2a594bf2", + "bom-ref": "e15bcfd7774f334c", "name": "/usr/bin/w", "type": "file" }, { - "bom-ref": "936af57c7756bafc", + "bom-ref": "50ab9be04cbaaa36", "name": "/usr/bin/wall", "type": "file" }, { - "bom-ref": "78d2a2867f3a8d42", + "bom-ref": "dd2260bd35dde15c", "name": "/usr/bin/watch", "type": "file" }, { - "bom-ref": "27993a9437531c3a", + "bom-ref": "676b3ad8fea8c829", "name": "/usr/bin/watchgnupg", "type": "file" }, { - "bom-ref": "4b080bff9445a0ab", + "bom-ref": "807c309589f8d45d", "name": "/usr/bin/wc", "type": "file" }, { - "bom-ref": "ef9c5e8b4c6a2394", + "bom-ref": "d819f8caa392e642", "name": "/usr/bin/wdctl", "type": "file" }, { - "bom-ref": "36916ff11072bc72", + "bom-ref": "22d79ac6c3de5079", "name": "/usr/bin/wget", "type": "file" }, { - "bom-ref": "dd24b58579886eea", + "bom-ref": "6ed767c954f35da4", "name": "/usr/bin/whereis", "type": "file" }, { - "bom-ref": "b924d9bbc681660c", + "bom-ref": "c8645e9ee0eb592a", "name": "/usr/bin/which.debianutils", "type": "file" }, { - "bom-ref": "8a4fdac2f46f6038", + "bom-ref": "19d41a92983fbcb2", "name": "/usr/bin/who", "type": "file" }, { - "bom-ref": "a3fd3a9e015826f7", + "bom-ref": "c1b2daade5be03f1", "name": "/usr/bin/whoami", "type": "file" }, { - "bom-ref": "647623bfd6a4a122", + "bom-ref": "934ed1ca601ee790", "name": "/usr/bin/x86_64-linux-gnu-addr2line", "type": "file" }, { - "bom-ref": "a059c8aa72f9ece4", + "bom-ref": "31337e3ee63cfc36", "name": "/usr/bin/x86_64-linux-gnu-ar", "type": "file" }, { - "bom-ref": "15429124167254d5", + "bom-ref": "d6b0fb30ede650bf", "name": "/usr/bin/x86_64-linux-gnu-as", "type": "file" }, { - "bom-ref": "837df30f589eb6f3", + "bom-ref": "7310710b3390c671", "name": "/usr/bin/x86_64-linux-gnu-c++filt", "type": "file" }, { - "bom-ref": "d8a85f3e0ffbca70", + "bom-ref": "3dbdaba2e56f1cf9", "name": "/usr/bin/x86_64-linux-gnu-cpp-13", "type": "file" }, { - "bom-ref": "2cc4fc481381b9eb", + "bom-ref": "2b2bbe8baac333bd", "name": "/usr/bin/x86_64-linux-gnu-dwp", "type": "file" }, { - "bom-ref": "480a4f888748952c", + "bom-ref": "71e8507e38f9adde", "name": "/usr/bin/x86_64-linux-gnu-elfedit", "type": "file" }, { - "bom-ref": "9b48fb8f7e8410b2", + "bom-ref": "d6c9721a6d6f847f", "name": "/usr/bin/x86_64-linux-gnu-g++-13", "type": "file" }, { - "bom-ref": "20bd5dec2535e52a", + "bom-ref": "c508bcf1e48860f3", "name": "/usr/bin/x86_64-linux-gnu-gcc-13", "type": "file" }, { - "bom-ref": "d8b1ecfff0857683", + "bom-ref": "86373faef0b1153a", "name": "/usr/bin/x86_64-linux-gnu-gcc-ar-13", "type": "file" }, { - "bom-ref": "c727027b1119a3ad", + "bom-ref": "3a76380f018dcc5c", "name": "/usr/bin/x86_64-linux-gnu-gcc-nm-13", "type": "file" }, { - "bom-ref": "58883ec9f815c0a0", + "bom-ref": "245ba80f96dfc7dd", "name": "/usr/bin/x86_64-linux-gnu-gcc-ranlib-13", "type": "file" }, { - "bom-ref": "62ef02e75af9afac", + "bom-ref": "7912d76c8d99feb1", "name": "/usr/bin/x86_64-linux-gnu-gcov-13", "type": "file" }, { - "bom-ref": "b595bb8d63c41130", + "bom-ref": "59ec130150d3258d", "name": "/usr/bin/x86_64-linux-gnu-gcov-dump-13", "type": "file" }, { - "bom-ref": "ee7177a661b9a050", + "bom-ref": "df1b28f676a0fa35", "name": "/usr/bin/x86_64-linux-gnu-gcov-tool-13", "type": "file" }, { - "bom-ref": "1ed67dcdb8479c71", + "bom-ref": "3a5cc36c39e8d8fb", "name": "/usr/bin/x86_64-linux-gnu-gp-archive", "type": "file" }, { - "bom-ref": "007f5eabfa7e5bd3", + "bom-ref": "ff29ca051258f239", "name": "/usr/bin/x86_64-linux-gnu-gp-collect-app", "type": "file" }, { - "bom-ref": "a64072d9f7c9e4d7", + "bom-ref": "f7b545deda1e8c91", "name": "/usr/bin/x86_64-linux-gnu-gp-display-html", "type": "file" }, { - "bom-ref": "a7bf1cd39dae23ac", + "bom-ref": "aa562e265c191f5a", "name": "/usr/bin/x86_64-linux-gnu-gp-display-src", "type": "file" }, { - "bom-ref": "dcd49f063029b052", + "bom-ref": "6dac46aa4eb82ff8", "name": "/usr/bin/x86_64-linux-gnu-gp-display-text", "type": "file" }, { - "bom-ref": "53d8c986ab95bd28", + "bom-ref": "716e59b8065f0b12", "name": "/usr/bin/x86_64-linux-gnu-gprof", "type": "file" }, { - "bom-ref": "cc389a375e31e945", + "bom-ref": "471cc33db361f587", "name": "/usr/bin/x86_64-linux-gnu-gprofng", "type": "file" }, { - "bom-ref": "3ee7e31bedb74779", + "bom-ref": "17ae65d03285bb6b", "name": "/usr/bin/x86_64-linux-gnu-ld.bfd", "type": "file" }, { - "bom-ref": "13558d606eca773a", + "bom-ref": "c2227c51a9e97238", "name": "/usr/bin/x86_64-linux-gnu-ld.gold", "type": "file" }, { - "bom-ref": "236a9d5f8edc086b", + "bom-ref": "0869b9ed1423a252", "name": "/usr/bin/x86_64-linux-gnu-lto-dump-13", "type": "file" }, { - "bom-ref": "ab2d9201ef9a146f", + "bom-ref": "0f449f25698437b1", "name": "/usr/bin/x86_64-linux-gnu-nm", "type": "file" }, { - "bom-ref": "8deb8254e3bb93f0", + "bom-ref": "8b850c2ea8a6f2b2", "name": "/usr/bin/x86_64-linux-gnu-objcopy", "type": "file" }, { - "bom-ref": "ad0f86ff1c69bb31", + "bom-ref": "f807ad23f21c074b", "name": "/usr/bin/x86_64-linux-gnu-objdump", "type": "file" }, { - "bom-ref": "81410cce15c028e3", + "bom-ref": "cb59f1105764b37d", "name": "/usr/bin/x86_64-linux-gnu-python3.12-config", "type": "file" }, { - "bom-ref": "263750ab236b5f05", + "bom-ref": "2334bc1b6f0b96db", "name": "/usr/bin/x86_64-linux-gnu-ranlib", "type": "file" }, { - "bom-ref": "4f82ab781d1870f7", + "bom-ref": "d0adc8f8649c914d", "name": "/usr/bin/x86_64-linux-gnu-readelf", "type": "file" }, { - "bom-ref": "03531224b590a382", + "bom-ref": "d5c76ecd9aca7834", "name": "/usr/bin/x86_64-linux-gnu-size", "type": "file" }, { - "bom-ref": "b5c52e9a51cf43e9", + "bom-ref": "166ecddd65b34f3b", "name": "/usr/bin/x86_64-linux-gnu-strings", "type": "file" }, { - "bom-ref": "96730c3a3f00333b", + "bom-ref": "3a5b28bae20d97c5", "name": "/usr/bin/x86_64-linux-gnu-strip", "type": "file" }, { - "bom-ref": "eea5e3c802c56fc3", + "bom-ref": "51c12f744820a969", "name": "/usr/bin/xargs", "type": "file" }, { - "bom-ref": "be5933430453a00d", + "bom-ref": "26351fc00d2ed12b", "name": "/usr/bin/xml2-config", "type": "file" }, { - "bom-ref": "e8b8d65200306d8e", + "bom-ref": "21c34fac184c8a9f", "name": "/usr/bin/xsubpp", "type": "file" }, { - "bom-ref": "eba0f8e3ececfb8c", + "bom-ref": "b36c0b585b48d175", "name": "/usr/bin/xz", "type": "file" }, { - "bom-ref": "002a8eebe9e671b9", + "bom-ref": "47f2a19b68ba906c", "name": "/usr/bin/xzdiff", "type": "file" }, { - "bom-ref": "ae8f06fbe629c176", + "bom-ref": "070fba8f2a9116d7", "name": "/usr/bin/xzgrep", "type": "file" }, { - "bom-ref": "100299a84dc64e10", + "bom-ref": "1584d48be133780d", "name": "/usr/bin/xzless", "type": "file" }, { - "bom-ref": "88c23175c7727ef5", + "bom-ref": "dd08e4dace4f0a18", "name": "/usr/bin/xzmore", "type": "file" }, { - "bom-ref": "0b98f7ab9fb04467", + "bom-ref": "aa0cc0f21856da6d", "name": "/usr/bin/yes", "type": "file" }, { - "bom-ref": "c82e1b2bd18d74da", + "bom-ref": "68dfa2d3c1613ff8", "name": "/usr/bin/zcat", "type": "file" }, { - "bom-ref": "ef8c5a1d7d4848eb", + "bom-ref": "50f42fc783494b65", "name": "/usr/bin/zcmp", "type": "file" }, { - "bom-ref": "91d287a2e99faa58", + "bom-ref": "ab2a346c084221da", "name": "/usr/bin/zdiff", "type": "file" }, { - "bom-ref": "043db0f19b8f378f", + "bom-ref": "2144802301d6740d", "name": "/usr/bin/zdump", "type": "file" }, { - "bom-ref": "882f930277a29a84", + "bom-ref": "d75f508d84e76002", "name": "/usr/bin/zegrep", "type": "file" }, { - "bom-ref": "ef9f9c73c8bd3486", + "bom-ref": "493826c38d16ef3c", "name": "/usr/bin/zfgrep", "type": "file" }, { - "bom-ref": "fa6279b548a5e7a9", + "bom-ref": "3d8843e5e2a1f98f", "name": "/usr/bin/zforce", "type": "file" }, { - "bom-ref": "d5932f253fce4418", + "bom-ref": "9634bcefca2796fa", "name": "/usr/bin/zgrep", "type": "file" }, { - "bom-ref": "fc6fd58f1ad38a27", + "bom-ref": "cc47f4934d74f81a", "name": "/usr/bin/zipdetails", "type": "file" }, { - "bom-ref": "406e2cdde1489995", + "bom-ref": "e2e1d11604f98b9c", "name": "/usr/bin/zipgrep", "type": "file" }, { - "bom-ref": "a193a62bdbc9af19", + "bom-ref": "b0e95f7741eb3b4c", "name": "/usr/bin/zipinfo", "type": "file" }, { - "bom-ref": "0e285e14c4b93c9d", + "bom-ref": "4785b035e07af2fb", "name": "/usr/bin/zless", "type": "file" }, { - "bom-ref": "bdbf4a9d4dfdbe5a", + "bom-ref": "cdaced333305bab4", "name": "/usr/bin/zmore", "type": "file" }, { - "bom-ref": "e1fd526037696d1d", + "bom-ref": "aa8b8c5b8be445bb", "name": "/usr/bin/znew", "type": "file" }, { - "bom-ref": "dc6106ec24ca092d", + "bom-ref": "9b708433108f906f", "name": "/usr/include/aio.h", "type": "file" }, { - "bom-ref": "1d4b92bdd8b94780", + "bom-ref": "f07801e001aaaeee", "name": "/usr/include/aliases.h", "type": "file" }, { - "bom-ref": "1bc6ff9574746862", + "bom-ref": "f588bdf574952f28", "name": "/usr/include/alloca.h", "type": "file" }, { - "bom-ref": "92942724765c43b7", + "bom-ref": "ff8a186520f425c1", "name": "/usr/include/ar.h", "type": "file" }, { - "bom-ref": "29f384c654d6ad93", + "bom-ref": "bf54337317746e89", "name": "/usr/include/argp.h", "type": "file" }, { - "bom-ref": "fe0f9ecc0d6c0cf9", + "bom-ref": "f2bf41cdf30cc62b", "name": "/usr/include/argz.h", "type": "file" }, { - "bom-ref": "33c659d45c9ccf6f", + "bom-ref": "5dd9de90e9e9f9e9", "name": "/usr/include/arpa/ftp.h", "type": "file" }, { - "bom-ref": "96b6ed1e5ded75de", + "bom-ref": "bc106a198345ee94", "name": "/usr/include/arpa/inet.h", "type": "file" }, { - "bom-ref": "cf943ee591538da8", + "bom-ref": "b5b54ef1e4fd3a06", "name": "/usr/include/arpa/nameser.h", "type": "file" }, { - "bom-ref": "408f176fc6bc3d94", + "bom-ref": "820ead3c32e8d49e", "name": "/usr/include/arpa/nameser_compat.h", "type": "file" }, { - "bom-ref": "5fff6bd7a5e67adb", + "bom-ref": "a06c3de9ad09e14d", "name": "/usr/include/arpa/telnet.h", "type": "file" }, { - "bom-ref": "121b378a108ee9ca", + "bom-ref": "6e8a917de8433898", "name": "/usr/include/arpa/tftp.h", "type": "file" }, { - "bom-ref": "226f2a439308226b", + "bom-ref": "a0ad4219e7744ac8", "name": "/usr/include/asm-generic/auxvec.h", "type": "file" }, { - "bom-ref": "737bbf7619f9ef6d", + "bom-ref": "7d7d4e97ced1f55a", "name": "/usr/include/asm-generic/bitsperlong.h", "type": "file" }, { - "bom-ref": "3e8ee416a4e4d5e8", + "bom-ref": "8e238243914f306f", "name": "/usr/include/asm-generic/bpf_perf_event.h", "type": "file" }, { - "bom-ref": "4861bfad819f41b7", + "bom-ref": "ca3e2f8ef1489ed8", "name": "/usr/include/asm-generic/errno-base.h", "type": "file" }, { - "bom-ref": "57ad9d9a41fcb86c", + "bom-ref": "d6f138c51efbd343", "name": "/usr/include/asm-generic/errno.h", "type": "file" }, { - "bom-ref": "5b43c7650f633631", + "bom-ref": "12b40be130c7695a", "name": "/usr/include/asm-generic/fcntl.h", "type": "file" }, { - "bom-ref": "1ac0e03292aedfb3", + "bom-ref": "6ce3c3f1d34c3aa8", "name": "/usr/include/asm-generic/hugetlb_encode.h", "type": "file" }, { - "bom-ref": "f0a2f841780264cd", + "bom-ref": "6b6c44c9ab379416", "name": "/usr/include/asm-generic/int-l64.h", "type": "file" }, { - "bom-ref": "d1039baa7fa4208d", + "bom-ref": "d423872b449b716a", "name": "/usr/include/asm-generic/int-ll64.h", "type": "file" }, { - "bom-ref": "b2d4c945713d56be", + "bom-ref": "b5a4bd43cd01a2d9", "name": "/usr/include/asm-generic/ioctl.h", "type": "file" }, { - "bom-ref": "9bf53d446211556e", + "bom-ref": "53c561fb6e3e6671", "name": "/usr/include/asm-generic/ioctls.h", "type": "file" }, { - "bom-ref": "fd47dd36ace5c7a3", + "bom-ref": "fadf7fc6ac51816c", "name": "/usr/include/asm-generic/ipcbuf.h", "type": "file" }, { - "bom-ref": "e9b87d748269c426", + "bom-ref": "36a987af2485f435", "name": "/usr/include/asm-generic/kvm_para.h", "type": "file" }, { - "bom-ref": "48ef0ce9b1360e69", + "bom-ref": "ab377dfc2ce4586e", "name": "/usr/include/asm-generic/mman-common.h", "type": "file" }, { - "bom-ref": "0ea735fab70ca1e9", + "bom-ref": "6d87017ace563d02", "name": "/usr/include/asm-generic/mman.h", "type": "file" }, { - "bom-ref": "4f04f2e4b072312d", + "bom-ref": "42c2c0e9613205ae", "name": "/usr/include/asm-generic/msgbuf.h", "type": "file" }, { - "bom-ref": "94e989cb76034bee", + "bom-ref": "2f52a064ee16fff1", "name": "/usr/include/asm-generic/param.h", "type": "file" }, { - "bom-ref": "b69b5735ec3af1e8", + "bom-ref": "8942e0bed29a5e4f", "name": "/usr/include/asm-generic/poll.h", "type": "file" }, { - "bom-ref": "b0d58cff8d067c72", + "bom-ref": "3cbb1b37ac96e811", "name": "/usr/include/asm-generic/posix_types.h", "type": "file" }, { - "bom-ref": "cf7fd3b4bc42d0ea", + "bom-ref": "6de9de434a9f0bd5", "name": "/usr/include/asm-generic/resource.h", "type": "file" }, { - "bom-ref": "00431bf4af0d544b", + "bom-ref": "e580b2a23c3bb60c", "name": "/usr/include/asm-generic/sembuf.h", "type": "file" }, { - "bom-ref": "638d6b076f0fb390", + "bom-ref": "be345eb047b8fcb7", "name": "/usr/include/asm-generic/setup.h", "type": "file" }, { - "bom-ref": "823f743b942275fe", + "bom-ref": "f32fbbd6bb8788f5", "name": "/usr/include/asm-generic/shmbuf.h", "type": "file" }, { - "bom-ref": "3d7e20717f50186f", + "bom-ref": "7a87d34dae03cb14", "name": "/usr/include/asm-generic/siginfo.h", "type": "file" }, { - "bom-ref": "17ba9665a6b6007a", + "bom-ref": "51780c58134289c1", "name": "/usr/include/asm-generic/signal-defs.h", "type": "file" }, { - "bom-ref": "985bfe5be718971d", + "bom-ref": "5d619bd4870ec192", "name": "/usr/include/asm-generic/signal.h", "type": "file" }, { - "bom-ref": "c8139c238cf3af7c", + "bom-ref": "42ba92bf69128383", "name": "/usr/include/asm-generic/socket.h", "type": "file" }, { - "bom-ref": "00fb73c735f2ee74", + "bom-ref": "fe945f37d1e0496b", "name": "/usr/include/asm-generic/sockios.h", "type": "file" }, { - "bom-ref": "67504adb6cd94995", + "bom-ref": "b6ec217fffeaaa1e", "name": "/usr/include/asm-generic/stat.h", "type": "file" }, { - "bom-ref": "de161fb724a3c554", + "bom-ref": "806830b029111c5b", "name": "/usr/include/asm-generic/statfs.h", "type": "file" }, { - "bom-ref": "c915fb4cbd493854", + "bom-ref": "6742b12d64f92923", "name": "/usr/include/asm-generic/swab.h", "type": "file" }, { - "bom-ref": "b3a80d48c45cee5c", + "bom-ref": "cd6f7a3d64307c8b", "name": "/usr/include/asm-generic/termbits-common.h", "type": "file" }, { - "bom-ref": "e6af21eee411c4b0", + "bom-ref": "cb8df1d64cad5b77", "name": "/usr/include/asm-generic/termbits.h", "type": "file" }, { - "bom-ref": "cf8039ce0c6373eb", + "bom-ref": "528a06c0afa50b0c", "name": "/usr/include/asm-generic/termios.h", "type": "file" }, { - "bom-ref": "0644b3d9c8081c16", + "bom-ref": "4080d0e0a4850ba5", "name": "/usr/include/asm-generic/types.h", "type": "file" }, { - "bom-ref": "076a2e3fe68822ce", + "bom-ref": "1dea56dfb98cfac9", "name": "/usr/include/asm-generic/ucontext.h", "type": "file" }, { - "bom-ref": "e309b76288352524", + "bom-ref": "b1a0f4160722434f", "name": "/usr/include/asm-generic/unistd.h", "type": "file" }, { - "bom-ref": "4db9e42a63696bda", + "bom-ref": "b958ec3bca9d0d38", "name": "/usr/include/assert.h", "type": "file" }, { - "bom-ref": "8db728315ba4c9d5", + "bom-ref": "a6a63faab595597b", "name": "/usr/include/byteswap.h", "type": "file" }, { - "bom-ref": "78d9b1bac2e22e9e", + "bom-ref": "491d18cb3d68608c", "name": "/usr/include/bzlib.h", "type": "file" }, { - "bom-ref": "656b76f9329b7f1c", + "bom-ref": "694827784c9ab655", "name": "/usr/include/c++/13/algorithm", "type": "file" }, { - "bom-ref": "f7cae30294ee8599", + "bom-ref": "8fe790f799048e2c", "name": "/usr/include/c++/13/any", "type": "file" }, { - "bom-ref": "f0f239aeaaa90de4", + "bom-ref": "58d83d8a684b8181", "name": "/usr/include/c++/13/array", "type": "file" }, { - "bom-ref": "d142e0fd9ee7786a", + "bom-ref": "9bb8ef5f6b1939a3", "name": "/usr/include/c++/13/atomic", "type": "file" }, { - "bom-ref": "264b97215b550259", + "bom-ref": "24c2103d0bf12ca8", "name": "/usr/include/c++/13/backward/auto_ptr.h", "type": "file" }, { - "bom-ref": "5b5ce65959ae66f3", + "bom-ref": "905974c05a545252", "name": "/usr/include/c++/13/backward/backward_warning.h", "type": "file" }, { - "bom-ref": "8c5c117770831881", + "bom-ref": "a361115b81115bec", "name": "/usr/include/c++/13/backward/binders.h", "type": "file" }, { - "bom-ref": "085300d808fb9410", + "bom-ref": "f7125f961816a141", "name": "/usr/include/c++/13/backward/hash_fun.h", "type": "file" }, { - "bom-ref": "0cfa79a7506d4f41", + "bom-ref": "951f32bd9a01f4f8", "name": "/usr/include/c++/13/backward/hash_map", "type": "file" }, { - "bom-ref": "088d0605d95c8de9", + "bom-ref": "ef8837bc2605ccfc", "name": "/usr/include/c++/13/backward/hash_set", "type": "file" }, { - "bom-ref": "4e607f5557bc90df", + "bom-ref": "a58558e4343238b2", "name": "/usr/include/c++/13/backward/hashtable.h", "type": "file" }, { - "bom-ref": "cbe243c1959bcf19", + "bom-ref": "01469ca2dee1f4f0", "name": "/usr/include/c++/13/backward/strstream", "type": "file" }, { - "bom-ref": "431c691195cd2065", + "bom-ref": "f7a7e9f8867e6e88", "name": "/usr/include/c++/13/barrier", "type": "file" }, { - "bom-ref": "57edf23dd4c92a1e", + "bom-ref": "09a926bc1bc65137", "name": "/usr/include/c++/13/bit", "type": "file" }, { - "bom-ref": "41db566014f61403", + "bom-ref": "4e15dae72324ca46", "name": "/usr/include/c++/13/bits/algorithmfwd.h", "type": "file" }, { - "bom-ref": "74a856ed886ac11c", + "bom-ref": "092c04693d6495d9", "name": "/usr/include/c++/13/bits/align.h", "type": "file" }, { - "bom-ref": "88a599236ce1cca4", + "bom-ref": "2cf45c22e212d68d", "name": "/usr/include/c++/13/bits/alloc_traits.h", "type": "file" }, { - "bom-ref": "c941f95c97843c63", + "bom-ref": "806d329a6ea687aa", "name": "/usr/include/c++/13/bits/allocated_ptr.h", "type": "file" }, { - "bom-ref": "1806072f59962178", + "bom-ref": "4ac6c557c2ef0021", "name": "/usr/include/c++/13/bits/allocator.h", "type": "file" }, { - "bom-ref": "744db7f2114b36dc", + "bom-ref": "b1f54f39d6f39845", "name": "/usr/include/c++/13/bits/atomic_base.h", "type": "file" }, { - "bom-ref": "6bd176aaa0f01520", + "bom-ref": "424f0abc890e4c79", "name": "/usr/include/c++/13/bits/atomic_futex.h", "type": "file" }, { - "bom-ref": "e3fc2f515cfb092d", + "bom-ref": "e796d0922a012dc8", "name": "/usr/include/c++/13/bits/atomic_lockfree_defines.h", "type": "file" }, { - "bom-ref": "a4e78df61ccc101c", + "bom-ref": "8e5d5c0d8fe6653d", "name": "/usr/include/c++/13/bits/atomic_timed_wait.h", "type": "file" }, { - "bom-ref": "2c1203489e46e7b3", + "bom-ref": "1b5dbced44003512", "name": "/usr/include/c++/13/bits/atomic_wait.h", "type": "file" }, { - "bom-ref": "b8ee5eac93a24577", + "bom-ref": "0e39b976497465f2", "name": "/usr/include/c++/13/bits/basic_ios.h", "type": "file" }, { - "bom-ref": "af45268215b3b8b2", + "bom-ref": "4beac853328eb22f", "name": "/usr/include/c++/13/bits/basic_ios.tcc", "type": "file" }, { - "bom-ref": "daf7dae5b58a3f21", + "bom-ref": "85b6a5f4d95297a8", "name": "/usr/include/c++/13/bits/basic_string.h", "type": "file" }, { - "bom-ref": "94253b3c5b6907ba", + "bom-ref": "f18e5a242ed35773", "name": "/usr/include/c++/13/bits/basic_string.tcc", "type": "file" }, { - "bom-ref": "98ac05b00a989a90", + "bom-ref": "7df9a673b972c52d", "name": "/usr/include/c++/13/bits/boost_concept_check.h", "type": "file" }, { - "bom-ref": "a896d32009c548ab", + "bom-ref": "17fd87e22611bb36", "name": "/usr/include/c++/13/bits/c++0x_warning.h", "type": "file" }, { - "bom-ref": "e207d6d3ffdebc90", + "bom-ref": "ffa10c5559b464ad", "name": "/usr/include/c++/13/bits/char_traits.h", "type": "file" }, { - "bom-ref": "84e8b3cda538dbdc", + "bom-ref": "03d5040d9c9d7cc5", "name": "/usr/include/c++/13/bits/charconv.h", "type": "file" }, { - "bom-ref": "3151516880857158", + "bom-ref": "ca8c11300d89af51", "name": "/usr/include/c++/13/bits/chrono.h", "type": "file" }, { - "bom-ref": "865714e8ff6e26ac", + "bom-ref": "ac7be8adb7eb0025", "name": "/usr/include/c++/13/bits/chrono_io.h", "type": "file" }, { - "bom-ref": "0be7afb487c79543", + "bom-ref": "ce40c05d8954113e", "name": "/usr/include/c++/13/bits/codecvt.h", "type": "file" }, { - "bom-ref": "c4121b77b0139c18", + "bom-ref": "7fcf0c5c8466a9fd", "name": "/usr/include/c++/13/bits/concept_check.h", "type": "file" }, { - "bom-ref": "d2ee79e68ec1bb32", + "bom-ref": "043af1a994abbc0b", "name": "/usr/include/c++/13/bits/cow_string.h", "type": "file" }, { - "bom-ref": "828bc46fe1b2e9a8", + "bom-ref": "c1cdffd349e6af11", "name": "/usr/include/c++/13/bits/cpp_type_traits.h", "type": "file" }, { - "bom-ref": "b31269204b5923f8", + "bom-ref": "7dc28ef49896e70d", "name": "/usr/include/c++/13/bits/cxxabi_forced.h", "type": "file" }, { - "bom-ref": "709b1d0ddbd700e4", + "bom-ref": "de3a8eaf2121eef9", "name": "/usr/include/c++/13/bits/cxxabi_init_exception.h", "type": "file" }, { - "bom-ref": "d4c4e2337ec8f51e", + "bom-ref": "8c8808007a69b8e7", "name": "/usr/include/c++/13/bits/deque.tcc", "type": "file" }, { - "bom-ref": "631b4e02c6b594d9", + "bom-ref": "9385e91b3c94efa8", "name": "/usr/include/c++/13/bits/enable_special_members.h", "type": "file" }, { - "bom-ref": "9cf9b0f0425f0e9a", + "bom-ref": "a3a6733dc505e357", "name": "/usr/include/c++/13/bits/erase_if.h", "type": "file" }, { - "bom-ref": "0fc1cfdd8a2b7a33", + "bom-ref": "2cf969d6a2a4b32a", "name": "/usr/include/c++/13/bits/exception.h", "type": "file" }, { - "bom-ref": "4662448de4ec4f36", + "bom-ref": "8fbab70561334947", "name": "/usr/include/c++/13/bits/exception_defines.h", "type": "file" }, { - "bom-ref": "0f22ca1eb8170905", + "bom-ref": "ce2b0b66306aa010", "name": "/usr/include/c++/13/bits/exception_ptr.h", "type": "file" }, { - "bom-ref": "1ef7b0ad0aafc618", + "bom-ref": "ea5f00b57ba2ba85", "name": "/usr/include/c++/13/bits/forward_list.h", "type": "file" }, { - "bom-ref": "86fa86e011fd07ae", + "bom-ref": "632041cdaee29e2f", "name": "/usr/include/c++/13/bits/forward_list.tcc", "type": "file" }, { - "bom-ref": "741c4b0d8e74e025", + "bom-ref": "512db57ba8ff9d24", "name": "/usr/include/c++/13/bits/fs_dir.h", "type": "file" }, { - "bom-ref": "fefc74e468543e54", + "bom-ref": "fe8ac1ce5b95da41", "name": "/usr/include/c++/13/bits/fs_fwd.h", "type": "file" }, { - "bom-ref": "4d7ae9c4efadccbf", + "bom-ref": "175bedd7a3058086", "name": "/usr/include/c++/13/bits/fs_ops.h", "type": "file" }, { - "bom-ref": "69f680b1a5644e69", + "bom-ref": "4c04acd2d712ee64", "name": "/usr/include/c++/13/bits/fs_path.h", "type": "file" }, { - "bom-ref": "ac774cfa88e0620d", + "bom-ref": "3be1cdf43f37c3a4", "name": "/usr/include/c++/13/bits/fstream.tcc", "type": "file" }, { - "bom-ref": "eed8ed8ba4549a1c", + "bom-ref": "098f38090644d2dd", "name": "/usr/include/c++/13/bits/functexcept.h", "type": "file" }, { - "bom-ref": "c70661e72e696ede", + "bom-ref": "3ca224543dd2a7ab", "name": "/usr/include/c++/13/bits/functional_hash.h", "type": "file" }, { - "bom-ref": "b406134d907e20f3", + "bom-ref": "e3b8fa3515f28952", "name": "/usr/include/c++/13/bits/gslice.h", "type": "file" }, { - "bom-ref": "a07bcb9636dafe9e", + "bom-ref": "424cf39d26eb9aa3", "name": "/usr/include/c++/13/bits/gslice_array.h", "type": "file" }, { - "bom-ref": "d4a5043194b45af9", + "bom-ref": "1a2a557751379980", "name": "/usr/include/c++/13/bits/hash_bytes.h", "type": "file" }, { - "bom-ref": "0cfb42f121763adb", + "bom-ref": "e21d4713e43a7796", "name": "/usr/include/c++/13/bits/hashtable.h", "type": "file" }, { - "bom-ref": "024cdebc3cdb8961", + "bom-ref": "37b9cb6cf6222c74", "name": "/usr/include/c++/13/bits/hashtable_policy.h", "type": "file" }, { - "bom-ref": "af3aacd41b30765d", + "bom-ref": "ba8e51ac117626f4", "name": "/usr/include/c++/13/bits/indirect_array.h", "type": "file" }, { - "bom-ref": "93996edeadcb87c8", + "bom-ref": "f9d70d66f629d581", "name": "/usr/include/c++/13/bits/invoke.h", "type": "file" }, { - "bom-ref": "c40183d3ceb6d068", + "bom-ref": "7aae905baf591e1d", "name": "/usr/include/c++/13/bits/ios_base.h", "type": "file" }, { - "bom-ref": "1526e3e6a8a0f8b4", + "bom-ref": "ac750f35d669101d", "name": "/usr/include/c++/13/bits/istream.tcc", "type": "file" }, { - "bom-ref": "7f176703984a0248", + "bom-ref": "4754ed8c86359801", "name": "/usr/include/c++/13/bits/iterator_concepts.h", "type": "file" }, { - "bom-ref": "0423cade4329c821", + "bom-ref": "3b15ff3d955fac78", "name": "/usr/include/c++/13/bits/list.tcc", "type": "file" }, { - "bom-ref": "3ab7a3f5407a4166", + "bom-ref": "eb7e506b4b25952f", "name": "/usr/include/c++/13/bits/locale_classes.h", "type": "file" }, { - "bom-ref": "dab45cf00fd31b5b", + "bom-ref": "115c2d26eff5cd82", "name": "/usr/include/c++/13/bits/locale_classes.tcc", "type": "file" }, { - "bom-ref": "6896472b8050b81c", + "bom-ref": "62c24d31b7e3698d", "name": "/usr/include/c++/13/bits/locale_conv.h", "type": "file" }, { - "bom-ref": "91ccd9183ff2aded", + "bom-ref": "36470c6e83126094", "name": "/usr/include/c++/13/bits/locale_facets.h", "type": "file" }, { - "bom-ref": "60845680aa63f6ac", + "bom-ref": "18b8092bbd3531d9", "name": "/usr/include/c++/13/bits/locale_facets.tcc", "type": "file" }, { - "bom-ref": "954b246c30418e4c", + "bom-ref": "ec6ea24418b15fe1", "name": "/usr/include/c++/13/bits/locale_facets_nonio.h", "type": "file" }, { - "bom-ref": "a9d755199abfd160", + "bom-ref": "b25922172faaaecd", "name": "/usr/include/c++/13/bits/locale_facets_nonio.tcc", "type": "file" }, { - "bom-ref": "580726a6e6fc1d90", + "bom-ref": "53874694c6921031", "name": "/usr/include/c++/13/bits/localefwd.h", "type": "file" }, { - "bom-ref": "8ee751e1ded977bf", + "bom-ref": "728b720d7e365bc6", "name": "/usr/include/c++/13/bits/mask_array.h", "type": "file" }, { - "bom-ref": "f24a8aa8f027eb86", + "bom-ref": "9e5b6dfacac5bc9f", "name": "/usr/include/c++/13/bits/max_size_type.h", "type": "file" }, { - "bom-ref": "ec1a468124899c22", + "bom-ref": "d2274dc2270d386b", "name": "/usr/include/c++/13/bits/memory_resource.h", "type": "file" }, { - "bom-ref": "6e805c5ebb468a0f", + "bom-ref": "803975c74fea7e4a", "name": "/usr/include/c++/13/bits/memoryfwd.h", "type": "file" }, { - "bom-ref": "1559ff861f6f76bf", + "bom-ref": "8db347aaab12798e", "name": "/usr/include/c++/13/bits/mofunc_impl.h", "type": "file" }, { - "bom-ref": "f430b5532fa432c3", + "bom-ref": "6ffeaf4ba2f3cd92", "name": "/usr/include/c++/13/bits/move.h", "type": "file" }, { - "bom-ref": "06ed6d4c523fd61f", + "bom-ref": "79896560a97c1c46", "name": "/usr/include/c++/13/bits/move_only_function.h", "type": "file" }, { - "bom-ref": "3f0c447d0dbd6d5c", + "bom-ref": "bb848502db136801", "name": "/usr/include/c++/13/bits/nested_exception.h", "type": "file" }, { - "bom-ref": "c6bddef9fe457ea4", + "bom-ref": "d477bf5186ee4df1", "name": "/usr/include/c++/13/bits/new_allocator.h", "type": "file" }, { - "bom-ref": "5123d01bfb6c2922", + "bom-ref": "a83a5f1d06530f4b", "name": "/usr/include/c++/13/bits/node_handle.h", "type": "file" }, { - "bom-ref": "2f3bfbbd515209a8", + "bom-ref": "795f6fa7ae7829e9", "name": "/usr/include/c++/13/bits/ostream.tcc", "type": "file" }, { - "bom-ref": "57a5ba33d7b174a3", + "bom-ref": "22c588442e12e466", "name": "/usr/include/c++/13/bits/ostream_insert.h", "type": "file" }, { - "bom-ref": "384e228ddf9f9b03", + "bom-ref": "e69348853c3cf36a", "name": "/usr/include/c++/13/bits/parse_numbers.h", "type": "file" }, { - "bom-ref": "15482a7555b4f7db", + "bom-ref": "5a102defac782366", "name": "/usr/include/c++/13/bits/postypes.h", "type": "file" }, { - "bom-ref": "bc7360e0c9ce83cc", + "bom-ref": "ff3821b8143fe64d", "name": "/usr/include/c++/13/bits/predefined_ops.h", "type": "file" }, { - "bom-ref": "2a136cdca3fdfb6b", + "bom-ref": "cb90cb082dc49c62", "name": "/usr/include/c++/13/bits/ptr_traits.h", "type": "file" }, { - "bom-ref": "da70e72ce39d381b", + "bom-ref": "1de9b35c9d3da2e2", "name": "/usr/include/c++/13/bits/quoted_string.h", "type": "file" }, { - "bom-ref": "80a50f023206d5f1", + "bom-ref": "a92921794cde267c", "name": "/usr/include/c++/13/bits/random.h", "type": "file" }, { - "bom-ref": "6b78b4cb2810239e", + "bom-ref": "a5159e632ef45c4b", "name": "/usr/include/c++/13/bits/random.tcc", "type": "file" }, { - "bom-ref": "f24bc72b67ed729c", + "bom-ref": "5c64caf0ca836cf5", "name": "/usr/include/c++/13/bits/range_access.h", "type": "file" }, { - "bom-ref": "6f564348069ef045", + "bom-ref": "939816cb1da3e8c0", "name": "/usr/include/c++/13/bits/ranges_algo.h", "type": "file" }, { - "bom-ref": "42e43ace178565df", + "bom-ref": "55225ffdd2ec44b6", "name": "/usr/include/c++/13/bits/ranges_algobase.h", "type": "file" }, { - "bom-ref": "f49d454bc95c634d", + "bom-ref": "c183a36f20fed504", "name": "/usr/include/c++/13/bits/ranges_base.h", "type": "file" }, { - "bom-ref": "e4e902dfca3b20b0", + "bom-ref": "d97ae814d28f2441", "name": "/usr/include/c++/13/bits/ranges_cmp.h", "type": "file" }, { - "bom-ref": "bdd7898d0e2addc4", + "bom-ref": "fe0ad92cbfd89a31", "name": "/usr/include/c++/13/bits/ranges_uninitialized.h", "type": "file" }, { - "bom-ref": "5616f43956d46734", + "bom-ref": "4c5cda4191607981", "name": "/usr/include/c++/13/bits/ranges_util.h", "type": "file" }, { - "bom-ref": "bf32698fd987dfe8", + "bom-ref": "590e4098e9a1a691", "name": "/usr/include/c++/13/bits/refwrap.h", "type": "file" }, { - "bom-ref": "d62ab24fac7ad8cc", + "bom-ref": "110a10878f7279f1", "name": "/usr/include/c++/13/bits/regex.h", "type": "file" }, { - "bom-ref": "7faa0fc4abb2f939", + "bom-ref": "07f9ab7185e2b4b0", "name": "/usr/include/c++/13/bits/regex.tcc", "type": "file" }, { - "bom-ref": "a686dc7184fa21b5", + "bom-ref": "2e97f44eaf3f5e94", "name": "/usr/include/c++/13/bits/regex_automaton.h", "type": "file" }, { - "bom-ref": "ccb4a4c493489323", + "bom-ref": "8bded3c5d7cea972", "name": "/usr/include/c++/13/bits/regex_automaton.tcc", "type": "file" }, { - "bom-ref": "f2bd9e628beb1388", + "bom-ref": "17d625b46d4891a1", "name": "/usr/include/c++/13/bits/regex_compiler.h", "type": "file" }, { - "bom-ref": "cc7fcdbe5c617c88", + "bom-ref": "06ce5e9d0baf6a4d", "name": "/usr/include/c++/13/bits/regex_compiler.tcc", "type": "file" }, { - "bom-ref": "926c40f4a0106322", + "bom-ref": "3d3e8bb01a393527", "name": "/usr/include/c++/13/bits/regex_constants.h", "type": "file" }, { - "bom-ref": "df0212f05ace9824", + "bom-ref": "851785b3a87ba55d", "name": "/usr/include/c++/13/bits/regex_error.h", "type": "file" }, { - "bom-ref": "3dfae5d19a799efe", + "bom-ref": "0c40eb12ab0b67ab", "name": "/usr/include/c++/13/bits/regex_executor.h", "type": "file" }, { - "bom-ref": "79709da33bb98bdf", + "bom-ref": "03567ce28da09a3a", "name": "/usr/include/c++/13/bits/regex_executor.tcc", "type": "file" }, { - "bom-ref": "3cd47987dfa09131", + "bom-ref": "dc93f532d62a4afc", "name": "/usr/include/c++/13/bits/regex_scanner.h", "type": "file" }, { - "bom-ref": "0bb33cd7e3a62c1a", + "bom-ref": "efdc5c07d2b246f7", "name": "/usr/include/c++/13/bits/regex_scanner.tcc", "type": "file" }, { - "bom-ref": "e1c79361948d4dad", + "bom-ref": "42f94377220ef694", "name": "/usr/include/c++/13/bits/requires_hosted.h", "type": "file" }, { - "bom-ref": "1aadef4db29bc2f9", + "bom-ref": "8ebb466bb0695f1c", "name": "/usr/include/c++/13/bits/semaphore_base.h", "type": "file" }, { - "bom-ref": "eda24cdec7ab2f9b", + "bom-ref": "2b05ca7f072fef86", "name": "/usr/include/c++/13/bits/shared_ptr.h", "type": "file" }, { - "bom-ref": "999ec58c09ea39bc", + "bom-ref": "f858797af08f4a65", "name": "/usr/include/c++/13/bits/shared_ptr_atomic.h", "type": "file" }, { - "bom-ref": "2c81b7efa6479cda", + "bom-ref": "99fe0e9125920cf7", "name": "/usr/include/c++/13/bits/shared_ptr_base.h", "type": "file" }, { - "bom-ref": "4ceb0e9782860087", + "bom-ref": "c21443d51ef4f212", "name": "/usr/include/c++/13/bits/slice_array.h", "type": "file" }, { - "bom-ref": "6f4ae6f7dba9b70b", + "bom-ref": "b2842fbb13715362", "name": "/usr/include/c++/13/bits/specfun.h", "type": "file" }, { - "bom-ref": "4bf8a128be0ebde3", + "bom-ref": "165fc571bfd25e9e", "name": "/usr/include/c++/13/bits/sstream.tcc", "type": "file" }, { - "bom-ref": "28a98aa1b1a3dbb3", + "bom-ref": "37fee49828595c66", "name": "/usr/include/c++/13/bits/std_abs.h", "type": "file" }, { - "bom-ref": "aabffbfcfbe4e0fe", + "bom-ref": "ce5cffc29654e463", "name": "/usr/include/c++/13/bits/std_function.h", "type": "file" }, { - "bom-ref": "ef75133a13577326", + "bom-ref": "9f5b7ca71cab6423", "name": "/usr/include/c++/13/bits/std_mutex.h", "type": "file" }, { - "bom-ref": "bad3f57daaae2a6f", + "bom-ref": "d9bb9f744d3b0c6e", "name": "/usr/include/c++/13/bits/std_thread.h", "type": "file" }, { - "bom-ref": "859cf42466c0f254", + "bom-ref": "59fee3a5f5b6ea79", "name": "/usr/include/c++/13/bits/stl_algo.h", "type": "file" }, { - "bom-ref": "acf68ce44d893857", + "bom-ref": "d93cbeaa8a2bb936", "name": "/usr/include/c++/13/bits/stl_algobase.h", "type": "file" }, { - "bom-ref": "bcedf63be4a609ca", + "bom-ref": "89b95490d1fb074b", "name": "/usr/include/c++/13/bits/stl_bvector.h", "type": "file" }, { - "bom-ref": "e3d39580a27accf3", + "bom-ref": "f3195240c354ceaa", "name": "/usr/include/c++/13/bits/stl_construct.h", "type": "file" }, { - "bom-ref": "3663ef9e4a255597", + "bom-ref": "fab6ff839a056286", "name": "/usr/include/c++/13/bits/stl_deque.h", "type": "file" }, { - "bom-ref": "a8e4398838f59c88", + "bom-ref": "952a6e15655abb15", "name": "/usr/include/c++/13/bits/stl_function.h", "type": "file" }, { - "bom-ref": "e7d5ddf18a0c858e", + "bom-ref": "d1aa9c1f61feccc3", "name": "/usr/include/c++/13/bits/stl_heap.h", "type": "file" }, { - "bom-ref": "b5b93dacd689da05", + "bom-ref": "a20aff3fd6b15ffc", "name": "/usr/include/c++/13/bits/stl_iterator.h", "type": "file" }, { - "bom-ref": "18778947a6564739", + "bom-ref": "e845497d530128ec", "name": "/usr/include/c++/13/bits/stl_iterator_base_funcs.h", "type": "file" }, { - "bom-ref": "10f2e8471c2d6a01", + "bom-ref": "c40a0218ee9d2e20", "name": "/usr/include/c++/13/bits/stl_iterator_base_types.h", "type": "file" }, { - "bom-ref": "7979f5ebcae2be41", + "bom-ref": "a7dc138e2c598ff0", "name": "/usr/include/c++/13/bits/stl_list.h", "type": "file" }, { - "bom-ref": "f8aeee72292433ea", + "bom-ref": "97e5eca700f34d8f", "name": "/usr/include/c++/13/bits/stl_map.h", "type": "file" }, { - "bom-ref": "2964223bc5fca181", + "bom-ref": "a4f09987e3d2a3d0", "name": "/usr/include/c++/13/bits/stl_multimap.h", "type": "file" }, { - "bom-ref": "1bee08b11bea9278", + "bom-ref": "9088cda681621819", "name": "/usr/include/c++/13/bits/stl_multiset.h", "type": "file" }, { - "bom-ref": "c32b5f87b04b19e8", + "bom-ref": "a319253ef6edd0a5", "name": "/usr/include/c++/13/bits/stl_numeric.h", "type": "file" }, { - "bom-ref": "68b0235ee64e8738", + "bom-ref": "e0b2b2eb7503ea5d", "name": "/usr/include/c++/13/bits/stl_pair.h", "type": "file" }, { - "bom-ref": "8dc498f5ceda30ae", + "bom-ref": "f8afea0cbea7e29b", "name": "/usr/include/c++/13/bits/stl_queue.h", "type": "file" }, { - "bom-ref": "2407de04a557ed6a", + "bom-ref": "4d222fb50b67eb0f", "name": "/usr/include/c++/13/bits/stl_raw_storage_iter.h", "type": "file" }, { - "bom-ref": "9aa9b47fea1a3153", + "bom-ref": "cfc8a941957fed46", "name": "/usr/include/c++/13/bits/stl_relops.h", "type": "file" }, { - "bom-ref": "f548ae30366b2f9d", + "bom-ref": "e179cceb04582590", "name": "/usr/include/c++/13/bits/stl_set.h", "type": "file" }, { - "bom-ref": "49be07595cd95772", + "bom-ref": "8361134a1739bb43", "name": "/usr/include/c++/13/bits/stl_stack.h", "type": "file" }, { - "bom-ref": "cc4e9cfb38496f75", + "bom-ref": "009c895a5822467c", "name": "/usr/include/c++/13/bits/stl_tempbuf.h", "type": "file" }, { - "bom-ref": "325970cfdd0afd69", + "bom-ref": "5ef589d837d20d88", "name": "/usr/include/c++/13/bits/stl_tree.h", "type": "file" }, { - "bom-ref": "510e49ceef217e22", + "bom-ref": "9a007a9353e001db", "name": "/usr/include/c++/13/bits/stl_uninitialized.h", "type": "file" }, { - "bom-ref": "69ff08195d47fc0d", + "bom-ref": "236614493e754d4c", "name": "/usr/include/c++/13/bits/stl_vector.h", "type": "file" }, { - "bom-ref": "0e4f22f7fc853968", + "bom-ref": "3095ccf1825affdd", "name": "/usr/include/c++/13/bits/stream_iterator.h", "type": "file" }, { - "bom-ref": "06fffe08b194fc53", + "bom-ref": "02f53b6a591ae282", "name": "/usr/include/c++/13/bits/streambuf.tcc", "type": "file" }, { - "bom-ref": "ffb57ab3b3a071cf", + "bom-ref": "bde5e66b07d930c2", "name": "/usr/include/c++/13/bits/streambuf_iterator.h", "type": "file" }, { - "bom-ref": "cc8abd72702d33df", + "bom-ref": "53537524f68fcb5a", "name": "/usr/include/c++/13/bits/string_view.tcc", "type": "file" }, { - "bom-ref": "c55c6b23ea6f8e67", + "bom-ref": "f3f7d5862675c956", "name": "/usr/include/c++/13/bits/stringfwd.h", "type": "file" }, { - "bom-ref": "f350d9761b5e626e", + "bom-ref": "05bca8c83daa9f37", "name": "/usr/include/c++/13/bits/this_thread_sleep.h", "type": "file" }, { - "bom-ref": "a4f9621e6c79eacf", + "bom-ref": "25a623bf84035a42", "name": "/usr/include/c++/13/bits/uniform_int_dist.h", "type": "file" }, { - "bom-ref": "3accbbb0930b3e98", + "bom-ref": "a965a457a022b7d1", "name": "/usr/include/c++/13/bits/unique_lock.h", "type": "file" }, { - "bom-ref": "2508aa5e9ff002c0", + "bom-ref": "3bb74490a467db75", "name": "/usr/include/c++/13/bits/unique_ptr.h", "type": "file" }, { - "bom-ref": "d46c9a11189e56b6", + "bom-ref": "0bac1e6f783bfcdf", "name": "/usr/include/c++/13/bits/unordered_map.h", "type": "file" }, { - "bom-ref": "a752ca983a2fbfdf", + "bom-ref": "3ce4b2b1f45467e6", "name": "/usr/include/c++/13/bits/unordered_set.h", "type": "file" }, { - "bom-ref": "7397df3ee5fde27b", + "bom-ref": "1fbe1342c56454ea", "name": "/usr/include/c++/13/bits/uses_allocator.h", "type": "file" }, { - "bom-ref": "a91afe171b917d1b", + "bom-ref": "a3f5c30d5495dc5e", "name": "/usr/include/c++/13/bits/uses_allocator_args.h", "type": "file" }, { - "bom-ref": "5826e29c10ebcb4f", + "bom-ref": "e7225346583439b6", "name": "/usr/include/c++/13/bits/utility.h", "type": "file" }, { - "bom-ref": "e37537ddc1141a60", + "bom-ref": "e6edbe01c1819299", "name": "/usr/include/c++/13/bits/valarray_after.h", "type": "file" }, { - "bom-ref": "73ec38d1379a4d4c", + "bom-ref": "232e0bdfb5042ce9", "name": "/usr/include/c++/13/bits/valarray_array.h", "type": "file" }, { - "bom-ref": "41ca0c0c7ced705c", + "bom-ref": "4c4d1a2413c85565", "name": "/usr/include/c++/13/bits/valarray_array.tcc", "type": "file" }, { - "bom-ref": "c222c1c2a70701ec", + "bom-ref": "11b57235349706e1", "name": "/usr/include/c++/13/bits/valarray_before.h", "type": "file" }, { - "bom-ref": "ba6827cc0bd0ccb8", + "bom-ref": "f874855f1abec2b5", "name": "/usr/include/c++/13/bits/vector.tcc", "type": "file" }, { - "bom-ref": "e3644c73e67e2bad", + "bom-ref": "4e3666b5dcf6f1e0", "name": "/usr/include/c++/13/bitset", "type": "file" }, { - "bom-ref": "81064ece5936e9ef", + "bom-ref": "520073c4f9f34b26", "name": "/usr/include/c++/13/cassert", "type": "file" }, { - "bom-ref": "733af11e0d58e0dd", + "bom-ref": "9d88e2fb73e3ca70", "name": "/usr/include/c++/13/ccomplex", "type": "file" }, { - "bom-ref": "f9564d894d436fee", + "bom-ref": "37ef4d0ef72e9d5f", "name": "/usr/include/c++/13/cctype", "type": "file" }, { - "bom-ref": "dddddd04f4b3fb2d", + "bom-ref": "8bfd5518bb279c14", "name": "/usr/include/c++/13/cerrno", "type": "file" }, { - "bom-ref": "17295605ecc52d8a", + "bom-ref": "94279245c66b6e13", "name": "/usr/include/c++/13/cfenv", "type": "file" }, { - "bom-ref": "bdee39454b5f366e", + "bom-ref": "4ecb520c996c92ff", "name": "/usr/include/c++/13/cfloat", "type": "file" }, { - "bom-ref": "b47bf48274e12d58", + "bom-ref": "0eb44cf19764234d", "name": "/usr/include/c++/13/charconv", "type": "file" }, { - "bom-ref": "8944a39be821cff2", + "bom-ref": "0da1e55d3a170e8f", "name": "/usr/include/c++/13/chrono", "type": "file" }, { - "bom-ref": "cf2ecd116ab39bc6", + "bom-ref": "e419b72c00770117", "name": "/usr/include/c++/13/cinttypes", "type": "file" }, { - "bom-ref": "f023f4b99c93a091", + "bom-ref": "807a47b7b6eb0c1c", "name": "/usr/include/c++/13/ciso646", "type": "file" }, { - "bom-ref": "ed9a2af959a06cd0", + "bom-ref": "636b024ef0bf67d1", "name": "/usr/include/c++/13/climits", "type": "file" }, { - "bom-ref": "b9ef5c3304cb90ba", + "bom-ref": "80ebc1d9572dd557", "name": "/usr/include/c++/13/clocale", "type": "file" }, { - "bom-ref": "1b317fea44ed9b93", + "bom-ref": "01800487df91333e", "name": "/usr/include/c++/13/cmath", "type": "file" }, { - "bom-ref": "dd8180b6835a05d6", + "bom-ref": "0cffd5119d7a7bb7", "name": "/usr/include/c++/13/codecvt", "type": "file" }, { - "bom-ref": "4331861439511d40", + "bom-ref": "25de028f64f70195", "name": "/usr/include/c++/13/compare", "type": "file" }, { - "bom-ref": "0273561d158cd685", + "bom-ref": "b692bf9eb3266270", "name": "/usr/include/c++/13/complex", "type": "file" }, { - "bom-ref": "707c5a97c18df908", + "bom-ref": "0b52b40d94df1479", "name": "/usr/include/c++/13/complex.h", "type": "file" }, { - "bom-ref": "633ad1b9851b6202", + "bom-ref": "78110836cc091993", "name": "/usr/include/c++/13/concepts", "type": "file" }, { - "bom-ref": "54a0e2994ac6ca7c", + "bom-ref": "48fc86b23dbffa55", "name": "/usr/include/c++/13/condition_variable", "type": "file" }, { - "bom-ref": "5e8144a8abe03c66", + "bom-ref": "068aef710d761dc7", "name": "/usr/include/c++/13/coroutine", "type": "file" }, { - "bom-ref": "2b8398544da596f1", + "bom-ref": "468f792b8eed0e04", "name": "/usr/include/c++/13/csetjmp", "type": "file" }, { - "bom-ref": "cd78ab19fc691b61", + "bom-ref": "246b348f16fd5ea4", "name": "/usr/include/c++/13/csignal", "type": "file" }, { - "bom-ref": "8bf5e425442052fe", + "bom-ref": "f95a8fcfd2999027", "name": "/usr/include/c++/13/cstdalign", "type": "file" }, { - "bom-ref": "94e97021e515da24", + "bom-ref": "80352bbb9741fd0d", "name": "/usr/include/c++/13/cstdarg", "type": "file" }, { - "bom-ref": "70977d5ffbab3385", + "bom-ref": "e4da9b2e6c015fd0", "name": "/usr/include/c++/13/cstdbool", "type": "file" }, { - "bom-ref": "e4def97e9ec3c4fa", + "bom-ref": "5b11d220e62469c3", "name": "/usr/include/c++/13/cstddef", "type": "file" }, { - "bom-ref": "a897262b45aeed94", + "bom-ref": "ef57a8e523e1ae0d", "name": "/usr/include/c++/13/cstdint", "type": "file" }, { - "bom-ref": "7e829175e6f81585", + "bom-ref": "4b7d335e2fa4c678", "name": "/usr/include/c++/13/cstdio", "type": "file" }, { - "bom-ref": "3a3584054aee5445", + "bom-ref": "f564825adca91f1c", "name": "/usr/include/c++/13/cstdlib", "type": "file" }, { - "bom-ref": "a76d56923a2632f3", + "bom-ref": "08cdc2f1c225a012", "name": "/usr/include/c++/13/cstring", "type": "file" }, { - "bom-ref": "f02381589bc9bc3b", + "bom-ref": "2085029cf6850a46", "name": "/usr/include/c++/13/ctgmath", "type": "file" }, { - "bom-ref": "6f3613f008489b12", + "bom-ref": "844ac1082f676bb7", "name": "/usr/include/c++/13/ctime", "type": "file" }, { - "bom-ref": "1f9590ba2abb8eae", + "bom-ref": "001f0406cef397df", "name": "/usr/include/c++/13/cuchar", "type": "file" }, { - "bom-ref": "f3ca8799153759ef", + "bom-ref": "5f77bf50d36cb442", "name": "/usr/include/c++/13/cwchar", "type": "file" }, { - "bom-ref": "5a92cf75933bb896", + "bom-ref": "0b34c1f01c040997", "name": "/usr/include/c++/13/cwctype", "type": "file" }, { - "bom-ref": "cdd440e0f1cc1334", + "bom-ref": "70e2d94411363bbd", "name": "/usr/include/c++/13/cxxabi.h", "type": "file" }, { - "bom-ref": "59a936f87e818d3a", + "bom-ref": "0821f35a783c33bb", "name": "/usr/include/c++/13/debug/assertions.h", "type": "file" }, { - "bom-ref": "475a5a7118df632f", + "bom-ref": "2276ffd4ebe285f6", "name": "/usr/include/c++/13/debug/bitset", "type": "file" }, { - "bom-ref": "f3decce75aa06963", + "bom-ref": "1efe6854ab28649e", "name": "/usr/include/c++/13/debug/debug.h", "type": "file" }, { - "bom-ref": "3aeacc9bebf8f8b3", + "bom-ref": "9e20941f99c12afe", "name": "/usr/include/c++/13/debug/deque", "type": "file" }, { - "bom-ref": "2b141cfc3dc7b16d", + "bom-ref": "24bba52c12e888e8", "name": "/usr/include/c++/13/debug/formatter.h", "type": "file" }, { - "bom-ref": "7aa5223e67dff9bf", + "bom-ref": "bcaf3ed65a9e9612", "name": "/usr/include/c++/13/debug/forward_list", "type": "file" }, { - "bom-ref": "e889365ddf0537c8", + "bom-ref": "d5ba73728e136fed", "name": "/usr/include/c++/13/debug/functions.h", "type": "file" }, { - "bom-ref": "46a10b0867903a78", + "bom-ref": "0e2b66e2cdbf1135", "name": "/usr/include/c++/13/debug/helper_functions.h", "type": "file" }, { - "bom-ref": "83c56a991e74335c", + "bom-ref": "05a7dabf30d464e5", "name": "/usr/include/c++/13/debug/list", "type": "file" }, { - "bom-ref": "65a3b1e93b1d959c", + "bom-ref": "62424bd19da31d91", "name": "/usr/include/c++/13/debug/macros.h", "type": "file" }, { - "bom-ref": "d6881673d9173975", + "bom-ref": "d6c6ca9a7fa695e8", "name": "/usr/include/c++/13/debug/map", "type": "file" }, { - "bom-ref": "6413e8160159e9f2", + "bom-ref": "6e1151fd2acef157", "name": "/usr/include/c++/13/debug/map.h", "type": "file" }, { - "bom-ref": "ad4f663e4e7c9a19", + "bom-ref": "ac644ee53ab2ddbc", "name": "/usr/include/c++/13/debug/multimap.h", "type": "file" }, { - "bom-ref": "b7c6a31cad79930a", + "bom-ref": "07c33a2aa32a7593", "name": "/usr/include/c++/13/debug/multiset.h", "type": "file" }, { - "bom-ref": "109e44fd350b6c7b", + "bom-ref": "dddde8a8a86a3a1a", "name": "/usr/include/c++/13/debug/safe_base.h", "type": "file" }, { - "bom-ref": "073c573062eb88d7", + "bom-ref": "4ed6fbd783206136", "name": "/usr/include/c++/13/debug/safe_container.h", "type": "file" }, { - "bom-ref": "c4066b23f143f8d6", + "bom-ref": "cf962c4c6de60dbb", "name": "/usr/include/c++/13/debug/safe_iterator.h", "type": "file" }, { - "bom-ref": "33f7a582114486b3", + "bom-ref": "7be3614737e4d97a", "name": "/usr/include/c++/13/debug/safe_iterator.tcc", "type": "file" }, { - "bom-ref": "0d84f3831b542810", + "bom-ref": "3cea4e9a2fd3ef7d", "name": "/usr/include/c++/13/debug/safe_local_iterator.h", "type": "file" }, { - "bom-ref": "8a514c6dab0398be", + "bom-ref": "6a030b5a25b4d427", "name": "/usr/include/c++/13/debug/safe_local_iterator.tcc", "type": "file" }, { - "bom-ref": "1928a15ca184d15e", + "bom-ref": "daadd680802c2da3", "name": "/usr/include/c++/13/debug/safe_sequence.h", "type": "file" }, { - "bom-ref": "94d83eb2f8af9ef1", + "bom-ref": "7ffe2366cf0869d0", "name": "/usr/include/c++/13/debug/safe_sequence.tcc", "type": "file" }, { - "bom-ref": "8e65081a0cf35c78", + "bom-ref": "03299bef10410a19", "name": "/usr/include/c++/13/debug/safe_unordered_base.h", "type": "file" }, { - "bom-ref": "7fbff56085ad64a1", + "bom-ref": "19426b901e391fd8", "name": "/usr/include/c++/13/debug/safe_unordered_container.h", "type": "file" }, { - "bom-ref": "308df74fcb7aa1a5", + "bom-ref": "f04960520e3b9eb0", "name": "/usr/include/c++/13/debug/safe_unordered_container.tcc", "type": "file" }, { - "bom-ref": "5bbeeb4943cbeb91", + "bom-ref": "dfb5dfb00f5fda10", "name": "/usr/include/c++/13/debug/set", "type": "file" }, { - "bom-ref": "700dd7285038527d", + "bom-ref": "f1dc995406dd063c", "name": "/usr/include/c++/13/debug/set.h", "type": "file" }, { - "bom-ref": "8cfb80ce9f48b2db", + "bom-ref": "92b2e8da447a67a2", "name": "/usr/include/c++/13/debug/stl_iterator.h", "type": "file" }, { - "bom-ref": "827ea99b7d052f89", + "bom-ref": "f6d33148a151035c", "name": "/usr/include/c++/13/debug/string", "type": "file" }, { - "bom-ref": "0f581452dc334d95", + "bom-ref": "3a1297cb59f541a4", "name": "/usr/include/c++/13/debug/unordered_map", "type": "file" }, { - "bom-ref": "54599f91f0020a17", + "bom-ref": "4152b914d5c12326", "name": "/usr/include/c++/13/debug/unordered_set", "type": "file" }, { - "bom-ref": "1cbf4bf02f5c4114", + "bom-ref": "d7a321af191b3c05", "name": "/usr/include/c++/13/debug/vector", "type": "file" }, { - "bom-ref": "4c45874d7c4b1bc4", + "bom-ref": "a6ae8dd7ca747e69", "name": "/usr/include/c++/13/decimal/decimal", "type": "file" }, { - "bom-ref": "dd806499cc2a8e70", + "bom-ref": "fb593803ecb51dd1", "name": "/usr/include/c++/13/decimal/decimal.h", "type": "file" }, { - "bom-ref": "09101cf9f924bea2", + "bom-ref": "acf66aed07e3234f", "name": "/usr/include/c++/13/deque", "type": "file" }, { - "bom-ref": "029590f1a86fa879", + "bom-ref": "84844ba6880ac9f8", "name": "/usr/include/c++/13/exception", "type": "file" }, { - "bom-ref": "fdc6a64308a8bcac", + "bom-ref": "d7fd42d5f21c7b39", "name": "/usr/include/c++/13/execution", "type": "file" }, { - "bom-ref": "0d78a7f7e224001e", + "bom-ref": "fa6e278cf6474e8b", "name": "/usr/include/c++/13/expected", "type": "file" }, { - "bom-ref": "4e1b7037ec09fbc8", + "bom-ref": "bd054ebea6d35ca9", "name": "/usr/include/c++/13/experimental/algorithm", "type": "file" }, { - "bom-ref": "6848b5eb3c195a4d", + "bom-ref": "68ee689b0940a9a8", "name": "/usr/include/c++/13/experimental/any", "type": "file" }, { - "bom-ref": "afaf79318749809e", + "bom-ref": "0bdf8da003d9eef3", "name": "/usr/include/c++/13/experimental/array", "type": "file" }, { - "bom-ref": "267740456786c7d5", + "bom-ref": "dd2326bda81549ec", "name": "/usr/include/c++/13/experimental/bits/fs_dir.h", "type": "file" }, { - "bom-ref": "ad244edb43186e6f", + "bom-ref": "b660343e55269132", "name": "/usr/include/c++/13/experimental/bits/fs_fwd.h", "type": "file" }, { - "bom-ref": "6169cd2bfa3df69b", + "bom-ref": "019866ae0427f182", "name": "/usr/include/c++/13/experimental/bits/fs_ops.h", "type": "file" }, { - "bom-ref": "d09a923d65ad162e", + "bom-ref": "69985441f1d4ace7", "name": "/usr/include/c++/13/experimental/bits/fs_path.h", "type": "file" }, { - "bom-ref": "89cedf8d660c2b72", + "bom-ref": "702117c48e17e38b", "name": "/usr/include/c++/13/experimental/bits/lfts_config.h", "type": "file" }, { - "bom-ref": "3ab81058f21a9739", + "bom-ref": "4211dd54596487e0", "name": "/usr/include/c++/13/experimental/bits/net.h", "type": "file" }, { - "bom-ref": "874c5300d14355fe", + "bom-ref": "c6901a8ba61a1d0b", "name": "/usr/include/c++/13/experimental/bits/numeric_traits.h", "type": "file" }, { - "bom-ref": "e7daed349f83860f", + "bom-ref": "a80512f28d312462", "name": "/usr/include/c++/13/experimental/bits/shared_ptr.h", "type": "file" }, { - "bom-ref": "821617117c12c8d7", + "bom-ref": "88a69c4da61e098a", "name": "/usr/include/c++/13/experimental/bits/simd.h", "type": "file" }, { - "bom-ref": "070b35d2e665cbb9", + "bom-ref": "532739565eca0194", "name": "/usr/include/c++/13/experimental/bits/simd_builtin.h", "type": "file" }, { - "bom-ref": "774010a01e010c74", + "bom-ref": "2af4f95537d6f711", "name": "/usr/include/c++/13/experimental/bits/simd_converter.h", "type": "file" }, { - "bom-ref": "4def3c0909c437f7", + "bom-ref": "f05fad6e70cc0eca", "name": "/usr/include/c++/13/experimental/bits/simd_detail.h", "type": "file" }, { - "bom-ref": "fecca085f1334358", + "bom-ref": "7650efcc94f34ec9", "name": "/usr/include/c++/13/experimental/bits/simd_fixed_size.h", "type": "file" }, { - "bom-ref": "663005b880493e43", + "bom-ref": "dd31675eec7cc57a", "name": "/usr/include/c++/13/experimental/bits/simd_math.h", "type": "file" }, { - "bom-ref": "a041c0566edbcbf9", + "bom-ref": "507d5607227408c0", "name": "/usr/include/c++/13/experimental/bits/simd_neon.h", "type": "file" }, { - "bom-ref": "ffcc1d5e2b8cd580", + "bom-ref": "57e71040d9f77055", "name": "/usr/include/c++/13/experimental/bits/simd_ppc.h", "type": "file" }, { - "bom-ref": "0a9cec5e169d7047", + "bom-ref": "aa6f869b9f0458f2", "name": "/usr/include/c++/13/experimental/bits/simd_scalar.h", "type": "file" }, { - "bom-ref": "f5d94dce414e76c5", + "bom-ref": "ea897f356685b3f0", "name": "/usr/include/c++/13/experimental/bits/simd_x86.h", "type": "file" }, { - "bom-ref": "f7a4a732c5246200", + "bom-ref": "a98373c02216497d", "name": "/usr/include/c++/13/experimental/bits/simd_x86_conversions.h", "type": "file" }, { - "bom-ref": "10fed37a1814827a", + "bom-ref": "900fcb5353fe5af7", "name": "/usr/include/c++/13/experimental/bits/string_view.tcc", "type": "file" }, { - "bom-ref": "d69f435a7227f8ce", + "bom-ref": "ba0c9c5e034c892b", "name": "/usr/include/c++/13/experimental/buffer", "type": "file" }, { - "bom-ref": "ff3ae7129c30c9bd", + "bom-ref": "cea3370f418f7b88", "name": "/usr/include/c++/13/experimental/chrono", "type": "file" }, { - "bom-ref": "c245eb062aba2928", + "bom-ref": "589cb7c859bd0595", "name": "/usr/include/c++/13/experimental/contract", "type": "file" }, { - "bom-ref": "110b7c403217461f", + "bom-ref": "fa692034bbc2ea5a", "name": "/usr/include/c++/13/experimental/deque", "type": "file" }, { - "bom-ref": "5b61e3afc93dc581", + "bom-ref": "d35e26aa75d43714", "name": "/usr/include/c++/13/experimental/executor", "type": "file" }, { - "bom-ref": "b11b3faca35af78c", + "bom-ref": "2da951d550bf1119", "name": "/usr/include/c++/13/experimental/filesystem", "type": "file" }, { - "bom-ref": "6fae0565cd1c0e10", + "bom-ref": "0b733f29d0940b39", "name": "/usr/include/c++/13/experimental/forward_list", "type": "file" }, { - "bom-ref": "b984717a9e8e4131", + "bom-ref": "52b0b1f91cb62368", "name": "/usr/include/c++/13/experimental/functional", "type": "file" }, { - "bom-ref": "c7222d45fcbc0f98", + "bom-ref": "1e5cbc83829695c5", "name": "/usr/include/c++/13/experimental/internet", "type": "file" }, { - "bom-ref": "67c59f6711521de1", + "bom-ref": "f396e14fb8737dcc", "name": "/usr/include/c++/13/experimental/io_context", "type": "file" }, { - "bom-ref": "3ac94344cafd765b", + "bom-ref": "a3f4d632a6f43e1e", "name": "/usr/include/c++/13/experimental/iterator", "type": "file" }, { - "bom-ref": "b10da3647e04fd40", + "bom-ref": "2b56333c303768c9", "name": "/usr/include/c++/13/experimental/list", "type": "file" }, { - "bom-ref": "58e9a36fa4da5686", + "bom-ref": "2d4745a9d9eb7cc7", "name": "/usr/include/c++/13/experimental/map", "type": "file" }, { - "bom-ref": "9670e9ce2f66664a", + "bom-ref": "465bb82e45522cc3", "name": "/usr/include/c++/13/experimental/memory", "type": "file" }, { - "bom-ref": "1ffff5ef6cbd8631", + "bom-ref": "dc21b7c799006120", "name": "/usr/include/c++/13/experimental/memory_resource", "type": "file" }, { - "bom-ref": "034f49c0a840e380", + "bom-ref": "48adb163eaed1561", "name": "/usr/include/c++/13/experimental/net", "type": "file" }, { - "bom-ref": "12f34a8b0838b425", + "bom-ref": "b4c015fcfd2568b0", "name": "/usr/include/c++/13/experimental/netfwd", "type": "file" }, { - "bom-ref": "0853890847b9a2a0", + "bom-ref": "dbdb1ccfe2f3fc89", "name": "/usr/include/c++/13/experimental/numeric", "type": "file" }, { - "bom-ref": "5584e60442ca5ace", + "bom-ref": "89320f0c5e54bf4b", "name": "/usr/include/c++/13/experimental/optional", "type": "file" }, { - "bom-ref": "327c7fb2cb6665bd", + "bom-ref": "cf867e6528282e14", "name": "/usr/include/c++/13/experimental/propagate_const", "type": "file" }, { - "bom-ref": "251627f61ad1f3dc", + "bom-ref": "e3eef9eb2601eb6d", "name": "/usr/include/c++/13/experimental/random", "type": "file" }, { - "bom-ref": "85ab8cfb1e32c3c4", + "bom-ref": "5b60d8ffc8521135", "name": "/usr/include/c++/13/experimental/ratio", "type": "file" }, { - "bom-ref": "fac061e80fb6990a", + "bom-ref": "bd9ca489dce7f953", "name": "/usr/include/c++/13/experimental/regex", "type": "file" }, { - "bom-ref": "15d6b8c4bbb45edb", + "bom-ref": "5ff64f6de502fc12", "name": "/usr/include/c++/13/experimental/scope", "type": "file" }, { - "bom-ref": "44cc61d4f9e16942", + "bom-ref": "ce3f0b098683944b", "name": "/usr/include/c++/13/experimental/set", "type": "file" }, { - "bom-ref": "95df8e22dd908d60", + "bom-ref": "9c53e34b3a009375", "name": "/usr/include/c++/13/experimental/simd", "type": "file" }, { - "bom-ref": "58590d7349723b0e", + "bom-ref": "0641838295d89327", "name": "/usr/include/c++/13/experimental/socket", "type": "file" }, { - "bom-ref": "0302ea3b10746d07", + "bom-ref": "bf56763be31f2bee", "name": "/usr/include/c++/13/experimental/source_location", "type": "file" }, { - "bom-ref": "2aef8024dbb4dff6", + "bom-ref": "010727e036c41877", "name": "/usr/include/c++/13/experimental/string", "type": "file" }, { - "bom-ref": "2e23264257711eb6", + "bom-ref": "58251d7412113493", "name": "/usr/include/c++/13/experimental/string_view", "type": "file" }, { - "bom-ref": "f7fa9e5b7a0dd207", + "bom-ref": "f2a422a8239f9b8e", "name": "/usr/include/c++/13/experimental/synchronized_value", "type": "file" }, { - "bom-ref": "8104d2e14f1ae72b", + "bom-ref": "f529bb8127ddd6e2", "name": "/usr/include/c++/13/experimental/system_error", "type": "file" }, { - "bom-ref": "066f1fb3656ac388", + "bom-ref": "b755fe49032ea22d", "name": "/usr/include/c++/13/experimental/timer", "type": "file" }, { - "bom-ref": "7f2eec81747b026c", + "bom-ref": "e94d956ce9c104f9", "name": "/usr/include/c++/13/experimental/tuple", "type": "file" }, { - "bom-ref": "0bed03106764a36f", + "bom-ref": "c3a8cc752a42da3a", "name": "/usr/include/c++/13/experimental/type_traits", "type": "file" }, { - "bom-ref": "32300123124784d6", + "bom-ref": "37f3043e518cf2f3", "name": "/usr/include/c++/13/experimental/unordered_map", "type": "file" }, { - "bom-ref": "bd0af5fd8c3a0456", + "bom-ref": "4848186a816d769b", "name": "/usr/include/c++/13/experimental/unordered_set", "type": "file" }, { - "bom-ref": "087731b01ad011c9", + "bom-ref": "7aad3c11bbaa09cc", "name": "/usr/include/c++/13/experimental/utility", "type": "file" }, { - "bom-ref": "0d41c27b6d94df3e", + "bom-ref": "14fc9d4697aa3f5f", "name": "/usr/include/c++/13/experimental/vector", "type": "file" }, { - "bom-ref": "516fcea97ce56b53", + "bom-ref": "d57d9ee19e368e1e", "name": "/usr/include/c++/13/ext/algorithm", "type": "file" }, { - "bom-ref": "c5a81df66bf86319", + "bom-ref": "fadb60d8ef23b81c", "name": "/usr/include/c++/13/ext/aligned_buffer.h", "type": "file" }, { - "bom-ref": "61b5f4ce72903545", + "bom-ref": "bd6433874c58aa20", "name": "/usr/include/c++/13/ext/alloc_traits.h", "type": "file" }, { - "bom-ref": "34257ac73e869d86", + "bom-ref": "94511e8107847c77", "name": "/usr/include/c++/13/ext/atomicity.h", "type": "file" }, { - "bom-ref": "ad09a2fe1b1a8098", + "bom-ref": "6bfed05abaeba081", "name": "/usr/include/c++/13/ext/bitmap_allocator.h", "type": "file" }, { - "bom-ref": "5db62a38169aa858", + "bom-ref": "8f58fd3f6b798add", "name": "/usr/include/c++/13/ext/cast.h", "type": "file" }, { - "bom-ref": "f2d25b402f11c732", + "bom-ref": "4ece97d00d4b7493", "name": "/usr/include/c++/13/ext/cmath", "type": "file" }, { - "bom-ref": "6263a56b8b25a834", + "bom-ref": "42102820c03fe699", "name": "/usr/include/c++/13/ext/codecvt_specializations.h", "type": "file" }, { - "bom-ref": "584bebd88a68d9f4", + "bom-ref": "826dd99af589bcf9", "name": "/usr/include/c++/13/ext/concurrence.h", "type": "file" }, { - "bom-ref": "010fe768e7940590", + "bom-ref": "a96b60b0c5f69651", "name": "/usr/include/c++/13/ext/debug_allocator.h", "type": "file" }, { - "bom-ref": "986face29c69eec3", + "bom-ref": "2be0114c0c9a09a6", "name": "/usr/include/c++/13/ext/enc_filebuf.h", "type": "file" }, { - "bom-ref": "311cba3c77f98461", + "bom-ref": "e8c151f6299aee00", "name": "/usr/include/c++/13/ext/extptr_allocator.h", "type": "file" }, { - "bom-ref": "acd81496d575e611", + "bom-ref": "f9ec7d2ff73efc4c", "name": "/usr/include/c++/13/ext/functional", "type": "file" }, { - "bom-ref": "0a7baa815bfb79eb", + "bom-ref": "43b0272890523eb6", "name": "/usr/include/c++/13/ext/hash_map", "type": "file" }, { - "bom-ref": "c637dee6cb79674a", + "bom-ref": "7bcca7b94c77643f", "name": "/usr/include/c++/13/ext/hash_set", "type": "file" }, { - "bom-ref": "0f1d93a03d6141bf", + "bom-ref": "2138a393924d1e82", "name": "/usr/include/c++/13/ext/iterator", "type": "file" }, { - "bom-ref": "1d910ccf1bd9b915", + "bom-ref": "80c626f833416f08", "name": "/usr/include/c++/13/ext/malloc_allocator.h", "type": "file" }, { - "bom-ref": "fd359b9591e867d9", + "bom-ref": "26c8c6b9a6783b98", "name": "/usr/include/c++/13/ext/memory", "type": "file" }, { - "bom-ref": "e1685bf7bec9cc35", + "bom-ref": "d7c0c019d4a5e658", "name": "/usr/include/c++/13/ext/mt_allocator.h", "type": "file" }, { - "bom-ref": "f1a878f34f5c6086", + "bom-ref": "8c2216022f822593", "name": "/usr/include/c++/13/ext/new_allocator.h", "type": "file" }, { - "bom-ref": "e6454b80fc6d8e4d", + "bom-ref": "01f67c73834c5174", "name": "/usr/include/c++/13/ext/numeric", "type": "file" }, { - "bom-ref": "c6fb21f302c8ebe9", + "bom-ref": "b01bc657c3b97874", "name": "/usr/include/c++/13/ext/numeric_traits.h", "type": "file" }, { - "bom-ref": "a3ce99820e6285f1", + "bom-ref": "7caa74c02d8d0378", "name": "/usr/include/c++/13/ext/pb_ds/assoc_container.hpp", "type": "file" }, { - "bom-ref": "1245c1060808420d", + "bom-ref": "438bc2b0a0e19b24", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/bin_search_tree_.hpp", "type": "file" }, { - "bom-ref": "f497d75058ce43e8", + "bom-ref": "ed65518c786c743d", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a5cefdd010cea2b8", + "bom-ref": "ae6517ebeb85809d", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5657eb417d247ed8", + "bom-ref": "2abd7cc5e7a0332d", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0aab4c4981159b81", + "bom-ref": "d323facc9175d2b4", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4fb1bba3f03bb066", + "bom-ref": "192edddc5f7cc7bf", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b3d7b487828d11ce", + "bom-ref": "595cc0e972d0a853", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c8e0afce5c4947a2", + "bom-ref": "adda7f1ae4bc7df3", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e5adbd96b6a3ca05", + "bom-ref": "c811995cd1718730", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/node_iterators.hpp", "type": "file" }, { - "bom-ref": "fb5e05f139c5a494", + "bom-ref": "26e9fb7f2be375e5", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/point_iterators.hpp", "type": "file" }, { - "bom-ref": "978ff06aecc00487", + "bom-ref": "809ddb7bdf655262", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8fde6b23e52be9ce", + "bom-ref": "4de882db4601d833", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/r_erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4f89ff16809269ad", + "bom-ref": "0240e6d6ff2753a8", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/rotate_fn_imps.hpp", "type": "file" }, { - "bom-ref": "401918f933f9ce09", + "bom-ref": "50aebfb071911368", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7e95a754a9457af2", + "bom-ref": "6dfd7e15d84b5d9b", "name": "/usr/include/c++/13/ext/pb_ds/detail/bin_search_tree_/traits.hpp", "type": "file" }, { - "bom-ref": "95a96d4574cb6471", + "bom-ref": "af85910cc5eec6e0", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/binary_heap_.hpp", "type": "file" }, { - "bom-ref": "99492be67fbed23d", + "bom-ref": "ed1d76c085a8e4ac", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/const_iterator.hpp", "type": "file" }, { - "bom-ref": "da16ec4f745bff28", + "bom-ref": "43ac2b941cf290d5", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4f93ece18368a1b5", + "bom-ref": "2465052dd2ca686c", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "02dacf22495aa7f8", + "bom-ref": "8a7b6b43d10cd181", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/entry_cmp.hpp", "type": "file" }, { - "bom-ref": "5060557b72d9ada2", + "bom-ref": "a40047996e9b9c0b", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/entry_pred.hpp", "type": "file" }, { - "bom-ref": "6decc8086f4ff39d", + "bom-ref": "70647d4ed7a2f31c", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "eb6d4dfd67f11fad", + "bom-ref": "9156936b37120ac8", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e1077d6e912682b8", + "bom-ref": "9e1a9452e92bd195", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8efb377a69c78d61", + "bom-ref": "bff8511e73ba194c", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7e412febdd232199", + "bom-ref": "c8f3124c20e281e0", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "599753e696ca0fda", + "bom-ref": "61e7fdf2d25e7bcb", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/point_const_iterator.hpp", "type": "file" }, { - "bom-ref": "4725d5263096d616", + "bom-ref": "3ca9857bb3e14ea3", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d8816b2c6b532c8b", + "bom-ref": "7a29057752360f1e", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/resize_policy.hpp", "type": "file" }, { - "bom-ref": "538ae1be00806dec", + "bom-ref": "1753742557732e71", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d820e846880150d3", + "bom-ref": "89d71f10734af34a", "name": "/usr/include/c++/13/ext/pb_ds/detail/binary_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "757c7b3c20552887", + "bom-ref": "e6afbf2d32df1e22", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_/binomial_heap_.hpp", "type": "file" }, { - "bom-ref": "4a389e336454162d", + "bom-ref": "8888b2f6db8570bc", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "af7f1b83b93cbf8b", + "bom-ref": "6e555585fc5e6d66", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d1e45db2139e0b85", + "bom-ref": "3c8c0433c285e210", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/binomial_heap_base_.hpp", "type": "file" }, { - "bom-ref": "13496cf7679b5bf1", + "bom-ref": "49bf62211812d01c", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "14d16b7a4b07ba17", + "bom-ref": "48cdf79d4d29a9e2", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6e5da5b01e8a4cea", + "bom-ref": "a58ad10572a25b3f", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "3317720e373d1aea", + "bom-ref": "afe42f9fee5adacb", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4902190d64ae46c2", + "bom-ref": "b37a41db959e5c1f", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f11a68f132a922d7", + "bom-ref": "e6cfd06a268e6d42", "name": "/usr/include/c++/13/ext/pb_ds/detail/binomial_heap_base_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "17669d6818a69d1d", + "bom-ref": "564834663b11164c", "name": "/usr/include/c++/13/ext/pb_ds/detail/branch_policy/branch_policy.hpp", "type": "file" }, { - "bom-ref": "681691ca587451d5", + "bom-ref": "dcf5ede0800352a8", "name": "/usr/include/c++/13/ext/pb_ds/detail/branch_policy/null_node_metadata.hpp", "type": "file" }, { - "bom-ref": "50ee3658e038fc9e", + "bom-ref": "d308e8cb8871ac57", "name": "/usr/include/c++/13/ext/pb_ds/detail/branch_policy/traits.hpp", "type": "file" }, { - "bom-ref": "4119eb93959c9468", + "bom-ref": "5c0e16292c22deb9", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp", "type": "file" }, { - "bom-ref": "a26fa08fa27eceac", + "bom-ref": "1cc5e2f29858c8c1", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/cmp_fn_imps.hpp", "type": "file" }, { - "bom-ref": "fff261c67fe32389", + "bom-ref": "a8344bb72e42d1e4", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/cond_key_dtor_entry_dealtor.hpp", "type": "file" }, { - "bom-ref": "cac7eb24dc8d913e", + "bom-ref": "3a01e4eae3404963", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d8593fd372e057ff", + "bom-ref": "25716492bf595d16", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d802dc08c5f05a1a", + "bom-ref": "3ada8d83bd6790a3", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5c3d6191fe681396", + "bom-ref": "6d657249aadcebc3", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "59dfa418d3c1554b", + "bom-ref": "c9668625a5933cce", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/debug_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d7921d41524ce848", + "bom-ref": "916b1fbede92fdf9", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/debug_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4ac1ccc5c919d643", + "bom-ref": "59954cafdcf7dea2", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/entry_list_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f2057642f0bbbfbe", + "bom-ref": "54af9b3d24bd18d3", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "3ce36cfd23cada7d", + "bom-ref": "4d4ce50e61d9be4c", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/erase_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "359f1e459688e588", + "bom-ref": "9f07b52c4556f3b5", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/erase_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b48f22ce5985a260", + "bom-ref": "a8549cd51a4917e9", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ade61b0336b0cd41", + "bom-ref": "ea5e49bfa45550cc", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/find_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ebe789bba394bc8e", + "bom-ref": "18df74dd770d640b", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f0491629b21d5b92", + "bom-ref": "a7822737e640a7cf", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d5eec8b930ae52cc", + "bom-ref": "dc756061e23583e9", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/insert_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "68dddeb4020392d0", + "bom-ref": "4a12b5ba92efa7bd", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/insert_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "cbe183edd994ff95", + "bom-ref": "526be015c16f9bc0", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2e5b7e4a02e4998e", + "bom-ref": "78fa77af3d7ccf63", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "43158108d62c24c2", + "bom-ref": "ddc8fceb382c8be3", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/resize_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7cb950f46e39f480", + "bom-ref": "f970a40274921049", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/resize_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d0e400862a218e26", + "bom-ref": "ea2dc14fe0be526b", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/resize_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c206a3954eeb67cc", + "bom-ref": "634e7a209cffbe89", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/size_fn_imps.hpp", "type": "file" }, { - "bom-ref": "07e8c3018f08a4bc", + "bom-ref": "83b08e0592b7c0f9", "name": "/usr/include/c++/13/ext/pb_ds/detail/cc_hash_table_map_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "fcb2e48b8f1014be", + "bom-ref": "4c17a305897d42c3", "name": "/usr/include/c++/13/ext/pb_ds/detail/cond_dealtor.hpp", "type": "file" }, { - "bom-ref": "3cd44acdb0e25645", + "bom-ref": "bec6f4867d648b88", "name": "/usr/include/c++/13/ext/pb_ds/detail/container_base_dispatch.hpp", "type": "file" }, { - "bom-ref": "c09e3369987b22bb", + "bom-ref": "5a4b6892a3793c8a", "name": "/usr/include/c++/13/ext/pb_ds/detail/debug_map_base.hpp", "type": "file" }, { - "bom-ref": "b8b3d24c69f53a92", + "bom-ref": "ac0c6284a7fbe9eb", "name": "/usr/include/c++/13/ext/pb_ds/detail/eq_fn/eq_by_less.hpp", "type": "file" }, { - "bom-ref": "3f0e356cc026d610", + "bom-ref": "6dc2b6cfde976cc5", "name": "/usr/include/c++/13/ext/pb_ds/detail/eq_fn/hash_eq_fn.hpp", "type": "file" }, { - "bom-ref": "99df6206f2a35e96", + "bom-ref": "25364e5476771c9b", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "efaf514cf37090a8", + "bom-ref": "2bb5550c87e9d4b5", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0bddf584bfea311f", + "bom-ref": "721e4b85318aa3aa", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "325cf62e63545fb6", + "bom-ref": "348b16f1e971e80f", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9fd14f5579bd2317", + "bom-ref": "7ac57e0c89a0aa1a", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/debug_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f1561be3fb1459d4", + "bom-ref": "caed709301372045", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/debug_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "82cf987e396b13df", + "bom-ref": "0ec5c51cd7e30bba", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e8023cbf4f84e6fc", + "bom-ref": "cbf62888eec888f5", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/erase_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8e7c0cdbb4a3721b", + "bom-ref": "f02c6142d455f5f6", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/erase_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "fa46e758bc34ff74", + "bom-ref": "0514eebf37a2efa9", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "21431bfc2171d3ad", + "bom-ref": "79b1ba06eb6cd580", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/find_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7950d1fe364a77f2", + "bom-ref": "256e8a8a2fde0e63", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/find_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7b53a1303d4cc12d", + "bom-ref": "872735129d855a08", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp", "type": "file" }, { - "bom-ref": "edb497b4dddb7890", + "bom-ref": "85e3f43ff88201d1", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "3e7cd6c4c4018328", + "bom-ref": "6c7ed3f78ff81dad", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "59ae313eba7d4c1b", + "bom-ref": "7d6b2e53be71805a", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/insert_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5934d0177b3dff1b", + "bom-ref": "17cee4bb10482016", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/insert_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7589c785bc98b729", + "bom-ref": "2960ac681c07b104", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/iterator_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8aa60d966a3c23d9", + "bom-ref": "b93b086fd0b0a238", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f16dc34574ff8f49", + "bom-ref": "bdd962e9eb7fda58", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/resize_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1116f6bd81af1b5c", + "bom-ref": "c0e483616429aa61", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/resize_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "df39622ef15fd983", + "bom-ref": "2a075b84d85cf7a2", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/resize_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7cd832f47f76abf1", + "bom-ref": "a5f13e2bbe22f6d4", "name": "/usr/include/c++/13/ext/pb_ds/detail/gp_hash_table_map_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6b6445c85919e442", + "bom-ref": "fbcf5a48749e0757", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/direct_mask_range_hashing_imp.hpp", "type": "file" }, { - "bom-ref": "9d78437cc02aad8a", + "bom-ref": "50c38289659e78ef", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/direct_mod_range_hashing_imp.hpp", "type": "file" }, { - "bom-ref": "8829890021e9e741", + "bom-ref": "07f07781d3cab630", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/linear_probe_fn_imp.hpp", "type": "file" }, { - "bom-ref": "0962f0d89d9414cb", + "bom-ref": "0d5873a9dd4de4fa", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/mask_based_range_hashing.hpp", "type": "file" }, { - "bom-ref": "a74d3fe43b643a5d", + "bom-ref": "1230ac20294c6d64", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/mod_based_range_hashing.hpp", "type": "file" }, { - "bom-ref": "e02935cddd64bffa", + "bom-ref": "c80dd755b6a32643", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/probe_fn_base.hpp", "type": "file" }, { - "bom-ref": "4d9a906e83586f21", + "bom-ref": "4ece3ef2685d52c8", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/quadratic_probe_fn_imp.hpp", "type": "file" }, { - "bom-ref": "7c7754792b5db511", + "bom-ref": "f6273dbdf2882224", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/ranged_hash_fn.hpp", "type": "file" }, { - "bom-ref": "1b439daee357ca8c", + "bom-ref": "4efaab3e93e347e1", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/ranged_probe_fn.hpp", "type": "file" }, { - "bom-ref": "15a828f6ebf67407", + "bom-ref": "4e00fd171fa7eb26", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/sample_probe_fn.hpp", "type": "file" }, { - "bom-ref": "422f1473b6eb31eb", + "bom-ref": "0f32e7493b780cae", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/sample_range_hashing.hpp", "type": "file" }, { - "bom-ref": "c2577b1ced1880bb", + "bom-ref": "f8336ffa04ff9bc2", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/sample_ranged_hash_fn.hpp", "type": "file" }, { - "bom-ref": "7790268f6948e922", + "bom-ref": "a8bec99e8d2ad46b", "name": "/usr/include/c++/13/ext/pb_ds/detail/hash_fn/sample_ranged_probe_fn.hpp", "type": "file" }, { - "bom-ref": "0891ec082d632caa", + "bom-ref": "2ddb5072f66197f3", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/const_iterator.hpp", "type": "file" }, { - "bom-ref": "851b606d837da355", + "bom-ref": "b440eb65d8296564", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4452ce4e274f17d3", + "bom-ref": "f5ebedef003a2cda", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1b5abe1b5d3ca13c", + "bom-ref": "658378b5ed2d2805", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "bc21087dce04559e", + "bom-ref": "4cfcf4bfc399054b", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d6640043fff8a529", + "bom-ref": "8d48055b08e72dc0", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "da52a05d1ba4ed66", + "bom-ref": "7e596aaf3d5efed3", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5e4e6aa02cfcb93f", + "bom-ref": "6631db27b46c765e", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/left_child_next_sibling_heap_.hpp", "type": "file" }, { - "bom-ref": "47cf2ca76bbf8d28", + "bom-ref": "dc4e7a9f1f0803d9", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/node.hpp", "type": "file" }, { - "bom-ref": "c27aea8e5c1bf50c", + "bom-ref": "5b4f44c2e98c17bd", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/point_const_iterator.hpp", "type": "file" }, { - "bom-ref": "149df41953df2337", + "bom-ref": "22c548b49cf0e4ba", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5076f2029ec9cbad", + "bom-ref": "ebfc1a6a409337a8", "name": "/usr/include/c++/13/ext/pb_ds/detail/left_child_next_sibling_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "53f198e825e6280d", + "bom-ref": "54c08f4d09f4ebd0", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/constructor_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9247334ab5a60f78", + "bom-ref": "4920051760544915", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "90cfb9ab5d5e3efa", + "bom-ref": "11a2c28bccd35297", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/entry_metadata_base.hpp", "type": "file" }, { - "bom-ref": "10b76569c93a69cc", + "bom-ref": "a8b1cb121edd7525", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4012ae9417f0d379", + "bom-ref": "5839e4a07377f268", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "956585b3baf7f215", + "bom-ref": "0570895d0245d758", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "de980062c9966481", + "bom-ref": "adc24b375d7c156c", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "347a59862c5d3577", + "bom-ref": "4376ec380d12c74e", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "35c06acee55cec75", + "bom-ref": "f9ddda9b797851f8", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/lu_map_.hpp", "type": "file" }, { - "bom-ref": "250572a1f811baa6", + "bom-ref": "940a2dbe6492887f", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_map_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e4cd06272b3eba5e", + "bom-ref": "d4a7a0df1bb70d67", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_policy/lu_counter_metadata.hpp", "type": "file" }, { - "bom-ref": "e84a61f56d682b24", + "bom-ref": "8ca87f1bf8cbd695", "name": "/usr/include/c++/13/ext/pb_ds/detail/list_update_policy/sample_update_policy.hpp", "type": "file" }, { - "bom-ref": "b9a20e7442eac607", + "bom-ref": "502aa3c52291eca2", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1f47a7d7af857e24", + "bom-ref": "bcb23d817408bc79", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "12dca85854876861", + "bom-ref": "290b5aea4e5c23c0", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1c5803c67391abec", + "bom-ref": "8dc59b88a5efe9f1", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "bcf62f1b7d07d47b", + "bom-ref": "963e1978f698e91e", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d7be8b01d20c3343", + "bom-ref": "dc9b7a6f00b20a96", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "138193eceb866e0b", + "bom-ref": "f30a8c0000252f2e", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/node_iterators.hpp", "type": "file" }, { - "bom-ref": "bf3e5dc1977e5d09", + "bom-ref": "af6a23d6cc26f990", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp", "type": "file" }, { - "bom-ref": "fad7dd123af866b8", + "bom-ref": "4b105d4e94dea851", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "649b7f4eb1b8b844", + "bom-ref": "7419945dd4fbdd65", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8a40b09cf2e19149", + "bom-ref": "298a38acfc99ed7c", "name": "/usr/include/c++/13/ext/pb_ds/detail/ov_tree_map_/traits.hpp", "type": "file" }, { - "bom-ref": "530338cc8ca891e9", + "bom-ref": "e3c6ce779899cdec", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "355fee5a0923eb8a", + "bom-ref": "a8feaf6ed671ddf7", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "43f8f0e922c57254", + "bom-ref": "2316e43b62aa27b5", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e5f0006b1304f3cf", + "bom-ref": "9c102c1a2613545e", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a61b97e9fee4d6da", + "bom-ref": "cc66ea9ebde9f2ff", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6cf8ed9c3b104949", + "bom-ref": "b84b66385fc70bd4", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/pairing_heap_.hpp", "type": "file" }, { - "bom-ref": "253edd5565831ebf", + "bom-ref": "2267106a1f6f36f6", "name": "/usr/include/c++/13/ext/pb_ds/detail/pairing_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "83076e42a56cb5fc", + "bom-ref": "b68b72803ebeace9", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "815350bd3d71e6cc", + "bom-ref": "f355e3a85beb1279", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6d7a2b1b9d870b10", + "bom-ref": "7dfdbf1d6fe8edc9", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2b748ba38d7b1683", + "bom-ref": "10f677c435b948d2", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1647a3035a9f73e9", + "bom-ref": "f7e76a3d06f72dec", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1bd112827ba63792", + "bom-ref": "4017bfefe36b26ff", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/insert_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "09ed51d74f5e49c7", + "bom-ref": "60910af0a4c7184a", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "13f8976b2c68545d", + "bom-ref": "1992bce7aa9c9f9c", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/pat_trie_.hpp", "type": "file" }, { - "bom-ref": "56a29359971cd00a", + "bom-ref": "b2e6c897ee713e13", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/pat_trie_base.hpp", "type": "file" }, { - "bom-ref": "a1155347f10b2e1b", + "bom-ref": "3add735779287656", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "74c568879f2a7aa7", + "bom-ref": "f8aa398e17dd07fe", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/r_erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "326f4fc3e1818c18", + "bom-ref": "3737287362732549", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/rotate_fn_imps.hpp", "type": "file" }, { - "bom-ref": "67fa822a7d48c147", + "bom-ref": "ab7a22e21f1bcd9a", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/split_fn_imps.hpp", "type": "file" }, { - "bom-ref": "08f2d6af18aec63f", + "bom-ref": "4decf2877b05d64e", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/synth_access_traits.hpp", "type": "file" }, { - "bom-ref": "49d04442523f93b1", + "bom-ref": "9daff4fd4b8b3018", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d39d395a71d3c0fc", + "bom-ref": "694bdea9edcc0551", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/traits.hpp", "type": "file" }, { - "bom-ref": "81663247427ee7ad", + "bom-ref": "acea21d71164a5c0", "name": "/usr/include/c++/13/ext/pb_ds/detail/pat_trie_/update_fn_imps.hpp", "type": "file" }, { - "bom-ref": "98f514d276a01606", + "bom-ref": "a4193833afe1a8b7", "name": "/usr/include/c++/13/ext/pb_ds/detail/priority_queue_base_dispatch.hpp", "type": "file" }, { - "bom-ref": "de44f410695e1668", + "bom-ref": "5a0e8ca6ae116d81", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d8bd39a0d9a8e1c8", + "bom-ref": "8d283b9dff030fd9", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1423ed4010607791", + "bom-ref": "0170ba15911494f4", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "628d6caea92b04f1", + "bom-ref": "cee617352e5377b0", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a64603dcb34ddf9a", + "bom-ref": "a4ca93f4f023dd9b", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e752382ca56f0156", + "bom-ref": "bc85e171b0646f5f", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b1f48e3dcd729cfc", + "bom-ref": "432d01bf7326b529", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/node.hpp", "type": "file" }, { - "bom-ref": "eaa9123d911926b1", + "bom-ref": "787121893f4df6b0", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp", "type": "file" }, { - "bom-ref": "afc23f77396451aa", + "bom-ref": "cca55fab21ed29eb", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "dba5d060bc50335a", + "bom-ref": "9c21223041059473", "name": "/usr/include/c++/13/ext/pb_ds/detail/rb_tree_map_/traits.hpp", "type": "file" }, { - "bom-ref": "2a6a61a235b190fe", + "bom-ref": "f1816ff63b0437f3", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e96833b01cef3e72", + "bom-ref": "2ac90b67d675d723", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9ac599836a4cdc7e", + "bom-ref": "3b8fa1156bf3050f", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2a3c2d9eac8d0c6b", + "bom-ref": "d6ffecd6db22a0da", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "308b16efdacbcce6", + "bom-ref": "c25228cf33f1e0af", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/rc.hpp", "type": "file" }, { - "bom-ref": "e44c76c56d192a84", + "bom-ref": "18b98d3bd2f9e841", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/rc_binomial_heap_.hpp", "type": "file" }, { - "bom-ref": "79af92484c07dbf9", + "bom-ref": "d35ae592eac4d724", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c894a6632231f386", + "bom-ref": "d58ecd8a914ce417", "name": "/usr/include/c++/13/ext/pb_ds/detail/rc_binomial_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7e110ebf5e36d543", + "bom-ref": "1275ab77e0585b3e", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/cc_hash_max_collision_check_resize_trigger_imp.hpp", "type": "file" }, { - "bom-ref": "24e5bc5b042af813", + "bom-ref": "918f3970f90099be", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/hash_exponential_size_policy_imp.hpp", "type": "file" }, { - "bom-ref": "4873b19aa6a47c74", + "bom-ref": "46ec0d74f32364a5", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_imp.hpp", "type": "file" }, { - "bom-ref": "f78408377d294200", + "bom-ref": "f4fda19648f63a49", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_size_base.hpp", "type": "file" }, { - "bom-ref": "5a95b3129a4a5660", + "bom-ref": "2d5aac0747113e8d", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/hash_prime_size_policy_imp.hpp", "type": "file" }, { - "bom-ref": "7cb74d0ed1e17176", + "bom-ref": "76382f62fc638ba7", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/hash_standard_resize_policy_imp.hpp", "type": "file" }, { - "bom-ref": "99d1e39fb1e7d595", + "bom-ref": "9ffe171e7b33c084", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/sample_resize_policy.hpp", "type": "file" }, { - "bom-ref": "442ba4ce9c2ee509", + "bom-ref": "0d54c11749774c74", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/sample_resize_trigger.hpp", "type": "file" }, { - "bom-ref": "bff2a7b0a35e63fb", + "bom-ref": "9019527a9ad08c86", "name": "/usr/include/c++/13/ext/pb_ds/detail/resize_policy/sample_size_policy.hpp", "type": "file" }, { - "bom-ref": "3bfb0ec6fb7159df", + "bom-ref": "11c24338ea3a3b92", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b74bf744fcfb1b3c", + "bom-ref": "c3bc3dae10fbeae5", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0cc2c1191947fb04", + "bom-ref": "48b9d445abf773a5", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4826e203d2471a1b", + "bom-ref": "d81e27c9332648ae", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b005187aef1b5a43", + "bom-ref": "11a5b8492d66839a", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1b8a386c21295077", + "bom-ref": "3a0769d5ca69a08a", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a01dca94d3717ec7", + "bom-ref": "743ccaac7c8b330a", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/node.hpp", "type": "file" }, { - "bom-ref": "5643ddebda6aeb36", + "bom-ref": "d71efafe132983bf", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp", "type": "file" }, { - "bom-ref": "14871399136d6324", + "bom-ref": "8b73197d608919f5", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/splay_tree_.hpp", "type": "file" }, { - "bom-ref": "cda4173914085024", + "bom-ref": "7feff751f13f91c1", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "15c0e5fad306166f", + "bom-ref": "15c6af3d3d0f3dfe", "name": "/usr/include/c++/13/ext/pb_ds/detail/splay_tree_/traits.hpp", "type": "file" }, { - "bom-ref": "f95832f6b7af0b22", + "bom-ref": "55b91f6da07a35db", "name": "/usr/include/c++/13/ext/pb_ds/detail/standard_policies.hpp", "type": "file" }, { - "bom-ref": "f8e2cb4b7dc024b3", + "bom-ref": "f683e7ee90d41432", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c1450e23c102ba9a", + "bom-ref": "1ba2b3ea1e1c63c3", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e0fca8b3a6cd8137", + "bom-ref": "84c978a0d8bcd212", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "881c70aa406dfa61", + "bom-ref": "e403eb64e2a5790c", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "61069f7e0faf3c63", + "bom-ref": "043f6c731c3123ee", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ab87439e4a35402e", + "bom-ref": "6c7d1c6b7b294eef", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1b4e9de7daaa99d6", + "bom-ref": "deabf06cfdba939b", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/thin_heap_.hpp", "type": "file" }, { - "bom-ref": "ca1efb92b819610a", + "bom-ref": "52cb163c8984493f", "name": "/usr/include/c++/13/ext/pb_ds/detail/thin_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "cacfaf0c0639c58d", + "bom-ref": "d0eafded5f85fce4", "name": "/usr/include/c++/13/ext/pb_ds/detail/tree_policy/node_metadata_selector.hpp", "type": "file" }, { - "bom-ref": "753e26232068077f", + "bom-ref": "22d8868a5743224e", "name": "/usr/include/c++/13/ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp", "type": "file" }, { - "bom-ref": "1ed4fc3893176b9b", + "bom-ref": "58db878400cd7b7e", "name": "/usr/include/c++/13/ext/pb_ds/detail/tree_policy/sample_tree_node_update.hpp", "type": "file" }, { - "bom-ref": "8c032f96e821ba69", + "bom-ref": "8cfed03861e18868", "name": "/usr/include/c++/13/ext/pb_ds/detail/tree_trace_base.hpp", "type": "file" }, { - "bom-ref": "464380a78c8bd70b", + "bom-ref": "3a0a69af3434f772", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/node_metadata_selector.hpp", "type": "file" }, { - "bom-ref": "2ca8bec4096d4391", + "bom-ref": "1cb11df4f4087270", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/order_statistics_imp.hpp", "type": "file" }, { - "bom-ref": "967dadd5f0e0a0bd", + "bom-ref": "459a85c1c07ecc98", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/prefix_search_node_update_imp.hpp", "type": "file" }, { - "bom-ref": "9b65b50338984064", + "bom-ref": "0d71165a016bcb3d", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/sample_trie_access_traits.hpp", "type": "file" }, { - "bom-ref": "e33046dc46d543e0", + "bom-ref": "f9f4331262430c89", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/sample_trie_node_update.hpp", "type": "file" }, { - "bom-ref": "d8cbcaafe8b2ff50", + "bom-ref": "07a79fdee9a589c9", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/trie_policy_base.hpp", "type": "file" }, { - "bom-ref": "d596b4b3edaa8783", + "bom-ref": "d78d3c2b48c43b8e", "name": "/usr/include/c++/13/ext/pb_ds/detail/trie_policy/trie_string_access_traits_imp.hpp", "type": "file" }, { - "bom-ref": "225ad47009403ee6", + "bom-ref": "13fdb28e0fa1937b", "name": "/usr/include/c++/13/ext/pb_ds/detail/type_utils.hpp", "type": "file" }, { - "bom-ref": "6f9142edfbb1720f", + "bom-ref": "ef7f381b1bb1c346", "name": "/usr/include/c++/13/ext/pb_ds/detail/types_traits.hpp", "type": "file" }, { - "bom-ref": "9a206352c21df49b", + "bom-ref": "1bde14296262816e", "name": "/usr/include/c++/13/ext/pb_ds/detail/unordered_iterator/const_iterator.hpp", "type": "file" }, { - "bom-ref": "ce4fc60644702384", + "bom-ref": "cccce42c9f658029", "name": "/usr/include/c++/13/ext/pb_ds/detail/unordered_iterator/iterator.hpp", "type": "file" }, { - "bom-ref": "f3072287bb6ddca4", + "bom-ref": "d806223d3bca7ed9", "name": "/usr/include/c++/13/ext/pb_ds/detail/unordered_iterator/point_const_iterator.hpp", "type": "file" }, { - "bom-ref": "eb4913feb628cdde", + "bom-ref": "dc97b1d973abbb3b", "name": "/usr/include/c++/13/ext/pb_ds/detail/unordered_iterator/point_iterator.hpp", "type": "file" }, { - "bom-ref": "f300d85833fcccb3", + "bom-ref": "cb0d64976e30d23e", "name": "/usr/include/c++/13/ext/pb_ds/exception.hpp", "type": "file" }, { - "bom-ref": "e0d0e92abfaa8ffe", + "bom-ref": "2acf2b3de285920b", "name": "/usr/include/c++/13/ext/pb_ds/hash_policy.hpp", "type": "file" }, { - "bom-ref": "b31765b8b625d512", + "bom-ref": "79ed6d7eb0741497", "name": "/usr/include/c++/13/ext/pb_ds/list_update_policy.hpp", "type": "file" }, { - "bom-ref": "fc89c525fa8fd283", + "bom-ref": "fb2e011e18a7a98a", "name": "/usr/include/c++/13/ext/pb_ds/priority_queue.hpp", "type": "file" }, { - "bom-ref": "481f785eb3d7a692", + "bom-ref": "414e497008c3d62f", "name": "/usr/include/c++/13/ext/pb_ds/tag_and_trait.hpp", "type": "file" }, { - "bom-ref": "78bcd5b12140379f", + "bom-ref": "cc114493d4ad896e", "name": "/usr/include/c++/13/ext/pb_ds/tree_policy.hpp", "type": "file" }, { - "bom-ref": "03df81615c607958", + "bom-ref": "b89a0f7257582b51", "name": "/usr/include/c++/13/ext/pb_ds/trie_policy.hpp", "type": "file" }, { - "bom-ref": "5d8618c3d7d0e362", + "bom-ref": "9fd0e3cf8e3f8fe7", "name": "/usr/include/c++/13/ext/pod_char_traits.h", "type": "file" }, { - "bom-ref": "304aebf3b46d3d1c", + "bom-ref": "412337fe741b60d5", "name": "/usr/include/c++/13/ext/pointer.h", "type": "file" }, { - "bom-ref": "e6555e9b4c254a95", + "bom-ref": "556c52f222b3b9f4", "name": "/usr/include/c++/13/ext/pool_allocator.h", "type": "file" }, { - "bom-ref": "c866d0537db97824", + "bom-ref": "ffe83476c018b4d9", "name": "/usr/include/c++/13/ext/random", "type": "file" }, { - "bom-ref": "cd5dfb5eaab62b4a", + "bom-ref": "02ceb5de174118db", "name": "/usr/include/c++/13/ext/random.tcc", "type": "file" }, { - "bom-ref": "84f33cf5bb3d8dd5", + "bom-ref": "de67608fdf595404", "name": "/usr/include/c++/13/ext/rb_tree", "type": "file" }, { - "bom-ref": "34d3eed933c24bc4", + "bom-ref": "0427f1cd897d1a2d", "name": "/usr/include/c++/13/ext/rc_string_base.h", "type": "file" }, { - "bom-ref": "c1436972141e1f53", + "bom-ref": "5106a62a3c2e3546", "name": "/usr/include/c++/13/ext/rope", "type": "file" }, { - "bom-ref": "165b33f8c32cee7d", + "bom-ref": "47a9aa0372bbc340", "name": "/usr/include/c++/13/ext/ropeimpl.h", "type": "file" }, { - "bom-ref": "83c1db26027e1573", + "bom-ref": "f30fe11e4a315c9a", "name": "/usr/include/c++/13/ext/slist", "type": "file" }, { - "bom-ref": "e52dcb3eed17ac67", + "bom-ref": "7b2899f53a131fbe", "name": "/usr/include/c++/13/ext/sso_string_base.h", "type": "file" }, { - "bom-ref": "b66f1caa75e9c5c3", + "bom-ref": "0a52202d0dc5bdbe", "name": "/usr/include/c++/13/ext/stdio_filebuf.h", "type": "file" }, { - "bom-ref": "18cd7025bb532166", + "bom-ref": "2d005a9e45d92feb", "name": "/usr/include/c++/13/ext/stdio_sync_filebuf.h", "type": "file" }, { - "bom-ref": "e1ddc8f9e92e56c0", + "bom-ref": "60c0eb05a585f80d", "name": "/usr/include/c++/13/ext/string_conversions.h", "type": "file" }, { - "bom-ref": "46ca4d6f90c01d92", + "bom-ref": "4afa65ee7f6c151b", "name": "/usr/include/c++/13/ext/throw_allocator.h", "type": "file" }, { - "bom-ref": "57796ced86325ead", + "bom-ref": "a2587dcc765473c8", "name": "/usr/include/c++/13/ext/type_traits.h", "type": "file" }, { - "bom-ref": "23d86ee7b56e0f5e", + "bom-ref": "c96db237a76e2dff", "name": "/usr/include/c++/13/ext/typelist.h", "type": "file" }, { - "bom-ref": "f5cf343a23570e65", + "bom-ref": "9efbe99f3ff20d68", "name": "/usr/include/c++/13/ext/vstring.h", "type": "file" }, { - "bom-ref": "7cc2cd86c361cb21", + "bom-ref": "7a60c1552101d80c", "name": "/usr/include/c++/13/ext/vstring.tcc", "type": "file" }, { - "bom-ref": "03490ac2de03bb3e", + "bom-ref": "7c8fe1a751efa99b", "name": "/usr/include/c++/13/ext/vstring_fwd.h", "type": "file" }, { - "bom-ref": "5230f6017fb34804", + "bom-ref": "079b8c883d17a449", "name": "/usr/include/c++/13/ext/vstring_util.h", "type": "file" }, { - "bom-ref": "bd900f05a93bcfd7", + "bom-ref": "6b4850a6a52970e6", "name": "/usr/include/c++/13/fenv.h", "type": "file" }, { - "bom-ref": "5d29cf94f3e882be", + "bom-ref": "e366f20d693b83f7", "name": "/usr/include/c++/13/filesystem", "type": "file" }, { - "bom-ref": "3ce2248a06fbcfda", + "bom-ref": "d6e311f15dd6be5f", "name": "/usr/include/c++/13/format", "type": "file" }, { - "bom-ref": "443fe1572a5a681c", + "bom-ref": "aaf528a5e1f95101", "name": "/usr/include/c++/13/forward_list", "type": "file" }, { - "bom-ref": "b8a5f24cbfe42ab8", + "bom-ref": "b1f97ea4e2b24ba1", "name": "/usr/include/c++/13/fstream", "type": "file" }, { - "bom-ref": "6247dbd6e39dcc32", + "bom-ref": "6826b18a179b7b93", "name": "/usr/include/c++/13/functional", "type": "file" }, { - "bom-ref": "4c8444d1186ddf3a", + "bom-ref": "680ecee94173b2ff", "name": "/usr/include/c++/13/future", "type": "file" }, { - "bom-ref": "79fd29b213ea182f", + "bom-ref": "e14b530a373efe56", "name": "/usr/include/c++/13/initializer_list", "type": "file" }, { - "bom-ref": "9de2417c521c9e34", + "bom-ref": "a548dbb7dafeaf79", "name": "/usr/include/c++/13/iomanip", "type": "file" }, { - "bom-ref": "f06db7b8d8feef29", + "bom-ref": "393466650f62c114", "name": "/usr/include/c++/13/ios", "type": "file" }, { - "bom-ref": "10931d52c7b48248", + "bom-ref": "4f3d3fed5ac82609", "name": "/usr/include/c++/13/iosfwd", "type": "file" }, { - "bom-ref": "6739b41fb9c105fe", + "bom-ref": "03b982c3f1948d67", "name": "/usr/include/c++/13/iostream", "type": "file" }, { - "bom-ref": "d141bb94540f5a1b", + "bom-ref": "b675ec8b0039ae62", "name": "/usr/include/c++/13/istream", "type": "file" }, { - "bom-ref": "5847b7ac0b99cd00", + "bom-ref": "50c10570c2af0cb5", "name": "/usr/include/c++/13/iterator", "type": "file" }, { - "bom-ref": "a0d089692166563a", + "bom-ref": "6dd6f9a0a1e82663", "name": "/usr/include/c++/13/latch", "type": "file" }, { - "bom-ref": "1a513132f3dfd0a6", + "bom-ref": "a157a381c33127af", "name": "/usr/include/c++/13/limits", "type": "file" }, { - "bom-ref": "701177e65e81cb0f", + "bom-ref": "9696717925f5b36a", "name": "/usr/include/c++/13/list", "type": "file" }, { - "bom-ref": "ef045b9346fe3dc1", + "bom-ref": "3446a1f9bc5ed12c", "name": "/usr/include/c++/13/locale", "type": "file" }, { - "bom-ref": "8ce9f80d5c7092b4", + "bom-ref": "edaa470e44a76225", "name": "/usr/include/c++/13/map", "type": "file" }, { - "bom-ref": "d6033f724445963b", + "bom-ref": "d90b8131cca0606e", "name": "/usr/include/c++/13/math.h", "type": "file" }, { - "bom-ref": "04b167e20bfde881", + "bom-ref": "505811528dd16424", "name": "/usr/include/c++/13/memory", "type": "file" }, { - "bom-ref": "377af481ac327f77", + "bom-ref": "6db42f046c63b702", "name": "/usr/include/c++/13/memory_resource", "type": "file" }, { - "bom-ref": "1470399a098602c9", + "bom-ref": "73a77fc76cca8e84", "name": "/usr/include/c++/13/mutex", "type": "file" }, { - "bom-ref": "8228d959696cefdc", + "bom-ref": "adcd9030ae6ce8f1", "name": "/usr/include/c++/13/new", "type": "file" }, { - "bom-ref": "7e92ee9957649495", + "bom-ref": "056105a45771b114", "name": "/usr/include/c++/13/numbers", "type": "file" }, { - "bom-ref": "b213154f5074bc43", + "bom-ref": "a089687dae405cb2", "name": "/usr/include/c++/13/numeric", "type": "file" }, { - "bom-ref": "f28cd69830093de5", + "bom-ref": "1c36411db7e5258c", "name": "/usr/include/c++/13/optional", "type": "file" }, { - "bom-ref": "c790e2bb591f374c", + "bom-ref": "1d6d038af28ba8f5", "name": "/usr/include/c++/13/ostream", "type": "file" }, { - "bom-ref": "74842e3d567ba18e", + "bom-ref": "809ae6db90305cef", "name": "/usr/include/c++/13/parallel/algo.h", "type": "file" }, { - "bom-ref": "2217530e54e1231b", + "bom-ref": "28fcd53416398c36", "name": "/usr/include/c++/13/parallel/algobase.h", "type": "file" }, { - "bom-ref": "2ec5d70c85884767", + "bom-ref": "47c5b52f93efb03a", "name": "/usr/include/c++/13/parallel/algorithm", "type": "file" }, { - "bom-ref": "554832168d5ab965", + "bom-ref": "67d48ee6a90beb2c", "name": "/usr/include/c++/13/parallel/algorithmfwd.h", "type": "file" }, { - "bom-ref": "79ad3dee433c1c1e", + "bom-ref": "8433fed9d49e0787", "name": "/usr/include/c++/13/parallel/balanced_quicksort.h", "type": "file" }, { - "bom-ref": "21171910accd6a75", + "bom-ref": "0112d58bab036c5c", "name": "/usr/include/c++/13/parallel/base.h", "type": "file" }, { - "bom-ref": "ca8d1870d0eb74b6", + "bom-ref": "68d3fef2110e7b8f", "name": "/usr/include/c++/13/parallel/basic_iterator.h", "type": "file" }, { - "bom-ref": "76a3cb6b0a57c90d", + "bom-ref": "ec275afdb08a4864", "name": "/usr/include/c++/13/parallel/checkers.h", "type": "file" }, { - "bom-ref": "8328a077b43360df", + "bom-ref": "449bf50f8d23c3e6", "name": "/usr/include/c++/13/parallel/compatibility.h", "type": "file" }, { - "bom-ref": "a77cd45213ea4fd8", + "bom-ref": "ed11d94c5975ae0d", "name": "/usr/include/c++/13/parallel/compiletime_settings.h", "type": "file" }, { - "bom-ref": "e814335b6511d73d", + "bom-ref": "fdf98f0272d5314c", "name": "/usr/include/c++/13/parallel/equally_split.h", "type": "file" }, { - "bom-ref": "0ab65d1252ffbd34", + "bom-ref": "65f20272d54bddbd", "name": "/usr/include/c++/13/parallel/features.h", "type": "file" }, { - "bom-ref": "7f5c85372bebaf53", + "bom-ref": "5047fce2dd9109c6", "name": "/usr/include/c++/13/parallel/find.h", "type": "file" }, { - "bom-ref": "52537fe4f3bf3eac", + "bom-ref": "3035e63745c1d439", "name": "/usr/include/c++/13/parallel/find_selectors.h", "type": "file" }, { - "bom-ref": "ac0c161bbad6110e", + "bom-ref": "81cb1c71b4451c83", "name": "/usr/include/c++/13/parallel/for_each.h", "type": "file" }, { - "bom-ref": "97c6c7ea443920cf", + "bom-ref": "20023598af1b6cae", "name": "/usr/include/c++/13/parallel/for_each_selectors.h", "type": "file" }, { - "bom-ref": "32bc37fd4695adc1", + "bom-ref": "e4b6ff805ac7f31c", "name": "/usr/include/c++/13/parallel/iterator.h", "type": "file" }, { - "bom-ref": "3aafb1780148474b", + "bom-ref": "db7051feb71b8e4a", "name": "/usr/include/c++/13/parallel/list_partition.h", "type": "file" }, { - "bom-ref": "eaebfbac952f6d72", + "bom-ref": "be57a5d45a1bc653", "name": "/usr/include/c++/13/parallel/losertree.h", "type": "file" }, { - "bom-ref": "dfa93ce00e98308a", + "bom-ref": "9d75b73652f62893", "name": "/usr/include/c++/13/parallel/merge.h", "type": "file" }, { - "bom-ref": "2b766af9876b923f", + "bom-ref": "0e0e9a42a805e4ba", "name": "/usr/include/c++/13/parallel/multiseq_selection.h", "type": "file" }, { - "bom-ref": "0e948868620d4295", + "bom-ref": "ef686ef1496422b8", "name": "/usr/include/c++/13/parallel/multiway_merge.h", "type": "file" }, { - "bom-ref": "2613b10f67b37be9", + "bom-ref": "4dcb92e1bbbc6aa0", "name": "/usr/include/c++/13/parallel/multiway_mergesort.h", "type": "file" }, { - "bom-ref": "6eaa4647200eb57b", + "bom-ref": "8fdbbd3d548d54de", "name": "/usr/include/c++/13/parallel/numeric", "type": "file" }, { - "bom-ref": "fc74f10b43280585", + "bom-ref": "fd16c581d4abfbb4", "name": "/usr/include/c++/13/parallel/numericfwd.h", "type": "file" }, { - "bom-ref": "459cd702cbc3f486", + "bom-ref": "48679cb8a4310a27", "name": "/usr/include/c++/13/parallel/omp_loop.h", "type": "file" }, { - "bom-ref": "318ef374ac6098dd", + "bom-ref": "c557ae3202118590", "name": "/usr/include/c++/13/parallel/omp_loop_static.h", "type": "file" }, { - "bom-ref": "85f6fe5059116912", + "bom-ref": "45f5add96e90c31f", "name": "/usr/include/c++/13/parallel/par_loop.h", "type": "file" }, { - "bom-ref": "a8d7f87ba5e46a17", + "bom-ref": "3eed6766c51885f6", "name": "/usr/include/c++/13/parallel/parallel.h", "type": "file" }, { - "bom-ref": "c56bf4ecebd8ac32", + "bom-ref": "fee449cf48422063", "name": "/usr/include/c++/13/parallel/partial_sum.h", "type": "file" }, { - "bom-ref": "2f5d3cd5bab8452f", + "bom-ref": "b819b23ca2eff306", "name": "/usr/include/c++/13/parallel/partition.h", "type": "file" }, { - "bom-ref": "5fee8596d10a587a", + "bom-ref": "e66cd4e0cdb8cf2f", "name": "/usr/include/c++/13/parallel/queue.h", "type": "file" }, { - "bom-ref": "344550a09691ad7f", + "bom-ref": "0a68c30401c20992", "name": "/usr/include/c++/13/parallel/quicksort.h", "type": "file" }, { - "bom-ref": "481f4db37819675c", + "bom-ref": "10a7cbdd521ba501", "name": "/usr/include/c++/13/parallel/random_number.h", "type": "file" }, { - "bom-ref": "ed8d6ce7e62d8615", + "bom-ref": "9d65092e1ec40858", "name": "/usr/include/c++/13/parallel/random_shuffle.h", "type": "file" }, { - "bom-ref": "00d319caf8976168", + "bom-ref": "f45e3f25c5207f69", "name": "/usr/include/c++/13/parallel/search.h", "type": "file" }, { - "bom-ref": "00f9882c8273dec8", + "bom-ref": "5e757962dd64cf45", "name": "/usr/include/c++/13/parallel/set_operations.h", "type": "file" }, { - "bom-ref": "85638a3ef208b805", + "bom-ref": "9aa1335959742b6c", "name": "/usr/include/c++/13/parallel/settings.h", "type": "file" }, { - "bom-ref": "d7551a525a629f53", + "bom-ref": "6783464979fa2cea", "name": "/usr/include/c++/13/parallel/sort.h", "type": "file" }, { - "bom-ref": "a481cc4ebe182d8b", + "bom-ref": "269c0a639b324b0e", "name": "/usr/include/c++/13/parallel/tags.h", "type": "file" }, { - "bom-ref": "654e483b6d529ab8", + "bom-ref": "ee033b9ffe8dbd19", "name": "/usr/include/c++/13/parallel/types.h", "type": "file" }, { - "bom-ref": "011c0c5176427d6e", + "bom-ref": "fb87f9a502d70dd7", "name": "/usr/include/c++/13/parallel/unique_copy.h", "type": "file" }, { - "bom-ref": "b5ca048eacce26f6", + "bom-ref": "c2aa0c795b30312f", "name": "/usr/include/c++/13/parallel/workstealing.h", "type": "file" }, { - "bom-ref": "e815efa8ad210f01", + "bom-ref": "38f053101876f578", "name": "/usr/include/c++/13/pstl/algorithm_fwd.h", "type": "file" }, { - "bom-ref": "3a8e922320e54cb5", + "bom-ref": "a4bea3f71acec728", "name": "/usr/include/c++/13/pstl/algorithm_impl.h", "type": "file" }, { - "bom-ref": "ec176eebe94fe801", + "bom-ref": "1d954cf007ee2f94", "name": "/usr/include/c++/13/pstl/execution_defs.h", "type": "file" }, { - "bom-ref": "132f928abd44db7c", + "bom-ref": "b012ae2e07bc2179", "name": "/usr/include/c++/13/pstl/execution_impl.h", "type": "file" }, { - "bom-ref": "7ab5351ddce7478a", + "bom-ref": "e876cac3a3148ed3", "name": "/usr/include/c++/13/pstl/glue_algorithm_defs.h", "type": "file" }, { - "bom-ref": "6e4da9fb1c9040b1", + "bom-ref": "1ef3b74c23101254", "name": "/usr/include/c++/13/pstl/glue_algorithm_impl.h", "type": "file" }, { - "bom-ref": "af8df3555f63477d", + "bom-ref": "098ed50709f4829c", "name": "/usr/include/c++/13/pstl/glue_execution_defs.h", "type": "file" }, { - "bom-ref": "296fb88b2141a7f6", + "bom-ref": "68e139b342395523", "name": "/usr/include/c++/13/pstl/glue_memory_defs.h", "type": "file" }, { - "bom-ref": "a7a4d3fe1937978f", + "bom-ref": "373ff06629ab900a", "name": "/usr/include/c++/13/pstl/glue_memory_impl.h", "type": "file" }, { - "bom-ref": "6bd0c93172bc76ea", + "bom-ref": "a0c5de6e196d4623", "name": "/usr/include/c++/13/pstl/glue_numeric_defs.h", "type": "file" }, { - "bom-ref": "937034415da1869b", + "bom-ref": "2cdc7f82de17d76e", "name": "/usr/include/c++/13/pstl/glue_numeric_impl.h", "type": "file" }, { - "bom-ref": "30d001eb95e254ed", + "bom-ref": "bb94db8e37fcbfa0", "name": "/usr/include/c++/13/pstl/memory_impl.h", "type": "file" }, { - "bom-ref": "5748bd2384c4332f", + "bom-ref": "f61a4f354aa193ca", "name": "/usr/include/c++/13/pstl/numeric_fwd.h", "type": "file" }, { - "bom-ref": "bb2f1e2e88293c52", + "bom-ref": "530ce7c55d02841b", "name": "/usr/include/c++/13/pstl/numeric_impl.h", "type": "file" }, { - "bom-ref": "8749cee2415a6af3", + "bom-ref": "7306667a67b3551a", "name": "/usr/include/c++/13/pstl/parallel_backend.h", "type": "file" }, { - "bom-ref": "134b59b1ae652e2f", + "bom-ref": "e4eb1204c90fcd72", "name": "/usr/include/c++/13/pstl/parallel_backend_serial.h", "type": "file" }, { - "bom-ref": "b737e46c9c1dce68", + "bom-ref": "0553db034db158ed", "name": "/usr/include/c++/13/pstl/parallel_backend_tbb.h", "type": "file" }, { - "bom-ref": "0918391df126a385", + "bom-ref": "c2d05f164e7e5288", "name": "/usr/include/c++/13/pstl/parallel_backend_utils.h", "type": "file" }, { - "bom-ref": "8604510c89be124a", + "bom-ref": "867033224ce8556b", "name": "/usr/include/c++/13/pstl/parallel_impl.h", "type": "file" }, { - "bom-ref": "cfef7bc3363c13fb", + "bom-ref": "454bc01d0c58bb56", "name": "/usr/include/c++/13/pstl/pstl_config.h", "type": "file" }, { - "bom-ref": "cb02ac9deebd797b", + "bom-ref": "a474c1ef477795ba", "name": "/usr/include/c++/13/pstl/unseq_backend_simd.h", "type": "file" }, { - "bom-ref": "8fac32f634b447af", + "bom-ref": "fb688dd8f3e5e762", "name": "/usr/include/c++/13/pstl/utils.h", "type": "file" }, { - "bom-ref": "d1e9d5e1215da8bc", + "bom-ref": "73e4d39692b0dc5d", "name": "/usr/include/c++/13/queue", "type": "file" }, { - "bom-ref": "d1a8882578d85314", + "bom-ref": "90105fd4dabdd6b9", "name": "/usr/include/c++/13/random", "type": "file" }, { - "bom-ref": "8c586d61fbf8572b", + "bom-ref": "091fa774f98201fa", "name": "/usr/include/c++/13/ranges", "type": "file" }, { - "bom-ref": "ea8d3fe7e627eb23", + "bom-ref": "9bfacf6327edc512", "name": "/usr/include/c++/13/ratio", "type": "file" }, { - "bom-ref": "4d4179dc733cd680", + "bom-ref": "dd3a1bb1240784f9", "name": "/usr/include/c++/13/regex", "type": "file" }, { - "bom-ref": "614bcb76cdcbec04", + "bom-ref": "8244554dd21651c1", "name": "/usr/include/c++/13/scoped_allocator", "type": "file" }, { - "bom-ref": "e8a95fd73c2846e9", + "bom-ref": "c48142bdaa09e0ac", "name": "/usr/include/c++/13/semaphore", "type": "file" }, { - "bom-ref": "4eb3ee8e4537e751", + "bom-ref": "083648aa13e17ff0", "name": "/usr/include/c++/13/set", "type": "file" }, { - "bom-ref": "99ee990cd56a8f74", + "bom-ref": "e86db9b1ecec8c1d", "name": "/usr/include/c++/13/shared_mutex", "type": "file" }, { - "bom-ref": "d0aea3452ae16191", + "bom-ref": "fc0bd4da1b443358", "name": "/usr/include/c++/13/source_location", "type": "file" }, { - "bom-ref": "2ad4f0e07d558d32", + "bom-ref": "19eb8e48f8433c63", "name": "/usr/include/c++/13/span", "type": "file" }, { - "bom-ref": "ab6142cc6d0116a3", + "bom-ref": "05949cd332f40a12", "name": "/usr/include/c++/13/spanstream", "type": "file" }, { - "bom-ref": "f511736fbcdbe9cb", + "bom-ref": "19a99b088b32beae", "name": "/usr/include/c++/13/sstream", "type": "file" }, { - "bom-ref": "988e8b9f48499896", + "bom-ref": "24742c9d675df337", "name": "/usr/include/c++/13/stack", "type": "file" }, { - "bom-ref": "03aa20da8928ec4d", + "bom-ref": "5124c652931da764", "name": "/usr/include/c++/13/stacktrace", "type": "file" }, { - "bom-ref": "2773424e68bcd28f", + "bom-ref": "3495ff60e655ef52", "name": "/usr/include/c++/13/stdatomic.h", "type": "file" }, { - "bom-ref": "5c651f2bea81a75d", + "bom-ref": "22e2c7ab5f735cf4", "name": "/usr/include/c++/13/stdexcept", "type": "file" }, { - "bom-ref": "9946152e4d1c6f46", + "bom-ref": "0f27e6388545cffb", "name": "/usr/include/c++/13/stdfloat", "type": "file" }, { - "bom-ref": "28dab50fb876ad24", + "bom-ref": "6418f3a07e8cd4d5", "name": "/usr/include/c++/13/stdlib.h", "type": "file" }, { - "bom-ref": "6bdbcb30fed0cf62", + "bom-ref": "4e7c42064b56883b", "name": "/usr/include/c++/13/stop_token", "type": "file" }, { - "bom-ref": "aee028c48e9a242c", + "bom-ref": "a2ecd0ca344606a9", "name": "/usr/include/c++/13/streambuf", "type": "file" }, { - "bom-ref": "d870738cda5ad0e2", + "bom-ref": "c09708ed45b4280f", "name": "/usr/include/c++/13/string", "type": "file" }, { - "bom-ref": "415dfbdbd96d318a", + "bom-ref": "1ab0240463daba23", "name": "/usr/include/c++/13/string_view", "type": "file" }, { - "bom-ref": "0cefeeb260f117d0", + "bom-ref": "f1cb5f37c61c6ba1", "name": "/usr/include/c++/13/syncstream", "type": "file" }, { - "bom-ref": "e1b688d7a8be933b", + "bom-ref": "8a15b6e9e116c4ca", "name": "/usr/include/c++/13/system_error", "type": "file" }, { - "bom-ref": "dc158c0c3c63e506", + "bom-ref": "4eda095866501acb", "name": "/usr/include/c++/13/tgmath.h", "type": "file" }, { - "bom-ref": "596703603d0eb9d0", + "bom-ref": "cff10c10a58944f5", "name": "/usr/include/c++/13/thread", "type": "file" }, { - "bom-ref": "26826dcec1ad3cb7", + "bom-ref": "e4c1fcc5abca6f72", "name": "/usr/include/c++/13/tr1/array", "type": "file" }, { - "bom-ref": "ff173871e1329038", + "bom-ref": "2ab780a10df2209d", "name": "/usr/include/c++/13/tr1/bessel_function.tcc", "type": "file" }, { - "bom-ref": "de86fd5ebf264458", + "bom-ref": "838510d86800fc01", "name": "/usr/include/c++/13/tr1/beta_function.tcc", "type": "file" }, { - "bom-ref": "dc367a97f46255bb", + "bom-ref": "8b470df4448a80b2", "name": "/usr/include/c++/13/tr1/ccomplex", "type": "file" }, { - "bom-ref": "3cfe129b29f17061", + "bom-ref": "461ceba25c4e1398", "name": "/usr/include/c++/13/tr1/cctype", "type": "file" }, { - "bom-ref": "4ff652455875c221", + "bom-ref": "992d6653be65339c", "name": "/usr/include/c++/13/tr1/cfenv", "type": "file" }, { - "bom-ref": "7e6c52e9e1e290ad", + "bom-ref": "99535ee129356020", "name": "/usr/include/c++/13/tr1/cfloat", "type": "file" }, { - "bom-ref": "5e0b14c3b51ec8b3", + "bom-ref": "8e71ea289d2637a6", "name": "/usr/include/c++/13/tr1/cinttypes", "type": "file" }, { - "bom-ref": "3f88f81152184b99", + "bom-ref": "aa1e4ecd370a0138", "name": "/usr/include/c++/13/tr1/climits", "type": "file" }, { - "bom-ref": "e7b4785c13044870", + "bom-ref": "da5a2287be0ed679", "name": "/usr/include/c++/13/tr1/cmath", "type": "file" }, { - "bom-ref": "9c71401e6982f203", + "bom-ref": "c25d7d3fb5214de2", "name": "/usr/include/c++/13/tr1/complex", "type": "file" }, { - "bom-ref": "1cbca757d95656e2", + "bom-ref": "1650b68644432c2b", "name": "/usr/include/c++/13/tr1/complex.h", "type": "file" }, { - "bom-ref": "5857cda8a69eb33f", + "bom-ref": "21c6c6e124fac382", "name": "/usr/include/c++/13/tr1/cstdarg", "type": "file" }, { - "bom-ref": "930f254abd016b2b", + "bom-ref": "a04862887fb2300a", "name": "/usr/include/c++/13/tr1/cstdbool", "type": "file" }, { - "bom-ref": "ed1f942de356f70a", + "bom-ref": "0cb463f9b2eaf5db", "name": "/usr/include/c++/13/tr1/cstdint", "type": "file" }, { - "bom-ref": "56d8746d39103c57", + "bom-ref": "1d86efdbb8dd2aca", "name": "/usr/include/c++/13/tr1/cstdio", "type": "file" }, { - "bom-ref": "1a947655bb45c0bb", + "bom-ref": "fcbf64d414cd0ab2", "name": "/usr/include/c++/13/tr1/cstdlib", "type": "file" }, { - "bom-ref": "6dc72af09a3a6129", + "bom-ref": "4f3b3683064d8854", "name": "/usr/include/c++/13/tr1/ctgmath", "type": "file" }, { - "bom-ref": "d8e52a1925042265", + "bom-ref": "8a1fdf2084e382c8", "name": "/usr/include/c++/13/tr1/ctime", "type": "file" }, { - "bom-ref": "47e68942e359fe33", + "bom-ref": "b159eb29aee4be42", "name": "/usr/include/c++/13/tr1/ctype.h", "type": "file" }, { - "bom-ref": "d20a27c967aa3b53", + "bom-ref": "b35090e1b54ad6be", "name": "/usr/include/c++/13/tr1/cwchar", "type": "file" }, { - "bom-ref": "9444c3cb75645e87", + "bom-ref": "415c8a7ae08fda02", "name": "/usr/include/c++/13/tr1/cwctype", "type": "file" }, { - "bom-ref": "5d47b25afd6dd304", + "bom-ref": "c5096d6a6003f8f5", "name": "/usr/include/c++/13/tr1/ell_integral.tcc", "type": "file" }, { - "bom-ref": "3153e7478f27c8eb", + "bom-ref": "b59607165af39ba6", "name": "/usr/include/c++/13/tr1/exp_integral.tcc", "type": "file" }, { - "bom-ref": "b97936702e2bf51e", + "bom-ref": "1121e3c86ef88fb3", "name": "/usr/include/c++/13/tr1/fenv.h", "type": "file" }, { - "bom-ref": "02b56b99b8f7e217", + "bom-ref": "802d0e919d0ab45e", "name": "/usr/include/c++/13/tr1/float.h", "type": "file" }, { - "bom-ref": "1ad9814fb627b460", + "bom-ref": "5da7700258080b89", "name": "/usr/include/c++/13/tr1/functional", "type": "file" }, { - "bom-ref": "b0e03fa117e3aa1e", + "bom-ref": "d0d7f487b4cee7e3", "name": "/usr/include/c++/13/tr1/functional_hash.h", "type": "file" }, { - "bom-ref": "7002a038186441a2", + "bom-ref": "36aa0b9e5b96ea13", "name": "/usr/include/c++/13/tr1/gamma.tcc", "type": "file" }, { - "bom-ref": "78364242d78cd2bb", + "bom-ref": "8c97541daca5107a", "name": "/usr/include/c++/13/tr1/hashtable.h", "type": "file" }, { - "bom-ref": "1c0ea09ecc0d5a6b", + "bom-ref": "211515f81809512e", "name": "/usr/include/c++/13/tr1/hashtable_policy.h", "type": "file" }, { - "bom-ref": "c18beb30253a3ed4", + "bom-ref": "a53b9baa8ea17799", "name": "/usr/include/c++/13/tr1/hypergeometric.tcc", "type": "file" }, { - "bom-ref": "5e2e6d39d05d5505", + "bom-ref": "3add2787de0d9a6c", "name": "/usr/include/c++/13/tr1/inttypes.h", "type": "file" }, { - "bom-ref": "c65c583015625a2e", + "bom-ref": "3c6fd075e429116f", "name": "/usr/include/c++/13/tr1/legendre_function.tcc", "type": "file" }, { - "bom-ref": "8072cff961419610", + "bom-ref": "90499850ccbe0705", "name": "/usr/include/c++/13/tr1/limits.h", "type": "file" }, { - "bom-ref": "7a4b692c63035d29", + "bom-ref": "280a5b1e070e3620", "name": "/usr/include/c++/13/tr1/math.h", "type": "file" }, { - "bom-ref": "23a2134f812dda47", + "bom-ref": "374e7b0f34193e36", "name": "/usr/include/c++/13/tr1/memory", "type": "file" }, { - "bom-ref": "98254f0c70e2c4ba", + "bom-ref": "ed712c769083c213", "name": "/usr/include/c++/13/tr1/modified_bessel_func.tcc", "type": "file" }, { - "bom-ref": "378190c29de03ec4", + "bom-ref": "af5777cc4370d399", "name": "/usr/include/c++/13/tr1/poly_hermite.tcc", "type": "file" }, { - "bom-ref": "41b1a7c2c04a8903", + "bom-ref": "ee31a48b51de0416", "name": "/usr/include/c++/13/tr1/poly_laguerre.tcc", "type": "file" }, { - "bom-ref": "5ca1fa65c2bd237c", + "bom-ref": "9e2d45da8e080f5d", "name": "/usr/include/c++/13/tr1/random", "type": "file" }, { - "bom-ref": "91459707e89f4059", + "bom-ref": "ef59e505289b4980", "name": "/usr/include/c++/13/tr1/random.h", "type": "file" }, { - "bom-ref": "1870205f9e842377", + "bom-ref": "239566be0e9794be", "name": "/usr/include/c++/13/tr1/random.tcc", "type": "file" }, { - "bom-ref": "8b12185fcac0497b", + "bom-ref": "561fe50765d09ad6", "name": "/usr/include/c++/13/tr1/regex", "type": "file" }, { - "bom-ref": "471d8f574c3cb662", + "bom-ref": "167a26da60ae424f", "name": "/usr/include/c++/13/tr1/riemann_zeta.tcc", "type": "file" }, { - "bom-ref": "831d61f9f92443c1", + "bom-ref": "3aa02d4c8a142e50", "name": "/usr/include/c++/13/tr1/shared_ptr.h", "type": "file" }, { - "bom-ref": "bce85df362d21ced", + "bom-ref": "2518914c4180c1e8", "name": "/usr/include/c++/13/tr1/special_function_util.h", "type": "file" }, { - "bom-ref": "bfa702fe1fd5f81b", + "bom-ref": "1b28d2a5a0c010fa", "name": "/usr/include/c++/13/tr1/stdarg.h", "type": "file" }, { - "bom-ref": "0b311bf71523e33e", + "bom-ref": "f591bd985378c743", "name": "/usr/include/c++/13/tr1/stdbool.h", "type": "file" }, { - "bom-ref": "0a8122f2a41f00a6", + "bom-ref": "10391b7ede369267", "name": "/usr/include/c++/13/tr1/stdint.h", "type": "file" }, { - "bom-ref": "468e1db941b141c0", + "bom-ref": "db5153478b36b459", "name": "/usr/include/c++/13/tr1/stdio.h", "type": "file" }, { - "bom-ref": "4bd70da78ca27c60", + "bom-ref": "84af91fa67a32cc9", "name": "/usr/include/c++/13/tr1/stdlib.h", "type": "file" }, { - "bom-ref": "2a06cd4d3ef70634", + "bom-ref": "4b5998a55b8929e5", "name": "/usr/include/c++/13/tr1/tgmath.h", "type": "file" }, { - "bom-ref": "6b3e55d43ee780e6", + "bom-ref": "748ed86107be0413", "name": "/usr/include/c++/13/tr1/tuple", "type": "file" }, { - "bom-ref": "28a20ab9fbb966e6", + "bom-ref": "5ad8075160022f07", "name": "/usr/include/c++/13/tr1/type_traits", "type": "file" }, { - "bom-ref": "9f72a146e3d59a58", + "bom-ref": "cf55f336ea5d1e2d", "name": "/usr/include/c++/13/tr1/unordered_map", "type": "file" }, { - "bom-ref": "677f6a172869874d", + "bom-ref": "4eb95e207ea8cd08", "name": "/usr/include/c++/13/tr1/unordered_map.h", "type": "file" }, { - "bom-ref": "3fe4b454bd813200", + "bom-ref": "fd4492a06efe7381", "name": "/usr/include/c++/13/tr1/unordered_set", "type": "file" }, { - "bom-ref": "5e9a3bfd7682887e", + "bom-ref": "ecb04064c7983cdf", "name": "/usr/include/c++/13/tr1/unordered_set.h", "type": "file" }, { - "bom-ref": "fd3b5ee57635f8df", + "bom-ref": "69b5eb9bd9f35c5e", "name": "/usr/include/c++/13/tr1/utility", "type": "file" }, { - "bom-ref": "f92589abc9e0d47d", + "bom-ref": "9bb10a5d834fe780", "name": "/usr/include/c++/13/tr1/wchar.h", "type": "file" }, { - "bom-ref": "06e05cec47da1ceb", + "bom-ref": "d73e60244e9ed452", "name": "/usr/include/c++/13/tr1/wctype.h", "type": "file" }, { - "bom-ref": "5a950cbf7d3b5ae3", + "bom-ref": "3b4c0bc3d873370a", "name": "/usr/include/c++/13/tr2/bool_set", "type": "file" }, { - "bom-ref": "66712e1efb753774", + "bom-ref": "bd8d4c679d6b64a5", "name": "/usr/include/c++/13/tr2/bool_set.tcc", "type": "file" }, { - "bom-ref": "9c499eb2d8b359be", + "bom-ref": "13766b1377f2b5db", "name": "/usr/include/c++/13/tr2/dynamic_bitset", "type": "file" }, { - "bom-ref": "4ee20b9f9aca92bb", + "bom-ref": "aa937968bcad0cea", "name": "/usr/include/c++/13/tr2/dynamic_bitset.tcc", "type": "file" }, { - "bom-ref": "45f8c0338859a995", + "bom-ref": "eb07f0e3e998bfe0", "name": "/usr/include/c++/13/tr2/ratio", "type": "file" }, { - "bom-ref": "6406acbda0a0fdd4", + "bom-ref": "0874ba62b0da7ab5", "name": "/usr/include/c++/13/tr2/type_traits", "type": "file" }, { - "bom-ref": "0aa2f76be47f632a", + "bom-ref": "7ff0ed24f229574f", "name": "/usr/include/c++/13/tuple", "type": "file" }, { - "bom-ref": "09cba951a2036773", + "bom-ref": "f0fff448a15b47ba", "name": "/usr/include/c++/13/type_traits", "type": "file" }, { - "bom-ref": "dabc795e73017ca2", + "bom-ref": "dd364336459d7b13", "name": "/usr/include/c++/13/typeindex", "type": "file" }, { - "bom-ref": "51e3fd7fb08ef804", + "bom-ref": "b95b7be0cdeeebd5", "name": "/usr/include/c++/13/typeinfo", "type": "file" }, { - "bom-ref": "70876227b23ac88c", + "bom-ref": "6fa69cd0d1265761", "name": "/usr/include/c++/13/unordered_map", "type": "file" }, { - "bom-ref": "128a9da65626b0fc", + "bom-ref": "b5d2da0294efdea5", "name": "/usr/include/c++/13/unordered_set", "type": "file" }, { - "bom-ref": "dc535c41a3de2487", + "bom-ref": "87b1f9e4fbd5343a", "name": "/usr/include/c++/13/utility", "type": "file" }, { - "bom-ref": "0fb5c68cd3e18462", + "bom-ref": "d506b03788683e27", "name": "/usr/include/c++/13/valarray", "type": "file" }, { - "bom-ref": "dbccdd061800d115", + "bom-ref": "00acc5e83740d2d8", "name": "/usr/include/c++/13/variant", "type": "file" }, { - "bom-ref": "2015a9bb30c9afba", + "bom-ref": "a826639b36d87703", "name": "/usr/include/c++/13/vector", "type": "file" }, { - "bom-ref": "075e62d5d1051f4e", + "bom-ref": "5a789d9b6f747d4b", "name": "/usr/include/c++/13/version", "type": "file" }, { - "bom-ref": "24610af4a59720a4", + "bom-ref": "8729a5b577904cba", "name": "/usr/include/c++/14/algorithm", "type": "file" }, { - "bom-ref": "720d5e34bad73cd8", + "bom-ref": "5a2750883f5c943e", "name": "/usr/include/c++/14/any", "type": "file" }, { - "bom-ref": "41062c3fe6e38dc8", + "bom-ref": "59268bd4fada612e", "name": "/usr/include/c++/14/array", "type": "file" }, { - "bom-ref": "baf5a8ab47d9fba0", + "bom-ref": "937ee057146406b2", "name": "/usr/include/c++/14/atomic", "type": "file" }, { - "bom-ref": "0875d04cfffb7242", + "bom-ref": "082c9d804e77d488", "name": "/usr/include/c++/14/backward/auto_ptr.h", "type": "file" }, { - "bom-ref": "e8bfb1f5ae40f825", + "bom-ref": "29cdcf0816bdb3db", "name": "/usr/include/c++/14/backward/backward_warning.h", "type": "file" }, { - "bom-ref": "2c99ac18125ebac7", + "bom-ref": "c6ca65fe4f47b029", "name": "/usr/include/c++/14/backward/binders.h", "type": "file" }, { - "bom-ref": "f01be246b7da22f0", + "bom-ref": "73b81d8a01f27616", "name": "/usr/include/c++/14/backward/hash_fun.h", "type": "file" }, { - "bom-ref": "fdd45dbf5c54a28b", + "bom-ref": "d7b6e3eac0401fa1", "name": "/usr/include/c++/14/backward/hash_map", "type": "file" }, { - "bom-ref": "49279ea04f32f138", + "bom-ref": "653ecd8921ef552e", "name": "/usr/include/c++/14/backward/hash_set", "type": "file" }, { - "bom-ref": "0c16102677199019", + "bom-ref": "acfc72f8b6ae3cff", "name": "/usr/include/c++/14/backward/hashtable.h", "type": "file" }, { - "bom-ref": "1068d0356347f874", + "bom-ref": "b6d80c209988af26", "name": "/usr/include/c++/14/backward/strstream", "type": "file" }, { - "bom-ref": "a10bd7d246c342d2", + "bom-ref": "268a2ebd7d06bb58", "name": "/usr/include/c++/14/barrier", "type": "file" }, { - "bom-ref": "867e9a4ed99b93a2", + "bom-ref": "e16ac3bf5d2356c8", "name": "/usr/include/c++/14/bit", "type": "file" }, { - "bom-ref": "eaf0be1b7a36eb9c", + "bom-ref": "392b7b534d393e32", "name": "/usr/include/c++/14/bits/algorithmfwd.h", "type": "file" }, { - "bom-ref": "6d92dcaeb6a90a15", + "bom-ref": "911b8d1642fafebb", "name": "/usr/include/c++/14/bits/align.h", "type": "file" }, { - "bom-ref": "516bebd61b7d025d", + "bom-ref": "00837a24c85f417f", "name": "/usr/include/c++/14/bits/alloc_traits.h", "type": "file" }, { - "bom-ref": "a8503124d3257df0", + "bom-ref": "852c3da60f7f524a", "name": "/usr/include/c++/14/bits/allocated_ptr.h", "type": "file" }, { - "bom-ref": "1c3e49fcf6445a43", + "bom-ref": "dad675a9d357a451", "name": "/usr/include/c++/14/bits/allocator.h", "type": "file" }, { - "bom-ref": "9c475f7e224ae072", + "bom-ref": "1c11dd8b293cd3e8", "name": "/usr/include/c++/14/bits/atomic_base.h", "type": "file" }, { - "bom-ref": "bcc94c659c9f4a05", + "bom-ref": "7d11c4106d21edb3", "name": "/usr/include/c++/14/bits/atomic_futex.h", "type": "file" }, { - "bom-ref": "5458698bee8466c8", + "bom-ref": "deb85aa7b0809ec2", "name": "/usr/include/c++/14/bits/atomic_lockfree_defines.h", "type": "file" }, { - "bom-ref": "9dd23408b7486f45", + "bom-ref": "1c4576938ad7895f", "name": "/usr/include/c++/14/bits/atomic_timed_wait.h", "type": "file" }, { - "bom-ref": "abf45eb1a321bd05", + "bom-ref": "b406d9fea4d2b323", "name": "/usr/include/c++/14/bits/atomic_wait.h", "type": "file" }, { - "bom-ref": "12529503bb62cd6f", + "bom-ref": "fb7c06e15a09f369", "name": "/usr/include/c++/14/bits/basic_ios.h", "type": "file" }, { - "bom-ref": "df6da08b6eac35fd", + "bom-ref": "7d9ef0cb704a50eb", "name": "/usr/include/c++/14/bits/basic_ios.tcc", "type": "file" }, { - "bom-ref": "df2527a3d2d131c9", + "bom-ref": "38c2c897b78f6f7b", "name": "/usr/include/c++/14/bits/basic_string.h", "type": "file" }, { - "bom-ref": "0c007fe1d4d4b85b", + "bom-ref": "fff8e9d02186f17d", "name": "/usr/include/c++/14/bits/basic_string.tcc", "type": "file" }, { - "bom-ref": "b2ba64dee3c65582", + "bom-ref": "fbe22d31d25bf610", "name": "/usr/include/c++/14/bits/boost_concept_check.h", "type": "file" }, { - "bom-ref": "5dc7f4fa24232302", + "bom-ref": "e256da9242e0306c", "name": "/usr/include/c++/14/bits/c++0x_warning.h", "type": "file" }, { - "bom-ref": "ee1de7efd957b6bc", + "bom-ref": "ac85b690e5ff9f36", "name": "/usr/include/c++/14/bits/char_traits.h", "type": "file" }, { - "bom-ref": "3f79887f03b4e5dd", + "bom-ref": "81a472b39a6c7a47", "name": "/usr/include/c++/14/bits/charconv.h", "type": "file" }, { - "bom-ref": "773b9a3e7e229fe5", + "bom-ref": "f4902fb9434687b3", "name": "/usr/include/c++/14/bits/chrono.h", "type": "file" }, { - "bom-ref": "64ae17a8681e7c4d", + "bom-ref": "67e26653ed61bfbf", "name": "/usr/include/c++/14/bits/chrono_io.h", "type": "file" }, { - "bom-ref": "7e7b41a609ac19bd", + "bom-ref": "35d6a2f9c2c443ef", "name": "/usr/include/c++/14/bits/codecvt.h", "type": "file" }, { - "bom-ref": "e6bc7408c2baf18c", + "bom-ref": "6931bbddd2e27c56", "name": "/usr/include/c++/14/bits/concept_check.h", "type": "file" }, { - "bom-ref": "5b773d0c954a98a8", + "bom-ref": "8c2d6f21a601016a", "name": "/usr/include/c++/14/bits/cow_string.h", "type": "file" }, { - "bom-ref": "1515fbb6bffcbe19", + "bom-ref": "66a6426e323b7307", "name": "/usr/include/c++/14/bits/cpp_type_traits.h", "type": "file" }, { - "bom-ref": "4d4af6cae443e0ad", + "bom-ref": "6e952b1c444a56f7", "name": "/usr/include/c++/14/bits/cxxabi_forced.h", "type": "file" }, { - "bom-ref": "c79fdb6091f9bea0", + "bom-ref": "c5f590c6b3dfa856", "name": "/usr/include/c++/14/bits/cxxabi_init_exception.h", "type": "file" }, { - "bom-ref": "262d3a41f0d1a642", + "bom-ref": "86b3f59ef4c87114", "name": "/usr/include/c++/14/bits/deque.tcc", "type": "file" }, { - "bom-ref": "dfff8cf5a185f959", + "bom-ref": "0dcf786ac68565d3", "name": "/usr/include/c++/14/bits/elements_of.h", "type": "file" }, { - "bom-ref": "6477b5d5e40c64da", + "bom-ref": "2ec0793f4d53fbe8", "name": "/usr/include/c++/14/bits/enable_special_members.h", "type": "file" }, { - "bom-ref": "7196c477a02b3bfa", + "bom-ref": "9371530295573c5c", "name": "/usr/include/c++/14/bits/erase_if.h", "type": "file" }, { - "bom-ref": "d1c430af3b9de75b", + "bom-ref": "6556940196618491", "name": "/usr/include/c++/14/bits/exception.h", "type": "file" }, { - "bom-ref": "b609e8882f8a01ba", + "bom-ref": "8d57d9c874d9c458", "name": "/usr/include/c++/14/bits/exception_defines.h", "type": "file" }, { - "bom-ref": "257ce4a8b96de93d", + "bom-ref": "6446dac2e490cd77", "name": "/usr/include/c++/14/bits/exception_ptr.h", "type": "file" }, { - "bom-ref": "064d1c55e904f4ed", + "bom-ref": "c08d47ea0f7c9e87", "name": "/usr/include/c++/14/bits/forward_list.h", "type": "file" }, { - "bom-ref": "a7510dc8b5ee2f55", + "bom-ref": "b67735d6512ef303", "name": "/usr/include/c++/14/bits/forward_list.tcc", "type": "file" }, { - "bom-ref": "d4663bdc573f563f", + "bom-ref": "039a6995bef19ced", "name": "/usr/include/c++/14/bits/fs_dir.h", "type": "file" }, { - "bom-ref": "207f33387143fa67", + "bom-ref": "e0bbaab581ae9619", "name": "/usr/include/c++/14/bits/fs_fwd.h", "type": "file" }, { - "bom-ref": "4e889815cb3435da", + "bom-ref": "f0f512a0b84dc9e0", "name": "/usr/include/c++/14/bits/fs_ops.h", "type": "file" }, { - "bom-ref": "eba6c6d5a2e761b5", + "bom-ref": "1faf7dd492e0f253", "name": "/usr/include/c++/14/bits/fs_path.h", "type": "file" }, { - "bom-ref": "c8af0e21cd7dc42a", + "bom-ref": "fba8592dca83e880", "name": "/usr/include/c++/14/bits/fstream.tcc", "type": "file" }, { - "bom-ref": "1fd852b242e86131", + "bom-ref": "2d83a41423a2c737", "name": "/usr/include/c++/14/bits/functexcept.h", "type": "file" }, { - "bom-ref": "d27f2caeb606e759", + "bom-ref": "a9c5f695eea8fdb3", "name": "/usr/include/c++/14/bits/functional_hash.h", "type": "file" }, { - "bom-ref": "1c17e18a2db19a33", + "bom-ref": "3d1d461fc7ba4d91", "name": "/usr/include/c++/14/bits/gslice.h", "type": "file" }, { - "bom-ref": "f19cedfd487be2d5", + "bom-ref": "5c0fbef30d668c43", "name": "/usr/include/c++/14/bits/gslice_array.h", "type": "file" }, { - "bom-ref": "408a4d2774cec681", + "bom-ref": "0112b1b0596e450b", "name": "/usr/include/c++/14/bits/hash_bytes.h", "type": "file" }, { - "bom-ref": "120d5d04d821463a", + "bom-ref": "6eb8b423785cf350", "name": "/usr/include/c++/14/bits/hashtable.h", "type": "file" }, { - "bom-ref": "0117c575cb90f0f6", + "bom-ref": "c43aa208618de720", "name": "/usr/include/c++/14/bits/hashtable_policy.h", "type": "file" }, { - "bom-ref": "ffa7a68f3d2efaf5", + "bom-ref": "ddb72649d5170313", "name": "/usr/include/c++/14/bits/indirect_array.h", "type": "file" }, { - "bom-ref": "18ab616cd5792ca4", + "bom-ref": "fba7af3cf8fb0186", "name": "/usr/include/c++/14/bits/invoke.h", "type": "file" }, { - "bom-ref": "188f41531cadbc1f", + "bom-ref": "8fa55d602ff6e419", "name": "/usr/include/c++/14/bits/ios_base.h", "type": "file" }, { - "bom-ref": "5aaee1d044c6f05d", + "bom-ref": "e089cc391a112f8f", "name": "/usr/include/c++/14/bits/istream.tcc", "type": "file" }, { - "bom-ref": "48e31cd4be55fa78", + "bom-ref": "fb8aca8b421351ca", "name": "/usr/include/c++/14/bits/iterator_concepts.h", "type": "file" }, { - "bom-ref": "3ddfcd2088e39cb9", + "bom-ref": "050a7a40b0fa4baf", "name": "/usr/include/c++/14/bits/list.tcc", "type": "file" }, { - "bom-ref": "574290c40ef9fc67", + "bom-ref": "e6b7c9947e397ec9", "name": "/usr/include/c++/14/bits/locale_classes.h", "type": "file" }, { - "bom-ref": "03343e60671a44a0", + "bom-ref": "2d8fa2bf299834da", "name": "/usr/include/c++/14/bits/locale_classes.tcc", "type": "file" }, { - "bom-ref": "fc62c189bcca32e7", + "bom-ref": "72185f94d1ad37cd", "name": "/usr/include/c++/14/bits/locale_conv.h", "type": "file" }, { - "bom-ref": "bbe33b953bb6177b", + "bom-ref": "f13c468b6280fe0d", "name": "/usr/include/c++/14/bits/locale_facets.h", "type": "file" }, { - "bom-ref": "ab773fec35ccbde9", + "bom-ref": "edeec42e74e07b5b", "name": "/usr/include/c++/14/bits/locale_facets.tcc", "type": "file" }, { - "bom-ref": "98b1cb5e066726be", + "bom-ref": "e7d0f448f17cc710", "name": "/usr/include/c++/14/bits/locale_facets_nonio.h", "type": "file" }, { - "bom-ref": "9cd4fc38a64d4c87", + "bom-ref": "b368318b7ab786ad", "name": "/usr/include/c++/14/bits/locale_facets_nonio.tcc", "type": "file" }, { - "bom-ref": "84864d4e6dbe1737", + "bom-ref": "00f571578ff8d4f9", "name": "/usr/include/c++/14/bits/localefwd.h", "type": "file" }, { - "bom-ref": "f8289673bf8d0978", + "bom-ref": "5cb007e97e59ead2", "name": "/usr/include/c++/14/bits/mask_array.h", "type": "file" }, { - "bom-ref": "816eadaf7a2741a3", + "bom-ref": "45122ff4d45e9e61", "name": "/usr/include/c++/14/bits/max_size_type.h", "type": "file" }, { - "bom-ref": "38cefe7ebc6b8a11", + "bom-ref": "f0d34e4512f906c3", "name": "/usr/include/c++/14/bits/memory_resource.h", "type": "file" }, { - "bom-ref": "8bfb990f6f0b02d8", + "bom-ref": "52211298bcc79a0a", "name": "/usr/include/c++/14/bits/memoryfwd.h", "type": "file" }, { - "bom-ref": "1a1f2dda68af7e85", + "bom-ref": "7471bfa63439744f", "name": "/usr/include/c++/14/bits/mofunc_impl.h", "type": "file" }, { - "bom-ref": "be89f0b11bb90824", + "bom-ref": "55967a4d1527e1a6", "name": "/usr/include/c++/14/bits/move.h", "type": "file" }, { - "bom-ref": "84c3b5e2edd188ea", + "bom-ref": "838d510c396821bc", "name": "/usr/include/c++/14/bits/move_only_function.h", "type": "file" }, { - "bom-ref": "3eddf1c00e8d0c8c", + "bom-ref": "4609248117fc111e", "name": "/usr/include/c++/14/bits/nested_exception.h", "type": "file" }, { - "bom-ref": "ecb17567526dc5c3", + "bom-ref": "d2375c6b78196329", "name": "/usr/include/c++/14/bits/new_allocator.h", "type": "file" }, { - "bom-ref": "efab7b797587cd17", + "bom-ref": "865ab3f7806ea689", "name": "/usr/include/c++/14/bits/node_handle.h", "type": "file" }, { - "bom-ref": "cea5c6aa827c8278", + "bom-ref": "3651103fa9032e86", "name": "/usr/include/c++/14/bits/ostream.tcc", "type": "file" }, { - "bom-ref": "b1544a84472f8e85", + "bom-ref": "a5abd5a288f2f157", "name": "/usr/include/c++/14/bits/ostream_insert.h", "type": "file" }, { - "bom-ref": "38dd20cbd3ec76b6", + "bom-ref": "ab066ef7c5c01d80", "name": "/usr/include/c++/14/bits/out_ptr.h", "type": "file" }, { - "bom-ref": "ed75f02fb8abc618", + "bom-ref": "3da62cc8e4e3ac42", "name": "/usr/include/c++/14/bits/parse_numbers.h", "type": "file" }, { - "bom-ref": "a562d3817922ebc8", + "bom-ref": "7c3b849bca62094a", "name": "/usr/include/c++/14/bits/postypes.h", "type": "file" }, { - "bom-ref": "4283debf8e196e2f", + "bom-ref": "d648c616cb514089", "name": "/usr/include/c++/14/bits/predefined_ops.h", "type": "file" }, { - "bom-ref": "25925945ca965551", + "bom-ref": "dd134fd83cdd8c3b", "name": "/usr/include/c++/14/bits/ptr_traits.h", "type": "file" }, { - "bom-ref": "0a4d707012073765", + "bom-ref": "8e48ef719618edbb", "name": "/usr/include/c++/14/bits/quoted_string.h", "type": "file" }, { - "bom-ref": "4fc82e95e67487ea", + "bom-ref": "5703ace792894550", "name": "/usr/include/c++/14/bits/random.h", "type": "file" }, { - "bom-ref": "4cfae0d81f8673e6", + "bom-ref": "83ece1f839c82fb4", "name": "/usr/include/c++/14/bits/random.tcc", "type": "file" }, { - "bom-ref": "6ad0af71fd003ccf", + "bom-ref": "791caf728049e721", "name": "/usr/include/c++/14/bits/range_access.h", "type": "file" }, { - "bom-ref": "9b6fa905731cc46b", + "bom-ref": "e4dcdc40a225e025", "name": "/usr/include/c++/14/bits/ranges_algo.h", "type": "file" }, { - "bom-ref": "d92a4780f1f67777", + "bom-ref": "4079a99c8cf16661", "name": "/usr/include/c++/14/bits/ranges_algobase.h", "type": "file" }, { - "bom-ref": "eb01efa1fb6a5cc2", + "bom-ref": "c0914359ea3cef34", "name": "/usr/include/c++/14/bits/ranges_base.h", "type": "file" }, { - "bom-ref": "511bbe853cd8f71d", + "bom-ref": "cc9e79402b5747eb", "name": "/usr/include/c++/14/bits/ranges_cmp.h", "type": "file" }, { - "bom-ref": "df296d160335dde3", + "bom-ref": "7cc2b7b1204fbe39", "name": "/usr/include/c++/14/bits/ranges_uninitialized.h", "type": "file" }, { - "bom-ref": "1a7acd1e4f6aa7bf", + "bom-ref": "2102ee4f1eef22e5", "name": "/usr/include/c++/14/bits/ranges_util.h", "type": "file" }, { - "bom-ref": "4e065a2c55144fe0", + "bom-ref": "7375469d4b0b80fa", "name": "/usr/include/c++/14/bits/refwrap.h", "type": "file" }, { - "bom-ref": "f6642ae0285338fd", + "bom-ref": "956d61bd720bd5a3", "name": "/usr/include/c++/14/bits/regex.h", "type": "file" }, { - "bom-ref": "d213e067affed96d", + "bom-ref": "2957f4d6cf3b27a3", "name": "/usr/include/c++/14/bits/regex.tcc", "type": "file" }, { - "bom-ref": "0bcc1f7fab68475d", + "bom-ref": "950828364401ec0f", "name": "/usr/include/c++/14/bits/regex_automaton.h", "type": "file" }, { - "bom-ref": "f13832b71307f0b6", + "bom-ref": "a04413f0a3d8b4d0", "name": "/usr/include/c++/14/bits/regex_automaton.tcc", "type": "file" }, { - "bom-ref": "64707c2da547a257", + "bom-ref": "b1f48271a729c465", "name": "/usr/include/c++/14/bits/regex_compiler.h", "type": "file" }, { - "bom-ref": "30d60c89db972985", + "bom-ref": "0268ffd7834be32b", "name": "/usr/include/c++/14/bits/regex_compiler.tcc", "type": "file" }, { - "bom-ref": "ef615f53da98440c", + "bom-ref": "b6a975dca3c93652", "name": "/usr/include/c++/14/bits/regex_constants.h", "type": "file" }, { - "bom-ref": "42b0e5e4a67d85dd", + "bom-ref": "7567ab62700ce4cb", "name": "/usr/include/c++/14/bits/regex_error.h", "type": "file" }, { - "bom-ref": "18be1eb2816dac33", + "bom-ref": "a8a86943c87b53bd", "name": "/usr/include/c++/14/bits/regex_executor.h", "type": "file" }, { - "bom-ref": "6af2d5ba6bdbb28f", + "bom-ref": "c8b221c29590d095", "name": "/usr/include/c++/14/bits/regex_executor.tcc", "type": "file" }, { - "bom-ref": "97155069db52d48d", + "bom-ref": "2a91a988e8d43817", "name": "/usr/include/c++/14/bits/regex_scanner.h", "type": "file" }, { - "bom-ref": "3f0eb8843b28776f", + "bom-ref": "6aed17ef968f9e6d", "name": "/usr/include/c++/14/bits/regex_scanner.tcc", "type": "file" }, { - "bom-ref": "cb7105500af8c982", + "bom-ref": "ed99fda6dd681970", "name": "/usr/include/c++/14/bits/requires_hosted.h", "type": "file" }, { - "bom-ref": "eb9800e172e3d2bb", + "bom-ref": "9797972957bc4e89", "name": "/usr/include/c++/14/bits/sat_arith.h", "type": "file" }, { - "bom-ref": "63539090c07ae72c", + "bom-ref": "36bfb90c0a528e5e", "name": "/usr/include/c++/14/bits/semaphore_base.h", "type": "file" }, { - "bom-ref": "132e665c6c57fa8c", + "bom-ref": "d0bbb65ebafd070e", "name": "/usr/include/c++/14/bits/shared_ptr.h", "type": "file" }, { - "bom-ref": "3ed6cb5443b6ca45", + "bom-ref": "ab20af7dd97a0973", "name": "/usr/include/c++/14/bits/shared_ptr_atomic.h", "type": "file" }, { - "bom-ref": "5a2477d36a05ca87", + "bom-ref": "0b66ef65edb0fe09", "name": "/usr/include/c++/14/bits/shared_ptr_base.h", "type": "file" }, { - "bom-ref": "9b02015b10b0aa77", + "bom-ref": "6430b4c57f9d7101", "name": "/usr/include/c++/14/bits/slice_array.h", "type": "file" }, { - "bom-ref": "5d709619c0dfdfbf", + "bom-ref": "1526ece8afae1425", "name": "/usr/include/c++/14/bits/specfun.h", "type": "file" }, { - "bom-ref": "3bd6c62582eca247", + "bom-ref": "6c029c674dcf4eb9", "name": "/usr/include/c++/14/bits/sstream.tcc", "type": "file" }, { - "bom-ref": "d7149914675984eb", + "bom-ref": "8fe99e898038417d", "name": "/usr/include/c++/14/bits/std_abs.h", "type": "file" }, { - "bom-ref": "26c61906bcd4194b", + "bom-ref": "b2fa867ebc4adcad", "name": "/usr/include/c++/14/bits/std_function.h", "type": "file" }, { - "bom-ref": "5300ea5a300ddd48", + "bom-ref": "bbc788c7478753a2", "name": "/usr/include/c++/14/bits/std_mutex.h", "type": "file" }, { - "bom-ref": "68cb594d3de92132", + "bom-ref": "87a8aae6d02b83ec", "name": "/usr/include/c++/14/bits/std_thread.h", "type": "file" }, { - "bom-ref": "93e1e3c0dd813777", + "bom-ref": "cc09c57d4f0ac12d", "name": "/usr/include/c++/14/bits/stl_algo.h", "type": "file" }, { - "bom-ref": "1d5a13d525821f5c", + "bom-ref": "a8341293837e8416", "name": "/usr/include/c++/14/bits/stl_algobase.h", "type": "file" }, { - "bom-ref": "af790959009effc7", + "bom-ref": "18b42c3f3a0701e5", "name": "/usr/include/c++/14/bits/stl_bvector.h", "type": "file" }, { - "bom-ref": "a28420114f3c04fc", + "bom-ref": "02176f71cab737ba", "name": "/usr/include/c++/14/bits/stl_construct.h", "type": "file" }, { - "bom-ref": "5b9bb83dc0a4ba55", + "bom-ref": "c9f1c2b60a33fd47", "name": "/usr/include/c++/14/bits/stl_deque.h", "type": "file" }, { - "bom-ref": "ad390320fc7b835c", + "bom-ref": "b9b01a03d32711ae", "name": "/usr/include/c++/14/bits/stl_function.h", "type": "file" }, { - "bom-ref": "070b688997465f1e", + "bom-ref": "177f5939400d5a0c", "name": "/usr/include/c++/14/bits/stl_heap.h", "type": "file" }, { - "bom-ref": "1d9ae031c6efab64", + "bom-ref": "72ab90a275ecadc2", "name": "/usr/include/c++/14/bits/stl_iterator.h", "type": "file" }, { - "bom-ref": "5b7e933a4472741c", + "bom-ref": "49531bda963f5aa2", "name": "/usr/include/c++/14/bits/stl_iterator_base_funcs.h", "type": "file" }, { - "bom-ref": "e30d59439fafe10d", + "bom-ref": "c8b4591186751097", "name": "/usr/include/c++/14/bits/stl_iterator_base_types.h", "type": "file" }, { - "bom-ref": "2951a6529569b904", + "bom-ref": "0cd53e53eefb5746", "name": "/usr/include/c++/14/bits/stl_list.h", "type": "file" }, { - "bom-ref": "7e12c2179251de89", + "bom-ref": "95987bd7b1bd386b", "name": "/usr/include/c++/14/bits/stl_map.h", "type": "file" }, { - "bom-ref": "a600e306ea28cf51", + "bom-ref": "b9d13d99d4bd3457", "name": "/usr/include/c++/14/bits/stl_multimap.h", "type": "file" }, { - "bom-ref": "9fa425482a9a36bb", + "bom-ref": "e4ee68cf54497921", "name": "/usr/include/c++/14/bits/stl_multiset.h", "type": "file" }, { - "bom-ref": "b44399ad4b8948a9", + "bom-ref": "af2e2f83f881acaf", "name": "/usr/include/c++/14/bits/stl_numeric.h", "type": "file" }, { - "bom-ref": "82ff4bcda72f1330", + "bom-ref": "03ad4d9589665a1e", "name": "/usr/include/c++/14/bits/stl_pair.h", "type": "file" }, { - "bom-ref": "74d67a5e756acf76", + "bom-ref": "d23f7579b2a782c8", "name": "/usr/include/c++/14/bits/stl_queue.h", "type": "file" }, { - "bom-ref": "ce3e4198c1f56560", + "bom-ref": "4223084482d138b6", "name": "/usr/include/c++/14/bits/stl_raw_storage_iter.h", "type": "file" }, { - "bom-ref": "54658c6c947912b2", + "bom-ref": "6e0dfbd7d784e190", "name": "/usr/include/c++/14/bits/stl_relops.h", "type": "file" }, { - "bom-ref": "602a59b0b378bc6f", + "bom-ref": "191af378dd026799", "name": "/usr/include/c++/14/bits/stl_set.h", "type": "file" }, { - "bom-ref": "90603512793320cc", + "bom-ref": "c5433b47e9ef5bb2", "name": "/usr/include/c++/14/bits/stl_stack.h", "type": "file" }, { - "bom-ref": "656113080ad437d4", + "bom-ref": "8b8c6b3555ebe766", "name": "/usr/include/c++/14/bits/stl_tempbuf.h", "type": "file" }, { - "bom-ref": "1d6e431997e5a256", + "bom-ref": "12418d0165dcbb7c", "name": "/usr/include/c++/14/bits/stl_tree.h", "type": "file" }, { - "bom-ref": "56e293eb886c1f02", + "bom-ref": "acaede1d206713fc", "name": "/usr/include/c++/14/bits/stl_uninitialized.h", "type": "file" }, { - "bom-ref": "3bb22de80c12c052", + "bom-ref": "9b562447938be358", "name": "/usr/include/c++/14/bits/stl_vector.h", "type": "file" }, { - "bom-ref": "6142cb4357642e1d", + "bom-ref": "b860c8fe39b8581b", "name": "/usr/include/c++/14/bits/stream_iterator.h", "type": "file" }, { - "bom-ref": "740c0acb713846a9", + "bom-ref": "76d2f01a099e1233", "name": "/usr/include/c++/14/bits/streambuf.tcc", "type": "file" }, { - "bom-ref": "d003100ed5ed7ccf", + "bom-ref": "3e1799d263554c29", "name": "/usr/include/c++/14/bits/streambuf_iterator.h", "type": "file" }, { - "bom-ref": "dc89223a29431264", + "bom-ref": "0168bac6c6d48f8a", "name": "/usr/include/c++/14/bits/string_view.tcc", "type": "file" }, { - "bom-ref": "4988958a8c0d7bd8", + "bom-ref": "b3ec0745e875bc4e", "name": "/usr/include/c++/14/bits/stringfwd.h", "type": "file" }, { - "bom-ref": "ecdaaa60b06fe589", + "bom-ref": "06fae6bcf9020ceb", "name": "/usr/include/c++/14/bits/text_encoding-data.h", "type": "file" }, { - "bom-ref": "a095a7d1a76a91ee", + "bom-ref": "26794b3c8ec8dfe4", "name": "/usr/include/c++/14/bits/this_thread_sleep.h", "type": "file" }, { - "bom-ref": "fc83ceab8bfb01c4", + "bom-ref": "005df886cf975012", "name": "/usr/include/c++/14/bits/unicode-data.h", "type": "file" }, { - "bom-ref": "a95ce5e820fab344", + "bom-ref": "ea2e86617ffb425a", "name": "/usr/include/c++/14/bits/unicode.h", "type": "file" }, { - "bom-ref": "b9b46ff55c373346", + "bom-ref": "87c63721a32d5944", "name": "/usr/include/c++/14/bits/uniform_int_dist.h", "type": "file" }, { - "bom-ref": "80d611ad56cadf3a", + "bom-ref": "65ed55c994ee248c", "name": "/usr/include/c++/14/bits/unique_lock.h", "type": "file" }, { - "bom-ref": "0bcafd930f0fb3cf", + "bom-ref": "0d942cb6a07353a1", "name": "/usr/include/c++/14/bits/unique_ptr.h", "type": "file" }, { - "bom-ref": "58af3a4dd16ec304", + "bom-ref": "07dc0acb28ffe3f6", "name": "/usr/include/c++/14/bits/unordered_map.h", "type": "file" }, { - "bom-ref": "4ef2f993ac14447d", + "bom-ref": "c839a18db5cc240b", "name": "/usr/include/c++/14/bits/unordered_set.h", "type": "file" }, { - "bom-ref": "7fced7cfac354913", + "bom-ref": "9b31356c7ad9ebc5", "name": "/usr/include/c++/14/bits/uses_allocator.h", "type": "file" }, { - "bom-ref": "22435f96671d8a43", + "bom-ref": "fd4d44d11e1e0481", "name": "/usr/include/c++/14/bits/uses_allocator_args.h", "type": "file" }, { - "bom-ref": "e54b4c384c98919c", + "bom-ref": "85e2f76d74f6fff6", "name": "/usr/include/c++/14/bits/utility.h", "type": "file" }, { - "bom-ref": "f3b2215fd83c1359", + "bom-ref": "6cbc4382da42f88b", "name": "/usr/include/c++/14/bits/valarray_after.h", "type": "file" }, { - "bom-ref": "a2fd28516aeefc0b", + "bom-ref": "9b68bd9868ffd459", "name": "/usr/include/c++/14/bits/valarray_array.h", "type": "file" }, { - "bom-ref": "250509134de58fe1", + "bom-ref": "6b56311d49e7e093", "name": "/usr/include/c++/14/bits/valarray_array.tcc", "type": "file" }, { - "bom-ref": "69e6f6946d49251d", + "bom-ref": "a37ba15ab1450153", "name": "/usr/include/c++/14/bits/valarray_before.h", "type": "file" }, { - "bom-ref": "aff5fe6bef778060", + "bom-ref": "2ce877977a4466ce", "name": "/usr/include/c++/14/bits/vector.tcc", "type": "file" }, { - "bom-ref": "2c3c3f4abba33630", + "bom-ref": "198513a8bf97c582", "name": "/usr/include/c++/14/bits/version.h", "type": "file" }, { - "bom-ref": "ecb113a522386f17", + "bom-ref": "fee92d964ca40449", "name": "/usr/include/c++/14/bitset", "type": "file" }, { - "bom-ref": "b82e359821a5aa6d", + "bom-ref": "10407f8b325255e7", "name": "/usr/include/c++/14/cassert", "type": "file" }, { - "bom-ref": "c170c0485f0a0136", + "bom-ref": "cb88a5b9e39dbb9c", "name": "/usr/include/c++/14/ccomplex", "type": "file" }, { - "bom-ref": "1b129134d988c05d", + "bom-ref": "e13df2aed49f8253", "name": "/usr/include/c++/14/cctype", "type": "file" }, { - "bom-ref": "03e7db4f40c55e8f", + "bom-ref": "fb248499ff7d1af9", "name": "/usr/include/c++/14/cerrno", "type": "file" }, { - "bom-ref": "a7d5af5f81cb2785", + "bom-ref": "673b51bfc6aa9663", "name": "/usr/include/c++/14/cfenv", "type": "file" }, { - "bom-ref": "d4d8e23eb8ed62a2", + "bom-ref": "031929d08c744760", "name": "/usr/include/c++/14/cfloat", "type": "file" }, { - "bom-ref": "486767c0a1a87e5b", + "bom-ref": "f5202d36cf860eb5", "name": "/usr/include/c++/14/charconv", "type": "file" }, { - "bom-ref": "fc54bf2c469d22ff", + "bom-ref": "7a83e0e5238f465d", "name": "/usr/include/c++/14/chrono", "type": "file" }, { - "bom-ref": "aefd2c44b77ee12c", + "bom-ref": "7a59a2d2c29a703a", "name": "/usr/include/c++/14/cinttypes", "type": "file" }, { - "bom-ref": "34ff79fe77d76daa", + "bom-ref": "b9cecde5fe2ff0e4", "name": "/usr/include/c++/14/ciso646", "type": "file" }, { - "bom-ref": "14ed7bfa44280a1a", + "bom-ref": "a7a06d4961795efc", "name": "/usr/include/c++/14/climits", "type": "file" }, { - "bom-ref": "c44311677c7a9a26", + "bom-ref": "02d30680f4e2f240", "name": "/usr/include/c++/14/clocale", "type": "file" }, { - "bom-ref": "4c8103fcf5400966", + "bom-ref": "ae9215946679cd4c", "name": "/usr/include/c++/14/cmath", "type": "file" }, { - "bom-ref": "922b9d0cfbffcde5", + "bom-ref": "05b80b62729e1fbf", "name": "/usr/include/c++/14/codecvt", "type": "file" }, { - "bom-ref": "c5f92073f3774889", + "bom-ref": "a8c5be09a80fd7d7", "name": "/usr/include/c++/14/compare", "type": "file" }, { - "bom-ref": "699fb3152f7e7842", + "bom-ref": "cc7b816fb954472c", "name": "/usr/include/c++/14/complex", "type": "file" }, { - "bom-ref": "58479b1c507c9dd9", + "bom-ref": "403071046fbbe9c7", "name": "/usr/include/c++/14/complex.h", "type": "file" }, { - "bom-ref": "a9f6e56c5593f6c2", + "bom-ref": "685ba404d7f423c0", "name": "/usr/include/c++/14/concepts", "type": "file" }, { - "bom-ref": "567ad0c430fd3fb4", + "bom-ref": "2ac1b149672cecd2", "name": "/usr/include/c++/14/condition_variable", "type": "file" }, { - "bom-ref": "cde7706e438722f3", + "bom-ref": "db39de06848a4999", "name": "/usr/include/c++/14/coroutine", "type": "file" }, { - "bom-ref": "b9de1a38d7091f8c", + "bom-ref": "a7fd7ebb8ec5a2c6", "name": "/usr/include/c++/14/csetjmp", "type": "file" }, { - "bom-ref": "485c5a05485965d3", + "bom-ref": "e01eee041378a8c1", "name": "/usr/include/c++/14/csignal", "type": "file" }, { - "bom-ref": "a63bc9bbd4b53676", + "bom-ref": "91b78cb00d48b1b8", "name": "/usr/include/c++/14/cstdalign", "type": "file" }, { - "bom-ref": "1827ea69f23bac85", + "bom-ref": "528eec37a49b0c37", "name": "/usr/include/c++/14/cstdarg", "type": "file" }, { - "bom-ref": "7fa37791ee6f0fac", + "bom-ref": "8299c2ca4b46f5fa", "name": "/usr/include/c++/14/cstdbool", "type": "file" }, { - "bom-ref": "cc0bed52d4f247cb", + "bom-ref": "d2805854f6997f2d", "name": "/usr/include/c++/14/cstddef", "type": "file" }, { - "bom-ref": "062a4c5f92f24843", + "bom-ref": "647a9183e8333dfd", "name": "/usr/include/c++/14/cstdint", "type": "file" }, { - "bom-ref": "763665750a61486c", + "bom-ref": "7ad673d5f2f813d2", "name": "/usr/include/c++/14/cstdio", "type": "file" }, { - "bom-ref": "df35c03161e57fae", + "bom-ref": "3119b0d869c696c0", "name": "/usr/include/c++/14/cstdlib", "type": "file" }, { - "bom-ref": "29a388167c78e266", + "bom-ref": "764bf92ff6313fb8", "name": "/usr/include/c++/14/cstring", "type": "file" }, { - "bom-ref": "b986127d0c104195", + "bom-ref": "d12df22a8f321f03", "name": "/usr/include/c++/14/ctgmath", "type": "file" }, { - "bom-ref": "d9cbd3476bdff33e", + "bom-ref": "f6d6edebdb6fa660", "name": "/usr/include/c++/14/ctime", "type": "file" }, { - "bom-ref": "ae36aeef25cbaaca", + "bom-ref": "4914940df1d4536c", "name": "/usr/include/c++/14/cuchar", "type": "file" }, { - "bom-ref": "20923261d57b722a", + "bom-ref": "09b2e4b74267fa30", "name": "/usr/include/c++/14/cwchar", "type": "file" }, { - "bom-ref": "5f4eb84ad3459d50", + "bom-ref": "3bad806391b48dce", "name": "/usr/include/c++/14/cwctype", "type": "file" }, { - "bom-ref": "d335e6861a6836b2", + "bom-ref": "7bc4136cd38e0fc0", "name": "/usr/include/c++/14/cxxabi.h", "type": "file" }, { - "bom-ref": "539c8bf4ddffc553", + "bom-ref": "d679528d4b624625", "name": "/usr/include/c++/14/debug/assertions.h", "type": "file" }, { - "bom-ref": "d3728d285dc13373", + "bom-ref": "1adaba929ef5b989", "name": "/usr/include/c++/14/debug/bitset", "type": "file" }, { - "bom-ref": "4fccbc01d074663d", + "bom-ref": "6c5361668f3933cf", "name": "/usr/include/c++/14/debug/debug.h", "type": "file" }, { - "bom-ref": "da14e9fd5ecef5ae", + "bom-ref": "8539d1fbbf53e5bc", "name": "/usr/include/c++/14/debug/deque", "type": "file" }, { - "bom-ref": "86eebf7251069037", + "bom-ref": "766e6814083b2c1d", "name": "/usr/include/c++/14/debug/formatter.h", "type": "file" }, { - "bom-ref": "b6dba386da81a67b", + "bom-ref": "76cd153bfb8a8c6d", "name": "/usr/include/c++/14/debug/forward_list", "type": "file" }, { - "bom-ref": "e1cbafe8f8e262af", + "bom-ref": "d92334c580530b65", "name": "/usr/include/c++/14/debug/functions.h", "type": "file" }, { - "bom-ref": "9e463df62d86df6a", + "bom-ref": "2bb9494418196c68", "name": "/usr/include/c++/14/debug/helper_functions.h", "type": "file" }, { - "bom-ref": "2476658a12465579", + "bom-ref": "0c84659ef3bc8b1f", "name": "/usr/include/c++/14/debug/list", "type": "file" }, { - "bom-ref": "302511b1ad358633", + "bom-ref": "c20f329c2b892c41", "name": "/usr/include/c++/14/debug/macros.h", "type": "file" }, { - "bom-ref": "0dae54910f65631a", + "bom-ref": "eca137b1e0b657e4", "name": "/usr/include/c++/14/debug/map", "type": "file" }, { - "bom-ref": "c7b3028c7f09e51d", + "bom-ref": "c759d248d945780f", "name": "/usr/include/c++/14/debug/map.h", "type": "file" }, { - "bom-ref": "2c13e3c33a03bd71", + "bom-ref": "6a60eea6d9155d67", "name": "/usr/include/c++/14/debug/multimap.h", "type": "file" }, { - "bom-ref": "6bc7f6348469e8ff", + "bom-ref": "259a6100b6abfacd", "name": "/usr/include/c++/14/debug/multiset.h", "type": "file" }, { - "bom-ref": "ea69a6b51fec4792", + "bom-ref": "be991f17e8c43ef0", "name": "/usr/include/c++/14/debug/safe_base.h", "type": "file" }, { - "bom-ref": "eec3613c5dfd7c9d", + "bom-ref": "0178bd36054dadf3", "name": "/usr/include/c++/14/debug/safe_container.h", "type": "file" }, { - "bom-ref": "8fabb63171b018a0", + "bom-ref": "011faf9582bb66da", "name": "/usr/include/c++/14/debug/safe_iterator.h", "type": "file" }, { - "bom-ref": "d9d82b8423d0a6dd", + "bom-ref": "0678e23b44544eb3", "name": "/usr/include/c++/14/debug/safe_iterator.tcc", "type": "file" }, { - "bom-ref": "bf79b5c65f6eede3", + "bom-ref": "c41b6545d3a0bafd", "name": "/usr/include/c++/14/debug/safe_local_iterator.h", "type": "file" }, { - "bom-ref": "7e6bdbbf87e7fe8f", + "bom-ref": "2305e832cb132189", "name": "/usr/include/c++/14/debug/safe_local_iterator.tcc", "type": "file" }, { - "bom-ref": "64cd5581831f7612", + "bom-ref": "0bfb6e31f255f06c", "name": "/usr/include/c++/14/debug/safe_sequence.h", "type": "file" }, { - "bom-ref": "8a2780aded677f52", + "bom-ref": "cef223d6bf1ec478", "name": "/usr/include/c++/14/debug/safe_sequence.tcc", "type": "file" }, { - "bom-ref": "01cfddf8d35fdb74", + "bom-ref": "c02839054c4d09fa", "name": "/usr/include/c++/14/debug/safe_unordered_base.h", "type": "file" }, { - "bom-ref": "1644e9e316c8cc1a", + "bom-ref": "9552d14d5fd72894", "name": "/usr/include/c++/14/debug/safe_unordered_container.h", "type": "file" }, { - "bom-ref": "dca8a7b8befa40b6", + "bom-ref": "80b38b8e6555d1a8", "name": "/usr/include/c++/14/debug/safe_unordered_container.tcc", "type": "file" }, { - "bom-ref": "0227f16613035d0e", + "bom-ref": "dbe7ad7083b343ec", "name": "/usr/include/c++/14/debug/set", "type": "file" }, { - "bom-ref": "07945d04d7545b9c", + "bom-ref": "2b248e8322ae2fa6", "name": "/usr/include/c++/14/debug/set.h", "type": "file" }, { - "bom-ref": "b36c9c5336e00954", + "bom-ref": "70bcefc135e087b2", "name": "/usr/include/c++/14/debug/stl_iterator.h", "type": "file" }, { - "bom-ref": "6a24ae4ce5f84df7", + "bom-ref": "a8d65796656d507d", "name": "/usr/include/c++/14/debug/string", "type": "file" }, { - "bom-ref": "9f84545b9fd9180e", + "bom-ref": "8cca1d34ba49bafc", "name": "/usr/include/c++/14/debug/unordered_map", "type": "file" }, { - "bom-ref": "4790248c4f1561d5", + "bom-ref": "1eed7c9e988d6caf", "name": "/usr/include/c++/14/debug/unordered_set", "type": "file" }, { - "bom-ref": "88c4ef75273acfa9", + "bom-ref": "39a0d2e3080332d3", "name": "/usr/include/c++/14/debug/vector", "type": "file" }, { - "bom-ref": "cefaf5a45a4e1df4", + "bom-ref": "49b2acf2b8b95ace", "name": "/usr/include/c++/14/decimal/decimal", "type": "file" }, { - "bom-ref": "2db66bfec98bd72b", + "bom-ref": "65ad541c744d0fe1", "name": "/usr/include/c++/14/decimal/decimal.h", "type": "file" }, { - "bom-ref": "aface040811b83bf", + "bom-ref": "b2e91f14c6e8acc9", "name": "/usr/include/c++/14/deque", "type": "file" }, { - "bom-ref": "f47d55689dac7546", + "bom-ref": "4f7ab8552f59306c", "name": "/usr/include/c++/14/exception", "type": "file" }, { - "bom-ref": "c37bbebe8b6515c6", + "bom-ref": "30bcdde361df8278", "name": "/usr/include/c++/14/execution", "type": "file" }, { - "bom-ref": "b57d5fe1f0bffd70", + "bom-ref": "b84d38712dd1f0ca", "name": "/usr/include/c++/14/expected", "type": "file" }, { - "bom-ref": "10286683a7273d29", + "bom-ref": "c940542ec1042f9f", "name": "/usr/include/c++/14/experimental/algorithm", "type": "file" }, { - "bom-ref": "ef45f0481017c8b1", + "bom-ref": "9fe24b58c75a3dd7", "name": "/usr/include/c++/14/experimental/any", "type": "file" }, { - "bom-ref": "84faebcb56946ab4", + "bom-ref": "a3988c6b3ca2e4fa", "name": "/usr/include/c++/14/experimental/array", "type": "file" }, { - "bom-ref": "36711ebcc890c355", + "bom-ref": "9b192a3d9f7196db", "name": "/usr/include/c++/14/experimental/bits/fs_dir.h", "type": "file" }, { - "bom-ref": "63ee20da64b22531", + "bom-ref": "44f227f522893973", "name": "/usr/include/c++/14/experimental/bits/fs_fwd.h", "type": "file" }, { - "bom-ref": "87fe462e0765bee0", + "bom-ref": "d9e95799de5a61a6", "name": "/usr/include/c++/14/experimental/bits/fs_ops.h", "type": "file" }, { - "bom-ref": "ff0e30e3507e2635", + "bom-ref": "90026cb256f4d533", "name": "/usr/include/c++/14/experimental/bits/fs_path.h", "type": "file" }, { - "bom-ref": "334ca9c764225a0a", + "bom-ref": "68beaa65c0253564", "name": "/usr/include/c++/14/experimental/bits/lfts_config.h", "type": "file" }, { - "bom-ref": "9437d3cd216115e2", + "bom-ref": "a139cb1057114f4c", "name": "/usr/include/c++/14/experimental/bits/net.h", "type": "file" }, { - "bom-ref": "2a293861f48ce7cd", + "bom-ref": "276b0247ec363beb", "name": "/usr/include/c++/14/experimental/bits/numeric_traits.h", "type": "file" }, { - "bom-ref": "14d66ed591c438ab", + "bom-ref": "ad697b2a57973f79", "name": "/usr/include/c++/14/experimental/bits/shared_ptr.h", "type": "file" }, { - "bom-ref": "10e0f28b4dcaf108", + "bom-ref": "0793d69836a8192e", "name": "/usr/include/c++/14/experimental/bits/simd.h", "type": "file" }, { - "bom-ref": "09fbf1777257df9a", + "bom-ref": "0ea1106a57b9d02c", "name": "/usr/include/c++/14/experimental/bits/simd_builtin.h", "type": "file" }, { - "bom-ref": "40fce5e4ec6e5cf0", + "bom-ref": "bc3be8cc312c7e46", "name": "/usr/include/c++/14/experimental/bits/simd_converter.h", "type": "file" }, { - "bom-ref": "46027bf46afdf53a", + "bom-ref": "83b4adfccb6cab38", "name": "/usr/include/c++/14/experimental/bits/simd_detail.h", "type": "file" }, { - "bom-ref": "3d9e506a927af325", + "bom-ref": "d76f657da5d9e6d7", "name": "/usr/include/c++/14/experimental/bits/simd_fixed_size.h", "type": "file" }, { - "bom-ref": "5ece11c739371a64", + "bom-ref": "e02917d298c9837a", "name": "/usr/include/c++/14/experimental/bits/simd_math.h", "type": "file" }, { - "bom-ref": "94ef0d953766d96d", + "bom-ref": "22eb53ec301f1fa3", "name": "/usr/include/c++/14/experimental/bits/simd_neon.h", "type": "file" }, { - "bom-ref": "aabe6e41c3c6bf65", + "bom-ref": "a753b99e8ec24783", "name": "/usr/include/c++/14/experimental/bits/simd_ppc.h", "type": "file" }, { - "bom-ref": "75abdd8e3640b221", + "bom-ref": "a96723af4ce3c903", "name": "/usr/include/c++/14/experimental/bits/simd_scalar.h", "type": "file" }, { - "bom-ref": "4662431b7cc0bc90", + "bom-ref": "7d8b5a016860ccc2", "name": "/usr/include/c++/14/experimental/bits/simd_sve.h", "type": "file" }, { - "bom-ref": "59bf14181ee7edb0", + "bom-ref": "57618c43c018bea2", "name": "/usr/include/c++/14/experimental/bits/simd_x86.h", "type": "file" }, { - "bom-ref": "72c1dc89a1db3443", + "bom-ref": "493ce6041b4e0609", "name": "/usr/include/c++/14/experimental/bits/simd_x86_conversions.h", "type": "file" }, { - "bom-ref": "9d97c588bf0cb937", + "bom-ref": "6c9e411c49ceb9b9", "name": "/usr/include/c++/14/experimental/bits/string_view.tcc", "type": "file" }, { - "bom-ref": "04da8718c221a143", + "bom-ref": "ad1260976a38af89", "name": "/usr/include/c++/14/experimental/buffer", "type": "file" }, { - "bom-ref": "d25b40dcff284a54", + "bom-ref": "e37e8800bd39668e", "name": "/usr/include/c++/14/experimental/chrono", "type": "file" }, { - "bom-ref": "6379f8e8a8e378c6", + "bom-ref": "ab5a816630f909b0", "name": "/usr/include/c++/14/experimental/contract", "type": "file" }, { - "bom-ref": "580e08700044729b", + "bom-ref": "8ddbea7dcbcc7ec5", "name": "/usr/include/c++/14/experimental/deque", "type": "file" }, { - "bom-ref": "54132990f8ed448e", + "bom-ref": "bd7557c97a991f30", "name": "/usr/include/c++/14/experimental/executor", "type": "file" }, { - "bom-ref": "a1dae7d05fafb79a", + "bom-ref": "37c67472f811852c", "name": "/usr/include/c++/14/experimental/filesystem", "type": "file" }, { - "bom-ref": "e2e85d9a1d62ed64", + "bom-ref": "59203374869c2266", "name": "/usr/include/c++/14/experimental/forward_list", "type": "file" }, { - "bom-ref": "5794de183b5ba4e4", + "bom-ref": "67adb5b8d8c11392", "name": "/usr/include/c++/14/experimental/functional", "type": "file" }, { - "bom-ref": "d048e605b933ed99", + "bom-ref": "348c44a733ec13a7", "name": "/usr/include/c++/14/experimental/internet", "type": "file" }, { - "bom-ref": "3db3eee0aaf54f86", + "bom-ref": "10e28660ba169e10", "name": "/usr/include/c++/14/experimental/io_context", "type": "file" }, { - "bom-ref": "eb5351d445f92447", + "bom-ref": "a66057199e8019f5", "name": "/usr/include/c++/14/experimental/iterator", "type": "file" }, { - "bom-ref": "4e87b11b674fcbc0", + "bom-ref": "5443713fa768ac6a", "name": "/usr/include/c++/14/experimental/list", "type": "file" }, { - "bom-ref": "55853647755f2f57", + "bom-ref": "17d1f7d0b9576535", "name": "/usr/include/c++/14/experimental/map", "type": "file" }, { - "bom-ref": "7f2c2f3f2c267ea4", + "bom-ref": "dd280800651e8b8e", "name": "/usr/include/c++/14/experimental/memory", "type": "file" }, { - "bom-ref": "4c5247b3c8411d17", + "bom-ref": "21fabd25c4a0b5f9", "name": "/usr/include/c++/14/experimental/memory_resource", "type": "file" }, { - "bom-ref": "7f133de8569a0358", + "bom-ref": "834a11d467a20542", "name": "/usr/include/c++/14/experimental/net", "type": "file" }, { - "bom-ref": "4595266090e533ef", + "bom-ref": "895866c4e040a365", "name": "/usr/include/c++/14/experimental/netfwd", "type": "file" }, { - "bom-ref": "f6bd0424ce693385", + "bom-ref": "207b430f241c01eb", "name": "/usr/include/c++/14/experimental/numeric", "type": "file" }, { - "bom-ref": "60b171e4632204c8", + "bom-ref": "f2c5a1348c25733e", "name": "/usr/include/c++/14/experimental/optional", "type": "file" }, { - "bom-ref": "cfc5594a5566d63c", + "bom-ref": "49bfe65289028e7e", "name": "/usr/include/c++/14/experimental/propagate_const", "type": "file" }, { - "bom-ref": "38db75070e2c1da2", + "bom-ref": "28132d12d3d449c4", "name": "/usr/include/c++/14/experimental/random", "type": "file" }, { - "bom-ref": "11a15a65901c6fe9", + "bom-ref": "6f1ca92e87be5e37", "name": "/usr/include/c++/14/experimental/ratio", "type": "file" }, { - "bom-ref": "d233090676b1b26e", + "bom-ref": "f60760c154607630", "name": "/usr/include/c++/14/experimental/regex", "type": "file" }, { - "bom-ref": "005bd8b07d34d1a3", + "bom-ref": "d4b1ee2d89771bcd", "name": "/usr/include/c++/14/experimental/scope", "type": "file" }, { - "bom-ref": "b93451c9052884d1", + "bom-ref": "16f9c4ac64cdc587", "name": "/usr/include/c++/14/experimental/set", "type": "file" }, { - "bom-ref": "2a8003bc96138cd3", + "bom-ref": "6969699d13071ccd", "name": "/usr/include/c++/14/experimental/simd", "type": "file" }, { - "bom-ref": "81129c6470b5578a", + "bom-ref": "d456b8af0cc8c4e4", "name": "/usr/include/c++/14/experimental/socket", "type": "file" }, { - "bom-ref": "638355133bcd2a32", + "bom-ref": "f716c68622f78b5c", "name": "/usr/include/c++/14/experimental/source_location", "type": "file" }, { - "bom-ref": "3022092e91c1dcdc", + "bom-ref": "c5b56f167e1a9f56", "name": "/usr/include/c++/14/experimental/string", "type": "file" }, { - "bom-ref": "675574f875d13b23", + "bom-ref": "0aebbae4dae8cb95", "name": "/usr/include/c++/14/experimental/string_view", "type": "file" }, { - "bom-ref": "f47435e226a540d7", + "bom-ref": "b863fcbcab8e5cf1", "name": "/usr/include/c++/14/experimental/synchronized_value", "type": "file" }, { - "bom-ref": "f1a4f1a457fe436d", + "bom-ref": "42f810079149a783", "name": "/usr/include/c++/14/experimental/system_error", "type": "file" }, { - "bom-ref": "9e0df1f8e4f2b23b", + "bom-ref": "68c33bb9496c4331", "name": "/usr/include/c++/14/experimental/timer", "type": "file" }, { - "bom-ref": "12d2e320290e2626", + "bom-ref": "c34cd1c43ffc3038", "name": "/usr/include/c++/14/experimental/tuple", "type": "file" }, { - "bom-ref": "cb6ba85fab04dad3", + "bom-ref": "f328d0f94280d6d1", "name": "/usr/include/c++/14/experimental/type_traits", "type": "file" }, { - "bom-ref": "51505221c405df5c", + "bom-ref": "f3d0762b050111aa", "name": "/usr/include/c++/14/experimental/unordered_map", "type": "file" }, { - "bom-ref": "777bb9606d90b704", + "bom-ref": "1992f7806f7207ca", "name": "/usr/include/c++/14/experimental/unordered_set", "type": "file" }, { - "bom-ref": "3b7e1f7d42c4d6dc", + "bom-ref": "eaa0cc460a7c5f22", "name": "/usr/include/c++/14/experimental/utility", "type": "file" }, { - "bom-ref": "c440568241f6c279", + "bom-ref": "f486d181802fa4db", "name": "/usr/include/c++/14/experimental/vector", "type": "file" }, { - "bom-ref": "a0d54e60b919da57", + "bom-ref": "601ab06bcdae803d", "name": "/usr/include/c++/14/ext/algorithm", "type": "file" }, { - "bom-ref": "2c0ccfdc0df9f3ad", + "bom-ref": "a5d3818e00ba4b6b", "name": "/usr/include/c++/14/ext/aligned_buffer.h", "type": "file" }, { - "bom-ref": "3f58834cac93304b", + "bom-ref": "af1bd0db2a6a6e01", "name": "/usr/include/c++/14/ext/alloc_traits.h", "type": "file" }, { - "bom-ref": "8b9c78e6b3c7217b", + "bom-ref": "7c68d8def300c2a9", "name": "/usr/include/c++/14/ext/atomicity.h", "type": "file" }, { - "bom-ref": "b19f4b54ccf8a6cd", + "bom-ref": "4f727fb7b9586e2b", "name": "/usr/include/c++/14/ext/bitmap_allocator.h", "type": "file" }, { - "bom-ref": "0a4ed4d72fc5eb8d", + "bom-ref": "7e05e389ead22c63", "name": "/usr/include/c++/14/ext/cast.h", "type": "file" }, { - "bom-ref": "f12ac0e84a5f623c", + "bom-ref": "00739181863206e2", "name": "/usr/include/c++/14/ext/cmath", "type": "file" }, { - "bom-ref": "3e37ddb532f6f174", + "bom-ref": "2f4bec94d09ed22e", "name": "/usr/include/c++/14/ext/codecvt_specializations.h", "type": "file" }, { - "bom-ref": "9971dc2cb176d420", + "bom-ref": "fbfa91beb6529a3a", "name": "/usr/include/c++/14/ext/concurrence.h", "type": "file" }, { - "bom-ref": "540172971b5c8e4d", + "bom-ref": "8936214402b6634f", "name": "/usr/include/c++/14/ext/debug_allocator.h", "type": "file" }, { - "bom-ref": "8084e875e4737672", + "bom-ref": "a3ff3a78738f6f58", "name": "/usr/include/c++/14/ext/enc_filebuf.h", "type": "file" }, { - "bom-ref": "f59d2ed92470245b", + "bom-ref": "a1591ba94f7ffdc1", "name": "/usr/include/c++/14/ext/extptr_allocator.h", "type": "file" }, { - "bom-ref": "4f6062b48c8dc0f3", + "bom-ref": "d51bca6ef15e0219", "name": "/usr/include/c++/14/ext/functional", "type": "file" }, { - "bom-ref": "3958f0897ce621b6", + "bom-ref": "383646ce87cb6344", "name": "/usr/include/c++/14/ext/hash_map", "type": "file" }, { - "bom-ref": "8c8600ac660c499d", + "bom-ref": "c75e5cc4ef631927", "name": "/usr/include/c++/14/ext/hash_set", "type": "file" }, { - "bom-ref": "519e6d7bdf4687fc", + "bom-ref": "8906edaff19c30e6", "name": "/usr/include/c++/14/ext/iterator", "type": "file" }, { - "bom-ref": "f2d374bfc7507df6", + "bom-ref": "f55c12478ba3fa04", "name": "/usr/include/c++/14/ext/malloc_allocator.h", "type": "file" }, { - "bom-ref": "01caf9ce9291c87f", + "bom-ref": "c986c6f1b88af77d", "name": "/usr/include/c++/14/ext/memory", "type": "file" }, { - "bom-ref": "786b6139f333a229", + "bom-ref": "a655bf2000def423", "name": "/usr/include/c++/14/ext/mt_allocator.h", "type": "file" }, { - "bom-ref": "2e6f0971a5e47c60", + "bom-ref": "9aea2b7d8ba99bbe", "name": "/usr/include/c++/14/ext/new_allocator.h", "type": "file" }, { - "bom-ref": "799aaf0b425e647d", + "bom-ref": "9760f014a2e36eab", "name": "/usr/include/c++/14/ext/numeric", "type": "file" }, { - "bom-ref": "0e2329b6a8cb43eb", + "bom-ref": "012593f8024ac049", "name": "/usr/include/c++/14/ext/numeric_traits.h", "type": "file" }, { - "bom-ref": "39a7e942acb7c4ac", + "bom-ref": "520ab919ec6e3706", "name": "/usr/include/c++/14/ext/pb_ds/assoc_container.hpp", "type": "file" }, { - "bom-ref": "351015fb9b9f1241", + "bom-ref": "8a0fea69e32cfc4b", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/bin_search_tree_.hpp", "type": "file" }, { - "bom-ref": "3b2cbc3d11bb929d", + "bom-ref": "17aff05318faacb3", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ad6281b547e788eb", + "bom-ref": "f065e56f3e25bea9", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "185e0b2675682f86", + "bom-ref": "7999bf74df296dd0", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f92013dc6ae4916c", + "bom-ref": "3ee7aa40852c8a52", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4c8132f206257b29", + "bom-ref": "66fbd54bbfe8f2a3", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "16b97f3e5b15b977", + "bom-ref": "197ce287fec00875", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6f6f33579c31afd8", + "bom-ref": "91dbfd3807843efe", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "58d1a95bf3caf2df", + "bom-ref": "71bf01c2432dc9c5", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/node_iterators.hpp", "type": "file" }, { - "bom-ref": "eb159c73cda08ec8", + "bom-ref": "9635c1de9d1d267a", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/point_iterators.hpp", "type": "file" }, { - "bom-ref": "18f6407632240640", + "bom-ref": "9906c256d67f63c2", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "918a44142591ab12", + "bom-ref": "67c705b4679bd418", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/r_erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "776c5ecb7dd1ba39", + "bom-ref": "bc8d9720b81a377b", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/rotate_fn_imps.hpp", "type": "file" }, { - "bom-ref": "910d3a686afeadde", + "bom-ref": "5faa84df3b780838", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7bd99b22e9c3dbe0", + "bom-ref": "55b82cf507ce9962", "name": "/usr/include/c++/14/ext/pb_ds/detail/bin_search_tree_/traits.hpp", "type": "file" }, { - "bom-ref": "a6e02c8be122f79b", + "bom-ref": "cebe8652956c6f1d", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/binary_heap_.hpp", "type": "file" }, { - "bom-ref": "6cbd294310cf730f", + "bom-ref": "c8e2229a4f0ac745", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/const_iterator.hpp", "type": "file" }, { - "bom-ref": "c53e01759563a6ab", + "bom-ref": "d3bb5622ab14fee5", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "44f21241d503c16f", + "bom-ref": "0869c9ec41c22bd5", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4a628e002f3031e6", + "bom-ref": "fb68400cdcf6a800", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/entry_cmp.hpp", "type": "file" }, { - "bom-ref": "654726d6d1a4ad6c", + "bom-ref": "7bd4f34508660eea", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/entry_pred.hpp", "type": "file" }, { - "bom-ref": "dd49f8aa72e2927e", + "bom-ref": "e6a053943bdc2d98", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "93c1afbc47b89444", + "bom-ref": "6f32f473979d4f4e", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "04d3b926367d2edb", + "bom-ref": "ecb5083482b04061", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9b0d3107c252ff45", + "bom-ref": "8bf7ffedbff8c663", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "bbeb8b70bde69037", + "bom-ref": "a9abb0054d238781", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "aae3251399eb148c", + "bom-ref": "136b00fde51f0f9e", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/point_const_iterator.hpp", "type": "file" }, { - "bom-ref": "6c874c9eafe08f6b", + "bom-ref": "e72a0804f919a769", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9e5f4e44f7a8c30e", + "bom-ref": "b38b6e31644d6ba0", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/resize_policy.hpp", "type": "file" }, { - "bom-ref": "10dcbbfed9fd5c2d", + "bom-ref": "36bcac14efe2b6b7", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7da86ebc816fbfbe", + "bom-ref": "cd8c8e50bce25bd0", "name": "/usr/include/c++/14/ext/pb_ds/detail/binary_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "869309e1e3e5e527", + "bom-ref": "9d7ed48498a43ac9", "name": "/usr/include/c++/14/ext/pb_ds/detail/binomial_heap_/binomial_heap_.hpp", "type": "file" }, { - "bom-ref": "6e59bb8e8988ecd9", + "bom-ref": "1ddd2b810257a1bb", "name": "/usr/include/c++/14/ext/pb_ds/detail/binomial_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "21d5e54bb41941e1", + "bom-ref": "114fb234fc1c3b5f", "name": "/usr/include/c++/14/ext/pb_ds/detail/binomial_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "db3a74317429696c", + "bom-ref": "5a05e4eb59ff7ed6", "name": "/usr/include/c++/14/ext/pb_ds/detail/binomial_heap_base_/binomial_heap_base_.hpp", "type": "file" }, { - "bom-ref": "4639a49fb620da06", + "bom-ref": "1e58fac6b5b03430", "name": "/usr/include/c++/14/ext/pb_ds/detail/binomial_heap_base_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2dda7b2dafdb2513", + "bom-ref": "dcea2879784bd791", "name": "/usr/include/c++/14/ext/pb_ds/detail/binomial_heap_base_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "586ccfe61e31cf17", + "bom-ref": "3b9f41fb6b2eb6a1", "name": "/usr/include/c++/14/ext/pb_ds/detail/binomial_heap_base_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "dc876708297e30f5", + "bom-ref": "a2735a8ed10e84df", "name": "/usr/include/c++/14/ext/pb_ds/detail/binomial_heap_base_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c21e40e348677952", + "bom-ref": "7bf33a40273ed08c", "name": "/usr/include/c++/14/ext/pb_ds/detail/binomial_heap_base_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c1fe152cd8f70d2d", + "bom-ref": "eec93999fcd42f8b", "name": "/usr/include/c++/14/ext/pb_ds/detail/binomial_heap_base_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d3473c8bac572708", + "bom-ref": "91d6031597b90426", "name": "/usr/include/c++/14/ext/pb_ds/detail/branch_policy/branch_policy.hpp", "type": "file" }, { - "bom-ref": "227174c79ec987bb", + "bom-ref": "646d8918bec38591", "name": "/usr/include/c++/14/ext/pb_ds/detail/branch_policy/null_node_metadata.hpp", "type": "file" }, { - "bom-ref": "ed1340e87a669933", + "bom-ref": "daaaedb6f2258585", "name": "/usr/include/c++/14/ext/pb_ds/detail/branch_policy/traits.hpp", "type": "file" }, { - "bom-ref": "a08673d516ee737b", + "bom-ref": "9853011611c0d2a1", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp", "type": "file" }, { - "bom-ref": "42eb5d4bd4ec7626", + "bom-ref": "8691a90240f18008", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/cmp_fn_imps.hpp", "type": "file" }, { - "bom-ref": "64e086c2796bab6c", + "bom-ref": "f7af77c06a7655ee", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/cond_key_dtor_entry_dealtor.hpp", "type": "file" }, { - "bom-ref": "35b31d83bb207920", + "bom-ref": "0db9d778272fb6ee", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2b1601abf20a80be", + "bom-ref": "5739c15eddd20834", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "649ed0a0ad4d541b", + "bom-ref": "d97d7a9c9905e735", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "3623f2782b83dd24", + "bom-ref": "3d558655314c6e36", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "fedd785c86453eac", + "bom-ref": "41c72e22674772ca", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/debug_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9a6579aa8bb02a71", + "bom-ref": "7e44cb914ad8b693", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/debug_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "74a70aa97920c0f4", + "bom-ref": "5ec94ef12252828e", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/entry_list_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0cdf2d8333d9c323", + "bom-ref": "d3441ca240670dfd", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f48c084a721581a2", + "bom-ref": "d7b038b0f8cd6418", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/erase_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "64ef82922ad433e5", + "bom-ref": "4ba2905152ded323", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/erase_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "eb2fd66830bab26e", + "bom-ref": "090d8392bcadeb18", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "3c1a4819a4244564", + "bom-ref": "f6bd3701331626ea", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/find_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4faa876e7db6c3a1", + "bom-ref": "20ca50e23327b4a7", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5a92b59f68efdbd2", + "bom-ref": "f9f82d1556715d8c", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d0acdd99037ec47c", + "bom-ref": "9d5f7dfc3d03b47e", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/insert_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7f7781a048940b29", + "bom-ref": "c4ed770222c07bdb", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/insert_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d239ed0f9922aa8b", + "bom-ref": "a903ac30e0f1fc25", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "94fc7b7f1f260dc4", + "bom-ref": "ee7a1f99cf380a12", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "50d2febc50e64348", + "bom-ref": "34b8d0c3353da472", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/resize_fn_imps.hpp", "type": "file" }, { - "bom-ref": "3c41fb61b9410845", + "bom-ref": "75eb6301fad5be5f", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/resize_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b29a647b495ad730", + "bom-ref": "d754842f744708b6", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/resize_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b047f7929cb41f1d", + "bom-ref": "23ccf4575e72e9f7", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/size_fn_imps.hpp", "type": "file" }, { - "bom-ref": "deba855503210561", + "bom-ref": "abf3bbf487a3319f", "name": "/usr/include/c++/14/ext/pb_ds/detail/cc_hash_table_map_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0dc7d2f92ac6e866", + "bom-ref": "4183623d8d574a6c", "name": "/usr/include/c++/14/ext/pb_ds/detail/cond_dealtor.hpp", "type": "file" }, { - "bom-ref": "c76327a17b42f29a", + "bom-ref": "4c4f49df75eb63c8", "name": "/usr/include/c++/14/ext/pb_ds/detail/container_base_dispatch.hpp", "type": "file" }, { - "bom-ref": "7eb9f0dab028e649", + "bom-ref": "813e13129e7a4acb", "name": "/usr/include/c++/14/ext/pb_ds/detail/debug_map_base.hpp", "type": "file" }, { - "bom-ref": "b176baba29af6160", + "bom-ref": "aa00654a236a1eee", "name": "/usr/include/c++/14/ext/pb_ds/detail/eq_fn/eq_by_less.hpp", "type": "file" }, { - "bom-ref": "548fbb1a63c5e5a8", + "bom-ref": "89aefac9b01628b2", "name": "/usr/include/c++/14/ext/pb_ds/detail/eq_fn/hash_eq_fn.hpp", "type": "file" }, { - "bom-ref": "00ca37aafa17a8c1", + "bom-ref": "0d39bd5468af941b", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "212a3031ebffa6a2", + "bom-ref": "259a9122b75724c8", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c9110b18acd7efd0", + "bom-ref": "3f75a03582c9438a", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5893bb10eb8b376d", + "bom-ref": "c4ae9d4aa8ed4023", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2a61ecc1f2855d65", + "bom-ref": "653c6dca75f5599b", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/debug_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "14dd55682f10a562", + "bom-ref": "c454dfd9a11cbf98", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/debug_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c103392dc9084ccd", + "bom-ref": "8019f79cb00286ab", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "500cfe2a814414d7", + "bom-ref": "a4fb44cc3e686af5", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/erase_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c0099647072e6250", + "bom-ref": "ce0f72c03ed26ce2", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/erase_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "cb51b4fdab0e1b56", + "bom-ref": "2957f058baf1b454", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "343adc8a0719411a", + "bom-ref": "cbbdf5c4dba9f548", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/find_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "df2aa75cad58a69f", + "bom-ref": "4e481177fd838d49", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/find_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ead0b7c1b1938b99", + "bom-ref": "560abc19628ed5ef", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp", "type": "file" }, { - "bom-ref": "461427cdcd476ac6", + "bom-ref": "6e95ae1522d9d854", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f468abf8474108ba", + "bom-ref": "ccd76fba77a942b4", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a12e78873ab3aa01", + "bom-ref": "2bff1d30cd2029af", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/insert_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "fd3a83ab2f48d361", + "bom-ref": "0846bc1848baa21b", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/insert_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7460f3b380a05140", + "bom-ref": "b0f4d26b5d7099aa", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/iterator_fn_imps.hpp", "type": "file" }, { - "bom-ref": "63405807a99fc75d", + "bom-ref": "73be5bb792bd858b", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "98e4078db008018e", + "bom-ref": "a9c6048e3508e274", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/resize_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e592d19e878e00d5", + "bom-ref": "46e027cbc981e77f", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/resize_no_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c1890b2790baef5b", + "bom-ref": "933543d07764c579", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/resize_store_hash_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6b14b42b3a0c0655", + "bom-ref": "f1ac8dde678c70b3", "name": "/usr/include/c++/14/ext/pb_ds/detail/gp_hash_table_map_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ef35ff7a39ea843e", + "bom-ref": "e9994cc31c320400", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/direct_mask_range_hashing_imp.hpp", "type": "file" }, { - "bom-ref": "61169894a3e8a481", + "bom-ref": "91f357a545f87e3f", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/direct_mod_range_hashing_imp.hpp", "type": "file" }, { - "bom-ref": "bb4be16bc988e8fe", + "bom-ref": "719ef0c4fafc8e90", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/linear_probe_fn_imp.hpp", "type": "file" }, { - "bom-ref": "591b90ff19b35107", + "bom-ref": "462f2b13917ca2a9", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/mask_based_range_hashing.hpp", "type": "file" }, { - "bom-ref": "6ce3df1c0ef172f5", + "bom-ref": "e9a6886d9d21b20f", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/mod_based_range_hashing.hpp", "type": "file" }, { - "bom-ref": "867cf354282180bd", + "bom-ref": "5c47ea4ce15257a3", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/probe_fn_base.hpp", "type": "file" }, { - "bom-ref": "3382bdfcc5df36c1", + "bom-ref": "95400041a3f7aae7", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/quadratic_probe_fn_imp.hpp", "type": "file" }, { - "bom-ref": "5272c05032e37e9d", + "bom-ref": "4df172b01442d513", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/ranged_hash_fn.hpp", "type": "file" }, { - "bom-ref": "7d1500fce8db35e6", + "bom-ref": "ee852e080c307a08", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/ranged_probe_fn.hpp", "type": "file" }, { - "bom-ref": "320e5ea6fa57dad9", + "bom-ref": "5229f626c1ebfbb3", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/sample_probe_fn.hpp", "type": "file" }, { - "bom-ref": "481cdf2db8bbdc78", + "bom-ref": "7cbf63db0e9e3d8e", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/sample_range_hashing.hpp", "type": "file" }, { - "bom-ref": "d387aee1850f6a89", + "bom-ref": "88c477ade3809d0f", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/sample_ranged_hash_fn.hpp", "type": "file" }, { - "bom-ref": "5dd83b545d5f6f04", + "bom-ref": "6f9284e30eca26e2", "name": "/usr/include/c++/14/ext/pb_ds/detail/hash_fn/sample_ranged_probe_fn.hpp", "type": "file" }, { - "bom-ref": "d7e2449503d77bc4", + "bom-ref": "c69828faa241a3de", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/const_iterator.hpp", "type": "file" }, { - "bom-ref": "6c7701de27d08722", + "bom-ref": "48f9554295471a98", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "56099025977d9ce3", + "bom-ref": "c624d751c46d4b8d", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "de301de7e678934f", + "bom-ref": "2b89a8fd457f7ae9", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "96c26ea2c763ec0a", + "bom-ref": "616807a619ef699c", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "54686f3805479bef", + "bom-ref": "930a27328b811b75", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "135a9e3ccd9addfd", + "bom-ref": "29d2fdacebbfed0f", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e18cf71dd698410f", + "bom-ref": "b0150b9844b06cdd", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/left_child_next_sibling_heap_.hpp", "type": "file" }, { - "bom-ref": "989823918c144bba", + "bom-ref": "65dc2f75307bc838", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/node.hpp", "type": "file" }, { - "bom-ref": "33955d3a91a18c77", + "bom-ref": "863e99f849f7bae9", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/point_const_iterator.hpp", "type": "file" }, { - "bom-ref": "36e1e605b849a18e", + "bom-ref": "97e872454fed9164", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5d7c8a044cd147b4", + "bom-ref": "55572b0b7f95ca1a", "name": "/usr/include/c++/14/ext/pb_ds/detail/left_child_next_sibling_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f121bccb762e900c", + "bom-ref": "3a6d9b03157545b6", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_map_/constructor_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c8a4d0959db3c2ff", + "bom-ref": "0064444debe17215", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f7a1bae32a7f374e", + "bom-ref": "ef31dbcc7e66fc78", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_map_/entry_metadata_base.hpp", "type": "file" }, { - "bom-ref": "540d45067c096d3c", + "bom-ref": "aa4ff85edab834de", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8800a29720b07843", + "bom-ref": "b8a2677cbade78ad", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9739295d4792c2d5", + "bom-ref": "611781fbca37d26f", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "88cb6f75d68e10ef", + "bom-ref": "01315e9208700185", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2ef72811236a3ac7", + "bom-ref": "7d3f91aef6327df1", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_map_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4e37f602a86c83b6", + "bom-ref": "50bb8c71b1961994", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_map_/lu_map_.hpp", "type": "file" }, { - "bom-ref": "3a0c1b7a40799117", + "bom-ref": "fe1af4e3e0f5bced", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_map_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "e5bf648a1fcf9324", + "bom-ref": "5baa192a6324121a", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_policy/lu_counter_metadata.hpp", "type": "file" }, { - "bom-ref": "642b660d0496acff", + "bom-ref": "bb11cfd3aaf63829", "name": "/usr/include/c++/14/ext/pb_ds/detail/list_update_policy/sample_update_policy.hpp", "type": "file" }, { - "bom-ref": "8ce3c86cc9450281", + "bom-ref": "e51082ef511abf03", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "f363b2c41a6d44f1", + "bom-ref": "bb50e34957981027", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "924a8525647c050d", + "bom-ref": "806500c781df08ab", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d9c8b1cbdfcb31d2", + "bom-ref": "d17633df317ef63c", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5dd74e55592418c8", + "bom-ref": "fd90e5754094e316", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a172d16a5dd51b2e", + "bom-ref": "9f27cc6d58cd4d6c", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "14c8de30f7ec7c8d", + "bom-ref": "52f5241b1e18cdcf", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/node_iterators.hpp", "type": "file" }, { - "bom-ref": "8815d2044531da79", + "bom-ref": "a5c100a36cc220ab", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp", "type": "file" }, { - "bom-ref": "4bc7ad394eb08f49", + "bom-ref": "889cc9bb30194a63", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a8b7a20e2b583cb1", + "bom-ref": "1520daf68e7c3ecf", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "244490136da1fa65", + "bom-ref": "dec7a9a43c5666ef", "name": "/usr/include/c++/14/ext/pb_ds/detail/ov_tree_map_/traits.hpp", "type": "file" }, { - "bom-ref": "b55a11fc949ecb4d", + "bom-ref": "5603275a56e2ebc3", "name": "/usr/include/c++/14/ext/pb_ds/detail/pairing_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d9c73b3360eca5e0", + "bom-ref": "0d1691f23adcf6ba", "name": "/usr/include/c++/14/ext/pb_ds/detail/pairing_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a0926289a065e2f0", + "bom-ref": "ae9a3d5ac2902eae", "name": "/usr/include/c++/14/ext/pb_ds/detail/pairing_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "3f6016c7859afc0d", + "bom-ref": "9bf348b4f2e33343", "name": "/usr/include/c++/14/ext/pb_ds/detail/pairing_heap_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d1094bb352f97b08", + "bom-ref": "fdc68d292b27e596", "name": "/usr/include/c++/14/ext/pb_ds/detail/pairing_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "bf249888115683f7", + "bom-ref": "e6531883f9769b41", "name": "/usr/include/c++/14/ext/pb_ds/detail/pairing_heap_/pairing_heap_.hpp", "type": "file" }, { - "bom-ref": "e39ec12dfb92cd94", + "bom-ref": "9aa503705dadc8b6", "name": "/usr/include/c++/14/ext/pb_ds/detail/pairing_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "77c05dfbc4ce998f", + "bom-ref": "6dbadd6772fce935", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "fc3c8cadcb76f230", + "bom-ref": "4785acbacd66ac06", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "7bcc0d05de9e10e0", + "bom-ref": "01038244e603c942", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "163d5951fed951e1", + "bom-ref": "930efb388869552f", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "46cd3125f8f4b462", + "bom-ref": "76c6e69a6a0c6200", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "2a757fee4044db32", + "bom-ref": "495a2b723b175724", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/insert_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "9dfb30eff0a0ebf2", + "bom-ref": "da81117f535fe5a0", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/iterators_fn_imps.hpp", "type": "file" }, { - "bom-ref": "d18d08f671ece5a8", + "bom-ref": "58019ad3875af882", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/pat_trie_.hpp", "type": "file" }, { - "bom-ref": "36144a9a4a53223b", + "bom-ref": "ddcf5cf29f2de789", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/pat_trie_base.hpp", "type": "file" }, { - "bom-ref": "e237dea8620b73da", + "bom-ref": "0321ce4505fcbfd4", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/policy_access_fn_imps.hpp", "type": "file" }, { - "bom-ref": "8847082ff56fe428", + "bom-ref": "2644191f7cf5c39e", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/r_erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "12b51f8d771c47ff", + "bom-ref": "60628e63b8f37ae9", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/rotate_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a8593a57d7103acc", + "bom-ref": "cfd13dc586d054c2", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/split_fn_imps.hpp", "type": "file" }, { - "bom-ref": "32f706217000d54c", + "bom-ref": "e88dc58ce3b4f502", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/synth_access_traits.hpp", "type": "file" }, { - "bom-ref": "5bc8e2154c5c796f", + "bom-ref": "d3f7da89467569dd", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "611686d64e3258dd", + "bom-ref": "99c9ded3d86f177b", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/traits.hpp", "type": "file" }, { - "bom-ref": "380a981e07393bd5", + "bom-ref": "8fd3ed5fa5dcd8ff", "name": "/usr/include/c++/14/ext/pb_ds/detail/pat_trie_/update_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b91c91e24b48151b", + "bom-ref": "125e8d39f132d90d", "name": "/usr/include/c++/14/ext/pb_ds/detail/priority_queue_base_dispatch.hpp", "type": "file" }, { - "bom-ref": "33332252b240b05d", + "bom-ref": "9e794d97f13de267", "name": "/usr/include/c++/14/ext/pb_ds/detail/rb_tree_map_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "1dc9d44d1aab1d38", + "bom-ref": "d43de3caf34bb6ba", "name": "/usr/include/c++/14/ext/pb_ds/detail/rb_tree_map_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4691d2b38fac323b", + "bom-ref": "86e1b9191002f581", "name": "/usr/include/c++/14/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "ab6d4757db43ca95", + "bom-ref": "5b12a22b6da67fa7", "name": "/usr/include/c++/14/ext/pb_ds/detail/rb_tree_map_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "172bb5b3f9290e51", + "bom-ref": "4439ec3b53d1bbe3", "name": "/usr/include/c++/14/ext/pb_ds/detail/rb_tree_map_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "560a0f7344566d65", + "bom-ref": "cde497f202d16173", "name": "/usr/include/c++/14/ext/pb_ds/detail/rb_tree_map_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "dab7a3b7fff1d51c", + "bom-ref": "4aaa0fc8815acf96", "name": "/usr/include/c++/14/ext/pb_ds/detail/rb_tree_map_/node.hpp", "type": "file" }, { - "bom-ref": "2fa98849cee09398", + "bom-ref": "e0c35efdee1ff7ca", "name": "/usr/include/c++/14/ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp", "type": "file" }, { - "bom-ref": "0a10c858fa571d57", + "bom-ref": "837302d69fa4572d", "name": "/usr/include/c++/14/ext/pb_ds/detail/rb_tree_map_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0b4c79f68bd84d72", + "bom-ref": "401124496dccba5c", "name": "/usr/include/c++/14/ext/pb_ds/detail/rb_tree_map_/traits.hpp", "type": "file" }, { - "bom-ref": "9f64debf6c7a706a", + "bom-ref": "e37336f95702b4b4", "name": "/usr/include/c++/14/ext/pb_ds/detail/rc_binomial_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "6552ee3846014681", + "bom-ref": "f05d423c92a7861b", "name": "/usr/include/c++/14/ext/pb_ds/detail/rc_binomial_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "76386c956b09b0c8", + "bom-ref": "b7cede71a7941f2e", "name": "/usr/include/c++/14/ext/pb_ds/detail/rc_binomial_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "179a86ffe8bcfa51", + "bom-ref": "cc81fc06aae2d913", "name": "/usr/include/c++/14/ext/pb_ds/detail/rc_binomial_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "36013bbdb6a6e500", + "bom-ref": "ba870c49864fdd66", "name": "/usr/include/c++/14/ext/pb_ds/detail/rc_binomial_heap_/rc.hpp", "type": "file" }, { - "bom-ref": "d85bdc5e6d327f02", + "bom-ref": "dd26d409385874ec", "name": "/usr/include/c++/14/ext/pb_ds/detail/rc_binomial_heap_/rc_binomial_heap_.hpp", "type": "file" }, { - "bom-ref": "c7fc501c8b42c76b", + "bom-ref": "4246e3c1ffb9af8d", "name": "/usr/include/c++/14/ext/pb_ds/detail/rc_binomial_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "0c177ebc7dc84546", + "bom-ref": "e01062ff765c79b4", "name": "/usr/include/c++/14/ext/pb_ds/detail/rc_binomial_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "33bd6f90d16f4c96", + "bom-ref": "5fa086c028ec9270", "name": "/usr/include/c++/14/ext/pb_ds/detail/resize_policy/cc_hash_max_collision_check_resize_trigger_imp.hpp", "type": "file" }, { - "bom-ref": "9e14138aef983023", + "bom-ref": "f89e058dd920c651", "name": "/usr/include/c++/14/ext/pb_ds/detail/resize_policy/hash_exponential_size_policy_imp.hpp", "type": "file" }, { - "bom-ref": "bbaf059e562fbdbf", + "bom-ref": "5b54ec4d4c3bce21", "name": "/usr/include/c++/14/ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_imp.hpp", "type": "file" }, { - "bom-ref": "e88f2b7b8d59f249", + "bom-ref": "01706f1d616a1feb", "name": "/usr/include/c++/14/ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_size_base.hpp", "type": "file" }, { - "bom-ref": "c55710bb5585c798", + "bom-ref": "ef0b7a626f5d4906", "name": "/usr/include/c++/14/ext/pb_ds/detail/resize_policy/hash_prime_size_policy_imp.hpp", "type": "file" }, { - "bom-ref": "c31265dc85e0bd45", + "bom-ref": "436b669511a676b3", "name": "/usr/include/c++/14/ext/pb_ds/detail/resize_policy/hash_standard_resize_policy_imp.hpp", "type": "file" }, { - "bom-ref": "45b577cc15b0ccbb", + "bom-ref": "f5c6b7870ecdffa9", "name": "/usr/include/c++/14/ext/pb_ds/detail/resize_policy/sample_resize_policy.hpp", "type": "file" }, { - "bom-ref": "36ff8f6ef6eec293", + "bom-ref": "8852821443ad6ead", "name": "/usr/include/c++/14/ext/pb_ds/detail/resize_policy/sample_resize_trigger.hpp", "type": "file" }, { - "bom-ref": "b2a616e181a3df82", + "bom-ref": "7396cf9d27a3130c", "name": "/usr/include/c++/14/ext/pb_ds/detail/resize_policy/sample_size_policy.hpp", "type": "file" }, { - "bom-ref": "2659c904c1d2a491", + "bom-ref": "3df2654f748807ef", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "4dc0213f8088388b", + "bom-ref": "f605ba888ab1e70d", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "47f93720793c5593", + "bom-ref": "ce3de45bd3d50795", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "513605afb4ebc814", + "bom-ref": "4686e5475f4a8f1a", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "55b0128b77ef6aa5", + "bom-ref": "b64b75fb31d84e2f", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/info_fn_imps.hpp", "type": "file" }, { - "bom-ref": "5df241f35bb9caa0", + "bom-ref": "16adc35900e6e56e", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "a07ad60d8b14e142", + "bom-ref": "f86b31786c097430", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/node.hpp", "type": "file" }, { - "bom-ref": "e2accd00eb703194", + "bom-ref": "46ddb6ef47d4a756", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp", "type": "file" }, { - "bom-ref": "469c4e335d7b724f", + "bom-ref": "a36386fed58a77e5", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/splay_tree_.hpp", "type": "file" }, { - "bom-ref": "d37663c1077f34ca", + "bom-ref": "f27ff3842b21b034", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "b8d3fe7c6ed41da2", + "bom-ref": "75905ad4e239cc70", "name": "/usr/include/c++/14/ext/pb_ds/detail/splay_tree_/traits.hpp", "type": "file" }, { - "bom-ref": "b774c3a47a11b552", + "bom-ref": "aa602bc620c0a944", "name": "/usr/include/c++/14/ext/pb_ds/detail/standard_policies.hpp", "type": "file" }, { - "bom-ref": "b0373da85860996d", + "bom-ref": "c7b5262a6d7e65db", "name": "/usr/include/c++/14/ext/pb_ds/detail/thin_heap_/constructors_destructor_fn_imps.hpp", "type": "file" }, { - "bom-ref": "c9819024ab6f6e11", + "bom-ref": "916e8b2dfd452c23", "name": "/usr/include/c++/14/ext/pb_ds/detail/thin_heap_/debug_fn_imps.hpp", "type": "file" }, { - "bom-ref": "893afe19bd94f351", + "bom-ref": "362516346a65459b", "name": "/usr/include/c++/14/ext/pb_ds/detail/thin_heap_/erase_fn_imps.hpp", "type": "file" }, { - "bom-ref": "889961f62e9785c2", + "bom-ref": "e0b4d5e4f4fcbf50", "name": "/usr/include/c++/14/ext/pb_ds/detail/thin_heap_/find_fn_imps.hpp", "type": "file" }, { - "bom-ref": "deb3a9c07f282e68", + "bom-ref": "7035f33dedf5c766", "name": "/usr/include/c++/14/ext/pb_ds/detail/thin_heap_/insert_fn_imps.hpp", "type": "file" }, { - "bom-ref": "09166028f74ef83f", + "bom-ref": "a601005cd57ae5ad", "name": "/usr/include/c++/14/ext/pb_ds/detail/thin_heap_/split_join_fn_imps.hpp", "type": "file" }, { - "bom-ref": "78730ce67e22b939", + "bom-ref": "9ff5b1469ecd6acf", "name": "/usr/include/c++/14/ext/pb_ds/detail/thin_heap_/thin_heap_.hpp", "type": "file" }, { - "bom-ref": "13fe0be81146f304", + "bom-ref": "b459e30c95b2f53e", "name": "/usr/include/c++/14/ext/pb_ds/detail/thin_heap_/trace_fn_imps.hpp", "type": "file" }, { - "bom-ref": "96a2ded4f0113de6", + "bom-ref": "76bac2ab7fa1253c", "name": "/usr/include/c++/14/ext/pb_ds/detail/tree_policy/node_metadata_selector.hpp", "type": "file" }, { - "bom-ref": "2d274f77d58935d9", + "bom-ref": "9582bbb123667f1b", "name": "/usr/include/c++/14/ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp", "type": "file" }, { - "bom-ref": "0b95e0ce4c6706fd", + "bom-ref": "618d19707178f17b", "name": "/usr/include/c++/14/ext/pb_ds/detail/tree_policy/sample_tree_node_update.hpp", "type": "file" }, { - "bom-ref": "405e7deaf5ea1db1", + "bom-ref": "d464f1d6e1aa390f", "name": "/usr/include/c++/14/ext/pb_ds/detail/tree_trace_base.hpp", "type": "file" }, { - "bom-ref": "e4e9829fbe2f6504", + "bom-ref": "101f628ef29497ee", "name": "/usr/include/c++/14/ext/pb_ds/detail/trie_policy/node_metadata_selector.hpp", "type": "file" }, { - "bom-ref": "55ed100fa24a62dc", + "bom-ref": "accf89ef1aa01b76", "name": "/usr/include/c++/14/ext/pb_ds/detail/trie_policy/order_statistics_imp.hpp", "type": "file" }, { - "bom-ref": "429164a8bf9c8456", + "bom-ref": "5da2a98c4acb7fcc", "name": "/usr/include/c++/14/ext/pb_ds/detail/trie_policy/prefix_search_node_update_imp.hpp", "type": "file" }, { - "bom-ref": "2220be0a21036777", + "bom-ref": "69c64ba7dbdaeab9", "name": "/usr/include/c++/14/ext/pb_ds/detail/trie_policy/sample_trie_access_traits.hpp", "type": "file" }, { - "bom-ref": "e60bbad5dc5bb7ba", + "bom-ref": "b3a344eeae3151d8", "name": "/usr/include/c++/14/ext/pb_ds/detail/trie_policy/sample_trie_node_update.hpp", "type": "file" }, { - "bom-ref": "445d5b08fba93193", + "bom-ref": "3c95ff24a0b9d799", "name": "/usr/include/c++/14/ext/pb_ds/detail/trie_policy/trie_policy_base.hpp", "type": "file" }, { - "bom-ref": "8ae0af9c9720c06a", + "bom-ref": "f5c61515ff21e334", "name": "/usr/include/c++/14/ext/pb_ds/detail/trie_policy/trie_string_access_traits_imp.hpp", "type": "file" }, { - "bom-ref": "7f8a50116fed1e54", + "bom-ref": "ab1e08f92cd1024e", "name": "/usr/include/c++/14/ext/pb_ds/detail/type_utils.hpp", "type": "file" }, { - "bom-ref": "903c4553fcea11f7", + "bom-ref": "dda88971787bc505", "name": "/usr/include/c++/14/ext/pb_ds/detail/types_traits.hpp", "type": "file" }, { - "bom-ref": "885f59ba37baa5ea", + "bom-ref": "87c7278e028fa908", "name": "/usr/include/c++/14/ext/pb_ds/detail/unordered_iterator/const_iterator.hpp", "type": "file" }, { - "bom-ref": "6bcb39de81e9759e", + "bom-ref": "34f5b0d6c22b0f8c", "name": "/usr/include/c++/14/ext/pb_ds/detail/unordered_iterator/iterator.hpp", "type": "file" }, { - "bom-ref": "6ee4430cd6a8ee9f", + "bom-ref": "e6bc8d0e30ccda6d", "name": "/usr/include/c++/14/ext/pb_ds/detail/unordered_iterator/point_const_iterator.hpp", "type": "file" }, { - "bom-ref": "95f986b70e1e9ac2", + "bom-ref": "533e4a11fe8a0a5c", "name": "/usr/include/c++/14/ext/pb_ds/detail/unordered_iterator/point_iterator.hpp", "type": "file" }, { - "bom-ref": "5c2571de8d7672b6", + "bom-ref": "deda0d38da2d63e8", "name": "/usr/include/c++/14/ext/pb_ds/exception.hpp", "type": "file" }, { - "bom-ref": "09606e26560acf97", + "bom-ref": "1fb8c0748a85f7b5", "name": "/usr/include/c++/14/ext/pb_ds/hash_policy.hpp", "type": "file" }, { - "bom-ref": "914b116e34de3eb8", + "bom-ref": "d5d26a68cf082d1e", "name": "/usr/include/c++/14/ext/pb_ds/list_update_policy.hpp", "type": "file" }, { - "bom-ref": "bd2fac64092231cd", + "bom-ref": "375e52f29a59e0b3", "name": "/usr/include/c++/14/ext/pb_ds/priority_queue.hpp", "type": "file" }, { - "bom-ref": "65c1919ad91b6a19", + "bom-ref": "daf2080fee3c942b", "name": "/usr/include/c++/14/ext/pb_ds/tag_and_trait.hpp", "type": "file" }, { - "bom-ref": "4a9fe45dc2c39617", + "bom-ref": "4574b381c26bae55", "name": "/usr/include/c++/14/ext/pb_ds/tree_policy.hpp", "type": "file" }, { - "bom-ref": "99781fa92514082b", + "bom-ref": "89f084fdfcf64555", "name": "/usr/include/c++/14/ext/pb_ds/trie_policy.hpp", "type": "file" }, { - "bom-ref": "b42190db17d530be", + "bom-ref": "f85c82a501d519b8", "name": "/usr/include/c++/14/ext/pod_char_traits.h", "type": "file" }, { - "bom-ref": "c3e7caf7bc9636f7", + "bom-ref": "299e068b1d0badf9", "name": "/usr/include/c++/14/ext/pointer.h", "type": "file" }, { - "bom-ref": "234185a58d794522", + "bom-ref": "d275c48acd2a27dc", "name": "/usr/include/c++/14/ext/pool_allocator.h", "type": "file" }, { - "bom-ref": "47089fe46b9c9978", + "bom-ref": "2f4daed73092f2ca", "name": "/usr/include/c++/14/ext/random", "type": "file" }, { - "bom-ref": "93621c2ebb553ddc", + "bom-ref": "44a10dcc4982ea5e", "name": "/usr/include/c++/14/ext/random.tcc", "type": "file" }, { - "bom-ref": "de714cbca5bcfc5b", + "bom-ref": "21b35607d639a5b9", "name": "/usr/include/c++/14/ext/rb_tree", "type": "file" }, { - "bom-ref": "32a23a4e1789947c", + "bom-ref": "5e65311e628e30e6", "name": "/usr/include/c++/14/ext/rc_string_base.h", "type": "file" }, { - "bom-ref": "5517cad9b819612b", + "bom-ref": "df2c1a850fb42d99", "name": "/usr/include/c++/14/ext/rope", "type": "file" }, { - "bom-ref": "f7ebb22d19e29299", + "bom-ref": "45af7b7dbc672a7b", "name": "/usr/include/c++/14/ext/ropeimpl.h", "type": "file" }, { - "bom-ref": "88f9a462489dd8dd", + "bom-ref": "9155d1e56d31693b", "name": "/usr/include/c++/14/ext/slist", "type": "file" }, { - "bom-ref": "f31b9cb524459139", + "bom-ref": "3955e545dc552a87", "name": "/usr/include/c++/14/ext/sso_string_base.h", "type": "file" }, { - "bom-ref": "6db04adb09b4195a", + "bom-ref": "ebc24e3ef530b230", "name": "/usr/include/c++/14/ext/stdio_filebuf.h", "type": "file" }, { - "bom-ref": "c8b34edb5e5d6bce", + "bom-ref": "d1025e426add0258", "name": "/usr/include/c++/14/ext/stdio_sync_filebuf.h", "type": "file" }, { - "bom-ref": "ac6607984f5a5bd6", + "bom-ref": "1487bcd4b21daea8", "name": "/usr/include/c++/14/ext/string_conversions.h", "type": "file" }, { - "bom-ref": "0f3babe55262bdfc", + "bom-ref": "53f4e90f257de8ea", "name": "/usr/include/c++/14/ext/throw_allocator.h", "type": "file" }, { - "bom-ref": "9fc8765905abbea3", + "bom-ref": "389317270070b441", "name": "/usr/include/c++/14/ext/type_traits.h", "type": "file" }, { - "bom-ref": "b11ff407710bace7", + "bom-ref": "3735a1974b9fbe1d", "name": "/usr/include/c++/14/ext/typelist.h", "type": "file" }, { - "bom-ref": "4b145b007d9f6e24", + "bom-ref": "6c6a25237928c33e", "name": "/usr/include/c++/14/ext/vstring.h", "type": "file" }, { - "bom-ref": "7045a97c930c927e", + "bom-ref": "e27f5d55d988585c", "name": "/usr/include/c++/14/ext/vstring.tcc", "type": "file" }, { - "bom-ref": "9c30a276b0d362e6", + "bom-ref": "4f088d952d314070", "name": "/usr/include/c++/14/ext/vstring_fwd.h", "type": "file" }, { - "bom-ref": "15f335e065baa76e", + "bom-ref": "291d86b39bd9e028", "name": "/usr/include/c++/14/ext/vstring_util.h", "type": "file" }, { - "bom-ref": "02cbe1cd7c06b7e4", + "bom-ref": "b404d208318dd7ca", "name": "/usr/include/c++/14/fenv.h", "type": "file" }, { - "bom-ref": "2589a7b769143a1c", + "bom-ref": "1c05eaef5df0e2ea", "name": "/usr/include/c++/14/filesystem", "type": "file" }, { - "bom-ref": "acdba26b86ac482d", + "bom-ref": "36d48d12fd926f4f", "name": "/usr/include/c++/14/format", "type": "file" }, { - "bom-ref": "d40f9ff82ba7fb47", + "bom-ref": "97dcc4f3c912d54d", "name": "/usr/include/c++/14/forward_list", "type": "file" }, { - "bom-ref": "4d95da3373aebde9", + "bom-ref": "f91a844d1b93e963", "name": "/usr/include/c++/14/fstream", "type": "file" }, { - "bom-ref": "e0890d582051f9ad", + "bom-ref": "d5b2d0bf0548cc0b", "name": "/usr/include/c++/14/functional", "type": "file" }, { - "bom-ref": "75ac76a2387f1add", + "bom-ref": "65415740d5f13e9b", "name": "/usr/include/c++/14/future", "type": "file" }, { - "bom-ref": "3287bbde93e8b991", + "bom-ref": "620dba3d200a8b97", "name": "/usr/include/c++/14/generator", "type": "file" }, { - "bom-ref": "91902f8ce12215da", + "bom-ref": "89c23f483dfbc97c", "name": "/usr/include/c++/14/initializer_list", "type": "file" }, { - "bom-ref": "23b5579980ca628f", + "bom-ref": "6d61e7a383ac43d5", "name": "/usr/include/c++/14/iomanip", "type": "file" }, { - "bom-ref": "15f76aae17ba61ca", + "bom-ref": "fdbeb8eef86b73a4", "name": "/usr/include/c++/14/ios", "type": "file" }, { - "bom-ref": "be49745228eabeaf", + "bom-ref": "f6be5079bce37001", "name": "/usr/include/c++/14/iosfwd", "type": "file" }, { - "bom-ref": "1da3b1d1b3a40915", + "bom-ref": "cb63df70bcce33c7", "name": "/usr/include/c++/14/iostream", "type": "file" }, { - "bom-ref": "50ee932254970b83", + "bom-ref": "62faadbbf0630651", "name": "/usr/include/c++/14/istream", "type": "file" }, { - "bom-ref": "a8b1d3e3c1ef45d7", + "bom-ref": "35e8655ae7d2e3ad", "name": "/usr/include/c++/14/iterator", "type": "file" }, { - "bom-ref": "7fa4da3f8a017d2f", + "bom-ref": "1b094daba092876d", "name": "/usr/include/c++/14/latch", "type": "file" }, { - "bom-ref": "0d507fe576e93613", + "bom-ref": "2074c60e8cb19715", "name": "/usr/include/c++/14/limits", "type": "file" }, { - "bom-ref": "3e5dd66b197e5182", + "bom-ref": "11a711d1669d2d38", "name": "/usr/include/c++/14/list", "type": "file" }, { - "bom-ref": "2a6e00c373b081ba", + "bom-ref": "d49e65d4858a76b0", "name": "/usr/include/c++/14/locale", "type": "file" }, { - "bom-ref": "41598dc4ea3d25b6", + "bom-ref": "96391a70c266fc64", "name": "/usr/include/c++/14/map", "type": "file" }, { - "bom-ref": "7c7a2279c09ba2bd", + "bom-ref": "70d2f57fd241c307", "name": "/usr/include/c++/14/math.h", "type": "file" }, { - "bom-ref": "e684924471aa9404", + "bom-ref": "143709b31c382196", "name": "/usr/include/c++/14/memory", "type": "file" }, { - "bom-ref": "e9544a020810e274", + "bom-ref": "e68a987cdb3070e6", "name": "/usr/include/c++/14/memory_resource", "type": "file" }, { - "bom-ref": "af0920de34c8cdef", + "bom-ref": "abf1b7c9eb22cadd", "name": "/usr/include/c++/14/mutex", "type": "file" }, { - "bom-ref": "93183aa9fb423908", + "bom-ref": "de3bad2b9b214e2e", "name": "/usr/include/c++/14/new", "type": "file" }, { - "bom-ref": "6f822235794d1600", + "bom-ref": "efff2c2358fc2b1a", "name": "/usr/include/c++/14/numbers", "type": "file" }, { - "bom-ref": "ae3266a253c293c1", + "bom-ref": "1f60ee3e2f683bcf", "name": "/usr/include/c++/14/numeric", "type": "file" }, { - "bom-ref": "c4e3bd7daf87f1eb", + "bom-ref": "f16d2bbf1fdf75fd", "name": "/usr/include/c++/14/optional", "type": "file" }, { - "bom-ref": "bdc5b1255b0fd85f", + "bom-ref": "d5ead63c6ad4deed", "name": "/usr/include/c++/14/ostream", "type": "file" }, { - "bom-ref": "d773dde4543ee458", + "bom-ref": "cc4f63452381895e", "name": "/usr/include/c++/14/parallel/algo.h", "type": "file" }, { - "bom-ref": "1b0f2f2b3ae466c2", + "bom-ref": "7d6a7af31d1ca7fc", "name": "/usr/include/c++/14/parallel/algobase.h", "type": "file" }, { - "bom-ref": "97ab3806c73d005f", + "bom-ref": "94710741243748a5", "name": "/usr/include/c++/14/parallel/algorithm", "type": "file" }, { - "bom-ref": "55a64718652803d4", + "bom-ref": "4d977fbdc2630a92", "name": "/usr/include/c++/14/parallel/algorithmfwd.h", "type": "file" }, { - "bom-ref": "e20529d36bc7afca", + "bom-ref": "faedf7b1b273aa10", "name": "/usr/include/c++/14/parallel/balanced_quicksort.h", "type": "file" }, { - "bom-ref": "81c5ef442a38dc53", + "bom-ref": "cf80759da306ab61", "name": "/usr/include/c++/14/parallel/base.h", "type": "file" }, { - "bom-ref": "1153e73ce4702f97", + "bom-ref": "fc5aecaf360e7e85", "name": "/usr/include/c++/14/parallel/basic_iterator.h", "type": "file" }, { - "bom-ref": "be048a93385dd6b7", + "bom-ref": "abd1bef863de7bb5", "name": "/usr/include/c++/14/parallel/checkers.h", "type": "file" }, { - "bom-ref": "a42384edf31ec70b", + "bom-ref": "e76ae19b01e25459", "name": "/usr/include/c++/14/parallel/compatibility.h", "type": "file" }, { - "bom-ref": "b041e65d6afa7218", + "bom-ref": "57b9ee9e1ba68ff6", "name": "/usr/include/c++/14/parallel/compiletime_settings.h", "type": "file" }, { - "bom-ref": "575230afa1673b90", + "bom-ref": "1cb7553f79105c8e", "name": "/usr/include/c++/14/parallel/equally_split.h", "type": "file" }, { - "bom-ref": "77e0694f956edffc", + "bom-ref": "69e596a80d18e646", "name": "/usr/include/c++/14/parallel/features.h", "type": "file" }, { - "bom-ref": "e79f5e52fed73468", + "bom-ref": "25944dc887ba0b72", "name": "/usr/include/c++/14/parallel/find.h", "type": "file" }, { - "bom-ref": "3dc46c428d3bc738", + "bom-ref": "81d17d266be5297e", "name": "/usr/include/c++/14/parallel/find_selectors.h", "type": "file" }, { - "bom-ref": "2c2edb02e58422bb", + "bom-ref": "d65488debce28da5", "name": "/usr/include/c++/14/parallel/for_each.h", "type": "file" }, { - "bom-ref": "22b6650f64ae5b67", + "bom-ref": "f522087819657dd1", "name": "/usr/include/c++/14/parallel/for_each_selectors.h", "type": "file" }, { - "bom-ref": "e5b3cfa0363b5cf8", + "bom-ref": "7a54c022a69fe872", "name": "/usr/include/c++/14/parallel/iterator.h", "type": "file" }, { - "bom-ref": "6fea11f90f587451", + "bom-ref": "7b961a712ff1277f", "name": "/usr/include/c++/14/parallel/list_partition.h", "type": "file" }, { - "bom-ref": "dbb2287a21f5ea11", + "bom-ref": "2394cc2fb104d9e3", "name": "/usr/include/c++/14/parallel/losertree.h", "type": "file" }, { - "bom-ref": "d32b6fd505ffa12e", + "bom-ref": "5c500b97763c25a8", "name": "/usr/include/c++/14/parallel/merge.h", "type": "file" }, { - "bom-ref": "4388b9adc29f7620", + "bom-ref": "147be8da8d5e94ea", "name": "/usr/include/c++/14/parallel/multiseq_selection.h", "type": "file" }, { - "bom-ref": "950f8694b79fc800", + "bom-ref": "e9d52db60b29cb4e", "name": "/usr/include/c++/14/parallel/multiway_merge.h", "type": "file" }, { - "bom-ref": "2ffc67f6f3649d94", + "bom-ref": "ccf0ccf66f4de26e", "name": "/usr/include/c++/14/parallel/multiway_mergesort.h", "type": "file" }, { - "bom-ref": "3f2bd196126e9c34", + "bom-ref": "2b7dab3fcc1398f6", "name": "/usr/include/c++/14/parallel/numeric", "type": "file" }, { - "bom-ref": "0b54a3259402606e", + "bom-ref": "b32766620c1fcaa8", "name": "/usr/include/c++/14/parallel/numericfwd.h", "type": "file" }, { - "bom-ref": "689ccd186d2b3ac2", + "bom-ref": "4e05f19009839f40", "name": "/usr/include/c++/14/parallel/omp_loop.h", "type": "file" }, { - "bom-ref": "a997627cfcd0e876", + "bom-ref": "8ac7d49ec608148c", "name": "/usr/include/c++/14/parallel/omp_loop_static.h", "type": "file" }, { - "bom-ref": "f58cbea61c510893", + "bom-ref": "ac5a7a004764dd95", "name": "/usr/include/c++/14/parallel/par_loop.h", "type": "file" }, { - "bom-ref": "fb02b37f4dc21ef4", + "bom-ref": "db13cdf13eaab4ae", "name": "/usr/include/c++/14/parallel/parallel.h", "type": "file" }, { - "bom-ref": "37537ce11be4ca08", + "bom-ref": "c0f169c77cefa12a", "name": "/usr/include/c++/14/parallel/partial_sum.h", "type": "file" }, { - "bom-ref": "2adc1a2497be4a3f", + "bom-ref": "e52f331b89ebf3c9", "name": "/usr/include/c++/14/parallel/partition.h", "type": "file" }, { - "bom-ref": "fa6058195766d226", + "bom-ref": "6691dfb13fc80fb4", "name": "/usr/include/c++/14/parallel/queue.h", "type": "file" }, { - "bom-ref": "fba3162b1800871d", + "bom-ref": "cd9c6ca593c766b7", "name": "/usr/include/c++/14/parallel/quicksort.h", "type": "file" }, { - "bom-ref": "6f92c84879ea51cd", + "bom-ref": "17ef576073f04293", "name": "/usr/include/c++/14/parallel/random_number.h", "type": "file" }, { - "bom-ref": "7da2b69129218058", + "bom-ref": "0978fd601bab270e", "name": "/usr/include/c++/14/parallel/random_shuffle.h", "type": "file" }, { - "bom-ref": "86c9877163de6017", + "bom-ref": "fa2d7e30029f4539", "name": "/usr/include/c++/14/parallel/search.h", "type": "file" }, { - "bom-ref": "3ee3c90d053d724e", + "bom-ref": "b8127c237b1f3b14", "name": "/usr/include/c++/14/parallel/set_operations.h", "type": "file" }, { - "bom-ref": "efeb39a06d57b059", + "bom-ref": "f49c3b1ab54a4da3", "name": "/usr/include/c++/14/parallel/settings.h", "type": "file" }, { - "bom-ref": "96ac25d2cf2be141", + "bom-ref": "c562de278de3459b", "name": "/usr/include/c++/14/parallel/sort.h", "type": "file" }, { - "bom-ref": "e6efeb84ac08147e", + "bom-ref": "72285cb5892b230c", "name": "/usr/include/c++/14/parallel/tags.h", "type": "file" }, { - "bom-ref": "a2a240be21572a81", + "bom-ref": "b1ad9396ff09627f", "name": "/usr/include/c++/14/parallel/types.h", "type": "file" }, { - "bom-ref": "7632cd0cf9cefa88", + "bom-ref": "df44c5df7392b14e", "name": "/usr/include/c++/14/parallel/unique_copy.h", "type": "file" }, { - "bom-ref": "2f17ef7ab84c33f4", + "bom-ref": "c3e67d5147ffcefa", "name": "/usr/include/c++/14/parallel/workstealing.h", "type": "file" }, { - "bom-ref": "a96fde4d5da4f1e6", + "bom-ref": "b2a08db8fd7f454c", "name": "/usr/include/c++/14/print", "type": "file" }, { - "bom-ref": "d2db6014ef009e1a", + "bom-ref": "86ea85097b89cde4", "name": "/usr/include/c++/14/pstl/algorithm_fwd.h", "type": "file" }, { - "bom-ref": "9d23ed03d2c8a043", + "bom-ref": "fb968ddde4881485", "name": "/usr/include/c++/14/pstl/algorithm_impl.h", "type": "file" }, { - "bom-ref": "74335f17ec0c89bc", + "bom-ref": "531f748a89d52f32", "name": "/usr/include/c++/14/pstl/execution_defs.h", "type": "file" }, { - "bom-ref": "1b3efdf1d39b6a22", + "bom-ref": "032a779bc848c074", "name": "/usr/include/c++/14/pstl/execution_impl.h", "type": "file" }, { - "bom-ref": "2248008950a1dcb7", + "bom-ref": "e0f826d7ec5b79f9", "name": "/usr/include/c++/14/pstl/glue_algorithm_defs.h", "type": "file" }, { - "bom-ref": "5025be7149c896ec", + "bom-ref": "489e98755cdd5926", "name": "/usr/include/c++/14/pstl/glue_algorithm_impl.h", "type": "file" }, { - "bom-ref": "4c41c36f3aaf33f5", + "bom-ref": "f1fca90777c651a7", "name": "/usr/include/c++/14/pstl/glue_execution_defs.h", "type": "file" }, { - "bom-ref": "1002c520eb0b7d37", + "bom-ref": "6380ecfa224af4b1", "name": "/usr/include/c++/14/pstl/glue_memory_defs.h", "type": "file" }, { - "bom-ref": "8880e3ef85f0fc67", + "bom-ref": "b56b702592b2adf1", "name": "/usr/include/c++/14/pstl/glue_memory_impl.h", "type": "file" }, { - "bom-ref": "3869cf0c8795441f", + "bom-ref": "edce3ff6b8a3482d", "name": "/usr/include/c++/14/pstl/glue_numeric_defs.h", "type": "file" }, { - "bom-ref": "83f77c971920d8ef", + "bom-ref": "1a5488cdece04fbd", "name": "/usr/include/c++/14/pstl/glue_numeric_impl.h", "type": "file" }, { - "bom-ref": "6806bdda350f504d", + "bom-ref": "2a56597c00aeac3b", "name": "/usr/include/c++/14/pstl/memory_impl.h", "type": "file" }, { - "bom-ref": "a9984c4fa344fa58", + "bom-ref": "c21077c59483910e", "name": "/usr/include/c++/14/pstl/numeric_fwd.h", "type": "file" }, { - "bom-ref": "bc383d16a6d9e637", + "bom-ref": "784104d6ac03c131", "name": "/usr/include/c++/14/pstl/numeric_impl.h", "type": "file" }, { - "bom-ref": "93d21fa10caafbf0", + "bom-ref": "ccfa832e328bef5e", "name": "/usr/include/c++/14/pstl/parallel_backend.h", "type": "file" }, { - "bom-ref": "80257bf07a41471c", + "bom-ref": "7cb2e662b5a2609a", "name": "/usr/include/c++/14/pstl/parallel_backend_serial.h", "type": "file" }, { - "bom-ref": "c01b273f2cb7f17f", + "bom-ref": "09d95986e563b145", "name": "/usr/include/c++/14/pstl/parallel_backend_tbb.h", "type": "file" }, { - "bom-ref": "17048969ee6c1461", + "bom-ref": "9fa47fbb5e5db467", "name": "/usr/include/c++/14/pstl/parallel_backend_utils.h", "type": "file" }, { - "bom-ref": "52f5e65bc90de603", + "bom-ref": "7cbe0de7cbf36e15", "name": "/usr/include/c++/14/pstl/parallel_impl.h", "type": "file" }, { - "bom-ref": "8d6b96e91497da98", + "bom-ref": "3b01dac70b430cea", "name": "/usr/include/c++/14/pstl/pstl_config.h", "type": "file" }, { - "bom-ref": "03589b485783c59c", + "bom-ref": "d875b2de8748b592", "name": "/usr/include/c++/14/pstl/unseq_backend_simd.h", "type": "file" }, { - "bom-ref": "41d42e29b8c5291e", + "bom-ref": "8daf9eabdcb51458", "name": "/usr/include/c++/14/pstl/utils.h", "type": "file" }, { - "bom-ref": "1fc3603fb481024e", + "bom-ref": "7c3c6dd716f5fb40", "name": "/usr/include/c++/14/queue", "type": "file" }, { - "bom-ref": "1e41a09bf2234364", + "bom-ref": "b83f9d808c21d822", "name": "/usr/include/c++/14/random", "type": "file" }, { - "bom-ref": "6ae87ba6ad252544", + "bom-ref": "92dc2c4ae6c42fde", "name": "/usr/include/c++/14/ranges", "type": "file" }, { - "bom-ref": "1a5412ec4764a12e", + "bom-ref": "2b170662a8b895a0", "name": "/usr/include/c++/14/ratio", "type": "file" }, { - "bom-ref": "b223b150e79705ef", + "bom-ref": "247c045550774c11", "name": "/usr/include/c++/14/regex", "type": "file" }, { - "bom-ref": "0620623aa1576667", + "bom-ref": "e51f76d8a42bcf39", "name": "/usr/include/c++/14/scoped_allocator", "type": "file" }, { - "bom-ref": "eae2883b9ec09d1b", + "bom-ref": "ca63ae0aea0c659d", "name": "/usr/include/c++/14/semaphore", "type": "file" }, { - "bom-ref": "0092d24935fa41ef", + "bom-ref": "84c9770c6aa96539", "name": "/usr/include/c++/14/set", "type": "file" }, { - "bom-ref": "f109c684640ed3a3", + "bom-ref": "e3ed0cb80d5c5f25", "name": "/usr/include/c++/14/shared_mutex", "type": "file" }, { - "bom-ref": "def29a5865ae7d45", + "bom-ref": "f19d5a790ccb7f77", "name": "/usr/include/c++/14/source_location", "type": "file" }, { - "bom-ref": "020bf9d6ac2b15ab", + "bom-ref": "7937e3a5ea73e93d", "name": "/usr/include/c++/14/span", "type": "file" }, { - "bom-ref": "a75fb5b825a77ed2", + "bom-ref": "db9f28525cac7404", "name": "/usr/include/c++/14/spanstream", "type": "file" }, { - "bom-ref": "afa88395c0b8d300", + "bom-ref": "c913515330b7496e", "name": "/usr/include/c++/14/sstream", "type": "file" }, { - "bom-ref": "13137e89f0419b71", + "bom-ref": "8b76aae0e624feb7", "name": "/usr/include/c++/14/stack", "type": "file" }, { - "bom-ref": "f6fa3e3479a697dc", + "bom-ref": "89cdead034092886", "name": "/usr/include/c++/14/stacktrace", "type": "file" }, { - "bom-ref": "e14d12e26920351a", + "bom-ref": "3bd19e66d86be164", "name": "/usr/include/c++/14/stdatomic.h", "type": "file" }, { - "bom-ref": "6e4d810e9b89da00", + "bom-ref": "6a368a90a7eb81ba", "name": "/usr/include/c++/14/stdexcept", "type": "file" }, { - "bom-ref": "606be17e81a4d3e7", + "bom-ref": "a8966e53fa0f2741", "name": "/usr/include/c++/14/stdfloat", "type": "file" }, { - "bom-ref": "a45b250fc7614ac4", + "bom-ref": "c155c7c1d0810aa6", "name": "/usr/include/c++/14/stdlib.h", "type": "file" }, { - "bom-ref": "143de518055b2e50", + "bom-ref": "f9465b122d5c863e", "name": "/usr/include/c++/14/stop_token", "type": "file" }, { - "bom-ref": "9315cdc7d70fdec6", + "bom-ref": "c1ac36080f18831c", "name": "/usr/include/c++/14/streambuf", "type": "file" }, { - "bom-ref": "7c4bb0253ed0bc42", + "bom-ref": "d3c357cd9780f77c", "name": "/usr/include/c++/14/string", "type": "file" }, { - "bom-ref": "e7e4575ea851ea59", + "bom-ref": "0902a843d0441003", "name": "/usr/include/c++/14/string_view", "type": "file" }, { - "bom-ref": "d9d9d01553f9715f", + "bom-ref": "2796b572c7232715", "name": "/usr/include/c++/14/syncstream", "type": "file" }, { - "bom-ref": "b2f869946b88204f", + "bom-ref": "e1fbe1cec14fafc5", "name": "/usr/include/c++/14/system_error", "type": "file" }, { - "bom-ref": "aae57e858a207e36", + "bom-ref": "1b65be01c86506ac", "name": "/usr/include/c++/14/text_encoding", "type": "file" }, { - "bom-ref": "20c506ceec74cc36", + "bom-ref": "4ec5a4cec05f0218", "name": "/usr/include/c++/14/tgmath.h", "type": "file" }, { - "bom-ref": "81c57cc8f9fdf24b", + "bom-ref": "05fb30b2024c3171", "name": "/usr/include/c++/14/thread", "type": "file" }, { - "bom-ref": "031a1bc774bdd65c", + "bom-ref": "e38674465102012e", "name": "/usr/include/c++/14/tr1/array", "type": "file" }, { - "bom-ref": "acc48bcc02d4711f", + "bom-ref": "05f3be524bbdc68d", "name": "/usr/include/c++/14/tr1/bessel_function.tcc", "type": "file" }, { - "bom-ref": "f088abc7fec8b707", + "bom-ref": "28fcadecedd454d1", "name": "/usr/include/c++/14/tr1/beta_function.tcc", "type": "file" }, { - "bom-ref": "fec56be77d5d225b", + "bom-ref": "844877a51e3f8eed", "name": "/usr/include/c++/14/tr1/ccomplex", "type": "file" }, { - "bom-ref": "0b41a5614ae80b8f", + "bom-ref": "b0fba30f4179f519", "name": "/usr/include/c++/14/tr1/cctype", "type": "file" }, { - "bom-ref": "7568f55a04761264", + "bom-ref": "00f16aec23c9e6b6", "name": "/usr/include/c++/14/tr1/cfenv", "type": "file" }, { - "bom-ref": "0efc438f0c27d1ec", + "bom-ref": "af4103608a6cab6e", "name": "/usr/include/c++/14/tr1/cfloat", "type": "file" }, { - "bom-ref": "536725e177349436", + "bom-ref": "5d3e97618f4b5288", "name": "/usr/include/c++/14/tr1/cinttypes", "type": "file" }, { - "bom-ref": "dfda8750f3463d98", + "bom-ref": "8a1d0232d291ef4e", "name": "/usr/include/c++/14/tr1/climits", "type": "file" }, { - "bom-ref": "9d824c601c1806c4", + "bom-ref": "45ea12a54fe431f6", "name": "/usr/include/c++/14/tr1/cmath", "type": "file" }, { - "bom-ref": "f3f18c2a3d07eff0", + "bom-ref": "c43e3dea465c9ffe", "name": "/usr/include/c++/14/tr1/complex", "type": "file" }, { - "bom-ref": "477af480b89b6119", + "bom-ref": "4a23de89aec383b7", "name": "/usr/include/c++/14/tr1/complex.h", "type": "file" }, { - "bom-ref": "f0612bd222ea412f", + "bom-ref": "940de6837922dcdd", "name": "/usr/include/c++/14/tr1/cstdarg", "type": "file" }, { - "bom-ref": "858e4ba260c074a7", + "bom-ref": "e3a45c588f32b641", "name": "/usr/include/c++/14/tr1/cstdbool", "type": "file" }, { - "bom-ref": "cddead62a69f22eb", + "bom-ref": "f457210cb5438b71", "name": "/usr/include/c++/14/tr1/cstdint", "type": "file" }, { - "bom-ref": "b9f9016e5f97a5dd", + "bom-ref": "4baed76c12155993", "name": "/usr/include/c++/14/tr1/cstdio", "type": "file" }, { - "bom-ref": "b58e370deab28e51", + "bom-ref": "7603590f86f72fc7", "name": "/usr/include/c++/14/tr1/cstdlib", "type": "file" }, { - "bom-ref": "1dcac063747b1e6b", + "bom-ref": "88b314dfd5bc5ae9", "name": "/usr/include/c++/14/tr1/ctgmath", "type": "file" }, { - "bom-ref": "54ce05e69f5d0ae2", + "bom-ref": "25323fcc019af8f8", "name": "/usr/include/c++/14/tr1/ctime", "type": "file" }, { - "bom-ref": "7995f264b396f6dd", + "bom-ref": "9788530badb20a4b", "name": "/usr/include/c++/14/tr1/ctype.h", "type": "file" }, { - "bom-ref": "e23ab67cf7b9c037", + "bom-ref": "32779b1e661c4f7d", "name": "/usr/include/c++/14/tr1/cwchar", "type": "file" }, { - "bom-ref": "daf9f8642bac6c42", + "bom-ref": "775ee1840ed0d624", "name": "/usr/include/c++/14/tr1/cwctype", "type": "file" }, { - "bom-ref": "7ae337367f74edc8", + "bom-ref": "4f771ffbf492871e", "name": "/usr/include/c++/14/tr1/ell_integral.tcc", "type": "file" }, { - "bom-ref": "fc88d5a6d890161d", + "bom-ref": "4c7aabc7901f4a53", "name": "/usr/include/c++/14/tr1/exp_integral.tcc", "type": "file" }, { - "bom-ref": "eeecbbce707b44e6", + "bom-ref": "5edc8b4b92e6643c", "name": "/usr/include/c++/14/tr1/fenv.h", "type": "file" }, { - "bom-ref": "7ef84e8a8a52b7a8", + "bom-ref": "345069a3014bd5b2", "name": "/usr/include/c++/14/tr1/float.h", "type": "file" }, { - "bom-ref": "5f7b7f6c4871d91b", + "bom-ref": "5f15cc12d652e3f9", "name": "/usr/include/c++/14/tr1/functional", "type": "file" }, { - "bom-ref": "b7ccbbdcca598180", + "bom-ref": "4b4efd2c3fc39d42", "name": "/usr/include/c++/14/tr1/functional_hash.h", "type": "file" }, { - "bom-ref": "422e8a5e922278c6", + "bom-ref": "bbbaff724ece772c", "name": "/usr/include/c++/14/tr1/gamma.tcc", "type": "file" }, { - "bom-ref": "89a4ca4ff8e30afd", + "bom-ref": "4c08d2cc347d0997", "name": "/usr/include/c++/14/tr1/hashtable.h", "type": "file" }, { - "bom-ref": "8004c8bd50d24baa", + "bom-ref": "3d7b701c77fc7e48", "name": "/usr/include/c++/14/tr1/hashtable_policy.h", "type": "file" }, { - "bom-ref": "48120a9a15c45449", + "bom-ref": "5e467209798ac20f", "name": "/usr/include/c++/14/tr1/hypergeometric.tcc", "type": "file" }, { - "bom-ref": "0becc9717f87f352", + "bom-ref": "eddf7d9379eee134", "name": "/usr/include/c++/14/tr1/inttypes.h", "type": "file" }, { - "bom-ref": "ede43ea7ba200201", + "bom-ref": "11413fa2dd6b4507", "name": "/usr/include/c++/14/tr1/legendre_function.tcc", "type": "file" }, { - "bom-ref": "2b7b881b445ea80f", + "bom-ref": "65154b063cdda509", "name": "/usr/include/c++/14/tr1/limits.h", "type": "file" }, { - "bom-ref": "19c84cb6c195693f", + "bom-ref": "c4e2950b2325ef2d", "name": "/usr/include/c++/14/tr1/math.h", "type": "file" }, { - "bom-ref": "8cb33d409aa2174c", + "bom-ref": "e54b1ae90056198a", "name": "/usr/include/c++/14/tr1/memory", "type": "file" }, { - "bom-ref": "42fac938e25339bf", + "bom-ref": "a135ef2a2d4a3aa9", "name": "/usr/include/c++/14/tr1/modified_bessel_func.tcc", "type": "file" }, { - "bom-ref": "a456da58e8f5ad93", + "bom-ref": "e715afd50934efe9", "name": "/usr/include/c++/14/tr1/poly_hermite.tcc", "type": "file" }, { - "bom-ref": "b275c940161e7e69", + "bom-ref": "e2af664eb6d778b7", "name": "/usr/include/c++/14/tr1/poly_laguerre.tcc", "type": "file" }, { - "bom-ref": "922de0659f25df3e", + "bom-ref": "16385443d553f538", "name": "/usr/include/c++/14/tr1/random", "type": "file" }, { - "bom-ref": "af1642d7bc0d27bc", + "bom-ref": "890ed459f6b874be", "name": "/usr/include/c++/14/tr1/random.h", "type": "file" }, { - "bom-ref": "bf9268410de5a049", + "bom-ref": "db2d741c6839b04f", "name": "/usr/include/c++/14/tr1/random.tcc", "type": "file" }, { - "bom-ref": "75f844658ace422f", + "bom-ref": "667f86cdd0d2c18d", "name": "/usr/include/c++/14/tr1/regex", "type": "file" }, { - "bom-ref": "f2cd9f8f70a4ab14", + "bom-ref": "691803c8e251b9ea", "name": "/usr/include/c++/14/tr1/riemann_zeta.tcc", "type": "file" }, { - "bom-ref": "c942d744dd5869e6", + "bom-ref": "082c4396f0a2f968", "name": "/usr/include/c++/14/tr1/shared_ptr.h", "type": "file" }, { - "bom-ref": "2e5a37f8236e185f", + "bom-ref": "3063bdfcf57cb871", "name": "/usr/include/c++/14/tr1/special_function_util.h", "type": "file" }, { - "bom-ref": "7e134deff193bba2", + "bom-ref": "106ffe280fe646d8", "name": "/usr/include/c++/14/tr1/stdarg.h", "type": "file" }, { - "bom-ref": "10c0a7dd966ea91e", + "bom-ref": "dec9ffa090367ebc", "name": "/usr/include/c++/14/tr1/stdbool.h", "type": "file" }, { - "bom-ref": "b3d3610adebc5cdf", + "bom-ref": "dc6006f45737c03d", "name": "/usr/include/c++/14/tr1/stdint.h", "type": "file" }, { - "bom-ref": "36d8c6cbc8e8fde2", + "bom-ref": "bba5ae4bb4d13488", "name": "/usr/include/c++/14/tr1/stdio.h", "type": "file" }, { - "bom-ref": "894ecf94902e5b9f", + "bom-ref": "d4a4bb6ef1e66299", "name": "/usr/include/c++/14/tr1/stdlib.h", "type": "file" }, { - "bom-ref": "805df178881d20cc", + "bom-ref": "8fd7e5511f70b8d2", "name": "/usr/include/c++/14/tr1/tgmath.h", "type": "file" }, { - "bom-ref": "c1b0ca99a797b16f", + "bom-ref": "b2f37d79411e102d", "name": "/usr/include/c++/14/tr1/tuple", "type": "file" }, { - "bom-ref": "0e55d2803497a820", + "bom-ref": "ca2a261dc6f1e3be", "name": "/usr/include/c++/14/tr1/type_traits", "type": "file" }, { - "bom-ref": "a79cc3c657d5ece7", + "bom-ref": "25a6b03e00b44f85", "name": "/usr/include/c++/14/tr1/unordered_map", "type": "file" }, { - "bom-ref": "b8464100fd77f6aa", + "bom-ref": "a8963858af4acd30", "name": "/usr/include/c++/14/tr1/unordered_map.h", "type": "file" }, { - "bom-ref": "82a67febb0a4cdcb", + "bom-ref": "be1d02fab2330869", "name": "/usr/include/c++/14/tr1/unordered_set", "type": "file" }, { - "bom-ref": "cd20055062199b7a", + "bom-ref": "4dc031194c4081a0", "name": "/usr/include/c++/14/tr1/unordered_set.h", "type": "file" }, { - "bom-ref": "ee7e664af150bb74", + "bom-ref": "6bcc27533b72f97a", "name": "/usr/include/c++/14/tr1/utility", "type": "file" }, { - "bom-ref": "f0829e5565e6419b", + "bom-ref": "ebddfe088c397cc1", "name": "/usr/include/c++/14/tr1/wchar.h", "type": "file" }, { - "bom-ref": "bc1724e99e9c4073", + "bom-ref": "a3e1fe4c2fb472f5", "name": "/usr/include/c++/14/tr1/wctype.h", "type": "file" }, { - "bom-ref": "a20940c25a0dfc10", + "bom-ref": "d44e6c34011b07f6", "name": "/usr/include/c++/14/tr2/bool_set", "type": "file" }, { - "bom-ref": "326036810647854b", + "bom-ref": "a5498b86b2475671", "name": "/usr/include/c++/14/tr2/bool_set.tcc", "type": "file" }, { - "bom-ref": "0b1f2fc0e91f45d5", + "bom-ref": "4a318b7e2f13c53f", "name": "/usr/include/c++/14/tr2/dynamic_bitset", "type": "file" }, { - "bom-ref": "0b32e30610bf9c9d", + "bom-ref": "dfbd3bb486b8ad7f", "name": "/usr/include/c++/14/tr2/dynamic_bitset.tcc", "type": "file" }, { - "bom-ref": "66a384e7f7ab98c8", + "bom-ref": "edab2431c7079c66", "name": "/usr/include/c++/14/tr2/ratio", "type": "file" }, { - "bom-ref": "77d96ef721fe38b7", + "bom-ref": "e892b77c1aaf9c61", "name": "/usr/include/c++/14/tr2/type_traits", "type": "file" }, { - "bom-ref": "f0b09f0c0332ed33", + "bom-ref": "d1a369287ab49f75", "name": "/usr/include/c++/14/tuple", "type": "file" }, { - "bom-ref": "e335beedad85ce1c", + "bom-ref": "ed81f8e6361fc312", "name": "/usr/include/c++/14/type_traits", "type": "file" }, { - "bom-ref": "9182c4f37fab782e", + "bom-ref": "4fd5f46bfe37ef7c", "name": "/usr/include/c++/14/typeindex", "type": "file" }, { - "bom-ref": "89c23a7f0442a61d", + "bom-ref": "c7c06198d0c84db3", "name": "/usr/include/c++/14/typeinfo", "type": "file" }, { - "bom-ref": "f9404bb739190ee2", + "bom-ref": "66015ac8cd57f2f8", "name": "/usr/include/c++/14/unordered_map", "type": "file" }, { - "bom-ref": "2fe5790e72247708", + "bom-ref": "045d9291cd9818a6", "name": "/usr/include/c++/14/unordered_set", "type": "file" }, { - "bom-ref": "3738d4cfc89f9ad3", + "bom-ref": "946d1480bc83cfc9", "name": "/usr/include/c++/14/utility", "type": "file" }, { - "bom-ref": "c517d25f1ec97f80", + "bom-ref": "1637093afe0ee346", "name": "/usr/include/c++/14/valarray", "type": "file" }, { - "bom-ref": "983f11d6d5575578", + "bom-ref": "b8af651d8ac98aa6", "name": "/usr/include/c++/14/variant", "type": "file" }, { - "bom-ref": "bdf14d3721964bae", + "bom-ref": "047385cd4d700b50", "name": "/usr/include/c++/14/vector", "type": "file" }, { - "bom-ref": "cefa136bfcb06c97", + "bom-ref": "044de508f3ef6d5d", "name": "/usr/include/c++/14/version", "type": "file" }, { - "bom-ref": "590e0caa5ec0fe21", + "bom-ref": "2c79a17f91069d77", "name": "/usr/include/complex.h", "type": "file" }, { - "bom-ref": "abd7401c78f676ba", + "bom-ref": "c60b0739998fd9bc", "name": "/usr/include/cpio.h", "type": "file" }, { - "bom-ref": "64d63d686589bfc9", + "bom-ref": "120445e6a1a83d92", "name": "/usr/include/crypt.h", "type": "file" }, { - "bom-ref": "e85990cba2c6399f", + "bom-ref": "ceb6abb655c86a61", "name": "/usr/include/ctype.h", "type": "file" }, { - "bom-ref": "495f504c3830b39b", + "bom-ref": "4ed67c97e1554b1d", "name": "/usr/include/curses.h", "type": "file" }, { - "bom-ref": "546259d21b0a0e97", + "bom-ref": "5a943f3d94c92779", "name": "/usr/include/cursesapp.h", "type": "file" }, { - "bom-ref": "b8448ae0364d38d6", + "bom-ref": "e3114a2cb44f89c8", "name": "/usr/include/cursesf.h", "type": "file" }, { - "bom-ref": "e03ee3737d4ffb7b", + "bom-ref": "77da311f3f5f1639", "name": "/usr/include/cursesm.h", "type": "file" }, { - "bom-ref": "27e1ce56e6366e9c", + "bom-ref": "302262962894ccea", "name": "/usr/include/cursesp.h", "type": "file" }, { - "bom-ref": "0ca12d483f6c7f90", + "bom-ref": "fd6c163419be3aea", "name": "/usr/include/cursesw.h", "type": "file" }, { - "bom-ref": "e7a6628c6122d7ad", + "bom-ref": "0739fa42232df5ff", "name": "/usr/include/cursslk.h", "type": "file" }, { - "bom-ref": "73d97f02fced7cba", - "name": "/usr/include/dbus-1.0/dbus/dbus-address.h", - "type": "file" - }, - { - "bom-ref": "d9b30db1990b74e3", - "name": "/usr/include/dbus-1.0/dbus/dbus-bus.h", - "type": "file" - }, - { - "bom-ref": "0741234f21448fee", - "name": "/usr/include/dbus-1.0/dbus/dbus-connection.h", - "type": "file" - }, - { - "bom-ref": "8cbebeaa0383b135", - "name": "/usr/include/dbus-1.0/dbus/dbus-errors.h", - "type": "file" - }, - { - "bom-ref": "b90a043b1b69017c", - "name": "/usr/include/dbus-1.0/dbus/dbus-macros.h", - "type": "file" - }, - { - "bom-ref": "182db65ccfc5d389", - "name": "/usr/include/dbus-1.0/dbus/dbus-memory.h", - "type": "file" - }, - { - "bom-ref": "968da108f9787ce1", - "name": "/usr/include/dbus-1.0/dbus/dbus-message.h", - "type": "file" - }, - { - "bom-ref": "827fade6a37664b8", - "name": "/usr/include/dbus-1.0/dbus/dbus-misc.h", - "type": "file" - }, - { - "bom-ref": "aedc1a0c7e2447d6", - "name": "/usr/include/dbus-1.0/dbus/dbus-pending-call.h", - "type": "file" - }, - { - "bom-ref": "e15b2dabc00dce08", - "name": "/usr/include/dbus-1.0/dbus/dbus-protocol.h", - "type": "file" - }, - { - "bom-ref": "59483aca68b8ca1f", - "name": "/usr/include/dbus-1.0/dbus/dbus-server.h", - "type": "file" - }, - { - "bom-ref": "702f1d4b7212e00b", - "name": "/usr/include/dbus-1.0/dbus/dbus-shared.h", - "type": "file" - }, - { - "bom-ref": "a66dcde16e7d7654", - "name": "/usr/include/dbus-1.0/dbus/dbus-signature.h", - "type": "file" - }, - { - "bom-ref": "dcf3f594c82cfc55", - "name": "/usr/include/dbus-1.0/dbus/dbus-syntax.h", - "type": "file" - }, - { - "bom-ref": "69a4bfe3fae0620f", - "name": "/usr/include/dbus-1.0/dbus/dbus-threads.h", - "type": "file" - }, - { - "bom-ref": "603c2c40d4f253c7", - "name": "/usr/include/dbus-1.0/dbus/dbus-types.h", - "type": "file" - }, - { - "bom-ref": "3494fd5ed5444758", - "name": "/usr/include/dbus-1.0/dbus/dbus.h", - "type": "file" - }, - { - "bom-ref": "62fb1101f7beddfc", + "bom-ref": "e4e164c45112c612", "name": "/usr/include/dirent.h", "type": "file" }, { - "bom-ref": "c50c61eb2480ce01", + "bom-ref": "a5b1fc09e094e483", "name": "/usr/include/dlfcn.h", "type": "file" }, { - "bom-ref": "a7071f1573be4033", + "bom-ref": "9bea85984c36d6fc", "name": "/usr/include/drm/amdgpu_drm.h", "type": "file" }, { - "bom-ref": "31cfa8e0ad625ba6", + "bom-ref": "94875209b1dacb45", "name": "/usr/include/drm/armada_drm.h", "type": "file" }, { - "bom-ref": "77ddd4153c8fdf58", + "bom-ref": "5923b7bf67e0bdb3", "name": "/usr/include/drm/drm.h", "type": "file" }, { - "bom-ref": "ef87148b8130db8c", + "bom-ref": "cd47a3a71569ac73", "name": "/usr/include/drm/drm_fourcc.h", "type": "file" }, { - "bom-ref": "6e2c1565771697de", + "bom-ref": "455d036cbacd0da9", "name": "/usr/include/drm/drm_mode.h", "type": "file" }, { - "bom-ref": "41ab48a1379af2db", + "bom-ref": "18c930d464486930", "name": "/usr/include/drm/drm_sarea.h", "type": "file" }, { - "bom-ref": "d69a6dd52ba6f4f1", + "bom-ref": "c8da3069872642ca", "name": "/usr/include/drm/etnaviv_drm.h", "type": "file" }, { - "bom-ref": "6f35f95816725699", + "bom-ref": "8577a21f04219d1e", "name": "/usr/include/drm/exynos_drm.h", "type": "file" }, { - "bom-ref": "bff20d71104e179f", + "bom-ref": "c340244df87c4744", "name": "/usr/include/drm/habanalabs_accel.h", "type": "file" }, { - "bom-ref": "bf6bda07bc14a4aa", + "bom-ref": "f580b1993f83b6dd", "name": "/usr/include/drm/i915_drm.h", "type": "file" }, { - "bom-ref": "e4e34e1fd505cef5", + "bom-ref": "737352a7b04149e6", "name": "/usr/include/drm/ivpu_accel.h", "type": "file" }, { - "bom-ref": "8f39d377fd1aad17", + "bom-ref": "ec2be1b451db345c", "name": "/usr/include/drm/lima_drm.h", "type": "file" }, { - "bom-ref": "b1ff00be2e1c9d5b", + "bom-ref": "a68f18a00c91f1fc", "name": "/usr/include/drm/msm_drm.h", "type": "file" }, { - "bom-ref": "3ed213b51fcfa016", + "bom-ref": "4c8114247186c6f9", "name": "/usr/include/drm/nouveau_drm.h", "type": "file" }, { - "bom-ref": "1b496edbde3e4a55", + "bom-ref": "097e35c5103db3e6", "name": "/usr/include/drm/omap_drm.h", "type": "file" }, { - "bom-ref": "42519a59f45fdabc", + "bom-ref": "f82ecde3ec72430b", "name": "/usr/include/drm/panfrost_drm.h", "type": "file" }, { - "bom-ref": "a7822dfefad6e6d7", + "bom-ref": "2ed5e042aa297d48", "name": "/usr/include/drm/pvr_drm.h", "type": "file" }, { - "bom-ref": "12c53593fe781eb8", + "bom-ref": "036ee520fb7020a7", "name": "/usr/include/drm/qaic_accel.h", "type": "file" }, { - "bom-ref": "49428ca7cc6dd23f", + "bom-ref": "55cbf945715f517c", "name": "/usr/include/drm/qxl_drm.h", "type": "file" }, { - "bom-ref": "a11b57429336d72e", + "bom-ref": "548168a2609619f5", "name": "/usr/include/drm/radeon_drm.h", "type": "file" }, { - "bom-ref": "3c8c257985585661", + "bom-ref": "499e3b6fc4ac0016", "name": "/usr/include/drm/tegra_drm.h", "type": "file" }, { - "bom-ref": "a069f18b917672c6", + "bom-ref": "e8f259314a7266f5", "name": "/usr/include/drm/v3d_drm.h", "type": "file" }, { - "bom-ref": "32a9dcfbaeffa519", + "bom-ref": "47a9d386f816837a", "name": "/usr/include/drm/vc4_drm.h", "type": "file" }, { - "bom-ref": "62ca81d9cb82964c", + "bom-ref": "5dcbe3045be75873", "name": "/usr/include/drm/vgem_drm.h", "type": "file" }, { - "bom-ref": "1c48fdc91f75b02d", + "bom-ref": "4cac20fbcdf958fa", "name": "/usr/include/drm/virtgpu_drm.h", "type": "file" }, { - "bom-ref": "c438c1ea681f80db", + "bom-ref": "975aeed76d46f204", "name": "/usr/include/drm/vmwgfx_drm.h", "type": "file" }, { - "bom-ref": "bed78a1bcbc54d10", + "bom-ref": "a66cf0e20c9f6317", "name": "/usr/include/drm/xe_drm.h", "type": "file" }, { - "bom-ref": "8dd9cede44ba707b", + "bom-ref": "2ed5ab413b8bbc29", "name": "/usr/include/editline/readline.h", "type": "file" }, { - "bom-ref": "37b12001434c708d", + "bom-ref": "ef84600554b5ba83", "name": "/usr/include/elf.h", "type": "file" }, { - "bom-ref": "c7ad0608bb0b1bae", + "bom-ref": "f9ca81cb2211c8f0", "name": "/usr/include/endian.h", "type": "file" }, { - "bom-ref": "8ee19ec4fb84b8a0", + "bom-ref": "bb3acc56f4186186", "name": "/usr/include/envz.h", "type": "file" }, { - "bom-ref": "b6db2e421bf869b2", + "bom-ref": "b87781288b23dfd0", "name": "/usr/include/err.h", "type": "file" }, { - "bom-ref": "e12aa05528374e28", + "bom-ref": "4cf94d7f76e51eba", "name": "/usr/include/errno.h", "type": "file" }, { - "bom-ref": "d7dec69fc6cd8d72", + "bom-ref": "968205461437029c", "name": "/usr/include/error.h", "type": "file" }, { - "bom-ref": "9e508569841b3723", + "bom-ref": "7c6df6e0b61a8571", "name": "/usr/include/et/com_err.h", "type": "file" }, { - "bom-ref": "89266d57344e3dae", + "bom-ref": "76811a9ebdb13338", "name": "/usr/include/eti.h", "type": "file" }, { - "bom-ref": "d015ebcece1678b0", + "bom-ref": "96f594933dae72a2", "name": "/usr/include/etip.h", "type": "file" }, { - "bom-ref": "54e52fdc3c100719", + "bom-ref": "71a52b8d126956b7", "name": "/usr/include/execinfo.h", "type": "file" }, { - "bom-ref": "55d223c4680d35d1", + "bom-ref": "3a1bb8c6d1a371eb", "name": "/usr/include/expat.h", "type": "file" }, { - "bom-ref": "0ae81b00a8e61de7", + "bom-ref": "4edb9e08e91b4509", "name": "/usr/include/expat_external.h", "type": "file" }, { - "bom-ref": "4f97e0e48f78c152", + "bom-ref": "d315baeee7321e44", "name": "/usr/include/fcntl.h", "type": "file" }, { - "bom-ref": "30184e21668de46b", + "bom-ref": "7fbfa2fc8357f6d1", "name": "/usr/include/features-time64.h", "type": "file" }, { - "bom-ref": "94842f50edff3167", + "bom-ref": "e5c1809c5e7694f5", "name": "/usr/include/features.h", "type": "file" }, { - "bom-ref": "9ebeed37adebc107", + "bom-ref": "c06662e7dff8a2d9", "name": "/usr/include/fenv.h", "type": "file" }, { - "bom-ref": "c806f5bac73951f6", + "bom-ref": "0e01cded9d0c7eac", "name": "/usr/include/finclude/x86_64-linux-gnu/math-vector-fortran.h", "type": "file" }, { - "bom-ref": "e44dc9a93ebc3954", + "bom-ref": "dc99b235cf63c516", "name": "/usr/include/fmtmsg.h", "type": "file" }, { - "bom-ref": "225e16368b4b73a6", + "bom-ref": "24355a509172dda0", "name": "/usr/include/fnmatch.h", "type": "file" }, { - "bom-ref": "3bd6678ce7d54efc", + "bom-ref": "75864e2e0eedaf9a", "name": "/usr/include/form.h", "type": "file" }, { - "bom-ref": "e9df33590fc0b398", + "bom-ref": "30ab6e20ac695052", "name": "/usr/include/fstab.h", "type": "file" }, { - "bom-ref": "25ac50ed19efb080", + "bom-ref": "dd48136833aafd96", "name": "/usr/include/fts.h", "type": "file" }, { - "bom-ref": "43c25d5edb29f9c5", + "bom-ref": "03aaccf3fa2125cf", "name": "/usr/include/ftw.h", "type": "file" }, { - "bom-ref": "3ae502b85952b1af", + "bom-ref": "4983790b606ac241", "name": "/usr/include/gconv.h", "type": "file" }, { - "bom-ref": "b4117607d13b77a5", + "bom-ref": "71f60b5085b1353f", "name": "/usr/include/gdb/jit-reader.h", "type": "file" }, { - "bom-ref": "7db3cd76b27524a5", + "bom-ref": "3984a39ac770deba", "name": "/usr/include/gdrapi.h", "type": "file" }, { - "bom-ref": "2f2936a4b02e3c22", + "bom-ref": "1f6a6fbfecee10b9", "name": "/usr/include/gdrconfig.h", "type": "file" }, { - "bom-ref": "3591c8ce39220b03", + "bom-ref": "37c33eed25d37051", "name": "/usr/include/getopt.h", "type": "file" }, { - "bom-ref": "3eca3ffa02751d3b", + "bom-ref": "3c845c69b46a3689", "name": "/usr/include/gflags/gflags.h", "type": "file" }, { - "bom-ref": "806cc3c6ed0d4303", + "bom-ref": "036a0179dd5576d5", "name": "/usr/include/gflags/gflags_completions.h", "type": "file" }, { - "bom-ref": "cfa8b364e2c3e1e5", + "bom-ref": "93f1599b7ddf5323", "name": "/usr/include/gflags/gflags_declare.h", "type": "file" }, { - "bom-ref": "028ef7b231d780cf", + "bom-ref": "83a28309e169912d", "name": "/usr/include/gflags/gflags_gflags.h", "type": "file" }, { - "bom-ref": "4d1b01cb9f4f08d0", + "bom-ref": "69b03c4b410e550a", "name": "/usr/include/glob.h", "type": "file" }, { - "bom-ref": "815f6fab79083b01", + "bom-ref": "6f2286f408dc959f", "name": "/usr/include/glog/export.h", "type": "file" }, { - "bom-ref": "ee233d62361b4f4d", + "bom-ref": "cc5b6cdebcf8965f", "name": "/usr/include/glog/log_severity.h", "type": "file" }, { - "bom-ref": "78e310ae2a3a84f7", + "bom-ref": "8a39442b37c4ef99", "name": "/usr/include/glog/logging.h", "type": "file" }, { - "bom-ref": "b65ebef4942d179f", + "bom-ref": "42c18b80dcc5191d", "name": "/usr/include/glog/platform.h", "type": "file" }, { - "bom-ref": "085deff6d6fcb6df", + "bom-ref": "5f4c0ec7587d4429", "name": "/usr/include/glog/raw_logging.h", "type": "file" }, { - "bom-ref": "f83222360b2d973e", + "bom-ref": "6c883be36c22cd04", "name": "/usr/include/glog/stl_logging.h", "type": "file" }, { - "bom-ref": "92aa8f4ad173f9bb", + "bom-ref": "0889a513d2cd1411", "name": "/usr/include/glog/vlog_is_on.h", "type": "file" }, { - "bom-ref": "436524fe6e853a4f", + "bom-ref": "06a32985d5af8d61", "name": "/usr/include/gnu-versions.h", "type": "file" }, { - "bom-ref": "92f8c423297ecd65", + "bom-ref": "96b2a275d2bbeab8", "name": "/usr/include/gnumake.h", "type": "file" }, { - "bom-ref": "be4fa719ae76548c", + "bom-ref": "3c9e55789779790a", "name": "/usr/include/google/protobuf/any.h", "type": "file" }, { - "bom-ref": "393a76b7879f5435", + "bom-ref": "786031780cd66f17", "name": "/usr/include/google/protobuf/any.pb.h", "type": "file" }, { - "bom-ref": "726a6f753813cec3", + "bom-ref": "200739df520219dd", "name": "/usr/include/google/protobuf/any.proto", "type": "file" }, { - "bom-ref": "a587df373d330a84", + "bom-ref": "4b0c9c7cfb165f82", "name": "/usr/include/google/protobuf/api.pb.h", "type": "file" }, { - "bom-ref": "cea4612ae3d7ed98", + "bom-ref": "a7405a063cd23372", "name": "/usr/include/google/protobuf/api.proto", "type": "file" }, { - "bom-ref": "ea559fd13a9d707f", + "bom-ref": "1e312be03ec854b5", "name": "/usr/include/google/protobuf/arena.h", "type": "file" }, { - "bom-ref": "d72b623bc9ecb75a", + "bom-ref": "8c1925af21becdf4", "name": "/usr/include/google/protobuf/arena_impl.h", "type": "file" }, { - "bom-ref": "1b7dfc2c11069d4f", + "bom-ref": "b46518928e0614c5", "name": "/usr/include/google/protobuf/arenastring.h", "type": "file" }, { - "bom-ref": "69b239789dd408b9", + "bom-ref": "9c57e42873d5dc53", "name": "/usr/include/google/protobuf/arenaz_sampler.h", "type": "file" }, { - "bom-ref": "e72c4e546a631243", + "bom-ref": "8bea069648b48eb1", "name": "/usr/include/google/protobuf/descriptor.h", "type": "file" }, { - "bom-ref": "375a0f0e45a3472b", + "bom-ref": "d4647a7aa11ececd", "name": "/usr/include/google/protobuf/descriptor.pb.h", "type": "file" }, { - "bom-ref": "16d67c3a1d0057d2", + "bom-ref": "755619c1b50f93ec", "name": "/usr/include/google/protobuf/descriptor.proto", "type": "file" }, { - "bom-ref": "f438bfa047f07b37", + "bom-ref": "0428708af89ffb11", "name": "/usr/include/google/protobuf/descriptor_database.h", "type": "file" }, { - "bom-ref": "636be11399ec0b05", + "bom-ref": "28f7df08c75e88ab", "name": "/usr/include/google/protobuf/duration.pb.h", "type": "file" }, { - "bom-ref": "41bb66334c9de185", + "bom-ref": "0b1b7747622ef633", "name": "/usr/include/google/protobuf/duration.proto", "type": "file" }, { - "bom-ref": "d9e8ff67c1ca6205", + "bom-ref": "6f85a24c65b637c3", "name": "/usr/include/google/protobuf/dynamic_message.h", "type": "file" }, { - "bom-ref": "1e4c6fda5dea7dcd", + "bom-ref": "b3f2f22a4042db63", "name": "/usr/include/google/protobuf/empty.pb.h", "type": "file" }, { - "bom-ref": "8c17940f64c068d5", + "bom-ref": "941532fad469c473", "name": "/usr/include/google/protobuf/empty.proto", "type": "file" }, { - "bom-ref": "0f7e846e887d8de2", + "bom-ref": "a8719d129951cce8", "name": "/usr/include/google/protobuf/endian.h", "type": "file" }, { - "bom-ref": "1fa9de5932970c89", + "bom-ref": "c308817c3ade01d3", "name": "/usr/include/google/protobuf/explicitly_constructed.h", "type": "file" }, { - "bom-ref": "e297a3cccf83f4af", + "bom-ref": "7b55b351de605271", "name": "/usr/include/google/protobuf/extension_set.h", "type": "file" }, { - "bom-ref": "021f016edfe5622f", + "bom-ref": "e3f041c22fa74e19", "name": "/usr/include/google/protobuf/extension_set_inl.h", "type": "file" }, { - "bom-ref": "31fafba2c2c22274", + "bom-ref": "ef428885ed1b2216", "name": "/usr/include/google/protobuf/field_access_listener.h", "type": "file" }, { - "bom-ref": "6761aad9b42c40a5", + "bom-ref": "78747c8e4e8fa37f", "name": "/usr/include/google/protobuf/field_mask.pb.h", "type": "file" }, { - "bom-ref": "ef4ad7ec9c26be26", + "bom-ref": "c48a2ef0432f98a0", "name": "/usr/include/google/protobuf/field_mask.proto", "type": "file" }, { - "bom-ref": "b6609cbc50792798", + "bom-ref": "5596f80c6bb6aed6", "name": "/usr/include/google/protobuf/generated_enum_reflection.h", "type": "file" }, { - "bom-ref": "fbc42b09d8385664", + "bom-ref": "2c37cb321213bb62", "name": "/usr/include/google/protobuf/generated_enum_util.h", "type": "file" }, { - "bom-ref": "b2ad2d433fc3019e", + "bom-ref": "b1e909af2fb55a94", "name": "/usr/include/google/protobuf/generated_message_bases.h", "type": "file" }, { - "bom-ref": "b2e4a6e6bdf90b91", + "bom-ref": "cbda7966c17db37f", "name": "/usr/include/google/protobuf/generated_message_reflection.h", "type": "file" }, { - "bom-ref": "0ea5234f757edaf0", + "bom-ref": "729932c9d54868ee", "name": "/usr/include/google/protobuf/generated_message_tctable_decl.h", "type": "file" }, { - "bom-ref": "386b035f1ca00f61", + "bom-ref": "c2e48521fa3850e3", "name": "/usr/include/google/protobuf/generated_message_tctable_impl.h", "type": "file" }, { - "bom-ref": "6de0f07c53b05868", + "bom-ref": "6921d25aa3bb7706", "name": "/usr/include/google/protobuf/generated_message_util.h", "type": "file" }, { - "bom-ref": "19ee2abe32716933", + "bom-ref": "4b47c497166317f5", "name": "/usr/include/google/protobuf/has_bits.h", "type": "file" }, { - "bom-ref": "dbfd2a24295436dd", + "bom-ref": "15427f4fe1dd0daf", "name": "/usr/include/google/protobuf/implicit_weak_message.h", "type": "file" }, { - "bom-ref": "6435e66e1c9bf543", + "bom-ref": "2cb73f510f1ac199", "name": "/usr/include/google/protobuf/inlined_string_field.h", "type": "file" }, { - "bom-ref": "9f5fcd7b796669f8", + "bom-ref": "852a1245107ca1e6", "name": "/usr/include/google/protobuf/io/coded_stream.h", "type": "file" }, { - "bom-ref": "5bb23fb105f41c0b", + "bom-ref": "a36c087d0c51e5d1", "name": "/usr/include/google/protobuf/io/gzip_stream.h", "type": "file" }, { - "bom-ref": "113f41fbc88081f9", + "bom-ref": "6d1c9f954e6925f3", "name": "/usr/include/google/protobuf/io/io_win32.h", "type": "file" }, { - "bom-ref": "d0349d9f775ff4b5", + "bom-ref": "1b15623bb2f3e2a3", "name": "/usr/include/google/protobuf/io/printer.h", "type": "file" }, { - "bom-ref": "31c8fcc12228375d", + "bom-ref": "acd3a1e7155a418b", "name": "/usr/include/google/protobuf/io/strtod.h", "type": "file" }, { - "bom-ref": "88c3ecb663f3672a", + "bom-ref": "aaa7d15822a04f10", "name": "/usr/include/google/protobuf/io/tokenizer.h", "type": "file" }, { - "bom-ref": "53f23f679a420f51", + "bom-ref": "97d083dd7641aa87", "name": "/usr/include/google/protobuf/io/zero_copy_stream.h", "type": "file" }, { - "bom-ref": "cdbb72e0f3218aa3", + "bom-ref": "4f5d4cfada4bf34d", "name": "/usr/include/google/protobuf/io/zero_copy_stream_impl.h", "type": "file" }, { - "bom-ref": "5a69e3e9df2a4ebd", + "bom-ref": "5871006c4495a58b", "name": "/usr/include/google/protobuf/io/zero_copy_stream_impl_lite.h", "type": "file" }, { - "bom-ref": "ddfccd5c3a799748", + "bom-ref": "d9e58050ff45367e", "name": "/usr/include/google/protobuf/map.h", "type": "file" }, { - "bom-ref": "62dde926d63c9e50", + "bom-ref": "fde8ed8cff84325a", "name": "/usr/include/google/protobuf/map_entry.h", "type": "file" }, { - "bom-ref": "5f83cea15402251c", + "bom-ref": "06cbfb9d7e9bdaea", "name": "/usr/include/google/protobuf/map_entry_lite.h", "type": "file" }, { - "bom-ref": "1e97c3ee43e27e8a", + "bom-ref": "abccf44434dc14c4", "name": "/usr/include/google/protobuf/map_field.h", "type": "file" }, { - "bom-ref": "01b9528ec1c6ec8e", + "bom-ref": "cba0852ba184e7e8", "name": "/usr/include/google/protobuf/map_field_inl.h", "type": "file" }, { - "bom-ref": "a1f9481fbc9ae637", + "bom-ref": "4bf9790d34d2b96d", "name": "/usr/include/google/protobuf/map_field_lite.h", "type": "file" }, { - "bom-ref": "0a1e87421be0644c", + "bom-ref": "0a065fb44981cfa2", "name": "/usr/include/google/protobuf/map_type_handler.h", "type": "file" }, { - "bom-ref": "2f546c617622e922", + "bom-ref": "13b5f7b32d156918", "name": "/usr/include/google/protobuf/message.h", "type": "file" }, { - "bom-ref": "c7550b4d36b2e03d", + "bom-ref": "265db82b1156ab73", "name": "/usr/include/google/protobuf/message_lite.h", "type": "file" }, { - "bom-ref": "e5913d1cb9716a70", + "bom-ref": "1c018ece9bdfdcce", "name": "/usr/include/google/protobuf/metadata.h", "type": "file" }, { - "bom-ref": "5853db3a91547292", + "bom-ref": "6dd3c5fb6fac7190", "name": "/usr/include/google/protobuf/metadata_lite.h", "type": "file" }, { - "bom-ref": "ff11b4ebc376180a", + "bom-ref": "f4f001f6b2cc246c", "name": "/usr/include/google/protobuf/parse_context.h", "type": "file" }, { - "bom-ref": "9024f27a5d07933f", + "bom-ref": "ac8cce4bffb5e46d", "name": "/usr/include/google/protobuf/port.h", "type": "file" }, { - "bom-ref": "d0ab186edfdfbbbe", + "bom-ref": "6883be74045f59a0", "name": "/usr/include/google/protobuf/port_def.inc", "type": "file" }, { - "bom-ref": "7c78db2bc29966b6", + "bom-ref": "3352f38985ed4de8", "name": "/usr/include/google/protobuf/port_undef.inc", "type": "file" }, { - "bom-ref": "b68b4982fa091948", + "bom-ref": "d91a7913338eed92", "name": "/usr/include/google/protobuf/reflection.h", "type": "file" }, { - "bom-ref": "dcf36fdd2d971c79", + "bom-ref": "b466e4148c25b29f", "name": "/usr/include/google/protobuf/reflection_internal.h", "type": "file" }, { - "bom-ref": "19498b1b52f0aaef", + "bom-ref": "2cec2b5aa81b8bc5", "name": "/usr/include/google/protobuf/reflection_ops.h", "type": "file" }, { - "bom-ref": "c71c7df852e398e2", + "bom-ref": "9c3ebb8627e67c48", "name": "/usr/include/google/protobuf/repeated_field.h", "type": "file" }, { - "bom-ref": "d8de89048f731abd", + "bom-ref": "e9e96624200e42c3", "name": "/usr/include/google/protobuf/repeated_ptr_field.h", "type": "file" }, { - "bom-ref": "f8d7cdde692cd9df", + "bom-ref": "bc62d19be50c8655", "name": "/usr/include/google/protobuf/service.h", "type": "file" }, { - "bom-ref": "49aa86f4109b5f8f", + "bom-ref": "b754a2307f839065", "name": "/usr/include/google/protobuf/source_context.pb.h", "type": "file" }, { - "bom-ref": "bfa6bf70a45b42d4", + "bom-ref": "5ab30f3e34fe3f02", "name": "/usr/include/google/protobuf/source_context.proto", "type": "file" }, { - "bom-ref": "ec6987284a5895e9", + "bom-ref": "d977df86b810b917", "name": "/usr/include/google/protobuf/struct.pb.h", "type": "file" }, { - "bom-ref": "fd04e1ec2453ffb2", + "bom-ref": "0852421d26736080", "name": "/usr/include/google/protobuf/struct.proto", "type": "file" }, { - "bom-ref": "f9692244319dbfcf", + "bom-ref": "ccd664f4ea8b5f99", "name": "/usr/include/google/protobuf/stubs/bytestream.h", "type": "file" }, { - "bom-ref": "3e41e4c956ff7ecf", + "bom-ref": "4c5f7f353721bd89", "name": "/usr/include/google/protobuf/stubs/callback.h", "type": "file" }, { - "bom-ref": "f74e5f5a832c6b67", + "bom-ref": "30bb15b502b99a29", "name": "/usr/include/google/protobuf/stubs/casts.h", "type": "file" }, { - "bom-ref": "20c27c3be6ce4ba1", + "bom-ref": "776de2b5a658f84f", "name": "/usr/include/google/protobuf/stubs/common.h", "type": "file" }, { - "bom-ref": "9e01237962baf224", + "bom-ref": "23c8694845892c46", "name": "/usr/include/google/protobuf/stubs/hash.h", "type": "file" }, { - "bom-ref": "28c86750ad4e62b0", + "bom-ref": "4d81d6419ab7e5fe", "name": "/usr/include/google/protobuf/stubs/logging.h", "type": "file" }, { - "bom-ref": "9076e8c80534c3c1", + "bom-ref": "54324c874116f2e7", "name": "/usr/include/google/protobuf/stubs/macros.h", "type": "file" }, { - "bom-ref": "a1c64ce6f29fa4ba", + "bom-ref": "3a64b8db7b1c5324", "name": "/usr/include/google/protobuf/stubs/map_util.h", "type": "file" }, { - "bom-ref": "067bcb706bb870e4", + "bom-ref": "035944244e1f0a52", "name": "/usr/include/google/protobuf/stubs/mutex.h", "type": "file" }, { - "bom-ref": "63196905f80cb628", + "bom-ref": "8fccec26e8f11842", "name": "/usr/include/google/protobuf/stubs/once.h", "type": "file" }, { - "bom-ref": "2dc37d278162e99e", + "bom-ref": "1dec5bf471053d50", "name": "/usr/include/google/protobuf/stubs/platform_macros.h", "type": "file" }, { - "bom-ref": "8a5e58cb33d0385a", + "bom-ref": "25d4c7a202b7944c", "name": "/usr/include/google/protobuf/stubs/port.h", "type": "file" }, { - "bom-ref": "d0a26d66391eb874", + "bom-ref": "f98405c075db9d12", "name": "/usr/include/google/protobuf/stubs/status.h", "type": "file" }, { - "bom-ref": "1a30d7b7b13417ee", + "bom-ref": "0623d5d61e734e7c", "name": "/usr/include/google/protobuf/stubs/stl_util.h", "type": "file" }, { - "bom-ref": "410d0be43c1ec23f", + "bom-ref": "11b5e119d5bd596d", "name": "/usr/include/google/protobuf/stubs/stringpiece.h", "type": "file" }, { - "bom-ref": "8782c9097acc318a", + "bom-ref": "88e4c12beee4a6fc", "name": "/usr/include/google/protobuf/stubs/strutil.h", "type": "file" }, { - "bom-ref": "b1cca36612700dd2", + "bom-ref": "dcbcf3ed3794c250", "name": "/usr/include/google/protobuf/stubs/template_util.h", "type": "file" }, { - "bom-ref": "b7d02b505ba89007", + "bom-ref": "a4737716c805cfad", "name": "/usr/include/google/protobuf/text_format.h", "type": "file" }, { - "bom-ref": "3c9826ed177d894e", + "bom-ref": "cd34bbee2c6249e4", "name": "/usr/include/google/protobuf/timestamp.pb.h", "type": "file" }, { - "bom-ref": "870a2b8cf1fcedfd", + "bom-ref": "d1c4b39d9144e7ff", "name": "/usr/include/google/protobuf/timestamp.proto", "type": "file" }, { - "bom-ref": "14a822b9e6e3a1e6", + "bom-ref": "a1ced2e33d8ccf94", "name": "/usr/include/google/protobuf/type.pb.h", "type": "file" }, { - "bom-ref": "9596363a4db9ccae", + "bom-ref": "41b37343b630d5a0", "name": "/usr/include/google/protobuf/type.proto", "type": "file" }, { - "bom-ref": "4d4ec1a60e1723d0", + "bom-ref": "99167cad9dc763e6", "name": "/usr/include/google/protobuf/unknown_field_set.h", "type": "file" }, { - "bom-ref": "fd0054bafb963803", + "bom-ref": "a049065100829231", "name": "/usr/include/google/protobuf/util/delimited_message_util.h", "type": "file" }, { - "bom-ref": "07bfcabd06319946", + "bom-ref": "686c8bddac57b4fc", "name": "/usr/include/google/protobuf/util/field_comparator.h", "type": "file" }, { - "bom-ref": "c6e357cf06204005", + "bom-ref": "18c31fbb01d56557", "name": "/usr/include/google/protobuf/util/field_mask_util.h", "type": "file" }, { - "bom-ref": "6d5d11823b2d1e9d", + "bom-ref": "80330c5bdc0dd96b", "name": "/usr/include/google/protobuf/util/json_util.h", "type": "file" }, { - "bom-ref": "f790f87f7e0a570c", + "bom-ref": "6409f1b5d6d6e15e", "name": "/usr/include/google/protobuf/util/message_differencer.h", "type": "file" }, { - "bom-ref": "21a89e4e4348d052", + "bom-ref": "3c29f1b22e10ae40", "name": "/usr/include/google/protobuf/util/time_util.h", "type": "file" }, { - "bom-ref": "a873e374a05d1295", + "bom-ref": "d6398894cef78667", "name": "/usr/include/google/protobuf/util/type_resolver.h", "type": "file" }, { - "bom-ref": "569158c2568b0a79", + "bom-ref": "49d67d5cabcb518b", "name": "/usr/include/google/protobuf/util/type_resolver_util.h", "type": "file" }, { - "bom-ref": "3d2c4ca7592c8323", + "bom-ref": "6d350d443b3f3799", "name": "/usr/include/google/protobuf/wire_format.h", "type": "file" }, { - "bom-ref": "a26d40228e5466f8", + "bom-ref": "d644367c9ea2b816", "name": "/usr/include/google/protobuf/wire_format_lite.h", "type": "file" }, { - "bom-ref": "0f7fd9d494a14c6a", + "bom-ref": "f8858cfb89597a2c", "name": "/usr/include/google/protobuf/wrappers.pb.h", "type": "file" }, { - "bom-ref": "6beec8e05163adb9", + "bom-ref": "753d0c33ad482c3b", "name": "/usr/include/google/protobuf/wrappers.proto", "type": "file" }, { - "bom-ref": "04ff76eeee8deb13", + "bom-ref": "7e3d45600053f151", "name": "/usr/include/grp.h", "type": "file" }, { - "bom-ref": "807a5246bd7b98d3", + "bom-ref": "a50d5d608a033f2d", "name": "/usr/include/gshadow.h", "type": "file" }, { - "bom-ref": "e2f1221479feff53", + "bom-ref": "bea4b8d60cc0f605", "name": "/usr/include/histedit.h", "type": "file" }, { - "bom-ref": "fd47c3f595e81a64", + "bom-ref": "7bb507cc151a2122", "name": "/usr/include/iconv.h", "type": "file" }, { - "bom-ref": "ae8e383f709b05f4", + "bom-ref": "b157ed7c3c4ea4ea", "name": "/usr/include/ifaddrs.h", "type": "file" }, { - "bom-ref": "7557699165421ba3", + "bom-ref": "90642c6a91995539", "name": "/usr/include/infiniband/arch.h", "type": "file" }, { - "bom-ref": "276ea402ab94e3ef", + "bom-ref": "694a1d1694437379", "name": "/usr/include/infiniband/efadv.h", "type": "file" }, { - "bom-ref": "89201214e0aeba1c", + "bom-ref": "1f8e27695ec729de", "name": "/usr/include/infiniband/ib_user_ioctl_verbs.h", "type": "file" }, { - "bom-ref": "39e4511ba3e4dec6", + "bom-ref": "cd67c7caefff23c0", "name": "/usr/include/infiniband/manadv.h", "type": "file" }, { - "bom-ref": "a1cdba7e382ab6d3", + "bom-ref": "33b35aef3f8ecfb9", "name": "/usr/include/infiniband/mlx4dv.h", "type": "file" }, { - "bom-ref": "9399c8dcffd18dbf", + "bom-ref": "09b0d9280d1c7e01", "name": "/usr/include/infiniband/mlx5_api.h", "type": "file" }, { - "bom-ref": "0c89ea708482cf7f", + "bom-ref": "6c467d38e932bd1d", "name": "/usr/include/infiniband/mlx5_user_ioctl_verbs.h", "type": "file" }, { - "bom-ref": "7bc62afe0e6c4ffb", + "bom-ref": "77ebbbe7477fc629", "name": "/usr/include/infiniband/mlx5dv.h", "type": "file" }, { - "bom-ref": "868b2b07f7704bb8", + "bom-ref": "9c9241413661266e", "name": "/usr/include/infiniband/opcode.h", "type": "file" }, { - "bom-ref": "72cb9c70e812b6c5", + "bom-ref": "0663cca21db4b6c3", "name": "/usr/include/infiniband/sa-kern-abi.h", "type": "file" }, { - "bom-ref": "5b95b7d0cf8ac535", + "bom-ref": "b367be8135b45407", "name": "/usr/include/infiniband/sa.h", "type": "file" }, { - "bom-ref": "a1154c4b7724eba9", + "bom-ref": "b16702c72273a13b", "name": "/usr/include/infiniband/tm_types.h", "type": "file" }, { - "bom-ref": "a51a162ebcab1aa1", + "bom-ref": "2935c15ed18be04a", "name": "/usr/include/infiniband/umad.h", "type": "file" }, { - "bom-ref": "da0308e4daadd0e4", + "bom-ref": "01086996ec78184b", "name": "/usr/include/infiniband/umad_cm.h", "type": "file" }, { - "bom-ref": "60967420a0988061", + "bom-ref": "3489a0a1a9708d96", "name": "/usr/include/infiniband/umad_sa.h", "type": "file" }, { - "bom-ref": "5e3bf89bc6554d08", + "bom-ref": "019f479fc171dfff", "name": "/usr/include/infiniband/umad_sa_mcm.h", "type": "file" }, { - "bom-ref": "59ce73df24fb2dfa", + "bom-ref": "0e1eb12efbaf0e31", "name": "/usr/include/infiniband/umad_sm.h", "type": "file" }, { - "bom-ref": "9d344788933372ab", + "bom-ref": "0f3d747032676dd8", "name": "/usr/include/infiniband/umad_str.h", "type": "file" }, { - "bom-ref": "f9a06e0c0c5f42fc", + "bom-ref": "066afb7c463bc393", "name": "/usr/include/infiniband/umad_types.h", "type": "file" }, { - "bom-ref": "c957609a3f1461d6", + "bom-ref": "ae8668cca3bafe58", "name": "/usr/include/infiniband/verbs.h", "type": "file" }, { - "bom-ref": "692342b527c58c9e", + "bom-ref": "dcd4dc67683a1e14", "name": "/usr/include/infiniband/verbs_api.h", "type": "file" }, { - "bom-ref": "74c8b92c9190f288", + "bom-ref": "8f278807a12158a6", "name": "/usr/include/inttypes.h", "type": "file" }, { - "bom-ref": "fd52a3850bad083b", + "bom-ref": "c7329faa41368f21", "name": "/usr/include/langinfo.h", "type": "file" }, { - "bom-ref": "2fae293251eb7a7b", + "bom-ref": "d5b66d70fc0e2131", "name": "/usr/include/lastlog.h", "type": "file" }, { - "bom-ref": "ed14da1875e26387", + "bom-ref": "54d8c8c153de10b9", "name": "/usr/include/leveldb/c.h", "type": "file" }, { - "bom-ref": "8d370f46226c9026", + "bom-ref": "adbd68fc6dac48ec", "name": "/usr/include/leveldb/cache.h", "type": "file" }, { - "bom-ref": "362c68378af35b85", + "bom-ref": "b7b0e8eaa4547007", "name": "/usr/include/leveldb/comparator.h", "type": "file" }, { - "bom-ref": "9d5b552fe09514fb", + "bom-ref": "17d3d401240e6689", "name": "/usr/include/leveldb/db.h", "type": "file" }, { - "bom-ref": "2a3f79494b90ed97", + "bom-ref": "aee7b66e64b5aeb9", "name": "/usr/include/leveldb/dumpfile.h", "type": "file" }, { - "bom-ref": "94b0fbb90423fd18", + "bom-ref": "ba18ee4a19050262", "name": "/usr/include/leveldb/env.h", "type": "file" }, { - "bom-ref": "b8b62dc1120a75a9", + "bom-ref": "1f4d7697b99fb7d7", "name": "/usr/include/leveldb/export.h", "type": "file" }, { - "bom-ref": "5900927f95e2e5fe", + "bom-ref": "1564bdbef0abeae0", "name": "/usr/include/leveldb/filter_policy.h", "type": "file" }, { - "bom-ref": "847ca4a9729693a1", + "bom-ref": "4d3f8f08c21d415b", "name": "/usr/include/leveldb/helpers/memenv.h", "type": "file" }, { - "bom-ref": "336f3b4c2436608f", + "bom-ref": "28673569b7396f89", "name": "/usr/include/leveldb/iterator.h", "type": "file" }, { - "bom-ref": "d87f383749992311", + "bom-ref": "a2a3e0313b7742ef", "name": "/usr/include/leveldb/options.h", "type": "file" }, { - "bom-ref": "20f1d0cb91ec21c6", + "bom-ref": "9f817ccf2343f0e0", "name": "/usr/include/leveldb/slice.h", "type": "file" }, { - "bom-ref": "84cb69a55e7d46be", + "bom-ref": "d12d6aa6e0154cec", "name": "/usr/include/leveldb/status.h", "type": "file" }, { - "bom-ref": "0bb4487ada494702", + "bom-ref": "1727e1ea418642bc", "name": "/usr/include/leveldb/table.h", "type": "file" }, { - "bom-ref": "f4fc4048e6754957", + "bom-ref": "d097dd9666167b2d", "name": "/usr/include/leveldb/table_builder.h", "type": "file" }, { - "bom-ref": "81e50d5d7ac6f0c2", + "bom-ref": "8b9c7d235dd4d050", "name": "/usr/include/leveldb/write_batch.h", "type": "file" }, { - "bom-ref": "a07a194824dc2683", - "name": "/usr/include/libcublas/13/cublas.h", - "type": "file" - }, - { - "bom-ref": "d3305e67a0839c9a", - "name": "/usr/include/libcublas/13/cublasLt.h", - "type": "file" - }, - { - "bom-ref": "9e0241eb2e9c764b", - "name": "/usr/include/libcublas/13/cublasXt.h", - "type": "file" - }, - { - "bom-ref": "53ad9b27c117d5e4", - "name": "/usr/include/libcublas/13/cublas_api.h", - "type": "file" - }, - { - "bom-ref": "136919ffaa6e3f09", - "name": "/usr/include/libcublas/13/cublas_v2.h", - "type": "file" - }, - { - "bom-ref": "00238d1b713a4e77", - "name": "/usr/include/libcublas/13/nvblas.h", + "bom-ref": "f83b46bb9a04e3b7", + "name": "/usr/include/libcublasmp/13/cublasmp.h", "type": "file" }, { - "bom-ref": "11e3100bf7061da6", + "bom-ref": "5598ca5005e4ad58", "name": "/usr/include/libgen.h", "type": "file" }, { - "bom-ref": "67c69011d9e552d1", + "bom-ref": "3d9fbb72fce0ab2b", "name": "/usr/include/libintl.h", "type": "file" }, { - "bom-ref": "81a4dbbe65d9efa7", + "bom-ref": "e9430065f15b0b38", "name": "/usr/include/libnl3/netlink/addr.h", "type": "file" }, { - "bom-ref": "f2d9fa0be6d00a33", + "bom-ref": "04b5a1ec63d2ede4", "name": "/usr/include/libnl3/netlink/attr.h", "type": "file" }, { - "bom-ref": "b7fe13126e98f151", + "bom-ref": "59a7e491ec708112", "name": "/usr/include/libnl3/netlink/cache-api.h", "type": "file" }, { - "bom-ref": "375f4d4f5cfcb2ca", + "bom-ref": "812e84729ca52bd9", "name": "/usr/include/libnl3/netlink/cache.h", "type": "file" }, { - "bom-ref": "9179a55d83d3d174", + "bom-ref": "86ccb4d4dcb0e2fb", "name": "/usr/include/libnl3/netlink/cli/addr.h", "type": "file" }, { - "bom-ref": "7feee76d860641c3", + "bom-ref": "45d875667f6748b8", "name": "/usr/include/libnl3/netlink/cli/class.h", "type": "file" }, { - "bom-ref": "f7bb774d38fd8ef1", + "bom-ref": "5da4c3c4e952607e", "name": "/usr/include/libnl3/netlink/cli/cls.h", "type": "file" }, { - "bom-ref": "de11bf9c03b8e599", + "bom-ref": "3f4132388dff5746", "name": "/usr/include/libnl3/netlink/cli/ct.h", "type": "file" }, { - "bom-ref": "de0c2baf863eceb8", + "bom-ref": "a9cb24198ab5e72b", "name": "/usr/include/libnl3/netlink/cli/exp.h", "type": "file" }, { - "bom-ref": "07f9bafa59fd5c69", + "bom-ref": "1e289ea5dfd2d2ea", "name": "/usr/include/libnl3/netlink/cli/link.h", "type": "file" }, { - "bom-ref": "0c7747fd0d85efd5", + "bom-ref": "047e233d3957eb4a", "name": "/usr/include/libnl3/netlink/cli/mdb.h", "type": "file" }, { - "bom-ref": "83fefbf8c7c3a777", + "bom-ref": "233bb4ee2f2ebfc4", "name": "/usr/include/libnl3/netlink/cli/neigh.h", "type": "file" }, { - "bom-ref": "034273fa8961388a", + "bom-ref": "e3cfc141ed87fb4d", "name": "/usr/include/libnl3/netlink/cli/qdisc.h", "type": "file" }, { - "bom-ref": "364fbab1b423807f", + "bom-ref": "b6d8b2dd3c7ffd48", "name": "/usr/include/libnl3/netlink/cli/route.h", "type": "file" }, { - "bom-ref": "75aecb9e721611ae", + "bom-ref": "5aa513008770a6b1", "name": "/usr/include/libnl3/netlink/cli/rule.h", "type": "file" }, { - "bom-ref": "c783072eff60fa36", + "bom-ref": "bb67e552cdecd6fd", "name": "/usr/include/libnl3/netlink/cli/tc.h", "type": "file" }, { - "bom-ref": "d3c250a97a9872a9", + "bom-ref": "ba74b876fb07eb22", "name": "/usr/include/libnl3/netlink/cli/utils.h", "type": "file" }, { - "bom-ref": "59e316be478ef44d", + "bom-ref": "114fac5766bc5dde", "name": "/usr/include/libnl3/netlink/data.h", "type": "file" }, { - "bom-ref": "de8141cead07cc3f", + "bom-ref": "fafcf756c9ad75a4", "name": "/usr/include/libnl3/netlink/errno.h", "type": "file" }, { - "bom-ref": "d7867a74b02c97f1", + "bom-ref": "9c9b733ad5daeeba", "name": "/usr/include/libnl3/netlink/fib_lookup/lookup.h", "type": "file" }, { - "bom-ref": "937403ad940d0763", + "bom-ref": "b942e2c2f563d5cc", "name": "/usr/include/libnl3/netlink/fib_lookup/request.h", "type": "file" }, { - "bom-ref": "c9d7e32b3635f940", + "bom-ref": "ff02eb0de1b2ef9f", "name": "/usr/include/libnl3/netlink/genl/ctrl.h", "type": "file" }, { - "bom-ref": "975d4cbb1c9b758b", + "bom-ref": "7cd58fbdb538a170", "name": "/usr/include/libnl3/netlink/genl/family.h", "type": "file" }, { - "bom-ref": "b131d8d3dce85584", + "bom-ref": "5999a3ad98a9cc47", "name": "/usr/include/libnl3/netlink/genl/genl.h", "type": "file" }, { - "bom-ref": "edcfae149f3312f1", + "bom-ref": "e704fee3449f2dea", "name": "/usr/include/libnl3/netlink/genl/mngt.h", "type": "file" }, { - "bom-ref": "738b389da768d261", + "bom-ref": "573b21c6afed18e6", "name": "/usr/include/libnl3/netlink/handlers.h", "type": "file" }, { - "bom-ref": "6e6035722ffd8f59", + "bom-ref": "e0c76a6a0ecf121e", "name": "/usr/include/libnl3/netlink/hash.h", "type": "file" }, { - "bom-ref": "75e2548f68589cda", + "bom-ref": "e769c8718920c121", "name": "/usr/include/libnl3/netlink/hashtable.h", "type": "file" }, { - "bom-ref": "d1152aa51ae688c9", + "bom-ref": "033f58c956e072fe", "name": "/usr/include/libnl3/netlink/idiag/idiagnl.h", "type": "file" }, { - "bom-ref": "a67fda62de392ef4", + "bom-ref": "1ecefb7db58d9d4b", "name": "/usr/include/libnl3/netlink/idiag/meminfo.h", "type": "file" }, { - "bom-ref": "998cffef45b0916c", + "bom-ref": "43b234d9ded03403", "name": "/usr/include/libnl3/netlink/idiag/msg.h", "type": "file" }, { - "bom-ref": "e0dc07d238e557d0", + "bom-ref": "46c96aa0014052d7", "name": "/usr/include/libnl3/netlink/idiag/req.h", "type": "file" }, { - "bom-ref": "e2ad665c73bab05e", + "bom-ref": "d33b7d7fcb6bd765", "name": "/usr/include/libnl3/netlink/idiag/vegasinfo.h", "type": "file" }, { - "bom-ref": "12d0597cc75d9b23", + "bom-ref": "b1b23e4ef20da3d0", "name": "/usr/include/libnl3/netlink/list.h", "type": "file" }, { - "bom-ref": "b44a86968e7b9669", + "bom-ref": "59f7c45a303f267a", "name": "/usr/include/libnl3/netlink/msg.h", "type": "file" }, { - "bom-ref": "91798f3bf5ea0e21", + "bom-ref": "4d2777e204316d2e", "name": "/usr/include/libnl3/netlink/netfilter/ct.h", "type": "file" }, { - "bom-ref": "079a4b8147bae18a", + "bom-ref": "5d65fc353fa07c71", "name": "/usr/include/libnl3/netlink/netfilter/exp.h", "type": "file" }, { - "bom-ref": "943d2f0393d706d3", + "bom-ref": "21433171b2e0baf8", "name": "/usr/include/libnl3/netlink/netfilter/log.h", "type": "file" }, { - "bom-ref": "c7e224a91f8c5458", + "bom-ref": "b4235ff3c711737f", "name": "/usr/include/libnl3/netlink/netfilter/log_msg.h", "type": "file" }, { - "bom-ref": "3d1856bcfeb88ffd", + "bom-ref": "4edc0bc6c173ad6a", "name": "/usr/include/libnl3/netlink/netfilter/netfilter.h", "type": "file" }, { - "bom-ref": "d1fcaae43a738a53", + "bom-ref": "6d5caca4795ab5cc", "name": "/usr/include/libnl3/netlink/netfilter/nfnl.h", "type": "file" }, { - "bom-ref": "4b333aa551d5644a", + "bom-ref": "87b95d51b84df48d", "name": "/usr/include/libnl3/netlink/netfilter/queue.h", "type": "file" }, { - "bom-ref": "89171b9dc68986aa", + "bom-ref": "a333920a9c140891", "name": "/usr/include/libnl3/netlink/netfilter/queue_msg.h", "type": "file" }, { - "bom-ref": "26b3e7860ae4deca", + "bom-ref": "b50382e0f3df00b9", "name": "/usr/include/libnl3/netlink/netlink-compat.h", "type": "file" }, { - "bom-ref": "bf5fd24088a79388", + "bom-ref": "f6735debbd869b4f", "name": "/usr/include/libnl3/netlink/netlink-kernel.h", "type": "file" }, { - "bom-ref": "5c0329a986ff0ccd", + "bom-ref": "d9898fbe4e0c58be", "name": "/usr/include/libnl3/netlink/netlink.h", "type": "file" }, { - "bom-ref": "572257712d0f68a0", + "bom-ref": "a12533775e3b427f", "name": "/usr/include/libnl3/netlink/object-api.h", "type": "file" }, { - "bom-ref": "0666e8b6908ba41c", + "bom-ref": "13e9ab70f3d5e59b", "name": "/usr/include/libnl3/netlink/object.h", "type": "file" }, { - "bom-ref": "b77e258b091246af", + "bom-ref": "45a45bd41c483448", "name": "/usr/include/libnl3/netlink/route/act/gact.h", "type": "file" }, { - "bom-ref": "07eb240263313cdb", + "bom-ref": "621b799974c69978", "name": "/usr/include/libnl3/netlink/route/act/mirred.h", "type": "file" }, { - "bom-ref": "7d398d9fd0625bce", + "bom-ref": "2db536ed219fc529", "name": "/usr/include/libnl3/netlink/route/act/nat.h", "type": "file" }, { - "bom-ref": "6eb2da4a00045b5b", + "bom-ref": "f8fc1b70f6bdffb4", "name": "/usr/include/libnl3/netlink/route/act/skbedit.h", "type": "file" }, { - "bom-ref": "5c46012f19905fd3", + "bom-ref": "866d9bc1d085b2a0", "name": "/usr/include/libnl3/netlink/route/act/vlan.h", "type": "file" }, { - "bom-ref": "a4ba8b4a5cf6c3f2", + "bom-ref": "c46c99d364cc256d", "name": "/usr/include/libnl3/netlink/route/action.h", "type": "file" }, { - "bom-ref": "314104e66b7f16f0", + "bom-ref": "800def2ee69f8217", "name": "/usr/include/libnl3/netlink/route/addr.h", "type": "file" }, { - "bom-ref": "90496ef4912d9f81", + "bom-ref": "daf43d1592b2171a", "name": "/usr/include/libnl3/netlink/route/class.h", "type": "file" }, { - "bom-ref": "dec3b11d657b94cf", + "bom-ref": "167d5bafce4f5a4c", "name": "/usr/include/libnl3/netlink/route/classifier.h", "type": "file" }, { - "bom-ref": "babfd80768bedd4a", + "bom-ref": "ced85c3bf2e30ecd", "name": "/usr/include/libnl3/netlink/route/cls/basic.h", "type": "file" }, { - "bom-ref": "5b90592278051e3a", + "bom-ref": "ac61de794386ed89", "name": "/usr/include/libnl3/netlink/route/cls/cgroup.h", "type": "file" }, { - "bom-ref": "6fad51e87067ec36", + "bom-ref": "f20b63e9d33e6b45", "name": "/usr/include/libnl3/netlink/route/cls/ematch.h", "type": "file" }, { - "bom-ref": "1443a3026e200679", + "bom-ref": "81ff90fae950a142", "name": "/usr/include/libnl3/netlink/route/cls/ematch/cmp.h", "type": "file" }, { - "bom-ref": "595e14fd9095be34", + "bom-ref": "9cc39a25bece376b", "name": "/usr/include/libnl3/netlink/route/cls/ematch/meta.h", "type": "file" }, { - "bom-ref": "fb28f490a65dbeb7", + "bom-ref": "82f31048bb86eeb0", "name": "/usr/include/libnl3/netlink/route/cls/ematch/nbyte.h", "type": "file" }, { - "bom-ref": "b64a0c4e97e81f7c", + "bom-ref": "bd20c8e583c2769f", "name": "/usr/include/libnl3/netlink/route/cls/ematch/text.h", "type": "file" }, { - "bom-ref": "989ab433abb9efba", + "bom-ref": "bc61ac58ec78e835", "name": "/usr/include/libnl3/netlink/route/cls/flower.h", "type": "file" }, { - "bom-ref": "505ac50acb29724d", + "bom-ref": "3fcc008bcffd5222", "name": "/usr/include/libnl3/netlink/route/cls/fw.h", "type": "file" }, { - "bom-ref": "bd0960a1c6f35718", + "bom-ref": "f071ebc1b191b487", "name": "/usr/include/libnl3/netlink/route/cls/matchall.h", "type": "file" }, { - "bom-ref": "75010e83790056bb", + "bom-ref": "2fd7746430bb33cc", "name": "/usr/include/libnl3/netlink/route/cls/police.h", "type": "file" }, { - "bom-ref": "b21a9c8fb2a61424", + "bom-ref": "ecc7636fc9a7fd5f", "name": "/usr/include/libnl3/netlink/route/cls/u32.h", "type": "file" }, { - "bom-ref": "e22da09b96fdd977", + "bom-ref": "623139ffa3f6c474", "name": "/usr/include/libnl3/netlink/route/link.h", "type": "file" }, { - "bom-ref": "84ac4948431e9abb", + "bom-ref": "d9b9c5bf2f182c44", "name": "/usr/include/libnl3/netlink/route/link/api.h", "type": "file" }, { - "bom-ref": "1f1eb0d1cd6e1054", + "bom-ref": "edf1df58abfe75cb", "name": "/usr/include/libnl3/netlink/route/link/bonding.h", "type": "file" }, { - "bom-ref": "b9398edff076d8fc", + "bom-ref": "5268a0fedf1b0c0f", "name": "/usr/include/libnl3/netlink/route/link/bridge.h", "type": "file" }, { - "bom-ref": "c72cff6a484615a9", + "bom-ref": "3ee3f2089190808e", "name": "/usr/include/libnl3/netlink/route/link/can.h", "type": "file" }, { - "bom-ref": "a0ffda331aea3a8d", + "bom-ref": "72bd3fe1cd90ec02", "name": "/usr/include/libnl3/netlink/route/link/geneve.h", "type": "file" }, { - "bom-ref": "b104a5b454b8c265", + "bom-ref": "e1f3cca786886976", "name": "/usr/include/libnl3/netlink/route/link/inet.h", "type": "file" }, { - "bom-ref": "746216cb1f48d6c0", + "bom-ref": "7e9f7b1e6825c943", "name": "/usr/include/libnl3/netlink/route/link/inet6.h", "type": "file" }, { - "bom-ref": "e3aea4e85f6ffb3a", + "bom-ref": "09fa09a9da443cfd", "name": "/usr/include/libnl3/netlink/route/link/info-api.h", "type": "file" }, { - "bom-ref": "f8ccdb7aac3e3682", + "bom-ref": "6d9403bf353464f9", "name": "/usr/include/libnl3/netlink/route/link/ip6gre.h", "type": "file" }, { - "bom-ref": "7408ae37dd54ed1f", + "bom-ref": "caa4e0a720ecaf78", "name": "/usr/include/libnl3/netlink/route/link/ip6tnl.h", "type": "file" }, { - "bom-ref": "2365938bd6b2ec02", + "bom-ref": "97673056a7a3cf45", "name": "/usr/include/libnl3/netlink/route/link/ip6vti.h", "type": "file" }, { - "bom-ref": "6ddd4c7356753b33", + "bom-ref": "a6c29d54265c1694", "name": "/usr/include/libnl3/netlink/route/link/ipgre.h", "type": "file" }, { - "bom-ref": "57c04388d713ba4c", + "bom-ref": "71eacd0599d9f0bf", "name": "/usr/include/libnl3/netlink/route/link/ipip.h", "type": "file" }, { - "bom-ref": "8273a57635423183", + "bom-ref": "34110c882f910f08", "name": "/usr/include/libnl3/netlink/route/link/ipvlan.h", "type": "file" }, { - "bom-ref": "b781449be0786b3e", + "bom-ref": "06c102a72ad7c481", "name": "/usr/include/libnl3/netlink/route/link/ipvti.h", "type": "file" }, { - "bom-ref": "c038d8ceeb6d2665", + "bom-ref": "5a7d7bfbad3240ea", "name": "/usr/include/libnl3/netlink/route/link/macsec.h", "type": "file" }, { - "bom-ref": "2e3e740453f3d6c7", + "bom-ref": "ede00df21e549870", "name": "/usr/include/libnl3/netlink/route/link/macvlan.h", "type": "file" }, { - "bom-ref": "49f7f0caf1a15351", + "bom-ref": "8fb7e38e7e4ee6de", "name": "/usr/include/libnl3/netlink/route/link/macvtap.h", "type": "file" }, { - "bom-ref": "d81d70644ced9111", + "bom-ref": "9664f09c3fed8222", "name": "/usr/include/libnl3/netlink/route/link/ppp.h", "type": "file" }, { - "bom-ref": "eea188001b6a56d9", + "bom-ref": "982d4838f1be402a", "name": "/usr/include/libnl3/netlink/route/link/sit.h", "type": "file" }, { - "bom-ref": "972266ec371aca76", + "bom-ref": "4c3cf344973204c5", "name": "/usr/include/libnl3/netlink/route/link/sriov.h", "type": "file" }, { - "bom-ref": "3678b9d1fb143c7d", + "bom-ref": "7273673dbb8bfc52", "name": "/usr/include/libnl3/netlink/route/link/team.h", "type": "file" }, { - "bom-ref": "844718ca01ae122c", + "bom-ref": "04f6d0b3f5ee058b", "name": "/usr/include/libnl3/netlink/route/link/veth.h", "type": "file" }, { - "bom-ref": "151ca389eda8d272", + "bom-ref": "3ccccdf6b87786ad", "name": "/usr/include/libnl3/netlink/route/link/vlan.h", "type": "file" }, { - "bom-ref": "c8965aeb7bd2e17c", + "bom-ref": "b2339faf9fa1f887", "name": "/usr/include/libnl3/netlink/route/link/vrf.h", "type": "file" }, { - "bom-ref": "f0a7725e72768ae3", + "bom-ref": "00923f5703c78958", "name": "/usr/include/libnl3/netlink/route/link/vxlan.h", "type": "file" }, { - "bom-ref": "dd864392f6f71fda", + "bom-ref": "cfbcf4ee32ceda79", "name": "/usr/include/libnl3/netlink/route/link/xfrmi.h", "type": "file" }, { - "bom-ref": "84a68d6fb65ab96d", + "bom-ref": "677997a89ea9bfa2", "name": "/usr/include/libnl3/netlink/route/mdb.h", "type": "file" }, { - "bom-ref": "45a1033c8590ef74", + "bom-ref": "df40be4f945ac947", "name": "/usr/include/libnl3/netlink/route/neighbour.h", "type": "file" }, { - "bom-ref": "078841a4224cd4fa", + "bom-ref": "fc9f7259881f2865", "name": "/usr/include/libnl3/netlink/route/neightbl.h", "type": "file" }, { - "bom-ref": "8f39195d545044c8", + "bom-ref": "0d1d39f5ad71dfd7", "name": "/usr/include/libnl3/netlink/route/netconf.h", "type": "file" }, { - "bom-ref": "4ec3777f7cade569", + "bom-ref": "df1f63f7453b5bd2", "name": "/usr/include/libnl3/netlink/route/nexthop.h", "type": "file" }, { - "bom-ref": "740238015b9fd9aa", + "bom-ref": "b06412d8e3b5db35", "name": "/usr/include/libnl3/netlink/route/pktloc.h", "type": "file" }, { - "bom-ref": "c3673c8205038781", + "bom-ref": "77b5c653438e43da", "name": "/usr/include/libnl3/netlink/route/qdisc.h", "type": "file" }, { - "bom-ref": "2d96d54039e9a6a2", + "bom-ref": "c555a7fe543572cd", "name": "/usr/include/libnl3/netlink/route/qdisc/cbq.h", "type": "file" }, { - "bom-ref": "b72b72e3b0c3f177", + "bom-ref": "285f565fa642f64c", "name": "/usr/include/libnl3/netlink/route/qdisc/dsmark.h", "type": "file" }, { - "bom-ref": "3dbfe547a6e00f47", + "bom-ref": "c1c5c2594f14af70", "name": "/usr/include/libnl3/netlink/route/qdisc/fifo.h", "type": "file" }, { - "bom-ref": "9ca14e1b56386930", + "bom-ref": "40781ea506b2601b", "name": "/usr/include/libnl3/netlink/route/qdisc/fq_codel.h", "type": "file" }, { - "bom-ref": "7cd81c3800f89813", + "bom-ref": "0babb5087a4b4204", "name": "/usr/include/libnl3/netlink/route/qdisc/hfsc.h", "type": "file" }, { - "bom-ref": "e6200a2610ae2db5", + "bom-ref": "dffa16d135260066", "name": "/usr/include/libnl3/netlink/route/qdisc/htb.h", "type": "file" }, { - "bom-ref": "c20730561ab8f831", + "bom-ref": "62cb521c2f85f82e", "name": "/usr/include/libnl3/netlink/route/qdisc/mqprio.h", "type": "file" }, { - "bom-ref": "426065ff7f490229", + "bom-ref": "3ed7a6dd40a70506", "name": "/usr/include/libnl3/netlink/route/qdisc/netem.h", "type": "file" }, { - "bom-ref": "4c88e36541d37a05", + "bom-ref": "bbfbeb6b5cc2ed5a", "name": "/usr/include/libnl3/netlink/route/qdisc/plug.h", "type": "file" }, { - "bom-ref": "ddbe9adeb7f90a6c", + "bom-ref": "1e96f19de5544917", "name": "/usr/include/libnl3/netlink/route/qdisc/prio.h", "type": "file" }, { - "bom-ref": "0742578d3dd3821c", + "bom-ref": "95455c42aa20125f", "name": "/usr/include/libnl3/netlink/route/qdisc/red.h", "type": "file" }, { - "bom-ref": "0ea971520c13357f", + "bom-ref": "8372010018ae2d08", "name": "/usr/include/libnl3/netlink/route/qdisc/sfq.h", "type": "file" }, { - "bom-ref": "fa4fd49ef48a10cc", + "bom-ref": "9927c4843f2c1847", "name": "/usr/include/libnl3/netlink/route/qdisc/tbf.h", "type": "file" }, { - "bom-ref": "7f86878b2ab67ee4", + "bom-ref": "b679bd65bef07e33", "name": "/usr/include/libnl3/netlink/route/route.h", "type": "file" }, { - "bom-ref": "25df0dd041f2a16f", + "bom-ref": "67070d2a8f1667ac", "name": "/usr/include/libnl3/netlink/route/rtnl.h", "type": "file" }, { - "bom-ref": "9d028467f996246f", + "bom-ref": "524d1965bcc5fb94", "name": "/usr/include/libnl3/netlink/route/rule.h", "type": "file" }, { - "bom-ref": "7f6a2e2a2a934916", + "bom-ref": "57af2c96129c3859", "name": "/usr/include/libnl3/netlink/route/tc-api.h", "type": "file" }, { - "bom-ref": "bd0852e87e4bec9c", + "bom-ref": "42386b2f2a7ecb63", "name": "/usr/include/libnl3/netlink/route/tc.h", "type": "file" }, { - "bom-ref": "04e9da38e4064792", + "bom-ref": "6800d3f48d393c41", "name": "/usr/include/libnl3/netlink/socket.h", "type": "file" }, { - "bom-ref": "5052396e4eff348e", + "bom-ref": "b451ec57748c6c6d", "name": "/usr/include/libnl3/netlink/types.h", "type": "file" }, { - "bom-ref": "82b81cf65c9f0c36", + "bom-ref": "8e4a0b433e54a501", "name": "/usr/include/libnl3/netlink/utils.h", "type": "file" }, { - "bom-ref": "7e4d3bca46e10afe", + "bom-ref": "26b62aab56ac10c1", "name": "/usr/include/libnl3/netlink/version.h", "type": "file" }, { - "bom-ref": "916c7f6dd12eb7a7", + "bom-ref": "bbb16ccc67195d30", "name": "/usr/include/libnl3/netlink/xfrm/ae.h", "type": "file" }, { - "bom-ref": "a6f454779eb39599", + "bom-ref": "b424940aa5c9180a", "name": "/usr/include/libnl3/netlink/xfrm/lifetime.h", "type": "file" }, { - "bom-ref": "7fe063d6ec93bd21", + "bom-ref": "a4ad63be45d91e3e", "name": "/usr/include/libnl3/netlink/xfrm/sa.h", "type": "file" }, { - "bom-ref": "8371485ff2ddb74a", + "bom-ref": "4910bd02b062a5d1", "name": "/usr/include/libnl3/netlink/xfrm/selector.h", "type": "file" }, { - "bom-ref": "ee02dc8729f0c0e7", + "bom-ref": "a4fac28c67aba858", "name": "/usr/include/libnl3/netlink/xfrm/sp.h", "type": "file" }, { - "bom-ref": "a6037fde6b9fb93c", + "bom-ref": "d1a53839857ad23f", "name": "/usr/include/libnl3/netlink/xfrm/template.h", "type": "file" }, { - "bom-ref": "3a9e49e4ee2a2339", + "bom-ref": "cba9e3620786fe93", "name": "/usr/include/libpng16/png.h", "type": "file" }, { - "bom-ref": "567cfea3453041c9", + "bom-ref": "5b9575724fe1a2f7", "name": "/usr/include/libpng16/pngconf.h", "type": "file" }, { - "bom-ref": "08171fa046b3f88a", + "bom-ref": "bf23fccba71ab6f8", "name": "/usr/include/libpng16/pnglibconf.h", "type": "file" }, { - "bom-ref": "cd2071b7c192db90", + "bom-ref": "71c38165c1a8f5b2", "name": "/usr/include/libxml2/libxml/DOCBparser.h", "type": "file" }, { - "bom-ref": "4c5741361044c38f", + "bom-ref": "797ac8a845445fad", "name": "/usr/include/libxml2/libxml/HTMLparser.h", "type": "file" }, { - "bom-ref": "d89499b3ed414e63", + "bom-ref": "558f9bfe3846f521", "name": "/usr/include/libxml2/libxml/HTMLtree.h", "type": "file" }, { - "bom-ref": "428f2a6fc9fb21fc", + "bom-ref": "49ddd7e9074d41d6", "name": "/usr/include/libxml2/libxml/SAX.h", "type": "file" }, { - "bom-ref": "999b6760028634e7", + "bom-ref": "cd4fafc88764d1a1", "name": "/usr/include/libxml2/libxml/SAX2.h", "type": "file" }, { - "bom-ref": "c82ed75f3bc1518a", + "bom-ref": "5d0b25e49a035654", "name": "/usr/include/libxml2/libxml/c14n.h", "type": "file" }, { - "bom-ref": "1fb617808a7ca0fe", + "bom-ref": "46806c00b2330440", "name": "/usr/include/libxml2/libxml/catalog.h", "type": "file" }, { - "bom-ref": "63014794ad721ed4", + "bom-ref": "b15d31d6f00ec61a", "name": "/usr/include/libxml2/libxml/chvalid.h", "type": "file" }, { - "bom-ref": "707e779d1aed897b", + "bom-ref": "cac0b554144f4b95", "name": "/usr/include/libxml2/libxml/debugXML.h", "type": "file" }, { - "bom-ref": "c68b444113855e19", + "bom-ref": "7468f718751e767f", "name": "/usr/include/libxml2/libxml/dict.h", "type": "file" }, { - "bom-ref": "a945cb23b0936ee5", + "bom-ref": "249cc7e28ca01c97", "name": "/usr/include/libxml2/libxml/encoding.h", "type": "file" }, { - "bom-ref": "3789d2e6f9e76e71", + "bom-ref": "f90c12298129d2b3", "name": "/usr/include/libxml2/libxml/entities.h", "type": "file" }, { - "bom-ref": "341019b6c0a42707", + "bom-ref": "c4c0a535da17f6f5", "name": "/usr/include/libxml2/libxml/globals.h", "type": "file" }, { - "bom-ref": "275e4b35f98750d5", + "bom-ref": "7c36778d7d8f7927", "name": "/usr/include/libxml2/libxml/hash.h", "type": "file" }, { - "bom-ref": "74526aba5251683a", + "bom-ref": "2a4a21316615cf34", "name": "/usr/include/libxml2/libxml/list.h", "type": "file" }, { - "bom-ref": "b2b5ef9c96d47e42", + "bom-ref": "3e0798887ddb0be8", "name": "/usr/include/libxml2/libxml/nanoftp.h", "type": "file" }, { - "bom-ref": "f69a5504ff88c97f", + "bom-ref": "7b4845855289bfdd", "name": "/usr/include/libxml2/libxml/nanohttp.h", "type": "file" }, { - "bom-ref": "0cbd765ee0763bba", + "bom-ref": "0e11f60eebc525d4", "name": "/usr/include/libxml2/libxml/parser.h", "type": "file" }, { - "bom-ref": "3eb7a1058d0a87cd", + "bom-ref": "6f0fe0b324901627", "name": "/usr/include/libxml2/libxml/parserInternals.h", "type": "file" }, { - "bom-ref": "27dd553e4e9c5c85", + "bom-ref": "87390ef15f559877", "name": "/usr/include/libxml2/libxml/pattern.h", "type": "file" }, { - "bom-ref": "3228f077cd519a92", + "bom-ref": "bdd1cccd231396f8", "name": "/usr/include/libxml2/libxml/relaxng.h", "type": "file" }, { - "bom-ref": "db1e70bfea7f366e", + "bom-ref": "6727deb1ca541da0", "name": "/usr/include/libxml2/libxml/schemasInternals.h", "type": "file" }, { - "bom-ref": "05383b230a07b2f1", + "bom-ref": "aedbfc00621b9367", "name": "/usr/include/libxml2/libxml/schematron.h", "type": "file" }, { - "bom-ref": "fdb3305c456d066d", + "bom-ref": "1f8596f9b9c4da2b", "name": "/usr/include/libxml2/libxml/threads.h", "type": "file" }, { - "bom-ref": "bf4390f70eebfdd5", + "bom-ref": "7ed08701518c171f", "name": "/usr/include/libxml2/libxml/tree.h", "type": "file" }, { - "bom-ref": "629ee00da75fca5c", + "bom-ref": "628b35275aa3de82", "name": "/usr/include/libxml2/libxml/uri.h", "type": "file" }, { - "bom-ref": "058350ede4a08454", + "bom-ref": "9a139f8424520eda", "name": "/usr/include/libxml2/libxml/valid.h", "type": "file" }, { - "bom-ref": "1eb04e38c6e74c85", + "bom-ref": "72569d3a06cf8d73", "name": "/usr/include/libxml2/libxml/xinclude.h", "type": "file" }, { - "bom-ref": "47d1f80024820b00", + "bom-ref": "274df83905680862", "name": "/usr/include/libxml2/libxml/xlink.h", "type": "file" }, { - "bom-ref": "9b5bdf0fa49dfc6b", + "bom-ref": "828ea34f319a82a1", "name": "/usr/include/libxml2/libxml/xmlIO.h", "type": "file" }, { - "bom-ref": "00b3ccf9e2716fde", + "bom-ref": "6bb6d1d7d595188c", "name": "/usr/include/libxml2/libxml/xmlautomata.h", "type": "file" }, { - "bom-ref": "c9ca1e80d8aafb42", + "bom-ref": "aab0f40c2412fab8", "name": "/usr/include/libxml2/libxml/xmlerror.h", "type": "file" }, { - "bom-ref": "e92608322dad224a", + "bom-ref": "0fe3abb920bf60e0", "name": "/usr/include/libxml2/libxml/xmlexports.h", "type": "file" }, { - "bom-ref": "9fd19ba0c5ff47c9", + "bom-ref": "818ac04f48d60047", "name": "/usr/include/libxml2/libxml/xmlmemory.h", "type": "file" }, { - "bom-ref": "2512bdf29d44086d", + "bom-ref": "e0fc633f3cb8495f", "name": "/usr/include/libxml2/libxml/xmlmodule.h", "type": "file" }, { - "bom-ref": "1dbd9886a05b3910", + "bom-ref": "732807d493bd5372", "name": "/usr/include/libxml2/libxml/xmlreader.h", "type": "file" }, { - "bom-ref": "96359a9e9da124b8", + "bom-ref": "70abbc990eb7de3e", "name": "/usr/include/libxml2/libxml/xmlregexp.h", "type": "file" }, { - "bom-ref": "76fa7ed9ec6a1dda", + "bom-ref": "0a8324f6a0316714", "name": "/usr/include/libxml2/libxml/xmlsave.h", "type": "file" }, { - "bom-ref": "df649f65cc1f5307", + "bom-ref": "3a55555567de3b31", "name": "/usr/include/libxml2/libxml/xmlschemas.h", "type": "file" }, { - "bom-ref": "507d295989cc1f09", + "bom-ref": "16d09afe35e27b83", "name": "/usr/include/libxml2/libxml/xmlschemastypes.h", "type": "file" }, { - "bom-ref": "a147f093a43f2b9e", + "bom-ref": "1da9afbdf1652bdc", "name": "/usr/include/libxml2/libxml/xmlstring.h", "type": "file" }, { - "bom-ref": "6c12b072057dd8e9", + "bom-ref": "72b64fdfc8bf5dd3", "name": "/usr/include/libxml2/libxml/xmlunicode.h", "type": "file" }, { - "bom-ref": "2e773433cd3e29e9", + "bom-ref": "d31035dee0c0014b", "name": "/usr/include/libxml2/libxml/xmlversion.h", "type": "file" }, { - "bom-ref": "cf3c97a9d322cc23", + "bom-ref": "2bd2247ec6d2efe9", "name": "/usr/include/libxml2/libxml/xmlwriter.h", "type": "file" }, { - "bom-ref": "273c751124c99b6b", + "bom-ref": "15ca29559177d011", "name": "/usr/include/libxml2/libxml/xpath.h", "type": "file" }, { - "bom-ref": "35020c29b4a30fc4", + "bom-ref": "afd0db0405a6fe66", "name": "/usr/include/libxml2/libxml/xpathInternals.h", "type": "file" }, { - "bom-ref": "7db8be0e40d1defa", + "bom-ref": "71567ffef01824d4", "name": "/usr/include/libxml2/libxml/xpointer.h", "type": "file" }, { - "bom-ref": "7b1ca5771be0866a", + "bom-ref": "4519e24002a7ee24", "name": "/usr/include/limits.h", "type": "file" }, { - "bom-ref": "9d64da557e7f63c6", + "bom-ref": "1fd9952efc5fa9c8", "name": "/usr/include/link.h", "type": "file" }, { - "bom-ref": "3f41c7615390f4a4", + "bom-ref": "53aa1768f64bee93", "name": "/usr/include/linux/a.out.h", "type": "file" }, { - "bom-ref": "9bdc7d3efc24c184", + "bom-ref": "68be38111ae2334f", "name": "/usr/include/linux/acct.h", "type": "file" }, { - "bom-ref": "c65845fdbbb9bcef", + "bom-ref": "39f9327b4fb3114c", "name": "/usr/include/linux/acrn.h", "type": "file" }, { - "bom-ref": "4c20b2951678bee2", + "bom-ref": "28d3ecb067d9f7d5", "name": "/usr/include/linux/adb.h", "type": "file" }, { - "bom-ref": "9ff9ee7e547a5047", + "bom-ref": "3e920cad14fc3704", "name": "/usr/include/linux/adfs_fs.h", "type": "file" }, { - "bom-ref": "799391d9f73820b5", + "bom-ref": "58149703cd7cba26", "name": "/usr/include/linux/affs_hardblocks.h", "type": "file" }, { - "bom-ref": "339bde44226bf43f", + "bom-ref": "eadd7db0aab31a2c", "name": "/usr/include/linux/agpgart.h", "type": "file" }, { - "bom-ref": "92a07ebb84f9dfa5", + "bom-ref": "6e39afbd9142dd3e", "name": "/usr/include/linux/aio_abi.h", "type": "file" }, { - "bom-ref": "be3e6beee96b53b1", + "bom-ref": "3ba970f00b6b44ee", "name": "/usr/include/linux/am437x-vpfe.h", "type": "file" }, { - "bom-ref": "6b1ebccdd131ee44", + "bom-ref": "e6d586babf3bed43", "name": "/usr/include/linux/amt.h", "type": "file" }, { - "bom-ref": "8db35dc8d1300759", + "bom-ref": "c9046e11b4fd7a66", "name": "/usr/include/linux/android/binder.h", "type": "file" }, { - "bom-ref": "4ca17b0b31b3c929", + "bom-ref": "35f6583b0fbac1ea", "name": "/usr/include/linux/android/binderfs.h", "type": "file" }, { - "bom-ref": "47c1f3febd423b13", + "bom-ref": "4f47cc992125e75c", "name": "/usr/include/linux/apm_bios.h", "type": "file" }, { - "bom-ref": "02ff46ab56e7acbf", + "bom-ref": "e0ecfd76cf88c03c", "name": "/usr/include/linux/apparmor.h", "type": "file" }, { - "bom-ref": "ea39588796fe8f1d", + "bom-ref": "775f952a8f981272", "name": "/usr/include/linux/arcfb.h", "type": "file" }, { - "bom-ref": "3871bf61753c14e0", + "bom-ref": "cb7140fd5006c673", "name": "/usr/include/linux/arm_sdei.h", "type": "file" }, { - "bom-ref": "70d1d870f1268e1c", + "bom-ref": "1d55746f26ceb2bb", "name": "/usr/include/linux/aspeed-lpc-ctrl.h", "type": "file" }, { - "bom-ref": "33acea149324ac53", + "bom-ref": "91745a7efda3bed0", "name": "/usr/include/linux/aspeed-p2a-ctrl.h", "type": "file" }, { - "bom-ref": "62cb96e574c36395", + "bom-ref": "1d4155ba123b4242", "name": "/usr/include/linux/aspeed-video.h", "type": "file" }, { - "bom-ref": "48577eec90f508ed", + "bom-ref": "8142505766a62f3a", "name": "/usr/include/linux/atalk.h", "type": "file" }, { - "bom-ref": "fe26c46b695fc3e1", + "bom-ref": "28d05d6c8cd73fb2", "name": "/usr/include/linux/atm.h", "type": "file" }, { - "bom-ref": "1c0fd0c8d5247c43", + "bom-ref": "734c5aede0fdace8", "name": "/usr/include/linux/atm_eni.h", "type": "file" }, { - "bom-ref": "e803ea0a8ab54728", + "bom-ref": "4f7424936d978a07", "name": "/usr/include/linux/atm_he.h", "type": "file" }, { - "bom-ref": "9390ebedf261da9d", + "bom-ref": "ba716104740e1dea", "name": "/usr/include/linux/atm_idt77105.h", "type": "file" }, { - "bom-ref": "179617e463709dd7", + "bom-ref": "78c4c8c5d2245c50", "name": "/usr/include/linux/atm_nicstar.h", "type": "file" }, { - "bom-ref": "af1e42f9c20e24bd", + "bom-ref": "558edd4863d1d49e", "name": "/usr/include/linux/atm_tcp.h", "type": "file" }, { - "bom-ref": "8a230e0b73a54387", + "bom-ref": "ac23e3bfdcd2eb88", "name": "/usr/include/linux/atm_zatm.h", "type": "file" }, { - "bom-ref": "d02c2aa32396155c", + "bom-ref": "40b3051777b60b43", "name": "/usr/include/linux/atmapi.h", "type": "file" }, { - "bom-ref": "160df4f39c0e89f8", + "bom-ref": "777114babc9b3beb", "name": "/usr/include/linux/atmarp.h", "type": "file" }, { - "bom-ref": "3a2b6a9dea5b89c3", + "bom-ref": "bd093ba2a86dd914", "name": "/usr/include/linux/atmbr2684.h", "type": "file" }, { - "bom-ref": "cdfc799505299dad", + "bom-ref": "9262f1428d585fb2", "name": "/usr/include/linux/atmclip.h", "type": "file" }, { - "bom-ref": "2e5e035e392bef37", + "bom-ref": "adab5e4815330ed4", "name": "/usr/include/linux/atmdev.h", "type": "file" }, { - "bom-ref": "e3508f98cf530642", + "bom-ref": "d36c8063e7fe7aad", "name": "/usr/include/linux/atmioc.h", "type": "file" }, { - "bom-ref": "34a19a48f8061bff", + "bom-ref": "00f264006566a9f4", "name": "/usr/include/linux/atmlec.h", "type": "file" }, { - "bom-ref": "33cf272321008aff", + "bom-ref": "b497d6ce165ee578", "name": "/usr/include/linux/atmmpc.h", "type": "file" }, { - "bom-ref": "c0762feb20a59242", + "bom-ref": "fc0a22dbb70eb941", "name": "/usr/include/linux/atmppp.h", "type": "file" }, { - "bom-ref": "7dba46e4d027caad", + "bom-ref": "3dfedcec8def2216", "name": "/usr/include/linux/atmsap.h", "type": "file" }, { - "bom-ref": "995a19cebf2baac9", + "bom-ref": "e0eb07ee1c963a76", "name": "/usr/include/linux/atmsvc.h", "type": "file" }, { - "bom-ref": "accf908a8f88369b", + "bom-ref": "14f001a7a52d29d0", "name": "/usr/include/linux/audit.h", "type": "file" }, { - "bom-ref": "3b98c49dab22bef7", + "bom-ref": "36b1dae4576db500", "name": "/usr/include/linux/auto_dev-ioctl.h", "type": "file" }, { - "bom-ref": "c788e9a1fa1a4e0a", + "bom-ref": "34389a1ac4736f31", "name": "/usr/include/linux/auto_fs.h", "type": "file" }, { - "bom-ref": "113cee245292eff6", + "bom-ref": "10383b3c917b4085", "name": "/usr/include/linux/auto_fs4.h", "type": "file" }, { - "bom-ref": "b73878fe0009a4fe", + "bom-ref": "f69f0e21ec9bf7c9", "name": "/usr/include/linux/auxvec.h", "type": "file" }, { - "bom-ref": "2ace902f1558c3bb", + "bom-ref": "bd5af4339a322888", "name": "/usr/include/linux/ax25.h", "type": "file" }, { - "bom-ref": "a82ae8c02fa530e6", + "bom-ref": "0915e0e1bd8b8035", "name": "/usr/include/linux/batadv_packet.h", "type": "file" }, { - "bom-ref": "4a5f733b15455bd0", + "bom-ref": "2d3be1216a54bffb", "name": "/usr/include/linux/batman_adv.h", "type": "file" }, { - "bom-ref": "c880f517af3f03b5", + "bom-ref": "29b24d107b236846", "name": "/usr/include/linux/baycom.h", "type": "file" }, { - "bom-ref": "0dd1b1b036ede494", + "bom-ref": "d20cdbe2c5b92ef3", "name": "/usr/include/linux/bcm933xx_hcs.h", "type": "file" }, { - "bom-ref": "080aa7cf39181bea", + "bom-ref": "72559f77bcdfefb9", "name": "/usr/include/linux/bfs_fs.h", "type": "file" }, { - "bom-ref": "c0951e24030285b3", + "bom-ref": "5648d031306686f0", "name": "/usr/include/linux/binfmts.h", "type": "file" }, { - "bom-ref": "04748a51b0e2a820", + "bom-ref": "7081a3bba9217abf", "name": "/usr/include/linux/blkpg.h", "type": "file" }, { - "bom-ref": "418d089f1d10c3a9", + "bom-ref": "5f32c8c67f569686", "name": "/usr/include/linux/blktrace_api.h", "type": "file" }, { - "bom-ref": "cfbc0ef5fcc2d2bf", + "bom-ref": "2bafd52c81c093a4", "name": "/usr/include/linux/blkzoned.h", "type": "file" }, { - "bom-ref": "1cff7d2f2f0f7479", + "bom-ref": "cb45eb688be3f296", "name": "/usr/include/linux/bpf.h", "type": "file" }, { - "bom-ref": "61a63c15b9376c11", + "bom-ref": "b168e46b05c18eb2", "name": "/usr/include/linux/bpf_common.h", "type": "file" }, { - "bom-ref": "6a667fb5ef87a613", + "bom-ref": "05a0ccc56a33f110", "name": "/usr/include/linux/bpf_perf_event.h", "type": "file" }, { - "bom-ref": "809731722b6a36e1", + "bom-ref": "b3d59c9b73e19e92", "name": "/usr/include/linux/bpqether.h", "type": "file" }, { - "bom-ref": "a84e2b63e0e88775", + "bom-ref": "3c1da780288322ba", "name": "/usr/include/linux/bsg.h", "type": "file" }, { - "bom-ref": "ae28dbedc1e158cf", + "bom-ref": "b4d2afabadb3ba3c", "name": "/usr/include/linux/bt-bmc.h", "type": "file" }, { - "bom-ref": "37e1592bda58fe09", + "bom-ref": "d0e3059bedab056e", "name": "/usr/include/linux/btf.h", "type": "file" }, { - "bom-ref": "831b87823266c018", + "bom-ref": "2ae40090f94198e7", "name": "/usr/include/linux/btrfs.h", "type": "file" }, { - "bom-ref": "eb5dc233c04c713f", + "bom-ref": "7c6c7a66ab8998f4", "name": "/usr/include/linux/btrfs_tree.h", "type": "file" }, { - "bom-ref": "e49f1391e6ee63ef", + "bom-ref": "6970cd267b0735fc", "name": "/usr/include/linux/byteorder/big_endian.h", "type": "file" }, { - "bom-ref": "37223426dfa70fbe", + "bom-ref": "1df5501a513cf579", "name": "/usr/include/linux/byteorder/little_endian.h", "type": "file" }, { - "bom-ref": "f57383f5efa718f7", + "bom-ref": "7272babd2a71c644", "name": "/usr/include/linux/cachefiles.h", "type": "file" }, { - "bom-ref": "e129bc76f18bc806", + "bom-ref": "58c994e32de3cf35", "name": "/usr/include/linux/caif/caif_socket.h", "type": "file" }, { - "bom-ref": "fcc9f948e5fa370e", + "bom-ref": "b7ede4fb5bd26ad1", "name": "/usr/include/linux/caif/if_caif.h", "type": "file" }, { - "bom-ref": "9f28762b4f55f936", + "bom-ref": "25a0ad712609014d", "name": "/usr/include/linux/can.h", "type": "file" }, { - "bom-ref": "490e1760d464fd50", + "bom-ref": "18da872ab32c4c33", "name": "/usr/include/linux/can/bcm.h", "type": "file" }, { - "bom-ref": "015cee0cb989acde", + "bom-ref": "66f7a2b88f8b4639", "name": "/usr/include/linux/can/error.h", "type": "file" }, { - "bom-ref": "9f2fbcdbb357122a", + "bom-ref": "15b0c969ab916ba5", "name": "/usr/include/linux/can/gw.h", "type": "file" }, { - "bom-ref": "7c3069ed1d7ee397", + "bom-ref": "1ec5eb6e078cf6c0", "name": "/usr/include/linux/can/isotp.h", "type": "file" }, { - "bom-ref": "858a4648148aa8cf", + "bom-ref": "43659be66fba8ad4", "name": "/usr/include/linux/can/j1939.h", "type": "file" }, { - "bom-ref": "e6a530e4ff4f5f14", + "bom-ref": "e19daf778e669e6b", "name": "/usr/include/linux/can/netlink.h", "type": "file" }, { - "bom-ref": "67559277cde236bd", + "bom-ref": "ea27b81c3634c926", "name": "/usr/include/linux/can/raw.h", "type": "file" }, { - "bom-ref": "5776e7ac4ba7b6ab", + "bom-ref": "cfe4b384caaf1eb4", "name": "/usr/include/linux/can/vxcan.h", "type": "file" }, { - "bom-ref": "f4edd2fc0e193b7e", + "bom-ref": "c1ba6da0e89ab9e1", "name": "/usr/include/linux/capability.h", "type": "file" }, { - "bom-ref": "bc44eda0e9c0aacd", + "bom-ref": "5b05f723e88f2582", "name": "/usr/include/linux/capi.h", "type": "file" }, { - "bom-ref": "63799254ec5eb55d", + "bom-ref": "a80be50223b234d6", "name": "/usr/include/linux/cciss_defs.h", "type": "file" }, { - "bom-ref": "d74c0142b91b3ef0", + "bom-ref": "f87776a031ee051b", "name": "/usr/include/linux/cciss_ioctl.h", "type": "file" }, { - "bom-ref": "c3d290931f91b2e8", + "bom-ref": "23bd9b15d7c37a1b", "name": "/usr/include/linux/ccs.h", "type": "file" }, { - "bom-ref": "9af1c526a3142e14", + "bom-ref": "ce013b09555b491f", "name": "/usr/include/linux/cdrom.h", "type": "file" }, { - "bom-ref": "c48d2b8ccdcf2d16", + "bom-ref": "666a34365e46adc9", "name": "/usr/include/linux/cec-funcs.h", "type": "file" }, { - "bom-ref": "4e74a81868692048", + "bom-ref": "d1aceb96ac895d17", "name": "/usr/include/linux/cec.h", "type": "file" }, { - "bom-ref": "74b5e43046b65f81", + "bom-ref": "fcada98061c170e2", "name": "/usr/include/linux/cfm_bridge.h", "type": "file" }, { - "bom-ref": "b6c4c0e6ac8a77d5", + "bom-ref": "38e941881cb760b2", "name": "/usr/include/linux/cgroupstats.h", "type": "file" }, { - "bom-ref": "7bed4c99c46e629e", + "bom-ref": "cb08eb4db1a51a95", "name": "/usr/include/linux/chio.h", "type": "file" }, { - "bom-ref": "c2f0f57599d210c9", + "bom-ref": "0b35e40637f9ca5e", "name": "/usr/include/linux/cifs/cifs_mount.h", "type": "file" }, { - "bom-ref": "c8fa4fb57ead90e3", + "bom-ref": "b8cb0c2ce82efe5c", "name": "/usr/include/linux/cifs/cifs_netlink.h", "type": "file" }, { - "bom-ref": "b4be122a84e3e4af", + "bom-ref": "da26fb5eda44843c", "name": "/usr/include/linux/close_range.h", "type": "file" }, { - "bom-ref": "5fc94e5f4d230c44", + "bom-ref": "a21a80f8d6353693", "name": "/usr/include/linux/cn_proc.h", "type": "file" }, { - "bom-ref": "516d110306d73c2f", + "bom-ref": "c9a0f00f1547a8dc", "name": "/usr/include/linux/coda.h", "type": "file" }, { - "bom-ref": "fbe0d3c9433e669a", + "bom-ref": "52b4dee1f7693e2d", "name": "/usr/include/linux/coff.h", "type": "file" }, { - "bom-ref": "f5023dc8496682a3", + "bom-ref": "52e94af8b4421a3c", "name": "/usr/include/linux/comedi.h", "type": "file" }, { - "bom-ref": "8fa79bcb4cf31c13", + "bom-ref": "0fba629cbeb8c5cc", "name": "/usr/include/linux/connector.h", "type": "file" }, { - "bom-ref": "cd266d77c0e12425", + "bom-ref": "7604c382cab25a92", "name": "/usr/include/linux/const.h", "type": "file" }, { - "bom-ref": "71497e87430a17ea", + "bom-ref": "f777ddba0bd25ec9", "name": "/usr/include/linux/coresight-stm.h", "type": "file" }, { - "bom-ref": "316f4a425d0e9687", + "bom-ref": "8fb1a1b78d7443fc", "name": "/usr/include/linux/counter.h", "type": "file" }, { - "bom-ref": "124443b7842fc77d", + "bom-ref": "028dc61937c8fe22", "name": "/usr/include/linux/cramfs_fs.h", "type": "file" }, { - "bom-ref": "7224755f7d5a14c4", + "bom-ref": "4724e60fa9bdd66f", "name": "/usr/include/linux/cryptouser.h", "type": "file" }, { - "bom-ref": "1193cfa26814d0c2", + "bom-ref": "98c13845df42b339", "name": "/usr/include/linux/cuda.h", "type": "file" }, { - "bom-ref": "c116f9e54f27544f", + "bom-ref": "2a584d784c510ed8", "name": "/usr/include/linux/cxl_mem.h", "type": "file" }, { - "bom-ref": "c9ccb52625f08f07", + "bom-ref": "b4ac5c94fdd5fcec", "name": "/usr/include/linux/cyclades.h", "type": "file" }, { - "bom-ref": "5691249e4c77a737", + "bom-ref": "2ba6b2b8f3dbd1a8", "name": "/usr/include/linux/cycx_cfm.h", "type": "file" }, { - "bom-ref": "46016051a57c6e62", + "bom-ref": "2d7a088cd02d7fad", "name": "/usr/include/linux/dcbnl.h", "type": "file" }, { - "bom-ref": "0ef090c6b6efc4e6", + "bom-ref": "61a54804757a89e5", "name": "/usr/include/linux/dccp.h", "type": "file" }, { - "bom-ref": "f4b03a90f56788f9", + "bom-ref": "4575482b542c5de2", "name": "/usr/include/linux/devlink.h", "type": "file" }, { - "bom-ref": "7c9cd5fa9b4f428d", + "bom-ref": "5d6ed14405837402", "name": "/usr/include/linux/dlm.h", "type": "file" }, { - "bom-ref": "891f185c91a6edfc", + "bom-ref": "08b45016e07b7c6f", "name": "/usr/include/linux/dlm_device.h", "type": "file" }, { - "bom-ref": "f663c406ed7c8f9a", + "bom-ref": "cd54b71cfe1ffb01", "name": "/usr/include/linux/dlm_plock.h", "type": "file" }, { - "bom-ref": "81b8a839ca90fd4d", + "bom-ref": "cb7fa68ed4cbf4fa", "name": "/usr/include/linux/dlmconstants.h", "type": "file" }, { - "bom-ref": "eba09da986632b6b", + "bom-ref": "05bb55fb9aab5bc4", "name": "/usr/include/linux/dm-ioctl.h", "type": "file" }, { - "bom-ref": "9c9768301ed6b15a", + "bom-ref": "49ceee3d48dc47a9", "name": "/usr/include/linux/dm-log-userspace.h", "type": "file" }, { - "bom-ref": "54365f1de0ac6afd", + "bom-ref": "2a3d1cdf94aa5b3a", "name": "/usr/include/linux/dma-buf.h", "type": "file" }, { - "bom-ref": "97b62aedfeaec8cb", + "bom-ref": "c02d84474df542b8", "name": "/usr/include/linux/dma-heap.h", "type": "file" }, { - "bom-ref": "aecd1807ac3566b8", + "bom-ref": "b545b4f64fa3d8bf", "name": "/usr/include/linux/dns_resolver.h", "type": "file" }, { - "bom-ref": "a914d164b8173e84", + "bom-ref": "e3dfe7e9adf66847", "name": "/usr/include/linux/dpll.h", "type": "file" }, { - "bom-ref": "25237bfd8bb71f88", + "bom-ref": "d761a76870c79f8f", "name": "/usr/include/linux/dqblk_xfs.h", "type": "file" }, { - "bom-ref": "7c0cffc2aab4ed7b", + "bom-ref": "d18e49a979322cc0", "name": "/usr/include/linux/dvb/audio.h", "type": "file" }, { - "bom-ref": "eeba9927694d5401", + "bom-ref": "1d631ec5bd6c269a", "name": "/usr/include/linux/dvb/ca.h", "type": "file" }, { - "bom-ref": "be4482f8ebf2d0b2", + "bom-ref": "d6e2a09d9433a271", "name": "/usr/include/linux/dvb/dmx.h", "type": "file" }, { - "bom-ref": "2d0734cd9b1fd33a", + "bom-ref": "1c4f71df5ff36ba5", "name": "/usr/include/linux/dvb/frontend.h", "type": "file" }, { - "bom-ref": "e8c80f69d183528e", + "bom-ref": "e63d45b5af5bc7f5", "name": "/usr/include/linux/dvb/net.h", "type": "file" }, { - "bom-ref": "b42fe60494375ab1", + "bom-ref": "457b9c1293090e8e", "name": "/usr/include/linux/dvb/osd.h", "type": "file" }, { - "bom-ref": "ef6a25c19d609fe8", + "bom-ref": "ba941ea714214f1b", "name": "/usr/include/linux/dvb/version.h", "type": "file" }, { - "bom-ref": "9c02e839f7f18b32", + "bom-ref": "7070d65a02467249", "name": "/usr/include/linux/dvb/video.h", "type": "file" }, { - "bom-ref": "987e2a3b0f10142c", + "bom-ref": "44a2f31b392b3963", "name": "/usr/include/linux/dw100.h", "type": "file" }, { - "bom-ref": "8b8c6d06c2a9fb93", + "bom-ref": "26d13caca2bd236c", "name": "/usr/include/linux/edd.h", "type": "file" }, { - "bom-ref": "df32f25db41e955c", + "bom-ref": "9384f5ca3810b29f", "name": "/usr/include/linux/efs_fs_sb.h", "type": "file" }, { - "bom-ref": "47d3b3ddada853ed", + "bom-ref": "7d7323a1c699c7a6", "name": "/usr/include/linux/elf-em.h", "type": "file" }, { - "bom-ref": "b51c6f6c86bd16c5", + "bom-ref": "da5d5e1f828e2c06", "name": "/usr/include/linux/elf-fdpic.h", "type": "file" }, { - "bom-ref": "b52fb59fe6cf786d", + "bom-ref": "fda5380a23ee5d56", "name": "/usr/include/linux/elf.h", "type": "file" }, { - "bom-ref": "de013239f378a5e7", + "bom-ref": "fcd0457e1c1e6c30", "name": "/usr/include/linux/errno.h", "type": "file" }, { - "bom-ref": "e3fd9cfd1e92eb90", + "bom-ref": "104d1d53abc236d7", "name": "/usr/include/linux/errqueue.h", "type": "file" }, { - "bom-ref": "90d7658a1a6fc594", + "bom-ref": "1c01f615ca98662f", "name": "/usr/include/linux/erspan.h", "type": "file" }, { - "bom-ref": "ff7002f0cd44a2ce", + "bom-ref": "459ba8beb403f029", "name": "/usr/include/linux/ethtool.h", "type": "file" }, { - "bom-ref": "cb3c32aabd7909b1", + "bom-ref": "8799f005c05e31fe", "name": "/usr/include/linux/ethtool_netlink.h", "type": "file" }, { - "bom-ref": "6fb4bc498f5b3a4c", + "bom-ref": "5df32b85c6e4a9d3", "name": "/usr/include/linux/eventfd.h", "type": "file" }, { - "bom-ref": "b414d312f10a4e25", + "bom-ref": "d04979a8607d132e", "name": "/usr/include/linux/eventpoll.h", "type": "file" }, { - "bom-ref": "f28682664d65b9eb", + "bom-ref": "23978218300de4d0", "name": "/usr/include/linux/ext4.h", "type": "file" }, { - "bom-ref": "6edcd3b9956327b1", + "bom-ref": "69d81bc43d693722", "name": "/usr/include/linux/f2fs.h", "type": "file" }, { - "bom-ref": "3bd01775357b7f79", + "bom-ref": "529befeac160dc4e", "name": "/usr/include/linux/fadvise.h", "type": "file" }, { - "bom-ref": "c14b896abc317fd3", + "bom-ref": "af4e2847d2efb6cc", "name": "/usr/include/linux/falloc.h", "type": "file" }, { - "bom-ref": "ae959bc9f4f48400", + "bom-ref": "cd79411b97df44ff", "name": "/usr/include/linux/fanotify.h", "type": "file" }, { - "bom-ref": "82e9d9047cff50ee", + "bom-ref": "1cbae79f26a1a235", "name": "/usr/include/linux/fb.h", "type": "file" }, { - "bom-ref": "bfe06b307de567e1", + "bom-ref": "136709655f8c9f8a", "name": "/usr/include/linux/fcntl.h", "type": "file" }, { - "bom-ref": "5c569c2dd129a290", + "bom-ref": "15a35870562a0a2f", "name": "/usr/include/linux/fd.h", "type": "file" }, { - "bom-ref": "034135cac6496e36", + "bom-ref": "79cfe9dbeaf5e6c1", "name": "/usr/include/linux/fdreg.h", "type": "file" }, { - "bom-ref": "6a35bfd6648dd09e", + "bom-ref": "fc4aae04bb5f0dc1", "name": "/usr/include/linux/fib_rules.h", "type": "file" }, { - "bom-ref": "130cb20122c9b602", + "bom-ref": "34d7851658e8dca5", "name": "/usr/include/linux/fiemap.h", "type": "file" }, { - "bom-ref": "c132feedbfe14c3c", + "bom-ref": "1d48d16b4e2a7b63", "name": "/usr/include/linux/filter.h", "type": "file" }, { - "bom-ref": "69823c06b9fda796", + "bom-ref": "43120b7fe56b929d", "name": "/usr/include/linux/firewire-cdev.h", "type": "file" }, { - "bom-ref": "383afb5860ab4223", + "bom-ref": "ff276d81ea122c98", "name": "/usr/include/linux/firewire-constants.h", "type": "file" }, { - "bom-ref": "98c89ba01b3ea83f", + "bom-ref": "044e81e89eee0940", "name": "/usr/include/linux/fou.h", "type": "file" }, { - "bom-ref": "3c2403d33e7bb121", + "bom-ref": "36a9090bd8564042", "name": "/usr/include/linux/fpga-dfl.h", "type": "file" }, { - "bom-ref": "80f6775947bf8e23", + "bom-ref": "a96a7dc473841c18", "name": "/usr/include/linux/fs.h", "type": "file" }, { - "bom-ref": "5917e810a4ec1df2", + "bom-ref": "7b95a66a03e4a759", "name": "/usr/include/linux/fscrypt.h", "type": "file" }, { - "bom-ref": "dc56050a347b0e6a", + "bom-ref": "1b89b05b0eab389d", "name": "/usr/include/linux/fsi.h", "type": "file" }, { - "bom-ref": "f92c07e4724abef4", + "bom-ref": "32e2efde473ea587", "name": "/usr/include/linux/fsl_hypervisor.h", "type": "file" }, { - "bom-ref": "0c539e96ebc26a5f", + "bom-ref": "a27b37ed34eeda08", "name": "/usr/include/linux/fsl_mc.h", "type": "file" }, { - "bom-ref": "b91f847a2bcf9038", + "bom-ref": "53bb29a11152e6fb", "name": "/usr/include/linux/fsmap.h", "type": "file" }, { - "bom-ref": "9a077bdbb54f0365", + "bom-ref": "4640aac53a86ff86", "name": "/usr/include/linux/fsverity.h", "type": "file" }, { - "bom-ref": "7dcf004d0958c865", + "bom-ref": "dee7dff081e7e952", "name": "/usr/include/linux/fuse.h", "type": "file" }, { - "bom-ref": "eb9dc7634ac0b757", + "bom-ref": "a93cb96e70872874", "name": "/usr/include/linux/futex.h", "type": "file" }, { - "bom-ref": "771a4b08bfe24f29", + "bom-ref": "951db21eb01f1f96", "name": "/usr/include/linux/gameport.h", "type": "file" }, { - "bom-ref": "2b3d9a7fe0fc9702", + "bom-ref": "041df54bf4b1e2ad", "name": "/usr/include/linux/gen_stats.h", "type": "file" }, { - "bom-ref": "f9d847762cc475ab", + "bom-ref": "79354d7e2e75ee34", "name": "/usr/include/linux/genetlink.h", "type": "file" }, { - "bom-ref": "58e682fed31f4ebf", + "bom-ref": "200ddfb8e50ebb00", "name": "/usr/include/linux/genwqe/genwqe_card.h", "type": "file" }, { - "bom-ref": "ae204b0e52641db1", + "bom-ref": "ba7b859394a13b0a", "name": "/usr/include/linux/gfs2_ondisk.h", "type": "file" }, { - "bom-ref": "d7b817bc71c425ba", + "bom-ref": "2e83b460d936b7a9", "name": "/usr/include/linux/gpio.h", "type": "file" }, { - "bom-ref": "52689e9b19d856a0", + "bom-ref": "06829fea96e028b3", "name": "/usr/include/linux/gsmmux.h", "type": "file" }, { - "bom-ref": "24ed632dd0103c1d", + "bom-ref": "4afbdf362ce5cfaa", "name": "/usr/include/linux/gtp.h", "type": "file" }, { - "bom-ref": "03424d832a61f07a", + "bom-ref": "79db11746fd245e9", "name": "/usr/include/linux/handshake.h", "type": "file" }, { - "bom-ref": "f3a6e610a1d81f0d", + "bom-ref": "054c31faa0f4ab8a", "name": "/usr/include/linux/hash_info.h", "type": "file" }, { - "bom-ref": "81b9725fdc00bb87", + "bom-ref": "21d7cddff71e2db4", "name": "/usr/include/linux/hdlc.h", "type": "file" }, { - "bom-ref": "5d9a6b2747492f5f", + "bom-ref": "ebed85fdf1124150", "name": "/usr/include/linux/hdlc/ioctl.h", "type": "file" }, { - "bom-ref": "4ba2c8f14234d31b", + "bom-ref": "9e5f0c3d41eb4cf4", "name": "/usr/include/linux/hdlcdrv.h", "type": "file" }, { - "bom-ref": "b623ca527b7535a1", + "bom-ref": "a474bdf7e7f737b2", "name": "/usr/include/linux/hdreg.h", "type": "file" }, { - "bom-ref": "807689d823323629", + "bom-ref": "6a959fabde399662", "name": "/usr/include/linux/hid.h", "type": "file" }, { - "bom-ref": "3bb309a825a48acf", + "bom-ref": "5e67bb5a83418ea8", "name": "/usr/include/linux/hiddev.h", "type": "file" }, { - "bom-ref": "5f76149d7d17b82e", + "bom-ref": "430d7090f5bb0e59", "name": "/usr/include/linux/hidraw.h", "type": "file" }, { - "bom-ref": "51fe6a9fb72493fb", + "bom-ref": "4234307b7ee692c4", "name": "/usr/include/linux/hpet.h", "type": "file" }, { - "bom-ref": "835410914d104bdc", + "bom-ref": "fc349dc9a92db3ab", "name": "/usr/include/linux/hsi/cs-protocol.h", "type": "file" }, { - "bom-ref": "866a2e9d62c1420b", + "bom-ref": "f69f7ef9a393b534", "name": "/usr/include/linux/hsi/hsi_char.h", "type": "file" }, { - "bom-ref": "eef21ec6b4168f73", + "bom-ref": "91d726386054d4d0", "name": "/usr/include/linux/hsr_netlink.h", "type": "file" }, { - "bom-ref": "56273f1286844323", + "bom-ref": "29a3cb137c564d60", "name": "/usr/include/linux/hw_breakpoint.h", "type": "file" }, { - "bom-ref": "9b1d5946c7a9e138", + "bom-ref": "d992523d027ea90f", "name": "/usr/include/linux/hyperv.h", "type": "file" }, { - "bom-ref": "f500f902a84183f7", + "bom-ref": "92bb3ffbe167f798", "name": "/usr/include/linux/i2c-dev.h", "type": "file" }, { - "bom-ref": "879418041f25240a", + "bom-ref": "19bb6d5972859261", "name": "/usr/include/linux/i2c.h", "type": "file" }, { - "bom-ref": "194d3f31d3a136a0", + "bom-ref": "cc2c40cf03a14b97", "name": "/usr/include/linux/i2o-dev.h", "type": "file" }, { - "bom-ref": "2f9dde37aeaffd71", + "bom-ref": "bd0174e7a4903ca6", "name": "/usr/include/linux/i8k.h", "type": "file" }, { - "bom-ref": "8bb7d28e10b9119b", + "bom-ref": "b6f7f8b630f8fe4c", "name": "/usr/include/linux/icmp.h", "type": "file" }, { - "bom-ref": "49afa2c3d38c24e9", + "bom-ref": "e3e766a13100f67a", "name": "/usr/include/linux/icmpv6.h", "type": "file" }, { - "bom-ref": "225aa9d07ac410c3", + "bom-ref": "319fa4c5b29c0794", "name": "/usr/include/linux/idxd.h", "type": "file" }, { - "bom-ref": "c1270196cd64f020", + "bom-ref": "c01d0e8014f88753", "name": "/usr/include/linux/if.h", "type": "file" }, { - "bom-ref": "b99301b14f907b76", + "bom-ref": "0f6978cf820a7495", "name": "/usr/include/linux/if_addr.h", "type": "file" }, { - "bom-ref": "e752729d1c9fb370", + "bom-ref": "04afb606fb416a4f", "name": "/usr/include/linux/if_addrlabel.h", "type": "file" }, { - "bom-ref": "16cea69cea3168bc", + "bom-ref": "f2f408b8679c8b93", "name": "/usr/include/linux/if_alg.h", "type": "file" }, { - "bom-ref": "f428b3bd26e97d87", + "bom-ref": "29a049010bfe3fb8", "name": "/usr/include/linux/if_arcnet.h", "type": "file" }, { - "bom-ref": "e821fc1e30c3c0db", + "bom-ref": "ba8958620539c76c", "name": "/usr/include/linux/if_arp.h", "type": "file" }, { - "bom-ref": "334396cbef083ec8", + "bom-ref": "f82f908f74c6fef7", "name": "/usr/include/linux/if_bonding.h", "type": "file" }, { - "bom-ref": "d87d2a6e8e9bd3b5", + "bom-ref": "3e49507622c1cda6", "name": "/usr/include/linux/if_bridge.h", "type": "file" }, { - "bom-ref": "ec85dda0b1406aa7", + "bom-ref": "4effed9d367f0ce4", "name": "/usr/include/linux/if_cablemodem.h", "type": "file" }, { - "bom-ref": "27c2407601b2522d", + "bom-ref": "071d3fb6b3d87ca2", "name": "/usr/include/linux/if_eql.h", "type": "file" }, { - "bom-ref": "af628c4d177eebe0", + "bom-ref": "841979f4bfd79663", "name": "/usr/include/linux/if_ether.h", "type": "file" }, { - "bom-ref": "ddbf1a74f273b180", + "bom-ref": "e9c89cecea14f817", "name": "/usr/include/linux/if_fc.h", "type": "file" }, { - "bom-ref": "753d435a50714d11", + "bom-ref": "96c7d52092156c96", "name": "/usr/include/linux/if_fddi.h", "type": "file" }, { - "bom-ref": "3aafd0447bfc8415", + "bom-ref": "5af4d7502e84309e", "name": "/usr/include/linux/if_hippi.h", "type": "file" }, { - "bom-ref": "6448c7b5fba5eb67", + "bom-ref": "f34d9e9b80fe5b4c", "name": "/usr/include/linux/if_infiniband.h", "type": "file" }, { - "bom-ref": "76893ade36ceba24", + "bom-ref": "21eb3c59a20a5d9f", "name": "/usr/include/linux/if_link.h", "type": "file" }, { - "bom-ref": "0825da24ab9079d9", + "bom-ref": "81fe3c9fc120b73e", "name": "/usr/include/linux/if_ltalk.h", "type": "file" }, { - "bom-ref": "7ebbeb1710bffcd8", + "bom-ref": "5bdb8dfb1a5c468b", "name": "/usr/include/linux/if_macsec.h", "type": "file" }, { - "bom-ref": "96510bac7d36f3e3", + "bom-ref": "4994cb61962cc1e8", "name": "/usr/include/linux/if_packet.h", "type": "file" }, { - "bom-ref": "6628e96b8a091953", + "bom-ref": "e08207ee88f03aa8", "name": "/usr/include/linux/if_phonet.h", "type": "file" }, { - "bom-ref": "803c74a37e664592", + "bom-ref": "504baa36c0a77fb9", "name": "/usr/include/linux/if_plip.h", "type": "file" }, { - "bom-ref": "a1573f575772adbb", + "bom-ref": "c90f3e73c7b6b680", "name": "/usr/include/linux/if_ppp.h", "type": "file" }, { - "bom-ref": "256c6f01fa36f78f", + "bom-ref": "1fe432bbf802f0d0", "name": "/usr/include/linux/if_pppol2tp.h", "type": "file" }, { - "bom-ref": "24f97dad3cfbc501", + "bom-ref": "c0493351ede324de", "name": "/usr/include/linux/if_pppox.h", "type": "file" }, { - "bom-ref": "b4310bfb2b15bd60", + "bom-ref": "0ecc12442ab6631b", "name": "/usr/include/linux/if_slip.h", "type": "file" }, { - "bom-ref": "6581da2d9a77c639", + "bom-ref": "432b4bbdc90f1a96", "name": "/usr/include/linux/if_team.h", "type": "file" }, { - "bom-ref": "841296a1a5d4c7df", + "bom-ref": "6df65573447fc0dc", "name": "/usr/include/linux/if_tun.h", "type": "file" }, { - "bom-ref": "fec6275a559b9c36", + "bom-ref": "f8dad787792fe421", "name": "/usr/include/linux/if_tunnel.h", "type": "file" }, { - "bom-ref": "a8f945fe1c31e9e5", + "bom-ref": "72ef91620fc168b6", "name": "/usr/include/linux/if_vlan.h", "type": "file" }, { - "bom-ref": "779531bf16f70f14", + "bom-ref": "5701cb9035a7659f", "name": "/usr/include/linux/if_x25.h", "type": "file" }, { - "bom-ref": "e3bc9c27e80f8201", + "bom-ref": "44c1ec5ec2b4f242", "name": "/usr/include/linux/if_xdp.h", "type": "file" }, { - "bom-ref": "e3305537152cbbc5", + "bom-ref": "05bc17a1de3aa78a", "name": "/usr/include/linux/ife.h", "type": "file" }, { - "bom-ref": "cc527668084f4dff", + "bom-ref": "7951ab8f4b893a54", "name": "/usr/include/linux/igmp.h", "type": "file" }, { - "bom-ref": "cf2fdd08ba77ddfb", + "bom-ref": "3c3222a6e4e9a080", "name": "/usr/include/linux/iio/buffer.h", "type": "file" }, { - "bom-ref": "46eed53f8fb98ca5", + "bom-ref": "bf5811e3bf865baa", "name": "/usr/include/linux/iio/events.h", "type": "file" }, { - "bom-ref": "8ad6cae8031e11a9", + "bom-ref": "def0ec0cc169f3a2", "name": "/usr/include/linux/iio/types.h", "type": "file" }, { - "bom-ref": "ee4529bb83abf6d4", + "bom-ref": "dc777b8e05fa9097", "name": "/usr/include/linux/ila.h", "type": "file" }, { - "bom-ref": "f7476da183ab04e9", + "bom-ref": "c582b1184bdd13ea", "name": "/usr/include/linux/in.h", "type": "file" }, { - "bom-ref": "599b491485219cd3", + "bom-ref": "66263fb2c02f06ac", "name": "/usr/include/linux/in6.h", "type": "file" }, { - "bom-ref": "ddcdd1439e04e0d7", + "bom-ref": "54f98948856c74a4", "name": "/usr/include/linux/in_route.h", "type": "file" }, { - "bom-ref": "099e71182df9cb60", + "bom-ref": "e580535342da8447", "name": "/usr/include/linux/inet_diag.h", "type": "file" }, { - "bom-ref": "fcf35ee9c6c3ad23", + "bom-ref": "d7d8288f36f51aec", "name": "/usr/include/linux/inotify.h", "type": "file" }, { - "bom-ref": "83fd5f41008eaba2", + "bom-ref": "a29386cc6c2e2619", "name": "/usr/include/linux/input-event-codes.h", "type": "file" }, { - "bom-ref": "6d1e38ad53c5acc5", + "bom-ref": "e76de6fdabb39cc2", "name": "/usr/include/linux/input.h", "type": "file" }, { - "bom-ref": "ee1353da83ca911d", + "bom-ref": "6c23a5140d64874a", "name": "/usr/include/linux/io_uring.h", "type": "file" }, { - "bom-ref": "f447e506a154c6fb", + "bom-ref": "b8fd33150a177d54", "name": "/usr/include/linux/ioam6.h", "type": "file" }, { - "bom-ref": "0a2bc478a2b447bf", + "bom-ref": "ddaacf7a08f86678", "name": "/usr/include/linux/ioam6_genl.h", "type": "file" }, { - "bom-ref": "e5c2dabadb702024", + "bom-ref": "891a170f1d7112bf", "name": "/usr/include/linux/ioam6_iptunnel.h", "type": "file" }, { - "bom-ref": "ff2da73804f89af2", + "bom-ref": "439d24b9866de529", "name": "/usr/include/linux/ioctl.h", "type": "file" }, { - "bom-ref": "505b20f1b2a78884", + "bom-ref": "73da6e9521e7e05f", "name": "/usr/include/linux/iommu.h", "type": "file" }, { - "bom-ref": "a25bb7c37004c970", + "bom-ref": "31d861007861d233", "name": "/usr/include/linux/iommufd.h", "type": "file" }, { - "bom-ref": "3fb2af4a52ebd918", + "bom-ref": "8511aad7031699a7", "name": "/usr/include/linux/ioprio.h", "type": "file" }, { - "bom-ref": "5faa53f06f6c75c4", + "bom-ref": "f12bf771fe8eb963", "name": "/usr/include/linux/ip.h", "type": "file" }, { - "bom-ref": "d10da97a93756c3f", + "bom-ref": "3eb77d0371250b74", "name": "/usr/include/linux/ip6_tunnel.h", "type": "file" }, { - "bom-ref": "09ac6806e99b2e6b", + "bom-ref": "d99c27417072aa50", "name": "/usr/include/linux/ip_vs.h", "type": "file" }, { - "bom-ref": "a653c86bda7ef47a", + "bom-ref": "b20b5e16d83c3935", "name": "/usr/include/linux/ipc.h", "type": "file" }, { - "bom-ref": "1b9fc486263b2acd", + "bom-ref": "586aee21e4ff06fa", "name": "/usr/include/linux/ipmi.h", "type": "file" }, { - "bom-ref": "e5b94e86b9b5a316", + "bom-ref": "b38549d2609562a9", "name": "/usr/include/linux/ipmi_bmc.h", "type": "file" }, { - "bom-ref": "c4b9166c6a6a48b8", + "bom-ref": "4d3c43827a45fe63", "name": "/usr/include/linux/ipmi_msgdefs.h", "type": "file" }, { - "bom-ref": "1055e75eca346667", + "bom-ref": "03fabf6e87bfe65c", "name": "/usr/include/linux/ipmi_ssif_bmc.h", "type": "file" }, { - "bom-ref": "9d3710dacab9e89c", + "bom-ref": "ed5bd3d4180a704b", "name": "/usr/include/linux/ipsec.h", "type": "file" }, { - "bom-ref": "5ffdd447efb7514e", + "bom-ref": "74bc73aee85ff815", "name": "/usr/include/linux/ipv6.h", "type": "file" }, { - "bom-ref": "186ee733ad36d93e", + "bom-ref": "26b833ef3d59bbe1", "name": "/usr/include/linux/ipv6_route.h", "type": "file" }, { - "bom-ref": "47e8cd96cec67c79", + "bom-ref": "8dcd70cfc0d3df12", "name": "/usr/include/linux/irqnr.h", "type": "file" }, { - "bom-ref": "49da5b171772aa82", + "bom-ref": "45a9ec904f472c71", "name": "/usr/include/linux/isdn/capicmd.h", "type": "file" }, { - "bom-ref": "9498e14dda54a937", + "bom-ref": "2321efd7c96e5b84", "name": "/usr/include/linux/iso_fs.h", "type": "file" }, { - "bom-ref": "1cc2f18e88162a15", + "bom-ref": "771b89aeaed0c326", "name": "/usr/include/linux/isst_if.h", "type": "file" }, { - "bom-ref": "9da8971f41a62cc7", + "bom-ref": "f897be60f847707c", "name": "/usr/include/linux/ivtv.h", "type": "file" }, { - "bom-ref": "aa53d6f9b160efe7", + "bom-ref": "82e2d7c578518e9c", "name": "/usr/include/linux/ivtvfb.h", "type": "file" }, { - "bom-ref": "4f13d5f3fb5c6236", + "bom-ref": "c766f102eea3e21d", "name": "/usr/include/linux/jffs2.h", "type": "file" }, { - "bom-ref": "86ce13fffee66408", + "bom-ref": "f82bf779e6549fbf", "name": "/usr/include/linux/joystick.h", "type": "file" }, { - "bom-ref": "a027ff5a7dd0ba4b", + "bom-ref": "31b3a57fbc7a77a4", "name": "/usr/include/linux/kcm.h", "type": "file" }, { - "bom-ref": "551b2b0724ced6b0", + "bom-ref": "cdd308ad8ff396eb", "name": "/usr/include/linux/kcmp.h", "type": "file" }, { - "bom-ref": "78b804bbcc4641fd", + "bom-ref": "bacd5afbf8294132", "name": "/usr/include/linux/kcov.h", "type": "file" }, { - "bom-ref": "00ebee07f0ffbf12", + "bom-ref": "c096b05e3dc5c305", "name": "/usr/include/linux/kd.h", "type": "file" }, { - "bom-ref": "a75330ab3f4bea91", + "bom-ref": "97c4437a2630100a", "name": "/usr/include/linux/kdev_t.h", "type": "file" }, { - "bom-ref": "e57b396f92755f2c", + "bom-ref": "a41187f16075acc7", "name": "/usr/include/linux/kernel-page-flags.h", "type": "file" }, { - "bom-ref": "efcd9fdcd92ebb11", + "bom-ref": "7430b7e1a2a5654a", "name": "/usr/include/linux/kernel.h", "type": "file" }, { - "bom-ref": "d340193bf6878261", + "bom-ref": "d27942a3080263ca", "name": "/usr/include/linux/kernelcapi.h", "type": "file" }, { - "bom-ref": "389d0421fee98bfd", + "bom-ref": "50b9d043ff229eca", "name": "/usr/include/linux/kexec.h", "type": "file" }, { - "bom-ref": "1ec6241c56dc60dc", + "bom-ref": "12d31362523a78e3", "name": "/usr/include/linux/keyboard.h", "type": "file" }, { - "bom-ref": "4a4a8ad209be15cb", + "bom-ref": "04fc1a73febe284c", "name": "/usr/include/linux/keyctl.h", "type": "file" }, { - "bom-ref": "086f5d7365cc4abb", + "bom-ref": "9743d7fffc7a1154", "name": "/usr/include/linux/kfd_ioctl.h", "type": "file" }, { - "bom-ref": "bd7065bd7b8627f9", + "bom-ref": "2fc8044de7e8487e", "name": "/usr/include/linux/kfd_sysfs.h", "type": "file" }, { - "bom-ref": "51f59b86defc8f76", + "bom-ref": "357f28a0b8681ad5", "name": "/usr/include/linux/kvm.h", "type": "file" }, { - "bom-ref": "406467da6cf3a480", + "bom-ref": "145e3fc0670db4cf", "name": "/usr/include/linux/kvm_para.h", "type": "file" }, { - "bom-ref": "51c8c8aa73daad48", + "bom-ref": "90d49bec138e758f", "name": "/usr/include/linux/l2tp.h", "type": "file" }, { - "bom-ref": "0fb767b9e7ff175d", + "bom-ref": "8e1c97865b649162", "name": "/usr/include/linux/landlock.h", "type": "file" }, { - "bom-ref": "b2c359a7ddd450f9", + "bom-ref": "e3bda5451ded7492", "name": "/usr/include/linux/libc-compat.h", "type": "file" }, { - "bom-ref": "8db17c44b007b8eb", + "bom-ref": "620bb74317cbc96c", "name": "/usr/include/linux/limits.h", "type": "file" }, { - "bom-ref": "66f65348e5bfae6a", + "bom-ref": "8f8f6b85985816ed", "name": "/usr/include/linux/lirc.h", "type": "file" }, { - "bom-ref": "0ed0884d9acbf288", + "bom-ref": "bd844efc10854cb7", "name": "/usr/include/linux/llc.h", "type": "file" }, { - "bom-ref": "201945666f0a7c5b", + "bom-ref": "0a4702e7f6984988", "name": "/usr/include/linux/loadpin.h", "type": "file" }, { - "bom-ref": "5cb257221b37ed60", + "bom-ref": "04c124f733851203", "name": "/usr/include/linux/loop.h", "type": "file" }, { - "bom-ref": "4e1b2803acdb2f15", + "bom-ref": "7b343f991ca0d7d2", "name": "/usr/include/linux/lp.h", "type": "file" }, { - "bom-ref": "a7cb6ad529ad11be", + "bom-ref": "6a67efccb438d385", "name": "/usr/include/linux/lsm.h", "type": "file" }, { - "bom-ref": "10d0812db10d3900", + "bom-ref": "ffa1954d17c5d373", "name": "/usr/include/linux/lwtunnel.h", "type": "file" }, { - "bom-ref": "9786688357f4c691", + "bom-ref": "d95953da5ca9bfb6", "name": "/usr/include/linux/magic.h", "type": "file" }, { - "bom-ref": "9e7eb989344067c9", + "bom-ref": "fd07a9793e812376", "name": "/usr/include/linux/major.h", "type": "file" }, { - "bom-ref": "8a2a6e5d68ea72f3", + "bom-ref": "6bc4d18751c28948", "name": "/usr/include/linux/map_to_14segment.h", "type": "file" }, { - "bom-ref": "534706991517219a", + "bom-ref": "2c3f9f7de8780e75", "name": "/usr/include/linux/map_to_7segment.h", "type": "file" }, { - "bom-ref": "e9aec9aa355e946a", + "bom-ref": "945f37045480fb91", "name": "/usr/include/linux/matroxfb.h", "type": "file" }, { - "bom-ref": "a90584539bb44738", + "bom-ref": "3518800b32af8823", "name": "/usr/include/linux/max2175.h", "type": "file" }, { - "bom-ref": "b210b1dd586ddfce", + "bom-ref": "698ac42274c33aa1", "name": "/usr/include/linux/mctp.h", "type": "file" }, { - "bom-ref": "1f86d79abafe6d85", + "bom-ref": "2015632b26f4d98a", "name": "/usr/include/linux/mdio.h", "type": "file" }, { - "bom-ref": "5a6ea785363eba57", + "bom-ref": "5071a41f8da52c84", "name": "/usr/include/linux/media-bus-format.h", "type": "file" }, { - "bom-ref": "4b7f1909c7673fb1", + "bom-ref": "e34b9dda3e36bed2", "name": "/usr/include/linux/media.h", "type": "file" }, { - "bom-ref": "05ca2795f6650ec6", + "bom-ref": "ebf7596855321525", "name": "/usr/include/linux/mei.h", "type": "file" }, { - "bom-ref": "36a17657b819da2c", + "bom-ref": "ffaddee6edbbe427", "name": "/usr/include/linux/mei_uuid.h", "type": "file" }, { - "bom-ref": "8f416d4148d74b74", + "bom-ref": "d147ca46e565e21b", "name": "/usr/include/linux/membarrier.h", "type": "file" }, { - "bom-ref": "becd81368507e644", + "bom-ref": "8df53e5eae569d23", "name": "/usr/include/linux/memfd.h", "type": "file" }, { - "bom-ref": "806ba8ad4004f975", + "bom-ref": "96f71ee65789f48a", "name": "/usr/include/linux/mempolicy.h", "type": "file" }, { - "bom-ref": "62e40a64a9ddaf28", + "bom-ref": "4bff0bede5ec8d23", "name": "/usr/include/linux/mii.h", "type": "file" }, { - "bom-ref": "c02649ff29feb5cc", + "bom-ref": "b64a563569841d6b", "name": "/usr/include/linux/minix_fs.h", "type": "file" }, { - "bom-ref": "0dc42891f752bf5a", + "bom-ref": "f4e05173b718ff59", "name": "/usr/include/linux/misc/bcm_vk.h", "type": "file" }, { - "bom-ref": "b018eabb9aef5409", + "bom-ref": "7cb62432bf992f62", "name": "/usr/include/linux/mman.h", "type": "file" }, { - "bom-ref": "96529ffb09ea73e1", + "bom-ref": "346af502a7fb4496", "name": "/usr/include/linux/mmc/ioctl.h", "type": "file" }, { - "bom-ref": "76e3667f66eddd79", + "bom-ref": "de0ec438c5adf55a", "name": "/usr/include/linux/mmtimer.h", "type": "file" }, { - "bom-ref": "d64aa557adc54ad9", + "bom-ref": "7a39ef7f5925d622", "name": "/usr/include/linux/module.h", "type": "file" }, { - "bom-ref": "46b113848d0513d4", + "bom-ref": "f9d0d1ee0a26001f", "name": "/usr/include/linux/mount.h", "type": "file" }, { - "bom-ref": "3518eff0ef131c5b", + "bom-ref": "d5adbe1c2ec77a08", "name": "/usr/include/linux/mpls.h", "type": "file" }, { - "bom-ref": "2eca9158e945ef2a", + "bom-ref": "1e67ad438948aa85", "name": "/usr/include/linux/mpls_iptunnel.h", "type": "file" }, { - "bom-ref": "d6ee55dc81c49a45", + "bom-ref": "c1e6694388a9602a", "name": "/usr/include/linux/mptcp.h", "type": "file" }, { - "bom-ref": "aebc11d1b20a8144", + "bom-ref": "ba80d7c4487280cb", "name": "/usr/include/linux/mptcp_pm.h", "type": "file" }, { - "bom-ref": "5f10d4814f368d57", + "bom-ref": "a81964e922c853f0", "name": "/usr/include/linux/mqueue.h", "type": "file" }, { - "bom-ref": "37b617b13236f785", + "bom-ref": "8447ac15ca503d22", "name": "/usr/include/linux/mroute.h", "type": "file" }, { - "bom-ref": "3a553ff4853827e0", + "bom-ref": "381e35487cc7a72b", "name": "/usr/include/linux/mroute6.h", "type": "file" }, { - "bom-ref": "acec7a3ee9196562", + "bom-ref": "73b39830a179bf45", "name": "/usr/include/linux/mrp_bridge.h", "type": "file" }, { - "bom-ref": "7ef2471c9644d0f8", + "bom-ref": "802c6644c2ddc3b3", "name": "/usr/include/linux/msdos_fs.h", "type": "file" }, { - "bom-ref": "638af544f1fbab59", + "bom-ref": "5941f824ce73c856", "name": "/usr/include/linux/msg.h", "type": "file" }, { - "bom-ref": "33fe2d166d4d675a", + "bom-ref": "d2676a7e4aa40aad", "name": "/usr/include/linux/mtio.h", "type": "file" }, { - "bom-ref": "ecbd172ccb3dbddc", + "bom-ref": "04054f614ade3edf", "name": "/usr/include/linux/nbd-netlink.h", "type": "file" }, { - "bom-ref": "610822a5ef85177c", + "bom-ref": "44d67c1275f019bf", "name": "/usr/include/linux/nbd.h", "type": "file" }, { - "bom-ref": "4529080e4051a460", + "bom-ref": "af2aa1fa927b5d43", "name": "/usr/include/linux/ncsi.h", "type": "file" }, { - "bom-ref": "4570a88f4c32aeab", + "bom-ref": "2f1b9d74a4f6c190", "name": "/usr/include/linux/ndctl.h", "type": "file" }, { - "bom-ref": "069df37cd9d571fd", + "bom-ref": "a7704af43ef2792e", "name": "/usr/include/linux/neighbour.h", "type": "file" }, { - "bom-ref": "e4ca11077aa7d7b7", + "bom-ref": "473f49034e52f514", "name": "/usr/include/linux/net.h", "type": "file" }, { - "bom-ref": "c4bc164c1a39b09a", + "bom-ref": "c9b13cec044a3005", "name": "/usr/include/linux/net_dropmon.h", "type": "file" }, { - "bom-ref": "df89997752cbfa85", + "bom-ref": "cb058f4b92a6ec36", "name": "/usr/include/linux/net_namespace.h", "type": "file" }, { - "bom-ref": "ec3d7f12777a6fd2", + "bom-ref": "de4a405b2816431d", "name": "/usr/include/linux/net_tstamp.h", "type": "file" }, { - "bom-ref": "4951fb15dbc5cc8a", + "bom-ref": "3a5b519816e42c85", "name": "/usr/include/linux/netconf.h", "type": "file" }, { - "bom-ref": "0e0ad308cf84d5fc", + "bom-ref": "f1732267afeac44b", "name": "/usr/include/linux/netdev.h", "type": "file" }, { - "bom-ref": "7305a37514332bc1", + "bom-ref": "8dd05079087812e2", "name": "/usr/include/linux/netdevice.h", "type": "file" }, { - "bom-ref": "1dfa83d6c8561a55", + "bom-ref": "4685f82d8e0672ae", "name": "/usr/include/linux/netfilter.h", "type": "file" }, { - "bom-ref": "905e286e9258ccf7", + "bom-ref": "645473f853056a6c", "name": "/usr/include/linux/netfilter/ipset/ip_set.h", "type": "file" }, { - "bom-ref": "c1adb7bcaeaa9448", + "bom-ref": "b0816162838293a7", "name": "/usr/include/linux/netfilter/ipset/ip_set_bitmap.h", "type": "file" }, { - "bom-ref": "91123a4dd9764263", + "bom-ref": "62d083a5be7704c0", "name": "/usr/include/linux/netfilter/ipset/ip_set_hash.h", "type": "file" }, { - "bom-ref": "cfd6ca650238cb05", + "bom-ref": "8346d558f8d8dcce", "name": "/usr/include/linux/netfilter/ipset/ip_set_list.h", "type": "file" }, { - "bom-ref": "2645725da5def0f7", + "bom-ref": "f3154c5b43d85284", "name": "/usr/include/linux/netfilter/nf_conntrack_common.h", "type": "file" }, { - "bom-ref": "b01a8fe054a27003", + "bom-ref": "db2da44adcaf3000", "name": "/usr/include/linux/netfilter/nf_conntrack_ftp.h", "type": "file" }, { - "bom-ref": "186f241501444334", + "bom-ref": "90b014269c89968f", "name": "/usr/include/linux/netfilter/nf_conntrack_sctp.h", "type": "file" }, { - "bom-ref": "577ee507b1a239ec", + "bom-ref": "f52cd02bd354fc3f", "name": "/usr/include/linux/netfilter/nf_conntrack_tcp.h", "type": "file" }, { - "bom-ref": "09b5d28dbb00cda2", + "bom-ref": "0d8927ffaba17349", "name": "/usr/include/linux/netfilter/nf_conntrack_tuple_common.h", "type": "file" }, { - "bom-ref": "fc81ee8cd380d563", + "bom-ref": "246722ffd477283c", "name": "/usr/include/linux/netfilter/nf_log.h", "type": "file" }, { - "bom-ref": "add1b74025c628fa", + "bom-ref": "ce835a1e596ee37d", "name": "/usr/include/linux/netfilter/nf_nat.h", "type": "file" }, { - "bom-ref": "a74bbc99ca69f529", + "bom-ref": "9b30f65b9c291ef6", "name": "/usr/include/linux/netfilter/nf_synproxy.h", "type": "file" }, { - "bom-ref": "1e317abfa5957c15", + "bom-ref": "ae4478c0474ba256", "name": "/usr/include/linux/netfilter/nf_tables.h", "type": "file" }, { - "bom-ref": "d2f7efafbaae3b7d", + "bom-ref": "aa817e5676d10fda", "name": "/usr/include/linux/netfilter/nf_tables_compat.h", "type": "file" }, { - "bom-ref": "672592439c395491", + "bom-ref": "c27771cccd623f6a", "name": "/usr/include/linux/netfilter/nfnetlink.h", "type": "file" }, { - "bom-ref": "10326defc6986310", + "bom-ref": "9ce00f71765cb42b", "name": "/usr/include/linux/netfilter/nfnetlink_acct.h", "type": "file" }, { - "bom-ref": "46be29af0953157c", + "bom-ref": "d586a12c315baa47", "name": "/usr/include/linux/netfilter/nfnetlink_compat.h", "type": "file" }, { - "bom-ref": "fdaae12162eb6320", + "bom-ref": "53774462d3410ac7", "name": "/usr/include/linux/netfilter/nfnetlink_conntrack.h", "type": "file" }, { - "bom-ref": "69a1bee00d831ebf", + "bom-ref": "8786f2abdace4cf0", "name": "/usr/include/linux/netfilter/nfnetlink_cthelper.h", "type": "file" }, { - "bom-ref": "b77caba39a9ed727", + "bom-ref": "b7124e4bf4ab4b40", "name": "/usr/include/linux/netfilter/nfnetlink_cttimeout.h", "type": "file" }, { - "bom-ref": "25c6d1b494e16e99", + "bom-ref": "23d589b9e50069f6", "name": "/usr/include/linux/netfilter/nfnetlink_hook.h", "type": "file" }, { - "bom-ref": "332c02b4f6bd922d", + "bom-ref": "69d5c17e506d1256", "name": "/usr/include/linux/netfilter/nfnetlink_log.h", "type": "file" }, { - "bom-ref": "eea2c51b7efd8c69", + "bom-ref": "2a01c2c7cd5afdc6", "name": "/usr/include/linux/netfilter/nfnetlink_osf.h", "type": "file" }, { - "bom-ref": "0004ff3bccf79ebe", + "bom-ref": "b6095c3ccf7f1901", "name": "/usr/include/linux/netfilter/nfnetlink_queue.h", "type": "file" }, { - "bom-ref": "82a71d883144a1a9", + "bom-ref": "61d73708503aae62", "name": "/usr/include/linux/netfilter/x_tables.h", "type": "file" }, { - "bom-ref": "17134b083486b455", + "bom-ref": "436f94036510a422", "name": "/usr/include/linux/netfilter/xt_AUDIT.h", "type": "file" }, { - "bom-ref": "eb71b4012e8feea4", + "bom-ref": "757a531b99b7f6c7", "name": "/usr/include/linux/netfilter/xt_CHECKSUM.h", "type": "file" }, { - "bom-ref": "9e33e39fe643aa6e", + "bom-ref": "f512521cd65df3b5", "name": "/usr/include/linux/netfilter/xt_CLASSIFY.h", "type": "file" }, { - "bom-ref": "09513c2696a16c44", + "bom-ref": "d1fab01035711f9b", "name": "/usr/include/linux/netfilter/xt_CONNMARK.h", "type": "file" }, { - "bom-ref": "9437fa274faa9b5e", + "bom-ref": "13d67613b7346919", "name": "/usr/include/linux/netfilter/xt_CONNSECMARK.h", "type": "file" }, { - "bom-ref": "7ea12936c2b65cf3", + "bom-ref": "263406545fbd73b0", "name": "/usr/include/linux/netfilter/xt_CT.h", "type": "file" }, { - "bom-ref": "a1c8ba39fdbe82d5", + "bom-ref": "f901542183503e66", "name": "/usr/include/linux/netfilter/xt_DSCP.h", "type": "file" }, { - "bom-ref": "39395d44cffff2ed", + "bom-ref": "c85472a737759056", "name": "/usr/include/linux/netfilter/xt_HMARK.h", "type": "file" }, { - "bom-ref": "e97becda1b151c15", + "bom-ref": "4717852125ba45fa", "name": "/usr/include/linux/netfilter/xt_IDLETIMER.h", "type": "file" }, { - "bom-ref": "f359fa9367cd1bfc", + "bom-ref": "b45d014f0cdf4a9b", "name": "/usr/include/linux/netfilter/xt_LED.h", "type": "file" }, { - "bom-ref": "794f79e138a86fa3", + "bom-ref": "3b3157627d659f24", "name": "/usr/include/linux/netfilter/xt_LOG.h", "type": "file" }, { - "bom-ref": "5dd5d7513d421418", + "bom-ref": "491344e7a8051557", "name": "/usr/include/linux/netfilter/xt_MARK.h", "type": "file" }, { - "bom-ref": "9e4b228876d91db3", + "bom-ref": "8134d1bc67db1c5c", "name": "/usr/include/linux/netfilter/xt_NFLOG.h", "type": "file" }, { - "bom-ref": "512558d1eb849b7d", + "bom-ref": "4fe6de125bbc5192", "name": "/usr/include/linux/netfilter/xt_NFQUEUE.h", "type": "file" }, { - "bom-ref": "eae799c0aec9bee0", + "bom-ref": "cbfcda0972537193", "name": "/usr/include/linux/netfilter/xt_RATEEST.h", "type": "file" }, { - "bom-ref": "60f7caa4823f10cf", + "bom-ref": "9ef899ab32a115e4", "name": "/usr/include/linux/netfilter/xt_SECMARK.h", "type": "file" }, { - "bom-ref": "f9f0794e06326bbc", + "bom-ref": "6a5c5a55111bfa13", "name": "/usr/include/linux/netfilter/xt_SYNPROXY.h", "type": "file" }, { - "bom-ref": "b355b4b52a419bbe", + "bom-ref": "ff5d9eaeba6bd2d9", "name": "/usr/include/linux/netfilter/xt_TCPMSS.h", "type": "file" }, { - "bom-ref": "4a34a02e39e4c6b3", + "bom-ref": "2294b9b2c1313150", "name": "/usr/include/linux/netfilter/xt_TCPOPTSTRIP.h", "type": "file" }, { - "bom-ref": "a7bc1b449ed94d99", + "bom-ref": "4d7f0427b83d073a", "name": "/usr/include/linux/netfilter/xt_TEE.h", "type": "file" }, { - "bom-ref": "3c4c64160de619b9", + "bom-ref": "a4608f6e8f1738c6", "name": "/usr/include/linux/netfilter/xt_TPROXY.h", "type": "file" }, { - "bom-ref": "8c727926a09231c3", + "bom-ref": "fac44e8c50410d10", "name": "/usr/include/linux/netfilter/xt_addrtype.h", "type": "file" }, { - "bom-ref": "f48050b01345983e", + "bom-ref": "24ee12e3033fe195", "name": "/usr/include/linux/netfilter/xt_bpf.h", "type": "file" }, { - "bom-ref": "9353e162989fce51", + "bom-ref": "ba9ffa1ca604b896", "name": "/usr/include/linux/netfilter/xt_cgroup.h", "type": "file" }, { - "bom-ref": "6f88af8ffccc8f54", + "bom-ref": "e7bb92b07a19b1cf", "name": "/usr/include/linux/netfilter/xt_cluster.h", "type": "file" }, { - "bom-ref": "45785b9228ec626c", + "bom-ref": "428f914030beb587", "name": "/usr/include/linux/netfilter/xt_comment.h", "type": "file" }, { - "bom-ref": "97c8f9e9b53c31b6", + "bom-ref": "0c95d077396188e9", "name": "/usr/include/linux/netfilter/xt_connbytes.h", "type": "file" }, { - "bom-ref": "7e4ff241cad39fee", + "bom-ref": "3a7c1a961e7973b9", "name": "/usr/include/linux/netfilter/xt_connlabel.h", "type": "file" }, { - "bom-ref": "d24049b221a20933", + "bom-ref": "5a8d96ca52cc59c8", "name": "/usr/include/linux/netfilter/xt_connlimit.h", "type": "file" }, { - "bom-ref": "bfc0ad87b6c0e3ce", + "bom-ref": "8f64a1e27f21d049", "name": "/usr/include/linux/netfilter/xt_connmark.h", "type": "file" }, { - "bom-ref": "ed6d631386724e11", + "bom-ref": "773bc2daf6bf3156", "name": "/usr/include/linux/netfilter/xt_conntrack.h", "type": "file" }, { - "bom-ref": "eecbe296eed10507", + "bom-ref": "66d15bd8c53d018c", "name": "/usr/include/linux/netfilter/xt_cpu.h", "type": "file" }, { - "bom-ref": "3bbd687a61955bfd", + "bom-ref": "4a11c4ca8b68c132", "name": "/usr/include/linux/netfilter/xt_dccp.h", "type": "file" }, { - "bom-ref": "7d8ef69ab9472aef", + "bom-ref": "dcce9f9b48fc26b4", "name": "/usr/include/linux/netfilter/xt_devgroup.h", "type": "file" }, { - "bom-ref": "2fbece30b1950709", + "bom-ref": "f24e29e1335e0772", "name": "/usr/include/linux/netfilter/xt_dscp.h", "type": "file" }, { - "bom-ref": "608c81970dcd87ef", + "bom-ref": "5ff1216e393ab3d0", "name": "/usr/include/linux/netfilter/xt_ecn.h", "type": "file" }, { - "bom-ref": "e95de21cde84ca6c", + "bom-ref": "a08a024819366c0f", "name": "/usr/include/linux/netfilter/xt_esp.h", "type": "file" }, { - "bom-ref": "a34a873b0302fb8d", + "bom-ref": "69fbf814edbafa16", "name": "/usr/include/linux/netfilter/xt_hashlimit.h", "type": "file" }, { - "bom-ref": "d2fd13ec385e3305", + "bom-ref": "fc19a1546f0e0306", "name": "/usr/include/linux/netfilter/xt_helper.h", "type": "file" }, { - "bom-ref": "b7d4c17160c063c8", + "bom-ref": "b510f75513788e57", "name": "/usr/include/linux/netfilter/xt_ipcomp.h", "type": "file" }, { - "bom-ref": "da40ab54cee78871", + "bom-ref": "8dd1e76c3ded54ea", "name": "/usr/include/linux/netfilter/xt_iprange.h", "type": "file" }, { - "bom-ref": "22f55716fccef40b", + "bom-ref": "94093b10c1d93ecc", "name": "/usr/include/linux/netfilter/xt_ipvs.h", "type": "file" }, { - "bom-ref": "f6a62556592ce3f2", + "bom-ref": "db7f561ff0f2058d", "name": "/usr/include/linux/netfilter/xt_l2tp.h", "type": "file" }, { - "bom-ref": "8555f114135e9db1", + "bom-ref": "f081151c2ffc7f62", "name": "/usr/include/linux/netfilter/xt_length.h", "type": "file" }, { - "bom-ref": "f999a66c6d26b492", + "bom-ref": "c5bf9a88c3cd0f99", "name": "/usr/include/linux/netfilter/xt_limit.h", "type": "file" }, { - "bom-ref": "a891810deba00fc9", + "bom-ref": "1327be909351625a", "name": "/usr/include/linux/netfilter/xt_mac.h", "type": "file" }, { - "bom-ref": "b59a346893eff680", + "bom-ref": "139d7a8f137e1d6b", "name": "/usr/include/linux/netfilter/xt_mark.h", "type": "file" }, { - "bom-ref": "b2db594be4a462b6", + "bom-ref": "aafdab4ad504c4fd", "name": "/usr/include/linux/netfilter/xt_multiport.h", "type": "file" }, { - "bom-ref": "2dc3d7cce04b8e46", + "bom-ref": "d554e80f654ab625", "name": "/usr/include/linux/netfilter/xt_nfacct.h", "type": "file" }, { - "bom-ref": "83b24446e26d4ac4", + "bom-ref": "b8897beacdf82843", "name": "/usr/include/linux/netfilter/xt_osf.h", "type": "file" }, { - "bom-ref": "9e2cc2ecc0aece46", + "bom-ref": "8edb8ead33ce17e1", "name": "/usr/include/linux/netfilter/xt_owner.h", "type": "file" }, { - "bom-ref": "76661815d8380cfd", + "bom-ref": "a5985684ba088de6", "name": "/usr/include/linux/netfilter/xt_physdev.h", "type": "file" }, { - "bom-ref": "9371c3d09b6ac42d", + "bom-ref": "9c370bc47cfbcf5a", "name": "/usr/include/linux/netfilter/xt_pkttype.h", "type": "file" }, { - "bom-ref": "31479c5f88b23094", + "bom-ref": "ee2fea06b3d9ef87", "name": "/usr/include/linux/netfilter/xt_policy.h", "type": "file" }, { - "bom-ref": "789936ada4cd9c57", + "bom-ref": "564034b9e3047434", "name": "/usr/include/linux/netfilter/xt_quota.h", "type": "file" }, { - "bom-ref": "137d00c14a77ea57", + "bom-ref": "9b277bd57a2186a8", "name": "/usr/include/linux/netfilter/xt_rateest.h", "type": "file" }, { - "bom-ref": "f9f7f47c19995810", + "bom-ref": "1946adc921d7925f", "name": "/usr/include/linux/netfilter/xt_realm.h", "type": "file" }, { - "bom-ref": "f48d6a14d71e3297", + "bom-ref": "96e7abf91aba6d7c", "name": "/usr/include/linux/netfilter/xt_recent.h", "type": "file" }, { - "bom-ref": "3057bf2798c46dc4", + "bom-ref": "3e514bdc22e19703", "name": "/usr/include/linux/netfilter/xt_rpfilter.h", "type": "file" }, { - "bom-ref": "54ee95796ced635e", + "bom-ref": "af8ea21296fb1739", "name": "/usr/include/linux/netfilter/xt_sctp.h", "type": "file" }, { - "bom-ref": "f03a637a7098c045", + "bom-ref": "0271ddccf5d6e7e6", "name": "/usr/include/linux/netfilter/xt_set.h", "type": "file" }, { - "bom-ref": "6c5d94763d289b1b", + "bom-ref": "5f6b47ddb6cb515c", "name": "/usr/include/linux/netfilter/xt_socket.h", "type": "file" }, { - "bom-ref": "091350420731c814", + "bom-ref": "c4dba745da15f5cf", "name": "/usr/include/linux/netfilter/xt_state.h", "type": "file" }, { - "bom-ref": "d8f43ab56bfd2561", + "bom-ref": "d04a9755ab69fcaa", "name": "/usr/include/linux/netfilter/xt_statistic.h", "type": "file" }, { - "bom-ref": "9d424b0937611cbd", + "bom-ref": "c09f429d151ca05a", "name": "/usr/include/linux/netfilter/xt_string.h", "type": "file" }, { - "bom-ref": "1a8c54320fdc0b9e", + "bom-ref": "677ca7d340746ff9", "name": "/usr/include/linux/netfilter/xt_tcpmss.h", "type": "file" }, { - "bom-ref": "8506f393e4036a7f", + "bom-ref": "08744769b99367b8", "name": "/usr/include/linux/netfilter/xt_tcpudp.h", "type": "file" }, { - "bom-ref": "405e55fc9952e4b8", + "bom-ref": "70fe9a9bf30eecfb", "name": "/usr/include/linux/netfilter/xt_time.h", "type": "file" }, { - "bom-ref": "6d0ac930804b38ea", + "bom-ref": "a8a6c2d5d77b6f79", "name": "/usr/include/linux/netfilter/xt_u32.h", "type": "file" }, { - "bom-ref": "deb28adf4f4e45ad", + "bom-ref": "5ae71ac09313cad6", "name": "/usr/include/linux/netfilter_arp.h", "type": "file" }, { - "bom-ref": "fc76ac855bcc339f", + "bom-ref": "863a2289d91c123c", "name": "/usr/include/linux/netfilter_arp/arp_tables.h", "type": "file" }, { - "bom-ref": "deda858468867c72", + "bom-ref": "bb6c2dcadb2171b1", "name": "/usr/include/linux/netfilter_arp/arpt_mangle.h", "type": "file" }, { - "bom-ref": "2beea85f6c2c7e14", + "bom-ref": "6da79b38829ea543", "name": "/usr/include/linux/netfilter_bridge.h", "type": "file" }, { - "bom-ref": "d43a50e43e538d4c", + "bom-ref": "21c520d202590e9f", "name": "/usr/include/linux/netfilter_bridge/ebt_802_3.h", "type": "file" }, { - "bom-ref": "cf65cca2e2754e25", + "bom-ref": "bf0f931d0aa1c5b6", "name": "/usr/include/linux/netfilter_bridge/ebt_among.h", "type": "file" }, { - "bom-ref": "7b65d0799030f98c", + "bom-ref": "2f526707287db837", "name": "/usr/include/linux/netfilter_bridge/ebt_arp.h", "type": "file" }, { - "bom-ref": "6d1373b150160093", + "bom-ref": "c9a0cb8be7f33ed4", "name": "/usr/include/linux/netfilter_bridge/ebt_arpreply.h", "type": "file" }, { - "bom-ref": "665049be26bf0e16", + "bom-ref": "256f3dc97b60f8a1", "name": "/usr/include/linux/netfilter_bridge/ebt_ip.h", "type": "file" }, { - "bom-ref": "ae233de84cace15a", + "bom-ref": "787e83fa4909afb9", "name": "/usr/include/linux/netfilter_bridge/ebt_ip6.h", "type": "file" }, { - "bom-ref": "193d1ae0c2f7a1c4", + "bom-ref": "de9c847596aef3ef", "name": "/usr/include/linux/netfilter_bridge/ebt_limit.h", "type": "file" }, { - "bom-ref": "3c3978652af0c718", + "bom-ref": "1e17941478698f77", "name": "/usr/include/linux/netfilter_bridge/ebt_log.h", "type": "file" }, { - "bom-ref": "42a3a84babdbbfd0", + "bom-ref": "651b577572119be7", "name": "/usr/include/linux/netfilter_bridge/ebt_mark_m.h", "type": "file" }, { - "bom-ref": "b18eb5069a9ec048", + "bom-ref": "f5b5658299f60a17", "name": "/usr/include/linux/netfilter_bridge/ebt_mark_t.h", "type": "file" }, { - "bom-ref": "79f00fa9d4acf100", + "bom-ref": "90bafe9ee9d34907", "name": "/usr/include/linux/netfilter_bridge/ebt_nat.h", "type": "file" }, { - "bom-ref": "87de1f156dd25407", + "bom-ref": "f1812367ed6df638", "name": "/usr/include/linux/netfilter_bridge/ebt_nflog.h", "type": "file" }, { - "bom-ref": "eadba5a213a0c05d", + "bom-ref": "8126488f33b01ece", "name": "/usr/include/linux/netfilter_bridge/ebt_pkttype.h", "type": "file" }, { - "bom-ref": "e489c8935c351079", + "bom-ref": "7eda34267d236216", "name": "/usr/include/linux/netfilter_bridge/ebt_redirect.h", "type": "file" }, { - "bom-ref": "abd96bb54b69ed0e", + "bom-ref": "dbf3992818cbcbf5", "name": "/usr/include/linux/netfilter_bridge/ebt_stp.h", "type": "file" }, { - "bom-ref": "a7b76a9d5cf387fb", + "bom-ref": "66e99204a464da5c", "name": "/usr/include/linux/netfilter_bridge/ebt_vlan.h", "type": "file" }, { - "bom-ref": "f8826667075cc53e", + "bom-ref": "650075f919640e45", "name": "/usr/include/linux/netfilter_bridge/ebtables.h", "type": "file" }, { - "bom-ref": "a40854b51a2a6562", + "bom-ref": "a52140eb3df60955", "name": "/usr/include/linux/netfilter_ipv4.h", "type": "file" }, { - "bom-ref": "fae01b602e99c930", + "bom-ref": "9c985afcd4c8398b", "name": "/usr/include/linux/netfilter_ipv4/ip_tables.h", "type": "file" }, { - "bom-ref": "0c6e11f11a160b8b", + "bom-ref": "63a9f7377f290c94", "name": "/usr/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h", "type": "file" }, { - "bom-ref": "d02f4c9325c953d5", + "bom-ref": "a79e13d91fa3b20e", "name": "/usr/include/linux/netfilter_ipv4/ipt_ECN.h", "type": "file" }, { - "bom-ref": "ce90268f0f548b71", + "bom-ref": "d48b4c5835eb143e", "name": "/usr/include/linux/netfilter_ipv4/ipt_LOG.h", "type": "file" }, { - "bom-ref": "2b2dd8e15a8b538e", + "bom-ref": "4145625a27a45e91", "name": "/usr/include/linux/netfilter_ipv4/ipt_REJECT.h", "type": "file" }, { - "bom-ref": "007db2a6fee896a9", + "bom-ref": "cc7c428aa3771fd2", "name": "/usr/include/linux/netfilter_ipv4/ipt_TTL.h", "type": "file" }, { - "bom-ref": "8c77295493fa9026", + "bom-ref": "ac332cb5720a5781", "name": "/usr/include/linux/netfilter_ipv4/ipt_ah.h", "type": "file" }, { - "bom-ref": "ace117f3cb00352d", + "bom-ref": "bb7107224e57b2ce", "name": "/usr/include/linux/netfilter_ipv4/ipt_ecn.h", "type": "file" }, { - "bom-ref": "0472f51c6ca974df", + "bom-ref": "92a0a2030f1b7564", "name": "/usr/include/linux/netfilter_ipv4/ipt_ttl.h", "type": "file" }, { - "bom-ref": "6e0ccdea5eb4ff05", + "bom-ref": "3f59cc6a77ae6f66", "name": "/usr/include/linux/netfilter_ipv6.h", "type": "file" }, { - "bom-ref": "20ec299ad0dd64d2", + "bom-ref": "8787e4a84bbda625", "name": "/usr/include/linux/netfilter_ipv6/ip6_tables.h", "type": "file" }, { - "bom-ref": "ae3498094972fff6", + "bom-ref": "b7576a0d4e9bcf81", "name": "/usr/include/linux/netfilter_ipv6/ip6t_HL.h", "type": "file" }, { - "bom-ref": "2750d403de1937ae", + "bom-ref": "b5a4f21c07939731", "name": "/usr/include/linux/netfilter_ipv6/ip6t_LOG.h", "type": "file" }, { - "bom-ref": "f631f331daa12194", + "bom-ref": "3ad68d4a46f4bf2b", "name": "/usr/include/linux/netfilter_ipv6/ip6t_NPT.h", "type": "file" }, { - "bom-ref": "3380d93b03d8bdb8", + "bom-ref": "7745f9a3944b6213", "name": "/usr/include/linux/netfilter_ipv6/ip6t_REJECT.h", "type": "file" }, { - "bom-ref": "141c52f4aec1b0cb", + "bom-ref": "3357519a23777fac", "name": "/usr/include/linux/netfilter_ipv6/ip6t_ah.h", "type": "file" }, { - "bom-ref": "e9fedaa454133329", + "bom-ref": "a4ddf50848cd73f2", "name": "/usr/include/linux/netfilter_ipv6/ip6t_frag.h", "type": "file" }, { - "bom-ref": "649c8e2108397cd5", + "bom-ref": "426f1dd66dac245a", "name": "/usr/include/linux/netfilter_ipv6/ip6t_hl.h", "type": "file" }, { - "bom-ref": "2074d0b9c9d42f8d", + "bom-ref": "5472b5e5ae737306", "name": "/usr/include/linux/netfilter_ipv6/ip6t_ipv6header.h", "type": "file" }, { - "bom-ref": "51c6f7e17e54c1b7", + "bom-ref": "3b19012f47fb5bd0", "name": "/usr/include/linux/netfilter_ipv6/ip6t_mh.h", "type": "file" }, { - "bom-ref": "3a7459409baf464c", + "bom-ref": "f2ff3f1073fe10ab", "name": "/usr/include/linux/netfilter_ipv6/ip6t_opts.h", "type": "file" }, { - "bom-ref": "872ba705d7c7d5cb", + "bom-ref": "eed62cfe4480f388", "name": "/usr/include/linux/netfilter_ipv6/ip6t_rt.h", "type": "file" }, { - "bom-ref": "a59849611099b286", + "bom-ref": "349dfe5afd251f65", "name": "/usr/include/linux/netfilter_ipv6/ip6t_srh.h", "type": "file" }, { - "bom-ref": "597e21cf2c4f6403", + "bom-ref": "3594a4e263c0da20", "name": "/usr/include/linux/netlink.h", "type": "file" }, { - "bom-ref": "95466c2c2a92bf35", + "bom-ref": "d8bdec8f20154ece", "name": "/usr/include/linux/netlink_diag.h", "type": "file" }, { - "bom-ref": "25915cc359cff5bf", + "bom-ref": "f0668b83bdb8d868", "name": "/usr/include/linux/netrom.h", "type": "file" }, { - "bom-ref": "36fdfa0471893ffc", + "bom-ref": "2b42ea60497f7433", "name": "/usr/include/linux/nexthop.h", "type": "file" }, { - "bom-ref": "ed965c979436efd2", + "bom-ref": "4c5b9a89c0699ec9", "name": "/usr/include/linux/nfc.h", "type": "file" }, { - "bom-ref": "6f43965e855f1870", + "bom-ref": "3dda33f5792d4d9f", "name": "/usr/include/linux/nfs.h", "type": "file" }, { - "bom-ref": "5aa3feaa72ad1221", + "bom-ref": "793adc9043234fe2", "name": "/usr/include/linux/nfs2.h", "type": "file" }, { - "bom-ref": "b8b8e286b70e79e6", + "bom-ref": "620ec8d85c9d7485", "name": "/usr/include/linux/nfs3.h", "type": "file" }, { - "bom-ref": "f81b63fa5b3133d1", + "bom-ref": "a32e0815b7e5609e", "name": "/usr/include/linux/nfs4.h", "type": "file" }, { - "bom-ref": "9e4ab12c3f83d2cf", + "bom-ref": "aa03b8986c9830d4", "name": "/usr/include/linux/nfs4_mount.h", "type": "file" }, { - "bom-ref": "4061a16f94df550c", + "bom-ref": "092d8881d21919d7", "name": "/usr/include/linux/nfs_fs.h", "type": "file" }, { - "bom-ref": "e607d5ba6fbc19f1", + "bom-ref": "c236a6021efde4e2", "name": "/usr/include/linux/nfs_idmap.h", "type": "file" }, { - "bom-ref": "5f1c6ed14eaecc41", + "bom-ref": "2960770febf310b6", "name": "/usr/include/linux/nfs_mount.h", "type": "file" }, { - "bom-ref": "700cdc236ae64cef", + "bom-ref": "9770cc369d6274b8", "name": "/usr/include/linux/nfsacl.h", "type": "file" }, { - "bom-ref": "a4dff7b7300ebf78", + "bom-ref": "bb17c632cf03dd37", "name": "/usr/include/linux/nfsd/cld.h", "type": "file" }, { - "bom-ref": "59229e4eceb67171", + "bom-ref": "f52dc1fc76d12626", "name": "/usr/include/linux/nfsd/debug.h", "type": "file" }, { - "bom-ref": "155dc50d3569bd78", + "bom-ref": "73bfe2cfaeb149f7", "name": "/usr/include/linux/nfsd/export.h", "type": "file" }, { - "bom-ref": "f20c5c2158993466", + "bom-ref": "61971beecab4f155", "name": "/usr/include/linux/nfsd/stats.h", "type": "file" }, { - "bom-ref": "58076208c7f87b04", + "bom-ref": "5b0aa0c5fcf35687", "name": "/usr/include/linux/nfsd_netlink.h", "type": "file" }, { - "bom-ref": "2ce4e104fada2894", + "bom-ref": "bba23e8a49ad10fb", "name": "/usr/include/linux/nilfs2_api.h", "type": "file" }, { - "bom-ref": "b0740509488873ae", + "bom-ref": "40937ef78f93b09d", "name": "/usr/include/linux/nilfs2_ondisk.h", "type": "file" }, { - "bom-ref": "9780805b183c15f7", + "bom-ref": "fb7a9b72c064bcf8", "name": "/usr/include/linux/nitro_enclaves.h", "type": "file" }, { - "bom-ref": "42eff96aa5241f7d", + "bom-ref": "bf5da03f6874e5ea", "name": "/usr/include/linux/nl80211-vnd-intel.h", "type": "file" }, { - "bom-ref": "a3887adbabc7978e", + "bom-ref": "a1a118d0296102d5", "name": "/usr/include/linux/nl80211.h", "type": "file" }, { - "bom-ref": "59f56e945f5c5b1c", + "bom-ref": "308bf12f0104493f", "name": "/usr/include/linux/npcm-video.h", "type": "file" }, { - "bom-ref": "b9d56a3864d90b45", + "bom-ref": "e562d5b9868c2052", "name": "/usr/include/linux/nsfs.h", "type": "file" }, { - "bom-ref": "bbfbc90baf3ce7bf", + "bom-ref": "52d18d1040060fb0", "name": "/usr/include/linux/nsm.h", "type": "file" }, { - "bom-ref": "9c66c63cf7b52af4", + "bom-ref": "8154bd7c5952971b", "name": "/usr/include/linux/nubus.h", "type": "file" }, { - "bom-ref": "17ef3d757376a3db", + "bom-ref": "ecdd7f22ec977d90", "name": "/usr/include/linux/nvme_ioctl.h", "type": "file" }, { - "bom-ref": "9d0c9db72af0150b", + "bom-ref": "bba90852f799b450", "name": "/usr/include/linux/nvram.h", "type": "file" }, { - "bom-ref": "726e1fe43df8fb2d", + "bom-ref": "673f9fa107bacb76", "name": "/usr/include/linux/omap3isp.h", "type": "file" }, { - "bom-ref": "8215bc3330b7025e", + "bom-ref": "75b4237c4de621f1", "name": "/usr/include/linux/omapfb.h", "type": "file" }, { - "bom-ref": "e9ad75d979924d47", + "bom-ref": "ffcc92a92c536d2c", "name": "/usr/include/linux/oom.h", "type": "file" }, { - "bom-ref": "3f5938113a61b3a6", + "bom-ref": "b13abb0aa03a4d15", "name": "/usr/include/linux/openat2.h", "type": "file" }, { - "bom-ref": "e6cec5535d94190b", + "bom-ref": "d23110510964ca68", "name": "/usr/include/linux/openvswitch.h", "type": "file" }, { - "bom-ref": "0a33d5d120698869", + "bom-ref": "fa17f36400c7e78a", "name": "/usr/include/linux/packet_diag.h", "type": "file" }, { - "bom-ref": "9902f5d866162c8b", + "bom-ref": "fe5957fbbbd5f858", "name": "/usr/include/linux/param.h", "type": "file" }, { - "bom-ref": "20d4d898298f8dc8", + "bom-ref": "09dfa9ad94a45f13", "name": "/usr/include/linux/parport.h", "type": "file" }, { - "bom-ref": "b34cb318980280d1", + "bom-ref": "cbaec932bdedc502", "name": "/usr/include/linux/patchkey.h", "type": "file" }, { - "bom-ref": "f8183a7fc3cac01e", + "bom-ref": "b5bb6b87ec6f1e41", "name": "/usr/include/linux/pci.h", "type": "file" }, { - "bom-ref": "a54f5bf42b23be03", + "bom-ref": "5bf416ab5d357d24", "name": "/usr/include/linux/pci_regs.h", "type": "file" }, { - "bom-ref": "ee5be8ed65d15899", + "bom-ref": "bd67a7ad890e5a2e", "name": "/usr/include/linux/pcitest.h", "type": "file" }, { - "bom-ref": "4a1c62ae5e161133", + "bom-ref": "febb66933a6e0674", "name": "/usr/include/linux/perf_event.h", "type": "file" }, { - "bom-ref": "aa4ed5402b936774", + "bom-ref": "4dcf789637f334d3", "name": "/usr/include/linux/personality.h", "type": "file" }, { - "bom-ref": "2135c26b4b642fc1", + "bom-ref": "99644fd8038c5dca", "name": "/usr/include/linux/pfkeyv2.h", "type": "file" }, { - "bom-ref": "ab6d3ec9581a41d4", + "bom-ref": "3baccfe38e8d5fe3", "name": "/usr/include/linux/pfrut.h", "type": "file" }, { - "bom-ref": "5f32b4cef81fe3b6", + "bom-ref": "6b4c2c06c0bc597d", "name": "/usr/include/linux/pg.h", "type": "file" }, { - "bom-ref": "f866399ea1189f25", + "bom-ref": "efe5a6799b82158e", "name": "/usr/include/linux/phantom.h", "type": "file" }, { - "bom-ref": "656a1406ad1d107d", + "bom-ref": "97b2390f6192429e", "name": "/usr/include/linux/phonet.h", "type": "file" }, { - "bom-ref": "93abef97b8ac13bb", + "bom-ref": "ba982ae2c61d5e20", "name": "/usr/include/linux/pidfd.h", "type": "file" }, { - "bom-ref": "c918a9901df8c1c6", + "bom-ref": "098c8b7887ecff59", "name": "/usr/include/linux/pkt_cls.h", "type": "file" }, { - "bom-ref": "2cc33a0f2d245e38", + "bom-ref": "5955caa482172b63", "name": "/usr/include/linux/pkt_sched.h", "type": "file" }, { - "bom-ref": "7cffa047c9fba7ba", + "bom-ref": "6b710c68d9a73e09", "name": "/usr/include/linux/pktcdvd.h", "type": "file" }, { - "bom-ref": "0c2e490f71ba9d46", + "bom-ref": "d98bde9c2a3280fd", "name": "/usr/include/linux/pmu.h", "type": "file" }, { - "bom-ref": "597305d50d459017", + "bom-ref": "7fdfb7fd2b11faa4", "name": "/usr/include/linux/poll.h", "type": "file" }, { - "bom-ref": "8220f5becee68b89", + "bom-ref": "72b4a1be4748b5de", "name": "/usr/include/linux/posix_acl.h", "type": "file" }, { - "bom-ref": "828585ef4c0955b5", + "bom-ref": "e4d4f9f6f0eec6da", "name": "/usr/include/linux/posix_acl_xattr.h", "type": "file" }, { - "bom-ref": "3ebc67e247de7ac7", + "bom-ref": "75ed41ed3ad6f0a4", "name": "/usr/include/linux/posix_types.h", "type": "file" }, { - "bom-ref": "f715a4c6d62b980d", + "bom-ref": "952e4c877252ce22", "name": "/usr/include/linux/ppdev.h", "type": "file" }, { - "bom-ref": "4b9893fd939b3a4e", + "bom-ref": "5ffbac04beb8d871", "name": "/usr/include/linux/ppp-comp.h", "type": "file" }, { - "bom-ref": "e5157f5983f2cd69", + "bom-ref": "d8c6f9fe19f240fe", "name": "/usr/include/linux/ppp-ioctl.h", "type": "file" }, { - "bom-ref": "ad83f9e8bb16b4df", + "bom-ref": "f6a86ef8a6172c2c", "name": "/usr/include/linux/ppp_defs.h", "type": "file" }, { - "bom-ref": "faa1c214d9c60f57", + "bom-ref": "a58394eb287e52d8", "name": "/usr/include/linux/pps.h", "type": "file" }, { - "bom-ref": "871a47b2c21ffc4f", + "bom-ref": "2e89abb1f945fe78", "name": "/usr/include/linux/pr.h", "type": "file" }, { - "bom-ref": "638fb17a79f7ab74", + "bom-ref": "79a4521989c8d4e7", "name": "/usr/include/linux/prctl.h", "type": "file" }, { - "bom-ref": "fe844541b53a72ec", + "bom-ref": "9ac20f3ba917d7c7", "name": "/usr/include/linux/psample.h", "type": "file" }, { - "bom-ref": "58b63b8bf6eb9490", + "bom-ref": "2dd1de06c6b1f307", "name": "/usr/include/linux/psci.h", "type": "file" }, { - "bom-ref": "4b89787bfceb93c9", + "bom-ref": "81035ff8bbb6bb3e", "name": "/usr/include/linux/psp-dbc.h", "type": "file" }, { - "bom-ref": "61bc33c4a6fe0812", + "bom-ref": "95e85639de0c91dd", "name": "/usr/include/linux/psp-sev.h", "type": "file" }, { - "bom-ref": "95107d963eb818e4", + "bom-ref": "8b4b6c0fd7b656db", "name": "/usr/include/linux/ptp_clock.h", "type": "file" }, { - "bom-ref": "73e93f7b5f8025bc", + "bom-ref": "87ee44fe94a7bfab", "name": "/usr/include/linux/ptrace.h", "type": "file" }, { - "bom-ref": "6336270bc826eff7", + "bom-ref": "e589a1cf5b92c13c", "name": "/usr/include/linux/qemu_fw_cfg.h", "type": "file" }, { - "bom-ref": "f4c3002b394bf0d7", + "bom-ref": "3de598cbc57f7798", "name": "/usr/include/linux/qnx4_fs.h", "type": "file" }, { - "bom-ref": "bb8da0fd3b2a9955", + "bom-ref": "099e0e52ddd3b032", "name": "/usr/include/linux/qnxtypes.h", "type": "file" }, { - "bom-ref": "ab45405087384238", + "bom-ref": "7a0f69744dcfe04f", "name": "/usr/include/linux/qrtr.h", "type": "file" }, { - "bom-ref": "87cb27c939010609", + "bom-ref": "aaf388a3fc7bc2e2", "name": "/usr/include/linux/quota.h", "type": "file" }, { - "bom-ref": "90c8449fa27371c0", + "bom-ref": "0b8e06be7a1d7d47", "name": "/usr/include/linux/radeonfb.h", "type": "file" }, { - "bom-ref": "a125495fd1a77f78", + "bom-ref": "916429fc8faa10bb", "name": "/usr/include/linux/raid/md_p.h", "type": "file" }, { - "bom-ref": "7426ba9a0832b6b2", + "bom-ref": "59000ffa5dd376a1", "name": "/usr/include/linux/raid/md_u.h", "type": "file" }, { - "bom-ref": "2760962a1439420a", + "bom-ref": "1cd6c8b68ec4f7d1", "name": "/usr/include/linux/random.h", "type": "file" }, { - "bom-ref": "225a9459d2e4407f", + "bom-ref": "0d637839aa756678", "name": "/usr/include/linux/rds.h", "type": "file" }, { - "bom-ref": "cfad7fb026e36d31", + "bom-ref": "7d5fc39abed223ca", "name": "/usr/include/linux/reboot.h", "type": "file" }, { - "bom-ref": "b3c9f562f8f8361e", + "bom-ref": "a647d6d823ec2dd9", "name": "/usr/include/linux/reiserfs_fs.h", "type": "file" }, { - "bom-ref": "63e34f57a665e725", + "bom-ref": "1165aab10a1be66e", "name": "/usr/include/linux/reiserfs_xattr.h", "type": "file" }, { - "bom-ref": "76ec1f09904772a1", + "bom-ref": "01a864e4dfa45d46", "name": "/usr/include/linux/remoteproc_cdev.h", "type": "file" }, { - "bom-ref": "c7e8f56e6be344c4", + "bom-ref": "8151a15a592d9247", "name": "/usr/include/linux/resource.h", "type": "file" }, { - "bom-ref": "f53be04be0ec6496", + "bom-ref": "e56d15bf82eac8b5", "name": "/usr/include/linux/rfkill.h", "type": "file" }, { - "bom-ref": "b9724cca4e02c0a2", + "bom-ref": "99762a6b36252dd1", "name": "/usr/include/linux/rio_cm_cdev.h", "type": "file" }, { - "bom-ref": "6b2c004855a95557", + "bom-ref": "42aed666277dace4", "name": "/usr/include/linux/rio_mport_cdev.h", "type": "file" }, { - "bom-ref": "da5d3f1708b50695", + "bom-ref": "2456782d99646d52", "name": "/usr/include/linux/rkisp1-config.h", "type": "file" }, { - "bom-ref": "12ce11839c755a9c", + "bom-ref": "c4716d9d2579dfd7", "name": "/usr/include/linux/romfs_fs.h", "type": "file" }, { - "bom-ref": "50e68e69b2232c20", + "bom-ref": "51fc0827a25fe25f", "name": "/usr/include/linux/rose.h", "type": "file" }, { - "bom-ref": "9adc7f13dc84d5ce", + "bom-ref": "a9b5c0c6f7abf0cd", "name": "/usr/include/linux/route.h", "type": "file" }, { - "bom-ref": "6b26a889669a6310", + "bom-ref": "fc5bab1085d43aef", "name": "/usr/include/linux/rpl.h", "type": "file" }, { - "bom-ref": "81fbc62f9548395f", + "bom-ref": "4612e45b81686bfc", "name": "/usr/include/linux/rpl_iptunnel.h", "type": "file" }, { - "bom-ref": "ff11cd00ed390e2e", + "bom-ref": "bd1d492ab2490a59", "name": "/usr/include/linux/rpmsg.h", "type": "file" }, { - "bom-ref": "0cf51d5e197eb70d", + "bom-ref": "5e8167ffd5238bfa", "name": "/usr/include/linux/rpmsg_types.h", "type": "file" }, { - "bom-ref": "d051ed7bc9b0fa69", + "bom-ref": "47f2fc78e7742efe", "name": "/usr/include/linux/rseq.h", "type": "file" }, { - "bom-ref": "3340bbca31d3f312", + "bom-ref": "9dcb043f9f15ac49", "name": "/usr/include/linux/rtc.h", "type": "file" }, { - "bom-ref": "2c25b341dcfc6565", + "bom-ref": "8de489c15b656a6a", "name": "/usr/include/linux/rtnetlink.h", "type": "file" }, { - "bom-ref": "93756538c1076d2a", + "bom-ref": "0be2f8de23a13861", "name": "/usr/include/linux/rxrpc.h", "type": "file" }, { - "bom-ref": "00edf08f8c3b4536", + "bom-ref": "e8aab44815fbe7d5", "name": "/usr/include/linux/scc.h", "type": "file" }, { - "bom-ref": "36e9c89e207039d1", + "bom-ref": "4ef8472be2706bca", "name": "/usr/include/linux/sched.h", "type": "file" }, { - "bom-ref": "9415bb8fc3c4a3eb", + "bom-ref": "55f8ae68a1635a14", "name": "/usr/include/linux/sched/types.h", "type": "file" }, { - "bom-ref": "d86c39397d804a22", + "bom-ref": "11a9897aebce8f55", "name": "/usr/include/linux/scif_ioctl.h", "type": "file" }, { - "bom-ref": "c9775ef413b5a145", + "bom-ref": "e519b78ba03a935e", "name": "/usr/include/linux/screen_info.h", "type": "file" }, { - "bom-ref": "f02f58ffc2f19866", + "bom-ref": "05b672f3753a08c5", "name": "/usr/include/linux/sctp.h", "type": "file" }, { - "bom-ref": "38611d06c3927fde", + "bom-ref": "89094d4385467d65", "name": "/usr/include/linux/seccomp.h", "type": "file" }, { - "bom-ref": "393858e5c03a5e7e", + "bom-ref": "bd78d52c22a9284d", "name": "/usr/include/linux/securebits.h", "type": "file" }, { - "bom-ref": "deed376b3ea7504e", + "bom-ref": "b9d4ffc238ac360d", "name": "/usr/include/linux/sed-opal.h", "type": "file" }, { - "bom-ref": "c916ab9ef3050af9", + "bom-ref": "bae1f0e5863e66e6", "name": "/usr/include/linux/seg6.h", "type": "file" }, { - "bom-ref": "2844fcae1526d713", + "bom-ref": "0df1a2c1599af4a0", "name": "/usr/include/linux/seg6_genl.h", "type": "file" }, { - "bom-ref": "aa5871f1e9272023", + "bom-ref": "0b841bd5aec3fe88", "name": "/usr/include/linux/seg6_hmac.h", "type": "file" }, { - "bom-ref": "f9c2d6b829283eb8", + "bom-ref": "678dd1d9b636983b", "name": "/usr/include/linux/seg6_iptunnel.h", "type": "file" }, { - "bom-ref": "e8a6591908eeadb5", + "bom-ref": "07e43ed0847e4c1e", "name": "/usr/include/linux/seg6_local.h", "type": "file" }, { - "bom-ref": "754b3d1978c1521c", + "bom-ref": "201addce6532c90f", "name": "/usr/include/linux/selinux_netlink.h", "type": "file" }, { - "bom-ref": "2314bcc0feb773c8", + "bom-ref": "686260583f33df3b", "name": "/usr/include/linux/sem.h", "type": "file" }, { - "bom-ref": "3274dd17b0200d65", + "bom-ref": "55cd5a5192dd4506", "name": "/usr/include/linux/serial.h", "type": "file" }, { - "bom-ref": "d997f5248499d634", + "bom-ref": "3a77c8e2fcdc5ba7", "name": "/usr/include/linux/serial_core.h", "type": "file" }, { - "bom-ref": "30c74a9696ea5c15", + "bom-ref": "8605aeedae6a830a", "name": "/usr/include/linux/serial_reg.h", "type": "file" }, { - "bom-ref": "226d71fdd934a6de", + "bom-ref": "1041f661123dc0f5", "name": "/usr/include/linux/serio.h", "type": "file" }, { - "bom-ref": "415799866ec2941c", + "bom-ref": "bc23c6c63d7efbeb", "name": "/usr/include/linux/sev-guest.h", "type": "file" }, { - "bom-ref": "7276d8dfabac0615", + "bom-ref": "dcd8e50336939f9e", "name": "/usr/include/linux/shm.h", "type": "file" }, { - "bom-ref": "dbfb73fbb925523f", + "bom-ref": "8d2b08167439079c", "name": "/usr/include/linux/signal.h", "type": "file" }, { - "bom-ref": "f55ec9650556bfff", + "bom-ref": "e82e8b6b208d365c", "name": "/usr/include/linux/signalfd.h", "type": "file" }, { - "bom-ref": "c2e4a5a8b27b9b03", + "bom-ref": "bdaaa2dedc805e9c", "name": "/usr/include/linux/smc.h", "type": "file" }, { - "bom-ref": "ccb36ea323bd6b2c", + "bom-ref": "83520a7b99157993", "name": "/usr/include/linux/smc_diag.h", "type": "file" }, { - "bom-ref": "59933a35257ee59a", + "bom-ref": "738f67cd364dfe05", "name": "/usr/include/linux/smiapp.h", "type": "file" }, { - "bom-ref": "abec4c3af6d31ed1", + "bom-ref": "548b552ea84e899a", "name": "/usr/include/linux/snmp.h", "type": "file" }, { - "bom-ref": "172d7d30d83f7585", + "bom-ref": "69757c543ec6bdde", "name": "/usr/include/linux/sock_diag.h", "type": "file" }, { - "bom-ref": "d10262e5f603cefd", + "bom-ref": "25bdfbf32c4626fe", "name": "/usr/include/linux/socket.h", "type": "file" }, { - "bom-ref": "74203ae8412409e2", + "bom-ref": "565c612b0a877d95", "name": "/usr/include/linux/sockios.h", "type": "file" }, { - "bom-ref": "9b8c997a7ec35313", + "bom-ref": "e9070642c718c630", "name": "/usr/include/linux/sonet.h", "type": "file" }, { - "bom-ref": "e9fde9292b078ef9", + "bom-ref": "eb79f5bca1c64e56", "name": "/usr/include/linux/sonypi.h", "type": "file" }, { - "bom-ref": "5727fa92c447202e", + "bom-ref": "8698e434cca16161", "name": "/usr/include/linux/sound.h", "type": "file" }, { - "bom-ref": "acbfb653f72b9422", + "bom-ref": "df9d2c7789df63a1", "name": "/usr/include/linux/soundcard.h", "type": "file" }, { - "bom-ref": "77a4ef6814ae5afe", + "bom-ref": "83ef9dad55f4ce3d", "name": "/usr/include/linux/spi/spi.h", "type": "file" }, { - "bom-ref": "6b7bffa93dcc000b", + "bom-ref": "cb2fca6b317ffb30", "name": "/usr/include/linux/spi/spidev.h", "type": "file" }, { - "bom-ref": "71ca26bfd0a9fbe4", + "bom-ref": "e7cb9d314c1879c3", "name": "/usr/include/linux/stat.h", "type": "file" }, { - "bom-ref": "8e443f2a70a823b1", + "bom-ref": "a660bdc8c53b9bd2", "name": "/usr/include/linux/stddef.h", "type": "file" }, { - "bom-ref": "21064172454c52c4", + "bom-ref": "e4ab8498619a2543", "name": "/usr/include/linux/stm.h", "type": "file" }, { - "bom-ref": "1efcd77c4bfae75c", + "bom-ref": "d8597781cd7a317b", "name": "/usr/include/linux/string.h", "type": "file" }, { - "bom-ref": "efc3a1f0a3948156", + "bom-ref": "e42199c5385ac20d", "name": "/usr/include/linux/sunrpc/debug.h", "type": "file" }, { - "bom-ref": "cec8f0dd1b25bb15", + "bom-ref": "603df1c8473cf1e2", "name": "/usr/include/linux/surface_aggregator/cdev.h", "type": "file" }, { - "bom-ref": "2f31294cfa58032f", + "bom-ref": "6085519123d8ebdc", "name": "/usr/include/linux/surface_aggregator/dtx.h", "type": "file" }, { - "bom-ref": "32ee038ccb810e63", + "bom-ref": "046f28c01fef0064", "name": "/usr/include/linux/suspend_ioctls.h", "type": "file" }, { - "bom-ref": "2211732f170df4d9", + "bom-ref": "2aab32a8243d8eca", "name": "/usr/include/linux/swab.h", "type": "file" }, { - "bom-ref": "457de99b4c960869", + "bom-ref": "fe295b0ee8010592", "name": "/usr/include/linux/switchtec_ioctl.h", "type": "file" }, { - "bom-ref": "940914ca344b947e", + "bom-ref": "17a4c80d60039ce1", "name": "/usr/include/linux/sync_file.h", "type": "file" }, { - "bom-ref": "3c83df37fe69a8ab", + "bom-ref": "db9d358df6072770", "name": "/usr/include/linux/synclink.h", "type": "file" }, { - "bom-ref": "52edfa48fd63099d", + "bom-ref": "a8dcdf63df7c32ca", "name": "/usr/include/linux/sysctl.h", "type": "file" }, { - "bom-ref": "45f422cce2e583fe", + "bom-ref": "363eda04d7030e71", "name": "/usr/include/linux/sysinfo.h", "type": "file" }, { - "bom-ref": "0f7b70b24c5f5620", + "bom-ref": "c654413717b61c4f", "name": "/usr/include/linux/target_core_user.h", "type": "file" }, { - "bom-ref": "ce64f7e5eac3ec4b", + "bom-ref": "e72b9feda0836c14", "name": "/usr/include/linux/taskstats.h", "type": "file" }, { - "bom-ref": "8ef41ea1d329fd09", + "bom-ref": "ac215f63170bc28a", "name": "/usr/include/linux/tc_act/tc_bpf.h", "type": "file" }, { - "bom-ref": "b548aecde78aaf9e", + "bom-ref": "67efa99014cd1769", "name": "/usr/include/linux/tc_act/tc_connmark.h", "type": "file" }, { - "bom-ref": "3dd7092c56718059", + "bom-ref": "190ffa87687c0442", "name": "/usr/include/linux/tc_act/tc_csum.h", "type": "file" }, { - "bom-ref": "a7515feaa7ee284a", + "bom-ref": "73bfd67e65146965", "name": "/usr/include/linux/tc_act/tc_ct.h", "type": "file" }, { - "bom-ref": "9b9d7a7e2a54e5db", + "bom-ref": "acb8fc172f965ac0", "name": "/usr/include/linux/tc_act/tc_ctinfo.h", "type": "file" }, { - "bom-ref": "b49e5ea7bf43421e", + "bom-ref": "758d034bb23e4691", "name": "/usr/include/linux/tc_act/tc_defact.h", "type": "file" }, { - "bom-ref": "66c1bdfbd69b1308", + "bom-ref": "86d4d139306a829b", "name": "/usr/include/linux/tc_act/tc_gact.h", "type": "file" }, { - "bom-ref": "4c575b593a3ba5ca", + "bom-ref": "8cb3a33374019ec9", "name": "/usr/include/linux/tc_act/tc_gate.h", "type": "file" }, { - "bom-ref": "2775f30ab3d5af93", + "bom-ref": "0d2f7a5d500c44b4", "name": "/usr/include/linux/tc_act/tc_ife.h", "type": "file" }, { - "bom-ref": "56e25d62619f84d7", + "bom-ref": "5eaa112577467f48", "name": "/usr/include/linux/tc_act/tc_mirred.h", "type": "file" }, { - "bom-ref": "c24e332a75ab97c6", + "bom-ref": "7ea031f53beb4c41", "name": "/usr/include/linux/tc_act/tc_mpls.h", "type": "file" }, { - "bom-ref": "6460cbb7b1d942fe", + "bom-ref": "3ee49eab24f9fcfd", "name": "/usr/include/linux/tc_act/tc_nat.h", "type": "file" }, { - "bom-ref": "8b21d6092d5c7e52", + "bom-ref": "4f2325b737c798d5", "name": "/usr/include/linux/tc_act/tc_pedit.h", "type": "file" }, { - "bom-ref": "526552d383c44b14", + "bom-ref": "244e9a3891604c53", "name": "/usr/include/linux/tc_act/tc_sample.h", "type": "file" }, { - "bom-ref": "87609b5aa777402a", + "bom-ref": "45108cd8b15540f1", "name": "/usr/include/linux/tc_act/tc_skbedit.h", "type": "file" }, { - "bom-ref": "37903973ea3ff8c0", + "bom-ref": "f5150ebe9189452f", "name": "/usr/include/linux/tc_act/tc_skbmod.h", "type": "file" }, { - "bom-ref": "bb614e2df9bd9271", + "bom-ref": "210a9224aaabaabe", "name": "/usr/include/linux/tc_act/tc_tunnel_key.h", "type": "file" }, { - "bom-ref": "c9d4a9c0cefae52a", + "bom-ref": "1399f0909f161111", "name": "/usr/include/linux/tc_act/tc_vlan.h", "type": "file" }, { - "bom-ref": "4596ac3a2f8a96ff", + "bom-ref": "a4e96078e5c2f9f8", "name": "/usr/include/linux/tc_ematch/tc_em_cmp.h", "type": "file" }, { - "bom-ref": "2c1b2aa62b60e7d5", + "bom-ref": "6550d1a04e027d1a", "name": "/usr/include/linux/tc_ematch/tc_em_ipt.h", "type": "file" }, { - "bom-ref": "9712a993dac49b60", + "bom-ref": "9c867d7b379e2c8b", "name": "/usr/include/linux/tc_ematch/tc_em_meta.h", "type": "file" }, { - "bom-ref": "26974369925642a8", + "bom-ref": "7aac7a39b350a423", "name": "/usr/include/linux/tc_ematch/tc_em_nbyte.h", "type": "file" }, { - "bom-ref": "c8665620c386ffb9", + "bom-ref": "2be244e909874b6e", "name": "/usr/include/linux/tc_ematch/tc_em_text.h", "type": "file" }, { - "bom-ref": "66c7d13ab202d2e1", + "bom-ref": "9002cf04da89766a", "name": "/usr/include/linux/tcp.h", "type": "file" }, { - "bom-ref": "d60bbdb5eaf15abc", + "bom-ref": "c6a970521a5a578b", "name": "/usr/include/linux/tcp_metrics.h", "type": "file" }, { - "bom-ref": "c2ee5aa928e29801", + "bom-ref": "55ad67724bb94e4a", "name": "/usr/include/linux/tdx-guest.h", "type": "file" }, { - "bom-ref": "a26e96d7fa3539df", + "bom-ref": "51c1b998747cb43c", "name": "/usr/include/linux/tee.h", "type": "file" }, { - "bom-ref": "1e24fcc52195ef7b", + "bom-ref": "275424bbb81c04c4", "name": "/usr/include/linux/termios.h", "type": "file" }, { - "bom-ref": "cf9fd00de033f5e8", + "bom-ref": "24362327cb4e0a63", "name": "/usr/include/linux/thermal.h", "type": "file" }, { - "bom-ref": "e0c3d313d7dba73b", + "bom-ref": "4d78573c1ee95aa8", "name": "/usr/include/linux/thp7312.h", "type": "file" }, { - "bom-ref": "a7c72500d0ca3fb8", + "bom-ref": "501a8f714cb280ff", "name": "/usr/include/linux/time.h", "type": "file" }, { - "bom-ref": "66dd4d73c945536c", + "bom-ref": "9952d72489e4e6f3", "name": "/usr/include/linux/time_types.h", "type": "file" }, { - "bom-ref": "412486a39dfe5c1d", + "bom-ref": "b474f2df241151ba", "name": "/usr/include/linux/timerfd.h", "type": "file" }, { - "bom-ref": "07b97996c6b2fd59", + "bom-ref": "a3a6b8af5d622736", "name": "/usr/include/linux/times.h", "type": "file" }, { - "bom-ref": "0fbaae90134693bf", + "bom-ref": "8a06d3fa5ff4ba08", "name": "/usr/include/linux/timex.h", "type": "file" }, { - "bom-ref": "b6de34d9f9f85431", + "bom-ref": "51c2533add44c5d6", "name": "/usr/include/linux/tiocl.h", "type": "file" }, { - "bom-ref": "25c04b4e35419dd8", + "bom-ref": "a82aaa0a0d019c23", "name": "/usr/include/linux/tipc.h", "type": "file" }, { - "bom-ref": "753c9fb414819c93", + "bom-ref": "72c5e345be264bc4", "name": "/usr/include/linux/tipc_config.h", "type": "file" }, { - "bom-ref": "f8e9c52bf2e353b5", + "bom-ref": "2ef127894fb92efe", "name": "/usr/include/linux/tipc_netlink.h", "type": "file" }, { - "bom-ref": "d3ad12c4977f0e72", + "bom-ref": "b6cb527faaedfc2d", "name": "/usr/include/linux/tipc_sockets_diag.h", "type": "file" }, { - "bom-ref": "c5b8951f7c2000a0", + "bom-ref": "f66d73a628279d3b", "name": "/usr/include/linux/tls.h", "type": "file" }, { - "bom-ref": "22793eb7ea4b4d51", + "bom-ref": "4b72131788b2ede2", "name": "/usr/include/linux/toshiba.h", "type": "file" }, { - "bom-ref": "3043a02810aab883", + "bom-ref": "add86e9d5bf18270", "name": "/usr/include/linux/tps6594_pfsm.h", "type": "file" }, { - "bom-ref": "32922e8c397b569b", + "bom-ref": "c10fcb417c43d6d8", "name": "/usr/include/linux/tty.h", "type": "file" }, { - "bom-ref": "013dbbb8db2fab5c", + "bom-ref": "282adbcab9f9763f", "name": "/usr/include/linux/tty_flags.h", "type": "file" }, { - "bom-ref": "f3a2fe6cf9be9018", + "bom-ref": "0a9cb81bf2469f0f", "name": "/usr/include/linux/types.h", "type": "file" }, { - "bom-ref": "b45f28b501745101", + "bom-ref": "fbfcd16978477df2", "name": "/usr/include/linux/ublk_cmd.h", "type": "file" }, { - "bom-ref": "1c5abe5c3a2d9a1e", + "bom-ref": "5e8aae1eee13b9a5", "name": "/usr/include/linux/udf_fs_i.h", "type": "file" }, { - "bom-ref": "aae5578e8ca5f93f", + "bom-ref": "08d3f376a8e430f4", "name": "/usr/include/linux/udmabuf.h", "type": "file" }, { - "bom-ref": "23bd4cdfaca3a3ac", + "bom-ref": "72fd7af944b2c9b3", "name": "/usr/include/linux/udp.h", "type": "file" }, { - "bom-ref": "313e60a6f670a599", + "bom-ref": "037b4808cb123b72", "name": "/usr/include/linux/uhid.h", "type": "file" }, { - "bom-ref": "2d963c56cdbb0a12", + "bom-ref": "1ee3b843e34acead", "name": "/usr/include/linux/uinput.h", "type": "file" }, { - "bom-ref": "564cf297323ea457", + "bom-ref": "504a09364c9af1ac", "name": "/usr/include/linux/uio.h", "type": "file" }, { - "bom-ref": "588c9265ee37d1d9", + "bom-ref": "c19ca294bd3977b2", "name": "/usr/include/linux/uleds.h", "type": "file" }, { - "bom-ref": "3d4e6b93c63ce679", + "bom-ref": "8258b4676f9cd39e", "name": "/usr/include/linux/ultrasound.h", "type": "file" }, { - "bom-ref": "1c857ff7f978d674", + "bom-ref": "5427dbe4a50477ab", "name": "/usr/include/linux/um_timetravel.h", "type": "file" }, { - "bom-ref": "0f3c2f9e6b703d2e", + "bom-ref": "1e9e2d9aaf737b4d", "name": "/usr/include/linux/un.h", "type": "file" }, { - "bom-ref": "2b9f6cd2ecbaf3db", + "bom-ref": "b70fe888367307ac", "name": "/usr/include/linux/unistd.h", "type": "file" }, { - "bom-ref": "c8640d01d08774a0", + "bom-ref": "7c210cea08b3ca73", "name": "/usr/include/linux/unix_diag.h", "type": "file" }, { - "bom-ref": "119dd58de81e25c9", + "bom-ref": "cd11ae792aab8896", "name": "/usr/include/linux/usb/audio.h", "type": "file" }, { - "bom-ref": "03436e86aca4c745", + "bom-ref": "18991c61388b3f5e", "name": "/usr/include/linux/usb/cdc-wdm.h", "type": "file" }, { - "bom-ref": "d303fa5d16c4feb9", + "bom-ref": "b98ff70633f508a6", "name": "/usr/include/linux/usb/cdc.h", "type": "file" }, { - "bom-ref": "b6b838c0bbc869d3", + "bom-ref": "04bb6e64dde351f8", "name": "/usr/include/linux/usb/ch11.h", "type": "file" }, { - "bom-ref": "c864daa79dfcdd52", + "bom-ref": "05ad4de5ac1965c9", "name": "/usr/include/linux/usb/ch9.h", "type": "file" }, { - "bom-ref": "8d9fb9b4757c61da", + "bom-ref": "302d9a517bce1efd", "name": "/usr/include/linux/usb/charger.h", "type": "file" }, { - "bom-ref": "c0bcd16a030569f7", + "bom-ref": "1e2dc56b41bf9f38", "name": "/usr/include/linux/usb/functionfs.h", "type": "file" }, { - "bom-ref": "7ff6d94906373d5b", + "bom-ref": "d59c2607363f1f5c", "name": "/usr/include/linux/usb/g_printer.h", "type": "file" }, { - "bom-ref": "e766eb57c4a5899d", + "bom-ref": "b33cf4712b65879a", "name": "/usr/include/linux/usb/g_uvc.h", "type": "file" }, { - "bom-ref": "cb17aacb4292011f", + "bom-ref": "a98898ef4d41e65c", "name": "/usr/include/linux/usb/gadgetfs.h", "type": "file" }, { - "bom-ref": "68b32d5edb8f6e5e", + "bom-ref": "0e4d14dab76e3b0d", "name": "/usr/include/linux/usb/midi.h", "type": "file" }, { - "bom-ref": "579565be0174cbd6", + "bom-ref": "33e53de8fa2dc205", "name": "/usr/include/linux/usb/raw_gadget.h", "type": "file" }, { - "bom-ref": "f0a5678e81c9ffa3", + "bom-ref": "20e96520b06acc84", "name": "/usr/include/linux/usb/tmc.h", "type": "file" }, { - "bom-ref": "36f99e923522f2eb", + "bom-ref": "63257e3e79ab8c6c", "name": "/usr/include/linux/usb/video.h", "type": "file" }, { - "bom-ref": "9dff35d06ba69d0d", + "bom-ref": "06eadc33c3693c1a", "name": "/usr/include/linux/usbdevice_fs.h", "type": "file" }, { - "bom-ref": "0795a3718e429db2", + "bom-ref": "40338d643b155841", "name": "/usr/include/linux/usbip.h", "type": "file" }, { - "bom-ref": "d646f6e7a82ecd05", + "bom-ref": "f655c389758c37f2", "name": "/usr/include/linux/user_events.h", "type": "file" }, { - "bom-ref": "cf6d1ea5e05504d2", + "bom-ref": "21f50d12e688ae79", "name": "/usr/include/linux/userfaultfd.h", "type": "file" }, { - "bom-ref": "9da7c78913f1a86a", + "bom-ref": "85fc287bf648e48d", "name": "/usr/include/linux/userio.h", "type": "file" }, { - "bom-ref": "1b0339a799d3d937", + "bom-ref": "0c4b72b9b44f8334", "name": "/usr/include/linux/utime.h", "type": "file" }, { - "bom-ref": "b0d54da19ebe3fe8", + "bom-ref": "8cc3696ea5dc116b", "name": "/usr/include/linux/utsname.h", "type": "file" }, { - "bom-ref": "ee76b3ac9a483602", + "bom-ref": "5eb6ad99b5906bf9", "name": "/usr/include/linux/uuid.h", "type": "file" }, { - "bom-ref": "bba67fd6683d1132", + "bom-ref": "3a6256c90d528c41", "name": "/usr/include/linux/uvcvideo.h", "type": "file" }, { - "bom-ref": "a82a36b93a8b3062", + "bom-ref": "4931e0292813894d", "name": "/usr/include/linux/v4l2-common.h", "type": "file" }, { - "bom-ref": "e25868f849559309", + "bom-ref": "727da990e7275576", "name": "/usr/include/linux/v4l2-controls.h", "type": "file" }, { - "bom-ref": "cef538a87c390ff3", + "bom-ref": "011504e724b02bc4", "name": "/usr/include/linux/v4l2-dv-timings.h", "type": "file" }, { - "bom-ref": "e382bc9e4b9a9ebc", + "bom-ref": "0a7f1c1cc158b9eb", "name": "/usr/include/linux/v4l2-mediabus.h", "type": "file" }, { - "bom-ref": "bcefc138706ac298", + "bom-ref": "24c68cd320d1a7b3", "name": "/usr/include/linux/v4l2-subdev.h", "type": "file" }, { - "bom-ref": "bda0e5ce841dac2d", + "bom-ref": "d6b7dc38663b337e", "name": "/usr/include/linux/vbox_err.h", "type": "file" }, { - "bom-ref": "a731c1d620346078", + "bom-ref": "1b439e8315eb047b", "name": "/usr/include/linux/vbox_vmmdev_types.h", "type": "file" }, { - "bom-ref": "31a7feb127a46269", + "bom-ref": "a0d2b8f3806f9d8a", "name": "/usr/include/linux/vboxguest.h", "type": "file" }, { - "bom-ref": "6267eea497ae8ad4", + "bom-ref": "33dce9ea0d2dc7f3", "name": "/usr/include/linux/vdpa.h", "type": "file" }, { - "bom-ref": "d92534578e57cd40", + "bom-ref": "d2199dc1c093c0a3", "name": "/usr/include/linux/vduse.h", "type": "file" }, { - "bom-ref": "8afbcdb184958a53", + "bom-ref": "a265276ea4bd9968", "name": "/usr/include/linux/version.h", "type": "file" }, { - "bom-ref": "0afffec945aaab7f", + "bom-ref": "a203a58dadf22eac", "name": "/usr/include/linux/veth.h", "type": "file" }, { - "bom-ref": "0e2fcb4376569a67", + "bom-ref": "c5b5dcc92ce440dc", "name": "/usr/include/linux/vfio.h", "type": "file" }, { - "bom-ref": "a3d9397844085b18", + "bom-ref": "0b3e6996803d6377", "name": "/usr/include/linux/vfio_ccw.h", "type": "file" }, { - "bom-ref": "f518f02c5e7ddb63", + "bom-ref": "ac3dae291054df00", "name": "/usr/include/linux/vfio_zdev.h", "type": "file" }, { - "bom-ref": "fb778ad49a6ad9ce", + "bom-ref": "6cbc093982e84b55", "name": "/usr/include/linux/vhost.h", "type": "file" }, { - "bom-ref": "1280ab47a0422acc", + "bom-ref": "9371f86bcd7062d7", "name": "/usr/include/linux/vhost_types.h", "type": "file" }, { - "bom-ref": "8bf8f260fd4715cf", + "bom-ref": "3028783fb893d60c", "name": "/usr/include/linux/videodev2.h", "type": "file" }, { - "bom-ref": "43f58f6a2229fba0", + "bom-ref": "0f8d9e1052d73703", "name": "/usr/include/linux/virtio_9p.h", "type": "file" }, { - "bom-ref": "50df5a3b39a77930", + "bom-ref": "c6882701eaefe35f", "name": "/usr/include/linux/virtio_balloon.h", "type": "file" }, { - "bom-ref": "289f41d14c8c89b4", + "bom-ref": "0cea562cd43006f7", "name": "/usr/include/linux/virtio_blk.h", "type": "file" }, { - "bom-ref": "5d58ede3091eab81", + "bom-ref": "5b6891a657c7b8ca", "name": "/usr/include/linux/virtio_bt.h", "type": "file" }, { - "bom-ref": "fc80192735624fe8", + "bom-ref": "cdd709f8fdfa84b7", "name": "/usr/include/linux/virtio_config.h", "type": "file" }, { - "bom-ref": "6daf0a409ba033b9", + "bom-ref": "df4ef1e4b9f5db1a", "name": "/usr/include/linux/virtio_console.h", "type": "file" }, { - "bom-ref": "70e5791606dcebe0", + "bom-ref": "7a5eff88f0b25c37", "name": "/usr/include/linux/virtio_crypto.h", "type": "file" }, { - "bom-ref": "21436e69ccc3ffba", + "bom-ref": "bb3f4f9a447e8d19", "name": "/usr/include/linux/virtio_fs.h", "type": "file" }, { - "bom-ref": "69d2e62d6bb8e140", + "bom-ref": "3fa78054a9ce31c3", "name": "/usr/include/linux/virtio_gpio.h", "type": "file" }, { - "bom-ref": "8774930d4214c39e", + "bom-ref": "ce2cb01c40dcff5d", "name": "/usr/include/linux/virtio_gpu.h", "type": "file" }, { - "bom-ref": "c52dd0ac9af8dcc3", + "bom-ref": "11352b0c613c1f74", "name": "/usr/include/linux/virtio_i2c.h", "type": "file" }, { - "bom-ref": "a6591239a771705d", + "bom-ref": "93fd25a24c9d333a", "name": "/usr/include/linux/virtio_ids.h", "type": "file" }, { - "bom-ref": "d0f6d30181f90bb7", + "bom-ref": "632df4448ed8e768", "name": "/usr/include/linux/virtio_input.h", "type": "file" }, { - "bom-ref": "c6e90d9bc026754f", + "bom-ref": "7c7490f654b3524c", "name": "/usr/include/linux/virtio_iommu.h", "type": "file" }, { - "bom-ref": "982a08f7b0d69c72", + "bom-ref": "1716d1d6f917b365", "name": "/usr/include/linux/virtio_mem.h", "type": "file" }, { - "bom-ref": "b150017a05740bd2", + "bom-ref": "e563ec6f05cad7f9", "name": "/usr/include/linux/virtio_mmio.h", "type": "file" }, { - "bom-ref": "dd57d602b727b784", + "bom-ref": "e01aa5ff3204ebb7", "name": "/usr/include/linux/virtio_net.h", "type": "file" }, { - "bom-ref": "a5f6c0400c034b40", + "bom-ref": "f2412b3f5ad0b583", "name": "/usr/include/linux/virtio_pci.h", "type": "file" }, { - "bom-ref": "f37846e8044ac3bd", + "bom-ref": "a6d52f41dcd6ae6a", "name": "/usr/include/linux/virtio_pcidev.h", "type": "file" }, { - "bom-ref": "8b8b1384a5cac5a5", + "bom-ref": "0a8bcc150f00f972", "name": "/usr/include/linux/virtio_pmem.h", "type": "file" }, { - "bom-ref": "412f83b21bcb3e98", + "bom-ref": "679535507eeab65b", "name": "/usr/include/linux/virtio_ring.h", "type": "file" }, { - "bom-ref": "901f6b7d822aa3a0", + "bom-ref": "59eef5d60027f76f", "name": "/usr/include/linux/virtio_rng.h", "type": "file" }, { - "bom-ref": "36c9dca7fd617c62", + "bom-ref": "b009692595842171", "name": "/usr/include/linux/virtio_scmi.h", "type": "file" }, { - "bom-ref": "d26f60b62ff666c5", + "bom-ref": "d07705820750574e", "name": "/usr/include/linux/virtio_scsi.h", "type": "file" }, { - "bom-ref": "25088f03eb59f1c6", + "bom-ref": "1a0814cf392931d9", "name": "/usr/include/linux/virtio_snd.h", "type": "file" }, { - "bom-ref": "301a44a642308a76", + "bom-ref": "1141d083ac82d831", "name": "/usr/include/linux/virtio_types.h", "type": "file" }, { - "bom-ref": "0c62179f3c926c89", + "bom-ref": "6238d709b06bd9de", "name": "/usr/include/linux/virtio_vsock.h", "type": "file" }, { - "bom-ref": "f6a5633bc2fabb3f", + "bom-ref": "0cd2c6e219e94894", "name": "/usr/include/linux/vm_sockets.h", "type": "file" }, { - "bom-ref": "a3d6bdc5a6479b47", + "bom-ref": "b485e027745858a8", "name": "/usr/include/linux/vm_sockets_diag.h", "type": "file" }, { - "bom-ref": "1717cd0f90e6ebaf", + "bom-ref": "8f0bbc0167d2816c", "name": "/usr/include/linux/vmcore.h", "type": "file" }, { - "bom-ref": "5e72ade0adf3ed22", + "bom-ref": "372042211935c6d9", "name": "/usr/include/linux/vsockmon.h", "type": "file" }, { - "bom-ref": "146f25769710728a", + "bom-ref": "2a0a0d8f6bee4a81", "name": "/usr/include/linux/vt.h", "type": "file" }, { - "bom-ref": "c8339945241abdb3", + "bom-ref": "5aeeeab9ffd14b9c", "name": "/usr/include/linux/vtpm_proxy.h", "type": "file" }, { - "bom-ref": "8af86a6d8eaf5d24", + "bom-ref": "d157a32d0266b8a3", "name": "/usr/include/linux/wait.h", "type": "file" }, { - "bom-ref": "57df8cfb953a2dc8", + "bom-ref": "c993209e532a71af", "name": "/usr/include/linux/watch_queue.h", "type": "file" }, { - "bom-ref": "bca7318f5062389f", + "bom-ref": "77a59aacabcf4d74", "name": "/usr/include/linux/watchdog.h", "type": "file" }, { - "bom-ref": "7290c942b566c815", + "bom-ref": "4d5b14b09c6cf732", "name": "/usr/include/linux/wireguard.h", "type": "file" }, { - "bom-ref": "04cf997db191ae63", + "bom-ref": "aa6fb1d6557ad30c", "name": "/usr/include/linux/wireless.h", "type": "file" }, { - "bom-ref": "a009e100aaaa8fd4", + "bom-ref": "25f14c2a6d8bf0f7", "name": "/usr/include/linux/wmi.h", "type": "file" }, { - "bom-ref": "6e5622ee638f3c7a", + "bom-ref": "5599d5dd20565c0d", "name": "/usr/include/linux/wwan.h", "type": "file" }, { - "bom-ref": "7349aab15c83c3a7", + "bom-ref": "9326ad7192f50b54", "name": "/usr/include/linux/x25.h", "type": "file" }, { - "bom-ref": "ba178aacb1837b82", + "bom-ref": "7cebf7749e101109", "name": "/usr/include/linux/xattr.h", "type": "file" }, { - "bom-ref": "b05ea66a1d1eb984", + "bom-ref": "f626bf9f20c141e7", "name": "/usr/include/linux/xdp_diag.h", "type": "file" }, { - "bom-ref": "b10190d51129622a", + "bom-ref": "511358cade7301f5", "name": "/usr/include/linux/xfrm.h", "type": "file" }, { - "bom-ref": "729411d752ba95be", + "bom-ref": "94d614a35dc88a8d", "name": "/usr/include/linux/xilinx-v4l2-controls.h", "type": "file" }, { - "bom-ref": "90804fd775b299c9", + "bom-ref": "f973da016cde7686", "name": "/usr/include/linux/zorro.h", "type": "file" }, { - "bom-ref": "29baa86e5d7d459c", + "bom-ref": "2bda7c84c900c5ab", "name": "/usr/include/linux/zorro_ids.h", "type": "file" }, { - "bom-ref": "59526f55e03657c0", + "bom-ref": "6b74f6e067367f4a", "name": "/usr/include/lmdb.h", "type": "file" }, { - "bom-ref": "99a0e40938ee19f6", + "bom-ref": "0a4ca5af29b038b8", "name": "/usr/include/locale.h", "type": "file" }, { - "bom-ref": "f626ea9672930bfe", + "bom-ref": "ec13bac25f5ab7c8", "name": "/usr/include/lzma.h", "type": "file" }, { - "bom-ref": "0909b8690cae24a7", + "bom-ref": "06e3592cf923d1e5", "name": "/usr/include/lzma/base.h", "type": "file" }, { - "bom-ref": "386a6c9344df409b", + "bom-ref": "f341cb45a32bdd85", "name": "/usr/include/lzma/bcj.h", "type": "file" }, { - "bom-ref": "356540e0b1a0d018", + "bom-ref": "15f27e016bd3c182", "name": "/usr/include/lzma/block.h", "type": "file" }, { - "bom-ref": "4971e7586bb17924", + "bom-ref": "8e1eeba2501b57a6", "name": "/usr/include/lzma/check.h", "type": "file" }, { - "bom-ref": "49fdd8c8ef893e3e", + "bom-ref": "b69fbff59b776794", "name": "/usr/include/lzma/container.h", "type": "file" }, { - "bom-ref": "e3616ecd24d0c6a4", + "bom-ref": "b9f637848fe1dde6", "name": "/usr/include/lzma/delta.h", "type": "file" }, { - "bom-ref": "4a9eec02edad57c4", + "bom-ref": "e83424991d0b1862", "name": "/usr/include/lzma/filter.h", "type": "file" }, { - "bom-ref": "7d8f3a8b50ac673e", + "bom-ref": "f028a0b7ab3ac2e8", "name": "/usr/include/lzma/hardware.h", "type": "file" }, { - "bom-ref": "42445789afdd0fde", + "bom-ref": "d42745c1b7261f5c", "name": "/usr/include/lzma/index.h", "type": "file" }, { - "bom-ref": "92b79fa0fc826398", + "bom-ref": "b7d832d78b1d82b2", "name": "/usr/include/lzma/index_hash.h", "type": "file" }, { - "bom-ref": "a2b3d31e09424965", + "bom-ref": "7619c534dcd06aab", "name": "/usr/include/lzma/lzma12.h", "type": "file" }, { - "bom-ref": "1fda5ff14deb1704", + "bom-ref": "4cf499b2d1813f6a", "name": "/usr/include/lzma/stream_flags.h", "type": "file" }, { - "bom-ref": "1bd4fc6a227d73ad", + "bom-ref": "c233d796e460ed4b", "name": "/usr/include/lzma/version.h", "type": "file" }, { - "bom-ref": "8823d864d610051a", + "bom-ref": "b9aac1989851e900", "name": "/usr/include/lzma/vli.h", "type": "file" }, { - "bom-ref": "a2c9f9c4fc11d25c", + "bom-ref": "38a783b36259a862", "name": "/usr/include/malloc.h", "type": "file" }, { - "bom-ref": "859b13edb1d93084", + "bom-ref": "6df02c1cc85a5926", "name": "/usr/include/math.h", "type": "file" }, { - "bom-ref": "b78d06849c4d784d", + "bom-ref": "0f2124347c7ae26f", "name": "/usr/include/mcheck.h", "type": "file" }, { - "bom-ref": "edda48593d9653ab", + "bom-ref": "a7c3dd1bf11df06d", "name": "/usr/include/md2.h", "type": "file" }, { - "bom-ref": "b1e545bdf4354f0e", + "bom-ref": "d10fccd4db47c7b0", "name": "/usr/include/md4.h", "type": "file" }, { - "bom-ref": "fb38c2828626f9c8", + "bom-ref": "4f90bf86b1a75826", "name": "/usr/include/md5.h", "type": "file" }, { - "bom-ref": "20d05b514e9f013b", + "bom-ref": "842533d4b1f3c4cd", "name": "/usr/include/memory.h", "type": "file" }, { - "bom-ref": "c2b958e9c661329d", + "bom-ref": "b3ed1479d1a33823", "name": "/usr/include/menu.h", "type": "file" }, { - "bom-ref": "ff7b8edd370fda2d", + "bom-ref": "eede46fce1ceda1a", "name": "/usr/include/misc/cxl.h", "type": "file" }, { - "bom-ref": "f8c7cde5e0a40ace", + "bom-ref": "03ec00b3e0b20021", "name": "/usr/include/misc/fastrpc.h", "type": "file" }, { - "bom-ref": "6e08782e3e3c34fe", + "bom-ref": "fe02c04b4cfc7e79", "name": "/usr/include/misc/ocxl.h", "type": "file" }, { - "bom-ref": "3dee456cf57ff2e1", + "bom-ref": "91d2cb56df080f4e", "name": "/usr/include/misc/pvpanic.h", "type": "file" }, { - "bom-ref": "fa907921e9e2a967", + "bom-ref": "5f820cb45cdab230", "name": "/usr/include/misc/uacce/hisi_qm.h", "type": "file" }, { - "bom-ref": "f142a1108dfa04a8", + "bom-ref": "97c7e342e18a71ab", "name": "/usr/include/misc/uacce/uacce.h", "type": "file" }, { - "bom-ref": "ea7911431756c720", + "bom-ref": "b1afb354f200d96b", "name": "/usr/include/misc/xilinx_sdfec.h", "type": "file" }, { - "bom-ref": "d4c31a11b2554978", + "bom-ref": "5d819e6fbdb6c8ba", "name": "/usr/include/mit-krb5/gssapi.h", "type": "file" }, { - "bom-ref": "daa5a13420b92c5e", + "bom-ref": "adf3d426a4d3e734", "name": "/usr/include/mit-krb5/gssapi/gssapi.h", "type": "file" }, { - "bom-ref": "834a82364fa326ab", + "bom-ref": "8fb64362e63864e9", "name": "/usr/include/mit-krb5/gssapi/gssapi_alloc.h", "type": "file" }, { - "bom-ref": "a8354e570ae1ad62", + "bom-ref": "40aef8478304ab40", "name": "/usr/include/mit-krb5/gssapi/gssapi_ext.h", "type": "file" }, { - "bom-ref": "79b680673b45fa88", + "bom-ref": "ba07fa28856da0ae", "name": "/usr/include/mit-krb5/gssapi/gssapi_generic.h", "type": "file" }, { - "bom-ref": "49742d8e0ea5fe0e", + "bom-ref": "b20e2ce578a3e858", "name": "/usr/include/mit-krb5/gssapi/gssapi_krb5.h", "type": "file" }, { - "bom-ref": "19f90f225ba4ce7c", + "bom-ref": "75f1533a07922b8a", "name": "/usr/include/mit-krb5/gssapi/mechglue.h", "type": "file" }, { - "bom-ref": "5d70fe9d121d5211", + "bom-ref": "cd2487664eddc477", "name": "/usr/include/mit-krb5/gssrpc/auth.h", "type": "file" }, { - "bom-ref": "cbfaa9bb9c9859f2", + "bom-ref": "08b6f88c458adff0", "name": "/usr/include/mit-krb5/gssrpc/auth_gss.h", "type": "file" }, { - "bom-ref": "3845f16977fdb3d6", + "bom-ref": "228b7e21a06fbb78", "name": "/usr/include/mit-krb5/gssrpc/auth_gssapi.h", "type": "file" }, { - "bom-ref": "601bf3f81912af50", + "bom-ref": "e4fec177bfea63d2", "name": "/usr/include/mit-krb5/gssrpc/auth_unix.h", "type": "file" }, { - "bom-ref": "525e7ba4d90cbce6", + "bom-ref": "96690f24297661f8", "name": "/usr/include/mit-krb5/gssrpc/clnt.h", "type": "file" }, { - "bom-ref": "f79a28e4c972f502", + "bom-ref": "8eed2f742b70e42c", "name": "/usr/include/mit-krb5/gssrpc/netdb.h", "type": "file" }, { - "bom-ref": "08ec8d19cd2b42ac", + "bom-ref": "007e0130e6fb2f02", "name": "/usr/include/mit-krb5/gssrpc/pmap_clnt.h", "type": "file" }, { - "bom-ref": "524bdf7024595800", + "bom-ref": "ddfc97930e12e01e", "name": "/usr/include/mit-krb5/gssrpc/pmap_prot.h", "type": "file" }, { - "bom-ref": "e506f0db1973bfd0", + "bom-ref": "b9cea1b269c80b0e", "name": "/usr/include/mit-krb5/gssrpc/pmap_rmt.h", "type": "file" }, { - "bom-ref": "c33c56f973696c8e", + "bom-ref": "9aa8e255bddcee28", "name": "/usr/include/mit-krb5/gssrpc/rename.h", "type": "file" }, { - "bom-ref": "8a7bb288512df047", + "bom-ref": "56829eb71e7bd961", "name": "/usr/include/mit-krb5/gssrpc/rpc.h", "type": "file" }, { - "bom-ref": "f6fffa896611c0a9", + "bom-ref": "dfa285194045aefb", "name": "/usr/include/mit-krb5/gssrpc/rpc_msg.h", "type": "file" }, { - "bom-ref": "e97f1813ec407eab", + "bom-ref": "d38f7755ffb89729", "name": "/usr/include/mit-krb5/gssrpc/svc.h", "type": "file" }, { - "bom-ref": "f57e996893b77ef6", + "bom-ref": "6de77cceaf2e7ee8", "name": "/usr/include/mit-krb5/gssrpc/svc_auth.h", "type": "file" }, { - "bom-ref": "1898a5bf990599ea", + "bom-ref": "19799cfa8b6adbf4", "name": "/usr/include/mit-krb5/gssrpc/types.h", "type": "file" }, { - "bom-ref": "867ea3a63c843c5a", + "bom-ref": "46fb3a7240f94968", "name": "/usr/include/mit-krb5/gssrpc/xdr.h", "type": "file" }, { - "bom-ref": "6a72bd5bb1f0fad2", + "bom-ref": "947dffc5cc8abe40", "name": "/usr/include/mit-krb5/kadm5/admin.h", "type": "file" }, { - "bom-ref": "3840f8d4d9476724", + "bom-ref": "1d9e9acf348f0566", "name": "/usr/include/mit-krb5/kadm5/chpass_util_strings.h", "type": "file" }, { - "bom-ref": "9f426e9ce94d4381", + "bom-ref": "3b9e42368fc38f33", "name": "/usr/include/mit-krb5/kadm5/kadm_err.h", "type": "file" }, { - "bom-ref": "97149a6a2bec5ed2", + "bom-ref": "27721503878703f4", "name": "/usr/include/mit-krb5/kdb.h", "type": "file" }, { - "bom-ref": "67ac7e51fbf0be8e", + "bom-ref": "fbaf4d88f1f549f0", "name": "/usr/include/mit-krb5/krb5.h", "type": "file" }, { - "bom-ref": "4c71a05c3fe1fe58", + "bom-ref": "172cad481f2327d6", "name": "/usr/include/mit-krb5/krb5/ccselect_plugin.h", "type": "file" }, { - "bom-ref": "334e569605311520", + "bom-ref": "708684ccec9988c2", "name": "/usr/include/mit-krb5/krb5/certauth_plugin.h", "type": "file" }, { - "bom-ref": "1d49132c63598934", + "bom-ref": "99ec073e6536c7a2", "name": "/usr/include/mit-krb5/krb5/clpreauth_plugin.h", "type": "file" }, { - "bom-ref": "f8e63e9e612a463f", + "bom-ref": "ff3c6e7516db770d", "name": "/usr/include/mit-krb5/krb5/hostrealm_plugin.h", "type": "file" }, { - "bom-ref": "72fa6d46a1e9c333", + "bom-ref": "86147dd41adfdf6d", "name": "/usr/include/mit-krb5/krb5/kadm5_auth_plugin.h", "type": "file" }, { - "bom-ref": "96eb3bf3e2d721f9", + "bom-ref": "0accf01abbc0e173", "name": "/usr/include/mit-krb5/krb5/kadm5_hook_plugin.h", "type": "file" }, { - "bom-ref": "48d7503376ce3749", + "bom-ref": "e2aa48779312288b", "name": "/usr/include/mit-krb5/krb5/kdcpolicy_plugin.h", "type": "file" }, { - "bom-ref": "111d7728580c28cc", + "bom-ref": "c0d165f113fbad9a", "name": "/usr/include/mit-krb5/krb5/kdcpreauth_plugin.h", "type": "file" }, { - "bom-ref": "edf31b2f506122fe", + "bom-ref": "517555691a33bd0c", "name": "/usr/include/mit-krb5/krb5/krb5.h", "type": "file" }, { - "bom-ref": "4a93acedff1c5d4e", + "bom-ref": "fcd941a868b26edc", "name": "/usr/include/mit-krb5/krb5/localauth_plugin.h", "type": "file" }, { - "bom-ref": "e3dfe312447de48c", + "bom-ref": "0d4403c471b52046", "name": "/usr/include/mit-krb5/krb5/locate_plugin.h", "type": "file" }, { - "bom-ref": "263a55e6202fe5ea", + "bom-ref": "edf4eb2a0b50a918", "name": "/usr/include/mit-krb5/krb5/plugin.h", "type": "file" }, { - "bom-ref": "46f4976afa520c7a", + "bom-ref": "090b524e3da1cd10", "name": "/usr/include/mit-krb5/krb5/preauth_plugin.h", "type": "file" }, { - "bom-ref": "16fa23dcfb2754c1", + "bom-ref": "03bb9170a45a9e3b", "name": "/usr/include/mit-krb5/krb5/pwqual_plugin.h", "type": "file" }, { - "bom-ref": "50a4b1a69da73b86", + "bom-ref": "e015d5aaa4f04b04", "name": "/usr/include/mit-krb5/profile.h", "type": "file" }, { - "bom-ref": "7cdfe2d468886c6d", + "bom-ref": "89bd787eeba2a1db", "name": "/usr/include/mntent.h", "type": "file" }, { - "bom-ref": "df0e5c8473cfb21d", + "bom-ref": "bd40d3e504f010af", "name": "/usr/include/monetary.h", "type": "file" }, { - "bom-ref": "90bfb6afa2545b09", + "bom-ref": "55f5a8f496e15bdb", "name": "/usr/include/mqueue.h", "type": "file" }, { - "bom-ref": "a9fe2c55af69bf26", + "bom-ref": "a2e626f1570e525d", "name": "/usr/include/mtd/inftl-user.h", "type": "file" }, { - "bom-ref": "56dc3f1e493142a0", + "bom-ref": "abdadb2a1f35032f", "name": "/usr/include/mtd/mtd-abi.h", "type": "file" }, { - "bom-ref": "be1c4ddef46cc58e", + "bom-ref": "5c6c0293245395f1", "name": "/usr/include/mtd/mtd-user.h", "type": "file" }, { - "bom-ref": "f936415525c11092", + "bom-ref": "b203f58f5eb77f19", "name": "/usr/include/mtd/nftl-user.h", "type": "file" }, { - "bom-ref": "d1cf477760d4ed34", + "bom-ref": "7c3494829a2a3c2f", "name": "/usr/include/mtd/ubi-user.h", "type": "file" }, { - "bom-ref": "7d9d2369bdbd3e81", + "bom-ref": "471d7890561b11cc", "name": "/usr/include/nccl.h", "type": "file" }, { - "bom-ref": "ee86dafb5f95c4c9", + "bom-ref": "81d0fa799f8a63a4", "name": "/usr/include/nccl_device.h", "type": "file" }, { - "bom-ref": "ae0436c33fc65dc9", + "bom-ref": "1fbdd22bc7728ee4", "name": "/usr/include/nccl_device/barrier.h", "type": "file" }, { - "bom-ref": "481018f7de5f64c0", + "bom-ref": "43c505c17eb5b5b5", "name": "/usr/include/nccl_device/comm.h", "type": "file" }, { - "bom-ref": "f96b8a3b1450dc5e", + "bom-ref": "e4d0fd32efd82f0f", "name": "/usr/include/nccl_device/coop.h", "type": "file" }, { - "bom-ref": "57055e2952ea0c64", + "bom-ref": "16b92ac68fe90715", "name": "/usr/include/nccl_device/core.h", "type": "file" }, { - "bom-ref": "3ee282502142a475", + "bom-ref": "69fa196e0c9f5840", "name": "/usr/include/nccl_device/gin.h", "type": "file" }, { - "bom-ref": "c043789a0dfbd562", + "bom-ref": "7e4c1818b5e789c3", "name": "/usr/include/nccl_device/gin/gdaki/doca_gpunetio/common/doca_gpunetio_verbs_def.h", "type": "file" }, { - "bom-ref": "f3e3f04fde179d8e", + "bom-ref": "07ce4c0b21d3cb53", "name": "/usr/include/nccl_device/gin/gdaki/doca_gpunetio/common/doca_gpunetio_verbs_dev.h", "type": "file" }, { - "bom-ref": "6d3d232dda43a4f6", + "bom-ref": "1d69cff3033953cf", "name": "/usr/include/nccl_device/gin/gdaki/doca_gpunetio/device/doca_gpunetio_dev_verbs_common.cuh", "type": "file" }, { - "bom-ref": "715e878cadee6040", + "bom-ref": "488560a6c4d64605", "name": "/usr/include/nccl_device/gin/gdaki/doca_gpunetio/device/doca_gpunetio_dev_verbs_counter.cuh", "type": "file" }, { - "bom-ref": "5805607b1a63f527", + "bom-ref": "f138a872ce1268a6", "name": "/usr/include/nccl_device/gin/gdaki/doca_gpunetio/device/doca_gpunetio_dev_verbs_cq.cuh", "type": "file" }, { - "bom-ref": "d5326a94451ef69e", + "bom-ref": "ad3e11340570012f", "name": "/usr/include/nccl_device/gin/gdaki/doca_gpunetio/device/doca_gpunetio_dev_verbs_onesided.cuh", "type": "file" }, { - "bom-ref": "f6d6f40c27630304", + "bom-ref": "b4aac6ab8191e615", "name": "/usr/include/nccl_device/gin/gdaki/doca_gpunetio/device/doca_gpunetio_dev_verbs_qp.cuh", "type": "file" }, { - "bom-ref": "1f7b92b513705671", + "bom-ref": "937bf914137a6544", "name": "/usr/include/nccl_device/gin/gdaki/doca_gpunetio/doca_gpunetio_device.h", "type": "file" }, { - "bom-ref": "644de3d47f499c70", + "bom-ref": "826fb0116f863431", "name": "/usr/include/nccl_device/gin/gdaki/gin_gdaki.h", "type": "file" }, { - "bom-ref": "4ea0de9d7c0062b2", + "bom-ref": "21c804b4e3a37e47", "name": "/usr/include/nccl_device/gin/gdaki/gin_gdaki_device_host_common.h", "type": "file" }, { - "bom-ref": "f4fae558e66f5bc4", + "bom-ref": "c7d38a1163017169", "name": "/usr/include/nccl_device/gin/gin_device_api.h", "type": "file" }, { - "bom-ref": "bce5efb349c3f579", + "bom-ref": "eaaff07ea8010308", "name": "/usr/include/nccl_device/gin/gin_device_common.h", "type": "file" }, { - "bom-ref": "5564f6394d78710d", + "bom-ref": "35ee5465bf7fadd4", "name": "/usr/include/nccl_device/gin/gin_device_host_common.h", "type": "file" }, { - "bom-ref": "3201cd27d0da4e53", + "bom-ref": "4136fb54ea55dfc7", + "name": "/usr/include/nccl_device/gin/gpi/gin_gpi.h", + "type": "file" + }, + { + "bom-ref": "86139bb3f1908704", + "name": "/usr/include/nccl_device/gin/gpi/gin_gpi_device_host_common.h", + "type": "file" + }, + { + "bom-ref": "1f13388ac284a236", "name": "/usr/include/nccl_device/gin/proxy/gin_proxy.h", "type": "file" }, { - "bom-ref": "ded235c9895d8563", + "bom-ref": "232f332d63c7539e", "name": "/usr/include/nccl_device/gin/proxy/gin_proxy_device_host_common.h", "type": "file" }, { - "bom-ref": "155eda74b5e5942f", + "bom-ref": "54c77a29c4b0cd8a", "name": "/usr/include/nccl_device/gin_barrier.h", "type": "file" }, { - "bom-ref": "0208eb04f948e66f", + "bom-ref": "30a2fd2a1d4c7a2a", "name": "/usr/include/nccl_device/gin_win_stub.h", "type": "file" }, { - "bom-ref": "39da488d081cf314", + "bom-ref": "dcc66b70ac845d5d", "name": "/usr/include/nccl_device/impl/barrier__funcs.h", "type": "file" }, { - "bom-ref": "3b564e11181ada88", + "bom-ref": "83ac0c40024f9029", "name": "/usr/include/nccl_device/impl/barrier__types.h", "type": "file" }, { - "bom-ref": "b1c4e8c9d9fd07e6", + "bom-ref": "e1ca7d2f4220ff0f", "name": "/usr/include/nccl_device/impl/comm__funcs.h", "type": "file" }, { - "bom-ref": "ecacebd731b7eaf4", + "bom-ref": "043ed3ef122b69a5", "name": "/usr/include/nccl_device/impl/comm__types.h", "type": "file" }, { - "bom-ref": "aae37eb70043cba3", + "bom-ref": "6f17a8fe98dc005a", "name": "/usr/include/nccl_device/impl/core__funcs.h", "type": "file" }, { - "bom-ref": "ab9fab0e144a9e43", + "bom-ref": "064e8acbc6acf17e", "name": "/usr/include/nccl_device/impl/core__types.h", "type": "file" }, { - "bom-ref": "e28fd866bafcf644", + "bom-ref": "88b9a5415e1c6661", "name": "/usr/include/nccl_device/impl/gin__funcs.h", "type": "file" }, { - "bom-ref": "c77d2412847d36ac", + "bom-ref": "a8d4277a11c0f6b1", "name": "/usr/include/nccl_device/impl/gin__types.h", "type": "file" }, { - "bom-ref": "40d64a2c5778501d", + "bom-ref": "2bf32535e0e7a654", "name": "/usr/include/nccl_device/impl/gin_barrier__funcs.h", "type": "file" }, { - "bom-ref": "cad1e8509056e40f", + "bom-ref": "9772680bc2aa2d3a", "name": "/usr/include/nccl_device/impl/gin_barrier__types.h", "type": "file" }, { - "bom-ref": "6a554408c467268e", + "bom-ref": "f69aaa04adb6195b", "name": "/usr/include/nccl_device/impl/ll_a2a__funcs.h", "type": "file" }, { - "bom-ref": "b21908bbc52ecb08", + "bom-ref": "c305c0926ba9ddc5", "name": "/usr/include/nccl_device/impl/ll_a2a__types.h", "type": "file" }, { - "bom-ref": "60d5b4f36fd25f4b", + "bom-ref": "4ee99aa06583e9f6", "name": "/usr/include/nccl_device/impl/lsa_barrier__funcs.h", "type": "file" }, { - "bom-ref": "044993bd4cd28cc8", + "bom-ref": "fddb4a28d3266ef9", "name": "/usr/include/nccl_device/impl/lsa_barrier__types.h", "type": "file" }, { - "bom-ref": "1f50f92692494b0f", + "bom-ref": "2a47dc016eb94aca", "name": "/usr/include/nccl_device/impl/multimem__funcs.h", "type": "file" }, { - "bom-ref": "d2544255d784eaf1", + "bom-ref": "e4721cb921700804", "name": "/usr/include/nccl_device/impl/ptr__funcs.h", "type": "file" }, { - "bom-ref": "0f3a1ff67ac8543c", + "bom-ref": "464753f6e0237b51", "name": "/usr/include/nccl_device/impl/ptr__types.h", "type": "file" }, { - "bom-ref": "5ec09d666459d490", + "bom-ref": "07428854b9a13ba5", "name": "/usr/include/nccl_device/impl/reduce_copy__funcs.h", "type": "file" }, { - "bom-ref": "a9af19bf3967f10b", + "bom-ref": "a1e0a635d2aa7e32", "name": "/usr/include/nccl_device/impl/reduce_copy__impl.h", "type": "file" }, { - "bom-ref": "0412547cd26f7a44", + "bom-ref": "9cbbab2265f85551", "name": "/usr/include/nccl_device/impl/reduce_copy__types.h", "type": "file" }, { - "bom-ref": "70c9b187a4ea2af5", + "bom-ref": "619dee85800b7e88", "name": "/usr/include/nccl_device/impl/vector__funcs.h", "type": "file" }, { - "bom-ref": "3f3c2dd9705bd7bf", + "bom-ref": "39c465d1f885ea52", "name": "/usr/include/nccl_device/impl/vector__types.h", "type": "file" }, { - "bom-ref": "288a643eaccddd89", + "bom-ref": "0419fe4f63bbf358", "name": "/usr/include/nccl_device/ll_a2a.h", "type": "file" }, { - "bom-ref": "b9e8dc707b8ca60e", + "bom-ref": "017a118729ec18af", "name": "/usr/include/nccl_device/lsa_barrier.h", "type": "file" }, { - "bom-ref": "9c49bd976f471d95", + "bom-ref": "64069db4cceeb448", "name": "/usr/include/nccl_device/net_device.h", "type": "file" }, { - "bom-ref": "b5497e5d344ffdec", + "bom-ref": "29ab79e84c34a29d", "name": "/usr/include/nccl_device/ptr.h", "type": "file" }, { - "bom-ref": "9c48af14a0ecf016", + "bom-ref": "bc0c5740a75b7bf7", "name": "/usr/include/nccl_device/reduce_copy.h", "type": "file" }, { - "bom-ref": "4337e092f9f716ab", + "bom-ref": "2190ddc797e0df86", "name": "/usr/include/nccl_device/utility.h", "type": "file" }, { - "bom-ref": "ce0eea8bf93557a7", + "bom-ref": "61bbf78d528e0bba", "name": "/usr/include/nccl_device_wrapper.h", "type": "file" }, { - "bom-ref": "b3c51a1edc97f9ea", + "bom-ref": "7ac860a01d134704", "name": "/usr/include/ncurses_dll.h", "type": "file" }, { - "bom-ref": "031e86e2f287b6b5", + "bom-ref": "9642d949f221218b", "name": "/usr/include/net/ethernet.h", "type": "file" }, { - "bom-ref": "022350b8c93b9f91", + "bom-ref": "edd004396d73e60b", "name": "/usr/include/net/if.h", "type": "file" }, { - "bom-ref": "1992c4b6ca972643", + "bom-ref": "4b2fa9473c02fa55", "name": "/usr/include/net/if_arp.h", "type": "file" }, { - "bom-ref": "67127c39d07b5a79", + "bom-ref": "c3f86c93edcd524f", "name": "/usr/include/net/if_packet.h", "type": "file" }, { - "bom-ref": "249a8a9f8fa4c40c", + "bom-ref": "92331acdc7d3ff2e", "name": "/usr/include/net/if_ppp.h", "type": "file" }, { - "bom-ref": "7aaf5317b91bf3ad", + "bom-ref": "52697454c6abe16f", "name": "/usr/include/net/if_shaper.h", "type": "file" }, { - "bom-ref": "5e9882ff8f046a95", + "bom-ref": "441b86be3b32d94b", "name": "/usr/include/net/if_slip.h", "type": "file" }, { - "bom-ref": "66cd6e820aa7ef80", + "bom-ref": "7f10d84158cd45f6", "name": "/usr/include/net/ppp-comp.h", "type": "file" }, { - "bom-ref": "1c2a2a30664e8b6d", + "bom-ref": "bf615a8e979e8c8f", "name": "/usr/include/net/ppp_defs.h", "type": "file" }, { - "bom-ref": "75f0081bf252e044", + "bom-ref": "72e512c88df8719a", "name": "/usr/include/net/route.h", "type": "file" }, { - "bom-ref": "e75f47b36c2601a7", + "bom-ref": "e2a2a706e074d715", "name": "/usr/include/netash/ash.h", "type": "file" }, { - "bom-ref": "2d9aa38268fb16a8", + "bom-ref": "f067ffe4c7a40152", "name": "/usr/include/netatalk/at.h", "type": "file" }, { - "bom-ref": "7b1039c9c8e15539", + "bom-ref": "6d0f3d74c5fa65f3", "name": "/usr/include/netax25/ax25.h", "type": "file" }, { - "bom-ref": "e6b839d2e0144c74", + "bom-ref": "b90ad0ca9b9f3b3e", "name": "/usr/include/netdb.h", "type": "file" }, { - "bom-ref": "3d2b20e7dc6639a9", + "bom-ref": "ef32b2de122d25a3", "name": "/usr/include/neteconet/ec.h", "type": "file" }, { - "bom-ref": "212c6d1c9e00af99", + "bom-ref": "5a841b258296c613", "name": "/usr/include/netinet/ether.h", "type": "file" }, { - "bom-ref": "b1c7e485c635da60", + "bom-ref": "a7001470433c3626", "name": "/usr/include/netinet/icmp6.h", "type": "file" }, { - "bom-ref": "2bb38afc889ba37d", + "bom-ref": "49fa6484970bfd4f", "name": "/usr/include/netinet/if_ether.h", "type": "file" }, { - "bom-ref": "1c082b4e50269303", + "bom-ref": "d4d3783e5d330799", "name": "/usr/include/netinet/if_fddi.h", "type": "file" }, { - "bom-ref": "5e96b16fc30350a9", + "bom-ref": "030e0738d619d41b", "name": "/usr/include/netinet/if_tr.h", "type": "file" }, { - "bom-ref": "74a3a8ed80b02a3d", + "bom-ref": "e0954e5b77b9dffb", "name": "/usr/include/netinet/igmp.h", "type": "file" }, { - "bom-ref": "47ffcbc566bee702", + "bom-ref": "efc9d5ecee2feb08", "name": "/usr/include/netinet/in.h", "type": "file" }, { - "bom-ref": "86972c3bf895fb82", + "bom-ref": "e978e711bace4558", "name": "/usr/include/netinet/in_systm.h", "type": "file" }, { - "bom-ref": "a337ada9cb470ee2", + "bom-ref": "d989046eb4d5728c", "name": "/usr/include/netinet/ip.h", "type": "file" }, { - "bom-ref": "d9d0d315cf0106f7", + "bom-ref": "dd551a76d1fd11a5", "name": "/usr/include/netinet/ip6.h", "type": "file" }, { - "bom-ref": "f66c2bfb1c9e2880", + "bom-ref": "688c242ca355138a", "name": "/usr/include/netinet/ip_icmp.h", "type": "file" }, { - "bom-ref": "729b163ddad554bf", + "bom-ref": "1ea71ec2c08f4f7d", "name": "/usr/include/netinet/tcp.h", "type": "file" }, { - "bom-ref": "aedaf838c01ffe74", + "bom-ref": "81db46e4548ce4e2", "name": "/usr/include/netinet/udp.h", "type": "file" }, { - "bom-ref": "e2103f970ffc04f4", + "bom-ref": "db302275c7edb93a", "name": "/usr/include/netipx/ipx.h", "type": "file" }, { - "bom-ref": "27044f77ed9c4efe", + "bom-ref": "297e557a580bb724", "name": "/usr/include/netiucv/iucv.h", "type": "file" }, { - "bom-ref": "ee0d360cbd0d905c", + "bom-ref": "0889a5b6741f2642", "name": "/usr/include/netpacket/packet.h", "type": "file" }, { - "bom-ref": "421faf930c2c4b83", + "bom-ref": "d78eed725432dc5d", "name": "/usr/include/netrom/netrom.h", "type": "file" }, { - "bom-ref": "bc407e9996cc2411", + "bom-ref": "387ac8adf23ae233", "name": "/usr/include/netrose/rose.h", "type": "file" }, { - "bom-ref": "ca829dcb966ded54", + "bom-ref": "7decb922b024dad6", "name": "/usr/include/nfs/nfs.h", "type": "file" }, { - "bom-ref": "a5ab9443f647535c", + "bom-ref": "0a32dd248e298eda", "name": "/usr/include/nl_types.h", "type": "file" }, { - "bom-ref": "f01259b8e833baea", + "bom-ref": "0953f82ed3c9ec98", "name": "/usr/include/normApi.h", "type": "file" }, { - "bom-ref": "b5b356ac05756011", + "bom-ref": "dd7fa9eacd4e837b", "name": "/usr/include/nss.h", "type": "file" }, { - "bom-ref": "b13beed525afc5f9", + "bom-ref": "0cca1e93310cc028", "name": "/usr/include/numa.h", "type": "file" }, { - "bom-ref": "abd00f1c8c587dd5", + "bom-ref": "ba229cbbdf792270", "name": "/usr/include/numacompat1.h", "type": "file" }, { - "bom-ref": "f48acf10fcf47178", + "bom-ref": "eb0a90d79b29c129", "name": "/usr/include/numaif.h", "type": "file" }, { - "bom-ref": "edc4788ad06da079", + "bom-ref": "7c3a06aa74ae1e74", "name": "/usr/include/nvshmem_13/bootstrap_device_host/nvshmem_uniqueid.h", "type": "file" }, { - "bom-ref": "b55bbf14fbe7d651", + "bom-ref": "4517467c17a2d7c4", + "name": "/usr/include/nvshmem_13/device/logical_endpoint_device.cuh", + "type": "file" + }, + { + "bom-ref": "60c067c0a80fef08", "name": "/usr/include/nvshmem_13/device/nvshmem_coll_defines.cuh", "type": "file" }, { - "bom-ref": "8edc3af60f6882de", + "bom-ref": "90fe58fa8db4081f", "name": "/usr/include/nvshmem_13/device/nvshmem_defines.h", "type": "file" }, { - "bom-ref": "bf0f5cae24e07249", + "bom-ref": "12ac3101d41ed4cc", "name": "/usr/include/nvshmem_13/device/nvshmem_device_macros.h", "type": "file" }, { - "bom-ref": "d206b671a5bed5fb", + "bom-ref": "d51611aeed2826ae", "name": "/usr/include/nvshmem_13/device/nvshmemx_coll_defines.cuh", "type": "file" }, { - "bom-ref": "e0e997977f99af3e", + "bom-ref": "c03173328f91d1f3", "name": "/usr/include/nvshmem_13/device/nvshmemx_collective_launch_apis.h", "type": "file" }, { - "bom-ref": "2995fc538c04b246", + "bom-ref": "d9a04e7ab7979dc7", "name": "/usr/include/nvshmem_13/device/nvshmemx_defines.h", "type": "file" }, { - "bom-ref": "ed70acd25766d01a", + "bom-ref": "5d0cacb3c81aa347", "name": "/usr/include/nvshmem_13/device/tile/nvshmemx_tile_api.hpp", "type": "file" }, { - "bom-ref": "4a2e2a20c001cf03", + "bom-ref": "09632dae017e1a32", "name": "/usr/include/nvshmem_13/device/tile/nvshmemx_tile_api_defines.cuh", "type": "file" }, { - "bom-ref": "049a396ab3850423", + "bom-ref": "7dafab6a999bf046", + "name": "/usr/include/nvshmem_13/device_host/logical_endpoint_types.h", + "type": "file" + }, + { + "bom-ref": "2303d4533eb16e76", "name": "/usr/include/nvshmem_13/device_host/nvshmem_common.cuh", "type": "file" }, { - "bom-ref": "696aa8975080d202", + "bom-ref": "78d10c96f5143cab", "name": "/usr/include/nvshmem_13/device_host/nvshmem_proxy_channel.h", "type": "file" }, { - "bom-ref": "f48ce5f5b4c5f32b", + "bom-ref": "91c9c622110fe802", "name": "/usr/include/nvshmem_13/device_host/nvshmem_tensor.h", "type": "file" }, { - "bom-ref": "482e5def17096627", + "bom-ref": "00c1aee762260112", "name": "/usr/include/nvshmem_13/device_host/nvshmem_types.h", "type": "file" }, { - "bom-ref": "3160062ff8bb01a6", + "bom-ref": "0e2f52871bd97f4f", + "name": "/usr/include/nvshmem_13/device_host/nvshmemi_extern_constant.h", + "type": "file" + }, + { + "bom-ref": "9363dfbca0517bb4", + "name": "/usr/include/nvshmem_13/device_host_transport/nvshmem_common_gpunetio.h", + "type": "file" + }, + { + "bom-ref": "64c10c8beb57931b", "name": "/usr/include/nvshmem_13/device_host_transport/nvshmem_common_ibgda.h", "type": "file" }, { - "bom-ref": "3d5f998e48376318", + "bom-ref": "7cb846c8bb2d02fd", "name": "/usr/include/nvshmem_13/device_host_transport/nvshmem_common_transport.h", "type": "file" }, { - "bom-ref": "a446945498dc6c0f", + "bom-ref": "42d87cbc6e28b6a2", "name": "/usr/include/nvshmem_13/device_host_transport/nvshmem_constants.h", "type": "file" }, { - "bom-ref": "8e96f928b671e498", + "bom-ref": "29387fc84596b328", + "name": "/usr/include/nvshmem_13/gpunetio/common/doca_gpunetio_verbs_def.h", + "type": "file" + }, + { + "bom-ref": "5045b85c78477129", + "name": "/usr/include/nvshmem_13/gpunetio/common/doca_gpunetio_verbs_dev.h", + "type": "file" + }, + { + "bom-ref": "4bd2e938ab5b0ada", + "name": "/usr/include/nvshmem_13/gpunetio/device/doca_gpunetio_dev_verbs_common.cuh", + "type": "file" + }, + { + "bom-ref": "ec46dafc8ece3322", + "name": "/usr/include/nvshmem_13/gpunetio/device/doca_gpunetio_dev_verbs_counter.cuh", + "type": "file" + }, + { + "bom-ref": "a551874e41f46f88", + "name": "/usr/include/nvshmem_13/gpunetio/device/doca_gpunetio_dev_verbs_cq.cuh", + "type": "file" + }, + { + "bom-ref": "49b5e05d64029322", + "name": "/usr/include/nvshmem_13/gpunetio/device/doca_gpunetio_dev_verbs_onesided.cuh", + "type": "file" + }, + { + "bom-ref": "26c92532d222a93e", + "name": "/usr/include/nvshmem_13/gpunetio/device/doca_gpunetio_dev_verbs_qp.cuh", + "type": "file" + }, + { + "bom-ref": "02900cbbd8c1f899", + "name": "/usr/include/nvshmem_13/gpunetio/doca_gpunetio_config.h", + "type": "file" + }, + { + "bom-ref": "24da429776a2394f", + "name": "/usr/include/nvshmem_13/gpunetio/doca_gpunetio_device.h", + "type": "file" + }, + { + "bom-ref": "dc2978ae557a750e", + "name": "/usr/include/nvshmem_13/gpunetio/doca_gpunetio_host.h", + "type": "file" + }, + { + "bom-ref": "c3b09c5424599b82", + "name": "/usr/include/nvshmem_13/gpunetio/host/doca_error.h", + "type": "file" + }, + { + "bom-ref": "a35d2363880b97d2", + "name": "/usr/include/nvshmem_13/gpunetio/host/doca_gpunetio.h", + "type": "file" + }, + { + "bom-ref": "5285503e687a6ee3", + "name": "/usr/include/nvshmem_13/gpunetio/host/doca_gpunetio_high_level.h", + "type": "file" + }, + { + "bom-ref": "a0c07de249e86104", + "name": "/usr/include/nvshmem_13/gpunetio/host/doca_verbs.h", + "type": "file" + }, + { + "bom-ref": "ea53cc22b2fb6e78", + "name": "/usr/include/nvshmem_13/gpunetio/host/mlx5_ifc.h", + "type": "file" + }, + { + "bom-ref": "6885564decc63561", + "name": "/usr/include/nvshmem_13/gpunetio/host/mlx5_prm.h", + "type": "file" + }, + { + "bom-ref": "48d77b794310d40d", "name": "/usr/include/nvshmem_13/host/nvshmem_api.h", "type": "file" }, { - "bom-ref": "8cd6d8a514445151", + "bom-ref": "1dd5d659b2384f80", "name": "/usr/include/nvshmem_13/host/nvshmem_coll_api.h", "type": "file" }, { - "bom-ref": "48fe48c64697bda3", + "bom-ref": "32e5e4d95c33ab6e", "name": "/usr/include/nvshmem_13/host/nvshmem_macros.h", "type": "file" }, { - "bom-ref": "c01fcfd3d6c05a9b", + "bom-ref": "66aa35e763c9419a", "name": "/usr/include/nvshmem_13/host/nvshmemx_api.h", "type": "file" }, { - "bom-ref": "2d8d834bdba76725", + "bom-ref": "c0bf9391a58f9878", "name": "/usr/include/nvshmem_13/host/nvshmemx_coll_api.h", "type": "file" }, { - "bom-ref": "09c4c2b6598faa8c", + "bom-ref": "992b986aa390e081", "name": "/usr/include/nvshmem_13/non_abi/device/coll/alltoall.cuh", "type": "file" }, { - "bom-ref": "b0bbd4f8dc400067", + "bom-ref": "cb7b37dffb15fe26", "name": "/usr/include/nvshmem_13/non_abi/device/coll/barrier.cuh", "type": "file" }, { - "bom-ref": "41f5840b034295ef", + "bom-ref": "ba7c6b4fe46a7ec2", "name": "/usr/include/nvshmem_13/non_abi/device/coll/broadcast.cuh", "type": "file" }, { - "bom-ref": "341556ffd1a4a031", + "bom-ref": "5c420b25c4e13d90", "name": "/usr/include/nvshmem_13/non_abi/device/coll/defines.cuh", "type": "file" }, { - "bom-ref": "6f21063157489b2f", + "bom-ref": "5536226c71ffccf6", "name": "/usr/include/nvshmem_13/non_abi/device/coll/fcollect.cuh", "type": "file" }, { - "bom-ref": "ee42617114fd6071", + "bom-ref": "fe62fe789ca74cf4", "name": "/usr/include/nvshmem_13/non_abi/device/coll/reduce.cuh", "type": "file" }, { - "bom-ref": "7091319230996dcb", + "bom-ref": "d528fd3c2132d0ee", "name": "/usr/include/nvshmem_13/non_abi/device/coll/reducescatter.cuh", "type": "file" }, { - "bom-ref": "0185535bb5a5ec32", + "bom-ref": "00374c8476bca6e7", "name": "/usr/include/nvshmem_13/non_abi/device/coll/utils.cuh", "type": "file" }, { - "bom-ref": "56ec2e0efeea8445", + "bom-ref": "d43bebd8d2cb8014", "name": "/usr/include/nvshmem_13/non_abi/device/common/nvshmemi_common_device.cuh", "type": "file" }, { - "bom-ref": "442a83394a1a7ae6", + "bom-ref": "3b3e5a76158c2d80", + "name": "/usr/include/nvshmem_13/non_abi/device/common/nvshmemi_path_predicates.cuh", + "type": "file" + }, + { + "bom-ref": "e23135e5974200f3", "name": "/usr/include/nvshmem_13/non_abi/device/common/nvshmemi_tile_utils.cuh", "type": "file" }, { - "bom-ref": "de9a7c3e3513858a", + "bom-ref": "1f59392825fdf011", + "name": "/usr/include/nvshmem_13/non_abi/device/pt-to-pt/gdaki_device.cuh", + "type": "file" + }, + { + "bom-ref": "6257e2fcaa0d1323", "name": "/usr/include/nvshmem_13/non_abi/device/pt-to-pt/ibgda_device.cuh", "type": "file" }, { - "bom-ref": "66358a1aa9d23c6b", + "bom-ref": "38b181d6427181a2", "name": "/usr/include/nvshmem_13/non_abi/device/pt-to-pt/nvshmemi_transfer_api.cuh", "type": "file" }, { - "bom-ref": "ed2f2f2514d5f172", + "bom-ref": "96cae2db3d2daf77", + "name": "/usr/include/nvshmem_13/non_abi/device/pt-to-pt/nvshmemi_transfer_api_stubs.cuh", + "type": "file" + }, + { + "bom-ref": "5d70c740de20f52f", "name": "/usr/include/nvshmem_13/non_abi/device/pt-to-pt/proxy_device.cuh", "type": "file" }, { - "bom-ref": "e4ee06ce1b2dd082", + "bom-ref": "bd378de1a7f4342f", "name": "/usr/include/nvshmem_13/non_abi/device/pt-to-pt/tile.cuh", "type": "file" }, { - "bom-ref": "44e516ba02c77a44", + "bom-ref": "d0697bd821d85f27", + "name": "/usr/include/nvshmem_13/non_abi/device/pt-to-pt/tma_device.cuh", + "type": "file" + }, + { + "bom-ref": "c241404ccd1feec5", "name": "/usr/include/nvshmem_13/non_abi/device/pt-to-pt/transfer_device.cuh", "type": "file" }, { - "bom-ref": "8a15db09825f8864", + "bom-ref": "be8c8874891bf559", "name": "/usr/include/nvshmem_13/non_abi/device/pt-to-pt/utils_device.h", "type": "file" }, { - "bom-ref": "cd8be5e5b6d598fa", + "bom-ref": "d9b596a312395f47", "name": "/usr/include/nvshmem_13/non_abi/device/team/nvshmemi_team_defines.cuh", "type": "file" }, { - "bom-ref": "992b839ed4daf5ad", + "bom-ref": "6cae3b778332df90", "name": "/usr/include/nvshmem_13/non_abi/device/threadgroup/nvshmemi_common_device_defines.cuh", "type": "file" }, { - "bom-ref": "6cefd916866519f9", + "bom-ref": "854fa4efe24f2a60", "name": "/usr/include/nvshmem_13/non_abi/device/wait/nvshmemi_wait_until_apis.cuh", "type": "file" }, { - "bom-ref": "9496c47dcafc8b43", + "bom-ref": "a5c4fd7539a79f3a", "name": "/usr/include/nvshmem_13/non_abi/nvshmem_build_options.h", "type": "file" }, { - "bom-ref": "a4a8eb550dd20fe2", + "bom-ref": "a9c8505f90dac18b", "name": "/usr/include/nvshmem_13/non_abi/nvshmem_version.h", "type": "file" }, { - "bom-ref": "9bc83a5d363fe144", + "bom-ref": "1e5949d2e1fd7ce2", + "name": "/usr/include/nvshmem_13/non_abi/nvshmemi_cccl_compat.h", + "type": "file" + }, + { + "bom-ref": "420a6ccedad20261", "name": "/usr/include/nvshmem_13/non_abi/nvshmemx_error.h", "type": "file" }, { - "bom-ref": "cadc03ccb991a5b4", + "bom-ref": "31c591f60b7b3675", "name": "/usr/include/nvshmem_13/nvshmem.h", "type": "file" }, { - "bom-ref": "e98664654aa388d4", + "bom-ref": "0abaf46106444471", "name": "/usr/include/nvshmem_13/nvshmem_host.h", "type": "file" }, { - "bom-ref": "b5e2908fdcd84525", + "bom-ref": "40ae174d6c04cc08", "name": "/usr/include/nvshmem_13/nvshmemx.h", "type": "file" }, { - "bom-ref": "d9e309acd0088811", + "bom-ref": "e5da057be8b9581f", "name": "/usr/include/obstack.h", "type": "file" }, { - "bom-ref": "57cb571347cdc6db", + "bom-ref": "249666e6aaf81c85", "name": "/usr/include/panel.h", "type": "file" }, { - "bom-ref": "a2db0f30508afdb2", + "bom-ref": "faeed703c5d14240", "name": "/usr/include/paths.h", "type": "file" }, { - "bom-ref": "a6d84ecdde231beb", + "bom-ref": "f6c584f8923b5c3d", "name": "/usr/include/pgm-5.3/pgm/atomic.h", "type": "file" }, { - "bom-ref": "1bfcdcfb9b58b32f", + "bom-ref": "06c565883f8aafc1", "name": "/usr/include/pgm-5.3/pgm/engine.h", "type": "file" }, { - "bom-ref": "832afbb6a4a53750", + "bom-ref": "b53b545e362ef51a", "name": "/usr/include/pgm-5.3/pgm/error.h", "type": "file" }, { - "bom-ref": "e9aea6745ed7dd78", + "bom-ref": "ce253cc5da2f0936", "name": "/usr/include/pgm-5.3/pgm/gsi.h", "type": "file" }, { - "bom-ref": "3a5c46954f289d58", + "bom-ref": "aed2142d5f8ab41e", "name": "/usr/include/pgm-5.3/pgm/if.h", "type": "file" }, { - "bom-ref": "fccbef37f91725d1", + "bom-ref": "d687123fe5785077", "name": "/usr/include/pgm-5.3/pgm/in.h", "type": "file" }, { - "bom-ref": "3c96dd3863dae9b1", + "bom-ref": "06db1d3c9fddfa7f", "name": "/usr/include/pgm-5.3/pgm/list.h", "type": "file" }, { - "bom-ref": "deb77b1b277acc36", + "bom-ref": "b1760041de1a0f7c", "name": "/usr/include/pgm-5.3/pgm/macros.h", "type": "file" }, { - "bom-ref": "c0bd24026db83002", + "bom-ref": "204cbb545c57b268", "name": "/usr/include/pgm-5.3/pgm/mem.h", "type": "file" }, { - "bom-ref": "93b669902dab63ec", + "bom-ref": "a9fb8f3ea4dbf422", "name": "/usr/include/pgm-5.3/pgm/messages.h", "type": "file" }, { - "bom-ref": "7a3c710cbd405619", + "bom-ref": "e75409a4266a9a07", "name": "/usr/include/pgm-5.3/pgm/msgv.h", "type": "file" }, { - "bom-ref": "e03d1147e06ea915", + "bom-ref": "38132f37ba2d1037", "name": "/usr/include/pgm-5.3/pgm/packet.h", "type": "file" }, { - "bom-ref": "c6528b63d8aabf17", + "bom-ref": "d04be438f76c18bd", "name": "/usr/include/pgm-5.3/pgm/pgm.h", "type": "file" }, { - "bom-ref": "8d0ff04199f5f0ca", + "bom-ref": "af211523338a5c18", "name": "/usr/include/pgm-5.3/pgm/skbuff.h", "type": "file" }, { - "bom-ref": "19015cc5e043d5ed", + "bom-ref": "0a05fa4cfc14d147", "name": "/usr/include/pgm-5.3/pgm/socket.h", "type": "file" }, { - "bom-ref": "7a705f54836bd40a", + "bom-ref": "a90d332da02fe940", "name": "/usr/include/pgm-5.3/pgm/time.h", "type": "file" }, { - "bom-ref": "6811778050e7876b", + "bom-ref": "761aa0e77883d159", "name": "/usr/include/pgm-5.3/pgm/tsi.h", "type": "file" }, { - "bom-ref": "a3c8bc0ced8c421a", + "bom-ref": "b7a2696fa70c730c", "name": "/usr/include/pgm-5.3/pgm/types.h", "type": "file" }, { - "bom-ref": "3f36d5c1adfb8eec", + "bom-ref": "9b003c4f5dd7a73e", "name": "/usr/include/pgm-5.3/pgm/version.h", "type": "file" }, { - "bom-ref": "db848807e92b6c24", + "bom-ref": "a15135aed0abd1e6", "name": "/usr/include/pgm-5.3/pgm/winint.h", "type": "file" }, { - "bom-ref": "704567bd239c955d", + "bom-ref": "c4127c474ea063e7", "name": "/usr/include/pgm-5.3/pgm/wininttypes.h", "type": "file" }, { - "bom-ref": "12c505efdbdae4b6", + "bom-ref": "500ee4c288819648", "name": "/usr/include/pgm-5.3/pgm/zinttypes.h", "type": "file" }, { - "bom-ref": "2ad45602c9425b76", + "bom-ref": "225e2d2496c31304", "name": "/usr/include/poll.h", "type": "file" }, { - "bom-ref": "f6b3c36bd77612dc", + "bom-ref": "b4b57a6a8be30dce", "name": "/usr/include/printf.h", "type": "file" }, { - "bom-ref": "eaaf699b20490926", + "bom-ref": "32cc56dbf562c6d0", "name": "/usr/include/proc_service.h", "type": "file" }, { - "bom-ref": "74d8c24d3c9925fe", + "bom-ref": "4cefa067b6a20364", "name": "/usr/include/protocols/routed.h", "type": "file" }, { - "bom-ref": "fd3d9ee46fca0cb5", + "bom-ref": "6f91b5b5fcf09b0b", "name": "/usr/include/protocols/rwhod.h", "type": "file" }, { - "bom-ref": "90b44d4744d6e64e", + "bom-ref": "cede29fb3f50b1b8", "name": "/usr/include/protocols/talkd.h", "type": "file" }, { - "bom-ref": "f9de53301b041a65", + "bom-ref": "e56261ff42216e47", "name": "/usr/include/protocols/timed.h", "type": "file" }, { - "bom-ref": "20d275d03f68b666", + "bom-ref": "8bf43ee4f73c751c", "name": "/usr/include/pthread.h", "type": "file" }, { - "bom-ref": "03b23533620750fe", + "bom-ref": "f9a467cdbe16e968", "name": "/usr/include/pty.h", "type": "file" }, { - "bom-ref": "957a07d9174360a7", + "bom-ref": "a6f50d885de6aa4d", "name": "/usr/include/pwd.h", "type": "file" }, { - "bom-ref": "4f60b7f09b994615", + "bom-ref": "4d21a125bbadb56b", "name": "/usr/include/python3.12/Python.h", "type": "file" }, { - "bom-ref": "ab3e0e8868edfc66", + "bom-ref": "56aba59e88ab5fa4", "name": "/usr/include/python3.12/abstract.h", "type": "file" }, { - "bom-ref": "ec291fce413e47a9", + "bom-ref": "8a8f5319868e60ff", "name": "/usr/include/python3.12/bltinmodule.h", "type": "file" }, { - "bom-ref": "f69001c26a092caa", + "bom-ref": "4cb23d74bba01d04", "name": "/usr/include/python3.12/boolobject.h", "type": "file" }, { - "bom-ref": "d3ba3fbde4757ef8", + "bom-ref": "c144e7a1ded12dce", "name": "/usr/include/python3.12/bytearrayobject.h", "type": "file" }, { - "bom-ref": "fdcfd91f94d02828", + "bom-ref": "075492f5ae6bab1e", "name": "/usr/include/python3.12/bytesobject.h", "type": "file" }, { - "bom-ref": "097ed93357271f52", + "bom-ref": "229410e6d5a69778", "name": "/usr/include/python3.12/ceval.h", "type": "file" }, { - "bom-ref": "1f88809a0f0b7818", + "bom-ref": "204d79414f455ab6", "name": "/usr/include/python3.12/codecs.h", "type": "file" }, { - "bom-ref": "4b893a2276d5f37f", + "bom-ref": "8c31253e92a30489", "name": "/usr/include/python3.12/compile.h", "type": "file" }, { - "bom-ref": "896460b2962c523d", + "bom-ref": "496c7b809eabfb73", "name": "/usr/include/python3.12/complexobject.h", "type": "file" }, { - "bom-ref": "7673a3a5b3f3e661", + "bom-ref": "bc8c2d7746629303", "name": "/usr/include/python3.12/cpython/abstract.h", "type": "file" }, { - "bom-ref": "169a2c35fd57594c", + "bom-ref": "d3632e37eb893756", "name": "/usr/include/python3.12/cpython/bytearrayobject.h", "type": "file" }, { - "bom-ref": "fd169d651e611de8", + "bom-ref": "ade00859610bf44e", "name": "/usr/include/python3.12/cpython/bytesobject.h", "type": "file" }, { - "bom-ref": "7f18f76763a6963a", + "bom-ref": "8c916e1c62bbf5b4", "name": "/usr/include/python3.12/cpython/cellobject.h", "type": "file" }, { - "bom-ref": "14abf9e042359db8", + "bom-ref": "827714d0082576fa", "name": "/usr/include/python3.12/cpython/ceval.h", "type": "file" }, { - "bom-ref": "dffa81ffec47f13c", + "bom-ref": "805e61b08f738c62", "name": "/usr/include/python3.12/cpython/classobject.h", "type": "file" }, { - "bom-ref": "8f08d7fe4e9b7b37", + "bom-ref": "e7e4a48ec6b90a9d", "name": "/usr/include/python3.12/cpython/code.h", "type": "file" }, { - "bom-ref": "0c041af7a594ea74", + "bom-ref": "204e25df41c43476", "name": "/usr/include/python3.12/cpython/compile.h", "type": "file" }, { - "bom-ref": "6bb403da7723219c", + "bom-ref": "6d7c2d0902d5ff06", "name": "/usr/include/python3.12/cpython/complexobject.h", "type": "file" }, { - "bom-ref": "fd59b3f8a629aa18", + "bom-ref": "c7349f02cd974972", "name": "/usr/include/python3.12/cpython/context.h", "type": "file" }, { - "bom-ref": "cfe9ab3addc63f9d", + "bom-ref": "a3aff76a7e810c73", "name": "/usr/include/python3.12/cpython/descrobject.h", "type": "file" }, { - "bom-ref": "6d7a16888a94f67a", + "bom-ref": "6a3e23fc783e85d0", "name": "/usr/include/python3.12/cpython/dictobject.h", "type": "file" }, { - "bom-ref": "764a1f9bf6498243", + "bom-ref": "2154f05cedd88df1", "name": "/usr/include/python3.12/cpython/fileobject.h", "type": "file" }, { - "bom-ref": "13afe72784b7c539", + "bom-ref": "610a7a8074686cff", "name": "/usr/include/python3.12/cpython/fileutils.h", "type": "file" }, { - "bom-ref": "c68b0299a6c45694", + "bom-ref": "62f0dac2fa856b02", "name": "/usr/include/python3.12/cpython/floatobject.h", "type": "file" }, { - "bom-ref": "9c145775e5ee8feb", + "bom-ref": "975b985572277c5d", "name": "/usr/include/python3.12/cpython/frameobject.h", "type": "file" }, { - "bom-ref": "0f4bd85e51958e8e", + "bom-ref": "8e5dc32474dc0518", "name": "/usr/include/python3.12/cpython/funcobject.h", "type": "file" }, { - "bom-ref": "fae1e79ece08e079", + "bom-ref": "5f7593b25c4fd07f", "name": "/usr/include/python3.12/cpython/genobject.h", "type": "file" }, { - "bom-ref": "8245c794afc0df51", + "bom-ref": "2b065377e5c741e7", "name": "/usr/include/python3.12/cpython/import.h", "type": "file" }, { - "bom-ref": "efd3a72b4008d850", + "bom-ref": "45937b826452f476", "name": "/usr/include/python3.12/cpython/initconfig.h", "type": "file" }, { - "bom-ref": "881443f6ef3e675f", + "bom-ref": "00b0a6e292b04321", "name": "/usr/include/python3.12/cpython/interpreteridobject.h", "type": "file" }, { - "bom-ref": "308d3e4cc5e5542a", + "bom-ref": "3f1e492fe37074e4", "name": "/usr/include/python3.12/cpython/listobject.h", "type": "file" }, { - "bom-ref": "eb65edb4c93176f4", + "bom-ref": "28d7c4979813fd46", "name": "/usr/include/python3.12/cpython/longintrepr.h", "type": "file" }, { - "bom-ref": "7377c708160d5734", + "bom-ref": "473a3c52fc4f5a86", "name": "/usr/include/python3.12/cpython/longobject.h", "type": "file" }, { - "bom-ref": "7b45007827ef83fe", + "bom-ref": "70d98ce63cf46400", "name": "/usr/include/python3.12/cpython/memoryobject.h", "type": "file" }, { - "bom-ref": "1e99ec73432b22e9", + "bom-ref": "966199aebec802b7", "name": "/usr/include/python3.12/cpython/methodobject.h", "type": "file" }, { - "bom-ref": "ae1670b2402d922b", + "bom-ref": "5c7bf0d7c972568d", "name": "/usr/include/python3.12/cpython/modsupport.h", "type": "file" }, { - "bom-ref": "bb1ec9517122baec", + "bom-ref": "391d28437f4982fa", "name": "/usr/include/python3.12/cpython/object.h", "type": "file" }, { - "bom-ref": "a7f5e29ee4e7637b", + "bom-ref": "b732553552646ffd", "name": "/usr/include/python3.12/cpython/objimpl.h", "type": "file" }, { - "bom-ref": "db3e85cad238b70c", + "bom-ref": "9be0f2134b88d6ea", "name": "/usr/include/python3.12/cpython/odictobject.h", "type": "file" }, { - "bom-ref": "feb492c299eb3174", + "bom-ref": "e6e56e51c03e1186", "name": "/usr/include/python3.12/cpython/picklebufobject.h", "type": "file" }, { - "bom-ref": "6f5c4e4e92bdd822", + "bom-ref": "bd052cea294e5388", "name": "/usr/include/python3.12/cpython/pthread_stubs.h", "type": "file" }, { - "bom-ref": "0346bd9e13108829", + "bom-ref": "72f8589675235f6f", "name": "/usr/include/python3.12/cpython/pyctype.h", "type": "file" }, { - "bom-ref": "ef8a2b4fb7163904", + "bom-ref": "39beab3d183c9532", "name": "/usr/include/python3.12/cpython/pydebug.h", "type": "file" }, { - "bom-ref": "156646279b3133b2", + "bom-ref": "ee843580f27d715c", "name": "/usr/include/python3.12/cpython/pyerrors.h", "type": "file" }, { - "bom-ref": "33e74c1e428e5eeb", + "bom-ref": "bd6a7e0fcea5e301", "name": "/usr/include/python3.12/cpython/pyfpe.h", "type": "file" }, { - "bom-ref": "174a57cedd69c12c", + "bom-ref": "ea724fcb4cebb30e", "name": "/usr/include/python3.12/cpython/pyframe.h", "type": "file" }, { - "bom-ref": "19437969580dd067", + "bom-ref": "8fdeb9cb85e06aa5", "name": "/usr/include/python3.12/cpython/pylifecycle.h", "type": "file" }, { - "bom-ref": "e2ecc6e27a98daf7", + "bom-ref": "07b5653c74aadaed", "name": "/usr/include/python3.12/cpython/pymem.h", "type": "file" }, { - "bom-ref": "aa34966c63405efd", + "bom-ref": "dea088bc3b95df6b", "name": "/usr/include/python3.12/cpython/pystate.h", "type": "file" }, { - "bom-ref": "517fd4302334b6ff", + "bom-ref": "3b66acffe3d47761", "name": "/usr/include/python3.12/cpython/pythonrun.h", "type": "file" }, { - "bom-ref": "3ef97523cda1ac20", + "bom-ref": "d779d35eb77bb30e", "name": "/usr/include/python3.12/cpython/pythread.h", "type": "file" }, { - "bom-ref": "4b910ddb89e8dd94", + "bom-ref": "82eadc6d55aaa446", "name": "/usr/include/python3.12/cpython/pytime.h", "type": "file" }, { - "bom-ref": "4ad3065212297fe6", + "bom-ref": "465ac7ed90105948", "name": "/usr/include/python3.12/cpython/setobject.h", "type": "file" }, { - "bom-ref": "189987367b4e3c3e", + "bom-ref": "3bc3c365c0ef8d2c", "name": "/usr/include/python3.12/cpython/sysmodule.h", "type": "file" }, { - "bom-ref": "de191d3bee76b2ac", + "bom-ref": "8e8964a99791529e", "name": "/usr/include/python3.12/cpython/traceback.h", "type": "file" }, { - "bom-ref": "e11b60f13b12b6ca", + "bom-ref": "a7680ae25b85a664", "name": "/usr/include/python3.12/cpython/tupleobject.h", "type": "file" }, { - "bom-ref": "05eccdff88655f91", + "bom-ref": "c686b51237a0c3df", "name": "/usr/include/python3.12/cpython/unicodeobject.h", "type": "file" }, { - "bom-ref": "f3e2f910c8df570f", + "bom-ref": "6fe1c2dfd0a17b4d", "name": "/usr/include/python3.12/cpython/warnings.h", "type": "file" }, { - "bom-ref": "7da82d5d995b87dc", + "bom-ref": "f1fe05b5e8bf918a", "name": "/usr/include/python3.12/cpython/weakrefobject.h", "type": "file" }, { - "bom-ref": "64a82dbe4e9a963c", + "bom-ref": "fc55f3ac32b8996e", "name": "/usr/include/python3.12/datetime.h", "type": "file" }, { - "bom-ref": "10899f324d4ee743", + "bom-ref": "4a6cb8f1cd638b99", "name": "/usr/include/python3.12/descrobject.h", "type": "file" }, { - "bom-ref": "fca2295520cebee7", + "bom-ref": "75821d1c95113079", "name": "/usr/include/python3.12/dictobject.h", "type": "file" }, { - "bom-ref": "71d7241566834bf5", + "bom-ref": "760a4453be5e45a3", "name": "/usr/include/python3.12/dynamic_annotations.h", "type": "file" }, { - "bom-ref": "96d5f7adda886600", + "bom-ref": "4d708afb990cd652", "name": "/usr/include/python3.12/enumobject.h", "type": "file" }, { - "bom-ref": "8d3896ffbab3b426", + "bom-ref": "1566a6453a689bd4", "name": "/usr/include/python3.12/errcode.h", "type": "file" }, { - "bom-ref": "99671293c1ea044f", + "bom-ref": "16506351ef4a934d", "name": "/usr/include/python3.12/exports.h", "type": "file" }, { - "bom-ref": "e2004a0499019f5f", + "bom-ref": "afbc330d6ce8c9d5", "name": "/usr/include/python3.12/fileobject.h", "type": "file" }, { - "bom-ref": "0b2fbca1ce8907a8", + "bom-ref": "a7278b6c2b08de46", "name": "/usr/include/python3.12/fileutils.h", "type": "file" }, { - "bom-ref": "00c4703655599c72", + "bom-ref": "a63bf1f65dc357f4", "name": "/usr/include/python3.12/floatobject.h", "type": "file" }, { - "bom-ref": "172d32132444503b", + "bom-ref": "4716a5892682f469", "name": "/usr/include/python3.12/frameobject.h", "type": "file" }, { - "bom-ref": "42383f572d483e0b", + "bom-ref": "23f2a5c5c33cbcf5", "name": "/usr/include/python3.12/genericaliasobject.h", "type": "file" }, { - "bom-ref": "4a536e82e3c87129", + "bom-ref": "4bc5085f6ab970d7", "name": "/usr/include/python3.12/import.h", "type": "file" }, { - "bom-ref": "af4d413c146f061b", + "bom-ref": "e6f3a7feba79a37d", "name": "/usr/include/python3.12/internal/pycore_abstract.h", "type": "file" }, { - "bom-ref": "9ce733de04bc0e98", + "bom-ref": "f289e8b883f49ff2", "name": "/usr/include/python3.12/internal/pycore_asdl.h", "type": "file" }, { - "bom-ref": "c265d0fde52e20ed", + "bom-ref": "970c6da9014eda37", "name": "/usr/include/python3.12/internal/pycore_ast.h", "type": "file" }, { - "bom-ref": "706559297d45ce55", + "bom-ref": "db121b47732dccb7", "name": "/usr/include/python3.12/internal/pycore_ast_state.h", "type": "file" }, { - "bom-ref": "1cc87be073ebfae9", + "bom-ref": "062886563d5de05b", "name": "/usr/include/python3.12/internal/pycore_atexit.h", "type": "file" }, { - "bom-ref": "0fbe3f9ff270acea", + "bom-ref": "1cca1b4a041bf0e0", "name": "/usr/include/python3.12/internal/pycore_atomic.h", "type": "file" }, { - "bom-ref": "99a33174d2fb82a3", + "bom-ref": "d1807b80c1cc27a9", "name": "/usr/include/python3.12/internal/pycore_atomic_funcs.h", "type": "file" }, { - "bom-ref": "a37b5a65f2757ac3", + "bom-ref": "92bee73081ae4011", "name": "/usr/include/python3.12/internal/pycore_bitutils.h", "type": "file" }, { - "bom-ref": "48488d5c7e5dea01", + "bom-ref": "e9de8700e0dccb77", "name": "/usr/include/python3.12/internal/pycore_blocks_output_buffer.h", "type": "file" }, { - "bom-ref": "b4ee944f4a631b27", + "bom-ref": "f87cb7246274272d", "name": "/usr/include/python3.12/internal/pycore_bytes_methods.h", "type": "file" }, { - "bom-ref": "edc2a75898393b55", + "bom-ref": "aa0d2b78dea76f87", "name": "/usr/include/python3.12/internal/pycore_bytesobject.h", "type": "file" }, { - "bom-ref": "1694896fa8ae89a4", + "bom-ref": "828aa7e43db50d2e", "name": "/usr/include/python3.12/internal/pycore_call.h", "type": "file" }, { - "bom-ref": "cb0e812df656cb32", + "bom-ref": "f4dfa54234f30938", "name": "/usr/include/python3.12/internal/pycore_ceval.h", "type": "file" }, { - "bom-ref": "9b9f241b685b1bd1", + "bom-ref": "7d7ef2d2eed8e437", "name": "/usr/include/python3.12/internal/pycore_ceval_state.h", "type": "file" }, { - "bom-ref": "37254d431dc587eb", + "bom-ref": "0598c4b4896a383d", "name": "/usr/include/python3.12/internal/pycore_code.h", "type": "file" }, { - "bom-ref": "57ed1687f11d25f0", + "bom-ref": "cc9549f815cadaa2", "name": "/usr/include/python3.12/internal/pycore_compile.h", "type": "file" }, { - "bom-ref": "d6d41746fee3f6bd", + "bom-ref": "1107989e26fca1a7", "name": "/usr/include/python3.12/internal/pycore_condvar.h", "type": "file" }, { - "bom-ref": "b214b930852c7179", + "bom-ref": "e8937f677abdbfdb", "name": "/usr/include/python3.12/internal/pycore_context.h", "type": "file" }, { - "bom-ref": "e625d087f64f30c3", + "bom-ref": "2d5c3d71f027dfe9", "name": "/usr/include/python3.12/internal/pycore_descrobject.h", "type": "file" }, { - "bom-ref": "40a953810abc2576", + "bom-ref": "210510fb58a7b084", "name": "/usr/include/python3.12/internal/pycore_dict.h", "type": "file" }, { - "bom-ref": "7ef00cdb494b70a9", + "bom-ref": "b0b11ae8961776cf", "name": "/usr/include/python3.12/internal/pycore_dict_state.h", "type": "file" }, { - "bom-ref": "a9c328d78523d416", + "bom-ref": "d44035b527f8da48", "name": "/usr/include/python3.12/internal/pycore_dtoa.h", "type": "file" }, { - "bom-ref": "dbbfe927bbc6afcc", + "bom-ref": "189a322b6e5ea6e6", "name": "/usr/include/python3.12/internal/pycore_emscripten_signal.h", "type": "file" }, { - "bom-ref": "23eb2dee6adb57f8", + "bom-ref": "510453e81ecbc99a", "name": "/usr/include/python3.12/internal/pycore_exceptions.h", "type": "file" }, { - "bom-ref": "c55068e2b1733531", + "bom-ref": "0a64ed109f325e0b", "name": "/usr/include/python3.12/internal/pycore_faulthandler.h", "type": "file" }, { - "bom-ref": "6fe88e1693b4bde0", + "bom-ref": "ab53bb1c21bf79ae", "name": "/usr/include/python3.12/internal/pycore_fileutils.h", "type": "file" }, { - "bom-ref": "813c57aeeb85a61b", + "bom-ref": "5a55082d0d2fa531", "name": "/usr/include/python3.12/internal/pycore_fileutils_windows.h", "type": "file" }, { - "bom-ref": "f988f964a90dae81", + "bom-ref": "e90058308172819b", "name": "/usr/include/python3.12/internal/pycore_floatobject.h", "type": "file" }, { - "bom-ref": "3e816ff227b34978", + "bom-ref": "285477d8f49ec1a6", "name": "/usr/include/python3.12/internal/pycore_flowgraph.h", "type": "file" }, { - "bom-ref": "43ebc2bea4af769b", + "bom-ref": "bf61ee15dee3beed", "name": "/usr/include/python3.12/internal/pycore_format.h", "type": "file" }, { - "bom-ref": "39d838da2cbda6d0", + "bom-ref": "418c20fafe320d9a", "name": "/usr/include/python3.12/internal/pycore_frame.h", "type": "file" }, { - "bom-ref": "166ca48f63964d0e", + "bom-ref": "4f77bf8b79528768", "name": "/usr/include/python3.12/internal/pycore_function.h", "type": "file" }, { - "bom-ref": "37fe1300fa0b52c6", + "bom-ref": "65231f68aa264684", "name": "/usr/include/python3.12/internal/pycore_gc.h", "type": "file" }, { - "bom-ref": "023f1da4507c1d30", + "bom-ref": "2cf6f7e5bd057622", "name": "/usr/include/python3.12/internal/pycore_genobject.h", "type": "file" }, { - "bom-ref": "45fda9438eb7f889", + "bom-ref": "490c186bed716e4f", "name": "/usr/include/python3.12/internal/pycore_getopt.h", "type": "file" }, { - "bom-ref": "9753de65aa8a137f", + "bom-ref": "520a8f9e70c48569", "name": "/usr/include/python3.12/internal/pycore_gil.h", "type": "file" }, { - "bom-ref": "5127c9e0dcb60795", + "bom-ref": "4498a2a68cd924ab", "name": "/usr/include/python3.12/internal/pycore_global_objects.h", "type": "file" }, { - "bom-ref": "d47b9e38db1e01a1", + "bom-ref": "e8a3d01cb6a4fb67", "name": "/usr/include/python3.12/internal/pycore_global_objects_fini_generated.h", "type": "file" }, { - "bom-ref": "f2a7b92cd5bf7881", + "bom-ref": "eed627e6f58dc9b3", "name": "/usr/include/python3.12/internal/pycore_global_strings.h", "type": "file" }, { - "bom-ref": "e41eae644e6ab528", + "bom-ref": "3a6dda7f3f6c6c92", "name": "/usr/include/python3.12/internal/pycore_hamt.h", "type": "file" }, { - "bom-ref": "b48b56d5ec6b1e11", + "bom-ref": "b605766b5627bde7", "name": "/usr/include/python3.12/internal/pycore_hashtable.h", "type": "file" }, { - "bom-ref": "b90a9ded6b61b824", + "bom-ref": "275bf1594b1f38c2", "name": "/usr/include/python3.12/internal/pycore_import.h", "type": "file" }, { - "bom-ref": "14ae89e8cffa75e0", + "bom-ref": "080d0783c0ab26d6", "name": "/usr/include/python3.12/internal/pycore_initconfig.h", "type": "file" }, { - "bom-ref": "5c190c1b177bfc0b", + "bom-ref": "684eafda3e3aa9bd", "name": "/usr/include/python3.12/internal/pycore_instruments.h", "type": "file" }, { - "bom-ref": "da7e1f86d7cccd8e", + "bom-ref": "36a78e861721318c", "name": "/usr/include/python3.12/internal/pycore_interp.h", "type": "file" }, { - "bom-ref": "4a92429dbbe5cc50", + "bom-ref": "cad8127245b4f71a", "name": "/usr/include/python3.12/internal/pycore_intrinsics.h", "type": "file" }, { - "bom-ref": "2af232e0f4046ca1", + "bom-ref": "c3abf5fd0b48f6bb", "name": "/usr/include/python3.12/internal/pycore_list.h", "type": "file" }, { - "bom-ref": "bf4e6dbff3507fcf", + "bom-ref": "a3bfe69e8ad9bd01", "name": "/usr/include/python3.12/internal/pycore_long.h", "type": "file" }, { - "bom-ref": "09361a1baeed8161", + "bom-ref": "7c92cd8efcc005d7", "name": "/usr/include/python3.12/internal/pycore_memoryobject.h", "type": "file" }, { - "bom-ref": "467012426f1f7645", + "bom-ref": "cd7dc6c00dba15f7", "name": "/usr/include/python3.12/internal/pycore_moduleobject.h", "type": "file" }, { - "bom-ref": "fadddca47933447d", + "bom-ref": "78432a68a1be676f", "name": "/usr/include/python3.12/internal/pycore_namespace.h", "type": "file" }, { - "bom-ref": "5f056494a06d6fbe", + "bom-ref": "697c3d71537141fc", "name": "/usr/include/python3.12/internal/pycore_object.h", "type": "file" }, { - "bom-ref": "ab33ed24e44ca433", + "bom-ref": "24228c9f3ac11c8d", "name": "/usr/include/python3.12/internal/pycore_object_state.h", "type": "file" }, { - "bom-ref": "40b3c8050dd5f2eb", + "bom-ref": "1d1b6e97fc7e44b1", "name": "/usr/include/python3.12/internal/pycore_obmalloc.h", "type": "file" }, { - "bom-ref": "393831014ef8885e", + "bom-ref": "86376b5e9ec7a5b4", "name": "/usr/include/python3.12/internal/pycore_obmalloc_init.h", "type": "file" }, { - "bom-ref": "3ea791ec9a6ef67c", + "bom-ref": "7d24fb16f5bbd6d6", "name": "/usr/include/python3.12/internal/pycore_opcode.h", "type": "file" }, { - "bom-ref": "fbcdb40c2f090cc9", + "bom-ref": "218b0b654dc319c7", "name": "/usr/include/python3.12/internal/pycore_opcode_utils.h", "type": "file" }, { - "bom-ref": "2c464c0ad8e0095c", + "bom-ref": "5e736d3a9a044f86", "name": "/usr/include/python3.12/internal/pycore_parser.h", "type": "file" }, { - "bom-ref": "6414d9ebdfa1b3bc", + "bom-ref": "53e98bd114d5720a", "name": "/usr/include/python3.12/internal/pycore_pathconfig.h", "type": "file" }, { - "bom-ref": "2f324904a5a86121", + "bom-ref": "953c79a3ab12aa7f", "name": "/usr/include/python3.12/internal/pycore_pyarena.h", "type": "file" }, { - "bom-ref": "bacfe37e47ab9ccf", + "bom-ref": "01a57c12a01c89a1", "name": "/usr/include/python3.12/internal/pycore_pyerrors.h", "type": "file" }, { - "bom-ref": "92be7b31d800fbbf", + "bom-ref": "af20be23f7c65935", "name": "/usr/include/python3.12/internal/pycore_pyhash.h", "type": "file" }, { - "bom-ref": "aafeb3e895b6a497", + "bom-ref": "1b62f49d06fe78dd", "name": "/usr/include/python3.12/internal/pycore_pylifecycle.h", "type": "file" }, { - "bom-ref": "c3025cbb0de071ae", + "bom-ref": "cd41a2c9a414c8ac", "name": "/usr/include/python3.12/internal/pycore_pymath.h", "type": "file" }, { - "bom-ref": "11193ab4fe5bce9d", + "bom-ref": "c421de804d5812c3", "name": "/usr/include/python3.12/internal/pycore_pymem.h", "type": "file" }, { - "bom-ref": "4570306c162ebc5e", + "bom-ref": "fcaac14a3d489334", "name": "/usr/include/python3.12/internal/pycore_pymem_init.h", "type": "file" }, { - "bom-ref": "6084fe4ac95765ea", + "bom-ref": "459c9b5f9e109ee8", "name": "/usr/include/python3.12/internal/pycore_pystate.h", "type": "file" }, { - "bom-ref": "548a54f22d5a571c", + "bom-ref": "44f21ed52e5ff4ee", "name": "/usr/include/python3.12/internal/pycore_pythread.h", "type": "file" }, { - "bom-ref": "fdb05e31f4fc9161", + "bom-ref": "41f2a459e796c1b7", "name": "/usr/include/python3.12/internal/pycore_range.h", "type": "file" }, { - "bom-ref": "cca7a72d7a073e78", + "bom-ref": "56aa318bada85d5e", "name": "/usr/include/python3.12/internal/pycore_runtime.h", "type": "file" }, { - "bom-ref": "ba2ef9819d3d108e", + "bom-ref": "e7a495ad91d7d348", "name": "/usr/include/python3.12/internal/pycore_runtime_init.h", "type": "file" }, { - "bom-ref": "7932fe2d016c0d15", + "bom-ref": "5293aa30e0a108cb", "name": "/usr/include/python3.12/internal/pycore_runtime_init_generated.h", "type": "file" }, { - "bom-ref": "719b32a8799c7ce0", + "bom-ref": "fffaa57447f011ee", "name": "/usr/include/python3.12/internal/pycore_signal.h", "type": "file" }, { - "bom-ref": "d438c737265c6927", + "bom-ref": "9fa4069f7222e229", "name": "/usr/include/python3.12/internal/pycore_sliceobject.h", "type": "file" }, { - "bom-ref": "c5257af74658ae63", + "bom-ref": "2e101860522e5479", "name": "/usr/include/python3.12/internal/pycore_strhex.h", "type": "file" }, { - "bom-ref": "e80e1c98c292e44e", + "bom-ref": "cf9ce1b15152a394", "name": "/usr/include/python3.12/internal/pycore_structseq.h", "type": "file" }, { - "bom-ref": "4a9c2348f4837bd1", + "bom-ref": "bbb653c6c38f8f9b", "name": "/usr/include/python3.12/internal/pycore_symtable.h", "type": "file" }, { - "bom-ref": "73c2a25aa8622d9b", + "bom-ref": "732b3317aab8097d", "name": "/usr/include/python3.12/internal/pycore_sysmodule.h", "type": "file" }, { - "bom-ref": "00f02ff1bbeaf748", + "bom-ref": "3dc5519df5e1b182", "name": "/usr/include/python3.12/internal/pycore_time.h", "type": "file" }, { - "bom-ref": "c67bcfb5f46dbaec", + "bom-ref": "7e6f15c24b845516", "name": "/usr/include/python3.12/internal/pycore_token.h", "type": "file" }, { - "bom-ref": "6f16586805e05572", + "bom-ref": "a60ac648b4683ff8", "name": "/usr/include/python3.12/internal/pycore_traceback.h", "type": "file" }, { - "bom-ref": "ac676b6834e56269", + "bom-ref": "cea5266bc93135f7", "name": "/usr/include/python3.12/internal/pycore_tracemalloc.h", "type": "file" }, { - "bom-ref": "4b96dfdf776b9b3c", + "bom-ref": "ffeb186a4f9d68ea", "name": "/usr/include/python3.12/internal/pycore_tuple.h", "type": "file" }, { - "bom-ref": "f34ca78630b01d59", + "bom-ref": "acba1b57ed365e9f", "name": "/usr/include/python3.12/internal/pycore_typeobject.h", "type": "file" }, { - "bom-ref": "2927e13827ab60e7", + "bom-ref": "c5e46183647d30f1", "name": "/usr/include/python3.12/internal/pycore_typevarobject.h", "type": "file" }, { - "bom-ref": "31ffa045c03491bf", + "bom-ref": "28a3f80c6f1507fd", "name": "/usr/include/python3.12/internal/pycore_ucnhash.h", "type": "file" }, { - "bom-ref": "e24fb72aff79fcce", + "bom-ref": "3ec1279c8952b174", "name": "/usr/include/python3.12/internal/pycore_unicodeobject.h", "type": "file" }, { - "bom-ref": "2de96d70e85f015d", + "bom-ref": "5b282060a361eeaf", "name": "/usr/include/python3.12/internal/pycore_unicodeobject_generated.h", "type": "file" }, { - "bom-ref": "f0a9b722ba23b6e8", + "bom-ref": "58f4b9c7ff777d72", "name": "/usr/include/python3.12/internal/pycore_unionobject.h", "type": "file" }, { - "bom-ref": "2ebdd795b9857d82", + "bom-ref": "725e339abb75e930", "name": "/usr/include/python3.12/internal/pycore_warnings.h", "type": "file" }, { - "bom-ref": "fa719b867d3c16c0", + "bom-ref": "10e15b7533f954e6", "name": "/usr/include/python3.12/interpreteridobject.h", "type": "file" }, { - "bom-ref": "c4628c1b06a262df", + "bom-ref": "257ab29d0585db61", "name": "/usr/include/python3.12/intrcheck.h", "type": "file" }, { - "bom-ref": "cec7e4a1b3473a71", + "bom-ref": "79e39711c1f97a8f", "name": "/usr/include/python3.12/iterobject.h", "type": "file" }, { - "bom-ref": "e78ce0f3d6d5a406", + "bom-ref": "66874c0ba2052c10", "name": "/usr/include/python3.12/listobject.h", "type": "file" }, { - "bom-ref": "6f8c734ef49b0b0f", + "bom-ref": "e9ee1d6ea10efde5", "name": "/usr/include/python3.12/longobject.h", "type": "file" }, { - "bom-ref": "8b7cbbfd1e9257db", + "bom-ref": "d6a010a688d99bc9", "name": "/usr/include/python3.12/marshal.h", "type": "file" }, { - "bom-ref": "153044f518130e6e", + "bom-ref": "07eef683a2448d20", "name": "/usr/include/python3.12/memoryobject.h", "type": "file" }, { - "bom-ref": "bf452b8214ca942c", + "bom-ref": "d5896fe36017c5aa", "name": "/usr/include/python3.12/methodobject.h", "type": "file" }, { - "bom-ref": "2b52e69b7a38549b", + "bom-ref": "58de9ef020ddf495", "name": "/usr/include/python3.12/modsupport.h", "type": "file" }, { - "bom-ref": "4df0f918a8b39f0f", + "bom-ref": "5c63aa7e94023fad", "name": "/usr/include/python3.12/moduleobject.h", "type": "file" }, { - "bom-ref": "a9217435d13f5479", + "bom-ref": "114a3aee5065f8bb", "name": "/usr/include/python3.12/object.h", "type": "file" }, { - "bom-ref": "8f371a9b90d4379e", + "bom-ref": "34945d1c1eeadc28", "name": "/usr/include/python3.12/objimpl.h", "type": "file" }, { - "bom-ref": "4f4ba9d76983cc8b", + "bom-ref": "441e4965250370dd", "name": "/usr/include/python3.12/opcode.h", "type": "file" }, { - "bom-ref": "0be3193f5e8331ae", + "bom-ref": "0c274f2e809f9500", "name": "/usr/include/python3.12/osdefs.h", "type": "file" }, { - "bom-ref": "5c729b8daa96d337", + "bom-ref": "bd29b8e4e03c6381", "name": "/usr/include/python3.12/osmodule.h", "type": "file" }, { - "bom-ref": "49147d271abee472", + "bom-ref": "78001892d62b1730", "name": "/usr/include/python3.12/patchlevel.h", "type": "file" }, { - "bom-ref": "254c7f7d961bac3b", + "bom-ref": "ffd186928af1011d", "name": "/usr/include/python3.12/py_curses.h", "type": "file" }, { - "bom-ref": "43c80939b204323d", + "bom-ref": "dbb69ebff4c2221b", "name": "/usr/include/python3.12/pybuffer.h", "type": "file" }, { - "bom-ref": "9a31547e10de5fdb", + "bom-ref": "063ba0662b987981", "name": "/usr/include/python3.12/pycapsule.h", "type": "file" }, { - "bom-ref": "234c93b7999d4e39", + "bom-ref": "3b1182b7c295400b", "name": "/usr/include/python3.12/pyconfig.h", "type": "file" }, { - "bom-ref": "029e058093b5b440", + "bom-ref": "679529da7106636e", "name": "/usr/include/python3.12/pydtrace.h", "type": "file" }, { - "bom-ref": "fa7fbfbfd4f9c222", + "bom-ref": "77302daa81658b74", "name": "/usr/include/python3.12/pyerrors.h", "type": "file" }, { - "bom-ref": "1bd835cfc7b0328d", + "bom-ref": "0b7cb2dc4cdb8283", "name": "/usr/include/python3.12/pyexpat.h", "type": "file" }, { - "bom-ref": "445d913daafc42f1", + "bom-ref": "2333089514c1f2ab", "name": "/usr/include/python3.12/pyframe.h", "type": "file" }, { - "bom-ref": "1220981c87bbd9fb", + "bom-ref": "ef8793e262d0d801", "name": "/usr/include/python3.12/pyhash.h", "type": "file" }, { - "bom-ref": "3269804c66c7796b", + "bom-ref": "16e2dca99f5e1455", "name": "/usr/include/python3.12/pylifecycle.h", "type": "file" }, { - "bom-ref": "69543e2358216dda", + "bom-ref": "a278bf55350d8808", "name": "/usr/include/python3.12/pymacconfig.h", "type": "file" }, { - "bom-ref": "e6881021ccafeeda", + "bom-ref": "2232a5150950b3d8", "name": "/usr/include/python3.12/pymacro.h", "type": "file" }, { - "bom-ref": "219ad3f0fe08795e", + "bom-ref": "0ee551f6f65b945c", "name": "/usr/include/python3.12/pymath.h", "type": "file" }, { - "bom-ref": "0c72a43a7c7c50c5", + "bom-ref": "59977b78c67593b7", "name": "/usr/include/python3.12/pymem.h", "type": "file" }, { - "bom-ref": "c814ca4b73bf1f30", + "bom-ref": "250e4d1d89997452", "name": "/usr/include/python3.12/pyport.h", "type": "file" }, { - "bom-ref": "ff6790cd3531b7a6", + "bom-ref": "5a6b1c5cb12989c4", "name": "/usr/include/python3.12/pystate.h", "type": "file" }, { - "bom-ref": "71e0e48da4bd83bc", + "bom-ref": "cacceb97b0a3b4ce", "name": "/usr/include/python3.12/pystats.h", "type": "file" }, { - "bom-ref": "5cef570d51c3aa10", + "bom-ref": "c07714d08c2d4a46", "name": "/usr/include/python3.12/pystrcmp.h", "type": "file" }, { - "bom-ref": "48d9ea16766bc23a", + "bom-ref": "81f92b7f90a5f6c0", "name": "/usr/include/python3.12/pystrtod.h", "type": "file" }, { - "bom-ref": "f6df55bdb0519905", + "bom-ref": "a6593d70a8902ce3", "name": "/usr/include/python3.12/pythonrun.h", "type": "file" }, { - "bom-ref": "340efc3782b4835c", + "bom-ref": "5ecc2f5c7a200fbe", "name": "/usr/include/python3.12/pythread.h", "type": "file" }, { - "bom-ref": "285e242e52f22564", + "bom-ref": "24e841ba74864f3e", "name": "/usr/include/python3.12/pytypedefs.h", "type": "file" }, { - "bom-ref": "9c60dd609ece9a1f", + "bom-ref": "a1411d5ed3722f21", "name": "/usr/include/python3.12/rangeobject.h", "type": "file" }, { - "bom-ref": "96750c598302a3fb", + "bom-ref": "08def3386aee2f91", "name": "/usr/include/python3.12/setobject.h", "type": "file" }, { - "bom-ref": "2cb295e02dcbc954", + "bom-ref": "9959911accc106ae", "name": "/usr/include/python3.12/sliceobject.h", "type": "file" }, { - "bom-ref": "8af3dbb80388c45a", + "bom-ref": "d129c0c253fbdb70", "name": "/usr/include/python3.12/structmember.h", "type": "file" }, { - "bom-ref": "13c040572d7a5b96", + "bom-ref": "52888cab80ad6d5c", "name": "/usr/include/python3.12/structseq.h", "type": "file" }, { - "bom-ref": "a3a60ec3d099faaa", + "bom-ref": "5c5651de843dc53c", "name": "/usr/include/python3.12/sysmodule.h", "type": "file" }, { - "bom-ref": "7c818218e5d93478", + "bom-ref": "c113c09f5cf4980e", "name": "/usr/include/python3.12/traceback.h", "type": "file" }, { - "bom-ref": "0a2c19470e685c04", + "bom-ref": "6c379e57c38431ea", "name": "/usr/include/python3.12/tracemalloc.h", "type": "file" }, { - "bom-ref": "0bdebb1dc1ba9a85", + "bom-ref": "f8f1cd4367584f3b", "name": "/usr/include/python3.12/tupleobject.h", "type": "file" }, { - "bom-ref": "2f922bcf0e9470f7", + "bom-ref": "152a14463847f371", "name": "/usr/include/python3.12/typeslots.h", "type": "file" }, { - "bom-ref": "e8c1f6842dbfcb28", + "bom-ref": "edc3fe1ea9b9f736", "name": "/usr/include/python3.12/unicodeobject.h", "type": "file" }, { - "bom-ref": "1e6aec6c441aa503", + "bom-ref": "bc7d43466f96e0e5", "name": "/usr/include/python3.12/warnings.h", "type": "file" }, { - "bom-ref": "7bf3035ea55d3b6b", + "bom-ref": "5f39284a2b543671", "name": "/usr/include/python3.12/weakrefobject.h", "type": "file" }, { - "bom-ref": "22a65bb904993d90", + "bom-ref": "b0e47a46720b40f6", "name": "/usr/include/rapidjson/allocators.h", "type": "file" }, { - "bom-ref": "8ad496f587b6f8a5", + "bom-ref": "d146c17c6a168437", "name": "/usr/include/rapidjson/document.h", "type": "file" }, { - "bom-ref": "7f8a40610484dc4e", + "bom-ref": "9dc78371da770938", "name": "/usr/include/rapidjson/encodedstream.h", "type": "file" }, { - "bom-ref": "a805beddb278be6d", + "bom-ref": "dd8c80f6babe1207", "name": "/usr/include/rapidjson/encodings.h", "type": "file" }, { - "bom-ref": "89c41ce6e84aa6cf", + "bom-ref": "75bd2d102144f965", "name": "/usr/include/rapidjson/error/en.h", "type": "file" }, { - "bom-ref": "22159a319fd55256", + "bom-ref": "493a8a35b1c464d0", "name": "/usr/include/rapidjson/error/error.h", "type": "file" }, { - "bom-ref": "5b9c7250e2cc1024", + "bom-ref": "0f06cbd4536004ce", "name": "/usr/include/rapidjson/filereadstream.h", "type": "file" }, { - "bom-ref": "058e228fba42c3c3", + "bom-ref": "93bcc3fdde43d585", "name": "/usr/include/rapidjson/filewritestream.h", "type": "file" }, { - "bom-ref": "47aeb323c56fa213", + "bom-ref": "bc52289998a7ce45", "name": "/usr/include/rapidjson/fwd.h", "type": "file" }, { - "bom-ref": "5a160901e7a30b6f", + "bom-ref": "9ab63d6a53e91f89", "name": "/usr/include/rapidjson/internal/biginteger.h", "type": "file" }, { - "bom-ref": "e34a853c0819d39e", + "bom-ref": "9346bf493511c4f8", "name": "/usr/include/rapidjson/internal/diyfp.h", "type": "file" }, { - "bom-ref": "a626595145df82e2", + "bom-ref": "048d6be3de9193d8", "name": "/usr/include/rapidjson/internal/dtoa.h", "type": "file" }, { - "bom-ref": "01011ab7e3a08fec", + "bom-ref": "7272c0e700a0087e", "name": "/usr/include/rapidjson/internal/ieee754.h", "type": "file" }, { - "bom-ref": "8c630f16827595c5", + "bom-ref": "70479fb24ce5eee3", "name": "/usr/include/rapidjson/internal/itoa.h", "type": "file" }, { - "bom-ref": "cad239d4e064e812", + "bom-ref": "0c17cfc5c7274d18", "name": "/usr/include/rapidjson/internal/meta.h", "type": "file" }, { - "bom-ref": "ed741c59dd9625fb", + "bom-ref": "ead57f29bfb10d19", "name": "/usr/include/rapidjson/internal/pow10.h", "type": "file" }, { - "bom-ref": "5713ffdb077e8ad4", + "bom-ref": "7fb5252051ec416e", "name": "/usr/include/rapidjson/internal/regex.h", "type": "file" }, { - "bom-ref": "a01b69c13b746011", + "bom-ref": "18c701362c8b9c5b", "name": "/usr/include/rapidjson/internal/stack.h", "type": "file" }, { - "bom-ref": "a9ca3f01ec247523", + "bom-ref": "fecffe36b593e855", "name": "/usr/include/rapidjson/internal/strfunc.h", "type": "file" }, { - "bom-ref": "059f1d59728bb968", + "bom-ref": "d09ffb9c5dfa81ea", "name": "/usr/include/rapidjson/internal/strtod.h", "type": "file" }, { - "bom-ref": "57f8312c99839b9c", + "bom-ref": "571822e9e4945ff6", "name": "/usr/include/rapidjson/internal/swap.h", "type": "file" }, { - "bom-ref": "b3b9516c82926d1b", + "bom-ref": "94c6fa22d78064bd", "name": "/usr/include/rapidjson/istreamwrapper.h", "type": "file" }, { - "bom-ref": "780c910100ba71f0", + "bom-ref": "ab41d6ffb527438a", "name": "/usr/include/rapidjson/memorybuffer.h", "type": "file" }, { - "bom-ref": "7778d6da92f9cb95", + "bom-ref": "f258748a2b3b8b3f", "name": "/usr/include/rapidjson/memorystream.h", "type": "file" }, { - "bom-ref": "750db09cfaa887a8", + "bom-ref": "da0d5dd9ff081e96", "name": "/usr/include/rapidjson/msinttypes/inttypes.h", "type": "file" }, { - "bom-ref": "13a9876a24ffc35b", + "bom-ref": "656f6bc8c674ca1d", "name": "/usr/include/rapidjson/msinttypes/stdint.h", "type": "file" }, { - "bom-ref": "012a370c79eb7550", + "bom-ref": "44372d027fd2af26", "name": "/usr/include/rapidjson/ostreamwrapper.h", "type": "file" }, { - "bom-ref": "edd16a857d5c25db", + "bom-ref": "4614cca67cd86829", "name": "/usr/include/rapidjson/pointer.h", "type": "file" }, { - "bom-ref": "87bff63a5eca7bee", + "bom-ref": "35f6c762601e828c", "name": "/usr/include/rapidjson/prettywriter.h", "type": "file" }, { - "bom-ref": "c39449a36ff88abf", + "bom-ref": "344e7bfd802164e1", "name": "/usr/include/rapidjson/rapidjson.h", "type": "file" }, { - "bom-ref": "553d6683e17530b7", + "bom-ref": "b0c573b96f7ac109", "name": "/usr/include/rapidjson/reader.h", "type": "file" }, { - "bom-ref": "9a661885f47fa3e8", + "bom-ref": "116cebb3e89a023e", "name": "/usr/include/rapidjson/schema.h", "type": "file" }, { - "bom-ref": "da7dbd75fb27e692", + "bom-ref": "9bbd16aaeab8d8a0", "name": "/usr/include/rapidjson/stream.h", "type": "file" }, { - "bom-ref": "e5c6297adc617515", + "bom-ref": "f10063dff3c8b263", "name": "/usr/include/rapidjson/stringbuffer.h", "type": "file" }, { - "bom-ref": "360dae4e32e91ab5", + "bom-ref": "e5c0cdfda5f0cfaf", "name": "/usr/include/rapidjson/writer.h", "type": "file" }, { - "bom-ref": "daf89442187ac1d6", + "bom-ref": "e411f86c2668fa51", "name": "/usr/include/rdma/bnxt_re-abi.h", "type": "file" }, { - "bom-ref": "5113681a8339561e", + "bom-ref": "dbedd223d7f86f35", "name": "/usr/include/rdma/cxgb4-abi.h", "type": "file" }, { - "bom-ref": "412d8f8e1789081b", + "bom-ref": "f1328a1bae489494", "name": "/usr/include/rdma/efa-abi.h", "type": "file" }, { - "bom-ref": "3007cb437996f6a4", + "bom-ref": "85c0892a50980aab", "name": "/usr/include/rdma/erdma-abi.h", "type": "file" }, { - "bom-ref": "2681b44bc8b34ffb", + "bom-ref": "9f1e8e38557b5eb8", "name": "/usr/include/rdma/hfi/hfi1_ioctl.h", "type": "file" }, { - "bom-ref": "818e3a40a753e052", + "bom-ref": "64e2c8f462b2537d", "name": "/usr/include/rdma/hfi/hfi1_user.h", "type": "file" }, { - "bom-ref": "49ecd934e815b046", + "bom-ref": "6647790cfff8588d", "name": "/usr/include/rdma/hns-abi.h", "type": "file" }, { - "bom-ref": "f1c8f1635ac82e69", + "bom-ref": "53c9d4143c8b2f3a", "name": "/usr/include/rdma/ib_user_ioctl_cmds.h", "type": "file" }, { - "bom-ref": "2a1c655c6036ba54", + "bom-ref": "03762dcc9e152653", "name": "/usr/include/rdma/ib_user_ioctl_verbs.h", "type": "file" }, { - "bom-ref": "726713d0c5d0465e", + "bom-ref": "705db079c18c5281", "name": "/usr/include/rdma/ib_user_mad.h", "type": "file" }, { - "bom-ref": "6f38e96366603d7b", + "bom-ref": "4b6fd51ed60aefd0", "name": "/usr/include/rdma/ib_user_sa.h", "type": "file" }, { - "bom-ref": "53ba43c612e5169d", + "bom-ref": "e4083dea1eb9985a", "name": "/usr/include/rdma/ib_user_verbs.h", "type": "file" }, { - "bom-ref": "50dc272871b6fc87", + "bom-ref": "e8f433aa9549fb8c", "name": "/usr/include/rdma/irdma-abi.h", "type": "file" }, { - "bom-ref": "b33b0ba208a9031b", + "bom-ref": "4c45e0c480178188", "name": "/usr/include/rdma/mana-abi.h", "type": "file" }, { - "bom-ref": "b2bd247c0d1bdd89", + "bom-ref": "5db5dd4735b067f6", "name": "/usr/include/rdma/mlx4-abi.h", "type": "file" }, { - "bom-ref": "00803a0bd191b851", + "bom-ref": "9320e08a5b42baa2", "name": "/usr/include/rdma/mlx5-abi.h", "type": "file" }, { - "bom-ref": "71b40f83bcfacd92", + "bom-ref": "fcb89bbfa1aafa45", "name": "/usr/include/rdma/mlx5_user_ioctl_cmds.h", "type": "file" }, { - "bom-ref": "521901d91efcfed3", + "bom-ref": "dce8dcc673357c24", "name": "/usr/include/rdma/mlx5_user_ioctl_verbs.h", "type": "file" }, { - "bom-ref": "3ed64776d5007b17", + "bom-ref": "f1906ceb841f82a4", "name": "/usr/include/rdma/mthca-abi.h", "type": "file" }, { - "bom-ref": "397dc525ee35d7f8", + "bom-ref": "73730af761df2d97", "name": "/usr/include/rdma/ocrdma-abi.h", "type": "file" }, { - "bom-ref": "7e6540672785d05a", + "bom-ref": "9c661406d937cd8d", "name": "/usr/include/rdma/qedr-abi.h", "type": "file" }, { - "bom-ref": "3156d428aebe7e4e", + "bom-ref": "214b2670f05049c5", "name": "/usr/include/rdma/rdma_netlink.h", "type": "file" }, { - "bom-ref": "a4bfcebf364a5f33", + "bom-ref": "39ceafa75a9d03f0", "name": "/usr/include/rdma/rdma_user_cm.h", "type": "file" }, { - "bom-ref": "4d82d0fa6058b5a7", + "bom-ref": "d0bc10ef67d31028", "name": "/usr/include/rdma/rdma_user_ioctl.h", "type": "file" }, { - "bom-ref": "c6529a197d41e3b7", + "bom-ref": "c6c90b3d673b3344", "name": "/usr/include/rdma/rdma_user_ioctl_cmds.h", "type": "file" }, { - "bom-ref": "d4ed9b8aa4aebc5e", + "bom-ref": "ff681ec3177e3889", "name": "/usr/include/rdma/rdma_user_rxe.h", "type": "file" }, { - "bom-ref": "09c751b292882360", + "bom-ref": "1eb1444fae186983", "name": "/usr/include/rdma/rvt-abi.h", "type": "file" }, { - "bom-ref": "46218bc34795b577", + "bom-ref": "bfa96ca03b2e6cec", "name": "/usr/include/rdma/siw-abi.h", "type": "file" }, { - "bom-ref": "0c17795c440b17a2", + "bom-ref": "ddb6dc0736f4f35d", "name": "/usr/include/rdma/vmw_pvrdma-abi.h", "type": "file" }, { - "bom-ref": "ca2514c366f00449", + "bom-ref": "ee5ad73c03eb46e3", "name": "/usr/include/re2/filtered_re2.h", "type": "file" }, { - "bom-ref": "9b2361b9c09e5e52", + "bom-ref": "76a8f98ef76b9ce4", "name": "/usr/include/re2/re2.h", "type": "file" }, { - "bom-ref": "c83c2ba7ce2045bf", + "bom-ref": "bebc1f3a63809aa1", "name": "/usr/include/re2/set.h", "type": "file" }, { - "bom-ref": "95f22a493b0cbf21", + "bom-ref": "ae371078caa9d4c3", "name": "/usr/include/re2/stringpiece.h", "type": "file" }, { - "bom-ref": "acb8b2c06f62f22f", + "bom-ref": "add0c832b9b6641d", "name": "/usr/include/re_comp.h", "type": "file" }, { - "bom-ref": "4a0260008f6c2131", + "bom-ref": "c1c346947ab42a7f", "name": "/usr/include/regex.h", "type": "file" }, { - "bom-ref": "d67f6110ce235206", + "bom-ref": "71b69dbc8e5e4cc8", "name": "/usr/include/regexp.h", "type": "file" }, { - "bom-ref": "451169556f53c30a", + "bom-ref": "51856dc94e053729", "name": "/usr/include/regulator/regulator.h", "type": "file" }, { - "bom-ref": "a4c568d06ebcf2e5", + "bom-ref": "93ae79fb3dfac2bb", "name": "/usr/include/resolv.h", "type": "file" }, { - "bom-ref": "fa080c4512ab1b63", + "bom-ref": "cf2017bc147f60a9", "name": "/usr/include/ripemd.h", "type": "file" }, { - "bom-ref": "ce857474b8cc0276", + "bom-ref": "e1178a814f16df08", "name": "/usr/include/rmd160.h", "type": "file" }, { - "bom-ref": "9e6bae61c510ce35", + "bom-ref": "bf2063c66408e673", "name": "/usr/include/rpc/netdb.h", "type": "file" }, { - "bom-ref": "e984db799672c814", + "bom-ref": "071ca2da7c875dff", "name": "/usr/include/rpcsvc/bootparam_prot.h", "type": "file" }, { - "bom-ref": "35ca4bbb90125b20", + "bom-ref": "7269584808b4b73f", "name": "/usr/include/rpcsvc/bootparam_prot.x", "type": "file" }, { - "bom-ref": "2b9b55e3d8e7096e", + "bom-ref": "f7b91d342ab8b411", "name": "/usr/include/rpcsvc/key_prot.h", "type": "file" }, { - "bom-ref": "3a942bc4b52cb9bf", + "bom-ref": "93679159b0056e10", "name": "/usr/include/rpcsvc/key_prot.x", "type": "file" }, { - "bom-ref": "c41b1fa0679a60c6", + "bom-ref": "49ad07acb3374e85", "name": "/usr/include/rpcsvc/klm_prot.h", "type": "file" }, { - "bom-ref": "f8264acf5dd35751", + "bom-ref": "e3719832d2d6cca6", "name": "/usr/include/rpcsvc/klm_prot.x", "type": "file" }, { - "bom-ref": "0f9a0e7b5a973312", + "bom-ref": "22891a4319269be9", "name": "/usr/include/rpcsvc/mount.h", "type": "file" }, { - "bom-ref": "fa2fc77b6a71ecc2", + "bom-ref": "50c94eb853c132bd", "name": "/usr/include/rpcsvc/mount.x", "type": "file" }, { - "bom-ref": "25b5b9e3464f1796", + "bom-ref": "9de8dda8d07ee719", "name": "/usr/include/rpcsvc/nfs_prot.h", "type": "file" }, { - "bom-ref": "2158112a7b9a098c", + "bom-ref": "e2c4a33fb97e702b", "name": "/usr/include/rpcsvc/nfs_prot.x", "type": "file" }, { - "bom-ref": "81d889b6632bac9d", + "bom-ref": "97f0674ebb46ea42", "name": "/usr/include/rpcsvc/nlm_prot.h", "type": "file" }, { - "bom-ref": "cd2f2c81cbb7d364", + "bom-ref": "f0a813fa7d5b546f", "name": "/usr/include/rpcsvc/nlm_prot.x", "type": "file" }, { - "bom-ref": "f4c94bf177216f7a", + "bom-ref": "4ade23cf7466588d", "name": "/usr/include/rpcsvc/rex.h", "type": "file" }, { - "bom-ref": "887648b6fbf7dfbd", + "bom-ref": "92b7a891b17b6a36", "name": "/usr/include/rpcsvc/rex.x", "type": "file" }, { - "bom-ref": "5e6ffe509ed433fc", + "bom-ref": "41c03592d2a7f74f", "name": "/usr/include/rpcsvc/rquota.h", "type": "file" }, { - "bom-ref": "7351c7d08f338dce", + "bom-ref": "57e172d6480e8b11", "name": "/usr/include/rpcsvc/rquota.x", "type": "file" }, { - "bom-ref": "fa9683d587d57e18", + "bom-ref": "6ff468a86f5c4333", "name": "/usr/include/rpcsvc/rstat.h", "type": "file" }, { - "bom-ref": "54ac079527a2603f", + "bom-ref": "b58e5b8858a3e128", "name": "/usr/include/rpcsvc/rstat.x", "type": "file" }, { - "bom-ref": "e8d3056c3afe9279", + "bom-ref": "71f4df13cd328d3a", "name": "/usr/include/rpcsvc/rusers.h", "type": "file" }, { - "bom-ref": "58b6a473e2b42c56", + "bom-ref": "82e85c914fc73a81", "name": "/usr/include/rpcsvc/rusers.x", "type": "file" }, { - "bom-ref": "c98a939182106bb8", + "bom-ref": "53c68364d5a4eed7", "name": "/usr/include/rpcsvc/sm_inter.h", "type": "file" }, { - "bom-ref": "06c3fbb5db50618a", + "bom-ref": "688e139f3d3168b5", "name": "/usr/include/rpcsvc/sm_inter.x", "type": "file" }, { - "bom-ref": "ae0ca193fffe1e74", + "bom-ref": "3fe1721976039f57", "name": "/usr/include/rpcsvc/spray.h", "type": "file" }, { - "bom-ref": "3e53be29eef33c9c", + "bom-ref": "13c7b39f7e0cb887", "name": "/usr/include/rpcsvc/spray.x", "type": "file" }, { - "bom-ref": "913a2adb96ef376f", + "bom-ref": "f51e8f7fdf737091", "name": "/usr/include/sched.h", "type": "file" }, { - "bom-ref": "350ccbfc9e73cc80", + "bom-ref": "8b20158f4fee49ab", "name": "/usr/include/scsi/cxlflash_ioctl.h", "type": "file" }, { - "bom-ref": "6ae9394b1d37dde0", + "bom-ref": "1fa8666e3e512247", "name": "/usr/include/scsi/fc/fc_els.h", "type": "file" }, { - "bom-ref": "8808a85b04ab39bc", + "bom-ref": "2ab250d38893c453", "name": "/usr/include/scsi/fc/fc_fs.h", "type": "file" }, { - "bom-ref": "393d512cfdf74638", + "bom-ref": "a0582b50366785e7", "name": "/usr/include/scsi/fc/fc_gs.h", "type": "file" }, { - "bom-ref": "2d3aeb9406c72b3e", + "bom-ref": "91734f04261a1dc1", "name": "/usr/include/scsi/fc/fc_ns.h", "type": "file" }, { - "bom-ref": "ca3ef7f674ab3f13", + "bom-ref": "6e4777f31268dd99", "name": "/usr/include/scsi/scsi.h", "type": "file" }, { - "bom-ref": "a8444f1b25111596", + "bom-ref": "3ddb399cb925c02d", "name": "/usr/include/scsi/scsi_bsg_fc.h", "type": "file" }, { - "bom-ref": "eb74aedbfc70c94d", + "bom-ref": "7a05952fc29ed26e", "name": "/usr/include/scsi/scsi_bsg_mpi3mr.h", "type": "file" }, { - "bom-ref": "9436297e806128cd", + "bom-ref": "930a4143d795bfee", "name": "/usr/include/scsi/scsi_bsg_ufs.h", "type": "file" }, { - "bom-ref": "0262768a9fff7138", + "bom-ref": "6b0621c39beadaf2", "name": "/usr/include/scsi/scsi_ioctl.h", "type": "file" }, { - "bom-ref": "59e17214e688980e", + "bom-ref": "b9a46216363bba81", "name": "/usr/include/scsi/scsi_netlink.h", "type": "file" }, { - "bom-ref": "84b9a367ca397b49", + "bom-ref": "8052c544d055ac56", "name": "/usr/include/scsi/scsi_netlink_fc.h", "type": "file" }, { - "bom-ref": "4efe2938a07d85f0", + "bom-ref": "c0b913c38de150d6", "name": "/usr/include/scsi/sg.h", "type": "file" }, { - "bom-ref": "0df08ec7fc043946", + "bom-ref": "e2c6ea5e5860bb78", "name": "/usr/include/search.h", "type": "file" }, { - "bom-ref": "b001c703b0587cce", + "bom-ref": "24c6d4faaa185508", "name": "/usr/include/semaphore.h", "type": "file" }, { - "bom-ref": "2b2efd3cd15d7f55", + "bom-ref": "e8a9e71309b586eb", "name": "/usr/include/setjmp.h", "type": "file" }, { - "bom-ref": "d1da4b7ae7d728ec", + "bom-ref": "b515e1504882f58a", "name": "/usr/include/sgtty.h", "type": "file" }, { - "bom-ref": "58b194d40095aa1e", + "bom-ref": "b77db7927aec82f0", "name": "/usr/include/sha.h", "type": "file" }, { - "bom-ref": "5d80406468a5e706", + "bom-ref": "45562c54a8730390", "name": "/usr/include/sha1.h", "type": "file" }, { - "bom-ref": "019d37e4fa5d5f02", + "bom-ref": "3b2ac88badff7cb8", "name": "/usr/include/sha2.h", "type": "file" }, { - "bom-ref": "9155f438e5adece6", + "bom-ref": "5f1e2840c79d5fa0", "name": "/usr/include/sha256.h", "type": "file" }, { - "bom-ref": "be414353a05f7c0a", + "bom-ref": "020ddf7d2cb06b98", "name": "/usr/include/sha512.h", "type": "file" }, { - "bom-ref": "02a26a73dda76df1", + "bom-ref": "9ac3263c66b03a0b", "name": "/usr/include/shadow.h", "type": "file" }, { - "bom-ref": "090d17ebe4c5972c", + "bom-ref": "6dc2fc8a3997c88a", "name": "/usr/include/signal.h", "type": "file" }, { - "bom-ref": "25a7cca34fb7610b", + "bom-ref": "a995a867e485d876", "name": "/usr/include/slurm/pmi2.h", "type": "file" }, { - "bom-ref": "1187133293a67c2f", + "bom-ref": "468d31ae10a96c29", "name": "/usr/include/snappy-c.h", "type": "file" }, { - "bom-ref": "aa953e31554cdb16", + "bom-ref": "110040ad82ea8a50", "name": "/usr/include/snappy-sinksource.h", "type": "file" }, { - "bom-ref": "2c5a38c1b525a08d", + "bom-ref": "afc4c863d4588153", "name": "/usr/include/snappy-stubs-public.h", "type": "file" }, { - "bom-ref": "63267c89c7d170e2", + "bom-ref": "9a73f3fa342fb584", "name": "/usr/include/snappy.h", "type": "file" }, { - "bom-ref": "6f61ba6ce210fbe6", + "bom-ref": "ec28e5de263e25f8", "name": "/usr/include/sodium.h", "type": "file" }, { - "bom-ref": "bea78e0d718cfbdd", + "bom-ref": "48e8786aa4609753", "name": "/usr/include/sodium/core.h", "type": "file" }, { - "bom-ref": "927cde5751778c88", + "bom-ref": "939829682d4f727a", "name": "/usr/include/sodium/crypto_aead_aes256gcm.h", "type": "file" }, { - "bom-ref": "cd661fec8329679c", + "bom-ref": "030eb5f8df880bd6", "name": "/usr/include/sodium/crypto_aead_chacha20poly1305.h", "type": "file" }, { - "bom-ref": "cdb7a0722a16220c", + "bom-ref": "0c56597dc4026532", "name": "/usr/include/sodium/crypto_aead_xchacha20poly1305.h", "type": "file" }, { - "bom-ref": "a3ac2f5f86b77a72", + "bom-ref": "4f53859fcd2b497c", "name": "/usr/include/sodium/crypto_auth.h", "type": "file" }, { - "bom-ref": "c38cb1bdf933be94", + "bom-ref": "5d69dec7864cd89a", "name": "/usr/include/sodium/crypto_auth_hmacsha256.h", "type": "file" }, { - "bom-ref": "9819a8fccb2b0b87", + "bom-ref": "5bce9c20b3cc0909", "name": "/usr/include/sodium/crypto_auth_hmacsha512.h", "type": "file" }, { - "bom-ref": "e22bd73c6e9c98f8", + "bom-ref": "df43e3812a494826", "name": "/usr/include/sodium/crypto_auth_hmacsha512256.h", "type": "file" }, { - "bom-ref": "72886f609d38b387", + "bom-ref": "73af95bafaa09099", "name": "/usr/include/sodium/crypto_box.h", "type": "file" }, { - "bom-ref": "861b3e17cbda42bd", + "bom-ref": "127547e2a1e6f6f7", "name": "/usr/include/sodium/crypto_box_curve25519xchacha20poly1305.h", "type": "file" }, { - "bom-ref": "6e73d2d273e3cd7e", + "bom-ref": "c29c0a911e1a75f8", "name": "/usr/include/sodium/crypto_box_curve25519xsalsa20poly1305.h", "type": "file" }, { - "bom-ref": "3675679a24132140", + "bom-ref": "92aeb1b1d3ea6e5a", "name": "/usr/include/sodium/crypto_core_ed25519.h", "type": "file" }, { - "bom-ref": "750227db966d0dc8", + "bom-ref": "0b616764c0c644b6", "name": "/usr/include/sodium/crypto_core_hchacha20.h", "type": "file" }, { - "bom-ref": "7a37420170b1473a", + "bom-ref": "1332b304925c68d0", "name": "/usr/include/sodium/crypto_core_hsalsa20.h", "type": "file" }, { - "bom-ref": "3e777e25e94f1419", + "bom-ref": "a196b660647bee9f", "name": "/usr/include/sodium/crypto_core_ristretto255.h", "type": "file" }, { - "bom-ref": "f3ba7019a14bc155", + "bom-ref": "b0dbd12a877b697f", "name": "/usr/include/sodium/crypto_core_salsa20.h", "type": "file" }, { - "bom-ref": "06cb458c4f1649ce", + "bom-ref": "4373b24436ef7ca4", "name": "/usr/include/sodium/crypto_core_salsa2012.h", "type": "file" }, { - "bom-ref": "1d46037cfa865fbf", + "bom-ref": "16d2e63e841d2989", "name": "/usr/include/sodium/crypto_core_salsa208.h", "type": "file" }, { - "bom-ref": "bd488c23a39eda1d", + "bom-ref": "6b0cc9895797a7df", "name": "/usr/include/sodium/crypto_generichash.h", "type": "file" }, { - "bom-ref": "fb82d47782cdca8a", + "bom-ref": "b3fe1f42f13c6e80", "name": "/usr/include/sodium/crypto_generichash_blake2b.h", "type": "file" }, { - "bom-ref": "3ddb4bc08acff6da", + "bom-ref": "6ba480d735dfb024", "name": "/usr/include/sodium/crypto_hash.h", "type": "file" }, { - "bom-ref": "31424f4ca6233ba3", + "bom-ref": "98c6a2482d10d7a9", "name": "/usr/include/sodium/crypto_hash_sha256.h", "type": "file" }, { - "bom-ref": "a0b223bbae4aabbd", + "bom-ref": "167404ecb4cea263", "name": "/usr/include/sodium/crypto_hash_sha512.h", "type": "file" }, { - "bom-ref": "148c458690793613", + "bom-ref": "40e1f8dd06d7c5b1", "name": "/usr/include/sodium/crypto_kdf.h", "type": "file" }, { - "bom-ref": "c5217993287a3aa1", + "bom-ref": "11ed9d6515c90e07", "name": "/usr/include/sodium/crypto_kdf_blake2b.h", "type": "file" }, { - "bom-ref": "98edfdc57cb5dd13", + "bom-ref": "daf27d83cde408ad", "name": "/usr/include/sodium/crypto_kx.h", "type": "file" }, { - "bom-ref": "2b2b68f0745ec8d1", + "bom-ref": "db9c6effb0adbf5f", "name": "/usr/include/sodium/crypto_onetimeauth.h", "type": "file" }, { - "bom-ref": "1f6d721ebb8eb97a", + "bom-ref": "54c43a3b94d0bf60", "name": "/usr/include/sodium/crypto_onetimeauth_poly1305.h", "type": "file" }, { - "bom-ref": "6b081f92be450d23", + "bom-ref": "a98b980653478265", "name": "/usr/include/sodium/crypto_pwhash.h", "type": "file" }, { - "bom-ref": "bec6aad75bf341e4", + "bom-ref": "1c50c353c969e63e", "name": "/usr/include/sodium/crypto_pwhash_argon2i.h", "type": "file" }, { - "bom-ref": "d4e7f0d17ae60cda", + "bom-ref": "97dcaac839a49c5c", "name": "/usr/include/sodium/crypto_pwhash_argon2id.h", "type": "file" }, { - "bom-ref": "234cba849570c29d", + "bom-ref": "ff09ff6ca9ba635f", "name": "/usr/include/sodium/crypto_pwhash_scryptsalsa208sha256.h", "type": "file" }, { - "bom-ref": "7dd4c65c00328d82", + "bom-ref": "1ad4957af7d89870", "name": "/usr/include/sodium/crypto_scalarmult.h", "type": "file" }, { - "bom-ref": "91135576c87cf83a", + "bom-ref": "da1351d06d8e8218", "name": "/usr/include/sodium/crypto_scalarmult_curve25519.h", "type": "file" }, { - "bom-ref": "01492e28b321d18e", + "bom-ref": "4295dea1cb2609fc", "name": "/usr/include/sodium/crypto_scalarmult_ed25519.h", "type": "file" }, { - "bom-ref": "e41768fe601e61cd", + "bom-ref": "956958ccefe3b1cb", "name": "/usr/include/sodium/crypto_scalarmult_ristretto255.h", "type": "file" }, { - "bom-ref": "bbfe07e34f330fbf", + "bom-ref": "38c143e34722d0a9", "name": "/usr/include/sodium/crypto_secretbox.h", "type": "file" }, { - "bom-ref": "da3007841f2f8656", + "bom-ref": "ae06a46621d3fd68", "name": "/usr/include/sodium/crypto_secretbox_xchacha20poly1305.h", "type": "file" }, { - "bom-ref": "d2edac7a66f266b2", + "bom-ref": "0f89932b69e46dc8", "name": "/usr/include/sodium/crypto_secretbox_xsalsa20poly1305.h", "type": "file" }, { - "bom-ref": "5a49c54c3d4dfb59", + "bom-ref": "22a4acf5cd3c2c8f", "name": "/usr/include/sodium/crypto_secretstream_xchacha20poly1305.h", "type": "file" }, { - "bom-ref": "e67d339827fb1e94", + "bom-ref": "f41c20338bad56ce", "name": "/usr/include/sodium/crypto_shorthash.h", "type": "file" }, { - "bom-ref": "c0ad34e6cfa6da59", + "bom-ref": "9f50bf34b6d6cb6f", "name": "/usr/include/sodium/crypto_shorthash_siphash24.h", "type": "file" }, { - "bom-ref": "a0e56f4dce34522c", + "bom-ref": "606bdfc2982bb2e2", "name": "/usr/include/sodium/crypto_sign.h", "type": "file" }, { - "bom-ref": "d96e5166d5d3da75", + "bom-ref": "17ae484aa127578f", "name": "/usr/include/sodium/crypto_sign_ed25519.h", "type": "file" }, { - "bom-ref": "628ba10c6e86d7b4", + "bom-ref": "37a9009074fc5416", "name": "/usr/include/sodium/crypto_sign_edwards25519sha512batch.h", "type": "file" }, { - "bom-ref": "bee7b94c26375533", + "bom-ref": "1eb79774c8652dc5", "name": "/usr/include/sodium/crypto_stream.h", "type": "file" }, { - "bom-ref": "2e80f571291b5179", + "bom-ref": "8e76948148c5662f", "name": "/usr/include/sodium/crypto_stream_chacha20.h", "type": "file" }, { - "bom-ref": "f93c80a659e4f9ec", + "bom-ref": "7df36771fd01f0f6", "name": "/usr/include/sodium/crypto_stream_salsa20.h", "type": "file" }, { - "bom-ref": "b1d60e7e95564aac", + "bom-ref": "a3db87ab6354e5e6", "name": "/usr/include/sodium/crypto_stream_salsa2012.h", "type": "file" }, { - "bom-ref": "8c04c4c102e60fd6", + "bom-ref": "e67d567fb3adeb38", "name": "/usr/include/sodium/crypto_stream_salsa208.h", "type": "file" }, { - "bom-ref": "89bf0fa29e79efce", + "bom-ref": "d83ff2f324147ea8", "name": "/usr/include/sodium/crypto_stream_xchacha20.h", "type": "file" }, { - "bom-ref": "d16eb08436fe9cef", + "bom-ref": "4de17c2e32524725", "name": "/usr/include/sodium/crypto_stream_xsalsa20.h", "type": "file" }, { - "bom-ref": "9d12b5684086d868", + "bom-ref": "2fc2a8ae7f2b4746", "name": "/usr/include/sodium/crypto_verify_16.h", "type": "file" }, { - "bom-ref": "5726fd649afa8cad", + "bom-ref": "6b379caa6f7c4b7f", "name": "/usr/include/sodium/crypto_verify_32.h", "type": "file" }, { - "bom-ref": "8559844d434059fb", + "bom-ref": "e77cdd8633fef651", "name": "/usr/include/sodium/crypto_verify_64.h", "type": "file" }, { - "bom-ref": "372920e119596abf", + "bom-ref": "66631d31c3abeda5", "name": "/usr/include/sodium/export.h", "type": "file" }, { - "bom-ref": "519dc975be11426f", + "bom-ref": "ab26174874a75541", "name": "/usr/include/sodium/randombytes.h", "type": "file" }, { - "bom-ref": "c12faacaac334881", + "bom-ref": "5aa7266d8bc032e7", "name": "/usr/include/sodium/randombytes_internal_random.h", "type": "file" }, { - "bom-ref": "8143d9938c3493af", + "bom-ref": "6a65350d2a97f415", "name": "/usr/include/sodium/randombytes_sysrandom.h", "type": "file" }, { - "bom-ref": "bbca26c9ce9b1b30", + "bom-ref": "60fdf0124e0d4a42", "name": "/usr/include/sodium/runtime.h", "type": "file" }, { - "bom-ref": "14872f61c979d465", + "bom-ref": "a7b938f13a93eb57", "name": "/usr/include/sodium/utils.h", "type": "file" }, { - "bom-ref": "0586e2fa0b4e23dd", + "bom-ref": "b8e57a86484de5e3", "name": "/usr/include/sodium/version.h", "type": "file" }, { - "bom-ref": "4e81f77750fe01fe", + "bom-ref": "5e17ca62c59959e1", "name": "/usr/include/sound/asequencer.h", "type": "file" }, { - "bom-ref": "97e0f19246f9e97f", + "bom-ref": "5155a5e5b9ed56a4", "name": "/usr/include/sound/asoc.h", "type": "file" }, { - "bom-ref": "775ce28c50193738", + "bom-ref": "68b262e6168c46bb", "name": "/usr/include/sound/asound.h", "type": "file" }, { - "bom-ref": "8c50dff7c19dc6db", + "bom-ref": "ac3d7613ab951c5c", "name": "/usr/include/sound/asound_fm.h", "type": "file" }, { - "bom-ref": "347b0f70a9d6269a", + "bom-ref": "128178d624a02099", "name": "/usr/include/sound/compress_offload.h", "type": "file" }, { - "bom-ref": "aa27e8dc5851fced", + "bom-ref": "7c197b13ecd575fa", "name": "/usr/include/sound/compress_params.h", "type": "file" }, { - "bom-ref": "80b0f1830c5f07a0", + "bom-ref": "d2353cbec8f0dd5f", "name": "/usr/include/sound/emu10k1.h", "type": "file" }, { - "bom-ref": "445d016dc32824b2", + "bom-ref": "e91329f3043cbc99", "name": "/usr/include/sound/firewire.h", "type": "file" }, { - "bom-ref": "a918bc2a63471b7a", + "bom-ref": "0f32d2bf83c8fa1d", "name": "/usr/include/sound/hdsp.h", "type": "file" }, { - "bom-ref": "9bb8b63b14c486f2", + "bom-ref": "57119543d4bd2c01", "name": "/usr/include/sound/hdspm.h", "type": "file" }, { - "bom-ref": "0feb6afe4ecb331f", + "bom-ref": "a1c1b5e31a629b78", "name": "/usr/include/sound/intel/avs/tokens.h", "type": "file" }, { - "bom-ref": "95e37b730afc730e", + "bom-ref": "dc22ac47fab5a42d", "name": "/usr/include/sound/sb16_csp.h", "type": "file" }, { - "bom-ref": "b613a8ea479252b5", + "bom-ref": "0fcd7ae0907faf4e", "name": "/usr/include/sound/scarlett2.h", "type": "file" }, { - "bom-ref": "2a84ddbfe28e9038", + "bom-ref": "ab4a11a6ffb3be87", "name": "/usr/include/sound/sfnt_info.h", "type": "file" }, { - "bom-ref": "5bade5fe0b0dedc5", + "bom-ref": "952bda6777bdb9a2", "name": "/usr/include/sound/skl-tplg-interface.h", "type": "file" }, { - "bom-ref": "6529a726a410a1bf", + "bom-ref": "72b95cdfa14d3f38", "name": "/usr/include/sound/snd_ar_tokens.h", "type": "file" }, { - "bom-ref": "967722dcc5a41c06", + "bom-ref": "04f12d48bd43c4c9", "name": "/usr/include/sound/snd_sst_tokens.h", "type": "file" }, { - "bom-ref": "618ee40621e5a6a4", + "bom-ref": "8a86500522481ee7", "name": "/usr/include/sound/sof/abi.h", "type": "file" }, { - "bom-ref": "fcb665efb40c0061", + "bom-ref": "75348e0a4d6406e6", "name": "/usr/include/sound/sof/fw.h", "type": "file" }, { - "bom-ref": "f3bb57ebec7faa9e", + "bom-ref": "6a6af7b06d68f88d", "name": "/usr/include/sound/sof/header.h", "type": "file" }, { - "bom-ref": "722d0ed89b7376cf", + "bom-ref": "c0d5d26b262833b8", "name": "/usr/include/sound/sof/tokens.h", "type": "file" }, { - "bom-ref": "0d61409b6dcc96a7", + "bom-ref": "c75f12f99dfa68f0", "name": "/usr/include/sound/tlv.h", "type": "file" }, { - "bom-ref": "5833d83cffe186ec", + "bom-ref": "c63c37155a1cd457", "name": "/usr/include/sound/usb_stream.h", "type": "file" }, { - "bom-ref": "336e148b009a4868", + "bom-ref": "1ae4369c3ec03236", "name": "/usr/include/spawn.h", "type": "file" }, { - "bom-ref": "4c0fafde26580ee9", + "bom-ref": "b0b8a046c8145ccf", "name": "/usr/include/stab.h", "type": "file" }, { - "bom-ref": "8328d2301af77b0c", + "bom-ref": "02bccae78376bb96", "name": "/usr/include/stdbit.h", "type": "file" }, { - "bom-ref": "7b8d7bbe965b9a2d", + "bom-ref": "c4f7ed616a3b6257", "name": "/usr/include/stdc-predef.h", "type": "file" }, { - "bom-ref": "4bdb34f5dc0b96e1", + "bom-ref": "df2678bf43cb123f", "name": "/usr/include/stdint.h", "type": "file" }, { - "bom-ref": "5f4b1a93c5fc114e", + "bom-ref": "a90bd6806fe14df0", "name": "/usr/include/stdio.h", "type": "file" }, { - "bom-ref": "3c09469625a711e6", + "bom-ref": "6d0f738728b65608", "name": "/usr/include/stdio_ext.h", "type": "file" }, { - "bom-ref": "0b2b25e3c2c3ae98", + "bom-ref": "e54ff6a5182518ba", "name": "/usr/include/stdlib.h", "type": "file" }, { - "bom-ref": "9b84f2a251db20ad", + "bom-ref": "a9e65c94d9e1c693", "name": "/usr/include/string.h", "type": "file" }, { - "bom-ref": "56782946addbe81e", + "bom-ref": "744251905677d444", "name": "/usr/include/strings.h", "type": "file" }, { - "bom-ref": "58b8a9a7f5db82ed", + "bom-ref": "c239ab8c83009777", "name": "/usr/include/syscall.h", "type": "file" }, { - "bom-ref": "8b2ef162c1699757", + "bom-ref": "eb087e6fdfb7400d", "name": "/usr/include/sysexits.h", "type": "file" }, { - "bom-ref": "3dd5a4ff71b5e23f", + "bom-ref": "e67ca294f757b9ed", "name": "/usr/include/syslog.h", "type": "file" }, { - "bom-ref": "65c92101fb041b38", + "bom-ref": "ebd5c6dd3e07a712", "name": "/usr/include/tar.h", "type": "file" }, { - "bom-ref": "5776a68614d57588", + "bom-ref": "05850784bb6e4df2", "name": "/usr/include/term.h", "type": "file" }, { - "bom-ref": "be16526418540cfa", + "bom-ref": "4cf92e0ab8791c34", "name": "/usr/include/term_entry.h", "type": "file" }, { - "bom-ref": "b750e74cc816f9d1", + "bom-ref": "7cdab20e73915dbf", "name": "/usr/include/termcap.h", "type": "file" }, { - "bom-ref": "864479ab7b14e65f", + "bom-ref": "d843698e77c9d8e5", "name": "/usr/include/termio.h", "type": "file" }, { - "bom-ref": "175e38c38b1cd84b", + "bom-ref": "0f3b3e6979388a91", "name": "/usr/include/termios.h", "type": "file" }, { - "bom-ref": "db85bfc5028970b1", + "bom-ref": "e286436873f053af", "name": "/usr/include/tgmath.h", "type": "file" }, { - "bom-ref": "95b48785be10fd4f", + "bom-ref": "cf977c62299c0595", "name": "/usr/include/thread_db.h", "type": "file" }, { - "bom-ref": "e64c92a3af235666", + "bom-ref": "e58d8cddb5c784a0", "name": "/usr/include/threads.h", "type": "file" }, { - "bom-ref": "4b0f79c5f093c1ec", + "bom-ref": "1c1e20db6e6cd222", "name": "/usr/include/time.h", "type": "file" }, { - "bom-ref": "cd4b21d286f397ad", + "bom-ref": "54a328ab72fd721b", "name": "/usr/include/ttyent.h", "type": "file" }, { - "bom-ref": "79e3da1dd07b234a", + "bom-ref": "ef776eda44bf30b4", "name": "/usr/include/uchar.h", "type": "file" }, { - "bom-ref": "c684e74614c7e51e", + "bom-ref": "8b25ff0372c39f18", "name": "/usr/include/ucontext.h", "type": "file" }, { - "bom-ref": "adf895371785be5e", + "bom-ref": "98ce78c296672254", "name": "/usr/include/ulimit.h", "type": "file" }, { - "bom-ref": "6249512a877aa8dd", + "bom-ref": "c6f8ccabe8f9946b", "name": "/usr/include/unctrl.h", "type": "file" }, { - "bom-ref": "8e4126c95bcde445", + "bom-ref": "efa96c214eea22af", "name": "/usr/include/unicode/alphaindex.h", "type": "file" }, { - "bom-ref": "c2356d30ecfa1b78", + "bom-ref": "3f75e9f1c9aacd4e", "name": "/usr/include/unicode/appendable.h", "type": "file" }, { - "bom-ref": "90f027daad043d04", + "bom-ref": "47d3337805dc3172", "name": "/usr/include/unicode/basictz.h", "type": "file" }, { - "bom-ref": "c56502f005c2bee2", + "bom-ref": "55911db9d499f8c8", "name": "/usr/include/unicode/brkiter.h", "type": "file" }, { - "bom-ref": "77551fa50fc95717", + "bom-ref": "19fe5f9413c38121", "name": "/usr/include/unicode/bytestream.h", "type": "file" }, { - "bom-ref": "4c963d7d211cf7c7", + "bom-ref": "80abe396f8c0a731", "name": "/usr/include/unicode/bytestrie.h", "type": "file" }, { - "bom-ref": "942155ef16927145", + "bom-ref": "54a24d50dbf0be97", "name": "/usr/include/unicode/bytestriebuilder.h", "type": "file" }, { - "bom-ref": "a065d8d56eb95c9b", + "bom-ref": "85762ea46c55d1a5", "name": "/usr/include/unicode/calendar.h", "type": "file" }, { - "bom-ref": "eed5d97aae59d7c5", + "bom-ref": "1dad6a184cb1f8f3", "name": "/usr/include/unicode/caniter.h", "type": "file" }, { - "bom-ref": "85a88c97affa186a", + "bom-ref": "9a38d0e24c635efc", "name": "/usr/include/unicode/casemap.h", "type": "file" }, { - "bom-ref": "bd578d7385304eff", + "bom-ref": "88079afced406b15", "name": "/usr/include/unicode/char16ptr.h", "type": "file" }, { - "bom-ref": "d087c849071dd59a", + "bom-ref": "a54d2e537c7dcbc8", "name": "/usr/include/unicode/chariter.h", "type": "file" }, { - "bom-ref": "1097e3c9af615bff", + "bom-ref": "b37e06956344fd91", "name": "/usr/include/unicode/choicfmt.h", "type": "file" }, { - "bom-ref": "40936aab43a283f5", + "bom-ref": "d036524cde94340f", "name": "/usr/include/unicode/coleitr.h", "type": "file" }, { - "bom-ref": "e7a8c86f4c167897", + "bom-ref": "020aba01af0f0c0d", "name": "/usr/include/unicode/coll.h", "type": "file" }, { - "bom-ref": "59e06a70277ff536", + "bom-ref": "cd4a563e6e717308", "name": "/usr/include/unicode/compactdecimalformat.h", "type": "file" }, { - "bom-ref": "2a73af027b0e561e", + "bom-ref": "640612b055e38230", "name": "/usr/include/unicode/curramt.h", "type": "file" }, { - "bom-ref": "a137bee8203d4dde", + "bom-ref": "0bc597c6f2122c3c", "name": "/usr/include/unicode/currpinf.h", "type": "file" }, { - "bom-ref": "c6e3e21ec13fb61b", + "bom-ref": "7a583a9a9d7c5189", "name": "/usr/include/unicode/currunit.h", "type": "file" }, { - "bom-ref": "471963a7ca956d05", + "bom-ref": "b4483b3cc5bb231f", "name": "/usr/include/unicode/datefmt.h", "type": "file" }, { - "bom-ref": "2915b0a23367b199", + "bom-ref": "1f47f43dd3784def", "name": "/usr/include/unicode/dbbi.h", "type": "file" }, { - "bom-ref": "e56231e4a40f1ac1", + "bom-ref": "558ab952274dc39b", "name": "/usr/include/unicode/dcfmtsym.h", "type": "file" }, { - "bom-ref": "3ee0af5375fc85ca", + "bom-ref": "693ae188d5c3f024", "name": "/usr/include/unicode/decimfmt.h", "type": "file" }, { - "bom-ref": "e6870ee2a319fe34", + "bom-ref": "6add3a327d1345ea", "name": "/usr/include/unicode/displayoptions.h", "type": "file" }, { - "bom-ref": "a3d7fd6bbcc2ac1a", + "bom-ref": "6aaa1175861ce3cc", "name": "/usr/include/unicode/docmain.h", "type": "file" }, { - "bom-ref": "cbfbd619fd570fdf", + "bom-ref": "0ec1117fc0da7651", "name": "/usr/include/unicode/dtfmtsym.h", "type": "file" }, { - "bom-ref": "63f00c86190e0777", + "bom-ref": "960463f08e5b97f9", "name": "/usr/include/unicode/dtintrv.h", "type": "file" }, { - "bom-ref": "d7c6985880a03161", + "bom-ref": "462fa7f0b838f8d7", "name": "/usr/include/unicode/dtitvfmt.h", "type": "file" }, { - "bom-ref": "5ef1473fefab16ad", + "bom-ref": "7b10ee6e3f42e4ff", "name": "/usr/include/unicode/dtitvinf.h", "type": "file" }, { - "bom-ref": "b24ae7347d2225bb", + "bom-ref": "d59d5e234e1460f1", "name": "/usr/include/unicode/dtptngen.h", "type": "file" }, { - "bom-ref": "1e39a7c9f023b6ef", + "bom-ref": "bd1137bc178f8d45", "name": "/usr/include/unicode/dtrule.h", "type": "file" }, { - "bom-ref": "e586a815e337cfec", + "bom-ref": "08e71d941fa7a162", "name": "/usr/include/unicode/edits.h", "type": "file" }, { - "bom-ref": "bbeb9c3e447a7905", + "bom-ref": "6da799f517027583", "name": "/usr/include/unicode/enumset.h", "type": "file" }, { - "bom-ref": "6be5396cde7a94dc", + "bom-ref": "d5cba71a8a92df2e", "name": "/usr/include/unicode/errorcode.h", "type": "file" }, { - "bom-ref": "18147aa383162580", + "bom-ref": "50ab4167823c2c0a", "name": "/usr/include/unicode/fieldpos.h", "type": "file" }, { - "bom-ref": "8ac01196933a0167", + "bom-ref": "d15cee144c7f6639", "name": "/usr/include/unicode/filteredbrk.h", "type": "file" }, { - "bom-ref": "e52ea8f086023a1f", + "bom-ref": "0770786dcf2b3fc9", "name": "/usr/include/unicode/fmtable.h", "type": "file" }, { - "bom-ref": "25c052148c885463", + "bom-ref": "aeccc3e7d9d4c6b5", "name": "/usr/include/unicode/format.h", "type": "file" }, { - "bom-ref": "942a4e239a05377a", + "bom-ref": "ffbfa9f7f7b1d2f8", "name": "/usr/include/unicode/formattednumber.h", "type": "file" }, { - "bom-ref": "1c5af0a006967270", + "bom-ref": "0b560e98e80bf54e", "name": "/usr/include/unicode/formattedvalue.h", "type": "file" }, { - "bom-ref": "eca7041a7218cc0e", + "bom-ref": "275b6e5a1b6bf138", "name": "/usr/include/unicode/fpositer.h", "type": "file" }, { - "bom-ref": "42f4dbafc537a1fa", + "bom-ref": "eeef50b3a60fb488", "name": "/usr/include/unicode/gender.h", "type": "file" }, { - "bom-ref": "749a32b1d60c41c2", + "bom-ref": "66b1e3f467317408", "name": "/usr/include/unicode/gregocal.h", "type": "file" }, { - "bom-ref": "7124e82def057a60", + "bom-ref": "be84b6b20f799656", "name": "/usr/include/unicode/icudataver.h", "type": "file" }, { - "bom-ref": "28dce30b55829138", + "bom-ref": "5a68b67e44c2ffee", "name": "/usr/include/unicode/icuplug.h", "type": "file" }, { - "bom-ref": "dc23c53ed26a80ed", + "bom-ref": "562836c9d81c0d43", "name": "/usr/include/unicode/idna.h", "type": "file" }, { - "bom-ref": "cfbe99780fef70fa", + "bom-ref": "572077e3c3216d50", "name": "/usr/include/unicode/listformatter.h", "type": "file" }, { - "bom-ref": "04afdad93183c07d", + "bom-ref": "f885700f27854feb", "name": "/usr/include/unicode/localebuilder.h", "type": "file" }, { - "bom-ref": "b1658f43a1fb3866", + "bom-ref": "e31ceeee663353b0", "name": "/usr/include/unicode/localematcher.h", "type": "file" }, { - "bom-ref": "a86148da6584c12e", + "bom-ref": "d263d698e42943d0", "name": "/usr/include/unicode/localpointer.h", "type": "file" }, { - "bom-ref": "fc1106bd5df27685", + "bom-ref": "a300eea67baec227", "name": "/usr/include/unicode/locdspnm.h", "type": "file" }, { - "bom-ref": "4cca5b156ea7f7db", + "bom-ref": "6abdc662ffb0c23d", "name": "/usr/include/unicode/locid.h", "type": "file" }, { - "bom-ref": "2067647f910137b8", + "bom-ref": "b312f4623de471ee", "name": "/usr/include/unicode/measfmt.h", "type": "file" }, { - "bom-ref": "5a776ee510d5fc5d", + "bom-ref": "3dd8b669ae74a5fb", "name": "/usr/include/unicode/measunit.h", "type": "file" }, { - "bom-ref": "8476c585d60d2500", + "bom-ref": "89bdf286bba11386", "name": "/usr/include/unicode/measure.h", "type": "file" }, { - "bom-ref": "93546cae497439bf", + "bom-ref": "d253342aca8fd835", "name": "/usr/include/unicode/messagepattern.h", "type": "file" }, { - "bom-ref": "b2ea5e6dd9306c47", + "bom-ref": "5a15c4f2d899ef31", "name": "/usr/include/unicode/msgfmt.h", "type": "file" }, { - "bom-ref": "e0d8bbd06fb66352", + "bom-ref": "e38932e3e8f09138", "name": "/usr/include/unicode/normalizer2.h", "type": "file" }, { - "bom-ref": "5d13d061a35357bf", + "bom-ref": "5b74530a619a65fd", "name": "/usr/include/unicode/normlzr.h", "type": "file" }, { - "bom-ref": "9226d6f0aab82b94", + "bom-ref": "9cdea1380242531e", "name": "/usr/include/unicode/nounit.h", "type": "file" }, { - "bom-ref": "a61a0c006ca7c24c", + "bom-ref": "66dcb70f156c5832", "name": "/usr/include/unicode/numberformatter.h", "type": "file" }, { - "bom-ref": "a239be8c25c9fb6a", + "bom-ref": "337d43ef29ffec90", "name": "/usr/include/unicode/numberrangeformatter.h", "type": "file" }, { - "bom-ref": "d2128b70bbd7a1ab", + "bom-ref": "5f2c35bf458093d5", "name": "/usr/include/unicode/numfmt.h", "type": "file" }, { - "bom-ref": "fb6aa147042ad4a3", + "bom-ref": "d39dad7470d33d71", "name": "/usr/include/unicode/numsys.h", "type": "file" }, { - "bom-ref": "88fa2e019837c0b9", + "bom-ref": "3fba4f171767ff17", "name": "/usr/include/unicode/parseerr.h", "type": "file" }, { - "bom-ref": "e4010ec9963e9407", + "bom-ref": "e5dfab6e55ccb609", "name": "/usr/include/unicode/parsepos.h", "type": "file" }, { - "bom-ref": "4f34f4afc148dc10", + "bom-ref": "095d67328feebb8a", "name": "/usr/include/unicode/platform.h", "type": "file" }, { - "bom-ref": "8c1e69ab8a74b935", + "bom-ref": "eb0a7b5e9df9419b", "name": "/usr/include/unicode/plurfmt.h", "type": "file" }, { - "bom-ref": "96222a29925eaafb", + "bom-ref": "021b579a8b33bac5", "name": "/usr/include/unicode/plurrule.h", "type": "file" }, { - "bom-ref": "1a0fa984b91c0eef", + "bom-ref": "fc20f588444f1c5d", "name": "/usr/include/unicode/ptypes.h", "type": "file" }, { - "bom-ref": "c67371409373ed25", + "bom-ref": "334104ffd6b7a9df", "name": "/usr/include/unicode/putil.h", "type": "file" }, { - "bom-ref": "f7b421475239fdcd", + "bom-ref": "79a629428c1b8587", "name": "/usr/include/unicode/rbbi.h", "type": "file" }, { - "bom-ref": "40a536745118923d", + "bom-ref": "4eddb18bdc920417", "name": "/usr/include/unicode/rbnf.h", "type": "file" }, { - "bom-ref": "0d966f669d37271f", + "bom-ref": "8ac6df163aa56841", "name": "/usr/include/unicode/rbtz.h", "type": "file" }, { - "bom-ref": "dc6a245a6c2d0035", + "bom-ref": "04a8aba69f5d8c9f", "name": "/usr/include/unicode/regex.h", "type": "file" }, { - "bom-ref": "c9cdb4229822e58a", + "bom-ref": "9546ed76d64c27a4", "name": "/usr/include/unicode/region.h", "type": "file" }, { - "bom-ref": "47bc4be113722783", + "bom-ref": "12a05d7d552b7e51", "name": "/usr/include/unicode/reldatefmt.h", "type": "file" }, { - "bom-ref": "b6d9568a67f80714", + "bom-ref": "410dfbd0addf9a4a", "name": "/usr/include/unicode/rep.h", "type": "file" }, { - "bom-ref": "0f4f1c4f7bfd22c1", + "bom-ref": "ba8f43e95e8c896b", "name": "/usr/include/unicode/resbund.h", "type": "file" }, { - "bom-ref": "482280436c6958bb", + "bom-ref": "494c93ea243a4339", "name": "/usr/include/unicode/schriter.h", "type": "file" }, { - "bom-ref": "0ad089a76015cac4", + "bom-ref": "7bd2987a628a719e", "name": "/usr/include/unicode/scientificnumberformatter.h", "type": "file" }, { - "bom-ref": "8914e18a3fb3fc86", + "bom-ref": "f40b176146c2870c", "name": "/usr/include/unicode/search.h", "type": "file" }, { - "bom-ref": "94d1a721a4edbca5", + "bom-ref": "88ac4bcae90f7b3f", "name": "/usr/include/unicode/selfmt.h", "type": "file" }, { - "bom-ref": "ab62d71a70b07887", + "bom-ref": "8657f0a6f9debc95", "name": "/usr/include/unicode/simpleformatter.h", "type": "file" }, { - "bom-ref": "b7bfc8d32d97b8cc", + "bom-ref": "17ee28fdd2ffe0b2", "name": "/usr/include/unicode/simplenumberformatter.h", "type": "file" }, { - "bom-ref": "014d51b7b5e1dfc6", + "bom-ref": "64e452d7039a8a38", "name": "/usr/include/unicode/simpletz.h", "type": "file" }, { - "bom-ref": "fb35031699c6c617", + "bom-ref": "608efd5bd89711c9", "name": "/usr/include/unicode/smpdtfmt.h", "type": "file" }, { - "bom-ref": "bcdacb4992912fcf", + "bom-ref": "f13539eb9132fc21", "name": "/usr/include/unicode/sortkey.h", "type": "file" }, { - "bom-ref": "0e7e1a401e8f88c8", + "bom-ref": "280174619c0edac6", "name": "/usr/include/unicode/std_string.h", "type": "file" }, { - "bom-ref": "c632af583a5677f8", + "bom-ref": "86f7cdb18dec37e6", "name": "/usr/include/unicode/strenum.h", "type": "file" }, { - "bom-ref": "a5e6612c86cb4eff", + "bom-ref": "9b32dac4c7e2baa1", "name": "/usr/include/unicode/stringoptions.h", "type": "file" }, { - "bom-ref": "d0a0f56fb59a28e9", + "bom-ref": "acc8aab33954b12f", "name": "/usr/include/unicode/stringpiece.h", "type": "file" }, { - "bom-ref": "4acfbf042e796fd4", + "bom-ref": "84bd783e2d33308a", "name": "/usr/include/unicode/stringtriebuilder.h", "type": "file" }, { - "bom-ref": "3df9c5a2097bb5ef", + "bom-ref": "379d9d76071a3cdd", "name": "/usr/include/unicode/stsearch.h", "type": "file" }, { - "bom-ref": "1b3d52128e5c8d62", + "bom-ref": "c05f88c2a1148ddc", "name": "/usr/include/unicode/symtable.h", "type": "file" }, { - "bom-ref": "3f41d46340029c2e", + "bom-ref": "af43e6b1ac4755ec", "name": "/usr/include/unicode/tblcoll.h", "type": "file" }, { - "bom-ref": "4786eca7830f1049", + "bom-ref": "6ab9708bf565c2ff", "name": "/usr/include/unicode/timezone.h", "type": "file" }, { - "bom-ref": "0ed5bde36de661b4", + "bom-ref": "432cf5a91f9ca152", "name": "/usr/include/unicode/tmunit.h", "type": "file" }, { - "bom-ref": "00a6054fb8d8d594", + "bom-ref": "d29343b27fda4d1a", "name": "/usr/include/unicode/tmutamt.h", "type": "file" }, { - "bom-ref": "13b368a2caf7b6ff", + "bom-ref": "b03a942b9dd3d621", "name": "/usr/include/unicode/tmutfmt.h", "type": "file" }, { - "bom-ref": "40a5c7aaaf5aca80", + "bom-ref": "5c4eda3cf7080daa", "name": "/usr/include/unicode/translit.h", "type": "file" }, { - "bom-ref": "0a3823793e9d7e55", + "bom-ref": "d06f625c0c106a37", "name": "/usr/include/unicode/tzfmt.h", "type": "file" }, { - "bom-ref": "0925cba40d8aaed7", + "bom-ref": "d9e2c26123496905", "name": "/usr/include/unicode/tznames.h", "type": "file" }, { - "bom-ref": "b0e4171b83e2e8fe", + "bom-ref": "9de9b6e7042e6924", "name": "/usr/include/unicode/tzrule.h", "type": "file" }, { - "bom-ref": "85950ae4752e0a0e", + "bom-ref": "abf9bf499c75b3c4", "name": "/usr/include/unicode/tztrans.h", "type": "file" }, { - "bom-ref": "85b22cd56d21f71c", + "bom-ref": "a00d5726378e290a", "name": "/usr/include/unicode/ubidi.h", "type": "file" }, { - "bom-ref": "bf9ec8f5adf96b56", + "bom-ref": "317f29976ab3e534", "name": "/usr/include/unicode/ubiditransform.h", "type": "file" }, { - "bom-ref": "96223ee831978bfa", + "bom-ref": "3fbec2b4441d071c", "name": "/usr/include/unicode/ubrk.h", "type": "file" }, { - "bom-ref": "192ee6af8a15a178", + "bom-ref": "c05a214c863b5c3a", "name": "/usr/include/unicode/ucal.h", "type": "file" }, { - "bom-ref": "791f5a8611761681", + "bom-ref": "1aab67a26286ea47", "name": "/usr/include/unicode/ucasemap.h", "type": "file" }, { - "bom-ref": "0b91f7c2dbb682f3", + "bom-ref": "0edf3dc021063a55", "name": "/usr/include/unicode/ucat.h", "type": "file" }, { - "bom-ref": "65afde086d85df76", + "bom-ref": "76adba1963926de0", "name": "/usr/include/unicode/uchar.h", "type": "file" }, { - "bom-ref": "03a43fa043a82b76", + "bom-ref": "e28e28b8424f4bac", "name": "/usr/include/unicode/ucharstrie.h", "type": "file" }, { - "bom-ref": "604fddba6e296058", + "bom-ref": "71eee79f8ba6c802", "name": "/usr/include/unicode/ucharstriebuilder.h", "type": "file" }, { - "bom-ref": "c06c180597a54521", + "bom-ref": "3c606c20675643af", "name": "/usr/include/unicode/uchriter.h", "type": "file" }, { - "bom-ref": "fbaece2ab47f03c6", + "bom-ref": "693be095a8a705c4", "name": "/usr/include/unicode/uclean.h", "type": "file" }, { - "bom-ref": "2bcf7249b240f798", + "bom-ref": "32b9ded306dcbe1e", "name": "/usr/include/unicode/ucnv.h", "type": "file" }, { - "bom-ref": "e22c82a76992f902", + "bom-ref": "a87a03495e735a50", "name": "/usr/include/unicode/ucnv_cb.h", "type": "file" }, { - "bom-ref": "658b6bb077bbe290", + "bom-ref": "5d40f6bc571f1a52", "name": "/usr/include/unicode/ucnv_err.h", "type": "file" }, { - "bom-ref": "31d4fa037a9fd137", + "bom-ref": "c76049e19fc14789", "name": "/usr/include/unicode/ucnvsel.h", "type": "file" }, { - "bom-ref": "9cb1325db941ef02", + "bom-ref": "e7b7777cf7a57cb4", "name": "/usr/include/unicode/ucol.h", "type": "file" }, { - "bom-ref": "13c554355613d36c", + "bom-ref": "e77806263fcbb92e", "name": "/usr/include/unicode/ucoleitr.h", "type": "file" }, { - "bom-ref": "456fa43df6ab4e10", + "bom-ref": "6892f62721bee836", "name": "/usr/include/unicode/uconfig.h", "type": "file" }, { - "bom-ref": "d8a6f9e08bf844a6", + "bom-ref": "2f734fe88cf69780", "name": "/usr/include/unicode/ucpmap.h", "type": "file" }, { - "bom-ref": "583febf94cf8693a", + "bom-ref": "519edc46e90f6584", "name": "/usr/include/unicode/ucptrie.h", "type": "file" }, { - "bom-ref": "74165a034853b77e", + "bom-ref": "adfeafcf7f2a8b7c", "name": "/usr/include/unicode/ucsdet.h", "type": "file" }, { - "bom-ref": "a643f018e3fa9711", + "bom-ref": "f429660776a3ec0f", "name": "/usr/include/unicode/ucurr.h", "type": "file" }, { - "bom-ref": "bb0ea315c68ae2ee", + "bom-ref": "1fc234c715e1e310", "name": "/usr/include/unicode/udat.h", "type": "file" }, { - "bom-ref": "e2e21ae2a5c49d32", + "bom-ref": "1e585568ecc9a628", "name": "/usr/include/unicode/udata.h", "type": "file" }, { - "bom-ref": "1443c2f0c5c10a41", + "bom-ref": "a20d2656f16ac987", "name": "/usr/include/unicode/udateintervalformat.h", "type": "file" }, { - "bom-ref": "c5c9046753f7de28", + "bom-ref": "3b566f18b763318e", "name": "/usr/include/unicode/udatpg.h", "type": "file" }, { - "bom-ref": "f07fb04e499ddbfc", + "bom-ref": "30f71b093e032fee", "name": "/usr/include/unicode/udisplaycontext.h", "type": "file" }, { - "bom-ref": "a9d8d87ed5fe701e", + "bom-ref": "13d16d2f1c9b6ff4", "name": "/usr/include/unicode/udisplayoptions.h", "type": "file" }, { - "bom-ref": "b5d68cd6ed9ce6ad", + "bom-ref": "677c10f933e397ef", "name": "/usr/include/unicode/uenum.h", "type": "file" }, { - "bom-ref": "420d4f9692415793", + "bom-ref": "51d0509e058aab3d", "name": "/usr/include/unicode/ufieldpositer.h", "type": "file" }, { - "bom-ref": "f24a3ba31b356b5f", + "bom-ref": "2060820e85d315e5", "name": "/usr/include/unicode/uformattable.h", "type": "file" }, { - "bom-ref": "477dedafa6855fdc", + "bom-ref": "32421040735c88fe", "name": "/usr/include/unicode/uformattednumber.h", "type": "file" }, { - "bom-ref": "5f7a19b4f7f0616e", + "bom-ref": "1cb5cfc6178bc5ec", "name": "/usr/include/unicode/uformattedvalue.h", "type": "file" }, { - "bom-ref": "4e10ab805b0061b9", + "bom-ref": "f678b52688360c3f", "name": "/usr/include/unicode/ugender.h", "type": "file" }, { - "bom-ref": "7e73f9bcf2202584", + "bom-ref": "0a22587e128dedb6", "name": "/usr/include/unicode/uidna.h", "type": "file" }, { - "bom-ref": "99b6bc26107078a2", + "bom-ref": "ffbde78a6d51088c", "name": "/usr/include/unicode/uiter.h", "type": "file" }, { - "bom-ref": "ad95f01db329d2e3", + "bom-ref": "47502181cddbb08d", "name": "/usr/include/unicode/uldnames.h", "type": "file" }, { - "bom-ref": "8390bd5786d15509", + "bom-ref": "d38cb54c1a6040ab", "name": "/usr/include/unicode/ulistformatter.h", "type": "file" }, { - "bom-ref": "60f0640bdd57e076", + "bom-ref": "f07692c9affc1d0c", "name": "/usr/include/unicode/uloc.h", "type": "file" }, { - "bom-ref": "6db20114fd50b575", + "bom-ref": "57a00ac9a8282ae7", "name": "/usr/include/unicode/ulocale.h", "type": "file" }, { - "bom-ref": "20c4c3a9c6ac8e72", + "bom-ref": "a7e63aa84b7365bc", "name": "/usr/include/unicode/ulocbuilder.h", "type": "file" }, { - "bom-ref": "29d825471a37af4f", + "bom-ref": "4acd7d0d0dbc7fb9", "name": "/usr/include/unicode/ulocdata.h", "type": "file" }, { - "bom-ref": "6957383243a3076d", + "bom-ref": "17cbb558c52de39f", "name": "/usr/include/unicode/umachine.h", "type": "file" }, { - "bom-ref": "6d00a130e6f6d7aa", + "bom-ref": "14c1427e713ddd84", "name": "/usr/include/unicode/umisc.h", "type": "file" }, { - "bom-ref": "7ae0ba4493128212", + "bom-ref": "67d3b9d38946a1c8", "name": "/usr/include/unicode/umsg.h", "type": "file" }, { - "bom-ref": "f3fedec8a5dd4e9e", + "bom-ref": "1212a0ee6eb3a028", "name": "/usr/include/unicode/umutablecptrie.h", "type": "file" }, { - "bom-ref": "75c8316b27afd866", + "bom-ref": "913569b1e61599f0", "name": "/usr/include/unicode/unifilt.h", "type": "file" }, { - "bom-ref": "e783d52505cabd2e", + "bom-ref": "94c7b58f889519e8", "name": "/usr/include/unicode/unifunct.h", "type": "file" }, { - "bom-ref": "8892fc5d162babb6", + "bom-ref": "427d9146de64d19c", "name": "/usr/include/unicode/unimatch.h", "type": "file" }, { - "bom-ref": "49d7bab60ca99e14", + "bom-ref": "7bddf4d8fa53a736", "name": "/usr/include/unicode/unirepl.h", "type": "file" }, { - "bom-ref": "af79ff7e838e7900", + "bom-ref": "b6da91df13f8ba6e", "name": "/usr/include/unicode/uniset.h", "type": "file" }, { - "bom-ref": "f08c380abea4193d", + "bom-ref": "e4ee72befca3f6a7", "name": "/usr/include/unicode/unistr.h", "type": "file" }, { - "bom-ref": "57ce6c774be5922d", + "bom-ref": "6c4bfb4ed1080b47", "name": "/usr/include/unicode/unorm.h", "type": "file" }, { - "bom-ref": "71839af37484598e", + "bom-ref": "602e9d031066b02c", "name": "/usr/include/unicode/unorm2.h", "type": "file" }, { - "bom-ref": "9d1ae93b7420073a", + "bom-ref": "f3e81503111e531c", "name": "/usr/include/unicode/unum.h", "type": "file" }, { - "bom-ref": "30d5fd4c3e2f1c26", + "bom-ref": "7090250c1259114c", "name": "/usr/include/unicode/unumberformatter.h", "type": "file" }, { - "bom-ref": "f6626589ff0b78f7", + "bom-ref": "2c2e39a2bbb3e96d", "name": "/usr/include/unicode/unumberoptions.h", "type": "file" }, { - "bom-ref": "72ac3af49d62a1cc", + "bom-ref": "6adb8b8f5d663ca6", "name": "/usr/include/unicode/unumberrangeformatter.h", "type": "file" }, { - "bom-ref": "181badd3d6b0541b", + "bom-ref": "e43854266ebfff79", "name": "/usr/include/unicode/unumsys.h", "type": "file" }, { - "bom-ref": "65dace0fb1f1db0e", + "bom-ref": "d4dacf8ff4eeb7f8", "name": "/usr/include/unicode/uobject.h", "type": "file" }, { - "bom-ref": "bf544e592d969c7c", + "bom-ref": "6e02dc5a4bffcbaa", "name": "/usr/include/unicode/upluralrules.h", "type": "file" }, { - "bom-ref": "9412b1c93ea44462", + "bom-ref": "f04b29ce055bfd48", "name": "/usr/include/unicode/uregex.h", "type": "file" }, { - "bom-ref": "d21ee08fb9aa64f9", + "bom-ref": "a8eeeb1e1218e0a3", "name": "/usr/include/unicode/uregion.h", "type": "file" }, { - "bom-ref": "73b0e13aacd0f518", + "bom-ref": "cba65ba8fc34411a", "name": "/usr/include/unicode/ureldatefmt.h", "type": "file" }, { - "bom-ref": "92031468151fe0dd", + "bom-ref": "adb01d5dcd848b37", "name": "/usr/include/unicode/urename.h", "type": "file" }, { - "bom-ref": "ffda0a3c3374d557", + "bom-ref": "918d1c4a29d54795", "name": "/usr/include/unicode/urep.h", "type": "file" }, { - "bom-ref": "d2bc81e99e926087", + "bom-ref": "6d530e34d3174921", "name": "/usr/include/unicode/ures.h", "type": "file" }, { - "bom-ref": "6ca6fcc8857b76d0", + "bom-ref": "ecc9511d9ac78e5a", "name": "/usr/include/unicode/uscript.h", "type": "file" }, { - "bom-ref": "246030b2c85184d6", + "bom-ref": "a28390fa1640d284", "name": "/usr/include/unicode/usearch.h", "type": "file" }, { - "bom-ref": "8c04877416d48e90", + "bom-ref": "f5a0d4b651de7302", "name": "/usr/include/unicode/uset.h", "type": "file" }, { - "bom-ref": "baebfcbb28d3ab7a", + "bom-ref": "505d0612a6426020", "name": "/usr/include/unicode/usetiter.h", "type": "file" }, { - "bom-ref": "72f432cabf88d32c", + "bom-ref": "0f55ec4ec80e19ce", "name": "/usr/include/unicode/ushape.h", "type": "file" }, { - "bom-ref": "14d2a4d1c896e131", + "bom-ref": "b25b2b411655faab", "name": "/usr/include/unicode/usimplenumberformatter.h", "type": "file" }, { - "bom-ref": "7cebb0f63dab457d", + "bom-ref": "1ceb251be506eff7", "name": "/usr/include/unicode/uspoof.h", "type": "file" }, { - "bom-ref": "daeac384ecff04f6", + "bom-ref": "087c9e3615e3803c", "name": "/usr/include/unicode/usprep.h", "type": "file" }, { - "bom-ref": "79da1a66db56a93b", + "bom-ref": "210aa9f73c1c4bf9", "name": "/usr/include/unicode/ustdio.h", "type": "file" }, { - "bom-ref": "3603543d35ab59b9", + "bom-ref": "f13ba7408da502df", "name": "/usr/include/unicode/ustream.h", "type": "file" }, { - "bom-ref": "28f9b843a3303afd", + "bom-ref": "a81b93380d8cb7ef", "name": "/usr/include/unicode/ustring.h", "type": "file" }, { - "bom-ref": "4df972aa33c426ed", + "bom-ref": "4690874f12aa799f", "name": "/usr/include/unicode/ustringtrie.h", "type": "file" }, { - "bom-ref": "249862214cb1b498", + "bom-ref": "5f25fc837b972706", "name": "/usr/include/unicode/utext.h", "type": "file" }, { - "bom-ref": "024c5b3026c9ba09", + "bom-ref": "a21f6d524094127b", "name": "/usr/include/unicode/utf.h", "type": "file" }, { - "bom-ref": "6a92e1373caea9c0", + "bom-ref": "8244de9095def6d6", "name": "/usr/include/unicode/utf16.h", "type": "file" }, { - "bom-ref": "de61452433b483e4", + "bom-ref": "bde608f885ba640a", "name": "/usr/include/unicode/utf32.h", "type": "file" }, { - "bom-ref": "6ece7c0134d28c4d", + "bom-ref": "6ef7484f4f2127ef", "name": "/usr/include/unicode/utf8.h", "type": "file" }, { - "bom-ref": "6864a655f5d9d28f", + "bom-ref": "a87204d590d93481", "name": "/usr/include/unicode/utf_old.h", "type": "file" }, { - "bom-ref": "b2af9e59003fbbef", + "bom-ref": "99d8fd12b4da07e5", "name": "/usr/include/unicode/utmscale.h", "type": "file" }, { - "bom-ref": "cb1772f1d6c98db7", + "bom-ref": "5b032da7fd5b4345", "name": "/usr/include/unicode/utrace.h", "type": "file" }, { - "bom-ref": "42298a381e1f2a78", + "bom-ref": "d2bda3c8561e66aa", "name": "/usr/include/unicode/utrans.h", "type": "file" }, { - "bom-ref": "fe74bed9488f0692", + "bom-ref": "37c3e7fce5a65e68", "name": "/usr/include/unicode/utypes.h", "type": "file" }, { - "bom-ref": "25892b0b399b7044", + "bom-ref": "d65959be54d796e2", "name": "/usr/include/unicode/uvernum.h", "type": "file" }, { - "bom-ref": "085e1c2e9d69e012", + "bom-ref": "cadcd426235f5fa4", "name": "/usr/include/unicode/uversion.h", "type": "file" }, { - "bom-ref": "cdc3b6cff4add408", + "bom-ref": "12f784cec95337ce", "name": "/usr/include/unicode/vtzone.h", "type": "file" }, { - "bom-ref": "7ea5c6277be1af05", + "bom-ref": "d9dcdd14ef86699f", "name": "/usr/include/unistd.h", "type": "file" }, { - "bom-ref": "b01a2c5698fd480e", + "bom-ref": "dd8ad84d81a229b8", "name": "/usr/include/utime.h", "type": "file" }, { - "bom-ref": "0d34dccd7fafb6eb", + "bom-ref": "1830331ff10e9b45", "name": "/usr/include/utmp.h", "type": "file" }, { - "bom-ref": "a6d634d8fdd4bcba", + "bom-ref": "5c0e5a8fdf36efd0", "name": "/usr/include/utmpx.h", "type": "file" }, { - "bom-ref": "c0d21cf89899b9cb", + "bom-ref": "8a6f317acbbd63b1", "name": "/usr/include/values.h", "type": "file" }, { - "bom-ref": "fdef98b23fbe9326", + "bom-ref": "179c36514731c5b9", "name": "/usr/include/video/edid.h", "type": "file" }, { - "bom-ref": "6a29e7d677b6cf89", + "bom-ref": "2368e3edb5079692", "name": "/usr/include/video/sisfb.h", "type": "file" }, { - "bom-ref": "c49ceebe71e8c4fa", + "bom-ref": "2e871327cd72bf11", "name": "/usr/include/video/uvesafb.h", "type": "file" }, { - "bom-ref": "16bb405f96b039e6", + "bom-ref": "fd2a98fe80736f38", "name": "/usr/include/wait.h", "type": "file" }, { - "bom-ref": "73c6f866ff089c3c", + "bom-ref": "58ce6547b73b867a", "name": "/usr/include/wchar.h", "type": "file" }, { - "bom-ref": "8885e8666ad360e4", + "bom-ref": "e441fd9f3c20170a", "name": "/usr/include/wctype.h", "type": "file" }, { - "bom-ref": "55dd3ba5ae458db5", + "bom-ref": "d52e2e49cf09afb7", "name": "/usr/include/wordexp.h", "type": "file" }, { - "bom-ref": "0915df845b47b7f8", + "bom-ref": "3c194e274388a8e2", "name": "/usr/include/x86_64-linux-gnu/a.out.h", "type": "file" }, { - "bom-ref": "37215f068ae4e600", + "bom-ref": "217bab3015d70a73", "name": "/usr/include/x86_64-linux-gnu/asm/a.out.h", "type": "file" }, { - "bom-ref": "46171216fc47edd6", + "bom-ref": "b00150322dc39aa5", "name": "/usr/include/x86_64-linux-gnu/asm/amd_hsmp.h", "type": "file" }, { - "bom-ref": "cd3a4512e4742643", + "bom-ref": "8d9c8512d9a52658", "name": "/usr/include/x86_64-linux-gnu/asm/auxvec.h", "type": "file" }, { - "bom-ref": "9ee5c8f758543987", + "bom-ref": "20edfb79447273fc", "name": "/usr/include/x86_64-linux-gnu/asm/bitsperlong.h", "type": "file" }, { - "bom-ref": "3aeef72c8ee0a5ff", + "bom-ref": "fbaa1676f369ed94", "name": "/usr/include/x86_64-linux-gnu/asm/boot.h", "type": "file" }, { - "bom-ref": "6766256aeb243e59", + "bom-ref": "b7bb58d50fc4a566", "name": "/usr/include/x86_64-linux-gnu/asm/bootparam.h", "type": "file" }, { - "bom-ref": "cc7bff967760d2e6", + "bom-ref": "e9d50f69bc8d32a5", "name": "/usr/include/x86_64-linux-gnu/asm/bpf_perf_event.h", "type": "file" }, { - "bom-ref": "2b759e2973a65d93", + "bom-ref": "bfb636755312198c", "name": "/usr/include/x86_64-linux-gnu/asm/byteorder.h", "type": "file" }, { - "bom-ref": "52fbb0763fcc8df9", + "bom-ref": "d11960f1bb8c8616", "name": "/usr/include/x86_64-linux-gnu/asm/debugreg.h", "type": "file" }, { - "bom-ref": "a04ba3e32f319777", + "bom-ref": "522017c03713a424", "name": "/usr/include/x86_64-linux-gnu/asm/e820.h", "type": "file" }, { - "bom-ref": "6926c0910abb2e8e", + "bom-ref": "b26bcfbb7d641539", "name": "/usr/include/x86_64-linux-gnu/asm/errno.h", "type": "file" }, { - "bom-ref": "78d3a354440f9a3a", + "bom-ref": "0a4fdd0e5e629285", "name": "/usr/include/x86_64-linux-gnu/asm/fcntl.h", "type": "file" }, { - "bom-ref": "f1ec56ae0739eca1", + "bom-ref": "7bd626c8142b607a", "name": "/usr/include/x86_64-linux-gnu/asm/hw_breakpoint.h", "type": "file" }, { - "bom-ref": "fd95daffb9a1920b", + "bom-ref": "482dd5369a0aa640", "name": "/usr/include/x86_64-linux-gnu/asm/hwcap2.h", "type": "file" }, { - "bom-ref": "e195476b13e7df44", + "bom-ref": "122d9c8a3771d1d7", "name": "/usr/include/x86_64-linux-gnu/asm/ioctl.h", "type": "file" }, { - "bom-ref": "cf11d243c080375e", + "bom-ref": "116371099c382dc5", "name": "/usr/include/x86_64-linux-gnu/asm/ioctls.h", "type": "file" }, { - "bom-ref": "d637deaad8ae71fb", + "bom-ref": "9323e725b2fb7fb8", "name": "/usr/include/x86_64-linux-gnu/asm/ipcbuf.h", "type": "file" }, { - "bom-ref": "eead7c09017e1c50", + "bom-ref": "2ef33235d034450b", "name": "/usr/include/x86_64-linux-gnu/asm/ist.h", "type": "file" }, { - "bom-ref": "c0e12376d2aaece1", + "bom-ref": "4cfbfa347a15f986", "name": "/usr/include/x86_64-linux-gnu/asm/kvm.h", "type": "file" }, { - "bom-ref": "06bf393f50d3002c", + "bom-ref": "965a7cdf041b19eb", "name": "/usr/include/x86_64-linux-gnu/asm/kvm_para.h", "type": "file" }, { - "bom-ref": "f01e4236dfd0a4ee", + "bom-ref": "527b856f5a3f7fdd", "name": "/usr/include/x86_64-linux-gnu/asm/kvm_perf.h", "type": "file" }, { - "bom-ref": "6cea07ff4e4d6713", + "bom-ref": "5a20e44f01321700", "name": "/usr/include/x86_64-linux-gnu/asm/ldt.h", "type": "file" }, { - "bom-ref": "fa38b5b3fe44b0fd", + "bom-ref": "510b1e592a2bc0f2", "name": "/usr/include/x86_64-linux-gnu/asm/mce.h", "type": "file" }, { - "bom-ref": "9ebbc7292ba560cb", + "bom-ref": "0c0c0f9c4d6fdc4c", "name": "/usr/include/x86_64-linux-gnu/asm/mman.h", "type": "file" }, { - "bom-ref": "1b73e7fc64d060aa", + "bom-ref": "fe054a176963ca29", "name": "/usr/include/x86_64-linux-gnu/asm/msgbuf.h", "type": "file" }, { - "bom-ref": "189548a3ed88fc43", + "bom-ref": "9d758ef176d2b130", "name": "/usr/include/x86_64-linux-gnu/asm/msr.h", "type": "file" }, { - "bom-ref": "76c654256eaacffb", + "bom-ref": "7d98efbe5098b23c", "name": "/usr/include/x86_64-linux-gnu/asm/mtrr.h", "type": "file" }, { - "bom-ref": "6950783a1e3abaa6", + "bom-ref": "903068f17170afc5", "name": "/usr/include/x86_64-linux-gnu/asm/param.h", "type": "file" }, { - "bom-ref": "2fde03d56ac69a89", + "bom-ref": "7d64ad031da2769a", "name": "/usr/include/x86_64-linux-gnu/asm/perf_regs.h", "type": "file" }, { - "bom-ref": "5250f58f65c760f0", + "bom-ref": "fc3e9c15c714763f", "name": "/usr/include/x86_64-linux-gnu/asm/poll.h", "type": "file" }, { - "bom-ref": "6b42332c01e5f7f4", + "bom-ref": "44ca192bdd89481b", "name": "/usr/include/x86_64-linux-gnu/asm/posix_types.h", "type": "file" }, { - "bom-ref": "c58a60545fb01f90", + "bom-ref": "67034941c4a608f7", "name": "/usr/include/x86_64-linux-gnu/asm/posix_types_32.h", "type": "file" }, { - "bom-ref": "339599106974f804", + "bom-ref": "57beabf4c59c79e7", "name": "/usr/include/x86_64-linux-gnu/asm/posix_types_64.h", "type": "file" }, { - "bom-ref": "b9cc5201c03f1b95", + "bom-ref": "a1a18cb3fc993592", "name": "/usr/include/x86_64-linux-gnu/asm/posix_types_x32.h", "type": "file" }, { - "bom-ref": "c5f3647a37e89abe", + "bom-ref": "79c4b4ba68d4e0d9", "name": "/usr/include/x86_64-linux-gnu/asm/prctl.h", "type": "file" }, { - "bom-ref": "d02b62a24cabe58d", + "bom-ref": "4e97b86ccfbcd21e", "name": "/usr/include/x86_64-linux-gnu/asm/processor-flags.h", "type": "file" }, { - "bom-ref": "6645b4ec7857f798", + "bom-ref": "c595f417d7a022eb", "name": "/usr/include/x86_64-linux-gnu/asm/ptrace-abi.h", "type": "file" }, { - "bom-ref": "c332dcaea7a7c7f4", + "bom-ref": "dbad9e68f9dd892f", "name": "/usr/include/x86_64-linux-gnu/asm/ptrace.h", "type": "file" }, { - "bom-ref": "d58bd7dde3e3d8c1", + "bom-ref": "ca301efc369623ce", "name": "/usr/include/x86_64-linux-gnu/asm/resource.h", "type": "file" }, { - "bom-ref": "9d7ca27c6a4f159d", + "bom-ref": "7f18d6a8f84d3356", "name": "/usr/include/x86_64-linux-gnu/asm/sembuf.h", "type": "file" }, { - "bom-ref": "fb07720bcbac903f", + "bom-ref": "b65d6cedb0d51f7c", "name": "/usr/include/x86_64-linux-gnu/asm/setup.h", "type": "file" }, { - "bom-ref": "aba7d6604a3e065f", + "bom-ref": "8682b9bb5109d20c", "name": "/usr/include/x86_64-linux-gnu/asm/sgx.h", "type": "file" }, { - "bom-ref": "210dc743dd9837fa", + "bom-ref": "d9db7d5d44d34439", "name": "/usr/include/x86_64-linux-gnu/asm/shmbuf.h", "type": "file" }, { - "bom-ref": "ec9a6fd7287b871b", + "bom-ref": "a644940c41a64be0", "name": "/usr/include/x86_64-linux-gnu/asm/sigcontext.h", "type": "file" }, { - "bom-ref": "354281ce6a03a516", + "bom-ref": "113783371fd47a61", "name": "/usr/include/x86_64-linux-gnu/asm/sigcontext32.h", "type": "file" }, { - "bom-ref": "812bfb073ab2b581", + "bom-ref": "284e3080b9b738ae", "name": "/usr/include/x86_64-linux-gnu/asm/siginfo.h", "type": "file" }, { - "bom-ref": "4f18238394e1d57c", + "bom-ref": "48a8d89cc01a3aaf", "name": "/usr/include/x86_64-linux-gnu/asm/signal.h", "type": "file" }, { - "bom-ref": "2749aed104096b91", + "bom-ref": "e546948238b35b9e", "name": "/usr/include/x86_64-linux-gnu/asm/socket.h", "type": "file" }, { - "bom-ref": "5dde1908ba7efd37", + "bom-ref": "e76f158e771fd540", "name": "/usr/include/x86_64-linux-gnu/asm/sockios.h", "type": "file" }, { - "bom-ref": "b5fd19376eb55604", + "bom-ref": "c7d14db524e0b163", "name": "/usr/include/x86_64-linux-gnu/asm/stat.h", "type": "file" }, { - "bom-ref": "91d5f45b9195f1c5", + "bom-ref": "8958a8badeac09c6", "name": "/usr/include/x86_64-linux-gnu/asm/statfs.h", "type": "file" }, { - "bom-ref": "a8deaf0672688352", + "bom-ref": "4ef3eea5485a5489", "name": "/usr/include/x86_64-linux-gnu/asm/svm.h", "type": "file" }, { - "bom-ref": "2de5b5376cad7575", + "bom-ref": "ae5285bf2470ad2e", "name": "/usr/include/x86_64-linux-gnu/asm/swab.h", "type": "file" }, { - "bom-ref": "f2b08340dac26215", + "bom-ref": "8ec719a9a70ecc46", "name": "/usr/include/x86_64-linux-gnu/asm/termbits.h", "type": "file" }, { - "bom-ref": "b1dca4bdeba90b18", + "bom-ref": "44c7381748156af3", "name": "/usr/include/x86_64-linux-gnu/asm/termios.h", "type": "file" }, { - "bom-ref": "d0f03956a9f1c0ae", + "bom-ref": "93b9685ecb0020b9", "name": "/usr/include/x86_64-linux-gnu/asm/types.h", "type": "file" }, { - "bom-ref": "c1e2ffa07d7e07ec", + "bom-ref": "21d26850a65d4fff", "name": "/usr/include/x86_64-linux-gnu/asm/ucontext.h", "type": "file" }, { - "bom-ref": "016f1b5036b75e1d", + "bom-ref": "4dcd4c27bbafe4c6", "name": "/usr/include/x86_64-linux-gnu/asm/unistd.h", "type": "file" }, { - "bom-ref": "d2011f4339ef3736", + "bom-ref": "ef24e21bbbfd9485", "name": "/usr/include/x86_64-linux-gnu/asm/unistd_32.h", "type": "file" }, { - "bom-ref": "0ab8b11b7e271e9e", + "bom-ref": "36347b58f9b21ccd", "name": "/usr/include/x86_64-linux-gnu/asm/unistd_64.h", "type": "file" }, { - "bom-ref": "3c77fa2af1e7ee98", + "bom-ref": "8009a021189376ff", "name": "/usr/include/x86_64-linux-gnu/asm/unistd_x32.h", "type": "file" }, { - "bom-ref": "97a3e1de22995880", + "bom-ref": "d0b35168cdccf74b", "name": "/usr/include/x86_64-linux-gnu/asm/vm86.h", "type": "file" }, { - "bom-ref": "16f4cd46cd64b2be", + "bom-ref": "b1fd57ea01a752f5", "name": "/usr/include/x86_64-linux-gnu/asm/vmx.h", "type": "file" }, { - "bom-ref": "26b88f5d79742fed", + "bom-ref": "75abb750f74c9cb2", "name": "/usr/include/x86_64-linux-gnu/asm/vsyscall.h", "type": "file" }, { - "bom-ref": "e4bdf0d43eaebb5b", + "bom-ref": "09d85a0158b906d5", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_buildinfo.h", "type": "file" }, { - "bom-ref": "be906a554124da22", + "bom-ref": "099ced398341d0d0", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cGetNB_gelqf.h", "type": "file" }, { - "bom-ref": "235d897b9f58e7e4", + "bom-ref": "8180af10cfd34d46", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cGetNB_geqlf.h", "type": "file" }, { - "bom-ref": "b0eba011b3adc7a7", + "bom-ref": "025343c8ff01c801", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cGetNB_geqrf.h", "type": "file" }, { - "bom-ref": "5b0e539490533de0", + "bom-ref": "aadc2b5c1de768e6", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cGetNB_gerqf.h", "type": "file" }, { - "bom-ref": "32b1dbf6d5b55446", + "bom-ref": "92541428df79b27c", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cNCmm.h", "type": "file" }, { - "bom-ref": "ebad1a6366959188", + "bom-ref": "46902109a293473a", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cacheedge.h", "type": "file" }, { - "bom-ref": "9632133dac47da99", + "bom-ref": "e73963eb3cb5983b", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cher2.h", "type": "file" }, { - "bom-ref": "f12b7b7d4fb36001", + "bom-ref": "74ddd89255045de3", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cher2_L1.h", "type": "file" }, { - "bom-ref": "a7ef6fd1ec5f609d", + "bom-ref": "aa76fb34527c0023", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cher2_L2.h", "type": "file" }, { - "bom-ref": "34e395468047c677", + "bom-ref": "21e0e1136f05a43d", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cmvn.h", "type": "file" }, { - "bom-ref": "3243a416e56b227c", + "bom-ref": "6c54b9a2fa3587e2", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cmvn_L1.h", "type": "file" }, { - "bom-ref": "db465dbacda3bf95", + "bom-ref": "8be120fc298b780f", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cmvn_L2.h", "type": "file" }, { - "bom-ref": "6251443332b6516e", + "bom-ref": "e078a13a8f366c80", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cmvnkernels.h", "type": "file" }, { - "bom-ref": "e230469f50e1c6be", + "bom-ref": "bcffde97721f32fc", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cmvt.h", "type": "file" }, { - "bom-ref": "5ff7457424ece8b5", + "bom-ref": "702cc84b5b47a67b", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cmvt_L1.h", "type": "file" }, { - "bom-ref": "d86b12b4e5d90016", + "bom-ref": "17b3d58dfe4e4414", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cmvt_L2.h", "type": "file" }, { - "bom-ref": "78a06c7048adcbf2", + "bom-ref": "a1f45b95ffd93538", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cmvtkernels.h", "type": "file" }, { - "bom-ref": "6214122b23af2950", + "bom-ref": "77431977a20b2d5e", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cr1.h", "type": "file" }, { - "bom-ref": "e1e4fc315e41db2a", + "bom-ref": "f55a3895a36935e8", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cr1_L1.h", "type": "file" }, { - "bom-ref": "06ef87a54ac41419", + "bom-ref": "edbc842e753f57d3", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cr1_L2.h", "type": "file" }, { - "bom-ref": "46d6677dc6184907", + "bom-ref": "bfa4f402db7718f9", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cr1kernels.h", "type": "file" }, { - "bom-ref": "cec68fe84f376ed7", + "bom-ref": "f8854ff0202d394d", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cr2.h", "type": "file" }, { - "bom-ref": "13c6c40c15f08ec0", + "bom-ref": "ca4b555829f7ea9a", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cr2_L1.h", "type": "file" }, { - "bom-ref": "5b34ccab02e52bd4", + "bom-ref": "42fb41a00e002b72", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cr2_L2.h", "type": "file" }, { - "bom-ref": "39136f1c2ec48fd0", + "bom-ref": "38ac1978b774cd42", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_cr2kernels.h", "type": "file" }, { - "bom-ref": "c622a5c9984d5b4e", + "bom-ref": "fbf83cbd608d3af0", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_csNKB.h", "type": "file" }, { - "bom-ref": "ece9e13a153ff16c", + "bom-ref": "6bbbababd8dbd126", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_csyr.h", "type": "file" }, { - "bom-ref": "8ef129d3f22ffc7d", + "bom-ref": "89682d407fd64c77", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_csyr2NX.h", "type": "file" }, { - "bom-ref": "1cf6b3026e03fe1c", + "bom-ref": "7bee04809c173806", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_csyrNX.h", "type": "file" }, { - "bom-ref": "28920a57660b260a", + "bom-ref": "c9d39302a3be4fe4", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_csyr_L1.h", "type": "file" }, { - "bom-ref": "7868ea38137549ef", + "bom-ref": "f4b5c3dae26eb761", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_csyr_L2.h", "type": "file" }, { - "bom-ref": "f8ff1636e83e301a", + "bom-ref": "8fca86ec0b924888", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_csysinfo.h", "type": "file" }, { - "bom-ref": "0d5c3dd750cf07c4", + "bom-ref": "fdf5c44a046aa006", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ctGetNB_gelqf.h", "type": "file" }, { - "bom-ref": "d0fa8f66879c8f90", + "bom-ref": "013b43d7b2bbd1a2", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ctGetNB_geqlf.h", "type": "file" }, { - "bom-ref": "f8e64281f6325d4c", + "bom-ref": "dfc2fb0b372cb89e", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ctGetNB_geqrf.h", "type": "file" }, { - "bom-ref": "f401e592fb3cac23", + "bom-ref": "54df08afbe9aaf09", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ctGetNB_gerqf.h", "type": "file" }, { - "bom-ref": "314bff8554408f61", + "bom-ref": "19eeca555a6e7063", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ctrsmXover.h", "type": "file" }, { - "bom-ref": "fd826299ab3f9036", + "bom-ref": "4793088b3c822350", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dGetNB_gelqf.h", "type": "file" }, { - "bom-ref": "9d2a0c45679971c3", + "bom-ref": "4f7de9441e0a17c5", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dGetNB_geqlf.h", "type": "file" }, { - "bom-ref": "7eb2d4c75f576601", + "bom-ref": "82cb3921696c4547", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dGetNB_geqrf.h", "type": "file" }, { - "bom-ref": "80954147a8393683", + "bom-ref": "2637d1f02ee3c005", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dGetNB_gerqf.h", "type": "file" }, { - "bom-ref": "faca05ee8a275aed", + "bom-ref": "ec332c4e17231253", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dNCmm.h", "type": "file" }, { - "bom-ref": "646237ac0f3061cd", + "bom-ref": "89ea96ee5c5a0a4b", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dlamch.h", "type": "file" }, { - "bom-ref": "e5041adb4888e76a", + "bom-ref": "505d4217800e0068", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dmvn.h", "type": "file" }, { - "bom-ref": "390cd8d8d9bb49bb", + "bom-ref": "389d8ada2ac933e9", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dmvn_L1.h", "type": "file" }, { - "bom-ref": "449acf6b7c2b2a70", + "bom-ref": "20c9fac5f25cc70a", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dmvn_L2.h", "type": "file" }, { - "bom-ref": "fd1948bdcbd3827f", + "bom-ref": "c5ba205b588ef43d", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dmvnkernels.h", "type": "file" }, { - "bom-ref": "7931fba5cca5c3f7", + "bom-ref": "d73f7fec757de609", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dmvt.h", "type": "file" }, { - "bom-ref": "f7066fa21a849f57", + "bom-ref": "aae988c0f2a8cdc5", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dmvt_L1.h", "type": "file" }, { - "bom-ref": "7286657a7a4c45dd", + "bom-ref": "d92caa88e8000937", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dmvt_L2.h", "type": "file" }, { - "bom-ref": "abd248a4e09d456d", + "bom-ref": "6757d6a99cd7b65b", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dmvtkernels.h", "type": "file" }, { - "bom-ref": "30cb3dfd9e175861", + "bom-ref": "465ee33700afb797", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dr1.h", "type": "file" }, { - "bom-ref": "a9c73d73b3ec0da6", + "bom-ref": "032938b3690d9bd8", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dr1_L1.h", "type": "file" }, { - "bom-ref": "92d0cf4d5e7d3b59", + "bom-ref": "30085587b9fd3cab", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dr1_L2.h", "type": "file" }, { - "bom-ref": "b697900653b39276", + "bom-ref": "13e21872eb38dacc", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dr1kernels.h", "type": "file" }, { - "bom-ref": "beb60da7b7358318", + "bom-ref": "5a8c4d8a80b4d73a", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dr2.h", "type": "file" }, { - "bom-ref": "9344e56f3efabede", + "bom-ref": "9a6d7762bda9a214", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dr2_L1.h", "type": "file" }, { - "bom-ref": "4681bc85ba2c351b", + "bom-ref": "220ab44d2104def9", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dr2_L2.h", "type": "file" }, { - "bom-ref": "38b2a5799fa0cea0", + "bom-ref": "604a5186b55f3232", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dr2kernels.h", "type": "file" }, { - "bom-ref": "1d932c9f50498d96", + "bom-ref": "61112e0e89714d0c", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dsyr.h", "type": "file" }, { - "bom-ref": "98974094b0397b5b", + "bom-ref": "a8fc864109816169", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dsyr2.h", "type": "file" }, { - "bom-ref": "ddfa6f438606abe0", + "bom-ref": "32377eb4d6132902", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dsyr2NX.h", "type": "file" }, { - "bom-ref": "962c8481734e668c", + "bom-ref": "e1683dfdf311801e", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dsyr2_L1.h", "type": "file" }, { - "bom-ref": "6851a9cbce4c3313", + "bom-ref": "648d757839fe0355", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dsyr2_L2.h", "type": "file" }, { - "bom-ref": "636abccf38969a4e", + "bom-ref": "4253e1565992ca00", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dsyrNX.h", "type": "file" }, { - "bom-ref": "cf4d7cf71c7c5776", + "bom-ref": "305a06595a2b965c", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dsyr_L1.h", "type": "file" }, { - "bom-ref": "8e185800433c2619", + "bom-ref": "abe31c6b453e90b3", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dsyr_L2.h", "type": "file" }, { - "bom-ref": "d52cbd355e2c71f3", + "bom-ref": "c0ff506d511f90e5", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dsysinfo.h", "type": "file" }, { - "bom-ref": "df47542d887c6efc", + "bom-ref": "2fe5c881689e037e", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dtGetNB_gelqf.h", "type": "file" }, { - "bom-ref": "d27e40b98bd3d07c", + "bom-ref": "8dc2e13ce53ee986", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dtGetNB_geqlf.h", "type": "file" }, { - "bom-ref": "a693db549b70e848", + "bom-ref": "c2ed97f4fdbe2722", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dtGetNB_geqrf.h", "type": "file" }, { - "bom-ref": "f0c0609068d17056", + "bom-ref": "c7847ed01cb77d78", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dtGetNB_gerqf.h", "type": "file" }, { - "bom-ref": "13edcee9be8d1587", + "bom-ref": "2b7f69919467c995", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_dtrsmXover.h", "type": "file" }, { - "bom-ref": "d5524dca71c155d8", + "bom-ref": "7207bf61ce58793a", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sGetNB_gelqf.h", "type": "file" }, { - "bom-ref": "23ba0dfc316a769c", + "bom-ref": "a19972ba786b6f92", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sGetNB_geqlf.h", "type": "file" }, { - "bom-ref": "2d058a5f1615e048", + "bom-ref": "d76f35b2129f6076", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sGetNB_geqrf.h", "type": "file" }, { - "bom-ref": "1cdcacfeecc0e99e", + "bom-ref": "412f84aba6ea6e20", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sGetNB_gerqf.h", "type": "file" }, { - "bom-ref": "12f53b2cce485f09", + "bom-ref": "d9cfddaae6de2fa7", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sNCmm.h", "type": "file" }, { - "bom-ref": "7de43856218f7560", + "bom-ref": "e1142b98ebec7c02", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_slamch.h", "type": "file" }, { - "bom-ref": "c1bf0eecdf76d63d", + "bom-ref": "61eaca40911098a7", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_smvn.h", "type": "file" }, { - "bom-ref": "03087079cf05eb92", + "bom-ref": "13dc769def415664", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_smvn_L1.h", "type": "file" }, { - "bom-ref": "fa314006f5c51da0", + "bom-ref": "f2caeaa8e8968ce2", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_smvn_L2.h", "type": "file" }, { - "bom-ref": "19e872dde125e0fb", + "bom-ref": "7b8cd26b89c5b931", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_smvnkernels.h", "type": "file" }, { - "bom-ref": "bc812bdc1a0dc3ef", + "bom-ref": "1b6764e70c3f23ad", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_smvt.h", "type": "file" }, { - "bom-ref": "cd92a062b3a86719", + "bom-ref": "550cc0c432d4022f", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_smvt_L1.h", "type": "file" }, { - "bom-ref": "31c487167267a892", + "bom-ref": "41c7221c6fd35264", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_smvt_L2.h", "type": "file" }, { - "bom-ref": "ee2b92cd1aa8ef9a", + "bom-ref": "b182a609e1d22db8", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_smvtkernels.h", "type": "file" }, { - "bom-ref": "ba423737300dac2b", + "bom-ref": "2dcf2d9c824477d1", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sr1.h", "type": "file" }, { - "bom-ref": "6858cde4d1a7fb1b", + "bom-ref": "f8463eccc35a2841", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sr1_L1.h", "type": "file" }, { - "bom-ref": "ac1268dd5369a383", + "bom-ref": "96b88a926dea8f3d", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sr1_L2.h", "type": "file" }, { - "bom-ref": "bd860831118d631e", + "bom-ref": "cbad39eb4acbe1c4", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sr1kernels.h", "type": "file" }, { - "bom-ref": "26b94efe197edac0", + "bom-ref": "5a3d5283dec1561a", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sr2.h", "type": "file" }, { - "bom-ref": "dd44e1d0928d4701", + "bom-ref": "c64c3e815e16d8ff", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sr2_L1.h", "type": "file" }, { - "bom-ref": "e233b4acd7c289be", + "bom-ref": "dfefb6ba83303744", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sr2_L2.h", "type": "file" }, { - "bom-ref": "2f5bec503f196d96", + "bom-ref": "6006f540b8f1c6a8", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_sr2kernels.h", "type": "file" }, { - "bom-ref": "d0f7bce8ed0f9f18", + "bom-ref": "7748bd14f6fc1876", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ssyr.h", "type": "file" }, { - "bom-ref": "cdfecce34ee90cee", + "bom-ref": "82f8209115dc071c", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ssyr2.h", "type": "file" }, { - "bom-ref": "bdbdb282519d41d2", + "bom-ref": "fe676123c3a29b9c", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ssyr2NX.h", "type": "file" }, { - "bom-ref": "462fd2ea753534e5", + "bom-ref": "692fa466d8d2c08b", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ssyr2_L1.h", "type": "file" }, { - "bom-ref": "f60dc7c66c6c04e4", + "bom-ref": "38267f5d4876fc3e", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ssyr2_L2.h", "type": "file" }, { - "bom-ref": "48ea352575cd653b", + "bom-ref": "5ab78e5f0fe31335", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ssyrNX.h", "type": "file" }, { - "bom-ref": "a02bead744b3ef0d", + "bom-ref": "c67bbd6c29cd74e7", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ssyr_L1.h", "type": "file" }, { - "bom-ref": "72d4057bce62bb39", + "bom-ref": "f951820680df23a3", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ssyr_L2.h", "type": "file" }, { - "bom-ref": "c7fef4e03fc796dd", + "bom-ref": "29ea7c68a625a7f7", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ssysinfo.h", "type": "file" }, { - "bom-ref": "f896d7105a2b8585", + "bom-ref": "671a311c56b8162f", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_stGetNB_gelqf.h", "type": "file" }, { - "bom-ref": "7937aeb9aba22477", + "bom-ref": "7edf52d4bc615565", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_stGetNB_geqlf.h", "type": "file" }, { - "bom-ref": "c3891af202fb4b20", + "bom-ref": "031ba997120e8056", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_stGetNB_geqrf.h", "type": "file" }, { - "bom-ref": "5b09cb6c91136ee2", + "bom-ref": "a0c14c9970ac2430", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_stGetNB_gerqf.h", "type": "file" }, { - "bom-ref": "7dd44337025280c1", + "bom-ref": "0cac1fc4be3b3247", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_strsmXover.h", "type": "file" }, { - "bom-ref": "a97ad3b8b4b3cdb2", + "bom-ref": "05ac1584a0c87c18", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_taffinity.h", "type": "file" }, { - "bom-ref": "791a4c91141359d6", + "bom-ref": "908f309a190f479c", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_tcacheedge.h", "type": "file" }, { - "bom-ref": "c3de429400905c51", + "bom-ref": "6eece68584e39ecb", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_trsmNB.h", "type": "file" }, { - "bom-ref": "4604d0a59f343c63", + "bom-ref": "72f6c1e4a89bc581", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_tsumm.h", "type": "file" }, { - "bom-ref": "6ca7cc3fdd48ecce", + "bom-ref": "d4448e2cb8e75ff8", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_type.h", "type": "file" }, { - "bom-ref": "cbe2f7eb0c12429e", + "bom-ref": "51203c21e37bdcf8", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zGetNB_gelqf.h", "type": "file" }, { - "bom-ref": "0cc45426e168b282", + "bom-ref": "63b6fa649182f8c4", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zGetNB_geqlf.h", "type": "file" }, { - "bom-ref": "1ad42838f2d166ef", + "bom-ref": "712146f55888e64d", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zGetNB_geqrf.h", "type": "file" }, { - "bom-ref": "277a76e6cbf64bfb", + "bom-ref": "3fb433fc0512fba1", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zGetNB_gerqf.h", "type": "file" }, { - "bom-ref": "d2c87a57cd71590c", + "bom-ref": "380a69a69cdc1f3e", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zNCmm.h", "type": "file" }, { - "bom-ref": "c3fa0f7f04b61985", + "bom-ref": "affd745ba133197b", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zdNKB.h", "type": "file" }, { - "bom-ref": "af1f418393656486", + "bom-ref": "c5267c60303f2740", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zher2.h", "type": "file" }, { - "bom-ref": "6e88f369b2608d23", + "bom-ref": "b6435b4a08456be9", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zher2_L1.h", "type": "file" }, { - "bom-ref": "673174c653b1d534", + "bom-ref": "46e9817a6cec55d6", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zher2_L2.h", "type": "file" }, { - "bom-ref": "9721998110f941d3", + "bom-ref": "df23b12aa7ed844d", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zmvn.h", "type": "file" }, { - "bom-ref": "e4361b3582e2ec1c", + "bom-ref": "911ba5ebf19d0a0a", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zmvn_L1.h", "type": "file" }, { - "bom-ref": "a4ffae89b950235f", + "bom-ref": "c9b660be2b13b531", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zmvn_L2.h", "type": "file" }, { - "bom-ref": "ec8380898d427d06", + "bom-ref": "ab8a950442c7ee24", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zmvnkernels.h", "type": "file" }, { - "bom-ref": "5bd604f08ec2ff38", + "bom-ref": "905875229af7105a", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zmvt.h", "type": "file" }, { - "bom-ref": "ef72a3073dafbab7", + "bom-ref": "f6c12ef267be2555", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zmvt_L1.h", "type": "file" }, { - "bom-ref": "78ba888e95ddc4d8", + "bom-ref": "09e2f6568d88e50a", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zmvt_L2.h", "type": "file" }, { - "bom-ref": "6fc99dd1b1385d7d", + "bom-ref": "59f9eeb771d58aff", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zmvtkernels.h", "type": "file" }, { - "bom-ref": "88a965b7fd1576bb", + "bom-ref": "65efa9af5f7a3779", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zr1.h", "type": "file" }, { - "bom-ref": "2a9e1635b4d7929a", + "bom-ref": "20b4aff2105f3bc4", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zr1_L1.h", "type": "file" }, { - "bom-ref": "367d740b945ea142", + "bom-ref": "d7a8e1557caece88", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zr1_L2.h", "type": "file" }, { - "bom-ref": "f57837cc63adfbc2", + "bom-ref": "2186840572d1ca28", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zr1kernels.h", "type": "file" }, { - "bom-ref": "fdd73f928003693b", + "bom-ref": "2f35669e837f7c41", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zr2.h", "type": "file" }, { - "bom-ref": "6a8b21d89fbbfeb7", + "bom-ref": "1b95a20204e92e9d", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zr2_L1.h", "type": "file" }, { - "bom-ref": "9902587622e41843", + "bom-ref": "148c65b214da6479", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zr2_L2.h", "type": "file" }, { - "bom-ref": "758657815fce6820", + "bom-ref": "c38ab2880f50cc32", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zr2kernels.h", "type": "file" }, { - "bom-ref": "c3e9a107c016c754", + "bom-ref": "5575b26343dfcad2", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zsyr.h", "type": "file" }, { - "bom-ref": "72159b6739fb67d3", + "bom-ref": "ce0692407791c69d", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zsyr2NX.h", "type": "file" }, { - "bom-ref": "538eac3b3b3a16ee", + "bom-ref": "8e098baeea2f9868", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zsyrNX.h", "type": "file" }, { - "bom-ref": "e33d6ca27cf825a3", + "bom-ref": "d6affd7ca0bb78b5", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zsyr_L1.h", "type": "file" }, { - "bom-ref": "c6f519008cf967cb", + "bom-ref": "2adb82808eace089", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zsyr_L2.h", "type": "file" }, { - "bom-ref": "081d94d32c177621", + "bom-ref": "cdb199228d2cd723", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_zsysinfo.h", "type": "file" }, { - "bom-ref": "62d48ae36a10831a", + "bom-ref": "6e13af154c43f560", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ztGetNB_gelqf.h", "type": "file" }, { - "bom-ref": "6eded03cee0c3cdc", + "bom-ref": "b515538af36cac96", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ztGetNB_geqlf.h", "type": "file" }, { - "bom-ref": "52031a98e038002c", + "bom-ref": "416f5068599d24e6", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ztGetNB_geqrf.h", "type": "file" }, { - "bom-ref": "2c63f2023f7dd4f3", + "bom-ref": "3e7c63bbbdce42f1", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ztGetNB_gerqf.h", "type": "file" }, { - "bom-ref": "ed76fcc5e8b1993b", + "bom-ref": "23a932968194c7bd", "name": "/usr/include/x86_64-linux-gnu/atlas/atlas_ztrsmXover.h", "type": "file" }, { - "bom-ref": "76181508ef892d19", + "bom-ref": "424b6f18827f10ff", "name": "/usr/include/x86_64-linux-gnu/atlas/cXover.h", "type": "file" }, { - "bom-ref": "a4dc42d6cc8090a8", + "bom-ref": "b78d20261ddf3e1a", "name": "/usr/include/x86_64-linux-gnu/atlas/cmm.h", "type": "file" }, { - "bom-ref": "563ebbec41f03820", + "bom-ref": "24d2020c9fb005b2", "name": "/usr/include/x86_64-linux-gnu/atlas/dXover.h", "type": "file" }, { - "bom-ref": "faf4fd448fe31250", + "bom-ref": "af4875ad835a33be", "name": "/usr/include/x86_64-linux-gnu/atlas/dmm.h", "type": "file" }, { - "bom-ref": "45b0edf95bc1f846", + "bom-ref": "91c24a5a72dabc9c", "name": "/usr/include/x86_64-linux-gnu/atlas/sXover.h", "type": "file" }, { - "bom-ref": "67205fc043edd0ce", + "bom-ref": "06ea31f3dc1d6628", "name": "/usr/include/x86_64-linux-gnu/atlas/smm.h", "type": "file" }, { - "bom-ref": "0dfd98a8d79632b1", + "bom-ref": "3cbc64e5dbd23e53", "name": "/usr/include/x86_64-linux-gnu/atlas/zXover.h", "type": "file" }, { - "bom-ref": "314079e75b52e516", + "bom-ref": "e0ab94d4e62a66f0", "name": "/usr/include/x86_64-linux-gnu/atlas/zmm.h", "type": "file" }, { - "bom-ref": "4f920cfa4b1e46c2", + "bom-ref": "3b33238e1067b1a0", "name": "/usr/include/x86_64-linux-gnu/bits/a.out.h", "type": "file" }, { - "bom-ref": "46548a0129c53d08", + "bom-ref": "3f60480717bcbba2", "name": "/usr/include/x86_64-linux-gnu/bits/argp-ldbl.h", "type": "file" }, { - "bom-ref": "5319a8c3e05d2f21", + "bom-ref": "484444ed43c6fe3f", "name": "/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h", "type": "file" }, { - "bom-ref": "c8db5682c4e0cf25", + "bom-ref": "dbdd850cf0aa75c3", "name": "/usr/include/x86_64-linux-gnu/bits/byteswap.h", "type": "file" }, { - "bom-ref": "91a422a2202af334", + "bom-ref": "0f4aeb0f265f058e", "name": "/usr/include/x86_64-linux-gnu/bits/cmathcalls.h", "type": "file" }, { - "bom-ref": "9a8539de4bd60f4d", + "bom-ref": "0605e0ab12948c0f", "name": "/usr/include/x86_64-linux-gnu/bits/confname.h", "type": "file" }, { - "bom-ref": "51cd32114f264312", + "bom-ref": "a9c8f13d2fdaaf34", "name": "/usr/include/x86_64-linux-gnu/bits/cpu-set.h", "type": "file" }, { - "bom-ref": "40c2f895e4b3afea", + "bom-ref": "8a4567d2bbb08ebc", "name": "/usr/include/x86_64-linux-gnu/bits/dirent.h", "type": "file" }, { - "bom-ref": "8fdab14cfa1253fb", + "bom-ref": "6737892120973705", "name": "/usr/include/x86_64-linux-gnu/bits/dirent_ext.h", "type": "file" }, { - "bom-ref": "191b40ed1621aaef", + "bom-ref": "1228d8ed3c77efb1", "name": "/usr/include/x86_64-linux-gnu/bits/dl_find_object.h", "type": "file" }, { - "bom-ref": "23c78ef5fe2eec68", + "bom-ref": "aec98c61fc6a910e", "name": "/usr/include/x86_64-linux-gnu/bits/dlfcn.h", "type": "file" }, { - "bom-ref": "b7471905008f3695", + "bom-ref": "7c915f88296c678b", "name": "/usr/include/x86_64-linux-gnu/bits/elfclass.h", "type": "file" }, { - "bom-ref": "2943ed34a3833738", + "bom-ref": "2e5f923471b2bc8e", "name": "/usr/include/x86_64-linux-gnu/bits/endian.h", "type": "file" }, { - "bom-ref": "39de1728d843c895", + "bom-ref": "eae4ac84a163da5b", "name": "/usr/include/x86_64-linux-gnu/bits/endianness.h", "type": "file" }, { - "bom-ref": "d49335bfc5acf051", + "bom-ref": "127235a3b225837f", "name": "/usr/include/x86_64-linux-gnu/bits/environments.h", "type": "file" }, { - "bom-ref": "20c8efc8177a6b69", + "bom-ref": "1ce913f9c684a1f7", "name": "/usr/include/x86_64-linux-gnu/bits/epoll.h", "type": "file" }, { - "bom-ref": "f8527cd5a0184d7d", + "bom-ref": "93622181793ddd7f", "name": "/usr/include/x86_64-linux-gnu/bits/err-ldbl.h", "type": "file" }, { - "bom-ref": "b29d5ccf3341ef6d", + "bom-ref": "6c35f08baf8811d7", "name": "/usr/include/x86_64-linux-gnu/bits/errno.h", "type": "file" }, { - "bom-ref": "be6eff62c9d42732", + "bom-ref": "1efed078b925aa14", "name": "/usr/include/x86_64-linux-gnu/bits/error-ldbl.h", "type": "file" }, { - "bom-ref": "70d95128b243e357", + "bom-ref": "2b0d4d0859decf89", "name": "/usr/include/x86_64-linux-gnu/bits/error.h", "type": "file" }, { - "bom-ref": "887bf7e09324d8d2", + "bom-ref": "6c3eb6f8649441e8", "name": "/usr/include/x86_64-linux-gnu/bits/eventfd.h", "type": "file" }, { - "bom-ref": "26eec38d1e30a10e", + "bom-ref": "cd0263afe9ef0e3c", "name": "/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h", "type": "file" }, { - "bom-ref": "5a95b2a380ec317c", + "bom-ref": "4e8986c03ee6793a", "name": "/usr/include/x86_64-linux-gnu/bits/fcntl.h", "type": "file" }, { - "bom-ref": "2dad5835a1931b15", + "bom-ref": "19dfb54993fd668b", "name": "/usr/include/x86_64-linux-gnu/bits/fcntl2.h", "type": "file" }, { - "bom-ref": "ec4f90066a74e313", + "bom-ref": "23099313af54b3c5", "name": "/usr/include/x86_64-linux-gnu/bits/fenv.h", "type": "file" }, { - "bom-ref": "db101b4c83e7e483", + "bom-ref": "bdeb3ca98319eacd", "name": "/usr/include/x86_64-linux-gnu/bits/floatn-common.h", "type": "file" }, { - "bom-ref": "5403b2b706099f7b", + "bom-ref": "5d1300c2e87b565d", "name": "/usr/include/x86_64-linux-gnu/bits/floatn.h", "type": "file" }, { - "bom-ref": "e9dda23e72c4d667", + "bom-ref": "abd2dbe0194012ad", "name": "/usr/include/x86_64-linux-gnu/bits/flt-eval-method.h", "type": "file" }, { - "bom-ref": "241641354a79672a", + "bom-ref": "36ba84f41b645a70", "name": "/usr/include/x86_64-linux-gnu/bits/fp-fast.h", "type": "file" }, { - "bom-ref": "42aa0606dce7db3e", + "bom-ref": "fc8f04b7b8396d84", "name": "/usr/include/x86_64-linux-gnu/bits/fp-logb.h", "type": "file" }, { - "bom-ref": "22ed7af44c39c8c1", + "bom-ref": "d61c794945f6c1b7", "name": "/usr/include/x86_64-linux-gnu/bits/getopt_core.h", "type": "file" }, { - "bom-ref": "967df07e4cd06858", + "bom-ref": "a03f7e5b69c303e6", "name": "/usr/include/x86_64-linux-gnu/bits/getopt_ext.h", "type": "file" }, { - "bom-ref": "d93292ab5419d4e3", + "bom-ref": "84e101f0af87b26d", "name": "/usr/include/x86_64-linux-gnu/bits/getopt_posix.h", "type": "file" }, { - "bom-ref": "decfa498ecd18ac6", + "bom-ref": "84b2dd04a6dead74", "name": "/usr/include/x86_64-linux-gnu/bits/hwcap.h", "type": "file" }, { - "bom-ref": "247c8b7c70810347", + "bom-ref": "4c3e3cba0e3a8839", "name": "/usr/include/x86_64-linux-gnu/bits/in.h", "type": "file" }, { - "bom-ref": "fae02f4008a2d186", + "bom-ref": "31a277c37ed8b0bc", "name": "/usr/include/x86_64-linux-gnu/bits/indirect-return.h", "type": "file" }, { - "bom-ref": "61537b1cac435e9d", + "bom-ref": "25f7339ae6bfcec3", "name": "/usr/include/x86_64-linux-gnu/bits/initspin.h", "type": "file" }, { - "bom-ref": "02616026ea1eade9", + "bom-ref": "e7dee42307c9de33", "name": "/usr/include/x86_64-linux-gnu/bits/inotify.h", "type": "file" }, { - "bom-ref": "5fb0830ac2fdec97", + "bom-ref": "6530d5aab1752ba1", "name": "/usr/include/x86_64-linux-gnu/bits/ioctl-types.h", "type": "file" }, { - "bom-ref": "80749bedfb0e37c9", + "bom-ref": "2edc1a386b44ed97", "name": "/usr/include/x86_64-linux-gnu/bits/ioctls.h", "type": "file" }, { - "bom-ref": "323d330e2a0775ee", + "bom-ref": "1787b033b3bbbfdc", "name": "/usr/include/x86_64-linux-gnu/bits/ipc-perm.h", "type": "file" }, { - "bom-ref": "134ceb86bcee534d", + "bom-ref": "8abb16df95ef1e6b", "name": "/usr/include/x86_64-linux-gnu/bits/ipc.h", "type": "file" }, { - "bom-ref": "469d3b1c7a3ea70c", + "bom-ref": "17c528982aaa4caa", "name": "/usr/include/x86_64-linux-gnu/bits/ipctypes.h", "type": "file" }, { - "bom-ref": "6a60efecbe239cf6", + "bom-ref": "eed2b44d71e543c0", "name": "/usr/include/x86_64-linux-gnu/bits/iscanonical.h", "type": "file" }, { - "bom-ref": "4ea0d6a063a8a8c0", + "bom-ref": "ed7c1c3aee100cba", "name": "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h", "type": "file" }, { - "bom-ref": "75460c8f03b761cc", + "bom-ref": "fd74b1a272711a0a", "name": "/usr/include/x86_64-linux-gnu/bits/libm-simd-decl-stubs.h", "type": "file" }, { - "bom-ref": "a3e45f3c05b885f2", + "bom-ref": "ddc3eb2cf9f6f328", "name": "/usr/include/x86_64-linux-gnu/bits/link.h", "type": "file" }, { - "bom-ref": "4243cb7994862a61", + "bom-ref": "06cb3bb2598cce13", "name": "/usr/include/x86_64-linux-gnu/bits/link_lavcurrent.h", "type": "file" }, { - "bom-ref": "4015ccb3bf86dacc", + "bom-ref": "5fa94ced1fda1442", "name": "/usr/include/x86_64-linux-gnu/bits/local_lim.h", "type": "file" }, { - "bom-ref": "00dcdcf1d69e904a", + "bom-ref": "97991fecab09d1e0", "name": "/usr/include/x86_64-linux-gnu/bits/locale.h", "type": "file" }, { - "bom-ref": "75a1eb77eb67b446", + "bom-ref": "acf47fdb1630f460", "name": "/usr/include/x86_64-linux-gnu/bits/long-double.h", "type": "file" }, { - "bom-ref": "7063280570b309f5", + "bom-ref": "bee03f2119991113", "name": "/usr/include/x86_64-linux-gnu/bits/math-vector.h", "type": "file" }, { - "bom-ref": "0955bb776b8d195f", + "bom-ref": "6d856559978215e1", "name": "/usr/include/x86_64-linux-gnu/bits/mathcalls-helper-functions.h", "type": "file" }, { - "bom-ref": "30209f21bbe77bf4", + "bom-ref": "165d4fec5f53fb36", "name": "/usr/include/x86_64-linux-gnu/bits/mathcalls-narrow.h", "type": "file" }, { - "bom-ref": "ae753cbf21d6762a", + "bom-ref": "f12a540da9edf220", "name": "/usr/include/x86_64-linux-gnu/bits/mathcalls.h", "type": "file" }, { - "bom-ref": "4e672238bb4fed17", + "bom-ref": "529f6a7bf5a02419", "name": "/usr/include/x86_64-linux-gnu/bits/mathdef.h", "type": "file" }, { - "bom-ref": "6298cb40b97a2a99", + "bom-ref": "ce41c58564f7c8e7", "name": "/usr/include/x86_64-linux-gnu/bits/mman-linux.h", "type": "file" }, { - "bom-ref": "f14ef3a7bce5b6de", + "bom-ref": "8a4a773917197890", "name": "/usr/include/x86_64-linux-gnu/bits/mman-map-flags-generic.h", "type": "file" }, { - "bom-ref": "0b3f580758a3adbf", + "bom-ref": "4a349957bb525135", "name": "/usr/include/x86_64-linux-gnu/bits/mman-shared.h", "type": "file" }, { - "bom-ref": "db4019d693e1eaf8", + "bom-ref": "305ddef07bd0839a", "name": "/usr/include/x86_64-linux-gnu/bits/mman.h", "type": "file" }, { - "bom-ref": "fcf31f08c76d4d5e", + "bom-ref": "1af3dba7acfdc9a8", "name": "/usr/include/x86_64-linux-gnu/bits/mman_ext.h", "type": "file" }, { - "bom-ref": "e7142d003b07cc1f", + "bom-ref": "5a7818225861ee49", "name": "/usr/include/x86_64-linux-gnu/bits/monetary-ldbl.h", "type": "file" }, { - "bom-ref": "f5192b3006167f70", + "bom-ref": "bece4a472eed1fda", "name": "/usr/include/x86_64-linux-gnu/bits/mqueue.h", "type": "file" }, { - "bom-ref": "4ff07d736df14601", + "bom-ref": "90c8e36e118d774b", "name": "/usr/include/x86_64-linux-gnu/bits/mqueue2.h", "type": "file" }, { - "bom-ref": "caa42d5322a7f9f3", + "bom-ref": "f2d9206726d70cf1", "name": "/usr/include/x86_64-linux-gnu/bits/msq.h", "type": "file" }, { - "bom-ref": "cb23a7f9015dcc2f", + "bom-ref": "3e79cd84d1420c81", "name": "/usr/include/x86_64-linux-gnu/bits/netdb.h", "type": "file" }, { - "bom-ref": "65c3a914cb42dde9", + "bom-ref": "59f68ba899f08343", "name": "/usr/include/x86_64-linux-gnu/bits/param.h", "type": "file" }, { - "bom-ref": "ff6b16fe8ab07123", + "bom-ref": "7a7d0937577e75ed", "name": "/usr/include/x86_64-linux-gnu/bits/platform/features.h", "type": "file" }, { - "bom-ref": "1febfa711affbf94", + "bom-ref": "2580802811839846", "name": "/usr/include/x86_64-linux-gnu/bits/platform/x86.h", "type": "file" }, { - "bom-ref": "a9666a37774dbbde", + "bom-ref": "07dfb205a37e71c4", "name": "/usr/include/x86_64-linux-gnu/bits/poll.h", "type": "file" }, { - "bom-ref": "14511f683d108b9a", + "bom-ref": "959037028430afd4", "name": "/usr/include/x86_64-linux-gnu/bits/poll2.h", "type": "file" }, { - "bom-ref": "1e3901cc28459ca1", + "bom-ref": "d102c2567e654dd3", "name": "/usr/include/x86_64-linux-gnu/bits/posix1_lim.h", "type": "file" }, { - "bom-ref": "80e6c430610bcfae", + "bom-ref": "3b80c39df3100318", "name": "/usr/include/x86_64-linux-gnu/bits/posix2_lim.h", "type": "file" }, { - "bom-ref": "c1bb1d2d87bf0e50", + "bom-ref": "6e8e0a287870b7e6", "name": "/usr/include/x86_64-linux-gnu/bits/posix_opt.h", "type": "file" }, { - "bom-ref": "c83e00f9902ae218", + "bom-ref": "c95d08bb1ca94206", "name": "/usr/include/x86_64-linux-gnu/bits/printf-ldbl.h", "type": "file" }, { - "bom-ref": "54553e1f07d58282", + "bom-ref": "35363c9b5642c544", "name": "/usr/include/x86_64-linux-gnu/bits/procfs-extra.h", "type": "file" }, { - "bom-ref": "a9bcb08c33c9b30a", + "bom-ref": "da447df45974c50c", "name": "/usr/include/x86_64-linux-gnu/bits/procfs-id.h", "type": "file" }, { - "bom-ref": "9e33677f1e4f69ba", + "bom-ref": "f5d7fafc673c40c0", "name": "/usr/include/x86_64-linux-gnu/bits/procfs-prregset.h", "type": "file" }, { - "bom-ref": "900cdf3554b6e3a5", + "bom-ref": "2ab8ba9260d862df", "name": "/usr/include/x86_64-linux-gnu/bits/procfs.h", "type": "file" }, { - "bom-ref": "322c435efccee2a9", + "bom-ref": "a4cdd9f77fdcc0fb", "name": "/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h", "type": "file" }, { - "bom-ref": "2f668c9944eb6fe1", + "bom-ref": "752213a71595175f", "name": "/usr/include/x86_64-linux-gnu/bits/pthread_stack_min.h", "type": "file" }, { - "bom-ref": "6491682a0558e85d", + "bom-ref": "000770817be124ef", "name": "/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h", "type": "file" }, { - "bom-ref": "3dc4e310bca6cc54", + "bom-ref": "62efd4db3145b9fe", "name": "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h", "type": "file" }, { - "bom-ref": "fae34d862ad83ff0", + "bom-ref": "1059cdcef5902036", "name": "/usr/include/x86_64-linux-gnu/bits/ptrace-shared.h", "type": "file" }, { - "bom-ref": "cd9f8faadc5386df", + "bom-ref": "7b59c631990a6421", "name": "/usr/include/x86_64-linux-gnu/bits/resource.h", "type": "file" }, { - "bom-ref": "52bdbf1a5f4f370f", + "bom-ref": "d01f27676743f2d1", "name": "/usr/include/x86_64-linux-gnu/bits/rseq.h", "type": "file" }, { - "bom-ref": "933aab2ca9c694b6", + "bom-ref": "96152d6b7287ec64", "name": "/usr/include/x86_64-linux-gnu/bits/sched.h", "type": "file" }, { - "bom-ref": "1889a1dc9ab71b77", + "bom-ref": "ae45b5eab2fecf6d", "name": "/usr/include/x86_64-linux-gnu/bits/select-decl.h", "type": "file" }, { - "bom-ref": "e241d2d034581d54", + "bom-ref": "c34bdb5ab56125ea", "name": "/usr/include/x86_64-linux-gnu/bits/select.h", "type": "file" }, { - "bom-ref": "b1929258f5549afb", + "bom-ref": "75b531f15af53dd5", "name": "/usr/include/x86_64-linux-gnu/bits/select2.h", "type": "file" }, { - "bom-ref": "55244c8df885a5df", + "bom-ref": "f8807f26b1bf812d", "name": "/usr/include/x86_64-linux-gnu/bits/sem.h", "type": "file" }, { - "bom-ref": "e1516f6179ca25b5", + "bom-ref": "966c7051f3c9638b", "name": "/usr/include/x86_64-linux-gnu/bits/semaphore.h", "type": "file" }, { - "bom-ref": "63cdec44b6165046", + "bom-ref": "9249dc746be7b850", "name": "/usr/include/x86_64-linux-gnu/bits/setjmp.h", "type": "file" }, { - "bom-ref": "9bf21ba6809faea5", + "bom-ref": "bf35d685e9d0905b", "name": "/usr/include/x86_64-linux-gnu/bits/setjmp2.h", "type": "file" }, { - "bom-ref": "71f273f13740b351", + "bom-ref": "4e8dbd933c98ec0f", "name": "/usr/include/x86_64-linux-gnu/bits/shm.h", "type": "file" }, { - "bom-ref": "613ed48c0cad3d06", + "bom-ref": "fc413f9a11097b8c", "name": "/usr/include/x86_64-linux-gnu/bits/shmlba.h", "type": "file" }, { - "bom-ref": "20fdf88ac7353048", + "bom-ref": "b40375236fd0f12e", "name": "/usr/include/x86_64-linux-gnu/bits/sigaction.h", "type": "file" }, { - "bom-ref": "1e64ce9889425ddc", + "bom-ref": "24d1f46db7470406", "name": "/usr/include/x86_64-linux-gnu/bits/sigcontext.h", "type": "file" }, { - "bom-ref": "421f405bfee6dd3a", + "bom-ref": "bb5bb56ca96eb98c", "name": "/usr/include/x86_64-linux-gnu/bits/sigevent-consts.h", "type": "file" }, { - "bom-ref": "f5e10d5b6ae996e7", + "bom-ref": "5ae602da31bd899d", "name": "/usr/include/x86_64-linux-gnu/bits/siginfo-arch.h", "type": "file" }, { - "bom-ref": "13f97e4d6f329ebc", + "bom-ref": "14f02787140f5e82", "name": "/usr/include/x86_64-linux-gnu/bits/siginfo-consts-arch.h", "type": "file" }, { - "bom-ref": "af36ef65fb801e7f", + "bom-ref": "a64883ceaf9e6ee9", "name": "/usr/include/x86_64-linux-gnu/bits/siginfo-consts.h", "type": "file" }, { - "bom-ref": "7f41b003dd4b6f37", + "bom-ref": "3ce0e0a095cc2851", "name": "/usr/include/x86_64-linux-gnu/bits/signal_ext.h", "type": "file" }, { - "bom-ref": "caeb11aa2c1f911e", + "bom-ref": "fcffd591490cece4", "name": "/usr/include/x86_64-linux-gnu/bits/signalfd.h", "type": "file" }, { - "bom-ref": "3e0d234214692798", + "bom-ref": "ec9248831a329aae", "name": "/usr/include/x86_64-linux-gnu/bits/signum-arch.h", "type": "file" }, { - "bom-ref": "5e2b7d09964ad3ee", + "bom-ref": "949a2f906be70aa4", "name": "/usr/include/x86_64-linux-gnu/bits/signum-generic.h", "type": "file" }, { - "bom-ref": "c6adc8717605a510", + "bom-ref": "24093c4f66a4ecde", "name": "/usr/include/x86_64-linux-gnu/bits/sigstack.h", "type": "file" }, { - "bom-ref": "f5c01effb895dfb5", + "bom-ref": "c8d621cf40c6eea3", "name": "/usr/include/x86_64-linux-gnu/bits/sigstksz.h", "type": "file" }, { - "bom-ref": "83160fae4d1bccc2", + "bom-ref": "48cae07dc444f7d4", "name": "/usr/include/x86_64-linux-gnu/bits/sigthread.h", "type": "file" }, { - "bom-ref": "8f1d1b5767b35b29", + "bom-ref": "d45d57747f63a1b3", "name": "/usr/include/x86_64-linux-gnu/bits/sockaddr.h", "type": "file" }, { - "bom-ref": "5046f12be51c90a4", + "bom-ref": "bfda93808a97defa", "name": "/usr/include/x86_64-linux-gnu/bits/socket-constants.h", "type": "file" }, { - "bom-ref": "6d168d10ccefda11", + "bom-ref": "ff2a7224eb6c3c03", "name": "/usr/include/x86_64-linux-gnu/bits/socket.h", "type": "file" }, { - "bom-ref": "4bfc92ab1d37cc03", + "bom-ref": "a63182827a21380d", "name": "/usr/include/x86_64-linux-gnu/bits/socket2.h", "type": "file" }, { - "bom-ref": "c9a3af597f5b9980", + "bom-ref": "f041a4e16262807a", "name": "/usr/include/x86_64-linux-gnu/bits/socket_type.h", "type": "file" }, { - "bom-ref": "47a969affbfb6e2d", + "bom-ref": "4de994379eab5997", "name": "/usr/include/x86_64-linux-gnu/bits/spawn_ext.h", "type": "file" }, { - "bom-ref": "871b840db3aa9fef", + "bom-ref": "b100a5be06ec24ed", "name": "/usr/include/x86_64-linux-gnu/bits/ss_flags.h", "type": "file" }, { - "bom-ref": "75f9f8cfc45adcb9", + "bom-ref": "744f7ead532441ab", "name": "/usr/include/x86_64-linux-gnu/bits/stab.def", "type": "file" }, { - "bom-ref": "a9288a8541fe7c31", + "bom-ref": "2e6e137c5177b1b3", "name": "/usr/include/x86_64-linux-gnu/bits/stat.h", "type": "file" }, { - "bom-ref": "2784094ae8491454", + "bom-ref": "2c6b3499cdda4c5e", "name": "/usr/include/x86_64-linux-gnu/bits/statfs.h", "type": "file" }, { - "bom-ref": "2472156320889eb0", + "bom-ref": "16e64467f0578336", "name": "/usr/include/x86_64-linux-gnu/bits/statvfs.h", "type": "file" }, { - "bom-ref": "a7dd851ff7bd3538", + "bom-ref": "4c00d041a359c2fe", "name": "/usr/include/x86_64-linux-gnu/bits/statx-generic.h", "type": "file" }, { - "bom-ref": "84f421510ce8ed55", + "bom-ref": "3af2237ef5be8c9b", "name": "/usr/include/x86_64-linux-gnu/bits/statx.h", "type": "file" }, { - "bom-ref": "114422ee7d25e9ae", + "bom-ref": "ef1be51647336d40", "name": "/usr/include/x86_64-linux-gnu/bits/stdint-intn.h", "type": "file" }, { - "bom-ref": "ba47db8cc1a5bc0a", + "bom-ref": "42c1995109791dac", "name": "/usr/include/x86_64-linux-gnu/bits/stdint-least.h", "type": "file" }, { - "bom-ref": "cc169a49aee16ad0", + "bom-ref": "c836ffe12095ba26", "name": "/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h", "type": "file" }, { - "bom-ref": "4724e4bf4cad0fff", + "bom-ref": "a251945ced0e2679", "name": "/usr/include/x86_64-linux-gnu/bits/stdio-ldbl.h", "type": "file" }, { - "bom-ref": "9efc3923fb230ec2", + "bom-ref": "87fc0ab99089b598", "name": "/usr/include/x86_64-linux-gnu/bits/stdio.h", "type": "file" }, { - "bom-ref": "745a5cd1c9d03c9a", + "bom-ref": "906b7a486787bb2c", "name": "/usr/include/x86_64-linux-gnu/bits/stdio2-decl.h", "type": "file" }, { - "bom-ref": "4a2c441030a6f0dc", + "bom-ref": "a5362cb63cae2986", "name": "/usr/include/x86_64-linux-gnu/bits/stdio2.h", "type": "file" }, { - "bom-ref": "25c4111d9e17cc5c", + "bom-ref": "d3e80856541ef6d2", "name": "/usr/include/x86_64-linux-gnu/bits/stdio_lim.h", "type": "file" }, { - "bom-ref": "257fb226cc5ff76e", + "bom-ref": "d3aaadd6f059f9bc", "name": "/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h", "type": "file" }, { - "bom-ref": "b3c22aa9aedf339c", + "bom-ref": "dd8908fb6ae0072a", "name": "/usr/include/x86_64-linux-gnu/bits/stdlib-float.h", "type": "file" }, { - "bom-ref": "1a69cf6812c8d016", + "bom-ref": "774e17524d4919a4", "name": "/usr/include/x86_64-linux-gnu/bits/stdlib-ldbl.h", "type": "file" }, { - "bom-ref": "1b299cb6516422e9", + "bom-ref": "49d851e45ae39c6b", "name": "/usr/include/x86_64-linux-gnu/bits/stdlib.h", "type": "file" }, { - "bom-ref": "00ce98d6eecb7443", + "bom-ref": "eb155387d448a079", "name": "/usr/include/x86_64-linux-gnu/bits/string_fortified.h", "type": "file" }, { - "bom-ref": "226834b3805c8021", + "bom-ref": "312d8c99006c1eab", "name": "/usr/include/x86_64-linux-gnu/bits/strings_fortified.h", "type": "file" }, { - "bom-ref": "53dff07e5a27cd0e", + "bom-ref": "3c5b741d65b3bbc0", "name": "/usr/include/x86_64-linux-gnu/bits/struct_mutex.h", "type": "file" }, { - "bom-ref": "2cf08dff6cd589bd", + "bom-ref": "9f001290c5a5254b", "name": "/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h", "type": "file" }, { - "bom-ref": "c465a64b635b0db7", + "bom-ref": "12ffa54796152241", "name": "/usr/include/x86_64-linux-gnu/bits/struct_stat.h", "type": "file" }, { - "bom-ref": "ad7aff714b4966b3", + "bom-ref": "e80bb34d56787a55", "name": "/usr/include/x86_64-linux-gnu/bits/struct_stat_time64_helper.h", "type": "file" }, { - "bom-ref": "480d0ed8f991ffcf", + "bom-ref": "79f32d7084f2a731", "name": "/usr/include/x86_64-linux-gnu/bits/syscall.h", "type": "file" }, { - "bom-ref": "2e88d71b34fb0898", + "bom-ref": "a7a447bce874ca46", "name": "/usr/include/x86_64-linux-gnu/bits/syslog-decl.h", "type": "file" }, { - "bom-ref": "1c328f1c51fa7e91", + "bom-ref": "494a474f44a3eb3b", "name": "/usr/include/x86_64-linux-gnu/bits/syslog-ldbl.h", "type": "file" }, { - "bom-ref": "3eeccd46944109da", + "bom-ref": "980d832b4af224b0", "name": "/usr/include/x86_64-linux-gnu/bits/syslog-path.h", "type": "file" }, { - "bom-ref": "d9ad16c6d13f566c", + "bom-ref": "c9f2ab4b1baa1b6e", "name": "/usr/include/x86_64-linux-gnu/bits/syslog.h", "type": "file" }, { - "bom-ref": "54e543a551b66d36", + "bom-ref": "e2741b9594b23eb8", "name": "/usr/include/x86_64-linux-gnu/bits/sysmacros.h", "type": "file" }, { - "bom-ref": "a272e2b9761dd82b", + "bom-ref": "6e14e8c8c1e2b0d5", "name": "/usr/include/x86_64-linux-gnu/bits/termios-baud.h", "type": "file" }, { - "bom-ref": "99b79c560aa8bf7e", + "bom-ref": "34c4f617543397b8", "name": "/usr/include/x86_64-linux-gnu/bits/termios-c_cc.h", "type": "file" }, { - "bom-ref": "77db260e7a488938", + "bom-ref": "c8ada79f6c94aa9a", "name": "/usr/include/x86_64-linux-gnu/bits/termios-c_cflag.h", "type": "file" }, { - "bom-ref": "5cbc92ed80616486", + "bom-ref": "666e5c6ef908f7f8", "name": "/usr/include/x86_64-linux-gnu/bits/termios-c_iflag.h", "type": "file" }, { - "bom-ref": "8bfae838b27977c0", + "bom-ref": "c162b0e62b0b6242", "name": "/usr/include/x86_64-linux-gnu/bits/termios-c_lflag.h", "type": "file" }, { - "bom-ref": "d4c652c12c4846ec", + "bom-ref": "04b15656bf54577a", "name": "/usr/include/x86_64-linux-gnu/bits/termios-c_oflag.h", "type": "file" }, { - "bom-ref": "325b532bf104c8fd", + "bom-ref": "3c7d268654e2e757", "name": "/usr/include/x86_64-linux-gnu/bits/termios-misc.h", "type": "file" }, { - "bom-ref": "199202c055d55378", + "bom-ref": "595d256396c06356", "name": "/usr/include/x86_64-linux-gnu/bits/termios-struct.h", "type": "file" }, { - "bom-ref": "27a1660e172896fe", + "bom-ref": "5700fe03ec2ade6c", "name": "/usr/include/x86_64-linux-gnu/bits/termios-tcflow.h", "type": "file" }, { - "bom-ref": "df661d32b29befbd", + "bom-ref": "0eb085774ea5eb63", "name": "/usr/include/x86_64-linux-gnu/bits/termios.h", "type": "file" }, { - "bom-ref": "9ed38545c6219e2c", + "bom-ref": "4a3b29335254f912", "name": "/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h", "type": "file" }, { - "bom-ref": "64ec21fa60ed1400", + "bom-ref": "47738f4344c0318e", "name": "/usr/include/x86_64-linux-gnu/bits/time.h", "type": "file" }, { - "bom-ref": "f67f3320474c8a71", + "bom-ref": "c83938b8dc2be31b", "name": "/usr/include/x86_64-linux-gnu/bits/time64.h", "type": "file" }, { - "bom-ref": "39f417d12bec4dc9", + "bom-ref": "0016c5e6bb9c5b63", "name": "/usr/include/x86_64-linux-gnu/bits/timerfd.h", "type": "file" }, { - "bom-ref": "b89b879e2cb054ba", + "bom-ref": "1cf98a5cf23d9d9c", "name": "/usr/include/x86_64-linux-gnu/bits/timesize.h", "type": "file" }, { - "bom-ref": "5655f5acc340fc99", + "bom-ref": "9cf5f26af9819b1b", "name": "/usr/include/x86_64-linux-gnu/bits/timex.h", "type": "file" }, { - "bom-ref": "f51ca793a1fd4566", + "bom-ref": "c5821f193c90d520", "name": "/usr/include/x86_64-linux-gnu/bits/types.h", "type": "file" }, { - "bom-ref": "299e7357bc036b05", + "bom-ref": "59ddc5d5674f7177", "name": "/usr/include/x86_64-linux-gnu/bits/types/FILE.h", "type": "file" }, { - "bom-ref": "3bd8e9b9c6c31714", + "bom-ref": "dba6eca13e199e52", "name": "/usr/include/x86_64-linux-gnu/bits/types/__FILE.h", "type": "file" }, { - "bom-ref": "e0530008399f29ea", + "bom-ref": "6eed85f56645e8a8", "name": "/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h", "type": "file" }, { - "bom-ref": "87ced465123be34c", + "bom-ref": "d11cac584e3c28a2", "name": "/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h", "type": "file" }, { - "bom-ref": "7aa708aa44dd92fc", + "bom-ref": "6f30077672f01526", "name": "/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h", "type": "file" }, { - "bom-ref": "00776b7e3b3d757b", + "bom-ref": "f9cd072defdaf9f9", "name": "/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h", "type": "file" }, { - "bom-ref": "3789c6c7974606c9", + "bom-ref": "f01928ac1c941f97", "name": "/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h", "type": "file" }, { - "bom-ref": "8377ab52cab91629", + "bom-ref": "d89ff1a9a46d3c4f", "name": "/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h", "type": "file" }, { - "bom-ref": "9e36f8bdea969028", + "bom-ref": "676b6c9d3d81f10e", "name": "/usr/include/x86_64-linux-gnu/bits/types/clock_t.h", "type": "file" }, { - "bom-ref": "34238b2b6c914e27", + "bom-ref": "b3028830ea3073b9", "name": "/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h", "type": "file" }, { - "bom-ref": "92ca42270017ec62", + "bom-ref": "311c4ad18fcc4b8c", "name": "/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h", "type": "file" }, { - "bom-ref": "c520cf0a03415856", + "bom-ref": "2d04832ff5005b60", "name": "/usr/include/x86_64-linux-gnu/bits/types/error_t.h", "type": "file" }, { - "bom-ref": "c839ae629d04286e", + "bom-ref": "79e2837cc964f7ec", "name": "/usr/include/x86_64-linux-gnu/bits/types/idtype_t.h", "type": "file" }, { - "bom-ref": "0f7e6eb3ce05ac3b", + "bom-ref": "7ad0d1c6d48769c1", "name": "/usr/include/x86_64-linux-gnu/bits/types/locale_t.h", "type": "file" }, { - "bom-ref": "92e5fc38e654b1d2", + "bom-ref": "0b034a0ead4cfd1c", "name": "/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h", "type": "file" }, { - "bom-ref": "b4092b88c966691e", + "bom-ref": "ccf97ce2024297d0", "name": "/usr/include/x86_64-linux-gnu/bits/types/res_state.h", "type": "file" }, { - "bom-ref": "6726f2508814cf8e", + "bom-ref": "e540401303cc5304", "name": "/usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h", "type": "file" }, { - "bom-ref": "1d7bdfeb818fac2b", + "bom-ref": "31efc7baf9192dd5", "name": "/usr/include/x86_64-linux-gnu/bits/types/sigevent_t.h", "type": "file" }, { - "bom-ref": "a875acfdbe915de7", + "bom-ref": "356fa71e4844aa85", "name": "/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h", "type": "file" }, { - "bom-ref": "2c5eb6fc14bc9931", + "bom-ref": "3d77a0b179d9f897", "name": "/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h", "type": "file" }, { - "bom-ref": "52b8025642c69c2e", + "bom-ref": "5de0e0b381d52f34", "name": "/usr/include/x86_64-linux-gnu/bits/types/sigval_t.h", "type": "file" }, { - "bom-ref": "c481a8b13f579a58", + "bom-ref": "71bd01b376501e3a", "name": "/usr/include/x86_64-linux-gnu/bits/types/stack_t.h", "type": "file" }, { - "bom-ref": "010787ad52f2a8be", + "bom-ref": "2d34dcda91c7bd0c", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h", "type": "file" }, { - "bom-ref": "953909f25a43dffe", + "bom-ref": "a967518b99f0fdb8", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct___jmp_buf_tag.h", "type": "file" }, { - "bom-ref": "c53a4fdf06340eb1", + "bom-ref": "a26be578a3a5f48b", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h", "type": "file" }, { - "bom-ref": "08ff77f66274439e", + "bom-ref": "050b3041a40ae8d8", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h", "type": "file" }, { - "bom-ref": "fc75e91e6de74cb8", + "bom-ref": "2d5bba706be66bea", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_msqid64_ds.h", "type": "file" }, { - "bom-ref": "144f5d72b66ae951", + "bom-ref": "51deff8e0c2720fb", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_msqid64_ds_helper.h", "type": "file" }, { - "bom-ref": "d889759fd11bfd18", + "bom-ref": "ff71137133e992b6", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_msqid_ds.h", "type": "file" }, { - "bom-ref": "fdf77106527f0aa7", + "bom-ref": "8ccb2941746f1605", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h", "type": "file" }, { - "bom-ref": "056f9f14f38f1fc7", + "bom-ref": "d494178ac8397781", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h", "type": "file" }, { - "bom-ref": "4528de6f4fd39ebe", + "bom-ref": "4e514f293be3d06c", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h", "type": "file" }, { - "bom-ref": "1d0273989c49f020", + "bom-ref": "1b613779fd23547a", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_semid64_ds.h", "type": "file" }, { - "bom-ref": "ac522a0c5295897d", + "bom-ref": "17b2d82ded36da53", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_semid64_ds_helper.h", "type": "file" }, { - "bom-ref": "5a365ae88065ee4e", + "bom-ref": "b9f80c4831755cb8", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_semid_ds.h", "type": "file" }, { - "bom-ref": "4a7feb7963137bee", + "bom-ref": "a42e137a9e7c00a8", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_shmid64_ds.h", "type": "file" }, { - "bom-ref": "05a01b35e7ac9649", + "bom-ref": "b36cefda07e471c7", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_shmid64_ds_helper.h", "type": "file" }, { - "bom-ref": "d58eae4d0d0fab94", + "bom-ref": "a75f3d60365daeee", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_shmid_ds.h", "type": "file" }, { - "bom-ref": "da8cea1a8b52c46b", + "bom-ref": "8ed46092e6bf8bc1", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_sigstack.h", "type": "file" }, { - "bom-ref": "e4a32885ab6a7b90", + "bom-ref": "1ee64bb2476ba01e", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_statx.h", "type": "file" }, { - "bom-ref": "91b24926c09c8bb3", + "bom-ref": "d621128cd25c6291", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_statx_timestamp.h", "type": "file" }, { - "bom-ref": "99f5b44882d38382", + "bom-ref": "f59a2dc0ba9c349c", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_timeb.h", "type": "file" }, { - "bom-ref": "2d265cbd1389063f", + "bom-ref": "16cb9244377f336d", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h", "type": "file" }, { - "bom-ref": "05b04b59367615da", + "bom-ref": "83ae52aa60af0894", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h", "type": "file" }, { - "bom-ref": "67538b44b7ae6da7", + "bom-ref": "70c021be1b476255", "name": "/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h", "type": "file" }, { - "bom-ref": "502ba790fab6a5bd", + "bom-ref": "0a0b527b5c851927", "name": "/usr/include/x86_64-linux-gnu/bits/types/time_t.h", "type": "file" }, { - "bom-ref": "6767c558256f94ac", + "bom-ref": "d15308943eea69b6", "name": "/usr/include/x86_64-linux-gnu/bits/types/timer_t.h", "type": "file" }, { - "bom-ref": "88a6e2e8e2425ff9", + "bom-ref": "787803d5261a8413", "name": "/usr/include/x86_64-linux-gnu/bits/types/wint_t.h", "type": "file" }, { - "bom-ref": "8f8f4389963a7237", + "bom-ref": "fda8d105d0bff46d", "name": "/usr/include/x86_64-linux-gnu/bits/typesizes.h", "type": "file" }, { - "bom-ref": "ee7e180779fb5691", + "bom-ref": "c8ae07d62a3e382b", "name": "/usr/include/x86_64-linux-gnu/bits/uintn-identity.h", "type": "file" }, { - "bom-ref": "9b9bc9e53f803f69", + "bom-ref": "da76eaeac4c9bd17", "name": "/usr/include/x86_64-linux-gnu/bits/uio-ext.h", "type": "file" }, { - "bom-ref": "fee64335182086f7", + "bom-ref": "ff8b2c6df111671d", "name": "/usr/include/x86_64-linux-gnu/bits/uio_lim.h", "type": "file" }, { - "bom-ref": "7fcdd8661dc0d301", + "bom-ref": "be196a503d7ec40b", "name": "/usr/include/x86_64-linux-gnu/bits/unistd-decl.h", "type": "file" }, { - "bom-ref": "62e63eef3b28cf22", + "bom-ref": "7d90afdc799db484", "name": "/usr/include/x86_64-linux-gnu/bits/unistd.h", "type": "file" }, { - "bom-ref": "08a77f3d81636534", + "bom-ref": "3b0aeaa94c50627a", "name": "/usr/include/x86_64-linux-gnu/bits/unistd_ext.h", "type": "file" }, { - "bom-ref": "b943e61c9fff0a90", + "bom-ref": "ca3fb6928b1ba5de", "name": "/usr/include/x86_64-linux-gnu/bits/utmp.h", "type": "file" }, { - "bom-ref": "7b737c86cccad487", + "bom-ref": "3331d3db2096bee1", "name": "/usr/include/x86_64-linux-gnu/bits/utmpx.h", "type": "file" }, { - "bom-ref": "64f84023a2f125d5", + "bom-ref": "a6a7a675769c3217", "name": "/usr/include/x86_64-linux-gnu/bits/utsname.h", "type": "file" }, { - "bom-ref": "5b0fa927c67ed1a2", + "bom-ref": "b1adad641bd0f158", "name": "/usr/include/x86_64-linux-gnu/bits/waitflags.h", "type": "file" }, { - "bom-ref": "97b1c038e51ca338", + "bom-ref": "a71e0a8fbb6eccc6", "name": "/usr/include/x86_64-linux-gnu/bits/waitstatus.h", "type": "file" }, { - "bom-ref": "3617c3b9dc0523c7", + "bom-ref": "c4783308bf393cd9", "name": "/usr/include/x86_64-linux-gnu/bits/wchar-ldbl.h", "type": "file" }, { - "bom-ref": "22f9129869892fc5", + "bom-ref": "ec416f1a372673bb", "name": "/usr/include/x86_64-linux-gnu/bits/wchar.h", "type": "file" }, { - "bom-ref": "0aee30afaab48e76", + "bom-ref": "7c09d2055ad2e980", "name": "/usr/include/x86_64-linux-gnu/bits/wchar2-decl.h", "type": "file" }, { - "bom-ref": "387da46d69ce3af4", + "bom-ref": "af2077afe7aad7da", "name": "/usr/include/x86_64-linux-gnu/bits/wchar2.h", "type": "file" }, { - "bom-ref": "f5a6356b020aa3e8", + "bom-ref": "e47b6257ac116cbe", "name": "/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h", "type": "file" }, { - "bom-ref": "eb071900b6f98d51", + "bom-ref": "07271c6e56eb70d7", "name": "/usr/include/x86_64-linux-gnu/bits/wordsize.h", "type": "file" }, { - "bom-ref": "4d6742e8f254e990", + "bom-ref": "19641c8d6e10e72a", "name": "/usr/include/x86_64-linux-gnu/bits/xopen_lim.h", "type": "file" }, { - "bom-ref": "281da2878150151a", + "bom-ref": "7e580e51cb9427e8", "name": "/usr/include/x86_64-linux-gnu/bsd/bitstring.h", "type": "file" }, { - "bom-ref": "545bc5e2981445d2", + "bom-ref": "81247b52339e04e4", "name": "/usr/include/x86_64-linux-gnu/bsd/bsd.h", "type": "file" }, { - "bom-ref": "47a8802014c6745b", + "bom-ref": "e422675472549f0d", "name": "/usr/include/x86_64-linux-gnu/bsd/err.h", "type": "file" }, { - "bom-ref": "98f5663cc0ddd6d1", + "bom-ref": "a6b17708e5fbb7db", "name": "/usr/include/x86_64-linux-gnu/bsd/getopt.h", "type": "file" }, { - "bom-ref": "c6b5b609ad680df6", + "bom-ref": "a9925cde86ab4754", "name": "/usr/include/x86_64-linux-gnu/bsd/grp.h", "type": "file" }, { - "bom-ref": "4ebd3c2ab250d392", + "bom-ref": "824ce1b6d76f0bc0", "name": "/usr/include/x86_64-linux-gnu/bsd/inttypes.h", "type": "file" }, { - "bom-ref": "c0024c7312e0c4dd", + "bom-ref": "3d9aa4125c6dda77", "name": "/usr/include/x86_64-linux-gnu/bsd/libutil.h", "type": "file" }, { - "bom-ref": "3594e68364078954", + "bom-ref": "f037f39f4df884ae", "name": "/usr/include/x86_64-linux-gnu/bsd/md5.h", "type": "file" }, { - "bom-ref": "6a0a763891f9fd9f", + "bom-ref": "4f3d89d19231c781", "name": "/usr/include/x86_64-linux-gnu/bsd/netinet/ip_icmp.h", "type": "file" }, { - "bom-ref": "ad4935a7982cb994", + "bom-ref": "d2a860ea3e72697a", "name": "/usr/include/x86_64-linux-gnu/bsd/nlist.h", "type": "file" }, { - "bom-ref": "08c0192970ae4c9b", + "bom-ref": "4be8f9bbeb7aad91", "name": "/usr/include/x86_64-linux-gnu/bsd/pwd.h", "type": "file" }, { - "bom-ref": "583d3cca5e70fa6e", + "bom-ref": "1947290e695442d0", "name": "/usr/include/x86_64-linux-gnu/bsd/readpassphrase.h", "type": "file" }, { - "bom-ref": "32100d47b9bec4c3", + "bom-ref": "8f498d96c797fc29", "name": "/usr/include/x86_64-linux-gnu/bsd/stdio.h", "type": "file" }, { - "bom-ref": "bde61d24246876fc", + "bom-ref": "1176ac870799beda", "name": "/usr/include/x86_64-linux-gnu/bsd/stdlib.h", "type": "file" }, { - "bom-ref": "3abfef671b176b83", + "bom-ref": "8f38fee4d3e441f9", "name": "/usr/include/x86_64-linux-gnu/bsd/string.h", "type": "file" }, { - "bom-ref": "e884414a6fb9bc71", + "bom-ref": "cf7fef3aa4cdd53f", "name": "/usr/include/x86_64-linux-gnu/bsd/stringlist.h", "type": "file" }, { - "bom-ref": "ca52dcc377d45ead", + "bom-ref": "65b9f143f575f097", "name": "/usr/include/x86_64-linux-gnu/bsd/sys/bitstring.h", "type": "file" }, { - "bom-ref": "de765b4c83622e03", + "bom-ref": "2ba3bc38a0380081", "name": "/usr/include/x86_64-linux-gnu/bsd/sys/cdefs.h", "type": "file" }, { - "bom-ref": "85e23fcc94ca2ce4", + "bom-ref": "de2c961256d087d2", "name": "/usr/include/x86_64-linux-gnu/bsd/sys/endian.h", "type": "file" }, { - "bom-ref": "8dc8cb7b3ad3e578", + "bom-ref": "fdfdd2ee3b3fd8e6", "name": "/usr/include/x86_64-linux-gnu/bsd/sys/param.h", "type": "file" }, { - "bom-ref": "a16c825494a35f62", + "bom-ref": "99fdbbb2c4e610b4", "name": "/usr/include/x86_64-linux-gnu/bsd/sys/poll.h", "type": "file" }, { - "bom-ref": "50f74d5dabcaf62e", + "bom-ref": "7fe36bf05595f214", "name": "/usr/include/x86_64-linux-gnu/bsd/sys/queue.h", "type": "file" }, { - "bom-ref": "7495e203c10b39c2", + "bom-ref": "4fd7f85b65e7ffb8", "name": "/usr/include/x86_64-linux-gnu/bsd/sys/time.h", "type": "file" }, { - "bom-ref": "51991a04a4d186b8", + "bom-ref": "80cf2bd004ef4e92", "name": "/usr/include/x86_64-linux-gnu/bsd/sys/tree.h", "type": "file" }, { - "bom-ref": "b624b178e8b73325", + "bom-ref": "835deb40c1f40d9b", "name": "/usr/include/x86_64-linux-gnu/bsd/timeconv.h", "type": "file" }, { - "bom-ref": "64641ff0b7f1d27b", + "bom-ref": "56174602692c79c5", "name": "/usr/include/x86_64-linux-gnu/bsd/unistd.h", "type": "file" }, { - "bom-ref": "832f4f23e51155e2", + "bom-ref": "a253f3fc0f51f50c", "name": "/usr/include/x86_64-linux-gnu/bsd/vis.h", "type": "file" }, { - "bom-ref": "a02e05cff76c97ec", + "bom-ref": "56777894ff511eee", "name": "/usr/include/x86_64-linux-gnu/bsd/wchar.h", "type": "file" }, { - "bom-ref": "e7eaba1ea2bbb52b", + "bom-ref": "d75a46052c3dafee", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/atomic_word.h", "type": "file" }, { - "bom-ref": "79009f2d0659d229", + "bom-ref": "e873d9fef458acc0", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/basic_file.h", "type": "file" }, { - "bom-ref": "e6c3b52179b1f8cb", + "bom-ref": "2fcecf56e21e3e0e", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/c++allocator.h", "type": "file" }, { - "bom-ref": "fb48e7d8968cbce8", + "bom-ref": "43d3cc6e4a58e155", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/c++config.h", "type": "file" }, { - "bom-ref": "90757944ef1007b8", + "bom-ref": "2a637170a038f711", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/c++io.h", "type": "file" }, { - "bom-ref": "bdcd0524520dcd9f", + "bom-ref": "2a8aea331d5653d2", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/c++locale.h", "type": "file" }, { - "bom-ref": "be8e856b8236a3a4", + "bom-ref": "0ff925ac23d328e1", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/cpu_defines.h", "type": "file" }, { - "bom-ref": "2dfb730647792be3", + "bom-ref": "4a304dd57a982bda", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/ctype_base.h", "type": "file" }, { - "bom-ref": "4eb2348ba8fb5dc0", + "bom-ref": "9c521be31a59f8a1", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/ctype_inline.h", "type": "file" }, { - "bom-ref": "a275e542df99ccd5", + "bom-ref": "98febf3767f02fe8", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/cxxabi_tweaks.h", "type": "file" }, { - "bom-ref": "0cf686cf8f643098", + "bom-ref": "88b5d9dff7bd38b9", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/error_constants.h", "type": "file" }, { - "bom-ref": "181d6af7b9ff3baf", + "bom-ref": "f926809e0a213772", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/extc++.h", "type": "file" }, { - "bom-ref": "aafa39c284d2a35a", + "bom-ref": "9fcc07e3294d0127", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/gthr-default.h", "type": "file" }, { - "bom-ref": "bdeba869d52ce09c", + "bom-ref": "9e795dece4a94561", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/gthr-posix.h", "type": "file" }, { - "bom-ref": "7a856365925ef2af", + "bom-ref": "7d5c7f321629009a", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/gthr-single.h", "type": "file" }, { - "bom-ref": "549f5b91bd95045e", + "bom-ref": "be5a9bd8f027210b", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/gthr.h", "type": "file" }, { - "bom-ref": "716dfa30fea4e5a0", + "bom-ref": "4f59470488b66e5d", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/messages_members.h", "type": "file" }, { - "bom-ref": "3676985ba9d8e3d9", + "bom-ref": "034d8f2a99edf7f0", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/opt_random.h", "type": "file" }, { - "bom-ref": "f624686cb2c217b8", + "bom-ref": "d2a3bd42e831386d", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/os_defines.h", "type": "file" }, { - "bom-ref": "fc196ef97f8ec0f3", + "bom-ref": "d6afa009a5ce655a", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h", "type": "file" }, { - "bom-ref": "64206edbfda89a39", + "bom-ref": "0d08f9d11a16ac0c", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/stdtr1c++.h", "type": "file" }, { - "bom-ref": "1f11406a2ccfcdb8", + "bom-ref": "67321db4b503c3e9", "name": "/usr/include/x86_64-linux-gnu/c++/13/bits/time_members.h", "type": "file" }, { - "bom-ref": "c514f24e2a7e636c", + "bom-ref": "1d033174c5ca6dd1", "name": "/usr/include/x86_64-linux-gnu/c++/13/ext/opt_random.h", "type": "file" }, { - "bom-ref": "df6820375c210cba", + "bom-ref": "582082448388d7b4", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/atomic_word.h", "type": "file" }, { - "bom-ref": "7d5dd0af645dc5b8", + "bom-ref": "8c3d9fd2c076aaba", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/basic_file.h", "type": "file" }, { - "bom-ref": "0c7df98959d92bc3", + "bom-ref": "ab7dd608bc1ad52d", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/c++allocator.h", "type": "file" }, { - "bom-ref": "a21b6cf12ab55191", + "bom-ref": "2c242e177413ba97", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/c++config.h", "type": "file" }, { - "bom-ref": "73c1108e7ec67c17", + "bom-ref": "7bae10ab7566e991", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/c++io.h", "type": "file" }, { - "bom-ref": "dbd85fa8cecfcb6c", + "bom-ref": "c74872dd65e419ce", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/c++locale.h", "type": "file" }, { - "bom-ref": "0751358c102fe2c6", + "bom-ref": "e0aea1a062d0137c", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/cpu_defines.h", "type": "file" }, { - "bom-ref": "bb1d1cd731c185b5", + "bom-ref": "9462e0fa261e91f3", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/ctype_base.h", "type": "file" }, { - "bom-ref": "f3ac6b502d278bf8", + "bom-ref": "db49d18e5cbe3072", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/ctype_inline.h", "type": "file" }, { - "bom-ref": "15373dac33b73f20", + "bom-ref": "5cc357d846bdc53a", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/cxxabi_tweaks.h", "type": "file" }, { - "bom-ref": "2b1352916c5fd248", + "bom-ref": "65480e0258e56d62", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/error_constants.h", "type": "file" }, { - "bom-ref": "c7e1efedc84491bc", + "bom-ref": "cd0068a70d837f4a", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/extc++.h", "type": "file" }, { - "bom-ref": "f4e7b29431ab45d9", + "bom-ref": "8115936eaf97585f", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/gthr-default.h", "type": "file" }, { - "bom-ref": "815b0b661563ed68", + "bom-ref": "bc4fd36088e37f22", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/gthr-posix.h", "type": "file" }, { - "bom-ref": "fcaa437ac30ba4dc", + "bom-ref": "4425ba80644ff2aa", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/gthr-single.h", "type": "file" }, { - "bom-ref": "847179a3eed6b17f", + "bom-ref": "a37edd3959c1fe15", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/gthr.h", "type": "file" }, { - "bom-ref": "7b5b7c4b5cb5c4d7", + "bom-ref": "860c932873adb871", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/messages_members.h", "type": "file" }, { - "bom-ref": "dd233b98aa4f04c7", + "bom-ref": "a9c051189314b2a9", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/opt_random.h", "type": "file" }, { - "bom-ref": "a9680cdf63dc82e4", + "bom-ref": "f6abd4507fcedbd6", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/os_defines.h", "type": "file" }, { - "bom-ref": "81d322526bd263da", + "bom-ref": "5ff67875849b5e08", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h", "type": "file" }, { - "bom-ref": "84aa5f1a29e3896b", + "bom-ref": "031cef192c10eb35", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/stdtr1c++.h", "type": "file" }, { - "bom-ref": "a2aed79eac0899e0", + "bom-ref": "76b4c92749495342", "name": "/usr/include/x86_64-linux-gnu/c++/14/bits/time_members.h", "type": "file" }, { - "bom-ref": "2e6c24fd61c81f55", + "bom-ref": "32c5ed4ea6db9ac7", "name": "/usr/include/x86_64-linux-gnu/c++/14/ext/opt_random.h", "type": "file" }, { - "bom-ref": "462837c2c5c51261", + "bom-ref": "8d8730a9231765b7", "name": "/usr/include/x86_64-linux-gnu/cblas-atlas.h", "type": "file" }, { - "bom-ref": "e5d7538453647f1e", + "bom-ref": "3a571e5e465e3e68", "name": "/usr/include/x86_64-linux-gnu/clapack.h", "type": "file" }, { - "bom-ref": "b3b9056285025a7b", + "bom-ref": "5d29d6cfcc24d890", "name": "/usr/include/x86_64-linux-gnu/cudnn_adv_v9.h", "type": "file" }, { - "bom-ref": "48855bd8262b8540", + "bom-ref": "2bf4604899e3fc1b", "name": "/usr/include/x86_64-linux-gnu/cudnn_backend_v9.h", "type": "file" }, { - "bom-ref": "b7cf61500d23e561", + "bom-ref": "ee4c73d0850d2062", "name": "/usr/include/x86_64-linux-gnu/cudnn_cnn_v9.h", "type": "file" }, { - "bom-ref": "a1598f903090b22e", + "bom-ref": "5505ce4fac23031d", "name": "/usr/include/x86_64-linux-gnu/cudnn_graph_v9.h", "type": "file" }, { - "bom-ref": "a291f18f0114f34c", + "bom-ref": "dd67eebb2db09cd3", "name": "/usr/include/x86_64-linux-gnu/cudnn_ops_v9.h", "type": "file" }, { - "bom-ref": "33700c440da5192b", + "bom-ref": "4b840ff21e27c6c0", "name": "/usr/include/x86_64-linux-gnu/cudnn_subquadratic_ops_v9.h", "type": "file" }, { - "bom-ref": "251c3d882facc840", + "bom-ref": "73a5b9f6ad7ab317", "name": "/usr/include/x86_64-linux-gnu/cudnn_v9.h", "type": "file" }, { - "bom-ref": "f8b1cd07d1e09285", + "bom-ref": "7dd583dedc06238e", "name": "/usr/include/x86_64-linux-gnu/cudnn_version_v9.h", "type": "file" }, { - "bom-ref": "594afff1beb2f662", + "bom-ref": "55f34fe7e06dc358", "name": "/usr/include/x86_64-linux-gnu/expat_config.h", "type": "file" }, { - "bom-ref": "f8cbebbbe33f1eae", + "bom-ref": "2e0d2ee8d2cc29f0", "name": "/usr/include/x86_64-linux-gnu/ffi.h", "type": "file" }, { - "bom-ref": "38120f0d97d6c52f", + "bom-ref": "44d4858982917879", "name": "/usr/include/x86_64-linux-gnu/ffitarget.h", "type": "file" }, { - "bom-ref": "52bc30462415981e", + "bom-ref": "6c6734c7d7034608", "name": "/usr/include/x86_64-linux-gnu/fpu_control.h", "type": "file" }, { - "bom-ref": "7b047cc860ad406f", + "bom-ref": "b85642da1d268f55", "name": "/usr/include/x86_64-linux-gnu/gnu/lib-names-64.h", "type": "file" }, { - "bom-ref": "190ed0726522c121", + "bom-ref": "73554321ef92a397", "name": "/usr/include/x86_64-linux-gnu/gnu/lib-names.h", "type": "file" }, { - "bom-ref": "ffb930eec67452aa", + "bom-ref": "5ce6ac477ab7a424", "name": "/usr/include/x86_64-linux-gnu/gnu/libc-version.h", "type": "file" }, { - "bom-ref": "b6aed76a40e0978b", + "bom-ref": "62ac9ec466b9dc35", "name": "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h", "type": "file" }, { - "bom-ref": "82112c61df735cd7", + "bom-ref": "940e5a919e479f61", "name": "/usr/include/x86_64-linux-gnu/gnu/stubs.h", "type": "file" }, { - "bom-ref": "90d39216664f9286", + "bom-ref": "0f518d79d6444574", "name": "/usr/include/x86_64-linux-gnu/ieee754.h", "type": "file" }, { - "bom-ref": "7cfecbdc6ce506e1", + "bom-ref": "2e8b0c2cc1746a97", "name": "/usr/include/x86_64-linux-gnu/libunwind-common.h", "type": "file" }, { - "bom-ref": "92ad5f3c09babada", + "bom-ref": "d3e4671f0480d6d8", "name": "/usr/include/x86_64-linux-gnu/libunwind-coredump.h", "type": "file" }, { - "bom-ref": "bc94c402b4af2759", + "bom-ref": "1f8b92620e3d6a33", "name": "/usr/include/x86_64-linux-gnu/libunwind-dynamic.h", "type": "file" }, { - "bom-ref": "afd2b94758fd0226", + "bom-ref": "c6c8a69688a33968", "name": "/usr/include/x86_64-linux-gnu/libunwind-ptrace.h", "type": "file" }, { - "bom-ref": "ddd908e0b451bcec", + "bom-ref": "4dc2202137316fc6", "name": "/usr/include/x86_64-linux-gnu/libunwind-x86_64.h", "type": "file" }, { - "bom-ref": "9da1a5fe4121404b", + "bom-ref": "258b4c80735f78c5", "name": "/usr/include/x86_64-linux-gnu/libunwind.h", "type": "file" }, { - "bom-ref": "a60351190c00c560", + "bom-ref": "663f0f9c7bfa357a", "name": "/usr/include/x86_64-linux-gnu/python3.12/pyconfig.h", "type": "file" }, { - "bom-ref": "22889abf9fd85115", + "bom-ref": "99d0572cec1a95a7", "name": "/usr/include/x86_64-linux-gnu/sys/acct.h", "type": "file" }, { - "bom-ref": "9ac8f0c673829b94", + "bom-ref": "b08d48e32974977e", "name": "/usr/include/x86_64-linux-gnu/sys/auxv.h", "type": "file" }, { - "bom-ref": "aa5dba628cb8af13", + "bom-ref": "58cee53bd5d1ca2d", "name": "/usr/include/x86_64-linux-gnu/sys/bitypes.h", "type": "file" }, { - "bom-ref": "f6209f140bc8df9e", + "bom-ref": "0b0e625f69097068", "name": "/usr/include/x86_64-linux-gnu/sys/cdefs.h", "type": "file" }, { - "bom-ref": "80dd1ba795989ac3", + "bom-ref": "0c9869c290d2de15", "name": "/usr/include/x86_64-linux-gnu/sys/debugreg.h", "type": "file" }, { - "bom-ref": "214a427198a4f932", + "bom-ref": "839dc2922188fb7c", "name": "/usr/include/x86_64-linux-gnu/sys/dir.h", "type": "file" }, { - "bom-ref": "8ed748531006855c", + "bom-ref": "46288021f89dd142", "name": "/usr/include/x86_64-linux-gnu/sys/elf.h", "type": "file" }, { - "bom-ref": "0021f5a5eb39e60c", + "bom-ref": "977845f8722a8f9a", "name": "/usr/include/x86_64-linux-gnu/sys/epoll.h", "type": "file" }, { - "bom-ref": "ae3189a96227c152", + "bom-ref": "9b134ff11a60b8c4", "name": "/usr/include/x86_64-linux-gnu/sys/errno.h", "type": "file" }, { - "bom-ref": "e5cb16cd14ce2df8", + "bom-ref": "9468b2584f0ceaf6", "name": "/usr/include/x86_64-linux-gnu/sys/eventfd.h", "type": "file" }, { - "bom-ref": "e6e7dd78b7baf35f", + "bom-ref": "8a1256b4144c8709", "name": "/usr/include/x86_64-linux-gnu/sys/fanotify.h", "type": "file" }, { - "bom-ref": "5bf7a9bfd62680ef", + "bom-ref": "f214defa9d2c7ec1", "name": "/usr/include/x86_64-linux-gnu/sys/fcntl.h", "type": "file" }, { - "bom-ref": "4e742cc94831001b", + "bom-ref": "43c80e526ea871d9", "name": "/usr/include/x86_64-linux-gnu/sys/file.h", "type": "file" }, { - "bom-ref": "48ade37ca1ab21f6", + "bom-ref": "f117af9d24aa1410", "name": "/usr/include/x86_64-linux-gnu/sys/fsuid.h", "type": "file" }, { - "bom-ref": "ef48c0ecf8b92166", + "bom-ref": "09589c1221fcf644", "name": "/usr/include/x86_64-linux-gnu/sys/gmon.h", "type": "file" }, { - "bom-ref": "fc56c25f68d3d158", + "bom-ref": "820d518530f1105a", "name": "/usr/include/x86_64-linux-gnu/sys/gmon_out.h", "type": "file" }, { - "bom-ref": "85f20957eed8747e", + "bom-ref": "8b0181c1487aadb8", "name": "/usr/include/x86_64-linux-gnu/sys/inotify.h", "type": "file" }, { - "bom-ref": "e03acb4a21900191", + "bom-ref": "26ec9bf2873d3b4f", "name": "/usr/include/x86_64-linux-gnu/sys/io.h", "type": "file" }, { - "bom-ref": "1f0551a8e8aa09fa", + "bom-ref": "d3a4633f24d7c098", "name": "/usr/include/x86_64-linux-gnu/sys/ioctl.h", "type": "file" }, { - "bom-ref": "77332ff791dac489", + "bom-ref": "bb12ef9cd2334bab", "name": "/usr/include/x86_64-linux-gnu/sys/ipc.h", "type": "file" }, { - "bom-ref": "b7f6e2aa71c77a7c", + "bom-ref": "912037a46371bcc6", "name": "/usr/include/x86_64-linux-gnu/sys/kd.h", "type": "file" }, { - "bom-ref": "42c1d4a4fc94e80c", + "bom-ref": "37a3d766ed1cece2", "name": "/usr/include/x86_64-linux-gnu/sys/klog.h", "type": "file" }, { - "bom-ref": "e1cbae480667e305", + "bom-ref": "71a42ceff2731603", "name": "/usr/include/x86_64-linux-gnu/sys/mman.h", "type": "file" }, { - "bom-ref": "fb58d1bb8446b32b", + "bom-ref": "28aa0376970d7331", "name": "/usr/include/x86_64-linux-gnu/sys/mount.h", "type": "file" }, { - "bom-ref": "863fb5849709a969", + "bom-ref": "0fe81dd6783e8b1f", "name": "/usr/include/x86_64-linux-gnu/sys/msg.h", "type": "file" }, { - "bom-ref": "446c60186308b914", + "bom-ref": "fe61e80c1f9cadaa", "name": "/usr/include/x86_64-linux-gnu/sys/mtio.h", "type": "file" }, { - "bom-ref": "c08e48901fd2f6f4", + "bom-ref": "969c7be2b10f973e", "name": "/usr/include/x86_64-linux-gnu/sys/param.h", "type": "file" }, { - "bom-ref": "8e46b5602214065e", + "bom-ref": "c84784149f66db8c", "name": "/usr/include/x86_64-linux-gnu/sys/pci.h", "type": "file" }, { - "bom-ref": "2c8b48f512821d08", + "bom-ref": "a93ea494909daa12", "name": "/usr/include/x86_64-linux-gnu/sys/perm.h", "type": "file" }, { - "bom-ref": "94965e324ea52028", + "bom-ref": "f0bc5d9b1f773236", "name": "/usr/include/x86_64-linux-gnu/sys/personality.h", "type": "file" }, { - "bom-ref": "80d20e3840b0f540", + "bom-ref": "070a4ce19c5f8d16", "name": "/usr/include/x86_64-linux-gnu/sys/pidfd.h", "type": "file" }, { - "bom-ref": "b7043f79a86ed340", + "bom-ref": "d629f8abe833626e", "name": "/usr/include/x86_64-linux-gnu/sys/platform/x86.h", "type": "file" }, { - "bom-ref": "0e59500638f0fdf1", + "bom-ref": "e0a873f5098b09f3", "name": "/usr/include/x86_64-linux-gnu/sys/poll.h", "type": "file" }, { - "bom-ref": "b07162b4247d73e4", + "bom-ref": "3d57f083927e0292", "name": "/usr/include/x86_64-linux-gnu/sys/prctl.h", "type": "file" }, { - "bom-ref": "20716c5ee0a0d94c", + "bom-ref": "4d1c596a88f4b77e", "name": "/usr/include/x86_64-linux-gnu/sys/procfs.h", "type": "file" }, { - "bom-ref": "600c353d2c302afb", + "bom-ref": "97ce216cf94d9a15", "name": "/usr/include/x86_64-linux-gnu/sys/profil.h", "type": "file" }, { - "bom-ref": "457358cee44b97f5", + "bom-ref": "c79040077a72cccf", "name": "/usr/include/x86_64-linux-gnu/sys/ptrace.h", "type": "file" }, { - "bom-ref": "02ed45c153737c24", + "bom-ref": "47abd53b34b1f3fe", "name": "/usr/include/x86_64-linux-gnu/sys/queue.h", "type": "file" }, { - "bom-ref": "2fcbf9a2bef4e985", + "bom-ref": "92ab120c45d4dfd7", "name": "/usr/include/x86_64-linux-gnu/sys/quota.h", "type": "file" }, { - "bom-ref": "680ec5cd3bed4386", + "bom-ref": "7692413af0bbaeb0", "name": "/usr/include/x86_64-linux-gnu/sys/random.h", "type": "file" }, { - "bom-ref": "e05f72dfa046a434", + "bom-ref": "611e0907a6a74ec2", "name": "/usr/include/x86_64-linux-gnu/sys/raw.h", "type": "file" }, { - "bom-ref": "d1c863a98463f8cb", + "bom-ref": "e1b87d9f25c345a9", "name": "/usr/include/x86_64-linux-gnu/sys/reboot.h", "type": "file" }, { - "bom-ref": "e568d3beb624d81e", + "bom-ref": "700c8e95dc136ca8", "name": "/usr/include/x86_64-linux-gnu/sys/reg.h", "type": "file" }, { - "bom-ref": "1e7deab8837d0e2f", + "bom-ref": "44eecbc0da45bbfd", "name": "/usr/include/x86_64-linux-gnu/sys/resource.h", "type": "file" }, { - "bom-ref": "4cc07c7bb3b775a9", + "bom-ref": "dc258b5f6b15ef1f", "name": "/usr/include/x86_64-linux-gnu/sys/rseq.h", "type": "file" }, { - "bom-ref": "724c4aba20f91983", + "bom-ref": "0642bb4e2e41210d", "name": "/usr/include/x86_64-linux-gnu/sys/select.h", "type": "file" }, { - "bom-ref": "34834cf71fe30b2d", + "bom-ref": "919f8d116b5e8547", "name": "/usr/include/x86_64-linux-gnu/sys/sem.h", "type": "file" }, { - "bom-ref": "e511e035463cab72", + "bom-ref": "0160f58c5fe4f54c", "name": "/usr/include/x86_64-linux-gnu/sys/sendfile.h", "type": "file" }, { - "bom-ref": "0d8e460890a8d4d2", + "bom-ref": "720ef535022439d0", "name": "/usr/include/x86_64-linux-gnu/sys/shm.h", "type": "file" }, { - "bom-ref": "a77ed3111b176cce", + "bom-ref": "154d0025f2845b78", "name": "/usr/include/x86_64-linux-gnu/sys/signal.h", "type": "file" }, { - "bom-ref": "c57a3eff999eecd1", + "bom-ref": "62fc551102ac13a7", "name": "/usr/include/x86_64-linux-gnu/sys/signalfd.h", "type": "file" }, { - "bom-ref": "18a954dc0ab3209c", + "bom-ref": "d366ef74bc8177b2", "name": "/usr/include/x86_64-linux-gnu/sys/single_threaded.h", "type": "file" }, { - "bom-ref": "31080779c1d05cc7", + "bom-ref": "a5a3c3689abb5efd", "name": "/usr/include/x86_64-linux-gnu/sys/socket.h", "type": "file" }, { - "bom-ref": "2c0898436ee53b35", + "bom-ref": "4a3ef3e4a964109b", "name": "/usr/include/x86_64-linux-gnu/sys/socketvar.h", "type": "file" }, { - "bom-ref": "773fc67b90438c97", + "bom-ref": "7da5982bd3ddd4bd", "name": "/usr/include/x86_64-linux-gnu/sys/soundcard.h", "type": "file" }, { - "bom-ref": "9cd5cb7075e17416", + "bom-ref": "2d90ed8df0551124", "name": "/usr/include/x86_64-linux-gnu/sys/stat.h", "type": "file" }, { - "bom-ref": "afe1b2614549a0e3", + "bom-ref": "deb7338918aab735", "name": "/usr/include/x86_64-linux-gnu/sys/statfs.h", "type": "file" }, { - "bom-ref": "611743aa48d6809a", + "bom-ref": "083d639c7ef4ebdc", "name": "/usr/include/x86_64-linux-gnu/sys/statvfs.h", "type": "file" }, { - "bom-ref": "99f4ade23ba63cc3", + "bom-ref": "80c2d8328511e1ed", "name": "/usr/include/x86_64-linux-gnu/sys/swap.h", "type": "file" }, { - "bom-ref": "43a2fc5d2bb3abf1", + "bom-ref": "e1bbb5caa362b62b", "name": "/usr/include/x86_64-linux-gnu/sys/syscall.h", "type": "file" }, { - "bom-ref": "ec43dd2b1fdd9d66", + "bom-ref": "ebb6d9ce7429eb24", "name": "/usr/include/x86_64-linux-gnu/sys/sysinfo.h", "type": "file" }, { - "bom-ref": "4a98046d53fed0a4", + "bom-ref": "88a703aaed121d26", "name": "/usr/include/x86_64-linux-gnu/sys/syslog.h", "type": "file" }, { - "bom-ref": "b02285db7834200a", + "bom-ref": "9ed8e3bfc8b68a28", "name": "/usr/include/x86_64-linux-gnu/sys/sysmacros.h", "type": "file" }, { - "bom-ref": "29f5702f3b8233ab", + "bom-ref": "281c5fc06f6f8085", "name": "/usr/include/x86_64-linux-gnu/sys/termios.h", "type": "file" }, { - "bom-ref": "4cf43b459f4c3f34", + "bom-ref": "092c97b0b538ca12", "name": "/usr/include/x86_64-linux-gnu/sys/time.h", "type": "file" }, { - "bom-ref": "9da4fda37a725378", + "bom-ref": "9be016fc95ba3b26", "name": "/usr/include/x86_64-linux-gnu/sys/timeb.h", "type": "file" }, { - "bom-ref": "97efbb08011ccb0e", + "bom-ref": "dbfab8c187b6c194", "name": "/usr/include/x86_64-linux-gnu/sys/timerfd.h", "type": "file" }, { - "bom-ref": "9bd4bf109ab591cd", + "bom-ref": "576ff85a84978183", "name": "/usr/include/x86_64-linux-gnu/sys/times.h", "type": "file" }, { - "bom-ref": "16ef0cd4d4a49aec", + "bom-ref": "09310171daed76f2", "name": "/usr/include/x86_64-linux-gnu/sys/timex.h", "type": "file" }, { - "bom-ref": "4d44127256441e48", + "bom-ref": "422a73496ab18b46", "name": "/usr/include/x86_64-linux-gnu/sys/ttychars.h", "type": "file" }, { - "bom-ref": "97971cf5e92487db", + "bom-ref": "b8afa4ca26ea7289", "name": "/usr/include/x86_64-linux-gnu/sys/ttydefaults.h", "type": "file" }, { - "bom-ref": "e2b3aa0a25d2586f", + "bom-ref": "dead002ffbbd5ef5", "name": "/usr/include/x86_64-linux-gnu/sys/types.h", "type": "file" }, { - "bom-ref": "0f3c02d7da8d8040", + "bom-ref": "174083ab4da9256e", "name": "/usr/include/x86_64-linux-gnu/sys/ucontext.h", "type": "file" }, { - "bom-ref": "d9836a90867c0fa7", + "bom-ref": "79d7e2679a93d425", "name": "/usr/include/x86_64-linux-gnu/sys/uio.h", "type": "file" }, { - "bom-ref": "7d891695e0ef4a63", + "bom-ref": "0c8f890adb739991", "name": "/usr/include/x86_64-linux-gnu/sys/un.h", "type": "file" }, { - "bom-ref": "eb098240e5428311", + "bom-ref": "81bce99ca81258fb", "name": "/usr/include/x86_64-linux-gnu/sys/unistd.h", "type": "file" }, { - "bom-ref": "baa348af75711b64", + "bom-ref": "53c18073a7e3b09a", "name": "/usr/include/x86_64-linux-gnu/sys/user.h", "type": "file" }, { - "bom-ref": "50d6f643ca5d63d8", + "bom-ref": "a3cad978498dd6ea", "name": "/usr/include/x86_64-linux-gnu/sys/utsname.h", "type": "file" }, { - "bom-ref": "09a55dfea2e3a748", + "bom-ref": "7d766f182a80f986", "name": "/usr/include/x86_64-linux-gnu/sys/vfs.h", "type": "file" }, { - "bom-ref": "a7b285ad1717ee6f", + "bom-ref": "fabe80bde7cf8081", "name": "/usr/include/x86_64-linux-gnu/sys/vlimit.h", "type": "file" }, { - "bom-ref": "b8e6ece8b73263d2", + "bom-ref": "4c6d266c3cdbe368", "name": "/usr/include/x86_64-linux-gnu/sys/vm86.h", "type": "file" }, { - "bom-ref": "294101781188cb00", + "bom-ref": "db709614cb7b543e", "name": "/usr/include/x86_64-linux-gnu/sys/vt.h", "type": "file" }, { - "bom-ref": "fb19703b13ddd885", + "bom-ref": "fa2eb5c4f4da089b", "name": "/usr/include/x86_64-linux-gnu/sys/wait.h", "type": "file" }, { - "bom-ref": "131a1ae361e7af6d", + "bom-ref": "61dc9b918a1aa003", "name": "/usr/include/x86_64-linux-gnu/sys/xattr.h", "type": "file" }, { - "bom-ref": "9927c5f490021ecb", + "bom-ref": "4ccd2ae9267b9195", "name": "/usr/include/x86_64-linux-gnu/unwind.h", "type": "file" }, { - "bom-ref": "a27d03713ba1cebb", + "bom-ref": "13f97388b7d5c2ec", "name": "/usr/include/xen/evtchn.h", "type": "file" }, { - "bom-ref": "3aec1b80d75a4376", + "bom-ref": "8c1a19fbc183ffad", "name": "/usr/include/xen/gntalloc.h", "type": "file" }, { - "bom-ref": "d5702dabed5b2367", + "bom-ref": "a028d439a40a42ec", "name": "/usr/include/xen/gntdev.h", "type": "file" }, { - "bom-ref": "4581fbe5f814d0be", + "bom-ref": "ab29d468d59d3fe5", "name": "/usr/include/xen/privcmd.h", "type": "file" }, { - "bom-ref": "cfbf60c0c0a21e37", + "bom-ref": "79a24ed896fa1d15", "name": "/usr/include/z3++.h", "type": "file" }, { - "bom-ref": "b7a36b92ac9a5b5d", + "bom-ref": "638cb77a64a34887", "name": "/usr/include/z3.h", "type": "file" }, { - "bom-ref": "9199ca3004309f49", + "bom-ref": "ffc85d97632c091f", "name": "/usr/include/z3_algebraic.h", "type": "file" }, { - "bom-ref": "73ee6a5a93ad63ae", + "bom-ref": "13a1faa9033e71d4", "name": "/usr/include/z3_api.h", "type": "file" }, { - "bom-ref": "3d47c836fb980b04", + "bom-ref": "e9c5b3e6d03c6f62", "name": "/usr/include/z3_ast_containers.h", "type": "file" }, { - "bom-ref": "fe319e8006d053d2", + "bom-ref": "60f1b1bfc004a7a0", "name": "/usr/include/z3_fixedpoint.h", "type": "file" }, { - "bom-ref": "4e53b1373446f8e4", + "bom-ref": "306e76255200a85e", "name": "/usr/include/z3_fpa.h", "type": "file" }, { - "bom-ref": "3b24030598601e3b", + "bom-ref": "b2beece3ee151b59", "name": "/usr/include/z3_macros.h", "type": "file" }, { - "bom-ref": "55be47c7a56ca1a6", + "bom-ref": "9ca9d4cf3d61f2b4", "name": "/usr/include/z3_optimization.h", "type": "file" }, { - "bom-ref": "3600e10f4a865d33", + "bom-ref": "4016b5eb74bc1bf9", "name": "/usr/include/z3_polynomial.h", "type": "file" }, { - "bom-ref": "bc319215e486e677", + "bom-ref": "416da815890f86a9", "name": "/usr/include/z3_rcf.h", "type": "file" }, { - "bom-ref": "73e8b6c935c1a88c", + "bom-ref": "66cfaecb087d882a", "name": "/usr/include/z3_spacer.h", "type": "file" }, { - "bom-ref": "16b2a893b2b22e00", + "bom-ref": "d944808e437be1c6", "name": "/usr/include/z3_v1.h", "type": "file" }, { - "bom-ref": "bd73752acc512aac", + "bom-ref": "39ce22c0debe2c46", "name": "/usr/include/z3_version.h", "type": "file" }, { - "bom-ref": "d41d0de9e967ecf9", + "bom-ref": "d1d6d85da907e0c7", "name": "/usr/include/zconf.h", "type": "file" }, { - "bom-ref": "a61e59329208cd88", + "bom-ref": "c174968568b3ced2", "name": "/usr/include/zdict.h", "type": "file" }, { - "bom-ref": "7415aafa6de78afd", + "bom-ref": "bec9a752965099f3", "name": "/usr/include/zlib.h", "type": "file" }, { - "bom-ref": "e27f9e97fec7e0ce", + "bom-ref": "a627095447cf31dc", "name": "/usr/include/zmq.h", "type": "file" }, { - "bom-ref": "9cb6d411b3704d20", + "bom-ref": "d90fd8bd4f477b62", "name": "/usr/include/zmq_utils.h", "type": "file" }, { - "bom-ref": "1a2d503c7d810aaa", + "bom-ref": "d6b04772dcccea40", "name": "/usr/include/zstd.h", "type": "file" }, { - "bom-ref": "dcb981d93cc3ca9a", + "bom-ref": "116c0f3fe049b0fc", "name": "/usr/include/zstd_errors.h", "type": "file" }, { - "bom-ref": "71de379d2894dad7", + "bom-ref": "292f4aaed2defea5", "name": "/usr/lib/apt/apt-helper", "type": "file" }, { - "bom-ref": "f74f76f260d8bcdd", + "bom-ref": "f9a0755a1fbf1197", "name": "/usr/lib/apt/apt.systemd.daily", "type": "file" }, { - "bom-ref": "d29de95312aea609", + "bom-ref": "d991fd23eb4ff89f", "name": "/usr/lib/apt/methods/cdrom", "type": "file" }, { - "bom-ref": "b3b6f53c816670b1", + "bom-ref": "1093724a273f458b", "name": "/usr/lib/apt/methods/copy", "type": "file" }, { - "bom-ref": "6dd3d05f4ca404f1", + "bom-ref": "c5148cc0894d13c7", "name": "/usr/lib/apt/methods/file", "type": "file" }, { - "bom-ref": "8e719685b730807c", + "bom-ref": "45769eab1e5642be", "name": "/usr/lib/apt/methods/ftp", "type": "file" }, { - "bom-ref": "67d76ca3b3b6ade3", + "bom-ref": "eed17e82cf6638c1", "name": "/usr/lib/apt/methods/gpgv", "type": "file" }, { - "bom-ref": "78980214b39f93cf", + "bom-ref": "fc722ae4026b14ad", "name": "/usr/lib/apt/methods/http", "type": "file" }, { - "bom-ref": "e0df189d318de1a3", + "bom-ref": "c2c30c11a8a0c045", "name": "/usr/lib/apt/methods/mirror", "type": "file" }, { - "bom-ref": "dcad9b83ac0f0b7c", + "bom-ref": "9b44318617f5f452", "name": "/usr/lib/apt/methods/rred", "type": "file" }, { - "bom-ref": "0922504e6305855c", + "bom-ref": "95bb7cf7ff137c9a", "name": "/usr/lib/apt/methods/rsh", "type": "file" }, { - "bom-ref": "5bf14549188ac0c9", + "bom-ref": "6a3189a5a92719eb", "name": "/usr/lib/apt/methods/store", "type": "file" }, { - "bom-ref": "4abf75688db091b3", + "bom-ref": "78b5049382ff6616", "name": "/usr/lib/apt/planners/apt", "type": "file" }, { - "bom-ref": "68189e09c1abab8c", + "bom-ref": "6c3e3892d0f91a7d", "name": "/usr/lib/apt/solvers/apt", "type": "file" }, { - "bom-ref": "16682914faa78f38", + "bom-ref": "482aeb519eca2d32", "name": "/usr/lib/apt/solvers/dump", "type": "file" }, { - "bom-ref": "9cda64d0fb16df4d", + "bom-ref": "58942b8aa8434ab7", "name": "/usr/lib/binfmt.d/llvm-18-runtime.binfmt.conf", "type": "file" }, { - "bom-ref": "d6652ac0905bb35e", + "bom-ref": "8d3c4fa5dce64314", "name": "/usr/lib/binfmt.d/python3.12.conf", "type": "file" }, { - "bom-ref": "f68dbd7537b6fa68", + "bom-ref": "08c331961c2a1fc2", "name": "/usr/lib/dpkg/methods/apt/desc.apt", "type": "file" }, { - "bom-ref": "7cb184a9710d543d", + "bom-ref": "9b80d36317316e23", "name": "/usr/lib/dpkg/methods/apt/install", "type": "file" }, { - "bom-ref": "487ca46ba98806d5", + "bom-ref": "988d421d2be2e743", "name": "/usr/lib/dpkg/methods/apt/names", "type": "file" }, { - "bom-ref": "672bb915c1640170", + "bom-ref": "d6b3c8bc78335186", "name": "/usr/lib/dpkg/methods/apt/setup", "type": "file" }, { - "bom-ref": "260ae6b416a9945b", + "bom-ref": "39993c8550f7ba8d", "name": "/usr/lib/dpkg/methods/apt/update", "type": "file" }, { - "bom-ref": "d4a318317f8b61ef", + "bom-ref": "267283d544c9b635", "name": "/usr/lib/file/magic.mgc", "type": "file" }, { - "bom-ref": "2460762c11eb6dbe", + "bom-ref": "7b658513a637ed43", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtbegin.o", "type": "file" }, { - "bom-ref": "98b99c7bcfe86b7a", + "bom-ref": "56daceb8aa76b287", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o", "type": "file" }, { - "bom-ref": "6d22eb7c89386e36", + "bom-ref": "0c168532138724c7", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginT.o", "type": "file" }, { - "bom-ref": "727b5d35d6f94db6", + "bom-ref": "bbde52acf46209bb", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtend.o", "type": "file" }, { - "bom-ref": "a0865c5273795116", + "bom-ref": "280794160b9954e7", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o", "type": "file" }, { - "bom-ref": "1a0a491474862bdb", + "bom-ref": "a7e85b8afc43b9ea", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtfastmath.o", "type": "file" }, { - "bom-ref": "21cc22a386828f07", + "bom-ref": "468bce01c7649f26", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadbegin.o", "type": "file" }, { - "bom-ref": "4a4728bc00fca881", + "bom-ref": "f7a5c62c7e768ddc", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadend.o", "type": "file" }, { - "bom-ref": "3bf1ff598850bb3b", + "bom-ref": "ae0077ef0ed614c2", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadtable.o", "type": "file" }, { - "bom-ref": "4aa51f66540ac518", + "bom-ref": "a453f49c833dc5a5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtprec32.o", "type": "file" }, { - "bom-ref": "8e3839ec15a761f4", + "bom-ref": "04f353adbee05559", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtprec64.o", "type": "file" }, { - "bom-ref": "24e1afb562f36768", + "bom-ref": "7c9a4c141d9bf691", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/crtprec80.o", "type": "file" }, { - "bom-ref": "b48d64db9cd3c814", + "bom-ref": "4edb4c7a5651db45", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/acc_prof.h", "type": "file" }, { - "bom-ref": "5cd3b8565635f511", + "bom-ref": "ad23b9857a75eb5c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/adxintrin.h", "type": "file" }, { - "bom-ref": "bf9631d96d4f141b", + "bom-ref": "d07a7f4c5ed1b9d2", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/ammintrin.h", "type": "file" }, { - "bom-ref": "2a460bf1d9703609", + "bom-ref": "0f26e5e4885d5440", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/amxbf16intrin.h", "type": "file" }, { - "bom-ref": "047a3fa7b1f280b9", + "bom-ref": "6936b18f48e36800", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/amxcomplexintrin.h", "type": "file" }, { - "bom-ref": "2c498a312b4b626d", + "bom-ref": "fdca4e00fccafd8c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/amxfp16intrin.h", "type": "file" }, { - "bom-ref": "4b196fcb46a54855", + "bom-ref": "1a409f468a1969b4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/amxint8intrin.h", "type": "file" }, { - "bom-ref": "38d54079f526ef3b", + "bom-ref": "6015ef8184ed1c5e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/amxtileintrin.h", "type": "file" }, { - "bom-ref": "13e1b39dbea7156e", + "bom-ref": "ff18f0503ed892eb", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx2intrin.h", "type": "file" }, { - "bom-ref": "3726a593af86a7d8", + "bom-ref": "a039b6bf35ffa0e9", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx5124fmapsintrin.h", "type": "file" }, { - "bom-ref": "bf730a9a6ab39200", + "bom-ref": "d573381d00b9036d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx5124vnniwintrin.h", "type": "file" }, { - "bom-ref": "4db52fa155e61b33", + "bom-ref": "1f0b16d03b4a25a6", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512bf16intrin.h", "type": "file" }, { - "bom-ref": "03472cb6b0c281ee", + "bom-ref": "aca1aee8d9442993", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512bf16vlintrin.h", "type": "file" }, { - "bom-ref": "63f9fb2fbb518ea4", + "bom-ref": "6385a713ce943b99", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512bitalgintrin.h", "type": "file" }, { - "bom-ref": "0790672abe600ff0", + "bom-ref": "c689beef2862eb15", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512bwintrin.h", "type": "file" }, { - "bom-ref": "977dbc875e207d9b", + "bom-ref": "61e085e158651d06", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512cdintrin.h", "type": "file" }, { - "bom-ref": "b126dedff04e9b5a", + "bom-ref": "00fa284ee77354d7", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512dqintrin.h", "type": "file" }, { - "bom-ref": "2c07d429533a60b0", + "bom-ref": "777628b942b97c3d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512erintrin.h", "type": "file" }, { - "bom-ref": "2baf4415f571b615", + "bom-ref": "1e541b68148d9cd8", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512fintrin.h", "type": "file" }, { - "bom-ref": "bc0cffe0adfe03ad", + "bom-ref": "cae1dbc9f4079f20", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512fp16intrin.h", "type": "file" }, { - "bom-ref": "a003a517691938f2", + "bom-ref": "becf2a62ed23970f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512fp16vlintrin.h", "type": "file" }, { - "bom-ref": "a591b09f61f2b03c", + "bom-ref": "05c3fcf9d0d46721", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512ifmaintrin.h", "type": "file" }, { - "bom-ref": "ee0741629f2e7e6c", + "bom-ref": "e21c6aa2e80ba421", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512ifmavlintrin.h", "type": "file" }, { - "bom-ref": "f6a1599e624fe9bb", + "bom-ref": "650ffecc8feaf41e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512pfintrin.h", "type": "file" }, { - "bom-ref": "e9b3cd62db965b0d", + "bom-ref": "aac3676d944e69b8", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vbmi2intrin.h", "type": "file" }, { - "bom-ref": "bffe7ef9e22a5238", + "bom-ref": "e66ea6c159ea99e1", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vbmi2vlintrin.h", "type": "file" }, { - "bom-ref": "972d5ff9715e2d02", + "bom-ref": "d238b2312548700b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vbmiintrin.h", "type": "file" }, { - "bom-ref": "58fa184b89527063", + "bom-ref": "246ad390358c26c2", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vbmivlintrin.h", "type": "file" }, { - "bom-ref": "8b175222288e5295", + "bom-ref": "1455d7b5f2c1baf0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vlbwintrin.h", "type": "file" }, { - "bom-ref": "7d4eb7cd4ec5e8db", + "bom-ref": "c1d37e0ee3125476", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vldqintrin.h", "type": "file" }, { - "bom-ref": "9f4c4a63fbc1e3de", + "bom-ref": "e2d05495071afd47", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vlintrin.h", "type": "file" }, { - "bom-ref": "7b53a573a747a906", + "bom-ref": "30adf6735d212513", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vnniintrin.h", "type": "file" }, { - "bom-ref": "b0ab63e97558bbe1", + "bom-ref": "3b4647d74b816928", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vnnivlintrin.h", "type": "file" }, { - "bom-ref": "d498b580c2b254c3", + "bom-ref": "85129b9c27f6697e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vp2intersectintrin.h", "type": "file" }, { - "bom-ref": "1f52b97aca7bbcf7", + "bom-ref": "3e546948f07d848a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vp2intersectvlintrin.h", "type": "file" }, { - "bom-ref": "a50019e2e597e5df", + "bom-ref": "fa786ebc04045f56", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vpopcntdqintrin.h", "type": "file" }, { - "bom-ref": "9410c07caff20dbc", + "bom-ref": "e48504965c02d19d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avx512vpopcntdqvlintrin.h", "type": "file" }, { - "bom-ref": "a023c3e82cc74f56", + "bom-ref": "23237728e3c8e33b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avxifmaintrin.h", "type": "file" }, { - "bom-ref": "7174dd73ddd41d0f", + "bom-ref": "4c29648ed0a1e74a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avxintrin.h", "type": "file" }, { - "bom-ref": "4014f5fd324c6d70", + "bom-ref": "ac30acf270f746e5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avxneconvertintrin.h", "type": "file" }, { - "bom-ref": "b3cf9bdf1b50093b", + "bom-ref": "7de8b2703698b6fa", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avxvnniint8intrin.h", "type": "file" }, { - "bom-ref": "6b574101ad587b80", + "bom-ref": "38adbe0e2b9290f1", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/avxvnniintrin.h", "type": "file" }, { - "bom-ref": "2da05abeee66cec3", + "bom-ref": "0825ac901b6cde6e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/backtrace-supported.h", "type": "file" }, { - "bom-ref": "2289d2d369b908cd", + "bom-ref": "b313bb259566c304", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/backtrace.h", "type": "file" }, { - "bom-ref": "e1cc2b76b9fd0a65", + "bom-ref": "0d0320bcb71207a8", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/bmi2intrin.h", "type": "file" }, { - "bom-ref": "95fd3a5edf415888", + "bom-ref": "a1fcfa9eef6dd14d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/bmiintrin.h", "type": "file" }, { - "bom-ref": "556009b038ea70fb", + "bom-ref": "a64aca0ba248191a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/bmmintrin.h", "type": "file" }, { - "bom-ref": "72da44aa7eaef705", + "bom-ref": "fbe2756c28b8da10", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cet.h", "type": "file" }, { - "bom-ref": "1d71344a8735d2f2", + "bom-ref": "8e4df6a1fed2a24f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cetintrin.h", "type": "file" }, { - "bom-ref": "078b12fa8db99978", + "bom-ref": "76ccb69d5bf832f1", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cldemoteintrin.h", "type": "file" }, { - "bom-ref": "f0c113869317cc5d", + "bom-ref": "385eb5dea06cbdd4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/clflushoptintrin.h", "type": "file" }, { - "bom-ref": "3e868887382441dc", + "bom-ref": "4a9a5f552d99a961", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/clwbintrin.h", "type": "file" }, { - "bom-ref": "74fab7d3e6599788", + "bom-ref": "48b673289fe48ef9", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/clzerointrin.h", "type": "file" }, { - "bom-ref": "ea756f4dab6faacc", + "bom-ref": "c4b8c1aa0a00b4f1", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cmpccxaddintrin.h", "type": "file" }, { - "bom-ref": "0d1d853b2e414a2f", + "bom-ref": "cb3bbf890949343a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cpuid.h", "type": "file" }, { - "bom-ref": "ebce0a9a25f39967", + "bom-ref": "e1d4fbea8c1c812a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/cross-stdarg.h", "type": "file" }, { - "bom-ref": "e3af65da513ecc1f", + "bom-ref": "d849da2b06b46372", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/emmintrin.h", "type": "file" }, { - "bom-ref": "d8690f00e3b7eab0", + "bom-ref": "977d299bdcf44b75", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/enqcmdintrin.h", "type": "file" }, { - "bom-ref": "9703b0d426a5a307", + "bom-ref": "bbc6e007cb9c3a9e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/f16cintrin.h", "type": "file" }, { - "bom-ref": "ddf52136f51fc24c", + "bom-ref": "77a96c7564abdddd", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/float.h", "type": "file" }, { - "bom-ref": "4c00aa42a236281c", + "bom-ref": "5125a68814d894d9", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/fma4intrin.h", "type": "file" }, { - "bom-ref": "97476dff1c80a570", + "bom-ref": "7e702882046448c1", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/fmaintrin.h", "type": "file" }, { - "bom-ref": "118cd08aed4d4d33", + "bom-ref": "49ee514f31e14436", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/fxsrintrin.h", "type": "file" }, { - "bom-ref": "9c3208983e4942cc", + "bom-ref": "1f43ce2988ac4c25", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/gcov.h", "type": "file" }, { - "bom-ref": "e36e2fd7e229f232", + "bom-ref": "4f439981c588cfef", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/gfniintrin.h", "type": "file" }, { - "bom-ref": "746a149a3a9aa29b", + "bom-ref": "dd0597d567d66c56", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/hresetintrin.h", "type": "file" }, { - "bom-ref": "ac41a1b6a932475d", + "bom-ref": "d9d802efc44a6f20", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/ia32intrin.h", "type": "file" }, { - "bom-ref": "eacbd3448364bfcd", + "bom-ref": "b82967c33beeaee0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/immintrin.h", "type": "file" }, { - "bom-ref": "f0e4cae44a5fa283", + "bom-ref": "dc44f1015b3b421a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/iso646.h", "type": "file" }, { - "bom-ref": "77f9e8cc3ff8e66f", + "bom-ref": "7c1d6781334cc00e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/keylockerintrin.h", "type": "file" }, { - "bom-ref": "67130cfc980cf6b7", + "bom-ref": "9ce5f6b53d76b296", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/limits.h", "type": "file" }, { - "bom-ref": "28bde8c3ad87424c", + "bom-ref": "3cbc917ea92d9ff9", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/lwpintrin.h", "type": "file" }, { - "bom-ref": "efb7071f2b06c947", + "bom-ref": "5161338c8ce2363a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/lzcntintrin.h", "type": "file" }, { - "bom-ref": "3d9fa53526937a98", + "bom-ref": "3fc2b3d1c70414e5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/mm3dnow.h", "type": "file" }, { - "bom-ref": "6ee8049948233973", + "bom-ref": "229b1c1af61bce1e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/mm_malloc.h", "type": "file" }, { - "bom-ref": "a71a203c336338c5", + "bom-ref": "b30551bf84567ad0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/mmintrin.h", "type": "file" }, { - "bom-ref": "87fb69ab954be26b", + "bom-ref": "42f3b8d7f1ea875a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/movdirintrin.h", "type": "file" }, { - "bom-ref": "46cd993a15d8e055", + "bom-ref": "bba78fd544425348", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/mwaitintrin.h", "type": "file" }, { - "bom-ref": "6525c2e38b59d022", + "bom-ref": "803b6cce5b6c06bb", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/mwaitxintrin.h", "type": "file" }, { - "bom-ref": "f6df4c5acdaa7a51", + "bom-ref": "21bde52c3c7f2b30", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/nmmintrin.h", "type": "file" }, { - "bom-ref": "92b25089d90ab8ad", + "bom-ref": "05ec32b66ea2b46f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/objc/NXConstStr.h", "type": "file" }, { - "bom-ref": "19f67a2a6347cfe2", + "bom-ref": "777ef9c708783b08", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/objc/Object.h", "type": "file" }, { - "bom-ref": "a6af96921e5bcd42", + "bom-ref": "9155d27098c658e4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/objc/Protocol.h", "type": "file" }, { - "bom-ref": "7979507e7ef36883", + "bom-ref": "ec1abafe586c7045", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/objc/message.h", "type": "file" }, { - "bom-ref": "5578230760e4684c", + "bom-ref": "69398165da980912", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/objc/objc-decls.h", "type": "file" }, { - "bom-ref": "64f077b5023a34de", + "bom-ref": "ef4fd844a5867fa0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/objc/objc-exception.h", "type": "file" }, { - "bom-ref": "3acde544e358f9c8", + "bom-ref": "e10328cb90599166", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/objc/objc-sync.h", "type": "file" }, { - "bom-ref": "1477f9ca777ff526", + "bom-ref": "f640b9028ff0d284", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/objc/objc.h", "type": "file" }, { - "bom-ref": "19dfa3d1b179ffd8", + "bom-ref": "630d48ca03c5d436", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/objc/runtime.h", "type": "file" }, { - "bom-ref": "4776cf1cc57cb446", + "bom-ref": "bf729cb769105478", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/objc/thr.h", "type": "file" }, { - "bom-ref": "fd1c6c12730c4467", + "bom-ref": "0e76e8d9840d07da", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/omp.h", "type": "file" }, { - "bom-ref": "534701c656c1e5c0", + "bom-ref": "e5ddebf3902b15fd", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/openacc.h", "type": "file" }, { - "bom-ref": "46f73a90494a7e32", + "bom-ref": "03d7248bc31f5163", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/pconfigintrin.h", "type": "file" }, { - "bom-ref": "97f134c74f8a21eb", + "bom-ref": "8b0ef758c9fed37e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/pkuintrin.h", "type": "file" }, { - "bom-ref": "2b6d100e585b5663", + "bom-ref": "d8b8fe341682e576", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/pmmintrin.h", "type": "file" }, { - "bom-ref": "0e8ab75ed060b644", + "bom-ref": "52cff194225e0959", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/popcntintrin.h", "type": "file" }, { - "bom-ref": "5689955143f999ee", + "bom-ref": "4019b709b4950cf7", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/prfchiintrin.h", "type": "file" }, { - "bom-ref": "a75060b4d8a3782e", + "bom-ref": "97a809bc56c1fd63", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/prfchwintrin.h", "type": "file" }, { - "bom-ref": "d42ba1cd23a5da61", + "bom-ref": "a377ff13b6e2ddbc", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/quadmath.h", "type": "file" }, { - "bom-ref": "d92c8713a8c16851", + "bom-ref": "25d61f808e2bab10", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/quadmath_weak.h", "type": "file" }, { - "bom-ref": "86c1d5cf90728c23", + "bom-ref": "f792d9ca35a3d882", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/raointintrin.h", "type": "file" }, { - "bom-ref": "405d8e167bc3bd1a", + "bom-ref": "9f6e7f93060b942f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/rdseedintrin.h", "type": "file" }, { - "bom-ref": "3c38c4342adf3354", + "bom-ref": "3afbb5dfa6d22d85", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/rtmintrin.h", "type": "file" }, { - "bom-ref": "bd30d3e0c5e89fbb", + "bom-ref": "ac80153c1dd6d962", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sanitizer/asan_interface.h", "type": "file" }, { - "bom-ref": "d42d7a6e9da2f158", + "bom-ref": "6ee227be2d73acd9", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sanitizer/common_interface_defs.h", "type": "file" }, { - "bom-ref": "789798bcb5e7d118", + "bom-ref": "e898cc90bd3fa679", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sanitizer/hwasan_interface.h", "type": "file" }, { - "bom-ref": "0fe5e7c4aa5f9059", + "bom-ref": "7b194d506c94fcb4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sanitizer/lsan_interface.h", "type": "file" }, { - "bom-ref": "31dfaf09737bcdb8", + "bom-ref": "34d238eee8b28365", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sanitizer/tsan_interface.h", "type": "file" }, { - "bom-ref": "4ffbecfb6ef0d018", + "bom-ref": "d137347210153075", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/serializeintrin.h", "type": "file" }, { - "bom-ref": "6a05d7c69202015c", + "bom-ref": "ab59d23864572aa5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/sgxintrin.h", "type": "file" }, { - "bom-ref": "7b1129aa4400728a", + "bom-ref": "e78e20a604afa54f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/shaintrin.h", "type": "file" }, { - "bom-ref": "4d18631aac685744", + "bom-ref": "7c3ba1930f68de5d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/smmintrin.h", "type": "file" }, { - "bom-ref": "4882415d5a221e32", + "bom-ref": "e4f0d18648ee8823", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdalign.h", "type": "file" }, { - "bom-ref": "3a46afecb1f5c505", + "bom-ref": "c300363895b456d0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdarg.h", "type": "file" }, { - "bom-ref": "c608bff2e3971f26", + "bom-ref": "086b8423bc1596df", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdatomic.h", "type": "file" }, { - "bom-ref": "2306c59163c11809", + "bom-ref": "00dafb3f39d1e488", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdbool.h", "type": "file" }, { - "bom-ref": "1e5c689ff8caf7c1", + "bom-ref": "a2710da4caadb914", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stddef.h", "type": "file" }, { - "bom-ref": "c40118e9b5e1474d", + "bom-ref": "be7d18082ea8b2dc", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdfix.h", "type": "file" }, { - "bom-ref": "769f7bb72272a6bf", + "bom-ref": "ce5fc244178eb306", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdint-gcc.h", "type": "file" }, { - "bom-ref": "d07410ec2b6c6416", + "bom-ref": "8ba0bf3c6758998f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdint.h", "type": "file" }, { - "bom-ref": "1e05b4a3219b7b1e", + "bom-ref": "85c111c7214abacb", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/stdnoreturn.h", "type": "file" }, { - "bom-ref": "94d92103aeb25a61", + "bom-ref": "25d599c6818d4bbc", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/syslimits.h", "type": "file" }, { - "bom-ref": "78ffed3c96943c89", + "bom-ref": "84f1f484a8efd8b4", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/tbmintrin.h", "type": "file" }, { - "bom-ref": "8187de9ae6256cc0", + "bom-ref": "2b7e4288a84ace6d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/tmmintrin.h", "type": "file" }, { - "bom-ref": "f2e2e5e656fd4118", + "bom-ref": "f57361544a6b5b91", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/tsxldtrkintrin.h", "type": "file" }, { - "bom-ref": "33aa3479ddc5cbe5", + "bom-ref": "861adfd7e44656e8", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/uintrintrin.h", "type": "file" }, { - "bom-ref": "815cba584fefdb15", + "bom-ref": "ef1bf6460075b5d0", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/unwind.h", "type": "file" }, { - "bom-ref": "cb7f855dc5b5789e", + "bom-ref": "d4fccda2beae8ea3", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/vaesintrin.h", "type": "file" }, { - "bom-ref": "e7a69c9574ded310", + "bom-ref": "18917dd5952ef53d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/varargs.h", "type": "file" }, { - "bom-ref": "6e8a4136255175d1", + "bom-ref": "a462b9b24f72bdbc", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/vpclmulqdqintrin.h", "type": "file" }, { - "bom-ref": "d43a05eb2e6baf68", + "bom-ref": "ec75855fc43a87ed", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/waitpkgintrin.h", "type": "file" }, { - "bom-ref": "8378869640c94dff", + "bom-ref": "47be4a8dc30ff4f6", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/wbnoinvdintrin.h", "type": "file" }, { - "bom-ref": "c9ce123693ededaa", + "bom-ref": "8f3f68e2cffb6487", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/wmmintrin.h", "type": "file" }, { - "bom-ref": "c595c7b9f8ddc9e3", + "bom-ref": "337d712e7ea20d1e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/x86gprintrin.h", "type": "file" }, { - "bom-ref": "a8bf2aa7638a6f5f", + "bom-ref": "0d68af8b3d022db6", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/x86intrin.h", "type": "file" }, { - "bom-ref": "fbcd488620fd0134", + "bom-ref": "8935a8070b32923d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xmmintrin.h", "type": "file" }, { - "bom-ref": "8e2fdb49023ffa4b", + "bom-ref": "b9930c08c1100512", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xopintrin.h", "type": "file" }, { - "bom-ref": "fbac3e9919408fe6", + "bom-ref": "0756e491ffac3c73", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xsavecintrin.h", "type": "file" }, { - "bom-ref": "b273a2da9c719b08", + "bom-ref": "882fefde0fa7559d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xsaveintrin.h", "type": "file" }, { - "bom-ref": "be929818a01e2fdb", + "bom-ref": "6b66c8885cb27a8a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xsaveoptintrin.h", "type": "file" }, { - "bom-ref": "7ff82f94f1c5fbd3", + "bom-ref": "73858c427b701802", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xsavesintrin.h", "type": "file" }, { - "bom-ref": "871ebfe22fb963bd", + "bom-ref": "548484379af76f04", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/include/xtestintrin.h", "type": "file" }, { - "bom-ref": "ee3f3b62c2148420", + "bom-ref": "3823fa4610833c09", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libasan.a", "type": "file" }, { - "bom-ref": "d88b6f5ffb7d3ab1", + "bom-ref": "8f0fe0376847a110", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libasan_preinit.o", "type": "file" }, { - "bom-ref": "17a9373ac6c7c6ee", + "bom-ref": "7609c48e487c1537", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libatomic.a", "type": "file" }, { - "bom-ref": "3dd3ab095804f4ac", + "bom-ref": "a882251db1991295", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libbacktrace.a", "type": "file" }, { - "bom-ref": "dd14ad82d5254684", + "bom-ref": "a797e638c8f00539", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgcc.a", "type": "file" }, { - "bom-ref": "a265efdf4990a741", + "bom-ref": "7e0df81a777dd280", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgcc_eh.a", "type": "file" }, { - "bom-ref": "47878804e832a310", + "bom-ref": "88e996be7a6c93cd", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgcc_s.so", "type": "file" }, { - "bom-ref": "69dff4d582974057", + "bom-ref": "36b711bf066ea59e", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgcov.a", "type": "file" }, { - "bom-ref": "484e94f7b4f9c75c", + "bom-ref": "2190da09761e2959", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgomp.a", "type": "file" }, { - "bom-ref": "3aba4b0b9bc93f20", + "bom-ref": "2f568f9c8a3cddd5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libgomp.spec", "type": "file" }, { - "bom-ref": "6374bd5885c69e4e", + "bom-ref": "9bf03367016f174f", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libhwasan.a", "type": "file" }, { - "bom-ref": "61877821e70579f8", + "bom-ref": "43d263a53d1040fd", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libhwasan_preinit.o", "type": "file" }, { - "bom-ref": "26a72721011b56cc", + "bom-ref": "3473f3c96bade9e5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libitm.a", "type": "file" }, { - "bom-ref": "45f42a5399095443", + "bom-ref": "0ee1bad224e4ab72", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libitm.spec", "type": "file" }, { - "bom-ref": "77b6b23aa203eceb", + "bom-ref": "ab6f5edf8ca4d1ee", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/liblsan.a", "type": "file" }, { - "bom-ref": "b76ad6629897bb79", + "bom-ref": "a56659a6b3357e3c", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/liblsan_preinit.o", "type": "file" }, { - "bom-ref": "2435675aa8f61c01", + "bom-ref": "883ab85f5594dc2b", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libobjc.a", "type": "file" }, { - "bom-ref": "f50b64721025c5d3", + "bom-ref": "fc6932a7ac1a86d1", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libobjc_gc.a", "type": "file" }, { - "bom-ref": "3f277594adba75ff", + "bom-ref": "3de1fea435d80682", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libquadmath.a", "type": "file" }, { - "bom-ref": "e2ab8ca016fc7c02", + "bom-ref": "a8915bcc4a4a5053", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libsanitizer.spec", "type": "file" }, { - "bom-ref": "03e81ec55bc6a8e3", + "bom-ref": "3fdfb5b9c79f743a", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libssp_nonshared.a", "type": "file" }, { - "bom-ref": "22d4341156138e08", + "bom-ref": "5fc7be1c09ab6629", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libstdc++.a", "type": "file" }, { - "bom-ref": "9ff5f642ce072bf7", + "bom-ref": "594dda5f44a4b572", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libstdc++exp.a", "type": "file" }, { - "bom-ref": "a11296330bfda8e4", + "bom-ref": "49daddb8c7627ec5", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libstdc++fs.a", "type": "file" }, { - "bom-ref": "70259f7e77824d58", + "bom-ref": "147d5f8b502dbdcd", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libsupc++.a", "type": "file" }, { - "bom-ref": "0166a836492c10a7", + "bom-ref": "a93870920c6b92ae", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libtsan.a", "type": "file" }, { - "bom-ref": "12b24b98cff1e394", + "bom-ref": "5f5e2e5732c3ba7d", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libtsan_preinit.o", "type": "file" }, { - "bom-ref": "0dd423d51697d48a", + "bom-ref": "94396a0686289623", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/libubsan.a", "type": "file" }, { - "bom-ref": "74eb61726be7dd0a", + "bom-ref": "2e4eb1a24781ea27", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/plugin/libcc1plugin.so.0.0.0", "type": "file" }, { - "bom-ref": "fa95617d3603eedf", + "bom-ref": "2863bdd6f3e030e6", "name": "/usr/lib/gcc/x86_64-linux-gnu/13/plugin/libcp1plugin.so.0.0.0", "type": "file" }, { - "bom-ref": "8ef0427e9e6912e9", + "bom-ref": "b02b6b3ea1a7e50f", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtbegin.o", "type": "file" }, { - "bom-ref": "61fce2e010ad6eac", + "bom-ref": "e5e6a3d5b70dfafe", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtbeginS.o", "type": "file" }, { - "bom-ref": "f709e5c5d0f7b49e", + "bom-ref": "3fb5ae3dd6f29e18", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtbeginT.o", "type": "file" }, { - "bom-ref": "111e89a94c517a12", + "bom-ref": "dba1043125bdb5f0", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtend.o", "type": "file" }, { - "bom-ref": "a3d42ea71a32ad5f", + "bom-ref": "70193ef48760a45d", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtendS.o", "type": "file" }, { - "bom-ref": "4cd5b54d1bfcd8b4", + "bom-ref": "bb2ab63c12652842", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtfastmath.o", "type": "file" }, { - "bom-ref": "071712cf14b89a8c", + "bom-ref": "348059dda2f9be52", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtoffloadbegin.o", "type": "file" }, { - "bom-ref": "d911d5479e4bcefe", + "bom-ref": "ddaa65b972e9e7e4", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtoffloadend.o", "type": "file" }, { - "bom-ref": "cea4ffbc5a4a6580", + "bom-ref": "6dd5e47c08a083ae", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtoffloadtable.o", "type": "file" }, { - "bom-ref": "37213cbd30aaaa6b", + "bom-ref": "fa8ae93ede4265f5", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtprec32.o", "type": "file" }, { - "bom-ref": "361ce085f1c56098", + "bom-ref": "1e0f85408eb7f326", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtprec64.o", "type": "file" }, { - "bom-ref": "33a841b91ca6d8b5", + "bom-ref": "4db3230c65c39ecb", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/crtprec80.o", "type": "file" }, { - "bom-ref": "d91c7cab52609b56", + "bom-ref": "5e16f43721e800b0", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/acc_prof.h", "type": "file" }, { - "bom-ref": "07d07fccc2d460fd", + "bom-ref": "5ceff96a07f9eae7", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/adxintrin.h", "type": "file" }, { - "bom-ref": "adcda5bf47b29a7e", + "bom-ref": "5c3c0daa9f3f3b9c", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/ammintrin.h", "type": "file" }, { - "bom-ref": "00a76bcc78a3de5c", + "bom-ref": "1bcda2da034604ea", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/amxbf16intrin.h", "type": "file" }, { - "bom-ref": "ccb5dcb645b7e944", + "bom-ref": "bf0541b530c3edee", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/amxcomplexintrin.h", "type": "file" }, { - "bom-ref": "19d111244f5ed757", + "bom-ref": "da16c72abc3a7b0d", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/amxfp16intrin.h", "type": "file" }, { - "bom-ref": "844ddeb36cf82472", + "bom-ref": "092153759d86197c", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/amxint8intrin.h", "type": "file" }, { - "bom-ref": "4d62199c87f11907", + "bom-ref": "958150a947bdae31", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/amxtileintrin.h", "type": "file" }, { - "bom-ref": "170dfc6ed26b9feb", + "bom-ref": "ff913e30c78cfad9", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx2intrin.h", "type": "file" }, { - "bom-ref": "9953612bf6b9d447", + "bom-ref": "32a922c940b0f21d", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx5124fmapsintrin.h", "type": "file" }, { - "bom-ref": "b466f5956f26daae", + "bom-ref": "f93e4d1f8e64e0e8", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx5124vnniwintrin.h", "type": "file" }, { - "bom-ref": "8f7350a76a79ebdc", + "bom-ref": "ff1eec367f9e5aee", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512bf16intrin.h", "type": "file" }, { - "bom-ref": "fd17ddd439b26092", + "bom-ref": "287eb872586e6b10", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512bf16vlintrin.h", "type": "file" }, { - "bom-ref": "58f3ccb73e7aecbd", + "bom-ref": "db955695e1d2ef6b", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512bitalgintrin.h", "type": "file" }, { - "bom-ref": "25782e6b7c71649f", + "bom-ref": "c283468fbe48b891", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512bitalgvlintrin.h", "type": "file" }, { - "bom-ref": "34ce3b7f3eb62c60", + "bom-ref": "4863b9c6b5e4ffb6", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512bwintrin.h", "type": "file" }, { - "bom-ref": "354c17b790a2c392", + "bom-ref": "e68542c4835d784c", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512cdintrin.h", "type": "file" }, { - "bom-ref": "1be5f0e104bd86b6", + "bom-ref": "0604392d60b0aecc", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512dqintrin.h", "type": "file" }, { - "bom-ref": "c0b0fe18c585981c", + "bom-ref": "b2dcd27907d95ebe", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512erintrin.h", "type": "file" }, { - "bom-ref": "d399f252b40946d6", + "bom-ref": "bc6b3c2b363f8f08", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512fintrin.h", "type": "file" }, { - "bom-ref": "e8c5386e67f7dfb1", + "bom-ref": "402992d4d5e39887", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512fp16intrin.h", "type": "file" }, { - "bom-ref": "c4bffed3619c24ef", + "bom-ref": "dd3c2e856a8a37fd", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512fp16vlintrin.h", "type": "file" }, { - "bom-ref": "2bfd8740fa392fae", + "bom-ref": "a8da4fa49e0734e8", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512ifmaintrin.h", "type": "file" }, { - "bom-ref": "0f9eb2dc5bcc18c1", + "bom-ref": "1faa1e365ac0259b", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512ifmavlintrin.h", "type": "file" }, { - "bom-ref": "d1e19449b1cba256", + "bom-ref": "8abc6cc6eab7a388", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512pfintrin.h", "type": "file" }, { - "bom-ref": "25990f9cae32de85", + "bom-ref": "c872a2b5a32347c3", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vbmi2intrin.h", "type": "file" }, { - "bom-ref": "a361d9d8d0d9d725", + "bom-ref": "b675531aa9e9b3ab", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vbmi2vlintrin.h", "type": "file" }, { - "bom-ref": "e0b9babcd59b2ab4", + "bom-ref": "36d6059655313f5a", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vbmiintrin.h", "type": "file" }, { - "bom-ref": "5ae8b98e5ba82497", + "bom-ref": "cb6f7feca32d2841", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vbmivlintrin.h", "type": "file" }, { - "bom-ref": "410195fe73b1fe96", + "bom-ref": "0c11efb54a082a50", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vlbwintrin.h", "type": "file" }, { - "bom-ref": "32a74d88dff684ab", + "bom-ref": "eb54afe5e8821b15", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vldqintrin.h", "type": "file" }, { - "bom-ref": "0df3ff4eda46571a", + "bom-ref": "1d6164f1f783a9a8", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vlintrin.h", "type": "file" }, { - "bom-ref": "99adf02bee991ea3", + "bom-ref": "5928ed5ea3c76245", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vnniintrin.h", "type": "file" }, { - "bom-ref": "81ddd041d442dd68", + "bom-ref": "dc62ef540dc27e7e", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vnnivlintrin.h", "type": "file" }, { - "bom-ref": "f0e797cdce62619f", + "bom-ref": "31db4a33c5d2ccb1", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vp2intersectintrin.h", "type": "file" }, { - "bom-ref": "f18179442f116c94", + "bom-ref": "d47c9b438ecfc5be", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vp2intersectvlintrin.h", "type": "file" }, { - "bom-ref": "a3f11537011e648c", + "bom-ref": "d0e6f30bc1bab2a6", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vpopcntdqintrin.h", "type": "file" }, { - "bom-ref": "7882e3e0593cad74", + "bom-ref": "8788c3c3a8ed07fa", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avx512vpopcntdqvlintrin.h", "type": "file" }, { - "bom-ref": "92955faa39fbfd45", + "bom-ref": "16b6244798f17da7", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avxifmaintrin.h", "type": "file" }, { - "bom-ref": "efe9e92c3e414b28", + "bom-ref": "eab2ef701b2e97de", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avxintrin.h", "type": "file" }, { - "bom-ref": "64d013201d073608", + "bom-ref": "f978b0b57a7e0b52", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avxneconvertintrin.h", "type": "file" }, { - "bom-ref": "31b98f464a7620ba", + "bom-ref": "02a314bac98dfb5c", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avxvnniint16intrin.h", "type": "file" }, { - "bom-ref": "ceeaf6d39cc9d4e9", + "bom-ref": "2dbfd7d50545fdb7", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avxvnniint8intrin.h", "type": "file" }, { - "bom-ref": "7362320eac3f3f22", + "bom-ref": "b238ebb7abfd3fd8", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/avxvnniintrin.h", "type": "file" }, { - "bom-ref": "982123e64b77d464", + "bom-ref": "750edbeeca6c76d6", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/backtrace-supported.h", "type": "file" }, { - "bom-ref": "e5c9875f4a94a694", + "bom-ref": "0cd413e86a65982a", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/backtrace.h", "type": "file" }, { - "bom-ref": "9319ec990ab54468", + "bom-ref": "95c6537c33116a76", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/bmi2intrin.h", "type": "file" }, { - "bom-ref": "1c099a6de74a9d3a", + "bom-ref": "622eb7a84fa4cfdc", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/bmiintrin.h", "type": "file" }, { - "bom-ref": "a3fea2e532a9dd43", + "bom-ref": "21f914d5d1b25b51", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/bmmintrin.h", "type": "file" }, { - "bom-ref": "df42e92c73390e65", + "bom-ref": "d8b11a1c7063cffb", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/cet.h", "type": "file" }, { - "bom-ref": "8d342c9f80aad7f2", + "bom-ref": "eee18eb3c602b1f0", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/cetintrin.h", "type": "file" }, { - "bom-ref": "9ba84d22d3e17a6c", + "bom-ref": "5177a418f3bab466", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/cldemoteintrin.h", "type": "file" }, { - "bom-ref": "cb1a15a7b3bfdd38", + "bom-ref": "6009ce6cdd6a32be", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/clflushoptintrin.h", "type": "file" }, { - "bom-ref": "ae7082fc0c3d5ba2", + "bom-ref": "5f1c2953340f1904", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/clwbintrin.h", "type": "file" }, { - "bom-ref": "8e4a1acf33091c61", + "bom-ref": "8fb329fcc4e6d0ab", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/clzerointrin.h", "type": "file" }, { - "bom-ref": "189ec30e0c61d81d", + "bom-ref": "8a1b05ca0d25a16f", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/cmpccxaddintrin.h", "type": "file" }, { - "bom-ref": "6fb5203ea5d2d205", + "bom-ref": "2e0d7de84d7d815b", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/cpuid.h", "type": "file" }, { - "bom-ref": "bffadb0014352a5b", + "bom-ref": "8d10d9d0f7f7236d", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/cross-stdarg.h", "type": "file" }, { - "bom-ref": "c6681d0b0ce968ca", + "bom-ref": "0a509ef24c2bcd90", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/emmintrin.h", "type": "file" }, { - "bom-ref": "4a0c9816a1209cee", + "bom-ref": "4c3b63387396e384", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/enqcmdintrin.h", "type": "file" }, { - "bom-ref": "24edefecd30abc0f", + "bom-ref": "5410cc721a959a81", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/f16cintrin.h", "type": "file" }, { - "bom-ref": "16db61864c46a8b9", + "bom-ref": "170f6a787cbefe03", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/float.h", "type": "file" }, { - "bom-ref": "ebfdf601059a64cc", + "bom-ref": "07e38dd21337e446", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/fma4intrin.h", "type": "file" }, { - "bom-ref": "557e8f4213e8f65f", + "bom-ref": "58c4e390c75ea521", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/fmaintrin.h", "type": "file" }, { - "bom-ref": "420874ef7380d2be", + "bom-ref": "84ec9f6c4a5b73a4", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/fxsrintrin.h", "type": "file" }, { - "bom-ref": "d19ab40e81e032a1", + "bom-ref": "c1ee5ab518548947", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/gcov.h", "type": "file" }, { - "bom-ref": "1a5c0a690eb65fb7", + "bom-ref": "1f8d0dcdb99b86b5", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/gfniintrin.h", "type": "file" }, { - "bom-ref": "9fab4dacd1132916", + "bom-ref": "67888620bd28f3a4", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/hresetintrin.h", "type": "file" }, { - "bom-ref": "580dc65395503816", + "bom-ref": "9cd972f760775ddc", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/ia32intrin.h", "type": "file" }, { - "bom-ref": "1dcef94c3a197adc", + "bom-ref": "a9c0116a2929cbea", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/immintrin.h", "type": "file" }, { - "bom-ref": "5f9b9f1040445205", + "bom-ref": "604f74006e8cf623", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/iso646.h", "type": "file" }, { - "bom-ref": "015018fdf1078d8e", + "bom-ref": "45d76eb0c49ea9e4", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/keylockerintrin.h", "type": "file" }, { - "bom-ref": "07f96dd6654f7d4d", + "bom-ref": "a5cb26c2bcf0c647", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/limits.h", "type": "file" }, { - "bom-ref": "e9ea9d084be22ee4", + "bom-ref": "bd2b17a3e5282716", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/lwpintrin.h", "type": "file" }, { - "bom-ref": "46a47c79d84d1ee5", + "bom-ref": "250e5f709cbf0ea3", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/lzcntintrin.h", "type": "file" }, { - "bom-ref": "36879191ccda3032", + "bom-ref": "7f8b5f0a5467dba0", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/mm3dnow.h", "type": "file" }, { - "bom-ref": "25082c301a397bef", + "bom-ref": "3e5003411dc1227d", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/mm_malloc.h", "type": "file" }, { - "bom-ref": "1244dad170c9c845", + "bom-ref": "a3e3ef610eefe283", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/mmintrin.h", "type": "file" }, { - "bom-ref": "3ca47965b8ba5407", + "bom-ref": "7eaf981fa5ed9df1", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/movdirintrin.h", "type": "file" }, { - "bom-ref": "24c2e218bc4fb8f2", + "bom-ref": "4a4646914e9464e8", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/mwaitintrin.h", "type": "file" }, { - "bom-ref": "7665155d6111806c", + "bom-ref": "7f24983007afdaaa", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/mwaitxintrin.h", "type": "file" }, { - "bom-ref": "bfe7b872158ddee9", + "bom-ref": "c02305b90c275017", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/nmmintrin.h", "type": "file" }, { - "bom-ref": "908fa70a85a17234", + "bom-ref": "4faf1327de721132", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/omp.h", "type": "file" }, { - "bom-ref": "bc3459b144f063cc", + "bom-ref": "18232a4ed4e06c4a", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/openacc.h", "type": "file" }, { - "bom-ref": "9bd1de2aaf7dc639", + "bom-ref": "513f485925fb8907", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/pconfigintrin.h", "type": "file" }, { - "bom-ref": "b4ac56316d202861", + "bom-ref": "7ecd39a344addd07", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/pkuintrin.h", "type": "file" }, { - "bom-ref": "269a0127e01052a9", + "bom-ref": "b217092a5c569bef", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/pmmintrin.h", "type": "file" }, { - "bom-ref": "a230bfe12b663968", + "bom-ref": "a28881c72cbd0e6e", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/popcntintrin.h", "type": "file" }, { - "bom-ref": "63a4f49691991a94", + "bom-ref": "159d182032019bb6", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/prfchiintrin.h", "type": "file" }, { - "bom-ref": "2deb5d8aa508f1bc", + "bom-ref": "bdd31f0676a301ea", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/prfchwintrin.h", "type": "file" }, { - "bom-ref": "30eb42108b71d9d9", + "bom-ref": "4d3288d1db22b723", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/quadmath.h", "type": "file" }, { - "bom-ref": "258d301d90c1efe5", + "bom-ref": "107ed0e7d77de98b", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/quadmath_weak.h", "type": "file" }, { - "bom-ref": "f6fe8b4862832814", + "bom-ref": "f3e1ea939c19512e", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/raointintrin.h", "type": "file" }, { - "bom-ref": "244bef38013cac92", + "bom-ref": "d0826dd0f487c2e0", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/rdseedintrin.h", "type": "file" }, { - "bom-ref": "1ad781b2b41f9f6e", + "bom-ref": "a0b3a910568d4cc8", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/rtmintrin.h", "type": "file" }, { - "bom-ref": "66f1993afffe876f", + "bom-ref": "e7509e302db0c49d", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/sanitizer/asan_interface.h", "type": "file" }, { - "bom-ref": "aeed9024af91a67c", + "bom-ref": "fdb7d6bdd2a572da", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/sanitizer/common_interface_defs.h", "type": "file" }, { - "bom-ref": "0c8410b81d5ca700", + "bom-ref": "b7157241d0951c4a", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/sanitizer/hwasan_interface.h", "type": "file" }, { - "bom-ref": "cb510cf8df08b987", + "bom-ref": "b4b1dd4935c1f5a5", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/sanitizer/lsan_interface.h", "type": "file" }, { - "bom-ref": "4914daf20f35321a", + "bom-ref": "a7fb8ca83563636c", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/sanitizer/tsan_interface.h", "type": "file" }, { - "bom-ref": "dde9d75f4391bced", + "bom-ref": "da842fd235f45ec3", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/serializeintrin.h", "type": "file" }, { - "bom-ref": "396ab04058db42cb", + "bom-ref": "39e7ff8775a465a9", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/sgxintrin.h", "type": "file" }, { - "bom-ref": "be09343309b72cf1", + "bom-ref": "fc9186062094c5cf", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/sha512intrin.h", "type": "file" }, { - "bom-ref": "f5f12af77ff0c1a2", + "bom-ref": "6cade6b8a72a55d0", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/shaintrin.h", "type": "file" }, { - "bom-ref": "2382ce3a12f458e1", + "bom-ref": "3231f93c567ea583", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/sm3intrin.h", "type": "file" }, { - "bom-ref": "2536cf5a7305cbb6", + "bom-ref": "1fc856fd36b5ff88", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/sm4intrin.h", "type": "file" }, { - "bom-ref": "e6342f84950b11c9", + "bom-ref": "d0a5f1e1615f800b", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/smmintrin.h", "type": "file" }, { - "bom-ref": "6ce1096140d5a117", + "bom-ref": "64819ab94df0fd15", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/stdalign.h", "type": "file" }, { - "bom-ref": "428af529ede475b3", + "bom-ref": "6d542e6abb4a1dad", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h", "type": "file" }, { - "bom-ref": "7a84edaf0ece9906", + "bom-ref": "aa8d9ed516687188", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/stdatomic.h", "type": "file" }, { - "bom-ref": "2b15dcfa4ad15e0d", + "bom-ref": "e7718fae96c533bb", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/stdbool.h", "type": "file" }, { - "bom-ref": "f84611cad1e2918f", + "bom-ref": "e4b926985540d365", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/stdckdint.h", "type": "file" }, { - "bom-ref": "ead1e1cf4c11de7a", + "bom-ref": "3eabdaf479235760", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h", "type": "file" }, { - "bom-ref": "55d39878d8d35344", + "bom-ref": "e5d5abdae897016a", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/stdfix.h", "type": "file" }, { - "bom-ref": "b32f62de9f27eb81", + "bom-ref": "f2beaff276cdbf67", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/stdint-gcc.h", "type": "file" }, { - "bom-ref": "863e5c967a0ecd92", + "bom-ref": "4c20329deff5b850", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/stdint.h", "type": "file" }, { - "bom-ref": "ea4222aaac186269", + "bom-ref": "d4b12889369477a7", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/stdnoreturn.h", "type": "file" }, { - "bom-ref": "27ef426a493f4c81", + "bom-ref": "10509d362f980f4f", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/syslimits.h", "type": "file" }, { - "bom-ref": "163371266244b294", + "bom-ref": "ee4b20ee649acdae", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/tbmintrin.h", "type": "file" }, { - "bom-ref": "de7b602d654fbd4f", + "bom-ref": "218c675a190713e9", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/tmmintrin.h", "type": "file" }, { - "bom-ref": "fb03581ba0b653ff", + "bom-ref": "870c341be06c4805", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/tsxldtrkintrin.h", "type": "file" }, { - "bom-ref": "bf95ccbc1acb74f2", + "bom-ref": "80f51a3fe7605d94", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/uintrintrin.h", "type": "file" }, { - "bom-ref": "43284021c9753005", + "bom-ref": "98be9fa85e8c886b", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/unwind.h", "type": "file" }, { - "bom-ref": "fef39ac98d558604", + "bom-ref": "114e4b3104c69676", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/usermsrintrin.h", "type": "file" }, { - "bom-ref": "6834d9f7230e55d5", + "bom-ref": "1f5aaaf087fa1207", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/vaesintrin.h", "type": "file" }, { - "bom-ref": "387eedcc0d0cb1cf", + "bom-ref": "f562c759f065372d", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/varargs.h", "type": "file" }, { - "bom-ref": "9a04103c5b1e47ab", + "bom-ref": "806cd7b9d3c816cd", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/vpclmulqdqintrin.h", "type": "file" }, { - "bom-ref": "6bb43e735f8157d1", + "bom-ref": "7708141d6750b10f", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/waitpkgintrin.h", "type": "file" }, { - "bom-ref": "2f422a164a747a8c", + "bom-ref": "a701f981ed8a90fe", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/wbnoinvdintrin.h", "type": "file" }, { - "bom-ref": "627fe1bbe857282c", + "bom-ref": "7f51976d90e1403e", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/wmmintrin.h", "type": "file" }, { - "bom-ref": "e68ce7174ac1ac6e", + "bom-ref": "1105f39b4d47d150", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/x86gprintrin.h", "type": "file" }, { - "bom-ref": "96e9c50808b9a177", + "bom-ref": "9abf6fc365db9059", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/x86intrin.h", "type": "file" }, { - "bom-ref": "fc76a8fbd6c752ec", + "bom-ref": "badbf6af6502c15e", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/xmmintrin.h", "type": "file" }, { - "bom-ref": "d0360bde454f18ed", + "bom-ref": "8e59083e104baaf3", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/xopintrin.h", "type": "file" }, { - "bom-ref": "68f5fc8d1c851bb1", + "bom-ref": "da8edb99c57704c3", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/xsavecintrin.h", "type": "file" }, { - "bom-ref": "4f555215f9c4c878", + "bom-ref": "329d372ffbe1e53e", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/xsaveintrin.h", "type": "file" }, { - "bom-ref": "96fbbaf4bed60455", + "bom-ref": "b04e93848644497b", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/xsaveoptintrin.h", "type": "file" }, { - "bom-ref": "116ecccc9391778a", + "bom-ref": "16ccbef0251a341c", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/xsavesintrin.h", "type": "file" }, { - "bom-ref": "6f1af9dc87756d50", + "bom-ref": "95d3bc41773ddaf2", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/include/xtestintrin.h", "type": "file" }, { - "bom-ref": "e05cbea41cffcdf1", + "bom-ref": "1ac31dc8d4388633", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libasan.a", "type": "file" }, { - "bom-ref": "6bb3e0e2d7e9987f", + "bom-ref": "139654720a9c2bb5", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libasan_preinit.o", "type": "file" }, { - "bom-ref": "f7dd71da20a20173", + "bom-ref": "cc3733f06ec52ad9", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libatomic.a", "type": "file" }, { - "bom-ref": "7478e29ccecb2212", + "bom-ref": "5cf579b5948068dc", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libbacktrace.a", "type": "file" }, { - "bom-ref": "84f4f12d43f263ec", + "bom-ref": "6f8285d1bfa68f82", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libgcc.a", "type": "file" }, { - "bom-ref": "c2cd44b53480e54d", + "bom-ref": "86c459a44929320b", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libgcc_eh.a", "type": "file" }, { - "bom-ref": "5e1702c467781700", + "bom-ref": "f7786777e770759a", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libgcc_s.so", "type": "file" }, { - "bom-ref": "ca12ebf8fc160996", + "bom-ref": "3c13d43714f52780", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libgcov.a", "type": "file" }, { - "bom-ref": "0a4971faeca198eb", + "bom-ref": "65aa5f26f185e205", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libgomp.a", "type": "file" }, { - "bom-ref": "76b03a21893d6682", + "bom-ref": "746a4297ab78b450", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libhwasan.a", "type": "file" }, { - "bom-ref": "270da9a047f02f6f", + "bom-ref": "1862306bd5cecc3d", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libitm.a", "type": "file" }, { - "bom-ref": "066aa88e13f595e4", + "bom-ref": "c2ede352e5d1ed92", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/liblsan.a", "type": "file" }, { - "bom-ref": "b706359f9a8fe497", + "bom-ref": "b1aee6a0d9441fd5", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/liblsan_preinit.o", "type": "file" }, { - "bom-ref": "bd3af4875b274152", + "bom-ref": "ca2cad7d91cf3a50", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libquadmath.a", "type": "file" }, { - "bom-ref": "2facf7511c804893", + "bom-ref": "6830347cf715259d", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libssp_nonshared.a", "type": "file" }, { - "bom-ref": "826df84db24917ae", + "bom-ref": "9c96db0c2ea18624", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libstdc++.a", "type": "file" }, { - "bom-ref": "6fd682429cd968cd", + "bom-ref": "7ef3fdba4366d8cb", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libstdc++exp.a", "type": "file" }, { - "bom-ref": "61e5025185dd2313", + "bom-ref": "b80fb6effdd3371d", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libstdc++fs.a", "type": "file" }, { - "bom-ref": "f8f73f8846f07b07", + "bom-ref": "857ebecacf5e2679", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libsupc++.a", "type": "file" }, { - "bom-ref": "7eb99e8bbb31fc27", + "bom-ref": "d2fce97b39170fb1", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libtsan.a", "type": "file" }, { - "bom-ref": "73783c245a84433b", + "bom-ref": "a337b1418ee2b2b9", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libtsan_preinit.o", "type": "file" }, { - "bom-ref": "10ea96f63d0ea530", + "bom-ref": "dbe5d795ea0642f2", "name": "/usr/lib/gcc/x86_64-linux-gnu/14/libubsan.a", "type": "file" }, { - "bom-ref": "0744708b990ab756", + "bom-ref": "ce051bedffec21d7", "name": "/usr/lib/git-core/git", "type": "file" }, { - "bom-ref": "d3565fc0164723d9", + "bom-ref": "334c0a50778e9d20", "name": "/usr/lib/git-core/git-daemon", "type": "file" }, { - "bom-ref": "b85b7dd069a60ad6", + "bom-ref": "1a4d232c32e2ace3", "name": "/usr/lib/git-core/git-difftool--helper", "type": "file" }, { - "bom-ref": "24f0a281e8e56733", + "bom-ref": "ec4f7a1ead638396", "name": "/usr/lib/git-core/git-filter-branch", "type": "file" }, { - "bom-ref": "2a84e50d547239a2", + "bom-ref": "a094fc0a9d720b0b", "name": "/usr/lib/git-core/git-http-backend", "type": "file" }, { - "bom-ref": "bb7424b3625a410c", + "bom-ref": "2eaffd88bd5c0be5", "name": "/usr/lib/git-core/git-http-fetch", "type": "file" }, { - "bom-ref": "68fccba1689fa227", + "bom-ref": "100e1630f46d054e", "name": "/usr/lib/git-core/git-http-push", "type": "file" }, { - "bom-ref": "175c4185011dcd4c", + "bom-ref": "73da4da82da61175", "name": "/usr/lib/git-core/git-imap-send", "type": "file" }, { - "bom-ref": "2a1581b7af450d84", + "bom-ref": "e6b5c4929dbb735d", "name": "/usr/lib/git-core/git-instaweb", "type": "file" }, { - "bom-ref": "3c655087b84af392", + "bom-ref": "d393f56011ee08c7", "name": "/usr/lib/git-core/git-merge-octopus", "type": "file" }, { - "bom-ref": "8f974fc725ec58be", + "bom-ref": "e89f4d099a0be60b", "name": "/usr/lib/git-core/git-merge-one-file", "type": "file" }, { - "bom-ref": "14973f2f0b3a85c0", + "bom-ref": "07d7133a74751a85", "name": "/usr/lib/git-core/git-merge-resolve", "type": "file" }, { - "bom-ref": "dd907eb0a9e8d8dc", + "bom-ref": "c7419dbe53fc70fd", "name": "/usr/lib/git-core/git-mergetool", "type": "file" }, { - "bom-ref": "f4fe366a4e1d4544", + "bom-ref": "d5da1327d944ffad", "name": "/usr/lib/git-core/git-mergetool--lib", "type": "file" }, { - "bom-ref": "e62a2066e1095c4b", + "bom-ref": "255823a64579cade", "name": "/usr/lib/git-core/git-quiltimport", "type": "file" }, { - "bom-ref": "9ae9992a08f1246b", + "bom-ref": "361753adba4b966e", "name": "/usr/lib/git-core/git-remote-http", "type": "file" }, { - "bom-ref": "562e49d548714108", + "bom-ref": "9b6757d577a557e1", "name": "/usr/lib/git-core/git-request-pull", "type": "file" }, { - "bom-ref": "4feb301178d4ab37", + "bom-ref": "dd96bb574b371352", "name": "/usr/lib/git-core/git-sh-i18n", "type": "file" }, { - "bom-ref": "6ba5e854da9b2621", + "bom-ref": "d62b5ee05cc69764", "name": "/usr/lib/git-core/git-sh-i18n--envsubst", "type": "file" }, { - "bom-ref": "c607b32f5566dea9", + "bom-ref": "6c0e793599195f74", "name": "/usr/lib/git-core/git-sh-prompt", "type": "file" }, { - "bom-ref": "7020b8ce191bc759", + "bom-ref": "c85d82328ba803c8", "name": "/usr/lib/git-core/git-sh-setup", "type": "file" }, { - "bom-ref": "0f1a5acfed3d5fa1", + "bom-ref": "51ae86227dfcf914", "name": "/usr/lib/git-core/git-shell", "type": "file" }, { - "bom-ref": "626877f8cd47b7c5", + "bom-ref": "18635ca37d504ba8", "name": "/usr/lib/git-core/git-submodule", "type": "file" }, { - "bom-ref": "7ad15ba915a1b541", + "bom-ref": "1b154d10bb35c194", "name": "/usr/lib/git-core/git-subtree", "type": "file" }, { - "bom-ref": "6590dd9b1a57dc17", + "bom-ref": "e6bade8f1ffa773a", "name": "/usr/lib/git-core/git-web--browse", "type": "file" }, { - "bom-ref": "4fed5e545a427bd6", + "bom-ref": "84e5d7195aefa167", "name": "/usr/lib/git-core/mergetools/araxis", "type": "file" }, { - "bom-ref": "9d6afe606d46a597", + "bom-ref": "c60c2bf2a4c13e9e", "name": "/usr/lib/git-core/mergetools/bc", "type": "file" }, { - "bom-ref": "fe45fa0392944099", + "bom-ref": "d0648bab4a88cb08", "name": "/usr/lib/git-core/mergetools/codecompare", "type": "file" }, { - "bom-ref": "2df417356fed6b17", + "bom-ref": "c5634a9465a8e06e", "name": "/usr/lib/git-core/mergetools/deltawalker", "type": "file" }, { - "bom-ref": "99c0c1ad5aed7dfc", + "bom-ref": "32b8612213efd775", "name": "/usr/lib/git-core/mergetools/diffmerge", "type": "file" }, { - "bom-ref": "65921d99ede2039b", + "bom-ref": "83e3315369fae0ce", "name": "/usr/lib/git-core/mergetools/diffuse", "type": "file" }, { - "bom-ref": "b9866776dc173e57", + "bom-ref": "db463ced87723d6e", "name": "/usr/lib/git-core/mergetools/ecmerge", "type": "file" }, { - "bom-ref": "dfac1a676d4a219c", + "bom-ref": "0bbdeeeed27d31f5", "name": "/usr/lib/git-core/mergetools/emerge", "type": "file" }, { - "bom-ref": "d35c48520ffdd28f", + "bom-ref": "4d446d16d1af0ace", "name": "/usr/lib/git-core/mergetools/examdiff", "type": "file" }, { - "bom-ref": "40bee8841d098927", + "bom-ref": "37e8028865bdacfe", "name": "/usr/lib/git-core/mergetools/guiffy", "type": "file" }, { - "bom-ref": "0c8768771b36b463", + "bom-ref": "9fbc104e8bd320da", "name": "/usr/lib/git-core/mergetools/gvimdiff", "type": "file" }, { - "bom-ref": "8d7179af6ceda1ba", + "bom-ref": "4fe0a032c70c8f77", "name": "/usr/lib/git-core/mergetools/kdiff3", "type": "file" }, { - "bom-ref": "7657913ad392b853", + "bom-ref": "0309a551b893bd52", "name": "/usr/lib/git-core/mergetools/kompare", "type": "file" }, { - "bom-ref": "7375af4e5a6017f9", + "bom-ref": "aafb4a61bd775118", "name": "/usr/lib/git-core/mergetools/meld", "type": "file" }, { - "bom-ref": "41efe1185a8c0295", + "bom-ref": "8347559e5fff9344", "name": "/usr/lib/git-core/mergetools/nvimdiff", "type": "file" }, { - "bom-ref": "c59aa9d004549596", + "bom-ref": "be52428c5da24703", "name": "/usr/lib/git-core/mergetools/opendiff", "type": "file" }, { - "bom-ref": "461013220f7a1a6a", + "bom-ref": "e3e6597f7595c943", "name": "/usr/lib/git-core/mergetools/p4merge", "type": "file" }, { - "bom-ref": "0b60934ed2d81657", + "bom-ref": "e67c925df036a06e", "name": "/usr/lib/git-core/mergetools/smerge", "type": "file" }, { - "bom-ref": "51e148968adebb9d", + "bom-ref": "ca0045ebc1497a10", "name": "/usr/lib/git-core/mergetools/tkdiff", "type": "file" }, { - "bom-ref": "5fb9610c695bff96", + "bom-ref": "c9ad4e96e56abf5b", "name": "/usr/lib/git-core/mergetools/tortoisemerge", "type": "file" }, { - "bom-ref": "11f83753c768b405", + "bom-ref": "1ae700674c987a58", "name": "/usr/lib/git-core/mergetools/vimdiff", "type": "file" }, { - "bom-ref": "5ce803c6d5b4aa7e", + "bom-ref": "f99edaa7c0f1770f", "name": "/usr/lib/git-core/mergetools/winmerge", "type": "file" }, { - "bom-ref": "6c06a673d3964721", + "bom-ref": "343f70b3be5abb0c", "name": "/usr/lib/git-core/mergetools/xxdiff", "type": "file" }, { - "bom-ref": "199905a3f6b276e8", + "bom-ref": "fbf8aadb9e6e549d", "name": "/usr/lib/git-core/scalar", "type": "file" }, { - "bom-ref": "553c2a58b0e5890a", + "bom-ref": "b378926b15f5e889", "name": "/usr/lib/gnupg/dirmngr_ldap", "type": "file" }, { - "bom-ref": "7d236c70144bc9ec", + "bom-ref": "204fe790c2ea01ef", "name": "/usr/lib/gnupg/gpg-check-pattern", "type": "file" }, { - "bom-ref": "044fbae9c11417b5", + "bom-ref": "1bd67f57255a9fa6", "name": "/usr/lib/gnupg/gpg-pair-tool", "type": "file" }, { - "bom-ref": "24383eb478365aec", + "bom-ref": "25fd260ef8ef818b", "name": "/usr/lib/gnupg/gpg-preset-passphrase", "type": "file" }, { - "bom-ref": "3bd3e85f34280d05", + "bom-ref": "28b2efb0d4e13502", "name": "/usr/lib/gnupg/gpg-protect-tool", "type": "file" }, { - "bom-ref": "54245cf7bdd022f3", + "bom-ref": "ea6d8cba79c82bb0", "name": "/usr/lib/gnupg/keyboxd", "type": "file" }, { - "bom-ref": "59b048c7c99065db", + "bom-ref": "fb8bc0638cc39e15", "name": "/usr/lib/init/init-d-script", "type": "file" }, { - "bom-ref": "6ff52082df132d2b", + "bom-ref": "a95e70ea33954879", "name": "/usr/lib/init/vars.sh", "type": "file" }, { - "bom-ref": "528c58798f0c6d71", + "bom-ref": "785a3390ea0e6c1b", "name": "/usr/lib/llvm-18/bin/bugpoint", "type": "file" }, { - "bom-ref": "a1e93763e8e47619", + "bom-ref": "48e054328a7c5ab7", "name": "/usr/lib/llvm-18/bin/clang", "type": "file" }, { - "bom-ref": "b04925820d5629a8", + "bom-ref": "307b36dade79da72", "name": "/usr/lib/llvm-18/bin/dsymutil", "type": "file" }, { - "bom-ref": "0a7d82dd6847b3ff", + "bom-ref": "8540756a464deea9", "name": "/usr/lib/llvm-18/bin/llc", "type": "file" }, { - "bom-ref": "64f802fdb6c7b342", + "bom-ref": "f27f0017457cc064", "name": "/usr/lib/llvm-18/bin/lld", "type": "file" }, { - "bom-ref": "4ff0d4c0a056f864", + "bom-ref": "507d0a56d8ed766a", "name": "/usr/lib/llvm-18/bin/lli", "type": "file" }, { - "bom-ref": "ef183e8078e85414", + "bom-ref": "33d76ed25f4ab44a", "name": "/usr/lib/llvm-18/bin/lli-child-target", "type": "file" }, { - "bom-ref": "a4abccf92995af94", + "bom-ref": "0c341d9cfa4b2d6a", "name": "/usr/lib/llvm-18/bin/llvm-PerfectShuffle", "type": "file" }, { - "bom-ref": "be096fa8159376c6", + "bom-ref": "316fc81f5190131c", "name": "/usr/lib/llvm-18/bin/llvm-ar", "type": "file" }, { - "bom-ref": "ca8c7dc8bb4ef2c6", + "bom-ref": "13e49be83f2067cc", "name": "/usr/lib/llvm-18/bin/llvm-as", "type": "file" }, { - "bom-ref": "b5ba892fb3013acc", + "bom-ref": "c96ef51956912e22", "name": "/usr/lib/llvm-18/bin/llvm-bcanalyzer", "type": "file" }, { - "bom-ref": "2678266673d13c47", + "bom-ref": "c54e8fe2980074b5", "name": "/usr/lib/llvm-18/bin/llvm-c-test", "type": "file" }, { - "bom-ref": "904dac5d154fe345", + "bom-ref": "d15b39965c0f42bb", "name": "/usr/lib/llvm-18/bin/llvm-cat", "type": "file" }, { - "bom-ref": "176029fb6f87116a", + "bom-ref": "5f5ecc1497f41004", "name": "/usr/lib/llvm-18/bin/llvm-cfi-verify", "type": "file" }, { - "bom-ref": "dc75dce11781dede", + "bom-ref": "ec186106c6e563bc", "name": "/usr/lib/llvm-18/bin/llvm-config", "type": "file" }, { - "bom-ref": "47b67509a3d0b677", + "bom-ref": "badda9550d25d061", "name": "/usr/lib/llvm-18/bin/llvm-cov", "type": "file" }, { - "bom-ref": "86abe7b006d2eec8", + "bom-ref": "29460a515831868e", "name": "/usr/lib/llvm-18/bin/llvm-cvtres", "type": "file" }, { - "bom-ref": "223509ed97d677f5", + "bom-ref": "ce0116e81139fe7f", "name": "/usr/lib/llvm-18/bin/llvm-cxxdump", "type": "file" }, { - "bom-ref": "d659e2120c090609", + "bom-ref": "0b5e46a50bf3b9e3", "name": "/usr/lib/llvm-18/bin/llvm-cxxfilt", "type": "file" }, { - "bom-ref": "3f9bb5215ecee63f", + "bom-ref": "ded7c5d17e5f1df9", "name": "/usr/lib/llvm-18/bin/llvm-cxxmap", "type": "file" }, { - "bom-ref": "3fb7710b5e9bb0f6", + "bom-ref": "2a3f84d0ce919f84", "name": "/usr/lib/llvm-18/bin/llvm-debuginfo-analyzer", "type": "file" }, { - "bom-ref": "0df50386bc9125d9", + "bom-ref": "3357335dc63a3cab", "name": "/usr/lib/llvm-18/bin/llvm-debuginfod", "type": "file" }, { - "bom-ref": "26574970969280f1", + "bom-ref": "8a7480047cd7bd47", "name": "/usr/lib/llvm-18/bin/llvm-debuginfod-find", "type": "file" }, { - "bom-ref": "561c3abd27d211a0", + "bom-ref": "3a7bda932d50cf5a", "name": "/usr/lib/llvm-18/bin/llvm-diff", "type": "file" }, { - "bom-ref": "e3c5bdc74661b07a", + "bom-ref": "db56b8c2a8921df4", "name": "/usr/lib/llvm-18/bin/llvm-dis", "type": "file" }, { - "bom-ref": "f966cf1d2a6eb9ef", + "bom-ref": "ccbd4779b71763d5", "name": "/usr/lib/llvm-18/bin/llvm-dwarfdump", "type": "file" }, { - "bom-ref": "225bac82abcab4fa", + "bom-ref": "345d46f7ff55aaa0", "name": "/usr/lib/llvm-18/bin/llvm-dwarfutil", "type": "file" }, { - "bom-ref": "7bc71f8d6ed3a863", + "bom-ref": "4780c3a4169b4511", "name": "/usr/lib/llvm-18/bin/llvm-dwp", "type": "file" }, { - "bom-ref": "21e1a3077ed4765d", + "bom-ref": "7f5bc6c18c032147", "name": "/usr/lib/llvm-18/bin/llvm-exegesis", "type": "file" }, { - "bom-ref": "738281e959ec4983", + "bom-ref": "66da6cd0951f28c1", "name": "/usr/lib/llvm-18/bin/llvm-extract", "type": "file" }, { - "bom-ref": "4f960c3f31589e97", + "bom-ref": "d5cb503492a9d8e1", "name": "/usr/lib/llvm-18/bin/llvm-gsymutil", "type": "file" }, { - "bom-ref": "aefd7489dad3f9d8", + "bom-ref": "0f0e8de920b76326", "name": "/usr/lib/llvm-18/bin/llvm-ifs", "type": "file" }, { - "bom-ref": "0d8f31ccfa9d815c", + "bom-ref": "07cc6609b370e182", "name": "/usr/lib/llvm-18/bin/llvm-jitlink", "type": "file" }, { - "bom-ref": "193e39cd3ff27de9", + "bom-ref": "8cb9164a4c5a7dc7", "name": "/usr/lib/llvm-18/bin/llvm-jitlink-executor", "type": "file" }, { - "bom-ref": "571e383e8ca82f42", + "bom-ref": "72d1ed8b087ab3a0", "name": "/usr/lib/llvm-18/bin/llvm-libtool-darwin", "type": "file" }, { - "bom-ref": "739e05ab153be981", + "bom-ref": "5d929f117c536dcb", "name": "/usr/lib/llvm-18/bin/llvm-link", "type": "file" }, { - "bom-ref": "6a8e4651512f6583", + "bom-ref": "efff51b6acb27fa1", "name": "/usr/lib/llvm-18/bin/llvm-lipo", "type": "file" }, { - "bom-ref": "61254620f5e11a55", + "bom-ref": "8f7dcc04033fcb0b", "name": "/usr/lib/llvm-18/bin/llvm-lto", "type": "file" }, { - "bom-ref": "1a538051cf74bf49", + "bom-ref": "0b9ea09835ff0db7", "name": "/usr/lib/llvm-18/bin/llvm-lto2", "type": "file" }, { - "bom-ref": "81ea3b3e723e7ef7", + "bom-ref": "f176e9f61c415415", "name": "/usr/lib/llvm-18/bin/llvm-mc", "type": "file" }, { - "bom-ref": "5e20c0b867f2dd41", + "bom-ref": "c206e8f4e937f637", "name": "/usr/lib/llvm-18/bin/llvm-mca", "type": "file" }, { - "bom-ref": "3b20ba3b9fe610db", + "bom-ref": "3c6f3c2db972e149", "name": "/usr/lib/llvm-18/bin/llvm-ml", "type": "file" }, { - "bom-ref": "ff8e7cdcfca9d0de", + "bom-ref": "8c030b40603908c4", "name": "/usr/lib/llvm-18/bin/llvm-modextract", "type": "file" }, { - "bom-ref": "6b9610fc4928bd50", + "bom-ref": "9d6ae8e248142cbe", "name": "/usr/lib/llvm-18/bin/llvm-mt", "type": "file" }, { - "bom-ref": "9649517c618d0767", + "bom-ref": "c18b98a0294f2bc1", "name": "/usr/lib/llvm-18/bin/llvm-nm", "type": "file" }, { - "bom-ref": "9df3994c5788c5bb", + "bom-ref": "3eb33f5cdaf95489", "name": "/usr/lib/llvm-18/bin/llvm-objcopy", "type": "file" }, { - "bom-ref": "09c364b583ccdfea", + "bom-ref": "8dbb42a4105b772c", "name": "/usr/lib/llvm-18/bin/llvm-objdump", "type": "file" }, { - "bom-ref": "c0944b69cb8d1217", + "bom-ref": "637a25e8c956cfd9", "name": "/usr/lib/llvm-18/bin/llvm-opt-report", "type": "file" }, { - "bom-ref": "cf8cd64486bc8a5f", + "bom-ref": "a65b40593cff1115", "name": "/usr/lib/llvm-18/bin/llvm-pdbutil", "type": "file" }, { - "bom-ref": "5471b77268dbebdf", + "bom-ref": "186c85b0492d8f5d", "name": "/usr/lib/llvm-18/bin/llvm-profdata", "type": "file" }, { - "bom-ref": "a69e2154512a7d67", + "bom-ref": "852fd0c472955c61", "name": "/usr/lib/llvm-18/bin/llvm-profgen", "type": "file" }, { - "bom-ref": "e15443b72b916cad", + "bom-ref": "4efdead9bb626593", "name": "/usr/lib/llvm-18/bin/llvm-rc", "type": "file" }, { - "bom-ref": "79f00305d3cd911e", + "bom-ref": "154b6fcd9880553c", "name": "/usr/lib/llvm-18/bin/llvm-readobj", "type": "file" }, { - "bom-ref": "e28708e4a0c01777", + "bom-ref": "f5ae4c5ee738b915", "name": "/usr/lib/llvm-18/bin/llvm-readtapi", "type": "file" }, { - "bom-ref": "29e1416b548a42e4", + "bom-ref": "fec3e33644c3ffb2", "name": "/usr/lib/llvm-18/bin/llvm-reduce", "type": "file" }, { - "bom-ref": "fe633d83c13a56f4", + "bom-ref": "c1c56951bddb6542", "name": "/usr/lib/llvm-18/bin/llvm-remarkutil", "type": "file" }, { - "bom-ref": "c9c7bccff3bb152e", + "bom-ref": "90938f70185c7d00", "name": "/usr/lib/llvm-18/bin/llvm-rtdyld", "type": "file" }, { - "bom-ref": "e4d039662a90b97c", + "bom-ref": "359b9e765d9c876e", "name": "/usr/lib/llvm-18/bin/llvm-sim", "type": "file" }, { - "bom-ref": "364455e7dd00ca04", + "bom-ref": "268800abf11fe7be", "name": "/usr/lib/llvm-18/bin/llvm-size", "type": "file" }, { - "bom-ref": "4e81787fa46edcd5", + "bom-ref": "0d594efb7a8eee63", "name": "/usr/lib/llvm-18/bin/llvm-split", "type": "file" }, { - "bom-ref": "65805cdf3f937c72", + "bom-ref": "5aabb249b46445c0", "name": "/usr/lib/llvm-18/bin/llvm-stress", "type": "file" }, { - "bom-ref": "faa7f6743503761c", + "bom-ref": "fdf261c3f56176ba", "name": "/usr/lib/llvm-18/bin/llvm-strings", "type": "file" }, { - "bom-ref": "5c7a195957cc877a", + "bom-ref": "1a7734e5d9e4378c", "name": "/usr/lib/llvm-18/bin/llvm-symbolizer", "type": "file" }, { - "bom-ref": "1dda705f0c437738", + "bom-ref": "8cc5b1d18b994fa6", "name": "/usr/lib/llvm-18/bin/llvm-tblgen", "type": "file" }, { - "bom-ref": "659584a333dd70d1", + "bom-ref": "924f42fae81504f7", "name": "/usr/lib/llvm-18/bin/llvm-tli-checker", "type": "file" }, { - "bom-ref": "7ca14a3ba22bcd6c", + "bom-ref": "270a8ca70d00a80e", "name": "/usr/lib/llvm-18/bin/llvm-undname", "type": "file" }, { - "bom-ref": "e34a5890c5828321", + "bom-ref": "589fe95a66c61053", "name": "/usr/lib/llvm-18/bin/llvm-xray", "type": "file" }, { - "bom-ref": "4788365b1f68fc99", + "bom-ref": "13638d9f55cbb797", "name": "/usr/lib/llvm-18/bin/obj2yaml", "type": "file" }, { - "bom-ref": "f6c35a7024843d38", + "bom-ref": "af036bf744ee7eae", "name": "/usr/lib/llvm-18/bin/opt", "type": "file" }, { - "bom-ref": "61c7755afd3035f2", + "bom-ref": "b1d01559e27adf6c", "name": "/usr/lib/llvm-18/bin/sanstats", "type": "file" }, { - "bom-ref": "5eacb56e76f8ff2f", + "bom-ref": "b66574d24c1fa869", "name": "/usr/lib/llvm-18/bin/verify-uselistorder", "type": "file" }, { - "bom-ref": "c8750b4be94bce18", + "bom-ref": "8267f266bd83435e", "name": "/usr/lib/llvm-18/bin/yaml2obj", "type": "file" }, { - "bom-ref": "fb495135f62a89fd", + "bom-ref": "11c366be76b97853", "name": "/usr/lib/llvm-18/lib/LLVMPolly.so", "type": "file" }, { - "bom-ref": "32bc401a8f390455", + "bom-ref": "f2052d88b509bfb3", "name": "/usr/lib/llvm-18/lib/LLVMgold.so", "type": "file" }, { - "bom-ref": "868c156270dddc4c", + "bom-ref": "d39296024ba0c976", "name": "/usr/lib/llvm-18/lib/clang/18/README.txt", "type": "file" }, { - "bom-ref": "570b9be6c9370994", + "bom-ref": "33bd083f10c8c126", "name": "/usr/lib/llvm-18/lib/clang/18/include/ISO_Fortran_binding.h", "type": "file" }, { - "bom-ref": "19d9681f49252d1a", + "bom-ref": "8cf29ff99e7b93f8", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_cuda_builtin_vars.h", "type": "file" }, { - "bom-ref": "922e36c30f39147c", + "bom-ref": "7eac9ef67d13365a", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_cuda_cmath.h", "type": "file" }, { - "bom-ref": "a9db2b2d726aa7d1", + "bom-ref": "bdf51a1bebf5b28b", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_cuda_complex_builtins.h", "type": "file" }, { - "bom-ref": "11fe942ddcd905de", + "bom-ref": "1bca3450885c7d60", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_cuda_device_functions.h", "type": "file" }, { - "bom-ref": "1c1805298c79fb07", + "bom-ref": "2713546a27ce06f5", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_cuda_intrinsics.h", "type": "file" }, { - "bom-ref": "2635160a6df1a499", + "bom-ref": "fb5093137dd762ab", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_cuda_libdevice_declares.h", "type": "file" }, { - "bom-ref": "a81acc8b06adf9dc", + "bom-ref": "767c4a3c759bd30e", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_cuda_math.h", "type": "file" }, { - "bom-ref": "2abf55883bbf1a35", + "bom-ref": "a9e6423e6136f5ff", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_cuda_math_forward_declares.h", "type": "file" }, { - "bom-ref": "73f7063d816149c0", + "bom-ref": "4682f75932bf4856", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_cuda_runtime_wrapper.h", "type": "file" }, { - "bom-ref": "fc6e4c85e4adb9a0", + "bom-ref": "1a6012bbdfb6f756", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_cuda_texture_intrinsics.h", "type": "file" }, { - "bom-ref": "6f81d09808c70e7d", + "bom-ref": "a93f0ee5d51f4a1f", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_hip_cmath.h", "type": "file" }, { - "bom-ref": "af1461ef366b9ab5", + "bom-ref": "7c29ea0572e13043", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_hip_libdevice_declares.h", "type": "file" }, { - "bom-ref": "70d053e2e7745c06", + "bom-ref": "a79f0c41cf5e8bc0", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_hip_math.h", "type": "file" }, { - "bom-ref": "9dce26f1ba96a0cf", + "bom-ref": "57a34afa73b308f9", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_hip_runtime_wrapper.h", "type": "file" }, { - "bom-ref": "55b545abea388b08", + "bom-ref": "2826bc72fd23d7d6", "name": "/usr/lib/llvm-18/lib/clang/18/include/__clang_hip_stdlib.h", "type": "file" }, { - "bom-ref": "a10216500211521c", + "bom-ref": "7b5bda6ad6dc691a", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stdarg___gnuc_va_list.h", "type": "file" }, { - "bom-ref": "4d77384a9525726e", + "bom-ref": "824ca1117c2f7688", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stdarg___va_copy.h", "type": "file" }, { - "bom-ref": "976ca3e5862f4e47", + "bom-ref": "fb0edd214549370d", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stdarg_va_arg.h", "type": "file" }, { - "bom-ref": "aa43bdbb70ef9b8d", + "bom-ref": "e900874dc0419a47", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stdarg_va_copy.h", "type": "file" }, { - "bom-ref": "7cb115eeff6c7565", + "bom-ref": "fed3af2103ee0c4b", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stdarg_va_list.h", "type": "file" }, { - "bom-ref": "bcfd2aa272ec00f9", + "bom-ref": "3e35011fe33be0b7", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stddef_max_align_t.h", "type": "file" }, { - "bom-ref": "299a40e57c56fc4a", + "bom-ref": "d103265c5529049c", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stddef_null.h", "type": "file" }, { - "bom-ref": "2d00fc321225b9d6", + "bom-ref": "6a1b438520a59268", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stddef_nullptr_t.h", "type": "file" }, { - "bom-ref": "a3a3bcbd2ed4bce5", + "bom-ref": "94e5c36b02da29bf", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stddef_offsetof.h", "type": "file" }, { - "bom-ref": "669783ff8395f2c5", + "bom-ref": "aff5b07eb219ae1b", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stddef_ptrdiff_t.h", "type": "file" }, { - "bom-ref": "c75f108773fac357", + "bom-ref": "50dffd0d1384721d", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stddef_rsize_t.h", "type": "file" }, { - "bom-ref": "f7c72d65f6a1c594", + "bom-ref": "efeeee7c725a08aa", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stddef_size_t.h", "type": "file" }, { - "bom-ref": "71cc06f8c91c5638", + "bom-ref": "ca436a3936565ef2", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stddef_unreachable.h", "type": "file" }, { - "bom-ref": "42f2563fd443fbe1", + "bom-ref": "86876fa6ef733437", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stddef_wchar_t.h", "type": "file" }, { - "bom-ref": "4c405660a75a8a78", + "bom-ref": "e544ed7bb7b6fdfa", "name": "/usr/lib/llvm-18/lib/clang/18/include/__stddef_wint_t.h", "type": "file" }, { - "bom-ref": "f0e3761884143f00", + "bom-ref": "ec3306d35da5a592", "name": "/usr/lib/llvm-18/lib/clang/18/include/__wmmintrin_aes.h", "type": "file" }, { - "bom-ref": "a3c75d6cfba92012", + "bom-ref": "5cd7afad44c48800", "name": "/usr/lib/llvm-18/lib/clang/18/include/__wmmintrin_pclmul.h", "type": "file" }, { - "bom-ref": "42155aefc91de294", + "bom-ref": "cf3c60e7fb37cc12", "name": "/usr/lib/llvm-18/lib/clang/18/include/adcintrin.h", "type": "file" }, { - "bom-ref": "85201b2738fff3e0", + "bom-ref": "49443f823dc3ab5e", "name": "/usr/lib/llvm-18/lib/clang/18/include/adxintrin.h", "type": "file" }, { - "bom-ref": "ec14a8ad6f345997", + "bom-ref": "3d5a441c7030ed99", "name": "/usr/lib/llvm-18/lib/clang/18/include/altivec.h", "type": "file" }, { - "bom-ref": "e10cabcb66c2f8fd", + "bom-ref": "19d411da9a4ee14f", "name": "/usr/lib/llvm-18/lib/clang/18/include/ammintrin.h", "type": "file" }, { - "bom-ref": "91cb9e1596aac7e1", + "bom-ref": "bdb8b27be5f746a7", "name": "/usr/lib/llvm-18/lib/clang/18/include/amxcomplexintrin.h", "type": "file" }, { - "bom-ref": "98b9cb5686de2faa", + "bom-ref": "036757b59c4f9214", "name": "/usr/lib/llvm-18/lib/clang/18/include/amxfp16intrin.h", "type": "file" }, { - "bom-ref": "724fabd78dc9e27d", + "bom-ref": "d5d1fa272b67faef", "name": "/usr/lib/llvm-18/lib/clang/18/include/amxintrin.h", "type": "file" }, { - "bom-ref": "ac606ea2c1bff26d", + "bom-ref": "f5b1942e7c7a5037", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm64intr.h", "type": "file" }, { - "bom-ref": "33a45f2f1c9928fe", + "bom-ref": "9644a1a6e338f408", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_acle.h", "type": "file" }, { - "bom-ref": "f1f5cf76d8ae79d6", + "bom-ref": "ae55f4f361d26bdc", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_bf16.h", "type": "file" }, { - "bom-ref": "4891aaa509807348", + "bom-ref": "33b3eabdfaf20e46", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_cde.h", "type": "file" }, { - "bom-ref": "665403a3b2fe6233", + "bom-ref": "5e15d08ef3583fb5", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_cmse.h", "type": "file" }, { - "bom-ref": "67dede46d30749b3", + "bom-ref": "08fe5009030bfac9", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_fp16.h", "type": "file" }, { - "bom-ref": "0d34762b94523302", + "bom-ref": "737ba459d4c34178", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_mve.h", "type": "file" }, { - "bom-ref": "0ee4c2c0d3030106", + "bom-ref": "46d78f3a000ff77c", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_neon.h", "type": "file" }, { - "bom-ref": "55b82861cf37e898", + "bom-ref": "7148d66afe3171ba", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_neon_sve_bridge.h", "type": "file" }, { - "bom-ref": "a3edb8c0fed7fef0", + "bom-ref": "e7ea8d69d633e2da", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_sme.h", "type": "file" }, { - "bom-ref": "72c987ffea7a41a9", + "bom-ref": "60e40a0aa3e12aa7", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_sve.h", "type": "file" }, { - "bom-ref": "3c16ed9b68fe0ca2", + "bom-ref": "15a027f839e4476c", "name": "/usr/lib/llvm-18/lib/clang/18/include/arm_vector_types.h", "type": "file" }, { - "bom-ref": "430c6f73cbd6877c", + "bom-ref": "cb5103fc04c56462", "name": "/usr/lib/llvm-18/lib/clang/18/include/armintr.h", "type": "file" }, { - "bom-ref": "495012dadd4f5f41", + "bom-ref": "941dedd40e2493e7", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx2intrin.h", "type": "file" }, { - "bom-ref": "36fc429d3a71e45b", + "bom-ref": "6018aefcdf3415c9", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512bf16intrin.h", "type": "file" }, { - "bom-ref": "fb0ead90eefbed7c", + "bom-ref": "d9c8f4b31f5320de", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512bitalgintrin.h", "type": "file" }, { - "bom-ref": "ac9542d8fc0d5771", + "bom-ref": "56dcdf3d5197a60f", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512bwintrin.h", "type": "file" }, { - "bom-ref": "83c5fae698b158d9", + "bom-ref": "8480e2f4742d91cb", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512cdintrin.h", "type": "file" }, { - "bom-ref": "30ba9eb3dcef5dbc", + "bom-ref": "7e57a09f1c2d2ea6", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512dqintrin.h", "type": "file" }, { - "bom-ref": "0ceb365e75583eb6", + "bom-ref": "ecc61bc690ec0ba4", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512erintrin.h", "type": "file" }, { - "bom-ref": "9717f46fe238e78e", + "bom-ref": "ec9734adb5950148", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512fintrin.h", "type": "file" }, { - "bom-ref": "d6e342fd3445026a", + "bom-ref": "b73cdbd2395ae400", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512fp16intrin.h", "type": "file" }, { - "bom-ref": "d2ec526a576565a8", + "bom-ref": "d5401e2d54d7977a", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512ifmaintrin.h", "type": "file" }, { - "bom-ref": "32aaf0d194d08f36", + "bom-ref": "faad7e869e6bf1c0", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512ifmavlintrin.h", "type": "file" }, { - "bom-ref": "9e3b559af5266c3b", + "bom-ref": "9bf9573279b9627d", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512pfintrin.h", "type": "file" }, { - "bom-ref": "0d686b0f1e6fa903", + "bom-ref": "164362c1c52251dd", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vbmi2intrin.h", "type": "file" }, { - "bom-ref": "f0300a06c1aa9537", + "bom-ref": "aca48c1fc7844ca1", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vbmiintrin.h", "type": "file" }, { - "bom-ref": "df046df50f31d73d", + "bom-ref": "1704c3d25c12362f", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vbmivlintrin.h", "type": "file" }, { - "bom-ref": "a22a09e828f23b61", + "bom-ref": "b25caab7029955e7", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vlbf16intrin.h", "type": "file" }, { - "bom-ref": "5498af214982ef70", + "bom-ref": "68e58ab04e66ff6e", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vlbitalgintrin.h", "type": "file" }, { - "bom-ref": "16195b85f8250f2b", + "bom-ref": "da25733775dc5561", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vlbwintrin.h", "type": "file" }, { - "bom-ref": "b331e1987db2705b", + "bom-ref": "f985b078c5e7e3a9", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vlcdintrin.h", "type": "file" }, { - "bom-ref": "6a986c6fa5be0175", + "bom-ref": "7081545ded723e83", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vldqintrin.h", "type": "file" }, { - "bom-ref": "9b99700f184ed306", + "bom-ref": "3967cb43412a9a80", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vlfp16intrin.h", "type": "file" }, { - "bom-ref": "983319cb7469c0a7", + "bom-ref": "f959e75bcca92ae1", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vlintrin.h", "type": "file" }, { - "bom-ref": "8b14ac9038af3408", + "bom-ref": "e064ab4ced818bb2", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vlvbmi2intrin.h", "type": "file" }, { - "bom-ref": "94024c24a72d4c12", + "bom-ref": "251cef492f8cb0fc", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vlvnniintrin.h", "type": "file" }, { - "bom-ref": "82602861dd65a3a0", + "bom-ref": "8260b43804c7d006", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vlvp2intersectintrin.h", "type": "file" }, { - "bom-ref": "089bc280301f3fea", + "bom-ref": "a6b0372e2adad6e4", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vnniintrin.h", "type": "file" }, { - "bom-ref": "cae74e58b0018f17", + "bom-ref": "ac592f36e84647f9", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vp2intersectintrin.h", "type": "file" }, { - "bom-ref": "0f6327767d680154", + "bom-ref": "6fe71f0b4b0dadaa", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vpopcntdqintrin.h", "type": "file" }, { - "bom-ref": "69fbde8b7a35374d", + "bom-ref": "882a1aa93c9147f7", "name": "/usr/lib/llvm-18/lib/clang/18/include/avx512vpopcntdqvlintrin.h", "type": "file" }, { - "bom-ref": "274d801601ba0364", + "bom-ref": "291ec6bf50041216", "name": "/usr/lib/llvm-18/lib/clang/18/include/avxifmaintrin.h", "type": "file" }, { - "bom-ref": "12fbcc02f93c5739", + "bom-ref": "76ba272062d5ac5b", "name": "/usr/lib/llvm-18/lib/clang/18/include/avxintrin.h", "type": "file" }, { - "bom-ref": "756d6e1b61a24a93", + "bom-ref": "43532b8fbce9d999", "name": "/usr/lib/llvm-18/lib/clang/18/include/avxneconvertintrin.h", "type": "file" }, { - "bom-ref": "f7047c536827ab21", + "bom-ref": "1eb0a6796bd3d6a3", "name": "/usr/lib/llvm-18/lib/clang/18/include/avxvnniint16intrin.h", "type": "file" }, { - "bom-ref": "6ea87739f35eb841", + "bom-ref": "224afced7540468b", "name": "/usr/lib/llvm-18/lib/clang/18/include/avxvnniint8intrin.h", "type": "file" }, { - "bom-ref": "de413f8dd53d994f", + "bom-ref": "3cea289659db729d", "name": "/usr/lib/llvm-18/lib/clang/18/include/avxvnniintrin.h", "type": "file" }, { - "bom-ref": "3aec8e4fef697f45", + "bom-ref": "60729deca795a6ab", "name": "/usr/lib/llvm-18/lib/clang/18/include/bmi2intrin.h", "type": "file" }, { - "bom-ref": "9afa3fa5576cf6ab", + "bom-ref": "85b2d815457c60a5", "name": "/usr/lib/llvm-18/lib/clang/18/include/bmiintrin.h", "type": "file" }, { - "bom-ref": "76b08b28d184b2de", + "bom-ref": "4f46d8eaba4e9118", "name": "/usr/lib/llvm-18/lib/clang/18/include/builtins.h", "type": "file" }, { - "bom-ref": "8084f944bf48d9ba", + "bom-ref": "688f74c0220af68c", "name": "/usr/lib/llvm-18/lib/clang/18/include/cet.h", "type": "file" }, { - "bom-ref": "d5d7ec22cb6d6790", + "bom-ref": "462f4766ec8106b2", "name": "/usr/lib/llvm-18/lib/clang/18/include/cetintrin.h", "type": "file" }, { - "bom-ref": "0a2496065c4c2de3", + "bom-ref": "60d19c8b948cf1c1", "name": "/usr/lib/llvm-18/lib/clang/18/include/cldemoteintrin.h", "type": "file" }, { - "bom-ref": "90d28a332f71d3c7", + "bom-ref": "4605609b1246c751", "name": "/usr/lib/llvm-18/lib/clang/18/include/clflushoptintrin.h", "type": "file" }, { - "bom-ref": "61708155e50d36f2", + "bom-ref": "c4884d29c7d5fc2c", "name": "/usr/lib/llvm-18/lib/clang/18/include/clwbintrin.h", "type": "file" }, { - "bom-ref": "18eb21186ab02486", + "bom-ref": "3c663a59cca246b4", "name": "/usr/lib/llvm-18/lib/clang/18/include/clzerointrin.h", "type": "file" }, { - "bom-ref": "8625f627c7f6893a", + "bom-ref": "7bc48fcc97e4f674", "name": "/usr/lib/llvm-18/lib/clang/18/include/cmpccxaddintrin.h", "type": "file" }, { - "bom-ref": "e409ca0b127868f8", + "bom-ref": "68e44dcc992fa5a2", "name": "/usr/lib/llvm-18/lib/clang/18/include/cpuid.h", "type": "file" }, { - "bom-ref": "6f15bafa963e3123", + "bom-ref": "c67bb1688e67ed39", "name": "/usr/lib/llvm-18/lib/clang/18/include/crc32intrin.h", "type": "file" }, { - "bom-ref": "8eb722df910ae1f6", + "bom-ref": "edcb0924d7a83be4", "name": "/usr/lib/llvm-18/lib/clang/18/include/cuda_wrappers/algorithm", "type": "file" }, { - "bom-ref": "dbeb11175c1d8e0c", + "bom-ref": "13c1813d262a478a", "name": "/usr/lib/llvm-18/lib/clang/18/include/cuda_wrappers/bits/basic_string.h", "type": "file" }, { - "bom-ref": "30e0a5189729d7b2", + "bom-ref": "3e99aa132c877d60", "name": "/usr/lib/llvm-18/lib/clang/18/include/cuda_wrappers/bits/basic_string.tcc", "type": "file" }, { - "bom-ref": "e78e3180b6208270", + "bom-ref": "c2df369d324fffca", "name": "/usr/lib/llvm-18/lib/clang/18/include/cuda_wrappers/bits/shared_ptr_base.h", "type": "file" }, { - "bom-ref": "7314e4f57592b8e8", + "bom-ref": "f84bd3e80236585a", "name": "/usr/lib/llvm-18/lib/clang/18/include/cuda_wrappers/cmath", "type": "file" }, { - "bom-ref": "24a6a8a852a38756", + "bom-ref": "c57fddc5fe29ba24", "name": "/usr/lib/llvm-18/lib/clang/18/include/cuda_wrappers/complex", "type": "file" }, { - "bom-ref": "6d38c223b36b6f59", + "bom-ref": "fd197b62d2cb8627", "name": "/usr/lib/llvm-18/lib/clang/18/include/cuda_wrappers/new", "type": "file" }, { - "bom-ref": "08ad30134957b625", + "bom-ref": "cbb84c6d2f1b525b", "name": "/usr/lib/llvm-18/lib/clang/18/include/emmintrin.h", "type": "file" }, { - "bom-ref": "212d34dab8799786", + "bom-ref": "6071bd6fcb626af8", "name": "/usr/lib/llvm-18/lib/clang/18/include/enqcmdintrin.h", "type": "file" }, { - "bom-ref": "4b2e69823c0e9982", + "bom-ref": "6da2b7938bfb6790", "name": "/usr/lib/llvm-18/lib/clang/18/include/f16cintrin.h", "type": "file" }, { - "bom-ref": "65d625d0aab80792", + "bom-ref": "19caa10aa20f1104", "name": "/usr/lib/llvm-18/lib/clang/18/include/float.h", "type": "file" }, { - "bom-ref": "8558f0370314be7b", + "bom-ref": "923903ed5ea20fbd", "name": "/usr/lib/llvm-18/lib/clang/18/include/fma4intrin.h", "type": "file" }, { - "bom-ref": "d1fbc0f2df328fcc", + "bom-ref": "da55fe26edc7b9ea", "name": "/usr/lib/llvm-18/lib/clang/18/include/fmaintrin.h", "type": "file" }, { - "bom-ref": "40273ae3ba1b9463", + "bom-ref": "287a3fcf7d2e6d11", "name": "/usr/lib/llvm-18/lib/clang/18/include/fuzzer/FuzzedDataProvider.h", "type": "file" }, { - "bom-ref": "0e092775b1f8b99a", + "bom-ref": "def19c762cbf2fe8", "name": "/usr/lib/llvm-18/lib/clang/18/include/fxsrintrin.h", "type": "file" }, { - "bom-ref": "6986cab100474d76", + "bom-ref": "9fcbe8861745108c", "name": "/usr/lib/llvm-18/lib/clang/18/include/gfniintrin.h", "type": "file" }, { - "bom-ref": "797679ba32ca1fc6", + "bom-ref": "8e042b817fd59f2c", "name": "/usr/lib/llvm-18/lib/clang/18/include/hexagon_circ_brev_intrinsics.h", "type": "file" }, { - "bom-ref": "b323a7bcbc110fd8", + "bom-ref": "5e305e77f1d8ba92", "name": "/usr/lib/llvm-18/lib/clang/18/include/hexagon_protos.h", "type": "file" }, { - "bom-ref": "ee1fb4d870b3162c", + "bom-ref": "d34c7a2c954a2fca", "name": "/usr/lib/llvm-18/lib/clang/18/include/hexagon_types.h", "type": "file" }, { - "bom-ref": "b8f20b29b6c662cc", + "bom-ref": "36ceae9bdc2087da", "name": "/usr/lib/llvm-18/lib/clang/18/include/hresetintrin.h", "type": "file" }, { - "bom-ref": "e26b6028afdfecd7", + "bom-ref": "89bcf35408a9b829", "name": "/usr/lib/llvm-18/lib/clang/18/include/htmintrin.h", "type": "file" }, { - "bom-ref": "09f4a10b5d1f4e42", + "bom-ref": "244a4bc03c49e328", "name": "/usr/lib/llvm-18/lib/clang/18/include/htmxlintrin.h", "type": "file" }, { - "bom-ref": "faad50f0cc257ebe", + "bom-ref": "4f9509573d9ed2fc", "name": "/usr/lib/llvm-18/lib/clang/18/include/hvx_hexagon_protos.h", "type": "file" }, { - "bom-ref": "8520993329455006", + "bom-ref": "c3eb37e2538af9e8", "name": "/usr/lib/llvm-18/lib/clang/18/include/ia32intrin.h", "type": "file" }, { - "bom-ref": "85a3e3cab2e5a20c", + "bom-ref": "b02bd0c38777fd86", "name": "/usr/lib/llvm-18/lib/clang/18/include/immintrin.h", "type": "file" }, { - "bom-ref": "4424e51416cedffc", + "bom-ref": "e1910b1d249b13fa", "name": "/usr/lib/llvm-18/lib/clang/18/include/intrin.h", "type": "file" }, { - "bom-ref": "b7c73190b7ed08e5", + "bom-ref": "14ee0b4bca4a3a7f", "name": "/usr/lib/llvm-18/lib/clang/18/include/inttypes.h", "type": "file" }, { - "bom-ref": "5ac67410ffd0a6ac", + "bom-ref": "7067e67f69d784e6", "name": "/usr/lib/llvm-18/lib/clang/18/include/invpcidintrin.h", "type": "file" }, { - "bom-ref": "a2e7f83e41b341ad", + "bom-ref": "51c309cfd3bb017f", "name": "/usr/lib/llvm-18/lib/clang/18/include/iso646.h", "type": "file" }, { - "bom-ref": "8f4546e04bcb71d0", + "bom-ref": "3f33fb69a141839e", "name": "/usr/lib/llvm-18/lib/clang/18/include/keylockerintrin.h", "type": "file" }, { - "bom-ref": "1f409c67fe2bb374", + "bom-ref": "53130d50970a3732", "name": "/usr/lib/llvm-18/lib/clang/18/include/larchintrin.h", "type": "file" }, { - "bom-ref": "553fc163b8220ed1", + "bom-ref": "c50148fdf700d03f", "name": "/usr/lib/llvm-18/lib/clang/18/include/lasxintrin.h", "type": "file" }, { - "bom-ref": "8963cb8c1493b5d2", + "bom-ref": "3e36353c8a3e00c0", "name": "/usr/lib/llvm-18/lib/clang/18/include/limits.h", "type": "file" }, { - "bom-ref": "55f5e1f401b1aeb2", + "bom-ref": "c3b063e6bd8f5c6c", "name": "/usr/lib/llvm-18/lib/clang/18/include/llvm_libc_wrappers/assert.h", "type": "file" }, { - "bom-ref": "89c91d0bb93f9a81", + "bom-ref": "d564f8508b71200f", "name": "/usr/lib/llvm-18/lib/clang/18/include/llvm_libc_wrappers/ctype.h", "type": "file" }, { - "bom-ref": "3a3e853037cd4f04", + "bom-ref": "c41e644f80aaef8e", "name": "/usr/lib/llvm-18/lib/clang/18/include/llvm_libc_wrappers/inttypes.h", "type": "file" }, { - "bom-ref": "5821b14bdf928082", + "bom-ref": "87f1dd72d2dcd1b8", "name": "/usr/lib/llvm-18/lib/clang/18/include/llvm_libc_wrappers/stdio.h", "type": "file" }, { - "bom-ref": "5a317d386edab926", + "bom-ref": "da8e95e378b100d8", "name": "/usr/lib/llvm-18/lib/clang/18/include/llvm_libc_wrappers/stdlib.h", "type": "file" }, { - "bom-ref": "01268f109cdbf789", + "bom-ref": "d9605b92cd75db97", "name": "/usr/lib/llvm-18/lib/clang/18/include/llvm_libc_wrappers/string.h", "type": "file" }, { - "bom-ref": "6cbb28368bbde0f8", + "bom-ref": "fbbae116928232ca", "name": "/usr/lib/llvm-18/lib/clang/18/include/llvm_libc_wrappers/time.h", "type": "file" }, { - "bom-ref": "adc214ca142b0371", + "bom-ref": "4f679ba04a55e493", "name": "/usr/lib/llvm-18/lib/clang/18/include/lsxintrin.h", "type": "file" }, { - "bom-ref": "04fac44982d08b09", + "bom-ref": "c134babf2a210cbf", "name": "/usr/lib/llvm-18/lib/clang/18/include/lwpintrin.h", "type": "file" }, { - "bom-ref": "ecc40933ff5f7841", + "bom-ref": "ab34f9523360251b", "name": "/usr/lib/llvm-18/lib/clang/18/include/lzcntintrin.h", "type": "file" }, { - "bom-ref": "62fe51db7dcbbfbb", + "bom-ref": "3d1dab85eb65c279", "name": "/usr/lib/llvm-18/lib/clang/18/include/mm3dnow.h", "type": "file" }, { - "bom-ref": "5a5528def267f905", + "bom-ref": "8eef63cc93edcebb", "name": "/usr/lib/llvm-18/lib/clang/18/include/mm_malloc.h", "type": "file" }, { - "bom-ref": "1153a49988d3954f", + "bom-ref": "204f1d7659625429", "name": "/usr/lib/llvm-18/lib/clang/18/include/mmintrin.h", "type": "file" }, { - "bom-ref": "4759ac24c8d78391", + "bom-ref": "348debd2f700df0f", "name": "/usr/lib/llvm-18/lib/clang/18/include/module.modulemap", "type": "file" }, { - "bom-ref": "0bf3837317a6f3c5", + "bom-ref": "080a0dec5961aad7", "name": "/usr/lib/llvm-18/lib/clang/18/include/movdirintrin.h", "type": "file" }, { - "bom-ref": "4fc1d1cf66697517", + "bom-ref": "8479b745745b1e39", "name": "/usr/lib/llvm-18/lib/clang/18/include/msa.h", "type": "file" }, { - "bom-ref": "df86e4f64d7a5049", + "bom-ref": "a75cef7291d0d1cb", "name": "/usr/lib/llvm-18/lib/clang/18/include/mwaitxintrin.h", "type": "file" }, { - "bom-ref": "738e1e6dc6a0e641", + "bom-ref": "69aa04663b9e4e5b", "name": "/usr/lib/llvm-18/lib/clang/18/include/nmmintrin.h", "type": "file" }, { - "bom-ref": "052651c0d03ec478", + "bom-ref": "702a3d8d85940e56", "name": "/usr/lib/llvm-18/lib/clang/18/include/opencl-c-base.h", "type": "file" }, { - "bom-ref": "25ddf23cffbc804e", + "bom-ref": "97e1cacf6fb04b54", "name": "/usr/lib/llvm-18/lib/clang/18/include/opencl-c.h", "type": "file" }, { - "bom-ref": "819fd7591df0ad8d", + "bom-ref": "86a6f1bf721f39c3", "name": "/usr/lib/llvm-18/lib/clang/18/include/openmp_wrappers/__clang_openmp_device_functions.h", "type": "file" }, { - "bom-ref": "7355cc2bfbde93a1", + "bom-ref": "4fe6f3294bf5b9b3", "name": "/usr/lib/llvm-18/lib/clang/18/include/openmp_wrappers/cmath", "type": "file" }, { - "bom-ref": "24b6154b946ec85a", + "bom-ref": "b6db3c0d14784b48", "name": "/usr/lib/llvm-18/lib/clang/18/include/openmp_wrappers/complex", "type": "file" }, { - "bom-ref": "f9e1c24b751e24a0", + "bom-ref": "a621cab682e423a2", "name": "/usr/lib/llvm-18/lib/clang/18/include/openmp_wrappers/complex.h", "type": "file" }, { - "bom-ref": "fcbed16a78c37fa7", + "bom-ref": "07aeb823409f6a35", "name": "/usr/lib/llvm-18/lib/clang/18/include/openmp_wrappers/complex_cmath.h", "type": "file" }, { - "bom-ref": "4637ad024f9b7b40", + "bom-ref": "616348e6d761f026", "name": "/usr/lib/llvm-18/lib/clang/18/include/openmp_wrappers/math.h", "type": "file" }, { - "bom-ref": "716ce8a587209c82", + "bom-ref": "68876ef42b1d853c", "name": "/usr/lib/llvm-18/lib/clang/18/include/openmp_wrappers/new", "type": "file" }, { - "bom-ref": "1f4aed3060b9b2a7", + "bom-ref": "6f3b8e222fc3ec1d", "name": "/usr/lib/llvm-18/lib/clang/18/include/orc/c_api.h", "type": "file" }, { - "bom-ref": "8e494b31f56186b7", + "bom-ref": "aef0fcd9f9c53419", "name": "/usr/lib/llvm-18/lib/clang/18/include/pconfigintrin.h", "type": "file" }, { - "bom-ref": "2f8426d43c4782f3", + "bom-ref": "bde1ef4d5e4bc725", "name": "/usr/lib/llvm-18/lib/clang/18/include/pkuintrin.h", "type": "file" }, { - "bom-ref": "3f058a16b7c551c8", + "bom-ref": "a458bcbe8a02a5d6", "name": "/usr/lib/llvm-18/lib/clang/18/include/pmmintrin.h", "type": "file" }, { - "bom-ref": "cd041a0ccce81533", + "bom-ref": "89e4df430a595241", "name": "/usr/lib/llvm-18/lib/clang/18/include/popcntintrin.h", "type": "file" }, { - "bom-ref": "34a8c802066a66ce", + "bom-ref": "78a20b487261d748", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/bmi2intrin.h", "type": "file" }, { - "bom-ref": "56a609c1f8e39781", + "bom-ref": "f4f312a5a9944ac7", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/bmiintrin.h", "type": "file" }, { - "bom-ref": "a013e285707a284f", + "bom-ref": "8f4cb79bb66c7781", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/emmintrin.h", "type": "file" }, { - "bom-ref": "3e6599649bf92323", + "bom-ref": "e95a912b8fbe8389", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/immintrin.h", "type": "file" }, { - "bom-ref": "19d5eaa9b70d5dca", + "bom-ref": "a4aef5bcdd9cd948", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/mm_malloc.h", "type": "file" }, { - "bom-ref": "0a7d3632bced7ac8", + "bom-ref": "dbbb4d31ff15b7fa", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/mmintrin.h", "type": "file" }, { - "bom-ref": "2c07b802abc02178", + "bom-ref": "fc9e1e510779c2fa", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/nmmintrin.h", "type": "file" }, { - "bom-ref": "baf3707ee986f43b", + "bom-ref": "37c1395de05fa079", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/pmmintrin.h", "type": "file" }, { - "bom-ref": "e1e636830b464974", + "bom-ref": "91a05c08b65fedee", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/smmintrin.h", "type": "file" }, { - "bom-ref": "f83a6bcdb046b0e0", + "bom-ref": "b1e45778c882ad62", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/tmmintrin.h", "type": "file" }, { - "bom-ref": "5d1734b1d404a943", + "bom-ref": "c8a636b5f9a4857d", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/x86gprintrin.h", "type": "file" }, { - "bom-ref": "ad145ea8959c946f", + "bom-ref": "1298870f9f43da65", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/x86intrin.h", "type": "file" }, { - "bom-ref": "24ecb7aa1687981a", + "bom-ref": "592833814a20ce54", "name": "/usr/lib/llvm-18/lib/clang/18/include/ppc_wrappers/xmmintrin.h", "type": "file" }, { - "bom-ref": "f0a859f4f09221f2", + "bom-ref": "e2d27245103a926c", "name": "/usr/lib/llvm-18/lib/clang/18/include/prfchiintrin.h", "type": "file" }, { - "bom-ref": "703769f120bba10e", + "bom-ref": "ac6693d7976254ac", "name": "/usr/lib/llvm-18/lib/clang/18/include/prfchwintrin.h", "type": "file" }, { - "bom-ref": "6abc7f51a68bfaf9", + "bom-ref": "842c5b430f69ddcb", "name": "/usr/lib/llvm-18/lib/clang/18/include/profile/InstrProfData.inc", "type": "file" }, { - "bom-ref": "c91bfcd4fc222832", + "bom-ref": "e2a2a43141379670", "name": "/usr/lib/llvm-18/lib/clang/18/include/profile/instr_prof_interface.h", "type": "file" }, { - "bom-ref": "7aceeaca59e5d5be", + "bom-ref": "592ba7b0c52155f8", "name": "/usr/lib/llvm-18/lib/clang/18/include/ptwriteintrin.h", "type": "file" }, { - "bom-ref": "70d9b7665c7107cd", + "bom-ref": "976d32d11616dad3", "name": "/usr/lib/llvm-18/lib/clang/18/include/raointintrin.h", "type": "file" }, { - "bom-ref": "7c12e8bb104c21b2", + "bom-ref": "6e833b116bbc322c", "name": "/usr/lib/llvm-18/lib/clang/18/include/rdpruintrin.h", "type": "file" }, { - "bom-ref": "6d39603d615a00f5", + "bom-ref": "f0adac2ee0377d7f", "name": "/usr/lib/llvm-18/lib/clang/18/include/rdseedintrin.h", "type": "file" }, { - "bom-ref": "ee5180b33cb484d1", + "bom-ref": "50fbae0eb6aa9ec7", "name": "/usr/lib/llvm-18/lib/clang/18/include/riscv_bitmanip.h", "type": "file" }, { - "bom-ref": "09d0d4f81b543c36", + "bom-ref": "ba572fc113ab6bbc", "name": "/usr/lib/llvm-18/lib/clang/18/include/riscv_crypto.h", "type": "file" }, { - "bom-ref": "dbfadfae4883dd21", + "bom-ref": "811ecebb6b3adb1f", "name": "/usr/lib/llvm-18/lib/clang/18/include/riscv_ntlh.h", "type": "file" }, { - "bom-ref": "132ba42d26dab4ea", + "bom-ref": "95ba473a94c85024", "name": "/usr/lib/llvm-18/lib/clang/18/include/riscv_vector.h", "type": "file" }, { - "bom-ref": "40c2dde8b47a3a8c", + "bom-ref": "5eeaea014f8b4736", "name": "/usr/lib/llvm-18/lib/clang/18/include/rtmintrin.h", "type": "file" }, { - "bom-ref": "0a24417628e54f15", + "bom-ref": "a3f3fe9094a615c7", "name": "/usr/lib/llvm-18/lib/clang/18/include/s390intrin.h", "type": "file" }, { - "bom-ref": "be964666f1a831d9", + "bom-ref": "6c7355e04efce3cb", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/allocator_interface.h", "type": "file" }, { - "bom-ref": "5ef60a8a3876a42a", + "bom-ref": "58a8877d246bf9d4", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/asan_interface.h", "type": "file" }, { - "bom-ref": "a3af46f75246edff", + "bom-ref": "4d0d1201f5161871", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/common_interface_defs.h", "type": "file" }, { - "bom-ref": "ee6feb596a6a8b18", + "bom-ref": "29b73799e2339a6e", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/coverage_interface.h", "type": "file" }, { - "bom-ref": "fc890cde11e85538", + "bom-ref": "3657809e674d473a", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/dfsan_interface.h", "type": "file" }, { - "bom-ref": "f63801172b7b2981", + "bom-ref": "536ca7a52e044143", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/hwasan_interface.h", "type": "file" }, { - "bom-ref": "f295e9a5127c95b9", + "bom-ref": "291e78766db9cf27", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/linux_syscall_hooks.h", "type": "file" }, { - "bom-ref": "a0bfc7a6ad8f352e", + "bom-ref": "a324dbce5df08ac0", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/lsan_interface.h", "type": "file" }, { - "bom-ref": "967eaa314fb10e45", + "bom-ref": "9a0f0002c9479a7b", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/memprof_interface.h", "type": "file" }, { - "bom-ref": "4b30ef22edf9aad7", + "bom-ref": "1e0a2f131f9c084d", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/msan_interface.h", "type": "file" }, { - "bom-ref": "a389cbdef8123fdd", + "bom-ref": "6e01dcfa055dfc6f", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/netbsd_syscall_hooks.h", "type": "file" }, { - "bom-ref": "d631d811269b0627", + "bom-ref": "e79e24fd03b1c3dd", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/scudo_interface.h", "type": "file" }, { - "bom-ref": "ad1e3d57b93e23ec", + "bom-ref": "efa59a2b5a09f366", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/tsan_interface.h", "type": "file" }, { - "bom-ref": "d770c51717a3cfc7", + "bom-ref": "99bccb1904baa331", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/tsan_interface_atomic.h", "type": "file" }, { - "bom-ref": "fd58aab2bde02b8e", + "bom-ref": "6b6124ecbabaf508", "name": "/usr/lib/llvm-18/lib/clang/18/include/sanitizer/ubsan_interface.h", "type": "file" }, { - "bom-ref": "92e92f5b897bbd7e", + "bom-ref": "9ad24f0320b22774", "name": "/usr/lib/llvm-18/lib/clang/18/include/serializeintrin.h", "type": "file" }, { - "bom-ref": "1f4bb2df4ccef731", + "bom-ref": "8c633449c4e5e407", "name": "/usr/lib/llvm-18/lib/clang/18/include/sgxintrin.h", "type": "file" }, { - "bom-ref": "b557ed8ce213e547", + "bom-ref": "c880087ec682bcf9", "name": "/usr/lib/llvm-18/lib/clang/18/include/sha512intrin.h", "type": "file" }, { - "bom-ref": "6c6c48eb7d530fd7", + "bom-ref": "ad697a420431f975", "name": "/usr/lib/llvm-18/lib/clang/18/include/shaintrin.h", "type": "file" }, { - "bom-ref": "f6e551f6040dccc6", + "bom-ref": "6fc181136944d008", "name": "/usr/lib/llvm-18/lib/clang/18/include/sifive_vector.h", "type": "file" }, { - "bom-ref": "180529a80c63a27d", + "bom-ref": "5b28da5b3a83f23f", "name": "/usr/lib/llvm-18/lib/clang/18/include/sm3intrin.h", "type": "file" }, { - "bom-ref": "f9b13f30a41aa258", + "bom-ref": "e880abd4c444fcea", "name": "/usr/lib/llvm-18/lib/clang/18/include/sm4intrin.h", "type": "file" }, { - "bom-ref": "e26df48c65b0790d", + "bom-ref": "1921ebed70d946a3", "name": "/usr/lib/llvm-18/lib/clang/18/include/smmintrin.h", "type": "file" }, { - "bom-ref": "a3c04566303f2fc0", + "bom-ref": "8168b323d6a3f60e", "name": "/usr/lib/llvm-18/lib/clang/18/include/stdalign.h", "type": "file" }, { - "bom-ref": "6ad6eadf9e54e04c", + "bom-ref": "fa146363acbda712", "name": "/usr/lib/llvm-18/lib/clang/18/include/stdarg.h", "type": "file" }, { - "bom-ref": "266f2552a99e4d9e", + "bom-ref": "7216544705b295c0", "name": "/usr/lib/llvm-18/lib/clang/18/include/stdatomic.h", "type": "file" }, { - "bom-ref": "d21463238fc273a2", + "bom-ref": "ee0dc0eee59dc4cc", "name": "/usr/lib/llvm-18/lib/clang/18/include/stdbool.h", "type": "file" }, { - "bom-ref": "9b47961d09d764f2", + "bom-ref": "bf1b51476029b2b8", "name": "/usr/lib/llvm-18/lib/clang/18/include/stdckdint.h", "type": "file" }, { - "bom-ref": "e98aa75c8d62a1ec", + "bom-ref": "6d9835f7274cb5ba", "name": "/usr/lib/llvm-18/lib/clang/18/include/stddef.h", "type": "file" }, { - "bom-ref": "2f7de555171ef07d", + "bom-ref": "2824da0e7bcd8a6b", "name": "/usr/lib/llvm-18/lib/clang/18/include/stdint.h", "type": "file" }, { - "bom-ref": "758fd11e0fca81af", + "bom-ref": "d2bc931c151f6155", "name": "/usr/lib/llvm-18/lib/clang/18/include/stdnoreturn.h", "type": "file" }, { - "bom-ref": "2c828ee9bc9ab969", + "bom-ref": "b385f126447aebbf", "name": "/usr/lib/llvm-18/lib/clang/18/include/tbmintrin.h", "type": "file" }, { - "bom-ref": "55921fe056e4ab56", + "bom-ref": "387c26b762aa1190", "name": "/usr/lib/llvm-18/lib/clang/18/include/tgmath.h", "type": "file" }, { - "bom-ref": "cb24097a4ff701a9", + "bom-ref": "dd54a6f3e9d20263", "name": "/usr/lib/llvm-18/lib/clang/18/include/tmmintrin.h", "type": "file" }, { - "bom-ref": "10d0dfa3bb248b94", + "bom-ref": "4e5bef56cc245d8e", "name": "/usr/lib/llvm-18/lib/clang/18/include/tsxldtrkintrin.h", "type": "file" }, { - "bom-ref": "3ae3c79b5afcbc54", + "bom-ref": "771199bca7d28a8e", "name": "/usr/lib/llvm-18/lib/clang/18/include/uintrintrin.h", "type": "file" }, { - "bom-ref": "122996988475628d", + "bom-ref": "0cdd97755fd1afdf", "name": "/usr/lib/llvm-18/lib/clang/18/include/unwind.h", "type": "file" }, { - "bom-ref": "29772bb368190021", + "bom-ref": "09b7ced0437ea1ab", "name": "/usr/lib/llvm-18/lib/clang/18/include/usermsrintrin.h", "type": "file" }, { - "bom-ref": "bfbeff21bc865e0a", + "bom-ref": "b242b01174907814", "name": "/usr/lib/llvm-18/lib/clang/18/include/vadefs.h", "type": "file" }, { - "bom-ref": "decf4d0feba0f7ce", + "bom-ref": "440a8c3b0a69e108", "name": "/usr/lib/llvm-18/lib/clang/18/include/vaesintrin.h", "type": "file" }, { - "bom-ref": "81204d12885608f6", + "bom-ref": "1f57217f4dbd65d4", "name": "/usr/lib/llvm-18/lib/clang/18/include/varargs.h", "type": "file" }, { - "bom-ref": "55c1f0a39fc96a9c", + "bom-ref": "fb6c5fad9036b74a", "name": "/usr/lib/llvm-18/lib/clang/18/include/vecintrin.h", "type": "file" }, { - "bom-ref": "aa304a83515bf0cf", + "bom-ref": "1cc3bed3a908ab19", "name": "/usr/lib/llvm-18/lib/clang/18/include/velintrin.h", "type": "file" }, { - "bom-ref": "913a35c6056de3c1", + "bom-ref": "8334a185f0d85897", "name": "/usr/lib/llvm-18/lib/clang/18/include/velintrin_approx.h", "type": "file" }, { - "bom-ref": "a667625b9b97a5d0", + "bom-ref": "a7c6a75f8a7fe392", "name": "/usr/lib/llvm-18/lib/clang/18/include/velintrin_gen.h", "type": "file" }, { - "bom-ref": "7d0fb56ae86bbb17", + "bom-ref": "cae4c7ed8f0b65d5", "name": "/usr/lib/llvm-18/lib/clang/18/include/vpclmulqdqintrin.h", "type": "file" }, { - "bom-ref": "ab7ae2bc41aecabe", + "bom-ref": "bf1b385787c992fc", "name": "/usr/lib/llvm-18/lib/clang/18/include/waitpkgintrin.h", "type": "file" }, { - "bom-ref": "67b260005c17e064", + "bom-ref": "8b5a4d5a04f30cca", "name": "/usr/lib/llvm-18/lib/clang/18/include/wasm_simd128.h", "type": "file" }, { - "bom-ref": "6711258d11c924a9", + "bom-ref": "6ae34db9906c35c3", "name": "/usr/lib/llvm-18/lib/clang/18/include/wbnoinvdintrin.h", "type": "file" }, { - "bom-ref": "dae15ecac0db79da", + "bom-ref": "d0396a50ab9e0980", "name": "/usr/lib/llvm-18/lib/clang/18/include/wmmintrin.h", "type": "file" }, { - "bom-ref": "9c30fc82813d26fe", + "bom-ref": "e62f4bbf77a2528c", "name": "/usr/lib/llvm-18/lib/clang/18/include/x86gprintrin.h", "type": "file" }, { - "bom-ref": "6403e454a9a292ca", + "bom-ref": "6686b5085e5cd028", "name": "/usr/lib/llvm-18/lib/clang/18/include/x86intrin.h", "type": "file" }, { - "bom-ref": "339c5c44dd1a08ea", + "bom-ref": "bbe363dbae630298", "name": "/usr/lib/llvm-18/lib/clang/18/include/xmmintrin.h", "type": "file" }, { - "bom-ref": "d41804c133312bea", + "bom-ref": "0a856ed0c7f48c08", "name": "/usr/lib/llvm-18/lib/clang/18/include/xopintrin.h", "type": "file" }, { - "bom-ref": "f39bbfc5a1c3d5d0", + "bom-ref": "404a315f1416fe8e", "name": "/usr/lib/llvm-18/lib/clang/18/include/xray/xray_interface.h", "type": "file" }, { - "bom-ref": "450cc253486ec19e", + "bom-ref": "840ec768871ce194", "name": "/usr/lib/llvm-18/lib/clang/18/include/xray/xray_log_interface.h", "type": "file" }, { - "bom-ref": "b8d3b0260ad7ab2c", + "bom-ref": "1df8f6e019d20fe6", "name": "/usr/lib/llvm-18/lib/clang/18/include/xray/xray_records.h", "type": "file" }, { - "bom-ref": "2af008511bdd90ba", + "bom-ref": "0bfeb29cef65781c", "name": "/usr/lib/llvm-18/lib/clang/18/include/xsavecintrin.h", "type": "file" }, { - "bom-ref": "3ed12fbeeed98567", + "bom-ref": "b409db43104a2d11", "name": "/usr/lib/llvm-18/lib/clang/18/include/xsaveintrin.h", "type": "file" }, { - "bom-ref": "e5bc17e9ae993614", + "bom-ref": "f14811ddba03fc76", "name": "/usr/lib/llvm-18/lib/clang/18/include/xsaveoptintrin.h", "type": "file" }, { - "bom-ref": "3c7a693b208b6512", + "bom-ref": "e37f8cbb3470b838", "name": "/usr/lib/llvm-18/lib/clang/18/include/xsavesintrin.h", "type": "file" }, { - "bom-ref": "930f8eaa032eb8dc", + "bom-ref": "7aa39ac0d3a178f6", "name": "/usr/lib/llvm-18/lib/clang/18/include/xtestintrin.h", "type": "file" }, { - "bom-ref": "610122c380f6dbf2", + "bom-ref": "813749e53aa6988c", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/clang_rt.crtbegin-i386.o", "type": "file" }, { - "bom-ref": "a59a63a34b8a96b4", + "bom-ref": "b661859c082aad1a", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/clang_rt.crtbegin-x86_64.o", "type": "file" }, { - "bom-ref": "ec3e329696dd1260", + "bom-ref": "32e6e49314beff92", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/clang_rt.crtend-i386.o", "type": "file" }, { - "bom-ref": "e220a91d6bb2bf92", + "bom-ref": "e2b6385aca464d24", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/clang_rt.crtend-x86_64.o", "type": "file" }, { - "bom-ref": "365e955d41662f2b", + "bom-ref": "29b975a032693d8d", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan-i386.a", "type": "file" }, { - "bom-ref": "f5c443fc5c03cbfb", + "bom-ref": "2ddf3f652f14ebc1", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan-i386.so", "type": "file" }, { - "bom-ref": "b65c2f63275a6b33", + "bom-ref": "0d0df15132121f4d", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan-preinit-i386.a", "type": "file" }, { - "bom-ref": "6e660eb73bcd5e43", + "bom-ref": "f8fc6a118cf5173d", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan-preinit-x86_64.a", "type": "file" }, { - "bom-ref": "e5caadf8aa5c427d", + "bom-ref": "8f788ff4bc6a2e07", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan-x86_64.a", "type": "file" }, { - "bom-ref": "2b63614ab552e01c", + "bom-ref": "a11cbad0f72c307a", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan-x86_64.a.syms", "type": "file" }, { - "bom-ref": "315a67deaf854376", + "bom-ref": "4f79d0ef53d8676c", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan-x86_64.so", "type": "file" }, { - "bom-ref": "aa5bbfda7f23bc7f", + "bom-ref": "049e9ea34e5dc765", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan_cxx-i386.a", "type": "file" }, { - "bom-ref": "1800a4dccedd394e", + "bom-ref": "e9992c827c304424", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan_cxx-x86_64.a", "type": "file" }, { - "bom-ref": "185cc5eebb89e547", + "bom-ref": "9144d2faae7c4301", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan_cxx-x86_64.a.syms", "type": "file" }, { - "bom-ref": "e00b1ae8c80d6a11", + "bom-ref": "f7b5097cc5fbd63b", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan_static-i386.a", "type": "file" }, { - "bom-ref": "d4fac7738e15df64", + "bom-ref": "af90e40619077f62", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.asan_static-x86_64.a", "type": "file" }, { - "bom-ref": "c0cfda02a9791198", + "bom-ref": "1657402ea7f9397a", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.builtins-i386.a", "type": "file" }, { - "bom-ref": "64054a96258172ab", + "bom-ref": "3bfd4d81817fa039", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64.a", "type": "file" }, { - "bom-ref": "ca732a98bf536b2a", + "bom-ref": "ca762022cca7c390", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.cfi-i386.a", "type": "file" }, { - "bom-ref": "86acfefe25bae82f", + "bom-ref": "c3b6a8638ff2bae1", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.cfi-x86_64.a", "type": "file" }, { - "bom-ref": "350df29102bd457a", + "bom-ref": "a560237c700fd220", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.cfi_diag-i386.a", "type": "file" }, { - "bom-ref": "47e48d766558d285", + "bom-ref": "aaebf858c732d357", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.cfi_diag-x86_64.a", "type": "file" }, { - "bom-ref": "088ae2ba099a4245", + "bom-ref": "6e526d681d869c37", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.dd-x86_64.a", "type": "file" }, { - "bom-ref": "e43e2372aa456a0e", + "bom-ref": "2b0275afcc956688", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.dfsan-x86_64.a", "type": "file" }, { - "bom-ref": "be9cbb7de0f88c13", + "bom-ref": "867c1002c2c0a32d", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.dfsan-x86_64.a.syms", "type": "file" }, { - "bom-ref": "8d25573b0a957c48", + "bom-ref": "e593dab96385828a", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.dyndd-x86_64.so", "type": "file" }, { - "bom-ref": "4748f5d53244d3a1", + "bom-ref": "564714426d594633", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.fuzzer-i386.a", "type": "file" }, { - "bom-ref": "8e4aefec8ec49801", + "bom-ref": "32dc69cfd57611d3", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.fuzzer-x86_64.a", "type": "file" }, { - "bom-ref": "329d6d9e9205092f", + "bom-ref": "428afd3186af1161", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.fuzzer_interceptors-i386.a", "type": "file" }, { - "bom-ref": "d6a3ee9cfd07f061", + "bom-ref": "62db8fb80decca3b", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.fuzzer_interceptors-x86_64.a", "type": "file" }, { - "bom-ref": "f6f8cfa4328692d0", + "bom-ref": "9b8928e65f43a25a", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.fuzzer_no_main-i386.a", "type": "file" }, { - "bom-ref": "c9e0944aa7659853", + "bom-ref": "eee95792650ddc21", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.fuzzer_no_main-x86_64.a", "type": "file" }, { - "bom-ref": "e77448f3d3967295", + "bom-ref": "08198078d79f5f53", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.gwp_asan-i386.a", "type": "file" }, { - "bom-ref": "eed5591cc792dbaf", + "bom-ref": "e7831ddc184f0095", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.gwp_asan-x86_64.a", "type": "file" }, { - "bom-ref": "31c77c69268dabd1", + "bom-ref": "b3f82c1cfaaf8f27", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan-preinit-x86_64.a", "type": "file" }, { - "bom-ref": "674dcbb8df576b59", + "bom-ref": "48c4700bc7a6a07b", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan-x86_64.a", "type": "file" }, { - "bom-ref": "3e6b1689ac3e877b", + "bom-ref": "97e3a6700c2ee4cd", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan-x86_64.a.syms", "type": "file" }, { - "bom-ref": "0d1ded224ac48ac3", + "bom-ref": "e7ba1bd24ef3d679", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan-x86_64.so", "type": "file" }, { - "bom-ref": "00a1e3f6591d2ccf", + "bom-ref": "2953e6591a838c65", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan_aliases-x86_64.a", "type": "file" }, { - "bom-ref": "efd1051ff801a4a6", + "bom-ref": "e2859506fe6649ec", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan_aliases-x86_64.a.syms", "type": "file" }, { - "bom-ref": "6153755aa2c0a2eb", + "bom-ref": "23a7c20118732bf9", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan_aliases-x86_64.so", "type": "file" }, { - "bom-ref": "ee4b14e5cd03af36", + "bom-ref": "7de886fce349ccb0", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan_aliases_cxx-x86_64.a", "type": "file" }, { - "bom-ref": "f6c99090618f3a4c", + "bom-ref": "246d8d1a47e7318e", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan_aliases_cxx-x86_64.a.syms", "type": "file" }, { - "bom-ref": "5ae61e0085f29e39", + "bom-ref": "be03cee2655033b3", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan_cxx-x86_64.a", "type": "file" }, { - "bom-ref": "ebd0a285b8998350", + "bom-ref": "2d75ae22e09a8f3a", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.hwasan_cxx-x86_64.a.syms", "type": "file" }, { - "bom-ref": "0e4447af74091d53", + "bom-ref": "449d0480d02d26f5", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.lsan-i386.a", "type": "file" }, { - "bom-ref": "e3cdc1e37fa1f52e", + "bom-ref": "d943f028d4c3a8cc", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.lsan-x86_64.a", "type": "file" }, { - "bom-ref": "25d4d7ed30dbb5c4", + "bom-ref": "4861c641339e4366", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.memprof-preinit-x86_64.a", "type": "file" }, { - "bom-ref": "76e08fef24a7c393", + "bom-ref": "1c1c831097cf4b51", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.memprof-x86_64.a", "type": "file" }, { - "bom-ref": "5581169a734084a3", + "bom-ref": "1bf7e21ff33b4b35", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.memprof-x86_64.a.syms", "type": "file" }, { - "bom-ref": "faecc72106a59124", + "bom-ref": "2a575de7bc4566aa", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.memprof-x86_64.so", "type": "file" }, { - "bom-ref": "8fe31fa2f1fd251e", + "bom-ref": "0266be724fb1e948", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.memprof_cxx-x86_64.a", "type": "file" }, { - "bom-ref": "4ec84697813ba059", + "bom-ref": "0b0bdc0f1958a4e3", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.memprof_cxx-x86_64.a.syms", "type": "file" }, { - "bom-ref": "e3998845c42f7cd8", + "bom-ref": "7e5ff4414a6f1bde", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.msan-x86_64.a", "type": "file" }, { - "bom-ref": "4384ad045dac6f02", + "bom-ref": "356071c3d5c40340", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.msan-x86_64.a.syms", "type": "file" }, { - "bom-ref": "28d3dfbaf3d45656", + "bom-ref": "571c026837eb813c", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.msan_cxx-x86_64.a", "type": "file" }, { - "bom-ref": "e795e197070273b0", + "bom-ref": "9162f2536b12d1f6", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.msan_cxx-x86_64.a.syms", "type": "file" }, { - "bom-ref": "114c0b3210e597be", + "bom-ref": "7a72175338fcf754", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.profile-i386.a", "type": "file" }, { - "bom-ref": "5b222e298fb2196b", + "bom-ref": "55b7256858491be5", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.profile-x86_64.a", "type": "file" }, { - "bom-ref": "f965b48237659b0e", + "bom-ref": "bf83a25a6dcefd38", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.safestack-i386.a", "type": "file" }, { - "bom-ref": "f94d056d6516997b", + "bom-ref": "fa01eb5aab6e3ffd", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.safestack-x86_64.a", "type": "file" }, { - "bom-ref": "d92af81d7c004332", + "bom-ref": "410dc48ac5b097c0", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.scudo_standalone-i386.a", "type": "file" }, { - "bom-ref": "9c3cb3da80b3a96b", + "bom-ref": "634d983102c659b5", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.scudo_standalone-i386.so", "type": "file" }, { - "bom-ref": "19c6afe2fe3cead9", + "bom-ref": "9242d6007af3cf7b", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.scudo_standalone-x86_64.a", "type": "file" }, { - "bom-ref": "8209edaea6e01bb6", + "bom-ref": "470154c215a913d8", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.scudo_standalone-x86_64.so", "type": "file" }, { - "bom-ref": "d30e627901106f51", + "bom-ref": "329f672f85a0e283", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.scudo_standalone_cxx-i386.a", "type": "file" }, { - "bom-ref": "04e60d353f0f73d9", + "bom-ref": "191f61e74ab10a2f", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.scudo_standalone_cxx-x86_64.a", "type": "file" }, { - "bom-ref": "34d7a108669ea147", + "bom-ref": "9878dc7f2588a9c1", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.stats-i386.a", "type": "file" }, { - "bom-ref": "8a22196b9765d6d5", + "bom-ref": "3d6d136d17c35893", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.stats-x86_64.a", "type": "file" }, { - "bom-ref": "195c4808af96a940", + "bom-ref": "b36981074d4674fa", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.stats_client-i386.a", "type": "file" }, { - "bom-ref": "247665adc3e1f4e8", + "bom-ref": "83d0636df4f15d26", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.stats_client-x86_64.a", "type": "file" }, { - "bom-ref": "8dc2b842de118184", + "bom-ref": "763a0b64065802ea", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.tsan-x86_64.a", "type": "file" }, { - "bom-ref": "a96ccafa2793d23d", + "bom-ref": "0a8eba6334442097", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.tsan-x86_64.a.syms", "type": "file" }, { - "bom-ref": "10bcd3ce09b9ca0c", + "bom-ref": "65d333c6783261f2", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.tsan-x86_64.so", "type": "file" }, { - "bom-ref": "704e57a8b39e9f89", + "bom-ref": "360ea8ae55ab4bdb", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.tsan_cxx-x86_64.a", "type": "file" }, { - "bom-ref": "c315f17ba7cd5111", + "bom-ref": "181aad3bd8320d57", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.tsan_cxx-x86_64.a.syms", "type": "file" }, { - "bom-ref": "085212546d64f629", + "bom-ref": "df15c96bd7eafef7", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_minimal-i386.a", "type": "file" }, { - "bom-ref": "11a7df4f033f2b01", + "bom-ref": "9d683038d3d2b623", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_minimal-i386.so", "type": "file" }, { - "bom-ref": "567b702b45318963", + "bom-ref": "35d2e2b683fd8c0d", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_minimal-x86_64.a", "type": "file" }, { - "bom-ref": "1804426508b90c59", + "bom-ref": "bd6dbb6ec16d4197", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_minimal-x86_64.a.syms", "type": "file" }, { - "bom-ref": "bd7c546fc3220789", + "bom-ref": "173cfcaff9db459f", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_minimal-x86_64.so", "type": "file" }, { - "bom-ref": "452b3802a5eead2d", + "bom-ref": "2ce9fc13d833c297", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_standalone-i386.a", "type": "file" }, { - "bom-ref": "9c0baff22a0638d8", + "bom-ref": "e7e34aa9da5169de", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_standalone-i386.so", "type": "file" }, { - "bom-ref": "1c2de9efa4fb7e9a", + "bom-ref": "e218dedf394a8d54", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_standalone-x86_64.a", "type": "file" }, { - "bom-ref": "13341f6f076b23a8", + "bom-ref": "8e73576150ea3c52", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_standalone-x86_64.a.syms", "type": "file" }, { - "bom-ref": "f05fc8ca23767a62", + "bom-ref": "0ec22b045ed0c488", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_standalone-x86_64.so", "type": "file" }, { - "bom-ref": "49a2f5270a28b202", + "bom-ref": "8d548881e3392190", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_standalone_cxx-i386.a", "type": "file" }, { - "bom-ref": "570f250f6a926081", + "bom-ref": "e1a95415abd137ef", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_standalone_cxx-x86_64.a", "type": "file" }, { - "bom-ref": "04ed6a3ea429026e", + "bom-ref": "229d10914e8ae67c", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.ubsan_standalone_cxx-x86_64.a.syms", "type": "file" }, { - "bom-ref": "54afba14c379584d", + "bom-ref": "43c803c1cb19754f", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.xray-basic-x86_64.a", "type": "file" }, { - "bom-ref": "84f9942861838206", + "bom-ref": "4837f31ca61854a4", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.xray-fdr-x86_64.a", "type": "file" }, { - "bom-ref": "5798bf40db0b36f0", + "bom-ref": "8cc5602370beaff6", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.xray-profiling-x86_64.a", "type": "file" }, { - "bom-ref": "5bd27cdbfb2e4209", + "bom-ref": "0ea303bdd2e1940f", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.xray-x86_64.a", "type": "file" }, { - "bom-ref": "c1cab1e529d03af4", + "bom-ref": "faf54905b8ae78de", "name": "/usr/lib/llvm-18/lib/clang/18/lib/linux/liborc_rt-x86_64.a", "type": "file" }, { - "bom-ref": "cf88f8a39ce7537a", + "bom-ref": "7cb26e37f2a7cebc", "name": "/usr/lib/llvm-18/lib/clang/18/share/README.txt", "type": "file" }, { - "bom-ref": "b03a643a81058083", + "bom-ref": "3acae0d1d13f5535", "name": "/usr/lib/llvm-18/lib/clang/18/share/asan_ignorelist.txt", "type": "file" }, { - "bom-ref": "14cee8f6d6421989", + "bom-ref": "17cb067268549663", "name": "/usr/lib/llvm-18/lib/clang/18/share/cfi_ignorelist.txt", "type": "file" }, { - "bom-ref": "3894546e9c34d5fd", + "bom-ref": "67fba6beb6179887", "name": "/usr/lib/llvm-18/lib/clang/18/share/dfsan_abilist.txt", "type": "file" }, { - "bom-ref": "95a8740ebea640e0", + "bom-ref": "56d6a8c26b291902", "name": "/usr/lib/llvm-18/lib/clang/18/share/hwasan_ignorelist.txt", "type": "file" }, { - "bom-ref": "5cd533bf67c669a3", + "bom-ref": "8b3ec14e47bf63e9", "name": "/usr/lib/llvm-18/lib/clang/18/share/msan_ignorelist.txt", "type": "file" }, { - "bom-ref": "22d13e262f28e70d", + "bom-ref": "18e7bf497269cdab", "name": "/usr/lib/llvm-18/lib/cmake/clang/AddClang.cmake", "type": "file" }, { - "bom-ref": "93e6702d87ac7892", + "bom-ref": "e2cea2dd4db9a608", "name": "/usr/lib/llvm-18/lib/cmake/clang/ClangConfig.cmake", "type": "file" }, { - "bom-ref": "f8e35a5d596988a9", + "bom-ref": "454e297966283ea3", "name": "/usr/lib/llvm-18/lib/cmake/clang/ClangConfigVersion.cmake", "type": "file" }, { - "bom-ref": "93bd8f0230f2d702", + "bom-ref": "0b2f543c2010d534", "name": "/usr/lib/llvm-18/lib/cmake/clang/ClangTargets-relwithdebinfo.cmake", "type": "file" }, { - "bom-ref": "416efaae7e8ad169", + "bom-ref": "22697a223f9166df", "name": "/usr/lib/llvm-18/lib/cmake/clang/ClangTargets.cmake", "type": "file" }, { - "bom-ref": "2aa3b55c375d4fbc", + "bom-ref": "1781a2558dbf8a6e", "name": "/usr/lib/llvm-18/lib/libLLVM.so.1", "type": "file" }, { - "bom-ref": "485202b7dd457427", + "bom-ref": "e760398e6e65deb5", "name": "/usr/lib/llvm-18/lib/libLTO.so.18.1", "type": "file" }, { - "bom-ref": "8b1bd5b3edc9881c", + "bom-ref": "e490f6d98414605a", "name": "/usr/lib/llvm-18/lib/libclang-cpp.so.18.1", "type": "file" }, { - "bom-ref": "6a8523d5dee11571", + "bom-ref": "5861893e82c8a883", "name": "/usr/lib/llvm-18/share/clang/bash-autocomplete.sh", "type": "file" }, { - "bom-ref": "972ce38247c560e8", + "bom-ref": "567ac5b199c7529a", "name": "/usr/lib/locale/C.utf8/LC_ADDRESS", "type": "file" }, { - "bom-ref": "96e71c63040566fd", + "bom-ref": "85e76f383343e10b", "name": "/usr/lib/locale/C.utf8/LC_COLLATE", "type": "file" }, { - "bom-ref": "757b5e95ba7fe9a7", + "bom-ref": "d22ca85444be82b1", "name": "/usr/lib/locale/C.utf8/LC_CTYPE", "type": "file" }, { - "bom-ref": "705e24f3cc9d7918", + "bom-ref": "4eaf1ea6d17ab402", "name": "/usr/lib/locale/C.utf8/LC_IDENTIFICATION", "type": "file" }, { - "bom-ref": "8f0750e44da2da52", + "bom-ref": "070027753d0062d4", "name": "/usr/lib/locale/C.utf8/LC_MEASUREMENT", "type": "file" }, { - "bom-ref": "30b19c9bc824bba5", + "bom-ref": "d64aaa0caf305307", "name": "/usr/lib/locale/C.utf8/LC_MESSAGES/SYS_LC_MESSAGES", "type": "file" }, { - "bom-ref": "989cdd8a34b8267f", + "bom-ref": "c3a55dd286b64071", "name": "/usr/lib/locale/C.utf8/LC_MONETARY", "type": "file" }, { - "bom-ref": "b3ec9b7c5bd727b4", + "bom-ref": "4ebed919df2605ce", "name": "/usr/lib/locale/C.utf8/LC_NAME", "type": "file" }, { - "bom-ref": "50ffedf9a9e276df", + "bom-ref": "d1438a63703968d9", "name": "/usr/lib/locale/C.utf8/LC_NUMERIC", "type": "file" }, { - "bom-ref": "5b2b615352de7b63", + "bom-ref": "0a332e3ae7251541", "name": "/usr/lib/locale/C.utf8/LC_PAPER", "type": "file" }, { - "bom-ref": "db2763c59ead2c4a", + "bom-ref": "50918344a7ae6654", "name": "/usr/lib/locale/C.utf8/LC_TELEPHONE", "type": "file" }, { - "bom-ref": "67fa76214cae28a4", + "bom-ref": "82339334e1975486", "name": "/usr/lib/locale/C.utf8/LC_TIME", "type": "file" }, { - "bom-ref": "828478e1559e3db9", + "bom-ref": "0bdb54a1520e55df", "name": "/usr/lib/lsb/init-functions", "type": "file" }, { - "bom-ref": "34a73e1bb28454cd", + "bom-ref": "2a55278efb5fedfb", "name": "/usr/lib/lsb/init-functions.d/00-verbose", "type": "file" }, { - "bom-ref": "cd93ed1c99a76796", + "bom-ref": "789568ff1858a83c", "name": "/usr/lib/lsb/init-functions.d/50-ubuntu-logging", "type": "file" }, { - "bom-ref": "772ffca6ffecde41", + "bom-ref": "d1f5bed5b30f119d", "name": "/usr/lib/mime/packages/less", "type": "file" }, { - "bom-ref": "53bc6682384c2398", + "bom-ref": "bdbf45ebc741306a", "name": "/usr/lib/mime/packages/sensible-utils", "type": "file" }, { - "bom-ref": "9893ee4bde7ab96d", + "bom-ref": "3820f8a0012d696b", "name": "/usr/lib/mime/packages/sox", "type": "file" }, { - "bom-ref": "9835c652f1dfbc11", + "bom-ref": "1c05c1edc928e24f", "name": "/usr/lib/mime/packages/tar", "type": "file" }, { - "bom-ref": "1d0db49f49bba278", + "bom-ref": "3fac7560e3715b0d", "name": "/usr/lib/mime/packages/unzip", "type": "file" }, { - "bom-ref": "f1bc7a56a6c22244", + "bom-ref": "cb03862c1a11e04a", "name": "/usr/lib/mime/packages/util-linux", "type": "file" }, { - "bom-ref": "7861f1d706a33a69", + "bom-ref": "9f9c7da334db7ca4", "name": "/usr/lib/mime/packages/vim-common", "type": "file" }, { - "bom-ref": "7636cd2f8596cb78", + "bom-ref": "291c7f7a21fa773d", "name": "/usr/lib/openssh/agent-launch", "type": "file" }, { - "bom-ref": "980e01dc858bbc68", + "bom-ref": "79c92c4e895625f5", "name": "/usr/lib/openssh/ssh-keysign", "type": "file" }, { - "bom-ref": "ee6d45a43503b7a4", + "bom-ref": "b1fa79cf293d35cd", "name": "/usr/lib/openssh/ssh-pkcs11-helper", "type": "file" }, { - "bom-ref": "f6504cad5287a27f", + "bom-ref": "4ddbd4248d2b4716", "name": "/usr/lib/openssh/ssh-sk-helper", "type": "file" }, { - "bom-ref": "927ec03c7220e09c", + "bom-ref": "f00645f88b9c49b6", "name": "/usr/lib/os-release", "type": "file" }, { - "bom-ref": "cf726e09c39f290b", - "name": "/usr/lib/pkgconfig/cuda-13.2.pc", - "type": "file" - }, - { - "bom-ref": "1628adb7920c83c7", - "name": "/usr/lib/pkgconfig/cudart-13.2.pc", + "bom-ref": "5ad37e6bcdac8ab2", + "name": "/usr/lib/pkgconfig/cublas-13.4.pc", "type": "file" }, { - "bom-ref": "98c3db34b136b6fd", - "name": "/usr/lib/pkgconfig/cufft-13.2.pc", + "bom-ref": "4f7a2566159fe861", + "name": "/usr/lib/pkgconfig/cuda-13.4.pc", "type": "file" }, { - "bom-ref": "0e3a1c6db54b5140", - "name": "/usr/lib/pkgconfig/cufftw-13.2.pc", + "bom-ref": "dd4e931ab477b675", + "name": "/usr/lib/pkgconfig/cudart-13.4.pc", "type": "file" }, { - "bom-ref": "8c3bd11d1687d2bf", - "name": "/usr/lib/pkgconfig/cufile-13.2.pc", + "bom-ref": "50743b1960194aa8", + "name": "/usr/lib/pkgconfig/cufft-13.4.pc", "type": "file" }, { - "bom-ref": "583d93120b434c57", - "name": "/usr/lib/pkgconfig/curand-13.2.pc", + "bom-ref": "737a3a784aa752df", + "name": "/usr/lib/pkgconfig/cufftw-13.4.pc", "type": "file" }, { - "bom-ref": "66962c80eb7c7265", - "name": "/usr/lib/pkgconfig/cusolver-13.2.pc", + "bom-ref": "beb63e53ef0c740b", + "name": "/usr/lib/pkgconfig/cufile-13.4.pc", "type": "file" }, { - "bom-ref": "62b0a15887e28553", - "name": "/usr/lib/pkgconfig/cusparse-13.2.pc", + "bom-ref": "c504c376d7eaf58c", + "name": "/usr/lib/pkgconfig/curand-13.4.pc", "type": "file" }, { - "bom-ref": "86b1030ecb3c80b2", - "name": "/usr/lib/pkgconfig/nppc-13.2.pc", + "bom-ref": "ae75159bd987dc91", + "name": "/usr/lib/pkgconfig/cusolver-13.4.pc", "type": "file" }, { - "bom-ref": "e753afe8e3b4373d", - "name": "/usr/lib/pkgconfig/nppi-13.2.pc", + "bom-ref": "867097be940c9f77", + "name": "/usr/lib/pkgconfig/cusparse-13.4.pc", "type": "file" }, { - "bom-ref": "652af82a1b95c644", - "name": "/usr/lib/pkgconfig/nppial-13.2.pc", + "bom-ref": "4f172551622bc1bf", + "name": "/usr/lib/pkgconfig/nppc-13.4.pc", "type": "file" }, { - "bom-ref": "a6c9161bce9293f8", - "name": "/usr/lib/pkgconfig/nppicc-13.2.pc", + "bom-ref": "3a7598460ccbb058", + "name": "/usr/lib/pkgconfig/nppial-13.4.pc", "type": "file" }, { - "bom-ref": "244f42d1d8901195", - "name": "/usr/lib/pkgconfig/nppicom-13.2.pc", + "bom-ref": "4322cf61e73e7f04", + "name": "/usr/lib/pkgconfig/nppicc-13.4.pc", "type": "file" }, { - "bom-ref": "c686fb97517bb4ca", - "name": "/usr/lib/pkgconfig/nppidei-13.2.pc", + "bom-ref": "337364a4942de556", + "name": "/usr/lib/pkgconfig/nppidei-13.4.pc", "type": "file" }, { - "bom-ref": "168161c4db5374fb", - "name": "/usr/lib/pkgconfig/nppif-13.2.pc", + "bom-ref": "172c4c7d722b1db2", + "name": "/usr/lib/pkgconfig/nppif-13.4.pc", "type": "file" }, { - "bom-ref": "ceca0d49783fd021", - "name": "/usr/lib/pkgconfig/nppig-13.2.pc", + "bom-ref": "f0d340f2731ddc0e", + "name": "/usr/lib/pkgconfig/nppig-13.4.pc", "type": "file" }, { - "bom-ref": "0259590504a39513", - "name": "/usr/lib/pkgconfig/nppim-13.2.pc", + "bom-ref": "cfaa51b690091b69", + "name": "/usr/lib/pkgconfig/nppim-13.4.pc", "type": "file" }, { - "bom-ref": "65f22c6458795e3a", - "name": "/usr/lib/pkgconfig/nppist-13.2.pc", + "bom-ref": "dd9d534281c19150", + "name": "/usr/lib/pkgconfig/nppist-13.4.pc", "type": "file" }, { - "bom-ref": "d3640dc8aadf55a4", - "name": "/usr/lib/pkgconfig/nppisu-13.2.pc", + "bom-ref": "a08738538543b1f0", + "name": "/usr/lib/pkgconfig/nppisu-13.4.pc", "type": "file" }, { - "bom-ref": "a2c81196ab66acaa", - "name": "/usr/lib/pkgconfig/nppitc-13.2.pc", + "bom-ref": "c1909d8f245dc015", + "name": "/usr/lib/pkgconfig/nppitc-13.4.pc", "type": "file" }, { - "bom-ref": "c98a3de4583f14c7", - "name": "/usr/lib/pkgconfig/npps-13.2.pc", + "bom-ref": "604419fb4789fa04", + "name": "/usr/lib/pkgconfig/npps-13.4.pc", "type": "file" }, { - "bom-ref": "5de8eed9eab04ca9", - "name": "/usr/lib/pkgconfig/nvfatbin-13.2.pc", + "bom-ref": "d2b39958099c5b0a", + "name": "/usr/lib/pkgconfig/nvfatbin-13.4.pc", "type": "file" }, { - "bom-ref": "2550fe69cf6ddaca", - "name": "/usr/lib/pkgconfig/nvidia-ml-13.2.pc", + "bom-ref": "45b54f48e2ad1c57", + "name": "/usr/lib/pkgconfig/nvidia-ml-13.4.pc", "type": "file" }, { - "bom-ref": "a1d661413e74483e", - "name": "/usr/lib/pkgconfig/nvjitlink-13.2.pc", + "bom-ref": "e7d7c738d7474f76", + "name": "/usr/lib/pkgconfig/nvjitlink-13.4.pc", "type": "file" }, { - "bom-ref": "25cbb8bab5c38255", - "name": "/usr/lib/pkgconfig/nvjpeg-13.2.pc", + "bom-ref": "824d3f42970788a2", + "name": "/usr/lib/pkgconfig/nvjpeg-13.4.pc", "type": "file" }, { - "bom-ref": "277ae1b48a72026b", - "name": "/usr/lib/pkgconfig/nvrtc-13.2.pc", + "bom-ref": "c95ca77a3e1a5b48", + "name": "/usr/lib/pkgconfig/nvrtc-13.4.pc", "type": "file" }, { - "bom-ref": "c3c0211ae2e8f333", + "bom-ref": "85283b35319c0dbb", "name": "/usr/lib/python3.12/EXTERNALLY-MANAGED", "type": "file" }, { - "bom-ref": "2b213a1a95a9deec", + "bom-ref": "6b3ed461670bfde8", "name": "/usr/lib/python3.12/LICENSE.txt", "type": "file" }, { - "bom-ref": "7d4a99ac5bcc3029", + "bom-ref": "af426667a9d9a5b9", "name": "/usr/lib/python3.12/__future__.py", "type": "file" }, { - "bom-ref": "8523b477fbf6a2cf", + "bom-ref": "3ba25e4e8d60d49f", "name": "/usr/lib/python3.12/__hello__.py", "type": "file" }, { - "bom-ref": "51a40ec36615d673", + "bom-ref": "26e4031106085673", "name": "/usr/lib/python3.12/__phello__/__init__.py", "type": "file" }, { - "bom-ref": "29d1204f4721ac76", + "bom-ref": "be21acb77e450396", "name": "/usr/lib/python3.12/__phello__/spam.py", "type": "file" }, { - "bom-ref": "32acfb95c7302873", + "bom-ref": "c9ed66e2008d20bf", "name": "/usr/lib/python3.12/_aix_support.py", "type": "file" }, { - "bom-ref": "71d04f56948c5b46", + "bom-ref": "7ce033062ca87662", "name": "/usr/lib/python3.12/_collections_abc.py", "type": "file" }, { - "bom-ref": "ece30772f7cca532", + "bom-ref": "728a9c73c68b411a", "name": "/usr/lib/python3.12/_compat_pickle.py", "type": "file" }, { - "bom-ref": "093e58f3b31d3f01", + "bom-ref": "282c7c1ac5e46ba1", "name": "/usr/lib/python3.12/_compression.py", "type": "file" }, { - "bom-ref": "54488aca7c9279af", + "bom-ref": "27cf18f20ff2330f", "name": "/usr/lib/python3.12/_distutils_system_mod.py", "type": "file" }, { - "bom-ref": "52c32ea24858eb05", + "bom-ref": "cc9cf108a79c9d69", "name": "/usr/lib/python3.12/_markupbase.py", "type": "file" }, { - "bom-ref": "ce452de96af213ec", + "bom-ref": "766f6330ea49decc", "name": "/usr/lib/python3.12/_osx_support.py", "type": "file" }, { - "bom-ref": "54c07931759600a0", + "bom-ref": "df24e399cf39ae10", "name": "/usr/lib/python3.12/_py_abc.py", "type": "file" }, { - "bom-ref": "a9ee950d14c6ee8e", + "bom-ref": "2cf4558f1861723e", "name": "/usr/lib/python3.12/_pydatetime.py", "type": "file" }, { - "bom-ref": "34c2c998563d0e8f", + "bom-ref": "6f39ba84adc68fe3", "name": "/usr/lib/python3.12/_pydecimal.py", "type": "file" }, { - "bom-ref": "d2aef0f64260cba0", + "bom-ref": "da92d4f0833a4630", "name": "/usr/lib/python3.12/_pyio.py", "type": "file" }, { - "bom-ref": "f5c31a8d27423934", + "bom-ref": "e39dcfb3b1977668", "name": "/usr/lib/python3.12/_pylong.py", "type": "file" }, { - "bom-ref": "d3a180e5c9c79c95", + "bom-ref": "2b532ab459ebcbfd", "name": "/usr/lib/python3.12/_sitebuiltins.py", "type": "file" }, { - "bom-ref": "a2b8ea07a070d5c3", + "bom-ref": "45d0fa55e0907653", "name": "/usr/lib/python3.12/_strptime.py", "type": "file" }, { - "bom-ref": "e8f6109e00a0aa96", + "bom-ref": "47023e37142470de", "name": "/usr/lib/python3.12/_sysconfigdata__x86_64-linux-gnu.py", "type": "file" }, { - "bom-ref": "4f9d3a4c3dd1c588", + "bom-ref": "457ed5c76546e68c", "name": "/usr/lib/python3.12/_threading_local.py", "type": "file" }, { - "bom-ref": "5299c6d85c3a86ac", + "bom-ref": "a4fc23b967096510", "name": "/usr/lib/python3.12/_weakrefset.py", "type": "file" }, { - "bom-ref": "f5aab93b8273075d", + "bom-ref": "914cbd26b7b6def5", "name": "/usr/lib/python3.12/abc.py", "type": "file" }, { - "bom-ref": "2fbe879e9f2786fd", + "bom-ref": "e74f9664a27247f5", "name": "/usr/lib/python3.12/aifc.py", "type": "file" }, { - "bom-ref": "c87d87d87724017d", + "bom-ref": "abef3412151d3d1d", "name": "/usr/lib/python3.12/antigravity.py", "type": "file" }, { - "bom-ref": "825eff3781028eb0", + "bom-ref": "196170d3d41c5784", "name": "/usr/lib/python3.12/argparse.py", "type": "file" }, { - "bom-ref": "3b09194187f9c8a2", + "bom-ref": "75ff319d1570098a", "name": "/usr/lib/python3.12/ast.py", "type": "file" }, { - "bom-ref": "c32214b4bcd348fc", + "bom-ref": "3fe57f7db95658c4", "name": "/usr/lib/python3.12/asyncio/__init__.py", "type": "file" }, { - "bom-ref": "27f7c913a6fc89f5", + "bom-ref": "d0f97ceea31e4405", "name": "/usr/lib/python3.12/asyncio/__main__.py", "type": "file" }, { - "bom-ref": "0cad3701ccee18a4", + "bom-ref": "55041eadf5e230dc", "name": "/usr/lib/python3.12/asyncio/base_events.py", "type": "file" }, { - "bom-ref": "20398d42bf1b5902", + "bom-ref": "da39b42eaff88996", "name": "/usr/lib/python3.12/asyncio/base_futures.py", "type": "file" }, { - "bom-ref": "049c0676606dcd90", + "bom-ref": "0177db0d0749eb14", "name": "/usr/lib/python3.12/asyncio/base_subprocess.py", "type": "file" }, { - "bom-ref": "02ef38731d23936b", + "bom-ref": "5d3a5ae7d44ba68b", "name": "/usr/lib/python3.12/asyncio/base_tasks.py", "type": "file" }, { - "bom-ref": "5abb5c9916e0cf7f", + "bom-ref": "b8404714434597d7", "name": "/usr/lib/python3.12/asyncio/constants.py", "type": "file" }, { - "bom-ref": "3cedd52e02cd4c15", + "bom-ref": "132088445b7943dd", "name": "/usr/lib/python3.12/asyncio/coroutines.py", "type": "file" }, { - "bom-ref": "0021d9b5120f0254", + "bom-ref": "b99053b0e46c91e4", "name": "/usr/lib/python3.12/asyncio/events.py", "type": "file" }, { - "bom-ref": "9f8fa955b5cc0fa1", + "bom-ref": "1087aa6474255511", "name": "/usr/lib/python3.12/asyncio/exceptions.py", "type": "file" }, { - "bom-ref": "aa51a0ae014d5635", + "bom-ref": "f57b407f1436a02d", "name": "/usr/lib/python3.12/asyncio/format_helpers.py", "type": "file" }, { - "bom-ref": "32ae0eabdb29d53d", + "bom-ref": "16fae7e1efee4575", "name": "/usr/lib/python3.12/asyncio/futures.py", "type": "file" }, { - "bom-ref": "ad1f3dbf32421579", + "bom-ref": "bd4a769a228c6e39", "name": "/usr/lib/python3.12/asyncio/locks.py", "type": "file" }, { - "bom-ref": "6b13d0c5ccc43abd", + "bom-ref": "42d95e9409c39a39", "name": "/usr/lib/python3.12/asyncio/log.py", "type": "file" }, { - "bom-ref": "1a996c41743dbab5", + "bom-ref": "74f30ce3a4f3f339", "name": "/usr/lib/python3.12/asyncio/mixins.py", "type": "file" }, { - "bom-ref": "74725d3eead27053", + "bom-ref": "5df908be8a1cfb2b", "name": "/usr/lib/python3.12/asyncio/proactor_events.py", "type": "file" }, { - "bom-ref": "0a018d6e8b4321fc", + "bom-ref": "dd04accccc2ea128", "name": "/usr/lib/python3.12/asyncio/protocols.py", "type": "file" }, { - "bom-ref": "4c12e5dfa2abe521", + "bom-ref": "0c8d29fed825eb71", "name": "/usr/lib/python3.12/asyncio/queues.py", "type": "file" }, { - "bom-ref": "bbc1e09d3f44c23e", + "bom-ref": "8b8262d971b4cff2", "name": "/usr/lib/python3.12/asyncio/runners.py", "type": "file" }, { - "bom-ref": "81d73f64a11a3b03", + "bom-ref": "e9aae6f6db487bbb", "name": "/usr/lib/python3.12/asyncio/selector_events.py", "type": "file" }, { - "bom-ref": "fddeaa0da1bbc9ed", + "bom-ref": "7cd5333b51511ef1", "name": "/usr/lib/python3.12/asyncio/sslproto.py", "type": "file" }, { - "bom-ref": "8bb9dbdde4680d65", + "bom-ref": "b1d2489e3fc5e4dd", "name": "/usr/lib/python3.12/asyncio/staggered.py", "type": "file" }, { - "bom-ref": "19a2cc31d7e76656", + "bom-ref": "d433cc8ab8b08f6e", "name": "/usr/lib/python3.12/asyncio/streams.py", "type": "file" }, { - "bom-ref": "7386d5759a1abfa6", + "bom-ref": "b25b37161b537dae", "name": "/usr/lib/python3.12/asyncio/subprocess.py", "type": "file" }, { - "bom-ref": "525308d3647694d2", + "bom-ref": "3fe2242e4a812c8e", "name": "/usr/lib/python3.12/asyncio/taskgroups.py", "type": "file" }, { - "bom-ref": "a96a0d74a5f3f338", + "bom-ref": "7bf0c7c0bf420a3c", "name": "/usr/lib/python3.12/asyncio/tasks.py", "type": "file" }, { - "bom-ref": "6447f4ce1b3bca93", + "bom-ref": "75593382bbbca833", "name": "/usr/lib/python3.12/asyncio/threads.py", "type": "file" }, { - "bom-ref": "4ede6b7dcc36b548", + "bom-ref": "54ca68c2a3543a4c", "name": "/usr/lib/python3.12/asyncio/timeouts.py", "type": "file" }, { - "bom-ref": "7deb392c99ea9382", + "bom-ref": "f9dbbb9efd17dfd6", "name": "/usr/lib/python3.12/asyncio/transports.py", "type": "file" }, { - "bom-ref": "587b01b42e9af319", + "bom-ref": "8dfa172096e48a4d", "name": "/usr/lib/python3.12/asyncio/trsock.py", "type": "file" }, { - "bom-ref": "85d67590967c9e9f", + "bom-ref": "c042c579148740c3", "name": "/usr/lib/python3.12/asyncio/unix_events.py", "type": "file" }, { - "bom-ref": "c46763fff5b8d6f7", + "bom-ref": "5eb6f8aa69e58dab", "name": "/usr/lib/python3.12/asyncio/windows_events.py", "type": "file" }, { - "bom-ref": "85a8970b43286a8a", + "bom-ref": "577ace92bd589626", "name": "/usr/lib/python3.12/asyncio/windows_utils.py", "type": "file" }, { - "bom-ref": "cd5530d67f74eb5e", + "bom-ref": "d1d96d8bebad41ba", "name": "/usr/lib/python3.12/base64.py", "type": "file" }, { - "bom-ref": "c3b456eb6b280826", + "bom-ref": "34174d6fdea63472", "name": "/usr/lib/python3.12/bdb.py", "type": "file" }, { - "bom-ref": "c1df95ce7b6f10ca", + "bom-ref": "972b4b979ab02fa6", "name": "/usr/lib/python3.12/bisect.py", "type": "file" }, { - "bom-ref": "520d6bb6f633acd9", + "bom-ref": "f8d777d6689201ed", "name": "/usr/lib/python3.12/bz2.py", "type": "file" }, { - "bom-ref": "eb30b93ce0142d5c", + "bom-ref": "8182a7149740736c", "name": "/usr/lib/python3.12/cProfile.py", "type": "file" }, { - "bom-ref": "43e9add14e096a68", + "bom-ref": "043762b042b8d098", "name": "/usr/lib/python3.12/calendar.py", "type": "file" }, { - "bom-ref": "066bd527f53cd2ff", + "bom-ref": "2f2d48f15b0cccef", "name": "/usr/lib/python3.12/cgi.py", "type": "file" }, { - "bom-ref": "44d99127e746c542", + "bom-ref": "34e9089b10f128a2", "name": "/usr/lib/python3.12/cgitb.py", "type": "file" }, { - "bom-ref": "1bd0a28f660fc101", + "bom-ref": "425d1be172033069", "name": "/usr/lib/python3.12/chunk.py", "type": "file" }, { - "bom-ref": "8804cc000db6dbd3", + "bom-ref": "f02f991c39d1fcd7", "name": "/usr/lib/python3.12/cmd.py", "type": "file" }, { - "bom-ref": "3f86cd81d7dd675a", + "bom-ref": "733913e22a84b8b2", "name": "/usr/lib/python3.12/code.py", "type": "file" }, { - "bom-ref": "7857a1de7cfd6d51", + "bom-ref": "45c4425f9cd08f75", "name": "/usr/lib/python3.12/codecs.py", "type": "file" }, { - "bom-ref": "b16eebffee663d23", + "bom-ref": "7159954293891287", "name": "/usr/lib/python3.12/codeop.py", "type": "file" }, { - "bom-ref": "1cca25487f7e9f75", + "bom-ref": "daf6ad879ff8ced5", "name": "/usr/lib/python3.12/collections/__init__.py", "type": "file" }, { - "bom-ref": "64802a5c40e74005", + "bom-ref": "a056684c6367f011", "name": "/usr/lib/python3.12/collections/abc.py", "type": "file" }, { - "bom-ref": "bc97100b6c57d7b3", + "bom-ref": "bad0d9146e2a08fb", "name": "/usr/lib/python3.12/colorsys.py", "type": "file" }, { - "bom-ref": "cab000d833457f3c", + "bom-ref": "527e88c613a25b48", "name": "/usr/lib/python3.12/compileall.py", "type": "file" }, { - "bom-ref": "fbfc4a5f3b8721cc", + "bom-ref": "9593c8322631ef18", "name": "/usr/lib/python3.12/concurrent/__init__.py", "type": "file" }, { - "bom-ref": "6e4993b5756e51f3", + "bom-ref": "4a24f922a4961543", "name": "/usr/lib/python3.12/concurrent/futures/__init__.py", "type": "file" }, { - "bom-ref": "f80e4cc2cf0f0e2c", + "bom-ref": "c61125382c8c6968", "name": "/usr/lib/python3.12/concurrent/futures/_base.py", "type": "file" }, { - "bom-ref": "81087589f5cb5c52", + "bom-ref": "780cc47ab6217a52", "name": "/usr/lib/python3.12/concurrent/futures/process.py", "type": "file" }, { - "bom-ref": "3775b3d224df2488", + "bom-ref": "cba5b2029a7eb188", "name": "/usr/lib/python3.12/concurrent/futures/thread.py", "type": "file" }, { - "bom-ref": "14a8d7a7561cd806", + "bom-ref": "51284bdf468f4bd4", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/Makefile", "type": "file" }, { - "bom-ref": "08aac3bfd3f8c253", + "bom-ref": "b50b34949a74585d", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup", "type": "file" }, { - "bom-ref": "815b18a7f7d72c9c", + "bom-ref": "9b7b4b9b63a770b6", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup.bootstrap", "type": "file" }, { - "bom-ref": "7a73090263f229c0", + "bom-ref": "93db0fe7ea391542", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup.local", "type": "file" }, { - "bom-ref": "c7ba27aae18b6293", + "bom-ref": "9ff26ad43184954d", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup.stdlib", "type": "file" }, { - "bom-ref": "df952e8c9298f8c7", + "bom-ref": "d3070828f5461259", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/config.c", "type": "file" }, { - "bom-ref": "df78c015512ce8ea", + "bom-ref": "950f09c5d3ee9bb4", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/config.c.in", "type": "file" }, { - "bom-ref": "6246ff439458dd5a", + "bom-ref": "3d5c4ba0750c4adc", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/install-sh", "type": "file" }, { - "bom-ref": "274a4b18a5d8bc78", + "bom-ref": "c3f7c276ed900ae2", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/libpython3.12-pic.a", "type": "file" }, { - "bom-ref": "588d484e07b00b40", + "bom-ref": "f7ec57edd0831f4a", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/libpython3.12.a", "type": "file" }, { - "bom-ref": "f665e4395746ee54", + "bom-ref": "04d8c77cfe8f3142", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/makesetup", "type": "file" }, { - "bom-ref": "69d348d7da7f78c5", + "bom-ref": "e567b3adeb47ffbf", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/python-config.py", "type": "file" }, { - "bom-ref": "04477574841e64a7", + "bom-ref": "2750090b57a57eed", "name": "/usr/lib/python3.12/config-3.12-x86_64-linux-gnu/python.o", "type": "file" }, { - "bom-ref": "5726d4e5b2157365", + "bom-ref": "b3ed5b95b1362da1", "name": "/usr/lib/python3.12/configparser.py", "type": "file" }, { - "bom-ref": "bbab9cd8d5089d7a", + "bom-ref": "e84192facf6cd7da", "name": "/usr/lib/python3.12/contextlib.py", "type": "file" }, { - "bom-ref": "a57eba8a7c704da6", + "bom-ref": "7c508c4cba6bd56a", "name": "/usr/lib/python3.12/contextvars.py", "type": "file" }, { - "bom-ref": "b5b32b9c37a0d5b5", + "bom-ref": "11f012f1c6b34ab9", "name": "/usr/lib/python3.12/copy.py", "type": "file" }, { - "bom-ref": "59239b03cb7e3463", + "bom-ref": "ee61ed0de0d0b15f", "name": "/usr/lib/python3.12/copyreg.py", "type": "file" }, { - "bom-ref": "eaa4e9e529af7994", + "bom-ref": "cd72e7294982ea20", "name": "/usr/lib/python3.12/crypt.py", "type": "file" }, { - "bom-ref": "f3e71be6cf18f4f0", + "bom-ref": "8ddef4cdc1b7c8c0", "name": "/usr/lib/python3.12/csv.py", "type": "file" }, { - "bom-ref": "eb6066fc8ed3e648", + "bom-ref": "b0afad7c0f23c394", "name": "/usr/lib/python3.12/ctypes/__init__.py", "type": "file" }, { - "bom-ref": "92afbb06c369a893", + "bom-ref": "da589c6e06aaaf83", "name": "/usr/lib/python3.12/ctypes/_aix.py", "type": "file" }, { - "bom-ref": "62f5b236edabfad8", + "bom-ref": "125d655de62fdee4", "name": "/usr/lib/python3.12/ctypes/_endian.py", "type": "file" }, { - "bom-ref": "3f2b80c8d6843d3e", + "bom-ref": "f4b08cb01716352e", "name": "/usr/lib/python3.12/ctypes/util.py", "type": "file" }, { - "bom-ref": "e94f0db9da26ac64", + "bom-ref": "258b29ae1bfab650", "name": "/usr/lib/python3.12/ctypes/wintypes.py", "type": "file" }, { - "bom-ref": "0358fa37cda493d0", + "bom-ref": "e0ebaf1f781e662c", "name": "/usr/lib/python3.12/curses/__init__.py", "type": "file" }, { - "bom-ref": "d1f957e220d79818", + "bom-ref": "addc63e9e1c636f8", "name": "/usr/lib/python3.12/curses/ascii.py", "type": "file" }, { - "bom-ref": "cb566dcfa63395f4", + "bom-ref": "d3449cd59d999660", "name": "/usr/lib/python3.12/curses/has_key.py", "type": "file" }, { - "bom-ref": "7a8ed10ffab6e21b", + "bom-ref": "6e6b08558df434e7", "name": "/usr/lib/python3.12/curses/panel.py", "type": "file" }, { - "bom-ref": "ffa6e3fcbb9ee4df", + "bom-ref": "b41b94dce3c9e7c3", "name": "/usr/lib/python3.12/curses/textpad.py", "type": "file" }, { - "bom-ref": "68fb4100a6379456", + "bom-ref": "8c283a765fa0741a", "name": "/usr/lib/python3.12/dataclasses.py", "type": "file" }, { - "bom-ref": "9b75f9572e29003a", + "bom-ref": "6d9ae890f3a8e2aa", "name": "/usr/lib/python3.12/datetime.py", "type": "file" }, { - "bom-ref": "d22fac47e6dc3882", + "bom-ref": "aa862cbc811e8ab2", "name": "/usr/lib/python3.12/dbm/__init__.py", "type": "file" }, { - "bom-ref": "8dc13c9a177c5d3f", + "bom-ref": "c62e24c06f04d917", "name": "/usr/lib/python3.12/dbm/dumb.py", "type": "file" }, { - "bom-ref": "9df79eb28e20559f", + "bom-ref": "d529a1767e904f4b", "name": "/usr/lib/python3.12/dbm/gnu.py", "type": "file" }, { - "bom-ref": "d9de3022598b5b3f", + "bom-ref": "46a53eb1149809e7", "name": "/usr/lib/python3.12/dbm/ndbm.py", "type": "file" }, { - "bom-ref": "a5158dfae4af83b0", + "bom-ref": "f56cb2822bb1caf0", "name": "/usr/lib/python3.12/decimal.py", "type": "file" }, { - "bom-ref": "8943fdfb33501f50", + "bom-ref": "83fc7818980fa724", "name": "/usr/lib/python3.12/difflib.py", "type": "file" }, { - "bom-ref": "72e2eb84642616f6", + "bom-ref": "219e53beef073cae", "name": "/usr/lib/python3.12/dis.py", "type": "file" }, { - "bom-ref": "cb0b7903879e6492", + "bom-ref": "e761fbcb51f86d2e", "name": "/usr/lib/python3.12/doctest.py", "type": "file" }, { - "bom-ref": "23bc1744e08dc488", + "bom-ref": "dd03b40e2b7b3f6c", "name": "/usr/lib/python3.12/email/__init__.py", "type": "file" }, { - "bom-ref": "e841f1435fc9cabc", + "bom-ref": "331063bb4d012d50", "name": "/usr/lib/python3.12/email/_encoded_words.py", "type": "file" }, { - "bom-ref": "1cbd252186ff7426", + "bom-ref": "5804fa2c1b4c03c2", "name": "/usr/lib/python3.12/email/_header_value_parser.py", "type": "file" }, { - "bom-ref": "c988d51e73f5ade5", + "bom-ref": "12b2a928b48ddcfd", "name": "/usr/lib/python3.12/email/_parseaddr.py", "type": "file" }, { - "bom-ref": "6f66e8f8a05762e3", + "bom-ref": "7618c022875090ef", "name": "/usr/lib/python3.12/email/_policybase.py", "type": "file" }, { - "bom-ref": "a6765d740b85c9a9", + "bom-ref": "aa07ece49ad7c411", "name": "/usr/lib/python3.12/email/architecture.rst", "type": "file" }, { - "bom-ref": "37dc6f63048415fe", + "bom-ref": "f618bd393d8c29b6", "name": "/usr/lib/python3.12/email/base64mime.py", "type": "file" }, { - "bom-ref": "07f52e7253f1792f", + "bom-ref": "ae9f0ede87bbbaff", "name": "/usr/lib/python3.12/email/charset.py", "type": "file" }, { - "bom-ref": "d9c41208afcdf002", + "bom-ref": "45013f74f7a8ed26", "name": "/usr/lib/python3.12/email/contentmanager.py", "type": "file" }, { - "bom-ref": "ef0569d79ff207d4", + "bom-ref": "fae8693dd2e03798", "name": "/usr/lib/python3.12/email/encoders.py", "type": "file" }, { - "bom-ref": "9a56c7f1ba834ba7", + "bom-ref": "5ddd5b4b023f2f03", "name": "/usr/lib/python3.12/email/errors.py", "type": "file" }, { - "bom-ref": "06afed9cdd98a410", + "bom-ref": "e74ac4317e7274c0", "name": "/usr/lib/python3.12/email/feedparser.py", "type": "file" }, { - "bom-ref": "74da47991af80cb5", + "bom-ref": "f35d09c56d1f48e1", "name": "/usr/lib/python3.12/email/generator.py", "type": "file" }, { - "bom-ref": "3600fd62759866cf", + "bom-ref": "f83a7acb071ce01b", "name": "/usr/lib/python3.12/email/header.py", "type": "file" }, { - "bom-ref": "31e31ce7a9a5a092", + "bom-ref": "7dc53d75ece6fc66", "name": "/usr/lib/python3.12/email/headerregistry.py", "type": "file" }, { - "bom-ref": "d507458964090b8e", + "bom-ref": "8aca6c2278c09ec6", "name": "/usr/lib/python3.12/email/iterators.py", "type": "file" }, { - "bom-ref": "6f86db4f465c8222", + "bom-ref": "6080b057aa4fc26e", "name": "/usr/lib/python3.12/email/message.py", "type": "file" }, { - "bom-ref": "36d5208330615e24", + "bom-ref": "fcac22fe85a62950", "name": "/usr/lib/python3.12/email/mime/__init__.py", "type": "file" }, { - "bom-ref": "51969605d6b3dbe5", + "bom-ref": "521db855ebf2d4c5", "name": "/usr/lib/python3.12/email/mime/application.py", "type": "file" }, { - "bom-ref": "926ce8a602901cc3", + "bom-ref": "9c63033998687b43", "name": "/usr/lib/python3.12/email/mime/audio.py", "type": "file" }, { - "bom-ref": "01ea8b5dcd104c3d", + "bom-ref": "9b1d3cd8a75cc951", "name": "/usr/lib/python3.12/email/mime/base.py", "type": "file" }, { - "bom-ref": "d9fd8b88302fcb4e", + "bom-ref": "e74079bd00dde77a", "name": "/usr/lib/python3.12/email/mime/image.py", "type": "file" }, { - "bom-ref": "5f9e42cb8d0f6f41", + "bom-ref": "d61e992eec01e4b9", "name": "/usr/lib/python3.12/email/mime/message.py", "type": "file" }, { - "bom-ref": "94e6a09adc7df21b", + "bom-ref": "89129cb92c578563", "name": "/usr/lib/python3.12/email/mime/multipart.py", "type": "file" }, { - "bom-ref": "215b40584ac5518e", + "bom-ref": "2e6d76ae09cf2662", "name": "/usr/lib/python3.12/email/mime/nonmultipart.py", "type": "file" }, { - "bom-ref": "0d61a93fa45a259a", + "bom-ref": "5f1df54814ed234a", "name": "/usr/lib/python3.12/email/mime/text.py", "type": "file" }, { - "bom-ref": "ad6650d54f58c12e", + "bom-ref": "2f2f78a8383681f6", "name": "/usr/lib/python3.12/email/parser.py", "type": "file" }, { - "bom-ref": "dff0515e1c2eb4a8", + "bom-ref": "b478d7b07f3e00b0", "name": "/usr/lib/python3.12/email/policy.py", "type": "file" }, { - "bom-ref": "39737497d158656d", + "bom-ref": "698461c3336a88b9", "name": "/usr/lib/python3.12/email/quoprimime.py", "type": "file" }, { - "bom-ref": "8c30ecc3d73d5843", + "bom-ref": "e982fd2683f74653", "name": "/usr/lib/python3.12/email/utils.py", "type": "file" }, { - "bom-ref": "cbfcf2baab4bfb4d", + "bom-ref": "a7547e811529268d", "name": "/usr/lib/python3.12/encodings/__init__.py", "type": "file" }, { - "bom-ref": "9485c7127d6ab370", + "bom-ref": "e4adc08847eb17ac", "name": "/usr/lib/python3.12/encodings/aliases.py", "type": "file" }, { - "bom-ref": "eecc2048338149d5", + "bom-ref": "b641b75029bf3fa1", "name": "/usr/lib/python3.12/encodings/ascii.py", "type": "file" }, { - "bom-ref": "af3b2c12bf31214f", + "bom-ref": "07e5c75ed85da12f", "name": "/usr/lib/python3.12/encodings/base64_codec.py", "type": "file" }, { - "bom-ref": "94728564f93d1ff1", + "bom-ref": "0af0910c8f700fc5", "name": "/usr/lib/python3.12/encodings/big5.py", "type": "file" }, { - "bom-ref": "4e486df352a64c59", + "bom-ref": "68f84d9c8fdc35a1", "name": "/usr/lib/python3.12/encodings/big5hkscs.py", "type": "file" }, { - "bom-ref": "8cd86348c43f4c34", + "bom-ref": "11bb57849e58482c", "name": "/usr/lib/python3.12/encodings/bz2_codec.py", "type": "file" }, { - "bom-ref": "282afc0e49caf348", + "bom-ref": "f60b1fdcddb7ed78", "name": "/usr/lib/python3.12/encodings/charmap.py", "type": "file" }, { - "bom-ref": "c8104a79b8ac6f77", + "bom-ref": "f035c3159fc640e3", "name": "/usr/lib/python3.12/encodings/cp037.py", "type": "file" }, { - "bom-ref": "e580f1a6f28203ca", + "bom-ref": "ca57e598a95f0e4e", "name": "/usr/lib/python3.12/encodings/cp1006.py", "type": "file" }, { - "bom-ref": "9087cb39c7c6b17b", + "bom-ref": "abef28e47baa4f33", "name": "/usr/lib/python3.12/encodings/cp1026.py", "type": "file" }, { - "bom-ref": "bc9dc2696c9b9859", + "bom-ref": "b0b76b05ed2e5d21", "name": "/usr/lib/python3.12/encodings/cp1125.py", "type": "file" }, { - "bom-ref": "67a1b567c8e6f87e", + "bom-ref": "60bf4c72fdccee72", "name": "/usr/lib/python3.12/encodings/cp1140.py", "type": "file" }, { - "bom-ref": "30aa8fe45a7a6e6b", + "bom-ref": "d4852a1e03658d7b", "name": "/usr/lib/python3.12/encodings/cp1250.py", "type": "file" }, { - "bom-ref": "5cdf4bb14e1267f2", + "bom-ref": "7d0c1c82f883d622", "name": "/usr/lib/python3.12/encodings/cp1251.py", "type": "file" }, { - "bom-ref": "a0369aefb2285fc1", + "bom-ref": "12d0635d6973076d", "name": "/usr/lib/python3.12/encodings/cp1252.py", "type": "file" }, { - "bom-ref": "fb2cbbebbed662e6", + "bom-ref": "7938b0eac8743ac2", "name": "/usr/lib/python3.12/encodings/cp1253.py", "type": "file" }, { - "bom-ref": "47fbc1415d9062d8", + "bom-ref": "365a7086d9ecf840", "name": "/usr/lib/python3.12/encodings/cp1254.py", "type": "file" }, { - "bom-ref": "f484e765db045ad7", + "bom-ref": "4dc1280a76c28d63", "name": "/usr/lib/python3.12/encodings/cp1255.py", "type": "file" }, { - "bom-ref": "a1e2bfa017a241ca", + "bom-ref": "26cdf423109d3046", "name": "/usr/lib/python3.12/encodings/cp1256.py", "type": "file" }, { - "bom-ref": "aa403c6e0e714e43", + "bom-ref": "172fdf291d738127", "name": "/usr/lib/python3.12/encodings/cp1257.py", "type": "file" }, { - "bom-ref": "9d468bcdad5259a4", + "bom-ref": "284af6961a480f00", "name": "/usr/lib/python3.12/encodings/cp1258.py", "type": "file" }, { - "bom-ref": "2d00cbb2008c960f", + "bom-ref": "439635c918a95b9f", "name": "/usr/lib/python3.12/encodings/cp273.py", "type": "file" }, { - "bom-ref": "80ed885ecff0d79a", + "bom-ref": "96131804e0cb798a", "name": "/usr/lib/python3.12/encodings/cp424.py", "type": "file" }, { - "bom-ref": "4084b7ba64a4ac16", + "bom-ref": "6fc6e0bbb831ac52", "name": "/usr/lib/python3.12/encodings/cp437.py", "type": "file" }, { - "bom-ref": "5e16485106fb69e2", + "bom-ref": "d1f1015e4b450b12", "name": "/usr/lib/python3.12/encodings/cp500.py", "type": "file" }, { - "bom-ref": "82dc72f6c86fded4", + "bom-ref": "5bef7ad732667718", "name": "/usr/lib/python3.12/encodings/cp720.py", "type": "file" }, { - "bom-ref": "6334e7ffff6995d3", + "bom-ref": "a799bc9c33ed0513", "name": "/usr/lib/python3.12/encodings/cp737.py", "type": "file" }, { - "bom-ref": "d6039060486aa4b0", + "bom-ref": "9b0dbca9ca1ae674", "name": "/usr/lib/python3.12/encodings/cp775.py", "type": "file" }, { - "bom-ref": "f64968383874ec16", + "bom-ref": "40c80203a16a4a8e", "name": "/usr/lib/python3.12/encodings/cp850.py", "type": "file" }, { - "bom-ref": "fb5e40f88d25095a", + "bom-ref": "b747089674fff872", "name": "/usr/lib/python3.12/encodings/cp852.py", "type": "file" }, { - "bom-ref": "85cc2f1ffec01f06", + "bom-ref": "5913579877cabcde", "name": "/usr/lib/python3.12/encodings/cp855.py", "type": "file" }, { - "bom-ref": "a8c7abe64217597f", + "bom-ref": "42f14e9fb2f8b077", "name": "/usr/lib/python3.12/encodings/cp856.py", "type": "file" }, { - "bom-ref": "edfb50778478a937", + "bom-ref": "3c1b57e93b2c3143", "name": "/usr/lib/python3.12/encodings/cp857.py", "type": "file" }, { - "bom-ref": "8c4e8da9485fddd7", + "bom-ref": "d431bacadab45123", "name": "/usr/lib/python3.12/encodings/cp858.py", "type": "file" }, { - "bom-ref": "f68657c11f2b18f4", + "bom-ref": "fde156bf51c8b128", "name": "/usr/lib/python3.12/encodings/cp860.py", "type": "file" }, { - "bom-ref": "23e349fca541d891", + "bom-ref": "dec9b7fc11fb9ead", "name": "/usr/lib/python3.12/encodings/cp861.py", "type": "file" }, { - "bom-ref": "48c56aa81e572ebe", + "bom-ref": "2ce4ef763bdade02", "name": "/usr/lib/python3.12/encodings/cp862.py", "type": "file" }, { - "bom-ref": "1d5c7ae9492acdf8", + "bom-ref": "c539e9db51b7e7ec", "name": "/usr/lib/python3.12/encodings/cp863.py", "type": "file" }, { - "bom-ref": "d279deb063507aa3", + "bom-ref": "ed0a5a6c44d5b70b", "name": "/usr/lib/python3.12/encodings/cp864.py", "type": "file" }, { - "bom-ref": "13cea242e764f44b", + "bom-ref": "462e732097551307", "name": "/usr/lib/python3.12/encodings/cp865.py", "type": "file" }, { - "bom-ref": "0665f79c8a991f0e", + "bom-ref": "1cfa7a2eec4e0f12", "name": "/usr/lib/python3.12/encodings/cp866.py", "type": "file" }, { - "bom-ref": "68b9fc84b99e4bbe", + "bom-ref": "c9ebce1eee8720a2", "name": "/usr/lib/python3.12/encodings/cp869.py", "type": "file" }, { - "bom-ref": "49b9282d0d4d37b3", + "bom-ref": "7429fa9721316673", "name": "/usr/lib/python3.12/encodings/cp874.py", "type": "file" }, { - "bom-ref": "b35de261a29bfa7c", + "bom-ref": "896e3ec5a05b76a4", "name": "/usr/lib/python3.12/encodings/cp875.py", "type": "file" }, { - "bom-ref": "b66258c8284e8314", + "bom-ref": "bd4fd19006e88968", "name": "/usr/lib/python3.12/encodings/cp932.py", "type": "file" }, { - "bom-ref": "e7d99fee07a6687d", + "bom-ref": "24905b287e91e769", "name": "/usr/lib/python3.12/encodings/cp949.py", "type": "file" }, { - "bom-ref": "ab876701dd8c9f4e", + "bom-ref": "6180271e8dfd7026", "name": "/usr/lib/python3.12/encodings/cp950.py", "type": "file" }, { - "bom-ref": "b212135ce6f392ec", + "bom-ref": "5111061d12235524", "name": "/usr/lib/python3.12/encodings/euc_jis_2004.py", "type": "file" }, { - "bom-ref": "2679bdaba916e650", + "bom-ref": "017c2096dc7b2f94", "name": "/usr/lib/python3.12/encodings/euc_jisx0213.py", "type": "file" }, { - "bom-ref": "209f5125f7064962", + "bom-ref": "5b0acff3ba878cca", "name": "/usr/lib/python3.12/encodings/euc_jp.py", "type": "file" }, { - "bom-ref": "d57f63321b764ccc", + "bom-ref": "056a0512a5bfda2c", "name": "/usr/lib/python3.12/encodings/euc_kr.py", "type": "file" }, { - "bom-ref": "79a79892e5c4cdea", + "bom-ref": "88e697a13fb42f7a", "name": "/usr/lib/python3.12/encodings/gb18030.py", "type": "file" }, { - "bom-ref": "bb76fe7461e3942c", + "bom-ref": "c2bea2339f859afc", "name": "/usr/lib/python3.12/encodings/gb2312.py", "type": "file" }, { - "bom-ref": "043e2e250b028570", + "bom-ref": "44cb3590d6dbaad0", "name": "/usr/lib/python3.12/encodings/gbk.py", "type": "file" }, { - "bom-ref": "88abb91860eb8d21", + "bom-ref": "8ddf9eec795e6c35", "name": "/usr/lib/python3.12/encodings/hex_codec.py", "type": "file" }, { - "bom-ref": "1fcac89ea109cab4", + "bom-ref": "f802696494ae2ecc", "name": "/usr/lib/python3.12/encodings/hp_roman8.py", "type": "file" }, { - "bom-ref": "505ffa45bf033e52", + "bom-ref": "ae0035729c28eed2", "name": "/usr/lib/python3.12/encodings/hz.py", "type": "file" }, { - "bom-ref": "bc96729a7f2c0afa", + "bom-ref": "48a1f87ac1e2054e", "name": "/usr/lib/python3.12/encodings/idna.py", "type": "file" }, { - "bom-ref": "6c03a90ee87bdd8b", + "bom-ref": "108aab446e306623", "name": "/usr/lib/python3.12/encodings/iso2022_jp.py", "type": "file" }, { - "bom-ref": "18ff645dc5a1c9a2", + "bom-ref": "dcc367e242febaaa", "name": "/usr/lib/python3.12/encodings/iso2022_jp_1.py", "type": "file" }, { - "bom-ref": "ed300ff7d2ca3087", + "bom-ref": "d3d02c7b28a90eaf", "name": "/usr/lib/python3.12/encodings/iso2022_jp_2.py", "type": "file" }, { - "bom-ref": "1775ae9ceb9a784e", + "bom-ref": "179769fc50128bb2", "name": "/usr/lib/python3.12/encodings/iso2022_jp_2004.py", "type": "file" }, { - "bom-ref": "0ef0b309dcf16657", + "bom-ref": "dff3138193f86d3b", "name": "/usr/lib/python3.12/encodings/iso2022_jp_3.py", "type": "file" }, { - "bom-ref": "f0a69f8bddd701ca", + "bom-ref": "6319ebba36e7b716", "name": "/usr/lib/python3.12/encodings/iso2022_jp_ext.py", "type": "file" }, { - "bom-ref": "2b89f33a0f64bb1b", + "bom-ref": "baa53422fd5be45b", "name": "/usr/lib/python3.12/encodings/iso2022_kr.py", "type": "file" }, { - "bom-ref": "95bb8d61266db643", + "bom-ref": "d49d8cb993a8c983", "name": "/usr/lib/python3.12/encodings/iso8859_1.py", "type": "file" }, { - "bom-ref": "19f5724c92858e16", + "bom-ref": "8e5ff1e2a1f5ebc6", "name": "/usr/lib/python3.12/encodings/iso8859_10.py", "type": "file" }, { - "bom-ref": "699a711fa74d6959", + "bom-ref": "b19b16f7ba062f05", "name": "/usr/lib/python3.12/encodings/iso8859_11.py", "type": "file" }, { - "bom-ref": "4034861660d5dbb9", + "bom-ref": "e3a090e9ef6bf159", "name": "/usr/lib/python3.12/encodings/iso8859_13.py", "type": "file" }, { - "bom-ref": "f27700d5aa17518a", + "bom-ref": "b4e33fbf851ae2c6", "name": "/usr/lib/python3.12/encodings/iso8859_14.py", "type": "file" }, { - "bom-ref": "7216622acd43ecea", + "bom-ref": "aeaa744e9846aaca", "name": "/usr/lib/python3.12/encodings/iso8859_15.py", "type": "file" }, { - "bom-ref": "511fcebb43db30f3", + "bom-ref": "3b3b3bc52fa87fc7", "name": "/usr/lib/python3.12/encodings/iso8859_16.py", "type": "file" }, { - "bom-ref": "fbf41fb5fb7c4d85", + "bom-ref": "8cdc2eb7cce58209", "name": "/usr/lib/python3.12/encodings/iso8859_2.py", "type": "file" }, { - "bom-ref": "b77064c6012e2b9c", + "bom-ref": "27ff66d86062fc34", "name": "/usr/lib/python3.12/encodings/iso8859_3.py", "type": "file" }, { - "bom-ref": "486957f21a92afe6", + "bom-ref": "5f47b5260d50ba1a", "name": "/usr/lib/python3.12/encodings/iso8859_4.py", "type": "file" }, { - "bom-ref": "bc17aee40fb02e68", + "bom-ref": "69332b04c64bacc4", "name": "/usr/lib/python3.12/encodings/iso8859_5.py", "type": "file" }, { - "bom-ref": "39bb183ee1f01494", + "bom-ref": "226e2df20f87c5a0", "name": "/usr/lib/python3.12/encodings/iso8859_6.py", "type": "file" }, { - "bom-ref": "c54f4e375c462e41", + "bom-ref": "c2d8c55ad0c56561", "name": "/usr/lib/python3.12/encodings/iso8859_7.py", "type": "file" }, { - "bom-ref": "8a0c0fed140875fc", + "bom-ref": "a97f91a8cdcb0f88", "name": "/usr/lib/python3.12/encodings/iso8859_8.py", "type": "file" }, { - "bom-ref": "f9bb528791d3899f", + "bom-ref": "e21997a1c6e33503", "name": "/usr/lib/python3.12/encodings/iso8859_9.py", "type": "file" }, { - "bom-ref": "2780d11a4a94af5a", + "bom-ref": "b0400baf95063aae", "name": "/usr/lib/python3.12/encodings/johab.py", "type": "file" }, { - "bom-ref": "fa3d65ca4f8a513b", + "bom-ref": "6580eab445f94937", "name": "/usr/lib/python3.12/encodings/koi8_r.py", "type": "file" }, { - "bom-ref": "2ff96c0e8af8f99a", + "bom-ref": "fe3c250345defdf2", "name": "/usr/lib/python3.12/encodings/koi8_t.py", "type": "file" }, { - "bom-ref": "71f86f5a702d1326", + "bom-ref": "843c4c144428365a", "name": "/usr/lib/python3.12/encodings/koi8_u.py", "type": "file" }, { - "bom-ref": "adad0435dc1e105b", + "bom-ref": "6af986c1be65178b", "name": "/usr/lib/python3.12/encodings/kz1048.py", "type": "file" }, { - "bom-ref": "f015c69a4e2bd2e2", + "bom-ref": "b7eb02f20c099092", "name": "/usr/lib/python3.12/encodings/latin_1.py", "type": "file" }, { - "bom-ref": "6eefd4592499425d", + "bom-ref": "c8de91f0bb43d12d", "name": "/usr/lib/python3.12/encodings/mac_arabic.py", "type": "file" }, { - "bom-ref": "9be23e52e5b28ce2", + "bom-ref": "f309603d3410b4fa", "name": "/usr/lib/python3.12/encodings/mac_croatian.py", "type": "file" }, { - "bom-ref": "9b03d8d29e25b8b2", + "bom-ref": "a73e771aa5be7bb6", "name": "/usr/lib/python3.12/encodings/mac_cyrillic.py", "type": "file" }, { - "bom-ref": "85f402341e092edc", + "bom-ref": "c644890aec69a7ec", "name": "/usr/lib/python3.12/encodings/mac_farsi.py", "type": "file" }, { - "bom-ref": "16ac737923af4947", + "bom-ref": "ceef757859977553", "name": "/usr/lib/python3.12/encodings/mac_greek.py", "type": "file" }, { - "bom-ref": "1d38378896e180f3", + "bom-ref": "9939ca05072615cf", "name": "/usr/lib/python3.12/encodings/mac_iceland.py", "type": "file" }, { - "bom-ref": "38720fc1bc0ede06", + "bom-ref": "2104a5b274ebd632", "name": "/usr/lib/python3.12/encodings/mac_latin2.py", "type": "file" }, { - "bom-ref": "2c8de580dd0da7a5", + "bom-ref": "eb9120bbdb69bf2d", "name": "/usr/lib/python3.12/encodings/mac_roman.py", "type": "file" }, { - "bom-ref": "9fca2e0b17ef1ca9", + "bom-ref": "d9a7cfe43e9da625", "name": "/usr/lib/python3.12/encodings/mac_romanian.py", "type": "file" }, { - "bom-ref": "643c523bb9d17905", + "bom-ref": "55407521e439fcdd", "name": "/usr/lib/python3.12/encodings/mac_turkish.py", "type": "file" }, { - "bom-ref": "5567be5911ca5add", + "bom-ref": "898d0a96eba01725", "name": "/usr/lib/python3.12/encodings/mbcs.py", "type": "file" }, { - "bom-ref": "a7066e82f37f1025", + "bom-ref": "3ec4807c08a4e42d", "name": "/usr/lib/python3.12/encodings/oem.py", "type": "file" }, { - "bom-ref": "fd88d9d83b4a0778", + "bom-ref": "32ceb3f14b36deb8", "name": "/usr/lib/python3.12/encodings/palmos.py", "type": "file" }, { - "bom-ref": "5d751a3ae9459045", + "bom-ref": "ea729cdab74575b9", "name": "/usr/lib/python3.12/encodings/ptcp154.py", "type": "file" }, { - "bom-ref": "fa6952a4e6ec02e1", + "bom-ref": "cc26bcc772069b15", "name": "/usr/lib/python3.12/encodings/punycode.py", "type": "file" }, { - "bom-ref": "7906f357b0c5ea2a", + "bom-ref": "2668f20ef798180e", "name": "/usr/lib/python3.12/encodings/quopri_codec.py", "type": "file" }, { - "bom-ref": "2f489fc16c015012", + "bom-ref": "c9c1a2fa33777e82", "name": "/usr/lib/python3.12/encodings/raw_unicode_escape.py", "type": "file" }, { - "bom-ref": "72b66e73810d9082", + "bom-ref": "91839d1b1af0b0d6", "name": "/usr/lib/python3.12/encodings/rot_13.py", "type": "file" }, { - "bom-ref": "678aae974acf152e", + "bom-ref": "7a1090af0e13c6e2", "name": "/usr/lib/python3.12/encodings/shift_jis.py", "type": "file" }, { - "bom-ref": "59e2a6e68340a9af", + "bom-ref": "5b78a5428a329973", "name": "/usr/lib/python3.12/encodings/shift_jis_2004.py", "type": "file" }, { - "bom-ref": "86b28d6b96c17411", + "bom-ref": "2e59b6f73375e825", "name": "/usr/lib/python3.12/encodings/shift_jisx0213.py", "type": "file" }, { - "bom-ref": "bca05c797e5fad0a", + "bom-ref": "b95ed5732aa7c186", "name": "/usr/lib/python3.12/encodings/tis_620.py", "type": "file" }, { - "bom-ref": "7ef27fb56883efa7", + "bom-ref": "c5a2594c0b4e7e47", "name": "/usr/lib/python3.12/encodings/undefined.py", "type": "file" }, { - "bom-ref": "609ff5104f33898c", + "bom-ref": "676e96848af6f33c", "name": "/usr/lib/python3.12/encodings/unicode_escape.py", "type": "file" }, { - "bom-ref": "de95dde13d80b1d1", + "bom-ref": "557619614c9b847d", "name": "/usr/lib/python3.12/encodings/utf_16.py", "type": "file" }, { - "bom-ref": "8dcc2bf0d6d246f4", + "bom-ref": "b4ee4a08bfa939f8", "name": "/usr/lib/python3.12/encodings/utf_16_be.py", "type": "file" }, { - "bom-ref": "9e415b7e6aae6d98", + "bom-ref": "80a9af78d119e5ec", "name": "/usr/lib/python3.12/encodings/utf_16_le.py", "type": "file" }, { - "bom-ref": "98fd5ff07384a0f7", + "bom-ref": "31d8e7b1c43d482f", "name": "/usr/lib/python3.12/encodings/utf_32.py", "type": "file" }, { - "bom-ref": "54356294a7a129e7", + "bom-ref": "87baee358c798b9f", "name": "/usr/lib/python3.12/encodings/utf_32_be.py", "type": "file" }, { - "bom-ref": "f9223585855f435f", + "bom-ref": "4dd08dee7c50005f", "name": "/usr/lib/python3.12/encodings/utf_32_le.py", "type": "file" }, { - "bom-ref": "93b143b82f816332", + "bom-ref": "7fafb36b4fc5b066", "name": "/usr/lib/python3.12/encodings/utf_7.py", "type": "file" }, { - "bom-ref": "3acc0c785161a1fb", + "bom-ref": "bd848f9d8ae61f93", "name": "/usr/lib/python3.12/encodings/utf_8.py", "type": "file" }, { - "bom-ref": "7361e92288f018ec", + "bom-ref": "0d8a31a40ec6b8b8", "name": "/usr/lib/python3.12/encodings/utf_8_sig.py", "type": "file" }, { - "bom-ref": "329e6883cc7f856c", + "bom-ref": "9267869287b6069c", "name": "/usr/lib/python3.12/encodings/uu_codec.py", "type": "file" }, { - "bom-ref": "3fda463137443eaf", + "bom-ref": "8f98d927d24c918b", "name": "/usr/lib/python3.12/encodings/zlib_codec.py", "type": "file" }, { - "bom-ref": "b43b620991467ba1", + "bom-ref": "f151b7802cff392f", "name": "/usr/lib/python3.12/ensurepip/__init__.py", "type": "file" }, { - "bom-ref": "7fbdb4fbe4803d2f", + "bom-ref": "68b846165e5ef0e9", "name": "/usr/lib/python3.12/ensurepip/__main__.py", "type": "file" }, { - "bom-ref": "49c0aa0c2bd0b394", + "bom-ref": "dd01e13abea69186", "name": "/usr/lib/python3.12/ensurepip/_uninstall.py", "type": "file" }, { - "bom-ref": "cb60f6f4a47eb8d2", + "bom-ref": "0496188866307e82", "name": "/usr/lib/python3.12/enum.py", "type": "file" }, { - "bom-ref": "c8a886fe5997f575", + "bom-ref": "aaec574053831f21", "name": "/usr/lib/python3.12/filecmp.py", "type": "file" }, { - "bom-ref": "1d5855bde1cb36a4", + "bom-ref": "9d8f23d4528663c8", "name": "/usr/lib/python3.12/fileinput.py", "type": "file" }, { - "bom-ref": "127ce19ce6388018", + "bom-ref": "95d2639baa66d6dc", "name": "/usr/lib/python3.12/fnmatch.py", "type": "file" }, { - "bom-ref": "da936b6e718488c2", + "bom-ref": "337767a4fcbae186", "name": "/usr/lib/python3.12/fractions.py", "type": "file" }, { - "bom-ref": "8d1422aafcd42ba6", + "bom-ref": "a786f5760d9c2eaa", "name": "/usr/lib/python3.12/ftplib.py", "type": "file" }, { - "bom-ref": "c2449a5e402b88d3", + "bom-ref": "bb9f5173e70fac0b", "name": "/usr/lib/python3.12/functools.py", "type": "file" }, { - "bom-ref": "874d0b87c8135e7f", + "bom-ref": "8e8cda040a88bae7", "name": "/usr/lib/python3.12/genericpath.py", "type": "file" }, { - "bom-ref": "1b4e2d5dc3fd41fa", + "bom-ref": "45a0070a7705bbba", "name": "/usr/lib/python3.12/getopt.py", "type": "file" }, { - "bom-ref": "3ae2bcc0a16fa849", + "bom-ref": "dcb23be9cb85e6e5", "name": "/usr/lib/python3.12/getpass.py", "type": "file" }, { - "bom-ref": "52ea9ea7bb7090f0", + "bom-ref": "5ae2171e5afb2fb4", "name": "/usr/lib/python3.12/gettext.py", "type": "file" }, { - "bom-ref": "9de3238c78a561de", + "bom-ref": "d716e4ab1449c792", "name": "/usr/lib/python3.12/glob.py", "type": "file" }, { - "bom-ref": "f363a73bd69449d9", + "bom-ref": "12cd369b7fe036a1", "name": "/usr/lib/python3.12/graphlib.py", "type": "file" }, { - "bom-ref": "54b05aa15259d376", + "bom-ref": "aa7ec4eb3a92872a", "name": "/usr/lib/python3.12/gzip.py", "type": "file" }, { - "bom-ref": "621ddb334153801c", + "bom-ref": "7fe93b75a9fd4b5c", "name": "/usr/lib/python3.12/hashlib.py", "type": "file" }, { - "bom-ref": "2d6e76a6ec646099", + "bom-ref": "47c56f11788e45c9", "name": "/usr/lib/python3.12/heapq.py", "type": "file" }, { - "bom-ref": "773870187440b569", + "bom-ref": "d133806035c773bd", "name": "/usr/lib/python3.12/hmac.py", "type": "file" }, { - "bom-ref": "63f1ab03ed955f1a", + "bom-ref": "53a79d2d531bd146", "name": "/usr/lib/python3.12/html/__init__.py", "type": "file" }, { - "bom-ref": "eab6009e9a0535fa", + "bom-ref": "b8804afe0f477c92", "name": "/usr/lib/python3.12/html/entities.py", "type": "file" }, { - "bom-ref": "1f4c1b878f421ed1", + "bom-ref": "23cf196ab5c4d0c5", "name": "/usr/lib/python3.12/html/parser.py", "type": "file" }, { - "bom-ref": "5d1f4bfa06090710", + "bom-ref": "d01a14084de7c2d0", "name": "/usr/lib/python3.12/http/__init__.py", "type": "file" }, { - "bom-ref": "5ace69301d7da8a5", + "bom-ref": "21d8c1adaeadbf2d", "name": "/usr/lib/python3.12/http/client.py", "type": "file" }, { - "bom-ref": "d4284dc96922544b", + "bom-ref": "53668fd5d9d69ca3", "name": "/usr/lib/python3.12/http/cookiejar.py", "type": "file" }, { - "bom-ref": "d743c2f69eaa294b", + "bom-ref": "279b12b699f18953", "name": "/usr/lib/python3.12/http/cookies.py", "type": "file" }, { - "bom-ref": "3791b706f72bf702", + "bom-ref": "25397023d55a353a", "name": "/usr/lib/python3.12/http/server.py", "type": "file" }, { - "bom-ref": "9503ec9751e4cb0b", + "bom-ref": "eb6e2904c0b39297", "name": "/usr/lib/python3.12/imaplib.py", "type": "file" }, { - "bom-ref": "9d54bc19fe22463a", + "bom-ref": "dbc2f71ff450a5be", "name": "/usr/lib/python3.12/imghdr.py", "type": "file" }, { - "bom-ref": "a20de91ee70fe6b0", + "bom-ref": "7b81a53fc3bc30a4", "name": "/usr/lib/python3.12/importlib/__init__.py", "type": "file" }, { - "bom-ref": "c6c2603459b0c29a", + "bom-ref": "0c726a18da1adb02", "name": "/usr/lib/python3.12/importlib/_abc.py", "type": "file" }, { - "bom-ref": "ea0563dd258a4caf", + "bom-ref": "dd16e60b66093e7b", "name": "/usr/lib/python3.12/importlib/_bootstrap.py", "type": "file" }, { - "bom-ref": "903594d0582910b1", + "bom-ref": "977503e317255e6d", "name": "/usr/lib/python3.12/importlib/_bootstrap_external.py", "type": "file" }, { - "bom-ref": "717d317ff17394bb", + "bom-ref": "72929c32d1fd4cdb", "name": "/usr/lib/python3.12/importlib/abc.py", "type": "file" }, { - "bom-ref": "51b6b228b1669af9", + "bom-ref": "92116f312fdb30f5", "name": "/usr/lib/python3.12/importlib/machinery.py", "type": "file" }, { - "bom-ref": "475b6d639f9eb435", + "bom-ref": "08c773e22d86d111", "name": "/usr/lib/python3.12/importlib/metadata/__init__.py", "type": "file" }, { - "bom-ref": "7be20dfef6cea0cb", + "bom-ref": "e3202bd7782a3567", "name": "/usr/lib/python3.12/importlib/metadata/_adapters.py", "type": "file" }, { - "bom-ref": "06e2b1f0d19d85d9", + "bom-ref": "b79b011f1fec7ffd", "name": "/usr/lib/python3.12/importlib/metadata/_collections.py", "type": "file" }, { - "bom-ref": "dbe6ccf14f405778", + "bom-ref": "836c54ce48959338", "name": "/usr/lib/python3.12/importlib/metadata/_functools.py", "type": "file" }, { - "bom-ref": "11a28e7675b6e9f0", + "bom-ref": "71ce388bf7dbe7e0", "name": "/usr/lib/python3.12/importlib/metadata/_itertools.py", "type": "file" }, { - "bom-ref": "a7a59a44ba081d2d", + "bom-ref": "fd6383984e269de5", "name": "/usr/lib/python3.12/importlib/metadata/_meta.py", "type": "file" }, { - "bom-ref": "753707938e8eace9", + "bom-ref": "87caa59165f6923d", "name": "/usr/lib/python3.12/importlib/metadata/_text.py", "type": "file" }, { - "bom-ref": "f1bb2244d30390d8", + "bom-ref": "092663d14574d3fc", "name": "/usr/lib/python3.12/importlib/readers.py", "type": "file" }, { - "bom-ref": "2aba4bcf59c21ec4", + "bom-ref": "d30655ff8ae9af94", "name": "/usr/lib/python3.12/importlib/resources/__init__.py", "type": "file" }, { - "bom-ref": "2382b1800445eae5", + "bom-ref": "9213be5df11749b9", "name": "/usr/lib/python3.12/importlib/resources/_adapters.py", "type": "file" }, { - "bom-ref": "c8911563c1506f07", + "bom-ref": "703100bbb25e8b47", "name": "/usr/lib/python3.12/importlib/resources/_common.py", "type": "file" }, { - "bom-ref": "fc31085790d2294b", + "bom-ref": "4c0e373dafc1c26b", "name": "/usr/lib/python3.12/importlib/resources/_itertools.py", "type": "file" }, { - "bom-ref": "10611a9cf40cc0b5", + "bom-ref": "b396469164aa8d25", "name": "/usr/lib/python3.12/importlib/resources/_legacy.py", "type": "file" }, { - "bom-ref": "f6b50353f9b6a0a2", + "bom-ref": "48de3237f5d94002", "name": "/usr/lib/python3.12/importlib/resources/abc.py", "type": "file" }, { - "bom-ref": "645b3ce5ba42c6a5", + "bom-ref": "825ba4fb5b480855", "name": "/usr/lib/python3.12/importlib/resources/readers.py", "type": "file" }, { - "bom-ref": "f3a030077d62c4b2", + "bom-ref": "aaba1aaa5a117e3a", "name": "/usr/lib/python3.12/importlib/resources/simple.py", "type": "file" }, { - "bom-ref": "dadbfb57d182ad64", + "bom-ref": "46569cc3a8456d28", "name": "/usr/lib/python3.12/importlib/simple.py", "type": "file" }, { - "bom-ref": "d09a24a760ddaa7a", + "bom-ref": "ed3dd6f45049d116", "name": "/usr/lib/python3.12/importlib/util.py", "type": "file" }, { - "bom-ref": "c293dfdfd53025ba", + "bom-ref": "b10d476cf7529506", "name": "/usr/lib/python3.12/inspect.py", "type": "file" }, { - "bom-ref": "6825381cc3d56264", + "bom-ref": "952c576a64a4d010", "name": "/usr/lib/python3.12/io.py", "type": "file" }, { - "bom-ref": "e7ae51405dd2c29b", + "bom-ref": "c16278fd9b6e84fb", "name": "/usr/lib/python3.12/ipaddress.py", "type": "file" }, { - "bom-ref": "ed55db84115cfbad", + "bom-ref": "68e1a02ac1481045", "name": "/usr/lib/python3.12/json/__init__.py", "type": "file" }, { - "bom-ref": "e87af228f30dde02", + "bom-ref": "862d88bb6735bf3a", "name": "/usr/lib/python3.12/json/decoder.py", "type": "file" }, { - "bom-ref": "3eaf15f66fefcd00", + "bom-ref": "d9347ec378964f58", "name": "/usr/lib/python3.12/json/encoder.py", "type": "file" }, { - "bom-ref": "f8ec23861ce87593", + "bom-ref": "967e2b5b20b5f94b", "name": "/usr/lib/python3.12/json/scanner.py", "type": "file" }, { - "bom-ref": "6f99bd9a1d21a19b", + "bom-ref": "b2d17625476d9843", "name": "/usr/lib/python3.12/json/tool.py", "type": "file" }, { - "bom-ref": "0d0fbdcf5f34d1ce", + "bom-ref": "4131a4ffc1efc86e", "name": "/usr/lib/python3.12/keyword.py", "type": "file" }, { - "bom-ref": "5a5bf191054037bf", + "bom-ref": "c93b22a05f9645ef", "name": "/usr/lib/python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "c2a3d161704695ab", + "bom-ref": "7b5ced50c376eb0b", "name": "/usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "6fccc5cd22e0d6af", + "bom-ref": "c73293029948efd7", "name": "/usr/lib/python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "e340077a2d258373", + "bom-ref": "adc02360ac1d4487", "name": "/usr/lib/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "bab3e71a96574159", + "bom-ref": "5977207e07c39149", "name": "/usr/lib/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "d1d755dc5a83e61b", + "bom-ref": "5053e01f1535f817", "name": "/usr/lib/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "2d8adfeb1fb6f92d", + "bom-ref": "d64ab3375cb0ddcd", "name": "/usr/lib/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "049ca619e621cd2b", + "bom-ref": "93f887a5d155bf63", "name": "/usr/lib/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "d2079173c6eb37c5", + "bom-ref": "04d4a14f2ddad761", "name": "/usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "0dd7a245ae27db2f", + "bom-ref": "873a4cdbea113833", "name": "/usr/lib/python3.12/lib-dynload/_crypt.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "d430bd58c9140a34", + "bom-ref": "02b3e5a130181c80", "name": "/usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "4b7b86588d967021", + "bom-ref": "d34e9ff4fb2a5661", "name": "/usr/lib/python3.12/lib-dynload/_ctypes_test.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "9f865e9ad254e186", + "bom-ref": "bac21451b98e8f5e", "name": "/usr/lib/python3.12/lib-dynload/_curses.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "a6eecd840d71c7de", + "bom-ref": "e99fcf363c6959d6", "name": "/usr/lib/python3.12/lib-dynload/_curses_panel.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "9374528e62724208", + "bom-ref": "1cf38dd17c9e7324", "name": "/usr/lib/python3.12/lib-dynload/_dbm.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "7ae7b84a1324acc2", + "bom-ref": "d571ea9534d165e2", "name": "/usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "94de38514c36c345", + "bom-ref": "56aab55037f80be5", "name": "/usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "2be5a53b36fdd03f", + "bom-ref": "6fcab016ab5b5dcb", "name": "/usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "ffd24fcf3bd34587", + "bom-ref": "1bdbf6715d32ecd3", "name": "/usr/lib/python3.12/lib-dynload/_lsprof.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "771969bf77e40344", + "bom-ref": "15def8e3b2418810", "name": "/usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "972eec54a6ec3d08", + "bom-ref": "43f5ff3e019e6580", "name": "/usr/lib/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "091d173573f7ba33", + "bom-ref": "5174f62d251d2a3b", "name": "/usr/lib/python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "3c5e395601d3a456", + "bom-ref": "b807a6417609f5aa", "name": "/usr/lib/python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "223120b9b365e60d", + "bom-ref": "ae6dc5882a185459", "name": "/usr/lib/python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "27d61a13e23a791a", + "bom-ref": "13c1e37490b128f6", "name": "/usr/lib/python3.12/lib-dynload/_sqlite3.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "47ee2035aa7dcf21", + "bom-ref": "3c588c9eb7ff8eed", "name": "/usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "111708cd83986692", + "bom-ref": "fc770f78c2e51556", "name": "/usr/lib/python3.12/lib-dynload/_testbuffer.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "2668a9bbebf4986d", + "bom-ref": "c5612a83aaf96fc9", "name": "/usr/lib/python3.12/lib-dynload/_testcapi.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "2bdb314eb88f240d", + "bom-ref": "c7ce95d604b5c2f9", "name": "/usr/lib/python3.12/lib-dynload/_testclinic.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "28b012d0970ea393", + "bom-ref": "e2221d869814d2c7", "name": "/usr/lib/python3.12/lib-dynload/_testimportmultiple.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "85743e3e2e58d118", + "bom-ref": "88ecddad87a2abc4", "name": "/usr/lib/python3.12/lib-dynload/_testinternalcapi.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "727882a3ba17497f", + "bom-ref": "4bc7717ed10c08cf", "name": "/usr/lib/python3.12/lib-dynload/_testmultiphase.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "95a81dbc2a116b2c", + "bom-ref": "84822b09b1b3d320", "name": "/usr/lib/python3.12/lib-dynload/_testsinglephase.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "d2e69e8c72b4fcf2", + "bom-ref": "fa7f7c945143018a", "name": "/usr/lib/python3.12/lib-dynload/_xxinterpchannels.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "a2761b8f1ad01729", + "bom-ref": "268165edc9479525", "name": "/usr/lib/python3.12/lib-dynload/_xxsubinterpreters.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "18ce5280fe5cec29", + "bom-ref": "90a73efc3a8fb05d", "name": "/usr/lib/python3.12/lib-dynload/_xxtestfuzz.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "0f5cc96888160d51", + "bom-ref": "7dd451703edffda1", "name": "/usr/lib/python3.12/lib-dynload/_zoneinfo.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "5dd7a42e0cc4b718", + "bom-ref": "e97efac4b5f81e24", "name": "/usr/lib/python3.12/lib-dynload/audioop.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "921e297419d2156b", + "bom-ref": "974f4dc2331193cf", "name": "/usr/lib/python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "88213aafbc9eeb57", + "bom-ref": "f38d81a8b5816b93", "name": "/usr/lib/python3.12/lib-dynload/ossaudiodev.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "df1f3f723a2d6814", + "bom-ref": "a408953957e594ec", "name": "/usr/lib/python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "94704b5b1ae196b5", + "bom-ref": "0a83982f3bd3d2bd", "name": "/usr/lib/python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "a72e3faec12a2100", + "bom-ref": "745825f3cd3c9ba4", "name": "/usr/lib/python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "7ebdfa21fa8c96ea", + "bom-ref": "3bf6f1a72054a62a", "name": "/usr/lib/python3.12/lib-dynload/xxlimited.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "97af0cf98c1e6aca", + "bom-ref": "791675d248668ae2", "name": "/usr/lib/python3.12/lib-dynload/xxlimited_35.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "271469bfe2a8faef", + "bom-ref": "262a51f9f454e933", "name": "/usr/lib/python3.12/lib-dynload/xxsubtype.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "036e058f476f3112", + "bom-ref": "cdb88cea2715feba", "name": "/usr/lib/python3.12/linecache.py", "type": "file" }, { - "bom-ref": "e0b32ddd5c84b8cd", + "bom-ref": "75d2c5e41afb78a5", "name": "/usr/lib/python3.12/locale.py", "type": "file" }, { - "bom-ref": "655997024e655993", + "bom-ref": "469fb8947e3da96b", "name": "/usr/lib/python3.12/logging/__init__.py", "type": "file" }, { - "bom-ref": "d7faebe17bd267ee", + "bom-ref": "ce3bcee61db994de", "name": "/usr/lib/python3.12/logging/config.py", "type": "file" }, { - "bom-ref": "795c3a757152b765", + "bom-ref": "93eae929053fa3cd", "name": "/usr/lib/python3.12/logging/handlers.py", "type": "file" }, { - "bom-ref": "acee1db8c4e2805d", + "bom-ref": "78b068d6e17c3855", "name": "/usr/lib/python3.12/lzma.py", "type": "file" }, { - "bom-ref": "452b67d0cf7d6232", + "bom-ref": "40f2118e1c3afeca", "name": "/usr/lib/python3.12/mailbox.py", "type": "file" }, { - "bom-ref": "8984177f1d65fea2", + "bom-ref": "f7638e5fd3bad9ee", "name": "/usr/lib/python3.12/mailcap.py", "type": "file" }, { - "bom-ref": "971001c396b213f1", + "bom-ref": "db90a9117862f3bd", "name": "/usr/lib/python3.12/mimetypes.py", "type": "file" }, { - "bom-ref": "86a7da0e64fdb412", + "bom-ref": "6dfe5d3c0290e8fe", "name": "/usr/lib/python3.12/modulefinder.py", "type": "file" }, { - "bom-ref": "e43fade615f5ed8c", + "bom-ref": "eb4443ff3083e668", "name": "/usr/lib/python3.12/multiprocessing/__init__.py", "type": "file" }, { - "bom-ref": "c5f62c7ad1beb0fc", + "bom-ref": "b851a9bb18a9afb8", "name": "/usr/lib/python3.12/multiprocessing/connection.py", "type": "file" }, { - "bom-ref": "da5f172aa60b796d", + "bom-ref": "a1f3c061fc3ca511", "name": "/usr/lib/python3.12/multiprocessing/context.py", "type": "file" }, { - "bom-ref": "6bb78e417eab46c5", + "bom-ref": "d59c7e885401b4c5", "name": "/usr/lib/python3.12/multiprocessing/dummy/__init__.py", "type": "file" }, { - "bom-ref": "d38fc117e346d2a6", + "bom-ref": "2ce17ff8c34491ca", "name": "/usr/lib/python3.12/multiprocessing/dummy/connection.py", "type": "file" }, { - "bom-ref": "c4aa12c715fe57a4", + "bom-ref": "77a55f4d337dd5fc", "name": "/usr/lib/python3.12/multiprocessing/forkserver.py", "type": "file" }, { - "bom-ref": "83a4f72924a1fa72", + "bom-ref": "d534c24eb4f3e956", "name": "/usr/lib/python3.12/multiprocessing/heap.py", "type": "file" }, { - "bom-ref": "034723eff16984ae", + "bom-ref": "967d29c7faa4cb8e", "name": "/usr/lib/python3.12/multiprocessing/managers.py", "type": "file" }, { - "bom-ref": "a62d4825163c96c1", + "bom-ref": "e57ada9bb7beb3d9", "name": "/usr/lib/python3.12/multiprocessing/pool.py", "type": "file" }, { - "bom-ref": "43de019e54267a67", + "bom-ref": "db3e8ad84eea0957", "name": "/usr/lib/python3.12/multiprocessing/popen_fork.py", "type": "file" }, { - "bom-ref": "036c1139ee44e023", + "bom-ref": "1e6880077d74600b", "name": "/usr/lib/python3.12/multiprocessing/popen_forkserver.py", "type": "file" }, { - "bom-ref": "4a36685f62acf977", + "bom-ref": "c3b14e4a9455e0d7", "name": "/usr/lib/python3.12/multiprocessing/popen_spawn_posix.py", "type": "file" }, { - "bom-ref": "364cb0e0656a0ef0", + "bom-ref": "40761552c1263ea0", "name": "/usr/lib/python3.12/multiprocessing/popen_spawn_win32.py", "type": "file" }, { - "bom-ref": "51341c0db40d8fd3", + "bom-ref": "304d97050b8c1823", "name": "/usr/lib/python3.12/multiprocessing/process.py", "type": "file" }, { - "bom-ref": "fe6bd6cb48066389", + "bom-ref": "795041b45a2d7fd9", "name": "/usr/lib/python3.12/multiprocessing/queues.py", "type": "file" }, { - "bom-ref": "dc7fff03e5b6381d", + "bom-ref": "f8d15ffe7cd3ddad", "name": "/usr/lib/python3.12/multiprocessing/reduction.py", "type": "file" }, { - "bom-ref": "8801c48c30871d19", + "bom-ref": "96d6dc9de5ce5851", "name": "/usr/lib/python3.12/multiprocessing/resource_sharer.py", "type": "file" }, { - "bom-ref": "c12def9997c84184", + "bom-ref": "4a68c4b607f2e718", "name": "/usr/lib/python3.12/multiprocessing/resource_tracker.py", "type": "file" }, { - "bom-ref": "556613c2b094e664", + "bom-ref": "2d44b5449ebbba2c", "name": "/usr/lib/python3.12/multiprocessing/shared_memory.py", "type": "file" }, { - "bom-ref": "8881b61f75c82389", + "bom-ref": "a8342f438942a6a1", "name": "/usr/lib/python3.12/multiprocessing/sharedctypes.py", "type": "file" }, { - "bom-ref": "cedf557751880ba2", + "bom-ref": "b5e1c378233f7a16", "name": "/usr/lib/python3.12/multiprocessing/spawn.py", "type": "file" }, { - "bom-ref": "fb9dc149f245c3ff", + "bom-ref": "6455f73fd165048f", "name": "/usr/lib/python3.12/multiprocessing/synchronize.py", "type": "file" }, { - "bom-ref": "16ac1b565894ae4f", + "bom-ref": "1435c7a57ed7c063", "name": "/usr/lib/python3.12/multiprocessing/util.py", "type": "file" }, { - "bom-ref": "3635d15ed6236d39", + "bom-ref": "a799b4fafabe14d9", "name": "/usr/lib/python3.12/netrc.py", "type": "file" }, { - "bom-ref": "d676b5fe40c75c22", + "bom-ref": "6fa2c34a72b36cc6", "name": "/usr/lib/python3.12/nntplib.py", "type": "file" }, { - "bom-ref": "17fd1b96ef30d5e1", + "bom-ref": "ec0a796d181b3d79", "name": "/usr/lib/python3.12/ntpath.py", "type": "file" }, { - "bom-ref": "c860b889abf6fe0b", + "bom-ref": "758f3aa7c9e1b43b", "name": "/usr/lib/python3.12/nturl2path.py", "type": "file" }, { - "bom-ref": "ca2fd0ece84ddb66", + "bom-ref": "1e02014fd05b47e2", "name": "/usr/lib/python3.12/numbers.py", "type": "file" }, { - "bom-ref": "fb4305674e59fab6", + "bom-ref": "503f7e102177215a", "name": "/usr/lib/python3.12/opcode.py", "type": "file" }, { - "bom-ref": "e3dd07709ac81fb9", + "bom-ref": "dc5c90b449fbed91", "name": "/usr/lib/python3.12/operator.py", "type": "file" }, { - "bom-ref": "5b26db1e81dccf6f", + "bom-ref": "c00bd960bfb98e17", "name": "/usr/lib/python3.12/optparse.py", "type": "file" }, { - "bom-ref": "0299505dcd3f75cb", + "bom-ref": "92898c05ab021587", "name": "/usr/lib/python3.12/os.py", "type": "file" }, { - "bom-ref": "1af5f38590814a03", + "bom-ref": "b86f49a00fdbb767", "name": "/usr/lib/python3.12/pathlib.py", "type": "file" }, { - "bom-ref": "b169df9456221e19", + "bom-ref": "38a68dd6c6847749", "name": "/usr/lib/python3.12/pdb.py", "type": "file" }, { - "bom-ref": "54f082740a46876c", + "bom-ref": "54a9c69e0c70aacc", "name": "/usr/lib/python3.12/pickle.py", "type": "file" }, { - "bom-ref": "533cda818a450492", + "bom-ref": "edc224600eef12de", "name": "/usr/lib/python3.12/pickletools.py", "type": "file" }, { - "bom-ref": "70a50fe2fb73d384", + "bom-ref": "cb8f47a350488f24", "name": "/usr/lib/python3.12/pipes.py", "type": "file" }, { - "bom-ref": "61df3e13c224c2d7", + "bom-ref": "7bf46c039095811b", "name": "/usr/lib/python3.12/pkgutil.py", "type": "file" }, { - "bom-ref": "5c38bf447eee3c74", + "bom-ref": "aaab539c35aa2a14", "name": "/usr/lib/python3.12/platform.py", "type": "file" }, { - "bom-ref": "6c6cf93bace406c0", + "bom-ref": "7d7e32272693800c", "name": "/usr/lib/python3.12/plistlib.py", "type": "file" }, { - "bom-ref": "39e7c938e91db2da", + "bom-ref": "480faaf85c3f0bea", "name": "/usr/lib/python3.12/poplib.py", "type": "file" }, { - "bom-ref": "18f1552e4dc01fe2", + "bom-ref": "7445867705824f66", "name": "/usr/lib/python3.12/posixpath.py", "type": "file" }, { - "bom-ref": "7e11c81c8af9042d", + "bom-ref": "0b1edfcfe814df71", "name": "/usr/lib/python3.12/pprint.py", "type": "file" }, { - "bom-ref": "fcfa0a455d944a81", + "bom-ref": "6ba0e58dfe4324a1", "name": "/usr/lib/python3.12/profile.py", "type": "file" }, { - "bom-ref": "7a887a881d84ded5", + "bom-ref": "4cd9da9275df9c49", "name": "/usr/lib/python3.12/pstats.py", "type": "file" }, { - "bom-ref": "4665f81bf2db08fe", + "bom-ref": "34980030abfcdf7e", "name": "/usr/lib/python3.12/pty.py", "type": "file" }, { - "bom-ref": "15fd6ee9251858d7", + "bom-ref": "3a93817638b671ff", "name": "/usr/lib/python3.12/py_compile.py", "type": "file" }, { - "bom-ref": "03f916abea5b791a", + "bom-ref": "0e38145b60b8e59e", "name": "/usr/lib/python3.12/pyclbr.py", "type": "file" }, { - "bom-ref": "f63dec97685f0c64", + "bom-ref": "a5d0d7e6876ca52c", "name": "/usr/lib/python3.12/pydoc.py", "type": "file" }, { - "bom-ref": "fd63a8d186201616", + "bom-ref": "a1aa7e7c33b8d1f2", "name": "/usr/lib/python3.12/pydoc_data/__init__.py", "type": "file" }, { - "bom-ref": "fd1ae4334a3d7f80", + "bom-ref": "2fe3e2e8e759a710", "name": "/usr/lib/python3.12/pydoc_data/_pydoc.css", "type": "file" }, { - "bom-ref": "dc96bff031c6f22c", + "bom-ref": "101d87a04e2d7aac", "name": "/usr/lib/python3.12/pydoc_data/topics.py", "type": "file" }, { - "bom-ref": "4a1c02b7e1e42ef6", + "bom-ref": "9eb6a6d2114b586a", "name": "/usr/lib/python3.12/queue.py", "type": "file" }, { - "bom-ref": "b33270e61b22cba9", + "bom-ref": "a06053c728b3e4c1", "name": "/usr/lib/python3.12/quopri.py", "type": "file" }, { - "bom-ref": "ca8374f593a7c8e6", + "bom-ref": "210a8641c602143e", "name": "/usr/lib/python3.12/random.py", "type": "file" }, { - "bom-ref": "7f1232c256a5596b", + "bom-ref": "0166ab41164d2a53", "name": "/usr/lib/python3.12/re/__init__.py", "type": "file" }, { - "bom-ref": "a2440175789f77c5", + "bom-ref": "2d8010c6affffce5", "name": "/usr/lib/python3.12/re/_casefix.py", "type": "file" }, { - "bom-ref": "340264c9ab854fe4", + "bom-ref": "e81616946e9247fc", "name": "/usr/lib/python3.12/re/_compiler.py", "type": "file" }, { - "bom-ref": "aa6841035ca41e5b", + "bom-ref": "c22cf34b1c2f2963", "name": "/usr/lib/python3.12/re/_constants.py", "type": "file" }, { - "bom-ref": "35ac0919902b4b5e", + "bom-ref": "5e054844eb57b096", "name": "/usr/lib/python3.12/re/_parser.py", "type": "file" }, { - "bom-ref": "851b8ce2881d2c8e", + "bom-ref": "7ae21240c8d49526", "name": "/usr/lib/python3.12/reprlib.py", "type": "file" }, { - "bom-ref": "284a1aec8e5f5844", + "bom-ref": "629b0cbde5249c28", "name": "/usr/lib/python3.12/rlcompleter.py", "type": "file" }, { - "bom-ref": "0d1afdee760e46b2", + "bom-ref": "30a94a1f01d2758e", "name": "/usr/lib/python3.12/runpy.py", "type": "file" }, { - "bom-ref": "db6ca1af034d82fc", + "bom-ref": "71e46f23f248e6c4", "name": "/usr/lib/python3.12/sched.py", "type": "file" }, { - "bom-ref": "67f2dedee812e101", + "bom-ref": "1caedcc2c245be75", "name": "/usr/lib/python3.12/secrets.py", "type": "file" }, { - "bom-ref": "39a1695c834b8a2e", + "bom-ref": "5ae10f19a0a55d4a", "name": "/usr/lib/python3.12/selectors.py", "type": "file" }, { - "bom-ref": "96fc3d0e11cd40ab", + "bom-ref": "0908775bfa178a37", "name": "/usr/lib/python3.12/shelve.py", "type": "file" }, { - "bom-ref": "5819d2ece6dc173e", + "bom-ref": "65c02c8837e950b6", "name": "/usr/lib/python3.12/shlex.py", "type": "file" }, { - "bom-ref": "d26e18f944e385c1", + "bom-ref": "99a5daeefd311571", "name": "/usr/lib/python3.12/shutil.py", "type": "file" }, { - "bom-ref": "e9d5c10ba025c5ad", + "bom-ref": "6dfebf0fe01df28d", "name": "/usr/lib/python3.12/signal.py", "type": "file" }, { - "bom-ref": "4be4416630625db4", + "bom-ref": "b759e0a6c3971b58", "name": "/usr/lib/python3.12/site.py", "type": "file" }, { - "bom-ref": "713ddf0e6ff84c72", + "bom-ref": "2641914812eccb7a", "name": "/usr/lib/python3.12/smtplib.py", "type": "file" }, { - "bom-ref": "a333d715b42280b1", + "bom-ref": "8b2b78b263a93041", "name": "/usr/lib/python3.12/sndhdr.py", "type": "file" }, { - "bom-ref": "75a84dff6bda3c93", + "bom-ref": "328b7fc9ad2dc0b3", "name": "/usr/lib/python3.12/socket.py", "type": "file" }, { - "bom-ref": "6cb7ddc639124453", + "bom-ref": "f584ef241481491f", "name": "/usr/lib/python3.12/socketserver.py", "type": "file" }, { - "bom-ref": "4f5be8385be55fbf", + "bom-ref": "3abf60da3fb9f587", "name": "/usr/lib/python3.12/sqlite3/__init__.py", "type": "file" }, { - "bom-ref": "a641cc60aa17c1be", + "bom-ref": "e3dba54efe979aa2", "name": "/usr/lib/python3.12/sqlite3/__main__.py", "type": "file" }, { - "bom-ref": "e1c1ed54d2ae8158", + "bom-ref": "9aad686159fad160", "name": "/usr/lib/python3.12/sqlite3/dbapi2.py", "type": "file" }, { - "bom-ref": "be14b18e7f6fe915", + "bom-ref": "49f6a05f0bccbce5", "name": "/usr/lib/python3.12/sqlite3/dump.py", "type": "file" }, { - "bom-ref": "15c1572e2df1b50b", + "bom-ref": "88ee27eabf38fa1f", "name": "/usr/lib/python3.12/sre_compile.py", "type": "file" }, { - "bom-ref": "cadce7f6bec1dc54", + "bom-ref": "a3f36cb8e4e2fa54", "name": "/usr/lib/python3.12/sre_constants.py", "type": "file" }, { - "bom-ref": "3a8417dca3715ef7", + "bom-ref": "b9b40937618e0957", "name": "/usr/lib/python3.12/sre_parse.py", "type": "file" }, { - "bom-ref": "7c96658534e142ea", + "bom-ref": "5578a60791cff32a", "name": "/usr/lib/python3.12/ssl.py", "type": "file" }, { - "bom-ref": "2e28e4c932f14bad", + "bom-ref": "ef4cadb54c33cd8d", "name": "/usr/lib/python3.12/stat.py", "type": "file" }, { - "bom-ref": "d388279f84bca1b9", + "bom-ref": "5b1517e15c693335", "name": "/usr/lib/python3.12/statistics.py", "type": "file" }, { - "bom-ref": "0b3e6b6503afe02b", + "bom-ref": "def91e64b5cd684b", "name": "/usr/lib/python3.12/string.py", "type": "file" }, { - "bom-ref": "1a28d4201b36b7db", + "bom-ref": "91118627e3b6443f", "name": "/usr/lib/python3.12/stringprep.py", "type": "file" }, { - "bom-ref": "2f2598de825f3aba", + "bom-ref": "31fec9a228c84cc2", "name": "/usr/lib/python3.12/struct.py", "type": "file" }, { - "bom-ref": "4863e7d0277cd49f", + "bom-ref": "1b227cd0459d8ec7", "name": "/usr/lib/python3.12/subprocess.py", "type": "file" }, { - "bom-ref": "4fe8d43fbada7bf5", + "bom-ref": "82019d8cde3c7581", "name": "/usr/lib/python3.12/sunau.py", "type": "file" }, { - "bom-ref": "6ef12eae996cc424", + "bom-ref": "40d687459af5866c", "name": "/usr/lib/python3.12/symtable.py", "type": "file" }, { - "bom-ref": "133a896aa76e948c", + "bom-ref": "d0c0ab81f307292c", "name": "/usr/lib/python3.12/sysconfig.py", "type": "file" }, { - "bom-ref": "96681b57bd0184f4", + "bom-ref": "543828a15e3ca804", "name": "/usr/lib/python3.12/tabnanny.py", "type": "file" }, { - "bom-ref": "155b82ba4fe5498e", + "bom-ref": "98d73fd8ddfefe0e", "name": "/usr/lib/python3.12/tarfile.py", "type": "file" }, { - "bom-ref": "7ab55b877984735d", + "bom-ref": "f0d631e7af17d999", "name": "/usr/lib/python3.12/telnetlib.py", "type": "file" }, { - "bom-ref": "11b8666efbfabecb", + "bom-ref": "c94a1f77536b1013", "name": "/usr/lib/python3.12/tempfile.py", "type": "file" }, { - "bom-ref": "02bc78b36fd688d4", + "bom-ref": "3d778257ce21ed68", "name": "/usr/lib/python3.12/test/__init__.py", "type": "file" }, { - "bom-ref": "464909868bd85f42", + "bom-ref": "25d574766b54f5fe", "name": "/usr/lib/python3.12/test/__main__.py", "type": "file" }, { - "bom-ref": "3ee1ac606f7200f0", + "bom-ref": "d0fab906741936b0", "name": "/usr/lib/python3.12/test/libregrtest/__init__.py", "type": "file" }, { - "bom-ref": "569edfa60e23d42d", + "bom-ref": "55fd3fd247560159", "name": "/usr/lib/python3.12/test/libregrtest/cmdline.py", "type": "file" }, { - "bom-ref": "6df448bbb80c9eee", + "bom-ref": "bd2bda9d51c98d72", "name": "/usr/lib/python3.12/test/libregrtest/filter.py", "type": "file" }, { - "bom-ref": "84a737496ae78d0f", + "bom-ref": "a03895e10c4dfb13", "name": "/usr/lib/python3.12/test/libregrtest/findtests.py", "type": "file" }, { - "bom-ref": "73db21b189f1197e", + "bom-ref": "29afe7f21379d11a", "name": "/usr/lib/python3.12/test/libregrtest/logger.py", "type": "file" }, { - "bom-ref": "f1e407cb9fabe961", + "bom-ref": "8403e58621511b45", "name": "/usr/lib/python3.12/test/libregrtest/main.py", "type": "file" }, { - "bom-ref": "886ce10ff5d66ddc", + "bom-ref": "3f2769997550cc98", "name": "/usr/lib/python3.12/test/libregrtest/mypy.ini", "type": "file" }, { - "bom-ref": "3d6a8d1045d4556a", + "bom-ref": "31bd751ae547a5d2", "name": "/usr/lib/python3.12/test/libregrtest/pgo.py", "type": "file" }, { - "bom-ref": "7394440d2a77c7f1", + "bom-ref": "60428ef3e81acf01", "name": "/usr/lib/python3.12/test/libregrtest/refleak.py", "type": "file" }, { - "bom-ref": "881beed6b8a05bfa", + "bom-ref": "faf06d1d57ff29ca", "name": "/usr/lib/python3.12/test/libregrtest/result.py", "type": "file" }, { - "bom-ref": "b2fe9965fb296d27", + "bom-ref": "cd27dfa1c340a2f7", "name": "/usr/lib/python3.12/test/libregrtest/results.py", "type": "file" }, { - "bom-ref": "ab2a31a8a36b1ebc", + "bom-ref": "aa74b684fdde55c8", "name": "/usr/lib/python3.12/test/libregrtest/run_workers.py", "type": "file" }, { - "bom-ref": "15ca617b4ca50de7", + "bom-ref": "825d7dbce776ce5b", "name": "/usr/lib/python3.12/test/libregrtest/runtests.py", "type": "file" }, { - "bom-ref": "d46d8fe1d4b8c863", + "bom-ref": "26cf4073d6c726c3", "name": "/usr/lib/python3.12/test/libregrtest/save_env.py", "type": "file" }, { - "bom-ref": "a4974339a5d435d1", + "bom-ref": "a0cf3ed127a6aa65", "name": "/usr/lib/python3.12/test/libregrtest/setup.py", "type": "file" }, { - "bom-ref": "ec6cde4e88c77357", + "bom-ref": "9af7b63ed62cc4cb", "name": "/usr/lib/python3.12/test/libregrtest/single.py", "type": "file" }, { - "bom-ref": "026040fd9ea86204", + "bom-ref": "c68ee5554a343844", "name": "/usr/lib/python3.12/test/libregrtest/testresult.py", "type": "file" }, { - "bom-ref": "025609adb8cd0383", + "bom-ref": "b1c8aaaf519e34db", "name": "/usr/lib/python3.12/test/libregrtest/tsan.py", "type": "file" }, { - "bom-ref": "ed477ab15b8d36a9", + "bom-ref": "40ac744f89d9702d", "name": "/usr/lib/python3.12/test/libregrtest/utils.py", "type": "file" }, { - "bom-ref": "ce8545a5444369bf", + "bom-ref": "746fdfba33bfcf23", "name": "/usr/lib/python3.12/test/libregrtest/win_utils.py", "type": "file" }, { - "bom-ref": "6b1da0ab1ffc7718", + "bom-ref": "0889d930ed0986a0", "name": "/usr/lib/python3.12/test/libregrtest/worker.py", "type": "file" }, { - "bom-ref": "0b23d2ac45b99837", + "bom-ref": "1b2e4c10fd9cd57b", "name": "/usr/lib/python3.12/test/regrtest.py", "type": "file" }, { - "bom-ref": "a425ca2e92fc9810", + "bom-ref": "197147f6400a4238", "name": "/usr/lib/python3.12/test/support/__init__.py", "type": "file" }, { - "bom-ref": "2afd65357ebce61a", + "bom-ref": "009720963321ccd6", "name": "/usr/lib/python3.12/test/support/_hypothesis_stubs/__init__.py", "type": "file" }, { - "bom-ref": "5baedfb3c8c82c5d", + "bom-ref": "cf98edd22d92e7a9", "name": "/usr/lib/python3.12/test/support/_hypothesis_stubs/_helpers.py", "type": "file" }, { - "bom-ref": "300042a6146c3839", + "bom-ref": "640186294a6c88e5", "name": "/usr/lib/python3.12/test/support/_hypothesis_stubs/strategies.py", "type": "file" }, { - "bom-ref": "f25f815efd78660a", + "bom-ref": "2b13ba8eae880cfe", "name": "/usr/lib/python3.12/test/support/ast_helper.py", "type": "file" }, { - "bom-ref": "30d501f360bb6e7f", + "bom-ref": "fd954a2851a53857", "name": "/usr/lib/python3.12/test/support/asynchat.py", "type": "file" }, { - "bom-ref": "ce79186640bebbdb", + "bom-ref": "23e9e2989c6d4ec7", "name": "/usr/lib/python3.12/test/support/asyncore.py", "type": "file" }, { - "bom-ref": "b6e4782b823033ee", + "bom-ref": "89ef88fa9d6f0826", "name": "/usr/lib/python3.12/test/support/bytecode_helper.py", "type": "file" }, { - "bom-ref": "778a0e42e7d2a7f6", + "bom-ref": "7d9a284659542dda", "name": "/usr/lib/python3.12/test/support/hashlib_helper.py", "type": "file" }, { - "bom-ref": "0a69b2bffb73954e", + "bom-ref": "bb8117fad8067192", "name": "/usr/lib/python3.12/test/support/hypothesis_helper.py", "type": "file" }, { - "bom-ref": "7aaca04b54cc442e", + "bom-ref": "b765fbf319aa5246", "name": "/usr/lib/python3.12/test/support/import_helper.py", "type": "file" }, { - "bom-ref": "6c85dcd015eb1688", + "bom-ref": "9a8091f33fc0c344", "name": "/usr/lib/python3.12/test/support/interpreters.py", "type": "file" }, { - "bom-ref": "aba8416a90225547", + "bom-ref": "204e2521221c499b", "name": "/usr/lib/python3.12/test/support/logging_helper.py", "type": "file" }, { - "bom-ref": "3ce6cbb5b55aaba8", + "bom-ref": "4206ce26cb273280", "name": "/usr/lib/python3.12/test/support/os_helper.py", "type": "file" }, { - "bom-ref": "050f48190bb3cf79", + "bom-ref": "4c475fc3fb9ce239", "name": "/usr/lib/python3.12/test/support/pty_helper.py", "type": "file" }, { - "bom-ref": "92785a192ccdc9e9", + "bom-ref": "559070fdff583ef9", "name": "/usr/lib/python3.12/test/support/script_helper.py", "type": "file" }, { - "bom-ref": "0b0c962932021317", + "bom-ref": "b2b9f446ee3f206b", "name": "/usr/lib/python3.12/test/support/smtpd.py", "type": "file" }, { - "bom-ref": "1f7c9330a829928d", + "bom-ref": "e484ad7802a0a1ed", "name": "/usr/lib/python3.12/test/support/socket_helper.py", "type": "file" }, { - "bom-ref": "c3f710cf25c736ea", + "bom-ref": "a3eee88b6e26698a", "name": "/usr/lib/python3.12/test/support/testcase.py", "type": "file" }, { - "bom-ref": "811a5794a89362fe", + "bom-ref": "0a93a6992bfdfc9e", "name": "/usr/lib/python3.12/test/support/threading_helper.py", "type": "file" }, { - "bom-ref": "f1aeb739e98f140d", + "bom-ref": "8aaab1f69460501d", "name": "/usr/lib/python3.12/test/support/warnings_helper.py", "type": "file" }, { - "bom-ref": "f6be1590cfa898eb", + "bom-ref": "c12fe11d5283d99b", "name": "/usr/lib/python3.12/test/test_support.py", "type": "file" }, { - "bom-ref": "3f3a87162769ee56", + "bom-ref": "c1bc45bcac22faf2", "name": "/usr/lib/python3.12/test/typinganndata/__init__.py", "type": "file" }, { - "bom-ref": "6771630efe217b8a", + "bom-ref": "d292927035a5157a", "name": "/usr/lib/python3.12/test/typinganndata/_typed_dict_helper.py", "type": "file" }, { - "bom-ref": "ef98cc8619bfc55e", + "bom-ref": "610ad69301b3321e", "name": "/usr/lib/python3.12/test/typinganndata/ann_module.py", "type": "file" }, { - "bom-ref": "6c6f745c098c5404", + "bom-ref": "d501b2b3720f5758", "name": "/usr/lib/python3.12/test/typinganndata/ann_module2.py", "type": "file" }, { - "bom-ref": "40689bbd1ee952de", + "bom-ref": "efd15f61563cad06", "name": "/usr/lib/python3.12/test/typinganndata/ann_module3.py", "type": "file" }, { - "bom-ref": "9800b162819f2fcc", + "bom-ref": "9ae3c3f39c8a14c0", "name": "/usr/lib/python3.12/test/typinganndata/ann_module4.py", "type": "file" }, { - "bom-ref": "786bd95dc41ef72b", + "bom-ref": "b868da575fe39ffb", "name": "/usr/lib/python3.12/test/typinganndata/ann_module5.py", "type": "file" }, { - "bom-ref": "f9c2c966619e6a0b", + "bom-ref": "7ac757b1aa64b16b", "name": "/usr/lib/python3.12/test/typinganndata/ann_module6.py", "type": "file" }, { - "bom-ref": "f7e2b948ca701178", + "bom-ref": "542715fa81c70314", "name": "/usr/lib/python3.12/test/typinganndata/ann_module7.py", "type": "file" }, { - "bom-ref": "b3392f047fad3427", + "bom-ref": "e6fe2143c5b0653b", "name": "/usr/lib/python3.12/test/typinganndata/ann_module8.py", "type": "file" }, { - "bom-ref": "26a648ac09cfb0db", + "bom-ref": "4e78ab36f204730b", "name": "/usr/lib/python3.12/test/typinganndata/ann_module9.py", "type": "file" }, { - "bom-ref": "15fba7832fbe387d", + "bom-ref": "f1346a3578df42e9", "name": "/usr/lib/python3.12/test/typinganndata/mod_generics_cache.py", "type": "file" }, { - "bom-ref": "dab5d082e21e7750", + "bom-ref": "8dbb54b6ee7e7da0", "name": "/usr/lib/python3.12/textwrap.py", "type": "file" }, { - "bom-ref": "f4f03d42fa319cd8", + "bom-ref": "37607e3cd10c6e78", "name": "/usr/lib/python3.12/this.py", "type": "file" }, { - "bom-ref": "5bf0ac27c2aa510d", + "bom-ref": "ca1a82d30e33ce71", "name": "/usr/lib/python3.12/threading.py", "type": "file" }, { - "bom-ref": "071aaa83be27227f", + "bom-ref": "d10cf93b08015d4b", "name": "/usr/lib/python3.12/timeit.py", "type": "file" }, { - "bom-ref": "57be7a7333dec1a7", + "bom-ref": "21d5a24fcf06ba9b", "name": "/usr/lib/python3.12/token.py", "type": "file" }, { - "bom-ref": "acbf95ecb14ea356", + "bom-ref": "d58157767c10e122", "name": "/usr/lib/python3.12/tokenize.py", "type": "file" }, { - "bom-ref": "0f26d6847befcbf2", + "bom-ref": "3c9adae81e6cc2f6", "name": "/usr/lib/python3.12/tomllib/__init__.py", "type": "file" }, { - "bom-ref": "d44eb38ee09b55c6", + "bom-ref": "fc231a6db9ab41ca", "name": "/usr/lib/python3.12/tomllib/_parser.py", "type": "file" }, { - "bom-ref": "9c575cead9b1c264", + "bom-ref": "8b1d5edebf7f087c", "name": "/usr/lib/python3.12/tomllib/_re.py", "type": "file" }, { - "bom-ref": "ee429f65a77ce9ac", + "bom-ref": "479b330a22a3898c", "name": "/usr/lib/python3.12/tomllib/_types.py", "type": "file" }, { - "bom-ref": "bfe4630f8d71b93c", + "bom-ref": "b917703082f35854", "name": "/usr/lib/python3.12/trace.py", "type": "file" }, { - "bom-ref": "86b277a0e7aa82e9", + "bom-ref": "0900de1f4a987a99", "name": "/usr/lib/python3.12/traceback.py", "type": "file" }, { - "bom-ref": "772e2eddb06f72f2", + "bom-ref": "96c3795980197466", "name": "/usr/lib/python3.12/tracemalloc.py", "type": "file" }, { - "bom-ref": "4f60ede001ff8bf6", + "bom-ref": "61b0f8c273092096", "name": "/usr/lib/python3.12/tty.py", "type": "file" }, { - "bom-ref": "bdcefa5262485e1c", + "bom-ref": "5d633132b2d03fe4", "name": "/usr/lib/python3.12/turtle.py", "type": "file" }, { - "bom-ref": "8f907c29c28895a7", + "bom-ref": "c63607babed716af", "name": "/usr/lib/python3.12/types.py", "type": "file" }, { - "bom-ref": "4b0e06692ec62cb7", + "bom-ref": "e3d3d6a7dd33c2bb", "name": "/usr/lib/python3.12/typing.py", "type": "file" }, { - "bom-ref": "33ebce66c5b67009", + "bom-ref": "ab832f367fc9d921", "name": "/usr/lib/python3.12/unittest/__init__.py", "type": "file" }, { - "bom-ref": "0f803937aeefdb86", + "bom-ref": "bed9bae087ed0502", "name": "/usr/lib/python3.12/unittest/__main__.py", "type": "file" }, { - "bom-ref": "abc7fbcb3a23e14d", + "bom-ref": "ff6f598a214eed35", "name": "/usr/lib/python3.12/unittest/_log.py", "type": "file" }, { - "bom-ref": "8706186e4ee628b7", + "bom-ref": "d4df57bb8ec61463", "name": "/usr/lib/python3.12/unittest/async_case.py", "type": "file" }, { - "bom-ref": "202e250a3faefe6a", + "bom-ref": "e0ae091159f7a206", "name": "/usr/lib/python3.12/unittest/case.py", "type": "file" }, { - "bom-ref": "e804c657a4d88cda", + "bom-ref": "a6ae4c6edd3cfa92", "name": "/usr/lib/python3.12/unittest/loader.py", "type": "file" }, { - "bom-ref": "d6162c79aef2724b", + "bom-ref": "b2e32cadf0d8e617", "name": "/usr/lib/python3.12/unittest/main.py", "type": "file" }, { - "bom-ref": "4ae72acfd5d5594d", + "bom-ref": "1e5e4e2dd0607355", "name": "/usr/lib/python3.12/unittest/mock.py", "type": "file" }, { - "bom-ref": "a86318ea6d913145", + "bom-ref": "0ac78c2a72f85871", "name": "/usr/lib/python3.12/unittest/result.py", "type": "file" }, { - "bom-ref": "8be71f2e2d33ddaa", + "bom-ref": "bcfc7ea4ce11998e", "name": "/usr/lib/python3.12/unittest/runner.py", "type": "file" }, { - "bom-ref": "4be3e3d2890d47fd", + "bom-ref": "238bb03fdcb1ea39", "name": "/usr/lib/python3.12/unittest/signals.py", "type": "file" }, { - "bom-ref": "00ac88036bfaae34", + "bom-ref": "6148d79e96c3e994", "name": "/usr/lib/python3.12/unittest/suite.py", "type": "file" }, { - "bom-ref": "2089bacdf58a19f0", + "bom-ref": "6809f79911039acc", "name": "/usr/lib/python3.12/unittest/util.py", "type": "file" }, { - "bom-ref": "ecfa61b0fd25ef5e", + "bom-ref": "605025c7d1e4a042", "name": "/usr/lib/python3.12/urllib/__init__.py", "type": "file" }, { - "bom-ref": "5cdec84155c9dcf8", + "bom-ref": "1f19f9300bb593a0", "name": "/usr/lib/python3.12/urllib/error.py", "type": "file" }, { - "bom-ref": "9ccd9c3225b350ac", + "bom-ref": "625a9c11babb0130", "name": "/usr/lib/python3.12/urllib/parse.py", "type": "file" }, { - "bom-ref": "a536526f178a7bcb", + "bom-ref": "94d04b29638a39db", "name": "/usr/lib/python3.12/urllib/request.py", "type": "file" }, { - "bom-ref": "445242ffe9f12e19", + "bom-ref": "255b402596b8a529", "name": "/usr/lib/python3.12/urllib/response.py", "type": "file" }, { - "bom-ref": "d9a5c76997d967ff", + "bom-ref": "dd9475daec9253e3", "name": "/usr/lib/python3.12/urllib/robotparser.py", "type": "file" }, { - "bom-ref": "f89cbc1d764ddce6", + "bom-ref": "2507bd4a7e5e2a9e", "name": "/usr/lib/python3.12/uu.py", "type": "file" }, { - "bom-ref": "16d9f7981a6cfb39", + "bom-ref": "4b374d1ffa46d569", "name": "/usr/lib/python3.12/uuid.py", "type": "file" }, { - "bom-ref": "db276b27f8b7d7b6", + "bom-ref": "b592e639466bce3e", "name": "/usr/lib/python3.12/venv/__init__.py", "type": "file" }, { - "bom-ref": "cb1ae9ee339e4467", + "bom-ref": "0c60ab066510e1e7", "name": "/usr/lib/python3.12/venv/__main__.py", "type": "file" }, { - "bom-ref": "c6f0efef5723f296", + "bom-ref": "bca08b6068cf251a", "name": "/usr/lib/python3.12/venv/scripts/common/Activate.ps1", "type": "file" }, { - "bom-ref": "2d04620f3bc5398e", + "bom-ref": "9413318baef0b7aa", "name": "/usr/lib/python3.12/venv/scripts/common/activate", "type": "file" }, { - "bom-ref": "92ed0eebadf5ded3", + "bom-ref": "a6cfb984eec663ab", "name": "/usr/lib/python3.12/venv/scripts/posix/activate.csh", "type": "file" }, { - "bom-ref": "b642f50e3b45117f", + "bom-ref": "914279e6c369d723", "name": "/usr/lib/python3.12/venv/scripts/posix/activate.fish", "type": "file" }, { - "bom-ref": "c9b177c2fb412e6a", + "bom-ref": "8af5ab634ce5b26a", "name": "/usr/lib/python3.12/warnings.py", "type": "file" }, { - "bom-ref": "b11bbdff464d715c", + "bom-ref": "7958c7745240d588", "name": "/usr/lib/python3.12/wave.py", "type": "file" }, { - "bom-ref": "abba578630f68422", + "bom-ref": "c61d7a0aaf90449a", "name": "/usr/lib/python3.12/weakref.py", "type": "file" }, { - "bom-ref": "2a493db8ee8d95ad", + "bom-ref": "be4669072eec9189", "name": "/usr/lib/python3.12/webbrowser.py", "type": "file" }, { - "bom-ref": "d6dfa83e5068ef27", + "bom-ref": "5d15efb39f5cf5d7", "name": "/usr/lib/python3.12/wsgiref/__init__.py", "type": "file" }, { - "bom-ref": "e8ceb01019401551", + "bom-ref": "d9faf1edcec3f17d", "name": "/usr/lib/python3.12/wsgiref/handlers.py", "type": "file" }, { - "bom-ref": "a571193abc91c204", + "bom-ref": "f45bd1d650aaec0c", "name": "/usr/lib/python3.12/wsgiref/headers.py", "type": "file" }, { - "bom-ref": "362837c0cbbc12e9", + "bom-ref": "6ae08a4f39ce9e99", "name": "/usr/lib/python3.12/wsgiref/simple_server.py", "type": "file" }, { - "bom-ref": "83edd0909762eb80", + "bom-ref": "f4ec540bb0d8156c", "name": "/usr/lib/python3.12/wsgiref/types.py", "type": "file" }, { - "bom-ref": "05a15642f3aa3907", + "bom-ref": "66cdcc4a10872977", "name": "/usr/lib/python3.12/wsgiref/util.py", "type": "file" }, { - "bom-ref": "718ccc08df4a738f", + "bom-ref": "61baf4a364120d6f", "name": "/usr/lib/python3.12/wsgiref/validate.py", "type": "file" }, { - "bom-ref": "e708eaa4cd7861ca", + "bom-ref": "0430212d3d227a26", "name": "/usr/lib/python3.12/xdrlib.py", "type": "file" }, { - "bom-ref": "96dee0b2674cbc14", + "bom-ref": "9f5ee2dc0151104c", "name": "/usr/lib/python3.12/xml/__init__.py", "type": "file" }, { - "bom-ref": "dca726fb08e1d576", + "bom-ref": "d3f64a183bcd80ae", "name": "/usr/lib/python3.12/xml/dom/NodeFilter.py", "type": "file" }, { - "bom-ref": "ffd0311b16081ac6", + "bom-ref": "58f2f26de5c81dce", "name": "/usr/lib/python3.12/xml/dom/__init__.py", "type": "file" }, { - "bom-ref": "33bb1d5935c7eec1", + "bom-ref": "1db8b1fa77a6910d", "name": "/usr/lib/python3.12/xml/dom/domreg.py", "type": "file" }, { - "bom-ref": "1f88ee5c7169d0e2", + "bom-ref": "628dedb4fc99d522", "name": "/usr/lib/python3.12/xml/dom/expatbuilder.py", "type": "file" }, { - "bom-ref": "6a1fe5327c90db5b", + "bom-ref": "1ce7b905bd022aeb", "name": "/usr/lib/python3.12/xml/dom/minicompat.py", "type": "file" }, { - "bom-ref": "42e53fd152479261", + "bom-ref": "6aae47c443eac679", "name": "/usr/lib/python3.12/xml/dom/minidom.py", "type": "file" }, { - "bom-ref": "2ebefdc855c16fa2", + "bom-ref": "06d88f3497b77b5e", "name": "/usr/lib/python3.12/xml/dom/pulldom.py", "type": "file" }, { - "bom-ref": "ee959be7cab021db", + "bom-ref": "31c4c95f1c97485f", "name": "/usr/lib/python3.12/xml/dom/xmlbuilder.py", "type": "file" }, { - "bom-ref": "8b533757973619a0", + "bom-ref": "a0421e72786571a0", "name": "/usr/lib/python3.12/xml/etree/ElementInclude.py", "type": "file" }, { - "bom-ref": "0feafc30cff5f5ca", + "bom-ref": "0915e943af6f6e1e", "name": "/usr/lib/python3.12/xml/etree/ElementPath.py", "type": "file" }, { - "bom-ref": "2734c24a3e03c6e9", + "bom-ref": "5bcf685a9a057691", "name": "/usr/lib/python3.12/xml/etree/ElementTree.py", "type": "file" }, { - "bom-ref": "3f1af65e3d81b7f7", + "bom-ref": "47b79116eb0fda67", "name": "/usr/lib/python3.12/xml/etree/__init__.py", "type": "file" }, { - "bom-ref": "7d6937d6ee9f028c", + "bom-ref": "709d6768400d8120", "name": "/usr/lib/python3.12/xml/etree/cElementTree.py", "type": "file" }, { - "bom-ref": "82527fa9f434f290", + "bom-ref": "2286ea8a7d1bea48", "name": "/usr/lib/python3.12/xml/parsers/__init__.py", "type": "file" }, { - "bom-ref": "91910cdcf8af576d", + "bom-ref": "2b4c20d72fad3681", "name": "/usr/lib/python3.12/xml/parsers/expat.py", "type": "file" }, { - "bom-ref": "0fe3e61da4e8dbc6", + "bom-ref": "c7bed95bd3336e46", "name": "/usr/lib/python3.12/xml/sax/__init__.py", "type": "file" }, { - "bom-ref": "057c8dbe2112c384", + "bom-ref": "3ed1746d6c434300", "name": "/usr/lib/python3.12/xml/sax/_exceptions.py", "type": "file" }, { - "bom-ref": "86b4abbec737d7ea", + "bom-ref": "692abad32743ba36", "name": "/usr/lib/python3.12/xml/sax/expatreader.py", "type": "file" }, { - "bom-ref": "65dda21d0d89c46d", + "bom-ref": "66e63a515f078f49", "name": "/usr/lib/python3.12/xml/sax/handler.py", "type": "file" }, { - "bom-ref": "6445b0138ab19c10", + "bom-ref": "8d3f5dbd49e2748c", "name": "/usr/lib/python3.12/xml/sax/saxutils.py", "type": "file" }, { - "bom-ref": "afe3531709b7e2f2", + "bom-ref": "7e3158fbf02313e2", "name": "/usr/lib/python3.12/xml/sax/xmlreader.py", "type": "file" }, { - "bom-ref": "a4fcb63584ccbfcc", + "bom-ref": "f457e5a7773f96d4", "name": "/usr/lib/python3.12/xmlrpc/__init__.py", "type": "file" }, { - "bom-ref": "1822cbfb6ad9a604", + "bom-ref": "6cb7963b7f539fd8", "name": "/usr/lib/python3.12/xmlrpc/client.py", "type": "file" }, { - "bom-ref": "310ac738626727e3", + "bom-ref": "5b840ab49fde1f97", "name": "/usr/lib/python3.12/xmlrpc/server.py", "type": "file" }, { - "bom-ref": "b6ff02792fecdf7d", + "bom-ref": "0867c933b859d13d", "name": "/usr/lib/python3.12/zipapp.py", "type": "file" }, { - "bom-ref": "a7711cf6d4bb85e3", + "bom-ref": "400aa5defcd62b8f", "name": "/usr/lib/python3.12/zipfile/__init__.py", "type": "file" }, { - "bom-ref": "a51bfe83df1112f6", + "bom-ref": "b8029d41eed5d59e", "name": "/usr/lib/python3.12/zipfile/__main__.py", "type": "file" }, { - "bom-ref": "da756deac4c52387", + "bom-ref": "f373a9b29c272ac7", "name": "/usr/lib/python3.12/zipfile/_path/__init__.py", "type": "file" }, { - "bom-ref": "d5a84e82b31669b0", + "bom-ref": "f4804053d6de5454", "name": "/usr/lib/python3.12/zipfile/_path/glob.py", "type": "file" }, { - "bom-ref": "9ebe1a2ba0a9cf46", + "bom-ref": "d11e67a8cb2e2af6", "name": "/usr/lib/python3.12/zipimport.py", "type": "file" }, { - "bom-ref": "cd34ed8900a59ffc", + "bom-ref": "cd254fa3b49ed734", "name": "/usr/lib/python3.12/zoneinfo/__init__.py", "type": "file" }, { - "bom-ref": "a7ee2d89c935de61", + "bom-ref": "2f7e78b52f5f7a85", "name": "/usr/lib/python3.12/zoneinfo/_common.py", "type": "file" }, { - "bom-ref": "a0983b95c520d100", + "bom-ref": "8f9b8659442914d8", "name": "/usr/lib/python3.12/zoneinfo/_tzpath.py", "type": "file" }, { - "bom-ref": "55e96f13f13cd43b", + "bom-ref": "9db8a05d80e15b2f", "name": "/usr/lib/python3.12/zoneinfo/_zoneinfo.py", "type": "file" }, { - "bom-ref": "414f4dd7661eb7d5", + "bom-ref": "1276a8a69d352357", "name": "/usr/lib/python3/dist-packages/PyYAML-6.0.1.dist-info/INSTALLER", "type": "file" }, { - "bom-ref": "e6e723edb6f9f9c2", + "bom-ref": "3f08db22822415cc", "name": "/usr/lib/python3/dist-packages/PyYAML-6.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8ef70885d520bffb", + "bom-ref": "447edba022f97fe5", "name": "/usr/lib/python3/dist-packages/PyYAML-6.0.1.dist-info/WHEEL", "type": "file" }, { - "bom-ref": "600d1faa6d2db284", + "bom-ref": "7d5c5244bdc1ea8e", "name": "/usr/lib/python3/dist-packages/PyYAML-6.0.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "24c041feccb29a53", + "bom-ref": "4994d3ffb2f75a6d", "name": "/usr/lib/python3/dist-packages/_distutils_hack/__init__.py", "type": "file" }, { - "bom-ref": "fcc98ab757f35948", + "bom-ref": "7442c23a581a8a06", "name": "/usr/lib/python3/dist-packages/_distutils_hack/override.py", "type": "file" }, { - "bom-ref": "352f544a822aac91", + "bom-ref": "505ad7e1d7c104d7", "name": "/usr/lib/python3/dist-packages/_yaml/__init__.py", "type": "file" }, { - "bom-ref": "a0c5b7e18fb088c7", + "bom-ref": "e54753fc8f4fde11", "name": "/usr/lib/python3/dist-packages/distutils-precedence.pth", "type": "file" }, { - "bom-ref": "188eafbe78fbdf66", + "bom-ref": "1ccc8f7a30d021f8", "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/INSTALLER", "type": "file" }, { - "bom-ref": "e107ca46b5f7f660", + "bom-ref": "b04e43be3866846a", "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "025183629f3b5ffc", + "bom-ref": "99c2be3bd1cc392a", "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/WHEEL", "type": "file" }, { - "bom-ref": "e6933def9b17074d", + "bom-ref": "54ea439e6815b28b", "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/entry_points.txt", "type": "file" }, { - "bom-ref": "4f07866d8fc17ebb", + "bom-ref": "be4f12c8a5d20669", "name": "/usr/lib/python3/dist-packages/pip-24.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "5cc96569bb5b34c7", + "bom-ref": "ed7ccdec2bd7bf3d", "name": "/usr/lib/python3/dist-packages/pip/__init__.py", "type": "file" }, { - "bom-ref": "eab11b74935be7de", + "bom-ref": "ce1ca0b405249ba4", "name": "/usr/lib/python3/dist-packages/pip/__main__.py", "type": "file" }, { - "bom-ref": "5017a3e5e24731dc", + "bom-ref": "a69fd493b2ed05f6", "name": "/usr/lib/python3/dist-packages/pip/__pip-runner__.py", "type": "file" }, { - "bom-ref": "0482fc3db9acf851", + "bom-ref": "2d9fbb84ed58955b", "name": "/usr/lib/python3/dist-packages/pip/_internal/__init__.py", "type": "file" }, { - "bom-ref": "030884e7d93efecf", + "bom-ref": "652eee73e7f7bd9d", "name": "/usr/lib/python3/dist-packages/pip/_internal/build_env.py", "type": "file" }, { - "bom-ref": "8595bdb2741bedf7", + "bom-ref": "da486b7fbc61e239", "name": "/usr/lib/python3/dist-packages/pip/_internal/cache.py", "type": "file" }, { - "bom-ref": "be01ef6a7c07536a", + "bom-ref": "c62aa42854a13924", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/__init__.py", "type": "file" }, { - "bom-ref": "25c88dcd629f4c06", + "bom-ref": "ef71f27a777bf88c", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/autocompletion.py", "type": "file" }, { - "bom-ref": "d85be754a12590d5", + "bom-ref": "7de87ac181f426ff", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/base_command.py", "type": "file" }, { - "bom-ref": "4dd99248ab43acab", + "bom-ref": "f4980cb2d970c1a5", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/cmdoptions.py", "type": "file" }, { - "bom-ref": "b0cc88ded76d824b", + "bom-ref": "c7f0c0cf82a01069", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/command_context.py", "type": "file" }, { - "bom-ref": "4018d86f9f2f4671", + "bom-ref": "c9bcbdbe82e0003b", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/main.py", "type": "file" }, { - "bom-ref": "e65ca26b247c2c19", + "bom-ref": "c0fa667a21fd3b9f", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/main_parser.py", "type": "file" }, { - "bom-ref": "ecaed1353980fa44", + "bom-ref": "69e64b2ebd7c0b1e", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/parser.py", "type": "file" }, { - "bom-ref": "6069ffc15283f250", + "bom-ref": "0fc15a5dda96f80a", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/progress_bars.py", "type": "file" }, { - "bom-ref": "b317e3e5905cb7fd", + "bom-ref": "e5ef73a37ba9f5e7", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/req_command.py", "type": "file" }, { - "bom-ref": "8b126caab979c662", + "bom-ref": "09456e26f5f913bc", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/spinners.py", "type": "file" }, { - "bom-ref": "2cb7b17686b4714a", + "bom-ref": "d1f97898f969c510", "name": "/usr/lib/python3/dist-packages/pip/_internal/cli/status_codes.py", "type": "file" }, { - "bom-ref": "9b43a63a9da93c80", + "bom-ref": "c87bcdae92793082", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/__init__.py", "type": "file" }, { - "bom-ref": "63a71263d0552544", + "bom-ref": "c30fbbd50bd06cee", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/cache.py", "type": "file" }, { - "bom-ref": "85b91e612a94e69b", + "bom-ref": "6b5023c89afac5f5", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/check.py", "type": "file" }, { - "bom-ref": "b973f1e87ed627e2", + "bom-ref": "994024a203e04b08", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/completion.py", "type": "file" }, { - "bom-ref": "de08537241bdbe83", + "bom-ref": "5063e79a70df1081", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/configuration.py", "type": "file" }, { - "bom-ref": "ae3a9c749d32d41b", + "bom-ref": "a58323e52aa58075", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/debug.py", "type": "file" }, { - "bom-ref": "2105e790905f295d", + "bom-ref": "205f5a4c9da35723", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/download.py", "type": "file" }, { - "bom-ref": "2825357e03a53604", + "bom-ref": "06a800bde7bdd0e6", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/freeze.py", "type": "file" }, { - "bom-ref": "99acd4b06c5af9f5", + "bom-ref": "c475d39258f725a3", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/hash.py", "type": "file" }, { - "bom-ref": "8a98ab0fdf457443", + "bom-ref": "fe396410466a7139", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/help.py", "type": "file" }, { - "bom-ref": "dc2b578172245374", + "bom-ref": "7a802ed6e931c73a", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/index.py", "type": "file" }, { - "bom-ref": "0541c67bc33ae040", + "bom-ref": "9b3199f800c21f2a", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/inspect.py", "type": "file" }, { - "bom-ref": "c15ecda247af5f07", + "bom-ref": "6d22905fa6f005fd", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/install.py", "type": "file" }, { - "bom-ref": "dac5547f2ed9bd17", + "bom-ref": "02a2edc314037cdd", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/list.py", "type": "file" }, { - "bom-ref": "cd32c395433f8935", + "bom-ref": "0453e2d8c8074d57", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/search.py", "type": "file" }, { - "bom-ref": "cd9d466d143c2897", + "bom-ref": "92b3446734ff2755", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/show.py", "type": "file" }, { - "bom-ref": "07d6eb1618845b49", + "bom-ref": "cf6ce8ac3000dff7", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/uninstall.py", "type": "file" }, { - "bom-ref": "1aa0827fee99e640", + "bom-ref": "31808faa2e0d384a", "name": "/usr/lib/python3/dist-packages/pip/_internal/commands/wheel.py", "type": "file" }, { - "bom-ref": "b230fc6fbd48438c", + "bom-ref": "c03effe8fe40ee6e", "name": "/usr/lib/python3/dist-packages/pip/_internal/configuration.py", "type": "file" }, { - "bom-ref": "2cc8c1355c8ca42b", + "bom-ref": "3b43289b1bd16dd5", "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/__init__.py", "type": "file" }, { - "bom-ref": "5facb3ecb75311e1", + "bom-ref": "d56f8231f25efedb", "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/base.py", "type": "file" }, { - "bom-ref": "2ba1914c2be83cff", + "bom-ref": "c3684ad003533439", "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/installed.py", "type": "file" }, { - "bom-ref": "91ff8e74209ad490", + "bom-ref": "ab35ab6b9b947722", "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/sdist.py", "type": "file" }, { - "bom-ref": "1e575794dd453bc4", + "bom-ref": "73394e65a6947b2e", "name": "/usr/lib/python3/dist-packages/pip/_internal/distributions/wheel.py", "type": "file" }, { - "bom-ref": "ddd239c207bfe621", + "bom-ref": "1bede8d2e3b519eb", "name": "/usr/lib/python3/dist-packages/pip/_internal/exceptions.py", "type": "file" }, { - "bom-ref": "dea7dc76879a517a", + "bom-ref": "48ccc867cb5479f0", "name": "/usr/lib/python3/dist-packages/pip/_internal/index/__init__.py", "type": "file" }, { - "bom-ref": "4696ac2e529b84f3", + "bom-ref": "ff42f4651d5e07ed", "name": "/usr/lib/python3/dist-packages/pip/_internal/index/collector.py", "type": "file" }, { - "bom-ref": "bb037f4a85f9fadf", + "bom-ref": "385e17cbde0375ed", "name": "/usr/lib/python3/dist-packages/pip/_internal/index/package_finder.py", "type": "file" }, { - "bom-ref": "6b788b274d90dc9d", + "bom-ref": "2ab4281a21cf5d8f", "name": "/usr/lib/python3/dist-packages/pip/_internal/index/sources.py", "type": "file" }, { - "bom-ref": "2d841632f3716274", + "bom-ref": "ebf1455c59ec124a", "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/__init__.py", "type": "file" }, { - "bom-ref": "1d9a8dacb2451bba", + "bom-ref": "47d2658f4d655820", "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/_distutils.py", "type": "file" }, { - "bom-ref": "7b6739c6851f6b9c", + "bom-ref": "05e67378e12b533e", "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/_sysconfig.py", "type": "file" }, { - "bom-ref": "03127e71586a90a8", + "bom-ref": "c04569ac41756ede", "name": "/usr/lib/python3/dist-packages/pip/_internal/locations/base.py", "type": "file" }, { - "bom-ref": "6c3007b1cba1675f", + "bom-ref": "66e8d1fda7b6b049", "name": "/usr/lib/python3/dist-packages/pip/_internal/main.py", "type": "file" }, { - "bom-ref": "588057c20932dde7", + "bom-ref": "8ba28bc3a5bbd81d", "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/__init__.py", "type": "file" }, { - "bom-ref": "a326ea91ed0e5167", + "bom-ref": "b13fc13ae39e40cd", "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/_json.py", "type": "file" }, { - "bom-ref": "9fee2d9be1e37dde", + "bom-ref": "48a8fdd4cdb2edf8", "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/base.py", "type": "file" }, { - "bom-ref": "f32eac710f5503a9", + "bom-ref": "4bd60b2402599cd3", "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/__init__.py", "type": "file" }, { - "bom-ref": "1bb5754387537984", + "bom-ref": "d45af3437533623a", "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/_compat.py", "type": "file" }, { - "bom-ref": "781c75afbcee21b7", + "bom-ref": "11b069a2b7a007fd", "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/_dists.py", "type": "file" }, { - "bom-ref": "a6eef57ead64c2a5", + "bom-ref": "2d7bece1f10e3087", "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/importlib/_envs.py", "type": "file" }, { - "bom-ref": "7cf70f4df6f2f3c0", + "bom-ref": "27c414a4f6fa09b2", "name": "/usr/lib/python3/dist-packages/pip/_internal/metadata/pkg_resources.py", "type": "file" }, { - "bom-ref": "32ddb1fd486f7c4d", + "bom-ref": "dc4807abe90a6c7b", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/__init__.py", "type": "file" }, { - "bom-ref": "7bb7de1628c3ae76", + "bom-ref": "dc299096377dc540", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/candidate.py", "type": "file" }, { - "bom-ref": "7f2cfcfd52d774d6", + "bom-ref": "00662888ae8f7be0", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/direct_url.py", "type": "file" }, { - "bom-ref": "432a4eaf37ae6ab3", + "bom-ref": "2e2372bc567733f1", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/format_control.py", "type": "file" }, { - "bom-ref": "ae0e94a5ff39e6e9", + "bom-ref": "e48e274a702a4aef", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/index.py", "type": "file" }, { - "bom-ref": "ae60b4d2dfdd9224", + "bom-ref": "8167ac6e564d3b2a", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/installation_report.py", "type": "file" }, { - "bom-ref": "3ab93940a526b615", + "bom-ref": "2d63955b707d79c3", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/link.py", "type": "file" }, { - "bom-ref": "a3ff95d7a78625ad", + "bom-ref": "2042cab3f20566d3", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/scheme.py", "type": "file" }, { - "bom-ref": "43f6f4cf018e8ded", + "bom-ref": "8306f70551e9ae93", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/search_scope.py", "type": "file" }, { - "bom-ref": "62d7c5d09605f3c0", + "bom-ref": "8ffe534f5287db4e", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/selection_prefs.py", "type": "file" }, { - "bom-ref": "d679a243d6fedb3a", + "bom-ref": "6429a602a4444b48", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/target_python.py", "type": "file" }, { - "bom-ref": "f7a7bee443de0039", + "bom-ref": "eaedb7fa68c01f87", "name": "/usr/lib/python3/dist-packages/pip/_internal/models/wheel.py", "type": "file" }, { - "bom-ref": "d523500bf62f8175", + "bom-ref": "dc0470b1b36dfbab", "name": "/usr/lib/python3/dist-packages/pip/_internal/network/__init__.py", "type": "file" }, { - "bom-ref": "2d2fba5450d033da", + "bom-ref": "1223b825583ae04c", "name": "/usr/lib/python3/dist-packages/pip/_internal/network/auth.py", "type": "file" }, { - "bom-ref": "bf85ef269a29064a", + "bom-ref": "fdbb2237f1bc4120", "name": "/usr/lib/python3/dist-packages/pip/_internal/network/cache.py", "type": "file" }, { - "bom-ref": "ebe4cd2c8e6b1a3f", + "bom-ref": "0b1b6cd6700e38b9", "name": "/usr/lib/python3/dist-packages/pip/_internal/network/download.py", "type": "file" }, { - "bom-ref": "c2a47a283e0e4079", + "bom-ref": "d50a97ed4c0348a7", "name": "/usr/lib/python3/dist-packages/pip/_internal/network/lazy_wheel.py", "type": "file" }, { - "bom-ref": "d72580dd1e6d5343", + "bom-ref": "fd81251aa452d88d", "name": "/usr/lib/python3/dist-packages/pip/_internal/network/session.py", "type": "file" }, { - "bom-ref": "cf490816f8b99216", + "bom-ref": "80e91ea72ee31db4", "name": "/usr/lib/python3/dist-packages/pip/_internal/network/utils.py", "type": "file" }, { - "bom-ref": "be20e80773a22674", + "bom-ref": "e467957fde2539f2", "name": "/usr/lib/python3/dist-packages/pip/_internal/network/xmlrpc.py", "type": "file" }, { - "bom-ref": "7840f2f2e09a3b9b", + "bom-ref": "4674465c13ab56bd", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/__init__.py", "type": "file" }, { - "bom-ref": "11f12c54d2f6157b", + "bom-ref": "2d321447dc164a05", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/__init__.py", "type": "file" }, { - "bom-ref": "e55e5a09c05c6053", + "bom-ref": "fb7bb27b71ffcdd5", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/build_tracker.py", "type": "file" }, { - "bom-ref": "a84db9774aae9614", + "bom-ref": "25c6588f9a6c358a", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/metadata.py", "type": "file" }, { - "bom-ref": "12cfcdcdb9390638", + "bom-ref": "910bd9811e56a276", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/metadata_editable.py", "type": "file" }, { - "bom-ref": "18ab362d9a1628d1", + "bom-ref": "c7205a94e824b137", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/metadata_legacy.py", "type": "file" }, { - "bom-ref": "e41e939e87c8de19", + "bom-ref": "1113bf5cb07e6bef", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/wheel.py", "type": "file" }, { - "bom-ref": "8034759001fb55b6", + "bom-ref": "923d60ade227ae28", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/wheel_editable.py", "type": "file" }, { - "bom-ref": "3702924badefdac5", + "bom-ref": "c00b7de571c94a07", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/build/wheel_legacy.py", "type": "file" }, { - "bom-ref": "5256056dedfa0eaf", + "bom-ref": "3d3036d82b5c4cbd", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/check.py", "type": "file" }, { - "bom-ref": "58bd79450870aec6", + "bom-ref": "0ecb2ef8d42cba30", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/freeze.py", "type": "file" }, { - "bom-ref": "b2a8595a017cbd86", + "bom-ref": "df5808069dce8218", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/install/__init__.py", "type": "file" }, { - "bom-ref": "c225d543d2d68997", + "bom-ref": "faf8518af2f890d5", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/install/editable_legacy.py", "type": "file" }, { - "bom-ref": "295b95a61d6f55f0", + "bom-ref": "21938ac279594212", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/install/wheel.py", "type": "file" }, { - "bom-ref": "724091bd86fda448", + "bom-ref": "8f40eccbffca9c1a", "name": "/usr/lib/python3/dist-packages/pip/_internal/operations/prepare.py", "type": "file" }, { - "bom-ref": "fc043227c734580a", + "bom-ref": "8a8bf8974fd49e9c", "name": "/usr/lib/python3/dist-packages/pip/_internal/pyproject.py", "type": "file" }, { - "bom-ref": "b7f14128a8ac9b9c", + "bom-ref": "301b5f978c575dde", "name": "/usr/lib/python3/dist-packages/pip/_internal/req/__init__.py", "type": "file" }, { - "bom-ref": "09b469d4defd00f4", + "bom-ref": "1f5917cf519b9bc2", "name": "/usr/lib/python3/dist-packages/pip/_internal/req/constructors.py", "type": "file" }, { - "bom-ref": "89b4f968e1f569db", + "bom-ref": "31ddd9f87c9906ed", "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", "type": "file" }, { - "bom-ref": "283a983d5231f037", + "bom-ref": "a1f45bf0bd489ce5", "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_install.py", "type": "file" }, { - "bom-ref": "04b9fb530c1c50f4", + "bom-ref": "e5b5c64d20928fce", "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_set.py", "type": "file" }, { - "bom-ref": "0b0576d3b8ff4fcf", + "bom-ref": "3b765a4104a98e21", "name": "/usr/lib/python3/dist-packages/pip/_internal/req/req_uninstall.py", "type": "file" }, { - "bom-ref": "2a263c20338dbe81", + "bom-ref": "b25d630e610d075f", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/__init__.py", "type": "file" }, { - "bom-ref": "ca8fe3855ff18d8e", + "bom-ref": "bb3921eb43f0ef10", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/base.py", "type": "file" }, { - "bom-ref": "9c2b9bf8cede83c3", + "bom-ref": "5fdaabe45e68c799", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/legacy/__init__.py", "type": "file" }, { - "bom-ref": "ed7ce2c2e775f7af", + "bom-ref": "30bd11f249af6c79", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/legacy/resolver.py", "type": "file" }, { - "bom-ref": "95a17d4eb6e50ad0", + "bom-ref": "8b04dd1082807e02", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/__init__.py", "type": "file" }, { - "bom-ref": "75851df6dac610ef", + "bom-ref": "84c68bad68e1f4b1", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/base.py", "type": "file" }, { - "bom-ref": "f0b1f0e611e4602d", + "bom-ref": "5ebaa55831328c27", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/candidates.py", "type": "file" }, { - "bom-ref": "ef49bec040dc584f", + "bom-ref": "10bbdcd7baff9e25", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/factory.py", "type": "file" }, { - "bom-ref": "4aa513087b981330", + "bom-ref": "03bc49616f60c74a", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/found_candidates.py", "type": "file" }, { - "bom-ref": "30c6f797bcff3441", + "bom-ref": "2311c3154a7905cf", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/provider.py", "type": "file" }, { - "bom-ref": "e7a7dadda9bc36e9", + "bom-ref": "e624f6b1a426ca37", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/reporter.py", "type": "file" }, { - "bom-ref": "a56fae03993a12fb", + "bom-ref": "8ad3d66a672acca1", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/requirements.py", "type": "file" }, { - "bom-ref": "daa06e4dbb161b00", + "bom-ref": "cbfcd7197fdcee9e", "name": "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/resolver.py", "type": "file" }, { - "bom-ref": "b6dfa96ec15478d2", + "bom-ref": "a18f4fd5dbd67b7c", "name": "/usr/lib/python3/dist-packages/pip/_internal/self_outdated_check.py", "type": "file" }, { - "bom-ref": "a07add73d37d4a8a", + "bom-ref": "297dd208e0717bc4", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/__init__.py", "type": "file" }, { - "bom-ref": "1b2d68c6f5582fff", + "bom-ref": "9daf79aa16847b91", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/_jaraco_text.py", "type": "file" }, { - "bom-ref": "3a22d2496810f32b", + "bom-ref": "cf60ba9c10e621c5", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/_log.py", "type": "file" }, { - "bom-ref": "b67756700c78a8dd", + "bom-ref": "d6d15069cc224b63", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/appdirs.py", "type": "file" }, { - "bom-ref": "d1c5fee2fc667fb1", + "bom-ref": "f3cb330e012d72c3", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/compat.py", "type": "file" }, { - "bom-ref": "e5e23e3304e99bc1", + "bom-ref": "adb6231587c557e3", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/compatibility_tags.py", "type": "file" }, { - "bom-ref": "b4a28b3bce99c171", + "bom-ref": "3d5f6fd071174977", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/datetime.py", "type": "file" }, { - "bom-ref": "d493059ab6b4aac7", + "bom-ref": "e71bf1d6b68ea115", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/deprecation.py", "type": "file" }, { - "bom-ref": "a0723a664ee3444e", + "bom-ref": "555a60dad663e3d8", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/direct_url_helpers.py", "type": "file" }, { - "bom-ref": "54ae787e37b248e3", + "bom-ref": "99f3964a4d03718d", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/egg_link.py", "type": "file" }, { - "bom-ref": "1b05cb24430c9301", + "bom-ref": "47baa076fcd37817", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/encoding.py", "type": "file" }, { - "bom-ref": "8c8e433628517e0f", + "bom-ref": "1fc425bbec9984f9", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/entrypoints.py", "type": "file" }, { - "bom-ref": "15eccbdced5f49c8", + "bom-ref": "d9dc25f52336bef2", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/filesystem.py", "type": "file" }, { - "bom-ref": "a0ae758a9dd5b836", + "bom-ref": "d471566dc4fa2c58", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/filetypes.py", "type": "file" }, { - "bom-ref": "9e320ba350b98ff3", + "bom-ref": "e1d413297c5a38f1", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/glibc.py", "type": "file" }, { - "bom-ref": "fbda5c41e04fced4", + "bom-ref": "e03086e96c1f206e", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/hashes.py", "type": "file" }, { - "bom-ref": "1816d72b0299f886", + "bom-ref": "5d18727906c18b58", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/logging.py", "type": "file" }, { - "bom-ref": "2440e9b12ee728de", + "bom-ref": "dd02f88901f2e734", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/misc.py", "type": "file" }, { - "bom-ref": "5313caa0f46b3cd4", + "bom-ref": "0e0890d5429de77e", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/models.py", "type": "file" }, { - "bom-ref": "7d2c42db6bc01e84", + "bom-ref": "ea0b40f51268914a", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/packaging.py", "type": "file" }, { - "bom-ref": "3f194a1c5744f885", + "bom-ref": "e14eafa38a54b5bb", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/setuptools_build.py", "type": "file" }, { - "bom-ref": "1f76bfacce7fc145", + "bom-ref": "b3bc11fd61f5bad3", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/subprocess.py", "type": "file" }, { - "bom-ref": "9b47c13ce33e8935", + "bom-ref": "8c74b27ae92c17d7", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/temp_dir.py", "type": "file" }, { - "bom-ref": "9503c693d8d94547", + "bom-ref": "df14c8b1c1c256d5", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/unpacking.py", "type": "file" }, { - "bom-ref": "e6572f1348164f1c", + "bom-ref": "b2d8ec29f882078e", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/urls.py", "type": "file" }, { - "bom-ref": "7d1510074199061b", + "bom-ref": "b893f10d90965e45", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/virtualenv.py", "type": "file" }, { - "bom-ref": "59c1942621e0056d", + "bom-ref": "735e492c20a0344f", "name": "/usr/lib/python3/dist-packages/pip/_internal/utils/wheel.py", "type": "file" }, { - "bom-ref": "3f07ea460273decb", + "bom-ref": "6d4c51c08c462d41", "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/__init__.py", "type": "file" }, { - "bom-ref": "843735556b7f44fc", + "bom-ref": "fc03476c30b4d282", "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/bazaar.py", "type": "file" }, { - "bom-ref": "15cae37e91a003f9", + "bom-ref": "0c4fc9cfbbbb5f17", "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/git.py", "type": "file" }, { - "bom-ref": "82b0196b7fcbbbe3", + "bom-ref": "ad107d5369f78d51", "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/mercurial.py", "type": "file" }, { - "bom-ref": "56d2852a71b84206", + "bom-ref": "bded9dea30e0d33c", "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/subversion.py", "type": "file" }, { - "bom-ref": "40a82bd40ee1646d", + "bom-ref": "bcc1d2c50dc5fad3", "name": "/usr/lib/python3/dist-packages/pip/_internal/vcs/versioncontrol.py", "type": "file" }, { - "bom-ref": "e786ac1dd209634b", + "bom-ref": "d919af660f0877f5", "name": "/usr/lib/python3/dist-packages/pip/_internal/wheel_builder.py", "type": "file" }, { - "bom-ref": "04b584f3d5e7097b", + "bom-ref": "40dc6373b6527c49", "name": "/usr/lib/python3/dist-packages/pip/_vendor/__init__.py", "type": "file" }, { - "bom-ref": "761d3320f799fee2", + "bom-ref": "d13b458adf6cc71c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/__init__.py", "type": "file" }, { - "bom-ref": "01514f40a62b8d34", + "bom-ref": "405d6e232ef1c15a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/_cmd.py", "type": "file" }, { - "bom-ref": "4117b67a97899fa6", + "bom-ref": "275f5e9fb2ad115c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/adapter.py", "type": "file" }, { - "bom-ref": "4f0fbdf0a1b907ce", + "bom-ref": "6aeccf3f7dcd5394", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/cache.py", "type": "file" }, { - "bom-ref": "6fa8a467ffa747b6", + "bom-ref": "7d8d6076f1876038", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/caches/__init__.py", "type": "file" }, { - "bom-ref": "71524025334ed9d0", + "bom-ref": "c502968f5f666c4a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/caches/file_cache.py", "type": "file" }, { - "bom-ref": "0fd4c2178216b519", + "bom-ref": "1fb84de51b6128f3", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/caches/redis_cache.py", "type": "file" }, { - "bom-ref": "1c000e98700bae34", + "bom-ref": "e1521bfe47b47552", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/controller.py", "type": "file" }, { - "bom-ref": "bb5c8450bbf820b5", + "bom-ref": "23f26e9a121a1c7b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/filewrapper.py", "type": "file" }, { - "bom-ref": "28b3c6a8e78cecfd", + "bom-ref": "3ecbb0dadb649487", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/heuristics.py", "type": "file" }, { - "bom-ref": "1105e12a9ca6cfe2", + "bom-ref": "a5eaaebd8d7dfa64", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/serialize.py", "type": "file" }, { - "bom-ref": "1082431e4a5d0db1", + "bom-ref": "98447d501179ba4f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/cachecontrol/wrapper.py", "type": "file" }, { - "bom-ref": "aa9072d1b56fc43e", + "bom-ref": "a801a3fe8db438e4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/__init__.py", "type": "file" }, { - "bom-ref": "fb5646aed6a18a1b", + "bom-ref": "79d753122d733e39", "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/__main__.py", "type": "file" }, { - "bom-ref": "8870da0d753a5ec7", + "bom-ref": "3715a9076c5f1839", "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/cacert.pem", "type": "file" }, { - "bom-ref": "37d351e475c597f8", + "bom-ref": "dda44ffab9c30bde", "name": "/usr/lib/python3/dist-packages/pip/_vendor/certifi/core.py", "type": "file" }, { - "bom-ref": "2d2ffb10462a9ec6", + "bom-ref": "434a8c453badb994", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/__init__.py", "type": "file" }, { - "bom-ref": "47dff3733af9397a", + "bom-ref": "80e8a0ddc82e8f90", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/big5freq.py", "type": "file" }, { - "bom-ref": "bf5d36f37c05c3d1", + "bom-ref": "19f0c85c18a01257", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/big5prober.py", "type": "file" }, { - "bom-ref": "8b49ee5a6f0825fb", + "bom-ref": "d2f03b9db26747ad", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/chardistribution.py", "type": "file" }, { - "bom-ref": "71ff2515b6edf934", + "bom-ref": "83988ad06f0d6bee", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/charsetgroupprober.py", "type": "file" }, { - "bom-ref": "8241c9abc0447479", + "bom-ref": "bc16c1143752e63f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/charsetprober.py", "type": "file" }, { - "bom-ref": "b248e59569ccd100", + "bom-ref": "5194ea9a2f7cf136", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/cli/__init__.py", "type": "file" }, { - "bom-ref": "d9a7f5e1d1b44d59", + "bom-ref": "a8ab0c86d22f886b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/cli/chardetect.py", "type": "file" }, { - "bom-ref": "68b4916db3b26d30", + "bom-ref": "1722972f0e728aae", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/codingstatemachine.py", "type": "file" }, { - "bom-ref": "00ca6af80d05a03e", + "bom-ref": "8a97aea8a098e568", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/codingstatemachinedict.py", "type": "file" }, { - "bom-ref": "dabc95686415d350", + "bom-ref": "40fd648b20bb24d6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/cp949prober.py", "type": "file" }, { - "bom-ref": "dd370869384a5599", + "bom-ref": "83ecdede8aed726b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/enums.py", "type": "file" }, { - "bom-ref": "c3d4a12ef3172430", + "bom-ref": "ea204d022d38aea2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/escprober.py", "type": "file" }, { - "bom-ref": "b6bce9834341be9f", + "bom-ref": "304b8c8ac3e1f785", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/escsm.py", "type": "file" }, { - "bom-ref": "1a5f509afd54ccc0", + "bom-ref": "33a0d4be1f2cb1ce", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/eucjpprober.py", "type": "file" }, { - "bom-ref": "60b6cb354b486aa9", + "bom-ref": "66565e19ea9ed86f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euckrfreq.py", "type": "file" }, { - "bom-ref": "848b287c270cf330", + "bom-ref": "064a8c9a4b64de16", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euckrprober.py", "type": "file" }, { - "bom-ref": "cd21cab1c10c8053", + "bom-ref": "bf9c1e3099f414fd", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euctwfreq.py", "type": "file" }, { - "bom-ref": "aa125b9d3682489b", + "bom-ref": "70d74aa4b96e6c81", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/euctwprober.py", "type": "file" }, { - "bom-ref": "4a128a9950175eca", + "bom-ref": "9b96c62d54124edc", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/gb2312freq.py", "type": "file" }, { - "bom-ref": "27fd0483e812d677", + "bom-ref": "456dc7afd139bde5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/gb2312prober.py", "type": "file" }, { - "bom-ref": "249b3f7b6e160ff8", + "bom-ref": "54f2780e3061f396", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/hebrewprober.py", "type": "file" }, { - "bom-ref": "f10617164a2f9db7", + "bom-ref": "8f18f144f81d7649", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/jisfreq.py", "type": "file" }, { - "bom-ref": "b55c18bdea3dd2dd", + "bom-ref": "d24d385f38b22483", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/johabfreq.py", "type": "file" }, { - "bom-ref": "5859ae58359caca3", + "bom-ref": "d9bf21fdc0df2b8d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/johabprober.py", "type": "file" }, { - "bom-ref": "70d1730ca2ff6d67", + "bom-ref": "671678d4b323c6d9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/jpcntx.py", "type": "file" }, { - "bom-ref": "301002e0f49b4784", + "bom-ref": "f8e018e582eb52ba", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langbulgarianmodel.py", "type": "file" }, { - "bom-ref": "69ff769e67eff3a5", + "bom-ref": "e66e67212d00f4ff", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langgreekmodel.py", "type": "file" }, { - "bom-ref": "e3aa8b8c141dc3a7", + "bom-ref": "9e06ca5be14c049d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langhebrewmodel.py", "type": "file" }, { - "bom-ref": "99a74666bea40c65", + "bom-ref": "b18cd807748a83ef", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langhungarianmodel.py", "type": "file" }, { - "bom-ref": "9dc35159e967b314", + "bom-ref": "8861e6126fb7cd36", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langrussianmodel.py", "type": "file" }, { - "bom-ref": "99df6e307e30a372", + "bom-ref": "72e766ce72ba3658", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langthaimodel.py", "type": "file" }, { - "bom-ref": "c6a7d9979b61e367", + "bom-ref": "e0765d70e290e645", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/langturkishmodel.py", "type": "file" }, { - "bom-ref": "2e7cb564cc81d6b9", + "bom-ref": "923abe475cfd665f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/latin1prober.py", "type": "file" }, { - "bom-ref": "d1d384a0853eaf73", + "bom-ref": "e247e755651e43d5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/macromanprober.py", "type": "file" }, { - "bom-ref": "e7fb6a447ee0f791", + "bom-ref": "7b002f6633afe0fb", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/mbcharsetprober.py", "type": "file" }, { - "bom-ref": "376e3e3d14abb947", + "bom-ref": "00743626cc85b7dd", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/mbcsgroupprober.py", "type": "file" }, { - "bom-ref": "22b50abe6c6ff34c", + "bom-ref": "3c44bb542b9c132a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/mbcssm.py", "type": "file" }, { - "bom-ref": "069f8cf86c6c0397", + "bom-ref": "7b8cbf8926f16fc5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/metadata/__init__.py", "type": "file" }, { - "bom-ref": "b099c0a26a5a428d", + "bom-ref": "e86710a0fde9257f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/metadata/languages.py", "type": "file" }, { - "bom-ref": "aca6f3136d6a4d31", + "bom-ref": "98682d5eab8278eb", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/resultdict.py", "type": "file" }, { - "bom-ref": "9128fa5447f5ea82", + "bom-ref": "14a6a2f190637540", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/sbcharsetprober.py", "type": "file" }, { - "bom-ref": "0feb67f4cd7dae58", + "bom-ref": "6757f9ab335c0b16", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/sbcsgroupprober.py", "type": "file" }, { - "bom-ref": "60280a1cf0696ca9", + "bom-ref": "2c34045f0eaf1ff7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/sjisprober.py", "type": "file" }, { - "bom-ref": "0d9902107623f1d7", + "bom-ref": "f3066c581cf49b79", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/universaldetector.py", "type": "file" }, { - "bom-ref": "41c373416bdde0f5", + "bom-ref": "a74066b30b2b5c43", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/utf1632prober.py", "type": "file" }, { - "bom-ref": "865e6e45cfad02fe", + "bom-ref": "9920db30820702a4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/utf8prober.py", "type": "file" }, { - "bom-ref": "5ffad4e4ea9f50cd", + "bom-ref": "920d29f45f40b85b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/chardet/version.py", "type": "file" }, { - "bom-ref": "8d048fee31d6e540", + "bom-ref": "bfc07badf2583ad6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/__init__.py", "type": "file" }, { - "bom-ref": "89160918c17aba0f", + "bom-ref": "32cf5df11afbec15", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/ansi.py", "type": "file" }, { - "bom-ref": "149459f287ed9b9c", + "bom-ref": "32550de3aafa605a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/ansitowin32.py", "type": "file" }, { - "bom-ref": "bed990b34d265fee", + "bom-ref": "0cb87d9020e91a48", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/initialise.py", "type": "file" }, { - "bom-ref": "a471353dd85e4c09", + "bom-ref": "43fb4f7c88c90b2b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/__init__.py", "type": "file" }, { - "bom-ref": "8cb923fd855e6503", + "bom-ref": "e23e316d2a6b2d8d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/ansi_test.py", "type": "file" }, { - "bom-ref": "0602d5b9640a06fd", + "bom-ref": "aa4e03ac26d4790f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/ansitowin32_test.py", "type": "file" }, { - "bom-ref": "19d99253042e0869", + "bom-ref": "d35a91581a6b447f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/initialise_test.py", "type": "file" }, { - "bom-ref": "b65529856bb154b0", + "bom-ref": "5e52cceaa9949fce", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/isatty_test.py", "type": "file" }, { - "bom-ref": "08d04d3895b5f5f6", + "bom-ref": "7a2981d581f1df08", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/utils.py", "type": "file" }, { - "bom-ref": "940618370bb87586", + "bom-ref": "e7b340bb70c09428", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/tests/winterm_test.py", "type": "file" }, { - "bom-ref": "105caafb252b9f7a", + "bom-ref": "d9d35d7132cb3f0c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/win32.py", "type": "file" }, { - "bom-ref": "b9ba3f1a890cf1ad", + "bom-ref": "d32ae242f6e1b58f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/colorama/winterm.py", "type": "file" }, { - "bom-ref": "256f78002ddd4452", + "bom-ref": "f21c98f6796ddc2c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/__init__.py", "type": "file" }, { - "bom-ref": "33fbf8862dab3ea8", + "bom-ref": "62641fa555e00cae", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/compat.py", "type": "file" }, { - "bom-ref": "49b958b23c51c14f", + "bom-ref": "1c5815ebe61e1719", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/database.py", "type": "file" }, { - "bom-ref": "4d06f295d1786dcc", + "bom-ref": "cf199f0300462636", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/index.py", "type": "file" }, { - "bom-ref": "b8710fa50e883f06", + "bom-ref": "e0d7246975941b6c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/locators.py", "type": "file" }, { - "bom-ref": "e820933d57a37474", + "bom-ref": "6159368c8a76a31a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/manifest.py", "type": "file" }, { - "bom-ref": "d9c449485db1d30c", + "bom-ref": "4ecb7380d8c7b3c6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/markers.py", "type": "file" }, { - "bom-ref": "0b2c55f3fd3a2ab6", + "bom-ref": "3bf999bd77927600", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/metadata.py", "type": "file" }, { - "bom-ref": "83ddd6819ffa71ca", + "bom-ref": "4b0eecadb1833d80", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/resources.py", "type": "file" }, { - "bom-ref": "ea7b576d319aa2de", + "bom-ref": "c2c5f3fa4dbebe04", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/scripts.py", "type": "file" }, { - "bom-ref": "37a75014ef617efe", + "bom-ref": "5d0305f6da0b38e0", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/util.py", "type": "file" }, { - "bom-ref": "d8c71c20e1288b4b", + "bom-ref": "227a911d3d001939", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/version.py", "type": "file" }, { - "bom-ref": "8525d852905a00cc", + "bom-ref": "3fe7dc7403cc997a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distlib/wheel.py", "type": "file" }, { - "bom-ref": "ba5dcf2139cfb2b5", + "bom-ref": "e7f30b0ac273d34b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distro/__init__.py", "type": "file" }, { - "bom-ref": "6c59cab8234d4d41", + "bom-ref": "9280a1fc2586cd0f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distro/__main__.py", "type": "file" }, { - "bom-ref": "5ba455d3b8ce06b8", + "bom-ref": "1e6ba4a50eb5c45e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/distro/distro.py", "type": "file" }, { - "bom-ref": "641a6b3a98695617", + "bom-ref": "0d955c3d9e001c51", "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/__init__.py", "type": "file" }, { - "bom-ref": "52673312211f6bf0", + "bom-ref": "5b924889e5b516b6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/codec.py", "type": "file" }, { - "bom-ref": "e9b7915b03b93850", + "bom-ref": "2269b4e623480cde", "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/compat.py", "type": "file" }, { - "bom-ref": "428f8c45fe03a0f7", + "bom-ref": "5ef318832845782d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/core.py", "type": "file" }, { - "bom-ref": "bd90b64f1ecf16c5", + "bom-ref": "94e0ae5c327b0927", "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/idnadata.py", "type": "file" }, { - "bom-ref": "a70e4922d13e7293", + "bom-ref": "7f18bd3a0a564ac1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/intranges.py", "type": "file" }, { - "bom-ref": "5454beb8d01ffd6b", + "bom-ref": "425006079191c895", "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/package_data.py", "type": "file" }, { - "bom-ref": "c9ec3d215854dd09", + "bom-ref": "9866bd4717156417", "name": "/usr/lib/python3/dist-packages/pip/_vendor/idna/uts46data.py", "type": "file" }, { - "bom-ref": "5754e63f065fc9d5", + "bom-ref": "73080b6b34e5b953", "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/__init__.py", "type": "file" }, { - "bom-ref": "7fbaba9eed2e736c", + "bom-ref": "d1114db3f46add72", "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/exceptions.py", "type": "file" }, { - "bom-ref": "446f7f15e42ae0ca", + "bom-ref": "d18368b0a928d54c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/ext.py", "type": "file" }, { - "bom-ref": "efebef806e577202", + "bom-ref": "293c980286b04064", "name": "/usr/lib/python3/dist-packages/pip/_vendor/msgpack/fallback.py", "type": "file" }, { - "bom-ref": "79e40978d69cbda1", + "bom-ref": "c818de037f47f68b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/__about__.py", "type": "file" }, { - "bom-ref": "f88289d3822e51a9", + "bom-ref": "facaf9d711673553", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/__init__.py", "type": "file" }, { - "bom-ref": "5b18191884425596", + "bom-ref": "030629636e797a04", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/_manylinux.py", "type": "file" }, { - "bom-ref": "d3b28459d9927f6a", + "bom-ref": "d52851826bea7f38", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/_musllinux.py", "type": "file" }, { - "bom-ref": "c4646261dd456b8b", + "bom-ref": "a631d1bfb6030835", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/_structures.py", "type": "file" }, { - "bom-ref": "13fb932b14adcac1", + "bom-ref": "8e61d9efefc912d7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/markers.py", "type": "file" }, { - "bom-ref": "82c434a3da107332", + "bom-ref": "dcd657672f1506d8", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/requirements.py", "type": "file" }, { - "bom-ref": "3fcfc325696d3d3d", + "bom-ref": "06fdc806a18609b3", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/specifiers.py", "type": "file" }, { - "bom-ref": "9d28041ad202d0bf", + "bom-ref": "e72576539c9782d5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/tags.py", "type": "file" }, { - "bom-ref": "e739f45a1613f720", + "bom-ref": "78e2d65e17988fda", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/utils.py", "type": "file" }, { - "bom-ref": "7ab5e8af1eda0558", + "bom-ref": "54be7de4de84a276", "name": "/usr/lib/python3/dist-packages/pip/_vendor/packaging/version.py", "type": "file" }, { - "bom-ref": "0d48a278c50790cc", + "bom-ref": "6881cb1e6f303c46", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pkg_resources/__init__.py", "type": "file" }, { - "bom-ref": "e3be5b76f9972126", + "bom-ref": "da567296ba6c2e14", "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/__init__.py", "type": "file" }, { - "bom-ref": "d7aea7e2de59f846", + "bom-ref": "cc95d8a39e9867c8", "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/__main__.py", "type": "file" }, { - "bom-ref": "0b2a290be6e8b4b9", + "bom-ref": "9d9a41108c2062eb", "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/android.py", "type": "file" }, { - "bom-ref": "596eaf311107320e", + "bom-ref": "519a4d862a29b4dc", "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/api.py", "type": "file" }, { - "bom-ref": "e139e7fd5345b04f", + "bom-ref": "b1575b040010a595", "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/macos.py", "type": "file" }, { - "bom-ref": "e06d125ada270c08", + "bom-ref": "38c9e9063297ed3e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/unix.py", "type": "file" }, { - "bom-ref": "9a71767eb2c458a5", + "bom-ref": "c4a811ff6ca64e0b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/version.py", "type": "file" }, { - "bom-ref": "a5fd3f81b8b23c74", + "bom-ref": "341f2177137d11b2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/platformdirs/windows.py", "type": "file" }, { - "bom-ref": "4d604fd1809a8cee", + "bom-ref": "2623b5214c5fa9f8", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/__init__.py", "type": "file" }, { - "bom-ref": "2c844e5c45b77cf5", + "bom-ref": "8ea387b89b41a7bb", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/__main__.py", "type": "file" }, { - "bom-ref": "a91deb5d1d1ba348", + "bom-ref": "d156ada9edd518d2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/cmdline.py", "type": "file" }, { - "bom-ref": "30da98f574a57cf3", + "bom-ref": "cc86d52b257903f1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/console.py", "type": "file" }, { - "bom-ref": "600734981cd11085", + "bom-ref": "e1798cd1cbeae40f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/filter.py", "type": "file" }, { - "bom-ref": "af42dcf8ddf72383", + "bom-ref": "5ba0df2c908b3221", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/filters/__init__.py", "type": "file" }, { - "bom-ref": "781900a8fc948d83", + "bom-ref": "48386e03db105d25", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatter.py", "type": "file" }, { - "bom-ref": "22579b9e12774efa", + "bom-ref": "440038865b42a7b4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/__init__.py", "type": "file" }, { - "bom-ref": "aa0504bbf0ac3d96", + "bom-ref": "c0a8347e5713ba64", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/_mapping.py", "type": "file" }, { - "bom-ref": "5dbe076f05b05933", + "bom-ref": "cdfae2bcfc863c85", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/bbcode.py", "type": "file" }, { - "bom-ref": "626ec019d938f548", + "bom-ref": "b1740a3abfe41a12", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/groff.py", "type": "file" }, { - "bom-ref": "8a82041813a42199", + "bom-ref": "79a9198451f704b7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/html.py", "type": "file" }, { - "bom-ref": "b88a3bb58186e794", + "bom-ref": "0b78d52e78dcc48e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/img.py", "type": "file" }, { - "bom-ref": "dd44c3b3b69ec8f4", + "bom-ref": "2b9b87a59fec58b6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/irc.py", "type": "file" }, { - "bom-ref": "7c3512feffe3a858", + "bom-ref": "e025f315fcb98d42", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/latex.py", "type": "file" }, { - "bom-ref": "80894e93c129f9f8", + "bom-ref": "0585a395c0c46996", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/other.py", "type": "file" }, { - "bom-ref": "31c8d0f4a1f280bc", + "bom-ref": "5c57c6a33bc5d542", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/pangomarkup.py", "type": "file" }, { - "bom-ref": "6774c0bcbdcebb51", + "bom-ref": "3c73374e71520567", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/rtf.py", "type": "file" }, { - "bom-ref": "b7b8d1929b825435", + "bom-ref": "969bf28e05e32aaf", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/svg.py", "type": "file" }, { - "bom-ref": "f336b41db5797a89", + "bom-ref": "a1a5a2922a18e51b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/terminal.py", "type": "file" }, { - "bom-ref": "c3b1cefad65ae92f", + "bom-ref": "e0f8b1425653cdd9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/formatters/terminal256.py", "type": "file" }, { - "bom-ref": "904ae892cfa1cb89", + "bom-ref": "81cf84295be4d0d7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexer.py", "type": "file" }, { - "bom-ref": "ec5c1b4bc3de5092", + "bom-ref": "ba427f13afaad2d8", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers/__init__.py", "type": "file" }, { - "bom-ref": "7fd8546676f15523", + "bom-ref": "b734f195b4428839", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers/_mapping.py", "type": "file" }, { - "bom-ref": "5388d8ac801da7e1", + "bom-ref": "6d48783a6ed69a4f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers/python.py", "type": "file" }, { - "bom-ref": "cc1b899134d71a6a", + "bom-ref": "1af603ee290e1134", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/modeline.py", "type": "file" }, { - "bom-ref": "59f8af5dfef6399d", + "bom-ref": "f74c6765a028847f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/plugin.py", "type": "file" }, { - "bom-ref": "e458106d2617b747", + "bom-ref": "c6bd9b8605e2c179", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/regexopt.py", "type": "file" }, { - "bom-ref": "3632476663a1d1e3", + "bom-ref": "d09cb25c7767edc5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/scanner.py", "type": "file" }, { - "bom-ref": "7517082fba6c04ec", + "bom-ref": "6dc006ffe6de0b02", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/sphinxext.py", "type": "file" }, { - "bom-ref": "2c0685b34aef743c", + "bom-ref": "163cc6949030b79a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/style.py", "type": "file" }, { - "bom-ref": "8a56a056706a134e", + "bom-ref": "7332331621b4f830", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/styles/__init__.py", "type": "file" }, { - "bom-ref": "682792859fc51df6", + "bom-ref": "f93912f4feac9258", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/token.py", "type": "file" }, { - "bom-ref": "02131d25ed56ee33", + "bom-ref": "4beaba7281b00671", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/unistring.py", "type": "file" }, { - "bom-ref": "2967900863bf8738", + "bom-ref": "8a95ef922a6ee762", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pygments/util.py", "type": "file" }, { - "bom-ref": "74f3a30e84f2800f", + "bom-ref": "d97f8d8fc6fab49d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/__init__.py", "type": "file" }, { - "bom-ref": "6eb9c005cac3d477", + "bom-ref": "d78972eb67807795", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/actions.py", "type": "file" }, { - "bom-ref": "aac6a8f4c46416d7", + "bom-ref": "be9253eaf1d8fca9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/common.py", "type": "file" }, { - "bom-ref": "458ab9d25ce29178", + "bom-ref": "d60620689e40a81a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/core.py", "type": "file" }, { - "bom-ref": "9fc3e3fd7bd737e9", + "bom-ref": "291ebf110a8c6257", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/diagram/__init__.py", "type": "file" }, { - "bom-ref": "8031a2b5eeb94219", + "bom-ref": "23732ff4da33bebb", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/exceptions.py", "type": "file" }, { - "bom-ref": "aa32dd4b58f8586a", + "bom-ref": "1f48cda4f8b2f888", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/helpers.py", "type": "file" }, { - "bom-ref": "80f11b6ce09f17e3", + "bom-ref": "3c86790845872ef1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/results.py", "type": "file" }, { - "bom-ref": "704976857b800a08", + "bom-ref": "666b291ec6e4e2b6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/testing.py", "type": "file" }, { - "bom-ref": "75b1d04a4e3d1db3", + "bom-ref": "c311a751ba03c981", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/unicode.py", "type": "file" }, { - "bom-ref": "973df769ede18540", + "bom-ref": "8836bb41eb40d4ce", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/util.py", "type": "file" }, { - "bom-ref": "368b65000fbebaa5", + "bom-ref": "c8b57752f637ed6f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/__init__.py", "type": "file" }, { - "bom-ref": "cdd7eb9993479e5f", + "bom-ref": "b4cdc860fdd29c9d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_compat.py", "type": "file" }, { - "bom-ref": "cf51d441c80a90be", + "bom-ref": "98a7bee2b1341a08", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_impl.py", "type": "file" }, { - "bom-ref": "666827989abe0547", + "bom-ref": "53369c4c555ed8f1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py", "type": "file" }, { - "bom-ref": "f70b3fcc386198ef", + "bom-ref": "0e1174bbc05dfb9d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", "type": "file" }, { - "bom-ref": "762d74224f068aca", + "bom-ref": "da27ae074e6c1720", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/__init__.py", "type": "file" }, { - "bom-ref": "9a443f308d291db7", + "bom-ref": "088b702034110dad", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/__version__.py", "type": "file" }, { - "bom-ref": "059e540af9c34f4b", + "bom-ref": "9dcb407868e8e2f9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/_internal_utils.py", "type": "file" }, { - "bom-ref": "163216969a4ce0a2", + "bom-ref": "c518266efe83d0c4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/adapters.py", "type": "file" }, { - "bom-ref": "5b09876f28675e07", + "bom-ref": "a420e1a2119aa2b9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/api.py", "type": "file" }, { - "bom-ref": "5fee9ee48fa8e74c", + "bom-ref": "539724896903aed6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/auth.py", "type": "file" }, { - "bom-ref": "fa8194279aa750d2", + "bom-ref": "f20cc100b74a66a4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/certs.py", "type": "file" }, { - "bom-ref": "7a662776894c7d73", + "bom-ref": "c2cf490a8e830115", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/compat.py", "type": "file" }, { - "bom-ref": "e9f983b587775a93", + "bom-ref": "3820fd362d9a11f5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/cookies.py", "type": "file" }, { - "bom-ref": "c396a163d4aca3e5", + "bom-ref": "3128e21b71c17103", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/exceptions.py", "type": "file" }, { - "bom-ref": "1a3cb2d937bc2101", + "bom-ref": "7e06def05cff678f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/help.py", "type": "file" }, { - "bom-ref": "3d5323ddaeedec05", + "bom-ref": "e4c547b83993c3bb", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/hooks.py", "type": "file" }, { - "bom-ref": "9f8ac20329fd690c", + "bom-ref": "c7d35abca74871c2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/models.py", "type": "file" }, { - "bom-ref": "f6206cac005ec282", + "bom-ref": "1d528ecb43199e64", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/packages.py", "type": "file" }, { - "bom-ref": "6cee51eb111b7e66", + "bom-ref": "546548b8006384cc", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/sessions.py", "type": "file" }, { - "bom-ref": "1e1abc8898f0fe6d", + "bom-ref": "844df240cf29231b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/status_codes.py", "type": "file" }, { - "bom-ref": "3a020e7d153bfee2", + "bom-ref": "4382196096bb3cdc", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/structures.py", "type": "file" }, { - "bom-ref": "f6c89d37e8c5f4d2", + "bom-ref": "881348f4fd05148c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/requests/utils.py", "type": "file" }, { - "bom-ref": "c557b4ba85bd01d6", + "bom-ref": "bdfbf3d6bd673f68", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/__init__.py", "type": "file" }, { - "bom-ref": "310d7233ac9368c5", + "bom-ref": "7d28b4b5262747e7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/compat/__init__.py", "type": "file" }, { - "bom-ref": "01ebc09c4c47b2e5", + "bom-ref": "9b140e7e854a19bb", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/compat/collections_abc.py", "type": "file" }, { - "bom-ref": "2f68c941a71fcbe0", + "bom-ref": "0260f7aa26d75862", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/providers.py", "type": "file" }, { - "bom-ref": "338dfb34a1d57f61", + "bom-ref": "76d9849bc07b43ab", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/reporters.py", "type": "file" }, { - "bom-ref": "da57b196b5814cc8", + "bom-ref": "0131c33564a64c82", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/resolvers.py", "type": "file" }, { - "bom-ref": "37634b30853ed9f8", + "bom-ref": "4ffd06b539b8e252", "name": "/usr/lib/python3/dist-packages/pip/_vendor/resolvelib/structs.py", "type": "file" }, { - "bom-ref": "59c7a8b42f17bc2e", + "bom-ref": "a9139775e9625648", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/__init__.py", "type": "file" }, { - "bom-ref": "40ee42af1b8e7bd0", + "bom-ref": "da9447a97df466ca", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/__main__.py", "type": "file" }, { - "bom-ref": "170e866cf24ea222", + "bom-ref": "dc983156a9802098", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_cell_widths.py", "type": "file" }, { - "bom-ref": "9fab27a9c6604a24", + "bom-ref": "c48b9009ff1c1386", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_emoji_codes.py", "type": "file" }, { - "bom-ref": "932d933b2bb7534e", + "bom-ref": "a73c1e2b7fb37298", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_emoji_replace.py", "type": "file" }, { - "bom-ref": "088ec0b2a7dfdc5d", + "bom-ref": "8c93b536a03b861b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_export_format.py", "type": "file" }, { - "bom-ref": "12b174d794810177", + "bom-ref": "ead41cfbc1bd0fe1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_extension.py", "type": "file" }, { - "bom-ref": "233f28df9cac8c08", + "bom-ref": "18c7b397896124a2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_fileno.py", "type": "file" }, { - "bom-ref": "951aaa25cd83cea3", + "bom-ref": "f7bcca209100bf99", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_inspect.py", "type": "file" }, { - "bom-ref": "3f2a0e4cc2483437", + "bom-ref": "409a4618006d7ef1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_log_render.py", "type": "file" }, { - "bom-ref": "c12fe7311b438e00", + "bom-ref": "ce9693a986c3405a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_loop.py", "type": "file" }, { - "bom-ref": "8a93f779ce863021", + "bom-ref": "377aa9273ce7b7b3", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_null_file.py", "type": "file" }, { - "bom-ref": "761da044704c5fb5", + "bom-ref": "b2253797bf1c12c7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_palettes.py", "type": "file" }, { - "bom-ref": "4dad57afbdd12057", + "bom-ref": "d6abd4c0541653a1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_pick.py", "type": "file" }, { - "bom-ref": "49eb5eddc35b7cb9", + "bom-ref": "75cd486c5e4afc13", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_ratio.py", "type": "file" }, { - "bom-ref": "a5764ecf0b84c8e6", + "bom-ref": "1397b64ba9266d0c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_spinners.py", "type": "file" }, { - "bom-ref": "f341bca493853ffb", + "bom-ref": "2ad233698fca65d1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_stack.py", "type": "file" }, { - "bom-ref": "2763ee6a12938eec", + "bom-ref": "8eb40e36eed24406", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_timer.py", "type": "file" }, { - "bom-ref": "77d312e7850c253c", + "bom-ref": "1ad630eb9070467e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_win32_console.py", "type": "file" }, { - "bom-ref": "61687d9f2426dab1", + "bom-ref": "550df7720c98018b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_windows.py", "type": "file" }, { - "bom-ref": "9fe19a707985862d", + "bom-ref": "6189f6b08f3b4413", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_windows_renderer.py", "type": "file" }, { - "bom-ref": "442be10363a1ae77", + "bom-ref": "f50c00ce2e5a706d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/_wrap.py", "type": "file" }, { - "bom-ref": "f2fa083fed051c01", + "bom-ref": "eba3f6ff7ee778e7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/abc.py", "type": "file" }, { - "bom-ref": "15ef7c411789d661", + "bom-ref": "8180cb478b71f78f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/align.py", "type": "file" }, { - "bom-ref": "b0efd9a13a827cab", + "bom-ref": "9743f50143eb184d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/ansi.py", "type": "file" }, { - "bom-ref": "107b0dd8abbe0a6f", + "bom-ref": "0035ca65ffc8cd11", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/bar.py", "type": "file" }, { - "bom-ref": "4f5454b46a90fa99", + "bom-ref": "74a3997b50b2bc0b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/box.py", "type": "file" }, { - "bom-ref": "091c30fc4ba36704", + "bom-ref": "1f44ca90f1d9880a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/cells.py", "type": "file" }, { - "bom-ref": "152a82350b2809a6", + "bom-ref": "bd986801e10f3bc8", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/color.py", "type": "file" }, { - "bom-ref": "248f4bd6283a5d06", + "bom-ref": "60e1062f72a30208", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/color_triplet.py", "type": "file" }, { - "bom-ref": "d2951e03cee49dfa", + "bom-ref": "6cc37546ee8462ec", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/columns.py", "type": "file" }, { - "bom-ref": "f8e4cc97829d32da", + "bom-ref": "83f03a7b6691fe50", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/console.py", "type": "file" }, { - "bom-ref": "a3d946e224e6507f", + "bom-ref": "8901010fe7b1d001", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/constrain.py", "type": "file" }, { - "bom-ref": "3d2addbad410ef31", + "bom-ref": "4feaffe1d17321ef", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/containers.py", "type": "file" }, { - "bom-ref": "9ad993f8fb9e9ceb", + "bom-ref": "1e75e2b5a197eb31", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/control.py", "type": "file" }, { - "bom-ref": "926bdf90f953984d", + "bom-ref": "265b53365e285337", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/default_styles.py", "type": "file" }, { - "bom-ref": "6e54d315399334da", + "bom-ref": "a6f86f94efe4917c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/diagnose.py", "type": "file" }, { - "bom-ref": "7298d906bc94dd40", + "bom-ref": "d5728270af6c9f66", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/emoji.py", "type": "file" }, { - "bom-ref": "6d37ab5ce256a75f", + "bom-ref": "636bd1c1dda84d8d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/errors.py", "type": "file" }, { - "bom-ref": "7779292789ff1d8a", + "bom-ref": "fa1322154f487c2c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/file_proxy.py", "type": "file" }, { - "bom-ref": "1e8e2c42fca82a82", + "bom-ref": "feed36c75a209dc4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/filesize.py", "type": "file" }, { - "bom-ref": "d8350bfaae45e498", + "bom-ref": "4a597fee20d9fa5e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/highlighter.py", "type": "file" }, { - "bom-ref": "c36616c28e75760b", + "bom-ref": "b9e337b1d1bfb545", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/json.py", "type": "file" }, { - "bom-ref": "8d29e2c11a11a3fe", + "bom-ref": "da8accc1ecf39804", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/jupyter.py", "type": "file" }, { - "bom-ref": "b7f808e72fb0c869", + "bom-ref": "136187b7ee9560cf", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/layout.py", "type": "file" }, { - "bom-ref": "6bcefac08434ca93", + "bom-ref": "f37db8f2f6188aa5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/live.py", "type": "file" }, { - "bom-ref": "8da0fc822b583d9f", + "bom-ref": "bc2efeda9c804dd5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/live_render.py", "type": "file" }, { - "bom-ref": "fd36a3b4d4081f12", + "bom-ref": "774a5e53caa599bc", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/logging.py", "type": "file" }, { - "bom-ref": "94ad8cf4b77de4a5", + "bom-ref": "9eac46b2204a2333", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/markup.py", "type": "file" }, { - "bom-ref": "9c98f82fdf25b8bf", + "bom-ref": "f561e4e479f73289", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/measure.py", "type": "file" }, { - "bom-ref": "17d0c7b480eacc0d", + "bom-ref": "469a885b02dd2463", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/padding.py", "type": "file" }, { - "bom-ref": "9a6814977f44a450", + "bom-ref": "bac6f5843dadddf6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/pager.py", "type": "file" }, { - "bom-ref": "7e59d683239b7664", + "bom-ref": "af4b3db35693463e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/palette.py", "type": "file" }, { - "bom-ref": "220f688c9094e1be", + "bom-ref": "6d7f83da53c0def0", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/panel.py", "type": "file" }, { - "bom-ref": "09fd785727af24a7", + "bom-ref": "c5d879f7982e3b11", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/pretty.py", "type": "file" }, { - "bom-ref": "aaf6d4a8cfa1db4a", + "bom-ref": "2a4f04bf022162ac", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/progress.py", "type": "file" }, { - "bom-ref": "f12511bb8498662c", + "bom-ref": "e3fa05985d79d926", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/progress_bar.py", "type": "file" }, { - "bom-ref": "4e8fe7f458206bda", + "bom-ref": "b3596a1f8e7310e0", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/prompt.py", "type": "file" }, { - "bom-ref": "927198e87f361ebd", + "bom-ref": "2f8b2fa8decf66e3", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/protocol.py", "type": "file" }, { - "bom-ref": "68960acf6d24281b", + "bom-ref": "84b1c84e8bca2f79", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/region.py", "type": "file" }, { - "bom-ref": "4b4c5d6505204ad2", + "bom-ref": "5e89e2c1eab51ef4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/repr.py", "type": "file" }, { - "bom-ref": "aaeb43ce35996257", + "bom-ref": "88ee0ee2568770a9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/rule.py", "type": "file" }, { - "bom-ref": "ad3cb6856e6edddf", + "bom-ref": "c10c681425ce4ea1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/scope.py", "type": "file" }, { - "bom-ref": "ad0f7df66957d1f5", + "bom-ref": "a9d516f14be16d3b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/screen.py", "type": "file" }, { - "bom-ref": "f892ade18c70d28e", + "bom-ref": "7c28aff1d31d0ac0", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/segment.py", "type": "file" }, { - "bom-ref": "494565ddd8b98fa8", + "bom-ref": "151df4e82bf50b06", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/spinner.py", "type": "file" }, { - "bom-ref": "1e7d4f3be43fb4ee", + "bom-ref": "f5e8568bd6b2bf84", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/status.py", "type": "file" }, { - "bom-ref": "c881ba23425da5ba", + "bom-ref": "1247dad697da2650", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/style.py", "type": "file" }, { - "bom-ref": "f6d1ed0223907339", + "bom-ref": "cd5d6255342a925f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/styled.py", "type": "file" }, { - "bom-ref": "1cbedcb16d01fe8a", + "bom-ref": "eea3a200b1a221b0", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/syntax.py", "type": "file" }, { - "bom-ref": "59ce4eb978796853", + "bom-ref": "68995710c2122bf1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/table.py", "type": "file" }, { - "bom-ref": "a764245ca5255f1f", + "bom-ref": "850296088f0ffb85", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/terminal_theme.py", "type": "file" }, { - "bom-ref": "36db3a2af947c404", + "bom-ref": "3b2d7c2eb9429526", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/text.py", "type": "file" }, { - "bom-ref": "ef67771b136cef4a", + "bom-ref": "c958dbdee8c93c9c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/theme.py", "type": "file" }, { - "bom-ref": "78c8eb591843e7df", + "bom-ref": "99ec3da0f4bb1de5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/themes.py", "type": "file" }, { - "bom-ref": "fb400c1dbf04e470", + "bom-ref": "a57b32d85c61752e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/traceback.py", "type": "file" }, { - "bom-ref": "b91f0213827d4fa0", + "bom-ref": "4a9464c6936cf6d2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/rich/tree.py", "type": "file" }, { - "bom-ref": "c83fb086485fc701", + "bom-ref": "6b90761afbe3fa8f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/six.py", "type": "file" }, { - "bom-ref": "3ca1c2a39c5b9ad8", + "bom-ref": "403a084d5c7f3d46", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/__init__.py", "type": "file" }, { - "bom-ref": "b77681869ca0433f", + "bom-ref": "c269db9a23558909", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/_asyncio.py", "type": "file" }, { - "bom-ref": "a2b0275f9a647d04", + "bom-ref": "7a154834da59566e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/_utils.py", "type": "file" }, { - "bom-ref": "916c0222edad3f22", + "bom-ref": "7ab82ee5258531e4", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/after.py", "type": "file" }, { - "bom-ref": "a7d4e94675894fe9", + "bom-ref": "cbdfe8045c7532df", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/before.py", "type": "file" }, { - "bom-ref": "27de7b60738f1055", + "bom-ref": "cbf7522ef8af4c0f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/before_sleep.py", "type": "file" }, { - "bom-ref": "31941828468f155a", + "bom-ref": "439db7cca800c498", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/nap.py", "type": "file" }, { - "bom-ref": "4156f3147d6f5479", + "bom-ref": "7c07722644906bb7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/retry.py", "type": "file" }, { - "bom-ref": "153e9939f5911b40", + "bom-ref": "7235191bad5adace", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/stop.py", "type": "file" }, { - "bom-ref": "e7e223a35311f88b", + "bom-ref": "fd5cbbd9ad3997e9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/tornadoweb.py", "type": "file" }, { - "bom-ref": "9d8b5b2638ccee76", + "bom-ref": "019d340229753c64", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tenacity/wait.py", "type": "file" }, { - "bom-ref": "91bade6cdb1fca0e", + "bom-ref": "535986380d6e8c64", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tomli/__init__.py", "type": "file" }, { - "bom-ref": "06b90869fa32e9c1", + "bom-ref": "dcbfcf22a13a854b", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tomli/_parser.py", "type": "file" }, { - "bom-ref": "89a3503b8f9efa98", + "bom-ref": "2dd448685c7e24e2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tomli/_re.py", "type": "file" }, { - "bom-ref": "8dcfcdeb74f2e874", + "bom-ref": "179c47dd880db162", "name": "/usr/lib/python3/dist-packages/pip/_vendor/tomli/_types.py", "type": "file" }, { - "bom-ref": "06f581ffb50b96b8", + "bom-ref": "299b94551d3d69c2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/__init__.py", "type": "file" }, { - "bom-ref": "cbcf97eaf157c43f", + "bom-ref": "f0e619e090595ed5", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/_api.py", "type": "file" }, { - "bom-ref": "165c4c5270c0312f", + "bom-ref": "f860604b14f74945", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/_macos.py", "type": "file" }, { - "bom-ref": "7edc94f5ff940040", + "bom-ref": "b0c62f7ca82a075a", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/_openssl.py", "type": "file" }, { - "bom-ref": "7b258e72fa37a960", + "bom-ref": "c579de1b421445d6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/_ssl_constants.py", "type": "file" }, { - "bom-ref": "03b0147e474e484b", + "bom-ref": "ee915495b26b661d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/truststore/_windows.py", "type": "file" }, { - "bom-ref": "4c478e2ee3c1fa39", + "bom-ref": "ec917c8869696573", "name": "/usr/lib/python3/dist-packages/pip/_vendor/typing_extensions.py", "type": "file" }, { - "bom-ref": "7208d21f541c4e93", + "bom-ref": "e9974ca9057233cd", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/__init__.py", "type": "file" }, { - "bom-ref": "701fdb2f404e28df", + "bom-ref": "eb1a64c31efa983d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/_collections.py", "type": "file" }, { - "bom-ref": "ecf838f1dd350552", + "bom-ref": "c9b6e8b96f793b68", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/_version.py", "type": "file" }, { - "bom-ref": "0f3ed1bc4cd9eb53", + "bom-ref": "039c726082819335", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/connection.py", "type": "file" }, { - "bom-ref": "4672d5401b2f8727", + "bom-ref": "41e7f64bca6249c1", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/connectionpool.py", "type": "file" }, { - "bom-ref": "a3dc5ea17ce56285", + "bom-ref": "488ca27e1b673813", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/__init__.py", "type": "file" }, { - "bom-ref": "3ae5dd2f9188d54e", + "bom-ref": "9d54651600cded0c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py", "type": "file" }, { - "bom-ref": "7d09fdd3838d8756", + "bom-ref": "31bb8cf149105fcc", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py", "type": "file" }, { - "bom-ref": "753c2f9d37d43346", + "bom-ref": "b8c93462957bcd4c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py", "type": "file" }, { - "bom-ref": "64a204bef03a1a60", + "bom-ref": "0f8340f43506e7f2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py", "type": "file" }, { - "bom-ref": "30802a235ac849c3", + "bom-ref": "8bcbdf8fb54c6055", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/appengine.py", "type": "file" }, { - "bom-ref": "6bb41880a41320c1", + "bom-ref": "baa287e741f49d07", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/ntlmpool.py", "type": "file" }, { - "bom-ref": "c1b89ac50052fdcb", + "bom-ref": "4139f0448f4c8341", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/pyopenssl.py", "type": "file" }, { - "bom-ref": "0010ab3322a4d8e7", + "bom-ref": "01d8a76267c63571", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/securetransport.py", "type": "file" }, { - "bom-ref": "d6c815a45f6faa21", + "bom-ref": "174846ba7c284bdf", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/contrib/socks.py", "type": "file" }, { - "bom-ref": "ab3a4bf5718202fa", + "bom-ref": "2728441620239448", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/exceptions.py", "type": "file" }, { - "bom-ref": "737cece5c310742d", + "bom-ref": "16b4eff9e9837d43", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/fields.py", "type": "file" }, { - "bom-ref": "cbe374435aa9da1e", + "bom-ref": "0c4f729e0029cc08", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/filepost.py", "type": "file" }, { - "bom-ref": "9239700bb12e79f3", + "bom-ref": "eddd6f86197bd3d9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/packages/__init__.py", "type": "file" }, { - "bom-ref": "ffdeb6f0e37e08d5", + "bom-ref": "6c5c0eff32d89ca7", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/packages/backports/__init__.py", "type": "file" }, { - "bom-ref": "e20d2e537c295d21", + "bom-ref": "8732358b544d186f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/packages/backports/makefile.py", "type": "file" }, { - "bom-ref": "a854f2893e023e06", + "bom-ref": "ab00ccc1b5d131bc", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py", "type": "file" }, { - "bom-ref": "73fef596ab8239d0", + "bom-ref": "51e07b353fdc992e", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/packages/six.py", "type": "file" }, { - "bom-ref": "a716a1673c03a8c1", + "bom-ref": "d90f43f1b7d12583", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/poolmanager.py", "type": "file" }, { - "bom-ref": "35b00d2d148f9a82", + "bom-ref": "5aaecba983318860", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/request.py", "type": "file" }, { - "bom-ref": "883060290e1a6758", + "bom-ref": "08bfaf0bdc9c91e2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/response.py", "type": "file" }, { - "bom-ref": "f9ebd6434c44f889", + "bom-ref": "f52c6adef7464a8f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/__init__.py", "type": "file" }, { - "bom-ref": "a49c8a42e4efa719", + "bom-ref": "627cf36e73fa889f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/connection.py", "type": "file" }, { - "bom-ref": "b2e5f5b9d699fc69", + "bom-ref": "ec723c4b3b3d968f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/proxy.py", "type": "file" }, { - "bom-ref": "7ff632e26b96bfa5", + "bom-ref": "41b35c5f707b6683", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/queue.py", "type": "file" }, { - "bom-ref": "f6168e1bde1d7873", + "bom-ref": "5abd492ca21a29f9", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/request.py", "type": "file" }, { - "bom-ref": "71684df4aa42820c", + "bom-ref": "2c2abfebca91b2ae", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/response.py", "type": "file" }, { - "bom-ref": "bc9df0e9c91f634e", + "bom-ref": "3d2cc736a76e0ce0", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/retry.py", "type": "file" }, { - "bom-ref": "ab1790dd1f12c7c2", + "bom-ref": "09181764f85d0b5c", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/ssl_.py", "type": "file" }, { - "bom-ref": "ce3c9af54da61572", + "bom-ref": "a56e897511b69afc", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py", "type": "file" }, { - "bom-ref": "e56d026b832e3747", + "bom-ref": "29cb2ad1d0a78a3d", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/ssltransport.py", "type": "file" }, { - "bom-ref": "4957faa73e9ff571", + "bom-ref": "9663e83ab86c1d6f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/timeout.py", "type": "file" }, { - "bom-ref": "02179b9d83d6bfb1", + "bom-ref": "c709ff670018ef53", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/url.py", "type": "file" }, { - "bom-ref": "4d2cb2f741ca2f70", + "bom-ref": "2fe1e7f72b4a1dd6", "name": "/usr/lib/python3/dist-packages/pip/_vendor/urllib3/util/wait.py", "type": "file" }, { - "bom-ref": "b7a26dd8df236559", + "bom-ref": "04d620fe9890ea23", "name": "/usr/lib/python3/dist-packages/pip/_vendor/vendor.txt", "type": "file" }, { - "bom-ref": "4f6e1b3f0949b21c", + "bom-ref": "87e167b2bdd0ab06", "name": "/usr/lib/python3/dist-packages/pip/_vendor/webencodings/__init__.py", "type": "file" }, { - "bom-ref": "fe7033b9995a7526", + "bom-ref": "5aff3e35c19eff08", "name": "/usr/lib/python3/dist-packages/pip/_vendor/webencodings/labels.py", "type": "file" }, { - "bom-ref": "ecf855e1ae2e3368", + "bom-ref": "6b98649ff30205a2", "name": "/usr/lib/python3/dist-packages/pip/_vendor/webencodings/mklabels.py", "type": "file" }, { - "bom-ref": "ad2f75da61b28849", + "bom-ref": "699d5be654be08ff", "name": "/usr/lib/python3/dist-packages/pip/_vendor/webencodings/tests.py", "type": "file" }, { - "bom-ref": "93fcdacbd9293bcd", + "bom-ref": "6c6302f94c04da0f", "name": "/usr/lib/python3/dist-packages/pip/_vendor/webencodings/x_user_defined.py", "type": "file" }, { - "bom-ref": "12a59839d26f1c56", + "bom-ref": "68f33a6a45782b8c", "name": "/usr/lib/python3/dist-packages/pip/py.typed", "type": "file" }, { - "bom-ref": "cf27aa2862234f3d", + "bom-ref": "650e4c16ad8a0a5b", "name": "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", "type": "file" }, { - "bom-ref": "3597fa43d241cac1", + "bom-ref": "e5dde51aaaf2a97f", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/__init__.py", "type": "file" }, { - "bom-ref": "db058f5fc3635890", + "bom-ref": "3b8ab67559e8989a", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/__init__.py", "type": "file" }, { - "bom-ref": "902c126bfc5dd46a", + "bom-ref": "4ef913358c197054", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/_adapters.py", "type": "file" }, { - "bom-ref": "f80a81d16c94ecc3", + "bom-ref": "af5262bfd734ea69", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/_common.py", "type": "file" }, { - "bom-ref": "9d8ea15176935874", + "bom-ref": "1a20e93cb6781992", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/_compat.py", "type": "file" }, { - "bom-ref": "a045bf54744105b4", + "bom-ref": "7088fd3dbee5a572", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/_itertools.py", "type": "file" }, { - "bom-ref": "643fc466f2a12094", + "bom-ref": "6fa907432ed46a62", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/_legacy.py", "type": "file" }, { - "bom-ref": "387a7b713dd13f4f", + "bom-ref": "30fb0c234aa56f11", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/abc.py", "type": "file" }, { - "bom-ref": "f80e6eeaf67e5d9c", + "bom-ref": "11e323bf89d0f9d2", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/readers.py", "type": "file" }, { - "bom-ref": "1d25289b75e6de3e", + "bom-ref": "6029fb0a742ae644", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/importlib_resources/simple.py", "type": "file" }, { - "bom-ref": "8d7bf1de96909dac", + "bom-ref": "a2867682cacd69b6", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/jaraco/__init__.py", "type": "file" }, { - "bom-ref": "ac4aeae715381430", + "bom-ref": "9b7486448a553112", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/jaraco/context.py", "type": "file" }, { - "bom-ref": "5152145f26281c98", + "bom-ref": "4b84ecfb0679e8d2", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/jaraco/functools.py", "type": "file" }, { - "bom-ref": "e5d6ab4a733dab0a", + "bom-ref": "cdbb07b6e5c561a0", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/jaraco/text/__init__.py", "type": "file" }, { - "bom-ref": "3d3f302fe46c46db", + "bom-ref": "250855e4ceddb6dd", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/more_itertools/__init__.py", "type": "file" }, { - "bom-ref": "cc1486a696453c85", + "bom-ref": "54f7c69463e374e3", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/more_itertools/more.py", "type": "file" }, { - "bom-ref": "f4d229d450d7c623", + "bom-ref": "df010f9f0bee9565", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/more_itertools/recipes.py", "type": "file" }, { - "bom-ref": "8586f14c72823161", + "bom-ref": "656feb39e7951b07", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/__init__.py", "type": "file" }, { - "bom-ref": "f8970746c8afaafb", + "bom-ref": "1b5639816164d66d", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_elffile.py", "type": "file" }, { - "bom-ref": "ce3152b5174502cf", + "bom-ref": "e2727e7aa1d4bd99", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_manylinux.py", "type": "file" }, { - "bom-ref": "69db1f23985fd607", + "bom-ref": "f618cb02a05588cd", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_musllinux.py", "type": "file" }, { - "bom-ref": "f1d0b30fdfa50097", + "bom-ref": "9a2e4f10c787c609", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_parser.py", "type": "file" }, { - "bom-ref": "725b781564cfbe22", + "bom-ref": "3fb006d8e38b6fa0", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_structures.py", "type": "file" }, { - "bom-ref": "bfe70803a24ae176", + "bom-ref": "b347609594920d64", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/_tokenizer.py", "type": "file" }, { - "bom-ref": "b54aa0f9a6cffa0b", + "bom-ref": "35d3b80b3054b411", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/markers.py", "type": "file" }, { - "bom-ref": "869b92bf8975be50", + "bom-ref": "926baa36c86efd4a", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/metadata.py", "type": "file" }, { - "bom-ref": "42fa722f4dd91c20", + "bom-ref": "03ed7f32b07fa03a", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/requirements.py", "type": "file" }, { - "bom-ref": "97d7876c9deb9d72", + "bom-ref": "0983ee254c96369c", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/specifiers.py", "type": "file" }, { - "bom-ref": "1e3cfafeeea5adbc", + "bom-ref": "ca423d4844c6610e", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/tags.py", "type": "file" }, { - "bom-ref": "0ab6c7a3b785f6ed", + "bom-ref": "9c1e6a0e185794c7", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/utils.py", "type": "file" }, { - "bom-ref": "364c3e0012139e45", + "bom-ref": "7d5da40d2cae4727", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/version.py", "type": "file" }, { - "bom-ref": "a8dd44fca1244075", + "bom-ref": "58f762ecd42eb1c3", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/__init__.py", "type": "file" }, { - "bom-ref": "2e27003c9f547031", + "bom-ref": "3fc7290346c815d7", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/__main__.py", "type": "file" }, { - "bom-ref": "c1d878f27cdfb5c1", + "bom-ref": "5fe1feb87012dd57", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/android.py", "type": "file" }, { - "bom-ref": "bc3fbef8daac3999", + "bom-ref": "8f9a9c5f8725da67", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/api.py", "type": "file" }, { - "bom-ref": "1c82e21c294292f1", + "bom-ref": "31d67e6f189b5d3f", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/macos.py", "type": "file" }, { - "bom-ref": "3fc1cad8254c105d", + "bom-ref": "ce9ba3589c8db46b", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/unix.py", "type": "file" }, { - "bom-ref": "979a58d33b2460c5", + "bom-ref": "1fa8fb572cdf8fbf", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/version.py", "type": "file" }, { - "bom-ref": "e71cf400ebbbf679", + "bom-ref": "f071cf6352ec0df7", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/platformdirs/windows.py", "type": "file" }, { - "bom-ref": "f63abdf2e2e96b1c", + "bom-ref": "39eebfe85a83c706", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/typing_extensions.py", "type": "file" }, { - "bom-ref": "95d37a09caf54098", + "bom-ref": "780d71b811d0e4ba", "name": "/usr/lib/python3/dist-packages/pkg_resources/_vendor/zipp.py", "type": "file" }, { - "bom-ref": "9b67c026ca8f9601", + "bom-ref": "d750283bf399b22b", "name": "/usr/lib/python3/dist-packages/pkg_resources/extern/__init__.py", "type": "file" }, { - "bom-ref": "3accc1f0dfaa3d26", + "bom-ref": "5c7864681ad0431c", "name": "/usr/lib/python3/dist-packages/setuptools-68.1.2.egg-info/PKG-INFO", "type": "file" }, { - "bom-ref": "b6c518a426a08c84", + "bom-ref": "1b5a459a7517764a", "name": "/usr/lib/python3/dist-packages/setuptools-68.1.2.egg-info/dependency_links.txt", "type": "file" }, { - "bom-ref": "8eab6cfd60affa19", + "bom-ref": "7e888f282a404eb3", "name": "/usr/lib/python3/dist-packages/setuptools-68.1.2.egg-info/entry_points.txt", "type": "file" }, { - "bom-ref": "be0b8bb6e66fccf6", + "bom-ref": "7bf33f3ecde183a0", "name": "/usr/lib/python3/dist-packages/setuptools-68.1.2.egg-info/top_level.txt", "type": "file" }, { - "bom-ref": "dd8f285f8c8af537", + "bom-ref": "3d8e34db2e04f4f9", "name": "/usr/lib/python3/dist-packages/setuptools/__init__.py", "type": "file" }, { - "bom-ref": "fbc3fb024fdba188", + "bom-ref": "40856f0c94636b52", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/__init__.py", "type": "file" }, { - "bom-ref": "4c12259417e87a45", + "bom-ref": "abcc25d44f6a58af", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/_collections.py", "type": "file" }, { - "bom-ref": "debe45699f5173fe", + "bom-ref": "10493919a132e824", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/_functools.py", "type": "file" }, { - "bom-ref": "0eb572747b1fbf8e", + "bom-ref": "a77a77526529c410", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/_log.py", "type": "file" }, { - "bom-ref": "2f5d6b1ca3005718", + "bom-ref": "5ea39f06e3712ce2", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/_macos_compat.py", "type": "file" }, { - "bom-ref": "e632a0f67d57de48", + "bom-ref": "48a51a5e408c34a6", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/_msvccompiler.py", "type": "file" }, { - "bom-ref": "e2f27e61737a4e68", + "bom-ref": "82c2e462d9169312", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/archive_util.py", "type": "file" }, { - "bom-ref": "31c47645d443c94a", + "bom-ref": "47780f4c06903080", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/bcppcompiler.py", "type": "file" }, { - "bom-ref": "b35cc072441d3c0a", + "bom-ref": "6f1e5d376d852708", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/ccompiler.py", "type": "file" }, { - "bom-ref": "e211c06fc2f06ae1", + "bom-ref": "3b009764172c3753", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", "type": "file" }, { - "bom-ref": "562439b5db1ed93d", + "bom-ref": "f16231b3318116a7", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/__init__.py", "type": "file" }, { - "bom-ref": "703755444347a78f", + "bom-ref": "8e72dcd3eed2146d", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/_framework_compat.py", "type": "file" }, { - "bom-ref": "48a4e29d10a8ebb4", + "bom-ref": "e47a7b3b8f1ea6ca", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/bdist.py", "type": "file" }, { - "bom-ref": "7d217df00539d58e", + "bom-ref": "7206f4044758e20c", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/bdist_dumb.py", "type": "file" }, { - "bom-ref": "b9f8cdcaee9b2831", + "bom-ref": "16cf42e8fa55f22b", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/bdist_rpm.py", "type": "file" }, { - "bom-ref": "4fd4bcc2806d3c0c", + "bom-ref": "4690edc31006389a", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/build.py", "type": "file" }, { - "bom-ref": "d0e5c433d66f02b4", + "bom-ref": "332cca0f55a9f626", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/build_clib.py", "type": "file" }, { - "bom-ref": "daf9a8be35df681a", + "bom-ref": "665a12be1db585a8", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/build_ext.py", "type": "file" }, { - "bom-ref": "fae819e447b5f829", + "bom-ref": "ac4aa2651859e19f", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/build_py.py", "type": "file" }, { - "bom-ref": "6a0293cceafc3e85", + "bom-ref": "5585671b32afc4b7", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/build_scripts.py", "type": "file" }, { - "bom-ref": "2f23600843e34345", + "bom-ref": "e0f183728aab1773", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/check.py", "type": "file" }, { - "bom-ref": "5cf8e29448882975", + "bom-ref": "23c65647dd1b94e3", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/clean.py", "type": "file" }, { - "bom-ref": "2a4ba5651b92306c", + "bom-ref": "498465aed344a7a6", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/config.py", "type": "file" }, { - "bom-ref": "e1c0049b2ca6e228", + "bom-ref": "7cd240698b595d5a", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install.py", "type": "file" }, { - "bom-ref": "09b78c0b5830af01", + "bom-ref": "5f43d62d8d2f061f", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install_data.py", "type": "file" }, { - "bom-ref": "f7f0ddf6e8b2765e", + "bom-ref": "1f59ccbf2f3ab6b4", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install_egg_info.py", "type": "file" }, { - "bom-ref": "e8807726534bc1c8", + "bom-ref": "e310459a2a3614aa", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install_headers.py", "type": "file" }, { - "bom-ref": "c524c2b5bf122961", + "bom-ref": "a01859a47c8cbc9b", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install_lib.py", "type": "file" }, { - "bom-ref": "567b347742946137", + "bom-ref": "e96230c407183585", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/install_scripts.py", "type": "file" }, { - "bom-ref": "2529ea0391c7e0fa", + "bom-ref": "66e866c1bb3f52e0", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/py37compat.py", "type": "file" }, { - "bom-ref": "4b3b8381fa2f3f7c", + "bom-ref": "e5d9e2745b42705a", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/register.py", "type": "file" }, { - "bom-ref": "790187d86427daea", + "bom-ref": "f78aada9f1446968", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/sdist.py", "type": "file" }, { - "bom-ref": "ee64c8873a6da853", + "bom-ref": "40bcf34a47122b61", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/command/upload.py", "type": "file" }, { - "bom-ref": "5b6001c94304e251", + "bom-ref": "c0c9924d238e3367", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/config.py", "type": "file" }, { - "bom-ref": "b76efe0f8d66f7a0", + "bom-ref": "3ffde5b3bbf1fc96", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/core.py", "type": "file" }, { - "bom-ref": "563ce1f1bac999e8", + "bom-ref": "469b32ec6ed553ea", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/cygwinccompiler.py", "type": "file" }, { - "bom-ref": "f5344ab8c448dca0", + "bom-ref": "370c255f76186242", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/debug.py", "type": "file" }, { - "bom-ref": "13fe88b78a03b672", + "bom-ref": "ba07a342f48b03d0", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/dep_util.py", "type": "file" }, { - "bom-ref": "16b759685ab5ce89", + "bom-ref": "02436e8916433d7f", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/dir_util.py", "type": "file" }, { - "bom-ref": "b78af9940f9be668", + "bom-ref": "516eef6696453e5e", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", "type": "file" }, { - "bom-ref": "5b6c249a8323eb47", + "bom-ref": "41efc0c9086431fd", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/errors.py", "type": "file" }, { - "bom-ref": "1260f0c710110ba3", + "bom-ref": "4bf0fbc07ab99c51", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/extension.py", "type": "file" }, { - "bom-ref": "aa7da97114490a4d", + "bom-ref": "1062f901d516b4fb", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/fancy_getopt.py", "type": "file" }, { - "bom-ref": "cbd00fbcf7f4d77c", + "bom-ref": "58bc961068405d1a", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/file_util.py", "type": "file" }, { - "bom-ref": "7eadbaed93d09272", + "bom-ref": "9d3289ecd36c2d00", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/filelist.py", "type": "file" }, { - "bom-ref": "87ed53a0603da2ea", + "bom-ref": "790bea374acd6a80", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/log.py", "type": "file" }, { - "bom-ref": "19b27d1dbe1b9bf8", + "bom-ref": "93090ac9862a1aa6", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/msvc9compiler.py", "type": "file" }, { - "bom-ref": "4a579b1d23b6fbeb", + "bom-ref": "9d79a1dca5d46841", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/msvccompiler.py", "type": "file" }, { - "bom-ref": "d6a7bb8e2099e61d", + "bom-ref": "42a99f543f8ec85f", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/py38compat.py", "type": "file" }, { - "bom-ref": "ecb2895c9b6b8b43", + "bom-ref": "bf8d4ea533e8d089", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/py39compat.py", "type": "file" }, { - "bom-ref": "33b22cc44e488302", + "bom-ref": "620fb6330f674b3c", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/spawn.py", "type": "file" }, { - "bom-ref": "58236c4c6570554c", + "bom-ref": "37fcc26d20714c02", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/sysconfig.py", "type": "file" }, { - "bom-ref": "b0264183fb01dfb0", + "bom-ref": "bb5c33528bc4f5c6", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/text_file.py", "type": "file" }, { - "bom-ref": "915dddd7b99b52d1", + "bom-ref": "96a18ba3d43dd0fb", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/unixccompiler.py", "type": "file" }, { - "bom-ref": "94b7bbf674582282", + "bom-ref": "8b7f758325feedf8", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/util.py", "type": "file" }, { - "bom-ref": "6fcb3000f3514bf9", + "bom-ref": "4bc1840ad29af933", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/version.py", "type": "file" }, { - "bom-ref": "42e25594824d0ba3", + "bom-ref": "8dafa0bedc134ce1", "name": "/usr/lib/python3/dist-packages/setuptools/_distutils/versionpredicate.py", "type": "file" }, { - "bom-ref": "f9f968198801d165", + "bom-ref": "8715127ff1ec2efb", "name": "/usr/lib/python3/dist-packages/setuptools/_entry_points.py", "type": "file" }, { - "bom-ref": "b74327458355bf5d", + "bom-ref": "359f0739c5e6cf0b", "name": "/usr/lib/python3/dist-packages/setuptools/_imp.py", "type": "file" }, { - "bom-ref": "daf5aca3aa1294f9", + "bom-ref": "395ee8f4711f071b", "name": "/usr/lib/python3/dist-packages/setuptools/_importlib.py", "type": "file" }, { - "bom-ref": "9e42f3e52b41eb0e", + "bom-ref": "012e37b5c7e660b0", "name": "/usr/lib/python3/dist-packages/setuptools/_itertools.py", "type": "file" }, { - "bom-ref": "93401ecaa77b3cc6", + "bom-ref": "611c4bafacffe834", "name": "/usr/lib/python3/dist-packages/setuptools/_normalization.py", "type": "file" }, { - "bom-ref": "45990d3005b0121c", + "bom-ref": "71b6eb4d0b01ce72", "name": "/usr/lib/python3/dist-packages/setuptools/_path.py", "type": "file" }, { - "bom-ref": "b670638a8f52e151", + "bom-ref": "80867bac288367b7", "name": "/usr/lib/python3/dist-packages/setuptools/_reqs.py", "type": "file" }, { - "bom-ref": "6a777497c109151b", + "bom-ref": "824717237f0b4981", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/__init__.py", "type": "file" }, { - "bom-ref": "5d5d2f1ab6e1b8b2", + "bom-ref": "00a7d8a0cd13c4b0", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/__init__.py", "type": "file" }, { - "bom-ref": "8e5037be0190c9de", + "bom-ref": "3d4bbddd4fca4d00", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_adapters.py", "type": "file" }, { - "bom-ref": "29ef6b55519eedea", + "bom-ref": "ed5bfc7eb270116c", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_collections.py", "type": "file" }, { - "bom-ref": "ec98b6c96176ff76", + "bom-ref": "cbad7061ad06c404", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_compat.py", "type": "file" }, { - "bom-ref": "b2daa88928a03925", + "bom-ref": "c999b2275191ae53", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_functools.py", "type": "file" }, { - "bom-ref": "ffaad07feb04f35a", + "bom-ref": "156934d5fd1017d8", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_itertools.py", "type": "file" }, { - "bom-ref": "6b402a3e5f4c2d7c", + "bom-ref": "722a1c17f8555f6e", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_meta.py", "type": "file" }, { - "bom-ref": "68f1a7d2d77eccc2", + "bom-ref": "916c94fba686d5bc", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_py39compat.py", "type": "file" }, { - "bom-ref": "0ff1c6618ebf65b1", + "bom-ref": "80495a576bdd5007", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_metadata/_text.py", "type": "file" }, { - "bom-ref": "dba8dfdb79220b25", + "bom-ref": "df9a8e8fd6ff99bf", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/__init__.py", "type": "file" }, { - "bom-ref": "d05918c3aab49832", + "bom-ref": "4cf4ca9f70f344f4", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/_adapters.py", "type": "file" }, { - "bom-ref": "f83049395a842087", + "bom-ref": "e726e7f60a482a4d", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/_common.py", "type": "file" }, { - "bom-ref": "9ab63424754cecd3", + "bom-ref": "4b2bd40f79c1e87d", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/_compat.py", "type": "file" }, { - "bom-ref": "26599aeab7fd4cca", + "bom-ref": "c54b10b3f651b394", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/_itertools.py", "type": "file" }, { - "bom-ref": "a5c4aca508b05471", + "bom-ref": "3e4e669bb5d0622f", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/_legacy.py", "type": "file" }, { - "bom-ref": "500c8fc864bb3930", + "bom-ref": "361af40dc49941be", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/abc.py", "type": "file" }, { - "bom-ref": "482f29f89b1de8ae", + "bom-ref": "68db3c029677e53c", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/readers.py", "type": "file" }, { - "bom-ref": "5b9af88990daac44", + "bom-ref": "d200d0a06a911662", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/importlib_resources/simple.py", "type": "file" }, { - "bom-ref": "f237f6f88baa1286", + "bom-ref": "7bbdfc72f6814e20", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/jaraco/__init__.py", "type": "file" }, { - "bom-ref": "0f8df8c7ffaf121f", + "bom-ref": "78aa8db4491159d5", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/jaraco/context.py", "type": "file" }, { - "bom-ref": "4604b4a68aa71b4e", + "bom-ref": "67b598dc94046a40", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/jaraco/functools.py", "type": "file" }, { - "bom-ref": "5ba8407d9babe7da", + "bom-ref": "ed99dfd565d4c9e8", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/jaraco/text/__init__.py", "type": "file" }, { - "bom-ref": "96e438752c3721dd", + "bom-ref": "a4df9385e368b9b3", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/more_itertools/__init__.py", "type": "file" }, { - "bom-ref": "49bb554d8d9bbad1", + "bom-ref": "c1efdb1f5cc616cf", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/more_itertools/more.py", "type": "file" }, { - "bom-ref": "061e5da03978f49e", + "bom-ref": "7bc4b1f6ef6a2c1c", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/more_itertools/recipes.py", "type": "file" }, { - "bom-ref": "176d36702dcec626", + "bom-ref": "6f12b13520bbe71c", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/ordered_set.py", "type": "file" }, { - "bom-ref": "03fb6defbdbc9c46", + "bom-ref": "0b336ed33954f24c", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/__init__.py", "type": "file" }, { - "bom-ref": "60968153ccb553c0", + "bom-ref": "7ad6ee0c2c19a5f2", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_elffile.py", "type": "file" }, { - "bom-ref": "5aa648d078f31d7e", + "bom-ref": "acca86cfad74c2fc", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_manylinux.py", "type": "file" }, { - "bom-ref": "27bbba1cede4382a", + "bom-ref": "c6b9e7ec062c9424", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_musllinux.py", "type": "file" }, { - "bom-ref": "9dc859de5abc076c", + "bom-ref": "8c29a9f9e1bac066", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_parser.py", "type": "file" }, { - "bom-ref": "491cfc340dbaa217", + "bom-ref": "2a013f589e180dcd", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_structures.py", "type": "file" }, { - "bom-ref": "750da2fab25fcf9b", + "bom-ref": "26ce5fafb89c87e9", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/_tokenizer.py", "type": "file" }, { - "bom-ref": "f79163b60e9c4d5c", + "bom-ref": "b2339ad0bc847716", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/markers.py", "type": "file" }, { - "bom-ref": "28a5ab17f674fd40", + "bom-ref": "15700d50e2775d72", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/metadata.py", "type": "file" }, { - "bom-ref": "e7c81e45a9bf05e4", + "bom-ref": "afe8c2344a96bec2", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/requirements.py", "type": "file" }, { - "bom-ref": "3afa295238604efc", + "bom-ref": "20a8a12162adb3ba", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/specifiers.py", "type": "file" }, { - "bom-ref": "50b738f3ff8ee41c", + "bom-ref": "cc8c3f2b27a4ac46", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/tags.py", "type": "file" }, { - "bom-ref": "a8c1a80e52836e96", + "bom-ref": "9f0ebce34e0134cc", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/utils.py", "type": "file" }, { - "bom-ref": "1676d214f2af9f71", + "bom-ref": "f4e6635f48235a87", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/packaging/version.py", "type": "file" }, { - "bom-ref": "775bcb3d73f71fd7", + "bom-ref": "efad2a633c1d1b4d", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/tomli/__init__.py", "type": "file" }, { - "bom-ref": "2f265dd19f7a90e0", + "bom-ref": "2c1ca1f27b2f5106", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/tomli/_parser.py", "type": "file" }, { - "bom-ref": "2facf008040f1735", + "bom-ref": "aeb8b31262a7162b", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/tomli/_re.py", "type": "file" }, { - "bom-ref": "93711fc52734c57e", + "bom-ref": "8b958b0ce95372e0", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/tomli/_types.py", "type": "file" }, { - "bom-ref": "742fe69d83e8b1b8", + "bom-ref": "c657a1ae778dc602", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/typing_extensions.py", "type": "file" }, { - "bom-ref": "89785251410ea317", + "bom-ref": "e48cef2a0c1845a1", "name": "/usr/lib/python3/dist-packages/setuptools/_vendor/zipp.py", "type": "file" }, { - "bom-ref": "0030fc0a5d57cbc4", + "bom-ref": "d7f1f88f0abee8a6", "name": "/usr/lib/python3/dist-packages/setuptools/archive_util.py", "type": "file" }, { - "bom-ref": "5d8de36e442ce6a3", + "bom-ref": "24754d3ed021b62d", "name": "/usr/lib/python3/dist-packages/setuptools/build_meta.py", "type": "file" }, { - "bom-ref": "6c03f6189a27e913", + "bom-ref": "3ac8dccde1db0c31", "name": "/usr/lib/python3/dist-packages/setuptools/command/__init__.py", "type": "file" }, { - "bom-ref": "24b8d4570000625f", + "bom-ref": "0250a0ab02c1bea1", "name": "/usr/lib/python3/dist-packages/setuptools/command/alias.py", "type": "file" }, { - "bom-ref": "2f47e32a123e2c94", + "bom-ref": "d986fde843cc2d2e", "name": "/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py", "type": "file" }, { - "bom-ref": "ea5d5747a2d4c5a6", + "bom-ref": "9d092f0ebe79f6f8", "name": "/usr/lib/python3/dist-packages/setuptools/command/bdist_rpm.py", "type": "file" }, { - "bom-ref": "da2bb594890d7565", + "bom-ref": "0336b1b6cb8d304b", "name": "/usr/lib/python3/dist-packages/setuptools/command/build.py", "type": "file" }, { - "bom-ref": "24bb94a0f73b6b09", + "bom-ref": "622ebe7de1d458eb", "name": "/usr/lib/python3/dist-packages/setuptools/command/build_clib.py", "type": "file" }, { - "bom-ref": "910e6d7d184f7f39", + "bom-ref": "ae2038d40a1a21cf", "name": "/usr/lib/python3/dist-packages/setuptools/command/build_ext.py", "type": "file" }, { - "bom-ref": "75e16dbe407cd303", + "bom-ref": "b3dd6c6cc0815275", "name": "/usr/lib/python3/dist-packages/setuptools/command/build_py.py", "type": "file" }, { - "bom-ref": "88e1155f1edb9884", + "bom-ref": "a3f15f4fb1a35a0a", "name": "/usr/lib/python3/dist-packages/setuptools/command/develop.py", "type": "file" }, { - "bom-ref": "bcc6c5aa64009717", + "bom-ref": "7389123de68b868d", "name": "/usr/lib/python3/dist-packages/setuptools/command/dist_info.py", "type": "file" }, { - "bom-ref": "d64a3e9f108a0efb", + "bom-ref": "070a216bcde6d925", "name": "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", "type": "file" }, { - "bom-ref": "2c31e7da642acd37", + "bom-ref": "b9531bc586a5bbc5", "name": "/usr/lib/python3/dist-packages/setuptools/command/editable_wheel.py", "type": "file" }, { - "bom-ref": "b79c0a18d9f66f26", + "bom-ref": "12e612c8820101a8", "name": "/usr/lib/python3/dist-packages/setuptools/command/egg_info.py", "type": "file" }, { - "bom-ref": "f798c4a44df35487", + "bom-ref": "c523fdc5996ee241", "name": "/usr/lib/python3/dist-packages/setuptools/command/install.py", "type": "file" }, { - "bom-ref": "58ce9355477428e0", + "bom-ref": "ebb96fe22967ddc2", "name": "/usr/lib/python3/dist-packages/setuptools/command/install_egg_info.py", "type": "file" }, { - "bom-ref": "051233668047f3cb", + "bom-ref": "d972a52901eadced", "name": "/usr/lib/python3/dist-packages/setuptools/command/install_lib.py", "type": "file" }, { - "bom-ref": "0b935c74fb4be167", + "bom-ref": "ba57d34470652035", "name": "/usr/lib/python3/dist-packages/setuptools/command/install_scripts.py", "type": "file" }, { - "bom-ref": "34eedd7e5b0c4416", + "bom-ref": "738c665c52aec92c", "name": "/usr/lib/python3/dist-packages/setuptools/command/launcher manifest.xml", "type": "file" }, { - "bom-ref": "e391ab318f261b62", + "bom-ref": "6d4b86204b0dfa30", "name": "/usr/lib/python3/dist-packages/setuptools/command/register.py", "type": "file" }, { - "bom-ref": "1b3a0a81adccf818", + "bom-ref": "ddcdca29081390b6", "name": "/usr/lib/python3/dist-packages/setuptools/command/rotate.py", "type": "file" }, { - "bom-ref": "750296b5047c7c54", + "bom-ref": "124c30cf8927ef2e", "name": "/usr/lib/python3/dist-packages/setuptools/command/saveopts.py", "type": "file" }, { - "bom-ref": "be17b6561d0b0bff", + "bom-ref": "afa9ad79ba71cab1", "name": "/usr/lib/python3/dist-packages/setuptools/command/sdist.py", "type": "file" }, { - "bom-ref": "7ab81f5830f2ff6d", + "bom-ref": "e45d1d6d657d6163", "name": "/usr/lib/python3/dist-packages/setuptools/command/setopt.py", "type": "file" }, { - "bom-ref": "e08bead27e72b841", + "bom-ref": "ca6b2dd4ca2661ff", "name": "/usr/lib/python3/dist-packages/setuptools/command/test.py", "type": "file" }, { - "bom-ref": "cf615f80527251ab", + "bom-ref": "995c79fe29273031", "name": "/usr/lib/python3/dist-packages/setuptools/command/upload.py", "type": "file" }, { - "bom-ref": "eeec5ade714f19cf", + "bom-ref": "f3737b5ba2ec33fd", "name": "/usr/lib/python3/dist-packages/setuptools/command/upload_docs.py", "type": "file" }, { - "bom-ref": "cda46cd0c948999d", + "bom-ref": "8eb825bf1a3219f3", "name": "/usr/lib/python3/dist-packages/setuptools/config/__init__.py", "type": "file" }, { - "bom-ref": "68c69f56220e5e8a", + "bom-ref": "dee580a7b1a66780", "name": "/usr/lib/python3/dist-packages/setuptools/config/_apply_pyprojecttoml.py", "type": "file" }, { - "bom-ref": "ceadb5592bd963f4", + "bom-ref": "eb20910ac0b5d91a", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/__init__.py", "type": "file" }, { - "bom-ref": "4ab086a6a77f9437", + "bom-ref": "2ec7d6a6cf588a45", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/error_reporting.py", "type": "file" }, { - "bom-ref": "e574e7cc4d0d1121", + "bom-ref": "d149c16a72976827", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/extra_validations.py", "type": "file" }, { - "bom-ref": "d32f14ff76955ce3", + "bom-ref": "bcd19cfd0271c519", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py", "type": "file" }, { - "bom-ref": "d676da9ca4a88b44", + "bom-ref": "0bcf37594bb3c38e", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py", "type": "file" }, { - "bom-ref": "07e8a4c2b0d46979", + "bom-ref": "a0d7625f5a4ed39b", "name": "/usr/lib/python3/dist-packages/setuptools/config/_validate_pyproject/formats.py", "type": "file" }, { - "bom-ref": "994a3f09008a9e04", + "bom-ref": "37b0648c11e3fa8a", "name": "/usr/lib/python3/dist-packages/setuptools/config/expand.py", "type": "file" }, { - "bom-ref": "0b255f0c903c67f7", + "bom-ref": "16d837ba7da408f5", "name": "/usr/lib/python3/dist-packages/setuptools/config/pyprojecttoml.py", "type": "file" }, { - "bom-ref": "c1059ac2a3d0b2aa", + "bom-ref": "6da304884d200064", "name": "/usr/lib/python3/dist-packages/setuptools/config/setupcfg.py", "type": "file" }, { - "bom-ref": "182f92c2335124c6", + "bom-ref": "02d4b521615f5948", "name": "/usr/lib/python3/dist-packages/setuptools/dep_util.py", "type": "file" }, { - "bom-ref": "ee85bdea165fc6b2", + "bom-ref": "184933e140d1457c", "name": "/usr/lib/python3/dist-packages/setuptools/depends.py", "type": "file" }, { - "bom-ref": "7d2f6642cdfc6459", + "bom-ref": "724fd0d8c813c777", "name": "/usr/lib/python3/dist-packages/setuptools/discovery.py", "type": "file" }, { - "bom-ref": "df6890fd1ebad220", + "bom-ref": "7faf2ab5304d244a", "name": "/usr/lib/python3/dist-packages/setuptools/dist.py", "type": "file" }, { - "bom-ref": "3975ee4a22c819d3", + "bom-ref": "a6e082a5c97f9921", "name": "/usr/lib/python3/dist-packages/setuptools/errors.py", "type": "file" }, { - "bom-ref": "a6ed11ead93857d0", + "bom-ref": "7e050780dcf06646", "name": "/usr/lib/python3/dist-packages/setuptools/extension.py", "type": "file" }, { - "bom-ref": "4da04d8405fd9af1", + "bom-ref": "df8dc3f1b90e54fb", "name": "/usr/lib/python3/dist-packages/setuptools/extern/__init__.py", "type": "file" }, { - "bom-ref": "018ee596db08b782", + "bom-ref": "3615629a60f71d3c", "name": "/usr/lib/python3/dist-packages/setuptools/glob.py", "type": "file" }, { - "bom-ref": "948de5b458369e2f", + "bom-ref": "9fd3b770931d1741", "name": "/usr/lib/python3/dist-packages/setuptools/installer.py", "type": "file" }, { - "bom-ref": "4a07173d42705f02", + "bom-ref": "1d23356de45b7b40", "name": "/usr/lib/python3/dist-packages/setuptools/launch.py", "type": "file" }, { - "bom-ref": "9312bef30d961745", + "bom-ref": "9aca279c3e272e67", "name": "/usr/lib/python3/dist-packages/setuptools/logging.py", "type": "file" }, { - "bom-ref": "ed8caf85b7f20f91", + "bom-ref": "0572b0c1d9daec17", "name": "/usr/lib/python3/dist-packages/setuptools/monkey.py", "type": "file" }, { - "bom-ref": "dc4cd1a740eaa843", + "bom-ref": "8174a505598707c1", "name": "/usr/lib/python3/dist-packages/setuptools/msvc.py", "type": "file" }, { - "bom-ref": "1c6dfb4706ed2af3", + "bom-ref": "acf99f1a91e3f725", "name": "/usr/lib/python3/dist-packages/setuptools/namespaces.py", "type": "file" }, { - "bom-ref": "cb3d0d3589a52a5a", + "bom-ref": "06bb10d3bda229c8", "name": "/usr/lib/python3/dist-packages/setuptools/package_index.py", "type": "file" }, { - "bom-ref": "7a171a5c6c080186", + "bom-ref": "73bdb2c1b0dd0e18", "name": "/usr/lib/python3/dist-packages/setuptools/py312compat.py", "type": "file" }, { - "bom-ref": "61f46a91f26e779c", + "bom-ref": "aa3bfac8f1124756", "name": "/usr/lib/python3/dist-packages/setuptools/sandbox.py", "type": "file" }, { - "bom-ref": "1e5d4f83fbd828a3", + "bom-ref": "ffd26a3f4f417235", "name": "/usr/lib/python3/dist-packages/setuptools/script (dev).tmpl", "type": "file" }, { - "bom-ref": "e547258416da9575", + "bom-ref": "973da38bb611b0bf", "name": "/usr/lib/python3/dist-packages/setuptools/script.tmpl", "type": "file" }, { - "bom-ref": "e7445a7e93101845", + "bom-ref": "a91631d8075a7367", "name": "/usr/lib/python3/dist-packages/setuptools/unicode_utils.py", "type": "file" }, { - "bom-ref": "1a9982fe9a456ef2", + "bom-ref": "02ad57825957b7f4", "name": "/usr/lib/python3/dist-packages/setuptools/version.py", "type": "file" }, { - "bom-ref": "de7ab6b5f588b6a8", + "bom-ref": "031d46fc7436ba66", "name": "/usr/lib/python3/dist-packages/setuptools/warnings.py", "type": "file" }, { - "bom-ref": "b401cf6398fcaae1", + "bom-ref": "b537b7adbdf44a9b", "name": "/usr/lib/python3/dist-packages/setuptools/wheel.py", "type": "file" }, { - "bom-ref": "ba538d35b004ce20", + "bom-ref": "a018d1b5df5ea26e", "name": "/usr/lib/python3/dist-packages/setuptools/windows_support.py", "type": "file" }, { - "bom-ref": "57fee321ae2bf329", + "bom-ref": "5340e7be9f5fbf9b", "name": "/usr/lib/python3/dist-packages/wheel-0.42.0.dist-info/INSTALLER", "type": "file" }, { - "bom-ref": "fbf0a96162718755", + "bom-ref": "ce0a651adee8a073", "name": "/usr/lib/python3/dist-packages/wheel-0.42.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4928bb97a94ca1db", + "bom-ref": "db286829ec64bf75", "name": "/usr/lib/python3/dist-packages/wheel-0.42.0.dist-info/WHEEL", "type": "file" }, { - "bom-ref": "cfa05a8ed1cbd8b5", + "bom-ref": "b89654f2ed8eebff", "name": "/usr/lib/python3/dist-packages/wheel-0.42.0.dist-info/entry_points.txt", "type": "file" }, { - "bom-ref": "93300a26c99c3eea", + "bom-ref": "23e9f694f7ec8c24", "name": "/usr/lib/python3/dist-packages/wheel/__init__.py", "type": "file" }, { - "bom-ref": "fdea97faa955e4e5", + "bom-ref": "12a021b99fbfecaf", "name": "/usr/lib/python3/dist-packages/wheel/__main__.py", "type": "file" }, { - "bom-ref": "cd1caed761857c53", + "bom-ref": "c74ccf207984e999", "name": "/usr/lib/python3/dist-packages/wheel/_setuptools_logging.py", "type": "file" }, { - "bom-ref": "338b101fd48b8212", + "bom-ref": "5db219e4df138364", "name": "/usr/lib/python3/dist-packages/wheel/bdist_wheel.py", "type": "file" }, { - "bom-ref": "a0540ed0db4d4176", + "bom-ref": "9016d5add5f357e8", "name": "/usr/lib/python3/dist-packages/wheel/cli/__init__.py", "type": "file" }, { - "bom-ref": "22421e8e73356ab0", + "bom-ref": "1fb7a92964e6e33e", "name": "/usr/lib/python3/dist-packages/wheel/cli/convert.py", "type": "file" }, { - "bom-ref": "ffff577982e96acf", + "bom-ref": "6f7575cf12edd259", "name": "/usr/lib/python3/dist-packages/wheel/cli/pack.py", "type": "file" }, { - "bom-ref": "c151da6fbf9192b3", + "bom-ref": "caae60179d1df8e5", "name": "/usr/lib/python3/dist-packages/wheel/cli/tags.py", "type": "file" }, { - "bom-ref": "7f05508865a469c2", + "bom-ref": "329f5bc8b4af73a4", "name": "/usr/lib/python3/dist-packages/wheel/cli/unpack.py", "type": "file" }, { - "bom-ref": "3739d4edb3beb5e6", + "bom-ref": "99a0c6382f13af30", "name": "/usr/lib/python3/dist-packages/wheel/macosx_libfile.py", "type": "file" }, { - "bom-ref": "a176cfab96259378", + "bom-ref": "66162876f63dba86", "name": "/usr/lib/python3/dist-packages/wheel/metadata.py", "type": "file" }, { - "bom-ref": "fd24f7f59420c979", + "bom-ref": "e97d132812b226eb", "name": "/usr/lib/python3/dist-packages/wheel/util.py", "type": "file" }, { - "bom-ref": "450fbb6de22ac5e9", + "bom-ref": "d86548af4e28e33b", "name": "/usr/lib/python3/dist-packages/wheel/vendored/__init__.py", "type": "file" }, { - "bom-ref": "ea51eb4fde1e425f", + "bom-ref": "d768f2a94dcee4d9", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/__init__.py", "type": "file" }, { - "bom-ref": "7d42fab1a86af353", + "bom-ref": "55f3f42eab7da159", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_elffile.py", "type": "file" }, { - "bom-ref": "3021371868ce3e13", + "bom-ref": "36f53dc34182870d", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_manylinux.py", "type": "file" }, { - "bom-ref": "57c55156d67e9e2c", + "bom-ref": "16cad99fbf3ae76e", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_musllinux.py", "type": "file" }, { - "bom-ref": "b30dd888a4cc2f84", + "bom-ref": "cd24e798f66ee1f2", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_parser.py", "type": "file" }, { - "bom-ref": "b3748460edfb59ae", + "bom-ref": "cca9d2406772db78", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_structures.py", "type": "file" }, { - "bom-ref": "a14ed5b1d98ba34e", + "bom-ref": "08b8e8f9109b9c58", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/_tokenizer.py", "type": "file" }, { - "bom-ref": "5808ecc22b4fc03f", + "bom-ref": "d7e98ea0445c2c91", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/markers.py", "type": "file" }, { - "bom-ref": "527d44e772d96677", + "bom-ref": "e2af0fe16c2e6e2d", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/requirements.py", "type": "file" }, { - "bom-ref": "53cf83ba2bc9659a", + "bom-ref": "7b772c796c09fc88", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/specifiers.py", "type": "file" }, { - "bom-ref": "fb300e59f12d7516", + "bom-ref": "e687257a6ec5121c", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/tags.py", "type": "file" }, { - "bom-ref": "e7f36670e8d103df", + "bom-ref": "a0d632090f0e3fad", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/utils.py", "type": "file" }, { - "bom-ref": "2746117f69e53479", + "bom-ref": "4d70c4bbd26298bf", "name": "/usr/lib/python3/dist-packages/wheel/vendored/packaging/version.py", "type": "file" }, { - "bom-ref": "7e5b6495b79736cd", + "bom-ref": "c67eac4d2806ab7b", "name": "/usr/lib/python3/dist-packages/wheel/vendored/vendor.txt", "type": "file" }, { - "bom-ref": "13cad818f674c53a", + "bom-ref": "45c8e80f82a185d4", "name": "/usr/lib/python3/dist-packages/wheel/wheelfile.py", "type": "file" }, { - "bom-ref": "aef97678777631a7", + "bom-ref": "7f1c1ec05f3bbb99", "name": "/usr/lib/python3/dist-packages/yaml/__init__.py", "type": "file" }, { - "bom-ref": "eb63d05dcfdb34d4", + "bom-ref": "6856c9b1827595f2", "name": "/usr/lib/python3/dist-packages/yaml/_yaml.cpython-312-x86_64-linux-gnu.so", "type": "file" }, { - "bom-ref": "415763e712efd6ce", + "bom-ref": "d6b320544e75f8bc", "name": "/usr/lib/python3/dist-packages/yaml/composer.py", "type": "file" }, { - "bom-ref": "8ef75f21fa423f72", + "bom-ref": "d6e6aa9d0b19d030", "name": "/usr/lib/python3/dist-packages/yaml/constructor.py", "type": "file" }, { - "bom-ref": "676a7ef3fc3ad836", + "bom-ref": "00c6f7f76a2078c4", "name": "/usr/lib/python3/dist-packages/yaml/cyaml.py", "type": "file" }, { - "bom-ref": "7aa12655983ecaea", + "bom-ref": "0192cfc5d638b0a8", "name": "/usr/lib/python3/dist-packages/yaml/dumper.py", "type": "file" }, { - "bom-ref": "0becd1c8ab08bb30", + "bom-ref": "59b7b90e335f274e", "name": "/usr/lib/python3/dist-packages/yaml/emitter.py", "type": "file" }, { - "bom-ref": "d907785b101b197b", + "bom-ref": "12bcaf6312d02e45", "name": "/usr/lib/python3/dist-packages/yaml/error.py", "type": "file" }, { - "bom-ref": "4305acb2f3b272c8", + "bom-ref": "ecac5ae308b43b46", "name": "/usr/lib/python3/dist-packages/yaml/events.py", "type": "file" }, { - "bom-ref": "1225a8d89e3833c4", + "bom-ref": "9f9ff5ba1ae82362", "name": "/usr/lib/python3/dist-packages/yaml/loader.py", "type": "file" }, { - "bom-ref": "f7299b6b8b6abd77", + "bom-ref": "5a8c85113b3e304d", "name": "/usr/lib/python3/dist-packages/yaml/nodes.py", "type": "file" }, { - "bom-ref": "e33b26f3d4a98a4e", + "bom-ref": "37e5eea16976f084", "name": "/usr/lib/python3/dist-packages/yaml/parser.py", "type": "file" }, { - "bom-ref": "36193fe93ab2015a", + "bom-ref": "1fd4b67c969d780c", "name": "/usr/lib/python3/dist-packages/yaml/reader.py", "type": "file" }, { - "bom-ref": "5cdda2642ca3f180", + "bom-ref": "7da26c80d5e41252", "name": "/usr/lib/python3/dist-packages/yaml/representer.py", "type": "file" }, { - "bom-ref": "34b0fc0ba3ba4f91", + "bom-ref": "3a3b27d301cd7a6f", "name": "/usr/lib/python3/dist-packages/yaml/resolver.py", "type": "file" }, { - "bom-ref": "39cdf4cae392da97", + "bom-ref": "c14a03b437a76cb1", "name": "/usr/lib/python3/dist-packages/yaml/scanner.py", "type": "file" }, { - "bom-ref": "042b4f2adff60eff", + "bom-ref": "8bab53de0be145e5", "name": "/usr/lib/python3/dist-packages/yaml/serializer.py", "type": "file" }, { - "bom-ref": "ab4b8bea90afc315", + "bom-ref": "e75a8f371a3f0133", "name": "/usr/lib/python3/dist-packages/yaml/tokens.py", "type": "file" }, { - "bom-ref": "1e379d1cb8d9f312", + "bom-ref": "87312b0207cdcf88", "name": "/usr/lib/ssl/misc/CA.pl", "type": "file" }, { - "bom-ref": "9cd98fc4a18f8998", + "bom-ref": "bbb19cdeb607419a", "name": "/usr/lib/ssl/misc/tsget.pl", "type": "file" }, { - "bom-ref": "55971145cb5f5a2c", + "bom-ref": "7bbc0b0ee1f18ba6", "name": "/usr/lib/sysctl.d/99-protect-links.conf", "type": "file" }, { - "bom-ref": "f5c7a11b497c91ff", + "bom-ref": "1dbee8121452ba79", "name": "/usr/lib/systemd/system/apt-daily-upgrade.service", "type": "file" }, { - "bom-ref": "7f0634f82c27c714", + "bom-ref": "75050d42ca6ace7a", "name": "/usr/lib/systemd/system/apt-daily-upgrade.timer", "type": "file" }, { - "bom-ref": "1ff860cec21e1be8", + "bom-ref": "c2f6bc3d63650a0a", "name": "/usr/lib/systemd/system/apt-daily.service", "type": "file" }, { - "bom-ref": "ad60f6a5f8c48da5", + "bom-ref": "a478334421b9c85f", "name": "/usr/lib/systemd/system/apt-daily.timer", "type": "file" }, { - "bom-ref": "2bf8ab9b1879c059", + "bom-ref": "646805aa13dafc73", "name": "/usr/lib/systemd/system/dpkg-db-backup.service", "type": "file" }, { - "bom-ref": "58b95ecae380c780", + "bom-ref": "b108f63cd84a8092", "name": "/usr/lib/systemd/system/dpkg-db-backup.timer", "type": "file" }, { - "bom-ref": "d0753bc38135af65", + "bom-ref": "eb2a1ed180b85593", "name": "/usr/lib/systemd/system/e2scrub@.service", "type": "file" }, { - "bom-ref": "8372dff58c810610", + "bom-ref": "3214696d8e364f4a", "name": "/usr/lib/systemd/system/e2scrub_all.service", "type": "file" }, { - "bom-ref": "40aa20ad2d909d19", + "bom-ref": "2696ec544054db27", "name": "/usr/lib/systemd/system/e2scrub_all.timer", "type": "file" }, { - "bom-ref": "56436d1e667566d8", + "bom-ref": "46c46be52a301bd6", "name": "/usr/lib/systemd/system/e2scrub_fail@.service", "type": "file" }, { - "bom-ref": "da87bd763bbaff41", + "bom-ref": "b75dff3018c8162b", "name": "/usr/lib/systemd/system/e2scrub_reap.service", "type": "file" }, { - "bom-ref": "fbda9e6a396f5e3c", + "bom-ref": "037950307952a6c2", "name": "/usr/lib/systemd/system/fstrim.service", "type": "file" }, { - "bom-ref": "889e5b6b94e6577e", + "bom-ref": "095d23e5c97d4fc4", "name": "/usr/lib/systemd/system/fstrim.timer", "type": "file" }, { - "bom-ref": "3ef87c796e447b84", + "bom-ref": "791f3a953157e98a", "name": "/usr/lib/systemd/system/motd-news.service", "type": "file" }, { - "bom-ref": "1eca572ad1c650b5", + "bom-ref": "4741682129ff7ca7", "name": "/usr/lib/systemd/system/motd-news.timer", "type": "file" }, { - "bom-ref": "5f340c74d97e8a82", + "bom-ref": "b6ed94b1255552d8", "name": "/usr/lib/systemd/system/pam_namespace.service", "type": "file" }, { - "bom-ref": "62bec39374091710", + "bom-ref": "6acca3eb33e29169", "name": "/usr/lib/systemd/user/dirmngr.service", "type": "file" }, { - "bom-ref": "75243ec4c651ac1c", + "bom-ref": "6ffbdba3c917b3b5", "name": "/usr/lib/systemd/user/dirmngr.socket", "type": "file" }, { - "bom-ref": "fed63094abe5ac12", + "bom-ref": "dc8fe334778080ef", "name": "/usr/lib/systemd/user/gpg-agent-browser.socket", "type": "file" }, { - "bom-ref": "e7b0d36fceadb50b", + "bom-ref": "f53eeab366173be2", "name": "/usr/lib/systemd/user/gpg-agent-extra.socket", "type": "file" }, { - "bom-ref": "b371d8165134577f", + "bom-ref": "9cd0e8bad7d85c5e", "name": "/usr/lib/systemd/user/gpg-agent-ssh.socket", "type": "file" }, { - "bom-ref": "fb1c8209a14f3aab", + "bom-ref": "52c105479941ea66", "name": "/usr/lib/systemd/user/gpg-agent.service", "type": "file" }, { - "bom-ref": "0db3c12575aa1d10", + "bom-ref": "94c51637f67d0445", "name": "/usr/lib/systemd/user/gpg-agent.socket", "type": "file" }, { - "bom-ref": "d33465735f6187d4", + "bom-ref": "44b43a38d1f846ed", "name": "/usr/lib/systemd/user/keyboxd.service", "type": "file" }, { - "bom-ref": "9f9ed381aa11307a", + "bom-ref": "5c4f39eb43c6ae13", "name": "/usr/lib/systemd/user/keyboxd.socket", "type": "file" }, { - "bom-ref": "edfc0c6f85a7bd49", + "bom-ref": "659fedc20da4d954", "name": "/usr/lib/systemd/user/ssh-agent.service", "type": "file" }, { - "bom-ref": "c21122ab90dca6d7", + "bom-ref": "d93c87b2edf0a121", "name": "/usr/lib/tmpfiles.d/libselinux1.conf", "type": "file" }, { - "bom-ref": "03c6af35f6afb776", + "bom-ref": "102fbd9b3f239abc", "name": "/usr/lib/tmpfiles.d/passwd.conf", "type": "file" }, { - "bom-ref": "d8e72dc9afad3875", + "bom-ref": "98613dab7ecb8de3", "name": "/usr/lib/udev/rules.d/96-e2scrub.rules", "type": "file" }, { - "bom-ref": "ab2821db18f95de1", + "bom-ref": "f35858865054ed47", "name": "/usr/lib/valgrind/ncurses.supp", "type": "file" }, { - "bom-ref": "ee0998bc66dffc19", + "bom-ref": "0311dccd844cae67", "name": "/usr/lib/valgrind/python3.supp", "type": "file" }, { - "bom-ref": "f499accc1a7dc135", + "bom-ref": "a6673b0ccc357037", "name": "/usr/lib/x86_64-linux-gnu/Mcrt1.o", "type": "file" }, { - "bom-ref": "c638fef9edca3ff6", + "bom-ref": "54a55e033559d434", "name": "/usr/lib/x86_64-linux-gnu/Scrt1.o", "type": "file" }, { - "bom-ref": "e00c0a0c2837b79e", + "bom-ref": "a55be5c4534184e0", "name": "/usr/lib/x86_64-linux-gnu/atlas/libblas.a", "type": "file" }, { - "bom-ref": "172acddd0a533eb1", + "bom-ref": "37fa7f03a8e51c0b", "name": "/usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3", "type": "file" }, { - "bom-ref": "363b872ebd39456f", + "bom-ref": "f25656d481f6c3e9", "name": "/usr/lib/x86_64-linux-gnu/atlas/liblapack.a", "type": "file" }, { - "bom-ref": "50c8045da26b496a", + "bom-ref": "70dcfa4460dd54a8", "name": "/usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3", "type": "file" }, { - "bom-ref": "5dd430b0a7b5e421", + "bom-ref": "d779c8095ee71107", "name": "/usr/lib/x86_64-linux-gnu/audit/sotruss-lib.so", "type": "file" }, { - "bom-ref": "0dbd55ece1def62d", + "bom-ref": "97ab78e48d5f1e33", "name": "/usr/lib/x86_64-linux-gnu/bfd-plugins/libdep.so", "type": "file" }, { - "bom-ref": "b51d0d9533b43eba", - "name": "/usr/lib/x86_64-linux-gnu/cmake/DBus1/DBus1Config.cmake", - "type": "file" - }, - { - "bom-ref": "734c800c83ff3dea", - "name": "/usr/lib/x86_64-linux-gnu/cmake/DBus1/DBus1ConfigVersion.cmake", - "type": "file" - }, - { - "bom-ref": "cf730ff438fdf7b8", + "bom-ref": "2b04c87357fe8d46", "name": "/usr/lib/x86_64-linux-gnu/cmake/Snappy/SnappyConfig.cmake", "type": "file" }, { - "bom-ref": "aa8a0403f0a376bf", + "bom-ref": "85d5bde9364b427d", "name": "/usr/lib/x86_64-linux-gnu/cmake/Snappy/SnappyConfigVersion.cmake", "type": "file" }, { - "bom-ref": "4da6103e6ffdc941", + "bom-ref": "70e6812fd34dbb77", "name": "/usr/lib/x86_64-linux-gnu/cmake/Snappy/SnappyTargets-relwithdebinfo.cmake", "type": "file" }, { - "bom-ref": "a5d29910809b5429", + "bom-ref": "4b88125ca232db87", "name": "/usr/lib/x86_64-linux-gnu/cmake/Snappy/SnappyTargets.cmake", "type": "file" }, { - "bom-ref": "9dd15dd9bdb97328", + "bom-ref": "f0caf5f7828866b6", "name": "/usr/lib/x86_64-linux-gnu/cmake/expat-2.6.1/expat-config-version.cmake", "type": "file" }, { - "bom-ref": "bb9b8e7c0a4af189", + "bom-ref": "e045672c8f162d2f", "name": "/usr/lib/x86_64-linux-gnu/cmake/expat-2.6.1/expat-config.cmake", "type": "file" }, { - "bom-ref": "8a2498872bbcb184", + "bom-ref": "3a08b0c21bb4c4e2", "name": "/usr/lib/x86_64-linux-gnu/cmake/expat-2.6.1/expat-noconfig.cmake", "type": "file" }, { - "bom-ref": "2810063e2dd1dd8e", + "bom-ref": "a079fa07c05484b4", "name": "/usr/lib/x86_64-linux-gnu/cmake/expat-2.6.1/expat.cmake", "type": "file" }, { - "bom-ref": "93cd794b9d766f56", + "bom-ref": "3cdf8980e2a717f8", "name": "/usr/lib/x86_64-linux-gnu/cmake/gflags/gflags-config-version.cmake", "type": "file" }, { - "bom-ref": "f4fc8a9afc3c9664", + "bom-ref": "d7f01b3d4e9af66a", "name": "/usr/lib/x86_64-linux-gnu/cmake/gflags/gflags-config.cmake", "type": "file" }, { - "bom-ref": "2dd4b028ca19aac9", + "bom-ref": "d1dd693bca6739b7", "name": "/usr/lib/x86_64-linux-gnu/cmake/gflags/gflags-nonamespace-targets-release.cmake", "type": "file" }, { - "bom-ref": "b5f1eb381844d5ff", + "bom-ref": "1b0bfa421c117459", "name": "/usr/lib/x86_64-linux-gnu/cmake/gflags/gflags-nonamespace-targets.cmake", "type": "file" }, { - "bom-ref": "68fbc791c500ef16", + "bom-ref": "d9f378136ed63da0", "name": "/usr/lib/x86_64-linux-gnu/cmake/gflags/gflags-targets-release.cmake", "type": "file" }, { - "bom-ref": "91db58b3a2103fe1", + "bom-ref": "2bbf2b864907c52f", "name": "/usr/lib/x86_64-linux-gnu/cmake/gflags/gflags-targets.cmake", "type": "file" }, { - "bom-ref": "4fca8f31ed188a82", + "bom-ref": "948b0e2f53dcd330", "name": "/usr/lib/x86_64-linux-gnu/cmake/glog/glog-config-version.cmake", "type": "file" }, { - "bom-ref": "a08114e621e98d20", + "bom-ref": "a46e0f507226b3da", "name": "/usr/lib/x86_64-linux-gnu/cmake/glog/glog-config.cmake", "type": "file" }, { - "bom-ref": "c3106a0486be4bb9", + "bom-ref": "839cbcb1a1b94d23", "name": "/usr/lib/x86_64-linux-gnu/cmake/glog/glog-modules.cmake", "type": "file" }, { - "bom-ref": "02b700fb74ed057b", + "bom-ref": "c3a3f32511fdc90d", "name": "/usr/lib/x86_64-linux-gnu/cmake/glog/glog-targets-release.cmake", "type": "file" }, { - "bom-ref": "5576c1113ee8293c", + "bom-ref": "012876f92a93b612", "name": "/usr/lib/x86_64-linux-gnu/cmake/glog/glog-targets.cmake", "type": "file" }, { - "bom-ref": "9dd04afb2ada754c", + "bom-ref": "9b972d7117b42772", "name": "/usr/lib/x86_64-linux-gnu/cmake/leveldb/leveldbConfig.cmake", "type": "file" }, { - "bom-ref": "f8c03da851eec26b", + "bom-ref": "a3dedad45873f1c9", "name": "/usr/lib/x86_64-linux-gnu/cmake/leveldb/leveldbConfigVersion.cmake", "type": "file" }, { - "bom-ref": "f8d215422047b392", + "bom-ref": "6518640196a46c78", "name": "/usr/lib/x86_64-linux-gnu/cmake/leveldb/leveldbTargets-none.cmake", "type": "file" }, { - "bom-ref": "defe161d3272e93f", + "bom-ref": "e9a11cd924e185a1", "name": "/usr/lib/x86_64-linux-gnu/cmake/leveldb/leveldbTargets.cmake", "type": "file" }, { - "bom-ref": "28797a7e8ce047fb", + "bom-ref": "4378c0470344c309", "name": "/usr/lib/x86_64-linux-gnu/cmake/norm/normConfig.cmake", "type": "file" }, { - "bom-ref": "fef6e06936678f2e", + "bom-ref": "97afd9508e311d84", "name": "/usr/lib/x86_64-linux-gnu/cmake/norm/normConfigVersion.cmake", "type": "file" }, { - "bom-ref": "c45dbb3f32d7dc69", + "bom-ref": "049dd33eadb23d27", "name": "/usr/lib/x86_64-linux-gnu/cmake/norm/normTargets-none.cmake", "type": "file" }, { - "bom-ref": "0078eede1a93ed9e", + "bom-ref": "0eb27d4030255b70", "name": "/usr/lib/x86_64-linux-gnu/cmake/norm/normTargets.cmake", "type": "file" }, { - "bom-ref": "49b1ac6d5998727c", + "bom-ref": "55a570c86336d24a", "name": "/usr/lib/x86_64-linux-gnu/cmake/zstd/zstdConfig.cmake", "type": "file" }, { - "bom-ref": "71fbc87bb73969af", + "bom-ref": "5f5b6b364ac26769", "name": "/usr/lib/x86_64-linux-gnu/cmake/zstd/zstdConfigVersion.cmake", "type": "file" }, { - "bom-ref": "878ace582a0c7cc4", + "bom-ref": "1c5bc9a2a4c294b6", "name": "/usr/lib/x86_64-linux-gnu/cmake/zstd/zstdTargets-none.cmake", "type": "file" }, { - "bom-ref": "6ebcc3fa2f4cb637", + "bom-ref": "ccaccd3f9a5b1e45", "name": "/usr/lib/x86_64-linux-gnu/cmake/zstd/zstdTargets.cmake", "type": "file" }, { - "bom-ref": "10e4a6c61d23eab2", + "bom-ref": "df6785beb8da9df0", "name": "/usr/lib/x86_64-linux-gnu/crt1.o", "type": "file" }, { - "bom-ref": "c9b24e5a07f26955", + "bom-ref": "999b1435c26a7d07", "name": "/usr/lib/x86_64-linux-gnu/crti.o", "type": "file" }, { - "bom-ref": "8afc82807bbdb2a4", + "bom-ref": "c58d82553208321a", "name": "/usr/lib/x86_64-linux-gnu/crtn.o", "type": "file" }, { - "bom-ref": "9704376630b871b2", - "name": "/usr/lib/x86_64-linux-gnu/dbus-1.0/include/dbus/dbus-arch-deps.h", - "type": "file" - }, - { - "bom-ref": "48207dc09fec60cf", + "bom-ref": "4379869dd4209bc9", "name": "/usr/lib/x86_64-linux-gnu/e2fsprogs/e2scrub_all_cron", "type": "file" }, { - "bom-ref": "c6fcba562ce997fb", + "bom-ref": "e5bb04dc3ad2f841", "name": "/usr/lib/x86_64-linux-gnu/e2fsprogs/e2scrub_fail", "type": "file" }, { - "bom-ref": "6c540f667f7db276", + "bom-ref": "f7477c6191178594", "name": "/usr/lib/x86_64-linux-gnu/engines-3/afalg.so", "type": "file" }, { - "bom-ref": "f5e7e755f5854331", + "bom-ref": "7a5c1b3a7ff4f27f", "name": "/usr/lib/x86_64-linux-gnu/engines-3/loader_attic.so", "type": "file" }, { - "bom-ref": "9d5d13fedcb820f0", + "bom-ref": "769a54fa9ab5a2f2", "name": "/usr/lib/x86_64-linux-gnu/engines-3/padlock.so", "type": "file" }, { - "bom-ref": "21e3f8fe830bdf80", + "bom-ref": "4583d7fa3c9ac2da", "name": "/usr/lib/x86_64-linux-gnu/gconv/ANSI_X3.110.so", "type": "file" }, { - "bom-ref": "9501d5d334b259a5", + "bom-ref": "6c98b9f60ef14fcf", "name": "/usr/lib/x86_64-linux-gnu/gconv/ARMSCII-8.so", "type": "file" }, { - "bom-ref": "3776a7e298d62f35", + "bom-ref": "85e4cb24bdc84a93", "name": "/usr/lib/x86_64-linux-gnu/gconv/ASMO_449.so", "type": "file" }, { - "bom-ref": "5e5b3078f55c08b1", + "bom-ref": "43d1d01d5207575f", "name": "/usr/lib/x86_64-linux-gnu/gconv/BIG5.so", "type": "file" }, { - "bom-ref": "b78d3e5e6116dcd5", + "bom-ref": "996ced93499334ab", "name": "/usr/lib/x86_64-linux-gnu/gconv/BIG5HKSCS.so", "type": "file" }, { - "bom-ref": "a3926ee2b65a4868", + "bom-ref": "beee6e7e2365406e", "name": "/usr/lib/x86_64-linux-gnu/gconv/BRF.so", "type": "file" }, { - "bom-ref": "49d69e434b37db08", + "bom-ref": "e384a6bec20105f6", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP10007.so", "type": "file" }, { - "bom-ref": "fb4f5c416621c4a0", + "bom-ref": "bea0dcdda0274b5e", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1125.so", "type": "file" }, { - "bom-ref": "bd46c381e1d2a830", + "bom-ref": "360dcff17d2be21a", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1250.so", "type": "file" }, { - "bom-ref": "5212abd35074ef16", + "bom-ref": "4e04a66d776f0a5c", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1251.so", "type": "file" }, { - "bom-ref": "f4b14a254d9b1f9f", + "bom-ref": "a4fbca8a9a845345", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1252.so", "type": "file" }, { - "bom-ref": "6291948eca4e6fad", + "bom-ref": "2e202e03e06add8b", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1253.so", "type": "file" }, { - "bom-ref": "aa83f82917355768", + "bom-ref": "202105624967eef2", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1254.so", "type": "file" }, { - "bom-ref": "0438d1092a757a5e", + "bom-ref": "817f571baadd3ae4", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1255.so", "type": "file" }, { - "bom-ref": "23c00f6c29c16702", + "bom-ref": "a62cb37d09757880", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1256.so", "type": "file" }, { - "bom-ref": "951118e6aa52930d", + "bom-ref": "84f73558a3788433", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1257.so", "type": "file" }, { - "bom-ref": "37671f089460b1a0", + "bom-ref": "d3fdb67dc2167e06", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP1258.so", "type": "file" }, { - "bom-ref": "fb30863954213989", + "bom-ref": "fcb956c6c496cf4f", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP737.so", "type": "file" }, { - "bom-ref": "92ece3dcd7ccf059", + "bom-ref": "fa4e001263ae68c7", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP770.so", "type": "file" }, { - "bom-ref": "f2348c0510901da7", + "bom-ref": "ceb285109fa89bcd", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP771.so", "type": "file" }, { - "bom-ref": "458f78f5112ee21b", + "bom-ref": "ed3dc2b8019d60cd", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP772.so", "type": "file" }, { - "bom-ref": "ddf734b79163db12", + "bom-ref": "96210b0b4d164680", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP773.so", "type": "file" }, { - "bom-ref": "4ffff647cf58d948", + "bom-ref": "c6e874d9708f4932", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP774.so", "type": "file" }, { - "bom-ref": "4612a42d82f99ecd", + "bom-ref": "0caaeae4432b3d67", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP775.so", "type": "file" }, { - "bom-ref": "8c8e43a50c3fc109", + "bom-ref": "99c8c6e5cd886077", "name": "/usr/lib/x86_64-linux-gnu/gconv/CP932.so", "type": "file" }, { - "bom-ref": "64b8a5298a68f145", + "bom-ref": "effdb9e075f564e7", "name": "/usr/lib/x86_64-linux-gnu/gconv/CSN_369103.so", "type": "file" }, { - "bom-ref": "57735d74220a88c0", + "bom-ref": "5702ed692d90ef2a", "name": "/usr/lib/x86_64-linux-gnu/gconv/CWI.so", "type": "file" }, { - "bom-ref": "077dda3be8b0ae08", + "bom-ref": "170c4435b980bd9a", "name": "/usr/lib/x86_64-linux-gnu/gconv/DEC-MCS.so", "type": "file" }, { - "bom-ref": "10e99b2ccd8d8836", + "bom-ref": "ec86b88123c62380", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-AT-DE-A.so", "type": "file" }, { - "bom-ref": "a8071fd5ddfeb584", + "bom-ref": "35dfb62bf04d5a86", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-AT-DE.so", "type": "file" }, { - "bom-ref": "90d71133fb3541db", + "bom-ref": "75053a4a72e170d5", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-CA-FR.so", "type": "file" }, { - "bom-ref": "02c9ac10b88addd5", + "bom-ref": "98346acd168af19f", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-DK-NO-A.so", "type": "file" }, { - "bom-ref": "2fedf4faefa3dc96", + "bom-ref": "cbc6ee1841272c84", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-DK-NO.so", "type": "file" }, { - "bom-ref": "b5557263972213f4", + "bom-ref": "65206e4bdc11c88a", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-ES-A.so", "type": "file" }, { - "bom-ref": "3e09449ff93f3ea6", + "bom-ref": "6e78dc978805a38c", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-ES-S.so", "type": "file" }, { - "bom-ref": "b108c5f4bcc5c0b8", + "bom-ref": "1897606cff797ba6", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-ES.so", "type": "file" }, { - "bom-ref": "d4056daeefdf7e56", + "bom-ref": "eab04d4c56e261f4", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-FI-SE-A.so", "type": "file" }, { - "bom-ref": "f373ae408323f71e", + "bom-ref": "cb8b28e4b56c3854", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-FI-SE.so", "type": "file" }, { - "bom-ref": "d613d534bf18f42a", + "bom-ref": "a4611eac0da660dc", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-FR.so", "type": "file" }, { - "bom-ref": "32c908704ac2aa63", + "bom-ref": "2cf613b5a7eb7815", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-IS-FRISS.so", "type": "file" }, { - "bom-ref": "2cca5fe83f3117c8", + "bom-ref": "4b60ad9126069b22", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-IT.so", "type": "file" }, { - "bom-ref": "34c87744f40487e4", + "bom-ref": "2b08c6f2dbf6d4b6", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-PT.so", "type": "file" }, { - "bom-ref": "9b429d1fe05d8677", + "bom-ref": "aff3fe86a72c9f65", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-UK.so", "type": "file" }, { - "bom-ref": "3329f8e903708100", + "bom-ref": "5ccd731e3e2322ea", "name": "/usr/lib/x86_64-linux-gnu/gconv/EBCDIC-US.so", "type": "file" }, { - "bom-ref": "955edc3d4776f468", + "bom-ref": "0165f1cf3517128e", "name": "/usr/lib/x86_64-linux-gnu/gconv/ECMA-CYRILLIC.so", "type": "file" }, { - "bom-ref": "9bebcfdbd551d0a7", + "bom-ref": "d5b9163df1509c91", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-CN.so", "type": "file" }, { - "bom-ref": "a72f288b09115cf3", + "bom-ref": "a7cde4d434444b25", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-JISX0213.so", "type": "file" }, { - "bom-ref": "e1229f26de93cea0", + "bom-ref": "63f58f4833cce606", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-JP-MS.so", "type": "file" }, { - "bom-ref": "a2298d9332de56d9", + "bom-ref": "ba15f5107644bf13", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-JP.so", "type": "file" }, { - "bom-ref": "171f7a19691e2cfa", + "bom-ref": "d8c50cbae2d65940", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-KR.so", "type": "file" }, { - "bom-ref": "5920b72f5f24ffda", + "bom-ref": "604d281e07fe4b08", "name": "/usr/lib/x86_64-linux-gnu/gconv/EUC-TW.so", "type": "file" }, { - "bom-ref": "30218310e644a7ae", + "bom-ref": "2dfea0e1bbe038dc", "name": "/usr/lib/x86_64-linux-gnu/gconv/GB18030.so", "type": "file" }, { - "bom-ref": "ca4e17d053088e32", + "bom-ref": "5952ef3ed9d1b714", "name": "/usr/lib/x86_64-linux-gnu/gconv/GBBIG5.so", "type": "file" }, { - "bom-ref": "7a38cf139d637238", + "bom-ref": "8115842ca32dc806", "name": "/usr/lib/x86_64-linux-gnu/gconv/GBGBK.so", "type": "file" }, { - "bom-ref": "f6784e83186bee82", + "bom-ref": "6e8d627c9296d9b0", "name": "/usr/lib/x86_64-linux-gnu/gconv/GBK.so", "type": "file" }, { - "bom-ref": "bc1b2d48f6616e49", + "bom-ref": "1cfd055cb8d971cb", "name": "/usr/lib/x86_64-linux-gnu/gconv/GEORGIAN-ACADEMY.so", "type": "file" }, { - "bom-ref": "435e46a97fbc8dbf", + "bom-ref": "412acbbeb9f2add9", "name": "/usr/lib/x86_64-linux-gnu/gconv/GEORGIAN-PS.so", "type": "file" }, { - "bom-ref": "e2e3a98f7507ab43", + "bom-ref": "8f6c4b614aa4a60d", "name": "/usr/lib/x86_64-linux-gnu/gconv/GOST_19768-74.so", "type": "file" }, { - "bom-ref": "0c60cc99ef6cbfbc", + "bom-ref": "a887be18d4e9a72a", "name": "/usr/lib/x86_64-linux-gnu/gconv/GREEK-CCITT.so", "type": "file" }, { - "bom-ref": "1d653f97a78cdafb", + "bom-ref": "e03ea5ad22039a91", "name": "/usr/lib/x86_64-linux-gnu/gconv/GREEK7-OLD.so", "type": "file" }, { - "bom-ref": "99aacd10a3757298", + "bom-ref": "a141d90151e0ba7e", "name": "/usr/lib/x86_64-linux-gnu/gconv/GREEK7.so", "type": "file" }, { - "bom-ref": "fde57c808bae0d3d", + "bom-ref": "6816c730e8ecc9af", "name": "/usr/lib/x86_64-linux-gnu/gconv/HP-GREEK8.so", "type": "file" }, { - "bom-ref": "62d0c6da211e8597", + "bom-ref": "5f41a36e54d61d45", "name": "/usr/lib/x86_64-linux-gnu/gconv/HP-ROMAN8.so", "type": "file" }, { - "bom-ref": "b616e176aa85c4fc", + "bom-ref": "0abc5990aca6216a", "name": "/usr/lib/x86_64-linux-gnu/gconv/HP-ROMAN9.so", "type": "file" }, { - "bom-ref": "7adf555e1e302554", + "bom-ref": "c424efc46e97b17e", "name": "/usr/lib/x86_64-linux-gnu/gconv/HP-THAI8.so", "type": "file" }, { - "bom-ref": "42230a4d41e5397e", + "bom-ref": "dbc19d4132147cf0", "name": "/usr/lib/x86_64-linux-gnu/gconv/HP-TURKISH8.so", "type": "file" }, { - "bom-ref": "e6c9fe3925b42abd", + "bom-ref": "32e2884b09d19437", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM037.so", "type": "file" }, { - "bom-ref": "95a68462a5bc4126", + "bom-ref": "f87ec520b07bfcbc", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM038.so", "type": "file" }, { - "bom-ref": "793b6a9c0a3b9e85", + "bom-ref": "54de0fd1c8b5601b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1004.so", "type": "file" }, { - "bom-ref": "b0868da21a796281", + "bom-ref": "5cd650a05d31d01f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1008.so", "type": "file" }, { - "bom-ref": "3bf8f5e0cf25d25c", + "bom-ref": "efb5171c2cde70d2", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1008_420.so", "type": "file" }, { - "bom-ref": "da7753b7bae1788a", + "bom-ref": "ec6d46595fdad9e8", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1025.so", "type": "file" }, { - "bom-ref": "0fc9363c992ed535", + "bom-ref": "743d27f7e9239f07", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1026.so", "type": "file" }, { - "bom-ref": "40db52336845e591", + "bom-ref": "3d28c4330b9ab783", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1046.so", "type": "file" }, { - "bom-ref": "c1543e1e6686ce78", + "bom-ref": "d6b8fabc225d825e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1047.so", "type": "file" }, { - "bom-ref": "dbef4db5562009ce", + "bom-ref": "6e3abf3b6284ca00", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1097.so", "type": "file" }, { - "bom-ref": "cc6ceae95a755c16", + "bom-ref": "861af7686a8dc9d4", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1112.so", "type": "file" }, { - "bom-ref": "2a81e36ec891d0a9", + "bom-ref": "7542aa3274e0f57f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1122.so", "type": "file" }, { - "bom-ref": "e40b278a123a90a4", + "bom-ref": "e89aba43902721ae", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1123.so", "type": "file" }, { - "bom-ref": "3b34fb79305667af", + "bom-ref": "e1404c5176ef77e9", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1124.so", "type": "file" }, { - "bom-ref": "3963aaabd0f0325f", + "bom-ref": "9d02a926fa7d5825", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1129.so", "type": "file" }, { - "bom-ref": "6421764fb0e65adb", + "bom-ref": "913c3b08a947b059", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1130.so", "type": "file" }, { - "bom-ref": "c0e6730a034b6d6b", + "bom-ref": "2f01b9cc3b1789e1", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1132.so", "type": "file" }, { - "bom-ref": "c37d21f9ef57620b", + "bom-ref": "958b34942d853e95", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1133.so", "type": "file" }, { - "bom-ref": "de379ccd54dc9a98", + "bom-ref": "d6e298c7e98f74be", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1137.so", "type": "file" }, { - "bom-ref": "804aaaf1d2abce07", + "bom-ref": "c404b9610d9d4b2d", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1140.so", "type": "file" }, { - "bom-ref": "64bb2a0c18ee1db0", + "bom-ref": "a3ea191a3b06d8da", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1141.so", "type": "file" }, { - "bom-ref": "4afceb10d96e3617", + "bom-ref": "50403678e950cb51", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1142.so", "type": "file" }, { - "bom-ref": "92af2b14b7cb735c", + "bom-ref": "d6a236a19cf2fa2a", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1143.so", "type": "file" }, { - "bom-ref": "374ca73404d74f13", + "bom-ref": "baf707b91dea9399", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1144.so", "type": "file" }, { - "bom-ref": "fc7646dcd554be4d", + "bom-ref": "cddf7c3e1801fd8b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1145.so", "type": "file" }, { - "bom-ref": "7ec65b25c981d232", + "bom-ref": "54d63abc394ba390", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1146.so", "type": "file" }, { - "bom-ref": "b374157cae818d68", + "bom-ref": "cbf1320d2c9da6aa", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1147.so", "type": "file" }, { - "bom-ref": "da18cdfce7d381ed", + "bom-ref": "3a7e2fe89497366b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1148.so", "type": "file" }, { - "bom-ref": "b540b2e103142649", + "bom-ref": "3dbe078fae82e767", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1149.so", "type": "file" }, { - "bom-ref": "50fabfc268948c27", + "bom-ref": "fe66af4fa00d2545", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1153.so", "type": "file" }, { - "bom-ref": "7fd2e4ff4cf19ba9", + "bom-ref": "32b2b9fc2e43784b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1154.so", "type": "file" }, { - "bom-ref": "8dafc887b357aed2", + "bom-ref": "1d82b83f332da1d8", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1155.so", "type": "file" }, { - "bom-ref": "de9e2221a366b308", + "bom-ref": "9a09165841026c7a", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1156.so", "type": "file" }, { - "bom-ref": "63a3f11d1aa4c668", + "bom-ref": "e8733c2f7d9aba9a", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1157.so", "type": "file" }, { - "bom-ref": "6b01e3d87512dafb", + "bom-ref": "0dd2cad99fab2131", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1158.so", "type": "file" }, { - "bom-ref": "6adc349f180dacfb", + "bom-ref": "d1cff289ee59b5b5", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1160.so", "type": "file" }, { - "bom-ref": "5e76ab20fc6bdab9", + "bom-ref": "9d64eb148fef018b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1161.so", "type": "file" }, { - "bom-ref": "6137669469dd2d7c", + "bom-ref": "2fcd0a47b9aac2d2", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1162.so", "type": "file" }, { - "bom-ref": "395199121dd0fc52", + "bom-ref": "e0e82a60010b4c4c", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1163.so", "type": "file" }, { - "bom-ref": "02a32cb0a9223840", + "bom-ref": "f4604263c8e94d82", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1164.so", "type": "file" }, { - "bom-ref": "0c9d91446f1c3509", + "bom-ref": "43c8e238678d6fcb", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1166.so", "type": "file" }, { - "bom-ref": "0d9a0f2bdedb65d8", + "bom-ref": "7edd0beb49672096", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1167.so", "type": "file" }, { - "bom-ref": "819a8e8788d6b751", + "bom-ref": "6314c08ca063afdb", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM12712.so", "type": "file" }, { - "bom-ref": "76dc32f6eac194bb", + "bom-ref": "b9d56fc85b003191", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1364.so", "type": "file" }, { - "bom-ref": "2c81af0611919ffd", + "bom-ref": "ced1cb4a6df16953", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1371.so", "type": "file" }, { - "bom-ref": "d91343d7efa9ed21", + "bom-ref": "c684fbcb621b156b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1388.so", "type": "file" }, { - "bom-ref": "8e45839c51e859f8", + "bom-ref": "5c42dbd831b1570e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1390.so", "type": "file" }, { - "bom-ref": "85bbc01a170325c4", + "bom-ref": "f8783d343cb2664e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM1399.so", "type": "file" }, { - "bom-ref": "5f87e75fbcf6bb12", + "bom-ref": "e07139bb30717bdc", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM16804.so", "type": "file" }, { - "bom-ref": "f7566947078273c1", + "bom-ref": "c401abe8ff25bc5f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM256.so", "type": "file" }, { - "bom-ref": "296382a8372651ee", + "bom-ref": "127f1af9e02f0714", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM273.so", "type": "file" }, { - "bom-ref": "951dcdff9498ee0a", + "bom-ref": "ed4f2f746defe63c", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM274.so", "type": "file" }, { - "bom-ref": "3329ef80bca2a02f", + "bom-ref": "6e868dd8bf88fddd", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM275.so", "type": "file" }, { - "bom-ref": "1ea85ff21cdc6b52", + "bom-ref": "ca886530356c4418", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM277.so", "type": "file" }, { - "bom-ref": "bf0ac7fd24a758e1", + "bom-ref": "800c7d108d8f508f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM278.so", "type": "file" }, { - "bom-ref": "b4bee2fa50404b1d", + "bom-ref": "e2d97208f533d207", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM280.so", "type": "file" }, { - "bom-ref": "7cfbb385d59618b9", + "bom-ref": "52923f1dae2b74cf", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM281.so", "type": "file" }, { - "bom-ref": "5c6f57476acbe3d8", + "bom-ref": "fa945b4d861106d2", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM284.so", "type": "file" }, { - "bom-ref": "f020e7c4d8953f4e", + "bom-ref": "1167e1e76d4f0da8", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM285.so", "type": "file" }, { - "bom-ref": "e426a0f75a87b00f", + "bom-ref": "e670f31a5151a981", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM290.so", "type": "file" }, { - "bom-ref": "b91a20707475c908", + "bom-ref": "811b4beb91cecd56", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM297.so", "type": "file" }, { - "bom-ref": "c6f9833184efa5ac", + "bom-ref": "23edd22485d2d4aa", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM420.so", "type": "file" }, { - "bom-ref": "4953376eff0d57d3", + "bom-ref": "14e6e52fb65bfb89", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM423.so", "type": "file" }, { - "bom-ref": "787b25af84fa677d", + "bom-ref": "4c68fb5537fd3d73", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM424.so", "type": "file" }, { - "bom-ref": "5b2cd4adf0fdc6d1", + "bom-ref": "5afdf77509ab6053", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM437.so", "type": "file" }, { - "bom-ref": "2704fdf7437ad3c7", + "bom-ref": "dae1ebe8204389fd", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM4517.so", "type": "file" }, { - "bom-ref": "be30df0f38056e9b", + "bom-ref": "bd3140cbd5b7eef1", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM4899.so", "type": "file" }, { - "bom-ref": "5bffea713933bf3e", + "bom-ref": "c47edbdb03554350", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM4909.so", "type": "file" }, { - "bom-ref": "433ba8cadc266081", + "bom-ref": "837c62ad83e5d2d3", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM4971.so", "type": "file" }, { - "bom-ref": "b37ad020fc75e180", + "bom-ref": "2fef5a8684b37676", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM500.so", "type": "file" }, { - "bom-ref": "0fa6e8176afc08c8", + "bom-ref": "d0b312e695b22236", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM5347.so", "type": "file" }, { - "bom-ref": "b14d5bf61928ef87", + "bom-ref": "e111aa0bf48d74e5", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM803.so", "type": "file" }, { - "bom-ref": "536dfaf8eff13a71", + "bom-ref": "0eafbd54d5aae3ff", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM850.so", "type": "file" }, { - "bom-ref": "54fe0f5edfc500ca", + "bom-ref": "7477dd4e37f11dd4", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM851.so", "type": "file" }, { - "bom-ref": "3d4fcf42db509751", + "bom-ref": "7aee494f7a5f2593", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM852.so", "type": "file" }, { - "bom-ref": "a3ec2724e899583e", + "bom-ref": "9d1b87ac1429b7ac", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM855.so", "type": "file" }, { - "bom-ref": "0b203b152e3bbefe", + "bom-ref": "d8ef4314fd85c510", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM856.so", "type": "file" }, { - "bom-ref": "2319b13a3827a508", + "bom-ref": "258a66235a498ee6", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM857.so", "type": "file" }, { - "bom-ref": "25b3521565222a0f", + "bom-ref": "6bf77f13894a7101", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM858.so", "type": "file" }, { - "bom-ref": "6f004eac641e2403", + "bom-ref": "a60a081dfd00e815", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM860.so", "type": "file" }, { - "bom-ref": "e0d14917c3d75bb0", + "bom-ref": "c9347d48ecd513ee", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM861.so", "type": "file" }, { - "bom-ref": "0e4febf646d0461d", + "bom-ref": "65af86561085025f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM862.so", "type": "file" }, { - "bom-ref": "4f8974aa5b4ffdf8", + "bom-ref": "61a9dd058467a8f6", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM863.so", "type": "file" }, { - "bom-ref": "2d8d8e2c1168e49e", + "bom-ref": "505ad471f080a4b8", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM864.so", "type": "file" }, { - "bom-ref": "3715c31fa7d22a39", + "bom-ref": "9f8731d5c05c4907", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM865.so", "type": "file" }, { - "bom-ref": "a2a0da44bad8186b", + "bom-ref": "4106cd1b6faba925", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM866.so", "type": "file" }, { - "bom-ref": "869bd5186068e246", + "bom-ref": "5118cd9be79c4164", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM866NAV.so", "type": "file" }, { - "bom-ref": "5ad9518b2bb1e2f2", + "bom-ref": "b8a0f25e93a0f3e8", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM868.so", "type": "file" }, { - "bom-ref": "fcf86e9bcd42089c", + "bom-ref": "d6481aa82b2870d6", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM869.so", "type": "file" }, { - "bom-ref": "9b4dc11440c75405", + "bom-ref": "7f781ecb67243d93", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM870.so", "type": "file" }, { - "bom-ref": "ad4ce7f56bc15e0a", + "bom-ref": "af6f851672431978", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM871.so", "type": "file" }, { - "bom-ref": "531a988611eabcc9", + "bom-ref": "51f0a22b7b7f6093", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM874.so", "type": "file" }, { - "bom-ref": "2f43b791a63f2bca", + "bom-ref": "8ee668f8de6500a8", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM875.so", "type": "file" }, { - "bom-ref": "f72a0e215ec2e34b", + "bom-ref": "b62c05105f3f5111", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM880.so", "type": "file" }, { - "bom-ref": "c7fb8a3009a9ac0c", + "bom-ref": "223a187fcf20fd92", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM891.so", "type": "file" }, { - "bom-ref": "60fbc5c048cda52e", + "bom-ref": "23101e917c09c114", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM901.so", "type": "file" }, { - "bom-ref": "8250427ef77fcdb7", + "bom-ref": "9b449e911a9b49d1", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM902.so", "type": "file" }, { - "bom-ref": "efa68774d34b6f14", + "bom-ref": "4372d9ddcabb4b8e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM903.so", "type": "file" }, { - "bom-ref": "fa1233b25b0d131d", + "bom-ref": "6268f2718212708f", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM9030.so", "type": "file" }, { - "bom-ref": "31fadeba0ac2e334", + "bom-ref": "9eacb20267a8bb4e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM904.so", "type": "file" }, { - "bom-ref": "6e8906029236db69", + "bom-ref": "a3f22c67be2767eb", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM905.so", "type": "file" }, { - "bom-ref": "68720bf15305de55", + "bom-ref": "07a871a046f8fe5b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM9066.so", "type": "file" }, { - "bom-ref": "1b860ec482b4276d", + "bom-ref": "782e687022aaa6a3", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM918.so", "type": "file" }, { - "bom-ref": "e450dfb21022b0e8", + "bom-ref": "f3f18083dd189f22", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM921.so", "type": "file" }, { - "bom-ref": "352add9faef7d5ee", + "bom-ref": "d235315f3aac7b14", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM922.so", "type": "file" }, { - "bom-ref": "ff02e1f25f61a1c5", + "bom-ref": "5a6e8d6dce6b732b", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM930.so", "type": "file" }, { - "bom-ref": "61101ee75598da22", + "bom-ref": "9e9e76a17b1c84f0", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM932.so", "type": "file" }, { - "bom-ref": "ea10d32dae860157", + "bom-ref": "ffad4f74c1b4a9b5", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM933.so", "type": "file" }, { - "bom-ref": "08d932e689e123e5", + "bom-ref": "a9c8d98a2fb8d3b3", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM935.so", "type": "file" }, { - "bom-ref": "cd400711c21bc04c", + "bom-ref": "806b9b9c254085d2", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM937.so", "type": "file" }, { - "bom-ref": "0b25ec4b8b4a9c47", + "bom-ref": "e4eec88da97d02bd", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM939.so", "type": "file" }, { - "bom-ref": "c624be0bd4819f05", + "bom-ref": "7bc13f363d4520fb", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM943.so", "type": "file" }, { - "bom-ref": "4f244ee94c5a401b", + "bom-ref": "af32a796e3c5f9c9", "name": "/usr/lib/x86_64-linux-gnu/gconv/IBM9448.so", "type": "file" }, { - "bom-ref": "b05c2755195978d4", + "bom-ref": "0ed220ebf1cbf18e", "name": "/usr/lib/x86_64-linux-gnu/gconv/IEC_P27-1.so", "type": "file" }, { - "bom-ref": "3e657f89abe2dee4", + "bom-ref": "5bab4caf9d86cc32", "name": "/usr/lib/x86_64-linux-gnu/gconv/INIS-8.so", "type": "file" }, { - "bom-ref": "d9d5e5187d51a960", + "bom-ref": "ac3de96a5abdebca", "name": "/usr/lib/x86_64-linux-gnu/gconv/INIS-CYRILLIC.so", "type": "file" }, { - "bom-ref": "4c3012e54c3c9f40", + "bom-ref": "2e9e65a5153d621e", "name": "/usr/lib/x86_64-linux-gnu/gconv/INIS.so", "type": "file" }, { - "bom-ref": "2b7f428d6659b470", + "bom-ref": "cb92fcf8298af57e", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISIRI-3342.so", "type": "file" }, { - "bom-ref": "713ef8fed38f347f", + "bom-ref": "ed32dd8848abb079", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-2022-CN-EXT.so", "type": "file" }, { - "bom-ref": "8b108cc9e7bd2907", + "bom-ref": "7e857ae93d581d69", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-2022-CN.so", "type": "file" }, { - "bom-ref": "6aca477bcc67564b", + "bom-ref": "8c719e1976614171", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-2022-JP-3.so", "type": "file" }, { - "bom-ref": "a7de7df371baa4cf", + "bom-ref": "f2785672b6230a75", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-2022-JP.so", "type": "file" }, { - "bom-ref": "7829f517d6de87f2", + "bom-ref": "6a013bea5d3d1f60", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-2022-KR.so", "type": "file" }, { - "bom-ref": "815b7f118089546c", + "bom-ref": "66dc9adae58b4a0e", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-IR-197.so", "type": "file" }, { - "bom-ref": "8e25dc6432df695e", + "bom-ref": "ed37a7575a030a20", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO-IR-209.so", "type": "file" }, { - "bom-ref": "1fc5b910f441a7e6", + "bom-ref": "afe3cfe932ed89e8", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO646.so", "type": "file" }, { - "bom-ref": "0e8e0f4696f24a03", + "bom-ref": "02688276086d6565", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-1.so", "type": "file" }, { - "bom-ref": "2e5b0f43cf0094d7", + "bom-ref": "ee8ab0c2341ebd89", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-10.so", "type": "file" }, { - "bom-ref": "544f64d6b7b83f3b", + "bom-ref": "b12f845119736401", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-11.so", "type": "file" }, { - "bom-ref": "bba2fea1174cad60", + "bom-ref": "3babe4c71be7665a", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-13.so", "type": "file" }, { - "bom-ref": "54de48f1de912d47", + "bom-ref": "825890466c61c6a9", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-14.so", "type": "file" }, { - "bom-ref": "3d2f7a561b42371f", + "bom-ref": "1c258bfed29eef29", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-15.so", "type": "file" }, { - "bom-ref": "cfd181df2cebe788", + "bom-ref": "a11884ef68f07ffa", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-16.so", "type": "file" }, { - "bom-ref": "64445294859d852f", + "bom-ref": "7d3a336922287f35", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-2.so", "type": "file" }, { - "bom-ref": "b9236a55163f6041", + "bom-ref": "8cc3152d5d1fe26f", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-3.so", "type": "file" }, { - "bom-ref": "5f7c2e906cd88292", + "bom-ref": "d2587696324be260", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-4.so", "type": "file" }, { - "bom-ref": "ebe69a6f5be98483", + "bom-ref": "74f1ac21c442046d", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-5.so", "type": "file" }, { - "bom-ref": "642a9a5ddd531e05", + "bom-ref": "f73deb8b022d3cbb", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-6.so", "type": "file" }, { - "bom-ref": "24e17296fed6ad35", + "bom-ref": "70765a87088f642f", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-7.so", "type": "file" }, { - "bom-ref": "566daa5ba108a6cb", + "bom-ref": "8ac87e3a1b5d0dc9", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-8.so", "type": "file" }, { - "bom-ref": "5873bc24a0891b10", + "bom-ref": "6c556c078f95d67a", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-9.so", "type": "file" }, { - "bom-ref": "c2ec6d5e410f9d4d", + "bom-ref": "46464c5aab9345cf", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO8859-9E.so", "type": "file" }, { - "bom-ref": "64da9d626fb09c99", + "bom-ref": "a692f1ab1a685cab", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_10367-BOX.so", "type": "file" }, { - "bom-ref": "7d59d3b0e29c3c79", + "bom-ref": "b384ab9e4be4c1e7", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_11548-1.so", "type": "file" }, { - "bom-ref": "3359f4722ffd3242", + "bom-ref": "df1267b4440954c4", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_2033.so", "type": "file" }, { - "bom-ref": "ef186fdb02298481", + "bom-ref": "bb44d05386786c8b", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_5427-EXT.so", "type": "file" }, { - "bom-ref": "1d5e7317e9213664", + "bom-ref": "941f37bfcfa6bcae", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_5427.so", "type": "file" }, { - "bom-ref": "ab4bd8a71e9a9127", + "bom-ref": "9f89f25c2023ac5d", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_5428.so", "type": "file" }, { - "bom-ref": "2f02de2d11cbf56e", + "bom-ref": "af8cd6122f32c4fc", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_6937-2.so", "type": "file" }, { - "bom-ref": "04969639318ad8d8", + "bom-ref": "225f21660e5a1952", "name": "/usr/lib/x86_64-linux-gnu/gconv/ISO_6937.so", "type": "file" }, { - "bom-ref": "7ee0871432102d3e", + "bom-ref": "a97d40ce27907858", "name": "/usr/lib/x86_64-linux-gnu/gconv/JOHAB.so", "type": "file" }, { - "bom-ref": "0fe2fa785b139c50", + "bom-ref": "1af8d7dde7aa16da", "name": "/usr/lib/x86_64-linux-gnu/gconv/KOI-8.so", "type": "file" }, { - "bom-ref": "b346cadcb685de09", + "bom-ref": "4aec3383fc8a47a7", "name": "/usr/lib/x86_64-linux-gnu/gconv/KOI8-R.so", "type": "file" }, { - "bom-ref": "1a4ff2bc06212795", + "bom-ref": "8fea4661625b66ab", "name": "/usr/lib/x86_64-linux-gnu/gconv/KOI8-RU.so", "type": "file" }, { - "bom-ref": "661decb7c3842699", + "bom-ref": "f7b92bb4e55bf47f", "name": "/usr/lib/x86_64-linux-gnu/gconv/KOI8-T.so", "type": "file" }, { - "bom-ref": "706eb1ae9bc2c19b", + "bom-ref": "c9cca1a97043dffd", "name": "/usr/lib/x86_64-linux-gnu/gconv/KOI8-U.so", "type": "file" }, { - "bom-ref": "185254e556ae20ba", + "bom-ref": "b87f9d21696568d0", "name": "/usr/lib/x86_64-linux-gnu/gconv/LATIN-GREEK-1.so", "type": "file" }, { - "bom-ref": "4f1235667bd46c4d", + "bom-ref": "cf8baa283ff281bf", "name": "/usr/lib/x86_64-linux-gnu/gconv/LATIN-GREEK.so", "type": "file" }, { - "bom-ref": "7fd564d3102ec9ff", + "bom-ref": "d8455672e3131c6d", "name": "/usr/lib/x86_64-linux-gnu/gconv/MAC-CENTRALEUROPE.so", "type": "file" }, { - "bom-ref": "bdc324e2f73279e6", + "bom-ref": "a6eeb90da659c274", "name": "/usr/lib/x86_64-linux-gnu/gconv/MAC-IS.so", "type": "file" }, { - "bom-ref": "9782643c2dc1bf9d", + "bom-ref": "d1054fbe781f96b7", "name": "/usr/lib/x86_64-linux-gnu/gconv/MAC-SAMI.so", "type": "file" }, { - "bom-ref": "1813dd5f7df06d52", + "bom-ref": "20470615cc996ad4", "name": "/usr/lib/x86_64-linux-gnu/gconv/MAC-UK.so", "type": "file" }, { - "bom-ref": "72770f20f55fbf03", + "bom-ref": "3a9c8eeb494852b9", "name": "/usr/lib/x86_64-linux-gnu/gconv/MACINTOSH.so", "type": "file" }, { - "bom-ref": "4686fb028034bc6e", + "bom-ref": "892858497e1aede8", "name": "/usr/lib/x86_64-linux-gnu/gconv/MIK.so", "type": "file" }, { - "bom-ref": "3ca438f289735810", + "bom-ref": "f8850d821fc1db6a", "name": "/usr/lib/x86_64-linux-gnu/gconv/NATS-DANO.so", "type": "file" }, { - "bom-ref": "5523708df513049c", + "bom-ref": "4a316063f5893a4a", "name": "/usr/lib/x86_64-linux-gnu/gconv/NATS-SEFI.so", "type": "file" }, { - "bom-ref": "e833c49f1a820922", + "bom-ref": "7c8b3875a0a01294", "name": "/usr/lib/x86_64-linux-gnu/gconv/PT154.so", "type": "file" }, { - "bom-ref": "432c5188769a3b89", + "bom-ref": "601fa2c6dc4641d3", "name": "/usr/lib/x86_64-linux-gnu/gconv/RK1048.so", "type": "file" }, { - "bom-ref": "f428c554ab2610ae", + "bom-ref": "fb40e172b8298044", "name": "/usr/lib/x86_64-linux-gnu/gconv/SAMI-WS2.so", "type": "file" }, { - "bom-ref": "777ed4ae50b342ed", + "bom-ref": "57a756ba4f61455b", "name": "/usr/lib/x86_64-linux-gnu/gconv/SHIFT_JISX0213.so", "type": "file" }, { - "bom-ref": "27d0eb79cbf52d8b", + "bom-ref": "bac66a2c1917498d", "name": "/usr/lib/x86_64-linux-gnu/gconv/SJIS.so", "type": "file" }, { - "bom-ref": "c5e3001b251f51a1", + "bom-ref": "f9c97a1f7545987b", "name": "/usr/lib/x86_64-linux-gnu/gconv/T.61.so", "type": "file" }, { - "bom-ref": "3b6db04e05ff0c1a", + "bom-ref": "9858453347959ff0", "name": "/usr/lib/x86_64-linux-gnu/gconv/TCVN5712-1.so", "type": "file" }, { - "bom-ref": "f64451ffbf4dc961", + "bom-ref": "6d67f9e4f79bd903", "name": "/usr/lib/x86_64-linux-gnu/gconv/TIS-620.so", "type": "file" }, { - "bom-ref": "04470a793d7c7c43", + "bom-ref": "82f781064c53dd79", "name": "/usr/lib/x86_64-linux-gnu/gconv/TSCII.so", "type": "file" }, { - "bom-ref": "d9913dfebb8b71bc", + "bom-ref": "4c6e79380c9ee8ea", "name": "/usr/lib/x86_64-linux-gnu/gconv/UHC.so", "type": "file" }, { - "bom-ref": "3b82bbb4f7134afc", + "bom-ref": "b74e039490e8b442", "name": "/usr/lib/x86_64-linux-gnu/gconv/UNICODE.so", "type": "file" }, { - "bom-ref": "c05d0bb9a9ff2fed", + "bom-ref": "a8e89899b96876df", "name": "/usr/lib/x86_64-linux-gnu/gconv/UTF-16.so", "type": "file" }, { - "bom-ref": "3d094dd6e702e40e", + "bom-ref": "fcd22b87291f5d30", "name": "/usr/lib/x86_64-linux-gnu/gconv/UTF-32.so", "type": "file" }, { - "bom-ref": "c1ba7674ab181d11", + "bom-ref": "454cb4cc56c1ea57", "name": "/usr/lib/x86_64-linux-gnu/gconv/UTF-7.so", "type": "file" }, { - "bom-ref": "d952f2a723a72a62", + "bom-ref": "ef7531ff998fe490", "name": "/usr/lib/x86_64-linux-gnu/gconv/VISCII.so", "type": "file" }, { - "bom-ref": "4df1046a7230559e", + "bom-ref": "c4c9bd41f80f4370", "name": "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules", "type": "file" }, { - "bom-ref": "c3d478146d475f55", + "bom-ref": "0eb8d15f30d0da83", "name": "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", "type": "file" }, { - "bom-ref": "9b4db8820274c64c", + "bom-ref": "c9bdefb458bd3a12", "name": "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.d/gconv-modules-extra.conf", "type": "file" }, { - "bom-ref": "7f7d51ad336ec7a8", + "bom-ref": "1f5e352679076396", "name": "/usr/lib/x86_64-linux-gnu/gconv/libCNS.so", "type": "file" }, { - "bom-ref": "94d7e5933cd639b2", + "bom-ref": "fcefb56369c81748", "name": "/usr/lib/x86_64-linux-gnu/gconv/libGB.so", "type": "file" }, { - "bom-ref": "170b9fadadffc8fd", + "bom-ref": "a7da636823e0651b", "name": "/usr/lib/x86_64-linux-gnu/gconv/libISOIR165.so", "type": "file" }, { - "bom-ref": "8d9bc84db9c625bc", + "bom-ref": "54db4917d5ab7242", "name": "/usr/lib/x86_64-linux-gnu/gconv/libJIS.so", "type": "file" }, { - "bom-ref": "8884bda5d691a003", + "bom-ref": "9539dbdade9a5e31", "name": "/usr/lib/x86_64-linux-gnu/gconv/libJISX0213.so", "type": "file" }, { - "bom-ref": "cb872e3d08535a89", + "bom-ref": "5978953991dd9e7f", "name": "/usr/lib/x86_64-linux-gnu/gconv/libKSC.so", "type": "file" }, { - "bom-ref": "21ab8b834663d3ea", + "bom-ref": "31ef8d048201d9c4", "name": "/usr/lib/x86_64-linux-gnu/gcrt1.o", "type": "file" }, { - "bom-ref": "a02fafc331f5447f", + "bom-ref": "013cd882e83181c6", "name": "/usr/lib/x86_64-linux-gnu/glib-2.0/gio-launch-desktop", "type": "file" }, { - "bom-ref": "c8b6de4a11c85dd9", + "bom-ref": "226b41dc2e531f98", "name": "/usr/lib/x86_64-linux-gnu/glib-2.0/gio-querymodules", "type": "file" }, { - "bom-ref": "e342978cba1cd031", + "bom-ref": "3fe813ec456a80b8", "name": "/usr/lib/x86_64-linux-gnu/glib-2.0/glib-compile-schemas", "type": "file" }, { - "bom-ref": "8b50935c12ac6299", + "bom-ref": "56d7256f4c94434b", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-collector.so", "type": "file" }, { - "bom-ref": "e9bf9103f7a65959", + "bom-ref": "a864a4e8100fe54f", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-collectorAPI.a", "type": "file" }, { - "bom-ref": "24f24e627cafceac", + "bom-ref": "59766c46694fbdea", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-collectorAPI.so", "type": "file" }, { - "bom-ref": "e2b6bf8048beec40", + "bom-ref": "88e24dbe4c748842", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-heap.so", "type": "file" }, { - "bom-ref": "e166b83c3c34a18e", + "bom-ref": "592bb587009f9f3c", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-iotrace.so", "type": "file" }, { - "bom-ref": "b61b2f273baf00e8", + "bom-ref": "644ed4e0be3017da", "name": "/usr/lib/x86_64-linux-gnu/gprofng/libgp-sync.so", "type": "file" }, { - "bom-ref": "a226da137ed7fe22", + "bom-ref": "eb01b8bbc02859b0", "name": "/usr/lib/x86_64-linux-gnu/graphviz/libgvplugin_core.so.6.0.0", "type": "file" }, { - "bom-ref": "131065be3612a431", + "bom-ref": "e8d52fea9bc53f07", "name": "/usr/lib/x86_64-linux-gnu/graphviz/libgvplugin_dot_layout.so.6.0.0", "type": "file" }, { - "bom-ref": "b293694d61afb9a9", + "bom-ref": "a905334c565b598f", "name": "/usr/lib/x86_64-linux-gnu/graphviz/libgvplugin_gd.so.6.0.0", "type": "file" }, { - "bom-ref": "ffaa4645a47f72b0", + "bom-ref": "28a593d1a0a478b6", "name": "/usr/lib/x86_64-linux-gnu/graphviz/libgvplugin_neato_layout.so.6.0.0", "type": "file" }, { - "bom-ref": "c5382dbea79f2b84", + "bom-ref": "c30c89f0611e0dae", "name": "/usr/lib/x86_64-linux-gnu/graphviz/libgvplugin_pango.so.6.0.0", "type": "file" }, { - "bom-ref": "4fed22e5cdeb8737", + "bom-ref": "4526685d2191b609", "name": "/usr/lib/x86_64-linux-gnu/graphviz/libgvplugin_visio.so.6.0.0", "type": "file" }, { - "bom-ref": "6efd39adc06d1e93", + "bom-ref": "ef2d27a2f5bfe381", "name": "/usr/lib/x86_64-linux-gnu/graphviz/libgvplugin_webp.so.6.0.0", "type": "file" }, { - "bom-ref": "dd278dd23bc55062", + "bom-ref": "c4454da12e67ee58", "name": "/usr/lib/x86_64-linux-gnu/graphviz/libgvplugin_xlib.so.6.0.0", "type": "file" }, { - "bom-ref": "e4b67a6181c4df7a", + "bom-ref": "2a859f6083178944", "name": "/usr/lib/x86_64-linux-gnu/grcrt1.o", "type": "file" }, { - "bom-ref": "bf734c61e311ac71", + "bom-ref": "edd0299547d24297", "name": "/usr/lib/x86_64-linux-gnu/icu/74.2/Makefile.inc", "type": "file" }, { - "bom-ref": "741b02f512b87cec", + "bom-ref": "08c2bf0ae8ec69b2", "name": "/usr/lib/x86_64-linux-gnu/icu/74.2/pkgdata.inc", "type": "file" }, { - "bom-ref": "3356952106e88076", + "bom-ref": "5ba7b43cee0e0cf5", "name": "/usr/lib/x86_64-linux-gnu/krb5/plugins/preauth/spake.so", "type": "file" }, { - "bom-ref": "4e1fd3963c50393f", + "bom-ref": "3ed80925aeb3bbc5", "name": "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2", "type": "file" }, { - "bom-ref": "67ced5ca7e37e4d0", + "bom-ref": "426830cd5b1b4646", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.x", "type": "file" }, { - "bom-ref": "8931e784a1799491", + "bom-ref": "cf81aa31cc02205b", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xbn", "type": "file" }, { - "bom-ref": "3d5fce97ee865dd9", + "bom-ref": "838779d404fb7b5f", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xc", "type": "file" }, { - "bom-ref": "27df288560d43079", + "bom-ref": "a4f3ec4d03826d3f", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xce", "type": "file" }, { - "bom-ref": "11f24561a86c3587", + "bom-ref": "5f59ead90e5c3115", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xd", "type": "file" }, { - "bom-ref": "296c5327f8cba6b7", + "bom-ref": "0f03440faf3ad7fd", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xdc", "type": "file" }, { - "bom-ref": "cbc0a4477d6e374a", + "bom-ref": "c6f1ba5073119294", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xdce", "type": "file" }, { - "bom-ref": "87ef2eb011798e4b", + "bom-ref": "3ec48a6b962fe70d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xde", "type": "file" }, { - "bom-ref": "e016ff7c8004b799", + "bom-ref": "60aeae3f45043d4f", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xdw", "type": "file" }, { - "bom-ref": "ab8cafbdf6b1769b", + "bom-ref": "a5f1e256e266eb7d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xdwe", "type": "file" }, { - "bom-ref": "32831b741a5abdc1", + "bom-ref": "34d9c77ad6a58f7f", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xe", "type": "file" }, { - "bom-ref": "1c640d185eac43e6", + "bom-ref": "4c77abbc23755408", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xn", "type": "file" }, { - "bom-ref": "d1732d89147beefe", + "bom-ref": "d48bac8a94cf1dd8", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xr", "type": "file" }, { - "bom-ref": "b4864c3ad581df37", + "bom-ref": "fecdd1fba5b75ef5", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xs", "type": "file" }, { - "bom-ref": "bf377dc9104d5129", + "bom-ref": "84c8de04c8f39d43", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xsc", "type": "file" }, { - "bom-ref": "2ec3e22a19011be4", + "bom-ref": "7bb6aeb66bff03c6", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xsce", "type": "file" }, { - "bom-ref": "2516b7a0b47b4e79", + "bom-ref": "89431a3964bbd547", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xse", "type": "file" }, { - "bom-ref": "10d92ffd068756d7", + "bom-ref": "b8ac7df69d4a7d11", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xsw", "type": "file" }, { - "bom-ref": "943a20648d7ab006", + "bom-ref": "a15d7a77cd002c34", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xswe", "type": "file" }, { - "bom-ref": "a7dea79e176f36f3", + "bom-ref": "71a244a594e3f28d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xu", "type": "file" }, { - "bom-ref": "96f22856560d5624", + "bom-ref": "b15deaa58a3d01ce", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xw", "type": "file" }, { - "bom-ref": "a806c995409d036d", + "bom-ref": "3a820e7eef0f47c7", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.xwe", "type": "file" }, { - "bom-ref": "921f67a1d7f2e8fe", + "bom-ref": "4673bed8660eda20", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.x", "type": "file" }, { - "bom-ref": "361d87319b450606", + "bom-ref": "6ae7f23909e053fc", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xbn", "type": "file" }, { - "bom-ref": "f373b3b5b4d93297", + "bom-ref": "5eb00fc557081161", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xc", "type": "file" }, { - "bom-ref": "e54e44d62f56ea5d", + "bom-ref": "269f1e498b9e8343", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xce", "type": "file" }, { - "bom-ref": "7d6dab370a2e6a58", + "bom-ref": "5968219a3189ebca", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xd", "type": "file" }, { - "bom-ref": "be39669d666ac4f4", + "bom-ref": "057d84020953b27a", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xdc", "type": "file" }, { - "bom-ref": "2a9941e8bd0903ae", + "bom-ref": "7bb546e9ad1ad0cc", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xdce", "type": "file" }, { - "bom-ref": "e9b1d3f14e5a45e9", + "bom-ref": "0b3ca6e6fca8700b", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xde", "type": "file" }, { - "bom-ref": "de73faae08231c62", + "bom-ref": "3f217c6cc1c1848c", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xdw", "type": "file" }, { - "bom-ref": "ad134baaeec8896c", + "bom-ref": "f91688e5fd8005b2", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xdwe", "type": "file" }, { - "bom-ref": "b54448e639d93906", + "bom-ref": "da0d516a40197748", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xe", "type": "file" }, { - "bom-ref": "5eab30ffcf8f1cba", + "bom-ref": "922f6142de5084d0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xn", "type": "file" }, { - "bom-ref": "06ceed58016a658f", + "bom-ref": "b4e76fd135f24499", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xr", "type": "file" }, { - "bom-ref": "e4f9e0a6a9599f65", + "bom-ref": "5b11275fd270848b", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xs", "type": "file" }, { - "bom-ref": "b5dc637d954db45d", + "bom-ref": "2ec83ab061273b6f", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xsc", "type": "file" }, { - "bom-ref": "e8834c9e7fd04794", + "bom-ref": "1c24bb5def7acd82", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xsce", "type": "file" }, { - "bom-ref": "3a54b93cc96d9f2f", + "bom-ref": "3dc08d1bb4c8e9a1", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xse", "type": "file" }, { - "bom-ref": "a24a2d2a79e2ff33", + "bom-ref": "21eabb98be0421f9", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xsw", "type": "file" }, { - "bom-ref": "4de0352c597f2c46", + "bom-ref": "7a8edafbd84172f0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xswe", "type": "file" }, { - "bom-ref": "3e7536d997d7f41e", + "bom-ref": "b7104c64d0acae64", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xu", "type": "file" }, { - "bom-ref": "e57a82977092c6d3", + "bom-ref": "7425a00c825567b9", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xw", "type": "file" }, { - "bom-ref": "95e88f511ae3d38b", + "bom-ref": "d95e5ac801adf699", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_i386.xwe", "type": "file" }, { - "bom-ref": "d53e544ff8456deb", + "bom-ref": "5ff83ee0c5400cc9", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.x", "type": "file" }, { - "bom-ref": "04d88b255156c807", + "bom-ref": "7af1366a31d2576d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xbn", "type": "file" }, { - "bom-ref": "cd10af5a6676d42f", + "bom-ref": "0a76437e19154311", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xc", "type": "file" }, { - "bom-ref": "b3c0f788ac088ee2", + "bom-ref": "5aca5675f41c1fb0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xce", "type": "file" }, { - "bom-ref": "8f88ca31b8b1cddd", + "bom-ref": "95de944f7475e9cb", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xd", "type": "file" }, { - "bom-ref": "2842dc279fb69fcf", + "bom-ref": "7c3819a404c8d795", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xdc", "type": "file" }, { - "bom-ref": "20104bd3abe6d5c8", + "bom-ref": "ce9db17f9530031e", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xdce", "type": "file" }, { - "bom-ref": "79f7af292183b126", + "bom-ref": "0514034b574a3e88", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xde", "type": "file" }, { - "bom-ref": "f00768344f260e67", + "bom-ref": "af1de8cd40d0f0a1", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xdw", "type": "file" }, { - "bom-ref": "98ac101c2dc06a16", + "bom-ref": "a9c2733c8566bdb0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xdwe", "type": "file" }, { - "bom-ref": "79a8ea53c880a839", + "bom-ref": "653fccd331f60c77", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xe", "type": "file" }, { - "bom-ref": "451128f1d9db16f7", + "bom-ref": "bbdb0086ce64b69d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xn", "type": "file" }, { - "bom-ref": "5b4d0980152b004b", + "bom-ref": "95136a7dff0de379", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xr", "type": "file" }, { - "bom-ref": "1dad21d3c73d3d79", + "bom-ref": "273fb2a7e765c22b", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xs", "type": "file" }, { - "bom-ref": "79883e0e74bcfef2", + "bom-ref": "3a0f0593cadd11d4", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xsc", "type": "file" }, { - "bom-ref": "660edf2a977ccaac", + "bom-ref": "25726a7e8894a836", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xsce", "type": "file" }, { - "bom-ref": "2a0de06a4c1052a0", + "bom-ref": "f23829a9fad45c16", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xse", "type": "file" }, { - "bom-ref": "1d20a628a6b94aa2", + "bom-ref": "9bb5c51db8fcb9e0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xsw", "type": "file" }, { - "bom-ref": "cb46a88b0db4bd6c", + "bom-ref": "2e834087565a55da", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xswe", "type": "file" }, { - "bom-ref": "81479e2b575fe8ab", + "bom-ref": "3074324e0388d0b1", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xu", "type": "file" }, { - "bom-ref": "7d1b70dd145203dc", + "bom-ref": "ccd47b4d7f6596e6", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xw", "type": "file" }, { - "bom-ref": "6d0e13dbe42bdd2f", + "bom-ref": "5feb0f36f2d84d35", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_iamcu.xwe", "type": "file" }, { - "bom-ref": "988b5350f6e7fc7f", + "bom-ref": "ffd25b816e0dadb9", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.x", "type": "file" }, { - "bom-ref": "023a09804af2f430", + "bom-ref": "07da7b24a89d4732", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xbn", "type": "file" }, { - "bom-ref": "69022fbb3c75831a", + "bom-ref": "9a1078622c0321d0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xc", "type": "file" }, { - "bom-ref": "8669c4afb344d9aa", + "bom-ref": "d7b49268c73af364", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xce", "type": "file" }, { - "bom-ref": "ec8de365f53b9fae", + "bom-ref": "971284aa1f9103a4", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xd", "type": "file" }, { - "bom-ref": "dc51bcb6e26a1138", + "bom-ref": "bf229dc685f9301e", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xdc", "type": "file" }, { - "bom-ref": "00ece294dbadd396", + "bom-ref": "2fd14b1c6dcdfb14", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xdce", "type": "file" }, { - "bom-ref": "92609879d5b0a803", + "bom-ref": "31238e6ef18f09ed", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xde", "type": "file" }, { - "bom-ref": "fd5d1b9c906efcac", + "bom-ref": "1be0698f71a3b9fa", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xdw", "type": "file" }, { - "bom-ref": "56d12a8ea5eeaffe", + "bom-ref": "5a49387ad1ae5484", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xdwe", "type": "file" }, { - "bom-ref": "7be6d3d70aee208b", + "bom-ref": "5eacc22840f15085", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xe", "type": "file" }, { - "bom-ref": "b36b0e8a7986d47f", + "bom-ref": "ede8b33c7c190981", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xn", "type": "file" }, { - "bom-ref": "d23f480fe00b288e", + "bom-ref": "64a2f1bc6924cef4", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xr", "type": "file" }, { - "bom-ref": "49c0694ac2d2952a", + "bom-ref": "254ac50856ab3dd0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xs", "type": "file" }, { - "bom-ref": "541274e900bfaee2", + "bom-ref": "851b10ff3baeeff8", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xsc", "type": "file" }, { - "bom-ref": "71af3710a4a1ec10", + "bom-ref": "a8a7b5820175581e", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xsce", "type": "file" }, { - "bom-ref": "46aa2bfd6d34f30e", + "bom-ref": "4128a3a72546a53c", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xse", "type": "file" }, { - "bom-ref": "a262f9d466858cfa", + "bom-ref": "5185e343f3ca5840", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xsw", "type": "file" }, { - "bom-ref": "4c09ceb32eaf15be", + "bom-ref": "74d6edb6f55ce9b0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xswe", "type": "file" }, { - "bom-ref": "ebed1fea6380aa1f", + "bom-ref": "60e9846456ce66e5", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xu", "type": "file" }, { - "bom-ref": "83cf282081d14ea3", + "bom-ref": "27b0031f08c4393d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xw", "type": "file" }, { - "bom-ref": "d41e1a359dd5abe3", + "bom-ref": "dcb2d3fc1afb4de1", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/elf_x86_64.xwe", "type": "file" }, { - "bom-ref": "a132af0943cd78c4", + "bom-ref": "23ab09bfad563712", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.x", "type": "file" }, { - "bom-ref": "96174b5da6702332", + "bom-ref": "9dcd3440a19e67a0", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xa", "type": "file" }, { - "bom-ref": "ce162efa83f2e723", + "bom-ref": "ae8cab4bbbe41d6d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xbn", "type": "file" }, { - "bom-ref": "341b8a4a3df2ae81", + "bom-ref": "2c514a5a36fe2ad7", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xe", "type": "file" }, { - "bom-ref": "1522d7b064c6fda6", + "bom-ref": "21bb4322cc972bdc", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xn", "type": "file" }, { - "bom-ref": "91c03bbf03362b62", + "bom-ref": "f5e61e6c02735084", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xr", "type": "file" }, { - "bom-ref": "ea97a4681da61d4f", + "bom-ref": "528e4dac4f81d9ed", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pe.xu", "type": "file" }, { - "bom-ref": "99f93dbb375bbf64", + "bom-ref": "ef1696f71dde5b96", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.x", "type": "file" }, { - "bom-ref": "c136e075d823070f", + "bom-ref": "62961b98a6b514a9", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xa", "type": "file" }, { - "bom-ref": "c0c7a0003ab8808f", + "bom-ref": "c4203c456d55ad1d", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xbn", "type": "file" }, { - "bom-ref": "a3eb2621cef4e3e8", + "bom-ref": "8d5f33838c76a386", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xe", "type": "file" }, { - "bom-ref": "eeebb0bbf55df741", + "bom-ref": "70c63b222d7c5c7f", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xn", "type": "file" }, { - "bom-ref": "3ba8670378586b93", + "bom-ref": "38e332d47855db51", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xr", "type": "file" }, { - "bom-ref": "87528616f5494c5d", + "bom-ref": "247a88433653d58b", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/i386pep.xu", "type": "file" }, { - "bom-ref": "497eb62e1d3226f0", + "bom-ref": "a688aea844b3b4c6", "name": "/usr/lib/x86_64-linux-gnu/ldscripts/stamp", "type": "file" }, { - "bom-ref": "b3cb1df40fcec4e2", + "bom-ref": "f89a5eafe825d8b8", "name": "/usr/lib/x86_64-linux-gnu/libBrokenLocale.a", "type": "file" }, { - "bom-ref": "60f7e18efeacc73f", + "bom-ref": "a8abe8a47ee821c1", "name": "/usr/lib/x86_64-linux-gnu/libBrokenLocale.so.1", "type": "file" }, { - "bom-ref": "bfabb8c2462f7bb4", + "bom-ref": "95ace8c1562bbbf6", "name": "/usr/lib/x86_64-linux-gnu/libFLAC.so.12.1.0", "type": "file" }, { - "bom-ref": "b1acc94342f22fd6", + "bom-ref": "1deafb516a8aed64", "name": "/usr/lib/x86_64-linux-gnu/libICE.so.6.3.0", "type": "file" }, { - "bom-ref": "3cd8a94d31b4e541", + "bom-ref": "87c686630a050ebf", "name": "/usr/lib/x86_64-linux-gnu/libLerc.so.4", "type": "file" }, { - "bom-ref": "c5d1a5069f7baa0f", + "bom-ref": "a944f45593df038d", "name": "/usr/lib/x86_64-linux-gnu/libSM.so.6.0.1", "type": "file" }, { - "bom-ref": "57521db87a0c1807", + "bom-ref": "bb99d920e74c3ec1", "name": "/usr/lib/x86_64-linux-gnu/libX11.so.6.4.0", "type": "file" }, { - "bom-ref": "95bea2e800f09267", + "bom-ref": "628b462c48949e95", "name": "/usr/lib/x86_64-linux-gnu/libXau.so.6.0.0", "type": "file" }, { - "bom-ref": "e6a8aaf1d28cc277", + "bom-ref": "6cfd369289c9f4fd", "name": "/usr/lib/x86_64-linux-gnu/libXaw7.so.7.0.0", "type": "file" }, { - "bom-ref": "f7eeb133222709e0", + "bom-ref": "5ad0fcd91a102c0e", "name": "/usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0", "type": "file" }, { - "bom-ref": "d4ece63fb4ae496f", + "bom-ref": "a07d35e225314c25", "name": "/usr/lib/x86_64-linux-gnu/libXext.so.6.4.0", "type": "file" }, { - "bom-ref": "5ced2ff1d0ce996f", + "bom-ref": "08751c7a3fa64fd9", "name": "/usr/lib/x86_64-linux-gnu/libXmu.so.6.2.0", "type": "file" }, { - "bom-ref": "cd03137c594811ef", + "bom-ref": "4633d4322672793d", "name": "/usr/lib/x86_64-linux-gnu/libXpm.so.4.11.0", "type": "file" }, { - "bom-ref": "ff848c40700ddadc", + "bom-ref": "41de55c24e1d7262", "name": "/usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0", "type": "file" }, { - "bom-ref": "5cf560b15ea77da3", + "bom-ref": "f766972466de6559", "name": "/usr/lib/x86_64-linux-gnu/libXt.so.6.0.0", "type": "file" }, { - "bom-ref": "3bc1b4ae106a7018", + "bom-ref": "e8541078998d1d7a", "name": "/usr/lib/x86_64-linux-gnu/libacl.so.1.1.2302", "type": "file" }, { - "bom-ref": "aa1155810c07f8f0", + "bom-ref": "85293f9942207222", "name": "/usr/lib/x86_64-linux-gnu/libanl.a", "type": "file" }, { - "bom-ref": "b3216923c5a2816f", + "bom-ref": "84744f9e97cc0f9d", "name": "/usr/lib/x86_64-linux-gnu/libanl.so.1", "type": "file" }, { - "bom-ref": "005a8bee7177d90e", + "bom-ref": "1de3aa6a285f4f88", "name": "/usr/lib/x86_64-linux-gnu/libann.so.0.0.0", "type": "file" }, { - "bom-ref": "464bf696e3b8cd61", + "bom-ref": "48852babe126e2ff", "name": "/usr/lib/x86_64-linux-gnu/libaom.so.3.8.2", "type": "file" }, { - "bom-ref": "ad0a688677cb277e", + "bom-ref": "46f9d6da0f1fac78", "name": "/usr/lib/x86_64-linux-gnu/libapt-pkg.so.6.0.0", "type": "file" }, { - "bom-ref": "abd4f770b123792a", + "bom-ref": "89167ae5cad47240", "name": "/usr/lib/x86_64-linux-gnu/libapt-private.so.0.0.0", "type": "file" }, { - "bom-ref": "19b1291f16b7e01e", + "bom-ref": "7cd7223ce7e698cb", "name": "/usr/lib/x86_64-linux-gnu/libasan.so.8.0.0", "type": "file" }, { - "bom-ref": "8991a1bef8e4008f", + "bom-ref": "221e15a755ba2659", "name": "/usr/lib/x86_64-linux-gnu/libasound.so.2.0.0", "type": "file" }, { - "bom-ref": "c54047297d534f3e", + "bom-ref": "17ea4e0032b06584", "name": "/usr/lib/x86_64-linux-gnu/libassuan.so.0.8.6", "type": "file" }, { - "bom-ref": "10576e48d4434e59", + "bom-ref": "1bd7862d362bda97", "name": "/usr/lib/x86_64-linux-gnu/libatlas.a", "type": "file" }, { - "bom-ref": "38806d7494096926", + "bom-ref": "59b4ef5e291603a0", "name": "/usr/lib/x86_64-linux-gnu/libatlas.so.3.10.3", "type": "file" }, { - "bom-ref": "ba743ee8f90bfa29", + "bom-ref": "021f608b59d15130", "name": "/usr/lib/x86_64-linux-gnu/libatomic.so.1.2.0", "type": "file" }, { - "bom-ref": "9a0c8d932466a091", + "bom-ref": "2c4d61200c4b143b", "name": "/usr/lib/x86_64-linux-gnu/libattr.so.1.1.2502", "type": "file" }, { - "bom-ref": "b44bd7db13211668", + "bom-ref": "3e4a2add8f5bc36e", "name": "/usr/lib/x86_64-linux-gnu/libaudit.so.1.0.0", "type": "file" }, { - "bom-ref": "48d762d2972057ed", + "bom-ref": "b34ae26cf53c03a7", "name": "/usr/lib/x86_64-linux-gnu/libbabeltrace-ctf-metadata.so.1.0.0", "type": "file" }, { - "bom-ref": "f81362d020025e22", + "bom-ref": "4ab08293d0c10408", "name": "/usr/lib/x86_64-linux-gnu/libbabeltrace-ctf-text.so.1.0.0", "type": "file" }, { - "bom-ref": "2e5ad3230095e65f", + "bom-ref": "f2d4576dc9d829b1", "name": "/usr/lib/x86_64-linux-gnu/libbabeltrace-ctf.so.1.0.0", "type": "file" }, { - "bom-ref": "37497cc6e30b8e66", + "bom-ref": "43f6923ff2ca7634", "name": "/usr/lib/x86_64-linux-gnu/libbabeltrace-dummy.so.1.0.0", "type": "file" }, { - "bom-ref": "4cb4698addce19cb", + "bom-ref": "4eba22581de6bac5", "name": "/usr/lib/x86_64-linux-gnu/libbabeltrace-lttng-live.so.1.0.0", "type": "file" }, { - "bom-ref": "f84fc5f11fdfa182", + "bom-ref": "8085944d3f0f7f44", "name": "/usr/lib/x86_64-linux-gnu/libbabeltrace.so.1.0.0", "type": "file" }, { - "bom-ref": "62bbd045d6aed5bf", + "bom-ref": "97f10e3ffc793b95", "name": "/usr/lib/x86_64-linux-gnu/libbfd-2.42-system.so", "type": "file" }, { - "bom-ref": "1a47268245642c69", + "bom-ref": "d3da4631aa876b13", "name": "/usr/lib/x86_64-linux-gnu/libblkid.so.1.1.0", "type": "file" }, { - "bom-ref": "ab1c1d070067ba7d", + "bom-ref": "496cf384ef6669d7", "name": "/usr/lib/x86_64-linux-gnu/libbnxt_re-rdmav34.a", "type": "file" }, { - "bom-ref": "cd7c654bda8766d1", + "bom-ref": "1b2caaf68531df0a", "name": "/usr/lib/x86_64-linux-gnu/libbrotlicommon.so.1.1.0", "type": "file" }, { - "bom-ref": "cc0e65780704aa6a", + "bom-ref": "a36b986a583a994d", "name": "/usr/lib/x86_64-linux-gnu/libbrotlidec.so.1.1.0", "type": "file" }, { - "bom-ref": "4edc039f63b86df4", + "bom-ref": "2955ec0a961af73b", "name": "/usr/lib/x86_64-linux-gnu/libbrotlienc.so.1.1.0", "type": "file" }, { - "bom-ref": "a0fecfbe75a58b30", + "bom-ref": "cd876167df62996a", "name": "/usr/lib/x86_64-linux-gnu/libbsd-ctor.a", "type": "file" }, { - "bom-ref": "026d97efa934eb6c", + "bom-ref": "0236649f40fcd78a", "name": "/usr/lib/x86_64-linux-gnu/libbsd.a", "type": "file" }, { - "bom-ref": "e44bb65e1e41b4fd", + "bom-ref": "31c5538dab5edab7", "name": "/usr/lib/x86_64-linux-gnu/libbsd.so", "type": "file" }, { - "bom-ref": "22e6e0ef8f33cdee", + "bom-ref": "a5f605e4c3d00a51", "name": "/usr/lib/x86_64-linux-gnu/libbsd.so.0.12.1", "type": "file" }, { - "bom-ref": "5ed6ee950b664047", + "bom-ref": "b4b0dafbd8932379", "name": "/usr/lib/x86_64-linux-gnu/libbz2.a", "type": "file" }, { - "bom-ref": "7ca245741e19e210", + "bom-ref": "53c6fbc173bcfe9e", "name": "/usr/lib/x86_64-linux-gnu/libbz2.so.1.0.4", "type": "file" }, { - "bom-ref": "5ba57306f3ff5291", + "bom-ref": "4eade9f2cbc0a58f", "name": "/usr/lib/x86_64-linux-gnu/libc.a", "type": "file" }, { - "bom-ref": "5ea7f76389646119", + "bom-ref": "99793aae09591d53", "name": "/usr/lib/x86_64-linux-gnu/libc.so", "type": "file" }, { - "bom-ref": "8e190675c276766e", + "bom-ref": "cd83b478dbf26884", "name": "/usr/lib/x86_64-linux-gnu/libc.so.6", "type": "file" }, { - "bom-ref": "c3b41c8b3298e6c1", + "bom-ref": "774c276a419a4caf", "name": "/usr/lib/x86_64-linux-gnu/libc_malloc_debug.so.0", "type": "file" }, { - "bom-ref": "8eb5faec8d750ad5", + "bom-ref": "4a63eb3915bf9ad3", "name": "/usr/lib/x86_64-linux-gnu/libc_nonshared.a", "type": "file" }, { - "bom-ref": "3516a980b5de5ce8", + "bom-ref": "d0f7a736bd55ed72", "name": "/usr/lib/x86_64-linux-gnu/libcairo.so.2.11800.0", "type": "file" }, { - "bom-ref": "6b4392a41787805f", + "bom-ref": "4274f3e57ed0bfcd", "name": "/usr/lib/x86_64-linux-gnu/libcap-ng.so.0.0.0", "type": "file" }, { - "bom-ref": "b071b4ab8d207041", + "bom-ref": "047affaae7d2508b", "name": "/usr/lib/x86_64-linux-gnu/libcap.so.2.66", "type": "file" }, { - "bom-ref": "0d92aa1341245fcf", + "bom-ref": "8b892023aed2ef2d", "name": "/usr/lib/x86_64-linux-gnu/libcares.so.2.12.0", "type": "file" }, { - "bom-ref": "95899f75ac7fa4e9", + "bom-ref": "83a72001dec3bb43", "name": "/usr/lib/x86_64-linux-gnu/libcblas.a", "type": "file" }, { - "bom-ref": "a6745a956f9932b5", + "bom-ref": "b77193a3646da79b", "name": "/usr/lib/x86_64-linux-gnu/libcblas.so.3.10.3", "type": "file" }, { - "bom-ref": "633b8e7e81799661", + "bom-ref": "d7a87628e4b55bdc", "name": "/usr/lib/x86_64-linux-gnu/libcbor.so.0.10.2", "type": "file" }, { - "bom-ref": "c01a9338bc311ae1", + "bom-ref": "c3e9d793ad0d5f68", "name": "/usr/lib/x86_64-linux-gnu/libcc1.so.0.0.0", "type": "file" }, { - "bom-ref": "719d4140a6b19d02", + "bom-ref": "153c846e0c94d384", "name": "/usr/lib/x86_64-linux-gnu/libcdt.so.5.0.0", "type": "file" }, { - "bom-ref": "1fc8ab59dd6e05ff", + "bom-ref": "e496354b3fc60c09", "name": "/usr/lib/x86_64-linux-gnu/libcgraph.so.6.0.0", "type": "file" }, { - "bom-ref": "ded53c7fe196da03", + "bom-ref": "306af529f2a98061", "name": "/usr/lib/x86_64-linux-gnu/libclang-18.so.18", "type": "file" }, { - "bom-ref": "1442f77dd36c1bbd", + "bom-ref": "a443eabddb211d97", "name": "/usr/lib/x86_64-linux-gnu/libcom_err.a", "type": "file" }, { - "bom-ref": "3d1a1fd369fcf4fd", + "bom-ref": "78b4aa648130ff4b", "name": "/usr/lib/x86_64-linux-gnu/libcom_err.so.2.1", "type": "file" }, { - "bom-ref": "906930c55e01cf75", + "bom-ref": "82a61e560237d356", "name": "/usr/lib/x86_64-linux-gnu/libcrypt.a", "type": "file" }, { - "bom-ref": "4d6a49bbceba9296", + "bom-ref": "1b4ce90659d40c20", "name": "/usr/lib/x86_64-linux-gnu/libcrypt.so.1.1.0", "type": "file" }, { - "bom-ref": "c5f6f6e621853537", + "bom-ref": "7c0259508432a271", "name": "/usr/lib/x86_64-linux-gnu/libcrypto.so.3", "type": "file" }, { - "bom-ref": "62fdb55f8baef261", + "bom-ref": "aaf74a3e58041b5f", "name": "/usr/lib/x86_64-linux-gnu/libctf-nobfd.so.0.0.0", "type": "file" }, { - "bom-ref": "50094c5cd072cea6", + "bom-ref": "2d358111e69e2a40", "name": "/usr/lib/x86_64-linux-gnu/libctf.so.0.0.0", "type": "file" }, { - "bom-ref": "219a5cac005b930a", - "name": "/usr/lib/x86_64-linux-gnu/libcublas/13/0000_cublas.conf", - "type": "file" - }, - { - "bom-ref": "7f22ff9e2d4977ee", - "name": "/usr/lib/x86_64-linux-gnu/libcublas/13/libcublas.so.13.4.1.2", - "type": "file" - }, - { - "bom-ref": "28a71235e78bdc0e", - "name": "/usr/lib/x86_64-linux-gnu/libcublas/13/libcublasLt.so.13.4.1.2", - "type": "file" - }, - { - "bom-ref": "4962e34610ea773b", - "name": "/usr/lib/x86_64-linux-gnu/libcublas/13/libcublasLt_static.a", - "type": "file" - }, - { - "bom-ref": "019c2a1e3716cd53", - "name": "/usr/lib/x86_64-linux-gnu/libcublas/13/libcublas_static.a", - "type": "file" - }, - { - "bom-ref": "dbb83b00963c2141", - "name": "/usr/lib/x86_64-linux-gnu/libcublas/13/libnvblas.so.13.4.1.2", + "bom-ref": "aeebab153f760285", + "name": "/usr/lib/x86_64-linux-gnu/libcublasmp/13/libcublasmp.so.0.10.0", "type": "file" }, { - "bom-ref": "eba2a5fa830c4899", - "name": "/usr/lib/x86_64-linux-gnu/libcudnn.so.9.22.0", + "bom-ref": "c7c3b1d9afb20aff", + "name": "/usr/lib/x86_64-linux-gnu/libcudnn.so.9.25.1", "type": "file" }, { - "bom-ref": "4f6ba175c63ef327", - "name": "/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.22.0", + "bom-ref": "afb982e20adaba45", + "name": "/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.25.1", "type": "file" }, { - "bom-ref": "49f1e7d2867ff16b", - "name": "/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.22.0", + "bom-ref": "e9ebe0d57e9737d6", + "name": "/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.25.1", "type": "file" }, { - "bom-ref": "26b4f06e127c89bf", - "name": "/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.22.0", + "bom-ref": "b170f79b6810685a", + "name": "/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.25.1", "type": "file" }, { - "bom-ref": "0653b2ab853685c1", - "name": "/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.22.0", + "bom-ref": "e57851fca4cf6357", + "name": "/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.25.1", "type": "file" }, { - "bom-ref": "c776a2141bcde27b", - "name": "/usr/lib/x86_64-linux-gnu/libcudnn_engines_tensor_ir.so.9.22.0", + "bom-ref": "1aba270ceb4738ce", + "name": "/usr/lib/x86_64-linux-gnu/libcudnn_engines_tensor_ir.so.9.25.1", "type": "file" }, { - "bom-ref": "5dffd9668f133b69", - "name": "/usr/lib/x86_64-linux-gnu/libcudnn_ext.so.9.22.0", + "bom-ref": "a99129c8b3efcdfb", + "name": "/usr/lib/x86_64-linux-gnu/libcudnn_ext.so.9.25.1", "type": "file" }, { - "bom-ref": "80898d4ccdeeafab", - "name": "/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.22.0", + "bom-ref": "7d699479493c6874", + "name": "/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.25.1", "type": "file" }, { - "bom-ref": "101600578a55696f", - "name": "/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.22.0", + "bom-ref": "c7856309dee4b8aa", + "name": "/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.25.1", "type": "file" }, { - "bom-ref": "b1839408429d2c2b", - "name": "/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.22.0", + "bom-ref": "26b32fc1e8d9c477", + "name": "/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.25.1", "type": "file" }, { - "bom-ref": "554650cb36e45d74", + "bom-ref": "a3bff2040dbed93a", "name": "/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4.8.0", "type": "file" }, { - "bom-ref": "49b7778cd9fb3700", + "bom-ref": "f523cfab2d4c672e", "name": "/usr/lib/x86_64-linux-gnu/libcurl.so.4.8.0", "type": "file" }, { - "bom-ref": "9dc6bf93b60a6c4f", - "name": "/usr/lib/x86_64-linux-gnu/libcusolvermp/13/libcusolverMp.so.0.8.0.0", + "bom-ref": "ccfd2a45fe4f9a33", + "name": "/usr/lib/x86_64-linux-gnu/libcusolvermp/13/libcusolverMp.so.0.9.0.0", "type": "file" }, { - "bom-ref": "58ab8a1faa5203d9", + "bom-ref": "e194f1bafd44198b", "name": "/usr/lib/x86_64-linux-gnu/libcxgb4-rdmav34.a", "type": "file" }, { - "bom-ref": "c087868d1defaac9", + "bom-ref": "71fefbc742e8e91f", "name": "/usr/lib/x86_64-linux-gnu/libdatrie.so.1.4.0", "type": "file" }, { - "bom-ref": "7803c5c26e5ed2ee", + "bom-ref": "90e09ddc39d6bde0", "name": "/usr/lib/x86_64-linux-gnu/libdb-5.3.so", "type": "file" }, { - "bom-ref": "17f05d6b4f5d67a5", - "name": "/usr/lib/x86_64-linux-gnu/libdbus-1.a", - "type": "file" - }, - { - "bom-ref": "8906bca2d1387ea5", + "bom-ref": "7b72f5e08d8990d2", "name": "/usr/lib/x86_64-linux-gnu/libdbus-1.so.3.32.4", "type": "file" }, { - "bom-ref": "4e338271e0577269", + "bom-ref": "cae09d65ed97e2df", "name": "/usr/lib/x86_64-linux-gnu/libdebconfclient.so.0.0.0", "type": "file" }, { - "bom-ref": "596705cf5e4f158e", + "bom-ref": "f5f6dff482cab5ac", "name": "/usr/lib/x86_64-linux-gnu/libdebuginfod-0.190.so", "type": "file" }, { - "bom-ref": "b35b93840636d67f", + "bom-ref": "416b31ee7c9645fd", "name": "/usr/lib/x86_64-linux-gnu/libdeflate.so.0", "type": "file" }, { - "bom-ref": "4f4668d4f3c67afc", + "bom-ref": "b22dbaf54045c01e", "name": "/usr/lib/x86_64-linux-gnu/libdl.a", "type": "file" }, { - "bom-ref": "713a25fb66b2992a", + "bom-ref": "dab9ec290fcb4528", "name": "/usr/lib/x86_64-linux-gnu/libdl.so.2", "type": "file" }, { - "bom-ref": "b418aea2fa3a0593", + "bom-ref": "359eee026c9b68ad", "name": "/usr/lib/x86_64-linux-gnu/libdrop_ambient.so.0.0.0", "type": "file" }, { - "bom-ref": "4a173f5aa83885b0", + "bom-ref": "b1c41932c67dc052", "name": "/usr/lib/x86_64-linux-gnu/libdw-0.190.so", "type": "file" }, { - "bom-ref": "0468b6c873ce809a", + "bom-ref": "6cdd18d2bfc492b8", "name": "/usr/lib/x86_64-linux-gnu/libe2p.so.2.3", "type": "file" }, { - "bom-ref": "92e493ae275a35d4", + "bom-ref": "f46de04dae4252a6", "name": "/usr/lib/x86_64-linux-gnu/libedit.a", "type": "file" }, { - "bom-ref": "e7b3bae8af8d9477", + "bom-ref": "3ed638f8e58e7f56", "name": "/usr/lib/x86_64-linux-gnu/libedit.so.2.0.72", "type": "file" }, { - "bom-ref": "a1ab76f61068a775", + "bom-ref": "03f0ec8e1046f017", "name": "/usr/lib/x86_64-linux-gnu/libefa.a", "type": "file" }, { - "bom-ref": "7671eabda5912968", + "bom-ref": "f01cedbd53d2656e", "name": "/usr/lib/x86_64-linux-gnu/libefa.so.1.3.50.0", "type": "file" }, { - "bom-ref": "2a40d0173eec374b", + "bom-ref": "4d40a4e75dcfc698", "name": "/usr/lib/x86_64-linux-gnu/libelf-0.190.so", "type": "file" }, { - "bom-ref": "54e1662b8fff7e1d", + "bom-ref": "8859822d0b650abb", "name": "/usr/lib/x86_64-linux-gnu/liberdma-rdmav34.a", "type": "file" }, { - "bom-ref": "e2ea3aa26be8d308", + "bom-ref": "ce8407013bb342b2", "name": "/usr/lib/x86_64-linux-gnu/libexpat.a", "type": "file" }, { - "bom-ref": "5e3b47ff4a442aa5", + "bom-ref": "e185a8cbf0986038", "name": "/usr/lib/x86_64-linux-gnu/libexpat.so.1.9.1", "type": "file" }, { - "bom-ref": "851f56e55de5850a", + "bom-ref": "7d5566a4a27d0528", "name": "/usr/lib/x86_64-linux-gnu/libexpatw.a", "type": "file" }, { - "bom-ref": "dd2ec3224c3089b0", + "bom-ref": "78815b13f27be3b9", "name": "/usr/lib/x86_64-linux-gnu/libexpatw.so.1.9.1", "type": "file" }, { - "bom-ref": "2d819b3ff057dcec", + "bom-ref": "58692ecd36e70d12", "name": "/usr/lib/x86_64-linux-gnu/libext2fs.so.2.4", "type": "file" }, { - "bom-ref": "a616714f6c0d9c90", + "bom-ref": "3e207777e6bc9606", "name": "/usr/lib/x86_64-linux-gnu/libf77blas.a", "type": "file" }, { - "bom-ref": "2fab77c1f13fa5f0", + "bom-ref": "e5dd28c5ae6e0086", "name": "/usr/lib/x86_64-linux-gnu/libf77blas.so.3.10.3", "type": "file" }, { - "bom-ref": "522a3eee7ccf9f32", + "bom-ref": "f7ee454485eaa71c", "name": "/usr/lib/x86_64-linux-gnu/libffi.a", "type": "file" }, { - "bom-ref": "66b312bec600f20d", + "bom-ref": "c1c7ff7b5b351537", "name": "/usr/lib/x86_64-linux-gnu/libffi.so.8.1.4", "type": "file" }, { - "bom-ref": "be0f07703f4fcecf", + "bom-ref": "b34d7561a8ed48b9", "name": "/usr/lib/x86_64-linux-gnu/libffi_pic.a", "type": "file" }, { - "bom-ref": "df43cdf0dedf4bad", + "bom-ref": "0b9aaed185a542b8", "name": "/usr/lib/x86_64-linux-gnu/libfido2.so.1.14.0", "type": "file" }, { - "bom-ref": "ced6b211bfc20d0b", + "bom-ref": "0823e3e318670c11", "name": "/usr/lib/x86_64-linux-gnu/libfontconfig.so.1.12.1", "type": "file" }, { - "bom-ref": "0b35ca0f705fb299", + "bom-ref": "414edcc7ca3ac57f", "name": "/usr/lib/x86_64-linux-gnu/libform.a", "type": "file" }, { - "bom-ref": "a83f7095c60ee76a", + "bom-ref": "557f8da25d5fce13", "name": "/usr/lib/x86_64-linux-gnu/libform.so.6.4", "type": "file" }, { - "bom-ref": "42a34b0a29b7c155", + "bom-ref": "4eea30dfbe1c1c8f", "name": "/usr/lib/x86_64-linux-gnu/libformw.a", "type": "file" }, { - "bom-ref": "dc53643588c15fba", + "bom-ref": "aaad5c60986b233c", "name": "/usr/lib/x86_64-linux-gnu/libformw.so.6.4", "type": "file" }, { - "bom-ref": "52f0cc62f91d2a7e", + "bom-ref": "dcecef74264ee14c", "name": "/usr/lib/x86_64-linux-gnu/libfreetype.so.6.20.1", "type": "file" }, { - "bom-ref": "adc873b7c3a8b49e", + "bom-ref": "b1160df114b130f4", "name": "/usr/lib/x86_64-linux-gnu/libfribidi.so.0.4.0", "type": "file" }, { - "bom-ref": "90c8243b0ef7898a", + "bom-ref": "a39e2803fecee360", "name": "/usr/lib/x86_64-linux-gnu/libg.a", "type": "file" }, { - "bom-ref": "a1b8e6d737eca9fc", + "bom-ref": "3f0542cbdbbe45f6", "name": "/usr/lib/x86_64-linux-gnu/libgc.so.1.5.3", "type": "file" }, { - "bom-ref": "512bf6bda356cb3c", + "bom-ref": "9b9b194e77ddfdc6", "name": "/usr/lib/x86_64-linux-gnu/libgcc_s.so.1", "type": "file" }, { - "bom-ref": "cc20f22a88b699a7", + "bom-ref": "c21f2111425c4cbd", "name": "/usr/lib/x86_64-linux-gnu/libgccpp.so.1.5.0", "type": "file" }, { - "bom-ref": "89cb119bfc9a214e", + "bom-ref": "689d039eb1603764", "name": "/usr/lib/x86_64-linux-gnu/libgcrypt.so.20.4.3", "type": "file" }, { - "bom-ref": "1a27499ce0247d8d", + "bom-ref": "611a6e374737057b", "name": "/usr/lib/x86_64-linux-gnu/libgctba.so.1.5.0", "type": "file" }, { - "bom-ref": "1669b62ede773431", + "bom-ref": "b1eb331288350ec3", "name": "/usr/lib/x86_64-linux-gnu/libgd.so.3.0.11", "type": "file" }, { - "bom-ref": "7de5ee6c10e90c42", + "bom-ref": "37c25bc74cb27ed3", "name": "/usr/lib/x86_64-linux-gnu/libgdbm.so.6.0.0", "type": "file" }, { - "bom-ref": "ed910d8fdcae8a12", + "bom-ref": "5382babb2bd0cb4b", "name": "/usr/lib/x86_64-linux-gnu/libgdbm_compat.so.4.0.0", "type": "file" }, { - "bom-ref": "04be75ef767d5cd2", + "bom-ref": "c38000d32df742dd", "name": "/usr/lib/x86_64-linux-gnu/libgdrapi.so.2.5", "type": "file" }, { - "bom-ref": "11961e4e85758fea", + "bom-ref": "a07c10a202c5d3d8", "name": "/usr/lib/x86_64-linux-gnu/libgflags.a", "type": "file" }, { - "bom-ref": "c4885a3599f970ea", + "bom-ref": "cad736aaeb010528", "name": "/usr/lib/x86_64-linux-gnu/libgflags.so.2.2.2", "type": "file" }, { - "bom-ref": "5e79d17e31f7ee0d", + "bom-ref": "59e151d99f59d2cb", "name": "/usr/lib/x86_64-linux-gnu/libgflags_nothreads.a", "type": "file" }, { - "bom-ref": "943da725501dfe4d", + "bom-ref": "13edf07775862717", "name": "/usr/lib/x86_64-linux-gnu/libgflags_nothreads.so.2.2.2", "type": "file" }, { - "bom-ref": "ad94de149e2156f1", + "bom-ref": "00960273740ed4d7", "name": "/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0", "type": "file" }, { - "bom-ref": "59d5436bc2e626e6", + "bom-ref": "bbb775fd9322426b", "name": "/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8000.0", "type": "file" }, { - "bom-ref": "fa9584f23de9494f", + "bom-ref": "d4af90ffc3f38336", "name": "/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8000.0", "type": "file" }, { - "bom-ref": "5195178758091985", + "bom-ref": "84ae0a2a930735d3", "name": "/usr/lib/x86_64-linux-gnu/libglog.a", "type": "file" }, { - "bom-ref": "3687c8f41dea3d83", + "bom-ref": "e01aa51e2980e4f1", "name": "/usr/lib/x86_64-linux-gnu/libglog.so.0.6.0", "type": "file" }, { - "bom-ref": "dcd8175aecdf6487", + "bom-ref": "acb528148f29f506", "name": "/usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0.8000.0", "type": "file" }, { - "bom-ref": "889c622bd17695ab", + "bom-ref": "1340d15fd9f9dbb9", "name": "/usr/lib/x86_64-linux-gnu/libgmp.so.10.5.0", "type": "file" }, { - "bom-ref": "44c0c19612192a8c", + "bom-ref": "66daaf6125d7b226", "name": "/usr/lib/x86_64-linux-gnu/libgnutls.so.30.37.1", "type": "file" }, { - "bom-ref": "daf3814f829b5ef8", + "bom-ref": "0d33d48c0ff4d841", "name": "/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.8000.0", "type": "file" }, { - "bom-ref": "1755857bcaeb85d8", + "bom-ref": "b25d32db1a74f7b1", "name": "/usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0", "type": "file" }, { - "bom-ref": "6b5caa3900ed37c0", + "bom-ref": "7d2a3eed4fbc1b7a", "name": "/usr/lib/x86_64-linux-gnu/libgpg-error.so.0.34.0", "type": "file" }, { - "bom-ref": "0e9b54d265c85f13", + "bom-ref": "7d1e590fbb9cd28b", "name": "/usr/lib/x86_64-linux-gnu/libgpm.so.2", "type": "file" }, { - "bom-ref": "452842d5266bf4af", + "bom-ref": "6a5fe1b3be267c95", "name": "/usr/lib/x86_64-linux-gnu/libgprofng.so.0.0.0", "type": "file" }, { - "bom-ref": "e18829409c1ef311", + "bom-ref": "7690501a4c1a4f67", "name": "/usr/lib/x86_64-linux-gnu/libgraphite2.so.3.2.1", "type": "file" }, { - "bom-ref": "31205c45eae2bfef", + "bom-ref": "3320e2ecb290cdfd", "name": "/usr/lib/x86_64-linux-gnu/libgsm.so.1.0.19", "type": "file" }, { - "bom-ref": "604d8ad375b26afb", + "bom-ref": "55f91c31edc9e9f0", "name": "/usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2.2", "type": "file" }, { - "bom-ref": "f12725dd580e9598", + "bom-ref": "74ca45760e154ca6", "name": "/usr/lib/x86_64-linux-gnu/libgssrpc.so.4.2", "type": "file" }, { - "bom-ref": "7abbd46eea19e5f9", + "bom-ref": "8dbf85a9dfd862f0", "name": "/usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0.8000.0", "type": "file" }, { - "bom-ref": "530ad4b694b95279", + "bom-ref": "4e790935df5bc39f", "name": "/usr/lib/x86_64-linux-gnu/libgts-0.7.so.5.0.1", "type": "file" }, { - "bom-ref": "0155f5b2281219a6", + "bom-ref": "208337e3a54d8a4c", "name": "/usr/lib/x86_64-linux-gnu/libgvc.so.6.0.0", "type": "file" }, { - "bom-ref": "5cc5343187020041", + "bom-ref": "43ad7efb63cd739f", "name": "/usr/lib/x86_64-linux-gnu/libgvpr.so.2.0.0", "type": "file" }, { - "bom-ref": "6762ef27dc0b88c4", + "bom-ref": "ba5a1d5a74e7cd6a", "name": "/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0.60830.0", "type": "file" }, { - "bom-ref": "d2f7d0145043e64c", + "bom-ref": "d282d585d0fa32fa", "name": "/usr/lib/x86_64-linux-gnu/libheif.so.1.17.6", "type": "file" }, { - "bom-ref": "3de80004b5090e7f", + "bom-ref": "a896059fb2a93789", "name": "/usr/lib/x86_64-linux-gnu/libheif/plugins/libheif-aomdec.so", "type": "file" }, { - "bom-ref": "25de2d220e02103d", + "bom-ref": "06cf9e6329fbcd4b", "name": "/usr/lib/x86_64-linux-gnu/libhfi1verbs-rdmav34.a", "type": "file" }, { - "bom-ref": "07825437b25d13d0", + "bom-ref": "17e436ff73d91576", "name": "/usr/lib/x86_64-linux-gnu/libhiredis.so.1.1.0", "type": "file" }, { - "bom-ref": "9369553be249e131", + "bom-ref": "51b8645c46088103", "name": "/usr/lib/x86_64-linux-gnu/libhiredis_ssl.so.1.1.0", "type": "file" }, { - "bom-ref": "d8783c7b7539d758", + "bom-ref": "b0b18dee8d3b712d", "name": "/usr/lib/x86_64-linux-gnu/libhistory.so.8.2", "type": "file" }, { - "bom-ref": "966bd704baf56162", + "bom-ref": "ffb5596cee4be1d0", "name": "/usr/lib/x86_64-linux-gnu/libhns-rdmav34.a", "type": "file" }, { - "bom-ref": "479a00772fecc91d", + "bom-ref": "4a2d768706267f3b", "name": "/usr/lib/x86_64-linux-gnu/libhogweed.so.6.8", "type": "file" }, { - "bom-ref": "b6cab36aa2d252f5", + "bom-ref": "55ef409fee741c08", "name": "/usr/lib/x86_64-linux-gnu/libhwasan.so.0.0.0", "type": "file" }, { - "bom-ref": "81a551f02bd708bd", + "bom-ref": "7d4acdd708f61340", "name": "/usr/lib/x86_64-linux-gnu/libhwloc.so.15.7.0", "type": "file" }, { - "bom-ref": "010accba9ea00d68", - "name": "/usr/lib/x86_64-linux-gnu/libibumad.so.3.4.59.1", + "bom-ref": "698b2c72002e0841", + "name": "/usr/lib/x86_64-linux-gnu/libibumad.so.3.4.63.0", "type": "file" }, { - "bom-ref": "05244866003f1391", + "bom-ref": "6c459a85b28aa59b", "name": "/usr/lib/x86_64-linux-gnu/libibverbs.a", "type": "file" }, { - "bom-ref": "6f9d3743cf858813", + "bom-ref": "4b11d33c3d33f3e1", "name": "/usr/lib/x86_64-linux-gnu/libibverbs.so.1.14.50.0", "type": "file" }, { - "bom-ref": "7fbf8a78e1270149", + "bom-ref": "5a02862f7b3b941b", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libbnxt_re-rdmav34.so", "type": "file" }, { - "bom-ref": "1e773e44fb42f907", + "bom-ref": "426e364306f3d8a5", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libcxgb4-rdmav34.so", "type": "file" }, { - "bom-ref": "35b666ce2ed4f187", + "bom-ref": "a173e0a432424189", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/liberdma-rdmav34.so", "type": "file" }, { - "bom-ref": "889c573af286573a", + "bom-ref": "02533162becd703c", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libhfi1verbs-rdmav34.so", "type": "file" }, { - "bom-ref": "195cfbf93847ca63", + "bom-ref": "461e062aca6a2a69", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libhns-rdmav34.so", "type": "file" }, { - "bom-ref": "cb818a57a06810da", + "bom-ref": "1f89ed28cf996a34", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libipathverbs-rdmav34.so", "type": "file" }, { - "bom-ref": "07c84f64b82372af", + "bom-ref": "71e1ad496c351545", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libirdma-rdmav34.so", "type": "file" }, { - "bom-ref": "3fd29424bff0d77f", + "bom-ref": "dd53de89f5048ff5", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libmthca-rdmav34.so", "type": "file" }, { - "bom-ref": "9999d9a1be77a314", + "bom-ref": "0bdac1a35c790a0e", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libocrdma-rdmav34.so", "type": "file" }, { - "bom-ref": "012f24729b5552e7", + "bom-ref": "67000bd3531e289d", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libqedr-rdmav34.so", "type": "file" }, { - "bom-ref": "a0f941125c28bf5d", + "bom-ref": "c99c4d1f940a24b7", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/librxe-rdmav34.so", "type": "file" }, { - "bom-ref": "d87dabbb1fa174ef", + "bom-ref": "1bb73b52a71be33d", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libsiw-rdmav34.so", "type": "file" }, { - "bom-ref": "63783fe5cdfc4fde", + "bom-ref": "cf0b3ad6ea911c8c", "name": "/usr/lib/x86_64-linux-gnu/libibverbs/libvmw_pvrdma-rdmav34.so", "type": "file" }, { - "bom-ref": "bc2360ffe01cd722", + "bom-ref": "cd8afef47cc247a8", "name": "/usr/lib/x86_64-linux-gnu/libicudata.a", "type": "file" }, { - "bom-ref": "b32ffe5a98b21d95", + "bom-ref": "9e82ce1e4158c837", "name": "/usr/lib/x86_64-linux-gnu/libicudata.so.74.2", "type": "file" }, { - "bom-ref": "9b675484c3cdcecb", + "bom-ref": "ec321c893071e995", "name": "/usr/lib/x86_64-linux-gnu/libicui18n.a", "type": "file" }, { - "bom-ref": "c4d3ea1bcb4092a3", + "bom-ref": "ae6d5a3b460a07a5", "name": "/usr/lib/x86_64-linux-gnu/libicui18n.so.74.2", "type": "file" }, { - "bom-ref": "02d961f5ec0dd239", + "bom-ref": "89e261a8f013c183", "name": "/usr/lib/x86_64-linux-gnu/libicuio.a", "type": "file" }, { - "bom-ref": "3dcc1f8d808ccc34", + "bom-ref": "67baffe999f26b2e", "name": "/usr/lib/x86_64-linux-gnu/libicuio.so.74.2", "type": "file" }, { - "bom-ref": "52dd714c361b2ffc", + "bom-ref": "0f95944b36472caa", "name": "/usr/lib/x86_64-linux-gnu/libicutest.a", "type": "file" }, { - "bom-ref": "229a1a1cb4bc569e", + "bom-ref": "27298b7e1b657004", "name": "/usr/lib/x86_64-linux-gnu/libicutest.so.74.2", "type": "file" }, { - "bom-ref": "76ba0b6f7a2c9db0", + "bom-ref": "db6d46817fee0256", "name": "/usr/lib/x86_64-linux-gnu/libicutu.a", "type": "file" }, { - "bom-ref": "dbcb926eec22bad3", + "bom-ref": "735f993e1005ecc9", "name": "/usr/lib/x86_64-linux-gnu/libicutu.so.74.2", "type": "file" }, { - "bom-ref": "8206bc533c233cf6", + "bom-ref": "1523a6a6fbf1c2cc", "name": "/usr/lib/x86_64-linux-gnu/libicuuc.a", "type": "file" }, { - "bom-ref": "23c127956270c940", + "bom-ref": "07aa482aeb7e0286", "name": "/usr/lib/x86_64-linux-gnu/libicuuc.so.74.2", "type": "file" }, { - "bom-ref": "53a7f2976c065651", + "bom-ref": "82ea8f51dbb47ac7", "name": "/usr/lib/x86_64-linux-gnu/libidn2.so.0.4.0", "type": "file" }, { - "bom-ref": "5aca8559b4442af4", + "bom-ref": "57835ff83d43baf2", "name": "/usr/lib/x86_64-linux-gnu/libipathverbs-rdmav34.a", "type": "file" }, { - "bom-ref": "e7c69cc116820192", + "bom-ref": "b0441cf2286ba660", "name": "/usr/lib/x86_64-linux-gnu/libipt.so.2.0.6", "type": "file" }, { - "bom-ref": "136ce1ce5d6e4e65", + "bom-ref": "097eba660100d577", "name": "/usr/lib/x86_64-linux-gnu/libirdma-rdmav34.a", "type": "file" }, { - "bom-ref": "0566693ab21032e1", + "bom-ref": "bfc182debeab1ab0", "name": "/usr/lib/x86_64-linux-gnu/libisl.so.23.3.0", "type": "file" }, { - "bom-ref": "2a602a9d402f5cf8", + "bom-ref": "1f94f85c8227d6cd", "name": "/usr/lib/x86_64-linux-gnu/libitm.so.1.0.0", "type": "file" }, { - "bom-ref": "76092a4055e882c0", + "bom-ref": "2b1c9959104ad653", "name": "/usr/lib/x86_64-linux-gnu/libjansson.so.4.14.0", "type": "file" }, { - "bom-ref": "4d7a0b8fc1962aed", + "bom-ref": "20574e5eab66895b", "name": "/usr/lib/x86_64-linux-gnu/libjbig.so.0", "type": "file" }, { - "bom-ref": "6e00682fa325523e", + "bom-ref": "d5eaad520bd92b88", "name": "/usr/lib/x86_64-linux-gnu/libjpeg.so.8.2.2", "type": "file" }, { - "bom-ref": "f9249d3a78ac32ee", + "bom-ref": "9bd5117577b7e3a3", "name": "/usr/lib/x86_64-linux-gnu/libjq.so.1.0.4", "type": "file" }, { - "bom-ref": "d78ffc38e64f0f0b", + "bom-ref": "d720d24010a092ac", "name": "/usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1", "type": "file" }, { - "bom-ref": "33a898e352959fa0", + "bom-ref": "fa66db801dd899da", "name": "/usr/lib/x86_64-linux-gnu/libkadm5clnt_mit.so.12.0", "type": "file" }, { - "bom-ref": "8d0a7e918defa07b", + "bom-ref": "7c35face82267135", "name": "/usr/lib/x86_64-linux-gnu/libkadm5srv_mit.so.12.0", "type": "file" }, { - "bom-ref": "8ff0d25cf37bab18", + "bom-ref": "47e40a19c54afcf2", "name": "/usr/lib/x86_64-linux-gnu/libkdb5.so.10.0", "type": "file" }, { - "bom-ref": "b9a9e503aec0883b", + "bom-ref": "922cd18446b126b8", "name": "/usr/lib/x86_64-linux-gnu/libkeyutils.so.1.10", "type": "file" }, { - "bom-ref": "d9fc3866c498fed3", + "bom-ref": "67169cc6049910c4", "name": "/usr/lib/x86_64-linux-gnu/libkmod.so.2.4.1", "type": "file" }, { - "bom-ref": "5a8e9e9ed3945c7c", + "bom-ref": "68dca7b2db02cb37", "name": "/usr/lib/x86_64-linux-gnu/libkrb5.so.3.3", "type": "file" }, { - "bom-ref": "d58c4c0d0a1598ef", + "bom-ref": "95571bf09e597528", "name": "/usr/lib/x86_64-linux-gnu/libkrb5support.so.0.1", "type": "file" }, { - "bom-ref": "fa8138b136b1d54b", + "bom-ref": "402ec39cad553e46", "name": "/usr/lib/x86_64-linux-gnu/libksba.so.8.14.6", "type": "file" }, { - "bom-ref": "8684c599afac110e", + "bom-ref": "25544f1d6f641a10", "name": "/usr/lib/x86_64-linux-gnu/liblab_gamut.so.1.0.0", "type": "file" }, { - "bom-ref": "8ace11f1b25f2d8f", + "bom-ref": "877c076f9161ecd9", "name": "/usr/lib/x86_64-linux-gnu/liblapack_atlas.a", "type": "file" }, { - "bom-ref": "09adaf8121750022", + "bom-ref": "eef1548a92599e54", "name": "/usr/lib/x86_64-linux-gnu/liblapack_atlas.so.3.10.3", "type": "file" }, { - "bom-ref": "b8011be980550d0e", + "bom-ref": "eba94f229ce30229", "name": "/usr/lib/x86_64-linux-gnu/liblber.so.2.0.200", "type": "file" }, { - "bom-ref": "c59bc754e87acce7", + "bom-ref": "f9af8c005e9afe30", "name": "/usr/lib/x86_64-linux-gnu/libldap.so.2.0.200", "type": "file" }, { - "bom-ref": "9b9aca5cecf477c5", + "bom-ref": "7b9a7f29c55dfd8f", "name": "/usr/lib/x86_64-linux-gnu/libleveldb.a", "type": "file" }, { - "bom-ref": "3acc50366c0e86a2", + "bom-ref": "65ae0d48a82488d4", "name": "/usr/lib/x86_64-linux-gnu/libleveldb.so.1.23.0", "type": "file" }, { - "bom-ref": "fe544f09d3eecb0b", + "bom-ref": "64936e89f1456d05", "name": "/usr/lib/x86_64-linux-gnu/liblmdb.a", "type": "file" }, { - "bom-ref": "96832d45d734484c", + "bom-ref": "d6fe260bf9e682de", "name": "/usr/lib/x86_64-linux-gnu/liblmdb.so.0.0.0", "type": "file" }, { - "bom-ref": "b9828d9e2cbc78ac", + "bom-ref": "6ecb99a0597e24a1", "name": "/usr/lib/x86_64-linux-gnu/liblsan.so.0.0.0", "type": "file" }, { - "bom-ref": "4e36ed50eb39c3c6", + "bom-ref": "33411e08f7e60a30", "name": "/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.2", "type": "file" }, { - "bom-ref": "e0537e71b584c62b", + "bom-ref": "5bcc19e8eeab03d5", "name": "/usr/lib/x86_64-linux-gnu/liblz4.so.1.9.4", "type": "file" }, { - "bom-ref": "e56632f31be965a4", + "bom-ref": "12f5d64f7bfad452", "name": "/usr/lib/x86_64-linux-gnu/liblzma.a", "type": "file" }, { - "bom-ref": "4c267e6e62270450", + "bom-ref": "512d46111d5cf5f2", "name": "/usr/lib/x86_64-linux-gnu/liblzma.so.5.4.5", "type": "file" }, { - "bom-ref": "67083c6cf553adf1", + "bom-ref": "4541158b96c96653", "name": "/usr/lib/x86_64-linux-gnu/libm-2.39.a", "type": "file" }, { - "bom-ref": "164640b52112472c", + "bom-ref": "9e3f8fe3bfc993be", "name": "/usr/lib/x86_64-linux-gnu/libm.a", "type": "file" }, { - "bom-ref": "e574b082a079f9c5", + "bom-ref": "08484c164dcf67df", "name": "/usr/lib/x86_64-linux-gnu/libm.so", "type": "file" }, { - "bom-ref": "fa3e65bf478bbbd5", + "bom-ref": "7cf786755f2b04ab", "name": "/usr/lib/x86_64-linux-gnu/libm.so.6", "type": "file" }, { - "bom-ref": "372d48e481e520a5", + "bom-ref": "6ff94c570f0d04d3", "name": "/usr/lib/x86_64-linux-gnu/libmagic.so.1.0.0", "type": "file" }, { - "bom-ref": "62ce5c15b95c7010", + "bom-ref": "26d11228111662ee", "name": "/usr/lib/x86_64-linux-gnu/libmana.a", "type": "file" }, { - "bom-ref": "00a236ab55687b26", + "bom-ref": "7f11e66f5022eecc", "name": "/usr/lib/x86_64-linux-gnu/libmana.so.1.0.50.0", "type": "file" }, { - "bom-ref": "76e17b149a69b3e9", + "bom-ref": "efa1b06896a7ad0b", "name": "/usr/lib/x86_64-linux-gnu/libmcheck.a", "type": "file" }, { - "bom-ref": "255c02474dd79640", + "bom-ref": "9f53e1056db9612a", "name": "/usr/lib/x86_64-linux-gnu/libmd.a", "type": "file" }, { - "bom-ref": "0bc285ec80bb396f", + "bom-ref": "885d3e2f11168e35", "name": "/usr/lib/x86_64-linux-gnu/libmd.so.0.1.0", "type": "file" }, { - "bom-ref": "f556eda3eba33661", + "bom-ref": "3756ab75c3aeacab", "name": "/usr/lib/x86_64-linux-gnu/libmemenv.a", "type": "file" }, { - "bom-ref": "ab57968422097107", + "bom-ref": "6857c45425ffb3b5", "name": "/usr/lib/x86_64-linux-gnu/libmemusage.so", "type": "file" }, { - "bom-ref": "d496f3d0d0b8359c", + "bom-ref": "35a7729ed48a47fe", "name": "/usr/lib/x86_64-linux-gnu/libmenu.a", "type": "file" }, { - "bom-ref": "9565f94f13cb27d6", + "bom-ref": "76f693d291e0308f", "name": "/usr/lib/x86_64-linux-gnu/libmenu.so.6.4", "type": "file" }, { - "bom-ref": "48f40027bc4192bd", + "bom-ref": "2297d75f31eaf9bb", "name": "/usr/lib/x86_64-linux-gnu/libmenuw.a", "type": "file" }, { - "bom-ref": "25f7b06888b576f0", + "bom-ref": "ea008a770afdb76e", "name": "/usr/lib/x86_64-linux-gnu/libmenuw.so.6.4", "type": "file" }, { - "bom-ref": "c026e2432c53973f", + "bom-ref": "962191ae3feb2841", "name": "/usr/lib/x86_64-linux-gnu/libmlx4.a", "type": "file" }, { - "bom-ref": "7cdee97433d1ddb7", + "bom-ref": "cd3996e11e2030dd", "name": "/usr/lib/x86_64-linux-gnu/libmlx4.so.1.0.50.0", "type": "file" }, { - "bom-ref": "d0addad637218661", + "bom-ref": "f32de195c775f9bb", "name": "/usr/lib/x86_64-linux-gnu/libmlx5.a", "type": "file" }, { - "bom-ref": "7ac0e642d9132262", + "bom-ref": "8e2e40450bef3724", "name": "/usr/lib/x86_64-linux-gnu/libmlx5.so.1.24.50.0", "type": "file" }, { - "bom-ref": "3f436a569b60e12b", + "bom-ref": "a23ac38805799129", "name": "/usr/lib/x86_64-linux-gnu/libmount.so.1.1.0", "type": "file" }, { - "bom-ref": "093836715ebe6b38", + "bom-ref": "273f5903592ac3b6", "name": "/usr/lib/x86_64-linux-gnu/libmp3lame.so.0.0.0", "type": "file" }, { - "bom-ref": "72604be6791952ce", + "bom-ref": "78f47259ebbd1d8f", "name": "/usr/lib/x86_64-linux-gnu/libmpc.so.3.3.1", "type": "file" }, { - "bom-ref": "3e2c87c62390ba4b", + "bom-ref": "0c63a3139557c052", "name": "/usr/lib/x86_64-linux-gnu/libmpfr.so.6.2.1", "type": "file" }, { - "bom-ref": "3033b0b7ca7818d2", + "bom-ref": "c56969e10c939f04", "name": "/usr/lib/x86_64-linux-gnu/libmpg123.so.0.48.2", "type": "file" }, { - "bom-ref": "0067f566d2a84ee9", + "bom-ref": "7e7f10c6d1ca2087", "name": "/usr/lib/x86_64-linux-gnu/libmthca-rdmav34.a", "type": "file" }, { - "bom-ref": "a33b58332f65335c", + "bom-ref": "f0103c02f2ea845e", "name": "/usr/lib/x86_64-linux-gnu/libmvec.a", "type": "file" }, { - "bom-ref": "b3a3e8e9b5946994", + "bom-ref": "6e45dc679a81af02", "name": "/usr/lib/x86_64-linux-gnu/libmvec.so.1", "type": "file" }, { - "bom-ref": "f56ded4860944e69", - "name": "/usr/lib/x86_64-linux-gnu/libnccl.so.2.30.4", + "bom-ref": "42b3a0470c1c9e64", + "name": "/usr/lib/x86_64-linux-gnu/libnccl.so.2.30.7", "type": "file" }, { - "bom-ref": "7d3a30857af53d97", + "bom-ref": "c8c55b154ff8b3cc", "name": "/usr/lib/x86_64-linux-gnu/libnccl_device.bc", "type": "file" }, { - "bom-ref": "50f1847502f49933", - "name": "/usr/lib/x86_64-linux-gnu/libnccl_static.a", - "type": "file" - }, - { - "bom-ref": "3e51c34327354a48", + "bom-ref": "db94b1a20c085b96", "name": "/usr/lib/x86_64-linux-gnu/libncurses++.a", "type": "file" }, { - "bom-ref": "4215ab0357ecdd3b", + "bom-ref": "c930ce0a8e139b35", "name": "/usr/lib/x86_64-linux-gnu/libncurses++w.a", "type": "file" }, { - "bom-ref": "88e6a70de73e5bff", + "bom-ref": "59e4f9b8027c0501", "name": "/usr/lib/x86_64-linux-gnu/libncurses.a", "type": "file" }, { - "bom-ref": "0ac35686339a215b", + "bom-ref": "610d18ffc3c08e71", "name": "/usr/lib/x86_64-linux-gnu/libncurses.so", "type": "file" }, { - "bom-ref": "cf26dc183512862e", + "bom-ref": "ae70b8bab204087b", "name": "/usr/lib/x86_64-linux-gnu/libncurses.so.6.4", "type": "file" }, { - "bom-ref": "476b73f9f54ae114", + "bom-ref": "c09943ba2cd99d1a", "name": "/usr/lib/x86_64-linux-gnu/libncursesw.a", "type": "file" }, { - "bom-ref": "e386d03d2bfdbfe4", + "bom-ref": "d9d6a7674fa88802", "name": "/usr/lib/x86_64-linux-gnu/libncursesw.so", "type": "file" }, { - "bom-ref": "6eaa2476db7849b1", + "bom-ref": "5f0e779ca7ff7743", "name": "/usr/lib/x86_64-linux-gnu/libncursesw.so.6.4", "type": "file" }, { - "bom-ref": "6ec7ea5ac5129489", + "bom-ref": "20ccc4976bffe06b", "name": "/usr/lib/x86_64-linux-gnu/libnettle.so.8.8", "type": "file" }, { - "bom-ref": "f5f12d4a41b1f6de", + "bom-ref": "6465794f83f6d561", "name": "/usr/lib/x86_64-linux-gnu/libnghttp2.so.14.26.0", "type": "file" }, { - "bom-ref": "f9224140b506ac6b", + "bom-ref": "9bd2bcbd776b3f0c", "name": "/usr/lib/x86_64-linux-gnu/libnl-3.a", "type": "file" }, { - "bom-ref": "031cae03dfe8532f", + "bom-ref": "0c8bf0893074cf58", "name": "/usr/lib/x86_64-linux-gnu/libnl-3.so.200.26.0", "type": "file" }, { - "bom-ref": "5e098de6531abab1", + "bom-ref": "118dd22d0d5d10ba", "name": "/usr/lib/x86_64-linux-gnu/libnl-route-3.a", "type": "file" }, { - "bom-ref": "957c6371fd338d58", + "bom-ref": "63003b8b17bf6b7f", "name": "/usr/lib/x86_64-linux-gnu/libnl-route-3.so.200.26.0", "type": "file" }, { - "bom-ref": "92f2f5793e433bdf", + "bom-ref": "d01adf1060886b39", "name": "/usr/lib/x86_64-linux-gnu/libnorm.a", "type": "file" }, { - "bom-ref": "a1d216c4d4afdecf", + "bom-ref": "c80bcede5aa066c1", "name": "/usr/lib/x86_64-linux-gnu/libnorm.so.1", "type": "file" }, { - "bom-ref": "481e20485289a9e8", + "bom-ref": "f64ca71b05fa6de2", "name": "/usr/lib/x86_64-linux-gnu/libnpth.so.0.1.2", "type": "file" }, { - "bom-ref": "447bd51077acb7a6", + "bom-ref": "a62059dd310bf964", "name": "/usr/lib/x86_64-linux-gnu/libnsl.so.1", "type": "file" }, { - "bom-ref": "5215bcbfbff05183", + "bom-ref": "bf6c999fa40737c1", "name": "/usr/lib/x86_64-linux-gnu/libnss_compat.so.2", "type": "file" }, { - "bom-ref": "b236643addaa3d5e", + "bom-ref": "94dfb20d62f14b4c", "name": "/usr/lib/x86_64-linux-gnu/libnss_dns.so.2", "type": "file" }, { - "bom-ref": "5a663a38491db930", + "bom-ref": "281c74c3b6b0b0fa", "name": "/usr/lib/x86_64-linux-gnu/libnss_files.so.2", "type": "file" }, { - "bom-ref": "4b3b44bfc88b12a2", + "bom-ref": "10d219318a89f028", "name": "/usr/lib/x86_64-linux-gnu/libnss_hesiod.so.2", "type": "file" }, { - "bom-ref": "e6f7777d14e0855b", + "bom-ref": "cc7fe43d17748816", "name": "/usr/lib/x86_64-linux-gnu/libnuma.a", "type": "file" }, { - "bom-ref": "e0ee8a23e429cc6d", + "bom-ref": "721ae06eb19b26ba", "name": "/usr/lib/x86_64-linux-gnu/libnuma.so.1.0.0", "type": "file" }, { - "bom-ref": "97bea053e68005b5", + "bom-ref": "033e1e84c665860b", "name": "/usr/lib/x86_64-linux-gnu/libobjc.so.4.0.0", "type": "file" }, { - "bom-ref": "1100f026d1e490d8", + "bom-ref": "4e15bab92ee9de26", "name": "/usr/lib/x86_64-linux-gnu/libobjc_gc.so.4.0.0", "type": "file" }, { - "bom-ref": "6c5d76c4f43009bb", + "bom-ref": "12a0ce3aecba3ca1", "name": "/usr/lib/x86_64-linux-gnu/libocrdma-rdmav34.a", "type": "file" }, { - "bom-ref": "6434f4c9ebe7de9a", + "bom-ref": "759123ad05ca2e5c", "name": "/usr/lib/x86_64-linux-gnu/libogg.so.0.8.5", "type": "file" }, { - "bom-ref": "8d7914fd5322125f", + "bom-ref": "13c01f5db77b3116", "name": "/usr/lib/x86_64-linux-gnu/libonig.so.5.4.0", "type": "file" }, { - "bom-ref": "782d71134a567421", + "bom-ref": "30456688a2fd6933", "name": "/usr/lib/x86_64-linux-gnu/libopcodes-2.42-system.so", "type": "file" }, { - "bom-ref": "dd61cbbc22187fda", + "bom-ref": "bd8e2cc53526ffe0", "name": "/usr/lib/x86_64-linux-gnu/libopencore-amrnb.so.0.0.5", "type": "file" }, { - "bom-ref": "cda9315e3973ee77", + "bom-ref": "4512f7fb7f5304cd", "name": "/usr/lib/x86_64-linux-gnu/libopencore-amrwb.so.0.0.5", "type": "file" }, { - "bom-ref": "13ffa2332a685ff6", + "bom-ref": "1e08637c2da7cbf8", "name": "/usr/lib/x86_64-linux-gnu/libopus.so.0.9.0", "type": "file" }, { - "bom-ref": "6710a9cef2ddd0df", + "bom-ref": "2019ff093c37cc61", "name": "/usr/lib/x86_64-linux-gnu/libp11-kit.so.0.3.1", "type": "file" }, { - "bom-ref": "80db3609986384ad", + "bom-ref": "e41167f0bc4e3c5f", "name": "/usr/lib/x86_64-linux-gnu/libpam.so.0.85.1", "type": "file" }, { - "bom-ref": "01b9777fe101c93e", + "bom-ref": "4938194173a2aa60", "name": "/usr/lib/x86_64-linux-gnu/libpam_misc.so.0.82.1", "type": "file" }, { - "bom-ref": "35240a4644977533", + "bom-ref": "33a17d8e8f18f729", "name": "/usr/lib/x86_64-linux-gnu/libpamc.so.0.82.1", "type": "file" }, { - "bom-ref": "94d42520097f30fe", + "bom-ref": "4afd14d3f9a8c498", "name": "/usr/lib/x86_64-linux-gnu/libpanel.a", "type": "file" }, { - "bom-ref": "904803e7cf07a649", + "bom-ref": "7013c3504e563fa8", "name": "/usr/lib/x86_64-linux-gnu/libpanel.so.6.4", "type": "file" }, { - "bom-ref": "9a9b6037337bb40b", + "bom-ref": "4d322d2c23a58f29", "name": "/usr/lib/x86_64-linux-gnu/libpanelw.a", "type": "file" }, { - "bom-ref": "9bc3339d4689b0b1", + "bom-ref": "db6dea3aae305c17", "name": "/usr/lib/x86_64-linux-gnu/libpanelw.so.6.4", "type": "file" }, { - "bom-ref": "3613cfdee789c612", + "bom-ref": "95dc3e91b3b6c3fc", "name": "/usr/lib/x86_64-linux-gnu/libpango-1.0.so.0.5200.1", "type": "file" }, { - "bom-ref": "505b575d5ec3bb93", + "bom-ref": "e7d20b0e23847571", "name": "/usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0.5200.1", "type": "file" }, { - "bom-ref": "e7a663af6dc3a6c6", + "bom-ref": "da9f7ab3e8ba1ac4", "name": "/usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0.5200.1", "type": "file" }, { - "bom-ref": "a7f2e8da9088ede4", + "bom-ref": "148adddfeb714e46", "name": "/usr/lib/x86_64-linux-gnu/libpathplan.so.4.0.0", "type": "file" }, { - "bom-ref": "147b834b4d53dbe6", + "bom-ref": "66777609faaf3d15", "name": "/usr/lib/x86_64-linux-gnu/libpci.so.3.10.0", "type": "file" }, { - "bom-ref": "333d1087ddf766c8", + "bom-ref": "d794ea7b21293c66", "name": "/usr/lib/x86_64-linux-gnu/libpcprofile.so", "type": "file" }, { - "bom-ref": "bb2ca0035c8e4034", + "bom-ref": "e18ca8313aa1821a", "name": "/usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.11.2", "type": "file" }, { - "bom-ref": "c5e86646e0a9efa8", + "bom-ref": "a94e897d7dc56865", "name": "/usr/lib/x86_64-linux-gnu/libperl.so.5.38.2", "type": "file" }, { - "bom-ref": "7ee42371a0a8d6e0", + "bom-ref": "240ad67a611dd36a", "name": "/usr/lib/x86_64-linux-gnu/libpfm.so.4.13.0", "type": "file" }, { - "bom-ref": "ce97f4cf993cf353", + "bom-ref": "e8ded0be000f676d", "name": "/usr/lib/x86_64-linux-gnu/libpgm-5.3.so.0.0.128", "type": "file" }, { - "bom-ref": "c9865ea59512a3a4", + "bom-ref": "9435766b980ea84a", "name": "/usr/lib/x86_64-linux-gnu/libpgm.a", "type": "file" }, { - "bom-ref": "0f251606dd3334bd", + "bom-ref": "156aea21d115a00b", "name": "/usr/lib/x86_64-linux-gnu/libpgm.la", "type": "file" }, { - "bom-ref": "3ca49340f811587d", + "bom-ref": "c557361c6b80acc7", "name": "/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.42.2", "type": "file" }, { - "bom-ref": "935734f10520154f", + "bom-ref": "e5c671553f18640f", "name": "/usr/lib/x86_64-linux-gnu/libpkgconf.so.3.0.0", "type": "file" }, { - "bom-ref": "88ea62d676a53609", + "bom-ref": "e7f626e44d685790", "name": "/usr/lib/x86_64-linux-gnu/libpmi2.a", "type": "file" }, { - "bom-ref": "39857d95b161db6d", + "bom-ref": "c977c694f2e22908", "name": "/usr/lib/x86_64-linux-gnu/libpmi2.la", "type": "file" }, { - "bom-ref": "ff6e5322b2f01509", + "bom-ref": "d16d531b1e660d28", "name": "/usr/lib/x86_64-linux-gnu/libpmi2.so.0.0.0", "type": "file" }, { - "bom-ref": "4dc831355b08591a", + "bom-ref": "2a13ef5e9afc50d4", "name": "/usr/lib/x86_64-linux-gnu/libpng16.a", "type": "file" }, { - "bom-ref": "e210a6adeca181ae", + "bom-ref": "8c8eac1dc67b6540", "name": "/usr/lib/x86_64-linux-gnu/libpng16.so.16.43.0", "type": "file" }, { - "bom-ref": "ab9e57c582122d14", + "bom-ref": "028645229ae73672", "name": "/usr/lib/x86_64-linux-gnu/libproc2.so.0.0.2", "type": "file" }, { - "bom-ref": "4a06179219c4f2e8", + "bom-ref": "d3084c0e11eef9fe", "name": "/usr/lib/x86_64-linux-gnu/libprotobuf-lite.a", "type": "file" }, { - "bom-ref": "65e54a3448935fbb", + "bom-ref": "e60c1162dee1f70d", "name": "/usr/lib/x86_64-linux-gnu/libprotobuf-lite.so.32.0.12", "type": "file" }, { - "bom-ref": "e64f17a960c87d8d", + "bom-ref": "21ed9f4792def887", "name": "/usr/lib/x86_64-linux-gnu/libprotobuf.a", "type": "file" }, { - "bom-ref": "d8d14aa6b160eac5", + "bom-ref": "c45ef0d7396ca64b", "name": "/usr/lib/x86_64-linux-gnu/libprotobuf.so.32.0.12", "type": "file" }, { - "bom-ref": "cc3a1f0d61b1e810", + "bom-ref": "f7af9be991a86ec6", "name": "/usr/lib/x86_64-linux-gnu/libprotoc.so.32.0.12", "type": "file" }, { - "bom-ref": "909bcb4eb93ccc95", + "bom-ref": "b53dceace337c2e7", "name": "/usr/lib/x86_64-linux-gnu/libprotokit.a", "type": "file" }, { - "bom-ref": "0d336478f86b7caf", + "bom-ref": "16d6c3aecc1d6a40", "name": "/usr/lib/x86_64-linux-gnu/libpsl.so.5.3.4", "type": "file" }, { - "bom-ref": "96222ddc681717c9", + "bom-ref": "e2f8bccd3fb5c4cb", "name": "/usr/lib/x86_64-linux-gnu/libpsx.so.2.66", "type": "file" }, { - "bom-ref": "80eb85e113057e3a", + "bom-ref": "7463fc0bb5b02ea0", "name": "/usr/lib/x86_64-linux-gnu/libpthread.a", "type": "file" }, { - "bom-ref": "7acc1ed48ef8f45d", + "bom-ref": "b8ec05cecebfbf27", "name": "/usr/lib/x86_64-linux-gnu/libpthread.so.0", "type": "file" }, { - "bom-ref": "a4a8567c12a47df9", + "bom-ref": "2b007e93f99a9b3f", "name": "/usr/lib/x86_64-linux-gnu/libpthread_nonshared.a", "type": "file" }, { - "bom-ref": "43e29fba99310655", + "bom-ref": "c85b9c49f003cf01", "name": "/usr/lib/x86_64-linux-gnu/libpython3.12.so.1.0", "type": "file" }, { - "bom-ref": "71eb0091e6a0a548", + "bom-ref": "ac9af22e3a7aa0e6", "name": "/usr/lib/x86_64-linux-gnu/libqedr-rdmav34.a", "type": "file" }, { - "bom-ref": "6ce2997c8c63ac5e", + "bom-ref": "bf7783c5d3fa1793", "name": "/usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0", "type": "file" }, { - "bom-ref": "d51132e11d1a5edd", + "bom-ref": "d3952e3cb25e4e6b", "name": "/usr/lib/x86_64-linux-gnu/libre2.a", "type": "file" }, { - "bom-ref": "e44b9accc5a74c2a", + "bom-ref": "471273079cdf5d10", "name": "/usr/lib/x86_64-linux-gnu/libre2.so.10.0.0", "type": "file" }, { - "bom-ref": "694201bc6a4c573b", + "bom-ref": "48553ac53c7c014e", "name": "/usr/lib/x86_64-linux-gnu/libreadline.so.8.2", "type": "file" }, { - "bom-ref": "14bd4763e62283ae", + "bom-ref": "1a16e6d9925cf43c", "name": "/usr/lib/x86_64-linux-gnu/libresolv.a", "type": "file" }, { - "bom-ref": "0eb7f4b3e235ba87", + "bom-ref": "ed9ec8e488beeec9", "name": "/usr/lib/x86_64-linux-gnu/libresolv.so.2", "type": "file" }, { - "bom-ref": "66f000ae47b16b0d", + "bom-ref": "f9f65aa4043870f3", "name": "/usr/lib/x86_64-linux-gnu/librt.a", "type": "file" }, { - "bom-ref": "11e81526646a0f62", + "bom-ref": "ea76ef0aa48d9398", "name": "/usr/lib/x86_64-linux-gnu/librt.so.1", "type": "file" }, { - "bom-ref": "66a87c69e5f2e57f", + "bom-ref": "7ac46da22242d214", "name": "/usr/lib/x86_64-linux-gnu/librtmp.so.1", "type": "file" }, { - "bom-ref": "bcd590512fa718d3", + "bom-ref": "28e4c8bf319cea99", "name": "/usr/lib/x86_64-linux-gnu/librxe-rdmav34.a", "type": "file" }, { - "bom-ref": "61fc0150eb8b730e", + "bom-ref": "323d55da0d6737e9", "name": "/usr/lib/x86_64-linux-gnu/libsasl2.so.2.0.25", "type": "file" }, { - "bom-ref": "6574a4a2ce617c06", + "bom-ref": "e7561f864d3a6e2c", "name": "/usr/lib/x86_64-linux-gnu/libseccomp.so.2.5.5", "type": "file" }, { - "bom-ref": "508584b4f015a81f", + "bom-ref": "3b04b1807c0ee8cd", "name": "/usr/lib/x86_64-linux-gnu/libselinux.so.1", "type": "file" }, { - "bom-ref": "dbb66055055c6407", + "bom-ref": "064f04e6cd753539", "name": "/usr/lib/x86_64-linux-gnu/libsemanage.so.2", "type": "file" }, { - "bom-ref": "6082df1d28c3ce28", + "bom-ref": "b630d8d392b95812", "name": "/usr/lib/x86_64-linux-gnu/libsepol.so.2", "type": "file" }, { - "bom-ref": "4ac01df8791e6e2c", + "bom-ref": "c8af1f44b8df5782", "name": "/usr/lib/x86_64-linux-gnu/libsframe.so.1.0.0", "type": "file" }, { - "bom-ref": "8d4ad7a87e22e300", + "bom-ref": "5f7b3b99ea3a4042", "name": "/usr/lib/x86_64-linux-gnu/libsharpyuv.so.0.0.1", "type": "file" }, { - "bom-ref": "abaad859f7978c9a", + "bom-ref": "15d61c53df1fbcdc", "name": "/usr/lib/x86_64-linux-gnu/libsiw-rdmav34.a", "type": "file" }, { - "bom-ref": "2f7afe7927a3a901", + "bom-ref": "d1b83d2f2c3a495c", "name": "/usr/lib/x86_64-linux-gnu/libslurm.so.40.0.0", "type": "file" }, { - "bom-ref": "40e506e4e42b2c78", + "bom-ref": "17c3423996a0f8c2", "name": "/usr/lib/x86_64-linux-gnu/libsmartcols.so.1.1.0", "type": "file" }, { - "bom-ref": "0a237466b3682b9c", + "bom-ref": "2322e11c61542e5a", "name": "/usr/lib/x86_64-linux-gnu/libsnappy.a", "type": "file" }, { - "bom-ref": "8d61c623f9a2a5d0", + "bom-ref": "545d10b06cb1468e", "name": "/usr/lib/x86_64-linux-gnu/libsnappy.so.1.1.10", "type": "file" }, { - "bom-ref": "f42585acbf23447b", + "bom-ref": "f1e60100d6c37125", "name": "/usr/lib/x86_64-linux-gnu/libsndfile.so.1.0.37", "type": "file" }, { - "bom-ref": "04c890a4e4b4f24d", + "bom-ref": "40e83a93fd40753b", "name": "/usr/lib/x86_64-linux-gnu/libsodium.a", "type": "file" }, { - "bom-ref": "a4393ce56b75a3f0", + "bom-ref": "74a738f1ed4a21b0", "name": "/usr/lib/x86_64-linux-gnu/libsodium.so.23.3.0", "type": "file" }, { - "bom-ref": "784505c748545b69", + "bom-ref": "e0e99205598d6a2b", "name": "/usr/lib/x86_64-linux-gnu/libsource-highlight.so.4.0.1", "type": "file" }, { - "bom-ref": "3e25ace4a6c44d6a", + "bom-ref": "2d24e2c046c2181c", "name": "/usr/lib/x86_64-linux-gnu/libsox.so.3.0.0", "type": "file" }, { - "bom-ref": "b3975460dce97454", + "bom-ref": "7aa19600ada12481", "name": "/usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6", "type": "file" }, { - "bom-ref": "cf9d9a625f4e93ec", + "bom-ref": "4796187618718f7e", "name": "/usr/lib/x86_64-linux-gnu/libss.so.2.0", "type": "file" }, { - "bom-ref": "090f301602bbceb2", + "bom-ref": "29566a9d619f78b5", "name": "/usr/lib/x86_64-linux-gnu/libssh.so.4.9.6", "type": "file" }, { - "bom-ref": "ea96fe381257d494", + "bom-ref": "01b5756b46628d82", "name": "/usr/lib/x86_64-linux-gnu/libssl.so.3", "type": "file" }, { - "bom-ref": "59691433364bf926", + "bom-ref": "2b9bca46e1284bdc", "name": "/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33", "type": "file" }, { - "bom-ref": "403a07cff5aca194", + "bom-ref": "dc8b969d46d71eaa", "name": "/usr/lib/x86_64-linux-gnu/libsystemd.so.0.38.0", "type": "file" }, { - "bom-ref": "d6a3858eaebfbacf", + "bom-ref": "f5118af1580be9e9", "name": "/usr/lib/x86_64-linux-gnu/libtasn1.so.6.6.3", "type": "file" }, { - "bom-ref": "027601c9189593fb", + "bom-ref": "6a0977e55bd46da2", "name": "/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4.5.16", "type": "file" }, { - "bom-ref": "a71c2044603101ea", + "bom-ref": "2587ef3ba4691657", "name": "/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal_debug.so.4.5.16", "type": "file" }, { - "bom-ref": "7f57aa69925c0834", + "bom-ref": "20d1b14943461712", "name": "/usr/lib/x86_64-linux-gnu/libthai.so.0.3.1", "type": "file" }, { - "bom-ref": "f2391c47015712b6", + "bom-ref": "67aad0c8e6f1a714", "name": "/usr/lib/x86_64-linux-gnu/libthread_db.so.1", "type": "file" }, { - "bom-ref": "78c0c1d48473855b", + "bom-ref": "a93ea96eaca3db45", "name": "/usr/lib/x86_64-linux-gnu/libtic.a", "type": "file" }, { - "bom-ref": "a07f54231b796be9", + "bom-ref": "8bbeaf18a5bc422b", "name": "/usr/lib/x86_64-linux-gnu/libtic.so.6.4", "type": "file" }, { - "bom-ref": "97b87d8ed32fc342", + "bom-ref": "bf36353802c86c3c", "name": "/usr/lib/x86_64-linux-gnu/libtiff.so.6.0.1", "type": "file" }, { - "bom-ref": "56b409e76f82fa87", + "bom-ref": "80e0b81c6712d3f1", "name": "/usr/lib/x86_64-linux-gnu/libtinfo.a", "type": "file" }, { - "bom-ref": "02d8924560449076", + "bom-ref": "e8bd3bb3a139c620", "name": "/usr/lib/x86_64-linux-gnu/libtinfo.so.6.4", "type": "file" }, { - "bom-ref": "a72cae3acc2fb677", + "bom-ref": "0429f4e868274f4e", "name": "/usr/lib/x86_64-linux-gnu/libtsan.so.2.0.0", "type": "file" }, { - "bom-ref": "bb6f09e441b1bd1b", + "bom-ref": "d188a96b2436b68e", "name": "/usr/lib/x86_64-linux-gnu/libubsan.so.1.0.0", "type": "file" }, { - "bom-ref": "6007f13572493231", + "bom-ref": "900e04ad04d0287f", "name": "/usr/lib/x86_64-linux-gnu/libudev.so.1.7.8", "type": "file" }, { - "bom-ref": "fc9a5c638076c037", + "bom-ref": "f44c7c123c2aaed5", "name": "/usr/lib/x86_64-linux-gnu/libunistring.so.5.0.0", "type": "file" }, { - "bom-ref": "2c7f00922db83a6d", + "bom-ref": "73023ddc244c45a7", "name": "/usr/lib/x86_64-linux-gnu/libunwind-coredump.a", "type": "file" }, { - "bom-ref": "c883d9985112f520", + "bom-ref": "dffd22a70092177a", "name": "/usr/lib/x86_64-linux-gnu/libunwind-coredump.so.0.0.0", "type": "file" }, { - "bom-ref": "0c54169f85a736de", + "bom-ref": "596a774a8fa24390", "name": "/usr/lib/x86_64-linux-gnu/libunwind-ptrace.a", "type": "file" }, { - "bom-ref": "2fdc894f4832d9a0", + "bom-ref": "1dc415cc5fa6ddd2", "name": "/usr/lib/x86_64-linux-gnu/libunwind-ptrace.so.0.0.0", "type": "file" }, { - "bom-ref": "f8e9eeabb658e9e3", + "bom-ref": "c75fbe1b48390881", "name": "/usr/lib/x86_64-linux-gnu/libunwind-x86_64.a", "type": "file" }, { - "bom-ref": "a039fcce0bb29fe9", + "bom-ref": "64a75f714c6ca03f", "name": "/usr/lib/x86_64-linux-gnu/libunwind-x86_64.so.8.0.1", "type": "file" }, { - "bom-ref": "0a42d2228937f4c8", + "bom-ref": "ae6cf4b10143c886", "name": "/usr/lib/x86_64-linux-gnu/libunwind.a", "type": "file" }, { - "bom-ref": "82af558a7b240212", + "bom-ref": "4436de037043002c", "name": "/usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1", "type": "file" }, { - "bom-ref": "eb11f8c65ebf569a", + "bom-ref": "53bcb6696af59488", "name": "/usr/lib/x86_64-linux-gnu/libutil.a", "type": "file" }, { - "bom-ref": "f190acdfc02d0040", + "bom-ref": "ca860b4ddd3e67d2", "name": "/usr/lib/x86_64-linux-gnu/libutil.so.1", "type": "file" }, { - "bom-ref": "fae13486cfa1f194", + "bom-ref": "949bd54747dc12c6", "name": "/usr/lib/x86_64-linux-gnu/libuuid.so.1.3.0", "type": "file" }, { - "bom-ref": "419e56350b9dd321", + "bom-ref": "e37b6c8f5d47ab9f", "name": "/usr/lib/x86_64-linux-gnu/libvmw_pvrdma-rdmav34.a", "type": "file" }, { - "bom-ref": "a13e86302351a08f", + "bom-ref": "534ce3f3b6a27f79", "name": "/usr/lib/x86_64-linux-gnu/libvorbis.so.0.4.9", "type": "file" }, { - "bom-ref": "6e79c196119256ad", + "bom-ref": "f0561588fc00a6fb", "name": "/usr/lib/x86_64-linux-gnu/libvorbisenc.so.2.0.12", "type": "file" }, { - "bom-ref": "9a9591ad77119e0f", + "bom-ref": "2dd061622d82ce0d", "name": "/usr/lib/x86_64-linux-gnu/libvorbisfile.so.3.3.8", "type": "file" }, { - "bom-ref": "def3fad8145597ba", + "bom-ref": "9f1380840dde980c", "name": "/usr/lib/x86_64-linux-gnu/libwavpack.so.1.2.5", "type": "file" }, { - "bom-ref": "347f18b4a6c8d46f", + "bom-ref": "d5763de90689eb3d", "name": "/usr/lib/x86_64-linux-gnu/libwebp.so.7.1.8", "type": "file" }, { - "bom-ref": "913788e651f766e7", + "bom-ref": "24fd49eb1041353d", "name": "/usr/lib/x86_64-linux-gnu/libxcb-render.so.0.0.0", "type": "file" }, { - "bom-ref": "a9a5a6625b713c8d", + "bom-ref": "e673b8c04ee60c93", "name": "/usr/lib/x86_64-linux-gnu/libxcb-shm.so.0.0.0", "type": "file" }, { - "bom-ref": "5b62037206eeddc7", + "bom-ref": "f60011e8698018ed", "name": "/usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0", "type": "file" }, { - "bom-ref": "3f6bdda7fbcaf976", + "bom-ref": "64f62c0ae0b6a12c", "name": "/usr/lib/x86_64-linux-gnu/libxml2.a", "type": "file" }, { - "bom-ref": "5ee25afdff684b59", + "bom-ref": "fc4c963052d6ea6b", "name": "/usr/lib/x86_64-linux-gnu/libxml2.so.2.9.14", "type": "file" }, { - "bom-ref": "dc64dfbddd82c158", + "bom-ref": "ed224d7159b5c292", "name": "/usr/lib/x86_64-linux-gnu/libxxhash.so.0.8.2", "type": "file" }, { - "bom-ref": "99e1de0290ef8f7b", + "bom-ref": "002bc00daadc1c95", "name": "/usr/lib/x86_64-linux-gnu/libyaml-0.so.2.0.9", "type": "file" }, { - "bom-ref": "10778e7e3ac5ed54", + "bom-ref": "b63e2bda397e4f86", "name": "/usr/lib/x86_64-linux-gnu/libz.a", "type": "file" }, { - "bom-ref": "690c5a775e96e619", + "bom-ref": "f65d12acf252643b", "name": "/usr/lib/x86_64-linux-gnu/libz.so.1.3", "type": "file" }, { - "bom-ref": "4c6a3f223e84a600", + "bom-ref": "88d83d2c1a99aaaa", "name": "/usr/lib/x86_64-linux-gnu/libz3.so.4", "type": "file" }, { - "bom-ref": "c24973f0351ed31f", + "bom-ref": "1a9e7fb36561c57d", "name": "/usr/lib/x86_64-linux-gnu/libzmq.a", "type": "file" }, { - "bom-ref": "6c25b1a675219339", + "bom-ref": "391664c8822d0bf7", "name": "/usr/lib/x86_64-linux-gnu/libzmq.so.5.2.5", "type": "file" }, { - "bom-ref": "767cfcc7af6d7145", + "bom-ref": "059b797b0a1034a7", "name": "/usr/lib/x86_64-linux-gnu/libzstd.a", "type": "file" }, { - "bom-ref": "1368f9740dba0eab", + "bom-ref": "5e77f967b09c7745", "name": "/usr/lib/x86_64-linux-gnu/libzstd.so.1.5.5", "type": "file" }, { - "bom-ref": "62719244aeade87d", + "bom-ref": "50c12605cf447abc", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/cmake/nvshmem/NVSHMEMConfig.cmake", "type": "file" }, { - "bom-ref": "4d780b3a4b31fa6a", + "bom-ref": "bd9d41f52b16aa77", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/cmake/nvshmem/NVSHMEMDeviceTargets-release.cmake", "type": "file" }, { - "bom-ref": "25a29cc596da3fec", + "bom-ref": "6a435b08f01e5ee9", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/cmake/nvshmem/NVSHMEMDeviceTargets.cmake", "type": "file" }, { - "bom-ref": "810211c0003f3a2d", + "bom-ref": "61d26f44e7761f80", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/cmake/nvshmem/NVSHMEMTargets-release.cmake", "type": "file" }, { - "bom-ref": "76198b16de3efb63", + "bom-ref": "5c18f96f9fffb186", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/cmake/nvshmem/NVSHMEMTargets.cmake", "type": "file" }, { - "bom-ref": "66757d2c58c8e3ca", + "bom-ref": "09657990c86c0b7b", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/cmake/nvshmem/NVSHMEMVersion.cmake", "type": "file" }, { - "bom-ref": "a5c1874cc943cbbb", - "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device.bc", + "bom-ref": "50e6dca1c83b18ee", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device.ltoir.fatbin", + "type": "file" + }, + { + "bom-ref": "427e92b3e5ee678b", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device_sm_100.ltoir", + "type": "file" + }, + { + "bom-ref": "3a56f9add9f105bc", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device_sm_120.ltoir", + "type": "file" + }, + { + "bom-ref": "5711fc907cbfa8ed", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device_sm_75.bc", + "type": "file" + }, + { + "bom-ref": "218bfd0b5000b7d1", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device_sm_75.ltoir", + "type": "file" + }, + { + "bom-ref": "828ecc772a188e3e", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device_sm_80.bc", + "type": "file" + }, + { + "bom-ref": "e23f0a4198d2ff3b", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device_sm_80.ltoir", + "type": "file" + }, + { + "bom-ref": "51a802134aae79aa", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device_sm_89.bc", + "type": "file" + }, + { + "bom-ref": "c4fb2421779c6e60", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device_sm_89.ltoir", + "type": "file" + }, + { + "bom-ref": "eb10df0742bc176c", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device_sm_90.bc", + "type": "file" + }, + { + "bom-ref": "088d09bc8142d539", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_device_sm_90.ltoir", "type": "file" }, { - "bom-ref": "5b52560704c63ded", - "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_host.so.3.6.5", + "bom-ref": "093671bb31aeb6d4", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/libnvshmem_host.so.3.7.1", "type": "file" }, { - "bom-ref": "4fd197f30a2f82cd", + "bom-ref": "658bbae75aea32b6", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_bootstrap_mpi.so.3.0.0", "type": "file" }, { - "bom-ref": "65dd71bf726895b1", + "bom-ref": "330ca870196ef78a", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_bootstrap_pmi.so.3.0.0", "type": "file" }, { - "bom-ref": "b5dfa00db53532f7", + "bom-ref": "09cdb497006b7578", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_bootstrap_pmi2.so.3.0.0", "type": "file" }, { - "bom-ref": "a6bd9b5c131e46e6", + "bom-ref": "ca4d0482fedcbfb5", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_bootstrap_pmix.so.3.0.0", "type": "file" }, { - "bom-ref": "4fda1d17718301a7", + "bom-ref": "936565e5c841ad6c", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_bootstrap_shmem.so.3.0.0", "type": "file" }, { - "bom-ref": "f008eedd7b5b8c70", + "bom-ref": "0b7fc613442152fb", "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_bootstrap_uid.so.3.0.0", "type": "file" }, { - "bom-ref": "d39a983594b866cc", - "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_ibdevx.so.5.0.0", + "bom-ref": "28d23cf4af373db7", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_gpunetio.so.6.0.0", + "type": "file" + }, + { + "bom-ref": "a1946dba71fadf65", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_ibdevx.so.6.0.0", "type": "file" }, { - "bom-ref": "6ef851170cbf0629", - "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_ibgda.so.5.0.0", + "bom-ref": "0a58e40a087934a5", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_ibgda.so.6.0.0", "type": "file" }, { - "bom-ref": "3977a2b029d4c5b1", - "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_ibrc.so.5.0.0", + "bom-ref": "8f9d3bc917451d58", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_ibrc.so.6.0.0", "type": "file" }, { - "bom-ref": "aeb5aaa7a6f4ca3f", - "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_libfabric.so.5.0.0", + "bom-ref": "ddf66d18167dc4a6", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_libfabric.so.6.0.0", "type": "file" }, { - "bom-ref": "4bf8cd04b8a63ae8", - "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_ucx.so.5.0.0", + "bom-ref": "5062c1d762ee962f", + "name": "/usr/lib/x86_64-linux-gnu/nvshmem/13/nvshmem_transport_ucx.so.6.0.0", "type": "file" }, { - "bom-ref": "399e146960824393", + "bom-ref": "725a0a62327bbd25", "name": "/usr/lib/x86_64-linux-gnu/ossl-modules/legacy.so", "type": "file" }, { - "bom-ref": "45094d6afb92049c", + "bom-ref": "34e84488ea070cbe", "name": "/usr/lib/x86_64-linux-gnu/perl-base/AutoLoader.pm", "type": "file" }, { - "bom-ref": "b89a8885a84511fd", + "bom-ref": "3d13d9966bebd00b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Carp.pm", "type": "file" }, { - "bom-ref": "55c1fe40e544e09e", + "bom-ref": "6b20a1ddf28012e8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Carp/Heavy.pm", "type": "file" }, { - "bom-ref": "b63ead9e4bc1e0b3", + "bom-ref": "3fecab6d3d5f1a5d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Config.pm", "type": "file" }, { - "bom-ref": "c95e09d4caf16e20", + "bom-ref": "c1a99d8fce4b69e6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Config_git.pl", "type": "file" }, { - "bom-ref": "e8715e36e5b5363e", + "bom-ref": "1f569922b2771f18", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Config_heavy.pl", "type": "file" }, { - "bom-ref": "1a6028b99257aafa", + "bom-ref": "27e51afe88fd14f8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Cwd.pm", "type": "file" }, { - "bom-ref": "dba1b5d8a09eb24f", + "bom-ref": "eb7567c43069db21", "name": "/usr/lib/x86_64-linux-gnu/perl-base/DynaLoader.pm", "type": "file" }, { - "bom-ref": "eb7fe2934afc5fdd", + "bom-ref": "4640e391e7d22a4f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Errno.pm", "type": "file" }, { - "bom-ref": "e73316a441f58d94", + "bom-ref": "e3ef45e5cd251512", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Exporter.pm", "type": "file" }, { - "bom-ref": "10be4cbb7b5a0c19", + "bom-ref": "3c201a25c61947c3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Exporter/Heavy.pm", "type": "file" }, { - "bom-ref": "80aa98dbb9dc3756", + "bom-ref": "70bb7c73aedb745c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Fcntl.pm", "type": "file" }, { - "bom-ref": "e4173118005abef1", + "bom-ref": "7d44bfdc0b9f1173", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Basename.pm", "type": "file" }, { - "bom-ref": "efbc34bb7d1b88b8", + "bom-ref": "7859f039fea5ced6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Glob.pm", "type": "file" }, { - "bom-ref": "832520f61ba5f6b8", + "bom-ref": "c91be87b04550a76", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Path.pm", "type": "file" }, { - "bom-ref": "a88820becf0ec94e", + "bom-ref": "873c5f66baaac744", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Spec.pm", "type": "file" }, { - "bom-ref": "ccf85aeb55ece0e6", + "bom-ref": "5b814ede5cbdcf18", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Spec/Unix.pm", "type": "file" }, { - "bom-ref": "6938d54b511252a6", + "bom-ref": "97d58e6dfa06a2dc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/File/Temp.pm", "type": "file" }, { - "bom-ref": "5264f7fe2347618b", + "bom-ref": "d5fc2fbdf7d54cd9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/FileHandle.pm", "type": "file" }, { - "bom-ref": "610b427d61a4c942", + "bom-ref": "369317344cabb634", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Getopt/Long.pm", "type": "file" }, { - "bom-ref": "1ab947c950c68941", + "bom-ref": "1a19bd0e576d3a0b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Hash/Util.pm", "type": "file" }, { - "bom-ref": "ffc9e9e33428600f", + "bom-ref": "c0d61b1378cf8d0d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO.pm", "type": "file" }, { - "bom-ref": "772dbde80c89acc5", + "bom-ref": "c28c0d72026fc30b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/File.pm", "type": "file" }, { - "bom-ref": "9f93d42c5dbdd654", + "bom-ref": "14691a614e231d06", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Handle.pm", "type": "file" }, { - "bom-ref": "5c5e087c5b509314", + "bom-ref": "ab69e3d2ddd6dbbe", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Pipe.pm", "type": "file" }, { - "bom-ref": "f545eecab20b91b4", + "bom-ref": "40c4dcb9b12f0cd6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Seekable.pm", "type": "file" }, { - "bom-ref": "fc1cb20f6e7057c2", + "bom-ref": "bd98d5b02884ae70", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Select.pm", "type": "file" }, { - "bom-ref": "6d25d2b97c76a422", + "bom-ref": "f5ace32e5409b87c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Socket.pm", "type": "file" }, { - "bom-ref": "d3ccab5c87a6fe85", + "bom-ref": "33004e289438481b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Socket/INET.pm", "type": "file" }, { - "bom-ref": "38908237f69d0313", + "bom-ref": "547aab1fd3684f91", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Socket/IP.pm", "type": "file" }, { - "bom-ref": "00e17a60a193e268", + "bom-ref": "1f834e7c6a3c0146", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IO/Socket/UNIX.pm", "type": "file" }, { - "bom-ref": "cf469c61a7b5086a", + "bom-ref": "fcaa1294b2721f74", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IPC/Open2.pm", "type": "file" }, { - "bom-ref": "1635a65cf1b50882", + "bom-ref": "cc17ab4e3288584c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/IPC/Open3.pm", "type": "file" }, { - "bom-ref": "06034ae59c44d173", + "bom-ref": "e4000201a5e4b915", "name": "/usr/lib/x86_64-linux-gnu/perl-base/List/Util.pm", "type": "file" }, { - "bom-ref": "061f807342e8bd32", + "bom-ref": "2b7e0a7415b787a0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/POSIX.pm", "type": "file" }, { - "bom-ref": "c61c120c55c75dd8", + "bom-ref": "02b9f79eb3538bfa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Scalar/Util.pm", "type": "file" }, { - "bom-ref": "d619e61a48acc407", + "bom-ref": "8201e8dddcceb5a1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/SelectSaver.pm", "type": "file" }, { - "bom-ref": "98b1f85484b9c6c9", + "bom-ref": "7fc1b4da32d7602b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Socket.pm", "type": "file" }, { - "bom-ref": "6cdd2849f14080c2", + "bom-ref": "6383653553108888", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Symbol.pm", "type": "file" }, { - "bom-ref": "6b52f63a7472cb8e", + "bom-ref": "d9c00c4d469c7270", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Text/ParseWords.pm", "type": "file" }, { - "bom-ref": "c0a4cb83ff706a59", + "bom-ref": "522150b8f0a4b3f3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Text/Tabs.pm", "type": "file" }, { - "bom-ref": "512291bd0eda940e", + "bom-ref": "1094ac1bba31ee2c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Text/Wrap.pm", "type": "file" }, { - "bom-ref": "daf9400ab9c00f93", + "bom-ref": "9048accd3e384321", "name": "/usr/lib/x86_64-linux-gnu/perl-base/Tie/Hash.pm", "type": "file" }, { - "bom-ref": "b4e38409be208e14", + "bom-ref": "185bb4c0023dd1f2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/XSLoader.pm", "type": "file" }, { - "bom-ref": "c8e9b585b15ae6db", + "bom-ref": "1f146ffe982c5f89", "name": "/usr/lib/x86_64-linux-gnu/perl-base/attributes.pm", "type": "file" }, { - "bom-ref": "ed899e35f5c2c36c", + "bom-ref": "c567ea2c0b3c3202", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/Cwd/Cwd.so", "type": "file" }, { - "bom-ref": "0a2f8a2894db6622", + "bom-ref": "8cd3ac1bbe887d40", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/Fcntl/Fcntl.so", "type": "file" }, { - "bom-ref": "b4e73697d8e6a158", + "bom-ref": "89b953d8ff918a92", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/File/Glob/Glob.so", "type": "file" }, { - "bom-ref": "deb2facd7050d3d3", + "bom-ref": "439c16fc95a277a5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/Hash/Util/Util.so", "type": "file" }, { - "bom-ref": "094513af54e8620a", + "bom-ref": "2cd2b436601b8b98", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/IO/IO.so", "type": "file" }, { - "bom-ref": "c92c14aa0d20165a", + "bom-ref": "6af4b66a164833c8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/List/Util/Util.so", "type": "file" }, { - "bom-ref": "0378d708acf6f7ea", + "bom-ref": "fd31e7aa4c6e0bc4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/POSIX/POSIX.so", "type": "file" }, { - "bom-ref": "026bf2b82d5edde1", + "bom-ref": "34b70688eadbbc5f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/Socket/Socket.so", "type": "file" }, { - "bom-ref": "040aad16ea28e867", + "bom-ref": "cc35fb2bef4fe641", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/attributes/attributes.so", "type": "file" }, { - "bom-ref": "4a6e09556c89f904", + "bom-ref": "1524f27933288c0a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/auto/re/re.so", "type": "file" }, { - "bom-ref": "4b817be8f98acb2c", + "bom-ref": "93901a9e031542ba", "name": "/usr/lib/x86_64-linux-gnu/perl-base/base.pm", "type": "file" }, { - "bom-ref": "0368ab7d0418a6f4", + "bom-ref": "157e82f632809c0a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/builtin.pm", "type": "file" }, { - "bom-ref": "e17584325cc93f78", + "bom-ref": "3471afca9a2524b2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/bytes.pm", "type": "file" }, { - "bom-ref": "8f52f9c35dfbf418", + "bom-ref": "c95cd784ac48b48e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/bytes_heavy.pl", "type": "file" }, { - "bom-ref": "292a76c6af579a36", + "bom-ref": "2a55504604b0a42c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/constant.pm", "type": "file" }, { - "bom-ref": "154d875a15e50e85", + "bom-ref": "54e7dce4168e5dd3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/feature.pm", "type": "file" }, { - "bom-ref": "a45261bff869fb5b", + "bom-ref": "e4e3b3ba38989c41", "name": "/usr/lib/x86_64-linux-gnu/perl-base/fields.pm", "type": "file" }, { - "bom-ref": "4730a08fc981027e", + "bom-ref": "5ce74f72dd29062c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/integer.pm", "type": "file" }, { - "bom-ref": "55944de8e1b9b003", + "bom-ref": "00b133d7ebcf227d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/lib.pm", "type": "file" }, { - "bom-ref": "afb0c6c15c592410", + "bom-ref": "02d1fb88050057f2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/locale.pm", "type": "file" }, { - "bom-ref": "47629017e4cd745e", + "bom-ref": "a3a97671aeff3c94", "name": "/usr/lib/x86_64-linux-gnu/perl-base/overload.pm", "type": "file" }, { - "bom-ref": "3b86b7d037bf0827", + "bom-ref": "54e215ed10f69a39", "name": "/usr/lib/x86_64-linux-gnu/perl-base/overloading.pm", "type": "file" }, { - "bom-ref": "a37dcf7122648867", + "bom-ref": "7bf6ffb261a1ba3d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/parent.pm", "type": "file" }, { - "bom-ref": "f385d6fafc0b566a", + "bom-ref": "86ae94dd44da15f0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/re.pm", "type": "file" }, { - "bom-ref": "2aa78dfb0fc81f47", + "bom-ref": "b58fbbcee5f2a515", "name": "/usr/lib/x86_64-linux-gnu/perl-base/strict.pm", "type": "file" }, { - "bom-ref": "4635042397667ff8", + "bom-ref": "54bc995e4b8fb076", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Age.pl", "type": "file" }, { - "bom-ref": "4038b035b1ae8003", + "bom-ref": "e87428b7e8d8c1e9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Bc.pl", "type": "file" }, { - "bom-ref": "6e2536c345705c96", + "bom-ref": "1c0e46e633a63da4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Bmg.pl", "type": "file" }, { - "bom-ref": "f8a0fe8a904f6513", + "bom-ref": "9d430b5677019215", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Bpb.pl", "type": "file" }, { - "bom-ref": "28c91e8bd174dc04", + "bom-ref": "4779b03e2e433e52", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Bpt.pl", "type": "file" }, { - "bom-ref": "e18c7408b1d29ebb", + "bom-ref": "dd944becd20102ad", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Cf.pl", "type": "file" }, { - "bom-ref": "d971dc7d81134c15", + "bom-ref": "4ee93f4da2a35497", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Ea.pl", "type": "file" }, { - "bom-ref": "0cf6455bd4526e1d", + "bom-ref": "246427057008de73", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/EqUIdeo.pl", "type": "file" }, { - "bom-ref": "65a5d67a138cba3b", + "bom-ref": "f8bc35ce39cccd8d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/GCB.pl", "type": "file" }, { - "bom-ref": "b50d4d7325468199", + "bom-ref": "2498c3ddabb12adf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Gc.pl", "type": "file" }, { - "bom-ref": "8dc3dfcbd308d31a", + "bom-ref": "22102648037336c0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Hst.pl", "type": "file" }, { - "bom-ref": "971cd92769f0c9a7", + "bom-ref": "e966ed67b2606e85", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Identif2.pl", "type": "file" }, { - "bom-ref": "af600ae227f84fcd", + "bom-ref": "57f73c6db5f7236b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Identifi.pl", "type": "file" }, { - "bom-ref": "d5db2c4aa23d643a", + "bom-ref": "4114c9a496d67850", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/InPC.pl", "type": "file" }, { - "bom-ref": "7b04e78658682290", + "bom-ref": "8193e57d39e1409e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/InSC.pl", "type": "file" }, { - "bom-ref": "98de4cafd0f27f26", + "bom-ref": "874c4d6611bc645c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Isc.pl", "type": "file" }, { - "bom-ref": "1ec3bba1fb62557a", + "bom-ref": "711147ae0eeae2e4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Jg.pl", "type": "file" }, { - "bom-ref": "be45bb9c33cbbfc1", + "bom-ref": "73833a50ae9ade83", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Jt.pl", "type": "file" }, { - "bom-ref": "9a9aaaeac9202faa", + "bom-ref": "67bb4db3f7f1c008", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Lb.pl", "type": "file" }, { - "bom-ref": "618afda61d4d32a0", + "bom-ref": "1877e864092d0c7a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Lc.pl", "type": "file" }, { - "bom-ref": "40f5bc6c9fe0c6b3", + "bom-ref": "36bcac6eb50135d5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NFCQC.pl", "type": "file" }, { - "bom-ref": "00f53de0d92b0b6d", + "bom-ref": "2abdccc736da73fb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NFDQC.pl", "type": "file" }, { - "bom-ref": "06e729ac9eeee33e", + "bom-ref": "d68574547f4aec68", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NFKCCF.pl", "type": "file" }, { - "bom-ref": "ce207b46a7f7e406", + "bom-ref": "6ddca09c063388c8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NFKCQC.pl", "type": "file" }, { - "bom-ref": "c67269003561edf2", + "bom-ref": "17af6cd6c44e90ac", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NFKDQC.pl", "type": "file" }, { - "bom-ref": "2007bd36a0beb601", + "bom-ref": "f2c6f65b89ffb2e3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Na1.pl", "type": "file" }, { - "bom-ref": "28009ed79366895d", + "bom-ref": "4bb7cdc8a12b72cb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/NameAlia.pl", "type": "file" }, { - "bom-ref": "48775bb5de0e4bd6", + "bom-ref": "667df27d7b1a76d4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Nt.pl", "type": "file" }, { - "bom-ref": "cec6775da66fb750", + "bom-ref": "a7c556bd23c63aea", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Nv.pl", "type": "file" }, { - "bom-ref": "36aa1e96c1d6622a", + "bom-ref": "c234ed93fd17fc98", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/PerlDeci.pl", "type": "file" }, { - "bom-ref": "8392cf2229a4b92e", + "bom-ref": "0570cb26874b732c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/SB.pl", "type": "file" }, { - "bom-ref": "71d53be9737ad77b", + "bom-ref": "f9d37596ee929ee9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Sc.pl", "type": "file" }, { - "bom-ref": "2e26930207e497e3", + "bom-ref": "231e70447626f669", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Scx.pl", "type": "file" }, { - "bom-ref": "844e00a26d6b9453", + "bom-ref": "4e6cef7e1703c201", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Tc.pl", "type": "file" }, { - "bom-ref": "0011c159c0a06947", + "bom-ref": "9f397dc0c8015f65", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Uc.pl", "type": "file" }, { - "bom-ref": "8d3b5511aea94dbe", + "bom-ref": "7f04aa3034a928bc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/Vo.pl", "type": "file" }, { - "bom-ref": "050d516f646e94af", + "bom-ref": "93ec77197f6ca919", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/WB.pl", "type": "file" }, { - "bom-ref": "9c10c5d4cb9c02f8", + "bom-ref": "8c9e7f13cfe907f6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/_PerlLB.pl", "type": "file" }, { - "bom-ref": "33fff53b2fda6995", + "bom-ref": "56cac815f7425c6b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/To/_PerlSCX.pl", "type": "file" }, { - "bom-ref": "2c312b43af40aa22", + "bom-ref": "4b3aef41f433566c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/NA.pl", "type": "file" }, { - "bom-ref": "d79b248ce70f2db9", + "bom-ref": "7b097a56fd5ee09f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V100.pl", "type": "file" }, { - "bom-ref": "72484a872f7f1351", + "bom-ref": "c3f69a2ecccf84db", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V11.pl", "type": "file" }, { - "bom-ref": "6c0e3aba43e74cac", + "bom-ref": "ac5254d9b36b15b6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V110.pl", "type": "file" }, { - "bom-ref": "0cbadc5bc16a9d98", + "bom-ref": "f1f29d3bebfd04aa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V120.pl", "type": "file" }, { - "bom-ref": "270a22ecdb218b5f", + "bom-ref": "8ebcb11332aef9c5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V130.pl", "type": "file" }, { - "bom-ref": "b1858ac63568b2c4", + "bom-ref": "74a3028eb3b7a6f2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V140.pl", "type": "file" }, { - "bom-ref": "ffce811b160a95ae", + "bom-ref": "1017b97f484deb98", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V150.pl", "type": "file" }, { - "bom-ref": "342bd0a939275f32", + "bom-ref": "c3065dc661dca2f8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V20.pl", "type": "file" }, { - "bom-ref": "acd13790a306476d", + "bom-ref": "d258ebe4efd2e157", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V30.pl", "type": "file" }, { - "bom-ref": "295affd7824e11a5", + "bom-ref": "f3e5406424f224f3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V31.pl", "type": "file" }, { - "bom-ref": "7e3921710e606a8c", + "bom-ref": "4bf314b3893cf586", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V32.pl", "type": "file" }, { - "bom-ref": "06b73111e6b13753", + "bom-ref": "805fcd49607dd259", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V40.pl", "type": "file" }, { - "bom-ref": "816f009b55e3e4cb", + "bom-ref": "7f3809f1c8993fa5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V41.pl", "type": "file" }, { - "bom-ref": "fcdc5ffac19b65a4", + "bom-ref": "98f63fdcfea480aa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V50.pl", "type": "file" }, { - "bom-ref": "acc7cd24c27dd229", + "bom-ref": "a34749d7303a3277", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V51.pl", "type": "file" }, { - "bom-ref": "3de9c3e144bd775d", + "bom-ref": "27dfcc1b5c6e6183", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V52.pl", "type": "file" }, { - "bom-ref": "e5192e0dcd765b91", + "bom-ref": "e3e725f9d164a24f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V60.pl", "type": "file" }, { - "bom-ref": "87ab21bcfa7a5fdc", + "bom-ref": "8879dfe9c503a616", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V61.pl", "type": "file" }, { - "bom-ref": "670c506b27d41287", + "bom-ref": "4c943b5b1e17fe39", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V70.pl", "type": "file" }, { - "bom-ref": "f294e912456b83e6", + "bom-ref": "945165045a07ae0c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V80.pl", "type": "file" }, { - "bom-ref": "a4c607a7faea0ede", + "bom-ref": "22a859d9ebb9fdcc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Age/V90.pl", "type": "file" }, { - "bom-ref": "3e12302c847aad09", + "bom-ref": "789fcf4a3031f0ab", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Alpha/Y.pl", "type": "file" }, { - "bom-ref": "bc9e39884b1341ad", + "bom-ref": "d2e95f59c10ec8bf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/AL.pl", "type": "file" }, { - "bom-ref": "8ab91be04b22331e", + "bom-ref": "a35422529020e074", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/AN.pl", "type": "file" }, { - "bom-ref": "3b8f009556fd95a6", + "bom-ref": "d67656cb2b3969d8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/B.pl", "type": "file" }, { - "bom-ref": "39118743eae62cda", + "bom-ref": "949d433d32f3bec4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/BN.pl", "type": "file" }, { - "bom-ref": "beb09971712055cb", + "bom-ref": "5130ee03fbc35949", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/CS.pl", "type": "file" }, { - "bom-ref": "9a4c78f2090498bb", + "bom-ref": "0cc96840c4931dc9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/EN.pl", "type": "file" }, { - "bom-ref": "87a8d6f65f0d5405", + "bom-ref": "2a3603e4c65b5f7f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/ES.pl", "type": "file" }, { - "bom-ref": "aba5197df7e22492", + "bom-ref": "8377a0211610c764", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/ET.pl", "type": "file" }, { - "bom-ref": "768fb3a16b9ffa46", + "bom-ref": "99df8bf313ad0aac", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/L.pl", "type": "file" }, { - "bom-ref": "a7c0dcacdb55ff48", + "bom-ref": "eeacf407090e9f2e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/NSM.pl", "type": "file" }, { - "bom-ref": "3449d4202d6d7b08", + "bom-ref": "c6f609af55b6efb6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/ON.pl", "type": "file" }, { - "bom-ref": "82c477ae5a34f692", + "bom-ref": "edaa3a23d144ea30", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/R.pl", "type": "file" }, { - "bom-ref": "a2b3377236ebdd6f", + "bom-ref": "7306c1109faff325", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bc/WS.pl", "type": "file" }, { - "bom-ref": "4228c89808b1adab", + "bom-ref": "28e473be57bb58d5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/BidiC/Y.pl", "type": "file" }, { - "bom-ref": "7aa44037929a5dd8", + "bom-ref": "9949900720a41cc6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/BidiM/Y.pl", "type": "file" }, { - "bom-ref": "0eac67f850cc23fc", + "bom-ref": "8fe25c9673f65a3e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Blk/NB.pl", "type": "file" }, { - "bom-ref": "5441f4cfbc1190d3", + "bom-ref": "575d4d20443b6911", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bpt/C.pl", "type": "file" }, { - "bom-ref": "83ae07365cd5ea2e", + "bom-ref": "c46d7889bb75be14", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bpt/N.pl", "type": "file" }, { - "bom-ref": "cfdff8c40ba8719f", + "bom-ref": "14ee5ee2d13a67c1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Bpt/O.pl", "type": "file" }, { - "bom-ref": "bd6a70459f8432ed", + "bom-ref": "018d5a5ffb910cdf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CE/Y.pl", "type": "file" }, { - "bom-ref": "37680e7b51c6fb58", + "bom-ref": "af8fa0d035656fc6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CI/Y.pl", "type": "file" }, { - "bom-ref": "7d4abfb51d761a17", + "bom-ref": "ba2eaa8a8c5dfb7d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWCF/Y.pl", "type": "file" }, { - "bom-ref": "6ac40568e20ccb3f", + "bom-ref": "a47f0799a88e2075", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWCM/Y.pl", "type": "file" }, { - "bom-ref": "c09a9b9340bce2d9", + "bom-ref": "cd5a9c944fa2ec47", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWKCF/Y.pl", "type": "file" }, { - "bom-ref": "a5958a2e10e49d1e", + "bom-ref": "07e566cc0b2ece10", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWL/Y.pl", "type": "file" }, { - "bom-ref": "ec927ed2e8a13631", + "bom-ref": "8dc7e6b3190afcdf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWT/Y.pl", "type": "file" }, { - "bom-ref": "5d7aca469eb21ea0", + "bom-ref": "f36fa36022f8f682", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CWU/Y.pl", "type": "file" }, { - "bom-ref": "70a306395f597eb1", + "bom-ref": "3a01ee98d09f2ba7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Cased/Y.pl", "type": "file" }, { - "bom-ref": "a7eac7f114b39765", + "bom-ref": "e8cfe44276c8bf3b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/A.pl", "type": "file" }, { - "bom-ref": "339484458d049a97", + "bom-ref": "313b2a4c6f3ab131", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/AL.pl", "type": "file" }, { - "bom-ref": "50c24dec60fd2ade", + "bom-ref": "255954d6315e345c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/AR.pl", "type": "file" }, { - "bom-ref": "bd6d074a55d74578", + "bom-ref": "87697624572d09f6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/ATAR.pl", "type": "file" }, { - "bom-ref": "5562f17bc5c868ec", + "bom-ref": "d71a6e1180c241be", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/B.pl", "type": "file" }, { - "bom-ref": "bfa540a6c6f445ca", + "bom-ref": "fdfe39fd292bdab4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/BR.pl", "type": "file" }, { - "bom-ref": "fc0bd0cc50e0c496", + "bom-ref": "89b96ca482d64ad8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/DB.pl", "type": "file" }, { - "bom-ref": "f43f084c6eeba840", + "bom-ref": "b30e80aa21a0f2fa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/NK.pl", "type": "file" }, { - "bom-ref": "ebb26fade262c56d", + "bom-ref": "49327b5467c10f13", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/NR.pl", "type": "file" }, { - "bom-ref": "25e9ed1404db7451", + "bom-ref": "070ecbee73c4959f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/OV.pl", "type": "file" }, { - "bom-ref": "b3b6a6ac3a66a640", + "bom-ref": "5e68b9715f8b614e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ccc/VR.pl", "type": "file" }, { - "bom-ref": "20db0961093c2ffb", + "bom-ref": "748c8d63c81c94e5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/CompEx/Y.pl", "type": "file" }, { - "bom-ref": "df2b0d93ce0ab935", + "bom-ref": "eeb123e0b77aa1bf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/DI/Y.pl", "type": "file" }, { - "bom-ref": "7f5d494d17c8c799", + "bom-ref": "925fd0a21af2e4b3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dash/Y.pl", "type": "file" }, { - "bom-ref": "2e63005e7ba9b61a", + "bom-ref": "e17cd1fff2ef8cd0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dep/Y.pl", "type": "file" }, { - "bom-ref": "b81a6f74cc60c6ea", + "bom-ref": "fec17e3e30dfbdf4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dia/Y.pl", "type": "file" }, { - "bom-ref": "bdd8fef7e39ada29", + "bom-ref": "3ea67e9a1d080477", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Com.pl", "type": "file" }, { - "bom-ref": "3db4b725107a12eb", + "bom-ref": "d477d27089f56481", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Enc.pl", "type": "file" }, { - "bom-ref": "5b97877d2b75972b", + "bom-ref": "df7dc4544bb1e331", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Fin.pl", "type": "file" }, { - "bom-ref": "6d9e76a1bdd71f78", + "bom-ref": "ff2107abb392a33a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Font.pl", "type": "file" }, { - "bom-ref": "1b102eeeff91618c", + "bom-ref": "b63152cb47baf4fa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Init.pl", "type": "file" }, { - "bom-ref": "d1ad340eb5a2bcb5", + "bom-ref": "301dd9ca4f4d22e3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Iso.pl", "type": "file" }, { - "bom-ref": "4da10c751df6920e", + "bom-ref": "0b806f6857dcc5dc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Med.pl", "type": "file" }, { - "bom-ref": "f433c55ef79c9c07", + "bom-ref": "28a7433030d34681", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Nar.pl", "type": "file" }, { - "bom-ref": "3d5ff41379af193c", + "bom-ref": "fdcfd42d5aa37e52", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Nb.pl", "type": "file" }, { - "bom-ref": "83888902cce12b61", + "bom-ref": "4c7055bf6bacaba3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/NonCanon.pl", "type": "file" }, { - "bom-ref": "f6af6dc609483658", + "bom-ref": "44563e73573ea2c2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Sqr.pl", "type": "file" }, { - "bom-ref": "9ae85300c2947801", + "bom-ref": "894eda25ec5fe3eb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Sub.pl", "type": "file" }, { - "bom-ref": "dc0372942b3933d7", + "bom-ref": "b65b8775c5a89475", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Sup.pl", "type": "file" }, { - "bom-ref": "4d2a26c553915b93", + "bom-ref": "d8185d8d46bfdf55", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Dt/Vert.pl", "type": "file" }, { - "bom-ref": "e67aca3573025297", + "bom-ref": "ffb6880de97a92f9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/EBase/Y.pl", "type": "file" }, { - "bom-ref": "98d2297622f1029f", + "bom-ref": "38d0975433c66199", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/EComp/Y.pl", "type": "file" }, { - "bom-ref": "d0f8020e95cae851", + "bom-ref": "27704a291bb15d97", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/EPres/Y.pl", "type": "file" }, { - "bom-ref": "773eca1f4727dc41", + "bom-ref": "30aa38261185936f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ea/A.pl", "type": "file" }, { - "bom-ref": "3d4afe0d0f109487", + "bom-ref": "ae0eb19cccc2eb75", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ea/H.pl", "type": "file" }, { - "bom-ref": "f92f997cce54665d", + "bom-ref": "1957bffb987d93ab", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ea/N.pl", "type": "file" }, { - "bom-ref": "c8426dcd8a1a947a", + "bom-ref": "55367d8f5d9e9af0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ea/Na.pl", "type": "file" }, { - "bom-ref": "005df99234dbc6de", + "bom-ref": "7d404fc019146dc8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ea/W.pl", "type": "file" }, { - "bom-ref": "a39db792f2488da6", + "bom-ref": "4d4b56ace1a33328", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Emoji/Y.pl", "type": "file" }, { - "bom-ref": "cec94ba9ed4b0c1a", + "bom-ref": "7f7cc16b22d8e9c8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ext/Y.pl", "type": "file" }, { - "bom-ref": "268fc31ff5bb8415", + "bom-ref": "87c2ae0d92ffe06f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/ExtPict/Y.pl", "type": "file" }, { - "bom-ref": "8eed8dd01144871e", + "bom-ref": "c120874c48533c70", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/CN.pl", "type": "file" }, { - "bom-ref": "5f5923310f72a16d", + "bom-ref": "513d6fadb61e0aab", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/EX.pl", "type": "file" }, { - "bom-ref": "be00d9199b07dd8f", + "bom-ref": "a64024eed61e4b85", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/LV.pl", "type": "file" }, { - "bom-ref": "d31fc5b0566525d2", + "bom-ref": "76c6aa37ea5dbf74", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/LVT.pl", "type": "file" }, { - "bom-ref": "a8aa144e75362a53", + "bom-ref": "aa11d0402982a855", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/PP.pl", "type": "file" }, { - "bom-ref": "5040d0d5967b9faf", + "bom-ref": "4af52c4978ff9a89", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/SM.pl", "type": "file" }, { - "bom-ref": "931be5c2fd50eb26", + "bom-ref": "a6e1d265e3d27984", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GCB/XX.pl", "type": "file" }, { - "bom-ref": "cff42d5005f71b5e", + "bom-ref": "5e97aee083bf7830", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/C.pl", "type": "file" }, { - "bom-ref": "220bf46200da14cc", + "bom-ref": "3c8a406ceba5f97a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Cf.pl", "type": "file" }, { - "bom-ref": "515e63826654a70e", + "bom-ref": "910ea209e3737db4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Cn.pl", "type": "file" }, { - "bom-ref": "48af9fb9696115db", + "bom-ref": "4ef46411f3da5e41", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/L.pl", "type": "file" }, { - "bom-ref": "f522ceba79986260", + "bom-ref": "850b12cb702a2b6a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/LC.pl", "type": "file" }, { - "bom-ref": "d4007413ebfacd8a", + "bom-ref": "eb048f4ce106f088", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Ll.pl", "type": "file" }, { - "bom-ref": "105683ec9580926b", + "bom-ref": "7c97230a53af0e69", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Lm.pl", "type": "file" }, { - "bom-ref": "918c5455698e6fe1", + "bom-ref": "1461462cbc7a372b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Lo.pl", "type": "file" }, { - "bom-ref": "584ef2a7801fd0c7", + "bom-ref": "16c16d8fe67f2ca5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Lu.pl", "type": "file" }, { - "bom-ref": "60a98e6bc1d99700", + "bom-ref": "3f4b23bb10b4af16", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/M.pl", "type": "file" }, { - "bom-ref": "8ef52ca7f2e4d2ac", + "bom-ref": "0170c501cf13a2a6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Mc.pl", "type": "file" }, { - "bom-ref": "e24700faf5ad70d7", + "bom-ref": "166c85a2259a4b6d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Me.pl", "type": "file" }, { - "bom-ref": "2a1596bb5e70dcca", + "bom-ref": "1eacf565a2050028", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Mn.pl", "type": "file" }, { - "bom-ref": "ff4960aa0445793e", + "bom-ref": "91323c21d8eb27ac", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/N.pl", "type": "file" }, { - "bom-ref": "c9f3d4cc1410cb16", + "bom-ref": "5b5e4fe243203620", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Nd.pl", "type": "file" }, { - "bom-ref": "e8cf5c8e6650dd29", + "bom-ref": "2069b205f3af87ab", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Nl.pl", "type": "file" }, { - "bom-ref": "cdb6d9ddf9fbe475", + "bom-ref": "ccd1ab43ab5a5b1b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/No.pl", "type": "file" }, { - "bom-ref": "75948bac60137810", + "bom-ref": "5a2f76d55b61ad02", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/P.pl", "type": "file" }, { - "bom-ref": "078189d9fd784679", + "bom-ref": "f759bb5b8a381eff", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Pc.pl", "type": "file" }, { - "bom-ref": "3bf298c74103997a", + "bom-ref": "17438fdcfba86c60", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Pd.pl", "type": "file" }, { - "bom-ref": "99f01aee92116594", + "bom-ref": "01383e90525e313a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Pe.pl", "type": "file" }, { - "bom-ref": "a177e70f4b896cf0", + "bom-ref": "efd560f6f04d14da", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Pf.pl", "type": "file" }, { - "bom-ref": "32f3f9bac73cf61e", + "bom-ref": "06b68df3c024baa0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Pi.pl", "type": "file" }, { - "bom-ref": "6dc2b874d6af2695", + "bom-ref": "e098c92f90975bc7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Po.pl", "type": "file" }, { - "bom-ref": "92148f8187bd844e", + "bom-ref": "3ed6c58eb1597c54", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Ps.pl", "type": "file" }, { - "bom-ref": "e03dc0bad9f34333", + "bom-ref": "9406569e48384349", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/S.pl", "type": "file" }, { - "bom-ref": "3e9673b9d6c03118", + "bom-ref": "85d01e23f4472c22", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Sc.pl", "type": "file" }, { - "bom-ref": "402f4092ec1521a8", + "bom-ref": "e6ed4a9b97099f32", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Sk.pl", "type": "file" }, { - "bom-ref": "4e1966d6530e442a", + "bom-ref": "bd969f3eb834ac94", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Sm.pl", "type": "file" }, { - "bom-ref": "8c073049c0dc4d56", + "bom-ref": "7fd22ed3073f7bf0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/So.pl", "type": "file" }, { - "bom-ref": "2538fa7aee76e8ba", + "bom-ref": "613b6b2383aeb110", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Z.pl", "type": "file" }, { - "bom-ref": "3560cd20c5e78a01", + "bom-ref": "8003d2d49914229b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Gc/Zs.pl", "type": "file" }, { - "bom-ref": "a2409bdd4e2a6509", + "bom-ref": "893f7d6d04a1ca67", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GrBase/Y.pl", "type": "file" }, { - "bom-ref": "db9e6d502f5e972f", + "bom-ref": "0334fd59caa786f9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/GrExt/Y.pl", "type": "file" }, { - "bom-ref": "8db2e07ac68a884f", + "bom-ref": "7d1cae0e4aff86d5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Hex/Y.pl", "type": "file" }, { - "bom-ref": "315bba2fbc2c86d5", + "bom-ref": "2a6621123dc4e8eb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Hst/NA.pl", "type": "file" }, { - "bom-ref": "5c17888224041e78", + "bom-ref": "a92f3ff5cd48fbf6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Hyphen/T.pl", "type": "file" }, { - "bom-ref": "efb1ba6b47d96a0c", + "bom-ref": "9c66b1cfdbbebf3a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IDC/Y.pl", "type": "file" }, { - "bom-ref": "e02c58cf66d41f2a", + "bom-ref": "c81318b3f751aa8c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IDS/Y.pl", "type": "file" }, { - "bom-ref": "295c962da5c1574a", + "bom-ref": "0f08f26201741d40", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdStatus/Allowed.pl", "type": "file" }, { - "bom-ref": "df6140160bd0b4d0", + "bom-ref": "ff4ab495c778f57e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdStatus/Restrict.pl", "type": "file" }, { - "bom-ref": "ea32314307b14fa7", + "bom-ref": "7330c1395507f189", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/DefaultI.pl", "type": "file" }, { - "bom-ref": "80e475c8f6cddb69", + "bom-ref": "e283aff98b9fa10f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Exclusio.pl", "type": "file" }, { - "bom-ref": "7349a9242058928c", + "bom-ref": "af72b481b783a9d2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Inclusio.pl", "type": "file" }, { - "bom-ref": "e4bdcc6d66511cdf", + "bom-ref": "af3004506724fb25", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/LimitedU.pl", "type": "file" }, { - "bom-ref": "e08f78fe74f77830", + "bom-ref": "458bf55b42b9acce", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/NotChara.pl", "type": "file" }, { - "bom-ref": "d6f6ef6618069874", + "bom-ref": "a8a50de1f90f8086", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/NotNFKC.pl", "type": "file" }, { - "bom-ref": "b82bd8f21c017637", + "bom-ref": "ad36964bbc673cad", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/NotXID.pl", "type": "file" }, { - "bom-ref": "d031202f4a71cd7d", + "bom-ref": "21ef3ff8520594af", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Obsolete.pl", "type": "file" }, { - "bom-ref": "6a468c44d5a3b305", + "bom-ref": "f859dafdb8f12fcb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Recommen.pl", "type": "file" }, { - "bom-ref": "90b98d05e2501836", + "bom-ref": "9d67f4568578bf50", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Technica.pl", "type": "file" }, { - "bom-ref": "78eea5093a2d4e7a", + "bom-ref": "e556c6851ab403a0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/IdType/Uncommon.pl", "type": "file" }, { - "bom-ref": "a200abb5f27f86da", + "bom-ref": "caded6c289906624", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Ideo/Y.pl", "type": "file" }, { - "bom-ref": "bc5440670c51fd2c", + "bom-ref": "189223989685def2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/10_0.pl", "type": "file" }, { - "bom-ref": "9ce3d5da1d627190", + "bom-ref": "7f6055295461a2b2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/11_0.pl", "type": "file" }, { - "bom-ref": "065016764ddbec46", + "bom-ref": "26b9ffcdf67a22d8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/12_0.pl", "type": "file" }, { - "bom-ref": "2b4b596a83633680", + "bom-ref": "674f711cd8409696", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/12_1.pl", "type": "file" }, { - "bom-ref": "6363240cae639d8f", + "bom-ref": "2e6966aca9d4468d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/13_0.pl", "type": "file" }, { - "bom-ref": "5690c534012e845e", + "bom-ref": "80a99337a9acc750", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/14_0.pl", "type": "file" }, { - "bom-ref": "b1f4290d37104e2c", + "bom-ref": "88be6b003a826002", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/15_0.pl", "type": "file" }, { - "bom-ref": "5515573bf3930e47", + "bom-ref": "260aef9bbbb3446d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/2_0.pl", "type": "file" }, { - "bom-ref": "bac69ba778559868", + "bom-ref": "7df3f1bb9e5ca61a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/2_1.pl", "type": "file" }, { - "bom-ref": "b6d6b837fb0cf121", + "bom-ref": "614f9abde6b8703b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/3_0.pl", "type": "file" }, { - "bom-ref": "a2dd63e387ce66e4", + "bom-ref": "c15ee5d2b0de5a96", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/3_1.pl", "type": "file" }, { - "bom-ref": "96fab5a489e2c0bc", + "bom-ref": "0d08dd8358651386", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/3_2.pl", "type": "file" }, { - "bom-ref": "f3c65a720c2f9bcb", + "bom-ref": "016f36aa0a93f13d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/4_0.pl", "type": "file" }, { - "bom-ref": "a4f6a73e4b7b5525", + "bom-ref": "34243bd3130d6e43", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/4_1.pl", "type": "file" }, { - "bom-ref": "d66204d921e2e142", + "bom-ref": "0771f500acbac57c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/5_0.pl", "type": "file" }, { - "bom-ref": "6d1dc8393530666b", + "bom-ref": "995c27c561ab902d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/5_1.pl", "type": "file" }, { - "bom-ref": "b1cd12f08cdbf18c", + "bom-ref": "ede3573b8598dada", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/5_2.pl", "type": "file" }, { - "bom-ref": "d388d90ed12901f5", + "bom-ref": "414658c5c0acc357", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/6_0.pl", "type": "file" }, { - "bom-ref": "496078f2034154dd", + "bom-ref": "46a2afaf5e52c257", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/6_1.pl", "type": "file" }, { - "bom-ref": "994aab701f4d8602", + "bom-ref": "522de9aef78ddbdc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/6_2.pl", "type": "file" }, { - "bom-ref": "8356c6f6d2fb6f97", + "bom-ref": "10deaa9c49e242cd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/6_3.pl", "type": "file" }, { - "bom-ref": "2992802eb8e8a65d", + "bom-ref": "25c3a36f1c16eb3f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/7_0.pl", "type": "file" }, { - "bom-ref": "1ec309b32cd4627c", + "bom-ref": "67765a5b4a22258a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/8_0.pl", "type": "file" }, { - "bom-ref": "445a542b82562deb", + "bom-ref": "3de72eee0f379591", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/In/9_0.pl", "type": "file" }, { - "bom-ref": "574825c517061d07", + "bom-ref": "ff8b4afae07f5c25", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/Bottom.pl", "type": "file" }, { - "bom-ref": "bb139df7e85f6457", + "bom-ref": "ab43e655c301ab91", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/BottomAn.pl", "type": "file" }, { - "bom-ref": "6afaba9841ebd937", + "bom-ref": "4328bb5d51ac5949", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/Left.pl", "type": "file" }, { - "bom-ref": "7e65c6dd28aad898", + "bom-ref": "10e9c3f647d16dea", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/LeftAndR.pl", "type": "file" }, { - "bom-ref": "c2d286a51f3df43a", + "bom-ref": "f6978ef80184483c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/NA.pl", "type": "file" }, { - "bom-ref": "59f76a707a164da5", + "bom-ref": "ea8a3ff367f35eef", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/Overstru.pl", "type": "file" }, { - "bom-ref": "82fdc0e919f77b37", + "bom-ref": "7fada6e79118469d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/Right.pl", "type": "file" }, { - "bom-ref": "8913d36fa6c50c17", + "bom-ref": "617faf4884396ced", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/Top.pl", "type": "file" }, { - "bom-ref": "da93681f16f05e66", + "bom-ref": "8694634b920f9270", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/TopAndBo.pl", "type": "file" }, { - "bom-ref": "5c9745f7b1fecdbc", + "bom-ref": "213ff819ccafe776", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/TopAndL2.pl", "type": "file" }, { - "bom-ref": "255372fbfcb540b5", + "bom-ref": "07c34ea119dcf2d3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/TopAndLe.pl", "type": "file" }, { - "bom-ref": "b9c3713c8f195e83", + "bom-ref": "9179a032729c87e5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/TopAndRi.pl", "type": "file" }, { - "bom-ref": "6e93ad8310b86b6c", + "bom-ref": "57707d6f1de2de72", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InPC/VisualOr.pl", "type": "file" }, { - "bom-ref": "db024490ffabac49", + "bom-ref": "f6527e069e18130f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Avagraha.pl", "type": "file" }, { - "bom-ref": "7b9b03980e918f97", + "bom-ref": "7d903ee79742c0fd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Bindu.pl", "type": "file" }, { - "bom-ref": "92b6c948edcadad9", + "bom-ref": "da6691998e2195ef", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Cantilla.pl", "type": "file" }, { - "bom-ref": "62ae555948d82497", + "bom-ref": "d8634f7ef412976d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona2.pl", "type": "file" }, { - "bom-ref": "95578b978bcf4443", + "bom-ref": "f4996a64b216303d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona3.pl", "type": "file" }, { - "bom-ref": "b8532832fcf68541", + "bom-ref": "153c088e1ea03fd7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona4.pl", "type": "file" }, { - "bom-ref": "70133a9e960c3680", + "bom-ref": "b40f619fe5543c6e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona5.pl", "type": "file" }, { - "bom-ref": "f5edbe7cdb1d2934", + "bom-ref": "af917378bc8f4d3a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona6.pl", "type": "file" }, { - "bom-ref": "4013f80956111324", + "bom-ref": "3ddc830d99951f62", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona7.pl", "type": "file" }, { - "bom-ref": "40e661fb5a2c601f", + "bom-ref": "f1671fb21d40c041", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona8.pl", "type": "file" }, { - "bom-ref": "ec4e698939d4e8a1", + "bom-ref": "54182f0d55c61e07", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consona9.pl", "type": "file" }, { - "bom-ref": "c7063ab8ee547eff", + "bom-ref": "3fc2c2694fa25fc1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Consonan.pl", "type": "file" }, { - "bom-ref": "806d78832bdd4a53", + "bom-ref": "64bc7874c3b435cd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Geminati.pl", "type": "file" }, { - "bom-ref": "1004f9f1f98b2953", + "bom-ref": "63383a217440b17d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Invisibl.pl", "type": "file" }, { - "bom-ref": "2b1a429ffbec4fd3", + "bom-ref": "449425602dd24bcd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Nukta.pl", "type": "file" }, { - "bom-ref": "3be23f78c714c15c", + "bom-ref": "8b7365f0807df622", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Number.pl", "type": "file" }, { - "bom-ref": "05d96ee062932b9e", + "bom-ref": "7a974a89e29925e8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Other.pl", "type": "file" }, { - "bom-ref": "d0c8f47330cf6d40", + "bom-ref": "089469565e66d16a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/PureKill.pl", "type": "file" }, { - "bom-ref": "cc36b34b0050fd8e", + "bom-ref": "19ec2d89c3870484", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Syllable.pl", "type": "file" }, { - "bom-ref": "4b2d91f836a204df", + "bom-ref": "5d750e30747c0611", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/ToneMark.pl", "type": "file" }, { - "bom-ref": "6ea68530a83806f4", + "bom-ref": "d77e7f19e5a9459e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Virama.pl", "type": "file" }, { - "bom-ref": "8e9ab788cc8bdd36", + "bom-ref": "0e1841ab68f5a118", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Visarga.pl", "type": "file" }, { - "bom-ref": "99b4d358c688c9cd", + "bom-ref": "38c51790fb0d01e7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/Vowel.pl", "type": "file" }, { - "bom-ref": "ac9f313083b6f1ea", + "bom-ref": "bf1fb0d7b868a000", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/VowelDep.pl", "type": "file" }, { - "bom-ref": "9b0304202bbf7f91", + "bom-ref": "fcc2f60357ce0d87", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/InSC/VowelInd.pl", "type": "file" }, { - "bom-ref": "25952d987f0bc33c", + "bom-ref": "96fe72a525e39e7a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Ain.pl", "type": "file" }, { - "bom-ref": "fa2f93532242824b", + "bom-ref": "f9c10987d97ebd31", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Alef.pl", "type": "file" }, { - "bom-ref": "1aeef1bb126a3913", + "bom-ref": "f00a396f2b974539", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Beh.pl", "type": "file" }, { - "bom-ref": "45e00c4545be5fa0", + "bom-ref": "3c15dbe017248532", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Dal.pl", "type": "file" }, { - "bom-ref": "df780761c8535d52", + "bom-ref": "40d74e960b433a74", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/FarsiYeh.pl", "type": "file" }, { - "bom-ref": "b623f2d7a4479cd3", + "bom-ref": "ed131e7f6f4a5d39", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Feh.pl", "type": "file" }, { - "bom-ref": "523040732c12abfb", + "bom-ref": "56d876ca446f6ec5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Gaf.pl", "type": "file" }, { - "bom-ref": "b7ee8e9e6f2145cd", + "bom-ref": "4106c13883be4ec3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Hah.pl", "type": "file" }, { - "bom-ref": "d671406e15e06188", + "bom-ref": "ce62675376df3d5a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/HanifiRo.pl", "type": "file" }, { - "bom-ref": "8749f5821491e6c9", + "bom-ref": "986778a5966f757b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Kaf.pl", "type": "file" }, { - "bom-ref": "ababd56958b67705", + "bom-ref": "71934d64e43d356f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Lam.pl", "type": "file" }, { - "bom-ref": "1d9c6a8061a1d434", + "bom-ref": "3534f900e0e8fe92", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/NoJoinin.pl", "type": "file" }, { - "bom-ref": "d044b92618a4c86b", + "bom-ref": "5c3fb262e56f2731", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Noon.pl", "type": "file" }, { - "bom-ref": "7d8cad27ac6a0738", + "bom-ref": "15495acafcac140a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Qaf.pl", "type": "file" }, { - "bom-ref": "af2bf33dfc6f6b3c", + "bom-ref": "e8c966074612ee4a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Reh.pl", "type": "file" }, { - "bom-ref": "1b54d70b68e81f52", + "bom-ref": "60b3fce54ce8e858", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Sad.pl", "type": "file" }, { - "bom-ref": "64aa0d4d6e591671", + "bom-ref": "7f4389e979ab1e67", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Seen.pl", "type": "file" }, { - "bom-ref": "08eb6d898323bf74", + "bom-ref": "54c442ec88ab7086", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Tah.pl", "type": "file" }, { - "bom-ref": "694e2113f75c12c3", + "bom-ref": "809122ebffb2f4ad", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Waw.pl", "type": "file" }, { - "bom-ref": "d013e1efb8be75c3", + "bom-ref": "0f4a75288db58895", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jg/Yeh.pl", "type": "file" }, { - "bom-ref": "b5367c2d04f78847", + "bom-ref": "f1c78b478032a1bd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/C.pl", "type": "file" }, { - "bom-ref": "bbf122ea4489bcb1", + "bom-ref": "cf0899ecc2764a47", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/D.pl", "type": "file" }, { - "bom-ref": "35b06c0c69272c23", + "bom-ref": "f0413a33e44ee84d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/L.pl", "type": "file" }, { - "bom-ref": "ba7e2434f2d08e46", + "bom-ref": "ffa3c641f7ffc308", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/R.pl", "type": "file" }, { - "bom-ref": "ddc22b5b22111074", + "bom-ref": "2cc30dea75673d9e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/T.pl", "type": "file" }, { - "bom-ref": "7932be3e8bdd754d", + "bom-ref": "fac9c97e4d586887", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Jt/U.pl", "type": "file" }, { - "bom-ref": "47f62e5ffa9c6f4b", + "bom-ref": "63108e33ba1c06c1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/AI.pl", "type": "file" }, { - "bom-ref": "17b892a1383d21fd", + "bom-ref": "727b9d52f8273ffb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/AL.pl", "type": "file" }, { - "bom-ref": "f5341c294ef3d1d9", + "bom-ref": "af451411751b3b8b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/BA.pl", "type": "file" }, { - "bom-ref": "e743f5cd4c0ded5a", + "bom-ref": "1101246c38856a6c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/BB.pl", "type": "file" }, { - "bom-ref": "688098171f840ed1", + "bom-ref": "d2bfe246252d67cb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/CJ.pl", "type": "file" }, { - "bom-ref": "c2d5b54b56f5e3d1", + "bom-ref": "53ad268d9a93b14b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/CL.pl", "type": "file" }, { - "bom-ref": "97de13700d084587", + "bom-ref": "1f2ff533c06f411d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/CM.pl", "type": "file" }, { - "bom-ref": "60068d1bdfcf653f", + "bom-ref": "f085f986c060250d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/EX.pl", "type": "file" }, { - "bom-ref": "9e170d35d8027ea3", + "bom-ref": "f0ac15c51a2cf625", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/GL.pl", "type": "file" }, { - "bom-ref": "a08750563494d5c2", + "bom-ref": "b0e2f702364f38d4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/ID.pl", "type": "file" }, { - "bom-ref": "4a1e07b3a3131f24", + "bom-ref": "49b829424c43c70a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/IN.pl", "type": "file" }, { - "bom-ref": "9210ce740ec50399", + "bom-ref": "3ace904c95e36343", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/IS.pl", "type": "file" }, { - "bom-ref": "d56aa5c1e74e1b34", + "bom-ref": "0d3bbdfdfdf74d7a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/NS.pl", "type": "file" }, { - "bom-ref": "347e888639991a46", + "bom-ref": "88d464152fc56cb8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/NU.pl", "type": "file" }, { - "bom-ref": "e72918daad47ea49", + "bom-ref": "b7b2a6d26db769bb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/OP.pl", "type": "file" }, { - "bom-ref": "a55a71db1f794014", + "bom-ref": "c663ae699681d08e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/PO.pl", "type": "file" }, { - "bom-ref": "501e7ee67e3a3bd5", + "bom-ref": "6e2fa82d32b14547", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/PR.pl", "type": "file" }, { - "bom-ref": "8d268cc9a84c617e", + "bom-ref": "6f1011c70ed859b4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/QU.pl", "type": "file" }, { - "bom-ref": "1b434680ee7fd4fa", + "bom-ref": "49511dac4c3ee338", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/SA.pl", "type": "file" }, { - "bom-ref": "8f36108b8bf9e094", + "bom-ref": "ec6847e90f876686", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lb/XX.pl", "type": "file" }, { - "bom-ref": "f289a67f701a3941", + "bom-ref": "209db4b196f17ca7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Lower/Y.pl", "type": "file" }, { - "bom-ref": "8f7bec63be4e2d7b", + "bom-ref": "2a80dc46a83b0a75", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Math/Y.pl", "type": "file" }, { - "bom-ref": "3e7a1d78cd93df7f", + "bom-ref": "629ef689ea83f3a1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFCQC/M.pl", "type": "file" }, { - "bom-ref": "0fdf951d73843e7b", + "bom-ref": "80f90a48d709b4fd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFCQC/Y.pl", "type": "file" }, { - "bom-ref": "f0270468687838cb", + "bom-ref": "7d1e65b0cfe538e1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFDQC/N.pl", "type": "file" }, { - "bom-ref": "2239baa39930aa69", + "bom-ref": "f235e88041056f0f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFDQC/Y.pl", "type": "file" }, { - "bom-ref": "3353cb1f302b17f9", + "bom-ref": "7bf4c9de3c2e15d7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFKCQC/N.pl", "type": "file" }, { - "bom-ref": "20bfc5f8bc887e2e", + "bom-ref": "2e292ac7216d78d4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFKCQC/Y.pl", "type": "file" }, { - "bom-ref": "0e03510a8a397aa4", + "bom-ref": "f2c979b47c7b9892", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFKDQC/N.pl", "type": "file" }, { - "bom-ref": "9cd97444799cd5f7", + "bom-ref": "ad31e3caaab446a1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/NFKDQC/Y.pl", "type": "file" }, { - "bom-ref": "b4a88c07a1ece638", + "bom-ref": "21d1c908119401ea", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nt/Di.pl", "type": "file" }, { - "bom-ref": "e0d127bf12c907d8", + "bom-ref": "beaf2b8e40e02376", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nt/None.pl", "type": "file" }, { - "bom-ref": "ae1b9b8f41f40286", + "bom-ref": "bce66b848248c254", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nt/Nu.pl", "type": "file" }, { - "bom-ref": "32428978e2edd214", + "bom-ref": "469ed0da883fc5b6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/0.pl", "type": "file" }, { - "bom-ref": "0ba802359572bdbe", + "bom-ref": "7997cd7950857908", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1.pl", "type": "file" }, { - "bom-ref": "18d5db92703c983c", + "bom-ref": "a972a4a13a3a1bba", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/10.pl", "type": "file" }, { - "bom-ref": "eb5da6fca88e157b", + "bom-ref": "f8adb2f0c884146d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/100.pl", "type": "file" }, { - "bom-ref": "fb5460f1973b44ad", + "bom-ref": "b428ee0911c1daab", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1000.pl", "type": "file" }, { - "bom-ref": "a12ef6c0a2815b0f", + "bom-ref": "6ecf5f41811ac575", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/10000.pl", "type": "file" }, { - "bom-ref": "aefbcbe200733bce", + "bom-ref": "f125bc80b538f824", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/100000.pl", "type": "file" }, { - "bom-ref": "21b425074e7007ff", + "bom-ref": "a9470b324ea89ba5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/11.pl", "type": "file" }, { - "bom-ref": "b1bdeb792192a941", + "bom-ref": "2c0208e27eb3385b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/12.pl", "type": "file" }, { - "bom-ref": "081ccc109a0c9b8e", + "bom-ref": "2b9951c1ff44633c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/13.pl", "type": "file" }, { - "bom-ref": "aaef6435920cae83", + "bom-ref": "67a213e5136a8d29", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/14.pl", "type": "file" }, { - "bom-ref": "fe7c470d492a6580", + "bom-ref": "295f5a81eb4f4222", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/15.pl", "type": "file" }, { - "bom-ref": "1139aa22124b778f", + "bom-ref": "f0b187edd2882225", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/16.pl", "type": "file" }, { - "bom-ref": "d3610f5f37dae385", + "bom-ref": "db26598b348ee7ff", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/17.pl", "type": "file" }, { - "bom-ref": "0efc645dacb02283", + "bom-ref": "6fc8b08fe9b49969", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/18.pl", "type": "file" }, { - "bom-ref": "deb87da7032209c8", + "bom-ref": "68504950ca44103a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/19.pl", "type": "file" }, { - "bom-ref": "9ce57aa338f50b6d", + "bom-ref": "45fe47c92c8fd0bb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_16.pl", "type": "file" }, { - "bom-ref": "f8eee12948745a6e", + "bom-ref": "77dc56c271919370", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_2.pl", "type": "file" }, { - "bom-ref": "485024c9cf5c0ce3", + "bom-ref": "645623852bbd8411", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_3.pl", "type": "file" }, { - "bom-ref": "fce6e386d0208562", + "bom-ref": "c454701630e88a94", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_4.pl", "type": "file" }, { - "bom-ref": "d19ab4270b5034eb", + "bom-ref": "86d3273d11f49b0d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_6.pl", "type": "file" }, { - "bom-ref": "a1adcfa042485f80", + "bom-ref": "fd8a6ce929715e4a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/1_8.pl", "type": "file" }, { - "bom-ref": "57fc02ae4da0222d", + "bom-ref": "101f974cf271f4ef", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/2.pl", "type": "file" }, { - "bom-ref": "29d1c90e3a6aa10a", + "bom-ref": "1a26f192dc55e40c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/20.pl", "type": "file" }, { - "bom-ref": "038e2422e29361de", + "bom-ref": "c9a032da01b57958", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/200.pl", "type": "file" }, { - "bom-ref": "de91e3c670548465", + "bom-ref": "3918220d25a14a27", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/2000.pl", "type": "file" }, { - "bom-ref": "a4716754805daca5", + "bom-ref": "87615085a27ca77b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/20000.pl", "type": "file" }, { - "bom-ref": "acfad7b6952056a8", + "bom-ref": "07b49918a3ed9d0e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/2_3.pl", "type": "file" }, { - "bom-ref": "e330ce0355399834", + "bom-ref": "f2cecbc5f3865582", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/3.pl", "type": "file" }, { - "bom-ref": "44774042e8ca8ff6", + "bom-ref": "9374a4cc58c3d7bc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/30.pl", "type": "file" }, { - "bom-ref": "12d429b1e400e482", + "bom-ref": "0e1ee219bfadaacc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/300.pl", "type": "file" }, { - "bom-ref": "cef2d2082873c228", + "bom-ref": "5a4e7261ed7b67a6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/3000.pl", "type": "file" }, { - "bom-ref": "c5af11ee901f09c3", + "bom-ref": "3a8f0c2bf57b5cb1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/30000.pl", "type": "file" }, { - "bom-ref": "d11627e1774d6853", + "bom-ref": "a72ef44dd86c2615", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/3_16.pl", "type": "file" }, { - "bom-ref": "d947f8ea893f2ec4", + "bom-ref": "133f899eca9449f6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/3_4.pl", "type": "file" }, { - "bom-ref": "392dda227830728b", + "bom-ref": "1c28da2e346f54e1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/4.pl", "type": "file" }, { - "bom-ref": "36a1fef6ea81b401", + "bom-ref": "f57a0044fa358643", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/40.pl", "type": "file" }, { - "bom-ref": "e6b03636806ed013", + "bom-ref": "43aaa499530b7fbd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/400.pl", "type": "file" }, { - "bom-ref": "ea07c3cc7b628d4f", + "bom-ref": "147e8fb36e48fba5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/4000.pl", "type": "file" }, { - "bom-ref": "1883bcc5f5f12386", + "bom-ref": "bde3fe5bf96e8c20", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/40000.pl", "type": "file" }, { - "bom-ref": "5793cd6a8b336ee1", + "bom-ref": "290b9e5c8906f3a3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/5.pl", "type": "file" }, { - "bom-ref": "7410eb9abfa6e3f6", + "bom-ref": "055419efa868c11c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/50.pl", "type": "file" }, { - "bom-ref": "94b5aa222132ae13", + "bom-ref": "6c9145074c6d1d21", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/500.pl", "type": "file" }, { - "bom-ref": "2fac3a87a1787a18", + "bom-ref": "c5507d3ea3c60bca", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/5000.pl", "type": "file" }, { - "bom-ref": "5899c6e3acb1624f", + "bom-ref": "225fe33c4fb4f965", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/50000.pl", "type": "file" }, { - "bom-ref": "e0bf90531ce6beb2", + "bom-ref": "46fbb9fec3e5f47c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/6.pl", "type": "file" }, { - "bom-ref": "d1c013bd7fb5fac5", + "bom-ref": "e454f3f0e94f1b23", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/60.pl", "type": "file" }, { - "bom-ref": "6cc8e1a18b86f25a", + "bom-ref": "58345406ad8ca378", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/600.pl", "type": "file" }, { - "bom-ref": "4b59c5372f62bd7e", + "bom-ref": "b28080dd3483ffc0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/6000.pl", "type": "file" }, { - "bom-ref": "680160da946c92dc", + "bom-ref": "2ae70ac819d6f0ae", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/60000.pl", "type": "file" }, { - "bom-ref": "050af5bd7754f37f", + "bom-ref": "c01abb4f2c5e6bad", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/7.pl", "type": "file" }, { - "bom-ref": "a98bff1e88a8a800", + "bom-ref": "386b988eb255448a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/70.pl", "type": "file" }, { - "bom-ref": "17528d362275afd2", + "bom-ref": "7138c4841c748148", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/700.pl", "type": "file" }, { - "bom-ref": "5610577daa6702a9", + "bom-ref": "e62a700d2b8eb547", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/7000.pl", "type": "file" }, { - "bom-ref": "420ce77fe6ef2e43", + "bom-ref": "2e8316b752003bd5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/70000.pl", "type": "file" }, { - "bom-ref": "508d3ec2e0905b83", + "bom-ref": "eb1a4055cb5a4091", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/8.pl", "type": "file" }, { - "bom-ref": "b8c5c926ed85b101", + "bom-ref": "1dcde1674dfc5cf3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/80.pl", "type": "file" }, { - "bom-ref": "c7e8bdc8dcbe04cc", + "bom-ref": "c29535ceda1a53b2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/800.pl", "type": "file" }, { - "bom-ref": "49cf5acb168a3de8", + "bom-ref": "0d6dafd50844f43e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/8000.pl", "type": "file" }, { - "bom-ref": "32a8dcfab8eb9026", + "bom-ref": "a167ab5750b5c708", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/80000.pl", "type": "file" }, { - "bom-ref": "45e28d804a4d355a", + "bom-ref": "9821e3ce88b16904", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/9.pl", "type": "file" }, { - "bom-ref": "91d64649e9326d36", + "bom-ref": "486fbbc4af5d38bc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/90.pl", "type": "file" }, { - "bom-ref": "abfce4c3386ba58e", + "bom-ref": "b79b50e7b183a4b8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/900.pl", "type": "file" }, { - "bom-ref": "f5e91a73e601eae6", + "bom-ref": "c4450bb5daea47bc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/9000.pl", "type": "file" }, { - "bom-ref": "5c04865c4660860b", + "bom-ref": "a2d8c8ab6a7c72b5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Nv/90000.pl", "type": "file" }, { - "bom-ref": "f582070e4d829917", + "bom-ref": "f3a238f8b7a61afd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/PCM/Y.pl", "type": "file" }, { - "bom-ref": "bcbdbc26ca70c0b4", + "bom-ref": "455f50b88e4f23a6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/PatSyn/Y.pl", "type": "file" }, { - "bom-ref": "e03726c4d1fa0413", + "bom-ref": "b9d4fef5c2292705", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Alnum.pl", "type": "file" }, { - "bom-ref": "f58ec8dcb432a92f", + "bom-ref": "78ddb454b43ee051", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Assigned.pl", "type": "file" }, { - "bom-ref": "49ddae7d057ea7ca", + "bom-ref": "39b62c5ff60f873c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Blank.pl", "type": "file" }, { - "bom-ref": "4c4842e2ff63b64f", + "bom-ref": "c42f7592591da6bd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Graph.pl", "type": "file" }, { - "bom-ref": "de32235dae2350b2", + "bom-ref": "2596661f5033e474", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/PerlWord.pl", "type": "file" }, { - "bom-ref": "98c054de71d25d43", + "bom-ref": "1499675202f051c1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/PosixPun.pl", "type": "file" }, { - "bom-ref": "6dbe39d66aa32162", + "bom-ref": "5ba49967370f262c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Print.pl", "type": "file" }, { - "bom-ref": "c49a9820d019973c", + "bom-ref": "28c211e8913d812e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/SpacePer.pl", "type": "file" }, { - "bom-ref": "cf2e2b7ab3de9a98", + "bom-ref": "53abeecd69050172", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Title.pl", "type": "file" }, { - "bom-ref": "9f90d74526da5600", + "bom-ref": "96bfff2d5ff10c22", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/Word.pl", "type": "file" }, { - "bom-ref": "07ff794343f79c20", + "bom-ref": "627ffa5022230a92", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/XPosixPu.pl", "type": "file" }, { - "bom-ref": "7dafa8138929ed08", + "bom-ref": "9345e6bdd9593f0a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlAny.pl", "type": "file" }, { - "bom-ref": "cd8d05ec94db263e", + "bom-ref": "ee15912f6cb60640", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlCh2.pl", "type": "file" }, { - "bom-ref": "2ab2d2efa65b5eb7", + "bom-ref": "511e16c195bda6cd", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlCha.pl", "type": "file" }, { - "bom-ref": "b1f4cd6c18e63b4a", + "bom-ref": "3a088e1d46538288", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlFol.pl", "type": "file" }, { - "bom-ref": "56c7dcb93bd0e79f", + "bom-ref": "0ff82bf4aae8855d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlIDC.pl", "type": "file" }, { - "bom-ref": "75c1b32f63df18df", + "bom-ref": "cb4d40456738dfa1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlIDS.pl", "type": "file" }, { - "bom-ref": "dd0745dfbde81952", + "bom-ref": "44f3a7dd227066c8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlIsI.pl", "type": "file" }, { - "bom-ref": "51c7a7be88d9f51a", + "bom-ref": "e5672dbf402b4bb8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlNch.pl", "type": "file" }, { - "bom-ref": "a3b4f9f1d54d056b", + "bom-ref": "dc89430f9850edd1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlPat.pl", "type": "file" }, { - "bom-ref": "136f373e91b73ad8", + "bom-ref": "982eafed82c15f3e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlPr2.pl", "type": "file" }, { - "bom-ref": "ac0a0201add12e18", + "bom-ref": "9ac466e1b77613ee", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlPro.pl", "type": "file" }, { - "bom-ref": "eeb968da806d3429", + "bom-ref": "4558264471c4055b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Perl/_PerlQuo.pl", "type": "file" }, { - "bom-ref": "e553705004cef5ea", + "bom-ref": "c0cc3a9ada303974", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/QMark/Y.pl", "type": "file" }, { - "bom-ref": "308fead5d43f65cc", + "bom-ref": "9fc80f484efac322", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/AT.pl", "type": "file" }, { - "bom-ref": "90b28b065c2be3f6", + "bom-ref": "92742b53cf51ee80", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/CL.pl", "type": "file" }, { - "bom-ref": "157d71d88d9895bb", + "bom-ref": "6c29765ac6a3a465", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/EX.pl", "type": "file" }, { - "bom-ref": "247d5eabff83fcb2", + "bom-ref": "e7c7ebf6d56a4c08", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/FO.pl", "type": "file" }, { - "bom-ref": "97ad70c072794e7e", + "bom-ref": "5f4079a2a922a664", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/LE.pl", "type": "file" }, { - "bom-ref": "41f9b3aebef7432a", + "bom-ref": "73afe75eed333a28", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/LO.pl", "type": "file" }, { - "bom-ref": "b12cf02b71599b1e", + "bom-ref": "806907e5efa07a88", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/NU.pl", "type": "file" }, { - "bom-ref": "d2d658e9d8da2d78", + "bom-ref": "83bdd90eb396c4da", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/SC.pl", "type": "file" }, { - "bom-ref": "f3246f6e5bbbea80", + "bom-ref": "acd847377d7bf01e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/ST.pl", "type": "file" }, { - "bom-ref": "2f2079d55255e1c4", + "bom-ref": "92e9bac028aef8ba", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/Sp.pl", "type": "file" }, { - "bom-ref": "e8d2b6014680bf6c", + "bom-ref": "237ad3084c968976", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/UP.pl", "type": "file" }, { - "bom-ref": "6a73624721beb7f8", + "bom-ref": "091ea72f6485a37e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SB/XX.pl", "type": "file" }, { - "bom-ref": "cde5069cf5e2c74d", + "bom-ref": "55e6c3aef6c8c8bf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/SD/Y.pl", "type": "file" }, { - "bom-ref": "3a3a800aa9a12114", + "bom-ref": "54ecf912fcbf07a2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/STerm/Y.pl", "type": "file" }, { - "bom-ref": "f42747df2d926fa3", + "bom-ref": "65ba39267515cdd9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Arab.pl", "type": "file" }, { - "bom-ref": "5ba48cd2d19b766b", + "bom-ref": "00ad51d27e3c2389", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Beng.pl", "type": "file" }, { - "bom-ref": "efcb2c6ff3f61b96", + "bom-ref": "d8baed35d1322ca4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Cprt.pl", "type": "file" }, { - "bom-ref": "2b4939097c4b9864", + "bom-ref": "4e9ee8c3806eaee2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Cyrl.pl", "type": "file" }, { - "bom-ref": "ccc796a68ae85d80", + "bom-ref": "2fdf5bb2e5a10fb2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Deva.pl", "type": "file" }, { - "bom-ref": "e6fccd0f9f075a22", + "bom-ref": "d71737370b0b2a68", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Dupl.pl", "type": "file" }, { - "bom-ref": "c74e4b3bfe2735f4", + "bom-ref": "f91a80718dcf36e2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Geor.pl", "type": "file" }, { - "bom-ref": "2bed59e519561637", + "bom-ref": "ecc206f9c902d24d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Glag.pl", "type": "file" }, { - "bom-ref": "92db60bfa242a7d8", + "bom-ref": "ee0a45f96a707a3e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Gong.pl", "type": "file" }, { - "bom-ref": "6f9c690e4252654c", + "bom-ref": "9f2e741ade3ec82a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Gonm.pl", "type": "file" }, { - "bom-ref": "72d77b4273203b3f", + "bom-ref": "78ee9d3c8ecca491", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Gran.pl", "type": "file" }, { - "bom-ref": "1c716f34617458d4", + "bom-ref": "b8c43429161ea492", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Grek.pl", "type": "file" }, { - "bom-ref": "fd19f87b39f3f0fa", + "bom-ref": "3839af501f814cbc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Gujr.pl", "type": "file" }, { - "bom-ref": "83a2dea143baa362", + "bom-ref": "7616b2771d6f59f4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Guru.pl", "type": "file" }, { - "bom-ref": "14fb9f6f690b9f56", + "bom-ref": "93c91ca86c992138", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Han.pl", "type": "file" }, { - "bom-ref": "e292ff8dc1ef79a3", + "bom-ref": "71520f2d0eded981", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Hang.pl", "type": "file" }, { - "bom-ref": "9bccaa71b759b5e9", + "bom-ref": "1abeaeb15f061e2b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Hira.pl", "type": "file" }, { - "bom-ref": "61b92ab5d2616b91", + "bom-ref": "1a8d8cef4df56cb7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Kana.pl", "type": "file" }, { - "bom-ref": "3dd2f690503238f4", + "bom-ref": "8c033765f783eeaa", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Knda.pl", "type": "file" }, { - "bom-ref": "40005edc4b020e4b", + "bom-ref": "c0c6fdb38f4b2bd9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Latn.pl", "type": "file" }, { - "bom-ref": "02074c6c93fbe37a", + "bom-ref": "2a4ce45e1e28b57c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Limb.pl", "type": "file" }, { - "bom-ref": "492bc084a1243a8e", + "bom-ref": "967ca50f4bf80930", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Linb.pl", "type": "file" }, { - "bom-ref": "048b7337994756be", + "bom-ref": "8096ddea2b7bd794", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Mlym.pl", "type": "file" }, { - "bom-ref": "48ac845f436dd6c5", + "bom-ref": "11a7cf345d6fa72f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Mong.pl", "type": "file" }, { - "bom-ref": "7d54d4c2c5c3ff39", + "bom-ref": "47ef76c1a0951e8b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Mult.pl", "type": "file" }, { - "bom-ref": "bae7b0df38dd37d3", + "bom-ref": "8206a8970694a5b1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Orya.pl", "type": "file" }, { - "bom-ref": "bf7418f554a2f16d", + "bom-ref": "02af08e7f7462393", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Sinh.pl", "type": "file" }, { - "bom-ref": "4b5d2a60532b243b", + "bom-ref": "7f0e7d32f9800cf5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Syrc.pl", "type": "file" }, { - "bom-ref": "d05165df4dc43bbe", + "bom-ref": "3c40eef494c8dfb4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Taml.pl", "type": "file" }, { - "bom-ref": "cc0c6e540e97355b", + "bom-ref": "8d73e4ac75300739", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Telu.pl", "type": "file" }, { - "bom-ref": "b81b4da1263f23c0", + "bom-ref": "e1fe9eff8f3fc2ca", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Zinh.pl", "type": "file" }, { - "bom-ref": "103e87580689ed90", + "bom-ref": "c32fcf4d5e466b2a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Sc/Zyyy.pl", "type": "file" }, { - "bom-ref": "c378559b069e1f08", + "bom-ref": "a5d65ac6c17c6d96", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Adlm.pl", "type": "file" }, { - "bom-ref": "84b1e85b6cdafea7", + "bom-ref": "ae9a2281a946649d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Arab.pl", "type": "file" }, { - "bom-ref": "b257812a8be12a6d", + "bom-ref": "213aa96b23191437", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Armn.pl", "type": "file" }, { - "bom-ref": "57a5035c289998d2", + "bom-ref": "92f40f4ee03145ac", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Beng.pl", "type": "file" }, { - "bom-ref": "37d27befbbd929a2", + "bom-ref": "8fcded542304fd1c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Bhks.pl", "type": "file" }, { - "bom-ref": "4c3c43570297e502", + "bom-ref": "ef1f9ca81602f05c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Bopo.pl", "type": "file" }, { - "bom-ref": "a0223e53ca313bad", + "bom-ref": "4e8ae60766384d4f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Cakm.pl", "type": "file" }, { - "bom-ref": "3a83d4de592b1da9", + "bom-ref": "251c3eab1a40d25b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Cham.pl", "type": "file" }, { - "bom-ref": "62189040517cbd52", + "bom-ref": "089dc83b7adf0784", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Copt.pl", "type": "file" }, { - "bom-ref": "57f8b196b60735cc", + "bom-ref": "8bf263e9203a3a26", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Cprt.pl", "type": "file" }, { - "bom-ref": "0904f717dc0dd703", + "bom-ref": "622300d8e1e52f59", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Cyrl.pl", "type": "file" }, { - "bom-ref": "a872f2a75d6cffd6", + "bom-ref": "d35d997914c7f7cc", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Deva.pl", "type": "file" }, { - "bom-ref": "d5e5c643040b9839", + "bom-ref": "0a7b2c3da5c9c8cf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Diak.pl", "type": "file" }, { - "bom-ref": "db87334d8630e4b4", + "bom-ref": "d1092703d71ad7a2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Dupl.pl", "type": "file" }, { - "bom-ref": "a6dde31b5d106085", + "bom-ref": "418244cc1eae780b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Ethi.pl", "type": "file" }, { - "bom-ref": "aeba2a7da68924f8", + "bom-ref": "f4448a6648c13e5a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Geor.pl", "type": "file" }, { - "bom-ref": "f83c93d76a0c8908", + "bom-ref": "ba61de0ebea027da", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Glag.pl", "type": "file" }, { - "bom-ref": "c48dcf619d085b1d", + "bom-ref": "d019cf5e16e2908f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Gong.pl", "type": "file" }, { - "bom-ref": "d2f3846e434c7f9b", + "bom-ref": "97e679ead88791f5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Gonm.pl", "type": "file" }, { - "bom-ref": "28dd92b07ec61a18", + "bom-ref": "3fe2b3de2707920e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Gran.pl", "type": "file" }, { - "bom-ref": "cad7136cfecf829d", + "bom-ref": "84e41b323d2e32bb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Grek.pl", "type": "file" }, { - "bom-ref": "ece51fbf7e1d0add", + "bom-ref": "6c90cb4c25b69983", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Gujr.pl", "type": "file" }, { - "bom-ref": "85615e626d8571be", + "bom-ref": "f26355c4a0a1fde0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Guru.pl", "type": "file" }, { - "bom-ref": "ba38a3cb736e85e9", + "bom-ref": "ca6b03c8290eaf27", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Han.pl", "type": "file" }, { - "bom-ref": "53f3faa160074835", + "bom-ref": "16ab9451d3557253", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Hang.pl", "type": "file" }, { - "bom-ref": "19a8c1b0a5226d8a", + "bom-ref": "1667ac4dae15dfa4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Hebr.pl", "type": "file" }, { - "bom-ref": "99f9b1d12da946d7", + "bom-ref": "6b84093746d89951", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Hira.pl", "type": "file" }, { - "bom-ref": "cc26a8e7a34feed1", + "bom-ref": "e000a26145b376db", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Hmng.pl", "type": "file" }, { - "bom-ref": "5b81cafee2de8310", + "bom-ref": "71c066fc7fa4c07e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Hmnp.pl", "type": "file" }, { - "bom-ref": "f6c8dabef3c41bd9", + "bom-ref": "50db04dd4c53d47f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Kana.pl", "type": "file" }, { - "bom-ref": "6c9f6221f9cc0764", + "bom-ref": "b8d07a22542d94ea", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Khar.pl", "type": "file" }, { - "bom-ref": "eb8fd6295273e080", + "bom-ref": "f776aa785c284e7e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Khmr.pl", "type": "file" }, { - "bom-ref": "546b6dad3ee32000", + "bom-ref": "b8173c2bfe60a266", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Khoj.pl", "type": "file" }, { - "bom-ref": "9a8f5f93f4011b10", + "bom-ref": "f287f3fd50b23106", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Knda.pl", "type": "file" }, { - "bom-ref": "b1fbe2f95cbd6963", + "bom-ref": "20a08bfe960162b5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Kthi.pl", "type": "file" }, { - "bom-ref": "ec60416954fa9ad7", + "bom-ref": "68739bd75b6b3225", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Lana.pl", "type": "file" }, { - "bom-ref": "88e011f2a9db5ae3", + "bom-ref": "b845212806d2b8e1", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Lao.pl", "type": "file" }, { - "bom-ref": "a2307bef3259fd5f", + "bom-ref": "ad5c6bda57e41aa5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Latn.pl", "type": "file" }, { - "bom-ref": "751387c25ebddbfe", + "bom-ref": "670818b6e487c47c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Limb.pl", "type": "file" }, { - "bom-ref": "40e16f8b9813d256", + "bom-ref": "07bbb1ccb8409e44", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Lina.pl", "type": "file" }, { - "bom-ref": "a0c8c4878ac0b7d8", + "bom-ref": "d67c2b822b822d32", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Linb.pl", "type": "file" }, { - "bom-ref": "983289b6e11afd5a", + "bom-ref": "19a9605ce2634350", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Mlym.pl", "type": "file" }, { - "bom-ref": "4e6292e73a38e85d", + "bom-ref": "25cd83b1ca42f1e7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Mong.pl", "type": "file" }, { - "bom-ref": "2c6421d3afbf99a9", + "bom-ref": "4667f71bac8ce4e3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Mult.pl", "type": "file" }, { - "bom-ref": "c78b3daba306eb8d", + "bom-ref": "56f3b35968f30477", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Mymr.pl", "type": "file" }, { - "bom-ref": "278a6b2f3a332bd3", + "bom-ref": "800bfea4c903a111", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Nand.pl", "type": "file" }, { - "bom-ref": "4edf81a42149ecb7", + "bom-ref": "bb103cff49493e39", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Nko.pl", "type": "file" }, { - "bom-ref": "5101d0ab46fdd443", + "bom-ref": "8a4784dc4afacae9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Orya.pl", "type": "file" }, { - "bom-ref": "fa92d3c581742a47", + "bom-ref": "3da53a87ef92fc01", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Phlp.pl", "type": "file" }, { - "bom-ref": "6bde76a355218c25", + "bom-ref": "c308cd18a5b8327f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Rohg.pl", "type": "file" }, { - "bom-ref": "f3f3503ef68e1a83", + "bom-ref": "92505881ff54f299", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Shrd.pl", "type": "file" }, { - "bom-ref": "8fffc87e8dd1d9a6", + "bom-ref": "2a773ad3eac7c36c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Sind.pl", "type": "file" }, { - "bom-ref": "2144601a92c0d89a", + "bom-ref": "59a3b34d9fdce9d8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Sinh.pl", "type": "file" }, { - "bom-ref": "ac9099ef6dc4d676", + "bom-ref": "7cd4225d8f045884", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Syrc.pl", "type": "file" }, { - "bom-ref": "f5aeee5718ae7b7f", + "bom-ref": "7babc01f9d9e4951", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Tagb.pl", "type": "file" }, { - "bom-ref": "d2e72194b7fa832c", + "bom-ref": "3d3da3055f79bd72", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Takr.pl", "type": "file" }, { - "bom-ref": "f92e5efba5b66d62", + "bom-ref": "cf598da50c0947d4", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Talu.pl", "type": "file" }, { - "bom-ref": "7fff6801dc6227f8", + "bom-ref": "b4093d5e266c10da", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Taml.pl", "type": "file" }, { - "bom-ref": "ba75d2a190fe37a2", + "bom-ref": "00681daee9ca34c8", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Tang.pl", "type": "file" }, { - "bom-ref": "8b7e6567c8a418e9", + "bom-ref": "4de520e4650b6fd3", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Telu.pl", "type": "file" }, { - "bom-ref": "58854f5131cb3944", + "bom-ref": "b0703640d9d92d36", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Thaa.pl", "type": "file" }, { - "bom-ref": "0c2f1d3ae52f43f0", + "bom-ref": "666513e6d153dbe2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Tibt.pl", "type": "file" }, { - "bom-ref": "4240da10f9789e15", + "bom-ref": "357cae338142f457", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Tirh.pl", "type": "file" }, { - "bom-ref": "b517624cd92b6a85", + "bom-ref": "56bcb2ee5c5e477b", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Vith.pl", "type": "file" }, { - "bom-ref": "7e389d811752baae", + "bom-ref": "a2a17ec530970694", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Xsux.pl", "type": "file" }, { - "bom-ref": "853e64e8a14e5677", + "bom-ref": "63504190fd6103f9", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Yezi.pl", "type": "file" }, { - "bom-ref": "52dfb4df9fa44a13", + "bom-ref": "1136819f4d9bbb41", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Yi.pl", "type": "file" }, { - "bom-ref": "a3f290a0a05a5280", + "bom-ref": "a21d47719e2547a2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Zinh.pl", "type": "file" }, { - "bom-ref": "99cbf75bbbadbf2c", + "bom-ref": "544d461cd4d4b196", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Zyyy.pl", "type": "file" }, { - "bom-ref": "1175703bf7f6ca5d", + "bom-ref": "1398e73a104293fb", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Scx/Zzzz.pl", "type": "file" }, { - "bom-ref": "e75d766f0516a750", + "bom-ref": "04c61d2caa9e9bd6", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Term/Y.pl", "type": "file" }, { - "bom-ref": "df65629dd74d7dbb", + "bom-ref": "ea9ad518199023d5", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/UIdeo/Y.pl", "type": "file" }, { - "bom-ref": "42bc3e248a02d218", + "bom-ref": "04d92f0996bcda66", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Upper/Y.pl", "type": "file" }, { - "bom-ref": "96a92e2c08c756f7", + "bom-ref": "e0ed2e04a6558e71", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/VS/Y.pl", "type": "file" }, { - "bom-ref": "8e89a0fc45f9c860", + "bom-ref": "11731f887a386882", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Vo/R.pl", "type": "file" }, { - "bom-ref": "5a9d543289b04164", + "bom-ref": "0b4cf012d329ef92", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Vo/Tr.pl", "type": "file" }, { - "bom-ref": "90a114f9b0b77650", + "bom-ref": "79ac0bb67437f57a", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Vo/Tu.pl", "type": "file" }, { - "bom-ref": "a8d53f1cc245bcc8", + "bom-ref": "f23b737c369d732e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/Vo/U.pl", "type": "file" }, { - "bom-ref": "26248c9460f041ca", + "bom-ref": "96c2a0768b9f7d9c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/EX.pl", "type": "file" }, { - "bom-ref": "06d6a920953fd1cd", + "bom-ref": "ac81fe0ff81cefbf", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/Extend.pl", "type": "file" }, { - "bom-ref": "940ea9d432c00b37", + "bom-ref": "db3df898b12e7015", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/FO.pl", "type": "file" }, { - "bom-ref": "22ec8cd1749b755b", + "bom-ref": "bfc47ddcda29105d", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/HL.pl", "type": "file" }, { - "bom-ref": "6a29a1840ba1a64c", + "bom-ref": "3b35b1db690b9a92", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/KA.pl", "type": "file" }, { - "bom-ref": "2fe714ddb35c2054", + "bom-ref": "bb11bda650d465f2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/LE.pl", "type": "file" }, { - "bom-ref": "4ec3528ee28eca00", + "bom-ref": "ed2ce149d5e849d2", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/MB.pl", "type": "file" }, { - "bom-ref": "b09378947c3fd37a", + "bom-ref": "e5f1302c37418134", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/ML.pl", "type": "file" }, { - "bom-ref": "0a007e2a825ffd12", + "bom-ref": "936e191ce7f37a60", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/MN.pl", "type": "file" }, { - "bom-ref": "e907dcdaac7d95e7", + "bom-ref": "753c3c9bebab7e29", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/NU.pl", "type": "file" }, { - "bom-ref": "d516715b82b71795", + "bom-ref": "ac32f67fb861210f", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/WSegSpac.pl", "type": "file" }, { - "bom-ref": "bf3cc0f5ffa0a0d8", + "bom-ref": "a1dd9411a7543c7e", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/WB/XX.pl", "type": "file" }, { - "bom-ref": "39722702e3297882", + "bom-ref": "db3c8f705a976e98", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/XIDC/Y.pl", "type": "file" }, { - "bom-ref": "615c86094a63a274", + "bom-ref": "f7eb065080d6bc86", "name": "/usr/lib/x86_64-linux-gnu/perl-base/unicore/lib/XIDS/Y.pl", "type": "file" }, { - "bom-ref": "74c330a69fa2782f", + "bom-ref": "364cb5e3ba436819", "name": "/usr/lib/x86_64-linux-gnu/perl-base/utf8.pm", "type": "file" }, { - "bom-ref": "13178891090f0e42", + "bom-ref": "8c5fc4408d62336c", "name": "/usr/lib/x86_64-linux-gnu/perl-base/vars.pm", "type": "file" }, { - "bom-ref": "a055a53dcf9c3462", + "bom-ref": "ff2c881a628d89e0", "name": "/usr/lib/x86_64-linux-gnu/perl-base/warnings.pm", "type": "file" }, { - "bom-ref": "ca603b4448e6ba85", + "bom-ref": "d0d05aa5352ba1b7", "name": "/usr/lib/x86_64-linux-gnu/perl-base/warnings/register.pm", "type": "file" }, { - "bom-ref": "5d977292ae0270db", + "bom-ref": "ddc1d9abac7477a6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/B.pm", "type": "file" }, { - "bom-ref": "ad01ffedbafc525b", + "bom-ref": "5d7975112bfad206", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/B/Concise.pm", "type": "file" }, { - "bom-ref": "69d931c6f5456e0b", + "bom-ref": "43d707607eee3bde", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/B/Showlex.pm", "type": "file" }, { - "bom-ref": "9b69fb264dd539f1", + "bom-ref": "2871052ffca6e614", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/B/Terse.pm", "type": "file" }, { - "bom-ref": "a709cfa214c9549b", + "bom-ref": "c0b4154902d96f02", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/B/Xref.pm", "type": "file" }, { - "bom-ref": "596bea3576ea44aa", + "bom-ref": "97f8bb24b4f18493", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/EXTERN.h", "type": "file" }, { - "bom-ref": "1e490fd9d6d9e188", + "bom-ref": "f2fa84829c977065", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/INTERN.h", "type": "file" }, { - "bom-ref": "933bc9725ac0908f", + "bom-ref": "a432c0fb22e8c77e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/XSUB.h", "type": "file" }, { - "bom-ref": "9b69754a464316f4", + "bom-ref": "cd4c207a0dd13821", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/av.h", "type": "file" }, { - "bom-ref": "b677db814df90b83", + "bom-ref": "827482a6a6d779ee", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/bitcount.h", "type": "file" }, { - "bom-ref": "93680703e74fcee3", + "bom-ref": "23e9b25212f9c1ea", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/charclass_invlists.h", "type": "file" }, { - "bom-ref": "fbc71ea78dba184e", + "bom-ref": "1c3f24c9b3801fbb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/config.h", "type": "file" }, { - "bom-ref": "c0fa664c24272596", + "bom-ref": "54805d4fae219a6b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/cop.h", "type": "file" }, { - "bom-ref": "6d962f076e67ac1b", + "bom-ref": "a91f09e3982624d6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/cv.h", "type": "file" }, { - "bom-ref": "7c6ba32ef5b586ea", + "bom-ref": "29e82f83650462eb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/dosish.h", "type": "file" }, { - "bom-ref": "28b7287e3321ffd6", + "bom-ref": "bfa9ba34a5f5540f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/ebcdic_tables.h", "type": "file" }, { - "bom-ref": "2c84b30fb4701a9f", + "bom-ref": "1c0ca8d4a5adefb6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/embed.h", "type": "file" }, { - "bom-ref": "59440366c217fa58", + "bom-ref": "1200e5dd94814559", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/embedvar.h", "type": "file" }, { - "bom-ref": "d65d2a8d1d2db3f7", + "bom-ref": "f4723bcc28322a92", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/fakesdio.h", "type": "file" }, { - "bom-ref": "fdc6d1dfaefbfc1d", + "bom-ref": "657327c0b1a4437c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/feature.h", "type": "file" }, { - "bom-ref": "1140abd590bf4ca0", + "bom-ref": "0b42249f75dfc46d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/form.h", "type": "file" }, { - "bom-ref": "ff9482499ef1019f", + "bom-ref": "1c4e65adbacf5786", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/git_version.h", "type": "file" }, { - "bom-ref": "6d360fc5aa32527b", + "bom-ref": "04b4ae478d758876", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/gv.h", "type": "file" }, { - "bom-ref": "6775732a63721830", + "bom-ref": "7eaba96d2979f1b5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/handy.h", "type": "file" }, { - "bom-ref": "6dce8eb6d076b8a4", + "bom-ref": "f535296db88a4841", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/hv.h", "type": "file" }, { - "bom-ref": "2214f0f07f8685f1", + "bom-ref": "7a8e2acd3f5b8e74", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/hv_func.h", "type": "file" }, { - "bom-ref": "6c8ff8322808ec27", + "bom-ref": "544d61c271af6c86", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/hv_macro.h", "type": "file" }, { - "bom-ref": "27f3e702dfcd3def", + "bom-ref": "20478068a975838e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/inline.h", "type": "file" }, { - "bom-ref": "2ffac9c551db7b46", + "bom-ref": "179ff06237407dc7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/intrpvar.h", "type": "file" }, { - "bom-ref": "d63dfb6fbeceeee6", + "bom-ref": "fe4869855831fe5b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/invlist_inline.h", "type": "file" }, { - "bom-ref": "daa5ef281f90a283", + "bom-ref": "647c1a2fe36d90ca", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/iperlsys.h", "type": "file" }, { - "bom-ref": "623abd4b803f2c7e", + "bom-ref": "267eceb6d56fe8ab", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/keywords.h", "type": "file" }, { - "bom-ref": "0690c96d50ba75f6", + "bom-ref": "de59106072032c87", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/l1_char_class_tab.h", "type": "file" }, { - "bom-ref": "bd0266d7e2680696", + "bom-ref": "38e50bcf0d6556ab", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/malloc_ctl.h", "type": "file" }, { - "bom-ref": "f3245f4552761727", + "bom-ref": "197d12320cba451e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/metaconfig.h", "type": "file" }, { - "bom-ref": "74d3b41f178558b8", + "bom-ref": "af3894f89c68f4bd", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/mg.h", "type": "file" }, { - "bom-ref": "8358bb715f9f86df", + "bom-ref": "846adf5cc4ce8966", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/mg_data.h", "type": "file" }, { - "bom-ref": "06617d06c004792d", + "bom-ref": "42349c8c4f072394", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/mg_raw.h", "type": "file" }, { - "bom-ref": "5d3e0539419a4e54", + "bom-ref": "fd6411d83a5d62cd", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/mg_vtable.h", "type": "file" }, { - "bom-ref": "44a48450126d431a", + "bom-ref": "6504afe0580d828f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/mydtrace.h", "type": "file" }, { - "bom-ref": "3d26ae560748ceea", + "bom-ref": "b74555f3771cd0e3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/nostdio.h", "type": "file" }, { - "bom-ref": "66beeecff81aa8e8", + "bom-ref": "310876c374e84e0d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/op.h", "type": "file" }, { - "bom-ref": "753ba3571dcd76aa", + "bom-ref": "b067985b4081d1a7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/op_reg_common.h", "type": "file" }, { - "bom-ref": "914d513f47097f0c", + "bom-ref": "df027666d7a80a4d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/opcode.h", "type": "file" }, { - "bom-ref": "c2bea66ba121ca0f", + "bom-ref": "057dd457a293501e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/opnames.h", "type": "file" }, { - "bom-ref": "deb34548eca9c6fb", + "bom-ref": "a54d458b13cfdcb2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/overload.h", "type": "file" }, { - "bom-ref": "8c26af1213696dc7", + "bom-ref": "570719a7bad0a57e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/pad.h", "type": "file" }, { - "bom-ref": "21d4108ee076f7af", + "bom-ref": "eebaf5ee502d9a66", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/parser.h", "type": "file" }, { - "bom-ref": "9516cdbd05e797ac", + "bom-ref": "b23f26632a12c359", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/patchlevel-debian.h", "type": "file" }, { - "bom-ref": "abade5f7d3ddab52", + "bom-ref": "5b6be9ff87929033", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/patchlevel.h", "type": "file" }, { - "bom-ref": "c670c616a2569102", + "bom-ref": "9a39a28f77dfc3cb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perl.h", "type": "file" }, { - "bom-ref": "6b7d71c146f5acf9", + "bom-ref": "b277c05307db4d80", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perl_inc_macro.h", "type": "file" }, { - "bom-ref": "e82e7e8347ea50d6", + "bom-ref": "21e71ade58144f83", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perl_langinfo.h", "type": "file" }, { - "bom-ref": "6e1c17b9c31a5f52", + "bom-ref": "0e858b5259a6e1cb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perl_siphash.h", "type": "file" }, { - "bom-ref": "a628ffb600a52131", + "bom-ref": "3b2e892790ab3568", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perlapi.h", "type": "file" }, { - "bom-ref": "33f3f5ee7cb9f5db", + "bom-ref": "e4af680d4af62e92", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perlio.h", "type": "file" }, { - "bom-ref": "45984f7564f3ad4c", + "bom-ref": "f564dc7cc5df30e9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perliol.h", "type": "file" }, { - "bom-ref": "f06bc9de3cfff2e9", + "bom-ref": "c262494e05183d54", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perlsdio.h", "type": "file" }, { - "bom-ref": "5dd0617c78638d08", + "bom-ref": "8bad27999f6ab675", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perlstatic.h", "type": "file" }, { - "bom-ref": "3fecb9dde72306d1", + "bom-ref": "c0a55872235e05a4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perlvars.h", "type": "file" }, { - "bom-ref": "8c7c076e939883c2", + "bom-ref": "a367fb81f231370f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/perly.h", "type": "file" }, { - "bom-ref": "bf7f15f858004859", + "bom-ref": "37fe7588c1b49080", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/pp.h", "type": "file" }, { - "bom-ref": "848258e43fe6601f", + "bom-ref": "673e41bbdfe9959e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/pp_proto.h", "type": "file" }, { - "bom-ref": "472f6cbea0d55e14", + "bom-ref": "8988d4c11649cd25", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/proto.h", "type": "file" }, { - "bom-ref": "b82cf8666f31e3dc", + "bom-ref": "08352deb7588cc51", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/reentr.h", "type": "file" }, { - "bom-ref": "99dce255d4d80cdb", + "bom-ref": "ad471c1cb1e240a2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/regcharclass.h", "type": "file" }, { - "bom-ref": "56662c05bcb0a65f", + "bom-ref": "028481637f07b582", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/regcomp.h", "type": "file" }, { - "bom-ref": "7b94acbf9bf26e07", + "bom-ref": "ccc0c8b8e3f89cde", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/regcomp_internal.h", "type": "file" }, { - "bom-ref": "d682cb4c2a4370bc", + "bom-ref": "74a883e120fda831", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/regexp.h", "type": "file" }, { - "bom-ref": "5768f2256af1df0e", + "bom-ref": "9ca5bf050f84bf1b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/reginline.h", "type": "file" }, { - "bom-ref": "c78a21fa174644f6", + "bom-ref": "63e650e596c435e7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/regnodes.h", "type": "file" }, { - "bom-ref": "8cd2d14b213067af", + "bom-ref": "711cab72104e6be6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/sbox32_hash.h", "type": "file" }, { - "bom-ref": "5c4cef45527340a7", + "bom-ref": "ac15773bed28384a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/scope.h", "type": "file" }, { - "bom-ref": "d09f91cdec2b351f", + "bom-ref": "f7f7445c4a2381ee", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/scope_types.h", "type": "file" }, { - "bom-ref": "f6de4f9a805f5bfe", + "bom-ref": "14451fa9d9692c97", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/sv.h", "type": "file" }, { - "bom-ref": "eba86dc0b5189b73", + "bom-ref": "8839a44b781b3b72", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/sv_inline.h", "type": "file" }, { - "bom-ref": "6e119f51f74cc31b", + "bom-ref": "997d90be6a6be4d2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/thread.h", "type": "file" }, { - "bom-ref": "30f801fac4a7ac4d", + "bom-ref": "679261b35a1a4dd0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/time64.h", "type": "file" }, { - "bom-ref": "bc50b4f42fdb7bf1", + "bom-ref": "230819c768adf004", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/time64_config.h", "type": "file" }, { - "bom-ref": "e8d791f197862882", + "bom-ref": "b8fd43ea268c04a7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/uconfig.h", "type": "file" }, { - "bom-ref": "1a34ae2565cce20e", + "bom-ref": "ad2c9d259bd875d3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/uni_keywords.h", "type": "file" }, { - "bom-ref": "5d5ba461bbe811ce", + "bom-ref": "09d8f4110ac7dbeb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/unicode_constants.h", "type": "file" }, { - "bom-ref": "5e52b8fe9ed575d5", + "bom-ref": "c5ea9ec6a404043c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/unixish.h", "type": "file" }, { - "bom-ref": "67008c47b4946865", + "bom-ref": "e3c3fcfe55f5634c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/utf8.h", "type": "file" }, { - "bom-ref": "e453ffc267a666d8", + "bom-ref": "4e3e013e1e865725", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/utfebcdic.h", "type": "file" }, { - "bom-ref": "d18de8393a7f5d79", + "bom-ref": "b50ab6077fe9d4f0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/util.h", "type": "file" }, { - "bom-ref": "c4c4d64ffb2b2c03", + "bom-ref": "5f4c9de91be52026", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/uudmap.h", "type": "file" }, { - "bom-ref": "15b24bf897804796", + "bom-ref": "1435782440f9e7e3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/vutil.h", "type": "file" }, { - "bom-ref": "bd6a1285fe186971", + "bom-ref": "87202cda3e9d0f6c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/warnings.h", "type": "file" }, { - "bom-ref": "2fb8967b0edfe285", + "bom-ref": "f61cc04b2d256be4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/CORE/zaphod32_hash.h", "type": "file" }, { - "bom-ref": "b2d8ba06d40d9e45", + "bom-ref": "d22d8d14c376cb5c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Compress/Raw/Bzip2.pm", "type": "file" }, { - "bom-ref": "2c0463bf696fc674", + "bom-ref": "c2991b760f1521c1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Compress/Raw/Zlib.pm", "type": "file" }, { - "bom-ref": "ccb52d2228121e08", + "bom-ref": "051fddd44364e7e1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Config.pm", "type": "file" }, { - "bom-ref": "5e1c7d053b7147fd", + "bom-ref": "e49ce10a8a17ef30", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Config.pod", "type": "file" }, { - "bom-ref": "391282670dd8125c", + "bom-ref": "3a3e7ddd400442ad", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Config_git.pl", "type": "file" }, { - "bom-ref": "f5803b64e1ebcfb7", + "bom-ref": "fd36c6ffc9a5ba9a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Config_heavy.pl", "type": "file" }, { - "bom-ref": "1b1f531c539a7590", + "bom-ref": "0b201c487cf7fc09", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Cwd.pm", "type": "file" }, { - "bom-ref": "6d65130ba8cb88ae", + "bom-ref": "175653e81227be0f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/DB_File.pm", "type": "file" }, { - "bom-ref": "648c35876f514383", + "bom-ref": "877cc2e72a85cdc2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Data/Dumper.pm", "type": "file" }, { - "bom-ref": "5da0ccb0c9ed123e", + "bom-ref": "70ff1b46b6ab19af", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Devel/PPPort.pm", "type": "file" }, { - "bom-ref": "aaeecbb7717566dc", + "bom-ref": "b479a12a4c74d7c9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Devel/Peek.pm", "type": "file" }, { - "bom-ref": "67ac9332a6daed4c", + "bom-ref": "738a26738d014ac1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Digest/MD5.pm", "type": "file" }, { - "bom-ref": "b1189c1d02d3c7b4", + "bom-ref": "acbc1b2512b9d181", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Digest/SHA.pm", "type": "file" }, { - "bom-ref": "1938facd7e733248", + "bom-ref": "af50894036f4f089", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/DynaLoader.pm", "type": "file" }, { - "bom-ref": "9aa95a6d15c44b12", + "bom-ref": "102f811772713cdb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode.pm", "type": "file" }, { - "bom-ref": "bac565e2b39bde6a", + "bom-ref": "b1dcd603112f86bf", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Alias.pm", "type": "file" }, { - "bom-ref": "c8abb2b62ebdd0d3", + "bom-ref": "1a3370c1058b48f6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Byte.pm", "type": "file" }, { - "bom-ref": "a68b8816f2d947ab", + "bom-ref": "79f454377674e7fa", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/CJKConstants.pm", "type": "file" }, { - "bom-ref": "ab786f069588718d", + "bom-ref": "fb41ed73b16c20cc", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/CN.pm", "type": "file" }, { - "bom-ref": "6e9f33ddce726e84", + "bom-ref": "10af05e4bc667b6d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/CN/HZ.pm", "type": "file" }, { - "bom-ref": "d194bb3679b9a6de", + "bom-ref": "5aa56527dd72e337", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Config.pm", "type": "file" }, { - "bom-ref": "12360d99a4bf9b2f", + "bom-ref": "6514f8edc83de89a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/EBCDIC.pm", "type": "file" }, { - "bom-ref": "23195860a45d373e", + "bom-ref": "a5a735a74bf715b3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Encoder.pm", "type": "file" }, { - "bom-ref": "ec703fb2f9f3a048", + "bom-ref": "11cb60e29299d631", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Encoding.pm", "type": "file" }, { - "bom-ref": "c19197602c16767b", + "bom-ref": "7a6dd19df15371b2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/GSM0338.pm", "type": "file" }, { - "bom-ref": "ed94101d0bbf2bcf", + "bom-ref": "68f1a261600a214a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Guess.pm", "type": "file" }, { - "bom-ref": "0a51b402f3b16546", + "bom-ref": "e3ab08456266a817", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/JP.pm", "type": "file" }, { - "bom-ref": "be9433ab234476f9", + "bom-ref": "3dee673cd2392364", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/JP/H2Z.pm", "type": "file" }, { - "bom-ref": "bfc8f34d76e7135c", + "bom-ref": "b5340be7a7440b79", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/JP/JIS7.pm", "type": "file" }, { - "bom-ref": "689be7ed611ad850", + "bom-ref": "d3b610ca31b35a91", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/KR.pm", "type": "file" }, { - "bom-ref": "9b165a24c8967511", + "bom-ref": "42b34a83693c9218", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/KR/2022_KR.pm", "type": "file" }, { - "bom-ref": "4cae989bcebaa809", + "bom-ref": "295072dd601ef488", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/MIME/Header.pm", "type": "file" }, { - "bom-ref": "c493b093a0f662b7", + "bom-ref": "d9bd88f03b7b302e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/MIME/Header/ISO_2022_JP.pm", "type": "file" }, { - "bom-ref": "a49688b380e7a1ba", + "bom-ref": "dc54e98804cafaef", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/MIME/Name.pm", "type": "file" }, { - "bom-ref": "9f05e7cc84d64f07", + "bom-ref": "d085e64bb3f2fcfe", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Symbol.pm", "type": "file" }, { - "bom-ref": "5bef84e211d6f4fb", + "bom-ref": "2a7e437f525b8052", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/TW.pm", "type": "file" }, { - "bom-ref": "fbf7311e12d8b5a3", + "bom-ref": "50932e37f2a12242", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Unicode.pm", "type": "file" }, { - "bom-ref": "a33cf22fbd443698", + "bom-ref": "5b1e58629ba00d29", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Encode/Unicode/UTF7.pm", "type": "file" }, { - "bom-ref": "fdd20a8f5e34912a", + "bom-ref": "513b52d7b697e4e3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Errno.pm", "type": "file" }, { - "bom-ref": "5b5ce1e0885aad81", + "bom-ref": "8852aca3d7571940", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Fcntl.pm", "type": "file" }, { - "bom-ref": "185a7404337ff360", + "bom-ref": "0a7621bfb0d71765", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/DosGlob.pm", "type": "file" }, { - "bom-ref": "05a195dfaa8a03bf", + "bom-ref": "efb487d135db77aa", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Glob.pm", "type": "file" }, { - "bom-ref": "ec0a65256bd10c15", + "bom-ref": "c9805e30fad656cc", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec.pm", "type": "file" }, { - "bom-ref": "d804d3162f3f9f69", + "bom-ref": "a61660edf1b9db80", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/AmigaOS.pm", "type": "file" }, { - "bom-ref": "cdb1184ab83aee0a", + "bom-ref": "6685a76e4c1ff1c7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Cygwin.pm", "type": "file" }, { - "bom-ref": "32169fbc74cddfab", + "bom-ref": "160b3bc189ff86f6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Epoc.pm", "type": "file" }, { - "bom-ref": "82b374d067165538", + "bom-ref": "0f32a2e1d553364d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Functions.pm", "type": "file" }, { - "bom-ref": "f7a353c3e5db321b", + "bom-ref": "d9da5255abf77342", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Mac.pm", "type": "file" }, { - "bom-ref": "6496adcabe18e271", + "bom-ref": "eb64249c2aab11ec", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/OS2.pm", "type": "file" }, { - "bom-ref": "d4a8291601aebd4b", + "bom-ref": "dd2b3b462871ecca", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Unix.pm", "type": "file" }, { - "bom-ref": "0823f25eb5ca156b", + "bom-ref": "c2ad689ed050b84a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/VMS.pm", "type": "file" }, { - "bom-ref": "b36962317f994e9e", + "bom-ref": "9f725552280be3c7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/File/Spec/Win32.pm", "type": "file" }, { - "bom-ref": "d62cc127df8f3c2d", + "bom-ref": "e4f0fb294ece2148", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Filter/Util/Call.pm", "type": "file" }, { - "bom-ref": "5e4597ef4cc55e78", + "bom-ref": "840fcd3b10fd1481", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/GDBM_File.pm", "type": "file" }, { - "bom-ref": "e3a02cca21191f9d", + "bom-ref": "8d6fc007dae301a8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Hash/Util.pm", "type": "file" }, { - "bom-ref": "575188ae9441ab8d", + "bom-ref": "edbcc989338f19d0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Hash/Util/FieldHash.pm", "type": "file" }, { - "bom-ref": "cbbe074497959051", + "bom-ref": "77535ab335e7ab7c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/I18N/Langinfo.pm", "type": "file" }, { - "bom-ref": "d13e98016e45c241", + "bom-ref": "364add9c0be82870", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO.pm", "type": "file" }, { - "bom-ref": "11d0c8fb498f6550", + "bom-ref": "d0755d029a5856a5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Dir.pm", "type": "file" }, { - "bom-ref": "75827927515799cc", + "bom-ref": "9ee2fd25f9de1e3d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/File.pm", "type": "file" }, { - "bom-ref": "210fea5c999b58e8", + "bom-ref": "4c6899ac65a15535", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Handle.pm", "type": "file" }, { - "bom-ref": "e7a5af946ff355d6", + "bom-ref": "31f63d3347cecef7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Pipe.pm", "type": "file" }, { - "bom-ref": "aad6ca223dc7f172", + "bom-ref": "b959c2f38553d64f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Poll.pm", "type": "file" }, { - "bom-ref": "fd02dcb353d87cf1", + "bom-ref": "151a3504a2a0db08", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Seekable.pm", "type": "file" }, { - "bom-ref": "b073bda0cf497a7e", + "bom-ref": "d7c73b30776e6ac7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Select.pm", "type": "file" }, { - "bom-ref": "3e6d55470b9f6635", + "bom-ref": "976ac45929f93ce4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Socket.pm", "type": "file" }, { - "bom-ref": "25966c0782010e57", + "bom-ref": "31e278a6bdb5d022", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Socket/INET.pm", "type": "file" }, { - "bom-ref": "24416c9d821803bb", + "bom-ref": "a61ff475e5346b56", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IO/Socket/UNIX.pm", "type": "file" }, { - "bom-ref": "57e9c3b7558a92de", + "bom-ref": "bf78f4296d7f0eeb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IPC/Msg.pm", "type": "file" }, { - "bom-ref": "3a6067afce52b1a1", + "bom-ref": "728c0db32d542bfc", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IPC/Semaphore.pm", "type": "file" }, { - "bom-ref": "4723aed379bfed8f", + "bom-ref": "b0e24b8d93cec776", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IPC/SharedMem.pm", "type": "file" }, { - "bom-ref": "5934b5d9a42be398", + "bom-ref": "14b69bbd44aa0545", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/IPC/SysV.pm", "type": "file" }, { - "bom-ref": "c6de882ed7bc467b", + "bom-ref": "0153c53d7702ebee", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/List/Util.pm", "type": "file" }, { - "bom-ref": "1e72a3742b30d6c5", + "bom-ref": "47234d95d9456bf0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/List/Util/XS.pm", "type": "file" }, { - "bom-ref": "98fe2831673b58ab", + "bom-ref": "7f2c21b73c591672", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/MIME/Base64.pm", "type": "file" }, { - "bom-ref": "65f33723be10bdd3", + "bom-ref": "46ae701880830ece", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/MIME/QuotedPrint.pm", "type": "file" }, { - "bom-ref": "48a6eb9f6909263e", + "bom-ref": "1ec79a55fc4a454f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Math/BigInt/FastCalc.pm", "type": "file" }, { - "bom-ref": "f253630d3fb73754", + "bom-ref": "06ddeb1d7f7c9b39", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/NDBM_File.pm", "type": "file" }, { - "bom-ref": "e1bbbe04d3215bdf", + "bom-ref": "4bcc9133e368356e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/O.pm", "type": "file" }, { - "bom-ref": "d2d52dd45ac96705", + "bom-ref": "0b90892e4fa06d60", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/ODBM_File.pm", "type": "file" }, { - "bom-ref": "daa206f61d2e3905", + "bom-ref": "0e15197d786e3fac", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Opcode.pm", "type": "file" }, { - "bom-ref": "80b682629f7edf6b", + "bom-ref": "9e931b1b3f1cca5e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/POSIX.pm", "type": "file" }, { - "bom-ref": "30f63249622bad4f", + "bom-ref": "9f4f3004c88ae906", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/POSIX.pod", "type": "file" }, { - "bom-ref": "88501d8416477822", + "bom-ref": "b0e64fd077575c43", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/PerlIO/encoding.pm", "type": "file" }, { - "bom-ref": "753ef16aa384bf72", + "bom-ref": "327962d55866470b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/PerlIO/mmap.pm", "type": "file" }, { - "bom-ref": "bdc2268564c767e2", + "bom-ref": "de82f6bbe8a78cdf", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/PerlIO/scalar.pm", "type": "file" }, { - "bom-ref": "0e8b82ae63b8e474", + "bom-ref": "f517cd417db51385", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/PerlIO/via.pm", "type": "file" }, { - "bom-ref": "3fc5399882ec60e8", + "bom-ref": "4bb2001856595911", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/SDBM_File.pm", "type": "file" }, { - "bom-ref": "e7ac3e1c4cec4616", + "bom-ref": "7761a18727809ae7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Scalar/Util.pm", "type": "file" }, { - "bom-ref": "42cd5cd32d5e02b1", + "bom-ref": "9ab94ecc3f51d804", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Socket.pm", "type": "file" }, { - "bom-ref": "04d5d97ac41798a9", + "bom-ref": "9cdc741ebf092c3c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Storable.pm", "type": "file" }, { - "bom-ref": "3ec6051ab7d114b8", + "bom-ref": "3170c7fd1c833c15", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Sub/Util.pm", "type": "file" }, { - "bom-ref": "61ca2a170f70845a", + "bom-ref": "dbdc11313c08fce7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Sys/Hostname.pm", "type": "file" }, { - "bom-ref": "d4e2c53a81233106", + "bom-ref": "5904a9a477a447ef", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Sys/Syslog.pm", "type": "file" }, { - "bom-ref": "d8b61efdb976abfc", + "bom-ref": "ce983dd1924f348d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Time/HiRes.pm", "type": "file" }, { - "bom-ref": "e00098e79144c4c7", + "bom-ref": "a582e3adc464347e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Time/Piece.pm", "type": "file" }, { - "bom-ref": "21d72deedeb1903b", + "bom-ref": "2f66b7488df9f5b6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Time/Seconds.pm", "type": "file" }, { - "bom-ref": "e5b11fe3a5df3cfa", + "bom-ref": "fbbc5666beb4e92f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Unicode/Collate.pm", "type": "file" }, { - "bom-ref": "ca9287339b122808", + "bom-ref": "f4385b8a84a46759", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Unicode/Collate/Locale.pm", "type": "file" }, { - "bom-ref": "ccbcce3589e328a5", + "bom-ref": "870fea6ab2517f28", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/Unicode/Normalize.pm", "type": "file" }, { - "bom-ref": "1b6b3937a4b0d2ad", + "bom-ref": "4f54a482c0cf07a4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/_h2ph_pre.ph", "type": "file" }, { - "bom-ref": "9800464c8e5912aa", + "bom-ref": "26fc57ff4ee8d297", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/bitsperlong.ph", "type": "file" }, { - "bom-ref": "42e6017ea31e4234", + "bom-ref": "937d0e275da39125", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/ioctl.ph", "type": "file" }, { - "bom-ref": "851c135e5e681a10", + "bom-ref": "74036c5a91cce831", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/ioctls.ph", "type": "file" }, { - "bom-ref": "8b6493a9ba9ffe54", + "bom-ref": "f775078a81c56d59", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/posix_types.ph", "type": "file" }, { - "bom-ref": "30542c8a2b76c5b6", + "bom-ref": "1091a177b10c7283", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/socket.ph", "type": "file" }, { - "bom-ref": "12a75bc9d3205667", + "bom-ref": "64cc4afefa4d99ae", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/sockios.ph", "type": "file" }, { - "bom-ref": "8d65e4f7c5988366", + "bom-ref": "eede08fea0a89a63", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/termbits-common.ph", "type": "file" }, { - "bom-ref": "60b06675eb81e22c", + "bom-ref": "3bbe963933c76bdd", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/termbits.ph", "type": "file" }, { - "bom-ref": "8d4890690bef29f9", + "bom-ref": "e357fbad3d9a81e0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm-generic/termios.ph", "type": "file" }, { - "bom-ref": "affe95eca4054a9d", + "bom-ref": "a851188e05feaf44", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/bitsperlong.ph", "type": "file" }, { - "bom-ref": "08e1a3d83c1c9254", + "bom-ref": "bd11a541530b6f99", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/ioctl.ph", "type": "file" }, { - "bom-ref": "74c98824214ff47c", + "bom-ref": "1ab1ee2427fa148d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/ioctls.ph", "type": "file" }, { - "bom-ref": "08dea45f099afb97", + "bom-ref": "2a194b1b3c3239f2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/posix_types.ph", "type": "file" }, { - "bom-ref": "d2877fe6cf0f285d", + "bom-ref": "17a7ed1cd4b4e628", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/posix_types_32.ph", "type": "file" }, { - "bom-ref": "ba6adb111c4e2d4a", + "bom-ref": "966debe4728c6bf7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/posix_types_64.ph", "type": "file" }, { - "bom-ref": "eef46e16def5a82f", + "bom-ref": "340d38eec9530dca", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/posix_types_x32.ph", "type": "file" }, { - "bom-ref": "bdc76edca2325e1d", + "bom-ref": "aee494eb0ee982b8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/socket.ph", "type": "file" }, { - "bom-ref": "5a300f426d47af14", + "bom-ref": "c42cc0a8a8550ce9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/sockios.ph", "type": "file" }, { - "bom-ref": "3a7e6ce96c3b4228", + "bom-ref": "bdb5c7b70261d3c1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/termbits.ph", "type": "file" }, { - "bom-ref": "582fc1cd6e5d5be1", + "bom-ref": "7b2ef735251cb240", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/termios.ph", "type": "file" }, { - "bom-ref": "ecac42ca77220a19", + "bom-ref": "5fc0edf7462b9014", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/unistd.ph", "type": "file" }, { - "bom-ref": "45448780a576a25d", + "bom-ref": "cb80045492ef66f0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/unistd_32.ph", "type": "file" }, { - "bom-ref": "22dba6e0574e9291", + "bom-ref": "40cfa01ac65a21b4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/unistd_64.ph", "type": "file" }, { - "bom-ref": "18b5771087d21e84", + "bom-ref": "397820b025959019", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/asm/unistd_x32.ph", "type": "file" }, { - "bom-ref": "28d19af339410d85", + "bom-ref": "b35f8f9de0b8c028", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/attributes.pm", "type": "file" }, { - "bom-ref": "63dd10e8b566d542", + "bom-ref": "0f86ea32c3be1fa7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/B/B.so", "type": "file" }, { - "bom-ref": "ab49f8e2e6c385aa", + "bom-ref": "bd87801579c15423", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Compress/Raw/Bzip2/Bzip2.so", "type": "file" }, { - "bom-ref": "3308bed8246589e4", + "bom-ref": "fc0eeedd16171119", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Compress/Raw/Zlib/Zlib.so", "type": "file" }, { - "bom-ref": "2036d689d7eec860", + "bom-ref": "e14fc138dd596aad", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Cwd/Cwd.so", "type": "file" }, { - "bom-ref": "ef49b9c540005e3d", + "bom-ref": "eba7e3f55f440c14", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/DB_File/DB_File.so", "type": "file" }, { - "bom-ref": "6f612c8bca9b1566", + "bom-ref": "ccb3962df871ed8f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Data/Dumper/Dumper.so", "type": "file" }, { - "bom-ref": "568e4d0d0c3eb7d5", + "bom-ref": "6e506d537830e618", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Devel/Peek/Peek.so", "type": "file" }, { - "bom-ref": "0c7a1a7d7b6add43", + "bom-ref": "d77ca987360d2d66", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Digest/MD5/MD5.so", "type": "file" }, { - "bom-ref": "49517cc08ebae8fc", + "bom-ref": "4de353115753130d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Digest/SHA/SHA.so", "type": "file" }, { - "bom-ref": "1e24abd6ca27d459", + "bom-ref": "a54f16b3d05319a8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/Byte/Byte.so", "type": "file" }, { - "bom-ref": "1442cd7e8e34f9c0", + "bom-ref": "67202b7bdb051b49", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/CN/CN.so", "type": "file" }, { - "bom-ref": "99f41d49e475aca9", + "bom-ref": "50141884544d7250", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/EBCDIC/EBCDIC.so", "type": "file" }, { - "bom-ref": "779f5c4bf351f7e5", + "bom-ref": "2062447839ac07fc", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/Encode.so", "type": "file" }, { - "bom-ref": "75193081d2e0b19c", + "bom-ref": "b416328ebb55f35d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/JP/JP.so", "type": "file" }, { - "bom-ref": "04b6bd3b1bbade08", + "bom-ref": "4bd91244ec78a641", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/KR/KR.so", "type": "file" }, { - "bom-ref": "018caa1d1d97034e", + "bom-ref": "268d2ae6a203dc9f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/Symbol/Symbol.so", "type": "file" }, { - "bom-ref": "5d4918e02a175c64", + "bom-ref": "4d6b653baa0c23a5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/TW/TW.so", "type": "file" }, { - "bom-ref": "d703b9976861c021", + "bom-ref": "8ab5baf7b8c8d0d4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Encode/Unicode/Unicode.so", "type": "file" }, { - "bom-ref": "d98b95cd302e9cab", + "bom-ref": "65e20db2c865a65a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Fcntl/Fcntl.so", "type": "file" }, { - "bom-ref": "123f605038b0ad93", + "bom-ref": "3e67377d8c92d80a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/File/DosGlob/DosGlob.so", "type": "file" }, { - "bom-ref": "7281df47691827a6", + "bom-ref": "4791363b9adb36a3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/File/Glob/Glob.so", "type": "file" }, { - "bom-ref": "421d70f04a232392", + "bom-ref": "1596f6819de542d7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Filter/Util/Call/Call.so", "type": "file" }, { - "bom-ref": "fc2707a427dd3d1b", + "bom-ref": "6bebc75b3ed5376a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/GDBM_File/GDBM_File.so", "type": "file" }, { - "bom-ref": "488f07dfda1d254b", + "bom-ref": "209eff3e03434dde", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Hash/Util/FieldHash/FieldHash.so", "type": "file" }, { - "bom-ref": "d9736ac46dae3c4f", + "bom-ref": "09f1c50131cc79e6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Hash/Util/Util.so", "type": "file" }, { - "bom-ref": "d8b8ef08e15c324a", + "bom-ref": "ee86da5d65d716cf", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/I18N/Langinfo/Langinfo.so", "type": "file" }, { - "bom-ref": "d844d321faed20ee", + "bom-ref": "d322bd2afa261f6b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/IO/IO.so", "type": "file" }, { - "bom-ref": "acc5e33162326fdb", + "bom-ref": "8cc274270e330242", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/IPC/SysV/SysV.so", "type": "file" }, { - "bom-ref": "59d35a9da512caf7", + "bom-ref": "ec05fd0016d665f6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/List/Util/Util.so", "type": "file" }, { - "bom-ref": "24b677b90443fb08", + "bom-ref": "6954d0d7af884aed", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/MIME/Base64/Base64.so", "type": "file" }, { - "bom-ref": "0e0c5727021e0dfb", + "bom-ref": "f39b936c2f7fb46e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Math/BigInt/FastCalc/FastCalc.so", "type": "file" }, { - "bom-ref": "e662fa3b1225c018", + "bom-ref": "4717286dbe0686a9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/NDBM_File/NDBM_File.so", "type": "file" }, { - "bom-ref": "7815beba0117835c", + "bom-ref": "293c0027f68962ad", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/ODBM_File/ODBM_File.so", "type": "file" }, { - "bom-ref": "516afd5ca32da7f8", + "bom-ref": "beb37777d6a86df9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Opcode/Opcode.so", "type": "file" }, { - "bom-ref": "6c2ca216e1bdbe21", + "bom-ref": "77ea02a0db646a94", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/POSIX/POSIX.so", "type": "file" }, { - "bom-ref": "436a8277a00649d3", + "bom-ref": "aa81321bfd9a65c2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/PerlIO/encoding/encoding.so", "type": "file" }, { - "bom-ref": "fc0c17727bdd3740", + "bom-ref": "bd9906f5f7a17f55", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/PerlIO/mmap/mmap.so", "type": "file" }, { - "bom-ref": "0a217b934c746f8b", + "bom-ref": "c3655a0b8b955c4a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/PerlIO/scalar/scalar.so", "type": "file" }, { - "bom-ref": "fdc639e149248d14", + "bom-ref": "4cb54c5e8e21b009", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/PerlIO/via/via.so", "type": "file" }, { - "bom-ref": "c526d53756d52330", + "bom-ref": "ead5abc9683c4de9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/SDBM_File/SDBM_File.so", "type": "file" }, { - "bom-ref": "4ebde3dc3294ec5d", + "bom-ref": "b7e7b7a56e796ad8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Socket/Socket.so", "type": "file" }, { - "bom-ref": "28c6ce27860812b9", + "bom-ref": "59df143f52f017c8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Storable/Storable.so", "type": "file" }, { - "bom-ref": "4244afd51b918e77", + "bom-ref": "da3d1ec7e1eec8be", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Sys/Hostname/Hostname.so", "type": "file" }, { - "bom-ref": "9705a87decd065e0", + "bom-ref": "234f324d3224eca1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Sys/Syslog/Syslog.so", "type": "file" }, { - "bom-ref": "1f1a595905ba5c9d", + "bom-ref": "a8b015a0ff6318f4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Time/HiRes/HiRes.so", "type": "file" }, { - "bom-ref": "d18bbc457430e5aa", + "bom-ref": "31f967afb2e6c1b3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Time/Piece/Piece.so", "type": "file" }, { - "bom-ref": "744674856e304601", + "bom-ref": "361a98bc1e8e9b00", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Unicode/Collate/Collate.so", "type": "file" }, { - "bom-ref": "411e37a59ad18d29", + "bom-ref": "dc30a275c48160b0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/Unicode/Normalize/Normalize.so", "type": "file" }, { - "bom-ref": "e41c427384a180b2", + "bom-ref": "faa82dd50fe0cf4b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/attributes/attributes.so", "type": "file" }, { - "bom-ref": "9d9226d019e12e31", + "bom-ref": "5635a8e2d8e7ba9c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/mro/mro.so", "type": "file" }, { - "bom-ref": "f21a9865b3738caf", + "bom-ref": "5603114a56e32596", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/re/re.so", "type": "file" }, { - "bom-ref": "fa35a8d938c7f23c", + "bom-ref": "c6496977f9462ce1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/threads/shared/shared.so", "type": "file" }, { - "bom-ref": "03d410695ba2d2bf", + "bom-ref": "8813bd11eaa66362", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/threads/threads.so", "type": "file" }, { - "bom-ref": "5ae13dd65540e8c5", + "bom-ref": "220b456b4a374d2c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/atomic_wide_counter.ph", "type": "file" }, { - "bom-ref": "d772128d1f70dc52", + "bom-ref": "dfc360e0586137e3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/byteswap.ph", "type": "file" }, { - "bom-ref": "241cb86a311c5c10", + "bom-ref": "6718c69cd6ef16d5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/confname.ph", "type": "file" }, { - "bom-ref": "eb1ed3d16b8c557c", + "bom-ref": "7ca8eb2dfd7559d5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/endian.ph", "type": "file" }, { - "bom-ref": "25dd4fe9e5824096", + "bom-ref": "8e6c67b946a469ab", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/endianness.ph", "type": "file" }, { - "bom-ref": "fe7dfab957d60e1b", + "bom-ref": "7ba423febdde6df6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/environments.ph", "type": "file" }, { - "bom-ref": "a8b0ac8fbd46771a", + "bom-ref": "637f7be39acc9adb", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/floatn-common.ph", "type": "file" }, { - "bom-ref": "327aff31a5e521d7", + "bom-ref": "4a78ec5c8e2c1802", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/floatn.ph", "type": "file" }, { - "bom-ref": "1db98919d7ab9527", + "bom-ref": "b1f8c194d424919e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/getopt_core.ph", "type": "file" }, { - "bom-ref": "dda2ec3a52f8ef40", + "bom-ref": "1dde08658e24ee19", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/getopt_posix.ph", "type": "file" }, { - "bom-ref": "3e841854e334242d", + "bom-ref": "a9997f9949429a88", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/ioctl-types.ph", "type": "file" }, { - "bom-ref": "a2911d976b04132d", + "bom-ref": "6d869090e61b3a14", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/ioctls.ph", "type": "file" }, { - "bom-ref": "04364f10822ddde1", + "bom-ref": "cf812e8eb39956a8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/long-double.ph", "type": "file" }, { - "bom-ref": "a06adf178555d681", + "bom-ref": "8a123d9ef3ab86b8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/posix_opt.ph", "type": "file" }, { - "bom-ref": "ceaf235898d84ea7", + "bom-ref": "928db86794fa2f2a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/pthreadtypes-arch.ph", "type": "file" }, { - "bom-ref": "5eb7491e14010825", + "bom-ref": "1122f214e2d60fa4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/pthreadtypes.ph", "type": "file" }, { - "bom-ref": "015ce769efe63f8d", + "bom-ref": "f1d9a02a601eec78", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/select-decl.ph", "type": "file" }, { - "bom-ref": "9298a302b5a5d1bc", + "bom-ref": "fb1b27e23cbbb7b1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/select.ph", "type": "file" }, { - "bom-ref": "c3dfbc2789b8bd85", + "bom-ref": "d5ae50f931430bc4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/select2.ph", "type": "file" }, { - "bom-ref": "38183b887029716b", + "bom-ref": "8bae852fbc1405e6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigaction.ph", "type": "file" }, { - "bom-ref": "2a3883237b060283", + "bom-ref": "2722f828a18a1332", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigcontext.ph", "type": "file" }, { - "bom-ref": "9dcd4b2f47c57ef8", + "bom-ref": "90cf26086efadc01", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigevent-consts.ph", "type": "file" }, { - "bom-ref": "5e0fb52fd7eb084f", + "bom-ref": "7b5c9be97656274a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/siginfo-arch.ph", "type": "file" }, { - "bom-ref": "c3e14b94b0708a14", + "bom-ref": "ca83c5d18d377d25", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/siginfo-consts-arch.ph", "type": "file" }, { - "bom-ref": "24ea342faeb4290a", + "bom-ref": "2711e5ccfe57209b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/siginfo-consts.ph", "type": "file" }, { - "bom-ref": "623f08c135f56bb8", + "bom-ref": "5580c758530bb72d", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/signal_ext.ph", "type": "file" }, { - "bom-ref": "e0b949af637f6844", + "bom-ref": "22dad370ed5d0585", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/signum-arch.ph", "type": "file" }, { - "bom-ref": "efe61827dadb5b80", + "bom-ref": "7dc412e85f07fe75", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/signum-generic.ph", "type": "file" }, { - "bom-ref": "09e98513a429d99c", + "bom-ref": "e07bdcff03b4bca9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigstack.ph", "type": "file" }, { - "bom-ref": "22fa84d04ea628d8", + "bom-ref": "a5f101f91aa3b5a9", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigstksz.ph", "type": "file" }, { - "bom-ref": "ac61b6aeb5a15811", + "bom-ref": "ff2d3a42db6f4994", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sigthread.ph", "type": "file" }, { - "bom-ref": "c9a6fe0eff8d0f4d", + "bom-ref": "6a86a68f518c63dc", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/sockaddr.ph", "type": "file" }, { - "bom-ref": "5be3961eb6a04f81", + "bom-ref": "a507dad595877160", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/socket-constants.ph", "type": "file" }, { - "bom-ref": "7305d238415662ba", + "bom-ref": "8ed49614a551b193", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/socket.ph", "type": "file" }, { - "bom-ref": "528109e5f4df66f3", + "bom-ref": "43dfc87ac85aba8a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/socket2.ph", "type": "file" }, { - "bom-ref": "aa1f10edb912c39a", + "bom-ref": "5d2e96eb09e96b0f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/socket_type.ph", "type": "file" }, { - "bom-ref": "3df6696567389133", + "bom-ref": "24cb73b283005ef2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/ss_flags.ph", "type": "file" }, { - "bom-ref": "e821f5f55d0b616b", + "bom-ref": "07be566ae5bf91f6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/stdint-intn.ph", "type": "file" }, { - "bom-ref": "ba034a32bd85ec99", + "bom-ref": "de1af6753562da94", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/struct_mutex.ph", "type": "file" }, { - "bom-ref": "5866303b6c77a5ea", + "bom-ref": "491e699108a834ef", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/struct_rwlock.ph", "type": "file" }, { - "bom-ref": "1e7c9964854f2176", + "bom-ref": "ac9b187e0a696ab3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/syscall.ph", "type": "file" }, { - "bom-ref": "690ad9f79b0d9afb", + "bom-ref": "c3e8027779a078a2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/syslog-decl.ph", "type": "file" }, { - "bom-ref": "5355abcca736eba3", + "bom-ref": "8f84307f00768c4a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/syslog-ldbl.ph", "type": "file" }, { - "bom-ref": "ed796618963419e8", + "bom-ref": "91f4ebdde99b0f25", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/syslog-path.ph", "type": "file" }, { - "bom-ref": "b69039b2181a08c1", + "bom-ref": "ded5bd07da72ddb8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/syslog.ph", "type": "file" }, { - "bom-ref": "5ae3934f1c8a1cb1", + "bom-ref": "e42677293a739b9c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/thread-shared-types.ph", "type": "file" }, { - "bom-ref": "9a4c48d33e9a50a2", + "bom-ref": "b074acc4bf24df73", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/time64.ph", "type": "file" }, { - "bom-ref": "84b8e76576c10c72", + "bom-ref": "7076477dc8f5919b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/timesize.ph", "type": "file" }, { - "bom-ref": "014bb52e831d37c0", + "bom-ref": "eeb6ebda2544f5c1", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types.ph", "type": "file" }, { - "bom-ref": "5ae20d8f0ccc94ca", + "bom-ref": "ef5973b370523e8b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/__sigset_t.ph", "type": "file" }, { - "bom-ref": "618de9fb91dfe7a3", + "bom-ref": "cfcfb7ab6e73f8a6", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/__sigval_t.ph", "type": "file" }, { - "bom-ref": "4b759b87f40812d9", + "bom-ref": "5aac9ad858de69c8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/clock_t.ph", "type": "file" }, { - "bom-ref": "486a128fce34dd09", + "bom-ref": "2cc9102c9dd5a78c", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/clockid_t.ph", "type": "file" }, { - "bom-ref": "a9cff28ef97c604a", + "bom-ref": "4e2cf55fdf3a71e3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/idtype_t.ph", "type": "file" }, { - "bom-ref": "ed23edb836eb3f9a", + "bom-ref": "2ca7c03061497bc7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/sig_atomic_t.ph", "type": "file" }, { - "bom-ref": "be36557b6c3c8143", + "bom-ref": "e5b07bfc8d607a22", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/sigevent_t.ph", "type": "file" }, { - "bom-ref": "83a7a65a1bb214b9", + "bom-ref": "0cc17b457c1b4fc0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/siginfo_t.ph", "type": "file" }, { - "bom-ref": "3100c05ddeb9b2f5", + "bom-ref": "deb68fb11f4eedec", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/sigset_t.ph", "type": "file" }, { - "bom-ref": "b7bdf36329a59ba1", + "bom-ref": "2d8ff74718525ea8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/sigval_t.ph", "type": "file" }, { - "bom-ref": "286c811f5b7d2413", + "bom-ref": "2f3e2a4245f60eb2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/stack_t.ph", "type": "file" }, { - "bom-ref": "f005785a831a0a7a", + "bom-ref": "3a47e98ca1413d97", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_iovec.ph", "type": "file" }, { - "bom-ref": "dabd02bfd4474810", + "bom-ref": "902c0c615d731d71", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_osockaddr.ph", "type": "file" }, { - "bom-ref": "f1fc432ac755f40e", + "bom-ref": "5211fac4560b1463", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_rusage.ph", "type": "file" }, { - "bom-ref": "a41fa5c73d135c7d", + "bom-ref": "ae1ac371043df9c0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_sigstack.ph", "type": "file" }, { - "bom-ref": "c3521ce7f0d1d843", + "bom-ref": "29a6eb2740afd022", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_timespec.ph", "type": "file" }, { - "bom-ref": "19159d876be0030c", + "bom-ref": "dd7fe5a20562a501", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/struct_timeval.ph", "type": "file" }, { - "bom-ref": "525d54f8915fb437", + "bom-ref": "89cc429463b96412", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/time_t.ph", "type": "file" }, { - "bom-ref": "aa38913b17076496", + "bom-ref": "ceb37ee0f09eb587", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/types/timer_t.ph", "type": "file" }, { - "bom-ref": "5bb29153f12f51a1", + "bom-ref": "fbf1f6d2e8b661c4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/typesizes.ph", "type": "file" }, { - "bom-ref": "41e53932a0468443", + "bom-ref": "d59c13a960807c56", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/uintn-identity.ph", "type": "file" }, { - "bom-ref": "208b0f9dbfcce12e", + "bom-ref": "4e822033b3361fa3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/unistd-decl.ph", "type": "file" }, { - "bom-ref": "9f431c799ceb090e", + "bom-ref": "6f7e36b45a4ca0a3", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/unistd.ph", "type": "file" }, { - "bom-ref": "3c8b01e309beb1c5", + "bom-ref": "57fe0b7fc1e57d50", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/unistd_ext.ph", "type": "file" }, { - "bom-ref": "640af49c8ba0a31b", + "bom-ref": "57b482c2d0b42a1e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/waitflags.ph", "type": "file" }, { - "bom-ref": "aa1248d74b2c08d2", + "bom-ref": "fc00ce61a3a2267b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/waitstatus.ph", "type": "file" }, { - "bom-ref": "c68106cabe10260d", + "bom-ref": "78afcebc1780f700", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/bits/wordsize.ph", "type": "file" }, { - "bom-ref": "2d6eb2c93fbab0c0", + "bom-ref": "88b79eef55698559", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/encoding.pm", "type": "file" }, { - "bom-ref": "ad43efb2738f7f64", + "bom-ref": "7b323d91883485bd", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/endian.ph", "type": "file" }, { - "bom-ref": "2cf3a98b74ac88e9", + "bom-ref": "be14993899dc25ac", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/errno.ph", "type": "file" }, { - "bom-ref": "c9fa1e74c901495f", + "bom-ref": "bd9a7bb804aedf7e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/features-time64.ph", "type": "file" }, { - "bom-ref": "b55384822a3488ad", + "bom-ref": "747fa31a69d63e98", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/features.ph", "type": "file" }, { - "bom-ref": "84501099fc2cae67", + "bom-ref": "b0ed87ca422f5e92", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/gnu/stubs-64.ph", "type": "file" }, { - "bom-ref": "653266b47ca172c9", + "bom-ref": "450cd669d0924540", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/gnu/stubs.ph", "type": "file" }, { - "bom-ref": "30563251232b7c3f", + "bom-ref": "42bc461debcdc9b2", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/lib.pm", "type": "file" }, { - "bom-ref": "efef2e37a14bcff2", + "bom-ref": "39df29f487346e77", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/linux/ioctl.ph", "type": "file" }, { - "bom-ref": "8fc5936cf9edb564", + "bom-ref": "16e733f6f43374dd", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/linux/posix_types.ph", "type": "file" }, { - "bom-ref": "2d23a1daf5b49f3e", + "bom-ref": "9cffd5508a427d4b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/linux/stddef.ph", "type": "file" }, { - "bom-ref": "5696e3975403c490", + "bom-ref": "1ee81e6fead6c429", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/mro.pm", "type": "file" }, { - "bom-ref": "ff93b1d83c5ffc9c", + "bom-ref": "56d5aa0d1e9c5755", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/ops.pm", "type": "file" }, { - "bom-ref": "8f0c3a44ecfbcbb6", + "bom-ref": "c7afe69822f80f27", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/re.pm", "type": "file" }, { - "bom-ref": "d553a4a4a9dba6ca", + "bom-ref": "abedcc9d76e2f55f", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/signal.ph", "type": "file" }, { - "bom-ref": "3195e9415348ef93", + "bom-ref": "948ddf8893d8f86a", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/stdarg.ph", "type": "file" }, { - "bom-ref": "3acf2b4197969795", + "bom-ref": "2a657404c11106ac", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/stdc-predef.ph", "type": "file" }, { - "bom-ref": "aa8fd373db96036e", + "bom-ref": "8edc5d9b34687933", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/stddef.ph", "type": "file" }, { - "bom-ref": "aac15bbbf372b3f8", + "bom-ref": "46d8ced3f6d2cae5", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/cdefs.ph", "type": "file" }, { - "bom-ref": "88e9de118aa841ad", + "bom-ref": "3dfd1ffd72e09b98", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/ioctl.ph", "type": "file" }, { - "bom-ref": "03c6bfb1d67bfb49", + "bom-ref": "6b6e0808fd4cf7f8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/select.ph", "type": "file" }, { - "bom-ref": "b7f6229fdaad4123", + "bom-ref": "946341ad71d78efe", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/socket.ph", "type": "file" }, { - "bom-ref": "1be2753ed30d9583", + "bom-ref": "07749077e1d96bba", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/syscall.ph", "type": "file" }, { - "bom-ref": "7a6e2f9554bd151a", + "bom-ref": "c06d8efc6510192b", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/syslog.ph", "type": "file" }, { - "bom-ref": "9bfcb82ed8339bd6", + "bom-ref": "fbea9129c5bfa637", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/time.ph", "type": "file" }, { - "bom-ref": "0cd01de1dc55239e", + "bom-ref": "e97b6ab0902ac917", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/ttydefaults.ph", "type": "file" }, { - "bom-ref": "06f5f94652b9fcef", + "bom-ref": "3508caf5b2807bba", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/types.ph", "type": "file" }, { - "bom-ref": "42e7bab968d05909", + "bom-ref": "7879d8f8783bd960", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/ucontext.ph", "type": "file" }, { - "bom-ref": "1fcaed5b4b32a39c", + "bom-ref": "a10ea55bea25b889", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sys/wait.ph", "type": "file" }, { - "bom-ref": "bc9a583a2df1a393", + "bom-ref": "4e252ecffe75b4ea", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/syscall.ph", "type": "file" }, { - "bom-ref": "b8ab6b058c9a8b1f", + "bom-ref": "d5d9863eebf6330e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/sysexits.ph", "type": "file" }, { - "bom-ref": "c7975893a6b3a48f", + "bom-ref": "6083951b73f88f3e", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/syslimits.ph", "type": "file" }, { - "bom-ref": "fe4680a7ff39a765", + "bom-ref": "2017e7b3497ff1e8", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/syslog.ph", "type": "file" }, { - "bom-ref": "ab26900d62c4dd15", + "bom-ref": "235b301e995db1f0", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/threads.pm", "type": "file" }, { - "bom-ref": "864de03c4544e765", + "bom-ref": "06a22b3325e613f4", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/threads/shared.pm", "type": "file" }, { - "bom-ref": "e2c13fd8b6864b94", + "bom-ref": "f306db97bdb62e29", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/unistd.ph", "type": "file" }, { - "bom-ref": "e7eddf2af1c6f4ea", + "bom-ref": "06b3b1d99b6bf7d7", "name": "/usr/lib/x86_64-linux-gnu/perl/5.38.2/wait.ph", "type": "file" }, { - "bom-ref": "9e81729140a6ae2b", + "bom-ref": "d1bb15fd6dfd9bba", "name": "/usr/lib/x86_64-linux-gnu/perl/debian-config-data-5.38.2/README", "type": "file" }, { - "bom-ref": "ea224f3606a6d2bb", + "bom-ref": "e99ee11f48c23da2", "name": "/usr/lib/x86_64-linux-gnu/perl/debian-config-data-5.38.2/config.sh.debug.gz", "type": "file" }, { - "bom-ref": "9515c3113000352d", + "bom-ref": "8ce6987b895f2fac", "name": "/usr/lib/x86_64-linux-gnu/perl/debian-config-data-5.38.2/config.sh.shared.gz", "type": "file" }, { - "bom-ref": "1cce81f3a37bf635", + "bom-ref": "07926cd278906424", "name": "/usr/lib/x86_64-linux-gnu/perl/debian-config-data-5.38.2/config.sh.static.gz", "type": "file" }, { - "bom-ref": "99a1b89a07f37dc2", + "bom-ref": "8902235228bcde5c", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/blas-atlas.pc", "type": "file" }, { - "bom-ref": "31f77dbb6ae006a4", + "bom-ref": "55fab4f3b930bb0e", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/com_err.pc", "type": "file" }, { - "bom-ref": "86389ad0b3568549", - "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/dbus-1.pc", - "type": "file" - }, - { - "bom-ref": "e9e0b517c1d2e5a5", + "bom-ref": "a30c9f69af406f43", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/expat.pc", "type": "file" }, { - "bom-ref": "35232e902e4688ba", + "bom-ref": "82f473b722ff173c", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/form.pc", "type": "file" }, { - "bom-ref": "49019c6ab5e96eaa", + "bom-ref": "32044656b351abac", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/formw.pc", "type": "file" }, { - "bom-ref": "c23138f660712c5f", + "bom-ref": "d15d791efc896e1d", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/gflags.pc", "type": "file" }, { - "bom-ref": "e6ba3fee3331cf9c", + "bom-ref": "e2bf78d7b749f1ee", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/icu-i18n.pc", "type": "file" }, { - "bom-ref": "a9730af47059c560", + "bom-ref": "52ace22c22132f0a", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/icu-io.pc", "type": "file" }, { - "bom-ref": "420ede178ec222a3", + "bom-ref": "96e69b59066eaac9", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/icu-uc.pc", "type": "file" }, { - "bom-ref": "ae6f59062d50ce9a", + "bom-ref": "9bd2f227e484c118", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/lapack-atlas.pc", "type": "file" }, { - "bom-ref": "6f4032bf8ff59f06", + "bom-ref": "9208ee5e48cce068", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libbsd-ctor.pc", "type": "file" }, { - "bom-ref": "914d4da1d8e51639", + "bom-ref": "71ecb93b52048c3b", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libbsd-overlay.pc", "type": "file" }, { - "bom-ref": "facf5b97101dc0be", + "bom-ref": "0c094f0b4609243c", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libbsd.pc", "type": "file" }, { - "bom-ref": "2fe224adf21ae642", + "bom-ref": "b7ad789f665a42dc", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libedit.pc", "type": "file" }, { - "bom-ref": "9fd7c58c2a293161", + "bom-ref": "255d4164dbb5aecb", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libefa.pc", "type": "file" }, { - "bom-ref": "6b4537c071d72711", + "bom-ref": "7bedec122e2708fb", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libffi.pc", "type": "file" }, { - "bom-ref": "f16d6065868c2d88", + "bom-ref": "ad29185f433288e6", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libglog.pc", "type": "file" }, { - "bom-ref": "e21ec7f95a2c61e1", + "bom-ref": "978a4fd01f38138e", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libibumad.pc", "type": "file" }, { - "bom-ref": "9308d590c2ae5ba0", + "bom-ref": "210c0b29b150ec72", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libibverbs.pc", "type": "file" }, { - "bom-ref": "d20a5d19760c88da", + "bom-ref": "4f8eaa9399c18504", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/liblzma.pc", "type": "file" }, { - "bom-ref": "d6f1c2f94c125f84", + "bom-ref": "e88c0fefdbcedb52", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libmana.pc", "type": "file" }, { - "bom-ref": "b996709d6b4b3f18", + "bom-ref": "b77abfc7461d54e6", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libmd.pc", "type": "file" }, { - "bom-ref": "833794871d92e61c", + "bom-ref": "4ac737ae06e74916", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libmlx4.pc", "type": "file" }, { - "bom-ref": "2d81672e960c16cc", + "bom-ref": "22c8d4522ca722d6", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libmlx5.pc", "type": "file" }, { - "bom-ref": "b2c8e6341724fa22", + "bom-ref": "603eacbd13b36241", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libnl-3.0.pc", "type": "file" }, { - "bom-ref": "9b5a3e28ea2df17b", + "bom-ref": "a5ce25526e17f390", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libnl-route-3.0.pc", "type": "file" }, { - "bom-ref": "097d823c38f1503e", + "bom-ref": "520b2a78172bc304", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libpng16.pc", "type": "file" }, { - "bom-ref": "f9ea6144d4758003", + "bom-ref": "a4a63b34b5fb36e1", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libsodium.pc", "type": "file" }, { - "bom-ref": "06e50859d3221d30", + "bom-ref": "41351f9ac8399c6a", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libunwind-coredump.pc", "type": "file" }, { - "bom-ref": "c13672d901b83606", + "bom-ref": "26641d5611ef80ac", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libunwind-generic.pc", "type": "file" }, { - "bom-ref": "78e6a80f8f7101b2", + "bom-ref": "1f361f973a97d874", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libunwind-ptrace.pc", "type": "file" }, { - "bom-ref": "207f2e97466204a6", + "bom-ref": "e0f979a142a98360", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libunwind.pc", "type": "file" }, { - "bom-ref": "eaa65f2e73634915", + "bom-ref": "31ec3615dad8bc96", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libxcrypt.pc", "type": "file" }, { - "bom-ref": "265eb6feee467f55", + "bom-ref": "e6ef830020fd6583", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libxml-2.0.pc", "type": "file" }, { - "bom-ref": "3d446562ea5b0e9a", + "bom-ref": "893c608cc3d41034", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libzmq.pc", "type": "file" }, { - "bom-ref": "9d7643dfa853f2c5", + "bom-ref": "43a7a61f8c9a5eb7", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/libzstd.pc", "type": "file" }, { - "bom-ref": "cc5823b948955609", + "bom-ref": "88bdfb3f3f735dcf", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/lmdb.pc", "type": "file" }, { - "bom-ref": "a12d8bcae42121cc", + "bom-ref": "9fe602f630bb9c7a", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/menu.pc", "type": "file" }, { - "bom-ref": "b83abc4f3432a521", + "bom-ref": "645bf88ca457a673", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/menuw.pc", "type": "file" }, { - "bom-ref": "2b349a4518020d8b", + "bom-ref": "27c31c4eddc9f2bd", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/mit-krb5-gssapi.pc", "type": "file" }, { - "bom-ref": "9fd0d71bab3cf607", + "bom-ref": "d1895eef81bb4eb5", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/mit-krb5.pc", "type": "file" }, { - "bom-ref": "09ae0e030347fd2f", + "bom-ref": "127d175e3da863f1", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/mit-krb5/gssrpc.pc", "type": "file" }, { - "bom-ref": "39ae82a177b79bdc", + "bom-ref": "810f369100dc7dfe", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/mit-krb5/kadm-client.pc", "type": "file" }, { - "bom-ref": "5c806672aa202919", + "bom-ref": "063bf0abc01cc33b", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/mit-krb5/kadm-server.pc", "type": "file" }, { - "bom-ref": "bdc5118a355d216a", + "bom-ref": "1646f5933b4b1ab0", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/mit-krb5/kdb.pc", "type": "file" }, { - "bom-ref": "9460bb8f9f999e49", + "bom-ref": "59d1e04e56dbdcf3", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/mit-krb5/krb5-gssapi.pc", "type": "file" }, { - "bom-ref": "5beed202b16f6b85", + "bom-ref": "dda084da76765a9f", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/mit-krb5/krb5.pc", "type": "file" }, { - "bom-ref": "5dc35ae4f3242c8b", + "bom-ref": "09cb7ccddc656fbd", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/ncurses++.pc", "type": "file" }, { - "bom-ref": "7f89016f4240e47a", + "bom-ref": "238170bc0dacd44c", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/ncurses++w.pc", "type": "file" }, { - "bom-ref": "b89ede51938c4f59", + "bom-ref": "694146f74b85475b", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/ncurses.pc", "type": "file" }, { - "bom-ref": "6b7b2c41a50eb1bf", + "bom-ref": "18e6fa302861a38d", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/ncursesw.pc", "type": "file" }, { - "bom-ref": "585befbb5b4e90c7", + "bom-ref": "b0270f71da7d30b9", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/norm.pc", "type": "file" }, { - "bom-ref": "55cc8362fa6d1141", + "bom-ref": "7ae88112cef30798", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/numa.pc", "type": "file" }, { - "bom-ref": "8325e237aea587ee", + "bom-ref": "24381b2138c19290", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/openpgm-5.3.pc", "type": "file" }, { - "bom-ref": "2f3e91d34a949114", + "bom-ref": "2634b81274fee8de", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/panel.pc", "type": "file" }, { - "bom-ref": "ca436e3a381ae3c0", + "bom-ref": "7c452b2b40371faa", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/panelw.pc", "type": "file" }, { - "bom-ref": "899917e20bdcab9e", + "bom-ref": "025d4ec82f4ace9c", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/protobuf-lite.pc", "type": "file" }, { - "bom-ref": "55579002915962c5", + "bom-ref": "d3bd6b95b4b118cf", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/protobuf.pc", "type": "file" }, { - "bom-ref": "81da744d8721f39b", + "bom-ref": "8a336d9d404dcf59", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/python-3.12-embed.pc", "type": "file" }, { - "bom-ref": "61a8f7644e5c2bdd", + "bom-ref": "133ff739a2636833", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/python-3.12.pc", "type": "file" }, { - "bom-ref": "dab2c778f2a82b3b", + "bom-ref": "6bb2978e2e254b31", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/re2.pc", "type": "file" }, { - "bom-ref": "7dc2c5c0c554a46f", + "bom-ref": "48de2fe5d0ffbeed", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/snappy.pc", "type": "file" }, { - "bom-ref": "0acfc438e8031c35", + "bom-ref": "2d5fc4ee70c63903", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/tic.pc", "type": "file" }, { - "bom-ref": "3f424ac1b877c53f", + "bom-ref": "f5905ec1fd091529", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/tinfo.pc", "type": "file" }, { - "bom-ref": "6aab55b179fcd8af", + "bom-ref": "326462555032ece9", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/z3.pc", "type": "file" }, { - "bom-ref": "fa2b80d179488fae", + "bom-ref": "e013df1f95275a60", "name": "/usr/lib/x86_64-linux-gnu/pkgconfig/zlib.pc", "type": "file" }, { - "bom-ref": "a1b188b120697b43", + "bom-ref": "54321df23abecf4d", "name": "/usr/lib/x86_64-linux-gnu/rcrt1.o", "type": "file" }, { - "bom-ref": "b30142ba0911e147", + "bom-ref": "0b02c1f8aaca38dc", "name": "/usr/lib/x86_64-linux-gnu/sasl2/libsasldb.so.2.0.25", "type": "file" }, { - "bom-ref": "605cde211a342ccc", + "bom-ref": "9d7d14b98f2caaa2", "name": "/usr/lib/x86_64-linux-gnu/security/pam_access.so", "type": "file" }, { - "bom-ref": "e284124d88a25ce7", + "bom-ref": "e6584e49cf0cbf19", "name": "/usr/lib/x86_64-linux-gnu/security/pam_debug.so", "type": "file" }, { - "bom-ref": "a82690c8809f15a3", + "bom-ref": "be4bb0b2efb458bd", "name": "/usr/lib/x86_64-linux-gnu/security/pam_deny.so", "type": "file" }, { - "bom-ref": "f436fcf9367e061d", + "bom-ref": "add5f14a1257e707", "name": "/usr/lib/x86_64-linux-gnu/security/pam_echo.so", "type": "file" }, { - "bom-ref": "326531619672cf26", + "bom-ref": "6a3e8a6ba7ad4060", "name": "/usr/lib/x86_64-linux-gnu/security/pam_env.so", "type": "file" }, { - "bom-ref": "730f44f7b040cbf6", + "bom-ref": "e3d34f6a3bf162ec", "name": "/usr/lib/x86_64-linux-gnu/security/pam_exec.so", "type": "file" }, { - "bom-ref": "6e42dc3cb03fec09", + "bom-ref": "6a1aea4017af920b", "name": "/usr/lib/x86_64-linux-gnu/security/pam_extrausers.so", "type": "file" }, { - "bom-ref": "b71258d8edaebcb5", + "bom-ref": "74555fe3f9844063", "name": "/usr/lib/x86_64-linux-gnu/security/pam_faildelay.so", "type": "file" }, { - "bom-ref": "60d498ad174ecd57", + "bom-ref": "5ff061511c8d3415", "name": "/usr/lib/x86_64-linux-gnu/security/pam_faillock.so", "type": "file" }, { - "bom-ref": "46083dcf2758783e", + "bom-ref": "803ba0ecd421e698", "name": "/usr/lib/x86_64-linux-gnu/security/pam_filter.so", "type": "file" }, { - "bom-ref": "0b367c3de41a93a8", + "bom-ref": "e15bc02503ae10c2", "name": "/usr/lib/x86_64-linux-gnu/security/pam_ftp.so", "type": "file" }, { - "bom-ref": "e1ab36a3bdae2c7f", + "bom-ref": "b8f13da52f0676e1", "name": "/usr/lib/x86_64-linux-gnu/security/pam_group.so", "type": "file" }, { - "bom-ref": "7f5537d56412acf2", + "bom-ref": "c8a0c1953ab51d94", "name": "/usr/lib/x86_64-linux-gnu/security/pam_issue.so", "type": "file" }, { - "bom-ref": "5998f6c15b98d891", + "bom-ref": "a434a72eef1a116f", "name": "/usr/lib/x86_64-linux-gnu/security/pam_keyinit.so", "type": "file" }, { - "bom-ref": "f9b95ae8b359c3d6", + "bom-ref": "fdd605e79c3d5bdc", "name": "/usr/lib/x86_64-linux-gnu/security/pam_limits.so", "type": "file" }, { - "bom-ref": "689538aa88d0ee00", + "bom-ref": "3517d124d5ba1362", "name": "/usr/lib/x86_64-linux-gnu/security/pam_listfile.so", "type": "file" }, { - "bom-ref": "9772a5ef99c9bb50", + "bom-ref": "8c4644c78bc84072", "name": "/usr/lib/x86_64-linux-gnu/security/pam_localuser.so", "type": "file" }, { - "bom-ref": "3df0533e51b07464", + "bom-ref": "b37212bd871e4fd2", "name": "/usr/lib/x86_64-linux-gnu/security/pam_loginuid.so", "type": "file" }, { - "bom-ref": "794f20f8ab835d3c", + "bom-ref": "dfb2e12c1f8afd7a", "name": "/usr/lib/x86_64-linux-gnu/security/pam_mail.so", "type": "file" }, { - "bom-ref": "bbd4e8062baf46cc", + "bom-ref": "d9c050279051cc4e", "name": "/usr/lib/x86_64-linux-gnu/security/pam_mkhomedir.so", "type": "file" }, { - "bom-ref": "1293460944f2626a", + "bom-ref": "6167961dcbda7940", "name": "/usr/lib/x86_64-linux-gnu/security/pam_motd.so", "type": "file" }, { - "bom-ref": "9e3cb9c9228c832c", + "bom-ref": "00d6dca7034cefde", "name": "/usr/lib/x86_64-linux-gnu/security/pam_namespace.so", "type": "file" }, { - "bom-ref": "18a9628a56099aca", + "bom-ref": "322f0c01395a5984", "name": "/usr/lib/x86_64-linux-gnu/security/pam_nologin.so", "type": "file" }, { - "bom-ref": "195698f50019ae7c", + "bom-ref": "b5735a022e790c0e", "name": "/usr/lib/x86_64-linux-gnu/security/pam_permit.so", "type": "file" }, { - "bom-ref": "5f996cc49aeb68a3", + "bom-ref": "e72c6626b6c3ff4d", "name": "/usr/lib/x86_64-linux-gnu/security/pam_pwhistory.so", "type": "file" }, { - "bom-ref": "39565270c1c33a3a", + "bom-ref": "441880fef5828fec", "name": "/usr/lib/x86_64-linux-gnu/security/pam_rhosts.so", "type": "file" }, { - "bom-ref": "e79b0bd7ec7b7b2e", + "bom-ref": "357adbafcc94c71c", "name": "/usr/lib/x86_64-linux-gnu/security/pam_rootok.so", "type": "file" }, { - "bom-ref": "151f748abc580d27", + "bom-ref": "27fb962624fae559", "name": "/usr/lib/x86_64-linux-gnu/security/pam_securetty.so", "type": "file" }, { - "bom-ref": "3be8129d5833868d", + "bom-ref": "8c44aa6e4101f9bb", "name": "/usr/lib/x86_64-linux-gnu/security/pam_selinux.so", "type": "file" }, { - "bom-ref": "ab96787702c91b2c", + "bom-ref": "5b55f09a76e32ebe", "name": "/usr/lib/x86_64-linux-gnu/security/pam_sepermit.so", "type": "file" }, { - "bom-ref": "45b42cb2327b748a", + "bom-ref": "d27f6506a9454250", "name": "/usr/lib/x86_64-linux-gnu/security/pam_setquota.so", "type": "file" }, { - "bom-ref": "36920c5b5dc6788a", + "bom-ref": "984283d4833f2b74", "name": "/usr/lib/x86_64-linux-gnu/security/pam_shells.so", "type": "file" }, { - "bom-ref": "f82074c48a029f10", + "bom-ref": "45373316afbb6bf6", "name": "/usr/lib/x86_64-linux-gnu/security/pam_stress.so", "type": "file" }, { - "bom-ref": "e505f16863222aee", + "bom-ref": "c4a21f4e2837c9e4", "name": "/usr/lib/x86_64-linux-gnu/security/pam_succeed_if.so", "type": "file" }, { - "bom-ref": "e1c3f331f2c912b3", + "bom-ref": "cb6f2b4335db5809", "name": "/usr/lib/x86_64-linux-gnu/security/pam_time.so", "type": "file" }, { - "bom-ref": "b8609c79563370e0", + "bom-ref": "9c8176241eed44fa", "name": "/usr/lib/x86_64-linux-gnu/security/pam_timestamp.so", "type": "file" }, { - "bom-ref": "d6a9473ecb26d60f", + "bom-ref": "3bf18d0f971db539", "name": "/usr/lib/x86_64-linux-gnu/security/pam_tty_audit.so", "type": "file" }, { - "bom-ref": "4049e642f17de9d7", + "bom-ref": "17a9f9342514a9f9", "name": "/usr/lib/x86_64-linux-gnu/security/pam_umask.so", "type": "file" }, { - "bom-ref": "1c348770d10c1704", + "bom-ref": "70f12d022fbafb7a", "name": "/usr/lib/x86_64-linux-gnu/security/pam_unix.so", "type": "file" }, { - "bom-ref": "d592d2d44bf82f60", + "bom-ref": "06209dd0862fb972", "name": "/usr/lib/x86_64-linux-gnu/security/pam_userdb.so", "type": "file" }, { - "bom-ref": "85bbf79129527ff2", + "bom-ref": "70b1fc1da9e78fb8", "name": "/usr/lib/x86_64-linux-gnu/security/pam_usertype.so", "type": "file" }, { - "bom-ref": "b16ae28e4fbeaf40", + "bom-ref": "37dacd6d62d3a48e", "name": "/usr/lib/x86_64-linux-gnu/security/pam_warn.so", "type": "file" }, { - "bom-ref": "29f3c94bb791476b", + "bom-ref": "aa56699199ad4ad1", "name": "/usr/lib/x86_64-linux-gnu/security/pam_wheel.so", "type": "file" }, { - "bom-ref": "2e68036292705d3b", + "bom-ref": "71b369a68bc652e5", "name": "/usr/lib/x86_64-linux-gnu/security/pam_xauth.so", "type": "file" }, { - "bom-ref": "81fbb099f7112fbc", + "bom-ref": "0c7cb3417a8fca36", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_alsa.so", "type": "file" }, { - "bom-ref": "362b5d899f92085f", + "bom-ref": "1fc9cbdde80e96b9", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_amr_nb.so", "type": "file" }, { - "bom-ref": "31e5294bbf89087b", + "bom-ref": "02c4cb0b44640a45", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_amr_wb.so", "type": "file" }, { - "bom-ref": "c176fcabf09d83ec", + "bom-ref": "441670a6f045ea0e", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_caf.so", "type": "file" }, { - "bom-ref": "172099e9d6edae60", + "bom-ref": "f1e92e960d1b8b56", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_fap.so", "type": "file" }, { - "bom-ref": "fd902dd13e95bb41", + "bom-ref": "8adecf2d6222033b", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_flac.so", "type": "file" }, { - "bom-ref": "587e9e863a3ebea4", + "bom-ref": "ea2799b532df89ae", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_gsm.so", "type": "file" }, { - "bom-ref": "26d89d0466d4fe1d", + "bom-ref": "b2812c0c10f573bb", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_lpc10.so", "type": "file" }, { - "bom-ref": "6706ba7d834cb772", + "bom-ref": "fd81518f28cc5cd4", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_mat4.so", "type": "file" }, { - "bom-ref": "8acccc4ad3593f9b", + "bom-ref": "011cb7edb3c2434d", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_mat5.so", "type": "file" }, { - "bom-ref": "708512d686f50dc4", + "bom-ref": "33d42e60c535aa9a", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_paf.so", "type": "file" }, { - "bom-ref": "7f0cd1fd6a2c7fa6", + "bom-ref": "61be7b72cf4d67d8", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_pvf.so", "type": "file" }, { - "bom-ref": "1aec792f9760cf6e", + "bom-ref": "4aa6cdab5c846a94", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_sd2.so", "type": "file" }, { - "bom-ref": "fbc17ebae18f186c", + "bom-ref": "00f20d3738df3486", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_sndfile.so", "type": "file" }, { - "bom-ref": "f5190f246407efc7", + "bom-ref": "2c2fc4e11cf19609", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_vorbis.so", "type": "file" }, { - "bom-ref": "2e04c91d0f76a8eb", + "bom-ref": "fb67b76480f03eb1", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_w64.so", "type": "file" }, { - "bom-ref": "2075cca40349f5ca", + "bom-ref": "9334ceb3d915b038", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_wavpack.so", "type": "file" }, { - "bom-ref": "377c4d10953ec397", + "bom-ref": "6f31dfdf9823401d", "name": "/usr/lib/x86_64-linux-gnu/sox/libsox_fmt_xi.so", "type": "file" }, { - "bom-ref": "31be34d6a25636a9", + "bom-ref": "d28a0ecbde1758a3", "name": "/usr/lib/x86_64-linux-gnu/xml2Conf.sh", "type": "file" }, { - "bom-ref": "b8fde58bb0b57a81", + "bom-ref": "f0579fbd8dc75abb", "name": "/usr/lib32/gconv/ANSI_X3.110.so", "type": "file" }, { - "bom-ref": "08a39643af20d4e8", + "bom-ref": "111fc5fce19dfe3a", "name": "/usr/lib32/gconv/ARMSCII-8.so", "type": "file" }, { - "bom-ref": "e6474e8dbf138142", + "bom-ref": "4df134207c687bf0", "name": "/usr/lib32/gconv/ASMO_449.so", "type": "file" }, { - "bom-ref": "81498426fb5a06df", + "bom-ref": "4070390b90473475", "name": "/usr/lib32/gconv/BIG5.so", "type": "file" }, { - "bom-ref": "42fb6d83b7070ce4", + "bom-ref": "1c7699c5394b900a", "name": "/usr/lib32/gconv/BIG5HKSCS.so", "type": "file" }, { - "bom-ref": "290ea02f7fa5e46c", + "bom-ref": "d5267746fb4dc94a", "name": "/usr/lib32/gconv/BRF.so", "type": "file" }, { - "bom-ref": "55e55f64df09110e", + "bom-ref": "9706980b019538e4", "name": "/usr/lib32/gconv/CP10007.so", "type": "file" }, { - "bom-ref": "36fc10b6ccc94798", + "bom-ref": "7636acee5361acca", "name": "/usr/lib32/gconv/CP1125.so", "type": "file" }, { - "bom-ref": "45f20c334074aba4", + "bom-ref": "9ed43fb59e9e79c2", "name": "/usr/lib32/gconv/CP1250.so", "type": "file" }, { - "bom-ref": "002919ba6ed271ed", + "bom-ref": "5ef6c8acaf41dbd7", "name": "/usr/lib32/gconv/CP1251.so", "type": "file" }, { - "bom-ref": "8d8f041b0a6d9e5b", + "bom-ref": "f8ca233853e6132d", "name": "/usr/lib32/gconv/CP1252.so", "type": "file" }, { - "bom-ref": "2c4fd771336d343b", + "bom-ref": "8595f1a9db023291", "name": "/usr/lib32/gconv/CP1253.so", "type": "file" }, { - "bom-ref": "2fdd1f0aaf7be1ba", + "bom-ref": "89ada846988cec04", "name": "/usr/lib32/gconv/CP1254.so", "type": "file" }, { - "bom-ref": "980feb6ed59c550a", + "bom-ref": "bc60d7a82a9ae2e4", "name": "/usr/lib32/gconv/CP1255.so", "type": "file" }, { - "bom-ref": "75812798af2b8817", + "bom-ref": "a766a4f2a2f1b905", "name": "/usr/lib32/gconv/CP1256.so", "type": "file" }, { - "bom-ref": "5340ff2b4528903a", + "bom-ref": "8cf7c80f88aecd8c", "name": "/usr/lib32/gconv/CP1257.so", "type": "file" }, { - "bom-ref": "5795ec7111e83c0f", + "bom-ref": "576b6e574294a4a5", "name": "/usr/lib32/gconv/CP1258.so", "type": "file" }, { - "bom-ref": "08a39c1eaf2c0bc9", + "bom-ref": "427a4d1cb92e8963", "name": "/usr/lib32/gconv/CP737.so", "type": "file" }, { - "bom-ref": "639d6c72be0c3147", + "bom-ref": "6f40a7041c793025", "name": "/usr/lib32/gconv/CP770.so", "type": "file" }, { - "bom-ref": "099af353584141d8", + "bom-ref": "0f3685f2adaefb92", "name": "/usr/lib32/gconv/CP771.so", "type": "file" }, { - "bom-ref": "eae5bec00e660525", + "bom-ref": "8688c929fefedbcb", "name": "/usr/lib32/gconv/CP772.so", "type": "file" }, { - "bom-ref": "94277ae71956827b", + "bom-ref": "e3e5db4d5b164e35", "name": "/usr/lib32/gconv/CP773.so", "type": "file" }, { - "bom-ref": "a56c8ca52c3eeb63", + "bom-ref": "a1d1dad9e7ba3e29", "name": "/usr/lib32/gconv/CP774.so", "type": "file" }, { - "bom-ref": "3c8f50035a319a2c", + "bom-ref": "a669baa9550af992", "name": "/usr/lib32/gconv/CP775.so", "type": "file" }, { - "bom-ref": "aa912a6a53a9be54", + "bom-ref": "29b5672f4935c592", "name": "/usr/lib32/gconv/CP932.so", "type": "file" }, { - "bom-ref": "d8e3c43862a43836", + "bom-ref": "cd22376e21ac08fc", "name": "/usr/lib32/gconv/CSN_369103.so", "type": "file" }, { - "bom-ref": "ab319a375e8bc4b9", + "bom-ref": "8fe6d3d05aa807d7", "name": "/usr/lib32/gconv/CWI.so", "type": "file" }, { - "bom-ref": "c9226036c9fd9e6e", + "bom-ref": "45e53a8c9eeeeb84", "name": "/usr/lib32/gconv/DEC-MCS.so", "type": "file" }, { - "bom-ref": "509381f65b910141", + "bom-ref": "b207e90d06d9bd03", "name": "/usr/lib32/gconv/EBCDIC-AT-DE-A.so", "type": "file" }, { - "bom-ref": "30dc6141a080cc18", + "bom-ref": "0a92dc8e4199f4ea", "name": "/usr/lib32/gconv/EBCDIC-AT-DE.so", "type": "file" }, { - "bom-ref": "d233fef16a9fe84a", + "bom-ref": "cccc7c43783e083c", "name": "/usr/lib32/gconv/EBCDIC-CA-FR.so", "type": "file" }, { - "bom-ref": "4311378060db44a7", + "bom-ref": "65cff1bfa14699e5", "name": "/usr/lib32/gconv/EBCDIC-DK-NO-A.so", "type": "file" }, { - "bom-ref": "b2faa82acfaa944b", + "bom-ref": "09e387832267bd21", "name": "/usr/lib32/gconv/EBCDIC-DK-NO.so", "type": "file" }, { - "bom-ref": "8f276997f0445980", + "bom-ref": "bdd5cfe039cc013e", "name": "/usr/lib32/gconv/EBCDIC-ES-A.so", "type": "file" }, { - "bom-ref": "72b56b634bf4ada0", + "bom-ref": "80ca65fcdcac1cfa", "name": "/usr/lib32/gconv/EBCDIC-ES-S.so", "type": "file" }, { - "bom-ref": "449932be17dd82f2", + "bom-ref": "4d23dffcb0d89918", "name": "/usr/lib32/gconv/EBCDIC-ES.so", "type": "file" }, { - "bom-ref": "ddd7412e7eed1e31", + "bom-ref": "d2000c69de59fd37", "name": "/usr/lib32/gconv/EBCDIC-FI-SE-A.so", "type": "file" }, { - "bom-ref": "58182fb3397e06b8", + "bom-ref": "12ab12206c242e96", "name": "/usr/lib32/gconv/EBCDIC-FI-SE.so", "type": "file" }, { - "bom-ref": "ee7f7fc1b90d2418", + "bom-ref": "73a952bfffb64f32", "name": "/usr/lib32/gconv/EBCDIC-FR.so", "type": "file" }, { - "bom-ref": "444be3a6ae72890c", + "bom-ref": "601dda11f6e27a2a", "name": "/usr/lib32/gconv/EBCDIC-IS-FRISS.so", "type": "file" }, { - "bom-ref": "6280617470a094aa", + "bom-ref": "8ebddcbddb5902c8", "name": "/usr/lib32/gconv/EBCDIC-IT.so", "type": "file" }, { - "bom-ref": "d79aed299aaead85", + "bom-ref": "35b17bc09b252bdf", "name": "/usr/lib32/gconv/EBCDIC-PT.so", "type": "file" }, { - "bom-ref": "c7398e83b825db87", + "bom-ref": "9e14c7826e71de05", "name": "/usr/lib32/gconv/EBCDIC-UK.so", "type": "file" }, { - "bom-ref": "7115858f9079b945", + "bom-ref": "ffb48b805bdf8dd7", "name": "/usr/lib32/gconv/EBCDIC-US.so", "type": "file" }, { - "bom-ref": "86e795da9a88eb1f", + "bom-ref": "41631288966bbeb9", "name": "/usr/lib32/gconv/ECMA-CYRILLIC.so", "type": "file" }, { - "bom-ref": "aaafb8a989015664", + "bom-ref": "324afeec322e656e", "name": "/usr/lib32/gconv/EUC-CN.so", "type": "file" }, { - "bom-ref": "0bdfcd1d3d817aa2", + "bom-ref": "dc49bcd55b29bdb8", "name": "/usr/lib32/gconv/EUC-JISX0213.so", "type": "file" }, { - "bom-ref": "1069baf313bdc4d0", + "bom-ref": "faa79b6c6e3f7cc2", "name": "/usr/lib32/gconv/EUC-JP-MS.so", "type": "file" }, { - "bom-ref": "b12b9d5abd83d6c9", + "bom-ref": "76eebb196796694b", "name": "/usr/lib32/gconv/EUC-JP.so", "type": "file" }, { - "bom-ref": "61e32eef553c0c8f", + "bom-ref": "88de834b0d5f638d", "name": "/usr/lib32/gconv/EUC-KR.so", "type": "file" }, { - "bom-ref": "317479a8f1936357", + "bom-ref": "c30ff928964d08c9", "name": "/usr/lib32/gconv/EUC-TW.so", "type": "file" }, { - "bom-ref": "44df478bd009d9be", + "bom-ref": "4323bc97a45690e8", "name": "/usr/lib32/gconv/GB18030.so", "type": "file" }, { - "bom-ref": "f5a74457fd458d3d", + "bom-ref": "20a8e7b53f08683f", "name": "/usr/lib32/gconv/GBBIG5.so", "type": "file" }, { - "bom-ref": "8334db454e68f399", + "bom-ref": "4a48a1243be58c4f", "name": "/usr/lib32/gconv/GBGBK.so", "type": "file" }, { - "bom-ref": "68551de5545b6e95", + "bom-ref": "ea631213e62225fb", "name": "/usr/lib32/gconv/GBK.so", "type": "file" }, { - "bom-ref": "8c99074d1e453624", + "bom-ref": "eeaccf26b02346d2", "name": "/usr/lib32/gconv/GEORGIAN-ACADEMY.so", "type": "file" }, { - "bom-ref": "2dd44d1ea2d19b30", + "bom-ref": "9944c49e3f5042b6", "name": "/usr/lib32/gconv/GEORGIAN-PS.so", "type": "file" }, { - "bom-ref": "1453630da5361263", + "bom-ref": "86f3eeba0d9d06e5", "name": "/usr/lib32/gconv/GOST_19768-74.so", "type": "file" }, { - "bom-ref": "4ddb7b825172129c", + "bom-ref": "69fdce619e81eb42", "name": "/usr/lib32/gconv/GREEK-CCITT.so", "type": "file" }, { - "bom-ref": "5f049994fbcc82f1", + "bom-ref": "fea637f7e0152023", "name": "/usr/lib32/gconv/GREEK7-OLD.so", "type": "file" }, { - "bom-ref": "8001529820726635", + "bom-ref": "a99303831eaa094f", "name": "/usr/lib32/gconv/GREEK7.so", "type": "file" }, { - "bom-ref": "2ceeeb50d9ac70c4", + "bom-ref": "4d421f9af432807a", "name": "/usr/lib32/gconv/HP-GREEK8.so", "type": "file" }, { - "bom-ref": "b34e983736e0bd0e", + "bom-ref": "44e3221c04e94e08", "name": "/usr/lib32/gconv/HP-ROMAN8.so", "type": "file" }, { - "bom-ref": "0eab159fe12a0599", + "bom-ref": "0433e98e419100bb", "name": "/usr/lib32/gconv/HP-ROMAN9.so", "type": "file" }, { - "bom-ref": "98535cda7413d276", + "bom-ref": "8916590ad6faef20", "name": "/usr/lib32/gconv/HP-THAI8.so", "type": "file" }, { - "bom-ref": "d2481c3aea862f2f", + "bom-ref": "b913507ca0ab1f09", "name": "/usr/lib32/gconv/HP-TURKISH8.so", "type": "file" }, { - "bom-ref": "d88a6b64e20f46fb", + "bom-ref": "e1c58ce1043094e1", "name": "/usr/lib32/gconv/IBM037.so", "type": "file" }, { - "bom-ref": "d645734d74ed0a81", + "bom-ref": "dc441b0abaaf9497", "name": "/usr/lib32/gconv/IBM038.so", "type": "file" }, { - "bom-ref": "12d3b38c2d4fcc6c", + "bom-ref": "5bf4086c3fc2c6da", "name": "/usr/lib32/gconv/IBM1004.so", "type": "file" }, { - "bom-ref": "fa8f0ad145ae9044", + "bom-ref": "8fb27e25310f607a", "name": "/usr/lib32/gconv/IBM1008.so", "type": "file" }, { - "bom-ref": "476111621096917a", + "bom-ref": "65096cd1e5fcf710", "name": "/usr/lib32/gconv/IBM1008_420.so", "type": "file" }, { - "bom-ref": "29aa42fe9b31318f", + "bom-ref": "c0950b7a38f28205", "name": "/usr/lib32/gconv/IBM1025.so", "type": "file" }, { - "bom-ref": "333d31f12677bf70", + "bom-ref": "1d48f94321d264ba", "name": "/usr/lib32/gconv/IBM1026.so", "type": "file" }, { - "bom-ref": "96d8d2520fb6170e", + "bom-ref": "1943d0e19c795cac", "name": "/usr/lib32/gconv/IBM1046.so", "type": "file" }, { - "bom-ref": "ddbf8ce625470bb5", + "bom-ref": "b1e09f95882c6587", "name": "/usr/lib32/gconv/IBM1047.so", "type": "file" }, { - "bom-ref": "df8aef852a160e02", + "bom-ref": "08cec947a030fd30", "name": "/usr/lib32/gconv/IBM1097.so", "type": "file" }, { - "bom-ref": "3a577b561a53bd9c", + "bom-ref": "a46656ed6804203e", "name": "/usr/lib32/gconv/IBM1112.so", "type": "file" }, { - "bom-ref": "8bc8b2c3e15e4d3e", + "bom-ref": "3555bff1f4cfb548", "name": "/usr/lib32/gconv/IBM1122.so", "type": "file" }, { - "bom-ref": "2cd2217a3a882e91", + "bom-ref": "935ec21d28444717", "name": "/usr/lib32/gconv/IBM1123.so", "type": "file" }, { - "bom-ref": "9f8ac26049b7f9b8", + "bom-ref": "ddb5929d3ecc964a", "name": "/usr/lib32/gconv/IBM1124.so", "type": "file" }, { - "bom-ref": "e1a923c433fda402", + "bom-ref": "01778750a9ccc748", "name": "/usr/lib32/gconv/IBM1129.so", "type": "file" }, { - "bom-ref": "40e414dbd390685c", + "bom-ref": "12209dc9c2f7d01e", "name": "/usr/lib32/gconv/IBM1130.so", "type": "file" }, { - "bom-ref": "7f3b2cd5af9aab5c", + "bom-ref": "c71b6f83aed53ec2", "name": "/usr/lib32/gconv/IBM1132.so", "type": "file" }, { - "bom-ref": "766a16ee3931db1d", + "bom-ref": "f29a2e7c82baeb2f", "name": "/usr/lib32/gconv/IBM1133.so", "type": "file" }, { - "bom-ref": "3b660ef8bd9a2180", + "bom-ref": "f461d68947814252", "name": "/usr/lib32/gconv/IBM1137.so", "type": "file" }, { - "bom-ref": "a23e830c93ed5012", + "bom-ref": "3c41d258cf75c138", "name": "/usr/lib32/gconv/IBM1140.so", "type": "file" }, { - "bom-ref": "aabff5e4a81a59f6", + "bom-ref": "754c0a556bb43960", "name": "/usr/lib32/gconv/IBM1141.so", "type": "file" }, { - "bom-ref": "6c4e7e3f92a239f0", + "bom-ref": "6a5fed34e106ce92", "name": "/usr/lib32/gconv/IBM1142.so", "type": "file" }, { - "bom-ref": "fea19f3a14fbc88d", + "bom-ref": "41e5b088e705c14b", "name": "/usr/lib32/gconv/IBM1143.so", "type": "file" }, { - "bom-ref": "a576bb581639589d", + "bom-ref": "e4dc52e8b6005003", "name": "/usr/lib32/gconv/IBM1144.so", "type": "file" }, { - "bom-ref": "b157c4fae85a6fc8", + "bom-ref": "c78a5ea047733d8a", "name": "/usr/lib32/gconv/IBM1145.so", "type": "file" }, { - "bom-ref": "5d82a901dded3875", + "bom-ref": "22e4a7e72bb8b61f", "name": "/usr/lib32/gconv/IBM1146.so", "type": "file" }, { - "bom-ref": "95fe236e786e814f", + "bom-ref": "7d12aa0c94d5a41d", "name": "/usr/lib32/gconv/IBM1147.so", "type": "file" }, { - "bom-ref": "71fd40f9fc80aee7", + "bom-ref": "42e60d4dfcdddca5", "name": "/usr/lib32/gconv/IBM1148.so", "type": "file" }, { - "bom-ref": "0e938321227699d6", + "bom-ref": "989eae7fb55e3970", "name": "/usr/lib32/gconv/IBM1149.so", "type": "file" }, { - "bom-ref": "5dc46d2b4bb17455", + "bom-ref": "37450e3eb47d2553", "name": "/usr/lib32/gconv/IBM1153.so", "type": "file" }, { - "bom-ref": "61977c44430e22d1", + "bom-ref": "fa38965ad41d04e3", "name": "/usr/lib32/gconv/IBM1154.so", "type": "file" }, { - "bom-ref": "3ffe050f1bce9d56", + "bom-ref": "050b1f2e6d5e65cc", "name": "/usr/lib32/gconv/IBM1155.so", "type": "file" }, { - "bom-ref": "68e33d422dc29fad", + "bom-ref": "473167bdb7bcaffb", "name": "/usr/lib32/gconv/IBM1156.so", "type": "file" }, { - "bom-ref": "24e460b35ea2c0bf", + "bom-ref": "11f9747b2e9f4f31", "name": "/usr/lib32/gconv/IBM1157.so", "type": "file" }, { - "bom-ref": "67bc207026f82ed6", + "bom-ref": "93f1eace4526aa1c", "name": "/usr/lib32/gconv/IBM1158.so", "type": "file" }, { - "bom-ref": "dc32409a80ef0c0a", + "bom-ref": "8ad1536ce3659554", "name": "/usr/lib32/gconv/IBM1160.so", "type": "file" }, { - "bom-ref": "f3579295368d8d53", + "bom-ref": "8eaef87dd492e339", "name": "/usr/lib32/gconv/IBM1161.so", "type": "file" }, { - "bom-ref": "0c6577ccb36175f2", + "bom-ref": "017778a4c44c3300", "name": "/usr/lib32/gconv/IBM1162.so", "type": "file" }, { - "bom-ref": "ad9fc91e0bbf1f9e", + "bom-ref": "1827283e64352158", "name": "/usr/lib32/gconv/IBM1163.so", "type": "file" }, { - "bom-ref": "c2b44dabcb8c0724", + "bom-ref": "22b97b47c012148a", "name": "/usr/lib32/gconv/IBM1164.so", "type": "file" }, { - "bom-ref": "011d6c145730ff58", + "bom-ref": "25bf14118c2ef116", "name": "/usr/lib32/gconv/IBM1166.so", "type": "file" }, { - "bom-ref": "ee97e490a1f81256", + "bom-ref": "c9aa185f5161e288", "name": "/usr/lib32/gconv/IBM1167.so", "type": "file" }, { - "bom-ref": "913f6019a90533fe", + "bom-ref": "ec26c61158b44ac4", "name": "/usr/lib32/gconv/IBM12712.so", "type": "file" }, { - "bom-ref": "0d4f13e8a4458b33", + "bom-ref": "6b184b4fc31add1d", "name": "/usr/lib32/gconv/IBM1364.so", "type": "file" }, { - "bom-ref": "ced202f35f8d79f1", + "bom-ref": "7b70c07290c167e7", "name": "/usr/lib32/gconv/IBM1371.so", "type": "file" }, { - "bom-ref": "08802be4f80f1a3f", + "bom-ref": "1b106f05c3f0fefd", "name": "/usr/lib32/gconv/IBM1388.so", "type": "file" }, { - "bom-ref": "11faa47b5205130e", + "bom-ref": "465687dfa9b58b18", "name": "/usr/lib32/gconv/IBM1390.so", "type": "file" }, { - "bom-ref": "7afade14a5ce3b08", + "bom-ref": "dfd52f45471c12ae", "name": "/usr/lib32/gconv/IBM1399.so", "type": "file" }, { - "bom-ref": "95f8c6a3696f6567", + "bom-ref": "0245286b18be6b65", "name": "/usr/lib32/gconv/IBM16804.so", "type": "file" }, { - "bom-ref": "b43e4b203365ef0c", + "bom-ref": "8baca343a31ab6ce", "name": "/usr/lib32/gconv/IBM256.so", "type": "file" }, { - "bom-ref": "753ed1d5b80aba40", + "bom-ref": "9d70743c7616a132", "name": "/usr/lib32/gconv/IBM273.so", "type": "file" }, { - "bom-ref": "92862b80521ceea2", + "bom-ref": "8d605cc599f40538", "name": "/usr/lib32/gconv/IBM274.so", "type": "file" }, { - "bom-ref": "89d7f9cc4ebee173", + "bom-ref": "ac3009f46c3358b9", "name": "/usr/lib32/gconv/IBM275.so", "type": "file" }, { - "bom-ref": "2f76c52ad2787d74", + "bom-ref": "91521c18cd9c57be", "name": "/usr/lib32/gconv/IBM277.so", "type": "file" }, { - "bom-ref": "832fbef901689d39", + "bom-ref": "0e102cc8f299117b", "name": "/usr/lib32/gconv/IBM278.so", "type": "file" }, { - "bom-ref": "9a1777f57298423d", + "bom-ref": "059becabe6b88bd3", "name": "/usr/lib32/gconv/IBM280.so", "type": "file" }, { - "bom-ref": "ce53eb23eff7f04b", + "bom-ref": "11365a239047b7cd", "name": "/usr/lib32/gconv/IBM281.so", "type": "file" }, { - "bom-ref": "a8123f0e4e719604", + "bom-ref": "5ff5fc5918575f5e", "name": "/usr/lib32/gconv/IBM284.so", "type": "file" }, { - "bom-ref": "695ed0608f9ccc55", + "bom-ref": "ee822e754d491877", "name": "/usr/lib32/gconv/IBM285.so", "type": "file" }, { - "bom-ref": "93eb0dc5e1002df2", + "bom-ref": "bbd7fb262bfa4384", "name": "/usr/lib32/gconv/IBM290.so", "type": "file" }, { - "bom-ref": "0510596a56fef42b", + "bom-ref": "20d1b10b3b861d1d", "name": "/usr/lib32/gconv/IBM297.so", "type": "file" }, { - "bom-ref": "c770a1cf66d81443", + "bom-ref": "efbd469c8e9c196d", "name": "/usr/lib32/gconv/IBM420.so", "type": "file" }, { - "bom-ref": "3183b2a640638981", + "bom-ref": "72312746e6754783", "name": "/usr/lib32/gconv/IBM423.so", "type": "file" }, { - "bom-ref": "b9ba3d269faf5e48", + "bom-ref": "c5ecd649d10863ce", "name": "/usr/lib32/gconv/IBM424.so", "type": "file" }, { - "bom-ref": "ef4ea260188d9793", + "bom-ref": "c11a1563c156f0dd", "name": "/usr/lib32/gconv/IBM437.so", "type": "file" }, { - "bom-ref": "d028c0d3f551a65a", + "bom-ref": "f9d42288153d8020", "name": "/usr/lib32/gconv/IBM4517.so", "type": "file" }, { - "bom-ref": "4a4b9317c1869866", + "bom-ref": "c1153859c313fe10", "name": "/usr/lib32/gconv/IBM4899.so", "type": "file" }, { - "bom-ref": "03b11cce450a2afd", + "bom-ref": "76ed71fe671d50a7", "name": "/usr/lib32/gconv/IBM4909.so", "type": "file" }, { - "bom-ref": "4b46027ab44d7ea1", + "bom-ref": "9739e76ca018c507", "name": "/usr/lib32/gconv/IBM4971.so", "type": "file" }, { - "bom-ref": "5ad8f510b5ac07cc", + "bom-ref": "5984d34d51e0d216", "name": "/usr/lib32/gconv/IBM500.so", "type": "file" }, { - "bom-ref": "c0d4afcbf250d1dd", + "bom-ref": "f54095ad84161bcb", "name": "/usr/lib32/gconv/IBM5347.so", "type": "file" }, { - "bom-ref": "d2885b983d44710d", + "bom-ref": "6b68561e2d7a4bfb", "name": "/usr/lib32/gconv/IBM803.so", "type": "file" }, { - "bom-ref": "034faa8d31bd17b9", + "bom-ref": "b0a4ad3d15ec72e7", "name": "/usr/lib32/gconv/IBM850.so", "type": "file" }, { - "bom-ref": "2f2293fa03d5d2da", + "bom-ref": "b68e7772b8332e50", "name": "/usr/lib32/gconv/IBM851.so", "type": "file" }, { - "bom-ref": "203784e61cc89fb9", + "bom-ref": "321b96356368e13f", "name": "/usr/lib32/gconv/IBM852.so", "type": "file" }, { - "bom-ref": "d22fa8f700a96d4a", + "bom-ref": "32610ff9789d6258", "name": "/usr/lib32/gconv/IBM855.so", "type": "file" }, { - "bom-ref": "bf1e2226d23f68c1", + "bom-ref": "047cfa07cecb745b", "name": "/usr/lib32/gconv/IBM856.so", "type": "file" }, { - "bom-ref": "f9b9c583c554f14f", + "bom-ref": "d4aefe664b639d45", "name": "/usr/lib32/gconv/IBM857.so", "type": "file" }, { - "bom-ref": "628b351b8c5e7f33", + "bom-ref": "6612919fa150accd", "name": "/usr/lib32/gconv/IBM858.so", "type": "file" }, { - "bom-ref": "b24d5bd30df16e08", + "bom-ref": "bc012a8fac817452", "name": "/usr/lib32/gconv/IBM860.so", "type": "file" }, { - "bom-ref": "835f5de9fc687423", + "bom-ref": "58dcad5b7453683d", "name": "/usr/lib32/gconv/IBM861.so", "type": "file" }, { - "bom-ref": "a0ad6fc628188e2c", + "bom-ref": "498b09756f989f6e", "name": "/usr/lib32/gconv/IBM862.so", "type": "file" }, { - "bom-ref": "09f3b0cfeba4753d", + "bom-ref": "1bbaf5a1f6fe1503", "name": "/usr/lib32/gconv/IBM863.so", "type": "file" }, { - "bom-ref": "d4c2a626c54170a7", + "bom-ref": "65b9e9bdb7ad7309", "name": "/usr/lib32/gconv/IBM864.so", "type": "file" }, { - "bom-ref": "09d2072bfa518810", + "bom-ref": "719220b21bb10b02", "name": "/usr/lib32/gconv/IBM865.so", "type": "file" }, { - "bom-ref": "126330b4bfd94ddd", + "bom-ref": "9dff236376e290bb", "name": "/usr/lib32/gconv/IBM866.so", "type": "file" }, { - "bom-ref": "b66c0d68aeed473d", + "bom-ref": "0ff5733e0fdbc587", "name": "/usr/lib32/gconv/IBM866NAV.so", "type": "file" }, { - "bom-ref": "d3c1b60f6f48dcc3", + "bom-ref": "dc117e7c97df2b49", "name": "/usr/lib32/gconv/IBM868.so", "type": "file" }, { - "bom-ref": "93ec3066a561684e", + "bom-ref": "3ac0df66ec355c5c", "name": "/usr/lib32/gconv/IBM869.so", "type": "file" }, { - "bom-ref": "765f53fc9d0762be", + "bom-ref": "7f9921daa6a0bcc0", "name": "/usr/lib32/gconv/IBM870.so", "type": "file" }, { - "bom-ref": "137d0bcaa41c118d", + "bom-ref": "a15118f27b9a5907", "name": "/usr/lib32/gconv/IBM871.so", "type": "file" }, { - "bom-ref": "2228fac81932b13e", + "bom-ref": "88960ef8dc0637ec", "name": "/usr/lib32/gconv/IBM874.so", "type": "file" }, { - "bom-ref": "3f3cf7b263a97874", + "bom-ref": "9c9f28dc13ddf74e", "name": "/usr/lib32/gconv/IBM875.so", "type": "file" }, { - "bom-ref": "8c05b95aa4851240", + "bom-ref": "c3907611a094ffb6", "name": "/usr/lib32/gconv/IBM880.so", "type": "file" }, { - "bom-ref": "a66fca5dc1af9e75", + "bom-ref": "186271d487f3e2ff", "name": "/usr/lib32/gconv/IBM891.so", "type": "file" }, { - "bom-ref": "a3cc6c8c099847ef", + "bom-ref": "e93d3a2f3638e4e5", "name": "/usr/lib32/gconv/IBM901.so", "type": "file" }, { - "bom-ref": "e9611d642a19eae0", + "bom-ref": "575ec0f915bd01aa", "name": "/usr/lib32/gconv/IBM902.so", "type": "file" }, { - "bom-ref": "318ef945abbc8194", + "bom-ref": "c9ebc60fa137f57a", "name": "/usr/lib32/gconv/IBM903.so", "type": "file" }, { - "bom-ref": "d34f73dc5b790247", + "bom-ref": "1bd0dd770c82d665", "name": "/usr/lib32/gconv/IBM9030.so", "type": "file" }, { - "bom-ref": "6067c686aa77157d", + "bom-ref": "18b8a1d66b8e2d7b", "name": "/usr/lib32/gconv/IBM904.so", "type": "file" }, { - "bom-ref": "0ff624c1626037d3", + "bom-ref": "42e067444f6f2229", "name": "/usr/lib32/gconv/IBM905.so", "type": "file" }, { - "bom-ref": "db18dbc50b0611cc", + "bom-ref": "0a8e7296fc938ec6", "name": "/usr/lib32/gconv/IBM9066.so", "type": "file" }, { - "bom-ref": "7d7d710fb9e61561", + "bom-ref": "f135c912127f3493", "name": "/usr/lib32/gconv/IBM918.so", "type": "file" }, { - "bom-ref": "aeea8e5fafbe8232", + "bom-ref": "5972fa7a217acef4", "name": "/usr/lib32/gconv/IBM921.so", "type": "file" }, { - "bom-ref": "a2005b00ca2392b1", + "bom-ref": "91b085ec7c5c6f43", "name": "/usr/lib32/gconv/IBM922.so", "type": "file" }, { - "bom-ref": "a5563d0927fdf284", + "bom-ref": "3cb7a700691a312e", "name": "/usr/lib32/gconv/IBM930.so", "type": "file" }, { - "bom-ref": "7fc563e08785c783", + "bom-ref": "bb522eeab7767b41", "name": "/usr/lib32/gconv/IBM932.so", "type": "file" }, { - "bom-ref": "8e210a90ef50a104", + "bom-ref": "dbbe1812ceadf6ce", "name": "/usr/lib32/gconv/IBM933.so", "type": "file" }, { - "bom-ref": "d2781f49cc4fa4bd", + "bom-ref": "47265803eb180267", "name": "/usr/lib32/gconv/IBM935.so", "type": "file" }, { - "bom-ref": "24dd34c313d5f743", + "bom-ref": "cd5b94e293886249", "name": "/usr/lib32/gconv/IBM937.so", "type": "file" }, { - "bom-ref": "84afc22132bced27", + "bom-ref": "8ee17683cec66da9", "name": "/usr/lib32/gconv/IBM939.so", "type": "file" }, { - "bom-ref": "0d4fae57894625d9", + "bom-ref": "17f1996adec09797", "name": "/usr/lib32/gconv/IBM943.so", "type": "file" }, { - "bom-ref": "e1fbb8c94e63f712", + "bom-ref": "b8f38a9ec6f87c84", "name": "/usr/lib32/gconv/IBM9448.so", "type": "file" }, { - "bom-ref": "14839e69831bdc01", + "bom-ref": "1edc2534d3847f8f", "name": "/usr/lib32/gconv/IEC_P27-1.so", "type": "file" }, { - "bom-ref": "d5eec800e4f7a670", + "bom-ref": "9150fa7259d6e5d2", "name": "/usr/lib32/gconv/INIS-8.so", "type": "file" }, { - "bom-ref": "1e07cf2b8f0c8b58", + "bom-ref": "feaf7d24fe8c83c6", "name": "/usr/lib32/gconv/INIS-CYRILLIC.so", "type": "file" }, { - "bom-ref": "72a4aaf8bafadace", + "bom-ref": "f2033a07949afd58", "name": "/usr/lib32/gconv/INIS.so", "type": "file" }, { - "bom-ref": "1e9b8dd8bd63b67f", + "bom-ref": "ec05483931754efd", "name": "/usr/lib32/gconv/ISIRI-3342.so", "type": "file" }, { - "bom-ref": "6d0ec8b0e81e001c", + "bom-ref": "3b773da495259802", "name": "/usr/lib32/gconv/ISO-2022-CN-EXT.so", "type": "file" }, { - "bom-ref": "56bddcd7c435ccef", + "bom-ref": "fb01d468d4da4aa9", "name": "/usr/lib32/gconv/ISO-2022-CN.so", "type": "file" }, { - "bom-ref": "9f1318819a2099ab", + "bom-ref": "6c47757be58a9069", "name": "/usr/lib32/gconv/ISO-2022-JP-3.so", "type": "file" }, { - "bom-ref": "2fed6ca8b5b1e3a1", + "bom-ref": "b7a8a5af479d39a7", "name": "/usr/lib32/gconv/ISO-2022-JP.so", "type": "file" }, { - "bom-ref": "14b4f944d5d45684", + "bom-ref": "fe108f14f800eae6", "name": "/usr/lib32/gconv/ISO-2022-KR.so", "type": "file" }, { - "bom-ref": "324d566ea7892a3e", + "bom-ref": "19c9c1821fb1ef28", "name": "/usr/lib32/gconv/ISO-IR-197.so", "type": "file" }, { - "bom-ref": "9cc4dc767aeee73e", + "bom-ref": "f656e591f5154274", "name": "/usr/lib32/gconv/ISO-IR-209.so", "type": "file" }, { - "bom-ref": "e1cf0d7183cc3fee", + "bom-ref": "4522188382525b74", "name": "/usr/lib32/gconv/ISO646.so", "type": "file" }, { - "bom-ref": "01503956f8897ca5", + "bom-ref": "95ed367c1519c333", "name": "/usr/lib32/gconv/ISO8859-1.so", "type": "file" }, { - "bom-ref": "b5a79e5955282bd0", + "bom-ref": "ad179dd7f2993d32", "name": "/usr/lib32/gconv/ISO8859-10.so", "type": "file" }, { - "bom-ref": "7dda3f599cfab728", + "bom-ref": "c05272a90fe48272", "name": "/usr/lib32/gconv/ISO8859-11.so", "type": "file" }, { - "bom-ref": "32308b69ff4ab5c6", + "bom-ref": "b03dc367b627f214", "name": "/usr/lib32/gconv/ISO8859-13.so", "type": "file" }, { - "bom-ref": "412824c23fe272df", + "bom-ref": "67578ff9d5aadec9", "name": "/usr/lib32/gconv/ISO8859-14.so", "type": "file" }, { - "bom-ref": "07f21906beab8213", + "bom-ref": "e51d3334a7e2e4a5", "name": "/usr/lib32/gconv/ISO8859-15.so", "type": "file" }, { - "bom-ref": "f46e86de45d493d7", + "bom-ref": "3c9e2dce24b23851", "name": "/usr/lib32/gconv/ISO8859-16.so", "type": "file" }, { - "bom-ref": "a0469fa18480fc6a", + "bom-ref": "bbc3ba61d179bd58", "name": "/usr/lib32/gconv/ISO8859-2.so", "type": "file" }, { - "bom-ref": "c3f964b46c8f3a79", + "bom-ref": "24f1d1306572b7cb", "name": "/usr/lib32/gconv/ISO8859-3.so", "type": "file" }, { - "bom-ref": "cda269673aaef3ac", + "bom-ref": "820ca6d9cff81bb6", "name": "/usr/lib32/gconv/ISO8859-4.so", "type": "file" }, { - "bom-ref": "80e98e18fe773a4a", + "bom-ref": "45fa52d252595ca8", "name": "/usr/lib32/gconv/ISO8859-5.so", "type": "file" }, { - "bom-ref": "0ad231579e570223", + "bom-ref": "35bc333af1373da1", "name": "/usr/lib32/gconv/ISO8859-6.so", "type": "file" }, { - "bom-ref": "ee08745fb691fdb0", + "bom-ref": "08f21a125dd55b16", "name": "/usr/lib32/gconv/ISO8859-7.so", "type": "file" }, { - "bom-ref": "c02366f138d52cb0", + "bom-ref": "70b18754fb6716b2", "name": "/usr/lib32/gconv/ISO8859-8.so", "type": "file" }, { - "bom-ref": "6acfe816da6516b9", + "bom-ref": "fc18638d9c7ee653", "name": "/usr/lib32/gconv/ISO8859-9.so", "type": "file" }, { - "bom-ref": "14868a1c91fe5ada", + "bom-ref": "2c88cc455850b48c", "name": "/usr/lib32/gconv/ISO8859-9E.so", "type": "file" }, { - "bom-ref": "5c8f9bbf130dfc88", + "bom-ref": "567684f860be2f02", "name": "/usr/lib32/gconv/ISO_10367-BOX.so", "type": "file" }, { - "bom-ref": "8c5e3ed87801c21a", + "bom-ref": "b3ea3d68cef5a244", "name": "/usr/lib32/gconv/ISO_11548-1.so", "type": "file" }, { - "bom-ref": "a2dbaa67402a77d5", + "bom-ref": "ae0ab1618c278ba3", "name": "/usr/lib32/gconv/ISO_2033.so", "type": "file" }, { - "bom-ref": "8c374cd285969f32", + "bom-ref": "91b73feb5cf8eeb4", "name": "/usr/lib32/gconv/ISO_5427-EXT.so", "type": "file" }, { - "bom-ref": "8e55634cb892c03c", + "bom-ref": "f21a66516c376332", "name": "/usr/lib32/gconv/ISO_5427.so", "type": "file" }, { - "bom-ref": "0b75f22b495c04cc", + "bom-ref": "402bd22d41629dde", "name": "/usr/lib32/gconv/ISO_5428.so", "type": "file" }, { - "bom-ref": "730214af8db6ec52", + "bom-ref": "5f2ae3ac9778441c", "name": "/usr/lib32/gconv/ISO_6937-2.so", "type": "file" }, { - "bom-ref": "0a33027341a0c128", + "bom-ref": "4ba426e54ec784fa", "name": "/usr/lib32/gconv/ISO_6937.so", "type": "file" }, { - "bom-ref": "cc20b8287585dc0f", + "bom-ref": "9fe731251073f441", "name": "/usr/lib32/gconv/JOHAB.so", "type": "file" }, { - "bom-ref": "ff8ad2650f8d0b6b", + "bom-ref": "edcc80256839fe7d", "name": "/usr/lib32/gconv/KOI-8.so", "type": "file" }, { - "bom-ref": "47efc75aa6539c53", + "bom-ref": "e5686ddfe2fe6519", "name": "/usr/lib32/gconv/KOI8-R.so", "type": "file" }, { - "bom-ref": "85a037e3e7c100c7", + "bom-ref": "9ce3a5f2e7151281", "name": "/usr/lib32/gconv/KOI8-RU.so", "type": "file" }, { - "bom-ref": "d5b1235d7b0381b1", + "bom-ref": "9111dc3f0bbadd3b", "name": "/usr/lib32/gconv/KOI8-T.so", "type": "file" }, { - "bom-ref": "c154ab4ff1e8773b", + "bom-ref": "52fd73afb0eccb4d", "name": "/usr/lib32/gconv/KOI8-U.so", "type": "file" }, { - "bom-ref": "8ba57bf8079b3e64", + "bom-ref": "059286424b648372", "name": "/usr/lib32/gconv/LATIN-GREEK-1.so", "type": "file" }, { - "bom-ref": "55e15b63117778d8", + "bom-ref": "0eeb852ead22ee8e", "name": "/usr/lib32/gconv/LATIN-GREEK.so", "type": "file" }, { - "bom-ref": "a9104af81d3d81c8", + "bom-ref": "abd09c0aa2770e6a", "name": "/usr/lib32/gconv/MAC-CENTRALEUROPE.so", "type": "file" }, { - "bom-ref": "64338f0cafcee97c", + "bom-ref": "7816966125f265b6", "name": "/usr/lib32/gconv/MAC-IS.so", "type": "file" }, { - "bom-ref": "85dc9cacfef75a3f", + "bom-ref": "600c18326aa8ae41", "name": "/usr/lib32/gconv/MAC-SAMI.so", "type": "file" }, { - "bom-ref": "8693e9de6b41fd50", + "bom-ref": "c54f48a35206f9da", "name": "/usr/lib32/gconv/MAC-UK.so", "type": "file" }, { - "bom-ref": "e4f27b086b0435f6", + "bom-ref": "a79aa0f98e9e44d8", "name": "/usr/lib32/gconv/MACINTOSH.so", "type": "file" }, { - "bom-ref": "7ad57c41528dded4", + "bom-ref": "d543825d51dd3ce6", "name": "/usr/lib32/gconv/MIK.so", "type": "file" }, { - "bom-ref": "e7a18be0cf2bfdd1", + "bom-ref": "c198a323221c82af", "name": "/usr/lib32/gconv/NATS-DANO.so", "type": "file" }, { - "bom-ref": "c67c1c66668b516d", + "bom-ref": "c38ce0af61553fbb", "name": "/usr/lib32/gconv/NATS-SEFI.so", "type": "file" }, { - "bom-ref": "431d9234ff743727", + "bom-ref": "ae72b77914463b41", "name": "/usr/lib32/gconv/PT154.so", "type": "file" }, { - "bom-ref": "8ba88293d5cdb571", + "bom-ref": "d3951d3daa291317", "name": "/usr/lib32/gconv/RK1048.so", "type": "file" }, { - "bom-ref": "f1d9bbde6164908c", + "bom-ref": "11e1ff641f5b6fc6", "name": "/usr/lib32/gconv/SAMI-WS2.so", "type": "file" }, { - "bom-ref": "52fdca743b2ca770", + "bom-ref": "e7122f23feaa43be", "name": "/usr/lib32/gconv/SHIFT_JISX0213.so", "type": "file" }, { - "bom-ref": "102de2f7a221998b", + "bom-ref": "c4f33a68cb7aa261", "name": "/usr/lib32/gconv/SJIS.so", "type": "file" }, { - "bom-ref": "3fe89e2e4786c641", + "bom-ref": "7ebd351c55938d87", "name": "/usr/lib32/gconv/T.61.so", "type": "file" }, { - "bom-ref": "be755cd3130b3bbe", + "bom-ref": "1e9f8548436c6208", "name": "/usr/lib32/gconv/TCVN5712-1.so", "type": "file" }, { - "bom-ref": "a0733862dee302ca", + "bom-ref": "9993923e954a4e74", "name": "/usr/lib32/gconv/TIS-620.so", "type": "file" }, { - "bom-ref": "37bd8d7cc527ec5a", + "bom-ref": "93ee6380e8774150", "name": "/usr/lib32/gconv/TSCII.so", "type": "file" }, { - "bom-ref": "7df21ec47ef63b5a", + "bom-ref": "d5faac8190781138", "name": "/usr/lib32/gconv/UHC.so", "type": "file" }, { - "bom-ref": "77f385f81d28b341", + "bom-ref": "75d837fa45792f67", "name": "/usr/lib32/gconv/UNICODE.so", "type": "file" }, { - "bom-ref": "31eff997c253a01a", + "bom-ref": "94ae5f6be70290cc", "name": "/usr/lib32/gconv/UTF-16.so", "type": "file" }, { - "bom-ref": "cefb678fc9a7aeb6", + "bom-ref": "1b1ee4a9f6810dd0", "name": "/usr/lib32/gconv/UTF-32.so", "type": "file" }, { - "bom-ref": "7317fb5b0309ab15", + "bom-ref": "9b221ede47a2d20b", "name": "/usr/lib32/gconv/UTF-7.so", "type": "file" }, { - "bom-ref": "d9a6d6b37644bb04", + "bom-ref": "6f622f71c297acd6", "name": "/usr/lib32/gconv/VISCII.so", "type": "file" }, { - "bom-ref": "b18e9b5aeea1e82f", + "bom-ref": "a60d0c9ca2cfea59", "name": "/usr/lib32/gconv/gconv-modules", "type": "file" }, { - "bom-ref": "4809126906e3c3a4", + "bom-ref": "80e63fad533fc5da", "name": "/usr/lib32/gconv/gconv-modules.cache", "type": "file" }, { - "bom-ref": "0ff5b1e374eab5ea", + "bom-ref": "ecbfcd68a68a5f60", "name": "/usr/lib32/gconv/gconv-modules.d/gconv-modules-extra.conf", "type": "file" }, { - "bom-ref": "6f355fdb77f53769", + "bom-ref": "a11ce32dc5322a33", "name": "/usr/lib32/gconv/libCNS.so", "type": "file" }, { - "bom-ref": "ffef35f093b4e47a", + "bom-ref": "f2e3b33c81035adc", "name": "/usr/lib32/gconv/libGB.so", "type": "file" }, { - "bom-ref": "2ce7efe1ce82464f", + "bom-ref": "e9be92e9ea2200e5", "name": "/usr/lib32/gconv/libISOIR165.so", "type": "file" }, { - "bom-ref": "426f01b5a813e33d", + "bom-ref": "401902a4cab09a8f", "name": "/usr/lib32/gconv/libJIS.so", "type": "file" }, { - "bom-ref": "f75eb4072d20df98", + "bom-ref": "a07c1acb5f3512b6", "name": "/usr/lib32/gconv/libJISX0213.so", "type": "file" }, { - "bom-ref": "eb52d1d46258e77a", + "bom-ref": "468b8ef6247e8288", "name": "/usr/lib32/gconv/libKSC.so", "type": "file" }, { - "bom-ref": "2905511b1fddc891", + "bom-ref": "4e4840e4ba482bb3", "name": "/usr/lib32/ld-linux.so.2", "type": "file" }, { - "bom-ref": "3bfe1d76afc06563", + "bom-ref": "3d8ae7d8261da1ad", "name": "/usr/lib32/libBrokenLocale.so.1", "type": "file" }, { - "bom-ref": "8567383a3fff3f7d", + "bom-ref": "6946fb7deb808f4f", "name": "/usr/lib32/libanl.so.1", "type": "file" }, { - "bom-ref": "e35eab2065d442b1", + "bom-ref": "5c6bdecb903a9d4b", "name": "/usr/lib32/libc.so.6", "type": "file" }, { - "bom-ref": "52b27d895ea3f416", + "bom-ref": "1982e0bf3a61db04", "name": "/usr/lib32/libc_malloc_debug.so.0", "type": "file" }, { - "bom-ref": "3fffa994c4c6ebb6", + "bom-ref": "1c2c8868bcec7fc8", "name": "/usr/lib32/libdl.so.2", "type": "file" }, { - "bom-ref": "e34740e8261a46c7", + "bom-ref": "1fc4700c884e43e1", "name": "/usr/lib32/libgcc_s.so.1", "type": "file" }, { - "bom-ref": "3f7ef26cbea9015c", + "bom-ref": "8414f231a84862ba", "name": "/usr/lib32/libm.so.6", "type": "file" }, { - "bom-ref": "fe54443beb8ae1f9", + "bom-ref": "97cd9be23a819787", "name": "/usr/lib32/libmemusage.so", "type": "file" }, { - "bom-ref": "bc2a20472c295612", + "bom-ref": "1d557f820a1e0070", "name": "/usr/lib32/libnsl.so.1", "type": "file" }, { - "bom-ref": "92288c0e880b18bd", + "bom-ref": "fc65a558d9cc296f", "name": "/usr/lib32/libnss_compat.so.2", "type": "file" }, { - "bom-ref": "1a28876b5bdfa326", + "bom-ref": "82d3c99ed475b850", "name": "/usr/lib32/libnss_dns.so.2", "type": "file" }, { - "bom-ref": "7e79ff38d0378b56", + "bom-ref": "68e9bd5e6eedf774", "name": "/usr/lib32/libnss_files.so.2", "type": "file" }, { - "bom-ref": "b8e0cc48ae2f7bc2", + "bom-ref": "93161f6d36431aa8", "name": "/usr/lib32/libnss_hesiod.so.2", "type": "file" }, { - "bom-ref": "493f5d15ce76c76e", + "bom-ref": "4ddb26a97e16d08c", "name": "/usr/lib32/libpcprofile.so", "type": "file" }, { - "bom-ref": "487444d4f531b6b2", + "bom-ref": "b8015ee7b41aaf20", "name": "/usr/lib32/libpthread.so.0", "type": "file" }, { - "bom-ref": "e7447ba0e336c9c7", + "bom-ref": "19e61e0d9201ffa5", "name": "/usr/lib32/libresolv.so.2", "type": "file" }, { - "bom-ref": "a8bc791e2c7d9b1c", + "bom-ref": "cd15b9bb5427de92", "name": "/usr/lib32/librt.so.1", "type": "file" }, { - "bom-ref": "510573c3a0c8d6f3", + "bom-ref": "14dbaf398d83224d", "name": "/usr/lib32/libstdc++.so.6.0.33", "type": "file" }, { - "bom-ref": "69d805db7d15bf12", + "bom-ref": "040ca5df99e30824", "name": "/usr/lib32/libthread_db.so.1", "type": "file" }, { - "bom-ref": "2add97394edd6bac", + "bom-ref": "185fe526a0211496", "name": "/usr/lib32/libutil.so.1", "type": "file" }, { - "bom-ref": "23e48748cf0975df", + "bom-ref": "03bcafbb1592a78d", "name": "/usr/libexec/coreutils/libstdbuf.so", "type": "file" }, { - "bom-ref": "a2ca6cb0573d32c0", + "bom-ref": "30ca7ba0f6d948ef", "name": "/usr/libexec/dpkg/dpkg-db-backup", "type": "file" }, { - "bom-ref": "f8a1a80699574ccb", + "bom-ref": "01d16bd73e428ae0", "name": "/usr/libexec/dpkg/dpkg-db-keeper", "type": "file" }, { - "bom-ref": "c61ec424ed4aced4", + "bom-ref": "23baa9c5b9027911", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/cc1", "type": "file" }, { - "bom-ref": "88ec5f95a994ecd5", + "bom-ref": "7596cb8d79c35c70", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus", "type": "file" }, { - "bom-ref": "b374eb1a09d5a06c", + "bom-ref": "4bba25897bac087d", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/collect2", "type": "file" }, { - "bom-ref": "690842ffcea0fd2c", + "bom-ref": "e9bd1f00e63554f1", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/g++-mapper-server", "type": "file" }, { - "bom-ref": "f75fd7ea5ad7789f", + "bom-ref": "03ad45c451ab7572", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so", "type": "file" }, { - "bom-ref": "9957f1670e4d886e", + "bom-ref": "874638801b393297", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper", "type": "file" }, { - "bom-ref": "c9cbb514bcfb5187", + "bom-ref": "8cf85e8f8d2f4d7a", "name": "/usr/libexec/gcc/x86_64-linux-gnu/13/lto1", "type": "file" }, { - "bom-ref": "349044ba5149cd19", + "bom-ref": "3d87d9d275f45dae", "name": "/usr/local/bin/etcd", "type": "file" }, { - "bom-ref": "dfc54ffbfcbdb787", + "bom-ref": "71756d440349471c", "name": "/usr/local/bin/etcdctl", "type": "file" }, { - "bom-ref": "0381de31af499299", + "bom-ref": "0e99931d5a483f92", "name": "/usr/local/bin/etcdutl", "type": "file" }, { - "bom-ref": "2917767f39c9ef86", - "name": "/usr/local/cuda-13.2/NsightSystems-cli-2026.2.1/target-linux-x64/plugins/efa_metrics/nic_sampler", + "bom-ref": "5207a16ce9a77fb7", + "name": "/usr/local/cuda-13.4/NsightSystems-cli-2026.5.1/target-linux-x64/plugins/efa_metrics/nic_sampler", "type": "file" }, { - "bom-ref": "47ff9cf2aca0f07f", - "name": "/usr/local/cuda-13.2/NsightSystems-cli-2026.2.1/target-linux-x64/python/lib/python3.12/site-packages/pip-25.0.1.dist-info/METADATA", + "bom-ref": "2a0811c336f5fe1f", + "name": "/usr/local/cuda-13.4/NsightSystems-cli-2026.5.1/target-linux-x64/python/lib/python3.12/site-packages/pip-26.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b370461522e73897", - "name": "/usr/local/cuda-13.2/NsightSystems-cli-2026.2.1/target-linux-x64/python/lib/python3.12/site-packages/pip-25.0.1.dist-info/RECORD", + "bom-ref": "9b859ca392098154", + "name": "/usr/local/cuda-13.4/NsightSystems-cli-2026.5.1/target-linux-x64/python/lib/python3.12/site-packages/pip-26.0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5e8762a6f9b32fd9", - "name": "/usr/local/cuda-13.2/NsightSystems-cli-2026.2.1/target-linux-x64/python/lib/python3.12/site-packages/pip-25.0.1.dist-info/top_level.txt", + "bom-ref": "15067d211a6eec25", + "name": "/usr/local/cuda-13.4/NsightSystems-cli-2026.5.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe", "type": "file" }, { - "bom-ref": "6b93d8df60c5a776", - "name": "/usr/local/cuda-13.2/NsightSystems-cli-2026.2.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe", + "bom-ref": "f75629a54b9c25dc", + "name": "/usr/local/cuda-13.4/NsightSystems-cli-2026.5.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe", "type": "file" }, { - "bom-ref": "86c5ccf5793ead71", - "name": "/usr/local/cuda-13.2/NsightSystems-cli-2026.2.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe", + "bom-ref": "26ea0877be512f31", + "name": "/usr/local/cuda-13.4/NsightSystems-cli-2026.5.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe", "type": "file" }, { - "bom-ref": "12f7ff179b07f29c", - "name": "/usr/local/cuda-13.2/NsightSystems-cli-2026.2.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe", + "bom-ref": "99a5c758be27acf2", + "name": "/usr/local/cuda-13.4/NsightSystems-cli-2026.5.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe", "type": "file" }, { - "bom-ref": "79aa7d561ccb5d18", - "name": "/usr/local/cuda-13.2/NsightSystems-cli-2026.2.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe", + "bom-ref": "788569081d4f450e", + "name": "/usr/local/cuda-13.4/NsightSystems-cli-2026.5.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe", "type": "file" }, { - "bom-ref": "fa57369f5d07ce78", - "name": "/usr/local/cuda-13.2/NsightSystems-cli-2026.2.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe", + "bom-ref": "b58d3f66e4b86d5d", + "name": "/usr/local/cuda-13.4/NsightSystems-cli-2026.5.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe", "type": "file" }, { - "bom-ref": "c165ce45ecbda2a6", - "name": "/usr/local/cuda-13.2/NsightSystems-cli-2026.2.1/target-linux-x64/python/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe", + "bom-ref": "c9e62e020ba2a23a", + "name": "/usr/local/cuda-13.4/bin/__nvcc_device_query", "type": "file" }, { - "bom-ref": "af2b6de2ef7eb969", - "name": "/usr/local/cuda-13.2/bin/__nvcc_device_query", + "bom-ref": "54dec2a40a27f536", + "name": "/usr/local/cuda-13.4/bin/bin2c", "type": "file" }, { - "bom-ref": "b053bf3c008094b3", - "name": "/usr/local/cuda-13.2/bin/bin2c", + "bom-ref": "abc56ae28328b1f8", + "name": "/usr/local/cuda-13.4/bin/compute-sanitizer", "type": "file" }, { - "bom-ref": "1f458ba1d00565c0", - "name": "/usr/local/cuda-13.2/bin/compute-sanitizer", + "bom-ref": "70ca8548256221eb", + "name": "/usr/local/cuda-13.4/bin/crt/link.stub", "type": "file" }, { - "bom-ref": "73c14aed0d41e60b", - "name": "/usr/local/cuda-13.2/bin/crt/link.stub", + "bom-ref": "fb24aa414e804412", + "name": "/usr/local/cuda-13.4/bin/crt/prelink.stub", "type": "file" }, { - "bom-ref": "ad34616b4bda12f7", - "name": "/usr/local/cuda-13.2/bin/crt/prelink.stub", + "bom-ref": "62a5e2e8c5112847", + "name": "/usr/local/cuda-13.4/bin/cuda-gdb", "type": "file" }, { - "bom-ref": "0024f471f4fd4201", - "name": "/usr/local/cuda-13.2/bin/cuda-gdb", + "bom-ref": "c504b8b69ed0498c", + "name": "/usr/local/cuda-13.4/bin/cuda-gdb-minimal", "type": "file" }, { - "bom-ref": "86127b2bcbec68ba", - "name": "/usr/local/cuda-13.2/bin/cuda-gdb-minimal", + "bom-ref": "74eb37d6bae97539", + "name": "/usr/local/cuda-13.4/bin/cuda-gdb-python3.10-tui", "type": "file" }, { - "bom-ref": "402c50382ce3c83f", - "name": "/usr/local/cuda-13.2/bin/cuda-gdb-python3.10-tui", + "bom-ref": "af7464ebd9fc746d", + "name": "/usr/local/cuda-13.4/bin/cuda-gdb-python3.11-tui", "type": "file" }, { - "bom-ref": "5976a6b2cb207225", - "name": "/usr/local/cuda-13.2/bin/cuda-gdb-python3.11-tui", + "bom-ref": "96a2265e674e5ec6", + "name": "/usr/local/cuda-13.4/bin/cuda-gdb-python3.12-tui", "type": "file" }, { - "bom-ref": "204c586b9ed4a177", - "name": "/usr/local/cuda-13.2/bin/cuda-gdb-python3.12-tui", + "bom-ref": "08ecae7335841cc8", + "name": "/usr/local/cuda-13.4/bin/cuda-gdb-python3.13-tui", "type": "file" }, { - "bom-ref": "6754c841f41f0cd2", - "name": "/usr/local/cuda-13.2/bin/cuda-gdb-python3.8-tui", + "bom-ref": "50a745d8a94b0333", + "name": "/usr/local/cuda-13.4/bin/cuda-gdb-python3.14-tui", "type": "file" }, { - "bom-ref": "6004858dc10ec4da", - "name": "/usr/local/cuda-13.2/bin/cuda-gdb-python3.9-tui", + "bom-ref": "fb6cada12ab49023", + "name": "/usr/local/cuda-13.4/bin/cuda-gdb-python3.8-tui", "type": "file" }, { - "bom-ref": "4d7b7815276b19f0", - "name": "/usr/local/cuda-13.2/bin/cuda-gdbserver", + "bom-ref": "8093686dac0750ef", + "name": "/usr/local/cuda-13.4/bin/cuda-gdb-python3.9-tui", "type": "file" }, { - "bom-ref": "75370fc3611dddd2", - "name": "/usr/local/cuda-13.2/bin/cudafe++", + "bom-ref": "be105993943005d4", + "name": "/usr/local/cuda-13.4/bin/cuda-gdbserver", "type": "file" }, { - "bom-ref": "218498ae21185790", - "name": "/usr/local/cuda-13.2/bin/cuobjdump", + "bom-ref": "91cc361a3b897b3b", + "name": "/usr/local/cuda-13.4/bin/cudafe++", "type": "file" }, { - "bom-ref": "8365393d518dfb86", - "name": "/usr/local/cuda-13.2/bin/fatbinary", + "bom-ref": "e000ef4abd08ace6", + "name": "/usr/local/cuda-13.4/bin/cuobjdump", "type": "file" }, { - "bom-ref": "5f0737c1531df87f", - "name": "/usr/local/cuda-13.2/bin/nvcc", + "bom-ref": "2a809ec81ea44842", + "name": "/usr/local/cuda-13.4/bin/fatbinary", "type": "file" }, { - "bom-ref": "35dc8f554d8c7e7e", - "name": "/usr/local/cuda-13.2/bin/nvcc.profile", + "bom-ref": "4fd9ab71be8e68ab", + "name": "/usr/local/cuda-13.4/bin/nvcc", "type": "file" }, { - "bom-ref": "089616ea07f1fd01", - "name": "/usr/local/cuda-13.2/bin/nvdisasm", + "bom-ref": "bef0f325d43fcd45", + "name": "/usr/local/cuda-13.4/bin/nvcc.profile", "type": "file" }, { - "bom-ref": "1d5a6c0fed8e00c3", - "name": "/usr/local/cuda-13.2/bin/nvlink", + "bom-ref": "bdb0c20d63466caa", + "name": "/usr/local/cuda-13.4/bin/nvdisasm", "type": "file" }, { - "bom-ref": "ac520a0005538376", - "name": "/usr/local/cuda-13.2/bin/nvprune", + "bom-ref": "4665ad69b3ed7b6f", + "name": "/usr/local/cuda-13.4/bin/nvlink", "type": "file" }, { - "bom-ref": "66fdbc53f6a6264f", - "name": "/usr/local/cuda-13.2/bin/ptxas", + "bom-ref": "c4179c6c12ffe880", + "name": "/usr/local/cuda-13.4/bin/nvprune", "type": "file" }, { - "bom-ref": "e87b53c0701df5dc", - "name": "/usr/local/cuda-13.2/bin/tileiras", + "bom-ref": "37cc4f560bd357ad", + "name": "/usr/local/cuda-13.4/bin/ptxas", "type": "file" }, { - "bom-ref": "4211c8d5c0a9c6e8", - "name": "/usr/local/cuda-13.2/compute-sanitizer/TreeLauncherSubreaper", + "bom-ref": "397135823fbc3b98", + "name": "/usr/local/cuda-13.4/bin/tileiras", "type": "file" }, { - "bom-ref": "ac98d11b7859c0bd", - "name": "/usr/local/cuda-13.2/compute-sanitizer/TreeLauncherTargetLdPreloadHelper", + "bom-ref": "0ad3d1c44f268f95", + "name": "/usr/local/cuda-13.4/bin/tileirdisasm", "type": "file" }, { - "bom-ref": "45fde1d4695d206b", - "name": "/usr/local/cuda-13.2/compute-sanitizer/compute-sanitizer", + "bom-ref": "a0382b2dbc094f52", + "name": "/usr/local/cuda-13.4/compute-sanitizer/TreeLauncherSubreaper", "type": "file" }, { - "bom-ref": "1a93b24e33113ae7", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/ComputeSanitizer/index.html", + "bom-ref": "bdad23bd1daaf3ec", + "name": "/usr/local/cuda-13.4/compute-sanitizer/TreeLauncherTargetLdPreloadHelper", "type": "file" }, { - "bom-ref": "94d3ea1a4284255f", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/CopyrightAndLicenses/index.html", + "bom-ref": "fd64a1bee20ca76d", + "name": "/usr/local/cuda-13.4/compute-sanitizer/compute-sanitizer", "type": "file" }, { - "bom-ref": "ebe8e090d05f4e83", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/ReleaseNotes/index.html", + "bom-ref": "bea9da4907fd4d83", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/ComputeSanitizer/index.html", "type": "file" }, { - "bom-ref": "726660c252e8336b", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/SanitizerApi/table-of-contents.html", + "bom-ref": "8f4d98bfb8e7c3e5", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/CopyrightAndLicenses/index.html", "type": "file" }, { - "bom-ref": "d1acd919e58f8ed9", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/SanitizerApiGuide/index.html", + "bom-ref": "c6fbce7c6e512d26", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/ReleaseNotes/index.html", "type": "file" }, { - "bom-ref": "69d8c2a14abbab47", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/SanitizerNvtxGuide/index.html", + "bom-ref": "27880a71881c9bfb", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/SanitizerApi/table-of-contents.html", "type": "file" }, { - "bom-ref": "bdc91d545bfe69d1", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/VERSION", + "bom-ref": "e747db3e61039123", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/SanitizerApiGuide/index.html", "type": "file" }, { - "bom-ref": "855a44a2a56c8eaa", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_images/no-padding.png", + "bom-ref": "efde7a61ea6017af", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/SanitizerNvtxGuide/index.html", "type": "file" }, { - "bom-ref": "362d0c14889c49aa", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_images/padding.png", + "bom-ref": "284c11d467ff077d", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/VERSION", "type": "file" }, { - "bom-ref": "56caccf75ab6c0a1", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_images/use-after-free.png", + "bom-ref": "639d50947d5226b0", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_images/no-padding.png", "type": "file" }, { - "bom-ref": "f767b4940b0cae09", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_images/use-before-alloc.png", + "bom-ref": "028b994fc0ca4855", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_images/padding.png", "type": "file" }, { - "bom-ref": "b557924e51c2b433", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_sphinx_design_static/design-tabs.js", + "bom-ref": "478cd0627e9a1499", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_images/use-after-free.png", "type": "file" }, { - "bom-ref": "ea5930a7a08be170", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_sphinx_design_static/sphinx-design.min.css", + "bom-ref": "ced347d87fcc4e50", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_images/use-before-alloc.png", "type": "file" }, { - "bom-ref": "66b0525abf1101ce", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/api.css", + "bom-ref": "6d21b786d3bc5ee9", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_sphinx_design_static/design-tabs.js", "type": "file" }, { - "bom-ref": "77325b10803181b5", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/basic.css", + "bom-ref": "2fc29cd3a19a493b", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_sphinx_design_static/sphinx-design.min.css", "type": "file" }, { - "bom-ref": "cba5b47f2c789d2d", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/custom.css", + "bom-ref": "c4efcbb5962a7b91", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/api.css", "type": "file" }, { - "bom-ref": "45c74c8832aee6ca", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/design-tabs.js", + "bom-ref": "13002f39cbdf98a1", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/basic.css", "type": "file" }, { - "bom-ref": "55b716e57265e32d", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/doctools.js", + "bom-ref": "f6ad351d95d662fd", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/custom.css", "type": "file" }, { - "bom-ref": "c02078fbb51bf014", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/documentation_options.js", + "bom-ref": "f8770fd83a0fc1cd", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/design-tabs.js", "type": "file" }, { - "bom-ref": "af451bd03299c517", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/favicon.ico", + "bom-ref": "cf444791431b64ac", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/doctools.js", "type": "file" }, { - "bom-ref": "f34b895c41d7700d", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/favicon.png", + "bom-ref": "863a5fa8fc7b3748", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/documentation_options.js", "type": "file" }, { - "bom-ref": "1d234f24b2ba528f", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/file.png", + "bom-ref": "5c62d92b26c03896", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/favicon.ico", "type": "file" }, { - "bom-ref": "9fc3cf53f4e07344", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/language_data.js", + "bom-ref": "68a47ffcc88f52d6", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/favicon.png", "type": "file" }, { - "bom-ref": "8bf9d6330bb0a3cc", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/lunr-search.js", + "bom-ref": "b133ffbe011974c0", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/file.png", "type": "file" }, { - "bom-ref": "cedd2c01b7f60416", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/lunr.min.js", + "bom-ref": "ea7afe033e4171bb", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/language_data.js", "type": "file" }, { - "bom-ref": "42e06ff174c1d2dd", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/mermaid-init.js", + "bom-ref": "a6ea7582a6123054", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/lunr-search.js", "type": "file" }, { - "bom-ref": "eead1d452954655d", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/minus.png", + "bom-ref": "f9fc69b084150e09", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/lunr.min.js", "type": "file" }, { - "bom-ref": "f5ec08bf8e2ee3e9", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/modal-table.js", + "bom-ref": "9a707c6aabf4525c", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/mermaid-init.js", "type": "file" }, { - "bom-ref": "b51ef5c56c97789d", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/nvidia-logo-horiz-rgb-1c-blk-for-screen.svg", + "bom-ref": "d9feaa3f54844843", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/minus.png", "type": "file" }, { - "bom-ref": "28d37ae2d0f2f81c", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/nvidia-logo-horiz-rgb-1c-wht-for-screen.svg", + "bom-ref": "679759815912180e", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/modal-table.js", "type": "file" }, { - "bom-ref": "ccb5e3b77275b629", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/nvidia-logo-horiz-rgb-blk-for-screen.svg", + "bom-ref": "737cb53961802034", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/nvidia-logo-horiz-rgb-1c-blk-for-screen.svg", "type": "file" }, { - "bom-ref": "ad77b292787eeeb2", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/nvidia-logo-horiz-rgb-wht-for-screen.svg", + "bom-ref": "4f5743601799cc6a", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/nvidia-logo-horiz-rgb-1c-wht-for-screen.svg", "type": "file" }, { - "bom-ref": "0ce53a96f9a60103", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/plus.png", + "bom-ref": "4ece9e5aab5f2625", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/nvidia-logo-horiz-rgb-blk-for-screen.svg", "type": "file" }, { - "bom-ref": "71e2bf31189d5d77", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/pygments.css", + "bom-ref": "a299f59211c6ce58", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/nvidia-logo-horiz-rgb-wht-for-screen.svg", "type": "file" }, { - "bom-ref": "5a04de6514264c5b", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/scripts/bootstrap.js", + "bom-ref": "c406e8908e36a60d", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/plus.png", "type": "file" }, { - "bom-ref": "4e94695db9974636", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/scripts/bootstrap.js.LICENSE.txt", + "bom-ref": "54ebde33bd8413f8", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/pygments.css", "type": "file" }, { - "bom-ref": "aa2f40a6bec45a13", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/scripts/bootstrap.js.map", + "bom-ref": "6b8e9c3f96df0275", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/scripts/bootstrap.js", "type": "file" }, { - "bom-ref": "5a8b5bd543e9c14d", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/scripts/fontawesome.js", + "bom-ref": "2b99661bd63c91ee", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/scripts/bootstrap.js.LICENSE.txt", "type": "file" }, { - "bom-ref": "80e913000505720b", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/scripts/fontawesome.js.LICENSE.txt", + "bom-ref": "0883d08e5be248eb", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/scripts/bootstrap.js.map", "type": "file" }, { - "bom-ref": "4446b63678f56aee", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/scripts/fontawesome.js.map", + "bom-ref": "0ca94eae4645b2d6", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/scripts/fontawesome.js", "type": "file" }, { - "bom-ref": "c27083b75783b83a", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/scripts/nvidia-sphinx-theme.js", + "bom-ref": "3d09263368591cb4", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/scripts/fontawesome.js.LICENSE.txt", "type": "file" }, { - "bom-ref": "b1f70f1d89836fb0", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/scripts/pydata-sphinx-theme.js", + "bom-ref": "5636361558f94a08", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/scripts/fontawesome.js.map", "type": "file" }, { - "bom-ref": "d445e1e32426a68e", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/scripts/pydata-sphinx-theme.js.map", + "bom-ref": "44b17bb813cb6d9b", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/scripts/nvidia-sphinx-theme.js", "type": "file" }, { - "bom-ref": "f714616ccd1e2750", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/scrollspy-patch.js", + "bom-ref": "3d5233e5c78f6c81", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/scripts/pydata-sphinx-theme.js", "type": "file" }, { - "bom-ref": "ff00d40c90dfe69c", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/searchtools.js", + "bom-ref": "d2b1d7ae17ed85a8", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/scripts/pydata-sphinx-theme.js.map", "type": "file" }, { - "bom-ref": "11be0a4c5f3613d4", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/sphinx-design.min.css", + "bom-ref": "e46817d631c6b73f", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/scrollspy-patch.js", "type": "file" }, { - "bom-ref": "537df6ef71cc2231", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/sphinx_highlight.js", + "bom-ref": "3125c7a474d4ddfb", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/searchtools.js", "type": "file" }, { - "bom-ref": "31e37674047f39cf", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/styles/nvidia-sphinx-theme.css", + "bom-ref": "ab9b94bd4bc63740", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/sphinx-design.min.css", "type": "file" }, { - "bom-ref": "d86c534d036c2a5f", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/styles/nvidia-sphinx-theme.css.map", + "bom-ref": "61c7dae8a7d7e525", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/sphinx_highlight.js", "type": "file" }, { - "bom-ref": "ef7d756d62641b40", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/styles/pydata-sphinx-theme.css", + "bom-ref": "0e6a8dea4e8112e2", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/styles/nvidia-sphinx-theme.css", "type": "file" }, { - "bom-ref": "938913a45117cc83", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/styles/pydata-sphinx-theme.css.map", + "bom-ref": "868681ef5939e26b", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/styles/nvidia-sphinx-theme.css.map", "type": "file" }, { - "bom-ref": "cec40e2236ca297c", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/styles/theme.css", + "bom-ref": "7537e7198a7f3fcf", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/styles/pydata-sphinx-theme.css", "type": "file" }, { - "bom-ref": "237077cf82efa208", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/twemoji.css", + "bom-ref": "bf92b0f84aa6cbae", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/styles/pydata-sphinx-theme.css.map", "type": "file" }, { - "bom-ref": "5737eec9a6e4a848", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/twemoji.js", + "bom-ref": "7fd66388bcdc6ce6", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/styles/theme.css", "type": "file" }, { - "bom-ref": "c2a29e918e5af889", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf", + "bom-ref": "301ec58a16db6ba6", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/twemoji.css", "type": "file" }, { - "bom-ref": "0d90e883683a29f1", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2", + "bom-ref": "7caab861b478d0f9", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/twemoji.js", "type": "file" }, { - "bom-ref": "13df00697f0387e3", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf", + "bom-ref": "e9cc37539a2dffb9", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf", "type": "file" }, { - "bom-ref": "ba7771024c1c13fa", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2", + "bom-ref": "61e97d0eefef371e", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2", "type": "file" }, { - "bom-ref": "aa084a05340bd961", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf", + "bom-ref": "0e1f653b76231853", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf", "type": "file" }, { - "bom-ref": "68878829e262569f", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2", + "bom-ref": "fe62b3f32befd352", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2", "type": "file" }, { - "bom-ref": "fcdbd90263fa5338", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/version-patch.js", + "bom-ref": "13760a97b12b3ff8", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf", "type": "file" }, { - "bom-ref": "dfcf0854aa5aee29", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/_static/webpack-macros.html", + "bom-ref": "1b78a217d8fd4bac", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2", "type": "file" }, { - "bom-ref": "8db00457de51985e", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/group__SANITIZER__BARRIER__API.html", + "bom-ref": "c566dbb269a9f8a6", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/version-patch.js", "type": "file" }, { - "bom-ref": "77c5800528e421cf", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/group__SANITIZER__CALLBACK__API.html", + "bom-ref": "250212b0e7f760a0", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/_static/webpack-macros.html", "type": "file" }, { - "bom-ref": "2b702633d278b4bc", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/group__SANITIZER__MEMORY__API.html", + "bom-ref": "44670b3d8a304600", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/group__SANITIZER__BARRIER__API.html", "type": "file" }, { - "bom-ref": "149e9a2e5e1b71f6", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/group__SANITIZER__PATCHING__API.html", + "bom-ref": "35e78f9e242094c1", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/group__SANITIZER__CALLBACK__API.html", "type": "file" }, { - "bom-ref": "a206d2caaaec58ed", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/group__SANITIZER__RESULT__API.html", + "bom-ref": "aaa544d8b872c905", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/group__SANITIZER__MEMORY__API.html", "type": "file" }, { - "bom-ref": "28ba8b64967f7028", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/group__SANITIZER__STREAM__API.html", + "bom-ref": "a8b0cfcb4cbc082a", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/group__SANITIZER__PATCHING__API.html", "type": "file" }, { - "bom-ref": "b9cf7ab2e45e9cca", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/modules.html", + "bom-ref": "8b0ed2d9d1006631", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/group__SANITIZER__RESULT__API.html", "type": "file" }, { - "bom-ref": "f5fa9bf5df77b181", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__BatchMemopData.html", + "bom-ref": "56f5f1cc010808a2", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/group__SANITIZER__STREAM__API.html", "type": "file" }, { - "bom-ref": "2ab39b4322cf63c8", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__CallbackData.html", + "bom-ref": "4cb7991d1e8fe945", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/modules.html", "type": "file" }, { - "bom-ref": "4be784312e9c1d45", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__ErrorLoggingData.html", + "bom-ref": "e9a926c2d423e967", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__BatchMemcpyItemEndData.html", "type": "file" }, { - "bom-ref": "7ab6d4bacc75fc57", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__EventData.html", + "bom-ref": "f3fd70eba1112c34", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__BatchMemopData.html", "type": "file" }, { - "bom-ref": "21fd83152fd4e50e", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__ExternalMemoryData.html", + "bom-ref": "af5fe66d859fc558", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__BatchMultiEntryPushData.html", "type": "file" }, { - "bom-ref": "4eb78d56c7827d46", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__GraphExecData.html", + "bom-ref": "6e29637ab21b5303", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__CallbackData.html", "type": "file" }, { - "bom-ref": "b556857438b65719", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__GraphLaunchData.html", + "bom-ref": "7ffc366ce9d8cade", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ErrorLoggingData.html", "type": "file" }, { - "bom-ref": "9b7246f40be8dd19", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__GraphNodeLaunchData.html", + "bom-ref": "b47a22b2850a63c4", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__EventData.html", "type": "file" }, { - "bom-ref": "bcb7ceae76dac3d4", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__LaunchData.html", + "bom-ref": "3ef93c1bbffbca41", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ExternalMemoryData.html", "type": "file" }, { - "bom-ref": "0ecebfe2673398e0", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__MemcpyData.html", + "bom-ref": "422bd2c3707f4049", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__GraphExecData.html", "type": "file" }, { - "bom-ref": "1c51871c2ea5b482", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__MemsetData.html", + "bom-ref": "a7d0168bee55fd83", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__GraphLaunchData.html", "type": "file" }, { - "bom-ref": "c1cde2c9c7e1b3d3", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__ResourceArrayData.html", + "bom-ref": "ac3def0f1497061b", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__GraphNodeLaunchData.html", "type": "file" }, { - "bom-ref": "6c95f3122b511c09", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__ResourceContextData.html", + "bom-ref": "1694407f4fdfae3c", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__LaunchData.html", "type": "file" }, { - "bom-ref": "6b2360adb8992a96", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__ResourceFunctionsLazyLoadedData.html", + "bom-ref": "834fbeab890e5a0b", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__MemcpyData.html", "type": "file" }, { - "bom-ref": "04dda77c8ce3de90", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__ResourceMemoryData.html", + "bom-ref": "e91f2b2219957538", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__MemsetData.html", "type": "file" }, { - "bom-ref": "0095aadf8c27d653", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__ResourceMempoolData.html", + "bom-ref": "72bb2db22bff7c9e", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ResourceArrayData.html", "type": "file" }, { - "bom-ref": "edda106f7941f94d", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__ResourceModuleData.html", + "bom-ref": "7ddb6a55ee372d39", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ResourceContextData.html", "type": "file" }, { - "bom-ref": "a1f67494e5593b3e", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__ResourceStreamData.html", + "bom-ref": "4513686740686dcd", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ResourceFunctionsLazyLoadedData.html", "type": "file" }, { - "bom-ref": "3bff328135c36f37", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__ResourceVirtualRange.html", + "bom-ref": "e201786713b901ab", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ResourceLogicalEndpointData.html", "type": "file" }, { - "bom-ref": "3514103f310e6c01", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__SynchronizeData.html", + "bom-ref": "8346f96f03575319", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ResourceMemoryData.html", "type": "file" }, { - "bom-ref": "0be8571963c49eb3", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structSanitizer__UvmData.html", + "bom-ref": "d73a6e73057af273", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ResourceMempoolData.html", "type": "file" }, { - "bom-ref": "bd533d3c5c7e7d22", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/api/structs.html", + "bom-ref": "b554954c85a8885a", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ResourceModuleData.html", "type": "file" }, { - "bom-ref": "faf19c33b99e3232", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/content/notices.html", + "bom-ref": "97becfd73ed18ed3", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ResourceStreamData.html", "type": "file" }, { - "bom-ref": "66e07d940bc79a11", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/genindex.html", + "bom-ref": "4828db3429286cb0", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__ResourceVirtualRange.html", "type": "file" }, { - "bom-ref": "9f4c3764a4be89c3", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/index.html", + "bom-ref": "ca63015fc7135e12", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__SynchronizeData.html", "type": "file" }, { - "bom-ref": "b6f4fcbd169d11ff", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/objects.inv", + "bom-ref": "0f8ff2e465bab54f", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structSanitizer__UvmData.html", "type": "file" }, { - "bom-ref": "6bf4d90e174ce677", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/project.json", + "bom-ref": "d19880766cd568de", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/api/structs.html", "type": "file" }, { - "bom-ref": "2ffbbf646d8a8a19", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/search.html", + "bom-ref": "b5fd8afd8f4fa291", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/content/notices.html", "type": "file" }, { - "bom-ref": "8f8764c39f9365ca", - "name": "/usr/local/cuda-13.2/compute-sanitizer/docs/searchindex.js", + "bom-ref": "815d6aa4e06334f2", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/genindex.html", "type": "file" }, { - "bom-ref": "f98f81c6ad375673", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/generated_cudaGL_meta.h", + "bom-ref": "490b6ffb1ecde65f", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/index.html", "type": "file" }, { - "bom-ref": "0e7df06d91226847", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/generated_cudaVDPAU_meta.h", + "bom-ref": "e34987c54564a992", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/objects.inv", "type": "file" }, { - "bom-ref": "650fa7dde75c0a9c", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/generated_cuda_gl_interop_meta.h", + "bom-ref": "1a93026656f27cea", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/project.json", "type": "file" }, { - "bom-ref": "527c4886097bdfc0", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/generated_cuda_meta.h", + "bom-ref": "3f47cb74b328ef7b", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/search.html", "type": "file" }, { - "bom-ref": "35155510324473b0", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/generated_cuda_profiler_api_meta.h", + "bom-ref": "7e7eaceab22f654b", + "name": "/usr/local/cuda-13.4/compute-sanitizer/docs/searchindex.js", "type": "file" }, { - "bom-ref": "8411fc89ae7c60f6", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/generated_cuda_runtime_api_meta.h", + "bom-ref": "875ed3051f23b49e", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/generated_cudaGL_meta.h", "type": "file" }, { - "bom-ref": "f9f5f98069b53b25", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/generated_cuda_vdpau_interop_meta.h", + "bom-ref": "f7979c8fe4c39f45", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/generated_cudaVDPAU_meta.h", "type": "file" }, { - "bom-ref": "439c06f363b5323e", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/sanitizer.h", + "bom-ref": "dedf08d6150e48ef", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/generated_cuda_gl_interop_meta.h", "type": "file" }, { - "bom-ref": "1969f7988aa28b33", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/sanitizer_barrier.h", + "bom-ref": "e71ffd7aecb71b9e", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/generated_cuda_meta.h", "type": "file" }, { - "bom-ref": "df7770fefc360a5d", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/sanitizer_callbacks.h", + "bom-ref": "3584a63dcb052d47", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/generated_cuda_profiler_api_meta.h", "type": "file" }, { - "bom-ref": "78fcd879bf49dcac", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/sanitizer_driver_cbid.h", + "bom-ref": "f62f2faab53e3b9f", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/generated_cuda_runtime_api_meta.h", "type": "file" }, { - "bom-ref": "a8b46bac622f2dfc", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/sanitizer_memory.h", + "bom-ref": "dd3d9a18d0098aea", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/generated_cuda_vdpau_interop_meta.h", "type": "file" }, { - "bom-ref": "cafd959d3365a77a", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/sanitizer_patching.h", + "bom-ref": "f755a8594191f442", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/sanitizer.h", "type": "file" }, { - "bom-ref": "7ef4b62ec45d4ebe", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/sanitizer_result.h", + "bom-ref": "20faacd9f19f5247", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/sanitizer_barrier.h", "type": "file" }, { - "bom-ref": "44a1b83817a356db", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/sanitizer_runtime_cbid.h", + "bom-ref": "dd575214e34b1854", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/sanitizer_callbacks.h", "type": "file" }, { - "bom-ref": "4c3a4e2cc1fde82c", - "name": "/usr/local/cuda-13.2/compute-sanitizer/include/sanitizer_stream.h", + "bom-ref": "18296ddc2f24e166", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/sanitizer_driver_cbid.h", "type": "file" }, { - "bom-ref": "25267e558c30786b", - "name": "/usr/local/cuda-13.2/compute-sanitizer/libInterceptorInjectionTarget.so", + "bom-ref": "8d0d9592f96b6c6f", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/sanitizer_memory.h", "type": "file" }, { - "bom-ref": "eddd963d3d5c5778", - "name": "/usr/local/cuda-13.2/compute-sanitizer/libTreeLauncherPlaceholder.so", + "bom-ref": "50479b6d6bd42cf4", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/sanitizer_patching.h", "type": "file" }, { - "bom-ref": "3b2a42cbd73161ea", - "name": "/usr/local/cuda-13.2/compute-sanitizer/libTreeLauncherTargetInjection.so", + "bom-ref": "c6b7efbc743a4a62", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/sanitizer_result.h", "type": "file" }, { - "bom-ref": "14d01c4825a20647", - "name": "/usr/local/cuda-13.2/compute-sanitizer/libTreeLauncherTargetUpdatePreloadInjection.so", + "bom-ref": "0debe2457903ebd1", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/sanitizer_runtime_cbid.h", "type": "file" }, { - "bom-ref": "2d6524194d04c97d", - "name": "/usr/local/cuda-13.2/compute-sanitizer/libsanitizer-collection.so", + "bom-ref": "d8722e15b5d236c2", + "name": "/usr/local/cuda-13.4/compute-sanitizer/include/sanitizer_stream.h", "type": "file" }, { - "bom-ref": "64ae01c1e01cfd78", - "name": "/usr/local/cuda-13.2/compute-sanitizer/libsanitizer-public.so", + "bom-ref": "421b632e99050b34", + "name": "/usr/local/cuda-13.4/compute-sanitizer/libInterceptorInjectionTarget.so", "type": "file" }, { - "bom-ref": "d935220fdb6c4979", - "name": "/usr/local/cuda-13.2/compute-sanitizer/x86/TreeLauncherSubreaper", + "bom-ref": "4860e841daa938b5", + "name": "/usr/local/cuda-13.4/compute-sanitizer/libTreeLauncherPlaceholder.so", "type": "file" }, { - "bom-ref": "383125b2961a9361", - "name": "/usr/local/cuda-13.2/compute-sanitizer/x86/TreeLauncherTargetLdPreloadHelper", + "bom-ref": "78280cea4fa82a07", + "name": "/usr/local/cuda-13.4/compute-sanitizer/libTreeLauncherTargetInjection.so", "type": "file" }, { - "bom-ref": "0d002d5d21ee4e34", - "name": "/usr/local/cuda-13.2/compute-sanitizer/x86/libInterceptorInjectionTarget.so", + "bom-ref": "153cefabac2fee88", + "name": "/usr/local/cuda-13.4/compute-sanitizer/libTreeLauncherTargetUpdatePreloadInjection.so", "type": "file" }, { - "bom-ref": "447996b529769d89", - "name": "/usr/local/cuda-13.2/compute-sanitizer/x86/libTreeLauncherPlaceholder.so", + "bom-ref": "6c6e5c39dd256bb0", + "name": "/usr/local/cuda-13.4/compute-sanitizer/libsanitizer-collection.so", "type": "file" }, { - "bom-ref": "ac4a3724b31e9e6e", - "name": "/usr/local/cuda-13.2/compute-sanitizer/x86/libTreeLauncherTargetInjection.so", + "bom-ref": "0afa4eba14987583", + "name": "/usr/local/cuda-13.4/compute-sanitizer/libsanitizer-public.so", "type": "file" }, { - "bom-ref": "3395ef58d10385c8", - "name": "/usr/local/cuda-13.2/compute-sanitizer/x86/libTreeLauncherTargetUpdatePreloadInjection.so", + "bom-ref": "f58edd3d31e1878a", + "name": "/usr/local/cuda-13.4/compute-sanitizer/x86/TreeLauncherSubreaper", "type": "file" }, { - "bom-ref": "6e177dbfd2a741f5", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileDescr_t.3", + "bom-ref": "075a037679c0d355", + "name": "/usr/local/cuda-13.4/compute-sanitizer/x86/TreeLauncherTargetLdPreloadHelper", "type": "file" }, { - "bom-ref": "bb89cd3ce3b81816", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileDrvProps.3", + "bom-ref": "916f50319094a274", + "name": "/usr/local/cuda-13.4/compute-sanitizer/x86/libInterceptorInjectionTarget.so", "type": "file" }, { - "bom-ref": "41edaba2d8b60ad1", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileError.3", + "bom-ref": "472f59946fe09aa1", + "name": "/usr/local/cuda-13.4/compute-sanitizer/x86/libTreeLauncherPlaceholder.so", "type": "file" }, { - "bom-ref": "66888f9bd23594e6", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileFSOps.3", + "bom-ref": "d045a949692e58f5", + "name": "/usr/local/cuda-13.4/compute-sanitizer/x86/libTreeLauncherTargetInjection.so", "type": "file" }, { - "bom-ref": "4f05a13ad271ccf7", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileIOEvents.3", + "bom-ref": "2c87a5ab640124f2", + "name": "/usr/local/cuda-13.4/compute-sanitizer/x86/libTreeLauncherTargetUpdatePreloadInjection.so", "type": "file" }, { - "bom-ref": "6289d31c12d9e28c", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileIOParams.3", + "bom-ref": "0c9c1434b6f57085", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileDescr_t.3", "type": "file" }, { - "bom-ref": "27db22c80b68e59d", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileOpCounter.3", + "bom-ref": "4cf2d36a2678cb3d", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileDrvProps.3", "type": "file" }, { - "bom-ref": "68d2933142434e2c", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileOpError.h.3", + "bom-ref": "2204d28f1a1f243c", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileError.3", "type": "file" }, { - "bom-ref": "a4cc34a4899da268", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfilePerGpuStats.3", + "bom-ref": "32373ba879b9360c", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileFSOps.3", "type": "file" }, { - "bom-ref": "8b68ca4d5d9f4eb5", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileStatsLevel1.3", + "bom-ref": "568ebd4360fcf1a7", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileIOEvents.3", "type": "file" }, { - "bom-ref": "0e17f525c4dab9d7", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileStatsLevel2.3", + "bom-ref": "11bdd9aadf72669f", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileIOParams.3", "type": "file" }, { - "bom-ref": "bc36ad33a0d3d569", - "name": "/usr/local/cuda-13.2/doc/man/man3/CUfileStatsLevel3.3", + "bom-ref": "869abf72a94d40d2", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileIOVec.3", "type": "file" }, { - "bom-ref": "699020ec783e788f", - "name": "/usr/local/cuda-13.2/doc/man/man3/cufile.h.3", + "bom-ref": "4252b986db26436c", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileOpCounter.3", "type": "file" }, { - "bom-ref": "abc85274efa0411a", - "name": "/usr/local/cuda-13.2/doc/man/man3/cufileRDMAInfo.3", + "bom-ref": "e5cb30ec1f2b5c61", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileOpError.h.3", "type": "file" }, { - "bom-ref": "cfd96058042815bf", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/VERSION", + "bom-ref": "083b32566ae0becc", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfilePerGpuStats.3", "type": "file" }, { - "bom-ref": "cf38dfce0df096e8", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_images/config-image.png", + "bom-ref": "756b4865c424469a", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileStatsLevel1.3", "type": "file" }, { - "bom-ref": "67f066b593dd413b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_images/counter-data-image.png", + "bom-ref": "db7ab63cf34f6d9b", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileStatsLevel2.3", "type": "file" }, { - "bom-ref": "152642cfe4d28daf", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_images/metrics-tree.png", + "bom-ref": "f8cbcb0ca2a41d0f", + "name": "/usr/local/cuda-13.4/doc/man/man3/CUfileStatsLevel3.3", "type": "file" }, { - "bom-ref": "dcab3b2391ee1497", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_images/nested-ranges.png", + "bom-ref": "82727654f61306fe", + "name": "/usr/local/cuda-13.4/doc/man/man3/cufile.h.3", "type": "file" }, { - "bom-ref": "df82a38b4286c436", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_sphinx_design_static/design-tabs.js", + "bom-ref": "d17636ec2211acf2", + "name": "/usr/local/cuda-13.4/doc/man/man3/cufileRDMAInfo.3", "type": "file" }, { - "bom-ref": "fb98565d7646faa7", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_sphinx_design_static/sphinx-design.min.css", + "bom-ref": "8a646f59d3c22ff4", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/VERSION", "type": "file" }, { - "bom-ref": "c8b6c78546832366", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/api.css", + "bom-ref": "b7ceb76dd244e344", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_images/config-image.png", "type": "file" }, { - "bom-ref": "01d6ece81fa593c6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/basic.css", + "bom-ref": "5a69399d3474918e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_images/counter-data-image.png", "type": "file" }, { - "bom-ref": "89b0fadb383b0a06", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/custom.css", + "bom-ref": "65d3f74de1988c7d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_images/metrics-tree.png", "type": "file" }, { - "bom-ref": "6e8d7c1ec829f679", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/design-tabs.js", + "bom-ref": "79019075b94f7c6c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_images/nested-ranges.png", "type": "file" }, { - "bom-ref": "5c94da1179277329", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/doctools.js", + "bom-ref": "29a5230cbb357a66", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_sphinx_design_static/design-tabs.js", "type": "file" }, { - "bom-ref": "2e7b269b5ab85d81", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/documentation_options.js", + "bom-ref": "ae045d2664c0827c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_sphinx_design_static/sphinx-design.min.css", "type": "file" }, { - "bom-ref": "ac42b005a71d0119", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/favicon.ico", + "bom-ref": "9e372d15d68cd491", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/api.css", "type": "file" }, { - "bom-ref": "89b3e823a01e4d25", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/favicon.png", + "bom-ref": "e885a6c139ad6462", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/basic.css", "type": "file" }, { - "bom-ref": "0f4e0369203f764d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/file.png", + "bom-ref": "1156dfafab43ebaf", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/custom.css", "type": "file" }, { - "bom-ref": "37cd01e66077da20", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/language_data.js", + "bom-ref": "9ca21ff3d803c556", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/design-tabs.js", "type": "file" }, { - "bom-ref": "541fa0e4ae92ed70", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/lunr-search.js", + "bom-ref": "c39bbfa212bd78bf", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/doctools.js", "type": "file" }, { - "bom-ref": "35cbc8fa7312f839", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/lunr.min.js", + "bom-ref": "9f34b8c052a1406b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/documentation_options.js", "type": "file" }, { - "bom-ref": "6418fd18f38a84b2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/mermaid-init.js", + "bom-ref": "2b21acd6e4638bb1", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/favicon.ico", "type": "file" }, { - "bom-ref": "288e024bc7593444", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/minus.png", + "bom-ref": "4f49642c408c5ed9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/favicon.png", "type": "file" }, { - "bom-ref": "1f8b97aca74cb8ce", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/modal-table.js", + "bom-ref": "c1480016db8eebcf", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/file.png", "type": "file" }, { - "bom-ref": "adf782654e0fed1c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/nvidia-logo-horiz-rgb-1c-blk-for-screen.svg", + "bom-ref": "cbff4e7d9fcc6bf9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/language_data.js", "type": "file" }, { - "bom-ref": "63368f83304b3e62", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/nvidia-logo-horiz-rgb-1c-wht-for-screen.svg", + "bom-ref": "3dbadca454f3b948", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/lunr-search.js", "type": "file" }, { - "bom-ref": "ab914bcb7817f9c6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/nvidia-logo-horiz-rgb-blk-for-screen.svg", + "bom-ref": "ec9661b7397362e7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/lunr.min.js", "type": "file" }, { - "bom-ref": "cb3239fd55d459c5", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/nvidia-logo-horiz-rgb-wht-for-screen.svg", + "bom-ref": "109d36f5e9ec0141", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/mermaid-init.js", "type": "file" }, { - "bom-ref": "9964a242f6af71ca", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/plus.png", + "bom-ref": "169b81ad0fd41d56", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/minus.png", "type": "file" }, { - "bom-ref": "eac1890873bdeb28", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/pygments.css", + "bom-ref": "af67d44fc1516e6a", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/modal-table.js", "type": "file" }, { - "bom-ref": "c30042ec46aecfee", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/scripts/bootstrap.js", + "bom-ref": "f18d16f22e9279d6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/nvidia-logo-horiz-rgb-1c-blk-for-screen.svg", "type": "file" }, { - "bom-ref": "a5f08cbda4577dc5", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/scripts/bootstrap.js.LICENSE.txt", + "bom-ref": "7b80522ed8093f68", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/nvidia-logo-horiz-rgb-1c-wht-for-screen.svg", "type": "file" }, { - "bom-ref": "770bebec4a1dc1b8", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/scripts/bootstrap.js.map", + "bom-ref": "684001c4d53dd4ce", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/nvidia-logo-horiz-rgb-blk-for-screen.svg", "type": "file" }, { - "bom-ref": "dba3c0f1cc57fee8", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/scripts/fontawesome.js", + "bom-ref": "1268474fa543b84f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/nvidia-logo-horiz-rgb-wht-for-screen.svg", "type": "file" }, { - "bom-ref": "8b7974bc8c5af3b1", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/scripts/fontawesome.js.LICENSE.txt", + "bom-ref": "ff869b8d4ab41429", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/plus.png", "type": "file" }, { - "bom-ref": "143a66cea09f00a9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/scripts/fontawesome.js.map", + "bom-ref": "8ce12962e4bef296", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/pygments.css", "type": "file" }, { - "bom-ref": "f8844766aae0ac4c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/scripts/nvidia-sphinx-theme.js", + "bom-ref": "cbb8061e2762b0af", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/scripts/bootstrap.js", "type": "file" }, { - "bom-ref": "2ce5762c0947d6ee", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/scripts/pydata-sphinx-theme.js", + "bom-ref": "b2aa8522abb6bb9d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/scripts/bootstrap.js.LICENSE.txt", "type": "file" }, { - "bom-ref": "74d957617ce3c001", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/scripts/pydata-sphinx-theme.js.map", + "bom-ref": "34332c8aaedd22d1", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/scripts/bootstrap.js.map", "type": "file" }, { - "bom-ref": "3c434e672de089c0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/scrollspy-patch.js", + "bom-ref": "db2896833f646138", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/scripts/fontawesome.js", "type": "file" }, { - "bom-ref": "280e9dfe4f114abd", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/searchtools.js", + "bom-ref": "62dc474274255949", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/scripts/fontawesome.js.LICENSE.txt", "type": "file" }, { - "bom-ref": "d2cfecaa2ebf6453", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/sphinx-design.min.css", + "bom-ref": "420504a9a763642c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/scripts/fontawesome.js.map", "type": "file" }, { - "bom-ref": "0472692910a0cb45", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/sphinx_highlight.js", + "bom-ref": "c8bbc7432807a229", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/scripts/nvidia-sphinx-theme.js", "type": "file" }, { - "bom-ref": "1fa6f2bc93a170d1", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/styles/nvidia-sphinx-theme.css", + "bom-ref": "ac6d9400a6181817", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/scripts/pydata-sphinx-theme.js", "type": "file" }, { - "bom-ref": "417a572ca557b197", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/styles/nvidia-sphinx-theme.css.map", + "bom-ref": "9a38e4b3a8fd49a4", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/scripts/pydata-sphinx-theme.js.map", "type": "file" }, { - "bom-ref": "0c9515fb332735da", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/styles/pydata-sphinx-theme.css", + "bom-ref": "fcf51e77a437c4c6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/scrollspy-patch.js", "type": "file" }, { - "bom-ref": "697b424a74f98a81", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/styles/pydata-sphinx-theme.css.map", + "bom-ref": "b4f408fa0ebd2478", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/searchtools.js", "type": "file" }, { - "bom-ref": "4143e680490784a9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/styles/theme.css", + "bom-ref": "0fe574adb3036bf9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/sphinx-design.min.css", "type": "file" }, { - "bom-ref": "3938c29ea3c56014", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/twemoji.css", + "bom-ref": "5b1e161017957f6f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/sphinx_highlight.js", "type": "file" }, { - "bom-ref": "bf0492bc64649f1a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/twemoji.js", + "bom-ref": "fc177c4670d5f802", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/styles/nvidia-sphinx-theme.css", "type": "file" }, { - "bom-ref": "1f57c841a7eecea8", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf", + "bom-ref": "c2a69a67c879fae6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/styles/nvidia-sphinx-theme.css.map", "type": "file" }, { - "bom-ref": "153cd486fca1045d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2", + "bom-ref": "f82e5c6cb0c1810c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/styles/pydata-sphinx-theme.css", "type": "file" }, { - "bom-ref": "1599390d6567da2a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf", + "bom-ref": "4f5b021356148f20", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/styles/pydata-sphinx-theme.css.map", "type": "file" }, { - "bom-ref": "8d708d502072ed06", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2", + "bom-ref": "f5c060ff2b789613", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/styles/theme.css", "type": "file" }, { - "bom-ref": "3afe03976e217abb", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf", + "bom-ref": "c4a167ea0fd2d1a8", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/twemoji.css", "type": "file" }, { - "bom-ref": "13c6ca4fd2e07b84", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2", + "bom-ref": "ce5f90b3f9f1ab5d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/twemoji.js", "type": "file" }, { - "bom-ref": "0960db7cc9462038", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/version-patch.js", + "bom-ref": "a34befbbe7fb7bc9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf", "type": "file" }, { - "bom-ref": "0c331ed715bd61b6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/_static/webpack-macros.html", + "bom-ref": "431d2e15cba81e69", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2", "type": "file" }, { - "bom-ref": "160f9b46da6d6802", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/data-structures.html", + "bom-ref": "2629a17af8da1a64", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf", "type": "file" }, { - "bom-ref": "8d21e93a317ebe24", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__ACTIVITY__API.html", + "bom-ref": "34e721a88edeafd3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2", "type": "file" }, { - "bom-ref": "8dbfafecaa8ec7c9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__CALLBACK__API.html", + "bom-ref": "2fd150416930137e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf", "type": "file" }, { - "bom-ref": "533ba5a312960b73", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__CHECKPOINT__API.html", + "bom-ref": "e610c80b0ac6371d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2", "type": "file" }, { - "bom-ref": "2f601f8480c14075", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__PCSAMPLING__API.html", + "bom-ref": "735fd77afdaddd29", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/version-patch.js", "type": "file" }, { - "bom-ref": "87c9b87baaa65159", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__PCSAMPLING__UTILITY.html", + "bom-ref": "69f19d885a56d277", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/_static/webpack-macros.html", "type": "file" }, { - "bom-ref": "3e8d33b09e1e7631", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__PM__SAMPLING__API.html", + "bom-ref": "2c81c63359def5e4", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/data-structures.html", "type": "file" }, { - "bom-ref": "72d48321805cf528", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__PROFILER__API.html", + "bom-ref": "54fa1c755a8511a6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__ACTIVITY__API.html", "type": "file" }, { - "bom-ref": "475386573e8b299b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__PROFILER__HOST__API.html", + "bom-ref": "4db5fc69ba43e7f1", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__CALLBACK__API.html", "type": "file" }, { - "bom-ref": "870650ae7766b047", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__RANGE__PROFILER__API.html", + "bom-ref": "8c9d957f11b94508", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__CHECKPOINT__API.html", "type": "file" }, { - "bom-ref": "860629a0e1341103", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__RESULT__API.html", + "bom-ref": "bf19d688bc00640b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__CLOCK__CONTROL__API.html", "type": "file" }, { - "bom-ref": "fc56c08582cfde89", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__SASS__METRICS__API.html", + "bom-ref": "160123f16ab30441", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__PCSAMPLING__API.html", "type": "file" }, { - "bom-ref": "d76c793e5275e5e1", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/group__CUPTI__VERSION__API.html", + "bom-ref": "52031d7bc41c2f8a", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__PCSAMPLING__UTILITY.html", "type": "file" }, { - "bom-ref": "72a90789c8a6df48", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/modules.html", + "bom-ref": "ddcb4261c812d525", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__PM__SAMPLING__API.html", "type": "file" }, { - "bom-ref": "c54a4dc6bbf52d4c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/namespaceCUPTI.html", + "bom-ref": "522fb1d4a8552265", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__PROFILER__API.html", "type": "file" }, { - "bom-ref": "90276b6713b8260d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/namespaceCUPTI_1_1PcSamplingUtil.html", + "bom-ref": "285b341b16b3d444", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__PROFILER__HOST__API.html", "type": "file" }, { - "bom-ref": "85079ca26dd0f57f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/namespaceNV.html", + "bom-ref": "a309751df8f7c458", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__RANGE__PROFILER__API.html", "type": "file" }, { - "bom-ref": "a90dc770143b033b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/namespaceNV_1_1Cupti.html", + "bom-ref": "aa168e804f9a22bb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__RESULT__API.html", "type": "file" }, { - "bom-ref": "ce339c9c4a9e8272", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/namespaceNV_1_1Cupti_1_1Checkpoint.html", + "bom-ref": "cfa04134167d00c5", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__SASS__METRICS__API.html", "type": "file" }, { - "bom-ref": "d79ca5930b69cbad", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/namespaces.html", + "bom-ref": "844353a7290fc431", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/group__CUPTI__VERSION__API.html", "type": "file" }, { - "bom-ref": "531c236647a9080f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1BufferInfo.html", + "bom-ref": "13f18ad8b5ce73a9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/modules.html", "type": "file" }, { - "bom-ref": "802abb3bd5b2e1d6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1CUptiUtil__GetBufferInfoParams.html", + "bom-ref": "bfc0c65436219295", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/namespaceCUPTI.html", "type": "file" }, { - "bom-ref": "7668414d70c71db0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1CUptiUtil__GetHeaderDataParams.html", + "bom-ref": "8ffa059469459255", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/namespaceCUPTI_1_1PcSamplingUtil.html", "type": "file" }, { - "bom-ref": "00065b238fef9ccd", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1CUptiUtil__GetPcSampDataParams.html", + "bom-ref": "b85969cbf530f12d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/namespaceNV.html", "type": "file" }, { - "bom-ref": "9a074f4ee88832c9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1CUptiUtil__MergePcSampDataParams.html", + "bom-ref": "c0f69400d5625a21", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/namespaceNV_1_1Cupti.html", "type": "file" }, { - "bom-ref": "dcb07174f32f2fc8", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1CUptiUtil__PutPcSampDataParams.html", + "bom-ref": "878a0147ec52995b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/namespaceNV_1_1Cupti_1_1Checkpoint.html", "type": "file" }, { - "bom-ref": "0b6cf67ed889eb85", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1Header.html", + "bom-ref": "f78903cbcbaa9f3a", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/namespaces.html", "type": "file" }, { - "bom-ref": "16ef5377beeb588a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1PcSamplingStallReasons.html", + "bom-ref": "194556b065a196de", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1BufferInfo.html", "type": "file" }, { - "bom-ref": "3614bc5a20870ec8", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Activity.html", + "bom-ref": "255d392f172a0265", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1CUptiUtil__GetBufferInfoParams.html", "type": "file" }, { - "bom-ref": "610a93e6ded85070", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityAPI.html", + "bom-ref": "981d1c77bfc5ec0a", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1CUptiUtil__GetHeaderDataParams.html", "type": "file" }, { - "bom-ref": "0d61192995837b9a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityAutoBoostState.html", + "bom-ref": "1db945702e8273e6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1CUptiUtil__GetPcSampDataParams.html", "type": "file" }, { - "bom-ref": "00864b35102392a4", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityBranch.html", + "bom-ref": "9fdf3e99f4d47b6d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1CUptiUtil__MergePcSampDataParams.html", "type": "file" }, { - "bom-ref": "3d6ba5da474303eb", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityBranch2.html", + "bom-ref": "0736ac2f5d90d3ed", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1CUptiUtil__PutPcSampDataParams.html", "type": "file" }, { - "bom-ref": "f7c39bbee3f70a37", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityCdpKernel.html", + "bom-ref": "82d0bd1ac45de021", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1Header.html", "type": "file" }, { - "bom-ref": "423ce3e995fd75a4", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityComputeEngineCtxSwitch.html", + "bom-ref": "2fb2fda9c5b0e96e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUPTI_1_1PcSamplingUtil_1_1PcSamplingStallReasons.html", "type": "file" }, { - "bom-ref": "55d027b6e7af5a00", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityConfidentialComputeRotation.html", + "bom-ref": "36187f7234bfdf63", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Activity.html", "type": "file" }, { - "bom-ref": "e5c3b61ea5541ede", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityConfig.html", + "bom-ref": "65459645104e6e07", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityAPI.html", "type": "file" }, { - "bom-ref": "7769fcf7b95bbe2e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityContext.html", + "bom-ref": "44049232e1feb492", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityApiCbidOptions.html", "type": "file" }, { - "bom-ref": "0a10548fdae7fc3f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityContext2.html", + "bom-ref": "2b5b37dc2c96de61", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityApiOptions.html", "type": "file" }, { - "bom-ref": "b422b7ccbec044ae", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityContext3.html", + "bom-ref": "de97a0809eafb20d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityAutoBoostState.html", "type": "file" }, { - "bom-ref": "efe1da0d18838342", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityContext4.html", + "bom-ref": "9e6553ffc7e71f85", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityBranch.html", "type": "file" }, { - "bom-ref": "297076ea2df6d19a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityCudaEvent.html", + "bom-ref": "75739eb543a1b523", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityBranch2.html", "type": "file" }, { - "bom-ref": "4bdb1ac8da009242", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityCudaEvent2.html", + "bom-ref": "d849fefd29ef8eaa", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityCdpKernel.html", "type": "file" }, { - "bom-ref": "624fcab35ff3f80b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice.html", + "bom-ref": "ba91e185fd26e61c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityComputeEngineCtxSwitch.html", "type": "file" }, { - "bom-ref": "5781ca35d40d7486", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice2.html", + "bom-ref": "19b00970a0d3f02e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityConfidentialComputeRotation.html", "type": "file" }, { - "bom-ref": "2ae7ef6968bf9a93", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice3.html", + "bom-ref": "2bcb0197fdd27570", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityConfig.html", "type": "file" }, { - "bom-ref": "6d5852ee109441d3", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice4.html", + "bom-ref": "2f3d0af4c3a4c0fd", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityContext.html", "type": "file" }, { - "bom-ref": "740121b328dd69fd", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice5.html", + "bom-ref": "dfd43f7be8d68f9b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityContext2.html", "type": "file" }, { - "bom-ref": "e72bd6750215ad06", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice6.html", + "bom-ref": "293e061d28fc7141", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityContext3.html", "type": "file" }, { - "bom-ref": "d3ea23522d39a9c6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityDeviceAttribute.html", + "bom-ref": "528dd48b61f8683e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityContext4.html", "type": "file" }, { - "bom-ref": "89ec479670608b74", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityDeviceGraphTrace.html", + "bom-ref": "e51d5c535cfa2863", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityCudaEvent.html", "type": "file" }, { - "bom-ref": "97dcfabd532dc208", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityEnvironment.html", + "bom-ref": "f1dc395df5df7ea3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityCudaEvent2.html", "type": "file" }, { - "bom-ref": "6b8ce9e982abad6c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityEvent.html", + "bom-ref": "32b033247a209dc3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice.html", "type": "file" }, { - "bom-ref": "6a88338a8085132b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityEventInstance.html", + "bom-ref": "2b83b7108e208e7a", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice2.html", "type": "file" }, { - "bom-ref": "d774729307eecc91", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityExternalCorrelation.html", + "bom-ref": "72f4ea23f5325196", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice3.html", "type": "file" }, { - "bom-ref": "d3992937ddc60d66", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityFieldLayoutEntry.html", + "bom-ref": "3e279eed230d335a", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice4.html", "type": "file" }, { - "bom-ref": "05b769ad7044e106", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityFieldSelection.html", + "bom-ref": "46751b13deb0f6fe", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice5.html", "type": "file" }, { - "bom-ref": "9306b07746374ae6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityFunction.html", + "bom-ref": "662822e64b8c2159", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityDevice6.html", "type": "file" }, { - "bom-ref": "939e6a782bd6ac7a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityGlobalAccess.html", + "bom-ref": "265a11d06dc108c8", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityDeviceAttribute.html", "type": "file" }, { - "bom-ref": "b4ebed6769a07eb1", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityGlobalAccess2.html", + "bom-ref": "c6bc3c3bc82d8abb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityDeviceGraphTrace.html", "type": "file" }, { - "bom-ref": "4afbcfc6c7f400ac", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityGlobalAccess3.html", + "bom-ref": "065a43a17c2b2368", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityEnvironment.html", "type": "file" }, { - "bom-ref": "7b9a32222d901a5e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityGraphHostNode.html", + "bom-ref": "64a3d19d75bc0d28", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityEnvironmentCooling.html", "type": "file" }, { - "bom-ref": "5706ea4a7eb923aa", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityGraphTrace.html", + "bom-ref": "d8b5984b7b20a19b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityEnvironmentPower.html", "type": "file" }, { - "bom-ref": "77f2618cd1eff994", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityGraphTrace2.html", + "bom-ref": "75e86f32babfc4cd", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityEnvironmentSpeed.html", "type": "file" }, { - "bom-ref": "e49164141397d466", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityGreenContext.html", + "bom-ref": "46046829e6252d89", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityEnvironmentTemperature.html", "type": "file" }, { - "bom-ref": "8aa880c3cac60c4b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityGreenContext2.html", + "bom-ref": "070e2f71a5d8edab", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityEvent.html", "type": "file" }, { - "bom-ref": "7825d195718b07e9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityHostLaunch.html", + "bom-ref": "6c6570affe488086", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityEventInstance.html", "type": "file" }, { - "bom-ref": "c29ad43588d33359", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityInstantaneousEvent.html", + "bom-ref": "619fd692e38b30f0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityExternalCorrelation.html", "type": "file" }, { - "bom-ref": "469cec0b33d56587", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityInstantaneousEventInstance.html", + "bom-ref": "8bc5d2b07540648c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityFieldLayoutEntry.html", "type": "file" }, { - "bom-ref": "3d9fb3305a5cdfa1", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityInstantaneousMetric.html", + "bom-ref": "b60505a20b3a1509", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityFieldSelection.html", "type": "file" }, { - "bom-ref": "25a8d5fa20062f0f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityInstantaneousMetricInstance.html", + "bom-ref": "003777308f3896b1", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityFunction.html", "type": "file" }, { - "bom-ref": "c6b7fe80eae8577f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityInstructionCorrelation.html", + "bom-ref": "acf4a796b5662217", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityGlobalAccess.html", "type": "file" }, { - "bom-ref": "3490c31469ecc453", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityInstructionExecution.html", + "bom-ref": "980dd0cd230ece28", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityGlobalAccess2.html", "type": "file" }, { - "bom-ref": "b77ba1ad8c4ef56e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityJit.html", + "bom-ref": "1af205b4159a91de", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityGlobalAccess3.html", "type": "file" }, { - "bom-ref": "abe4fa50cae83110", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityJit2.html", + "bom-ref": "33af24bc0e1588e3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityGraphHostNode.html", "type": "file" }, { - "bom-ref": "ba31d4fdce3a6dc2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel.html", + "bom-ref": "46f1c51f2aee0724", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityGraphTrace.html", "type": "file" }, { - "bom-ref": "f091d0bf0058d129", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel10.html", + "bom-ref": "86119dcb7f5ccba3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityGraphTrace2.html", "type": "file" }, { - "bom-ref": "f5479bca562786e2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel11.html", + "bom-ref": "85ff93c3f15dd2d1", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityGreenContext.html", "type": "file" }, { - "bom-ref": "143783ca1f2bafa9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel2.html", + "bom-ref": "9ae7e04fe5a821ea", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityGreenContext2.html", "type": "file" }, { - "bom-ref": "4ad2b02f787657c2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel3.html", + "bom-ref": "d27d6b8468f63015", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityGreenContext3.html", "type": "file" }, { - "bom-ref": "20a54649b87011a1", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel4.html", + "bom-ref": "d251331c84608244", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityHostLaunch.html", "type": "file" }, { - "bom-ref": "13c9341f1ea1ca52", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel5.html", + "bom-ref": "6f5f9ca657351d68", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityInstantaneousEvent.html", "type": "file" }, { - "bom-ref": "df773e327ca21791", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel6.html", + "bom-ref": "c729aa45d738cca3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityInstantaneousEventInstance.html", "type": "file" }, { - "bom-ref": "5bd5df7c7d09da8e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel7.html", + "bom-ref": "12f5cde1489ba3d5", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityInstantaneousMetric.html", "type": "file" }, { - "bom-ref": "73eefd80ead915fb", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel8.html", + "bom-ref": "0fe18bfa805ebb50", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityInstantaneousMetricInstance.html", "type": "file" }, { - "bom-ref": "bdccc74e9f64b04b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel9.html", + "bom-ref": "dcf704d9aa7bc34c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityInstructionCorrelation.html", "type": "file" }, { - "bom-ref": "f0029f5ea695525e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMarker.html", + "bom-ref": "43fbb830d9032b82", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityInstructionExecution.html", "type": "file" }, { - "bom-ref": "b54be6aee8d0a232", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMarker2.html", + "bom-ref": "2476428344841b36", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityJit.html", "type": "file" }, { - "bom-ref": "54359dd793403f0a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMarkerData.html", + "bom-ref": "9c861cf3d9211928", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityJit2.html", "type": "file" }, { - "bom-ref": "79ba23fabe891804", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMarkerData2.html", + "bom-ref": "469a12990c7a27eb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel.html", "type": "file" }, { - "bom-ref": "1c1efcd7c76fdad7", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemDecompress.html", + "bom-ref": "f8d5e9eee632579d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel10.html", "type": "file" }, { - "bom-ref": "8263f482e28fc144", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy.html", + "bom-ref": "c0b4798a18af63af", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel11.html", "type": "file" }, { - "bom-ref": "c1e2f317a1e86a1d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy3.html", + "bom-ref": "b92e28a73ccbc9ba", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel12.html", "type": "file" }, { - "bom-ref": "b0c955d319ec7ba0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy4.html", + "bom-ref": "76ceeaa93d364abe", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel13.html", "type": "file" }, { - "bom-ref": "8c2dc14343622774", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy5.html", + "bom-ref": "386829b1d8f5dda5", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel2.html", "type": "file" }, { - "bom-ref": "a51bc906e0a392ee", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy6.html", + "bom-ref": "f8f2a1934a152598", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel3.html", "type": "file" }, { - "bom-ref": "8caa6ef762518c3b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpyPtoP.html", + "bom-ref": "8e4b4d94e9b23104", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel4.html", "type": "file" }, { - "bom-ref": "be6309e7bf73bb73", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpyPtoP2.html", + "bom-ref": "1de2b072be9b3ec2", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel5.html", "type": "file" }, { - "bom-ref": "295306bd442b1959", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpyPtoP3.html", + "bom-ref": "f76f8ab46671faba", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel6.html", "type": "file" }, { - "bom-ref": "2fa32a1ed29d727e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpyPtoP4.html", + "bom-ref": "43ef704f9ceb3997", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel7.html", "type": "file" }, { - "bom-ref": "1dcd50c6c8275b10", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemory.html", + "bom-ref": "6feac140cd06cb84", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel8.html", "type": "file" }, { - "bom-ref": "b4c43dae3dcd9769", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemory2.html", + "bom-ref": "774c49f3588acfb1", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityKernel9.html", "type": "file" }, { - "bom-ref": "4338370a71a86b47", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemory3.html", + "bom-ref": "1fb8d77e2d6c1077", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMarker.html", "type": "file" }, { - "bom-ref": "c5792eecf4ff8b3c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemory4.html", + "bom-ref": "fbbf44c0de8cade0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMarker2.html", "type": "file" }, { - "bom-ref": "6f218259650156d2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemoryPool.html", + "bom-ref": "b5ff93501fd12de4", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMarkerData.html", "type": "file" }, { - "bom-ref": "a28ff14f94306731", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemoryPool2.html", + "bom-ref": "39da05585a5420fb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMarkerData2.html", "type": "file" }, { - "bom-ref": "ea351d7bd3fa7d34", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemoryPool3.html", + "bom-ref": "aa50315d61ebce6c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemDecompress.html", "type": "file" }, { - "bom-ref": "d638672099680d84", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemset.html", + "bom-ref": "067d97ffac6a0f20", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy.html", "type": "file" }, { - "bom-ref": "cec02283aac214e1", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemset2.html", + "bom-ref": "870221e179e25d4b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy3.html", "type": "file" }, { - "bom-ref": "5515ac9ed74957f7", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemset3.html", + "bom-ref": "41010bd8b4c4e450", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy4.html", "type": "file" }, { - "bom-ref": "4ce686d1b59706cc", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMemset4.html", + "bom-ref": "b6d570b8b21d49c2", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy5.html", "type": "file" }, { - "bom-ref": "6b851e3b96393520", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMetric.html", + "bom-ref": "756baf3ee349110c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy6.html", "type": "file" }, { - "bom-ref": "edf3dc0881f65515", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityMetricInstance.html", + "bom-ref": "6232799c74704ccb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpy7.html", "type": "file" }, { - "bom-ref": "11d0e84658b16399", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityModule.html", + "bom-ref": "0379b666402eeabf", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpyPtoP.html", "type": "file" }, { - "bom-ref": "96fbeef21fb289af", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityName.html", + "bom-ref": "6d2017b41e5b01a2", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpyPtoP2.html", "type": "file" }, { - "bom-ref": "dcc151b5766571ca", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLink.html", + "bom-ref": "c65b0316776c3d52", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpyPtoP3.html", "type": "file" }, { - "bom-ref": "3b802b865f73dc88", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLink2.html", + "bom-ref": "35d00f582a5d90e7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemcpyPtoP4.html", "type": "file" }, { - "bom-ref": "6576d9be87aa6a40", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLink3.html", + "bom-ref": "95c08094e548f1b4", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemory.html", "type": "file" }, { - "bom-ref": "b076190bc1d27f50", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLink4.html", + "bom-ref": "8d8ec7d05ee75d2f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemory2.html", "type": "file" }, { - "bom-ref": "bc09dd2e0d5003f7", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLink5.html", + "bom-ref": "b21fc73b7bca83e5", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemory3.html", "type": "file" }, { - "bom-ref": "e9a98fd69b893b89", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityOpenAcc.html", + "bom-ref": "e3b58ad2da6da62f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemory4.html", "type": "file" }, { - "bom-ref": "7feee9e8d9aebe84", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityOpenAccData.html", + "bom-ref": "d50a84d2fd2ab62d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemoryPool.html", "type": "file" }, { - "bom-ref": "aa3b6bc6d2530706", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityOpenAccLaunch.html", + "bom-ref": "7392cc910533b5bd", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemoryPool2.html", "type": "file" }, { - "bom-ref": "9a3be93bdae1caa8", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityOpenAccOther.html", + "bom-ref": "e6dc0acf705b49eb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemoryPool3.html", "type": "file" }, { - "bom-ref": "cd08f2766e84d085", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityOpenMp.html", + "bom-ref": "fec61f29e9b6c358", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemset.html", "type": "file" }, { - "bom-ref": "c11f740b2736bfed", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityOverhead.html", + "bom-ref": "4dbb069aad482682", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemset2.html", "type": "file" }, { - "bom-ref": "74fe4cf4ee0261ce", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityOverhead2.html", + "bom-ref": "e09f957d018899e5", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemset3.html", "type": "file" }, { - "bom-ref": "33bc53705ec3fbf7", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityOverhead3.html", + "bom-ref": "7a4b76a7776126bc", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemset4.html", "type": "file" }, { - "bom-ref": "e3f3376b0bc6aeaf", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityOverheadCommandBufferFullData.html", + "bom-ref": "2cbf2e8a4f75ca80", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMemset5.html", "type": "file" }, { - "bom-ref": "8bf7ef91a0380f39", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityPCSampling.html", + "bom-ref": "9232c7500c903ec7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMetric.html", "type": "file" }, { - "bom-ref": "39f356de9c69a703", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityPCSampling2.html", + "bom-ref": "08e7666892d2f7ec", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityMetricInstance.html", "type": "file" }, { - "bom-ref": "cb073dbd4f9d4a9e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityPCSampling3.html", + "bom-ref": "2fec17fea54cfa8e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityModule.html", "type": "file" }, { - "bom-ref": "0f053c9e9363f8ad", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityPCSamplingConfig.html", + "bom-ref": "d196016c5b45d0c7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityName.html", "type": "file" }, { - "bom-ref": "5a54c38eb745a042", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityPCSamplingRecordInfo.html", + "bom-ref": "81495f25236063e2", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLink.html", "type": "file" }, { - "bom-ref": "10028de6dbd26d9f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityPcie.html", + "bom-ref": "78e565e0674c4558", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLink2.html", "type": "file" }, { - "bom-ref": "045264dbd6520ab4", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityPreemption.html", + "bom-ref": "1248175ddc659418", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLink3.html", "type": "file" }, { - "bom-ref": "df1ede945a819f56", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityRecordLayout.html", + "bom-ref": "cc2037ef86201da9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLink4.html", "type": "file" }, { - "bom-ref": "d13fbf7853b440a1", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivitySharedAccess.html", + "bom-ref": "59a28cedf545baa2", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLink5.html", "type": "file" }, { - "bom-ref": "2e2857358916a793", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivitySourceLocator.html", + "bom-ref": "41ebde17a40ea36b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityNvLinkNpu.html", "type": "file" }, { - "bom-ref": "eb50eb1e339dc639", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityStream.html", + "bom-ref": "6dbb9c339fb5948c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityOpenAcc.html", "type": "file" }, { - "bom-ref": "177e0d295b4b5b4e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivitySynchronization.html", + "bom-ref": "cb501ba3d8d9d6ee", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityOpenAccData.html", "type": "file" }, { - "bom-ref": "ca83d8bdcc325787", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivitySynchronization2.html", + "bom-ref": "4a3afdabcb38ca1c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityOpenAccLaunch.html", "type": "file" }, { - "bom-ref": "e177777e651c5415", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityUnifiedMemoryCounter.html", + "bom-ref": "1ce3780e03e71025", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityOpenAccOther.html", "type": "file" }, { - "bom-ref": "cad3c8b345f4bace", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityUnifiedMemoryCounter2.html", + "bom-ref": "8ddebc8cd243e47b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityOpenMp.html", "type": "file" }, { - "bom-ref": "9ddeb3fa2650fa33", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityUnifiedMemoryCounter3.html", + "bom-ref": "1157009ab5dbd316", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityOverhead.html", "type": "file" }, { - "bom-ref": "9d51c178034c260c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ActivityUnifiedMemoryCounterConfig.html", + "bom-ref": "4cfca5da8e2965f2", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityOverhead2.html", "type": "file" }, { - "bom-ref": "ef530ed137870364", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__BufferCallbackCompleteInfo.html", + "bom-ref": "4413fa74a639c484", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityOverhead3.html", "type": "file" }, { - "bom-ref": "82322131d2106d4b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__BufferCallbackRequestInfo.html", + "bom-ref": "3eeb8d1067331174", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityOverheadCommandBufferFullData.html", "type": "file" }, { - "bom-ref": "3e39d10d2a57b8fd", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__CallbackData.html", + "bom-ref": "62b6cebf868b1afa", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityPCSampling.html", "type": "file" }, { - "bom-ref": "80ea26864dcac550", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__GetCubinCrcParams.html", + "bom-ref": "8189395ad6950276", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityPCSampling2.html", "type": "file" }, { - "bom-ref": "39f9df9e7f17935e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__GetSassToSourceCorrelationParams.html", + "bom-ref": "04fd532391d8d1cd", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityPCSampling3.html", "type": "file" }, { - "bom-ref": "f13d56fb11b546c4", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__GraphData.html", + "bom-ref": "0ccc943ed805d11c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityPCSamplingConfig.html", "type": "file" }, { - "bom-ref": "040781d2e485b8b3", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ModuleResourceData.html", + "bom-ref": "c037dfa6104ccdce", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityPCSamplingRecordInfo.html", "type": "file" }, { - "bom-ref": "a7030c1e3a956f04", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__NvtxData.html", + "bom-ref": "dbe8527bd70a4934", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityPcie.html", "type": "file" }, { - "bom-ref": "773320be55757e08", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__NvtxExtPayloadAttr.html", + "bom-ref": "258101407e8b9f83", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityPcieBridgeAttr.html", "type": "file" }, { - "bom-ref": "a3466b45447fefc9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingConfigurationInfo.html", + "bom-ref": "ebe3c7ee4e3782d8", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityPcieGpuAttr.html", "type": "file" }, { - "bom-ref": "aacaabf6fe75f005", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingConfigurationInfoParams.html", + "bom-ref": "8e80a6e6a1e59d2e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityPreemption.html", "type": "file" }, { - "bom-ref": "39724f598feea8e5", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingData.html", + "bom-ref": "fbc381cb9f204772", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityRecordLayout.html", "type": "file" }, { - "bom-ref": "3c83d0373cedf120", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingDisableParams.html", + "bom-ref": "30755ae13483b9e2", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivitySharedAccess.html", "type": "file" }, { - "bom-ref": "1fe397b7b47a599c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingEnableParams.html", + "bom-ref": "9a15fafc444f3ffe", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivitySourceLocator.html", "type": "file" }, { - "bom-ref": "1a57478ceb17e6cf", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingGetDataParams.html", + "bom-ref": "ed9698328b1657e3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityStream.html", "type": "file" }, { - "bom-ref": "05d9e45653d0980c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingGetNumStallReasonsParams.html", + "bom-ref": "abfe6150a16eba94", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivitySynchronization.html", "type": "file" }, { - "bom-ref": "91d7f57850115077", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingGetStallReasonsParams.html", + "bom-ref": "ba91ff582bed2117", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivitySynchronization2.html", "type": "file" }, { - "bom-ref": "d01b1833b58b8041", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingPCData.html", + "bom-ref": "0b9c74efcb1e4ec8", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityUnifiedMemoryCounter.html", "type": "file" }, { - "bom-ref": "fb9e377f06637243", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingStallReason.html", + "bom-ref": "74d76a8f3136a5f4", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityUnifiedMemoryCounter2.html", "type": "file" }, { - "bom-ref": "6510fcd73f4bc880", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingStartParams.html", + "bom-ref": "173420cdb1c2a81b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityUnifiedMemoryCounter3.html", "type": "file" }, { - "bom-ref": "a2232671f3af9c1e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PCSamplingStopParams.html", + "bom-ref": "a13edc9678efc15f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ActivityUnifiedMemoryCounterConfig.html", "type": "file" }, { - "bom-ref": "41d4b4f939fe513d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__CounterDataImage__Initialize__Params.html", + "bom-ref": "e2563ed8f7cd9651", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__BufferCallbackCompleteInfo.html", "type": "file" }, { - "bom-ref": "8b2c33f8bb2a3089", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__CounterData__GetSampleInfo__Params.html", + "bom-ref": "8cd2a5922f49031f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__BufferCallbackRequestInfo.html", "type": "file" }, { - "bom-ref": "963b97a3b14e1dd2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__DecodeData__Params.html", + "bom-ref": "3c48948ed5728ac7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__CallbackData.html", "type": "file" }, { - "bom-ref": "4616eeb5d1b6309e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__Disable__Params.html", + "bom-ref": "8395c372f6a817a4", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__GetCubinCrcParams.html", "type": "file" }, { - "bom-ref": "bb9600037b893ac2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__Enable__Params.html", + "bom-ref": "009dafa5fef2a124", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__GetSassToSourceCorrelationParams.html", "type": "file" }, { - "bom-ref": "82acf37f0fe2fe46", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__GetCounterAvailability__Params.html", + "bom-ref": "fbe71483c15a8990", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__GraphData.html", "type": "file" }, { - "bom-ref": "ec0e8a92019f93f0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__GetCounterDataInfo__Params.html", + "bom-ref": "9ac85188c4b1ac35", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ModuleResourceData.html", "type": "file" }, { - "bom-ref": "5a702c5e5b275d2d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__GetCounterDataSize__Params.html", + "bom-ref": "bca218bf9e2e1005", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__NvtxData.html", "type": "file" }, { - "bom-ref": "417e2b625adfa5a2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__SetConfig__Params.html", + "bom-ref": "02ffcb5d981491a1", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__NvtxExtPayloadAttr.html", "type": "file" }, { - "bom-ref": "42b124c5ebd75c40", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__Start__Params.html", + "bom-ref": "18a5afe50cbf25c4", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingConfigurationInfo.html", "type": "file" }, { - "bom-ref": "f270f60ee0ef334e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__PmSampling__Stop__Params.html", + "bom-ref": "18181a4a9173956a", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingConfigurationInfoParams.html", "type": "file" }, { - "bom-ref": "011be03992271b43", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__BeginPass__Params.html", + "bom-ref": "5594ab10c7c4f7da", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingData.html", "type": "file" }, { - "bom-ref": "a5448d2eed93bbd7", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__BeginSession__Params.html", + "bom-ref": "8de3e4556750305c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingDisableParams.html", "type": "file" }, { - "bom-ref": "d64b9b92f5d27dee", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__CounterDataImageOptions.html", + "bom-ref": "f7dc7cfa8155d1cb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingEnableParams.html", "type": "file" }, { - "bom-ref": "c93167ed3da19eb1", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__CounterDataImage__CalculateScratchBufferSize__Params.html", + "bom-ref": "7e9d03f063923858", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingGetDataParams.html", "type": "file" }, { - "bom-ref": "3aa98270f4808baf", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__CounterDataImage__CalculateSize__Params.html", + "bom-ref": "af98edf220aa47dc", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingGetNumStallReasonsParams.html", "type": "file" }, { - "bom-ref": "e8cc627b8eee75e7", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__CounterDataImage__InitializeScratchBuffer__Params.html", + "bom-ref": "8639c60776dcb658", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingGetStallReasonsParams.html", "type": "file" }, { - "bom-ref": "ca1c1155792d4925", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__CounterDataImage__Initialize__Params.html", + "bom-ref": "6a9689d876f6e425", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingPCData.html", "type": "file" }, { - "bom-ref": "b1459056fa838f75", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__DeInitialize__Params.html", + "bom-ref": "d8110324c4a24556", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingStallReason.html", "type": "file" }, { - "bom-ref": "f0d062892f1bfc68", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__DeviceSupported__Params.html", + "bom-ref": "45a6ae7cd100bfb6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingStartParams.html", "type": "file" }, { - "bom-ref": "2a2c2e481cd4fc6b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__DisableProfiling__Params.html", + "bom-ref": "9dbf5e51e0fec065", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PCSamplingStopParams.html", "type": "file" }, { - "bom-ref": "be44711d488ce07b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__EnableProfiling__Params.html", + "bom-ref": "3872c9ea653114ff", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__CounterDataImage__Initialize__Params.html", "type": "file" }, { - "bom-ref": "97e5fe4bc0f193f5", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__EndPass__Params.html", + "bom-ref": "fa6239b258b9a64d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__CounterData__GetSampleInfo__Params.html", "type": "file" }, { - "bom-ref": "839d2db0794a84b2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__EndSession__Params.html", + "bom-ref": "e17575c923311dbc", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__DecodeData__Params.html", "type": "file" }, { - "bom-ref": "1d0abde02caff20d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__FlushCounterData__Params.html", + "bom-ref": "58260f17b46a8c94", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__Disable__Params.html", "type": "file" }, { - "bom-ref": "027129c72f42d609", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__GetCounterAvailability__Params.html", + "bom-ref": "761fa85621df272d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__Enable__Params.html", "type": "file" }, { - "bom-ref": "bb9161560ffb86ce", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__ConfigAddMetrics__Params.html", + "bom-ref": "e6f2deddf16a3dc7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__GetCounterAvailability__Params.html", "type": "file" }, { - "bom-ref": "9196d6c76fb365db", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__Deinitialize__Params.html", + "bom-ref": "ce69256a5ed76607", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__GetCounterDataInfo__Params.html", "type": "file" }, { - "bom-ref": "01fb19313b135067", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__EvaluateToGpuValues__Params.html", + "bom-ref": "f29555e4103536a0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__GetCounterDataSize__Params.html", "type": "file" }, { - "bom-ref": "2760bc3de03430d5", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetBaseMetrics__Params.html", + "bom-ref": "94fa6d3fedb73386", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__SetConfig__Params.html", "type": "file" }, { - "bom-ref": "f9fd99d85166d029", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetConfigImageSize__Params.html", + "bom-ref": "9f233a469eaaf27b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__Start__Params.html", "type": "file" }, { - "bom-ref": "525ca8d5db6f0935", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetConfigImage__Params.html", + "bom-ref": "c5afc89c802c33be", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__PmSampling__Stop__Params.html", "type": "file" }, { - "bom-ref": "b54e7854f6c59887", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetMaxNumHardwareMetricsPerPass__Params.html", + "bom-ref": "121118006847e8f9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__BeginPass__Params.html", "type": "file" }, { - "bom-ref": "bcc35fdbed8c9aa0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetMetricProperties__Params.html", + "bom-ref": "e63efb22c4a3d824", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__BeginSession__Params.html", "type": "file" }, { - "bom-ref": "30f986b1d1b76eaf", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetMetricsInSinglePassSet__Params.html", + "bom-ref": "89d273f0f80266bf", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__CounterDataImageOptions.html", "type": "file" }, { - "bom-ref": "14c192a706c9f679", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetNumOfPasses__Params.html", + "bom-ref": "6d4729a15fa7309c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__CounterDataImage__CalculateScratchBufferSize__Params.html", "type": "file" }, { - "bom-ref": "04b486da42870976", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetRangeName__Params.html", + "bom-ref": "5387bf3655b7f49d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__CounterDataImage__CalculateSize__Params.html", "type": "file" }, { - "bom-ref": "667172b10a04375d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetSinglePassSets__Params.html", + "bom-ref": "8506c16a0d353360", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__CounterDataImage__InitializeScratchBuffer__Params.html", "type": "file" }, { - "bom-ref": "08e65c17e54e049e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetSubMetrics__Params.html", + "bom-ref": "db4eabe771a38b18", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__CounterDataImage__Initialize__Params.html", "type": "file" }, { - "bom-ref": "df098fd3c414073d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetSupportedChips__Params.html", + "bom-ref": "bf89b18f56eb0ca1", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__DeInitialize__Params.html", "type": "file" }, { - "bom-ref": "a6b8672a7d303d56", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__Initialize__Params.html", + "bom-ref": "b5c5bc6767e32606", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__DeviceSupported__Params.html", "type": "file" }, { - "bom-ref": "b33c8535caca9f64", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__Initialize__Params.html", + "bom-ref": "7184b59582299169", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__DisableProfiling__Params.html", "type": "file" }, { - "bom-ref": "a9215b6c2c4b6039", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__IsPassCollected__Params.html", + "bom-ref": "39ebe03fe9d69864", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__EnableProfiling__Params.html", "type": "file" }, { - "bom-ref": "42e5de1bff6146c2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__PopRange__Params.html", + "bom-ref": "e097013fa52d97fd", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__EndPass__Params.html", "type": "file" }, { - "bom-ref": "05c806f00de2e5e5", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__PushRange__Params.html", + "bom-ref": "8915b4378337b90c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__EndSession__Params.html", "type": "file" }, { - "bom-ref": "f25f69e6254c7683", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__SetConfig__Params.html", + "bom-ref": "83f0fe395fefa245", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__FlushCounterData__Params.html", "type": "file" }, { - "bom-ref": "da18f147e655763e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__Profiler__UnsetConfig__Params.html", + "bom-ref": "6fd6b91bb3a0b52d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__GetCounterAvailability__Params.html", "type": "file" }, { - "bom-ref": "ad6c54157590aa01", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__CounterDataImage__Initialize__Params.html", + "bom-ref": "e3b5126c20fb6ac0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__ConfigAddMetrics__Params.html", "type": "file" }, { - "bom-ref": "9fc2253fcd62a694", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__CounterData__GetRangeInfo__Params.html", + "bom-ref": "f1bde66c62c904b3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__Deinitialize__Params.html", "type": "file" }, { - "bom-ref": "fdfcbfdcd835505c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__DecodeData__Params.html", + "bom-ref": "1427fa61a85ad449", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__EvaluateToGpuValues__Params.html", "type": "file" }, { - "bom-ref": "ef2ba0ac87142e4f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__Disable__Params.html", + "bom-ref": "9c97901e95b433a9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetBaseMetrics__Params.html", "type": "file" }, { - "bom-ref": "cae7dc867e5befe9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__Enable__Params.html", + "bom-ref": "ef68bf7e20baed80", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetConfigImageSize__Params.html", "type": "file" }, { - "bom-ref": "f0eeddb9c70b65c9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__GetCounterDataInfo__Params.html", + "bom-ref": "b60297547ff9d2b7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetConfigImage__Params.html", "type": "file" }, { - "bom-ref": "0301bd8a2b5379a0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__GetCounterDataSize__Params.html", + "bom-ref": "4662925c3f42b09f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetMaxNumHardwareMetricsPerPass__Params.html", "type": "file" }, { - "bom-ref": "a787be474cc73dd0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__PopRange__Params.html", + "bom-ref": "6005494e13cbd938", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetMetricProperties__Params.html", "type": "file" }, { - "bom-ref": "de120f6ff51d1f32", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__PushRange__Params.html", + "bom-ref": "e10cddf63d279a22", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetMetricsInSinglePassSet__Params.html", "type": "file" }, { - "bom-ref": "5520958dd79f3a8e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__SetConfig__Params.html", + "bom-ref": "09d6ad4d928a6ddd", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetNumOfPasses__Params.html", "type": "file" }, { - "bom-ref": "9eb9720f832c7eb0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__Start__Params.html", + "bom-ref": "cc615dca763098bb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetRangeName__Params.html", "type": "file" }, { - "bom-ref": "431e89add085f0bf", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__Stop__Params.html", + "bom-ref": "8b1d9c5b2e2cf84d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetSinglePassSets__Params.html", "type": "file" }, { - "bom-ref": "905ce116034d3970", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__ResourceData.html", + "bom-ref": "7d70af083dfc3cd3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetSubMetrics__Params.html", "type": "file" }, { - "bom-ref": "15e20d6c26ced82f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetricsDisable__Params.html", + "bom-ref": "ea019553651aa418", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__GetSupportedChips__Params.html", "type": "file" }, { - "bom-ref": "a19a231865feb9b1", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetricsEnable__Params.html", + "bom-ref": "c323cf2c9adec32f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__Initialize__Params.html", "type": "file" }, { - "bom-ref": "1c876e6ab749f838", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetricsFlushData__Params.html", + "bom-ref": "be8cde862e01e4b6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Host__SetDevicePartitionInfo__Params.html", "type": "file" }, { - "bom-ref": "4c834f13918325a3", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetricsGetDataProperties__Params.html", + "bom-ref": "d414b51e21fcb261", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__Initialize__Params.html", "type": "file" }, { - "bom-ref": "fd7a73aa18b1d4ef", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetricsSetConfig__Params.html", + "bom-ref": "40a2c0242f7da855", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__IsPassCollected__Params.html", "type": "file" }, { - "bom-ref": "8bfc39bfbeff0699", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetricsUnsetConfig__Params.html", + "bom-ref": "5ae1326afe978e15", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__PopRange__Params.html", "type": "file" }, { - "bom-ref": "5ec2b79095158d62", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__Config.html", + "bom-ref": "f49852394d979e75", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__PushRange__Params.html", "type": "file" }, { - "bom-ref": "dc86babc61c93a54", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__Data.html", + "bom-ref": "8198ec79a40157e1", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__SetConfig__Params.html", "type": "file" }, { - "bom-ref": "c7fbeebf724c18d3", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__GetMetrics__Params.html", + "bom-ref": "a2effce613e7f595", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__Profiler__UnsetConfig__Params.html", "type": "file" }, { - "bom-ref": "f0f6b3bc975e2068", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__GetNumOfMetrics__Params.html", + "bom-ref": "10222ad3a97aa206", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__CounterDataImage__Initialize__Params.html", "type": "file" }, { - "bom-ref": "0fbc6bb94d8f8f60", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__GetProperties__Params.html", + "bom-ref": "8b79a50e780e8b56", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__CounterData__GetRangeInfo__Params.html", "type": "file" }, { - "bom-ref": "dbb9d6d1d4b430a2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__InstanceValue.html", + "bom-ref": "9333fb06302e5633", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__DecodeData__Params.html", "type": "file" }, { - "bom-ref": "115323ab9d5c6388", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__MetricDetails.html", + "bom-ref": "18c5653685ec24f3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__Disable__Params.html", "type": "file" }, { - "bom-ref": "094fb2529efd1566", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__StateData.html", + "bom-ref": "e1caa050bc2cb847", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__Enable__Params.html", "type": "file" }, { - "bom-ref": "8f3930824976c37e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__StreamAttrData.html", + "bom-ref": "8d40861b61b90dcf", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__GetCounterDataInfo__Params.html", "type": "file" }, { - "bom-ref": "fa188e46f9d8c2b6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SubscriberParams.html", + "bom-ref": "509586d86db83d1d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__GetCounterDataSize__Params.html", "type": "file" }, { - "bom-ref": "684912ee908e0898", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structCUpti__SynchronizeData.html", + "bom-ref": "bb5f3b9333b5eb83", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__GetDevicePartitionInfo__Params.html", "type": "file" }, { - "bom-ref": "33b849254256cbd9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/structNV_1_1Cupti_1_1Checkpoint_1_1CUpti__Checkpoint.html", + "bom-ref": "15c31f13b5a9da28", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__PopRange__Params.html", "type": "file" }, { - "bom-ref": "3a8ba633c07a1f03", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/api/unionCUpti__ActivityObjectKindId.html", + "bom-ref": "e18c0b245aa9b3d1", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__PushRange__Params.html", "type": "file" }, { - "bom-ref": "a156e31b79bdce07", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/copyright-and-licenses/index.html", + "bom-ref": "9c1a7f1c636348a3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__SetConfig__Params.html", "type": "file" }, { - "bom-ref": "f5a078d6a060c205", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/genindex.html", + "bom-ref": "63514612dfc8d3a0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__Start__Params.html", "type": "file" }, { - "bom-ref": "36b7c57b90ef96d3", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/index.html", + "bom-ref": "fbf0849d5fd7c2a0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__RangeProfiler__Stop__Params.html", "type": "file" }, { - "bom-ref": "38376e2e36794778", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/library-support/library-support.html", + "bom-ref": "426298c7a17a36c8", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__ResourceData.html", "type": "file" }, { - "bom-ref": "1dc05e2479da47d8", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/main/main.html", + "bom-ref": "67316c455a21db73", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetricsDisable__Params.html", "type": "file" }, { - "bom-ref": "f35a5bbfd05c2cb6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/notices-header/notices-header.html", + "bom-ref": "6deba1e010027267", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetricsEnable__Params.html", "type": "file" }, { - "bom-ref": "dbb966ed592e2816", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/objects.inv", + "bom-ref": "22e91f899dfb9693", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetricsFlushData__Params.html", "type": "file" }, { - "bom-ref": "11acc813280368e0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/project.json", + "bom-ref": "2a3c77b12f870aa6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetricsGetDataProperties__Params.html", "type": "file" }, { - "bom-ref": "b601881112674db0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/release-notes/release-notes.html", + "bom-ref": "fb7fb0dd4f970caf", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetricsSetConfig__Params.html", "type": "file" }, { - "bom-ref": "eec733ed7101b79b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/search.html", + "bom-ref": "3e95a33b8f0c7254", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetricsUnsetConfig__Params.html", "type": "file" }, { - "bom-ref": "84bb357e742e6b68", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/searchindex.js", + "bom-ref": "08252c8762cc0169", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__Config.html", "type": "file" }, { - "bom-ref": "b09bdf44e486bcd6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/special-configurations/special-configurations.html", + "bom-ref": "f838bc4d6cc34d86", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__Data.html", "type": "file" }, { - "bom-ref": "53f552d4dd74036a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/doc/html/tutorial/tutorial.html", + "bom-ref": "548ca71745755d08", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__GetMetrics__Params.html", "type": "file" }, { - "bom-ref": "22d9a1ddfe642f9e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/activity_trace_async/Makefile", + "bom-ref": "e34ee066f0718ca5", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__GetNumOfMetrics__Params.html", "type": "file" }, { - "bom-ref": "a9f2fb9dd6b14da8", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/activity_trace_async/activity_trace_async.cu", + "bom-ref": "67c972133e846f03", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__GetProperties__Params.html", "type": "file" }, { - "bom-ref": "a6bf536541ee381d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/autorange_profiling/Makefile", + "bom-ref": "cb7376fd35f1e88e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__InstanceValue.html", "type": "file" }, { - "bom-ref": "e96734860836ab71", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/autorange_profiling/auto_range_profiling.cu", + "bom-ref": "42165cded2174ac0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SassMetrics__MetricDetails.html", "type": "file" }, { - "bom-ref": "fb7b133fd03d95d0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/callback_profiling/Makefile", + "bom-ref": "5780bf68f309cd69", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__StateData.html", "type": "file" }, { - "bom-ref": "5403e75d330fbde0", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/callback_profiling/callback_profiling.cu", + "bom-ref": "7d02272c8203eace", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__StreamAttrData.html", "type": "file" }, { - "bom-ref": "1706e66c0f17932b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/callback_timestamp/Makefile", + "bom-ref": "98c98460448ac1aa", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SubscriberParams.html", "type": "file" }, { - "bom-ref": "cad970eb853671be", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/callback_timestamp/callback_timestamp.cu", + "bom-ref": "823dd043da9ba08e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structCUpti__SynchronizeData.html", "type": "file" }, { - "bom-ref": "7948eba1a619773b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/checkpoint_kernels/Makefile", + "bom-ref": "7e9cb2c33d193383", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/structNV_1_1Cupti_1_1Checkpoint_1_1CUpti__Checkpoint.html", "type": "file" }, { - "bom-ref": "ed8260e13f048c53", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/checkpoint_kernels/checkpoint_kernels.cu", + "bom-ref": "86d22ec2d5d572fe", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/api/unionCUpti__ActivityObjectKindId.html", "type": "file" }, { - "bom-ref": "879ffcd3bc26f440", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/command_line_parser_util.h", + "bom-ref": "11bab82331ef29a8", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/copyright-and-licenses/index.html", "type": "file" }, { - "bom-ref": "5b21b27316441239", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/cupti_profiler_host_util.h", + "bom-ref": "3af3b4747669675b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/genindex.html", "type": "file" }, { - "bom-ref": "93ed9defa317e056", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/cupti_range_profiler_util.h", + "bom-ref": "29e277a0d44d80ca", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/index.html", "type": "file" }, { - "bom-ref": "70a767d2227ae1dd", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/helper_cupti.h", + "bom-ref": "cc5e8da816ae34ca", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/library-support/library-support.html", "type": "file" }, { - "bom-ref": "f61c409c68abf76b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/helper_cupti_activity.h", + "bom-ref": "7764425f7816dd53", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/main/main.html", "type": "file" }, { - "bom-ref": "5e91b726a218f1d9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/helper_cupti_activity_enums.h", + "bom-ref": "d1e9c0930186e399", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/notices-header/notices-header.html", "type": "file" }, { - "bom-ref": "74bcccf48723ab84", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/helper_cupti_activity_records.h", + "bom-ref": "d2cd7b981eeb38e9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/objects.inv", "type": "file" }, { - "bom-ref": "711ea21dced4b8dd", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/helper_cupti_activity_user_defined_records.h", + "bom-ref": "39bf82127e070058", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/project.json", "type": "file" }, { - "bom-ref": "96a30796e0dcef4d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/nvtx/nvtx_payload_attributes.cpp", + "bom-ref": "0e2c7251abf1760c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/release-notes/release-notes.html", "type": "file" }, { - "bom-ref": "6680e3c3bbc9e79d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/nvtx/nvtx_payload_attributes.h", + "bom-ref": "1b6dfa3f12332cf0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/search.html", "type": "file" }, { - "bom-ref": "31e419cd54390d7f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/nvtx/nvtx_payload_parser.cpp", + "bom-ref": "0e48043a1d1de82f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/searchindex.js", "type": "file" }, { - "bom-ref": "0be279abc7579c89", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/nvtx/nvtx_payload_parser.h", + "bom-ref": "8c788d6a3bb14f91", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/special-configurations/special-configurations.html", "type": "file" }, { - "bom-ref": "11ac2e272ba28c77", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/common/table_util.h", + "bom-ref": "f218f491a3d13454", + "name": "/usr/local/cuda-13.4/extras/CUPTI/doc/html/tutorial/tutorial.html", "type": "file" }, { - "bom-ref": "44c5346902721fe9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/concurrent_profiling/Makefile", + "bom-ref": "cd39f2f44d5bbd6f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/activity_trace_async/Makefile", "type": "file" }, { - "bom-ref": "f2cdf6a49bd6fa73", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/concurrent_profiling/concurrent_profiling.cu", + "bom-ref": "15f84b0f4ff9b70b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/activity_trace_async/activity_trace_async.cu", "type": "file" }, { - "bom-ref": "d840e5f8b126aaff", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cuda_graphs_trace/Makefile", + "bom-ref": "1c5a3e81d075ff49", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/autorange_profiling/Makefile", "type": "file" }, { - "bom-ref": "3b722508313f6d6f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cuda_graphs_trace/cuda_graphs_trace.cu", + "bom-ref": "4e8f814549a573a6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/autorange_profiling/auto_range_profiling.cu", "type": "file" }, { - "bom-ref": "84d62c37dc538cf2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cuda_memory_trace/Makefile", + "bom-ref": "b46b3563283bed72", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/callback_profiling/Makefile", "type": "file" }, { - "bom-ref": "76ee40b8f147f351", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cuda_memory_trace/memory_trace.cu", + "bom-ref": "846d134e8e0e6a54", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/callback_profiling/callback_profiling.cu", "type": "file" }, { - "bom-ref": "0df7f8fcf459b78e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_correlation/Makefile", + "bom-ref": "d4ef1ebd0104abce", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/callback_timestamp/Makefile", "type": "file" }, { - "bom-ref": "6b154c486b9d4833", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_correlation/cupti_correlation.cu", + "bom-ref": "34c61df6622c5cfd", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/callback_timestamp/callback_timestamp.cu", "type": "file" }, { - "bom-ref": "dcb38e41988f65a2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_external_correlation/Makefile", + "bom-ref": "e4b8f4cb9029de69", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/checkpoint_kernels/Makefile", "type": "file" }, { - "bom-ref": "ded4da1d8a5b40b6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_external_correlation/cupti_external_correlation.cu", + "bom-ref": "8c10c0712edeac00", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/checkpoint_kernels/checkpoint_kernels.cu", "type": "file" }, { - "bom-ref": "06de7b2bf0dc436c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_finalize/Makefile", + "bom-ref": "7004b39a9318d7a9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/command_line_parser_util.h", "type": "file" }, { - "bom-ref": "6826f0da334b62e3", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_finalize/cupti_finalize.cpp", + "bom-ref": "cc03c25dd6cca868", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/cupti_profiler_host_util.h", "type": "file" }, { - "bom-ref": "f28ecf94911ced3a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_metric_properties/Makefile", + "bom-ref": "1621f8f8e15b1769", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/cupti_profiler_util.h", "type": "file" }, { - "bom-ref": "4b3381d6802b0292", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_metric_properties/cupti_metric_properties.cpp", + "bom-ref": "5826a0263f2743f3", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/cupti_range_profiler_util.h", "type": "file" }, { - "bom-ref": "4d7b6de2fd79f41e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_nvtx/Makefile", + "bom-ref": "a9b46299564fbe82", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/helper_cupti.h", "type": "file" }, { - "bom-ref": "dfbb81be0518bb3c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_nvtx/cupti_nvtx.cu", + "bom-ref": "7fc34fca33d00590", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/helper_cupti_activity.h", "type": "file" }, { - "bom-ref": "ccbd6da62e38e327", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_nvtx_ext_payload/Makefile", + "bom-ref": "329b5b0d4ff5ff72", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/helper_cupti_activity_enums.h", "type": "file" }, { - "bom-ref": "80259487961db680", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_nvtx_ext_payload/cupti_nvtx_ext_payload.cu", + "bom-ref": "2b7b61b8fa54836c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/helper_cupti_activity_records.h", "type": "file" }, { - "bom-ref": "14d3807fd4965be4", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_trace_injection/Makefile", + "bom-ref": "461889029e9672a0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/helper_cupti_activity_user_defined_records.h", "type": "file" }, { - "bom-ref": "48493307d618849c", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_trace_injection/README.txt", + "bom-ref": "56bb522320713728", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/nvtx/nvtx_payload_attributes.cpp", "type": "file" }, { - "bom-ref": "086ce76263ff5914", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_trace_injection/cupti_trace_injection.cpp", + "bom-ref": "de028c47b12e63e7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/nvtx/nvtx_payload_attributes.h", "type": "file" }, { - "bom-ref": "c6de87f8bf76c892", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_user_defined_records/Makefile", + "bom-ref": "48d402c374f051ee", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/nvtx/nvtx_payload_parser.cpp", "type": "file" }, { - "bom-ref": "78ffcd2caab33e2b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/cupti_user_defined_records/cupti_user_defined_records.cu", + "bom-ref": "129d74bacf418ba9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/nvtx/nvtx_payload_parser.h", "type": "file" }, { - "bom-ref": "a49bbba716431d2f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/include/c_util/FileOp.h", + "bom-ref": "252b8d188006cb5c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/common/table_util.h", "type": "file" }, { - "bom-ref": "942022f0218bd567", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/include/c_util/ScopeExit.h", + "bom-ref": "b4f5b1c7a28a71bb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/concurrent_profiling/Makefile", "type": "file" }, { - "bom-ref": "ea14939008f8f60e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/include/profilerhost_util/Eval.h", + "bom-ref": "9fb81f3e72c6d191", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/concurrent_profiling/concurrent_profiling.cu", "type": "file" }, { - "bom-ref": "bcfa0891eb6330ed", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/include/profilerhost_util/List.h", + "bom-ref": "e55045ab58281312", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cuda_graphs_trace/Makefile", "type": "file" }, { - "bom-ref": "51bddbd8effe3c62", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/include/profilerhost_util/Metric.h", + "bom-ref": "f55cba248459d58e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cuda_graphs_trace/cuda_graphs_trace.cu", "type": "file" }, { - "bom-ref": "cb50e836dac019c9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/include/profilerhost_util/Parser.h", + "bom-ref": "31d33a2c521fff0c", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cuda_memory_trace/Makefile", "type": "file" }, { - "bom-ref": "afcacc52be420932", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/include/profilerhost_util/Utils.h", + "bom-ref": "bee3b4878290fbe5", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cuda_memory_trace/memory_trace.cu", "type": "file" }, { - "bom-ref": "2cdcfb6d5f32a515", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/src/profilerhost_util/Eval.cpp", + "bom-ref": "a5675f03775b7da9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_correlation/Makefile", "type": "file" }, { - "bom-ref": "b776cea8fd9c66a5", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/src/profilerhost_util/List.cpp", + "bom-ref": "3a164f22b915f35a", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_correlation/cupti_correlation.cu", "type": "file" }, { - "bom-ref": "254f8a3d223d31a2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/src/profilerhost_util/Makefile", + "bom-ref": "e63b8df07e656611", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_external_correlation/Makefile", "type": "file" }, { - "bom-ref": "21b5fb70a8bf6d7a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/extensions/src/profilerhost_util/Metric.cpp", + "bom-ref": "8aedc8be1a5e0067", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_external_correlation/cupti_external_correlation.cu", "type": "file" }, { - "bom-ref": "c524af164e2044f2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/multiple_subscribers_trace/Makefile", + "bom-ref": "0486c736b73ad561", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_finalize/Makefile", "type": "file" }, { - "bom-ref": "c7f3ca0b699d6e0a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/multiple_subscribers_trace/multiple_subscribers_trace.cu", + "bom-ref": "11be01aa9cebf9a5", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_finalize/cupti_finalize.cpp", "type": "file" }, { - "bom-ref": "cd944f79ea4d6b18", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/nested_range_profiling/Makefile", + "bom-ref": "f5c3a371cf55a0b7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_metric_properties/Makefile", "type": "file" }, { - "bom-ref": "48a417f6aa7b0e5a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/nested_range_profiling/nested_range_profiling.cu", + "bom-ref": "ee003d3af005ca83", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_metric_properties/cupti_metric_properties.cpp", "type": "file" }, { - "bom-ref": "0129996b3a2745ea", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/openacc_trace/Makefile", + "bom-ref": "b54823f2c5be8d75", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_nvtx/Makefile", "type": "file" }, { - "bom-ref": "760fa9e10d746b0e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/openacc_trace/openacc_app.cpp", + "bom-ref": "0cdcae4026f9a549", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_nvtx/cupti_nvtx.cu", "type": "file" }, { - "bom-ref": "4643a24c916435a5", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/openacc_trace/openacc_trace.cpp", + "bom-ref": "dbf31c13131133d7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_nvtx_ext_payload/Makefile", "type": "file" }, { - "bom-ref": "5c75fd0f34a66396", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pc_sampling_continuous/Makefile", + "bom-ref": "70300654ef883efd", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_nvtx_ext_payload/cupti_nvtx_ext_payload.cu", "type": "file" }, { - "bom-ref": "64fec5c12517b634", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pc_sampling_continuous/README.txt", + "bom-ref": "282fe3859665a06b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_trace_injection/Makefile", "type": "file" }, { - "bom-ref": "31610492c65d65ba", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pc_sampling_continuous/libpc_sampling_continuous.pl", + "bom-ref": "5f705848ab6002fe", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_trace_injection/README.txt", "type": "file" }, { - "bom-ref": "f3cb130ae9bd39af", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pc_sampling_continuous/pc_sampling_continuous.cpp", + "bom-ref": "feb840b85cae6f07", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_trace_injection/cupti_trace_injection.cpp", "type": "file" }, { - "bom-ref": "254bbf4c055a0245", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pc_sampling_start_stop/Makefile", + "bom-ref": "93ed40d27b49d74b", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_user_defined_records/Makefile", "type": "file" }, { - "bom-ref": "26f28560da4d39d6", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pc_sampling_start_stop/pc_sampling_start_stop.cu", + "bom-ref": "40755cad2750ba20", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_user_defined_records/cupti_user_defined_records.cu", "type": "file" }, { - "bom-ref": "619e60ad7bf243c2", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pc_sampling_utility/Makefile", + "bom-ref": "fb2b101af1c617c5", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/cupti_user_defined_records/cupti_verify_user_defined_layout.h", "type": "file" }, { - "bom-ref": "f928ed121fc1e470", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pc_sampling_utility/README.txt", + "bom-ref": "6442c6c6fbaeb625", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/include/c_util/FileOp.h", "type": "file" }, { - "bom-ref": "9e459e22b94adc88", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pc_sampling_utility/pc_sampling_utility.cpp", + "bom-ref": "d01ed16713f56721", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/include/c_util/ScopeExit.h", "type": "file" }, { - "bom-ref": "1f81d31c90c5533b", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pc_sampling_utility/pc_sampling_utility_helper.h", + "bom-ref": "f5651bfe2d22c8d6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/include/profilerhost_util/Eval.h", "type": "file" }, { - "bom-ref": "b2dc2949df95132d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pm_sampling/Makefile", + "bom-ref": "0bb0fa3e90d09b1f", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/include/profilerhost_util/List.h", "type": "file" }, { - "bom-ref": "628ed76021c69798", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pm_sampling/pm_sampling.cu", + "bom-ref": "3562e432bf7496ed", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/include/profilerhost_util/Metric.h", "type": "file" }, { - "bom-ref": "01e80ecb0a2d7c1f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/pm_sampling/pm_sampling.h", + "bom-ref": "1dd2a3c59094a943", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/include/profilerhost_util/Parser.h", "type": "file" }, { - "bom-ref": "61b80dfa23be7f6e", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/profiling_injection/Makefile", + "bom-ref": "b9d9d443706a9f3a", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/include/profilerhost_util/Utils.h", "type": "file" }, { - "bom-ref": "5dc3a698893d9555", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/profiling_injection/README.txt", + "bom-ref": "d407e7997e5ac1fc", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/src/profilerhost_util/Eval.cpp", "type": "file" }, { - "bom-ref": "6462aa295d1a708d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/profiling_injection/complex_target.cu", + "bom-ref": "4c86c1ee7572cb46", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/src/profilerhost_util/List.cpp", "type": "file" }, { - "bom-ref": "3c9626eab236345a", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/profiling_injection/injection.cpp", + "bom-ref": "580e97a19d88761d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/src/profilerhost_util/Makefile", "type": "file" }, { - "bom-ref": "33cd57b7e041045f", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/profiling_injection/simple_target.cu", + "bom-ref": "a467402775675830", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/extensions/src/profilerhost_util/Metric.cpp", "type": "file" }, { - "bom-ref": "8e449bd437945eb4", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/range_profiling/Makefile", + "bom-ref": "1a08cf10305ebae0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/multiple_subscribers_trace/Makefile", "type": "file" }, { - "bom-ref": "c913ce1ebf3de811", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/range_profiling/range_profiling.cu", + "bom-ref": "65bcefa76f55e19d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/multiple_subscribers_trace/multiple_subscribers_trace.cu", "type": "file" }, { - "bom-ref": "47a3872c9085a0c9", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/range_profiling/range_profiling.h", + "bom-ref": "43f59e5ac27d9468", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/nested_range_profiling/Makefile", "type": "file" }, { - "bom-ref": "d2dd0d90e8f3a67d", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/sass_metrics/Makefile", + "bom-ref": "d058bc3494bd65d4", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/nested_range_profiling/nested_range_profiling.cu", "type": "file" }, { - "bom-ref": "b1cce779d70f5d46", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/sass_metrics/sass_metrics.cu", + "bom-ref": "efc5b5a8a69dbbf7", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/openacc_trace/Makefile", "type": "file" }, { - "bom-ref": "ff0cb927b6656383", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/unified_memory/Makefile", + "bom-ref": "e9860b738111543d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/openacc_trace/openacc_app.cpp", "type": "file" }, { - "bom-ref": "889ee03cd353b315", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/unified_memory/unified_memory.cu", + "bom-ref": "b4c0fc30aa49fbdb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/openacc_trace/openacc_trace.cpp", "type": "file" }, { - "bom-ref": "9c1a99b05996b972", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/userrange_profiling/Makefile", + "bom-ref": "0a25df65d2f8838e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pc_sampling_continuous/Makefile", "type": "file" }, { - "bom-ref": "2e7b9bb07ee9b376", - "name": "/usr/local/cuda-13.2/extras/CUPTI/samples/userrange_profiling/user_range_profiling.cu", + "bom-ref": "e6831e3c31eaae99", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pc_sampling_continuous/README.txt", "type": "file" }, { - "bom-ref": "1b6459bd18d32aaa", - "name": "/usr/local/cuda-13.2/extras/Debugger/include/cuda_stdint.h", + "bom-ref": "2e69947e813fe465", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pc_sampling_continuous/libpc_sampling_continuous.pl", "type": "file" }, { - "bom-ref": "fe51cbce0140e1ca", - "name": "/usr/local/cuda-13.2/extras/Debugger/include/cudacoredump.h", + "bom-ref": "a4491ee27f6b658d", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pc_sampling_continuous/pc_sampling_continuous.cpp", "type": "file" }, { - "bom-ref": "39e2b4ef716a2e02", - "name": "/usr/local/cuda-13.2/extras/Debugger/include/cudadebugger.h", + "bom-ref": "3ec1814f9dd619d6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pc_sampling_start_stop/Makefile", "type": "file" }, { - "bom-ref": "f50bc2f2e1aa6906", - "name": "/usr/local/cuda-13.2/gds/README", + "bom-ref": "dd44eeceb41d5ab9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pc_sampling_start_stop/pc_sampling_start_stop.cu", "type": "file" }, { - "bom-ref": "1377cca7e2e7009b", - "name": "/usr/local/cuda-13.2/gds/cufile.json", + "bom-ref": "2b733003a5b59ec8", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pc_sampling_utility/Makefile", "type": "file" }, { - "bom-ref": "1ae168ce76f1dd8d", - "name": "/usr/local/cuda-13.2/nvml/doc/nvml_changelog.txt", + "bom-ref": "99fd7eab4ef54aef", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pc_sampling_utility/README.txt", "type": "file" }, { - "bom-ref": "c4b7dce8614c20f9", - "name": "/usr/local/cuda-13.2/nvml/doc/nvml_deprecation_and_removal.txt", + "bom-ref": "7b15baf54ec677f0", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pc_sampling_utility/pc_sampling_utility.cpp", "type": "file" }, { - "bom-ref": "f31550cd3f865c3d", - "name": "/usr/local/cuda-13.2/nvml/example/Makefile", + "bom-ref": "98a846867a847eba", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pc_sampling_utility/pc_sampling_utility_helper.h", "type": "file" }, { - "bom-ref": "cab4898d650b07f6", - "name": "/usr/local/cuda-13.2/nvml/example/README.txt", + "bom-ref": "c572a5622d5bf0fb", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pm_sampling/Makefile", "type": "file" }, { - "bom-ref": "1edc7d04b83fd1e3", - "name": "/usr/local/cuda-13.2/nvml/example/example.c", + "bom-ref": "e8d2ba723f1bb8d6", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pm_sampling/pm_sampling.cu", "type": "file" }, { - "bom-ref": "56288b6a348b5ac6", - "name": "/usr/local/cuda-13.2/nvml/example/supportedVgpus.c", + "bom-ref": "bfc14adbc450dee9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/pm_sampling/pm_sampling.h", "type": "file" }, { - "bom-ref": "cd1210a5d17e72d6", - "name": "/usr/local/cuda-13.2/nvvm/bin/cicc", + "bom-ref": "3a1517b96fd6ccf5", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/profiling_injection/Makefile", "type": "file" }, { - "bom-ref": "849364a3e1ecfed4", - "name": "/usr/local/cuda-13.2/nvvm/include/nvvm.h", + "bom-ref": "2119049718f2bfed", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/profiling_injection/README.txt", "type": "file" }, { - "bom-ref": "5e388ea7537726e0", - "name": "/usr/local/cuda-13.2/nvvm/lib64/libnvvm.so.4.0.0", + "bom-ref": "843ba05ae21bd7fe", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/profiling_injection/complex_target.cu", "type": "file" }, { - "bom-ref": "6762a6aa34807304", - "name": "/usr/local/cuda-13.2/nvvm/libdevice/libdevice.10.bc", + "bom-ref": "98d3fdfa890544b9", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/profiling_injection/injection.cpp", "type": "file" }, { - "bom-ref": "c8d388ddce6a34e1", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/FrameDecorator.py", + "bom-ref": "0221c54f2eb88b71", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/profiling_injection/simple_target.cu", "type": "file" }, { - "bom-ref": "b8f28e8688e49e4c", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/FrameIterator.py", + "bom-ref": "8d078355b4cbc415", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/range_profiling/Makefile", "type": "file" }, { - "bom-ref": "aab830bc641ca4a1", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/__init__.py", + "bom-ref": "c3ea08bafc8d7b19", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/range_profiling/range_profiling.cu", "type": "file" }, { - "bom-ref": "e56de51f89479eff", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/command/__init__.py", + "bom-ref": "36b6455ac442df15", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/range_profiling/range_profiling.h", "type": "file" }, { - "bom-ref": "43f505b3fed3d410", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/command/explore.py", + "bom-ref": "1a716dd72afd8161", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/sass_metrics/Makefile", "type": "file" }, { - "bom-ref": "f8f97c3038680fb9", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/command/frame_filters.py", + "bom-ref": "230d891fe468e78e", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/sass_metrics/sass_metrics.cu", "type": "file" }, { - "bom-ref": "be924bf0d5f9f2ef", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/command/missing_files.py", + "bom-ref": "c939c4fc1a3d5538", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/unified_memory/Makefile", "type": "file" }, { - "bom-ref": "972b5f6239e6f6fd", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/command/pretty_printers.py", + "bom-ref": "ce064ea518862e56", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/unified_memory/unified_memory.cu", "type": "file" }, { - "bom-ref": "086371ff6019f30a", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/command/prompt.py", + "bom-ref": "61a811886e4ecfad", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/userrange_profiling/Makefile", "type": "file" }, { - "bom-ref": "82f14295994187aa", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/command/type_printers.py", + "bom-ref": "42444392e4f2e938", + "name": "/usr/local/cuda-13.4/extras/CUPTI/samples/userrange_profiling/user_range_profiling.cu", "type": "file" }, { - "bom-ref": "56869807fa43f6bb", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/command/unwinders.py", + "bom-ref": "ec40622e636ce5a5", + "name": "/usr/local/cuda-13.4/extras/Debugger/include/cuda_stdint.h", "type": "file" }, { - "bom-ref": "06ac748812c0db1f", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/command/xmethods.py", + "bom-ref": "4bfcebf08d5c37d6", + "name": "/usr/local/cuda-13.4/extras/Debugger/include/cudacoredump.h", "type": "file" }, { - "bom-ref": "4b820120eb99d173", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/__init__.py", + "bom-ref": "d2bdac716d1eecd7", + "name": "/usr/local/cuda-13.4/extras/Debugger/include/cudadebugger.h", "type": "file" }, { - "bom-ref": "54443cc3f81a7f6d", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/breakpoint.py", + "bom-ref": "dfe650ba9c37dfbc", + "name": "/usr/local/cuda-13.4/gds/README", "type": "file" }, { - "bom-ref": "0a408059ac6783b6", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/bt.py", + "bom-ref": "1580f08a3ea767e1", + "name": "/usr/local/cuda-13.4/gds/cufile.json", "type": "file" }, { - "bom-ref": "6e7f48cad8cc5bac", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/disassemble.py", + "bom-ref": "24df10d728e51495", + "name": "/usr/local/cuda-13.4/gds/cuobject/Doxyfile.in", "type": "file" }, { - "bom-ref": "0505aadbb4b47adf", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/evaluate.py", + "bom-ref": "5b42c6b324f0ee47", + "name": "/usr/local/cuda-13.4/gds/cuobject/README", "type": "file" }, { - "bom-ref": "f87ac73b445e5fa4", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/events.py", + "bom-ref": "f055b3b20940f239", + "name": "/usr/local/cuda-13.4/gds/cuobject/VERSION", "type": "file" }, { - "bom-ref": "39e21662b7f05c4b", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/frames.py", + "bom-ref": "40bddc761053c42a", + "name": "/usr/local/cuda-13.4/gds/cuobject/cuObjRDMADESCRprotocolformat.pdf", "type": "file" }, { - "bom-ref": "23c70a2da2f226a8", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/globalvars.py", + "bom-ref": "e4396ca21916e186", + "name": "/usr/local/cuda-13.4/nvml/doc/nvml_changelog.txt", "type": "file" }, { - "bom-ref": "a0da214c8d7dffe0", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/io.py", + "bom-ref": "309d0aa030bd8faf", + "name": "/usr/local/cuda-13.4/nvml/doc/nvml_deprecation_and_removal.txt", "type": "file" }, { - "bom-ref": "efbab2ce006c5bb4", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/launch.py", + "bom-ref": "c4ff486d0e4e307e", + "name": "/usr/local/cuda-13.4/nvml/example/Makefile", "type": "file" }, { - "bom-ref": "68f283b639b5666d", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/locations.py", + "bom-ref": "7589e784e8efd536", + "name": "/usr/local/cuda-13.4/nvml/example/README.txt", "type": "file" }, { - "bom-ref": "38161ff5bd2de310", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/memory.py", + "bom-ref": "bf8ae1eb5c28bf43", + "name": "/usr/local/cuda-13.4/nvml/example/example.c", "type": "file" }, { - "bom-ref": "4685ef3564a63a41", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/modules.py", + "bom-ref": "72014ff0a8cf922a", + "name": "/usr/local/cuda-13.4/nvml/example/supportedVgpus.c", "type": "file" }, { - "bom-ref": "5534cdef9de93ae9", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/next.py", + "bom-ref": "d8a570b13b40c7c2", + "name": "/usr/local/cuda-13.4/nvvm/bin/cicc", "type": "file" }, { - "bom-ref": "c9c1700b0f24294d", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/pause.py", + "bom-ref": "e4349d12beb35723", + "name": "/usr/local/cuda-13.4/nvvm/include/nvvm.h", "type": "file" }, { - "bom-ref": "42855a59e72d4f30", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/scopes.py", + "bom-ref": "dfbf20c1a9c22249", + "name": "/usr/local/cuda-13.4/nvvm/lib64/libnvvm.so.4.0.0", "type": "file" }, { - "bom-ref": "ad3df7c541f0a587", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/server.py", + "bom-ref": "c0f72abaf9eb16cc", + "name": "/usr/local/cuda-13.4/nvvm/libdevice/libdevice.10.bc", "type": "file" }, { - "bom-ref": "30c83bfb483cc9fa", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/sources.py", + "bom-ref": "ea4e3aae204533bc", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/FrameDecorator.py", "type": "file" }, { - "bom-ref": "10dde3536c5866bb", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/startup.py", + "bom-ref": "806f1250e28252bf", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/FrameIterator.py", "type": "file" }, { - "bom-ref": "66142221f7172cbd", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/state.py", + "bom-ref": "112c90e3e040bacc", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/__init__.py", "type": "file" }, { - "bom-ref": "6cea465cc6b717f1", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/threads.py", + "bom-ref": "581922d3392074da", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/command/__init__.py", "type": "file" }, { - "bom-ref": "651c0fefdcc43548", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/typecheck.py", + "bom-ref": "9c5c6faf8197a3e9", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/command/explore.py", "type": "file" }, { - "bom-ref": "4d3580e75f5122ad", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/dap/varref.py", + "bom-ref": "f2b1e4d534564572", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/command/frame_filters.py", "type": "file" }, { - "bom-ref": "7ee5a010a1bc44a9", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/disassembler.py", + "bom-ref": "0b1b30ce95b58b4b", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/command/missing_files.py", "type": "file" }, { - "bom-ref": "a1d286d3a609f97c", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/frames.py", + "bom-ref": "99175ea42ec4bb51", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/command/pretty_printers.py", "type": "file" }, { - "bom-ref": "09fbc190e37067c4", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/function/__init__.py", + "bom-ref": "ff85842ed47fe7fd", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/command/prompt.py", "type": "file" }, { - "bom-ref": "957e7c3cc7b471be", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/function/as_string.py", + "bom-ref": "4a1bfe098269ffa3", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/command/type_printers.py", "type": "file" }, { - "bom-ref": "700b72d907e88857", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/function/caller_is.py", + "bom-ref": "3f7296120b81d931", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/command/unwinders.py", "type": "file" }, { - "bom-ref": "6b9b591ee3fb4776", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/function/strfns.py", + "bom-ref": "8cde39925e120fdb", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/command/xmethods.py", "type": "file" }, { - "bom-ref": "9c4baff771a7f7db", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/missing_debug.py", + "bom-ref": "953342d931ddb35c", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/__init__.py", "type": "file" }, { - "bom-ref": "0086fdd381716460", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/missing_files.py", + "bom-ref": "f4f00c0997321a68", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/breakpoint.py", "type": "file" }, { - "bom-ref": "cf4f8920d57e8dad", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/missing_objfile.py", + "bom-ref": "482fb9b974b7e8ad", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/bt.py", "type": "file" }, { - "bom-ref": "b69ded45184afeb3", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/printer/__init__.py", + "bom-ref": "c683ed8a20e6f5a6", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/disassemble.py", "type": "file" }, { - "bom-ref": "c60ba49f191d20f6", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/printing.py", + "bom-ref": "78a6d7fbd1860931", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/evaluate.py", "type": "file" }, { - "bom-ref": "9cee51396ceb4f83", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/prompt.py", + "bom-ref": "278892cadf25ec6d", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/events.py", "type": "file" }, { - "bom-ref": "e562864394f3a994", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/ptwrite.py", + "bom-ref": "c838c7db694f95ef", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/frames.py", "type": "file" }, { - "bom-ref": "87bd1218b19c2a02", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/styling.py", + "bom-ref": "dfd450e8bbb0a6bb", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/globalvars.py", "type": "file" }, { - "bom-ref": "a0ab056979baad09", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/types.py", + "bom-ref": "91f2c4651de40f58", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/io.py", "type": "file" }, { - "bom-ref": "bd86551e54bdc997", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/unwinder.py", + "bom-ref": "0bc093b8b869290b", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/launch.py", "type": "file" }, { - "bom-ref": "b814a0acec42e941", - "name": "/usr/local/cuda-13.2/share/gdb/python/gdb/xmethod.py", + "bom-ref": "b41f655d9d1fbd7f", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/locations.py", "type": "file" }, { - "bom-ref": "adcb9037bfa21f45", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/aarch64-linux.xml", + "bom-ref": "b3bb1aeaff0c2207", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/memory.py", "type": "file" }, { - "bom-ref": "f2a205bd5211cc5e", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/amd64-linux.xml", + "bom-ref": "480c7654ae11ddab", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/modules.py", "type": "file" }, { - "bom-ref": "f9920bc6b3146509", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/arm-linux.xml", + "bom-ref": "8efe8048e42a3186", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/next.py", "type": "file" }, { - "bom-ref": "25e8e7b3223f4d38", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/freebsd.xml", + "bom-ref": "463d5cbbca217286", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/pause.py", "type": "file" }, { - "bom-ref": "537df1633393e1f5", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/gdb-syscalls.dtd", + "bom-ref": "5b2207e9b74de32a", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/scopes.py", "type": "file" }, { - "bom-ref": "3bc527e5294f3f97", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/i386-linux.xml", + "bom-ref": "ab513d76bc247313", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/server.py", "type": "file" }, { - "bom-ref": "85c05f16968e2598", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/loongarch-linux.xml", + "bom-ref": "c360e52b84dd5fc8", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/sources.py", "type": "file" }, { - "bom-ref": "be8bfc8983ade6db", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/mips-n32-linux.xml", + "bom-ref": "df27ace9ed6180e3", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/startup.py", "type": "file" }, { - "bom-ref": "a2608fa0b9f3d0b5", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/mips-n64-linux.xml", + "bom-ref": "0d0896a3d3fc9576", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/state.py", "type": "file" }, { - "bom-ref": "a2fde6ab696db3d1", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/mips-o32-linux.xml", + "bom-ref": "26769402a97cac81", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/threads.py", "type": "file" }, { - "bom-ref": "3e411a63545788ea", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/netbsd.xml", + "bom-ref": "94a414b87ce1f2c2", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/typecheck.py", "type": "file" }, { - "bom-ref": "b2ebd96aab5811e1", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/ppc-linux.xml", + "bom-ref": "586fd5d66f91ab85", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/dap/varref.py", "type": "file" }, { - "bom-ref": "52cd47a0adaf8bdc", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/ppc64-linux.xml", + "bom-ref": "f4ec9378f2ece6b3", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/disassembler.py", "type": "file" }, { - "bom-ref": "814329f6c9bffc8b", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/s390-linux.xml", + "bom-ref": "27b443327a7a7761", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/frames.py", "type": "file" }, { - "bom-ref": "d0b9f931481d9115", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/s390x-linux.xml", + "bom-ref": "b8e4bbb216aa0b23", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/function/__init__.py", "type": "file" }, { - "bom-ref": "b80e2aea07c4b65c", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/sparc-linux.xml", + "bom-ref": "eb47ef392224a080", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/function/as_string.py", "type": "file" }, { - "bom-ref": "95e8a77cc7506eca", - "name": "/usr/local/cuda-13.2/share/gdb/syscalls/sparc64-linux.xml", + "bom-ref": "f17680f5d7456c57", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/function/caller_is.py", "type": "file" }, { - "bom-ref": "f4e46d56ed46cf0f", - "name": "/usr/local/cuda-13.2/share/gdb/system-gdbinit/elinos.py", + "bom-ref": "12f56a19edfe7c6c", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/function/strfns.py", "type": "file" }, { - "bom-ref": "86a943f1270a75f0", - "name": "/usr/local/cuda-13.2/share/gdb/system-gdbinit/wrs-linux.py", + "bom-ref": "ffa3bd412398a58e", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/missing_debug.py", "type": "file" }, { - "bom-ref": "396bcc5b1cff991f", - "name": "/usr/local/cuda-13.2/src/cusparse_fortran.c", + "bom-ref": "54f50b7f104cc5fd", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/missing_files.py", "type": "file" }, { - "bom-ref": "e0af72b84db11106", - "name": "/usr/local/cuda-13.2/src/cusparse_fortran.h", + "bom-ref": "3dfc9b7dc4ba098d", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/missing_objfile.py", "type": "file" }, { - "bom-ref": "c60ff76ab850632c", - "name": "/usr/local/cuda-13.2/src/cusparse_fortran_common.h", + "bom-ref": "122d9f29b4f22510", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/printer/__init__.py", "type": "file" }, { - "bom-ref": "57957f6fa248654e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/Openacc/cupti_openacc.h", + "bom-ref": "92a2342296a935f9", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/printing.py", "type": "file" }, { - "bom-ref": "c649a3ef5d3d86f4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/Openmp/cupti_openmp.h", + "bom-ref": "412623e21d8e30de", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/prompt.py", "type": "file" }, { - "bom-ref": "4f3fe8aa60d95e7f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/Openmp/omp-tools.h", + "bom-ref": "e4b04f65b714c339", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/ptwrite.py", "type": "file" }, { - "bom-ref": "0d4e6e6d57b667ba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/builtin_types.h", + "bom-ref": "dbdb2e3523bec9cb", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/styling.py", "type": "file" }, { - "bom-ref": "edb89f6114e5901b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_adjacent_difference.cuh", + "bom-ref": "0298ff5dc1c65519", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/types.py", "type": "file" }, { - "bom-ref": "a962393e181131d6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_batch_memcpy.cuh", + "bom-ref": "a886dfc93e908846", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/unwinder.py", "type": "file" }, { - "bom-ref": "b704d28bb40c4051", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_for.cuh", + "bom-ref": "663e48ad1a649b8b", + "name": "/usr/local/cuda-13.4/share/gdb/python/gdb/xmethod.py", "type": "file" }, { - "bom-ref": "fc665317e4ee4141", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_histogram.cuh", + "bom-ref": "fb402d2a851313bd", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/aarch64-linux.xml", "type": "file" }, { - "bom-ref": "1a3bc38bb6ddb5f0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_merge.cuh", + "bom-ref": "a1f7be9db7a064fb", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/amd64-linux.xml", "type": "file" }, { - "bom-ref": "a7992bdcc0f148fc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_merge_sort.cuh", + "bom-ref": "8358272c714207de", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/arm-linux.xml", "type": "file" }, { - "bom-ref": "fa6035db8085dc3e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_radix_sort_downsweep.cuh", + "bom-ref": "5e43c20ed3e35087", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/freebsd.xml", "type": "file" }, { - "bom-ref": "7a98f11766b738b0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_radix_sort_histogram.cuh", + "bom-ref": "1cdf13740c0ee435", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/gdb-syscalls.dtd", "type": "file" }, { - "bom-ref": "3a6a69ee8f15e313", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_radix_sort_onesweep.cuh", + "bom-ref": "029a25c3b097d398", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/i386-linux.xml", "type": "file" }, { - "bom-ref": "d1f4e00ef5b70074", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_radix_sort_upsweep.cuh", + "bom-ref": "c862a0b27512040b", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/loongarch-linux.xml", "type": "file" }, { - "bom-ref": "0c292052fe5f9ede", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_reduce.cuh", + "bom-ref": "a86a5ad42ae43862", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/mips-n32-linux.xml", "type": "file" }, { - "bom-ref": "2152840fd2e34a1c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_reduce_by_key.cuh", + "bom-ref": "7fbd05f5a20d4b2b", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/mips-n64-linux.xml", "type": "file" }, { - "bom-ref": "5a13c888a29bc23c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_rle.cuh", + "bom-ref": "6db046d56bc760b1", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/mips-o32-linux.xml", "type": "file" }, { - "bom-ref": "7645a87b5d333020", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_scan.cuh", + "bom-ref": "2f912e6254e7962e", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/netbsd.xml", "type": "file" }, { - "bom-ref": "abb6095bd831e1ab", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_scan_by_key.cuh", + "bom-ref": "5022e5871613e597", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/ppc-linux.xml", "type": "file" }, { - "bom-ref": "070ac0ad0acae137", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_segmented_radix_sort.cuh", + "bom-ref": "cda7179bb5e5e3db", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/ppc64-linux.xml", "type": "file" }, { - "bom-ref": "03075d0946f7c537", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_select_if.cuh", + "bom-ref": "d3dfd979eb892629", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/s390-linux.xml", "type": "file" }, { - "bom-ref": "f9b2b54c377a0f7d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_sub_warp_merge_sort.cuh", + "bom-ref": "6048cf4f3ec6be91", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/s390x-linux.xml", "type": "file" }, { - "bom-ref": "53992268db7deb63", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_three_way_partition.cuh", + "bom-ref": "08de8418c9cf91c6", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/sparc-linux.xml", "type": "file" }, { - "bom-ref": "1852e169dc8958cd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_topk.cuh", + "bom-ref": "bee914a5cc070885", + "name": "/usr/local/cuda-13.4/share/gdb/syscalls/sparc64-linux.xml", "type": "file" }, { - "bom-ref": "fd5d530f47c722ab", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/agent_unique_by_key.cuh", + "bom-ref": "0d2ecab75ee93dbb", + "name": "/usr/local/cuda-13.4/share/gdb/system-gdbinit/elinos.py", "type": "file" }, { - "bom-ref": "77441e8f7820d5a6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/agent/single_pass_scan_operators.cuh", + "bom-ref": "f799744786c2c496", + "name": "/usr/local/cuda-13.4/share/gdb/system-gdbinit/wrs-linux.py", "type": "file" }, { - "bom-ref": "3538e89de3ea7a71", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_adjacent_difference.cuh", + "bom-ref": "8c503bbc3b89419f", + "name": "/usr/local/cuda-13.4/src/cusparse_fortran.c", "type": "file" }, { - "bom-ref": "d0d3b9b583f405f2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_discontinuity.cuh", + "bom-ref": "e1e49f72b2a00ea0", + "name": "/usr/local/cuda-13.4/src/cusparse_fortran.h", "type": "file" }, { - "bom-ref": "03057517746a0f5d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_exchange.cuh", + "bom-ref": "7d8d16d983a57e39", + "name": "/usr/local/cuda-13.4/src/cusparse_fortran_common.h", "type": "file" }, { - "bom-ref": "e927a323d3ae0286", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_histogram.cuh", + "bom-ref": "7605d4529ea96492", + "name": "/usr/local/cuda-13.4/src/fortran.c", "type": "file" }, { - "bom-ref": "df7ab1ceed682dbe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_load.cuh", + "bom-ref": "65f2939c6eb4fc05", + "name": "/usr/local/cuda-13.4/src/fortran.h", "type": "file" }, { - "bom-ref": "7091996d4fe43b1b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_load_to_shared.cuh", + "bom-ref": "473b5b93dd6b9eb0", + "name": "/usr/local/cuda-13.4/src/fortran_common.h", "type": "file" }, { - "bom-ref": "45a2e18609d27e60", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_merge_sort.cuh", + "bom-ref": "66924fb3a434627a", + "name": "/usr/local/cuda-13.4/src/fortran_thunking.c", "type": "file" }, { - "bom-ref": "375376e2165dd5d8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_radix_rank.cuh", + "bom-ref": "275a0ff6b965c44a", + "name": "/usr/local/cuda-13.4/src/fortran_thunking.h", "type": "file" }, { - "bom-ref": "fa27971a02cacf95", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_radix_sort.cuh", + "bom-ref": "35bab41547211e82", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/Openacc/cupti_openacc.h", "type": "file" }, { - "bom-ref": "6b424e6c2629f9df", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_raking_layout.cuh", + "bom-ref": "a553fa8d5e226871", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/Openmp/cupti_openmp.h", "type": "file" }, { - "bom-ref": "00a65fed4230d736", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_reduce.cuh", + "bom-ref": "ddc0fcc82d46099a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/Openmp/omp-tools.h", "type": "file" }, { - "bom-ref": "c66f7b06569d16da", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_run_length_decode.cuh", + "bom-ref": "9d8a4fc11418481b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/builtin_types.h", "type": "file" }, { - "bom-ref": "d2150e1392a744a0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_scan.cuh", + "bom-ref": "950d5d42d1d368da", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_adjacent_difference.cuh", "type": "file" }, { - "bom-ref": "d71bceaed5ba1fee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_shuffle.cuh", + "bom-ref": "a131dc439ec0ed4f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_batch_memcpy.cuh", "type": "file" }, { - "bom-ref": "40dd7f9df8df21c7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/block_store.cuh", + "bom-ref": "8a868523c96e814b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_batched_topk.cuh", "type": "file" }, { - "bom-ref": "fcbe6cae58cdb682", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/radix_rank_sort_operations.cuh", + "bom-ref": "ad8c12e1c42ae3e2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_find.cuh", "type": "file" }, { - "bom-ref": "e344a17c250f6e14", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/specializations/block_histogram_atomic.cuh", + "bom-ref": "aa96e4a917d90cf9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_for.cuh", "type": "file" }, { - "bom-ref": "4e824545a3fd22ba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/specializations/block_histogram_sort.cuh", + "bom-ref": "392ab2ee1990dffe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_histogram.cuh", "type": "file" }, { - "bom-ref": "17b5e458d3500ecc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/specializations/block_reduce_raking.cuh", + "bom-ref": "23bfa3aa6c5efae7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_merge.cuh", "type": "file" }, { - "bom-ref": "f2e181b0c1e330bc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/specializations/block_reduce_raking_commutative_only.cuh", + "bom-ref": "c1c02111017860f9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_merge_sort.cuh", "type": "file" }, { - "bom-ref": "4a32bb4e32478d66", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/specializations/block_reduce_warp_reductions.cuh", + "bom-ref": "c56246ce9e6a8072", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_radix_sort_downsweep.cuh", "type": "file" }, { - "bom-ref": "92fc40eaccf21e48", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/specializations/block_scan_raking.cuh", + "bom-ref": "e9bb1ddd136b859c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_radix_sort_histogram.cuh", "type": "file" }, { - "bom-ref": "3601ed8837705ebd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/block/specializations/block_scan_warp_scans.cuh", + "bom-ref": "d5fa9354d0725bc0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_radix_sort_onesweep.cuh", "type": "file" }, { - "bom-ref": "6d62c6ddeb15fe83", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/config.cuh", + "bom-ref": "301ed60caeee4cb1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_radix_sort_upsweep.cuh", "type": "file" }, { - "bom-ref": "0352ca349aadedbb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/cub.cuh", + "bom-ref": "434680ff5ae67dfb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_reduce.cuh", "type": "file" }, { - "bom-ref": "52cf7c65f8fc771a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/array_utils.cuh", + "bom-ref": "67051a978b816b69", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_reduce_by_key.cuh", "type": "file" }, { - "bom-ref": "7f29a527e320f027", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/choose_offset.cuh", + "bom-ref": "8d24a70e9a0a8621", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_rle.cuh", "type": "file" }, { - "bom-ref": "cfd76ff8a4442a2e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/detect_cuda_runtime.cuh", + "bom-ref": "1ac7d76965343f82", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_scan.cuh", "type": "file" }, { - "bom-ref": "8d120e83bfca4f56", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/device_double_buffer.cuh", + "bom-ref": "74ff7e7be8d9d5bc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_scan_by_key.cuh", "type": "file" }, { - "bom-ref": "504f574e2de74a0d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/device_memory_resource.cuh", + "bom-ref": "141796efa4ba8cf0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_segmented_radix_sort.cuh", "type": "file" }, { - "bom-ref": "084544d8e58bade3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/fast_modulo_division.cuh", + "bom-ref": "73207093208949cc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_select_if.cuh", "type": "file" }, { - "bom-ref": "44826041b923d7a5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/integer_utils.cuh", + "bom-ref": "b8747d22aea6a49d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_sub_warp_merge_sort.cuh", "type": "file" }, { - "bom-ref": "8e8b94f4a4517a97", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/launcher/cuda_driver.cuh", + "bom-ref": "3bbafd2a17e5c46d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_three_way_partition.cuh", "type": "file" }, { - "bom-ref": "9ada105592c3c61a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/launcher/cuda_runtime.cuh", + "bom-ref": "30099c18602c2c90", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_topk.cuh", "type": "file" }, { - "bom-ref": "9145f4d6e0ac47e4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/mdspan_utils.cuh", + "bom-ref": "2f0d9e807486e0cd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/agent_unique_by_key.cuh", "type": "file" }, { - "bom-ref": "022492c40c3d48f7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/ptx-json-parser.cuh", + "bom-ref": "6ad6e8c08c5ca5c3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/agent/single_pass_scan_operators.cuh", "type": "file" }, { - "bom-ref": "c2897380189ecd67", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/ptx-json/array.cuh", + "bom-ref": "3b73a550e5e2efe9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_adjacent_difference.cuh", "type": "file" }, { - "bom-ref": "6f718afab28e9cb1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/ptx-json/json.cuh", + "bom-ref": "f18c686fc65a1cdf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_discontinuity.cuh", "type": "file" }, { - "bom-ref": "69b51c493090663c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/ptx-json/object.cuh", + "bom-ref": "295a771a22619839", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_exchange.cuh", "type": "file" }, { - "bom-ref": "a9fce6ad27eac30b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/ptx-json/string.cuh", + "bom-ref": "ddc9bef55a6b4264", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_histogram.cuh", "type": "file" }, { - "bom-ref": "39529a3798146d19", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/ptx-json/value.cuh", + "bom-ref": "7a5f37ef9ef74df8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_load.cuh", "type": "file" }, { - "bom-ref": "c09d8b22a928054b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/rfa.cuh", + "bom-ref": "30f8f22181ae1e29", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_load_to_shared.cuh", "type": "file" }, { - "bom-ref": "c86faa50a35ca0ff", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/strong_load.cuh", + "bom-ref": "34784dc0900bb332", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_merge_sort.cuh", "type": "file" }, { - "bom-ref": "23432ef6d1113852", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/strong_store.cuh", + "bom-ref": "42411b0fc9a0a24c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_radix_rank.cuh", "type": "file" }, { - "bom-ref": "bbd4a96424d3116e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/temporary_storage.cuh", + "bom-ref": "849270ebebded621", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_radix_sort.cuh", "type": "file" }, { - "bom-ref": "38e619b0e9f9037c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/type_traits.cuh", + "bom-ref": "da32113a60fea8fa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_raking_layout.cuh", "type": "file" }, { - "bom-ref": "21a2efad519c94d2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/uninitialized_copy.cuh", + "bom-ref": "949262ce9bc48550", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_reduce.cuh", "type": "file" }, { - "bom-ref": "ab5547b80f5a08e9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/detail/unsafe_bitcast.cuh", + "bom-ref": "e3239106de5fd57c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_run_length_decode.cuh", "type": "file" }, { - "bom-ref": "0eef63605276107e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_adjacent_difference.cuh", + "bom-ref": "cda73dc0d50304ed", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_scan.cuh", "type": "file" }, { - "bom-ref": "e42271b96a7b87ee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_copy.cuh", + "bom-ref": "553722748f9bc110", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_shuffle.cuh", "type": "file" }, { - "bom-ref": "cae8381681431377", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_for.cuh", + "bom-ref": "23bc57c3f9174251", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_store.cuh", "type": "file" }, { - "bom-ref": "ddbbc32ec2179e30", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_histogram.cuh", + "bom-ref": "1fbd9e18ffcf6ae0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/block_topk.cuh", "type": "file" }, { - "bom-ref": "3675bb6906aac680", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_memcpy.cuh", + "bom-ref": "3080c07c1a1422ee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/radix_rank_sort_operations.cuh", "type": "file" }, { - "bom-ref": "6eacc0b821958635", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_merge.cuh", + "bom-ref": "8a9255c1f6f07593", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/specializations/block_histogram_atomic.cuh", "type": "file" }, { - "bom-ref": "3416291c17dd56dc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_merge_sort.cuh", + "bom-ref": "10dab33bfcdbbbd5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/specializations/block_histogram_sort.cuh", "type": "file" }, { - "bom-ref": "1f6564ad8a1b4422", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_partition.cuh", + "bom-ref": "2d468069d80741be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/specializations/block_reduce_raking.cuh", "type": "file" }, { - "bom-ref": "709135d10944032f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_radix_sort.cuh", + "bom-ref": "3891289c66ff5669", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/specializations/block_reduce_raking_commutative_only.cuh", "type": "file" }, { - "bom-ref": "08e434d5b63956ed", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_reduce.cuh", + "bom-ref": "fbd3508361f620d6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/specializations/block_reduce_warp_reductions.cuh", "type": "file" }, { - "bom-ref": "4f162ae7b5f4561d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_run_length_encode.cuh", + "bom-ref": "b3ba3ffaadc087bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/specializations/block_scan_raking.cuh", "type": "file" }, { - "bom-ref": "8e75cd00c4f56aba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_scan.cuh", + "bom-ref": "c8f7401dfb259fe0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/specializations/block_scan_warp_scans.cuh", "type": "file" }, { - "bom-ref": "2c59d2b304105359", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_segmented_radix_sort.cuh", + "bom-ref": "8c66e8e1f345c5be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/block/specializations/block_topk_air.cuh", "type": "file" }, { - "bom-ref": "acbed7cebc4e0554", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_segmented_reduce.cuh", + "bom-ref": "cb17ddb01a4ad0af", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/config.cuh", "type": "file" }, { - "bom-ref": "4dcfbf801df10306", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_segmented_sort.cuh", + "bom-ref": "e4788d0bec169449", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/cub.cuh", "type": "file" }, { - "bom-ref": "f3c4f93d0c318b22", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_select.cuh", + "bom-ref": "70932ea2c8667ad2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/array_utils.cuh", "type": "file" }, { - "bom-ref": "fccfb988f652ff11", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_topk.cuh", + "bom-ref": "9b7a432df0fbe0df", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/binary_search_helpers.cuh", "type": "file" }, { - "bom-ref": "da98fb978edf3ef5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/device_transform.cuh", + "bom-ref": "1bcb86042731055e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/cc_dispatch.cuh", "type": "file" }, { - "bom-ref": "83cc56492e8e6aff", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_adjacent_difference.cuh", + "bom-ref": "282d331fe79d5862", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/choose_offset.cuh", "type": "file" }, { - "bom-ref": "1a5e22d197be2348", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_batch_memcpy.cuh", + "bom-ref": "e61a3c1df5bab167", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/delay_constructor.cuh", "type": "file" }, { - "bom-ref": "b8d588a6dc1f2695", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_common.cuh", + "bom-ref": "63807b3af82af495", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/detect_cuda_runtime.cuh", "type": "file" }, { - "bom-ref": "4ae47fdf86311ba0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_copy_mdspan.cuh", + "bom-ref": "d6e2e45fc2ec7510", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/device_double_buffer.cuh", "type": "file" }, { - "bom-ref": "50eee28b05a5350f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_fixed_size_segmented_reduce.cuh", + "bom-ref": "f3b50eee5eb87061", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/device_memory_resource.cuh", "type": "file" }, { - "bom-ref": "310068246bc9e78c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_for.cuh", + "bom-ref": "b553ab65fc5bf67d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/env_dispatch.cuh", "type": "file" }, { - "bom-ref": "28be9f7f4a9845b6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_histogram.cuh", + "bom-ref": "8d859d187e1a3813", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/fast_modulo_division.cuh", "type": "file" }, { - "bom-ref": "05e9dc4c1a0858f7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_merge.cuh", + "bom-ref": "0f00ef660b674447", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/integer_utils.cuh", "type": "file" }, { - "bom-ref": "d34d538f9c10350a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_merge_sort.cuh", + "bom-ref": "48883c4f8a4bc442", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/launcher/cuda_driver.cuh", "type": "file" }, { - "bom-ref": "cad1038858520867", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_radix_sort.cuh", + "bom-ref": "a1f7413394e44dd7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/launcher/cuda_runtime.cuh", "type": "file" }, { - "bom-ref": "e509993183bc9913", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_reduce.cuh", + "bom-ref": "3f546241408b9f9e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/mdspan_utils.cuh", "type": "file" }, { - "bom-ref": "79c628dcbba3083b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_reduce_by_key.cuh", + "bom-ref": "532115381d339102", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/rfa.cuh", "type": "file" }, { - "bom-ref": "a67e70b59eb57a39", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_reduce_deterministic.cuh", + "bom-ref": "653ea90f1ac2e172", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/segmented_params.cuh", "type": "file" }, { - "bom-ref": "60ad3205917397d9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_reduce_nondeterministic.cuh", + "bom-ref": "b8a1035253cb2acc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/segmented_scan_helpers.cuh", "type": "file" }, { - "bom-ref": "b4f5120bf6b95c79", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_rle.cuh", + "bom-ref": "370bcc44a3ef9270", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/strong_load.cuh", "type": "file" }, { - "bom-ref": "1a7ff96974433a11", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_scan.cuh", + "bom-ref": "9d7fd3fe06a80c8a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/strong_store.cuh", "type": "file" }, { - "bom-ref": "893d2d6b118b6dbd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_scan_by_key.cuh", + "bom-ref": "2934d6672d0db433", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/temporary_storage.cuh", "type": "file" }, { - "bom-ref": "699d13fc7bba43d6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_segmented_radix_sort.cuh", + "bom-ref": "24a859743c645aad", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/type_traits.cuh", "type": "file" }, { - "bom-ref": "fba1c6d2ee081926", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_segmented_reduce.cuh", + "bom-ref": "a6111c04a7ae122e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/uninitialized_copy.cuh", "type": "file" }, { - "bom-ref": "9d115351df6be98e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_segmented_sort.cuh", + "bom-ref": "3f2a17555cdac7be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/unsafe_bitcast.cuh", "type": "file" }, { - "bom-ref": "4dd69c7e3d3e67c5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_select_if.cuh", + "bom-ref": "8d2cdfcefdf070b4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/allocators/smem_allocator.cuh", "type": "file" }, { - "bom-ref": "5ccf87d7a7fa04c1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_streaming_reduce.cuh", + "bom-ref": "c661c7cac073db88", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/constant_assert.cuh", "type": "file" }, { - "bom-ref": "83e75273b5ceef8a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_streaming_reduce_by_key.cuh", + "bom-ref": "7cb74c894b3ef3d9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/look_ahead.cuh", "type": "file" }, { - "bom-ref": "066458cb5eb49ba3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_three_way_partition.cuh", + "bom-ref": "0ad17d1a826dd8f0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/make_warp_uniform.cuh", "type": "file" }, { - "bom-ref": "c1e70c76586eb928", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_topk.cuh", + "bom-ref": "fab9df9374a66988", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/optimize_smem_ptr.cuh", "type": "file" }, { - "bom-ref": "0868a78ab1f3708d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_transform.cuh", + "bom-ref": "61bc5a01651f6b20", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/resource/smem_phase.cuh", "type": "file" }, { - "bom-ref": "6f5d2f5df06d6846", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_unique_by_key.cuh", + "bom-ref": "8b84f85df66744f4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/resource/smem_ref.cuh", "type": "file" }, { - "bom-ref": "b2de1f86fbb4960b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_for_each.cuh", + "bom-ref": "829fe2ca5f2fb384", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/resource/smem_resource.cuh", "type": "file" }, { - "bom-ref": "89e52c5d045f1a12", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_histogram.cuh", + "bom-ref": "cdefb784f77a899f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/resource/smem_resource_raw.cuh", "type": "file" }, { - "bom-ref": "c062fe2d485d2e4c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_merge_sort.cuh", + "bom-ref": "59835979708157c2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/resource/smem_stage.cuh", "type": "file" }, { - "bom-ref": "32393344b66d8ccb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_radix_sort.cuh", + "bom-ref": "ad279d6090d3a1a7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/special_registers.cuh", "type": "file" }, { - "bom-ref": "ffe7ef9e0557ba83", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_reduce.cuh", + "bom-ref": "1d39e892ff689089", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/squad/load_store.cuh", "type": "file" }, { - "bom-ref": "a73d838b370ba7e1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_scan.cuh", + "bom-ref": "fbcd5d7b1cad7591", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/squad/squad.cuh", "type": "file" }, { - "bom-ref": "ccbec33a993303d3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_segmented_radix_sort.cuh", + "bom-ref": "051b452dbd8585be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/squad/squad_desc.cuh", "type": "file" }, { - "bom-ref": "9f93c4939828f4e7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_segmented_reduce.cuh", + "bom-ref": "af8ebbc12a4cd53a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/sync_handler.cuh", "type": "file" }, { - "bom-ref": "1eb2bb1d8338c204", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_segmented_sort.cuh", + "bom-ref": "e29cec8eb4554df4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/values.cuh", "type": "file" }, { - "bom-ref": "4426ee13c2677194", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_three_way_partition.cuh", + "bom-ref": "7b178303557e3d04", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/detail/warpspeed/warpspeed.cuh", "type": "file" }, { - "bom-ref": "727c4aa4903186e1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_transform.cuh", + "bom-ref": "cbac60f93d97eb6c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_adjacent_difference.cuh", "type": "file" }, { - "bom-ref": "551044953ae40ebb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_unique_by_key.cuh", + "bom-ref": "226f88d91f7bae8f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_copy.cuh", "type": "file" }, { - "bom-ref": "3d69aebf10453407", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_adjacent_difference.cuh", + "bom-ref": "f310a78f7ea65bc9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_find.cuh", "type": "file" }, { - "bom-ref": "7a576dac3b1b6b81", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_batch_memcpy.cuh", + "bom-ref": "474809c312fc5130", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_for.cuh", "type": "file" }, { - "bom-ref": "f6ce711b9328111f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_for.cuh", + "bom-ref": "a104c849383f4d4b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_histogram.cuh", "type": "file" }, { - "bom-ref": "4226c366a01bfccf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_histogram.cuh", + "bom-ref": "17da664232233bd4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_memcpy.cuh", "type": "file" }, { - "bom-ref": "6ae492b32c5f3c9f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_merge.cuh", + "bom-ref": "c393989b79d9a63b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_merge.cuh", "type": "file" }, { - "bom-ref": "b8c567bed1902efe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_merge_sort.cuh", + "bom-ref": "93b6a591c8c87a52", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_merge_sort.cuh", "type": "file" }, { - "bom-ref": "cc69d7f2da1a1202", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_radix_sort.cuh", + "bom-ref": "2ecbbbc8e894f44d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_partition.cuh", "type": "file" }, { - "bom-ref": "a39c4646169cb34a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_reduce.cuh", + "bom-ref": "cd781956ad99c9d7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_radix_sort.cuh", "type": "file" }, { - "bom-ref": "59e2ff4927ae920a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_reduce_by_key.cuh", + "bom-ref": "ed0439f1b1e00807", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_reduce.cuh", "type": "file" }, { - "bom-ref": "b61095c074da9fdc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_run_length_encode.cuh", + "bom-ref": "90c44ec0906c0dd1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_run_length_encode.cuh", "type": "file" }, { - "bom-ref": "72eff6a4944ac7ee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_scan.cuh", + "bom-ref": "3a6664a409ba4771", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_scan.cuh", "type": "file" }, { - "bom-ref": "06be9bc14c0e819f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_scan_by_key.cuh", + "bom-ref": "0354e0a378051108", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_segmented_radix_sort.cuh", "type": "file" }, { - "bom-ref": "3fad2b5598670265", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_segmented_sort.cuh", + "bom-ref": "de44ad6ec07b126b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_segmented_reduce.cuh", "type": "file" }, { - "bom-ref": "eaa3c6f58548babb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_select_if.cuh", + "bom-ref": "b8cc6c8338e929cf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_segmented_scan.cuh", "type": "file" }, { - "bom-ref": "8a0664f1ffb12508", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_three_way_partition.cuh", + "bom-ref": "7107f592a0b22c03", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_segmented_sort.cuh", "type": "file" }, { - "bom-ref": "e057b519af70e2f9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_topk.cuh", + "bom-ref": "3a48c47406f1aad9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_select.cuh", "type": "file" }, { - "bom-ref": "28b402b470da6741", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_transform.cuh", + "bom-ref": "9d5bddf4bc681ec4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_topk.cuh", "type": "file" }, { - "bom-ref": "3992a107bd271ad7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_unique_by_key.cuh", + "bom-ref": "ce2b4bfeb76d1340", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/device_transform.cuh", "type": "file" }, { - "bom-ref": "5bab3197aea9b75b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/grid/grid_even_share.cuh", + "bom-ref": "9c42fe793e6b09a2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_adjacent_difference.cuh", "type": "file" }, { - "bom-ref": "fa77f2b5897d2502", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/grid/grid_mapping.cuh", + "bom-ref": "f0b2daeb895c9d2d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_batch_memcpy.cuh", "type": "file" }, { - "bom-ref": "6648c372b8a0eda6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/grid/grid_queue.cuh", + "bom-ref": "3a43ff7db64a3370", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_batched_topk.cuh", "type": "file" }, { - "bom-ref": "9fa73e0a61d38c93", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/iterator/arg_index_input_iterator.cuh", + "bom-ref": "be6663369e4a6af2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_common.cuh", "type": "file" }, { - "bom-ref": "74dfef9c16126ead", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/iterator/cache_modified_input_iterator.cuh", + "bom-ref": "778e633e8efd6fc2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_copy_mdspan.cuh", "type": "file" }, { - "bom-ref": "cf08c799e5d71ae9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/iterator/cache_modified_output_iterator.cuh", + "bom-ref": "3144e96e1d43c5c7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_find.cuh", "type": "file" }, { - "bom-ref": "2c342e4a1012a384", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/iterator/tex_obj_input_iterator.cuh", + "bom-ref": "58e884727a034b3d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_for.cuh", "type": "file" }, { - "bom-ref": "019969bcf85c6bbc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/thread/thread_load.cuh", + "bom-ref": "e34840d7a56f0ebe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_histogram.cuh", "type": "file" }, { - "bom-ref": "052d7c0f0e2c5468", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/thread/thread_operators.cuh", + "bom-ref": "619bd69c5f2065b1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_merge.cuh", "type": "file" }, { - "bom-ref": "d0c4703b080d3973", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/thread/thread_reduce.cuh", + "bom-ref": "e1ced73bf2cb9cc1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_merge_sort.cuh", "type": "file" }, { - "bom-ref": "79b62c94c2a5711d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/thread/thread_scan.cuh", + "bom-ref": "5d00b3dce743f594", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_radix_sort.cuh", "type": "file" }, { - "bom-ref": "05f9506ca907f066", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/thread/thread_search.cuh", + "bom-ref": "0761176f575c9f09", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_reduce.cuh", "type": "file" }, { - "bom-ref": "55b6eb24a786cbaa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/thread/thread_simd.cuh", + "bom-ref": "0f5609a59ce2e3da", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_reduce_by_key.cuh", "type": "file" }, { - "bom-ref": "4968bfa6a74e5086", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/thread/thread_sort.cuh", + "bom-ref": "81d6a2b179382e56", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_reduce_deterministic.cuh", "type": "file" }, { - "bom-ref": "92f81b6cc74988c9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/thread/thread_store.cuh", + "bom-ref": "d0e725606c1b3a14", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_reduce_nondeterministic.cuh", "type": "file" }, { - "bom-ref": "cc70fc80ebe61191", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_allocator.cuh", + "bom-ref": "196710ef978051a1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_rle.cuh", "type": "file" }, { - "bom-ref": "9d4653de0c11f859", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_arch.cuh", + "bom-ref": "9e54b6122013c4bb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_scan.cuh", "type": "file" }, { - "bom-ref": "296c2152f7641743", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_cpp_dialect.cuh", + "bom-ref": "97c2143e89fdc5c8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_scan_by_key.cuh", "type": "file" }, { - "bom-ref": "048083ed9577095d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_debug.cuh", + "bom-ref": "12159a8dd0648205", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_segmented_radix_sort.cuh", "type": "file" }, { - "bom-ref": "6fbc2e122ca0a913", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_device.cuh", + "bom-ref": "24be9074e151b34e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_segmented_reduce.cuh", "type": "file" }, { - "bom-ref": "9a3d708701d8e756", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_macro.cuh", + "bom-ref": "00329d8b4064343b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_segmented_scan.cuh", "type": "file" }, { - "bom-ref": "cfe9ab9f8f7588f8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_math.cuh", + "bom-ref": "a304548c58595d3c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_segmented_sort.cuh", "type": "file" }, { - "bom-ref": "b3e738c138dadf3a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_namespace.cuh", + "bom-ref": "280b81f07e4c42f7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_select_if.cuh", "type": "file" }, { - "bom-ref": "80b5babc5d59c3a3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_policy_wrapper_t.cuh", + "bom-ref": "b8cda908be69a422", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_streaming_reduce.cuh", "type": "file" }, { - "bom-ref": "94b0e2703cc1521f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_ptx.cuh", + "bom-ref": "f0cf3a69022ba31a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_streaming_reduce_by_key.cuh", "type": "file" }, { - "bom-ref": "f2cc4c4d8b4c0949", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_temporary_storage.cuh", + "bom-ref": "5340cb82bc5aed29", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_three_way_partition.cuh", "type": "file" }, { - "bom-ref": "2cfeda2e549121ad", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_type.cuh", + "bom-ref": "af7114f423dc9d05", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_topk.cuh", "type": "file" }, { - "bom-ref": "5c2ae397e4b63c3b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/util_vsmem.cuh", + "bom-ref": "022d7be6250cbcf6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_transform.cuh", "type": "file" }, { - "bom-ref": "a581ba74e8356aa0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/version.cuh", + "bom-ref": "127798675a96a05d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/dispatch_unique_by_key.cuh", "type": "file" }, { - "bom-ref": "5897c4d61a486466", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_exchange_shfl.cuh", + "bom-ref": "e84ff9b8a3052b7c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_batched_topk.cuh", "type": "file" }, { - "bom-ref": "8dd0dbdd4924cf32", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_exchange_smem.cuh", + "bom-ref": "3012dc2e679f3b41", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_for_each.cuh", "type": "file" }, { - "bom-ref": "3fa80645ce9f6ee1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_reduce_shfl.cuh", + "bom-ref": "86fc99fcdd34c181", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_histogram.cuh", "type": "file" }, { - "bom-ref": "05fd53b899c671d5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_reduce_smem.cuh", + "bom-ref": "64f5c0eb3c13e295", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_merge_sort.cuh", "type": "file" }, { - "bom-ref": "826dfa4db534fdbc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_scan_shfl.cuh", + "bom-ref": "34c69c16fa65375c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_radix_sort.cuh", "type": "file" }, { - "bom-ref": "0648ccfa054e0cbc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_scan_smem.cuh", + "bom-ref": "85e7a5e8976c0407", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_reduce.cuh", "type": "file" }, { - "bom-ref": "33aef437076af05c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/warp_exchange.cuh", + "bom-ref": "df73b7d3d5a4f425", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_reduce_deterministic.cuh", "type": "file" }, { - "bom-ref": "4e55032f42559e48", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/warp_load.cuh", + "bom-ref": "75db7d7c4923a2fe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_scan.cuh", "type": "file" }, { - "bom-ref": "74bff73900d50721", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/warp_merge_sort.cuh", + "bom-ref": "9dc068bd068ceaec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_scan_warpspeed.cuh", "type": "file" }, { - "bom-ref": "a6f356a792a67a96", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/warp_reduce.cuh", + "bom-ref": "6c601da7f86ddbe4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_segmented_radix_sort.cuh", "type": "file" }, { - "bom-ref": "d27b6be9438af6f1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/warp_scan.cuh", + "bom-ref": "04037e516c4226b4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_segmented_reduce.cuh", "type": "file" }, { - "bom-ref": "17300c323e9997c1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/warp_store.cuh", + "bom-ref": "d1844739c04d7529", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_segmented_scan.cuh", "type": "file" }, { - "bom-ref": "bd8e450cebade7ef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cub/warp/warp_utils.cuh", + "bom-ref": "794d5169cb43dfcb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_segmented_sort.cuh", "type": "file" }, { - "bom-ref": "6ce0042b88c7c8e5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__algorithm/common.h", + "bom-ref": "b496efb587a11edf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_three_way_partition.cuh", "type": "file" }, { - "bom-ref": "e46a49e278d46b19", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__algorithm/copy.h", + "bom-ref": "17d970834d50095b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_transform.cuh", "type": "file" }, { - "bom-ref": "7932d9faf9f978ee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__algorithm/fill.h", + "bom-ref": "34b4604d38e845a0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/kernels/kernel_unique_by_key.cuh", "type": "file" }, { - "bom-ref": "5fff264beab18e77", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/access_property.h", + "bom-ref": "9940db65f4ecc924", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/common.cuh", "type": "file" }, { - "bom-ref": "882c014b6a1d469d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/access_property_encoding.h", + "bom-ref": "e5797358f25c1f8a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_adjacent_difference.cuh", "type": "file" }, { - "bom-ref": "d9863272d0292072", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/annotated_ptr.h", + "bom-ref": "49164a219cde9191", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_batch_memcpy.cuh", "type": "file" }, { - "bom-ref": "06da5ba73afeedea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/annotated_ptr_base.h", + "bom-ref": "ac61d1e7a53f3b36", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_batched_topk.cuh", "type": "file" }, { - "bom-ref": "7893278a817acfdd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/apply_access_property.h", + "bom-ref": "3a971d68b35b66d8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_find.cuh", "type": "file" }, { - "bom-ref": "e1b8b233e7233fa7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/associate_access_property.h", + "bom-ref": "c6747b955340c37d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_for.cuh", "type": "file" }, { - "bom-ref": "199d114ecbcc4157", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/createpolicy.h", + "bom-ref": "b4085b076567c199", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_histogram.cuh", "type": "file" }, { - "bom-ref": "2284e6dd04613411", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__atomic/atomic.h", + "bom-ref": "3548fd0c95f44283", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_merge.cuh", "type": "file" }, { - "bom-ref": "2b32d87207a0b1b1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__barrier/async_contract_fulfillment.h", + "bom-ref": "6ca30ec00874456c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_merge_sort.cuh", "type": "file" }, { - "bom-ref": "0fcb83476f3e5c53", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__barrier/barrier.h", + "bom-ref": "a16211d0f7cd535f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_radix_sort.cuh", "type": "file" }, { - "bom-ref": "d6d334ec3a955873", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__barrier/barrier_arrive_tx.h", + "bom-ref": "06af452c6d7d8de0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_reduce.cuh", "type": "file" }, { - "bom-ref": "3ad232482ab3d524", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__barrier/barrier_block_scope.h", + "bom-ref": "509e130ae326efcf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_reduce_by_key.cuh", "type": "file" }, { - "bom-ref": "a44dcd251cf23697", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__barrier/barrier_expect_tx.h", + "bom-ref": "d41f0a3819018bc8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_reduce_deterministic.cuh", "type": "file" }, { - "bom-ref": "b28a81d6ea0613f5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__barrier/barrier_thread_scope.h", + "bom-ref": "8828f982a97fbb02", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_reduce_nondeterministic.cuh", "type": "file" }, { - "bom-ref": "80aa5c96d499d04b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__bit/bit_reverse.h", + "bom-ref": "02f7248faa9a9ce8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_rle_encode.cuh", "type": "file" }, { - "bom-ref": "b22af0832fb6ec10", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__bit/bitfield.h", + "bom-ref": "1a56152744eada57", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_rle_non_trivial_runs.cuh", "type": "file" }, { - "bom-ref": "ccb8cd9b17904fcc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__bit/bitmask.h", + "bom-ref": "18abb0ced737294b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_scan.cuh", "type": "file" }, { - "bom-ref": "4bd723aeb4daedbb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cccl_config", + "bom-ref": "d09e09d60807960b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_scan_by_key.cuh", "type": "file" }, { - "bom-ref": "8195d8bcc14a3c76", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/ceil_div.h", + "bom-ref": "cbdedd833c847aae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_segmented_radix_sort.cuh", "type": "file" }, { - "bom-ref": "7b5638bc32cf6827", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/fast_modulo_division.h", + "bom-ref": "49c9752a4e2ef876", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_segmented_reduce.cuh", "type": "file" }, { - "bom-ref": "cd554209cfdebf11", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/ilog.h", + "bom-ref": "ef1546a1c4063e45", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_segmented_scan.cuh", "type": "file" }, { - "bom-ref": "23ef362dd89004f0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/ipow.h", + "bom-ref": "b36b73ced15647a8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_segmented_sort.cuh", "type": "file" }, { - "bom-ref": "153a7e403637ad58", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/isqrt.h", + "bom-ref": "d8e35701103baba4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_select_if.cuh", "type": "file" }, { - "bom-ref": "fb5f4e40623e549a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/mul_hi.h", + "bom-ref": "9d98f2063d87d01c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_three_way_partition.cuh", "type": "file" }, { - "bom-ref": "a5ea93b605974d41", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/neg.h", + "bom-ref": "806b13d2498174ee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_topk.cuh", "type": "file" }, { - "bom-ref": "b00e68fd44fa1d14", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/pow2.h", + "bom-ref": "9a43985ee1f87087", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_transform.cuh", "type": "file" }, { - "bom-ref": "b438b9b54710fd8b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/round_down.h", + "bom-ref": "ab924389366302c3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/device/dispatch/tuning/tuning_unique_by_key.cuh", "type": "file" }, { - "bom-ref": "2921a5827b9b3b12", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/round_up.h", + "bom-ref": "6be5ed9905c7195b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/grid/grid_even_share.cuh", "type": "file" }, { - "bom-ref": "92ea62ce40a3b3aa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__cmath/uabs.h", + "bom-ref": "0ed6a6e751f23060", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/grid/grid_mapping.cuh", "type": "file" }, { - "bom-ref": "b67872dcfcd56cd3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__complex/complex.h", + "bom-ref": "2d7df96bb2e226f3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/grid/grid_queue.cuh", "type": "file" }, { - "bom-ref": "6d482d1220a56b47", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__complex/get_real_imag.h", + "bom-ref": "3c6ec3f0d415c22a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/iterator/arg_index_input_iterator.cuh", "type": "file" }, { - "bom-ref": "c9e583cd488096c9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__complex/traits.h", + "bom-ref": "98b9465303500cd5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/iterator/cache_modified_input_iterator.cuh", "type": "file" }, { - "bom-ref": "782f0960de273cf7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__complex_", + "bom-ref": "34a602d97fcf8bca", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/iterator/cache_modified_output_iterator.cuh", "type": "file" }, { - "bom-ref": "e9a8158fc8d10108", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__container/buffer.h", + "bom-ref": "c74f1baa1261200e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/iterator/tex_obj_input_iterator.cuh", "type": "file" }, { - "bom-ref": "2e803e188601bce8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__container/heterogeneous_iterator.h", + "bom-ref": "8c42caa900dbf1f2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/thread/thread_load.cuh", "type": "file" }, { - "bom-ref": "44e70cbdc22be928", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__container/uninitialized_async_buffer.h", + "bom-ref": "e93679128e4a4c00", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/thread/thread_operators.cuh", "type": "file" }, { - "bom-ref": "585b6f56797ae186", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__device/all_devices.h", + "bom-ref": "f8d9c237a40c2aa9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/thread/thread_reduce.cuh", "type": "file" }, { - "bom-ref": "c96eab7b72a00bae", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__device/arch_id.h", + "bom-ref": "4522323b094fdcbc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/thread/thread_scan.cuh", "type": "file" }, { - "bom-ref": "b30890afd7eba8f1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__device/arch_traits.h", + "bom-ref": "813038d537fc2f72", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/thread/thread_search.cuh", "type": "file" }, { - "bom-ref": "4ff7869900dfbed4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__device/attributes.h", + "bom-ref": "de72ef44ada99d41", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/thread/thread_simd.cuh", "type": "file" }, { - "bom-ref": "ec1e5f08b0215c40", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__device/compute_capability.h", + "bom-ref": "82e3e160860a374a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/thread/thread_sort.cuh", "type": "file" }, { - "bom-ref": "fd7273b4fa044e71", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__device/device_ref.h", + "bom-ref": "5a982a80d18e8016", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/thread/thread_store.cuh", "type": "file" }, { - "bom-ref": "085eb3a12a7dc542", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__device/physical_device.h", + "bom-ref": "be6bb168223c5c66", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_allocator.cuh", "type": "file" }, { - "bom-ref": "c86a8282361b857c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__driver/driver_api.h", + "bom-ref": "e89810fd79df4960", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_arch.cuh", "type": "file" }, { - "bom-ref": "2efb0bbc37c5b1f1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__event/event.h", + "bom-ref": "532f77303b52f1ce", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_cpp_dialect.cuh", "type": "file" }, { - "bom-ref": "d645024f11102848", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__event/event_ref.h", + "bom-ref": "ba58d6eecf67e8eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_debug.cuh", "type": "file" }, { - "bom-ref": "6774c80124c7cbf2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__event/timed_event.h", + "bom-ref": "4926caa15e63b0a2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_device.cuh", "type": "file" }, { - "bom-ref": "a93c66867c6c4f3d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__execution/determinism.h", + "bom-ref": "6e6d66c34ac3bbbe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_macro.cuh", "type": "file" }, { - "bom-ref": "f13169ac3b3d99dc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__execution/output_ordering.h", + "bom-ref": "b8b49ac0789ff5b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_math.cuh", "type": "file" }, { - "bom-ref": "41824631a6872f68", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__execution/require.h", + "bom-ref": "9e2f324dcb00e656", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_namespace.cuh", "type": "file" }, { - "bom-ref": "893b3b95544d95c7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__execution/tune.h", + "bom-ref": "13ff0c78dc861b2e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_policy_wrapper_t.cuh", "type": "file" }, { - "bom-ref": "59d84efe47b53240", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__functional/address_stability.h", + "bom-ref": "8620d31f70efcfe3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_ptx.cuh", "type": "file" }, { - "bom-ref": "67c8af33a254171c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__functional/call_or.h", + "bom-ref": "324be7321f3992ee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_temporary_storage.cuh", "type": "file" }, { - "bom-ref": "2d4d894f832f5891", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__functional/for_each_canceled.h", + "bom-ref": "0b691381a962dde3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_type.cuh", "type": "file" }, { - "bom-ref": "8957f6251e66e01c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__functional/maximum.h", + "bom-ref": "bf6d8875aef16dfc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/util_vsmem.cuh", "type": "file" }, { - "bom-ref": "0ed396cce1e7bbdb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__functional/minimum.h", + "bom-ref": "dd369a0f804548cf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/version.cuh", "type": "file" }, { - "bom-ref": "5d79273b5875232e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__functional/minimum_maximum_common.h", + "bom-ref": "7898043005d6fe4a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_exchange_shfl.cuh", "type": "file" }, { - "bom-ref": "ac9303fb556a000e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__functional/proclaim_return_type.h", + "bom-ref": "ce343a964b857900", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_exchange_smem.cuh", "type": "file" }, { - "bom-ref": "2faa322d5ee38d30", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__fwd/barrier.h", + "bom-ref": "a608169b590d7651", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_reduce_batched_wspro.cuh", "type": "file" }, { - "bom-ref": "b4b94e0b1ae4e30a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__fwd/complex.h", + "bom-ref": "093ad6c547884bdd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_reduce_shfl.cuh", "type": "file" }, { - "bom-ref": "967669e207b425a1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__fwd/devices.h", + "bom-ref": "b5cccf18ce641c80", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_reduce_smem.cuh", "type": "file" }, { - "bom-ref": "606635bc9a39e9dc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__fwd/get_stream.h", + "bom-ref": "5971682910767704", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_scan_shfl.cuh", "type": "file" }, { - "bom-ref": "e27d318ce01a5f33", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__fwd/hierarchy.h", + "bom-ref": "2e371b3097ce794c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/specializations/warp_scan_smem.cuh", "type": "file" }, { - "bom-ref": "d12a2cd5209695af", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__fwd/pipeline.h", + "bom-ref": "d86f9192e192b798", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/warp_exchange.cuh", "type": "file" }, { - "bom-ref": "26efc076683ef61e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__fwd/zip_iterator.h", + "bom-ref": "97aee9d751da21c3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/warp_load.cuh", "type": "file" }, { - "bom-ref": "57c0255684b13be6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/block_level.h", + "bom-ref": "cf55afaf7a59efd1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/warp_merge_sort.cuh", "type": "file" }, { - "bom-ref": "e083b2c620343c0c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/cluster_level.h", + "bom-ref": "cff6b7edc1f6b31e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/warp_reduce.cuh", "type": "file" }, { - "bom-ref": "3a782dd6dd3748c7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/get_launch_dimensions.h", + "bom-ref": "fd3619397b476cb4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/warp_reduce_batched.cuh", "type": "file" }, { - "bom-ref": "0698ac89d129f6b4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/grid_level.h", + "bom-ref": "a225e9a5cf560309", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/warp_scan.cuh", "type": "file" }, { - "bom-ref": "e877f0bacedf2611", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/hierarchy_dimensions.h", + "bom-ref": "0e7a1db20a3a1c82", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/warp_store.cuh", "type": "file" }, { - "bom-ref": "9e902f4f118aa2a6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/hierarchy_level_base.h", + "bom-ref": "941e6448afbd3e10", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cub/warp/warp_utils.cuh", "type": "file" }, { - "bom-ref": "a618987da39a691a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/hierarchy_levels.h", + "bom-ref": "cc0c53e3c9add12c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__algorithm/common.h", "type": "file" }, { - "bom-ref": "f27ab1baf60ef843", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/hierarchy_query_result.h", + "bom-ref": "e6752fc257981929", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__algorithm/copy.h", "type": "file" }, { - "bom-ref": "13d4427f6a676f51", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/level_dimensions.h", + "bom-ref": "e696f452d220e403", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__algorithm/fill.h", "type": "file" }, { - "bom-ref": "d336d55012ed09d4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/native_hierarchy_level_base.h", + "bom-ref": "fb470bdc8efd0ede", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/access_property.h", "type": "file" }, { - "bom-ref": "16ec6a79ca7f37c1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/thread_level.h", + "bom-ref": "c8fd6e614f28d7ff", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/access_property_encoding.h", "type": "file" }, { - "bom-ref": "6620e8ec7d609f45", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/traits.h", + "bom-ref": "727c79c88a4a832c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/annotated_ptr.h", "type": "file" }, { - "bom-ref": "f14c93a045018259", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__hierarchy/warp_level.h", + "bom-ref": "e3f56b19f4c3f6fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/annotated_ptr_base.h", "type": "file" }, { - "bom-ref": "9a297d66a595e70a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__internal/dlpack.h", + "bom-ref": "dda9c459d73c2139", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/apply_access_property.h", "type": "file" }, { - "bom-ref": "d8114a1276f5b7a6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/constant_iterator.h", + "bom-ref": "1b3890f6ef651df6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/associate_access_property.h", "type": "file" }, { - "bom-ref": "0c6361b213c6c2a3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/counting_iterator.h", + "bom-ref": "c76157bf5891a8d0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__annotated_ptr/createpolicy.h", "type": "file" }, { - "bom-ref": "d0f1a634f36c569c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/discard_iterator.h", + "bom-ref": "0e5d70014b51a5c4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__atomic/atomic.h", "type": "file" }, { - "bom-ref": "e34bb61bd9e9a4e1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/permutation_iterator.h", + "bom-ref": "014d347604492a86", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__barrier/async_contract_fulfillment.h", "type": "file" }, { - "bom-ref": "287916fdde04e10b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/shuffle_iterator.h", + "bom-ref": "f84834f5851ba8c1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__barrier/barrier.h", "type": "file" }, { - "bom-ref": "09f826a948be2e0c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/strided_iterator.h", + "bom-ref": "9ed65f7a09ade008", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__barrier/barrier_arrive_tx.h", "type": "file" }, { - "bom-ref": "b1e970e800cdb361", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/tabulate_output_iterator.h", + "bom-ref": "f67ebd0029e5cad1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__barrier/barrier_block_scope.h", "type": "file" }, { - "bom-ref": "983b3b5f1c6cf745", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/transform_input_output_iterator.h", + "bom-ref": "75c6ce8a81a1aaf6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__barrier/barrier_expect_tx.h", "type": "file" }, { - "bom-ref": "b924308e3d59e6d3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/transform_iterator.h", + "bom-ref": "407b7919a5cd9d0c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__barrier/barrier_thread_scope.h", "type": "file" }, { - "bom-ref": "ebb705b73ad1bf6a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/transform_output_iterator.h", + "bom-ref": "3add981cee568c4f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__bit/bit_reverse.h", "type": "file" }, { - "bom-ref": "70fbae85585c9af5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/zip_common.h", + "bom-ref": "e8aeee336c5c6de5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__bit/bitfield.h", "type": "file" }, { - "bom-ref": "1864a6ef40cfb189", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/zip_function.h", + "bom-ref": "2fa36e6314ad53fe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__bit/bitmask.h", "type": "file" }, { - "bom-ref": "76114cbec01a588c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/zip_iterator.h", + "bom-ref": "6e50a8609723533c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cccl_config", "type": "file" }, { - "bom-ref": "64c02caf79f62d6e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__iterator/zip_transform_iterator.h", + "bom-ref": "be0fec5805479a58", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/ceil_div.h", "type": "file" }, { - "bom-ref": "9ee76b351c1c2a70", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__latch/latch.h", + "bom-ref": "66acac9b0477fc12", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/fast_modulo_division.h", "type": "file" }, { - "bom-ref": "d90ab95a6842900c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__launch/configuration.h", + "bom-ref": "57aafb2c83689b94", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/ilog.h", "type": "file" }, { - "bom-ref": "718f82c874735b2c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__launch/host_launch.h", + "bom-ref": "e533aaae7898d281", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/ipow.h", "type": "file" }, { - "bom-ref": "a169a1c1829ddc3b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__launch/launch.h", + "bom-ref": "7f10cfe90d676ec1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/isqrt.h", "type": "file" }, { - "bom-ref": "3ba3f7d5ff43b0f8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__mdspan/host_device_accessor.h", + "bom-ref": "10d02d0edbb9ee55", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/mul_hi.h", "type": "file" }, { - "bom-ref": "2870f9582ff01d7b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__mdspan/host_device_mdspan.h", + "bom-ref": "a3642fcbe83eb8e3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/neg.h", "type": "file" }, { - "bom-ref": "95b297868ef3f6b6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__mdspan/restrict_accessor.h", + "bom-ref": "40c99eb31c909792", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/pow2.h", "type": "file" }, { - "bom-ref": "cd9807225139e296", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__mdspan/restrict_mdspan.h", + "bom-ref": "f7f9003724466fef", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/round_down.h", "type": "file" }, { - "bom-ref": "b16a08863f296ae1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/check_preconditions.h", + "bom-ref": "f219b64ac71e6de6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/round_up.h", "type": "file" }, { - "bom-ref": "cba113f9b4f051db", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/completion_mechanism.h", + "bom-ref": "b0684a221cefb942", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/sincos.h", "type": "file" }, { - "bom-ref": "e50f5ec4946aa287", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/cp_async_bulk_shared_global.h", + "bom-ref": "c4908d3315c59b4b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__cmath/uabs.h", "type": "file" }, { - "bom-ref": "01a52f5f2d3d4272", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/cp_async_fallback.h", + "bom-ref": "7e3cd801c81184fc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__complex/complex.h", "type": "file" }, { - "bom-ref": "1243135133968230", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/cp_async_shared_global.h", + "bom-ref": "204898684506fc6d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__complex/get_real_imag.h", "type": "file" }, { - "bom-ref": "3ef9afa67df91e4f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/dispatch_memcpy_async.h", + "bom-ref": "6110ad27380645d4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__complex/traits.h", "type": "file" }, { - "bom-ref": "3ac452f10bb537c6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/elect_one.h", + "bom-ref": "4d0e549e3f2d0bfb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__complex_", "type": "file" }, { - "bom-ref": "ffe8f54e7cb32bfe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/group_traits.h", + "bom-ref": "0c99d0520efc19b7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__container/buffer.h", "type": "file" }, { - "bom-ref": "e8a9db2f90bcd0cf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/is_local_smem_barrier.h", + "bom-ref": "1c6c66bab1ba9297", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__container/heterogeneous_iterator.h", "type": "file" }, { - "bom-ref": "e289abd5e3de6faf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/memcpy_async.h", + "bom-ref": "9c0194413fa2387e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__container/make_buffer_with_pool.h", "type": "file" }, { - "bom-ref": "c9e2708f33bf25c0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/memcpy_async_barrier.h", + "bom-ref": "84101625ad117cbe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__container/uninitialized_async_buffer.h", "type": "file" }, { - "bom-ref": "bd10ded5a963886d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/memcpy_async_tx.h", + "bom-ref": "866ea0f028f38edc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__device/all_devices.h", "type": "file" }, { - "bom-ref": "d320d193e9b6ad18", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/memcpy_completion.h", + "bom-ref": "5bac48150cc73f1c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__device/arch_id.h", "type": "file" }, { - "bom-ref": "31f164a93f4eaceb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/try_get_barrier_handle.h", + "bom-ref": "20aa0ac49b2305ac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__device/arch_traits.h", "type": "file" }, { - "bom-ref": "1eb760059a897342", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/address_space.h", + "bom-ref": "ca41d7215233ac4c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__device/attributes.h", "type": "file" }, { - "bom-ref": "599a22176e89eb2e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/align_down.h", + "bom-ref": "78331c71027eba48", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__device/compute_capability.h", "type": "file" }, { - "bom-ref": "c3b5827ee4a5702b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/align_up.h", + "bom-ref": "a53a0695c5aa0fd5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__device/device_ref.h", "type": "file" }, { - "bom-ref": "02c3d03daeae998a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/aligned_size.h", + "bom-ref": "2f2f018a84782a22", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__device/physical_device.h", "type": "file" }, { - "bom-ref": "476b436c153f38f0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/check_address.h", + "bom-ref": "bd22e9e62cddff78", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__driver/driver_api.h", "type": "file" }, { - "bom-ref": "8d91ee24faca2e18", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/discard_memory.h", + "bom-ref": "fc365bba805c1ba4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__event/event.h", "type": "file" }, { - "bom-ref": "9688116cae38e2ce", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/get_device_address.h", + "bom-ref": "af60d83d4a2d5824", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__event/event_ref.h", "type": "file" }, { - "bom-ref": "bb1df1fbdbcd78b4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/is_aligned.h", + "bom-ref": "f3072617264db658", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__event/timed_event.h", "type": "file" }, { - "bom-ref": "4f9f61ccbd34dedf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/is_pointer_accessible.h", + "bom-ref": "69e8853761bc7c1e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__execution/determinism.h", "type": "file" }, { - "bom-ref": "af69010433cf0a30", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/ptr_in_range.h", + "bom-ref": "2d8be17bcd59e6f5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__execution/output_ordering.h", "type": "file" }, { - "bom-ref": "01fb614573f20e4f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/ptr_rebind.h", + "bom-ref": "68cdd64a5d52f9f0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__execution/policy.h", "type": "file" }, { - "bom-ref": "b1a913ee6b703018", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory/ranges_overlap.h", + "bom-ref": "1195f20f6176ec53", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__execution/require.h", "type": "file" }, { - "bom-ref": "5699f43fc2b6254c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_pool/device_memory_pool.h", + "bom-ref": "6bcae1e6ec877d07", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__execution/tune.h", "type": "file" }, { - "bom-ref": "0f5bff21c061af28", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_pool/managed_memory_pool.h", + "bom-ref": "f5cfbf05cbdab1e0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__functional/address_stability.h", "type": "file" }, { - "bom-ref": "50af074ec7f13a80", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_pool/memory_pool_base.h", + "bom-ref": "dee965bd10d3ccf9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__functional/always_true_false.h", "type": "file" }, { - "bom-ref": "0b29b35e2e4f9da9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_pool/pinned_memory_pool.h", + "bom-ref": "f5b77adeed4cd6c5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__functional/call_or.h", "type": "file" }, { - "bom-ref": "e0d2eff6e49d4547", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_resource/any_resource.h", + "bom-ref": "2b006f0f52e41f9e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__functional/equal_to_value.h", "type": "file" }, { - "bom-ref": "edc4c07b45b35e17", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_resource/get_memory_resource.h", + "bom-ref": "5c8ff8003172c9d6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__functional/for_each_canceled.h", "type": "file" }, { - "bom-ref": "1eccf3a4bfa7a710", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_resource/get_property.h", + "bom-ref": "df78e8b0a3c9c519", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__functional/maximum.h", "type": "file" }, { - "bom-ref": "eaf7b104236b217e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_resource/legacy_managed_memory_resource.h", + "bom-ref": "b920ff9331bf61f9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__functional/minimum.h", "type": "file" }, { - "bom-ref": "d76562a9730fe690", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_resource/legacy_pinned_memory_resource.h", + "bom-ref": "13a7b23d19f56f71", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__functional/minimum_maximum_common.h", "type": "file" }, { - "bom-ref": "d7fc8f2fbfa5b598", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_resource/properties.h", + "bom-ref": "6218f3ab82a7d1d6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__functional/operator_properties.h", "type": "file" }, { - "bom-ref": "e6a416e8e8b6667d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_resource/resource.h", + "bom-ref": "dac6ed61e8ac4281", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__functional/proclaim_return_type.h", "type": "file" }, { - "bom-ref": "6256166937c60fb5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_resource/shared_resource.h", + "bom-ref": "24c928417190ec55", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__fwd/barrier.h", "type": "file" }, { - "bom-ref": "a4e25a06b61527ba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__memory_resource/synchronous_resource_adapter.h", + "bom-ref": "9891df8259ca56b0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__fwd/complex.h", "type": "file" }, { - "bom-ref": "3c6abc422eb79ae1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__numeric/add_overflow.h", + "bom-ref": "0ea05580fbe5c568", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__fwd/devices.h", "type": "file" }, { - "bom-ref": "1e78ccaf5ea05322", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__numeric/div_overflow.h", + "bom-ref": "7e3de9f33563abfd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__fwd/get_memory_resource.h", "type": "file" }, { - "bom-ref": "3fbfc0999d20ac9b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__numeric/narrow.h", + "bom-ref": "e6ec6ca756e66081", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__fwd/get_stream.h", "type": "file" }, { - "bom-ref": "7f2b5e8a1bf0527e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__numeric/overflow_cast.h", + "bom-ref": "8e19b494ed33ff43", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__fwd/hierarchy.h", "type": "file" }, { - "bom-ref": "f9ce01dd3f0c685e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__numeric/overflow_result.h", + "bom-ref": "a37bb00802ff5d32", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__fwd/iterator.h", "type": "file" }, { - "bom-ref": "eb4c5d7e03638851", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__numeric/sub_overflow.h", + "bom-ref": "6bcca411a50b0588", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__fwd/mdspan.h", "type": "file" }, { - "bom-ref": "009a7b9d5b29028a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__nvtx/nvtx.h", + "bom-ref": "9d3d20b166620508", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__fwd/pipeline.h", "type": "file" }, { - "bom-ref": "07efdd930b0d46ab", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__nvtx/nvtx3.h", + "bom-ref": "86973a4079a48673", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__fwd/random.h", "type": "file" }, { - "bom-ref": "83da5ba80b073916", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/barrier_cluster.h", + "bom-ref": "e3179d7aa20e5ff4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/get_launch_dimensions.h", "type": "file" }, { - "bom-ref": "484613ecd21c4d9d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/bfind.h", + "bom-ref": "dbd7dab12f60b7b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/hierarchy_dimensions.h", "type": "file" }, { - "bom-ref": "5a449b08d4fbbbcb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/bmsk.h", + "bom-ref": "a504f0f82f1cf4af", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/hierarchy_level_base.h", "type": "file" }, { - "bom-ref": "6efe1288c483ef81", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/clusterlaunchcontrol.h", + "bom-ref": "dadf27c6a77a04fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/hierarchy_levels.h", "type": "file" }, { - "bom-ref": "dd8fba87abd526a4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_bulk.h", + "bom-ref": "a27d940266253024", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/hierarchy_query_result.h", "type": "file" }, { - "bom-ref": "ef4ce0da74db651f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_bulk_commit_group.h", + "bom-ref": "3bfec9fe3431fc10", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/level_dimensions.h", "type": "file" }, { - "bom-ref": "fdcf3a745c1de76e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_bulk_tensor.h", + "bom-ref": "6bab94a2509d3eed", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/native_hierarchy_level_base.h", "type": "file" }, { - "bom-ref": "63fce608265003eb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_bulk_wait_group.h", + "bom-ref": "2af04fa7c1830d69", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/queries/count.h", "type": "file" }, { - "bom-ref": "0b5cb82f94c95273", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_mbarrier_arrive.h", + "bom-ref": "5ee0085f05f620a8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/queries/extents.h", "type": "file" }, { - "bom-ref": "ae6628609d058534", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_reduce_async_bulk.h", + "bom-ref": "45664f531db8f319", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/queries/index.h", "type": "file" }, { - "bom-ref": "ca85d703fb0c3f05", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_reduce_async_bulk_tensor.h", + "bom-ref": "de43bd5985c06018", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/queries/rank.h", "type": "file" }, { - "bom-ref": "4ec95556d511cc78", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/elect_sync.h", + "bom-ref": "afb935e5e9aafa91", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__hierarchy/traits.h", "type": "file" }, { - "bom-ref": "31c8a836b76bf4e5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/exit.h", + "bom-ref": "8f28cad28af91fdd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__internal/dlpack.h", "type": "file" }, { - "bom-ref": "4144d8cffa7132bd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/fence.h", + "bom-ref": "65932fb05bdeb288", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/constant_iterator.h", "type": "file" }, { - "bom-ref": "48716ca76b0451fe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/barrier_cluster.h", + "bom-ref": "6b77a19fbc549438", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/counting_iterator.h", "type": "file" }, { - "bom-ref": "97656f4921cf8809", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/bfind.h", + "bom-ref": "66e5886bff1caaf2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/discard_iterator.h", "type": "file" }, { - "bom-ref": "0198a63426926c50", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/bmsk.h", + "bom-ref": "c2f296b8c9371cd9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/permutation_iterator.h", "type": "file" }, { - "bom-ref": "c11d79bf381224e7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/clusterlaunchcontrol.h", + "bom-ref": "649738918b34f66c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/shuffle_iterator.h", "type": "file" }, { - "bom-ref": "bc80bb9453119f2a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk.h", + "bom-ref": "cdcbe7ffca3cb699", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/strided_iterator.h", "type": "file" }, { - "bom-ref": "324e25a315c342c2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_commit_group.h", + "bom-ref": "f59e7a827b7acc0c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/tabulate_output_iterator.h", "type": "file" }, { - "bom-ref": "a40a95a9f3b84202", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_multicast.h", + "bom-ref": "ada8caf6287dbf1c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/transform_input_output_iterator.h", "type": "file" }, { - "bom-ref": "486753d9ab828a4f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_tensor.h", + "bom-ref": "0cb3a3c21cdb613a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/transform_iterator.h", "type": "file" }, { - "bom-ref": "1961b482336e3117", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_tensor_gather_scatter.h", + "bom-ref": "3e874456873e1206", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/transform_output_iterator.h", "type": "file" }, { - "bom-ref": "d99c05b774ce653d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_tensor_multicast.h", + "bom-ref": "2b59999dd1598770", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/zip_common.h", "type": "file" }, { - "bom-ref": "231042c27df49b34", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_wait_group.h", + "bom-ref": "91bf0a6b335bb897", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/zip_function.h", "type": "file" }, { - "bom-ref": "999fa6e8c931afb2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_mbarrier_arrive.h", + "bom-ref": "c20aa07fb40afe1a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/zip_iterator.h", "type": "file" }, { - "bom-ref": "b1bd9cbb9d0d901e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_mbarrier_arrive_noinc.h", + "bom-ref": "e312fec09edcaac0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__iterator/zip_transform_iterator.h", "type": "file" }, { - "bom-ref": "ebd9c1fd34baf29f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_reduce_async_bulk.h", + "bom-ref": "f9a0df7be93cb771", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__latch/latch.h", "type": "file" }, { - "bom-ref": "ca242ea4aec14c45", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_reduce_async_bulk_bf16.h", + "bom-ref": "bc082c2427ca1b43", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__launch/configuration.h", "type": "file" }, { - "bom-ref": "7380097df5df86d0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_reduce_async_bulk_f16.h", + "bom-ref": "53612f60124ff948", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__launch/host_launch.h", "type": "file" }, { - "bom-ref": "63dfe57a40a315ca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_reduce_async_bulk_tensor.h", + "bom-ref": "9eca6bf63f0b812f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__launch/launch.h", "type": "file" }, { - "bom-ref": "730f603621f9de0b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/elect_sync.h", + "bom-ref": "afcdfd891f22b561", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/dlpack_to_mdspan.h", "type": "file" }, { - "bom-ref": "91e1a296578ae335", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/exit.h", + "bom-ref": "b69a06e392b0c802", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/host_device_accessor.h", "type": "file" }, { - "bom-ref": "f8777bf3ffd0414b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence.h", + "bom-ref": "28fb3e04072a5e42", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/host_device_mdspan.h", "type": "file" }, { - "bom-ref": "a717b25b48b94b28", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_mbarrier_init.h", + "bom-ref": "0dd7ed60b97b8bb0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/layout_stride_relaxed.h", "type": "file" }, { - "bom-ref": "632342096d8ea101", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_alias.h", + "bom-ref": "a87242116e2af7d1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/mdspan_to_dlpack.h", "type": "file" }, { - "bom-ref": "217cfcc794346606", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_async.h", + "bom-ref": "1576ce072995791c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/restrict_accessor.h", "type": "file" }, { - "bom-ref": "94158b82032c6cac", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_async_generic_sync_restrict.h", + "bom-ref": "56745dc88a8cc822", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/restrict_mdspan.h", "type": "file" }, { - "bom-ref": "d66a29a23de87a48", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_tensormap_generic.h", + "bom-ref": "f19418d37e618e10", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/shared_memory_accessor.h", "type": "file" }, { - "bom-ref": "d45167ccdeb3bf50", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_sync_restrict.h", + "bom-ref": "633b671546028a84", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/shared_memory_mdspan.h", "type": "file" }, { - "bom-ref": "31d5bc744b96c515", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/get_sreg.h", + "bom-ref": "36217b43b06baeb0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/strides.h", "type": "file" }, { - "bom-ref": "fb7d17a09694608d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/getctarank.h", + "bom-ref": "84fd84ab43d62a6a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__mdspan/traits.h", "type": "file" }, { - "bom-ref": "d7c986904a837c62", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/ld.h", + "bom-ref": "eb6f06ef3d3fd3e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/check_preconditions.h", "type": "file" }, { - "bom-ref": "e979ec1702f5bdaf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_arrive.h", + "bom-ref": "9434dd39de2ac9fc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/completion_mechanism.h", "type": "file" }, { - "bom-ref": "278581d295a123fa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_arrive_expect_tx.h", + "bom-ref": "53c93f2b0168e74b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/cp_async_bulk_shared_global.h", "type": "file" }, { - "bom-ref": "0336c1ab0f57bff4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_arrive_no_complete.h", + "bom-ref": "140678ef760abff7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/cp_async_fallback.h", "type": "file" }, { - "bom-ref": "56b9082ab4f918ae", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_expect_tx.h", + "bom-ref": "74a4a3fd05ea6e92", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/cp_async_shared_global.h", "type": "file" }, { - "bom-ref": "0c1214211b1f615d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_init.h", + "bom-ref": "08702328d4803f80", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/dispatch_memcpy_async.h", "type": "file" }, { - "bom-ref": "3bd113532210d5e6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_inval.h", + "bom-ref": "1803bb17211bdc55", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/elect_one.h", "type": "file" }, { - "bom-ref": "1b783ec7f7bf6144", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_test_wait.h", + "bom-ref": "e793ee3dfdf8bd68", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/group_traits.h", "type": "file" }, { - "bom-ref": "2bc4e81943dd02b3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_test_wait_parity.h", + "bom-ref": "af04376e1f9a654a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/is_local_smem_barrier.h", "type": "file" }, { - "bom-ref": "e23b58944de405d6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_try_wait.h", + "bom-ref": "1fb0a2ade9346f23", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/memcpy_async.h", "type": "file" }, { - "bom-ref": "7c4bdbf7fa2e9ed2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_try_wait_parity.h", + "bom-ref": "d060b13ac16587d9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/memcpy_async_barrier.h", "type": "file" }, { - "bom-ref": "41cf1544bccacb3e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/multimem_ld_reduce.h", + "bom-ref": "da27d5b427004ff6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/memcpy_async_tx.h", "type": "file" }, { - "bom-ref": "140531e81d552911", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/multimem_red.h", + "bom-ref": "1f24b24fb091f814", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/memcpy_completion.h", "type": "file" }, { - "bom-ref": "43c3d69ba5f35ee9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/multimem_st.h", + "bom-ref": "de9a0f6cde23d019", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memcpy_async/try_get_barrier_handle.h", "type": "file" }, { - "bom-ref": "aa3016bfe70fbdf6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/prmt.h", + "bom-ref": "cd54d122f7b5001f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/address_space.h", "type": "file" }, { - "bom-ref": "c175750e004718ea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/red_async.h", + "bom-ref": "c1fb75926a1bd912", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/align_down.h", "type": "file" }, { - "bom-ref": "b90b04c74ad2df68", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/setmaxnreg.h", + "bom-ref": "dbba89cd0200edfb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/align_up.h", "type": "file" }, { - "bom-ref": "d4c6f5a1bcee4694", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/shl.h", + "bom-ref": "0d1d37a693590ec2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/aligned_size.h", "type": "file" }, { - "bom-ref": "56b07f4227b500dc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/shr.h", + "bom-ref": "649c237901250938", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/check_address.h", "type": "file" }, { - "bom-ref": "5d1441aa13d00565", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/st.h", + "bom-ref": "3f6d362724354802", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/discard_memory.h", "type": "file" }, { - "bom-ref": "76b92695ca1bc039", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/st_async.h", + "bom-ref": "5f711f886ff0ec32", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/get_device_address.h", "type": "file" }, { - "bom-ref": "05af38315e3d0bbd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/st_bulk.h", + "bom-ref": "c1863c2362b95690", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/is_aligned.h", "type": "file" }, { - "bom-ref": "7efd35444e89dabb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_alloc.h", + "bom-ref": "2acd3b4997d577ec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/is_pointer_accessible.h", "type": "file" }, { - "bom-ref": "ef1d80a051c0249d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_commit.h", + "bom-ref": "92af8a3b6bfd6733", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/is_valid_alignment.h", "type": "file" }, { - "bom-ref": "372d1f1628be6daa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_cp.h", + "bom-ref": "49e5ea5151df376c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/ptr_alignment.h", "type": "file" }, { - "bom-ref": "e93d761a416686a9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_fence.h", + "bom-ref": "dc7b6b9689237b20", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/ptr_in_range.h", "type": "file" }, { - "bom-ref": "6646be19b8f53d68", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_ld.h", + "bom-ref": "9a098e84d04ae833", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/ptr_rebind.h", "type": "file" }, { - "bom-ref": "c70add586083ac59", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_mma.h", + "bom-ref": "8033121656f0986f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/ranges_overlap.h", "type": "file" }, { - "bom-ref": "bc2564c270db8de5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_mma_ws.h", + "bom-ref": "bb22f2f2b9fa2e8c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory/uninitialized_array.h", "type": "file" }, { - "bom-ref": "ff4ac48b8f630ec4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_shift.h", + "bom-ref": "56b0f834ecd0f3d5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_pool/device_memory_pool.h", "type": "file" }, { - "bom-ref": "9b347b4f1a595ddb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_st.h", + "bom-ref": "bfcb3e24c7fc30ca", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_pool/managed_memory_pool.h", "type": "file" }, { - "bom-ref": "63d201292c51b3f4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_wait.h", + "bom-ref": "51a28fe48b582fb9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_pool/memory_pool_base.h", "type": "file" }, { - "bom-ref": "61600fd4dd3a30cd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tensormap_cp_fenceproxy.h", + "bom-ref": "b2bc59291e798ef3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_pool/pinned_memory_pool.h", "type": "file" }, { - "bom-ref": "3e7c9c8cd3c6adc6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tensormap_replace.h", + "bom-ref": "cc2a06460de60fa1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_pool/shared_device_memory_pool.h", "type": "file" }, { - "bom-ref": "25e731cb4700515c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/trap.h", + "bom-ref": "055835efb2378329", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_pool/shared_managed_memory_pool.h", "type": "file" }, { - "bom-ref": "b4a14e0a3342eee6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/get_sreg.h", + "bom-ref": "4e4f4cc85200429c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_pool/shared_memory_pool_base.h", "type": "file" }, { - "bom-ref": "5013dcee5623ea15", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/getctarank.h", + "bom-ref": "1a3b6f37744eabb5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_pool/shared_pinned_memory_pool.h", "type": "file" }, { - "bom-ref": "1040d6709e0d5199", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/ld.h", + "bom-ref": "ba00a8d73fbace38", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/allocation_alignment.h", "type": "file" }, { - "bom-ref": "b7e3f612b7577cbe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_arrive.h", + "bom-ref": "82bdc854cf98c2eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/any_resource.h", "type": "file" }, { - "bom-ref": "aba08c4904a30338", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_expect_tx.h", + "bom-ref": "3cfbc80cba8c1b06", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/get_memory_resource.h", "type": "file" }, { - "bom-ref": "5ab90c8c68f82276", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_init.h", + "bom-ref": "9d8b8dc0a5e11b98", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/get_property.h", "type": "file" }, { - "bom-ref": "bacdeea89c130c72", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_inval.h", + "bom-ref": "0d33f36ac03016d6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/legacy_managed_memory_resource.h", "type": "file" }, { - "bom-ref": "33ef1a0d88a42154", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_wait.h", + "bom-ref": "69f03922bfacf182", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/legacy_pinned_memory_resource.h", "type": "file" }, { - "bom-ref": "e3bc994d217d0aaa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/multimem_ld_reduce.h", + "bom-ref": "82180058aa7daa8e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/memory_resource_base.h", "type": "file" }, { - "bom-ref": "35ea73accd7a7d5c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/multimem_red.h", + "bom-ref": "272fe7b9814242da", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/properties.h", "type": "file" }, { - "bom-ref": "cbd3196906d1e280", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/multimem_st.h", + "bom-ref": "e64e0c6627dbf4f3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/resource.h", "type": "file" }, { - "bom-ref": "7b6eb0c8f5a7b9e5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/prmt.h", + "bom-ref": "5f4b611f7ecff509", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/shared_block_ptr.h", "type": "file" }, { - "bom-ref": "36709ce06a042dd8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/red_async.h", + "bom-ref": "83d24ec6f9b1393b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/shared_resource.h", "type": "file" }, { - "bom-ref": "ab97a34020ba0a5e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/setmaxnreg.h", + "bom-ref": "fb1e4085372dc2a5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__memory_resource/synchronous_resource_adapter.h", "type": "file" }, { - "bom-ref": "736936f20e08f6cd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/shfl_sync.h", + "bom-ref": "805df13ec5d98dfe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/add_overflow.h", "type": "file" }, { - "bom-ref": "558768defe7d57b4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/shl.h", + "bom-ref": "40198ee5958bc732", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/div_overflow.h", "type": "file" }, { - "bom-ref": "82d2c313735329ba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/shr.h", + "bom-ref": "66d8c2357f8ebc1a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/mul_overflow.h", "type": "file" }, { - "bom-ref": "e87a4b1b7cdf05f9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/st.h", + "bom-ref": "24992b3987cd5f5e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/narrow.h", "type": "file" }, { - "bom-ref": "0dd3ef2fc17455c3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/st_async.h", + "bom-ref": "f4dccd565ade7130", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/overflow_cast.h", "type": "file" }, { - "bom-ref": "c2be906593fe6a68", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/st_bulk.h", + "bom-ref": "5ed50e9aabc429a9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/overflow_result.h", "type": "file" }, { - "bom-ref": "ed36a97c757a3470", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_alloc.h", + "bom-ref": "50fc760dd02df409", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/saturating_add_overflow.h", "type": "file" }, { - "bom-ref": "899176f2dc0b2d3e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_commit.h", + "bom-ref": "8c68584529308ac1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/saturating_div_overflow.h", "type": "file" }, { - "bom-ref": "8f4370bae150120f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_cp.h", + "bom-ref": "a7ce361c598b5b91", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/saturating_mul_overflow.h", "type": "file" }, { - "bom-ref": "ad0895999969b695", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_fence.h", + "bom-ref": "4d2a6ac4f8aed2fc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/saturating_overflow_cast.h", "type": "file" }, { - "bom-ref": "0019ba7c5cb33fe8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_ld.h", + "bom-ref": "e20dac556b96d702", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/saturating_sub_overflow.h", "type": "file" }, { - "bom-ref": "0d0f63354fd80fcc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_mma.h", + "bom-ref": "d7568d516408e3ee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__numeric/sub_overflow.h", "type": "file" }, { - "bom-ref": "8bd58ad5f0b46293", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_mma_ws.h", + "bom-ref": "141014bfdf9d2042", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__nvtx/nvtx.h", "type": "file" }, { - "bom-ref": "0135a4a92bc1d1ed", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_shift.h", + "bom-ref": "e1f5403b239c5f3b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__nvtx/nvtx3.h", "type": "file" }, { - "bom-ref": "145394763d67ee52", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_st.h", + "bom-ref": "2b9e2fedddcbcf3a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/applypriority_async_bulk.h", "type": "file" }, { - "bom-ref": "aae940e4f333f780", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_wait.h", + "bom-ref": "8208780351aa1d79", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/barrier_cluster.h", "type": "file" }, { - "bom-ref": "07dcb7590c39ca3c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tensormap_cp_fenceproxy.h", + "bom-ref": "9b05c06f7124c21c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/bfind.h", "type": "file" }, { - "bom-ref": "66215159c3bea64b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tensormap_replace.h", + "bom-ref": "e29de95b4234eefa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/bmsk.h", "type": "file" }, { - "bom-ref": "c3e435102c08985e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/trap.h", + "bom-ref": "28339de8e24edc56", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/clusterlaunchcontrol.h", "type": "file" }, { - "bom-ref": "9af69a7f5bb88a1d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/pragmas/enable_smem_spilling.h", + "bom-ref": "77ff07a851eee4db", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_bulk.h", "type": "file" }, { - "bom-ref": "c8ed67e3b1ccdf92", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/ptx_dot_variants.h", + "bom-ref": "e2f0f6f7e53ecd6c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_bulk_commit_group.h", "type": "file" }, { - "bom-ref": "086a9e01e2477312", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__ptx/ptx_helper_functions.h", + "bom-ref": "aebac5c9a57b8182", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_bulk_prefetch.h", "type": "file" }, { - "bom-ref": "aa9c3d9fd197476b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__random/feistel_bijection.h", + "bom-ref": "52d6c860ee2ebc68", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_bulk_prefetch_tensor.h", "type": "file" }, { - "bom-ref": "33d3937b865ec4a4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__random/random_bijection.h", + "bom-ref": "16ad4c7f28583c3b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_bulk_tensor.h", "type": "file" }, { - "bom-ref": "e85eca48b25a03ea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__runtime/api_wrapper.h", + "bom-ref": "1866da89f53ce5b0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_bulk_wait_group.h", "type": "file" }, { - "bom-ref": "5d145acaa0a63b89", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__runtime/ensure_current_context.h", + "bom-ref": "222b89c06565b84f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_mbarrier_arrive.h", "type": "file" }, { - "bom-ref": "e9d0dfb2081a4220", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__runtime/types.h", + "bom-ref": "7af75391dba7f5ca", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_async_mbarrier_arrive_noinc.h", "type": "file" }, { - "bom-ref": "c4e51af9c66314ba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__semaphore/counting_semaphore.h", + "bom-ref": "444ecd346379f56d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_reduce_async_bulk.h", "type": "file" }, { - "bom-ref": "a52f9289e9dd8a77", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__stream/get_stream.h", + "bom-ref": "e8ddfabaa57f52c8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/cp_reduce_async_bulk_tensor.h", "type": "file" }, { - "bom-ref": "8cb474d1c810e129", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__stream/internal_streams.h", + "bom-ref": "23c2bf0eb957522f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/elect_sync.h", "type": "file" }, { - "bom-ref": "34577c10b0e25a33", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__stream/invalid_stream.h", + "bom-ref": "65461de541930e72", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/exit.h", "type": "file" }, { - "bom-ref": "978b55a6e81b52c6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__stream/launch_transform.h", + "bom-ref": "bc8214bcbcba16ae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/fabric_submit.h", "type": "file" }, { - "bom-ref": "1bd2684f85fefe63", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__stream/stream.h", + "bom-ref": "5364ad42e4c8900d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/fabric_try_get.h", "type": "file" }, { - "bom-ref": "b351d5ff04b0831b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__stream/stream_ref.h", + "bom-ref": "c4c4076c11cf83d7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/fabric_try_pullred.h", "type": "file" }, { - "bom-ref": "c47b28fed32b7ae7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__tma/make_tma_descriptor.h", + "bom-ref": "21337b3532b2dd02", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/fabric_try_put.h", "type": "file" }, { - "bom-ref": "36f5528d1a28db08", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__type_traits/is_floating_point.h", + "bom-ref": "b71510bf9558f70d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/fabric_try_red.h", "type": "file" }, { - "bom-ref": "c5a0bdc5fc235e32", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__type_traits/is_instantiable_with.h", + "bom-ref": "b8040110940dd2a3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/fabric_wait.h", "type": "file" }, { - "bom-ref": "ae43a8507176ea7b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__type_traits/is_specialization_of.h", + "bom-ref": "c1fa5b87a2ced6ed", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/fence.h", "type": "file" }, { - "bom-ref": "f4c3567c692da6fb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__type_traits/vector_type.h", + "bom-ref": "4ab5a6ebd20d02b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/applypriority_async_bulk.h", "type": "file" }, { - "bom-ref": "4c9b6cc38b1821a5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/access.h", + "bom-ref": "d84fb00f90d490b1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/barrier_cluster.h", "type": "file" }, { - "bom-ref": "9da44419d9cd7190", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/any_cast.h", + "bom-ref": "2e238f2b60aaad43", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/bfind.h", "type": "file" }, { - "bom-ref": "199b069af3f58067", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_base.h", + "bom-ref": "48d58e3175aa4817", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/bmsk.h", "type": "file" }, { - "bom-ref": "e7345e4a57fdcd13", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_from.h", + "bom-ref": "722f03c6bdd70661", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/clusterlaunchcontrol.h", "type": "file" }, { - "bom-ref": "63feb8016d4c2fec", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_fwd.h", + "bom-ref": "d5180577910da08a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk.h", "type": "file" }, { - "bom-ref": "b9adf065b89e1bef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_ptr.h", + "bom-ref": "acba4bcf90d8ef3a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_commit_group.h", "type": "file" }, { - "bom-ref": "6b05a443daf1819d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_ref.h", + "bom-ref": "274c07bd19967774", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_multicast.h", "type": "file" }, { - "bom-ref": "d46f61b12912ebf6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_value.h", + "bom-ref": "8eb83e9a5e0895e8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_prefetch.h", "type": "file" }, { - "bom-ref": "0c1e00c4168ebc83", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/conversions.h", + "bom-ref": "3356585cff325d27", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_prefetch_tensor.h", "type": "file" }, { - "bom-ref": "069c36b09a7b1524", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/dynamic_any_cast.h", + "bom-ref": "2ea21763351e5c84", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_tensor.h", "type": "file" }, { - "bom-ref": "be74101c7ee76164", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/interfaces.h", + "bom-ref": "cc8773be9fa9cc91", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_tensor_gather_scatter.h", "type": "file" }, { - "bom-ref": "a961854b89a7fa5b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/iset.h", + "bom-ref": "ceb296306669e41b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_tensor_multicast.h", "type": "file" }, { - "bom-ref": "9a76f216a4873bf2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/overrides.h", + "bom-ref": "0a8a6017af6fa103", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_bulk_wait_group.h", "type": "file" }, { - "bom-ref": "e3119daa7d400414", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/rtti.h", + "bom-ref": "58647ce2acf0a245", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_mbarrier_arrive.h", "type": "file" }, { - "bom-ref": "b12ebe261cbab239", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/semiregular.h", + "bom-ref": "ff22c58948f67df4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_async_mbarrier_arrive_noinc.h", "type": "file" }, { - "bom-ref": "758db06d1890af0a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/storage.h", + "bom-ref": "533b4ffb5a79a3c9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_reduce_async_bulk.h", "type": "file" }, { - "bom-ref": "78a2e3d9ca1a319d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/tagged_ptr.h", + "bom-ref": "c2dd8d783928f662", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_reduce_async_bulk_bf16.h", "type": "file" }, { - "bom-ref": "01ad578452f3d5b1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/virtcall.h", + "bom-ref": "109b0648d88d44c6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_reduce_async_bulk_f16.h", "type": "file" }, { - "bom-ref": "4e03adb9ce2bb720", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/virtual_functions.h", + "bom-ref": "8f75a845c006948d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/cp_reduce_async_bulk_tensor.h", "type": "file" }, { - "bom-ref": "92519c33e63dfa23", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/virtual_ptrs.h", + "bom-ref": "fc8b39962cdb6e6c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/elect_sync.h", "type": "file" }, { - "bom-ref": "804f2dda0bbf9021", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/virtual_tables.h", + "bom-ref": "d8c4b1a82335326e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/exit.h", "type": "file" }, { - "bom-ref": "04ef10c53a867087", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/basic_any.h", + "bom-ref": "5d624f2f4fb9594d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fabric_submit.h", "type": "file" }, { - "bom-ref": "f663bce545ee0931", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/immovable.h", + "bom-ref": "329cbcd35ba0f5c5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fabric_try_get.h", "type": "file" }, { - "bom-ref": "adc00a1881690569", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/in_range.h", + "bom-ref": "64788cd977a2c096", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fabric_try_pullred.h", "type": "file" }, { - "bom-ref": "7fdcb0f233082cb5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/inherit.h", + "bom-ref": "517c94f4a9e9a16d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fabric_try_put.h", "type": "file" }, { - "bom-ref": "8da47768ed892307", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/no_init.h", + "bom-ref": "a584b47a53f4ede2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fabric_try_red.h", "type": "file" }, { - "bom-ref": "ed3f822fe6b0f540", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__utility/static_for.h", + "bom-ref": "f0aac6168232fc36", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fabric_wait.h", "type": "file" }, { - "bom-ref": "1d283224b9be4e2f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__warp/lane_mask.h", + "bom-ref": "8be74294ae26f3f5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence.h", "type": "file" }, { - "bom-ref": "aa8902d0d638a077", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__warp/warp_match_all.h", + "bom-ref": "4a12c23b98bffb2f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_mbarrier_init.h", "type": "file" }, { - "bom-ref": "0efd7c7b5c3df295", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/__warp/warp_shuffle.h", + "bom-ref": "9f2af18bd506ecfe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_alias.h", "type": "file" }, { - "bom-ref": "05d646bb3bbbb839", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/access_property", + "bom-ref": "674b3695b9e24997", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_async.h", "type": "file" }, { - "bom-ref": "de0673c03154f7ec", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/algorithm", + "bom-ref": "ef950093164dc56f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_async_generic_sync_restrict.h", "type": "file" }, { - "bom-ref": "d3a9fbb379245275", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/annotated_ptr", + "bom-ref": "ec3a6647d097bcfd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_fabric_fabric_alias.h", "type": "file" }, { - "bom-ref": "fa1346be814e1c0d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/atomic", + "bom-ref": "73dcd842084183f8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_fabric_generic_alias.h", "type": "file" }, { - "bom-ref": "94ebe0e24556204b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/barrier", + "bom-ref": "693cc9e84478e8a4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_generic_fabric_alias.h", "type": "file" }, { - "bom-ref": "ecada0579f5d5a37", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/bit", + "bom-ref": "3757207c504274ad", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_proxy_tensormap_generic.h", "type": "file" }, { - "bom-ref": "a3eb6e4e49491743", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/buffer", + "bom-ref": "f0684346cadd9ea6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/fence_sync_restrict.h", "type": "file" }, { - "bom-ref": "08c354ed994254c6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/cmath", + "bom-ref": "d1ff309d38619c50", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/get_sreg.h", "type": "file" }, { - "bom-ref": "fb4ee9e355012228", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/devices", + "bom-ref": "0e7da33bad522778", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/getctarank.h", "type": "file" }, { - "bom-ref": "a0f8d237036c0827", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/discard_memory", + "bom-ref": "bb3e585c5c828b22", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/ld.h", "type": "file" }, { - "bom-ref": "52bfda0317f095c5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/functional", + "bom-ref": "ca95e4e1c52f2fe7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/ldmatrix.h", "type": "file" }, { - "bom-ref": "61dbf62966fc2126", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/hierarchy", + "bom-ref": "510608eea8ed272e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_arrive.h", "type": "file" }, { - "bom-ref": "6af491811dc23ff4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/iterator", + "bom-ref": "867c55facf8525be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_arrive_drop.h", "type": "file" }, { - "bom-ref": "0e43cab0b56c711e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/latch", + "bom-ref": "88d96470089296b6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_arrive_expect_tx.h", "type": "file" }, { - "bom-ref": "ec24cc70ba6e434c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/launch", + "bom-ref": "280e9ba0e6880699", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_arrive_no_complete.h", "type": "file" }, { - "bom-ref": "8bb4e1be8e3f7195", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/mdspan", + "bom-ref": "187244d0ffb927df", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_check_layout.h", "type": "file" }, { - "bom-ref": "4fb987a4a35ecd5f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/memory", + "bom-ref": "e6676e573e436b56", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_complete_tx.h", "type": "file" }, { - "bom-ref": "f67c8b8a5c867e40", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/memory_pool", + "bom-ref": "9c4e87f6f2c966d7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_expect_tx.h", "type": "file" }, { - "bom-ref": "d4dd2dd07bd27698", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/memory_resource", + "bom-ref": "737a5fdd8f0d03d0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_init.h", "type": "file" }, { - "bom-ref": "e5282033051c04bd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/numeric", + "bom-ref": "0cae9da5ea8373c2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_inval.h", "type": "file" }, { - "bom-ref": "2e1b017dcc4992ed", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/pipeline", + "bom-ref": "7337a20731b52709", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_pending_count.h", "type": "file" }, { - "bom-ref": "3331490c87fa58e4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/ptx", + "bom-ref": "0127b86ef78309ee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_test_wait.h", "type": "file" }, { - "bom-ref": "2a6d9cd79f71bc54", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/semaphore", + "bom-ref": "9d4177cada8eeb5d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_test_wait_parity.h", "type": "file" }, { - "bom-ref": "487fc6529062b9ec", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/adjacent_find.h", + "bom-ref": "7c7b8b553faf7b66", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_try_wait.h", "type": "file" }, { - "bom-ref": "e15303846cf8c0b8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/all_of.h", + "bom-ref": "9fb0e038e56a89a3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/mbarrier_try_wait_parity.h", "type": "file" }, { - "bom-ref": "dac66a775ff11793", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/any_of.h", + "bom-ref": "c866752408421bb4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/multimem_ld_reduce.h", "type": "file" }, { - "bom-ref": "f692a31e00bbe224", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/binary_search.h", + "bom-ref": "9b99250677d9c940", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/multimem_red.h", "type": "file" }, { - "bom-ref": "d33e2e610f434d85", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/clamp.h", + "bom-ref": "f2e12934d427e77a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/multimem_st.h", "type": "file" }, { - "bom-ref": "3f4c1e728b905d77", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/comp.h", + "bom-ref": "b79b2249292fcb0d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/prefetch.h", "type": "file" }, { - "bom-ref": "8a3fa6c5ddbc67cf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/comp_ref_type.h", + "bom-ref": "5b8ea7d170edabe0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/prmt.h", "type": "file" }, { - "bom-ref": "9bc679a8a11a6cc5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/copy.h", + "bom-ref": "e495e4253faf21ed", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/red_async.h", "type": "file" }, { - "bom-ref": "bb26fa005b8f3fe7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/copy_backward.h", + "bom-ref": "326171b038e58fcb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/setmaxnreg.h", "type": "file" }, { - "bom-ref": "5cc5476efcc44c0c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/copy_if.h", + "bom-ref": "33762dff65f6a171", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/shl.h", "type": "file" }, { - "bom-ref": "e58225ef34509216", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/copy_n.h", + "bom-ref": "9580b12c37dafac3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/shr.h", "type": "file" }, { - "bom-ref": "e4e42ea028173d43", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/count.h", + "bom-ref": "813a2d1b047f3a5d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/st.h", "type": "file" }, { - "bom-ref": "f85366a46c4a544e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/count_if.h", + "bom-ref": "a0c9f38898de2883", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/st_async.h", "type": "file" }, { - "bom-ref": "392418af9b03f837", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/equal.h", + "bom-ref": "007f11140a6f85b2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/st_bulk.h", "type": "file" }, { - "bom-ref": "30ac69d08644e1d1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/equal_range.h", + "bom-ref": "9bb6f8af034dd98a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/stmatrix.h", "type": "file" }, { - "bom-ref": "011ee6887a1b3908", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/fill.h", + "bom-ref": "47f75c9f3fe0422f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_alloc.h", "type": "file" }, { - "bom-ref": "5c508a87ab6440e5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/fill_n.h", + "bom-ref": "97cb0435971dbf2b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_commit.h", "type": "file" }, { - "bom-ref": "541cacf07d954bb6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/find.h", + "bom-ref": "1607882cf2a2f9ba", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_cp.h", "type": "file" }, { - "bom-ref": "1f18f621d60a1372", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/find_end.h", + "bom-ref": "47dea24503e3e971", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_fence.h", "type": "file" }, { - "bom-ref": "eeaba4c0e813daef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/find_first_of.h", + "bom-ref": "d8608161e36e7fe7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_ld.h", "type": "file" }, { - "bom-ref": "70d7d1eed422aaf2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/find_if.h", + "bom-ref": "39750e4dce58e878", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_mma.h", "type": "file" }, { - "bom-ref": "b6611eef6cb2ccd2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/find_if_not.h", + "bom-ref": "fc21e96635f6b32e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_mma_sp.h", "type": "file" }, { - "bom-ref": "e3b6c62ff7f0dc9a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/for_each.h", + "bom-ref": "a4b77f59c4643808", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_mma_ws.h", "type": "file" }, { - "bom-ref": "184350c4c510321e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/for_each_n.h", + "bom-ref": "03d60971a82cd574", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_shift.h", "type": "file" }, { - "bom-ref": "03b2c237bf82744a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/generate.h", + "bom-ref": "5f2f326b660f221a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_st.h", "type": "file" }, { - "bom-ref": "ad129fe3d2cd73e9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/generate_n.h", + "bom-ref": "08be6bc542abdefa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tcgen05_wait.h", "type": "file" }, { - "bom-ref": "c6921c7b4f1d39ca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/half_positive.h", + "bom-ref": "779d865e6508a303", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tensormap_cp_fenceproxy.h", "type": "file" }, { - "bom-ref": "0a0e7c5d667d5577", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/in_fun_result.h", + "bom-ref": "59243da27f7875a6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/tensormap_replace.h", "type": "file" }, { - "bom-ref": "724bf4c43ee7675b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/includes.h", + "bom-ref": "5c6c6d8e6ddb005d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/generated/trap.h", "type": "file" }, { - "bom-ref": "8b7c887f2b48521b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/inplace_merge.h", + "bom-ref": "deb9abde6670b6eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/get_sreg.h", "type": "file" }, { - "bom-ref": "0c9d99ea555c866c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_heap.h", + "bom-ref": "421ff4c358cb2380", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/getctarank.h", "type": "file" }, { - "bom-ref": "e68f32698c5f0a20", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_heap_until.h", + "bom-ref": "934461ce70a96935", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/ld.h", "type": "file" }, { - "bom-ref": "13c128b376dff73a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_partitioned.h", + "bom-ref": "4c1aaab739f6fa20", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/ldmatrix.h", "type": "file" }, { - "bom-ref": "ae051bc4c2d00674", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_permutation.h", + "bom-ref": "e0bf22baba6327fd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_arrive.h", "type": "file" }, { - "bom-ref": "36c460692bd42069", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_sorted.h", + "bom-ref": "5fe05faf245f2f6d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_check_layout.h", "type": "file" }, { - "bom-ref": "42825011d6f4962b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_sorted_until.h", + "bom-ref": "6241544c5ec3a5c1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_complete_tx.h", "type": "file" }, { - "bom-ref": "bc45ab84bc084077", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/iter_swap.h", + "bom-ref": "d51112e2e40778bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_expect_tx.h", "type": "file" }, { - "bom-ref": "a78f2ade6b38c8ee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/iterator_operations.h", + "bom-ref": "968aac316f8e030a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_init.h", "type": "file" }, { - "bom-ref": "54afe6eb1225288a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/lexicographical_compare.h", + "bom-ref": "e17100f36ae6830a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_inval.h", "type": "file" }, { - "bom-ref": "c80cae1b5381c724", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/lower_bound.h", + "bom-ref": "497484f270cf5315", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_pending_count.h", "type": "file" }, { - "bom-ref": "290f4f46c2d2d9ed", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/make_heap.h", + "bom-ref": "38d909eb0037b3b6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/mbarrier_wait.h", "type": "file" }, { - "bom-ref": "7e485b6b16c92b5e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/make_projected.h", + "bom-ref": "cbd949d6d9b9a597", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/multimem_ld_reduce.h", "type": "file" }, { - "bom-ref": "2385bb36fe392fa5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/max.h", + "bom-ref": "ce07b840d0023e89", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/multimem_red.h", "type": "file" }, { - "bom-ref": "a3f929ad94e43eb6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/max_element.h", + "bom-ref": "7611f08053b6e1bb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/multimem_st.h", "type": "file" }, { - "bom-ref": "2b4e96fdb66f50d3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/merge.h", + "bom-ref": "65451a9acc0317bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/prefetch.h", "type": "file" }, { - "bom-ref": "c58c6320abb022da", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/min.h", + "bom-ref": "3fbed28b44a0a543", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/prmt.h", "type": "file" }, { - "bom-ref": "d41e74aaa24036a1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/min_element.h", + "bom-ref": "e6e5ebe3bd4ae043", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/red_async.h", "type": "file" }, { - "bom-ref": "b61cd8a5463e7d28", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/minmax.h", + "bom-ref": "b9c62c48ef98699b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/setmaxnreg.h", "type": "file" }, { - "bom-ref": "cf6c2a2076adefdc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/minmax_element.h", + "bom-ref": "8bbc52851428845a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/shfl_sync.h", "type": "file" }, { - "bom-ref": "edb36b82cd362a96", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/mismatch.h", + "bom-ref": "eba0d3b4420b2e1d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/shl.h", "type": "file" }, { - "bom-ref": "d26bdd9919edc386", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/move.h", + "bom-ref": "4731d8a745d704fa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/shr.h", "type": "file" }, { - "bom-ref": "246be8884d034e39", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/move_backward.h", + "bom-ref": "d244be763cb240b2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/st.h", "type": "file" }, { - "bom-ref": "4c0f36524408e55b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/next_permutation.h", + "bom-ref": "6cbbbedafce2232d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/st_async.h", "type": "file" }, { - "bom-ref": "940e8db8c193a2b7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/none_of.h", + "bom-ref": "579048a8dc3105a2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/st_bulk.h", "type": "file" }, { - "bom-ref": "735dd08f21b4ff17", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/nth_element.h", + "bom-ref": "247348ab582520de", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/stmatrix.h", "type": "file" }, { - "bom-ref": "f2dc9d4014b0c819", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/partial_sort.h", + "bom-ref": "22a241c716318dfa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_alloc.h", "type": "file" }, { - "bom-ref": "a3a053a5a3376472", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/partial_sort_copy.h", + "bom-ref": "8103251fe655cdea", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_commit.h", "type": "file" }, { - "bom-ref": "a8f76bd8f022287c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/partition.h", + "bom-ref": "dc0bef4f7b7cd20f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_cp.h", "type": "file" }, { - "bom-ref": "106b567f31984086", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/partition_copy.h", + "bom-ref": "92444f6b3423d350", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_fence.h", "type": "file" }, { - "bom-ref": "f970c4a253037584", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/partition_point.h", + "bom-ref": "7252969321fba749", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_ld.h", "type": "file" }, { - "bom-ref": "07ab50274bbb678b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/pop_heap.h", + "bom-ref": "ba26ca4b89630f85", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_mma.h", "type": "file" }, { - "bom-ref": "2dbca9766d8eb8ea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/prev_permutation.h", + "bom-ref": "14d9228e2cff7649", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_mma_ws.h", "type": "file" }, { - "bom-ref": "dba9d0430c47a8f4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/push_heap.h", + "bom-ref": "1003d2f507578cef", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_shift.h", "type": "file" }, { - "bom-ref": "d56374b7898350e0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_for_each.h", + "bom-ref": "7ce77db154df7692", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_st.h", "type": "file" }, { - "bom-ref": "92421f1dd2032040", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_for_each_n.h", + "bom-ref": "37ac103b60f0602a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tcgen05_wait.h", "type": "file" }, { - "bom-ref": "efdab0ceb6f80ba1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_iterator_concept.h", + "bom-ref": "cbe65018f9069e1f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tensormap_cp_fenceproxy.h", "type": "file" }, { - "bom-ref": "d9552585c51835c3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_min.h", + "bom-ref": "cb20cefff88e10dd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/tensormap_replace.h", "type": "file" }, { - "bom-ref": "300d989bf5e27847", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_min_element.h", + "bom-ref": "79c612a98e6f2d8e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/instructions/trap.h", "type": "file" }, { - "bom-ref": "03480756907eec1d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/remove.h", + "bom-ref": "524504e6de7eb69a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/pragmas/enable_smem_spilling.h", "type": "file" }, { - "bom-ref": "868cafa192365185", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/remove_copy.h", + "bom-ref": "a5d2f79230ad77fe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/ptx_dot_variants.h", "type": "file" }, { - "bom-ref": "cc1dd2cf3f6934ca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/remove_copy_if.h", + "bom-ref": "805944c5f7f72080", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__ptx/ptx_helper_functions.h", "type": "file" }, { - "bom-ref": "bbbe2ce8cb10fa1d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/remove_if.h", + "bom-ref": "3ae09698cde6272d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__random/feistel_bijection.h", "type": "file" }, { - "bom-ref": "ddd7101d4d526f2f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/replace.h", + "bom-ref": "04a5ec0f55c38cda", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__random/pcg_engine.h", "type": "file" }, { - "bom-ref": "7f91d3025d4b677d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/replace_copy.h", + "bom-ref": "9917fd0802d37fc6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__random/random_bijection.h", "type": "file" }, { - "bom-ref": "1a91f800fdb54e2f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/replace_copy_if.h", + "bom-ref": "5fa59cdfde47f1d7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__runtime/api_wrapper.h", "type": "file" }, { - "bom-ref": "35f27e9260da4486", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/replace_if.h", + "bom-ref": "443ecc078cb34405", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__runtime/ensure_current_context.h", "type": "file" }, { - "bom-ref": "b43e96e256594933", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/reverse.h", + "bom-ref": "899654ceedb82a13", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__runtime/types.h", "type": "file" }, { - "bom-ref": "144909674a95535c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/reverse_copy.h", + "bom-ref": "82c5e6c02b2b2d7f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__semaphore/counting_semaphore.h", "type": "file" }, { - "bom-ref": "4c234a082305eb00", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/rotate.h", + "bom-ref": "f94a3f57b85c74a8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__stream/get_stream.h", "type": "file" }, { - "bom-ref": "8fc4b712ca62c291", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/rotate_copy.h", + "bom-ref": "35f6cd23ff32b928", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__stream/internal_streams.h", "type": "file" }, { - "bom-ref": "899ae99cd0e9759b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/sample.h", + "bom-ref": "008b8d372387f8d4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__stream/invalid_stream.h", "type": "file" }, { - "bom-ref": "77fdbe73adb220f4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/search.h", + "bom-ref": "737cd196656c027b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__stream/launch_transform.h", "type": "file" }, { - "bom-ref": "2834d5dd4c384ebf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/search_n.h", + "bom-ref": "63169499b628ffe7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__stream/stream.h", "type": "file" }, { - "bom-ref": "9180b6b0d50ebaa7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/set_difference.h", + "bom-ref": "b6aaa77c95b76c74", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__stream/stream_ref.h", "type": "file" }, { - "bom-ref": "4adfb9a1fcf5023d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/set_intersection.h", + "bom-ref": "3e36cc92d849d730", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__tma/make_tma_descriptor.h", "type": "file" }, { - "bom-ref": "2254958b51e1a38d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/set_symmetric_difference.h", + "bom-ref": "9a6bcf2953b45d5c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__type_traits/is_bitwise_comparable.h", "type": "file" }, { - "bom-ref": "d418c93b222cfaa3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/set_union.h", + "bom-ref": "9fbc139ff30ebc5f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__type_traits/is_floating_point.h", "type": "file" }, { - "bom-ref": "20c765de981bed63", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/shift_left.h", + "bom-ref": "b5029b9a798edb3c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__type_traits/is_instantiable_with.h", "type": "file" }, { - "bom-ref": "43a9219b69c1b2a8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/shift_right.h", + "bom-ref": "7b788ae75432bef9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__type_traits/is_specialization_of.h", "type": "file" }, { - "bom-ref": "1326787027d21896", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/shuffle.h", + "bom-ref": "23b3b8aca0cedc42", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__type_traits/is_trivially_copyable.h", "type": "file" }, { - "bom-ref": "ef82a8581eb55a1a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/sift_down.h", + "bom-ref": "08f32011684c4091", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__type_traits/is_vector_type.h", "type": "file" }, { - "bom-ref": "bbd6138152471c7f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/sort.h", + "bom-ref": "beb9cef6fe4c2a02", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__type_traits/scalar_type.h", "type": "file" }, { - "bom-ref": "c533898909f112e4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/sort_heap.h", + "bom-ref": "efaac38f9d8995e9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__type_traits/vector_size.h", "type": "file" }, { - "bom-ref": "57da22490252c7a2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/stable_partition.h", + "bom-ref": "a0f4fd618003ccdd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__type_traits/vector_type.h", "type": "file" }, { - "bom-ref": "1eda5bc860afa734", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/stable_sort.h", + "bom-ref": "259ebd5aaf8fa47d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/access.h", "type": "file" }, { - "bom-ref": "ab8fdcec8c8a3f26", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/swap_ranges.h", + "bom-ref": "a501c46694e3bb9f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/any_cast.h", "type": "file" }, { - "bom-ref": "8da905c42270b797", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/transform.h", + "bom-ref": "66f824ee981cc87b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_base.h", "type": "file" }, { - "bom-ref": "3380401f0f86c7bb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/unique.h", + "bom-ref": "89cf75cb2d4ecd5c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_from.h", "type": "file" }, { - "bom-ref": "fc07f268412e8224", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/unique_copy.h", + "bom-ref": "e70eab7b140234c0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_fwd.h", "type": "file" }, { - "bom-ref": "29b1a977d4114d7e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/unwrap_iter.h", + "bom-ref": "211bf2f629414e04", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_ptr.h", "type": "file" }, { - "bom-ref": "b7ee761a7b0a7a46", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/unwrap_range.h", + "bom-ref": "482f64946586903b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_ref.h", "type": "file" }, { - "bom-ref": "afa94d9deb007b3f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/upper_bound.h", + "bom-ref": "1735175ad51d920a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/basic_any_value.h", "type": "file" }, { - "bom-ref": "cb3b094be20e0a55", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/api/common.h", + "bom-ref": "f2e11fd815d3abe2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/conversions.h", "type": "file" }, { - "bom-ref": "4d0dfab5da44f058", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/api/owned.h", + "bom-ref": "fa0c1bfab5a01e7d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/dynamic_any_cast.h", "type": "file" }, { - "bom-ref": "dc8a633d4a7b6a52", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/api/reference.h", + "bom-ref": "ce697cd980953b41", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/interfaces.h", "type": "file" }, { - "bom-ref": "d4197134b11f8ffc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions.h", + "bom-ref": "89839fcced7f8017", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/iset.h", "type": "file" }, { - "bom-ref": "1e408f488a480629", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/common.h", + "bom-ref": "ab17e63a878bb93c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/overrides.h", "type": "file" }, { - "bom-ref": "988fda75b23bcae1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/cuda_local.h", + "bom-ref": "37d5d9dce1d2dbc5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/rtti.h", "type": "file" }, { - "bom-ref": "e6fd2ed6077094f4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/cuda_ptx_derived.h", + "bom-ref": "8bb2a526b5fd3dd2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/semiregular.h", "type": "file" }, { - "bom-ref": "869f28b028db2e15", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/cuda_ptx_generated.h", + "bom-ref": "13010bee394ce118", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/storage.h", "type": "file" }, { - "bom-ref": "1059d5fa2c398e1a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/cuda_ptx_generated_helper.h", + "bom-ref": "0773cc950b9b40b9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/tagged_ptr.h", "type": "file" }, { - "bom-ref": "5af2d88630856978", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/host.h", + "bom-ref": "053399e196235bb9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/virtcall.h", "type": "file" }, { - "bom-ref": "7ac69bbf3875aca8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/order.h", + "bom-ref": "3f5eaf9fe6bb2a3b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/virtual_functions.h", "type": "file" }, { - "bom-ref": "882b0e00f9841539", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/platform.h", + "bom-ref": "470a2207b97e2274", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/virtual_ptrs.h", "type": "file" }, { - "bom-ref": "6ffe15327ea360cc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/platform/msvc_to_builtins.h", + "bom-ref": "8a8bfaddfe0c8677", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/__basic_any/virtual_tables.h", "type": "file" }, { - "bom-ref": "042e4073c018baef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/scopes.h", + "bom-ref": "ecd860a961f17b7f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/basic_any.h", "type": "file" }, { - "bom-ref": "a848ceded5d2a582", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types.h", + "bom-ref": "0d7236652df89785", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/immovable.h", "type": "file" }, { - "bom-ref": "b32e5c4e97b83e56", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types/base.h", + "bom-ref": "c87b448e70fbafaf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/in_range.h", "type": "file" }, { - "bom-ref": "40a7cf76bf1ec668", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types/common.h", + "bom-ref": "cc490ca83b310e21", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/inherit.h", "type": "file" }, { - "bom-ref": "ff5c8c894f240c29", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types/locked.h", + "bom-ref": "deeeb8b8e2af6d6f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/no_init.h", "type": "file" }, { - "bom-ref": "9b05c7f38e0ab540", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types/reference.h", + "bom-ref": "e8f8111fd30efd12", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__utility/static_for.h", "type": "file" }, { - "bom-ref": "510f2176bcb80e5f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types/small.h", + "bom-ref": "dcb08627028d1c9a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__warp/lane_mask.h", "type": "file" }, { - "bom-ref": "57e4f5247e33c728", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/wait/notify_wait.h", + "bom-ref": "f01f574345db9212", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__warp/warp_match_all.h", "type": "file" }, { - "bom-ref": "fe5e3139d6db0d55", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__atomic/wait/polling.h", + "bom-ref": "fd402800fb7428f8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/__warp/warp_shuffle.h", "type": "file" }, { - "bom-ref": "74641c122ee0b3d8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__barrier/barrier.h", + "bom-ref": "9971e19bfadfb632", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/access_property", "type": "file" }, { - "bom-ref": "225951845bf71c27", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__barrier/empty_completion.h", + "bom-ref": "664c7334cb1063a8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/algorithm", "type": "file" }, { - "bom-ref": "59389d164afe5923", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__barrier/poll_tester.h", + "bom-ref": "58e86c52929a5165", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/annotated_ptr", "type": "file" }, { - "bom-ref": "53048a0e6db56092", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/bit_cast.h", + "bom-ref": "694c408f38cc683a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/atomic", "type": "file" }, { - "bom-ref": "c0f81bf12050442e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/blsr.h", + "bom-ref": "08565290093387ee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/barrier", "type": "file" }, { - "bom-ref": "0094abb9eac2e135", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/byteswap.h", + "bom-ref": "71348c7e27d79386", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/bit", "type": "file" }, { - "bom-ref": "6540781c2641b028", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/countl.h", + "bom-ref": "37a510b1a0cfb716", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/buffer", "type": "file" }, { - "bom-ref": "36316290ae80f6d4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/countr.h", + "bom-ref": "cdb61e6dc9ac94c8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/cmath", "type": "file" }, { - "bom-ref": "6925f5d54dda6f3c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/endian.h", + "bom-ref": "899f115c3b1921d7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/devices", "type": "file" }, { - "bom-ref": "1539e05d4bdfd605", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/has_single_bit.h", + "bom-ref": "3366813e1f3834ba", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/discard_memory", "type": "file" }, { - "bom-ref": "fe09cfbaa9432706", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/integral.h", + "bom-ref": "6f34c408d3431c3c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/execution", "type": "file" }, { - "bom-ref": "47fe0e689a7540a6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/popcount.h", + "bom-ref": "bb118de1bbd67bf5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/execution.determinism.h", "type": "file" }, { - "bom-ref": "305f04e51562a1c0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/reference.h", + "bom-ref": "c0ffe60d758676e3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/execution.output_ordering.h", "type": "file" }, { - "bom-ref": "9e1b4d8f6e31390d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__bit/rotate.h", + "bom-ref": "687c1cc1eee7cf66", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/execution.policy.h", "type": "file" }, { - "bom-ref": "1391cfec7cfcd3c6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/algorithm_wrapper.h", + "bom-ref": "be327f25966e9a20", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/execution.require.h", "type": "file" }, { - "bom-ref": "547d963a382b989c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/architecture.h", + "bom-ref": "7a92ed586df6006c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/execution.tune.h", "type": "file" }, { - "bom-ref": "bef896af3349c7c5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/assert.h", + "bom-ref": "a4cdbcae9ed67333", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/functional", "type": "file" }, { - "bom-ref": "4dc7bd186d02ca95", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/attributes.h", + "bom-ref": "2a40c894879c4f5f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/hierarchy", "type": "file" }, { - "bom-ref": "f19c178daf4b2ece", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/builtin.h", + "bom-ref": "df80140f587e1912", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/iterator", "type": "file" }, { - "bom-ref": "8fd41ff5edc873ef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/compiler.h", + "bom-ref": "288fe0f7347e1b4c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/latch", "type": "file" }, { - "bom-ref": "65b37d64607fff5e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/cuda_capabilities.h", + "bom-ref": "92726290dbceaf57", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/launch", "type": "file" }, { - "bom-ref": "9cd01514d60f58ed", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/cuda_toolkit.h", + "bom-ref": "1cc010dccd7c4441", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/mdspan", "type": "file" }, { - "bom-ref": "7a56af3e340e3062", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/deprecated.h", + "bom-ref": "27da6a59256ffb36", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/memory", "type": "file" }, { - "bom-ref": "1a071057d97de503", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/diagnostic.h", + "bom-ref": "ef06ef0fa9a89199", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/memory_pool", "type": "file" }, { - "bom-ref": "2c083e86370ad0e9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/dialect.h", + "bom-ref": "ebb73d03eec58371", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/memory_resource", "type": "file" }, { - "bom-ref": "c3ac6dab6f11e06c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/epilogue.h", + "bom-ref": "7ff8af4e8572b3f8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/numeric", "type": "file" }, { - "bom-ref": "f09ef63f1e7bc28f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/exceptions.h", + "bom-ref": "0486d160122d1a24", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/pipeline", "type": "file" }, { - "bom-ref": "a63ce73efb143f52", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/execution_space.h", + "bom-ref": "37a3e8136b8af397", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/ptx", "type": "file" }, { - "bom-ref": "13907cb5e4ff8a61", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/extended_data_types.h", + "bom-ref": "3a15a88ea4202ca0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/random", "type": "file" }, { - "bom-ref": "094e9396f1dc843d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/host_std_lib.h", + "bom-ref": "1c37a7e217475755", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/semaphore", "type": "file" }, { - "bom-ref": "aa7285bd3e347c31", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/is_non_narrowing_convertible.h", + "bom-ref": "67825367ec10ac75", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/adjacent_find.h", "type": "file" }, { - "bom-ref": "d3c2f2e38fbe27bb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/memory_wrapper.h", + "bom-ref": "71ba4e7a2bbe5425", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/all_of.h", "type": "file" }, { - "bom-ref": "48cf7791925be1c5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/numeric_wrapper.h", + "bom-ref": "531ac18ed15aee68", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/any_of.h", "type": "file" }, { - "bom-ref": "041952c25930c7bd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/os.h", + "bom-ref": "ba742c4b09015cea", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/binary_search.h", "type": "file" }, { - "bom-ref": "33b68d503b6085d0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/preprocessor.h", + "bom-ref": "804f54817b0e227b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/clamp.h", "type": "file" }, { - "bom-ref": "8322d3e6338bd460", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/prologue.h", + "bom-ref": "db54016d0a70f853", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/comp.h", "type": "file" }, { - "bom-ref": "9845aeac397c0974", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/ptx_isa.h", + "bom-ref": "fd35147640b36e92", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/comp_ref_type.h", "type": "file" }, { - "bom-ref": "8aab9bde4b4bd9f7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/rtti.h", + "bom-ref": "f62dd9239b7f7a28", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/copy.h", "type": "file" }, { - "bom-ref": "9d7bc0b35a5c2180", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/sequence_access.h", + "bom-ref": "43be5b981eec92e0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/copy_backward.h", "type": "file" }, { - "bom-ref": "b9d2f282bbbdf23d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/system_header.h", + "bom-ref": "56a05f5c76248e22", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/copy_if.h", "type": "file" }, { - "bom-ref": "71af4390460c5c80", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/unreachable.h", + "bom-ref": "9a2423afe79cdaa4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/copy_n.h", "type": "file" }, { - "bom-ref": "50389b5a7590ea0b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/version.h", + "bom-ref": "660b0357d34c036b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/count.h", "type": "file" }, { - "bom-ref": "0b6f12ca19b54f90", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cccl/visibility.h", + "bom-ref": "2f5252bd43a5ea93", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/count_if.h", "type": "file" }, { - "bom-ref": "0da011f5816d1b36", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__charconv/chars_format.h", + "bom-ref": "e0a0ad81df2c8539", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/equal.h", "type": "file" }, { - "bom-ref": "8010babcc79dc9fa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__charconv/from_chars.h", + "bom-ref": "257232561ea0446a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/equal_range.h", "type": "file" }, { - "bom-ref": "8376dbc63296a8d6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__charconv/from_chars_result.h", + "bom-ref": "b7ffe860daca8779", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/fill.h", "type": "file" }, { - "bom-ref": "795b15d8f14de837", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__charconv/to_chars.h", + "bom-ref": "659d7c3f3369c746", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/fill_n.h", "type": "file" }, { - "bom-ref": "14a1996a8c5cffca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__charconv/to_chars_result.h", + "bom-ref": "652f423ad4399350", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/find.h", "type": "file" }, { - "bom-ref": "e4dae200b85d7d99", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__charconv_", + "bom-ref": "3fb0f2caac547b62", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/find_end.h", "type": "file" }, { - "bom-ref": "691b72414b21239b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__chrono/calendar.h", + "bom-ref": "17a6717acbb2729a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/find_first_of.h", "type": "file" }, { - "bom-ref": "3230fa8601f21e95", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__chrono/day.h", + "bom-ref": "c2d9ff57657e1591", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/find_if.h", "type": "file" }, { - "bom-ref": "821d6ad75bee913d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__chrono/duration.h", + "bom-ref": "944808c4b0803b9a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/find_if_not.h", "type": "file" }, { - "bom-ref": "d09153f588947ae8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__chrono/file_clock.h", + "bom-ref": "7ce636578efab2ae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/for_each.h", "type": "file" }, { - "bom-ref": "d19dc632a59ceca7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__chrono/high_resolution_clock.h", + "bom-ref": "bffa8648b669f33c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/for_each_n.h", "type": "file" }, { - "bom-ref": "8fa5970013529191", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__chrono/month.h", + "bom-ref": "60710d94515ccbf0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/generate.h", "type": "file" }, { - "bom-ref": "30b6900806fe44e6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__chrono/steady_clock.h", + "bom-ref": "c7a7893480c424cd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/generate_n.h", "type": "file" }, { - "bom-ref": "d57a7959680e79ca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__chrono/system_clock.h", + "bom-ref": "4df91534dee1a4f2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/half_positive.h", "type": "file" }, { - "bom-ref": "ca2b174ada48fae7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__chrono/time_point.h", + "bom-ref": "bf2ba548e6903534", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/in_fun_result.h", "type": "file" }, { - "bom-ref": "780c46ed9a3fd62f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__chrono/year.h", + "bom-ref": "d83c8af9034dafb5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/includes.h", "type": "file" }, { - "bom-ref": "34a0d2deec7ed85f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/abs.h", + "bom-ref": "4ee1093f023a5991", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/inplace_merge.h", "type": "file" }, { - "bom-ref": "d3df3b1284b9bbd3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/copysign.h", + "bom-ref": "50963a7a3d9d996f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_heap.h", "type": "file" }, { - "bom-ref": "d87f2c9b443f4c42", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/error_functions.h", + "bom-ref": "2623251599147b4d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_heap_until.h", "type": "file" }, { - "bom-ref": "2d15202c0fbac08b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/exponential_functions.h", + "bom-ref": "021aded63e583731", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_partitioned.h", "type": "file" }, { - "bom-ref": "6d696cf87f89e5c3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/fdim.h", + "bom-ref": "436fd8a1d00ba3d6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_permutation.h", "type": "file" }, { - "bom-ref": "e9375c6224a9812d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/fma.h", + "bom-ref": "2a8ef13e6645925e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_sorted.h", "type": "file" }, { - "bom-ref": "51895474dea91197", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/fpclassify.h", + "bom-ref": "4b09ddd20a01e77d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/is_sorted_until.h", "type": "file" }, { - "bom-ref": "baac85d8600ae77a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/gamma.h", + "bom-ref": "f359cfa104ec461a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/iter_swap.h", "type": "file" }, { - "bom-ref": "4066ddf14e169f73", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/hyperbolic_functions.h", + "bom-ref": "4af9ac5cf9910ab5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/iterator_operations.h", "type": "file" }, { - "bom-ref": "4029a96198ee3159", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/hypot.h", + "bom-ref": "025c4eb7cb9e92a8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/lexicographical_compare.h", "type": "file" }, { - "bom-ref": "e693d817d4847453", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/inverse_hyperbolic_functions.h", + "bom-ref": "1c58ba8e38d5ada0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/lower_bound.h", "type": "file" }, { - "bom-ref": "a90ea8780289e94a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/inverse_trigonometric_functions.h", + "bom-ref": "1681ed2bbf29a836", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/make_heap.h", "type": "file" }, { - "bom-ref": "7ecc62cb253d08bf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/isfinite.h", + "bom-ref": "36439625ac33bd44", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/make_projected.h", "type": "file" }, { - "bom-ref": "f1306ee0e05ac656", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/isinf.h", + "bom-ref": "611c0245835dc584", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/max.h", "type": "file" }, { - "bom-ref": "8b333a1201b1752f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/isnan.h", + "bom-ref": "9c8fd1038dd7289b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/max_element.h", "type": "file" }, { - "bom-ref": "d8a4192abfdbefbf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/isnormal.h", + "bom-ref": "da10b2dbce79a119", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/merge.h", "type": "file" }, { - "bom-ref": "f0717b540e46daea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/lerp.h", + "bom-ref": "fa50ab82341c163d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/min.h", "type": "file" }, { - "bom-ref": "92c764f775c7a9c7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/logarithms.h", + "bom-ref": "0807ad7d575874f9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/min_element.h", "type": "file" }, { - "bom-ref": "fd1db27450edd4d4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/min_max.h", + "bom-ref": "16d6e98284b27c5a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/minmax.h", "type": "file" }, { - "bom-ref": "427030eff57d0960", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/modulo.h", + "bom-ref": "0ebf96756807e091", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/minmax_element.h", "type": "file" }, { - "bom-ref": "042bf02dfbb68bf2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/nan.h", + "bom-ref": "08254142c22f9f66", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/mismatch.h", "type": "file" }, { - "bom-ref": "5f1cbae18e482fde", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/remainder.h", + "bom-ref": "9bf0289030323a5c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/move.h", "type": "file" }, { - "bom-ref": "5df50f03bd659d30", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/roots.h", + "bom-ref": "44105dcb4f674785", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/move_backward.h", "type": "file" }, { - "bom-ref": "5ab4efaa3bbc04a5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/rounding_functions.h", + "bom-ref": "96ae6600b7763d95", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/next_permutation.h", "type": "file" }, { - "bom-ref": "adb65609815fef2f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/signbit.h", + "bom-ref": "c1ca334c4b0d4090", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/none_of.h", "type": "file" }, { - "bom-ref": "37abe8587fa13fc4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/traits.h", + "bom-ref": "e37f50d27aa0f606", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/nth_element.h", "type": "file" }, { - "bom-ref": "058b150c3ae01f81", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cmath/trigonometric_functions.h", + "bom-ref": "060cc4f12ef88f6a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/partial_sort.h", "type": "file" }, { - "bom-ref": "b4c19a7431fa8584", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/arg.h", + "bom-ref": "76d3ae0d8a5f3655", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/partial_sort_copy.h", "type": "file" }, { - "bom-ref": "ef04acc0c7f5b3fe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/complex.h", + "bom-ref": "8c9e72569765b3ff", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/partition.h", "type": "file" }, { - "bom-ref": "c33621597eafb6cc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/exponential_functions.h", + "bom-ref": "47eae4ad7294c6d4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/partition_copy.h", "type": "file" }, { - "bom-ref": "a0899fcea8cfc23c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/hyperbolic_functions.h", + "bom-ref": "4048b3e7cae7a6f4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/partition_point.h", "type": "file" }, { - "bom-ref": "119a3b7fb2deb5a5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/inverse_hyperbolic_functions.h", + "bom-ref": "585b2862d0523c25", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/pop_heap.h", "type": "file" }, { - "bom-ref": "29969139cc396774", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/inverse_trigonometric_functions.h", + "bom-ref": "57bed05af811ec93", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/prev_permutation.h", "type": "file" }, { - "bom-ref": "ea27e6c1a25ff1fb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/literals.h", + "bom-ref": "059e0965a9133cee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/push_heap.h", "type": "file" }, { - "bom-ref": "e732f2729de60f99", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/logarithms.h", + "bom-ref": "6a9237fbca2b68b6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_find_if.h", "type": "file" }, { - "bom-ref": "de17d70f44bac7ae", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/math.h", + "bom-ref": "146b569d7c732a90", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_find_if_not.h", "type": "file" }, { - "bom-ref": "04fbfcb1db11f4ec", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/nvbf16.h", + "bom-ref": "daa6f90e8188853f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_for_each.h", "type": "file" }, { - "bom-ref": "91b7fe147db97f3b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/nvfp16.h", + "bom-ref": "0e29dd3cb738801d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_for_each_n.h", "type": "file" }, { - "bom-ref": "be2b929adfbb4084", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/roots.h", + "bom-ref": "ba987a3b0c1d2a5b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_iterator_concept.h", "type": "file" }, { - "bom-ref": "74f4327c6eb89131", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/trigonometric_functions.h", + "bom-ref": "54e65176c6208748", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_min.h", "type": "file" }, { - "bom-ref": "c561554e9478c1bb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/tuple.h", + "bom-ref": "9f8d944d6a0890c4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/ranges_min_element.h", "type": "file" }, { - "bom-ref": "e93232ea864466b7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__complex/vector_support.h", + "bom-ref": "29a9188197d5d405", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/remove.h", "type": "file" }, { - "bom-ref": "dd5e70ecbd141291", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/arithmetic.h", + "bom-ref": "0e4f11da92df2048", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/remove_copy.h", "type": "file" }, { - "bom-ref": "73439ad274373243", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/assignable.h", + "bom-ref": "ee786afca5dc9aa3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/remove_copy_if.h", "type": "file" }, { - "bom-ref": "e4f5df7c18a1d839", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/boolean_testable.h", + "bom-ref": "35a696220d2663f9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/remove_if.h", "type": "file" }, { - "bom-ref": "2e572810a032a0f7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/class_or_enum.h", + "bom-ref": "666f8f00fbe4108d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/replace.h", "type": "file" }, { - "bom-ref": "b1fdb5e1301fc1f1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/common_reference_with.h", + "bom-ref": "67fe1370c6309155", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/replace_copy.h", "type": "file" }, { - "bom-ref": "c829860a8f3a2494", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/common_with.h", + "bom-ref": "f386015e9a7141b2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/replace_copy_if.h", "type": "file" }, { - "bom-ref": "62e66b2b8dcf7b11", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/concept_macros.h", + "bom-ref": "dac15120eadbe044", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/replace_if.h", "type": "file" }, { - "bom-ref": "c5f08657c8c2e3eb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/constructible.h", + "bom-ref": "0e6c56fa67c9dfd7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/reverse.h", "type": "file" }, { - "bom-ref": "70857ab06d56cd00", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/convertible_to.h", + "bom-ref": "b230be1895439564", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/reverse_copy.h", "type": "file" }, { - "bom-ref": "a5668ea9c4681f2e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/copyable.h", + "bom-ref": "b36a9bb8d314f0b2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/rotate.h", "type": "file" }, { - "bom-ref": "d2a51510eea78c0b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/derived_from.h", + "bom-ref": "9d37886dee75fffd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/rotate_copy.h", "type": "file" }, { - "bom-ref": "21eda79f9bfd9e74", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/destructible.h", + "bom-ref": "457c2e904e1cd83a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/sample.h", "type": "file" }, { - "bom-ref": "691bcc5fb7c6be10", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/different_from.h", + "bom-ref": "f2ece824fc871f03", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/search.h", "type": "file" }, { - "bom-ref": "6179c5c91f76d3f0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/equality_comparable.h", + "bom-ref": "9d28fa7172d74002", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/search_n.h", "type": "file" }, { - "bom-ref": "ecffa771617e51b0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/invocable.h", + "bom-ref": "5edf179d6ab70aa7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/set_difference.h", "type": "file" }, { - "bom-ref": "5bedbea71315e4b2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/movable.h", + "bom-ref": "44cfd8f614358712", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/set_intersection.h", "type": "file" }, { - "bom-ref": "11190adf6168cc61", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/predicate.h", + "bom-ref": "904833fee9e02179", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/set_symmetric_difference.h", "type": "file" }, { - "bom-ref": "933f0c6f1b05f176", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/regular.h", + "bom-ref": "2a026326ba312318", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/set_union.h", "type": "file" }, { - "bom-ref": "a86fd430cad2d888", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/relation.h", + "bom-ref": "c62da3bb69a58ebd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/shift_left.h", "type": "file" }, { - "bom-ref": "899b20e3bc90cbbd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/same_as.h", + "bom-ref": "9fd6c533a49f75f6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/shift_right.h", "type": "file" }, { - "bom-ref": "2d835d2214654f3a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/semiregular.h", + "bom-ref": "78c359576b343da8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/shuffle.h", "type": "file" }, { - "bom-ref": "8df8e9b3194a9b40", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/swappable.h", + "bom-ref": "bede71ae5076cc5a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/sift_down.h", "type": "file" }, { - "bom-ref": "4b56a73705e1bd37", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__concepts/totally_ordered.h", + "bom-ref": "8b88841920d1969e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/sort.h", "type": "file" }, { - "bom-ref": "7cd21c094fbb611f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cstddef/byte.h", + "bom-ref": "1f8207a75564c56c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/sort_heap.h", "type": "file" }, { - "bom-ref": "6ed58c51942a06b1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cstddef/types.h", + "bom-ref": "423324cf9ac4c208", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/stable_partition.h", "type": "file" }, { - "bom-ref": "44532763a2d87f5a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cstdlib/abs.h", + "bom-ref": "57338d1f425f9058", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/stable_sort.h", "type": "file" }, { - "bom-ref": "fc3a21070743180d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cstdlib/aligned_alloc.h", + "bom-ref": "eeb2bff7a4f38699", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/swap_ranges.h", "type": "file" }, { - "bom-ref": "efa1fc4bf8b52964", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cstdlib/div.h", + "bom-ref": "32c2bc3dd26984c9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/transform.h", "type": "file" }, { - "bom-ref": "888be5aedc1df8cf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cstdlib/malloc.h", + "bom-ref": "cf7c727d187cacf0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/unique.h", "type": "file" }, { - "bom-ref": "037ef52ab8add9cf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cstring/memcpy.h", + "bom-ref": "947474c599b01e75", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/unique_copy.h", "type": "file" }, { - "bom-ref": "f64a9b99b3578ead", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__cstring/memset.h", + "bom-ref": "60424a01c7a49ca3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/unwrap_iter.h", "type": "file" }, { - "bom-ref": "c1ab8c0dc23ad4b6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__exception/cuda_error.h", + "bom-ref": "67ffd5288ebb03ae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/unwrap_range.h", "type": "file" }, { - "bom-ref": "0005cd11b46633e3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__exception/exception_macros.h", + "bom-ref": "3ad9a884933afbb4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__algorithm/upper_bound.h", "type": "file" }, { - "bom-ref": "b4714af313007bdb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__exception/terminate.h", + "bom-ref": "622daf00241accfa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/api/common.h", "type": "file" }, { - "bom-ref": "e2570abe46a4c5f2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__exception/throw_error.h", + "bom-ref": "3e2211602ea9402f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/api/owned.h", "type": "file" }, { - "bom-ref": "50768759617eb794", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__execution/env.h", + "bom-ref": "b00b54c0469fc359", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/api/reference.h", "type": "file" }, { - "bom-ref": "5c0a197a4f9e675e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__execution/policy.h", + "bom-ref": "55b863fd754b2e37", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions.h", "type": "file" }, { - "bom-ref": "c61ceb5a10baa32c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__expected/bad_expected_access.h", + "bom-ref": "6bc2bdc946f5bc1c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/common.h", "type": "file" }, { - "bom-ref": "f6cbefc48910ea35", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__expected/expected.h", + "bom-ref": "1b0f5b8c83a90926", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/cuda_local.h", "type": "file" }, { - "bom-ref": "bdc387dfefef75a2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__expected/expected_base.h", + "bom-ref": "9e6dd2146bf16400", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/cuda_ptx_derived.h", "type": "file" }, { - "bom-ref": "20bcdb325c3e90dc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__expected/unexpect.h", + "bom-ref": "b94aa5e8bd1b1b4a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/cuda_ptx_generated.h", "type": "file" }, { - "bom-ref": "606808e87f66c86c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__expected/unexpected.h", + "bom-ref": "d4e69028cb1da206", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/cuda_ptx_generated_helper.h", "type": "file" }, { - "bom-ref": "1326b945259b1aba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/arithmetic.h", + "bom-ref": "765fc41581c11b15", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/functions/host.h", "type": "file" }, { - "bom-ref": "e4397fe3a0ca84df", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/cast.h", + "bom-ref": "3b81255f2bca855a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/order.h", "type": "file" }, { - "bom-ref": "3be03a0fe4aad008", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/cccl_fp.h", + "bom-ref": "15427d453ab6a861", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/platform.h", "type": "file" }, { - "bom-ref": "1d61cbf6b063f52f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/common_type.h", + "bom-ref": "28530b4784c1e1b0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/platform/msvc_to_builtins.h", "type": "file" }, { - "bom-ref": "a34709c4e451f7fe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/constants.h", + "bom-ref": "1c63ff7c4d4bb0a5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/scopes.h", "type": "file" }, { - "bom-ref": "7340c822ca22b69b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/conversion_rank_order.h", + "bom-ref": "8e14d80481b22095", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types.h", "type": "file" }, { - "bom-ref": "6db3cae7ec26cb93", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/cuda_fp_types.h", + "bom-ref": "2af4c76253c449fa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types/base.h", "type": "file" }, { - "bom-ref": "ecf16d2c6ae4cefd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/decompose.h", + "bom-ref": "3a198b9bf990522e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types/common.h", "type": "file" }, { - "bom-ref": "a34a783a6dd8ea0e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/format.h", + "bom-ref": "1e4156965ebfb5ad", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types/locked.h", "type": "file" }, { - "bom-ref": "e32283bfa8852b25", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/fp.h", + "bom-ref": "80504dee2c052e4b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types/reference.h", "type": "file" }, { - "bom-ref": "e5c925e65becde2c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/mask.h", + "bom-ref": "54fe80629a6721ae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/types/small.h", "type": "file" }, { - "bom-ref": "012f29350b5b8a50", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/native_type.h", + "bom-ref": "11b88a3930b84c1a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/wait/notify_wait.h", "type": "file" }, { - "bom-ref": "78e7905633daa4b2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/overflow_handler.h", + "bom-ref": "83c534fe93a68314", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__atomic/wait/polling.h", "type": "file" }, { - "bom-ref": "24aa0648e8fecf50", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/properties.h", + "bom-ref": "23ea885e2ef44890", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__barrier/barrier.h", "type": "file" }, { - "bom-ref": "00cfbb2cbeca147a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/storage.h", + "bom-ref": "a150a806524f8f49", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__barrier/empty_completion.h", "type": "file" }, { - "bom-ref": "dae64798a75cd5a3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/traits.h", + "bom-ref": "85744d4b05df9de4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__barrier/poll_tester.h", "type": "file" }, { - "bom-ref": "14f579fe5fb5f6e0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/buffer.h", + "bom-ref": "40575b06ae38ad05", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/bit_cast.h", "type": "file" }, { - "bom-ref": "302e12559bcdeceb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/concepts.h", + "bom-ref": "6ec9a6c302d76a69", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/blsr.h", "type": "file" }, { - "bom-ref": "6ed47a240807f245", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/format_arg.h", + "bom-ref": "3ba1395fc0442e3d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/byteswap.h", "type": "file" }, { - "bom-ref": "1e2fddb84fe997cf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/format_arg_store.h", + "bom-ref": "5ee722e66e878cd0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/countl.h", "type": "file" }, { - "bom-ref": "3be44b12d701e679", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/format_args.h", + "bom-ref": "084c7740ecf7a314", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/countr.h", "type": "file" }, { - "bom-ref": "b86d0d17fa03770e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/format_context.h", + "bom-ref": "9a6d7113a3db75d1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/endian.h", "type": "file" }, { - "bom-ref": "a5625cfadad4559d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/format_error.h", + "bom-ref": "a0222d59906904c0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/has_single_bit.h", "type": "file" }, { - "bom-ref": "cb6dffae55a26f82", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/format_integral.h", + "bom-ref": "78063b9bdac45814", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/integral.h", "type": "file" }, { - "bom-ref": "b3b35a41c5433539", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/format_parse_context.h", + "bom-ref": "f896e06386aca4b7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/popcount.h", "type": "file" }, { - "bom-ref": "d449324dce3f0ba1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/format_spec_parser.h", + "bom-ref": "f999b01dd8f9ce61", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/reference.h", "type": "file" }, { - "bom-ref": "2d350053f7339efd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/formatter.h", + "bom-ref": "e750c6d4b2e5effe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__bit/rotate.h", "type": "file" }, { - "bom-ref": "a49c436e92c8a531", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/bool.h", + "bom-ref": "cc19b7135040d257", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/architecture.h", "type": "file" }, { - "bom-ref": "4824be6919757e5b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/char.h", + "bom-ref": "cd61416a75abf712", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/assert.h", "type": "file" }, { - "bom-ref": "bb17225d2e91c004", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/fp.h", + "bom-ref": "2f485cf42e9304c0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/attributes.h", "type": "file" }, { - "bom-ref": "689dc339ee24f79d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/int.h", + "bom-ref": "7fc815e426cb88cd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/builtin.h", "type": "file" }, { - "bom-ref": "4df29346500595c9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/ptr.h", + "bom-ref": "d70ca941c45c7ed1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/compiler.h", "type": "file" }, { - "bom-ref": "22c60a49e8f708b7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/str.h", + "bom-ref": "de9033951f7491eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/cuda_capabilities.h", "type": "file" }, { - "bom-ref": "4a8f26a206444a88", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/output_utils.h", + "bom-ref": "46bf93be6127e625", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/cuda_toolkit.h", "type": "file" }, { - "bom-ref": "efb357acffe839bc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format/parse_arg_id.h", + "bom-ref": "0ae3860b5161072b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/deprecated.h", "type": "file" }, { - "bom-ref": "e07aa78d4f592c14", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__format_", + "bom-ref": "d444bd45d6c7d9df", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/diagnostic.h", "type": "file" }, { - "bom-ref": "c5efae6df38d22ea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/binary_function.h", + "bom-ref": "c575979a872c0e96", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/dialect.h", "type": "file" }, { - "bom-ref": "1c439028e7de21af", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/binary_negate.h", + "bom-ref": "ae81a15c226fbfdd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/epilogue.h", "type": "file" }, { - "bom-ref": "ca1d65ef722021a6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/bind.h", + "bom-ref": "28bc57384eaa90f6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/exceptions.h", "type": "file" }, { - "bom-ref": "ff28a7442da329fa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/bind_back.h", + "bom-ref": "e424ef7c872fcb86", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/execution_space.h", "type": "file" }, { - "bom-ref": "657938bd337a6f20", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/bind_front.h", + "bom-ref": "25b2c3264e6d360d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/extended_data_types.h", "type": "file" }, { - "bom-ref": "4c481a3ad8175989", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/binder1st.h", + "bom-ref": "65e519cbccaae999", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/host_std_lib.h", "type": "file" }, { - "bom-ref": "5b997d4354c6f1d6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/binder2nd.h", + "bom-ref": "2f7204d31a209fc0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/is_non_narrowing_convertible.h", "type": "file" }, { - "bom-ref": "c66e9f8f6d659f03", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/compose.h", + "bom-ref": "8789a43619b8824a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/os.h", "type": "file" }, { - "bom-ref": "d700e8d473c23870", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/default_searcher.h", + "bom-ref": "1887f0a84de5abdd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/preprocessor.h", "type": "file" }, { - "bom-ref": "19474824eb88206e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/function.h", + "bom-ref": "f596ff1e9ac29d92", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/prologue.h", "type": "file" }, { - "bom-ref": "d8bf905765666ebc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/hash.h", + "bom-ref": "27176b66cb2eaf4c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/ptx_isa.h", "type": "file" }, { - "bom-ref": "fe6c8b7f64bb890a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/identity.h", + "bom-ref": "6b96c88a1ee21483", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/rtti.h", "type": "file" }, { - "bom-ref": "8aea46f074b743fb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/invoke.h", + "bom-ref": "522b20f44b36d037", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/sequence_access.h", "type": "file" }, { - "bom-ref": "d84e8b4dbb44922e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/is_transparent.h", + "bom-ref": "214f8e8ff41741d9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/system_header.h", "type": "file" }, { - "bom-ref": "55f759338dfbff02", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/mem_fn.h", + "bom-ref": "348893c2f2548759", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/unreachable.h", "type": "file" }, { - "bom-ref": "963d0fa8fe3c9b31", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/mem_fun_ref.h", + "bom-ref": "9c175ea05614d124", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/version.h", "type": "file" }, { - "bom-ref": "da87da786cb719c6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/not_fn.h", + "bom-ref": "951be4d667e74330", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cccl/visibility.h", "type": "file" }, { - "bom-ref": "8db15b36b9819d0f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/operations.h", + "bom-ref": "a85dd1bd1a70da75", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__charconv/chars_format.h", "type": "file" }, { - "bom-ref": "ea5bf5985c11e686", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/perfect_forward.h", + "bom-ref": "4399f1b414ce0676", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__charconv/from_chars.h", "type": "file" }, { - "bom-ref": "903719e47bcb4353", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/pointer_to_binary_function.h", + "bom-ref": "ad21cef5dba76234", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__charconv/from_chars_result.h", "type": "file" }, { - "bom-ref": "31b8053aead44742", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/pointer_to_unary_function.h", + "bom-ref": "4c79e17a8e892cc7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__charconv/to_chars.h", "type": "file" }, { - "bom-ref": "f8f4daf90d1ac789", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/ranges_operations.h", + "bom-ref": "c50d26f515a440c2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__charconv/to_chars_result.h", "type": "file" }, { - "bom-ref": "a22c8734c7f41e85", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/reference_wrapper.h", + "bom-ref": "9f769ba7681aea3a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/calendar.h", "type": "file" }, { - "bom-ref": "d56d6fe0a603184d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/unary_function.h", + "bom-ref": "39d73dc4e232f698", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/day.h", "type": "file" }, { - "bom-ref": "bd4768252d47d72b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/unary_negate.h", + "bom-ref": "d5b9ed8817a94e09", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/duration.h", "type": "file" }, { - "bom-ref": "17c7e5cde0d7feb7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/unwrap_ref.h", + "bom-ref": "18b39e327fb825e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/file_clock.h", "type": "file" }, { - "bom-ref": "b9617079e5dde971", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__functional/weak_result_type.h", + "bom-ref": "5298305ddb11c271", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/hh_mm_ss.h", "type": "file" }, { - "bom-ref": "6306ea9c1923fe0c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/allocator.h", + "bom-ref": "cca77887d21c76d0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/high_resolution_clock.h", "type": "file" }, { - "bom-ref": "4b7d18622b976643", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/array.h", + "bom-ref": "afd8804ca4ceb1f3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/literals.h", "type": "file" }, { - "bom-ref": "dda3d8dc43011a63", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/char_traits.h", + "bom-ref": "63034950ee6ac767", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/month.h", "type": "file" }, { - "bom-ref": "e17da9541fa705b4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/complex.h", + "bom-ref": "6a33d6b60746483c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/month_day.h", "type": "file" }, { - "bom-ref": "97de402306577ea6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/expected.h", + "bom-ref": "ec91eb5d3ad02201", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/month_weekday.h", "type": "file" }, { - "bom-ref": "e6764a6a158caab4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/format.h", + "bom-ref": "f2d18a147466de22", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/steady_clock.h", "type": "file" }, { - "bom-ref": "3a86872d46bc8ca1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/fp.h", + "bom-ref": "9720d4112c06e058", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/system_clock.h", "type": "file" }, { - "bom-ref": "9c46377badce06b6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/get.h", + "bom-ref": "109bd9cf195c5f9a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/time_point.h", "type": "file" }, { - "bom-ref": "fdc2449d0be165d9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/hash.h", + "bom-ref": "16e2a6a5bd352445", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/weekday.h", "type": "file" }, { - "bom-ref": "4c48b4d965cf7219", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/ios.h", + "bom-ref": "fef8f40f968fa9d1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/year.h", "type": "file" }, { - "bom-ref": "f980a5dac359696d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/iterator.h", + "bom-ref": "413bd8b286859152", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/year_month.h", "type": "file" }, { - "bom-ref": "f5f27c1a78405916", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/mdspan.h", + "bom-ref": "2d034e1ee76052ab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/year_month_day.h", "type": "file" }, { - "bom-ref": "cbd3af9e13494143", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/memory_resource.h", + "bom-ref": "185113d398f90394", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__chrono/year_month_weekday.h", "type": "file" }, { - "bom-ref": "854bc9576507c5a8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/optional.h", + "bom-ref": "7281cf680e334e31", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/abs.h", "type": "file" }, { - "bom-ref": "bc735588022803f1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/pair.h", + "bom-ref": "e39a18e69d371b04", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/copysign.h", "type": "file" }, { - "bom-ref": "78957810ed4c2410", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/reference_wrapper.h", + "bom-ref": "354de61b17d3f1d6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/error_functions.h", "type": "file" }, { - "bom-ref": "e73dfa1cc58556d1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/span.h", + "bom-ref": "4ce798b2782e9adb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/exponential_functions.h", "type": "file" }, { - "bom-ref": "9ccefd8688b4bbed", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/string.h", + "bom-ref": "c6387686bb81184f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/fdim.h", "type": "file" }, { - "bom-ref": "c5d4421183745cba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/string_view.h", + "bom-ref": "b43fb0124081481e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/fma.h", "type": "file" }, { - "bom-ref": "2f0f3bee86931314", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/subrange.h", + "bom-ref": "07cda91387704848", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/fpclassify.h", "type": "file" }, { - "bom-ref": "4f810191e93e104e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/tuple.h", + "bom-ref": "653d6d9fde32e71e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/gamma.h", "type": "file" }, { - "bom-ref": "50718e44210c900c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/unexpected.h", + "bom-ref": "35f4e4dea3940642", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/hyperbolic_functions.h", "type": "file" }, { - "bom-ref": "0e867a470929e75b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__fwd/variant.h", + "bom-ref": "b642247665d19948", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/hypot.h", "type": "file" }, { - "bom-ref": "eace00fccc1f7088", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__internal/atomic.h", + "bom-ref": "0a900cfea240b216", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/inverse_hyperbolic_functions.h", "type": "file" }, { - "bom-ref": "b9a223faa0e5ebeb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__internal/cpp_dialect.h", + "bom-ref": "c2d407382e329621", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/inverse_trigonometric_functions.h", "type": "file" }, { - "bom-ref": "0dd86b081f3dcc93", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__internal/features.h", + "bom-ref": "28f9d3c05068e35e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/isfinite.h", "type": "file" }, { - "bom-ref": "03375a94ea4daa32", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__internal/namespaces.h", + "bom-ref": "745fcf22591cb5b1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/isinf.h", "type": "file" }, { - "bom-ref": "41a1bed7a614b0c6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__internal/thread_api.h", + "bom-ref": "597398f965621db3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/isnan.h", "type": "file" }, { - "bom-ref": "90fed9397162302e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__internal/version.h", + "bom-ref": "a15b7a291e9a96c1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/isnormal.h", "type": "file" }, { - "bom-ref": "ee7420e1e27ed358", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/access.h", + "bom-ref": "293d4e2e707ae6df", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/lerp.h", "type": "file" }, { - "bom-ref": "a7b3726ad2666e5b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/advance.h", + "bom-ref": "ca950c415a443990", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/logarithms.h", "type": "file" }, { - "bom-ref": "b6d9f6c319505b1a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/back_insert_iterator.h", + "bom-ref": "3ca4244105bf031d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/min_max.h", "type": "file" }, { - "bom-ref": "e5b5a97aa6c4c6db", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/bounded_iter.h", + "bom-ref": "dc85a171a45d5d45", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/modulo.h", "type": "file" }, { - "bom-ref": "213bd822b2793c5d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/concepts.h", + "bom-ref": "c156ec5dcae69d6f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/nan.h", "type": "file" }, { - "bom-ref": "887ca61b063a5166", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/counted_iterator.h", + "bom-ref": "626561a1c721fdc4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/remainder.h", "type": "file" }, { - "bom-ref": "87ba0c6cae6f5177", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/data.h", + "bom-ref": "014a10e4c96d103c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/roots.h", "type": "file" }, { - "bom-ref": "f3925ec8e3d701f9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/default_sentinel.h", + "bom-ref": "9fdc96526149dda0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/rounding_functions.h", "type": "file" }, { - "bom-ref": "aa646e60619fb7e5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/distance.h", + "bom-ref": "b87cc341a0dece25", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/signbit.h", "type": "file" }, { - "bom-ref": "f0d4f57c9c9f914d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/empty.h", + "bom-ref": "e6c4ae539bef190d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/traits.h", "type": "file" }, { - "bom-ref": "7d81d276c263b4b4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/erase_if_container.h", + "bom-ref": "289bb073195c51b7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cmath/trigonometric_functions.h", "type": "file" }, { - "bom-ref": "dd4e663981d8f1b0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/front_insert_iterator.h", + "bom-ref": "27df4270df00cf6b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/arg.h", "type": "file" }, { - "bom-ref": "54ded57ecbbede25", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/incrementable_traits.h", + "bom-ref": "825668251b652817", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/complex.h", "type": "file" }, { - "bom-ref": "969243ecc0604423", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/indirectly_comparable.h", + "bom-ref": "c005bc36de2880fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/exponential_functions.h", "type": "file" }, { - "bom-ref": "5e165259a59bd0cd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/insert_iterator.h", + "bom-ref": "5fe8606f9147085f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/hyperbolic_functions.h", "type": "file" }, { - "bom-ref": "189de19a29edf8a3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/istream_iterator.h", + "bom-ref": "d7dac7f08c453223", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/inverse_hyperbolic_functions.h", "type": "file" }, { - "bom-ref": "dd3df5cfe7005d7b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/istreambuf_iterator.h", + "bom-ref": "e21b7dc89d0bb4e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/inverse_trigonometric_functions.h", "type": "file" }, { - "bom-ref": "09b44b30854203ec", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/iter_move.h", + "bom-ref": "036a7b5a2ace0849", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/literals.h", "type": "file" }, { - "bom-ref": "2947aafd4f165218", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/iter_swap.h", + "bom-ref": "343bbc730f3de9ca", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/logarithms.h", "type": "file" }, { - "bom-ref": "9a7f24013befdcbf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/iterator.h", + "bom-ref": "3c3cfe54b9a2c3dd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/math.h", "type": "file" }, { - "bom-ref": "70347e252f655600", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/iterator_traits.h", + "bom-ref": "abb36504be5eb1e9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/nvbf16.h", "type": "file" }, { - "bom-ref": "252ed87a676b0321", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/mergeable.h", + "bom-ref": "83ff9ab0546e38dd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/nvfp16.h", "type": "file" }, { - "bom-ref": "c22d646ad2d31836", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/move_iterator.h", + "bom-ref": "be3f32888e283fe5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/roots.h", "type": "file" }, { - "bom-ref": "a267d4896f18562d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/move_sentinel.h", + "bom-ref": "fbbc9a17686dcb61", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/trigonometric_functions.h", "type": "file" }, { - "bom-ref": "c6736836553159be", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/next.h", + "bom-ref": "22524aab8e1d557e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/tuple.h", "type": "file" }, { - "bom-ref": "3dc6c40a8f32592b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/ostream_iterator.h", + "bom-ref": "800e00fbef439755", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__complex/vector_support.h", "type": "file" }, { - "bom-ref": "42109a31e6dfc612", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/ostreambuf_iterator.h", + "bom-ref": "343974c791ae000c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/arithmetic.h", "type": "file" }, { - "bom-ref": "dd7e108d0489dc58", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/permutable.h", + "bom-ref": "b878ed74ba74e35b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/assignable.h", "type": "file" }, { - "bom-ref": "d2950a887a5d2dec", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/prev.h", + "bom-ref": "7c83ab55c16c93b3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/boolean_testable.h", "type": "file" }, { - "bom-ref": "07f6deb5b59409e9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/projected.h", + "bom-ref": "f1c44c56a8967d44", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/class_or_enum.h", "type": "file" }, { - "bom-ref": "5b3398d005603c19", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/readable_traits.h", + "bom-ref": "1d528ea256e073cc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/common_reference_with.h", "type": "file" }, { - "bom-ref": "d9f790f64109b84b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/reverse_access.h", + "bom-ref": "6b8d50a0eecdc8e7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/common_with.h", "type": "file" }, { - "bom-ref": "5ec46365ee4c4ca7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/reverse_iterator.h", + "bom-ref": "98355731744a7f3f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/concept_macros.h", "type": "file" }, { - "bom-ref": "4e201127f91c3f11", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/size.h", + "bom-ref": "846c40cc4e5d4613", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/constructible.h", "type": "file" }, { - "bom-ref": "788ebeaec0ae3e8e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/sortable.h", + "bom-ref": "80ef6980858929e3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/convertible_to.h", "type": "file" }, { - "bom-ref": "2480b2d76c02b0cf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/unreachable_sentinel.h", + "bom-ref": "4e2657ca468520cf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/copyable.h", "type": "file" }, { - "bom-ref": "24af1abbe37c71c6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__iterator/wrap_iter.h", + "bom-ref": "14a9bde5c16010ae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/derived_from.h", "type": "file" }, { - "bom-ref": "92d1bc2ec2b3e827", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__latch/latch.h", + "bom-ref": "b4c7588464cacca7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/destructible.h", "type": "file" }, { - "bom-ref": "29f26c5a65d43884", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__limits/numeric_limits.h", + "bom-ref": "69de4a54310cb424", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/different_from.h", "type": "file" }, { - "bom-ref": "04ec504bdb1220da", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__limits/numeric_limits_ext.h", + "bom-ref": "b34df09c47449811", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/equality_comparable.h", "type": "file" }, { - "bom-ref": "6e0a2fc5e8f77c21", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__linalg/conj_if_needed.h", + "bom-ref": "44050f10cbf598df", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/invocable.h", "type": "file" }, { - "bom-ref": "4633f6fbbe3a96bb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__linalg/conjugate_transposed.h", + "bom-ref": "ae6aa7e2cde97968", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/movable.h", "type": "file" }, { - "bom-ref": "055da8fb5e859a8f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__linalg/conjugated.h", + "bom-ref": "fc30efb57826ce7a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/predicate.h", "type": "file" }, { - "bom-ref": "27860d49b83f21ed", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__linalg/scaled.h", + "bom-ref": "b44a9f4b79eaaace", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/regular.h", "type": "file" }, { - "bom-ref": "cbd844483fa3845a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__linalg/transposed.h", + "bom-ref": "30c002c9beb17915", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/relation.h", "type": "file" }, { - "bom-ref": "de6f56a5f1c4c68b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/aligned_accessor.h", + "bom-ref": "ba08adff9d8d3022", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/same_as.h", "type": "file" }, { - "bom-ref": "1b3e7af8c6e162cd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/concepts.h", + "bom-ref": "745d19d33ab98cbe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/semiregular.h", "type": "file" }, { - "bom-ref": "f7ab2b138ffbe226", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/default_accessor.h", + "bom-ref": "8ad7830dfa4139ba", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/swappable.h", "type": "file" }, { - "bom-ref": "c9ac53433a2fa86d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/empty_base.h", + "bom-ref": "222cf3073fb5fb29", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__concepts/totally_ordered.h", "type": "file" }, { - "bom-ref": "240cfe30d068e558", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/extents.h", + "bom-ref": "261bb632451bc6fc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cstddef/byte.h", "type": "file" }, { - "bom-ref": "e133b38bf5eb3209", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/layout_left.h", + "bom-ref": "01afb254b002c971", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cstddef/types.h", "type": "file" }, { - "bom-ref": "ed80d42a9c81fdf3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/layout_right.h", + "bom-ref": "74d57c4e36bbb7fc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cstdlib/abs.h", "type": "file" }, { - "bom-ref": "d6ff17d3dbad5978", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/layout_stride.h", + "bom-ref": "629acff74179bec0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cstdlib/aligned_alloc.h", "type": "file" }, { - "bom-ref": "4f64d2f889f891e2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/mdspan.h", + "bom-ref": "4dccb278f2f7c8b0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cstdlib/div.h", "type": "file" }, { - "bom-ref": "75efe08b59c8562f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/submdspan_extents.h", + "bom-ref": "244ac9d1aed82b09", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cstdlib/malloc.h", "type": "file" }, { - "bom-ref": "9cc9eb31dd09a1bf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/submdspan_helper.h", + "bom-ref": "353a0644921ad57a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cstring/memcpy.h", "type": "file" }, { - "bom-ref": "e2e66ee87a0bad92", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/submdspan_mapping.h", + "bom-ref": "7a7d656e58f7502d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__cstring/memset.h", "type": "file" }, { - "bom-ref": "dbf973444f769ab1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/addressof.h", + "bom-ref": "86f63faf668d8795", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__exception/cuda_error.h", "type": "file" }, { - "bom-ref": "201cdb32b50a3294", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/align.h", + "bom-ref": "702cb70479475cc1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__exception/exception_macros.h", "type": "file" }, { - "bom-ref": "64769c4a3c655445", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocate_at_least.h", + "bom-ref": "64388aff93e292cf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__exception/msg_storage.h", "type": "file" }, { - "bom-ref": "7265ad58507930ef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocation_guard.h", + "bom-ref": "2240c78391803f43", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__exception/terminate.h", "type": "file" }, { - "bom-ref": "d70abc6114052155", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocator.h", + "bom-ref": "9edd6a15a36d22a0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__execution/env.h", "type": "file" }, { - "bom-ref": "b76a88484ab06dd0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocator_arg_t.h", + "bom-ref": "c37ca73d2ec8b78c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__execution/policy.h", "type": "file" }, { - "bom-ref": "6e13e0a9dd44f046", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocator_destructor.h", + "bom-ref": "445fc2f9df4c9bca", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__expected/bad_expected_access.h", "type": "file" }, { - "bom-ref": "b9012453419f7ceb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocator_traits.h", + "bom-ref": "6f14382b69de3047", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__expected/expected.h", "type": "file" }, { - "bom-ref": "cde147a9b4608d2a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/assume_aligned.h", + "bom-ref": "89bf0163ca57e35d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__expected/expected_base.h", "type": "file" }, { - "bom-ref": "12414be9eb5d805b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/builtin_new_allocator.h", + "bom-ref": "e4d17a7a91b40890", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__expected/unexpect.h", "type": "file" }, { - "bom-ref": "a7395e71adc08b7a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/compressed_pair.h", + "bom-ref": "c425fb17d6529732", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__expected/unexpected.h", "type": "file" }, { - "bom-ref": "f0db7eeb762918ef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/construct_at.h", + "bom-ref": "7cda48e91d7a92bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/arithmetic.h", "type": "file" }, { - "bom-ref": "7fb8cd705e450545", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/destruct_n.h", + "bom-ref": "8f0a520f781d3b2a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/cast.h", "type": "file" }, { - "bom-ref": "4b4e741b4239f503", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/is_sufficiently_aligned.h", + "bom-ref": "bda760e161d3374b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/cccl_fp.h", "type": "file" }, { - "bom-ref": "cc6ef1d0acaa156d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/pointer_traits.h", + "bom-ref": "303f45581c19b0dd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/common_type.h", "type": "file" }, { - "bom-ref": "49ef89e56b9a7ad8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/runtime_assume_aligned.h", + "bom-ref": "76d94f9d742ecd18", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/constants.h", "type": "file" }, { - "bom-ref": "3311df18391d9101", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/temporary_buffer.h", + "bom-ref": "931d950844a682a6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/conversion_rank_order.h", "type": "file" }, { - "bom-ref": "5431c4dd83eef043", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/uninitialized_algorithms.h", + "bom-ref": "b0922ca2917ef564", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/cuda_fp_types.h", "type": "file" }, { - "bom-ref": "afd8319c37215bcc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/unique_ptr.h", + "bom-ref": "8fa4270ae738b541", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/decompose.h", "type": "file" }, { - "bom-ref": "a6bfb55b31b9e2e2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/uses_allocator.h", + "bom-ref": "81c3ac6490bba66a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/format.h", "type": "file" }, { - "bom-ref": "834ec24aefb22de7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory/voidify.h", + "bom-ref": "4267637c70133c5f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/fp.h", "type": "file" }, { - "bom-ref": "e36c44e264b18788", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__memory_", + "bom-ref": "6afccbb8a7d08bb8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/mask.h", "type": "file" }, { - "bom-ref": "3f43e5046edc8dd1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__new/allocate.h", + "bom-ref": "a184d43a0d095b11", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/native_type.h", "type": "file" }, { - "bom-ref": "ae129dddb204dd93", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__new/bad_alloc.h", + "bom-ref": "b93e1ad8268e52cf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/overflow_handler.h", "type": "file" }, { - "bom-ref": "6b48ae3641341789", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__new/device_new.h", + "bom-ref": "12f347dc4ddeaed3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/properties.h", "type": "file" }, { - "bom-ref": "9895c858e21d6b77", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__new/launder.h", + "bom-ref": "5f3f34669801a1e5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/storage.h", "type": "file" }, { - "bom-ref": "67e6435a3986f7b3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__new_", + "bom-ref": "fc6f36f8d3840c57", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__floating_point/traits.h", "type": "file" }, { - "bom-ref": "0ae656936fee6538", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/accumulate.h", + "bom-ref": "764ae492c26be7f9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/buffer.h", "type": "file" }, { - "bom-ref": "e84d557934bd63d6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/adjacent_difference.h", + "bom-ref": "418729b96c20bbd7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/concepts.h", "type": "file" }, { - "bom-ref": "72f226b07b7817fb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/exclusive_scan.h", + "bom-ref": "d3f5a9ec0778bd13", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/format_arg.h", "type": "file" }, { - "bom-ref": "571ab11d1170677f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/gcd_lcm.h", + "bom-ref": "93af67dccb4d2850", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/format_arg_store.h", "type": "file" }, { - "bom-ref": "022f00a9ee0560cd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/inclusive_scan.h", + "bom-ref": "d93f5ad3df113e82", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/format_args.h", "type": "file" }, { - "bom-ref": "853bcafa57f3f1fc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/inner_product.h", + "bom-ref": "802cef048bbfab8e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/format_context.h", "type": "file" }, { - "bom-ref": "fbaa1fec1bcdf8c3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/iota.h", + "bom-ref": "b36abbff3c9071b5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/format_error.h", "type": "file" }, { - "bom-ref": "2722ba3307b9ee8c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/midpoint.h", + "bom-ref": "d65be53553e9b57d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/format_integral.h", "type": "file" }, { - "bom-ref": "6c99a2b94f2a1f81", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/partial_sum.h", + "bom-ref": "ab368a241d255352", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/format_parse_context.h", "type": "file" }, { - "bom-ref": "6f600ef42a5161b2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/reduce.h", + "bom-ref": "c66a03b64f6baeb8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/format_spec_parser.h", "type": "file" }, { - "bom-ref": "b4c3ba612a5074f2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/transform_exclusive_scan.h", + "bom-ref": "7527564b52f1db55", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/formatter.h", "type": "file" }, { - "bom-ref": "274aa342a78d9cad", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/transform_inclusive_scan.h", + "bom-ref": "4f5b10249499ba2b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/bool.h", "type": "file" }, { - "bom-ref": "cdc8d7da104bf408", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__numeric/transform_reduce.h", + "bom-ref": "eb8f8177fa8c04ed", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/char.h", "type": "file" }, { - "bom-ref": "d6e68e1521506e77", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__optional/bad_optional_access.h", + "bom-ref": "5890c520a49acc1b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/fp.h", "type": "file" }, { - "bom-ref": "98e9f82b2b85bdc8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__optional/hash.h", + "bom-ref": "deeaaf5499f56b41", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/int.h", "type": "file" }, { - "bom-ref": "66bedfaff7cd3f7c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__optional/make_optional.h", + "bom-ref": "30f3bb33e153eb7e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/ptr.h", "type": "file" }, { - "bom-ref": "e5ea908600c3896c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__optional/nullopt.h", + "bom-ref": "5e0c72724f3d52d3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/formatters/str.h", "type": "file" }, { - "bom-ref": "1dec6fec1f0aeefd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__optional/optional.h", + "bom-ref": "ca905e40d3486e5c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/output_utils.h", "type": "file" }, { - "bom-ref": "63279c84a1324b84", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__optional/optional_base.h", + "bom-ref": "919af48b87face70", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format/parse_arg_id.h", "type": "file" }, { - "bom-ref": "9b8f3f987b029379", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__optional/optional_ref.h", + "bom-ref": "9cc077ec52806274", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__format_", "type": "file" }, { - "bom-ref": "c4375a0dc78d185b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__random/bernoulli_distribution.h", + "bom-ref": "21e46519f8429e39", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/binary_function.h", "type": "file" }, { - "bom-ref": "46a0814941e0659b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__random/generate_canonical.h", + "bom-ref": "b06cd0ffac9f71bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/binary_negate.h", "type": "file" }, { - "bom-ref": "9349991c20b496ec", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__random/is_seed_sequence.h", + "bom-ref": "05459523a9616fa9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/bind.h", "type": "file" }, { - "bom-ref": "1fa99fb5bcd0f717", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__random/is_valid.h", + "bom-ref": "37b1248cc5be99b2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/bind_back.h", "type": "file" }, { - "bom-ref": "be066cbadd92ad0c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__random/linear_congruential_engine.h", + "bom-ref": "d8c78f633d1ea665", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/bind_front.h", "type": "file" }, { - "bom-ref": "0c57f0d2351d55d4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__random/philox_engine.h", + "bom-ref": "de19ee9e292c8159", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/binder1st.h", "type": "file" }, { - "bom-ref": "c2db27227570941f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__random/seed_seq.h", + "bom-ref": "8ad43f037261f97b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/binder2nd.h", "type": "file" }, { - "bom-ref": "67e0de6313cf33de", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__random/uniform_int_distribution.h", + "bom-ref": "181cb5dfeb5ec4b6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/compose.h", "type": "file" }, { - "bom-ref": "7d3bd8ccae87f9d8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__random/uniform_real_distribution.h", + "bom-ref": "c1d0bbc564d39927", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/default_searcher.h", "type": "file" }, { - "bom-ref": "848649e93828f01e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__random_", + "bom-ref": "0013e21f29f998c3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/function.h", "type": "file" }, { - "bom-ref": "ccc12ee67d1ba754", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/access.h", + "bom-ref": "8260433723b633c8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/hash.h", "type": "file" }, { - "bom-ref": "4efc53683713067b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/all.h", + "bom-ref": "8dd1284630f050b9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/identity.h", "type": "file" }, { - "bom-ref": "4757791b175233b3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/compressed_movable_box.h", + "bom-ref": "3235df0607323c39", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/invoke.h", "type": "file" }, { - "bom-ref": "cfe9b32bf88b2a03", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/concepts.h", + "bom-ref": "ddc9867bc90d7ccd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/is_transparent.h", "type": "file" }, { - "bom-ref": "6865eb90d1ca6541", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/counted.h", + "bom-ref": "cefa26434433c221", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/mem_fn.h", "type": "file" }, { - "bom-ref": "ed5ff00b97c827a4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/dangling.h", + "bom-ref": "0e44ea613f80b67f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/mem_fun_ref.h", "type": "file" }, { - "bom-ref": "eee3c9cdc0e4f7bc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/data.h", + "bom-ref": "a104f5603db98efc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/not_fn.h", "type": "file" }, { - "bom-ref": "9d24d6d5087c0227", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/empty.h", + "bom-ref": "f7dad62915bd1baf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/operations.h", "type": "file" }, { - "bom-ref": "7c8222ffa7e09593", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/empty_view.h", + "bom-ref": "e518fb05ffa6f0c7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/operations_traits.h", "type": "file" }, { - "bom-ref": "e3bb0933c8452308", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/enable_borrowed_range.h", + "bom-ref": "ccba39cf8d15f485", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/perfect_forward.h", "type": "file" }, { - "bom-ref": "1251aec6834ad92a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/enable_view.h", + "bom-ref": "64f9a895260b074f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/pointer_to_binary_function.h", "type": "file" }, { - "bom-ref": "6d9dfd0b43f54954", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/from_range.h", + "bom-ref": "7b9131df13b8101c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/pointer_to_unary_function.h", "type": "file" }, { - "bom-ref": "60468bf599193c11", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/iota_view.h", + "bom-ref": "4ddde2527634b205", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/ranges_operations.h", "type": "file" }, { - "bom-ref": "624340a33aae8364", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/movable_box.h", + "bom-ref": "ba319c490cd0402a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/reference_wrapper.h", "type": "file" }, { - "bom-ref": "a4b86b1a1573b08c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/owning_view.h", + "bom-ref": "bdc2bbe41b3034bb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/unary_function.h", "type": "file" }, { - "bom-ref": "a8801130f8cae025", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/range_adaptor.h", + "bom-ref": "08c974210afa76f7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/unary_negate.h", "type": "file" }, { - "bom-ref": "344b88e0323bce14", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/rbegin.h", + "bom-ref": "475c23c7ff8109fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/unwrap_ref.h", "type": "file" }, { - "bom-ref": "3a1d7198eb426880", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/ref_view.h", + "bom-ref": "7aa1724076dd1404", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__functional/weak_result_type.h", "type": "file" }, { - "bom-ref": "c0bf3adbe260b207", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/rend.h", + "bom-ref": "d9ddca6b02e83952", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/allocator.h", "type": "file" }, { - "bom-ref": "8eabcca12281e421", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/repeat_view.h", + "bom-ref": "cf6196b168d17e59", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/array.h", "type": "file" }, { - "bom-ref": "9826a9aa9526898f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/single_view.h", + "bom-ref": "71adc45e1ac71a0f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/char_traits.h", "type": "file" }, { - "bom-ref": "1e550ccc994cff9d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/size.h", + "bom-ref": "f2f0b7b3674c2a06", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/common_iterator.h", "type": "file" }, { - "bom-ref": "09b0fb4b8d021377", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/subrange.h", + "bom-ref": "f720124461249d65", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/complex.h", "type": "file" }, { - "bom-ref": "8ff3a8f2c3769f6b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/take_view.h", + "bom-ref": "f922b2ebd3e140f7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/execution_policy.h", "type": "file" }, { - "bom-ref": "87a4f65b05f89421", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/take_while_view.h", + "bom-ref": "77fd239912d66eac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/expected.h", "type": "file" }, { - "bom-ref": "f1894ce1c8b0fe68", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/transform_view.h", + "bom-ref": "ee52ff1c933e8c42", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/extents.h", "type": "file" }, { - "bom-ref": "6e0ca4e66a38d193", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/unwrap_end.h", + "bom-ref": "f91947bbfd2c3004", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/format.h", "type": "file" }, { - "bom-ref": "186b04fca2c15f2c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/view_interface.h", + "bom-ref": "62da396eb132f31a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/fp.h", "type": "file" }, { - "bom-ref": "95ef3b691b1c83d0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__ranges/views.h", + "bom-ref": "fc7048a185287d6e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/get.h", "type": "file" }, { - "bom-ref": "19908fb4ea53ac9c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__semaphore/atomic_semaphore.h", + "bom-ref": "edf7013eec1a648b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/hash.h", "type": "file" }, { - "bom-ref": "f39156499ae52629", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__semaphore/counting_semaphore.h", + "bom-ref": "0e5267d7f3ecdaf2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/ios.h", "type": "file" }, { - "bom-ref": "2ad007d6d0edd60f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__string/char_traits.h", + "bom-ref": "17160b9c9795d6c1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/iterator.h", "type": "file" }, { - "bom-ref": "ffe17768d43a73d7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__string/constexpr_c_functions.h", + "bom-ref": "1cc3ea2f205e129b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/mdspan.h", "type": "file" }, { - "bom-ref": "dda717d8d5d1a17d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__string/helper_functions.h", + "bom-ref": "bde5c175dd2abe39", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/memory_resource.h", "type": "file" }, { - "bom-ref": "5d4212674ba16650", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__string/string_view.h", + "bom-ref": "af5783076fff7868", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/optional.h", "type": "file" }, { - "bom-ref": "922a775bcdc4ef52", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__string_", + "bom-ref": "a61e60ba3dd46ef3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/pair.h", "type": "file" }, { - "bom-ref": "ad46f7a71101f94b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__system_error/errc.h", + "bom-ref": "e350a982c4000a1f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/reference_wrapper.h", "type": "file" }, { - "bom-ref": "bcde094843fd28e6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__system_error_", + "bom-ref": "dbb87456a6ce663f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/simd.h", "type": "file" }, { - "bom-ref": "223a9f76087e8e0c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__thread/threading_support.h", + "bom-ref": "771cfb733a0c772c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/span.h", "type": "file" }, { - "bom-ref": "77ef10ef04cdb3b6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__thread/threading_support_cuda.h", + "bom-ref": "1dc0c9af6f3dfe32", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/string.h", "type": "file" }, { - "bom-ref": "e63e0d0b3b1f34b5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__thread/threading_support_external.h", + "bom-ref": "4bfbdcab09c54741", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/string_view.h", "type": "file" }, { - "bom-ref": "77cfc70f8a3abf05", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__thread/threading_support_pthread.h", + "bom-ref": "671de54ab125ce8a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/subrange.h", "type": "file" }, { - "bom-ref": "36351ed3c533398f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__thread/threading_support_win32.h", + "bom-ref": "5bb77987114f7cc2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/tuple.h", "type": "file" }, { - "bom-ref": "58a935abd8320528", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/apply.h", + "bom-ref": "06a7e4a48206ac2a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/unexpected.h", "type": "file" }, { - "bom-ref": "3be5cca09c5fbf4c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/get.h", + "bom-ref": "aa0e965cb6f07dc8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__fwd/variant.h", "type": "file" }, { - "bom-ref": "032ab8ca13d0a02d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/ignore.h", + "bom-ref": "07b4c8977d2f12cf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__host_stdlib/algorithm", "type": "file" }, { - "bom-ref": "c9392bbf4b87258c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/make_tuple_types.h", + "bom-ref": "3a4fa62fd52c1064", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__host_stdlib/istream", "type": "file" }, { - "bom-ref": "e05a8c621b61ac2a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/sfinae_helpers.h", + "bom-ref": "1d98dc75dd7b15b4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__host_stdlib/math.h", "type": "file" }, { - "bom-ref": "520178542ac0eaba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/structured_bindings.h", + "bom-ref": "4f926763cf775d2c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__host_stdlib/memory", "type": "file" }, { - "bom-ref": "063d2b41e4f3b35b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tie.h", + "bom-ref": "40abc988230ac645", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__host_stdlib/new", "type": "file" }, { - "bom-ref": "16029e3b0d1a8934", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple.h", + "bom-ref": "36d309f11310354e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__host_stdlib/numeric", "type": "file" }, { - "bom-ref": "81a2af1cdda3096b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_cat.h", + "bom-ref": "6d4716458c8fa909", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__host_stdlib/ostream", "type": "file" }, { - "bom-ref": "04c791241c3c6f55", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_constraints.h", + "bom-ref": "06091ac7d7826575", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__host_stdlib/sstream", "type": "file" }, { - "bom-ref": "4821cb62c078f6ec", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_element.h", + "bom-ref": "f42190a5ed291fc3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__host_stdlib/stdexcept", "type": "file" }, { - "bom-ref": "c2146110e708bab5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_indices.h", + "bom-ref": "237edcbfe49d04fa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__host_stdlib/time.h", "type": "file" }, { - "bom-ref": "2f67a1a7b5708810", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_leaf.h", + "bom-ref": "014dd9cb0717825c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__internal/atomic.h", "type": "file" }, { - "bom-ref": "204115a397276442", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_like.h", + "bom-ref": "f9e57a68bfda6171", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__internal/cpp_dialect.h", "type": "file" }, { - "bom-ref": "3984b8e9e9c30ca3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_like_ext.h", + "bom-ref": "070496313381a7da", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__internal/features.h", "type": "file" }, { - "bom-ref": "6fdf0ce358353999", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_size.h", + "bom-ref": "50e2899cd06584de", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__internal/namespaces.h", "type": "file" }, { - "bom-ref": "2add6b06a7e504f9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_types.h", + "bom-ref": "372c608869d419a2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__internal/pstl_config.h", "type": "file" }, { - "bom-ref": "6163edb897e0e2a3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/vector_types.h", + "bom-ref": "79cb9b36cff8ff9f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__internal/thread_api.h", "type": "file" }, { - "bom-ref": "539b2dd5611f72d2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_const.h", + "bom-ref": "e4348f18ae3190c2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__internal/version.h", "type": "file" }, { - "bom-ref": "2d2d691194ac4b8a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_cv.h", + "bom-ref": "d71d6ef1e861aa2e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/access.h", "type": "file" }, { - "bom-ref": "e9c3bc242ed9fcc5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_lvalue_reference.h", + "bom-ref": "df80bf3e1b1d8926", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/advance.h", "type": "file" }, { - "bom-ref": "c6d7cef43b42446d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_pointer.h", + "bom-ref": "53c40b0fd56c344c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/back_insert_iterator.h", "type": "file" }, { - "bom-ref": "28b28205f7de4462", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_rvalue_reference.h", + "bom-ref": "bd9b46f1cf9ee6c7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/bounded_iter.h", "type": "file" }, { - "bom-ref": "4c0ea94e9a6ecb8f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_volatile.h", + "bom-ref": "fcf5e19260e40642", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/common_iterator.h", "type": "file" }, { - "bom-ref": "1161535364a7648b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/aligned_storage.h", + "bom-ref": "37ab7a9486ba4e50", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/concepts.h", "type": "file" }, { - "bom-ref": "5d32ca87624ff922", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/aligned_union.h", + "bom-ref": "28ff665a4cf71067", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/counted_iterator.h", "type": "file" }, { - "bom-ref": "ed569d432a4d66c4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/alignment_of.h", + "bom-ref": "86d506051424093d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/data.h", "type": "file" }, { - "bom-ref": "a2d7f8b9f7e8063c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/always_false.h", + "bom-ref": "198b88da8b1edcb0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/default_sentinel.h", "type": "file" }, { - "bom-ref": "627518aedca0dae9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/can_extract_key.h", + "bom-ref": "7d9e52fe3a2813b6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/distance.h", "type": "file" }, { - "bom-ref": "ba8e060b23c433cd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/common_reference.h", + "bom-ref": "c5a336b3c016c3f4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/empty.h", "type": "file" }, { - "bom-ref": "00097754b03debd8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/common_type.h", + "bom-ref": "7e33e9159169ac50", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/erase_if_container.h", "type": "file" }, { - "bom-ref": "9a17f233d8713d5b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/conditional.h", + "bom-ref": "501484265d5f787e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/front_insert_iterator.h", "type": "file" }, { - "bom-ref": "60acf59a7397c1bf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/conjunction.h", + "bom-ref": "d8469953b0c44441", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/incrementable_traits.h", "type": "file" }, { - "bom-ref": "dec6569111e23c15", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/copy_cv.h", + "bom-ref": "9faed2ab3a3c69c0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/indirectly_comparable.h", "type": "file" }, { - "bom-ref": "37ae5bbc3a75f287", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/copy_cvref.h", + "bom-ref": "c3955638093aeaca", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/insert_iterator.h", "type": "file" }, { - "bom-ref": "52f591910f116a02", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/decay.h", + "bom-ref": "90560daf5cf4e49f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/istream_iterator.h", "type": "file" }, { - "bom-ref": "375c93e078d4d5fe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/dependent_type.h", + "bom-ref": "004d72c27378681c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/istreambuf_iterator.h", "type": "file" }, { - "bom-ref": "2195bd41fa140479", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/disjunction.h", + "bom-ref": "3d28fc02a5bb6cde", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/iter_move.h", "type": "file" }, { - "bom-ref": "24e2c335c7956a38", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/enable_if.h", + "bom-ref": "a18727ad7e140b65", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/iter_swap.h", "type": "file" }, { - "bom-ref": "9610c19dcb4a2f90", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/extent.h", + "bom-ref": "b98feaa45b1bfc21", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/iterator.h", "type": "file" }, { - "bom-ref": "9d3aaea24c9b00da", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/fold.h", + "bom-ref": "2d1ab267711c8bd1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/iterator_traits.h", "type": "file" }, { - "bom-ref": "b8116d4fe2507c4b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/has_unique_object_representation.h", + "bom-ref": "0075b2ca53fb9ef2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/mergeable.h", "type": "file" }, { - "bom-ref": "f8485ec26e098042", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/has_virtual_destructor.h", + "bom-ref": "6638522fd2634ea7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/move_iterator.h", "type": "file" }, { - "bom-ref": "ee0f7587ff8065d8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/integral_constant.h", + "bom-ref": "26abbd3645cdfc38", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/move_sentinel.h", "type": "file" }, { - "bom-ref": "969d493b941da9a3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_abstract.h", + "bom-ref": "98003a5aab8ac2e8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/next.h", "type": "file" }, { - "bom-ref": "3d61b83665403291", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_aggregate.h", + "bom-ref": "90f5f9845397edb9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/ostream_iterator.h", "type": "file" }, { - "bom-ref": "c2edd52902088ac0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_allocator.h", + "bom-ref": "f23461201847fdd8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/ostreambuf_iterator.h", "type": "file" }, { - "bom-ref": "03b46ce14d0c7ac3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_arithmetic.h", + "bom-ref": "fa537cdf4d66fd7c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/permutable.h", "type": "file" }, { - "bom-ref": "f7706390900580aa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_array.h", + "bom-ref": "d344d145e291faa7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/prev.h", "type": "file" }, { - "bom-ref": "2bbc480db9c5da29", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_assignable.h", + "bom-ref": "5f2afd7029ffef1c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/projected.h", "type": "file" }, { - "bom-ref": "8205554640c344c3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_base_of.h", + "bom-ref": "0f908960848b3e9a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/readable_traits.h", "type": "file" }, { - "bom-ref": "129668fe0745ec07", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_bounded_array.h", + "bom-ref": "bdf8aff9f0c908eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/reverse_access.h", "type": "file" }, { - "bom-ref": "b03838512f2cfca1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_callable.h", + "bom-ref": "a357728964de3536", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/reverse_iterator.h", "type": "file" }, { - "bom-ref": "51ad360468c7af3d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_char_like_type.h", + "bom-ref": "d6d1d78d9169b053", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/size.h", "type": "file" }, { - "bom-ref": "913e2eb7d7a319dc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_class.h", + "bom-ref": "6c7baad80aeedeea", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/sortable.h", "type": "file" }, { - "bom-ref": "b202e646b9069d0a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_comparable.h", + "bom-ref": "1f6dcb819299b497", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/unreachable_sentinel.h", "type": "file" }, { - "bom-ref": "c79065f04b453cf1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_compound.h", + "bom-ref": "77663c9fb9b5d0de", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/variant_like.h", "type": "file" }, { - "bom-ref": "6e24fe92effdc7f7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_const.h", + "bom-ref": "4811c63011455708", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__iterator/wrap_iter.h", "type": "file" }, { - "bom-ref": "2c476cf33aa60d17", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_constant_evaluated.h", + "bom-ref": "bf054dbf717cdcd7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__latch/latch.h", "type": "file" }, { - "bom-ref": "41189a4af8da0e02", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_constructible.h", + "bom-ref": "ab3328a0d3133531", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__limits/numeric_limits.h", "type": "file" }, { - "bom-ref": "d6e9a38cc748a897", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_convertible.h", + "bom-ref": "5801193895b126ce", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__limits/numeric_limits_ext.h", "type": "file" }, { - "bom-ref": "3665a5deaece171e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_copy_assignable.h", + "bom-ref": "423d4246b7d45341", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__linalg/conj_if_needed.h", "type": "file" }, { - "bom-ref": "b8f806298d13579c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_copy_constructible.h", + "bom-ref": "d1637a8f778e2415", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__linalg/conjugate_transposed.h", "type": "file" }, { - "bom-ref": "555d9f173641f5bc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_core_convertible.h", + "bom-ref": "ae0f5cbfa9742a13", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__linalg/conjugated.h", "type": "file" }, { - "bom-ref": "27cb7d7da6bff51c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_corresponding_member.h", + "bom-ref": "9ab84c78745de341", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__linalg/scaled.h", "type": "file" }, { - "bom-ref": "54631cc41532120b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_default_constructible.h", + "bom-ref": "2e2e50b41bd2ae08", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__linalg/transposed.h", "type": "file" }, { - "bom-ref": "c75449e94527b9c3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_destructible.h", + "bom-ref": "3661d4ab536a186a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/aligned_accessor.h", "type": "file" }, { - "bom-ref": "6c885d5ca2bf6a87", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_empty.h", + "bom-ref": "d0cc052c4d4cbe3f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/concepts.h", "type": "file" }, { - "bom-ref": "23c18718fb153f42", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_enum.h", + "bom-ref": "484d3a1861c508d4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/default_accessor.h", "type": "file" }, { - "bom-ref": "a12470d63a76bc6f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_execution_policy.h", + "bom-ref": "ddd2f4b1512e67ee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/empty_base.h", "type": "file" }, { - "bom-ref": "8aefdb8e92b2936c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_extended_arithmetic.h", + "bom-ref": "1dfbd650045836e1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/extents.h", "type": "file" }, { - "bom-ref": "9feccbab5cb89cef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_extended_floating_point.h", + "bom-ref": "e32d54ca7f2b0766", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/layout_left.h", "type": "file" }, { - "bom-ref": "ad9e923554d8067e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_final.h", + "bom-ref": "fa8a46a3183daf71", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/layout_right.h", "type": "file" }, { - "bom-ref": "bfbb709e29d2f572", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_floating_point.h", + "bom-ref": "5cef3c07e4b9db89", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/layout_stride.h", "type": "file" }, { - "bom-ref": "ee97e10653b8798a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_fully_bounded_array.h", + "bom-ref": "2a15ce553f98edcd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/mdspan.h", "type": "file" }, { - "bom-ref": "ec4a48c9589e8cd6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_function.h", + "bom-ref": "cb813085a8266e50", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/submdspan_extents.h", "type": "file" }, { - "bom-ref": "420b3f433e658e95", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_fundamental.h", + "bom-ref": "05fcb4b23fd09a5d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/submdspan_helper.h", "type": "file" }, { - "bom-ref": "3939ff67b703ffe4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_implicitly_default_constructible.h", + "bom-ref": "8bd9930c609ed9f8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__mdspan/submdspan_mapping.h", "type": "file" }, { - "bom-ref": "5fd65c198b18bff1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_integer.h", + "bom-ref": "b23a78ce53053377", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/addressof.h", "type": "file" }, { - "bom-ref": "ecbadfb5dc16e883", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_integral.h", + "bom-ref": "9160f283c094c776", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/align.h", "type": "file" }, { - "bom-ref": "fb5d90618d7454c3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_layout_compatible.h", + "bom-ref": "40907886dbf784eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocate_at_least.h", "type": "file" }, { - "bom-ref": "284300ef2d3afc81", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_literal_type.h", + "bom-ref": "b1d4c084ca218502", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocation_guard.h", "type": "file" }, { - "bom-ref": "50ec07a658e1a9b9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_member_function_pointer.h", + "bom-ref": "fcd119975f0e5f83", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocator.h", "type": "file" }, { - "bom-ref": "f4fc9ac7a7a255e3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_member_object_pointer.h", + "bom-ref": "e29a6f8e808570be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocator_arg_t.h", "type": "file" }, { - "bom-ref": "88cdc63260caefee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_member_pointer.h", + "bom-ref": "9c263e93de968fdd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocator_destructor.h", "type": "file" }, { - "bom-ref": "ca6382dff340b31d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_move_assignable.h", + "bom-ref": "2b148d68dea60f26", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/allocator_traits.h", "type": "file" }, { - "bom-ref": "dd6615658c60f849", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_move_constructible.h", + "bom-ref": "cb8beeaf172b1f29", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/assume_aligned.h", "type": "file" }, { - "bom-ref": "ddc4b481a6cfcb88", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_assignable.h", + "bom-ref": "c534233da2bda804", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/builtin_new_allocator.h", "type": "file" }, { - "bom-ref": "5048a25b1d3e566e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_constructible.h", + "bom-ref": "37bc78fad15d9440", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/compressed_pair.h", "type": "file" }, { - "bom-ref": "1fa95bef6ddfff4e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_convertible.h", + "bom-ref": "7d27f1ea066d8118", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/construct_at.h", "type": "file" }, { - "bom-ref": "7c21a960d058b263", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_copy_assignable.h", + "bom-ref": "0109d39c365b2c26", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/destruct_n.h", "type": "file" }, { - "bom-ref": "fc7e62076c510816", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_copy_constructible.h", + "bom-ref": "f6a038173c81dbac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/is_sufficiently_aligned.h", "type": "file" }, { - "bom-ref": "fbe3d79ede0eddfa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_default_constructible.h", + "bom-ref": "0991e48503a1ea80", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/pointer_traits.h", "type": "file" }, { - "bom-ref": "bc7e0b5ae003c55f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_destructible.h", + "bom-ref": "50e30ae620479860", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/runtime_assume_aligned.h", "type": "file" }, { - "bom-ref": "968c98f47b3c484e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_move_assignable.h", + "bom-ref": "54cd64508f0b2d29", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/temporary_buffer.h", "type": "file" }, { - "bom-ref": "70409d6258747ef4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_move_constructible.h", + "bom-ref": "9bc07f585128be86", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/uninitialized_algorithms.h", "type": "file" }, { - "bom-ref": "e26dbd78f54e1a79", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_null_pointer.h", + "bom-ref": "59e39f2fb8cdf008", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/unique_ptr.h", "type": "file" }, { - "bom-ref": "50c9e334d45d621a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_object.h", + "bom-ref": "f96a7e72f950ce12", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/uses_allocator.h", "type": "file" }, { - "bom-ref": "42d4a5d9dc77ff98", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_one_of.h", + "bom-ref": "36e051732e3f9331", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory/voidify.h", "type": "file" }, { - "bom-ref": "35fc41f8ad7b02b4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_pod.h", + "bom-ref": "a0e86347667f2e07", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__memory_", "type": "file" }, { - "bom-ref": "09ed7eca6dd600dc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_pointer.h", + "bom-ref": "cf0ba00d73184073", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__new/allocate.h", "type": "file" }, { - "bom-ref": "929fdd67819d9438", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_pointer_interconvertible_base_of.h", + "bom-ref": "dc3ebafac5b64267", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__new/device_new.h", "type": "file" }, { - "bom-ref": "7fef950c9d8ed020", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_pointer_interconvertible_with_class.h", + "bom-ref": "848166fb15ebe643", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__new/launder.h", "type": "file" }, { - "bom-ref": "6f1928cd3cd221b8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_polymorphic.h", + "bom-ref": "b903305707e69ab4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__new_", "type": "file" }, { - "bom-ref": "caa42fac3d08eb25", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_primary_template.h", + "bom-ref": "e82a1f65c77e9c3d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/accumulate.h", "type": "file" }, { - "bom-ref": "318e753a16e4ad7f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_reference.h", + "bom-ref": "07567b27f940f982", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/adjacent_difference.h", "type": "file" }, { - "bom-ref": "513c8ecd3d220855", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_referenceable.h", + "bom-ref": "f359428fbcc87e7c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/exclusive_scan.h", "type": "file" }, { - "bom-ref": "ff9407362f9cf907", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_same.h", + "bom-ref": "8672f54d09ebea24", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/gcd_lcm.h", "type": "file" }, { - "bom-ref": "44aae34fdffee081", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_scalar.h", + "bom-ref": "afe2fb6f1553fd27", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/inclusive_scan.h", "type": "file" }, { - "bom-ref": "6bd289352c064d9a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_scoped_enum.h", + "bom-ref": "85d79323ad6e365e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/inner_product.h", "type": "file" }, { - "bom-ref": "50397e42d3f10c16", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_signed.h", + "bom-ref": "97b29a7e93ce6c87", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/iota.h", "type": "file" }, { - "bom-ref": "3f31e37f093a19a5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_signed_integer.h", + "bom-ref": "4e2f1ee8e25b3ccc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/midpoint.h", "type": "file" }, { - "bom-ref": "780aa211534beedd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_standard_layout.h", + "bom-ref": "bc1c0bd5adca8198", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/partial_sum.h", "type": "file" }, { - "bom-ref": "df20bbb3fa871544", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_swappable.h", + "bom-ref": "3f361fd586b9eae5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/reduce.h", "type": "file" }, { - "bom-ref": "216cc15622e087bc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivial.h", + "bom-ref": "903208dab2332650", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/saturating_add.h", "type": "file" }, { - "bom-ref": "17d9b740facf96bf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_assignable.h", + "bom-ref": "13143795b1f33918", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/saturating_cast.h", "type": "file" }, { - "bom-ref": "49c825984a50a0a3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_constructible.h", + "bom-ref": "1d0eca4bfda61a50", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/saturating_div.h", "type": "file" }, { - "bom-ref": "b3330cdc06f2c860", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_copy_assignable.h", + "bom-ref": "456afcc98c5e8967", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/saturating_mul.h", "type": "file" }, { - "bom-ref": "114dd8b67c56ca4e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_copy_constructible.h", + "bom-ref": "572dbe2223130702", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/saturating_sub.h", "type": "file" }, { - "bom-ref": "94ade5e93645e61b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_copyable.h", + "bom-ref": "20df80d7f1db954c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/transform_exclusive_scan.h", "type": "file" }, { - "bom-ref": "70c1e2326b2adddb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_default_constructible.h", + "bom-ref": "62d7498c4a893144", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/transform_inclusive_scan.h", "type": "file" }, { - "bom-ref": "04f6724fda3fcc35", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_destructible.h", + "bom-ref": "4eda51832f48b511", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__numeric/transform_reduce.h", "type": "file" }, { - "bom-ref": "8304fad40b13482f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_move_assignable.h", + "bom-ref": "56737d1451187b18", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__optional/bad_optional_access.h", "type": "file" }, { - "bom-ref": "98e4bb7e7f0b3069", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_move_constructible.h", + "bom-ref": "27d6d447dea740bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__optional/hash.h", "type": "file" }, { - "bom-ref": "75cf9ecf946fd4a2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_unbounded_array.h", + "bom-ref": "cce1c80f8ae63509", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__optional/make_optional.h", "type": "file" }, { - "bom-ref": "d40247672cf7ca23", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_union.h", + "bom-ref": "1f8d1c653f7bda4c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__optional/nullopt.h", "type": "file" }, { - "bom-ref": "ceaa49738c8e7e37", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_unsigned.h", + "bom-ref": "d0ccfc9a4f2c1dec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__optional/optional.h", "type": "file" }, { - "bom-ref": "7b726cad425468c1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_unsigned_integer.h", + "bom-ref": "c04aff162799a2d9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__optional/optional_base.h", "type": "file" }, { - "bom-ref": "a7e814c8afbee307", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_valid_expansion.h", + "bom-ref": "fdb7e6a33afa0419", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__optional/optional_ref.h", "type": "file" }, { - "bom-ref": "74adc865931a6e59", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_void.h", + "bom-ref": "f7af78ce92ff7da7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/adjacent_difference.h", "type": "file" }, { - "bom-ref": "b1e8c34440d84e61", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_volatile.h", + "bom-ref": "991896c549f16202", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/adjacent_find.h", "type": "file" }, { - "bom-ref": "b487c7e14a2a40f4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/lazy.h", + "bom-ref": "b32a0fdfe596dfff", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/all_of.h", "type": "file" }, { - "bom-ref": "21f8464b4dadabb5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/make_const_lvalue_ref.h", + "bom-ref": "56d7d3f3b971cca3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/any_of.h", "type": "file" }, { - "bom-ref": "af8c741852aef723", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/make_nbit_int.h", + "bom-ref": "012a88cc3da7f35b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/copy.h", "type": "file" }, { - "bom-ref": "31710ea6b4a78d64", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/make_signed.h", + "bom-ref": "8573a4460765844e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/copy_if.h", "type": "file" }, { - "bom-ref": "fc32fcc8e7816dfa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/make_unsigned.h", + "bom-ref": "cab3a9f1c5c5f077", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/copy_n.h", "type": "file" }, { - "bom-ref": "e064ce4fa94deee0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/maybe_const.h", + "bom-ref": "071baaa99cc2871d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/count.h", "type": "file" }, { - "bom-ref": "7eed55a6f4238f45", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/nat.h", + "bom-ref": "c5bb1fd8b1a70764", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/count_if.h", "type": "file" }, { - "bom-ref": "934ad4289b886eda", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/negation.h", + "bom-ref": "a53eec5f627a72b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/adjacent_difference.h", "type": "file" }, { - "bom-ref": "0e1acf0f09190911", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/num_bits.h", + "bom-ref": "92a193dccc98759d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/copy_if.h", "type": "file" }, { - "bom-ref": "426d4ef6b9b24e3e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/promote.h", + "bom-ref": "6868aa5f3d27443f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/copy_n.h", "type": "file" }, { - "bom-ref": "5c1df550270883c6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/rank.h", + "bom-ref": "fd39c6c710cc2d23", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/ensure_current_context.h", "type": "file" }, { - "bom-ref": "d7fccfa3f0543ded", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/reference_constructs_from_temporary.h", + "bom-ref": "aca23b3aa5ea64a4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/exclusive_scan.h", "type": "file" }, { - "bom-ref": "527889ed428e0d05", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/reference_converts_from_temporary.h", + "bom-ref": "e4b6be0c44f9ab4d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/find_if.h", "type": "file" }, { - "bom-ref": "5aca4dddffd12177", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_all_extents.h", + "bom-ref": "c9e3b6e0dc6f59e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/for_each_n.h", "type": "file" }, { - "bom-ref": "c4bbf863461cff34", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_const.h", + "bom-ref": "54d182fc7e133bd1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/generate_n.h", "type": "file" }, { - "bom-ref": "166c5ae16aae21ef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_const_ref.h", + "bom-ref": "5743196ece46e7ec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/inclusive_scan.h", "type": "file" }, { - "bom-ref": "696f4a09f5fdef22", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_cv.h", + "bom-ref": "cbb07bf3d968eaba", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/max_element.h", "type": "file" }, { - "bom-ref": "334bc89ff7e07904", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_cvref.h", + "bom-ref": "d3d98a0393cfbf1e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/merge.h", "type": "file" }, { - "bom-ref": "92a9492f814e9280", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_extent.h", + "bom-ref": "66658b54ee401557", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/min_element.h", "type": "file" }, { - "bom-ref": "5860634fb96134d1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_pointer.h", + "bom-ref": "25ae8eef95a624e8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/partition.h", "type": "file" }, { - "bom-ref": "b57c02da8948fdf8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_reference.h", + "bom-ref": "22abf984514a6358", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/partition_copy.h", "type": "file" }, { - "bom-ref": "3164dbb10f1b35cc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_volatile.h", + "bom-ref": "dbb6f891e819af50", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/reduce.h", "type": "file" }, { - "bom-ref": "a1ad6e598ab365c4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/result_of.h", + "bom-ref": "a6d2bccf4542abc0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/remove_if.h", "type": "file" }, { - "bom-ref": "44be0f905f6b763b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/type_identity.h", + "bom-ref": "41cbf0ba96c56417", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/rotate.h", "type": "file" }, { - "bom-ref": "0ffa8c1782bed6e4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/type_list.h", + "bom-ref": "9f36fe79d497296e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/rotate_copy.h", "type": "file" }, { - "bom-ref": "b1975148c7439217", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/type_set.h", + "bom-ref": "bf4ab15f8872de9d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/shift_left.h", "type": "file" }, { - "bom-ref": "2d3a0d59231ad0e6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/underlying_type.h", + "bom-ref": "e1bdc438ec47da74", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/shift_right.h", "type": "file" }, { - "bom-ref": "29065a816e30403f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/void_t.h", + "bom-ref": "72467d0c9d23739c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/sort.h", "type": "file" }, { - "bom-ref": "7c601f31b91d73df", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/as_const.h", + "bom-ref": "566e5eefc87675b1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/stable_partition.h", "type": "file" }, { - "bom-ref": "ba234d6a89f05f9c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/auto_cast.h", + "bom-ref": "85f0a0ab31d30352", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/temporary_storage.h", "type": "file" }, { - "bom-ref": "a605a974fe2287b5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/cmp.h", + "bom-ref": "818c2d4d7dee6ce5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/transform.h", "type": "file" }, { - "bom-ref": "ac42ea89141dee27", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/convert_to_integral.h", + "bom-ref": "6e28044a28485b11", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/transform_reduce.h", "type": "file" }, { - "bom-ref": "b2120a641c8d2f17", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/ctad_support.h", + "bom-ref": "0c543332b89f25bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/cuda/unique.h", "type": "file" }, { - "bom-ref": "3e04282bda2b628f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/declval.h", + "bom-ref": "7e1910f23513840c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/dispatch.h", "type": "file" }, { - "bom-ref": "7ed88784ba555df5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/delegate_constructors.h", + "bom-ref": "6436eeb1f00adec7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/equal.h", "type": "file" }, { - "bom-ref": "6ec0a07742eef530", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/exception_guard.h", + "bom-ref": "0cd7325cd71ec696", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/exclusive_scan.h", "type": "file" }, { - "bom-ref": "ab393388f62450ba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/exchange.h", + "bom-ref": "0124e962c7e36466", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/fill.h", "type": "file" }, { - "bom-ref": "0444ef843ef54b65", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/forward.h", + "bom-ref": "e08e01370c715fe7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/fill_n.h", "type": "file" }, { - "bom-ref": "e9d4a02b149c2740", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/forward_like.h", + "bom-ref": "7c3574ec5b4d442d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/find.h", "type": "file" }, { - "bom-ref": "d6c6407b60510e26", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/in_place.h", + "bom-ref": "87d8b563e8542779", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/find_if.h", "type": "file" }, { - "bom-ref": "a2b8b32cf5c1b233", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/integer_sequence.h", + "bom-ref": "2330dbd31e58227f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/find_if_not.h", "type": "file" }, { - "bom-ref": "22220ec382e65fe6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/monostate.h", + "bom-ref": "f295fd4eab8f7998", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/for_each.h", "type": "file" }, { - "bom-ref": "832cc9893220da83", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/move.h", + "bom-ref": "193a812ff8993406", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/for_each_n.h", "type": "file" }, { - "bom-ref": "a9d52e7e303a8e6b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/pair.h", + "bom-ref": "e63b2b1101142149", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/generate.h", "type": "file" }, { - "bom-ref": "eb8645e98b41a881", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/piecewise_construct.h", + "bom-ref": "7930758b1015c6e8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/generate_n.h", "type": "file" }, { - "bom-ref": "fc5f3104cf411f62", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/pod_tuple.h", + "bom-ref": "66019e4b3d6f7cc0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/inclusive_scan.h", "type": "file" }, { - "bom-ref": "229be75d3ace00ee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/priority_tag.h", + "bom-ref": "8a964a8876d3bdfe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/is_heap.h", "type": "file" }, { - "bom-ref": "cb14684736aa1f9a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/rel_ops.h", + "bom-ref": "1fa70b6c9c31312a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/is_heap_until.h", "type": "file" }, { - "bom-ref": "e191f340b61f6248", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/swap.h", + "bom-ref": "368fe0a7b0d02cc9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/is_partitioned.h", "type": "file" }, { - "bom-ref": "1f6c0ad17897d43a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/to_underlying.h", + "bom-ref": "086dcc466e0f203f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/is_sorted.h", "type": "file" }, { - "bom-ref": "56b591dd312d9408", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/typeid.h", + "bom-ref": "2b1e8e3535b5f0f2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/is_sorted_until.h", "type": "file" }, { - "bom-ref": "e1c8ae0860606586", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/undefined.h", + "bom-ref": "5347c126934de0a9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/max_element.h", "type": "file" }, { - "bom-ref": "9552b804976083b0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__utility/unreachable.h", + "bom-ref": "28c3dcdbc616e625", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/merge.h", "type": "file" }, { - "bom-ref": "73e518c15f32e06d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/bad_variant_access.h", + "bom-ref": "57d2c4a769c2eef9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/min_element.h", "type": "file" }, { - "bom-ref": "b5acea0383993096", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/comparison.h", + "bom-ref": "d47cac9613a3b0ac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/mismatch.h", "type": "file" }, { - "bom-ref": "acbb5666d9e4bf35", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/get.h", + "bom-ref": "69ca82b1ebc9d158", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/none_of.h", "type": "file" }, { - "bom-ref": "642060b0ddbfc5b5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/hash.h", + "bom-ref": "231fe4252a8d6490", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/partition.h", "type": "file" }, { - "bom-ref": "a8e21e8b74eb54e9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/sfinae_helpers.h", + "bom-ref": "dad14ec4aa20a8ab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/partition_copy.h", "type": "file" }, { - "bom-ref": "d93c5935c6b84529", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant.h", + "bom-ref": "e21c332b9b91c0f6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/reduce.h", "type": "file" }, { - "bom-ref": "96dfbf45817c9c5c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_access.h", + "bom-ref": "5b6222d31d991f5d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/remove.h", "type": "file" }, { - "bom-ref": "7709c690e1670bca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_base.h", + "bom-ref": "4cb6aa0f4458ca19", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/remove_copy.h", "type": "file" }, { - "bom-ref": "f7070470bad07ace", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_constraints.h", + "bom-ref": "8406894f65c5edc2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/remove_copy_if.h", "type": "file" }, { - "bom-ref": "96df9de2d35e613b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_match.h", + "bom-ref": "0347516eaa95e6b3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/remove_if.h", "type": "file" }, { - "bom-ref": "5027758f1c467c61", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_traits.h", + "bom-ref": "f0b0ade1fd8a1f45", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/replace.h", "type": "file" }, { - "bom-ref": "7cce05559ed350aa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_visit.h", + "bom-ref": "5212183aecd581dc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/replace_copy.h", "type": "file" }, { - "bom-ref": "500a70dcce583652", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/__variant/visit.h", + "bom-ref": "0a8d1deae2ed1c05", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/replace_copy_if.h", "type": "file" }, { - "bom-ref": "26e4ba6c28709182", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/algorithm", + "bom-ref": "87d14e4208292f60", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/replace_if.h", "type": "file" }, { - "bom-ref": "5b2ad17a733889d5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/array", + "bom-ref": "f22d8fa5093b8b4c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/reverse.h", "type": "file" }, { - "bom-ref": "1a68e8a9b5f53467", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/atomic", + "bom-ref": "ac5410c4262d44fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/reverse_copy.h", "type": "file" }, { - "bom-ref": "1490334a09a1d2ae", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/barrier", + "bom-ref": "8f1f8ce66667e443", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/rotate.h", "type": "file" }, { - "bom-ref": "dd3daade415a6347", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/bit", + "bom-ref": "0bfb4fdbadde26cb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/rotate_copy.h", "type": "file" }, { - "bom-ref": "741c2eb67e54ec9a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/bitset", + "bom-ref": "ed1451ea68d1b25a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/shift_left.h", "type": "file" }, { - "bom-ref": "fd9afb4c726d1b41", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/cassert", + "bom-ref": "28d140a7eee0def8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/shift_right.h", "type": "file" }, { - "bom-ref": "5a72b176e3bcb150", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/ccomplex", + "bom-ref": "ff8dcfc9bc6ad6c9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/sort.h", "type": "file" }, { - "bom-ref": "262f5f0e2dd61800", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/cfloat", + "bom-ref": "e8368c9164e01aed", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/stable_partition.h", "type": "file" }, { - "bom-ref": "fb291bc608d41514", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/chrono", + "bom-ref": "bceecbc51b479d51", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/swap_ranges.h", "type": "file" }, { - "bom-ref": "0a0d821648e8adc2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/climits", + "bom-ref": "47c5239154139f5f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/transform.h", "type": "file" }, { - "bom-ref": "a5f4d63a3fbf3e1c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/cmath", + "bom-ref": "22afe849ca7b9c4e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/transform_exclusive_scan.h", "type": "file" }, { - "bom-ref": "89f4fb9b73a30c64", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/complex", + "bom-ref": "343752cb3fc13607", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/transform_inclusive_scan.h", "type": "file" }, { - "bom-ref": "cc6b0de891e91822", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/concepts", + "bom-ref": "dc5272340295b2a8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/transform_reduce.h", "type": "file" }, { - "bom-ref": "2f466ca6668b52ad", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/cstddef", + "bom-ref": "c1fff574d9dff781", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/unique.h", "type": "file" }, { - "bom-ref": "3d30398eb6656db9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/cstdint", + "bom-ref": "5c57f8c16535d20a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__pstl/unique_copy.h", "type": "file" }, { - "bom-ref": "38de0319c137d8f4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/cstdlib", + "bom-ref": "e2f81030c172b283", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/bernoulli_distribution.h", "type": "file" }, { - "bom-ref": "a15bc5c5e1bc8f5b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/cstring", + "bom-ref": "d3c3d5eab15e3ad6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/binomial_distribution.h", "type": "file" }, { - "bom-ref": "fbe5fcbd8bb0979c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/ctime", + "bom-ref": "2e011b73a726c878", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/cauchy_distribution.h", "type": "file" }, { - "bom-ref": "5659eae4d8baa779", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/detail/__config", + "bom-ref": "5d3031cfeddb5724", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/chi_squared_distribution.h", "type": "file" }, { - "bom-ref": "e75a8ea0cd32a548", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/detail/libcxx/include/chrono", + "bom-ref": "1cc15569fc946731", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/exponential_distribution.h", "type": "file" }, { - "bom-ref": "daafc728c0b3e142", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/execution", + "bom-ref": "9c972335f7460356", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/extreme_value_distribution.h", "type": "file" }, { - "bom-ref": "202a4bd25f635459", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/expected", + "bom-ref": "84b7b635fce38f47", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/fisher_f_distribution.h", "type": "file" }, { - "bom-ref": "2849ab3b9db5eded", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/functional", + "bom-ref": "a4db31a0be99f5ba", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/gamma_distribution.h", "type": "file" }, { - "bom-ref": "7d8f1259c1e1938b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/initializer_list", + "bom-ref": "da367a50829f4119", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/generate_canonical.h", "type": "file" }, { - "bom-ref": "cb71aa7330a67537", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/inplace_vector", + "bom-ref": "db6d4bfd7033bb67", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/geometric_distribution.h", "type": "file" }, { - "bom-ref": "8f81c393590d1a7f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/iterator", + "bom-ref": "d2d752455d3c2c77", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/is_seed_sequence.h", "type": "file" }, { - "bom-ref": "88766a766064a715", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/latch", + "bom-ref": "f8a6c4391eb1e841", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/is_valid.h", "type": "file" }, { - "bom-ref": "84b91bf10dc55ce6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/limits", + "bom-ref": "739862ee96b69e94", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/linear_congruential_engine.h", "type": "file" }, { - "bom-ref": "0ffe08ca0e27bb4a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/linalg", + "bom-ref": "ebaedfad326baeac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/lognormal_distribution.h", "type": "file" }, { - "bom-ref": "1f6e82eae5374750", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/mdspan", + "bom-ref": "3d142dab56cf4610", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/negative_binomial_distribution.h", "type": "file" }, { - "bom-ref": "549d3207bbde9a19", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/memory", + "bom-ref": "cc213f69edf95c5e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/normal_distribution.h", "type": "file" }, { - "bom-ref": "71b6bd7a471014d3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/numbers", + "bom-ref": "4b36e90a099e0119", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/philox_engine.h", "type": "file" }, { - "bom-ref": "3ebb64ce405f5f3e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/numeric", + "bom-ref": "092a9945645f1b43", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/poisson_distribution.h", "type": "file" }, { - "bom-ref": "6593017bb9f04328", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/optional", + "bom-ref": "eb9815efa3a17ec6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/seed_seq.h", "type": "file" }, { - "bom-ref": "3b5d7879fdc2814f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/ranges", + "bom-ref": "f1e312b32ecc2942", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/student_t_distribution.h", "type": "file" }, { - "bom-ref": "04cc0db86dc2ffd0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/ratio", + "bom-ref": "dccf1c6c191d9a2c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/uniform_int_distribution.h", "type": "file" }, { - "bom-ref": "05061ab59857b0f9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/semaphore", + "bom-ref": "9c3fb1ad52953dc8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/uniform_real_distribution.h", "type": "file" }, { - "bom-ref": "dd3e160262de0f5f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/source_location", + "bom-ref": "1cf2b7a568e323af", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__random/weibull_distribution.h", "type": "file" }, { - "bom-ref": "8d431bfb23a2db77", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/span", + "bom-ref": "f028b375767eabc1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/access.h", "type": "file" }, { - "bom-ref": "922dfe19cba112d7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/string_view", + "bom-ref": "7b76799d7e05002a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/all.h", "type": "file" }, { - "bom-ref": "d493ee11641aab29", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/tuple", + "bom-ref": "4c4bafbccfcb50a7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/common_view.h", "type": "file" }, { - "bom-ref": "b380160bd569d5f4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/type_traits", + "bom-ref": "de57453253f6108d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/compressed_movable_box.h", "type": "file" }, { - "bom-ref": "b518c1a0a675e9a8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/utility", + "bom-ref": "b034be405da3ad71", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/concepts.h", "type": "file" }, { - "bom-ref": "c703102239194754", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/variant", + "bom-ref": "ae37aab94b2114f0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/counted.h", "type": "file" }, { - "bom-ref": "e78379f9b31dc8e1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/std/version", + "bom-ref": "ea552abc793e5010", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/dangling.h", "type": "file" }, { - "bom-ref": "82405f149f9e921d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/stream", + "bom-ref": "f1574f893e9c8f29", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/data.h", "type": "file" }, { - "bom-ref": "7baba3ad5978ba28", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/stream_ref", + "bom-ref": "41158ed20661bbd4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/drop_view.h", "type": "file" }, { - "bom-ref": "075ac7d68bcaa079", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/tma", + "bom-ref": "a1dd312136715276", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/drop_while_view.h", "type": "file" }, { - "bom-ref": "578346dfdcb1b6b8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/type_traits", + "bom-ref": "cae3f5a0f0757cba", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/empty.h", "type": "file" }, { - "bom-ref": "f9bdcf8003c2c8fc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/utility", + "bom-ref": "9b9e9727609206b5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/empty_view.h", "type": "file" }, { - "bom-ref": "46bd0cdec9e875c5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/version", + "bom-ref": "d119acac9c8d6c4c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/enable_borrowed_range.h", "type": "file" }, { - "bom-ref": "eaa7bb2372c827a0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/warp", + "bom-ref": "738064b68a568665", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/enable_view.h", "type": "file" }, { - "bom-ref": "9d6c576c210f9317", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/cuda/work_stealing", + "bom-ref": "6dd0aa987f310c80", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/filter_view.h", "type": "file" }, { - "bom-ref": "5e027664372f049a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/nv/detail/__preprocessor", + "bom-ref": "d6e1465067007bb8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/from_range.h", "type": "file" }, { - "bom-ref": "645e2fe553c9a159", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/nv/detail/__target_macros", + "bom-ref": "94f7d1c56152be3c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/iota_view.h", "type": "file" }, { - "bom-ref": "e5a1bc1abf61d66c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/nv/target", + "bom-ref": "327f4eb22b398541", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/movable_box.h", "type": "file" }, { - "bom-ref": "21dcc0c6551653bc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/addressof.h", + "bom-ref": "c1c0a6cce0c38351", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/non_propagating_cache.h", "type": "file" }, { - "bom-ref": "8d429df15ee105c5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/adjacent_difference.h", + "bom-ref": "943cb7e2d20808e7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/owning_view.h", "type": "file" }, { - "bom-ref": "50b5d29d82d7046b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/advance.h", + "bom-ref": "7d4de64138bad840", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/range_adaptor.h", "type": "file" }, { - "bom-ref": "f359942ccaacfe97", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/allocate_unique.h", + "bom-ref": "f4a1a3720ddd4209", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/rbegin.h", "type": "file" }, { - "bom-ref": "9442307056792bb1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/binary_search.h", + "bom-ref": "329a8b308e72037d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/ref_view.h", "type": "file" }, { - "bom-ref": "85eb458dff074242", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/complex.h", + "bom-ref": "4c41d9c5741f708f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/rend.h", "type": "file" }, { - "bom-ref": "f5b639e37fbe5d50", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/copy.h", + "bom-ref": "8af3b6bb18994118", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/repeat_view.h", "type": "file" }, { - "bom-ref": "54ed7ccc0d746e5e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/count.h", + "bom-ref": "181d7901b0241a75", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/reverse_view.h", "type": "file" }, { - "bom-ref": "854b7b9b3b155e9f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/adjacent_difference.inl", + "bom-ref": "a1de9698fc883efc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/single_view.h", "type": "file" }, { - "bom-ref": "8d8fa80fc0e9c89b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/alignment.h", + "bom-ref": "63808ba7b65bbceb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/size.h", "type": "file" }, { - "bom-ref": "def1db86b0739be8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/allocator/allocator_traits.h", + "bom-ref": "4ec44bc5c66e8a6e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/subrange.h", "type": "file" }, { - "bom-ref": "b7c995455084ad6e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/allocator/copy_construct_range.h", + "bom-ref": "5b50ba7e0e6f7672", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/take_view.h", "type": "file" }, { - "bom-ref": "013c8f9776bd9f15", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/allocator/destroy_range.h", + "bom-ref": "bafe76104d1004a6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/take_while_view.h", "type": "file" }, { - "bom-ref": "553abdd366082c16", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/allocator/fill_construct_range.h", + "bom-ref": "cbf061ee7f739b6d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/transform_view.h", "type": "file" }, { - "bom-ref": "f79084d2f671201d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/allocator/malloc_allocator.h", + "bom-ref": "9bba0ae5650c335e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/unwrap_end.h", "type": "file" }, { - "bom-ref": "b2a2e3e6c545cced", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/allocator/no_throw_allocator.h", + "bom-ref": "88501e213b8a56b9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/view_interface.h", "type": "file" }, { - "bom-ref": "2fc8f2f413e971da", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/allocator/tagged_allocator.h", + "bom-ref": "fb45a88e3996b9be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__ranges/views.h", "type": "file" }, { - "bom-ref": "fc9f33a4bb5bcbd3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/allocator/temporary_allocator.h", + "bom-ref": "cdc49fe26eb5b6d2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__semaphore/atomic_semaphore.h", "type": "file" }, { - "bom-ref": "d20aff7b62882edb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/allocator/value_initialize_range.h", + "bom-ref": "233774842a6b8a5f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__semaphore/counting_semaphore.h", "type": "file" }, { - "bom-ref": "a44bc105256b0ef4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/allocator_aware_execution_policy.h", + "bom-ref": "cab66c5911a346cd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/abi.h", "type": "file" }, { - "bom-ref": "daeaeec36fe641b1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/binary_search.inl", + "bom-ref": "67c41be6e15e7d82", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/basic_mask.h", "type": "file" }, { - "bom-ref": "ad924f96ab6840c7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/caching_allocator.h", + "bom-ref": "1df4dba7e75517c9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/basic_vec.h", "type": "file" }, { - "bom-ref": "a411bb7f7e0c3902", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/arithmetic.h", + "bom-ref": "1915b64c4fefb5b4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/concepts.h", "type": "file" }, { - "bom-ref": "80850889f0015436", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/catrig.h", + "bom-ref": "bad58f76dd173d86", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/exposition.h", "type": "file" }, { - "bom-ref": "4d97af0747780f72", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/catrigf.h", + "bom-ref": "4b84b75a3ffe9796", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/flag.h", "type": "file" }, { - "bom-ref": "f6c4ff4c53b9b6d6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/ccosh.h", + "bom-ref": "f4b56170641be495", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/iterator.h", "type": "file" }, { - "bom-ref": "f33719b5d13f90b8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/ccoshf.h", + "bom-ref": "66561bd1eb238f78", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/reductions.h", "type": "file" }, { - "bom-ref": "c7e1f650754b52dc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/cexp.h", + "bom-ref": "f59eaa96e5a1a5bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/specializations/fixed_size_float_vec.h", "type": "file" }, { - "bom-ref": "5ba9bde15154883c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/cexpf.h", + "bom-ref": "34eb887fbc853fc9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/specializations/fixed_size_mask.h", "type": "file" }, { - "bom-ref": "1a90c1cbcd7304b6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/clog.h", + "bom-ref": "cf5d280fbab15dae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/specializations/fixed_size_storage.h", "type": "file" }, { - "bom-ref": "7a5ef6ded6b34f18", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/clogf.h", + "bom-ref": "7569e237a62a9b8c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/specializations/fixed_size_vec.h", "type": "file" }, { - "bom-ref": "0a9cec4ce787e0b7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/complex.inl", + "bom-ref": "7741d0f80edd2f41", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/specializations/fp32x2_intrinsics.h", "type": "file" }, { - "bom-ref": "c3bd7bc01bcf5b21", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/cpow.h", + "bom-ref": "5bf807052b114c84", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/type_traits.h", "type": "file" }, { - "bom-ref": "d07474d116d91fb0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/cproj.h", + "bom-ref": "192837955e9f3308", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd/utility.h", "type": "file" }, { - "bom-ref": "e9d3f9ec8e3633e0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/csinh.h", + "bom-ref": "5b1e4b7c61d703ab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__simd_", "type": "file" }, { - "bom-ref": "df7af300b30f80dd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/csinhf.h", + "bom-ref": "146f5053945be61f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__string/char_traits.h", "type": "file" }, { - "bom-ref": "3b3eb348b6b50367", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/csqrt.h", + "bom-ref": "eeab4afadf77f0b1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__string/constexpr_c_functions.h", "type": "file" }, { - "bom-ref": "75462142d6461010", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/csqrtf.h", + "bom-ref": "b359153e033bbd26", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__string/helper_functions.h", "type": "file" }, { - "bom-ref": "9754adf945faa73b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/ctanh.h", + "bom-ref": "18aa7e407086cb1b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__string/string_view.h", "type": "file" }, { - "bom-ref": "4e29d5adcf55d65c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/ctanhf.h", + "bom-ref": "9e6b2b0d9da5df16", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__string_", "type": "file" }, { - "bom-ref": "5bc431160d81e2d2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/math_private.h", + "bom-ref": "d59e42957655eaf1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__system_error/errc.h", "type": "file" }, { - "bom-ref": "dd9ff64888dd64d2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/complex/stream.h", + "bom-ref": "1b2f801181104935", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__system_error_", "type": "file" }, { - "bom-ref": "d882ab2f6be8eeef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/config.h", + "bom-ref": "fb2389209ba78db8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__thread/threading_support.h", "type": "file" }, { - "bom-ref": "e3ccdcd9386daa36", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/config/compiler.h", + "bom-ref": "c30f87f66a2be32a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__thread/threading_support_cuda.h", "type": "file" }, { - "bom-ref": "614a2d256bae75e8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/config/config.h", + "bom-ref": "e90e8e8944e6d538", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__thread/threading_support_external.h", "type": "file" }, { - "bom-ref": "f7ecf4e4ce08b94b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/config/cpp_dialect.h", + "bom-ref": "adc28dbcc5bcf17e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__thread/threading_support_pthread.h", "type": "file" }, { - "bom-ref": "e8e44b82f306940b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/config/device_system.h", + "bom-ref": "e5db1902475ab44e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__thread/threading_support_win32.h", "type": "file" }, { - "bom-ref": "f2e9d5fdf741125b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/config/host_system.h", + "bom-ref": "4f615d646b5f117f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/apply.h", "type": "file" }, { - "bom-ref": "50463736776c51d5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/config/memory_resource.h", + "bom-ref": "2f3728c0634b4321", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/get.h", "type": "file" }, { - "bom-ref": "6ea9108717f48b08", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/config/namespace.h", + "bom-ref": "fd289683a54c8e1d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/ignore.h", "type": "file" }, { - "bom-ref": "bc15f627ffe01ce2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/config/simple_defines.h", + "bom-ref": "a564b9926955daef", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/make_tuple_types.h", "type": "file" }, { - "bom-ref": "ce7863902430b30f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/contiguous_storage.h", + "bom-ref": "aa1246d8dd9fc1be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/sfinae_helpers.h", "type": "file" }, { - "bom-ref": "cba54e3a94dad87b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/contiguous_storage.inl", + "bom-ref": "9c275b26b607fc1d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/structured_bindings.h", "type": "file" }, { - "bom-ref": "1592cd37bfb12cd9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/copy.h", + "bom-ref": "4efa60144dca5971", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tie.h", "type": "file" }, { - "bom-ref": "2462f64df5fcb77d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/copy.inl", + "bom-ref": "ff45ef3a98b1adf8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple.h", "type": "file" }, { - "bom-ref": "349ce2a1d03b2f0b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/copy_if.h", + "bom-ref": "ae725f7c9f895232", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_cat.h", "type": "file" }, { - "bom-ref": "825a57cada7b4433", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/copy_if.inl", + "bom-ref": "b43cdf4002e50983", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_constraints.h", "type": "file" }, { - "bom-ref": "96f1dec0be21e9c7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/count.h", + "bom-ref": "3d77773e8796de86", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_element.h", "type": "file" }, { - "bom-ref": "1c6d8c5de6d2e5d9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/count.inl", + "bom-ref": "3bf620e2c293580b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_indices.h", "type": "file" }, { - "bom-ref": "70b24089bd7009a4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/device_ptr.inl", + "bom-ref": "dea1f9334860c637", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_leaf.h", "type": "file" }, { - "bom-ref": "d9ae35e4edf4a969", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/equal.inl", + "bom-ref": "8b429476ec8a11f5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_like.h", "type": "file" }, { - "bom-ref": "fff444617f452a0c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/event_error.h", + "bom-ref": "5ebe183218cda671", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_like_ext.h", "type": "file" }, { - "bom-ref": "eb9455233fb49946", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/execute_with_allocator.h", + "bom-ref": "bcdcc7a0adaa69b2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_size.h", "type": "file" }, { - "bom-ref": "28f326ba4906376e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/execute_with_allocator_fwd.h", + "bom-ref": "b4cf1f8778493db2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/tuple_types.h", "type": "file" }, { - "bom-ref": "7ad6075bbefd7c93", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/execution_policy.h", + "bom-ref": "fca2ffb0315482be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__tuple_dir/vector_types.h", "type": "file" }, { - "bom-ref": "cef5cb4b7d4c8cfa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/extrema.inl", + "bom-ref": "c43366ca8c96ec46", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_const.h", "type": "file" }, { - "bom-ref": "a100ab8981fec7fd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/fill.inl", + "bom-ref": "8983bf557d96c3ae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_cv.h", "type": "file" }, { - "bom-ref": "50b68095c6c3d48f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/find.inl", + "bom-ref": "637cd758d1fac9d6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_lvalue_reference.h", "type": "file" }, { - "bom-ref": "9cb85825f1e8914d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/for_each.inl", + "bom-ref": "473d80d2651f6665", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_pointer.h", "type": "file" }, { - "bom-ref": "9d75909af7f2ee50", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/function.h", + "bom-ref": "f4c3b7efb1068bdc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_rvalue_reference.h", "type": "file" }, { - "bom-ref": "10584e141809dfcc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/functional/actor.h", + "bom-ref": "e1bee52c12b2cc49", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/add_volatile.h", "type": "file" }, { - "bom-ref": "f221790b50079897", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/functional/operators.h", + "bom-ref": "3192b81412e07e7c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/aggregate_members_all_of.h", "type": "file" }, { - "bom-ref": "b175de9c0d4aa19a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/gather.inl", + "bom-ref": "8d365b25be74eb8b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/aligned_storage.h", "type": "file" }, { - "bom-ref": "4acf9fd9fa1c7b1a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/generate.inl", + "bom-ref": "e2ff8e4e77d1d047", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/aligned_union.h", "type": "file" }, { - "bom-ref": "1c363c23a2cb1ca8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/get_iterator_value.h", + "bom-ref": "277bb9c49f315558", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/alignment_of.h", "type": "file" }, { - "bom-ref": "35e96181b208ef71", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/inner_product.inl", + "bom-ref": "cd9153db278469ed", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/always_false.h", "type": "file" }, { - "bom-ref": "0c154537f86555ac", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/internal_functional.h", + "bom-ref": "b03833bab4aeeb9d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/can_extract_key.h", "type": "file" }, { - "bom-ref": "c623023879818fff", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/logical.inl", + "bom-ref": "871c4135284eb905", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/common_reference.h", "type": "file" }, { - "bom-ref": "bc30d3af2b76efe4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/malloc_and_free.h", + "bom-ref": "dfb78f791ca2bcb9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/common_type.h", "type": "file" }, { - "bom-ref": "33e3dd6ebdaace94", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/malloc_and_free_fwd.h", + "bom-ref": "3215683279ccd5ec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/conditional.h", "type": "file" }, { - "bom-ref": "fe60d590c7caac79", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/memory_algorithms.h", + "bom-ref": "33f5d131bb81a7c5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/conjunction.h", "type": "file" }, { - "bom-ref": "02559442f833c372", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/merge.inl", + "bom-ref": "e54eab15ec0bceab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/copy_cv.h", "type": "file" }, { - "bom-ref": "9849f0d969fe2073", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/mismatch.inl", + "bom-ref": "c788da38909ce392", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/copy_cvref.h", "type": "file" }, { - "bom-ref": "793eae3a1ab322d3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/nvtx_policy.h", + "bom-ref": "df97843a6e791de9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/decay.h", "type": "file" }, { - "bom-ref": "8e5513c2852f8f08", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/overlapped_copy.h", + "bom-ref": "c230217ffce30b7a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/dependent_type.h", "type": "file" }, { - "bom-ref": "eb8e578b82a21f92", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/partition.inl", + "bom-ref": "63ab9d1a18523aea", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/disjunction.h", "type": "file" }, { - "bom-ref": "52b0540f7b76dc84", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/pointer.h", + "bom-ref": "974808fc901d720e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/enable_if.h", "type": "file" }, { - "bom-ref": "051e89696f19e4a5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/preprocessor.h", + "bom-ref": "701fb49f1e81e734", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/extent.h", "type": "file" }, { - "bom-ref": "b320fb32db3e828d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/random_bijection.h", + "bom-ref": "40ad208ae0a9f06a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/fold.h", "type": "file" }, { - "bom-ref": "c6487a9c088d4dbf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/range/head_flags.h", + "bom-ref": "11528f353e8b8799", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/has_unique_object_representation.h", "type": "file" }, { - "bom-ref": "db198028039a671c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/range/tail_flags.h", + "bom-ref": "cf3a5b839345a569", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/has_virtual_destructor.h", "type": "file" }, { - "bom-ref": "3bafac1d1685f0fa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/raw_pointer_cast.h", + "bom-ref": "5b466790218f3a16", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/integral_constant.h", "type": "file" }, { - "bom-ref": "958302472e2c2887", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/raw_reference_cast.h", + "bom-ref": "74a55ccbafbb93bd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/integral_constant_like.h", "type": "file" }, { - "bom-ref": "0c141ee6d5d66927", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/reduce.inl", + "bom-ref": "a2bf07514e9d5b48", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_abstract.h", "type": "file" }, { - "bom-ref": "bb853db04005d7b7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/reference.h", + "bom-ref": "04a085914db1f7fc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_aggregate.h", "type": "file" }, { - "bom-ref": "022983889f39bc1b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/reference_forward_declaration.h", + "bom-ref": "971b58a5465c898d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_allocator.h", "type": "file" }, { - "bom-ref": "edb6adb16c2c95ad", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/remove.inl", + "bom-ref": "4f2479b6c078803e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_arithmetic.h", "type": "file" }, { - "bom-ref": "56122b4cc0556e7d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/replace.inl", + "bom-ref": "cd071457811567da", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_array.h", "type": "file" }, { - "bom-ref": "f3b1fc6440212a7d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/reverse.inl", + "bom-ref": "aa5a6ef503c5529c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_assignable.h", "type": "file" }, { - "bom-ref": "1eb29aff4238ec47", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/scan.inl", + "bom-ref": "09464efcae55953c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_base_of.h", "type": "file" }, { - "bom-ref": "f752202e5e02b84c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/scatter.inl", + "bom-ref": "e932bef1f26cf90f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_bounded_array.h", "type": "file" }, { - "bom-ref": "aea9abfde2e4c23b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/seq.h", + "bom-ref": "fc12bd4109fef40c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_callable.h", "type": "file" }, { - "bom-ref": "784430f408e9e6ce", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/sequence.inl", + "bom-ref": "998d5972d2ff7a4a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_char_like_type.h", "type": "file" }, { - "bom-ref": "6e54e4d9b286510c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/set_operations.inl", + "bom-ref": "5abb57cc284a8db3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_class.h", "type": "file" }, { - "bom-ref": "f82810d8a7e31ddd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/shuffle.inl", + "bom-ref": "ef11e9a5dcf64191", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_comparable.h", "type": "file" }, { - "bom-ref": "56e5510878acdcbe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/sort.inl", + "bom-ref": "7efb6a78064db231", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_complete.h", "type": "file" }, { - "bom-ref": "48284035563c07ae", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/static_assert.h", + "bom-ref": "5f214f88cfffbd6b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_compound.h", "type": "file" }, { - "bom-ref": "0ced628eeae66fdc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/static_map.h", + "bom-ref": "ff12a3a7a238dc2e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_const.h", "type": "file" }, { - "bom-ref": "702ebbcc935e4396", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/swap_ranges.inl", + "bom-ref": "c2847a7e0843ded0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_constant_evaluated.h", "type": "file" }, { - "bom-ref": "bc3c30ad9261c0a5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/tabulate.inl", + "bom-ref": "8c144f0b0e3c26f8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_constructible.h", "type": "file" }, { - "bom-ref": "b022b55f3521fafa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/temporary_array.h", + "bom-ref": "cc63ee204e361cc6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_convertible.h", "type": "file" }, { - "bom-ref": "947173c61f39035c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/temporary_array.inl", + "bom-ref": "089509719684e862", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_copy_assignable.h", "type": "file" }, { - "bom-ref": "ba5051f04f157b88", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/temporary_buffer.h", + "bom-ref": "9c3f8a07bc32fb8c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_copy_constructible.h", "type": "file" }, { - "bom-ref": "0e392aa5ebb50c90", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/transform_reduce.inl", + "bom-ref": "d3f7927da16e3a47", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_core_convertible.h", "type": "file" }, { - "bom-ref": "5fe35198f3a3f93a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/transform_scan.inl", + "bom-ref": "d6c99e91c68719e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_corresponding_member.h", "type": "file" }, { - "bom-ref": "32db1282a8677b02", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/trivial_sequence.h", + "bom-ref": "57e9368750deb4d0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_default_constructible.h", "type": "file" }, { - "bom-ref": "aa838d46489ff0d7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/tuple_meta_transform.h", + "bom-ref": "f2d0fe997872f572", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_destructible.h", "type": "file" }, { - "bom-ref": "92985fc96219ea4a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_deduction.h", + "bom-ref": "f85694f32387dbe7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_empty.h", "type": "file" }, { - "bom-ref": "8aaf4fcf868ed909", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_traits.h", + "bom-ref": "2a5c6bffce2b6eb8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_enum.h", "type": "file" }, { - "bom-ref": "74221055b396160e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/has_member_function.h", + "bom-ref": "10ef6aa98ec756f2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_execution_policy.h", "type": "file" }, { - "bom-ref": "52dfb3919a9eb5ee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/has_nested_type.h", + "bom-ref": "a5f1aa995949bd68", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_extended_arithmetic.h", "type": "file" }, { - "bom-ref": "a04b8425ad02881c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/is_call_possible.h", + "bom-ref": "91a88bb964075ac2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_extended_floating_point.h", "type": "file" }, { - "bom-ref": "4b28b3e1de1d2deb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/is_commutative.h", + "bom-ref": "269697a449a86871", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_final.h", "type": "file" }, { - "bom-ref": "ed949f8020de0ebd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/is_metafunction_defined.h", + "bom-ref": "1094c237c52388d1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_floating_point.h", "type": "file" }, { - "bom-ref": "c48a0a1d6bb9f89d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/is_thrust_pointer.h", + "bom-ref": "8a2eab8c584acd94", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_fully_bounded_array.h", "type": "file" }, { - "bom-ref": "b0bede234f8b1e61", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/iterator/is_output_iterator.h", + "bom-ref": "e73119e137ce52c3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_function.h", "type": "file" }, { - "bom-ref": "8ff398f8863a051b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/minimum_type.h", + "bom-ref": "299d33e8ae3b08ff", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_fundamental.h", "type": "file" }, { - "bom-ref": "0c0b0ccd68ce67f6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/pointer_traits.h", + "bom-ref": "490072d3292101c2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_implicitly_default_constructible.h", "type": "file" }, { - "bom-ref": "a81f0a42c6e60501", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/uninitialized_copy.inl", + "bom-ref": "5ef8d3c2b8da3cd4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_integer.h", "type": "file" }, { - "bom-ref": "94933fb745450e77", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/uninitialized_fill.inl", + "bom-ref": "81dd0c203abcb2c8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_integral.h", "type": "file" }, { - "bom-ref": "9a857ac9b6f8d483", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/unique.inl", + "bom-ref": "124c80649da1b7bc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_layout_compatible.h", "type": "file" }, { - "bom-ref": "1b4641c7eded343a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/use_default.h", + "bom-ref": "c717b581ef47d976", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_literal_type.h", "type": "file" }, { - "bom-ref": "fdba1bf1a3f7e713", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/vector_base.h", + "bom-ref": "b1a3be11084eebd4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_member_function_pointer.h", "type": "file" }, { - "bom-ref": "26b9770c2585df41", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/detail/vector_base.inl", + "bom-ref": "25a62bd0b9f43759", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_member_object_pointer.h", "type": "file" }, { - "bom-ref": "0ed44c70a1098990", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_allocator.h", + "bom-ref": "ed885ef6af463a99", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_member_pointer.h", "type": "file" }, { - "bom-ref": "dcac89912e1b6de2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_delete.h", + "bom-ref": "6b6cfc2b2afcc0ce", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_move_assignable.h", "type": "file" }, { - "bom-ref": "292771dce8cbe945", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_free.h", + "bom-ref": "a9032c67b7d22dde", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_move_constructible.h", "type": "file" }, { - "bom-ref": "69ed847a51d8e0e7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_make_unique.h", + "bom-ref": "927f90e22df94084", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_assignable.h", "type": "file" }, { - "bom-ref": "ab0696420178538d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_malloc.h", + "bom-ref": "361dbe7f2d817d02", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_constructible.h", "type": "file" }, { - "bom-ref": "29203a628c827e7e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_malloc_allocator.h", + "bom-ref": "ef740fb9749002ed", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_convertible.h", "type": "file" }, { - "bom-ref": "8fd3d2f52cdfd072", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_new.h", + "bom-ref": "2dfe24b38c55d3c0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_copy_assignable.h", "type": "file" }, { - "bom-ref": "d6de0f2b8d580303", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_new_allocator.h", + "bom-ref": "a18ca70dc54d63a5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_copy_constructible.h", "type": "file" }, { - "bom-ref": "9c2501e8d230369b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_ptr.h", + "bom-ref": "f7f87babd109bd98", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_default_constructible.h", "type": "file" }, { - "bom-ref": "e7d66563b8d918a8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_reference.h", + "bom-ref": "b4f8a7eca7372448", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_destructible.h", "type": "file" }, { - "bom-ref": "25a7149ff0f06cfc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/device_vector.h", + "bom-ref": "4336b119064b6370", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_move_assignable.h", "type": "file" }, { - "bom-ref": "8eacd302fc9f8b21", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/distance.h", + "bom-ref": "c88f027ea10c7ab8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_nothrow_move_constructible.h", "type": "file" }, { - "bom-ref": "d15b3eabc3e28128", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/equal.h", + "bom-ref": "3792cdd16ec47262", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_null_pointer.h", "type": "file" }, { - "bom-ref": "ff8925b1ddbd5560", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/execution_policy.h", + "bom-ref": "d9b57521e3567ed5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_object.h", "type": "file" }, { - "bom-ref": "ebc6884c9b0cf377", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/extrema.h", + "bom-ref": "796097434e8400bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_one_of.h", "type": "file" }, { - "bom-ref": "d065f1da620a498e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/fill.h", + "bom-ref": "fa0fea59c68a9af2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_pod.h", "type": "file" }, { - "bom-ref": "09f220aa186f6d17", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/find.h", + "bom-ref": "76101473337e2ba5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_pointer.h", "type": "file" }, { - "bom-ref": "97013e3403d8afe6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/for_each.h", + "bom-ref": "1bc1a64cb3ee2c39", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_pointer_interconvertible_base_of.h", "type": "file" }, { - "bom-ref": "377fd7f287e47e1e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/functional.h", + "bom-ref": "31f1a822f15d0234", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_pointer_interconvertible_with_class.h", "type": "file" }, { - "bom-ref": "43dea59024d2efd2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/gather.h", + "bom-ref": "02b80ccf9d34155b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_polymorphic.h", "type": "file" }, { - "bom-ref": "37a3a470a94ac198", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/generate.h", + "bom-ref": "fc0929f8df57c027", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_primary_template.h", "type": "file" }, { - "bom-ref": "ee0d024a8f1083bd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/host_vector.h", + "bom-ref": "9d369a132472ccea", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_reference.h", "type": "file" }, { - "bom-ref": "fce789fa9e16dde6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/inner_product.h", + "bom-ref": "4fe8cf9aa1c76307", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_referenceable.h", "type": "file" }, { - "bom-ref": "71e3da3ef19ba773", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/constant_iterator.h", + "bom-ref": "8a71e0b9dffe1028", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_same.h", "type": "file" }, { - "bom-ref": "eb0917d1e0c8ad00", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/counting_iterator.h", + "bom-ref": "972d763dce85b9a4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_scalar.h", "type": "file" }, { - "bom-ref": "cf9c3d99c13e716e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/any_assign.h", + "bom-ref": "950ce058f4e0debc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_scoped_enum.h", "type": "file" }, { - "bom-ref": "0d00b3d625fc602a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/any_system_tag.h", + "bom-ref": "ad44d500e118684c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_signed.h", "type": "file" }, { - "bom-ref": "cd32c8a621f0e53b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/device_system_tag.h", + "bom-ref": "eba31b30296e79b5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_signed_integer.h", "type": "file" }, { - "bom-ref": "2b2a9bf97691e29b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/host_system_tag.h", + "bom-ref": "11d9014f6d18523b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_standard_layout.h", "type": "file" }, { - "bom-ref": "c56a5db3c50b7d72", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/iterator_adaptor_base.h", + "bom-ref": "ac33d88beca3a564", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_swappable.h", "type": "file" }, { - "bom-ref": "37e16c56b2b69024", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/iterator_category_to_system.h", + "bom-ref": "9827f701ef7da241", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivial.h", "type": "file" }, { - "bom-ref": "e3ef537a05c044e2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/iterator_category_to_traversal.h", + "bom-ref": "e0c4c4d47b0dd587", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_assignable.h", "type": "file" }, { - "bom-ref": "723c38d2a9577130", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/iterator_category_with_system_and_traversal.h", + "bom-ref": "bc53860f50d89ccb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_constructible.h", "type": "file" }, { - "bom-ref": "229cde6f96f83e5a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/iterator_facade_category.h", + "bom-ref": "7eaed520fa7bd231", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_copy_assignable.h", "type": "file" }, { - "bom-ref": "b912fffb5669b26b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/minimum_system.h", + "bom-ref": "380264c4cf73b9d6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_copy_constructible.h", "type": "file" }, { - "bom-ref": "a8b0b9360d1e26f3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/normal_iterator.h", + "bom-ref": "7c0c9f281f634d63", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_copyable.h", "type": "file" }, { - "bom-ref": "390b69b5a135ce6c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/retag.h", + "bom-ref": "ef8573597cf5eaed", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_default_constructible.h", "type": "file" }, { - "bom-ref": "374300073b9c1e02", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/tagged_iterator.h", + "bom-ref": "795c406beef4154d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_destructible.h", "type": "file" }, { - "bom-ref": "ce1d10ec570be5d3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/detail/tuple_of_iterator_references.h", + "bom-ref": "0ec1bb7745bf1034", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_move_assignable.h", "type": "file" }, { - "bom-ref": "fc00153262abd41a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/discard_iterator.h", + "bom-ref": "e43aba6d7410910b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_trivially_move_constructible.h", "type": "file" }, { - "bom-ref": "a8b1f3a105c6eb2c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/iterator_adaptor.h", + "bom-ref": "235f80918013c784", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_unbounded_array.h", "type": "file" }, { - "bom-ref": "584e912c25e00dfd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/iterator_categories.h", + "bom-ref": "31097fb4c6e8adf2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_union.h", "type": "file" }, { - "bom-ref": "c87c8934540335f7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/iterator_facade.h", + "bom-ref": "d0362bccb6573dc6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_unsigned.h", "type": "file" }, { - "bom-ref": "c5f036aabc16fd7b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/iterator_traits.h", + "bom-ref": "f0d59c52eff2be2c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_unsigned_integer.h", "type": "file" }, { - "bom-ref": "818dd6266338d955", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/iterator_traversal_tags.h", + "bom-ref": "99c11d2f5b21969a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_valid_expansion.h", "type": "file" }, { - "bom-ref": "40e6444bcdd00bd0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/offset_iterator.h", + "bom-ref": "4b9a8faf44639c40", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_void.h", "type": "file" }, { - "bom-ref": "62c0529a2adf3aed", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/permutation_iterator.h", + "bom-ref": "8bf2113e4a014bef", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/is_volatile.h", "type": "file" }, { - "bom-ref": "968afeb8372faaf2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/retag.h", + "bom-ref": "29ab19aa8c636807", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/lazy.h", "type": "file" }, { - "bom-ref": "cc04f009d771dc51", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/reverse_iterator.h", + "bom-ref": "578966f9ece6eb1d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/make_const_lvalue_ref.h", "type": "file" }, { - "bom-ref": "d5bb4a33d52efac9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/shuffle_iterator.h", + "bom-ref": "3f19e511711a88b1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/make_nbit_int.h", "type": "file" }, { - "bom-ref": "ee47aa4ecd2de4bc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/strided_iterator.h", + "bom-ref": "519b3d1bc7847f85", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/make_signed.h", "type": "file" }, { - "bom-ref": "cd0813f447f68b5b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/tabulate_output_iterator.h", + "bom-ref": "008bec3edb8578d0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/make_unsigned.h", "type": "file" }, { - "bom-ref": "9401929a9d63dc1d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/transform_input_output_iterator.h", + "bom-ref": "c244bc207e6ecc7d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/maybe_const.h", "type": "file" }, { - "bom-ref": "c670f7bee04785d3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/transform_iterator.h", + "bom-ref": "cb776b07011a131e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/nat.h", "type": "file" }, { - "bom-ref": "45cb4d787dda1e9a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/transform_output_iterator.h", + "bom-ref": "66935e52ce72a2e0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/negation.h", "type": "file" }, { - "bom-ref": "9e07a72f18280e2b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/iterator/zip_iterator.h", + "bom-ref": "10e627bf2eb2ee94", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/num_bits.h", "type": "file" }, { - "bom-ref": "27943ac10c5169d0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/logical.h", + "bom-ref": "cf621bba7b05f25a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/operations.h", "type": "file" }, { - "bom-ref": "d89f1da15fd58628", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/memory.h", + "bom-ref": "2e2559d105b5fc45", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/promote.h", "type": "file" }, { - "bom-ref": "be5277b2638ebe3f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/merge.h", + "bom-ref": "ddd3f27c6e9c01af", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/rank.h", "type": "file" }, { - "bom-ref": "ff36b1ed4eeb125a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mismatch.h", + "bom-ref": "db436eac651b4d62", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/reference_constructs_from_temporary.h", "type": "file" }, { - "bom-ref": "f09dbd83e23e9b17", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/allocator.h", + "bom-ref": "7692be4d6312f4a9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/reference_converts_from_temporary.h", "type": "file" }, { - "bom-ref": "71e61bab6ae2306c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/device_memory_resource.h", + "bom-ref": "a4f5fef2934bff70", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_all_extents.h", "type": "file" }, { - "bom-ref": "70a0551e1e5f275b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/disjoint_pool.h", + "bom-ref": "67d3d7895d0c5209", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_const.h", "type": "file" }, { - "bom-ref": "e05f1139c32e1acf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/disjoint_sync_pool.h", + "bom-ref": "6235f011552f1c21", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_const_ref.h", "type": "file" }, { - "bom-ref": "8a9feb8c842bf786", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/disjoint_tls_pool.h", + "bom-ref": "8f5f1fbe7ff70280", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_cv.h", "type": "file" }, { - "bom-ref": "061bf8ae18901027", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/fancy_pointer_resource.h", + "bom-ref": "c9afa7f3c16a2d8a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_cvref.h", "type": "file" }, { - "bom-ref": "7bb98bd8899018e4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/host_memory_resource.h", + "bom-ref": "ae3630fd1385a866", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_extent.h", "type": "file" }, { - "bom-ref": "83369f8aebe8ca94", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/memory_resource.h", + "bom-ref": "d5b735d253e59485", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_pointer.h", "type": "file" }, { - "bom-ref": "4ddbeca01007399a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/new.h", + "bom-ref": "35ae7adbe1bfd19d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_reference.h", "type": "file" }, { - "bom-ref": "bce3facee5a5016d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/polymorphic_adaptor.h", + "bom-ref": "a9a718687c494fec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/remove_volatile.h", "type": "file" }, { - "bom-ref": "68c734c232d1a4a9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/pool.h", + "bom-ref": "853533e7bd01fe5a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/result_of.h", "type": "file" }, { - "bom-ref": "01de2594506fc3fd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/pool_options.h", + "bom-ref": "1b2b3a1a384b2feb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/type_identity.h", "type": "file" }, { - "bom-ref": "ccbbf3ba7872d63c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/sync_pool.h", + "bom-ref": "a9da8176e0f1eb6b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/type_list.h", "type": "file" }, { - "bom-ref": "713e0d6ab641fec8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/tls_pool.h", + "bom-ref": "b7215b1d60f00e8a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/type_set.h", "type": "file" }, { - "bom-ref": "97affa5a5808c752", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/universal_memory_resource.h", + "bom-ref": "97b95a9aa75de798", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/underlying_type.h", "type": "file" }, { - "bom-ref": "c7e6cbfedade388d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/mr/validator.h", + "bom-ref": "3e07e00d583eb4e2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__type_traits/void_t.h", "type": "file" }, { - "bom-ref": "745595f2a85f69ec", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/pair.h", + "bom-ref": "b286c4268ae05231", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/as_const.h", "type": "file" }, { - "bom-ref": "680eaf5a71d7bdfd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/partition.h", + "bom-ref": "7d6988af78345b6c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/auto_cast.h", "type": "file" }, { - "bom-ref": "42ed9c47e2fd2c81", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/per_device_resource.h", + "bom-ref": "99ded7d1235fe021", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/cmp.h", "type": "file" }, { - "bom-ref": "2d29ae6891ec00d7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random.h", + "bom-ref": "198991a97206bea9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/convert_to_integral.h", "type": "file" }, { - "bom-ref": "ed604d95f1ddf8f7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/discard_block_engine.inl", + "bom-ref": "6bf3a3437b194ff4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/ctad_support.h", "type": "file" }, { - "bom-ref": "07570d0a2c31dbfe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/linear_congruential_engine.inl", + "bom-ref": "dd0e851cb0a02909", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/declval.h", "type": "file" }, { - "bom-ref": "3c746df19ba5b690", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/linear_congruential_engine_discard.h", + "bom-ref": "2b06b29a45730aa9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/delegate_constructors.h", "type": "file" }, { - "bom-ref": "fed0176c67c828e1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/linear_feedback_shift_engine.inl", + "bom-ref": "a7d7140556bcdc83", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/exception_guard.h", "type": "file" }, { - "bom-ref": "38a13eeb71f09dd2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/linear_feedback_shift_engine_wordmask.h", + "bom-ref": "03c06c88ffd2fc65", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/exchange.h", "type": "file" }, { - "bom-ref": "703ade7e583fc593", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/mod.h", + "bom-ref": "6344896deeb9a928", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/forward.h", "type": "file" }, { - "bom-ref": "589a3e86ea0f1709", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/normal_distribution.inl", + "bom-ref": "8230efd0462cbf9e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/forward_like.h", "type": "file" }, { - "bom-ref": "5ea93971d101af44", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/normal_distribution_base.h", + "bom-ref": "20806e3c5ef9372e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/in_place.h", "type": "file" }, { - "bom-ref": "0b462d1e8d1cc299", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/random_core_access.h", + "bom-ref": "b49805af77486d27", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/integer_sequence.h", "type": "file" }, { - "bom-ref": "a8c1a63edcaefd69", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/subtract_with_carry_engine.inl", + "bom-ref": "67cc538ef19e422e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/monostate.h", "type": "file" }, { - "bom-ref": "9a20b307e0a25f1b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/uniform_int_distribution.inl", + "bom-ref": "bf74837403486265", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/move.h", "type": "file" }, { - "bom-ref": "76966f4fbc99a942", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/uniform_real_distribution.inl", + "bom-ref": "304b8cd158330a61", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/pair.h", "type": "file" }, { - "bom-ref": "77781377af3a1a36", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/xor_combine_engine.inl", + "bom-ref": "00127504b4a8c9db", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/piecewise_construct.h", "type": "file" }, { - "bom-ref": "ee81cc18846cdb31", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/detail/xor_combine_engine_max.h", + "bom-ref": "bbdb87caa56ed8b3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/pod_tuple.h", "type": "file" }, { - "bom-ref": "576e061747b46759", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/discard_block_engine.h", + "bom-ref": "79c42be95086358e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/priority_tag.h", "type": "file" }, { - "bom-ref": "be85a4b27ce6161f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/linear_congruential_engine.h", + "bom-ref": "57e02443e3411045", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/rel_ops.h", "type": "file" }, { - "bom-ref": "25c69b9cd507fc53", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/linear_feedback_shift_engine.h", + "bom-ref": "4a1f0f93be120c79", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/swap.h", "type": "file" }, { - "bom-ref": "74c0749f139a5cc9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/normal_distribution.h", + "bom-ref": "b39240b9b54a7bf7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/to_underlying.h", "type": "file" }, { - "bom-ref": "8b4ad260923c4ce0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/subtract_with_carry_engine.h", + "bom-ref": "1c47a9b2152c0abc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/typeid.h", "type": "file" }, { - "bom-ref": "dc94afa76cf0b442", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/uniform_int_distribution.h", + "bom-ref": "d3ed65327d576d43", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/undefined.h", "type": "file" }, { - "bom-ref": "24a9d1e4fb3a737d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/uniform_real_distribution.h", + "bom-ref": "3d05395d88440cc9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__utility/unreachable.h", "type": "file" }, { - "bom-ref": "e0acfeae0493063f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/random/xor_combine_engine.h", + "bom-ref": "4d2c445982a30607", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/bad_variant_access.h", "type": "file" }, { - "bom-ref": "3a30b66674c72a52", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/reduce.h", + "bom-ref": "6316b0d7feb121a3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/comparison.h", "type": "file" }, { - "bom-ref": "d006e7a67439692d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/remove.h", + "bom-ref": "14a1bb1acfd0b147", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/get.h", "type": "file" }, { - "bom-ref": "09f0359d69d0c941", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/replace.h", + "bom-ref": "f847cd8539488e56", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/hash.h", "type": "file" }, { - "bom-ref": "24370afcd5ac580a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/reverse.h", + "bom-ref": "fb14d99d922918f8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/sfinae_helpers.h", "type": "file" }, { - "bom-ref": "dc7bd335a5a2932d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/scan.h", + "bom-ref": "fcb96590bcc4cf51", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant.h", "type": "file" }, { - "bom-ref": "77a4a6cef13b3162", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/scatter.h", + "bom-ref": "34144c7a10040c03", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_access.h", "type": "file" }, { - "bom-ref": "4c5424023a90dc07", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/sequence.h", + "bom-ref": "917646fc2bd5837a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_base.h", "type": "file" }, { - "bom-ref": "482aeef9df4de7c1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/set_operations.h", + "bom-ref": "fea74b1d797eb1bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_constraints.h", "type": "file" }, { - "bom-ref": "8735006abcbc7267", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/shuffle.h", + "bom-ref": "3fc2261a1d5fa122", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_match.h", "type": "file" }, { - "bom-ref": "78965130b8260ac3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/sort.h", + "bom-ref": "dbf8a334d2164603", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_traits.h", "type": "file" }, { - "bom-ref": "72a614b16875e3d7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/swap.h", + "bom-ref": "6e688126b0342057", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/variant_visit.h", "type": "file" }, { - "bom-ref": "7116f167606ab43b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/adjacent_difference.h", + "bom-ref": "b17fd74bbe0dbf31", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/__variant/visit.h", "type": "file" }, { - "bom-ref": "46cf6847ea0384a2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/assign_value.h", + "bom-ref": "067b1503c4ed04f6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm", "type": "file" }, { - "bom-ref": "0fe37544e171ffe6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/binary_search.h", + "bom-ref": "6747b97e1ac4db3d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.adjacent_find.h", "type": "file" }, { - "bom-ref": "06ca6b8e8e6baea4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/copy.h", + "bom-ref": "fefd552a0bd9d031", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.all_of.h", "type": "file" }, { - "bom-ref": "4d54c3759522d1c3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/copy_if.h", + "bom-ref": "18ae02c6871f0125", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.any_of.h", "type": "file" }, { - "bom-ref": "123a3c199ee15a09", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/count.h", + "bom-ref": "2bb126fda81c35f9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.binary_search.h", "type": "file" }, { - "bom-ref": "75952f0b3289db76", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/equal.h", + "bom-ref": "ccc4afb4cdf790bb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.clamp.h", "type": "file" }, { - "bom-ref": "97cb05248371ed2e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/execution_policy.h", + "bom-ref": "55274620dae71232", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.copy.h", "type": "file" }, { - "bom-ref": "ba422900ddf37f0e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/extrema.h", + "bom-ref": "4a9d22192827b09b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.copy_backward.h", "type": "file" }, { - "bom-ref": "41f407ce00f89274", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/fill.h", + "bom-ref": "7467315cb198437b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.copy_if.h", "type": "file" }, { - "bom-ref": "d1fee9a4b3a382da", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/find.h", + "bom-ref": "7825f2de52f8d1d4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.copy_n.h", "type": "file" }, { - "bom-ref": "6bc9ea7497ceb580", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/for_each.h", + "bom-ref": "63cf1178b1b11490", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.count.h", "type": "file" }, { - "bom-ref": "77a2de8ebdb1551e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/gather.h", + "bom-ref": "02ac9a2b627552f4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.count_if.h", "type": "file" }, { - "bom-ref": "eb68190d1574870f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/generate.h", + "bom-ref": "643ed296f5f8f09d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.equal.h", "type": "file" }, { - "bom-ref": "5bffc555888287ea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/get_value.h", + "bom-ref": "0ef5bc8e0ce03ca2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.equal_range.h", "type": "file" }, { - "bom-ref": "2c16e7ec232f6984", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/inner_product.h", + "bom-ref": "a75b34c1bdf4ea14", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.fill.h", "type": "file" }, { - "bom-ref": "932be36afc154db6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/iter_swap.h", + "bom-ref": "efbfe7a428980c9c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.fill_n.h", "type": "file" }, { - "bom-ref": "c40ab8872e9aa6f4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/logical.h", + "bom-ref": "8311992e2c230c53", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.find.h", "type": "file" }, { - "bom-ref": "6054fd6b813c6a67", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/malloc_and_free.h", + "bom-ref": "988880a1c65f2530", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.find_end.h", "type": "file" }, { - "bom-ref": "c5d866292d68cff4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/memory.inl", + "bom-ref": "90d34c088359337e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.find_first_of.h", "type": "file" }, { - "bom-ref": "dced7a8efe2f07a9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/merge.h", + "bom-ref": "55d68ceaf175f581", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.find_if.h", "type": "file" }, { - "bom-ref": "cfb41fb2edb44084", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/mismatch.h", + "bom-ref": "772cef3863bb5145", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.find_if_not.h", "type": "file" }, { - "bom-ref": "be7baf191e6114c4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/partition.h", + "bom-ref": "509b976e507d17d8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.for_each.h", "type": "file" }, { - "bom-ref": "fae3a22c8841de38", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/per_device_resource.h", + "bom-ref": "9f0c7e9e5870125e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.for_each_n.h", "type": "file" }, { - "bom-ref": "0eea76d23ca496a6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/reduce.h", + "bom-ref": "e118e11ff10cf52e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.generate.h", "type": "file" }, { - "bom-ref": "971f43d7ce370aee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/reduce_by_key.h", + "bom-ref": "6c3095f14d3bd1e7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.generate_n.h", "type": "file" }, { - "bom-ref": "07fdd2297ec38325", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/remove.h", + "bom-ref": "4d3901b77c9a13f7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.includes.h", "type": "file" }, { - "bom-ref": "d85a3cf3e57a3a89", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/replace.h", + "bom-ref": "890a0e27576f763b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.is_heap.h", "type": "file" }, { - "bom-ref": "d287dec5be23a6ac", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/reverse.h", + "bom-ref": "bce8ed3f5dabf5a3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.is_heap_until.h", "type": "file" }, { - "bom-ref": "71a262f0e6089acd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/scan.h", + "bom-ref": "219153b925f19c0e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.is_partitioned.h", "type": "file" }, { - "bom-ref": "bb9b5665dac2ce6d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/scan_by_key.h", + "bom-ref": "44697b26f765046b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.is_permutation.h", "type": "file" }, { - "bom-ref": "33e449a897cfc7ac", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/scatter.h", + "bom-ref": "fcb40482382f643a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.is_sorted.h", "type": "file" }, { - "bom-ref": "8117be89cc1e4350", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/sequence.h", + "bom-ref": "6ec2ab859085f6de", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.is_sorted_until.h", "type": "file" }, { - "bom-ref": "0a4fb16666e29dd2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/set_operations.h", + "bom-ref": "c44f4397d462c7c2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.iter_swap.h", "type": "file" }, { - "bom-ref": "e2e3c8d462bd14bc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/sort.h", + "bom-ref": "d09e38793421e6a6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.lexicographical_compare.h", "type": "file" }, { - "bom-ref": "cea525a4c00bae69", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/swap_ranges.h", + "bom-ref": "de4fd50ed4e672fc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.lower_bound.h", "type": "file" }, { - "bom-ref": "63934e47fae7588d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/tabulate.h", + "bom-ref": "b28ec6c7c48cf189", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.make_heap.h", "type": "file" }, { - "bom-ref": "1c041571546d0b83", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/temporary_buffer.h", + "bom-ref": "3f7089371cc2b8fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.max.h", "type": "file" }, { - "bom-ref": "bf00f1c4d414a6cb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/transform.h", + "bom-ref": "1adce4eff86d8c34", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.max_element.h", "type": "file" }, { - "bom-ref": "ae1b789486065e89", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/transform_reduce.h", + "bom-ref": "a12d42191e03a230", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.merge.h", "type": "file" }, { - "bom-ref": "04323d0a5fd00bcf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/transform_scan.h", + "bom-ref": "3ae57c716f9bb483", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.min.h", "type": "file" }, { - "bom-ref": "46d2301d503ad471", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/uninitialized_copy.h", + "bom-ref": "1dbfc518c5680686", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.min_element.h", "type": "file" }, { - "bom-ref": "70296961a6798618", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/uninitialized_fill.h", + "bom-ref": "411ce6da41f76423", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.minmax.h", "type": "file" }, { - "bom-ref": "54f2a0fc8950d3db", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/unique.h", + "bom-ref": "906775f3691d451e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.minmax_element.h", "type": "file" }, { - "bom-ref": "118bcc9a910f7101", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/unique_by_key.h", + "bom-ref": "7086fa292168a1b4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.mismatch.h", "type": "file" }, { - "bom-ref": "a17f46adcfe12f26", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/execution_policy.h", + "bom-ref": "48c255ede61d695b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.move.h", "type": "file" }, { - "bom-ref": "a4002721b936969f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/memory.h", + "bom-ref": "0946bdda1dc432a1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.move_backward.h", "type": "file" }, { - "bom-ref": "1439df8064691d56", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/memory_resource.h", + "bom-ref": "896d649e614b6208", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.next_permutation.h", "type": "file" }, { - "bom-ref": "5404c1f1f5a17bf0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/pointer.h", + "bom-ref": "6a843e3d1ba31df2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.none_of.h", "type": "file" }, { - "bom-ref": "385bc9d29cd49ae5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cpp/vector.h", + "bom-ref": "920e96d5335e127c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.partial_sort.h", "type": "file" }, { - "bom-ref": "5ebfd4f6178380d7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/config.h", + "bom-ref": "b0371753c6ac34ca", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.partial_sort_copy.h", "type": "file" }, { - "bom-ref": "ee509a876681522c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/adjacent_difference.h", + "bom-ref": "9d81d96e18470bef", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.partition.h", "type": "file" }, { - "bom-ref": "5cbe3afd6848dd8f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/assign_value.h", + "bom-ref": "4b10ba896c0b3c6e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.partition_copy.h", "type": "file" }, { - "bom-ref": "3d94b3a12ab3ba44", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/binary_search.h", + "bom-ref": "d4f0040d140be959", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.partition_point.h", "type": "file" }, { - "bom-ref": "3a1edab90ec44f5a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/cdp_dispatch.h", + "bom-ref": "48f269d515e071b7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.pop_heap.h", "type": "file" }, { - "bom-ref": "6ba0968bebaa7b73", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/copy.h", + "bom-ref": "a12fbf910c47f8f5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.prev_permutation.h", "type": "file" }, { - "bom-ref": "d94d7ae2f2fc362c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/copy_if.h", + "bom-ref": "cb6f6a88f4244c49", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.push_heap.h", "type": "file" }, { - "bom-ref": "3495c9cf94892991", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/core/agent_launcher.h", + "bom-ref": "4530df42a076407a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.ranges.find_if.h", "type": "file" }, { - "bom-ref": "f91baf013a0e26d5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/core/triple_chevron_launch.h", + "bom-ref": "ac3573879360b674", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.ranges.find_if_not.h", "type": "file" }, { - "bom-ref": "367977d83492c9a5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/core/util.h", + "bom-ref": "c5244a79e76c7150", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.ranges.for_each.h", "type": "file" }, { - "bom-ref": "6e52cf46ba7759b8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/count.h", + "bom-ref": "fd02ca4fdf15c6ff", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.ranges.for_each_n.h", "type": "file" }, { - "bom-ref": "e464fb8b24373e59", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/cross_system.h", + "bom-ref": "0d69ffd16ce21c4f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.ranges.min.h", "type": "file" }, { - "bom-ref": "60b7b657627c7384", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/dispatch.h", + "bom-ref": "6236153ab334dca6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.ranges.min_element.h", "type": "file" }, { - "bom-ref": "2e59e1f1bbe89069", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/equal.h", + "bom-ref": "9ff5caf370677865", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.remove.h", "type": "file" }, { - "bom-ref": "57f8f30365d28470", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/error.inl", + "bom-ref": "b77f51f33c96aabc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.remove_copy.h", "type": "file" }, { - "bom-ref": "2dcdf9f64a6247bd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/execution_policy.h", + "bom-ref": "2fdcea27560521c5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.remove_copy_if.h", "type": "file" }, { - "bom-ref": "a707fee1685e44ea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/extrema.h", + "bom-ref": "8b6dbca4948b02f9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.remove_if.h", "type": "file" }, { - "bom-ref": "9eec07dd709133c7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/fill.h", + "bom-ref": "ef767f40aff372ca", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.replace.h", "type": "file" }, { - "bom-ref": "b37b476e7661f3ad", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/find.h", + "bom-ref": "347d8b4cc90dcc7a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.replace_copy.h", "type": "file" }, { - "bom-ref": "2614c80e6785617e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/for_each.h", + "bom-ref": "b31c578a0574191e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.replace_copy_if.h", "type": "file" }, { - "bom-ref": "92955ba59c5a1fb8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/gather.h", + "bom-ref": "74bde4720a628d65", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.replace_if.h", "type": "file" }, { - "bom-ref": "46b1b14872a8603a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/generate.h", + "bom-ref": "e945c6bd361bd08b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.reverse.h", "type": "file" }, { - "bom-ref": "43a949c51e76b9a0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/get_value.h", + "bom-ref": "7af20343aedd8a34", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.reverse_copy.h", "type": "file" }, { - "bom-ref": "ba0b71088982ccf4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/inner_product.h", + "bom-ref": "03c88da15e9706bc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.rotate.h", "type": "file" }, { - "bom-ref": "ee19ebb81f022d1a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/iter_swap.h", + "bom-ref": "f3956bcb27a32634", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.rotate_copy.h", "type": "file" }, { - "bom-ref": "5d981013be5e854e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/logical.h", + "bom-ref": "cbc22fb27a175cfe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.sample.h", "type": "file" }, { - "bom-ref": "4a80d3c211392c11", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/make_unsigned_special.h", + "bom-ref": "40e927d5f3edc5ad", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.search.h", "type": "file" }, { - "bom-ref": "77b71252744ec51f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/malloc_and_free.h", + "bom-ref": "64d4896a234ea011", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.search_n.h", "type": "file" }, { - "bom-ref": "50b6d360ed7f7be8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/memory.inl", + "bom-ref": "29ea43b1a05d8a70", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.set_difference.h", "type": "file" }, { - "bom-ref": "6f4a72ebfe7f442a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/merge.h", + "bom-ref": "09ae2bbcf23d3a9c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.set_intersection.h", "type": "file" }, { - "bom-ref": "00fa31d6c94f66b3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/mismatch.h", + "bom-ref": "293b10719f3d7571", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.set_symmetric_difference.h", "type": "file" }, { - "bom-ref": "8dd9df7610b28e70", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/parallel_for.h", + "bom-ref": "95406402a92e96fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.set_union.h", "type": "file" }, { - "bom-ref": "d4e36914ef17ea58", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/partition.h", + "bom-ref": "f269bf768d8ec734", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.shift_left.h", "type": "file" }, { - "bom-ref": "f3c2be93c6e20927", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/per_device_resource.h", + "bom-ref": "eab1d9f086d10feb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.shift_right.h", "type": "file" }, { - "bom-ref": "9231e44402c4e020", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/reduce.h", + "bom-ref": "678da022433b8c97", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.shuffle.h", "type": "file" }, { - "bom-ref": "fbdd07f82b5fb24a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/reduce_by_key.h", + "bom-ref": "9268393cb128f478", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.sort_heap.h", "type": "file" }, { - "bom-ref": "3fa054719c19be0d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/remove.h", + "bom-ref": "0071c01ef9281ca0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.swap_ranges.h", "type": "file" }, { - "bom-ref": "67a397f5d0d6f65c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/replace.h", + "bom-ref": "2de405944708539d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.transform.h", "type": "file" }, { - "bom-ref": "e14c6b78383c185a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/reverse.h", + "bom-ref": "2a4dea5e50c1065b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.unique.h", "type": "file" }, { - "bom-ref": "7a5a8302055788ee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/scan.h", + "bom-ref": "25ba698612dc441d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.unique_copy.h", "type": "file" }, { - "bom-ref": "cfb1107b55e13372", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/scan_by_key.h", + "bom-ref": "91567417fbcdbb66", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/algorithm.upper_bound.h", "type": "file" }, { - "bom-ref": "7498d18a27c42937", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/scatter.h", + "bom-ref": "385ef08e8a189b43", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/array", "type": "file" }, { - "bom-ref": "d8ce238901ddf316", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/sequence.h", + "bom-ref": "8f9fcd8b3494ab00", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/atomic", "type": "file" }, { - "bom-ref": "a0719caaa8a5ac90", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/set_operations.h", + "bom-ref": "5469f9e6f611a6dc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/barrier", "type": "file" }, { - "bom-ref": "7854d374befe09f4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/sort.h", + "bom-ref": "a7888ce8c6448c60", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/bit", "type": "file" }, { - "bom-ref": "dfc5b0d88906daa2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/swap_ranges.h", + "bom-ref": "4895f76a6366c82e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/bitset", "type": "file" }, { - "bom-ref": "85c7b9b76e912a73", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/tabulate.h", + "bom-ref": "20a4c43ba1207064", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/cassert", "type": "file" }, { - "bom-ref": "4a7955fbeeab6c71", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/temporary_buffer.h", + "bom-ref": "83b9255464bdff95", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/ccomplex", "type": "file" }, { - "bom-ref": "fb5c9a85b52685d0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/terminate.h", + "bom-ref": "ba883a324c825804", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/cfloat", "type": "file" }, { - "bom-ref": "227f84fa9b882fc4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/transform.h", + "bom-ref": "bba7d76535b57adc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/charconv", "type": "file" }, { - "bom-ref": "58ca9e0ad806ed8d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/transform_reduce.h", + "bom-ref": "b3b77fc63f929dcd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/chrono", "type": "file" }, { - "bom-ref": "207cb271c485a744", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/transform_scan.h", + "bom-ref": "3fc69f30d29852ad", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/climits", "type": "file" }, { - "bom-ref": "7494626a05d9d7a6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/uninitialized_copy.h", + "bom-ref": "bf57fcaff4d0588a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/cmath", "type": "file" }, { - "bom-ref": "d8b068462071dece", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/uninitialized_fill.h", + "bom-ref": "5298fa22f554bf25", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/complex", "type": "file" }, { - "bom-ref": "af56c6647d9fe7f9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/unique.h", + "bom-ref": "641fbed69a8e55d3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/concepts", "type": "file" }, { - "bom-ref": "bf0d86c0d155c7a0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/unique_by_key.h", + "bom-ref": "1e9fc5d1e4866896", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/cstddef", "type": "file" }, { - "bom-ref": "044b461f87533724", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/util.h", + "bom-ref": "b6792bc8421e4ef6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/cstdint", "type": "file" }, { - "bom-ref": "9d2f6c2b08fe43cf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/error.h", + "bom-ref": "e2e2569351879b65", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/cstdlib", "type": "file" }, { - "bom-ref": "12666eb529937148", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/execution_policy.h", + "bom-ref": "09b327de66a438f8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/cstring", "type": "file" }, { - "bom-ref": "4debfee2dac4e7be", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/memory.h", + "bom-ref": "f0b8b551ce0cca67", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/ctime", "type": "file" }, { - "bom-ref": "fd4d8a135e1efb5a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/memory_resource.h", + "bom-ref": "e18412c4baa3714e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/detail/__config", "type": "file" }, { - "bom-ref": "7dc33d39ef6b3a90", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/pointer.h", + "bom-ref": "eeebec475445cea5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/execution", "type": "file" }, { - "bom-ref": "13a7eaa268f15f45", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/cuda/vector.h", + "bom-ref": "da96b216baa80115", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/expected", "type": "file" }, { - "bom-ref": "c4bc5757efaf77d8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/bad_alloc.h", + "bom-ref": "5586127662a5a120", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/functional", "type": "file" }, { - "bom-ref": "2b6cb6bfb5948901", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/errno.h", + "bom-ref": "9826cbb17e631f35", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/initializer_list", "type": "file" }, { - "bom-ref": "db3cc2d0cb5b20e5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/error_category.inl", + "bom-ref": "51ce35ea9e8081d4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/inplace_vector", "type": "file" }, { - "bom-ref": "2de963c9b15678cd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/error_code.inl", + "bom-ref": "327b4d827d8d1e52", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/iterator", "type": "file" }, { - "bom-ref": "8abd570e88b19568", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/error_condition.inl", + "bom-ref": "3cb2d6079246846a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/latch", "type": "file" }, { - "bom-ref": "d83d48c71e94b239", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/adjacent_difference.h", + "bom-ref": "3f160aa63bb1f8fd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/limits", "type": "file" }, { - "bom-ref": "9c511f463353d127", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/adjacent_difference.inl", + "bom-ref": "ad22cf7778d5d61d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/linalg", "type": "file" }, { - "bom-ref": "a5de90faa2ebdbee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/binary_search.h", + "bom-ref": "eb45ec3e6449d976", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/mdspan", "type": "file" }, { - "bom-ref": "77781978f4bca3f6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/binary_search.inl", + "bom-ref": "0960a8f4b9d41080", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/memory", "type": "file" }, { - "bom-ref": "33435ff52af0f7cc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/copy.h", + "bom-ref": "ec3dac9259ea12af", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/numbers", "type": "file" }, { - "bom-ref": "a6779a3e91474853", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/copy.inl", + "bom-ref": "ceec563150cc0ce7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/numeric", "type": "file" }, { - "bom-ref": "a3ffa1538d443adf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/copy_if.h", + "bom-ref": "706efb6fb288c663", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/optional", "type": "file" }, { - "bom-ref": "74faf8adab82eb9d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/copy_if.inl", + "bom-ref": "54f625009f56e557", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/random", "type": "file" }, { - "bom-ref": "96d6a1c7abae5a4f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/count.h", + "bom-ref": "1a7529f1fa1212e8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/ranges", "type": "file" }, { - "bom-ref": "9598544818f8c96f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/count.inl", + "bom-ref": "b6a5182ac741279b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/ratio", "type": "file" }, { - "bom-ref": "5863337e594cb39a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/equal.h", + "bom-ref": "33fae88d5188b5f7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/semaphore", "type": "file" }, { - "bom-ref": "fcec795e126962a9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/equal.inl", + "bom-ref": "03be504deb3875a2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/source_location", "type": "file" }, { - "bom-ref": "4428de93d7629350", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/extrema.h", + "bom-ref": "bd4f7db2f0916d75", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/span", "type": "file" }, { - "bom-ref": "43b7c55805103386", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/extrema.inl", + "bom-ref": "76268f9412bcc055", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/string_view", "type": "file" }, { - "bom-ref": "3992996b0d130a4a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/fill.h", + "bom-ref": "9e16be81aad5cb23", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/tuple", "type": "file" }, { - "bom-ref": "a8f5ab333ef12660", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/find.h", + "bom-ref": "77fba17aa506ac3a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/type_traits", "type": "file" }, { - "bom-ref": "c5da81d58c896f77", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/find.inl", + "bom-ref": "749336b5f3317e93", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/utility", "type": "file" }, { - "bom-ref": "f9f25e3042cab74a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/for_each.h", + "bom-ref": "397280aabacbfdae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/variant", "type": "file" }, { - "bom-ref": "e3dafdebe331fdb8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/gather.h", + "bom-ref": "21385e3a7e062df0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/std/version", "type": "file" }, { - "bom-ref": "112c0b065d16409e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/gather.inl", + "bom-ref": "2f0761eea18c4c30", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/stream", "type": "file" }, { - "bom-ref": "88686b17e324eaf6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/generate.h", + "bom-ref": "f33bbe216bc1bce2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/stream_ref", "type": "file" }, { - "bom-ref": "7a6c79ea80abbc5f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/generate.inl", + "bom-ref": "25cf420460c14e8a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/tma", "type": "file" }, { - "bom-ref": "33d354f49cca0de2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/inner_product.h", + "bom-ref": "017390dbc49fe745", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/type_traits", "type": "file" }, { - "bom-ref": "14c60d3a084c342c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/inner_product.inl", + "bom-ref": "a1d9abcfc453a324", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/utility", "type": "file" }, { - "bom-ref": "0d3c5981345a8023", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/logical.h", + "bom-ref": "3b47d0c45ec837e0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/version", "type": "file" }, { - "bom-ref": "e6100c8700f37b56", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/memory.h", + "bom-ref": "fd422c2a154aebad", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/warp", "type": "file" }, { - "bom-ref": "db07e392941fd6da", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/memory.inl", + "bom-ref": "f41b413f8130668a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/cuda/work_stealing", "type": "file" }, { - "bom-ref": "61e44b33c25b92b3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/merge.h", + "bom-ref": "26777f983f92137a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/nv/detail/__preprocessor", "type": "file" }, { - "bom-ref": "d03cec6dcc599689", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/merge.inl", + "bom-ref": "98c4aa4f074ce1ab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/nv/detail/__target_macros", "type": "file" }, { - "bom-ref": "19b943a5f9054872", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/mismatch.h", + "bom-ref": "8af70784a927db42", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/nv/target", "type": "file" }, { - "bom-ref": "1c202e3e6ba31126", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/mismatch.inl", + "bom-ref": "89320221e3a1c229", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/addressof.h", "type": "file" }, { - "bom-ref": "3ef806002bb76bca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/partition.h", + "bom-ref": "b37327049b95c6ce", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/adjacent_difference.h", "type": "file" }, { - "bom-ref": "bb9d5726573d84d2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/partition.inl", + "bom-ref": "631f728b0b9c873b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/advance.h", "type": "file" }, { - "bom-ref": "8503f360600223dd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/per_device_resource.h", + "bom-ref": "6f3415d7f0db2565", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/allocate_unique.h", "type": "file" }, { - "bom-ref": "e9094356cabe970f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reduce.h", + "bom-ref": "81f8be21651347b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/binary_search.h", "type": "file" }, { - "bom-ref": "cde866b9fc20540a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reduce.inl", + "bom-ref": "c8c6dbc52259f827", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/complex.h", "type": "file" }, { - "bom-ref": "b49ba77224cbddfd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reduce_by_key.h", + "bom-ref": "44d3c0baeb837c0f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/copy.h", "type": "file" }, { - "bom-ref": "be53912a7ffa385c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reduce_by_key.inl", + "bom-ref": "2f656c55c9466dd2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/count.h", "type": "file" }, { - "bom-ref": "dc3788c8800c790e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/remove.h", + "bom-ref": "8bee78a121921b85", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/adjacent_difference.inl", "type": "file" }, { - "bom-ref": "9407625e34d438fa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/remove.inl", + "bom-ref": "5c46c1fcfe85314f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/alignment.h", "type": "file" }, { - "bom-ref": "b8dcb2df1e2bee14", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/replace.h", + "bom-ref": "a27d8db1b03442ce", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/allocator/allocator_system.h", "type": "file" }, { - "bom-ref": "80a1c27fee0fd9a6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/replace.inl", + "bom-ref": "65f47290378b836f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/allocator/copy_construct_range.h", "type": "file" }, { - "bom-ref": "9c12777ab276ce09", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reverse.h", + "bom-ref": "1afdfa97e00cccdf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/allocator/destroy_range.h", "type": "file" }, { - "bom-ref": "b2add76ceb5ee1b3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reverse.inl", + "bom-ref": "97a0dab05cc5c588", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/allocator/fill_construct_range.h", "type": "file" }, { - "bom-ref": "cc63fb4e7da36db2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scalar/binary_search.h", + "bom-ref": "223639e65fabe126", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/allocator/malloc_allocator.h", "type": "file" }, { - "bom-ref": "4be3a21e05bd7365", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scalar/binary_search.inl", + "bom-ref": "15c87146eec8f677", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/allocator/no_throw_allocator.h", "type": "file" }, { - "bom-ref": "e296b0ee152bfe5a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scan.h", + "bom-ref": "6d57c0e5b36148d2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/allocator/tagged_allocator.h", "type": "file" }, { - "bom-ref": "511a3b356ebd7fee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scan_by_key.h", + "bom-ref": "a964ecdabb578457", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/allocator/temporary_allocator.h", "type": "file" }, { - "bom-ref": "990590453ef164f2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scan_by_key.inl", + "bom-ref": "1bb4900ce5e6d8c7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/allocator/value_initialize_range.h", "type": "file" }, { - "bom-ref": "ebcce9ecbd8e469e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scatter.h", + "bom-ref": "5be5cc782362efed", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/allocator_aware_execution_policy.h", "type": "file" }, { - "bom-ref": "a2331fb9d7bd96d1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scatter.inl", + "bom-ref": "cd4da6df913dff16", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/binary_search.inl", "type": "file" }, { - "bom-ref": "714f6149f8650321", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/select_system.h", + "bom-ref": "a91bacf763b9d378", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/caching_allocator.h", "type": "file" }, { - "bom-ref": "77811cdd0b25495e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/sequence.h", + "bom-ref": "2ac7192355c87238", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/arithmetic.h", "type": "file" }, { - "bom-ref": "9a34c6c829d46a38", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/set_operations.h", + "bom-ref": "e3cdd113c6e52dfe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/catrig.h", "type": "file" }, { - "bom-ref": "74d5b23364d4e879", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/set_operations.inl", + "bom-ref": "396dcf686aeca660", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/catrigf.h", "type": "file" }, { - "bom-ref": "291f82dc15a38ca2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/shuffle.h", + "bom-ref": "75919035f7ccd86c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/ccosh.h", "type": "file" }, { - "bom-ref": "e7a5ce2692428d7d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/shuffle.inl", + "bom-ref": "49a3c3e084b83186", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/ccoshf.h", "type": "file" }, { - "bom-ref": "73679ec691b75d31", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/sort.h", + "bom-ref": "dbfc79c9383a70f6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/cexp.h", "type": "file" }, { - "bom-ref": "72bf67d281f136f9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/sort.inl", + "bom-ref": "fa4ccf1f44610b4d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/cexpf.h", "type": "file" }, { - "bom-ref": "7977fa9612d4ae62", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/swap_ranges.h", + "bom-ref": "532d964fa857b167", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/clog.h", "type": "file" }, { - "bom-ref": "0e4843806a265180", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/swap_ranges.inl", + "bom-ref": "86d9aacf61ec245f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/clogf.h", "type": "file" }, { - "bom-ref": "2a3095635d3d45f6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/tabulate.h", + "bom-ref": "0cb16854e99da670", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/complex.inl", "type": "file" }, { - "bom-ref": "9c17c011008510af", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/tabulate.inl", + "bom-ref": "586352e1ad7b8f2b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/cpow.h", "type": "file" }, { - "bom-ref": "a1512452214d3b71", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/tag.h", + "bom-ref": "5a8c7e4c105cd13b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/cproj.h", "type": "file" }, { - "bom-ref": "7b3cf6a31ee17666", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/temporary_buffer.h", + "bom-ref": "d96267821e65004a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/csinh.h", "type": "file" }, { - "bom-ref": "54c74f5f4dcfdd09", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/temporary_buffer.inl", + "bom-ref": "1d74468f1f3e1081", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/csinhf.h", "type": "file" }, { - "bom-ref": "378a39970411f617", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/transform.h", + "bom-ref": "d60108a1cb83aa8d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/csqrt.h", "type": "file" }, { - "bom-ref": "5afe399990f5a7e4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/transform_reduce.h", + "bom-ref": "6e3284b18e22de51", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/csqrtf.h", "type": "file" }, { - "bom-ref": "f4ed21d364bc39ab", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/transform_reduce.inl", + "bom-ref": "91944f2f98431686", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/ctanh.h", "type": "file" }, { - "bom-ref": "30593b168e9253b9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/transform_scan.h", + "bom-ref": "a9e12229d4abdafc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/ctanhf.h", "type": "file" }, { - "bom-ref": "a4603279c7b7b8e0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/transform_scan.inl", + "bom-ref": "f901b2031317d1a5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/math_private.h", "type": "file" }, { - "bom-ref": "ccaad553a5f23add", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/uninitialized_copy.h", + "bom-ref": "6abedec7a2cc7b7a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/complex/stream.h", "type": "file" }, { - "bom-ref": "4abd3e977d0a5be7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/uninitialized_copy.inl", + "bom-ref": "2d47dda9f9684ee8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/config.h", "type": "file" }, { - "bom-ref": "a3222267ff7c9029", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/uninitialized_fill.h", + "bom-ref": "80fa0578b9d569e9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/config/compiler.h", "type": "file" }, { - "bom-ref": "468d67b4ee29e565", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/uninitialized_fill.inl", + "bom-ref": "67523eabbf353c1a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/config/config.h", "type": "file" }, { - "bom-ref": "1e75d2af95efaec1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/unique.h", + "bom-ref": "272822d1d456fca3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/config/cpp_dialect.h", "type": "file" }, { - "bom-ref": "51798141952efcc0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/unique.inl", + "bom-ref": "e56be8e6f9563576", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/config/device_system.h", "type": "file" }, { - "bom-ref": "17f76f3b035d8f2f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/unique_by_key.h", + "bom-ref": "0d7424f476607e91", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/config/host_system.h", "type": "file" }, { - "bom-ref": "af7a9d9635fb413f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/unique_by_key.inl", + "bom-ref": "39540930ac68612c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/config/memory_resource.h", "type": "file" }, { - "bom-ref": "c11eeb07bdfd1c4c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/internal/decompose.h", + "bom-ref": "0f140703a4e8a072", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/config/namespace.h", "type": "file" }, { - "bom-ref": "14dad65dedb2c000", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/adjacent_difference.h", + "bom-ref": "fb84e2aa1d4e5cfe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/config/simple_defines.h", "type": "file" }, { - "bom-ref": "bd50bc0eaeb5a9ae", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/assign_value.h", + "bom-ref": "37a3c9f7842030d0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/contiguous_storage.h", "type": "file" }, { - "bom-ref": "cfca626f74e3c9b6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/binary_search.h", + "bom-ref": "b0f2e39a98a275a9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/contiguous_storage.inl", "type": "file" }, { - "bom-ref": "fc461a9f07f1c418", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/copy.h", + "bom-ref": "15627298f3be4971", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/copy.h", "type": "file" }, { - "bom-ref": "0e1c749beca55465", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/copy_backward.h", + "bom-ref": "05f2b1be68ba8c8f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/copy.inl", "type": "file" }, { - "bom-ref": "1a0eb18a5550b7e3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/copy_if.h", + "bom-ref": "cbe54c50663c9531", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/copy_if.h", "type": "file" }, { - "bom-ref": "9501ab639979070c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/count.h", + "bom-ref": "89678b38490a05e0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/copy_if.inl", "type": "file" }, { - "bom-ref": "b619a0b23fbc114a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/equal.h", + "bom-ref": "90fa90409cd801b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/count.h", "type": "file" }, { - "bom-ref": "ece1959955473287", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/execution_policy.h", + "bom-ref": "d1b98c9aacb610ca", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/count.inl", "type": "file" }, { - "bom-ref": "6e166d4c3512f702", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/extrema.h", + "bom-ref": "a4f7b917b3d6c0e7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/device_ptr.inl", "type": "file" }, { - "bom-ref": "a9eb24e4caa9084b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/fill.h", + "bom-ref": "749138a5f2a18bab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/equal.inl", "type": "file" }, { - "bom-ref": "daca60806e18e3fe", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/find.h", + "bom-ref": "3f829e3cbb1cd091", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/event_error.h", "type": "file" }, { - "bom-ref": "3e3c9720005b1782", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/for_each.h", + "bom-ref": "859f69dd53a2b8d0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/execute_with_allocator.h", "type": "file" }, { - "bom-ref": "f6ac152b8c8fa4d7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/gather.h", + "bom-ref": "f1a4a6231e0d4e30", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/execute_with_allocator_fwd.h", "type": "file" }, { - "bom-ref": "9a24f3a46b79ef68", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/general_copy.h", + "bom-ref": "01d1cdd8cb1bb0b7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/execution_policy.h", "type": "file" }, { - "bom-ref": "e9505b37d0c49954", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/generate.h", + "bom-ref": "8a7487f846eec8bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/extrema.inl", "type": "file" }, { - "bom-ref": "7cf21eb9542c095d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/get_value.h", + "bom-ref": "12dff42698564d02", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/fill.inl", "type": "file" }, { - "bom-ref": "71305aabd2ea31c6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/inner_product.h", + "bom-ref": "c819affe2e4c80ea", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/find.inl", "type": "file" }, { - "bom-ref": "67b4697821d0d7f9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/insertion_sort.h", + "bom-ref": "eb2d9526e0590b97", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/for_each.inl", "type": "file" }, { - "bom-ref": "e2fb698ae2774305", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/iter_swap.h", + "bom-ref": "cd4e00528c3f44c8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/function.h", "type": "file" }, { - "bom-ref": "f38682a63155f236", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/logical.h", + "bom-ref": "054f38377f882c7a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/functional/actor.h", "type": "file" }, { - "bom-ref": "e179511f702c0493", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/malloc_and_free.h", + "bom-ref": "335c78be4f587018", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/functional/operators.h", "type": "file" }, { - "bom-ref": "6a74b0abdd68515f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/merge.h", + "bom-ref": "b7b83c98a3a52c3d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/gather.inl", "type": "file" }, { - "bom-ref": "c862c2b846792090", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/mismatch.h", + "bom-ref": "81e872fe7990af55", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/generate.inl", "type": "file" }, { - "bom-ref": "70a1ca4c2106ac7d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/partition.h", + "bom-ref": "8b8f41eb9f210bbd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/get_iterator_value.h", "type": "file" }, { - "bom-ref": "3fc903efe522f6db", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/per_device_resource.h", + "bom-ref": "c92906c9663e0948", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/inner_product.inl", "type": "file" }, { - "bom-ref": "dbda71d8254c219c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/reduce.h", + "bom-ref": "e6fd6dcb703d53d3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/internal_functional.h", "type": "file" }, { - "bom-ref": "75b1e2e7d1baa530", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/reduce_by_key.h", + "bom-ref": "720879ac9d247774", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/logical.inl", "type": "file" }, { - "bom-ref": "416761f9e8f97eb0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/remove.h", + "bom-ref": "419c0d66d9fcba0e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/malloc_and_free.h", "type": "file" }, { - "bom-ref": "cdf2c3f80f0ac143", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/replace.h", + "bom-ref": "429546325bb3970f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/malloc_and_free_fwd.h", "type": "file" }, { - "bom-ref": "e9879e0bbfed7a7a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/reverse.h", + "bom-ref": "ebdc4406d8c4fd3a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/memory_algorithms.h", "type": "file" }, { - "bom-ref": "ceacc67f8747af66", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/scan.h", + "bom-ref": "78414785f7f01999", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/merge.inl", "type": "file" }, { - "bom-ref": "e0e04adfe9f76754", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/scan_by_key.h", + "bom-ref": "e3434e4b6fa74f86", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/mismatch.inl", "type": "file" }, { - "bom-ref": "52c6da939b2b14f2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/scatter.h", + "bom-ref": "9215232328be5811", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/nvtx_policy.h", "type": "file" }, { - "bom-ref": "5605e2859080e17c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/sequence.h", + "bom-ref": "7fff34d58b1aada2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/overlapped_copy.h", "type": "file" }, { - "bom-ref": "6914618b1d276549", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/set_operations.h", + "bom-ref": "532315035600acab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/partition.inl", "type": "file" }, { - "bom-ref": "64dc14a5a2ec9f0d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/sort.h", + "bom-ref": "66d2077527459839", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/pointer.h", "type": "file" }, { - "bom-ref": "ec5dc920846ee746", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/stable_merge_sort.h", + "bom-ref": "6d0550cb9e55d78c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/preprocessor.h", "type": "file" }, { - "bom-ref": "3b56994153738dff", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/stable_primitive_sort.h", + "bom-ref": "2461a0e7371676fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/random_bijection.h", "type": "file" }, { - "bom-ref": "1906d38a67f5f579", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/stable_radix_sort.h", + "bom-ref": "d7ec9e4c4443ad84", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/range/head_flags.h", "type": "file" }, { - "bom-ref": "d5e3a168b0815f6a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/swap_ranges.h", + "bom-ref": "29136c889525c0d6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/range/tail_flags.h", "type": "file" }, { - "bom-ref": "1589599fc3107fab", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/tabulate.h", + "bom-ref": "f81f3638605cd791", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/raw_pointer_cast.h", "type": "file" }, { - "bom-ref": "661bf30cbc825993", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/temporary_buffer.h", + "bom-ref": "4fba7de22018743a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/raw_reference_cast.h", "type": "file" }, { - "bom-ref": "de2e29c2e879b5d9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/transform.h", + "bom-ref": "f8630ebcd8623586", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/reduce.inl", "type": "file" }, { - "bom-ref": "d69088af9fb0e26b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/transform_reduce.h", + "bom-ref": "f11ac178b22de248", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/reference.h", "type": "file" }, { - "bom-ref": "b76d3f39af90d59c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/transform_scan.h", + "bom-ref": "49303089fc609d33", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/reference_forward_declaration.h", "type": "file" }, { - "bom-ref": "0165b16a7b881856", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/trivial_copy.h", + "bom-ref": "9be286a62a03b009", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/remove.inl", "type": "file" }, { - "bom-ref": "9bbb7ecdc4825dd7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/uninitialized_copy.h", + "bom-ref": "3b73edfb2c5ed4f9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/replace.inl", "type": "file" }, { - "bom-ref": "8fa258dace7834fc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/uninitialized_fill.h", + "bom-ref": "7fbf1463e2728dec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/reverse.inl", "type": "file" }, { - "bom-ref": "a2a40ee223650e51", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/unique.h", + "bom-ref": "0fed2f3d2f2b98e6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/scan.inl", "type": "file" }, { - "bom-ref": "2c35660293f72352", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/unique_by_key.h", + "bom-ref": "d4dfc64af4f8a0a4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/scatter.inl", "type": "file" }, { - "bom-ref": "b5c9f33ad00bcf4d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/detail/system_error.inl", + "bom-ref": "618853a129053fe4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/seq.h", "type": "file" }, { - "bom-ref": "425aaa8e2cf32dc2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/error_code.h", + "bom-ref": "d81331c9e4067a35", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/sequence.inl", "type": "file" }, { - "bom-ref": "47732b1a9a7f33d9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/adjacent_difference.h", + "bom-ref": "9fec302a6d47cb7b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/set_operations.inl", "type": "file" }, { - "bom-ref": "6d9da36143896773", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/assign_value.h", + "bom-ref": "3f1fff17b1fa11c9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/shuffle.inl", "type": "file" }, { - "bom-ref": "d1057753382880b4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/binary_search.h", + "bom-ref": "1db9539b2adc2589", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/sort.inl", "type": "file" }, { - "bom-ref": "fe9b39f24198e039", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/copy.h", + "bom-ref": "3f306b41d02d980a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/static_assert.h", "type": "file" }, { - "bom-ref": "e771f49e69a08783", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/copy_if.h", + "bom-ref": "fb6ceea5e50dfc0e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/static_map.h", "type": "file" }, { - "bom-ref": "9cc3603a67965ebb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/count.h", + "bom-ref": "d93ee77776e687bd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/swap_ranges.inl", "type": "file" }, { - "bom-ref": "45d255235d7cb037", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/default_decomposition.h", + "bom-ref": "ff451a2c5ac31c46", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/tabulate.inl", "type": "file" }, { - "bom-ref": "bb4b951c4281f414", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/equal.h", + "bom-ref": "aed7685a01e25479", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/temporary_array.h", "type": "file" }, { - "bom-ref": "e626ffcc896422dd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/execution_policy.h", + "bom-ref": "e29239593c352600", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/temporary_array.inl", "type": "file" }, { - "bom-ref": "fa05c31bbd2dc968", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/extrema.h", + "bom-ref": "7acd9198dcede82f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/temporary_buffer.h", "type": "file" }, { - "bom-ref": "46a0fe4f7a3cbacc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/fill.h", + "bom-ref": "df096c1c4625d666", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/transform_reduce.inl", "type": "file" }, { - "bom-ref": "9fe14c919d4cb6ba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/find.h", + "bom-ref": "91e79962dfb07453", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/transform_scan.inl", "type": "file" }, { - "bom-ref": "468000a15a6d5c79", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/for_each.h", + "bom-ref": "8ffe93f70025be65", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/trivial_sequence.h", "type": "file" }, { - "bom-ref": "fdfe2380004527b9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/gather.h", + "bom-ref": "1ef06104da114d6d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/type_deduction.h", "type": "file" }, { - "bom-ref": "fb0b135f495965bf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/generate.h", + "bom-ref": "fdaefca2f385c5e7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/type_traits.h", "type": "file" }, { - "bom-ref": "d980002085dac59f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/get_value.h", + "bom-ref": "3aaa0ae473191cee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/has_member_function.h", "type": "file" }, { - "bom-ref": "458e7a4d0532a311", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/inner_product.h", + "bom-ref": "695d15db61036d98", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/has_nested_type.h", "type": "file" }, { - "bom-ref": "5295c3e748e6e967", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/iter_swap.h", + "bom-ref": "48297751d5d8d154", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/is_call_possible.h", "type": "file" }, { - "bom-ref": "605a2ee417043315", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/logical.h", + "bom-ref": "5baa4c57bf84f7c3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/is_thrust_pointer.h", "type": "file" }, { - "bom-ref": "be017bf1c13a8e8d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/malloc_and_free.h", + "bom-ref": "db8082a2e1bffc4c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/iterator/is_output_iterator.h", "type": "file" }, { - "bom-ref": "536d6e9ee3e96cdf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/merge.h", + "bom-ref": "93d9cc35418cedf5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/minimum_type.h", "type": "file" }, { - "bom-ref": "a0b9f321d6ace125", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/mismatch.h", + "bom-ref": "e8c34c7157aa0ed0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/type_traits/pointer_traits.h", "type": "file" }, { - "bom-ref": "f8330ea7d31f7473", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/partition.h", + "bom-ref": "596211a4d2158bd3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/uninitialized_copy.inl", "type": "file" }, { - "bom-ref": "9949016733babeee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/per_device_resource.h", + "bom-ref": "d161352e07fc1f9b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/uninitialized_fill.inl", "type": "file" }, { - "bom-ref": "1342fc0ffbb03d2d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/pragma_omp.h", + "bom-ref": "8cb90835e75d36d4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/unique.inl", "type": "file" }, { - "bom-ref": "7d0717b740f447a9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/reduce.h", + "bom-ref": "606730d773938cac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/use_default.h", "type": "file" }, { - "bom-ref": "19a34b17621f9598", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/reduce_by_key.h", + "bom-ref": "3442bd99f857defa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/vector_base.h", "type": "file" }, { - "bom-ref": "a5b73cfa92847c83", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/reduce_intervals.h", + "bom-ref": "25a3ca926a019a46", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/detail/vector_base.inl", "type": "file" }, { - "bom-ref": "f5f889e96ed04516", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/remove.h", + "bom-ref": "83c1a2f26e54b4d4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_allocator.h", "type": "file" }, { - "bom-ref": "675a2f85f74ea0da", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/replace.h", + "bom-ref": "5573155fa55c0227", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_delete.h", "type": "file" }, { - "bom-ref": "120dabea4f4f8bd5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/reverse.h", + "bom-ref": "04c6cb1a51c34922", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_free.h", "type": "file" }, { - "bom-ref": "e28c222036635459", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/scan.h", + "bom-ref": "63853d705c460e23", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_make_unique.h", "type": "file" }, { - "bom-ref": "06df9e6bc58abaa0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/scan_by_key.h", + "bom-ref": "ed62492df84e3445", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_malloc.h", "type": "file" }, { - "bom-ref": "8367e384fb92be0f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/scatter.h", + "bom-ref": "5852d24d1f877797", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_malloc_allocator.h", "type": "file" }, { - "bom-ref": "37334edceb7b2af1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/sequence.h", + "bom-ref": "16667f630ad630f6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_new.h", "type": "file" }, { - "bom-ref": "3ac9c2ff13c964c5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/set_operations.h", + "bom-ref": "351a1a3ae903c12c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_new_allocator.h", "type": "file" }, { - "bom-ref": "7f492fbf338e4097", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/sort.h", + "bom-ref": "0bb68f05350018b0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_ptr.h", "type": "file" }, { - "bom-ref": "6189f6da4a4f8c13", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/swap_ranges.h", + "bom-ref": "64bd9dc4402dfe28", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_reference.h", "type": "file" }, { - "bom-ref": "61cbd83c1478033d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/tabulate.h", + "bom-ref": "6764baba0060c211", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/device_vector.h", "type": "file" }, { - "bom-ref": "a0c6fa467d692da7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/temporary_buffer.h", + "bom-ref": "b551ce8fdc856839", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/distance.h", "type": "file" }, { - "bom-ref": "37f55fc8791fe8c2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/transform.h", + "bom-ref": "4440b8776b025aa9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/equal.h", "type": "file" }, { - "bom-ref": "ca263935a5015784", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/transform_reduce.h", + "bom-ref": "cb41d5ab581a0117", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/execution_policy.h", "type": "file" }, { - "bom-ref": "66904d7a032885fc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/transform_scan.h", + "bom-ref": "babc5c0207cbc531", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/extrema.h", "type": "file" }, { - "bom-ref": "8b531f2fab70aecc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/uninitialized_copy.h", + "bom-ref": "4c66a57502c1fc0b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/fill.h", "type": "file" }, { - "bom-ref": "ba234b2048202dc2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/uninitialized_fill.h", + "bom-ref": "432d6960763d120a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/find.h", "type": "file" }, { - "bom-ref": "14da76fb3a862d94", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/unique.h", + "bom-ref": "8db7e3e1e91adaaa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/for_each.h", "type": "file" }, { - "bom-ref": "148e433c9955018c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/unique_by_key.h", + "bom-ref": "725fc7d297ddc07f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/functional.h", "type": "file" }, { - "bom-ref": "8329ca57b26b0402", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/execution_policy.h", + "bom-ref": "9e04faa754a29a57", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/gather.h", "type": "file" }, { - "bom-ref": "4d35d179c486c58d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/memory.h", + "bom-ref": "9d14574ece2d0dc0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/generate.h", "type": "file" }, { - "bom-ref": "c04691d8260d9640", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/memory_resource.h", + "bom-ref": "78df869218ae94dd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/host_vector.h", "type": "file" }, { - "bom-ref": "62d66cd90391890e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/pointer.h", + "bom-ref": "aa28c80902d48c2f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/inner_product.h", "type": "file" }, { - "bom-ref": "3f5bc6ad56121286", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/omp/vector.h", + "bom-ref": "7a130556216f0446", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/constant_iterator.h", "type": "file" }, { - "bom-ref": "ec8031ab509e1765", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/system_error.h", + "bom-ref": "6436ad4337205ed9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/counting_iterator.h", "type": "file" }, { - "bom-ref": "220bdd5cded45591", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/adjacent_difference.h", + "bom-ref": "21d4864c5f412c7a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/any_assign.h", "type": "file" }, { - "bom-ref": "8d9dbdd0497872ef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/assign_value.h", + "bom-ref": "fd81d39fc3a6d02e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/any_system_tag.h", "type": "file" }, { - "bom-ref": "081406ae68c6145f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/binary_search.h", + "bom-ref": "3d7f03e950b7f106", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/device_system_tag.h", "type": "file" }, { - "bom-ref": "2f69473fa2b3e856", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/copy.h", + "bom-ref": "86c18281ce9db24f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/host_system_tag.h", "type": "file" }, { - "bom-ref": "1397143b52a32dde", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/copy_if.h", + "bom-ref": "04306be5924b50cd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/iterator_adaptor_base.h", "type": "file" }, { - "bom-ref": "4f7b13210d8ac334", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/count.h", + "bom-ref": "9fa984548afd629a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/iterator_category_to_system.h", "type": "file" }, { - "bom-ref": "19a3adce7d2088f7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/equal.h", + "bom-ref": "f3e26d70e3009b98", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/iterator_category_to_traversal.h", "type": "file" }, { - "bom-ref": "dbaa39260e65e01c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/execution_policy.h", + "bom-ref": "81be5752a71e41e2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/iterator_category_with_system_and_traversal.h", "type": "file" }, { - "bom-ref": "bb8df208685a119e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/extrema.h", + "bom-ref": "7c5de5f59a17adb1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/iterator_facade_category.h", "type": "file" }, { - "bom-ref": "36eae28add2d5fe3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/fill.h", + "bom-ref": "1bbd3fe30b587461", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/minimum_system.h", "type": "file" }, { - "bom-ref": "4ae6a118e8186556", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/find.h", + "bom-ref": "659671864117a4ac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/normal_iterator.h", "type": "file" }, { - "bom-ref": "eb7f249876e395f7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/for_each.h", + "bom-ref": "e23748f1d886b11e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/retag.h", "type": "file" }, { - "bom-ref": "827b242d55f2941f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/gather.h", + "bom-ref": "44fedb9c009381ec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/tagged_iterator.h", "type": "file" }, { - "bom-ref": "15dd7fe559ad3829", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/generate.h", + "bom-ref": "27b9bf87ae524034", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/detail/tuple_of_iterator_references.h", "type": "file" }, { - "bom-ref": "644348f87fcd39ab", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/get_value.h", + "bom-ref": "2cf67f6e68c50804", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/discard_iterator.h", "type": "file" }, { - "bom-ref": "514ab60de061781c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/inner_product.h", + "bom-ref": "2a60713c89d1c3a8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/iterator_adaptor.h", "type": "file" }, { - "bom-ref": "ce414c34cc2540fd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/iter_swap.h", + "bom-ref": "5c1185431d482d00", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/iterator_categories.h", "type": "file" }, { - "bom-ref": "b72015a2494d3259", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/logical.h", + "bom-ref": "b11e7a0bb3c366be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/iterator_facade.h", "type": "file" }, { - "bom-ref": "3b8e734c14b3a96f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/malloc_and_free.h", + "bom-ref": "d864dd27ee958d2d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/iterator_traits.h", "type": "file" }, { - "bom-ref": "a0084c8936014596", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/merge.h", + "bom-ref": "81e1aa718044a385", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/iterator_traversal_tags.h", "type": "file" }, { - "bom-ref": "e99c3bba4cdb6934", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/mismatch.h", + "bom-ref": "ea38debb11e1f64f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/offset_iterator.h", "type": "file" }, { - "bom-ref": "9cbb6a291eca3a76", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/partition.h", + "bom-ref": "5a2734e86e7b0773", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/permutation_iterator.h", "type": "file" }, { - "bom-ref": "acffa993158a37de", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/per_device_resource.h", + "bom-ref": "dabf7ff9935ca5a8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/retag.h", "type": "file" }, { - "bom-ref": "0fe2b089a6d58a44", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/reduce.h", + "bom-ref": "50c295927d8bb734", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/reverse_iterator.h", "type": "file" }, { - "bom-ref": "18667ce858b8809d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/reduce_by_key.h", + "bom-ref": "8dc71ccf755100c2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/shuffle_iterator.h", "type": "file" }, { - "bom-ref": "ceb8ad7b8d0d401a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/reduce_intervals.h", + "bom-ref": "4b5bd5bb364e4e57", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/strided_iterator.h", "type": "file" }, { - "bom-ref": "a5cac136a6ffbf03", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/remove.h", + "bom-ref": "e0636792b9d6002a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/tabulate_output_iterator.h", "type": "file" }, { - "bom-ref": "7fb4937d08f89045", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/replace.h", + "bom-ref": "249faf007cb0d060", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/transform_input_output_iterator.h", "type": "file" }, { - "bom-ref": "830fcf1446962514", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/reverse.h", + "bom-ref": "19a8cadc9389d326", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/transform_iterator.h", "type": "file" }, { - "bom-ref": "2ced1c07c9539c7f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/scan.h", + "bom-ref": "7b23fafff5bd39b0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/transform_output_iterator.h", "type": "file" }, { - "bom-ref": "38e6eb103245d19c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/scan_by_key.h", + "bom-ref": "9a69eb09d5b65326", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/iterator/zip_iterator.h", "type": "file" }, { - "bom-ref": "af712c67af10f16b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/scatter.h", + "bom-ref": "34240310765163da", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/logical.h", "type": "file" }, { - "bom-ref": "56e2750db1200059", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/sequence.h", + "bom-ref": "234241aea1b0a0b6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/memory.h", "type": "file" }, { - "bom-ref": "e562af265b1d57b3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/set_operations.h", + "bom-ref": "fa75378e2aa292cc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/merge.h", "type": "file" }, { - "bom-ref": "e71ca6c2683c51f1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/sort.h", + "bom-ref": "3856c3d3610e56cc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mismatch.h", "type": "file" }, { - "bom-ref": "4c084d61e944eeeb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/swap_ranges.h", + "bom-ref": "9c13166b77273916", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/allocator.h", "type": "file" }, { - "bom-ref": "05518f4e50976875", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/tabulate.h", + "bom-ref": "78bb715cfa82ec3f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/device_memory_resource.h", "type": "file" }, { - "bom-ref": "e56c178aa00111cf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/temporary_buffer.h", + "bom-ref": "5b95db78f7232c34", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/disjoint_pool.h", "type": "file" }, { - "bom-ref": "e3bcbb8ed7514378", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/transform.h", + "bom-ref": "6c82a0f5f233ee81", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/disjoint_sync_pool.h", "type": "file" }, { - "bom-ref": "c15a9582a0019983", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/transform_reduce.h", + "bom-ref": "7281b93d0d3f28dc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/disjoint_tls_pool.h", "type": "file" }, { - "bom-ref": "388aca9061a22724", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/transform_scan.h", + "bom-ref": "5fc9e87e972c90b5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/fancy_pointer_resource.h", "type": "file" }, { - "bom-ref": "185387a20911ac3d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/uninitialized_copy.h", + "bom-ref": "7dcd20e5aa906297", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/host_memory_resource.h", "type": "file" }, { - "bom-ref": "d81a856266828b85", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/uninitialized_fill.h", + "bom-ref": "4cf46bbc3934e1cb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/memory_resource.h", "type": "file" }, { - "bom-ref": "e8bf4979f8acc36c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/unique.h", + "bom-ref": "b291b1ecc08a4d24", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/new.h", "type": "file" }, { - "bom-ref": "ee050f883730036f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/unique_by_key.h", + "bom-ref": "0d38fdf5c574d143", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/polymorphic_adaptor.h", "type": "file" }, { - "bom-ref": "cb122704dc6fa14d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/execution_policy.h", + "bom-ref": "e2cacc0b8b4468de", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/pool.h", "type": "file" }, { - "bom-ref": "3e6467d4122d5fa2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/memory.h", + "bom-ref": "b4d8c801e602ccb3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/pool_options.h", "type": "file" }, { - "bom-ref": "4b93fab77d564ec5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/memory_resource.h", + "bom-ref": "a3762f8dde2596b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/sync_pool.h", "type": "file" }, { - "bom-ref": "f7c182299c84a4e1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/pointer.h", + "bom-ref": "3985ce0fb1868d59", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/tls_pool.h", "type": "file" }, { - "bom-ref": "28a745bd840c3d72", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system/tbb/vector.h", + "bom-ref": "d87560453883522c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/universal_memory_resource.h", "type": "file" }, { - "bom-ref": "c002bee7e70b7a92", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/system_error.h", + "bom-ref": "a931b681e8880ccc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/mr/validator.h", "type": "file" }, { - "bom-ref": "eed57f92c8cbc1e4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/tabulate.h", + "bom-ref": "80e547c678de2243", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/pair.h", "type": "file" }, { - "bom-ref": "d4259091e4a44c1c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/transform.h", + "bom-ref": "b76bae363f5a092e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/partition.h", "type": "file" }, { - "bom-ref": "255ad68e9480669f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/transform_reduce.h", + "bom-ref": "dd0238ff7032e2ac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/per_device_resource.h", "type": "file" }, { - "bom-ref": "131a881e874928be", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/transform_scan.h", + "bom-ref": "4d9d12d36e3e6e40", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random.h", "type": "file" }, { - "bom-ref": "766a1726968dd376", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/tuple.h", + "bom-ref": "bb7c444c57dadeae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/discard_block_engine.inl", "type": "file" }, { - "bom-ref": "9eb437713cd3fa73", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/type_traits/integer_sequence.h", + "bom-ref": "5cead6c7a060da1c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/linear_congruential_engine.inl", "type": "file" }, { - "bom-ref": "d25532a4b98dab5a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/type_traits/is_contiguous_iterator.h", + "bom-ref": "77086beb100cde7e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/linear_congruential_engine_discard.h", "type": "file" }, { - "bom-ref": "8a940b7446bd4e8d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/type_traits/is_execution_policy.h", + "bom-ref": "ee7f55d56b5070d1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/linear_feedback_shift_engine.inl", "type": "file" }, { - "bom-ref": "df801e67a1c32e96", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/type_traits/is_operator_less_or_greater_function_object.h", + "bom-ref": "10d7bf324c58aca4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/linear_feedback_shift_engine_wordmask.h", "type": "file" }, { - "bom-ref": "b659f8c218c3af75", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/type_traits/is_operator_plus_function_object.h", + "bom-ref": "1b17ecd9fcac548b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/mod.h", "type": "file" }, { - "bom-ref": "d5683c0692c29309", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/type_traits/is_trivially_relocatable.h", + "bom-ref": "52fdbd85fbabcdad", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/normal_distribution.inl", "type": "file" }, { - "bom-ref": "f2a0f28aac34d8d9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/type_traits/logical_metafunctions.h", + "bom-ref": "3d6807515a12d427", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/normal_distribution_base.h", "type": "file" }, { - "bom-ref": "40c33b650e3a4637", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/type_traits/unwrap_contiguous_iterator.h", + "bom-ref": "019aa026a6a15fc2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/random_core_access.h", "type": "file" }, { - "bom-ref": "60b6bcc3220f2af4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/uninitialized_copy.h", + "bom-ref": "d6ae4cf6492d1702", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/subtract_with_carry_engine.inl", "type": "file" }, { - "bom-ref": "849c4e5dc401f125", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/uninitialized_fill.h", + "bom-ref": "06c9057ff3902aae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/uniform_int_distribution.inl", "type": "file" }, { - "bom-ref": "184cb341ff148afb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/unique.h", + "bom-ref": "e25bc61affe9f376", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/uniform_real_distribution.inl", "type": "file" }, { - "bom-ref": "d1a1037f05d647d4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/universal_allocator.h", + "bom-ref": "bea285bf54baeec5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/xor_combine_engine.inl", "type": "file" }, { - "bom-ref": "873e867e55ca6de5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/universal_ptr.h", + "bom-ref": "2365563a359dd6e6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/detail/xor_combine_engine_max.h", "type": "file" }, { - "bom-ref": "6d52ed1aa983a4c9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/universal_vector.h", + "bom-ref": "1e5b0209f9d3e379", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/discard_block_engine.h", "type": "file" }, { - "bom-ref": "457583a29b353d8c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/version.h", + "bom-ref": "2fcf50b6846cf9e8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/linear_congruential_engine.h", "type": "file" }, { - "bom-ref": "f68980ad0988cf9d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cccl/thrust/zip_function.h", + "bom-ref": "f0357b962612ac7c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/linear_feedback_shift_engine.h", "type": "file" }, { - "bom-ref": "39c70f1cd8a3ad18", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/channel_descriptor.h", + "bom-ref": "bfaff2c0af29cc37", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/normal_distribution.h", "type": "file" }, { - "bom-ref": "584a82f3ee593370", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/common_functions.h", + "bom-ref": "4068136e934d914e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/subtract_with_carry_engine.h", "type": "file" }, { - "bom-ref": "d03b241037c71ce4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups.h", + "bom-ref": "fc0b6814b60dea85", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/uniform_int_distribution.h", "type": "file" }, { - "bom-ref": "d731159d91e7b62c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/async.h", + "bom-ref": "f1bc4f5a3be24868", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/uniform_real_distribution.h", "type": "file" }, { - "bom-ref": "0e4f4deced0cac35", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/coalesced_reduce.h", + "bom-ref": "a7ba4fc57c1ad9fa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/random/xor_combine_engine.h", "type": "file" }, { - "bom-ref": "ea01effd3de6d311", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/coalesced_scan.h", + "bom-ref": "345a52fe17842509", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/reduce.h", "type": "file" }, { - "bom-ref": "3b18bb0f18c58d43", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/driver_abi.h", + "bom-ref": "5152f29c47f249b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/remove.h", "type": "file" }, { - "bom-ref": "092fcf06a3c950b8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/functional.h", + "bom-ref": "a63793b33da6bee3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/replace.h", "type": "file" }, { - "bom-ref": "bb64efee2598202d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/helpers.h", + "bom-ref": "27012e92ceb484c0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/reverse.h", "type": "file" }, { - "bom-ref": "1f8465eea7c15287", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/info.h", + "bom-ref": "852f4b6cd2a79fb1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/scan.h", "type": "file" }, { - "bom-ref": "10ce8e3bf3d89d01", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/invoke.h", + "bom-ref": "ad257d4604061fec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/scatter.h", "type": "file" }, { - "bom-ref": "5494d8b67071cc80", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/memory.h", + "bom-ref": "f3915d36901f31ac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/sequence.h", "type": "file" }, { - "bom-ref": "ef696444205d6f70", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/partitioning.h", + "bom-ref": "6511721ea34f5173", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/set_operations.h", "type": "file" }, { - "bom-ref": "7dbbb9f65de4ef44", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/reduce.h", + "bom-ref": "012c0ffe0ffc540e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/shuffle.h", "type": "file" }, { - "bom-ref": "a18a8c6d72099685", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/scan.h", + "bom-ref": "5f7045621fce671e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/sort.h", "type": "file" }, { - "bom-ref": "a87886361333b2ae", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/details/sync.h", + "bom-ref": "d056ac931a150af5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/swap.h", "type": "file" }, { - "bom-ref": "1dfbc0b5307cae38", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/memcpy_async.h", + "bom-ref": "bd1d3268a391765a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/adjacent_difference.h", "type": "file" }, { - "bom-ref": "941d585afbf3fd6d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/reduce.h", + "bom-ref": "87973da34dc7aa38", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/assign_value.h", "type": "file" }, { - "bom-ref": "4adef72879b19636", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cooperative_groups/scan.h", + "bom-ref": "3079f2925e3c747d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/binary_search.h", "type": "file" }, { - "bom-ref": "8fb071c64be3f4c0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/common_functions.h", + "bom-ref": "80457dcd43725e2c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/copy.h", "type": "file" }, { - "bom-ref": "e95e558fd828f53f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/cudacc_ext.h", + "bom-ref": "47d2f889a54a7867", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/copy_if.h", "type": "file" }, { - "bom-ref": "2a17984557b88600", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/device_double_functions.h", + "bom-ref": "b45ea8132b4a9725", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/count.h", "type": "file" }, { - "bom-ref": "a0049f2cfa39afdc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/device_double_functions.hpp", + "bom-ref": "845d25b2a4b7ad42", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/equal.h", "type": "file" }, { - "bom-ref": "aff3c9e59bc1833e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/device_fp128_functions.h", + "bom-ref": "5bf0a96db0aedcb9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/execution_policy.h", "type": "file" }, { - "bom-ref": "25d802591892dd81", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/device_functions.h", + "bom-ref": "fda997e6c4b746d7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/extrema.h", "type": "file" }, { - "bom-ref": "a49f71fb2e7d27d4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/device_functions.hpp", + "bom-ref": "f13a531d8fe2f3fe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/fill.h", "type": "file" }, { - "bom-ref": "6513123e94b46b68", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/func_macro.h", + "bom-ref": "bc581fd1611daacd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/find.h", "type": "file" }, { - "bom-ref": "97f422756f7ab1ca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/host_config.h", + "bom-ref": "68721444e25ad2f7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/for_each.h", "type": "file" }, { - "bom-ref": "87d6cb5058665a1a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/host_defines.h", + "bom-ref": "1506959c6b57771e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/gather.h", "type": "file" }, { - "bom-ref": "6c474de6c8b128a2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/host_runtime.h", + "bom-ref": "bec5a66f3e193336", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/generate.h", "type": "file" }, { - "bom-ref": "73854002ec66f97a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/math_functions.h", + "bom-ref": "d6189a02c9019c4c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/get_value.h", "type": "file" }, { - "bom-ref": "42ba0ad4225c45b6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/math_functions.hpp", + "bom-ref": "6d0e91b185b631cd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/inner_product.h", "type": "file" }, { - "bom-ref": "52559d53fc34a476", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/mma.h", + "bom-ref": "d35f4dbf97b55a88", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/iter_swap.h", "type": "file" }, { - "bom-ref": "1e54caea6d83ac83", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/mma.hpp", + "bom-ref": "3b1ab2c93a15366c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/logical.h", "type": "file" }, { - "bom-ref": "1360a36bc4779526", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/nvfunctional", + "bom-ref": "dd1e192e1b4bd0cd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/malloc_and_free.h", "type": "file" }, { - "bom-ref": "824fa51657b18978", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/sm_100_rt.h", + "bom-ref": "8a1b6ec434b9c3af", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/memory.inl", "type": "file" }, { - "bom-ref": "7b6758fd2fa646ff", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/sm_100_rt.hpp", + "bom-ref": "1b256e44cfcd0c97", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/merge.h", "type": "file" }, { - "bom-ref": "001cab9c11b23570", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/sm_70_rt.h", + "bom-ref": "88f49a8c9a18061f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/mismatch.h", "type": "file" }, { - "bom-ref": "9e3665fb59781455", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/sm_70_rt.hpp", + "bom-ref": "27139b54352d93e3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/partition.h", "type": "file" }, { - "bom-ref": "104854379fb39a6c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/sm_80_rt.h", + "bom-ref": "7e00506ba71350b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/per_device_resource.h", "type": "file" }, { - "bom-ref": "74ffd05de01eb9c5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/sm_80_rt.hpp", + "bom-ref": "3f5f00033a948f8a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/reduce.h", "type": "file" }, { - "bom-ref": "37451d4100561bc1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/sm_90_rt.h", + "bom-ref": "dba2eec961cf11fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/reduce_by_key.h", "type": "file" }, { - "bom-ref": "1319b82c1dc9d559", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/sm_90_rt.hpp", + "bom-ref": "f1a630f875eb0534", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/remove.h", "type": "file" }, { - "bom-ref": "01889fc4e65679ee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/crt/storage_class.h", + "bom-ref": "f201c9e23c29c2db", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/replace.h", "type": "file" }, { - "bom-ref": "8106bbe6eaee009f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuComplex.h", + "bom-ref": "117c81883fef1d49", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/reverse.h", "type": "file" }, { - "bom-ref": "3200a7b3759fcc28", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda.h", + "bom-ref": "e8b52a5994dce8a1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/scan.h", "type": "file" }, { - "bom-ref": "8001692a0d64ce83", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudaEGL.h", + "bom-ref": "b22dffe44d6d7188", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/scan_by_key.h", "type": "file" }, { - "bom-ref": "c2bb6c90e1eea1d3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudaEGLTypedefs.h", + "bom-ref": "1e8c9cad106cab7c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/scatter.h", "type": "file" }, { - "bom-ref": "55bea4b4f4087e8a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudaGL.h", + "bom-ref": "ef083a9a35b9bb75", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/sequence.h", "type": "file" }, { - "bom-ref": "4cb6e0d07f589da8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudaGLTypedefs.h", + "bom-ref": "7a64a0b591b77b70", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/set_operations.h", "type": "file" }, { - "bom-ref": "3bf59b685c284b93", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudaProfiler.h", + "bom-ref": "340d22958eff7d40", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/sort.h", "type": "file" }, { - "bom-ref": "0000b3e692eef141", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudaProfilerTypedefs.h", + "bom-ref": "36da1b7599d4559f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/swap_ranges.h", "type": "file" }, { - "bom-ref": "ba39306a252d1a0b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudaTypedefs.h", + "bom-ref": "18f7933a52e51910", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/tabulate.h", "type": "file" }, { - "bom-ref": "247f19ecfeec5a6b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudaVDPAU.h", + "bom-ref": "61e4e721b59a70a4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/temporary_buffer.h", "type": "file" }, { - "bom-ref": "a10e23e070798aa9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudaVDPAUTypedefs.h", + "bom-ref": "4bb746cdd482440b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/transform.h", "type": "file" }, { - "bom-ref": "ee3c405601dfbb4c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_awbarrier.h", + "bom-ref": "e9782285adcdf52f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/transform_reduce.h", "type": "file" }, { - "bom-ref": "a1a363bcb1d35c45", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_awbarrier_helpers.h", + "bom-ref": "303b2002516e20a2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/transform_scan.h", "type": "file" }, { - "bom-ref": "bba6a7cdb0b9439b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_awbarrier_primitives.h", + "bom-ref": "be246e80b22780b9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/uninitialized_copy.h", "type": "file" }, { - "bom-ref": "1c3d0b4d3164c8fa", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_bf16.h", + "bom-ref": "51a3d44383a1f63a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/uninitialized_fill.h", "type": "file" }, { - "bom-ref": "cd88dab4ae7feaab", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_bf16.hpp", + "bom-ref": "bcc2063425d1cc22", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/unique.h", "type": "file" }, { - "bom-ref": "03f1f6a0e5c6a0ca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_device_runtime_api.h", + "bom-ref": "a2985f8025675814", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/detail/unique_by_key.h", "type": "file" }, { - "bom-ref": "862b3d0d1b67a034", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_egl_interop.h", + "bom-ref": "ddd213af3cf7275d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/execution_policy.h", "type": "file" }, { - "bom-ref": "608eccb1094fde36", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_fp16.h", + "bom-ref": "0e0008ac79974d26", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/memory.h", "type": "file" }, { - "bom-ref": "c03e48774e1223ee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_fp16.hpp", + "bom-ref": "d02e86ee08ea72c9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/memory_resource.h", "type": "file" }, { - "bom-ref": "fcebede57487c3f6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_fp4.h", + "bom-ref": "f8a39c07404b6a5c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/pointer.h", "type": "file" }, { - "bom-ref": "a43c8b2aa85cbeeb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_fp4.hpp", + "bom-ref": "be812e55841aa96c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cpp/vector.h", "type": "file" }, { - "bom-ref": "c23832b8d4075318", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_fp6.h", + "bom-ref": "083f09ed99200ce3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/config.h", "type": "file" }, { - "bom-ref": "762999d202466bcb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_fp6.hpp", + "bom-ref": "4584a143f576046c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/adjacent_difference.h", "type": "file" }, { - "bom-ref": "24ed0a9b5009a202", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_fp8.h", + "bom-ref": "84c63a63285d5f69", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/assign_value.h", "type": "file" }, { - "bom-ref": "440fc8d4f59e095d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_fp8.hpp", + "bom-ref": "d5dce3ab9c2fd4e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/binary_search.h", "type": "file" }, { - "bom-ref": "cd1ae8a68e61fbdc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_gl_interop.h", + "bom-ref": "200d1a3b9db8cdf3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/cdp_dispatch.h", "type": "file" }, { - "bom-ref": "d029c2ec8d42f422", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_occupancy.h", + "bom-ref": "7f7178b6e1b287aa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/copy.h", "type": "file" }, { - "bom-ref": "0c9ab330f12e73c3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_pipeline.h", + "bom-ref": "d5247d431e22d4f7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/copy_if.h", "type": "file" }, { - "bom-ref": "ee9544a20842e20b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_pipeline_helpers.h", + "bom-ref": "3013ddb582be83c4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/core/agent_launcher.h", "type": "file" }, { - "bom-ref": "def8b55ce558be51", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_pipeline_primitives.h", + "bom-ref": "4a5d96fd42e4e71f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/core/triple_chevron_launch.h", "type": "file" }, { - "bom-ref": "fbdc4d2bd30ea02e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_profiler_api.h", + "bom-ref": "a1d3098241378acf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/core/util.h", "type": "file" }, { - "bom-ref": "6adee5f94c1eb334", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_runtime.h", + "bom-ref": "444cac864c432dbf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/count.h", "type": "file" }, { - "bom-ref": "98958e8528d079e4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_runtime_api.h", + "bom-ref": "a96f702c115ed99e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/cross_system.h", "type": "file" }, { - "bom-ref": "c52ffe1d6cf29f3a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_stdint.h", + "bom-ref": "a4ae8b4c2be803cd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/dispatch.h", "type": "file" }, { - "bom-ref": "b64a0c434de26a3a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cuda_vdpau_interop.h", + "bom-ref": "3417ad447b1115c5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/equal.h", "type": "file" }, { - "bom-ref": "dd70535f0f81cea3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudalibxt.h", + "bom-ref": "b3703f4948e96f01", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/error.inl", "type": "file" }, { - "bom-ref": "137024469eddcc13", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cudart_platform.h", + "bom-ref": "0fa19f4085de64f3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/execution_policy.h", "type": "file" }, { - "bom-ref": "f906d0863183b084", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cufft.h", + "bom-ref": "219173e41afc15a2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/extrema.h", "type": "file" }, { - "bom-ref": "ec2f4a7dc2d4bfea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cufftXt.h", + "bom-ref": "e3179e362d6bc8e1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/fill.h", "type": "file" }, { - "bom-ref": "5421c790adfba7f3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cufft_device.h", + "bom-ref": "516ba69b3dd241a1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/find.h", "type": "file" }, { - "bom-ref": "97dbf6cee429c658", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cufftw.h", + "bom-ref": "b7bb9a341341c023", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/for_each.h", "type": "file" }, { - "bom-ref": "fd430093c2216a39", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cufile.h", + "bom-ref": "b9fa5879fe9e999e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/gather.h", "type": "file" }, { - "bom-ref": "4cc8502f19982f65", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti.h", + "bom-ref": "1616d3be52e4d3ab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/generate.h", "type": "file" }, { - "bom-ref": "7974c4dd5c7b2ab0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_activity.h", + "bom-ref": "724feeb5c9e87559", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/get_value.h", "type": "file" }, { - "bom-ref": "9411cac324601c95", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_activity_deprecated.h", + "bom-ref": "6b8440bb1c9082ba", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/inner_product.h", "type": "file" }, { - "bom-ref": "2754c3a96c29f908", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_callbacks.h", + "bom-ref": "e35e79479daf33f0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/iter_swap.h", "type": "file" }, { - "bom-ref": "931fbcfb04266ef6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_checkpoint.h", + "bom-ref": "5a069258cfb86cbc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/logical.h", "type": "file" }, { - "bom-ref": "1fae93f97440f505", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_common.h", + "bom-ref": "80c842d0226b4455", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/make_unsigned_special.h", "type": "file" }, { - "bom-ref": "ef508994ea42b3ed", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_driver_cbid.h", + "bom-ref": "e86515315a344db6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/malloc_and_free.h", "type": "file" }, { - "bom-ref": "568cea9a74821c7a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_events.h", + "bom-ref": "2033ae8436d977d1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/memory.inl", "type": "file" }, { - "bom-ref": "47c42b0b129d27b7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_metrics.h", + "bom-ref": "7c2a9430e6e5e6a2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/merge.h", "type": "file" }, { - "bom-ref": "9cf03670422ef156", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_nvtx_cbid.h", + "bom-ref": "aff755f547853a05", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/mismatch.h", "type": "file" }, { - "bom-ref": "02cc31dcfa86e6ec", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_pcsampling.h", + "bom-ref": "a585e471ad65f88e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/parallel_for.h", "type": "file" }, { - "bom-ref": "8fc0eec0af13ed62", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_pcsampling_util.h", + "bom-ref": "22fcaafeaddfadb6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/partition.h", "type": "file" }, { - "bom-ref": "ee255a8995ff2407", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_pmsampling.h", + "bom-ref": "fa73a7869688e6e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/per_device_resource.h", "type": "file" }, { - "bom-ref": "73865ff2d5bf938b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_profiler_host.h", + "bom-ref": "ec44d428c18fa0d8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/reduce.h", "type": "file" }, { - "bom-ref": "97d53ff53cf616a7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_profiler_target.h", + "bom-ref": "13b80531d77c6a41", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/reduce_by_key.h", "type": "file" }, { - "bom-ref": "bb3cd578b18b09a0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_range_profiler.h", + "bom-ref": "14a9d923fa6c9719", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/remove.h", "type": "file" }, { - "bom-ref": "34175ab2feaf0034", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_result.h", + "bom-ref": "915d185a5e0aaa54", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/replace.h", "type": "file" }, { - "bom-ref": "9e445327335df8a6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_runtime_cbid.h", + "bom-ref": "51c5f2d7be36cbd6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/reverse.h", "type": "file" }, { - "bom-ref": "17434fbc45801d24", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_sass_metrics.h", + "bom-ref": "69f5d916f29ac67b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/scan.h", "type": "file" }, { - "bom-ref": "6f2229f0151606e8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_target.h", + "bom-ref": "f253b5da7f386a34", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/scan_by_key.h", "type": "file" }, { - "bom-ref": "d74b5a754d27bc59", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cupti_version.h", + "bom-ref": "1c556f7236473968", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/scatter.h", "type": "file" }, { - "bom-ref": "2c093234334cf047", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand.h", + "bom-ref": "cb59735f5623fef2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/sequence.h", "type": "file" }, { - "bom-ref": "655c3388762be984", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_discrete.h", + "bom-ref": "bdd2b9d76c08c5dc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/set_operations.h", "type": "file" }, { - "bom-ref": "b539e4434fd1ee10", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_discrete2.h", + "bom-ref": "d35b5a2a266b3a75", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/sort.h", "type": "file" }, { - "bom-ref": "e9df89f645a04931", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_globals.h", + "bom-ref": "53b970de63d97d09", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/swap_ranges.h", "type": "file" }, { - "bom-ref": "1ea0c90785d216c1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_kernel.h", + "bom-ref": "229ae7570b16654c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/tabulate.h", "type": "file" }, { - "bom-ref": "6c61805152b86774", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_lognormal.h", + "bom-ref": "0337d986b47bd47a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/temporary_buffer.h", "type": "file" }, { - "bom-ref": "c1196aabafb53328", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_mrg32k3a.h", + "bom-ref": "5dff523cbe8538e8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/terminate.h", "type": "file" }, { - "bom-ref": "5c4f0ed1a3210960", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_mtgp32.h", + "bom-ref": "97e981de8be38aa6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/transform.h", "type": "file" }, { - "bom-ref": "cf5bfcdc13f957af", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_mtgp32_host.h", + "bom-ref": "b750f005943e6149", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/transform_reduce.h", "type": "file" }, { - "bom-ref": "ef6c5d7793340c22", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_mtgp32_kernel.h", + "bom-ref": "8536f8e389959ce6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/transform_scan.h", "type": "file" }, { - "bom-ref": "241ce2f609df6a0c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_mtgp32dc_p_11213.h", + "bom-ref": "31071fffa4a6a64b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/uninitialized_copy.h", "type": "file" }, { - "bom-ref": "38a3fd4ff7c5e1c4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_normal.h", + "bom-ref": "a7c43baedba534e9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/uninitialized_fill.h", "type": "file" }, { - "bom-ref": "0f48ddad4cba55c7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_normal_static.h", + "bom-ref": "805ff2a74d6e60a1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/unique.h", "type": "file" }, { - "bom-ref": "c736d9d3d82811b9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_philox4x32_x.h", + "bom-ref": "2e1dd421c368dc59", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/unique_by_key.h", "type": "file" }, { - "bom-ref": "1fcc61480ddf6b7a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_poisson.h", + "bom-ref": "8068971c94cfd138", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/detail/util.h", "type": "file" }, { - "bom-ref": "053e0b9a5e2a4452", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_precalc.h", + "bom-ref": "8679d5c4850019e1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/error.h", "type": "file" }, { - "bom-ref": "2491974b4e5053c0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/curand_uniform.h", + "bom-ref": "3156974d07db1f12", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/execution_policy.h", "type": "file" }, { - "bom-ref": "0a7dec1e12b190b1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cusolverDn.h", + "bom-ref": "458f8aadb430ea56", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/memory.h", "type": "file" }, { - "bom-ref": "250ecba31c4ae2a2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cusolverMg.h", + "bom-ref": "de237c0c834414b4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/memory_resource.h", "type": "file" }, { - "bom-ref": "fea58adaca598ad7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cusolverRf.h", + "bom-ref": "29875e16d9f7755f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/pointer.h", "type": "file" }, { - "bom-ref": "94a139e417ac4ce6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cusolverSp.h", + "bom-ref": "8585e309c79d7f82", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/cuda/vector.h", "type": "file" }, { - "bom-ref": "ce4ab2ca75df441f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cusolverSp_LOWLEVEL_PREVIEW.h", + "bom-ref": "2f692ce35d84a15c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/bad_alloc.h", "type": "file" }, { - "bom-ref": "d7e4b1ac5a6c3cbf", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cusolver_common.h", + "bom-ref": "bbcd4b0a892ebae4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/errno.h", "type": "file" }, { - "bom-ref": "a7438b4c2cf57914", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cusparse.h", + "bom-ref": "945d6502c27c24d9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/error_category.inl", "type": "file" }, { - "bom-ref": "b0200069c5fc8862", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/cusparse_v2.h", + "bom-ref": "2d7f004473d4c9ee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/error_code.inl", "type": "file" }, { - "bom-ref": "1d0d10c149093c4e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/device_atomic_functions.h", + "bom-ref": "e4479e4db03ee1df", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/error_condition.inl", "type": "file" }, { - "bom-ref": "0fa3f5f16de288ae", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/device_atomic_functions.hpp", + "bom-ref": "5f690a1000c2b3c8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/adjacent_difference.h", "type": "file" }, { - "bom-ref": "731c1f23c9d0b812", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/device_double_functions.h", + "bom-ref": "409b1040e5b29d40", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/adjacent_difference.inl", "type": "file" }, { - "bom-ref": "7aeaf59e9a64bffb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/device_functions.h", + "bom-ref": "d4cee428adff3cd5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/binary_search.h", "type": "file" }, { - "bom-ref": "fd5c26bc7d025577", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/device_launch_parameters.h", + "bom-ref": "2d76876bcc42ef22", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/binary_search.inl", "type": "file" }, { - "bom-ref": "7b034557b300dca7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/device_types.h", + "bom-ref": "ec1c153c65ca5853", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/copy.h", "type": "file" }, { - "bom-ref": "b12163a94fec5eb1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/driver_functions.h", + "bom-ref": "0242f33a4bc79124", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/copy.inl", "type": "file" }, { - "bom-ref": "c9e85987e5ba78a3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/driver_types.h", + "bom-ref": "1d8e89f771bf42bb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/copy_if.h", "type": "file" }, { - "bom-ref": "89d3725010e4584c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/fatbinary_section.h", + "bom-ref": "e863430b1a8e9cc7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/copy_if.inl", "type": "file" }, { - "bom-ref": "099742520ced90e7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/generated_cudaGL_meta.h", + "bom-ref": "638ea948dbe1173d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/count.h", "type": "file" }, { - "bom-ref": "7d12cf09e01c7e17", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/generated_cudaVDPAU_meta.h", + "bom-ref": "27d7f881f1ad238f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/count.inl", "type": "file" }, { - "bom-ref": "ad67a7ad78fe9dc3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/generated_cuda_gl_interop_meta.h", + "bom-ref": "56d9679730ddff2d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/equal.h", "type": "file" }, { - "bom-ref": "6148947ed9a881f3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/generated_cuda_meta.h", + "bom-ref": "2f95351a5bca03d2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/equal.inl", "type": "file" }, { - "bom-ref": "02bfad2adcec1b9f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/generated_cuda_runtime_api_meta.h", + "bom-ref": "6d279d78f1e4eceb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/extrema.h", "type": "file" }, { - "bom-ref": "a5c57fde4bf042d5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/generated_cuda_vdpau_interop_meta.h", + "bom-ref": "7e61bc61b4de59ac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/extrema.inl", "type": "file" }, { - "bom-ref": "22cee43b7ef0bd1a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/generated_cudart_removed_meta.h", + "bom-ref": "d5a1790b725a50a4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/fill.h", "type": "file" }, { - "bom-ref": "dade0e0c69382e78", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/generated_nvtx_meta.h", + "bom-ref": "cda1508923700df5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/find.h", "type": "file" }, { - "bom-ref": "bdd3a66ebd81480f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/host_config.h", + "bom-ref": "e104aa54f96e6b4d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/find.inl", "type": "file" }, { - "bom-ref": "2cb15ffd3c69c4fd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/host_defines.h", + "bom-ref": "29f3933c0ffdab71", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/for_each.h", "type": "file" }, { - "bom-ref": "1bdfc22a10938b10", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/library_types.h", + "bom-ref": "97bfb6c11923b873", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/gather.h", "type": "file" }, { - "bom-ref": "7e44e1cf9de7b66f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/math_constants.h", + "bom-ref": "a662a617e24729cb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/gather.inl", "type": "file" }, { - "bom-ref": "56e0876ed227f2d2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/math_functions.h", + "bom-ref": "977d392e2f824b71", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/generate.h", "type": "file" }, { - "bom-ref": "5d614e147b692e30", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/mma.h", + "bom-ref": "83f45f501c858589", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/generate.inl", "type": "file" }, { - "bom-ref": "662560eac60fb26f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/npp.h", + "bom-ref": "c3f8c06b5b2d16be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/inner_product.h", "type": "file" }, { - "bom-ref": "c06a097b863a46e8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppcore.h", + "bom-ref": "635f4a34d1d53087", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/inner_product.inl", "type": "file" }, { - "bom-ref": "c474dc0ca0b2346c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppdefs.h", + "bom-ref": "2759b6ddb2351922", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/logical.h", "type": "file" }, { - "bom-ref": "0048d0de892756dc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi.h", + "bom-ref": "490eb002d249da2e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/memory.h", "type": "file" }, { - "bom-ref": "ca60a47e5a494423", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi_arithmetic_and_logical_operations.h", + "bom-ref": "ed7e750efe864fd2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/memory.inl", "type": "file" }, { - "bom-ref": "96ab1f9474c6d7a2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi_color_conversion.h", + "bom-ref": "df50a8e27344c762", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/merge.h", "type": "file" }, { - "bom-ref": "65f3269924e48ef2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi_data_exchange_and_initialization.h", + "bom-ref": "fef6b028b52c2c85", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/merge.inl", "type": "file" }, { - "bom-ref": "7f3aea35308cb1cc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi_filtering_functions.h", + "bom-ref": "5e63566282cdcc63", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/mismatch.h", "type": "file" }, { - "bom-ref": "810bc7100acc224e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi_geometry_transforms.h", + "bom-ref": "bf79f27bfc3ade4a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/mismatch.inl", "type": "file" }, { - "bom-ref": "ae5505f9309a1986", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi_linear_transforms.h", + "bom-ref": "fc9fe53404a235af", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/partition.h", "type": "file" }, { - "bom-ref": "e72436b558935583", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi_morphological_operations.h", + "bom-ref": "3c83c8846c82f49f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/partition.inl", "type": "file" }, { - "bom-ref": "4dd4cd30bd39eb1a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi_statistics_functions.h", + "bom-ref": "1a4297c6c9359bb1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/per_device_resource.h", "type": "file" }, { - "bom-ref": "41edeef3537787e2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi_support_functions.h", + "bom-ref": "20ca6d047b2057be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reduce.h", "type": "file" }, { - "bom-ref": "d417659bdffec164", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nppi_threshold_and_compare_operations.h", + "bom-ref": "2bd1e7560050d159", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reduce.inl", "type": "file" }, { - "bom-ref": "43d43ff1171f5bca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/npps.h", + "bom-ref": "c18d668c90ebfb53", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reduce_by_key.h", "type": "file" }, { - "bom-ref": "77dcd94cbd69647e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/npps_arithmetic_and_logical_operations.h", + "bom-ref": "3dba4c25f55f4edb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reduce_by_key.inl", "type": "file" }, { - "bom-ref": "7e16edaeab2a443f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/npps_conversion_functions.h", + "bom-ref": "38e9a8e3d4ec387b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/remove.h", "type": "file" }, { - "bom-ref": "7116ab49943a9d90", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/npps_filtering_functions.h", + "bom-ref": "85ccde70409ff8bd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/remove.inl", "type": "file" }, { - "bom-ref": "705864012bb88936", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/npps_initialization.h", + "bom-ref": "49788ed9276bb7ff", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/replace.h", "type": "file" }, { - "bom-ref": "ff2ba82cb39be25d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/npps_statistics_functions.h", + "bom-ref": "be08fab8ea83e45a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/replace.inl", "type": "file" }, { - "bom-ref": "f30fa3e2777a8ec7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/npps_support_functions.h", + "bom-ref": "a678ca2b1b29ea9f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reverse.h", "type": "file" }, { - "bom-ref": "c65213a4e8e3eae9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nv/detail/__preprocessor", + "bom-ref": "3ebc23783b2f2fc4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/reverse.inl", "type": "file" }, { - "bom-ref": "589fb4ead8d6b4fb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nv/detail/__target_macros", + "bom-ref": "015da625b8f22f7a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scalar/binary_search.h", "type": "file" }, { - "bom-ref": "090974280f21de23", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nv/target", + "bom-ref": "f8a55711d005b1d9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scalar/binary_search.inl", "type": "file" }, { - "bom-ref": "59eeb89f759814d7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvFatbin.h", + "bom-ref": "564af2bb98ebf6bb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scan.h", "type": "file" }, { - "bom-ref": "6531293ed08a05c3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvJitLink.h", + "bom-ref": "d98e1f89c3569fd2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scan_by_key.h", "type": "file" }, { - "bom-ref": "ab6d0cba50931658", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvPTXCompiler.h", + "bom-ref": "7c8cb58a686b547d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scan_by_key.inl", "type": "file" }, { - "bom-ref": "7f986eb46f7d4918", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvfunctional", + "bom-ref": "0bf53e503a6c9aab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scatter.h", "type": "file" }, { - "bom-ref": "0a7199678f8206ab", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvjpeg.h", + "bom-ref": "558b17fdc780c0d0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/scatter.inl", "type": "file" }, { - "bom-ref": "d3f414c1e81f79fb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvml.h", + "bom-ref": "e7c58203af3929fe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/select_system.h", "type": "file" }, { - "bom-ref": "dbb9df4d7a19559a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvperf_common.h", + "bom-ref": "64bb5f6608ce896b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/sequence.h", "type": "file" }, { - "bom-ref": "ca28b520192b51f2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvperf_cuda_host.h", + "bom-ref": "df67df6a0a6de417", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/set_operations.h", "type": "file" }, { - "bom-ref": "eab696c99cfc83ea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvperf_host.h", + "bom-ref": "fd17e286c7d022f0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/set_operations.inl", "type": "file" }, { - "bom-ref": "63ad4a22ee44ab6f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvperf_target.h", + "bom-ref": "f3650e708a653a8f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/shuffle.h", "type": "file" }, { - "bom-ref": "21590e0f53e8a8a9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvrtc.h", + "bom-ref": "5b288cb6bf4c254f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/shuffle.inl", "type": "file" }, { - "bom-ref": "9dc16959031e5c77", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExt.h", + "bom-ref": "05dbbfd581926819", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/sort.h", "type": "file" }, { - "bom-ref": "5ffe13bf947fbe2a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtCounters.h", + "bom-ref": "d98ce35fdb718321", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/sort.inl", "type": "file" }, { - "bom-ref": "d55c48f6d04fa2c8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtCuda.h", + "bom-ref": "41c321fa0979de27", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/swap_ranges.h", "type": "file" }, { - "bom-ref": "d547da07505042e6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtCudaRt.h", + "bom-ref": "7edc0342ed9af0ff", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/swap_ranges.inl", "type": "file" }, { - "bom-ref": "8d1289c5fa63009c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtMem.h", + "bom-ref": "5158cb47fccc9e2e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/tabulate.h", "type": "file" }, { - "bom-ref": "c653c84b26b9be9b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtMemCudaRt.h", + "bom-ref": "d7c9ee80c65ac0b0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/tabulate.inl", "type": "file" }, { - "bom-ref": "84305b8c2ceec18f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtOpenCL.h", + "bom-ref": "302ccb9299f6bace", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/tag.h", "type": "file" }, { - "bom-ref": "bce621445f235ff9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtPayload.h", + "bom-ref": "036097a7a3ca7a18", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/temporary_buffer.h", "type": "file" }, { - "bom-ref": "311b5560512e7f5b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtPayloadHelper.h", + "bom-ref": "106890cb215984e7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/temporary_buffer.inl", "type": "file" }, { - "bom-ref": "31722159507062ee", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtSemanticsCorrelation.h", + "bom-ref": "9d6d06feabbd997e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/transform.h", "type": "file" }, { - "bom-ref": "ea3c82cd16e119ea", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtSemanticsCounters.h", + "bom-ref": "5eb27d62f6fd670d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/transform_reduce.h", "type": "file" }, { - "bom-ref": "c7ea351012415e66", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtSemanticsScope.h", + "bom-ref": "797fb6f21a914d03", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/transform_reduce.inl", "type": "file" }, { - "bom-ref": "c103f84752de88f9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtSemanticsTime.h", + "bom-ref": "d86aaf58ddb55f64", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/transform_scan.h", "type": "file" }, { - "bom-ref": "ecf99b752bbe9ed2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvToolsExtSync.h", + "bom-ref": "0c29d8066e1e35f1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/transform_scan.inl", "type": "file" }, { - "bom-ref": "0716b239888e2f29", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtx3.hpp", + "bom-ref": "31a3a5c0469a782a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/uninitialized_copy.h", "type": "file" }, { - "bom-ref": "24134146d70b63a5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtHelperMacros.h", + "bom-ref": "fb11ffc36f7634e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/uninitialized_copy.inl", "type": "file" }, { - "bom-ref": "2d559bf1774017ba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtImpl.h", + "bom-ref": "a6a4985393ed34d0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/uninitialized_fill.h", "type": "file" }, { - "bom-ref": "e91c58ac6b435271", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtImplCounters_v1.h", + "bom-ref": "09cf58b8bf833f82", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/uninitialized_fill.inl", "type": "file" }, { - "bom-ref": "7897289f06f77d12", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtImplMemCudaRt_v1.h", + "bom-ref": "9ffbfb4600f0600a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/unique.h", "type": "file" }, { - "bom-ref": "ceb2c00873ce50e2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtImplMem_v1.h", + "bom-ref": "f6122a0df04ca0ee", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/unique.inl", "type": "file" }, { - "bom-ref": "e1a519ed8db0343a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtImplPayload_v1.h", + "bom-ref": "bcd101b1f4bc7e2f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/unique_by_key.h", "type": "file" }, { - "bom-ref": "ac5cea3d020ee396", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtInit.h", + "bom-ref": "b809bdb6368336d1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/generic/unique_by_key.inl", "type": "file" }, { - "bom-ref": "3cd253585f5ba779", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtPayloadHelperInternal.h", + "bom-ref": "4085c405bb0ae6b7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/internal/decompose.h", "type": "file" }, { - "bom-ref": "791deb627e67b98f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtPayloadTypeInfo.h", + "bom-ref": "8828b19b446f35dc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/adjacent_difference.h", "type": "file" }, { - "bom-ref": "b07142cc8246c857", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtTypes.h", + "bom-ref": "0300d725a8289f75", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/assign_value.h", "type": "file" }, { - "bom-ref": "a0e644e7376846f5", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImpl.h", + "bom-ref": "cee2677958441e39", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/binary_search.h", "type": "file" }, { - "bom-ref": "e182a340835c7863", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImplCore.h", + "bom-ref": "9f8053fe0f401544", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/copy.h", "type": "file" }, { - "bom-ref": "012d43dcc8ed92ba", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImplCudaRt_v3.h", + "bom-ref": "0ab24d93c0d8e4bf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/copy_backward.h", "type": "file" }, { - "bom-ref": "ed3abe3fd9fac595", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImplCuda_v3.h", + "bom-ref": "319bbc70d3f5b044", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/copy_if.h", "type": "file" }, { - "bom-ref": "03e4849483cbee03", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImplOpenCL_v3.h", + "bom-ref": "def1f3c527c77426", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/count.h", "type": "file" }, { - "bom-ref": "ef990531208ee599", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImplSync_v3.h", + "bom-ref": "6c34447326b3417a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/equal.h", "type": "file" }, { - "bom-ref": "67b2655788071c00", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxInit.h", + "bom-ref": "386d9b0978daf24c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/execution_policy.h", "type": "file" }, { - "bom-ref": "03934e65b137ac26", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxInitDecls.h", + "bom-ref": "8eb5e42ddaf2aa17", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/extrema.h", "type": "file" }, { - "bom-ref": "1f8214565b9044e2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxInitDefs.h", + "bom-ref": "85748a0b44d5b4a5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/fill.h", "type": "file" }, { - "bom-ref": "961ca1a5b1aefd6b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxLinkOnce.h", + "bom-ref": "48c3120abf66d432", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/find.h", "type": "file" }, { - "bom-ref": "ac88e7a84711ec3d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxTypes.h", + "bom-ref": "179c6a4000379551", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/for_each.h", "type": "file" }, { - "bom-ref": "e107f1894fd47aa4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_20_atomic_functions.h", + "bom-ref": "f932a0e8815cf60a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/gather.h", "type": "file" }, { - "bom-ref": "d6557de1123a3b4e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_20_atomic_functions.hpp", + "bom-ref": "63d931c8a65f1494", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/general_copy.h", "type": "file" }, { - "bom-ref": "32c49b07d1ad9aac", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_20_intrinsics.h", + "bom-ref": "5ab6cbc8557bf48a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/generate.h", "type": "file" }, { - "bom-ref": "19062ea80f5e724a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_20_intrinsics.hpp", + "bom-ref": "0733efa1daedd482", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/get_value.h", "type": "file" }, { - "bom-ref": "14c3ac93ad7836c6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_30_intrinsics.h", + "bom-ref": "793fe4f4894c5ba3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/inner_product.h", "type": "file" }, { - "bom-ref": "bf041b4d45882f73", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_30_intrinsics.hpp", + "bom-ref": "7d2327d34e2fcddc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/insertion_sort.h", "type": "file" }, { - "bom-ref": "9c21e1aa2f3f377e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_32_atomic_functions.h", + "bom-ref": "0a9700efa45056e8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/iter_swap.h", "type": "file" }, { - "bom-ref": "85210c69519bc92d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_32_atomic_functions.hpp", + "bom-ref": "f2a020885b920fd2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/logical.h", "type": "file" }, { - "bom-ref": "d01b83c51a9b52eb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_32_intrinsics.h", + "bom-ref": "18d39e509b942dd1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/malloc_and_free.h", "type": "file" }, { - "bom-ref": "26fd6a83795f49b8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_32_intrinsics.hpp", + "bom-ref": "84b45c5fe8a3471d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/merge.h", "type": "file" }, { - "bom-ref": "3cb5fccbc8151b88", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_35_atomic_functions.h", + "bom-ref": "83387db582d49e21", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/mismatch.h", "type": "file" }, { - "bom-ref": "aea4906584985214", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_35_intrinsics.h", + "bom-ref": "534216c894f8cb7e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/partition.h", "type": "file" }, { - "bom-ref": "18fee35779ff620b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_60_atomic_functions.h", + "bom-ref": "e144dd38ad46c578", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/per_device_resource.h", "type": "file" }, { - "bom-ref": "a1bce2fbe23c3ccc", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_60_atomic_functions.hpp", + "bom-ref": "7104a6cc3280edd3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/reduce.h", "type": "file" }, { - "bom-ref": "29a55a00a9665bc7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_61_intrinsics.h", + "bom-ref": "88895aed5b11431a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/reduce_by_key.h", "type": "file" }, { - "bom-ref": "1819590078b97a63", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/sm_61_intrinsics.hpp", + "bom-ref": "89605d1637ef16e7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/remove.h", "type": "file" }, { - "bom-ref": "bc41cbfa5f64ec6b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/surface_indirect_functions.h", + "bom-ref": "2265435ee7f5c47d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/replace.h", "type": "file" }, { - "bom-ref": "6f3d7f74b40f093b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/surface_types.h", + "bom-ref": "b709ea5d06deecdb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/reverse.h", "type": "file" }, { - "bom-ref": "23d19e3d8ea9ccd7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/texture_indirect_functions.h", + "bom-ref": "0b4c1cfb295c7772", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/scan.h", "type": "file" }, { - "bom-ref": "f10fd8504e0b95a1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/texture_types.h", + "bom-ref": "4e96c60195631817", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/scan_by_key.h", "type": "file" }, { - "bom-ref": "76e7b24b26ca95a1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/vector_functions.h", + "bom-ref": "ba5a8481915801a2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/scatter.h", "type": "file" }, { - "bom-ref": "21eee0bc24c13f69", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/vector_functions.hpp", + "bom-ref": "19bc98039c982c03", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/sequence.h", "type": "file" }, { - "bom-ref": "7db1d273f7bbd92d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/include/vector_types.h", + "bom-ref": "54fa0dd3001fad65", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/set_operations.h", "type": "file" }, { - "bom-ref": "3afdfb1ab593d485", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/cccl/cccl-config-version.cmake", + "bom-ref": "a8d15b05e2bb185f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/sort.h", "type": "file" }, { - "bom-ref": "bba1bdef753bef9c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/cccl/cccl-config.cmake", + "bom-ref": "af7309d09befb5a4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/stable_merge_sort.h", "type": "file" }, { - "bom-ref": "7b9d4966dd38ac6f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/cub/cub-config-version.cmake", + "bom-ref": "20a08c0a130bc4d2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/stable_primitive_sort.h", "type": "file" }, { - "bom-ref": "aac7556340ec0364", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/cub/cub-config.cmake", + "bom-ref": "0ea9d758ad628d33", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/stable_radix_sort.h", "type": "file" }, { - "bom-ref": "91e3ba9fd33d0197", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/cub/cub-header-search.cmake", + "bom-ref": "b433bf79e72baa7e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/swap_ranges.h", "type": "file" }, { - "bom-ref": "cce78f5994cf5c75", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/libcudacxx/libcudacxx-config-version.cmake", + "bom-ref": "a3b4c3424307c5df", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/tabulate.h", "type": "file" }, { - "bom-ref": "e84041b6dfbf645c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/libcudacxx/libcudacxx-config.cmake", + "bom-ref": "1013463dc5369ee5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/temporary_buffer.h", "type": "file" }, { - "bom-ref": "53d7ab92aff0551c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/libcudacxx/libcudacxx-header-search.cmake", + "bom-ref": "d169de1ea932b32f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/transform.h", "type": "file" }, { - "bom-ref": "cce45fc98b3b015e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/thrust/FindTBB.cmake", + "bom-ref": "87ca2206fa6252d5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/transform_reduce.h", "type": "file" }, { - "bom-ref": "bb11ec1da0c48ae9", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/thrust/README.md", + "bom-ref": "e24b89b40cfedeb6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/transform_scan.h", "type": "file" }, { - "bom-ref": "23f34912c9926ea0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/thrust/thrust-config-version.cmake", + "bom-ref": "fe7a48b4143e972c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/trivial_copy.h", "type": "file" }, { - "bom-ref": "74be9561c0b3e065", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/thrust/thrust-config.cmake", + "bom-ref": "784fb8a5d21f97b1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/uninitialized_copy.h", "type": "file" }, { - "bom-ref": "86018200867b77f6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/cmake/thrust/thrust-header-search.cmake", + "bom-ref": "aa1461034d065a43", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/uninitialized_fill.h", "type": "file" }, { - "bom-ref": "b9a334b016041577", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcheckpoint.so", + "bom-ref": "1e45a7956b32cf0c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/unique.h", "type": "file" }, { - "bom-ref": "93fcef0c4d4de65b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcudadevrt.a", + "bom-ref": "673fa179e7f80da3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/sequential/unique_by_key.h", "type": "file" }, { - "bom-ref": "1ccf78d0153ed06d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcudart.so.13.2.75", + "bom-ref": "8d1eba39480b7dc5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/detail/system_error.inl", "type": "file" }, { - "bom-ref": "5f125702ccd60a41", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcudart_static.a", + "bom-ref": "c16915c38ad6bbdf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/error_code.h", "type": "file" }, { - "bom-ref": "c6fb7f04dc37c6d0", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcufft.so.12.2.0.46", + "bom-ref": "b4e9208f916ff0d0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/adjacent_difference.h", "type": "file" }, { - "bom-ref": "28e1b1b6c72b88ff", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcufftw.so.12.2.0.46", + "bom-ref": "723ca0524a134b47", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/assign_value.h", "type": "file" }, { - "bom-ref": "0ba954ddb709df8f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcufile.so.1.17.1", + "bom-ref": "0f1ea77819da2903", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/binary_search.h", "type": "file" }, { - "bom-ref": "65e742c1ba959824", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcufile_rdma.so.1.17.1", + "bom-ref": "7494d4888b4a6261", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/copy.h", "type": "file" }, { - "bom-ref": "1ddcb89f508f205c", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libculibos.a", + "bom-ref": "1969473a2eda3881", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/copy_if.h", "type": "file" }, { - "bom-ref": "207c70f53eaf5323", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcupti.so.2026.1.1", + "bom-ref": "f1b1dd1b6506257e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/count.h", "type": "file" }, { - "bom-ref": "59655be03ad0b45a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcurand.so.10.4.2.55", + "bom-ref": "40552ea06205108c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/default_decomposition.h", "type": "file" }, { - "bom-ref": "58697550506dc4ac", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcusolver.so.12.2.0.1", + "bom-ref": "209940a81167c21e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/equal.h", "type": "file" }, { - "bom-ref": "ecea5418f3bc762d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcusolverMg.so.12.2.0.1", + "bom-ref": "c1f2be05d88c74fa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/execution_policy.h", "type": "file" }, { - "bom-ref": "cac85a64f24692ef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libcusparse.so.12.7.10.1", + "bom-ref": "39789e908ce2c845", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/extrema.h", "type": "file" }, { - "bom-ref": "e1473615eaae742a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libmetis_static.a", + "bom-ref": "3baa75abe3ccc329", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/fill.h", "type": "file" }, { - "bom-ref": "2dcc6232a1f25cca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnppc.so.13.1.0.48", + "bom-ref": "ab6b4fde91c9e15a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/find.h", "type": "file" }, { - "bom-ref": "e4a569a6c6d356cb", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnppial.so.13.1.0.48", + "bom-ref": "75a4c08ed79231a4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/for_each.h", "type": "file" }, { - "bom-ref": "6a0c0d789170419a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnppicc.so.13.1.0.48", + "bom-ref": "89f1c2c48865c9eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/gather.h", "type": "file" }, { - "bom-ref": "68666cb6dbbb4b7e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnppidei.so.13.1.0.48", + "bom-ref": "6556b7350f8126c4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/generate.h", "type": "file" }, { - "bom-ref": "6d556b84b80589ce", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnppif.so.13.1.0.48", + "bom-ref": "7415e56eed8b6eb9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/get_value.h", "type": "file" }, { - "bom-ref": "bb217de5edc43072", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnppig.so.13.1.0.48", + "bom-ref": "aaad246ab5555d83", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/inner_product.h", "type": "file" }, { - "bom-ref": "119914767cb6b9f7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnppim.so.13.1.0.48", + "bom-ref": "44ca10feb9e51800", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/iter_swap.h", "type": "file" }, { - "bom-ref": "3934d4b09d0b8952", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnppist.so.13.1.0.48", + "bom-ref": "b329b8f795e20cf2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/logical.h", "type": "file" }, { - "bom-ref": "723e04b94e20b73b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnppisu.so.13.1.0.48", + "bom-ref": "00ac1b3f3b03012f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/malloc_and_free.h", "type": "file" }, { - "bom-ref": "c77a8effc88aa95a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnppitc.so.13.1.0.48", + "bom-ref": "ee6dd07975607e27", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/merge.h", "type": "file" }, { - "bom-ref": "020ab6cf2541f0c8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnpps.so.13.1.0.48", + "bom-ref": "814119c6bb078113", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/mismatch.h", "type": "file" }, { - "bom-ref": "b95a89e7743d4e75", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvJitLink.so.13.2.78", + "bom-ref": "9a4cd4e54bdc294a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/partition.h", "type": "file" }, { - "bom-ref": "db7bfa801f5576f1", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvJitLink_static.a", + "bom-ref": "c7239553995e6369", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/per_device_resource.h", "type": "file" }, { - "bom-ref": "e1dd1ba88cd50d1a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvfatbin.so.13.2.78", + "bom-ref": "e347c7ab2d682dd0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/pragma_omp.h", "type": "file" }, { - "bom-ref": "b201bd68037f1efd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvjpeg.so.13.1.0.48", + "bom-ref": "a0f0720bd0c6cbf5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/reduce.h", "type": "file" }, { - "bom-ref": "8d54c7021563a3fd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvperf_host.so", + "bom-ref": "c9560949d74d8adc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/reduce_by_key.h", "type": "file" }, { - "bom-ref": "3d63fd5d5c1e7ab4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvperf_target.so", + "bom-ref": "232ad0ed28136be6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/reduce_intervals.h", "type": "file" }, { - "bom-ref": "504f19ed8b0d8156", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvptxcompiler_static.a", + "bom-ref": "16d534088ca7a245", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/remove.h", "type": "file" }, { - "bom-ref": "db121c38c41e4f91", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvrtc-builtins.so.13.2.78", + "bom-ref": "b7c7316a7d0ae622", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/replace.h", "type": "file" }, { - "bom-ref": "1f95e027186ac0e4", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvrtc-builtins_static.a", + "bom-ref": "f8d5d7e45957f133", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/reverse.h", "type": "file" }, { - "bom-ref": "893f03f77be58447", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvrtc.so.13.2.78", + "bom-ref": "04d1a1a1ef4c74e5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/scan.h", "type": "file" }, { - "bom-ref": "1e73feba26085bdd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvrtc_static.a", + "bom-ref": "e427b562f3139ebf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/scan_by_key.h", "type": "file" }, { - "bom-ref": "071c987c57801103", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libnvtx3interop.so.1.1.0", + "bom-ref": "decb16a8c1023530", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/scatter.h", "type": "file" }, { - "bom-ref": "d82c487757f229c2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/libpcsamplingutil.so", + "bom-ref": "4132a22c92bf974c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/sequence.h", "type": "file" }, { - "bom-ref": "2b291f5d42228695", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libcuda.so", + "bom-ref": "5ade259e95bb5f14", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/set_operations.h", "type": "file" }, { - "bom-ref": "7e4286bb740cada7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libcufft.so", + "bom-ref": "926ac7f23b9d1a22", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/sort.h", "type": "file" }, { - "bom-ref": "dc8c16bb949917ef", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libcufftw.so", + "bom-ref": "5cf6029823a13994", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/swap_ranges.h", "type": "file" }, { - "bom-ref": "4bc9354dbab145f8", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libcurand.so", + "bom-ref": "1a2e5ac8cfedecfc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/tabulate.h", "type": "file" }, { - "bom-ref": "5c6cd6e20b9e2423", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libcusolver.so", + "bom-ref": "f948d1204f6f3ef5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/temporary_buffer.h", "type": "file" }, { - "bom-ref": "62a8b8ea45477922", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libcusolverMg.so", + "bom-ref": "8db5f3413849cf6d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/transform.h", "type": "file" }, { - "bom-ref": "fb1cae814910599e", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libcusparse.so", + "bom-ref": "eea21ca84a771820", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/transform_reduce.h", "type": "file" }, { - "bom-ref": "d7215837cd73c2d3", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnppc.so", + "bom-ref": "1485b5b9607fe080", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/transform_scan.h", "type": "file" }, { - "bom-ref": "b95047af108eef52", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnppial.so", + "bom-ref": "a946e9bcfae2fc1f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/uninitialized_copy.h", "type": "file" }, { - "bom-ref": "e9e37e5275c26aed", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnppicc.so", + "bom-ref": "a80f75ebb3cc5279", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/uninitialized_fill.h", "type": "file" }, { - "bom-ref": "964957ba4135d36a", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnppidei.so", + "bom-ref": "976dd4a336e519ab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/unique.h", "type": "file" }, { - "bom-ref": "79fc6c65b18ef6a2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnppif.so", + "bom-ref": "fb4434178be036b1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/detail/unique_by_key.h", "type": "file" }, { - "bom-ref": "0a46e93943fd7db7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnppig.so", + "bom-ref": "2bad623884fba5fc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/execution_policy.h", "type": "file" }, { - "bom-ref": "fa80ad6766ab14ae", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnppim.so", + "bom-ref": "bc6d0382258bcf28", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/memory.h", "type": "file" }, { - "bom-ref": "4db56a453c48b8f2", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnppist.so", + "bom-ref": "f2c3c018163e5456", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/memory_resource.h", "type": "file" }, { - "bom-ref": "6063a7e71911e54f", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnppisu.so", + "bom-ref": "dfff3e95173b2cd2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/pointer.h", "type": "file" }, { - "bom-ref": "959ec8ca4fa1a15d", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnppitc.so", + "bom-ref": "f1c4e878085e4e2f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/omp/vector.h", "type": "file" }, { - "bom-ref": "6d72768426a99bbd", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnpps.so", + "bom-ref": "492dc81823a56569", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/system_error.h", "type": "file" }, { - "bom-ref": "0af8d13aa865f4d6", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnvJitLink.so", + "bom-ref": "e7560c2057e3ca78", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/adjacent_difference.h", "type": "file" }, { - "bom-ref": "f5289c262e315b7b", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnvfatbin.so", + "bom-ref": "3bcdcd3c17e84a71", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/assign_value.h", "type": "file" }, { - "bom-ref": "7dda6f070f834820", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnvidia-ml.a", + "bom-ref": "f0a651c0d23e6408", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/binary_search.h", "type": "file" }, { - "bom-ref": "8e81c35595baebb7", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnvidia-ml.so", + "bom-ref": "9a2f56dee70629c7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/copy.h", "type": "file" }, { - "bom-ref": "7f37389048d24673", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnvjpeg.so", + "bom-ref": "eeb504a872d614d4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/copy_if.h", "type": "file" }, { - "bom-ref": "5342c4b7925237ca", - "name": "/usr/local/cuda-13.2/targets/x86_64-linux/lib/stubs/libnvrtc.so", + "bom-ref": "c99d9a84fcfe39b5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/count.h", "type": "file" }, { - "bom-ref": "d8371fc95ac8f926", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavcodec.so", + "bom-ref": "0e586743ad75524c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/equal.h", "type": "file" }, { - "bom-ref": "f816e33a5eba3f1b", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavcodec.so.", + "bom-ref": "ea3c34d386baf10f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/execution_policy.h", "type": "file" }, { - "bom-ref": "22c6246adacf3353", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavcodec.so.61", + "bom-ref": "e0adf50ad85d8e1f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/extrema.h", "type": "file" }, { - "bom-ref": "85fb7cdb978ad9c8", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavcodec.so.61.3.100", + "bom-ref": "dc6743ee75f097f9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/fill.h", "type": "file" }, { - "bom-ref": "693292b31b2803c2", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavdevice.so", + "bom-ref": "f840e79ef05c940a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/find.h", "type": "file" }, { - "bom-ref": "74176ea571b74db3", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavdevice.so.61", + "bom-ref": "8aa7e169854363b3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/for_each.h", "type": "file" }, { - "bom-ref": "ed856833a2300ff0", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavdevice.so.61.1.100", + "bom-ref": "afb5f1c9a1045c51", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/gather.h", "type": "file" }, { - "bom-ref": "7bb2b3746d8a5b6e", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavfilter.so", + "bom-ref": "f2456ec0cba254f8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/generate.h", "type": "file" }, { - "bom-ref": "90d57f3f1a95b0c8", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavfilter.so.", + "bom-ref": "2d163374e63a1238", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/get_value.h", "type": "file" }, { - "bom-ref": "e1c8e37afc7e003f", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavfilter.so.10", + "bom-ref": "b182d480a811f2c2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/inner_product.h", "type": "file" }, { - "bom-ref": "e0f5000a71192a73", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavfilter.so.10.1.100", + "bom-ref": "6938c9d7f9115892", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/iter_swap.h", "type": "file" }, { - "bom-ref": "9c6098ce28065309", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavformat.so", + "bom-ref": "cd18a8708974310b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/logical.h", "type": "file" }, { - "bom-ref": "38ef8cb0a3e3a2ff", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavformat.so.", + "bom-ref": "564279ac4de9f824", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/malloc_and_free.h", "type": "file" }, { - "bom-ref": "36cc7bdb0ef8b560", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavformat.so.61", + "bom-ref": "e7c214650381908b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/merge.h", "type": "file" }, { - "bom-ref": "6444beca4cb42e73", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavformat.so.61.1.100", + "bom-ref": "a4d5f01f9a12670a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/mismatch.h", "type": "file" }, { - "bom-ref": "f7988b984cc5b17b", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavutil.so", + "bom-ref": "c983b719e5916dd0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/partition.h", "type": "file" }, { - "bom-ref": "1371914eda22de92", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavutil.so.", + "bom-ref": "41a44af53711b567", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/per_device_resource.h", "type": "file" }, { - "bom-ref": "f0cb5da65c81b02b", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavutil.so.59", + "bom-ref": "22d2f71a0707510a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/reduce.h", "type": "file" }, { - "bom-ref": "1978c991e67b372e", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavutil.so.59.8.100", + "bom-ref": "bcee87fdbc665c59", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/reduce_by_key.h", "type": "file" }, { - "bom-ref": "ca77790cc83ad14e", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libswresample.so", + "bom-ref": "1e501c83c7e048f8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/reduce_intervals.h", "type": "file" }, { - "bom-ref": "48853e0e634ca547", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libswresample.so.3", + "bom-ref": "c30a09cb64c28457", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/remove.h", "type": "file" }, { - "bom-ref": "21cd00cfdbc2e082", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libswresample.so.3.9.100", + "bom-ref": "087c0211dcdb8967", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/replace.h", "type": "file" }, { - "bom-ref": "e7ca0bd38b4dab4a", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libswresample.so.5", + "bom-ref": "fec3c7a7b91232c1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/reverse.h", "type": "file" }, { - "bom-ref": "8996349adf3801c8", - "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libswresample.so.5.1.100", + "bom-ref": "793087a85915a88e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/scan.h", "type": "file" }, { - "bom-ref": "41e981c91e108582", - "name": "/usr/local/lib/python3.12/dist-packages/StrEnum-0.4.15.dist-info/METADATA", + "bom-ref": "2971e9bdf05afb25", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/scan_by_key.h", "type": "file" }, { - "bom-ref": "c1d84f035612f27b", - "name": "/usr/local/lib/python3.12/dist-packages/StrEnum-0.4.15.dist-info/RECORD", + "bom-ref": "eead0d310416b378", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/scatter.h", "type": "file" }, { - "bom-ref": "f5d81c67c796001c", - "name": "/usr/local/lib/python3.12/dist-packages/StrEnum-0.4.15.dist-info/top_level.txt", + "bom-ref": "c52d4b4d48147eec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/sequence.h", "type": "file" }, { - "bom-ref": "66e342b1c78128d7", - "name": "/usr/local/lib/python3.12/dist-packages/absl_py-2.4.0.dist-info/METADATA", + "bom-ref": "479ff668d5b48794", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/set_operations.h", "type": "file" }, { - "bom-ref": "83bc3afd0ef165cc", - "name": "/usr/local/lib/python3.12/dist-packages/absl_py-2.4.0.dist-info/RECORD", + "bom-ref": "66002d8d816f82eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/sort.h", "type": "file" }, { - "bom-ref": "f54796cc1305c8a2", - "name": "/usr/local/lib/python3.12/dist-packages/accelerate-1.14.0.dist-info/METADATA", + "bom-ref": "45abd82a6e47b411", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/swap_ranges.h", "type": "file" }, { - "bom-ref": "0f76d8fd36c62a54", - "name": "/usr/local/lib/python3.12/dist-packages/accelerate-1.14.0.dist-info/RECORD", + "bom-ref": "a38c4d123b7bc222", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/tabulate.h", "type": "file" }, { - "bom-ref": "87aab60cdd90a555", - "name": "/usr/local/lib/python3.12/dist-packages/accelerate-1.14.0.dist-info/top_level.txt", + "bom-ref": "c955bf82e3fb18b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/temporary_buffer.h", "type": "file" }, { - "bom-ref": "c7450f344c85b805", - "name": "/usr/local/lib/python3.12/dist-packages/aenum-3.1.17.dist-info/METADATA", + "bom-ref": "d8eb9553d538d85f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/transform.h", "type": "file" }, { - "bom-ref": "dd440a1341431c2c", - "name": "/usr/local/lib/python3.12/dist-packages/aenum-3.1.17.dist-info/RECORD", + "bom-ref": "21c4f6224949b2ad", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/transform_reduce.h", "type": "file" }, { - "bom-ref": "81d7a60f66a9ff87", - "name": "/usr/local/lib/python3.12/dist-packages/aenum-3.1.17.dist-info/top_level.txt", + "bom-ref": "62ca5bba49bf7c76", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/transform_scan.h", "type": "file" }, { - "bom-ref": "d892125cce0f10c6", - "name": "/usr/local/lib/python3.12/dist-packages/aiohappyeyeballs-2.6.1.dist-info/METADATA", + "bom-ref": "669127be5ab3953e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/uninitialized_copy.h", "type": "file" }, { - "bom-ref": "5988031bc0232b7e", - "name": "/usr/local/lib/python3.12/dist-packages/aiohappyeyeballs-2.6.1.dist-info/RECORD", + "bom-ref": "40a6dbd968842f3b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/uninitialized_fill.h", "type": "file" }, { - "bom-ref": "46607e3a317dae57", - "name": "/usr/local/lib/python3.12/dist-packages/aiohttp-3.13.5.dist-info/METADATA", + "bom-ref": "b7766e97a774582c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/unique.h", "type": "file" }, { - "bom-ref": "c24b692b805e3020", - "name": "/usr/local/lib/python3.12/dist-packages/aiohttp-3.13.5.dist-info/RECORD", + "bom-ref": "0d5039db1dc51efe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/detail/unique_by_key.h", "type": "file" }, { - "bom-ref": "9590d657835989b8", - "name": "/usr/local/lib/python3.12/dist-packages/aiohttp-3.13.5.dist-info/top_level.txt", + "bom-ref": "c92865acc4d88911", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/execution_policy.h", "type": "file" }, { - "bom-ref": "9416bfedf5abc137", - "name": "/usr/local/lib/python3.12/dist-packages/aiosignal-1.4.0.dist-info/METADATA", + "bom-ref": "4dc79039773a01c6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/memory.h", "type": "file" }, { - "bom-ref": "37ebeba0d3e51841", - "name": "/usr/local/lib/python3.12/dist-packages/aiosignal-1.4.0.dist-info/RECORD", + "bom-ref": "d4aa56c482f6e479", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/memory_resource.h", "type": "file" }, { - "bom-ref": "b182091f295ddabf", - "name": "/usr/local/lib/python3.12/dist-packages/aiosignal-1.4.0.dist-info/top_level.txt", + "bom-ref": "552fce4f634b19e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/pointer.h", "type": "file" }, { - "bom-ref": "5980d30e52a23d27", - "name": "/usr/local/lib/python3.12/dist-packages/annotated_doc-0.0.4.dist-info/METADATA", + "bom-ref": "9753f47491da8570", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system/tbb/vector.h", "type": "file" }, { - "bom-ref": "2909e533b6a5ab73", - "name": "/usr/local/lib/python3.12/dist-packages/annotated_doc-0.0.4.dist-info/RECORD", + "bom-ref": "90fb21b3105fe089", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/system_error.h", "type": "file" }, { - "bom-ref": "217f8049cb20032c", - "name": "/usr/local/lib/python3.12/dist-packages/annotated_types-0.7.0.dist-info/METADATA", + "bom-ref": "c6ed3fbe65aa7b2c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/tabulate.h", "type": "file" }, { - "bom-ref": "45b5218139ff2883", - "name": "/usr/local/lib/python3.12/dist-packages/annotated_types-0.7.0.dist-info/RECORD", + "bom-ref": "3e6ecd0d06fdb87b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/transform.h", "type": "file" }, { - "bom-ref": "0893443d6e25c8c2", - "name": "/usr/local/lib/python3.12/dist-packages/antlr4_python3_runtime-4.9.3.dist-info/METADATA", + "bom-ref": "e965a357e466dda1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/transform_reduce.h", "type": "file" }, { - "bom-ref": "eace8722c71817d2", - "name": "/usr/local/lib/python3.12/dist-packages/antlr4_python3_runtime-4.9.3.dist-info/RECORD", + "bom-ref": "d4bd9849abf55e90", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/transform_scan.h", "type": "file" }, { - "bom-ref": "85adb698c8f16583", - "name": "/usr/local/lib/python3.12/dist-packages/antlr4_python3_runtime-4.9.3.dist-info/top_level.txt", + "bom-ref": "f7813567a757804b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/tuple.h", "type": "file" }, { - "bom-ref": "7c5993011f171733", - "name": "/usr/local/lib/python3.12/dist-packages/anyio-4.13.0.dist-info/METADATA", + "bom-ref": "0ae047bb60ba72fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/type_traits/integer_sequence.h", "type": "file" }, { - "bom-ref": "f32ac7d1310b6453", - "name": "/usr/local/lib/python3.12/dist-packages/anyio-4.13.0.dist-info/RECORD", + "bom-ref": "cf47829bd9f5190d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/type_traits/is_contiguous_iterator.h", "type": "file" }, { - "bom-ref": "ba96712700503004", - "name": "/usr/local/lib/python3.12/dist-packages/anyio-4.13.0.dist-info/top_level.txt", + "bom-ref": "8bb8a26e31a4c9ad", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/type_traits/is_execution_policy.h", "type": "file" }, { - "bom-ref": "89565d7fba1adf8f", - "name": "/usr/local/lib/python3.12/dist-packages/apache_tvm_ffi-0.1.13.post2.dist-info/METADATA", + "bom-ref": "252cce0480fb4a39", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/type_traits/is_trivially_relocatable.h", "type": "file" }, { - "bom-ref": "02eb6bf5f562f757", - "name": "/usr/local/lib/python3.12/dist-packages/apache_tvm_ffi-0.1.13.post2.dist-info/RECORD", + "bom-ref": "12809a5539448aef", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/type_traits/logical_metafunctions.h", "type": "file" }, { - "bom-ref": "dd7f5d041c4271c4", - "name": "/usr/local/lib/python3.12/dist-packages/apex-0.1.dist-info/METADATA", + "bom-ref": "a39e08dedf5a9f05", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/type_traits/unwrap_contiguous_iterator.h", "type": "file" }, { - "bom-ref": "eb08d61fca102f8d", - "name": "/usr/local/lib/python3.12/dist-packages/apex-0.1.dist-info/RECORD", + "bom-ref": "8fd0a398882c82a8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/uninitialized_copy.h", "type": "file" }, { - "bom-ref": "e55a1035ca3f11e9", - "name": "/usr/local/lib/python3.12/dist-packages/apex-0.1.dist-info/direct_url.json", + "bom-ref": "53525c55d1bbbc34", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/uninitialized_fill.h", "type": "file" }, { - "bom-ref": "4c583d6b52a6673e", - "name": "/usr/local/lib/python3.12/dist-packages/apex-0.1.dist-info/top_level.txt", + "bom-ref": "1c0864e92bc473b7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/unique.h", "type": "file" }, { - "bom-ref": "34dba6447f4fee44", - "name": "/usr/local/lib/python3.12/dist-packages/argon2_cffi-25.1.0.dist-info/METADATA", + "bom-ref": "e35362f37c26794b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/universal_allocator.h", "type": "file" }, { - "bom-ref": "f93c59349ee2b6d3", - "name": "/usr/local/lib/python3.12/dist-packages/argon2_cffi-25.1.0.dist-info/RECORD", + "bom-ref": "0e02493352dfaae8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/universal_ptr.h", "type": "file" }, { - "bom-ref": "23d076a13fc4f6a9", - "name": "/usr/local/lib/python3.12/dist-packages/argon2_cffi_bindings-25.1.0.dist-info/METADATA", + "bom-ref": "198e98759df1ebcf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/universal_vector.h", "type": "file" }, { - "bom-ref": "0c8f50934e0f1edc", - "name": "/usr/local/lib/python3.12/dist-packages/argon2_cffi_bindings-25.1.0.dist-info/RECORD", + "bom-ref": "dbd02f74988092de", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/version.h", "type": "file" }, { - "bom-ref": "06a3b6979070f1e8", - "name": "/usr/local/lib/python3.12/dist-packages/argon2_cffi_bindings-25.1.0.dist-info/top_level.txt", + "bom-ref": "62e4f814fa18ce59", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cccl/thrust/zip_function.h", "type": "file" }, { - "bom-ref": "b0bf52d3e43de430", - "name": "/usr/local/lib/python3.12/dist-packages/arrow-1.4.0.dist-info/METADATA", + "bom-ref": "238c2ef9f2378f77", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/channel_descriptor.h", "type": "file" }, { - "bom-ref": "0ed0a5d8727c71d8", - "name": "/usr/local/lib/python3.12/dist-packages/arrow-1.4.0.dist-info/RECORD", + "bom-ref": "368ed90003dbaf04", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/common_functions.h", "type": "file" }, { - "bom-ref": "43393d435e640c77", - "name": "/usr/local/lib/python3.12/dist-packages/asttokens-3.0.1.dist-info/METADATA", + "bom-ref": "7631c028371b03bc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups.h", "type": "file" }, { - "bom-ref": "5572aaa135f2626f", - "name": "/usr/local/lib/python3.12/dist-packages/asttokens-3.0.1.dist-info/RECORD", + "bom-ref": "3f029b94784c20a9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/async.h", "type": "file" }, { - "bom-ref": "c936b7c7082dbb67", - "name": "/usr/local/lib/python3.12/dist-packages/asttokens-3.0.1.dist-info/top_level.txt", + "bom-ref": "7774f17b855ec9eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/coalesced_reduce.h", "type": "file" }, { - "bom-ref": "41ba1da3196a8b19", - "name": "/usr/local/lib/python3.12/dist-packages/astunparse-1.6.3.dist-info/METADATA", + "bom-ref": "61de0b86044a367c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/coalesced_scan.h", "type": "file" }, { - "bom-ref": "0845c1ddb06e7b1c", - "name": "/usr/local/lib/python3.12/dist-packages/astunparse-1.6.3.dist-info/RECORD", + "bom-ref": "96291a2eb03cc05c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/driver_abi.h", "type": "file" }, { - "bom-ref": "ae952c6e021ea138", - "name": "/usr/local/lib/python3.12/dist-packages/astunparse-1.6.3.dist-info/top_level.txt", + "bom-ref": "07d23bd3af765199", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/functional.h", "type": "file" }, { - "bom-ref": "92a185852e954ece", - "name": "/usr/local/lib/python3.12/dist-packages/async_lru-2.3.0.dist-info/METADATA", + "bom-ref": "9da669b8a981e67c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/helpers.h", "type": "file" }, { - "bom-ref": "762b49c5fea1e10d", - "name": "/usr/local/lib/python3.12/dist-packages/async_lru-2.3.0.dist-info/RECORD", + "bom-ref": "7c084f2943ea51cf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/info.h", "type": "file" }, { - "bom-ref": "0c3123eb4885ee70", - "name": "/usr/local/lib/python3.12/dist-packages/async_lru-2.3.0.dist-info/top_level.txt", + "bom-ref": "8b6bd562cbb36d10", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/invoke.h", "type": "file" }, { - "bom-ref": "d101e7404f3b931e", - "name": "/usr/local/lib/python3.12/dist-packages/attrs-26.1.0.dist-info/METADATA", + "bom-ref": "71a7aaa6e6f2f3b2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/memory.h", "type": "file" }, { - "bom-ref": "7df00889a7faf995", - "name": "/usr/local/lib/python3.12/dist-packages/attrs-26.1.0.dist-info/RECORD", + "bom-ref": "dc335e03c431b4d5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/partitioning.h", "type": "file" }, { - "bom-ref": "7e3226445857120c", - "name": "/usr/local/lib/python3.12/dist-packages/azure_core-1.41.0.dist-info/METADATA", + "bom-ref": "becbfeb93811c821", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/reduce.h", "type": "file" }, { - "bom-ref": "988d80244e4a7b5e", - "name": "/usr/local/lib/python3.12/dist-packages/azure_core-1.41.0.dist-info/RECORD", + "bom-ref": "f56bb6d8c5433a81", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/scan.h", "type": "file" }, { - "bom-ref": "f077af578a910ec2", - "name": "/usr/local/lib/python3.12/dist-packages/azure_core-1.41.0.dist-info/top_level.txt", + "bom-ref": "62d037a6baf5a774", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/details/sync.h", "type": "file" }, { - "bom-ref": "3f890a6a69bc814c", - "name": "/usr/local/lib/python3.12/dist-packages/azure_identity-1.25.3.dist-info/METADATA", + "bom-ref": "4773e3b3a4b5d373", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/memcpy_async.h", "type": "file" }, { - "bom-ref": "a5143c6f18821523", - "name": "/usr/local/lib/python3.12/dist-packages/azure_identity-1.25.3.dist-info/RECORD", + "bom-ref": "034c473cb17800fe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/reduce.h", "type": "file" }, { - "bom-ref": "f0d7303827108f08", - "name": "/usr/local/lib/python3.12/dist-packages/azure_identity-1.25.3.dist-info/top_level.txt", + "bom-ref": "aabb27a59e380f50", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cooperative_groups/scan.h", "type": "file" }, { - "bom-ref": "7628da6c10c70842", - "name": "/usr/local/lib/python3.12/dist-packages/azure_storage_blob-12.30.0.dist-info/METADATA", + "bom-ref": "563484dae26ed338", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/common_functions.h", "type": "file" }, { - "bom-ref": "9c575b2a10750978", - "name": "/usr/local/lib/python3.12/dist-packages/azure_storage_blob-12.30.0.dist-info/RECORD", + "bom-ref": "8fb19885ecf750b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/cuda_tile.h", "type": "file" }, { - "bom-ref": "fec36ce869956477", - "name": "/usr/local/lib/python3.12/dist-packages/azure_storage_blob-12.30.0.dist-info/top_level.txt", + "bom-ref": "193ee3b3325a7b21", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/cudacc_ext.h", "type": "file" }, { - "bom-ref": "56bed58ec80aee06", - "name": "/usr/local/lib/python3.12/dist-packages/babel-2.18.0.dist-info/METADATA", + "bom-ref": "b38aebc91138fe59", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/device_double_functions.h", "type": "file" }, { - "bom-ref": "41f39ab749ae9281", - "name": "/usr/local/lib/python3.12/dist-packages/babel-2.18.0.dist-info/RECORD", + "bom-ref": "f51bc1c2c5d58d03", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/device_double_functions.hpp", "type": "file" }, { - "bom-ref": "fa97347ac64a62ca", - "name": "/usr/local/lib/python3.12/dist-packages/babel-2.18.0.dist-info/top_level.txt", + "bom-ref": "bce0e680803bc2fc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/device_fp128_functions.h", "type": "file" }, { - "bom-ref": "0acf48813f5f08eb", - "name": "/usr/local/lib/python3.12/dist-packages/backoff-2.2.1.dist-info/METADATA", + "bom-ref": "9475e707d9aeced7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/device_functions.h", "type": "file" }, { - "bom-ref": "53d23f41e56adacd", - "name": "/usr/local/lib/python3.12/dist-packages/backoff-2.2.1.dist-info/RECORD", + "bom-ref": "73e1682013331410", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/device_functions.hpp", "type": "file" }, { - "bom-ref": "a8578644c9e26a8d", - "name": "/usr/local/lib/python3.12/dist-packages/beautifulsoup4-4.14.3.dist-info/METADATA", + "bom-ref": "2c5b4052fe5958eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/func_macro.h", "type": "file" }, { - "bom-ref": "23c41f9850b5f75a", - "name": "/usr/local/lib/python3.12/dist-packages/beautifulsoup4-4.14.3.dist-info/RECORD", + "bom-ref": "d6c4022738db959b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/host_config.h", "type": "file" }, { - "bom-ref": "370aa705fdb7acd7", - "name": "/usr/local/lib/python3.12/dist-packages/blake3-1.0.9.dist-info/METADATA", + "bom-ref": "a9126e073957c506", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/host_defines.h", "type": "file" }, { - "bom-ref": "2772267f3888ff0e", - "name": "/usr/local/lib/python3.12/dist-packages/blake3-1.0.9.dist-info/RECORD", + "bom-ref": "8266cd14f410d90b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/host_runtime.h", "type": "file" }, { - "bom-ref": "635835bda0499ee9", - "name": "/usr/local/lib/python3.12/dist-packages/bleach-6.3.0.dist-info/METADATA", + "bom-ref": "dc53a8d9435c880a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/math_functions.h", "type": "file" }, { - "bom-ref": "48374faab20e0c84", - "name": "/usr/local/lib/python3.12/dist-packages/bleach-6.3.0.dist-info/RECORD", + "bom-ref": "c57d0952a0df3cb8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/math_functions.hpp", "type": "file" }, { - "bom-ref": "8ca7ce2612c3d02c", - "name": "/usr/local/lib/python3.12/dist-packages/bleach-6.3.0.dist-info/top_level.txt", + "bom-ref": "77bd6cdf357b5a16", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/mma.h", "type": "file" }, { - "bom-ref": "746d9e6befff3fbb", - "name": "/usr/local/lib/python3.12/dist-packages/bleach/_vendor/html5lib-1.1.dist-info/METADATA", + "bom-ref": "55512601c6f0192b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/mma.hpp", "type": "file" }, { - "bom-ref": "2ee7b20f776caa3d", - "name": "/usr/local/lib/python3.12/dist-packages/bleach/_vendor/html5lib-1.1.dist-info/RECORD", + "bom-ref": "44f61437dcb24596", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/nvfunctional", "type": "file" }, { - "bom-ref": "81e3fe084c8a31d4", - "name": "/usr/local/lib/python3.12/dist-packages/bleach/_vendor/html5lib-1.1.dist-info/top_level.txt", + "bom-ref": "b5b511414ba247db", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/sm_100_rt.h", "type": "file" }, { - "bom-ref": "442e02efb08a6081", - "name": "/usr/local/lib/python3.12/dist-packages/blobfile-3.3.0.dist-info/METADATA", + "bom-ref": "d4ef785a36234d1f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/sm_100_rt.hpp", "type": "file" }, { - "bom-ref": "03ada7bb9edde655", - "name": "/usr/local/lib/python3.12/dist-packages/blobfile-3.3.0.dist-info/RECORD", + "bom-ref": "28c1be8186e2fd9d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/sm_70_rt.h", "type": "file" }, { - "bom-ref": "7e70f0ef7ef1204c", - "name": "/usr/local/lib/python3.12/dist-packages/blobfile-3.3.0.dist-info/top_level.txt", + "bom-ref": "6c2653229bfcea25", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/sm_70_rt.hpp", "type": "file" }, { - "bom-ref": "a16b17439312697f", - "name": "/usr/local/lib/python3.12/dist-packages/boto3-1.43.81.dist-info/METADATA", + "bom-ref": "5b31aa67a7f7686e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/sm_80_rt.h", "type": "file" }, { - "bom-ref": "78b2fff199453e16", - "name": "/usr/local/lib/python3.12/dist-packages/boto3-1.43.81.dist-info/RECORD", + "bom-ref": "a9c7993ce644ff2c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/sm_80_rt.hpp", "type": "file" }, { - "bom-ref": "24ec4a6edf03ba87", - "name": "/usr/local/lib/python3.12/dist-packages/boto3-1.43.81.dist-info/top_level.txt", + "bom-ref": "8dbc80ea5e811dfe", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/sm_90_rt.h", "type": "file" }, { - "bom-ref": "cb8ce09635f90b63", - "name": "/usr/local/lib/python3.12/dist-packages/botocore-1.43.81.dist-info/METADATA", + "bom-ref": "5009fb4cbdbdc1c2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/sm_90_rt.hpp", "type": "file" }, { - "bom-ref": "e3dba7799b7b5813", - "name": "/usr/local/lib/python3.12/dist-packages/botocore-1.43.81.dist-info/RECORD", + "bom-ref": "09ce43a40524b645", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/crt/storage_class.h", "type": "file" }, { - "bom-ref": "a8fffc5e3d7e278f", - "name": "/usr/local/lib/python3.12/dist-packages/botocore-1.43.81.dist-info/top_level.txt", + "bom-ref": "43eb23702784ef18", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuComplex.h", "type": "file" }, { - "bom-ref": "2b983d15454205fd", - "name": "/usr/local/lib/python3.12/dist-packages/build-1.5.0.dist-info/METADATA", + "bom-ref": "223175587a7e6ab6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cublas.h", "type": "file" }, { - "bom-ref": "25543908e0691594", - "name": "/usr/local/lib/python3.12/dist-packages/build-1.5.0.dist-info/RECORD", + "bom-ref": "b07c012367b4e766", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cublasLt.h", "type": "file" }, { - "bom-ref": "7d7b4264d8051328", - "name": "/usr/local/lib/python3.12/dist-packages/cache_dit-1.5.0.dist-info/METADATA", + "bom-ref": "24433bf24e1127cd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cublasXt.h", "type": "file" }, { - "bom-ref": "b5f5e13983f0e171", - "name": "/usr/local/lib/python3.12/dist-packages/cache_dit-1.5.0.dist-info/RECORD", + "bom-ref": "1590af6053575cbb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cublas_api.h", "type": "file" }, { - "bom-ref": "c25dbbed2c3e42eb", - "name": "/usr/local/lib/python3.12/dist-packages/cache_dit-1.5.0.dist-info/top_level.txt", + "bom-ref": "48662598c81c456d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cublas_v2.h", "type": "file" }, { - "bom-ref": "e6a8359cae09cb68", - "name": "/usr/local/lib/python3.12/dist-packages/certifi-2026.4.22.dist-info/METADATA", + "bom-ref": "f9bb404a8df9da16", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda.h", "type": "file" }, { - "bom-ref": "c0e0e35cd509b5ab", - "name": "/usr/local/lib/python3.12/dist-packages/certifi-2026.4.22.dist-info/RECORD", + "bom-ref": "76e148aa5ef2a128", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudaEGL.h", "type": "file" }, { - "bom-ref": "d500f5210af5ea4d", - "name": "/usr/local/lib/python3.12/dist-packages/certifi-2026.4.22.dist-info/top_level.txt", + "bom-ref": "07439dc258bfcaf3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudaEGLTypedefs.h", "type": "file" }, { - "bom-ref": "35c2fd4b3587df25", - "name": "/usr/local/lib/python3.12/dist-packages/cffi-2.0.0.dist-info/METADATA", + "bom-ref": "6939272266179018", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudaGL.h", "type": "file" }, { - "bom-ref": "80ae1661c0bb674b", - "name": "/usr/local/lib/python3.12/dist-packages/cffi-2.0.0.dist-info/RECORD", + "bom-ref": "1e5a1ff159219f00", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudaGLTypedefs.h", "type": "file" }, { - "bom-ref": "c9ada375c13a17b5", - "name": "/usr/local/lib/python3.12/dist-packages/cffi-2.0.0.dist-info/top_level.txt", + "bom-ref": "42be137d590a2381", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudaProfiler.h", "type": "file" }, { - "bom-ref": "6a2672f9c01f7431", - "name": "/usr/local/lib/python3.12/dist-packages/charset_normalizer-3.4.7.dist-info/METADATA", + "bom-ref": "da39d2b1022dd22e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudaProfilerTypedefs.h", "type": "file" }, { - "bom-ref": "adc9c4b473ac6559", - "name": "/usr/local/lib/python3.12/dist-packages/charset_normalizer-3.4.7.dist-info/RECORD", + "bom-ref": "001655d1c2e6c51b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudaTypedefs.h", "type": "file" }, { - "bom-ref": "f4decf694877b9df", - "name": "/usr/local/lib/python3.12/dist-packages/charset_normalizer-3.4.7.dist-info/top_level.txt", + "bom-ref": "8bc0aa1711c8560c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudaVDPAU.h", "type": "file" }, { - "bom-ref": "430f56aaed68e680", - "name": "/usr/local/lib/python3.12/dist-packages/click-8.3.3.dist-info/METADATA", + "bom-ref": "6ed5fd1da41ddc21", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudaVDPAUTypedefs.h", "type": "file" }, { - "bom-ref": "a24f116266e54734", - "name": "/usr/local/lib/python3.12/dist-packages/click-8.3.3.dist-info/RECORD", + "bom-ref": "310258462ac0a39b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_awbarrier.h", "type": "file" }, { - "bom-ref": "43241519393108ad", - "name": "/usr/local/lib/python3.12/dist-packages/click_option_group-0.5.9.dist-info/METADATA", + "bom-ref": "45b045b59e834d67", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_awbarrier_helpers.h", "type": "file" }, { - "bom-ref": "eda0cc161ef3adc3", - "name": "/usr/local/lib/python3.12/dist-packages/click_option_group-0.5.9.dist-info/RECORD", + "bom-ref": "9af94fdefe83780b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_awbarrier_primitives.h", "type": "file" }, { - "bom-ref": "2c160c24fe8658c8", - "name": "/usr/local/lib/python3.12/dist-packages/cmake-3.31.6.dist-info/METADATA", + "bom-ref": "58d8b1a042529457", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_bf16.h", "type": "file" }, { - "bom-ref": "8166abcef6166880", - "name": "/usr/local/lib/python3.12/dist-packages/cmake-3.31.6.dist-info/RECORD", + "bom-ref": "5bb00aff1a6ef5b0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_bf16.hpp", "type": "file" }, { - "bom-ref": "0cb3ff3431d0ee3d", - "name": "/usr/local/lib/python3.12/dist-packages/colored-2.3.2.dist-info/METADATA", + "bom-ref": "df7a816cd0c79c4d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_device_runtime_api.h", "type": "file" }, { - "bom-ref": "4a613afa032e0133", - "name": "/usr/local/lib/python3.12/dist-packages/colored-2.3.2.dist-info/RECORD", + "bom-ref": "8a5a91b1d2f88ac5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_egl_interop.h", "type": "file" }, { - "bom-ref": "42d1cfeeb56bb369", - "name": "/usr/local/lib/python3.12/dist-packages/comm-0.2.3.dist-info/METADATA", + "bom-ref": "0baf5924139703e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_fp16.h", "type": "file" }, { - "bom-ref": "136c03eff66a5736", - "name": "/usr/local/lib/python3.12/dist-packages/comm-0.2.3.dist-info/RECORD", + "bom-ref": "85c8b04342765bc9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_fp16.hpp", "type": "file" }, { - "bom-ref": "7225f58b4a16b709", - "name": "/usr/local/lib/python3.12/dist-packages/contourpy-1.3.3.dist-info/METADATA", + "bom-ref": "338ea887b5cae433", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_fp4.h", "type": "file" }, { - "bom-ref": "14c83b28b4de3bfe", - "name": "/usr/local/lib/python3.12/dist-packages/contourpy-1.3.3.dist-info/RECORD", + "bom-ref": "08bb5115084e62ff", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_fp4.hpp", "type": "file" }, { - "bom-ref": "f5820acc6aa9b862", - "name": "/usr/local/lib/python3.12/dist-packages/cryptography-50.0.1.dist-info/METADATA", + "bom-ref": "afd0ed8bb240c694", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_fp6.h", "type": "file" }, { - "bom-ref": "efc2390570714c91", - "name": "/usr/local/lib/python3.12/dist-packages/cryptography-50.0.1.dist-info/RECORD", + "bom-ref": "464c667ac04350a1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_fp6.hpp", "type": "file" }, { - "bom-ref": "94ef7a870d596088", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_bindings-13.2.0.dist-info/METADATA", + "bom-ref": "93e3914570df2633", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_fp8.h", "type": "file" }, { - "bom-ref": "2db30b0f271a887d", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_bindings-13.2.0.dist-info/RECORD", + "bom-ref": "12dfde0e1951c2a0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_fp8.hpp", "type": "file" }, { - "bom-ref": "419cdfba31b0f388", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_bindings-13.2.0.dist-info/top_level.txt", + "bom-ref": "70d49cc3fe8d64ec", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_gl_interop.h", "type": "file" }, { - "bom-ref": "51bb6163e0f97ab0", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_core-1.1.1.dist-info/METADATA", + "bom-ref": "8f59b6fdb35c175b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_occupancy.h", "type": "file" }, { - "bom-ref": "63cf80eb7bdf343c", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_core-1.1.1.dist-info/RECORD", + "bom-ref": "2282a520a5d27b73", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_pipeline.h", "type": "file" }, { - "bom-ref": "0eab41a1abaab7c0", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_core-1.1.1.dist-info/top_level.txt", + "bom-ref": "ee91f69f98909d41", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_pipeline_helpers.h", "type": "file" }, { - "bom-ref": "58e6d5c99d0cfee9", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_pathfinder-1.5.4.dist-info/METADATA", + "bom-ref": "c2830145f1ae3586", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_pipeline_primitives.h", "type": "file" }, { - "bom-ref": "da8a6902cf14eab8", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_pathfinder-1.5.4.dist-info/RECORD", + "bom-ref": "fdedca8f0b02fc15", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_profiler_api.h", "type": "file" }, { - "bom-ref": "7525ac852ef70709", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_pathfinder-1.5.4.dist-info/top_level.txt", + "bom-ref": "e2935797d76b17e3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_runtime.h", "type": "file" }, { - "bom-ref": "ed15b2507fd275a4", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_python-13.2.0.dist-info/METADATA", + "bom-ref": "9a35d8416658dd68", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_runtime_api.h", "type": "file" }, { - "bom-ref": "1504bf362d1a6075", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_python-13.2.0.dist-info/RECORD", + "bom-ref": "bc0328d142d8c9d3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_stdint.h", "type": "file" }, { - "bom-ref": "d9fbce8d56a3f965", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_python-13.2.0.dist-info/top_level.txt", + "bom-ref": "faf6e279faeac3ba", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_tf32.h", "type": "file" }, { - "bom-ref": "ea69b1e36f401e4a", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_tile-1.5.0.dist-info/METADATA", + "bom-ref": "3188ac820bc6e7c5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_tile.h", "type": "file" }, { - "bom-ref": "ccc4545b406da897", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_tile-1.5.0.dist-info/RECORD", + "bom-ref": "24d13347ae668e4b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cuda_vdpau_interop.h", "type": "file" }, { - "bom-ref": "f79fc6716490b0d0", - "name": "/usr/local/lib/python3.12/dist-packages/cuda_tile-1.5.0.dist-info/top_level.txt", + "bom-ref": "5b76bdd6bbb59b3d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudalibxt.h", "type": "file" }, { - "bom-ref": "244e8963bacd3795", - "name": "/usr/local/lib/python3.12/dist-packages/cycler-0.12.1.dist-info/METADATA", + "bom-ref": "ea145becbbecfedf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cudart_platform.h", "type": "file" }, { - "bom-ref": "cd646e0a9d65c3bb", - "name": "/usr/local/lib/python3.12/dist-packages/cycler-0.12.1.dist-info/RECORD", + "bom-ref": "ce7193e0674a1ecb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cufft.h", "type": "file" }, { - "bom-ref": "f0a14738b5a99ef0", - "name": "/usr/local/lib/python3.12/dist-packages/cycler-0.12.1.dist-info/top_level.txt", + "bom-ref": "6732a68b391ba13b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cufftXt.h", "type": "file" }, { - "bom-ref": "6a9070e33d3772f4", - "name": "/usr/local/lib/python3.12/dist-packages/cython-3.2.4.dist-info/METADATA", + "bom-ref": "6c52745c68443f70", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cufft_device.h", "type": "file" }, { - "bom-ref": "0cb642d6e6653e00", - "name": "/usr/local/lib/python3.12/dist-packages/cython-3.2.4.dist-info/RECORD", + "bom-ref": "20e1c961690a8470", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cufftw.h", "type": "file" }, { - "bom-ref": "b6d67db2a9e09d57", - "name": "/usr/local/lib/python3.12/dist-packages/cython-3.2.4.dist-info/top_level.txt", + "bom-ref": "127850afd293130e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cufile.h", "type": "file" }, { - "bom-ref": "ec9f1b0f39683af7", - "name": "/usr/local/lib/python3.12/dist-packages/datasets-3.1.0.dist-info/METADATA", + "bom-ref": "af8ba009c8b3d599", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti.h", "type": "file" }, { - "bom-ref": "797257970ce379c6", - "name": "/usr/local/lib/python3.12/dist-packages/datasets-3.1.0.dist-info/RECORD", + "bom-ref": "faf284b5e6a00391", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_activity.h", "type": "file" }, { - "bom-ref": "649af901192f1a70", - "name": "/usr/local/lib/python3.12/dist-packages/datasets-3.1.0.dist-info/top_level.txt", + "bom-ref": "ae9bab05671b16d3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_activity_deprecated.h", "type": "file" }, { - "bom-ref": "01e1856114b803ab", - "name": "/usr/local/lib/python3.12/dist-packages/debugpy-1.8.20.dist-info/METADATA", + "bom-ref": "469daf354936ecce", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_callbacks.h", "type": "file" }, { - "bom-ref": "3c52406e74b262fb", - "name": "/usr/local/lib/python3.12/dist-packages/debugpy-1.8.20.dist-info/RECORD", + "bom-ref": "d4e9af11ee5751a9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_checkpoint.h", "type": "file" }, { - "bom-ref": "8352e8d37c1595ff", - "name": "/usr/local/lib/python3.12/dist-packages/debugpy-1.8.20.dist-info/top_level.txt", + "bom-ref": "7a3147f58f73861f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_common.h", "type": "file" }, { - "bom-ref": "bd471cbce4e27817", - "name": "/usr/local/lib/python3.12/dist-packages/decorator-5.2.1.dist-info/METADATA", + "bom-ref": "a8d91ce393384995", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_driver_cbid.h", "type": "file" }, { - "bom-ref": "0786047fa82aa7e8", - "name": "/usr/local/lib/python3.12/dist-packages/decorator-5.2.1.dist-info/RECORD", + "bom-ref": "3f38f7e993adc49c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_events.h", "type": "file" }, { - "bom-ref": "5eedcd453f2d5083", - "name": "/usr/local/lib/python3.12/dist-packages/decorator-5.2.1.dist-info/top_level.txt", + "bom-ref": "ac9cc148bcf577ff", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_metrics.h", "type": "file" }, { - "bom-ref": "7d1b052656fd4563", - "name": "/usr/local/lib/python3.12/dist-packages/defusedxml-0.7.1.dist-info/METADATA", + "bom-ref": "906cb992175a4bcd", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_nvtx_cbid.h", "type": "file" }, { - "bom-ref": "74ed75b59d4fdcd7", - "name": "/usr/local/lib/python3.12/dist-packages/defusedxml-0.7.1.dist-info/RECORD", + "bom-ref": "8a3560d85c655757", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_pcsampling.h", "type": "file" }, { - "bom-ref": "913a20a611afd535", - "name": "/usr/local/lib/python3.12/dist-packages/defusedxml-0.7.1.dist-info/top_level.txt", + "bom-ref": "0f661151e937264d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_pcsampling_util.h", "type": "file" }, { - "bom-ref": "6462d0f7ad45c5dc", - "name": "/usr/local/lib/python3.12/dist-packages/diffusers-0.39.0.dist-info/METADATA", + "bom-ref": "821c906b99f695d9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_pmsampling.h", "type": "file" }, { - "bom-ref": "7c5bb6347b58cf2a", - "name": "/usr/local/lib/python3.12/dist-packages/diffusers-0.39.0.dist-info/RECORD", + "bom-ref": "3b83001a2e74d8b4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_profiler_host.h", "type": "file" }, { - "bom-ref": "0ed43e4586cf5d5b", - "name": "/usr/local/lib/python3.12/dist-packages/diffusers-0.39.0.dist-info/top_level.txt", + "bom-ref": "c2d09431dd83f739", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_profiler_target.h", "type": "file" }, { - "bom-ref": "35f183a039f95250", - "name": "/usr/local/lib/python3.12/dist-packages/dill-0.3.8.dist-info/METADATA", + "bom-ref": "283d2a7bf3c13ef6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_range_profiler.h", "type": "file" }, { - "bom-ref": "f0f84d7f61c097cc", - "name": "/usr/local/lib/python3.12/dist-packages/dill-0.3.8.dist-info/RECORD", + "bom-ref": "1add5540255b3333", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_result.h", "type": "file" }, { - "bom-ref": "b122f50b36d45f27", - "name": "/usr/local/lib/python3.12/dist-packages/dill-0.3.8.dist-info/top_level.txt", + "bom-ref": "bc8ee1e21b0702c4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_runtime_cbid.h", "type": "file" }, { - "bom-ref": "1e3307577f51886e", - "name": "/usr/local/lib/python3.12/dist-packages/dllist-2.0.0.dist-info/METADATA", + "bom-ref": "0c1b926c00be3a6c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_sass_metrics.h", "type": "file" }, { - "bom-ref": "df5eaea89b5b6dbf", - "name": "/usr/local/lib/python3.12/dist-packages/dllist-2.0.0.dist-info/RECORD", + "bom-ref": "c9830833183ee8f3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_target.h", "type": "file" }, { - "bom-ref": "afe3e9b480acfa0c", - "name": "/usr/local/lib/python3.12/dist-packages/dllist-2.0.0.dist-info/top_level.txt", + "bom-ref": "0638016961e0d090", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cupti_version.h", "type": "file" }, { - "bom-ref": "b81b452d95dd1f6f", - "name": "/usr/local/lib/python3.12/dist-packages/docstring_parser-0.18.0.dist-info/METADATA", + "bom-ref": "b1bbef5fe55b3e7a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand.h", "type": "file" }, { - "bom-ref": "2401f81bb5881079", - "name": "/usr/local/lib/python3.12/dist-packages/docstring_parser-0.18.0.dist-info/RECORD", + "bom-ref": "5ff18bb07c1bdc87", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_discrete.h", "type": "file" }, { - "bom-ref": "6e5ec75ae01d5869", - "name": "/usr/local/lib/python3.12/dist-packages/einops-0.8.2.dist-info/METADATA", + "bom-ref": "dd6df6243aa58e2f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_discrete2.h", "type": "file" }, { - "bom-ref": "298b22899ca581c1", - "name": "/usr/local/lib/python3.12/dist-packages/einops-0.8.2.dist-info/RECORD", + "bom-ref": "041afbcc12a9f1c5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_globals.h", "type": "file" }, { - "bom-ref": "1020852b66c2da34", - "name": "/usr/local/lib/python3.12/dist-packages/etcd_sdk_python-0.0.7.dist-info/METADATA", + "bom-ref": "7ee5c91412ff4c4c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_kernel.h", "type": "file" }, { - "bom-ref": "3198978853a519cb", - "name": "/usr/local/lib/python3.12/dist-packages/etcd_sdk_python-0.0.7.dist-info/RECORD", + "bom-ref": "e869ec2d8f2e106a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_lognormal.h", "type": "file" }, { - "bom-ref": "5baee2a2497734dd", - "name": "/usr/local/lib/python3.12/dist-packages/etcd_sdk_python-0.0.7.dist-info/top_level.txt", + "bom-ref": "0cb187e68283ac6f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_mrg32k3a.h", "type": "file" }, { - "bom-ref": "43cceda303a1b8fb", - "name": "/usr/local/lib/python3.12/dist-packages/evaluate-0.4.6.dist-info/METADATA", + "bom-ref": "59168651f6b0aec4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_mtgp32.h", "type": "file" }, { - "bom-ref": "c26e03bbb49b5b94", - "name": "/usr/local/lib/python3.12/dist-packages/evaluate-0.4.6.dist-info/RECORD", + "bom-ref": "5f5315ae2f09242a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_mtgp32_host.h", "type": "file" }, { - "bom-ref": "b8e4f851873cde29", - "name": "/usr/local/lib/python3.12/dist-packages/evaluate-0.4.6.dist-info/top_level.txt", + "bom-ref": "4efc1ebdfcd07946", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_mtgp32_kernel.h", "type": "file" }, { - "bom-ref": "06b486d5b74b4d5d", - "name": "/usr/local/lib/python3.12/dist-packages/executing-2.2.1.dist-info/METADATA", + "bom-ref": "d3f34a2f6a8a14ab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_mtgp32dc_p_11213.h", "type": "file" }, { - "bom-ref": "8a40166bf15a2dba", - "name": "/usr/local/lib/python3.12/dist-packages/executing-2.2.1.dist-info/RECORD", + "bom-ref": "e4cddcd4fdbe1976", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_normal.h", "type": "file" }, { - "bom-ref": "2e1450c45b2c68ae", - "name": "/usr/local/lib/python3.12/dist-packages/executing-2.2.1.dist-info/top_level.txt", + "bom-ref": "21726183b4783e55", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_normal_static.h", "type": "file" }, { - "bom-ref": "92c20a923952864f", - "name": "/usr/local/lib/python3.12/dist-packages/fastapi-0.121.3.dist-info/METADATA", + "bom-ref": "c44e83dc08bdbd8d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_philox4x32_x.h", "type": "file" }, { - "bom-ref": "6c683deef6da8614", - "name": "/usr/local/lib/python3.12/dist-packages/fastapi-0.121.3.dist-info/RECORD", + "bom-ref": "4195f2cab6fdf13e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_poisson.h", "type": "file" }, { - "bom-ref": "894199a59fe4fd22", - "name": "/usr/local/lib/python3.12/dist-packages/fastjsonschema-2.21.2.dist-info/METADATA", + "bom-ref": "78f525a925161c44", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_precalc.h", "type": "file" }, { - "bom-ref": "29753f76a922078d", - "name": "/usr/local/lib/python3.12/dist-packages/fastjsonschema-2.21.2.dist-info/RECORD", + "bom-ref": "a95df140a492690f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/curand_uniform.h", "type": "file" }, { - "bom-ref": "1a954d1ba9f82531", - "name": "/usr/local/lib/python3.12/dist-packages/fastjsonschema-2.21.2.dist-info/top_level.txt", + "bom-ref": "07ced95da645aa77", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cusolverDn.h", "type": "file" }, { - "bom-ref": "777a9d675cb1b754", - "name": "/usr/local/lib/python3.12/dist-packages/filelock-3.29.0.dist-info/METADATA", + "bom-ref": "f2059b8132710a29", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cusolverMg.h", "type": "file" }, { - "bom-ref": "1b32a18005c10929", - "name": "/usr/local/lib/python3.12/dist-packages/filelock-3.29.0.dist-info/RECORD", + "bom-ref": "6e40475c6e9ac954", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cusolverRf.h", "type": "file" }, { - "bom-ref": "a452262083f65d95", - "name": "/usr/local/lib/python3.12/dist-packages/flash_attn-2.7.4.post1+git5231d95fe1.45164347.dist-info/METADATA", + "bom-ref": "45b94f6cc3a91ef6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cusolverSp.h", "type": "file" }, { - "bom-ref": "3839bf865185b88d", - "name": "/usr/local/lib/python3.12/dist-packages/flash_attn-2.7.4.post1+git5231d95fe1.45164347.dist-info/RECORD", + "bom-ref": "cb42eff42faf7de6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cusolverSp_LOWLEVEL_PREVIEW.h", "type": "file" }, { - "bom-ref": "8cec8c9cffb38639", - "name": "/usr/local/lib/python3.12/dist-packages/flash_attn-2.7.4.post1+git5231d95fe1.45164347.dist-info/direct_url.json", + "bom-ref": "12ba2427763dacb3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cusolver_common.h", "type": "file" }, { - "bom-ref": "997a3cc2811c3fa6", - "name": "/usr/local/lib/python3.12/dist-packages/flash_attn-2.7.4.post1+git5231d95fe1.45164347.dist-info/top_level.txt", + "bom-ref": "970881312da3f5a0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cusparse.h", "type": "file" }, { - "bom-ref": "f18ddf5646726efd", - "name": "/usr/local/lib/python3.12/dist-packages/flash_attn_4-4.0.0b19.dist-info/METADATA", + "bom-ref": "7cc3c3c5707a4e8e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/cusparse_v2.h", "type": "file" }, { - "bom-ref": "4770edd40fd95723", - "name": "/usr/local/lib/python3.12/dist-packages/flash_attn_4-4.0.0b19.dist-info/RECORD", + "bom-ref": "77664806baae4529", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/device_atomic_functions.h", "type": "file" }, { - "bom-ref": "b6fdcdb45be1efda", - "name": "/usr/local/lib/python3.12/dist-packages/flash_attn_4-4.0.0b19.dist-info/top_level.txt", + "bom-ref": "170456c43dbdd7f4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/device_atomic_functions.hpp", "type": "file" }, { - "bom-ref": "86ef31312f672d5d", - "name": "/usr/local/lib/python3.12/dist-packages/flashinfer_python-0.6.16.dist-info/METADATA", + "bom-ref": "0e7b4ea09e377be0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/device_double_functions.h", "type": "file" }, { - "bom-ref": "9c45b9c675b5a18e", - "name": "/usr/local/lib/python3.12/dist-packages/flashinfer_python-0.6.16.dist-info/RECORD", + "bom-ref": "e9b380ed8080f0c5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/device_functions.h", "type": "file" }, { - "bom-ref": "844eed6214bb29fb", - "name": "/usr/local/lib/python3.12/dist-packages/flashinfer_python-0.6.16.dist-info/top_level.txt", + "bom-ref": "d0a3fe8b3eb69db6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/device_launch_parameters.h", "type": "file" }, { - "bom-ref": "6b1413d4c43757a7", - "name": "/usr/local/lib/python3.12/dist-packages/fonttools-4.62.1.dist-info/METADATA", + "bom-ref": "e4598ea98177bf7c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/device_types.h", "type": "file" }, { - "bom-ref": "42eca1807a6f783d", - "name": "/usr/local/lib/python3.12/dist-packages/fonttools-4.62.1.dist-info/RECORD", + "bom-ref": "33826cb0bc91979a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/driver_functions.h", "type": "file" }, { - "bom-ref": "1d0eb63d050fc4db", - "name": "/usr/local/lib/python3.12/dist-packages/fonttools-4.62.1.dist-info/top_level.txt", + "bom-ref": "dbfc69317a51481d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/driver_types.h", "type": "file" }, { - "bom-ref": "f5b77b0155442c5c", - "name": "/usr/local/lib/python3.12/dist-packages/fqdn-1.5.1.dist-info/METADATA", + "bom-ref": "27787893e28b2f31", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/fatbinary_section.h", "type": "file" }, { - "bom-ref": "d0466608407b06bf", - "name": "/usr/local/lib/python3.12/dist-packages/fqdn-1.5.1.dist-info/RECORD", + "bom-ref": "094b468dd9969ac5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/generated_cudaGL_meta.h", "type": "file" }, { - "bom-ref": "fa89097210373082", - "name": "/usr/local/lib/python3.12/dist-packages/fqdn-1.5.1.dist-info/top_level.txt", + "bom-ref": "92222d65944e31a3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/generated_cudaVDPAU_meta.h", "type": "file" }, { - "bom-ref": "a79123131beee244", - "name": "/usr/local/lib/python3.12/dist-packages/frozenlist-1.8.0.dist-info/METADATA", + "bom-ref": "5f9ed1553e94c2be", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/generated_cuda_gl_interop_meta.h", "type": "file" }, { - "bom-ref": "0d14ed22e1a37877", - "name": "/usr/local/lib/python3.12/dist-packages/frozenlist-1.8.0.dist-info/RECORD", + "bom-ref": "104611dbc84062f0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/generated_cuda_meta.h", "type": "file" }, { - "bom-ref": "ab85cd31315c9ac7", - "name": "/usr/local/lib/python3.12/dist-packages/frozenlist-1.8.0.dist-info/top_level.txt", + "bom-ref": "e3cea1b6043299b1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/generated_cuda_runtime_api_meta.h", "type": "file" }, { - "bom-ref": "df2329df1eca9cda", - "name": "/usr/local/lib/python3.12/dist-packages/fsspec-2024.9.0.dist-info/METADATA", + "bom-ref": "885d0224f54c579e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/generated_cuda_vdpau_interop_meta.h", "type": "file" }, { - "bom-ref": "972476bd4b157831", - "name": "/usr/local/lib/python3.12/dist-packages/fsspec-2024.9.0.dist-info/RECORD", + "bom-ref": "6f1475625ede3ff2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/generated_nvtx_meta.h", "type": "file" }, { - "bom-ref": "def4a28ca403ab50", - "name": "/usr/local/lib/python3.12/dist-packages/ftfy-6.3.1.dist-info/METADATA", + "bom-ref": "2c4416449616a84d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/host_config.h", "type": "file" }, { - "bom-ref": "b066968b7fe36f40", - "name": "/usr/local/lib/python3.12/dist-packages/ftfy-6.3.1.dist-info/RECORD", + "bom-ref": "295fc3b5b422f162", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/host_defines.h", "type": "file" }, { - "bom-ref": "09ff843bd3d9f352", - "name": "/usr/local/lib/python3.12/dist-packages/gast-0.7.0.dist-info/METADATA", + "bom-ref": "ac25c2c21671097a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/library_types.h", "type": "file" }, { - "bom-ref": "0aea8a8236f637d6", - "name": "/usr/local/lib/python3.12/dist-packages/gast-0.7.0.dist-info/RECORD", + "bom-ref": "32915a47f6411ae7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/math_constants.h", "type": "file" }, { - "bom-ref": "073219a6eb644b3f", - "name": "/usr/local/lib/python3.12/dist-packages/gast-0.7.0.dist-info/top_level.txt", + "bom-ref": "5d6b80d5c6fe130e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/math_functions.h", "type": "file" }, { - "bom-ref": "b1ee3f8f61d641d6", - "name": "/usr/local/lib/python3.12/dist-packages/gitdb-4.0.12.dist-info/METADATA", + "bom-ref": "9b3c53a28dd17e0f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/mma.h", "type": "file" }, { - "bom-ref": "c4052496f51ee137", - "name": "/usr/local/lib/python3.12/dist-packages/gitdb-4.0.12.dist-info/RECORD", + "bom-ref": "a97818fe9ecd6f2f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/npp.h", "type": "file" }, { - "bom-ref": "7e349c84b929c666", - "name": "/usr/local/lib/python3.12/dist-packages/gitdb-4.0.12.dist-info/top_level.txt", + "bom-ref": "a57817ad5a3f2f93", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppcore.h", "type": "file" }, { - "bom-ref": "0fcc5ff971a6497d", - "name": "/usr/local/lib/python3.12/dist-packages/gitpython-3.1.60.dist-info/METADATA", + "bom-ref": "0421c4f0fed35422", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppdefs.h", "type": "file" }, { - "bom-ref": "847dd3360435423c", - "name": "/usr/local/lib/python3.12/dist-packages/gitpython-3.1.60.dist-info/RECORD", + "bom-ref": "ee4c06d55dcbd101", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi.h", "type": "file" }, { - "bom-ref": "0803879415c35f4a", - "name": "/usr/local/lib/python3.12/dist-packages/gitpython-3.1.60.dist-info/top_level.txt", + "bom-ref": "fb51511a4153daae", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi_arithmetic_and_logical_operations.h", "type": "file" }, { - "bom-ref": "fc58f730f43adf6c", - "name": "/usr/local/lib/python3.12/dist-packages/google_api_core-2.34.0.dist-info/METADATA", + "bom-ref": "f7d84eb458793e39", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi_color_conversion.h", "type": "file" }, { - "bom-ref": "f7edae5a1c0ed71b", - "name": "/usr/local/lib/python3.12/dist-packages/google_api_core-2.34.0.dist-info/RECORD", + "bom-ref": "1b6e09252029660d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi_data_exchange_and_initialization.h", "type": "file" }, { - "bom-ref": "6c181077ae6a42ad", - "name": "/usr/local/lib/python3.12/dist-packages/google_api_core-2.34.0.dist-info/top_level.txt", + "bom-ref": "0c6ef410c384de64", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi_filtering_functions.h", "type": "file" }, { - "bom-ref": "f1940a73b5247d0d", - "name": "/usr/local/lib/python3.12/dist-packages/google_auth-2.57.0.dist-info/METADATA", + "bom-ref": "642403b33d3a9f38", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi_geometry_transforms.h", "type": "file" }, { - "bom-ref": "629e236d5ea1d994", - "name": "/usr/local/lib/python3.12/dist-packages/google_auth-2.57.0.dist-info/RECORD", + "bom-ref": "5f2ec1e5d0b08901", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi_linear_transforms.h", "type": "file" }, { - "bom-ref": "b8aba134b038d095", - "name": "/usr/local/lib/python3.12/dist-packages/google_auth-2.57.0.dist-info/top_level.txt", + "bom-ref": "74a96177eea7883e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi_morphological_operations.h", "type": "file" }, { - "bom-ref": "e5c685cf34c4f8e6", - "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_core-2.7.0.dist-info/METADATA", + "bom-ref": "6e6a1a17cbc76bc0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi_statistics_functions.h", "type": "file" }, { - "bom-ref": "310e97f55bafac3b", - "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_core-2.7.0.dist-info/RECORD", + "bom-ref": "0ec1e940609d27f9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi_support_functions.h", "type": "file" }, { - "bom-ref": "a89bc1f9584c3025", - "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_core-2.7.0.dist-info/top_level.txt", + "bom-ref": "9ff5271dcb8571f8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nppi_threshold_and_compare_operations.h", "type": "file" }, { - "bom-ref": "8e3a67e4cedf1213", - "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_storage-3.13.1.dist-info/METADATA", + "bom-ref": "90d7294ad38c01a4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/npps.h", "type": "file" }, { - "bom-ref": "743f2530b8ccc882", - "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_storage-3.13.1.dist-info/RECORD", + "bom-ref": "94a827703ee61006", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/npps_arithmetic_and_logical_operations.h", "type": "file" }, { - "bom-ref": "ad0811f70904cd4b", - "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_storage-3.13.1.dist-info/top_level.txt", + "bom-ref": "11af8b538a7a513d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/npps_conversion_functions.h", "type": "file" }, { - "bom-ref": "de1a3e56cf90bdc7", - "name": "/usr/local/lib/python3.12/dist-packages/google_crc32c-1.8.0.dist-info/METADATA", + "bom-ref": "6b929428e295842c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/npps_filtering_functions.h", "type": "file" }, { - "bom-ref": "6bc10718d159ca23", - "name": "/usr/local/lib/python3.12/dist-packages/google_crc32c-1.8.0.dist-info/RECORD", + "bom-ref": "2d39d4b87cdf6de5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/npps_initialization.h", "type": "file" }, { - "bom-ref": "8617da0330c55e30", - "name": "/usr/local/lib/python3.12/dist-packages/google_crc32c-1.8.0.dist-info/top_level.txt", + "bom-ref": "2c60b9c414a85b29", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/npps_statistics_functions.h", "type": "file" }, { - "bom-ref": "a6769a05aeeec9ad", - "name": "/usr/local/lib/python3.12/dist-packages/google_resumable_media-2.10.2.dist-info/METADATA", + "bom-ref": "fe643491a6efb917", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/npps_support_functions.h", "type": "file" }, { - "bom-ref": "a606b21f7928d63a", - "name": "/usr/local/lib/python3.12/dist-packages/google_resumable_media-2.10.2.dist-info/RECORD", + "bom-ref": "d9627b51b032ff69", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nv/detail/__preprocessor", "type": "file" }, { - "bom-ref": "d8bc81561082da78", - "name": "/usr/local/lib/python3.12/dist-packages/google_resumable_media-2.10.2.dist-info/top_level.txt", + "bom-ref": "d5f27cf79f0a3db4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nv/detail/__target_macros", "type": "file" }, { - "bom-ref": "771fe8a6dbf52abb", - "name": "/usr/local/lib/python3.12/dist-packages/googleapis_common_protos-1.75.2.dist-info/METADATA", + "bom-ref": "bb291c70c341a952", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nv/target", "type": "file" }, { - "bom-ref": "b99674175ded6cc4", - "name": "/usr/local/lib/python3.12/dist-packages/googleapis_common_protos-1.75.2.dist-info/RECORD", + "bom-ref": "156810561bad2f5b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvFatbin.h", "type": "file" }, { - "bom-ref": "b7cdcd89ca5f1072", - "name": "/usr/local/lib/python3.12/dist-packages/googleapis_common_protos-1.75.2.dist-info/top_level.txt", + "bom-ref": "f5b050c0dc97a522", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvJitLink.h", "type": "file" }, { - "bom-ref": "eff6c919d33e56fc", - "name": "/usr/local/lib/python3.12/dist-packages/graphviz-0.21.dist-info/METADATA", + "bom-ref": "3c64c59a03f3cfbf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvPTXCompiler.h", "type": "file" }, { - "bom-ref": "6fbc15bee4aca23f", - "name": "/usr/local/lib/python3.12/dist-packages/graphviz-0.21.dist-info/RECORD", + "bom-ref": "7a56361dc417c7df", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvblas.h", "type": "file" }, { - "bom-ref": "9ef4418b99d67229", - "name": "/usr/local/lib/python3.12/dist-packages/graphviz-0.21.dist-info/top_level.txt", + "bom-ref": "306c4d18177905a3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvfunctional", "type": "file" }, { - "bom-ref": "283a69462e51647b", - "name": "/usr/local/lib/python3.12/dist-packages/grpcio-1.80.0.dist-info/METADATA", + "bom-ref": "fbc1bfe253028167", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvjpeg.h", "type": "file" }, { - "bom-ref": "9e5a9653af535c06", - "name": "/usr/local/lib/python3.12/dist-packages/grpcio-1.80.0.dist-info/RECORD", + "bom-ref": "939c3be0230e23e0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvml.h", "type": "file" }, { - "bom-ref": "2db7f8df33408d7b", - "name": "/usr/local/lib/python3.12/dist-packages/grpcio-1.80.0.dist-info/top_level.txt", + "bom-ref": "39bf217515f053fb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvperf_common.h", "type": "file" }, { - "bom-ref": "b2ae2a11faaea426", - "name": "/usr/local/lib/python3.12/dist-packages/h11-0.16.0.dist-info/METADATA", + "bom-ref": "0b92311f1ccd1c62", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvperf_cuda_host.h", "type": "file" }, { - "bom-ref": "ac541efa13b4e033", - "name": "/usr/local/lib/python3.12/dist-packages/h11-0.16.0.dist-info/RECORD", + "bom-ref": "10a56fd167a99aaa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvperf_host.h", "type": "file" }, { - "bom-ref": "ccc83053737c91df", - "name": "/usr/local/lib/python3.12/dist-packages/h11-0.16.0.dist-info/top_level.txt", + "bom-ref": "31115be225888f39", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvperf_target.h", "type": "file" }, { - "bom-ref": "32f8b308a65cee28", - "name": "/usr/local/lib/python3.12/dist-packages/h5py-3.12.1.dist-info/METADATA", + "bom-ref": "23390a033bc8cc20", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvrtc.h", "type": "file" }, { - "bom-ref": "88f90e13558cd0be", - "name": "/usr/local/lib/python3.12/dist-packages/h5py-3.12.1.dist-info/RECORD", + "bom-ref": "659e46f18fdf1342", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExt.h", "type": "file" }, { - "bom-ref": "48b60779ae5c7353", - "name": "/usr/local/lib/python3.12/dist-packages/h5py-3.12.1.dist-info/top_level.txt", + "bom-ref": "18151bc10cfe78bb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtCounters.h", "type": "file" }, { - "bom-ref": "ec8581d78f1c557c", - "name": "/usr/local/lib/python3.12/dist-packages/hf_xet-1.5.0.dist-info/METADATA", + "bom-ref": "ee20cd0889ccd2d5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtCuda.h", "type": "file" }, { - "bom-ref": "69a93aba9bbfd917", - "name": "/usr/local/lib/python3.12/dist-packages/hf_xet-1.5.0.dist-info/RECORD", + "bom-ref": "e975a977de97090f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtCudaRt.h", "type": "file" }, { - "bom-ref": "0d5c1f1a27c5d4d8", - "name": "/usr/local/lib/python3.12/dist-packages/httpcore-1.0.9.dist-info/METADATA", + "bom-ref": "3e600a1c6d6996b6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtMem.h", "type": "file" }, { - "bom-ref": "588297d42ebcfd61", - "name": "/usr/local/lib/python3.12/dist-packages/httpcore-1.0.9.dist-info/RECORD", + "bom-ref": "2bb481fed73738a4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtMemCudaRt.h", "type": "file" }, { - "bom-ref": "5fdcb5637d6083e2", - "name": "/usr/local/lib/python3.12/dist-packages/httpcore2-2.12.0.dist-info/METADATA", + "bom-ref": "5bda47b66087c722", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtOpenCL.h", "type": "file" }, { - "bom-ref": "cac00c42b490cd9d", - "name": "/usr/local/lib/python3.12/dist-packages/httpcore2-2.12.0.dist-info/RECORD", + "bom-ref": "9ab1572f9f1ab349", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtPayload.h", "type": "file" }, { - "bom-ref": "ad4b39b08342826c", - "name": "/usr/local/lib/python3.12/dist-packages/httpx-0.28.1.dist-info/METADATA", + "bom-ref": "552d4dd8f9d0429b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtPayloadHelper.h", "type": "file" }, { - "bom-ref": "7ecb4bb18ae9967a", - "name": "/usr/local/lib/python3.12/dist-packages/httpx-0.28.1.dist-info/RECORD", + "bom-ref": "f1907d6eec36084d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtSemanticsCorrelation.h", "type": "file" }, { - "bom-ref": "51535aa779c4e150", - "name": "/usr/local/lib/python3.12/dist-packages/httpx2-2.12.0.dist-info/METADATA", + "bom-ref": "2bc8d6a80871fd7e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtSemanticsCounters.h", "type": "file" }, { - "bom-ref": "6fec90b5fa3c2f4a", - "name": "/usr/local/lib/python3.12/dist-packages/httpx2-2.12.0.dist-info/RECORD", + "bom-ref": "7487bb073dd1bbc3", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtSemanticsScope.h", "type": "file" }, { - "bom-ref": "11b92ee7c308a795", - "name": "/usr/local/lib/python3.12/dist-packages/httpx_sse-0.4.3.dist-info/METADATA", + "bom-ref": "d7195d1da4264a95", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtSemanticsTime.h", "type": "file" }, { - "bom-ref": "d2b05ed473c3fc18", - "name": "/usr/local/lib/python3.12/dist-packages/httpx_sse-0.4.3.dist-info/RECORD", + "bom-ref": "ff79583c0342c4e1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvToolsExtSync.h", "type": "file" }, { - "bom-ref": "4aa2bd61ccc6ab4d", - "name": "/usr/local/lib/python3.12/dist-packages/httpx_sse-0.4.3.dist-info/top_level.txt", + "bom-ref": "b9dcd39572f3c44e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtx3.hpp", "type": "file" }, { - "bom-ref": "4c9efa676351833d", - "name": "/usr/local/lib/python3.12/dist-packages/huggingface_hub-1.14.0.dist-info/METADATA", + "bom-ref": "baa8faec3ba8794a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtHelperMacros.h", "type": "file" }, { - "bom-ref": "920065c5fd9254c8", - "name": "/usr/local/lib/python3.12/dist-packages/huggingface_hub-1.14.0.dist-info/RECORD", + "bom-ref": "806504832fc65578", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtImpl.h", "type": "file" }, { - "bom-ref": "b7cc53a23b19b8b3", - "name": "/usr/local/lib/python3.12/dist-packages/huggingface_hub-1.14.0.dist-info/top_level.txt", + "bom-ref": "d84a0b2dcce35060", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtImplCounters_v1.h", "type": "file" }, { - "bom-ref": "e53a4388a00a99d0", - "name": "/usr/local/lib/python3.12/dist-packages/humanize-4.16.0.dist-info/METADATA", + "bom-ref": "cfa5f8075c3943bb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtImplMemCudaRt_v1.h", "type": "file" }, { - "bom-ref": "d70902ca84290d0c", - "name": "/usr/local/lib/python3.12/dist-packages/humanize-4.16.0.dist-info/RECORD", + "bom-ref": "0c295c9ce3369661", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtImplMem_v1.h", "type": "file" }, { - "bom-ref": "e17ddd8cb95d9c2e", - "name": "/usr/local/lib/python3.12/dist-packages/idna-3.19.dist-info/METADATA", + "bom-ref": "b01efdedbc8321da", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtImplPayload_v1.h", "type": "file" }, { - "bom-ref": "d5b3a720147a34b4", - "name": "/usr/local/lib/python3.12/dist-packages/idna-3.19.dist-info/RECORD", + "bom-ref": "932e75e159e4b3aa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtInit.h", "type": "file" }, { - "bom-ref": "8a544eaca47857ce", - "name": "/usr/local/lib/python3.12/dist-packages/immutabledict-4.3.1.dist-info/METADATA", + "bom-ref": "1d3144df840a61f6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtPayloadHelperInternal.h", "type": "file" }, { - "bom-ref": "f33eb99b2b7a45b4", - "name": "/usr/local/lib/python3.12/dist-packages/immutabledict-4.3.1.dist-info/RECORD", + "bom-ref": "b1ed34fe5f23ca09", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtPayloadTypeInfo.h", "type": "file" }, { - "bom-ref": "269cfb9e0a7c1097", - "name": "/usr/local/lib/python3.12/dist-packages/importlib_metadata-9.0.0.dist-info/METADATA", + "bom-ref": "dbdddc72944be648", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxExtTypes.h", "type": "file" }, { - "bom-ref": "ee08b7073df3e787", - "name": "/usr/local/lib/python3.12/dist-packages/importlib_metadata-9.0.0.dist-info/RECORD", + "bom-ref": "847413ae369b63d9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImpl.h", "type": "file" }, { - "bom-ref": "43f6f86d7c10f9f1", - "name": "/usr/local/lib/python3.12/dist-packages/importlib_metadata-9.0.0.dist-info/top_level.txt", + "bom-ref": "ebba32a850ab2e48", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImplCore.h", "type": "file" }, { - "bom-ref": "c7eda75ca788c4b5", - "name": "/usr/local/lib/python3.12/dist-packages/intel_openmp-2021.4.0.dist-info/METADATA", + "bom-ref": "f5efbf903d0ade5e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImplCudaRt_v3.h", "type": "file" }, { - "bom-ref": "33f241ae1519821f", - "name": "/usr/local/lib/python3.12/dist-packages/intel_openmp-2021.4.0.dist-info/RECORD", + "bom-ref": "f4930b0324765398", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImplCuda_v3.h", "type": "file" }, { - "bom-ref": "93fa1fed78b553d0", - "name": "/usr/local/lib/python3.12/dist-packages/intel_openmp-2021.4.0.dist-info/top_level.txt", + "bom-ref": "489a0de998b7b47d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImplOpenCL_v3.h", "type": "file" }, { - "bom-ref": "e6ed6277ce82f3d2", - "name": "/usr/local/lib/python3.12/dist-packages/ipykernel-7.2.0.dist-info/METADATA", + "bom-ref": "5760c064337bfa85", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxImplSync_v3.h", "type": "file" }, { - "bom-ref": "1fd0025e617d4fb7", - "name": "/usr/local/lib/python3.12/dist-packages/ipykernel-7.2.0.dist-info/RECORD", + "bom-ref": "2c72568e29837868", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxInit.h", "type": "file" }, { - "bom-ref": "085c5014fddf7c71", - "name": "/usr/local/lib/python3.12/dist-packages/ipython-9.13.0.dist-info/METADATA", + "bom-ref": "762642eaa6128d88", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxInitDecls.h", "type": "file" }, { - "bom-ref": "beb478e16038aac2", - "name": "/usr/local/lib/python3.12/dist-packages/ipython-9.13.0.dist-info/RECORD", + "bom-ref": "74051f4c3bbb0c55", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxInitDefs.h", "type": "file" }, { - "bom-ref": "597d016e1f5fa58d", - "name": "/usr/local/lib/python3.12/dist-packages/ipython-9.13.0.dist-info/top_level.txt", + "bom-ref": "b8733bdde7ee0a73", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxLinkOnce.h", "type": "file" }, { - "bom-ref": "c12da488d6c60533", - "name": "/usr/local/lib/python3.12/dist-packages/ipython_pygments_lexers-1.1.1.dist-info/METADATA", + "bom-ref": "a9ff6ae579443241", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/nvtx3/nvtxDetail/nvtxTypes.h", "type": "file" }, { - "bom-ref": "8899c495ecb9b0f2", - "name": "/usr/local/lib/python3.12/dist-packages/ipython_pygments_lexers-1.1.1.dist-info/RECORD", + "bom-ref": "5e2a2aa1a6598dba", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_20_atomic_functions.h", "type": "file" }, { - "bom-ref": "9c7a826b72f137da", - "name": "/usr/local/lib/python3.12/dist-packages/isodate-0.7.2.dist-info/METADATA", + "bom-ref": "dbd2c8d34654c2c7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_20_atomic_functions.hpp", "type": "file" }, { - "bom-ref": "4020b06e6bf077a9", - "name": "/usr/local/lib/python3.12/dist-packages/isodate-0.7.2.dist-info/RECORD", + "bom-ref": "22e55a0b3c6b864b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_20_intrinsics.h", "type": "file" }, { - "bom-ref": "750f95b84c3bb1f7", - "name": "/usr/local/lib/python3.12/dist-packages/isodate-0.7.2.dist-info/top_level.txt", + "bom-ref": "cce9f382e96bade6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_20_intrinsics.hpp", "type": "file" }, { - "bom-ref": "c977b025fad04efe", - "name": "/usr/local/lib/python3.12/dist-packages/isoduration-20.11.0.dist-info/METADATA", + "bom-ref": "ee0978dfc78732e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_30_intrinsics.h", "type": "file" }, { - "bom-ref": "23b765fd7d2d1bdb", - "name": "/usr/local/lib/python3.12/dist-packages/isoduration-20.11.0.dist-info/RECORD", + "bom-ref": "98f94adf2aefe8ea", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_30_intrinsics.hpp", "type": "file" }, { - "bom-ref": "9f1d877aa2e8723f", - "name": "/usr/local/lib/python3.12/dist-packages/isoduration-20.11.0.dist-info/top_level.txt", + "bom-ref": "fe9c23d25e086f9a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_32_atomic_functions.h", "type": "file" }, { - "bom-ref": "a284c8b5a6de7174", - "name": "/usr/local/lib/python3.12/dist-packages/isort-8.0.1.dist-info/METADATA", + "bom-ref": "22ca58d6658b9b9d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_32_atomic_functions.hpp", "type": "file" }, { - "bom-ref": "bcb358a322231aa8", - "name": "/usr/local/lib/python3.12/dist-packages/isort-8.0.1.dist-info/RECORD", + "bom-ref": "9abfee05b3535acb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_32_intrinsics.h", "type": "file" }, { - "bom-ref": "851da95859514400", - "name": "/usr/local/lib/python3.12/dist-packages/jedi-0.20.0.dist-info/METADATA", + "bom-ref": "347089fcf5dfe8ac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_32_intrinsics.hpp", "type": "file" }, { - "bom-ref": "17c9d8649ebf7317", - "name": "/usr/local/lib/python3.12/dist-packages/jedi-0.20.0.dist-info/RECORD", + "bom-ref": "511296d70bb4a2ef", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_35_atomic_functions.h", "type": "file" }, { - "bom-ref": "4f42586028208996", - "name": "/usr/local/lib/python3.12/dist-packages/jedi-0.20.0.dist-info/top_level.txt", + "bom-ref": "84d9fd2c34a6381c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_35_intrinsics.h", "type": "file" }, { - "bom-ref": "62f9accce864ec5f", - "name": "/usr/local/lib/python3.12/dist-packages/jinja2-3.1.6.dist-info/METADATA", + "bom-ref": "1abf7785b6ec5303", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_60_atomic_functions.h", "type": "file" }, { - "bom-ref": "83ca375227482e54", - "name": "/usr/local/lib/python3.12/dist-packages/jinja2-3.1.6.dist-info/RECORD", + "bom-ref": "57111b0352ad2283", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_60_atomic_functions.hpp", "type": "file" }, { - "bom-ref": "4c93adb495f5d843", - "name": "/usr/local/lib/python3.12/dist-packages/jiter-0.16.0.dist-info/METADATA", + "bom-ref": "bb9e7cb53d5b0ec2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_61_intrinsics.h", "type": "file" }, { - "bom-ref": "be9b4d918e46d68c", - "name": "/usr/local/lib/python3.12/dist-packages/jiter-0.16.0.dist-info/RECORD", + "bom-ref": "7dfcab9305076997", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/sm_61_intrinsics.hpp", "type": "file" }, { - "bom-ref": "8d218a9f0c16738d", - "name": "/usr/local/lib/python3.12/dist-packages/jmespath-1.1.0.dist-info/METADATA", + "bom-ref": "cdfa2721cb3545db", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/surface_indirect_functions.h", "type": "file" }, { - "bom-ref": "3dd02a0f0905de97", - "name": "/usr/local/lib/python3.12/dist-packages/jmespath-1.1.0.dist-info/RECORD", + "bom-ref": "59a9ecadcac15328", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/surface_types.h", "type": "file" }, { - "bom-ref": "bb43a2293446191b", - "name": "/usr/local/lib/python3.12/dist-packages/jmespath-1.1.0.dist-info/top_level.txt", + "bom-ref": "7743cbaaa22402d4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/texture_indirect_functions.h", + "type": "file" + }, + { + "bom-ref": "ab3d3596f311537e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/texture_types.h", + "type": "file" + }, + { + "bom-ref": "3da6b4f5549f98a0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/vector_functions.h", + "type": "file" + }, + { + "bom-ref": "f1329455416fed62", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/vector_functions.hpp", + "type": "file" + }, + { + "bom-ref": "f985001b6c463e5b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/include/vector_types.h", + "type": "file" + }, + { + "bom-ref": "59a8deea0c242b25", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/cccl/cccl-config-version.cmake", + "type": "file" + }, + { + "bom-ref": "26003240e8960244", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/cccl/cccl-config.cmake", + "type": "file" + }, + { + "bom-ref": "d7e29070fc4bbab9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/cub/cub-config-version.cmake", + "type": "file" + }, + { + "bom-ref": "543b7ad4630bd27c", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/cub/cub-config.cmake", + "type": "file" + }, + { + "bom-ref": "046409d94cd65f06", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/cub/cub-header-search.cmake", + "type": "file" + }, + { + "bom-ref": "fa75fd9efa28b2bc", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/libcudacxx/libcudacxx-config-version.cmake", + "type": "file" + }, + { + "bom-ref": "10dc343f4a9f8678", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/libcudacxx/libcudacxx-config.cmake", "type": "file" }, { - "bom-ref": "8fea983f54c667a3", - "name": "/usr/local/lib/python3.12/dist-packages/joblib-1.5.3.dist-info/METADATA", + "bom-ref": "5b7f674501081c8a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/libcudacxx/libcudacxx-header-search.cmake", "type": "file" }, { - "bom-ref": "35eab45ebd51ec68", - "name": "/usr/local/lib/python3.12/dist-packages/joblib-1.5.3.dist-info/RECORD", + "bom-ref": "0a6b4f839dcd5069", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/thrust/FindTBB.cmake", "type": "file" }, { - "bom-ref": "652d46a19be27dd4", - "name": "/usr/local/lib/python3.12/dist-packages/joblib-1.5.3.dist-info/top_level.txt", + "bom-ref": "f10f8d034104a03b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/thrust/README.md", "type": "file" }, { - "bom-ref": "7ad7dcebfcac2c06", - "name": "/usr/local/lib/python3.12/dist-packages/json5-0.14.0.dist-info/METADATA", + "bom-ref": "abab0bfa8c2a48b6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/thrust/thrust-config-version.cmake", "type": "file" }, { - "bom-ref": "57fe4fcd7f0e436c", - "name": "/usr/local/lib/python3.12/dist-packages/json5-0.14.0.dist-info/RECORD", + "bom-ref": "a9aebf77f820ceb9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/thrust/thrust-config.cmake", "type": "file" }, { - "bom-ref": "495c4122d10b844e", - "name": "/usr/local/lib/python3.12/dist-packages/json5-0.14.0.dist-info/top_level.txt", + "bom-ref": "33dcca938e36ad81", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/cmake/thrust/thrust-header-search.cmake", "type": "file" }, { - "bom-ref": "d582e1a00055e50e", - "name": "/usr/local/lib/python3.12/dist-packages/jsonpointer-3.1.1.dist-info/METADATA", + "bom-ref": "1c9f03725e28225a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcheckpoint.so", "type": "file" }, { - "bom-ref": "fe5acf68f5bfa392", - "name": "/usr/local/lib/python3.12/dist-packages/jsonpointer-3.1.1.dist-info/RECORD", + "bom-ref": "4f1a8552dfef809e", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcublas.so.13.7.0.27", "type": "file" }, { - "bom-ref": "20330f9023c61fde", - "name": "/usr/local/lib/python3.12/dist-packages/jsonpointer-3.1.1.dist-info/top_level.txt", + "bom-ref": "b0bbf2421acd51b8", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcublasLt.so.13.7.0.27", "type": "file" }, { - "bom-ref": "4304b5770672eeb6", - "name": "/usr/local/lib/python3.12/dist-packages/jsonschema-4.26.0.dist-info/METADATA", + "bom-ref": "b1ea362ed08a9bf5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcudadevrt.a", "type": "file" }, { - "bom-ref": "1b7f31c32b89ed7f", - "name": "/usr/local/lib/python3.12/dist-packages/jsonschema-4.26.0.dist-info/RECORD", + "bom-ref": "5be431010c748b83", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcudart.so.13.4.49", "type": "file" }, { - "bom-ref": "5957a91d9e0519b9", - "name": "/usr/local/lib/python3.12/dist-packages/jsonschema_specifications-2025.9.1.dist-info/METADATA", + "bom-ref": "b57e6a41de9d7a32", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcudart_static.a", "type": "file" }, { - "bom-ref": "96086a0b326ce51a", - "name": "/usr/local/lib/python3.12/dist-packages/jsonschema_specifications-2025.9.1.dist-info/RECORD", + "bom-ref": "699db82b456bf335", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcufft.so.12.4.0.34", "type": "file" }, { - "bom-ref": "71f897196bc54d44", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_client-8.8.0.dist-info/METADATA", + "bom-ref": "f77c6e4941e425e2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcufftw.so.12.4.0.34", "type": "file" }, { - "bom-ref": "b1a7cc0efe095972", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_client-8.8.0.dist-info/RECORD", + "bom-ref": "6ed3813d40f6a3b2", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcufile.so.1.19.0", "type": "file" }, { - "bom-ref": "953b1f0f853a3c1e", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_core-5.9.1.dist-info/METADATA", + "bom-ref": "d481a1882bae5cd5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcufile_rdma.so.1.19.0", "type": "file" }, { - "bom-ref": "c8fb96d2aa732c0b", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_core-5.9.1.dist-info/RECORD", + "bom-ref": "544d1d23a7b4d62a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libculibos.a", "type": "file" }, { - "bom-ref": "895588d3873429dc", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_events-0.12.1.dist-info/METADATA", + "bom-ref": "f48561509a52b329", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcuobjclient.so.1.3.0", "type": "file" }, { - "bom-ref": "43bcf1a59b1b28b0", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_events-0.12.1.dist-info/RECORD", + "bom-ref": "e063e0549a7f9612", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcupti.so.2026.3.0", "type": "file" }, { - "bom-ref": "c0dc894a597c00fc", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_lsp-2.3.1.dist-info/METADATA", + "bom-ref": "e891d7f0ad7c8bb5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcurand.so.10.4.4.49", "type": "file" }, { - "bom-ref": "3a9d58b8c9c7f6a1", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_lsp-2.3.1.dist-info/RECORD", + "bom-ref": "ef70c3b347ecf513", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcusolver.so.12.3.2.15", "type": "file" }, { - "bom-ref": "8e1aac3425600a8a", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_lsp-2.3.1.dist-info/top_level.txt", + "bom-ref": "772929af29f973ac", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcusolverMg.so.12.3.2.15", "type": "file" }, { - "bom-ref": "8b55f9b9d82e02f2", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_server-2.20.0.dist-info/METADATA", + "bom-ref": "06afe95ef11706b5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libcusparse.so.12.8.6.49", "type": "file" }, { - "bom-ref": "443b2a2482286df0", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_server-2.20.0.dist-info/RECORD", + "bom-ref": "13f0b7dc467a6538", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libmetis_static.a", "type": "file" }, { - "bom-ref": "ed3d9d92042d5bd6", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_server_terminals-0.5.4.dist-info/METADATA", + "bom-ref": "cdfa0d44b268daf0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnppc.so.13.2.0.35", "type": "file" }, { - "bom-ref": "51a6fa7dfb78991a", - "name": "/usr/local/lib/python3.12/dist-packages/jupyter_server_terminals-0.5.4.dist-info/RECORD", + "bom-ref": "f487c46b9baa81ef", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnppial.so.13.2.0.35", "type": "file" }, { - "bom-ref": "56e7235212ba2c5d", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab-4.5.10.dist-info/METADATA", + "bom-ref": "18f13d3c87c323f4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnppicc.so.13.2.0.35", "type": "file" }, { - "bom-ref": "ada72385a38709e7", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab-4.5.10.dist-info/RECORD", + "bom-ref": "8892dcd85e2012e4", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnppidei.so.13.2.0.35", "type": "file" }, { - "bom-ref": "e9f2d6abddded584", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/galata/@jupyterlab/galata-extension/package.json", + "bom-ref": "9c31c43a257fa2f7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnppif.so.13.2.0.35", "type": "file" }, { - "bom-ref": "f8453e239f2b836c", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/staging/package.json", + "bom-ref": "9655db25f6506f45", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnppig.so.13.2.0.35", "type": "file" }, { - "bom-ref": "d2c9bb43ef35f906", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/static/package.json", + "bom-ref": "790367f9b720a3a5", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnppim.so.13.2.0.35", "type": "file" }, { - "bom-ref": "20a607ec5bee58ac", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/extension/package.json", + "bom-ref": "af70352df86c0c2b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnppist.so.13.2.0.35", "type": "file" }, { - "bom-ref": "cd91ce64725186a8", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/incompat/package.json", + "bom-ref": "3739358a2159be51", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnppisu.so.13.2.0.35", "type": "file" }, { - "bom-ref": "7ca21f5d2bc2dc11", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/interop/consumer/package.json", + "bom-ref": "3af0c50dffc94513", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnppitc.so.13.2.0.35", "type": "file" }, { - "bom-ref": "6f7c61b4f47517f5", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/interop/provider/package.json", + "bom-ref": "173d2cd61461ef18", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnpps.so.13.2.0.35", "type": "file" }, { - "bom-ref": "55e88758ffb881fa", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/interop/token/package.json", + "bom-ref": "23f25da58cd45326", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvJitLink.so.13.4.52", "type": "file" }, { - "bom-ref": "bc4da9c2bf12e525", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/mimeextension/package.json", + "bom-ref": "ab07f0abad513dab", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvJitLink_static.a", "type": "file" }, { - "bom-ref": "cec903410bcf8c8e", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/package/package.json", + "bom-ref": "a76357efa9f31e85", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvblas.so.13.7.0.27", "type": "file" }, { - "bom-ref": "4e09ae4b1962da9a", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/service-manager-extension/package.json", + "bom-ref": "35604668e0ee290b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvfatbin.so.13.4.49", "type": "file" }, { - "bom-ref": "9f7636020ba6415f", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/test-hyphens-underscore/package.json", + "bom-ref": "1cbf3aa333faed10", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvjpeg.so.13.2.2.35", "type": "file" }, { - "bom-ref": "d9306695ef966dea", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/test-hyphens/package.json", + "bom-ref": "83179a0b78964152", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvperf_host.so", "type": "file" }, { - "bom-ref": "de0e6167361b8add", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/test_no_hyphens/package.json", + "bom-ref": "60bb94a2748ba6ca", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvperf_target.so", "type": "file" }, { - "bom-ref": "4b72f7ad73e1748c", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_code_formatter-3.0.3.dist-info/METADATA", + "bom-ref": "288d89b906aebcaf", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvptxcompiler_static.a", "type": "file" }, { - "bom-ref": "1ce6355f3af92b45", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_code_formatter-3.0.3.dist-info/RECORD", + "bom-ref": "e9bf4e46f12d53e1", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvrtc-builtins.so.13.4.59", "type": "file" }, { - "bom-ref": "fb1368536908438f", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_jupytext/labextension/package.json", + "bom-ref": "8b0dff04edf9b564", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvrtc.so.13.4.59", "type": "file" }, { - "bom-ref": "050300bb7fb4eaa1", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_pygments-0.3.0.dist-info/METADATA", + "bom-ref": "e9aae4839b1ce6da", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libnvtx3interop.so.1.1.0", "type": "file" }, { - "bom-ref": "36e09021db0fedd9", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_pygments-0.3.0.dist-info/RECORD", + "bom-ref": "ac1688c19d0b6891", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/libpcsamplingutil.so", "type": "file" }, { - "bom-ref": "1946a83ba7f90313", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_server-2.28.0.dist-info/METADATA", + "bom-ref": "cbfcf4028014fe4a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libcublas.so", "type": "file" }, { - "bom-ref": "3a45e1b01c59f4ab", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_server-2.28.0.dist-info/RECORD", + "bom-ref": "6b1099ed490021eb", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libcublasLt.so", "type": "file" }, { - "bom-ref": "c5a36c2136dfe529", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_tensorboard_pro-4.0.0.dist-info/METADATA", + "bom-ref": "b991af91dc122f09", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libcuda.so", "type": "file" }, { - "bom-ref": "fee2760c51e91dc5", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_tensorboard_pro-4.0.0.dist-info/RECORD", + "bom-ref": "48592d697cb71f38", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libcufft.so", "type": "file" }, { - "bom-ref": "2798980db33f8d9b", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_tensorboard_pro-4.0.0.dist-info/direct_url.json", + "bom-ref": "b430cc499684c30a", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libcufftw.so", "type": "file" }, { - "bom-ref": "25ddd9c6c861ee85", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_tensorboard_pro-4.0.0.dist-info/top_level.txt", + "bom-ref": "ebf6765f70e6c380", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libcurand.so", "type": "file" }, { - "bom-ref": "7e057493f2a5bc27", - "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_tensorboard_pro/labextension/package.json", + "bom-ref": "4a6d83de02734d5f", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libcusolver.so", "type": "file" }, { - "bom-ref": "551b3a9e547e0ed7", - "name": "/usr/local/lib/python3.12/dist-packages/jupytext-1.19.1.dist-info/METADATA", + "bom-ref": "2a35f49a58a7190d", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libcusolverMg.so", "type": "file" }, { - "bom-ref": "30b8b1893edb6e8f", - "name": "/usr/local/lib/python3.12/dist-packages/jupytext-1.19.1.dist-info/RECORD", + "bom-ref": "032c8f3214c3a981", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libcusparse.so", "type": "file" }, { - "bom-ref": "cda914f8603f5b0a", - "name": "/usr/local/lib/python3.12/dist-packages/kiwisolver-1.5.0.dist-info/METADATA", + "bom-ref": "523929b4d65bcbaa", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnppc.so", "type": "file" }, { - "bom-ref": "ed3e26c620bfee3d", - "name": "/usr/local/lib/python3.12/dist-packages/kiwisolver-1.5.0.dist-info/RECORD", + "bom-ref": "a4c7ae03c2ea40d7", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnppial.so", "type": "file" }, { - "bom-ref": "7479de076270fb40", - "name": "/usr/local/lib/python3.12/dist-packages/kiwisolver-1.5.0.dist-info/top_level.txt", + "bom-ref": "674ff3b337fc9cff", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnppicc.so", "type": "file" }, { - "bom-ref": "14b714d8c437ed8a", - "name": "/usr/local/lib/python3.12/dist-packages/lark-1.3.1.dist-info/METADATA", + "bom-ref": "6715be379dd1b9ba", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnppidei.so", "type": "file" }, { - "bom-ref": "93b73966f0fad8e0", - "name": "/usr/local/lib/python3.12/dist-packages/lark-1.3.1.dist-info/RECORD", + "bom-ref": "3a7249765b2f6fb9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnppif.so", "type": "file" }, { - "bom-ref": "97264b8abf589b12", - "name": "/usr/local/lib/python3.12/dist-packages/lark-1.3.1.dist-info/top_level.txt", + "bom-ref": "25b2caaef3fe54a0", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnppig.so", "type": "file" }, { - "bom-ref": "bac58400a0b58cc3", - "name": "/usr/local/lib/python3.12/dist-packages/lazy_loader-0.5.dist-info/METADATA", + "bom-ref": "f1b7aee6351bde61", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnppim.so", "type": "file" }, { - "bom-ref": "7621ef659ba341a4", - "name": "/usr/local/lib/python3.12/dist-packages/lazy_loader-0.5.dist-info/RECORD", + "bom-ref": "8a98f235a7ca2fd6", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnppist.so", "type": "file" }, { - "bom-ref": "db3929ffd2b1b0bc", - "name": "/usr/local/lib/python3.12/dist-packages/lazy_loader-0.5.dist-info/top_level.txt", + "bom-ref": "79bccaa6268b0c33", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnppisu.so", "type": "file" }, { - "bom-ref": "8d5d1c8a563fb5b2", - "name": "/usr/local/lib/python3.12/dist-packages/librosa-1.0.0.dist-info/METADATA", + "bom-ref": "021867c0a216fb2b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnppitc.so", "type": "file" }, { - "bom-ref": "2e9e370ae9bff597", - "name": "/usr/local/lib/python3.12/dist-packages/librosa-1.0.0.dist-info/RECORD", + "bom-ref": "e42000a3cf86a5e9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnpps.so", "type": "file" }, { - "bom-ref": "65b868934d247d24", - "name": "/usr/local/lib/python3.12/dist-packages/librosa-1.0.0.dist-info/top_level.txt", + "bom-ref": "f6dd390cf7004bc9", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnvJitLink.so", "type": "file" }, { - "bom-ref": "fd023fcca660aae1", - "name": "/usr/local/lib/python3.12/dist-packages/llguidance-0.7.29.dist-info/METADATA", + "bom-ref": "3cf953cce5e6cbea", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnvfatbin.so", "type": "file" }, { - "bom-ref": "a5e7af0bce0136c1", - "name": "/usr/local/lib/python3.12/dist-packages/llguidance-0.7.29.dist-info/RECORD", + "bom-ref": "39f86fda195dd7ad", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnvidia-ml.a", "type": "file" }, { - "bom-ref": "5d50163aa538cfcc", - "name": "/usr/local/lib/python3.12/dist-packages/llist-0.7.1.dist-info/METADATA", + "bom-ref": "c6bcd602704c8489", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnvidia-ml.so", "type": "file" }, { - "bom-ref": "da67c3910bf1b15a", - "name": "/usr/local/lib/python3.12/dist-packages/llist-0.7.1.dist-info/RECORD", + "bom-ref": "075eb604d7825b35", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnvjpeg.so", "type": "file" }, { - "bom-ref": "a3866d3d285022b8", - "name": "/usr/local/lib/python3.12/dist-packages/llist-0.7.1.dist-info/top_level.txt", + "bom-ref": "404fd6e396b2af0b", + "name": "/usr/local/cuda-13.4/targets/x86_64-linux/lib/stubs/libnvrtc.so", "type": "file" }, { - "bom-ref": "93c8ac17498e5d24", - "name": "/usr/local/lib/python3.12/dist-packages/llvmlite-0.46.0.dist-info/METADATA", + "bom-ref": "678b931a389e2039", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavcodec.so", "type": "file" }, { - "bom-ref": "3cd6f34802200233", - "name": "/usr/local/lib/python3.12/dist-packages/llvmlite-0.46.0.dist-info/RECORD", + "bom-ref": "ef41c3744404a220", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavcodec.so.", "type": "file" }, { - "bom-ref": "3590f08814d21d3e", - "name": "/usr/local/lib/python3.12/dist-packages/llvmlite-0.46.0.dist-info/top_level.txt", + "bom-ref": "be3eca4100657a94", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavcodec.so.61", "type": "file" }, { - "bom-ref": "2bdfea876715536c", - "name": "/usr/local/lib/python3.12/dist-packages/lxml-6.1.2.dist-info/METADATA", + "bom-ref": "2fcef0a69ea70acb", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavcodec.so.61.3.100", "type": "file" }, { - "bom-ref": "c59275f054ee2477", - "name": "/usr/local/lib/python3.12/dist-packages/lxml-6.1.2.dist-info/RECORD", + "bom-ref": "35d5c9ae9bf3cbad", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavdevice.so", "type": "file" }, { - "bom-ref": "ed99e1262df551ce", - "name": "/usr/local/lib/python3.12/dist-packages/lxml-6.1.2.dist-info/top_level.txt", + "bom-ref": "0e09a28838d32c84", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavdevice.so.61", "type": "file" }, { - "bom-ref": "c707ba0b7199ebae", - "name": "/usr/local/lib/python3.12/dist-packages/makefun-1.16.0.dist-info/METADATA", + "bom-ref": "9924e575d4ce3ce3", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavdevice.so.61.1.100", "type": "file" }, { - "bom-ref": "0741215112b94351", - "name": "/usr/local/lib/python3.12/dist-packages/makefun-1.16.0.dist-info/RECORD", + "bom-ref": "12113e2435eef475", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavfilter.so", "type": "file" }, { - "bom-ref": "66f647de9b6d5ad3", - "name": "/usr/local/lib/python3.12/dist-packages/makefun-1.16.0.dist-info/top_level.txt", + "bom-ref": "01d8787758cc546f", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavfilter.so.", "type": "file" }, { - "bom-ref": "6552ff396602dc88", - "name": "/usr/local/lib/python3.12/dist-packages/markdown-3.10.2.dist-info/METADATA", + "bom-ref": "486563a23af8c824", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavfilter.so.10", "type": "file" }, { - "bom-ref": "6e43761654805e53", - "name": "/usr/local/lib/python3.12/dist-packages/markdown-3.10.2.dist-info/RECORD", + "bom-ref": "67e6cb782e09b884", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavfilter.so.10.1.100", "type": "file" }, { - "bom-ref": "f94c10bd6a2bec56", - "name": "/usr/local/lib/python3.12/dist-packages/markdown-3.10.2.dist-info/top_level.txt", + "bom-ref": "423beef7231d9f6e", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavformat.so", "type": "file" }, { - "bom-ref": "884bd2288af7ed2f", - "name": "/usr/local/lib/python3.12/dist-packages/markdown_it_py-4.2.0.dist-info/METADATA", + "bom-ref": "ee37db3e071949fc", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavformat.so.", "type": "file" }, { - "bom-ref": "2f40032dc17e7c18", - "name": "/usr/local/lib/python3.12/dist-packages/markdown_it_py-4.2.0.dist-info/RECORD", + "bom-ref": "c770220981ae80bb", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavformat.so.61", "type": "file" }, { - "bom-ref": "168dfda5a6edbbee", - "name": "/usr/local/lib/python3.12/dist-packages/markupsafe-3.0.3.dist-info/METADATA", + "bom-ref": "26dca3dce22e3008", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavformat.so.61.1.100", "type": "file" }, { - "bom-ref": "2b980d8889b03d59", - "name": "/usr/local/lib/python3.12/dist-packages/markupsafe-3.0.3.dist-info/RECORD", + "bom-ref": "7722fa5b81aec6c0", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavutil.so", "type": "file" }, { - "bom-ref": "0e05042f4b52fe96", - "name": "/usr/local/lib/python3.12/dist-packages/markupsafe-3.0.3.dist-info/top_level.txt", + "bom-ref": "5a2e3b1a7811ed75", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavutil.so.", "type": "file" }, { - "bom-ref": "5c975c8f2aeb2a9a", - "name": "/usr/local/lib/python3.12/dist-packages/matplotlib-3.10.9.dist-info/METADATA", + "bom-ref": "e5e2e908c3167a80", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavutil.so.59", "type": "file" }, { - "bom-ref": "09af926ab462af27", - "name": "/usr/local/lib/python3.12/dist-packages/matplotlib-3.10.9.dist-info/RECORD", + "bom-ref": "47fabce818381d69", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libavutil.so.59.8.100", "type": "file" }, { - "bom-ref": "c196e0a79a615131", - "name": "/usr/local/lib/python3.12/dist-packages/matplotlib_inline-0.2.1.dist-info/METADATA", + "bom-ref": "de77196fffc2da4d", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libswresample.so", "type": "file" }, { - "bom-ref": "3165c180446abdf6", - "name": "/usr/local/lib/python3.12/dist-packages/matplotlib_inline-0.2.1.dist-info/RECORD", + "bom-ref": "19f95a53b3c9703c", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libswresample.so.3", "type": "file" }, { - "bom-ref": "ea6a651056756713", - "name": "/usr/local/lib/python3.12/dist-packages/mcp-1.29.1.dist-info/METADATA", + "bom-ref": "8da64e97d1809225", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libswresample.so.3.9.100", "type": "file" }, { - "bom-ref": "e3cf990025b6668f", - "name": "/usr/local/lib/python3.12/dist-packages/mcp-1.29.1.dist-info/RECORD", + "bom-ref": "7e8258e820f658b1", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libswresample.so.5", "type": "file" }, { - "bom-ref": "6f6bb752f399acfd", - "name": "/usr/local/lib/python3.12/dist-packages/mdit_py_plugins-0.6.0.dist-info/METADATA", + "bom-ref": "153129c1b4318387", + "name": "/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/libswresample.so.5.1.100", "type": "file" }, { - "bom-ref": "192df90b516c3fad", - "name": "/usr/local/lib/python3.12/dist-packages/mdit_py_plugins-0.6.0.dist-info/RECORD", + "bom-ref": "83d8f25b94690471", + "name": "/usr/local/lib/python3.12/dist-packages/StrEnum-0.4.15.dist-info/METADATA", "type": "file" }, { - "bom-ref": "68e04fa71c1f973f", - "name": "/usr/local/lib/python3.12/dist-packages/mdurl-0.1.2.dist-info/METADATA", + "bom-ref": "7fcf13e0ce7f21fc", + "name": "/usr/local/lib/python3.12/dist-packages/StrEnum-0.4.15.dist-info/RECORD", "type": "file" }, { - "bom-ref": "42ac424b5005acd3", - "name": "/usr/local/lib/python3.12/dist-packages/mdurl-0.1.2.dist-info/RECORD", + "bom-ref": "19c253aa635892d3", + "name": "/usr/local/lib/python3.12/dist-packages/StrEnum-0.4.15.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "33d0b65fa1076db5", - "name": "/usr/local/lib/python3.12/dist-packages/meson-1.12.0.dist-info/METADATA", + "bom-ref": "b3827caaccfdd57b", + "name": "/usr/local/lib/python3.12/dist-packages/absl_py-2.5.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "346eb5c13a6a68a7", - "name": "/usr/local/lib/python3.12/dist-packages/meson-1.12.0.dist-info/RECORD", + "bom-ref": "7661590737530b8a", + "name": "/usr/local/lib/python3.12/dist-packages/absl_py-2.5.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "574dba56c7925038", - "name": "/usr/local/lib/python3.12/dist-packages/meson-1.12.0.dist-info/top_level.txt", + "bom-ref": "4a389085ef7f029b", + "name": "/usr/local/lib/python3.12/dist-packages/accelerate-1.15.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5385e53ad34fb5a1", - "name": "/usr/local/lib/python3.12/dist-packages/mistral_common-1.11.7.dist-info/METADATA", + "bom-ref": "8cf903c25e415e0b", + "name": "/usr/local/lib/python3.12/dist-packages/accelerate-1.15.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6caf3637831a8dbc", - "name": "/usr/local/lib/python3.12/dist-packages/mistral_common-1.11.7.dist-info/RECORD", + "bom-ref": "95678d8928209230", + "name": "/usr/local/lib/python3.12/dist-packages/accelerate-1.15.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "cfb36f171f98d934", - "name": "/usr/local/lib/python3.12/dist-packages/mistral_common-1.11.7.dist-info/top_level.txt", + "bom-ref": "8f9feadb55e49c46", + "name": "/usr/local/lib/python3.12/dist-packages/aenum-3.1.17.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a1218e7dcba62bd7", - "name": "/usr/local/lib/python3.12/dist-packages/mistune-3.3.4.dist-info/METADATA", + "bom-ref": "f5a4e8c4b77b1a27", + "name": "/usr/local/lib/python3.12/dist-packages/aenum-3.1.17.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3ecc16ff7d779824", - "name": "/usr/local/lib/python3.12/dist-packages/mistune-3.3.4.dist-info/RECORD", + "bom-ref": "32ec7beaa3830dc0", + "name": "/usr/local/lib/python3.12/dist-packages/aenum-3.1.17.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e677e8b40b892f48", - "name": "/usr/local/lib/python3.12/dist-packages/mistune-3.3.4.dist-info/top_level.txt", + "bom-ref": "a5a8a9408cc2888c", + "name": "/usr/local/lib/python3.12/dist-packages/aiohappyeyeballs-2.7.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ca098912597363e8", - "name": "/usr/local/lib/python3.12/dist-packages/mkl-2021.1.1.dist-info/METADATA", + "bom-ref": "8006e4f08008d499", + "name": "/usr/local/lib/python3.12/dist-packages/aiohappyeyeballs-2.7.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "933eb0943056df2c", - "name": "/usr/local/lib/python3.12/dist-packages/mkl-2021.1.1.dist-info/RECORD", + "bom-ref": "bafdc5ef6d4248a1", + "name": "/usr/local/lib/python3.12/dist-packages/aiohttp-3.14.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9767a0ed5ee2fbd1", - "name": "/usr/local/lib/python3.12/dist-packages/mkl-2021.1.1.dist-info/top_level.txt", + "bom-ref": "d088ea03be7fb339", + "name": "/usr/local/lib/python3.12/dist-packages/aiohttp-3.14.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "914641d512d4770f", - "name": "/usr/local/lib/python3.12/dist-packages/mkl_devel-2021.1.1.dist-info/METADATA", + "bom-ref": "935513bffcb197c6", + "name": "/usr/local/lib/python3.12/dist-packages/aiohttp-3.14.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9dcefa88226bc9ee", - "name": "/usr/local/lib/python3.12/dist-packages/mkl_devel-2021.1.1.dist-info/RECORD", + "bom-ref": "3bc7f9f941088e95", + "name": "/usr/local/lib/python3.12/dist-packages/aiosignal-1.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "69b9657ae9ff093c", - "name": "/usr/local/lib/python3.12/dist-packages/mkl_devel-2021.1.1.dist-info/top_level.txt", + "bom-ref": "adac7f14f6f1b39b", + "name": "/usr/local/lib/python3.12/dist-packages/aiosignal-1.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "888ea3df489a0635", - "name": "/usr/local/lib/python3.12/dist-packages/mkl_include-2021.1.1.dist-info/METADATA", + "bom-ref": "842eae69102c4e7d", + "name": "/usr/local/lib/python3.12/dist-packages/aiosignal-1.4.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "8495d66a39394be5", - "name": "/usr/local/lib/python3.12/dist-packages/mkl_include-2021.1.1.dist-info/RECORD", + "bom-ref": "a63ef01499073180", + "name": "/usr/local/lib/python3.12/dist-packages/annotated_doc-0.0.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bb5b2c73a41c6358", - "name": "/usr/local/lib/python3.12/dist-packages/mkl_include-2021.1.1.dist-info/top_level.txt", + "bom-ref": "50c30d3397dc7e2a", + "name": "/usr/local/lib/python3.12/dist-packages/annotated_doc-0.0.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6de34a5fd48bcaae", - "name": "/usr/local/lib/python3.12/dist-packages/ml_dtypes-0.5.4.dist-info/METADATA", + "bom-ref": "e29810a2ecf62b56", + "name": "/usr/local/lib/python3.12/dist-packages/annotated_types-0.8.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3ece018a95be25bb", - "name": "/usr/local/lib/python3.12/dist-packages/ml_dtypes-0.5.4.dist-info/RECORD", + "bom-ref": "3b5414b449d5b500", + "name": "/usr/local/lib/python3.12/dist-packages/annotated_types-0.8.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "62e1570fa94157d2", - "name": "/usr/local/lib/python3.12/dist-packages/ml_dtypes-0.5.4.dist-info/top_level.txt", + "bom-ref": "3f5b42db6a20d623", + "name": "/usr/local/lib/python3.12/dist-packages/antlr4_python3_runtime-4.9.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0241882f6b9b6067", - "name": "/usr/local/lib/python3.12/dist-packages/modelexpress-0.5.1.dist-info/METADATA", + "bom-ref": "30b91ec94be6fd6f", + "name": "/usr/local/lib/python3.12/dist-packages/antlr4_python3_runtime-4.9.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5ad60d1dd80b63a3", - "name": "/usr/local/lib/python3.12/dist-packages/modelexpress-0.5.1.dist-info/RECORD", + "bom-ref": "2da374929d062f32", + "name": "/usr/local/lib/python3.12/dist-packages/antlr4_python3_runtime-4.9.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "128cc244ee7c0fce", - "name": "/usr/local/lib/python3.12/dist-packages/modelexpress-0.5.1.dist-info/top_level.txt", + "bom-ref": "3a3e8f9d91bae21f", + "name": "/usr/local/lib/python3.12/dist-packages/anyio-4.14.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8194deae23f8ff07", - "name": "/usr/local/lib/python3.12/dist-packages/mpi4py-3.1.5.dist-info/METADATA", + "bom-ref": "804a0f7ea447be56", + "name": "/usr/local/lib/python3.12/dist-packages/anyio-4.14.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cba684d813e14e73", - "name": "/usr/local/lib/python3.12/dist-packages/mpi4py-3.1.5.dist-info/RECORD", + "bom-ref": "b179a1c6ef15ab2d", + "name": "/usr/local/lib/python3.12/dist-packages/anyio-4.14.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0a58d5418401764f", - "name": "/usr/local/lib/python3.12/dist-packages/mpi4py-3.1.5.dist-info/direct_url.json", + "bom-ref": "f6f48890e99619b4", + "name": "/usr/local/lib/python3.12/dist-packages/apache_tvm_ffi-0.1.13.post2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "776f62747d677570", - "name": "/usr/local/lib/python3.12/dist-packages/mpi4py-3.1.5.dist-info/top_level.txt", + "bom-ref": "24ae7540474d928c", + "name": "/usr/local/lib/python3.12/dist-packages/apache_tvm_ffi-0.1.13.post2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1df1c6ff0293c47f", - "name": "/usr/local/lib/python3.12/dist-packages/mpmath-1.3.0.dist-info/METADATA", + "bom-ref": "fbca0c3ffd5fc987", + "name": "/usr/local/lib/python3.12/dist-packages/apex-0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "51f04eee8a9b9f1d", - "name": "/usr/local/lib/python3.12/dist-packages/mpmath-1.3.0.dist-info/RECORD", + "bom-ref": "232acc0d04791336", + "name": "/usr/local/lib/python3.12/dist-packages/apex-0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2b184df55d42e5de", - "name": "/usr/local/lib/python3.12/dist-packages/mpmath-1.3.0.dist-info/top_level.txt", + "bom-ref": "f162123623d5e98a", + "name": "/usr/local/lib/python3.12/dist-packages/apex-0.1.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "f162114e4f1c5203", - "name": "/usr/local/lib/python3.12/dist-packages/msal-1.38.0.dist-info/METADATA", + "bom-ref": "69f7a6be0048cc39", + "name": "/usr/local/lib/python3.12/dist-packages/apex-0.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "ee46925b766b727f", - "name": "/usr/local/lib/python3.12/dist-packages/msal-1.38.0.dist-info/RECORD", + "bom-ref": "d7d7e35c92ae9e9f", + "name": "/usr/local/lib/python3.12/dist-packages/argon2_cffi-25.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4a1b1870638536f9", - "name": "/usr/local/lib/python3.12/dist-packages/msal-1.38.0.dist-info/top_level.txt", + "bom-ref": "542dc8062cd30420", + "name": "/usr/local/lib/python3.12/dist-packages/argon2_cffi-25.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1ea6f72a2d747c37", - "name": "/usr/local/lib/python3.12/dist-packages/msal_extensions-1.3.1.dist-info/METADATA", + "bom-ref": "df0ddcf0055e66cb", + "name": "/usr/local/lib/python3.12/dist-packages/argon2_cffi_bindings-26.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "05ed7dee0d9235ef", - "name": "/usr/local/lib/python3.12/dist-packages/msal_extensions-1.3.1.dist-info/RECORD", + "bom-ref": "9d77f0aff4748440", + "name": "/usr/local/lib/python3.12/dist-packages/argon2_cffi_bindings-26.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "430c82d07b843a15", - "name": "/usr/local/lib/python3.12/dist-packages/msal_extensions-1.3.1.dist-info/top_level.txt", + "bom-ref": "590b1aa368fa9197", + "name": "/usr/local/lib/python3.12/dist-packages/arrow-1.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7f801be4d4204b16", - "name": "/usr/local/lib/python3.12/dist-packages/msgpack-1.2.1.dist-info/METADATA", + "bom-ref": "34cb78c089c39d63", + "name": "/usr/local/lib/python3.12/dist-packages/arrow-1.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6efcd905b1146780", - "name": "/usr/local/lib/python3.12/dist-packages/msgpack-1.2.1.dist-info/RECORD", + "bom-ref": "e36b4a36c5eec539", + "name": "/usr/local/lib/python3.12/dist-packages/asttokens-3.0.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2185febc3b83e536", - "name": "/usr/local/lib/python3.12/dist-packages/msgpack-1.2.1.dist-info/top_level.txt", + "bom-ref": "c33faab386b7328c", + "name": "/usr/local/lib/python3.12/dist-packages/asttokens-3.0.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "86293d217d112c9a", - "name": "/usr/local/lib/python3.12/dist-packages/msgspec-0.21.1.dist-info/METADATA", + "bom-ref": "fa4cd5b466310a13", + "name": "/usr/local/lib/python3.12/dist-packages/asttokens-3.0.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "bff85766296fc323", - "name": "/usr/local/lib/python3.12/dist-packages/msgspec-0.21.1.dist-info/RECORD", + "bom-ref": "3f81120a5a292e2d", + "name": "/usr/local/lib/python3.12/dist-packages/astunparse-1.6.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "81e93d089d6999a5", - "name": "/usr/local/lib/python3.12/dist-packages/msgspec-0.21.1.dist-info/top_level.txt", + "bom-ref": "37b4f8af60ce01fc", + "name": "/usr/local/lib/python3.12/dist-packages/astunparse-1.6.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4b4b084517143c84", - "name": "/usr/local/lib/python3.12/dist-packages/multidict-6.7.1.dist-info/METADATA", + "bom-ref": "8459085c3c326370", + "name": "/usr/local/lib/python3.12/dist-packages/astunparse-1.6.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "3d547c110b0258f7", - "name": "/usr/local/lib/python3.12/dist-packages/multidict-6.7.1.dist-info/RECORD", + "bom-ref": "7da6e25bea01f415", + "name": "/usr/local/lib/python3.12/dist-packages/async_lru-2.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e650d6f23ffa15a0", - "name": "/usr/local/lib/python3.12/dist-packages/multidict-6.7.1.dist-info/top_level.txt", + "bom-ref": "f65405398b2f93b2", + "name": "/usr/local/lib/python3.12/dist-packages/async_lru-2.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d510d815a0dbd604", - "name": "/usr/local/lib/python3.12/dist-packages/multiprocess-0.70.16.dist-info/METADATA", + "bom-ref": "af490ac37640514b", + "name": "/usr/local/lib/python3.12/dist-packages/async_lru-2.3.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "8a260eb2f306866c", - "name": "/usr/local/lib/python3.12/dist-packages/multiprocess-0.70.16.dist-info/RECORD", + "bom-ref": "9f7b813c1a436ef1", + "name": "/usr/local/lib/python3.12/dist-packages/attrs-26.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "939616daafa3a7d6", - "name": "/usr/local/lib/python3.12/dist-packages/multiprocess-0.70.16.dist-info/top_level.txt", + "bom-ref": "eb8abace59797616", + "name": "/usr/local/lib/python3.12/dist-packages/attrs-26.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dcabfa11d9586308", - "name": "/usr/local/lib/python3.12/dist-packages/mypy_extensions-1.1.0.dist-info/METADATA", + "bom-ref": "981ae264ba92e067", + "name": "/usr/local/lib/python3.12/dist-packages/azure_core-1.41.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "23d75f669bc34654", - "name": "/usr/local/lib/python3.12/dist-packages/mypy_extensions-1.1.0.dist-info/RECORD", + "bom-ref": "d4258d8ccebfc9ad", + "name": "/usr/local/lib/python3.12/dist-packages/azure_core-1.41.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "eb97deddbe90e365", - "name": "/usr/local/lib/python3.12/dist-packages/narwhals-2.25.0.dist-info/METADATA", + "bom-ref": "83e3d58f7d31dbf9", + "name": "/usr/local/lib/python3.12/dist-packages/azure_core-1.41.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0ebce46e82388e41", - "name": "/usr/local/lib/python3.12/dist-packages/narwhals-2.25.0.dist-info/RECORD", + "bom-ref": "ab236ede34a3121b", + "name": "/usr/local/lib/python3.12/dist-packages/azure_identity-1.25.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "737590fe28b155ba", - "name": "/usr/local/lib/python3.12/dist-packages/nbclient-0.10.4.dist-info/METADATA", + "bom-ref": "abe08f6896a1c7dc", + "name": "/usr/local/lib/python3.12/dist-packages/azure_identity-1.25.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "92ed8b86fe7512d9", - "name": "/usr/local/lib/python3.12/dist-packages/nbclient-0.10.4.dist-info/RECORD", + "bom-ref": "4a00f656297703f7", + "name": "/usr/local/lib/python3.12/dist-packages/azure_identity-1.25.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "8640bf8a6587ef8d", - "name": "/usr/local/lib/python3.12/dist-packages/nbconvert-7.17.1.dist-info/METADATA", + "bom-ref": "f5ab909213630246", + "name": "/usr/local/lib/python3.12/dist-packages/azure_storage_blob-12.30.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "83a69edd99eba63e", - "name": "/usr/local/lib/python3.12/dist-packages/nbconvert-7.17.1.dist-info/RECORD", + "bom-ref": "4b0dd6aba8ca2962", + "name": "/usr/local/lib/python3.12/dist-packages/azure_storage_blob-12.30.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "71253c1701985703", - "name": "/usr/local/lib/python3.12/dist-packages/nbformat-5.10.4.dist-info/METADATA", + "bom-ref": "e0c142bb1efab756", + "name": "/usr/local/lib/python3.12/dist-packages/azure_storage_blob-12.30.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "ed81d00b5bcee19a", - "name": "/usr/local/lib/python3.12/dist-packages/nbformat-5.10.4.dist-info/RECORD", + "bom-ref": "9fdf33494376ce69", + "name": "/usr/local/lib/python3.12/dist-packages/babel-2.18.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ca46b47c9ea7c365", - "name": "/usr/local/lib/python3.12/dist-packages/nccl4py-0.3.1.dist-info/METADATA", + "bom-ref": "92a5e7c83449188a", + "name": "/usr/local/lib/python3.12/dist-packages/babel-2.18.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ea39446eae9b843a", - "name": "/usr/local/lib/python3.12/dist-packages/nccl4py-0.3.1.dist-info/RECORD", + "bom-ref": "6c8c1276101add3d", + "name": "/usr/local/lib/python3.12/dist-packages/babel-2.18.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "647ae42ef9741383", - "name": "/usr/local/lib/python3.12/dist-packages/nccl4py-0.3.1.dist-info/top_level.txt", + "bom-ref": "92b036197e40008c", + "name": "/usr/local/lib/python3.12/dist-packages/backoff-2.2.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6b82ec2d3749f41b", - "name": "/usr/local/lib/python3.12/dist-packages/nest_asyncio-1.6.0.dist-info/METADATA", + "bom-ref": "8660c9eaf447d596", + "name": "/usr/local/lib/python3.12/dist-packages/backoff-2.2.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a8cc14b1b2a227bf", - "name": "/usr/local/lib/python3.12/dist-packages/nest_asyncio-1.6.0.dist-info/RECORD", + "bom-ref": "bb0068182303b0c4", + "name": "/usr/local/lib/python3.12/dist-packages/beautifulsoup4-4.15.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "183c7d024637506b", - "name": "/usr/local/lib/python3.12/dist-packages/nest_asyncio-1.6.0.dist-info/top_level.txt", + "bom-ref": "fd9cd5629516a956", + "name": "/usr/local/lib/python3.12/dist-packages/beautifulsoup4-4.15.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2b63d9ffd110e46b", - "name": "/usr/local/lib/python3.12/dist-packages/networkx-3.6.1.dist-info/METADATA", + "bom-ref": "b8d620f9a83ee7cc", + "name": "/usr/local/lib/python3.12/dist-packages/blake3-1.0.9.dist-info/METADATA", "type": "file" }, { - "bom-ref": "24d068127b7599f2", - "name": "/usr/local/lib/python3.12/dist-packages/networkx-3.6.1.dist-info/RECORD", + "bom-ref": "ed52b866572c9411", + "name": "/usr/local/lib/python3.12/dist-packages/blake3-1.0.9.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1f868f2b62ce3ab9", - "name": "/usr/local/lib/python3.12/dist-packages/networkx-3.6.1.dist-info/top_level.txt", + "bom-ref": "2ebbc6a9cd0713de", + "name": "/usr/local/lib/python3.12/dist-packages/bleach-6.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "574d836a218970e4", - "name": "/usr/local/lib/python3.12/dist-packages/ninja-1.13.0.dist-info/METADATA", + "bom-ref": "2dd42cc292553e49", + "name": "/usr/local/lib/python3.12/dist-packages/bleach-6.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c98441610d5606e1", - "name": "/usr/local/lib/python3.12/dist-packages/ninja-1.13.0.dist-info/RECORD", + "bom-ref": "ecab0e04cedf4342", + "name": "/usr/local/lib/python3.12/dist-packages/bleach-6.4.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "3e1d024f42b6e112", - "name": "/usr/local/lib/python3.12/dist-packages/notebook-7.5.6.dist-info/METADATA", + "bom-ref": "be4bee11cb13eed8", + "name": "/usr/local/lib/python3.12/dist-packages/bleach/_vendor/html5lib-1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5d068ee97902ffc3", - "name": "/usr/local/lib/python3.12/dist-packages/notebook-7.5.6.dist-info/RECORD", + "bom-ref": "66ef96145f3216ba", + "name": "/usr/local/lib/python3.12/dist-packages/bleach/_vendor/html5lib-1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "705a46fb6c476e1a", - "name": "/usr/local/lib/python3.12/dist-packages/notebook_shim-0.2.4.dist-info/METADATA", + "bom-ref": "52f8aa0f9a9994ff", + "name": "/usr/local/lib/python3.12/dist-packages/bleach/_vendor/html5lib-1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "bccc98dc47e7b7a4", - "name": "/usr/local/lib/python3.12/dist-packages/notebook_shim-0.2.4.dist-info/RECORD", + "bom-ref": "b32dd29f29e0736a", + "name": "/usr/local/lib/python3.12/dist-packages/blobfile-3.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4494f1e7862b74f3", - "name": "/usr/local/lib/python3.12/dist-packages/numba-0.64.0.dist-info/METADATA", + "bom-ref": "657b67d3e621a00e", + "name": "/usr/local/lib/python3.12/dist-packages/blobfile-3.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "06265179e119a4c5", - "name": "/usr/local/lib/python3.12/dist-packages/numba-0.64.0.dist-info/RECORD", + "bom-ref": "ed20bda4ed30d5e3", + "name": "/usr/local/lib/python3.12/dist-packages/blobfile-3.3.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "29d55b7648513775", - "name": "/usr/local/lib/python3.12/dist-packages/numba-0.64.0.dist-info/top_level.txt", + "bom-ref": "6bf7d34783557036", + "name": "/usr/local/lib/python3.12/dist-packages/boto3-1.43.93.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cfce3a09cbd38dd7", - "name": "/usr/local/lib/python3.12/dist-packages/numexpr-2.14.2.dist-info/METADATA", + "bom-ref": "ee38fe93b37fe4af", + "name": "/usr/local/lib/python3.12/dist-packages/boto3-1.43.93.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6ff0762cc8d62790", - "name": "/usr/local/lib/python3.12/dist-packages/numexpr-2.14.2.dist-info/RECORD", + "bom-ref": "e1b4b8579875f633", + "name": "/usr/local/lib/python3.12/dist-packages/boto3-1.43.93.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "57e69f2ffb07ba23", - "name": "/usr/local/lib/python3.12/dist-packages/numexpr-2.14.2.dist-info/top_level.txt", + "bom-ref": "87721fd6197108bd", + "name": "/usr/local/lib/python3.12/dist-packages/botocore-1.43.93.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e05760141339ac68", - "name": "/usr/local/lib/python3.12/dist-packages/numpy-2.3.5.dist-info/METADATA", + "bom-ref": "a8505e44c622d4c3", + "name": "/usr/local/lib/python3.12/dist-packages/botocore-1.43.93.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1536c431d556e177", - "name": "/usr/local/lib/python3.12/dist-packages/numpy-2.3.5.dist-info/RECORD", + "bom-ref": "9ff0fe06008acbff", + "name": "/usr/local/lib/python3.12/dist-packages/botocore-1.43.93.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "155ec29330667006", - "name": "/usr/local/lib/python3.12/dist-packages/nv_one_logger_core-2.3.1.dist-info/METADATA", + "bom-ref": "0268fe9ef68ec30c", + "name": "/usr/local/lib/python3.12/dist-packages/build-1.6.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "33b371d93ca8b9a9", - "name": "/usr/local/lib/python3.12/dist-packages/nv_one_logger_core-2.3.1.dist-info/RECORD", + "bom-ref": "b3464b91313efc32", + "name": "/usr/local/lib/python3.12/dist-packages/build-1.6.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "76e2148d91f55a9d", - "name": "/usr/local/lib/python3.12/dist-packages/nv_one_logger_training_telemetry-2.3.1.dist-info/METADATA", + "bom-ref": "b96240a0493da7c7", + "name": "/usr/local/lib/python3.12/dist-packages/cache_dit-1.5.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "12dbfc2b4c04e3ec", - "name": "/usr/local/lib/python3.12/dist-packages/nv_one_logger_training_telemetry-2.3.1.dist-info/RECORD", + "bom-ref": "7765d376d51011d8", + "name": "/usr/local/lib/python3.12/dist-packages/cache_dit-1.5.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "bdf66a18ddcb6fe4", - "name": "/usr/local/lib/python3.12/dist-packages/nvdlfw_inspect-0.2.2.dist-info/METADATA", + "bom-ref": "eee1c96f7569d762", + "name": "/usr/local/lib/python3.12/dist-packages/cache_dit-1.5.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "50d49abe58abcbba", - "name": "/usr/local/lib/python3.12/dist-packages/nvdlfw_inspect-0.2.2.dist-info/RECORD", + "bom-ref": "5e4dc36b37c0b0a6", + "name": "/usr/local/lib/python3.12/dist-packages/certifi-2026.7.22.dist-info/METADATA", "type": "file" }, { - "bom-ref": "62bd9b0121f18f13", - "name": "/usr/local/lib/python3.12/dist-packages/nvdlfw_inspect-0.2.2.dist-info/top_level.txt", + "bom-ref": "84d1e7c6bf8726b8", + "name": "/usr/local/lib/python3.12/dist-packages/certifi-2026.7.22.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a4a50b59b06f39e0", - "name": "/usr/local/lib/python3.12/dist-packages/nvfuser-0.2.36+git29f5740.dist-info/METADATA", + "bom-ref": "05f8889533e15e3a", + "name": "/usr/local/lib/python3.12/dist-packages/certifi-2026.7.22.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "2ae2e0862de8924b", - "name": "/usr/local/lib/python3.12/dist-packages/nvfuser-0.2.36+git29f5740.dist-info/RECORD", + "bom-ref": "0c20f09350c0c5a3", + "name": "/usr/local/lib/python3.12/dist-packages/cffi-2.1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "85240ff635b04649", - "name": "/usr/local/lib/python3.12/dist-packages/nvfuser-0.2.36+git29f5740.dist-info/direct_url.json", + "bom-ref": "cc175f2039e60b70", + "name": "/usr/local/lib/python3.12/dist-packages/cffi-2.1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "882547d5bc991114", - "name": "/usr/local/lib/python3.12/dist-packages/nvfuser-0.2.36+git29f5740.dist-info/top_level.txt", + "bom-ref": "60188faa91079588", + "name": "/usr/local/lib/python3.12/dist-packages/cffi-2.1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "f125ac6723ca1999", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia/dali/.libs/libavformat-1a98fe37.so.62", + "bom-ref": "1638a526f5b0e3ce", + "name": "/usr/local/lib/python3.12/dist-packages/charset_normalizer-3.5.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e384bb3ec9a9d436", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvdisasm-13.3.73.dist-info/METADATA", + "bom-ref": "0ea983e0c3ca8751", + "name": "/usr/local/lib/python3.12/dist-packages/charset_normalizer-3.5.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8799f34f27db934b", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvdisasm-13.3.73.dist-info/RECORD", + "bom-ref": "42f287d7fa4f053f", + "name": "/usr/local/lib/python3.12/dist-packages/charset_normalizer-3.5.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0d380dca4d2c1204", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvdisasm-13.3.73.dist-info/top_level.txt", + "bom-ref": "4fd3ee46cf89238a", + "name": "/usr/local/lib/python3.12/dist-packages/click-8.4.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8b6ef55729901a34", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvrtc-13.3.33.dist-info/METADATA", + "bom-ref": "4dbf9b1944c95d13", + "name": "/usr/local/lib/python3.12/dist-packages/click-8.4.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e264b9f15aa91ab1", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvrtc-13.3.33.dist-info/RECORD", + "bom-ref": "2274d7c222f24de6", + "name": "/usr/local/lib/python3.12/dist-packages/click_option_group-0.5.9.dist-info/METADATA", "type": "file" }, { - "bom-ref": "187daaf2e9743f43", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvrtc-13.3.33.dist-info/top_level.txt", + "bom-ref": "b47261d2938b90ec", + "name": "/usr/local/lib/python3.12/dist-packages/click_option_group-0.5.9.dist-info/RECORD", "type": "file" }, { - "bom-ref": "fa8a4ade2f2c21a7", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_tileiras-13.1.80.dist-info/METADATA", + "bom-ref": "f1a4f4f37d718b9a", + "name": "/usr/local/lib/python3.12/dist-packages/cloudpickle-3.1.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "42cda8d254bf1077", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_tileiras-13.1.80.dist-info/RECORD", + "bom-ref": "05a8131425282281", + "name": "/usr/local/lib/python3.12/dist-packages/cloudpickle-3.1.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f5a2378821f0ab1c", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_tileiras-13.1.80.dist-info/top_level.txt", + "bom-ref": "f428b46036a210b7", + "name": "/usr/local/lib/python3.12/dist-packages/cmake-3.31.6.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b4e02e0e6713c472", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cudnn_frontend-1.27.0.dist-info/METADATA", + "bom-ref": "72ce043bc09e286f", + "name": "/usr/local/lib/python3.12/dist-packages/cmake-3.31.6.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3eb896ecf9a300e2", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cudnn_frontend-1.27.0.dist-info/RECORD", + "bom-ref": "ae72c9963061abde", + "name": "/usr/local/lib/python3.12/dist-packages/colored-2.3.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a58dd3c828bd320c", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cudnn_frontend-1.27.0.dist-info/top_level.txt", + "bom-ref": "2577fb2e5c3e044c", + "name": "/usr/local/lib/python3.12/dist-packages/colored-2.3.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6401602af10626ca", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl-4.6.1.dist-info/METADATA", + "bom-ref": "cd65bc9baf912baa", + "name": "/usr/local/lib/python3.12/dist-packages/comm-0.2.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8025a91955d126b6", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl-4.6.1.dist-info/RECORD", + "bom-ref": "df8832da961908ed", + "name": "/usr/local/lib/python3.12/dist-packages/comm-0.2.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "56016721c3623521", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl-4.6.1.dist-info/top_level.txt", + "bom-ref": "0c6e051b1a8b9cb8", + "name": "/usr/local/lib/python3.12/dist-packages/contourpy-1.3.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5b61017041a322c3", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_base-4.6.1.dist-info/METADATA", + "bom-ref": "2e8a885252172b1b", + "name": "/usr/local/lib/python3.12/dist-packages/contourpy-1.3.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9524406d4e8189df", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_base-4.6.1.dist-info/RECORD", + "bom-ref": "ef0b0f8baccb19f1", + "name": "/usr/local/lib/python3.12/dist-packages/cryptography-50.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e563f430f7545fee", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_base-4.6.1.dist-info/top_level.txt", + "bom-ref": "2043b2dc9c23d3a2", + "name": "/usr/local/lib/python3.12/dist-packages/cryptography-50.0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c25b0380395ca749", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_core-4.6.1.dist-info/METADATA", + "bom-ref": "57fa859f276deb03", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_bindings-13.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "53ed7dba4deaf7e6", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_core-4.6.1.dist-info/RECORD", + "bom-ref": "e61fb2ac397b21ba", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_bindings-13.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "17d22d0f0f82b1e9", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_core-4.6.1.dist-info/top_level.txt", + "bom-ref": "131ca02a3bd2d3e7", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_bindings-13.3.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "5b4cb13d5e900073", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu12-4.6.1.dist-info/METADATA", + "bom-ref": "6482dda04c8bd5be", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_core-1.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9471d93607c825ab", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu12-4.6.1.dist-info/RECORD", + "bom-ref": "88fe5c3a972d29ba", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_core-1.0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dc8a7dd3b3e24fec", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu12-4.6.1.dist-info/top_level.txt", + "bom-ref": "d007c5ea7d082a03", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_core-1.0.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "7348579e166102df", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu13-4.6.1.dist-info/METADATA", + "bom-ref": "440b64d4e82043aa", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_pathfinder-1.6.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3fcec3d066a2c281", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu13-4.6.1.dist-info/RECORD", + "bom-ref": "a17a9de2e675ac56", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_pathfinder-1.6.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dc58c48874c8c5b4", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu13-4.6.1.dist-info/top_level.txt", + "bom-ref": "2af69275d4990b0f", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_pathfinder-1.6.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "96997f89de87658f", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_dali_cuda130-2.1.0.dist-info/METADATA", + "bom-ref": "556a8ddf8f6c48a1", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_python-13.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b18eaf820f795da0", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_dali_cuda130-2.1.0.dist-info/RECORD", + "bom-ref": "41d75548991e8b68", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_python-13.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "060fdf3c532b8e3c", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_dali_cuda130-2.1.0.dist-info/top_level.txt", + "bom-ref": "819f598dd5661a08", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_python-13.3.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "af789f6d8921d119", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_libnvcomp_cu13-5.1.0.21.dist-info/METADATA", + "bom-ref": "9bdde17e75ad3994", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_tile-1.5.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f974f98deb9e55cd", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_libnvcomp_cu13-5.1.0.21.dist-info/RECORD", + "bom-ref": "8b6f42f754e9682d", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_tile-1.5.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "caaa20e337af59e2", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_libnvcomp_cu13-5.1.0.21.dist-info/top_level.txt", + "bom-ref": "1006289f324d92ae", + "name": "/usr/local/lib/python3.12/dist-packages/cuda_tile-1.5.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "a28600461c39f107", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_matmul_heuristics-0.1.0.27.dist-info/METADATA", + "bom-ref": "bd677572c6655cd4", + "name": "/usr/local/lib/python3.12/dist-packages/cycler-0.12.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "223197c556621d68", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_matmul_heuristics-0.1.0.27.dist-info/RECORD", + "bom-ref": "5a5dee4dacb5409a", + "name": "/usr/local/lib/python3.12/dist-packages/cycler-0.12.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cc5820d5f5b1688e", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_matmul_heuristics-0.1.0.27.dist-info/top_level.txt", + "bom-ref": "9edaee2dd6dc7e61", + "name": "/usr/local/lib/python3.12/dist-packages/cycler-0.12.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "a3e10925bcf909da", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_ml_py-13.595.45.dist-info/METADATA", + "bom-ref": "f22c8770949d7a2b", + "name": "/usr/local/lib/python3.12/dist-packages/cython-3.2.9.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a8d4194fbe38baa1", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_ml_py-13.595.45.dist-info/RECORD", + "bom-ref": "d4ede7688ad9d6fb", + "name": "/usr/local/lib/python3.12/dist-packages/cython-3.2.9.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a13e22822dd48996", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_ml_py-13.595.45.dist-info/top_level.txt", + "bom-ref": "398675a4c4bac78e", + "name": "/usr/local/lib/python3.12/dist-packages/cython-3.2.9.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "2c8330ee60741ab6", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_modelopt-0.43.0.dist-info/METADATA", + "bom-ref": "85b6a338b4e8996c", + "name": "/usr/local/lib/python3.12/dist-packages/datasets-3.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9b3c80e79f39205c", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_modelopt-0.43.0.dist-info/RECORD", + "bom-ref": "f691e1bed5bca339", + "name": "/usr/local/lib/python3.12/dist-packages/datasets-3.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "034980405e5eb22c", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_modelopt-0.43.0.dist-info/direct_url.json", + "bom-ref": "500686fc409a112f", + "name": "/usr/local/lib/python3.12/dist-packages/datasets-3.1.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "45bf58e1aa547730", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_modelopt-0.43.0.dist-info/top_level.txt", + "bom-ref": "76f1a612a10c07f1", + "name": "/usr/local/lib/python3.12/dist-packages/debugpy-1.8.21.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1f6b2174039d834d", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nccl_cu13-2.30.4.dist-info/METADATA", + "bom-ref": "c73b0376f1ca7b09", + "name": "/usr/local/lib/python3.12/dist-packages/debugpy-1.8.21.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f1950473a26452f6", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nccl_cu13-2.30.4.dist-info/RECORD", + "bom-ref": "a4644c9e28b376af", + "name": "/usr/local/lib/python3.12/dist-packages/debugpy-1.8.21.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "21676a5992620bae", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nccl_cu13-2.30.4.dist-info/top_level.txt", + "bom-ref": "ecf06810a89492cb", + "name": "/usr/local/lib/python3.12/dist-packages/decorator-5.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6c0620cc31bba0d7", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvimgcodec_cu13-0.7.0.49.dist-info/METADATA", + "bom-ref": "bc442ced41e239c2", + "name": "/usr/local/lib/python3.12/dist-packages/decorator-5.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "151f59ba576233b8", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvimgcodec_cu13-0.7.0.49.dist-info/RECORD", + "bom-ref": "d017e80bf1d1780c", + "name": "/usr/local/lib/python3.12/dist-packages/decorator-5.3.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "a6043d1316fbc996", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvimgcodec_cu13-0.7.0.49.dist-info/top_level.txt", + "bom-ref": "fb29ec5e8244b754", + "name": "/usr/local/lib/python3.12/dist-packages/defusedxml-0.7.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4ed1355beba64a9f", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg-13.1.0.48.dist-info/METADATA", + "bom-ref": "2b6eae04507cd9c0", + "name": "/usr/local/lib/python3.12/dist-packages/defusedxml-0.7.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b56bbde5bc96d302", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg-13.1.0.48.dist-info/RECORD", + "bom-ref": "dcc118dcbc0ae7f6", + "name": "/usr/local/lib/python3.12/dist-packages/defusedxml-0.7.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1d108227258d8d81", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg-13.1.0.48.dist-info/top_level.txt", + "bom-ref": "01e1df87a32c9cb7", + "name": "/usr/local/lib/python3.12/dist-packages/diffusers-0.40.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9fdb3f7a227dc05a", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg2k_cu13-0.10.0.49.dist-info/METADATA", + "bom-ref": "4eae463b6c466d52", + "name": "/usr/local/lib/python3.12/dist-packages/diffusers-0.40.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "097de41affd7a2f3", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg2k_cu13-0.10.0.49.dist-info/RECORD", + "bom-ref": "8a50ad22892ee89f", + "name": "/usr/local/lib/python3.12/dist-packages/diffusers-0.40.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "77ffaef17ed6430b", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg2k_cu13-0.10.0.49.dist-info/top_level.txt", + "bom-ref": "c74627b3f65b00d7", + "name": "/usr/local/lib/python3.12/dist-packages/dill-0.3.8.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f0fb5e559c454e6b", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvtiff_cu13-0.7.0.79.dist-info/METADATA", + "bom-ref": "a2d1f3f4ee3eb563", + "name": "/usr/local/lib/python3.12/dist-packages/dill-0.3.8.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4a31174ff66ab9b0", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvtiff_cu13-0.7.0.79.dist-info/RECORD", + "bom-ref": "73508c77a05fae18", + "name": "/usr/local/lib/python3.12/dist-packages/dill-0.3.8.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "eb9e3ba668b4c4d6", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvtiff_cu13-0.7.0.79.dist-info/top_level.txt", + "bom-ref": "2fcc636518b8a799", + "name": "/usr/local/lib/python3.12/dist-packages/dllist-2.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f80fad95d5558110", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_resiliency_ext-0.5.0.dist-info/METADATA", + "bom-ref": "ddf7f5ce043dfb34", + "name": "/usr/local/lib/python3.12/dist-packages/dllist-2.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "715c78e6cf8f1187", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_resiliency_ext-0.5.0.dist-info/RECORD", + "bom-ref": "3b5ce1a252cd279b", + "name": "/usr/local/lib/python3.12/dist-packages/dllist-2.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9b20d8af1071e06e", - "name": "/usr/local/lib/python3.12/dist-packages/nvidia_resiliency_ext-0.5.0.dist-info/direct_url.json", + "bom-ref": "f5d54b66b82fbd71", + "name": "/usr/local/lib/python3.12/dist-packages/docstring_parser-0.18.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1bee290fc2526648", - "name": "/usr/local/lib/python3.12/dist-packages/nvtx-0.2.15.dist-info/METADATA", + "bom-ref": "1a49495db2625ebf", + "name": "/usr/local/lib/python3.12/dist-packages/docstring_parser-0.18.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "80b6d8c63a8a17f6", - "name": "/usr/local/lib/python3.12/dist-packages/nvtx-0.2.15.dist-info/RECORD", + "bom-ref": "7a8c27c8b210bc63", + "name": "/usr/local/lib/python3.12/dist-packages/einops-0.8.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "936f039c220c8b0d", - "name": "/usr/local/lib/python3.12/dist-packages/nvtx-0.2.15.dist-info/top_level.txt", + "bom-ref": "69f850f79e0b91fb", + "name": "/usr/local/lib/python3.12/dist-packages/einops-0.8.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1ab2be04ce8969f0", - "name": "/usr/local/lib/python3.12/dist-packages/omegaconf-2.3.0.dist-info/METADATA", + "bom-ref": "607d9282008486df", + "name": "/usr/local/lib/python3.12/dist-packages/etcd_sdk_python-0.0.7.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2a07b9f569269483", - "name": "/usr/local/lib/python3.12/dist-packages/omegaconf-2.3.0.dist-info/RECORD", + "bom-ref": "11c6ca77d0e0d1e0", + "name": "/usr/local/lib/python3.12/dist-packages/etcd_sdk_python-0.0.7.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1a42d99cd94a26af", - "name": "/usr/local/lib/python3.12/dist-packages/omegaconf-2.3.0.dist-info/top_level.txt", + "bom-ref": "031da6bd63a27a7e", + "name": "/usr/local/lib/python3.12/dist-packages/etcd_sdk_python-0.0.7.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "586c2e6944edd67c", - "name": "/usr/local/lib/python3.12/dist-packages/onnx-1.21.0.dist-info/METADATA", + "bom-ref": "bbfcc05002744e64", + "name": "/usr/local/lib/python3.12/dist-packages/evaluate-0.4.6.dist-info/METADATA", "type": "file" }, { - "bom-ref": "07a7ccc641a1eec2", - "name": "/usr/local/lib/python3.12/dist-packages/onnx-1.21.0.dist-info/RECORD", + "bom-ref": "f5814f567ee5bccb", + "name": "/usr/local/lib/python3.12/dist-packages/evaluate-0.4.6.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3b3a4786107fd3dc", - "name": "/usr/local/lib/python3.12/dist-packages/onnx-1.21.0.dist-info/direct_url.json", + "bom-ref": "117a3f8788518d1e", + "name": "/usr/local/lib/python3.12/dist-packages/evaluate-0.4.6.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "64322655015e2c25", - "name": "/usr/local/lib/python3.12/dist-packages/onnx-1.21.0.dist-info/top_level.txt", + "bom-ref": "2fd9a1c28edb9a7e", + "name": "/usr/local/lib/python3.12/dist-packages/executing-2.2.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9c74ce9e53fa2c66", - "name": "/usr/local/lib/python3.12/dist-packages/onnx_ir-0.2.1.dist-info/METADATA", + "bom-ref": "0426c5181454cdb1", + "name": "/usr/local/lib/python3.12/dist-packages/executing-2.2.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "44c9093d419f0535", - "name": "/usr/local/lib/python3.12/dist-packages/onnx_ir-0.2.1.dist-info/RECORD", + "bom-ref": "840108df5c2d1225", + "name": "/usr/local/lib/python3.12/dist-packages/executing-2.2.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "364fbc73089662fe", - "name": "/usr/local/lib/python3.12/dist-packages/onnx_ir-0.2.1.dist-info/top_level.txt", + "bom-ref": "b53b688c1b3b7869", + "name": "/usr/local/lib/python3.12/dist-packages/fastapi-0.141.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "30ea7dcf02c3c677", - "name": "/usr/local/lib/python3.12/dist-packages/onnxscript-0.7.0.dist-info/METADATA", + "bom-ref": "f12d38f00c9e0a2b", + "name": "/usr/local/lib/python3.12/dist-packages/fastapi-0.141.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ef4a34d650a06617", - "name": "/usr/local/lib/python3.12/dist-packages/onnxscript-0.7.0.dist-info/RECORD", + "bom-ref": "b660321ad43cd92f", + "name": "/usr/local/lib/python3.12/dist-packages/fastjsonschema-2.22.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9b754032ff4db403", - "name": "/usr/local/lib/python3.12/dist-packages/onnxscript-0.7.0.dist-info/top_level.txt", + "bom-ref": "2e9a7f2ac3566bff", + "name": "/usr/local/lib/python3.12/dist-packages/fastjsonschema-2.22.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7d9f219b1a113b03", - "name": "/usr/local/lib/python3.12/dist-packages/openai-3.5.0.dist-info/METADATA", + "bom-ref": "01b16d784e7d63a5", + "name": "/usr/local/lib/python3.12/dist-packages/fastjsonschema-2.22.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "548d6dc5ad6a1302", - "name": "/usr/local/lib/python3.12/dist-packages/openai-3.5.0.dist-info/RECORD", + "bom-ref": "07c5e59c3d537a9f", + "name": "/usr/local/lib/python3.12/dist-packages/filelock-3.32.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2bb226386aa7c8fa", - "name": "/usr/local/lib/python3.12/dist-packages/openai_harmony-0.0.4.dist-info/METADATA", + "bom-ref": "e415c68b9dbbcd00", + "name": "/usr/local/lib/python3.12/dist-packages/filelock-3.32.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "581942aa8c456838", - "name": "/usr/local/lib/python3.12/dist-packages/openai_harmony-0.0.4.dist-info/RECORD", + "bom-ref": "1113dc909bcd41b9", + "name": "/usr/local/lib/python3.12/dist-packages/flash_attn-2.7.4.post1+git5231d95fe1.54157505.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a7588096be6f18e7", - "name": "/usr/local/lib/python3.12/dist-packages/optimum-2.3.0.dist-info/METADATA", + "bom-ref": "a4c5e565834e084e", + "name": "/usr/local/lib/python3.12/dist-packages/flash_attn-2.7.4.post1+git5231d95fe1.54157505.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e2779199004eeacd", - "name": "/usr/local/lib/python3.12/dist-packages/optimum-2.3.0.dist-info/RECORD", + "bom-ref": "4da7a499d90b4d32", + "name": "/usr/local/lib/python3.12/dist-packages/flash_attn-2.7.4.post1+git5231d95fe1.54157505.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "f278ab2737ba209b", - "name": "/usr/local/lib/python3.12/dist-packages/optimum-2.3.0.dist-info/top_level.txt", + "bom-ref": "1ae63972bb6d2015", + "name": "/usr/local/lib/python3.12/dist-packages/flash_attn-2.7.4.post1+git5231d95fe1.54157505.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6fee6ee34c7796a4", - "name": "/usr/local/lib/python3.12/dist-packages/optree-0.19.1.dist-info/METADATA", + "bom-ref": "01a38d4dcf4cf85a", + "name": "/usr/local/lib/python3.12/dist-packages/flash_attn_4-4.0.0b19.dist-info/METADATA", "type": "file" }, { - "bom-ref": "33d46d04177e71b8", - "name": "/usr/local/lib/python3.12/dist-packages/optree-0.19.1.dist-info/RECORD", + "bom-ref": "d2d29dd5bb2772c0", + "name": "/usr/local/lib/python3.12/dist-packages/flash_attn_4-4.0.0b19.dist-info/RECORD", "type": "file" }, { - "bom-ref": "804b14699f88f7f8", - "name": "/usr/local/lib/python3.12/dist-packages/optree-0.19.1.dist-info/top_level.txt", + "bom-ref": "78b5fa7573a2807d", + "name": "/usr/local/lib/python3.12/dist-packages/flash_attn_4-4.0.0b19.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0a575ad7bf90615c", - "name": "/usr/local/lib/python3.12/dist-packages/ordered_set-4.1.0.dist-info/METADATA", + "bom-ref": "edc89963d1e6abea", + "name": "/usr/local/lib/python3.12/dist-packages/flashinfer_python-0.6.18.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0a849d6ae9b3aa5f", - "name": "/usr/local/lib/python3.12/dist-packages/ordered_set-4.1.0.dist-info/RECORD", + "bom-ref": "2be43aa9d561b881", + "name": "/usr/local/lib/python3.12/dist-packages/flashinfer_python-0.6.18.dist-info/RECORD", "type": "file" }, { - "bom-ref": "079f98424abe8235", - "name": "/usr/local/lib/python3.12/dist-packages/overrides-7.7.0.dist-info/METADATA", + "bom-ref": "084d38134a50137a", + "name": "/usr/local/lib/python3.12/dist-packages/flashinfer_python-0.6.18.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "3b7c31ec24e38dcc", - "name": "/usr/local/lib/python3.12/dist-packages/overrides-7.7.0.dist-info/RECORD", + "bom-ref": "08a8f06fdb9b9754", + "name": "/usr/local/lib/python3.12/dist-packages/fonttools-4.63.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f1ac1ac3177dc75c", - "name": "/usr/local/lib/python3.12/dist-packages/overrides-7.7.0.dist-info/top_level.txt", + "bom-ref": "03f318fe392fa240", + "name": "/usr/local/lib/python3.12/dist-packages/fonttools-4.63.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3b4bd69d22bf656d", - "name": "/usr/local/lib/python3.12/dist-packages/packaging-26.0.dist-info/METADATA", + "bom-ref": "ceea1f4fd24a36b1", + "name": "/usr/local/lib/python3.12/dist-packages/fonttools-4.63.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b286687bfa2c2326", - "name": "/usr/local/lib/python3.12/dist-packages/packaging-26.0.dist-info/RECORD", + "bom-ref": "02b9d2ed0434fd5f", + "name": "/usr/local/lib/python3.12/dist-packages/fqdn-1.5.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "f511809566e411a5", - "name": "/usr/local/lib/python3.12/dist-packages/pandas-3.0.2.dist-info/METADATA", + "bom-ref": "b67f5a1fb8102470", + "name": "/usr/local/lib/python3.12/dist-packages/fqdn-1.5.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d84b0e70d0e841bf", - "name": "/usr/local/lib/python3.12/dist-packages/pandas-3.0.2.dist-info/RECORD", + "bom-ref": "affab5675cb385b5", + "name": "/usr/local/lib/python3.12/dist-packages/fqdn-1.5.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e7d536edefecf1cc", - "name": "/usr/local/lib/python3.12/dist-packages/pandocfilters-1.5.1.dist-info/METADATA", + "bom-ref": "2855107ce04f181e", + "name": "/usr/local/lib/python3.12/dist-packages/frozenlist-1.8.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "83b7375473fc61bd", - "name": "/usr/local/lib/python3.12/dist-packages/pandocfilters-1.5.1.dist-info/RECORD", + "bom-ref": "de9d857d42f199cd", + "name": "/usr/local/lib/python3.12/dist-packages/frozenlist-1.8.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6380d72407749919", - "name": "/usr/local/lib/python3.12/dist-packages/pandocfilters-1.5.1.dist-info/top_level.txt", + "bom-ref": "1f37eb46de79c29d", + "name": "/usr/local/lib/python3.12/dist-packages/frozenlist-1.8.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "7606a11109c3fd46", - "name": "/usr/local/lib/python3.12/dist-packages/parso-0.8.7.dist-info/METADATA", + "bom-ref": "efecc5101fa57685", + "name": "/usr/local/lib/python3.12/dist-packages/fsspec-2024.9.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3e754ea92fbac376", - "name": "/usr/local/lib/python3.12/dist-packages/parso-0.8.7.dist-info/RECORD", + "bom-ref": "e48c0fc3ef692f3a", + "name": "/usr/local/lib/python3.12/dist-packages/fsspec-2024.9.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f8867b74c018f78a", - "name": "/usr/local/lib/python3.12/dist-packages/parso-0.8.7.dist-info/top_level.txt", + "bom-ref": "08b70fff3255eaff", + "name": "/usr/local/lib/python3.12/dist-packages/ftfy-6.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5666235fdfffa53b", - "name": "/usr/local/lib/python3.12/dist-packages/partial_json_parser-0.2.1.1.post7.dist-info/METADATA", + "bom-ref": "8bbb77d98f3b6763", + "name": "/usr/local/lib/python3.12/dist-packages/ftfy-6.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "aa3e1af60b6a86a7", - "name": "/usr/local/lib/python3.12/dist-packages/partial_json_parser-0.2.1.1.post7.dist-info/RECORD", + "bom-ref": "b9fcb3ce7fd6cdd2", + "name": "/usr/local/lib/python3.12/dist-packages/gast-0.7.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a2d7f01ac33fd0bf", - "name": "/usr/local/lib/python3.12/dist-packages/patchelf-0.19.1.0.dist-info/METADATA", + "bom-ref": "9aeec8eb4155409a", + "name": "/usr/local/lib/python3.12/dist-packages/gast-0.7.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f23668443e7d0cab", - "name": "/usr/local/lib/python3.12/dist-packages/patchelf-0.19.1.0.dist-info/RECORD", + "bom-ref": "5d04fff180358b43", + "name": "/usr/local/lib/python3.12/dist-packages/gast-0.7.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0659477483437ee5", - "name": "/usr/local/lib/python3.12/dist-packages/pathspec-1.1.1.dist-info/METADATA", + "bom-ref": "e5eb0cd9d20d372e", + "name": "/usr/local/lib/python3.12/dist-packages/gitdb-4.0.12.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6686589b21df0f9d", - "name": "/usr/local/lib/python3.12/dist-packages/pathspec-1.1.1.dist-info/RECORD", + "bom-ref": "7fadbf9b346458ab", + "name": "/usr/local/lib/python3.12/dist-packages/gitdb-4.0.12.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8ae1ae2e44e45f3e", - "name": "/usr/local/lib/python3.12/dist-packages/peft-0.18.1.dist-info/METADATA", + "bom-ref": "fd1e5197717efdca", + "name": "/usr/local/lib/python3.12/dist-packages/gitdb-4.0.12.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1e78f7d6809983bf", - "name": "/usr/local/lib/python3.12/dist-packages/peft-0.18.1.dist-info/RECORD", + "bom-ref": "9fc3ca27484930b5", + "name": "/usr/local/lib/python3.12/dist-packages/gitpython-3.1.62.dist-info/METADATA", "type": "file" }, { - "bom-ref": "df5bc48d78d481aa", - "name": "/usr/local/lib/python3.12/dist-packages/peft-0.18.1.dist-info/top_level.txt", + "bom-ref": "644bbbc7857d5286", + "name": "/usr/local/lib/python3.12/dist-packages/gitpython-3.1.62.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8ac7a5612994da94", - "name": "/usr/local/lib/python3.12/dist-packages/pexpect-4.9.0.dist-info/METADATA", + "bom-ref": "aa4389917236c49e", + "name": "/usr/local/lib/python3.12/dist-packages/gitpython-3.1.62.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "569c3e99b6eff4d5", - "name": "/usr/local/lib/python3.12/dist-packages/pexpect-4.9.0.dist-info/RECORD", + "bom-ref": "7e220e5953ede2cb", + "name": "/usr/local/lib/python3.12/dist-packages/google_api_core-2.36.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "792ec9b2242c7360", - "name": "/usr/local/lib/python3.12/dist-packages/pexpect-4.9.0.dist-info/top_level.txt", + "bom-ref": "fe6b68cf217805b2", + "name": "/usr/local/lib/python3.12/dist-packages/google_api_core-2.36.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "18c4588d0084e476", - "name": "/usr/local/lib/python3.12/dist-packages/pillow-12.3.0.dist-info/METADATA", + "bom-ref": "d1248285da1b2e6e", + "name": "/usr/local/lib/python3.12/dist-packages/google_api_core-2.36.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9b9028bc36297fbf", - "name": "/usr/local/lib/python3.12/dist-packages/pillow-12.3.0.dist-info/RECORD", + "bom-ref": "cecef3a8ab0b6525", + "name": "/usr/local/lib/python3.12/dist-packages/google_auth-2.58.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1af1b8e037d9100e", - "name": "/usr/local/lib/python3.12/dist-packages/pillow-12.3.0.dist-info/top_level.txt", + "bom-ref": "ff26cfc16f8ec200", + "name": "/usr/local/lib/python3.12/dist-packages/google_auth-2.58.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "68e8dfe4df539be0", - "name": "/usr/local/lib/python3.12/dist-packages/pip-26.1.1.dist-info/METADATA", + "bom-ref": "023595b16ec830d8", + "name": "/usr/local/lib/python3.12/dist-packages/google_auth-2.58.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "97f4e77ba641de22", - "name": "/usr/local/lib/python3.12/dist-packages/pip-26.1.1.dist-info/RECORD", + "bom-ref": "72a0a9b0b68a5521", + "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_core-2.7.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c9ed221c50e6f7c0", - "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/t32.exe", + "bom-ref": "6e1631d84d5e0cd8", + "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_core-2.7.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d8c709b0887bf368", - "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/t64-arm.exe", + "bom-ref": "f8c084c75ac87dd2", + "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_core-2.7.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1f6b86749a2e8df0", - "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/t64.exe", + "bom-ref": "896207555df503f7", + "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_storage-3.14.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0a177ed1fd50bdc7", - "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/w32.exe", + "bom-ref": "86806a3931d97f03", + "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_storage-3.14.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c6b9a02c1accc980", - "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/w64-arm.exe", + "bom-ref": "60d638ee29834cca", + "name": "/usr/local/lib/python3.12/dist-packages/google_cloud_storage-3.14.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d0e8921adef57d9e", - "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/w64.exe", + "bom-ref": "b2db49d7ec0ce574", + "name": "/usr/local/lib/python3.12/dist-packages/google_crc32c-1.8.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "09c9151ea8bd5372", - "name": "/usr/local/lib/python3.12/dist-packages/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/PKG-INFO", + "bom-ref": "31af99f1c95c9698", + "name": "/usr/local/lib/python3.12/dist-packages/google_crc32c-1.8.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b8dfaf5ec08901b8", - "name": "/usr/local/lib/python3.12/dist-packages/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/top_level.txt", + "bom-ref": "5bae12715c2caecb", + "name": "/usr/local/lib/python3.12/dist-packages/google_crc32c-1.8.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "986e3046efd958ff", - "name": "/usr/local/lib/python3.12/dist-packages/platformdirs-4.9.6.dist-info/METADATA", + "bom-ref": "4ae7dbe261367b6e", + "name": "/usr/local/lib/python3.12/dist-packages/google_resumable_media-2.10.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "dcb97355e58ea7fd", - "name": "/usr/local/lib/python3.12/dist-packages/platformdirs-4.9.6.dist-info/RECORD", + "bom-ref": "8f37f09a793e9ee1", + "name": "/usr/local/lib/python3.12/dist-packages/google_resumable_media-2.10.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "47cebf448f944db4", - "name": "/usr/local/lib/python3.12/dist-packages/plotly-7.0.0.dist-info/METADATA", + "bom-ref": "d732726a8bb1ff7f", + "name": "/usr/local/lib/python3.12/dist-packages/google_resumable_media-2.10.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "342bf625851a59d2", - "name": "/usr/local/lib/python3.12/dist-packages/plotly-7.0.0.dist-info/RECORD", + "bom-ref": "2f9e6b208282d091", + "name": "/usr/local/lib/python3.12/dist-packages/googleapis_common_protos-1.75.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d5de75ff13d72e66", - "name": "/usr/local/lib/python3.12/dist-packages/plotly/labextension/package.json", + "bom-ref": "9baaf316f94e8329", + "name": "/usr/local/lib/python3.12/dist-packages/googleapis_common_protos-1.75.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "93831f0ae857a39b", - "name": "/usr/local/lib/python3.12/dist-packages/polygraphy-0.49.26.dist-info/METADATA", + "bom-ref": "451a40fedb6f4a2b", + "name": "/usr/local/lib/python3.12/dist-packages/googleapis_common_protos-1.75.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "d10362a7f0e7524f", - "name": "/usr/local/lib/python3.12/dist-packages/polygraphy-0.49.26.dist-info/RECORD", + "bom-ref": "d7ca7f2b0e56cd83", + "name": "/usr/local/lib/python3.12/dist-packages/graphviz-0.21.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6c6fcf27f931d21e", - "name": "/usr/local/lib/python3.12/dist-packages/polygraphy-0.49.26.dist-info/top_level.txt", + "bom-ref": "0250802c5770de4c", + "name": "/usr/local/lib/python3.12/dist-packages/graphviz-0.21.dist-info/RECORD", "type": "file" }, { - "bom-ref": "76a06455801adc40", - "name": "/usr/local/lib/python3.12/dist-packages/pooch-1.9.0.dist-info/METADATA", + "bom-ref": "cffadb3697e5df26", + "name": "/usr/local/lib/python3.12/dist-packages/graphviz-0.21.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e919673ec081348a", - "name": "/usr/local/lib/python3.12/dist-packages/pooch-1.9.0.dist-info/RECORD", + "bom-ref": "db58e0ef88448745", + "name": "/usr/local/lib/python3.12/dist-packages/grpcio-1.83.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c5622b198dbfa312", - "name": "/usr/local/lib/python3.12/dist-packages/pooch-1.9.0.dist-info/top_level.txt", + "bom-ref": "95528cc51fd08d43", + "name": "/usr/local/lib/python3.12/dist-packages/grpcio-1.83.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "af8ddf9c9166aacb", - "name": "/usr/local/lib/python3.12/dist-packages/prometheus_client-0.25.0.dist-info/METADATA", + "bom-ref": "c37a059b01e3d44f", + "name": "/usr/local/lib/python3.12/dist-packages/grpcio-1.83.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "58df70c02b4c7d10", - "name": "/usr/local/lib/python3.12/dist-packages/prometheus_client-0.25.0.dist-info/RECORD", + "bom-ref": "2623984fbe031e67", + "name": "/usr/local/lib/python3.12/dist-packages/grpcio_tools-1.81.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1e0cdbfb52e86151", - "name": "/usr/local/lib/python3.12/dist-packages/prometheus_client-0.25.0.dist-info/top_level.txt", + "bom-ref": "87c79a5a01edb7eb", + "name": "/usr/local/lib/python3.12/dist-packages/grpcio_tools-1.81.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "bbd2fcab02f844e7", - "name": "/usr/local/lib/python3.12/dist-packages/prometheus_fastapi_instrumentator-7.1.0.dist-info/METADATA", + "bom-ref": "d1765e38667d3d25", + "name": "/usr/local/lib/python3.12/dist-packages/grpcio_tools-1.81.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0a2cd4e558a938ce", - "name": "/usr/local/lib/python3.12/dist-packages/prometheus_fastapi_instrumentator-7.1.0.dist-info/RECORD", + "bom-ref": "90142ffee2311ae5", + "name": "/usr/local/lib/python3.12/dist-packages/h11-0.16.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c6a0eff6f55ba11e", - "name": "/usr/local/lib/python3.12/dist-packages/prompt_toolkit-3.0.52.dist-info/METADATA", + "bom-ref": "b24c0235c9a22cd0", + "name": "/usr/local/lib/python3.12/dist-packages/h11-0.16.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "17e9598a1d0da59c", - "name": "/usr/local/lib/python3.12/dist-packages/prompt_toolkit-3.0.52.dist-info/RECORD", + "bom-ref": "1d151d9d67395de4", + "name": "/usr/local/lib/python3.12/dist-packages/h11-0.16.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "82579ce1526724de", - "name": "/usr/local/lib/python3.12/dist-packages/prompt_toolkit-3.0.52.dist-info/top_level.txt", + "bom-ref": "33646b4f0188b883", + "name": "/usr/local/lib/python3.12/dist-packages/h5py-3.12.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "71db24be5e5f53c9", - "name": "/usr/local/lib/python3.12/dist-packages/propcache-0.4.1.dist-info/METADATA", + "bom-ref": "604a1e19b635c775", + "name": "/usr/local/lib/python3.12/dist-packages/h5py-3.12.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a9f4ec7fbfadd8b5", - "name": "/usr/local/lib/python3.12/dist-packages/propcache-0.4.1.dist-info/RECORD", + "bom-ref": "f3b4795534963ee0", + "name": "/usr/local/lib/python3.12/dist-packages/h5py-3.12.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "62622921919ec267", - "name": "/usr/local/lib/python3.12/dist-packages/propcache-0.4.1.dist-info/top_level.txt", + "bom-ref": "e577cd54c6958812", + "name": "/usr/local/lib/python3.12/dist-packages/hf_xet-1.6.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "51cc5e4e95606d51", - "name": "/usr/local/lib/python3.12/dist-packages/proto_plus-1.28.4.dist-info/METADATA", + "bom-ref": "4b518a27f9a0bebb", + "name": "/usr/local/lib/python3.12/dist-packages/hf_xet-1.6.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d28b49e0ffc95732", - "name": "/usr/local/lib/python3.12/dist-packages/proto_plus-1.28.4.dist-info/RECORD", + "bom-ref": "75e11415645bd25b", + "name": "/usr/local/lib/python3.12/dist-packages/httpcore-1.0.9.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6e33a952ca2f20e3", - "name": "/usr/local/lib/python3.12/dist-packages/proto_plus-1.28.4.dist-info/top_level.txt", + "bom-ref": "d823daa78c9290fa", + "name": "/usr/local/lib/python3.12/dist-packages/httpcore-1.0.9.dist-info/RECORD", "type": "file" }, { - "bom-ref": "fb2ca85f6880c4b8", - "name": "/usr/local/lib/python3.12/dist-packages/protobuf-6.33.6.dist-info/METADATA", + "bom-ref": "fefe8b74507b8e6d", + "name": "/usr/local/lib/python3.12/dist-packages/httpcore2-2.12.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "74cfbb5f9ace2f9e", - "name": "/usr/local/lib/python3.12/dist-packages/protobuf-6.33.6.dist-info/RECORD", + "bom-ref": "1d3bdc8514d4e6ae", + "name": "/usr/local/lib/python3.12/dist-packages/httpcore2-2.12.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "fd1ae9b27cc41788", - "name": "/usr/local/lib/python3.12/dist-packages/psutil-7.2.2.dist-info/METADATA", + "bom-ref": "45da5d2fdbcb87ab", + "name": "/usr/local/lib/python3.12/dist-packages/httpx-0.28.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "64da4a40eae67163", - "name": "/usr/local/lib/python3.12/dist-packages/psutil-7.2.2.dist-info/RECORD", + "bom-ref": "a353334fba09c235", + "name": "/usr/local/lib/python3.12/dist-packages/httpx-0.28.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c10a3a2067feb6fa", - "name": "/usr/local/lib/python3.12/dist-packages/psutil-7.2.2.dist-info/top_level.txt", + "bom-ref": "88c7d210d6308883", + "name": "/usr/local/lib/python3.12/dist-packages/httpx2-2.12.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c112937eda296ed7", - "name": "/usr/local/lib/python3.12/dist-packages/ptyprocess-0.7.0.dist-info/METADATA", + "bom-ref": "b394e0a6e992cef5", + "name": "/usr/local/lib/python3.12/dist-packages/httpx2-2.12.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "01dd5a58f725b5c3", - "name": "/usr/local/lib/python3.12/dist-packages/ptyprocess-0.7.0.dist-info/RECORD", + "bom-ref": "2f9e662005b5dfd6", + "name": "/usr/local/lib/python3.12/dist-packages/httpx_sse-0.4.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4c1edd0470a3816e", - "name": "/usr/local/lib/python3.12/dist-packages/pulp-3.3.1.dist-info/METADATA", + "bom-ref": "87e06deaef1de4d7", + "name": "/usr/local/lib/python3.12/dist-packages/httpx_sse-0.4.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6579554d6554f555", - "name": "/usr/local/lib/python3.12/dist-packages/pulp-3.3.1.dist-info/RECORD", + "bom-ref": "88f3f3ad916ffc46", + "name": "/usr/local/lib/python3.12/dist-packages/httpx_sse-0.4.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e41aa9a3af146b9a", - "name": "/usr/local/lib/python3.12/dist-packages/pulp-3.3.1.dist-info/top_level.txt", + "bom-ref": "c1ded9c7672925b0", + "name": "/usr/local/lib/python3.12/dist-packages/huggingface_hub-1.28.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c36b7b03c666b86c", - "name": "/usr/local/lib/python3.12/dist-packages/pulp/solverdir/cbc/win/i32/cbc.exe", + "bom-ref": "5f643c26e85c26ec", + "name": "/usr/local/lib/python3.12/dist-packages/huggingface_hub-1.28.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "afcce37cbea21e40", - "name": "/usr/local/lib/python3.12/dist-packages/pulp/solverdir/cbc/win/i64/cbc.exe", + "bom-ref": "9a6f50aa6becf415", + "name": "/usr/local/lib/python3.12/dist-packages/huggingface_hub-1.28.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "233c19f6bad71938", - "name": "/usr/local/lib/python3.12/dist-packages/pure_eval-0.2.3.dist-info/METADATA", + "bom-ref": "b3acecf634aa01fb", + "name": "/usr/local/lib/python3.12/dist-packages/humanize-4.16.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c9e91f9f34cd6dbb", - "name": "/usr/local/lib/python3.12/dist-packages/pure_eval-0.2.3.dist-info/RECORD", + "bom-ref": "67bada869de963bf", + "name": "/usr/local/lib/python3.12/dist-packages/humanize-4.16.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "03c19bda3bd9d521", - "name": "/usr/local/lib/python3.12/dist-packages/pure_eval-0.2.3.dist-info/top_level.txt", + "bom-ref": "a9e0708bdae5122d", + "name": "/usr/local/lib/python3.12/dist-packages/idna-3.19.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3696e7ed67437f8d", - "name": "/usr/local/lib/python3.12/dist-packages/pyarrow-24.0.0.dist-info/METADATA", + "bom-ref": "d44d46c653784c73", + "name": "/usr/local/lib/python3.12/dist-packages/idna-3.19.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2f7e587186fda029", - "name": "/usr/local/lib/python3.12/dist-packages/pyarrow-24.0.0.dist-info/RECORD", + "bom-ref": "eba26fc32298c815", + "name": "/usr/local/lib/python3.12/dist-packages/immutabledict-4.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "69796580ed497e64", - "name": "/usr/local/lib/python3.12/dist-packages/pyasn1-0.6.4.dist-info/METADATA", + "bom-ref": "e25b0ff1174ee723", + "name": "/usr/local/lib/python3.12/dist-packages/immutabledict-4.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "440ecd372be9923c", - "name": "/usr/local/lib/python3.12/dist-packages/pyasn1-0.6.4.dist-info/RECORD", + "bom-ref": "1a0b13cfa86a4f4f", + "name": "/usr/local/lib/python3.12/dist-packages/importlib_metadata-9.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4c8f399b3148f07f", - "name": "/usr/local/lib/python3.12/dist-packages/pyasn1-0.6.4.dist-info/top_level.txt", + "bom-ref": "916af3f8dd296cd3", + "name": "/usr/local/lib/python3.12/dist-packages/importlib_metadata-9.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d2438f7d00d781ca", - "name": "/usr/local/lib/python3.12/dist-packages/pyasn1_modules-0.4.2.dist-info/METADATA", + "bom-ref": "1c2d01b0245ce531", + "name": "/usr/local/lib/python3.12/dist-packages/importlib_metadata-9.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "a47afb7f17702dbb", - "name": "/usr/local/lib/python3.12/dist-packages/pyasn1_modules-0.4.2.dist-info/RECORD", + "bom-ref": "d6cee227ad4eb76e", + "name": "/usr/local/lib/python3.12/dist-packages/intel_openmp-2021.4.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "714401d61c63a0d6", - "name": "/usr/local/lib/python3.12/dist-packages/pyasn1_modules-0.4.2.dist-info/top_level.txt", + "bom-ref": "a456ac88b192b06c", + "name": "/usr/local/lib/python3.12/dist-packages/intel_openmp-2021.4.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "270782034ff74ab5", - "name": "/usr/local/lib/python3.12/dist-packages/pybind11-3.0.4.dist-info/METADATA", + "bom-ref": "3d08f7f43ed4467f", + "name": "/usr/local/lib/python3.12/dist-packages/intel_openmp-2021.4.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "bb501edc0d872e67", - "name": "/usr/local/lib/python3.12/dist-packages/pybind11-3.0.4.dist-info/RECORD", + "bom-ref": "2689697d71f0d265", + "name": "/usr/local/lib/python3.12/dist-packages/ipykernel-7.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bbaa69384b707c17", - "name": "/usr/local/lib/python3.12/dist-packages/pybind11_global-3.0.4.dist-info/METADATA", + "bom-ref": "02af4fa82be7d37d", + "name": "/usr/local/lib/python3.12/dist-packages/ipykernel-7.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f02873203f7d5864", - "name": "/usr/local/lib/python3.12/dist-packages/pybind11_global-3.0.4.dist-info/RECORD", + "bom-ref": "57634b73e3537837", + "name": "/usr/local/lib/python3.12/dist-packages/ipython-9.16.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "29023b8310d2952f", - "name": "/usr/local/lib/python3.12/dist-packages/pycocotools-2.0+nv0.8.1.dist-info/METADATA", + "bom-ref": "bbb00c1e94687e97", + "name": "/usr/local/lib/python3.12/dist-packages/ipython-9.16.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f54cf84848c53cfd", - "name": "/usr/local/lib/python3.12/dist-packages/pycocotools-2.0+nv0.8.1.dist-info/RECORD", + "bom-ref": "acd3cbefeb9cbbdd", + "name": "/usr/local/lib/python3.12/dist-packages/ipython-9.16.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "62053bce97ec9935", - "name": "/usr/local/lib/python3.12/dist-packages/pycocotools-2.0+nv0.8.1.dist-info/direct_url.json", + "bom-ref": "be9e5b147805cbb4", + "name": "/usr/local/lib/python3.12/dist-packages/ipython_pygments_lexers-1.1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "45db75b85c9a098c", - "name": "/usr/local/lib/python3.12/dist-packages/pycocotools-2.0+nv0.8.1.dist-info/top_level.txt", + "bom-ref": "4b38e6d58cd5f081", + "name": "/usr/local/lib/python3.12/dist-packages/ipython_pygments_lexers-1.1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e76e72f1cf75d8bb", - "name": "/usr/local/lib/python3.12/dist-packages/pycountry-26.2.16.dist-info/METADATA", + "bom-ref": "7e2dbca53717fc39", + "name": "/usr/local/lib/python3.12/dist-packages/isodate-0.7.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8da5d277db990a16", - "name": "/usr/local/lib/python3.12/dist-packages/pycountry-26.2.16.dist-info/RECORD", + "bom-ref": "ae75810914926676", + "name": "/usr/local/lib/python3.12/dist-packages/isodate-0.7.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "10a9742fff8b3f2b", - "name": "/usr/local/lib/python3.12/dist-packages/pycparser-3.0.dist-info/METADATA", + "bom-ref": "aac337d98de023f4", + "name": "/usr/local/lib/python3.12/dist-packages/isodate-0.7.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b0f63ff4e5e45227", - "name": "/usr/local/lib/python3.12/dist-packages/pycparser-3.0.dist-info/RECORD", + "bom-ref": "e8e06b784009536d", + "name": "/usr/local/lib/python3.12/dist-packages/isoduration-20.11.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1a7b5e7c542df324", - "name": "/usr/local/lib/python3.12/dist-packages/pycparser-3.0.dist-info/top_level.txt", + "bom-ref": "89ef0fe366c61c40", + "name": "/usr/local/lib/python3.12/dist-packages/isoduration-20.11.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "59942e15deae5167", - "name": "/usr/local/lib/python3.12/dist-packages/pycryptodomex-3.23.0.dist-info/METADATA", + "bom-ref": "b54c0d3cebedd4e4", + "name": "/usr/local/lib/python3.12/dist-packages/isoduration-20.11.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9883591d7311bdc2", - "name": "/usr/local/lib/python3.12/dist-packages/pycryptodomex-3.23.0.dist-info/RECORD", + "bom-ref": "2fef8e842b26344a", + "name": "/usr/local/lib/python3.12/dist-packages/isort-8.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "38a2eda64a48597a", - "name": "/usr/local/lib/python3.12/dist-packages/pycryptodomex-3.23.0.dist-info/top_level.txt", + "bom-ref": "56db6765bbd2fbea", + "name": "/usr/local/lib/python3.12/dist-packages/isort-8.0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9a438eb7c9ca06cc", - "name": "/usr/local/lib/python3.12/dist-packages/pydantic-2.13.4.dist-info/METADATA", + "bom-ref": "7f0af7ae29139c4f", + "name": "/usr/local/lib/python3.12/dist-packages/jedi-0.20.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "9cbb5a8c3110d6bb", - "name": "/usr/local/lib/python3.12/dist-packages/pydantic-2.13.4.dist-info/RECORD", + "bom-ref": "f21370804124448c", + "name": "/usr/local/lib/python3.12/dist-packages/jedi-0.20.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cbc49664048f13ed", - "name": "/usr/local/lib/python3.12/dist-packages/pydantic_core-2.46.4.dist-info/METADATA", + "bom-ref": "8202227c55fc1ef5", + "name": "/usr/local/lib/python3.12/dist-packages/jedi-0.20.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "17e44436fdc6b23b", - "name": "/usr/local/lib/python3.12/dist-packages/pydantic_core-2.46.4.dist-info/RECORD", + "bom-ref": "c83da4796ea76224", + "name": "/usr/local/lib/python3.12/dist-packages/jinja2-3.1.6.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bf78feb5b3d398f0", - "name": "/usr/local/lib/python3.12/dist-packages/pydantic_extra_types-2.11.1.dist-info/METADATA", + "bom-ref": "9c9b97c0ccc31377", + "name": "/usr/local/lib/python3.12/dist-packages/jinja2-3.1.6.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dda54e9cbf61a27b", - "name": "/usr/local/lib/python3.12/dist-packages/pydantic_extra_types-2.11.1.dist-info/RECORD", + "bom-ref": "defdcae7b683124d", + "name": "/usr/local/lib/python3.12/dist-packages/jiter-0.17.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ea45c2252c238f2b", - "name": "/usr/local/lib/python3.12/dist-packages/pydantic_settings-2.15.0.dist-info/METADATA", + "bom-ref": "03ab4d18bf72e52c", + "name": "/usr/local/lib/python3.12/dist-packages/jiter-0.17.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "810b80795a3088ef", - "name": "/usr/local/lib/python3.12/dist-packages/pydantic_settings-2.15.0.dist-info/RECORD", + "bom-ref": "277355308943e7ae", + "name": "/usr/local/lib/python3.12/dist-packages/jmespath-1.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "29e869ecc5c72b3b", - "name": "/usr/local/lib/python3.12/dist-packages/pygments-2.21.0.dist-info/METADATA", + "bom-ref": "dc7b9a117d2f919c", + "name": "/usr/local/lib/python3.12/dist-packages/jmespath-1.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8bbeb6044f47e193", - "name": "/usr/local/lib/python3.12/dist-packages/pygments-2.21.0.dist-info/RECORD", + "bom-ref": "189f0195cff09f0c", + "name": "/usr/local/lib/python3.12/dist-packages/jmespath-1.1.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "23c6a5f1cb6946a0", - "name": "/usr/local/lib/python3.12/dist-packages/pyjwt-2.13.0.dist-info/METADATA", + "bom-ref": "97a5e52f5599b182", + "name": "/usr/local/lib/python3.12/dist-packages/joblib-1.6.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "128c3c44244a9e0a", - "name": "/usr/local/lib/python3.12/dist-packages/pyjwt-2.13.0.dist-info/RECORD", + "bom-ref": "a2743fcc8ced3cba", + "name": "/usr/local/lib/python3.12/dist-packages/joblib-1.6.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5af323577c53fdef", - "name": "/usr/local/lib/python3.12/dist-packages/pyjwt-2.13.0.dist-info/top_level.txt", + "bom-ref": "fff861d893b866a3", + "name": "/usr/local/lib/python3.12/dist-packages/joblib-1.6.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "58b71d62cdd91a4f", - "name": "/usr/local/lib/python3.12/dist-packages/pynvvideocodec-2.1.0.dist-info/METADATA", + "bom-ref": "f426419c4407a799", + "name": "/usr/local/lib/python3.12/dist-packages/json5-0.15.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "343acb9544aa7d5f", - "name": "/usr/local/lib/python3.12/dist-packages/pynvvideocodec-2.1.0.dist-info/RECORD", + "bom-ref": "4cffebe3f2b6b46d", + "name": "/usr/local/lib/python3.12/dist-packages/json5-0.15.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8e47b313e4a4b86c", - "name": "/usr/local/lib/python3.12/dist-packages/pynvvideocodec-2.1.0.dist-info/top_level.txt", + "bom-ref": "a3ec95a87d56b035", + "name": "/usr/local/lib/python3.12/dist-packages/json5-0.15.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "2c2aaaf7857fe1aa", - "name": "/usr/local/lib/python3.12/dist-packages/pyparsing-3.3.2.dist-info/METADATA", + "bom-ref": "00ed286dd6087d7d", + "name": "/usr/local/lib/python3.12/dist-packages/jsonpointer-3.1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5c2c6e61a109f4be", - "name": "/usr/local/lib/python3.12/dist-packages/pyparsing-3.3.2.dist-info/RECORD", + "bom-ref": "27908c940ab5b1ed", + "name": "/usr/local/lib/python3.12/dist-packages/jsonpointer-3.1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9e8102fd1dbcf739", - "name": "/usr/local/lib/python3.12/dist-packages/pyproject_hooks-1.2.0.dist-info/METADATA", + "bom-ref": "306a45c10eeee5b1", + "name": "/usr/local/lib/python3.12/dist-packages/jsonpointer-3.1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "957b046e8674b6e9", - "name": "/usr/local/lib/python3.12/dist-packages/pyproject_hooks-1.2.0.dist-info/RECORD", + "bom-ref": "123d745df7a6e2d1", + "name": "/usr/local/lib/python3.12/dist-packages/jsonschema-4.26.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a23c72f1638cb799", - "name": "/usr/local/lib/python3.12/dist-packages/python_dateutil-2.9.0.post0.dist-info/METADATA", + "bom-ref": "d5c40b3e1d878bd4", + "name": "/usr/local/lib/python3.12/dist-packages/jsonschema-4.26.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9be6d22701ad6746", - "name": "/usr/local/lib/python3.12/dist-packages/python_dateutil-2.9.0.post0.dist-info/RECORD", + "bom-ref": "7d9468383666e3a2", + "name": "/usr/local/lib/python3.12/dist-packages/jsonschema_specifications-2025.9.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "59baac70718dd262", - "name": "/usr/local/lib/python3.12/dist-packages/python_dateutil-2.9.0.post0.dist-info/top_level.txt", + "bom-ref": "c2c871982509bd5d", + "name": "/usr/local/lib/python3.12/dist-packages/jsonschema_specifications-2025.9.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "128a5d11a4a949c9", - "name": "/usr/local/lib/python3.12/dist-packages/python_dotenv-1.2.3.dist-info/METADATA", + "bom-ref": "ed4869586ef95c23", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_builder-1.2.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c3e791932fc83cd9", - "name": "/usr/local/lib/python3.12/dist-packages/python_dotenv-1.2.3.dist-info/RECORD", + "bom-ref": "512d8ab98008955a", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_builder-1.2.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5396526d04695d01", - "name": "/usr/local/lib/python3.12/dist-packages/python_dotenv-1.2.3.dist-info/top_level.txt", + "bom-ref": "5d8a816a492b8ea0", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_client-8.9.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "443de8a6ec25556d", - "name": "/usr/local/lib/python3.12/dist-packages/python_hostlist-2.3.0.dist-info/METADATA", + "bom-ref": "283e009703053238", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_client-8.9.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "55db62b0bddb0852", - "name": "/usr/local/lib/python3.12/dist-packages/python_hostlist-2.3.0.dist-info/RECORD", + "bom-ref": "0f15cec966978105", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_core-5.9.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5e9f2551373e1f4e", - "name": "/usr/local/lib/python3.12/dist-packages/python_hostlist-2.3.0.dist-info/top_level.txt", + "bom-ref": "d3ef8723bd255050", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_core-5.9.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b957735d96015d9c", - "name": "/usr/local/lib/python3.12/dist-packages/python_json_logger-4.1.0.dist-info/METADATA", + "bom-ref": "034213e3d92593c3", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_events-0.12.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "964f029469e6727c", - "name": "/usr/local/lib/python3.12/dist-packages/python_json_logger-4.1.0.dist-info/RECORD", + "bom-ref": "9ab90c0cfaa558cf", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_events-0.12.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cf715015ea3f25c5", - "name": "/usr/local/lib/python3.12/dist-packages/python_json_logger-4.1.0.dist-info/top_level.txt", + "bom-ref": "d0aae065b0b30b27", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_lsp-2.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cae2e133eb1ed057", - "name": "/usr/local/lib/python3.12/dist-packages/python_multipart-0.0.32.dist-info/METADATA", + "bom-ref": "f6d1611f18822bbe", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_lsp-2.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "72237a1da49f47be", - "name": "/usr/local/lib/python3.12/dist-packages/python_multipart-0.0.32.dist-info/RECORD", + "bom-ref": "d7eb576bf5b31aed", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_lsp-2.3.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "5269930b1fab645b", - "name": "/usr/local/lib/python3.12/dist-packages/pytokens-0.4.1.dist-info/METADATA", + "bom-ref": "ea3e0cf0e562db6b", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_server-2.20.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cecc6e486a1bdb38", - "name": "/usr/local/lib/python3.12/dist-packages/pytokens-0.4.1.dist-info/RECORD", + "bom-ref": "aeadb1a9ce0bd479", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_server-2.20.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9d71fb0e0b5c813f", - "name": "/usr/local/lib/python3.12/dist-packages/pytokens-0.4.1.dist-info/top_level.txt", + "bom-ref": "7d2d784086fec9f9", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_server_terminals-0.5.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "684842915384df49", - "name": "/usr/local/lib/python3.12/dist-packages/pyzmq-27.1.0.dist-info/METADATA", + "bom-ref": "2d7a938ff322b299", + "name": "/usr/local/lib/python3.12/dist-packages/jupyter_server_terminals-0.5.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "07e7ffaafcb5d330", - "name": "/usr/local/lib/python3.12/dist-packages/pyzmq-27.1.0.dist-info/RECORD", + "bom-ref": "11f33a256152c38d", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab-4.6.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5ad95137922e6962", - "name": "/usr/local/lib/python3.12/dist-packages/quack_kernels-0.6.2.dist-info/METADATA", + "bom-ref": "26579afd59755b65", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab-4.6.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7d1d775f45412de1", - "name": "/usr/local/lib/python3.12/dist-packages/quack_kernels-0.6.2.dist-info/RECORD", + "bom-ref": "0708ea8f898c4ee9", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/galata/@jupyterlab/galata-extension/package.json", "type": "file" }, { - "bom-ref": "e860eee8b6919da7", - "name": "/usr/local/lib/python3.12/dist-packages/quack_kernels-0.6.2.dist-info/top_level.txt", + "bom-ref": "0928e2ee8c57d301", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/staging/package.json", "type": "file" }, { - "bom-ref": "423873790b744d51", - "name": "/usr/local/lib/python3.12/dist-packages/referencing-0.37.0.dist-info/METADATA", + "bom-ref": "46a116d74760e213", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/static/package.json", "type": "file" }, { - "bom-ref": "fa18575372ba103f", - "name": "/usr/local/lib/python3.12/dist-packages/referencing-0.37.0.dist-info/RECORD", + "bom-ref": "fba4e9792d758fc1", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/extension/package.json", "type": "file" }, { - "bom-ref": "69dcee910b0f0f5d", - "name": "/usr/local/lib/python3.12/dist-packages/regex-2026.4.4.dist-info/METADATA", + "bom-ref": "206d1e7ab27aa7a9", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/incompat/package.json", "type": "file" }, { - "bom-ref": "e5a3c04601fc0fc5", - "name": "/usr/local/lib/python3.12/dist-packages/regex-2026.4.4.dist-info/RECORD", + "bom-ref": "e98be4740e1b2860", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/interop/consumer/package.json", "type": "file" }, { - "bom-ref": "62e2fb4d1d50b5ce", - "name": "/usr/local/lib/python3.12/dist-packages/regex-2026.4.4.dist-info/top_level.txt", + "bom-ref": "9c4157672a3add6c", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/interop/provider/package.json", "type": "file" }, { - "bom-ref": "175c49df54a576d4", - "name": "/usr/local/lib/python3.12/dist-packages/requests-2.33.1.dist-info/METADATA", + "bom-ref": "44c5f9240e7dabc7", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/interop/token/package.json", "type": "file" }, { - "bom-ref": "b2eb9fe5c50d9765", - "name": "/usr/local/lib/python3.12/dist-packages/requests-2.33.1.dist-info/RECORD", + "bom-ref": "021ccfeabfca5334", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/mimeextension/package.json", "type": "file" }, { - "bom-ref": "f08b17b01e52f24a", - "name": "/usr/local/lib/python3.12/dist-packages/requests-2.33.1.dist-info/top_level.txt", + "bom-ref": "c05d13a21aa87877", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/package/package.json", "type": "file" }, { - "bom-ref": "9e90c7874f56bece", - "name": "/usr/local/lib/python3.12/dist-packages/rfc3339_validator-0.1.4.dist-info/METADATA", + "bom-ref": "7ac5de705ab8ecc3", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/service-manager-extension/package.json", "type": "file" }, { - "bom-ref": "7ee330586b9b15fc", - "name": "/usr/local/lib/python3.12/dist-packages/rfc3339_validator-0.1.4.dist-info/RECORD", + "bom-ref": "54aac7586ae7e6c2", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/test-hyphens-underscore/package.json", "type": "file" }, { - "bom-ref": "e8528aeead15669e", - "name": "/usr/local/lib/python3.12/dist-packages/rfc3339_validator-0.1.4.dist-info/top_level.txt", + "bom-ref": "26dc722ed57f682b", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/test-hyphens/package.json", "type": "file" }, { - "bom-ref": "b98b52dc5b984d4b", - "name": "/usr/local/lib/python3.12/dist-packages/rfc3986_validator-0.1.1.dist-info/METADATA", + "bom-ref": "d3fc16971f27b544", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab/tests/mock_packages/test_no_hyphens/package.json", "type": "file" }, { - "bom-ref": "11a95fb34150f843", - "name": "/usr/local/lib/python3.12/dist-packages/rfc3986_validator-0.1.1.dist-info/RECORD", + "bom-ref": "2e1c1d5d1a66fe65", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_code_formatter-3.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0a785077a0f085e8", - "name": "/usr/local/lib/python3.12/dist-packages/rfc3986_validator-0.1.1.dist-info/top_level.txt", + "bom-ref": "2ab32cb54c86c7e9", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_code_formatter-3.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9b167ba077024bc9", - "name": "/usr/local/lib/python3.12/dist-packages/rfc3987_syntax-1.1.0.dist-info/METADATA", + "bom-ref": "f95021e8fcb6c40d", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_jupytext/labextension/package.json", "type": "file" }, { - "bom-ref": "8b8c735cdd3291d6", - "name": "/usr/local/lib/python3.12/dist-packages/rfc3987_syntax-1.1.0.dist-info/RECORD", + "bom-ref": "883fa928bdfae122", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_pygments-0.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d5b35be4f01bf7bd", - "name": "/usr/local/lib/python3.12/dist-packages/rich-15.0.0.dist-info/METADATA", + "bom-ref": "234d648095534c02", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_pygments-0.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "38a4089d71b52b1b", - "name": "/usr/local/lib/python3.12/dist-packages/rich-15.0.0.dist-info/RECORD", + "bom-ref": "420715a24ac9e2e8", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_server-2.28.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c989ea9f064a5e82", - "name": "/usr/local/lib/python3.12/dist-packages/rpds_py-0.30.0.dist-info/METADATA", + "bom-ref": "757aab638732fb1c", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_server-2.28.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7b429a15bd0a332b", - "name": "/usr/local/lib/python3.12/dist-packages/rpds_py-0.30.0.dist-info/RECORD", + "bom-ref": "cef0e641346514b3", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_tensorboard_pro-4.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e5d3127eca0a38f6", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer-0.16.1.dist-info/METADATA", + "bom-ref": "ab1f2f2b83cbdf97", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_tensorboard_pro-4.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1795ea8bc5f20d87", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer-0.16.1.dist-info/RECORD", + "bom-ref": "202c3639f0593b0d", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_tensorboard_pro-4.0.0.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "0326953947efdeac", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer-0.16.1.dist-info/top_level.txt", + "bom-ref": "f695ea57c7992b23", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_tensorboard_pro-4.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "2b0169e8aaa773a6", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_azure-0.16.1.dist-info/METADATA", + "bom-ref": "cc40e22c03c5d805", + "name": "/usr/local/lib/python3.12/dist-packages/jupyterlab_tensorboard_pro/labextension/package.json", "type": "file" }, { - "bom-ref": "4d6038082c38da40", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_azure-0.16.1.dist-info/RECORD", + "bom-ref": "6e19ad569977730f", + "name": "/usr/local/lib/python3.12/dist-packages/jupytext-1.19.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5396343709538bdd", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_azure-0.16.1.dist-info/top_level.txt", + "bom-ref": "6ca371c568e73c13", + "name": "/usr/local/lib/python3.12/dist-packages/jupytext-1.19.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6375f5e52a854fc2", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_gcs-0.16.1.dist-info/METADATA", + "bom-ref": "8b2190a617f059cb", + "name": "/usr/local/lib/python3.12/dist-packages/kiwisolver-1.5.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b8f51cfcf6ca851b", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_gcs-0.16.1.dist-info/RECORD", + "bom-ref": "d4d9670b55a4b4e0", + "name": "/usr/local/lib/python3.12/dist-packages/kiwisolver-1.5.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "240d0bb175830fae", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_gcs-0.16.1.dist-info/top_level.txt", + "bom-ref": "8aabc49d68e36769", + "name": "/usr/local/lib/python3.12/dist-packages/kiwisolver-1.5.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "4d9f55f9e09a8a02", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_s3-0.16.1.dist-info/METADATA", + "bom-ref": "fac67048278130cd", + "name": "/usr/local/lib/python3.12/dist-packages/lark-1.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "026f6d5d27a98fee", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_s3-0.16.1.dist-info/RECORD", + "bom-ref": "d8e6807d5b2942b7", + "name": "/usr/local/lib/python3.12/dist-packages/lark-1.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c068b36958e06777", - "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_s3-0.16.1.dist-info/top_level.txt", + "bom-ref": "8426cbf2f434372d", + "name": "/usr/local/lib/python3.12/dist-packages/lark-1.3.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "a13eee866ab684f9", - "name": "/usr/local/lib/python3.12/dist-packages/s3transfer-0.19.2.dist-info/METADATA", + "bom-ref": "58ffc000e44fed88", + "name": "/usr/local/lib/python3.12/dist-packages/lazy_loader-0.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e80aaf635d1a673b", - "name": "/usr/local/lib/python3.12/dist-packages/s3transfer-0.19.2.dist-info/RECORD", + "bom-ref": "ce54808d2bed1b03", + "name": "/usr/local/lib/python3.12/dist-packages/lazy_loader-0.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "838b772d1a42d940", - "name": "/usr/local/lib/python3.12/dist-packages/s3transfer-0.19.2.dist-info/top_level.txt", + "bom-ref": "7e33b9fd262b4fe3", + "name": "/usr/local/lib/python3.12/dist-packages/lazy_loader-0.5.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "f737efccbdc7788d", - "name": "/usr/local/lib/python3.12/dist-packages/safetensors-0.8.0.dist-info/METADATA", + "bom-ref": "85e0ce5144d6b3d8", + "name": "/usr/local/lib/python3.12/dist-packages/libcst-1.9.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "96918bedccaa1484", - "name": "/usr/local/lib/python3.12/dist-packages/safetensors-0.8.0.dist-info/RECORD", + "bom-ref": "8a4eb079a34dc204", + "name": "/usr/local/lib/python3.12/dist-packages/libcst-1.9.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "602285d287e01ca6", - "name": "/usr/local/lib/python3.12/dist-packages/scikit_learn-1.9.0.dist-info/METADATA", + "bom-ref": "8c40e2e4793d25a7", + "name": "/usr/local/lib/python3.12/dist-packages/libcst-1.9.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "27d2b4a52fb1596f", - "name": "/usr/local/lib/python3.12/dist-packages/scikit_learn-1.9.0.dist-info/RECORD", + "bom-ref": "2989df390dbeab2d", + "name": "/usr/local/lib/python3.12/dist-packages/librosa-1.0.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8a0a7a518dae97ee", - "name": "/usr/local/lib/python3.12/dist-packages/scipy-1.17.1.dist-info/METADATA", + "bom-ref": "ae1b1390c393a77c", + "name": "/usr/local/lib/python3.12/dist-packages/librosa-1.0.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cad0fe1fe0600564", - "name": "/usr/local/lib/python3.12/dist-packages/scipy-1.17.1.dist-info/RECORD", + "bom-ref": "a008e480f586b2df", + "name": "/usr/local/lib/python3.12/dist-packages/librosa-1.0.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "3eb7446f5db151a7", - "name": "/usr/local/lib/python3.12/dist-packages/send2trash-2.1.0.dist-info/METADATA", + "bom-ref": "bfad6a8402a95162", + "name": "/usr/local/lib/python3.12/dist-packages/llguidance-0.7.29.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e4b6bb794985cf2a", - "name": "/usr/local/lib/python3.12/dist-packages/send2trash-2.1.0.dist-info/RECORD", + "bom-ref": "bb707dfaada384aa", + "name": "/usr/local/lib/python3.12/dist-packages/llguidance-0.7.29.dist-info/RECORD", "type": "file" }, { - "bom-ref": "50085b8fa65bb7b3", - "name": "/usr/local/lib/python3.12/dist-packages/send2trash-2.1.0.dist-info/top_level.txt", + "bom-ref": "b5eb36111fb4245b", + "name": "/usr/local/lib/python3.12/dist-packages/llist-0.7.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "31b57dc74f4e5dc6", - "name": "/usr/local/lib/python3.12/dist-packages/sentencepiece-0.2.2.dist-info/METADATA", + "bom-ref": "77e67f6fe5d5a9a9", + "name": "/usr/local/lib/python3.12/dist-packages/llist-0.7.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "83c90e9bb87c3a74", - "name": "/usr/local/lib/python3.12/dist-packages/sentencepiece-0.2.2.dist-info/RECORD", + "bom-ref": "e701a662bd345b47", + "name": "/usr/local/lib/python3.12/dist-packages/llist-0.7.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "64834983f8546f1b", - "name": "/usr/local/lib/python3.12/dist-packages/sentencepiece-0.2.2.dist-info/top_level.txt", + "bom-ref": "3e4fcfcafa2d3eef", + "name": "/usr/local/lib/python3.12/dist-packages/llvmlite-0.46.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "96ecda07d625eb69", - "name": "/usr/local/lib/python3.12/dist-packages/sentry_sdk-2.59.0.dist-info/METADATA", + "bom-ref": "36f85526add1406c", + "name": "/usr/local/lib/python3.12/dist-packages/llvmlite-0.46.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8b3168806dd1c0e8", - "name": "/usr/local/lib/python3.12/dist-packages/sentry_sdk-2.59.0.dist-info/RECORD", + "bom-ref": "c1f46603b6146275", + "name": "/usr/local/lib/python3.12/dist-packages/llvmlite-0.46.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "419a65022b13329e", - "name": "/usr/local/lib/python3.12/dist-packages/sentry_sdk-2.59.0.dist-info/top_level.txt", + "bom-ref": "1ac6af704f894d3e", + "name": "/usr/local/lib/python3.12/dist-packages/lxml-6.1.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1e4f0006904291c5", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools-79.0.1.dist-info/METADATA", + "bom-ref": "c06fabfd486b57de", + "name": "/usr/local/lib/python3.12/dist-packages/lxml-6.1.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "553f34b7be8dafbe", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools-79.0.1.dist-info/RECORD", + "bom-ref": "196f1cef2636ca7e", + "name": "/usr/local/lib/python3.12/dist-packages/lxml-6.1.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "adc26291aa5af057", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools-79.0.1.dist-info/top_level.txt", + "bom-ref": "9d6c97ed302c5d9e", + "name": "/usr/local/lib/python3.12/dist-packages/makefun-1.16.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2ab6d2100476f124", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools-81.0.0.dist-info/METADATA", + "bom-ref": "b9de6d568a516541", + "name": "/usr/local/lib/python3.12/dist-packages/makefun-1.16.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5e2fab30978ac397", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools-81.0.0.dist-info/RECORD", + "bom-ref": "13072a18f1bb8747", + "name": "/usr/local/lib/python3.12/dist-packages/makefun-1.16.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "58be7ca07d1ffdd7", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools-81.0.0.dist-info/top_level.txt", + "bom-ref": "d0d8675800dfb57e", + "name": "/usr/local/lib/python3.12/dist-packages/markdown-3.10.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7d6d99aeb72c36bc", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/METADATA", + "bom-ref": "51cbe5027dc08422", + "name": "/usr/local/lib/python3.12/dist-packages/markdown-3.10.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "063db801d64d795d", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/RECORD", + "bom-ref": "00210f64bfb530d6", + "name": "/usr/local/lib/python3.12/dist-packages/markdown-3.10.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "4c37dfb5f0344843", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/top_level.txt", + "bom-ref": "865f48b6a95e1105", + "name": "/usr/local/lib/python3.12/dist-packages/markdown_it_py-4.2.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "44c37631f47585c9", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/METADATA", + "bom-ref": "f304d97d015e5506", + "name": "/usr/local/lib/python3.12/dist-packages/markdown_it_py-4.2.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "75e8e2cc3a502c2e", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/RECORD", + "bom-ref": "0555967c8ba88e65", + "name": "/usr/local/lib/python3.12/dist-packages/markupsafe-3.0.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "26ad1c76a9542f94", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/top_level.txt", + "bom-ref": "d60148dcde93dbee", + "name": "/usr/local/lib/python3.12/dist-packages/markupsafe-3.0.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a74934cddd1acea4", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA", + "bom-ref": "81404047b076001d", + "name": "/usr/local/lib/python3.12/dist-packages/markupsafe-3.0.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "a48af37f2a2222c6", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD", + "bom-ref": "b40611c13b8eefaf", + "name": "/usr/local/lib/python3.12/dist-packages/matplotlib-3.11.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5e6c88b23e14b275", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt", + "bom-ref": "aaf0f83aac79f241", + "name": "/usr/local/lib/python3.12/dist-packages/matplotlib-3.11.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f0745c8dff06f1e4", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA", + "bom-ref": "4bb66185c06ebb80", + "name": "/usr/local/lib/python3.12/dist-packages/matplotlib_inline-0.2.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6d2308e227db2460", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD", + "bom-ref": "9beaff76004bcbe8", + "name": "/usr/local/lib/python3.12/dist-packages/matplotlib_inline-0.2.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "26db0f0d85b3252a", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt", + "bom-ref": "fe1eab935e9f9f37", + "name": "/usr/local/lib/python3.12/dist-packages/mcp-1.30.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "41d58643d3a15eec", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/inflect-7.3.1.dist-info/METADATA", + "bom-ref": "cd7734e20e1459a3", + "name": "/usr/local/lib/python3.12/dist-packages/mcp-1.30.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "0aa69393f68762fd", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/inflect-7.3.1.dist-info/RECORD", + "bom-ref": "ab49ff85bed808a5", + "name": "/usr/local/lib/python3.12/dist-packages/mdit_py_plugins-0.6.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "829614ddd56a1df3", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/inflect-7.3.1.dist-info/top_level.txt", + "bom-ref": "3a8df8f9e3f1a2e3", + "name": "/usr/local/lib/python3.12/dist-packages/mdit_py_plugins-0.6.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "85313ec47a88ebcc", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/METADATA", + "bom-ref": "8815348820b10325", + "name": "/usr/local/lib/python3.12/dist-packages/mdurl-0.1.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "94d46a5ab2d903a6", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/RECORD", + "bom-ref": "7041846ef207af1d", + "name": "/usr/local/lib/python3.12/dist-packages/mdurl-0.1.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "0c338f37b0249c86", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/top_level.txt", + "bom-ref": "789a7447018f7796", + "name": "/usr/local/lib/python3.12/dist-packages/meson-1.12.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8cae8b426feaa945", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/METADATA", + "bom-ref": "91cb61cde5d1b5fc", + "name": "/usr/local/lib/python3.12/dist-packages/meson-1.12.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "84fb846367be2f8b", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/RECORD", + "bom-ref": "d012849b998b171f", + "name": "/usr/local/lib/python3.12/dist-packages/meson-1.12.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "78ccc80054325294", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/top_level.txt", + "bom-ref": "82a88d6d53c9bb72", + "name": "/usr/local/lib/python3.12/dist-packages/mistral_common-1.11.7.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cf710f20efaef551", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/METADATA", + "bom-ref": "e194075389ae0abb", + "name": "/usr/local/lib/python3.12/dist-packages/mistral_common-1.11.7.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c051415c0ca42bf3", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/RECORD", + "bom-ref": "555def41a417eaa7", + "name": "/usr/local/lib/python3.12/dist-packages/mistral_common-1.11.7.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "00ea34f367785d03", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/top_level.txt", + "bom-ref": "6cd4b96d8809497a", + "name": "/usr/local/lib/python3.12/dist-packages/mistune-3.3.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7b14defb4e61a47f", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-4.0.0.dist-info/METADATA", + "bom-ref": "b2644749f1709871", + "name": "/usr/local/lib/python3.12/dist-packages/mistune-3.3.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "564e72d2e4be7c6e", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-4.0.0.dist-info/RECORD", + "bom-ref": "d31c0510b1c6def9", + "name": "/usr/local/lib/python3.12/dist-packages/mistune-3.3.4.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "8d482885f4418c98", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-4.0.0.dist-info/top_level.txt", + "bom-ref": "0efc34aeaab07e27", + "name": "/usr/local/lib/python3.12/dist-packages/mkl-2021.1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "bde68ea44bf39ac6", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_context-6.1.0.dist-info/METADATA", + "bom-ref": "94d84a716970beb3", + "name": "/usr/local/lib/python3.12/dist-packages/mkl-2021.1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b68bd1dfe9706143", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_context-6.1.0.dist-info/RECORD", + "bom-ref": "e726122b5f441156", + "name": "/usr/local/lib/python3.12/dist-packages/mkl-2021.1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "7769d7869cb00879", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_context-6.1.0.dist-info/top_level.txt", + "bom-ref": "37c94071c154fe0c", + "name": "/usr/local/lib/python3.12/dist-packages/mkl_devel-2021.1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "762b698b7bcb180e", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/METADATA", + "bom-ref": "15b34597ad570ca9", + "name": "/usr/local/lib/python3.12/dist-packages/mkl_devel-2021.1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "d651a84ca0a3a9fa", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/RECORD", + "bom-ref": "dbbc204cd3150a77", + "name": "/usr/local/lib/python3.12/dist-packages/mkl_devel-2021.1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "cdd3ff3c26cd7d5a", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/top_level.txt", + "bom-ref": "b5dfa00c3fce1c06", + "name": "/usr/local/lib/python3.12/dist-packages/mkl_include-2021.1.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c68fddfe9f6d1aef", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/more_itertools-10.3.0.dist-info/METADATA", + "bom-ref": "dd990a3ebb62dd32", + "name": "/usr/local/lib/python3.12/dist-packages/mkl_include-2021.1.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "db6ab5d01c0736e4", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/more_itertools-10.3.0.dist-info/RECORD", + "bom-ref": "506fcf1214def3b7", + "name": "/usr/local/lib/python3.12/dist-packages/mkl_include-2021.1.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "a98e82a279169193", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/more_itertools-10.8.0.dist-info/METADATA", + "bom-ref": "79aa11e7c18eb537", + "name": "/usr/local/lib/python3.12/dist-packages/ml_dtypes-0.6.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "317a420c8c53a01c", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/more_itertools-10.8.0.dist-info/RECORD", + "bom-ref": "6175042d9defb4c6", + "name": "/usr/local/lib/python3.12/dist-packages/ml_dtypes-0.6.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "bfb5ce34d9ac0a5f", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/packaging-24.2.dist-info/METADATA", + "bom-ref": "cc5717a4a8237dac", + "name": "/usr/local/lib/python3.12/dist-packages/modelexpress-0.5.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d72aeaa4d6a39fe4", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/packaging-24.2.dist-info/RECORD", + "bom-ref": "f448675f3e60e100", + "name": "/usr/local/lib/python3.12/dist-packages/modelexpress-0.5.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "77abd0f03cfff3fc", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/packaging-26.0.dist-info/METADATA", + "bom-ref": "262520239627e259", + "name": "/usr/local/lib/python3.12/dist-packages/modelexpress-0.5.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e559e46bc0444938", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/packaging-26.0.dist-info/RECORD", + "bom-ref": "081a48d1471338d1", + "name": "/usr/local/lib/python3.12/dist-packages/mpi4py-3.1.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2d0b11153c092ac6", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/platformdirs-4.2.2.dist-info/METADATA", + "bom-ref": "7097d86f09221909", + "name": "/usr/local/lib/python3.12/dist-packages/mpi4py-3.1.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "18c1d8f25ba99b8a", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/platformdirs-4.2.2.dist-info/RECORD", + "bom-ref": "1cd16b5683d38469", + "name": "/usr/local/lib/python3.12/dist-packages/mpi4py-3.1.5.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "9a6765bdfa2cfa42", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/platformdirs-4.4.0.dist-info/METADATA", + "bom-ref": "b0335958b93a073e", + "name": "/usr/local/lib/python3.12/dist-packages/mpi4py-3.1.5.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "212d0e60f5a1ed5c", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/platformdirs-4.4.0.dist-info/RECORD", + "bom-ref": "0f0c56d2c5d947b5", + "name": "/usr/local/lib/python3.12/dist-packages/mpmath-1.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4ac6fd6a83e0aaa9", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/tomli-2.0.1.dist-info/METADATA", + "bom-ref": "0bf9cbb859301593", + "name": "/usr/local/lib/python3.12/dist-packages/mpmath-1.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e2809266ffed4578", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/tomli-2.0.1.dist-info/RECORD", + "bom-ref": "67fb980c94150e8c", + "name": "/usr/local/lib/python3.12/dist-packages/mpmath-1.3.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "72462f11a0d8b119", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/tomli-2.4.0.dist-info/METADATA", + "bom-ref": "9e1f2f13d399f128", + "name": "/usr/local/lib/python3.12/dist-packages/msal-1.38.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a539f37e91647171", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/tomli-2.4.0.dist-info/RECORD", + "bom-ref": "dc933953fa0e5dac", + "name": "/usr/local/lib/python3.12/dist-packages/msal-1.38.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "0aba28eb446ecb16", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/METADATA", + "bom-ref": "2fe39f13f3db8d6e", + "name": "/usr/local/lib/python3.12/dist-packages/msal-1.38.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "79106dfd829724a3", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/RECORD", + "bom-ref": "87906b26799c3dcc", + "name": "/usr/local/lib/python3.12/dist-packages/msal_extensions-1.3.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "37e07a31130ecbeb", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/top_level.txt", + "bom-ref": "73eca54bb0c939fc", + "name": "/usr/local/lib/python3.12/dist-packages/msal_extensions-1.3.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1c9d85b63c561907", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/typing_extensions-4.12.2.dist-info/METADATA", + "bom-ref": "95cc505d40b6e436", + "name": "/usr/local/lib/python3.12/dist-packages/msal_extensions-1.3.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "5a24bd15563c54c7", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/typing_extensions-4.12.2.dist-info/RECORD", + "bom-ref": "4178e1dcad5150c5", + "name": "/usr/local/lib/python3.12/dist-packages/msgpack-1.2.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "586dd601a06ce786", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.19.2.dist-info/METADATA", + "bom-ref": "c86f7077b6106ec5", + "name": "/usr/local/lib/python3.12/dist-packages/msgpack-1.2.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dcb1548e5ae47d2e", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.19.2.dist-info/RECORD", + "bom-ref": "e6cce8e1a81fcefc", + "name": "/usr/local/lib/python3.12/dist-packages/msgpack-1.2.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "57c3aaf12848d0f3", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.19.2.dist-info/top_level.txt", + "bom-ref": "eca90c56cee94afd", + "name": "/usr/local/lib/python3.12/dist-packages/msgspec-0.21.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c0874719130321aa", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.23.0.dist-info/METADATA", + "bom-ref": "e223623ab3da4c68", + "name": "/usr/local/lib/python3.12/dist-packages/msgspec-0.21.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "f017ccc985f1ec31", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.23.0.dist-info/RECORD", + "bom-ref": "bbe66958c02829a2", + "name": "/usr/local/lib/python3.12/dist-packages/msgspec-0.21.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6383ce3b30ba6218", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.23.0.dist-info/top_level.txt", + "bom-ref": "77e890c3197e1926", + "name": "/usr/local/lib/python3.12/dist-packages/multidict-6.7.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b8b174adf5818ccf", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/cli-32.exe", + "bom-ref": "7ea73d9ed4bac231", + "name": "/usr/local/lib/python3.12/dist-packages/multidict-6.7.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6aea29f03a9ad131", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/cli-64.exe", + "bom-ref": "84748f7bcf6ecf0a", + "name": "/usr/local/lib/python3.12/dist-packages/multidict-6.7.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "8e13afb5211b92d6", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/cli-arm64.exe", + "bom-ref": "dd55e9acd353f9b7", + "name": "/usr/local/lib/python3.12/dist-packages/multiprocess-0.70.16.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e7260ce9e9310a5e", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/cli.exe", + "bom-ref": "7d7844075973517f", + "name": "/usr/local/lib/python3.12/dist-packages/multiprocess-0.70.16.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ab19c3638c6843c9", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/gui-32.exe", + "bom-ref": "953d47ee16f0f15d", + "name": "/usr/local/lib/python3.12/dist-packages/multiprocess-0.70.16.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "58bee6938a0a2370", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/gui-64.exe", + "bom-ref": "a4ad077d3e6127fa", + "name": "/usr/local/lib/python3.12/dist-packages/mypy_extensions-1.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "fe1237c4e456fa13", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/gui-arm64.exe", + "bom-ref": "31e42c64c6b2baba", + "name": "/usr/local/lib/python3.12/dist-packages/mypy_extensions-1.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "553dcd485883423f", - "name": "/usr/local/lib/python3.12/dist-packages/setuptools/gui.exe", + "bom-ref": "9f34fdbf579bde71", + "name": "/usr/local/lib/python3.12/dist-packages/narwhals-2.26.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "299957b70e9fc70e", - "name": "/usr/local/lib/python3.12/dist-packages/shellingham-1.5.4.dist-info/METADATA", + "bom-ref": "c4dc966d326b53ef", + "name": "/usr/local/lib/python3.12/dist-packages/narwhals-2.26.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "109f27187a775c0a", - "name": "/usr/local/lib/python3.12/dist-packages/shellingham-1.5.4.dist-info/RECORD", + "bom-ref": "581fb7c45d15ba8e", + "name": "/usr/local/lib/python3.12/dist-packages/nbclient-0.11.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5ee37045b0aa323e", - "name": "/usr/local/lib/python3.12/dist-packages/shellingham-1.5.4.dist-info/top_level.txt", + "bom-ref": "2d71031edbed5f11", + "name": "/usr/local/lib/python3.12/dist-packages/nbclient-0.11.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e54f022113f4444b", - "name": "/usr/local/lib/python3.12/dist-packages/six-1.16.0.dist-info/METADATA", + "bom-ref": "9fbfbfce35207562", + "name": "/usr/local/lib/python3.12/dist-packages/nbconvert-7.17.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8c750356e4b4e451", - "name": "/usr/local/lib/python3.12/dist-packages/six-1.16.0.dist-info/RECORD", + "bom-ref": "7d4716e6254035e9", + "name": "/usr/local/lib/python3.12/dist-packages/nbconvert-7.17.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6d2455603cd66b9c", - "name": "/usr/local/lib/python3.12/dist-packages/six-1.16.0.dist-info/top_level.txt", + "bom-ref": "2f62ee6ac68612c9", + "name": "/usr/local/lib/python3.12/dist-packages/nbformat-5.11.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "83b15d5a6ae76427", - "name": "/usr/local/lib/python3.12/dist-packages/smmap-5.0.3.dist-info/METADATA", + "bom-ref": "f96d5389c209c407", + "name": "/usr/local/lib/python3.12/dist-packages/nbformat-5.11.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "aad8397b23ca7206", - "name": "/usr/local/lib/python3.12/dist-packages/smmap-5.0.3.dist-info/RECORD", + "bom-ref": "025b8646f1f2c54b", + "name": "/usr/local/lib/python3.12/dist-packages/nccl4py-0.3.1.post1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4eb9b2979fb921ab", - "name": "/usr/local/lib/python3.12/dist-packages/smmap-5.0.3.dist-info/top_level.txt", + "bom-ref": "f8764d2b8a6ad2ee", + "name": "/usr/local/lib/python3.12/dist-packages/nccl4py-0.3.1.post1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2304e91e68aa910e", - "name": "/usr/local/lib/python3.12/dist-packages/sniffio-1.3.1.dist-info/METADATA", + "bom-ref": "03478770d870be14", + "name": "/usr/local/lib/python3.12/dist-packages/nccl4py-0.3.1.post1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1136284259b73aae", - "name": "/usr/local/lib/python3.12/dist-packages/sniffio-1.3.1.dist-info/RECORD", + "bom-ref": "eb2a4fbb8d6b7bc4", + "name": "/usr/local/lib/python3.12/dist-packages/nest_asyncio2-1.7.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a36cdbe5e1485a25", - "name": "/usr/local/lib/python3.12/dist-packages/sniffio-1.3.1.dist-info/top_level.txt", + "bom-ref": "87300556ab816bee", + "name": "/usr/local/lib/python3.12/dist-packages/nest_asyncio2-1.7.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "74dd3d9458ef1003", - "name": "/usr/local/lib/python3.12/dist-packages/soundfile-0.14.0.dist-info/METADATA", + "bom-ref": "4d3c2980c81a1e11", + "name": "/usr/local/lib/python3.12/dist-packages/nest_asyncio2-1.7.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "288de3ee20965c20", - "name": "/usr/local/lib/python3.12/dist-packages/soundfile-0.14.0.dist-info/RECORD", + "bom-ref": "f5104923178b36fd", + "name": "/usr/local/lib/python3.12/dist-packages/networkx-3.6.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "fbe376c4fd210368", - "name": "/usr/local/lib/python3.12/dist-packages/soundfile-0.14.0.dist-info/top_level.txt", + "bom-ref": "0b78f642b41eb130", + "name": "/usr/local/lib/python3.12/dist-packages/networkx-3.6.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "e77c1aa85a784211", - "name": "/usr/local/lib/python3.12/dist-packages/soupsieve-2.9.2.dist-info/METADATA", + "bom-ref": "14057c30b45c2eb7", + "name": "/usr/local/lib/python3.12/dist-packages/networkx-3.6.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b090422c49fdfd1f", - "name": "/usr/local/lib/python3.12/dist-packages/soupsieve-2.9.2.dist-info/RECORD", + "bom-ref": "cee38bac59f0227c", + "name": "/usr/local/lib/python3.12/dist-packages/ninja-1.13.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "55242d960173f5ec", - "name": "/usr/local/lib/python3.12/dist-packages/soxr-1.1.0.dist-info/METADATA", + "bom-ref": "d1b865435551a21d", + "name": "/usr/local/lib/python3.12/dist-packages/ninja-1.13.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c15e09cea7df9496", - "name": "/usr/local/lib/python3.12/dist-packages/soxr-1.1.0.dist-info/RECORD", + "bom-ref": "f6d4ee7373cd6b51", + "name": "/usr/local/lib/python3.12/dist-packages/notebook-7.6.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6298d08d3999a8f7", - "name": "/usr/local/lib/python3.12/dist-packages/sse_starlette-3.4.8.dist-info/METADATA", + "bom-ref": "08a8d7382c28fc0f", + "name": "/usr/local/lib/python3.12/dist-packages/notebook-7.6.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "61b9141ab067f38a", - "name": "/usr/local/lib/python3.12/dist-packages/sse_starlette-3.4.8.dist-info/RECORD", + "bom-ref": "095b84351cf7c959", + "name": "/usr/local/lib/python3.12/dist-packages/notebook_shim-0.2.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e3c8abcd8fb46338", - "name": "/usr/local/lib/python3.12/dist-packages/sse_starlette-3.4.8.dist-info/top_level.txt", + "bom-ref": "582a094619b6161f", + "name": "/usr/local/lib/python3.12/dist-packages/notebook_shim-0.2.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "56ef88fcec00de04", - "name": "/usr/local/lib/python3.12/dist-packages/stack_data-0.6.3.dist-info/METADATA", + "bom-ref": "4dfd7813f1d990f0", + "name": "/usr/local/lib/python3.12/dist-packages/numba-0.64.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7895e5db3f5c75b3", - "name": "/usr/local/lib/python3.12/dist-packages/stack_data-0.6.3.dist-info/RECORD", + "bom-ref": "9e72dcac232d472a", + "name": "/usr/local/lib/python3.12/dist-packages/numba-0.64.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "36ec87d6b114dbc6", - "name": "/usr/local/lib/python3.12/dist-packages/stack_data-0.6.3.dist-info/top_level.txt", + "bom-ref": "8e4a9dacd805d4aa", + "name": "/usr/local/lib/python3.12/dist-packages/numba-0.64.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6e4a553015b05b8f", - "name": "/usr/local/lib/python3.12/dist-packages/starlette-0.50.0.dist-info/METADATA", + "bom-ref": "0f6649c875569a88", + "name": "/usr/local/lib/python3.12/dist-packages/numexpr-2.14.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0d41c6efca293be7", - "name": "/usr/local/lib/python3.12/dist-packages/starlette-0.50.0.dist-info/RECORD", + "bom-ref": "7c5c5a2daad6a717", + "name": "/usr/local/lib/python3.12/dist-packages/numexpr-2.14.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "0b9930d6a0474dd2", - "name": "/usr/local/lib/python3.12/dist-packages/sympy-1.14.0.dist-info/METADATA", + "bom-ref": "364b81af36395204", + "name": "/usr/local/lib/python3.12/dist-packages/numexpr-2.14.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b2a880337c422ac9", - "name": "/usr/local/lib/python3.12/dist-packages/sympy-1.14.0.dist-info/RECORD", + "bom-ref": "081ebcd53a24a913", + "name": "/usr/local/lib/python3.12/dist-packages/numpy-2.3.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e993f462a87295f7", - "name": "/usr/local/lib/python3.12/dist-packages/sympy-1.14.0.dist-info/top_level.txt", + "bom-ref": "7bfe01cf4adaa220", + "name": "/usr/local/lib/python3.12/dist-packages/numpy-2.3.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "65150468c683c868", - "name": "/usr/local/lib/python3.12/dist-packages/tabulate-0.10.0.dist-info/METADATA", + "bom-ref": "2f8beb843a00928c", + "name": "/usr/local/lib/python3.12/dist-packages/nvdlfw_inspect-0.2.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "8bd37d1c05fa2754", - "name": "/usr/local/lib/python3.12/dist-packages/tabulate-0.10.0.dist-info/RECORD", + "bom-ref": "65f733f9d5daea22", + "name": "/usr/local/lib/python3.12/dist-packages/nvdlfw_inspect-0.2.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c08ee5a98325812b", - "name": "/usr/local/lib/python3.12/dist-packages/tabulate-0.10.0.dist-info/top_level.txt", + "bom-ref": "5418f10fdd03d063", + "name": "/usr/local/lib/python3.12/dist-packages/nvdlfw_inspect-0.2.2.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "912fcbc3be3a0a15", - "name": "/usr/local/lib/python3.12/dist-packages/tbb-2021.13.1.dist-info/METADATA", + "bom-ref": "0268d2bea8d32050", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia/dali/.libs/libavformat-ddd10cf3.so.62", "type": "file" }, { - "bom-ref": "024c27e3439768b6", - "name": "/usr/local/lib/python3.12/dist-packages/tbb-2021.13.1.dist-info/RECORD", + "bom-ref": "bc955c11210218fe", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvdisasm-13.3.73.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3755904e87b20383", - "name": "/usr/local/lib/python3.12/dist-packages/tbb-2021.13.1.dist-info/top_level.txt", + "bom-ref": "e285ef6aff729ffb", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvdisasm-13.3.73.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c1b2c5403461550e", - "name": "/usr/local/lib/python3.12/dist-packages/tensorboard-2.20.0.dist-info/METADATA", + "bom-ref": "dc8050ddad18df3c", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvdisasm-13.3.73.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "40f1c27b1a342ed1", - "name": "/usr/local/lib/python3.12/dist-packages/tensorboard-2.20.0.dist-info/RECORD", + "bom-ref": "94a555858f37bb00", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvrtc-13.4.59.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c811a26ce4e3d1ac", - "name": "/usr/local/lib/python3.12/dist-packages/tensorboard-2.20.0.dist-info/top_level.txt", + "bom-ref": "173dc1c264a59060", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvrtc-13.4.59.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8c4eb90ebde746e3", - "name": "/usr/local/lib/python3.12/dist-packages/tensorboard_data_server-0.7.2.dist-info/METADATA", + "bom-ref": "e8d3dd3926a114fb", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_nvrtc-13.4.59.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "37d6d6495c836c2b", - "name": "/usr/local/lib/python3.12/dist-packages/tensorboard_data_server-0.7.2.dist-info/RECORD", + "bom-ref": "3b4edf1dfd958ef4", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_tileiras-13.1.80.dist-info/METADATA", "type": "file" }, { - "bom-ref": "5dc311a5c79b1a2a", - "name": "/usr/local/lib/python3.12/dist-packages/tensorboard_data_server-0.7.2.dist-info/top_level.txt", + "bom-ref": "3f488ff16f37f168", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_tileiras-13.1.80.dist-info/RECORD", "type": "file" }, { - "bom-ref": "91ab3013d7cd0ede", - "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm-1.3.0rc25.dist-info/METADATA", + "bom-ref": "938916375c27b8f7", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cuda_tileiras-13.1.80.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0a069658903a75c5", - "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm-1.3.0rc25.dist-info/RECORD", + "bom-ref": "900e47263117d311", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cudnn_frontend-1.27.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "262e01cd06806734", - "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm-1.3.0rc25.dist-info/direct_url.json", + "bom-ref": "bb886748eac86d4d", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cudnn_frontend-1.27.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "32c1e935fa6fd81c", - "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm-1.3.0rc25.dist-info/top_level.txt", + "bom-ref": "f2dcc2578f5e7af3", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cudnn_frontend-1.27.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "7f8572b1a312213e", - "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm/include/trtllm_gen_kernels/fmha/cutlass/python/cutlass_library.egg-info/PKG-INFO", + "bom-ref": "751827187e1b9f73", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl-4.8.0.dev0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "fb4896b606f8d3f1", - "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm/include/trtllm_gen_kernels/fmha/cutlass/python/cutlass_library.egg-info/top_level.txt", + "bom-ref": "172680a7c9812fc8", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl-4.8.0.dev0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "c48f23bac0231e61", - "name": "/usr/local/lib/python3.12/dist-packages/terminado-0.18.1.dist-info/METADATA", + "bom-ref": "85a2028f75f21dec", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl-4.8.0.dev0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "de46d5d2e6beb4b5", - "name": "/usr/local/lib/python3.12/dist-packages/terminado-0.18.1.dist-info/RECORD", + "bom-ref": "41484f88da979fc1", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_base-4.8.0.dev0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7df68bdce9e5b2ef", - "name": "/usr/local/lib/python3.12/dist-packages/threadpoolctl-3.6.0.dist-info/METADATA", + "bom-ref": "d0c885730e4c4183", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_base-4.8.0.dev0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3f78441ff2b6e9fe", - "name": "/usr/local/lib/python3.12/dist-packages/threadpoolctl-3.6.0.dist-info/RECORD", + "bom-ref": "966204d7e288201d", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_base-4.8.0.dev0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e15f9c8134361d06", - "name": "/usr/local/lib/python3.12/dist-packages/tiktoken-0.14.0.dist-info/METADATA", + "bom-ref": "42a33fabcd5853dc", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_core-4.8.0.dev0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e266caecfd497e53", - "name": "/usr/local/lib/python3.12/dist-packages/tiktoken-0.14.0.dist-info/RECORD", + "bom-ref": "8008c35f16a8a0f0", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_core-4.8.0.dev0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "7cfd5f90e235bd87", - "name": "/usr/local/lib/python3.12/dist-packages/tiktoken-0.14.0.dist-info/top_level.txt", + "bom-ref": "11b0903ccef2caa5", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_core-4.8.0.dev0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "86ab16f5c732ff1f", - "name": "/usr/local/lib/python3.12/dist-packages/tinycss2-1.4.0.dist-info/METADATA", + "bom-ref": "1b553ac585de1094", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu12-4.8.0.dev0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "ee3cdd6a47e5145f", - "name": "/usr/local/lib/python3.12/dist-packages/tinycss2-1.4.0.dist-info/RECORD", + "bom-ref": "f4b451c40a8e98c7", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu12-4.8.0.dev0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a3dc0d4b3049dee2", - "name": "/usr/local/lib/python3.12/dist-packages/tokenizers-0.22.2.dist-info/METADATA", + "bom-ref": "ab67d7bcfecdd058", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu12-4.8.0.dev0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "1cd508762689726c", - "name": "/usr/local/lib/python3.12/dist-packages/tokenizers-0.22.2.dist-info/RECORD", + "bom-ref": "8b10978e8e0f423e", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu13-4.8.0.dev0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3531ee0afa9c6a21", - "name": "/usr/local/lib/python3.12/dist-packages/toml-0.10.2.dist-info/METADATA", + "bom-ref": "9c9c258774a5457f", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu13-4.8.0.dev0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "9c0bb8db5bbe2926", - "name": "/usr/local/lib/python3.12/dist-packages/toml-0.10.2.dist-info/RECORD", + "bom-ref": "29972b7a48c2bba5", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_cutlass_dsl_libs_cu13-4.8.0.dev0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "0148204caf7603d9", - "name": "/usr/local/lib/python3.12/dist-packages/toml-0.10.2.dist-info/top_level.txt", + "bom-ref": "844c71a6efc6d710", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_dali_cuda130-2.2.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "76c8d0ef13e76681", - "name": "/usr/local/lib/python3.12/dist-packages/torch-2.12.0a0+5aff3928d8.nv26.5.50603568.dist-info/METADATA", + "bom-ref": "2ac4066d5b4e5c51", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_dali_cuda130-2.2.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cc8d235d77b95ada", - "name": "/usr/local/lib/python3.12/dist-packages/torch-2.12.0a0+5aff3928d8.nv26.5.50603568.dist-info/RECORD", + "bom-ref": "2f6e232552fbcd85", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_dali_cuda130-2.2.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "3ea4c496c5020a2f", - "name": "/usr/local/lib/python3.12/dist-packages/torch-2.12.0a0+5aff3928d8.nv26.5.50603568.dist-info/direct_url.json", + "bom-ref": "974e41787f1dbaa1", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_libnvcomp_cu13-5.2.0.13.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0e5381f1e95bdfb3", - "name": "/usr/local/lib/python3.12/dist-packages/torch-2.12.0a0+5aff3928d8.nv26.5.50603568.dist-info/top_level.txt", + "bom-ref": "4a7f3b71892ee941", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_libnvcomp_cu13-5.2.0.13.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ec11a4d3c78e6b35", + "bom-ref": "9301e21952748533", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_libnvcomp_cu13-5.2.0.13.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "23686fd3ba9499c9", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_matmul_heuristics-0.1.0.27.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "a33291f5c954d9fa", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_matmul_heuristics-0.1.0.27.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "1f086ba772af1ba8", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_matmul_heuristics-0.1.0.27.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "091044b623da5b2e", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_ml_py-13.610.43.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "ea4b43481e86eaeb", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_ml_py-13.610.43.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "b67730d1991b521d", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_ml_py-13.610.43.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "787e688a300a0090", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_modelopt-0.45.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "cb714b1d0be89a46", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_modelopt-0.45.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "3499682876e38ebb", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_modelopt-0.45.0.dist-info/direct_url.json", + "type": "file" + }, + { + "bom-ref": "9791a60d28cce623", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_modelopt-0.45.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "c3247632f511398c", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nccl_cu13-2.30.7.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "857fa4738a9f7387", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nccl_cu13-2.30.7.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "bf82920a550682bf", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nccl_cu13-2.30.7.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "2dd6218e15ff853f", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvimgcodec_cu13-0.8.0.1422.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "bb86aebf352e9366", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvimgcodec_cu13-0.8.0.1422.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "00ff26c598197f80", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvimgcodec_cu13-0.8.0.1422.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "b4de15bed1c8a410", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg-13.2.1.68.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "15db2d71de3e341a", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg-13.2.1.68.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "34fcac45639a34bf", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg-13.2.1.68.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "3dc903201730a109", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg2k_cu13-0.11.0.51.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "7a1e715988b6bd72", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg2k_cu13-0.11.0.51.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "86126bebc31954a0", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvjpeg2k_cu13-0.11.0.51.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "f3e2fcc069b7739d", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvtiff_cu13-0.8.0.82.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "5e6f4e8a420cca23", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvtiff_cu13-0.8.0.82.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "574d0bbcc7865a7b", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_nvtiff_cu13-0.8.0.82.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "2d442d41fab02e85", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_resiliency_ext-0.6.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "15a322c385d2d31f", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_resiliency_ext-0.6.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "8e8741fd63ca779d", + "name": "/usr/local/lib/python3.12/dist-packages/nvidia_resiliency_ext-0.6.0.dist-info/direct_url.json", + "type": "file" + }, + { + "bom-ref": "75c95a729e587d19", + "name": "/usr/local/lib/python3.12/dist-packages/nvtx-0.2.16.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "82fcb81b8e584ca9", + "name": "/usr/local/lib/python3.12/dist-packages/nvtx-0.2.16.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "c07e5861ae15f4d1", + "name": "/usr/local/lib/python3.12/dist-packages/nvtx-0.2.16.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "0a13f94ecbd3df6e", + "name": "/usr/local/lib/python3.12/dist-packages/omegaconf-2.3.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "25ab40a79145a538", + "name": "/usr/local/lib/python3.12/dist-packages/omegaconf-2.3.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "903753874a6631ad", + "name": "/usr/local/lib/python3.12/dist-packages/omegaconf-2.3.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "67b8da8d1fb1eb7e", + "name": "/usr/local/lib/python3.12/dist-packages/onnx-1.21.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "05256a4384fb0368", + "name": "/usr/local/lib/python3.12/dist-packages/onnx-1.21.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "a2697d173523894a", + "name": "/usr/local/lib/python3.12/dist-packages/onnx-1.21.0.dist-info/direct_url.json", + "type": "file" + }, + { + "bom-ref": "357a6dc59e70daaf", + "name": "/usr/local/lib/python3.12/dist-packages/onnx-1.21.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "534cb46aa9f904a6", + "name": "/usr/local/lib/python3.12/dist-packages/onnx_ir-1.0.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "957ca0b8b25d321f", + "name": "/usr/local/lib/python3.12/dist-packages/onnx_ir-1.0.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "3ac42eda283497b6", + "name": "/usr/local/lib/python3.12/dist-packages/onnx_ir-1.0.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "511f0cf4428f96a3", + "name": "/usr/local/lib/python3.12/dist-packages/onnxscript-0.7.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "cd6035d33a4b39fc", + "name": "/usr/local/lib/python3.12/dist-packages/onnxscript-0.7.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "8dee5ed81f65e4fa", + "name": "/usr/local/lib/python3.12/dist-packages/onnxscript-0.7.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "a9a942576ef46aaa", + "name": "/usr/local/lib/python3.12/dist-packages/openai-3.13.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "09b59ee3c13ba568", + "name": "/usr/local/lib/python3.12/dist-packages/openai-3.13.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "1a419462ee266aed", + "name": "/usr/local/lib/python3.12/dist-packages/openai_harmony-0.0.4.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "7f4a35a66805e58f", + "name": "/usr/local/lib/python3.12/dist-packages/openai_harmony-0.0.4.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "e5393bc4ddd5a4e7", + "name": "/usr/local/lib/python3.12/dist-packages/opentelemetry_api-1.44.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "7d31270eccee4031", + "name": "/usr/local/lib/python3.12/dist-packages/opentelemetry_api-1.44.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "7c6ca0700c8f3360", + "name": "/usr/local/lib/python3.12/dist-packages/optimum-2.3.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "4cff58e5674cc8be", + "name": "/usr/local/lib/python3.12/dist-packages/optimum-2.3.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "662e7b30547105d4", + "name": "/usr/local/lib/python3.12/dist-packages/optimum-2.3.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "5692d5cfc5295529", + "name": "/usr/local/lib/python3.12/dist-packages/optree-0.20.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "32cbe0f9ab511faf", + "name": "/usr/local/lib/python3.12/dist-packages/optree-0.20.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "df6f0e1ec8c23dc2", + "name": "/usr/local/lib/python3.12/dist-packages/optree-0.20.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "19f4dbd50ea62faf", + "name": "/usr/local/lib/python3.12/dist-packages/ordered_set-4.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "e87f70508e5895d4", + "name": "/usr/local/lib/python3.12/dist-packages/ordered_set-4.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "75b15b5d19f17e87", + "name": "/usr/local/lib/python3.12/dist-packages/packaging-26.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "beefca1e3070e1bf", + "name": "/usr/local/lib/python3.12/dist-packages/packaging-26.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "5ae254e0b53d76a8", + "name": "/usr/local/lib/python3.12/dist-packages/pandas-3.0.5.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "ad0007c452e4198d", + "name": "/usr/local/lib/python3.12/dist-packages/pandas-3.0.5.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "d15a079d7de2185f", + "name": "/usr/local/lib/python3.12/dist-packages/pandocfilters-1.5.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "1956ba81bc7ba80e", + "name": "/usr/local/lib/python3.12/dist-packages/pandocfilters-1.5.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "8e272b85f508e01a", + "name": "/usr/local/lib/python3.12/dist-packages/pandocfilters-1.5.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "a2bacdda94566071", + "name": "/usr/local/lib/python3.12/dist-packages/parso-0.8.7.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "4ef59be36c44ed81", + "name": "/usr/local/lib/python3.12/dist-packages/parso-0.8.7.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "5d1bb873c7209519", + "name": "/usr/local/lib/python3.12/dist-packages/parso-0.8.7.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "c7101f9f480373d8", + "name": "/usr/local/lib/python3.12/dist-packages/partial_json_parser-0.2.1.1.post7.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "6f3b0020d70a2398", + "name": "/usr/local/lib/python3.12/dist-packages/partial_json_parser-0.2.1.1.post7.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "b1e728a9bf279b68", + "name": "/usr/local/lib/python3.12/dist-packages/patchelf-0.19.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "2e132439d988b9ac", + "name": "/usr/local/lib/python3.12/dist-packages/patchelf-0.19.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "ebe356554ffd9f53", + "name": "/usr/local/lib/python3.12/dist-packages/pathspec-1.1.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "015822cb1c1930a7", + "name": "/usr/local/lib/python3.12/dist-packages/pathspec-1.1.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "d1c1e1e99f7f9aa5", + "name": "/usr/local/lib/python3.12/dist-packages/peft-0.18.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "433a85158a66ae60", + "name": "/usr/local/lib/python3.12/dist-packages/peft-0.18.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "8a431dab69877501", + "name": "/usr/local/lib/python3.12/dist-packages/peft-0.18.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "6e560c1ad8e5ce97", + "name": "/usr/local/lib/python3.12/dist-packages/pexpect-4.9.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "e480c9051958249a", + "name": "/usr/local/lib/python3.12/dist-packages/pexpect-4.9.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "87fdfcfbefe976d7", + "name": "/usr/local/lib/python3.12/dist-packages/pexpect-4.9.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "8a6a16fd0a98e301", + "name": "/usr/local/lib/python3.12/dist-packages/pillow-12.3.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "79876539d248be5c", + "name": "/usr/local/lib/python3.12/dist-packages/pillow-12.3.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "0eb4d16c33699e6d", + "name": "/usr/local/lib/python3.12/dist-packages/pillow-12.3.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "0636979a65dbcb0a", + "name": "/usr/local/lib/python3.12/dist-packages/pip-26.2.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "7ff4ae035c0ea3c6", + "name": "/usr/local/lib/python3.12/dist-packages/pip-26.2.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "9614996f449c716f", + "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/t32.exe", + "type": "file" + }, + { + "bom-ref": "9e3dd8d46302c157", + "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/t64-arm.exe", + "type": "file" + }, + { + "bom-ref": "110ec61017ed5747", + "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/t64.exe", + "type": "file" + }, + { + "bom-ref": "76f7fc31815e6180", + "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/w32.exe", + "type": "file" + }, + { + "bom-ref": "2831f56690fdb737", + "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/w64-arm.exe", + "type": "file" + }, + { + "bom-ref": "1299a9206bfede6d", + "name": "/usr/local/lib/python3.12/dist-packages/pip/_vendor/distlib/w64.exe", + "type": "file" + }, + { + "bom-ref": "9f6a21e9c0217604", + "name": "/usr/local/lib/python3.12/dist-packages/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/PKG-INFO", + "type": "file" + }, + { + "bom-ref": "474cc92a3f65399e", + "name": "/usr/local/lib/python3.12/dist-packages/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/top_level.txt", + "type": "file" + }, + { + "bom-ref": "d5f08cca750ea763", + "name": "/usr/local/lib/python3.12/dist-packages/platformdirs-4.11.3.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "06c779fce9b7ab2a", + "name": "/usr/local/lib/python3.12/dist-packages/platformdirs-4.11.3.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "115310a030274d93", + "name": "/usr/local/lib/python3.12/dist-packages/plotly-7.0.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "00bc394af991c4e9", + "name": "/usr/local/lib/python3.12/dist-packages/plotly-7.0.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "2852a46113416e95", + "name": "/usr/local/lib/python3.12/dist-packages/plotly/labextension/package.json", + "type": "file" + }, + { + "bom-ref": "3bd71a141e43e5f4", + "name": "/usr/local/lib/python3.12/dist-packages/polygraphy-0.53.4.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "70e532c5c715c0cc", + "name": "/usr/local/lib/python3.12/dist-packages/polygraphy-0.53.4.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "caa74b55dc9c6ffe", + "name": "/usr/local/lib/python3.12/dist-packages/polygraphy-0.53.4.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "cd6abbe348801203", + "name": "/usr/local/lib/python3.12/dist-packages/pooch-1.9.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "520a71e2e525ae85", + "name": "/usr/local/lib/python3.12/dist-packages/pooch-1.9.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "648070f04eff67c5", + "name": "/usr/local/lib/python3.12/dist-packages/pooch-1.9.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "3e9e2124ce4de666", + "name": "/usr/local/lib/python3.12/dist-packages/prometheus_client-0.26.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "08cd07f2992b6138", + "name": "/usr/local/lib/python3.12/dist-packages/prometheus_client-0.26.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "f6a9ac85891cf7c1", + "name": "/usr/local/lib/python3.12/dist-packages/prometheus_client-0.26.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "7081a1a75f145236", + "name": "/usr/local/lib/python3.12/dist-packages/prometheus_fastapi_instrumentator-8.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "9e1f9b4d9c1c442f", + "name": "/usr/local/lib/python3.12/dist-packages/prometheus_fastapi_instrumentator-8.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "cc3ae76f6927680c", + "name": "/usr/local/lib/python3.12/dist-packages/prompt_toolkit-3.0.53.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "466da155b9186001", + "name": "/usr/local/lib/python3.12/dist-packages/prompt_toolkit-3.0.53.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "c68b575045e129a5", + "name": "/usr/local/lib/python3.12/dist-packages/prompt_toolkit-3.0.53.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "d55a38ad1ae5fae2", + "name": "/usr/local/lib/python3.12/dist-packages/propcache-0.5.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "b3023940cedf65ea", + "name": "/usr/local/lib/python3.12/dist-packages/propcache-0.5.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "c325f5a19839856b", + "name": "/usr/local/lib/python3.12/dist-packages/propcache-0.5.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "2482576fced1960e", + "name": "/usr/local/lib/python3.12/dist-packages/proto_plus-1.28.4.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "00b0b5433b89c561", + "name": "/usr/local/lib/python3.12/dist-packages/proto_plus-1.28.4.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "c870d8364124423c", + "name": "/usr/local/lib/python3.12/dist-packages/proto_plus-1.28.4.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "89c100e8f15eaa04", + "name": "/usr/local/lib/python3.12/dist-packages/protobuf-6.33.6.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "19562f540dc0d6d2", + "name": "/usr/local/lib/python3.12/dist-packages/protobuf-6.33.6.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "a093fc2729a95e0b", + "name": "/usr/local/lib/python3.12/dist-packages/psutil-7.2.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "6b80cf1d1906f648", + "name": "/usr/local/lib/python3.12/dist-packages/psutil-7.2.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "23c322e8d889ff9d", + "name": "/usr/local/lib/python3.12/dist-packages/psutil-7.2.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "dd653781f50c1ebc", + "name": "/usr/local/lib/python3.12/dist-packages/ptyprocess-0.7.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "1c169ff0f90306f8", + "name": "/usr/local/lib/python3.12/dist-packages/ptyprocess-0.7.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "8b60b1743c5f83eb", + "name": "/usr/local/lib/python3.12/dist-packages/pulp-3.3.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "e7f60f9818530954", + "name": "/usr/local/lib/python3.12/dist-packages/pulp-3.3.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "0c4a5f8735230434", + "name": "/usr/local/lib/python3.12/dist-packages/pulp-3.3.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "0e64c310fa8d81fd", + "name": "/usr/local/lib/python3.12/dist-packages/pulp/solverdir/cbc/win/i32/cbc.exe", + "type": "file" + }, + { + "bom-ref": "d68b37bf1b8cd4ad", + "name": "/usr/local/lib/python3.12/dist-packages/pulp/solverdir/cbc/win/i64/cbc.exe", + "type": "file" + }, + { + "bom-ref": "9332afd7b8113c73", + "name": "/usr/local/lib/python3.12/dist-packages/pure_eval-0.2.3.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "5b1e2fbd3e5508b0", + "name": "/usr/local/lib/python3.12/dist-packages/pure_eval-0.2.3.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "547108034666156a", + "name": "/usr/local/lib/python3.12/dist-packages/pure_eval-0.2.3.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "07989210b6d742b9", + "name": "/usr/local/lib/python3.12/dist-packages/pyarrow-25.0.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "2000e086688076df", + "name": "/usr/local/lib/python3.12/dist-packages/pyarrow-25.0.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "9c6af2968d50699b", + "name": "/usr/local/lib/python3.12/dist-packages/pyasn1-0.6.4.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "4fb5526a99aa654b", + "name": "/usr/local/lib/python3.12/dist-packages/pyasn1-0.6.4.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "bdf1cf3c4b73ff50", + "name": "/usr/local/lib/python3.12/dist-packages/pyasn1-0.6.4.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "217e7cd943a34421", + "name": "/usr/local/lib/python3.12/dist-packages/pyasn1_modules-0.4.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "5eb280958b875c50", + "name": "/usr/local/lib/python3.12/dist-packages/pyasn1_modules-0.4.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "ec08a7789c1dc111", + "name": "/usr/local/lib/python3.12/dist-packages/pyasn1_modules-0.4.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "f17bd740dc9cd648", + "name": "/usr/local/lib/python3.12/dist-packages/pybind11-3.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "5e164dc47f03cf13", + "name": "/usr/local/lib/python3.12/dist-packages/pybind11-3.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "22d13d140e76fece", + "name": "/usr/local/lib/python3.12/dist-packages/pycocotools-2.0+nv0.8.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "5954d6f5ada284d0", + "name": "/usr/local/lib/python3.12/dist-packages/pycocotools-2.0+nv0.8.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "5759dcb68682c800", + "name": "/usr/local/lib/python3.12/dist-packages/pycocotools-2.0+nv0.8.1.dist-info/direct_url.json", + "type": "file" + }, + { + "bom-ref": "09a3f7f035a00be5", + "name": "/usr/local/lib/python3.12/dist-packages/pycocotools-2.0+nv0.8.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "782976e37378ac58", + "name": "/usr/local/lib/python3.12/dist-packages/pycountry-26.2.16.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "68af606a1c60e265", + "name": "/usr/local/lib/python3.12/dist-packages/pycountry-26.2.16.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "5fdffb6f3e045f20", + "name": "/usr/local/lib/python3.12/dist-packages/pycparser-3.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "38fb96378aab7a94", + "name": "/usr/local/lib/python3.12/dist-packages/pycparser-3.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "c4e44019791b4dc3", + "name": "/usr/local/lib/python3.12/dist-packages/pycparser-3.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "0918c85b4e42ada0", + "name": "/usr/local/lib/python3.12/dist-packages/pycryptodomex-3.23.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "953485f9b88333a5", + "name": "/usr/local/lib/python3.12/dist-packages/pycryptodomex-3.23.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "c18cc60c9d45630d", + "name": "/usr/local/lib/python3.12/dist-packages/pycryptodomex-3.23.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "6b68fc870703e712", + "name": "/usr/local/lib/python3.12/dist-packages/pydantic-2.13.4.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "2eeeccce60cdd4d1", + "name": "/usr/local/lib/python3.12/dist-packages/pydantic-2.13.4.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "6ca9251710f7bae3", + "name": "/usr/local/lib/python3.12/dist-packages/pydantic_core-2.46.4.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "c1d0f0cfdb4ca279", + "name": "/usr/local/lib/python3.12/dist-packages/pydantic_core-2.46.4.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "ddf7d38702bbf92f", + "name": "/usr/local/lib/python3.12/dist-packages/pydantic_extra_types-2.11.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "a5bca644e37c3364", + "name": "/usr/local/lib/python3.12/dist-packages/pydantic_extra_types-2.11.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "b54c7eeaef4dd4f4", + "name": "/usr/local/lib/python3.12/dist-packages/pydantic_settings-2.15.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "90e5e240e3c2063c", + "name": "/usr/local/lib/python3.12/dist-packages/pydantic_settings-2.15.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "c2d9616510229ad8", + "name": "/usr/local/lib/python3.12/dist-packages/pygments-2.21.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "771ea4a04fc83c08", + "name": "/usr/local/lib/python3.12/dist-packages/pygments-2.21.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "20d9387d56805cd6", + "name": "/usr/local/lib/python3.12/dist-packages/pyjwt-2.14.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "ec8424349b5362e4", + "name": "/usr/local/lib/python3.12/dist-packages/pyjwt-2.14.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "647ccc2fcc243d09", + "name": "/usr/local/lib/python3.12/dist-packages/pyjwt-2.14.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "9d7b39761e07f9d8", + "name": "/usr/local/lib/python3.12/dist-packages/pynvvideocodec-2.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "c0f89482b9883bd8", + "name": "/usr/local/lib/python3.12/dist-packages/pynvvideocodec-2.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "ac075c009ec0d033", + "name": "/usr/local/lib/python3.12/dist-packages/pynvvideocodec-2.1.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "541892a8de7d0e57", + "name": "/usr/local/lib/python3.12/dist-packages/pyparsing-3.3.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "2c9f0ce3adc627a3", + "name": "/usr/local/lib/python3.12/dist-packages/pyparsing-3.3.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "257e95c8a620ed26", + "name": "/usr/local/lib/python3.12/dist-packages/pyproject_hooks-1.2.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "9d06495c92cbfd5e", + "name": "/usr/local/lib/python3.12/dist-packages/pyproject_hooks-1.2.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "9b669ac29a0f6a56", + "name": "/usr/local/lib/python3.12/dist-packages/python_dateutil-2.9.0.post0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "809b3d5d05d946d5", + "name": "/usr/local/lib/python3.12/dist-packages/python_dateutil-2.9.0.post0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "787b477494932b89", + "name": "/usr/local/lib/python3.12/dist-packages/python_dateutil-2.9.0.post0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "f72ecd74241a9c8e", + "name": "/usr/local/lib/python3.12/dist-packages/python_dotenv-1.2.3.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "07ea536266ad357e", + "name": "/usr/local/lib/python3.12/dist-packages/python_dotenv-1.2.3.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "975e7f6667ddb8a2", + "name": "/usr/local/lib/python3.12/dist-packages/python_dotenv-1.2.3.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "47e6a123fa96ae9e", + "name": "/usr/local/lib/python3.12/dist-packages/python_hostlist-2.3.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "eb2b369de33b7679", + "name": "/usr/local/lib/python3.12/dist-packages/python_hostlist-2.3.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "6048a52929d9f84d", + "name": "/usr/local/lib/python3.12/dist-packages/python_hostlist-2.3.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "d09b0c9aeefce795", + "name": "/usr/local/lib/python3.12/dist-packages/python_json_logger-4.2.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "d9ac17dada382556", + "name": "/usr/local/lib/python3.12/dist-packages/python_json_logger-4.2.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "2069295617d69c30", + "name": "/usr/local/lib/python3.12/dist-packages/python_json_logger-4.2.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "8298a180298e596c", + "name": "/usr/local/lib/python3.12/dist-packages/python_multipart-0.0.32.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "14c582c0e71e1795", + "name": "/usr/local/lib/python3.12/dist-packages/python_multipart-0.0.32.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "dcd6f03f8dcadab9", + "name": "/usr/local/lib/python3.12/dist-packages/pytokens-0.4.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "9127685a4186873e", + "name": "/usr/local/lib/python3.12/dist-packages/pytokens-0.4.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "94212e73de0b7dd1", + "name": "/usr/local/lib/python3.12/dist-packages/pytokens-0.4.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "1579776c53f5b01f", + "name": "/usr/local/lib/python3.12/dist-packages/pyzmq-27.2.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "aa4f1ca685318877", + "name": "/usr/local/lib/python3.12/dist-packages/pyzmq-27.2.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "3251d3a0c88e9a78", + "name": "/usr/local/lib/python3.12/dist-packages/quack_kernels-0.5.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "84c4b33e28cd9fb0", + "name": "/usr/local/lib/python3.12/dist-packages/quack_kernels-0.5.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "4a15a61ebb4d998b", + "name": "/usr/local/lib/python3.12/dist-packages/quack_kernels-0.5.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "34cecfc685bf428e", + "name": "/usr/local/lib/python3.12/dist-packages/referencing-0.37.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "ad72c9784dc98dd4", + "name": "/usr/local/lib/python3.12/dist-packages/referencing-0.37.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "46a257d217a276ee", + "name": "/usr/local/lib/python3.12/dist-packages/regex-2026.7.19.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "48ae119069ed17df", + "name": "/usr/local/lib/python3.12/dist-packages/regex-2026.7.19.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "b95b589c81594e69", + "name": "/usr/local/lib/python3.12/dist-packages/regex-2026.7.19.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "e495215b66f01bc7", + "name": "/usr/local/lib/python3.12/dist-packages/requests-2.34.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "c87a7abef9cbae32", + "name": "/usr/local/lib/python3.12/dist-packages/requests-2.34.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "f87770a34ab83fa9", + "name": "/usr/local/lib/python3.12/dist-packages/requests-2.34.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "89c3bfecb0f46be5", + "name": "/usr/local/lib/python3.12/dist-packages/rfc3339_validator-0.1.4.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "38049b7f497b5a9f", + "name": "/usr/local/lib/python3.12/dist-packages/rfc3339_validator-0.1.4.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "e8fae7e2f1196fd9", + "name": "/usr/local/lib/python3.12/dist-packages/rfc3339_validator-0.1.4.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "b8b137ab11c79e50", + "name": "/usr/local/lib/python3.12/dist-packages/rfc3986_validator-0.1.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "517c0be104005bfc", + "name": "/usr/local/lib/python3.12/dist-packages/rfc3986_validator-0.1.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "4dd2668a22382667", + "name": "/usr/local/lib/python3.12/dist-packages/rfc3986_validator-0.1.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "715709960e4ad52a", + "name": "/usr/local/lib/python3.12/dist-packages/rfc3987_syntax-1.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "1470c991b777376d", + "name": "/usr/local/lib/python3.12/dist-packages/rfc3987_syntax-1.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "f9536f6b609b66b9", + "name": "/usr/local/lib/python3.12/dist-packages/rich-15.0.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "6af8b9b6b3af3bdf", + "name": "/usr/local/lib/python3.12/dist-packages/rich-15.0.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "180cb544cf9b6ebb", + "name": "/usr/local/lib/python3.12/dist-packages/rpds_py-2026.6.3.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "50720f4e3874ef6a", + "name": "/usr/local/lib/python3.12/dist-packages/rpds_py-2026.6.3.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "879b5c24070b9245", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer-0.16.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "894c5c3693753128", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer-0.16.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "20eb0e55a9d99a4b", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer-0.16.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "adaf34676beb235d", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_azure-0.16.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "a8590efd056fb4e3", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_azure-0.16.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "6b071c5f3731ce56", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_azure-0.16.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "2413eb11d6ed881d", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_gcs-0.16.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "5ab7bd5715afa34c", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_gcs-0.16.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "3055b2f29820f435", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_gcs-0.16.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "6ca9336d0452f83d", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_s3-0.16.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "4394f630448a1081", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_s3-0.16.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "07cbfd2d73c52890", + "name": "/usr/local/lib/python3.12/dist-packages/runai_model_streamer_s3-0.16.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "d09dc8f6c090a406", + "name": "/usr/local/lib/python3.12/dist-packages/s3transfer-0.19.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "1c6e588dd6edea38", + "name": "/usr/local/lib/python3.12/dist-packages/s3transfer-0.19.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "addb390afaea23df", + "name": "/usr/local/lib/python3.12/dist-packages/s3transfer-0.19.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "76462c177d340cde", + "name": "/usr/local/lib/python3.12/dist-packages/safetensors-0.8.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "956f56aeec061feb", + "name": "/usr/local/lib/python3.12/dist-packages/safetensors-0.8.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "6297669511fbd07f", + "name": "/usr/local/lib/python3.12/dist-packages/scikit_learn-1.9.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "019546bf8692ae19", + "name": "/usr/local/lib/python3.12/dist-packages/scikit_learn-1.9.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "c72d93c1480a0107", + "name": "/usr/local/lib/python3.12/dist-packages/scipy-1.18.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "46148f5747abcf59", + "name": "/usr/local/lib/python3.12/dist-packages/scipy-1.18.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "978efd49dc6bac20", + "name": "/usr/local/lib/python3.12/dist-packages/send2trash-2.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "cbf0378f06ab3a9d", + "name": "/usr/local/lib/python3.12/dist-packages/send2trash-2.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "639359148655c1fc", + "name": "/usr/local/lib/python3.12/dist-packages/send2trash-2.1.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "e7bdc987d12afe7d", + "name": "/usr/local/lib/python3.12/dist-packages/sentencepiece-0.2.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "6fb2030e378383af", + "name": "/usr/local/lib/python3.12/dist-packages/sentencepiece-0.2.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "94f2e705affecf00", + "name": "/usr/local/lib/python3.12/dist-packages/sentencepiece-0.2.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "862677be84a1dfe2", + "name": "/usr/local/lib/python3.12/dist-packages/sentry_sdk-2.68.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "3866ddd17f2ad709", + "name": "/usr/local/lib/python3.12/dist-packages/sentry_sdk-2.68.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "0ee943ddf2086752", + "name": "/usr/local/lib/python3.12/dist-packages/sentry_sdk-2.68.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "cfb23bcb5b3eaf6b", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools-79.0.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "261b8d2da235b2a0", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools-79.0.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "205b93028c0f33b9", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools-79.0.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "da6b351aa278ed6b", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools-81.0.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "f0ee458abda533cc", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools-81.0.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "2ba28f7a993d8414", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools-81.0.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "4f33a5851bc6fe9e", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "31aa1b5d4d648daf", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "f33178d23f867075", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "b307a03d249613b7", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "f0705e4307ba7984", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "7a4f9b6af17b8d76", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "5376364c12e003ae", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "18820e4b2366c51c", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "3fe5fd8ac68f632b", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "b257da5b7f1d73ff", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "5a7354d3bb437b8b", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "24aae4972cfcfd85", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "5ad5657d09d3efbe", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/inflect-7.3.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "eec23bfc27b1eaef", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/inflect-7.3.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "97a2e5c2c560e005", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/inflect-7.3.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "578335b00a3ca052", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "226c5409b56faa8c", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "4169dd3e15a028e4", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "08d42af75330055b", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "d78f4a30a35cd3e9", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "658b66277816e472", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "6173a7cdcf9b9d47", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "528922234f814761", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "8416506c8966a215", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "76d4b8cd2efa91ec", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-4.0.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "6db0d6b6fe1afc59", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-4.0.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "4a78f599073659ab", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco.text-4.0.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "d567c2be9b846905", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_context-6.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "7f3c05bdd2f02dd0", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_context-6.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "817ca3ef4192cdca", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_context-6.1.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "a9a3be97381029dd", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "6a5c880781236c1d", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "690c04050d0fd6b5", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "87abf64048b74175", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/more_itertools-10.3.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "617fa03d63fb704a", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/more_itertools-10.3.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "42e0e760309d1c34", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/more_itertools-10.8.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "88f79fede05cf67b", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/more_itertools-10.8.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "af7393c6861b6169", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/packaging-24.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "31a7e399da04d5e6", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/packaging-24.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "76817f043fa92f87", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/packaging-26.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "2f3445c38339e003", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/packaging-26.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "f197818d5ac8f408", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/platformdirs-4.2.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "d78e6c46a202860c", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/platformdirs-4.2.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "9c0ad3eb45f2a559", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/platformdirs-4.4.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "7a0f6010cc3747f3", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/platformdirs-4.4.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "4a5d20dd81517dff", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/tomli-2.0.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "049cfbbceacabb1e", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/tomli-2.0.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "40deb8f5d06be402", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/tomli-2.4.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "cc665df533f4cc1a", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/tomli-2.4.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "3eafc53dbce210a8", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "93731267dd5e9b3d", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "10209a1238602225", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "1bec765cbd9a4ff9", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/typing_extensions-4.12.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "6548cba44a18367d", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/typing_extensions-4.12.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "95d621a158e3f1e0", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.19.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "6fe4cd57f2cc78e0", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.19.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "8be38a8eee2b2989", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.19.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "b6ae8a9e63994ead", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.23.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "27efa931a3cd45d6", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.23.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "d4282d804b6ac7b7", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/_vendor/zipp-3.23.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "cf2becf19e248d45", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/cli-32.exe", + "type": "file" + }, + { + "bom-ref": "6b3d265af8ded347", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/cli-64.exe", + "type": "file" + }, + { + "bom-ref": "1110a77801280fe4", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/cli-arm64.exe", + "type": "file" + }, + { + "bom-ref": "73ed094cb72d1b44", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/cli.exe", + "type": "file" + }, + { + "bom-ref": "86e6bc8d786f135b", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/gui-32.exe", + "type": "file" + }, + { + "bom-ref": "98ce1bd326bd409a", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/gui-64.exe", + "type": "file" + }, + { + "bom-ref": "2fb79a907e95b081", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/gui-arm64.exe", + "type": "file" + }, + { + "bom-ref": "a1c747da4755926d", + "name": "/usr/local/lib/python3.12/dist-packages/setuptools/gui.exe", + "type": "file" + }, + { + "bom-ref": "9fc60cd858a17c04", + "name": "/usr/local/lib/python3.12/dist-packages/shellingham-1.5.4.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "a0bdc9d3fc013278", + "name": "/usr/local/lib/python3.12/dist-packages/shellingham-1.5.4.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "b4c5ff22f91bb370", + "name": "/usr/local/lib/python3.12/dist-packages/shellingham-1.5.4.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "530ca85d974f4c20", + "name": "/usr/local/lib/python3.12/dist-packages/six-1.16.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "c43fac7f44e36db2", + "name": "/usr/local/lib/python3.12/dist-packages/six-1.16.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "e729772ce559cebf", + "name": "/usr/local/lib/python3.12/dist-packages/six-1.16.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "510b05c90125f893", + "name": "/usr/local/lib/python3.12/dist-packages/smmap-5.0.3.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "05eb41151e4a4e92", + "name": "/usr/local/lib/python3.12/dist-packages/smmap-5.0.3.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "343375ee4f1ebdab", + "name": "/usr/local/lib/python3.12/dist-packages/smmap-5.0.3.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "e67948913aabd065", + "name": "/usr/local/lib/python3.12/dist-packages/sniffio-1.3.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "244b56d51723b311", + "name": "/usr/local/lib/python3.12/dist-packages/sniffio-1.3.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "36b73be2e39e9bc2", + "name": "/usr/local/lib/python3.12/dist-packages/sniffio-1.3.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "658855a2760aaf88", + "name": "/usr/local/lib/python3.12/dist-packages/soundfile-0.14.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "3c5bbbf7c03e8803", + "name": "/usr/local/lib/python3.12/dist-packages/soundfile-0.14.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "c172cd9b259d50d7", + "name": "/usr/local/lib/python3.12/dist-packages/soundfile-0.14.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "716e2d52895dedb8", + "name": "/usr/local/lib/python3.12/dist-packages/soupsieve-2.9.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "8f5b13ea239c0a32", + "name": "/usr/local/lib/python3.12/dist-packages/soupsieve-2.9.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "2e59aca3713c392b", + "name": "/usr/local/lib/python3.12/dist-packages/soxr-1.1.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "19e19857a7d8add9", + "name": "/usr/local/lib/python3.12/dist-packages/soxr-1.1.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "49619f983dba8a3a", + "name": "/usr/local/lib/python3.12/dist-packages/spmd_types-0.2.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "1a020be8344a2f8e", + "name": "/usr/local/lib/python3.12/dist-packages/spmd_types-0.2.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "782ef6bc4857c741", + "name": "/usr/local/lib/python3.12/dist-packages/spmd_types-0.2.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "8a65fb876d458a7d", + "name": "/usr/local/lib/python3.12/dist-packages/sse_starlette-3.4.11.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "88cbf07c39b3afc0", + "name": "/usr/local/lib/python3.12/dist-packages/sse_starlette-3.4.11.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "1d0fee5d654b0401", + "name": "/usr/local/lib/python3.12/dist-packages/sse_starlette-3.4.11.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "44b600f6743e6b0b", + "name": "/usr/local/lib/python3.12/dist-packages/stack_data-0.6.3.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "117ef192938b0e24", + "name": "/usr/local/lib/python3.12/dist-packages/stack_data-0.6.3.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "e0ef25034ad71b45", + "name": "/usr/local/lib/python3.12/dist-packages/stack_data-0.6.3.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "995ac3613a42a114", + "name": "/usr/local/lib/python3.12/dist-packages/starlette-1.6.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "62933d053b8450bd", + "name": "/usr/local/lib/python3.12/dist-packages/starlette-1.6.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "f71dab2032091884", + "name": "/usr/local/lib/python3.12/dist-packages/sympy-1.14.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "e2faf3acd9a61373", + "name": "/usr/local/lib/python3.12/dist-packages/sympy-1.14.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "48e5f8f36ef09099", + "name": "/usr/local/lib/python3.12/dist-packages/sympy-1.14.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "01a32adeb084ce8a", + "name": "/usr/local/lib/python3.12/dist-packages/tabulate-0.10.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "3f7a818ffc4dc39e", + "name": "/usr/local/lib/python3.12/dist-packages/tabulate-0.10.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "44a63fb74dc2762d", + "name": "/usr/local/lib/python3.12/dist-packages/tabulate-0.10.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "4f371753f1d88616", + "name": "/usr/local/lib/python3.12/dist-packages/tbb-2021.13.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "e4102245777f6269", + "name": "/usr/local/lib/python3.12/dist-packages/tbb-2021.13.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "6487268aeda6138c", + "name": "/usr/local/lib/python3.12/dist-packages/tbb-2021.13.1.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "cc7d795614df3dbd", + "name": "/usr/local/lib/python3.12/dist-packages/tensorboard-2.20.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "dd9bb0023987f3de", + "name": "/usr/local/lib/python3.12/dist-packages/tensorboard-2.20.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "8d176e570b75dc57", + "name": "/usr/local/lib/python3.12/dist-packages/tensorboard-2.20.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "9fe77f18d3bcc668", + "name": "/usr/local/lib/python3.12/dist-packages/tensorboard_data_server-0.7.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "2a36bfb2e1651cec", + "name": "/usr/local/lib/python3.12/dist-packages/tensorboard_data_server-0.7.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "f9859b332e9d395d", + "name": "/usr/local/lib/python3.12/dist-packages/tensorboard_data_server-0.7.2.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "1caa8b1b96ba4020", + "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm-1.3.0rc27.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "ff7f4d811a7a34e5", + "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm-1.3.0rc27.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "952a88c046fa2ce5", + "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm-1.3.0rc27.dist-info/direct_url.json", + "type": "file" + }, + { + "bom-ref": "f805c5357b918c03", + "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm-1.3.0rc27.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "3d0795c6b2189ae9", + "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm/include/trtllm_gen_kernels/fmha/cutlass/python/cutlass_library.egg-info/PKG-INFO", + "type": "file" + }, + { + "bom-ref": "c2ca5f76d564bb1e", + "name": "/usr/local/lib/python3.12/dist-packages/tensorrt_llm/include/trtllm_gen_kernels/fmha/cutlass/python/cutlass_library.egg-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "5869ec71193aba72", + "name": "/usr/local/lib/python3.12/dist-packages/terminado-0.18.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "691ca41112fa9aba", + "name": "/usr/local/lib/python3.12/dist-packages/terminado-0.18.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "553bc0a5652f0d10", + "name": "/usr/local/lib/python3.12/dist-packages/threadpoolctl-3.6.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "d881c082dd4b0b79", + "name": "/usr/local/lib/python3.12/dist-packages/threadpoolctl-3.6.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "79559d8d8f134775", + "name": "/usr/local/lib/python3.12/dist-packages/tiktoken-0.14.0.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "c07a829205a5c5ac", + "name": "/usr/local/lib/python3.12/dist-packages/tiktoken-0.14.0.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "6e20b8bfb72cfabc", + "name": "/usr/local/lib/python3.12/dist-packages/tiktoken-0.14.0.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "d04eda9d73f592a8", + "name": "/usr/local/lib/python3.12/dist-packages/tinycss2-1.5.1.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "5af6583aa66e8844", + "name": "/usr/local/lib/python3.12/dist-packages/tinycss2-1.5.1.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "d76780e35e52cff1", + "name": "/usr/local/lib/python3.12/dist-packages/tokenizers-0.22.2.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "532c9d772dae051f", + "name": "/usr/local/lib/python3.12/dist-packages/tokenizers-0.22.2.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "95a588f77ee0028f", + "name": "/usr/local/lib/python3.12/dist-packages/torch-2.14.0a0+4fdf77b940.nv26.8.63802676.dist-info/METADATA", + "type": "file" + }, + { + "bom-ref": "8868aaefd530827a", + "name": "/usr/local/lib/python3.12/dist-packages/torch-2.14.0a0+4fdf77b940.nv26.8.63802676.dist-info/RECORD", + "type": "file" + }, + { + "bom-ref": "4c2425ff121252c7", + "name": "/usr/local/lib/python3.12/dist-packages/torch-2.14.0a0+4fdf77b940.nv26.8.63802676.dist-info/direct_url.json", + "type": "file" + }, + { + "bom-ref": "4921aaf9328bc27e", + "name": "/usr/local/lib/python3.12/dist-packages/torch-2.14.0a0+4fdf77b940.nv26.8.63802676.dist-info/top_level.txt", + "type": "file" + }, + { + "bom-ref": "a55674828a6b0002", "name": "/usr/local/lib/python3.12/dist-packages/torch_c_dlpack_ext-0.1.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "41dbe8c2a62af527", + "bom-ref": "875d27ef4f6a5980", "name": "/usr/local/lib/python3.12/dist-packages/torch_c_dlpack_ext-0.1.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b61bc4a60775a01b", + "bom-ref": "f7c517f6fa011e64", "name": "/usr/local/lib/python3.12/dist-packages/torch_c_dlpack_ext-0.1.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6bdd2b2ea1d7c4ff", - "name": "/usr/local/lib/python3.12/dist-packages/torch_tensorrt-2.12.0a0.dist-info/METADATA", + "bom-ref": "5ab971501c5a43b8", + "name": "/usr/local/lib/python3.12/dist-packages/torch_tensorrt-2.14.0a0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "acdb3dc4cf8123ab", - "name": "/usr/local/lib/python3.12/dist-packages/torch_tensorrt-2.12.0a0.dist-info/RECORD", + "bom-ref": "a6fe0f17bb317a9c", + "name": "/usr/local/lib/python3.12/dist-packages/torch_tensorrt-2.14.0a0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ae8b3532c18ef977", - "name": "/usr/local/lib/python3.12/dist-packages/torch_tensorrt-2.12.0a0.dist-info/direct_url.json", + "bom-ref": "eb995e699a7dda82", + "name": "/usr/local/lib/python3.12/dist-packages/torch_tensorrt-2.14.0a0.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "89a5b628950a1ed8", - "name": "/usr/local/lib/python3.12/dist-packages/torch_tensorrt-2.12.0a0.dist-info/top_level.txt", + "bom-ref": "6f4958acd2ca6721", + "name": "/usr/local/lib/python3.12/dist-packages/torch_tensorrt-2.14.0a0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b597f5d258871e4b", + "bom-ref": "593c52d614d43804", "name": "/usr/local/lib/python3.12/dist-packages/torchao-0.15.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d07496b3cbc9f7b9", + "bom-ref": "62fac8db98302452", "name": "/usr/local/lib/python3.12/dist-packages/torchao-0.15.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "a723dd93c866c191", + "bom-ref": "9c713a5c467f123e", "name": "/usr/local/lib/python3.12/dist-packages/torchao-0.15.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "96d22e76ee0a17f4", + "bom-ref": "4d2ea9330addefd6", "name": "/usr/local/lib/python3.12/dist-packages/torchdata-0.11.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "6f05afde03e56ba8", + "bom-ref": "d8b2844efe796bee", "name": "/usr/local/lib/python3.12/dist-packages/torchdata-0.11.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "dc376fb5f3d34b15", + "bom-ref": "fe7a185d2e2a5d5f", "name": "/usr/local/lib/python3.12/dist-packages/torchdata-0.11.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6552368d3c4f7a0e", - "name": "/usr/local/lib/python3.12/dist-packages/torchtitan-0.2.2+gita00ef7df.dist-info/METADATA", + "bom-ref": "3a7431419f132820", + "name": "/usr/local/lib/python3.12/dist-packages/torchtitan-0.2.2+gitbadf21a1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "cab8a8399b1df6a6", - "name": "/usr/local/lib/python3.12/dist-packages/torchtitan-0.2.2+gita00ef7df.dist-info/RECORD", + "bom-ref": "4694a187b0ad5a99", + "name": "/usr/local/lib/python3.12/dist-packages/torchtitan-0.2.2+gitbadf21a1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6d551c4a94e53199", - "name": "/usr/local/lib/python3.12/dist-packages/torchtitan-0.2.2+gita00ef7df.dist-info/direct_url.json", + "bom-ref": "4e15d96c6eaac3a3", + "name": "/usr/local/lib/python3.12/dist-packages/torchtitan-0.2.2+gitbadf21a1.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "8a87a88c358e919a", - "name": "/usr/local/lib/python3.12/dist-packages/torchtitan-0.2.2+gita00ef7df.dist-info/top_level.txt", + "bom-ref": "f9e858c70c0f639f", + "name": "/usr/local/lib/python3.12/dist-packages/torchtitan-0.2.2+gitbadf21a1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "9dd38e16396ae9a3", - "name": "/usr/local/lib/python3.12/dist-packages/torchvision-0.27.0a0+6214cb20.nv26.5.50603568.dist-info/METADATA", + "bom-ref": "9f15153ecaffd8a2", + "name": "/usr/local/lib/python3.12/dist-packages/torchvision-0.29.0a0+0bc41e67.nv26.8.63802676.dist-info/METADATA", "type": "file" }, { - "bom-ref": "fd7c66e293817439", - "name": "/usr/local/lib/python3.12/dist-packages/torchvision-0.27.0a0+6214cb20.nv26.5.50603568.dist-info/RECORD", + "bom-ref": "ba027de829924ef4", + "name": "/usr/local/lib/python3.12/dist-packages/torchvision-0.29.0a0+0bc41e67.nv26.8.63802676.dist-info/RECORD", "type": "file" }, { - "bom-ref": "38fafb0e8c6b05fe", - "name": "/usr/local/lib/python3.12/dist-packages/torchvision-0.27.0a0+6214cb20.nv26.5.50603568.dist-info/direct_url.json", + "bom-ref": "e648dff6ab0708c5", + "name": "/usr/local/lib/python3.12/dist-packages/torchvision-0.29.0a0+0bc41e67.nv26.8.63802676.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "00b00816c65a4816", - "name": "/usr/local/lib/python3.12/dist-packages/torchvision-0.27.0a0+6214cb20.nv26.5.50603568.dist-info/top_level.txt", + "bom-ref": "d03f2d6e42ed69d6", + "name": "/usr/local/lib/python3.12/dist-packages/torchvision-0.29.0a0+0bc41e67.nv26.8.63802676.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e32dbb1746904937", + "bom-ref": "053dfb180276adf8", "name": "/usr/local/lib/python3.12/dist-packages/tornado-6.5.8.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0879d825642faf14", + "bom-ref": "52f07612f464015b", "name": "/usr/local/lib/python3.12/dist-packages/tornado-6.5.8.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b0f38e356c39e6be", + "bom-ref": "b8848354a1f44f71", "name": "/usr/local/lib/python3.12/dist-packages/tornado-6.5.8.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "373a8b245e47951e", - "name": "/usr/local/lib/python3.12/dist-packages/tqdm-4.67.3.dist-info/METADATA", + "bom-ref": "c6dda125d42c3d71", + "name": "/usr/local/lib/python3.12/dist-packages/tqdm-4.70.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "a2d4f3ebcb9f6aad", - "name": "/usr/local/lib/python3.12/dist-packages/tqdm-4.67.3.dist-info/RECORD", + "bom-ref": "abfae84a90a852f4", + "name": "/usr/local/lib/python3.12/dist-packages/tqdm-4.70.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "51e9e79504635dbe", - "name": "/usr/local/lib/python3.12/dist-packages/tqdm-4.67.3.dist-info/top_level.txt", + "bom-ref": "df83876169d9cbc4", + "name": "/usr/local/lib/python3.12/dist-packages/tqdm-4.70.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "153b969ac68f6b48", - "name": "/usr/local/lib/python3.12/dist-packages/traitlets-5.15.0.dist-info/METADATA", + "bom-ref": "6988d1db0ba95235", + "name": "/usr/local/lib/python3.12/dist-packages/traitlets-5.16.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7965ef18e4ccc446", - "name": "/usr/local/lib/python3.12/dist-packages/traitlets-5.15.0.dist-info/RECORD", + "bom-ref": "aa24d8152f4ae7f7", + "name": "/usr/local/lib/python3.12/dist-packages/traitlets-5.16.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4b766e428f8f2279", - "name": "/usr/local/lib/python3.12/dist-packages/transformer_engine-2.15.0+42b84005.dist-info/METADATA", + "bom-ref": "dfd96247223257bb", + "name": "/usr/local/lib/python3.12/dist-packages/transformer_engine-2.18.0+27486e03.dist-info/METADATA", "type": "file" }, { - "bom-ref": "014e8b16f57b9265", - "name": "/usr/local/lib/python3.12/dist-packages/transformer_engine-2.15.0+42b84005.dist-info/RECORD", + "bom-ref": "d90555dc6e890483", + "name": "/usr/local/lib/python3.12/dist-packages/transformer_engine-2.18.0+27486e03.dist-info/RECORD", "type": "file" }, { - "bom-ref": "63e6eb6d6d83b7e7", - "name": "/usr/local/lib/python3.12/dist-packages/transformer_engine-2.15.0+42b84005.dist-info/direct_url.json", + "bom-ref": "c65385fd494d39f9", + "name": "/usr/local/lib/python3.12/dist-packages/transformer_engine-2.18.0+27486e03.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "be6ab825afb424ac", - "name": "/usr/local/lib/python3.12/dist-packages/transformer_engine-2.15.0+42b84005.dist-info/top_level.txt", + "bom-ref": "43fcc585e71cff14", + "name": "/usr/local/lib/python3.12/dist-packages/transformer_engine-2.18.0+27486e03.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "afecab9c42441f2b", + "bom-ref": "b976aa11be2017ec", "name": "/usr/local/lib/python3.12/dist-packages/transformers-5.5.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "d62cf10a5075cf90", + "bom-ref": "2c7351923a86531f", "name": "/usr/local/lib/python3.12/dist-packages/transformers-5.5.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "686c38953385dbfc", + "bom-ref": "97dd355f6da38333", "name": "/usr/local/lib/python3.12/dist-packages/transformers-5.5.4.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6226430d3ed75960", - "name": "/usr/local/lib/python3.12/dist-packages/triton-3.7.0+gitb4e20bb.nv26.5.dist-info/METADATA", + "bom-ref": "6da796123fe74bea", + "name": "/usr/local/lib/python3.12/dist-packages/triton-3.8.0+git4c7e62b7.nv26.8.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2a7788701e4b9804", - "name": "/usr/local/lib/python3.12/dist-packages/triton-3.7.0+gitb4e20bb.nv26.5.dist-info/RECORD", + "bom-ref": "665d13cf12326202", + "name": "/usr/local/lib/python3.12/dist-packages/triton-3.8.0+git4c7e62b7.nv26.8.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2fd664baf062b4b6", - "name": "/usr/local/lib/python3.12/dist-packages/triton-3.7.0+gitb4e20bb.nv26.5.dist-info/direct_url.json", + "bom-ref": "40f5edeb63a855b2", + "name": "/usr/local/lib/python3.12/dist-packages/triton-3.8.0+git4c7e62b7.nv26.8.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "6e3794f84500df8e", - "name": "/usr/local/lib/python3.12/dist-packages/triton-3.7.0+gitb4e20bb.nv26.5.dist-info/top_level.txt", + "bom-ref": "a8a97e606f36c74d", + "name": "/usr/local/lib/python3.12/dist-packages/triton-3.8.0+git4c7e62b7.nv26.8.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "6999671ecb15145e", - "name": "/usr/local/lib/python3.12/dist-packages/triton_kernels-1.0.0+gitb4e20bb.nv26.5.dist-info/METADATA", + "bom-ref": "1da562ee5c78b43a", + "name": "/usr/local/lib/python3.12/dist-packages/triton_kernels-1.0.0+git4c7e62b7.nv26.8.dist-info/METADATA", "type": "file" }, { - "bom-ref": "1fa129358f96c62d", - "name": "/usr/local/lib/python3.12/dist-packages/triton_kernels-1.0.0+gitb4e20bb.nv26.5.dist-info/RECORD", + "bom-ref": "d442abfeb479927d", + "name": "/usr/local/lib/python3.12/dist-packages/triton_kernels-1.0.0+git4c7e62b7.nv26.8.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2b50f265d9ee9230", - "name": "/usr/local/lib/python3.12/dist-packages/triton_kernels-1.0.0+gitb4e20bb.nv26.5.dist-info/direct_url.json", + "bom-ref": "bd73256c5d43f3f0", + "name": "/usr/local/lib/python3.12/dist-packages/triton_kernels-1.0.0+git4c7e62b7.nv26.8.dist-info/direct_url.json", "type": "file" }, { - "bom-ref": "1fc7f24829df628a", - "name": "/usr/local/lib/python3.12/dist-packages/triton_kernels-1.0.0+gitb4e20bb.nv26.5.dist-info/top_level.txt", + "bom-ref": "a071e83fced8b849", + "name": "/usr/local/lib/python3.12/dist-packages/triton_kernels-1.0.0+git4c7e62b7.nv26.8.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "94efa0b99ddd0f39", + "bom-ref": "6c49bd87fe641aaa", "name": "/usr/local/lib/python3.12/dist-packages/truststore-0.10.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e641f958f39d3851", + "bom-ref": "b21917ad14d41686", "name": "/usr/local/lib/python3.12/dist-packages/truststore-0.10.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "4e2020b1556f816c", - "name": "/usr/local/lib/python3.12/dist-packages/typeguard-4.5.1.dist-info/METADATA", + "bom-ref": "340c97e3d4f83b5b", + "name": "/usr/local/lib/python3.12/dist-packages/typeguard-4.6.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "b2102aa787655661", - "name": "/usr/local/lib/python3.12/dist-packages/typeguard-4.5.1.dist-info/RECORD", + "bom-ref": "492ea122a04a4b50", + "name": "/usr/local/lib/python3.12/dist-packages/typeguard-4.6.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b2a51d800f7e35a6", - "name": "/usr/local/lib/python3.12/dist-packages/typeguard-4.5.1.dist-info/top_level.txt", + "bom-ref": "e757fd2836c0813b", + "name": "/usr/local/lib/python3.12/dist-packages/typeguard-4.6.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "f8e0a62f7fc51222", - "name": "/usr/local/lib/python3.12/dist-packages/typer-0.25.1.dist-info/METADATA", + "bom-ref": "4e829397ee12103d", + "name": "/usr/local/lib/python3.12/dist-packages/typer-0.27.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "882591ee43403018", - "name": "/usr/local/lib/python3.12/dist-packages/typer-0.25.1.dist-info/RECORD", + "bom-ref": "7691a0a4c4e80c76", + "name": "/usr/local/lib/python3.12/dist-packages/typer-0.27.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "b803e42be8e99cfd", - "name": "/usr/local/lib/python3.12/dist-packages/typing_extensions-4.15.0.dist-info/METADATA", + "bom-ref": "3c2c836664ba824c", + "name": "/usr/local/lib/python3.12/dist-packages/typing_extensions-4.16.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "acfc63d3436b7b01", - "name": "/usr/local/lib/python3.12/dist-packages/typing_extensions-4.15.0.dist-info/RECORD", + "bom-ref": "8ca81d048af5c013", + "name": "/usr/local/lib/python3.12/dist-packages/typing_extensions-4.16.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2d841ff5b36ddc97", - "name": "/usr/local/lib/python3.12/dist-packages/typing_inspection-0.4.2.dist-info/METADATA", + "bom-ref": "d0188a31c6126ee6", + "name": "/usr/local/lib/python3.12/dist-packages/typing_inspection-0.4.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "385ec740a03e533a", - "name": "/usr/local/lib/python3.12/dist-packages/typing_inspection-0.4.2.dist-info/RECORD", + "bom-ref": "581847854f8c7888", + "name": "/usr/local/lib/python3.12/dist-packages/typing_inspection-0.4.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "cd490f995e9ca883", - "name": "/usr/local/lib/python3.12/dist-packages/tyro-1.0.13.dist-info/METADATA", + "bom-ref": "e2519c3b644aaea7", + "name": "/usr/local/lib/python3.12/dist-packages/tyro-1.0.15.dist-info/METADATA", "type": "file" }, { - "bom-ref": "043ab57c95ece995", - "name": "/usr/local/lib/python3.12/dist-packages/tyro-1.0.13.dist-info/RECORD", + "bom-ref": "5334bad7b178ad59", + "name": "/usr/local/lib/python3.12/dist-packages/tyro-1.0.15.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ad4cf425e81be249", - "name": "/usr/local/lib/python3.12/dist-packages/tzdata-2026.2.dist-info/METADATA", + "bom-ref": "6072cfd41e57a1ea", + "name": "/usr/local/lib/python3.12/dist-packages/tzdata-2026.3.dist-info/METADATA", "type": "file" }, { - "bom-ref": "883a82919231b6d0", - "name": "/usr/local/lib/python3.12/dist-packages/tzdata-2026.2.dist-info/RECORD", + "bom-ref": "00457def8666963a", + "name": "/usr/local/lib/python3.12/dist-packages/tzdata-2026.3.dist-info/RECORD", "type": "file" }, { - "bom-ref": "839342bde2081b12", - "name": "/usr/local/lib/python3.12/dist-packages/tzdata-2026.2.dist-info/top_level.txt", + "bom-ref": "67be0a77dd7120e9", + "name": "/usr/local/lib/python3.12/dist-packages/tzdata-2026.3.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b17fa337cadd7254", + "bom-ref": "664735a469d3ce9f", "name": "/usr/local/lib/python3.12/dist-packages/uri_template-1.3.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "21743bbf5970a1f0", + "bom-ref": "5bef9bd7f3a4d9ff", "name": "/usr/local/lib/python3.12/dist-packages/uri_template-1.3.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8f2a4fa3ace394a5", + "bom-ref": "fbd7a63cce2b187e", "name": "/usr/local/lib/python3.12/dist-packages/uri_template-1.3.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "47c1b0ffac05fa0f", + "bom-ref": "88afdfbeb6b0bccc", "name": "/usr/local/lib/python3.12/dist-packages/urllib3-2.7.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4c6a35caf25cc7d3", + "bom-ref": "1d0ef6d5c3ed42fc", "name": "/usr/local/lib/python3.12/dist-packages/urllib3-2.7.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "04412a110f477c07", + "bom-ref": "a074a5bd4e12ae6c", "name": "/usr/local/lib/python3.12/dist-packages/uvicorn-0.52.4.dist-info/METADATA", "type": "file" }, { - "bom-ref": "65aacb91bce92d16", + "bom-ref": "16c000c40c136169", "name": "/usr/local/lib/python3.12/dist-packages/uvicorn-0.52.4.dist-info/RECORD", "type": "file" }, { - "bom-ref": "845342f6619eca44", + "bom-ref": "4f0593a93303ada7", "name": "/usr/local/lib/python3.12/dist-packages/uvloop-0.22.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "2a7a2f4add8fb3aa", + "bom-ref": "e7efc319f4e39075", "name": "/usr/local/lib/python3.12/dist-packages/uvloop-0.22.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "43d070babe1cf16e", + "bom-ref": "9574f878e4c43e05", "name": "/usr/local/lib/python3.12/dist-packages/uvloop-0.22.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "45168aa1f3a8df7f", - "name": "/usr/local/lib/python3.12/dist-packages/wcwidth-0.7.0.dist-info/METADATA", + "bom-ref": "bf5c4e83c01a78f4", + "name": "/usr/local/lib/python3.12/dist-packages/wcwidth-0.8.2.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7eb9fcef0f3db07c", - "name": "/usr/local/lib/python3.12/dist-packages/wcwidth-0.7.0.dist-info/RECORD", + "bom-ref": "c24b09123738d843", + "name": "/usr/local/lib/python3.12/dist-packages/wcwidth-0.8.2.dist-info/RECORD", "type": "file" }, { - "bom-ref": "99c4efd854ec0c95", + "bom-ref": "0636d3a006ddb6a2", "name": "/usr/local/lib/python3.12/dist-packages/webcolors-25.10.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c9a3944bf9c818c5", + "bom-ref": "b606496b72dec002", "name": "/usr/local/lib/python3.12/dist-packages/webcolors-25.10.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "ec3bceffd10e1597", - "name": "/usr/local/lib/python3.12/dist-packages/webencodings-0.5.1.dist-info/METADATA", + "bom-ref": "62220e56836d4d71", + "name": "/usr/local/lib/python3.12/dist-packages/webencodings-0.6.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "7caf34dd1a4cfee1", - "name": "/usr/local/lib/python3.12/dist-packages/webencodings-0.5.1.dist-info/RECORD", + "bom-ref": "e77ba395b7823f47", + "name": "/usr/local/lib/python3.12/dist-packages/webencodings-0.6.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "5f8b82d25d9490a4", - "name": "/usr/local/lib/python3.12/dist-packages/webencodings-0.5.1.dist-info/top_level.txt", - "type": "file" - }, - { - "bom-ref": "2f54c38cdf0ad299", + "bom-ref": "624b792c705aa65e", "name": "/usr/local/lib/python3.12/dist-packages/websocket_client-1.9.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "090ea51596865bbf", + "bom-ref": "e779f8a088256c4c", "name": "/usr/local/lib/python3.12/dist-packages/websocket_client-1.9.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "0028e3efb89b7d54", + "bom-ref": "1bc1258117e073f7", "name": "/usr/local/lib/python3.12/dist-packages/websocket_client-1.9.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "b0cd66f42ba2b945", + "bom-ref": "6af48382e779cc4e", "name": "/usr/local/lib/python3.12/dist-packages/werkzeug-3.1.8.dist-info/METADATA", "type": "file" }, { - "bom-ref": "3e6eb323cf75dab2", + "bom-ref": "79553cc791ff4fe1", "name": "/usr/local/lib/python3.12/dist-packages/werkzeug-3.1.8.dist-info/RECORD", "type": "file" }, { - "bom-ref": "989df2e7c01e7009", - "name": "/usr/local/lib/python3.12/dist-packages/wheel-0.47.0.dist-info/METADATA", + "bom-ref": "f61944575d5f96eb", + "name": "/usr/local/lib/python3.12/dist-packages/wheel-0.48.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "0715b8e0beba5139", - "name": "/usr/local/lib/python3.12/dist-packages/wheel-0.47.0.dist-info/RECORD", + "bom-ref": "fb999e3161b850f9", + "name": "/usr/local/lib/python3.12/dist-packages/wheel-0.48.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "1491f463983feb15", - "name": "/usr/local/lib/python3.12/dist-packages/xdsl-0.69.0.dist-info/METADATA", + "bom-ref": "0d382c14f193f121", + "name": "/usr/local/lib/python3.12/dist-packages/xdsl-0.71.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "c001637f1a3fe2c2", - "name": "/usr/local/lib/python3.12/dist-packages/xdsl-0.69.0.dist-info/RECORD", + "bom-ref": "e4c951bac3c743ce", + "name": "/usr/local/lib/python3.12/dist-packages/xdsl-0.71.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "2189892f84e6a1dc", - "name": "/usr/local/lib/python3.12/dist-packages/xdsl-0.69.0.dist-info/top_level.txt", + "bom-ref": "b3571e0727db93c2", + "name": "/usr/local/lib/python3.12/dist-packages/xdsl-0.71.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "5ace0c953bed3f4b", + "bom-ref": "c3ca53479efccb78", "name": "/usr/local/lib/python3.12/dist-packages/xgrammar-0.1.32.dist-info/METADATA", "type": "file" }, { - "bom-ref": "4a7ef084b48b83bb", + "bom-ref": "d8d93a6a5852b8d8", "name": "/usr/local/lib/python3.12/dist-packages/xgrammar-0.1.32.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3a9354986f32eeaf", - "name": "/usr/local/lib/python3.12/dist-packages/xxhash-3.7.0.dist-info/METADATA", + "bom-ref": "dcbf964dda265c44", + "name": "/usr/local/lib/python3.12/dist-packages/xxhash-4.0.1.dist-info/METADATA", "type": "file" }, { - "bom-ref": "440d5d5f3b1376d0", - "name": "/usr/local/lib/python3.12/dist-packages/xxhash-3.7.0.dist-info/RECORD", + "bom-ref": "483165cebc09e32d", + "name": "/usr/local/lib/python3.12/dist-packages/xxhash-4.0.1.dist-info/RECORD", "type": "file" }, { - "bom-ref": "6e34661853982010", - "name": "/usr/local/lib/python3.12/dist-packages/xxhash-3.7.0.dist-info/top_level.txt", + "bom-ref": "74776337ddd26c6f", + "name": "/usr/local/lib/python3.12/dist-packages/xxhash-4.0.1.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "15814178b7c83d41", - "name": "/usr/local/lib/python3.12/dist-packages/yarl-1.23.0.dist-info/METADATA", + "bom-ref": "f0f1af0fa5fc3640", + "name": "/usr/local/lib/python3.12/dist-packages/yarl-1.24.5.dist-info/METADATA", "type": "file" }, { - "bom-ref": "e6bccf8279f847b6", - "name": "/usr/local/lib/python3.12/dist-packages/yarl-1.23.0.dist-info/RECORD", + "bom-ref": "3485a5f5163e9afa", + "name": "/usr/local/lib/python3.12/dist-packages/yarl-1.24.5.dist-info/RECORD", "type": "file" }, { - "bom-ref": "8e22b6e6346ec741", - "name": "/usr/local/lib/python3.12/dist-packages/yarl-1.23.0.dist-info/top_level.txt", + "bom-ref": "1189400c701d2fca", + "name": "/usr/local/lib/python3.12/dist-packages/yarl-1.24.5.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "e5804bb0b8fd2be0", - "name": "/usr/local/lib/python3.12/dist-packages/zipp-3.23.1.dist-info/METADATA", + "bom-ref": "bad17b7ffb6cf814", + "name": "/usr/local/lib/python3.12/dist-packages/zipp-4.1.0.dist-info/METADATA", "type": "file" }, { - "bom-ref": "79eb4be86f77c29f", - "name": "/usr/local/lib/python3.12/dist-packages/zipp-3.23.1.dist-info/RECORD", + "bom-ref": "0f8b00d4081dbb69", + "name": "/usr/local/lib/python3.12/dist-packages/zipp-4.1.0.dist-info/RECORD", "type": "file" }, { - "bom-ref": "3522106d226704c0", - "name": "/usr/local/lib/python3.12/dist-packages/zipp-3.23.1.dist-info/top_level.txt", + "bom-ref": "cc93a26d6c4b9174", + "name": "/usr/local/lib/python3.12/dist-packages/zipp-4.1.0.dist-info/top_level.txt", "type": "file" }, { - "bom-ref": "221d17550742eefa", + "bom-ref": "5729746f30f66e23", "name": "/usr/local/share/jupyter/lab/static/package.json", "type": "file" }, { - "bom-ref": "033ea18d3c7bed8b", + "bom-ref": "4f1cad2491b5fb68", "name": "/usr/local/share/jupyter/labextensions/@jupyter-notebook/lab-extension/package.json", "type": "file" }, { - "bom-ref": "fbb63090dc97b165", + "bom-ref": "d0332aad99dcc0cb", "name": "/usr/local/share/jupyter/labextensions/jupyterlab-jupytext/package.json", "type": "file" }, { - "bom-ref": "bac45a9eb1ff32dd", + "bom-ref": "9ddf9da239397d0e", "name": "/usr/local/share/jupyter/labextensions/jupyterlab-plotly/package.json", "type": "file" }, { - "bom-ref": "e6e5cab4153b0f42", + "bom-ref": "e6929e2c5a71ba0d", "name": "/usr/local/share/jupyter/labextensions/jupyterlab_code_formatter/package.json", "type": "file" }, { - "bom-ref": "d2c99d1c29035368", + "bom-ref": "a2f15d10071a0513", "name": "/usr/local/share/jupyter/labextensions/jupyterlab_pygments/package.json", "type": "file" }, { - "bom-ref": "4026f89380bc8991", + "bom-ref": "5b062063c122b547", "name": "/usr/local/share/jupyter/labextensions/jupyterlab_tensorboard_pro/package.json", "type": "file" }, { - "bom-ref": "3b97f241496ed52d", + "bom-ref": "ff1bfe0f360d3527", "name": "/usr/sbin/add-shell", "type": "file" }, { - "bom-ref": "059fc7b26c29f357", + "bom-ref": "5bb63e42892aa1e4", "name": "/usr/sbin/addgnupghome", "type": "file" }, { - "bom-ref": "0b01d3c10f4c29c1", + "bom-ref": "1e0c317b9b44a0ce", "name": "/usr/sbin/adduser", "type": "file" }, { - "bom-ref": "da69ed1628e42c04", + "bom-ref": "3f02d58a4e6e091e", "name": "/usr/sbin/agetty", "type": "file" }, { - "bom-ref": "6007635db6a472c0", + "bom-ref": "95e2445090f267b7", "name": "/usr/sbin/applygnupgdefaults", "type": "file" }, { - "bom-ref": "f6c774618abe6c13", + "bom-ref": "74d95c4f328df735", "name": "/usr/sbin/badblocks", "type": "file" }, { - "bom-ref": "181134d4039c3ea7", + "bom-ref": "c6b10799220107b1", "name": "/usr/sbin/blkdiscard", "type": "file" }, { - "bom-ref": "0d0a29d030303449", + "bom-ref": "1f40f645f92bf89b", "name": "/usr/sbin/blkid", "type": "file" }, { - "bom-ref": "ea7b4dd1a657a516", + "bom-ref": "cbc88a2e39643e4c", "name": "/usr/sbin/blkzone", "type": "file" }, { - "bom-ref": "b4a3350f520c8b8b", + "bom-ref": "b12e0a96034cf459", "name": "/usr/sbin/blockdev", "type": "file" }, { - "bom-ref": "191ad69dd92eda33", + "bom-ref": "438bd44bc3a29a7d", "name": "/usr/sbin/chcpu", "type": "file" }, { - "bom-ref": "9a13af7aaa2efe4b", + "bom-ref": "0b8187199d64ac41", "name": "/usr/sbin/chgpasswd", "type": "file" }, { - "bom-ref": "5c4987c6f25e45a8", + "bom-ref": "4bb24ef9d7549c22", "name": "/usr/sbin/chmem", "type": "file" }, { - "bom-ref": "be1bcb197484b2f7", + "bom-ref": "f594983ebb192035", "name": "/usr/sbin/chpasswd", "type": "file" }, { - "bom-ref": "72f8c9bf9f744f6b", + "bom-ref": "cd20a27acb5c3be9", "name": "/usr/sbin/chroot", "type": "file" }, { - "bom-ref": "6015ffbf82a9542c", + "bom-ref": "8b253513e4cac2fe", "name": "/usr/sbin/cppw", "type": "file" }, { - "bom-ref": "15582fc954b810fc", + "bom-ref": "d8c777eebbb11172", "name": "/usr/sbin/ctrlaltdel", "type": "file" }, { - "bom-ref": "b238380324be51ba", + "bom-ref": "210cbfb21075f474", "name": "/usr/sbin/debugfs", "type": "file" }, { - "bom-ref": "4da11a94378ea299", + "bom-ref": "b189e1eca1ba0a9a", "name": "/usr/sbin/deluser", "type": "file" }, { - "bom-ref": "01eff92501ff969d", + "bom-ref": "c34a651081376677", "name": "/usr/sbin/dpkg-preconfigure", "type": "file" }, { - "bom-ref": "b0267f5a94217e43", + "bom-ref": "6ace43814dc9e3d1", "name": "/usr/sbin/dpkg-reconfigure", "type": "file" }, { - "bom-ref": "99f90f3d8fa501b3", + "bom-ref": "b1473df42a560afd", "name": "/usr/sbin/dumpe2fs", "type": "file" }, { - "bom-ref": "aaa77d2c6c6d22cf", + "bom-ref": "05b1009625fc7f9d", "name": "/usr/sbin/e2freefrag", "type": "file" }, { - "bom-ref": "34aa4fbb17e054b2", + "bom-ref": "66c2e35133243ce4", "name": "/usr/sbin/e2fsck", "type": "file" }, { - "bom-ref": "fd563b066b2277cc", + "bom-ref": "7a237669975bff82", "name": "/usr/sbin/e2image", "type": "file" }, { - "bom-ref": "bf8c691781720a66", + "bom-ref": "839da6806496dd60", "name": "/usr/sbin/e2scrub", "type": "file" }, { - "bom-ref": "1a37762693780add", + "bom-ref": "6e162a84c51c9d17", "name": "/usr/sbin/e2scrub_all", "type": "file" }, { - "bom-ref": "120dcef272adb6f3", + "bom-ref": "01dd225dec942021", "name": "/usr/sbin/e2undo", "type": "file" }, { - "bom-ref": "cd8e471593a78b10", + "bom-ref": "bd9e9ae990a6275e", "name": "/usr/sbin/e4crypt", "type": "file" }, { - "bom-ref": "257ded304f57c368", + "bom-ref": "c6fa74a244d6e65a", "name": "/usr/sbin/e4defrag", "type": "file" }, { - "bom-ref": "cd1fe72c18336c7b", + "bom-ref": "b666328f456e84d9", "name": "/usr/sbin/escapesrc", "type": "file" }, { - "bom-ref": "a90774c5ec565ba0", + "bom-ref": "75f28b0c3c30c782", "name": "/usr/sbin/faillock", "type": "file" }, { - "bom-ref": "ca759d80c88ce72c", + "bom-ref": "6c2156fb7eea6a02", "name": "/usr/sbin/filefrag", "type": "file" }, { - "bom-ref": "629e4c3db1148ffc", + "bom-ref": "a639a4d24ee9cd3a", "name": "/usr/sbin/findfs", "type": "file" }, { - "bom-ref": "e5c1f43c901cc927", + "bom-ref": "f838b70a3f2524f9", "name": "/usr/sbin/fsck", "type": "file" }, { - "bom-ref": "3b27806479bb3bc5", + "bom-ref": "d5faec3dca09c30b", "name": "/usr/sbin/fsck.cramfs", "type": "file" }, { - "bom-ref": "18fc107ddaf8b3b4", + "bom-ref": "ec756cfee3ab300a", "name": "/usr/sbin/fsck.minix", "type": "file" }, { - "bom-ref": "04bbb2241606d163", + "bom-ref": "8a1b73b5f924a0c5", "name": "/usr/sbin/fsfreeze", "type": "file" }, { - "bom-ref": "75639c4c8b8716c5", + "bom-ref": "39e169b12c65916b", "name": "/usr/sbin/fstab-decode", "type": "file" }, { - "bom-ref": "c1f5e61c77bc373e", + "bom-ref": "95c9deecf40957a0", "name": "/usr/sbin/fstrim", "type": "file" }, { - "bom-ref": "b86b2fa183149ad7", + "bom-ref": "a23808e5c5b0e831", "name": "/usr/sbin/genccode", "type": "file" }, { - "bom-ref": "3ce0b201559301f1", + "bom-ref": "f62e2516a00d644b", "name": "/usr/sbin/gencmn", "type": "file" }, { - "bom-ref": "7ba4886f965b2634", + "bom-ref": "769699dd6ddb2466", "name": "/usr/sbin/gennorm2", "type": "file" }, { - "bom-ref": "d7a5f4415416073e", + "bom-ref": "8a585e6c68efdf18", "name": "/usr/sbin/gensprep", "type": "file" }, { - "bom-ref": "1c3a2aa7481bc491", + "bom-ref": "4c3e47f100fce38b", "name": "/usr/sbin/groupadd", "type": "file" }, { - "bom-ref": "f28f8a0f1a694db8", + "bom-ref": "888c84ed5cd32bca", "name": "/usr/sbin/groupdel", "type": "file" }, { - "bom-ref": "3d784abaf4e15e85", + "bom-ref": "dc6839d0ccdfa787", "name": "/usr/sbin/groupmems", "type": "file" }, { - "bom-ref": "9db4c940fcda2e78", + "bom-ref": "e376968f853a00fa", "name": "/usr/sbin/groupmod", "type": "file" }, { - "bom-ref": "aff89a66654b829c", + "bom-ref": "0130c6f4fa62c872", "name": "/usr/sbin/grpck", "type": "file" }, { - "bom-ref": "3e8637be48ffe1b6", + "bom-ref": "9ef84970c967fb4c", "name": "/usr/sbin/grpconv", "type": "file" }, { - "bom-ref": "30c54189607de026", + "bom-ref": "f203b72ba5adb280", "name": "/usr/sbin/grpunconv", "type": "file" }, { - "bom-ref": "a1545dcbc18c0562", + "bom-ref": "88e27a2eacbcf17c", "name": "/usr/sbin/iconvconfig", "type": "file" }, { - "bom-ref": "869591a55607b1c0", + "bom-ref": "b28e4ce4162fc7a6", "name": "/usr/sbin/icupkg", "type": "file" }, { - "bom-ref": "c8d0770953f8d41b", - "name": "/usr/sbin/install-sgmlcatalog", - "type": "file" - }, - { - "bom-ref": "638ce5a6ef827508", + "bom-ref": "f12ae71c9e7448ba", "name": "/usr/sbin/installkernel", "type": "file" }, { - "bom-ref": "80d47a09ee477340", + "bom-ref": "f2715235566b28e2", "name": "/usr/sbin/invoke-rc.d", "type": "file" }, { - "bom-ref": "e19733efecb3273b", + "bom-ref": "11fb8fc2aedcf881", "name": "/usr/sbin/isosize", "type": "file" }, { - "bom-ref": "c65dfc4fbc527a2b", + "bom-ref": "d74af5db685233cd", "name": "/usr/sbin/killall5", "type": "file" }, { - "bom-ref": "936dd2788cc68ee5", + "bom-ref": "31a1fce36113b173", "name": "/usr/sbin/ldattach", "type": "file" }, { - "bom-ref": "5185e21347adcfec", + "bom-ref": "05456f55186e4d66", "name": "/usr/sbin/ldconfig", "type": "file" }, { - "bom-ref": "dabe9f6ede98783f", + "bom-ref": "ca42ccab267a6c95", "name": "/usr/sbin/ldconfig.real", "type": "file" }, { - "bom-ref": "3d85521523168623", + "bom-ref": "3da8c5932f320c21", "name": "/usr/sbin/libgvc6-config-update", "type": "file" }, { - "bom-ref": "48346638f84efa65", + "bom-ref": "5b64f31a356e6df3", "name": "/usr/sbin/logsave", "type": "file" }, { - "bom-ref": "6f49a6880a1c85d2", + "bom-ref": "661afba94ab012f8", "name": "/usr/sbin/losetup", "type": "file" }, { - "bom-ref": "632ed65c5310fcd8", + "bom-ref": "7848a83ec3355242", "name": "/usr/sbin/mke2fs", "type": "file" }, { - "bom-ref": "cd1d98e828b9e4fa", + "bom-ref": "cbd1d62e4f980778", "name": "/usr/sbin/mkfs", "type": "file" }, { - "bom-ref": "e5662075072f0015", + "bom-ref": "a23919bab2047a0f", "name": "/usr/sbin/mkfs.bfs", "type": "file" }, { - "bom-ref": "7fadf08ef1e8f355", + "bom-ref": "d996010ff8f010f7", "name": "/usr/sbin/mkfs.cramfs", "type": "file" }, { - "bom-ref": "bf7738e643b02e7a", + "bom-ref": "013ca68ad79bc3d4", "name": "/usr/sbin/mkfs.minix", "type": "file" }, { - "bom-ref": "8efac2c61745c1a4", + "bom-ref": "48e592b5250e4546", "name": "/usr/sbin/mkhomedir_helper", "type": "file" }, { - "bom-ref": "947f0a238c624237", + "bom-ref": "97e047609bf2462d", "name": "/usr/sbin/mklost+found", "type": "file" }, { - "bom-ref": "54038b9747e40c9f", + "bom-ref": "f260d53c93fd2919", "name": "/usr/sbin/mkswap", "type": "file" }, { - "bom-ref": "081c6c7dddd0cb63", + "bom-ref": "a14ad33e94b1c241", "name": "/usr/sbin/newusers", "type": "file" }, { - "bom-ref": "536d7b56914028e4", + "bom-ref": "3fbd76e860e6f362", "name": "/usr/sbin/nologin", "type": "file" }, { - "bom-ref": "b79c6fa9cdebb3ab", + "bom-ref": "1501675b4d71ac85", "name": "/usr/sbin/pam-auth-update", "type": "file" }, { - "bom-ref": "cd6c08645b5a9fe9", + "bom-ref": "2e729a53569fdd6f", "name": "/usr/sbin/pam_extrausers_chkpwd", "type": "file" }, { - "bom-ref": "396a8db059ea93f4", + "bom-ref": "f45e5e06ea52f3a6", "name": "/usr/sbin/pam_extrausers_update", "type": "file" }, { - "bom-ref": "be953f59d9e6cc34", + "bom-ref": "e32179267c2f015a", "name": "/usr/sbin/pam_getenv", "type": "file" }, { - "bom-ref": "e7a127346d9fc030", + "bom-ref": "0c28b88408cb8e3a", "name": "/usr/sbin/pam_namespace_helper", "type": "file" }, { - "bom-ref": "7e86ec00908d67b4", + "bom-ref": "5d54385bf51a7842", "name": "/usr/sbin/pam_timestamp_check", "type": "file" }, { - "bom-ref": "51532a19bbf68763", + "bom-ref": "f2753c547545eb9d", "name": "/usr/sbin/pivot_root", "type": "file" }, { - "bom-ref": "dec0aa4fbbab77ba", + "bom-ref": "8ace7ce55a2aba4c", "name": "/usr/sbin/pwck", "type": "file" }, { - "bom-ref": "dc90f58fdf53aef5", + "bom-ref": "890b2a43848c779b", "name": "/usr/sbin/pwconv", "type": "file" }, { - "bom-ref": "97f31590fb52db90", + "bom-ref": "fb55206925666556", "name": "/usr/sbin/pwhistory_helper", "type": "file" }, { - "bom-ref": "885844e08bad8d33", + "bom-ref": "4f7f395f2a34a8e5", "name": "/usr/sbin/pwunconv", "type": "file" }, { - "bom-ref": "aa718e11f2d6c507", + "bom-ref": "5d9d70e862eed6f1", "name": "/usr/sbin/readprofile", "type": "file" }, { - "bom-ref": "bc0919c3082cd74c", + "bom-ref": "481e8159ae995f42", "name": "/usr/sbin/remove-shell", "type": "file" }, { - "bom-ref": "25fcc06725f53eb6", + "bom-ref": "ccfa3d14298517d4", "name": "/usr/sbin/resize2fs", "type": "file" }, { - "bom-ref": "90011c7e08f80e0c", + "bom-ref": "935c2eeb4f0771ae", "name": "/usr/sbin/rmt-tar", "type": "file" }, { - "bom-ref": "f5ee2bebd85dd820", + "bom-ref": "4014a36c2c8f3cb2", "name": "/usr/sbin/rtcwake", "type": "file" }, { - "bom-ref": "773160c154cedc32", + "bom-ref": "6097caeba5260448", "name": "/usr/sbin/runuser", "type": "file" }, { - "bom-ref": "1213a635b1a24d73", + "bom-ref": "b8248f2283efd2f5", "name": "/usr/sbin/service", "type": "file" }, { - "bom-ref": "0c386849f6f64f71", + "bom-ref": "f90c44c1136847a3", "name": "/usr/sbin/shadowconfig", "type": "file" }, { - "bom-ref": "990d5be98a264b03", + "bom-ref": "f972ef4cb50d57e4", "name": "/usr/sbin/start-stop-daemon", "type": "file" }, { - "bom-ref": "e6306b6a4d5a857c", + "bom-ref": "9760f751949a8fde", "name": "/usr/sbin/sulogin", "type": "file" }, { - "bom-ref": "c6a8cf9340e71664", + "bom-ref": "8ba2576aa03b7d4a", "name": "/usr/sbin/swaplabel", "type": "file" }, { - "bom-ref": "6cd7d422a8e60f5e", + "bom-ref": "62c39d1ae1e063dc", "name": "/usr/sbin/swapoff", "type": "file" }, { - "bom-ref": "d3e4b0cfa4543f90", + "bom-ref": "b7aa83b1259125ee", "name": "/usr/sbin/swapon", "type": "file" }, { - "bom-ref": "7fcac12ec8cc89ed", + "bom-ref": "f5c1c077791502b7", "name": "/usr/sbin/switch_root", "type": "file" }, { - "bom-ref": "9b40b1a09c8ad8f0", + "bom-ref": "7efe3982da6b4d1a", "name": "/usr/sbin/sysctl", "type": "file" }, { - "bom-ref": "5e539d1525cb6248", + "bom-ref": "c0090b57e3c4e8ce", "name": "/usr/sbin/tarcat", "type": "file" }, { - "bom-ref": "ccfb124164353285", + "bom-ref": "ff56b1b9b6de5a37", "name": "/usr/sbin/tune2fs", "type": "file" }, { - "bom-ref": "be83fae602aec8d3", + "bom-ref": "15cb679c69363e31", "name": "/usr/sbin/unix_chkpwd", "type": "file" }, { - "bom-ref": "3f2b30c7834e6523", + "bom-ref": "c48ee4693216b419", "name": "/usr/sbin/unix_update", "type": "file" }, { - "bom-ref": "1a0aa788e82a10d2", + "bom-ref": "f8a01f908bc85f82", "name": "/usr/sbin/update-ca-certificates", "type": "file" }, { - "bom-ref": "b890d4d607266efe", - "name": "/usr/sbin/update-catalog", - "type": "file" - }, - { - "bom-ref": "9ccf9c962716d5eb", + "bom-ref": "7bef9b0c39e584dd", "name": "/usr/sbin/update-ccache-symlinks", "type": "file" }, { - "bom-ref": "afdb2ff2667601dc", + "bom-ref": "0ee66a2845ab75e2", "name": "/usr/sbin/update-passwd", "type": "file" }, { - "bom-ref": "1c35da3600af2aab", + "bom-ref": "3f27d5c2dc1f7a74", "name": "/usr/sbin/update-pciids", "type": "file" }, { - "bom-ref": "3f87b24e408cfa12", + "bom-ref": "fa087535af08bc34", "name": "/usr/sbin/update-rc.d", "type": "file" }, { - "bom-ref": "2df0d67fd0c0b7b3", + "bom-ref": "aa782e66fdcc9eed", "name": "/usr/sbin/update-shells", "type": "file" }, { - "bom-ref": "40c7f1123bccb64d", - "name": "/usr/sbin/update-xmlcatalog", - "type": "file" - }, - { - "bom-ref": "d5ead54ad79cc8d1", + "bom-ref": "b714bb26cd0dda57", "name": "/usr/sbin/useradd", "type": "file" }, { - "bom-ref": "77a8fa458ab1eac3", + "bom-ref": "119da02cad832839", "name": "/usr/sbin/userdel", "type": "file" }, { - "bom-ref": "c6803076bf38306e", + "bom-ref": "4d9225027084c1b0", "name": "/usr/sbin/usermod", "type": "file" }, { - "bom-ref": "bb4b163bb30600b9", + "bom-ref": "467f5d3d6675b86f", "name": "/usr/sbin/vipw", "type": "file" }, { - "bom-ref": "813ef7cac296ac55", + "bom-ref": "ca41dcf3f4cb27d7", "name": "/usr/sbin/wipefs", "type": "file" }, { - "bom-ref": "8e851c70e10ef256", + "bom-ref": "a1beb2d1d5b29f00", "name": "/usr/sbin/zic", "type": "file" }, { - "bom-ref": "710f893b3d35d8d0", + "bom-ref": "fd7298350d3723ca", "name": "/usr/sbin/zramctl", "type": "file" }, { - "bom-ref": "bb29d92955cd65cb", + "bom-ref": "2ebcc9329e41aca9", "name": "/usr/share/X11/XErrorDB", "type": "file" }, { - "bom-ref": "45cee123264e31b3", + "bom-ref": "d7542e9b57830395", "name": "/usr/share/X11/locale/C/Compose", "type": "file" }, { - "bom-ref": "0d0d2e24b640f115", + "bom-ref": "9ba7e06fc7566c73", "name": "/usr/share/X11/locale/C/XI18N_OBJS", "type": "file" }, { - "bom-ref": "5ab39555eb915a67", + "bom-ref": "f00673e3b6d98175", "name": "/usr/share/X11/locale/C/XLC_LOCALE", "type": "file" }, { - "bom-ref": "c8333d6a43d8ef8b", + "bom-ref": "8b06a73d295385a5", "name": "/usr/share/X11/locale/am_ET.UTF-8/Compose", "type": "file" }, { - "bom-ref": "231c243b5cbfa5bf", + "bom-ref": "16763b14dffda2f9", "name": "/usr/share/X11/locale/am_ET.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "d45d30c701582e47", + "bom-ref": "be22833028efc765", "name": "/usr/share/X11/locale/am_ET.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "9e2d89e965693a43", + "bom-ref": "668057164651dfed", "name": "/usr/share/X11/locale/armscii-8/Compose", "type": "file" }, { - "bom-ref": "1294f22887da4d8d", + "bom-ref": "2e56f99c3f53d0e7", "name": "/usr/share/X11/locale/armscii-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "75f9e908ce46d9b5", + "bom-ref": "f8baacb70fe9c447", "name": "/usr/share/X11/locale/armscii-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "203e1ebf52cbda93", + "bom-ref": "d5328cdfbfed7c65", "name": "/usr/share/X11/locale/compose.dir", "type": "file" }, { - "bom-ref": "757ad24133464754", + "bom-ref": "4af660d90dd46022", "name": "/usr/share/X11/locale/cs_CZ.UTF-8/Compose", "type": "file" }, { - "bom-ref": "f9de02edcc9f4caf", + "bom-ref": "b5f2a7495512ba2d", "name": "/usr/share/X11/locale/cs_CZ.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "483f4a5571d9030d", + "bom-ref": "949347e7e4f6d493", "name": "/usr/share/X11/locale/cs_CZ.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "b470118b3e9028fb", + "bom-ref": "4feffcbf0062f2f1", "name": "/usr/share/X11/locale/el_GR.UTF-8/Compose", "type": "file" }, { - "bom-ref": "b17d2303e236a066", + "bom-ref": "9a1f4b24c14697e0", "name": "/usr/share/X11/locale/el_GR.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "9747f9779fa76000", + "bom-ref": "21e4ca5a06c5bcc2", "name": "/usr/share/X11/locale/el_GR.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "36e1a9f90ca706e0", + "bom-ref": "29396b71382e8d52", "name": "/usr/share/X11/locale/en_US.UTF-8/Compose", "type": "file" }, { - "bom-ref": "256b3abc13840842", + "bom-ref": "56b850ecfdcd3888", "name": "/usr/share/X11/locale/en_US.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "502cdeb969947e6f", + "bom-ref": "19b8f0559279e015", "name": "/usr/share/X11/locale/en_US.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "646858729dd65df6", + "bom-ref": "953c4fb0fc56664c", "name": "/usr/share/X11/locale/fi_FI.UTF-8/Compose", "type": "file" }, { - "bom-ref": "1bfac491b21f42d7", + "bom-ref": "7e97dff5f93ce151", "name": "/usr/share/X11/locale/fi_FI.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "4d7a5d3606f5b5d4", + "bom-ref": "3f3585a46dfd68d6", "name": "/usr/share/X11/locale/fi_FI.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "6b3fc83641e851f7", + "bom-ref": "02f1b6e9646f1521", "name": "/usr/share/X11/locale/georgian-academy/Compose", "type": "file" }, { - "bom-ref": "788dae7392174e2a", + "bom-ref": "05b8756637ab1a4c", "name": "/usr/share/X11/locale/georgian-academy/XI18N_OBJS", "type": "file" }, { - "bom-ref": "13f84fe7a33e184d", + "bom-ref": "7088d65fcbc97207", "name": "/usr/share/X11/locale/georgian-academy/XLC_LOCALE", "type": "file" }, { - "bom-ref": "e3595686dbd6a45c", + "bom-ref": "564777b3eeb0d112", "name": "/usr/share/X11/locale/georgian-ps/Compose", "type": "file" }, { - "bom-ref": "9380ef6c9913c2f3", + "bom-ref": "46d76f18a0bce4c9", "name": "/usr/share/X11/locale/georgian-ps/XI18N_OBJS", "type": "file" }, { - "bom-ref": "93cdcf29e91193c6", + "bom-ref": "e61f7146e82e2348", "name": "/usr/share/X11/locale/georgian-ps/XLC_LOCALE", "type": "file" }, { - "bom-ref": "16909b2642b8633c", + "bom-ref": "5000e77cfbcfe2c6", "name": "/usr/share/X11/locale/ibm-cp1133/Compose", "type": "file" }, { - "bom-ref": "4558ebc7420b4f32", + "bom-ref": "d4f31a2b436d2c80", "name": "/usr/share/X11/locale/ibm-cp1133/XI18N_OBJS", "type": "file" }, { - "bom-ref": "048d43ce51551fd3", + "bom-ref": "870f76179afe4cc5", "name": "/usr/share/X11/locale/ibm-cp1133/XLC_LOCALE", "type": "file" }, { - "bom-ref": "d9d2d464a9d6643e", + "bom-ref": "439d3c6bb77d95d4", "name": "/usr/share/X11/locale/iscii-dev/Compose", "type": "file" }, { - "bom-ref": "40e551c08b4692d2", + "bom-ref": "5530548c92b56b20", "name": "/usr/share/X11/locale/iscii-dev/XI18N_OBJS", "type": "file" }, { - "bom-ref": "ad22c77bf9487a79", + "bom-ref": "f82a1b58d1f9a843", "name": "/usr/share/X11/locale/iscii-dev/XLC_LOCALE", "type": "file" }, { - "bom-ref": "266d27d3745f3677", + "bom-ref": "9fce6c5be8fcfa2d", "name": "/usr/share/X11/locale/isiri-3342/Compose", "type": "file" }, { - "bom-ref": "7e4cd89246a440d6", + "bom-ref": "e762a95d529d8d14", "name": "/usr/share/X11/locale/isiri-3342/XI18N_OBJS", "type": "file" }, { - "bom-ref": "951d1114b2283cd0", + "bom-ref": "5cada1e7df70ce6a", "name": "/usr/share/X11/locale/isiri-3342/XLC_LOCALE", "type": "file" }, { - "bom-ref": "f704fef09e129db5", + "bom-ref": "5c3a821e2b30f063", "name": "/usr/share/X11/locale/iso8859-1/Compose", "type": "file" }, { - "bom-ref": "32aeb5095b273910", + "bom-ref": "abb1a3bd6434ba82", "name": "/usr/share/X11/locale/iso8859-1/XI18N_OBJS", "type": "file" }, { - "bom-ref": "4cd1899964235cfe", + "bom-ref": "9c5f61e324525264", "name": "/usr/share/X11/locale/iso8859-1/XLC_LOCALE", "type": "file" }, { - "bom-ref": "7bf59d2c213745f6", + "bom-ref": "c1ee0368ff5b3df4", "name": "/usr/share/X11/locale/iso8859-10/Compose", "type": "file" }, { - "bom-ref": "a656c97ba95b4dae", + "bom-ref": "162368cdb4f704c8", "name": "/usr/share/X11/locale/iso8859-10/XI18N_OBJS", "type": "file" }, { - "bom-ref": "1ee81a2f3209dc7b", + "bom-ref": "3dfd0ebfcbdde45d", "name": "/usr/share/X11/locale/iso8859-10/XLC_LOCALE", "type": "file" }, { - "bom-ref": "9efe0a512479f341", + "bom-ref": "34595b5a76484f2f", "name": "/usr/share/X11/locale/iso8859-11/Compose", "type": "file" }, { - "bom-ref": "a9910406737a8501", + "bom-ref": "51e9383cf0d0d837", "name": "/usr/share/X11/locale/iso8859-11/XI18N_OBJS", "type": "file" }, { - "bom-ref": "2d915686b589e467", + "bom-ref": "b4e746bae517a395", "name": "/usr/share/X11/locale/iso8859-11/XLC_LOCALE", "type": "file" }, { - "bom-ref": "48859eb515e9905a", + "bom-ref": "ed9a763e2d588bd0", "name": "/usr/share/X11/locale/iso8859-13/Compose", "type": "file" }, { - "bom-ref": "f69afa030d3b5c5b", + "bom-ref": "965da000a333bc21", "name": "/usr/share/X11/locale/iso8859-13/XI18N_OBJS", "type": "file" }, { - "bom-ref": "a23b008c2d7c4fef", + "bom-ref": "b53d0bb2d3c3b7c1", "name": "/usr/share/X11/locale/iso8859-13/XLC_LOCALE", "type": "file" }, { - "bom-ref": "e06e62ea73900f90", + "bom-ref": "e4d150f84ae58e8a", "name": "/usr/share/X11/locale/iso8859-14/Compose", "type": "file" }, { - "bom-ref": "79ec19d65aea61d6", + "bom-ref": "33f70fec15f44930", "name": "/usr/share/X11/locale/iso8859-14/XI18N_OBJS", "type": "file" }, { - "bom-ref": "c940e371f2306157", + "bom-ref": "b2cef2260e0d41a5", "name": "/usr/share/X11/locale/iso8859-14/XLC_LOCALE", "type": "file" }, { - "bom-ref": "e2d8dd28b250671a", + "bom-ref": "0a7a1e2138036a50", "name": "/usr/share/X11/locale/iso8859-15/Compose", "type": "file" }, { - "bom-ref": "47d3de73f79f7fd1", + "bom-ref": "a7b1699473fe02af", "name": "/usr/share/X11/locale/iso8859-15/XI18N_OBJS", "type": "file" }, { - "bom-ref": "a92dc2fe1e2f5117", + "bom-ref": "6546ed10dab878d9", "name": "/usr/share/X11/locale/iso8859-15/XLC_LOCALE", "type": "file" }, { - "bom-ref": "6db11ca6d52a78e6", + "bom-ref": "901fb3abc072eb44", "name": "/usr/share/X11/locale/iso8859-2/Compose", "type": "file" }, { - "bom-ref": "ef1bd98d7c26ac51", + "bom-ref": "db1a1476878dd44f", "name": "/usr/share/X11/locale/iso8859-2/XI18N_OBJS", "type": "file" }, { - "bom-ref": "0706c5489f739524", + "bom-ref": "3e6061e5b1f3a8b2", "name": "/usr/share/X11/locale/iso8859-2/XLC_LOCALE", "type": "file" }, { - "bom-ref": "b0f53ff190fc4501", + "bom-ref": "5eedf542d8ea678b", "name": "/usr/share/X11/locale/iso8859-3/Compose", "type": "file" }, { - "bom-ref": "23bbab1afbe79c4f", + "bom-ref": "f3a2baba6058bd4d", "name": "/usr/share/X11/locale/iso8859-3/XI18N_OBJS", "type": "file" }, { - "bom-ref": "82babbca10886a7e", + "bom-ref": "98d399ad46722f78", "name": "/usr/share/X11/locale/iso8859-3/XLC_LOCALE", "type": "file" }, { - "bom-ref": "3840197adc4adfc0", + "bom-ref": "40841175939537da", "name": "/usr/share/X11/locale/iso8859-4/Compose", "type": "file" }, { - "bom-ref": "28e2a2600969bfd7", + "bom-ref": "d5658f1bf77970b5", "name": "/usr/share/X11/locale/iso8859-4/XI18N_OBJS", "type": "file" }, { - "bom-ref": "d4f0511458121576", + "bom-ref": "ae579162006690f0", "name": "/usr/share/X11/locale/iso8859-4/XLC_LOCALE", "type": "file" }, { - "bom-ref": "4d73c9d627276187", + "bom-ref": "d34141126c3dbd95", "name": "/usr/share/X11/locale/iso8859-5/Compose", "type": "file" }, { - "bom-ref": "f4905177c3b442d6", + "bom-ref": "64f83cb5d64224dc", "name": "/usr/share/X11/locale/iso8859-5/XI18N_OBJS", "type": "file" }, { - "bom-ref": "f9b2d1024d5d25fc", + "bom-ref": "bf6ea74f99dbc1ea", "name": "/usr/share/X11/locale/iso8859-5/XLC_LOCALE", "type": "file" }, { - "bom-ref": "720bada37c575258", + "bom-ref": "62b15239752e6696", "name": "/usr/share/X11/locale/iso8859-6/Compose", "type": "file" }, { - "bom-ref": "32de14dadae4f84b", + "bom-ref": "a5d5bec7174e68f5", "name": "/usr/share/X11/locale/iso8859-6/XI18N_OBJS", "type": "file" }, { - "bom-ref": "aa6d83b470ac6f54", + "bom-ref": "f630651926848e32", "name": "/usr/share/X11/locale/iso8859-6/XLC_LOCALE", "type": "file" }, { - "bom-ref": "f464c319d625530e", + "bom-ref": "65be729f7a6e100c", "name": "/usr/share/X11/locale/iso8859-7/Compose", "type": "file" }, { - "bom-ref": "36cef79f1746093a", + "bom-ref": "1740e3439eec00f8", "name": "/usr/share/X11/locale/iso8859-7/XI18N_OBJS", "type": "file" }, { - "bom-ref": "77ea0f2dcdd462a0", + "bom-ref": "9b1c544a3997060e", "name": "/usr/share/X11/locale/iso8859-7/XLC_LOCALE", "type": "file" }, { - "bom-ref": "7fd6c132c32a749d", + "bom-ref": "40e0b57c5d37eadf", "name": "/usr/share/X11/locale/iso8859-8/Compose", "type": "file" }, { - "bom-ref": "790337fa9247e4f8", + "bom-ref": "57169dabbe0dc8ce", "name": "/usr/share/X11/locale/iso8859-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "0f071c98963ce7a9", + "bom-ref": "dfe5fdbb7ef5d2d3", "name": "/usr/share/X11/locale/iso8859-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "5654a632a39c6ec8", + "bom-ref": "d3c32b29b8eca732", "name": "/usr/share/X11/locale/iso8859-9/Compose", "type": "file" }, { - "bom-ref": "4f96e225dfb1d6d7", + "bom-ref": "59286924dee1b7e1", "name": "/usr/share/X11/locale/iso8859-9/XI18N_OBJS", "type": "file" }, { - "bom-ref": "7035563ff98e4e6f", + "bom-ref": "57d3b9211255350d", "name": "/usr/share/X11/locale/iso8859-9/XLC_LOCALE", "type": "file" }, { - "bom-ref": "2fa0b1b24e5a0fd3", + "bom-ref": "ecd23a8b523a79a5", "name": "/usr/share/X11/locale/iso8859-9e/Compose", "type": "file" }, { - "bom-ref": "b43ac129fb7debfb", + "bom-ref": "d02065aa604cf30d", "name": "/usr/share/X11/locale/iso8859-9e/XI18N_OBJS", "type": "file" }, { - "bom-ref": "2d8f808f12675483", + "bom-ref": "b558ec44e146ae89", "name": "/usr/share/X11/locale/iso8859-9e/XLC_LOCALE", "type": "file" }, { - "bom-ref": "6c3de4b06a701161", + "bom-ref": "dee35d076a8f1137", "name": "/usr/share/X11/locale/ja.JIS/Compose", "type": "file" }, { - "bom-ref": "1e60a474c3009261", + "bom-ref": "a5e7b199068c155f", "name": "/usr/share/X11/locale/ja.JIS/XI18N_OBJS", "type": "file" }, { - "bom-ref": "0f97a655aa309ec7", + "bom-ref": "ab795776bf23b895", "name": "/usr/share/X11/locale/ja.JIS/XLC_LOCALE", "type": "file" }, { - "bom-ref": "46da77e7ab97f2ca", + "bom-ref": "5b597a2236fc7688", "name": "/usr/share/X11/locale/ja.SJIS/Compose", "type": "file" }, { - "bom-ref": "533971dd5566d2c7", + "bom-ref": "fcdc8987b2d64f69", "name": "/usr/share/X11/locale/ja.SJIS/XI18N_OBJS", "type": "file" }, { - "bom-ref": "476c68c8c054a3ce", + "bom-ref": "bfe2d44205d29fb0", "name": "/usr/share/X11/locale/ja.SJIS/XLC_LOCALE", "type": "file" }, { - "bom-ref": "adb6ee4cb611746a", + "bom-ref": "ab2d94034cc92d4c", "name": "/usr/share/X11/locale/ja/Compose", "type": "file" }, { - "bom-ref": "e346437ac3c26821", + "bom-ref": "6f8cb140d29e2d67", "name": "/usr/share/X11/locale/ja/XI18N_OBJS", "type": "file" }, { - "bom-ref": "4dfe8c1e35bde352", + "bom-ref": "04ff5dfe5d423c0c", "name": "/usr/share/X11/locale/ja/XLC_LOCALE", "type": "file" }, { - "bom-ref": "09675d8d7cf56536", + "bom-ref": "026557fb6173486c", "name": "/usr/share/X11/locale/ja_JP.UTF-8/Compose", "type": "file" }, { - "bom-ref": "cc87ea2fbf55ca71", + "bom-ref": "1c95662de070b3ab", "name": "/usr/share/X11/locale/ja_JP.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "f45060e7452c328f", + "bom-ref": "ec2ffd335af8ca49", "name": "/usr/share/X11/locale/ja_JP.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "fb3ad3d2bf09b3e5", + "bom-ref": "59acd75a140b1ee3", "name": "/usr/share/X11/locale/km_KH.UTF-8/Compose", "type": "file" }, { - "bom-ref": "3ca945e0366f067a", + "bom-ref": "8012119cd1dcffd4", "name": "/usr/share/X11/locale/km_KH.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "27c693678e7357ca", + "bom-ref": "8c5ffb0b2eb6546c", "name": "/usr/share/X11/locale/km_KH.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "238d82f5e39d59a8", + "bom-ref": "262b235fe4c25d7a", "name": "/usr/share/X11/locale/ko/Compose", "type": "file" }, { - "bom-ref": "bf068b78520b2ee1", + "bom-ref": "5c0d17397bebda23", "name": "/usr/share/X11/locale/ko/XI18N_OBJS", "type": "file" }, { - "bom-ref": "ea225346dfc43db4", + "bom-ref": "7102adcfd8192f06", "name": "/usr/share/X11/locale/ko/XLC_LOCALE", "type": "file" }, { - "bom-ref": "b5e55229cb3c2b14", + "bom-ref": "9582ac590870c07e", "name": "/usr/share/X11/locale/ko_KR.UTF-8/Compose", "type": "file" }, { - "bom-ref": "552e75755476f714", + "bom-ref": "a6920fbcb8185a4e", "name": "/usr/share/X11/locale/ko_KR.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "cf6a1eb5f8762a24", + "bom-ref": "a0589da9504d2146", "name": "/usr/share/X11/locale/ko_KR.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "79a085c62032f095", + "bom-ref": "f5e325c0bfa3257b", "name": "/usr/share/X11/locale/koi8-c/Compose", "type": "file" }, { - "bom-ref": "da562fd87295af67", + "bom-ref": "04a084540e8a9ec9", "name": "/usr/share/X11/locale/koi8-c/XI18N_OBJS", "type": "file" }, { - "bom-ref": "3cff1c4d44f75d7d", + "bom-ref": "9058c73ebe517bab", "name": "/usr/share/X11/locale/koi8-c/XLC_LOCALE", "type": "file" }, { - "bom-ref": "f4d675b77d7ffc6f", + "bom-ref": "1529e5cefa0feae5", "name": "/usr/share/X11/locale/koi8-r/Compose", "type": "file" }, { - "bom-ref": "79a6443fd8acf54e", + "bom-ref": "5922a9f64155f528", "name": "/usr/share/X11/locale/koi8-r/XI18N_OBJS", "type": "file" }, { - "bom-ref": "111eaaaafbe88f57", + "bom-ref": "d90b118d17334cc5", "name": "/usr/share/X11/locale/koi8-r/XLC_LOCALE", "type": "file" }, { - "bom-ref": "67a0b38f9a2035f0", + "bom-ref": "e6206eef04c026d2", "name": "/usr/share/X11/locale/koi8-u/Compose", "type": "file" }, { - "bom-ref": "cba1d3cc1b785017", + "bom-ref": "981e792cd529b345", "name": "/usr/share/X11/locale/koi8-u/XI18N_OBJS", "type": "file" }, { - "bom-ref": "09c98ae27be40a70", + "bom-ref": "cca736713545e1d2", "name": "/usr/share/X11/locale/koi8-u/XLC_LOCALE", "type": "file" }, { - "bom-ref": "7ba42c5ed1c4f4c1", + "bom-ref": "4a5ce2c6f315f47b", "name": "/usr/share/X11/locale/locale.alias", "type": "file" }, { - "bom-ref": "23ddbccc24981fd4", + "bom-ref": "781e94cb17294986", "name": "/usr/share/X11/locale/locale.dir", "type": "file" }, { - "bom-ref": "3c2e47d58812ea4d", + "bom-ref": "46bfa49c88d0b53f", "name": "/usr/share/X11/locale/microsoft-cp1251/Compose", "type": "file" }, { - "bom-ref": "bb34b130d062cea4", + "bom-ref": "e6e23cace992a1d2", "name": "/usr/share/X11/locale/microsoft-cp1251/XI18N_OBJS", "type": "file" }, { - "bom-ref": "bd20dc591163a0f0", + "bom-ref": "6adaeeca47353cee", "name": "/usr/share/X11/locale/microsoft-cp1251/XLC_LOCALE", "type": "file" }, { - "bom-ref": "aba7732d9d43b03a", + "bom-ref": "3baf4cb8e0da6c10", "name": "/usr/share/X11/locale/microsoft-cp1255/Compose", "type": "file" }, { - "bom-ref": "58a66059dad0bc20", + "bom-ref": "3034c920df61e62e", "name": "/usr/share/X11/locale/microsoft-cp1255/XI18N_OBJS", "type": "file" }, { - "bom-ref": "5aa21aad41ee098f", + "bom-ref": "5f99c9c2a3c9dc91", "name": "/usr/share/X11/locale/microsoft-cp1255/XLC_LOCALE", "type": "file" }, { - "bom-ref": "9d117dd4c2179026", + "bom-ref": "7b033bce724e27d0", "name": "/usr/share/X11/locale/microsoft-cp1256/Compose", "type": "file" }, { - "bom-ref": "0cae3b6aee7113d8", + "bom-ref": "ec447356c8c6d07e", "name": "/usr/share/X11/locale/microsoft-cp1256/XI18N_OBJS", "type": "file" }, { - "bom-ref": "bffc48a7f211c613", + "bom-ref": "0177192eb4f6d335", "name": "/usr/share/X11/locale/microsoft-cp1256/XLC_LOCALE", "type": "file" }, { - "bom-ref": "0f24e5707d63ae7b", + "bom-ref": "e23c19ae425807b5", "name": "/usr/share/X11/locale/mulelao-1/Compose", "type": "file" }, { - "bom-ref": "67088a18f65f85e1", + "bom-ref": "a4c5baa572589e6f", "name": "/usr/share/X11/locale/mulelao-1/XI18N_OBJS", "type": "file" }, { - "bom-ref": "ca36ed0c62aadfd3", + "bom-ref": "59365676a2aa4aa9", "name": "/usr/share/X11/locale/mulelao-1/XLC_LOCALE", "type": "file" }, { - "bom-ref": "05ceea6c646f6bf4", + "bom-ref": "318982f498e7c626", "name": "/usr/share/X11/locale/nokhchi-1/Compose", "type": "file" }, { - "bom-ref": "037e35211d8b0c79", + "bom-ref": "8c177b622b49c1bf", "name": "/usr/share/X11/locale/nokhchi-1/XI18N_OBJS", "type": "file" }, { - "bom-ref": "f9a1695e134a88a4", + "bom-ref": "51debe6db47d1136", "name": "/usr/share/X11/locale/nokhchi-1/XLC_LOCALE", "type": "file" }, { - "bom-ref": "ce8e62402efb3552", + "bom-ref": "b79bf713ad2e4214", "name": "/usr/share/X11/locale/pt_BR.UTF-8/Compose", "type": "file" }, { - "bom-ref": "9e94afc8e68eb12e", + "bom-ref": "77ac1e4e4067f404", "name": "/usr/share/X11/locale/pt_BR.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "ac9ebeab283a461f", + "bom-ref": "140419da45629671", "name": "/usr/share/X11/locale/pt_BR.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "e159e8e96e80ea42", + "bom-ref": "0d03e6c987195798", "name": "/usr/share/X11/locale/pt_PT.UTF-8/Compose", "type": "file" }, { - "bom-ref": "b183bd3bd3e05d7f", + "bom-ref": "32e73465a16c41ed", "name": "/usr/share/X11/locale/pt_PT.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "b665e613a53e100c", + "bom-ref": "967eb7ecffac063a", "name": "/usr/share/X11/locale/pt_PT.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "7caee5cf2a57bf61", + "bom-ref": "f5902c5410af97af", "name": "/usr/share/X11/locale/ru_RU.UTF-8/Compose", "type": "file" }, { - "bom-ref": "17d29db3b02cfd25", + "bom-ref": "1dd68df0a6a925cf", "name": "/usr/share/X11/locale/ru_RU.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "f2ec1b654e47976e", + "bom-ref": "80126fb272db7d48", "name": "/usr/share/X11/locale/ru_RU.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "e4f1abcab04c1c52", + "bom-ref": "e8225ca260baf7f8", "name": "/usr/share/X11/locale/sr_RS.UTF-8/Compose", "type": "file" }, { - "bom-ref": "1902d37f83235a89", + "bom-ref": "f7df277d17ad898b", "name": "/usr/share/X11/locale/sr_RS.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "9ffbd3724fcbdc06", + "bom-ref": "48108e2bc3b75e54", "name": "/usr/share/X11/locale/sr_RS.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "7c3b0ecbbdcab271", + "bom-ref": "440a73b0f6248c7b", "name": "/usr/share/X11/locale/tatar-cyr/Compose", "type": "file" }, { - "bom-ref": "7f85aa1ce9bcd55d", + "bom-ref": "6889c1afb57d489f", "name": "/usr/share/X11/locale/tatar-cyr/XI18N_OBJS", "type": "file" }, { - "bom-ref": "131e5479f7257182", + "bom-ref": "5407b44b22c4b268", "name": "/usr/share/X11/locale/tatar-cyr/XLC_LOCALE", "type": "file" }, { - "bom-ref": "8906149124f7f8c5", + "bom-ref": "72fc40504ef76f9b", "name": "/usr/share/X11/locale/th_TH.UTF-8/Compose", "type": "file" }, { - "bom-ref": "6c7c0e8da1954a56", + "bom-ref": "807e6d21492abcc4", "name": "/usr/share/X11/locale/th_TH.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "decd7e8b3388a2f6", + "bom-ref": "aeebdb68d124a12c", "name": "/usr/share/X11/locale/th_TH.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "16ad06d31bf8a335", + "bom-ref": "b607f7e061e0a953", "name": "/usr/share/X11/locale/th_TH/Compose", "type": "file" }, { - "bom-ref": "a7b3d8e9f4b6dcee", + "bom-ref": "a56c231b74bcc1e8", "name": "/usr/share/X11/locale/th_TH/XI18N_OBJS", "type": "file" }, { - "bom-ref": "dc0c4d725beb7f10", + "bom-ref": "0c7e6506f5c65492", "name": "/usr/share/X11/locale/th_TH/XLC_LOCALE", "type": "file" }, { - "bom-ref": "e43593f4faa5b211", + "bom-ref": "96d85133615a27f7", "name": "/usr/share/X11/locale/tscii-0/Compose", "type": "file" }, { - "bom-ref": "4af10c8532bfe8e1", + "bom-ref": "3089660de9186af3", "name": "/usr/share/X11/locale/tscii-0/XI18N_OBJS", "type": "file" }, { - "bom-ref": "742d6d55c2a48977", + "bom-ref": "63caa20de83c3b1d", "name": "/usr/share/X11/locale/tscii-0/XLC_LOCALE", "type": "file" }, { - "bom-ref": "5ffd0085922ec93e", + "bom-ref": "adf660e2f33da688", "name": "/usr/share/X11/locale/vi_VN.tcvn/Compose", "type": "file" }, { - "bom-ref": "fbee8e636ceb0ea9", + "bom-ref": "a72ce8d1edc6f97b", "name": "/usr/share/X11/locale/vi_VN.tcvn/XI18N_OBJS", "type": "file" }, { - "bom-ref": "e7d0ae8c545c1229", + "bom-ref": "9d48e8dece5dfa6f", "name": "/usr/share/X11/locale/vi_VN.tcvn/XLC_LOCALE", "type": "file" }, { - "bom-ref": "3f4adc002ce808bf", + "bom-ref": "580468d448935809", "name": "/usr/share/X11/locale/vi_VN.viscii/Compose", "type": "file" }, { - "bom-ref": "c05750b004bcb2ce", + "bom-ref": "340b5669799d020c", "name": "/usr/share/X11/locale/vi_VN.viscii/XI18N_OBJS", "type": "file" }, { - "bom-ref": "d581e7ab7542d4d4", + "bom-ref": "9f61e5d29e592f66", "name": "/usr/share/X11/locale/vi_VN.viscii/XLC_LOCALE", "type": "file" }, { - "bom-ref": "3339a79f14ced706", + "bom-ref": "a17e8090a9fcf710", "name": "/usr/share/X11/locale/zh_CN.UTF-8/Compose", "type": "file" }, { - "bom-ref": "e6b97fe7173aacf3", + "bom-ref": "11e3903391e13d35", "name": "/usr/share/X11/locale/zh_CN.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "fd6f9d19027da9e5", + "bom-ref": "5147f80d33e05b83", "name": "/usr/share/X11/locale/zh_CN.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "cca0fa67ffebc498", + "bom-ref": "f8bb04910b342c26", "name": "/usr/share/X11/locale/zh_CN.gb18030/Compose", "type": "file" }, { - "bom-ref": "2ffde3c2fc9af032", + "bom-ref": "5cb0ec645fa0726c", "name": "/usr/share/X11/locale/zh_CN.gb18030/XI18N_OBJS", "type": "file" }, { - "bom-ref": "bfd54fd9f4cff8d1", + "bom-ref": "fe810b14d7af866b", "name": "/usr/share/X11/locale/zh_CN.gb18030/XLC_LOCALE", "type": "file" }, { - "bom-ref": "d7c90e93bccd600a", + "bom-ref": "bd502ae6dc19ca10", "name": "/usr/share/X11/locale/zh_CN.gbk/Compose", "type": "file" }, { - "bom-ref": "416077781446bccb", + "bom-ref": "1b8e9081303b81d5", "name": "/usr/share/X11/locale/zh_CN.gbk/XI18N_OBJS", "type": "file" }, { - "bom-ref": "37d9884de7617059", + "bom-ref": "a9baf1a654288d6f", "name": "/usr/share/X11/locale/zh_CN.gbk/XLC_LOCALE", "type": "file" }, { - "bom-ref": "5d769c8496b1e349", + "bom-ref": "7475faf4d3298db7", "name": "/usr/share/X11/locale/zh_CN/Compose", "type": "file" }, { - "bom-ref": "d818ac064a0db50d", + "bom-ref": "ae5a9afaf5de6c03", "name": "/usr/share/X11/locale/zh_CN/XI18N_OBJS", "type": "file" }, { - "bom-ref": "2999998541bc5371", + "bom-ref": "ae8921c3bb989777", "name": "/usr/share/X11/locale/zh_CN/XLC_LOCALE", "type": "file" }, { - "bom-ref": "bfff63355b2236a5", + "bom-ref": "59a24139955c172f", "name": "/usr/share/X11/locale/zh_HK.UTF-8/Compose", "type": "file" }, { - "bom-ref": "35a15af8fc21402e", + "bom-ref": "cab9191da0ba60dc", "name": "/usr/share/X11/locale/zh_HK.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "62ed66d80706077c", + "bom-ref": "69b18fb4d27c4e96", "name": "/usr/share/X11/locale/zh_HK.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "ff3409bb03d18cd2", + "bom-ref": "f45d2cc24c3fa6e0", "name": "/usr/share/X11/locale/zh_HK.big5/Compose", "type": "file" }, { - "bom-ref": "7dfd89d8abc85ba2", + "bom-ref": "c16cb764b4faabb4", "name": "/usr/share/X11/locale/zh_HK.big5/XI18N_OBJS", "type": "file" }, { - "bom-ref": "3228e50bb5fbdd59", + "bom-ref": "be6f78c11a477263", "name": "/usr/share/X11/locale/zh_HK.big5/XLC_LOCALE", "type": "file" }, { - "bom-ref": "57686d43a18d45ac", + "bom-ref": "d651b505070802b2", "name": "/usr/share/X11/locale/zh_HK.big5hkscs/Compose", "type": "file" }, { - "bom-ref": "547d3dfdffaa71f4", + "bom-ref": "a5ebde77e8d67cf6", "name": "/usr/share/X11/locale/zh_HK.big5hkscs/XI18N_OBJS", "type": "file" }, { - "bom-ref": "179a3b129829be1f", + "bom-ref": "48a4a8177f06d9d5", "name": "/usr/share/X11/locale/zh_HK.big5hkscs/XLC_LOCALE", "type": "file" }, { - "bom-ref": "90d6ca0e7a6c7905", + "bom-ref": "bc0d423cab0fd3c3", "name": "/usr/share/X11/locale/zh_TW.UTF-8/Compose", "type": "file" }, { - "bom-ref": "41ac2b0cbfae7eb9", + "bom-ref": "3da655813739de97", "name": "/usr/share/X11/locale/zh_TW.UTF-8/XI18N_OBJS", "type": "file" }, { - "bom-ref": "93d917800e96230a", + "bom-ref": "49b3e24e87771790", "name": "/usr/share/X11/locale/zh_TW.UTF-8/XLC_LOCALE", "type": "file" }, { - "bom-ref": "a34f7945c33af3e2", + "bom-ref": "24ee78c4109b9634", "name": "/usr/share/X11/locale/zh_TW.big5/Compose", "type": "file" }, { - "bom-ref": "0d170f515a080db7", + "bom-ref": "1901a5f9f074cb65", "name": "/usr/share/X11/locale/zh_TW.big5/XI18N_OBJS", "type": "file" }, { - "bom-ref": "5ad2608d738aec2f", + "bom-ref": "962728da04795c45", "name": "/usr/share/X11/locale/zh_TW.big5/XLC_LOCALE", "type": "file" }, { - "bom-ref": "d4e501a09e5f901b", + "bom-ref": "f848b95d85b0f199", "name": "/usr/share/X11/locale/zh_TW/Compose", "type": "file" }, { - "bom-ref": "8f4938277c73e5a7", + "bom-ref": "b158e1996c984b19", "name": "/usr/share/X11/locale/zh_TW/XI18N_OBJS", "type": "file" }, { - "bom-ref": "aacb650012e2ce01", + "bom-ref": "ee37b270a0656e67", "name": "/usr/share/X11/locale/zh_TW/XLC_LOCALE", "type": "file" }, { - "bom-ref": "0ff0df92213fe340", + "bom-ref": "92ca7302b50620d2", "name": "/usr/share/aclocal-1.16/amversion.m4", "type": "file" }, { - "bom-ref": "15bfcf3e9f1a5012", + "bom-ref": "f67d61359f0fce20", "name": "/usr/share/aclocal-1.16/ar-lib.m4", "type": "file" }, { - "bom-ref": "19d2c5891f8317b5", + "bom-ref": "fa3db58906a9f99f", "name": "/usr/share/aclocal-1.16/as.m4", "type": "file" }, { - "bom-ref": "300dc54d982319a7", + "bom-ref": "c9d68b9413b314bd", "name": "/usr/share/aclocal-1.16/auxdir.m4", "type": "file" }, { - "bom-ref": "29a76b58af0d14ea", + "bom-ref": "50018f2060d94274", "name": "/usr/share/aclocal-1.16/cond-if.m4", "type": "file" }, { - "bom-ref": "21391e62b49cac83", + "bom-ref": "10ca3e8863e95e75", "name": "/usr/share/aclocal-1.16/cond.m4", "type": "file" }, { - "bom-ref": "17a551611d708574", + "bom-ref": "a0134de62f5fab7e", "name": "/usr/share/aclocal-1.16/depend.m4", "type": "file" }, { - "bom-ref": "bc83d7d1d3a04e8d", + "bom-ref": "71d7e8668034c63f", "name": "/usr/share/aclocal-1.16/depout.m4", "type": "file" }, { - "bom-ref": "b17c8238f7b72d0d", + "bom-ref": "eb5c3f204ea6493f", "name": "/usr/share/aclocal-1.16/dmalloc.m4", "type": "file" }, { - "bom-ref": "53ee10d288266b41", + "bom-ref": "b79fa99eaf83d4b7", "name": "/usr/share/aclocal-1.16/extra-recurs.m4", "type": "file" }, { - "bom-ref": "5be2976a477ecb99", + "bom-ref": "701f55073914d4f7", "name": "/usr/share/aclocal-1.16/gcj.m4", "type": "file" }, { - "bom-ref": "d8ba821fed2a2051", + "bom-ref": "d0163d5129da81b7", "name": "/usr/share/aclocal-1.16/init.m4", "type": "file" }, { - "bom-ref": "b201a5013df31aae", + "bom-ref": "5ce5ce6133be0434", "name": "/usr/share/aclocal-1.16/install-sh.m4", "type": "file" }, { - "bom-ref": "cc5874505a36ac55", + "bom-ref": "58b4da528c266d87", "name": "/usr/share/aclocal-1.16/internal/ac-config-macro-dirs.m4", "type": "file" }, { - "bom-ref": "6762e2471cdb026e", + "bom-ref": "733ef7eba07bb98c", "name": "/usr/share/aclocal-1.16/lead-dot.m4", "type": "file" }, { - "bom-ref": "955a2a737c6eaa35", + "bom-ref": "54836df7363b408b", "name": "/usr/share/aclocal-1.16/lex.m4", "type": "file" }, { - "bom-ref": "9db3534ffe59d02a", + "bom-ref": "72ab9334690328c0", "name": "/usr/share/aclocal-1.16/lispdir.m4", "type": "file" }, { - "bom-ref": "942bf4a92d9d4fda", + "bom-ref": "c726d3d070db13bc", "name": "/usr/share/aclocal-1.16/maintainer.m4", "type": "file" }, { - "bom-ref": "c67a99d661166629", + "bom-ref": "7eee0dc011294c37", "name": "/usr/share/aclocal-1.16/make.m4", "type": "file" }, { - "bom-ref": "2a38fe0de1b3af2c", + "bom-ref": "41ae8b82eab3cdbe", "name": "/usr/share/aclocal-1.16/missing.m4", "type": "file" }, { - "bom-ref": "7518038a9656de96", + "bom-ref": "7bb0bec53852d4a8", "name": "/usr/share/aclocal-1.16/mkdirp.m4", "type": "file" }, { - "bom-ref": "89a02c68644d19aa", + "bom-ref": "74b60f40bd87995c", "name": "/usr/share/aclocal-1.16/obsolete.m4", "type": "file" }, { - "bom-ref": "6c0c4029aba73345", + "bom-ref": "f75fefbce1e212af", "name": "/usr/share/aclocal-1.16/options.m4", "type": "file" }, { - "bom-ref": "b7850d18782cd81e", + "bom-ref": "92ef80b791ae19b0", "name": "/usr/share/aclocal-1.16/prog-cc-c-o.m4", "type": "file" }, { - "bom-ref": "0c7aca0fa54295d0", + "bom-ref": "b2af5821d7c88e9e", "name": "/usr/share/aclocal-1.16/python.m4", "type": "file" }, { - "bom-ref": "ccf3b7a467d86554", + "bom-ref": "dc74413f3cd00b1a", "name": "/usr/share/aclocal-1.16/runlog.m4", "type": "file" }, { - "bom-ref": "f6f1725598b2fe6b", + "bom-ref": "3b7d3efb26bc42bd", "name": "/usr/share/aclocal-1.16/sanity.m4", "type": "file" }, { - "bom-ref": "ada530c7171db65c", + "bom-ref": "ed0508d53eb43556", "name": "/usr/share/aclocal-1.16/silent.m4", "type": "file" }, { - "bom-ref": "6b7f7bb1805dfb77", + "bom-ref": "758f1276d160dc31", "name": "/usr/share/aclocal-1.16/strip.m4", "type": "file" }, { - "bom-ref": "1757fcbf201a7304", + "bom-ref": "c89e5eed357902fe", "name": "/usr/share/aclocal-1.16/substnot.m4", "type": "file" }, { - "bom-ref": "c01b7638e72ea1f6", + "bom-ref": "45b97a0921aa2274", "name": "/usr/share/aclocal-1.16/tar.m4", "type": "file" }, { - "bom-ref": "9b78292aebfaad92", + "bom-ref": "df716d14b42e8c98", "name": "/usr/share/aclocal-1.16/upc.m4", "type": "file" }, { - "bom-ref": "d81275786445391c", + "bom-ref": "c09cc64bd2c50652", "name": "/usr/share/aclocal-1.16/vala.m4", "type": "file" }, { - "bom-ref": "844e30daec17fac7", + "bom-ref": "cffeaf3e4512b591", "name": "/usr/share/aclocal/ac_check_krb5.m4", "type": "file" }, { - "bom-ref": "d75ac5474440aec2", + "bom-ref": "04b0c3e4fa4df440", "name": "/usr/share/aclocal/expat.m4", "type": "file" }, { - "bom-ref": "08918008a31776f3", + "bom-ref": "8220927c6d6771c1", "name": "/usr/share/aclocal/libtool.m4", "type": "file" }, { - "bom-ref": "da79fb511ed6d8e7", + "bom-ref": "972f0c2f8e6a5249", "name": "/usr/share/aclocal/libxml2.m4", "type": "file" }, { - "bom-ref": "ffe9cd0c7b55b99a", + "bom-ref": "90d8c8670839b350", "name": "/usr/share/aclocal/ltargz.m4", "type": "file" }, { - "bom-ref": "9560a0ecedf3e87e", + "bom-ref": "1ef5215aac4d676c", "name": "/usr/share/aclocal/ltoptions.m4", "type": "file" }, { - "bom-ref": "15df352b54c923d8", + "bom-ref": "e8364270be379ab2", "name": "/usr/share/aclocal/ltsugar.m4", "type": "file" }, { - "bom-ref": "c001f006fd24969d", + "bom-ref": "06debf8a0a0dbdc7", "name": "/usr/share/aclocal/ltversion.m4", "type": "file" }, { - "bom-ref": "cff03084d9980d64", + "bom-ref": "c44f1e31f49956b6", "name": "/usr/share/aclocal/lt~obsolete.m4", "type": "file" }, { - "bom-ref": "be674c6667a68040", + "bom-ref": "054da6cb6ac0c168", "name": "/usr/share/aclocal/pkg.m4", "type": "file" }, { - "bom-ref": "726d11d7c09d2849", + "bom-ref": "cb745aced6c748eb", "name": "/usr/share/alsa/alsa.conf", "type": "file" }, { - "bom-ref": "7fb0cfc81ddbc7df", + "bom-ref": "19b603c72e365281", "name": "/usr/share/alsa/cards/AACI.conf", "type": "file" }, { - "bom-ref": "f5dc89a24bf17f82", + "bom-ref": "97163cf1486038e4", "name": "/usr/share/alsa/cards/ATIIXP-MODEM.conf", "type": "file" }, { - "bom-ref": "608e3109eb949b86", + "bom-ref": "e13aea1b9764b258", "name": "/usr/share/alsa/cards/ATIIXP-SPDMA.conf", "type": "file" }, { - "bom-ref": "a97b55bd09fe0294", + "bom-ref": "47ac25d0b19185aa", "name": "/usr/share/alsa/cards/ATIIXP.conf", "type": "file" }, { - "bom-ref": "0f94d3d1a2a0b548", + "bom-ref": "d8ccad27a81b2476", "name": "/usr/share/alsa/cards/AU8810.conf", "type": "file" }, { - "bom-ref": "8e19be644bd34fb3", + "bom-ref": "37f39c9c83a29251", "name": "/usr/share/alsa/cards/AU8820.conf", "type": "file" }, { - "bom-ref": "8742d7a0b47c4fbe", + "bom-ref": "5c3f7cf3f64a9270", "name": "/usr/share/alsa/cards/AU8830.conf", "type": "file" }, { - "bom-ref": "74776b50a78a15b7", + "bom-ref": "c61900033ea60e79", "name": "/usr/share/alsa/cards/Audigy.conf", "type": "file" }, { - "bom-ref": "98df68c5f533ca3d", + "bom-ref": "de47b2e299bb6cd3", "name": "/usr/share/alsa/cards/Audigy2.conf", "type": "file" }, { - "bom-ref": "c6448526973a9965", + "bom-ref": "599c009c11dee88f", "name": "/usr/share/alsa/cards/Aureon51.conf", "type": "file" }, { - "bom-ref": "f76575a14bb51613", + "bom-ref": "34d9a33501a10f6d", "name": "/usr/share/alsa/cards/Aureon71.conf", "type": "file" }, { - "bom-ref": "ffc8e949ddbfbdd8", + "bom-ref": "c93e49a0b615423e", "name": "/usr/share/alsa/cards/CA0106.conf", "type": "file" }, { - "bom-ref": "9dcb6e0f9b9776da", + "bom-ref": "f939eb628eded384", "name": "/usr/share/alsa/cards/CMI8338-SWIEC.conf", "type": "file" }, { - "bom-ref": "7e63480d8ef77a24", + "bom-ref": "6bb8a68db60fc4ba", "name": "/usr/share/alsa/cards/CMI8338.conf", "type": "file" }, { - "bom-ref": "8b06faad0d04f201", + "bom-ref": "171c6f3477282cbb", "name": "/usr/share/alsa/cards/CMI8738-MC6.conf", "type": "file" }, { - "bom-ref": "0a868b239fdff0a3", + "bom-ref": "b1012f98f5384e61", "name": "/usr/share/alsa/cards/CMI8738-MC8.conf", "type": "file" }, { - "bom-ref": "bf503625db7e0145", + "bom-ref": "682d4b706cd578c3", "name": "/usr/share/alsa/cards/CMI8788.conf", "type": "file" }, { - "bom-ref": "fef95cb0d735c2ec", + "bom-ref": "422669873d15b9ca", "name": "/usr/share/alsa/cards/CS46xx.conf", "type": "file" }, { - "bom-ref": "094b640fdb224701", + "bom-ref": "0dfa6e49e87802a7", "name": "/usr/share/alsa/cards/EMU10K1.conf", "type": "file" }, { - "bom-ref": "a403d218bccc3033", + "bom-ref": "de6a2dc93b344ec5", "name": "/usr/share/alsa/cards/EMU10K1X.conf", "type": "file" }, { - "bom-ref": "612b52ddc89478c9", + "bom-ref": "2dbae4bafbe9f313", "name": "/usr/share/alsa/cards/ENS1370.conf", "type": "file" }, { - "bom-ref": "323fe0286460b773", + "bom-ref": "7363d3e3555c7b99", "name": "/usr/share/alsa/cards/ENS1371.conf", "type": "file" }, { - "bom-ref": "64acd67ea4acd00c", + "bom-ref": "785abf19bf26a70e", "name": "/usr/share/alsa/cards/ES1968.conf", "type": "file" }, { - "bom-ref": "6b489e7bebadfdcc", + "bom-ref": "70803e6e4bca2642", "name": "/usr/share/alsa/cards/Echo_Echo3G.conf", "type": "file" }, { - "bom-ref": "e8cbd99a5a58c879", + "bom-ref": "d0f7c55a430362af", "name": "/usr/share/alsa/cards/FM801.conf", "type": "file" }, { - "bom-ref": "5bd69c7f1abfae30", + "bom-ref": "58186f22b06ea84e", "name": "/usr/share/alsa/cards/FWSpeakers.conf", "type": "file" }, { - "bom-ref": "19f3b2050a5abdb7", + "bom-ref": "834a96c759dc4231", "name": "/usr/share/alsa/cards/FireWave.conf", "type": "file" }, { - "bom-ref": "7f8a968a2444496e", + "bom-ref": "a344dadf43f2b7d0", "name": "/usr/share/alsa/cards/GUS.conf", "type": "file" }, { - "bom-ref": "feb17fcdabd62cdf", + "bom-ref": "d0a60b861bf4a1a9", "name": "/usr/share/alsa/cards/HDA-Intel.conf", "type": "file" }, { - "bom-ref": "7f4d0f897e7563b0", + "bom-ref": "7337c2d5614681ee", "name": "/usr/share/alsa/cards/HdmiLpeAudio.conf", "type": "file" }, { - "bom-ref": "f6341ddcfd1ac69d", + "bom-ref": "b826eb3af58c226f", "name": "/usr/share/alsa/cards/ICE1712.conf", "type": "file" }, { - "bom-ref": "4a8f86ab83efc105", + "bom-ref": "fbb99936b87b27bb", "name": "/usr/share/alsa/cards/ICE1724.conf", "type": "file" }, { - "bom-ref": "921008b113686175", + "bom-ref": "860af18844eeab67", "name": "/usr/share/alsa/cards/ICH-MODEM.conf", "type": "file" }, { - "bom-ref": "2dabee2cce9957f8", + "bom-ref": "adcee506b9c0e5d2", "name": "/usr/share/alsa/cards/ICH.conf", "type": "file" }, { - "bom-ref": "264978215522eff7", + "bom-ref": "70e966ae43db5fad", "name": "/usr/share/alsa/cards/ICH4.conf", "type": "file" }, { - "bom-ref": "f8c97207e851f902", + "bom-ref": "e2d5baca72fb07b0", "name": "/usr/share/alsa/cards/Loopback.conf", "type": "file" }, { - "bom-ref": "044ea1d6457795ed", + "bom-ref": "27f6a209627124f3", "name": "/usr/share/alsa/cards/Maestro3.conf", "type": "file" }, { - "bom-ref": "725cb16b9fe41d21", + "bom-ref": "577c8ff644d3863f", "name": "/usr/share/alsa/cards/NFORCE.conf", "type": "file" }, { - "bom-ref": "1098d2eec1f7cc32", + "bom-ref": "790767363d3ae550", "name": "/usr/share/alsa/cards/PC-Speaker.conf", "type": "file" }, { - "bom-ref": "3cce0767d58ac803", + "bom-ref": "d7f2692467ce2819", "name": "/usr/share/alsa/cards/PMac.conf", "type": "file" }, { - "bom-ref": "eddd95347d36e727", + "bom-ref": "1dd112dc8b3ec0f9", "name": "/usr/share/alsa/cards/PMacToonie.conf", "type": "file" }, { - "bom-ref": "67f1974366bc16f5", + "bom-ref": "df8592033543017b", "name": "/usr/share/alsa/cards/PS3.conf", "type": "file" }, { - "bom-ref": "cbc6240b3cb1611e", + "bom-ref": "5c3fd86c1a09cf08", "name": "/usr/share/alsa/cards/RME9636.conf", "type": "file" }, { - "bom-ref": "f3262074327355f0", + "bom-ref": "6e3746d4a39fab66", "name": "/usr/share/alsa/cards/RME9652.conf", "type": "file" }, { - "bom-ref": "ba699eb331202c3e", + "bom-ref": "1ec81768eb265504", "name": "/usr/share/alsa/cards/SB-XFi.conf", "type": "file" }, { - "bom-ref": "98f892577a497f51", + "bom-ref": "3aad7186a75406db", "name": "/usr/share/alsa/cards/SI7018.conf", "type": "file" }, { - "bom-ref": "e58d75018d3f8031", + "bom-ref": "c42eab4672fc274b", "name": "/usr/share/alsa/cards/TRID4DWAVENX.conf", "type": "file" }, { - "bom-ref": "56f3da28b4d000be", + "bom-ref": "54648a545ac751b4", "name": "/usr/share/alsa/cards/USB-Audio.conf", "type": "file" }, { - "bom-ref": "ddac6f90fb0e3357", + "bom-ref": "1fe8c7c339babbf9", "name": "/usr/share/alsa/cards/VIA686A.conf", "type": "file" }, { - "bom-ref": "5ba0ef9637e17bad", + "bom-ref": "4362c8a24dcc2073", "name": "/usr/share/alsa/cards/VIA8233.conf", "type": "file" }, { - "bom-ref": "ebdc5c6bfc15531a", + "bom-ref": "fcd02ddac3635674", "name": "/usr/share/alsa/cards/VIA8233A.conf", "type": "file" }, { - "bom-ref": "a9470112ba2bbad3", + "bom-ref": "7c620ee14ed5b95d", "name": "/usr/share/alsa/cards/VIA8237.conf", "type": "file" }, { - "bom-ref": "2df29ab4dd6e71a8", + "bom-ref": "4edbede1e50d93a6", "name": "/usr/share/alsa/cards/VX222.conf", "type": "file" }, { - "bom-ref": "b1723b26ae0a8a0d", + "bom-ref": "4edf071899ce1aa7", "name": "/usr/share/alsa/cards/VXPocket.conf", "type": "file" }, { - "bom-ref": "cf197d374942b050", + "bom-ref": "c534148528989d0a", "name": "/usr/share/alsa/cards/VXPocket440.conf", "type": "file" }, { - "bom-ref": "b00c2c30e403b7e5", + "bom-ref": "9dbcf887ac8a302b", "name": "/usr/share/alsa/cards/YMF744.conf", "type": "file" }, { - "bom-ref": "c20b67274a389081", + "bom-ref": "71e49fbba3ca5107", "name": "/usr/share/alsa/cards/aliases.conf", "type": "file" }, { - "bom-ref": "8e017b9aed69eacd", + "bom-ref": "a726e81e9c130d97", "name": "/usr/share/alsa/cards/pistachio-card.conf", "type": "file" }, { - "bom-ref": "59fbcbb1bf74785c", + "bom-ref": "0be55558615511a6", "name": "/usr/share/alsa/cards/vc4-hdmi.conf", "type": "file" }, { - "bom-ref": "9e20596287bb9557", + "bom-ref": "6f8e00ddc86c244d", "name": "/usr/share/alsa/ctl/default.conf", "type": "file" }, { - "bom-ref": "1da7dc368246a014", + "bom-ref": "8482c8b5d5ce3f5e", "name": "/usr/share/alsa/pcm/center_lfe.conf", "type": "file" }, { - "bom-ref": "542ebe2697565a06", + "bom-ref": "cddb2ec00253ea78", "name": "/usr/share/alsa/pcm/default.conf", "type": "file" }, { - "bom-ref": "94a0bc105cf075a9", + "bom-ref": "8acde06ee1dba6c3", "name": "/usr/share/alsa/pcm/dmix.conf", "type": "file" }, { - "bom-ref": "eac200b448cf8b05", + "bom-ref": "8dcafb0c1f2fef87", "name": "/usr/share/alsa/pcm/dpl.conf", "type": "file" }, { - "bom-ref": "a6c095ed6a0cdaa6", + "bom-ref": "517c69acb9217c40", "name": "/usr/share/alsa/pcm/dsnoop.conf", "type": "file" }, { - "bom-ref": "4fafdbb7068c5725", + "bom-ref": "80acea7a348d9cef", "name": "/usr/share/alsa/pcm/front.conf", "type": "file" }, { - "bom-ref": "be066b8aabaddbb4", + "bom-ref": "0f43b685d6e2ebfa", "name": "/usr/share/alsa/pcm/hdmi.conf", "type": "file" }, { - "bom-ref": "59c6f4164d4dd636", + "bom-ref": "0621df07728b7d44", "name": "/usr/share/alsa/pcm/iec958.conf", "type": "file" }, { - "bom-ref": "64a2fd606eaa7333", + "bom-ref": "c91a738ebe167ffd", "name": "/usr/share/alsa/pcm/modem.conf", "type": "file" }, { - "bom-ref": "e18a36edea067b70", + "bom-ref": "96df2976d05c73a6", "name": "/usr/share/alsa/pcm/rear.conf", "type": "file" }, { - "bom-ref": "5c948684a34b70b5", + "bom-ref": "5db2962de09e405f", "name": "/usr/share/alsa/pcm/side.conf", "type": "file" }, { - "bom-ref": "6b690c33b5ad0d1f", + "bom-ref": "3e8c93340e65a1d5", "name": "/usr/share/alsa/pcm/surround21.conf", "type": "file" }, { - "bom-ref": "9af1b7b17a7769c2", + "bom-ref": "e17a7a3a0e4ef928", "name": "/usr/share/alsa/pcm/surround40.conf", "type": "file" }, { - "bom-ref": "aeb9f05fcbda5905", + "bom-ref": "9fd8f3a3ac2482f3", "name": "/usr/share/alsa/pcm/surround41.conf", "type": "file" }, { - "bom-ref": "f108e68d548322ba", + "bom-ref": "f6e39bfd91e0e098", "name": "/usr/share/alsa/pcm/surround50.conf", "type": "file" }, { - "bom-ref": "7f69981581c177fb", + "bom-ref": "11c5d3cfa10ae0f5", "name": "/usr/share/alsa/pcm/surround51.conf", "type": "file" }, { - "bom-ref": "498d0c8bf5ce3c57", + "bom-ref": "a5455cccdfd4b6ed", "name": "/usr/share/alsa/pcm/surround71.conf", "type": "file" }, { - "bom-ref": "ef4ccdbfb01d92a0", - "name": "/usr/share/applications/nsight-compute-2026.1.1.desktop", + "bom-ref": "4947e92a55b29582", + "name": "/usr/share/applications/nsight-compute-2026.3.0.desktop", "type": "file" }, { - "bom-ref": "7ff2a65b02e6fb76", + "bom-ref": "b8b3ce4dab36b034", "name": "/usr/share/applications/python3.12.desktop", "type": "file" }, { - "bom-ref": "ea5af6727938c137", + "bom-ref": "b358f60f2309468a", "name": "/usr/share/applications/vim.desktop", "type": "file" }, { - "bom-ref": "9250c8e9200d285e", + "bom-ref": "eae029cd2f17e24b", "name": "/usr/share/apport/package-hooks/openssh-client.py", "type": "file" }, { - "bom-ref": "dc81ad7ac59b03ca", + "bom-ref": "5150f0ad9c407ab4", "name": "/usr/share/apport/package-hooks/source_fontconfig.py", "type": "file" }, { - "bom-ref": "0952b275bdc24f65", + "bom-ref": "48dad2672e42376f", "name": "/usr/share/apport/package-hooks/source_shadow.py", "type": "file" }, { - "bom-ref": "f64a384c4f834f42", + "bom-ref": "5017937b2ee5455c", "name": "/usr/share/autoconf/Autom4te/C4che.pm", "type": "file" }, { - "bom-ref": "6183df2eb04a5145", + "bom-ref": "37ab148d0dd96bf3", "name": "/usr/share/autoconf/Autom4te/ChannelDefs.pm", "type": "file" }, { - "bom-ref": "cf4d460a2aa44b91", + "bom-ref": "11f0dc42b1df209b", "name": "/usr/share/autoconf/Autom4te/Channels.pm", "type": "file" }, { - "bom-ref": "97d3ad96c499dded", + "bom-ref": "c3e728c1177c2e13", "name": "/usr/share/autoconf/Autom4te/Config.pm", "type": "file" }, { - "bom-ref": "4bc66dbcb7b78ce3", + "bom-ref": "a018a0222cf709a9", "name": "/usr/share/autoconf/Autom4te/Configure_ac.pm", "type": "file" }, { - "bom-ref": "6be0ffbe67d43b06", + "bom-ref": "22e81bb9ca2e2dbc", "name": "/usr/share/autoconf/Autom4te/FileUtils.pm", "type": "file" }, { - "bom-ref": "25c917da0385d948", + "bom-ref": "4ac8f209c8d1865a", "name": "/usr/share/autoconf/Autom4te/General.pm", "type": "file" }, { - "bom-ref": "18d2901ff4d57e0a", + "bom-ref": "68eafcacd7b032ec", "name": "/usr/share/autoconf/Autom4te/Getopt.pm", "type": "file" }, { - "bom-ref": "61b3ec2153b23f50", + "bom-ref": "590ba59fb34eea7e", "name": "/usr/share/autoconf/Autom4te/Request.pm", "type": "file" }, { - "bom-ref": "adddb24107e41ff6", + "bom-ref": "a49cd26b57216754", "name": "/usr/share/autoconf/Autom4te/XFile.pm", "type": "file" }, { - "bom-ref": "80226feecb614543", + "bom-ref": "cd1bd46cf4f87969", "name": "/usr/share/autoconf/INSTALL", "type": "file" }, { - "bom-ref": "881b5c2ba3a19a3b", + "bom-ref": "74220668f3cc8691", "name": "/usr/share/autoconf/autoconf/autoconf.m4", "type": "file" }, { - "bom-ref": "81b00be884cfb10b", + "bom-ref": "e7fb61ea80a32b65", "name": "/usr/share/autoconf/autoconf/autoconf.m4f", "type": "file" }, { - "bom-ref": "17369801efbf509c", + "bom-ref": "d2822750b6fa0dc6", "name": "/usr/share/autoconf/autoconf/autoheader.m4", "type": "file" }, { - "bom-ref": "296eebe5b6409dc1", + "bom-ref": "175fb1df30710f37", "name": "/usr/share/autoconf/autoconf/autoscan.m4", "type": "file" }, { - "bom-ref": "6c48d0ec7502cf3d", + "bom-ref": "98903b5de9811af3", "name": "/usr/share/autoconf/autoconf/autotest.m4", "type": "file" }, { - "bom-ref": "29c3966442e9bda6", + "bom-ref": "6b7679740f9690c4", "name": "/usr/share/autoconf/autoconf/autoupdate.m4", "type": "file" }, { - "bom-ref": "0fc81c7d1cd7528c", + "bom-ref": "06a26c028ce1ef92", "name": "/usr/share/autoconf/autoconf/c.m4", "type": "file" }, { - "bom-ref": "e07d571e4e60e313", + "bom-ref": "3e714795fb2da219", "name": "/usr/share/autoconf/autoconf/erlang.m4", "type": "file" }, { - "bom-ref": "e9dc241a2c612906", + "bom-ref": "f47e7afd851f0670", "name": "/usr/share/autoconf/autoconf/fortran.m4", "type": "file" }, { - "bom-ref": "6b19f1938cb8d4c2", + "bom-ref": "426f2dd906ea976c", "name": "/usr/share/autoconf/autoconf/functions.m4", "type": "file" }, { - "bom-ref": "98564cb38f6a74a6", + "bom-ref": "c9a4e6d687c41af0", "name": "/usr/share/autoconf/autoconf/general.m4", "type": "file" }, { - "bom-ref": "68cad2a9f721382c", + "bom-ref": "f865df1671c4ce86", "name": "/usr/share/autoconf/autoconf/go.m4", "type": "file" }, { - "bom-ref": "f36bed80a88bac5e", + "bom-ref": "e6956cbb6bdacb40", "name": "/usr/share/autoconf/autoconf/headers.m4", "type": "file" }, { - "bom-ref": "df099478c80c6c54", + "bom-ref": "c001f37927bb7516", "name": "/usr/share/autoconf/autoconf/lang.m4", "type": "file" }, { - "bom-ref": "0158e092e97b286f", + "bom-ref": "81b670da9a530281", "name": "/usr/share/autoconf/autoconf/libs.m4", "type": "file" }, { - "bom-ref": "78cbc36ef8f2066b", + "bom-ref": "69f3360d8a957871", "name": "/usr/share/autoconf/autoconf/oldnames.m4", "type": "file" }, { - "bom-ref": "a5b94fb0ab2b4fe2", + "bom-ref": "f5b92f16b8d6ebdc", "name": "/usr/share/autoconf/autoconf/programs.m4", "type": "file" }, { - "bom-ref": "2282ce80aae93014", + "bom-ref": "2a623b3a756bc6c2", "name": "/usr/share/autoconf/autoconf/specific.m4", "type": "file" }, { - "bom-ref": "9f4b6830532eab2b", + "bom-ref": "f0c9630aebde721d", "name": "/usr/share/autoconf/autoconf/status.m4", "type": "file" }, { - "bom-ref": "e784c29401aa1b6b", + "bom-ref": "f8ad5e2590fb99c1", "name": "/usr/share/autoconf/autoconf/trailer.m4", "type": "file" }, { - "bom-ref": "e7f127abc2755255", + "bom-ref": "e3a8e2481e1ad727", "name": "/usr/share/autoconf/autoconf/types.m4", "type": "file" }, { - "bom-ref": "a39bcd81b6e2444b", + "bom-ref": "4c0d537ae448f74d", "name": "/usr/share/autoconf/autom4te.cfg", "type": "file" }, { - "bom-ref": "1df21648ce97cbf7", + "bom-ref": "639502d485f1d895", "name": "/usr/share/autoconf/autoscan/autoscan.list", "type": "file" }, { - "bom-ref": "8c9d8e0ff7955a06", + "bom-ref": "4bb59eee96013d28", "name": "/usr/share/autoconf/autotest/autotest.m4", "type": "file" }, { - "bom-ref": "09495f1d24a07862", + "bom-ref": "f742488f5e63298c", "name": "/usr/share/autoconf/autotest/autotest.m4f", "type": "file" }, { - "bom-ref": "c42881f4bd294c63", + "bom-ref": "b7bd9bc9f6154535", "name": "/usr/share/autoconf/autotest/general.m4", "type": "file" }, { - "bom-ref": "ccfeb2c9eb33c6de", + "bom-ref": "394846f26f15140c", "name": "/usr/share/autoconf/autotest/specific.m4", "type": "file" }, { - "bom-ref": "ac8ec715a2087b8f", + "bom-ref": "d5e6970e0f58202d", "name": "/usr/share/autoconf/build-aux/config.guess", "type": "file" }, { - "bom-ref": "b101cbd989583781", + "bom-ref": "b28e7527b12a1937", "name": "/usr/share/autoconf/build-aux/config.sub", "type": "file" }, { - "bom-ref": "e8590e7c25a79974", + "bom-ref": "799c5c719499f942", "name": "/usr/share/autoconf/build-aux/install-sh", "type": "file" }, { - "bom-ref": "93ba099fbd76df6b", + "bom-ref": "65639920ad86d4c1", "name": "/usr/share/autoconf/m4sugar/foreach.m4", "type": "file" }, { - "bom-ref": "48bc04e6c957395d", + "bom-ref": "b1ae0a631fbcc9c7", "name": "/usr/share/autoconf/m4sugar/m4sh.m4", "type": "file" }, { - "bom-ref": "3b6add041a572cf6", + "bom-ref": "c3d4c9330bd321f0", "name": "/usr/share/autoconf/m4sugar/m4sh.m4f", "type": "file" }, { - "bom-ref": "dc09bf507b000b58", + "bom-ref": "f63d2d40ccec1c62", "name": "/usr/share/autoconf/m4sugar/m4sugar.m4", "type": "file" }, { - "bom-ref": "cbcdf8ea68687e0c", + "bom-ref": "9bac45b380506296", "name": "/usr/share/autoconf/m4sugar/m4sugar.m4f", "type": "file" }, { - "bom-ref": "c711ae97610efd8f", + "bom-ref": "57bb375b93d400ed", "name": "/usr/share/autoconf/m4sugar/version.m4", "type": "file" }, { - "bom-ref": "d0f2028f03df0e9a", + "bom-ref": "4d750af5e4f0eafc", "name": "/usr/share/automake-1.16/Automake/ChannelDefs.pm", "type": "file" }, { - "bom-ref": "f836a87a45251828", + "bom-ref": "0298db750e209c22", "name": "/usr/share/automake-1.16/Automake/Channels.pm", "type": "file" }, { - "bom-ref": "33e80bb12b920baf", + "bom-ref": "eddea23d2b6f5cc9", "name": "/usr/share/automake-1.16/Automake/Condition.pm", "type": "file" }, { - "bom-ref": "7a6e8ba8ef493367", + "bom-ref": "e34459158a227299", "name": "/usr/share/automake-1.16/Automake/Config.pm", "type": "file" }, { - "bom-ref": "b6c82ac5e99246e0", + "bom-ref": "d2fdd6ae8548e926", "name": "/usr/share/automake-1.16/Automake/Configure_ac.pm", "type": "file" }, { - "bom-ref": "7c01c825e3d6c840", + "bom-ref": "a7b63c9444c18d26", "name": "/usr/share/automake-1.16/Automake/DisjConditions.pm", "type": "file" }, { - "bom-ref": "59d336b54243c312", + "bom-ref": "aca6ce3eee47fb80", "name": "/usr/share/automake-1.16/Automake/FileUtils.pm", "type": "file" }, { - "bom-ref": "0dbe3c476926b6c2", + "bom-ref": "ba90e05215f095f4", "name": "/usr/share/automake-1.16/Automake/General.pm", "type": "file" }, { - "bom-ref": "ea1604e20726335e", + "bom-ref": "7a59f646374a99cc", "name": "/usr/share/automake-1.16/Automake/Getopt.pm", "type": "file" }, { - "bom-ref": "ba0f42a11545e966", + "bom-ref": "3de0a18fed830b28", "name": "/usr/share/automake-1.16/Automake/Item.pm", "type": "file" }, { - "bom-ref": "6bd5a670d5778726", + "bom-ref": "83eb987cd5dd847c", "name": "/usr/share/automake-1.16/Automake/ItemDef.pm", "type": "file" }, { - "bom-ref": "565967f99192eac6", + "bom-ref": "5cbecffb170dad5c", "name": "/usr/share/automake-1.16/Automake/Language.pm", "type": "file" }, { - "bom-ref": "219cc04208b1326c", + "bom-ref": "d3f10579d5f522e2", "name": "/usr/share/automake-1.16/Automake/Location.pm", "type": "file" }, { - "bom-ref": "61ae5cff113c59f9", + "bom-ref": "9bc078a96fb35e73", "name": "/usr/share/automake-1.16/Automake/Options.pm", "type": "file" }, { - "bom-ref": "9a92db6133915b16", + "bom-ref": "168e374d04792770", "name": "/usr/share/automake-1.16/Automake/Rule.pm", "type": "file" }, { - "bom-ref": "0a6afc59b5e50c81", + "bom-ref": "187fa6d98beff14f", "name": "/usr/share/automake-1.16/Automake/RuleDef.pm", "type": "file" }, { - "bom-ref": "c6a059208eae5fde", + "bom-ref": "69a043428809bfd4", "name": "/usr/share/automake-1.16/Automake/VarDef.pm", "type": "file" }, { - "bom-ref": "8b3c8ee5a4c3fb8f", + "bom-ref": "105ab1183ac60445", "name": "/usr/share/automake-1.16/Automake/Variable.pm", "type": "file" }, { - "bom-ref": "1ea5675876ee0264", + "bom-ref": "ea086d05959c45c6", "name": "/usr/share/automake-1.16/Automake/Version.pm", "type": "file" }, { - "bom-ref": "949de3fef3d94baa", + "bom-ref": "17e6e5ef44a869bc", "name": "/usr/share/automake-1.16/Automake/Wrap.pm", "type": "file" }, { - "bom-ref": "777dc62d27963675", + "bom-ref": "79e62fe67a475d93", "name": "/usr/share/automake-1.16/Automake/XFile.pm", "type": "file" }, { - "bom-ref": "4b96b76b39dea3c0", + "bom-ref": "b862ffa0b48966a6", "name": "/usr/share/automake-1.16/COPYING", "type": "file" }, { - "bom-ref": "9199df28ed4574dc", + "bom-ref": "8705cd781311d482", "name": "/usr/share/automake-1.16/INSTALL", "type": "file" }, { - "bom-ref": "533ba8e4f83185d9", + "bom-ref": "03e0b7c5b46499a3", "name": "/usr/share/automake-1.16/am/check.am", "type": "file" }, { - "bom-ref": "c3b2c1dce3de222c", + "bom-ref": "6241f424282e875e", "name": "/usr/share/automake-1.16/am/check2.am", "type": "file" }, { - "bom-ref": "095fd246bbf6eccb", + "bom-ref": "45c8502447ae9359", "name": "/usr/share/automake-1.16/am/clean-hdr.am", "type": "file" }, { - "bom-ref": "427984ce49ca7841", + "bom-ref": "69182cb236d5d733", "name": "/usr/share/automake-1.16/am/clean.am", "type": "file" }, { - "bom-ref": "54c5d755cf1560ae", + "bom-ref": "9ff8df140535b910", "name": "/usr/share/automake-1.16/am/compile.am", "type": "file" }, { - "bom-ref": "23fd1485715b2e93", + "bom-ref": "8e485870f508b9a5", "name": "/usr/share/automake-1.16/am/configure.am", "type": "file" }, { - "bom-ref": "ab6e9c031cbe18d7", + "bom-ref": "cc7f28d3fc917991", "name": "/usr/share/automake-1.16/am/data.am", "type": "file" }, { - "bom-ref": "29d06ea8304279e9", + "bom-ref": "f6751f333fb3e3c7", "name": "/usr/share/automake-1.16/am/dejagnu.am", "type": "file" }, { - "bom-ref": "72540576bbba0ae0", + "bom-ref": "f52c6c66efcab2be", "name": "/usr/share/automake-1.16/am/depend.am", "type": "file" }, { - "bom-ref": "d64ef28004ed15b9", + "bom-ref": "f223f44d8bd873b7", "name": "/usr/share/automake-1.16/am/depend2.am", "type": "file" }, { - "bom-ref": "f1173b2e8b8b76ac", + "bom-ref": "b27a256026ff1812", "name": "/usr/share/automake-1.16/am/distdir.am", "type": "file" }, { - "bom-ref": "a3033acbc7d311a8", + "bom-ref": "7161041f69603692", "name": "/usr/share/automake-1.16/am/footer.am", "type": "file" }, { - "bom-ref": "38608d201f97bf52", + "bom-ref": "329aa24bb86f7888", "name": "/usr/share/automake-1.16/am/header-vars.am", "type": "file" }, { - "bom-ref": "8e928779dd15f57f", + "bom-ref": "7ecc43a3ec0ad0f1", "name": "/usr/share/automake-1.16/am/header.am", "type": "file" }, { - "bom-ref": "36331e643d4ccf48", + "bom-ref": "6fca21af8fa204f6", "name": "/usr/share/automake-1.16/am/inst-vars.am", "type": "file" }, { - "bom-ref": "79f29cf534504bbc", + "bom-ref": "0930d0eb30f443e2", "name": "/usr/share/automake-1.16/am/install.am", "type": "file" }, { - "bom-ref": "37f91612721626b4", + "bom-ref": "3e0a88935f3771f2", "name": "/usr/share/automake-1.16/am/java.am", "type": "file" }, { - "bom-ref": "912557269f5b3df1", + "bom-ref": "b3ccc78145b3a6cf", "name": "/usr/share/automake-1.16/am/lang-compile.am", "type": "file" }, { - "bom-ref": "bbe7e4f043164ead", + "bom-ref": "e26a577c4d29042b", "name": "/usr/share/automake-1.16/am/lex.am", "type": "file" }, { - "bom-ref": "7e29e693aa35b6ba", + "bom-ref": "d74251ab443fdb90", "name": "/usr/share/automake-1.16/am/library.am", "type": "file" }, { - "bom-ref": "f483d71b91154daf", + "bom-ref": "543d8e8369b0e571", "name": "/usr/share/automake-1.16/am/libs.am", "type": "file" }, { - "bom-ref": "99ecd5455e5c68a7", + "bom-ref": "7091f03a7be8fa05", "name": "/usr/share/automake-1.16/am/libtool.am", "type": "file" }, { - "bom-ref": "ef848f1417ddfbd9", + "bom-ref": "638844938e8d7643", "name": "/usr/share/automake-1.16/am/lisp.am", "type": "file" }, { - "bom-ref": "2445181e69579f41", + "bom-ref": "7c8a4244b8389873", "name": "/usr/share/automake-1.16/am/ltlib.am", "type": "file" }, { - "bom-ref": "9cc328f219d0951a", + "bom-ref": "e08cb938fb367d94", "name": "/usr/share/automake-1.16/am/ltlibrary.am", "type": "file" }, { - "bom-ref": "21661159e1937bbf", + "bom-ref": "971c869b4d89e7e5", "name": "/usr/share/automake-1.16/am/mans-vars.am", "type": "file" }, { - "bom-ref": "cfc67be983df78b3", + "bom-ref": "fc1494c39ad83175", "name": "/usr/share/automake-1.16/am/mans.am", "type": "file" }, { - "bom-ref": "e31284300a57722b", + "bom-ref": "b0cfb68fdae600e9", "name": "/usr/share/automake-1.16/am/program.am", "type": "file" }, { - "bom-ref": "36e24e6f776fcbe2", + "bom-ref": "bd17ee22664b17b8", "name": "/usr/share/automake-1.16/am/progs.am", "type": "file" }, { - "bom-ref": "8c57729958bb72c0", + "bom-ref": "ffe8ee23ebca1eaa", "name": "/usr/share/automake-1.16/am/python.am", "type": "file" }, { - "bom-ref": "2833809a362d468f", + "bom-ref": "0c0bd4a3960e5711", "name": "/usr/share/automake-1.16/am/remake-hdr.am", "type": "file" }, { - "bom-ref": "f3b9cbe076c3bf6d", + "bom-ref": "92e68a3b5f2133f7", "name": "/usr/share/automake-1.16/am/scripts.am", "type": "file" }, { - "bom-ref": "084e2d136544b1c2", + "bom-ref": "82e3a70ae39f8218", "name": "/usr/share/automake-1.16/am/subdirs.am", "type": "file" }, { - "bom-ref": "914726e2694cf1f4", + "bom-ref": "c510f858531e14fe", "name": "/usr/share/automake-1.16/am/tags.am", "type": "file" }, { - "bom-ref": "8da5672570053223", + "bom-ref": "7f408c8473850395", "name": "/usr/share/automake-1.16/am/texi-vers.am", "type": "file" }, { - "bom-ref": "cf06343ae01ca038", + "bom-ref": "1fce3198916ba826", "name": "/usr/share/automake-1.16/am/texibuild.am", "type": "file" }, { - "bom-ref": "a1269dcf46a76268", + "bom-ref": "9569feffd15a1722", "name": "/usr/share/automake-1.16/am/texinfos.am", "type": "file" }, { - "bom-ref": "c3d07974358524f4", + "bom-ref": "74e105fb136732da", "name": "/usr/share/automake-1.16/am/vala.am", "type": "file" }, { - "bom-ref": "b21accfc0dccbb61", + "bom-ref": "5a0996363a48aafb", "name": "/usr/share/automake-1.16/am/yacc.am", "type": "file" }, { - "bom-ref": "864816fbe92c114e", + "bom-ref": "811c34b4fbd6a724", "name": "/usr/share/automake-1.16/ar-lib", "type": "file" }, { - "bom-ref": "0c16152ca183108a", + "bom-ref": "e0663f9d5c940848", "name": "/usr/share/automake-1.16/compile", "type": "file" }, { - "bom-ref": "e3097f76b8c3fd54", + "bom-ref": "a9f88ac3d49e04fa", "name": "/usr/share/automake-1.16/depcomp", "type": "file" }, { - "bom-ref": "663a5d8b8102b9d4", + "bom-ref": "37ca40ae21ff1a92", "name": "/usr/share/automake-1.16/install-sh", "type": "file" }, { - "bom-ref": "deded3082de0fb77", + "bom-ref": "8bdc5e55fa449c31", "name": "/usr/share/automake-1.16/mdate-sh", "type": "file" }, { - "bom-ref": "cc3fea3738b4a2c3", + "bom-ref": "ce177c33b0f83835", "name": "/usr/share/automake-1.16/missing", "type": "file" }, { - "bom-ref": "1bc9b4f68e02095c", + "bom-ref": "dfab1b6869bb952e", "name": "/usr/share/automake-1.16/mkinstalldirs", "type": "file" }, { - "bom-ref": "55d3305876d821af", + "bom-ref": "88c5630215d5f771", "name": "/usr/share/automake-1.16/py-compile", "type": "file" }, { - "bom-ref": "b4114ecb7e3b2bbe", + "bom-ref": "b1a9ca653b13088c", "name": "/usr/share/automake-1.16/tap-driver.sh", "type": "file" }, { - "bom-ref": "2451f20c15203afa", + "bom-ref": "4e02c2be154efe1c", "name": "/usr/share/automake-1.16/test-driver", "type": "file" }, { - "bom-ref": "f93c81a3fe562041", + "bom-ref": "2acff5bf9e611577", "name": "/usr/share/automake-1.16/texinfo.tex", "type": "file" }, { - "bom-ref": "b8d6711f76240b34", + "bom-ref": "1ebf8af8c9668516", "name": "/usr/share/automake-1.16/ylwrap", "type": "file" }, { - "bom-ref": "e91fcae347f6957a", + "bom-ref": "49ba91dd0201b9e0", "name": "/usr/share/base-files/dot.bashrc", "type": "file" }, { - "bom-ref": "09a5a12d8b57cf58", + "bom-ref": "e13ff97044ed8872", "name": "/usr/share/base-files/dot.profile", "type": "file" }, { - "bom-ref": "2b9ea7b5fb2d1229", + "bom-ref": "0f968b5f3c83d0cf", "name": "/usr/share/base-files/dot.profile.md5sums", "type": "file" }, { - "bom-ref": "cc221bc8337da050", + "bom-ref": "d10714534d47a65e", "name": "/usr/share/base-files/info.dir", "type": "file" }, { - "bom-ref": "169895ffe7d87b88", + "bom-ref": "df1fde35726f5a46", "name": "/usr/share/base-files/motd", "type": "file" }, { - "bom-ref": "2a0ae08a59e352f0", + "bom-ref": "54d154489a454982", "name": "/usr/share/base-files/networks", "type": "file" }, { - "bom-ref": "aa549a73a82b4607", + "bom-ref": "e5f6161f5fe77e19", "name": "/usr/share/base-files/profile", "type": "file" }, { - "bom-ref": "f83df69eb05d5c1f", + "bom-ref": "94daf59c71b01bd5", "name": "/usr/share/base-files/profile.md5sums", "type": "file" }, { - "bom-ref": "0cd1cc24c43a76ac", + "bom-ref": "9b7ecf0ab13e8516", "name": "/usr/share/base-files/staff-group-for-usr-local", "type": "file" }, { - "bom-ref": "fca3e90bd057e95c", + "bom-ref": "2598e85a85cba57a", "name": "/usr/share/base-passwd/group.master", "type": "file" }, { - "bom-ref": "8f0a506eb505e6cb", + "bom-ref": "aeb49cd7afa89bed", "name": "/usr/share/base-passwd/passwd.master", "type": "file" }, { - "bom-ref": "1074d3b5b2de765e", + "bom-ref": "d7fdab44ae25823c", "name": "/usr/share/bash-completion/completions/addpart", "type": "file" }, { - "bom-ref": "b8fd81285af83729", + "bom-ref": "d5385356292cfc8f", "name": "/usr/share/bash-completion/completions/apt", "type": "file" }, { - "bom-ref": "562bb6ed2df9f25f", + "bom-ref": "e2fab416eabc02e1", "name": "/usr/share/bash-completion/completions/blkdiscard", "type": "file" }, { - "bom-ref": "7679e5b653ba4b4a", + "bom-ref": "2a240882f89579e4", "name": "/usr/share/bash-completion/completions/blkid", "type": "file" }, { - "bom-ref": "97dc91cab9e76848", + "bom-ref": "89001e0a4f056eee", "name": "/usr/share/bash-completion/completions/blkzone", "type": "file" }, { - "bom-ref": "c71ded47d2534286", + "bom-ref": "51a6b2a58d3320fc", "name": "/usr/share/bash-completion/completions/blockdev", "type": "file" }, { - "bom-ref": "e5acf929a2442b05", + "bom-ref": "0bdbac76aa3e51db", "name": "/usr/share/bash-completion/completions/chcpu", "type": "file" }, { - "bom-ref": "33e7ee8070bf6e71", + "bom-ref": "48bc43dec3025f9b", "name": "/usr/share/bash-completion/completions/chmem", "type": "file" }, { - "bom-ref": "23c7c681e3ec5290", + "bom-ref": "f17743a91a73c61e", "name": "/usr/share/bash-completion/completions/chrt", "type": "file" }, { - "bom-ref": "ab21e3b79d14801f", + "bom-ref": "248884373e73fb61", "name": "/usr/share/bash-completion/completions/ctrlaltdel", "type": "file" }, { - "bom-ref": "868a80677fbc7198", + "bom-ref": "f08925126b36eef6", "name": "/usr/share/bash-completion/completions/debconf", "type": "file" }, { - "bom-ref": "0e875f53ace77757", + "bom-ref": "3a4cd2ecbc9e1859", "name": "/usr/share/bash-completion/completions/delpart", "type": "file" }, { - "bom-ref": "f3bf16123f1311dc", + "bom-ref": "f5d337094fb14da2", "name": "/usr/share/bash-completion/completions/dmesg", "type": "file" }, { - "bom-ref": "3b8eb2320d208c72", + "bom-ref": "4c113fa9ef981aec", "name": "/usr/share/bash-completion/completions/fallocate", "type": "file" }, { - "bom-ref": "fa05ac723e569585", + "bom-ref": "aad1b48229c1b70f", "name": "/usr/share/bash-completion/completions/findfs", "type": "file" }, { - "bom-ref": "467c8cb8a9b36f7f", + "bom-ref": "fb68b0c417a9be19", "name": "/usr/share/bash-completion/completions/findmnt", "type": "file" }, { - "bom-ref": "7edadb8c0ded29d9", + "bom-ref": "f7d8d8420f650deb", "name": "/usr/share/bash-completion/completions/flock", "type": "file" }, { - "bom-ref": "5e6c34c50eb437bf", + "bom-ref": "5576584d77f04889", "name": "/usr/share/bash-completion/completions/fsck", "type": "file" }, { - "bom-ref": "1f3ce5f3abbc5c07", + "bom-ref": "632773bead6281d5", "name": "/usr/share/bash-completion/completions/fsck.cramfs", "type": "file" }, { - "bom-ref": "100cad5687860a94", + "bom-ref": "a47db58b14c04e0e", "name": "/usr/share/bash-completion/completions/fsck.minix", "type": "file" }, { - "bom-ref": "a6f360832f9d7da9", + "bom-ref": "8481dcfce89681ab", "name": "/usr/share/bash-completion/completions/fsfreeze", "type": "file" }, { - "bom-ref": "de2377bbbaf86c34", + "bom-ref": "b7be2febb22715fe", "name": "/usr/share/bash-completion/completions/fstrim", "type": "file" }, { - "bom-ref": "8d79652d98239d8f", + "bom-ref": "a0147b3e920b94c1", "name": "/usr/share/bash-completion/completions/getopt", "type": "file" }, { - "bom-ref": "6586377e37e2b6ea", + "bom-ref": "df2e571da55d0dcf", "name": "/usr/share/bash-completion/completions/git", "type": "file" }, { - "bom-ref": "e4da08f8b76b22e8", + "bom-ref": "36d0c9b7590a61fe", "name": "/usr/share/bash-completion/completions/hardlink", "type": "file" }, { - "bom-ref": "7e83d96975305481", + "bom-ref": "32ae4be195d7fe47", "name": "/usr/share/bash-completion/completions/ionice", "type": "file" }, { - "bom-ref": "13323d0645aeec06", + "bom-ref": "f06bed115e872254", "name": "/usr/share/bash-completion/completions/ipcmk", "type": "file" }, { - "bom-ref": "b59401402c13310e", + "bom-ref": "71ceeb2f1df0299c", "name": "/usr/share/bash-completion/completions/ipcrm", "type": "file" }, { - "bom-ref": "5f6c8d5d1472ee40", + "bom-ref": "bfc2d8e657d57e76", "name": "/usr/share/bash-completion/completions/ipcs", "type": "file" }, { - "bom-ref": "7fb00c176145f3d0", + "bom-ref": "4d4d09560ed253e2", "name": "/usr/share/bash-completion/completions/isosize", "type": "file" }, { - "bom-ref": "766c039fb379ed28", + "bom-ref": "d8410a56a71664ce", "name": "/usr/share/bash-completion/completions/last", "type": "file" }, { - "bom-ref": "caa1c4a965363962", + "bom-ref": "3d8b273ba1726270", "name": "/usr/share/bash-completion/completions/ldattach", "type": "file" }, { - "bom-ref": "f9f2d84736522606", + "bom-ref": "bb8780ad509c56e0", "name": "/usr/share/bash-completion/completions/logger", "type": "file" }, { - "bom-ref": "c2a1bfbf08d2c51b", + "bom-ref": "2046d2e7b7ec8765", "name": "/usr/share/bash-completion/completions/losetup", "type": "file" }, { - "bom-ref": "9e89d14406ba9e09", + "bom-ref": "d63567153e5caaeb", "name": "/usr/share/bash-completion/completions/lsblk", "type": "file" }, { - "bom-ref": "55d4f6fcdabab6f1", + "bom-ref": "0db0a844366b3ebb", "name": "/usr/share/bash-completion/completions/lscpu", "type": "file" }, { - "bom-ref": "d3c181611580b463", + "bom-ref": "0108a1c25290b489", "name": "/usr/share/bash-completion/completions/lsipc", "type": "file" }, { - "bom-ref": "967f22507a71602a", + "bom-ref": "7eb3b0e1857c43e8", "name": "/usr/share/bash-completion/completions/lslocks", "type": "file" }, { - "bom-ref": "db56c928a8d0691b", + "bom-ref": "96188fe557896f89", "name": "/usr/share/bash-completion/completions/lslogins", "type": "file" }, { - "bom-ref": "48b959d8da41589b", + "bom-ref": "4d1b397d091e61b5", "name": "/usr/share/bash-completion/completions/lsmem", "type": "file" }, { - "bom-ref": "ef1d5d140b886fb5", + "bom-ref": "d442491700a84a83", "name": "/usr/share/bash-completion/completions/lsns", "type": "file" }, { - "bom-ref": "86b0333d3f1daf64", + "bom-ref": "fc152dcb35fefe76", "name": "/usr/share/bash-completion/completions/mcookie", "type": "file" }, { - "bom-ref": "631c3ce60dde4af0", + "bom-ref": "1b361ea59ed62bba", "name": "/usr/share/bash-completion/completions/mesg", "type": "file" }, { - "bom-ref": "134a5cc5b13cc67f", + "bom-ref": "86a597e6c2cfeae1", "name": "/usr/share/bash-completion/completions/mkfs", "type": "file" }, { - "bom-ref": "e86cac3a7a590b78", + "bom-ref": "75f5bbb722628faa", "name": "/usr/share/bash-completion/completions/mkfs.bfs", "type": "file" }, { - "bom-ref": "d555978c12b35f8b", + "bom-ref": "a525cb78365ced2d", "name": "/usr/share/bash-completion/completions/mkfs.cramfs", "type": "file" }, { - "bom-ref": "52d0aaf30ef247bf", + "bom-ref": "626d2847153221a9", "name": "/usr/share/bash-completion/completions/mkfs.minix", "type": "file" }, { - "bom-ref": "5de9fe5ad2136cc4", + "bom-ref": "da64cdafd3f5f652", "name": "/usr/share/bash-completion/completions/mkswap", "type": "file" }, { - "bom-ref": "01dd7ec32dfbcf40", + "bom-ref": "02f890a0a556039a", "name": "/usr/share/bash-completion/completions/more", "type": "file" }, { - "bom-ref": "f499057516201d17", + "bom-ref": "4d5ebf8db4731021", "name": "/usr/share/bash-completion/completions/mount", "type": "file" }, { - "bom-ref": "03cac2832a2365ae", + "bom-ref": "42a5d32f51aa5ea4", "name": "/usr/share/bash-completion/completions/mountpoint", "type": "file" }, { - "bom-ref": "752c700518f42684", + "bom-ref": "9e0c42ee7a9697c6", "name": "/usr/share/bash-completion/completions/namei", "type": "file" }, { - "bom-ref": "797b5085898a36ea", + "bom-ref": "2736d68d8ef1a630", "name": "/usr/share/bash-completion/completions/ninja", "type": "file" }, { - "bom-ref": "d0b3318c7d2f8c59", + "bom-ref": "08e715b2d91b04af", "name": "/usr/share/bash-completion/completions/nsenter", "type": "file" }, { - "bom-ref": "c14212b6e2ee2c63", + "bom-ref": "23becc150d894929", "name": "/usr/share/bash-completion/completions/partx", "type": "file" }, { - "bom-ref": "69f213a3a13357ed", + "bom-ref": "418fea21a5f74843", "name": "/usr/share/bash-completion/completions/pivot_root", "type": "file" }, { - "bom-ref": "e02cd3858ae1309a", + "bom-ref": "b89e12a50d1103d8", "name": "/usr/share/bash-completion/completions/prlimit", "type": "file" }, { - "bom-ref": "5e266d3d52108bec", + "bom-ref": "230464ea856d1a3a", "name": "/usr/share/bash-completion/completions/readprofile", "type": "file" }, { - "bom-ref": "c5a66ed598136e1f", + "bom-ref": "f0a7590e959ae979", "name": "/usr/share/bash-completion/completions/renice", "type": "file" }, { - "bom-ref": "a314bc80b9b0ed6a", + "bom-ref": "cc5d5fd118f48314", "name": "/usr/share/bash-completion/completions/resizepart", "type": "file" }, { - "bom-ref": "4dd4883b394aa037", + "bom-ref": "1023b1c9fdd6b461", "name": "/usr/share/bash-completion/completions/rev", "type": "file" }, { - "bom-ref": "24d5ea0766a5e8af", + "bom-ref": "8a64868d65652781", "name": "/usr/share/bash-completion/completions/rtcwake", "type": "file" }, { - "bom-ref": "09f1d29d8b0dd82f", + "bom-ref": "b3426010ea1fb925", "name": "/usr/share/bash-completion/completions/script", "type": "file" }, { - "bom-ref": "144df0fd9a2f166d", + "bom-ref": "5f6f5d04e4e0107b", "name": "/usr/share/bash-completion/completions/scriptlive", "type": "file" }, { - "bom-ref": "9703d3b1cf2b2a24", + "bom-ref": "eec1074e05585f62", "name": "/usr/share/bash-completion/completions/scriptreplay", "type": "file" }, { - "bom-ref": "e0c31a851e7d6a4f", + "bom-ref": "331a6d7c821bae39", "name": "/usr/share/bash-completion/completions/setarch", "type": "file" }, { - "bom-ref": "c074b94e61618e87", + "bom-ref": "e0c2f030a3e1d1b1", "name": "/usr/share/bash-completion/completions/setpriv", "type": "file" }, { - "bom-ref": "f6624fa769de6ccd", + "bom-ref": "a35e33bd65a33253", "name": "/usr/share/bash-completion/completions/setsid", "type": "file" }, { - "bom-ref": "ac09d1ba77c2fe6c", + "bom-ref": "11e080353ed8d4ee", "name": "/usr/share/bash-completion/completions/setterm", "type": "file" }, { - "bom-ref": "913fb2ea51876aae", + "bom-ref": "c96a4f8b51531a24", "name": "/usr/share/bash-completion/completions/su", "type": "file" }, { - "bom-ref": "12c4f46ae5c6a8a5", + "bom-ref": "3fd7a7eb8a0a4e43", "name": "/usr/share/bash-completion/completions/swaplabel", "type": "file" }, { - "bom-ref": "ecec01c860601f1e", + "bom-ref": "b839e1530d77a5d0", "name": "/usr/share/bash-completion/completions/swapoff", "type": "file" }, { - "bom-ref": "f8e09ebbb8ca9122", + "bom-ref": "0ad1fb884fa604bc", "name": "/usr/share/bash-completion/completions/swapon", "type": "file" }, { - "bom-ref": "6189f85c707edff2", + "bom-ref": "919a05336959c7c0", "name": "/usr/share/bash-completion/completions/taskset", "type": "file" }, { - "bom-ref": "636047b2b6a9928c", + "bom-ref": "569a857e79dbcf52", "name": "/usr/share/bash-completion/completions/uclampset", "type": "file" }, { - "bom-ref": "016faea58496f88b", + "bom-ref": "26115d8491e65d81", "name": "/usr/share/bash-completion/completions/umount", "type": "file" }, { - "bom-ref": "2b019e544c7b803f", + "bom-ref": "7b20c94b302ac681", "name": "/usr/share/bash-completion/completions/unshare", "type": "file" }, { - "bom-ref": "daa7e4d4aab596d6", + "bom-ref": "6cb25a972fbb0758", "name": "/usr/share/bash-completion/completions/utmpdump", "type": "file" }, { - "bom-ref": "2264737ae967d13f", + "bom-ref": "2c78dc7076569a31", "name": "/usr/share/bash-completion/completions/wall", "type": "file" }, { - "bom-ref": "99f1d1a68c775a09", + "bom-ref": "29d061f4d3f07a23", "name": "/usr/share/bash-completion/completions/wdctl", "type": "file" }, { - "bom-ref": "f6924372a9cd8a98", + "bom-ref": "293ff7b247cb56ba", "name": "/usr/share/bash-completion/completions/whereis", "type": "file" }, { - "bom-ref": "18f832312d8b1c96", + "bom-ref": "390a08df8784d590", "name": "/usr/share/bash-completion/completions/wipefs", "type": "file" }, { - "bom-ref": "01432fa2197ed7b2", + "bom-ref": "2516a78cfb4fb560", "name": "/usr/share/bash-completion/completions/zramctl", "type": "file" }, { - "bom-ref": "c5be670c2bc1086d", + "bom-ref": "ae04c520069e0e33", "name": "/usr/share/binfmts/llvm-18-runtime.binfmt", "type": "file" }, { - "bom-ref": "70b30aacd12d7b44", + "bom-ref": "dd10936fd6d5caca", "name": "/usr/share/binfmts/python3.12", "type": "file" }, { - "bom-ref": "1685ceb7a8489c86", + "bom-ref": "40ef71fb033643f8", "name": "/usr/share/bug/apt/script", "type": "file" }, { - "bom-ref": "62fc9ea6a2ba00fb", + "bom-ref": "8bcb0e79829bca45", "name": "/usr/share/bug/binutils/presubj", "type": "file" }, { - "bom-ref": "970a8c3efdea3711", + "bom-ref": "3b75cf1d40f7c26f", "name": "/usr/share/bug/dpkg", "type": "file" }, { - "bom-ref": "486feb702141f527", + "bom-ref": "50a8f3b53f80f9b6", "name": "/usr/share/bug/dpkg-dev", "type": "file" }, { - "bom-ref": "7750f8f83589f29f", + "bom-ref": "1be534f466211509", "name": "/usr/share/bug/file/control", "type": "file" }, { - "bom-ref": "e76bd614808f6026", + "bom-ref": "a5cf2c4cbf5f3e9c", "name": "/usr/share/bug/file/presubj", "type": "file" }, { - "bom-ref": "7bd49abef842868b", + "bom-ref": "0a8bfd04efaf1e39", "name": "/usr/share/bug/init-system-helpers/control", "type": "file" }, { - "bom-ref": "ddb0c1d38e9d8296", + "bom-ref": "7c26d59b594b2c3b", "name": "/usr/share/bug/libdpkg-perl", "type": "file" }, { - "bom-ref": "0985faf72b896bcc", + "bom-ref": "3b1d41f228093ca2", "name": "/usr/share/bug/libmagic1t64/control", "type": "file" }, { - "bom-ref": "d4d77a8f807d4fde", + "bom-ref": "84161ba91ecb7a80", "name": "/usr/share/bug/libmagic1t64/presubj", "type": "file" }, { - "bom-ref": "8a359ce3c5cf6e43", + "bom-ref": "d8e18bcbfc44987d", "name": "/usr/share/bug/libsox-fmt-alsa/presubj", "type": "file" }, { - "bom-ref": "1e5a3d87421f932e", + "bom-ref": "58bae7cf351ba3cc", "name": "/usr/share/bug/libsox-fmt-base/presubj", "type": "file" }, { - "bom-ref": "2d7d9ef394ae2ef3", + "bom-ref": "9b8f0e616ecca929", "name": "/usr/share/bug/libsox3/presubj", "type": "file" }, { - "bom-ref": "c0a2b013b5f73176", + "bom-ref": "8b051bd4de40c82e", "name": "/usr/share/bug/media-types/presubj", "type": "file" }, { - "bom-ref": "bb82d60986bef1ff", + "bom-ref": "587082b04c0c8705", "name": "/usr/share/bug/procps/presubj", "type": "file" }, { - "bom-ref": "157396b0c622f96c", + "bom-ref": "8f93b4adcf7b2222", "name": "/usr/share/bug/sox/presubj", "type": "file" }, { - "bom-ref": "97482964fe3d47a5", + "bom-ref": "3f748f43a1c6491c", "name": "/usr/share/bug/vim-tiny/presubj", "type": "file" }, { - "bom-ref": "b81868b7fb2fe66f", + "bom-ref": "3178c4671aae5dfe", "name": "/usr/share/bug/vim-tiny/script", "type": "file" }, { - "bom-ref": "67cc5f2d363a26b1", + "bom-ref": "146fd0e5e2a649c1", "name": "/usr/share/bug/vim/presubj", "type": "file" }, { - "bom-ref": "be7da627a4666187", + "bom-ref": "b02941c1dcec44ef", "name": "/usr/share/bug/vim/script", "type": "file" }, { - "bom-ref": "9dfee3cad70395e8", + "bom-ref": "c1377ed80c029799", "name": "/usr/share/build-essential/essential-packages-list", "type": "file" }, { - "bom-ref": "98c984f02df26e45", + "bom-ref": "39257589a2dc6ef0", "name": "/usr/share/build-essential/list", "type": "file" }, { - "bom-ref": "a9ea7dfa36a43d87", + "bom-ref": "209ec915672f5433", "name": "/usr/share/ca-certificates/mozilla/ACCVRAIZ1.crt", "type": "file" }, { - "bom-ref": "90ebf36e58dbd541", + "bom-ref": "9ceb6f79654264f9", "name": "/usr/share/ca-certificates/mozilla/AC_RAIZ_FNMT-RCM.crt", "type": "file" }, { - "bom-ref": "bd5f2a6f43d98566", + "bom-ref": "d7ca2c7ae4685782", "name": "/usr/share/ca-certificates/mozilla/AC_RAIZ_FNMT-RCM_SERVIDORES_SEGUROS.crt", "type": "file" }, { - "bom-ref": "e3e11c23658cd66d", + "bom-ref": "21311136fd64e401", "name": "/usr/share/ca-certificates/mozilla/ANF_Secure_Server_Root_CA.crt", "type": "file" }, { - "bom-ref": "96cd7bbb2f750b84", + "bom-ref": "2fba0114ea605324", "name": "/usr/share/ca-certificates/mozilla/Actalis_Authentication_Root_CA.crt", "type": "file" }, { - "bom-ref": "e0c0db2e91516ff4", + "bom-ref": "4eb63dcf92a79644", "name": "/usr/share/ca-certificates/mozilla/Amazon_Root_CA_1.crt", "type": "file" }, { - "bom-ref": "23efdf3e03bac9af", + "bom-ref": "c7c61ef19c4a996b", "name": "/usr/share/ca-certificates/mozilla/Amazon_Root_CA_2.crt", "type": "file" }, { - "bom-ref": "d34513066f2ec116", + "bom-ref": "7a59593edadec9be", "name": "/usr/share/ca-certificates/mozilla/Amazon_Root_CA_3.crt", "type": "file" }, { - "bom-ref": "4256483f3146ed95", + "bom-ref": "1f29c2349f2bad4d", "name": "/usr/share/ca-certificates/mozilla/Amazon_Root_CA_4.crt", "type": "file" }, { - "bom-ref": "4c45ecf55faa7e92", + "bom-ref": "683803d1ae1969ee", "name": "/usr/share/ca-certificates/mozilla/Atos_TrustedRoot_2011.crt", "type": "file" }, { - "bom-ref": "563ac746c2d4d2f5", + "bom-ref": "23b878d1c813b62d", "name": "/usr/share/ca-certificates/mozilla/Atos_TrustedRoot_Root_CA_ECC_TLS_2021.crt", "type": "file" }, { - "bom-ref": "5964311d0eeb0e68", + "bom-ref": "46626dd40e10124c", "name": "/usr/share/ca-certificates/mozilla/Atos_TrustedRoot_Root_CA_RSA_TLS_2021.crt", "type": "file" }, { - "bom-ref": "38ecd7919ea2fc90", + "bom-ref": "bba3cdb335eb6174", "name": "/usr/share/ca-certificates/mozilla/Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068.crt", "type": "file" }, { - "bom-ref": "7b84c7a1db6767ef", + "bom-ref": "18424affee10ff0f", "name": "/usr/share/ca-certificates/mozilla/BJCA_Global_Root_CA1.crt", "type": "file" }, { - "bom-ref": "2e78a5b13ae373ce", + "bom-ref": "152e9861bcf64aa2", "name": "/usr/share/ca-certificates/mozilla/BJCA_Global_Root_CA2.crt", "type": "file" }, { - "bom-ref": "b11c341730a563bb", + "bom-ref": "5025142e1831879f", "name": "/usr/share/ca-certificates/mozilla/Buypass_Class_2_Root_CA.crt", "type": "file" }, { - "bom-ref": "89504bb6848bf361", + "bom-ref": "e2af3434b28c8805", "name": "/usr/share/ca-certificates/mozilla/Buypass_Class_3_Root_CA.crt", "type": "file" }, { - "bom-ref": "55160f8e02aedb95", + "bom-ref": "e025720c0a9d60b1", "name": "/usr/share/ca-certificates/mozilla/CA_Disig_Root_R2.crt", "type": "file" }, { - "bom-ref": "0353a67a4796066a", + "bom-ref": "55062b332d05b172", "name": "/usr/share/ca-certificates/mozilla/CFCA_EV_ROOT.crt", "type": "file" }, { - "bom-ref": "496fe1261cdd5d92", + "bom-ref": "d17ea8471f62b54e", "name": "/usr/share/ca-certificates/mozilla/COMODO_ECC_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "66db95226f13d5e9", + "bom-ref": "b004ead2b0525f41", "name": "/usr/share/ca-certificates/mozilla/COMODO_RSA_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "430dc78e9075df75", + "bom-ref": "65fa6edb86ba7f1d", "name": "/usr/share/ca-certificates/mozilla/Certainly_Root_E1.crt", "type": "file" }, { - "bom-ref": "2090c25d964a36bc", + "bom-ref": "20fa2f7f9800bd10", "name": "/usr/share/ca-certificates/mozilla/Certainly_Root_R1.crt", "type": "file" }, { - "bom-ref": "75f4c561c4eab53d", + "bom-ref": "db2fc985f7c5b215", "name": "/usr/share/ca-certificates/mozilla/Certigna_Root_CA.crt", "type": "file" }, { - "bom-ref": "65f1ca702e2c58d0", + "bom-ref": "4713d71f237478ac", "name": "/usr/share/ca-certificates/mozilla/Certum_EC-384_CA.crt", "type": "file" }, { - "bom-ref": "70262c97eeb154f6", + "bom-ref": "abfd83fa1f34f6a6", "name": "/usr/share/ca-certificates/mozilla/Certum_Trusted_Network_CA.crt", "type": "file" }, { - "bom-ref": "5f6a21db21ae6427", + "bom-ref": "386e6f7275666ed7", "name": "/usr/share/ca-certificates/mozilla/Certum_Trusted_Network_CA_2.crt", "type": "file" }, { - "bom-ref": "afd9aa36a301432f", + "bom-ref": "49b2c3b0e9fd449f", "name": "/usr/share/ca-certificates/mozilla/Certum_Trusted_Root_CA.crt", "type": "file" }, { - "bom-ref": "95c57cc4c2ec6d9e", + "bom-ref": "71fe3c15cb817e56", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_BR_Root_CA_1_2020.crt", "type": "file" }, { - "bom-ref": "379eb700626461d9", + "bom-ref": "6741f5c2b8ef9a25", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_BR_Root_CA_2_2023.crt", "type": "file" }, { - "bom-ref": "d9ad7ec786de207d", + "bom-ref": "20aeba28e7954045", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_EV_Root_CA_1_2020.crt", "type": "file" }, { - "bom-ref": "cebcb4b0b1604bc0", + "bom-ref": "9fc2904a1c8af724", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_EV_Root_CA_2_2023.crt", "type": "file" }, { - "bom-ref": "2c04e6acd0f4e76a", + "bom-ref": "c34dd7aacbed6cea", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_Root_Class_3_CA_2_2009.crt", "type": "file" }, { - "bom-ref": "517036c5448846ce", + "bom-ref": "fdde4a86be296dbe", "name": "/usr/share/ca-certificates/mozilla/D-TRUST_Root_Class_3_CA_2_EV_2009.crt", "type": "file" }, { - "bom-ref": "79279d2398f0bc15", + "bom-ref": "2a0a72d818619d91", "name": "/usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_G2.crt", "type": "file" }, { - "bom-ref": "9d50a51879d0073d", + "bom-ref": "606cf58d5b6fd331", "name": "/usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_G3.crt", "type": "file" }, { - "bom-ref": "e08f9669b38b0bc6", + "bom-ref": "7002974f3e62500a", "name": "/usr/share/ca-certificates/mozilla/DigiCert_Global_Root_G2.crt", "type": "file" }, { - "bom-ref": "858cc8fd3c0fe596", + "bom-ref": "6fdbff364ed76d46", "name": "/usr/share/ca-certificates/mozilla/DigiCert_Global_Root_G3.crt", "type": "file" }, { - "bom-ref": "4517eb3c6cbb7803", + "bom-ref": "0a016ac345be7f13", "name": "/usr/share/ca-certificates/mozilla/DigiCert_TLS_ECC_P384_Root_G5.crt", "type": "file" }, { - "bom-ref": "11f3fd877002720a", + "bom-ref": "d091c91d6aeecc0a", "name": "/usr/share/ca-certificates/mozilla/DigiCert_TLS_RSA4096_Root_G5.crt", "type": "file" }, { - "bom-ref": "9f370e6422d9c16c", + "bom-ref": "b5df106e2c629694", "name": "/usr/share/ca-certificates/mozilla/DigiCert_Trusted_Root_G4.crt", "type": "file" }, { - "bom-ref": "ff783c075fbc3815", + "bom-ref": "44350ba5230688ed", "name": "/usr/share/ca-certificates/mozilla/Entrust_Root_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "b879b2d58974ee56", + "bom-ref": "e50ecad71f605f2e", "name": "/usr/share/ca-certificates/mozilla/GDCA_TrustAUTH_R5_ROOT.crt", "type": "file" }, { - "bom-ref": "d78f375d3249d90e", + "bom-ref": "270c8ebdb4584d52", "name": "/usr/share/ca-certificates/mozilla/GTS_Root_R1.crt", "type": "file" }, { - "bom-ref": "903ddee9647a01e9", + "bom-ref": "1918b565a3f45239", "name": "/usr/share/ca-certificates/mozilla/GTS_Root_R3.crt", "type": "file" }, { - "bom-ref": "71e774691d06b251", + "bom-ref": "7fa0c7bd4266e191", "name": "/usr/share/ca-certificates/mozilla/GTS_Root_R4.crt", "type": "file" }, { - "bom-ref": "8c69ddde82e4cd0c", + "bom-ref": "f39105bd37a6df58", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_ECC_Root_CA_-_R4.crt", "type": "file" }, { - "bom-ref": "784317e5c6f81140", + "bom-ref": "88f190bb90e37074", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_ECC_Root_CA_-_R5.crt", "type": "file" }, { - "bom-ref": "0a9b335a1e6d6a33", + "bom-ref": "fb658ac0f7aef983", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_Root_CA_-_R3.crt", "type": "file" }, { - "bom-ref": "41915028f3927c6f", + "bom-ref": "eb40ed808966423f", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_Root_CA_-_R6.crt", "type": "file" }, { - "bom-ref": "d280a5e0a324eca2", + "bom-ref": "2cc9dbac49a6037a", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_Root_E46.crt", "type": "file" }, { - "bom-ref": "e7811a6971807f40", + "bom-ref": "8288e3dc1e44e040", "name": "/usr/share/ca-certificates/mozilla/GlobalSign_Root_R46.crt", "type": "file" }, { - "bom-ref": "7068d73b70ce9561", + "bom-ref": "705a7da95aef997d", "name": "/usr/share/ca-certificates/mozilla/Go_Daddy_Root_Certificate_Authority_-_G2.crt", "type": "file" }, { - "bom-ref": "3cdd9b02548e221b", + "bom-ref": "8e1fe5e831e52057", "name": "/usr/share/ca-certificates/mozilla/HARICA_TLS_ECC_Root_CA_2021.crt", "type": "file" }, { - "bom-ref": "3715ed612e903b22", + "bom-ref": "639dffe3863240c6", "name": "/usr/share/ca-certificates/mozilla/HARICA_TLS_RSA_Root_CA_2021.crt", "type": "file" }, { - "bom-ref": "28ae534cc59d186f", + "bom-ref": "a1011c10d4e932a3", "name": "/usr/share/ca-certificates/mozilla/Hellenic_Academic_and_Research_Institutions_ECC_RootCA_2015.crt", "type": "file" }, { - "bom-ref": "0e0a45f419a116db", + "bom-ref": "670a722348f54247", "name": "/usr/share/ca-certificates/mozilla/Hellenic_Academic_and_Research_Institutions_RootCA_2015.crt", "type": "file" }, { - "bom-ref": "b96a6cd3db5bb341", + "bom-ref": "ebde2ca9752acc81", "name": "/usr/share/ca-certificates/mozilla/HiPKI_Root_CA_-_G1.crt", "type": "file" }, { - "bom-ref": "a0d9b617a95c8bb9", + "bom-ref": "f2bc6fb2b1142249", "name": "/usr/share/ca-certificates/mozilla/Hongkong_Post_Root_CA_3.crt", "type": "file" }, { - "bom-ref": "6fed8109c1253f57", + "bom-ref": "e343531c84731fab", "name": "/usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt", "type": "file" }, { - "bom-ref": "ad5472226288b340", + "bom-ref": "57f451642183d7a4", "name": "/usr/share/ca-certificates/mozilla/ISRG_Root_X2.crt", "type": "file" }, { - "bom-ref": "22b2c2f7b308e3fe", + "bom-ref": "fa80e82b01e1660e", "name": "/usr/share/ca-certificates/mozilla/IdenTrust_Commercial_Root_CA_1.crt", "type": "file" }, { - "bom-ref": "1616e471186c1ee3", + "bom-ref": "ddd55287d4c6761b", "name": "/usr/share/ca-certificates/mozilla/IdenTrust_Public_Sector_Root_CA_1.crt", "type": "file" }, { - "bom-ref": "b17081bf6b9beb12", + "bom-ref": "081ce451a6bd4716", "name": "/usr/share/ca-certificates/mozilla/Izenpe.com.crt", "type": "file" }, { - "bom-ref": "f7cedd73ed702071", + "bom-ref": "5b455793b2153a05", "name": "/usr/share/ca-certificates/mozilla/Microsec_e-Szigno_Root_CA_2009.crt", "type": "file" }, { - "bom-ref": "e336b1a23af58734", + "bom-ref": "8ba55d64868035bc", "name": "/usr/share/ca-certificates/mozilla/Microsoft_ECC_Root_Certificate_Authority_2017.crt", "type": "file" }, { - "bom-ref": "22ab4d48b905542f", + "bom-ref": "4386c4465df4dde3", "name": "/usr/share/ca-certificates/mozilla/Microsoft_RSA_Root_Certificate_Authority_2017.crt", "type": "file" }, { - "bom-ref": "221be873e4f7a4ab", + "bom-ref": "d34cab9c1152abb3", "name": "/usr/share/ca-certificates/mozilla/NAVER_Global_Root_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "d42f6bd1efed56ca", + "bom-ref": "08657f3928222b36", "name": "/usr/share/ca-certificates/mozilla/NetLock_Arany_=Class_Gold=_F\u0151tan\u00fas\u00edtv\u00e1ny.crt", "type": "file" }, { - "bom-ref": "30a30e81692bb70c", + "bom-ref": "b32d72f4575ca8c4", "name": "/usr/share/ca-certificates/mozilla/OISTE_Server_Root_ECC_G1.crt", "type": "file" }, { - "bom-ref": "12995692557966cc", + "bom-ref": "91ad90d7c3441be8", "name": "/usr/share/ca-certificates/mozilla/OISTE_Server_Root_RSA_G1.crt", "type": "file" }, { - "bom-ref": "f2eb3d8bae7c09f2", + "bom-ref": "cfcac6f32c5c3dd2", "name": "/usr/share/ca-certificates/mozilla/OISTE_WISeKey_Global_Root_GB_CA.crt", "type": "file" }, { - "bom-ref": "5228bd25ebf217aa", + "bom-ref": "f42426dad45f58e6", "name": "/usr/share/ca-certificates/mozilla/OISTE_WISeKey_Global_Root_GC_CA.crt", "type": "file" }, { - "bom-ref": "73c45658ef0f54a1", + "bom-ref": "5c1ae7acd9fc1081", "name": "/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_1_G3.crt", "type": "file" }, { - "bom-ref": "82845cf706f5c28e", + "bom-ref": "8289f39bd720ce86", "name": "/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_2_G3.crt", "type": "file" }, { - "bom-ref": "b069a1cf22574027", + "bom-ref": "0e8c14bc82f5ead7", "name": "/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_3_G3.crt", "type": "file" }, { - "bom-ref": "95ffa0635b81aee4", + "bom-ref": "63ba44ab83fdc880", "name": "/usr/share/ca-certificates/mozilla/SSL.com_EV_Root_Certification_Authority_ECC.crt", "type": "file" }, { - "bom-ref": "f61f3b4be756696a", + "bom-ref": "be45a1ecb085e0d2", "name": "/usr/share/ca-certificates/mozilla/SSL.com_EV_Root_Certification_Authority_RSA_R2.crt", "type": "file" }, { - "bom-ref": "36d674237827ebaf", + "bom-ref": "52cdfc5e55b60037", "name": "/usr/share/ca-certificates/mozilla/SSL.com_Root_Certification_Authority_ECC.crt", "type": "file" }, { - "bom-ref": "93eac14ec3eb6e65", + "bom-ref": "759cffbc94143d41", "name": "/usr/share/ca-certificates/mozilla/SSL.com_Root_Certification_Authority_RSA.crt", "type": "file" }, { - "bom-ref": "8f765c482e7d618c", + "bom-ref": "4eb778163848ef28", "name": "/usr/share/ca-certificates/mozilla/SSL.com_TLS_ECC_Root_CA_2022.crt", "type": "file" }, { - "bom-ref": "f57fd01b1490852e", + "bom-ref": "48f32a9311fb5d4a", "name": "/usr/share/ca-certificates/mozilla/SSL.com_TLS_RSA_Root_CA_2022.crt", "type": "file" }, { - "bom-ref": "4a454b78dac881d6", + "bom-ref": "329f7cc1360b0ea2", "name": "/usr/share/ca-certificates/mozilla/SZAFIR_ROOT_CA2.crt", "type": "file" }, { - "bom-ref": "de3c69f6703f9911", + "bom-ref": "06f394524ad7e521", "name": "/usr/share/ca-certificates/mozilla/Sectigo_Public_Server_Authentication_Root_E46.crt", "type": "file" }, { - "bom-ref": "9b9b9cea35dfd08c", + "bom-ref": "fe2785df561d08bc", "name": "/usr/share/ca-certificates/mozilla/Sectigo_Public_Server_Authentication_Root_R46.crt", "type": "file" }, { - "bom-ref": "1af339684d1fed6b", + "bom-ref": "21d9797bb345d6fb", "name": "/usr/share/ca-certificates/mozilla/SecureSign_Root_CA12.crt", "type": "file" }, { - "bom-ref": "0fcc38ce08a803ae", + "bom-ref": "ff4a6cd61072f462", "name": "/usr/share/ca-certificates/mozilla/SecureSign_Root_CA14.crt", "type": "file" }, { - "bom-ref": "a9082045dd277210", + "bom-ref": "f0b43b7a4f93f018", "name": "/usr/share/ca-certificates/mozilla/SecureSign_Root_CA15.crt", "type": "file" }, { - "bom-ref": "5019b126dcf17506", + "bom-ref": "6f79c01108b2bdea", "name": "/usr/share/ca-certificates/mozilla/Security_Communication_ECC_RootCA1.crt", "type": "file" }, { - "bom-ref": "c67fff2129adb435", + "bom-ref": "bae1cd2ccee25435", "name": "/usr/share/ca-certificates/mozilla/Security_Communication_RootCA2.crt", "type": "file" }, { - "bom-ref": "d6def6726ef86aea", + "bom-ref": "7dc1c2c2b3a59082", "name": "/usr/share/ca-certificates/mozilla/Starfield_Root_Certificate_Authority_-_G2.crt", "type": "file" }, { - "bom-ref": "d0627447794c8a14", + "bom-ref": "5416660ceef45aac", "name": "/usr/share/ca-certificates/mozilla/Starfield_Services_Root_Certificate_Authority_-_G2.crt", "type": "file" }, { - "bom-ref": "daa0e8c784b62eb7", + "bom-ref": "1be90f8f67f06167", "name": "/usr/share/ca-certificates/mozilla/SwissSign_RSA_TLS_Root_CA_2022_-_1.crt", "type": "file" }, { - "bom-ref": "414f6febf6738f99", + "bom-ref": "8c46e70ea4962a9d", "name": "/usr/share/ca-certificates/mozilla/T-TeleSec_GlobalRoot_Class_2.crt", "type": "file" }, { - "bom-ref": "d44b8f9b5cbfa88a", + "bom-ref": "dfd9d550d7e35836", "name": "/usr/share/ca-certificates/mozilla/T-TeleSec_GlobalRoot_Class_3.crt", "type": "file" }, { - "bom-ref": "189e5a640b4624a6", + "bom-ref": "15724e82eeb5d36e", "name": "/usr/share/ca-certificates/mozilla/TUBITAK_Kamu_SM_SSL_Kok_Sertifikasi_-_Surum_1.crt", "type": "file" }, { - "bom-ref": "b56790b48f7a4b55", + "bom-ref": "b8dc4f0a146b1659", "name": "/usr/share/ca-certificates/mozilla/TWCA_CYBER_Root_CA.crt", "type": "file" }, { - "bom-ref": "1b087f59af398872", + "bom-ref": "c1a46d5973e5ebea", "name": "/usr/share/ca-certificates/mozilla/TWCA_Global_Root_CA.crt", "type": "file" }, { - "bom-ref": "f6a7d2cb53ddf7db", + "bom-ref": "2e0360eab4fcf0df", "name": "/usr/share/ca-certificates/mozilla/TWCA_Root_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "0654d9006ecaa5a9", + "bom-ref": "65e85ab7bfd52ba1", "name": "/usr/share/ca-certificates/mozilla/Telekom_Security_TLS_ECC_Root_2020.crt", "type": "file" }, { - "bom-ref": "d56be12921d31c25", + "bom-ref": "22accaec86412d39", "name": "/usr/share/ca-certificates/mozilla/Telekom_Security_TLS_RSA_Root_2023.crt", "type": "file" }, { - "bom-ref": "2e7137c3f377ee50", + "bom-ref": "699382a8d0436e88", "name": "/usr/share/ca-certificates/mozilla/Telia_Root_CA_v2.crt", "type": "file" }, { - "bom-ref": "2e8960319134d25a", + "bom-ref": "edebdb6365d32646", "name": "/usr/share/ca-certificates/mozilla/TrustAsia_Global_Root_CA_G3.crt", "type": "file" }, { - "bom-ref": "84225376f627ef2f", + "bom-ref": "60002142e5b3c2bf", "name": "/usr/share/ca-certificates/mozilla/TrustAsia_Global_Root_CA_G4.crt", "type": "file" }, { - "bom-ref": "5af5f9db0799b8b0", + "bom-ref": "511460b77c8f0ab8", "name": "/usr/share/ca-certificates/mozilla/TrustAsia_TLS_ECC_Root_CA.crt", "type": "file" }, { - "bom-ref": "573a2295882e8144", + "bom-ref": "c8934f0a04ee27c0", "name": "/usr/share/ca-certificates/mozilla/TrustAsia_TLS_RSA_Root_CA.crt", "type": "file" }, { - "bom-ref": "6202db386626d5b8", + "bom-ref": "aacf69164fd52938", "name": "/usr/share/ca-certificates/mozilla/TunTrust_Root_CA.crt", "type": "file" }, { - "bom-ref": "12465ebf87009c7c", + "bom-ref": "28e32b9f9e25978c", "name": "/usr/share/ca-certificates/mozilla/UCA_Extended_Validation_Root.crt", "type": "file" }, { - "bom-ref": "c4222eee1305c4a5", + "bom-ref": "83419001d4ad252d", "name": "/usr/share/ca-certificates/mozilla/UCA_Global_G2_Root.crt", "type": "file" }, { - "bom-ref": "43a80cad264733a6", + "bom-ref": "782278b888c6d8d2", "name": "/usr/share/ca-certificates/mozilla/USERTrust_ECC_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "91bacb4156c4e346", + "bom-ref": "593ebdc5e701bb76", "name": "/usr/share/ca-certificates/mozilla/USERTrust_RSA_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "4d87ca975ae5ba34", + "bom-ref": "f93ffbcd951daeb4", "name": "/usr/share/ca-certificates/mozilla/certSIGN_Root_CA_G2.crt", "type": "file" }, { - "bom-ref": "d40407173af0f8e7", + "bom-ref": "e88b6c74ec7656b3", "name": "/usr/share/ca-certificates/mozilla/e-Szigno_Root_CA_2017.crt", "type": "file" }, { - "bom-ref": "ffeb2cbb513bfa4c", + "bom-ref": "67925b58ccf63fc4", "name": "/usr/share/ca-certificates/mozilla/e-Szigno_TLS_Root_CA_2023.crt", "type": "file" }, { - "bom-ref": "37926c039b7b9aab", + "bom-ref": "3024ad70c0c185cf", "name": "/usr/share/ca-certificates/mozilla/ePKI_Root_Certification_Authority.crt", "type": "file" }, { - "bom-ref": "d90bf19e62dc8d3d", + "bom-ref": "b4fa9e6552b945c5", "name": "/usr/share/ca-certificates/mozilla/emSign_ECC_Root_CA_-_C3.crt", "type": "file" }, { - "bom-ref": "dce35d4c76327b6c", + "bom-ref": "8b1658c1853bfd10", "name": "/usr/share/ca-certificates/mozilla/emSign_ECC_Root_CA_-_G3.crt", "type": "file" }, { - "bom-ref": "419335f8ee7528cb", + "bom-ref": "2388a4d0981e264f", "name": "/usr/share/ca-certificates/mozilla/emSign_Root_CA_-_C1.crt", "type": "file" }, { - "bom-ref": "fa3ee1bc6a937db1", + "bom-ref": "26a8b26b3d73c5d9", "name": "/usr/share/ca-certificates/mozilla/emSign_Root_CA_-_G1.crt", "type": "file" }, { - "bom-ref": "60377d4e97f6b4a2", + "bom-ref": "540dee114518401e", "name": "/usr/share/ca-certificates/mozilla/vTrus_ECC_Root_CA.crt", "type": "file" }, { - "bom-ref": "750325e18c237f6b", + "bom-ref": "cc4e45412672b1a3", "name": "/usr/share/ca-certificates/mozilla/vTrus_Root_CA.crt", "type": "file" }, { - "bom-ref": "c48dbfc9c8df4eab", + "bom-ref": "742798278e083ba5", "name": "/usr/share/cmake/RapidJSON/RapidJSONConfig.cmake", "type": "file" }, { - "bom-ref": "7beeb8edf53599c7", + "bom-ref": "4a1e95211da20671", "name": "/usr/share/cmake/RapidJSON/RapidJSONConfigVersion.cmake", "type": "file" }, { - "bom-ref": "0e210d334c7ab8d3", + "bom-ref": "459f569751501375", "name": "/usr/share/common-licenses/Apache-2.0", "type": "file" }, { - "bom-ref": "c2e8f4b8609aacdb", + "bom-ref": "3c0a15df700e8311", "name": "/usr/share/common-licenses/Artistic", "type": "file" }, { - "bom-ref": "e1a4ca4c2fab187e", + "bom-ref": "0ce918d1786388d8", "name": "/usr/share/common-licenses/BSD", "type": "file" }, { - "bom-ref": "4addb326b6212662", + "bom-ref": "53c8f16bbd2a9ac8", "name": "/usr/share/common-licenses/CC0-1.0", "type": "file" }, { - "bom-ref": "e7efbe0bd46e35cd", + "bom-ref": "fc1c0778ea3902c7", "name": "/usr/share/common-licenses/GFDL-1.2", "type": "file" }, { - "bom-ref": "3bb8bcb1043fbdcb", + "bom-ref": "4723ef60aa67d6a5", "name": "/usr/share/common-licenses/GFDL-1.3", "type": "file" }, { - "bom-ref": "519c59d834b2ae13", + "bom-ref": "2d7ad81b11ae1f49", "name": "/usr/share/common-licenses/GPL-1", "type": "file" }, { - "bom-ref": "739b6045b13382eb", + "bom-ref": "0f32f1bc1dd83475", "name": "/usr/share/common-licenses/GPL-2", "type": "file" }, { - "bom-ref": "9fb81685847ecddb", + "bom-ref": "517921fd558e31bd", "name": "/usr/share/common-licenses/GPL-3", "type": "file" }, { - "bom-ref": "44533d985cfbceb9", + "bom-ref": "35515f79e8b5136b", "name": "/usr/share/common-licenses/LGPL-2", "type": "file" }, { - "bom-ref": "6093e781476bd4a6", + "bom-ref": "90832218f537ff78", "name": "/usr/share/common-licenses/LGPL-2.1", "type": "file" }, { - "bom-ref": "d25bde50023fbc64", + "bom-ref": "5a2053826d0fabb6", "name": "/usr/share/common-licenses/LGPL-3", "type": "file" }, { - "bom-ref": "371d81d3e3b19863", + "bom-ref": "82a7a4ba2072bd09", "name": "/usr/share/common-licenses/MPL-1.1", "type": "file" }, { - "bom-ref": "48c90fd8bae80050", + "bom-ref": "cc08cf41cf5bd7fe", "name": "/usr/share/common-licenses/MPL-2.0", "type": "file" }, { - "bom-ref": "1ee5bbdd01c90947", + "bom-ref": "2d6d702f2eca6095", "name": "/usr/share/debconf/confmodule", "type": "file" }, { - "bom-ref": "782d8df0a965ebb6", + "bom-ref": "a14c7d8b0bae27b4", "name": "/usr/share/debconf/confmodule.sh", "type": "file" }, { - "bom-ref": "f2cdd9082121adbd", + "bom-ref": "8f9d9d92170ccbe7", "name": "/usr/share/debconf/debconf.conf", "type": "file" }, { - "bom-ref": "30cfdc1e314debde", + "bom-ref": "c1a43f22564924ac", "name": "/usr/share/debconf/fix_db.pl", "type": "file" }, { - "bom-ref": "c5e0c741d7f672ca", + "bom-ref": "26b8fde0fa496e7c", "name": "/usr/share/debconf/frontend", "type": "file" }, { - "bom-ref": "c02f0994b5266bdd", - "name": "/usr/share/debhelper/autoscripts/postinst-xmlcatalog", - "type": "file" - }, - { - "bom-ref": "71266daa90804d94", - "name": "/usr/share/debhelper/autoscripts/postrm-xmlcatalog", - "type": "file" - }, - { - "bom-ref": "71264f15a47efc68", - "name": "/usr/share/debhelper/autoscripts/prerm-xmlcatalog", - "type": "file" - }, - { - "bom-ref": "464145b0d71996cc", + "bom-ref": "7adfd575c73a7db6", "name": "/usr/share/debianutils/shells", "type": "file" }, { - "bom-ref": "73f9b741d157bc82", + "bom-ref": "9ae75914e3657988", "name": "/usr/share/debianutils/shells.d/bash", "type": "file" }, { - "bom-ref": "041138152fb19aa7", + "bom-ref": "ed55283a3d394ded", "name": "/usr/share/debianutils/shells.d/dash", "type": "file" }, { - "bom-ref": "b9276c9578e482c9", + "bom-ref": "99f0d198266d49a7", "name": "/usr/share/doc-base/automake.automake-1.16", "type": "file" }, { - "bom-ref": "8ebd971dac978996", + "bom-ref": "f5441085c4f631ac", "name": "/usr/share/doc-base/base-passwd.users-and-groups", "type": "file" }, { - "bom-ref": "1d700c9fda112de7", + "bom-ref": "4fc95d8808fc9fc5", "name": "/usr/share/doc-base/ccache.ccache", "type": "file" }, { - "bom-ref": "57099502f632f5b6", + "bom-ref": "1afbabd75f4332a8", "name": "/usr/share/doc-base/comerr-dev.comerr-manual", "type": "file" }, { - "bom-ref": "d32b141e7a4a88fa", + "bom-ref": "16839cad6c7cccc4", "name": "/usr/share/doc-base/findutils.findutils", "type": "file" }, { - "bom-ref": "7315deae89e98f9d", + "bom-ref": "68197d81cd5221c7", "name": "/usr/share/doc-base/fontconfig.fontconfig-user", "type": "file" }, { - "bom-ref": "7cfb1c30d0b1fbea", + "bom-ref": "8b8c02d79e3ae998", "name": "/usr/share/doc-base/libexpat1-dev.expat", "type": "file" }, { - "bom-ref": "853355d72a6eb487", + "bom-ref": "a759c49517224275", "name": "/usr/share/doc-base/libffi-dev.libffi", "type": "file" }, { - "bom-ref": "2777b4615637880f", + "bom-ref": "d97769499fa5140d", "name": "/usr/share/doc-base/libpng16-16t64.libpng16", "type": "file" }, { - "bom-ref": "bd0b72be9e464dd5", + "bom-ref": "d8ff77c5d7e1cfd3", "name": "/usr/share/doc-base/libre2-dev.re2", "type": "file" }, { - "bom-ref": "700429a09b391413", + "bom-ref": "782933eb6f6de063", "name": "/usr/share/doc-base/nano.nano", "type": "file" }, { - "bom-ref": "87f7cdc61242af64", + "bom-ref": "d039d72d1a88fe58", "name": "/usr/share/doc-base/nano.nano-faq", "type": "file" }, { - "bom-ref": "3c9786c895e83a41", + "bom-ref": "a869395d41c73443", "name": "/usr/share/doc-base/ninja-build.ninja-build-manual", "type": "file" }, { - "bom-ref": "3665485d3dc9b925", + "bom-ref": "3ff362a5581841a3", "name": "/usr/share/doc-base/python3.python-policy", "type": "file" }, { - "bom-ref": "459c60d6e5cdeb16", - "name": "/usr/share/doc/ca-certificates/changelog.gz", - "type": "file" - }, - { - "bom-ref": "8c2bc148e2d12ecc", - "name": "/usr/share/doc/ca-certificates/copyright", + "bom-ref": "cb34bd3a8c6f180e", + "name": "/usr/share/doc/cuda-keyring/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "bdf66486ddca417b", - "name": "/usr/share/doc/ca-certificates/examples/ca-certificates-local/debian/copyright", + "bom-ref": "100a44d2331e145c", + "name": "/usr/share/doc/curl/copyright", "type": "file" }, { - "bom-ref": "4f959e04d533d890", - "name": "/usr/share/doc/cuda-keyring/changelog.Debian.gz", + "bom-ref": "26efc67653ea5778", + "name": "/usr/share/doc/dirmngr/copyright", "type": "file" }, { - "bom-ref": "b72ceb7849699838", - "name": "/usr/share/doc/cuda-nvrtc-dev-13-2/changelog.Debian.gz", + "bom-ref": "bd5f20b0e09cfd42", + "name": "/usr/share/doc/gnupg-utils/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "1912a65179133db7", - "name": "/usr/share/doc/cuda-nvrtc-dev-13-2/copyright", + "bom-ref": "4b9cdf588442a5f5", + "name": "/usr/share/doc/gnupg-utils/copyright", "type": "file" }, { - "bom-ref": "f17b75264131a143", - "name": "/usr/share/doc/curl/copyright", + "bom-ref": "e8593fcfffdd754c", + "name": "/usr/share/doc/gnupg/copyright", "type": "file" }, { - "bom-ref": "c6f87b0c818b18ae", + "bom-ref": "f3fecb87a7ad8fb8", "name": "/usr/share/doc/gnupg2/copyright", "type": "file" }, { - "bom-ref": "211a540c893dabe6", - "name": "/usr/share/doc/libcublas13-cuda-13/changelog.Debian.gz", + "bom-ref": "f0d8469316f07b50", + "name": "/usr/share/doc/gpg-agent/copyright", "type": "file" }, { - "bom-ref": "081c548eda7f886f", - "name": "/usr/share/doc/libcublas13-cuda-13/copyright", + "bom-ref": "dca009f43bfdae78", + "name": "/usr/share/doc/gpg/copyright", "type": "file" }, { - "bom-ref": "62f50c2571a9cd1b", - "name": "/usr/share/doc/libcublas13-dev-cuda-13/changelog.Debian.gz", + "bom-ref": "a166ccaf3affe176", + "name": "/usr/share/doc/gpgconf/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "8de8172acc92c7e1", - "name": "/usr/share/doc/libcublas13-dev-cuda-13/copyright", + "bom-ref": "c28f5fd51aaa520a", + "name": "/usr/share/doc/gpgconf/copyright", "type": "file" }, { - "bom-ref": "b9e24e174bce5669", - "name": "/usr/share/doc/libcudnn9-cuda-13/changelog.Debian.gz", + "bom-ref": "9b99cf297dde5399", + "name": "/usr/share/doc/gpgsm/copyright", "type": "file" }, { - "bom-ref": "e57135518747147f", - "name": "/usr/share/doc/libcudnn9-cuda-13/copyright", + "bom-ref": "80b704fd38a863c6", + "name": "/usr/share/doc/gpgv/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "3f6bd5472f19b817", - "name": "/usr/share/doc/libcudnn9-dev-cuda-13/changelog.Debian.gz", + "bom-ref": "6f7c8b043ce4bb2b", + "name": "/usr/share/doc/gpgv/copyright", "type": "file" }, { - "bom-ref": "68ecc00be3a36606", - "name": "/usr/share/doc/libcudnn9-dev-cuda-13/copyright", + "bom-ref": "c24934a839da8f25", + "name": "/usr/share/doc/keyboxd/copyright", "type": "file" }, { - "bom-ref": "a0278567befd8014", - "name": "/usr/share/doc/libcudnn9-headers-cuda-13/changelog.Debian.gz", + "bom-ref": "8d890915e98865cd", + "name": "/usr/share/doc/libcudnn9-cuda-13/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "b9c8af74ce8d28a8", - "name": "/usr/share/doc/libcudnn9-headers-cuda-13/copyright", + "bom-ref": "17c2d3d099ddd467", + "name": "/usr/share/doc/libcudnn9-cuda-13/copyright", "type": "file" }, { - "bom-ref": "d61b31b12cfcc125", - "name": "/usr/share/doc/libcurl3t64-gnutls/changelog.Debian.gz", + "bom-ref": "9fd6999311d7feb4", + "name": "/usr/share/doc/libcudnn9-dev-cuda-13/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "f71b0640c4a85326", - "name": "/usr/share/doc/libcurl3t64-gnutls/copyright", + "bom-ref": "16b07e40f31770d5", + "name": "/usr/share/doc/libcudnn9-dev-cuda-13/copyright", "type": "file" }, { - "bom-ref": "4a5bb644dc247bfb", - "name": "/usr/share/doc/libcurl4t64/changelog.Debian.gz", + "bom-ref": "b6e952c1a35cfb0f", + "name": "/usr/share/doc/libcudnn9-headers-cuda-13/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "5c711a8368f640f7", - "name": "/usr/share/doc/libcurl4t64/copyright", + "bom-ref": "57988a0966af1e53", + "name": "/usr/share/doc/libcudnn9-headers-cuda-13/copyright", "type": "file" }, { - "bom-ref": "cb1771c03f753a7d", - "name": "/usr/share/doc/libnccl-dev/changelog.Debian.gz", + "bom-ref": "db4a3b2895ceb02f", + "name": "/usr/share/doc/libcurl3t64-gnutls/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "621073ac0a61331c", - "name": "/usr/share/doc/libnccl-dev/copyright", + "bom-ref": "c77a035daa63ca17", + "name": "/usr/share/doc/libcurl3t64-gnutls/copyright", "type": "file" }, { - "bom-ref": "cf312a01e25aa658", - "name": "/usr/share/doc/libnccl2/changelog.Debian.gz", + "bom-ref": "078738dda79a57a1", + "name": "/usr/share/doc/libcurl4t64/changelog.Debian.gz", "type": "file" }, { - "bom-ref": "c2f7633020061329", - "name": "/usr/share/doc/libnccl2/copyright", + "bom-ref": "db0fb61fea2a6260", + "name": "/usr/share/doc/libcurl4t64/copyright", "type": "file" }, { - "bom-ref": "5a72790157c0cb46", + "bom-ref": "56599016aad86b9c", "name": "/usr/share/dot.bashrc", "type": "file" }, { - "bom-ref": "85642cc86129bbe4", + "bom-ref": "c598be4c425d3a72", "name": "/usr/share/dot.profile", "type": "file" }, { - "bom-ref": "1206f96ac5035c89", + "bom-ref": "c80232bd8e895a4b", "name": "/usr/share/dot.profile.md5sums", "type": "file" }, { - "bom-ref": "5077df16c081f8fa", + "bom-ref": "292f5a3870e816a9", "name": "/usr/share/dpkg/abitable", "type": "file" }, { - "bom-ref": "482a59713910b69e", + "bom-ref": "ed0f552252908257", "name": "/usr/share/dpkg/architecture.mk", "type": "file" }, { - "bom-ref": "bcea38bdf34519e2", + "bom-ref": "7aa80e9b3c49b44f", "name": "/usr/share/dpkg/buildapi.mk", "type": "file" }, { - "bom-ref": "2a7b204d4bab4b34", + "bom-ref": "335ac55eb245ff7d", "name": "/usr/share/dpkg/buildflags.mk", "type": "file" }, { - "bom-ref": "e035624d2ad3d5b9", + "bom-ref": "3380a837e1d54044", "name": "/usr/share/dpkg/buildopts.mk", "type": "file" }, { - "bom-ref": "d7f70df035e042c2", + "bom-ref": "78678e8528483d2b", "name": "/usr/share/dpkg/buildtools.mk", "type": "file" }, { - "bom-ref": "bf786a73aba6aaed", + "bom-ref": "ca6da35a9bbe04fa", "name": "/usr/share/dpkg/cputable", "type": "file" }, { - "bom-ref": "c1531d4ab2c7b91d", + "bom-ref": "23405147e5f44b64", "name": "/usr/share/dpkg/default.mk", "type": "file" }, { - "bom-ref": "678aa37e601f5f1f", + "bom-ref": "4865b5099f23f9b2", "name": "/usr/share/dpkg/no-pie-compile.specs", "type": "file" }, { - "bom-ref": "ca08d2f14516bcfd", + "bom-ref": "3237c9f6678f41a0", "name": "/usr/share/dpkg/no-pie-link.specs", "type": "file" }, { - "bom-ref": "2570b3a400f54128", + "bom-ref": "9af20862afb5e293", "name": "/usr/share/dpkg/ostable", "type": "file" }, { - "bom-ref": "f711a6d609eb52b9", + "bom-ref": "17df4f704fca8284", "name": "/usr/share/dpkg/pie-compile.specs", "type": "file" }, { - "bom-ref": "c88369910af3df11", + "bom-ref": "ef5b93d064d98aa8", "name": "/usr/share/dpkg/pie-link.specs", "type": "file" }, { - "bom-ref": "e82aaa534d0019ff", + "bom-ref": "345f016c38ab24d2", "name": "/usr/share/dpkg/pkg-info.mk", "type": "file" }, { - "bom-ref": "c60d7f15b428a045", + "bom-ref": "258c31a7f9e53e12", "name": "/usr/share/dpkg/sh/dpkg-error.sh", "type": "file" }, { - "bom-ref": "76d22dfe90be0219", + "bom-ref": "3ae864466d788172", "name": "/usr/share/dpkg/tupletable", "type": "file" }, { - "bom-ref": "3e792ec746ae2782", + "bom-ref": "0d9ce6318c06a57f", "name": "/usr/share/dpkg/vendor.mk", "type": "file" }, { - "bom-ref": "329780e4a25f362e", + "bom-ref": "d8e8e8fa971b3ab4", "name": "/usr/share/emacs/site-lisp/autoconf/autotest-mode.el", "type": "file" }, { - "bom-ref": "f164e25b20f687b6", + "bom-ref": "e3e4e4e8ee9452a4", "name": "/usr/share/emacs/site-lisp/ninja-mode.el", "type": "file" }, { - "bom-ref": "f28c64432bc246c7", + "bom-ref": "9871c927d9008399", "name": "/usr/share/et/et_c.awk", "type": "file" }, { - "bom-ref": "fc2fcf83c225fa0c", + "bom-ref": "66fc43a84d8891a2", "name": "/usr/share/et/et_h.awk", "type": "file" }, { - "bom-ref": "5d84683054ed1c79", + "bom-ref": "292439e38d4cb007", "name": "/usr/share/fontconfig/conf.avail/05-reset-dirs-sample.conf", "type": "file" }, { - "bom-ref": "e14440a7c748a392", + "bom-ref": "12044884a9b61734", "name": "/usr/share/fontconfig/conf.avail/09-autohint-if-no-hinting.conf", "type": "file" }, { - "bom-ref": "92b51f94b53fb63e", + "bom-ref": "68d287e1430b234c", "name": "/usr/share/fontconfig/conf.avail/10-autohint.conf", "type": "file" }, { - "bom-ref": "20a7a5367b9250a1", + "bom-ref": "476e98211b8f1dbb", "name": "/usr/share/fontconfig/conf.avail/10-hinting-full.conf", "type": "file" }, { - "bom-ref": "6e636a04266e30f4", + "bom-ref": "8b598ee153bbf1ba", "name": "/usr/share/fontconfig/conf.avail/10-hinting-medium.conf", "type": "file" }, { - "bom-ref": "c61f8c3f99cc8f77", + "bom-ref": "e6bd9682e4c4d02d", "name": "/usr/share/fontconfig/conf.avail/10-hinting-none.conf", "type": "file" }, { - "bom-ref": "c2bdebaec119bf57", + "bom-ref": "6de4cfd2ae727bf9", "name": "/usr/share/fontconfig/conf.avail/10-hinting-slight.conf", "type": "file" }, { - "bom-ref": "0817b0129c40ec0b", + "bom-ref": "883cdd99529908c5", "name": "/usr/share/fontconfig/conf.avail/10-no-antialias.conf", "type": "file" }, { - "bom-ref": "92d4545873d55c67", + "bom-ref": "fe7ccb76c0615721", "name": "/usr/share/fontconfig/conf.avail/10-scale-bitmap-fonts.conf", "type": "file" }, { - "bom-ref": "ed038569b62a9cd2", + "bom-ref": "6670e286fcfd3ee8", "name": "/usr/share/fontconfig/conf.avail/10-sub-pixel-bgr.conf", "type": "file" }, { - "bom-ref": "faae18ed379d7882", + "bom-ref": "4e245811a8a8f244", "name": "/usr/share/fontconfig/conf.avail/10-sub-pixel-none.conf", "type": "file" }, { - "bom-ref": "e35dbfb01bff4c6e", + "bom-ref": "4755fb7dc3bb4d5c", "name": "/usr/share/fontconfig/conf.avail/10-sub-pixel-rgb.conf", "type": "file" }, { - "bom-ref": "ec745165813ec144", + "bom-ref": "79797420ecd41eba", "name": "/usr/share/fontconfig/conf.avail/10-sub-pixel-vbgr.conf", "type": "file" }, { - "bom-ref": "a79e71ad184463d8", + "bom-ref": "a8d3c0d40b1d72d6", "name": "/usr/share/fontconfig/conf.avail/10-sub-pixel-vrgb.conf", "type": "file" }, { - "bom-ref": "c74aacc7f0826e14", + "bom-ref": "76face70819c9d7e", "name": "/usr/share/fontconfig/conf.avail/10-unhinted.conf", "type": "file" }, { - "bom-ref": "039e44b77bacdf5c", + "bom-ref": "f68e7af94b867a2a", "name": "/usr/share/fontconfig/conf.avail/10-yes-antialias.conf", "type": "file" }, { - "bom-ref": "1df116ba6920a6d7", + "bom-ref": "63febd60f6d08921", "name": "/usr/share/fontconfig/conf.avail/11-lcdfilter-default.conf", "type": "file" }, { - "bom-ref": "19cd8bf29860e026", + "bom-ref": "0f903ecdde9eb50c", "name": "/usr/share/fontconfig/conf.avail/11-lcdfilter-legacy.conf", "type": "file" }, { - "bom-ref": "e27a8b4dcee69e36", + "bom-ref": "e1aaef999986a898", "name": "/usr/share/fontconfig/conf.avail/11-lcdfilter-light.conf", "type": "file" }, { - "bom-ref": "27b0d33a2c1810de", + "bom-ref": "116aabf65f20b44c", "name": "/usr/share/fontconfig/conf.avail/11-lcdfilter-none.conf", "type": "file" }, { - "bom-ref": "0e40301e587c8ce8", + "bom-ref": "13350e0f7d2845da", "name": "/usr/share/fontconfig/conf.avail/20-unhint-small-vera.conf", "type": "file" }, { - "bom-ref": "a17b583ef8a9af2c", + "bom-ref": "fc646191e2168e82", "name": "/usr/share/fontconfig/conf.avail/25-unhint-nonlatin.conf", "type": "file" }, { - "bom-ref": "49c1fb9abd8bd7d4", + "bom-ref": "3d3184dc75dafb5e", "name": "/usr/share/fontconfig/conf.avail/30-metric-aliases.conf", "type": "file" }, { - "bom-ref": "4c8b3b1f1d851e81", + "bom-ref": "1d310070e4411f1f", "name": "/usr/share/fontconfig/conf.avail/35-lang-normalize.conf", "type": "file" }, { - "bom-ref": "3ff504cd2ec99a8f", + "bom-ref": "c0bbe042161e806d", "name": "/usr/share/fontconfig/conf.avail/40-nonlatin.conf", "type": "file" }, { - "bom-ref": "f9bc021b8515348d", + "bom-ref": "cb83582971c06c2f", "name": "/usr/share/fontconfig/conf.avail/45-generic.conf", "type": "file" }, { - "bom-ref": "f0a4ddd15f087fc5", + "bom-ref": "5c48c44da65517bb", "name": "/usr/share/fontconfig/conf.avail/45-latin.conf", "type": "file" }, { - "bom-ref": "6e9830acaf6a91f3", + "bom-ref": "4c47c461345c5419", "name": "/usr/share/fontconfig/conf.avail/48-spacing.conf", "type": "file" }, { - "bom-ref": "b945c4437a1e2761", + "bom-ref": "14f44e46e8189d07", "name": "/usr/share/fontconfig/conf.avail/49-sansserif.conf", "type": "file" }, { - "bom-ref": "83e776fccf5f822d", + "bom-ref": "82c60fdb145d896b", "name": "/usr/share/fontconfig/conf.avail/50-user.conf", "type": "file" }, { - "bom-ref": "18900dc45070a033", + "bom-ref": "21cdbfd3a7648485", "name": "/usr/share/fontconfig/conf.avail/51-local.conf", "type": "file" }, { - "bom-ref": "817930303f110e5d", + "bom-ref": "85719983a2cf9257", "name": "/usr/share/fontconfig/conf.avail/53-monospace-lcd-filter.conf", "type": "file" }, { - "bom-ref": "ebf3aae6b3903f98", + "bom-ref": "6a167368ce2b36da", "name": "/usr/share/fontconfig/conf.avail/60-generic.conf", "type": "file" }, { - "bom-ref": "55b285b5f22db9a2", + "bom-ref": "c6baebfd4e4db8dc", "name": "/usr/share/fontconfig/conf.avail/60-latin.conf", "type": "file" }, { - "bom-ref": "8aedcced9a23242c", + "bom-ref": "34361789725e7a0e", "name": "/usr/share/fontconfig/conf.avail/65-fonts-persian.conf", "type": "file" }, { - "bom-ref": "7bcbdc192141f7a6", + "bom-ref": "4ceab00f0f6bf858", "name": "/usr/share/fontconfig/conf.avail/65-khmer.conf", "type": "file" }, { - "bom-ref": "cf0cc8a75bd54edc", + "bom-ref": "c4a6052ee0904a9a", "name": "/usr/share/fontconfig/conf.avail/65-nonlatin.conf", "type": "file" }, { - "bom-ref": "b4872bbcd75cbcbc", + "bom-ref": "18f29bb46bf10e96", "name": "/usr/share/fontconfig/conf.avail/69-unifont.conf", "type": "file" }, { - "bom-ref": "b2331ae6193fd226", + "bom-ref": "4eaaab4cc348ac2c", "name": "/usr/share/fontconfig/conf.avail/70-force-bitmaps.conf", "type": "file" }, { - "bom-ref": "75bef154fdbab366", + "bom-ref": "8b2db82ed8cc17c8", "name": "/usr/share/fontconfig/conf.avail/70-no-bitmaps-and-emoji.conf", "type": "file" }, { - "bom-ref": "b04abec4da37c49f", + "bom-ref": "c6ac69e44f48c06d", "name": "/usr/share/fontconfig/conf.avail/70-no-bitmaps-except-emoji.conf", "type": "file" }, { - "bom-ref": "6823218283275fdd", + "bom-ref": "8ed79c7014cfd9d7", "name": "/usr/share/fontconfig/conf.avail/70-no-bitmaps.conf", "type": "file" }, { - "bom-ref": "d418849727ff75e4", + "bom-ref": "f2a82480163d623a", "name": "/usr/share/fontconfig/conf.avail/70-yes-bitmaps.conf", "type": "file" }, { - "bom-ref": "19511b09afa3bccc", + "bom-ref": "78bc989c7c3a8f36", "name": "/usr/share/fontconfig/conf.avail/80-delicious.conf", "type": "file" }, { - "bom-ref": "7561c14cdddd4f8d", + "bom-ref": "b052c2b7af49ba43", "name": "/usr/share/fontconfig/conf.avail/90-synthetic.conf", "type": "file" }, { - "bom-ref": "a5958ec45f550015", + "bom-ref": "ec7826002d314aa3", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", "type": "file" }, { - "bom-ref": "49dc499c8aa6577b", + "bom-ref": "1449922e81603475", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", "type": "file" }, { - "bom-ref": "6bc413c3b5a400d7", + "bom-ref": "7aaf7d88937e4015", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf", "type": "file" }, { - "bom-ref": "bfc8146f55ef0211", + "bom-ref": "790b4bf93fe52f7b", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSansMono-BoldOblique.ttf", "type": "file" }, { - "bom-ref": "24a71ac05521af44", + "bom-ref": "2e736de9916f91be", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Oblique.ttf", "type": "file" }, { - "bom-ref": "012b6bf1fac0f760", + "bom-ref": "fd84ef8ee501751a", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", "type": "file" }, { - "bom-ref": "2d0bea084644251a", + "bom-ref": "5b8203d794541c78", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf", "type": "file" }, { - "bom-ref": "0b20200fc34c0730", + "bom-ref": "68b78a26befec73e", "name": "/usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf", "type": "file" }, { - "bom-ref": "23b1fc45f6770b5c", + "bom-ref": "2ec3b7684cc1d0b2", "name": "/usr/share/gcc/python/libstdcxx/__init__.py", "type": "file" }, { - "bom-ref": "45191e63416d70ab", + "bom-ref": "3195500b9bd009c5", "name": "/usr/share/gcc/python/libstdcxx/v6/__init__.py", "type": "file" }, { - "bom-ref": "3fe41f44c0286d5b", + "bom-ref": "57d734576bcd1b9d", "name": "/usr/share/gcc/python/libstdcxx/v6/printers.py", "type": "file" }, { - "bom-ref": "9a5ab3f01413b100", + "bom-ref": "f516b362dea03bba", "name": "/usr/share/gcc/python/libstdcxx/v6/xmethods.py", "type": "file" }, { - "bom-ref": "8e41d58788ae697e", + "bom-ref": "18029f32ca500464", "name": "/usr/share/gdb/auto-load/lib/x86_64-linux-gnu/libc.so.6-gdb.py", "type": "file" }, { - "bom-ref": "fddaf6bf31ae8230", + "bom-ref": "4fbd5fb0d17b1b89", "name": "/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libisl.so.23.3.0-gdb.py", "type": "file" }, { - "bom-ref": "016228dbb6b0a43f", + "bom-ref": "1947547b80de844d", "name": "/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33-gdb.py", "type": "file" }, { - "bom-ref": "fde676755fabb156", + "bom-ref": "f31e6d72b1b4fb04", "name": "/usr/share/gdb/auto-load/usr/lib32/libstdc++.so.6.0.33-gdb.py", "type": "file" }, { - "bom-ref": "c30e9d780f9ec432", + "bom-ref": "706c76c6362e7e88", "name": "/usr/share/gdb/python/gdb/FrameDecorator.py", "type": "file" }, { - "bom-ref": "130905acdac4192c", + "bom-ref": "2230e6cebf6d8b16", "name": "/usr/share/gdb/python/gdb/FrameIterator.py", "type": "file" }, { - "bom-ref": "6647d302fd535954", + "bom-ref": "6aaf5ed6b685f22a", "name": "/usr/share/gdb/python/gdb/__init__.py", "type": "file" }, { - "bom-ref": "79486aa416e3fb09", + "bom-ref": "d99512fb26066a13", "name": "/usr/share/gdb/python/gdb/command/__init__.py", "type": "file" }, { - "bom-ref": "5883cb5a5c203a84", + "bom-ref": "87d20f5ce587ca8e", "name": "/usr/share/gdb/python/gdb/command/explore.py", "type": "file" }, { - "bom-ref": "3e900a4c060410ad", + "bom-ref": "6d428069f733f097", "name": "/usr/share/gdb/python/gdb/command/frame_filters.py", "type": "file" }, { - "bom-ref": "c4ce4f7cf2efff5e", + "bom-ref": "23c74aaf28692e98", "name": "/usr/share/gdb/python/gdb/command/missing_debug.py", "type": "file" }, { - "bom-ref": "6a9b6850e3df3a62", + "bom-ref": "217fd7ba6e9fdd94", "name": "/usr/share/gdb/python/gdb/command/pretty_printers.py", "type": "file" }, { - "bom-ref": "de0d43c6f45b6735", + "bom-ref": "8814ebd019902ecb", "name": "/usr/share/gdb/python/gdb/command/prompt.py", "type": "file" }, { - "bom-ref": "4cb71f35061e8d56", + "bom-ref": "b456026a72987a90", "name": "/usr/share/gdb/python/gdb/command/type_printers.py", "type": "file" }, { - "bom-ref": "2890b28ef03f1aec", + "bom-ref": "d6b4b9711ac3b4aa", "name": "/usr/share/gdb/python/gdb/command/unwinders.py", "type": "file" }, { - "bom-ref": "ead7f945ce03a9b8", + "bom-ref": "21a569557e918b1e", "name": "/usr/share/gdb/python/gdb/command/xmethods.py", "type": "file" }, { - "bom-ref": "7c9dd8b7b75b3e6a", + "bom-ref": "5cdb52c755b656c0", "name": "/usr/share/gdb/python/gdb/dap/__init__.py", "type": "file" }, { - "bom-ref": "70d136cf7a0b6bb1", + "bom-ref": "052440d1e4a5cc0b", "name": "/usr/share/gdb/python/gdb/dap/breakpoint.py", "type": "file" }, { - "bom-ref": "ddf7dab90745882a", + "bom-ref": "639f50572edab61c", "name": "/usr/share/gdb/python/gdb/dap/bt.py", "type": "file" }, { - "bom-ref": "1b094991a0f023c8", + "bom-ref": "3d8b6199f4e5e7d6", "name": "/usr/share/gdb/python/gdb/dap/disassemble.py", "type": "file" }, { - "bom-ref": "9e6de4ff01138996", + "bom-ref": "209c62f2bb73b400", "name": "/usr/share/gdb/python/gdb/dap/evaluate.py", "type": "file" }, { - "bom-ref": "f300759b3cfbd7d2", + "bom-ref": "f917e4e523f04710", "name": "/usr/share/gdb/python/gdb/dap/events.py", "type": "file" }, { - "bom-ref": "9b8c19e1a05964a2", + "bom-ref": "4a93cb1edde39ee0", "name": "/usr/share/gdb/python/gdb/dap/frames.py", "type": "file" }, { - "bom-ref": "6986120280dde8e6", + "bom-ref": "635fdbf41b0322ac", "name": "/usr/share/gdb/python/gdb/dap/io.py", "type": "file" }, { - "bom-ref": "9889785a52d5a8b3", + "bom-ref": "bc93e1cfc971a7d5", "name": "/usr/share/gdb/python/gdb/dap/launch.py", "type": "file" }, { - "bom-ref": "9c3e6a5f5d88b193", + "bom-ref": "575e7000b545edfd", "name": "/usr/share/gdb/python/gdb/dap/locations.py", "type": "file" }, { - "bom-ref": "d5ac1566b6c6cf3d", + "bom-ref": "9eae037c3c157967", "name": "/usr/share/gdb/python/gdb/dap/memory.py", "type": "file" }, { - "bom-ref": "e479dba01c08a82e", + "bom-ref": "396eff338b3b3cd0", "name": "/usr/share/gdb/python/gdb/dap/modules.py", "type": "file" }, { - "bom-ref": "93729db46c1882e0", + "bom-ref": "2bc7fdb57c8cfb06", "name": "/usr/share/gdb/python/gdb/dap/next.py", "type": "file" }, { - "bom-ref": "e0ea6d6e0f42860d", + "bom-ref": "ac8be4d904c7c6c7", "name": "/usr/share/gdb/python/gdb/dap/pause.py", "type": "file" }, { - "bom-ref": "8f4b2374eabec43d", + "bom-ref": "d58caf07fb166d47", "name": "/usr/share/gdb/python/gdb/dap/scopes.py", "type": "file" }, { - "bom-ref": "2c39a81853f2417d", + "bom-ref": "08c455f40f07f7a7", "name": "/usr/share/gdb/python/gdb/dap/server.py", "type": "file" }, { - "bom-ref": "603864ae740656bb", + "bom-ref": "a4dc6c76eddb4ff9", "name": "/usr/share/gdb/python/gdb/dap/sources.py", "type": "file" }, { - "bom-ref": "6d1242ceb01a4f93", + "bom-ref": "5c04f7970735894d", "name": "/usr/share/gdb/python/gdb/dap/startup.py", "type": "file" }, { - "bom-ref": "2dfff7c87a38b228", + "bom-ref": "5c1d2e6d71431fee", "name": "/usr/share/gdb/python/gdb/dap/state.py", "type": "file" }, { - "bom-ref": "6a34a95141cde71d", + "bom-ref": "73e5d1a33225e86b", "name": "/usr/share/gdb/python/gdb/dap/threads.py", "type": "file" }, { - "bom-ref": "480c8513f852dc84", + "bom-ref": "dd92bf6bb1efcbf2", "name": "/usr/share/gdb/python/gdb/dap/typecheck.py", "type": "file" }, { - "bom-ref": "263b877143c7a539", + "bom-ref": "c737a8026b4e3b87", "name": "/usr/share/gdb/python/gdb/dap/varref.py", "type": "file" }, { - "bom-ref": "fd830c68e324d62e", + "bom-ref": "06970538fa143574", "name": "/usr/share/gdb/python/gdb/disassembler.py", "type": "file" }, { - "bom-ref": "19b6b783b7ddea74", + "bom-ref": "aa5310a059c3daa2", "name": "/usr/share/gdb/python/gdb/frames.py", "type": "file" }, { - "bom-ref": "73c831f9a5bab1b5", + "bom-ref": "89f09c3c6ac4c9d3", "name": "/usr/share/gdb/python/gdb/function/__init__.py", "type": "file" }, { - "bom-ref": "9afad468088faeb4", + "bom-ref": "d665f3f5b3a95aca", "name": "/usr/share/gdb/python/gdb/function/as_string.py", "type": "file" }, { - "bom-ref": "eed1ba56d16b3912", + "bom-ref": "3dc91b17a0b6dbd8", "name": "/usr/share/gdb/python/gdb/function/caller_is.py", "type": "file" }, { - "bom-ref": "253de754f5f4a776", + "bom-ref": "13ba6e43574e8ad0", "name": "/usr/share/gdb/python/gdb/function/strfns.py", "type": "file" }, { - "bom-ref": "b22d00c846c97de2", + "bom-ref": "d33bea1b9d220e3c", "name": "/usr/share/gdb/python/gdb/missing_debug.py", "type": "file" }, { - "bom-ref": "f4dff5267188ceaf", + "bom-ref": "2cb8325e7dc19fe5", "name": "/usr/share/gdb/python/gdb/printer/__init__.py", "type": "file" }, { - "bom-ref": "563f530ebb96ae39", + "bom-ref": "2e438e271088654f", "name": "/usr/share/gdb/python/gdb/printer/bound_registers.py", "type": "file" }, { - "bom-ref": "a93cc94e98bf78c6", + "bom-ref": "b0eea9c1cd9a94fc", "name": "/usr/share/gdb/python/gdb/printing.py", "type": "file" }, { - "bom-ref": "ec9397bcb7ddbf42", + "bom-ref": "407087cc528565c8", "name": "/usr/share/gdb/python/gdb/prompt.py", "type": "file" }, { - "bom-ref": "49244fe53192670e", + "bom-ref": "f78867c1925ba29c", "name": "/usr/share/gdb/python/gdb/styling.py", "type": "file" }, { - "bom-ref": "7cb52867248e97d6", + "bom-ref": "d2f3ac078a0e9f0c", "name": "/usr/share/gdb/python/gdb/types.py", "type": "file" }, { - "bom-ref": "8c69e7f328d702f7", + "bom-ref": "e3b5b06d87b26591", "name": "/usr/share/gdb/python/gdb/unwinder.py", "type": "file" }, { - "bom-ref": "16fc163652b2bc9c", + "bom-ref": "57ebc9f7e8485e16", "name": "/usr/share/gdb/python/gdb/xmethod.py", "type": "file" }, { - "bom-ref": "ba06a1a8bb405323", + "bom-ref": "89ab04f6a77bfcdd", "name": "/usr/share/gdb/syscalls/aarch64-linux.xml", "type": "file" }, { - "bom-ref": "dbc2303a2fe48fae", + "bom-ref": "813f341435a34ff8", "name": "/usr/share/gdb/syscalls/amd64-linux.xml", "type": "file" }, { - "bom-ref": "942931447fe9ef3f", + "bom-ref": "0098469442a4fe61", "name": "/usr/share/gdb/syscalls/arm-linux.xml", "type": "file" }, { - "bom-ref": "a82200c8636b09a3", + "bom-ref": "47ee215cb2c76bd1", "name": "/usr/share/gdb/syscalls/freebsd.xml", "type": "file" }, { - "bom-ref": "c98b1ae4642dba5d", + "bom-ref": "ab71af48a83b4b83", "name": "/usr/share/gdb/syscalls/gdb-syscalls.dtd", "type": "file" }, { - "bom-ref": "d251869c0434cd7b", + "bom-ref": "cb6cc9572e892105", "name": "/usr/share/gdb/syscalls/i386-linux.xml", "type": "file" }, { - "bom-ref": "1ac636000f336f41", + "bom-ref": "e973097668ee4b0f", "name": "/usr/share/gdb/syscalls/loongarch-linux.xml", "type": "file" }, { - "bom-ref": "ba69029bb74a0d3d", + "bom-ref": "8951ce4d7a2e4807", "name": "/usr/share/gdb/syscalls/mips-n32-linux.xml", "type": "file" }, { - "bom-ref": "663e1e052bbed1a5", + "bom-ref": "a41e9aa9ca1530a3", "name": "/usr/share/gdb/syscalls/mips-n64-linux.xml", "type": "file" }, { - "bom-ref": "1f16f05332527353", + "bom-ref": "f3f8eae1881157e5", "name": "/usr/share/gdb/syscalls/mips-o32-linux.xml", "type": "file" }, { - "bom-ref": "17ff1eb821e1ae4b", + "bom-ref": "8ac9cb5d9204c4fd", "name": "/usr/share/gdb/syscalls/netbsd.xml", "type": "file" }, { - "bom-ref": "1a66169cd3f0b40e", + "bom-ref": "e0ad4632a19ee1f0", "name": "/usr/share/gdb/syscalls/ppc-linux.xml", "type": "file" }, { - "bom-ref": "a1d452aa140541ff", + "bom-ref": "3e7c6282a56b9f85", "name": "/usr/share/gdb/syscalls/ppc64-linux.xml", "type": "file" }, { - "bom-ref": "b9c91a0b4014d705", + "bom-ref": "406236e22046c3d3", "name": "/usr/share/gdb/syscalls/s390-linux.xml", "type": "file" }, { - "bom-ref": "1ac1e2861ac84e6c", + "bom-ref": "dd65e83452585cb6", "name": "/usr/share/gdb/syscalls/s390x-linux.xml", "type": "file" }, { - "bom-ref": "e9a26f666ab9570c", + "bom-ref": "e669509230ba568e", "name": "/usr/share/gdb/syscalls/sparc-linux.xml", "type": "file" }, { - "bom-ref": "1505b6c84b0b80ec", + "bom-ref": "5539ea70bd644dd6", "name": "/usr/share/gdb/syscalls/sparc64-linux.xml", "type": "file" }, { - "bom-ref": "737ef2620ef9bc9f", + "bom-ref": "77e707d4c66f8085", "name": "/usr/share/gdb/system-gdbinit/elinos.py", "type": "file" }, { - "bom-ref": "87a4d4d19dc47eef", + "bom-ref": "47ea3881d1e05365", "name": "/usr/share/gdb/system-gdbinit/wrs-linux.py", "type": "file" }, { - "bom-ref": "d0338e7cba623b03", + "bom-ref": "35a183ba4a5023ee", "name": "/usr/share/git-core/contrib/hooks/post-receive-email", "type": "file" }, { - "bom-ref": "cfaa4d7ee0071ef1", + "bom-ref": "88ab64e818c18238", "name": "/usr/share/git-core/contrib/hooks/pre-auto-gc-battery", "type": "file" }, { - "bom-ref": "9b78185215db5682", + "bom-ref": "6eecb8142221a373", "name": "/usr/share/git-core/contrib/hooks/setgitperms.perl", "type": "file" }, { - "bom-ref": "bd58376756fb9d19", + "bom-ref": "856299d649fc5778", "name": "/usr/share/git-core/contrib/hooks/update-paranoid", "type": "file" }, { - "bom-ref": "1e12f63d57be9bfe", + "bom-ref": "4cd02f943d173393", "name": "/usr/share/git-core/templates/description", "type": "file" }, { - "bom-ref": "031f15f4d4e28266", + "bom-ref": "acf427b601d8e303", "name": "/usr/share/git-core/templates/hooks/applypatch-msg.sample", "type": "file" }, { - "bom-ref": "1ecb3e8b78f88bf4", + "bom-ref": "065ec6ae9932e839", "name": "/usr/share/git-core/templates/hooks/commit-msg.sample", "type": "file" }, { - "bom-ref": "f358886f856d0ffc", + "bom-ref": "e6b9c61f7b213a09", "name": "/usr/share/git-core/templates/hooks/fsmonitor-watchman.sample", "type": "file" }, { - "bom-ref": "8bfce398e29f212f", + "bom-ref": "42225cd58aae8b12", "name": "/usr/share/git-core/templates/hooks/post-update.sample", "type": "file" }, { - "bom-ref": "dbf17a5af13877ac", + "bom-ref": "09d69c819c9a86a1", "name": "/usr/share/git-core/templates/hooks/pre-applypatch.sample", "type": "file" }, { - "bom-ref": "737bcac9dbd79f9f", + "bom-ref": "6210b6ca2ec6cbca", "name": "/usr/share/git-core/templates/hooks/pre-commit.sample", "type": "file" }, { - "bom-ref": "6481ee59aeb3fe69", + "bom-ref": "6eb196abc74b3afc", "name": "/usr/share/git-core/templates/hooks/pre-merge-commit.sample", "type": "file" }, { - "bom-ref": "df071c1a868de0c0", + "bom-ref": "a06a14fff08b6aad", "name": "/usr/share/git-core/templates/hooks/pre-push.sample", "type": "file" }, { - "bom-ref": "73c3a3dc85e438b3", + "bom-ref": "31ce4fdcfcd9b546", "name": "/usr/share/git-core/templates/hooks/pre-rebase.sample", "type": "file" }, { - "bom-ref": "6d018c72afc08d76", + "bom-ref": "61cbe32d9b24dd63", "name": "/usr/share/git-core/templates/hooks/pre-receive.sample", "type": "file" }, { - "bom-ref": "168e2764c4b4fe87", + "bom-ref": "a8104ea79820ba62", "name": "/usr/share/git-core/templates/hooks/prepare-commit-msg.sample", "type": "file" }, { - "bom-ref": "7cca210545f5b50b", + "bom-ref": "f671d7e6d3a80aca", "name": "/usr/share/git-core/templates/hooks/push-to-checkout.sample", "type": "file" }, { - "bom-ref": "97fe0eef1ea356a9", + "bom-ref": "8255b077b8734ae8", "name": "/usr/share/git-core/templates/hooks/sendemail-validate.sample", "type": "file" }, { - "bom-ref": "ffd80cb51ecaeb7f", + "bom-ref": "31e5034c8d48f3d6", "name": "/usr/share/git-core/templates/hooks/update.sample", "type": "file" }, { - "bom-ref": "bbe4d3a9ba5c78dd", + "bom-ref": "696cbf54d8f8ce1c", "name": "/usr/share/git-core/templates/info/exclude", "type": "file" }, { - "bom-ref": "b2fe288a1acb0f9b", + "bom-ref": "fe4d216ce56dca06", "name": "/usr/share/gitweb/gitweb.cgi", "type": "file" }, { - "bom-ref": "2cdc14c496ae3502", + "bom-ref": "f4feedc33469b363", "name": "/usr/share/gitweb/static/git-favicon.png", "type": "file" }, { - "bom-ref": "0f485720e8221766", + "bom-ref": "ca02a0fac4f6330b", "name": "/usr/share/gitweb/static/git-logo.png", "type": "file" }, { - "bom-ref": "d70ee90b954a0011", + "bom-ref": "ec23848263b08c64", "name": "/usr/share/gitweb/static/gitweb.css", "type": "file" }, { - "bom-ref": "3e42c0294dfb158d", + "bom-ref": "9df47431e07fb5a4", "name": "/usr/share/gitweb/static/gitweb.js", "type": "file" }, { - "bom-ref": "f8fc31ae9d2e3094", + "bom-ref": "9069a5808f4c03c2", "name": "/usr/share/glog/cmake/FindUnwind.cmake", "type": "file" }, { - "bom-ref": "028b97249b6d14b4", + "bom-ref": "2eb20e3adcb3e25b", "name": "/usr/share/gnupg/distsigkey.gpg", "type": "file" }, { - "bom-ref": "3068a50512109a94", + "bom-ref": "b71def04ca865d2b", "name": "/usr/share/gnupg/sks-keyservers.netCA.pem", "type": "file" }, { - "bom-ref": "62b72ab072dac5e1", + "bom-ref": "02ec38106cebde87", "name": "/usr/share/graphviz/lefty/box.lefty", "type": "file" }, { - "bom-ref": "a66947deef012c5e", + "bom-ref": "031b00f9ee43b964", "name": "/usr/share/graphviz/lefty/def.lefty", "type": "file" }, { - "bom-ref": "e0670d16ee2f7eaa", + "bom-ref": "2e994092302b6eb0", "name": "/usr/share/graphviz/lefty/dotty.lefty", "type": "file" }, { - "bom-ref": "1c02c35d5292de29", + "bom-ref": "ab4d833a9fa8068f", "name": "/usr/share/graphviz/lefty/dotty_draw.lefty", "type": "file" }, { - "bom-ref": "4edd7b160dedca12", + "bom-ref": "cc1171a238c9451c", "name": "/usr/share/graphviz/lefty/dotty_edit.lefty", "type": "file" }, { - "bom-ref": "4807227096d2ac50", + "bom-ref": "d87e7a506a28168a", "name": "/usr/share/graphviz/lefty/dotty_layout.lefty", "type": "file" }, { - "bom-ref": "185dad5a8e85d996", + "bom-ref": "65c5ef5a2fe3f0f4", "name": "/usr/share/graphviz/lefty/dotty_ui.lefty", "type": "file" }, { - "bom-ref": "90d29930acd21220", + "bom-ref": "e9df4ae785c0be7e", "name": "/usr/share/graphviz/lefty/fractal.lefty", "type": "file" }, { - "bom-ref": "2a8400694c83061b", + "bom-ref": "a2e0f092f8a6d555", "name": "/usr/share/graphviz/lefty/fractal2.lefty", "type": "file" }, { - "bom-ref": "10842197cf2e90fd", + "bom-ref": "9f42168f080868a7", "name": "/usr/share/graphviz/lefty/lefty.psp", "type": "file" }, { - "bom-ref": "d2b60c74977004c6", + "bom-ref": "372ff918995d02ac", "name": "/usr/share/graphviz/lefty/slides.lefty", "type": "file" }, { - "bom-ref": "2e12ed5ca5ab2a25", + "bom-ref": "d1d9618be34ada53", "name": "/usr/share/graphviz/lefty/tree.lefty", "type": "file" }, { - "bom-ref": "d77cdc6128b80d4f", + "bom-ref": "8fda1bd6a5dcdbe4", "name": "/usr/share/hwdata/pnp.ids", "type": "file" }, { - "bom-ref": "2a304aa0bc958245", + "bom-ref": "1ccbb92e14f01e54", "name": "/usr/share/icons/hicolor/48x48/apps/gvim.png", "type": "file" }, { - "bom-ref": "7e3752f4e3aae894", + "bom-ref": "1704d974a816e2a1", "name": "/usr/share/icons/hicolor/scalable/apps/gvim.svg", "type": "file" }, { - "bom-ref": "b5c4e9e530252a9b", + "bom-ref": "d75ec6a8ea338162", "name": "/usr/share/icons/locolor/16x16/apps/gvim.png", "type": "file" }, { - "bom-ref": "6dd612b7e7359d76", + "bom-ref": "b83b1eab59948503", "name": "/usr/share/icons/locolor/32x32/apps/gvim.png", "type": "file" }, { - "bom-ref": "4d5bcfe69fad58cc", + "bom-ref": "b1de48c527998c2a", "name": "/usr/share/icu/74.2/config/mh-linux", "type": "file" }, { - "bom-ref": "bb7bbda04bb60842", + "bom-ref": "19b2b01bffca8da8", "name": "/usr/share/icu/74.2/install-sh", "type": "file" }, { - "bom-ref": "aad28fc03c296d29", + "bom-ref": "76a4aa63b5e3df47", "name": "/usr/share/icu/74.2/mkinstalldirs", "type": "file" }, { - "bom-ref": "6985f7d58969b734", + "bom-ref": "6f12f254d92c3e2a", "name": "/usr/share/info.dir", "type": "file" }, { - "bom-ref": "0999cac39eb85682", + "bom-ref": "63f3f982ba1627f0", + "name": "/usr/share/info/gnupg-card-architecture.png", + "type": "file" + }, + { + "bom-ref": "d893daed8599e032", + "name": "/usr/share/info/gnupg-module-overview.png", + "type": "file" + }, + { + "bom-ref": "0496e70a31e49cff", + "name": "/usr/share/info/gnupg.info-1.gz", + "type": "file" + }, + { + "bom-ref": "5dd2e572d56c8eb4", + "name": "/usr/share/info/gnupg.info-2.gz", + "type": "file" + }, + { + "bom-ref": "897b49a7e6418f34", + "name": "/usr/share/info/gnupg.info-3.gz", + "type": "file" + }, + { + "bom-ref": "c647818af56d656e", + "name": "/usr/share/info/gnupg.info.gz", + "type": "file" + }, + { + "bom-ref": "ee88d32a0e16efb8", "name": "/usr/share/javascript/jquery/jquery.js", "type": "file" }, { - "bom-ref": "551df6e1cdb2025c", + "bom-ref": "807185c5e4ff63f2", "name": "/usr/share/javascript/jquery/jquery.min.js", "type": "file" }, { - "bom-ref": "fa8c3d63cb860c27", + "bom-ref": "0fdc29145114d629", "name": "/usr/share/javascript/jquery/jquery.min.js.brotli", "type": "file" }, { - "bom-ref": "c45eb3cb82e81b63", + "bom-ref": "63bbc4c600d6ce75", "name": "/usr/share/javascript/jquery/jquery.min.js.gz", "type": "file" }, { - "bom-ref": "6caf3aba35113012", + "bom-ref": "8f687aa6e9fcd568", "name": "/usr/share/javascript/jquery/jquery.min.map", "type": "file" }, { - "bom-ref": "76d30e88d501cece", + "bom-ref": "33e77a550ab4548c", "name": "/usr/share/javascript/jquery/jquery.min.map.brotli", "type": "file" }, { - "bom-ref": "0216374a34e05903", + "bom-ref": "58734071b21079b5", "name": "/usr/share/javascript/jquery/jquery.min.map.gz", "type": "file" }, { - "bom-ref": "f9f93ca6de9f7fbc", + "bom-ref": "b24e8bde0ccc99b6", "name": "/usr/share/javascript/sphinxdoc/1.0/css3-mediaqueries.js", "type": "file" }, { - "bom-ref": "5357a5c92d726cbf", + "bom-ref": "b4a78908f2d31c25", "name": "/usr/share/javascript/sphinxdoc/1.0/doctools.js", "type": "file" }, { - "bom-ref": "5d1736b31d5958c3", + "bom-ref": "910f04005e2d1b15", "name": "/usr/share/javascript/sphinxdoc/1.0/language_data.js", "type": "file" }, { - "bom-ref": "bc62eb09590e8e94", + "bom-ref": "99962cb2708b0c2a", "name": "/usr/share/javascript/sphinxdoc/1.0/searchtools.js", "type": "file" }, { - "bom-ref": "b1d1d849fdd696c7", + "bom-ref": "bc68840154b51d3d", "name": "/usr/share/javascript/sphinxdoc/1.0/sidebar.js", "type": "file" }, { - "bom-ref": "f2456cc1cabdc088", + "bom-ref": "1aac7a655fc298d2", "name": "/usr/share/javascript/sphinxdoc/1.0/sphinx_highlight.js", "type": "file" }, { - "bom-ref": "3cefac755e4721e4", + "bom-ref": "e966d1f3fa801a3e", "name": "/usr/share/javascript/sphinxdoc/1.0/theme_extras.js", "type": "file" }, { - "bom-ref": "b77dcb6e5e39e2d5", + "bom-ref": "aee70ec67080c7f3", "name": "/usr/share/javascript/sphinxdoc/index", "type": "file" }, { - "bom-ref": "eaa4ab294db0f1f0", + "bom-ref": "1de31572f18ac01a", "name": "/usr/share/javascript/underscore/underscore.js", "type": "file" }, { - "bom-ref": "58f959b482d36e07", + "bom-ref": "ce890a53541fd239", "name": "/usr/share/javascript/underscore/underscore.min.js", "type": "file" }, { - "bom-ref": "fac9b004f507fc2e", + "bom-ref": "803c941315a8e9f8", "name": "/usr/share/javascript/underscore/underscore.min.js.br", "type": "file" }, { - "bom-ref": "00a202ffac74df08", + "bom-ref": "c35d25396237e7da", "name": "/usr/share/javascript/underscore/underscore.min.js.gz", "type": "file" }, { - "bom-ref": "0cdb61c3632b8d28", + "bom-ref": "6cb2cd74846e106a", "name": "/usr/share/javascript/underscore/underscore.min.js.map", "type": "file" }, { - "bom-ref": "41fa5fe3114e5320", + "bom-ref": "a3c1308ba2219c16", "name": "/usr/share/javascript/underscore/underscore.min.js.map.br", "type": "file" }, { - "bom-ref": "c04d76cd94a24162", + "bom-ref": "ce636e3fb16a9838", "name": "/usr/share/javascript/underscore/underscore.min.js.map.gz", "type": "file" }, { - "bom-ref": "d3565de7c878a571", + "bom-ref": "800abd2892968b5f", "name": "/usr/share/keyrings/cuda-archive-keyring.gpg", "type": "file" }, { - "bom-ref": "db6076811907946c", + "bom-ref": "afa9e6a90dc14712", "name": "/usr/share/keyrings/ubuntu-archive-keyring.gpg", "type": "file" }, { - "bom-ref": "69b344f3199662b1", + "bom-ref": "80525a9d4c43af0b", "name": "/usr/share/keyrings/ubuntu-archive-removed-keys.gpg", "type": "file" }, { - "bom-ref": "34bd9d4ec8a666a6", + "bom-ref": "768ab01df9114b88", "name": "/usr/share/keyrings/ubuntu-cloudimage-keyring.gpg", "type": "file" }, { - "bom-ref": "df716cbc60d5d632", + "bom-ref": "980d943c138c7c70", "name": "/usr/share/keyrings/ubuntu-cloudimage-removed-keys.gpg", "type": "file" }, { - "bom-ref": "35597c25b41245b8", + "bom-ref": "b45fcc019113a15e", "name": "/usr/share/keyrings/ubuntu-master-keyring.gpg", "type": "file" }, { - "bom-ref": "de31f17dfbd0ded1", + "bom-ref": "d44a2f8b3744567f", "name": "/usr/share/libc-bin/nsswitch.conf", "type": "file" }, { - "bom-ref": "7f3332696a9781be", + "bom-ref": "69674124d7680188", "name": "/usr/share/libdebuginfod-common/debuginfod.csh", "type": "file" }, { - "bom-ref": "edf945a907360f76", + "bom-ref": "64fd2be7a2692ca8", "name": "/usr/share/libdebuginfod-common/debuginfod.sh", "type": "file" }, { - "bom-ref": "959f8f5866b296b2", + "bom-ref": "eed6ec8adc0e3c1c", "name": "/usr/share/libgcrypt20/clean-up-unmanaged-libraries", "type": "file" }, { - "bom-ref": "9b08a119231d15ae", + "bom-ref": "e35e37e2a0fad034", "name": "/usr/share/libthai/thbrk.tri", "type": "file" }, { - "bom-ref": "e3bd85eb00cfcea0", + "bom-ref": "b8aa3fb4a2ebd586", "name": "/usr/share/libtool/build-aux/compile", "type": "file" }, { - "bom-ref": "fff901d644fa47da", + "bom-ref": "739bd0bb94689514", "name": "/usr/share/libtool/build-aux/depcomp", "type": "file" }, { - "bom-ref": "94ad51a1da5bf06b", + "bom-ref": "0e86e245aafb6cb5", "name": "/usr/share/libtool/build-aux/install-sh", "type": "file" }, { - "bom-ref": "702eac32b44afecf", + "bom-ref": "1e399a41dc838949", "name": "/usr/share/libtool/build-aux/ltmain.sh", "type": "file" }, { - "bom-ref": "97c0e6f094bf2ba4", + "bom-ref": "6ec58cc9926becfa", "name": "/usr/share/libtool/build-aux/missing", "type": "file" }, { - "bom-ref": "eeaf45c6577afc74", + "bom-ref": "67da137e579a02b6", "name": "/usr/share/lintian/overrides/apt", "type": "file" }, { - "bom-ref": "f3ad563918ee1499", + "bom-ref": "53a94cea97e5e493", "name": "/usr/share/lintian/overrides/autoconf", "type": "file" }, { - "bom-ref": "84dbbcdf85306ba2", + "bom-ref": "54ab10601e92faa4", "name": "/usr/share/lintian/overrides/automake", "type": "file" }, { - "bom-ref": "5b2dd2744d7f46a7", + "bom-ref": "8e1770698f884f59", "name": "/usr/share/lintian/overrides/base-files", "type": "file" }, { - "bom-ref": "151482ed16c0aeb1", + "bom-ref": "eae3feb059a40993", "name": "/usr/share/lintian/overrides/base-passwd", "type": "file" }, { - "bom-ref": "5cea9f5b310442af", + "bom-ref": "4589d25b0dc585fd", "name": "/usr/share/lintian/overrides/bash", "type": "file" }, { - "bom-ref": "a5e097861c6d0804", + "bom-ref": "0d5b57960f5adc62", "name": "/usr/share/lintian/overrides/binutils", "type": "file" }, { - "bom-ref": "02e1ac71a1f665f9", + "bom-ref": "145d44b5006e10f7", "name": "/usr/share/lintian/overrides/binutils-common", "type": "file" }, { - "bom-ref": "476779d85a4a2841", + "bom-ref": "026ccdcc55623c83", "name": "/usr/share/lintian/overrides/binutils-x86-64-linux-gnu", "type": "file" }, { - "bom-ref": "d829e8178d83c813", + "bom-ref": "d710c8ddcbddb8f5", "name": "/usr/share/lintian/overrides/bsdutils", "type": "file" }, { - "bom-ref": "01ba163dea6fe827", + "bom-ref": "31c73e76e3b69ed5", "name": "/usr/share/lintian/overrides/ccache", "type": "file" }, { - "bom-ref": "98dee9c830e8f6ac", + "bom-ref": "7d663590aab3e972", "name": "/usr/share/lintian/overrides/clang-18", "type": "file" }, { - "bom-ref": "b1f1a301500d16b7", + "bom-ref": "98de4dc8fb30aba6", "name": "/usr/share/lintian/overrides/cpp-13-x86-64-linux-gnu", "type": "file" }, { - "bom-ref": "96c7dfa5af173f75", + "bom-ref": "4be068ea753d5b88", "name": "/usr/share/lintian/overrides/cpp-x86-64-linux-gnu", "type": "file" }, { - "bom-ref": "1463d869fb28f486", + "bom-ref": "10d662f8b03e8830", "name": "/usr/share/lintian/overrides/dash", "type": "file" }, { - "bom-ref": "4e1e4995cc8dc982", + "bom-ref": "5da6c718a7f87ee0", "name": "/usr/share/lintian/overrides/debconf", "type": "file" }, { - "bom-ref": "11a0f382daaae61c", + "bom-ref": "867dbf64ab56d9e6", "name": "/usr/share/lintian/overrides/dpkg", "type": "file" }, { - "bom-ref": "f4b4b7293d8299f0", + "bom-ref": "922ea62fc7283c8a", "name": "/usr/share/lintian/overrides/e2fsprogs", "type": "file" }, { - "bom-ref": "5857b30a14cdf049", + "bom-ref": "94242ae171658b64", "name": "/usr/share/lintian/overrides/g++-13-x86-64-linux-gnu", "type": "file" }, { - "bom-ref": "872700daaf14e47b", + "bom-ref": "a2aaf7fd7a576f3e", "name": "/usr/share/lintian/overrides/gcc-13-x86-64-linux-gnu", "type": "file" }, { - "bom-ref": "9e0ec45d09a4417a", + "bom-ref": "6121842aee747e63", "name": "/usr/share/lintian/overrides/git", "type": "file" }, { - "bom-ref": "323caffc8609f5a9", + "bom-ref": "3429f5d2173eb544", "name": "/usr/share/lintian/overrides/gpg-agent", "type": "file" }, { - "bom-ref": "4dfd2f53651944bc", + "bom-ref": "bbb497ff926a579e", "name": "/usr/share/lintian/overrides/ibverbs-providers", "type": "file" }, { - "bom-ref": "4f7e272397858aef", + "bom-ref": "2c4e93dba95196ad", "name": "/usr/share/lintian/overrides/libacl1", "type": "file" }, { - "bom-ref": "c57b42fb83262097", + "bom-ref": "9bce1e3b613e489d", "name": "/usr/share/lintian/overrides/libapt-pkg6.0t64", "type": "file" }, { - "bom-ref": "f9a061ba5a539a37", + "bom-ref": "5d201b01d9c97e22", "name": "/usr/share/lintian/overrides/libasan8", "type": "file" }, { - "bom-ref": "df5df7ef1f1d9f15", + "bom-ref": "48beaabdbf5da05f", "name": "/usr/share/lintian/overrides/libasound2t64", "type": "file" }, { - "bom-ref": "fbddd80ed314f22b", + "bom-ref": "1969c7a67580aae1", "name": "/usr/share/lintian/overrides/libattr1", "type": "file" }, { - "bom-ref": "5161f6810f79f2c4", + "bom-ref": "fee028d4d915e092", "name": "/usr/share/lintian/overrides/libbinutils", "type": "file" }, { - "bom-ref": "2c26fafd8111f482", + "bom-ref": "242947d566fd9f68", "name": "/usr/share/lintian/overrides/libblkid1", "type": "file" }, { - "bom-ref": "1bf2203203b9acd2", + "bom-ref": "619207d4ceaab655", "name": "/usr/share/lintian/overrides/libbrotli1", "type": "file" }, { - "bom-ref": "6ae3d9c83400f62a", + "bom-ref": "42ad99460e786939", "name": "/usr/share/lintian/overrides/libbsd0", "type": "file" }, { - "bom-ref": "7e3d9dfec8d36484", + "bom-ref": "ce3e29510008c286", "name": "/usr/share/lintian/overrides/libc-bin", "type": "file" }, { - "bom-ref": "85ab2c0307656277", + "bom-ref": "1654fdbbd0939a4d", "name": "/usr/share/lintian/overrides/libc6", "type": "file" }, { - "bom-ref": "2402888b29713d1a", + "bom-ref": "867257dc4d4bd674", "name": "/usr/share/lintian/overrides/libc6-dev", "type": "file" }, { - "bom-ref": "db2dfcfa768adf7f", + "bom-ref": "c9971a644736cb71", "name": "/usr/share/lintian/overrides/libc6-i386", "type": "file" }, { - "bom-ref": "68d3a68dbb66abef", + "bom-ref": "f1b6b55651c740bd", "name": "/usr/share/lintian/overrides/libclang-rt-18-dev", "type": "file" }, { - "bom-ref": "fccc3f5b0f8fd2cd", + "bom-ref": "fc181a08f0329a9f", "name": "/usr/share/lintian/overrides/libclang1-18", "type": "file" }, { - "bom-ref": "3500ede8cc5c7f3b", + "bom-ref": "cc64e7b74978c27e", "name": "/usr/share/lintian/overrides/libcurl3t64-gnutls", "type": "file" }, { - "bom-ref": "85b578c825e1f834", + "bom-ref": "5298daead7623a83", "name": "/usr/share/lintian/overrides/libcurl4t64", "type": "file" }, { - "bom-ref": "a28172cadf66728a", + "bom-ref": "ffd6e9731a0b7924", "name": "/usr/share/lintian/overrides/libdb5.3t64", "type": "file" }, { - "bom-ref": "16a7ffb69e381056", - "name": "/usr/share/lintian/overrides/libdbus-1-dev", - "type": "file" - }, - { - "bom-ref": "3822ab7a9265a37c", + "bom-ref": "fa30207e4aabd369", "name": "/usr/share/lintian/overrides/libedit2", "type": "file" }, { - "bom-ref": "2fe952875b96c375", + "bom-ref": "ebb5f706abc37d6f", "name": "/usr/share/lintian/overrides/libext2fs2t64", "type": "file" }, { - "bom-ref": "9a1a3658e50067f8", + "bom-ref": "8165633897739fca", "name": "/usr/share/lintian/overrides/libflac12t64", "type": "file" }, { - "bom-ref": "8d2f697aedd6d4f3", + "bom-ref": "7238577b0dd246ad", "name": "/usr/share/lintian/overrides/libgcc-s1", "type": "file" }, { - "bom-ref": "b8293849f2b4bcb0", + "bom-ref": "81f1591b8af136ee", "name": "/usr/share/lintian/overrides/libgd3", "type": "file" }, { - "bom-ref": "3180ba0eccac690f", + "bom-ref": "d340917afd75a27a", "name": "/usr/share/lintian/overrides/libgdbm-compat4t64", "type": "file" }, { - "bom-ref": "98810f9dd8a56ddf", + "bom-ref": "c8e31d8b6f543462", "name": "/usr/share/lintian/overrides/libgdbm6t64", "type": "file" }, { - "bom-ref": "abdd97b85fc9e66b", + "bom-ref": "453d80b5253a17ca", "name": "/usr/share/lintian/overrides/libglib2.0-0t64", "type": "file" }, { - "bom-ref": "1f65c1bc81faa663", + "bom-ref": "0441c11f07e905ad", "name": "/usr/share/lintian/overrides/libgnutls30t64", "type": "file" }, { - "bom-ref": "a1bf0c7aaacf2188", + "bom-ref": "9da53475856b2f6a", "name": "/usr/share/lintian/overrides/libgoogle-glog0v6t64", "type": "file" }, { - "bom-ref": "7f2b34a2babbbd19", + "bom-ref": "eb8fda89e03c538a", "name": "/usr/share/lintian/overrides/libgssapi-krb5-2", "type": "file" }, { - "bom-ref": "cf8956ff9a39224f", + "bom-ref": "66fd9b0cd3a859e5", "name": "/usr/share/lintian/overrides/libgssrpc4t64", "type": "file" }, { - "bom-ref": "ad3db93b61f2749f", + "bom-ref": "9bbaeb9db3d85da5", "name": "/usr/share/lintian/overrides/libgts-0.7-5t64", "type": "file" }, { - "bom-ref": "3930791cee846557", + "bom-ref": "c56b63c7db5bf461", "name": "/usr/share/lintian/overrides/libgvc6", "type": "file" }, { - "bom-ref": "01c2afcfb218c1b7", + "bom-ref": "d0c197b570c2e945", "name": "/usr/share/lintian/overrides/libhogweed6t64", "type": "file" }, { - "bom-ref": "c156b047f2e7c78f", + "bom-ref": "a4e2b801daf42b06", "name": "/usr/share/lintian/overrides/libhwasan0", "type": "file" }, { - "bom-ref": "bdea68b7d2eee6cd", + "bom-ref": "6e5ce46c8e46dc23", "name": "/usr/share/lintian/overrides/libicu-dev", "type": "file" }, { - "bom-ref": "500fc05ac02a2f5b", + "bom-ref": "1e6bf8f123be8a71", "name": "/usr/share/lintian/overrides/libicu74", "type": "file" }, { - "bom-ref": "a1c50f887651c54f", + "bom-ref": "f2644a92e8b9efad", "name": "/usr/share/lintian/overrides/libidn2-0", "type": "file" }, { - "bom-ref": "b9f575bf6c2e41c1", + "bom-ref": "b143afb8aa6e34ef", "name": "/usr/share/lintian/overrides/libipt2", "type": "file" }, { - "bom-ref": "a18bc5b81eb9580d", + "bom-ref": "6677a061aff0d137", "name": "/usr/share/lintian/overrides/libjpeg-turbo8", "type": "file" }, { - "bom-ref": "de0516a7fde39bf9", + "bom-ref": "75b84736a82094e3", "name": "/usr/share/lintian/overrides/libkdb5-10t64", "type": "file" }, { - "bom-ref": "db245509e4d147c4", + "bom-ref": "7d79f63495f55bfb", "name": "/usr/share/lintian/overrides/libkrb5-3", "type": "file" }, { - "bom-ref": "b92bfd03abac0b23", + "bom-ref": "b7efba111c0fe74c", "name": "/usr/share/lintian/overrides/libkrb5support0", "type": "file" }, { - "bom-ref": "6f46a89350be6839", + "bom-ref": "d61521f682c43c33", "name": "/usr/share/lintian/overrides/libllvm18", "type": "file" }, { - "bom-ref": "9de1c3a7a3bcfc2e", + "bom-ref": "c5eb79c789556e1f", "name": "/usr/share/lintian/overrides/liblsan0", "type": "file" }, { - "bom-ref": "72af4d19a99a77e7", + "bom-ref": "f07b61e64374f675", "name": "/usr/share/lintian/overrides/libmagic1t64", "type": "file" }, { - "bom-ref": "62fead4778d8760b", + "bom-ref": "ed4dac0563322691", "name": "/usr/share/lintian/overrides/libmount1", "type": "file" }, { - "bom-ref": "45aea0e49352d7a2", + "bom-ref": "f94dc32bc682f688", "name": "/usr/share/lintian/overrides/libmpg123-0t64", "type": "file" }, { - "bom-ref": "40742bd4fb946df1", + "bom-ref": "d844a2180ef225c3", "name": "/usr/share/lintian/overrides/libnettle8t64", "type": "file" }, { - "bom-ref": "e8e5c55edf3de5a2", + "bom-ref": "ecb931e192aa3304", "name": "/usr/share/lintian/overrides/libnorm1t64", "type": "file" }, { - "bom-ref": "e4408669c4bbf620", + "bom-ref": "b9bc85727216b4fa", "name": "/usr/share/lintian/overrides/libnpth0t64", "type": "file" }, { - "bom-ref": "e56c0914ded758cc", + "bom-ref": "3c56a1ca218668a6", "name": "/usr/share/lintian/overrides/libpam-modules", "type": "file" }, { - "bom-ref": "9331ed661828ff1a", + "bom-ref": "f7a3ea765f31f440", "name": "/usr/share/lintian/overrides/libpam-modules-bin", "type": "file" }, { - "bom-ref": "974717e8b2197e36", + "bom-ref": "bd83eb80ca901378", "name": "/usr/share/lintian/overrides/libpam-runtime", "type": "file" }, { - "bom-ref": "9a9c420976a61d56", + "bom-ref": "3fc2184f7a1cf4dc", "name": "/usr/share/lintian/overrides/libpam0g", "type": "file" }, { - "bom-ref": "f795ac6641505664", + "bom-ref": "6e803a50dae9958f", "name": "/usr/share/lintian/overrides/libpci3", "type": "file" }, { - "bom-ref": "ba1485ea074562b3", + "bom-ref": "e9872e4fad6121c2", "name": "/usr/share/lintian/overrides/libperl5.38t64", "type": "file" }, { - "bom-ref": "e20d7c174b3241e9", + "bom-ref": "621c24c33fce448b", "name": "/usr/share/lintian/overrides/libpgm-5.3-0t64", "type": "file" }, { - "bom-ref": "c085bc31b0158c43", + "bom-ref": "13b2e87c726fab81", "name": "/usr/share/lintian/overrides/libpixman-1-0", "type": "file" }, { - "bom-ref": "a89938bdf0fe10ae", + "bom-ref": "87f09d8eac6fbf03", "name": "/usr/share/lintian/overrides/libpmi2-0t64", "type": "file" }, { - "bom-ref": "db3b0312a3e4599c", + "bom-ref": "3d2fa98b667d8c42", "name": "/usr/share/lintian/overrides/libpng16-16t64", "type": "file" }, { - "bom-ref": "45c30be6085f52c5", + "bom-ref": "72d26dd83aada057", "name": "/usr/share/lintian/overrides/libprotobuf-lite32t64", "type": "file" }, { - "bom-ref": "26948a8408c4d398", + "bom-ref": "f94df1cbf5b02c96", "name": "/usr/share/lintian/overrides/libprotobuf32t64", "type": "file" }, { - "bom-ref": "fc3f920586c9bf2f", + "bom-ref": "819087f735bf32e1", "name": "/usr/share/lintian/overrides/libprotoc32t64", "type": "file" }, { - "bom-ref": "9291e214ccb9d26b", + "bom-ref": "4041d340f9ebbf08", "name": "/usr/share/lintian/overrides/libpsl5t64", "type": "file" }, { - "bom-ref": "e75314a3b5fba2ff", + "bom-ref": "15cefd5b20ba3d71", "name": "/usr/share/lintian/overrides/libpython3.12-dev", "type": "file" }, { - "bom-ref": "50ebf9ea636adbd4", + "bom-ref": "35035ecca2deb888", "name": "/usr/share/lintian/overrides/libpython3.12-minimal", "type": "file" }, { - "bom-ref": "66db127da4e8cacb", + "bom-ref": "54c03eeb3f988e4b", "name": "/usr/share/lintian/overrides/libpython3.12-stdlib", "type": "file" }, { - "bom-ref": "a3afae0477409f10", + "bom-ref": "fbdffc6deb85f054", "name": "/usr/share/lintian/overrides/libpython3.12t64", "type": "file" }, { - "bom-ref": "44a510ac72b395fb", + "bom-ref": "828e6d349611aff6", "name": "/usr/share/lintian/overrides/libslurm40t64", "type": "file" }, { - "bom-ref": "747a9ffca15f23fc", + "bom-ref": "994d1324d5b32a9e", "name": "/usr/share/lintian/overrides/libsmartcols1", "type": "file" }, { - "bom-ref": "dd0d6d3305c6987a", + "bom-ref": "2e5af685532d9c38", "name": "/usr/share/lintian/overrides/libsource-highlight4t64", "type": "file" }, { - "bom-ref": "561699317a2a5423", + "bom-ref": "238ce31053783180", "name": "/usr/share/lintian/overrides/libssh-4", "type": "file" }, { - "bom-ref": "379d020c9aa83402", + "bom-ref": "bcce007833c27618", "name": "/usr/share/lintian/overrides/libssl3t64", "type": "file" }, { - "bom-ref": "6658cf061c901fb9", + "bom-ref": "4ac552f852121948", "name": "/usr/share/lintian/overrides/libtcmalloc-minimal4t64", "type": "file" }, { - "bom-ref": "e89e1d692938172f", + "bom-ref": "fc844899e66f2c7e", "name": "/usr/share/lintian/overrides/libtsan2", "type": "file" }, { - "bom-ref": "960e84e27f4783ab", + "bom-ref": "56155d93cee267be", "name": "/usr/share/lintian/overrides/libubsan1", "type": "file" }, { - "bom-ref": "c3f13f1791dd859d", + "bom-ref": "e683547441e503ef", "name": "/usr/share/lintian/overrides/libvorbis0a", "type": "file" }, { - "bom-ref": "12168ff6a3ba5b95", + "bom-ref": "01786fc3fe386fc7", "name": "/usr/share/lintian/overrides/libx11-6", "type": "file" }, { - "bom-ref": "dd2bbc23a6d651c5", + "bom-ref": "8d83e45f57caf6c3", "name": "/usr/share/lintian/overrides/libxml2", "type": "file" }, { - "bom-ref": "47431611cdad29c1", + "bom-ref": "c5f69e6c4f3bdcc7", "name": "/usr/share/lintian/overrides/libxt6t64", "type": "file" }, { - "bom-ref": "fcbf50902d161e0c", + "bom-ref": "7c1bc955e2155c36", "name": "/usr/share/lintian/overrides/llvm-18", "type": "file" }, { - "bom-ref": "b59654f191deac0e", + "bom-ref": "df77b4162f4207f0", "name": "/usr/share/lintian/overrides/llvm-18-runtime", "type": "file" }, { - "bom-ref": "58cb2bf8834b3e24", + "bom-ref": "fedca955aa023c0a", "name": "/usr/share/lintian/overrides/login", "type": "file" }, { - "bom-ref": "ceb287f6872a8109", + "bom-ref": "a4f36e168034ca27", "name": "/usr/share/lintian/overrides/mount", "type": "file" }, { - "bom-ref": "a267d5d2b58c00dc", + "bom-ref": "eb19dfcb511a737e", "name": "/usr/share/lintian/overrides/ncurses-base", "type": "file" }, { - "bom-ref": "e970bf6f0562d130", + "bom-ref": "97dff60cb0e84f25", "name": "/usr/share/lintian/overrides/openssh-client", "type": "file" }, { - "bom-ref": "55b1a14d14a5d4d0", + "bom-ref": "7a67e4483f552392", "name": "/usr/share/lintian/overrides/openssl", "type": "file" }, { - "bom-ref": "4e5cbb730d3437f5", + "bom-ref": "1e6460dd7512bcab", "name": "/usr/share/lintian/overrides/passwd", "type": "file" }, { - "bom-ref": "e35351cff91f7057", + "bom-ref": "1382a2aabea3fad2", "name": "/usr/share/lintian/overrides/perl", "type": "file" }, { - "bom-ref": "b16d82eee41b2636", + "bom-ref": "71caec8681e8a0c4", "name": "/usr/share/lintian/overrides/perl-base", "type": "file" }, { - "bom-ref": "68a630af0f65a2cd", + "bom-ref": "d0c2ce2fe87366ff", "name": "/usr/share/lintian/overrides/pkg-config", "type": "file" }, { - "bom-ref": "dbcb568bfe57c722", + "bom-ref": "08430d8d6f01a1e6", "name": "/usr/share/lintian/overrides/pkgconf", "type": "file" }, { - "bom-ref": "8c5cf9521775536e", + "bom-ref": "974469413677178a", "name": "/usr/share/lintian/overrides/pkgconf-bin", "type": "file" }, { - "bom-ref": "25fab64acbab1b0e", + "bom-ref": "c0ff043f70e7366c", "name": "/usr/share/lintian/overrides/procps", "type": "file" }, { - "bom-ref": "2dc9addfefd27854", + "bom-ref": "b875dffb8ca70092", "name": "/usr/share/lintian/overrides/python3", "type": "file" }, { - "bom-ref": "306a9991c38c4fd8", + "bom-ref": "f06402827e7fd2e6", "name": "/usr/share/lintian/overrides/python3-pip", "type": "file" }, { - "bom-ref": "1c2c55dffcfb66a2", + "bom-ref": "027146170779d2bc", "name": "/usr/share/lintian/overrides/python3.12", "type": "file" }, { - "bom-ref": "db4748aed8495ae4", + "bom-ref": "0f4d0209e2908efe", "name": "/usr/share/lintian/overrides/python3.12-minimal", "type": "file" }, { - "bom-ref": "40e224ff703cd026", + "bom-ref": "d230d077c93c3df8", "name": "/usr/share/lintian/overrides/python3.12-venv", "type": "file" }, { - "bom-ref": "a0cd12d1b01b897e", + "bom-ref": "73fc13b256734127", "name": "/usr/share/lintian/overrides/readline-common", "type": "file" }, { - "bom-ref": "e9e28ff439bdd283", - "name": "/usr/share/lintian/overrides/sgml-base", - "type": "file" - }, - { - "bom-ref": "17da24a42e4e0a17", + "bom-ref": "5a0d91224479ab4b", "name": "/usr/share/lintian/overrides/tzdata", "type": "file" }, { - "bom-ref": "a80197920565b727", + "bom-ref": "2da72b73a09eebe1", "name": "/usr/share/lintian/overrides/ucf", "type": "file" }, { - "bom-ref": "2a0d3f3007ad2843", + "bom-ref": "09db511d41b1833d", "name": "/usr/share/lintian/overrides/util-linux", "type": "file" }, { - "bom-ref": "af17e2a84bd50dac", + "bom-ref": "542319b3e9128e24", "name": "/usr/share/lintian/overrides/vim", "type": "file" }, { - "bom-ref": "3d4b73c9bfbb0dbd", + "bom-ref": "587f9cadadd31134", "name": "/usr/share/lintian/overrides/vim-common", "type": "file" }, { - "bom-ref": "05a49569b392c701", + "bom-ref": "69b64bfc98f89b41", "name": "/usr/share/lintian/overrides/vim-runtime", "type": "file" }, { - "bom-ref": "be1232fe6787e6b3", + "bom-ref": "812cb5d04d1054be", "name": "/usr/share/lintian/overrides/vim-tiny", "type": "file" }, { - "bom-ref": "98a8c151739d1fac", + "bom-ref": "45283272e4ae91f2", "name": "/usr/share/lintian/overrides/x11-common", "type": "file" }, { - "bom-ref": "14b44c553300c510", - "name": "/usr/share/lintian/overrides/xml-core", - "type": "file" - }, - { - "bom-ref": "b53fbf42a372619c", + "bom-ref": "1dc067008c052a6f", "name": "/usr/share/lintian/profiles/dpkg/main.profile", "type": "file" }, { - "bom-ref": "05088765d0ec7cba", + "bom-ref": "d697eaab4ed4e4eb", "name": "/usr/share/lto-disabled-list/lto-disabled-list", "type": "file" }, { - "bom-ref": "efd031d4f6be769a", + "bom-ref": "326944c89d8732e8", "name": "/usr/share/menu/bash", "type": "file" }, { - "bom-ref": "f73b0a4397e077b3", + "bom-ref": "c0dbc3ea74d82761", "name": "/usr/share/menu/dash", "type": "file" }, { - "bom-ref": "5372ee48084183e2", + "bom-ref": "4ce9ca4d7cd65e4c", "name": "/usr/share/menu/graphviz", "type": "file" }, { - "bom-ref": "0c2d5e8cd46ebc8c", + "bom-ref": "45866307b4bfcb2e", "name": "/usr/share/misc/config.guess", "type": "file" }, { - "bom-ref": "0bfdc6d1c5eac814", + "bom-ref": "a94d65bf58989e56", "name": "/usr/share/misc/config.sub", "type": "file" }, { - "bom-ref": "522d6df65c10282f", + "bom-ref": "d42f666c2bcc3780", "name": "/usr/share/misc/pci.ids", "type": "file" }, { - "bom-ref": "7cbef196db775196", + "bom-ref": "1e372f017ad6b319", "name": "/usr/share/misc/usb.ids", "type": "file" }, { - "bom-ref": "02cda849df5a6c57", + "bom-ref": "583c4e24bec841d1", "name": "/usr/share/motd", "type": "file" }, { - "bom-ref": "87bf81452202b71e", + "bom-ref": "c04e14315f874dce", "name": "/usr/share/nano/asm.nanorc", "type": "file" }, { - "bom-ref": "61bfe854fa5e8b34", + "bom-ref": "61f2bfd7d8cb54c4", "name": "/usr/share/nano/autoconf.nanorc", "type": "file" }, { - "bom-ref": "1e00888376d7d6b7", + "bom-ref": "e908a9b4af7cd37b", "name": "/usr/share/nano/awk.nanorc", "type": "file" }, { - "bom-ref": "3868f13c4d8b5ca5", + "bom-ref": "20414051e656b4bd", "name": "/usr/share/nano/c.nanorc", "type": "file" }, { - "bom-ref": "cdcd5c20abe9d3b8", + "bom-ref": "8798fe2c267180f4", "name": "/usr/share/nano/changelog.nanorc", "type": "file" }, { - "bom-ref": "930d158b092bebb2", + "bom-ref": "0caba24e5e672aee", "name": "/usr/share/nano/cmake.nanorc", "type": "file" }, { - "bom-ref": "ea2eb3d535905103", + "bom-ref": "237c21f2efdbb497", "name": "/usr/share/nano/css.nanorc", "type": "file" }, { - "bom-ref": "8ba61728c4e0a842", + "bom-ref": "6bf46f9dda305982", "name": "/usr/share/nano/debian/debian.nanorc", "type": "file" }, { - "bom-ref": "f2091426d53ba28e", + "bom-ref": "d02324718bfd564a", "name": "/usr/share/nano/default.nanorc", "type": "file" }, { - "bom-ref": "695964e9a092279f", + "bom-ref": "538aad20ca8a66d3", "name": "/usr/share/nano/elisp.nanorc", "type": "file" }, { - "bom-ref": "f980112cf981402d", + "bom-ref": "91c38d82905e10cd", "name": "/usr/share/nano/email.nanorc", "type": "file" }, { - "bom-ref": "286d69e2f3cc8d29", + "bom-ref": "c96a7fb5bb3ecf6d", "name": "/usr/share/nano/extra/ada.nanorc", "type": "file" }, { - "bom-ref": "5a93335bdb2929bb", + "bom-ref": "481828dbd777ef87", "name": "/usr/share/nano/extra/fortran.nanorc", "type": "file" }, { - "bom-ref": "f7714a5161261e60", + "bom-ref": "eae34e2bdd269a48", "name": "/usr/share/nano/extra/haskell.nanorc", "type": "file" }, { - "bom-ref": "69f66c0cb803a235", + "bom-ref": "6cfac0de101a8369", "name": "/usr/share/nano/extra/povray.nanorc", "type": "file" }, { - "bom-ref": "6dd60a6b072188ae", + "bom-ref": "37138237b015ecde", "name": "/usr/share/nano/extra/spec.nanorc", "type": "file" }, { - "bom-ref": "5971db1667f9b5ae", + "bom-ref": "ba63b7ea2686ee22", "name": "/usr/share/nano/go.nanorc", "type": "file" }, { - "bom-ref": "e8a731f369f47ce2", + "bom-ref": "d98a33b5534c460e", "name": "/usr/share/nano/groff.nanorc", "type": "file" }, { - "bom-ref": "b0c4ee2ada10b61e", + "bom-ref": "cb5b11b75870cf72", "name": "/usr/share/nano/guile.nanorc", "type": "file" }, { - "bom-ref": "e4d120db01c94116", + "bom-ref": "d18c18118baf3bbe", "name": "/usr/share/nano/html.nanorc", "type": "file" }, { - "bom-ref": "38cae154027416a8", + "bom-ref": "1280113367ea3284", "name": "/usr/share/nano/java.nanorc", "type": "file" }, { - "bom-ref": "82e61f7209c2a6a2", + "bom-ref": "fbbf141984c5cb8a", "name": "/usr/share/nano/javascript.nanorc", "type": "file" }, { - "bom-ref": "310289ed26d92f94", + "bom-ref": "8a73f0201261d808", "name": "/usr/share/nano/json.nanorc", "type": "file" }, { - "bom-ref": "99fce3115968d0fb", + "bom-ref": "6c0f13824a8f39c3", "name": "/usr/share/nano/lua.nanorc", "type": "file" }, { - "bom-ref": "001486828e0ad85b", + "bom-ref": "c3e4a40cdf3cae33", "name": "/usr/share/nano/makefile.nanorc", "type": "file" }, { - "bom-ref": "4c08479c415d9ab0", + "bom-ref": "9cff575abd53cda0", "name": "/usr/share/nano/man.nanorc", "type": "file" }, { - "bom-ref": "35b50584a44ac0bd", + "bom-ref": "548af52aa7712d7d", "name": "/usr/share/nano/markdown.nanorc", "type": "file" }, { - "bom-ref": "98374bd4010d941e", + "bom-ref": "238b9faa669407b6", "name": "/usr/share/nano/nanohelp.nanorc", "type": "file" }, { - "bom-ref": "c210cfc11451fdd1", + "bom-ref": "fee58ac380fee111", "name": "/usr/share/nano/nanorc.nanorc", "type": "file" }, { - "bom-ref": "37c0e8779419ebbf", + "bom-ref": "454b68f3bd8c0407", "name": "/usr/share/nano/nftables.nanorc", "type": "file" }, { - "bom-ref": "bed19258006beb95", + "bom-ref": "6c9931585be1a7c9", "name": "/usr/share/nano/objc.nanorc", "type": "file" }, { - "bom-ref": "98c6b7763cb31b6f", + "bom-ref": "f1a124da385d596f", "name": "/usr/share/nano/ocaml.nanorc", "type": "file" }, { - "bom-ref": "c3d794c5d2a0ae8f", + "bom-ref": "36cafbf9332ff7ef", "name": "/usr/share/nano/patch.nanorc", "type": "file" }, { - "bom-ref": "198440ed16b83ef7", + "bom-ref": "8c444aee4423e973", "name": "/usr/share/nano/perl.nanorc", "type": "file" }, { - "bom-ref": "d33eca2c844c67cc", + "bom-ref": "09a5acfc6738058c", "name": "/usr/share/nano/php.nanorc", "type": "file" }, { - "bom-ref": "0d3d8c7b3b003c24", + "bom-ref": "f5f0efb9ab5e65e0", "name": "/usr/share/nano/po.nanorc", "type": "file" }, { - "bom-ref": "123bd53cbad72f3f", + "bom-ref": "bb466ed192847883", "name": "/usr/share/nano/python.nanorc", "type": "file" }, { - "bom-ref": "fd1cb5413aefd544", + "bom-ref": "27b59589c41c7160", "name": "/usr/share/nano/ruby.nanorc", "type": "file" }, { - "bom-ref": "8ce6c09c2f9a272b", + "bom-ref": "5b948d090f6da4fb", "name": "/usr/share/nano/rust.nanorc", "type": "file" }, { - "bom-ref": "3ead63ccc3ab2f98", + "bom-ref": "aedc35103d6264bc", "name": "/usr/share/nano/sh.nanorc", "type": "file" }, { - "bom-ref": "73aa18f0f82438b2", + "bom-ref": "3d1011bb07ce2e36", "name": "/usr/share/nano/sql.nanorc", "type": "file" }, { - "bom-ref": "13fbaa649f2a1e76", + "bom-ref": "8c48d382b3894de6", "name": "/usr/share/nano/tcl.nanorc", "type": "file" }, { - "bom-ref": "87c8b22081cbf0cd", + "bom-ref": "15d117dbed2d3315", "name": "/usr/share/nano/tex.nanorc", "type": "file" }, { - "bom-ref": "4908993226913367", + "bom-ref": "194aff80b08965bf", "name": "/usr/share/nano/texinfo.nanorc", "type": "file" }, { - "bom-ref": "52fcccce2f2c56ea", + "bom-ref": "62a4f8c6f3f4d726", "name": "/usr/share/nano/xml.nanorc", "type": "file" }, { - "bom-ref": "a00fd3ca5cbca626", + "bom-ref": "f3f79a0259df9032", "name": "/usr/share/nano/yaml.nanorc", "type": "file" }, { - "bom-ref": "4fc2c8ac2d3352d9", + "bom-ref": "268a2672a45a4da7", "name": "/usr/share/networks", "type": "file" }, { - "bom-ref": "2c5cb39b71e23350", + "bom-ref": "a60c76a8cb62476a", "name": "/usr/share/pam-configs/mkhomedir", "type": "file" }, { - "bom-ref": "256ffddb47f4f2e2", + "bom-ref": "5fce63066528791c", "name": "/usr/share/pam-configs/unix", "type": "file" }, { - "bom-ref": "8c86156331cca043", + "bom-ref": "e46b64093ce7fc25", "name": "/usr/share/pam/common-account", "type": "file" }, { - "bom-ref": "f30fb6ff15cf476c", + "bom-ref": "579ed002f9460b4e", "name": "/usr/share/pam/common-account.md5sums", "type": "file" }, { - "bom-ref": "2d6a96c38b31ef11", + "bom-ref": "de618ae873f3675b", "name": "/usr/share/pam/common-auth", "type": "file" }, { - "bom-ref": "0c229a3a3f2046a2", + "bom-ref": "417a7b6c77cc5cec", "name": "/usr/share/pam/common-auth.md5sums", "type": "file" }, { - "bom-ref": "5d5f41265b46f807", + "bom-ref": "8a54a3ae06c79f39", "name": "/usr/share/pam/common-password", "type": "file" }, { - "bom-ref": "f3097b89a3b273d9", + "bom-ref": "232ff4a218136463", "name": "/usr/share/pam/common-password.md5sums", "type": "file" }, { - "bom-ref": "19d98c27e63df437", + "bom-ref": "2bc496d1d0703431", "name": "/usr/share/pam/common-session", "type": "file" }, { - "bom-ref": "57075d73cae4beda", + "bom-ref": "004068442c0ff3ac", "name": "/usr/share/pam/common-session-noninteractive", "type": "file" }, { - "bom-ref": "389b2fe2e49423be", + "bom-ref": "270070d6fd84d864", "name": "/usr/share/pam/common-session-noninteractive.md5sums", "type": "file" }, { - "bom-ref": "56d380c8919dc497", + "bom-ref": "2191c00291d49b81", "name": "/usr/share/pam/common-session.md5sums", "type": "file" }, { - "bom-ref": "fe707da27f1707f4", + "bom-ref": "56c88ad7f5b5c699", "name": "/usr/share/perl/5.38.2/AnyDBM_File.pm", "type": "file" }, { - "bom-ref": "4fd01b076c5ffa9e", + "bom-ref": "5a9186c632326aff", "name": "/usr/share/perl/5.38.2/App/Cpan.pm", "type": "file" }, { - "bom-ref": "803d9c46af0ce027", + "bom-ref": "a5cf1e324a402cde", "name": "/usr/share/perl/5.38.2/App/Prove.pm", "type": "file" }, { - "bom-ref": "f03b51155d7bc9f4", + "bom-ref": "7e08de9f54a3a88d", "name": "/usr/share/perl/5.38.2/App/Prove/State.pm", "type": "file" }, { - "bom-ref": "9c1b24de01f0b213", + "bom-ref": "1df08d612f0ef8ba", "name": "/usr/share/perl/5.38.2/App/Prove/State/Result.pm", "type": "file" }, { - "bom-ref": "317a15496ca6e741", + "bom-ref": "a9aa2dcc304a009c", "name": "/usr/share/perl/5.38.2/App/Prove/State/Result/Test.pm", "type": "file" }, { - "bom-ref": "8e698f03ff856972", + "bom-ref": "d21b70cbfedb038f", "name": "/usr/share/perl/5.38.2/Archive/Tar.pm", "type": "file" }, { - "bom-ref": "1ce3f5b3476899f5", + "bom-ref": "be619f17757d3cdc", "name": "/usr/share/perl/5.38.2/Archive/Tar/Constant.pm", "type": "file" }, { - "bom-ref": "b27bf17d695602b8", + "bom-ref": "1ca10ffaf0c5ae4d", "name": "/usr/share/perl/5.38.2/Archive/Tar/File.pm", "type": "file" }, { - "bom-ref": "d6d1a72fe055e9aa", + "bom-ref": "35d9d294e261b87f", "name": "/usr/share/perl/5.38.2/Attribute/Handlers.pm", "type": "file" }, { - "bom-ref": "5fa91ccd8c96371a", + "bom-ref": "0c0dcad0f3cbf78f", "name": "/usr/share/perl/5.38.2/AutoLoader.pm", "type": "file" }, { - "bom-ref": "32f4e034684e80a6", + "bom-ref": "5b0b173c3e41ff2b", "name": "/usr/share/perl/5.38.2/AutoSplit.pm", "type": "file" }, { - "bom-ref": "c7f0278fb4129cbe", + "bom-ref": "f8094048dd8dbb43", "name": "/usr/share/perl/5.38.2/B/Deparse.pm", "type": "file" }, { - "bom-ref": "c877837b715d7b95", + "bom-ref": "82e5cadfeb8eda70", "name": "/usr/share/perl/5.38.2/B/Op_private.pm", "type": "file" }, { - "bom-ref": "fe93cc5b4b6fbd36", + "bom-ref": "370b7b7d9ca1d577", "name": "/usr/share/perl/5.38.2/Benchmark.pm", "type": "file" }, { - "bom-ref": "4702ea7ef0a6df47", + "bom-ref": "5d726c5e4dbb279a", "name": "/usr/share/perl/5.38.2/CORE.pod", "type": "file" }, { - "bom-ref": "e884ee0a60fce84e", + "bom-ref": "14c904fe5c8db75b", "name": "/usr/share/perl/5.38.2/CPAN.pm", "type": "file" }, { - "bom-ref": "f152ba143105a08f", + "bom-ref": "865604ddbcfaf066", "name": "/usr/share/perl/5.38.2/CPAN/API/HOWTO.pod", "type": "file" }, { - "bom-ref": "24b5c6634191640d", + "bom-ref": "cb7c426935d81a64", "name": "/usr/share/perl/5.38.2/CPAN/Author.pm", "type": "file" }, { - "bom-ref": "e16812aa67835558", + "bom-ref": "188ee8def2a9fbc5", "name": "/usr/share/perl/5.38.2/CPAN/Bundle.pm", "type": "file" }, { - "bom-ref": "737b99888124da84", + "bom-ref": "ea2fb7ba480a8999", "name": "/usr/share/perl/5.38.2/CPAN/CacheMgr.pm", "type": "file" }, { - "bom-ref": "135d553e6f23fb7b", + "bom-ref": "6e1003269e29054e", "name": "/usr/share/perl/5.38.2/CPAN/Complete.pm", "type": "file" }, { - "bom-ref": "c98b78ae6b43d6b1", + "bom-ref": "7b35625b87caa780", "name": "/usr/share/perl/5.38.2/CPAN/Debug.pm", "type": "file" }, { - "bom-ref": "412bb0bdff4afe2c", + "bom-ref": "5b1155836182cd09", "name": "/usr/share/perl/5.38.2/CPAN/DeferredCode.pm", "type": "file" }, { - "bom-ref": "27ccc714537a3651", + "bom-ref": "3f390a510fae6ec4", "name": "/usr/share/perl/5.38.2/CPAN/Distribution.pm", "type": "file" }, { - "bom-ref": "162de7b8f633e109", + "bom-ref": "6515fc61fd58bbcc", "name": "/usr/share/perl/5.38.2/CPAN/Distroprefs.pm", "type": "file" }, { - "bom-ref": "f635e3eb171af81d", + "bom-ref": "d45caee9498efc84", "name": "/usr/share/perl/5.38.2/CPAN/Distrostatus.pm", "type": "file" }, { - "bom-ref": "383a70021ba5cf10", + "bom-ref": "6c4755f79083ea25", "name": "/usr/share/perl/5.38.2/CPAN/Exception/RecursiveDependency.pm", "type": "file" }, { - "bom-ref": "e4d3d7770b1a8acd", + "bom-ref": "c21920e29a7b10a4", "name": "/usr/share/perl/5.38.2/CPAN/Exception/blocked_urllist.pm", "type": "file" }, { - "bom-ref": "5d9d0a7a3e786c6a", + "bom-ref": "9d7da0998cadb66f", "name": "/usr/share/perl/5.38.2/CPAN/Exception/yaml_not_installed.pm", "type": "file" }, { - "bom-ref": "7f7d271658fb9519", + "bom-ref": "f79401521c1ca4f0", "name": "/usr/share/perl/5.38.2/CPAN/Exception/yaml_process_error.pm", "type": "file" }, { - "bom-ref": "ddb1b4abdf66b2a0", + "bom-ref": "a9a35b15d7fab0c5", "name": "/usr/share/perl/5.38.2/CPAN/FTP.pm", "type": "file" }, { - "bom-ref": "6d5cf94a1171c1fa", + "bom-ref": "0a0805ccc7f3ebc3", "name": "/usr/share/perl/5.38.2/CPAN/FTP/netrc.pm", "type": "file" }, { - "bom-ref": "daef4b7d8cbd7aaf", + "bom-ref": "0518644a1dced6e2", "name": "/usr/share/perl/5.38.2/CPAN/FirstTime.pm", "type": "file" }, { - "bom-ref": "f70b644b52f147c5", + "bom-ref": "c8a4f41b68233cd8", "name": "/usr/share/perl/5.38.2/CPAN/HTTP/Client.pm", "type": "file" }, { - "bom-ref": "2de4114b032d6f19", + "bom-ref": "10af8c68c70965d0", "name": "/usr/share/perl/5.38.2/CPAN/HTTP/Credentials.pm", "type": "file" }, { - "bom-ref": "307694158888dea1", + "bom-ref": "c47fce61832bd020", "name": "/usr/share/perl/5.38.2/CPAN/HandleConfig.pm", "type": "file" }, { - "bom-ref": "a05ab433565d73a6", + "bom-ref": "e7ee057f987f9167", "name": "/usr/share/perl/5.38.2/CPAN/Index.pm", "type": "file" }, { - "bom-ref": "4feeba447a713198", + "bom-ref": "7617c2782136b225", "name": "/usr/share/perl/5.38.2/CPAN/InfoObj.pm", "type": "file" }, { - "bom-ref": "9d9403b3bd9e511f", + "bom-ref": "439b46d484c912fe", "name": "/usr/share/perl/5.38.2/CPAN/Kwalify.pm", "type": "file" }, { - "bom-ref": "ca66d20b5687c734", + "bom-ref": "8d2c7401bd5836c9", "name": "/usr/share/perl/5.38.2/CPAN/Kwalify/distroprefs.dd", "type": "file" }, { - "bom-ref": "1e910ebdfc0c084b", + "bom-ref": "bedee95901af69fe", "name": "/usr/share/perl/5.38.2/CPAN/Kwalify/distroprefs.yml", "type": "file" }, { - "bom-ref": "e1b9261cb58a1a29", + "bom-ref": "8664cc40a912548c", "name": "/usr/share/perl/5.38.2/CPAN/LWP/UserAgent.pm", "type": "file" }, { - "bom-ref": "56114b85b244b0b6", + "bom-ref": "63a15b8d93b14c63", "name": "/usr/share/perl/5.38.2/CPAN/Meta.pm", "type": "file" }, { - "bom-ref": "d60868b00ee41aba", + "bom-ref": "c74b2450a9fd999b", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Converter.pm", "type": "file" }, { - "bom-ref": "cdd819cc2d60d038", + "bom-ref": "51e60d60d8761249", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Feature.pm", "type": "file" }, { - "bom-ref": "12f4095763ea7980", + "bom-ref": "2d03e3abd4772c89", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History.pm", "type": "file" }, { - "bom-ref": "a18822bd920c474b", + "bom-ref": "3b6faeed774cd776", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History/Meta_1_0.pod", "type": "file" }, { - "bom-ref": "8920274320422673", + "bom-ref": "34957a06f550013a", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History/Meta_1_1.pod", "type": "file" }, { - "bom-ref": "83be8125ccc89bc0", + "bom-ref": "36ede08a99219e99", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History/Meta_1_2.pod", "type": "file" }, { - "bom-ref": "86777eae4b33c570", + "bom-ref": "5fb5769778886f01", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History/Meta_1_3.pod", "type": "file" }, { - "bom-ref": "b8af04cfc1774972", + "bom-ref": "dcca79585d4f1a23", "name": "/usr/share/perl/5.38.2/CPAN/Meta/History/Meta_1_4.pod", "type": "file" }, { - "bom-ref": "fa5702fd74d0eed0", + "bom-ref": "263e7dadbf6725e9", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Merge.pm", "type": "file" }, { - "bom-ref": "de368c7a8e9fb9a8", + "bom-ref": "7bcaf9e29393a5e9", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Prereqs.pm", "type": "file" }, { - "bom-ref": "7e14555302846287", + "bom-ref": "b5cbd18701db4b0a", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Requirements.pm", "type": "file" }, { - "bom-ref": "473c9f521a37627d", + "bom-ref": "192a50f761c64d38", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Spec.pm", "type": "file" }, { - "bom-ref": "ac6e064afe4bc1d7", + "bom-ref": "28b3efdd232e2a62", "name": "/usr/share/perl/5.38.2/CPAN/Meta/Validator.pm", "type": "file" }, { - "bom-ref": "0a53bec70206dd9d", + "bom-ref": "db5e8653cdcc7900", "name": "/usr/share/perl/5.38.2/CPAN/Meta/YAML.pm", "type": "file" }, { - "bom-ref": "f477ce278671ffd5", + "bom-ref": "dfeccfb1cb8b4ff8", "name": "/usr/share/perl/5.38.2/CPAN/Mirrors.pm", "type": "file" }, { - "bom-ref": "77d77924926423f7", + "bom-ref": "f8c948207bd56c32", "name": "/usr/share/perl/5.38.2/CPAN/Module.pm", "type": "file" }, { - "bom-ref": "3218add63da63645", + "bom-ref": "94da9442bdd37d34", "name": "/usr/share/perl/5.38.2/CPAN/Nox.pm", "type": "file" }, { - "bom-ref": "0fa917b02db27c79", + "bom-ref": "4e047023f410bf04", "name": "/usr/share/perl/5.38.2/CPAN/Plugin.pm", "type": "file" }, { - "bom-ref": "1182ffa685f56a7b", + "bom-ref": "2fd90810f8bfe2be", "name": "/usr/share/perl/5.38.2/CPAN/Plugin/Specfile.pm", "type": "file" }, { - "bom-ref": "91b6bbe84b7acfd4", + "bom-ref": "2728e9fd96f56bd5", "name": "/usr/share/perl/5.38.2/CPAN/Prompt.pm", "type": "file" }, { - "bom-ref": "a05f0114cc75298f", + "bom-ref": "738a6fd50abc0056", "name": "/usr/share/perl/5.38.2/CPAN/Queue.pm", "type": "file" }, { - "bom-ref": "ee33e82167b92623", + "bom-ref": "fba909dcc84e76ce", "name": "/usr/share/perl/5.38.2/CPAN/Shell.pm", "type": "file" }, { - "bom-ref": "da9223b1f3b5c7f7", + "bom-ref": "536c041518776b42", "name": "/usr/share/perl/5.38.2/CPAN/Tarzip.pm", "type": "file" }, { - "bom-ref": "4e023fea72b35628", + "bom-ref": "cd0374cabbf536ed", "name": "/usr/share/perl/5.38.2/CPAN/URL.pm", "type": "file" }, { - "bom-ref": "ca5a40610df140ec", + "bom-ref": "b2af84d056a359f5", "name": "/usr/share/perl/5.38.2/CPAN/Version.pm", "type": "file" }, { - "bom-ref": "a95d9f96e688f221", + "bom-ref": "18d7de88340165ac", "name": "/usr/share/perl/5.38.2/Carp.pm", "type": "file" }, { - "bom-ref": "8878116a7aa37dab", + "bom-ref": "a94d8d92cb84b47e", "name": "/usr/share/perl/5.38.2/Carp/Heavy.pm", "type": "file" }, { - "bom-ref": "2ec14f805845bd6f", + "bom-ref": "867e3caeac92db46", "name": "/usr/share/perl/5.38.2/Class/Struct.pm", "type": "file" }, { - "bom-ref": "5420dba6fce564aa", + "bom-ref": "19f938366622cca3", "name": "/usr/share/perl/5.38.2/Compress/Zlib.pm", "type": "file" }, { - "bom-ref": "e699a028f2345db8", + "bom-ref": "a460482e67b1b64d", "name": "/usr/share/perl/5.38.2/Config/Extensions.pm", "type": "file" }, { - "bom-ref": "50b2bfc48e324e26", + "bom-ref": "286ccbb17c3c627f", "name": "/usr/share/perl/5.38.2/Config/Perl/V.pm", "type": "file" }, { - "bom-ref": "a7a86850029ade7f", + "bom-ref": "2889c553ddceb1ce", "name": "/usr/share/perl/5.38.2/DB.pm", "type": "file" }, { - "bom-ref": "7e208028581fe219", + "bom-ref": "74d12d2b1240be98", "name": "/usr/share/perl/5.38.2/DBM_Filter.pm", "type": "file" }, { - "bom-ref": "28355ddae50e2bb5", + "bom-ref": "f04558529ec21a4c", "name": "/usr/share/perl/5.38.2/DBM_Filter/compress.pm", "type": "file" }, { - "bom-ref": "42d5f644378ec7b5", + "bom-ref": "9bae6255db333e2c", "name": "/usr/share/perl/5.38.2/DBM_Filter/encode.pm", "type": "file" }, { - "bom-ref": "b295a499a3ac5de4", + "bom-ref": "4427e6ddb32344ad", "name": "/usr/share/perl/5.38.2/DBM_Filter/int32.pm", "type": "file" }, { - "bom-ref": "9f1c5599062908eb", + "bom-ref": "c9e858112e0f4c9e", "name": "/usr/share/perl/5.38.2/DBM_Filter/null.pm", "type": "file" }, { - "bom-ref": "f78e359e7651222b", + "bom-ref": "be282265aaf09152", "name": "/usr/share/perl/5.38.2/DBM_Filter/utf8.pm", "type": "file" }, { - "bom-ref": "c5586452ab1b2bd8", + "bom-ref": "57b447b7bf6a28e1", "name": "/usr/share/perl/5.38.2/Devel/SelfStubber.pm", "type": "file" }, { - "bom-ref": "3257cbc5e255fe73", + "bom-ref": "88aaffaa64fe8fe2", "name": "/usr/share/perl/5.38.2/Digest.pm", "type": "file" }, { - "bom-ref": "2ad155082c7a3fad", + "bom-ref": "d9a108e534756388", "name": "/usr/share/perl/5.38.2/Digest/base.pm", "type": "file" }, { - "bom-ref": "af07363b168c1049", + "bom-ref": "3f5d2b2f52d44618", "name": "/usr/share/perl/5.38.2/Digest/file.pm", "type": "file" }, { - "bom-ref": "2481ec13c31106a3", + "bom-ref": "9a5885004805831a", "name": "/usr/share/perl/5.38.2/DirHandle.pm", "type": "file" }, { - "bom-ref": "e1c0f429c44c01d8", + "bom-ref": "17f4133bb794bce9", "name": "/usr/share/perl/5.38.2/Dumpvalue.pm", "type": "file" }, { - "bom-ref": "eca5742aa538b90a", + "bom-ref": "be5b201cb9e4886f", "name": "/usr/share/perl/5.38.2/Encode/Changes.e2x", "type": "file" }, { - "bom-ref": "11756d5b80df070e", + "bom-ref": "728d62f1dcedfab3", "name": "/usr/share/perl/5.38.2/Encode/ConfigLocal_PM.e2x", "type": "file" }, { - "bom-ref": "2ee7c9b300de6f16", + "bom-ref": "b0434079074adb5f", "name": "/usr/share/perl/5.38.2/Encode/Makefile_PL.e2x", "type": "file" }, { - "bom-ref": "246e81de4fe138e0", + "bom-ref": "1ff6a88bdb480a95", "name": "/usr/share/perl/5.38.2/Encode/PerlIO.pod", "type": "file" }, { - "bom-ref": "f4320c9f48ad5e2c", + "bom-ref": "bfe6d6a7511cc355", "name": "/usr/share/perl/5.38.2/Encode/README.e2x", "type": "file" }, { - "bom-ref": "b85f699e7fc404a7", + "bom-ref": "db5a4cb2dc53afa2", "name": "/usr/share/perl/5.38.2/Encode/Supported.pod", "type": "file" }, { - "bom-ref": "c770d117cd9ce02e", + "bom-ref": "2d40f0f08027e17b", "name": "/usr/share/perl/5.38.2/Encode/_PM.e2x", "type": "file" }, { - "bom-ref": "476f62971b1a2820", + "bom-ref": "92ba3bbab025140d", "name": "/usr/share/perl/5.38.2/Encode/_T.e2x", "type": "file" }, { - "bom-ref": "aa2acc0dad1d5610", + "bom-ref": "71a67da7014f7119", "name": "/usr/share/perl/5.38.2/Encode/encode.h", "type": "file" }, { - "bom-ref": "571eb0c65f6c9159", + "bom-ref": "44b81b036b7f8c20", "name": "/usr/share/perl/5.38.2/English.pm", "type": "file" }, { - "bom-ref": "63a647111c0be602", + "bom-ref": "48a396e3bf701993", "name": "/usr/share/perl/5.38.2/Env.pm", "type": "file" }, { - "bom-ref": "275faf894fa773bb", + "bom-ref": "5595984c3fdd0a52", "name": "/usr/share/perl/5.38.2/Exporter.pm", "type": "file" }, { - "bom-ref": "6e241cb24708b617", + "bom-ref": "c6d4d12407d663b2", "name": "/usr/share/perl/5.38.2/Exporter/Heavy.pm", "type": "file" }, { - "bom-ref": "1855d2ed8577bbf0", + "bom-ref": "9332992216032e31", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder.pm", "type": "file" }, { - "bom-ref": "c2ee4767202df8d2", + "bom-ref": "dd3d640e147798f3", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Base.pm", "type": "file" }, { - "bom-ref": "cca4cce0b77e498a", + "bom-ref": "21f47852d6a28fc7", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/Unix.pm", "type": "file" }, { - "bom-ref": "3396855aa2d3336c", + "bom-ref": "c8e60e62ab2802f9", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/VMS.pm", "type": "file" }, { - "bom-ref": "8a1c9d4b1ec52908", + "bom-ref": "ac1a04c204180ac1", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/Windows.pm", "type": "file" }, { - "bom-ref": "3cd81e1050f8cf6c", + "bom-ref": "7217089d38e0b1fd", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/Windows/BCC.pm", "type": "file" }, { - "bom-ref": "d8fe4eb1645f87fa", + "bom-ref": "e228ebef7207f9a7", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/Windows/GCC.pm", "type": "file" }, { - "bom-ref": "bb7a32f05e979293", + "bom-ref": "5a2976f19918e2ee", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/Windows/MSVC.pm", "type": "file" }, { - "bom-ref": "c122c88a85ed87ed", + "bom-ref": "ad6816c25bbebb1c", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/aix.pm", "type": "file" }, { - "bom-ref": "d2216aba01ff57d3", + "bom-ref": "a134209ded058e32", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/android.pm", "type": "file" }, { - "bom-ref": "cb5673b01e15afdd", + "bom-ref": "eec7e6811f8585e4", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/cygwin.pm", "type": "file" }, { - "bom-ref": "46c930241fb77e0a", + "bom-ref": "135229fffdb9180b", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/darwin.pm", "type": "file" }, { - "bom-ref": "1fbfc7d808ecc04a", + "bom-ref": "ba9ddaedc4751893", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/dec_osf.pm", "type": "file" }, { - "bom-ref": "a21d3cd03b141489", + "bom-ref": "79ed4ccb13a35928", "name": "/usr/share/perl/5.38.2/ExtUtils/CBuilder/Platform/os2.pm", "type": "file" }, { - "bom-ref": "6510b308bf90ef4c", + "bom-ref": "22db43804f644991", "name": "/usr/share/perl/5.38.2/ExtUtils/Command.pm", "type": "file" }, { - "bom-ref": "2cf3374dad7dde1e", + "bom-ref": "fce20184ef562143", "name": "/usr/share/perl/5.38.2/ExtUtils/Command/MM.pm", "type": "file" }, { - "bom-ref": "e851cd0db5b131b5", + "bom-ref": "a55203d78a7cd6b8", "name": "/usr/share/perl/5.38.2/ExtUtils/Constant.pm", "type": "file" }, { - "bom-ref": "d96e9bc9aaa29054", + "bom-ref": "7d5a9ddcb2ffac21", "name": "/usr/share/perl/5.38.2/ExtUtils/Constant/Base.pm", "type": "file" }, { - "bom-ref": "332d48114b63136f", + "bom-ref": "3d83e8ad1027a1fa", "name": "/usr/share/perl/5.38.2/ExtUtils/Constant/ProxySubs.pm", "type": "file" }, { - "bom-ref": "b3689c90517f185f", + "bom-ref": "f896f11809d11a32", "name": "/usr/share/perl/5.38.2/ExtUtils/Constant/Utils.pm", "type": "file" }, { - "bom-ref": "697a089ddd0a3e49", + "bom-ref": "c01acb701281ce88", "name": "/usr/share/perl/5.38.2/ExtUtils/Constant/XS.pm", "type": "file" }, { - "bom-ref": "7b1f97adecbfe5a1", + "bom-ref": "667451c59428f7d8", "name": "/usr/share/perl/5.38.2/ExtUtils/Embed.pm", "type": "file" }, { - "bom-ref": "2a697e57fada8d9c", + "bom-ref": "9e0e6b11c02ff891", "name": "/usr/share/perl/5.38.2/ExtUtils/Install.pm", "type": "file" }, { - "bom-ref": "3a764129405d1a45", + "bom-ref": "aedc1b3d4abb2ef0", "name": "/usr/share/perl/5.38.2/ExtUtils/Installed.pm", "type": "file" }, { - "bom-ref": "74b4886d9fba3e02", + "bom-ref": "6b95da16217e9a23", "name": "/usr/share/perl/5.38.2/ExtUtils/Liblist.pm", "type": "file" }, { - "bom-ref": "e270bf7e70faffcc", + "bom-ref": "04c71eff0580a5ed", "name": "/usr/share/perl/5.38.2/ExtUtils/Liblist/Kid.pm", "type": "file" }, { - "bom-ref": "e9ca1ea7de0f1a42", + "bom-ref": "468edca637768fcb", "name": "/usr/share/perl/5.38.2/ExtUtils/MANIFEST.SKIP", "type": "file" }, { - "bom-ref": "b3029d719f0d6c5f", + "bom-ref": "ba12113551c7904a", "name": "/usr/share/perl/5.38.2/ExtUtils/MM.pm", "type": "file" }, { - "bom-ref": "0d1c74dd5916428b", + "bom-ref": "87a87142287a0842", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_AIX.pm", "type": "file" }, { - "bom-ref": "9d8c88f0e19561bf", + "bom-ref": "be01d4346fd123ba", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Any.pm", "type": "file" }, { - "bom-ref": "43b4737b3af5b15d", + "bom-ref": "446506e048dcd830", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_BeOS.pm", "type": "file" }, { - "bom-ref": "23a51fd278420b2d", + "bom-ref": "12f1364e1169122c", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Cygwin.pm", "type": "file" }, { - "bom-ref": "303f87311754ff49", + "bom-ref": "dfa2aaed1c0433fc", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_DOS.pm", "type": "file" }, { - "bom-ref": "a4a15dcca962f15b", + "bom-ref": "ebd68065833acec6", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Darwin.pm", "type": "file" }, { - "bom-ref": "53d980346e6d067a", + "bom-ref": "829cd3cb9c42ad77", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_MacOS.pm", "type": "file" }, { - "bom-ref": "57ba2f379cc0f20e", + "bom-ref": "7f897829aa99f10f", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_NW5.pm", "type": "file" }, { - "bom-ref": "bd700f74bb2f41b4", + "bom-ref": "707f1261f1395745", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_OS2.pm", "type": "file" }, { - "bom-ref": "2dafeeca84d2ee3f", + "bom-ref": "10c292d2b95af7e2", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_OS390.pm", "type": "file" }, { - "bom-ref": "107b29ebb4544fbc", + "bom-ref": "405bfdcc340b8651", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_QNX.pm", "type": "file" }, { - "bom-ref": "db29dc5ed2ca618d", + "bom-ref": "93133687775a5fc0", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_UWIN.pm", "type": "file" }, { - "bom-ref": "df14518b90bc25bc", + "bom-ref": "2cd2af752a847d41", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Unix.pm", "type": "file" }, { - "bom-ref": "78824780b9345713", + "bom-ref": "437724b55779915e", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_VMS.pm", "type": "file" }, { - "bom-ref": "3e67cda44d091092", + "bom-ref": "2ee94b3d51794b9f", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_VOS.pm", "type": "file" }, { - "bom-ref": "85958e5e46ebe761", + "bom-ref": "d848a9733ae4a1b4", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Win32.pm", "type": "file" }, { - "bom-ref": "f1be2c8a3af8b757", + "bom-ref": "a7cf4c119baf7a1e", "name": "/usr/share/perl/5.38.2/ExtUtils/MM_Win95.pm", "type": "file" }, { - "bom-ref": "b59ee060cbad9c83", + "bom-ref": "096832cdb635ed16", "name": "/usr/share/perl/5.38.2/ExtUtils/MY.pm", "type": "file" }, { - "bom-ref": "f52a8e2053ce609f", + "bom-ref": "9cc6c616c61fd49a", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker.pm", "type": "file" }, { - "bom-ref": "b03fd014a3819ec9", + "bom-ref": "c358fa10ebdc56d0", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker/Config.pm", "type": "file" }, { - "bom-ref": "e1b386739e36b807", + "bom-ref": "8f1c322ddf7649de", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker/FAQ.pod", "type": "file" }, { - "bom-ref": "d98afc6c4ed63874", + "bom-ref": "912cb95038cce3d1", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker/Locale.pm", "type": "file" }, { - "bom-ref": "b67dfe7843eb11eb", + "bom-ref": "e2f73d0bb0d8857e", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker/Tutorial.pod", "type": "file" }, { - "bom-ref": "544a6746b5f928ee", + "bom-ref": "5718a0414d931c37", "name": "/usr/share/perl/5.38.2/ExtUtils/MakeMaker/version.pm", "type": "file" }, { - "bom-ref": "63f45e560ff4f85d", + "bom-ref": "15481ec389a78f38", "name": "/usr/share/perl/5.38.2/ExtUtils/Manifest.pm", "type": "file" }, { - "bom-ref": "33cc69cb5fa28d89", + "bom-ref": "f2ab2eb374906474", "name": "/usr/share/perl/5.38.2/ExtUtils/Miniperl.pm", "type": "file" }, { - "bom-ref": "7b26132626b3e0d5", + "bom-ref": "5e8bf29428f7e610", "name": "/usr/share/perl/5.38.2/ExtUtils/Mkbootstrap.pm", "type": "file" }, { - "bom-ref": "83b51b6fd3150a9c", + "bom-ref": "771cdc49d668da19", "name": "/usr/share/perl/5.38.2/ExtUtils/Mksymlists.pm", "type": "file" }, { - "bom-ref": "ec065f9f64c29a26", + "bom-ref": "1a92f5f8e2233653", "name": "/usr/share/perl/5.38.2/ExtUtils/PL2Bat.pm", "type": "file" }, { - "bom-ref": "a62464799baa7cbf", + "bom-ref": "84a73e67b11fd502", "name": "/usr/share/perl/5.38.2/ExtUtils/Packlist.pm", "type": "file" }, { - "bom-ref": "80e88cccc88c5f5e", + "bom-ref": "e4cf6bca4b4d0953", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS.pm", "type": "file" }, { - "bom-ref": "cdb5c3c141baac5f", + "bom-ref": "485a44feedc56e46", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS.pod", "type": "file" }, { - "bom-ref": "b1d37858b479801e", + "bom-ref": "e2e6018d7b29b01f", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS/Constants.pm", "type": "file" }, { - "bom-ref": "57cde5854c9a00ae", + "bom-ref": "c4d2ea668db96af3", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS/CountLines.pm", "type": "file" }, { - "bom-ref": "3ab6c377bd6d6b37", + "bom-ref": "7cc6113b805b727a", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS/Eval.pm", "type": "file" }, { - "bom-ref": "b4d88106a2963ad3", + "bom-ref": "46fac47fc90882b2", "name": "/usr/share/perl/5.38.2/ExtUtils/ParseXS/Utilities.pm", "type": "file" }, { - "bom-ref": "39ffd402ca6e6ed4", + "bom-ref": "2b5a31c035154c0d", "name": "/usr/share/perl/5.38.2/ExtUtils/Typemaps.pm", "type": "file" }, { - "bom-ref": "b46941841cf02e8b", + "bom-ref": "a8b4b917673bf98a", "name": "/usr/share/perl/5.38.2/ExtUtils/Typemaps/Cmd.pm", "type": "file" }, { - "bom-ref": "197d64d5f755212e", + "bom-ref": "ee54084f07785057", "name": "/usr/share/perl/5.38.2/ExtUtils/Typemaps/InputMap.pm", "type": "file" }, { - "bom-ref": "cd8745513be42bda", + "bom-ref": "42bb09b8a74c022b", "name": "/usr/share/perl/5.38.2/ExtUtils/Typemaps/OutputMap.pm", "type": "file" }, { - "bom-ref": "641aa8a2d7d7a85f", + "bom-ref": "80ee93dd9e5157f2", "name": "/usr/share/perl/5.38.2/ExtUtils/Typemaps/Type.pm", "type": "file" }, { - "bom-ref": "462b06867ec7b4af", + "bom-ref": "9e812448264645f2", "name": "/usr/share/perl/5.38.2/ExtUtils/testlib.pm", "type": "file" }, { - "bom-ref": "3a5c476ff1968854", + "bom-ref": "f51725cc015e09f5", "name": "/usr/share/perl/5.38.2/ExtUtils/typemap", "type": "file" }, { - "bom-ref": "d7f02725ee3eaca4", + "bom-ref": "7fef617c38c45e6d", "name": "/usr/share/perl/5.38.2/ExtUtils/xsubpp", "type": "file" }, { - "bom-ref": "c79216db2e94ac9f", + "bom-ref": "ce79ae4b2e2f2412", "name": "/usr/share/perl/5.38.2/Fatal.pm", "type": "file" }, { - "bom-ref": "4b5069323711d7b9", + "bom-ref": "594e5cc9591de638", "name": "/usr/share/perl/5.38.2/File/Basename.pm", "type": "file" }, { - "bom-ref": "7074dc786def235c", + "bom-ref": "e034598f8304e8b9", "name": "/usr/share/perl/5.38.2/File/Compare.pm", "type": "file" }, { - "bom-ref": "b6f81d2a09cebae3", + "bom-ref": "2a0de2cf8878a2a2", "name": "/usr/share/perl/5.38.2/File/Copy.pm", "type": "file" }, { - "bom-ref": "2df604e08b501b86", + "bom-ref": "e77f5ba61b13b8fb", "name": "/usr/share/perl/5.38.2/File/Fetch.pm", "type": "file" }, { - "bom-ref": "7d192ef2d8c052ce", + "bom-ref": "84974bb4a0568cb3", "name": "/usr/share/perl/5.38.2/File/Find.pm", "type": "file" }, { - "bom-ref": "497512b5174a5d05", + "bom-ref": "177b554e9f6bc2c0", "name": "/usr/share/perl/5.38.2/File/GlobMapper.pm", "type": "file" }, { - "bom-ref": "306c8ad2802e0e36", + "bom-ref": "b19260b504c5046f", "name": "/usr/share/perl/5.38.2/File/Path.pm", "type": "file" }, { - "bom-ref": "6f87849ca03900e9", + "bom-ref": "028a59b853a39770", "name": "/usr/share/perl/5.38.2/File/Temp.pm", "type": "file" }, { - "bom-ref": "ac9a68843358ba62", + "bom-ref": "e6887dbadc50c22b", "name": "/usr/share/perl/5.38.2/File/stat.pm", "type": "file" }, { - "bom-ref": "18df6cf8b4d084d8", + "bom-ref": "a6b2f416493ce03d", "name": "/usr/share/perl/5.38.2/FileCache.pm", "type": "file" }, { - "bom-ref": "6379ceee1c6e59a3", + "bom-ref": "4a1676cfa0f0ffa6", "name": "/usr/share/perl/5.38.2/FileHandle.pm", "type": "file" }, { - "bom-ref": "5f725819298507ed", + "bom-ref": "10c18a8765cec178", "name": "/usr/share/perl/5.38.2/Filter/Simple.pm", "type": "file" }, { - "bom-ref": "bdd60ce1825af7c8", + "bom-ref": "b7f9dd3159088a35", "name": "/usr/share/perl/5.38.2/FindBin.pm", "type": "file" }, { - "bom-ref": "e4edad678dc2049b", + "bom-ref": "51c968d7afc365da", "name": "/usr/share/perl/5.38.2/Getopt/Long.pm", "type": "file" }, { - "bom-ref": "e48cca8781d6ae60", + "bom-ref": "6e776ae7f6c62825", "name": "/usr/share/perl/5.38.2/Getopt/Std.pm", "type": "file" }, { - "bom-ref": "bc024d5c9e17d82c", + "bom-ref": "21e741b7020331c1", "name": "/usr/share/perl/5.38.2/HTTP/Tiny.pm", "type": "file" }, { - "bom-ref": "85a942120439cd15", + "bom-ref": "4c99417f9e53f6cc", "name": "/usr/share/perl/5.38.2/I18N/Collate.pm", "type": "file" }, { - "bom-ref": "5e24980e84555579", + "bom-ref": "67068da02817c254", "name": "/usr/share/perl/5.38.2/I18N/LangTags.pm", "type": "file" }, { - "bom-ref": "6448225d94470c8e", + "bom-ref": "3d26e9044e6083cb", "name": "/usr/share/perl/5.38.2/I18N/LangTags/Detect.pm", "type": "file" }, { - "bom-ref": "ba150dd3cb554ddb", + "bom-ref": "b8e0635e8d762f56", "name": "/usr/share/perl/5.38.2/I18N/LangTags/List.pm", "type": "file" }, { - "bom-ref": "e160e76c02839de9", + "bom-ref": "48696eb077752460", "name": "/usr/share/perl/5.38.2/IO/Compress/Adapter/Bzip2.pm", "type": "file" }, { - "bom-ref": "5327e8a937e681d8", + "bom-ref": "8d5a61936f118a65", "name": "/usr/share/perl/5.38.2/IO/Compress/Adapter/Deflate.pm", "type": "file" }, { - "bom-ref": "b5be192e7884ba8d", + "bom-ref": "6ea17638df86fec4", "name": "/usr/share/perl/5.38.2/IO/Compress/Adapter/Identity.pm", "type": "file" }, { - "bom-ref": "4ebe94b3a052e6a4", + "bom-ref": "85364c9db41af659", "name": "/usr/share/perl/5.38.2/IO/Compress/Base.pm", "type": "file" }, { - "bom-ref": "9e28dced19b1b1ad", + "bom-ref": "6cf3aa067d8d2bdc", "name": "/usr/share/perl/5.38.2/IO/Compress/Base/Common.pm", "type": "file" }, { - "bom-ref": "edd9796f6787b250", + "bom-ref": "3165da020eb37a0d", "name": "/usr/share/perl/5.38.2/IO/Compress/Bzip2.pm", "type": "file" }, { - "bom-ref": "e24342966c97a580", + "bom-ref": "393e6bb5a2c7ed81", "name": "/usr/share/perl/5.38.2/IO/Compress/Deflate.pm", "type": "file" }, { - "bom-ref": "071bf05d2823236b", + "bom-ref": "c5bebce5c62f943a", "name": "/usr/share/perl/5.38.2/IO/Compress/FAQ.pod", "type": "file" }, { - "bom-ref": "b0057a4600c3f229", + "bom-ref": "59beb67df695ad74", "name": "/usr/share/perl/5.38.2/IO/Compress/Gzip.pm", "type": "file" }, { - "bom-ref": "d608be8d6e3b6d1d", + "bom-ref": "9d6298296e136ed0", "name": "/usr/share/perl/5.38.2/IO/Compress/Gzip/Constants.pm", "type": "file" }, { - "bom-ref": "c8b6463d419d1372", + "bom-ref": "7994aa096fc9269b", "name": "/usr/share/perl/5.38.2/IO/Compress/RawDeflate.pm", "type": "file" }, { - "bom-ref": "0df2ccbdb44eb288", + "bom-ref": "0fda47f270b8f549", "name": "/usr/share/perl/5.38.2/IO/Compress/Zip.pm", "type": "file" }, { - "bom-ref": "f7aa3c8a3b205d72", + "bom-ref": "a8aed83c498febd7", "name": "/usr/share/perl/5.38.2/IO/Compress/Zip/Constants.pm", "type": "file" }, { - "bom-ref": "1f69de722dc5e7db", + "bom-ref": "95bd49f2106afeee", "name": "/usr/share/perl/5.38.2/IO/Compress/Zlib/Constants.pm", "type": "file" }, { - "bom-ref": "e294be9502cdba5e", + "bom-ref": "2a33806307d7dfe3", "name": "/usr/share/perl/5.38.2/IO/Compress/Zlib/Extra.pm", "type": "file" }, { - "bom-ref": "ff127736d893213d", + "bom-ref": "08eeb95897af6cd4", "name": "/usr/share/perl/5.38.2/IO/Socket/IP.pm", "type": "file" }, { - "bom-ref": "6be4d68c2d6546e6", + "bom-ref": "3a57e383d007e797", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Adapter/Bunzip2.pm", "type": "file" }, { - "bom-ref": "ae904db313ddf67e", + "bom-ref": "1f33785eda781d77", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Adapter/Identity.pm", "type": "file" }, { - "bom-ref": "2ae18bca1e962ada", + "bom-ref": "22c89d3772b7b143", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Adapter/Inflate.pm", "type": "file" }, { - "bom-ref": "a84ed826d76ce9de", + "bom-ref": "0a61d6aa738a7603", "name": "/usr/share/perl/5.38.2/IO/Uncompress/AnyInflate.pm", "type": "file" }, { - "bom-ref": "57beefed0beed33e", + "bom-ref": "b1057ee6f8d1b84b", "name": "/usr/share/perl/5.38.2/IO/Uncompress/AnyUncompress.pm", "type": "file" }, { - "bom-ref": "4aed3e9090a189e6", + "bom-ref": "68c9cb1ed4ae2183", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Base.pm", "type": "file" }, { - "bom-ref": "c9104d241e5868d0", + "bom-ref": "873e670cd54ef749", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Bunzip2.pm", "type": "file" }, { - "bom-ref": "fa750c8869dba7cc", + "bom-ref": "1146d76e1114aeb9", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Gunzip.pm", "type": "file" }, { - "bom-ref": "c453461a3295d486", + "bom-ref": "08f9072e170eef3f", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Inflate.pm", "type": "file" }, { - "bom-ref": "2cd0e0958ca13e83", + "bom-ref": "7e06b686e828e2be", "name": "/usr/share/perl/5.38.2/IO/Uncompress/RawInflate.pm", "type": "file" }, { - "bom-ref": "643a22889a6fe06d", + "bom-ref": "d20be42d3ca9bee0", "name": "/usr/share/perl/5.38.2/IO/Uncompress/Unzip.pm", "type": "file" }, { - "bom-ref": "42cd7ab029593453", + "bom-ref": "a96a834cbe77f2f6", "name": "/usr/share/perl/5.38.2/IO/Zlib.pm", "type": "file" }, { - "bom-ref": "4f5a56c5b2e4e3ef", + "bom-ref": "2c5ef69be61ad1ca", "name": "/usr/share/perl/5.38.2/IPC/Cmd.pm", "type": "file" }, { - "bom-ref": "dea60c8fa05a20e0", + "bom-ref": "01cd8efe97e96865", "name": "/usr/share/perl/5.38.2/IPC/Open2.pm", "type": "file" }, { - "bom-ref": "0cd2a1eaa02f0d17", + "bom-ref": "802b20e186bfe0e2", "name": "/usr/share/perl/5.38.2/IPC/Open3.pm", "type": "file" }, { - "bom-ref": "acc6e468b1dd60bc", + "bom-ref": "682d813fd216fe81", "name": "/usr/share/perl/5.38.2/Internals.pod", "type": "file" }, { - "bom-ref": "4301f1e66760221c", + "bom-ref": "1a88c6a2872a9d65", "name": "/usr/share/perl/5.38.2/JSON/PP.pm", "type": "file" }, { - "bom-ref": "67713a3ed652162c", + "bom-ref": "2ad539c97aef638d", "name": "/usr/share/perl/5.38.2/JSON/PP/Boolean.pm", "type": "file" }, { - "bom-ref": "81e59818e2660426", + "bom-ref": "dede4a438fc6b517", "name": "/usr/share/perl/5.38.2/Locale/Maketext.pm", "type": "file" }, { - "bom-ref": "61b7b2d2ae78ae7d", + "bom-ref": "8a22b23560f5d29c", "name": "/usr/share/perl/5.38.2/Locale/Maketext.pod", "type": "file" }, { - "bom-ref": "9d80d0fb8ece244d", + "bom-ref": "d50fa3147be592d8", "name": "/usr/share/perl/5.38.2/Locale/Maketext/Cookbook.pod", "type": "file" }, { - "bom-ref": "0eb012a8d1085c77", + "bom-ref": "df93b52a68351b56", "name": "/usr/share/perl/5.38.2/Locale/Maketext/Guts.pm", "type": "file" }, { - "bom-ref": "6e5412b486d674da", + "bom-ref": "6dd2bd55039bee27", "name": "/usr/share/perl/5.38.2/Locale/Maketext/GutsLoader.pm", "type": "file" }, { - "bom-ref": "30c673f077da9c0d", + "bom-ref": "b691d105f19dee40", "name": "/usr/share/perl/5.38.2/Locale/Maketext/Simple.pm", "type": "file" }, { - "bom-ref": "af1a3bf800a069d5", + "bom-ref": "072d1252685cd5b4", "name": "/usr/share/perl/5.38.2/Locale/Maketext/TPJ13.pod", "type": "file" }, { - "bom-ref": "6eea806e665bbc34", + "bom-ref": "59ab4c7bec9325a1", "name": "/usr/share/perl/5.38.2/Math/BigFloat.pm", "type": "file" }, { - "bom-ref": "71c123f8aa1c95f1", + "bom-ref": "89251d1269b15e38", "name": "/usr/share/perl/5.38.2/Math/BigFloat/Trace.pm", "type": "file" }, { - "bom-ref": "d3fc733d633ddd8e", + "bom-ref": "380e41d013b38e53", "name": "/usr/share/perl/5.38.2/Math/BigInt.pm", "type": "file" }, { - "bom-ref": "57fb2f1923ced822", + "bom-ref": "8a74812833b44347", "name": "/usr/share/perl/5.38.2/Math/BigInt/Calc.pm", "type": "file" }, { - "bom-ref": "7afc2f27338ba01a", + "bom-ref": "b0c59bcb6cd95d47", "name": "/usr/share/perl/5.38.2/Math/BigInt/Lib.pm", "type": "file" }, { - "bom-ref": "e73797d8f0549bd9", + "bom-ref": "b902e8fac895a670", "name": "/usr/share/perl/5.38.2/Math/BigInt/Trace.pm", "type": "file" }, { - "bom-ref": "9b0fb158be45f980", + "bom-ref": "db31901fdf62ee39", "name": "/usr/share/perl/5.38.2/Math/BigRat.pm", "type": "file" }, { - "bom-ref": "6b3fb0b281be1075", + "bom-ref": "e0fb05c6af27b6f0", "name": "/usr/share/perl/5.38.2/Math/BigRat/Trace.pm", "type": "file" }, { - "bom-ref": "9f4f41c0eb098b35", + "bom-ref": "f376e03e95861e28", "name": "/usr/share/perl/5.38.2/Math/Complex.pm", "type": "file" }, { - "bom-ref": "c132ab34a0016fbd", + "bom-ref": "454df2fab16d5044", "name": "/usr/share/perl/5.38.2/Math/Trig.pm", "type": "file" }, { - "bom-ref": "93eb7c63e9968ff4", + "bom-ref": "bece022a543eb7b9", "name": "/usr/share/perl/5.38.2/Memoize.pm", "type": "file" }, { - "bom-ref": "5ad976110f2390b5", + "bom-ref": "3025bc1179f156cc", "name": "/usr/share/perl/5.38.2/Memoize/AnyDBM_File.pm", "type": "file" }, { - "bom-ref": "f5a6b758e41ee8a1", + "bom-ref": "1c8983375f58f7f0", "name": "/usr/share/perl/5.38.2/Memoize/Expire.pm", "type": "file" }, { - "bom-ref": "eb423adaa0e1e0f4", + "bom-ref": "b537bb16c8f59cfd", "name": "/usr/share/perl/5.38.2/Memoize/NDBM_File.pm", "type": "file" }, { - "bom-ref": "25bb90bc011e11f6", + "bom-ref": "6b92c7e5b58d2e37", "name": "/usr/share/perl/5.38.2/Memoize/SDBM_File.pm", "type": "file" }, { - "bom-ref": "18ef67306f8022d7", + "bom-ref": "317427d254b83952", "name": "/usr/share/perl/5.38.2/Memoize/Storable.pm", "type": "file" }, { - "bom-ref": "ac394967d2186414", + "bom-ref": "ed556d45bda36019", "name": "/usr/share/perl/5.38.2/Module/CoreList.pm", "type": "file" }, { - "bom-ref": "20afa7c5cc74bc3f", + "bom-ref": "13632113ba013e1a", "name": "/usr/share/perl/5.38.2/Module/CoreList.pod", "type": "file" }, { - "bom-ref": "7908097f04a34b72", + "bom-ref": "9aae741c2edc0aa3", "name": "/usr/share/perl/5.38.2/Module/CoreList/Utils.pm", "type": "file" }, { - "bom-ref": "facbba4a2f94a169", + "bom-ref": "f7592b4495b5c3b0", "name": "/usr/share/perl/5.38.2/Module/Load.pm", "type": "file" }, { - "bom-ref": "a9763a792b69d5b2", + "bom-ref": "0922dd25b3ef77a3", "name": "/usr/share/perl/5.38.2/Module/Load/Conditional.pm", "type": "file" }, { - "bom-ref": "340c79ebc996bb3c", + "bom-ref": "b33bc8198217e7c5", "name": "/usr/share/perl/5.38.2/Module/Loaded.pm", "type": "file" }, { - "bom-ref": "7f2a7cc5c597d812", + "bom-ref": "250f35a6f7a9b7a7", "name": "/usr/share/perl/5.38.2/Module/Metadata.pm", "type": "file" }, { - "bom-ref": "784068f128acb72b", + "bom-ref": "0e1461ba297d9a4a", "name": "/usr/share/perl/5.38.2/NEXT.pm", "type": "file" }, { - "bom-ref": "fa9730642ce2dad8", + "bom-ref": "fc7c5f427de32889", "name": "/usr/share/perl/5.38.2/Net/Cmd.pm", "type": "file" }, { - "bom-ref": "153bd4e8e28395b4", + "bom-ref": "d44313e82209d03d", "name": "/usr/share/perl/5.38.2/Net/Config.pm", "type": "file" }, { - "bom-ref": "aaf157849939b410", + "bom-ref": "8b807528cbef26bd", "name": "/usr/share/perl/5.38.2/Net/Domain.pm", "type": "file" }, { - "bom-ref": "e933bebdd2fdc909", + "bom-ref": "eccf0e44b7a56fb4", "name": "/usr/share/perl/5.38.2/Net/FTP.pm", "type": "file" }, { - "bom-ref": "6914e91a27e17eae", + "bom-ref": "9e61373b06e03943", "name": "/usr/share/perl/5.38.2/Net/FTP/A.pm", "type": "file" }, { - "bom-ref": "5729e7ca79c3050f", + "bom-ref": "e034d96637effe82", "name": "/usr/share/perl/5.38.2/Net/FTP/E.pm", "type": "file" }, { - "bom-ref": "93683ff39ad32afd", + "bom-ref": "d415c59d1a9be3f8", "name": "/usr/share/perl/5.38.2/Net/FTP/I.pm", "type": "file" }, { - "bom-ref": "5ecd8d5ce8bcd4c7", + "bom-ref": "f27d848f88f6d622", "name": "/usr/share/perl/5.38.2/Net/FTP/L.pm", "type": "file" }, { - "bom-ref": "ae0a9f42d0f86346", + "bom-ref": "c0c410569b0c5cff", "name": "/usr/share/perl/5.38.2/Net/FTP/dataconn.pm", "type": "file" }, { - "bom-ref": "03c3b15a08dd09d4", + "bom-ref": "f44d8c8ee2276b45", "name": "/usr/share/perl/5.38.2/Net/NNTP.pm", "type": "file" }, { - "bom-ref": "e34a254c424d3dc1", + "bom-ref": "723d9f786f3a6de4", "name": "/usr/share/perl/5.38.2/Net/Netrc.pm", "type": "file" }, { - "bom-ref": "977665dd42d0fe58", + "bom-ref": "e6f980cae8a52821", "name": "/usr/share/perl/5.38.2/Net/POP3.pm", "type": "file" }, { - "bom-ref": "22621e9acfb570f8", + "bom-ref": "c003bf89bce0af31", "name": "/usr/share/perl/5.38.2/Net/Ping.pm", "type": "file" }, { - "bom-ref": "756a5db0b56433b7", + "bom-ref": "95562fb5d321ef2e", "name": "/usr/share/perl/5.38.2/Net/SMTP.pm", "type": "file" }, { - "bom-ref": "15838008fc4ea122", + "bom-ref": "a393e74d2eba77f7", "name": "/usr/share/perl/5.38.2/Net/Time.pm", "type": "file" }, { - "bom-ref": "5e40a12515d82702", + "bom-ref": "377310fc977d4697", "name": "/usr/share/perl/5.38.2/Net/hostent.pm", "type": "file" }, { - "bom-ref": "a40d0c9811ffc889", + "bom-ref": "6b3bccdb640a9918", "name": "/usr/share/perl/5.38.2/Net/libnetFAQ.pod", "type": "file" }, { - "bom-ref": "85bca0f4f110310e", + "bom-ref": "369b186a975c2203", "name": "/usr/share/perl/5.38.2/Net/netent.pm", "type": "file" }, { - "bom-ref": "93c63b43cff1ac32", + "bom-ref": "16ee62b61a3daaf3", "name": "/usr/share/perl/5.38.2/Net/protoent.pm", "type": "file" }, { - "bom-ref": "b706170fc8f6aec0", + "bom-ref": "7108afa64d5b614d", "name": "/usr/share/perl/5.38.2/Net/servent.pm", "type": "file" }, { - "bom-ref": "566ccbc570d6f208", + "bom-ref": "fa32adc2c91619e9", "name": "/usr/share/perl/5.38.2/Params/Check.pm", "type": "file" }, { - "bom-ref": "b3c04beed73a1895", + "bom-ref": "5b7600923c0c7b40", "name": "/usr/share/perl/5.38.2/Parse/CPAN/Meta.pm", "type": "file" }, { - "bom-ref": "307ebd52bf065db6", + "bom-ref": "f11880756cef241b", "name": "/usr/share/perl/5.38.2/Perl/OSType.pm", "type": "file" }, { - "bom-ref": "7f341abaa4487540", + "bom-ref": "7733cc385e6982d1", "name": "/usr/share/perl/5.38.2/PerlIO.pm", "type": "file" }, { - "bom-ref": "588dc1b6ce28dfd5", + "bom-ref": "baad20eb09787090", "name": "/usr/share/perl/5.38.2/PerlIO/via/QuotedPrint.pm", "type": "file" }, { - "bom-ref": "4b8cfc579fd3e0fa", + "bom-ref": "2fe88cc2568d4be3", "name": "/usr/share/perl/5.38.2/Pod/Checker.pm", "type": "file" }, { - "bom-ref": "bb1d566d303f7f4a", + "bom-ref": "2461420be8a8657b", "name": "/usr/share/perl/5.38.2/Pod/Escapes.pm", "type": "file" }, { - "bom-ref": "835d04f9b755fe78", + "bom-ref": "4966671ffdaa15b1", "name": "/usr/share/perl/5.38.2/Pod/Functions.pm", "type": "file" }, { - "bom-ref": "03a28799d6f91597", + "bom-ref": "ca9757b854762892", "name": "/usr/share/perl/5.38.2/Pod/Html.pm", "type": "file" }, { - "bom-ref": "669f784e50eb2615", + "bom-ref": "87a7b10b4b9b2898", "name": "/usr/share/perl/5.38.2/Pod/Html/Util.pm", "type": "file" }, { - "bom-ref": "ea9e30d7336f4241", + "bom-ref": "222d96ac7770db90", "name": "/usr/share/perl/5.38.2/Pod/Man.pm", "type": "file" }, { - "bom-ref": "8d78a57f29085e14", + "bom-ref": "b3a02a70f39536a9", "name": "/usr/share/perl/5.38.2/Pod/ParseLink.pm", "type": "file" }, { - "bom-ref": "3e6bf0149c38f7b1", + "bom-ref": "d92b315882b87788", "name": "/usr/share/perl/5.38.2/Pod/Perldoc.pm", "type": "file" }, { - "bom-ref": "d5e674c544762b3c", + "bom-ref": "ed3fb0735bde8759", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/BaseTo.pm", "type": "file" }, { - "bom-ref": "9b171cb938d62a11", + "bom-ref": "43efb5c769d70eb0", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/GetOptsOO.pm", "type": "file" }, { - "bom-ref": "fc0453d7916d0a88", + "bom-ref": "0bac948ccc9122fd", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToANSI.pm", "type": "file" }, { - "bom-ref": "a6e51ff2233e3fdf", + "bom-ref": "15a4173e1f4ef606", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToChecker.pm", "type": "file" }, { - "bom-ref": "ed772861ab805d8a", + "bom-ref": "90a0c06fa3aea70b", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToMan.pm", "type": "file" }, { - "bom-ref": "6276bba4b13040d0", + "bom-ref": "93759b7860487c15", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToNroff.pm", "type": "file" }, { - "bom-ref": "d3a6993a8c9b07f7", + "bom-ref": "22dbc37ec449bb66", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToPod.pm", "type": "file" }, { - "bom-ref": "29cc11b119c343da", + "bom-ref": "66cfa68844a3cc13", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToRtf.pm", "type": "file" }, { - "bom-ref": "154eb32959217818", + "bom-ref": "77818a3e6e013bd9", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToTerm.pm", "type": "file" }, { - "bom-ref": "620ae38e6f752e6a", + "bom-ref": "1e17b0514a4b2d4f", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToText.pm", "type": "file" }, { - "bom-ref": "35f5912dffc04696", + "bom-ref": "c79f65412a747bbf", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToTk.pm", "type": "file" }, { - "bom-ref": "f46fcdb747eeab70", + "bom-ref": "1216544a76405aa5", "name": "/usr/share/perl/5.38.2/Pod/Perldoc/ToXml.pm", "type": "file" }, { - "bom-ref": "fb828f7458505a17", + "bom-ref": "61e55a3b8822e2d6", "name": "/usr/share/perl/5.38.2/Pod/Simple.pm", "type": "file" }, { - "bom-ref": "cc30b6132c9009ab", + "bom-ref": "fb41e0bbcca0a656", "name": "/usr/share/perl/5.38.2/Pod/Simple.pod", "type": "file" }, { - "bom-ref": "5100f5579789ea3f", + "bom-ref": "6eef07ca3715556e", "name": "/usr/share/perl/5.38.2/Pod/Simple/BlackBox.pm", "type": "file" }, { - "bom-ref": "b215ed41828af82f", + "bom-ref": "4f041d735ba3db1a", "name": "/usr/share/perl/5.38.2/Pod/Simple/Checker.pm", "type": "file" }, { - "bom-ref": "208dc0d5401ee77a", + "bom-ref": "98d0d1cd91d41293", "name": "/usr/share/perl/5.38.2/Pod/Simple/Debug.pm", "type": "file" }, { - "bom-ref": "aa1cc641afa59b4b", + "bom-ref": "69b00935e8c57702", "name": "/usr/share/perl/5.38.2/Pod/Simple/DumpAsText.pm", "type": "file" }, { - "bom-ref": "31ad1f1d777f47d7", + "bom-ref": "fba5e070179a702a", "name": "/usr/share/perl/5.38.2/Pod/Simple/DumpAsXML.pm", "type": "file" }, { - "bom-ref": "d0a26dfcd88e327f", + "bom-ref": "ab2f975d0fe3b942", "name": "/usr/share/perl/5.38.2/Pod/Simple/HTML.pm", "type": "file" }, { - "bom-ref": "bddda4e05fe8c583", + "bom-ref": "700e36e1eb3cca12", "name": "/usr/share/perl/5.38.2/Pod/Simple/HTMLBatch.pm", "type": "file" }, { - "bom-ref": "4f87d06864067549", + "bom-ref": "b1cb6963e8be18dc", "name": "/usr/share/perl/5.38.2/Pod/Simple/HTMLLegacy.pm", "type": "file" }, { - "bom-ref": "d7b767838537b79c", + "bom-ref": "25b88484611c2d99", "name": "/usr/share/perl/5.38.2/Pod/Simple/JustPod.pm", "type": "file" }, { - "bom-ref": "79b7615bcdd38869", + "bom-ref": "0c19035b26781504", "name": "/usr/share/perl/5.38.2/Pod/Simple/LinkSection.pm", "type": "file" }, { - "bom-ref": "3cf570bbafcd3480", + "bom-ref": "572707aee6eeb01d", "name": "/usr/share/perl/5.38.2/Pod/Simple/Methody.pm", "type": "file" }, { - "bom-ref": "9e2a1fbb06ea3b1d", + "bom-ref": "bfe0fa3ef6c5359c", "name": "/usr/share/perl/5.38.2/Pod/Simple/Progress.pm", "type": "file" }, { - "bom-ref": "78825070191bff05", + "bom-ref": "4e74be6ee081cd4c", "name": "/usr/share/perl/5.38.2/Pod/Simple/PullParser.pm", "type": "file" }, { - "bom-ref": "b76f9096f9b5aef8", + "bom-ref": "36e03f7dafba6af5", "name": "/usr/share/perl/5.38.2/Pod/Simple/PullParserEndToken.pm", "type": "file" }, { - "bom-ref": "c7bdba62ecd307c5", + "bom-ref": "902e5ce57b2d1808", "name": "/usr/share/perl/5.38.2/Pod/Simple/PullParserStartToken.pm", "type": "file" }, { - "bom-ref": "0a29fdbef78cbd2c", + "bom-ref": "3df40107ae561165", "name": "/usr/share/perl/5.38.2/Pod/Simple/PullParserTextToken.pm", "type": "file" }, { - "bom-ref": "c61306e6bb00b1e3", + "bom-ref": "361441e5e975d04e", "name": "/usr/share/perl/5.38.2/Pod/Simple/PullParserToken.pm", "type": "file" }, { - "bom-ref": "03c693cba4724137", + "bom-ref": "98c3eddd0c15d01a", "name": "/usr/share/perl/5.38.2/Pod/Simple/RTF.pm", "type": "file" }, { - "bom-ref": "b2ee2bddb9d91a31", + "bom-ref": "521d113faa038180", "name": "/usr/share/perl/5.38.2/Pod/Simple/Search.pm", "type": "file" }, { - "bom-ref": "c12b037eea56e371", + "bom-ref": "4c995f1c150b0af8", "name": "/usr/share/perl/5.38.2/Pod/Simple/SimpleTree.pm", "type": "file" }, { - "bom-ref": "f417f353e84b6306", + "bom-ref": "78ddbf2e25a9459b", "name": "/usr/share/perl/5.38.2/Pod/Simple/Subclassing.pod", "type": "file" }, { - "bom-ref": "b36245a7489d6440", + "bom-ref": "d668d223c2428891", "name": "/usr/share/perl/5.38.2/Pod/Simple/Text.pm", "type": "file" }, { - "bom-ref": "236565040cb9bb81", + "bom-ref": "515cee1a13736ed4", "name": "/usr/share/perl/5.38.2/Pod/Simple/TextContent.pm", "type": "file" }, { - "bom-ref": "4d118c4cb0e75762", + "bom-ref": "c978717c5b76457b", "name": "/usr/share/perl/5.38.2/Pod/Simple/TiedOutFH.pm", "type": "file" }, { - "bom-ref": "b3df2c9c3ed51f16", + "bom-ref": "0e609c03e18ac413", "name": "/usr/share/perl/5.38.2/Pod/Simple/Transcode.pm", "type": "file" }, { - "bom-ref": "3070526f45135a8a", + "bom-ref": "f840bc6ab73c8353", "name": "/usr/share/perl/5.38.2/Pod/Simple/TranscodeDumb.pm", "type": "file" }, { - "bom-ref": "8dadd782976ef85d", + "bom-ref": "d693ca8cf4cf295c", "name": "/usr/share/perl/5.38.2/Pod/Simple/TranscodeSmart.pm", "type": "file" }, { - "bom-ref": "27b19d5b1150c1cb", + "bom-ref": "07919fabbe2bcb3a", "name": "/usr/share/perl/5.38.2/Pod/Simple/XHTML.pm", "type": "file" }, { - "bom-ref": "f61d52c4b3b7bc6d", + "bom-ref": "ae4736897c9bdf84", "name": "/usr/share/perl/5.38.2/Pod/Simple/XMLOutStream.pm", "type": "file" }, { - "bom-ref": "217cb7aaa6f21066", + "bom-ref": "9c516762fcbc989f", "name": "/usr/share/perl/5.38.2/Pod/Text.pm", "type": "file" }, { - "bom-ref": "a5cc32049b2988fe", + "bom-ref": "9db97d5b9ea32d67", "name": "/usr/share/perl/5.38.2/Pod/Text/Color.pm", "type": "file" }, { - "bom-ref": "2337ded8b16978c1", + "bom-ref": "5682cf588ab8a448", "name": "/usr/share/perl/5.38.2/Pod/Text/Overstrike.pm", "type": "file" }, { - "bom-ref": "4b12eb34733d5d2d", + "bom-ref": "fad62c4ddbfba9f0", "name": "/usr/share/perl/5.38.2/Pod/Text/Termcap.pm", "type": "file" }, { - "bom-ref": "e8996abf894e2565", + "bom-ref": "8930b074ba6f6e80", "name": "/usr/share/perl/5.38.2/Pod/Usage.pm", "type": "file" }, { - "bom-ref": "9fda5b2d4db7fb3c", + "bom-ref": "1174152d27a5045d", "name": "/usr/share/perl/5.38.2/Safe.pm", "type": "file" }, { - "bom-ref": "09d40f4ad34abffa", + "bom-ref": "3aec014d8d1b437b", "name": "/usr/share/perl/5.38.2/Search/Dict.pm", "type": "file" }, { - "bom-ref": "711da5e91fec1197", + "bom-ref": "fc6621b0eb0e5e96", "name": "/usr/share/perl/5.38.2/SelectSaver.pm", "type": "file" }, { - "bom-ref": "b84a7b6159f42ea2", + "bom-ref": "16086ae3766ba8b7", "name": "/usr/share/perl/5.38.2/SelfLoader.pm", "type": "file" }, { - "bom-ref": "9403f761ea368b63", + "bom-ref": "cc0635eec941e566", "name": "/usr/share/perl/5.38.2/Symbol.pm", "type": "file" }, { - "bom-ref": "f91a124030e9eed5", + "bom-ref": "7239303756c4f4b0", "name": "/usr/share/perl/5.38.2/TAP/Base.pm", "type": "file" }, { - "bom-ref": "1a644946b39e9ccf", + "bom-ref": "7f1c81156e55d952", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Base.pm", "type": "file" }, { - "bom-ref": "eeeff321cbfaa575", + "bom-ref": "67e2916e602cdf38", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Color.pm", "type": "file" }, { - "bom-ref": "cdb7a9e27e99a374", + "bom-ref": "d91347343cabd911", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Console.pm", "type": "file" }, { - "bom-ref": "2f031c4040751ac0", + "bom-ref": "4d5071bb3611c825", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Console/ParallelSession.pm", "type": "file" }, { - "bom-ref": "06bc46517392b882", + "bom-ref": "45bb552265269f0b", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Console/Session.pm", "type": "file" }, { - "bom-ref": "6a93ae0a2f85d6b8", + "bom-ref": "34d020696deb89b1", "name": "/usr/share/perl/5.38.2/TAP/Formatter/File.pm", "type": "file" }, { - "bom-ref": "a66a896655ca2a96", + "bom-ref": "40298c01b2822657", "name": "/usr/share/perl/5.38.2/TAP/Formatter/File/Session.pm", "type": "file" }, { - "bom-ref": "16fe2b7a6b39173d", + "bom-ref": "aa52aa9f22a47464", "name": "/usr/share/perl/5.38.2/TAP/Formatter/Session.pm", "type": "file" }, { - "bom-ref": "b744e5cd4e3768fc", + "bom-ref": "4bfb11b642fb4c05", "name": "/usr/share/perl/5.38.2/TAP/Harness.pm", "type": "file" }, { - "bom-ref": "947183e37a5faf8a", + "bom-ref": "9ea60ddee8812b6f", "name": "/usr/share/perl/5.38.2/TAP/Harness/Beyond.pod", "type": "file" }, { - "bom-ref": "6e920362ee61c312", + "bom-ref": "bee6725fae35b3d3", "name": "/usr/share/perl/5.38.2/TAP/Harness/Env.pm", "type": "file" }, { - "bom-ref": "7d88025b4a3f1119", + "bom-ref": "bb641871a4c2aa8c", "name": "/usr/share/perl/5.38.2/TAP/Object.pm", "type": "file" }, { - "bom-ref": "41f0a27abdcbdc82", + "bom-ref": "e85f67c6ec53eae3", "name": "/usr/share/perl/5.38.2/TAP/Parser.pm", "type": "file" }, { - "bom-ref": "65e78cb7781d675d", + "bom-ref": "294476f043e90338", "name": "/usr/share/perl/5.38.2/TAP/Parser/Aggregator.pm", "type": "file" }, { - "bom-ref": "e9a7f40c0551751d", + "bom-ref": "4a61fceea6721548", "name": "/usr/share/perl/5.38.2/TAP/Parser/Grammar.pm", "type": "file" }, { - "bom-ref": "590e33951f8db1ed", + "bom-ref": "2cff4cd2e2e5c34c", "name": "/usr/share/perl/5.38.2/TAP/Parser/Iterator.pm", "type": "file" }, { - "bom-ref": "2456fffa313d8a72", + "bom-ref": "165c250250fe8633", "name": "/usr/share/perl/5.38.2/TAP/Parser/Iterator/Array.pm", "type": "file" }, { - "bom-ref": "d1cedbc04f4d2adf", + "bom-ref": "53cbd34c7239d446", "name": "/usr/share/perl/5.38.2/TAP/Parser/Iterator/Process.pm", "type": "file" }, { - "bom-ref": "319407b30a964ddd", + "bom-ref": "3eb1dfc7bf703a90", "name": "/usr/share/perl/5.38.2/TAP/Parser/Iterator/Stream.pm", "type": "file" }, { - "bom-ref": "9cb7ff8df5f740b5", + "bom-ref": "461800ececa14b44", "name": "/usr/share/perl/5.38.2/TAP/Parser/IteratorFactory.pm", "type": "file" }, { - "bom-ref": "dd903c4128b2e278", + "bom-ref": "00c2cc6c24e33db9", "name": "/usr/share/perl/5.38.2/TAP/Parser/Multiplexer.pm", "type": "file" }, { - "bom-ref": "b5df5125e93a1eaa", + "bom-ref": "fac3d1e677707fdf", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result.pm", "type": "file" }, { - "bom-ref": "ff40046fd5b47e2e", + "bom-ref": "9bf732ee491c4a7b", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Bailout.pm", "type": "file" }, { - "bom-ref": "a95b876461f1a242", + "bom-ref": "13637c3517eacf43", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Comment.pm", "type": "file" }, { - "bom-ref": "9f21b6038d9d8cb1", + "bom-ref": "8ba5aaa7ce11a10c", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Plan.pm", "type": "file" }, { - "bom-ref": "b4a49202348a704f", + "bom-ref": "5c74c12bd2272ac6", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Pragma.pm", "type": "file" }, { - "bom-ref": "e73ed818ba89bdc3", + "bom-ref": "b415b9a66e42c702", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Test.pm", "type": "file" }, { - "bom-ref": "b12a59cd1e0e472f", + "bom-ref": "d4f2d5b346945c6e", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Unknown.pm", "type": "file" }, { - "bom-ref": "afebcd6f98a5427c", + "bom-ref": "8fb8aa67ce906e55", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/Version.pm", "type": "file" }, { - "bom-ref": "85825ae6f7172e3a", + "bom-ref": "e26838b25e527307", "name": "/usr/share/perl/5.38.2/TAP/Parser/Result/YAML.pm", "type": "file" }, { - "bom-ref": "8576a1604c0843fb", + "bom-ref": "85a64c498c1fa042", "name": "/usr/share/perl/5.38.2/TAP/Parser/ResultFactory.pm", "type": "file" }, { - "bom-ref": "86bf975ebbe6ff32", + "bom-ref": "102496aef11dc5ab", "name": "/usr/share/perl/5.38.2/TAP/Parser/Scheduler.pm", "type": "file" }, { - "bom-ref": "bfacb327019add6d", + "bom-ref": "e728e5673a90327c", "name": "/usr/share/perl/5.38.2/TAP/Parser/Scheduler/Job.pm", "type": "file" }, { - "bom-ref": "fbdb33aab7e0f884", + "bom-ref": "cc22496dc68b7da5", "name": "/usr/share/perl/5.38.2/TAP/Parser/Scheduler/Spinner.pm", "type": "file" }, { - "bom-ref": "301992a8814d783b", + "bom-ref": "ae6247df8ddd149e", "name": "/usr/share/perl/5.38.2/TAP/Parser/Source.pm", "type": "file" }, { - "bom-ref": "957e44ed2baac44b", + "bom-ref": "0f5b5e60a545023a", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler.pm", "type": "file" }, { - "bom-ref": "bfb7daf6c4a9467d", + "bom-ref": "9a2bb84485d9eba4", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler/Executable.pm", "type": "file" }, { - "bom-ref": "7fdd2648d97023ed", + "bom-ref": "75da9dd4f3b18368", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler/File.pm", "type": "file" }, { - "bom-ref": "934df6b7e08ccf1e", + "bom-ref": "86d5c815554586bb", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler/Handle.pm", "type": "file" }, { - "bom-ref": "6319fb180c7fb8a4", + "bom-ref": "a6568daa00e8732d", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler/Perl.pm", "type": "file" }, { - "bom-ref": "a7890b87a761e56d", + "bom-ref": "e389e4aba4fa3c00", "name": "/usr/share/perl/5.38.2/TAP/Parser/SourceHandler/RawTAP.pm", "type": "file" }, { - "bom-ref": "0824871e29a978b5", + "bom-ref": "5a84cd5101e7de88", "name": "/usr/share/perl/5.38.2/TAP/Parser/YAMLish/Reader.pm", "type": "file" }, { - "bom-ref": "d5016fb436f15f6b", + "bom-ref": "c285f7399162342e", "name": "/usr/share/perl/5.38.2/TAP/Parser/YAMLish/Writer.pm", "type": "file" }, { - "bom-ref": "f931148e463ddf93", + "bom-ref": "07abfaa36114ac82", "name": "/usr/share/perl/5.38.2/Term/ANSIColor.pm", "type": "file" }, { - "bom-ref": "82dabfdba7f23635", + "bom-ref": "63dba74e2a89a11c", "name": "/usr/share/perl/5.38.2/Term/Cap.pm", "type": "file" }, { - "bom-ref": "70e7f7d3b7bb425b", + "bom-ref": "b62d73652791969e", "name": "/usr/share/perl/5.38.2/Term/Complete.pm", "type": "file" }, { - "bom-ref": "b55eacafde0fcb32", + "bom-ref": "ee47a14cfa52e427", "name": "/usr/share/perl/5.38.2/Term/ReadLine.pm", "type": "file" }, { - "bom-ref": "53c1a5a597fad600", + "bom-ref": "a116b26348cc32f1", "name": "/usr/share/perl/5.38.2/Test.pm", "type": "file" }, { - "bom-ref": "956d5f72f8ab6245", + "bom-ref": "e6899cb37782d938", "name": "/usr/share/perl/5.38.2/Test/Builder.pm", "type": "file" }, { - "bom-ref": "002fc7500cdc9905", + "bom-ref": "af5f125005dfcb34", "name": "/usr/share/perl/5.38.2/Test/Builder/Formatter.pm", "type": "file" }, { - "bom-ref": "21bfd342d21cac58", + "bom-ref": "a785f1ac7f0aaa3d", "name": "/usr/share/perl/5.38.2/Test/Builder/IO/Scalar.pm", "type": "file" }, { - "bom-ref": "bbb647dc80f1e04a", + "bom-ref": "5cbe4f532a1ff9d7", "name": "/usr/share/perl/5.38.2/Test/Builder/Module.pm", "type": "file" }, { - "bom-ref": "8b42f6011b4a2066", + "bom-ref": "97f3bfa6c451816b", "name": "/usr/share/perl/5.38.2/Test/Builder/Tester.pm", "type": "file" }, { - "bom-ref": "2f2376af43384907", + "bom-ref": "a2367836a4a45eb2", "name": "/usr/share/perl/5.38.2/Test/Builder/Tester/Color.pm", "type": "file" }, { - "bom-ref": "f7084498af90eb99", + "bom-ref": "e7c18a25ff0dc2d0", "name": "/usr/share/perl/5.38.2/Test/Builder/TodoDiag.pm", "type": "file" }, { - "bom-ref": "fe11dea19cfe98ce", + "bom-ref": "e722ca8821d703df", "name": "/usr/share/perl/5.38.2/Test/Harness.pm", "type": "file" }, { - "bom-ref": "ee67e06f4c150f3c", + "bom-ref": "428dc3ba6f194105", "name": "/usr/share/perl/5.38.2/Test/More.pm", "type": "file" }, { - "bom-ref": "152cbd38166f9bd5", + "bom-ref": "8f93db8c61aa1220", "name": "/usr/share/perl/5.38.2/Test/Simple.pm", "type": "file" }, { - "bom-ref": "06ad5e0b93c43faf", + "bom-ref": "5f33d46190721436", "name": "/usr/share/perl/5.38.2/Test/Tester.pm", "type": "file" }, { - "bom-ref": "b8f2059faa2bf4c0", + "bom-ref": "8a8f2f15b311648d", "name": "/usr/share/perl/5.38.2/Test/Tester/Capture.pm", "type": "file" }, { - "bom-ref": "f8082545ec2d8251", + "bom-ref": "179fab5e48015164", "name": "/usr/share/perl/5.38.2/Test/Tester/CaptureRunner.pm", "type": "file" }, { - "bom-ref": "195ffbd6d24acb24", + "bom-ref": "fe5944c5bd563c8d", "name": "/usr/share/perl/5.38.2/Test/Tester/Delegate.pm", "type": "file" }, { - "bom-ref": "51d32b9d1f0bddca", + "bom-ref": "95d9411d4bc520ff", "name": "/usr/share/perl/5.38.2/Test/Tutorial.pod", "type": "file" }, { - "bom-ref": "6cfc5f760b2bf64c", + "bom-ref": "0adb12636fd38f55", "name": "/usr/share/perl/5.38.2/Test/use/ok.pm", "type": "file" }, { - "bom-ref": "df6e66543e751c11", + "bom-ref": "55928b8fd4811078", "name": "/usr/share/perl/5.38.2/Test2.pm", "type": "file" }, { - "bom-ref": "8ff82e8c0cbc5780", + "bom-ref": "304821dd49937c61", "name": "/usr/share/perl/5.38.2/Test2/API.pm", "type": "file" }, { - "bom-ref": "d330cdd522ede02b", + "bom-ref": "d201e196a17742b6", "name": "/usr/share/perl/5.38.2/Test2/API/Breakage.pm", "type": "file" }, { - "bom-ref": "086464835c50d740", + "bom-ref": "f55f55ef8bd6eea5", "name": "/usr/share/perl/5.38.2/Test2/API/Context.pm", "type": "file" }, { - "bom-ref": "05d263bf766d25cb", + "bom-ref": "a798247d05f20786", "name": "/usr/share/perl/5.38.2/Test2/API/Instance.pm", "type": "file" }, { - "bom-ref": "055087af0b5800c9", + "bom-ref": "15ff484614ba0444", "name": "/usr/share/perl/5.38.2/Test2/API/InterceptResult.pm", "type": "file" }, { - "bom-ref": "b60ccf486b97d403", + "bom-ref": "0c81026be9c75a5e", "name": "/usr/share/perl/5.38.2/Test2/API/InterceptResult/Event.pm", "type": "file" }, { - "bom-ref": "30f4c683421a39a6", + "bom-ref": "2adb73f87358133f", "name": "/usr/share/perl/5.38.2/Test2/API/InterceptResult/Facet.pm", "type": "file" }, { - "bom-ref": "084abd1c4fe5e436", + "bom-ref": "181366dd0acb8993", "name": "/usr/share/perl/5.38.2/Test2/API/InterceptResult/Hub.pm", "type": "file" }, { - "bom-ref": "48b4313455857e18", + "bom-ref": "b34873a346b0f78d", "name": "/usr/share/perl/5.38.2/Test2/API/InterceptResult/Squasher.pm", "type": "file" }, { - "bom-ref": "5b31fc0006a5995e", + "bom-ref": "5c030f9370ba1afb", "name": "/usr/share/perl/5.38.2/Test2/API/Stack.pm", "type": "file" }, { - "bom-ref": "47d350f8b9505c39", + "bom-ref": "3fb58fb335c2c314", "name": "/usr/share/perl/5.38.2/Test2/Event.pm", "type": "file" }, { - "bom-ref": "fb90c8153cfbcca5", + "bom-ref": "4b23b37b91161154", "name": "/usr/share/perl/5.38.2/Test2/Event/Bail.pm", "type": "file" }, { - "bom-ref": "3d129577a1a12e6d", + "bom-ref": "d9c3a0123c9e844c", "name": "/usr/share/perl/5.38.2/Test2/Event/Diag.pm", "type": "file" }, { - "bom-ref": "1e984eb8badc725c", + "bom-ref": "06a86dc04e4654f5", "name": "/usr/share/perl/5.38.2/Test2/Event/Encoding.pm", "type": "file" }, { - "bom-ref": "18562be43614ea37", + "bom-ref": "49eff1f29dcc0bce", "name": "/usr/share/perl/5.38.2/Test2/Event/Exception.pm", "type": "file" }, { - "bom-ref": "4b97ed4a4f362a95", + "bom-ref": "0f3f5fdd22167eec", "name": "/usr/share/perl/5.38.2/Test2/Event/Fail.pm", "type": "file" }, { - "bom-ref": "a4784dc93584d2bf", + "bom-ref": "6967552943815e7a", "name": "/usr/share/perl/5.38.2/Test2/Event/Generic.pm", "type": "file" }, { - "bom-ref": "c87eb721acefea3c", + "bom-ref": "a57b8d6ee69bd231", "name": "/usr/share/perl/5.38.2/Test2/Event/Note.pm", "type": "file" }, { - "bom-ref": "57963d173321debb", + "bom-ref": "34de5162744822ee", "name": "/usr/share/perl/5.38.2/Test2/Event/Ok.pm", "type": "file" }, { - "bom-ref": "6d3a059205255cf8", + "bom-ref": "77920d6709e206f9", "name": "/usr/share/perl/5.38.2/Test2/Event/Pass.pm", "type": "file" }, { - "bom-ref": "1c7593d56550d1cc", + "bom-ref": "a064061e75a9d335", "name": "/usr/share/perl/5.38.2/Test2/Event/Plan.pm", "type": "file" }, { - "bom-ref": "ecca3333af969a65", + "bom-ref": "bc32d211d88e28bc", "name": "/usr/share/perl/5.38.2/Test2/Event/Skip.pm", "type": "file" }, { - "bom-ref": "5f41748c2444e786", + "bom-ref": "612f71cf3118bc9f", "name": "/usr/share/perl/5.38.2/Test2/Event/Subtest.pm", "type": "file" }, { - "bom-ref": "a3e7d40f8863fb32", + "bom-ref": "6b67c761f9bca563", "name": "/usr/share/perl/5.38.2/Test2/Event/TAP/Version.pm", "type": "file" }, { - "bom-ref": "d2f6a6013147f75e", + "bom-ref": "fd2330b7453dc01b", "name": "/usr/share/perl/5.38.2/Test2/Event/V2.pm", "type": "file" }, { - "bom-ref": "b8b118a025b35c0e", + "bom-ref": "b4a2c3e6869d899b", "name": "/usr/share/perl/5.38.2/Test2/Event/Waiting.pm", "type": "file" }, { - "bom-ref": "8e3b2cacb50f8b0d", + "bom-ref": "79688a4f997f9888", "name": "/usr/share/perl/5.38.2/Test2/EventFacet.pm", "type": "file" }, { - "bom-ref": "037680e596c7b0ad", + "bom-ref": "9e3f942a7a53c8d8", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/About.pm", "type": "file" }, { - "bom-ref": "d6990c3dc70dd528", + "bom-ref": "2fa2486abbcb29b9", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Amnesty.pm", "type": "file" }, { - "bom-ref": "c8bb740bc60496f6", + "bom-ref": "996a5c98af60acdf", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Assert.pm", "type": "file" }, { - "bom-ref": "81b7ebc3abf7e6ab", + "bom-ref": "ff5ee32fc781340a", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Control.pm", "type": "file" }, { - "bom-ref": "a26ed802521a0a06", + "bom-ref": "d1dad53e20a45a5b", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Error.pm", "type": "file" }, { - "bom-ref": "58466187b11256a3", + "bom-ref": "a06c9de2c4620666", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Hub.pm", "type": "file" }, { - "bom-ref": "a3edb4c355c7519f", + "bom-ref": "008da8858bede87a", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Info.pm", "type": "file" }, { - "bom-ref": "866127e697000d29", + "bom-ref": "db54888ae5af2cb0", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Info/Table.pm", "type": "file" }, { - "bom-ref": "85150d13b8b11fa1", + "bom-ref": "b43651c435a83af4", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Meta.pm", "type": "file" }, { - "bom-ref": "e569bbe0c6bbcbae", + "bom-ref": "285239fe992ffbd3", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Parent.pm", "type": "file" }, { - "bom-ref": "35a4ba3e435f33da", + "bom-ref": "9b61e27f27ff77b3", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Plan.pm", "type": "file" }, { - "bom-ref": "1a0eef20d7c28d8c", + "bom-ref": "fb6f991a9ce31945", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Render.pm", "type": "file" }, { - "bom-ref": "29d2551471dc290e", + "bom-ref": "df06dbb55c91fd17", "name": "/usr/share/perl/5.38.2/Test2/EventFacet/Trace.pm", "type": "file" }, { - "bom-ref": "7abe3b1cb2bd8ba3", + "bom-ref": "270a4b62fdb92a9a", "name": "/usr/share/perl/5.38.2/Test2/Formatter.pm", "type": "file" }, { - "bom-ref": "de0416f31734b6c4", + "bom-ref": "e8b3e5e839318ac1", "name": "/usr/share/perl/5.38.2/Test2/Formatter/TAP.pm", "type": "file" }, { - "bom-ref": "a955055ff7d099c5", + "bom-ref": "615a96583fe5082c", "name": "/usr/share/perl/5.38.2/Test2/Hub.pm", "type": "file" }, { - "bom-ref": "35b55eb959edb9fe", + "bom-ref": "bbd35a7667eee74f", "name": "/usr/share/perl/5.38.2/Test2/Hub/Interceptor.pm", "type": "file" }, { - "bom-ref": "1b2276fa68e0be07", + "bom-ref": "16b2ed3ec3d4e456", "name": "/usr/share/perl/5.38.2/Test2/Hub/Interceptor/Terminator.pm", "type": "file" }, { - "bom-ref": "3b3dae2986639a8d", + "bom-ref": "c3e0521ea57cbe68", "name": "/usr/share/perl/5.38.2/Test2/Hub/Subtest.pm", "type": "file" }, { - "bom-ref": "7e23f174ee6ffe1a", + "bom-ref": "6664f382d21f92ff", "name": "/usr/share/perl/5.38.2/Test2/IPC.pm", "type": "file" }, { - "bom-ref": "2d17a1ff2d0706e6", + "bom-ref": "c0f001e6cedbabaf", "name": "/usr/share/perl/5.38.2/Test2/IPC/Driver.pm", "type": "file" }, { - "bom-ref": "8ce82dafdbaa2289", + "bom-ref": "601663b10da3cf4c", "name": "/usr/share/perl/5.38.2/Test2/IPC/Driver/Files.pm", "type": "file" }, { - "bom-ref": "a609e52149400f00", + "bom-ref": "6cfe811513aa9549", "name": "/usr/share/perl/5.38.2/Test2/Tools/Tiny.pm", "type": "file" }, { - "bom-ref": "1a83aa31dd04b1b1", + "bom-ref": "4d384f12b2284dd4", "name": "/usr/share/perl/5.38.2/Test2/Transition.pod", "type": "file" }, { - "bom-ref": "77a425f03532f35e", + "bom-ref": "9b879cf81bc59a93", "name": "/usr/share/perl/5.38.2/Test2/Util.pm", "type": "file" }, { - "bom-ref": "df4841f6ea9cd240", + "bom-ref": "75992c9060ca9d99", "name": "/usr/share/perl/5.38.2/Test2/Util/ExternalMeta.pm", "type": "file" }, { - "bom-ref": "8be13103d589f231", + "bom-ref": "9fb71cdc18bb031c", "name": "/usr/share/perl/5.38.2/Test2/Util/Facets2Legacy.pm", "type": "file" }, { - "bom-ref": "baf135a986c2180a", + "bom-ref": "03dbf01037b834df", "name": "/usr/share/perl/5.38.2/Test2/Util/HashBase.pm", "type": "file" }, { - "bom-ref": "047d7fb2dcd2d53d", + "bom-ref": "790050338a4bd0d0", "name": "/usr/share/perl/5.38.2/Test2/Util/Trace.pm", "type": "file" }, { - "bom-ref": "8fab529f176876fc", + "bom-ref": "b3ddb6117c7767b9", "name": "/usr/share/perl/5.38.2/Text/Abbrev.pm", "type": "file" }, { - "bom-ref": "9f830fd454030519", + "bom-ref": "5a5e9f39bd50573c", "name": "/usr/share/perl/5.38.2/Text/Balanced.pm", "type": "file" }, { - "bom-ref": "2ad82658486f55ff", + "bom-ref": "269cf1bfc367f1c6", "name": "/usr/share/perl/5.38.2/Text/ParseWords.pm", "type": "file" }, { - "bom-ref": "2158ffa12ac36b97", + "bom-ref": "6a5140770604555a", "name": "/usr/share/perl/5.38.2/Text/Tabs.pm", "type": "file" }, { - "bom-ref": "ad79facc0ea064a3", + "bom-ref": "30eafdeed825cae6", "name": "/usr/share/perl/5.38.2/Text/Wrap.pm", "type": "file" }, { - "bom-ref": "1cf419cd74dd5651", + "bom-ref": "c6c24e6dec533330", "name": "/usr/share/perl/5.38.2/Thread.pm", "type": "file" }, { - "bom-ref": "28c12fc3c77f33b4", + "bom-ref": "a2071739a4cf6399", "name": "/usr/share/perl/5.38.2/Thread/Queue.pm", "type": "file" }, { - "bom-ref": "95d20cd44ee2ee13", + "bom-ref": "6b08c8dd3fff712e", "name": "/usr/share/perl/5.38.2/Thread/Semaphore.pm", "type": "file" }, { - "bom-ref": "350b823da3335814", + "bom-ref": "b987b0af4cbb10a1", "name": "/usr/share/perl/5.38.2/Tie/Array.pm", "type": "file" }, { - "bom-ref": "5da5ae01b2259594", + "bom-ref": "eb0cfc549c441e95", "name": "/usr/share/perl/5.38.2/Tie/File.pm", "type": "file" }, { - "bom-ref": "adfc49ec7eeb408e", + "bom-ref": "4736119c4673d103", "name": "/usr/share/perl/5.38.2/Tie/Handle.pm", "type": "file" }, { - "bom-ref": "3d08dd32771ed964", + "bom-ref": "a1ba9084e8ff63e5", "name": "/usr/share/perl/5.38.2/Tie/Hash.pm", "type": "file" }, { - "bom-ref": "8917d9c2ba5e463d", + "bom-ref": "3faec35b9dbe34dc", "name": "/usr/share/perl/5.38.2/Tie/Hash/NamedCapture.pm", "type": "file" }, { - "bom-ref": "b8af720b4f40fef3", + "bom-ref": "fc367965692646e6", "name": "/usr/share/perl/5.38.2/Tie/Memoize.pm", "type": "file" }, { - "bom-ref": "aa5b5b4df8b99ed9", + "bom-ref": "368e003388811ca8", "name": "/usr/share/perl/5.38.2/Tie/RefHash.pm", "type": "file" }, { - "bom-ref": "03e57c7a6082161b", + "bom-ref": "b70c7fe36d61158a", "name": "/usr/share/perl/5.38.2/Tie/Scalar.pm", "type": "file" }, { - "bom-ref": "4aa2a85a76d8a281", + "bom-ref": "eedca59699e41134", "name": "/usr/share/perl/5.38.2/Tie/StdHandle.pm", "type": "file" }, { - "bom-ref": "2cf97992ef6f66d6", + "bom-ref": "78f99411d95445d3", "name": "/usr/share/perl/5.38.2/Tie/SubstrHash.pm", "type": "file" }, { - "bom-ref": "05e18719bdcbf374", + "bom-ref": "b8cecd5d39d59761", "name": "/usr/share/perl/5.38.2/Time/Local.pm", "type": "file" }, { - "bom-ref": "5159d363b8195444", + "bom-ref": "3ab920310463fbd1", "name": "/usr/share/perl/5.38.2/Time/gmtime.pm", "type": "file" }, { - "bom-ref": "66f492398245a9a9", + "bom-ref": "8159aa869f70d33c", "name": "/usr/share/perl/5.38.2/Time/localtime.pm", "type": "file" }, { - "bom-ref": "4b3c54fd0bbd71e2", + "bom-ref": "d48066609ba7b213", "name": "/usr/share/perl/5.38.2/Time/tm.pm", "type": "file" }, { - "bom-ref": "c94dd2c40af32fbe", + "bom-ref": "f4e1e50f168bdc43", "name": "/usr/share/perl/5.38.2/UNIVERSAL.pm", "type": "file" }, { - "bom-ref": "721d759a89477eca", + "bom-ref": "f55ef87aae0fd767", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/Big5.pm", "type": "file" }, { - "bom-ref": "5e801cc1d14d6ddf", + "bom-ref": "1d7916e6c135161a", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/GB2312.pm", "type": "file" }, { - "bom-ref": "a2a9752ecc629dbe", + "bom-ref": "e1e2747471354917", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/JISX0208.pm", "type": "file" }, { - "bom-ref": "a2997acc56996ce5", + "bom-ref": "d8ddc3c322843b7c", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/Korean.pm", "type": "file" }, { - "bom-ref": "9a0b99f0acd111f3", + "bom-ref": "6ae6af81e09fcd4a", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/Pinyin.pm", "type": "file" }, { - "bom-ref": "15743a0c8e11df92", + "bom-ref": "00e0e7ff605ba24b", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/Stroke.pm", "type": "file" }, { - "bom-ref": "efb321a7d9d5495e", + "bom-ref": "48262d9916465a5f", "name": "/usr/share/perl/5.38.2/Unicode/Collate/CJK/Zhuyin.pm", "type": "file" }, { - "bom-ref": "8cbf6b1d30dd2288", + "bom-ref": "7d6a4b9f3aec9821", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/af.pl", "type": "file" }, { - "bom-ref": "1d8cfb6e7376f51b", + "bom-ref": "27f2522e2bd3f0b6", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ar.pl", "type": "file" }, { - "bom-ref": "e7e57149bf03c43d", + "bom-ref": "e7d64a194c5321dc", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/as.pl", "type": "file" }, { - "bom-ref": "6637e9f29f358a74", + "bom-ref": "ec1e85d872f7b0dd", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/az.pl", "type": "file" }, { - "bom-ref": "10fe8c0a80b0f5aa", + "bom-ref": "033d91a751175ab3", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/be.pl", "type": "file" }, { - "bom-ref": "d86918494e73ed21", + "bom-ref": "a0603e7550720000", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/bn.pl", "type": "file" }, { - "bom-ref": "c872964a56ad03ed", + "bom-ref": "c0e71229a20a564c", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ca.pl", "type": "file" }, { - "bom-ref": "253620d3240367d5", + "bom-ref": "7ba5d8dbaf9f861c", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/cs.pl", "type": "file" }, { - "bom-ref": "5e56b22c91f6cdf1", + "bom-ref": "34b7348dac9277a4", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/cu.pl", "type": "file" }, { - "bom-ref": "daeecd8f933d1f04", + "bom-ref": "787b72561faea161", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/cy.pl", "type": "file" }, { - "bom-ref": "21d3f3cf49cc530b", + "bom-ref": "c8733e97ba25fb42", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/da.pl", "type": "file" }, { - "bom-ref": "af058cbf383577ff", + "bom-ref": "24f32cab5d881866", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/de_at_ph.pl", "type": "file" }, { - "bom-ref": "a9a3cf524982d604", + "bom-ref": "d347bbb052efd7b1", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/de_phone.pl", "type": "file" }, { - "bom-ref": "47fdf31f13ca060d", + "bom-ref": "be76b39594ad3da4", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/dsb.pl", "type": "file" }, { - "bom-ref": "f08a33c0aaa62c66", + "bom-ref": "02585a0536e6c687", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ee.pl", "type": "file" }, { - "bom-ref": "db89e616e9932ac0", + "bom-ref": "d65a9510cb68439d", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/eo.pl", "type": "file" }, { - "bom-ref": "857c724020c97514", + "bom-ref": "405f20c31c94dc11", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/es.pl", "type": "file" }, { - "bom-ref": "5b96d917feec061b", + "bom-ref": "2480415778a10c12", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/es_trad.pl", "type": "file" }, { - "bom-ref": "482d5c7a9fffcd4b", + "bom-ref": "7c19838edbcdf4c6", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/et.pl", "type": "file" }, { - "bom-ref": "a9890c1264b1b855", + "bom-ref": "675ae3111743a71c", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fa.pl", "type": "file" }, { - "bom-ref": "5ac2e8e5a7e8f07f", + "bom-ref": "e8945375d8d29656", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fi.pl", "type": "file" }, { - "bom-ref": "ea919e4cbed983c6", + "bom-ref": "73fbbd495520067b", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fi_phone.pl", "type": "file" }, { - "bom-ref": "3fc7ead8a88296ad", + "bom-ref": "38e08eeee7dea9c4", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fil.pl", "type": "file" }, { - "bom-ref": "b1c770c33031e96e", + "bom-ref": "5cb2e9cb52ee42bb", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fo.pl", "type": "file" }, { - "bom-ref": "2dccd8b2130e373a", + "bom-ref": "457ca131b6a901fb", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/fr_ca.pl", "type": "file" }, { - "bom-ref": "6bec773c2927d5a9", + "bom-ref": "3e12ab8a6a9a27c0", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/gu.pl", "type": "file" }, { - "bom-ref": "81b944b5174a9485", + "bom-ref": "0d47be776c7f3274", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ha.pl", "type": "file" }, { - "bom-ref": "3ad747f98caba0db", + "bom-ref": "aa5241e8e2d9da3a", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/haw.pl", "type": "file" }, { - "bom-ref": "7ee9ea3bd5e62822", + "bom-ref": "69f036250dbddcc3", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/he.pl", "type": "file" }, { - "bom-ref": "90822403f6558178", + "bom-ref": "dbe75694a03eec1d", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/hi.pl", "type": "file" }, { - "bom-ref": "1fe8009e0535c3ba", + "bom-ref": "69381a0166fdafa3", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/hr.pl", "type": "file" }, { - "bom-ref": "50056a5bcb88aab3", + "bom-ref": "76c8c6aff82de6f6", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/hu.pl", "type": "file" }, { - "bom-ref": "2cc486eff4d530c7", + "bom-ref": "84e62ea9c4e427aa", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/hy.pl", "type": "file" }, { - "bom-ref": "eca30c873cf6784e", + "bom-ref": "4bc1f3ea83953dcf", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ig.pl", "type": "file" }, { - "bom-ref": "543ca1013e7b3155", + "bom-ref": "29ddb21901154438", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/is.pl", "type": "file" }, { - "bom-ref": "427c6b314d16aeb6", + "bom-ref": "3e143d3dfe1ef7bf", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ja.pl", "type": "file" }, { - "bom-ref": "0b8ade3a13fdeb90", + "bom-ref": "48d0e9dd78853c99", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/kk.pl", "type": "file" }, { - "bom-ref": "22bcebc9da30e757", + "bom-ref": "e1dd24dfe6bf5746", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/kl.pl", "type": "file" }, { - "bom-ref": "f620001e521ea99e", + "bom-ref": "56ada71b5284adaf", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/kn.pl", "type": "file" }, { - "bom-ref": "f393280f6182eee4", + "bom-ref": "7a74711f242dc769", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ko.pl", "type": "file" }, { - "bom-ref": "9b3d04cd29cd9411", + "bom-ref": "c635e8c2f6879268", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/kok.pl", "type": "file" }, { - "bom-ref": "ad0faf3fb140bbb4", + "bom-ref": "a223882780c99f6d", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/lkt.pl", "type": "file" }, { - "bom-ref": "c489f40747910f7f", + "bom-ref": "d2e1c626abf830fa", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ln.pl", "type": "file" }, { - "bom-ref": "9cc60e5a01f75dd1", + "bom-ref": "eb2181edc3f0e450", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/lt.pl", "type": "file" }, { - "bom-ref": "fed7cd1e8498597c", + "bom-ref": "43effe22981e651d", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/lv.pl", "type": "file" }, { - "bom-ref": "f8f83ca01de05136", + "bom-ref": "2b98d930b4ba2067", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/mk.pl", "type": "file" }, { - "bom-ref": "e61b437660ac897b", + "bom-ref": "588845e89fd3452e", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ml.pl", "type": "file" }, { - "bom-ref": "e370a3aca2a7a4f6", + "bom-ref": "ce47e2106a5ce0b7", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/mr.pl", "type": "file" }, { - "bom-ref": "a0e6bb8457bdc8a8", + "bom-ref": "b4cfc9bcf7e908a1", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/mt.pl", "type": "file" }, { - "bom-ref": "d05caaac39699abd", + "bom-ref": "fff75172eafffffc", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/nb.pl", "type": "file" }, { - "bom-ref": "bf7780dc8d6d28de", + "bom-ref": "0ae2770d8ba8baaf", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/nn.pl", "type": "file" }, { - "bom-ref": "e60f363018b58c7b", + "bom-ref": "81c3f9d5e461896e", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/nso.pl", "type": "file" }, { - "bom-ref": "62e87a98be49b8eb", + "bom-ref": "3823b14a734e126e", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/om.pl", "type": "file" }, { - "bom-ref": "0e9d88b694aebda2", + "bom-ref": "74e5d823223169eb", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/or.pl", "type": "file" }, { - "bom-ref": "de98dcd7b74cf706", + "bom-ref": "b9627ff27c4be75b", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/pa.pl", "type": "file" }, { - "bom-ref": "7f1c8d3a89819bbe", + "bom-ref": "02ded23aba8b5083", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/pl.pl", "type": "file" }, { - "bom-ref": "de16a0aa3ed2da9d", + "bom-ref": "1cff8d972b5a3288", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ro.pl", "type": "file" }, { - "bom-ref": "77956b3016c0bd14", + "bom-ref": "d28a2ea43c651a71", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sa.pl", "type": "file" }, { - "bom-ref": "7ef6b89c4849a1b3", + "bom-ref": "8819b6b2b98e567e", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/se.pl", "type": "file" }, { - "bom-ref": "82aa87d1a6484d5b", + "bom-ref": "0eaa174f24159d82", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/si.pl", "type": "file" }, { - "bom-ref": "cb92a1682c7b4f28", + "bom-ref": "13309977c6d061cd", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/si_dict.pl", "type": "file" }, { - "bom-ref": "9015f985b370fc06", + "bom-ref": "389d565fdd68a1ff", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sk.pl", "type": "file" }, { - "bom-ref": "a55e106d29059d40", + "bom-ref": "523ddb58c7fdb26d", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sl.pl", "type": "file" }, { - "bom-ref": "63d2994392761823", + "bom-ref": "e5ffbed462667012", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sq.pl", "type": "file" }, { - "bom-ref": "d31368a0842c34a6", + "bom-ref": "375593df7b1e756f", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sr.pl", "type": "file" }, { - "bom-ref": "1b8718f134cad880", + "bom-ref": "4f13ed921425f9d9", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sv.pl", "type": "file" }, { - "bom-ref": "3eddf7635dde09c9", + "bom-ref": "96377d5406ca9248", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/sv_refo.pl", "type": "file" }, { - "bom-ref": "d9d537e12b5c2f6b", + "bom-ref": "250386bd3f2776e2", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ta.pl", "type": "file" }, { - "bom-ref": "15b2301187ff7a92", + "bom-ref": "169c60fcdb51998f", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/te.pl", "type": "file" }, { - "bom-ref": "54cfdcb7b65d7e79", + "bom-ref": "66aacbfce634df60", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/th.pl", "type": "file" }, { - "bom-ref": "aa4e1b79ca2d4c50", + "bom-ref": "dfc76b2e6b21bcd9", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/tn.pl", "type": "file" }, { - "bom-ref": "45fd80f57bd1a192", + "bom-ref": "25307298643aa643", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/to.pl", "type": "file" }, { - "bom-ref": "355b46baf6bb80d2", + "bom-ref": "a0d33c7d51d7f62b", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/tr.pl", "type": "file" }, { - "bom-ref": "855b0926bd46b726", + "bom-ref": "38a2c480f52423c7", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ug_cyrl.pl", "type": "file" }, { - "bom-ref": "4f6128dd0b94af14", + "bom-ref": "216fa8758c95e6cd", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/uk.pl", "type": "file" }, { - "bom-ref": "b3378cfa2a9fd1cd", + "bom-ref": "9d0960c872c939d4", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/ur.pl", "type": "file" }, { - "bom-ref": "79092a71d19cdae3", + "bom-ref": "d9dd7ea22471167a", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/vi.pl", "type": "file" }, { - "bom-ref": "94f75b92c8886e0a", + "bom-ref": "28c57df4db7ce2af", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/vo.pl", "type": "file" }, { - "bom-ref": "9a496de559dcce15", + "bom-ref": "41d1cb95f35bfa6c", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/wae.pl", "type": "file" }, { - "bom-ref": "0bf71046560dd510", + "bom-ref": "145f1e102d634465", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/wo.pl", "type": "file" }, { - "bom-ref": "8c1518fd69b091d0", + "bom-ref": "9c7082124e2a7e09", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/yo.pl", "type": "file" }, { - "bom-ref": "a3e15ac3a4a23334", + "bom-ref": "1f224113687bb129", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh.pl", "type": "file" }, { - "bom-ref": "725a127cdd74c117", + "bom-ref": "89b2734ff752a9fa", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh_big5.pl", "type": "file" }, { - "bom-ref": "f5da351bcdd93f08", + "bom-ref": "c055f79875227e15", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh_gb.pl", "type": "file" }, { - "bom-ref": "95ebdfa7478b6d6c", + "bom-ref": "1c9f0a6134d9ca39", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh_pin.pl", "type": "file" }, { - "bom-ref": "e7ff9b4eac6dde4c", + "bom-ref": "44afba30ab8696a9", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh_strk.pl", "type": "file" }, { - "bom-ref": "b017b15f74db91af", + "bom-ref": "0ec78b962133d276", "name": "/usr/share/perl/5.38.2/Unicode/Collate/Locale/zh_zhu.pl", "type": "file" }, { - "bom-ref": "6530b88f10be6c93", + "bom-ref": "316beeeae104507a", "name": "/usr/share/perl/5.38.2/Unicode/Collate/allkeys.txt", "type": "file" }, { - "bom-ref": "96e4cf62508cd148", + "bom-ref": "ad5512b851ed0dc5", "name": "/usr/share/perl/5.38.2/Unicode/Collate/keys.txt", "type": "file" }, { - "bom-ref": "ff7d7a0be4d5de63", + "bom-ref": "0c02119d8161c4aa", "name": "/usr/share/perl/5.38.2/Unicode/UCD.pm", "type": "file" }, { - "bom-ref": "334b3503e8533170", + "bom-ref": "7cb26ace717a88f9", "name": "/usr/share/perl/5.38.2/User/grent.pm", "type": "file" }, { - "bom-ref": "71ffbe79f20c717e", + "bom-ref": "07f9ff66352e05c7", "name": "/usr/share/perl/5.38.2/User/pwent.pm", "type": "file" }, { - "bom-ref": "9f71faba96bcfc0a", + "bom-ref": "b1ea5ee9ab7cb3ef", "name": "/usr/share/perl/5.38.2/XSLoader.pm", "type": "file" }, { - "bom-ref": "60d65adc5e24eb67", + "bom-ref": "d1902899ead620ee", "name": "/usr/share/perl/5.38.2/_charnames.pm", "type": "file" }, { - "bom-ref": "552fb68d961f7039", + "bom-ref": "b4e217bf9c086bcc", "name": "/usr/share/perl/5.38.2/autodie.pm", "type": "file" }, { - "bom-ref": "32efef0de2f7e00e", + "bom-ref": "33e8073d01354997", "name": "/usr/share/perl/5.38.2/autodie/Scope/Guard.pm", "type": "file" }, { - "bom-ref": "8f5fa61955367085", + "bom-ref": "15aea5250b907200", "name": "/usr/share/perl/5.38.2/autodie/Scope/GuardStack.pm", "type": "file" }, { - "bom-ref": "ac8263059e507a17", + "bom-ref": "b76cb6088ba6e5ca", "name": "/usr/share/perl/5.38.2/autodie/Util.pm", "type": "file" }, { - "bom-ref": "438c65203c6cbbd2", + "bom-ref": "8ae1d513d34fe7cf", "name": "/usr/share/perl/5.38.2/autodie/exception.pm", "type": "file" }, { - "bom-ref": "68bfe6a78a88f715", + "bom-ref": "332a3c4625016b48", "name": "/usr/share/perl/5.38.2/autodie/exception/system.pm", "type": "file" }, { - "bom-ref": "204f8ff5c7ddf7d8", + "bom-ref": "a0715a855f2506fd", "name": "/usr/share/perl/5.38.2/autodie/hints.pm", "type": "file" }, { - "bom-ref": "29d7d57cd694a172", + "bom-ref": "76b3a334b255738f", "name": "/usr/share/perl/5.38.2/autodie/skip.pm", "type": "file" }, { - "bom-ref": "292c7c4e7e39ae65", + "bom-ref": "b63ca6d8e88b272c", "name": "/usr/share/perl/5.38.2/autouse.pm", "type": "file" }, { - "bom-ref": "4f2bee875c648bc4", + "bom-ref": "3dd2b0d9e9c205dd", "name": "/usr/share/perl/5.38.2/base.pm", "type": "file" }, { - "bom-ref": "7914c8af7a2343f1", + "bom-ref": "addb1c92ff124a88", "name": "/usr/share/perl/5.38.2/bigfloat.pm", "type": "file" }, { - "bom-ref": "340bd1dc155567b5", + "bom-ref": "7a1965bff3185804", "name": "/usr/share/perl/5.38.2/bigint.pm", "type": "file" }, { - "bom-ref": "047b61161a47790f", + "bom-ref": "8383dc4f42e260ce", "name": "/usr/share/perl/5.38.2/bignum.pm", "type": "file" }, { - "bom-ref": "a16379bb222553dd", + "bom-ref": "b7442bf75987774c", "name": "/usr/share/perl/5.38.2/bigrat.pm", "type": "file" }, { - "bom-ref": "4a45b7a83a26f133", + "bom-ref": "912fa7813f5acbc6", "name": "/usr/share/perl/5.38.2/blib.pm", "type": "file" }, { - "bom-ref": "5a05ea7947e2554d", + "bom-ref": "2c18854ca92c5f8c", "name": "/usr/share/perl/5.38.2/builtin.pm", "type": "file" }, { - "bom-ref": "299b8e49dcf1353a", + "bom-ref": "45902b9cd1ddfe7f", "name": "/usr/share/perl/5.38.2/bytes.pm", "type": "file" }, { - "bom-ref": "7b3760b5e8788f18", + "bom-ref": "63409ef8b2ccf001", "name": "/usr/share/perl/5.38.2/bytes_heavy.pl", "type": "file" }, { - "bom-ref": "6860897ae7e85af1", + "bom-ref": "74508d9bc60efde4", "name": "/usr/share/perl/5.38.2/charnames.pm", "type": "file" }, { - "bom-ref": "ed36a20d3244e21b", + "bom-ref": "adcd7af38955a17e", "name": "/usr/share/perl/5.38.2/constant.pm", "type": "file" }, { - "bom-ref": "74c3433caf97d436", + "bom-ref": "98e2846c7e7af6df", "name": "/usr/share/perl/5.38.2/deprecate.pm", "type": "file" }, { - "bom-ref": "d1ab5d1a1a71bc92", + "bom-ref": "5fa016ce6d2686f3", "name": "/usr/share/perl/5.38.2/diagnostics.pm", "type": "file" }, { - "bom-ref": "fc0b21dc03c01b0f", + "bom-ref": "41c2eec23fb1491a", "name": "/usr/share/perl/5.38.2/dumpvar.pl", "type": "file" }, { - "bom-ref": "802a7f8a3bb3f271", + "bom-ref": "be80bb2a49d64be4", "name": "/usr/share/perl/5.38.2/encoding/warnings.pm", "type": "file" }, { - "bom-ref": "d8c734229c9ea576", + "bom-ref": "0cd1d5682df40b97", "name": "/usr/share/perl/5.38.2/experimental.pm", "type": "file" }, { - "bom-ref": "5555949460ead805", + "bom-ref": "e992bf8dc9621c20", "name": "/usr/share/perl/5.38.2/feature.pm", "type": "file" }, { - "bom-ref": "ff3515a6fa234d8d", + "bom-ref": "6e660a12bf3d9c24", "name": "/usr/share/perl/5.38.2/fields.pm", "type": "file" }, { - "bom-ref": "1673b0a09fa90fea", + "bom-ref": "8ab697a776feb3e3", "name": "/usr/share/perl/5.38.2/filetest.pm", "type": "file" }, { - "bom-ref": "79708785296ee3ec", + "bom-ref": "66abacd3347db17d", "name": "/usr/share/perl/5.38.2/if.pm", "type": "file" }, { - "bom-ref": "e8080d2bf34a8c49", + "bom-ref": "f392f8c3c404ec40", "name": "/usr/share/perl/5.38.2/integer.pm", "type": "file" }, { - "bom-ref": "2f21ac0961f605b1", + "bom-ref": "ec95e0a4dec42cf4", "name": "/usr/share/perl/5.38.2/less.pm", "type": "file" }, { - "bom-ref": "55ee89167adf024c", + "bom-ref": "d87ed36aab3e2cd5", "name": "/usr/share/perl/5.38.2/locale.pm", "type": "file" }, { - "bom-ref": "2f571007aa581b0d", + "bom-ref": "35c4449d10585120", "name": "/usr/share/perl/5.38.2/meta_notation.pm", "type": "file" }, { - "bom-ref": "82d27eb0e63c07ca", + "bom-ref": "70e41ff698957e73", "name": "/usr/share/perl/5.38.2/ok.pm", "type": "file" }, { - "bom-ref": "be8ea8f42d4bdb4f", + "bom-ref": "face24b8c01f5206", "name": "/usr/share/perl/5.38.2/open.pm", "type": "file" }, { - "bom-ref": "11e8b401a88ad600", + "bom-ref": "3203bba9344981c9", "name": "/usr/share/perl/5.38.2/overload.pm", "type": "file" }, { - "bom-ref": "6668ed598e7f0329", + "bom-ref": "85766e98f6b37b98", "name": "/usr/share/perl/5.38.2/overload/numbers.pm", "type": "file" }, { - "bom-ref": "674b16f0ce0e9ef4", + "bom-ref": "fd2f312ab21352a1", "name": "/usr/share/perl/5.38.2/overloading.pm", "type": "file" }, { - "bom-ref": "ce6faaa0911102dd", + "bom-ref": "a4304c3d048c6eec", "name": "/usr/share/perl/5.38.2/parent.pm", "type": "file" }, { - "bom-ref": "cee9af288554e8a6", + "bom-ref": "ad87e907f0418763", "name": "/usr/share/perl/5.38.2/perl5db.pl", "type": "file" }, { - "bom-ref": "be55b2af6bae727b", + "bom-ref": "17cd09131480320a", "name": "/usr/share/perl/5.38.2/perlfaq.pm", "type": "file" }, { - "bom-ref": "cee9e1bda6331c5c", + "bom-ref": "1709521795c80051", "name": "/usr/share/perl/5.38.2/pod/perldiag.pod", "type": "file" }, { - "bom-ref": "9f7495e5a26ead84", + "bom-ref": "651c08b880533b49", "name": "/usr/share/perl/5.38.2/sigtrap.pm", "type": "file" }, { - "bom-ref": "0f9bb82b241169b7", + "bom-ref": "a6aeb75b7cfbeec2", "name": "/usr/share/perl/5.38.2/sort.pm", "type": "file" }, { - "bom-ref": "b36abe126fc2b5d8", + "bom-ref": "e0cac3fbe1140281", "name": "/usr/share/perl/5.38.2/stable.pm", "type": "file" }, { - "bom-ref": "2eb6e21bf9f123d0", + "bom-ref": "eafa3f5884d1728d", "name": "/usr/share/perl/5.38.2/strict.pm", "type": "file" }, { - "bom-ref": "7dc96c5a08426913", + "bom-ref": "9207ab5f1e39d972", "name": "/usr/share/perl/5.38.2/subs.pm", "type": "file" }, { - "bom-ref": "4cb5c10740f0bb05", + "bom-ref": "9c95bf98b9023514", "name": "/usr/share/perl/5.38.2/unicore/Blocks.txt", "type": "file" }, { - "bom-ref": "0419aff6fc832619", + "bom-ref": "36fbb35ef4404ca4", "name": "/usr/share/perl/5.38.2/unicore/CombiningClass.pl", "type": "file" }, { - "bom-ref": "db405a0f806dabe5", + "bom-ref": "9bfc1144caad9938", "name": "/usr/share/perl/5.38.2/unicore/Decomposition.pl", "type": "file" }, { - "bom-ref": "1b3909b3d01da041", + "bom-ref": "6903d8ef0144d1a4", "name": "/usr/share/perl/5.38.2/unicore/Name.pl", "type": "file" }, { - "bom-ref": "c241e2548010ad42", + "bom-ref": "869cf41932dec527", "name": "/usr/share/perl/5.38.2/unicore/Name.pm", "type": "file" }, { - "bom-ref": "5bdc243ba2741dc1", + "bom-ref": "30845bdc45438364", "name": "/usr/share/perl/5.38.2/unicore/NamedSequences.txt", "type": "file" }, { - "bom-ref": "7edf0abd6df791c7", + "bom-ref": "1dba0b251e56a7ae", "name": "/usr/share/perl/5.38.2/unicore/SpecialCasing.txt", "type": "file" }, { - "bom-ref": "d2f4ff6ba7071d51", + "bom-ref": "f177651a33cab00c", "name": "/usr/share/perl/5.38.2/unicore/TestNorm.pl", "type": "file" }, { - "bom-ref": "5bbd7560ea4aa344", + "bom-ref": "ee8eb6cd8d128b41", "name": "/usr/share/perl/5.38.2/unicore/To/Age.pl", "type": "file" }, { - "bom-ref": "ac33ec59979c96a4", + "bom-ref": "562e4028d0d23969", "name": "/usr/share/perl/5.38.2/unicore/To/Bc.pl", "type": "file" }, { - "bom-ref": "9ecf973a90fb0be5", + "bom-ref": "ee77e6297b341474", "name": "/usr/share/perl/5.38.2/unicore/To/Bmg.pl", "type": "file" }, { - "bom-ref": "8c14bf4f6c9ece71", + "bom-ref": "fef7f6c2f7cbc7d0", "name": "/usr/share/perl/5.38.2/unicore/To/Bpb.pl", "type": "file" }, { - "bom-ref": "9cfe2803348bd0d1", + "bom-ref": "ce8ee951bd10efbc", "name": "/usr/share/perl/5.38.2/unicore/To/Bpt.pl", "type": "file" }, { - "bom-ref": "3c605fcf3aea3746", + "bom-ref": "e3e541bf37872eef", "name": "/usr/share/perl/5.38.2/unicore/To/Cf.pl", "type": "file" }, { - "bom-ref": "a88f37d66ab10d4f", + "bom-ref": "a666016f85a36efa", "name": "/usr/share/perl/5.38.2/unicore/To/Ea.pl", "type": "file" }, { - "bom-ref": "10fb541a17a27cd2", + "bom-ref": "11157db8663b8b23", "name": "/usr/share/perl/5.38.2/unicore/To/EqUIdeo.pl", "type": "file" }, { - "bom-ref": "d1264c49bf87c695", + "bom-ref": "f52f592ff8d4f254", "name": "/usr/share/perl/5.38.2/unicore/To/GCB.pl", "type": "file" }, { - "bom-ref": "77310d7bfa73bc24", + "bom-ref": "f1231f7d29273e55", "name": "/usr/share/perl/5.38.2/unicore/To/Gc.pl", "type": "file" }, { - "bom-ref": "f6c9b5a484312126", + "bom-ref": "0cbd4dd618149543", "name": "/usr/share/perl/5.38.2/unicore/To/Hst.pl", "type": "file" }, { - "bom-ref": "61c6a2335805cb8c", + "bom-ref": "37b01557a655246d", "name": "/usr/share/perl/5.38.2/unicore/To/Identif2.pl", "type": "file" }, { - "bom-ref": "6b9ad0bf3e176a3f", + "bom-ref": "95829e7c84b1ad42", "name": "/usr/share/perl/5.38.2/unicore/To/Identifi.pl", "type": "file" }, { - "bom-ref": "0d3aee5403a34549", + "bom-ref": "dc165adb559886f4", "name": "/usr/share/perl/5.38.2/unicore/To/InPC.pl", "type": "file" }, { - "bom-ref": "d9892b5a37abda92", + "bom-ref": "3442312b05bcf6f3", "name": "/usr/share/perl/5.38.2/unicore/To/InSC.pl", "type": "file" }, { - "bom-ref": "ee2917d513ab2364", + "bom-ref": "9b9841f8aeb2bf09", "name": "/usr/share/perl/5.38.2/unicore/To/Isc.pl", "type": "file" }, { - "bom-ref": "9d7f9b8b53103e9d", + "bom-ref": "7a2a6f77531af898", "name": "/usr/share/perl/5.38.2/unicore/To/Jg.pl", "type": "file" }, { - "bom-ref": "c22d5c0d6edd55a9", + "bom-ref": "522e668b16567764", "name": "/usr/share/perl/5.38.2/unicore/To/Jt.pl", "type": "file" }, { - "bom-ref": "d643ec85d084c75f", + "bom-ref": "3f742e3b8b1f23aa", "name": "/usr/share/perl/5.38.2/unicore/To/Lb.pl", "type": "file" }, { - "bom-ref": "bbf718b5a5f06fa1", + "bom-ref": "706289c54feff898", "name": "/usr/share/perl/5.38.2/unicore/To/Lc.pl", "type": "file" }, { - "bom-ref": "c39354a423817682", + "bom-ref": "4516c991be6bfd5b", "name": "/usr/share/perl/5.38.2/unicore/To/NFCQC.pl", "type": "file" }, { - "bom-ref": "62fcbb465da59728", + "bom-ref": "eb14306c973fd729", "name": "/usr/share/perl/5.38.2/unicore/To/NFDQC.pl", "type": "file" }, { - "bom-ref": "76c8a0d18f2e61f0", + "bom-ref": "c93d1597df316275", "name": "/usr/share/perl/5.38.2/unicore/To/NFKCCF.pl", "type": "file" }, { - "bom-ref": "2317d0ff07d0b8b9", + "bom-ref": "5bd4aa081134a850", "name": "/usr/share/perl/5.38.2/unicore/To/NFKCQC.pl", "type": "file" }, { - "bom-ref": "e24f25b8790de147", + "bom-ref": "c0eddf985fec6b5e", "name": "/usr/share/perl/5.38.2/unicore/To/NFKDQC.pl", "type": "file" }, { - "bom-ref": "30f85dc1bf8849b4", + "bom-ref": "a3e6904015bff755", "name": "/usr/share/perl/5.38.2/unicore/To/Na1.pl", "type": "file" }, { - "bom-ref": "21e2102b020beb3f", + "bom-ref": "b6bcd5bf93f444be", "name": "/usr/share/perl/5.38.2/unicore/To/NameAlia.pl", "type": "file" }, { - "bom-ref": "cd0c026324739589", + "bom-ref": "65dbc7a5d63e2dc4", "name": "/usr/share/perl/5.38.2/unicore/To/Nt.pl", "type": "file" }, { - "bom-ref": "73dd694bf63d1541", + "bom-ref": "681027033b0ca308", "name": "/usr/share/perl/5.38.2/unicore/To/Nv.pl", "type": "file" }, { - "bom-ref": "096fa00c257d5349", + "bom-ref": "e2a5c5cc95b1e888", "name": "/usr/share/perl/5.38.2/unicore/To/PerlDeci.pl", "type": "file" }, { - "bom-ref": "1d413f26c75c65a9", + "bom-ref": "0baf50d9bffd9150", "name": "/usr/share/perl/5.38.2/unicore/To/SB.pl", "type": "file" }, { - "bom-ref": "0d2d546088a7546a", + "bom-ref": "c5593320d914efc7", "name": "/usr/share/perl/5.38.2/unicore/To/Sc.pl", "type": "file" }, { - "bom-ref": "071c5a6800f41189", + "bom-ref": "fde62b606436d334", "name": "/usr/share/perl/5.38.2/unicore/To/Scx.pl", "type": "file" }, { - "bom-ref": "671b902ccfbc0413", + "bom-ref": "05010ec774fbc7a2", "name": "/usr/share/perl/5.38.2/unicore/To/Tc.pl", "type": "file" }, { - "bom-ref": "19be7fa3238abbcd", + "bom-ref": "d02939e9a6e45e60", "name": "/usr/share/perl/5.38.2/unicore/To/Uc.pl", "type": "file" }, { - "bom-ref": "f4767e3fe0c29b20", + "bom-ref": "cd83f335a91021d1", "name": "/usr/share/perl/5.38.2/unicore/To/Vo.pl", "type": "file" }, { - "bom-ref": "5eb24e867633aabd", + "bom-ref": "09b732175e2d060c", "name": "/usr/share/perl/5.38.2/unicore/To/WB.pl", "type": "file" }, { - "bom-ref": "925db1c15a50e6f1", + "bom-ref": "05710a884a1b6fd8", "name": "/usr/share/perl/5.38.2/unicore/To/_PerlLB.pl", "type": "file" }, { - "bom-ref": "d1eb7945cca77635", + "bom-ref": "ccffe68aea370400", "name": "/usr/share/perl/5.38.2/unicore/To/_PerlSCX.pl", "type": "file" }, { - "bom-ref": "24bd79a848569508", + "bom-ref": "33c421446ce94415", "name": "/usr/share/perl/5.38.2/unicore/UCD.pl", "type": "file" }, { - "bom-ref": "7be4bb19633132b0", + "bom-ref": "5817d9d1b875de95", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/NA.pl", "type": "file" }, { - "bom-ref": "02c4145e42861cd2", + "bom-ref": "6a1b830b00030a43", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V100.pl", "type": "file" }, { - "bom-ref": "0e3710d8402a86b6", + "bom-ref": "7a7e7b23d92ec507", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V11.pl", "type": "file" }, { - "bom-ref": "d76c3a346f69e7dc", + "bom-ref": "25654a0a9f0ad5f5", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V110.pl", "type": "file" }, { - "bom-ref": "e60cd0858b6e448f", + "bom-ref": "7a2a7901a760b3c2", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V120.pl", "type": "file" }, { - "bom-ref": "ed6d0978921b5b66", + "bom-ref": "c371d64f6fa78dc7", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V130.pl", "type": "file" }, { - "bom-ref": "b299cbc0bacd9454", + "bom-ref": "90ae24319bd722bd", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V140.pl", "type": "file" }, { - "bom-ref": "cd1d35ce958ceb96", + "bom-ref": "2a40472d2cfca07b", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V150.pl", "type": "file" }, { - "bom-ref": "b2c9cac9ff670325", + "bom-ref": "8b23123f862e7f18", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V20.pl", "type": "file" }, { - "bom-ref": "102a24dc475d904f", + "bom-ref": "c2c72be75be319a6", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V30.pl", "type": "file" }, { - "bom-ref": "0dc68fbc59555839", + "bom-ref": "81d342e3b4c6b56c", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V31.pl", "type": "file" }, { - "bom-ref": "be33f0b29746ca88", + "bom-ref": "eb24beb3aa1632ad", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V32.pl", "type": "file" }, { - "bom-ref": "6f62c5b1069cb1d5", + "bom-ref": "cf92b0e479a4e2e8", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V40.pl", "type": "file" }, { - "bom-ref": "fd0570af7d3fe436", + "bom-ref": "44b3904ea3f9598f", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V41.pl", "type": "file" }, { - "bom-ref": "96a08c88b1cb0156", + "bom-ref": "bb66cab543ed09cf", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V50.pl", "type": "file" }, { - "bom-ref": "95bd6b84c6fd38a4", + "bom-ref": "ef3842067ab923a5", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V51.pl", "type": "file" }, { - "bom-ref": "023ffa7697185e75", + "bom-ref": "683de8b7d7d75e04", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V52.pl", "type": "file" }, { - "bom-ref": "80370190a92775ea", + "bom-ref": "54719c20cf2379c3", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V60.pl", "type": "file" }, { - "bom-ref": "c862cf4311e29ef0", + "bom-ref": "3453ef9e885135f9", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V61.pl", "type": "file" }, { - "bom-ref": "fb574605ca2cb1ac", + "bom-ref": "55293029105c6559", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V70.pl", "type": "file" }, { - "bom-ref": "646f014ec59d1665", + "bom-ref": "d3e58d963962d878", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V80.pl", "type": "file" }, { - "bom-ref": "e024fb5ba3425a2c", + "bom-ref": "16108210be779c49", "name": "/usr/share/perl/5.38.2/unicore/lib/Age/V90.pl", "type": "file" }, { - "bom-ref": "0d6625dea38f2ccc", + "bom-ref": "cfe30fe687433479", "name": "/usr/share/perl/5.38.2/unicore/lib/Alpha/Y.pl", "type": "file" }, { - "bom-ref": "4f53917429d1a62c", + "bom-ref": "c613eee7c9c638b5", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/AL.pl", "type": "file" }, { - "bom-ref": "1d7c1f8d9e9c35bd", + "bom-ref": "dc0666fdf3d31a60", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/AN.pl", "type": "file" }, { - "bom-ref": "7db77516f777e088", + "bom-ref": "749f24b0bf15f485", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/B.pl", "type": "file" }, { - "bom-ref": "cec746e69f2744a2", + "bom-ref": "e99bff4a61029583", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/BN.pl", "type": "file" }, { - "bom-ref": "0d9324dbae4392b5", + "bom-ref": "605a049eeb1c5754", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/CS.pl", "type": "file" }, { - "bom-ref": "a725218d75f3ca52", + "bom-ref": "dea396c60e815dbf", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/EN.pl", "type": "file" }, { - "bom-ref": "f6826612a6378b22", + "bom-ref": "14f215cb799a3c87", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/ES.pl", "type": "file" }, { - "bom-ref": "f4f5f14db43be2fd", + "bom-ref": "be0b3daa719eb1b8", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/ET.pl", "type": "file" }, { - "bom-ref": "a3fb2e2f1b385ecf", + "bom-ref": "dfc9c1c6a7e71522", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/L.pl", "type": "file" }, { - "bom-ref": "5fa3c110cec7d394", + "bom-ref": "4b2542de160133fd", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/NSM.pl", "type": "file" }, { - "bom-ref": "d5da009eb1e8810a", + "bom-ref": "cb8ef35b137d3eb3", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/ON.pl", "type": "file" }, { - "bom-ref": "87dd35f452419cf5", + "bom-ref": "8e5357f575ddf840", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/R.pl", "type": "file" }, { - "bom-ref": "f764e6dc83646ed8", + "bom-ref": "f34d5daa2483a67d", "name": "/usr/share/perl/5.38.2/unicore/lib/Bc/WS.pl", "type": "file" }, { - "bom-ref": "8757d841633e346e", + "bom-ref": "3c569b675e8e261b", "name": "/usr/share/perl/5.38.2/unicore/lib/BidiC/Y.pl", "type": "file" }, { - "bom-ref": "39f64e31bc57f54f", + "bom-ref": "5936a35be718597a", "name": "/usr/share/perl/5.38.2/unicore/lib/BidiM/Y.pl", "type": "file" }, { - "bom-ref": "bd6a7c90342e08cd", + "bom-ref": "e5b7c975bcbc3164", "name": "/usr/share/perl/5.38.2/unicore/lib/Blk/NB.pl", "type": "file" }, { - "bom-ref": "861f47229320b9db", + "bom-ref": "bffb3395a84bf94e", "name": "/usr/share/perl/5.38.2/unicore/lib/Bpt/C.pl", "type": "file" }, { - "bom-ref": "6abd6adf0feafb60", + "bom-ref": "a6041c63376dd2a9", "name": "/usr/share/perl/5.38.2/unicore/lib/Bpt/N.pl", "type": "file" }, { - "bom-ref": "690ad4ad9dc86584", + "bom-ref": "acf873e2994aa139", "name": "/usr/share/perl/5.38.2/unicore/lib/Bpt/O.pl", "type": "file" }, { - "bom-ref": "d633d40eb186429f", + "bom-ref": "f320f4d7268da546", "name": "/usr/share/perl/5.38.2/unicore/lib/CE/Y.pl", "type": "file" }, { - "bom-ref": "0406e57ecaea74bb", + "bom-ref": "cf389aafb1ebfaa2", "name": "/usr/share/perl/5.38.2/unicore/lib/CI/Y.pl", "type": "file" }, { - "bom-ref": "a21d26dee7716aed", + "bom-ref": "4d71657141c3d6bc", "name": "/usr/share/perl/5.38.2/unicore/lib/CWCF/Y.pl", "type": "file" }, { - "bom-ref": "f0a28135a8c7a100", + "bom-ref": "c80b0b6956b75da9", "name": "/usr/share/perl/5.38.2/unicore/lib/CWCM/Y.pl", "type": "file" }, { - "bom-ref": "bef6c8929f0962c1", + "bom-ref": "0b0a2d0a70a1d21c", "name": "/usr/share/perl/5.38.2/unicore/lib/CWKCF/Y.pl", "type": "file" }, { - "bom-ref": "a865d7c497a03c32", + "bom-ref": "753436f947a300b7", "name": "/usr/share/perl/5.38.2/unicore/lib/CWL/Y.pl", "type": "file" }, { - "bom-ref": "4804ac2ba806e95a", + "bom-ref": "8a81af48f8917627", "name": "/usr/share/perl/5.38.2/unicore/lib/CWT/Y.pl", "type": "file" }, { - "bom-ref": "4adca5fe75beee68", + "bom-ref": "6010f2f26bcc5459", "name": "/usr/share/perl/5.38.2/unicore/lib/CWU/Y.pl", "type": "file" }, { - "bom-ref": "7778b2978acbcd3c", + "bom-ref": "26ee38b3b98a4291", "name": "/usr/share/perl/5.38.2/unicore/lib/Cased/Y.pl", "type": "file" }, { - "bom-ref": "fbba94b009741699", + "bom-ref": "6bad51bcfc07cd00", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/A.pl", "type": "file" }, { - "bom-ref": "cb1ae46930236d7b", + "bom-ref": "c29487531eb8a786", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/AL.pl", "type": "file" }, { - "bom-ref": "867973e8afde4eda", + "bom-ref": "0732b93dacd6b237", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/AR.pl", "type": "file" }, { - "bom-ref": "30f2edfbd85b8622", + "bom-ref": "7e912939da5cbd87", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/ATAR.pl", "type": "file" }, { - "bom-ref": "c524218b474eb4b3", + "bom-ref": "b9eee25988572026", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/B.pl", "type": "file" }, { - "bom-ref": "e2b4e645152cb856", + "bom-ref": "6743d065994a1fb3", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/BR.pl", "type": "file" }, { - "bom-ref": "f486dab254eaeb15", + "bom-ref": "41ac4055a61858a8", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/DB.pl", "type": "file" }, { - "bom-ref": "f1c9d4d59de65530", + "bom-ref": "8545f93aaa9188c1", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/NK.pl", "type": "file" }, { - "bom-ref": "6b035c2e3c77962c", + "bom-ref": "ecc3f91a7322f291", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/NR.pl", "type": "file" }, { - "bom-ref": "69a6bc86bc088a67", + "bom-ref": "ea898d0ad407df32", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/OV.pl", "type": "file" }, { - "bom-ref": "d5f84899522c3220", + "bom-ref": "b653f77a25b41cd5", "name": "/usr/share/perl/5.38.2/unicore/lib/Ccc/VR.pl", "type": "file" }, { - "bom-ref": "13780f6aa93bf95e", + "bom-ref": "87eb462fe59e2fb7", "name": "/usr/share/perl/5.38.2/unicore/lib/CompEx/Y.pl", "type": "file" }, { - "bom-ref": "6e0aa1f74749ed99", + "bom-ref": "751c5bbeede11cc8", "name": "/usr/share/perl/5.38.2/unicore/lib/DI/Y.pl", "type": "file" }, { - "bom-ref": "b06de7fa02f1f09c", + "bom-ref": "3e1ef10051ad2a35", "name": "/usr/share/perl/5.38.2/unicore/lib/Dash/Y.pl", "type": "file" }, { - "bom-ref": "c5ce55b21405f598", + "bom-ref": "80cac3d34c5c9fe9", "name": "/usr/share/perl/5.38.2/unicore/lib/Dep/Y.pl", "type": "file" }, { - "bom-ref": "14be3b017e347833", + "bom-ref": "e944c6c49786ce1a", "name": "/usr/share/perl/5.38.2/unicore/lib/Dia/Y.pl", "type": "file" }, { - "bom-ref": "2f98650141035cc3", + "bom-ref": "661fc8500c90049a", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Com.pl", "type": "file" }, { - "bom-ref": "d36c9c1baf032778", + "bom-ref": "d02f4f18ecc7cb25", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Enc.pl", "type": "file" }, { - "bom-ref": "6d3bc7f8dd429d22", + "bom-ref": "796aa586b76eccb3", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Fin.pl", "type": "file" }, { - "bom-ref": "e4b1c1af852875ab", + "bom-ref": "58583527954b0e22", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Font.pl", "type": "file" }, { - "bom-ref": "da43f984ad17524a", + "bom-ref": "b290ab59f5615643", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Init.pl", "type": "file" }, { - "bom-ref": "a5ab99cedec79d78", + "bom-ref": "f4ebfd6dd24e217d", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Iso.pl", "type": "file" }, { - "bom-ref": "1179e033997e947f", + "bom-ref": "67e6e5cf1bb6d5f6", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Med.pl", "type": "file" }, { - "bom-ref": "d6a8a7d5ab9a926f", + "bom-ref": "c8d96de4f3608e56", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Nar.pl", "type": "file" }, { - "bom-ref": "9753beeb307949d4", + "bom-ref": "90410c03da375239", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Nb.pl", "type": "file" }, { - "bom-ref": "a94e5c4c3bf91e93", + "bom-ref": "a2f063c8a1dbcc46", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/NonCanon.pl", "type": "file" }, { - "bom-ref": "361519a2c85973e3", + "bom-ref": "06cc6345173ab78a", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Sqr.pl", "type": "file" }, { - "bom-ref": "551ae23ade3328f3", + "bom-ref": "e734e0eba02ca02a", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Sub.pl", "type": "file" }, { - "bom-ref": "537f6b464b0e8ba0", + "bom-ref": "dc3d6e3a70cc6401", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Sup.pl", "type": "file" }, { - "bom-ref": "e295eb19660af1f0", + "bom-ref": "a9dbe4ad2e493451", "name": "/usr/share/perl/5.38.2/unicore/lib/Dt/Vert.pl", "type": "file" }, { - "bom-ref": "0072a30a461fbc33", + "bom-ref": "c0990cb83757513a", "name": "/usr/share/perl/5.38.2/unicore/lib/EBase/Y.pl", "type": "file" }, { - "bom-ref": "7603945bc9e63937", + "bom-ref": "c49e16a75e019b8a", "name": "/usr/share/perl/5.38.2/unicore/lib/EComp/Y.pl", "type": "file" }, { - "bom-ref": "1daca051c79d3a8d", + "bom-ref": "7865aaa7ae384160", "name": "/usr/share/perl/5.38.2/unicore/lib/EPres/Y.pl", "type": "file" }, { - "bom-ref": "6fa09124f9168f2d", + "bom-ref": "7a19ed33eff31730", "name": "/usr/share/perl/5.38.2/unicore/lib/Ea/A.pl", "type": "file" }, { - "bom-ref": "cb7e025a2592ce70", + "bom-ref": "9aad7cf3cf401d01", "name": "/usr/share/perl/5.38.2/unicore/lib/Ea/H.pl", "type": "file" }, { - "bom-ref": "c65a076496afa4d8", + "bom-ref": "5ad9d8b92f53e491", "name": "/usr/share/perl/5.38.2/unicore/lib/Ea/N.pl", "type": "file" }, { - "bom-ref": "a56b3f2a19d2d5a0", + "bom-ref": "5f1ae6c9cb612a45", "name": "/usr/share/perl/5.38.2/unicore/lib/Ea/Na.pl", "type": "file" }, { - "bom-ref": "1f460a749b39c8c9", + "bom-ref": "0be56ba631c39728", "name": "/usr/share/perl/5.38.2/unicore/lib/Ea/W.pl", "type": "file" }, { - "bom-ref": "838fdc430cc31b73", + "bom-ref": "0a24446d29255b2e", "name": "/usr/share/perl/5.38.2/unicore/lib/Emoji/Y.pl", "type": "file" }, { - "bom-ref": "fc872c6aa7d46dd7", + "bom-ref": "724275561c00b4f2", "name": "/usr/share/perl/5.38.2/unicore/lib/Ext/Y.pl", "type": "file" }, { - "bom-ref": "16bc921cd5556dee", + "bom-ref": "40c7fe4106742373", "name": "/usr/share/perl/5.38.2/unicore/lib/ExtPict/Y.pl", "type": "file" }, { - "bom-ref": "6c28fb121fdf4426", + "bom-ref": "1746eb74bf202ecf", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/CN.pl", "type": "file" }, { - "bom-ref": "eefacb7c030d35a1", + "bom-ref": "fcd87aab56b91880", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/EX.pl", "type": "file" }, { - "bom-ref": "5906074617b7d992", + "bom-ref": "a2188c76d0fc4f43", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/LV.pl", "type": "file" }, { - "bom-ref": "b4811ba982976020", + "bom-ref": "e4b5e32fd89b0175", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/LVT.pl", "type": "file" }, { - "bom-ref": "3b551b06f78b09c2", + "bom-ref": "58b6f341583f0567", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/PP.pl", "type": "file" }, { - "bom-ref": "d657541bc4a94fb1", + "bom-ref": "ee7bd764097815a0", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/SM.pl", "type": "file" }, { - "bom-ref": "7e6703cb144b7272", + "bom-ref": "b6542741338d0357", "name": "/usr/share/perl/5.38.2/unicore/lib/GCB/XX.pl", "type": "file" }, { - "bom-ref": "87221e2878bb99e4", + "bom-ref": "d4eda626d849de6d", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/C.pl", "type": "file" }, { - "bom-ref": "94b706f1f47a13ec", + "bom-ref": "20f821c9002e7fcd", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Cf.pl", "type": "file" }, { - "bom-ref": "31b9768ba41e71bd", + "bom-ref": "5f984c6b76a93b8c", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Cn.pl", "type": "file" }, { - "bom-ref": "da23d99240100946", + "bom-ref": "c1a22b14ac9de6e7", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/L.pl", "type": "file" }, { - "bom-ref": "9353b81c3e49f346", + "bom-ref": "48a88377e885fb0b", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/LC.pl", "type": "file" }, { - "bom-ref": "f09caf77ab30d574", + "bom-ref": "daf99487bfd29d59", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Ll.pl", "type": "file" }, { - "bom-ref": "afed30f0e20434fd", + "bom-ref": "4c9ea66e69b71584", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Lm.pl", "type": "file" }, { - "bom-ref": "8bda75bd95350796", + "bom-ref": "e9caea3440cdde0b", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Lo.pl", "type": "file" }, { - "bom-ref": "f4dca0aece46892e", + "bom-ref": "eebc24a2e95a4fa7", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Lu.pl", "type": "file" }, { - "bom-ref": "0d2534f417b82a96", + "bom-ref": "22845f3427e611fb", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/M.pl", "type": "file" }, { - "bom-ref": "2ec89165cd975a30", + "bom-ref": "048a724f6dd809e5", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Mc.pl", "type": "file" }, { - "bom-ref": "b70d02568cd4f336", + "bom-ref": "086efe6256f4007f", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Me.pl", "type": "file" }, { - "bom-ref": "1b3d9f50c428c6b4", + "bom-ref": "e61e58b9fb5ca31d", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Mn.pl", "type": "file" }, { - "bom-ref": "6c06d254d008f6a5", + "bom-ref": "af150280ced624c4", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/N.pl", "type": "file" }, { - "bom-ref": "154c387a5fadb0f8", + "bom-ref": "3a43f870ac4f01e1", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Nd.pl", "type": "file" }, { - "bom-ref": "bd096c42e505afa7", + "bom-ref": "a13b5ba7bc2f033a", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Nl.pl", "type": "file" }, { - "bom-ref": "499cc8b4f6801c50", + "bom-ref": "66d83e1775448105", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/No.pl", "type": "file" }, { - "bom-ref": "aa7eaa313f6839f2", + "bom-ref": "4194235a55c882af", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/P.pl", "type": "file" }, { - "bom-ref": "35d2e531f3ad48ec", + "bom-ref": "21fc544bc03bbba5", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Pc.pl", "type": "file" }, { - "bom-ref": "7e34dd22148c6690", + "bom-ref": "ad2ec270ffd71d15", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Pd.pl", "type": "file" }, { - "bom-ref": "b310f4daf5e3dee3", + "bom-ref": "55afee43edd3e706", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Pe.pl", "type": "file" }, { - "bom-ref": "bde53fa6793ac2e0", + "bom-ref": "3a62815ce2b21d99", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Pf.pl", "type": "file" }, { - "bom-ref": "f7bc228d4485af80", + "bom-ref": "b9b074ab7035f495", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Pi.pl", "type": "file" }, { - "bom-ref": "fc4a601110851e45", + "bom-ref": "28c3b26a07bc545c", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Po.pl", "type": "file" }, { - "bom-ref": "fc5b9fea63da670d", + "bom-ref": "4bac608c91f859cc", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Ps.pl", "type": "file" }, { - "bom-ref": "15a6dcc64bd4d282", + "bom-ref": "1cbe6b13dc20a227", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/S.pl", "type": "file" }, { - "bom-ref": "25d5cdd1fcb44456", + "bom-ref": "644e0b0b6740adcb", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Sc.pl", "type": "file" }, { - "bom-ref": "9a448c01134e0089", + "bom-ref": "84cea04b0dd855fc", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Sk.pl", "type": "file" }, { - "bom-ref": "1642f67184a98a0a", + "bom-ref": "69cfd7189ee657ab", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Sm.pl", "type": "file" }, { - "bom-ref": "145e4593ac1100b2", + "bom-ref": "92573ef2f75d5b6b", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/So.pl", "type": "file" }, { - "bom-ref": "51b8cf2a554c06de", + "bom-ref": "9151dc52ebf1eb1f", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Z.pl", "type": "file" }, { - "bom-ref": "00084da740201442", + "bom-ref": "8593dde08e1bc043", "name": "/usr/share/perl/5.38.2/unicore/lib/Gc/Zs.pl", "type": "file" }, { - "bom-ref": "d90b88ea7fb8dab6", + "bom-ref": "582a5f8909dbe98f", "name": "/usr/share/perl/5.38.2/unicore/lib/GrBase/Y.pl", "type": "file" }, { - "bom-ref": "998562eac2ae9f27", + "bom-ref": "e703d6366c2d43be", "name": "/usr/share/perl/5.38.2/unicore/lib/GrExt/Y.pl", "type": "file" }, { - "bom-ref": "2bc93b0136938c25", + "bom-ref": "7576685860904440", "name": "/usr/share/perl/5.38.2/unicore/lib/Hex/Y.pl", "type": "file" }, { - "bom-ref": "b68342ef7ff02bf0", + "bom-ref": "a0110e4aeddbe3d1", "name": "/usr/share/perl/5.38.2/unicore/lib/Hst/NA.pl", "type": "file" }, { - "bom-ref": "b2d351dd0abac62e", + "bom-ref": "b622c8e341cb7217", "name": "/usr/share/perl/5.38.2/unicore/lib/Hyphen/T.pl", "type": "file" }, { - "bom-ref": "ab2ff1f8ddd4fb76", + "bom-ref": "087581199a9e3b2b", "name": "/usr/share/perl/5.38.2/unicore/lib/IDC/Y.pl", "type": "file" }, { - "bom-ref": "a7c7aa74580934a5", + "bom-ref": "2a6b20c4ca39b0e4", "name": "/usr/share/perl/5.38.2/unicore/lib/IDS/Y.pl", "type": "file" }, { - "bom-ref": "1d605372e377187d", + "bom-ref": "7f1957a68f0533f0", "name": "/usr/share/perl/5.38.2/unicore/lib/IdStatus/Allowed.pl", "type": "file" }, { - "bom-ref": "2c800160c8e26c99", + "bom-ref": "f01015897106254c", "name": "/usr/share/perl/5.38.2/unicore/lib/IdStatus/Restrict.pl", "type": "file" }, { - "bom-ref": "023829b6114faa46", + "bom-ref": "a61f0a36714858c3", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/DefaultI.pl", "type": "file" }, { - "bom-ref": "3906e116e02cd7d6", + "bom-ref": "5eba46b2490c54b7", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Exclusio.pl", "type": "file" }, { - "bom-ref": "7a89fd4265b1dffc", + "bom-ref": "3f2fbfaef1248c75", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Inclusio.pl", "type": "file" }, { - "bom-ref": "2731cb0ea6f43960", + "bom-ref": "f3538515e0117249", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/LimitedU.pl", "type": "file" }, { - "bom-ref": "8fc22d8513ed4d71", + "bom-ref": "0ffc4f2b5a15edb0", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/NotChara.pl", "type": "file" }, { - "bom-ref": "a81c2d0f77b8d6d1", + "bom-ref": "177f07311b93b2c0", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/NotNFKC.pl", "type": "file" }, { - "bom-ref": "5a63187add7c60fc", + "bom-ref": "25c6e2990ff4d295", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/NotXID.pl", "type": "file" }, { - "bom-ref": "47a5b439d4819a3b", + "bom-ref": "560ad422a91aa6e2", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Obsolete.pl", "type": "file" }, { - "bom-ref": "17ccdf34da7bb606", + "bom-ref": "a43870515bb635b3", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Recommen.pl", "type": "file" }, { - "bom-ref": "d3208f7abbba3d0e", + "bom-ref": "fa0eb4e97c5c9177", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Technica.pl", "type": "file" }, { - "bom-ref": "b019857e35200e33", + "bom-ref": "5a3ba8d03f83752e", "name": "/usr/share/perl/5.38.2/unicore/lib/IdType/Uncommon.pl", "type": "file" }, { - "bom-ref": "1120db82106f797b", + "bom-ref": "d74befb326a7938a", "name": "/usr/share/perl/5.38.2/unicore/lib/Ideo/Y.pl", "type": "file" }, { - "bom-ref": "97e70b55c4e48ecd", + "bom-ref": "c78744c9511c17e8", "name": "/usr/share/perl/5.38.2/unicore/lib/In/10_0.pl", "type": "file" }, { - "bom-ref": "3065effccad71a5d", + "bom-ref": "73deb70f9287be84", "name": "/usr/share/perl/5.38.2/unicore/lib/In/11_0.pl", "type": "file" }, { - "bom-ref": "de1496209db38cca", + "bom-ref": "5e0ee19b4f5db9eb", "name": "/usr/share/perl/5.38.2/unicore/lib/In/12_0.pl", "type": "file" }, { - "bom-ref": "b29c6501b6f8a0c7", + "bom-ref": "fba6244db5c6d7fa", "name": "/usr/share/perl/5.38.2/unicore/lib/In/12_1.pl", "type": "file" }, { - "bom-ref": "bd5ba9e12c001126", + "bom-ref": "1ee02388b3080963", "name": "/usr/share/perl/5.38.2/unicore/lib/In/13_0.pl", "type": "file" }, { - "bom-ref": "5b93dad75158f09d", + "bom-ref": "58fb7db69a4754f8", "name": "/usr/share/perl/5.38.2/unicore/lib/In/14_0.pl", "type": "file" }, { - "bom-ref": "c7d51beef3950ca1", + "bom-ref": "1ca45c7d9f193ce4", "name": "/usr/share/perl/5.38.2/unicore/lib/In/15_0.pl", "type": "file" }, { - "bom-ref": "5c15f851fb4c965e", + "bom-ref": "6cc4bc54cf68728f", "name": "/usr/share/perl/5.38.2/unicore/lib/In/2_0.pl", "type": "file" }, { - "bom-ref": "a5b1ac79539a40cf", + "bom-ref": "6c666f19e01b436e", "name": "/usr/share/perl/5.38.2/unicore/lib/In/2_1.pl", "type": "file" }, { - "bom-ref": "ffd041a164fc1ed9", + "bom-ref": "a37455273baef934", "name": "/usr/share/perl/5.38.2/unicore/lib/In/3_0.pl", "type": "file" }, { - "bom-ref": "68cebb3d41a53a50", + "bom-ref": "aef8d18d99becf41", "name": "/usr/share/perl/5.38.2/unicore/lib/In/3_1.pl", "type": "file" }, { - "bom-ref": "41fd4653444420ba", + "bom-ref": "06a7e62c34fe143b", "name": "/usr/share/perl/5.38.2/unicore/lib/In/3_2.pl", "type": "file" }, { - "bom-ref": "a443536edd12c5dc", + "bom-ref": "4a1f4d044e6ba26d", "name": "/usr/share/perl/5.38.2/unicore/lib/In/4_0.pl", "type": "file" }, { - "bom-ref": "ce7e9c5b376f6117", + "bom-ref": "3b4ab393d84c9a9e", "name": "/usr/share/perl/5.38.2/unicore/lib/In/4_1.pl", "type": "file" }, { - "bom-ref": "9b17589ccd0594f7", + "bom-ref": "a6a4e10eada4c912", "name": "/usr/share/perl/5.38.2/unicore/lib/In/5_0.pl", "type": "file" }, { - "bom-ref": "9f4ed9996909ad73", + "bom-ref": "6b098b2233a57552", "name": "/usr/share/perl/5.38.2/unicore/lib/In/5_1.pl", "type": "file" }, { - "bom-ref": "7d672c1906060c3a", + "bom-ref": "8cbc2b32743460cb", "name": "/usr/share/perl/5.38.2/unicore/lib/In/5_2.pl", "type": "file" }, { - "bom-ref": "2ea5a9565530a6cb", + "bom-ref": "988308e7aa44cb3a", "name": "/usr/share/perl/5.38.2/unicore/lib/In/6_0.pl", "type": "file" }, { - "bom-ref": "2c328000286b54c6", + "bom-ref": "bcbc211b4d7e39ef", "name": "/usr/share/perl/5.38.2/unicore/lib/In/6_1.pl", "type": "file" }, { - "bom-ref": "4524ae3f33f819a7", + "bom-ref": "a2ba1787e5df8e6a", "name": "/usr/share/perl/5.38.2/unicore/lib/In/6_2.pl", "type": "file" }, { - "bom-ref": "96948a044b39869d", + "bom-ref": "5508515ec8f99260", "name": "/usr/share/perl/5.38.2/unicore/lib/In/6_3.pl", "type": "file" }, { - "bom-ref": "8089d333ed4c0b59", + "bom-ref": "f80af17eaaa2cd7c", "name": "/usr/share/perl/5.38.2/unicore/lib/In/7_0.pl", "type": "file" }, { - "bom-ref": "361d3828fc4895f6", + "bom-ref": "8bd0fed8c36d2c57", "name": "/usr/share/perl/5.38.2/unicore/lib/In/8_0.pl", "type": "file" }, { - "bom-ref": "7c8dc147960b56de", + "bom-ref": "007e3e310a9fee37", "name": "/usr/share/perl/5.38.2/unicore/lib/In/9_0.pl", "type": "file" }, { - "bom-ref": "5e716ea06b71d748", + "bom-ref": "3757173cd931306d", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/Bottom.pl", "type": "file" }, { - "bom-ref": "db5761299a9c8d54", + "bom-ref": "3764da61c93a1bad", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/BottomAn.pl", "type": "file" }, { - "bom-ref": "41ff03bc18d0b197", + "bom-ref": "bae537828aa06e1e", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/Left.pl", "type": "file" }, { - "bom-ref": "5011950d5c7e2147", + "bom-ref": "9462419320343fea", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/LeftAndR.pl", "type": "file" }, { - "bom-ref": "39fd99ba6d310f4b", + "bom-ref": "93e3af11d40a51ee", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/NA.pl", "type": "file" }, { - "bom-ref": "5a9143ffc87ad8f2", + "bom-ref": "3aceccbc6adfe70b", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/Overstru.pl", "type": "file" }, { - "bom-ref": "6a59b09367c723a2", + "bom-ref": "44e434db1827ef93", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/Right.pl", "type": "file" }, { - "bom-ref": "28f79e448622d773", + "bom-ref": "fda64c986dd78bba", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/Top.pl", "type": "file" }, { - "bom-ref": "cc7330efd95a8b66", + "bom-ref": "e92c15bfd794e74b", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/TopAndBo.pl", "type": "file" }, { - "bom-ref": "3de39c99a5a1fc7c", + "bom-ref": "836d89c270583689", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/TopAndL2.pl", "type": "file" }, { - "bom-ref": "24b0ac539b7d548e", + "bom-ref": "c62279645cc1c6d7", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/TopAndLe.pl", "type": "file" }, { - "bom-ref": "d8f37bacd5d21912", + "bom-ref": "a722765218d470d3", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/TopAndRi.pl", "type": "file" }, { - "bom-ref": "504fe3f41e77a513", + "bom-ref": "e2a1009ace528f92", "name": "/usr/share/perl/5.38.2/unicore/lib/InPC/VisualOr.pl", "type": "file" }, { - "bom-ref": "2d3ebaab3b912788", + "bom-ref": "5f7b8e382355741d", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Avagraha.pl", "type": "file" }, { - "bom-ref": "be09ba2c5a157bc1", + "bom-ref": "9c0a20cd5e2a04fc", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Bindu.pl", "type": "file" }, { - "bom-ref": "86a4c859310d502a", + "bom-ref": "870bcd82940393c7", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Cantilla.pl", "type": "file" }, { - "bom-ref": "f7b41849e10a3d46", + "bom-ref": "d9ec3862eacf5f8b", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona2.pl", "type": "file" }, { - "bom-ref": "14011da4f8dc0198", + "bom-ref": "4f78327d15359a91", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona3.pl", "type": "file" }, { - "bom-ref": "9acbd87f8914906f", + "bom-ref": "9ec237b0bd518392", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona4.pl", "type": "file" }, { - "bom-ref": "e3f4a25c94830b18", + "bom-ref": "39ae884ba1177911", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona5.pl", "type": "file" }, { - "bom-ref": "d32da727d4a48412", + "bom-ref": "f2c8c37efeefc9d3", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona6.pl", "type": "file" }, { - "bom-ref": "c1e9167ebd084620", + "bom-ref": "b85c47ea70f222d9", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona7.pl", "type": "file" }, { - "bom-ref": "e8b35c855e7c8864", + "bom-ref": "3641f8e251728001", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona8.pl", "type": "file" }, { - "bom-ref": "97cd2e7330706929", + "bom-ref": "419221d3029faee8", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consona9.pl", "type": "file" }, { - "bom-ref": "ecb0e2cd50858738", + "bom-ref": "d932047393b12fe9", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Consonan.pl", "type": "file" }, { - "bom-ref": "fde0ea98f25688d1", + "bom-ref": "06697c29f3cfb914", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Geminati.pl", "type": "file" }, { - "bom-ref": "9879c62f42475489", + "bom-ref": "da12ea7186af3588", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Invisibl.pl", "type": "file" }, { - "bom-ref": "b09d1eb9a933bbd2", + "bom-ref": "56273b36fc3dafdb", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Nukta.pl", "type": "file" }, { - "bom-ref": "e835833252219a4f", + "bom-ref": "d801fcae89ccae12", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Number.pl", "type": "file" }, { - "bom-ref": "60e0960419744bc2", + "bom-ref": "6308112517617fdf", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Other.pl", "type": "file" }, { - "bom-ref": "c97429ec79480057", + "bom-ref": "fc73125c0aea6dce", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/PureKill.pl", "type": "file" }, { - "bom-ref": "f09deb6256d1a381", + "bom-ref": "db7037a7984d0a98", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Syllable.pl", "type": "file" }, { - "bom-ref": "e1db4e5d0511dbc1", + "bom-ref": "1ecb88bab0cf3d98", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/ToneMark.pl", "type": "file" }, { - "bom-ref": "cbc602a4ddf1fb86", + "bom-ref": "93b0f96e0e3b4e53", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Virama.pl", "type": "file" }, { - "bom-ref": "9ca837200e9f3e62", + "bom-ref": "4674de1a0628d373", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Visarga.pl", "type": "file" }, { - "bom-ref": "ffddf02e6b9d1672", + "bom-ref": "568133797bc5ffdb", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/Vowel.pl", "type": "file" }, { - "bom-ref": "968db494b3bcbc3c", + "bom-ref": "33efa2799be41699", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/VowelDep.pl", "type": "file" }, { - "bom-ref": "f4664036c9494134", + "bom-ref": "d612abd3576f07d5", "name": "/usr/share/perl/5.38.2/unicore/lib/InSC/VowelInd.pl", "type": "file" }, { - "bom-ref": "50d4646cc9ded489", + "bom-ref": "36cff36649a33de4", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Ain.pl", "type": "file" }, { - "bom-ref": "de5f47157278fa8c", + "bom-ref": "4a448afca029ae65", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Alef.pl", "type": "file" }, { - "bom-ref": "6514253520cb3e61", + "bom-ref": "b08e2601248bcf54", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Beh.pl", "type": "file" }, { - "bom-ref": "d491468970518bb8", + "bom-ref": "9b3c62ec3557174d", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Dal.pl", "type": "file" }, { - "bom-ref": "4df8d0775628d68c", + "bom-ref": "fc50463d9059a829", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/FarsiYeh.pl", "type": "file" }, { - "bom-ref": "60336304b845fa6e", + "bom-ref": "fc6addf3aeaa9f57", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Feh.pl", "type": "file" }, { - "bom-ref": "137b78de590d8524", + "bom-ref": "2dc3059368d03951", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Gaf.pl", "type": "file" }, { - "bom-ref": "3441e24bbfbb0e3f", + "bom-ref": "2e2f8bdadd7fdf4e", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Hah.pl", "type": "file" }, { - "bom-ref": "88a589f66c89d14f", + "bom-ref": "eb922ce3141fec02", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/HanifiRo.pl", "type": "file" }, { - "bom-ref": "b8dff1839ecf1710", + "bom-ref": "01547ba0fbba8a65", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Kaf.pl", "type": "file" }, { - "bom-ref": "74b4e9713cbb1d03", + "bom-ref": "a6cdd195ff41877a", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Lam.pl", "type": "file" }, { - "bom-ref": "faca93a6bd7e4b60", + "bom-ref": "717a14d377bf2ab1", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/NoJoinin.pl", "type": "file" }, { - "bom-ref": "ee7f17759a8e0212", + "bom-ref": "34e8a7fd098b2a6b", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Noon.pl", "type": "file" }, { - "bom-ref": "73dc8723d83e02d5", + "bom-ref": "4506a332a5a012bc", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Qaf.pl", "type": "file" }, { - "bom-ref": "720fd08135b48639", + "bom-ref": "b883e707cb18c13c", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Reh.pl", "type": "file" }, { - "bom-ref": "900b851a1a78a640", + "bom-ref": "9cd4138ba29fe595", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Sad.pl", "type": "file" }, { - "bom-ref": "fce48b10ffddf5e9", + "bom-ref": "434c597a2b971194", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Seen.pl", "type": "file" }, { - "bom-ref": "27135528a5cfcc33", + "bom-ref": "f68f200b675e1376", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Tah.pl", "type": "file" }, { - "bom-ref": "f590a0d99349af7f", + "bom-ref": "264a3d811cfae45a", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Waw.pl", "type": "file" }, { - "bom-ref": "198f24cea76cac6d", + "bom-ref": "77ec019a46fb1ed0", "name": "/usr/share/perl/5.38.2/unicore/lib/Jg/Yeh.pl", "type": "file" }, { - "bom-ref": "95cf5752823fd4cf", + "bom-ref": "f305a9b20d609396", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/C.pl", "type": "file" }, { - "bom-ref": "80beb707baec52be", + "bom-ref": "f0f0981191b49997", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/D.pl", "type": "file" }, { - "bom-ref": "e31707e253510c63", + "bom-ref": "a4041edc2c1f104e", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/L.pl", "type": "file" }, { - "bom-ref": "e18b7898eff6cea6", + "bom-ref": "dbfe3c86d67c38b3", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/R.pl", "type": "file" }, { - "bom-ref": "f01126b14c3df54f", + "bom-ref": "f76cf99ed22c653a", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/T.pl", "type": "file" }, { - "bom-ref": "8c5b6b392eb56149", + "bom-ref": "0a8ef9b4d64a80cc", "name": "/usr/share/perl/5.38.2/unicore/lib/Jt/U.pl", "type": "file" }, { - "bom-ref": "b76e37a427cd0543", + "bom-ref": "d37688b9eabe253e", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/AI.pl", "type": "file" }, { - "bom-ref": "99bd55276ff92530", + "bom-ref": "2c9a5947db817785", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/AL.pl", "type": "file" }, { - "bom-ref": "e10432cee1bea229", + "bom-ref": "8f1ced2dc4dbcefc", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/BA.pl", "type": "file" }, { - "bom-ref": "236fd10f4f12c93a", + "bom-ref": "ed2c654c57afa75b", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/BB.pl", "type": "file" }, { - "bom-ref": "4fade7238b1f9320", + "bom-ref": "bdc4f3eaf722df05", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/CJ.pl", "type": "file" }, { - "bom-ref": "19c7bb689d9153aa", + "bom-ref": "f0d9d5fbfb66e61b", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/CL.pl", "type": "file" }, { - "bom-ref": "bbfafe6a38d4adeb", + "bom-ref": "79a96406bbfbda76", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/CM.pl", "type": "file" }, { - "bom-ref": "229f2a9d17c9af74", + "bom-ref": "1557af4d92512251", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/EX.pl", "type": "file" }, { - "bom-ref": "a3cc44307ffdc666", + "bom-ref": "0d4c5f19cb751dbf", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/GL.pl", "type": "file" }, { - "bom-ref": "2ffd8e135597b63d", + "bom-ref": "30aecce8ee0c5f68", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/ID.pl", "type": "file" }, { - "bom-ref": "5d48ffe37503d3c6", + "bom-ref": "7f5b05b6a35ae3df", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/IN.pl", "type": "file" }, { - "bom-ref": "79f852e878b40873", + "bom-ref": "4db34cfcae22c186", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/IS.pl", "type": "file" }, { - "bom-ref": "658eed9e03de8529", + "bom-ref": "cf223a4f6b71fd54", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/NS.pl", "type": "file" }, { - "bom-ref": "2810c69617429bc4", + "bom-ref": "a3899aebc29650c1", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/NU.pl", "type": "file" }, { - "bom-ref": "c55988bb6609e474", + "bom-ref": "33b1877f82be4d15", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/OP.pl", "type": "file" }, { - "bom-ref": "f986f3e0521df7c8", + "bom-ref": "6387895efea5383d", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/PO.pl", "type": "file" }, { - "bom-ref": "0601a1b1441f27dc", + "bom-ref": "fbc537b250a54ebd", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/PR.pl", "type": "file" }, { - "bom-ref": "d1bd8a50b56b736e", + "bom-ref": "6b72432a2f9846f7", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/QU.pl", "type": "file" }, { - "bom-ref": "a58e45d30f248754", + "bom-ref": "577232cbf0a0ba6d", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/SA.pl", "type": "file" }, { - "bom-ref": "5df09535af101a88", + "bom-ref": "8c16e7e5239257a1", "name": "/usr/share/perl/5.38.2/unicore/lib/Lb/XX.pl", "type": "file" }, { - "bom-ref": "4fef5a837bfd93a2", + "bom-ref": "0b367beadfe57b77", "name": "/usr/share/perl/5.38.2/unicore/lib/Lower/Y.pl", "type": "file" }, { - "bom-ref": "998c0a640ca054ad", + "bom-ref": "ba7a77b81f9fe738", "name": "/usr/share/perl/5.38.2/unicore/lib/Math/Y.pl", "type": "file" }, { - "bom-ref": "3f6e819f0ddffd52", + "bom-ref": "b2ea59bdb36b7c4b", "name": "/usr/share/perl/5.38.2/unicore/lib/NFCQC/M.pl", "type": "file" }, { - "bom-ref": "df7987e6af6b5fbd", + "bom-ref": "e9d175a824974c08", "name": "/usr/share/perl/5.38.2/unicore/lib/NFCQC/Y.pl", "type": "file" }, { - "bom-ref": "094ca48df165d037", + "bom-ref": "c1cd157d35ea7f62", "name": "/usr/share/perl/5.38.2/unicore/lib/NFDQC/N.pl", "type": "file" }, { - "bom-ref": "a4ee415d224ee872", + "bom-ref": "ca8545d09418d41b", "name": "/usr/share/perl/5.38.2/unicore/lib/NFDQC/Y.pl", "type": "file" }, { - "bom-ref": "886b354555b83e5f", + "bom-ref": "6afd8244eef7018e", "name": "/usr/share/perl/5.38.2/unicore/lib/NFKCQC/N.pl", "type": "file" }, { - "bom-ref": "01fb8eae47dc7d81", + "bom-ref": "5a9c8c049b2ca960", "name": "/usr/share/perl/5.38.2/unicore/lib/NFKCQC/Y.pl", "type": "file" }, { - "bom-ref": "a976e37b4952a4a8", + "bom-ref": "f5da2d179c4bd295", "name": "/usr/share/perl/5.38.2/unicore/lib/NFKDQC/N.pl", "type": "file" }, { - "bom-ref": "1d7fb460a49d51fe", + "bom-ref": "f0c742f1a354ed9f", "name": "/usr/share/perl/5.38.2/unicore/lib/NFKDQC/Y.pl", "type": "file" }, { - "bom-ref": "3f54fb59f0ff6a30", + "bom-ref": "96cbb1855429d42d", "name": "/usr/share/perl/5.38.2/unicore/lib/Nt/Di.pl", "type": "file" }, { - "bom-ref": "1eb38fccc8e04d5d", + "bom-ref": "f37f7479e8a38690", "name": "/usr/share/perl/5.38.2/unicore/lib/Nt/None.pl", "type": "file" }, { - "bom-ref": "99d8b96f4bd085f4", + "bom-ref": "dfca3d0b74dd43f9", "name": "/usr/share/perl/5.38.2/unicore/lib/Nt/Nu.pl", "type": "file" }, { - "bom-ref": "fe4e3811367f6c85", + "bom-ref": "a4be1a449cf4400c", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/0.pl", "type": "file" }, { - "bom-ref": "6a05c1449ca3079c", + "bom-ref": "cd4eed7ad4a82671", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1.pl", "type": "file" }, { - "bom-ref": "315e76f18a54d83b", + "bom-ref": "448ecb4f9e4361c6", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/10.pl", "type": "file" }, { - "bom-ref": "9832287586561989", + "bom-ref": "9fe2bb60c1883730", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/100.pl", "type": "file" }, { - "bom-ref": "1db0faf30410b20e", + "bom-ref": "c442e7656f488ff7", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1000.pl", "type": "file" }, { - "bom-ref": "16bd4fcdf4bf9469", + "bom-ref": "fc04e3d04c7a6a1c", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/10000.pl", "type": "file" }, { - "bom-ref": "4539b2602e94cb32", + "bom-ref": "2f33f5b9ab4962a7", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/100000.pl", "type": "file" }, { - "bom-ref": "1149ba0a9f6d1a23", + "bom-ref": "c8bf63f8ee0109e6", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/11.pl", "type": "file" }, { - "bom-ref": "d783d73653c6875a", + "bom-ref": "b34b8a8193ade07b", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/12.pl", "type": "file" }, { - "bom-ref": "f0e93ecaa83777de", + "bom-ref": "f59a740533cd3b63", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/13.pl", "type": "file" }, { - "bom-ref": "189e9f4d55302a9f", + "bom-ref": "79855dfadd8286fe", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/14.pl", "type": "file" }, { - "bom-ref": "406e938fd9073f2b", + "bom-ref": "99fd16649ace2412", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/15.pl", "type": "file" }, { - "bom-ref": "fdd58a5226802dff", + "bom-ref": "7bd6a167761e3aea", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/16.pl", "type": "file" }, { - "bom-ref": "9389cc3b75693b5f", + "bom-ref": "b08c2c641213f632", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/17.pl", "type": "file" }, { - "bom-ref": "a1690b48e02ab1d5", + "bom-ref": "0c8ff9c6af2d59e0", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/18.pl", "type": "file" }, { - "bom-ref": "6d596d1b6cb1c681", + "bom-ref": "8f9b7af978220598", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/19.pl", "type": "file" }, { - "bom-ref": "e603ac28034b5fea", + "bom-ref": "857cb5af302dc9d7", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_16.pl", "type": "file" }, { - "bom-ref": "fe2a44e1db99f7b0", + "bom-ref": "a3f9e842798e2531", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_2.pl", "type": "file" }, { - "bom-ref": "dced1dd09a3dfefb", + "bom-ref": "1b7a6fe9a0b5708e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_3.pl", "type": "file" }, { - "bom-ref": "f1faddaf9f216a13", + "bom-ref": "b16177fbfbbc670a", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_4.pl", "type": "file" }, { - "bom-ref": "91e8186513b4695d", + "bom-ref": "ff7000a08fa4d3d4", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_6.pl", "type": "file" }, { - "bom-ref": "e0261a55b8aaee09", + "bom-ref": "f27262c9d09fecb0", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/1_8.pl", "type": "file" }, { - "bom-ref": "0cccf0fdfe1982af", + "bom-ref": "ede51e5b90b5067e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/2.pl", "type": "file" }, { - "bom-ref": "8f617fdc7802be4d", + "bom-ref": "c8a331a8a2fbeb98", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/20.pl", "type": "file" }, { - "bom-ref": "ed4a66735b03bc47", + "bom-ref": "90cbd51827e87a0e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/200.pl", "type": "file" }, { - "bom-ref": "fee0a2f604a82c9d", + "bom-ref": "a2839745b3d80130", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/2000.pl", "type": "file" }, { - "bom-ref": "afd77b789b81bc55", + "bom-ref": "711d6b28c4e43834", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/20000.pl", "type": "file" }, { - "bom-ref": "ee17579515d84235", + "bom-ref": "a288774e38694bf8", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/2_3.pl", "type": "file" }, { - "bom-ref": "fd9283fe2e72371c", + "bom-ref": "74d0ff83bd1be569", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/3.pl", "type": "file" }, { - "bom-ref": "055e9627e00b7f88", + "bom-ref": "4c7e5539bafb1115", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/30.pl", "type": "file" }, { - "bom-ref": "c00700b6783d8b2d", + "bom-ref": "0c9c8fa6d801b770", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/300.pl", "type": "file" }, { - "bom-ref": "6c49c2a918ba80f1", + "bom-ref": "fa5621f0afc2e9ac", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/3000.pl", "type": "file" }, { - "bom-ref": "2cfeaf618eb0d603", + "bom-ref": "28ab23b35e81da2a", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/30000.pl", "type": "file" }, { - "bom-ref": "dc9fcca2f3e242f2", + "bom-ref": "7169eb9d849de427", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/3_16.pl", "type": "file" }, { - "bom-ref": "3522dd10679d4170", + "bom-ref": "3596b5a0b416337d", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/3_4.pl", "type": "file" }, { - "bom-ref": "02ca3e09c14c9507", + "bom-ref": "4702a0ec45080dae", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/4.pl", "type": "file" }, { - "bom-ref": "26a8a358ed75e0b7", + "bom-ref": "bd8e5610eee2b6fa", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/40.pl", "type": "file" }, { - "bom-ref": "41a0f7e306a701f1", + "bom-ref": "3c8921331a425f60", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/400.pl", "type": "file" }, { - "bom-ref": "9e95688a15125d01", + "bom-ref": "f35566385c26513c", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/4000.pl", "type": "file" }, { - "bom-ref": "588183eaeebb0aee", + "bom-ref": "a34a3ae6884d6edf", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/40000.pl", "type": "file" }, { - "bom-ref": "0d2b54ca151b3ba4", + "bom-ref": "5b90fae121deee9d", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/5.pl", "type": "file" }, { - "bom-ref": "300b246d309cf82c", + "bom-ref": "1e8c8ed08c51e609", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/50.pl", "type": "file" }, { - "bom-ref": "ac01353a3ac3c099", + "bom-ref": "e63e127b1953d830", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/500.pl", "type": "file" }, { - "bom-ref": "f01e7d7120a6988e", + "bom-ref": "258176d0d37672c7", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/5000.pl", "type": "file" }, { - "bom-ref": "2f1b3b1b41a07e90", + "bom-ref": "0bd77748a99fc3c9", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/50000.pl", "type": "file" }, { - "bom-ref": "7119a2e8c19f2c58", + "bom-ref": "54f8136bb2191111", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/6.pl", "type": "file" }, { - "bom-ref": "2d2ac68da29eb943", + "bom-ref": "262416f9985d7416", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/60.pl", "type": "file" }, { - "bom-ref": "bc0d52bd8170e217", + "bom-ref": "0bfe8111b76f56f6", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/600.pl", "type": "file" }, { - "bom-ref": "d8a4d6e70a2eb417", + "bom-ref": "91551ad3a4326666", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/6000.pl", "type": "file" }, { - "bom-ref": "40a27ceb8ef7b5d5", + "bom-ref": "f0f2245ccc4cb2f4", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/60000.pl", "type": "file" }, { - "bom-ref": "957ead3159f83932", + "bom-ref": "92729bbf05844583", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/7.pl", "type": "file" }, { - "bom-ref": "33047ad90b1d7a81", + "bom-ref": "3932f3ecb545df5c", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/70.pl", "type": "file" }, { - "bom-ref": "399da6f36aa7ad81", + "bom-ref": "a83f502eafcb283c", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/700.pl", "type": "file" }, { - "bom-ref": "a5f7cf0711d1bfae", + "bom-ref": "3f7a6b6b6615c783", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/7000.pl", "type": "file" }, { - "bom-ref": "933949b025270600", + "bom-ref": "d379d5581511c461", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/70000.pl", "type": "file" }, { - "bom-ref": "4b8aaec3a5ed5b7d", + "bom-ref": "b77f1a24201b0abc", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/8.pl", "type": "file" }, { - "bom-ref": "abc2250c8cc440db", + "bom-ref": "ffe38eeddcea6dce", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/80.pl", "type": "file" }, { - "bom-ref": "ca3f8d787f06dedb", + "bom-ref": "606945f3e423504e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/800.pl", "type": "file" }, { - "bom-ref": "e08303f7d39cc343", + "bom-ref": "eeeda1dadbdb3bfa", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/8000.pl", "type": "file" }, { - "bom-ref": "da4bf62ae2aebc60", + "bom-ref": "4c939d6e5ff45f81", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/80000.pl", "type": "file" }, { - "bom-ref": "c6148e87b4828c9c", + "bom-ref": "d1b64d2bbc3e4e49", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/9.pl", "type": "file" }, { - "bom-ref": "b92140b0998636b7", + "bom-ref": "0aeee3d7d408395e", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/90.pl", "type": "file" }, { - "bom-ref": "6567380504dbb398", + "bom-ref": "c08d1cc0abcbc201", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/900.pl", "type": "file" }, { - "bom-ref": "2b6168a24d83da2e", + "bom-ref": "7d366ffcd714409f", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/9000.pl", "type": "file" }, { - "bom-ref": "cccbfb28956e59c4", + "bom-ref": "fc0f774b9c2a9799", "name": "/usr/share/perl/5.38.2/unicore/lib/Nv/90000.pl", "type": "file" }, { - "bom-ref": "66c4d4b196583f29", + "bom-ref": "4a888de9c7c4576c", "name": "/usr/share/perl/5.38.2/unicore/lib/PCM/Y.pl", "type": "file" }, { - "bom-ref": "9c666f625ab3c324", + "bom-ref": "39ddb2ed4686fe1d", "name": "/usr/share/perl/5.38.2/unicore/lib/PatSyn/Y.pl", "type": "file" }, { - "bom-ref": "252903d97c6a5ed8", + "bom-ref": "604e7c279754978d", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Alnum.pl", "type": "file" }, { - "bom-ref": "8a4f46ed97b90efe", + "bom-ref": "eba24e7456aadbc7", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Assigned.pl", "type": "file" }, { - "bom-ref": "d1858beaf84253ea", + "bom-ref": "b1992e78f07fc19b", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Blank.pl", "type": "file" }, { - "bom-ref": "b54e7610edd52ab7", + "bom-ref": "656718fff46deb8a", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Graph.pl", "type": "file" }, { - "bom-ref": "ac87b838ec144488", + "bom-ref": "c38067e4265c8589", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/PerlWord.pl", "type": "file" }, { - "bom-ref": "dcf1f00d79d4f13b", + "bom-ref": "ac056f9a245a2012", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/PosixPun.pl", "type": "file" }, { - "bom-ref": "8c9d058c1f9c4174", + "bom-ref": "229a3b03b81d0ff1", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Print.pl", "type": "file" }, { - "bom-ref": "c805d9e1f3b3f8e7", + "bom-ref": "26624217a0b2e266", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/SpacePer.pl", "type": "file" }, { - "bom-ref": "b72ca7c7953deeb1", + "bom-ref": "8e8192dadebe83e8", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Title.pl", "type": "file" }, { - "bom-ref": "4b18bf2e64d9f87f", + "bom-ref": "4f018c61f6f6fe16", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/Word.pl", "type": "file" }, { - "bom-ref": "b17fa798ab2a5267", + "bom-ref": "ba195d64154698aa", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/XPosixPu.pl", "type": "file" }, { - "bom-ref": "3e651c7102c4b663", + "bom-ref": "1c47ddb7b787e236", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlAny.pl", "type": "file" }, { - "bom-ref": "efad7b9a38742d15", + "bom-ref": "13f565cad0b97d4c", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlCh2.pl", "type": "file" }, { - "bom-ref": "6143f8f2425618ec", + "bom-ref": "1d7ec90a5a084659", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlCha.pl", "type": "file" }, { - "bom-ref": "0de44d21fd89cdd4", + "bom-ref": "4b82af87521c714d", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlFol.pl", "type": "file" }, { - "bom-ref": "affbb6179410b5e9", + "bom-ref": "13f616bab4276608", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlIDC.pl", "type": "file" }, { - "bom-ref": "f0f7509d164c7e84", + "bom-ref": "f2b8f54b7d4969a1", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlIDS.pl", "type": "file" }, { - "bom-ref": "59bf6d51e2427be1", + "bom-ref": "a5a42208a526f9d4", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlIsI.pl", "type": "file" }, { - "bom-ref": "c6ad94abe540dfd2", + "bom-ref": "508de7c68123a017", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlNch.pl", "type": "file" }, { - "bom-ref": "f99648331ea0ff92", + "bom-ref": "148205e0e47ae853", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlPat.pl", "type": "file" }, { - "bom-ref": "f6ce3f60f0f1797b", + "bom-ref": "0ab60e7a861b5dce", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlPr2.pl", "type": "file" }, { - "bom-ref": "afb49e719c3c0668", + "bom-ref": "980534a0640e2c41", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlPro.pl", "type": "file" }, { - "bom-ref": "0b8d73d336592757", + "bom-ref": "b0abc35532b82bfe", "name": "/usr/share/perl/5.38.2/unicore/lib/Perl/_PerlQuo.pl", "type": "file" }, { - "bom-ref": "490613bbb916578c", + "bom-ref": "ba69f85d9deed4ad", "name": "/usr/share/perl/5.38.2/unicore/lib/QMark/Y.pl", "type": "file" }, { - "bom-ref": "2d7dbf54393f1b14", + "bom-ref": "1bde301b5309bdcd", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/AT.pl", "type": "file" }, { - "bom-ref": "695d96b4cbf936fd", + "bom-ref": "600219ec6da5f5d4", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/CL.pl", "type": "file" }, { - "bom-ref": "d699a24178a8e6da", + "bom-ref": "24bce63613f43973", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/EX.pl", "type": "file" }, { - "bom-ref": "6ee8b715252e8628", + "bom-ref": "7c209e6ba9168a09", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/FO.pl", "type": "file" }, { - "bom-ref": "d6bf0845c980def6", + "bom-ref": "a79b9f902b9939a3", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/LE.pl", "type": "file" }, { - "bom-ref": "b945c8268f2ffede", + "bom-ref": "84a3414991233e43", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/LO.pl", "type": "file" }, { - "bom-ref": "e90eeb538fcdc5a0", + "bom-ref": "cbaffc952f510861", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/NU.pl", "type": "file" }, { - "bom-ref": "582660aca302efd9", + "bom-ref": "b697be42ce9fe324", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/SC.pl", "type": "file" }, { - "bom-ref": "c7172781bdd9b765", + "bom-ref": "81145a8ba89eb814", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/ST.pl", "type": "file" }, { - "bom-ref": "c82c911cea88f694", + "bom-ref": "96c653bdffd18871", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/Sp.pl", "type": "file" }, { - "bom-ref": "7b903a8d3b40f2dc", + "bom-ref": "135898b13b24dc09", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/UP.pl", "type": "file" }, { - "bom-ref": "377e176d022a2422", + "bom-ref": "c0ee7bed2d189977", "name": "/usr/share/perl/5.38.2/unicore/lib/SB/XX.pl", "type": "file" }, { - "bom-ref": "6f3695ff82955e3b", + "bom-ref": "be44643b5b8952f2", "name": "/usr/share/perl/5.38.2/unicore/lib/SD/Y.pl", "type": "file" }, { - "bom-ref": "53d02ee46d3798fc", + "bom-ref": "ca8dd993baa36321", "name": "/usr/share/perl/5.38.2/unicore/lib/STerm/Y.pl", "type": "file" }, { - "bom-ref": "1de163cd6e73fad4", + "bom-ref": "befd16a0962d57f9", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Arab.pl", "type": "file" }, { - "bom-ref": "b33e2ad675c87ec8", + "bom-ref": "bb9a59914f2d0785", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Beng.pl", "type": "file" }, { - "bom-ref": "4caea6abd4048148", + "bom-ref": "17004382c7c071ad", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Cprt.pl", "type": "file" }, { - "bom-ref": "9be194d0a4f148f3", + "bom-ref": "afbf2254fa84569e", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Cyrl.pl", "type": "file" }, { - "bom-ref": "304ea4f9f81d37a2", + "bom-ref": "295df5b3149dbeff", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Deva.pl", "type": "file" }, { - "bom-ref": "5c873567479aaee3", + "bom-ref": "eebd484333fa217e", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Dupl.pl", "type": "file" }, { - "bom-ref": "d4a4c8f172a7b078", + "bom-ref": "86cceca6f95a3f55", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Geor.pl", "type": "file" }, { - "bom-ref": "f2834efe64e67202", + "bom-ref": "46f9dafa7e0217ff", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Glag.pl", "type": "file" }, { - "bom-ref": "094a63745955d722", + "bom-ref": "898ad2c0b6f4a537", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Gong.pl", "type": "file" }, { - "bom-ref": "ec6d822b5f781f48", + "bom-ref": "f0c3f9a5ebfe4005", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Gonm.pl", "type": "file" }, { - "bom-ref": "c9357c9e215c3614", + "bom-ref": "d0278d4bd8e06409", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Gran.pl", "type": "file" }, { - "bom-ref": "15b3e847379d26e4", + "bom-ref": "2bdc76018adf7a31", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Grek.pl", "type": "file" }, { - "bom-ref": "3f0e0766cda7ec74", + "bom-ref": "d366feb600cc3139", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Gujr.pl", "type": "file" }, { - "bom-ref": "3323734141176586", + "bom-ref": "51c7fdd54b1ed15b", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Guru.pl", "type": "file" }, { - "bom-ref": "b871ac54149d420b", + "bom-ref": "7b96d6f5b1f8bc36", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Han.pl", "type": "file" }, { - "bom-ref": "65fe1169252b43e7", + "bom-ref": "68b9eb4338b277c6", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Hang.pl", "type": "file" }, { - "bom-ref": "b10c5fc4068457cc", + "bom-ref": "11cb03b605f60a89", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Hira.pl", "type": "file" }, { - "bom-ref": "1f198c05c6fd8c6a", + "bom-ref": "03d0e00c2d8e19a7", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Kana.pl", "type": "file" }, { - "bom-ref": "f76a5d05c86584fc", + "bom-ref": "83b2569cde8909e5", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Knda.pl", "type": "file" }, { - "bom-ref": "0f7141d00a8a94d5", + "bom-ref": "1f6a6998d6c7e6e0", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Latn.pl", "type": "file" }, { - "bom-ref": "a973dfc8fbafbe71", + "bom-ref": "1e6d621aa8f2f534", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Limb.pl", "type": "file" }, { - "bom-ref": "ae59314cae7276b0", + "bom-ref": "5e1acdbbec4b5739", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Linb.pl", "type": "file" }, { - "bom-ref": "521e1b74f0b583e0", + "bom-ref": "2fd3ed2949177519", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Mlym.pl", "type": "file" }, { - "bom-ref": "d8a1415c46de23af", + "bom-ref": "5657d42b7ac625aa", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Mong.pl", "type": "file" }, { - "bom-ref": "4f674725ddc556b8", + "bom-ref": "5b30c01650e139d1", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Mult.pl", "type": "file" }, { - "bom-ref": "7a48632a678d0457", + "bom-ref": "ff6e7590d4e76e4a", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Orya.pl", "type": "file" }, { - "bom-ref": "029881641d7a7967", + "bom-ref": "2ca0f59a2ac38faa", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Sinh.pl", "type": "file" }, { - "bom-ref": "78b84572489a1add", + "bom-ref": "23c4e852c77546f8", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Syrc.pl", "type": "file" }, { - "bom-ref": "41a4353533a4e8a9", + "bom-ref": "08993e5af913beb8", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Taml.pl", "type": "file" }, { - "bom-ref": "6f68b0b99ab70cc0", + "bom-ref": "26c4aff31705ac9d", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Telu.pl", "type": "file" }, { - "bom-ref": "a6d6038b8d561038", + "bom-ref": "b0e1e302e1748089", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Zinh.pl", "type": "file" }, { - "bom-ref": "4597961bf06da1c0", + "bom-ref": "f4ec20cdb13545ad", "name": "/usr/share/perl/5.38.2/unicore/lib/Sc/Zyyy.pl", "type": "file" }, { - "bom-ref": "195c27a283a82d2a", + "bom-ref": "f09e51af3e065d0f", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Adlm.pl", "type": "file" }, { - "bom-ref": "141d38bb1eb0c190", + "bom-ref": "8294857fe99f0ac9", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Arab.pl", "type": "file" }, { - "bom-ref": "00f91c99bf7e1a2a", + "bom-ref": "e77ec2080b18d0d7", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Armn.pl", "type": "file" }, { - "bom-ref": "b1eabf9cd3ff5625", + "bom-ref": "6b7318836c8a75b8", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Beng.pl", "type": "file" }, { - "bom-ref": "7665dd921b5f291e", + "bom-ref": "e79669821f8ad3fb", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Bhks.pl", "type": "file" }, { - "bom-ref": "656f5cc74d32a370", + "bom-ref": "6da779e20717bfe5", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Bopo.pl", "type": "file" }, { - "bom-ref": "11daacda5c886796", + "bom-ref": "edaca8c15418ca2b", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Cakm.pl", "type": "file" }, { - "bom-ref": "3eda3e784c28512c", + "bom-ref": "67dbdaec82f95c91", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Cham.pl", "type": "file" }, { - "bom-ref": "e9d009c3d6766793", + "bom-ref": "121370a830cab152", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Copt.pl", "type": "file" }, { - "bom-ref": "532699c26a8716bb", + "bom-ref": "b39d9f7dd7b67632", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Cprt.pl", "type": "file" }, { - "bom-ref": "5d7f0c6d47133568", + "bom-ref": "6b1487a0a207f6a1", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Cyrl.pl", "type": "file" }, { - "bom-ref": "3c1ac7f8bbf52119", + "bom-ref": "e1253ace685c9f84", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Deva.pl", "type": "file" }, { - "bom-ref": "e3a498c394abdf15", + "bom-ref": "70cf21492298bbc0", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Diak.pl", "type": "file" }, { - "bom-ref": "2dc515c5fb3e70ed", + "bom-ref": "c73fc43da8d7aff8", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Dupl.pl", "type": "file" }, { - "bom-ref": "6e3ce07284fbc773", + "bom-ref": "d2950105ea86a442", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Ethi.pl", "type": "file" }, { - "bom-ref": "808063207bceef4f", + "bom-ref": "8c67094af891d8a6", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Geor.pl", "type": "file" }, { - "bom-ref": "6816dfe4b90267bd", + "bom-ref": "732a67a3891f9e14", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Glag.pl", "type": "file" }, { - "bom-ref": "b044030268bf8e3a", + "bom-ref": "f10ab786f4416353", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Gong.pl", "type": "file" }, { - "bom-ref": "91a59798e5253669", + "bom-ref": "0b24823890e89308", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Gonm.pl", "type": "file" }, { - "bom-ref": "aa4b7cd75024c22d", + "bom-ref": "c636e23a68afe458", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Gran.pl", "type": "file" }, { - "bom-ref": "af275176a47b2858", + "bom-ref": "c38805f828a64909", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Grek.pl", "type": "file" }, { - "bom-ref": "577b7be89be258e1", + "bom-ref": "235df374b728c244", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Gujr.pl", "type": "file" }, { - "bom-ref": "648620a1dfb1a5f8", + "bom-ref": "7a5a1f3f87799591", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Guru.pl", "type": "file" }, { - "bom-ref": "19c05a265a6032b8", + "bom-ref": "52ed9b8a83374371", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Han.pl", "type": "file" }, { - "bom-ref": "9cb485777779c0fd", + "bom-ref": "aad146e444af0934", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Hang.pl", "type": "file" }, { - "bom-ref": "881738ad058b3654", + "bom-ref": "7ba8d6679da0d5a9", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Hebr.pl", "type": "file" }, { - "bom-ref": "1ea61e60590741c7", + "bom-ref": "7562388b9cb5135e", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Hira.pl", "type": "file" }, { - "bom-ref": "725ce476fbb68b20", + "bom-ref": "7b5f1a9adf24afed", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Hmng.pl", "type": "file" }, { - "bom-ref": "8178b8617dfabd89", + "bom-ref": "97df1c7faa7989ec", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Hmnp.pl", "type": "file" }, { - "bom-ref": "49324e6562ceb24c", + "bom-ref": "cfbf00bf80421415", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Kana.pl", "type": "file" }, { - "bom-ref": "8dc2574ad3a8038e", + "bom-ref": "f13c133ca64e7a23", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Khar.pl", "type": "file" }, { - "bom-ref": "24ce54b9382743f9", + "bom-ref": "6c22ce4feff6e688", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Khmr.pl", "type": "file" }, { - "bom-ref": "ea9beabdfc0bc8d9", + "bom-ref": "d2477d2627d6c4c8", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Khoj.pl", "type": "file" }, { - "bom-ref": "2da009a59a844ab7", + "bom-ref": "ba5d5a3d3a931aba", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Knda.pl", "type": "file" }, { - "bom-ref": "a6d1fa5ec422ba31", + "bom-ref": "9a49fe3020008994", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Kthi.pl", "type": "file" }, { - "bom-ref": "053f59808892170a", + "bom-ref": "748469a8b09c09a7", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Lana.pl", "type": "file" }, { - "bom-ref": "56aa746f061bf20a", + "bom-ref": "a1901633ee559467", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Lao.pl", "type": "file" }, { - "bom-ref": "84b3a16beaa7aff4", + "bom-ref": "784142222baecc99", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Latn.pl", "type": "file" }, { - "bom-ref": "735c18009db31162", + "bom-ref": "b068ae6d9ab62fef", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Limb.pl", "type": "file" }, { - "bom-ref": "11a9cb156e5f6579", + "bom-ref": "2ae3c2f6369528b8", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Lina.pl", "type": "file" }, { - "bom-ref": "a8c0bdd32afe4f67", + "bom-ref": "645c388c7e368812", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Linb.pl", "type": "file" }, { - "bom-ref": "e91d2d50519b4b4b", + "bom-ref": "24cce6167b0f026e", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Mlym.pl", "type": "file" }, { - "bom-ref": "520cd36882f34c88", + "bom-ref": "f8c5e70b145d0bb9", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Mong.pl", "type": "file" }, { - "bom-ref": "a4d07229a2715f97", + "bom-ref": "d21b2ce920ec66ae", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Mult.pl", "type": "file" }, { - "bom-ref": "4ed33816276eb3e0", + "bom-ref": "b7035aab7baa7f19", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Mymr.pl", "type": "file" }, { - "bom-ref": "e9bc3fd02add1fc9", + "bom-ref": "8b1d9b495ca9f158", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Nand.pl", "type": "file" }, { - "bom-ref": "56d711cce25ad9f4", + "bom-ref": "c473fdaddeb78291", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Nko.pl", "type": "file" }, { - "bom-ref": "b435baba8b7a3dd9", + "bom-ref": "2c652c89e0c63084", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Orya.pl", "type": "file" }, { - "bom-ref": "31e95055319884cc", + "bom-ref": "c4f00e0675fcaae5", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Phlp.pl", "type": "file" }, { - "bom-ref": "e623113f34e70de0", + "bom-ref": "3f44bcaf7bab0321", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Rohg.pl", "type": "file" }, { - "bom-ref": "9c2c388664f7fbfe", + "bom-ref": "ab24874e6c90a8b7", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Shrd.pl", "type": "file" }, { - "bom-ref": "8ae9aa9f63f0373a", + "bom-ref": "fd8f782e331b93cf", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Sind.pl", "type": "file" }, { - "bom-ref": "168ffa4a0942691c", + "bom-ref": "95cc07b51468a61d", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Sinh.pl", "type": "file" }, { - "bom-ref": "f12598f8e5b10b67", + "bom-ref": "be397751720e5456", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Syrc.pl", "type": "file" }, { - "bom-ref": "8cb45f720b6926b8", + "bom-ref": "74ee67495e623e25", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Tagb.pl", "type": "file" }, { - "bom-ref": "1685a7818d9c6340", + "bom-ref": "2f35fb5320747511", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Takr.pl", "type": "file" }, { - "bom-ref": "a95673e07a9eab63", + "bom-ref": "2f14d28bc4ee469a", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Talu.pl", "type": "file" }, { - "bom-ref": "9991ea4545ed9440", + "bom-ref": "c5f3e1e4a5093b55", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Taml.pl", "type": "file" }, { - "bom-ref": "14db3783875f20a1", + "bom-ref": "bff9185b2223085c", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Tang.pl", "type": "file" }, { - "bom-ref": "2992362233501059", + "bom-ref": "390d5cb289372df8", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Telu.pl", "type": "file" }, { - "bom-ref": "8168e9d114771c7a", + "bom-ref": "964d47b26930aa0b", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Thaa.pl", "type": "file" }, { - "bom-ref": "a7feda610d09ed54", + "bom-ref": "fd96027d7c575355", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Tibt.pl", "type": "file" }, { - "bom-ref": "88d0f7d9c22fd502", + "bom-ref": "9159f82815d79657", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Tirh.pl", "type": "file" }, { - "bom-ref": "db4d3e3917a869d6", + "bom-ref": "5002e51e586d32bf", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Vith.pl", "type": "file" }, { - "bom-ref": "0f9e89868d05cf83", + "bom-ref": "48a1117588766ac2", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Xsux.pl", "type": "file" }, { - "bom-ref": "fd11a9fc05ff025d", + "bom-ref": "90cbc628e7c6fa88", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Yezi.pl", "type": "file" }, { - "bom-ref": "938808885b377303", + "bom-ref": "f39a697acf3be39a", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Yi.pl", "type": "file" }, { - "bom-ref": "50ddb5da059423ed", + "bom-ref": "e420afbcd676c710", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Zinh.pl", "type": "file" }, { - "bom-ref": "4989c37f5a398d90", + "bom-ref": "af0b3c46bb3e4409", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Zyyy.pl", "type": "file" }, { - "bom-ref": "8d688e354d22c66e", + "bom-ref": "7217e5d0083ac687", "name": "/usr/share/perl/5.38.2/unicore/lib/Scx/Zzzz.pl", "type": "file" }, { - "bom-ref": "268a4d4076860867", + "bom-ref": "7cb677c9c08303fe", "name": "/usr/share/perl/5.38.2/unicore/lib/Term/Y.pl", "type": "file" }, { - "bom-ref": "61f5d2f37352a691", + "bom-ref": "e4b1393e05131ab0", "name": "/usr/share/perl/5.38.2/unicore/lib/UIdeo/Y.pl", "type": "file" }, { - "bom-ref": "21b25804263928a2", + "bom-ref": "8aedfea3f8a530cb", "name": "/usr/share/perl/5.38.2/unicore/lib/Upper/Y.pl", "type": "file" }, { - "bom-ref": "c56e20593d97bce7", + "bom-ref": "6325ddbee0c9d62a", "name": "/usr/share/perl/5.38.2/unicore/lib/VS/Y.pl", "type": "file" }, { - "bom-ref": "1f8a0cfe6c375e5c", + "bom-ref": "b4a3a85507e5db15", "name": "/usr/share/perl/5.38.2/unicore/lib/Vo/R.pl", "type": "file" }, { - "bom-ref": "5c1318dea0482e64", + "bom-ref": "303ba4ad282b9c25", "name": "/usr/share/perl/5.38.2/unicore/lib/Vo/Tr.pl", "type": "file" }, { - "bom-ref": "a2f7d6e2ec680005", + "bom-ref": "bee30fcf2650e0e8", "name": "/usr/share/perl/5.38.2/unicore/lib/Vo/Tu.pl", "type": "file" }, { - "bom-ref": "b81f9d5e061e58c9", + "bom-ref": "1ff43dfc346c2614", "name": "/usr/share/perl/5.38.2/unicore/lib/Vo/U.pl", "type": "file" }, { - "bom-ref": "85a5502885f0561b", + "bom-ref": "f9a72243c2eed32e", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/EX.pl", "type": "file" }, { - "bom-ref": "7fc8898d4e198b95", + "bom-ref": "4612e3831abb6708", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/Extend.pl", "type": "file" }, { - "bom-ref": "9185907edac498d5", + "bom-ref": "30e4d8d1f7d5aed0", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/FO.pl", "type": "file" }, { - "bom-ref": "7ffb0892ef66901f", + "bom-ref": "d99ff864f04c67b6", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/HL.pl", "type": "file" }, { - "bom-ref": "861e3257d6011472", + "bom-ref": "a10afb6cdf9c9dd3", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/KA.pl", "type": "file" }, { - "bom-ref": "fc8abdc38a19aece", + "bom-ref": "07a1db80cc08d7a3", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/LE.pl", "type": "file" }, { - "bom-ref": "1bdba812109f742a", + "bom-ref": "9a3c127f6a89a9f7", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/MB.pl", "type": "file" }, { - "bom-ref": "b93c3e74d7ababf6", + "bom-ref": "9a5914d4db0442ff", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/ML.pl", "type": "file" }, { - "bom-ref": "b32a1e6ba85e08ca", + "bom-ref": "2749407dc6376f3b", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/MN.pl", "type": "file" }, { - "bom-ref": "0ec13e6b5c9df612", + "bom-ref": "7e4d303d547288a7", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/NU.pl", "type": "file" }, { - "bom-ref": "f471790d2934dacc", + "bom-ref": "101f6223473c1a71", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/WSegSpac.pl", "type": "file" }, { - "bom-ref": "e3558145d59ffaf6", + "bom-ref": "6ff13a2dfaba09b3", "name": "/usr/share/perl/5.38.2/unicore/lib/WB/XX.pl", "type": "file" }, { - "bom-ref": "78bbc8c733004679", + "bom-ref": "6ea0b65cdcb60954", "name": "/usr/share/perl/5.38.2/unicore/lib/XIDC/Y.pl", "type": "file" }, { - "bom-ref": "89b6a0e7b3580086", + "bom-ref": "08d82285549ac2c3", "name": "/usr/share/perl/5.38.2/unicore/lib/XIDS/Y.pl", "type": "file" }, { - "bom-ref": "e127e633026bfc97", + "bom-ref": "6132dda6180cf07a", "name": "/usr/share/perl/5.38.2/unicore/uni_keywords.pl", "type": "file" }, { - "bom-ref": "044edc008af58d75", + "bom-ref": "fa5916715160b1c0", "name": "/usr/share/perl/5.38.2/unicore/version", "type": "file" }, { - "bom-ref": "0378dd30426d5b86", + "bom-ref": "f1c57a752eeeff2f", "name": "/usr/share/perl/5.38.2/utf8.pm", "type": "file" }, { - "bom-ref": "e26bf7e47bd61790", + "bom-ref": "4703e27d553f9f51", "name": "/usr/share/perl/5.38.2/vars.pm", "type": "file" }, { - "bom-ref": "73a3af4a2b2c7e77", + "bom-ref": "842563342558cb22", "name": "/usr/share/perl/5.38.2/version.pm", "type": "file" }, { - "bom-ref": "c0a849e5cb494572", + "bom-ref": "bba9827d0f5a8afb", "name": "/usr/share/perl/5.38.2/version.pod", "type": "file" }, { - "bom-ref": "cc4c5c12c703387c", + "bom-ref": "dadb68e49b0c5b61", "name": "/usr/share/perl/5.38.2/version/Internals.pod", "type": "file" }, { - "bom-ref": "f2c5a00597cb8feb", + "bom-ref": "a70cc48134e973fa", "name": "/usr/share/perl/5.38.2/version/regex.pm", "type": "file" }, { - "bom-ref": "7dde028ad8fd8f4b", + "bom-ref": "edbbc4c35bfe624e", "name": "/usr/share/perl/5.38.2/vmsish.pm", "type": "file" }, { - "bom-ref": "7c5a687e00b04e2a", + "bom-ref": "faa8d850b75a7eb7", "name": "/usr/share/perl/5.38.2/warnings.pm", "type": "file" }, { - "bom-ref": "67b157bb1da96e21", + "bom-ref": "5aa9c1209beff2d8", "name": "/usr/share/perl/5.38.2/warnings/register.pm", "type": "file" }, { - "bom-ref": "67d4e48cb7c416c4", + "bom-ref": "87f7e3692856d1e2", "name": "/usr/share/perl5/Debconf/AutoSelect.pm", "type": "file" }, { - "bom-ref": "826592b8ce08cdad", + "bom-ref": "4a2f642f7ce723df", "name": "/usr/share/perl5/Debconf/Base.pm", "type": "file" }, { - "bom-ref": "76f6a280f518cc31", + "bom-ref": "67e258e966a0c62f", "name": "/usr/share/perl5/Debconf/Client/ConfModule.pm", "type": "file" }, { - "bom-ref": "d08c3178aa771e08", + "bom-ref": "0750710e8a151d0e", "name": "/usr/share/perl5/Debconf/ConfModule.pm", "type": "file" }, { - "bom-ref": "e47299ac04a4b69a", + "bom-ref": "c2540961ef60b2dc", "name": "/usr/share/perl5/Debconf/Config.pm", "type": "file" }, { - "bom-ref": "4d57c77426bf8e91", + "bom-ref": "6f62ed9fc53796eb", "name": "/usr/share/perl5/Debconf/Db.pm", "type": "file" }, { - "bom-ref": "486d47c468dcfc5d", + "bom-ref": "3fe0625cd5c3f533", "name": "/usr/share/perl5/Debconf/DbDriver.pm", "type": "file" }, { - "bom-ref": "e52c010339bc70d9", + "bom-ref": "ad831ce43039d00f", "name": "/usr/share/perl5/Debconf/DbDriver/Backup.pm", "type": "file" }, { - "bom-ref": "ac694a3ba3709209", + "bom-ref": "1d466773a660da6b", "name": "/usr/share/perl5/Debconf/DbDriver/Cache.pm", "type": "file" }, { - "bom-ref": "e992c0af8c626683", + "bom-ref": "11f07f33df9f5ef9", "name": "/usr/share/perl5/Debconf/DbDriver/Copy.pm", "type": "file" }, { - "bom-ref": "f999a669989d30ca", + "bom-ref": "a095656bc35073ac", "name": "/usr/share/perl5/Debconf/DbDriver/Debug.pm", "type": "file" }, { - "bom-ref": "1cf4b26a6c4a4b9b", + "bom-ref": "b9a2a95234365bfd", "name": "/usr/share/perl5/Debconf/DbDriver/DirTree.pm", "type": "file" }, { - "bom-ref": "e541ad2aff10b9c6", + "bom-ref": "6328c590058a98b0", "name": "/usr/share/perl5/Debconf/DbDriver/Directory.pm", "type": "file" }, { - "bom-ref": "3fe7240bbc92ab46", + "bom-ref": "10d5af188f321224", "name": "/usr/share/perl5/Debconf/DbDriver/File.pm", "type": "file" }, { - "bom-ref": "f65d617377e87cf1", + "bom-ref": "94a4b9ccf235d2cb", "name": "/usr/share/perl5/Debconf/DbDriver/LDAP.pm", "type": "file" }, { - "bom-ref": "45af560845d2ef1c", + "bom-ref": "a165a8f2c4713616", "name": "/usr/share/perl5/Debconf/DbDriver/PackageDir.pm", "type": "file" }, { - "bom-ref": "6a22749c7422fed6", + "bom-ref": "246733ccac585e10", "name": "/usr/share/perl5/Debconf/DbDriver/Pipe.pm", "type": "file" }, { - "bom-ref": "fb6316b733e1d93c", + "bom-ref": "e1aa034af97c9272", "name": "/usr/share/perl5/Debconf/DbDriver/Stack.pm", "type": "file" }, { - "bom-ref": "3f65c6d98f736c96", + "bom-ref": "ab530fe730fef450", "name": "/usr/share/perl5/Debconf/Element.pm", "type": "file" }, { - "bom-ref": "a92ef9d28c3f7b52", + "bom-ref": "e895db37b2fea8ac", "name": "/usr/share/perl5/Debconf/Element/Dialog/Boolean.pm", "type": "file" }, { - "bom-ref": "03c36c7b95905bb4", + "bom-ref": "7d0abd358c6ad96e", "name": "/usr/share/perl5/Debconf/Element/Dialog/Error.pm", "type": "file" }, { - "bom-ref": "0f43a8dba4ba191a", + "bom-ref": "0fb6b9d46b614978", "name": "/usr/share/perl5/Debconf/Element/Dialog/Multiselect.pm", "type": "file" }, { - "bom-ref": "a1fb10c3a70f88cb", + "bom-ref": "269b2e55cdf13f15", "name": "/usr/share/perl5/Debconf/Element/Dialog/Note.pm", "type": "file" }, { - "bom-ref": "e0e467b54eb3e4fb", + "bom-ref": "4ebb435445e1cdad", "name": "/usr/share/perl5/Debconf/Element/Dialog/Password.pm", "type": "file" }, { - "bom-ref": "3e7f0105360f9ddc", + "bom-ref": "b0179f0c60ea6b46", "name": "/usr/share/perl5/Debconf/Element/Dialog/Progress.pm", "type": "file" }, { - "bom-ref": "67f7621250db85f0", + "bom-ref": "e89b9d9e32dc51c2", "name": "/usr/share/perl5/Debconf/Element/Dialog/Select.pm", "type": "file" }, { - "bom-ref": "963cbc15ad757648", + "bom-ref": "c6b184b521ffdfb6", "name": "/usr/share/perl5/Debconf/Element/Dialog/String.pm", "type": "file" }, { - "bom-ref": "c6722dd24e2bbf54", + "bom-ref": "aff10c8f3ac60c9a", "name": "/usr/share/perl5/Debconf/Element/Dialog/Text.pm", "type": "file" }, { - "bom-ref": "57c4958e0bc21261", + "bom-ref": "2f5bb4db907f7ba7", "name": "/usr/share/perl5/Debconf/Element/Editor/Boolean.pm", "type": "file" }, { - "bom-ref": "7812f33e114f6827", + "bom-ref": "f03be877f0606355", "name": "/usr/share/perl5/Debconf/Element/Editor/Error.pm", "type": "file" }, { - "bom-ref": "fd93b3fa74f4dc03", + "bom-ref": "69178a608e0ffae5", "name": "/usr/share/perl5/Debconf/Element/Editor/Multiselect.pm", "type": "file" }, { - "bom-ref": "7cf70ca874fa32a9", + "bom-ref": "d1585bb809f33bbf", "name": "/usr/share/perl5/Debconf/Element/Editor/Note.pm", "type": "file" }, { - "bom-ref": "1c415520a98706b2", + "bom-ref": "0fab2034d277f030", "name": "/usr/share/perl5/Debconf/Element/Editor/Password.pm", "type": "file" }, { - "bom-ref": "42903a102e682fd5", + "bom-ref": "3a21c045c415c5ab", "name": "/usr/share/perl5/Debconf/Element/Editor/Progress.pm", "type": "file" }, { - "bom-ref": "c99d05f1a5824849", + "bom-ref": "3d3edd8ab65a9f47", "name": "/usr/share/perl5/Debconf/Element/Editor/Select.pm", "type": "file" }, { - "bom-ref": "194d0e6073f40b84", + "bom-ref": "ed38a23560970cfe", "name": "/usr/share/perl5/Debconf/Element/Editor/String.pm", "type": "file" }, { - "bom-ref": "a90e556bc5226a87", + "bom-ref": "13548087ccee3aad", "name": "/usr/share/perl5/Debconf/Element/Editor/Text.pm", "type": "file" }, { - "bom-ref": "108866ea12ef99ca", + "bom-ref": "9d9a4b1b0ed72338", "name": "/usr/share/perl5/Debconf/Element/Gnome.pm", "type": "file" }, { - "bom-ref": "73f1e449a71eaf99", + "bom-ref": "94168cb8df9dfe9f", "name": "/usr/share/perl5/Debconf/Element/Gnome/Boolean.pm", "type": "file" }, { - "bom-ref": "8c61db2cfa8d4437", + "bom-ref": "4daead5976d969b5", "name": "/usr/share/perl5/Debconf/Element/Gnome/Error.pm", "type": "file" }, { - "bom-ref": "e0527a69d34c42d7", + "bom-ref": "53c9068c39ab33e5", "name": "/usr/share/perl5/Debconf/Element/Gnome/Multiselect.pm", "type": "file" }, { - "bom-ref": "e9fafe34629143a3", + "bom-ref": "bc6f3d1228dfd941", "name": "/usr/share/perl5/Debconf/Element/Gnome/Note.pm", "type": "file" }, { - "bom-ref": "47cf9947abccb2b5", + "bom-ref": "01e64a2b19f23eab", "name": "/usr/share/perl5/Debconf/Element/Gnome/Password.pm", "type": "file" }, { - "bom-ref": "03420a9d579f2f89", + "bom-ref": "175609cf2932c52b", "name": "/usr/share/perl5/Debconf/Element/Gnome/Progress.pm", "type": "file" }, { - "bom-ref": "a009f0c197302c86", + "bom-ref": "af5aedb88e2f3538", "name": "/usr/share/perl5/Debconf/Element/Gnome/Select.pm", "type": "file" }, { - "bom-ref": "63ce843b47dcc6db", + "bom-ref": "6c0bf8a9d8e69931", "name": "/usr/share/perl5/Debconf/Element/Gnome/String.pm", "type": "file" }, { - "bom-ref": "240a2e8925e77e70", + "bom-ref": "60a12233a0bf8cd2", "name": "/usr/share/perl5/Debconf/Element/Gnome/Text.pm", "type": "file" }, { - "bom-ref": "ae15bdd8676df936", + "bom-ref": "a56127b011f7dc38", "name": "/usr/share/perl5/Debconf/Element/Multiselect.pm", "type": "file" }, { - "bom-ref": "2a9d8ef409ba6340", + "bom-ref": "24126efb43c13b66", "name": "/usr/share/perl5/Debconf/Element/Noninteractive.pm", "type": "file" }, { - "bom-ref": "160f34a6d9519a07", + "bom-ref": "39c13ad225c0fea5", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Boolean.pm", "type": "file" }, { - "bom-ref": "d7112229205b1555", + "bom-ref": "e8bddf31a7081823", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Error.pm", "type": "file" }, { - "bom-ref": "a531390bcee46f76", + "bom-ref": "a352f680a5a7c558", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Multiselect.pm", "type": "file" }, { - "bom-ref": "d17acab374941a3d", + "bom-ref": "79b93c9badce2c2b", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Note.pm", "type": "file" }, { - "bom-ref": "f9cf605844313d60", + "bom-ref": "34710b4f81674dce", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Password.pm", "type": "file" }, { - "bom-ref": "e5175ce69ba9573d", + "bom-ref": "897f69e9cd2f6967", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Progress.pm", "type": "file" }, { - "bom-ref": "4aeba2648e219284", + "bom-ref": "7d66e02ee24bfb72", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Select.pm", "type": "file" }, { - "bom-ref": "03ac7ac788aed6a3", + "bom-ref": "470780463f98ea01", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/String.pm", "type": "file" }, { - "bom-ref": "92ab0a41902000f1", + "bom-ref": "3ade678b47faa5c3", "name": "/usr/share/perl5/Debconf/Element/Noninteractive/Text.pm", "type": "file" }, { - "bom-ref": "56a75881191c29eb", + "bom-ref": "d0d820ad99c8d5d5", "name": "/usr/share/perl5/Debconf/Element/Select.pm", "type": "file" }, { - "bom-ref": "70e5361b807443c5", + "bom-ref": "2e734910bcb139db", "name": "/usr/share/perl5/Debconf/Element/Teletype/Boolean.pm", "type": "file" }, { - "bom-ref": "05ab716b13c870e0", + "bom-ref": "37ee053d4ecea8fa", "name": "/usr/share/perl5/Debconf/Element/Teletype/Error.pm", "type": "file" }, { - "bom-ref": "b766fe057ecc8cdd", + "bom-ref": "d5da861e501a80a3", "name": "/usr/share/perl5/Debconf/Element/Teletype/Multiselect.pm", "type": "file" }, { - "bom-ref": "7d4ee4442c383a2a", + "bom-ref": "766f45dbbdb75458", "name": "/usr/share/perl5/Debconf/Element/Teletype/Note.pm", "type": "file" }, { - "bom-ref": "ded7d209673395ff", + "bom-ref": "537aa268383dc705", "name": "/usr/share/perl5/Debconf/Element/Teletype/Password.pm", "type": "file" }, { - "bom-ref": "8e3397190320b3c3", + "bom-ref": "0737e405fa0a4a39", "name": "/usr/share/perl5/Debconf/Element/Teletype/Progress.pm", "type": "file" }, { - "bom-ref": "1202fffe5d00f484", + "bom-ref": "0e370c2d72514842", "name": "/usr/share/perl5/Debconf/Element/Teletype/Select.pm", "type": "file" }, { - "bom-ref": "9e3d3b8243d42dde", + "bom-ref": "8209e28027f66418", "name": "/usr/share/perl5/Debconf/Element/Teletype/String.pm", "type": "file" }, { - "bom-ref": "e186f1232262f5fb", + "bom-ref": "98e8dae369a94dd1", "name": "/usr/share/perl5/Debconf/Element/Teletype/Text.pm", "type": "file" }, { - "bom-ref": "085bf5f307b86e8b", + "bom-ref": "e70a7acdb78ca845", "name": "/usr/share/perl5/Debconf/Element/Web/Boolean.pm", "type": "file" }, { - "bom-ref": "99e654e1f872572e", + "bom-ref": "6c330b61c583f1a4", "name": "/usr/share/perl5/Debconf/Element/Web/Error.pm", "type": "file" }, { - "bom-ref": "1a7b9ad3a0bcf575", + "bom-ref": "2d56e828d2f97fa3", "name": "/usr/share/perl5/Debconf/Element/Web/Multiselect.pm", "type": "file" }, { - "bom-ref": "7ee17b9bc9c05e4e", + "bom-ref": "091a7c86e025bf8c", "name": "/usr/share/perl5/Debconf/Element/Web/Note.pm", "type": "file" }, { - "bom-ref": "0ddbdd28edb82eef", + "bom-ref": "bbf3a243bf191d4d", "name": "/usr/share/perl5/Debconf/Element/Web/Password.pm", "type": "file" }, { - "bom-ref": "0aa1416d55fba2da", + "bom-ref": "4911957dd9bc9580", "name": "/usr/share/perl5/Debconf/Element/Web/Progress.pm", "type": "file" }, { - "bom-ref": "70ac2592dc1c2a94", + "bom-ref": "d786e639d8310b46", "name": "/usr/share/perl5/Debconf/Element/Web/Select.pm", "type": "file" }, { - "bom-ref": "8c3620dbe540a11e", + "bom-ref": "d302c619f4abb438", "name": "/usr/share/perl5/Debconf/Element/Web/String.pm", "type": "file" }, { - "bom-ref": "3ca1e0d978d31bc3", + "bom-ref": "4459ed184d4c1b11", "name": "/usr/share/perl5/Debconf/Element/Web/Text.pm", "type": "file" }, { - "bom-ref": "f65335fa932317b7", + "bom-ref": "63c605e313d705e1", "name": "/usr/share/perl5/Debconf/Encoding.pm", "type": "file" }, { - "bom-ref": "f3a8aca0bf20c266", + "bom-ref": "e3fb287100856228", "name": "/usr/share/perl5/Debconf/Format.pm", "type": "file" }, { - "bom-ref": "36feac9c603cada7", + "bom-ref": "f0d0419ca853e379", "name": "/usr/share/perl5/Debconf/Format/822.pm", "type": "file" }, { - "bom-ref": "f251771a0af4a4dc", + "bom-ref": "9a334ac813420002", "name": "/usr/share/perl5/Debconf/FrontEnd.pm", "type": "file" }, { - "bom-ref": "97c90306de66ac24", + "bom-ref": "8bc31026c1af18c2", "name": "/usr/share/perl5/Debconf/FrontEnd/Dialog.pm", "type": "file" }, { - "bom-ref": "1af84ce80427e919", + "bom-ref": "d396b3330b33e2fb", "name": "/usr/share/perl5/Debconf/FrontEnd/Editor.pm", "type": "file" }, { - "bom-ref": "05152a8e1747773c", + "bom-ref": "04ca4e5506b1b79a", "name": "/usr/share/perl5/Debconf/FrontEnd/Gnome.pm", "type": "file" }, { - "bom-ref": "ad37ce16836e5d8b", + "bom-ref": "e06c877a876603f5", "name": "/usr/share/perl5/Debconf/FrontEnd/Kde.pm", "type": "file" }, { - "bom-ref": "7b6854e2585ace21", + "bom-ref": "9c0bb010ac4562d7", "name": "/usr/share/perl5/Debconf/FrontEnd/Noninteractive.pm", "type": "file" }, { - "bom-ref": "662ab5b051f9b9e1", + "bom-ref": "53105615e7e5511b", "name": "/usr/share/perl5/Debconf/FrontEnd/Passthrough.pm", "type": "file" }, { - "bom-ref": "0c9c5f2d838baba4", + "bom-ref": "49cf889daba191ee", "name": "/usr/share/perl5/Debconf/FrontEnd/Readline.pm", "type": "file" }, { - "bom-ref": "5c37202e5bff56dc", + "bom-ref": "b016752bd550da0a", "name": "/usr/share/perl5/Debconf/FrontEnd/ScreenSize.pm", "type": "file" }, { - "bom-ref": "3e6fd1389ccd54ab", + "bom-ref": "76f6b46c8dba8961", "name": "/usr/share/perl5/Debconf/FrontEnd/Teletype.pm", "type": "file" }, { - "bom-ref": "7b363b3a29b1ba2a", + "bom-ref": "39358dd4267ec328", "name": "/usr/share/perl5/Debconf/FrontEnd/Text.pm", "type": "file" }, { - "bom-ref": "e51dbf52ad4485cc", + "bom-ref": "a1c8f6cc404df412", "name": "/usr/share/perl5/Debconf/FrontEnd/Web.pm", "type": "file" }, { - "bom-ref": "f67c5db664f3c919", + "bom-ref": "e00e8b3ce6ef01c7", "name": "/usr/share/perl5/Debconf/Gettext.pm", "type": "file" }, { - "bom-ref": "7b752d4f3c714d67", + "bom-ref": "be5731654ee851a5", "name": "/usr/share/perl5/Debconf/Iterator.pm", "type": "file" }, { - "bom-ref": "78113b9c3c0579b1", + "bom-ref": "1a7dc9f36defe85b", "name": "/usr/share/perl5/Debconf/Log.pm", "type": "file" }, { - "bom-ref": "d9eab75ad57971c7", + "bom-ref": "6093a50c8d7e83dd", "name": "/usr/share/perl5/Debconf/Path.pm", "type": "file" }, { - "bom-ref": "0f56f593d3df1ae7", + "bom-ref": "27ef4f8c3844fadd", "name": "/usr/share/perl5/Debconf/Priority.pm", "type": "file" }, { - "bom-ref": "ab4a00d7a23a8763", + "bom-ref": "7356dd29b04ad04d", "name": "/usr/share/perl5/Debconf/Question.pm", "type": "file" }, { - "bom-ref": "4a091901ca3f66c9", + "bom-ref": "bfd7644865572c53", "name": "/usr/share/perl5/Debconf/Template.pm", "type": "file" }, { - "bom-ref": "6235f8243bc62447", + "bom-ref": "7faff2692c2019a1", "name": "/usr/share/perl5/Debconf/Template/Transient.pm", "type": "file" }, { - "bom-ref": "76ecb98696189ceb", + "bom-ref": "fa88089c1ac63c6d", "name": "/usr/share/perl5/Debconf/TmpFile.pm", "type": "file" }, { - "bom-ref": "798a7347242bd967", + "bom-ref": "a7740da71f49f380", "name": "/usr/share/perl5/Debian/AdduserCommon.pm", "type": "file" }, { - "bom-ref": "92755fa9f107a803", + "bom-ref": "2c0d6fbf2044f5f4", "name": "/usr/share/perl5/Debian/AdduserLogging.pm", "type": "file" }, { - "bom-ref": "41bdd5fa06936614", + "bom-ref": "7d82f7f7c7526e1f", "name": "/usr/share/perl5/Debian/AdduserRetvalues.pm", "type": "file" }, { - "bom-ref": "9f6ad80e12ffcc75", + "bom-ref": "d4e66b49000ee0d7", "name": "/usr/share/perl5/Debian/DebConf/Client/ConfModule.pm", "type": "file" }, { - "bom-ref": "d335ca79bc9f2592", + "bom-ref": "afad2be9d836b6c4", "name": "/usr/share/perl5/Debian/Debhelper/Sequence/autotools_dev.pm", "type": "file" }, { - "bom-ref": "adc14b4b154e05fe", - "name": "/usr/share/perl5/Debian/Debhelper/Sequence/xml_core.pm", - "type": "file" - }, - { - "bom-ref": "ce7caaaa4cc2f6bd", + "bom-ref": "0f713a09db7f9ab8", "name": "/usr/share/perl5/Dpkg.pm", "type": "file" }, { - "bom-ref": "4b6e182852b624fa", + "bom-ref": "7f72818be9978353", "name": "/usr/share/perl5/Dpkg/Arch.pm", "type": "file" }, { - "bom-ref": "efc81ec9806aee58", + "bom-ref": "bb833e913715b689", "name": "/usr/share/perl5/Dpkg/Build/Info.pm", "type": "file" }, { - "bom-ref": "5d46649d2cb5540c", + "bom-ref": "a21665c8c8675a71", "name": "/usr/share/perl5/Dpkg/BuildAPI.pm", "type": "file" }, { - "bom-ref": "09ce4eb14436d5ca", + "bom-ref": "252550b1618981ab", "name": "/usr/share/perl5/Dpkg/BuildEnv.pm", "type": "file" }, { - "bom-ref": "ca8fa8bede318e5e", + "bom-ref": "7899168640c782c7", "name": "/usr/share/perl5/Dpkg/BuildFlags.pm", "type": "file" }, { - "bom-ref": "ff944c173c2a2c7a", + "bom-ref": "006b3badcdd994c3", "name": "/usr/share/perl5/Dpkg/BuildInfo.pm", "type": "file" }, { - "bom-ref": "72a7e07761966939", + "bom-ref": "417478d885b8dbd8", "name": "/usr/share/perl5/Dpkg/BuildOptions.pm", "type": "file" }, { - "bom-ref": "6c470be44ecce84c", + "bom-ref": "913a759855e49089", "name": "/usr/share/perl5/Dpkg/BuildProfiles.pm", "type": "file" }, { - "bom-ref": "12439d6ff94a2f3e", + "bom-ref": "bd513e5296ac61af", "name": "/usr/share/perl5/Dpkg/BuildTree.pm", "type": "file" }, { - "bom-ref": "269bb394046a835c", + "bom-ref": "f749ca4097ba6945", "name": "/usr/share/perl5/Dpkg/BuildTypes.pm", "type": "file" }, { - "bom-ref": "f18598f935258a3b", + "bom-ref": "b09a2330e66c1a06", "name": "/usr/share/perl5/Dpkg/Changelog.pm", "type": "file" }, { - "bom-ref": "e8e2b8098040fcc0", + "bom-ref": "4910e44b47ec5a7d", "name": "/usr/share/perl5/Dpkg/Changelog/Debian.pm", "type": "file" }, { - "bom-ref": "01c6e991148fcc00", + "bom-ref": "e0544ab527da7ce1", "name": "/usr/share/perl5/Dpkg/Changelog/Entry.pm", "type": "file" }, { - "bom-ref": "55e9bef0745beaca", + "bom-ref": "1ff3b85c4fdddb4f", "name": "/usr/share/perl5/Dpkg/Changelog/Entry/Debian.pm", "type": "file" }, { - "bom-ref": "7ebf518e3f0cee9f", + "bom-ref": "47f05cd95989828a", "name": "/usr/share/perl5/Dpkg/Changelog/Parse.pm", "type": "file" }, { - "bom-ref": "5b87671127a3a3ad", + "bom-ref": "a4827264609c21e0", "name": "/usr/share/perl5/Dpkg/Checksums.pm", "type": "file" }, { - "bom-ref": "4c49386b0b3765af", + "bom-ref": "0ea4337619ec82de", "name": "/usr/share/perl5/Dpkg/Compression.pm", "type": "file" }, { - "bom-ref": "768fcd4131cf714c", + "bom-ref": "e2c3198aa8c1ed49", "name": "/usr/share/perl5/Dpkg/Compression/FileHandle.pm", "type": "file" }, { - "bom-ref": "02173bd5b6711484", + "bom-ref": "e5395beadc497315", "name": "/usr/share/perl5/Dpkg/Compression/Process.pm", "type": "file" }, { - "bom-ref": "f684617e0bfe49a6", + "bom-ref": "edb11defa5e9497b", "name": "/usr/share/perl5/Dpkg/Conf.pm", "type": "file" }, { - "bom-ref": "f9c9e0c35eb0fd25", + "bom-ref": "5148cb2837ca3de0", "name": "/usr/share/perl5/Dpkg/Control.pm", "type": "file" }, { - "bom-ref": "bf13db881b8f986d", + "bom-ref": "7285ae0b148b73bc", "name": "/usr/share/perl5/Dpkg/Control/Changelog.pm", "type": "file" }, { - "bom-ref": "cb20f89cd90aa376", + "bom-ref": "93f70e82f8bb491f", "name": "/usr/share/perl5/Dpkg/Control/Fields.pm", "type": "file" }, { - "bom-ref": "b1b4823c9fa88830", + "bom-ref": "8b92b187a1adfb65", "name": "/usr/share/perl5/Dpkg/Control/FieldsCore.pm", "type": "file" }, { - "bom-ref": "0ce5dd21f732c2db", + "bom-ref": "b7d54fed75fc2916", "name": "/usr/share/perl5/Dpkg/Control/Hash.pm", "type": "file" }, { - "bom-ref": "883e8b9605cd0a03", + "bom-ref": "c26b5f091b7c590a", "name": "/usr/share/perl5/Dpkg/Control/HashCore.pm", "type": "file" }, { - "bom-ref": "727212cc9b282c16", + "bom-ref": "5722918ae00c58ab", "name": "/usr/share/perl5/Dpkg/Control/HashCore/Tie.pm", "type": "file" }, { - "bom-ref": "ac5be239830e0005", + "bom-ref": "d64b75645de5226c", "name": "/usr/share/perl5/Dpkg/Control/Info.pm", "type": "file" }, { - "bom-ref": "f0f81ec240410d53", + "bom-ref": "559c9189c24c6632", "name": "/usr/share/perl5/Dpkg/Control/Tests.pm", "type": "file" }, { - "bom-ref": "ea8b5317f7829fb6", + "bom-ref": "ab5f42644f2d9f03", "name": "/usr/share/perl5/Dpkg/Control/Tests/Entry.pm", "type": "file" }, { - "bom-ref": "7f116abec331e0d7", + "bom-ref": "7bd4fd45dc052b2a", "name": "/usr/share/perl5/Dpkg/Control/Types.pm", "type": "file" }, { - "bom-ref": "ef1d59e5f4fa3273", + "bom-ref": "c897b67dfe290176", "name": "/usr/share/perl5/Dpkg/Deps.pm", "type": "file" }, { - "bom-ref": "9ed9a8ea06be0ebe", + "bom-ref": "062e551c366219c3", "name": "/usr/share/perl5/Dpkg/Deps/AND.pm", "type": "file" }, { - "bom-ref": "849a232f985a1c17", + "bom-ref": "50b792ff6d78deae", "name": "/usr/share/perl5/Dpkg/Deps/KnownFacts.pm", "type": "file" }, { - "bom-ref": "225a5fb4ca9802b8", + "bom-ref": "c3efaa1ffafbf8b1", "name": "/usr/share/perl5/Dpkg/Deps/Multiple.pm", "type": "file" }, { - "bom-ref": "e4ce572bd722861e", + "bom-ref": "e5e1fe4a27e0add7", "name": "/usr/share/perl5/Dpkg/Deps/OR.pm", "type": "file" }, { - "bom-ref": "8c060714a3f999ea", + "bom-ref": "25c1ee6ca4456b6f", "name": "/usr/share/perl5/Dpkg/Deps/Simple.pm", "type": "file" }, { - "bom-ref": "6c5806da601df4ec", + "bom-ref": "00450c894edb0209", "name": "/usr/share/perl5/Dpkg/Deps/Union.pm", "type": "file" }, { - "bom-ref": "d7319e0954b901c3", + "bom-ref": "2f887b34b0946cde", "name": "/usr/share/perl5/Dpkg/Dist/Files.pm", "type": "file" }, { - "bom-ref": "22cc9aa906521efc", + "bom-ref": "8a192fe3d0e39d09", "name": "/usr/share/perl5/Dpkg/ErrorHandling.pm", "type": "file" }, { - "bom-ref": "adfd8430095bb2fe", + "bom-ref": "db08ce43fe974433", "name": "/usr/share/perl5/Dpkg/Exit.pm", "type": "file" }, { - "bom-ref": "29a4d57f28d41d97", + "bom-ref": "1eb0481b9b47d942", "name": "/usr/share/perl5/Dpkg/File.pm", "type": "file" }, { - "bom-ref": "39f0f02768d8578d", + "bom-ref": "1d01901aa4c6c918", "name": "/usr/share/perl5/Dpkg/Getopt.pm", "type": "file" }, { - "bom-ref": "022344c38bdff5d6", + "bom-ref": "8ea245dfa8780433", "name": "/usr/share/perl5/Dpkg/Gettext.pm", "type": "file" }, { - "bom-ref": "ef40f039d170471b", + "bom-ref": "8087b0d8296d4c2e", "name": "/usr/share/perl5/Dpkg/IPC.pm", "type": "file" }, { - "bom-ref": "4758783a7044206e", + "bom-ref": "9aa2c4d0d7c2e99b", "name": "/usr/share/perl5/Dpkg/Index.pm", "type": "file" }, { - "bom-ref": "8f8a6ef5a2be1aea", + "bom-ref": "346d874745226323", "name": "/usr/share/perl5/Dpkg/Interface/Storable.pm", "type": "file" }, { - "bom-ref": "ce0e2c944add56de", + "bom-ref": "d4ea7f88b69cba3b", "name": "/usr/share/perl5/Dpkg/Lock.pm", "type": "file" }, { - "bom-ref": "b58037e6ac1d2138", + "bom-ref": "429617648d257e9d", "name": "/usr/share/perl5/Dpkg/OpenPGP.pm", "type": "file" }, { - "bom-ref": "9ded1bad879d511d", + "bom-ref": "f315d1edd49a7130", "name": "/usr/share/perl5/Dpkg/OpenPGP/Backend.pm", "type": "file" }, { - "bom-ref": "94fb6cbdc8f7fe79", + "bom-ref": "fe2355e175b0c13c", "name": "/usr/share/perl5/Dpkg/OpenPGP/Backend/GnuPG.pm", "type": "file" }, { - "bom-ref": "06388559c3ff3d17", + "bom-ref": "aff33f9840d200c6", "name": "/usr/share/perl5/Dpkg/OpenPGP/Backend/SOP.pm", "type": "file" }, { - "bom-ref": "6988942f93b665e6", + "bom-ref": "2cc00327e9343daf", "name": "/usr/share/perl5/Dpkg/OpenPGP/Backend/Sequoia.pm", "type": "file" }, { - "bom-ref": "a9c6a94e8c2ae2e8", + "bom-ref": "374ed811f134ddc1", "name": "/usr/share/perl5/Dpkg/OpenPGP/ErrorCodes.pm", "type": "file" }, { - "bom-ref": "c05a29883ae9dccf", + "bom-ref": "3042a3a24bf55e1e", "name": "/usr/share/perl5/Dpkg/OpenPGP/KeyHandle.pm", "type": "file" }, { - "bom-ref": "916e32f5f916d6b1", + "bom-ref": "3e5d9d1f1bad25a0", "name": "/usr/share/perl5/Dpkg/Package.pm", "type": "file" }, { - "bom-ref": "7931de784e4e0ed6", + "bom-ref": "43c17638d0fbaa3b", "name": "/usr/share/perl5/Dpkg/Path.pm", "type": "file" }, { - "bom-ref": "3d10560c188d0143", + "bom-ref": "818bd8902d6d4bf6", "name": "/usr/share/perl5/Dpkg/Shlibs.pm", "type": "file" }, { - "bom-ref": "4722ad2524c6a44c", + "bom-ref": "db953ff8b92e5f69", "name": "/usr/share/perl5/Dpkg/Shlibs/Cppfilt.pm", "type": "file" }, { - "bom-ref": "2ef4d1e15a186a76", + "bom-ref": "5559b52d5324f2ff", "name": "/usr/share/perl5/Dpkg/Shlibs/Objdump.pm", "type": "file" }, { - "bom-ref": "9233b1bdc94f27ec", + "bom-ref": "ef3ba3a5710451e5", "name": "/usr/share/perl5/Dpkg/Shlibs/Objdump/Object.pm", "type": "file" }, { - "bom-ref": "65b3d0befc9883b1", + "bom-ref": "b950a6c670e9ceec", "name": "/usr/share/perl5/Dpkg/Shlibs/Symbol.pm", "type": "file" }, { - "bom-ref": "bef2a3794e1e031c", + "bom-ref": "d38fcb2569f5386d", "name": "/usr/share/perl5/Dpkg/Shlibs/SymbolFile.pm", "type": "file" }, { - "bom-ref": "7120f04013c7907e", + "bom-ref": "6919bcdf6bbb4783", "name": "/usr/share/perl5/Dpkg/Source/Archive.pm", "type": "file" }, { - "bom-ref": "18a4847257032603", + "bom-ref": "f2a3d8412a81b38a", "name": "/usr/share/perl5/Dpkg/Source/BinaryFiles.pm", "type": "file" }, { - "bom-ref": "0756ddd2421fc596", + "bom-ref": "7130f6f332b79dff", "name": "/usr/share/perl5/Dpkg/Source/Format.pm", "type": "file" }, { - "bom-ref": "5a246aab10ce45d7", + "bom-ref": "7dcc6c73b28224ce", "name": "/usr/share/perl5/Dpkg/Source/Functions.pm", "type": "file" }, { - "bom-ref": "68a4c8b91b572939", + "bom-ref": "8a661180a221cc50", "name": "/usr/share/perl5/Dpkg/Source/Package.pm", "type": "file" }, { - "bom-ref": "ecc959bd84d98fd1", + "bom-ref": "ab2b37aeef3ad5f0", "name": "/usr/share/perl5/Dpkg/Source/Package/V1.pm", "type": "file" }, { - "bom-ref": "6e95317e76e99974", + "bom-ref": "2b98097ec0b58031", "name": "/usr/share/perl5/Dpkg/Source/Package/V2.pm", "type": "file" }, { - "bom-ref": "d7bd337306fb948e", + "bom-ref": "cac920a121523a9f", "name": "/usr/share/perl5/Dpkg/Source/Package/V3/Bzr.pm", "type": "file" }, { - "bom-ref": "af777c77c668f46e", + "bom-ref": "1a75a8447a92b637", "name": "/usr/share/perl5/Dpkg/Source/Package/V3/Custom.pm", "type": "file" }, { - "bom-ref": "cff44fe16686dc62", + "bom-ref": "e30033cb3a8e1227", "name": "/usr/share/perl5/Dpkg/Source/Package/V3/Git.pm", "type": "file" }, { - "bom-ref": "3173568147652c02", + "bom-ref": "2276a8c663d8c7bf", "name": "/usr/share/perl5/Dpkg/Source/Package/V3/Native.pm", "type": "file" }, { - "bom-ref": "f21f353375ef5efd", + "bom-ref": "bbff01403d1774b0", "name": "/usr/share/perl5/Dpkg/Source/Package/V3/Quilt.pm", "type": "file" }, { - "bom-ref": "67fb60e21fdd376c", + "bom-ref": "f841b2075614c7e9", "name": "/usr/share/perl5/Dpkg/Source/Patch.pm", "type": "file" }, { - "bom-ref": "2b26ad44f6e80819", + "bom-ref": "184d97487d808ba4", "name": "/usr/share/perl5/Dpkg/Source/Quilt.pm", "type": "file" }, { - "bom-ref": "c53b8250ff8372b2", + "bom-ref": "f14e6830b1a9030f", "name": "/usr/share/perl5/Dpkg/Substvars.pm", "type": "file" }, { - "bom-ref": "128f65f6c936c47b", + "bom-ref": "ae3a925452db0f32", "name": "/usr/share/perl5/Dpkg/Vendor.pm", "type": "file" }, { - "bom-ref": "623d6eccec63b030", + "bom-ref": "99279a5f19602bdd", "name": "/usr/share/perl5/Dpkg/Vendor/Debian.pm", "type": "file" }, { - "bom-ref": "344c21463ce2758c", + "bom-ref": "14a5f25428775771", "name": "/usr/share/perl5/Dpkg/Vendor/Default.pm", "type": "file" }, { - "bom-ref": "aa90fd6ad924ab86", + "bom-ref": "6965f68d2e857bbb", "name": "/usr/share/perl5/Dpkg/Vendor/Devuan.pm", "type": "file" }, { - "bom-ref": "abae1a9e997240b9", + "bom-ref": "8dbfbaab2d3268d0", "name": "/usr/share/perl5/Dpkg/Vendor/Ubuntu.pm", "type": "file" }, { - "bom-ref": "76d16dac1dfe4155", + "bom-ref": "02a6fdb4f359400c", "name": "/usr/share/perl5/Dpkg/Version.pm", "type": "file" }, { - "bom-ref": "c4d7285a793a226d", + "bom-ref": "f0d29fde3d9b8be4", "name": "/usr/share/perl5/Error.pm", "type": "file" }, { - "bom-ref": "013d37b2bf701603", + "bom-ref": "cc444d160b21b74a", "name": "/usr/share/perl5/Error/Simple.pm", "type": "file" }, { - "bom-ref": "c1c1d876525e3e9f", + "bom-ref": "d9f0348dffcfc71a", "name": "/usr/share/perl5/Git.pm", "type": "file" }, { - "bom-ref": "81c057d6c44a7866", + "bom-ref": "4921597a5352ccbf", "name": "/usr/share/perl5/Git/I18N.pm", "type": "file" }, { - "bom-ref": "14f04ed6a245502a", + "bom-ref": "be0d56a89896954f", "name": "/usr/share/perl5/Git/IndexInfo.pm", "type": "file" }, { - "bom-ref": "a6387ede029a53b2", + "bom-ref": "49a1e1fb6298470b", "name": "/usr/share/perl5/Git/LoadCPAN.pm", "type": "file" }, { - "bom-ref": "81ac3e6f68d691a7", + "bom-ref": "2dd3151698832156", "name": "/usr/share/perl5/Git/LoadCPAN/Error.pm", "type": "file" }, { - "bom-ref": "a32ad7c412eeb95d", + "bom-ref": "e874962a41458554", "name": "/usr/share/perl5/Git/LoadCPAN/Mail/Address.pm", "type": "file" }, { - "bom-ref": "d6512907c98ba65f", + "bom-ref": "16702aa14214fa92", "name": "/usr/share/perl5/Git/Packet.pm", "type": "file" }, { - "bom-ref": "fc7a4a64e5d69e22", + "bom-ref": "e743465f32120a64", "name": "/usr/share/pixmaps/debian-logo.png", "type": "file" }, { - "bom-ref": "9dff3c4a254b972f", + "bom-ref": "71f7e6c0aa31eb7d", "name": "/usr/share/pixmaps/python3.12.xpm", "type": "file" }, { - "bom-ref": "3e9c66c43501b575", + "bom-ref": "d188ab5a409a68a7", "name": "/usr/share/pixmaps/ubuntu-logo-text-dark.png", "type": "file" }, { - "bom-ref": "a31dfbf73978d224", + "bom-ref": "17419b2306bd5722", "name": "/usr/share/pixmaps/ubuntu-logo-text.png", "type": "file" }, { - "bom-ref": "e8c023383f25eaf1", + "bom-ref": "203ff6d71510d413", "name": "/usr/share/pixmaps/ubuntu-logo.svg", "type": "file" }, { - "bom-ref": "6c46822d82b41fd0", + "bom-ref": "11910f318b2c6cde", "name": "/usr/share/pkgconfig/RapidJSON.pc", "type": "file" }, { - "bom-ref": "8d06a3120356f132", + "bom-ref": "cfbb5026feb47d81", "name": "/usr/share/pkgconfig/hwdata.pc", "type": "file" }, { - "bom-ref": "93407372dddd8043", + "bom-ref": "4560ac5caa65a453", "name": "/usr/share/pkgconfig/personality.d/x86_64-linux-gnu.personality", "type": "file" }, { - "bom-ref": "9202113a8e8d4fe9", + "bom-ref": "68383a99c5785126", "name": "/usr/share/polkit-1/actions/org.dpkg.pkexec.update-alternatives.policy", "type": "file" }, { - "bom-ref": "547ee7093b931861", + "bom-ref": "4ceda8bc66ecb537", "name": "/usr/share/profile", "type": "file" }, { - "bom-ref": "6cf6450e9c780936", + "bom-ref": "ab81b6df8d6fc95c", "name": "/usr/share/profile.md5sums", "type": "file" }, { - "bom-ref": "747d9bfc25ad0ca3", + "bom-ref": "5cb1608494fbc57d", "name": "/usr/share/python-wheels/pip-24.0-py3-none-any.whl", "type": "file" }, { - "bom-ref": "cfe6763a3b5d6266", + "bom-ref": "0eb8790cb18ad6b8", "name": "/usr/share/python-wheels/setuptools-68.1.2-py3-none-any.whl", "type": "file" }, { - "bom-ref": "73a4a18fd7b7e34b", + "bom-ref": "0aa6d49581442c15", "name": "/usr/share/python3/debian_defaults", "type": "file" }, { - "bom-ref": "df9a33f5ed1227f7", + "bom-ref": "fd629e405bbc98a1", "name": "/usr/share/python3/debpython/__init__.py", "type": "file" }, { - "bom-ref": "614be5588854ce8d", + "bom-ref": "c00bb1fc04232a8f", "name": "/usr/share/python3/debpython/files.py", "type": "file" }, { - "bom-ref": "8be54ce4040e1e7e", + "bom-ref": "230a73bdb09f05c8", "name": "/usr/share/python3/debpython/interpreter.py", "type": "file" }, { - "bom-ref": "e6ac4d70b4a25bf6", + "bom-ref": "c14899a7b83f7808", "name": "/usr/share/python3/debpython/option.py", "type": "file" }, { - "bom-ref": "7c0460bfaf5cb843", + "bom-ref": "28af941f411bb49d", "name": "/usr/share/python3/debpython/version.py", "type": "file" }, { - "bom-ref": "d22e467d0dc39dab", + "bom-ref": "9c5b479fe4d40d3d", "name": "/usr/share/python3/py3versions.py", "type": "file" }, { - "bom-ref": "6270840b66b3f36e", + "bom-ref": "8bfa98712de81e04", "name": "/usr/share/python3/python.mk", "type": "file" }, { - "bom-ref": "c2ccdcbfc5dcbfc1", + "bom-ref": "4178c285663898a3", "name": "/usr/share/python3/runtime.d/public_modules.rtinstall", "type": "file" }, { - "bom-ref": "c4c180a156a64766", + "bom-ref": "3a84e03eb7b55e50", "name": "/usr/share/python3/runtime.d/public_modules.rtremove", "type": "file" }, { - "bom-ref": "ceb1048621e985fe", + "bom-ref": "1f563460ae2a5fb3", "name": "/usr/share/readline/inputrc", "type": "file" }, { - "bom-ref": "835718578c83cd91", + "bom-ref": "5ba499ad4ed5fd13", "name": "/usr/share/sensible-utils/bin/gettext", "type": "file" }, { - "bom-ref": "7c0783b7924982e7", + "bom-ref": "64341142bc846df9", "name": "/usr/share/sensible-utils/bin/realpath", "type": "file" }, { - "bom-ref": "caed875dc09ca8c2", - "name": "/usr/share/sgml-base/catalog.centralized", - "type": "file" - }, - { - "bom-ref": "4154449ac814af9b", - "name": "/usr/share/sgml-base/catalog.super", - "type": "file" - }, - { - "bom-ref": "b123ff194a577d07", - "name": "/usr/share/sgml-base/transitional.cat", - "type": "file" - }, - { - "bom-ref": "4ca7c5ba2e88e330", - "name": "/usr/share/sgml/dtd/xml-core/catalog", - "type": "file" - }, - { - "bom-ref": "1233053697580674", + "bom-ref": "2c882782761febf2", "name": "/usr/share/source-highlight/Hello.css", "type": "file" }, { - "bom-ref": "6de80427d3342b48", + "bom-ref": "36d8ef93dc33470e", "name": "/usr/share/source-highlight/Hello2.css", "type": "file" }, { - "bom-ref": "551cfb4fe819e1de", + "bom-ref": "782fe8c286106e30", "name": "/usr/share/source-highlight/ada.lang", "type": "file" }, { - "bom-ref": "4fab527387711c7e", + "bom-ref": "775d9c92da7f6d3c", "name": "/usr/share/source-highlight/applescript.lang", "type": "file" }, { - "bom-ref": "f84080861b00b77a", + "bom-ref": "6b2fe2ef019a7fb0", "name": "/usr/share/source-highlight/asm.lang", "type": "file" }, { - "bom-ref": "e54e24f60a70d619", + "bom-ref": "cd51be54c9737573", "name": "/usr/share/source-highlight/awk.lang", "type": "file" }, { - "bom-ref": "75f81d52997610ff", + "bom-ref": "d9b0411613a679f5", "name": "/usr/share/source-highlight/bat.lang", "type": "file" }, { - "bom-ref": "a49ed2385512b045", + "bom-ref": "1af89bdeb8a37473", "name": "/usr/share/source-highlight/bib.lang", "type": "file" }, { - "bom-ref": "ac3fa0bb479a6df0", + "bom-ref": "45129bbf6ceb169e", "name": "/usr/share/source-highlight/bison.lang", "type": "file" }, { - "bom-ref": "9b11379cb1a69516", + "bom-ref": "c9fc9f1fc941c6d4", "name": "/usr/share/source-highlight/c.lang", "type": "file" }, { - "bom-ref": "c0663f159ba58643", + "bom-ref": "3ce216f5eab3fc69", "name": "/usr/share/source-highlight/c_comment.lang", "type": "file" }, { - "bom-ref": "e0fd4e8ba7b37f0b", + "bom-ref": "ed776df59e6229ad", "name": "/usr/share/source-highlight/c_preprocessor.lang", "type": "file" }, { - "bom-ref": "76f44360393b85dd", + "bom-ref": "46fde7e37caba557", "name": "/usr/share/source-highlight/c_string.lang", "type": "file" }, { - "bom-ref": "8ae96c2877d05b9a", + "bom-ref": "01b05d5e6b51ff48", "name": "/usr/share/source-highlight/caml.lang", "type": "file" }, { - "bom-ref": "d88d945ea01c8438", + "bom-ref": "ad70b44fb3e6178a", "name": "/usr/share/source-highlight/changelog.lang", "type": "file" }, { - "bom-ref": "e57552501c88132f", + "bom-ref": "21fc7039b9aa0009", "name": "/usr/share/source-highlight/clike_vardeclaration.lang", "type": "file" }, { - "bom-ref": "e92387bd3460e0f4", + "bom-ref": "4e76f4d4487d6ed6", "name": "/usr/share/source-highlight/clipper.lang", "type": "file" }, { - "bom-ref": "d267211d11c0230c", + "bom-ref": "d9d103db9870da3e", "name": "/usr/share/source-highlight/cobol.lang", "type": "file" }, { - "bom-ref": "54ae564c8fe1a572", + "bom-ref": "676e965c18bec028", "name": "/usr/share/source-highlight/coffeescript.lang", "type": "file" }, { - "bom-ref": "f1e3a48f10f4e909", + "bom-ref": "91de1f95f9032f1f", "name": "/usr/share/source-highlight/conf.lang", "type": "file" }, { - "bom-ref": "a0b40fac5b014a17", + "bom-ref": "d1dd41cd2c76d2f1", "name": "/usr/share/source-highlight/cpp.lang", "type": "file" }, { - "bom-ref": "f62b7b02cc1c1aa1", + "bom-ref": "3559a263fcdac667", "name": "/usr/share/source-highlight/cpp2html.css", "type": "file" }, { - "bom-ref": "a38e314c69521e4f", + "bom-ref": "7f82305906ead719", "name": "/usr/share/source-highlight/csharp.lang", "type": "file" }, { - "bom-ref": "6fb9126e9e27b2a7", + "bom-ref": "640c9cc96e4a42c1", "name": "/usr/share/source-highlight/css.lang", "type": "file" }, { - "bom-ref": "5eb7532ebdebff77", + "bom-ref": "3fa7727bb9696f3d", "name": "/usr/share/source-highlight/css_common.outlang", "type": "file" }, { - "bom-ref": "35488457413b0015", + "bom-ref": "95a87aabb63a5c4f", "name": "/usr/share/source-highlight/d.lang", "type": "file" }, { - "bom-ref": "1b17fc9aef975bd1", + "bom-ref": "dc7acb360813fd83", "name": "/usr/share/source-highlight/default.css", "type": "file" }, { - "bom-ref": "f6b5fa7a914d5313", + "bom-ref": "cdf3421770789bb9", "name": "/usr/share/source-highlight/default.lang", "type": "file" }, { - "bom-ref": "ecf10179e11bf0db", + "bom-ref": "f1ee953fefa5aa55", "name": "/usr/share/source-highlight/default.style", "type": "file" }, { - "bom-ref": "51ae6df47dff6e9e", + "bom-ref": "b43a732a5377c03c", "name": "/usr/share/source-highlight/desktop.lang", "type": "file" }, { - "bom-ref": "7a8be40045d7c1be", + "bom-ref": "4a99b4d492824a44", "name": "/usr/share/source-highlight/diff.lang", "type": "file" }, { - "bom-ref": "95e88e0766665393", + "bom-ref": "dde9b0d8f5c07899", "name": "/usr/share/source-highlight/docbook.outlang", "type": "file" }, { - "bom-ref": "6addc55d709184f4", + "bom-ref": "61b04833bc61a9f6", "name": "/usr/share/source-highlight/erlang.lang", "type": "file" }, { - "bom-ref": "9e88ea7fabfe6bef", + "bom-ref": "56828836f92a4e59", "name": "/usr/share/source-highlight/errors.lang", "type": "file" }, { - "bom-ref": "83c68a0fa2c944c5", + "bom-ref": "f1aeef6f1b25e313", "name": "/usr/share/source-highlight/esc.outlang", "type": "file" }, { - "bom-ref": "e701fff758304012", + "bom-ref": "9461c1ad1418d944", "name": "/usr/share/source-highlight/esc.style", "type": "file" }, { - "bom-ref": "d3d73287c6369838", + "bom-ref": "4e096a2b58b66f56", "name": "/usr/share/source-highlight/esc256.outlang", "type": "file" }, { - "bom-ref": "b30942de9f13d3cd", + "bom-ref": "3674c60d4e206b6b", "name": "/usr/share/source-highlight/esc256.style", "type": "file" }, { - "bom-ref": "c91820a80ab71ef0", + "bom-ref": "963ef1e98c57330a", "name": "/usr/share/source-highlight/extreme_comment.lang", "type": "file" }, { - "bom-ref": "9af546ddfbbfe804", + "bom-ref": "b0ad0ec0d0936c1e", "name": "/usr/share/source-highlight/extreme_comment2.lang", "type": "file" }, { - "bom-ref": "b3a80dd09e7c0271", + "bom-ref": "5147439398b8cf07", "name": "/usr/share/source-highlight/extreme_comment3.lang", "type": "file" }, { - "bom-ref": "59c099c5c9e78dd9", + "bom-ref": "3bb611a9561e6693", "name": "/usr/share/source-highlight/feature.lang", "type": "file" }, { - "bom-ref": "f8d7b47578b65b27", + "bom-ref": "d70bd605fd3b0715", "name": "/usr/share/source-highlight/fixed-fortran.lang", "type": "file" }, { - "bom-ref": "5912fb9cd6353fab", + "bom-ref": "176c4a0a58039671", "name": "/usr/share/source-highlight/flex.lang", "type": "file" }, { - "bom-ref": "0c7dfdae11e665f4", + "bom-ref": "64e3124c0691928e", "name": "/usr/share/source-highlight/fortran.lang", "type": "file" }, { - "bom-ref": "1299168db9f2bdae", + "bom-ref": "d1d6f0cf3e14af98", "name": "/usr/share/source-highlight/function.lang", "type": "file" }, { - "bom-ref": "00b87f0d4b7752cc", + "bom-ref": "1ad0937fa8ba48ce", "name": "/usr/share/source-highlight/glsl.lang", "type": "file" }, { - "bom-ref": "165f45a26d7a3339", + "bom-ref": "0ec6ff48acd3d9b3", "name": "/usr/share/source-highlight/go.lang", "type": "file" }, { - "bom-ref": "b0e08d79ccad8597", + "bom-ref": "b484eaa5f63b72b5", "name": "/usr/share/source-highlight/groff_man.outlang", "type": "file" }, { - "bom-ref": "b7c71611a069a48a", + "bom-ref": "6fc46b19e2ef5e00", "name": "/usr/share/source-highlight/groff_mm.outlang", "type": "file" }, { - "bom-ref": "eddd01f92ac906b5", + "bom-ref": "dc727f41d6bbb427", "name": "/usr/share/source-highlight/groff_mm_color.outlang", "type": "file" }, { - "bom-ref": "63df5dfa0eb7f849", + "bom-ref": "a3316016db9389cb", "name": "/usr/share/source-highlight/groovy.lang", "type": "file" }, { - "bom-ref": "8fa07821f0b892eb", + "bom-ref": "0180008c23dbfbf9", "name": "/usr/share/source-highlight/haskell.lang", "type": "file" }, { - "bom-ref": "19b25552c6d6f4f1", + "bom-ref": "bfd652100500fc6b", "name": "/usr/share/source-highlight/haskell_literate.lang", "type": "file" }, { - "bom-ref": "e64cf5ec4cd74275", + "bom-ref": "f8995446b83976eb", "name": "/usr/share/source-highlight/haxe.lang", "type": "file" }, { - "bom-ref": "236cc6bc709846c9", + "bom-ref": "0f7baeb19f017343", "name": "/usr/share/source-highlight/html.lang", "type": "file" }, { - "bom-ref": "4028a541ef5f8c66", + "bom-ref": "410de3cd04687cb8", "name": "/usr/share/source-highlight/html.outlang", "type": "file" }, { - "bom-ref": "3036f6c6c67131ea", + "bom-ref": "5f651669b9047578", "name": "/usr/share/source-highlight/html5.outlang", "type": "file" }, { - "bom-ref": "acee36368ab200fb", + "bom-ref": "c007d7fe5d1346e9", "name": "/usr/share/source-highlight/html5_common.outlang", "type": "file" }, { - "bom-ref": "1ee8d73841ea58f2", + "bom-ref": "98b76ced2004f854", "name": "/usr/share/source-highlight/html_common.outlang", "type": "file" }, { - "bom-ref": "abb460eb0924a61d", + "bom-ref": "e213493ecbce777f", "name": "/usr/share/source-highlight/html_notfixed.outlang", "type": "file" }, { - "bom-ref": "b6076ca0276dfdba", + "bom-ref": "73c817b8b38b2be0", "name": "/usr/share/source-highlight/html_ref.outlang", "type": "file" }, { - "bom-ref": "6495b955a43e97e1", + "bom-ref": "d9bd17eea31990f3", "name": "/usr/share/source-highlight/html_simple.lang", "type": "file" }, { - "bom-ref": "5a60b21ac2a5e91b", + "bom-ref": "c6d7f94a23f68815", "name": "/usr/share/source-highlight/htmlcss.outlang", "type": "file" }, { - "bom-ref": "43bd4be27bd632a8", + "bom-ref": "a875cfb143e65c2e", "name": "/usr/share/source-highlight/htmltable.outlang", "type": "file" }, { - "bom-ref": "581bdc64af85b284", + "bom-ref": "70551fe550b926f6", "name": "/usr/share/source-highlight/htmltablelinenum.outlang", "type": "file" }, { - "bom-ref": "e28ec79fed4b5f68", + "bom-ref": "d13de5ffe83bf132", "name": "/usr/share/source-highlight/ipxe.lang", "type": "file" }, { - "bom-ref": "863558a39e14babd", + "bom-ref": "9f9d2c38239f1fcb", "name": "/usr/share/source-highlight/islisp.lang", "type": "file" }, { - "bom-ref": "16a1a5aad65e6d6b", + "bom-ref": "69b336aa223bb5c5", "name": "/usr/share/source-highlight/java.lang", "type": "file" }, { - "bom-ref": "887cfa8e79a0605c", + "bom-ref": "4330c4552983c97a", "name": "/usr/share/source-highlight/javadoc.outlang", "type": "file" }, { - "bom-ref": "82538b0d263b9935", + "bom-ref": "1eb93acf8e02b5e3", "name": "/usr/share/source-highlight/javalog.lang", "type": "file" }, { - "bom-ref": "e595e11a88630311", + "bom-ref": "ede2676f2c890503", "name": "/usr/share/source-highlight/javalog.style", "type": "file" }, { - "bom-ref": "9b3adc28796c8e99", + "bom-ref": "2383bef17fffabaf", "name": "/usr/share/source-highlight/javascript.lang", "type": "file" }, { - "bom-ref": "eef2fca12065667a", + "bom-ref": "76dd606793e05ecc", "name": "/usr/share/source-highlight/json.lang", "type": "file" }, { - "bom-ref": "9108229474051a00", + "bom-ref": "066c0853614baa2a", "name": "/usr/share/source-highlight/json.style", "type": "file" }, { - "bom-ref": "e3c107fcda88054f", + "bom-ref": "b7a920f83e3c5a61", "name": "/usr/share/source-highlight/key_string.lang", "type": "file" }, { - "bom-ref": "b6c4541e2c8fa516", + "bom-ref": "fc1b3a47d4f4c640", "name": "/usr/share/source-highlight/lang.map", "type": "file" }, { - "bom-ref": "47f9501b13049f60", + "bom-ref": "84aa28878e4991ca", "name": "/usr/share/source-highlight/langdef.lang", "type": "file" }, { - "bom-ref": "9b6e64548adaa86c", + "bom-ref": "33ad4ece687483de", "name": "/usr/share/source-highlight/latex.lang", "type": "file" }, { - "bom-ref": "f8efa56182119ff7", + "bom-ref": "67fde6c5d9dbf6e9", "name": "/usr/share/source-highlight/latex.outlang", "type": "file" }, { - "bom-ref": "7c56761ce7c502bd", + "bom-ref": "f4087c375b835eaf", "name": "/usr/share/source-highlight/latexcolor.outlang", "type": "file" }, { - "bom-ref": "46f41b0c4f70b5ac", + "bom-ref": "224f72c0ad344caa", "name": "/usr/share/source-highlight/ldap.lang", "type": "file" }, { - "bom-ref": "9af96cd998dcc167", + "bom-ref": "6c0e67b8a72cc7b5", "name": "/usr/share/source-highlight/lilypond.lang", "type": "file" }, { - "bom-ref": "fafa8bf7554d348d", + "bom-ref": "7eb8877ffa34ba07", "name": "/usr/share/source-highlight/lilypond.style", "type": "file" }, { - "bom-ref": "e62d5d5288d740e5", + "bom-ref": "a52e5a81e544e167", "name": "/usr/share/source-highlight/lisp.lang", "type": "file" }, { - "bom-ref": "5820b5baaee3e40e", + "bom-ref": "cbfee0357b746b5c", "name": "/usr/share/source-highlight/log.lang", "type": "file" }, { - "bom-ref": "d22df6515052ac63", + "bom-ref": "b3884b46957f6939", "name": "/usr/share/source-highlight/logtalk.lang", "type": "file" }, { - "bom-ref": "7ee77dfcf8d6d0b9", + "bom-ref": "3d2fd61bace65003", "name": "/usr/share/source-highlight/lsm.lang", "type": "file" }, { - "bom-ref": "556a13b183dcd26b", + "bom-ref": "1e7cac1d7d063d81", "name": "/usr/share/source-highlight/lua.lang", "type": "file" }, { - "bom-ref": "2c81e788c509ef1d", + "bom-ref": "1955538410d5abff", "name": "/usr/share/source-highlight/m4.lang", "type": "file" }, { - "bom-ref": "4346fb89d514e4a9", + "bom-ref": "c0c0b7e61a6b7cff", "name": "/usr/share/source-highlight/makefile.lang", "type": "file" }, { - "bom-ref": "40aa44ba3bf59a27", + "bom-ref": "5565ed45f5a927d9", "name": "/usr/share/source-highlight/manifest.lang", "type": "file" }, { - "bom-ref": "43d1ea16dc372e73", + "bom-ref": "3d9c95a62925ee9d", "name": "/usr/share/source-highlight/mediawiki.outlang", "type": "file" }, { - "bom-ref": "520a21a30a0cca41", + "bom-ref": "5c66e943fa0dcb33", "name": "/usr/share/source-highlight/mono-alt.css", "type": "file" }, { - "bom-ref": "5c6e88cb1a5e24d3", + "bom-ref": "9e435c2b75ecc23d", "name": "/usr/share/source-highlight/mono.css", "type": "file" }, { - "bom-ref": "1df609424332dce8", + "bom-ref": "4028949fe7bee2e6", "name": "/usr/share/source-highlight/nohilite.lang", "type": "file" }, { - "bom-ref": "f9bdab2d2c3a9d5e", + "bom-ref": "278c14cc429446b8", "name": "/usr/share/source-highlight/number.lang", "type": "file" }, { - "bom-ref": "0509a400760d4608", + "bom-ref": "6eab2923a77e45f6", "name": "/usr/share/source-highlight/odf.outlang", "type": "file" }, { - "bom-ref": "d9db81d143460d5b", + "bom-ref": "d8a5f2d060846439", "name": "/usr/share/source-highlight/opa.lang", "type": "file" }, { - "bom-ref": "7db5dda78873717d", + "bom-ref": "f0e588e349db36d3", "name": "/usr/share/source-highlight/outlang.lang", "type": "file" }, { - "bom-ref": "67ac01565c3c28a2", + "bom-ref": "9d100885ab2b973c", "name": "/usr/share/source-highlight/outlang.map", "type": "file" }, { - "bom-ref": "ece790addab040e8", + "bom-ref": "fa8d7499d1dcd6de", "name": "/usr/share/source-highlight/oz.lang", "type": "file" }, { - "bom-ref": "f779d714f5e8bded", + "bom-ref": "126b9983f1cdeb4b", "name": "/usr/share/source-highlight/pascal.lang", "type": "file" }, { - "bom-ref": "7c30fb0cbec2caa4", + "bom-ref": "1e763fd3cc39e912", "name": "/usr/share/source-highlight/pc.lang", "type": "file" }, { - "bom-ref": "ad2e84fcd2b3da53", + "bom-ref": "acf40aac4f7feaf9", "name": "/usr/share/source-highlight/perl.lang", "type": "file" }, { - "bom-ref": "8d1dab5d16a82fe8", + "bom-ref": "040656f6d619c772", "name": "/usr/share/source-highlight/php.lang", "type": "file" }, { - "bom-ref": "a0e4240023f49762", + "bom-ref": "120c7be8915429b8", "name": "/usr/share/source-highlight/po.lang", "type": "file" }, { - "bom-ref": "b2083ecc4c53cf87", + "bom-ref": "c866adcb0dffb811", "name": "/usr/share/source-highlight/postscript.lang", "type": "file" }, { - "bom-ref": "07ab3fd044135353", + "bom-ref": "72b54510d8b97575", "name": "/usr/share/source-highlight/prolog.lang", "type": "file" }, { - "bom-ref": "2fe48e870eea1325", + "bom-ref": "5c4eccb5a83af41b", "name": "/usr/share/source-highlight/properties.lang", "type": "file" }, { - "bom-ref": "cedf5ba598b80c44", + "bom-ref": "f8ad6195c1445c6e", "name": "/usr/share/source-highlight/proto.lang", "type": "file" }, { - "bom-ref": "525112d7c1d29c71", + "bom-ref": "f3b6313c66c74213", "name": "/usr/share/source-highlight/python.lang", "type": "file" }, { - "bom-ref": "3c6ef9a751324b23", + "bom-ref": "ba8f18dda0d42db9", "name": "/usr/share/source-highlight/r.lang", "type": "file" }, { - "bom-ref": "7b54303f03f2cf2b", + "bom-ref": "7265581ba332fb35", "name": "/usr/share/source-highlight/r.style", "type": "file" }, { - "bom-ref": "9b0f8e87c4d4f53d", + "bom-ref": "994c0be1d2686607", "name": "/usr/share/source-highlight/ruby.lang", "type": "file" }, { - "bom-ref": "0a5718a155f71296", + "bom-ref": "bd2152fac10a9fb0", "name": "/usr/share/source-highlight/rust.lang", "type": "file" }, { - "bom-ref": "fcbf166663632411", + "bom-ref": "dea15064f01b2bdf", "name": "/usr/share/source-highlight/s.lang", "type": "file" }, { - "bom-ref": "fb0c80713be5343e", + "bom-ref": "6c1484abc0a89d50", "name": "/usr/share/source-highlight/scala.lang", "type": "file" }, { - "bom-ref": "6e083f47b4d0a553", + "bom-ref": "736f638e5fe72ce9", "name": "/usr/share/source-highlight/scheme.lang", "type": "file" }, { - "bom-ref": "cac09e83317d5973", + "bom-ref": "2f6a2adb352a04ed", "name": "/usr/share/source-highlight/script_comment.lang", "type": "file" }, { - "bom-ref": "dda944067aad60b3", + "bom-ref": "f26b61f09e9bcb09", "name": "/usr/share/source-highlight/sexp.outlang", "type": "file" }, { - "bom-ref": "1724dc418f01f355", + "bom-ref": "87743f6ce843709b", "name": "/usr/share/source-highlight/sh.lang", "type": "file" }, { - "bom-ref": "352c788214bc2fe5", + "bom-ref": "a8b353476301a9e3", "name": "/usr/share/source-highlight/sh_acid.css", "type": "file" }, { - "bom-ref": "488861b55606b8bf", + "bom-ref": "7d4189f08fa58ccd", "name": "/usr/share/source-highlight/sh_berries-dark.css", "type": "file" }, { - "bom-ref": "20894d6f6dc44fb2", + "bom-ref": "d9810bb6fd6c6a50", "name": "/usr/share/source-highlight/sh_berries-light.css", "type": "file" }, { - "bom-ref": "30d5ae02c4b2c081", + "bom-ref": "a9aa162048314a8f", "name": "/usr/share/source-highlight/sh_bipolar.css", "type": "file" }, { - "bom-ref": "0cfb5e9b1f4cfdea", + "bom-ref": "0f15dea98cbc7614", "name": "/usr/share/source-highlight/sh_blacknblue.css", "type": "file" }, { - "bom-ref": "72acce24a6cbcfad", + "bom-ref": "b49269c9b4806777", "name": "/usr/share/source-highlight/sh_bright.css", "type": "file" }, { - "bom-ref": "46b7433ad8f065f6", + "bom-ref": "061d26b752596bf0", "name": "/usr/share/source-highlight/sh_contrast.css", "type": "file" }, { - "bom-ref": "b19a68b30c083aa0", + "bom-ref": "8de21b297f310d9e", "name": "/usr/share/source-highlight/sh_darkblue.css", "type": "file" }, { - "bom-ref": "b0ef918a10841460", + "bom-ref": "e49b05d0421a2b7a", "name": "/usr/share/source-highlight/sh_darkness.css", "type": "file" }, { - "bom-ref": "40d0809f63a86da0", + "bom-ref": "8d421736776adace", "name": "/usr/share/source-highlight/sh_desert.css", "type": "file" }, { - "bom-ref": "7ca3afb7e7658258", + "bom-ref": "82d567ac8b63969e", "name": "/usr/share/source-highlight/sh_dull.css", "type": "file" }, { - "bom-ref": "dedf30d13557d883", + "bom-ref": "dfc4eba5c4bdba31", "name": "/usr/share/source-highlight/sh_easter.css", "type": "file" }, { - "bom-ref": "f87b15b488c54d3e", + "bom-ref": "44768e3be95579d8", "name": "/usr/share/source-highlight/sh_emacs.css", "type": "file" }, { - "bom-ref": "8b474e83664fe35d", + "bom-ref": "e32ef14d6d0fd7cf", "name": "/usr/share/source-highlight/sh_golden.css", "type": "file" }, { - "bom-ref": "04341a7be5ec9720", + "bom-ref": "f977d0f6159059ae", "name": "/usr/share/source-highlight/sh_greenlcd.css", "type": "file" }, { - "bom-ref": "33c58f0b731e29c9", + "bom-ref": "d57b9b758ced6737", "name": "/usr/share/source-highlight/sh_ide-anjuta.css", "type": "file" }, { - "bom-ref": "0c3480d5272aa180", + "bom-ref": "d13d192059906e56", "name": "/usr/share/source-highlight/sh_ide-codewarrior.css", "type": "file" }, { - "bom-ref": "686acf1878c15682", + "bom-ref": "ebbd6a2c49520f78", "name": "/usr/share/source-highlight/sh_ide-devcpp.css", "type": "file" }, { - "bom-ref": "9125e6323cd06189", + "bom-ref": "2cd4ad8e2a8a02e3", "name": "/usr/share/source-highlight/sh_ide-eclipse.css", "type": "file" }, { - "bom-ref": "999adb7c2281b516", + "bom-ref": "a2ea1368b58f188c", "name": "/usr/share/source-highlight/sh_ide-kdev.css", "type": "file" }, { - "bom-ref": "0cdcc1f578da0276", + "bom-ref": "f1b115b237e3e0bc", "name": "/usr/share/source-highlight/sh_ide-msvcpp.css", "type": "file" }, { - "bom-ref": "da8d7d9aabf5fb02", + "bom-ref": "e916ffe542c6ab28", "name": "/usr/share/source-highlight/sh_kwrite.css", "type": "file" }, { - "bom-ref": "b9ac66e25cab8029", + "bom-ref": "d1d7f0991958738f", "name": "/usr/share/source-highlight/sh_matlab.css", "type": "file" }, { - "bom-ref": "d8e2bdcaec090a09", + "bom-ref": "ad0be29f0307bfdb", "name": "/usr/share/source-highlight/sh_navy.css", "type": "file" }, { - "bom-ref": "3d69ccd11f8b48dc", + "bom-ref": "83cda991a0a1270a", "name": "/usr/share/source-highlight/sh_nedit.css", "type": "file" }, { - "bom-ref": "933d3bea490a5ec0", + "bom-ref": "e227a6537f0af626", "name": "/usr/share/source-highlight/sh_neon.css", "type": "file" }, { - "bom-ref": "32dbe9e173bfd9fe", + "bom-ref": "83e4b690ea42ed78", "name": "/usr/share/source-highlight/sh_night.css", "type": "file" }, { - "bom-ref": "94d64bfe2b4ad6df", + "bom-ref": "ec996821fd350cfd", "name": "/usr/share/source-highlight/sh_pablo.css", "type": "file" }, { - "bom-ref": "2255d5523fbf1a62", + "bom-ref": "37fa5b0b16b72dfc", "name": "/usr/share/source-highlight/sh_peachpuff.css", "type": "file" }, { - "bom-ref": "d5b7fdfdbf92aa7f", + "bom-ref": "5805e83b3bf2e4f5", "name": "/usr/share/source-highlight/sh_print.css", "type": "file" }, { - "bom-ref": "68c1a584f23c87ca", + "bom-ref": "631974638a697dcc", "name": "/usr/share/source-highlight/sh_rand01.css", "type": "file" }, { - "bom-ref": "8d40948dda9251d1", + "bom-ref": "6a9d4f61b638bcd3", "name": "/usr/share/source-highlight/sh_the.css", "type": "file" }, { - "bom-ref": "505ddd20999551e2", + "bom-ref": "ad29080c191d87bc", "name": "/usr/share/source-highlight/sh_typical.css", "type": "file" }, { - "bom-ref": "bc0587bfeb96c847", + "bom-ref": "ca1c9f7adbec23fd", "name": "/usr/share/source-highlight/sh_vampire.css", "type": "file" }, { - "bom-ref": "357f0a2d0209f31d", + "bom-ref": "27fb909bdc812f57", "name": "/usr/share/source-highlight/sh_vim-dark.css", "type": "file" }, { - "bom-ref": "9513a71f3cd21859", + "bom-ref": "de9ec4e8abebbd1b", "name": "/usr/share/source-highlight/sh_vim.css", "type": "file" }, { - "bom-ref": "bda413a6e92f48ac", + "bom-ref": "f8ed28a6c0836c8a", "name": "/usr/share/source-highlight/sh_whatis.css", "type": "file" }, { - "bom-ref": "e25549d26c937ab1", + "bom-ref": "6b375db403070e87", "name": "/usr/share/source-highlight/sh_whitengrey.css", "type": "file" }, { - "bom-ref": "7a04b7e0a1a4c8bf", + "bom-ref": "dc2e2341a93ed269", "name": "/usr/share/source-highlight/sh_zellner.css", "type": "file" }, { - "bom-ref": "515cae427b781bff", + "bom-ref": "7f1829e616c70b7d", "name": "/usr/share/source-highlight/slang.lang", "type": "file" }, { - "bom-ref": "a38ee725222d34fb", + "bom-ref": "9ff8f939cf029751", "name": "/usr/share/source-highlight/sml.lang", "type": "file" }, { - "bom-ref": "020f54be1b5140ef", + "bom-ref": "f602a6b70b5aa709", "name": "/usr/share/source-highlight/source-highlight-esc.sh", "type": "file" }, { - "bom-ref": "978a377c7b91e2e0", + "bom-ref": "072c6a20cab85452", "name": "/usr/share/source-highlight/spec.lang", "type": "file" }, { - "bom-ref": "0fcf770c31990352", + "bom-ref": "db7f939aee123b00", "name": "/usr/share/source-highlight/sql.lang", "type": "file" }, { - "bom-ref": "d5ef2b7f696ff1e3", + "bom-ref": "5920b59fb13ded1d", "name": "/usr/share/source-highlight/src-hilite-lesspipe.sh", "type": "file" }, { - "bom-ref": "ad15cd6b55fca4d3", + "bom-ref": "51e5eadb47f23215", "name": "/usr/share/source-highlight/style.defaults", "type": "file" }, { - "bom-ref": "389c8f79a072fa22", + "bom-ref": "f80a958aecd9bb9c", "name": "/usr/share/source-highlight/style.lang", "type": "file" }, { - "bom-ref": "3281e383363bca21", + "bom-ref": "5f4ae32476529f43", "name": "/usr/share/source-highlight/style2.style", "type": "file" }, { - "bom-ref": "081f9d6746b0eea3", + "bom-ref": "0a14bf3655c449d1", "name": "/usr/share/source-highlight/style3.style", "type": "file" }, { - "bom-ref": "70d2b935364cfa08", + "bom-ref": "503a0023b98fc92e", "name": "/usr/share/source-highlight/symbols.lang", "type": "file" }, { - "bom-ref": "c662fcaa1d2bbb0f", + "bom-ref": "9cacef9776318281", "name": "/usr/share/source-highlight/tcl.lang", "type": "file" }, { - "bom-ref": "61d561d8df1fc629", + "bom-ref": "350254b037bbf9af", "name": "/usr/share/source-highlight/texinfo.lang", "type": "file" }, { - "bom-ref": "99aebd7ee951cece", + "bom-ref": "04a911f54c85ced0", "name": "/usr/share/source-highlight/texinfo.outlang", "type": "file" }, { - "bom-ref": "9682d8943762f499", + "bom-ref": "820861179a8d2407", "name": "/usr/share/source-highlight/texinfo.style", "type": "file" }, { - "bom-ref": "af9abb8500a79684", + "bom-ref": "a56582c7c61074ee", "name": "/usr/share/source-highlight/tml.lang", "type": "file" }, { - "bom-ref": "3dcecb3f35460e8a", + "bom-ref": "2824abdc5fc987a0", "name": "/usr/share/source-highlight/tml_formatting.lang", "type": "file" }, { - "bom-ref": "d08df88dabed43ec", + "bom-ref": "ccc012e70ff5e3ea", "name": "/usr/share/source-highlight/tml_formatting_all.lang", "type": "file" }, { - "bom-ref": "0c21ce104e2b68f6", + "bom-ref": "b290c7978727e0c4", "name": "/usr/share/source-highlight/tml_glue.lang", "type": "file" }, { - "bom-ref": "6095d5bd4bc3bdbd", + "bom-ref": "39d76348f157aa43", "name": "/usr/share/source-highlight/tml_macrolinks.lang", "type": "file" }, { - "bom-ref": "9340f6541301e9fd", + "bom-ref": "0491238cdbb4870f", "name": "/usr/share/source-highlight/tml_macros.lang", "type": "file" }, { - "bom-ref": "aceb2997f1284a0a", + "bom-ref": "bfbd8060aca0b480", "name": "/usr/share/source-highlight/tml_macros1.lang", "type": "file" }, { - "bom-ref": "ce1bf3919e3fb5ce", + "bom-ref": "96a9008a673dc958", "name": "/usr/share/source-highlight/tml_macros2.lang", "type": "file" }, { - "bom-ref": "e285a03223a910f8", + "bom-ref": "12d037287f5fafea", "name": "/usr/share/source-highlight/tml_macrosdelayed1.lang", "type": "file" }, { - "bom-ref": "34c869b5320fd77d", + "bom-ref": "2a9d5cfd6c69ad13", "name": "/usr/share/source-highlight/tml_macrosdelayed2.lang", "type": "file" }, { - "bom-ref": "175a0482e242808b", + "bom-ref": "5dac787bb773a431", "name": "/usr/share/source-highlight/tml_macrosdelayed3.lang", "type": "file" }, { - "bom-ref": "e39929a1026438b5", + "bom-ref": "cac6efc713999793", "name": "/usr/share/source-highlight/tml_macrotokens.lang", "type": "file" }, { - "bom-ref": "6326e9981d0b1bbe", + "bom-ref": "ddf6df1746735388", "name": "/usr/share/source-highlight/todo.lang", "type": "file" }, { - "bom-ref": "c714f838061db398", + "bom-ref": "5d34e989a0651722", "name": "/usr/share/source-highlight/upc.lang", "type": "file" }, { - "bom-ref": "83bdfe2793137a23", + "bom-ref": "49fee42afcdb5209", "name": "/usr/share/source-highlight/url.lang", "type": "file" }, { - "bom-ref": "32048c1ffe58f63c", + "bom-ref": "89fa8957445bdbca", "name": "/usr/share/source-highlight/vala.lang", "type": "file" }, { - "bom-ref": "5d3d02cf81ab8467", + "bom-ref": "4a4887de41284915", "name": "/usr/share/source-highlight/vbscript.lang", "type": "file" }, { - "bom-ref": "d1855f720138c78d", + "bom-ref": "2f2de34d3339c2cf", "name": "/usr/share/source-highlight/vim.lang", "type": "file" }, { - "bom-ref": "bf4b5d1864326bfc", + "bom-ref": "54f7a66ae8fb2462", "name": "/usr/share/source-highlight/xhtml.css", "type": "file" }, { - "bom-ref": "254f3efb3e4592da", + "bom-ref": "a8262db2bd549ee8", "name": "/usr/share/source-highlight/xhtml.outlang", "type": "file" }, { - "bom-ref": "9d1219b80dcd794a", + "bom-ref": "5a91e5e235bb06c4", "name": "/usr/share/source-highlight/xhtml_common.outlang", "type": "file" }, { - "bom-ref": "0970815a83801cc5", + "bom-ref": "ec9dcaf33755725b", "name": "/usr/share/source-highlight/xhtml_notfixed.outlang", "type": "file" }, { - "bom-ref": "3f9126516aa10510", + "bom-ref": "e4fa8e2a2a7ebd36", "name": "/usr/share/source-highlight/xhtmlcss.outlang", "type": "file" }, { - "bom-ref": "fd352d86b2116324", + "bom-ref": "4df05e69ef37c766", "name": "/usr/share/source-highlight/xhtmltable.outlang", "type": "file" }, { - "bom-ref": "7d4080a034b6de74", + "bom-ref": "7654c9f1c12349c2", "name": "/usr/share/source-highlight/xml.lang", "type": "file" }, { - "bom-ref": "135cc1eea9248870", + "bom-ref": "37d9dedbf5166e92", "name": "/usr/share/source-highlight/xorg.lang", "type": "file" }, { - "bom-ref": "56d73e2f902abb92", + "bom-ref": "b89ab062256e9180", "name": "/usr/share/source-highlight/zsh.lang", "type": "file" }, { - "bom-ref": "1e6dca82bfc1839d", + "bom-ref": "f3c95b24f473176b", "name": "/usr/share/staff-group-for-usr-local", "type": "file" }, { - "bom-ref": "e79461d8ddf164b1", + "bom-ref": "76aece4c8c59c25f", "name": "/usr/share/tabset/std", "type": "file" }, { - "bom-ref": "f708ee49a7473750", + "bom-ref": "635a70f74bd19952", "name": "/usr/share/tabset/stdcrt", "type": "file" }, { - "bom-ref": "190cd2ceafae0ef0", + "bom-ref": "33dcb9bac7a9306e", "name": "/usr/share/tabset/vt100", "type": "file" }, { - "bom-ref": "3767d5bfc8a792e7", + "bom-ref": "f1976ad4d82b76bd", "name": "/usr/share/tabset/vt300", "type": "file" }, { - "bom-ref": "f3be993eb3aec974", + "bom-ref": "c0d91ed71d040f4e", "name": "/usr/share/terminfo/E/Eterm", "type": "file" }, { - "bom-ref": "0788bfe041990acc", + "bom-ref": "9b79ffe07255ec02", "name": "/usr/share/terminfo/a/ansi", "type": "file" }, { - "bom-ref": "e5d32ad6a259df8c", + "bom-ref": "f3302a9c55ce2066", "name": "/usr/share/terminfo/c/cons25", "type": "file" }, { - "bom-ref": "2be943f036141f53", + "bom-ref": "520de8d48fa75661", "name": "/usr/share/terminfo/c/cygwin", "type": "file" }, { - "bom-ref": "c24176801e6106ed", + "bom-ref": "b49f86dba0a3f4af", "name": "/usr/share/terminfo/d/dumb", "type": "file" }, { - "bom-ref": "89eaff3cdb7ae51e", + "bom-ref": "82e3926cefc0b938", "name": "/usr/share/terminfo/h/hurd", "type": "file" }, { - "bom-ref": "5756cbe0b9246263", + "bom-ref": "fd01f9f5cafda0d1", "name": "/usr/share/terminfo/l/linux", "type": "file" }, { - "bom-ref": "b2db95114fb6b28d", + "bom-ref": "108f78729896418f", "name": "/usr/share/terminfo/m/mach", "type": "file" }, { - "bom-ref": "ba9f8efc137b2669", + "bom-ref": "8c45ceeb66bd2c27", "name": "/usr/share/terminfo/m/mach-bold", "type": "file" }, { - "bom-ref": "87c515265cceb8dd", + "bom-ref": "c65b15c1ca3e762b", "name": "/usr/share/terminfo/m/mach-color", "type": "file" }, { - "bom-ref": "cdabbebfb7714bc3", + "bom-ref": "965c840d27796635", "name": "/usr/share/terminfo/m/mach-gnu", "type": "file" }, { - "bom-ref": "829b4ae09f95da10", + "bom-ref": "fde9db92a7cba496", "name": "/usr/share/terminfo/m/mach-gnu-color", "type": "file" }, { - "bom-ref": "ad4a220a7ff03e62", + "bom-ref": "781bfd6dc0e830f0", "name": "/usr/share/terminfo/p/pcansi", "type": "file" }, { - "bom-ref": "5569c3b442b3c2ac", + "bom-ref": "b42ad9969489bd52", "name": "/usr/share/terminfo/r/rxvt", "type": "file" }, { - "bom-ref": "5e5d1a0e99e9fb11", + "bom-ref": "05ab34a1dd422be7", "name": "/usr/share/terminfo/r/rxvt-basic", "type": "file" }, { - "bom-ref": "9342c39be3676a25", + "bom-ref": "5983b5710cbd2edb", "name": "/usr/share/terminfo/r/rxvt-unicode", "type": "file" }, { - "bom-ref": "bb1a0104b7b459b3", + "bom-ref": "435a512bb6706755", "name": "/usr/share/terminfo/r/rxvt-unicode-256color", "type": "file" }, { - "bom-ref": "a52ad50648e18eef", + "bom-ref": "1e26c2320de1eb59", "name": "/usr/share/terminfo/s/screen", "type": "file" }, { - "bom-ref": "d20e1c4b96079be5", + "bom-ref": "649facd9a2d7799f", "name": "/usr/share/terminfo/s/screen-256color", "type": "file" }, { - "bom-ref": "be8aee057e13a9e2", + "bom-ref": "c0c64fd9e63206b0", "name": "/usr/share/terminfo/s/screen-256color-bce", "type": "file" }, { - "bom-ref": "0c22fb56f637bb30", + "bom-ref": "ae7ba88d0ab4b162", "name": "/usr/share/terminfo/s/screen-bce", "type": "file" }, { - "bom-ref": "cf2ade175eac52e8", + "bom-ref": "b73f65e6aaca541e", "name": "/usr/share/terminfo/s/screen-s", "type": "file" }, { - "bom-ref": "5d39a07ca00bbb28", + "bom-ref": "189dff3778292006", "name": "/usr/share/terminfo/s/screen-w", "type": "file" }, { - "bom-ref": "9005887550aee8eb", + "bom-ref": "f2f78d13ffac3e2d", "name": "/usr/share/terminfo/s/screen.xterm-256color", "type": "file" }, { - "bom-ref": "6587ed5cad2eff44", + "bom-ref": "42c5940f916d9a3a", "name": "/usr/share/terminfo/s/sun", "type": "file" }, { - "bom-ref": "3b167b429700a897", + "bom-ref": "36ea9f71992b9d4d", "name": "/usr/share/terminfo/t/tmux", "type": "file" }, { - "bom-ref": "c80bd3492642741e", + "bom-ref": "15ef8862cd8114ec", "name": "/usr/share/terminfo/t/tmux-256color", "type": "file" }, { - "bom-ref": "006816721e66275a", + "bom-ref": "d869c6a21af5d440", "name": "/usr/share/terminfo/v/vt100", "type": "file" }, { - "bom-ref": "95438901577721e5", + "bom-ref": "46c22dd9521812f7", "name": "/usr/share/terminfo/v/vt102", "type": "file" }, { - "bom-ref": "841e15ab5b6743a5", + "bom-ref": "791523e703c1ad87", "name": "/usr/share/terminfo/v/vt220", "type": "file" }, { - "bom-ref": "c1344ace9c9597c8", + "bom-ref": "3a196f0e4dcf23c6", "name": "/usr/share/terminfo/v/vt52", "type": "file" }, { - "bom-ref": "a2ea105c3eedd5ec", + "bom-ref": "9bf5c43060e982fa", "name": "/usr/share/terminfo/w/wsvt25", "type": "file" }, { - "bom-ref": "3aefee5a34173e27", + "bom-ref": "0a77b4d07bb8c415", "name": "/usr/share/terminfo/w/wsvt25m", "type": "file" }, { - "bom-ref": "7aa886db54f4546c", + "bom-ref": "cd867521b814d5ee", "name": "/usr/share/terminfo/x/xterm", "type": "file" }, { - "bom-ref": "0ada02d747dcde73", + "bom-ref": "b5f35aa871f68e15", "name": "/usr/share/terminfo/x/xterm-256color", "type": "file" }, { - "bom-ref": "bbdfc63f761c0a90", + "bom-ref": "fe49e4e426ad3ac2", "name": "/usr/share/terminfo/x/xterm-color", "type": "file" }, { - "bom-ref": "811b68e080f16dfb", + "bom-ref": "e9c8eb8996bdcba9", "name": "/usr/share/terminfo/x/xterm-mono", "type": "file" }, { - "bom-ref": "d4cce4728ec2f8b2", + "bom-ref": "f817fee6b5257234", "name": "/usr/share/terminfo/x/xterm-r5", "type": "file" }, { - "bom-ref": "0349dc4ae4e5c1e2", + "bom-ref": "f580a8e4a9f44390", "name": "/usr/share/terminfo/x/xterm-r6", "type": "file" }, { - "bom-ref": "0e1de90de6e8eee2", + "bom-ref": "8d52553783030248", "name": "/usr/share/terminfo/x/xterm-vt220", "type": "file" }, { - "bom-ref": "6ba6b4fe71b2d281", + "bom-ref": "df1d678de9f8fbab", "name": "/usr/share/terminfo/x/xterm-xfree86", "type": "file" }, { - "bom-ref": "d19da1f97740a8e2", + "bom-ref": "1dd3c61e4efc2050", "name": "/usr/share/ucf/ucf_helper_functions.sh", "type": "file" }, { - "bom-ref": "7502061402d91341", + "bom-ref": "de00de25af038c4f", "name": "/usr/share/util-linux/logcheck/ignore.d.server/util-linux", "type": "file" }, { - "bom-ref": "a14e75be638504ef", + "bom-ref": "94837e469e20c545", "name": "/usr/share/vim/addons/syntax/ninja.vim", "type": "file" }, { - "bom-ref": "51f85accc5485cbc", + "bom-ref": "ac0a3fffcceebe74", "name": "/usr/share/vim/vim91/autoload/RstFold.vim", "type": "file" }, { - "bom-ref": "7f5ebd5c193dc180", + "bom-ref": "ac722f877cf47328", "name": "/usr/share/vim/vim91/autoload/ada.vim", "type": "file" }, { - "bom-ref": "d633f5cbb509a8c5", + "bom-ref": "3204988ef11323d1", "name": "/usr/share/vim/vim91/autoload/adacomplete.vim", "type": "file" }, { - "bom-ref": "e302afd7f7cd9c3e", + "bom-ref": "9dd7110a110d840e", "name": "/usr/share/vim/vim91/autoload/bitbake.vim", "type": "file" }, { - "bom-ref": "a7cd20dd12b7ecd5", + "bom-ref": "566dcef5b88644f1", "name": "/usr/share/vim/vim91/autoload/cargo.vim", "type": "file" }, { - "bom-ref": "017f02498ab7c7a2", + "bom-ref": "fa231e7ef4eae96a", "name": "/usr/share/vim/vim91/autoload/ccomplete.vim", "type": "file" }, { - "bom-ref": "4b24319f9dacdd5f", + "bom-ref": "1ff2ea9f165530eb", "name": "/usr/share/vim/vim91/autoload/clojurecomplete.vim", "type": "file" }, { - "bom-ref": "cdaab928066b54df", + "bom-ref": "19cf702b51ac2c87", "name": "/usr/share/vim/vim91/autoload/context.vim", "type": "file" }, { - "bom-ref": "0f8be99b893c1578", + "bom-ref": "0d7a107a26288568", "name": "/usr/share/vim/vim91/autoload/contextcomplete.vim", "type": "file" }, { - "bom-ref": "bbe9f741193bab65", + "bom-ref": "f32fda41f5245bc9", "name": "/usr/share/vim/vim91/autoload/csscomplete.vim", "type": "file" }, { - "bom-ref": "5dc3e8f244bec663", + "bom-ref": "57df3ef0fe1493e7", "name": "/usr/share/vim/vim91/autoload/decada.vim", "type": "file" }, { - "bom-ref": "1e0cab0d67a10f26", + "bom-ref": "73fb1d5e6d2599f6", "name": "/usr/share/vim/vim91/autoload/dist/ft.vim", "type": "file" }, { - "bom-ref": "e2a4a37225a76609", + "bom-ref": "d069280a201fc92d", "name": "/usr/share/vim/vim91/autoload/dist/json.vim", "type": "file" }, { - "bom-ref": "e650b9ec3cef5d53", + "bom-ref": "3ed1bbfb236d1147", "name": "/usr/share/vim/vim91/autoload/dist/man.vim", "type": "file" }, { - "bom-ref": "4430d2db32e3c7e7", + "bom-ref": "bdb2ea4e7419bfe3", "name": "/usr/share/vim/vim91/autoload/dist/script.vim", "type": "file" }, { - "bom-ref": "22f841fd2fbad0c5", + "bom-ref": "68db2b82940bd959", "name": "/usr/share/vim/vim91/autoload/dist/vim.vim", "type": "file" }, { - "bom-ref": "1fbace5f436b7c5f", + "bom-ref": "ebb6d1eda8b31edf", "name": "/usr/share/vim/vim91/autoload/dist/vim9.vim", "type": "file" }, { - "bom-ref": "401f590f266cc6ce", + "bom-ref": "c7a4512ea6455bda", "name": "/usr/share/vim/vim91/autoload/dist/vimindent.vim", "type": "file" }, { - "bom-ref": "f1aa08cbf191a14c", + "bom-ref": "f8c5c98a9403fb80", "name": "/usr/share/vim/vim91/autoload/freebasic.vim", "type": "file" }, { - "bom-ref": "13d9009305a1e578", + "bom-ref": "5ea5f5c486dc0240", "name": "/usr/share/vim/vim91/autoload/getscript.vim", "type": "file" }, { - "bom-ref": "543678a08c4f4e21", + "bom-ref": "a303fd92484803dd", "name": "/usr/share/vim/vim91/autoload/gnat.vim", "type": "file" }, { - "bom-ref": "ab71d6042eba556d", + "bom-ref": "b362c4f8a3419e45", "name": "/usr/share/vim/vim91/autoload/gzip.vim", "type": "file" }, { - "bom-ref": "f533391f04ed86d8", + "bom-ref": "479bc6f1c165a91c", "name": "/usr/share/vim/vim91/autoload/haskellcomplete.vim", "type": "file" }, { - "bom-ref": "aeb80f004d3790d1", + "bom-ref": "c84fac6cb137c68d", "name": "/usr/share/vim/vim91/autoload/htmlcomplete.vim", "type": "file" }, { - "bom-ref": "1f9bce7c71673f60", + "bom-ref": "c1035be9c93bdbb8", "name": "/usr/share/vim/vim91/autoload/javascriptcomplete.vim", "type": "file" }, { - "bom-ref": "7d2064490371e842", + "bom-ref": "95613b5617c9b0f2", "name": "/usr/share/vim/vim91/autoload/modula2.vim", "type": "file" }, { - "bom-ref": "8f8cf02687d55c31", + "bom-ref": "e0d87e6d650ac595", "name": "/usr/share/vim/vim91/autoload/netrw.vim", "type": "file" }, { - "bom-ref": "3909a007eab604f4", + "bom-ref": "da8c53fcf7de1ba8", "name": "/usr/share/vim/vim91/autoload/netrwFileHandlers.vim", "type": "file" }, { - "bom-ref": "d2ee82923bfecfca", + "bom-ref": "a83fb5099291107e", "name": "/usr/share/vim/vim91/autoload/netrwSettings.vim", "type": "file" }, { - "bom-ref": "db798cbcf1c16707", + "bom-ref": "1d39a8d10c30c71f", "name": "/usr/share/vim/vim91/autoload/netrw_gitignore.vim", "type": "file" }, { - "bom-ref": "f6fd1abf3beb8f77", + "bom-ref": "536279a48f6f7bb7", "name": "/usr/share/vim/vim91/autoload/paste.vim", "type": "file" }, { - "bom-ref": "7c6f94e3b7d143f4", + "bom-ref": "6220377f145b44f4", "name": "/usr/share/vim/vim91/autoload/phpcomplete.vim", "type": "file" }, { - "bom-ref": "241f83b21a3d5059", + "bom-ref": "6dd9800e827aeee1", "name": "/usr/share/vim/vim91/autoload/python.vim", "type": "file" }, { - "bom-ref": "0886c9093d665d10", + "bom-ref": "80f7abec1a05d294", "name": "/usr/share/vim/vim91/autoload/python3complete.vim", "type": "file" }, { - "bom-ref": "db7cace96be549d0", + "bom-ref": "c998bc1ed519b064", "name": "/usr/share/vim/vim91/autoload/pythoncomplete.vim", "type": "file" }, { - "bom-ref": "8020e7c63a3115ad", + "bom-ref": "1e151892b6161df1", "name": "/usr/share/vim/vim91/autoload/racket.vim", "type": "file" }, { - "bom-ref": "e127aa04b45ffd5c", + "bom-ref": "07b1cd69c953824c", "name": "/usr/share/vim/vim91/autoload/rubycomplete.vim", "type": "file" }, { - "bom-ref": "160a9d5d29c5b452", + "bom-ref": "2dd20945fa24e6c2", "name": "/usr/share/vim/vim91/autoload/rust.vim", "type": "file" }, { - "bom-ref": "b89a67c82d99a9c8", + "bom-ref": "2ecc759c220ff6f8", "name": "/usr/share/vim/vim91/autoload/rustfmt.vim", "type": "file" }, { - "bom-ref": "2c75d02a8a359406", + "bom-ref": "e0e91e2469e53042", "name": "/usr/share/vim/vim91/autoload/spellfile.vim", "type": "file" }, { - "bom-ref": "a29f70818241ed2a", + "bom-ref": "f692230dd19684ca", "name": "/usr/share/vim/vim91/autoload/sqlcomplete.vim", "type": "file" }, { - "bom-ref": "848f3a0b4c0e535b", + "bom-ref": "00c614127455eacb", "name": "/usr/share/vim/vim91/autoload/syntaxcomplete.vim", "type": "file" }, { - "bom-ref": "4259855dcc741b5d", + "bom-ref": "e0d5d264cd9ed711", "name": "/usr/share/vim/vim91/autoload/tar.vim", "type": "file" }, { - "bom-ref": "4d7bb61eefdfb7f6", + "bom-ref": "595ef22aff9221a6", "name": "/usr/share/vim/vim91/autoload/tohtml.vim", "type": "file" }, { - "bom-ref": "64b628f5b068030b", + "bom-ref": "f1fc8eebeb9dd397", "name": "/usr/share/vim/vim91/autoload/typeset.vim", "type": "file" }, { - "bom-ref": "5f76f535e9fb7519", + "bom-ref": "4a53bc77b16ab571", "name": "/usr/share/vim/vim91/autoload/vimball.vim", "type": "file" }, { - "bom-ref": "e149ce75443e5fe2", + "bom-ref": "af816f388629bada", "name": "/usr/share/vim/vim91/autoload/xml/html32.vim", "type": "file" }, { - "bom-ref": "c11041642183c24a", + "bom-ref": "ffdded036c117d66", "name": "/usr/share/vim/vim91/autoload/xml/html401f.vim", "type": "file" }, { - "bom-ref": "8f6de63e2b57b8c4", + "bom-ref": "fb158a41f773279c", "name": "/usr/share/vim/vim91/autoload/xml/html401s.vim", "type": "file" }, { - "bom-ref": "40ce552864ac427f", + "bom-ref": "378bef83ad2b1ab3", "name": "/usr/share/vim/vim91/autoload/xml/html401t.vim", "type": "file" }, { - "bom-ref": "ac343424e714a8d5", + "bom-ref": "4c4c6ff17226e5d1", "name": "/usr/share/vim/vim91/autoload/xml/html40f.vim", "type": "file" }, { - "bom-ref": "0c74561112689f0c", + "bom-ref": "8968abcb3b32ff94", "name": "/usr/share/vim/vim91/autoload/xml/html40s.vim", "type": "file" }, { - "bom-ref": "4e14dcdcc7be7d2b", + "bom-ref": "c3cc9263396cf12f", "name": "/usr/share/vim/vim91/autoload/xml/html40t.vim", "type": "file" }, { - "bom-ref": "c8d047159c3a2581", + "bom-ref": "3958522c1a49f8b9", "name": "/usr/share/vim/vim91/autoload/xml/xhtml10f.vim", "type": "file" }, { - "bom-ref": "80482d9d380425d3", + "bom-ref": "d981987a97549ff3", "name": "/usr/share/vim/vim91/autoload/xml/xhtml10s.vim", "type": "file" }, { - "bom-ref": "e51136a89aab350c", + "bom-ref": "f9ae3790ff798184", "name": "/usr/share/vim/vim91/autoload/xml/xhtml10t.vim", "type": "file" }, { - "bom-ref": "c2a13dcf62e20384", + "bom-ref": "a8a51620178ce6a0", "name": "/usr/share/vim/vim91/autoload/xml/xhtml11.vim", "type": "file" }, { - "bom-ref": "0e662b2954cdfc75", + "bom-ref": "bc379ab6254ada3d", "name": "/usr/share/vim/vim91/autoload/xml/xsd.vim", "type": "file" }, { - "bom-ref": "de3508c24c62d348", + "bom-ref": "3bbfa174ed927868", "name": "/usr/share/vim/vim91/autoload/xml/xsl.vim", "type": "file" }, { - "bom-ref": "cc0c8eed3dc5e12a", + "bom-ref": "46202a0de4df6966", "name": "/usr/share/vim/vim91/autoload/xmlcomplete.vim", "type": "file" }, { - "bom-ref": "1618e5affb4f4ff9", + "bom-ref": "1e00700f5c8ec591", "name": "/usr/share/vim/vim91/autoload/xmlformat.vim", "type": "file" }, { - "bom-ref": "952ac90a3ca9ebae", + "bom-ref": "a9d11f3eca6d2d7a", "name": "/usr/share/vim/vim91/autoload/zig/fmt.vim", "type": "file" }, { - "bom-ref": "c6fd00f15e8560b8", + "bom-ref": "8c3e75dcdd629edc", "name": "/usr/share/vim/vim91/autoload/zip.vim", "type": "file" }, { - "bom-ref": "54b9723cc7940b30", + "bom-ref": "fb2005f9f0153078", "name": "/usr/share/vim/vim91/bugreport.vim", "type": "file" }, { - "bom-ref": "e2951d2e1c151826", + "bom-ref": "2b894b6bb9f1b56a", "name": "/usr/share/vim/vim91/colors/blue.vim", "type": "file" }, { - "bom-ref": "09ca623452c4fc18", + "bom-ref": "8912cead6bcefdf0", "name": "/usr/share/vim/vim91/colors/darkblue.vim", "type": "file" }, { - "bom-ref": "23147b1d6d95fbd3", + "bom-ref": "ee4f08a6e3ac4247", "name": "/usr/share/vim/vim91/colors/default.vim", "type": "file" }, { - "bom-ref": "022580c6b64e6fb6", + "bom-ref": "82e9a9b4360c4b52", "name": "/usr/share/vim/vim91/colors/delek.vim", "type": "file" }, { - "bom-ref": "505c49a9bf752d1d", + "bom-ref": "796f312875501491", "name": "/usr/share/vim/vim91/colors/desert.vim", "type": "file" }, { - "bom-ref": "faf7a3d519257e37", + "bom-ref": "468f8e85d2be0a7b", "name": "/usr/share/vim/vim91/colors/elflord.vim", "type": "file" }, { - "bom-ref": "983b5426ed582063", + "bom-ref": "162e52bf7484ded3", "name": "/usr/share/vim/vim91/colors/evening.vim", "type": "file" }, { - "bom-ref": "0a719a1968808519", + "bom-ref": "7026e8c19e89e631", "name": "/usr/share/vim/vim91/colors/habamax.vim", "type": "file" }, { - "bom-ref": "f7048dfe640b8cc4", + "bom-ref": "7593ce3279a5931c", "name": "/usr/share/vim/vim91/colors/industry.vim", "type": "file" }, { - "bom-ref": "408a523524db6ed9", + "bom-ref": "38e0d22ceb881055", "name": "/usr/share/vim/vim91/colors/koehler.vim", "type": "file" }, { - "bom-ref": "aa522b97159f489f", + "bom-ref": "2f5c0f5ad3501697", "name": "/usr/share/vim/vim91/colors/lists/csscolors.vim", "type": "file" }, { - "bom-ref": "05e0491bb7a9d66c", + "bom-ref": "622eb73c850f5740", "name": "/usr/share/vim/vim91/colors/lists/default.vim", "type": "file" }, { - "bom-ref": "2060c975563553ed", + "bom-ref": "28909f88e94c9091", "name": "/usr/share/vim/vim91/colors/lunaperche.vim", "type": "file" }, { - "bom-ref": "fec607ca482649d2", + "bom-ref": "7c4ba4cf18156836", "name": "/usr/share/vim/vim91/colors/morning.vim", "type": "file" }, { - "bom-ref": "cf800c8125817266", + "bom-ref": "e9777b1f5d3e48d6", "name": "/usr/share/vim/vim91/colors/murphy.vim", "type": "file" }, { - "bom-ref": "2ea918ec047fb34e", + "bom-ref": "c0e1537883bd9cf2", "name": "/usr/share/vim/vim91/colors/pablo.vim", "type": "file" }, { - "bom-ref": "e6eacb34279dceef", + "bom-ref": "9361e77434e079eb", "name": "/usr/share/vim/vim91/colors/peachpuff.vim", "type": "file" }, { - "bom-ref": "e5db1a382b224263", + "bom-ref": "ee306e6d99cb01e7", "name": "/usr/share/vim/vim91/colors/quiet.vim", "type": "file" }, { - "bom-ref": "0b52a8e34d1fc2bd", + "bom-ref": "9de6141d728cc1c5", "name": "/usr/share/vim/vim91/colors/retrobox.vim", "type": "file" }, { - "bom-ref": "f36db772fad5abaf", + "bom-ref": "c2e7652df146cc07", "name": "/usr/share/vim/vim91/colors/ron.vim", "type": "file" }, { - "bom-ref": "048c54baa1652768", + "bom-ref": "92703731f5b8e2cc", "name": "/usr/share/vim/vim91/colors/shine.vim", "type": "file" }, { - "bom-ref": "b7aae6526b05aedf", + "bom-ref": "eb0ecbe85a7aa753", "name": "/usr/share/vim/vim91/colors/slate.vim", "type": "file" }, { - "bom-ref": "38d248be70e0c343", + "bom-ref": "b66ee769f7b63b03", "name": "/usr/share/vim/vim91/colors/sorbet.vim", "type": "file" }, { - "bom-ref": "b8be1b0fc9a70e56", + "bom-ref": "74cad16626e2045e", "name": "/usr/share/vim/vim91/colors/tools/check_colors.vim", "type": "file" }, { - "bom-ref": "9fde7651025a0606", + "bom-ref": "58ea739969011fc2", "name": "/usr/share/vim/vim91/colors/torte.vim", "type": "file" }, { - "bom-ref": "bfd22c67059f9631", + "bom-ref": "5d48fbeacd2fe9d5", "name": "/usr/share/vim/vim91/colors/wildcharm.vim", "type": "file" }, { - "bom-ref": "11049d50f6fee314", + "bom-ref": "4465f227206298cc", "name": "/usr/share/vim/vim91/colors/zaibatsu.vim", "type": "file" }, { - "bom-ref": "ff6c455d75070ae4", + "bom-ref": "407adcbb451212b0", "name": "/usr/share/vim/vim91/colors/zellner.vim", "type": "file" }, { - "bom-ref": "ba7604e214411196", + "bom-ref": "ebfe0b052fd88312", "name": "/usr/share/vim/vim91/compiler/ant.vim", "type": "file" }, { - "bom-ref": "39984421b498dc1e", + "bom-ref": "0a2a3e9646932102", "name": "/usr/share/vim/vim91/compiler/bcc.vim", "type": "file" }, { - "bom-ref": "7be1786c72e9f9bf", + "bom-ref": "825a8203fef2cc9f", "name": "/usr/share/vim/vim91/compiler/bdf.vim", "type": "file" }, { - "bom-ref": "c83231d505d1b6ab", + "bom-ref": "bba38377b86d049f", "name": "/usr/share/vim/vim91/compiler/cargo.vim", "type": "file" }, { - "bom-ref": "6e2808671cb17b57", + "bom-ref": "9510f8e8d9e5f08f", "name": "/usr/share/vim/vim91/compiler/checkstyle.vim", "type": "file" }, { - "bom-ref": "1c1c5a503f881bf4", + "bom-ref": "be6a3f39be682148", "name": "/usr/share/vim/vim91/compiler/cm3.vim", "type": "file" }, { - "bom-ref": "98bc3a962412a71e", + "bom-ref": "ac0ab4a6ee62d6ea", "name": "/usr/share/vim/vim91/compiler/context.vim", "type": "file" }, { - "bom-ref": "97b49c255a15ffa8", + "bom-ref": "35c8f7f8b83ac20c", "name": "/usr/share/vim/vim91/compiler/cs.vim", "type": "file" }, { - "bom-ref": "bca0e5b48d18e6ce", + "bom-ref": "42ba9b7d6522b2ee", "name": "/usr/share/vim/vim91/compiler/csslint.vim", "type": "file" }, { - "bom-ref": "22dad8b28bd1154e", + "bom-ref": "66e699d197d76856", "name": "/usr/share/vim/vim91/compiler/cucumber.vim", "type": "file" }, { - "bom-ref": "3394a2f63376ed13", + "bom-ref": "2c901dd1fec64ab7", "name": "/usr/share/vim/vim91/compiler/dart.vim", "type": "file" }, { - "bom-ref": "9d6fa9264e45bc07", + "bom-ref": "18fffb8a7ef4bfdf", "name": "/usr/share/vim/vim91/compiler/dart2js.vim", "type": "file" }, { - "bom-ref": "850a2a001a6a98c9", + "bom-ref": "81f763cbd2e0b385", "name": "/usr/share/vim/vim91/compiler/dart2native.vim", "type": "file" }, { - "bom-ref": "8f224ddb58bee2bf", + "bom-ref": "c58751ddb6df7aab", "name": "/usr/share/vim/vim91/compiler/dartanalyser.vim", "type": "file" }, { - "bom-ref": "dec41897c0e7ecc1", + "bom-ref": "d3aca4636960e2b1", "name": "/usr/share/vim/vim91/compiler/dartdevc.vim", "type": "file" }, { - "bom-ref": "048ef03a2aee0607", + "bom-ref": "94162e1f1854625f", "name": "/usr/share/vim/vim91/compiler/dartdoc.vim", "type": "file" }, { - "bom-ref": "821769743808f55a", + "bom-ref": "7a69964ce25972be", "name": "/usr/share/vim/vim91/compiler/dartfmt.vim", "type": "file" }, { - "bom-ref": "17413b0937897cc9", + "bom-ref": "59bbe04cd11daf95", "name": "/usr/share/vim/vim91/compiler/decada.vim", "type": "file" }, { - "bom-ref": "3f14806306784f17", + "bom-ref": "9a00dae311cb693b", "name": "/usr/share/vim/vim91/compiler/dot.vim", "type": "file" }, { - "bom-ref": "f5907f8b0c14312a", + "bom-ref": "679b88d9b693e1d6", "name": "/usr/share/vim/vim91/compiler/dotnet.vim", "type": "file" }, { - "bom-ref": "f1a7d2cf344192db", + "bom-ref": "6e263ad991ebd013", "name": "/usr/share/vim/vim91/compiler/erlang.vim", "type": "file" }, { - "bom-ref": "2644fbb84af89ef4", + "bom-ref": "6a9e38571ae19ef0", "name": "/usr/share/vim/vim91/compiler/eruby.vim", "type": "file" }, { - "bom-ref": "611e2bc7da6d03a6", + "bom-ref": "696b2095de42555e", "name": "/usr/share/vim/vim91/compiler/eslint.vim", "type": "file" }, { - "bom-ref": "dd48e6daf4815ff1", + "bom-ref": "aefdbbd9dc680a1d", "name": "/usr/share/vim/vim91/compiler/fbc.vim", "type": "file" }, { - "bom-ref": "738efc4c45cee457", + "bom-ref": "2956b8907fca054f", "name": "/usr/share/vim/vim91/compiler/fortran_F.vim", "type": "file" }, { - "bom-ref": "f4e1bc959e3e0243", + "bom-ref": "d2cf76a7831b5bab", "name": "/usr/share/vim/vim91/compiler/fortran_cv.vim", "type": "file" }, { - "bom-ref": "6d639ad3284cc717", + "bom-ref": "a5b0daf7eae10f57", "name": "/usr/share/vim/vim91/compiler/fortran_elf90.vim", "type": "file" }, { - "bom-ref": "fd3570ffedddbcf4", + "bom-ref": "4d1157556bd99e2c", "name": "/usr/share/vim/vim91/compiler/fortran_g77.vim", "type": "file" }, { - "bom-ref": "89e3643436a1f961", + "bom-ref": "880f74824148b9c9", "name": "/usr/share/vim/vim91/compiler/fortran_lf95.vim", "type": "file" }, { - "bom-ref": "ef7ada8b3fbc109f", + "bom-ref": "eac63d104d2a6863", "name": "/usr/share/vim/vim91/compiler/fpc.vim", "type": "file" }, { - "bom-ref": "c56374cbaa2dee64", + "bom-ref": "ccb0d2faa7c95fe0", "name": "/usr/share/vim/vim91/compiler/g95.vim", "type": "file" }, { - "bom-ref": "e2799d18889a7320", + "bom-ref": "0d407ec6556220e0", "name": "/usr/share/vim/vim91/compiler/gawk.vim", "type": "file" }, { - "bom-ref": "21ea0ca488b70568", + "bom-ref": "fc172b7a780f2518", "name": "/usr/share/vim/vim91/compiler/gcc.vim", "type": "file" }, { - "bom-ref": "7c2795c627d26934", + "bom-ref": "618be7e6953c11fc", "name": "/usr/share/vim/vim91/compiler/gfortran.vim", "type": "file" }, { - "bom-ref": "53b49f8dd2f16621", + "bom-ref": "fdee03d0b1ba6ef1", "name": "/usr/share/vim/vim91/compiler/ghc.vim", "type": "file" }, { - "bom-ref": "93ff8414fa3f66c7", + "bom-ref": "cdba595b36178ac7", "name": "/usr/share/vim/vim91/compiler/gjs.vim", "type": "file" }, { - "bom-ref": "d8751a8e1058a611", + "bom-ref": "f2c78be645a3fa89", "name": "/usr/share/vim/vim91/compiler/gm2.vim", "type": "file" }, { - "bom-ref": "931b54189c130c9a", + "bom-ref": "afb3fd017966d276", "name": "/usr/share/vim/vim91/compiler/gnat.vim", "type": "file" }, { - "bom-ref": "9729027ca84e3614", + "bom-ref": "f7d33d54b74d2158", "name": "/usr/share/vim/vim91/compiler/go.vim", "type": "file" }, { - "bom-ref": "3c0b41a33032850e", + "bom-ref": "1e1ea0b4181b058e", "name": "/usr/share/vim/vim91/compiler/haml.vim", "type": "file" }, { - "bom-ref": "f3cdbd86f938c8cf", + "bom-ref": "f94a21bf1be98e73", "name": "/usr/share/vim/vim91/compiler/hare.vim", "type": "file" }, { - "bom-ref": "42bdc9ce9b98ff17", + "bom-ref": "aaa70ea8e4e96317", "name": "/usr/share/vim/vim91/compiler/hp_acc.vim", "type": "file" }, { - "bom-ref": "1c0bd68313f44642", + "bom-ref": "af2c9e54b192c5fa", "name": "/usr/share/vim/vim91/compiler/icc.vim", "type": "file" }, { - "bom-ref": "dde6eb6f2a7a8cf1", + "bom-ref": "b9220c1e48d455a5", "name": "/usr/share/vim/vim91/compiler/icon.vim", "type": "file" }, { - "bom-ref": "f232db7b19df9a54", + "bom-ref": "7514dd2867ba6d08", "name": "/usr/share/vim/vim91/compiler/ifort.vim", "type": "file" }, { - "bom-ref": "b9a7d6b83c11339d", + "bom-ref": "f52837c971231255", "name": "/usr/share/vim/vim91/compiler/intel.vim", "type": "file" }, { - "bom-ref": "bbbf25f0420eb019", + "bom-ref": "3712bff32d034ca9", "name": "/usr/share/vim/vim91/compiler/irix5_c.vim", "type": "file" }, { - "bom-ref": "b96a2d27dfc40629", + "bom-ref": "937b1f531e077dd9", "name": "/usr/share/vim/vim91/compiler/irix5_cpp.vim", "type": "file" }, { - "bom-ref": "50f13aa375e5dbb6", + "bom-ref": "b19d42f446f449ae", "name": "/usr/share/vim/vim91/compiler/javac.vim", "type": "file" }, { - "bom-ref": "e61e64f1639025f9", + "bom-ref": "81bc3ae831ccf66d", "name": "/usr/share/vim/vim91/compiler/jest.vim", "type": "file" }, { - "bom-ref": "395fa8e5a37da2cf", + "bom-ref": "f359db824cad2fbf", "name": "/usr/share/vim/vim91/compiler/jikes.vim", "type": "file" }, { - "bom-ref": "d50f9d5a911d2665", + "bom-ref": "fad733496dd87a2d", "name": "/usr/share/vim/vim91/compiler/jjs.vim", "type": "file" }, { - "bom-ref": "7de6c152cb2dc2a5", + "bom-ref": "70fc96048becbcb9", "name": "/usr/share/vim/vim91/compiler/jshint.vim", "type": "file" }, { - "bom-ref": "3b9c6cea6f1d749c", + "bom-ref": "86dd3856da44b8c4", "name": "/usr/share/vim/vim91/compiler/jsonlint.vim", "type": "file" }, { - "bom-ref": "4748c5943df18683", + "bom-ref": "3bfb95fae541fadf", "name": "/usr/share/vim/vim91/compiler/mcs.vim", "type": "file" }, { - "bom-ref": "e63f1193e684bf5e", + "bom-ref": "b61dfb72ab7d4ed6", "name": "/usr/share/vim/vim91/compiler/mips_c.vim", "type": "file" }, { - "bom-ref": "27a781221efdab56", + "bom-ref": "903dcfe27636b5da", "name": "/usr/share/vim/vim91/compiler/mipspro_c89.vim", "type": "file" }, { - "bom-ref": "1bd3969482f54e8f", + "bom-ref": "6398e7e110fe9ea3", "name": "/usr/share/vim/vim91/compiler/mipspro_cpp.vim", "type": "file" }, { - "bom-ref": "4918d46ac9acf15c", + "bom-ref": "69d87c4bc2c08358", "name": "/usr/share/vim/vim91/compiler/modelsim_vcom.vim", "type": "file" }, { - "bom-ref": "b3c6317f9fa8ff73", + "bom-ref": "6bcbf011ef3237d3", "name": "/usr/share/vim/vim91/compiler/msbuild.vim", "type": "file" }, { - "bom-ref": "4711e411ace8da1c", + "bom-ref": "ce2c0c8e10a16898", "name": "/usr/share/vim/vim91/compiler/msvc.vim", "type": "file" }, { - "bom-ref": "c8a0c7b4c5e8cf4f", + "bom-ref": "e50a97f38771e823", "name": "/usr/share/vim/vim91/compiler/neato.vim", "type": "file" }, { - "bom-ref": "c58d458e3fc69014", + "bom-ref": "c5c2b757a14f8b30", "name": "/usr/share/vim/vim91/compiler/ocaml.vim", "type": "file" }, { - "bom-ref": "e74d7ae6c80b025f", + "bom-ref": "d46327b63dc54a6f", "name": "/usr/share/vim/vim91/compiler/onsgmls.vim", "type": "file" }, { - "bom-ref": "75ce9b4d4170f8f5", + "bom-ref": "c755843c172bce35", "name": "/usr/share/vim/vim91/compiler/pbx.vim", "type": "file" }, { - "bom-ref": "4bdcc14b06ab132d", + "bom-ref": "7ff724ec65fa88c9", "name": "/usr/share/vim/vim91/compiler/perl.vim", "type": "file" }, { - "bom-ref": "6975e583974e184d", + "bom-ref": "52c65ff20a5cb989", "name": "/usr/share/vim/vim91/compiler/perlcritic.vim", "type": "file" }, { - "bom-ref": "79d7795f2899b2de", + "bom-ref": "6f76fb23562de9ae", "name": "/usr/share/vim/vim91/compiler/php.vim", "type": "file" }, { - "bom-ref": "8b3077c29948d325", + "bom-ref": "0daa0e93774fd219", "name": "/usr/share/vim/vim91/compiler/podchecker.vim", "type": "file" }, { - "bom-ref": "5db78924a662f2dd", + "bom-ref": "13873940c8a3ba65", "name": "/usr/share/vim/vim91/compiler/powershell.vim", "type": "file" }, { - "bom-ref": "bcc70926371e12df", + "bom-ref": "c9d4b9cc40b64a87", "name": "/usr/share/vim/vim91/compiler/pylint.vim", "type": "file" }, { - "bom-ref": "6d0c335b55379215", + "bom-ref": "f2449b627e74c60d", "name": "/usr/share/vim/vim91/compiler/pyunit.vim", "type": "file" }, { - "bom-ref": "482a45f8b0e0394a", + "bom-ref": "8049abc7913755e6", "name": "/usr/share/vim/vim91/compiler/raco.vim", "type": "file" }, { - "bom-ref": "e9c4e3840e358b9d", + "bom-ref": "4319a2a985ad120d", "name": "/usr/share/vim/vim91/compiler/racomake.vim", "type": "file" }, { - "bom-ref": "a864d384d82b52b4", + "bom-ref": "2ee9676c63cefde4", "name": "/usr/share/vim/vim91/compiler/racosetup.vim", "type": "file" }, { - "bom-ref": "c8cf24cdacc524d4", + "bom-ref": "e013a8952bb30a50", "name": "/usr/share/vim/vim91/compiler/racotest.vim", "type": "file" }, { - "bom-ref": "0afb0a3c7dbb2a10", + "bom-ref": "7eb90156df57bf04", "name": "/usr/share/vim/vim91/compiler/rake.vim", "type": "file" }, { - "bom-ref": "6b66f427bf5d8eba", + "bom-ref": "2b7561049c9f5702", "name": "/usr/share/vim/vim91/compiler/rhino.vim", "type": "file" }, { - "bom-ref": "1f2324714562ed58", + "bom-ref": "3d116fb08f58244c", "name": "/usr/share/vim/vim91/compiler/rspec.vim", "type": "file" }, { - "bom-ref": "27475ca463925f14", + "bom-ref": "2b21a7dfc251ad40", "name": "/usr/share/vim/vim91/compiler/rst.vim", "type": "file" }, { - "bom-ref": "abb9ede63e192cd5", + "bom-ref": "47d9161e58759579", "name": "/usr/share/vim/vim91/compiler/rubocop.vim", "type": "file" }, { - "bom-ref": "232152d03e8503c3", + "bom-ref": "aeb02499120fc81b", "name": "/usr/share/vim/vim91/compiler/ruby.vim", "type": "file" }, { - "bom-ref": "6e55c8d185504f4d", + "bom-ref": "5391bf0b38cf8a99", "name": "/usr/share/vim/vim91/compiler/rubyunit.vim", "type": "file" }, { - "bom-ref": "d1a9683e877db8cf", + "bom-ref": "e5bc2121540c443b", "name": "/usr/share/vim/vim91/compiler/rustc.vim", "type": "file" }, { - "bom-ref": "71c1953047999af5", + "bom-ref": "b53c2f9c23e71565", "name": "/usr/share/vim/vim91/compiler/sass.vim", "type": "file" }, { - "bom-ref": "978bf42e0e9a52c5", + "bom-ref": "892b8fcc1351eddd", "name": "/usr/share/vim/vim91/compiler/scdoc.vim", "type": "file" }, { - "bom-ref": "dc1ed9efc81779c9", + "bom-ref": "73c8d511f105e649", "name": "/usr/share/vim/vim91/compiler/se.vim", "type": "file" }, { - "bom-ref": "461c344086c6ebae", + "bom-ref": "eba7e7a2f0a4a432", "name": "/usr/share/vim/vim91/compiler/shellcheck.vim", "type": "file" }, { - "bom-ref": "0cbc345bf41b6871", + "bom-ref": "f5594a09899bc799", "name": "/usr/share/vim/vim91/compiler/sml.vim", "type": "file" }, { - "bom-ref": "4ac39abac5a85215", + "bom-ref": "caf882e67ce07cd9", "name": "/usr/share/vim/vim91/compiler/spectral.vim", "type": "file" }, { - "bom-ref": "538bdbacb32c7e05", + "bom-ref": "fbc989697418f5d9", "name": "/usr/share/vim/vim91/compiler/splint.vim", "type": "file" }, { - "bom-ref": "b8095946e5263add", + "bom-ref": "b48aa70679e7664d", "name": "/usr/share/vim/vim91/compiler/stack.vim", "type": "file" }, { - "bom-ref": "e1b0a0fc8ceb3181", + "bom-ref": "7154a6e96bb3cbd9", "name": "/usr/share/vim/vim91/compiler/standard.vim", "type": "file" }, { - "bom-ref": "29cbae92e620dd94", + "bom-ref": "86b24f0ff6978504", "name": "/usr/share/vim/vim91/compiler/stylelint.vim", "type": "file" }, { - "bom-ref": "31a51836da5453d2", + "bom-ref": "54cf5484a815b93a", "name": "/usr/share/vim/vim91/compiler/tcl.vim", "type": "file" }, { - "bom-ref": "157d4e84c2a79b52", + "bom-ref": "ba12d2d226d201be", "name": "/usr/share/vim/vim91/compiler/tex.vim", "type": "file" }, { - "bom-ref": "8cfadf689fc89382", + "bom-ref": "434534193b8caa1e", "name": "/usr/share/vim/vim91/compiler/tidy.vim", "type": "file" }, { - "bom-ref": "b3133da4b13e6aac", + "bom-ref": "0d9d2469983bf65c", "name": "/usr/share/vim/vim91/compiler/ts-node.vim", "type": "file" }, { - "bom-ref": "b48aeb7b6dd2a91e", + "bom-ref": "dd526598d348c33e", "name": "/usr/share/vim/vim91/compiler/tsc.vim", "type": "file" }, { - "bom-ref": "5c35a284a360d0a6", + "bom-ref": "8bb4f72915b2008e", "name": "/usr/share/vim/vim91/compiler/typedoc.vim", "type": "file" }, { - "bom-ref": "aacb148a3cb0703d", + "bom-ref": "2e91f1216764efb9", "name": "/usr/share/vim/vim91/compiler/xbuild.vim", "type": "file" }, { - "bom-ref": "c84b10ae56a07d30", + "bom-ref": "7e516f73b32d84fc", "name": "/usr/share/vim/vim91/compiler/xmllint.vim", "type": "file" }, { - "bom-ref": "a673a88b6c9e960e", + "bom-ref": "6818a1c524c8d782", "name": "/usr/share/vim/vim91/compiler/xmlwf.vim", "type": "file" }, { - "bom-ref": "9bbf243788fc8eb5", + "bom-ref": "175bea5fd0fe6a41", "name": "/usr/share/vim/vim91/compiler/xo.vim", "type": "file" }, { - "bom-ref": "b28fcce8a8141343", + "bom-ref": "5d06c2b177227753", "name": "/usr/share/vim/vim91/compiler/yamllint.vim", "type": "file" }, { - "bom-ref": "c6f9299c122c6be1", + "bom-ref": "06e41e02b5efa0b5", "name": "/usr/share/vim/vim91/compiler/zig.vim", "type": "file" }, { - "bom-ref": "2b7429f2750f3e6a", + "bom-ref": "3babe362a90d2ebe", "name": "/usr/share/vim/vim91/compiler/zig_build.vim", "type": "file" }, { - "bom-ref": "ec60368b1088ae55", + "bom-ref": "552bd195a04cf419", "name": "/usr/share/vim/vim91/compiler/zig_build_exe.vim", "type": "file" }, { - "bom-ref": "a1543e872fbb67e5", + "bom-ref": "69d93c3eb8fc89f9", "name": "/usr/share/vim/vim91/compiler/zig_test.vim", "type": "file" }, { - "bom-ref": "a3e96ee7e7bf3fb2", + "bom-ref": "b61cb0d8028f5e5e", "name": "/usr/share/vim/vim91/compiler/zsh.vim", "type": "file" }, { - "bom-ref": "93a638289fa4234a", + "bom-ref": "7c8e8a04b5177047", "name": "/usr/share/vim/vim91/debian.vim", "type": "file" }, { - "bom-ref": "7404c3a16597110c", + "bom-ref": "736454dc3abda1a4", "name": "/usr/share/vim/vim91/defaults.vim", "type": "file" }, { - "bom-ref": "ee9c20e676414244", + "bom-ref": "855f319f02cf57bc", "name": "/usr/share/vim/vim91/delmenu.vim", "type": "file" }, { - "bom-ref": "cad0ffd4bd667c76", + "bom-ref": "b2f5a92ff91b6d8b", "name": "/usr/share/vim/vim91/doc/README.Debian", "type": "file" }, { - "bom-ref": "0e794ab203774ef4", + "bom-ref": "216c6fbbd9919ee8", "name": "/usr/share/vim/vim91/doc/arabic.txt", "type": "file" }, { - "bom-ref": "a18f42353988e847", + "bom-ref": "d9fb011b10fdfc47", "name": "/usr/share/vim/vim91/doc/autocmd.txt", "type": "file" }, { - "bom-ref": "4ebf344861322d2e", + "bom-ref": "a5608aac9ce1321a", "name": "/usr/share/vim/vim91/doc/builtin.txt", "type": "file" }, { - "bom-ref": "4b506413a772a256", + "bom-ref": "44afe2430cc7a1e6", "name": "/usr/share/vim/vim91/doc/change.txt", "type": "file" }, { - "bom-ref": "60d52a1226333009", + "bom-ref": "8fdb7edde14096b1", "name": "/usr/share/vim/vim91/doc/channel.txt", "type": "file" }, { - "bom-ref": "bcd923f62812f3a6", + "bom-ref": "d76ccbf6c3e7397a", "name": "/usr/share/vim/vim91/doc/cmdline.txt", "type": "file" }, { - "bom-ref": "0c78ca576f9b11a7", + "bom-ref": "1827fb64346068f3", "name": "/usr/share/vim/vim91/doc/debug.txt", "type": "file" }, { - "bom-ref": "930efa77341b591e", + "bom-ref": "6a5c20527debb3de", "name": "/usr/share/vim/vim91/doc/debugger.txt", "type": "file" }, { - "bom-ref": "994aa8baf46e3e62", + "bom-ref": "c54ef5e097efa5ae", "name": "/usr/share/vim/vim91/doc/develop.txt", "type": "file" }, { - "bom-ref": "2d75718ccc32ff47", + "bom-ref": "9b1ee3038371dfb3", "name": "/usr/share/vim/vim91/doc/diff.txt", "type": "file" }, { - "bom-ref": "075266862f64a8b3", + "bom-ref": "20a2cdc0b5c8d34f", "name": "/usr/share/vim/vim91/doc/digraph.txt", "type": "file" }, { - "bom-ref": "b121ed70e3322e46", + "bom-ref": "9f43d4416add4e96", "name": "/usr/share/vim/vim91/doc/editing.txt", "type": "file" }, { - "bom-ref": "970bbc6e45938eb9", + "bom-ref": "9824125420477c3d", "name": "/usr/share/vim/vim91/doc/eval.txt", "type": "file" }, { - "bom-ref": "b042f564f4533724", + "bom-ref": "94e00b4d07c91770", "name": "/usr/share/vim/vim91/doc/farsi.txt", "type": "file" }, { - "bom-ref": "2aa07e591f175fa7", + "bom-ref": "77c763d80af38dff", "name": "/usr/share/vim/vim91/doc/filetype.txt", "type": "file" }, { - "bom-ref": "2fad1f03d0dd2656", + "bom-ref": "e66096d8b69ed0c2", "name": "/usr/share/vim/vim91/doc/fold.txt", "type": "file" }, { - "bom-ref": "6a410965fbe8e75b", + "bom-ref": "2578c1cabce19c97", "name": "/usr/share/vim/vim91/doc/ft_ada.txt", "type": "file" }, { - "bom-ref": "e11e6f7b06e3fb35", + "bom-ref": "2d49963ba7ee599d", "name": "/usr/share/vim/vim91/doc/ft_context.txt", "type": "file" }, { - "bom-ref": "734f84c727f96eba", + "bom-ref": "05c3e46c398dba26", "name": "/usr/share/vim/vim91/doc/ft_mp.txt", "type": "file" }, { - "bom-ref": "5290a4b9c75ac603", + "bom-ref": "0c04dc3a64816827", "name": "/usr/share/vim/vim91/doc/ft_ps1.txt", "type": "file" }, { - "bom-ref": "eab49267d33b0fb8", + "bom-ref": "29a978b22e3e0abc", "name": "/usr/share/vim/vim91/doc/ft_raku.txt", "type": "file" }, { - "bom-ref": "11d3959d43d1d219", + "bom-ref": "014b1ff19f303e45", "name": "/usr/share/vim/vim91/doc/ft_rust.txt", "type": "file" }, { - "bom-ref": "58c2e7098c738e7a", + "bom-ref": "cc18f2e46179944a", "name": "/usr/share/vim/vim91/doc/ft_sql.txt", "type": "file" }, { - "bom-ref": "d2f08775b3bd04e7", + "bom-ref": "980b1d6145eed5c7", "name": "/usr/share/vim/vim91/doc/gui.txt", "type": "file" }, { - "bom-ref": "41b1f12c6c59127e", + "bom-ref": "c2d32343215a0cae", "name": "/usr/share/vim/vim91/doc/gui_w32.txt", "type": "file" }, { - "bom-ref": "fbb01e515edcfa1f", + "bom-ref": "61e9f21a6267ed1b", "name": "/usr/share/vim/vim91/doc/gui_x11.txt", "type": "file" }, { - "bom-ref": "a2409ddc4e6c91a5", + "bom-ref": "c53721c8f2b8ec1d", "name": "/usr/share/vim/vim91/doc/hangulin.txt", "type": "file" }, { - "bom-ref": "7cd1dbe097868d48", + "bom-ref": "50feaddbb94ae4f8", "name": "/usr/share/vim/vim91/doc/hebrew.txt", "type": "file" }, { - "bom-ref": "f1132532c0d5a921", + "bom-ref": "de742b5847d75f75", "name": "/usr/share/vim/vim91/doc/help.txt", "type": "file" }, { - "bom-ref": "2ef5afd0cd168182", + "bom-ref": "df30337caa86b392", "name": "/usr/share/vim/vim91/doc/helphelp.txt", "type": "file" }, { - "bom-ref": "782978a2447f51db", + "bom-ref": "7690e05c93a0884b", "name": "/usr/share/vim/vim91/doc/howto.txt", "type": "file" }, { - "bom-ref": "d1cb5dc91c2c0ed7", + "bom-ref": "3fec971016a6dedb", "name": "/usr/share/vim/vim91/doc/if_cscop.txt", "type": "file" }, { - "bom-ref": "146c11c9004e354b", + "bom-ref": "a66caa31a364c047", "name": "/usr/share/vim/vim91/doc/if_lua.txt", "type": "file" }, { - "bom-ref": "6f955b74f6324cc7", + "bom-ref": "12125c9ec682edb3", "name": "/usr/share/vim/vim91/doc/if_mzsch.txt", "type": "file" }, { - "bom-ref": "16e096258c4c7d3d", + "bom-ref": "bb1b1b68678b2d3d", "name": "/usr/share/vim/vim91/doc/if_ole.txt", "type": "file" }, { - "bom-ref": "e48e824d94f6c0a9", + "bom-ref": "b020208b04b7ba11", "name": "/usr/share/vim/vim91/doc/if_perl.txt", "type": "file" }, { - "bom-ref": "eee59350d5bc5f5d", + "bom-ref": "d0c2dfe737119541", "name": "/usr/share/vim/vim91/doc/if_pyth.txt", "type": "file" }, { - "bom-ref": "e658e7b956572608", + "bom-ref": "605ad801c6249df4", "name": "/usr/share/vim/vim91/doc/if_ruby.txt", "type": "file" }, { - "bom-ref": "688f5c801aedad3a", + "bom-ref": "c52e4140b58853b2", "name": "/usr/share/vim/vim91/doc/if_sniff.txt", "type": "file" }, { - "bom-ref": "ff8036e0b102581c", + "bom-ref": "5e52ed3665f5d25c", "name": "/usr/share/vim/vim91/doc/if_tcl.txt", "type": "file" }, { - "bom-ref": "d475ed96b5d23524", + "bom-ref": "f986b5b49c78f994", "name": "/usr/share/vim/vim91/doc/indent.txt", "type": "file" }, { - "bom-ref": "b3e0d25467017711", + "bom-ref": "c1776dd8e05e33b1", "name": "/usr/share/vim/vim91/doc/index.txt", "type": "file" }, { - "bom-ref": "9c1775ea9260b845", + "bom-ref": "a731d7f7b59ffa79", "name": "/usr/share/vim/vim91/doc/insert.txt", "type": "file" }, { - "bom-ref": "8fefd834a097a1d2", + "bom-ref": "a98e7024abff665e", "name": "/usr/share/vim/vim91/doc/intro.txt", "type": "file" }, { - "bom-ref": "1b23357cce3df97b", + "bom-ref": "d82bf26dc575ac6f", "name": "/usr/share/vim/vim91/doc/map.txt", "type": "file" }, { - "bom-ref": "ff6a8c90b9ce7103", + "bom-ref": "7e4ce15c575891c3", "name": "/usr/share/vim/vim91/doc/mbyte.txt", "type": "file" }, { - "bom-ref": "44f1005c480d4208", + "bom-ref": "d57c4fab67c523c8", "name": "/usr/share/vim/vim91/doc/message.txt", "type": "file" }, { - "bom-ref": "30894ebe06e3a5d3", + "bom-ref": "a84fd29c93543693", "name": "/usr/share/vim/vim91/doc/mlang.txt", "type": "file" }, { - "bom-ref": "a49103019382bc0c", + "bom-ref": "67ad14811f8c2318", "name": "/usr/share/vim/vim91/doc/motion.txt", "type": "file" }, { - "bom-ref": "564f143c657b41df", + "bom-ref": "4beff1f5a519b6d3", "name": "/usr/share/vim/vim91/doc/netbeans.txt", "type": "file" }, { - "bom-ref": "9b54b58a403b6038", + "bom-ref": "dfd948bce2900998", "name": "/usr/share/vim/vim91/doc/options.txt", "type": "file" }, { - "bom-ref": "b731d090b0a3ad3e", + "bom-ref": "40ddb17e060efd3a", "name": "/usr/share/vim/vim91/doc/os_390.txt", "type": "file" }, { - "bom-ref": "0a02129e77b368d0", + "bom-ref": "d3a4d97987d73b84", "name": "/usr/share/vim/vim91/doc/os_amiga.txt", "type": "file" }, { - "bom-ref": "85e359883a6d5afe", + "bom-ref": "031e514f550e9a2a", "name": "/usr/share/vim/vim91/doc/os_beos.txt", "type": "file" }, { - "bom-ref": "ed91c565798409d1", + "bom-ref": "ce9990079f897195", "name": "/usr/share/vim/vim91/doc/os_dos.txt", "type": "file" }, { - "bom-ref": "4d499006eb831464", + "bom-ref": "5c3f675b59ad7b58", "name": "/usr/share/vim/vim91/doc/os_haiku.txt", "type": "file" }, { - "bom-ref": "6f47faf63e451996", + "bom-ref": "da8accefbed3053e", "name": "/usr/share/vim/vim91/doc/os_mac.txt", "type": "file" }, { - "bom-ref": "7232a02fbc9018d3", + "bom-ref": "c19a5de164cfc36f", "name": "/usr/share/vim/vim91/doc/os_mint.txt", "type": "file" }, { - "bom-ref": "8add0d8f75b6ca90", + "bom-ref": "11b6e533781eef40", "name": "/usr/share/vim/vim91/doc/os_msdos.txt", "type": "file" }, { - "bom-ref": "b42ffb25708ca10c", + "bom-ref": "346061554b2e3648", "name": "/usr/share/vim/vim91/doc/os_os2.txt", "type": "file" }, { - "bom-ref": "462e7bda401573e3", + "bom-ref": "4e100a11cf22a53f", "name": "/usr/share/vim/vim91/doc/os_qnx.txt", "type": "file" }, { - "bom-ref": "cecb28fb22583345", + "bom-ref": "510a569a6da6747d", "name": "/usr/share/vim/vim91/doc/os_risc.txt", "type": "file" }, { - "bom-ref": "5d30068434527afa", + "bom-ref": "7945bb0240b49ef6", "name": "/usr/share/vim/vim91/doc/os_unix.txt", "type": "file" }, { - "bom-ref": "a57a8367d8603408", + "bom-ref": "5f0ca51e8c6589e8", "name": "/usr/share/vim/vim91/doc/os_vms.txt", "type": "file" }, { - "bom-ref": "3563f02143abd058", + "bom-ref": "72e70f21140c3d30", "name": "/usr/share/vim/vim91/doc/os_win32.txt", "type": "file" }, { - "bom-ref": "e4b4f1d86d3f6c42", + "bom-ref": "a77f2c1c3fa14266", "name": "/usr/share/vim/vim91/doc/pattern.txt", "type": "file" }, { - "bom-ref": "8acd85f932d2d6b0", + "bom-ref": "6101ec97caf7fa70", "name": "/usr/share/vim/vim91/doc/pi_getscript.txt", "type": "file" }, { - "bom-ref": "6077a0e82747e5b3", + "bom-ref": "8db05cc09aba8d2f", "name": "/usr/share/vim/vim91/doc/pi_gzip.txt", "type": "file" }, { - "bom-ref": "b87be0c43736045f", + "bom-ref": "69e2f6b34a0efc27", "name": "/usr/share/vim/vim91/doc/pi_logipat.txt", "type": "file" }, { - "bom-ref": "ffed31a96b51997d", + "bom-ref": "8a98622407ebc179", "name": "/usr/share/vim/vim91/doc/pi_netrw.txt", "type": "file" }, { - "bom-ref": "140c8204d2546f61", + "bom-ref": "f35198dc3854c409", "name": "/usr/share/vim/vim91/doc/pi_paren.txt", "type": "file" }, { - "bom-ref": "79b2f4a83d8ec635", + "bom-ref": "fe5f648cb0b6352d", "name": "/usr/share/vim/vim91/doc/pi_spec.txt", "type": "file" }, { - "bom-ref": "32e4558fe70f7494", + "bom-ref": "9bf70f4f8a3b5fe4", "name": "/usr/share/vim/vim91/doc/pi_tar.txt", "type": "file" }, { - "bom-ref": "d4a3ad07ccd3dd04", + "bom-ref": "43ea754fa61d9700", "name": "/usr/share/vim/vim91/doc/pi_vimball.txt", "type": "file" }, { - "bom-ref": "1e3a6193fe24c7fa", + "bom-ref": "dd4b30bb62b3572a", "name": "/usr/share/vim/vim91/doc/pi_zip.txt", "type": "file" }, { - "bom-ref": "f3eb9700f226c5ee", + "bom-ref": "f903aeca512b3eb2", "name": "/usr/share/vim/vim91/doc/popup.txt", "type": "file" }, { - "bom-ref": "202bced7641b7325", + "bom-ref": "3399aaf0ae928501", "name": "/usr/share/vim/vim91/doc/print.txt", "type": "file" }, { - "bom-ref": "04b0840efe834b1f", + "bom-ref": "40a6cf33a357cae7", "name": "/usr/share/vim/vim91/doc/quickfix.txt", "type": "file" }, { - "bom-ref": "c72e3af9626522c1", + "bom-ref": "4195d9a28cf71cc9", "name": "/usr/share/vim/vim91/doc/quickref.txt", "type": "file" }, { - "bom-ref": "0a69864d65cb660f", + "bom-ref": "1dd37770b08f8e7f", "name": "/usr/share/vim/vim91/doc/quotes.txt", "type": "file" }, { - "bom-ref": "065f5a6ab4e23a0a", + "bom-ref": "5d2b8add45d96176", "name": "/usr/share/vim/vim91/doc/recover.txt", "type": "file" }, { - "bom-ref": "61d377946d157da7", + "bom-ref": "d03757c06c007f23", "name": "/usr/share/vim/vim91/doc/remote.txt", "type": "file" }, { - "bom-ref": "22c72fa5f43a92e3", + "bom-ref": "b97a83ff9c3ced4f", "name": "/usr/share/vim/vim91/doc/repeat.txt", "type": "file" }, { - "bom-ref": "8c8f91fa42618e7d", + "bom-ref": "5be2f288f1cfb7b1", "name": "/usr/share/vim/vim91/doc/rileft.txt", "type": "file" }, { - "bom-ref": "e74d06e0f56b79de", + "bom-ref": "2607e442813856d2", "name": "/usr/share/vim/vim91/doc/russian.txt", "type": "file" }, { - "bom-ref": "080f0153df88cac3", + "bom-ref": "e8e5190b9ae48e33", "name": "/usr/share/vim/vim91/doc/scroll.txt", "type": "file" }, { - "bom-ref": "ba4350d9f25d8fe5", + "bom-ref": "014f76fe8daca6b9", "name": "/usr/share/vim/vim91/doc/sign.txt", "type": "file" }, { - "bom-ref": "65a73012dd23feb8", + "bom-ref": "ea8bdf34b2b75890", "name": "/usr/share/vim/vim91/doc/spell.txt", "type": "file" }, { - "bom-ref": "36a4cf4b27001e30", + "bom-ref": "e8ce1b804dd20639", "name": "/usr/share/vim/vim91/doc/sponsor.txt", "type": "file" }, { - "bom-ref": "caacd5e17a4cd4f5", + "bom-ref": "402651dee46021f5", "name": "/usr/share/vim/vim91/doc/starting.txt", "type": "file" }, { - "bom-ref": "8fb595db13ccbe92", + "bom-ref": "9f16170559acad3e", "name": "/usr/share/vim/vim91/doc/syntax.txt", "type": "file" }, { - "bom-ref": "340443c0f5f92b4d", + "bom-ref": "b2825f303ee9acc9", "name": "/usr/share/vim/vim91/doc/tabpage.txt", "type": "file" }, { - "bom-ref": "381e6498b276f1df", + "bom-ref": "9a727452f8a88a17", "name": "/usr/share/vim/vim91/doc/tags", "type": "file" }, { - "bom-ref": "29f8a147a9f42220", + "bom-ref": "550c330ea76f471c", "name": "/usr/share/vim/vim91/doc/tagsrch.txt", "type": "file" }, { - "bom-ref": "952531c6026183b7", + "bom-ref": "897438731d51e44b", "name": "/usr/share/vim/vim91/doc/term.txt", "type": "file" }, { - "bom-ref": "4f486fca2d72e698", + "bom-ref": "12a993e1075697b4", "name": "/usr/share/vim/vim91/doc/terminal.txt", "type": "file" }, { - "bom-ref": "4d461d4a0b7a7456", + "bom-ref": "3368bdd693b4af46", "name": "/usr/share/vim/vim91/doc/testing.txt", "type": "file" }, { - "bom-ref": "9120f1f286e1fe41", + "bom-ref": "72734dd0990f6b49", "name": "/usr/share/vim/vim91/doc/textprop.txt", "type": "file" }, { - "bom-ref": "44e6600e2f93d664", + "bom-ref": "f7761909f978ef90", "name": "/usr/share/vim/vim91/doc/tips.txt", "type": "file" }, { - "bom-ref": "3d63bd469af3961e", + "bom-ref": "5c68451ca36305a6", "name": "/usr/share/vim/vim91/doc/todo.txt", "type": "file" }, { - "bom-ref": "2607de2d3cf50550", + "bom-ref": "35ce991b1bbfe1d9", "name": "/usr/share/vim/vim91/doc/uganda.txt", "type": "file" }, { - "bom-ref": "833c0bb7dc5999cb", + "bom-ref": "3c8ada36f38aca97", "name": "/usr/share/vim/vim91/doc/undo.txt", "type": "file" }, { - "bom-ref": "e83b5f7c0f4dac80", + "bom-ref": "f1fd22f36895c7b8", "name": "/usr/share/vim/vim91/doc/userfunc.txt", "type": "file" }, { - "bom-ref": "9dbdad8511f86432", + "bom-ref": "f35a1777ef6c8fb6", "name": "/usr/share/vim/vim91/doc/usr_01.txt", "type": "file" }, { - "bom-ref": "96cf554dbf448089", + "bom-ref": "e4680daf2ed30279", "name": "/usr/share/vim/vim91/doc/usr_02.txt", "type": "file" }, { - "bom-ref": "c6d7d8e99a577c69", + "bom-ref": "eaadff6ca4529ad9", "name": "/usr/share/vim/vim91/doc/usr_03.txt", "type": "file" }, { - "bom-ref": "f4087eef8217cca7", + "bom-ref": "88baa3f3bce25c53", "name": "/usr/share/vim/vim91/doc/usr_04.txt", "type": "file" }, { - "bom-ref": "63e8fec29691bff1", + "bom-ref": "bd7b364c2ad88df9", "name": "/usr/share/vim/vim91/doc/usr_05.txt", "type": "file" }, { - "bom-ref": "53477611a0e68112", + "bom-ref": "6aada0fb884b4712", "name": "/usr/share/vim/vim91/doc/usr_06.txt", "type": "file" }, { - "bom-ref": "71c9e2200685875b", + "bom-ref": "6e58b3bb10f98bd3", "name": "/usr/share/vim/vim91/doc/usr_07.txt", "type": "file" }, { - "bom-ref": "f70726140c22b09d", + "bom-ref": "4a896ba02956c959", "name": "/usr/share/vim/vim91/doc/usr_08.txt", "type": "file" }, { - "bom-ref": "4b74e55d49b06551", + "bom-ref": "4af199c079bc7965", "name": "/usr/share/vim/vim91/doc/usr_09.txt", "type": "file" }, { - "bom-ref": "7f8a7165b18870ba", + "bom-ref": "70d0ce6712693a36", "name": "/usr/share/vim/vim91/doc/usr_10.txt", "type": "file" }, { - "bom-ref": "48a0995c5eab8964", + "bom-ref": "81b718bf976c0aa4", "name": "/usr/share/vim/vim91/doc/usr_11.txt", "type": "file" }, { - "bom-ref": "a6e642ae3f3abed2", + "bom-ref": "e5b19a9de57cc162", "name": "/usr/share/vim/vim91/doc/usr_12.txt", "type": "file" }, { - "bom-ref": "2918a32efb5f9144", + "bom-ref": "ca2bbeaf434b8f5c", "name": "/usr/share/vim/vim91/doc/usr_20.txt", "type": "file" }, { - "bom-ref": "8fbd18617809eb51", + "bom-ref": "086f313ee51feabd", "name": "/usr/share/vim/vim91/doc/usr_21.txt", "type": "file" }, { - "bom-ref": "f79330fbb8e3ff13", + "bom-ref": "b96ae8855af2d293", "name": "/usr/share/vim/vim91/doc/usr_22.txt", "type": "file" }, { - "bom-ref": "56447ca6f27985a3", + "bom-ref": "49c1362e33b0863b", "name": "/usr/share/vim/vim91/doc/usr_23.txt", "type": "file" }, { - "bom-ref": "ce5fe86416cf2692", + "bom-ref": "eaa6aa57fad5206a", "name": "/usr/share/vim/vim91/doc/usr_24.txt", "type": "file" }, { - "bom-ref": "5f55aa18cd85adc3", + "bom-ref": "21e5fc42108ddde7", "name": "/usr/share/vim/vim91/doc/usr_25.txt", "type": "file" }, { - "bom-ref": "9823730c857b9f34", + "bom-ref": "b505fbaa3d3af124", "name": "/usr/share/vim/vim91/doc/usr_26.txt", "type": "file" }, { - "bom-ref": "abe3d0b27dfc60cd", + "bom-ref": "c6f4829b32197319", "name": "/usr/share/vim/vim91/doc/usr_27.txt", "type": "file" }, { - "bom-ref": "4d7ce112b9c88eee", + "bom-ref": "d2c1aee117d24ae6", "name": "/usr/share/vim/vim91/doc/usr_28.txt", "type": "file" }, { - "bom-ref": "792869a34ca0c63d", + "bom-ref": "95cf16723582bf91", "name": "/usr/share/vim/vim91/doc/usr_29.txt", "type": "file" }, { - "bom-ref": "a6337733ff32c1cb", + "bom-ref": "bfc96a106ac8f0a7", "name": "/usr/share/vim/vim91/doc/usr_30.txt", "type": "file" }, { - "bom-ref": "ca901e1d9522b7ff", + "bom-ref": "ea78841274a6b62b", "name": "/usr/share/vim/vim91/doc/usr_31.txt", "type": "file" }, { - "bom-ref": "a33ddb09fabc92ea", + "bom-ref": "12d9f909648cbf5a", "name": "/usr/share/vim/vim91/doc/usr_32.txt", "type": "file" }, { - "bom-ref": "f7c2b84b72df7785", + "bom-ref": "e683066a4edb59f9", "name": "/usr/share/vim/vim91/doc/usr_40.txt", "type": "file" }, { - "bom-ref": "671c58fe17600838", + "bom-ref": "c325f3e7faf2ac9c", "name": "/usr/share/vim/vim91/doc/usr_41.txt", "type": "file" }, { - "bom-ref": "2018dcce1daa4413", + "bom-ref": "fd4127c7de0a0097", "name": "/usr/share/vim/vim91/doc/usr_42.txt", "type": "file" }, { - "bom-ref": "465cd947892b066f", + "bom-ref": "078602db5664353f", "name": "/usr/share/vim/vim91/doc/usr_43.txt", "type": "file" }, { - "bom-ref": "239cef5b9d207701", + "bom-ref": "f1164799cbb4a4e5", "name": "/usr/share/vim/vim91/doc/usr_44.txt", "type": "file" }, { - "bom-ref": "9e48ae3c50268112", + "bom-ref": "2745f1aea404edc2", "name": "/usr/share/vim/vim91/doc/usr_45.txt", "type": "file" }, { - "bom-ref": "c92bb49b15717e80", + "bom-ref": "7985226df7fa9378", "name": "/usr/share/vim/vim91/doc/usr_50.txt", "type": "file" }, { - "bom-ref": "c2d5d1e1da988ef7", + "bom-ref": "13f8db7400eeae67", "name": "/usr/share/vim/vim91/doc/usr_51.txt", "type": "file" }, { - "bom-ref": "8643f5922cce688d", + "bom-ref": "a572f42a0e3c9b15", "name": "/usr/share/vim/vim91/doc/usr_52.txt", "type": "file" }, { - "bom-ref": "0fc2470ca358f409", + "bom-ref": "f7146fe00e5b76c9", "name": "/usr/share/vim/vim91/doc/usr_90.txt", "type": "file" }, { - "bom-ref": "52633b1cd5a12df9", + "bom-ref": "c7607060ad0b3edd", "name": "/usr/share/vim/vim91/doc/usr_toc.txt", "type": "file" }, { - "bom-ref": "6d7d03bdcac4d1c7", + "bom-ref": "e2840f653c929987", "name": "/usr/share/vim/vim91/doc/various.txt", "type": "file" }, { - "bom-ref": "2c04c402ed86f501", + "bom-ref": "3b7481e965725ca1", "name": "/usr/share/vim/vim91/doc/version4.txt", "type": "file" }, { - "bom-ref": "e933f63540481d2c", + "bom-ref": "ba4e8900f611dd78", "name": "/usr/share/vim/vim91/doc/version5.txt", "type": "file" }, { - "bom-ref": "11d016fb0147c4d3", + "bom-ref": "6089bb36495cbbaf", "name": "/usr/share/vim/vim91/doc/version6.txt", "type": "file" }, { - "bom-ref": "9d60b53e78db1220", + "bom-ref": "319c854e74d161c4", "name": "/usr/share/vim/vim91/doc/version7.txt", "type": "file" }, { - "bom-ref": "b3f3a601aedbb8d4", + "bom-ref": "66311a5fc206c828", "name": "/usr/share/vim/vim91/doc/version8.txt", "type": "file" }, { - "bom-ref": "db41997e9adcbb45", + "bom-ref": "f57738aaa16c1e94", "name": "/usr/share/vim/vim91/doc/version9.txt", "type": "file" }, { - "bom-ref": "2ad595a61722f228", + "bom-ref": "453f7b4de9fdcb64", "name": "/usr/share/vim/vim91/doc/vi_diff.txt", "type": "file" }, { - "bom-ref": "e10936b0c19a823b", + "bom-ref": "72f47ab4f3137b8f", "name": "/usr/share/vim/vim91/doc/vim9.txt", "type": "file" }, { - "bom-ref": "3e42faa312256166", + "bom-ref": "ef5ee95409187e2a", "name": "/usr/share/vim/vim91/doc/vim9class.txt", "type": "file" }, { - "bom-ref": "2d8040f81bfa3421", + "bom-ref": "569acbd171373f49", "name": "/usr/share/vim/vim91/doc/visual.txt", "type": "file" }, { - "bom-ref": "f92b52677a2db6c8", + "bom-ref": "f4b3b686b340fdc4", "name": "/usr/share/vim/vim91/doc/windows.txt", "type": "file" }, { - "bom-ref": "da66899ab272d811", + "bom-ref": "07ea5daecf16328d", "name": "/usr/share/vim/vim91/doc/workshop.txt", "type": "file" }, { - "bom-ref": "c401f98d11d10079", + "bom-ref": "710f029be9c341dd", "name": "/usr/share/vim/vim91/evim.vim", "type": "file" }, { - "bom-ref": "3b04b9310fad4a35", + "bom-ref": "22c2ac1e6be25a79", "name": "/usr/share/vim/vim91/filetype.vim", "type": "file" }, { - "bom-ref": "5ec05b37010d72cc", + "bom-ref": "61f49254dbc3ec1c", "name": "/usr/share/vim/vim91/ftoff.vim", "type": "file" }, { - "bom-ref": "3fcece8969aaf493", + "bom-ref": "ae09b745e5c2a68f", "name": "/usr/share/vim/vim91/ftplugin.vim", "type": "file" }, { - "bom-ref": "15baad76b4eb08d8", + "bom-ref": "e4615174178b59b8", "name": "/usr/share/vim/vim91/ftplugin/8th.vim", "type": "file" }, { - "bom-ref": "b461f9b13d7d8ec4", + "bom-ref": "3a73b95db578e810", "name": "/usr/share/vim/vim91/ftplugin/a2ps.vim", "type": "file" }, { - "bom-ref": "7be6e65033cf3340", + "bom-ref": "ad803e8f548d6518", "name": "/usr/share/vim/vim91/ftplugin/aap.vim", "type": "file" }, { - "bom-ref": "538382534a46a58d", + "bom-ref": "5730645dc3c1cab9", "name": "/usr/share/vim/vim91/ftplugin/abap.vim", "type": "file" }, { - "bom-ref": "a4f9735caec73b35", + "bom-ref": "1b61455a78fbe3c1", "name": "/usr/share/vim/vim91/ftplugin/abaqus.vim", "type": "file" }, { - "bom-ref": "e9716ca12ba64ca3", + "bom-ref": "8b7d088f2d57e733", "name": "/usr/share/vim/vim91/ftplugin/ada.vim", "type": "file" }, { - "bom-ref": "cf244de24f54ff89", + "bom-ref": "240ee7d33b7c9875", "name": "/usr/share/vim/vim91/ftplugin/alsaconf.vim", "type": "file" }, { - "bom-ref": "c01ab856103a3854", + "bom-ref": "801ae9910ffb727c", "name": "/usr/share/vim/vim91/ftplugin/ant.vim", "type": "file" }, { - "bom-ref": "5563f230250afacf", + "bom-ref": "f888f44e45c69bf7", "name": "/usr/share/vim/vim91/ftplugin/apache.vim", "type": "file" }, { - "bom-ref": "5d6e86a94170f3cf", + "bom-ref": "1de2f258ed8a5717", "name": "/usr/share/vim/vim91/ftplugin/arch.vim", "type": "file" }, { - "bom-ref": "9aecc88c21e31a14", + "bom-ref": "408afb2aa4aeeefc", "name": "/usr/share/vim/vim91/ftplugin/art.vim", "type": "file" }, { - "bom-ref": "9598f5cdde6bbc03", + "bom-ref": "6b54123786787e27", "name": "/usr/share/vim/vim91/ftplugin/asm.vim", "type": "file" }, { - "bom-ref": "93dee2eb3f356fcf", + "bom-ref": "d786a5c319f8cb23", "name": "/usr/share/vim/vim91/ftplugin/aspvbs.vim", "type": "file" }, { - "bom-ref": "9bbed11418192e2d", + "bom-ref": "da9021f66f55b6a1", "name": "/usr/share/vim/vim91/ftplugin/automake.vim", "type": "file" }, { - "bom-ref": "fa6c1a4c448d1681", + "bom-ref": "c3107c5705d2c759", "name": "/usr/share/vim/vim91/ftplugin/awk.vim", "type": "file" }, { - "bom-ref": "40113b5f3125270c", + "bom-ref": "0ed97f6411726430", "name": "/usr/share/vim/vim91/ftplugin/bash.vim", "type": "file" }, { - "bom-ref": "607c3bf8ebb34d62", + "bom-ref": "8f0767168fc176b6", "name": "/usr/share/vim/vim91/ftplugin/basic.vim", "type": "file" }, { - "bom-ref": "323c4d9a3f4416f5", + "bom-ref": "49a2fac5c8bd0cd9", "name": "/usr/share/vim/vim91/ftplugin/bdf.vim", "type": "file" }, { - "bom-ref": "d88f22d8c76a7cc8", + "bom-ref": "3c7b2a8660616070", "name": "/usr/share/vim/vim91/ftplugin/bitbake.vim", "type": "file" }, { - "bom-ref": "b430b11473c1c468", + "bom-ref": "05660dfd1361b760", "name": "/usr/share/vim/vim91/ftplugin/bst.vim", "type": "file" }, { - "bom-ref": "acd570c2a1774604", + "bom-ref": "11577469832e26d8", "name": "/usr/share/vim/vim91/ftplugin/btm.vim", "type": "file" }, { - "bom-ref": "6d81165a96c62695", + "bom-ref": "8ee2b1bdd1b03db9", "name": "/usr/share/vim/vim91/ftplugin/bzl.vim", "type": "file" }, { - "bom-ref": "f4980f2cec6d4ea0", + "bom-ref": "747257fd4651b7c4", "name": "/usr/share/vim/vim91/ftplugin/c.vim", "type": "file" }, { - "bom-ref": "9075bafe1ae685ce", + "bom-ref": "9612918d5273b3ae", "name": "/usr/share/vim/vim91/ftplugin/calendar.vim", "type": "file" }, { - "bom-ref": "d09abaef1dabf4a6", + "bom-ref": "3fd14351bbb6bf5a", "name": "/usr/share/vim/vim91/ftplugin/cdrdaoconf.vim", "type": "file" }, { - "bom-ref": "199ab9cd1b4f9262", + "bom-ref": "ed7f2e172ce1660e", "name": "/usr/share/vim/vim91/ftplugin/cfg.vim", "type": "file" }, { - "bom-ref": "3eb56536ba886b44", + "bom-ref": "4e6dceca4fce12c4", "name": "/usr/share/vim/vim91/ftplugin/ch.vim", "type": "file" }, { - "bom-ref": "9191ad03c7cad98c", + "bom-ref": "c3246fccf3526378", "name": "/usr/share/vim/vim91/ftplugin/changelog.vim", "type": "file" }, { - "bom-ref": "0a762669334a7616", + "bom-ref": "342fee0a79a2709a", "name": "/usr/share/vim/vim91/ftplugin/chatito.vim", "type": "file" }, { - "bom-ref": "1bd0b89eaa0a3548", + "bom-ref": "cf5567bd76dbcab8", "name": "/usr/share/vim/vim91/ftplugin/chicken.vim", "type": "file" }, { - "bom-ref": "758534b55a52cd9b", + "bom-ref": "d1adc87a55b51673", "name": "/usr/share/vim/vim91/ftplugin/clojure.vim", "type": "file" }, { - "bom-ref": "9240ddbdc9ef5448", + "bom-ref": "b62c92d11d2ccad8", "name": "/usr/share/vim/vim91/ftplugin/cmake.vim", "type": "file" }, { - "bom-ref": "1b0d3fea51459db5", + "bom-ref": "e438bdad01305aa5", "name": "/usr/share/vim/vim91/ftplugin/cobol.vim", "type": "file" }, { - "bom-ref": "d5c8332a5779cf44", + "bom-ref": "79a4176b70ddbc30", "name": "/usr/share/vim/vim91/ftplugin/conf.vim", "type": "file" }, { - "bom-ref": "a74d516d031fa7ab", + "bom-ref": "354cdeae8e7e2817", "name": "/usr/share/vim/vim91/ftplugin/config.vim", "type": "file" }, { - "bom-ref": "cc996e0c80873797", + "bom-ref": "3ced73512323ee1b", "name": "/usr/share/vim/vim91/ftplugin/confini.vim", "type": "file" }, { - "bom-ref": "227774278d00d8b7", + "bom-ref": "063a99b55759e7e7", "name": "/usr/share/vim/vim91/ftplugin/context.vim", "type": "file" }, { - "bom-ref": "25d2146e811f1dc8", + "bom-ref": "f5a6d97fdd2fc5a4", "name": "/usr/share/vim/vim91/ftplugin/corn.vim", "type": "file" }, { - "bom-ref": "4f64862ccb02b14a", + "bom-ref": "3dca6f88ed56fa2a", "name": "/usr/share/vim/vim91/ftplugin/cpp.vim", "type": "file" }, { - "bom-ref": "6dd15d8075f90d5a", + "bom-ref": "4f2e1432377f6896", "name": "/usr/share/vim/vim91/ftplugin/crm.vim", "type": "file" }, { - "bom-ref": "d2d38eea2ddf3e27", + "bom-ref": "1f1c0071e4307787", "name": "/usr/share/vim/vim91/ftplugin/crontab.vim", "type": "file" }, { - "bom-ref": "704455c88fd26b02", + "bom-ref": "26884c3040836e4e", "name": "/usr/share/vim/vim91/ftplugin/cs.vim", "type": "file" }, { - "bom-ref": "b012ed8c0f544100", + "bom-ref": "a885811f49cd8190", "name": "/usr/share/vim/vim91/ftplugin/csc.vim", "type": "file" }, { - "bom-ref": "3d18edb68aeea152", + "bom-ref": "bd44ace8073e5332", "name": "/usr/share/vim/vim91/ftplugin/csh.vim", "type": "file" }, { - "bom-ref": "265cd4f6b0e81d2b", + "bom-ref": "02fde1f23a8c4e2b", "name": "/usr/share/vim/vim91/ftplugin/css.vim", "type": "file" }, { - "bom-ref": "29fc5ae93cd6ff05", + "bom-ref": "9602dde663a833fd", "name": "/usr/share/vim/vim91/ftplugin/cucumber.vim", "type": "file" }, { - "bom-ref": "cbc9313ef6fa653d", + "bom-ref": "9c22f336cafaab31", "name": "/usr/share/vim/vim91/ftplugin/cvsrc.vim", "type": "file" }, { - "bom-ref": "27e0fafc1bf2770c", + "bom-ref": "1d098df42dd8b520", "name": "/usr/share/vim/vim91/ftplugin/debchangelog.vim", "type": "file" }, { - "bom-ref": "1b5194319352cba6", + "bom-ref": "100081fe4f485d4a", "name": "/usr/share/vim/vim91/ftplugin/debcontrol.vim", "type": "file" }, { - "bom-ref": "49a7ad6c70cf32f9", + "bom-ref": "594bd51ae972572d", "name": "/usr/share/vim/vim91/ftplugin/debsources.vim", "type": "file" }, { - "bom-ref": "8477e7f92d3a21f6", + "bom-ref": "0ab9cf577b0af35a", "name": "/usr/share/vim/vim91/ftplugin/denyhosts.vim", "type": "file" }, { - "bom-ref": "26a3ac51e525dcca", + "bom-ref": "ad08489f38d7555a", "name": "/usr/share/vim/vim91/ftplugin/desktop.vim", "type": "file" }, { - "bom-ref": "570f8bc88411174b", + "bom-ref": "3f8277523c4efbb3", "name": "/usr/share/vim/vim91/ftplugin/dictconf.vim", "type": "file" }, { - "bom-ref": "15917b3f90044a57", + "bom-ref": "bd3e5f3f86181d8b", "name": "/usr/share/vim/vim91/ftplugin/dictdconf.vim", "type": "file" }, { - "bom-ref": "df619e0ef26f8192", + "bom-ref": "de4ce2f49fa2958a", "name": "/usr/share/vim/vim91/ftplugin/diff.vim", "type": "file" }, { - "bom-ref": "df82efb41315c22c", + "bom-ref": "34c39ab48f0d5c64", "name": "/usr/share/vim/vim91/ftplugin/dircolors.vim", "type": "file" }, { - "bom-ref": "f7cb0c816b3d611b", + "bom-ref": "d991ee190de0237f", "name": "/usr/share/vim/vim91/ftplugin/docbk.vim", "type": "file" }, { - "bom-ref": "2ec5b84e20ee6447", + "bom-ref": "f75f7fd297ea9037", "name": "/usr/share/vim/vim91/ftplugin/dockerfile.vim", "type": "file" }, { - "bom-ref": "8b0118c55c61880e", + "bom-ref": "26c5e59e7b918636", "name": "/usr/share/vim/vim91/ftplugin/dosbatch.vim", "type": "file" }, { - "bom-ref": "6522022e839dbcd9", + "bom-ref": "7e6621f50d728ab9", "name": "/usr/share/vim/vim91/ftplugin/dosini.vim", "type": "file" }, { - "bom-ref": "b42d54a934aa6364", + "bom-ref": "88768cc58b7be50c", "name": "/usr/share/vim/vim91/ftplugin/dtd.vim", "type": "file" }, { - "bom-ref": "907c01deb5784c10", + "bom-ref": "3f98375084ad2af4", "name": "/usr/share/vim/vim91/ftplugin/dtrace.vim", "type": "file" }, { - "bom-ref": "8a054195818b644d", + "bom-ref": "63c6d91cd0cb1b41", "name": "/usr/share/vim/vim91/ftplugin/dune.vim", "type": "file" }, { - "bom-ref": "5f1932c596496f1e", + "bom-ref": "d796cc44df485036", "name": "/usr/share/vim/vim91/ftplugin/eiffel.vim", "type": "file" }, { - "bom-ref": "6d4b304bea8113d0", + "bom-ref": "7d0d3c1416db0914", "name": "/usr/share/vim/vim91/ftplugin/elinks.vim", "type": "file" }, { - "bom-ref": "fd35299ac99197f7", + "bom-ref": "c77404abb71f4a77", "name": "/usr/share/vim/vim91/ftplugin/elixir.vim", "type": "file" }, { - "bom-ref": "6f6c19a7c7561488", + "bom-ref": "acdd67170becca20", "name": "/usr/share/vim/vim91/ftplugin/elm.vim", "type": "file" }, { - "bom-ref": "b5bb6806516764e2", + "bom-ref": "70846bbcc12053b6", "name": "/usr/share/vim/vim91/ftplugin/erlang.vim", "type": "file" }, { - "bom-ref": "f6e3ba3cbe8fadb2", + "bom-ref": "23795d6e5702c176", "name": "/usr/share/vim/vim91/ftplugin/eruby.vim", "type": "file" }, { - "bom-ref": "bbee7ab8c07cb294", + "bom-ref": "2f1fce96beeaecac", "name": "/usr/share/vim/vim91/ftplugin/eterm.vim", "type": "file" }, { - "bom-ref": "6d833772784871f1", + "bom-ref": "1033f07823c414c9", "name": "/usr/share/vim/vim91/ftplugin/expect.vim", "type": "file" }, { - "bom-ref": "ed5f8dda5bb1b1e2", + "bom-ref": "8eb0e396768c07fe", "name": "/usr/share/vim/vim91/ftplugin/falcon.vim", "type": "file" }, { - "bom-ref": "390166fbc2c9b13e", + "bom-ref": "09192ba7d0bb1e1e", "name": "/usr/share/vim/vim91/ftplugin/fennel.vim", "type": "file" }, { - "bom-ref": "6b79638b17b8367b", + "bom-ref": "83f46763197691b3", "name": "/usr/share/vim/vim91/ftplugin/fetchmail.vim", "type": "file" }, { - "bom-ref": "48e032f2a33e8d2d", + "bom-ref": "2e244daf49ff5465", "name": "/usr/share/vim/vim91/ftplugin/fish.vim", "type": "file" }, { - "bom-ref": "9662832f16687bfe", + "bom-ref": "fabfcdfc56d55252", "name": "/usr/share/vim/vim91/ftplugin/flexwiki.vim", "type": "file" }, { - "bom-ref": "3f8ad2b729f31025", + "bom-ref": "46e2b40388b2471d", "name": "/usr/share/vim/vim91/ftplugin/forth.vim", "type": "file" }, { - "bom-ref": "2d1f98ab65774557", + "bom-ref": "579dd2957a214c77", "name": "/usr/share/vim/vim91/ftplugin/fortran.vim", "type": "file" }, { - "bom-ref": "9717bf487268ae74", + "bom-ref": "9a7cd1233a49a4e0", "name": "/usr/share/vim/vim91/ftplugin/fpcmake.vim", "type": "file" }, { - "bom-ref": "8999660f813de0d3", + "bom-ref": "99b81f4cabbf0f37", "name": "/usr/share/vim/vim91/ftplugin/framescript.vim", "type": "file" }, { - "bom-ref": "be2e5d7a0f06b045", + "bom-ref": "e882de39687a8755", "name": "/usr/share/vim/vim91/ftplugin/freebasic.vim", "type": "file" }, { - "bom-ref": "bfa64da93fac22c6", + "bom-ref": "e736564121e39c0e", "name": "/usr/share/vim/vim91/ftplugin/fstab.vim", "type": "file" }, { - "bom-ref": "cd6aca8024a6c429", + "bom-ref": "04993f20598f5fcd", "name": "/usr/share/vim/vim91/ftplugin/fvwm.vim", "type": "file" }, { - "bom-ref": "fa053821e9d53019", + "bom-ref": "7f752b5af5112e79", "name": "/usr/share/vim/vim91/ftplugin/gdb.vim", "type": "file" }, { - "bom-ref": "0b4618c6a91caa8d", + "bom-ref": "b7bbbb950b10f725", "name": "/usr/share/vim/vim91/ftplugin/gdscript.vim", "type": "file" }, { - "bom-ref": "e4d9df2b610bdd6b", + "bom-ref": "14f496e5f783812f", "name": "/usr/share/vim/vim91/ftplugin/gdshader.vim", "type": "file" }, { - "bom-ref": "4089107494bea798", + "bom-ref": "a384f8e90fd7103c", "name": "/usr/share/vim/vim91/ftplugin/git.vim", "type": "file" }, { - "bom-ref": "77047a02856e78ee", + "bom-ref": "4920a78fcbd29c42", "name": "/usr/share/vim/vim91/ftplugin/gitattributes.vim", "type": "file" }, { - "bom-ref": "aaa6df3826096b21", + "bom-ref": "94295729ce117bd5", "name": "/usr/share/vim/vim91/ftplugin/gitcommit.vim", "type": "file" }, { - "bom-ref": "4ea8e1a57b393c7e", + "bom-ref": "47eb23a0ab26aa16", "name": "/usr/share/vim/vim91/ftplugin/gitconfig.vim", "type": "file" }, { - "bom-ref": "18b3dad9a5e7fc94", + "bom-ref": "51fdf974bbd48ec8", "name": "/usr/share/vim/vim91/ftplugin/gitignore.vim", "type": "file" }, { - "bom-ref": "070899d37ac02395", + "bom-ref": "2571534dda33c01d", "name": "/usr/share/vim/vim91/ftplugin/gitrebase.vim", "type": "file" }, { - "bom-ref": "43c39e479571eec9", + "bom-ref": "042e152933a31415", "name": "/usr/share/vim/vim91/ftplugin/gitsendemail.vim", "type": "file" }, { - "bom-ref": "46b3c4ad50e326a9", + "bom-ref": "ef96ddce4f00e8e5", "name": "/usr/share/vim/vim91/ftplugin/go.vim", "type": "file" }, { - "bom-ref": "de30fde141ee2173", + "bom-ref": "d585ce0f914ab173", "name": "/usr/share/vim/vim91/ftplugin/gpg.vim", "type": "file" }, { - "bom-ref": "dae01265f6981beb", + "bom-ref": "c3b4bcf2194de627", "name": "/usr/share/vim/vim91/ftplugin/gprof.vim", "type": "file" }, { - "bom-ref": "f0807a780f29ee4e", + "bom-ref": "a3f459ececfa7852", "name": "/usr/share/vim/vim91/ftplugin/groovy.vim", "type": "file" }, { - "bom-ref": "42ff7ae4869763d8", + "bom-ref": "5efd7ddc87928b94", "name": "/usr/share/vim/vim91/ftplugin/group.vim", "type": "file" }, { - "bom-ref": "7a6cb5e5fba6698f", + "bom-ref": "1af384f442d1bd17", "name": "/usr/share/vim/vim91/ftplugin/grub.vim", "type": "file" }, { - "bom-ref": "10ef11e540859e75", + "bom-ref": "d7f0009a79a80ee5", "name": "/usr/share/vim/vim91/ftplugin/gyp.vim", "type": "file" }, { - "bom-ref": "fd301eca6cf75051", + "bom-ref": "83160f05384666c5", "name": "/usr/share/vim/vim91/ftplugin/haml.vim", "type": "file" }, { - "bom-ref": "f40625a67982aaa0", + "bom-ref": "a7d64e8a76570970", "name": "/usr/share/vim/vim91/ftplugin/hamster.vim", "type": "file" }, { - "bom-ref": "bafc80009497e751", + "bom-ref": "ee0768ed17bfb0b9", "name": "/usr/share/vim/vim91/ftplugin/hare.vim", "type": "file" }, { - "bom-ref": "cea098cc4de98429", + "bom-ref": "bc5de7d339a1b8c9", "name": "/usr/share/vim/vim91/ftplugin/haskell.vim", "type": "file" }, { - "bom-ref": "49717d05a3c78b68", + "bom-ref": "620f73877f8442d4", "name": "/usr/share/vim/vim91/ftplugin/heex.vim", "type": "file" }, { - "bom-ref": "39b0f82550917d08", + "bom-ref": "a0242839ed12b900", "name": "/usr/share/vim/vim91/ftplugin/help.vim", "type": "file" }, { - "bom-ref": "c8e1d8bb296b6195", + "bom-ref": "0946a496a75ba939", "name": "/usr/share/vim/vim91/ftplugin/hgcommit.vim", "type": "file" }, { - "bom-ref": "ab3e8eae98a570cd", + "bom-ref": "0b84b2ad72950195", "name": "/usr/share/vim/vim91/ftplugin/hog.vim", "type": "file" }, { - "bom-ref": "fde82614054a51e4", + "bom-ref": "6f5d2782758d415c", "name": "/usr/share/vim/vim91/ftplugin/hostconf.vim", "type": "file" }, { - "bom-ref": "b3bcd1032eada8d1", + "bom-ref": "63e0a9c8280ebd09", "name": "/usr/share/vim/vim91/ftplugin/hostsaccess.vim", "type": "file" }, { - "bom-ref": "1d7446d4dee7a903", + "bom-ref": "5554c6beb2c43e9b", "name": "/usr/share/vim/vim91/ftplugin/html.vim", "type": "file" }, { - "bom-ref": "8f0201554a2ef558", + "bom-ref": "fa1456074273bd44", "name": "/usr/share/vim/vim91/ftplugin/htmldjango.vim", "type": "file" }, { - "bom-ref": "8b109a2a8480c1f6", + "bom-ref": "bbfe76f4f77e73b2", "name": "/usr/share/vim/vim91/ftplugin/i3config.vim", "type": "file" }, { - "bom-ref": "feaa36dcaa984737", + "bom-ref": "f72024fec4f68987", "name": "/usr/share/vim/vim91/ftplugin/icon.vim", "type": "file" }, { - "bom-ref": "45d10a373fdf260d", + "bom-ref": "e6b839aaf31303c1", "name": "/usr/share/vim/vim91/ftplugin/indent.vim", "type": "file" }, { - "bom-ref": "5c38e9c5d1a800ae", + "bom-ref": "16eda9cebee3b08a", "name": "/usr/share/vim/vim91/ftplugin/initex.vim", "type": "file" }, { - "bom-ref": "df860748761c5bf3", + "bom-ref": "734f573cef62b4d7", "name": "/usr/share/vim/vim91/ftplugin/ishd.vim", "type": "file" }, { - "bom-ref": "4435f906a8630322", + "bom-ref": "e32b17c5bdfdebe2", "name": "/usr/share/vim/vim91/ftplugin/j.vim", "type": "file" }, { - "bom-ref": "cc5c4c66e5681d1c", + "bom-ref": "127a913d641b5284", "name": "/usr/share/vim/vim91/ftplugin/java.vim", "type": "file" }, { - "bom-ref": "93612525ba9b081a", + "bom-ref": "8b4ae20d772457d2", "name": "/usr/share/vim/vim91/ftplugin/javascript.vim", "type": "file" }, { - "bom-ref": "e21dbff6bd14736b", + "bom-ref": "01739df0849b6a93", "name": "/usr/share/vim/vim91/ftplugin/javascriptreact.vim", "type": "file" }, { - "bom-ref": "9faa6ddb058c9454", + "bom-ref": "901d5511eea74bb0", "name": "/usr/share/vim/vim91/ftplugin/jproperties.vim", "type": "file" }, { - "bom-ref": "adb463611ebdd390", + "bom-ref": "be866b41affb1e40", "name": "/usr/share/vim/vim91/ftplugin/json.vim", "type": "file" }, { - "bom-ref": "748ecab9ead57291", + "bom-ref": "c3138c5f059fda95", "name": "/usr/share/vim/vim91/ftplugin/json5.vim", "type": "file" }, { - "bom-ref": "f1e5be85847643fc", + "bom-ref": "c2619ec24ae838fc", "name": "/usr/share/vim/vim91/ftplugin/jsonc.vim", "type": "file" }, { - "bom-ref": "2a2338fd85141396", + "bom-ref": "e59326e44f908406", "name": "/usr/share/vim/vim91/ftplugin/jsonnet.vim", "type": "file" }, { - "bom-ref": "876e1bffa3b8e5a0", + "bom-ref": "9c3d3c323bca7bac", "name": "/usr/share/vim/vim91/ftplugin/jsp.vim", "type": "file" }, { - "bom-ref": "d8080ef512178c08", + "bom-ref": "d37f266608986400", "name": "/usr/share/vim/vim91/ftplugin/julia.vim", "type": "file" }, { - "bom-ref": "a3a4ffbb02d3da56", + "bom-ref": "73c0ea1c5bbb12ea", "name": "/usr/share/vim/vim91/ftplugin/kconfig.vim", "type": "file" }, { - "bom-ref": "2b5a39a73e2241d5", + "bom-ref": "7aa1c751441733f5", "name": "/usr/share/vim/vim91/ftplugin/kotlin.vim", "type": "file" }, { - "bom-ref": "254b199dee21e420", + "bom-ref": "a8d63602550b3140", "name": "/usr/share/vim/vim91/ftplugin/kwt.vim", "type": "file" }, { - "bom-ref": "987c52123cc95284", + "bom-ref": "b8137c42b96d8608", "name": "/usr/share/vim/vim91/ftplugin/ld.vim", "type": "file" }, { - "bom-ref": "6e011e32e3451347", + "bom-ref": "97bc77fb0ee8d5f3", "name": "/usr/share/vim/vim91/ftplugin/less.vim", "type": "file" }, { - "bom-ref": "3e30d69abfafeaf1", + "bom-ref": "5c572041869128a5", "name": "/usr/share/vim/vim91/ftplugin/lftp.vim", "type": "file" }, { - "bom-ref": "a79654656d23a144", + "bom-ref": "992c95247d93be98", "name": "/usr/share/vim/vim91/ftplugin/libao.vim", "type": "file" }, { - "bom-ref": "e70267075bf97110", + "bom-ref": "0d3338d8fe07ed18", "name": "/usr/share/vim/vim91/ftplugin/limits.vim", "type": "file" }, { - "bom-ref": "0b52bfab92ebfbb9", + "bom-ref": "d62e634a46def24d", "name": "/usr/share/vim/vim91/ftplugin/liquid.vim", "type": "file" }, { - "bom-ref": "58111a204ecf8ec2", + "bom-ref": "cd50c56a67783cae", "name": "/usr/share/vim/vim91/ftplugin/lisp.vim", "type": "file" }, { - "bom-ref": "3848e6c0aff5a4ab", + "bom-ref": "732a7e99820933cf", "name": "/usr/share/vim/vim91/ftplugin/livebook.vim", "type": "file" }, { - "bom-ref": "423edca89bd02c03", + "bom-ref": "fd10b7503151ab1b", "name": "/usr/share/vim/vim91/ftplugin/logcheck.vim", "type": "file" }, { - "bom-ref": "6f83bbd484fd7b55", + "bom-ref": "cdea83ca3d4d2ba1", "name": "/usr/share/vim/vim91/ftplugin/loginaccess.vim", "type": "file" }, { - "bom-ref": "9d273081c5e776c8", + "bom-ref": "7b8bca1c1c03d258", "name": "/usr/share/vim/vim91/ftplugin/logindefs.vim", "type": "file" }, { - "bom-ref": "452d5b176a8bc4a4", + "bom-ref": "c9be905208ce48e8", "name": "/usr/share/vim/vim91/ftplugin/logtalk.dict", "type": "file" }, { - "bom-ref": "87d5505f4160c180", + "bom-ref": "8282c814d416ee94", "name": "/usr/share/vim/vim91/ftplugin/logtalk.vim", "type": "file" }, { - "bom-ref": "1a4e44dcb3bdd43d", + "bom-ref": "ffd293b2572bcc55", "name": "/usr/share/vim/vim91/ftplugin/lprolog.vim", "type": "file" }, { - "bom-ref": "757351455ec42bcf", + "bom-ref": "99f5c03646c74423", "name": "/usr/share/vim/vim91/ftplugin/lua.vim", "type": "file" }, { - "bom-ref": "c607e6e1422d72aa", + "bom-ref": "29f38a795eecfade", "name": "/usr/share/vim/vim91/ftplugin/luau.vim", "type": "file" }, { - "bom-ref": "0c944dc08b493aac", + "bom-ref": "8923332cad09138c", "name": "/usr/share/vim/vim91/ftplugin/lynx.vim", "type": "file" }, { - "bom-ref": "45eb3446ef475ce9", + "bom-ref": "a3fcb3bc16820305", "name": "/usr/share/vim/vim91/ftplugin/m3build.vim", "type": "file" }, { - "bom-ref": "5ae3d0f22793265b", + "bom-ref": "63c725c5bde51daf", "name": "/usr/share/vim/vim91/ftplugin/m3quake.vim", "type": "file" }, { - "bom-ref": "35fb1325d04cacde", + "bom-ref": "a93c25e220b2fc8a", "name": "/usr/share/vim/vim91/ftplugin/m4.vim", "type": "file" }, { - "bom-ref": "c68eafcd1d681c09", + "bom-ref": "fee5c5ccc1309afd", "name": "/usr/share/vim/vim91/ftplugin/mail.vim", "type": "file" }, { - "bom-ref": "b0b4f36b522232bd", + "bom-ref": "91140b2aff8ed229", "name": "/usr/share/vim/vim91/ftplugin/mailaliases.vim", "type": "file" }, { - "bom-ref": "c8d96f33ea1d4e0b", + "bom-ref": "a7cb5411a8f82b23", "name": "/usr/share/vim/vim91/ftplugin/mailcap.vim", "type": "file" }, { - "bom-ref": "e4da58c7ce78f0e5", + "bom-ref": "3a734efeecac1fa1", "name": "/usr/share/vim/vim91/ftplugin/make.vim", "type": "file" }, { - "bom-ref": "dbe0b246ee2aae06", + "bom-ref": "3463cc87f159847a", "name": "/usr/share/vim/vim91/ftplugin/man.vim", "type": "file" }, { - "bom-ref": "cdd27ce616abff85", + "bom-ref": "b32eef8bbbafe221", "name": "/usr/share/vim/vim91/ftplugin/manconf.vim", "type": "file" }, { - "bom-ref": "815811eeb0f36a3b", + "bom-ref": "783e59a74de5212f", "name": "/usr/share/vim/vim91/ftplugin/markdown.vim", "type": "file" }, { - "bom-ref": "3ccbcc2476056e65", + "bom-ref": "8f8f464a3833a571", "name": "/usr/share/vim/vim91/ftplugin/masm.vim", "type": "file" }, { - "bom-ref": "3f5e217f322eeb4b", + "bom-ref": "99b1221f5889fc93", "name": "/usr/share/vim/vim91/ftplugin/matlab.vim", "type": "file" }, { - "bom-ref": "cd7eec66bc26ca2f", + "bom-ref": "6808203d9e40117f", "name": "/usr/share/vim/vim91/ftplugin/mermaid.vim", "type": "file" }, { - "bom-ref": "c81e93dd8f8a360b", + "bom-ref": "f61cfec4a7b493eb", "name": "/usr/share/vim/vim91/ftplugin/meson.vim", "type": "file" }, { - "bom-ref": "0edb6ce1a60b99d2", + "bom-ref": "05b03387acbf5b4e", "name": "/usr/share/vim/vim91/ftplugin/mf.vim", "type": "file" }, { - "bom-ref": "d6459c9d95bfa59e", + "bom-ref": "235ecf11f644909e", "name": "/usr/share/vim/vim91/ftplugin/mma.vim", "type": "file" }, { - "bom-ref": "fc7dcab5fa867805", + "bom-ref": "fe21c18f2fce1a89", "name": "/usr/share/vim/vim91/ftplugin/modconf.vim", "type": "file" }, { - "bom-ref": "14b001e8d38874ff", + "bom-ref": "21750d2e80c220e3", "name": "/usr/share/vim/vim91/ftplugin/modula2.vim", "type": "file" }, { - "bom-ref": "6704b8ed5edd6681", + "bom-ref": "43a9efa219099bfd", "name": "/usr/share/vim/vim91/ftplugin/modula3.vim", "type": "file" }, { - "bom-ref": "3ddccb915887069d", + "bom-ref": "2c19aaa66d231419", "name": "/usr/share/vim/vim91/ftplugin/mp.vim", "type": "file" }, { - "bom-ref": "a1c2104ad41d0151", + "bom-ref": "8a5a594ffe1401b5", "name": "/usr/share/vim/vim91/ftplugin/mplayerconf.vim", "type": "file" }, { - "bom-ref": "7ef47657ce914e67", + "bom-ref": "2d1f449ee8819a17", "name": "/usr/share/vim/vim91/ftplugin/mrxvtrc.vim", "type": "file" }, { - "bom-ref": "c72a1a628adb34d8", + "bom-ref": "8b3d873457253b9c", "name": "/usr/share/vim/vim91/ftplugin/msmessages.vim", "type": "file" }, { - "bom-ref": "8cea9583c630157c", + "bom-ref": "4b05b67be6b4e36c", "name": "/usr/share/vim/vim91/ftplugin/muttrc.vim", "type": "file" }, { - "bom-ref": "6f066b7e74231e50", + "bom-ref": "35e6c75917bd44d0", "name": "/usr/share/vim/vim91/ftplugin/nanorc.vim", "type": "file" }, { - "bom-ref": "935d0131a1a9d7df", + "bom-ref": "3329d6733737d47f", "name": "/usr/share/vim/vim91/ftplugin/neomuttrc.vim", "type": "file" }, { - "bom-ref": "5aa308c7f462315e", + "bom-ref": "0e735f276d28147e", "name": "/usr/share/vim/vim91/ftplugin/netrc.vim", "type": "file" }, { - "bom-ref": "ea53ac577569905f", + "bom-ref": "f61507493c60d3f7", "name": "/usr/share/vim/vim91/ftplugin/nginx.vim", "type": "file" }, { - "bom-ref": "e94499b66a337128", + "bom-ref": "aef3ec4c1d578e48", "name": "/usr/share/vim/vim91/ftplugin/nix.vim", "type": "file" }, { - "bom-ref": "0625aa6147c68697", + "bom-ref": "2e4f8709de8b61ef", "name": "/usr/share/vim/vim91/ftplugin/nroff.vim", "type": "file" }, { - "bom-ref": "4a30cf1d71e2e096", + "bom-ref": "cda253be6be00ee2", "name": "/usr/share/vim/vim91/ftplugin/nsis.vim", "type": "file" }, { - "bom-ref": "c54d1d5fefeb94f9", + "bom-ref": "d274906f1a1e4cc9", "name": "/usr/share/vim/vim91/ftplugin/objc.vim", "type": "file" }, { - "bom-ref": "9f52903cdfe1e705", + "bom-ref": "0497c9fb957fcbad", "name": "/usr/share/vim/vim91/ftplugin/objdump.vim", "type": "file" }, { - "bom-ref": "19e81e1b0a485e9f", + "bom-ref": "93069a3e904e5353", "name": "/usr/share/vim/vim91/ftplugin/obse.vim", "type": "file" }, { - "bom-ref": "3457311aeea88d7a", + "bom-ref": "46b3aaf8384894ea", "name": "/usr/share/vim/vim91/ftplugin/ocaml.vim", "type": "file" }, { - "bom-ref": "bf709a856b2571e0", + "bom-ref": "551e608e883d782c", "name": "/usr/share/vim/vim91/ftplugin/occam.vim", "type": "file" }, { - "bom-ref": "d64b342acbad898e", + "bom-ref": "fd366a611c738082", "name": "/usr/share/vim/vim91/ftplugin/octave.vim", "type": "file" }, { - "bom-ref": "d5ad7c6bdc3e7bf2", + "bom-ref": "3e40c6794ab7c792", "name": "/usr/share/vim/vim91/ftplugin/openvpn.vim", "type": "file" }, { - "bom-ref": "5225c720e1d0cc90", + "bom-ref": "0efbfb692b87ec70", "name": "/usr/share/vim/vim91/ftplugin/pamconf.vim", "type": "file" }, { - "bom-ref": "c0871250bb77f8df", + "bom-ref": "59b79546c9a63bb7", "name": "/usr/share/vim/vim91/ftplugin/pascal.vim", "type": "file" }, { - "bom-ref": "734674b9e63f0d53", + "bom-ref": "58f6620e3c6cbdcf", "name": "/usr/share/vim/vim91/ftplugin/passwd.vim", "type": "file" }, { - "bom-ref": "3c59020b3fdc81ac", + "bom-ref": "09c3ab0b602e3954", "name": "/usr/share/vim/vim91/ftplugin/pbtxt.vim", "type": "file" }, { - "bom-ref": "3e25d70172e067e8", + "bom-ref": "38da8f171f51bb3c", "name": "/usr/share/vim/vim91/ftplugin/pdf.vim", "type": "file" }, { - "bom-ref": "81e64305e83fe2d9", + "bom-ref": "deb1eb717b0363f9", "name": "/usr/share/vim/vim91/ftplugin/perl.vim", "type": "file" }, { - "bom-ref": "342fd4806b2a29cd", + "bom-ref": "0d7a32fa63a705a5", "name": "/usr/share/vim/vim91/ftplugin/php.vim", "type": "file" }, { - "bom-ref": "d4382412f892d0c3", + "bom-ref": "6095ceb379993e7b", "name": "/usr/share/vim/vim91/ftplugin/pinfo.vim", "type": "file" }, { - "bom-ref": "8abc573e12747ede", + "bom-ref": "7af74bcbd88a8c9a", "name": "/usr/share/vim/vim91/ftplugin/plaintex.vim", "type": "file" }, { - "bom-ref": "6fb816106464a304", + "bom-ref": "c970ba889361a744", "name": "/usr/share/vim/vim91/ftplugin/pod.vim", "type": "file" }, { - "bom-ref": "617a45cc6c737745", + "bom-ref": "2e0668fc372dbd9d", "name": "/usr/share/vim/vim91/ftplugin/poefilter.vim", "type": "file" }, { - "bom-ref": "50d502b3264b3166", + "bom-ref": "310036eeddb5609a", "name": "/usr/share/vim/vim91/ftplugin/poke.vim", "type": "file" }, { - "bom-ref": "1c172bd88bea68ec", + "bom-ref": "43d483a8ef42df78", "name": "/usr/share/vim/vim91/ftplugin/postscr.vim", "type": "file" }, { - "bom-ref": "bde362898c02fe56", + "bom-ref": "691fbefb127e9a46", "name": "/usr/share/vim/vim91/ftplugin/procmail.vim", "type": "file" }, { - "bom-ref": "c2da5328924eb804", + "bom-ref": "1d05736254233088", "name": "/usr/share/vim/vim91/ftplugin/prolog.vim", "type": "file" }, { - "bom-ref": "85a342fa15f4c83c", + "bom-ref": "52f080a834534308", "name": "/usr/share/vim/vim91/ftplugin/protocols.vim", "type": "file" }, { - "bom-ref": "d8440b1635ea9288", + "bom-ref": "11a4b7df46495ddc", "name": "/usr/share/vim/vim91/ftplugin/ps1.vim", "type": "file" }, { - "bom-ref": "46f5b8cc65fb4724", + "bom-ref": "b77852ad85391a04", "name": "/usr/share/vim/vim91/ftplugin/ps1xml.vim", "type": "file" }, { - "bom-ref": "0b16b2832a92caf3", + "bom-ref": "c47d72a856d5cab3", "name": "/usr/share/vim/vim91/ftplugin/pymanifest.vim", "type": "file" }, { - "bom-ref": "e1e7c1e5e3ab6882", + "bom-ref": "ec1dc73213fe02e6", "name": "/usr/share/vim/vim91/ftplugin/pyrex.vim", "type": "file" }, { - "bom-ref": "0eb692411cbb3107", + "bom-ref": "91171ee5d1ecdb67", "name": "/usr/share/vim/vim91/ftplugin/python.vim", "type": "file" }, { - "bom-ref": "5f12d4127e3bd210", + "bom-ref": "6fd3946a529f74f0", "name": "/usr/share/vim/vim91/ftplugin/qb64.vim", "type": "file" }, { - "bom-ref": "f7ce5095d65cb20b", + "bom-ref": "e79ce85a6f6316d7", "name": "/usr/share/vim/vim91/ftplugin/qf.vim", "type": "file" }, { - "bom-ref": "8ebdf4b3c592a933", + "bom-ref": "c49823da29fa7a1b", "name": "/usr/share/vim/vim91/ftplugin/qml.vim", "type": "file" }, { - "bom-ref": "9b5006f8ac02773f", + "bom-ref": "f0b7de5bdd43a003", "name": "/usr/share/vim/vim91/ftplugin/quake.vim", "type": "file" }, { - "bom-ref": "3b953bc08e6465a3", + "bom-ref": "cc8ea0ee3383b8bf", "name": "/usr/share/vim/vim91/ftplugin/quarto.vim", "type": "file" }, { - "bom-ref": "a35c614358f2011a", + "bom-ref": "9b4ec80558001dea", "name": "/usr/share/vim/vim91/ftplugin/r.vim", "type": "file" }, { - "bom-ref": "77c61c9274d2052c", + "bom-ref": "95714910d919d038", "name": "/usr/share/vim/vim91/ftplugin/racc.vim", "type": "file" }, { - "bom-ref": "c8c4d9865ff3d389", + "bom-ref": "8fb47becd57d4e45", "name": "/usr/share/vim/vim91/ftplugin/racket.vim", "type": "file" }, { - "bom-ref": "916b7b3c7ba18265", + "bom-ref": "ca7da5fc4a32b319", "name": "/usr/share/vim/vim91/ftplugin/raku.vim", "type": "file" }, { - "bom-ref": "04e416e62761b605", + "bom-ref": "c424915feff93219", "name": "/usr/share/vim/vim91/ftplugin/readline.vim", "type": "file" }, { - "bom-ref": "37afeeb2ad64a61b", + "bom-ref": "b6e30b9fa998ce4b", "name": "/usr/share/vim/vim91/ftplugin/registry.vim", "type": "file" }, { - "bom-ref": "08b13ac371be4bde", + "bom-ref": "2c4134eea1967792", "name": "/usr/share/vim/vim91/ftplugin/reva.vim", "type": "file" }, { - "bom-ref": "aa65d8634451ec6e", + "bom-ref": "c393deeedaa81976", "name": "/usr/share/vim/vim91/ftplugin/rhelp.vim", "type": "file" }, { - "bom-ref": "9f028ec6b0a092a8", + "bom-ref": "d96f7e6b19479b8c", "name": "/usr/share/vim/vim91/ftplugin/rmd.vim", "type": "file" }, { - "bom-ref": "421e200f1bfe36a3", + "bom-ref": "41843fc0734a0527", "name": "/usr/share/vim/vim91/ftplugin/rnc.vim", "type": "file" }, { - "bom-ref": "3cb39a80aa86927b", + "bom-ref": "7a131f5ff13a5b07", "name": "/usr/share/vim/vim91/ftplugin/rnoweb.vim", "type": "file" }, { - "bom-ref": "9cb8ca33333a34bf", + "bom-ref": "d83b005bc3abe06f", "name": "/usr/share/vim/vim91/ftplugin/routeros.vim", "type": "file" }, { - "bom-ref": "d1b3acf364d37bec", + "bom-ref": "14884bef9d750298", "name": "/usr/share/vim/vim91/ftplugin/rpl.vim", "type": "file" }, { - "bom-ref": "5f15851d1f727562", + "bom-ref": "1a80465f9b1bd6aa", "name": "/usr/share/vim/vim91/ftplugin/rrst.vim", "type": "file" }, { - "bom-ref": "8b3536aedbadab59", + "bom-ref": "e6d2582d52339fd5", "name": "/usr/share/vim/vim91/ftplugin/rst.vim", "type": "file" }, { - "bom-ref": "349f1d24c5693acc", + "bom-ref": "aafd63ceb81bb170", "name": "/usr/share/vim/vim91/ftplugin/ruby.vim", "type": "file" }, { - "bom-ref": "c3844ac45768af26", + "bom-ref": "d9597e1663d8037a", "name": "/usr/share/vim/vim91/ftplugin/rust.vim", "type": "file" }, { - "bom-ref": "3379cf18d1589d7d", + "bom-ref": "e3b7ad65e81fe5f9", "name": "/usr/share/vim/vim91/ftplugin/sass.vim", "type": "file" }, { - "bom-ref": "92d32cd0dc56478b", + "bom-ref": "75f813ed59f30bdf", "name": "/usr/share/vim/vim91/ftplugin/sbt.vim", "type": "file" }, { - "bom-ref": "40e491c6f2b24267", + "bom-ref": "7a6207de002eaef7", "name": "/usr/share/vim/vim91/ftplugin/scala.vim", "type": "file" }, { - "bom-ref": "5d3a4e221cd62c1d", + "bom-ref": "88dea4e2b124bc5d", "name": "/usr/share/vim/vim91/ftplugin/scdoc.vim", "type": "file" }, { - "bom-ref": "94ce98948ad0574e", + "bom-ref": "bc0407529ae9f6f6", "name": "/usr/share/vim/vim91/ftplugin/scheme.vim", "type": "file" }, { - "bom-ref": "d92871264eb8ff76", + "bom-ref": "44489c92a1f45c76", "name": "/usr/share/vim/vim91/ftplugin/screen.vim", "type": "file" }, { - "bom-ref": "9f9a7ea66971dd47", + "bom-ref": "9f5064d58658b33b", "name": "/usr/share/vim/vim91/ftplugin/scss.vim", "type": "file" }, { - "bom-ref": "024178ae713671c9", + "bom-ref": "c12968b195187155", "name": "/usr/share/vim/vim91/ftplugin/sed.vim", "type": "file" }, { - "bom-ref": "e271e0a7d82cc6d5", + "bom-ref": "b07865409b49cf15", "name": "/usr/share/vim/vim91/ftplugin/sensors.vim", "type": "file" }, { - "bom-ref": "3057c8fef2989b70", + "bom-ref": "a2b48b8fa2464588", "name": "/usr/share/vim/vim91/ftplugin/services.vim", "type": "file" }, { - "bom-ref": "5b502d0ed1e4e329", + "bom-ref": "c1abb7ab67f762c5", "name": "/usr/share/vim/vim91/ftplugin/setserial.vim", "type": "file" }, { - "bom-ref": "3bf9ebebf429a070", + "bom-ref": "d11103630aed5130", "name": "/usr/share/vim/vim91/ftplugin/sexplib.vim", "type": "file" }, { - "bom-ref": "60a2c35602afdcc5", + "bom-ref": "b15fc99acfce3081", "name": "/usr/share/vim/vim91/ftplugin/sgml.vim", "type": "file" }, { - "bom-ref": "ffbca70c54251a31", + "bom-ref": "974e76445f1ec49d", "name": "/usr/share/vim/vim91/ftplugin/sh.vim", "type": "file" }, { - "bom-ref": "638333a80fc8afb4", + "bom-ref": "d83acab53e14675c", "name": "/usr/share/vim/vim91/ftplugin/sieve.vim", "type": "file" }, { - "bom-ref": "7fb6c8d958b30699", + "bom-ref": "96e1ee450585329d", "name": "/usr/share/vim/vim91/ftplugin/slpconf.vim", "type": "file" }, { - "bom-ref": "cd0c3e969b8ad892", + "bom-ref": "224c45736669c0be", "name": "/usr/share/vim/vim91/ftplugin/slpreg.vim", "type": "file" }, { - "bom-ref": "a4d8a6886b1975ef", + "bom-ref": "b355e225e20d3b9f", "name": "/usr/share/vim/vim91/ftplugin/slpspi.vim", "type": "file" }, { - "bom-ref": "99645f25111de245", + "bom-ref": "c370505525adfb5d", "name": "/usr/share/vim/vim91/ftplugin/solidity.vim", "type": "file" }, { - "bom-ref": "15a0d30533f2a393", + "bom-ref": "c65c3162224c83a7", "name": "/usr/share/vim/vim91/ftplugin/solution.vim", "type": "file" }, { - "bom-ref": "1b90ed386665e5e5", + "bom-ref": "85560534efc3d781", "name": "/usr/share/vim/vim91/ftplugin/spec.vim", "type": "file" }, { - "bom-ref": "d3f318fe531dc993", + "bom-ref": "83902ed4e6626adb", "name": "/usr/share/vim/vim91/ftplugin/sql.vim", "type": "file" }, { - "bom-ref": "d97219803bfcfa27", + "bom-ref": "c6c7405eff50c177", "name": "/usr/share/vim/vim91/ftplugin/ssa.vim", "type": "file" }, { - "bom-ref": "9159daee339208cc", + "bom-ref": "19cccd3b198d0300", "name": "/usr/share/vim/vim91/ftplugin/sshconfig.vim", "type": "file" }, { - "bom-ref": "1b2172880af9c1de", + "bom-ref": "6fae37756645e06a", "name": "/usr/share/vim/vim91/ftplugin/sudoers.vim", "type": "file" }, { - "bom-ref": "79b1b2173c92d5e2", + "bom-ref": "4495b29f2028bd4a", "name": "/usr/share/vim/vim91/ftplugin/svg.vim", "type": "file" }, { - "bom-ref": "8b1dcb770e530f90", + "bom-ref": "ab209ccd9252cda8", "name": "/usr/share/vim/vim91/ftplugin/swayconfig.vim", "type": "file" }, { - "bom-ref": "7ecb620fca1f90cd", + "bom-ref": "eef92892bffc12f5", "name": "/usr/share/vim/vim91/ftplugin/swift.vim", "type": "file" }, { - "bom-ref": "50d0cc5242175af5", + "bom-ref": "83eed76cd42bde15", "name": "/usr/share/vim/vim91/ftplugin/swiftgyb.vim", "type": "file" }, { - "bom-ref": "aec62772bde38aed", + "bom-ref": "fd5bad1c0047c2a9", "name": "/usr/share/vim/vim91/ftplugin/swig.vim", "type": "file" }, { - "bom-ref": "7d40e851faacf743", + "bom-ref": "aa3c495dbfb1c983", "name": "/usr/share/vim/vim91/ftplugin/sysctl.vim", "type": "file" }, { - "bom-ref": "c6d08dc74e4ce80a", + "bom-ref": "c7af052a4c6940c2", "name": "/usr/share/vim/vim91/ftplugin/systemd.vim", "type": "file" }, { - "bom-ref": "3781c4608a00703c", + "bom-ref": "59063bc2815de394", "name": "/usr/share/vim/vim91/ftplugin/systemverilog.vim", "type": "file" }, { - "bom-ref": "d90a16cad9414bdf", + "bom-ref": "48f5b908e9fd893b", "name": "/usr/share/vim/vim91/ftplugin/tap.vim", "type": "file" }, { - "bom-ref": "bdf246a53f57811c", + "bom-ref": "414c60d2a734f224", "name": "/usr/share/vim/vim91/ftplugin/tcl.vim", "type": "file" }, { - "bom-ref": "9ed859cdb6cc06f5", + "bom-ref": "f816c7e4dcf204b5", "name": "/usr/share/vim/vim91/ftplugin/tcsh.vim", "type": "file" }, { - "bom-ref": "82272675ceeab617", + "bom-ref": "695f04bad517e95f", "name": "/usr/share/vim/vim91/ftplugin/terminfo.vim", "type": "file" }, { - "bom-ref": "7fe5178c4cd5c0f0", + "bom-ref": "23380cb9caddb3a8", "name": "/usr/share/vim/vim91/ftplugin/tex.vim", "type": "file" }, { - "bom-ref": "d6f77d664b415d8d", + "bom-ref": "42fd57def78a1c5d", "name": "/usr/share/vim/vim91/ftplugin/text.vim", "type": "file" }, { - "bom-ref": "4d7c013ba2896de1", + "bom-ref": "a0865667f042ecbd", "name": "/usr/share/vim/vim91/ftplugin/tidy.vim", "type": "file" }, { - "bom-ref": "4dddf42326f2d0a5", + "bom-ref": "848d063c46efadb5", "name": "/usr/share/vim/vim91/ftplugin/tmux.vim", "type": "file" }, { - "bom-ref": "6a049d10a6d9aa9a", + "bom-ref": "61e64bc2d2043d46", "name": "/usr/share/vim/vim91/ftplugin/toml.vim", "type": "file" }, { - "bom-ref": "150bd43bebcf45ff", + "bom-ref": "f04fab104a083463", "name": "/usr/share/vim/vim91/ftplugin/treetop.vim", "type": "file" }, { - "bom-ref": "bdfeee1018260438", + "bom-ref": "c8b10154254e5f4c", "name": "/usr/share/vim/vim91/ftplugin/tt2html.vim", "type": "file" }, { - "bom-ref": "560911b34fc269d2", + "bom-ref": "2cec30a9f334d24a", "name": "/usr/share/vim/vim91/ftplugin/typescript.vim", "type": "file" }, { - "bom-ref": "df73eb39499ffe7e", + "bom-ref": "07ea6d651ee7c962", "name": "/usr/share/vim/vim91/ftplugin/typescriptreact.vim", "type": "file" }, { - "bom-ref": "26e5b9fa8c5be19e", + "bom-ref": "6936e0457019f9be", "name": "/usr/share/vim/vim91/ftplugin/udevconf.vim", "type": "file" }, { - "bom-ref": "51872f09669fc573", + "bom-ref": "2d14653cb6f587d7", "name": "/usr/share/vim/vim91/ftplugin/udevperm.vim", "type": "file" }, { - "bom-ref": "f9cec4f3abd37faa", + "bom-ref": "65199f3a855edf92", "name": "/usr/share/vim/vim91/ftplugin/udevrules.vim", "type": "file" }, { - "bom-ref": "258eeba5295e97ae", + "bom-ref": "ebfb137e7446425a", "name": "/usr/share/vim/vim91/ftplugin/unison.vim", "type": "file" }, { - "bom-ref": "3ea03b6e2ccd6231", + "bom-ref": "36c9e667ff20d951", "name": "/usr/share/vim/vim91/ftplugin/updatedb.vim", "type": "file" }, { - "bom-ref": "4a1d2da1e2588801", + "bom-ref": "6599739c210cb111", "name": "/usr/share/vim/vim91/ftplugin/urlshortcut.vim", "type": "file" }, { - "bom-ref": "4f2773a6d091187a", + "bom-ref": "d7f803d5dff61702", "name": "/usr/share/vim/vim91/ftplugin/usd.vim", "type": "file" }, { - "bom-ref": "b0e6266386ac85c6", + "bom-ref": "90d6b8ee13999816", "name": "/usr/share/vim/vim91/ftplugin/vb.vim", "type": "file" }, { - "bom-ref": "5de1af6c4e59fb42", + "bom-ref": "9ad88c217d73e3e6", "name": "/usr/share/vim/vim91/ftplugin/vdf.vim", "type": "file" }, { - "bom-ref": "fb872a2d8d08cd77", + "bom-ref": "e327bda4351bf933", "name": "/usr/share/vim/vim91/ftplugin/verilog.vim", "type": "file" }, { - "bom-ref": "50e5d4dea61e0234", + "bom-ref": "a914070c61a7fd80", "name": "/usr/share/vim/vim91/ftplugin/vhdl.vim", "type": "file" }, { - "bom-ref": "3f0d9624bbf25c6d", + "bom-ref": "b424725e560e4cf9", "name": "/usr/share/vim/vim91/ftplugin/vim.vim", "type": "file" }, { - "bom-ref": "fd546761baa75264", + "bom-ref": "d31d4352c9019e88", "name": "/usr/share/vim/vim91/ftplugin/vroom.vim", "type": "file" }, { - "bom-ref": "4c93458ea0256dcd", + "bom-ref": "3e012157c3f65f6d", "name": "/usr/share/vim/vim91/ftplugin/vue.vim", "type": "file" }, { - "bom-ref": "6f0112c56181363d", + "bom-ref": "60d4155c93acca95", "name": "/usr/share/vim/vim91/ftplugin/wat.vim", "type": "file" }, { - "bom-ref": "6061ddf7c09f21ea", + "bom-ref": "93081b73d7402732", "name": "/usr/share/vim/vim91/ftplugin/wget.vim", "type": "file" }, { - "bom-ref": "b2a7b383a10521c7", + "bom-ref": "3ec6df1ce30cfdab", "name": "/usr/share/vim/vim91/ftplugin/wget2.vim", "type": "file" }, { - "bom-ref": "0e99efe337ae217c", + "bom-ref": "6287a80c5c330300", "name": "/usr/share/vim/vim91/ftplugin/xcompose.vim", "type": "file" }, { - "bom-ref": "15d165e315efd2bc", + "bom-ref": "d392643570c2a208", "name": "/usr/share/vim/vim91/ftplugin/xdefaults.vim", "type": "file" }, { - "bom-ref": "753af8ac7807f1dd", + "bom-ref": "c80547ddb5f151e1", "name": "/usr/share/vim/vim91/ftplugin/xf86conf.vim", "type": "file" }, { - "bom-ref": "279b129991946ca6", + "bom-ref": "8ecff80b1f65248e", "name": "/usr/share/vim/vim91/ftplugin/xhtml.vim", "type": "file" }, { - "bom-ref": "82b143e1da098fbc", + "bom-ref": "6a8220f482574f84", "name": "/usr/share/vim/vim91/ftplugin/xinetd.vim", "type": "file" }, { - "bom-ref": "4065d9239a0f8f03", + "bom-ref": "8265e39634964e03", "name": "/usr/share/vim/vim91/ftplugin/xml.vim", "type": "file" }, { - "bom-ref": "b747f65c86a5f26c", + "bom-ref": "66750d55bb7ec900", "name": "/usr/share/vim/vim91/ftplugin/xmodmap.vim", "type": "file" }, { - "bom-ref": "695879dc5f2f757c", + "bom-ref": "ce1a9d53d520796c", "name": "/usr/share/vim/vim91/ftplugin/xs.vim", "type": "file" }, { - "bom-ref": "af89c0e0d7754629", + "bom-ref": "c555b477afa41b59", "name": "/usr/share/vim/vim91/ftplugin/xsd.vim", "type": "file" }, { - "bom-ref": "7ae8c0335797d97e", + "bom-ref": "64b031dfe4129e32", "name": "/usr/share/vim/vim91/ftplugin/xslt.vim", "type": "file" }, { - "bom-ref": "678bd5ade031402f", + "bom-ref": "c4864bd03cc1ab4b", "name": "/usr/share/vim/vim91/ftplugin/yaml.vim", "type": "file" }, { - "bom-ref": "0675dac84a2e30d8", + "bom-ref": "e4ca0d3c14e26ba4", "name": "/usr/share/vim/vim91/ftplugin/zig.vim", "type": "file" }, { - "bom-ref": "587ada1d9ff1892f", + "bom-ref": "407d54c7bad49237", "name": "/usr/share/vim/vim91/ftplugin/zimbu.vim", "type": "file" }, { - "bom-ref": "f554790bd0f385d5", + "bom-ref": "3cfb68e638bec711", "name": "/usr/share/vim/vim91/ftplugin/zsh.vim", "type": "file" }, { - "bom-ref": "c8e07348875ed9b5", + "bom-ref": "8f573663c5eaeae5", "name": "/usr/share/vim/vim91/ftplugof.vim", "type": "file" }, { - "bom-ref": "87be81215202762a", + "bom-ref": "a03f409e86041346", "name": "/usr/share/vim/vim91/gvimrc_example.vim", "type": "file" }, { - "bom-ref": "239123909e44de86", + "bom-ref": "afd93e6db01ab542", "name": "/usr/share/vim/vim91/import/dist/vimhelp.vim", "type": "file" }, { - "bom-ref": "c9b7dbfb2833300d", + "bom-ref": "6ba29db6852ed2e9", "name": "/usr/share/vim/vim91/import/dist/vimhighlight.vim", "type": "file" }, { - "bom-ref": "8b9cc6b74484a865", + "bom-ref": "8d749c302b6de2a5", "name": "/usr/share/vim/vim91/indent.vim", "type": "file" }, { - "bom-ref": "c85345393e03e363", + "bom-ref": "ad141fa71d2da037", "name": "/usr/share/vim/vim91/indent/aap.vim", "type": "file" }, { - "bom-ref": "b86cc70a07a96dd1", + "bom-ref": "59e5bbe2a37ee255", "name": "/usr/share/vim/vim91/indent/ada.vim", "type": "file" }, { - "bom-ref": "fc6ae29a3d9f34fc", + "bom-ref": "0081082af1016b90", "name": "/usr/share/vim/vim91/indent/ant.vim", "type": "file" }, { - "bom-ref": "6b1dfd184d6583ad", + "bom-ref": "f2e34ebf0789b449", "name": "/usr/share/vim/vim91/indent/automake.vim", "type": "file" }, { - "bom-ref": "f80312b4a7d3daa0", + "bom-ref": "b3a00ef63ad308bc", "name": "/usr/share/vim/vim91/indent/awk.vim", "type": "file" }, { - "bom-ref": "7c9dfac6aa27cb41", + "bom-ref": "4cfb79f793327cf9", "name": "/usr/share/vim/vim91/indent/bash.vim", "type": "file" }, { - "bom-ref": "19b44b580a63d30a", + "bom-ref": "c8ed088f2a5153e2", "name": "/usr/share/vim/vim91/indent/basic.vim", "type": "file" }, { - "bom-ref": "eed540fb6470f81a", + "bom-ref": "9037d49d9eaf4732", "name": "/usr/share/vim/vim91/indent/bib.vim", "type": "file" }, { - "bom-ref": "27e6cd4df110a776", + "bom-ref": "f2e0e26ec1868bce", "name": "/usr/share/vim/vim91/indent/bitbake.vim", "type": "file" }, { - "bom-ref": "5ca59642d8929f76", + "bom-ref": "39297cc294de86ee", "name": "/usr/share/vim/vim91/indent/bst.vim", "type": "file" }, { - "bom-ref": "026e28e7d79f533b", + "bom-ref": "3c25fb105c5f568b", "name": "/usr/share/vim/vim91/indent/bzl.vim", "type": "file" }, { - "bom-ref": "f0e33524fc00e8a4", + "bom-ref": "7af860de2c56dfc0", "name": "/usr/share/vim/vim91/indent/c.vim", "type": "file" }, { - "bom-ref": "24eb18419c881932", + "bom-ref": "3f9dcefea0847b0a", "name": "/usr/share/vim/vim91/indent/cdl.vim", "type": "file" }, { - "bom-ref": "35caf784aa87dea7", + "bom-ref": "67e66741a176a4a3", "name": "/usr/share/vim/vim91/indent/ch.vim", "type": "file" }, { - "bom-ref": "d71113068935fe67", + "bom-ref": "2c49d0f8cc0091bf", "name": "/usr/share/vim/vim91/indent/chaiscript.vim", "type": "file" }, { - "bom-ref": "72f46df2837f652f", + "bom-ref": "9185e623fecacdc3", "name": "/usr/share/vim/vim91/indent/changelog.vim", "type": "file" }, { - "bom-ref": "81554fb4e5e8d6e1", + "bom-ref": "63849986687471b1", "name": "/usr/share/vim/vim91/indent/chatito.vim", "type": "file" }, { - "bom-ref": "fca307d8ff5e0e6b", + "bom-ref": "583ae9e6342252e7", "name": "/usr/share/vim/vim91/indent/clojure.vim", "type": "file" }, { - "bom-ref": "2825833b51becd0b", + "bom-ref": "820f42627bcb82a3", "name": "/usr/share/vim/vim91/indent/cmake.vim", "type": "file" }, { - "bom-ref": "0aed7e94c173d84a", + "bom-ref": "465f8b01fdd4324e", "name": "/usr/share/vim/vim91/indent/cobol.vim", "type": "file" }, { - "bom-ref": "78f13c62c0f980a8", + "bom-ref": "289b601d25bc1b50", "name": "/usr/share/vim/vim91/indent/config.vim", "type": "file" }, { - "bom-ref": "b84c30cc4f21e2ef", + "bom-ref": "1a68f7c427992eb7", "name": "/usr/share/vim/vim91/indent/context.vim", "type": "file" }, { - "bom-ref": "f1be5565f2036c2d", + "bom-ref": "ae8d6367aa07c8d5", "name": "/usr/share/vim/vim91/indent/cpp.vim", "type": "file" }, { - "bom-ref": "73aea979b2551d7a", + "bom-ref": "548b2a4655b660c6", "name": "/usr/share/vim/vim91/indent/cs.vim", "type": "file" }, { - "bom-ref": "aec98b5f8fb4e761", + "bom-ref": "7e551d41992030e5", "name": "/usr/share/vim/vim91/indent/css.vim", "type": "file" }, { - "bom-ref": "a8a4d42ce0169d39", + "bom-ref": "132406ebacf242cd", "name": "/usr/share/vim/vim91/indent/cucumber.vim", "type": "file" }, { - "bom-ref": "29d8493af4fa939a", + "bom-ref": "796728e70f6159aa", "name": "/usr/share/vim/vim91/indent/cuda.vim", "type": "file" }, { - "bom-ref": "a36e5b2915ef53c6", + "bom-ref": "7d9238e8f7fc90fe", "name": "/usr/share/vim/vim91/indent/d.vim", "type": "file" }, { - "bom-ref": "206b4ee48e783912", + "bom-ref": "f507b85c10c44baa", "name": "/usr/share/vim/vim91/indent/dictconf.vim", "type": "file" }, { - "bom-ref": "21f60a6c07574fe2", + "bom-ref": "176f3cc5659119d2", "name": "/usr/share/vim/vim91/indent/dictdconf.vim", "type": "file" }, { - "bom-ref": "64d7c2830f31a8b8", + "bom-ref": "0ab413ac8dfd8190", "name": "/usr/share/vim/vim91/indent/docbk.vim", "type": "file" }, { - "bom-ref": "e595ab291bfbd679", + "bom-ref": "4a4b0dc522bceea5", "name": "/usr/share/vim/vim91/indent/dosbatch.vim", "type": "file" }, { - "bom-ref": "8eebea4fd170a057", + "bom-ref": "da033e3deff95ddf", "name": "/usr/share/vim/vim91/indent/dtd.vim", "type": "file" }, { - "bom-ref": "3da2255279f25069", + "bom-ref": "c9d70a5b1c7c1fc9", "name": "/usr/share/vim/vim91/indent/dtrace.vim", "type": "file" }, { - "bom-ref": "9d7b8ba642636c27", + "bom-ref": "8d2458a393053693", "name": "/usr/share/vim/vim91/indent/dts.vim", "type": "file" }, { - "bom-ref": "e6eddd18ef2ae0ef", + "bom-ref": "631096dcb998e9bf", "name": "/usr/share/vim/vim91/indent/dune.vim", "type": "file" }, { - "bom-ref": "d378223dccc8d458", + "bom-ref": "ef29ec6e53bbb854", "name": "/usr/share/vim/vim91/indent/dylan.vim", "type": "file" }, { - "bom-ref": "2cc56a28abdd993e", + "bom-ref": "ce14153a4e8e152e", "name": "/usr/share/vim/vim91/indent/eiffel.vim", "type": "file" }, { - "bom-ref": "04881ae210ea3624", + "bom-ref": "a82a631554832940", "name": "/usr/share/vim/vim91/indent/elm.vim", "type": "file" }, { - "bom-ref": "b1309c75b61c8c62", + "bom-ref": "cd97f298b4f18a5a", "name": "/usr/share/vim/vim91/indent/erlang.vim", "type": "file" }, { - "bom-ref": "2b3379dd5348e51d", + "bom-ref": "3fc8330b8fce254d", "name": "/usr/share/vim/vim91/indent/eruby.vim", "type": "file" }, { - "bom-ref": "9e08d5521a431a23", + "bom-ref": "2f9c6a25fb83ffb7", "name": "/usr/share/vim/vim91/indent/eterm.vim", "type": "file" }, { - "bom-ref": "b75fd90acc3a7864", + "bom-ref": "cf385c895dd5dcc4", "name": "/usr/share/vim/vim91/indent/expect.vim", "type": "file" }, { - "bom-ref": "6f69c12b7a250fc4", + "bom-ref": "d63846b622c41f08", "name": "/usr/share/vim/vim91/indent/falcon.vim", "type": "file" }, { - "bom-ref": "e12bf83a47d31d35", + "bom-ref": "603291dba2d37aa1", "name": "/usr/share/vim/vim91/indent/fennel.vim", "type": "file" }, { - "bom-ref": "9b7f791d62fc3ced", + "bom-ref": "00ed0300dd5b3e49", "name": "/usr/share/vim/vim91/indent/fish.vim", "type": "file" }, { - "bom-ref": "187199e6087d2567", + "bom-ref": "3d4065b66a3bb42b", "name": "/usr/share/vim/vim91/indent/fortran.vim", "type": "file" }, { - "bom-ref": "610f020194206ca6", + "bom-ref": "c09d96c60f65cb92", "name": "/usr/share/vim/vim91/indent/framescript.vim", "type": "file" }, { - "bom-ref": "223432a4cf0bd1a5", + "bom-ref": "a8698b0b47d57a09", "name": "/usr/share/vim/vim91/indent/freebasic.vim", "type": "file" }, { - "bom-ref": "be021578e704c95b", + "bom-ref": "a3ca2b56e374c3bb", "name": "/usr/share/vim/vim91/indent/gdscript.vim", "type": "file" }, { - "bom-ref": "23643e94ad1f8c81", + "bom-ref": "8ef2831c34358171", "name": "/usr/share/vim/vim91/indent/gitconfig.vim", "type": "file" }, { - "bom-ref": "5d205e88d62e2bb9", + "bom-ref": "a5672a615db63b29", "name": "/usr/share/vim/vim91/indent/gitolite.vim", "type": "file" }, { - "bom-ref": "a6374c626418da34", + "bom-ref": "17405f32c9be1564", "name": "/usr/share/vim/vim91/indent/go.vim", "type": "file" }, { - "bom-ref": "271b28a7288dbfb7", + "bom-ref": "0e9a3c85b94da593", "name": "/usr/share/vim/vim91/indent/gyp.vim", "type": "file" }, { - "bom-ref": "3fe5b137bf69d15f", + "bom-ref": "e20df8701f231c9b", "name": "/usr/share/vim/vim91/indent/haml.vim", "type": "file" }, { - "bom-ref": "8b78b73f5083fa9d", + "bom-ref": "858542a6a5e50745", "name": "/usr/share/vim/vim91/indent/hamster.vim", "type": "file" }, { - "bom-ref": "cd7a256facce64a3", + "bom-ref": "6902c7dd0a3233ff", "name": "/usr/share/vim/vim91/indent/hare.vim", "type": "file" }, { - "bom-ref": "47c59a5352852aeb", + "bom-ref": "810272ad5ea4e31f", "name": "/usr/share/vim/vim91/indent/hog.vim", "type": "file" }, { - "bom-ref": "920a2f744f98c537", + "bom-ref": "4d4057f25b71886b", "name": "/usr/share/vim/vim91/indent/html.vim", "type": "file" }, { - "bom-ref": "3832f16dd181a42a", + "bom-ref": "b16c7de7c56179be", "name": "/usr/share/vim/vim91/indent/htmldjango.vim", "type": "file" }, { - "bom-ref": "3c6240c488b8f67c", + "bom-ref": "3a733eef4e3a697c", "name": "/usr/share/vim/vim91/indent/idlang.vim", "type": "file" }, { - "bom-ref": "23a34f01b10c25e7", + "bom-ref": "834f1c5d539e2a5b", "name": "/usr/share/vim/vim91/indent/ishd.vim", "type": "file" }, { - "bom-ref": "952e11cb7fac8290", + "bom-ref": "644c5e396f0fec10", "name": "/usr/share/vim/vim91/indent/j.vim", "type": "file" }, { - "bom-ref": "ee9ce205d65237d2", + "bom-ref": "902d8eac530ae0f2", "name": "/usr/share/vim/vim91/indent/java.vim", "type": "file" }, { - "bom-ref": "b5ab46231e1fe1e0", + "bom-ref": "046acc615c0e78ec", "name": "/usr/share/vim/vim91/indent/javascript.vim", "type": "file" }, { - "bom-ref": "f26bdb3dc552348c", + "bom-ref": "4d908d974af48918", "name": "/usr/share/vim/vim91/indent/javascriptreact.vim", "type": "file" }, { - "bom-ref": "517e21adbd4ebb5e", + "bom-ref": "953dce21858ce92e", "name": "/usr/share/vim/vim91/indent/json.vim", "type": "file" }, { - "bom-ref": "bca524fa52af7470", + "bom-ref": "5963f4089a4d5ce8", "name": "/usr/share/vim/vim91/indent/jsonc.vim", "type": "file" }, { - "bom-ref": "77ffbde67c6318b2", + "bom-ref": "526f508cc3b404de", "name": "/usr/share/vim/vim91/indent/jsp.vim", "type": "file" }, { - "bom-ref": "e4790f6b00891ff4", + "bom-ref": "a5ebaadf0536add8", "name": "/usr/share/vim/vim91/indent/julia.vim", "type": "file" }, { - "bom-ref": "ab5bbfddd266ffa4", + "bom-ref": "04e587f3960ae62c", "name": "/usr/share/vim/vim91/indent/kotlin.vim", "type": "file" }, { - "bom-ref": "774026d106b97f5a", + "bom-ref": "57841ffef87c072e", "name": "/usr/share/vim/vim91/indent/krl.vim", "type": "file" }, { - "bom-ref": "f1262512e23c5658", + "bom-ref": "0888a049ab8267a8", "name": "/usr/share/vim/vim91/indent/ld.vim", "type": "file" }, { - "bom-ref": "84cbfb1258480517", + "bom-ref": "5c19d2b8c79ec507", "name": "/usr/share/vim/vim91/indent/less.vim", "type": "file" }, { - "bom-ref": "5c09d356a9d6e5c5", + "bom-ref": "afb31dde69113825", "name": "/usr/share/vim/vim91/indent/lifelines.vim", "type": "file" }, { - "bom-ref": "6e1c5a0aa6348af7", + "bom-ref": "4933b08688e91ad7", "name": "/usr/share/vim/vim91/indent/liquid.vim", "type": "file" }, { - "bom-ref": "bb8c85c895be6d34", + "bom-ref": "8fe01a9d67236e14", "name": "/usr/share/vim/vim91/indent/lisp.vim", "type": "file" }, { - "bom-ref": "0075e6346a363251", + "bom-ref": "fced1ebc2b8b877d", "name": "/usr/share/vim/vim91/indent/livebook.vim", "type": "file" }, { - "bom-ref": "cd82573b72a61d51", + "bom-ref": "b9b6c2fa0533205d", "name": "/usr/share/vim/vim91/indent/logtalk.vim", "type": "file" }, { - "bom-ref": "dcce37b91db60279", + "bom-ref": "5d1386c6cbc673bd", "name": "/usr/share/vim/vim91/indent/lua.vim", "type": "file" }, { - "bom-ref": "e3c3fcef4802a7ea", + "bom-ref": "829350ea78238e9a", "name": "/usr/share/vim/vim91/indent/luau.vim", "type": "file" }, { - "bom-ref": "df1318ec0d2df5d7", + "bom-ref": "19eb62cf3ee323c3", "name": "/usr/share/vim/vim91/indent/mail.vim", "type": "file" }, { - "bom-ref": "48f4e678819bbd08", + "bom-ref": "253c906463e4dea8", "name": "/usr/share/vim/vim91/indent/make.vim", "type": "file" }, { - "bom-ref": "1410073c2407b716", + "bom-ref": "840436858c3d24ce", "name": "/usr/share/vim/vim91/indent/matlab.vim", "type": "file" }, { - "bom-ref": "5560409abc5a7c39", + "bom-ref": "a771ad06febfb379", "name": "/usr/share/vim/vim91/indent/meson.vim", "type": "file" }, { - "bom-ref": "2d4c1aa831c18e70", + "bom-ref": "613297917152db10", "name": "/usr/share/vim/vim91/indent/mf.vim", "type": "file" }, { - "bom-ref": "49b3b895a41d3914", + "bom-ref": "0ea3e43f68693ab4", "name": "/usr/share/vim/vim91/indent/mma.vim", "type": "file" }, { - "bom-ref": "d07854c470f462dd", + "bom-ref": "86827ca6de098af5", "name": "/usr/share/vim/vim91/indent/mp.vim", "type": "file" }, { - "bom-ref": "97770b5c6b5e7921", + "bom-ref": "891b48f8aabd8525", "name": "/usr/share/vim/vim91/indent/nginx.vim", "type": "file" }, { - "bom-ref": "69dfa7033067e74f", + "bom-ref": "756d545d0dd8cb9b", "name": "/usr/share/vim/vim91/indent/nsis.vim", "type": "file" }, { - "bom-ref": "b4e9c7154b065a35", + "bom-ref": "fbb8d1ca285fecf9", "name": "/usr/share/vim/vim91/indent/objc.vim", "type": "file" }, { - "bom-ref": "9e5bf8e7110bc18a", + "bom-ref": "e4ecdabf695d9a72", "name": "/usr/share/vim/vim91/indent/obse.vim", "type": "file" }, { - "bom-ref": "74008019252cfc32", + "bom-ref": "15ac3fa8c2cddea6", "name": "/usr/share/vim/vim91/indent/ocaml.vim", "type": "file" }, { - "bom-ref": "8c0ba9ebffb66a22", + "bom-ref": "d92f7d732fb307ca", "name": "/usr/share/vim/vim91/indent/occam.vim", "type": "file" }, { - "bom-ref": "95cd0ae1502e1eb2", + "bom-ref": "b02de0fa4f27d7ea", "name": "/usr/share/vim/vim91/indent/pascal.vim", "type": "file" }, { - "bom-ref": "c8f38de949b74475", + "bom-ref": "e022ffc268ef0265", "name": "/usr/share/vim/vim91/indent/perl.vim", "type": "file" }, { - "bom-ref": "97210cc0d15745d3", + "bom-ref": "d1343e75f90ba627", "name": "/usr/share/vim/vim91/indent/php.vim", "type": "file" }, { - "bom-ref": "630748bfaec5a0e8", + "bom-ref": "0c159f7351a2845c", "name": "/usr/share/vim/vim91/indent/postscr.vim", "type": "file" }, { - "bom-ref": "108cae95a37de5eb", + "bom-ref": "567cb8a64f1c27cf", "name": "/usr/share/vim/vim91/indent/pov.vim", "type": "file" }, { - "bom-ref": "2cfeeaaa21959194", + "bom-ref": "19269d917b814764", "name": "/usr/share/vim/vim91/indent/prolog.vim", "type": "file" }, { - "bom-ref": "4287cf2d28eb2796", + "bom-ref": "c74ee0075eab91fa", "name": "/usr/share/vim/vim91/indent/ps1.vim", "type": "file" }, { - "bom-ref": "68d9d3cb946b34c8", + "bom-ref": "2542d9f8369adaa4", "name": "/usr/share/vim/vim91/indent/pyrex.vim", "type": "file" }, { - "bom-ref": "b27fded4817cce19", + "bom-ref": "a5fb5769312dc3d1", "name": "/usr/share/vim/vim91/indent/python.vim", "type": "file" }, { - "bom-ref": "1b6a1dde75e53838", + "bom-ref": "787168e3b0ba8990", "name": "/usr/share/vim/vim91/indent/qb64.vim", "type": "file" }, { - "bom-ref": "e500fe3199eca99f", + "bom-ref": "c62ac6d4f5a4d557", "name": "/usr/share/vim/vim91/indent/qml.vim", "type": "file" }, { - "bom-ref": "e4539e2803391ac9", + "bom-ref": "1f29a940259870a1", "name": "/usr/share/vim/vim91/indent/quarto.vim", "type": "file" }, { - "bom-ref": "ba5d872afa861994", + "bom-ref": "3dc46ae541dd6e34", "name": "/usr/share/vim/vim91/indent/r.vim", "type": "file" }, { - "bom-ref": "181be9a35f0a0905", + "bom-ref": "7aebe3ded0f0b10d", "name": "/usr/share/vim/vim91/indent/racket.vim", "type": "file" }, { - "bom-ref": "3b0b4787bb575d1a", + "bom-ref": "a981998a68948d8a", "name": "/usr/share/vim/vim91/indent/raku.vim", "type": "file" }, { - "bom-ref": "31c9f2b85563a9a1", + "bom-ref": "eedea2b4e4284a71", "name": "/usr/share/vim/vim91/indent/raml.vim", "type": "file" }, { - "bom-ref": "4d603cd1d60fd8e8", + "bom-ref": "abcb773e3a0e53cc", "name": "/usr/share/vim/vim91/indent/rapid.vim", "type": "file" }, { - "bom-ref": "f27f9aede52619d5", + "bom-ref": "65d3d9c179fc0d79", "name": "/usr/share/vim/vim91/indent/readline.vim", "type": "file" }, { - "bom-ref": "2c79d9f362c80cfa", + "bom-ref": "b8fbce5b9246f9ba", "name": "/usr/share/vim/vim91/indent/rhelp.vim", "type": "file" }, { - "bom-ref": "09fe58f41c2cb90d", + "bom-ref": "4a9b7471559a01cd", "name": "/usr/share/vim/vim91/indent/rmd.vim", "type": "file" }, { - "bom-ref": "3eaa2737891ec81b", + "bom-ref": "8cc136053b47b897", "name": "/usr/share/vim/vim91/indent/rnoweb.vim", "type": "file" }, { - "bom-ref": "814775017df0ba61", + "bom-ref": "13f541251a017ef9", "name": "/usr/share/vim/vim91/indent/rpl.vim", "type": "file" }, { - "bom-ref": "e64e93a9c7ff062e", + "bom-ref": "04814e4db9b5dbfe", "name": "/usr/share/vim/vim91/indent/rrst.vim", "type": "file" }, { - "bom-ref": "d2fe88b8ff714e0c", + "bom-ref": "e69c9666a01af100", "name": "/usr/share/vim/vim91/indent/rst.vim", "type": "file" }, { - "bom-ref": "95087bb6bd78729f", + "bom-ref": "e9b4c11392a79013", "name": "/usr/share/vim/vim91/indent/ruby.vim", "type": "file" }, { - "bom-ref": "9a2285ba26aea144", + "bom-ref": "8ae4e43187179748", "name": "/usr/share/vim/vim91/indent/rust.vim", "type": "file" }, { - "bom-ref": "d1f545414b3b23e3", + "bom-ref": "f7fb6557c5ad831f", "name": "/usr/share/vim/vim91/indent/sas.vim", "type": "file" }, { - "bom-ref": "42ef3f8b549de3e6", + "bom-ref": "f20caa690051c85e", "name": "/usr/share/vim/vim91/indent/sass.vim", "type": "file" }, { - "bom-ref": "b3952ef0e0e51089", + "bom-ref": "e24d28d7eaa39d0d", "name": "/usr/share/vim/vim91/indent/scala.vim", "type": "file" }, { - "bom-ref": "3ab8e7c6459da2e7", + "bom-ref": "d5b29ef6468d5447", "name": "/usr/share/vim/vim91/indent/scheme.vim", "type": "file" }, { - "bom-ref": "97ee895dd22fae5d", + "bom-ref": "6bb3fc37d12d6bfd", "name": "/usr/share/vim/vim91/indent/scss.vim", "type": "file" }, { - "bom-ref": "1ac5cebd504fef83", + "bom-ref": "07e097f58a5784bb", "name": "/usr/share/vim/vim91/indent/sdl.vim", "type": "file" }, { - "bom-ref": "a9a863bdb7eea63e", + "bom-ref": "ccddd6193ee8347e", "name": "/usr/share/vim/vim91/indent/sh.vim", "type": "file" }, { - "bom-ref": "e6b227c212982977", + "bom-ref": "e36b7dd8afeab527", "name": "/usr/share/vim/vim91/indent/sml.vim", "type": "file" }, { - "bom-ref": "ebc6935f59d9b4e2", + "bom-ref": "70f91c02e3cd270e", "name": "/usr/share/vim/vim91/indent/solidity.vim", "type": "file" }, { - "bom-ref": "3e0664725b22890f", + "bom-ref": "aca57db50bc29dbb", "name": "/usr/share/vim/vim91/indent/sql.vim", "type": "file" }, { - "bom-ref": "89621cbb4b50ac70", + "bom-ref": "0411a4bb0f5ab644", "name": "/usr/share/vim/vim91/indent/sqlanywhere.vim", "type": "file" }, { - "bom-ref": "d3dc741ea8c5433c", + "bom-ref": "97dc40324053f530", "name": "/usr/share/vim/vim91/indent/sshconfig.vim", "type": "file" }, { - "bom-ref": "18179d3e5f716439", + "bom-ref": "8d3f9fc852073165", "name": "/usr/share/vim/vim91/indent/systemverilog.vim", "type": "file" }, { - "bom-ref": "575fe54371ae2d88", + "bom-ref": "7a98dfd8db5fcc80", "name": "/usr/share/vim/vim91/indent/tcl.vim", "type": "file" }, { - "bom-ref": "57001ba83e91cfaa", + "bom-ref": "691ba7cc486cbbda", "name": "/usr/share/vim/vim91/indent/tcsh.vim", "type": "file" }, { - "bom-ref": "4fdf5051ced3acc4", + "bom-ref": "356c1750ac8987cc", "name": "/usr/share/vim/vim91/indent/teraterm.vim", "type": "file" }, { - "bom-ref": "1947b5bade94dc28", + "bom-ref": "07066f12bfe2c084", "name": "/usr/share/vim/vim91/indent/tex.vim", "type": "file" }, { - "bom-ref": "8a05d9076bc38099", + "bom-ref": "fa5eb7dd43eeb045", "name": "/usr/share/vim/vim91/indent/tf.vim", "type": "file" }, { - "bom-ref": "1a74a6108cbd680b", + "bom-ref": "fb899ffdedb4eb6f", "name": "/usr/share/vim/vim91/indent/tilde.vim", "type": "file" }, { - "bom-ref": "f5701b9c1da2cef3", + "bom-ref": "ba75eef808e6b2ab", "name": "/usr/share/vim/vim91/indent/treetop.vim", "type": "file" }, { - "bom-ref": "c921e0c946697d72", + "bom-ref": "72455e6b8a06e596", "name": "/usr/share/vim/vim91/indent/typescript.vim", "type": "file" }, { - "bom-ref": "af988189818f73fd", + "bom-ref": "d4bb11d65b1d18d9", "name": "/usr/share/vim/vim91/indent/typescriptreact.vim", "type": "file" }, { - "bom-ref": "e84f3e234aa61c2a", + "bom-ref": "f171a19ad1696ad2", "name": "/usr/share/vim/vim91/indent/vb.vim", "type": "file" }, { - "bom-ref": "227bbbce9952851d", + "bom-ref": "a75a7e8e9bedeaed", "name": "/usr/share/vim/vim91/indent/verilog.vim", "type": "file" }, { - "bom-ref": "e182d122919a9f47", + "bom-ref": "0d9f33a52bcee3f7", "name": "/usr/share/vim/vim91/indent/vhdl.vim", "type": "file" }, { - "bom-ref": "dde501c65ad915fd", + "bom-ref": "fe25acafffd5dc85", "name": "/usr/share/vim/vim91/indent/vim.vim", "type": "file" }, { - "bom-ref": "6c140f683b6a2199", + "bom-ref": "e61eac17d19aa159", "name": "/usr/share/vim/vim91/indent/vroom.vim", "type": "file" }, { - "bom-ref": "5d78f7ce0d416fb0", + "bom-ref": "a84821482b99b138", "name": "/usr/share/vim/vim91/indent/vue.vim", "type": "file" }, { - "bom-ref": "23526d953ac3e167", + "bom-ref": "b838350691aab2c3", "name": "/usr/share/vim/vim91/indent/wat.vim", "type": "file" }, { - "bom-ref": "061bb79d3080b4a7", + "bom-ref": "8e4304773e1ce4c7", "name": "/usr/share/vim/vim91/indent/xf86conf.vim", "type": "file" }, { - "bom-ref": "a316b69261917df1", + "bom-ref": "17848774fda61b89", "name": "/usr/share/vim/vim91/indent/xhtml.vim", "type": "file" }, { - "bom-ref": "b29618604475a279", + "bom-ref": "2d9d513c3615001d", "name": "/usr/share/vim/vim91/indent/xinetd.vim", "type": "file" }, { - "bom-ref": "e67f33baf21a91d8", + "bom-ref": "d4c801c61172c880", "name": "/usr/share/vim/vim91/indent/xml.vim", "type": "file" }, { - "bom-ref": "efd4d894cebedc8b", + "bom-ref": "20e477b696053903", "name": "/usr/share/vim/vim91/indent/xsd.vim", "type": "file" }, { - "bom-ref": "4c1b50789aac32f0", + "bom-ref": "5ff5066b922600f8", "name": "/usr/share/vim/vim91/indent/xslt.vim", "type": "file" }, { - "bom-ref": "77993057ce641d4b", + "bom-ref": "4022e1be43d4163f", "name": "/usr/share/vim/vim91/indent/yacc.vim", "type": "file" }, { - "bom-ref": "0f0b7c0e9219b1fd", + "bom-ref": "ac4524a6e853f135", "name": "/usr/share/vim/vim91/indent/yaml.vim", "type": "file" }, { - "bom-ref": "e319ebcd40843632", + "bom-ref": "85fd45cd01472486", "name": "/usr/share/vim/vim91/indent/zig.vim", "type": "file" }, { - "bom-ref": "76eef964bf307ffc", + "bom-ref": "7da7c63b026128c4", "name": "/usr/share/vim/vim91/indent/zimbu.vim", "type": "file" }, { - "bom-ref": "016e3f70bd9bee10", + "bom-ref": "cbb2b9f1fa82bbec", "name": "/usr/share/vim/vim91/indent/zsh.vim", "type": "file" }, { - "bom-ref": "9b93193a6f03027a", + "bom-ref": "52aa18b7ddbd4282", "name": "/usr/share/vim/vim91/indoff.vim", "type": "file" }, { - "bom-ref": "d0058848a7d5d3eb", + "bom-ref": "2a1d7e39535f2527", "name": "/usr/share/vim/vim91/keymap/accents.vim", "type": "file" }, { - "bom-ref": "7b2be43c927bfa94", + "bom-ref": "9f236c08749bf87c", "name": "/usr/share/vim/vim91/keymap/arabic.vim", "type": "file" }, { - "bom-ref": "863ffbe32826fc43", + "bom-ref": "f40b9d93b21bb6ab", "name": "/usr/share/vim/vim91/keymap/arabic_utf-8.vim", "type": "file" }, { - "bom-ref": "00f40d286d50e31b", + "bom-ref": "2cceb2fe6078fc4f", "name": "/usr/share/vim/vim91/keymap/armenian-eastern_utf-8.vim", "type": "file" }, { - "bom-ref": "f5d8eb261e5cb647", + "bom-ref": "afe3e71f722aac3f", "name": "/usr/share/vim/vim91/keymap/armenian-western_utf-8.vim", "type": "file" }, { - "bom-ref": "1fe1ccdabd9da56b", + "bom-ref": "dce461a0ce8f0dfb", "name": "/usr/share/vim/vim91/keymap/belarusian-jcuken.vim", "type": "file" }, { - "bom-ref": "b384fd886e1c712d", + "bom-ref": "1289208be09e3b39", "name": "/usr/share/vim/vim91/keymap/bulgarian-bds.vim", "type": "file" }, { - "bom-ref": "54cf38cb35cc8c3d", + "bom-ref": "b59cbf4025967bad", "name": "/usr/share/vim/vim91/keymap/bulgarian-phonetic.vim", "type": "file" }, { - "bom-ref": "bb5fb232a2c5994a", + "bom-ref": "156b7418bf1e6216", "name": "/usr/share/vim/vim91/keymap/canfr-win.vim", "type": "file" }, { - "bom-ref": "c787dc8fbaf1db19", + "bom-ref": "debf42d2ab6a2795", "name": "/usr/share/vim/vim91/keymap/croatian.vim", "type": "file" }, { - "bom-ref": "48e684654b587c2c", + "bom-ref": "1921999cf982d260", "name": "/usr/share/vim/vim91/keymap/croatian_cp1250.vim", "type": "file" }, { - "bom-ref": "2a06db0ed8481ace", + "bom-ref": "029fc23634405e9e", "name": "/usr/share/vim/vim91/keymap/croatian_iso-8859-2.vim", "type": "file" }, { - "bom-ref": "38d05f9341c05336", + "bom-ref": "86f3478e73305b5a", "name": "/usr/share/vim/vim91/keymap/croatian_utf-8.vim", "type": "file" }, { - "bom-ref": "7018848870caf8d2", + "bom-ref": "26d04fc3eae50926", "name": "/usr/share/vim/vim91/keymap/czech.vim", "type": "file" }, { - "bom-ref": "2f610321ccb482e5", + "bom-ref": "98f375961f2276cd", "name": "/usr/share/vim/vim91/keymap/czech_utf-8.vim", "type": "file" }, { - "bom-ref": "eb839f4f6b0bebce", + "bom-ref": "f92b9bc391820eea", "name": "/usr/share/vim/vim91/keymap/dvorak.vim", "type": "file" }, { - "bom-ref": "77719d169c73a566", + "bom-ref": "44aa2879f700f9ee", "name": "/usr/share/vim/vim91/keymap/esperanto.vim", "type": "file" }, { - "bom-ref": "fe6b943315d452b2", + "bom-ref": "09e9cb4e3c637ce6", "name": "/usr/share/vim/vim91/keymap/esperanto_utf-8.vim", "type": "file" }, { - "bom-ref": "6d9fcc1bd13e3794", + "bom-ref": "31320f5f76745ba4", "name": "/usr/share/vim/vim91/keymap/french-azerty.vim", "type": "file" }, { - "bom-ref": "a4affc84bdf993ef", + "bom-ref": "03e1dafb5966f2df", "name": "/usr/share/vim/vim91/keymap/german-qwertz.vim", "type": "file" }, { - "bom-ref": "b5fa966b3672da95", + "bom-ref": "0eda7ae7053cdfc1", "name": "/usr/share/vim/vim91/keymap/greek.vim", "type": "file" }, { - "bom-ref": "8f201f686271b95e", + "bom-ref": "4303b4b20bd00c56", "name": "/usr/share/vim/vim91/keymap/greek_cp1253.vim", "type": "file" }, { - "bom-ref": "ed4734c298dbdf13", + "bom-ref": "651b96c629e3849b", "name": "/usr/share/vim/vim91/keymap/greek_cp737.vim", "type": "file" }, { - "bom-ref": "8f137963288dafa8", + "bom-ref": "8098e1e0bd1fbe1c", "name": "/usr/share/vim/vim91/keymap/greek_iso-8859-7.vim", "type": "file" }, { - "bom-ref": "97d34aa8537cce6f", + "bom-ref": "4e5e6cdda93a1c6b", "name": "/usr/share/vim/vim91/keymap/greek_utf-8.vim", "type": "file" }, { - "bom-ref": "368c8ba8222294be", + "bom-ref": "993ebb8933d555a6", "name": "/usr/share/vim/vim91/keymap/hebrew.vim", "type": "file" }, { - "bom-ref": "93e89238ef54b047", + "bom-ref": "54ac9ce8236937ff", "name": "/usr/share/vim/vim91/keymap/hebrew_cp1255.vim", "type": "file" }, { - "bom-ref": "507a23b86dbd856c", + "bom-ref": "b3c8d1f3e81e3cf0", "name": "/usr/share/vim/vim91/keymap/hebrew_iso-8859-8.vim", "type": "file" }, { - "bom-ref": "459b231ce38e192d", + "bom-ref": "36df814b7dce8325", "name": "/usr/share/vim/vim91/keymap/hebrew_utf-8.vim", "type": "file" }, { - "bom-ref": "bbe668c9924ff145", + "bom-ref": "5e49ca4333660851", "name": "/usr/share/vim/vim91/keymap/hebrewp.vim", "type": "file" }, { - "bom-ref": "04d6bd17cd6604d6", + "bom-ref": "6dfb966012ff133e", "name": "/usr/share/vim/vim91/keymap/hebrewp_cp1255.vim", "type": "file" }, { - "bom-ref": "55e1077a2c977089", + "bom-ref": "c09c8fe03fab8205", "name": "/usr/share/vim/vim91/keymap/hebrewp_iso-8859-8.vim", "type": "file" }, { - "bom-ref": "577d75ddec7962ae", + "bom-ref": "151fb19c813f828a", "name": "/usr/share/vim/vim91/keymap/hebrewp_utf-8.vim", "type": "file" }, { - "bom-ref": "52b660f9eb69ba3e", + "bom-ref": "9ca5d48eed9b04f6", "name": "/usr/share/vim/vim91/keymap/kana.vim", "type": "file" }, { - "bom-ref": "c09f8b853179c45d", + "bom-ref": "c43048185c4f7075", "name": "/usr/share/vim/vim91/keymap/kazakh-jcuken.vim", "type": "file" }, { - "bom-ref": "8f0c5c820d70a6cd", + "bom-ref": "1cc46ff6ce3e5bd5", "name": "/usr/share/vim/vim91/keymap/korean-dubeolsik_utf-8.vim", "type": "file" }, { - "bom-ref": "0af525c97bcec961", + "bom-ref": "2089c65402852f99", "name": "/usr/share/vim/vim91/keymap/korean.vim", "type": "file" }, { - "bom-ref": "2e7882e21790169e", + "bom-ref": "f3a4f902b6b545fa", "name": "/usr/share/vim/vim91/keymap/lithuanian-baltic.vim", "type": "file" }, { - "bom-ref": "6abf4dcca07e8063", + "bom-ref": "340959d1db70e027", "name": "/usr/share/vim/vim91/keymap/magyar_utf-8.vim", "type": "file" }, { - "bom-ref": "9220ddbc419e40b8", + "bom-ref": "d26ff741a341e0f8", "name": "/usr/share/vim/vim91/keymap/mongolian_utf-8.vim", "type": "file" }, { - "bom-ref": "ff168fdb56696089", + "bom-ref": "2210c0bd77dbd7ad", "name": "/usr/share/vim/vim91/keymap/oldturkic-orkhon_utf-8.vim", "type": "file" }, { - "bom-ref": "b0c1d0845188e665", + "bom-ref": "dfa8591b624f6ab9", "name": "/usr/share/vim/vim91/keymap/oldturkic-yenisei_utf-8.vim", "type": "file" }, { - "bom-ref": "b53fc6e70a31a8b1", + "bom-ref": "857926a11f89a14d", "name": "/usr/share/vim/vim91/keymap/persian-iranian_utf-8.vim", "type": "file" }, { - "bom-ref": "080756bcb875ec7e", + "bom-ref": "d92ab0e88db35666", "name": "/usr/share/vim/vim91/keymap/persian.vim", "type": "file" }, { - "bom-ref": "64115a8d359d1876", + "bom-ref": "9374c27e08613916", "name": "/usr/share/vim/vim91/keymap/pinyin.vim", "type": "file" }, { - "bom-ref": "7a07ac88e21beb0f", + "bom-ref": "e3f71d25bc8bbd67", "name": "/usr/share/vim/vim91/keymap/polish-slash.vim", "type": "file" }, { - "bom-ref": "6739c35f8837b954", + "bom-ref": "421283f2c0576a40", "name": "/usr/share/vim/vim91/keymap/polish-slash_cp1250.vim", "type": "file" }, { - "bom-ref": "1e076f1f73e3ef26", + "bom-ref": "7b805cf8452de6ce", "name": "/usr/share/vim/vim91/keymap/polish-slash_cp852.vim", "type": "file" }, { - "bom-ref": "e1901a25df867a0f", + "bom-ref": "fad47248d38e8693", "name": "/usr/share/vim/vim91/keymap/polish-slash_iso-8859-2.vim", "type": "file" }, { - "bom-ref": "872d2b080e069c01", + "bom-ref": "4436e7db4962bd29", "name": "/usr/share/vim/vim91/keymap/polish-slash_utf-8.vim", "type": "file" }, { - "bom-ref": "19411e54d31f1e85", + "bom-ref": "97b36684974b1321", "name": "/usr/share/vim/vim91/keymap/russian-dvorak.vim", "type": "file" }, { - "bom-ref": "5e3de25833d6ef10", + "bom-ref": "fe783e4625300c1c", "name": "/usr/share/vim/vim91/keymap/russian-jcuken.vim", "type": "file" }, { - "bom-ref": "76cdda849e6a8de1", + "bom-ref": "6a1382be688ff579", "name": "/usr/share/vim/vim91/keymap/russian-jcukenmac.vim", "type": "file" }, { - "bom-ref": "a358ffdf3cc3491c", + "bom-ref": "1b8b83ea8030a6f0", "name": "/usr/share/vim/vim91/keymap/russian-jcukenwin.vim", "type": "file" }, { - "bom-ref": "ec2898d670f068b2", + "bom-ref": "4a245cf253013812", "name": "/usr/share/vim/vim91/keymap/russian-jcukenwintype.vim", "type": "file" }, { - "bom-ref": "ecebae0dac35b0a5", + "bom-ref": "0748fd185886d83d", "name": "/usr/share/vim/vim91/keymap/russian-typograph.vim", "type": "file" }, { - "bom-ref": "25071b2c07a127e7", + "bom-ref": "03e81c7e05ea5147", "name": "/usr/share/vim/vim91/keymap/russian-yawerty.vim", "type": "file" }, { - "bom-ref": "7d321637b051b292", + "bom-ref": "c678b7da50662796", "name": "/usr/share/vim/vim91/keymap/serbian-latin.vim", "type": "file" }, { - "bom-ref": "c5f5f22a224da112", + "bom-ref": "f164c229e89618d6", "name": "/usr/share/vim/vim91/keymap/serbian-latin_utf-8.vim", "type": "file" }, { - "bom-ref": "dec3f09358c70e32", + "bom-ref": "8e0cba0656903942", "name": "/usr/share/vim/vim91/keymap/serbian.vim", "type": "file" }, { - "bom-ref": "79fc15f3c6a019e8", + "bom-ref": "28be13b49dfe30d4", "name": "/usr/share/vim/vim91/keymap/serbian_cp1250.vim", "type": "file" }, { - "bom-ref": "eb8a46a9bb8da44d", + "bom-ref": "8ddc80bf2693c429", "name": "/usr/share/vim/vim91/keymap/serbian_cp1251.vim", "type": "file" }, { - "bom-ref": "2754ec7b63637293", + "bom-ref": "3513d2eeed9344ef", "name": "/usr/share/vim/vim91/keymap/serbian_iso-8859-2.vim", "type": "file" }, { - "bom-ref": "e94df29f6cefbda9", + "bom-ref": "499636206f1cc349", "name": "/usr/share/vim/vim91/keymap/serbian_iso-8859-5.vim", "type": "file" }, { - "bom-ref": "ae5d675abbf87092", + "bom-ref": "0632e3eb2c98d556", "name": "/usr/share/vim/vim91/keymap/serbian_utf-8.vim", "type": "file" }, { - "bom-ref": "e829cd32e324f420", + "bom-ref": "26598cc60823bdc4", "name": "/usr/share/vim/vim91/keymap/sinhala-phonetic_utf-8.vim", "type": "file" }, { - "bom-ref": "db54f0e969087eef", + "bom-ref": "df819da3264baa2b", "name": "/usr/share/vim/vim91/keymap/sinhala.vim", "type": "file" }, { - "bom-ref": "ff74f96dcbfecd6f", + "bom-ref": "773bbac51f0beaa7", "name": "/usr/share/vim/vim91/keymap/slovak.vim", "type": "file" }, { - "bom-ref": "e3d9accb8a4e50ce", + "bom-ref": "ab967b97f2e6bef6", "name": "/usr/share/vim/vim91/keymap/slovak_cp1250.vim", "type": "file" }, { - "bom-ref": "0f56acb53c3ee648", + "bom-ref": "8c0000745cc00fd0", "name": "/usr/share/vim/vim91/keymap/slovak_iso-8859-2.vim", "type": "file" }, { - "bom-ref": "5a1ba436ffea5078", + "bom-ref": "cdd7cd4885737398", "name": "/usr/share/vim/vim91/keymap/slovak_utf-8.vim", "type": "file" }, { - "bom-ref": "9b8ec791b1ecf672", + "bom-ref": "edaf96e71bb09482", "name": "/usr/share/vim/vim91/keymap/tamil_tscii.vim", "type": "file" }, { - "bom-ref": "1039b7c68ba6eebd", + "bom-ref": "d38accb93fbd7499", "name": "/usr/share/vim/vim91/keymap/thaana-phonetic_utf-8.vim", "type": "file" }, { - "bom-ref": "363b860a39dba035", + "bom-ref": "5cc431b7dd9d90d9", "name": "/usr/share/vim/vim91/keymap/thaana.vim", "type": "file" }, { - "bom-ref": "5fd85ad320845b80", + "bom-ref": "eb6f4bca8911d630", "name": "/usr/share/vim/vim91/keymap/turkish-f.vim", "type": "file" }, { - "bom-ref": "ce0ccfde1d507bc2", + "bom-ref": "54c26e56f6fc6336", "name": "/usr/share/vim/vim91/keymap/turkish-q.vim", "type": "file" }, { - "bom-ref": "7447ee578a91c896", + "bom-ref": "9be585fd34c698e6", "name": "/usr/share/vim/vim91/keymap/ukrainian-dvorak.vim", "type": "file" }, { - "bom-ref": "97044e3760b20c1c", + "bom-ref": "7f463352c941dbf8", "name": "/usr/share/vim/vim91/keymap/ukrainian-jcuken.vim", "type": "file" }, { - "bom-ref": "bcf8b284ed7af621", + "bom-ref": "a8ab7391d170e321", "name": "/usr/share/vim/vim91/keymap/vietnamese-telex_utf-8.vim", "type": "file" }, { - "bom-ref": "394399a8c56ebec2", + "bom-ref": "98f89f3c51c4f73a", "name": "/usr/share/vim/vim91/keymap/vietnamese-viqr_utf-8.vim", "type": "file" }, { - "bom-ref": "3be171c0e3ab8247", + "bom-ref": "dea61e71ea87746f", "name": "/usr/share/vim/vim91/keymap/vietnamese-vni_utf-8.vim", "type": "file" }, { - "bom-ref": "2232311b65118916", + "bom-ref": "ae76cffaf69ef0f2", "name": "/usr/share/vim/vim91/lang/af/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "dcc644c5b7d9fb01", + "bom-ref": "e99939431a5c8ead", "name": "/usr/share/vim/vim91/lang/ca/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "df03d31295423e23", + "bom-ref": "886e9181b93ee06f", "name": "/usr/share/vim/vim91/lang/cs.cp1250/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "fa511e63afccc8ee", + "bom-ref": "9bea1a04b7b16c7a", "name": "/usr/share/vim/vim91/lang/cs/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "e948ecdf414a503f", + "bom-ref": "3c69ee56b5c8d0eb", "name": "/usr/share/vim/vim91/lang/da/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "dea090df8bf1841a", + "bom-ref": "0cd1d6f4d03be176", "name": "/usr/share/vim/vim91/lang/de/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "2cf85455ffdbb30b", + "bom-ref": "4db3da84159aeb8b", "name": "/usr/share/vim/vim91/lang/en_GB/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "d3ec344dadb663ef", + "bom-ref": "3d40c59d5a4268cf", "name": "/usr/share/vim/vim91/lang/eo/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "52f4b8565dd300ba", + "bom-ref": "2326cdb7ed8d92ca", "name": "/usr/share/vim/vim91/lang/es/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "1e558a2825a0cd98", + "bom-ref": "e76c40a8facba2ec", "name": "/usr/share/vim/vim91/lang/fi/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "52a11e523013a8a0", + "bom-ref": "ab6b0aeeacc2f84c", "name": "/usr/share/vim/vim91/lang/fr/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "3e82cbca817adcdf", + "bom-ref": "1dc3fe5e2672d543", "name": "/usr/share/vim/vim91/lang/ga/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "e0c05f3f24154090", + "bom-ref": "289d0dfe5581fa14", "name": "/usr/share/vim/vim91/lang/hu/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "b7e2fbe1280b108f", + "bom-ref": "4f46dc59242400a7", "name": "/usr/share/vim/vim91/lang/it/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "5dd47616a28e45dc", + "bom-ref": "da89ce0f36f6e838", "name": "/usr/share/vim/vim91/lang/ja.euc-jp/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "25664248cff0e41d", + "bom-ref": "08c71c522845b041", "name": "/usr/share/vim/vim91/lang/ja.sjis/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "83488381e3b6d055", + "bom-ref": "9f0876cf3281d525", "name": "/usr/share/vim/vim91/lang/ja/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "b5fa153e57ddc9a3", + "bom-ref": "0b7f2fcde1e507d7", "name": "/usr/share/vim/vim91/lang/ko.UTF-8/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "22d0a9802e24ea92", + "bom-ref": "97bb9d9d747f53ce", "name": "/usr/share/vim/vim91/lang/ko/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "ca41f36caf3635d9", + "bom-ref": "87fed85375613555", "name": "/usr/share/vim/vim91/lang/lv/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "354636d1883fa747", + "bom-ref": "9589af711a3faae3", "name": "/usr/share/vim/vim91/lang/menu_af.latin1.vim", "type": "file" }, { - "bom-ref": "2730b6363e13ed21", + "bom-ref": "ee6fde3837ffb1f1", "name": "/usr/share/vim/vim91/lang/menu_af.utf-8.vim", "type": "file" }, { - "bom-ref": "31beca5a6347bc4f", + "bom-ref": "12b1bf1cab6e33c7", "name": "/usr/share/vim/vim91/lang/menu_af_af.latin1.vim", "type": "file" }, { - "bom-ref": "3388926bf8cffd4d", + "bom-ref": "809467f6798471c1", "name": "/usr/share/vim/vim91/lang/menu_af_af.utf-8.vim", "type": "file" }, { - "bom-ref": "aec6bf21c6f7ad34", + "bom-ref": "17d4e3f89bc48b08", "name": "/usr/share/vim/vim91/lang/menu_ca.latin1.vim", "type": "file" }, { - "bom-ref": "c5423cf7c5de0c20", + "bom-ref": "75ef2978cf69e94c", "name": "/usr/share/vim/vim91/lang/menu_ca.utf-8.vim", "type": "file" }, { - "bom-ref": "33f4ed5ffffebd2a", + "bom-ref": "826eaff8e4ae784a", "name": "/usr/share/vim/vim91/lang/menu_ca_es.latin1.vim", "type": "file" }, { - "bom-ref": "9b8c1a802f163e84", + "bom-ref": "b05a2483674e2540", "name": "/usr/share/vim/vim91/lang/menu_ca_es.utf-8.vim", "type": "file" }, { - "bom-ref": "7861e0ec6e12da9d", + "bom-ref": "d4e3f7c32df79595", "name": "/usr/share/vim/vim91/lang/menu_chinese(gb)_gb.936.vim", "type": "file" }, { - "bom-ref": "f555b3e50a57f95a", + "bom-ref": "1a1727be5f9c529e", "name": "/usr/share/vim/vim91/lang/menu_chinese(taiwan)_taiwan.950.vim", "type": "file" }, { - "bom-ref": "4a787bce2e632c5b", + "bom-ref": "420a7fec3217cf77", "name": "/usr/share/vim/vim91/lang/menu_chinese_gb.936.vim", "type": "file" }, { - "bom-ref": "6ca1f4992c823b36", + "bom-ref": "6ce695352d13b7de", "name": "/usr/share/vim/vim91/lang/menu_chinese_taiwan.950.vim", "type": "file" }, { - "bom-ref": "44cf302be63bbe7d", + "bom-ref": "458b19c800072571", "name": "/usr/share/vim/vim91/lang/menu_cs.cp1250.vim", "type": "file" }, { - "bom-ref": "e80d2c2ee6d05b3b", + "bom-ref": "f11bbdc029ae878b", "name": "/usr/share/vim/vim91/lang/menu_cs.latin1.vim", "type": "file" }, { - "bom-ref": "ae67858d4a7cd273", + "bom-ref": "a2f064aab81c66df", "name": "/usr/share/vim/vim91/lang/menu_cs_cz.cp1250.vim", "type": "file" }, { - "bom-ref": "c6f0ac2c86115683", + "bom-ref": "612e2fadb9d8963b", "name": "/usr/share/vim/vim91/lang/menu_cs_cz.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "83d9f302bb2da854", + "bom-ref": "8dab7d650118850c", "name": "/usr/share/vim/vim91/lang/menu_cs_cz.latin1.vim", "type": "file" }, { - "bom-ref": "f1e15a2e10008aee", + "bom-ref": "52711f5624c7cdd2", "name": "/usr/share/vim/vim91/lang/menu_cs_cz.utf-8.vim", "type": "file" }, { - "bom-ref": "31a7bedd63b88aa4", + "bom-ref": "e1ba5f9b5d700060", "name": "/usr/share/vim/vim91/lang/menu_czech_czech_republic.1250.vim", "type": "file" }, { - "bom-ref": "053f9cbb43948b55", + "bom-ref": "44d50858969ece15", "name": "/usr/share/vim/vim91/lang/menu_czech_czech_republic.1252.vim", "type": "file" }, { - "bom-ref": "5ebcfec627bfdb11", + "bom-ref": "46e219e87b3cfd05", "name": "/usr/share/vim/vim91/lang/menu_czech_czech_republic.ascii.vim", "type": "file" }, { - "bom-ref": "98f322dca975b62f", + "bom-ref": "b9799ea9cdda44a3", "name": "/usr/share/vim/vim91/lang/menu_da.latin1.vim", "type": "file" }, { - "bom-ref": "e0ad8cdb66c4dc5f", + "bom-ref": "c5fd07ab4a19e707", "name": "/usr/share/vim/vim91/lang/menu_da.utf-8.vim", "type": "file" }, { - "bom-ref": "a7e51ca80880716a", + "bom-ref": "8315f1c7665d0a3e", "name": "/usr/share/vim/vim91/lang/menu_de.latin1.vim", "type": "file" }, { - "bom-ref": "1904215763b34ed5", + "bom-ref": "d702cdbdbea3be8d", "name": "/usr/share/vim/vim91/lang/menu_de.utf-8.vim", "type": "file" }, { - "bom-ref": "9966a1d414ecf445", + "bom-ref": "37c8fb788702033d", "name": "/usr/share/vim/vim91/lang/menu_de_de.latin1.vim", "type": "file" }, { - "bom-ref": "6284078d8548fcdc", + "bom-ref": "1b92546983a70ddc", "name": "/usr/share/vim/vim91/lang/menu_de_de.utf-8.vim", "type": "file" }, { - "bom-ref": "3dd99f547dd35ed4", + "bom-ref": "3372c864d07fa350", "name": "/usr/share/vim/vim91/lang/menu_en_gb.latin1.vim", "type": "file" }, { - "bom-ref": "4d8337294ccf2ac5", + "bom-ref": "eba33c38fdf07b45", "name": "/usr/share/vim/vim91/lang/menu_en_gb.utf-8.vim", "type": "file" }, { - "bom-ref": "4923df897555a978", + "bom-ref": "f0d51f03090d15dc", "name": "/usr/share/vim/vim91/lang/menu_english_united_kingdom.1252.vim", "type": "file" }, { - "bom-ref": "3887ffd5d821f5d1", + "bom-ref": "46209c89bfdf11e1", "name": "/usr/share/vim/vim91/lang/menu_english_united_kingdom.ascii.vim", "type": "file" }, { - "bom-ref": "e1fba190b4a2ae22", + "bom-ref": "dcd35e18385aa34a", "name": "/usr/share/vim/vim91/lang/menu_eo.utf-8.vim", "type": "file" }, { - "bom-ref": "aed8e8ce1a288aa8", + "bom-ref": "87d1bc4e903a4e1c", "name": "/usr/share/vim/vim91/lang/menu_eo_eo.utf-8.vim", "type": "file" }, { - "bom-ref": "3854315cc45f4893", + "bom-ref": "52b103ea0bf5979f", "name": "/usr/share/vim/vim91/lang/menu_eo_xx.utf-8.vim", "type": "file" }, { - "bom-ref": "108bce2b611ea5ed", + "bom-ref": "bffc7a0034a22601", "name": "/usr/share/vim/vim91/lang/menu_es.latin1.vim", "type": "file" }, { - "bom-ref": "8e87fc22d1be49f5", + "bom-ref": "f6c632675c5fd6ed", "name": "/usr/share/vim/vim91/lang/menu_es.utf-8.vim", "type": "file" }, { - "bom-ref": "f30627b62bc0ab4e", + "bom-ref": "a53eb679bdb65d06", "name": "/usr/share/vim/vim91/lang/menu_es_es.latin1.vim", "type": "file" }, { - "bom-ref": "a2a93fba1e859588", + "bom-ref": "89591fab82284840", "name": "/usr/share/vim/vim91/lang/menu_es_es.utf-8.vim", "type": "file" }, { - "bom-ref": "5d4fed081d18f5f7", + "bom-ref": "0175a658452a5923", "name": "/usr/share/vim/vim91/lang/menu_fi.latin1.vim", "type": "file" }, { - "bom-ref": "fd51ee919463807a", + "bom-ref": "1405737ac5ba5b42", "name": "/usr/share/vim/vim91/lang/menu_fi.utf-8.vim", "type": "file" }, { - "bom-ref": "10c459c5558d2b0b", + "bom-ref": "1f65284235f86f8b", "name": "/usr/share/vim/vim91/lang/menu_fi_fi.latin1.vim", "type": "file" }, { - "bom-ref": "0124ffce9ea2a5e9", + "bom-ref": "49befa1be4bf4c2d", "name": "/usr/share/vim/vim91/lang/menu_fi_fi.utf-8.vim", "type": "file" }, { - "bom-ref": "fd7aa82f33a1c56c", + "bom-ref": "c12345f35188ba90", "name": "/usr/share/vim/vim91/lang/menu_finnish_finland.1252.vim", "type": "file" }, { - "bom-ref": "18391df27febbc1c", + "bom-ref": "4d75fe6ff5654778", "name": "/usr/share/vim/vim91/lang/menu_fr.latin1.vim", "type": "file" }, { - "bom-ref": "846ab632524956b4", + "bom-ref": "54e7ea3489cac580", "name": "/usr/share/vim/vim91/lang/menu_fr.utf-8.vim", "type": "file" }, { - "bom-ref": "ab32ba8076c8c2e8", + "bom-ref": "08ac7b30f58ad200", "name": "/usr/share/vim/vim91/lang/menu_fr_fr.latin1.vim", "type": "file" }, { - "bom-ref": "50c6386bcabb1153", + "bom-ref": "181fb73ed02b21cb", "name": "/usr/share/vim/vim91/lang/menu_fr_fr.utf-8.vim", "type": "file" }, { - "bom-ref": "c6db1078d08e9a43", + "bom-ref": "69988fc2d4a37947", "name": "/usr/share/vim/vim91/lang/menu_french_france.1252.vim", "type": "file" }, { - "bom-ref": "9a242d28dd658360", + "bom-ref": "8ec949a19aeb96d8", "name": "/usr/share/vim/vim91/lang/menu_german_germany.1252.vim", "type": "file" }, { - "bom-ref": "9925f72551e8b840", + "bom-ref": "cb0a4ffd0846df2c", "name": "/usr/share/vim/vim91/lang/menu_hu.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "9c90e2d08ef73a5b", + "bom-ref": "95c376ea8769e68b", "name": "/usr/share/vim/vim91/lang/menu_hu.utf-8.vim", "type": "file" }, { - "bom-ref": "cb08a47e5087e4df", + "bom-ref": "3edc8b4eef7dddbf", "name": "/usr/share/vim/vim91/lang/menu_hu_hu.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "e695ba335b0be39e", + "bom-ref": "d618dd3c1a66f26e", "name": "/usr/share/vim/vim91/lang/menu_hu_hu.utf-8.vim", "type": "file" }, { - "bom-ref": "d4320ef464be740a", + "bom-ref": "7876e3afdaac5e52", "name": "/usr/share/vim/vim91/lang/menu_is.latin1.vim", "type": "file" }, { - "bom-ref": "abcb41bf4933f0af", + "bom-ref": "c93d2f953351eedb", "name": "/usr/share/vim/vim91/lang/menu_is.utf-8.vim", "type": "file" }, { - "bom-ref": "b802b7deddcb8ebf", + "bom-ref": "d9497d33970a5f2f", "name": "/usr/share/vim/vim91/lang/menu_is_is.latin1.vim", "type": "file" }, { - "bom-ref": "2ce9fb9d61c837e3", + "bom-ref": "6ed58a8b0e7e88bf", "name": "/usr/share/vim/vim91/lang/menu_is_is.utf-8.vim", "type": "file" }, { - "bom-ref": "740ca6c8cc4f644f", + "bom-ref": "7e7db1671b4c50bf", "name": "/usr/share/vim/vim91/lang/menu_it.latin1.vim", "type": "file" }, { - "bom-ref": "53f8b8ac58b32cb4", + "bom-ref": "f110abf20ab9c0f4", "name": "/usr/share/vim/vim91/lang/menu_it.utf-8.vim", "type": "file" }, { - "bom-ref": "5ad15e5090e79ee3", + "bom-ref": "f1648f8866607dbb", "name": "/usr/share/vim/vim91/lang/menu_it_it.latin1.vim", "type": "file" }, { - "bom-ref": "a0f731d12911414e", + "bom-ref": "98940d39a4237f1a", "name": "/usr/share/vim/vim91/lang/menu_it_it.utf-8.vim", "type": "file" }, { - "bom-ref": "8589f4eb448c7ac7", + "bom-ref": "9bd3af819a607587", "name": "/usr/share/vim/vim91/lang/menu_italian_italy.1252.vim", "type": "file" }, { - "bom-ref": "de2937408554ade3", + "bom-ref": "6f3f560032c35b7b", "name": "/usr/share/vim/vim91/lang/menu_ja.cp932.vim", "type": "file" }, { - "bom-ref": "69df157ec65ab585", + "bom-ref": "f392d8fc86c83a09", "name": "/usr/share/vim/vim91/lang/menu_ja.euc-jp.vim", "type": "file" }, { - "bom-ref": "931d470cb0f9fb72", + "bom-ref": "90e981c4a0f10e8a", "name": "/usr/share/vim/vim91/lang/menu_ja.eucjp.vim", "type": "file" }, { - "bom-ref": "569f5e3148c055ab", + "bom-ref": "c782590702565a3b", "name": "/usr/share/vim/vim91/lang/menu_ja.ujis.vim", "type": "file" }, { - "bom-ref": "040739a426c44fc9", + "bom-ref": "5ff07e53969fa901", "name": "/usr/share/vim/vim91/lang/menu_ja.utf-8.vim", "type": "file" }, { - "bom-ref": "fe0266020420dd94", + "bom-ref": "2f8ade3a2413e0c8", "name": "/usr/share/vim/vim91/lang/menu_ja_jp.cp932.vim", "type": "file" }, { - "bom-ref": "9ff4435bb9cd462d", + "bom-ref": "71513c37b3da3605", "name": "/usr/share/vim/vim91/lang/menu_ja_jp.euc-jp.vim", "type": "file" }, { - "bom-ref": "5fb14db66c105f1c", + "bom-ref": "aed17fced887d69c", "name": "/usr/share/vim/vim91/lang/menu_ja_jp.eucjp.vim", "type": "file" }, { - "bom-ref": "e35d0167a28c8b18", + "bom-ref": "6965a1a740de1bf8", "name": "/usr/share/vim/vim91/lang/menu_ja_jp.ujis.vim", "type": "file" }, { - "bom-ref": "40a4cf4789be4f15", + "bom-ref": "f4a5426a47cc3c99", "name": "/usr/share/vim/vim91/lang/menu_ja_jp.utf-8.vim", "type": "file" }, { - "bom-ref": "f1d4e33a71e2bbd9", + "bom-ref": "cd3a1c1bc0ed3069", "name": "/usr/share/vim/vim91/lang/menu_japanese_japan.932.vim", "type": "file" }, { - "bom-ref": "e91aa4ed9c127caf", + "bom-ref": "cff664efb4116a67", "name": "/usr/share/vim/vim91/lang/menu_ko.utf-8.vim", "type": "file" }, { - "bom-ref": "4aeb3300d20b56b3", + "bom-ref": "d4f37f68dc40b1df", "name": "/usr/share/vim/vim91/lang/menu_ko_kr.euckr.vim", "type": "file" }, { - "bom-ref": "eaf9d0f3b0f8d736", + "bom-ref": "5e0952b3af7e3142", "name": "/usr/share/vim/vim91/lang/menu_ko_kr.utf-8.vim", "type": "file" }, { - "bom-ref": "51f94aa96cd7a9db", + "bom-ref": "2fc5fd9c9d8d5a83", "name": "/usr/share/vim/vim91/lang/menu_ko_kr.vim", "type": "file" }, { - "bom-ref": "b667e542c228f307", + "bom-ref": "6ddfab9a37cf07cf", "name": "/usr/share/vim/vim91/lang/menu_nl.latin1.vim", "type": "file" }, { - "bom-ref": "115ba032c6d4b4dc", + "bom-ref": "3c633d8539509590", "name": "/usr/share/vim/vim91/lang/menu_nl.utf-8.vim", "type": "file" }, { - "bom-ref": "10912f1642908f91", + "bom-ref": "2903efb144026abd", "name": "/usr/share/vim/vim91/lang/menu_nl_nl.latin1.vim", "type": "file" }, { - "bom-ref": "f01588c3ebbb1a0f", + "bom-ref": "071a54f6a0e6372b", "name": "/usr/share/vim/vim91/lang/menu_nl_nl.utf-8.vim", "type": "file" }, { - "bom-ref": "1b0c98c830d206db", + "bom-ref": "3be43d060f880707", "name": "/usr/share/vim/vim91/lang/menu_no.latin1.vim", "type": "file" }, { - "bom-ref": "20f41118e40c00eb", + "bom-ref": "8706b7fe4d7698c3", "name": "/usr/share/vim/vim91/lang/menu_no.utf-8.vim", "type": "file" }, { - "bom-ref": "5226656827b8afee", + "bom-ref": "6cd17933e1424bfe", "name": "/usr/share/vim/vim91/lang/menu_no_no.latin1.vim", "type": "file" }, { - "bom-ref": "2c88a474f478f278", + "bom-ref": "89067d8c8dedcb54", "name": "/usr/share/vim/vim91/lang/menu_no_no.utf-8.vim", "type": "file" }, { - "bom-ref": "c046fc8c8a3c0bec", + "bom-ref": "b23ffc5bb7173468", "name": "/usr/share/vim/vim91/lang/menu_pl.cp1250.vim", "type": "file" }, { - "bom-ref": "9a4a2e4c3e6476a5", + "bom-ref": "1f3726956afe5875", "name": "/usr/share/vim/vim91/lang/menu_pl_pl.cp1250.vim", "type": "file" }, { - "bom-ref": "4543f4372f47bfdf", + "bom-ref": "9f9cf3bb58d418a3", "name": "/usr/share/vim/vim91/lang/menu_pl_pl.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "6026bc4ae6e79357", + "bom-ref": "d714c147c17042a7", "name": "/usr/share/vim/vim91/lang/menu_pl_pl.utf-8.vim", "type": "file" }, { - "bom-ref": "10f6dae860d21a3c", + "bom-ref": "27918d4e50854cdc", "name": "/usr/share/vim/vim91/lang/menu_polish_poland.1250.vim", "type": "file" }, { - "bom-ref": "3a93565eeddb4427", + "bom-ref": "aad857c27dd18f5f", "name": "/usr/share/vim/vim91/lang/menu_pt_br.latin1.vim", "type": "file" }, { - "bom-ref": "b53696dd167e1be2", + "bom-ref": "e1ad6d8d8e8528ea", "name": "/usr/share/vim/vim91/lang/menu_pt_br.utf-8.vim", "type": "file" }, { - "bom-ref": "d3ae46f5ae5ac37c", + "bom-ref": "d2ff019a09213620", "name": "/usr/share/vim/vim91/lang/menu_pt_br.vim", "type": "file" }, { - "bom-ref": "996ba2474102a43d", + "bom-ref": "c8539576de734641", "name": "/usr/share/vim/vim91/lang/menu_pt_pt.latin1.vim", "type": "file" }, { - "bom-ref": "2f94cc782dd6b6ab", + "bom-ref": "20aca324e3fd253b", "name": "/usr/share/vim/vim91/lang/menu_pt_pt.utf-8.vim", "type": "file" }, { - "bom-ref": "83945ae965c9de27", + "bom-ref": "0186bdaf63acf2e7", "name": "/usr/share/vim/vim91/lang/menu_pt_pt.vim", "type": "file" }, { - "bom-ref": "7806478f2868c0b0", + "bom-ref": "da028bff72d156b8", "name": "/usr/share/vim/vim91/lang/menu_ru.cp1251.vim", "type": "file" }, { - "bom-ref": "80e939e4ff6b40d4", + "bom-ref": "1e88cc4154f1f7fc", "name": "/usr/share/vim/vim91/lang/menu_ru.koi8-r.vim", "type": "file" }, { - "bom-ref": "b5e03b77a5a269e1", + "bom-ref": "c7a220d86e25eef9", "name": "/usr/share/vim/vim91/lang/menu_ru.utf-8.vim", "type": "file" }, { - "bom-ref": "977c96ec01d442e8", + "bom-ref": "f2dfe4c94c24a37c", "name": "/usr/share/vim/vim91/lang/menu_ru.vim", "type": "file" }, { - "bom-ref": "3cc6066a3a5293ed", + "bom-ref": "ce34f9c934095465", "name": "/usr/share/vim/vim91/lang/menu_ru_ru.cp1251.vim", "type": "file" }, { - "bom-ref": "40600f3dfb5fbabb", + "bom-ref": "ef05e8b34b3242db", "name": "/usr/share/vim/vim91/lang/menu_ru_ru.koi8-r.vim", "type": "file" }, { - "bom-ref": "c7be2f55df7d2213", + "bom-ref": "15a547222a7a541f", "name": "/usr/share/vim/vim91/lang/menu_ru_ru.utf-8.vim", "type": "file" }, { - "bom-ref": "0e3ea53ca66425c3", + "bom-ref": "58ef827334dc80d3", "name": "/usr/share/vim/vim91/lang/menu_ru_ru.vim", "type": "file" }, { - "bom-ref": "50ca0252c85f48ee", + "bom-ref": "5aa705f05edaf1fe", "name": "/usr/share/vim/vim91/lang/menu_sk.cp1250.vim", "type": "file" }, { - "bom-ref": "8fed70b347fc10d0", + "bom-ref": "f951425e82c91e98", "name": "/usr/share/vim/vim91/lang/menu_sk_sk.1250.vim", "type": "file" }, { - "bom-ref": "f70b656716826040", + "bom-ref": "f4d54065bd9f0028", "name": "/usr/share/vim/vim91/lang/menu_sk_sk.cp1250.vim", "type": "file" }, { - "bom-ref": "d56448bb8b4c609b", + "bom-ref": "612a72d9262f89bf", "name": "/usr/share/vim/vim91/lang/menu_sk_sk.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "7ed11ef6e522c667", + "bom-ref": "051cc2ed3f782d3f", "name": "/usr/share/vim/vim91/lang/menu_sk_sk.vim", "type": "file" }, { - "bom-ref": "4f9a53148408a024", + "bom-ref": "225198656eb125bc", "name": "/usr/share/vim/vim91/lang/menu_sl_si.cp1250.vim", "type": "file" }, { - "bom-ref": "f27ec078c5ddeb84", + "bom-ref": "c4c041bf9641add0", "name": "/usr/share/vim/vim91/lang/menu_sl_si.latin2.vim", "type": "file" }, { - "bom-ref": "8a2ef5930585b107", + "bom-ref": "9b03ea5613119343", "name": "/usr/share/vim/vim91/lang/menu_sl_si.utf-8.vim", "type": "file" }, { - "bom-ref": "070b21787fddef7f", + "bom-ref": "63dd7a66235535af", "name": "/usr/share/vim/vim91/lang/menu_slovak_slovak_republic.1250.vim", "type": "file" }, { - "bom-ref": "c122718af513770d", + "bom-ref": "23ca5394f9439281", "name": "/usr/share/vim/vim91/lang/menu_spanish_spain.850.vim", "type": "file" }, { - "bom-ref": "d222db55cbab308d", + "bom-ref": "639b68a689662e79", "name": "/usr/share/vim/vim91/lang/menu_sr.utf-8.vim", "type": "file" }, { - "bom-ref": "a81e769ad5403f20", + "bom-ref": "434268a18722a20c", "name": "/usr/share/vim/vim91/lang/menu_sr_rs.ascii.vim", "type": "file" }, { - "bom-ref": "c96d621441a9f866", + "bom-ref": "9b3c6edcbf65aad2", "name": "/usr/share/vim/vim91/lang/menu_sr_rs.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "a83b547829109087", + "bom-ref": "4f9d425be9947013", "name": "/usr/share/vim/vim91/lang/menu_sr_rs.iso_8859-5.vim", "type": "file" }, { - "bom-ref": "33eea179ce82c10a", + "bom-ref": "2014686021e03df6", "name": "/usr/share/vim/vim91/lang/menu_sr_rs.utf-8.vim", "type": "file" }, { - "bom-ref": "c36d40e9ca339b29", + "bom-ref": "e1d4615bab1409cd", "name": "/usr/share/vim/vim91/lang/menu_sr_yu.ascii.vim", "type": "file" }, { - "bom-ref": "3f7295055ba07732", + "bom-ref": "265e73d503fa4882", "name": "/usr/share/vim/vim91/lang/menu_sr_yu.iso_8859-2.vim", "type": "file" }, { - "bom-ref": "a66ad27605016917", + "bom-ref": "700e66e0c36f5c4b", "name": "/usr/share/vim/vim91/lang/menu_sr_yu.iso_8859-5.vim", "type": "file" }, { - "bom-ref": "a96c937ca2befb0a", + "bom-ref": "1e61f9c14129e2de", "name": "/usr/share/vim/vim91/lang/menu_sr_yu.utf-8.vim", "type": "file" }, { - "bom-ref": "35914025fdce05f0", + "bom-ref": "8d94ac9e8af44158", "name": "/usr/share/vim/vim91/lang/menu_sv.latin1.vim", "type": "file" }, { - "bom-ref": "406e0afb3b233293", + "bom-ref": "e5d4a2cd0f0c8f03", "name": "/usr/share/vim/vim91/lang/menu_sv.utf-8.vim", "type": "file" }, { - "bom-ref": "1b0bdfb0ab63f080", + "bom-ref": "ecf1c08765570038", "name": "/usr/share/vim/vim91/lang/menu_sv_se.latin1.vim", "type": "file" }, { - "bom-ref": "cf4a87f6b63451c7", + "bom-ref": "f10089de60832473", "name": "/usr/share/vim/vim91/lang/menu_sv_se.utf-8.vim", "type": "file" }, { - "bom-ref": "6cd8358de48e3fa7", + "bom-ref": "b5cb81d7617df24b", "name": "/usr/share/vim/vim91/lang/menu_tr.cp1254.vim", "type": "file" }, { - "bom-ref": "13dced888f399043", + "bom-ref": "913ca0ceac9a0e13", "name": "/usr/share/vim/vim91/lang/menu_tr.iso_8859-9.vim", "type": "file" }, { - "bom-ref": "e456382d47c6b2dc", + "bom-ref": "a769423d4f9f101c", "name": "/usr/share/vim/vim91/lang/menu_tr.utf-8.vim", "type": "file" }, { - "bom-ref": "5be52bfbef75de64", + "bom-ref": "698a664d30b2a568", "name": "/usr/share/vim/vim91/lang/menu_tr_tr.cp1254.vim", "type": "file" }, { - "bom-ref": "562db82320249124", + "bom-ref": "977569fc33ea6798", "name": "/usr/share/vim/vim91/lang/menu_tr_tr.iso_8859-9.vim", "type": "file" }, { - "bom-ref": "7a83eddebfddc7a5", + "bom-ref": "98c5905e237952a9", "name": "/usr/share/vim/vim91/lang/menu_tr_tr.utf-8.vim", "type": "file" }, { - "bom-ref": "f9ca3544b8f10858", + "bom-ref": "fc3347fb9a99d72c", "name": "/usr/share/vim/vim91/lang/menu_uk_ua.cp1251.vim", "type": "file" }, { - "bom-ref": "07b86af275b01fd5", + "bom-ref": "e131310cdbb342c5", "name": "/usr/share/vim/vim91/lang/menu_uk_ua.koi8-u.vim", "type": "file" }, { - "bom-ref": "7aa16f65c1e80491", + "bom-ref": "3f525623a29a0a81", "name": "/usr/share/vim/vim91/lang/menu_uk_ua.utf-8.vim", "type": "file" }, { - "bom-ref": "1380de85eb5b998e", + "bom-ref": "5b40eb683efd9bfa", "name": "/usr/share/vim/vim91/lang/menu_vi_vn.vim", "type": "file" }, { - "bom-ref": "b5e635e8652d68e5", + "bom-ref": "a6c146edfec318f9", "name": "/usr/share/vim/vim91/lang/menu_zh.big5.vim", "type": "file" }, { - "bom-ref": "a364cded06e0e061", + "bom-ref": "4f25ca722beaa3b1", "name": "/usr/share/vim/vim91/lang/menu_zh.cp936.vim", "type": "file" }, { - "bom-ref": "4851f520c9fa8448", + "bom-ref": "6775c0ff94ef1dc0", "name": "/usr/share/vim/vim91/lang/menu_zh.cp950.vim", "type": "file" }, { - "bom-ref": "2488743010d2a941", + "bom-ref": "2e988695fc908dcd", "name": "/usr/share/vim/vim91/lang/menu_zh.gb2312.vim", "type": "file" }, { - "bom-ref": "cdcbdc8c4257943b", + "bom-ref": "f559616194fc925b", "name": "/usr/share/vim/vim91/lang/menu_zh_cn.18030.vim", "type": "file" }, { - "bom-ref": "e85cb6d27ce3362f", + "bom-ref": "7627572174313cb3", "name": "/usr/share/vim/vim91/lang/menu_zh_cn.cp936.vim", "type": "file" }, { - "bom-ref": "aeddcb9352a88512", + "bom-ref": "65c449b44004902e", "name": "/usr/share/vim/vim91/lang/menu_zh_cn.gb2312.vim", "type": "file" }, { - "bom-ref": "5f743a428c0b1ccf", + "bom-ref": "8320ed33bc2f6c87", "name": "/usr/share/vim/vim91/lang/menu_zh_cn.gbk.vim", "type": "file" }, { - "bom-ref": "0d0cd45abe073536", + "bom-ref": "ad9f064cd2ac8356", "name": "/usr/share/vim/vim91/lang/menu_zh_cn.utf-8.vim", "type": "file" }, { - "bom-ref": "9e1f33501d8db9f4", + "bom-ref": "313c06c528b7d3ac", "name": "/usr/share/vim/vim91/lang/menu_zh_tw.big5.vim", "type": "file" }, { - "bom-ref": "c4154ac372131536", + "bom-ref": "2e9eb96c774126be", "name": "/usr/share/vim/vim91/lang/menu_zh_tw.cp950.vim", "type": "file" }, { - "bom-ref": "d94a3b1aa1ecb0cc", + "bom-ref": "6edbd28f2ea8d600", "name": "/usr/share/vim/vim91/lang/menu_zh_tw.utf-8.vim", "type": "file" }, { - "bom-ref": "1e28982aff1c1495", + "bom-ref": "be8759dfc72eb725", "name": "/usr/share/vim/vim91/lang/nb/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "59dec6c5e59cbec6", + "bom-ref": "fc0bc06b0154117e", "name": "/usr/share/vim/vim91/lang/nl/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "a6eed54c68b0f986", + "bom-ref": "1d790a08b2d75fa2", "name": "/usr/share/vim/vim91/lang/no/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "f6fdadedcb5f0db9", + "bom-ref": "2550d5501c1fc17d", "name": "/usr/share/vim/vim91/lang/pl.UTF-8/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "5c1e624ad0153aa9", + "bom-ref": "96c0ec604a28e2f1", "name": "/usr/share/vim/vim91/lang/pl.cp1250/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "14f4ac7790abf089", + "bom-ref": "d71e26f6041434ad", "name": "/usr/share/vim/vim91/lang/pl/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "b47b5308dabd3ed4", + "bom-ref": "98bec6f340fbf008", "name": "/usr/share/vim/vim91/lang/pt_BR/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "9428406ce13eed3b", + "bom-ref": "0f748803e80845b3", "name": "/usr/share/vim/vim91/lang/ru.cp1251/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "c9d8e1df78ef60b9", + "bom-ref": "a59ca412f58476dd", "name": "/usr/share/vim/vim91/lang/ru/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "9cf15258c7bde16c", + "bom-ref": "46304c71c4b4f1c0", "name": "/usr/share/vim/vim91/lang/sk.cp1250/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "06029d381c88566e", + "bom-ref": "e5795236fd63298e", "name": "/usr/share/vim/vim91/lang/sk/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "5f52174f397ba5c6", + "bom-ref": "bbc48e63cfdac602", "name": "/usr/share/vim/vim91/lang/sr/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "0d8e4ce10663bd1a", + "bom-ref": "e4ddc43d8c48c53a", "name": "/usr/share/vim/vim91/lang/sv/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "317536c3a4520b5a", + "bom-ref": "1cb21c1ffc028722", "name": "/usr/share/vim/vim91/lang/tr/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "d386b0c1d75d85d3", + "bom-ref": "df0424dc4aeae5e3", "name": "/usr/share/vim/vim91/lang/uk.cp1251/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "4ab20b06df6fc8cc", + "bom-ref": "ee087b0aecf1efec", "name": "/usr/share/vim/vim91/lang/uk/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "6798fadf65f8a59f", + "bom-ref": "a20e2d2d12a4cd5f", "name": "/usr/share/vim/vim91/lang/vi/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "a112ed40421dafda", + "bom-ref": "aa5baae04d3c98fa", "name": "/usr/share/vim/vim91/lang/zh_CN.UTF-8/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "64ab4897e28c5197", + "bom-ref": "9fd5783cb8ac457b", "name": "/usr/share/vim/vim91/lang/zh_CN.cp936/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "e2dd516cd7adfb92", + "bom-ref": "a48cfbd97419da12", "name": "/usr/share/vim/vim91/lang/zh_CN/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "94c557646e0d6bb1", + "bom-ref": "cb32b3280a5989b5", "name": "/usr/share/vim/vim91/lang/zh_TW.UTF-8/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "b8818669cff065ab", + "bom-ref": "daa25030f987be37", "name": "/usr/share/vim/vim91/lang/zh_TW/LC_MESSAGES/vim.mo", "type": "file" }, { - "bom-ref": "0ef75d73debb6bd6", + "bom-ref": "3c1bea01e20b1d22", "name": "/usr/share/vim/vim91/macros/editexisting.vim", "type": "file" }, { - "bom-ref": "f83611751c7f169c", + "bom-ref": "ff21e71feb54396c", "name": "/usr/share/vim/vim91/macros/hanoi/click.me", "type": "file" }, { - "bom-ref": "18368e4d03e12fa3", + "bom-ref": "a279bdff1d6d491f", "name": "/usr/share/vim/vim91/macros/hanoi/hanoi.vim", "type": "file" }, { - "bom-ref": "1654f512e7396adf", + "bom-ref": "3cf268cf0a40f953", "name": "/usr/share/vim/vim91/macros/hanoi/poster", "type": "file" }, { - "bom-ref": "d603058fa6d22afa", + "bom-ref": "535b9bbaec21a13a", "name": "/usr/share/vim/vim91/macros/justify.vim", "type": "file" }, { - "bom-ref": "69330c497a2cb7e5", + "bom-ref": "b0d753ef5c783e29", "name": "/usr/share/vim/vim91/macros/less.bat", "type": "file" }, { - "bom-ref": "2b275d42cde0672f", + "bom-ref": "8b9d683b811f9c9f", "name": "/usr/share/vim/vim91/macros/less.sh", "type": "file" }, { - "bom-ref": "b5fb323c2efdbf02", + "bom-ref": "8d20f2410845350e", "name": "/usr/share/vim/vim91/macros/less.vim", "type": "file" }, { - "bom-ref": "c944987d38339770", + "bom-ref": "fc03432597a9ce00", "name": "/usr/share/vim/vim91/macros/life/click.me", "type": "file" }, { - "bom-ref": "0711834e5d6ed373", + "bom-ref": "71087d7f4230d2f7", "name": "/usr/share/vim/vim91/macros/life/life.vim", "type": "file" }, { - "bom-ref": "0b7af63c16c9f87b", + "bom-ref": "878629c5a69edf9b", "name": "/usr/share/vim/vim91/macros/matchit.vim", "type": "file" }, { - "bom-ref": "e0698d5cf721a543", + "bom-ref": "b70491d69421efd7", "name": "/usr/share/vim/vim91/macros/maze/Makefile", "type": "file" }, { - "bom-ref": "d870840a751485cd", + "bom-ref": "9cdb3d54be2fa46d", "name": "/usr/share/vim/vim91/macros/maze/maze.c", "type": "file" }, { - "bom-ref": "3bc352fcd57bbd25", + "bom-ref": "7f38c0db79645101", "name": "/usr/share/vim/vim91/macros/maze/maze_5.78", "type": "file" }, { - "bom-ref": "ddbb16de05e94f07", + "bom-ref": "e86ecd95bcd86473", "name": "/usr/share/vim/vim91/macros/maze/maze_mac", "type": "file" }, { - "bom-ref": "d843063ab4400bbd", + "bom-ref": "20c610758b9d79d5", "name": "/usr/share/vim/vim91/macros/maze/mazeansi.c", "type": "file" }, { - "bom-ref": "e25a43c7ce277f78", + "bom-ref": "89eade0518d87d70", "name": "/usr/share/vim/vim91/macros/maze/mazeclean.c", "type": "file" }, { - "bom-ref": "05ed5a4bafb3ea74", + "bom-ref": "60b6595ceba55fbc", "name": "/usr/share/vim/vim91/macros/maze/poster", "type": "file" }, { - "bom-ref": "c5c55f1d566a0138", + "bom-ref": "7df89b43a0e82dbc", "name": "/usr/share/vim/vim91/macros/shellmenu.vim", "type": "file" }, { - "bom-ref": "0e31e9d1e59ab236", + "bom-ref": "b687faa1faeb2516", "name": "/usr/share/vim/vim91/macros/swapmous.vim", "type": "file" }, { - "bom-ref": "941a8c76d145559e", + "bom-ref": "0e957d689e379146", "name": "/usr/share/vim/vim91/macros/urm/examples", "type": "file" }, { - "bom-ref": "86d382b839fd1467", + "bom-ref": "31386539070cccaf", "name": "/usr/share/vim/vim91/macros/urm/urm", "type": "file" }, { - "bom-ref": "f81e1461ceb0bc48", + "bom-ref": "de3292699aef9c74", "name": "/usr/share/vim/vim91/macros/urm/urm.vim", "type": "file" }, { - "bom-ref": "2226aaaac28a2755", + "bom-ref": "3efb66bf6ec392fd", "name": "/usr/share/vim/vim91/menu.vim", "type": "file" }, { - "bom-ref": "2494f69dc790bf59", + "bom-ref": "95424a2ece30d515", "name": "/usr/share/vim/vim91/mswin.vim", "type": "file" }, { - "bom-ref": "f05656655de6b99a", + "bom-ref": "62c3894d02fa7b46", "name": "/usr/share/vim/vim91/optwin.vim", "type": "file" }, { - "bom-ref": "5cb15bb40956a542", + "bom-ref": "87a688f38ae8f04a", "name": "/usr/share/vim/vim91/pack/dist/opt/cfilter/plugin/cfilter.vim", "type": "file" }, { - "bom-ref": "39161c32490ea121", + "bom-ref": "13f5a29b2f31ca71", "name": "/usr/share/vim/vim91/pack/dist/opt/dvorak/dvorak/disable.vim", "type": "file" }, { - "bom-ref": "114477b2b0987e13", + "bom-ref": "c7227643d5cd39af", "name": "/usr/share/vim/vim91/pack/dist/opt/dvorak/dvorak/enable.vim", "type": "file" }, { - "bom-ref": "130ead53a760e7f7", + "bom-ref": "d5679921d4cf5947", "name": "/usr/share/vim/vim91/pack/dist/opt/dvorak/plugin/dvorak.vim", "type": "file" }, { - "bom-ref": "ed85715314fecc50", + "bom-ref": "c2c5aff1948ef3d0", "name": "/usr/share/vim/vim91/pack/dist/opt/editexisting/plugin/editexisting.vim", "type": "file" }, { - "bom-ref": "4194585518a8a2fe", + "bom-ref": "1a889b7a617710aa", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/.editorconfig", "type": "file" }, { - "bom-ref": "052f7a2818856942", + "bom-ref": "9a3be93d7410209a", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/CONTRIBUTORS", "type": "file" }, { - "bom-ref": "c701082ccf76c585", + "bom-ref": "5d2ee19654f99061", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/LICENSE", "type": "file" }, { - "bom-ref": "9f7d3148909c0e2e", + "bom-ref": "e80512ed5cd1fd4e", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/LICENSE.PSF", "type": "file" }, { - "bom-ref": "438a13c2607eac4e", + "bom-ref": "352111d40559261e", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/README.md", "type": "file" }, { - "bom-ref": "794eb6c66779e8ca", + "bom-ref": "ce040a7c03070536", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig.vim", "type": "file" }, { - "bom-ref": "9ddd987a09f77818", + "bom-ref": "47b1a13118069e2c", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig_core.vim", "type": "file" }, { - "bom-ref": "840a16d8e5ae16b2", + "bom-ref": "02bb536dc0000966", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig_core/fnmatch.vim", "type": "file" }, { - "bom-ref": "388787edce773033", + "bom-ref": "a758d3a2d2b41813", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig_core/handler.vim", "type": "file" }, { - "bom-ref": "842be1b7f5f16e77", + "bom-ref": "0db6a2b9601e80bf", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig_core/ini.vim", "type": "file" }, { - "bom-ref": "1d6618b69891fd48", + "bom-ref": "c4e74934e8d7e548", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/autoload/editorconfig_core/util.vim", "type": "file" }, { - "bom-ref": "87e8eff8be534b33", + "bom-ref": "d89349ba286771eb", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/doc/editorconfig.txt", "type": "file" }, { - "bom-ref": "64438dc497d87283", + "bom-ref": "3ee67b3a01689057", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/doc/tags", "type": "file" }, { - "bom-ref": "bda824e444a53663", + "bom-ref": "07f623bd715dae03", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/ftdetect/editorconfig.vim", "type": "file" }, { - "bom-ref": "4ab467a8c3b13e72", + "bom-ref": "ba9e6a85f0b2600e", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/mkzip.sh", "type": "file" }, { - "bom-ref": "ec6c62796be2916c", + "bom-ref": "9ed5fe70eb85fc64", "name": "/usr/share/vim/vim91/pack/dist/opt/editorconfig/plugin/editorconfig.vim", "type": "file" }, { - "bom-ref": "222d65ffc0e22be5", + "bom-ref": "b1edc300aeca875d", "name": "/usr/share/vim/vim91/pack/dist/opt/justify/plugin/justify.vim", "type": "file" }, { - "bom-ref": "87cb6b9b95bd8754", + "bom-ref": "de00e9860a9f1408", "name": "/usr/share/vim/vim91/pack/dist/opt/matchit/autoload/matchit.vim", "type": "file" }, { - "bom-ref": "106a72fcf4b4349e", + "bom-ref": "27629c07aff0552e", "name": "/usr/share/vim/vim91/pack/dist/opt/matchit/doc/matchit.txt", "type": "file" }, { - "bom-ref": "0e86ca64cb78b32e", + "bom-ref": "76e1dd7038b662b6", "name": "/usr/share/vim/vim91/pack/dist/opt/matchit/doc/tags", "type": "file" }, { - "bom-ref": "685342449acfbf16", + "bom-ref": "c4e77a67c48051b2", "name": "/usr/share/vim/vim91/pack/dist/opt/matchit/plugin/matchit.vim", "type": "file" }, { - "bom-ref": "46e2031e0fe0ca94", + "bom-ref": "e12ff31c9aa877cc", "name": "/usr/share/vim/vim91/pack/dist/opt/shellmenu/plugin/shellmenu.vim", "type": "file" }, { - "bom-ref": "9b53430c1c3291f5", + "bom-ref": "5196537961706715", "name": "/usr/share/vim/vim91/pack/dist/opt/swapmouse/plugin/swapmouse.vim", "type": "file" }, { - "bom-ref": "a60cbb4e59086183", + "bom-ref": "80138e09cd389923", "name": "/usr/share/vim/vim91/pack/dist/opt/termdebug/plugin/termdebug.vim", "type": "file" }, { - "bom-ref": "602f984fefacd0ee", + "bom-ref": "dc6b8a5722593656", "name": "/usr/share/vim/vim91/plugin/getscriptPlugin.vim", "type": "file" }, { - "bom-ref": "e2f1161cfd8be443", + "bom-ref": "772bddb43de5c55b", "name": "/usr/share/vim/vim91/plugin/gzip.vim", "type": "file" }, { - "bom-ref": "f35122b6ef457551", + "bom-ref": "cf15347bc0da3739", "name": "/usr/share/vim/vim91/plugin/logiPat.vim", "type": "file" }, { - "bom-ref": "9f67707160f72fb6", + "bom-ref": "9e8e1ba6f2e0290e", "name": "/usr/share/vim/vim91/plugin/manpager.vim", "type": "file" }, { - "bom-ref": "d031cd2da4f8e156", + "bom-ref": "025c2e2adcbce2f6", "name": "/usr/share/vim/vim91/plugin/matchparen.vim", "type": "file" }, { - "bom-ref": "83e7d0fa9007e621", + "bom-ref": "3d2c1706c7161e95", "name": "/usr/share/vim/vim91/plugin/netrwPlugin.vim", "type": "file" }, { - "bom-ref": "ed4655f8b548fd89", + "bom-ref": "6340a2bf18923629", "name": "/usr/share/vim/vim91/plugin/rrhelper.vim", "type": "file" }, { - "bom-ref": "4593c4cd6c77b6eb", + "bom-ref": "95c50e80c5625033", "name": "/usr/share/vim/vim91/plugin/spellfile.vim", "type": "file" }, { - "bom-ref": "7aabdd68e8fc04fc", + "bom-ref": "f221dc8b31fe6db0", "name": "/usr/share/vim/vim91/plugin/tarPlugin.vim", "type": "file" }, { - "bom-ref": "f3a4cea0af80cf71", + "bom-ref": "b7a4444177d81c9d", "name": "/usr/share/vim/vim91/plugin/tohtml.vim", "type": "file" }, { - "bom-ref": "b8e5f301fe00679e", + "bom-ref": "7b0e9e50b895488a", "name": "/usr/share/vim/vim91/plugin/vimballPlugin.vim", "type": "file" }, { - "bom-ref": "1b7688d37d1359c4", + "bom-ref": "769bda973be1bec8", "name": "/usr/share/vim/vim91/plugin/zipPlugin.vim", "type": "file" }, { - "bom-ref": "1890ce45a69f872f", + "bom-ref": "9bbccd85b534dd1b", "name": "/usr/share/vim/vim91/print/ascii.ps", "type": "file" }, { - "bom-ref": "dfb634d54328a7f0", + "bom-ref": "3ab2bf97e3d8eb84", "name": "/usr/share/vim/vim91/print/cidfont.ps", "type": "file" }, { - "bom-ref": "f1030203b5d1efbf", + "bom-ref": "de6b599e4bd1fe4b", "name": "/usr/share/vim/vim91/print/cns_roman.ps", "type": "file" }, { - "bom-ref": "b747d7992a9c7f21", + "bom-ref": "07ccb972e391fdc5", "name": "/usr/share/vim/vim91/print/cp1250.ps", "type": "file" }, { - "bom-ref": "218de34ff2ce667b", + "bom-ref": "41bca070982f5a6f", "name": "/usr/share/vim/vim91/print/cp1251.ps", "type": "file" }, { - "bom-ref": "79fd2e3645149da6", + "bom-ref": "35dfca46c1307cfe", "name": "/usr/share/vim/vim91/print/cp1252.ps", "type": "file" }, { - "bom-ref": "cb9a4a838db1020f", + "bom-ref": "12afe91f6ef86fff", "name": "/usr/share/vim/vim91/print/cp1253.ps", "type": "file" }, { - "bom-ref": "123a6d1c03dcb45d", + "bom-ref": "ac1ee3965e9d6675", "name": "/usr/share/vim/vim91/print/cp1254.ps", "type": "file" }, { - "bom-ref": "f51d65f9f1b1e8cb", + "bom-ref": "629694267d26be47", "name": "/usr/share/vim/vim91/print/cp1255.ps", "type": "file" }, { - "bom-ref": "7fa0f8b8c5972b62", + "bom-ref": "8b17107d185d863a", "name": "/usr/share/vim/vim91/print/cp1257.ps", "type": "file" }, { - "bom-ref": "c34dc83235dce2de", + "bom-ref": "46cab43dc8c76d46", "name": "/usr/share/vim/vim91/print/dec-mcs.ps", "type": "file" }, { - "bom-ref": "0df07b0296ef7904", + "bom-ref": "46dbebbd8668abd8", "name": "/usr/share/vim/vim91/print/ebcdic-uk.ps", "type": "file" }, { - "bom-ref": "9c2fc337c6651c9c", + "bom-ref": "6a153d378df99474", "name": "/usr/share/vim/vim91/print/gb_roman.ps", "type": "file" }, { - "bom-ref": "aff414adfb7f4c21", + "bom-ref": "13729b0fe29c89d1", "name": "/usr/share/vim/vim91/print/hp-roman8.ps", "type": "file" }, { - "bom-ref": "3dd8fe2d35e03756", + "bom-ref": "9027bbdb7d664be2", "name": "/usr/share/vim/vim91/print/iso-8859-10.ps", "type": "file" }, { - "bom-ref": "e99125a2ae365871", + "bom-ref": "d32de5020c3a85b1", "name": "/usr/share/vim/vim91/print/iso-8859-11.ps", "type": "file" }, { - "bom-ref": "521dcd42ed162997", + "bom-ref": "abed42ffc9192aff", "name": "/usr/share/vim/vim91/print/iso-8859-13.ps", "type": "file" }, { - "bom-ref": "795b7af5ad1112d3", + "bom-ref": "f54787ff515bd883", "name": "/usr/share/vim/vim91/print/iso-8859-14.ps", "type": "file" }, { - "bom-ref": "8a291b2d1464773e", + "bom-ref": "e280820a923d038e", "name": "/usr/share/vim/vim91/print/iso-8859-15.ps", "type": "file" }, { - "bom-ref": "c7c2c325542916c8", + "bom-ref": "75aef994e300bf14", "name": "/usr/share/vim/vim91/print/iso-8859-2.ps", "type": "file" }, { - "bom-ref": "81aad644e9b2f60d", + "bom-ref": "1d6daea49605dad9", "name": "/usr/share/vim/vim91/print/iso-8859-3.ps", "type": "file" }, { - "bom-ref": "d32126f953e144bf", + "bom-ref": "522613cf9ed2fe7b", "name": "/usr/share/vim/vim91/print/iso-8859-4.ps", "type": "file" }, { - "bom-ref": "13fdc467b79e2700", + "bom-ref": "a9cd1f801b01b458", "name": "/usr/share/vim/vim91/print/iso-8859-5.ps", "type": "file" }, { - "bom-ref": "bc9e56baa8735edc", + "bom-ref": "6da829e979903198", "name": "/usr/share/vim/vim91/print/iso-8859-7.ps", "type": "file" }, { - "bom-ref": "dca679238a9451b1", + "bom-ref": "471b5e77672ef1f9", "name": "/usr/share/vim/vim91/print/iso-8859-8.ps", "type": "file" }, { - "bom-ref": "2766d2045af089bb", + "bom-ref": "7c52dfeddff4c867", "name": "/usr/share/vim/vim91/print/iso-8859-9.ps", "type": "file" }, { - "bom-ref": "e698b309305ab09c", + "bom-ref": "f0c037f2cb404eb0", "name": "/usr/share/vim/vim91/print/jis_roman.ps", "type": "file" }, { - "bom-ref": "364ba0d4ac2e9620", + "bom-ref": "3e4a34632f802c20", "name": "/usr/share/vim/vim91/print/koi8-r.ps", "type": "file" }, { - "bom-ref": "7d58bc6a5016f111", + "bom-ref": "9661e86d6c09aa8d", "name": "/usr/share/vim/vim91/print/koi8-u.ps", "type": "file" }, { - "bom-ref": "8126911f8c2fe48d", + "bom-ref": "7aa769c22b0a0ad5", "name": "/usr/share/vim/vim91/print/ks_roman.ps", "type": "file" }, { - "bom-ref": "d441c4584fea260e", + "bom-ref": "2722c6379a27b6be", "name": "/usr/share/vim/vim91/print/latin1.ps", "type": "file" }, { - "bom-ref": "b885b8ba5cb57979", + "bom-ref": "21eece3104dabdd5", "name": "/usr/share/vim/vim91/print/mac-roman.ps", "type": "file" }, { - "bom-ref": "f20ad080bef0d08c", + "bom-ref": "8c867490f2a38600", "name": "/usr/share/vim/vim91/print/prolog.ps", "type": "file" }, { - "bom-ref": "36c9b663b75e3989", + "bom-ref": "3b99559ebd29edf1", "name": "/usr/share/vim/vim91/scripts.vim", "type": "file" }, { - "bom-ref": "ae0443cf32e93f0f", + "bom-ref": "591b6eadb7623f6f", "name": "/usr/share/vim/vim91/spell/check_locales.vim", "type": "file" }, { - "bom-ref": "5ceb0d0f6754a61b", + "bom-ref": "49846673e78f57bf", "name": "/usr/share/vim/vim91/spell/cleanadd.vim", "type": "file" }, { - "bom-ref": "593025e5e3d29e1f", + "bom-ref": "4d2186cbf3478e1b", "name": "/usr/share/vim/vim91/spell/en.ascii.spl", "type": "file" }, { - "bom-ref": "04270159eed0e73b", + "bom-ref": "5ad5e91f3f35e4d3", "name": "/usr/share/vim/vim91/spell/en.ascii.sug", "type": "file" }, { - "bom-ref": "a6220c30047a20d1", + "bom-ref": "1d65d56f3842c0f9", "name": "/usr/share/vim/vim91/spell/en.latin1.spl", "type": "file" }, { - "bom-ref": "ef32c5816019ae25", + "bom-ref": "2a4109743e1b88d5", "name": "/usr/share/vim/vim91/spell/en.latin1.sug", "type": "file" }, { - "bom-ref": "cf166e719f9983b3", + "bom-ref": "23077fc6db59271f", "name": "/usr/share/vim/vim91/spell/en.utf-8.spl", "type": "file" }, { - "bom-ref": "3ca2155ddf0eaec9", + "bom-ref": "2af1791730c99979", "name": "/usr/share/vim/vim91/spell/en.utf-8.sug", "type": "file" }, { - "bom-ref": "585a2da7f6f55400", + "bom-ref": "75f109d434ae2aa0", "name": "/usr/share/vim/vim91/spell/fixdup.vim", "type": "file" }, { - "bom-ref": "d0ff83512898ad44", + "bom-ref": "993d9ef29b7c1ce0", "name": "/usr/share/vim/vim91/spell/he.vim", "type": "file" }, { - "bom-ref": "336dd06eea65142d", + "bom-ref": "4b29e85112aaa495", "name": "/usr/share/vim/vim91/spell/spell.vim", "type": "file" }, { - "bom-ref": "936be1856348e8f6", + "bom-ref": "71d3779223711602", "name": "/usr/share/vim/vim91/spell/yi.vim", "type": "file" }, { - "bom-ref": "051fdfa30bc66e40", + "bom-ref": "235a837c2dbaac20", "name": "/usr/share/vim/vim91/synmenu.vim", "type": "file" }, { - "bom-ref": "7cb80f3d13527e07", + "bom-ref": "00684eb0cee6141f", "name": "/usr/share/vim/vim91/syntax/2html.vim", "type": "file" }, { - "bom-ref": "8e6623f0e172be3e", + "bom-ref": "e5c8c216030f862a", "name": "/usr/share/vim/vim91/syntax/8th.vim", "type": "file" }, { - "bom-ref": "7a9980755a7c9fea", + "bom-ref": "10da0a874b48d412", "name": "/usr/share/vim/vim91/syntax/a2ps.vim", "type": "file" }, { - "bom-ref": "504f26e8181243fc", + "bom-ref": "ec01c8ff129ed044", "name": "/usr/share/vim/vim91/syntax/a65.vim", "type": "file" }, { - "bom-ref": "ffdf1d35134f5e68", + "bom-ref": "2354b4f29fdfb9b4", "name": "/usr/share/vim/vim91/syntax/aap.vim", "type": "file" }, { - "bom-ref": "dd6a843bca2d0df9", + "bom-ref": "8f678efafe5f8a55", "name": "/usr/share/vim/vim91/syntax/abap.vim", "type": "file" }, { - "bom-ref": "3e533fe6938fb080", + "bom-ref": "632484f4d91b9aec", "name": "/usr/share/vim/vim91/syntax/abaqus.vim", "type": "file" }, { - "bom-ref": "27b1f0fb1ec97612", + "bom-ref": "fc309e1464da960e", "name": "/usr/share/vim/vim91/syntax/abc.vim", "type": "file" }, { - "bom-ref": "5fcb969c89c81a05", + "bom-ref": "7f9ac3a50f813f49", "name": "/usr/share/vim/vim91/syntax/abel.vim", "type": "file" }, { - "bom-ref": "50a4b406361fa7ad", + "bom-ref": "e578bb1825981361", "name": "/usr/share/vim/vim91/syntax/acedb.vim", "type": "file" }, { - "bom-ref": "a9f5867e790ce07a", + "bom-ref": "8f533ece1e173306", "name": "/usr/share/vim/vim91/syntax/ada.vim", "type": "file" }, { - "bom-ref": "690b6253ec7ce2c3", + "bom-ref": "95bf0afc59037847", "name": "/usr/share/vim/vim91/syntax/aflex.vim", "type": "file" }, { - "bom-ref": "feb4b43eb3fc56c4", + "bom-ref": "2a4313535c657978", "name": "/usr/share/vim/vim91/syntax/ahdl.vim", "type": "file" }, { - "bom-ref": "9d49897e09607689", + "bom-ref": "ae7029de1f3f1f85", "name": "/usr/share/vim/vim91/syntax/aidl.vim", "type": "file" }, { - "bom-ref": "4d61dae66fb7b402", + "bom-ref": "63d0b78b8a682e56", "name": "/usr/share/vim/vim91/syntax/alsaconf.vim", "type": "file" }, { - "bom-ref": "cce1e8b8f56018f6", + "bom-ref": "1fade0183f9409da", "name": "/usr/share/vim/vim91/syntax/amiga.vim", "type": "file" }, { - "bom-ref": "bc7b6ab26d9fbd7f", + "bom-ref": "1f77c6efc3f7ab4f", "name": "/usr/share/vim/vim91/syntax/aml.vim", "type": "file" }, { - "bom-ref": "cb7e45a30b620d4e", + "bom-ref": "d06c8ca561de42ba", "name": "/usr/share/vim/vim91/syntax/ampl.vim", "type": "file" }, { - "bom-ref": "949b9be066060c8c", + "bom-ref": "6fab4cc49fdc32b4", "name": "/usr/share/vim/vim91/syntax/ant.vim", "type": "file" }, { - "bom-ref": "d492d4b95c836812", + "bom-ref": "a01f54e1bfa8f71a", "name": "/usr/share/vim/vim91/syntax/antlr.vim", "type": "file" }, { - "bom-ref": "95126127eae33eae", + "bom-ref": "d510475536832372", "name": "/usr/share/vim/vim91/syntax/apache.vim", "type": "file" }, { - "bom-ref": "d7ad84fa092a6202", + "bom-ref": "41e0d9899d65c89a", "name": "/usr/share/vim/vim91/syntax/apachestyle.vim", "type": "file" }, { - "bom-ref": "ec5d89d442f17ce2", + "bom-ref": "7fe2aac38c4295b6", "name": "/usr/share/vim/vim91/syntax/aptconf.vim", "type": "file" }, { - "bom-ref": "97b465ace4520846", + "bom-ref": "0b2c8ffc5be9d11a", "name": "/usr/share/vim/vim91/syntax/arch.vim", "type": "file" }, { - "bom-ref": "41c1870d6fc76588", + "bom-ref": "026aba9b12c32c04", "name": "/usr/share/vim/vim91/syntax/arduino.vim", "type": "file" }, { - "bom-ref": "0a4f42d81a81317d", + "bom-ref": "032915131e1e4ca9", "name": "/usr/share/vim/vim91/syntax/art.vim", "type": "file" }, { - "bom-ref": "b3eeb2f8b9ac2976", + "bom-ref": "7fbf686a5c0e2ca6", "name": "/usr/share/vim/vim91/syntax/asciidoc.vim", "type": "file" }, { - "bom-ref": "cf14ace0537310f1", + "bom-ref": "1bfe92c9459a5641", "name": "/usr/share/vim/vim91/syntax/asm.vim", "type": "file" }, { - "bom-ref": "55fce56749241cfb", + "bom-ref": "5d66ef29c7f24c43", "name": "/usr/share/vim/vim91/syntax/asm68k.vim", "type": "file" }, { - "bom-ref": "2278d7adb401633a", + "bom-ref": "2cd8d70041e4e23a", "name": "/usr/share/vim/vim91/syntax/asmh8300.vim", "type": "file" }, { - "bom-ref": "a61ce297229e637c", + "bom-ref": "dc7cf5cfb1c707a4", "name": "/usr/share/vim/vim91/syntax/asn.vim", "type": "file" }, { - "bom-ref": "30cdab91d36cad4f", + "bom-ref": "4968c2524f998877", "name": "/usr/share/vim/vim91/syntax/aspperl.vim", "type": "file" }, { - "bom-ref": "db23638bbbaf25bf", + "bom-ref": "91daca61490a4b9f", "name": "/usr/share/vim/vim91/syntax/aspvbs.vim", "type": "file" }, { - "bom-ref": "a004fc6b942f3df3", + "bom-ref": "8df16634b208331f", "name": "/usr/share/vim/vim91/syntax/asterisk.vim", "type": "file" }, { - "bom-ref": "9aa9a55d2126d6a3", + "bom-ref": "d09f665ee32bf4ff", "name": "/usr/share/vim/vim91/syntax/asteriskvm.vim", "type": "file" }, { - "bom-ref": "5568d4b2334253aa", + "bom-ref": "bc477acd9842a0fa", "name": "/usr/share/vim/vim91/syntax/atlas.vim", "type": "file" }, { - "bom-ref": "84c149fccdca7162", + "bom-ref": "8dffd3ce2bf0995e", "name": "/usr/share/vim/vim91/syntax/autodoc.vim", "type": "file" }, { - "bom-ref": "66df71aed37eb12d", + "bom-ref": "9730e5ae9c583aad", "name": "/usr/share/vim/vim91/syntax/autohotkey.vim", "type": "file" }, { - "bom-ref": "70b1a0f0b26f0293", + "bom-ref": "3299cc9432aadbd7", "name": "/usr/share/vim/vim91/syntax/autoit.vim", "type": "file" }, { - "bom-ref": "9d3d89072df98d56", + "bom-ref": "b998a01bb543d14e", "name": "/usr/share/vim/vim91/syntax/automake.vim", "type": "file" }, { - "bom-ref": "c5ace50e72291d78", + "bom-ref": "e925354fb3678f88", "name": "/usr/share/vim/vim91/syntax/ave.vim", "type": "file" }, { - "bom-ref": "795eb3388d20146d", + "bom-ref": "a1f25362e03d78bd", "name": "/usr/share/vim/vim91/syntax/avra.vim", "type": "file" }, { - "bom-ref": "33b11ca751789d01", + "bom-ref": "07f68a1153698e5d", "name": "/usr/share/vim/vim91/syntax/awk.vim", "type": "file" }, { - "bom-ref": "5f2bccb9645ddaab", + "bom-ref": "f8b2907cfbd9f397", "name": "/usr/share/vim/vim91/syntax/ayacc.vim", "type": "file" }, { - "bom-ref": "1a34aeacea7d8f4a", + "bom-ref": "f1236a9762242daa", "name": "/usr/share/vim/vim91/syntax/b.vim", "type": "file" }, { - "bom-ref": "5a26b6f13e48d174", + "bom-ref": "4bf0aa658249fbe4", "name": "/usr/share/vim/vim91/syntax/baan.vim", "type": "file" }, { - "bom-ref": "bdc16426ad927c50", + "bom-ref": "da941ce258eb29fc", "name": "/usr/share/vim/vim91/syntax/bash.vim", "type": "file" }, { - "bom-ref": "bb7c7aeb2025bcaf", + "bom-ref": "efda101b605965f3", "name": "/usr/share/vim/vim91/syntax/basic.vim", "type": "file" }, { - "bom-ref": "4a102e6c849ee3ae", + "bom-ref": "0751eb4c2ca3d3fa", "name": "/usr/share/vim/vim91/syntax/bc.vim", "type": "file" }, { - "bom-ref": "75867bf3c1e4088c", + "bom-ref": "2a39e6f2a3c72074", "name": "/usr/share/vim/vim91/syntax/bdf.vim", "type": "file" }, { - "bom-ref": "c3a23fb44a73be59", + "bom-ref": "1c104ec4eb0c218d", "name": "/usr/share/vim/vim91/syntax/bib.vim", "type": "file" }, { - "bom-ref": "2260830695584727", + "bom-ref": "f1d20dcea24972c3", "name": "/usr/share/vim/vim91/syntax/bindzone.vim", "type": "file" }, { - "bom-ref": "bb1032f28b05958c", + "bom-ref": "ffbd0976aa16fb28", "name": "/usr/share/vim/vim91/syntax/bitbake.vim", "type": "file" }, { - "bom-ref": "b350cea11def48c6", + "bom-ref": "1e63a17744305a72", "name": "/usr/share/vim/vim91/syntax/blank.vim", "type": "file" }, { - "bom-ref": "9e56a778d02dbaea", + "bom-ref": "8bd29884902ac722", "name": "/usr/share/vim/vim91/syntax/bsdl.vim", "type": "file" }, { - "bom-ref": "4f0797d584c05d50", + "bom-ref": "9faafe6bd3571078", "name": "/usr/share/vim/vim91/syntax/bst.vim", "type": "file" }, { - "bom-ref": "1c7a3b58c8671a16", + "bom-ref": "a2fcaf4857bc4e3a", "name": "/usr/share/vim/vim91/syntax/btm.vim", "type": "file" }, { - "bom-ref": "1d369e3236b883ec", + "bom-ref": "4588d0688b707f90", "name": "/usr/share/vim/vim91/syntax/bzl.vim", "type": "file" }, { - "bom-ref": "d950eba2849b6553", + "bom-ref": "1d41498ed2fff3fb", "name": "/usr/share/vim/vim91/syntax/bzr.vim", "type": "file" }, { - "bom-ref": "afbfc7327c4fd39c", + "bom-ref": "45b638b27a761528", "name": "/usr/share/vim/vim91/syntax/c.vim", "type": "file" }, { - "bom-ref": "e19ee192f93ca3e7", + "bom-ref": "bfbae2939eec5997", "name": "/usr/share/vim/vim91/syntax/cabal.vim", "type": "file" }, { - "bom-ref": "c9ef47ed68817c70", + "bom-ref": "926d18bcac44fba8", "name": "/usr/share/vim/vim91/syntax/cabalconfig.vim", "type": "file" }, { - "bom-ref": "3863cfcf04b8f59e", + "bom-ref": "09cb6bb4a765c4b2", "name": "/usr/share/vim/vim91/syntax/cabalproject.vim", "type": "file" }, { - "bom-ref": "543ee9c5570abc6b", + "bom-ref": "3a62bede2e000d23", "name": "/usr/share/vim/vim91/syntax/calendar.vim", "type": "file" }, { - "bom-ref": "1e8160a47d527909", + "bom-ref": "e338c4fcb21bdf6d", "name": "/usr/share/vim/vim91/syntax/catalog.vim", "type": "file" }, { - "bom-ref": "3737eb72d20ebda3", + "bom-ref": "c85621568454a17f", "name": "/usr/share/vim/vim91/syntax/cdl.vim", "type": "file" }, { - "bom-ref": "22f6f60c33592709", + "bom-ref": "df543b4e0d883e15", "name": "/usr/share/vim/vim91/syntax/cdrdaoconf.vim", "type": "file" }, { - "bom-ref": "fb89c7f51b50f50f", + "bom-ref": "dcb7f17ad55231a3", "name": "/usr/share/vim/vim91/syntax/cdrtoc.vim", "type": "file" }, { - "bom-ref": "3d348ffad9c8f243", + "bom-ref": "419d788f2cf757f3", "name": "/usr/share/vim/vim91/syntax/cf.vim", "type": "file" }, { - "bom-ref": "d3e013bb2c5c289a", + "bom-ref": "10ceb529c2422636", "name": "/usr/share/vim/vim91/syntax/cfg.vim", "type": "file" }, { - "bom-ref": "ef47ff7c798566a7", + "bom-ref": "5e92c6659dc079d3", "name": "/usr/share/vim/vim91/syntax/ch.vim", "type": "file" }, { - "bom-ref": "50e13404a06fcbb9", + "bom-ref": "ffcb817c36b89cfd", "name": "/usr/share/vim/vim91/syntax/chaiscript.vim", "type": "file" }, { - "bom-ref": "559b3230c1359a8e", + "bom-ref": "619d81ac1b619206", "name": "/usr/share/vim/vim91/syntax/change.vim", "type": "file" }, { - "bom-ref": "415893dfefefe327", + "bom-ref": "443a6c6f4b32d63b", "name": "/usr/share/vim/vim91/syntax/changelog.vim", "type": "file" }, { - "bom-ref": "68c4e0a43af071bb", + "bom-ref": "753929ff5a8d3ba3", "name": "/usr/share/vim/vim91/syntax/chaskell.vim", "type": "file" }, { - "bom-ref": "ccb5195ec35ae03b", + "bom-ref": "c6fd14a30c42409f", "name": "/usr/share/vim/vim91/syntax/chatito.vim", "type": "file" }, { - "bom-ref": "f5c1504b1cb94379", + "bom-ref": "d69300c2bd2d2055", "name": "/usr/share/vim/vim91/syntax/cheetah.vim", "type": "file" }, { - "bom-ref": "56ae95c663fcc227", + "bom-ref": "596270a51440b44b", "name": "/usr/share/vim/vim91/syntax/chicken.vim", "type": "file" }, { - "bom-ref": "14a9969e729b9fb7", + "bom-ref": "1a0202af236098b7", "name": "/usr/share/vim/vim91/syntax/chill.vim", "type": "file" }, { - "bom-ref": "01f304af2184a415", + "bom-ref": "58f31653e91b5471", "name": "/usr/share/vim/vim91/syntax/chordpro.vim", "type": "file" }, { - "bom-ref": "d4ee7a20ce3042d9", + "bom-ref": "eab923e76573764d", "name": "/usr/share/vim/vim91/syntax/cl.vim", "type": "file" }, { - "bom-ref": "f8285b57b7b6cb12", + "bom-ref": "f7300c29e3086a76", "name": "/usr/share/vim/vim91/syntax/clean.vim", "type": "file" }, { - "bom-ref": "541494ee595e96d2", + "bom-ref": "4410812ca617fdb2", "name": "/usr/share/vim/vim91/syntax/clipper.vim", "type": "file" }, { - "bom-ref": "269a476dc4b813e8", + "bom-ref": "66c07d4708b00f78", "name": "/usr/share/vim/vim91/syntax/clojure.vim", "type": "file" }, { - "bom-ref": "c4f8ac2e5eda8fe8", + "bom-ref": "bbbdcf79fbefb7c0", "name": "/usr/share/vim/vim91/syntax/cmake.vim", "type": "file" }, { - "bom-ref": "46fd69c4727fc1ff", + "bom-ref": "b1b2f3111e2f6e57", "name": "/usr/share/vim/vim91/syntax/cmod.vim", "type": "file" }, { - "bom-ref": "9fe622b20974ab2f", + "bom-ref": "06758d3d5f8e52a7", "name": "/usr/share/vim/vim91/syntax/cmusrc.vim", "type": "file" }, { - "bom-ref": "603eab3d240371cc", + "bom-ref": "a622f69f135bce20", "name": "/usr/share/vim/vim91/syntax/cobol.vim", "type": "file" }, { - "bom-ref": "a2de97e8ae09aac5", + "bom-ref": "6b1560f1ca67daed", "name": "/usr/share/vim/vim91/syntax/coco.vim", "type": "file" }, { - "bom-ref": "399ad94379adbcce", + "bom-ref": "c7c13c3569c74ff2", "name": "/usr/share/vim/vim91/syntax/colortest.vim", "type": "file" }, { - "bom-ref": "fd947fff268aa089", + "bom-ref": "8f9f41149db53ad1", "name": "/usr/share/vim/vim91/syntax/conaryrecipe.vim", "type": "file" }, { - "bom-ref": "cc75d157bf29c616", + "bom-ref": "7ac43fc7644259d6", "name": "/usr/share/vim/vim91/syntax/conf.vim", "type": "file" }, { - "bom-ref": "d431dede791c37ac", + "bom-ref": "4639dbe41461df80", "name": "/usr/share/vim/vim91/syntax/config.vim", "type": "file" }, { - "bom-ref": "784dc1af5e270125", + "bom-ref": "469c706c02fdd265", "name": "/usr/share/vim/vim91/syntax/confini.vim", "type": "file" }, { - "bom-ref": "0bbb2b4f648b34b4", + "bom-ref": "84698ed1b7daddf8", "name": "/usr/share/vim/vim91/syntax/context.vim", "type": "file" }, { - "bom-ref": "c6d9315924d3d2e2", + "bom-ref": "24a1774ed8593816", "name": "/usr/share/vim/vim91/syntax/cpp.vim", "type": "file" }, { - "bom-ref": "9d610f38e939234c", + "bom-ref": "e5507dea5f1f3194", "name": "/usr/share/vim/vim91/syntax/crm.vim", "type": "file" }, { - "bom-ref": "ddf0c84c1cb38686", + "bom-ref": "7cd6166460904386", "name": "/usr/share/vim/vim91/syntax/crontab.vim", "type": "file" }, { - "bom-ref": "e180df95e429d1e2", + "bom-ref": "4a20cd886233beae", "name": "/usr/share/vim/vim91/syntax/cs.vim", "type": "file" }, { - "bom-ref": "27ebf96855db29b0", + "bom-ref": "23761b628098a27c", "name": "/usr/share/vim/vim91/syntax/csc.vim", "type": "file" }, { - "bom-ref": "bea53f706d5536cb", + "bom-ref": "502a49d3eddea52b", "name": "/usr/share/vim/vim91/syntax/csdl.vim", "type": "file" }, { - "bom-ref": "4caae38c97d8af0c", + "bom-ref": "f2f9199b14c73fe8", "name": "/usr/share/vim/vim91/syntax/csh.vim", "type": "file" }, { - "bom-ref": "3d4337402e51b0a5", + "bom-ref": "cdead9b6e738d381", "name": "/usr/share/vim/vim91/syntax/csp.vim", "type": "file" }, { - "bom-ref": "3023da06f8fe327f", + "bom-ref": "e6ffcd9bccfb403b", "name": "/usr/share/vim/vim91/syntax/css.vim", "type": "file" }, { - "bom-ref": "3e2becae0a7fae49", + "bom-ref": "098026159dc5e3cd", "name": "/usr/share/vim/vim91/syntax/cterm.vim", "type": "file" }, { - "bom-ref": "4f7510422106eec6", + "bom-ref": "26dfd7f8530214e2", "name": "/usr/share/vim/vim91/syntax/ctrlh.vim", "type": "file" }, { - "bom-ref": "badacbcfd7e1eb81", + "bom-ref": "87bc1c5b8ac0faad", "name": "/usr/share/vim/vim91/syntax/cucumber.vim", "type": "file" }, { - "bom-ref": "f9d64405e79dc836", + "bom-ref": "ebcae48c68342ec2", "name": "/usr/share/vim/vim91/syntax/cuda.vim", "type": "file" }, { - "bom-ref": "c86c5a3ef478e8fb", + "bom-ref": "135cee66cb527a67", "name": "/usr/share/vim/vim91/syntax/cupl.vim", "type": "file" }, { - "bom-ref": "f025ee5247d20beb", + "bom-ref": "3e7753ffb6a535bb", "name": "/usr/share/vim/vim91/syntax/cuplsim.vim", "type": "file" }, { - "bom-ref": "2a3e89b5467cf5ff", + "bom-ref": "226eb3e8ac84402f", "name": "/usr/share/vim/vim91/syntax/cvs.vim", "type": "file" }, { - "bom-ref": "b1d36e976f205dba", + "bom-ref": "34da7d35d3af0592", "name": "/usr/share/vim/vim91/syntax/cvsrc.vim", "type": "file" }, { - "bom-ref": "a100716f4f35fd32", + "bom-ref": "ac1a8fe52ad4d77a", "name": "/usr/share/vim/vim91/syntax/cweb.vim", "type": "file" }, { - "bom-ref": "d73c69ae656b936b", + "bom-ref": "06f0dea3aec885ef", "name": "/usr/share/vim/vim91/syntax/cynlib.vim", "type": "file" }, { - "bom-ref": "9316e5d134aeaeec", + "bom-ref": "8ad1744567fd6908", "name": "/usr/share/vim/vim91/syntax/cynpp.vim", "type": "file" }, { - "bom-ref": "08689896a9060223", + "bom-ref": "152f7379573f2cbf", "name": "/usr/share/vim/vim91/syntax/d.vim", "type": "file" }, { - "bom-ref": "0873fba90c8e66fe", + "bom-ref": "2af71a848a3a71ca", "name": "/usr/share/vim/vim91/syntax/dart.vim", "type": "file" }, { - "bom-ref": "35272ae599c7721e", + "bom-ref": "f3f8832ee7443536", "name": "/usr/share/vim/vim91/syntax/datascript.vim", "type": "file" }, { - "bom-ref": "aabda0065f8171f5", + "bom-ref": "e782f22f84fca2e1", "name": "/usr/share/vim/vim91/syntax/dcd.vim", "type": "file" }, { - "bom-ref": "7d69244ce1026726", + "bom-ref": "2f0cf543b2d5fc46", "name": "/usr/share/vim/vim91/syntax/dcl.vim", "type": "file" }, { - "bom-ref": "ca0b23a5e0dfa33d", + "bom-ref": "4c20522caf39035d", "name": "/usr/share/vim/vim91/syntax/deb822sources.vim", "type": "file" }, { - "bom-ref": "af1b33e423d1ccb2", + "bom-ref": "dcce7a9296b40816", "name": "/usr/share/vim/vim91/syntax/debchangelog.vim", "type": "file" }, { - "bom-ref": "5f01677e377b0836", + "bom-ref": "d6499d2a5a3d31ca", "name": "/usr/share/vim/vim91/syntax/debcontrol.vim", "type": "file" }, { - "bom-ref": "5f739f0c829280b8", + "bom-ref": "cbc595a0731f7358", "name": "/usr/share/vim/vim91/syntax/debcopyright.vim", "type": "file" }, { - "bom-ref": "83cff9d503a2fd49", + "bom-ref": "34a5bf8e000d4631", "name": "/usr/share/vim/vim91/syntax/debsources.vim", "type": "file" }, { - "bom-ref": "ab3abbb314fd758c", + "bom-ref": "9713d777f0179f40", "name": "/usr/share/vim/vim91/syntax/def.vim", "type": "file" }, { - "bom-ref": "233e9084e4b73c3f", + "bom-ref": "91076fbb129387a3", "name": "/usr/share/vim/vim91/syntax/denyhosts.vim", "type": "file" }, { - "bom-ref": "dfdbe733d3201796", + "bom-ref": "513455077b29e0ba", "name": "/usr/share/vim/vim91/syntax/dep3patch.vim", "type": "file" }, { - "bom-ref": "5706e0d9d2a19d20", + "bom-ref": "b2ec52a372622ef8", "name": "/usr/share/vim/vim91/syntax/desc.vim", "type": "file" }, { - "bom-ref": "bf69ce8949223189", + "bom-ref": "2fa7c562b799a48d", "name": "/usr/share/vim/vim91/syntax/desktop.vim", "type": "file" }, { - "bom-ref": "c182baf1a83a613f", + "bom-ref": "b1f47e05303f0da7", "name": "/usr/share/vim/vim91/syntax/dictconf.vim", "type": "file" }, { - "bom-ref": "7c63ec7d809c177b", + "bom-ref": "8f64f5fae9cfb9d3", "name": "/usr/share/vim/vim91/syntax/dictdconf.vim", "type": "file" }, { - "bom-ref": "b0d66146398e2296", + "bom-ref": "2d7214a51edaf4ee", "name": "/usr/share/vim/vim91/syntax/diff.vim", "type": "file" }, { - "bom-ref": "ce1f97d8235e3b86", + "bom-ref": "f43672cd4e32012e", "name": "/usr/share/vim/vim91/syntax/dircolors.vim", "type": "file" }, { - "bom-ref": "956024ab039564bc", + "bom-ref": "240dbfd216328864", "name": "/usr/share/vim/vim91/syntax/dirpager.vim", "type": "file" }, { - "bom-ref": "4bf39fb9747b212d", + "bom-ref": "617e91797d11eebd", "name": "/usr/share/vim/vim91/syntax/diva.vim", "type": "file" }, { - "bom-ref": "8d1c657f899b90a9", + "bom-ref": "775ad254d8fdbef9", "name": "/usr/share/vim/vim91/syntax/django.vim", "type": "file" }, { - "bom-ref": "35754afa026aaa58", + "bom-ref": "2d5e4e8ba4c2a3b0", "name": "/usr/share/vim/vim91/syntax/dns.vim", "type": "file" }, { - "bom-ref": "f500664cd41d4589", + "bom-ref": "e5631cff0eb79dd5", "name": "/usr/share/vim/vim91/syntax/dnsmasq.vim", "type": "file" }, { - "bom-ref": "9ad5807be053da45", + "bom-ref": "78d36bd470d4d39d", "name": "/usr/share/vim/vim91/syntax/docbk.vim", "type": "file" }, { - "bom-ref": "6b7c0082a6f352bc", + "bom-ref": "98b6e8b36ffad66c", "name": "/usr/share/vim/vim91/syntax/docbksgml.vim", "type": "file" }, { - "bom-ref": "1e14fbbb4ea93d85", + "bom-ref": "946adf41f3ffbd59", "name": "/usr/share/vim/vim91/syntax/docbkxml.vim", "type": "file" }, { - "bom-ref": "6ff92f9cfb971892", + "bom-ref": "9f773eca469b0736", "name": "/usr/share/vim/vim91/syntax/dockerfile.vim", "type": "file" }, { - "bom-ref": "ee48aa5d9bb32f42", + "bom-ref": "c09333daad6837aa", "name": "/usr/share/vim/vim91/syntax/dosbatch.vim", "type": "file" }, { - "bom-ref": "aa8adc4af76b6b50", + "bom-ref": "feb64cfe85b50e10", "name": "/usr/share/vim/vim91/syntax/dosini.vim", "type": "file" }, { - "bom-ref": "4a13abf3217cf9d0", + "bom-ref": "3330a2b437e425cc", "name": "/usr/share/vim/vim91/syntax/dot.vim", "type": "file" }, { - "bom-ref": "0c93a8ca8ff2e8dc", + "bom-ref": "e743d864b6f0d394", "name": "/usr/share/vim/vim91/syntax/doxygen.vim", "type": "file" }, { - "bom-ref": "3f85c278b509c938", + "bom-ref": "ace58d6abb45c480", "name": "/usr/share/vim/vim91/syntax/dracula.vim", "type": "file" }, { - "bom-ref": "7800123af7e3492c", + "bom-ref": "20de52b0db3b9544", "name": "/usr/share/vim/vim91/syntax/dsl.vim", "type": "file" }, { - "bom-ref": "d23eb726c672e850", + "bom-ref": "b7ec054065679efc", "name": "/usr/share/vim/vim91/syntax/dtd.vim", "type": "file" }, { - "bom-ref": "a7ea0c8cc5cd68a2", + "bom-ref": "92e9a96298eafa3a", "name": "/usr/share/vim/vim91/syntax/dtml.vim", "type": "file" }, { - "bom-ref": "a48fac74bb4e6b54", + "bom-ref": "7932d940362267e4", "name": "/usr/share/vim/vim91/syntax/dtrace.vim", "type": "file" }, { - "bom-ref": "57d24a9dd3e81e8e", + "bom-ref": "a409c97eaf6de966", "name": "/usr/share/vim/vim91/syntax/dts.vim", "type": "file" }, { - "bom-ref": "b440cdc32e6fc406", + "bom-ref": "ec99c9ce7081172e", "name": "/usr/share/vim/vim91/syntax/dune.vim", "type": "file" }, { - "bom-ref": "e715df1b01fc7013", + "bom-ref": "b0c4f167f132b0fb", "name": "/usr/share/vim/vim91/syntax/dylan.vim", "type": "file" }, { - "bom-ref": "6fa7f19cea780c78", + "bom-ref": "e70eb5ca2a0d1f3c", "name": "/usr/share/vim/vim91/syntax/dylanintr.vim", "type": "file" }, { - "bom-ref": "b1cedd9ddf1db356", + "bom-ref": "d3ec9568e290a7ee", "name": "/usr/share/vim/vim91/syntax/dylanlid.vim", "type": "file" }, { - "bom-ref": "859e3e859b903f2e", + "bom-ref": "ef7e9972d4bf5572", "name": "/usr/share/vim/vim91/syntax/ecd.vim", "type": "file" }, { - "bom-ref": "80e237cf0f936c80", + "bom-ref": "bf39b3527b599508", "name": "/usr/share/vim/vim91/syntax/edif.vim", "type": "file" }, { - "bom-ref": "dafddddb71cf1762", + "bom-ref": "5660715289ccf79a", "name": "/usr/share/vim/vim91/syntax/editorconfig.vim", "type": "file" }, { - "bom-ref": "af51c25957d8d5f8", + "bom-ref": "30f8aa4f830294a4", "name": "/usr/share/vim/vim91/syntax/eiffel.vim", "type": "file" }, { - "bom-ref": "d79ea9a2b809f2d0", + "bom-ref": "b9af9a9a4e700178", "name": "/usr/share/vim/vim91/syntax/elf.vim", "type": "file" }, { - "bom-ref": "3d20f4dbf378afd5", + "bom-ref": "af01f32a5448fc61", "name": "/usr/share/vim/vim91/syntax/elinks.vim", "type": "file" }, { - "bom-ref": "41f847026398fb4e", + "bom-ref": "c6e88382f282394a", "name": "/usr/share/vim/vim91/syntax/elm.vim", "type": "file" }, { - "bom-ref": "f87fce1fde3f18c2", + "bom-ref": "b673666c86718b82", "name": "/usr/share/vim/vim91/syntax/elmfilt.vim", "type": "file" }, { - "bom-ref": "55773b55270ec4d7", + "bom-ref": "5f0ed4310783d09b", "name": "/usr/share/vim/vim91/syntax/erlang.vim", "type": "file" }, { - "bom-ref": "5f5e0dc901db23a1", + "bom-ref": "3eac87900f2278f9", "name": "/usr/share/vim/vim91/syntax/eruby.vim", "type": "file" }, { - "bom-ref": "fbafca9ecd774ed7", + "bom-ref": "d4652e332b95606b", "name": "/usr/share/vim/vim91/syntax/esmtprc.vim", "type": "file" }, { - "bom-ref": "06e652bf004bd586", + "bom-ref": "154a0cd13ce1b8ce", "name": "/usr/share/vim/vim91/syntax/esqlc.vim", "type": "file" }, { - "bom-ref": "309e4533173e7a8b", + "bom-ref": "6a6663fb99d5d163", "name": "/usr/share/vim/vim91/syntax/esterel.vim", "type": "file" }, { - "bom-ref": "b17543ee3cd130b7", + "bom-ref": "073c8287bd86eb77", "name": "/usr/share/vim/vim91/syntax/eterm.vim", "type": "file" }, { - "bom-ref": "6bb8a3c3fb14fea2", + "bom-ref": "3a26639e1cb111aa", "name": "/usr/share/vim/vim91/syntax/euphoria3.vim", "type": "file" }, { - "bom-ref": "fcfbd523c6d1560f", + "bom-ref": "71d152af55992fd3", "name": "/usr/share/vim/vim91/syntax/euphoria4.vim", "type": "file" }, { - "bom-ref": "1b5672a6eee87abd", + "bom-ref": "540947fb55008e89", "name": "/usr/share/vim/vim91/syntax/eviews.vim", "type": "file" }, { - "bom-ref": "759e3f274c1015ed", + "bom-ref": "2adef9c01afd6359", "name": "/usr/share/vim/vim91/syntax/exim.vim", "type": "file" }, { - "bom-ref": "60cdb09d4ca76c83", + "bom-ref": "051bda1bd84f3a03", "name": "/usr/share/vim/vim91/syntax/expect.vim", "type": "file" }, { - "bom-ref": "2814570cf254f6f1", + "bom-ref": "ecba7b044623d9e5", "name": "/usr/share/vim/vim91/syntax/exports.vim", "type": "file" }, { - "bom-ref": "5fe3146c2006c62e", + "bom-ref": "6b7101f47173fe9e", "name": "/usr/share/vim/vim91/syntax/falcon.vim", "type": "file" }, { - "bom-ref": "5679fcae262fe9c6", + "bom-ref": "8f5bda517bea779e", "name": "/usr/share/vim/vim91/syntax/fan.vim", "type": "file" }, { - "bom-ref": "f82ce6e4bdbb7eb5", + "bom-ref": "e2d62cd93ab9503d", "name": "/usr/share/vim/vim91/syntax/fasm.vim", "type": "file" }, { - "bom-ref": "32e8c74525abe066", + "bom-ref": "d88b0e42b5473962", "name": "/usr/share/vim/vim91/syntax/fdcc.vim", "type": "file" }, { - "bom-ref": "efe51eabd5b59429", + "bom-ref": "9296addd8e019dcd", "name": "/usr/share/vim/vim91/syntax/fetchmail.vim", "type": "file" }, { - "bom-ref": "a446410ac83349fe", + "bom-ref": "a7a8f5a13abca562", "name": "/usr/share/vim/vim91/syntax/fgl.vim", "type": "file" }, { - "bom-ref": "f28847803ca85d1b", + "bom-ref": "3fce946bf309875f", "name": "/usr/share/vim/vim91/syntax/fish.vim", "type": "file" }, { - "bom-ref": "bcfaa85994e40286", + "bom-ref": "c48a81b88307fb56", "name": "/usr/share/vim/vim91/syntax/flexwiki.vim", "type": "file" }, { - "bom-ref": "01e9acc4260123ff", + "bom-ref": "8b5abc0e37e6c22f", "name": "/usr/share/vim/vim91/syntax/focexec.vim", "type": "file" }, { - "bom-ref": "1bd7116f8e6bad40", + "bom-ref": "cae663ae0dfa61dc", "name": "/usr/share/vim/vim91/syntax/form.vim", "type": "file" }, { - "bom-ref": "20d4637da96e3755", + "bom-ref": "48a66fc8acc2edd9", "name": "/usr/share/vim/vim91/syntax/forth.vim", "type": "file" }, { - "bom-ref": "b8b79a94feed5e13", + "bom-ref": "874df4e417fbc817", "name": "/usr/share/vim/vim91/syntax/fortran.vim", "type": "file" }, { - "bom-ref": "d36bf39e9cc13e56", + "bom-ref": "3b852a8760f8f39e", "name": "/usr/share/vim/vim91/syntax/foxpro.vim", "type": "file" }, { - "bom-ref": "083252add22efb48", + "bom-ref": "07e8b1a68d7dba80", "name": "/usr/share/vim/vim91/syntax/fpcmake.vim", "type": "file" }, { - "bom-ref": "1368e1760381edcb", + "bom-ref": "d5321a059475ca93", "name": "/usr/share/vim/vim91/syntax/framescript.vim", "type": "file" }, { - "bom-ref": "fdf6400f45e5a349", + "bom-ref": "9e5184970d62d0d5", "name": "/usr/share/vim/vim91/syntax/freebasic.vim", "type": "file" }, { - "bom-ref": "00ef7d3df44dabcc", + "bom-ref": "bbe8a4dde0f67d60", "name": "/usr/share/vim/vim91/syntax/fstab.vim", "type": "file" }, { - "bom-ref": "043db7261ac087cd", + "bom-ref": "3067a823b96870e5", "name": "/usr/share/vim/vim91/syntax/fvwm.vim", "type": "file" }, { - "bom-ref": "cc90f4b1fa0190a5", + "bom-ref": "d89c2b81208fb485", "name": "/usr/share/vim/vim91/syntax/fvwm2m4.vim", "type": "file" }, { - "bom-ref": "84d8f341288a86a9", + "bom-ref": "c348946a0c59955d", "name": "/usr/share/vim/vim91/syntax/gdb.vim", "type": "file" }, { - "bom-ref": "2177089cd41895f5", + "bom-ref": "2b948b2e4853815d", "name": "/usr/share/vim/vim91/syntax/gdmo.vim", "type": "file" }, { - "bom-ref": "d1d4acb359ca251d", + "bom-ref": "3e14dfc6167f83c1", "name": "/usr/share/vim/vim91/syntax/gdresource.vim", "type": "file" }, { - "bom-ref": "2a2002b0ef09deda", + "bom-ref": "99da9c5bcfb778fe", "name": "/usr/share/vim/vim91/syntax/gdscript.vim", "type": "file" }, { - "bom-ref": "66f5eb2f42f3eb7d", + "bom-ref": "eb5bfa2906088c55", "name": "/usr/share/vim/vim91/syntax/gdshader.vim", "type": "file" }, { - "bom-ref": "4ee3206ab751ec8c", + "bom-ref": "712baebcbbad59a0", "name": "/usr/share/vim/vim91/syntax/gedcom.vim", "type": "file" }, { - "bom-ref": "4094deb77d3d0ce8", + "bom-ref": "5ae6a38ba3d64b50", "name": "/usr/share/vim/vim91/syntax/gemtext.vim", "type": "file" }, { - "bom-ref": "ef632b64aa8608bc", + "bom-ref": "49a1602bd7ed3ec0", "name": "/usr/share/vim/vim91/syntax/gift.vim", "type": "file" }, { - "bom-ref": "de82437c859fedca", + "bom-ref": "441df412228ac482", "name": "/usr/share/vim/vim91/syntax/git.vim", "type": "file" }, { - "bom-ref": "8dbbac7bbeb9f815", + "bom-ref": "93619715c80ea179", "name": "/usr/share/vim/vim91/syntax/gitattributes.vim", "type": "file" }, { - "bom-ref": "fa82cd080a805a1f", + "bom-ref": "b7518cb2c18ad2d3", "name": "/usr/share/vim/vim91/syntax/gitcommit.vim", "type": "file" }, { - "bom-ref": "52d2975626be5e67", + "bom-ref": "f34e535e47a1f987", "name": "/usr/share/vim/vim91/syntax/gitconfig.vim", "type": "file" }, { - "bom-ref": "7dcc07a86694e890", + "bom-ref": "1041eb9f925decbc", "name": "/usr/share/vim/vim91/syntax/gitignore.vim", "type": "file" }, { - "bom-ref": "e10432465db9973f", + "bom-ref": "8628dd2a0fe98edb", "name": "/usr/share/vim/vim91/syntax/gitolite.vim", "type": "file" }, { - "bom-ref": "d8772a4c0bf01840", + "bom-ref": "b76bec30fcfeeae0", "name": "/usr/share/vim/vim91/syntax/gitrebase.vim", "type": "file" }, { - "bom-ref": "55e25fdd9779529c", + "bom-ref": "bc42e0013e1d8030", "name": "/usr/share/vim/vim91/syntax/gitsendemail.vim", "type": "file" }, { - "bom-ref": "6e52263f611fa1ff", + "bom-ref": "67ae1e1e633c15ef", "name": "/usr/share/vim/vim91/syntax/gkrellmrc.vim", "type": "file" }, { - "bom-ref": "5f50e4453cd0d606", + "bom-ref": "ab2b7ad242195c4e", "name": "/usr/share/vim/vim91/syntax/gnash.vim", "type": "file" }, { - "bom-ref": "d79bc6df7de9b163", + "bom-ref": "5515574d4e30487b", "name": "/usr/share/vim/vim91/syntax/gnuplot.vim", "type": "file" }, { - "bom-ref": "e4b63e832fbf33cb", + "bom-ref": "56bef68aaf3b2777", "name": "/usr/share/vim/vim91/syntax/go.vim", "type": "file" }, { - "bom-ref": "cf43b10b87caefae", + "bom-ref": "229bbd44b320ca66", "name": "/usr/share/vim/vim91/syntax/godoc.vim", "type": "file" }, { - "bom-ref": "1ebd736e3af7dea4", + "bom-ref": "ff9f92024c42c02c", "name": "/usr/share/vim/vim91/syntax/gp.vim", "type": "file" }, { - "bom-ref": "4ac28d73dabf7f19", + "bom-ref": "311c2b9243c7d625", "name": "/usr/share/vim/vim91/syntax/gpg.vim", "type": "file" }, { - "bom-ref": "e5b8ef77d7f6ec44", + "bom-ref": "74225c876abcb730", "name": "/usr/share/vim/vim91/syntax/gprof.vim", "type": "file" }, { - "bom-ref": "3194e3f361146ea3", + "bom-ref": "2b8121b3f8f7a38f", "name": "/usr/share/vim/vim91/syntax/grads.vim", "type": "file" }, { - "bom-ref": "c77fe0c36829019a", + "bom-ref": "681c003392c6cb7e", "name": "/usr/share/vim/vim91/syntax/gretl.vim", "type": "file" }, { - "bom-ref": "fd223d0e33063cdd", + "bom-ref": "7be21374af009001", "name": "/usr/share/vim/vim91/syntax/groff.vim", "type": "file" }, { - "bom-ref": "aed281d5be6fe89e", + "bom-ref": "4cb24551537b5f4e", "name": "/usr/share/vim/vim91/syntax/groovy.vim", "type": "file" }, { - "bom-ref": "c40c0670b82ee238", + "bom-ref": "e53e639c5293eb90", "name": "/usr/share/vim/vim91/syntax/group.vim", "type": "file" }, { - "bom-ref": "69cf90472add24a2", + "bom-ref": "765349826e1cf366", "name": "/usr/share/vim/vim91/syntax/grub.vim", "type": "file" }, { - "bom-ref": "5ee78b15dc8bd74e", + "bom-ref": "ebc3d38e2828941e", "name": "/usr/share/vim/vim91/syntax/gsp.vim", "type": "file" }, { - "bom-ref": "06bbf35f42812d05", + "bom-ref": "fe4da07f996ba181", "name": "/usr/share/vim/vim91/syntax/gtkrc.vim", "type": "file" }, { - "bom-ref": "3cb08310704640d2", + "bom-ref": "1b74a51869c6a22e", "name": "/usr/share/vim/vim91/syntax/gvpr.vim", "type": "file" }, { - "bom-ref": "0acd008a3ad64036", + "bom-ref": "ce4ad8f90ac98266", "name": "/usr/share/vim/vim91/syntax/gyp.vim", "type": "file" }, { - "bom-ref": "2d6fffba3bd5fbe0", + "bom-ref": "a5e3253bccc2eecc", "name": "/usr/share/vim/vim91/syntax/haml.vim", "type": "file" }, { - "bom-ref": "34e3fba5189011ae", + "bom-ref": "cfe04debf37b86e6", "name": "/usr/share/vim/vim91/syntax/hamster.vim", "type": "file" }, { - "bom-ref": "de020a92eb94b93e", + "bom-ref": "21db6433b64af766", "name": "/usr/share/vim/vim91/syntax/hare.vim", "type": "file" }, { - "bom-ref": "3be02acb728bd7ca", + "bom-ref": "e04d36c4617978aa", "name": "/usr/share/vim/vim91/syntax/haskell.vim", "type": "file" }, { - "bom-ref": "6861bc45c9284979", + "bom-ref": "ea6b774a46d61471", "name": "/usr/share/vim/vim91/syntax/haste.vim", "type": "file" }, { - "bom-ref": "c596290d13ba66c0", + "bom-ref": "3afc75d335becd0c", "name": "/usr/share/vim/vim91/syntax/hastepreproc.vim", "type": "file" }, { - "bom-ref": "9d864806f5858c6a", + "bom-ref": "238f7b126a45df7a", "name": "/usr/share/vim/vim91/syntax/hb.vim", "type": "file" }, { - "bom-ref": "640f1944ce35f9d7", + "bom-ref": "897e4b84055cadbb", "name": "/usr/share/vim/vim91/syntax/help.vim", "type": "file" }, { - "bom-ref": "f9862aaf900349a7", + "bom-ref": "f8b4969b9361c0eb", "name": "/usr/share/vim/vim91/syntax/help_ru.vim", "type": "file" }, { - "bom-ref": "5d4e105fee5952e7", + "bom-ref": "37e50fdcc71d35af", "name": "/usr/share/vim/vim91/syntax/hercules.vim", "type": "file" }, { - "bom-ref": "2aaad589e9e0c585", + "bom-ref": "a5e4a990fd0d5795", "name": "/usr/share/vim/vim91/syntax/hex.vim", "type": "file" }, { - "bom-ref": "bc3ff997599edbc2", + "bom-ref": "d8d398ecbdbd9df6", "name": "/usr/share/vim/vim91/syntax/hgcommit.vim", "type": "file" }, { - "bom-ref": "0b6e0437da617047", + "bom-ref": "45b402eedbd41bcb", "name": "/usr/share/vim/vim91/syntax/hitest.vim", "type": "file" }, { - "bom-ref": "4962b0ca34e6e2e4", + "bom-ref": "04a2b2fdee2b6100", "name": "/usr/share/vim/vim91/syntax/hlsplaylist.vim", "type": "file" }, { - "bom-ref": "85ff6b5ac6a7cba6", + "bom-ref": "f6560c1abd2d6bb2", "name": "/usr/share/vim/vim91/syntax/hog.vim", "type": "file" }, { - "bom-ref": "328fcb8d3b233901", + "bom-ref": "e6d6212ff04f5f21", "name": "/usr/share/vim/vim91/syntax/hollywood.vim", "type": "file" }, { - "bom-ref": "a2915a70dcec60d2", + "bom-ref": "5822091203391ca2", "name": "/usr/share/vim/vim91/syntax/hostconf.vim", "type": "file" }, { - "bom-ref": "581d282a80748e41", + "bom-ref": "605d6402932fedf9", "name": "/usr/share/vim/vim91/syntax/hostsaccess.vim", "type": "file" }, { - "bom-ref": "5bbf6d5e4bdde9b9", + "bom-ref": "a056cb83511775bd", "name": "/usr/share/vim/vim91/syntax/html.vim", "type": "file" }, { - "bom-ref": "ad847b08ccc7632c", + "bom-ref": "4d85a7238d80c8d4", "name": "/usr/share/vim/vim91/syntax/htmlcheetah.vim", "type": "file" }, { - "bom-ref": "bd3dfec4d83b5fa1", + "bom-ref": "4a7eeea159dc16b5", "name": "/usr/share/vim/vim91/syntax/htmldjango.vim", "type": "file" }, { - "bom-ref": "2a8c21f5e64df990", + "bom-ref": "8101770719a2cad8", "name": "/usr/share/vim/vim91/syntax/htmlm4.vim", "type": "file" }, { - "bom-ref": "8d7d30cbdf4670a4", + "bom-ref": "6249a9acf7ef37e0", "name": "/usr/share/vim/vim91/syntax/htmlos.vim", "type": "file" }, { - "bom-ref": "c11bdc6a10f5f335", + "bom-ref": "d60144e60ff22c65", "name": "/usr/share/vim/vim91/syntax/i3config.vim", "type": "file" }, { - "bom-ref": "65214b3dfa64bc09", + "bom-ref": "08dc374f9a44cd75", "name": "/usr/share/vim/vim91/syntax/ia64.vim", "type": "file" }, { - "bom-ref": "8740fc6b4c8397f1", + "bom-ref": "cdd1c8016997fd81", "name": "/usr/share/vim/vim91/syntax/ibasic.vim", "type": "file" }, { - "bom-ref": "5930bb00ff54a1b9", + "bom-ref": "e80ba08de13eac29", "name": "/usr/share/vim/vim91/syntax/icemenu.vim", "type": "file" }, { - "bom-ref": "bb5daca678a0d271", + "bom-ref": "e95593bb3205c159", "name": "/usr/share/vim/vim91/syntax/icon.vim", "type": "file" }, { - "bom-ref": "7e20c8f2757f71c7", + "bom-ref": "0026e46cdb0e684f", "name": "/usr/share/vim/vim91/syntax/idl.vim", "type": "file" }, { - "bom-ref": "9eb65834c6572107", + "bom-ref": "49c37a2423d441b7", "name": "/usr/share/vim/vim91/syntax/idlang.vim", "type": "file" }, { - "bom-ref": "cd30fde0a8655e0e", + "bom-ref": "d07b552fae5819be", "name": "/usr/share/vim/vim91/syntax/indent.vim", "type": "file" }, { - "bom-ref": "f05ee10bdf5e8c7d", + "bom-ref": "dd4d323a17f94805", "name": "/usr/share/vim/vim91/syntax/inform.vim", "type": "file" }, { - "bom-ref": "dd47a7125ba89aa0", + "bom-ref": "02994a6383735b0c", "name": "/usr/share/vim/vim91/syntax/initex.vim", "type": "file" }, { - "bom-ref": "eae0991a77629c8e", + "bom-ref": "57e12ed9fbe9f3de", "name": "/usr/share/vim/vim91/syntax/initng.vim", "type": "file" }, { - "bom-ref": "3acf4d79412871b5", + "bom-ref": "0152d50c3a019955", "name": "/usr/share/vim/vim91/syntax/inittab.vim", "type": "file" }, { - "bom-ref": "0eb213cf1ae4895c", + "bom-ref": "98c32d5011480c40", "name": "/usr/share/vim/vim91/syntax/ipfilter.vim", "type": "file" }, { - "bom-ref": "43c69991b979f896", + "bom-ref": "3697f28714d3ee82", "name": "/usr/share/vim/vim91/syntax/ishd.vim", "type": "file" }, { - "bom-ref": "719d17041f823425", + "bom-ref": "45bbfad4c062f44d", "name": "/usr/share/vim/vim91/syntax/iss.vim", "type": "file" }, { - "bom-ref": "c0e7c002aa7f7269", + "bom-ref": "00f8542c6241eb6d", "name": "/usr/share/vim/vim91/syntax/ist.vim", "type": "file" }, { - "bom-ref": "142810c5d9f6dc37", + "bom-ref": "b951ed4cf54a73e3", "name": "/usr/share/vim/vim91/syntax/j.vim", "type": "file" }, { - "bom-ref": "9944eeb810863232", + "bom-ref": "f8bcfd8c6872efae", "name": "/usr/share/vim/vim91/syntax/jal.vim", "type": "file" }, { - "bom-ref": "7bc3a91e57d64d6d", + "bom-ref": "3915b18f36660b45", "name": "/usr/share/vim/vim91/syntax/jam.vim", "type": "file" }, { - "bom-ref": "fc302edceb4d1c74", + "bom-ref": "d9637723a7cb02ac", "name": "/usr/share/vim/vim91/syntax/jargon.vim", "type": "file" }, { - "bom-ref": "3e14d1779fd518e3", + "bom-ref": "9b633f228682907b", "name": "/usr/share/vim/vim91/syntax/java.vim", "type": "file" }, { - "bom-ref": "5f5e823bf4a83d17", + "bom-ref": "f34bff0af738bf07", "name": "/usr/share/vim/vim91/syntax/javacc.vim", "type": "file" }, { - "bom-ref": "85bc790e5a0cf828", + "bom-ref": "842537aa404c0e94", "name": "/usr/share/vim/vim91/syntax/javascript.vim", "type": "file" }, { - "bom-ref": "adcdcc12c7ca0bd6", + "bom-ref": "7265c204e25666ce", "name": "/usr/share/vim/vim91/syntax/javascriptreact.vim", "type": "file" }, { - "bom-ref": "45a3f63beee30f87", + "bom-ref": "be6c5ec71d83a5a7", "name": "/usr/share/vim/vim91/syntax/jess.vim", "type": "file" }, { - "bom-ref": "139550fd7b28a3cf", + "bom-ref": "69a02093896527eb", "name": "/usr/share/vim/vim91/syntax/jgraph.vim", "type": "file" }, { - "bom-ref": "e17213452005d5b7", + "bom-ref": "a7b20ad740e202df", "name": "/usr/share/vim/vim91/syntax/jovial.vim", "type": "file" }, { - "bom-ref": "618804ab5512bee8", + "bom-ref": "3dff2d7116ab7dcc", "name": "/usr/share/vim/vim91/syntax/jproperties.vim", "type": "file" }, { - "bom-ref": "cb86efa931078e38", + "bom-ref": "95c4a9c8e1964c38", "name": "/usr/share/vim/vim91/syntax/json.vim", "type": "file" }, { - "bom-ref": "4302a63da5f57e02", + "bom-ref": "79dd597d4fc2694a", "name": "/usr/share/vim/vim91/syntax/json5.vim", "type": "file" }, { - "bom-ref": "bcfbb2442257cb2c", + "bom-ref": "0632d0b13cc96a8c", "name": "/usr/share/vim/vim91/syntax/jsonc.vim", "type": "file" }, { - "bom-ref": "f3fa8dfd4c7ada4d", + "bom-ref": "bab7701741e97dc5", "name": "/usr/share/vim/vim91/syntax/jsp.vim", "type": "file" }, { - "bom-ref": "4b897b598c21dc87", + "bom-ref": "e1898a877048a283", "name": "/usr/share/vim/vim91/syntax/julia.vim", "type": "file" }, { - "bom-ref": "8222e9ee9ee2efb3", + "bom-ref": "1237c52fcacfa293", "name": "/usr/share/vim/vim91/syntax/kconfig.vim", "type": "file" }, { - "bom-ref": "15fcac80769eccd5", + "bom-ref": "b8ae7e87d2f2a3cd", "name": "/usr/share/vim/vim91/syntax/kivy.vim", "type": "file" }, { - "bom-ref": "29de092086ff049b", + "bom-ref": "428e2016e7110edb", "name": "/usr/share/vim/vim91/syntax/kix.vim", "type": "file" }, { - "bom-ref": "d2fc61df70de6743", + "bom-ref": "eb0497cc23166943", "name": "/usr/share/vim/vim91/syntax/kotlin.vim", "type": "file" }, { - "bom-ref": "2beeee9e09e1005a", + "bom-ref": "fbcb119964d9a71a", "name": "/usr/share/vim/vim91/syntax/krl.vim", "type": "file" }, { - "bom-ref": "e9f91b3ea8fdd961", + "bom-ref": "1f3596b3fcecf405", "name": "/usr/share/vim/vim91/syntax/kscript.vim", "type": "file" }, { - "bom-ref": "bfa3916baea677ed", + "bom-ref": "c5a9f906c3ba7cad", "name": "/usr/share/vim/vim91/syntax/kwt.vim", "type": "file" }, { - "bom-ref": "076c06ded972ecf2", + "bom-ref": "dc8a1f5f0736a88a", "name": "/usr/share/vim/vim91/syntax/lace.vim", "type": "file" }, { - "bom-ref": "80bf20b840db46a0", + "bom-ref": "8168e99389545d74", "name": "/usr/share/vim/vim91/syntax/latte.vim", "type": "file" }, { - "bom-ref": "7b00d64eff7b975a", + "bom-ref": "55aab462de5385c2", "name": "/usr/share/vim/vim91/syntax/lc.vim", "type": "file" }, { - "bom-ref": "edede60ca207909a", + "bom-ref": "e23eed6853740562", "name": "/usr/share/vim/vim91/syntax/ld.vim", "type": "file" }, { - "bom-ref": "e47cda133b503bd7", + "bom-ref": "df4f2610c88f7feb", "name": "/usr/share/vim/vim91/syntax/ldapconf.vim", "type": "file" }, { - "bom-ref": "d79bf25a6bbcb344", + "bom-ref": "a22d392aa75da380", "name": "/usr/share/vim/vim91/syntax/ldif.vim", "type": "file" }, { - "bom-ref": "0c6a0d4d987ab158", + "bom-ref": "6cfb7d82933d9c8c", "name": "/usr/share/vim/vim91/syntax/less.vim", "type": "file" }, { - "bom-ref": "1fefe49a2d515e2d", + "bom-ref": "cca9bc8addaa2541", "name": "/usr/share/vim/vim91/syntax/lex.vim", "type": "file" }, { - "bom-ref": "8836d16ec663895c", + "bom-ref": "6c08c63bbb29c020", "name": "/usr/share/vim/vim91/syntax/lftp.vim", "type": "file" }, { - "bom-ref": "e39b2b24ab0d1d76", + "bom-ref": "53f474dd30a51806", "name": "/usr/share/vim/vim91/syntax/lhaskell.vim", "type": "file" }, { - "bom-ref": "509e96323ce87b44", + "bom-ref": "ee044f68b9d487d0", "name": "/usr/share/vim/vim91/syntax/libao.vim", "type": "file" }, { - "bom-ref": "9cd254b63b4624c5", + "bom-ref": "9fa2130d74d4a4e1", "name": "/usr/share/vim/vim91/syntax/lifelines.vim", "type": "file" }, { - "bom-ref": "89c19e5d6671ae27", + "bom-ref": "67b9bd98df6e1d57", "name": "/usr/share/vim/vim91/syntax/lilo.vim", "type": "file" }, { - "bom-ref": "e95521a69d666c09", + "bom-ref": "d7b20ae5a75fee0d", "name": "/usr/share/vim/vim91/syntax/limits.vim", "type": "file" }, { - "bom-ref": "9def918f1a552804", + "bom-ref": "47315143aae3af68", "name": "/usr/share/vim/vim91/syntax/liquid.vim", "type": "file" }, { - "bom-ref": "b8b360be9d842b6d", + "bom-ref": "fdf2332c08d7c9c1", "name": "/usr/share/vim/vim91/syntax/lisp.vim", "type": "file" }, { - "bom-ref": "de05437d2f76ec4e", + "bom-ref": "8ec40c3328a1ac4e", "name": "/usr/share/vim/vim91/syntax/lite.vim", "type": "file" }, { - "bom-ref": "3ed6063f26575212", + "bom-ref": "120b41319feaa996", "name": "/usr/share/vim/vim91/syntax/litestep.vim", "type": "file" }, { - "bom-ref": "4375c0d1a2581d39", + "bom-ref": "e2716482cdcb7539", "name": "/usr/share/vim/vim91/syntax/livebook.vim", "type": "file" }, { - "bom-ref": "2c6caaf0bfa80db1", + "bom-ref": "96537d2503a1d965", "name": "/usr/share/vim/vim91/syntax/loginaccess.vim", "type": "file" }, { - "bom-ref": "58c2c176bc1ae6a4", + "bom-ref": "42cb223e19381838", "name": "/usr/share/vim/vim91/syntax/logindefs.vim", "type": "file" }, { - "bom-ref": "7fdec4d2466588d1", + "bom-ref": "ba5192aa1dd7b3b9", "name": "/usr/share/vim/vim91/syntax/logtalk.vim", "type": "file" }, { - "bom-ref": "b0ed03dbcc7056cd", + "bom-ref": "2d051ebc33f91c09", "name": "/usr/share/vim/vim91/syntax/lotos.vim", "type": "file" }, { - "bom-ref": "6ae8cbd2ceae2cf3", + "bom-ref": "5fcedf36a25874f3", "name": "/usr/share/vim/vim91/syntax/lout.vim", "type": "file" }, { - "bom-ref": "c4d3e9037aad44ad", + "bom-ref": "6c1fc5fd5d0c2a01", "name": "/usr/share/vim/vim91/syntax/lpc.vim", "type": "file" }, { - "bom-ref": "e70e1c2ccd67ab74", + "bom-ref": "8ac04913952d9ed4", "name": "/usr/share/vim/vim91/syntax/lprolog.vim", "type": "file" }, { - "bom-ref": "132dfde8ffb72e80", + "bom-ref": "1853a5b84f250b3c", "name": "/usr/share/vim/vim91/syntax/lscript.vim", "type": "file" }, { - "bom-ref": "9d838e05be4090dc", + "bom-ref": "7fd5a418a42783a4", "name": "/usr/share/vim/vim91/syntax/lsl.vim", "type": "file" }, { - "bom-ref": "03b99ed515802357", + "bom-ref": "ed6e7b3f92fa2633", "name": "/usr/share/vim/vim91/syntax/lss.vim", "type": "file" }, { - "bom-ref": "2aa4732545d72997", + "bom-ref": "fe3060e6da3b9fd7", "name": "/usr/share/vim/vim91/syntax/lua.vim", "type": "file" }, { - "bom-ref": "ef0482404d0ebe82", + "bom-ref": "d523c1873fabf1d6", "name": "/usr/share/vim/vim91/syntax/luau.vim", "type": "file" }, { - "bom-ref": "f97c74595d867636", + "bom-ref": "b37c3e608567caaa", "name": "/usr/share/vim/vim91/syntax/lynx.vim", "type": "file" }, { - "bom-ref": "d4a99f04f836d5fb", + "bom-ref": "789f158c302d7ab7", "name": "/usr/share/vim/vim91/syntax/lyrics.vim", "type": "file" }, { - "bom-ref": "c43f1e73270f61dd", + "bom-ref": "eccb58162318b521", "name": "/usr/share/vim/vim91/syntax/m3build.vim", "type": "file" }, { - "bom-ref": "0d01400b1693aa48", + "bom-ref": "5f9f7b3b4c6f0808", "name": "/usr/share/vim/vim91/syntax/m3quake.vim", "type": "file" }, { - "bom-ref": "7b82994c25b235f5", + "bom-ref": "275fa29d229bec3d", "name": "/usr/share/vim/vim91/syntax/m4.vim", "type": "file" }, { - "bom-ref": "aafc3671cd13a69b", + "bom-ref": "2fbd779bd985886f", "name": "/usr/share/vim/vim91/syntax/mail.vim", "type": "file" }, { - "bom-ref": "fbfe9225dab398ee", + "bom-ref": "d446176a1a6d91ba", "name": "/usr/share/vim/vim91/syntax/mailaliases.vim", "type": "file" }, { - "bom-ref": "4f14125ea92dfc2f", + "bom-ref": "52df1c1eeb3078cf", "name": "/usr/share/vim/vim91/syntax/mailcap.vim", "type": "file" }, { - "bom-ref": "52d23b792ca8149e", + "bom-ref": "0580ae87d4d427c2", "name": "/usr/share/vim/vim91/syntax/make.vim", "type": "file" }, { - "bom-ref": "f54379f1aaf0a0ab", + "bom-ref": "cf039f0ae7778a3f", "name": "/usr/share/vim/vim91/syntax/mallard.vim", "type": "file" }, { - "bom-ref": "2eb829acaba41dda", + "bom-ref": "60b8f7fb9f555c1a", "name": "/usr/share/vim/vim91/syntax/man.vim", "type": "file" }, { - "bom-ref": "3765d3817778520d", + "bom-ref": "2b915efbeeedfd3d", "name": "/usr/share/vim/vim91/syntax/manconf.vim", "type": "file" }, { - "bom-ref": "93d0764f93243c25", + "bom-ref": "5bf1aebff5212235", "name": "/usr/share/vim/vim91/syntax/manual.vim", "type": "file" }, { - "bom-ref": "dd62b9f22c692b22", + "bom-ref": "76fdfb8b6b0bf4a6", "name": "/usr/share/vim/vim91/syntax/maple.vim", "type": "file" }, { - "bom-ref": "efc381a3b56cf7cb", + "bom-ref": "ea1519628fa65ac7", "name": "/usr/share/vim/vim91/syntax/markdown.vim", "type": "file" }, { - "bom-ref": "3f056ee960975bed", + "bom-ref": "dd0742019350f501", "name": "/usr/share/vim/vim91/syntax/masm.vim", "type": "file" }, { - "bom-ref": "d5345ca422c6516b", + "bom-ref": "009e04b591ac325f", "name": "/usr/share/vim/vim91/syntax/mason.vim", "type": "file" }, { - "bom-ref": "0a057577554b020c", + "bom-ref": "ad28d49392bafb38", "name": "/usr/share/vim/vim91/syntax/master.vim", "type": "file" }, { - "bom-ref": "c3b767edda00467b", + "bom-ref": "d0ee4a32c47f37df", "name": "/usr/share/vim/vim91/syntax/matlab.vim", "type": "file" }, { - "bom-ref": "40cfaf5720de1218", + "bom-ref": "56fad757584544f8", "name": "/usr/share/vim/vim91/syntax/maxima.vim", "type": "file" }, { - "bom-ref": "586c9e6e78bed11e", + "bom-ref": "5e88b648132e3cc6", "name": "/usr/share/vim/vim91/syntax/mel.vim", "type": "file" }, { - "bom-ref": "93440d67c63e4dfe", + "bom-ref": "df1161f1fe1c6bea", "name": "/usr/share/vim/vim91/syntax/mermaid.vim", "type": "file" }, { - "bom-ref": "3153f2a6091604eb", + "bom-ref": "b2d366d139b98587", "name": "/usr/share/vim/vim91/syntax/meson.vim", "type": "file" }, { - "bom-ref": "2942a660e9acdf43", + "bom-ref": "e213d503ef068d4f", "name": "/usr/share/vim/vim91/syntax/messages.vim", "type": "file" }, { - "bom-ref": "1ab6dbb414f4e061", + "bom-ref": "03e4ea21ab611fe9", "name": "/usr/share/vim/vim91/syntax/mf.vim", "type": "file" }, { - "bom-ref": "39b432e94e7992fd", + "bom-ref": "283c5595b2b1e365", "name": "/usr/share/vim/vim91/syntax/mgl.vim", "type": "file" }, { - "bom-ref": "d5e2ee5c4f95654b", + "bom-ref": "aa8b83ae1d716a13", "name": "/usr/share/vim/vim91/syntax/mgp.vim", "type": "file" }, { - "bom-ref": "5df2ffd4f6f47227", + "bom-ref": "101eec8a41f7d3df", "name": "/usr/share/vim/vim91/syntax/mib.vim", "type": "file" }, { - "bom-ref": "8d77e73bea6305ab", + "bom-ref": "f0c98ef02ab90c87", "name": "/usr/share/vim/vim91/syntax/mix.vim", "type": "file" }, { - "bom-ref": "af3210fa80295776", + "bom-ref": "2e62a570fd3004c2", "name": "/usr/share/vim/vim91/syntax/mma.vim", "type": "file" }, { - "bom-ref": "6efe6fd61f8cc419", + "bom-ref": "8d066f3b98f06fe9", "name": "/usr/share/vim/vim91/syntax/mmix.vim", "type": "file" }, { - "bom-ref": "f5471b093b5e4c4b", + "bom-ref": "badcb21c52a696af", "name": "/usr/share/vim/vim91/syntax/mmp.vim", "type": "file" }, { - "bom-ref": "a159250372e774e9", + "bom-ref": "b6c20355573525d5", "name": "/usr/share/vim/vim91/syntax/modconf.vim", "type": "file" }, { - "bom-ref": "8fadda411d7e0760", + "bom-ref": "f84922fed1aeee24", "name": "/usr/share/vim/vim91/syntax/model.vim", "type": "file" }, { - "bom-ref": "b8b93b6d183fc4ef", + "bom-ref": "ffff41bc399edddf", "name": "/usr/share/vim/vim91/syntax/modsim3.vim", "type": "file" }, { - "bom-ref": "9ac4d6b5383dd9fd", + "bom-ref": "ab4250032ac4e6c9", "name": "/usr/share/vim/vim91/syntax/modula2.vim", "type": "file" }, { - "bom-ref": "2f79793ca054cf82", + "bom-ref": "9ba945521432f616", "name": "/usr/share/vim/vim91/syntax/modula2/opt/iso.vim", "type": "file" }, { - "bom-ref": "8d2eaeebd4cae651", + "bom-ref": "1556923650a55929", "name": "/usr/share/vim/vim91/syntax/modula2/opt/pim.vim", "type": "file" }, { - "bom-ref": "728897a02cb011c2", + "bom-ref": "f7a35cdcf3a99b42", "name": "/usr/share/vim/vim91/syntax/modula2/opt/r10.vim", "type": "file" }, { - "bom-ref": "a903cafb96ec4941", + "bom-ref": "ee4e0639c7601c81", "name": "/usr/share/vim/vim91/syntax/modula3.vim", "type": "file" }, { - "bom-ref": "6bf14c1efe4c3424", + "bom-ref": "9798a6c6fe06aa3c", "name": "/usr/share/vim/vim91/syntax/mojo.vim", "type": "file" }, { - "bom-ref": "f82a52f0253fbb4f", + "bom-ref": "e2aa82417fc4ce9b", "name": "/usr/share/vim/vim91/syntax/monk.vim", "type": "file" }, { - "bom-ref": "b0e4576eff92cf56", + "bom-ref": "cf236089584bb95a", "name": "/usr/share/vim/vim91/syntax/moo.vim", "type": "file" }, { - "bom-ref": "d355732a29cd7881", + "bom-ref": "4ea51d1f6f92a6f9", "name": "/usr/share/vim/vim91/syntax/mp.vim", "type": "file" }, { - "bom-ref": "455ae30db98eb8f1", + "bom-ref": "34e081251f7b4571", "name": "/usr/share/vim/vim91/syntax/mplayerconf.vim", "type": "file" }, { - "bom-ref": "f2ad92ec16906c28", + "bom-ref": "c8b2fea309b7ab58", "name": "/usr/share/vim/vim91/syntax/mrxvtrc.vim", "type": "file" }, { - "bom-ref": "3a32788bc45f8bac", + "bom-ref": "6ba3844c61844ff8", "name": "/usr/share/vim/vim91/syntax/msidl.vim", "type": "file" }, { - "bom-ref": "169f3f797c836d3e", + "bom-ref": "42a45b81416edaaa", "name": "/usr/share/vim/vim91/syntax/msmessages.vim", "type": "file" }, { - "bom-ref": "bdd957381d7169e7", + "bom-ref": "7f99f538eef5d953", "name": "/usr/share/vim/vim91/syntax/msql.vim", "type": "file" }, { - "bom-ref": "c8f94c938e08cd90", + "bom-ref": "ca142683d5cb0314", "name": "/usr/share/vim/vim91/syntax/mupad.vim", "type": "file" }, { - "bom-ref": "937a3180e558ea5f", + "bom-ref": "63a3e4a5f2f30e63", "name": "/usr/share/vim/vim91/syntax/murphi.vim", "type": "file" }, { - "bom-ref": "6166aa598baa3144", + "bom-ref": "77c3e53cf666a65c", "name": "/usr/share/vim/vim91/syntax/mush.vim", "type": "file" }, { - "bom-ref": "6f2d032510a12aa8", + "bom-ref": "5f9d206e1e97e718", "name": "/usr/share/vim/vim91/syntax/muttrc.vim", "type": "file" }, { - "bom-ref": "dcb8b46d499c8449", + "bom-ref": "543a72ef9647fd69", "name": "/usr/share/vim/vim91/syntax/mysql.vim", "type": "file" }, { - "bom-ref": "4a9f24770c9671a8", + "bom-ref": "be112bc53235d2ec", "name": "/usr/share/vim/vim91/syntax/n1ql.vim", "type": "file" }, { - "bom-ref": "a8bd595ce76c8d90", + "bom-ref": "db273cb8c1f337b8", "name": "/usr/share/vim/vim91/syntax/named.vim", "type": "file" }, { - "bom-ref": "0543c44733d91d11", + "bom-ref": "ea2ce61f6216a1b1", "name": "/usr/share/vim/vim91/syntax/nanorc.vim", "type": "file" }, { - "bom-ref": "5caed1970ca0dfa6", + "bom-ref": "85d28fd6e126bfaa", "name": "/usr/share/vim/vim91/syntax/nasm.vim", "type": "file" }, { - "bom-ref": "a1632460a909f4ed", + "bom-ref": "e9c7b415aa9fdc91", "name": "/usr/share/vim/vim91/syntax/nastran.vim", "type": "file" }, { - "bom-ref": "7cf50ee0de89c006", + "bom-ref": "78bc819b3d97d7ba", "name": "/usr/share/vim/vim91/syntax/natural.vim", "type": "file" }, { - "bom-ref": "75a0c4cc6de753b5", + "bom-ref": "608a8db21213362d", "name": "/usr/share/vim/vim91/syntax/ncf.vim", "type": "file" }, { - "bom-ref": "5d115d471653c61c", + "bom-ref": "707bb704ca78a3e8", "name": "/usr/share/vim/vim91/syntax/neomuttrc.vim", "type": "file" }, { - "bom-ref": "d72e451c466583c3", + "bom-ref": "24589a1a6b4bf4af", "name": "/usr/share/vim/vim91/syntax/netrc.vim", "type": "file" }, { - "bom-ref": "13eda67f16b35ccb", + "bom-ref": "cbd67217803c409b", "name": "/usr/share/vim/vim91/syntax/netrw.vim", "type": "file" }, { - "bom-ref": "b5e7e0702e495246", + "bom-ref": "579b0ffbe05700aa", "name": "/usr/share/vim/vim91/syntax/nginx.vim", "type": "file" }, { - "bom-ref": "7c8f966582520248", + "bom-ref": "e2462b659329b1a4", "name": "/usr/share/vim/vim91/syntax/ninja.vim", "type": "file" }, { - "bom-ref": "cd9851627328dc74", + "bom-ref": "ee19450c3ee8d7a0", "name": "/usr/share/vim/vim91/syntax/nix.vim", "type": "file" }, { - "bom-ref": "f56992409a12f404", + "bom-ref": "5dfa93ea5b533240", "name": "/usr/share/vim/vim91/syntax/nosyntax.vim", "type": "file" }, { - "bom-ref": "d782e6c070767062", + "bom-ref": "5ea6fd83318cd356", "name": "/usr/share/vim/vim91/syntax/nqc.vim", "type": "file" }, { - "bom-ref": "3d21b6df55e93c00", + "bom-ref": "78ce1e032f55cc38", "name": "/usr/share/vim/vim91/syntax/nroff.vim", "type": "file" }, { - "bom-ref": "b1c75d9dc618f4e4", + "bom-ref": "495d73d502b78e68", "name": "/usr/share/vim/vim91/syntax/nsis.vim", "type": "file" }, { - "bom-ref": "d568cf518958a842", + "bom-ref": "2d01eaeae5865ad6", "name": "/usr/share/vim/vim91/syntax/obj.vim", "type": "file" }, { - "bom-ref": "e6ed9a7dfe52e359", + "bom-ref": "f92b02abd61656dd", "name": "/usr/share/vim/vim91/syntax/objc.vim", "type": "file" }, { - "bom-ref": "57007067bf99e8a6", + "bom-ref": "558e8291cc9ece0e", "name": "/usr/share/vim/vim91/syntax/objcpp.vim", "type": "file" }, { - "bom-ref": "44c7ac73ddb4fa6b", + "bom-ref": "7c76af2d61ae5b7b", "name": "/usr/share/vim/vim91/syntax/obse.vim", "type": "file" }, { - "bom-ref": "d9bb2cd3773b7b59", + "bom-ref": "02bcb4703c0b478d", "name": "/usr/share/vim/vim91/syntax/ocaml.vim", "type": "file" }, { - "bom-ref": "6b7220994bee9735", + "bom-ref": "fa81d12ff37e3f11", "name": "/usr/share/vim/vim91/syntax/occam.vim", "type": "file" }, { - "bom-ref": "4fa0959c1a572099", + "bom-ref": "e9fb0962e4848e31", "name": "/usr/share/vim/vim91/syntax/omnimark.vim", "type": "file" }, { - "bom-ref": "ea7f565a716a4e69", + "bom-ref": "642a32bebedf6225", "name": "/usr/share/vim/vim91/syntax/opam.vim", "type": "file" }, { - "bom-ref": "16b1c473040bae0e", + "bom-ref": "fdb3cdacc3653d06", "name": "/usr/share/vim/vim91/syntax/openroad.vim", "type": "file" }, { - "bom-ref": "74484a72b2b2ae9c", + "bom-ref": "fffd4663b6b8d6f8", "name": "/usr/share/vim/vim91/syntax/openscad.vim", "type": "file" }, { - "bom-ref": "c91c8bce11c9b006", + "bom-ref": "dfbc6df717f9b41e", "name": "/usr/share/vim/vim91/syntax/openvpn.vim", "type": "file" }, { - "bom-ref": "90260f67d54ded8b", + "bom-ref": "c633e1a7f1a9487b", "name": "/usr/share/vim/vim91/syntax/opl.vim", "type": "file" }, { - "bom-ref": "1882f2c79681efcb", + "bom-ref": "1591cbb9cc8068bf", "name": "/usr/share/vim/vim91/syntax/ora.vim", "type": "file" }, { - "bom-ref": "3a092e6e34b9aba6", + "bom-ref": "1b746d9f686be77e", "name": "/usr/share/vim/vim91/syntax/pacmanlog.vim", "type": "file" }, { - "bom-ref": "8fb94cd959e93f24", + "bom-ref": "85f25203afcfe530", "name": "/usr/share/vim/vim91/syntax/pamconf.vim", "type": "file" }, { - "bom-ref": "8380b3f2001e95b3", + "bom-ref": "840fd5255c61fe27", "name": "/usr/share/vim/vim91/syntax/pamenv.vim", "type": "file" }, { - "bom-ref": "539fe639a30028c1", + "bom-ref": "015d32cb7e298409", "name": "/usr/share/vim/vim91/syntax/papp.vim", "type": "file" }, { - "bom-ref": "468693b269be0420", + "bom-ref": "00a364489c1fdcd0", "name": "/usr/share/vim/vim91/syntax/pascal.vim", "type": "file" }, { - "bom-ref": "fd646047accc0dc6", + "bom-ref": "af4da5fe23afd64a", "name": "/usr/share/vim/vim91/syntax/passwd.vim", "type": "file" }, { - "bom-ref": "310339fe49903e4c", + "bom-ref": "1f4d8992524a0f74", "name": "/usr/share/vim/vim91/syntax/pbtxt.vim", "type": "file" }, { - "bom-ref": "66e4ce6b140e9823", + "bom-ref": "479042c2d18ae72b", "name": "/usr/share/vim/vim91/syntax/pcap.vim", "type": "file" }, { - "bom-ref": "f66e38baa0371e58", + "bom-ref": "2bc6183a8de40ab0", "name": "/usr/share/vim/vim91/syntax/pccts.vim", "type": "file" }, { - "bom-ref": "987a832f90d54ca7", + "bom-ref": "e5ec635db28dabef", "name": "/usr/share/vim/vim91/syntax/pdf.vim", "type": "file" }, { - "bom-ref": "a4faa879e1f762da", + "bom-ref": "47a74f618876d576", "name": "/usr/share/vim/vim91/syntax/perl.vim", "type": "file" }, { - "bom-ref": "8fadc895943850d0", + "bom-ref": "df0e61dcbfd2f0c4", "name": "/usr/share/vim/vim91/syntax/pf.vim", "type": "file" }, { - "bom-ref": "399d4ddac1e69c8e", + "bom-ref": "ace1c09b3b92093e", "name": "/usr/share/vim/vim91/syntax/pfmain.vim", "type": "file" }, { - "bom-ref": "93bec278cba59d94", + "bom-ref": "5321438deb32b83c", "name": "/usr/share/vim/vim91/syntax/php.vim", "type": "file" }, { - "bom-ref": "408dc0f56be5b758", + "bom-ref": "48438cea9fbc1694", "name": "/usr/share/vim/vim91/syntax/phtml.vim", "type": "file" }, { - "bom-ref": "62f73003210a9bae", + "bom-ref": "53d504c13398c652", "name": "/usr/share/vim/vim91/syntax/pic.vim", "type": "file" }, { - "bom-ref": "42161fd79d756c3d", + "bom-ref": "b3bd63f19b5a0105", "name": "/usr/share/vim/vim91/syntax/pike.vim", "type": "file" }, { - "bom-ref": "81ee83635a77db17", + "bom-ref": "1d31e7bd4dc3b6bf", "name": "/usr/share/vim/vim91/syntax/pilrc.vim", "type": "file" }, { - "bom-ref": "ed3cd95fa4779550", + "bom-ref": "2e4e206d5d891538", "name": "/usr/share/vim/vim91/syntax/pine.vim", "type": "file" }, { - "bom-ref": "fdd57e278e8d2616", + "bom-ref": "a4a5628ea975b3ba", "name": "/usr/share/vim/vim91/syntax/pinfo.vim", "type": "file" }, { - "bom-ref": "7c38e60cdd83b78d", + "bom-ref": "2bdeaaac2d01cf9d", "name": "/usr/share/vim/vim91/syntax/plaintex.vim", "type": "file" }, { - "bom-ref": "1b23966b27291829", + "bom-ref": "75234503ae43f779", "name": "/usr/share/vim/vim91/syntax/pli.vim", "type": "file" }, { - "bom-ref": "d5640f40f4140555", + "bom-ref": "0af26b4ae596b919", "name": "/usr/share/vim/vim91/syntax/plm.vim", "type": "file" }, { - "bom-ref": "ffe4618b5289dd0d", + "bom-ref": "8c5790a24a5411e9", "name": "/usr/share/vim/vim91/syntax/plp.vim", "type": "file" }, { - "bom-ref": "9d3e21180fc8da97", + "bom-ref": "10cbf2ab8464906f", "name": "/usr/share/vim/vim91/syntax/plsql.vim", "type": "file" }, { - "bom-ref": "848b19b1d5001657", + "bom-ref": "dc5c97604eb0210f", "name": "/usr/share/vim/vim91/syntax/po.vim", "type": "file" }, { - "bom-ref": "290887b63c9e1337", + "bom-ref": "179d871d3feacc3f", "name": "/usr/share/vim/vim91/syntax/pod.vim", "type": "file" }, { - "bom-ref": "b83aedfe3b08d911", + "bom-ref": "dae152b82dbf3c71", "name": "/usr/share/vim/vim91/syntax/poefilter.vim", "type": "file" }, { - "bom-ref": "834780378ff85bc1", + "bom-ref": "6f8c32a862aee419", "name": "/usr/share/vim/vim91/syntax/poke.vim", "type": "file" }, { - "bom-ref": "9e43a8444158ad3d", + "bom-ref": "86a614a2d8edf3f9", "name": "/usr/share/vim/vim91/syntax/postscr.vim", "type": "file" }, { - "bom-ref": "fa793443f8dd6139", + "bom-ref": "227c81ea9688ba19", "name": "/usr/share/vim/vim91/syntax/pov.vim", "type": "file" }, { - "bom-ref": "f4a084c80b57eefb", + "bom-ref": "c370dd81c6100e9b", "name": "/usr/share/vim/vim91/syntax/povini.vim", "type": "file" }, { - "bom-ref": "896bbe169e2349ad", + "bom-ref": "5eedb8eedd163521", "name": "/usr/share/vim/vim91/syntax/ppd.vim", "type": "file" }, { - "bom-ref": "fa664570bb1814c1", + "bom-ref": "8eb9b2d9ced22a4d", "name": "/usr/share/vim/vim91/syntax/ppwiz.vim", "type": "file" }, { - "bom-ref": "1ec79d15e13b19d7", + "bom-ref": "1ec460b80b9ff557", "name": "/usr/share/vim/vim91/syntax/prescribe.vim", "type": "file" }, { - "bom-ref": "73727e990ae1447b", + "bom-ref": "ccaa09829de3699b", "name": "/usr/share/vim/vim91/syntax/privoxy.vim", "type": "file" }, { - "bom-ref": "d961875189fa1e60", + "bom-ref": "01fd8bd14e050f80", "name": "/usr/share/vim/vim91/syntax/procmail.vim", "type": "file" }, { - "bom-ref": "2b2e199915a6a187", + "bom-ref": "a1593bbc6f952593", "name": "/usr/share/vim/vim91/syntax/progress.vim", "type": "file" }, { - "bom-ref": "362206537f80beed", + "bom-ref": "ed9576f757b6836d", "name": "/usr/share/vim/vim91/syntax/prolog.vim", "type": "file" }, { - "bom-ref": "771d63c66287cc75", + "bom-ref": "42c4ca5c27a3062d", "name": "/usr/share/vim/vim91/syntax/promela.vim", "type": "file" }, { - "bom-ref": "c0fc029fafa522b6", + "bom-ref": "1960c158313f8bd2", "name": "/usr/share/vim/vim91/syntax/proto.vim", "type": "file" }, { - "bom-ref": "69568b72c91fa46e", + "bom-ref": "7329912f0664a456", "name": "/usr/share/vim/vim91/syntax/protocols.vim", "type": "file" }, { - "bom-ref": "7d10ef9b62fd17c6", + "bom-ref": "a673b8f54968c286", "name": "/usr/share/vim/vim91/syntax/ps1.vim", "type": "file" }, { - "bom-ref": "95d715c6754f8efa", + "bom-ref": "e7af4929e9b5a442", "name": "/usr/share/vim/vim91/syntax/ps1xml.vim", "type": "file" }, { - "bom-ref": "609e82ab752aeac5", + "bom-ref": "ce686982eba00c15", "name": "/usr/share/vim/vim91/syntax/psf.vim", "type": "file" }, { - "bom-ref": "94321ee51a8a8daf", + "bom-ref": "c7c229b2865d5daf", "name": "/usr/share/vim/vim91/syntax/psl.vim", "type": "file" }, { - "bom-ref": "493227e24fc3e7aa", + "bom-ref": "819c3a78ce34ea4e", "name": "/usr/share/vim/vim91/syntax/ptcap.vim", "type": "file" }, { - "bom-ref": "f20cf44beedf98f2", + "bom-ref": "cd2be94ed666909a", "name": "/usr/share/vim/vim91/syntax/purifylog.vim", "type": "file" }, { - "bom-ref": "04816a7b39ae7ad8", + "bom-ref": "13ffe23eadb13cbc", "name": "/usr/share/vim/vim91/syntax/pymanifest.vim", "type": "file" }, { - "bom-ref": "5aa55e777c100eb5", + "bom-ref": "8a3cf777821ee859", "name": "/usr/share/vim/vim91/syntax/pyrex.vim", "type": "file" }, { - "bom-ref": "31635dc0663759f8", + "bom-ref": "f9fc65f53cd88fe4", "name": "/usr/share/vim/vim91/syntax/python.vim", "type": "file" }, { - "bom-ref": "2e7a57d96f52e6a5", + "bom-ref": "078339968ecdfad9", "name": "/usr/share/vim/vim91/syntax/python2.vim", "type": "file" }, { - "bom-ref": "362779ca8465c7ec", + "bom-ref": "d4938563ab37744c", "name": "/usr/share/vim/vim91/syntax/qb64.vim", "type": "file" }, { - "bom-ref": "fa0aabbca806d5ed", + "bom-ref": "53666cb8e5ef49a1", "name": "/usr/share/vim/vim91/syntax/qf.vim", "type": "file" }, { - "bom-ref": "41ef6452c9781a72", + "bom-ref": "b3eb511805393796", "name": "/usr/share/vim/vim91/syntax/qml.vim", "type": "file" }, { - "bom-ref": "0fabc915ed7af2b3", + "bom-ref": "86af7c9d0ee0a6bb", "name": "/usr/share/vim/vim91/syntax/quake.vim", "type": "file" }, { - "bom-ref": "d7ef7d90a2f0135e", + "bom-ref": "4c29c7266e730cb2", "name": "/usr/share/vim/vim91/syntax/quarto.vim", "type": "file" }, { - "bom-ref": "2755d1962ecc7b44", + "bom-ref": "0de7491bb8bf85a0", "name": "/usr/share/vim/vim91/syntax/r.vim", "type": "file" }, { - "bom-ref": "8fdc4cfc0ad8b3a9", + "bom-ref": "4bda90cff102c415", "name": "/usr/share/vim/vim91/syntax/racc.vim", "type": "file" }, { - "bom-ref": "fe0486ddc6a5f2da", + "bom-ref": "735a6d13bff481f6", "name": "/usr/share/vim/vim91/syntax/racket.vim", "type": "file" }, { - "bom-ref": "da683044ba718816", + "bom-ref": "304dc3f6ff3fcfba", "name": "/usr/share/vim/vim91/syntax/radiance.vim", "type": "file" }, { - "bom-ref": "a9d97f70ded68a48", + "bom-ref": "7a909b8bf952b42c", "name": "/usr/share/vim/vim91/syntax/raku.vim", "type": "file" }, { - "bom-ref": "341da2ebb71cb42d", + "bom-ref": "0c80ca281472bd5d", "name": "/usr/share/vim/vim91/syntax/raml.vim", "type": "file" }, { - "bom-ref": "72f23e9731e817ed", + "bom-ref": "45b6763a31a04f2d", "name": "/usr/share/vim/vim91/syntax/rapid.vim", "type": "file" }, { - "bom-ref": "b13497d142eb5d5e", + "bom-ref": "391a021e269b2116", "name": "/usr/share/vim/vim91/syntax/ratpoison.vim", "type": "file" }, { - "bom-ref": "a9aaeefa463f6c70", + "bom-ref": "c315f57d87fa6d2c", "name": "/usr/share/vim/vim91/syntax/rc.vim", "type": "file" }, { - "bom-ref": "401d8452f4e7d057", + "bom-ref": "f63cddbde2540e2b", "name": "/usr/share/vim/vim91/syntax/rcs.vim", "type": "file" }, { - "bom-ref": "798505d1417f1dd8", + "bom-ref": "44dff2ffd1122a9c", "name": "/usr/share/vim/vim91/syntax/rcslog.vim", "type": "file" }, { - "bom-ref": "0203558c81e0be5d", + "bom-ref": "dc0b74b1bf4e93e1", "name": "/usr/share/vim/vim91/syntax/readline.vim", "type": "file" }, { - "bom-ref": "5e603b4d87bf6b80", + "bom-ref": "6879e388d81269e4", "name": "/usr/share/vim/vim91/syntax/rebol.vim", "type": "file" }, { - "bom-ref": "d638a95c20275d3f", + "bom-ref": "ca716c96c3a08127", "name": "/usr/share/vim/vim91/syntax/redif.vim", "type": "file" }, { - "bom-ref": "97a5e9c7aa33757a", + "bom-ref": "2a43481b508311ee", "name": "/usr/share/vim/vim91/syntax/registry.vim", "type": "file" }, { - "bom-ref": "b538eca83eef4d2a", + "bom-ref": "3baf017c870d76fe", "name": "/usr/share/vim/vim91/syntax/rego.vim", "type": "file" }, { - "bom-ref": "e826380edea8dadf", + "bom-ref": "284b1a4257b67c8f", "name": "/usr/share/vim/vim91/syntax/remind.vim", "type": "file" }, { - "bom-ref": "268e344c4ba2371c", + "bom-ref": "1f65bddc0c708520", "name": "/usr/share/vim/vim91/syntax/resolv.vim", "type": "file" }, { - "bom-ref": "be471ac0a6470a10", + "bom-ref": "ff92ca6d1d96a8dc", "name": "/usr/share/vim/vim91/syntax/reva.vim", "type": "file" }, { - "bom-ref": "e65ff4d16f98fc2b", + "bom-ref": "e3ac5802ab9a6037", "name": "/usr/share/vim/vim91/syntax/rexx.vim", "type": "file" }, { - "bom-ref": "16a9ec66050497d9", + "bom-ref": "1e35b90c434d361d", "name": "/usr/share/vim/vim91/syntax/rhelp.vim", "type": "file" }, { - "bom-ref": "0ddab84f63ce8331", + "bom-ref": "6ce96ffd0d4f2d11", "name": "/usr/share/vim/vim91/syntax/rib.vim", "type": "file" }, { - "bom-ref": "63e9f262c0ff4ce1", + "bom-ref": "180dbaca2157f091", "name": "/usr/share/vim/vim91/syntax/rmd.vim", "type": "file" }, { - "bom-ref": "c7aed75f7ff639f5", + "bom-ref": "3b81680bc6b9b2a5", "name": "/usr/share/vim/vim91/syntax/rnc.vim", "type": "file" }, { - "bom-ref": "1a012c79d0f21291", + "bom-ref": "0f5003df2a7ddc89", "name": "/usr/share/vim/vim91/syntax/rng.vim", "type": "file" }, { - "bom-ref": "2c9bfca8c4360b27", + "bom-ref": "e7966205f664979f", "name": "/usr/share/vim/vim91/syntax/rnoweb.vim", "type": "file" }, { - "bom-ref": "d8bfc424b0f17e97", + "bom-ref": "30137e2f25501153", "name": "/usr/share/vim/vim91/syntax/robots.vim", "type": "file" }, { - "bom-ref": "f121786955a51000", + "bom-ref": "20449fe2cbe1475c", "name": "/usr/share/vim/vim91/syntax/routeros.vim", "type": "file" }, { - "bom-ref": "b36eb7955942f7b2", + "bom-ref": "25049efecbb17832", "name": "/usr/share/vim/vim91/syntax/rpcgen.vim", "type": "file" }, { - "bom-ref": "134201a964bc794f", + "bom-ref": "8c245fe66d802c53", "name": "/usr/share/vim/vim91/syntax/rpl.vim", "type": "file" }, { - "bom-ref": "e895cd9c9e7b9ee8", + "bom-ref": "03166323e43e4ec8", "name": "/usr/share/vim/vim91/syntax/rrst.vim", "type": "file" }, { - "bom-ref": "67328c47ef5e9cb5", + "bom-ref": "fedb501370af4f9d", "name": "/usr/share/vim/vim91/syntax/rst.vim", "type": "file" }, { - "bom-ref": "cb5af5f90700c1b9", + "bom-ref": "e49973a4078beddd", "name": "/usr/share/vim/vim91/syntax/rtf.vim", "type": "file" }, { - "bom-ref": "a675943122efb5ee", + "bom-ref": "1a9aa36fbf2f11c6", "name": "/usr/share/vim/vim91/syntax/ruby.vim", "type": "file" }, { - "bom-ref": "ff226a532d680879", + "bom-ref": "3080b9a08a83b89d", "name": "/usr/share/vim/vim91/syntax/rust.vim", "type": "file" }, { - "bom-ref": "cd08cf8836dec746", + "bom-ref": "d1d59e03cedcc256", "name": "/usr/share/vim/vim91/syntax/samba.vim", "type": "file" }, { - "bom-ref": "0d3f97b0ae763a21", + "bom-ref": "bf4e40b36fafb895", "name": "/usr/share/vim/vim91/syntax/sas.vim", "type": "file" }, { - "bom-ref": "7337ea1f515b5550", + "bom-ref": "6239886dafc604c4", "name": "/usr/share/vim/vim91/syntax/sass.vim", "type": "file" }, { - "bom-ref": "2af7080205ae810f", + "bom-ref": "d21d080ac60960a7", "name": "/usr/share/vim/vim91/syntax/sather.vim", "type": "file" }, { - "bom-ref": "c54b9ef5d8906015", + "bom-ref": "2c501cde37c734e9", "name": "/usr/share/vim/vim91/syntax/sbt.vim", "type": "file" }, { - "bom-ref": "7920f9036d999f49", + "bom-ref": "c01ab16418f12a9d", "name": "/usr/share/vim/vim91/syntax/scala.vim", "type": "file" }, { - "bom-ref": "df9810f927e201cc", + "bom-ref": "9668c0e71b2319f0", "name": "/usr/share/vim/vim91/syntax/scdoc.vim", "type": "file" }, { - "bom-ref": "a507ca3d226a5e7a", + "bom-ref": "cf20f9240f1ecfa6", "name": "/usr/share/vim/vim91/syntax/scheme.vim", "type": "file" }, { - "bom-ref": "57e14132881d044b", + "bom-ref": "c4cae05cfe67eb53", "name": "/usr/share/vim/vim91/syntax/scilab.vim", "type": "file" }, { - "bom-ref": "b1e79a1f6a5d8cdd", + "bom-ref": "a4291ff7a4161a81", "name": "/usr/share/vim/vim91/syntax/screen.vim", "type": "file" }, { - "bom-ref": "268c9a3f6d19a1f2", + "bom-ref": "afc312b15c463bc2", "name": "/usr/share/vim/vim91/syntax/scss.vim", "type": "file" }, { - "bom-ref": "298faf0a2d3fb514", + "bom-ref": "68868736d9a14248", "name": "/usr/share/vim/vim91/syntax/sd.vim", "type": "file" }, { - "bom-ref": "88e51de0ad365330", + "bom-ref": "b0ead185498b25fc", "name": "/usr/share/vim/vim91/syntax/sdc.vim", "type": "file" }, { - "bom-ref": "8d3ebc8bf9fd3337", + "bom-ref": "63f1b8790469a9f7", "name": "/usr/share/vim/vim91/syntax/sdl.vim", "type": "file" }, { - "bom-ref": "a7cde28d5a6117f9", + "bom-ref": "c9001ae3af1fe5f1", "name": "/usr/share/vim/vim91/syntax/sed.vim", "type": "file" }, { - "bom-ref": "fad6e466493bdf61", + "bom-ref": "3885c7467f06db59", "name": "/usr/share/vim/vim91/syntax/sendpr.vim", "type": "file" }, { - "bom-ref": "b05287883b26ca41", + "bom-ref": "8a67f825782398ad", "name": "/usr/share/vim/vim91/syntax/sensors.vim", "type": "file" }, { - "bom-ref": "317842c3c15a5f78", + "bom-ref": "9a5530a42498cce8", "name": "/usr/share/vim/vim91/syntax/services.vim", "type": "file" }, { - "bom-ref": "a329b6b57c829606", + "bom-ref": "9f5a4aa691554602", "name": "/usr/share/vim/vim91/syntax/setserial.vim", "type": "file" }, { - "bom-ref": "7dbb9299bf45641b", + "bom-ref": "6e4b62bdacc486e7", "name": "/usr/share/vim/vim91/syntax/sexplib.vim", "type": "file" }, { - "bom-ref": "7b7328d690c98018", + "bom-ref": "1e37c41cec6bc0f8", "name": "/usr/share/vim/vim91/syntax/sgml.vim", "type": "file" }, { - "bom-ref": "d884853e8ef7c865", + "bom-ref": "400dc6604f0fb729", "name": "/usr/share/vim/vim91/syntax/sgmldecl.vim", "type": "file" }, { - "bom-ref": "4316bd45acecc5cf", + "bom-ref": "41be29b51792b5d7", "name": "/usr/share/vim/vim91/syntax/sgmllnx.vim", "type": "file" }, { - "bom-ref": "07012236da61467f", + "bom-ref": "9191eb1b1252033b", "name": "/usr/share/vim/vim91/syntax/sh.vim", "type": "file" }, { - "bom-ref": "67b6f0f7a0b9f331", + "bom-ref": "3bb164dda5f60661", "name": "/usr/share/vim/vim91/syntax/shared/context-data-context.vim", "type": "file" }, { - "bom-ref": "c07a3776654db1c8", + "bom-ref": "47073b398c037268", "name": "/usr/share/vim/vim91/syntax/shared/context-data-interfaces.vim", "type": "file" }, { - "bom-ref": "c8be6b6a87ab12f4", + "bom-ref": "30fa5447d41d8550", "name": "/usr/share/vim/vim91/syntax/shared/context-data-metafun.vim", "type": "file" }, { - "bom-ref": "e4b45039825e4941", + "bom-ref": "b89493d4b58214d5", "name": "/usr/share/vim/vim91/syntax/shared/context-data-tex.vim", "type": "file" }, { - "bom-ref": "d63ccea60d557cae", + "bom-ref": "694f60f2ef787832", "name": "/usr/share/vim/vim91/syntax/shared/debversions.vim", "type": "file" }, { - "bom-ref": "2e9f204a87424872", + "bom-ref": "f220c3830a76b966", "name": "/usr/share/vim/vim91/syntax/shared/hgcommitDiff.vim", "type": "file" }, { - "bom-ref": "ae740e89af667455", + "bom-ref": "0b5948e6283d0879", "name": "/usr/share/vim/vim91/syntax/shared/typescriptcommon.vim", "type": "file" }, { - "bom-ref": "dd7a3754a28bcb71", + "bom-ref": "95d043a6bc05b6c9", "name": "/usr/share/vim/vim91/syntax/sicad.vim", "type": "file" }, { - "bom-ref": "150c11950f12fb6e", + "bom-ref": "1405bd9cd879b186", "name": "/usr/share/vim/vim91/syntax/sieve.vim", "type": "file" }, { - "bom-ref": "081793b4464fba90", + "bom-ref": "a5f104b661d71f64", "name": "/usr/share/vim/vim91/syntax/sil.vim", "type": "file" }, { - "bom-ref": "a6fe656eef2597c2", + "bom-ref": "f7d3cfdffd28f306", "name": "/usr/share/vim/vim91/syntax/simula.vim", "type": "file" }, { - "bom-ref": "fc17b8d11d91c60b", + "bom-ref": "12e97702e86e03eb", "name": "/usr/share/vim/vim91/syntax/sinda.vim", "type": "file" }, { - "bom-ref": "12efe45d9ad1d3cc", + "bom-ref": "580da92b39ad817c", "name": "/usr/share/vim/vim91/syntax/sindacmp.vim", "type": "file" }, { - "bom-ref": "63aca341e62d3069", + "bom-ref": "f4d855e840314509", "name": "/usr/share/vim/vim91/syntax/sindaout.vim", "type": "file" }, { - "bom-ref": "6c6b52bcd9fc8b79", + "bom-ref": "d91546ec64c7dd31", "name": "/usr/share/vim/vim91/syntax/sisu.vim", "type": "file" }, { - "bom-ref": "802483f27f29d3f9", + "bom-ref": "af5bfbee6ae67379", "name": "/usr/share/vim/vim91/syntax/skill.vim", "type": "file" }, { - "bom-ref": "8bfee7ae91027461", + "bom-ref": "cf06e99241152845", "name": "/usr/share/vim/vim91/syntax/sl.vim", "type": "file" }, { - "bom-ref": "92ef64086caeb738", + "bom-ref": "8f4f3a1a4f6d5f84", "name": "/usr/share/vim/vim91/syntax/slang.vim", "type": "file" }, { - "bom-ref": "3a75c868f922ee68", + "bom-ref": "ef69a365efa625fc", "name": "/usr/share/vim/vim91/syntax/slice.vim", "type": "file" }, { - "bom-ref": "707a6d134ac27862", + "bom-ref": "5dcd2a2317580df6", "name": "/usr/share/vim/vim91/syntax/slpconf.vim", "type": "file" }, { - "bom-ref": "d5541c55cc5809bf", + "bom-ref": "98a975506a958aff", "name": "/usr/share/vim/vim91/syntax/slpreg.vim", "type": "file" }, { - "bom-ref": "98df91ab4a6678aa", + "bom-ref": "ba10aa9709bb4a86", "name": "/usr/share/vim/vim91/syntax/slpspi.vim", "type": "file" }, { - "bom-ref": "56f51834c70a2e97", + "bom-ref": "68288270f07ad58b", "name": "/usr/share/vim/vim91/syntax/slrnrc.vim", "type": "file" }, { - "bom-ref": "faa7103fc66ab23a", + "bom-ref": "127cbfc52350d906", "name": "/usr/share/vim/vim91/syntax/slrnsc.vim", "type": "file" }, { - "bom-ref": "0c44408b63d04fd7", + "bom-ref": "4547d69754c16d5f", "name": "/usr/share/vim/vim91/syntax/sm.vim", "type": "file" }, { - "bom-ref": "a484545d25e3b796", + "bom-ref": "eaef1759d7433706", "name": "/usr/share/vim/vim91/syntax/smarty.vim", "type": "file" }, { - "bom-ref": "b607e652a4dd67fb", + "bom-ref": "6d9b32372674d02b", "name": "/usr/share/vim/vim91/syntax/smcl.vim", "type": "file" }, { - "bom-ref": "8180433d458d32ca", + "bom-ref": "cedf975aa60a9886", "name": "/usr/share/vim/vim91/syntax/smil.vim", "type": "file" }, { - "bom-ref": "b16b07229d261755", + "bom-ref": "0f0c3213b6d277e1", "name": "/usr/share/vim/vim91/syntax/smith.vim", "type": "file" }, { - "bom-ref": "2a02da3b1f97a8b2", + "bom-ref": "8b9668ad21e68d3e", "name": "/usr/share/vim/vim91/syntax/sml.vim", "type": "file" }, { - "bom-ref": "053393337e6951be", + "bom-ref": "6c62549cc428246a", "name": "/usr/share/vim/vim91/syntax/snnsnet.vim", "type": "file" }, { - "bom-ref": "608071fbdc2bb688", + "bom-ref": "2755053eca0e9e64", "name": "/usr/share/vim/vim91/syntax/snnspat.vim", "type": "file" }, { - "bom-ref": "21b56cba6c1290b6", + "bom-ref": "4ce170969c09ba06", "name": "/usr/share/vim/vim91/syntax/snnsres.vim", "type": "file" }, { - "bom-ref": "208789cc3086dc29", + "bom-ref": "d67680e6406bb689", "name": "/usr/share/vim/vim91/syntax/snobol4.vim", "type": "file" }, { - "bom-ref": "f604f9e4fa326356", + "bom-ref": "f99ecf53b867ae1e", "name": "/usr/share/vim/vim91/syntax/solidity.vim", "type": "file" }, { - "bom-ref": "0940cbd172e47986", + "bom-ref": "9c7409024b2e3d6e", "name": "/usr/share/vim/vim91/syntax/spec.vim", "type": "file" }, { - "bom-ref": "3b152e79b496ce5e", + "bom-ref": "14992e09e98c9dee", "name": "/usr/share/vim/vim91/syntax/specman.vim", "type": "file" }, { - "bom-ref": "62cc94a452d73007", + "bom-ref": "0688275bd8689227", "name": "/usr/share/vim/vim91/syntax/spice.vim", "type": "file" }, { - "bom-ref": "086b70fc4152fc62", + "bom-ref": "95c3d8be6b899fe2", "name": "/usr/share/vim/vim91/syntax/splint.vim", "type": "file" }, { - "bom-ref": "8b4d656a22cb4319", + "bom-ref": "6dd79d9ce3e61201", "name": "/usr/share/vim/vim91/syntax/spup.vim", "type": "file" }, { - "bom-ref": "c3636d98d0ff2e6a", + "bom-ref": "d29324839221a74e", "name": "/usr/share/vim/vim91/syntax/spyce.vim", "type": "file" }, { - "bom-ref": "e26071bac63a6890", + "bom-ref": "37a67e2d0ac33a00", "name": "/usr/share/vim/vim91/syntax/sql.vim", "type": "file" }, { - "bom-ref": "3142ca25ed632670", + "bom-ref": "b39c1c20a8c52648", "name": "/usr/share/vim/vim91/syntax/sqlanywhere.vim", "type": "file" }, { - "bom-ref": "992a436c55daef26", + "bom-ref": "2cec357b52f3448a", "name": "/usr/share/vim/vim91/syntax/sqlforms.vim", "type": "file" }, { - "bom-ref": "0c1ac333c45aa8f4", + "bom-ref": "4ec3f20925faf49c", "name": "/usr/share/vim/vim91/syntax/sqlhana.vim", "type": "file" }, { - "bom-ref": "effa9322a79d43e7", + "bom-ref": "3d47756877f8128b", "name": "/usr/share/vim/vim91/syntax/sqlinformix.vim", "type": "file" }, { - "bom-ref": "35c99cc034c2b918", + "bom-ref": "a7dd8dae2007d48c", "name": "/usr/share/vim/vim91/syntax/sqlj.vim", "type": "file" }, { - "bom-ref": "394130bdcbad429a", + "bom-ref": "3a5c4aa82d709cf2", "name": "/usr/share/vim/vim91/syntax/sqloracle.vim", "type": "file" }, { - "bom-ref": "17845d8804a8310e", + "bom-ref": "feaa5898143f97a2", "name": "/usr/share/vim/vim91/syntax/sqr.vim", "type": "file" }, { - "bom-ref": "2897da767a52441c", + "bom-ref": "fcfd933dd039aa28", "name": "/usr/share/vim/vim91/syntax/squid.vim", "type": "file" }, { - "bom-ref": "89d4631bedb116f0", + "bom-ref": "1c0b71b6540a8818", "name": "/usr/share/vim/vim91/syntax/squirrel.vim", "type": "file" }, { - "bom-ref": "85827633ff33fdaa", + "bom-ref": "e23887bd73e91dfe", "name": "/usr/share/vim/vim91/syntax/srec.vim", "type": "file" }, { - "bom-ref": "b0a81111771e7bf4", + "bom-ref": "dc7e6689c412aca4", "name": "/usr/share/vim/vim91/syntax/srt.vim", "type": "file" }, { - "bom-ref": "ee55b80ddbcabbd2", + "bom-ref": "681e0e1b4f5fb66e", "name": "/usr/share/vim/vim91/syntax/ssa.vim", "type": "file" }, { - "bom-ref": "974388deb3a929e2", + "bom-ref": "208ff9dee14cc6e6", "name": "/usr/share/vim/vim91/syntax/sshconfig.vim", "type": "file" }, { - "bom-ref": "18ea6a1998bf2114", + "bom-ref": "c1c58300f4e52be4", "name": "/usr/share/vim/vim91/syntax/sshdconfig.vim", "type": "file" }, { - "bom-ref": "2668e3376c360d4f", + "bom-ref": "3bd99ff63f725da3", "name": "/usr/share/vim/vim91/syntax/st.vim", "type": "file" }, { - "bom-ref": "9e3d0fdd49102ce2", + "bom-ref": "1eb9a553f67a4dda", "name": "/usr/share/vim/vim91/syntax/stata.vim", "type": "file" }, { - "bom-ref": "a0cbe9451c438288", + "bom-ref": "856f322607bbbec4", "name": "/usr/share/vim/vim91/syntax/stp.vim", "type": "file" }, { - "bom-ref": "e4dae951b43c2246", + "bom-ref": "93207ecd0c8039c2", "name": "/usr/share/vim/vim91/syntax/strace.vim", "type": "file" }, { - "bom-ref": "fe08ea9ba172deb4", + "bom-ref": "3352fe0df7620c40", "name": "/usr/share/vim/vim91/syntax/structurizr.vim", "type": "file" }, { - "bom-ref": "88504e96217e1790", + "bom-ref": "cf84b04f03630644", "name": "/usr/share/vim/vim91/syntax/sudoers.vim", "type": "file" }, { - "bom-ref": "c1d5b48514c36535", + "bom-ref": "2c1414856fffb461", "name": "/usr/share/vim/vim91/syntax/svg.vim", "type": "file" }, { - "bom-ref": "1dd36faff2cf3f9a", + "bom-ref": "68f997c6bc1bf556", "name": "/usr/share/vim/vim91/syntax/svn.vim", "type": "file" }, { - "bom-ref": "492c5aeca58e6075", + "bom-ref": "2f9cdf922e72cab1", "name": "/usr/share/vim/vim91/syntax/swayconfig.vim", "type": "file" }, { - "bom-ref": "72d7e97624f6250c", + "bom-ref": "7948f01c144eb570", "name": "/usr/share/vim/vim91/syntax/swift.vim", "type": "file" }, { - "bom-ref": "ad32dd0f7f41045f", + "bom-ref": "55994ef890df553b", "name": "/usr/share/vim/vim91/syntax/swiftgyb.vim", "type": "file" }, { - "bom-ref": "7458e2ec246e3d51", + "bom-ref": "1b53a431bace6f3d", "name": "/usr/share/vim/vim91/syntax/swig.vim", "type": "file" }, { - "bom-ref": "cbc34696021420c0", + "bom-ref": "593372da5a80382c", "name": "/usr/share/vim/vim91/syntax/syncolor.vim", "type": "file" }, { - "bom-ref": "efc6b5de59593c3b", + "bom-ref": "e02d92654e5c7243", "name": "/usr/share/vim/vim91/syntax/synload.vim", "type": "file" }, { - "bom-ref": "6c0f6345212ed587", + "bom-ref": "4eefc7f7d12e4b33", "name": "/usr/share/vim/vim91/syntax/syntax.vim", "type": "file" }, { - "bom-ref": "2119eff80ace5438", + "bom-ref": "0b6111fb43dd129c", "name": "/usr/share/vim/vim91/syntax/sysctl.vim", "type": "file" }, { - "bom-ref": "49a7084ae5f141cd", + "bom-ref": "cdfc1e70d11665cd", "name": "/usr/share/vim/vim91/syntax/systemd.vim", "type": "file" }, { - "bom-ref": "1ebdee949ec8d7d9", + "bom-ref": "6492bee6a468d751", "name": "/usr/share/vim/vim91/syntax/systemverilog.vim", "type": "file" }, { - "bom-ref": "d8adefc13ea9dc06", + "bom-ref": "35ca7c9d2ad51b8e", "name": "/usr/share/vim/vim91/syntax/tads.vim", "type": "file" }, { - "bom-ref": "f07a1b62bfd584ea", + "bom-ref": "dfb5be2aa000164e", "name": "/usr/share/vim/vim91/syntax/tags.vim", "type": "file" }, { - "bom-ref": "802d82e790b1834d", + "bom-ref": "a68560c1dd20bc35", "name": "/usr/share/vim/vim91/syntax/tak.vim", "type": "file" }, { - "bom-ref": "bef9a66aacc1002c", + "bom-ref": "d81a90d812c47694", "name": "/usr/share/vim/vim91/syntax/takcmp.vim", "type": "file" }, { - "bom-ref": "0538a039e7cf4045", + "bom-ref": "40cdf5f793af60e1", "name": "/usr/share/vim/vim91/syntax/takout.vim", "type": "file" }, { - "bom-ref": "98f842617c6fd27c", + "bom-ref": "07eda4b2263f9ef8", "name": "/usr/share/vim/vim91/syntax/tap.vim", "type": "file" }, { - "bom-ref": "974b59b998ad18af", + "bom-ref": "27f388f00d960b2b", "name": "/usr/share/vim/vim91/syntax/tar.vim", "type": "file" }, { - "bom-ref": "493db71d756ae415", + "bom-ref": "2a03c446ca2ba289", "name": "/usr/share/vim/vim91/syntax/taskdata.vim", "type": "file" }, { - "bom-ref": "2571eaf43e5e0c33", + "bom-ref": "088c7fcc67debec7", "name": "/usr/share/vim/vim91/syntax/taskedit.vim", "type": "file" }, { - "bom-ref": "b9f2b4e2583444eb", + "bom-ref": "0a53013087ef8da7", "name": "/usr/share/vim/vim91/syntax/tasm.vim", "type": "file" }, { - "bom-ref": "e818709ede4df0c3", + "bom-ref": "ed225bd217a8e477", "name": "/usr/share/vim/vim91/syntax/tcl.vim", "type": "file" }, { - "bom-ref": "0976e7bce3630e71", + "bom-ref": "59432d40e6061ced", "name": "/usr/share/vim/vim91/syntax/tcsh.vim", "type": "file" }, { - "bom-ref": "9ec75d3062aead8a", + "bom-ref": "cede9cd1ebbf7e4e", "name": "/usr/share/vim/vim91/syntax/template.vim", "type": "file" }, { - "bom-ref": "3bb28ebee8709bc2", + "bom-ref": "8de422c054d84d82", "name": "/usr/share/vim/vim91/syntax/teraterm.vim", "type": "file" }, { - "bom-ref": "f244e261c65d07f2", + "bom-ref": "d448661146c21a2e", "name": "/usr/share/vim/vim91/syntax/terminfo.vim", "type": "file" }, { - "bom-ref": "48f61da81e7a6824", + "bom-ref": "7c06cfa7aaa3e7c0", "name": "/usr/share/vim/vim91/syntax/tex.vim", "type": "file" }, { - "bom-ref": "2db56ae6f0759698", + "bom-ref": "93d05e2fffffdf34", "name": "/usr/share/vim/vim91/syntax/texinfo.vim", "type": "file" }, { - "bom-ref": "91aed97ac4f09590", + "bom-ref": "a234e3bdfd6a5908", "name": "/usr/share/vim/vim91/syntax/texmf.vim", "type": "file" }, { - "bom-ref": "c57e1743f82481c0", + "bom-ref": "2f9c78e3e9666afc", "name": "/usr/share/vim/vim91/syntax/tf.vim", "type": "file" }, { - "bom-ref": "d0d01ae29da0849e", + "bom-ref": "6f21f325409be13a", "name": "/usr/share/vim/vim91/syntax/tidy.vim", "type": "file" }, { - "bom-ref": "0566a6838b340a04", + "bom-ref": "a4f4f239e16263e4", "name": "/usr/share/vim/vim91/syntax/tilde.vim", "type": "file" }, { - "bom-ref": "7643c05de95f396f", + "bom-ref": "c5ff4f589ef03163", "name": "/usr/share/vim/vim91/syntax/tli.vim", "type": "file" }, { - "bom-ref": "7bef93cfa77aad77", + "bom-ref": "8eceaa3a6e1809db", "name": "/usr/share/vim/vim91/syntax/tmux.vim", "type": "file" }, { - "bom-ref": "c0c34035d237560d", + "bom-ref": "3a5615e8284e3f15", "name": "/usr/share/vim/vim91/syntax/toml.vim", "type": "file" }, { - "bom-ref": "aabc445366daf395", + "bom-ref": "ede70bf101fa8825", "name": "/usr/share/vim/vim91/syntax/tpp.vim", "type": "file" }, { - "bom-ref": "34afad3c7bef09a0", + "bom-ref": "a62ca14f4218fce8", "name": "/usr/share/vim/vim91/syntax/trasys.vim", "type": "file" }, { - "bom-ref": "d07e737dd43b3b56", + "bom-ref": "367928ce7b8964e6", "name": "/usr/share/vim/vim91/syntax/treetop.vim", "type": "file" }, { - "bom-ref": "ce4f95f59ea89fec", + "bom-ref": "5c940e3d29e46970", "name": "/usr/share/vim/vim91/syntax/trustees.vim", "type": "file" }, { - "bom-ref": "e6c26faaf547565b", + "bom-ref": "0a6b0df830adb123", "name": "/usr/share/vim/vim91/syntax/tsalt.vim", "type": "file" }, { - "bom-ref": "040fa8b046ef37fd", + "bom-ref": "4c200e8b87d0b38d", "name": "/usr/share/vim/vim91/syntax/tsscl.vim", "type": "file" }, { - "bom-ref": "e0d44a21c543134f", + "bom-ref": "66832c7f3cde849b", "name": "/usr/share/vim/vim91/syntax/tssgm.vim", "type": "file" }, { - "bom-ref": "657159408fde313a", + "bom-ref": "aacdf226bbe3d41a", "name": "/usr/share/vim/vim91/syntax/tssop.vim", "type": "file" }, { - "bom-ref": "03a0946efde8c145", + "bom-ref": "ff7f38ce2b1b69e9", "name": "/usr/share/vim/vim91/syntax/tt2.vim", "type": "file" }, { - "bom-ref": "09ac9022dc105f78", + "bom-ref": "912f8b62553555b4", "name": "/usr/share/vim/vim91/syntax/tt2html.vim", "type": "file" }, { - "bom-ref": "c3c5238c60851e9a", + "bom-ref": "ef04f079f47f7dea", "name": "/usr/share/vim/vim91/syntax/tt2js.vim", "type": "file" }, { - "bom-ref": "135994cd9edc1457", + "bom-ref": "ab9d2fa2dd2d858f", "name": "/usr/share/vim/vim91/syntax/typescript.vim", "type": "file" }, { - "bom-ref": "9ff09cca3ff10874", + "bom-ref": "304d672e447d2108", "name": "/usr/share/vim/vim91/syntax/typescriptreact.vim", "type": "file" }, { - "bom-ref": "5e8de6975d2c66e4", + "bom-ref": "d7433932e1936f84", "name": "/usr/share/vim/vim91/syntax/uc.vim", "type": "file" }, { - "bom-ref": "ebfe1e156a60779c", + "bom-ref": "f954eb11abef317c", "name": "/usr/share/vim/vim91/syntax/udevconf.vim", "type": "file" }, { - "bom-ref": "769a169f792e4289", + "bom-ref": "ae402dd8c80545f9", "name": "/usr/share/vim/vim91/syntax/udevperm.vim", "type": "file" }, { - "bom-ref": "da1f66dde9587576", + "bom-ref": "d1c301677c88b2d6", "name": "/usr/share/vim/vim91/syntax/udevrules.vim", "type": "file" }, { - "bom-ref": "55caca9f256bfe3a", + "bom-ref": "dd51dc979076167a", "name": "/usr/share/vim/vim91/syntax/uil.vim", "type": "file" }, { - "bom-ref": "785df3eaf031becf", + "bom-ref": "5f6543cb9246667b", "name": "/usr/share/vim/vim91/syntax/unison.vim", "type": "file" }, { - "bom-ref": "60f316c0b099b383", + "bom-ref": "4f9d943ef4b38a03", "name": "/usr/share/vim/vim91/syntax/updatedb.vim", "type": "file" }, { - "bom-ref": "11e8e8bbe187b2f6", + "bom-ref": "4fc045459307eb8a", "name": "/usr/share/vim/vim91/syntax/upstart.vim", "type": "file" }, { - "bom-ref": "6c07bc8e83bb2bb4", + "bom-ref": "4193e86a686944e4", "name": "/usr/share/vim/vim91/syntax/upstreamdat.vim", "type": "file" }, { - "bom-ref": "c61aefb82a796ebf", + "bom-ref": "6685ef1cd2281ce3", "name": "/usr/share/vim/vim91/syntax/upstreaminstalllog.vim", "type": "file" }, { - "bom-ref": "05f7ea1684ef59e1", + "bom-ref": "fc7bec1589e99f2d", "name": "/usr/share/vim/vim91/syntax/upstreamlog.vim", "type": "file" }, { - "bom-ref": "90f75a634777246b", + "bom-ref": "19dbcc6e10ca992f", "name": "/usr/share/vim/vim91/syntax/upstreamrpt.vim", "type": "file" }, { - "bom-ref": "d8505f5c3dee96a5", + "bom-ref": "060cf1b717b6ff65", "name": "/usr/share/vim/vim91/syntax/urlshortcut.vim", "type": "file" }, { - "bom-ref": "d9c5ee6c58fba816", + "bom-ref": "aee9ce00c4f326ae", "name": "/usr/share/vim/vim91/syntax/usserverlog.vim", "type": "file" }, { - "bom-ref": "2748da7966378f80", + "bom-ref": "ca940455469ad794", "name": "/usr/share/vim/vim91/syntax/usw2kagtlog.vim", "type": "file" }, { - "bom-ref": "653626a4e61c8a07", + "bom-ref": "347c26935e58369b", "name": "/usr/share/vim/vim91/syntax/valgrind.vim", "type": "file" }, { - "bom-ref": "f900616028c4067c", + "bom-ref": "ae11c5dd250580dc", "name": "/usr/share/vim/vim91/syntax/vb.vim", "type": "file" }, { - "bom-ref": "a7014805ca864d60", + "bom-ref": "7476ae66b7585d0c", "name": "/usr/share/vim/vim91/syntax/vdf.vim", "type": "file" }, { - "bom-ref": "5168f86b3f41a035", + "bom-ref": "f757ff6831fdc7e5", "name": "/usr/share/vim/vim91/syntax/vera.vim", "type": "file" }, { - "bom-ref": "adf818e8b21f17ab", + "bom-ref": "3917c056bc376723", "name": "/usr/share/vim/vim91/syntax/verilog.vim", "type": "file" }, { - "bom-ref": "12ba804d453bceef", + "bom-ref": "9f79a5a5e3cc3c7f", "name": "/usr/share/vim/vim91/syntax/verilogams.vim", "type": "file" }, { - "bom-ref": "f38efadfaad249b0", + "bom-ref": "27bc4c7f65b88678", "name": "/usr/share/vim/vim91/syntax/vgrindefs.vim", "type": "file" }, { - "bom-ref": "ee16d70c6942d9bd", + "bom-ref": "ba1f4245c5c02301", "name": "/usr/share/vim/vim91/syntax/vhdl.vim", "type": "file" }, { - "bom-ref": "54d2cc3a8ed24134", + "bom-ref": "eacfe05831ca4758", "name": "/usr/share/vim/vim91/syntax/vim.vim", "type": "file" }, { - "bom-ref": "0364f04f4e99acfa", + "bom-ref": "c581165baa43c982", "name": "/usr/share/vim/vim91/syntax/viminfo.vim", "type": "file" }, { - "bom-ref": "99e3af56c3f75ae8", + "bom-ref": "1359fd1d91be42f8", "name": "/usr/share/vim/vim91/syntax/virata.vim", "type": "file" }, { - "bom-ref": "792961e23f24b7c2", + "bom-ref": "680625d869bbaa7a", "name": "/usr/share/vim/vim91/syntax/vmasm.vim", "type": "file" }, { - "bom-ref": "069468a281b234e9", + "bom-ref": "181ca3aa6f900a6d", "name": "/usr/share/vim/vim91/syntax/voscm.vim", "type": "file" }, { - "bom-ref": "b2d504d5f09a6763", + "bom-ref": "1113c8588fc1d087", "name": "/usr/share/vim/vim91/syntax/vrml.vim", "type": "file" }, { - "bom-ref": "e0be805ca8a52f9a", + "bom-ref": "8b3e0adda10ef0ba", "name": "/usr/share/vim/vim91/syntax/vroom.vim", "type": "file" }, { - "bom-ref": "ac6f4f4967dc12c5", + "bom-ref": "96f4cb2e1cbc97b9", "name": "/usr/share/vim/vim91/syntax/vsejcl.vim", "type": "file" }, { - "bom-ref": "dacac42fbdb23c5d", + "bom-ref": "feb2789d4ecc5c85", "name": "/usr/share/vim/vim91/syntax/vue.vim", "type": "file" }, { - "bom-ref": "0cd4df180703d816", + "bom-ref": "5a4d2fec36a69b1e", "name": "/usr/share/vim/vim91/syntax/wat.vim", "type": "file" }, { - "bom-ref": "1929cd487cb72cbe", + "bom-ref": "07716cd4450a8722", "name": "/usr/share/vim/vim91/syntax/wdiff.vim", "type": "file" }, { - "bom-ref": "5ca1df10930fe597", + "bom-ref": "58daa79a00e965d3", "name": "/usr/share/vim/vim91/syntax/wdl.vim", "type": "file" }, { - "bom-ref": "40f7c39a9ac1d1b3", + "bom-ref": "eb201938b2bb9843", "name": "/usr/share/vim/vim91/syntax/web.vim", "type": "file" }, { - "bom-ref": "424639ab26ec9946", + "bom-ref": "afd183e1b955839a", "name": "/usr/share/vim/vim91/syntax/webmacro.vim", "type": "file" }, { - "bom-ref": "c296299f4b54e442", + "bom-ref": "7919a61945515c7a", "name": "/usr/share/vim/vim91/syntax/wget.vim", "type": "file" }, { - "bom-ref": "e474d12c6923bdbf", + "bom-ref": "4f1594bcf29abc87", "name": "/usr/share/vim/vim91/syntax/wget2.vim", "type": "file" }, { - "bom-ref": "f7717b310fa3d735", + "bom-ref": "023611455b1c5c2d", "name": "/usr/share/vim/vim91/syntax/whitespace.vim", "type": "file" }, { - "bom-ref": "81e6e3d48bcd195d", + "bom-ref": "134bc9fd541246a9", "name": "/usr/share/vim/vim91/syntax/winbatch.vim", "type": "file" }, { - "bom-ref": "c4c2f3e2b216e7da", + "bom-ref": "b2042110223ac02a", "name": "/usr/share/vim/vim91/syntax/wml.vim", "type": "file" }, { - "bom-ref": "2c535982799533a6", + "bom-ref": "0b4ecceb7cf938f6", "name": "/usr/share/vim/vim91/syntax/wsh.vim", "type": "file" }, { - "bom-ref": "1efdce4e1cf9c57a", + "bom-ref": "17ad3807ffac215e", "name": "/usr/share/vim/vim91/syntax/wsml.vim", "type": "file" }, { - "bom-ref": "5d13a69e7bcf2011", + "bom-ref": "56415afd97850675", "name": "/usr/share/vim/vim91/syntax/wvdial.vim", "type": "file" }, { - "bom-ref": "4e272dc749963f36", + "bom-ref": "e98921be2f53ddda", "name": "/usr/share/vim/vim91/syntax/xbl.vim", "type": "file" }, { - "bom-ref": "0e08bb1b7f848a2c", + "bom-ref": "eaf9474e30eab994", "name": "/usr/share/vim/vim91/syntax/xcompose.vim", "type": "file" }, { - "bom-ref": "77fccde2887a9f86", + "bom-ref": "c1aa2746b3f944f2", "name": "/usr/share/vim/vim91/syntax/xdefaults.vim", "type": "file" }, { - "bom-ref": "ed6a883761bb9fc5", + "bom-ref": "45d08502e4a62e61", "name": "/usr/share/vim/vim91/syntax/xf86conf.vim", "type": "file" }, { - "bom-ref": "03c8c2fad5f14288", + "bom-ref": "344c70231c5d64ac", "name": "/usr/share/vim/vim91/syntax/xhtml.vim", "type": "file" }, { - "bom-ref": "318ba041a205bf96", + "bom-ref": "6ab112f835cb4e7a", "name": "/usr/share/vim/vim91/syntax/xinetd.vim", "type": "file" }, { - "bom-ref": "55634d754da37115", + "bom-ref": "af7d1ad434370d69", "name": "/usr/share/vim/vim91/syntax/xkb.vim", "type": "file" }, { - "bom-ref": "b60f47e6ae86292e", + "bom-ref": "c75e9ef1abb1b19e", "name": "/usr/share/vim/vim91/syntax/xmath.vim", "type": "file" }, { - "bom-ref": "e3be1206ce851077", + "bom-ref": "585df39593c3725b", "name": "/usr/share/vim/vim91/syntax/xml.vim", "type": "file" }, { - "bom-ref": "8d9f7ebe89b59653", + "bom-ref": "7e0af35b7edec157", "name": "/usr/share/vim/vim91/syntax/xmodmap.vim", "type": "file" }, { - "bom-ref": "eea6ceebc8937162", + "bom-ref": "4a1386645119459e", "name": "/usr/share/vim/vim91/syntax/xpm.vim", "type": "file" }, { - "bom-ref": "4b1b69c6d7f176de", + "bom-ref": "fcc251d86efc09fe", "name": "/usr/share/vim/vim91/syntax/xpm2.vim", "type": "file" }, { - "bom-ref": "b638892c265fa345", + "bom-ref": "a4b5bb655dd60b1d", "name": "/usr/share/vim/vim91/syntax/xquery.vim", "type": "file" }, { - "bom-ref": "f5bc8eeda886c753", + "bom-ref": "b0167ed46903de97", "name": "/usr/share/vim/vim91/syntax/xs.vim", "type": "file" }, { - "bom-ref": "eaf6e834591a6c32", + "bom-ref": "eaf7c5fa654f9362", "name": "/usr/share/vim/vim91/syntax/xsd.vim", "type": "file" }, { - "bom-ref": "0ca3e17f34f6a59a", + "bom-ref": "069038c4f4b496ee", "name": "/usr/share/vim/vim91/syntax/xslt.vim", "type": "file" }, { - "bom-ref": "fdd701e785480391", + "bom-ref": "ca58b6dbd086e8d5", "name": "/usr/share/vim/vim91/syntax/xxd.vim", "type": "file" }, { - "bom-ref": "f55e2b36c59c40ab", + "bom-ref": "8b6423417649dae3", "name": "/usr/share/vim/vim91/syntax/yacc.vim", "type": "file" }, { - "bom-ref": "b63c7bba3dd70976", + "bom-ref": "aee69f671be4163e", "name": "/usr/share/vim/vim91/syntax/yaml.vim", "type": "file" }, { - "bom-ref": "ef049f9f5f1fd62b", + "bom-ref": "7d6f4493e258255b", "name": "/usr/share/vim/vim91/syntax/z8a.vim", "type": "file" }, { - "bom-ref": "7a660379264cc22b", + "bom-ref": "c893794d2d5f8017", "name": "/usr/share/vim/vim91/syntax/zig.vim", "type": "file" }, { - "bom-ref": "6ab30e3b2497ec95", + "bom-ref": "ecc2ee2d4b39f9c1", "name": "/usr/share/vim/vim91/syntax/zimbu.vim", "type": "file" }, { - "bom-ref": "9ba21365ebf9ea8b", + "bom-ref": "d1128d8f422726bf", "name": "/usr/share/vim/vim91/syntax/zir.vim", "type": "file" }, { - "bom-ref": "d0cbcbb54bc25d94", + "bom-ref": "827f66f6817e85c4", "name": "/usr/share/vim/vim91/syntax/zserio.vim", "type": "file" }, { - "bom-ref": "d5bd264f8ac2b669", + "bom-ref": "830fd26983b393c5", "name": "/usr/share/vim/vim91/syntax/zsh.vim", "type": "file" }, { - "bom-ref": "53335203ad683569", + "bom-ref": "63d2c55e6bc28e89", "name": "/usr/share/vim/vim91/tutor/README.ru.utf-8.txt", "type": "file" }, { - "bom-ref": "b11433c3f3eb6ac6", + "bom-ref": "097934e91ad242fe", "name": "/usr/share/vim/vim91/tutor/tutor", "type": "file" }, { - "bom-ref": "f3f8330e0a0e582d", + "bom-ref": "d204027ec3a49e1d", "name": "/usr/share/vim/vim91/tutor/tutor.bar", "type": "file" }, { - "bom-ref": "d409a2fe2c77aa7c", + "bom-ref": "52691ff5cbb1de14", "name": "/usr/share/vim/vim91/tutor/tutor.bar.utf-8", "type": "file" }, { - "bom-ref": "63e6c37769aff44d", + "bom-ref": "f8db1311cd527e55", "name": "/usr/share/vim/vim91/tutor/tutor.bg.utf-8", "type": "file" }, { - "bom-ref": "6ed8f43655526e2e", + "bom-ref": "e723158f99603bf6", "name": "/usr/share/vim/vim91/tutor/tutor.ca", "type": "file" }, { - "bom-ref": "f1ad53913694019e", + "bom-ref": "ba49b2ef13dce016", "name": "/usr/share/vim/vim91/tutor/tutor.ca.utf-8", "type": "file" }, { - "bom-ref": "c9f969f585f07094", + "bom-ref": "7bd18afcef89968c", "name": "/usr/share/vim/vim91/tutor/tutor.cs", "type": "file" }, { - "bom-ref": "d7bb1164f3dd5163", + "bom-ref": "4c908d2d89f84963", "name": "/usr/share/vim/vim91/tutor/tutor.cs.cp1250", "type": "file" }, { - "bom-ref": "3aa86dd4e415ab6e", + "bom-ref": "37a2088d808e0362", "name": "/usr/share/vim/vim91/tutor/tutor.cs.utf-8", "type": "file" }, { - "bom-ref": "ed3f82657511ac4a", + "bom-ref": "5be0b03e73235f92", "name": "/usr/share/vim/vim91/tutor/tutor.da", "type": "file" }, { - "bom-ref": "057fa99859186815", + "bom-ref": "f96a35edd95e26f1", "name": "/usr/share/vim/vim91/tutor/tutor.da.utf-8", "type": "file" }, { - "bom-ref": "8d8e0210e43b38db", + "bom-ref": "f1b542f439e66633", "name": "/usr/share/vim/vim91/tutor/tutor.de", "type": "file" }, { - "bom-ref": "f21f0b6de5106e54", + "bom-ref": "1523279717675448", "name": "/usr/share/vim/vim91/tutor/tutor.de.utf-8", "type": "file" }, { - "bom-ref": "4839fe4c62df8a17", + "bom-ref": "5ad92da33635a3d3", "name": "/usr/share/vim/vim91/tutor/tutor.el", "type": "file" }, { - "bom-ref": "afaa6a0beeec939a", + "bom-ref": "78aa94766f8f8ee6", "name": "/usr/share/vim/vim91/tutor/tutor.el.cp737", "type": "file" }, { - "bom-ref": "41b368a5929c5ae3", + "bom-ref": "78d2fe567fbe5303", "name": "/usr/share/vim/vim91/tutor/tutor.el.utf-8", "type": "file" }, { - "bom-ref": "b06692e61f2d7598", + "bom-ref": "f25b391b0e957de4", "name": "/usr/share/vim/vim91/tutor/tutor.eo", "type": "file" }, { - "bom-ref": "35f9801014c04e8c", + "bom-ref": "beafbca7e14dc808", "name": "/usr/share/vim/vim91/tutor/tutor.eo.utf-8", "type": "file" }, { - "bom-ref": "be2a96527e4a8640", + "bom-ref": "ecc257471212385c", "name": "/usr/share/vim/vim91/tutor/tutor.es", "type": "file" }, { - "bom-ref": "1b9b53458583382e", + "bom-ref": "ed76fe2ea95ee95a", "name": "/usr/share/vim/vim91/tutor/tutor.es.utf-8", "type": "file" }, { - "bom-ref": "22ea6934dc9cbf33", + "bom-ref": "233d94e6f1b01bc3", "name": "/usr/share/vim/vim91/tutor/tutor.fr", "type": "file" }, { - "bom-ref": "769203c4973915a0", + "bom-ref": "093b1750e607e0c8", "name": "/usr/share/vim/vim91/tutor/tutor.fr.utf-8", "type": "file" }, { - "bom-ref": "7e331934e2427981", + "bom-ref": "e3c91d1ffdff717d", "name": "/usr/share/vim/vim91/tutor/tutor.hr", "type": "file" }, { - "bom-ref": "6517e11f1ffa6cc5", + "bom-ref": "d787431b7906e605", "name": "/usr/share/vim/vim91/tutor/tutor.hr.cp1250", "type": "file" }, { - "bom-ref": "9eba049febd60c5f", + "bom-ref": "e81e1d38d77e3a63", "name": "/usr/share/vim/vim91/tutor/tutor.hr.utf-8", "type": "file" }, { - "bom-ref": "b7347546580ecab6", + "bom-ref": "ef728849cb1ba3e2", "name": "/usr/share/vim/vim91/tutor/tutor.hu", "type": "file" }, { - "bom-ref": "ef718b4632484e3a", + "bom-ref": "bf95a85a7657187e", "name": "/usr/share/vim/vim91/tutor/tutor.hu.cp1250", "type": "file" }, { - "bom-ref": "8f42ece15d178409", + "bom-ref": "cc3b7100a1690661", "name": "/usr/share/vim/vim91/tutor/tutor.hu.utf-8", "type": "file" }, { - "bom-ref": "d5793d3dd1c4e756", + "bom-ref": "dfe026379c423946", "name": "/usr/share/vim/vim91/tutor/tutor.it", "type": "file" }, { - "bom-ref": "b6426a87c646c341", + "bom-ref": "43bdf53f436ca47d", "name": "/usr/share/vim/vim91/tutor/tutor.it.utf-8", "type": "file" }, { - "bom-ref": "57ada84b6954d1c7", + "bom-ref": "b14ca20e15d8adc3", "name": "/usr/share/vim/vim91/tutor/tutor.ja.euc", "type": "file" }, { - "bom-ref": "f47c5675947401d1", + "bom-ref": "4ef6b966d542ddd5", "name": "/usr/share/vim/vim91/tutor/tutor.ja.sjis", "type": "file" }, { - "bom-ref": "3dd49522876d90d4", + "bom-ref": "b0fd6650cca5af8c", "name": "/usr/share/vim/vim91/tutor/tutor.ja.utf-8", "type": "file" }, { - "bom-ref": "bda7d0c6f6e93232", + "bom-ref": "7d387b6aa8b1d352", "name": "/usr/share/vim/vim91/tutor/tutor.ko", "type": "file" }, { - "bom-ref": "b24bccbab4fa8a48", + "bom-ref": "1b64ec07e00d61b0", "name": "/usr/share/vim/vim91/tutor/tutor.ko.euc", "type": "file" }, { - "bom-ref": "5aa6cf1cf9a81745", + "bom-ref": "8bc78e333caf234d", "name": "/usr/share/vim/vim91/tutor/tutor.ko.utf-8", "type": "file" }, { - "bom-ref": "fb5551cce98deb5b", + "bom-ref": "99af8cd30646db63", "name": "/usr/share/vim/vim91/tutor/tutor.lv.utf-8", "type": "file" }, { - "bom-ref": "0f7ad5d4322f143a", + "bom-ref": "476c4c2d4d3ccc3a", "name": "/usr/share/vim/vim91/tutor/tutor.nb", "type": "file" }, { - "bom-ref": "57d2faa06d7bc1a1", + "bom-ref": "a6f4652d4b21ac39", "name": "/usr/share/vim/vim91/tutor/tutor.nb.utf-8", "type": "file" }, { - "bom-ref": "d8ba2b3c22132fe3", + "bom-ref": "f66dbab79671cd2f", "name": "/usr/share/vim/vim91/tutor/tutor.nl", "type": "file" }, { - "bom-ref": "efcade9c8549a459", + "bom-ref": "59d25daed62207e1", "name": "/usr/share/vim/vim91/tutor/tutor.nl.utf-8", "type": "file" }, { - "bom-ref": "4fc9b26e1c8a60dd", + "bom-ref": "e22dd6fddbe86f21", "name": "/usr/share/vim/vim91/tutor/tutor.no", "type": "file" }, { - "bom-ref": "46ab4307c6652862", + "bom-ref": "1e3d64342fd8a502", "name": "/usr/share/vim/vim91/tutor/tutor.no.utf-8", "type": "file" }, { - "bom-ref": "31366bb1d0d01fcc", + "bom-ref": "632f3fdf3f321d8c", "name": "/usr/share/vim/vim91/tutor/tutor.pl", "type": "file" }, { - "bom-ref": "8079c3b3e3d03f1f", + "bom-ref": "6f6134179655fe47", "name": "/usr/share/vim/vim91/tutor/tutor.pl.cp1250", "type": "file" }, { - "bom-ref": "ff3eaa8a07d1dded", + "bom-ref": "43feb84948bd17a1", "name": "/usr/share/vim/vim91/tutor/tutor.pl.utf-8", "type": "file" }, { - "bom-ref": "f396a4ea5a137d62", + "bom-ref": "c320045bef6b6312", "name": "/usr/share/vim/vim91/tutor/tutor.pt", "type": "file" }, { - "bom-ref": "a17c18176a9232dc", + "bom-ref": "c50711130722d0a8", "name": "/usr/share/vim/vim91/tutor/tutor.pt.utf-8", "type": "file" }, { - "bom-ref": "53ea551d8546504f", + "bom-ref": "b170c006c9e04f07", "name": "/usr/share/vim/vim91/tutor/tutor.ru", "type": "file" }, { - "bom-ref": "2a411123ccebeccd", + "bom-ref": "fd04e5b348cf48b5", "name": "/usr/share/vim/vim91/tutor/tutor.ru.cp1251", "type": "file" }, { - "bom-ref": "1f11fa41c6a8ce7d", + "bom-ref": "757c531fa1e9e999", "name": "/usr/share/vim/vim91/tutor/tutor.ru.utf-8", "type": "file" }, { - "bom-ref": "07dfc17980f9ae9b", + "bom-ref": "f6232e6bf1c9151b", "name": "/usr/share/vim/vim91/tutor/tutor.sk", "type": "file" }, { - "bom-ref": "716aa408aeb5974d", + "bom-ref": "9c85a031d7ad6d09", "name": "/usr/share/vim/vim91/tutor/tutor.sk.cp1250", "type": "file" }, { - "bom-ref": "fcfc5ef2c89337c6", + "bom-ref": "5895ea29a38a47aa", "name": "/usr/share/vim/vim91/tutor/tutor.sk.utf-8", "type": "file" }, { - "bom-ref": "32a08f6dc73548d0", + "bom-ref": "215bdcae9194e20c", "name": "/usr/share/vim/vim91/tutor/tutor.sr.cp1250", "type": "file" }, { - "bom-ref": "77bc5f07163c2ce3", + "bom-ref": "7300662d59ad46b7", "name": "/usr/share/vim/vim91/tutor/tutor.sr.utf-8", "type": "file" }, { - "bom-ref": "11f0f4e907ab694b", + "bom-ref": "98406e776f12aee7", "name": "/usr/share/vim/vim91/tutor/tutor.sv", "type": "file" }, { - "bom-ref": "a34c4c08a1fa9a37", + "bom-ref": "daa88616be9fec13", "name": "/usr/share/vim/vim91/tutor/tutor.sv.utf-8", "type": "file" }, { - "bom-ref": "a711538a7e87b946", + "bom-ref": "3bb69570730fa752", "name": "/usr/share/vim/vim91/tutor/tutor.tr.iso9", "type": "file" }, { - "bom-ref": "ed57bfb20481c41e", + "bom-ref": "a9681596a4491e5a", "name": "/usr/share/vim/vim91/tutor/tutor.tr.utf-8", "type": "file" }, { - "bom-ref": "fc3c2fad7ceedab9", + "bom-ref": "c568de449acc89b1", "name": "/usr/share/vim/vim91/tutor/tutor.uk.utf-8", "type": "file" }, { - "bom-ref": "7574041b5b99214f", + "bom-ref": "44b52911268ff72f", "name": "/usr/share/vim/vim91/tutor/tutor.utf-8", "type": "file" }, { - "bom-ref": "1f2e723b0af6445c", + "bom-ref": "cf49f45bac40ad4c", "name": "/usr/share/vim/vim91/tutor/tutor.vi.utf-8", "type": "file" }, { - "bom-ref": "2f035f1d2f090b26", + "bom-ref": "9728fa3bca022f76", "name": "/usr/share/vim/vim91/tutor/tutor.vim", "type": "file" }, { - "bom-ref": "ba569ed179a61475", + "bom-ref": "019eb83591746a11", "name": "/usr/share/vim/vim91/tutor/tutor.zh.big5", "type": "file" }, { - "bom-ref": "a0628275f7c784f7", + "bom-ref": "ff69728d11146f93", "name": "/usr/share/vim/vim91/tutor/tutor.zh.euc", "type": "file" }, { - "bom-ref": "d66f26cd4c62001f", + "bom-ref": "4bb0a4f9b0b500db", "name": "/usr/share/vim/vim91/tutor/tutor.zh.utf-8", "type": "file" }, { - "bom-ref": "d307cc334c64c8bb", + "bom-ref": "f85f7ef5f50f42e3", "name": "/usr/share/vim/vim91/tutor/tutor.zh_cn.utf-8", "type": "file" }, { - "bom-ref": "7234b8e339eff9a5", + "bom-ref": "4436438c28bd5ef5", "name": "/usr/share/vim/vim91/tutor/tutor.zh_tw.utf-8", "type": "file" }, { - "bom-ref": "20925b31526c08fd", + "bom-ref": "8c917afe2b757ea5", "name": "/usr/share/vim/vim91/vimrc_example.vim", "type": "file" }, { - "bom-ref": "ee42f436e3c0da6c", - "name": "/usr/share/xml-core/catalog.footer", - "type": "file" - }, - { - "bom-ref": "8fcbb096f0d67f37", - "name": "/usr/share/xml-core/catalog.header", - "type": "file" - }, - { - "bom-ref": "1e7fa2cf2f96a02c", - "name": "/usr/share/xml/dbus-1/busconfig.dtd", - "type": "file" - }, - { - "bom-ref": "6be28694a6c9d451", - "name": "/usr/share/xml/dbus-1/catalog.xml", - "type": "file" - }, - { - "bom-ref": "bd3be681960fb300", - "name": "/usr/share/xml/dbus-1/introspect.dtd", - "type": "file" - }, - { - "bom-ref": "abdcac7129294410", + "bom-ref": "9aea3177f43faa4a", "name": "/usr/share/xml/fontconfig/fonts.dtd", "type": "file" }, { - "bom-ref": "8ea2dab794bd23ae", - "name": "/usr/share/xml/schema/xml-core/catalog.dtd", - "type": "file" - }, - { - "bom-ref": "9e2ff5302ae0307e", - "name": "/usr/share/xml/schema/xml-core/catalog.xml", - "type": "file" - }, - { - "bom-ref": "29fb99549dbdc6ed", - "name": "/usr/share/xml/schema/xml-core/tr9401.dtd", - "type": "file" - }, - { - "bom-ref": "04fc5edf22803323", + "bom-ref": "83aaa8c4399b271b", "name": "/usr/share/zoneinfo/Africa/Abidjan", "type": "file" }, { - "bom-ref": "c5cf39c1131a5486", + "bom-ref": "9ffbe74194012f86", "name": "/usr/share/zoneinfo/Africa/Accra", "type": "file" }, { - "bom-ref": "e9ea5c9196dd69e2", + "bom-ref": "a8db8cb1a4edc86e", "name": "/usr/share/zoneinfo/Africa/Addis_Ababa", "type": "file" }, { - "bom-ref": "82bc20577a575b2c", + "bom-ref": "88228042368f2e60", "name": "/usr/share/zoneinfo/Africa/Algiers", "type": "file" }, { - "bom-ref": "950bb3e263f76771", + "bom-ref": "4c9bc6dc6a462cc1", "name": "/usr/share/zoneinfo/Africa/Asmara", "type": "file" }, { - "bom-ref": "c70f0a9a61a8546c", + "bom-ref": "60a805aaa6eb2070", "name": "/usr/share/zoneinfo/Africa/Bamako", "type": "file" }, { - "bom-ref": "2dde983ba7cbaff7", + "bom-ref": "2a159c2099636db7", "name": "/usr/share/zoneinfo/Africa/Bangui", "type": "file" }, { - "bom-ref": "ab22d80fc54732ef", + "bom-ref": "44354afa462e17b3", "name": "/usr/share/zoneinfo/Africa/Banjul", "type": "file" }, { - "bom-ref": "27473351437ef21c", + "bom-ref": "d80e0dd9565ee87c", "name": "/usr/share/zoneinfo/Africa/Bissau", "type": "file" }, { - "bom-ref": "173dc91bd66c43a5", + "bom-ref": "f33522a0ace399f9", "name": "/usr/share/zoneinfo/Africa/Blantyre", "type": "file" }, { - "bom-ref": "5253bfd7a945c6d9", + "bom-ref": "d76a30421868c859", "name": "/usr/share/zoneinfo/Africa/Brazzaville", "type": "file" }, { - "bom-ref": "00afab7a18fbd5ab", + "bom-ref": "c4fc281609a5f913", "name": "/usr/share/zoneinfo/Africa/Bujumbura", "type": "file" }, { - "bom-ref": "51cad1ca6474994e", + "bom-ref": "903a94795afc6c2a", "name": "/usr/share/zoneinfo/Africa/Cairo", "type": "file" }, { - "bom-ref": "f05300d97738058e", + "bom-ref": "5bef6173d6b0ec86", "name": "/usr/share/zoneinfo/Africa/Casablanca", "type": "file" }, { - "bom-ref": "51b3b3d195de9b90", + "bom-ref": "7c60d622c785d188", "name": "/usr/share/zoneinfo/Africa/Ceuta", "type": "file" }, { - "bom-ref": "9b9a827afbc9f6d6", + "bom-ref": "5704e6a87938ea22", "name": "/usr/share/zoneinfo/Africa/Conakry", "type": "file" }, { - "bom-ref": "b0f9ad3fdd61f6ba", + "bom-ref": "0fc8602c1757925e", "name": "/usr/share/zoneinfo/Africa/Dakar", "type": "file" }, { - "bom-ref": "60aaba4f6413c379", + "bom-ref": "98f8455186d7f511", "name": "/usr/share/zoneinfo/Africa/Dar_es_Salaam", "type": "file" }, { - "bom-ref": "79b0be380ac17620", + "bom-ref": "c7984e5c626bac64", "name": "/usr/share/zoneinfo/Africa/Djibouti", "type": "file" }, { - "bom-ref": "946acfba5398a88f", + "bom-ref": "3e98c953df39419f", "name": "/usr/share/zoneinfo/Africa/Douala", "type": "file" }, { - "bom-ref": "2edb158dab2c0543", + "bom-ref": "26c2503329c9112f", "name": "/usr/share/zoneinfo/Africa/El_Aaiun", "type": "file" }, { - "bom-ref": "9ed854437866e72b", + "bom-ref": "1c89ba27140f2893", "name": "/usr/share/zoneinfo/Africa/Freetown", "type": "file" }, { - "bom-ref": "ce762a35f4096c9c", + "bom-ref": "aa13121b2eb5d364", "name": "/usr/share/zoneinfo/Africa/Gaborone", "type": "file" }, { - "bom-ref": "62b51eba05e7d310", + "bom-ref": "f1ac68629f8606f4", "name": "/usr/share/zoneinfo/Africa/Harare", "type": "file" }, { - "bom-ref": "4a68c72c3b734ec4", + "bom-ref": "03c89e6b77a336bc", "name": "/usr/share/zoneinfo/Africa/Johannesburg", "type": "file" }, { - "bom-ref": "dda98c561c8a1c87", + "bom-ref": "59d37d5ca7f3f963", "name": "/usr/share/zoneinfo/Africa/Juba", "type": "file" }, { - "bom-ref": "19694b09ca7f0497", + "bom-ref": "d27049b320af9f27", "name": "/usr/share/zoneinfo/Africa/Kampala", "type": "file" }, { - "bom-ref": "9f5bfafad5b8db9b", + "bom-ref": "378622b67a65fea3", "name": "/usr/share/zoneinfo/Africa/Khartoum", "type": "file" }, { - "bom-ref": "56423e50d130cb2e", + "bom-ref": "ad64430c089996e2", "name": "/usr/share/zoneinfo/Africa/Kigali", "type": "file" }, { - "bom-ref": "e1f4e6b6b57febb8", + "bom-ref": "28ca5800c6cc13a8", "name": "/usr/share/zoneinfo/Africa/Kinshasa", "type": "file" }, { - "bom-ref": "908330c905d89f9a", + "bom-ref": "1e17f652f3321c3a", "name": "/usr/share/zoneinfo/Africa/Lagos", "type": "file" }, { - "bom-ref": "f8b6446e34c11563", + "bom-ref": "421615f349be6907", "name": "/usr/share/zoneinfo/Africa/Libreville", "type": "file" }, { - "bom-ref": "d1cd3eb8b1498f31", + "bom-ref": "eec09ef05831a2e1", "name": "/usr/share/zoneinfo/Africa/Lome", "type": "file" }, { - "bom-ref": "9fdccf2cb97fb3b4", + "bom-ref": "f688c96c9a5e7c74", "name": "/usr/share/zoneinfo/Africa/Luanda", "type": "file" }, { - "bom-ref": "140dcf6a67fe756e", + "bom-ref": "8464b33cdd2a4572", "name": "/usr/share/zoneinfo/Africa/Lubumbashi", "type": "file" }, { - "bom-ref": "9e7c2eeff4b12968", + "bom-ref": "a04739e94a861608", "name": "/usr/share/zoneinfo/Africa/Lusaka", "type": "file" }, { - "bom-ref": "b50181216974a1c3", + "bom-ref": "7a1e53ae0520e0f7", "name": "/usr/share/zoneinfo/Africa/Malabo", "type": "file" }, { - "bom-ref": "a2478ad352171a5f", + "bom-ref": "7ef2a82eaed2acc7", "name": "/usr/share/zoneinfo/Africa/Maputo", "type": "file" }, { - "bom-ref": "bc3be25e427ee983", + "bom-ref": "1f990f15a8e6dfeb", "name": "/usr/share/zoneinfo/Africa/Maseru", "type": "file" }, { - "bom-ref": "7712bccf2fad4024", + "bom-ref": "b5776f03e72b78ac", "name": "/usr/share/zoneinfo/Africa/Mbabane", "type": "file" }, { - "bom-ref": "43ecbf39b2b273de", + "bom-ref": "403dcf43565f1c6a", "name": "/usr/share/zoneinfo/Africa/Mogadishu", "type": "file" }, { - "bom-ref": "51fee3653635321f", + "bom-ref": "758ccd87fe94685b", "name": "/usr/share/zoneinfo/Africa/Monrovia", "type": "file" }, { - "bom-ref": "d7002ec544124bf4", + "bom-ref": "78262dbbd36362ec", "name": "/usr/share/zoneinfo/Africa/Nairobi", "type": "file" }, { - "bom-ref": "ff2734ab8c5ab49d", + "bom-ref": "234d4707823e2f41", "name": "/usr/share/zoneinfo/Africa/Ndjamena", "type": "file" }, { - "bom-ref": "e9e442657b61bdec", + "bom-ref": "b697f9dbdc7be89c", "name": "/usr/share/zoneinfo/Africa/Niamey", "type": "file" }, { - "bom-ref": "671020eb85b1d9bd", + "bom-ref": "001de9f80f748009", "name": "/usr/share/zoneinfo/Africa/Nouakchott", "type": "file" }, { - "bom-ref": "f93489fd92de51d4", + "bom-ref": "b6fa4c277187ab30", "name": "/usr/share/zoneinfo/Africa/Ouagadougou", "type": "file" }, { - "bom-ref": "d9b5343f7339dd2b", + "bom-ref": "eebc7efa6a39889b", "name": "/usr/share/zoneinfo/Africa/Porto-Novo", "type": "file" }, { - "bom-ref": "f9dfc1d3095344fb", + "bom-ref": "c5082ffdf8af142f", "name": "/usr/share/zoneinfo/Africa/Sao_Tome", "type": "file" }, { - "bom-ref": "f50aa755209eb770", + "bom-ref": "b49a9c3cce7a293c", "name": "/usr/share/zoneinfo/Africa/Tripoli", "type": "file" }, { - "bom-ref": "12ce45204a11f367", + "bom-ref": "e4b58ad1cd8abd47", "name": "/usr/share/zoneinfo/Africa/Tunis", "type": "file" }, { - "bom-ref": "a67fbd5e04c93f33", + "bom-ref": "50a4bf66dc511c73", "name": "/usr/share/zoneinfo/Africa/Windhoek", "type": "file" }, { - "bom-ref": "a153f720555a7597", + "bom-ref": "2759c207cd228cef", "name": "/usr/share/zoneinfo/America/Adak", "type": "file" }, { - "bom-ref": "a44cd1f0e94f5d23", + "bom-ref": "6e5fd31ecb713983", "name": "/usr/share/zoneinfo/America/Anchorage", "type": "file" }, { - "bom-ref": "79ea82cd234a8cf8", + "bom-ref": "31ef2b2cef484f04", "name": "/usr/share/zoneinfo/America/Anguilla", "type": "file" }, { - "bom-ref": "5a18e08e1e6ead15", + "bom-ref": "5844b0ae92bdb2f5", "name": "/usr/share/zoneinfo/America/Antigua", "type": "file" }, { - "bom-ref": "28a5a89bc7ce652d", + "bom-ref": "02cf95ce1be5d92d", "name": "/usr/share/zoneinfo/America/Araguaina", "type": "file" }, { - "bom-ref": "8d1608bfd706d13c", + "bom-ref": "73a6dc7de49d0784", "name": "/usr/share/zoneinfo/America/Argentina/Buenos_Aires", "type": "file" }, { - "bom-ref": "5a5b657b12c6216a", + "bom-ref": "8aae51aafb4d3c7e", "name": "/usr/share/zoneinfo/America/Argentina/Catamarca", "type": "file" }, { - "bom-ref": "0015c742359635e2", + "bom-ref": "4475fc068c75de76", "name": "/usr/share/zoneinfo/America/Argentina/Cordoba", "type": "file" }, { - "bom-ref": "b0cfa4ed4217290b", + "bom-ref": "0e913042ca949c4b", "name": "/usr/share/zoneinfo/America/Argentina/Jujuy", "type": "file" }, { - "bom-ref": "ca67fec1ac15ac05", + "bom-ref": "b761f2d36d308045", "name": "/usr/share/zoneinfo/America/Argentina/La_Rioja", "type": "file" }, { - "bom-ref": "73591d1115190234", + "bom-ref": "12284f8aca3ef114", "name": "/usr/share/zoneinfo/America/Argentina/Mendoza", "type": "file" }, { - "bom-ref": "160d3e8d9e5cf1b6", + "bom-ref": "39aaf2868af46022", "name": "/usr/share/zoneinfo/America/Argentina/Rio_Gallegos", "type": "file" }, { - "bom-ref": "6eef1a1f4b19716b", + "bom-ref": "98c0a32e15d44fd3", "name": "/usr/share/zoneinfo/America/Argentina/Salta", "type": "file" }, { - "bom-ref": "426df6f3d4afc074", + "bom-ref": "21965cf52f422c0c", "name": "/usr/share/zoneinfo/America/Argentina/San_Juan", "type": "file" }, { - "bom-ref": "a4cfcb7e5a3dc544", + "bom-ref": "f1c713de8e77052c", "name": "/usr/share/zoneinfo/America/Argentina/San_Luis", "type": "file" }, { - "bom-ref": "7a9dcfed75743f0a", + "bom-ref": "aa9d5dc3c2215482", "name": "/usr/share/zoneinfo/America/Argentina/Tucuman", "type": "file" }, { - "bom-ref": "8a6a6d8782cf83d6", + "bom-ref": "eaaa3f47450fc4d2", "name": "/usr/share/zoneinfo/America/Argentina/Ushuaia", "type": "file" }, { - "bom-ref": "c6c6b24a0c164905", + "bom-ref": "eaa3f443cf1ca689", "name": "/usr/share/zoneinfo/America/Aruba", "type": "file" }, { - "bom-ref": "ede2a2a5e69264e4", + "bom-ref": "01916ab2d7ae3600", "name": "/usr/share/zoneinfo/America/Asuncion", "type": "file" }, { - "bom-ref": "5487b8314f6ffc4f", + "bom-ref": "011ffeb2681186ff", "name": "/usr/share/zoneinfo/America/Atikokan", "type": "file" }, { - "bom-ref": "d0b136d6067a776e", + "bom-ref": "efaa33f58f39a4b2", "name": "/usr/share/zoneinfo/America/Bahia", "type": "file" }, { - "bom-ref": "99baaef600bec80c", + "bom-ref": "782adac23fcddd08", "name": "/usr/share/zoneinfo/America/Bahia_Banderas", "type": "file" }, { - "bom-ref": "7b73f2084edc6f63", + "bom-ref": "86be3c4df97d56bf", "name": "/usr/share/zoneinfo/America/Barbados", "type": "file" }, { - "bom-ref": "37c6bd3177884456", + "bom-ref": "585c142d8a7bf68e", "name": "/usr/share/zoneinfo/America/Belem", "type": "file" }, { - "bom-ref": "e769ce78e5f21f5b", + "bom-ref": "f98fc60d5c697c1b", "name": "/usr/share/zoneinfo/America/Belize", "type": "file" }, { - "bom-ref": "29e571e4aa40c299", + "bom-ref": "8836e14b7a0dd8fd", "name": "/usr/share/zoneinfo/America/Blanc-Sablon", "type": "file" }, { - "bom-ref": "98e01b1258e0f6f8", + "bom-ref": "e770785e394a8598", "name": "/usr/share/zoneinfo/America/Boa_Vista", "type": "file" }, { - "bom-ref": "c18b4a321311247d", + "bom-ref": "bff4b994377ce12d", "name": "/usr/share/zoneinfo/America/Bogota", "type": "file" }, { - "bom-ref": "a9d5774ee7bfd022", + "bom-ref": "13dcd5bef656fb5a", "name": "/usr/share/zoneinfo/America/Boise", "type": "file" }, { - "bom-ref": "6fc44ad5652aa7f0", + "bom-ref": "9d2e9e0b788fded4", "name": "/usr/share/zoneinfo/America/Cambridge_Bay", "type": "file" }, { - "bom-ref": "ba691029dc7e0f85", + "bom-ref": "c02e3813b0f0a83d", "name": "/usr/share/zoneinfo/America/Campo_Grande", "type": "file" }, { - "bom-ref": "3fa47c4555c71b99", + "bom-ref": "3e6419a52f474ba5", "name": "/usr/share/zoneinfo/America/Cancun", "type": "file" }, { - "bom-ref": "58d1944791b9818a", + "bom-ref": "e149cf85343d0bce", "name": "/usr/share/zoneinfo/America/Caracas", "type": "file" }, { - "bom-ref": "304b6414f043cd1f", + "bom-ref": "14f242af3ebde95b", "name": "/usr/share/zoneinfo/America/Cayenne", "type": "file" }, { - "bom-ref": "71d21f81c8b71f10", + "bom-ref": "a6dafae7748f0398", "name": "/usr/share/zoneinfo/America/Cayman", "type": "file" }, { - "bom-ref": "bbf6a89acacea41c", + "bom-ref": "c10f5038029e8c10", "name": "/usr/share/zoneinfo/America/Chicago", "type": "file" }, { - "bom-ref": "16cfc785a1085a74", + "bom-ref": "db54b9f0c56ae818", "name": "/usr/share/zoneinfo/America/Chihuahua", "type": "file" }, { - "bom-ref": "abc8fada29236533", + "bom-ref": "de49f51fcb50fd33", "name": "/usr/share/zoneinfo/America/Ciudad_Juarez", "type": "file" }, { - "bom-ref": "d464d928c102c2c2", + "bom-ref": "667a7de241bb136e", "name": "/usr/share/zoneinfo/America/Costa_Rica", "type": "file" }, { - "bom-ref": "423b22fe6f22ba32", + "bom-ref": "66fa187db5ecdf96", "name": "/usr/share/zoneinfo/America/Coyhaique", "type": "file" }, { - "bom-ref": "4aa4022df815a79e", + "bom-ref": "d54fdad92197795a", "name": "/usr/share/zoneinfo/America/Creston", "type": "file" }, { - "bom-ref": "21ba0e46bc7ca0f5", + "bom-ref": "0adc291efd2e7085", "name": "/usr/share/zoneinfo/America/Cuiaba", "type": "file" }, { - "bom-ref": "5bea2d9a6a488698", + "bom-ref": "6b746bcf2a01f5d0", "name": "/usr/share/zoneinfo/America/Curacao", "type": "file" }, { - "bom-ref": "b49db428000ab164", + "bom-ref": "840986b15eb239ec", "name": "/usr/share/zoneinfo/America/Danmarkshavn", "type": "file" }, { - "bom-ref": "0c91896cadd95fb0", + "bom-ref": "8374d362a1fe1d30", "name": "/usr/share/zoneinfo/America/Dawson", "type": "file" }, { - "bom-ref": "f3ca74dc3ebbd9e5", + "bom-ref": "ff2de1ad7aa94771", "name": "/usr/share/zoneinfo/America/Dawson_Creek", "type": "file" }, { - "bom-ref": "d0a715d859da2748", + "bom-ref": "d74c4f7b141c04a4", "name": "/usr/share/zoneinfo/America/Denver", "type": "file" }, { - "bom-ref": "dc2dba51cd8ea480", + "bom-ref": "61a0763e2aaeb948", "name": "/usr/share/zoneinfo/America/Detroit", "type": "file" }, { - "bom-ref": "b94d4388feae8ce2", + "bom-ref": "97f305c6a6c40796", "name": "/usr/share/zoneinfo/America/Dominica", "type": "file" }, { - "bom-ref": "27e507c5b4684699", + "bom-ref": "3644d8be83aaca49", "name": "/usr/share/zoneinfo/America/Edmonton", "type": "file" }, { - "bom-ref": "3d932aa2d183525d", + "bom-ref": "8bcd66ec12ed67d9", "name": "/usr/share/zoneinfo/America/Eirunepe", "type": "file" }, { - "bom-ref": "117a41dfdb003945", + "bom-ref": "21d631ab5ce29b81", "name": "/usr/share/zoneinfo/America/El_Salvador", "type": "file" }, { - "bom-ref": "beecbda4e8ea3815", + "bom-ref": "065d6591b4699e29", "name": "/usr/share/zoneinfo/America/Fort_Nelson", "type": "file" }, { - "bom-ref": "f69b6cebc0acf51f", + "bom-ref": "ff7a3d10a600da83", "name": "/usr/share/zoneinfo/America/Fortaleza", "type": "file" }, { - "bom-ref": "3f96fdeb8c9f22b1", + "bom-ref": "d7b03352943a4469", "name": "/usr/share/zoneinfo/America/Glace_Bay", "type": "file" }, { - "bom-ref": "52780f47f37f2fa4", + "bom-ref": "c8c50f87bf0b4e34", "name": "/usr/share/zoneinfo/America/Goose_Bay", "type": "file" }, { - "bom-ref": "db67dec8158f36c4", + "bom-ref": "8e05454626b54924", "name": "/usr/share/zoneinfo/America/Grand_Turk", "type": "file" }, { - "bom-ref": "6a3572f2f1598365", + "bom-ref": "6230eed299ae622d", "name": "/usr/share/zoneinfo/America/Grenada", "type": "file" }, { - "bom-ref": "e4458c00e628cff8", + "bom-ref": "501f6cde0fabb15c", "name": "/usr/share/zoneinfo/America/Guadeloupe", "type": "file" }, { - "bom-ref": "0ad587c0740a73d3", + "bom-ref": "40ad11824448502b", "name": "/usr/share/zoneinfo/America/Guatemala", "type": "file" }, { - "bom-ref": "4663e640895327f2", + "bom-ref": "500b5651dba0d48a", "name": "/usr/share/zoneinfo/America/Guayaquil", "type": "file" }, { - "bom-ref": "c1fcc8899d53ff39", + "bom-ref": "d3bb967e12b0b19d", "name": "/usr/share/zoneinfo/America/Guyana", "type": "file" }, { - "bom-ref": "2e816af5a2359fc0", + "bom-ref": "5ae3f72da28f367c", "name": "/usr/share/zoneinfo/America/Halifax", "type": "file" }, { - "bom-ref": "17b6d0c1d0585148", + "bom-ref": "dbb1433432b61150", "name": "/usr/share/zoneinfo/America/Havana", "type": "file" }, { - "bom-ref": "db73b13030a5d8fc", + "bom-ref": "28d196a5bad13864", "name": "/usr/share/zoneinfo/America/Hermosillo", "type": "file" }, { - "bom-ref": "bd9cdcfeb08022ec", + "bom-ref": "cbc22152e66248fc", "name": "/usr/share/zoneinfo/America/Indiana/Indianapolis", "type": "file" }, { - "bom-ref": "ca7d23f9f4c5c029", + "bom-ref": "31c6024d19d1fe89", "name": "/usr/share/zoneinfo/America/Indiana/Knox", "type": "file" }, { - "bom-ref": "7cbadbb7a399b31f", + "bom-ref": "04afa020b2be057f", "name": "/usr/share/zoneinfo/America/Indiana/Marengo", "type": "file" }, { - "bom-ref": "309f1935c1f18646", + "bom-ref": "82f4049dd310fe1a", "name": "/usr/share/zoneinfo/America/Indiana/Petersburg", "type": "file" }, { - "bom-ref": "21a228d4872fb3aa", + "bom-ref": "88429776328a4c12", "name": "/usr/share/zoneinfo/America/Indiana/Tell_City", "type": "file" }, { - "bom-ref": "bb3684442a8fb713", + "bom-ref": "75a843cf2d90114b", "name": "/usr/share/zoneinfo/America/Indiana/Vevay", "type": "file" }, { - "bom-ref": "e103cc0b25ede50b", + "bom-ref": "d33296279ebc69cb", "name": "/usr/share/zoneinfo/America/Indiana/Vincennes", "type": "file" }, { - "bom-ref": "8445af3c0d3ac4a3", + "bom-ref": "81324b13639b14bf", "name": "/usr/share/zoneinfo/America/Indiana/Winamac", "type": "file" }, { - "bom-ref": "cabb4256319f7222", + "bom-ref": "ba8bfae45caf13a6", "name": "/usr/share/zoneinfo/America/Inuvik", "type": "file" }, { - "bom-ref": "2ceab1106bfa973a", + "bom-ref": "0b1cee888e958786", "name": "/usr/share/zoneinfo/America/Iqaluit", "type": "file" }, { - "bom-ref": "6634e9b5d52bef49", + "bom-ref": "aa2c5afb0223a879", "name": "/usr/share/zoneinfo/America/Jamaica", "type": "file" }, { - "bom-ref": "5ada91ec8f95b5aa", + "bom-ref": "2d9fd9585404eafa", "name": "/usr/share/zoneinfo/America/Juneau", "type": "file" }, { - "bom-ref": "ccd7d528c1ed3c03", + "bom-ref": "7088d97a07aaf9df", "name": "/usr/share/zoneinfo/America/Kentucky/Louisville", "type": "file" }, { - "bom-ref": "ee28d5ec140ef036", + "bom-ref": "958766bf867e03a2", "name": "/usr/share/zoneinfo/America/Kentucky/Monticello", "type": "file" }, { - "bom-ref": "ad3d15acbcc8da0f", + "bom-ref": "ebbc13c01c566303", "name": "/usr/share/zoneinfo/America/La_Paz", "type": "file" }, { - "bom-ref": "bbdfb2fe98cc6574", + "bom-ref": "a74916383ed47458", "name": "/usr/share/zoneinfo/America/Lima", "type": "file" }, { - "bom-ref": "6e42bfc21b8b0a57", + "bom-ref": "92bd44f285f5b6ef", "name": "/usr/share/zoneinfo/America/Los_Angeles", "type": "file" }, { - "bom-ref": "99200eaec5b9b3f7", + "bom-ref": "3d301402c947932f", "name": "/usr/share/zoneinfo/America/Maceio", "type": "file" }, { - "bom-ref": "d775af52dbcb7b94", + "bom-ref": "f207ad768f36a650", "name": "/usr/share/zoneinfo/America/Managua", "type": "file" }, { - "bom-ref": "b04fd876d5988e38", + "bom-ref": "e92abff96809d0fc", "name": "/usr/share/zoneinfo/America/Manaus", "type": "file" }, { - "bom-ref": "c4bf1a2eb20cf08e", + "bom-ref": "559e14e14547d1f2", "name": "/usr/share/zoneinfo/America/Martinique", "type": "file" }, { - "bom-ref": "c25f8a8c1c09a580", + "bom-ref": "e96dbe3c79a6d470", "name": "/usr/share/zoneinfo/America/Matamoros", "type": "file" }, { - "bom-ref": "7bdf028eed3a4cf6", + "bom-ref": "c190f249b771fe66", "name": "/usr/share/zoneinfo/America/Mazatlan", "type": "file" }, { - "bom-ref": "0c83fc00e599f38c", + "bom-ref": "9c2b0e0890d55db4", "name": "/usr/share/zoneinfo/America/Menominee", "type": "file" }, { - "bom-ref": "bb474222d7156da8", + "bom-ref": "11a4a3283901bbd8", "name": "/usr/share/zoneinfo/America/Merida", "type": "file" }, { - "bom-ref": "a20e82e3b4c4265c", + "bom-ref": "d54afba5fdb272cc", "name": "/usr/share/zoneinfo/America/Metlakatla", "type": "file" }, { - "bom-ref": "0da305f6722473d4", + "bom-ref": "c3e6d1cb17d283a0", "name": "/usr/share/zoneinfo/America/Mexico_City", "type": "file" }, { - "bom-ref": "91c28e4af7ada373", + "bom-ref": "9f8b4d98a7de66d3", "name": "/usr/share/zoneinfo/America/Miquelon", "type": "file" }, { - "bom-ref": "ec34680f95518726", + "bom-ref": "902e0666c1a236a2", "name": "/usr/share/zoneinfo/America/Moncton", "type": "file" }, { - "bom-ref": "b17e818beb644a76", + "bom-ref": "063f14fb0a19e68a", "name": "/usr/share/zoneinfo/America/Monterrey", "type": "file" }, { - "bom-ref": "8730157c57736474", + "bom-ref": "accbadfb8149ac7c", "name": "/usr/share/zoneinfo/America/Montevideo", "type": "file" }, { - "bom-ref": "68f15c57c05144de", + "bom-ref": "0b09d0148d4d5bfe", "name": "/usr/share/zoneinfo/America/Montserrat", "type": "file" }, { - "bom-ref": "87da19333ce11626", + "bom-ref": "002a19e8644cff02", "name": "/usr/share/zoneinfo/America/Nassau", "type": "file" }, { - "bom-ref": "2fdf72b6e4e7da4f", + "bom-ref": "0631cede885c969b", "name": "/usr/share/zoneinfo/America/New_York", "type": "file" }, { - "bom-ref": "dc6af845e8040196", + "bom-ref": "596062b656ab848a", "name": "/usr/share/zoneinfo/America/Nome", "type": "file" }, { - "bom-ref": "e94a0e1765507a8f", + "bom-ref": "631a1b47a2e5016f", "name": "/usr/share/zoneinfo/America/Noronha", "type": "file" }, { - "bom-ref": "a8e07b735de56b93", + "bom-ref": "aa22275081b3d90f", "name": "/usr/share/zoneinfo/America/North_Dakota/Beulah", "type": "file" }, { - "bom-ref": "42cacb85ce435681", + "bom-ref": "da3c25440c198a3d", "name": "/usr/share/zoneinfo/America/North_Dakota/Center", "type": "file" }, { - "bom-ref": "80a00447d6ccf3ef", + "bom-ref": "9f4112bd1aeddf13", "name": "/usr/share/zoneinfo/America/North_Dakota/New_Salem", "type": "file" }, { - "bom-ref": "f66a4d0974c87f62", + "bom-ref": "478d797d69b360c2", "name": "/usr/share/zoneinfo/America/Nuuk", "type": "file" }, { - "bom-ref": "e8430ae20b17b788", + "bom-ref": "f4d047e2c6e8386c", "name": "/usr/share/zoneinfo/America/Ojinaga", "type": "file" }, { - "bom-ref": "525d9bb9bfc91f06", + "bom-ref": "4bcd5a6c3736272e", "name": "/usr/share/zoneinfo/America/Panama", "type": "file" }, { - "bom-ref": "91a106c67f01bb04", + "bom-ref": "3ef08db19554e67c", "name": "/usr/share/zoneinfo/America/Paramaribo", "type": "file" }, { - "bom-ref": "edfb9aad8dd85917", + "bom-ref": "650401083fcfe997", "name": "/usr/share/zoneinfo/America/Phoenix", "type": "file" }, { - "bom-ref": "446dea4fe463f9a4", + "bom-ref": "a3ab805ea13ca094", "name": "/usr/share/zoneinfo/America/Port-au-Prince", "type": "file" }, { - "bom-ref": "f9d719f611242023", + "bom-ref": "4a33f9827e11f707", "name": "/usr/share/zoneinfo/America/Port_of_Spain", "type": "file" }, { - "bom-ref": "1df9b39af813ed41", + "bom-ref": "16130929068c29f9", "name": "/usr/share/zoneinfo/America/Porto_Velho", "type": "file" }, { - "bom-ref": "99388163ff5f44fb", + "bom-ref": "99a90678f7e062c3", "name": "/usr/share/zoneinfo/America/Puerto_Rico", "type": "file" }, { - "bom-ref": "d67c28d02d272b5b", + "bom-ref": "4cc499da10aaaa13", "name": "/usr/share/zoneinfo/America/Punta_Arenas", "type": "file" }, { - "bom-ref": "f4ccfc73e45b802b", + "bom-ref": "b2285893957671a7", "name": "/usr/share/zoneinfo/America/Rankin_Inlet", "type": "file" }, { - "bom-ref": "72f88cf4f5af63e5", + "bom-ref": "f6640ecd67036e01", "name": "/usr/share/zoneinfo/America/Recife", "type": "file" }, { - "bom-ref": "f54f893eee69de54", + "bom-ref": "d8b614a02c4d06a8", "name": "/usr/share/zoneinfo/America/Regina", "type": "file" }, { - "bom-ref": "be403a814bab56db", + "bom-ref": "3d16f20feeff365f", "name": "/usr/share/zoneinfo/America/Resolute", "type": "file" }, { - "bom-ref": "aa11f9db79e69f2b", + "bom-ref": "614b2237c2f42b77", "name": "/usr/share/zoneinfo/America/Rio_Branco", "type": "file" }, { - "bom-ref": "1e9378fa2e49f502", + "bom-ref": "355bb6bbc16e0d0e", "name": "/usr/share/zoneinfo/America/Santarem", "type": "file" }, { - "bom-ref": "1d22c284868d3efd", + "bom-ref": "18d71084c3ab5491", "name": "/usr/share/zoneinfo/America/Santiago", "type": "file" }, { - "bom-ref": "b15f9e6d4c9eee51", + "bom-ref": "392a5b08680c75c1", "name": "/usr/share/zoneinfo/America/Santo_Domingo", "type": "file" }, { - "bom-ref": "4776599fde53a78f", + "bom-ref": "4b28f53836058e2b", "name": "/usr/share/zoneinfo/America/Sao_Paulo", "type": "file" }, { - "bom-ref": "f6baa40c4ddbe3d3", + "bom-ref": "136becd921efc83b", "name": "/usr/share/zoneinfo/America/Scoresbysund", "type": "file" }, { - "bom-ref": "cb3c3c1410f0b1dc", + "bom-ref": "485927170f0dba18", "name": "/usr/share/zoneinfo/America/Sitka", "type": "file" }, { - "bom-ref": "321a052dbfdcafdf", + "bom-ref": "fd302f7bc1e626ab", "name": "/usr/share/zoneinfo/America/St_Johns", "type": "file" }, { - "bom-ref": "529427f4abb09f2c", + "bom-ref": "7c671cc43e9317cc", "name": "/usr/share/zoneinfo/America/St_Kitts", "type": "file" }, { - "bom-ref": "fffe85ca2739382f", + "bom-ref": "83a21857ba46f413", "name": "/usr/share/zoneinfo/America/St_Lucia", "type": "file" }, { - "bom-ref": "0d4f77e675c9e9ba", + "bom-ref": "f9f1a904bf542492", "name": "/usr/share/zoneinfo/America/St_Thomas", "type": "file" }, { - "bom-ref": "1be132612b031322", + "bom-ref": "3f83f97321f82faa", "name": "/usr/share/zoneinfo/America/St_Vincent", "type": "file" }, { - "bom-ref": "fd76ce62a5e092a0", + "bom-ref": "9bc9180012757ab0", "name": "/usr/share/zoneinfo/America/Swift_Current", "type": "file" }, { - "bom-ref": "3d5e1690885f9acb", + "bom-ref": "e8d2e47e85d8a41b", "name": "/usr/share/zoneinfo/America/Tegucigalpa", "type": "file" }, { - "bom-ref": "a06fffe836a0eab3", + "bom-ref": "322591ebf03d215b", "name": "/usr/share/zoneinfo/America/Thule", "type": "file" }, { - "bom-ref": "49dd4a729393357c", + "bom-ref": "a030cb9bab75bd7c", "name": "/usr/share/zoneinfo/America/Tijuana", "type": "file" }, { - "bom-ref": "e04d2fa401fedb06", + "bom-ref": "5edd4d6e355aefd2", "name": "/usr/share/zoneinfo/America/Toronto", "type": "file" }, { - "bom-ref": "727c92679ce12132", + "bom-ref": "63f46650a4a0884e", "name": "/usr/share/zoneinfo/America/Tortola", "type": "file" }, { - "bom-ref": "c9cfce35fb5c3205", + "bom-ref": "3600c0c97b0d9a29", "name": "/usr/share/zoneinfo/America/Vancouver", "type": "file" }, { - "bom-ref": "0b51a92ca8f81a94", + "bom-ref": "95ce6aadd13ca800", "name": "/usr/share/zoneinfo/America/Whitehorse", "type": "file" }, { - "bom-ref": "e1a02d57b29edd77", + "bom-ref": "7a52313af25258ef", "name": "/usr/share/zoneinfo/America/Winnipeg", "type": "file" }, { - "bom-ref": "a4ef9c4775314c27", + "bom-ref": "6f9484478973bbbf", "name": "/usr/share/zoneinfo/America/Yakutat", "type": "file" }, { - "bom-ref": "763191e2ce75c6f6", + "bom-ref": "6f4632ad014bbb1e", "name": "/usr/share/zoneinfo/Antarctica/Casey", "type": "file" }, { - "bom-ref": "dc0ab2a532e51e45", + "bom-ref": "c5ae4c2d0acbd9a9", "name": "/usr/share/zoneinfo/Antarctica/Davis", "type": "file" }, { - "bom-ref": "a3728a7d7e3e385b", + "bom-ref": "e145f1603011f807", "name": "/usr/share/zoneinfo/Antarctica/DumontDUrville", "type": "file" }, { - "bom-ref": "b6dd1131ea178365", + "bom-ref": "94e58925cad22985", "name": "/usr/share/zoneinfo/Antarctica/Macquarie", "type": "file" }, { - "bom-ref": "0674a86c9b49734f", + "bom-ref": "a9fe000661a88c1f", "name": "/usr/share/zoneinfo/Antarctica/Mawson", "type": "file" }, { - "bom-ref": "48a961212e894284", + "bom-ref": "eb5976414aaff1a8", "name": "/usr/share/zoneinfo/Antarctica/McMurdo", "type": "file" }, { - "bom-ref": "b5e972b5198c239d", + "bom-ref": "a157a017282b9b25", "name": "/usr/share/zoneinfo/Antarctica/Palmer", "type": "file" }, { - "bom-ref": "438f29b79c3608ec", + "bom-ref": "67ea880897405b64", "name": "/usr/share/zoneinfo/Antarctica/Rothera", "type": "file" }, { - "bom-ref": "79d1adae2888400c", + "bom-ref": "8e62accdf491d09c", "name": "/usr/share/zoneinfo/Antarctica/Syowa", "type": "file" }, { - "bom-ref": "16598ecea393652b", + "bom-ref": "f33155fa0acb5a63", "name": "/usr/share/zoneinfo/Antarctica/Troll", "type": "file" }, { - "bom-ref": "d55b7e31cb0b1be3", + "bom-ref": "78a24ae7cce57783", "name": "/usr/share/zoneinfo/Antarctica/Vostok", "type": "file" }, { - "bom-ref": "0c600b9126c17718", + "bom-ref": "f4e40030ac1140ec", "name": "/usr/share/zoneinfo/Asia/Aden", "type": "file" }, { - "bom-ref": "9e68375dab86e359", + "bom-ref": "f4798347e29289b5", "name": "/usr/share/zoneinfo/Asia/Almaty", "type": "file" }, { - "bom-ref": "d02b7204e6734763", + "bom-ref": "f037594dbc291d5b", "name": "/usr/share/zoneinfo/Asia/Amman", "type": "file" }, { - "bom-ref": "ddc595eb10ff6dc0", + "bom-ref": "8eedb515fd04fbc0", "name": "/usr/share/zoneinfo/Asia/Anadyr", "type": "file" }, { - "bom-ref": "dbc132b688a69096", + "bom-ref": "16afd35d8f1ae726", "name": "/usr/share/zoneinfo/Asia/Aqtau", "type": "file" }, { - "bom-ref": "5975865b2e52c9a6", + "bom-ref": "97f010558fa4940a", "name": "/usr/share/zoneinfo/Asia/Aqtobe", "type": "file" }, { - "bom-ref": "197745f1ed0f0024", + "bom-ref": "7152ca1088bcdf80", "name": "/usr/share/zoneinfo/Asia/Ashgabat", "type": "file" }, { - "bom-ref": "a4902db885493ef3", + "bom-ref": "21455ae24014f093", "name": "/usr/share/zoneinfo/Asia/Atyrau", "type": "file" }, { - "bom-ref": "58b56a829a87b354", + "bom-ref": "32fc5aef6a528370", "name": "/usr/share/zoneinfo/Asia/Baghdad", "type": "file" }, { - "bom-ref": "31998728d1e52f2d", + "bom-ref": "371eebb4aab671d1", "name": "/usr/share/zoneinfo/Asia/Bahrain", "type": "file" }, { - "bom-ref": "01830ecbaf875484", + "bom-ref": "c5b3748310f49d9c", "name": "/usr/share/zoneinfo/Asia/Baku", "type": "file" }, { - "bom-ref": "4a1221721300a344", + "bom-ref": "a7a34d48fbb5fd04", "name": "/usr/share/zoneinfo/Asia/Bangkok", "type": "file" }, { - "bom-ref": "eae61f86394d3f59", + "bom-ref": "f40913c573b83149", "name": "/usr/share/zoneinfo/Asia/Barnaul", "type": "file" }, { - "bom-ref": "eb841aef6060cd3d", + "bom-ref": "7066990ae576d3e5", "name": "/usr/share/zoneinfo/Asia/Beirut", "type": "file" }, { - "bom-ref": "65547e6a2b238db9", + "bom-ref": "6f4a1be67f13ed41", "name": "/usr/share/zoneinfo/Asia/Bishkek", "type": "file" }, { - "bom-ref": "613c38be7586b968", + "bom-ref": "7b335036241217c8", "name": "/usr/share/zoneinfo/Asia/Brunei", "type": "file" }, { - "bom-ref": "e37382579d4ee3fa", + "bom-ref": "a5a35bfda90ba10a", "name": "/usr/share/zoneinfo/Asia/Chita", "type": "file" }, { - "bom-ref": "7fef028375fa68ba", + "bom-ref": "42f5c82f92814a52", "name": "/usr/share/zoneinfo/Asia/Colombo", "type": "file" }, { - "bom-ref": "ff4c8bf756e9c09b", + "bom-ref": "822219479104e22f", "name": "/usr/share/zoneinfo/Asia/Damascus", "type": "file" }, { - "bom-ref": "0c52c7163dbdad10", + "bom-ref": "ec77d1a9b3fc57e0", "name": "/usr/share/zoneinfo/Asia/Dhaka", "type": "file" }, { - "bom-ref": "5cd00dc69d9ea38f", + "bom-ref": "92d3186256476447", "name": "/usr/share/zoneinfo/Asia/Dili", "type": "file" }, { - "bom-ref": "4514e13b9eaa2984", + "bom-ref": "685bbb33221c7590", "name": "/usr/share/zoneinfo/Asia/Dubai", "type": "file" }, { - "bom-ref": "30db53ef4a7e4aac", + "bom-ref": "c46582167cbd8238", "name": "/usr/share/zoneinfo/Asia/Dushanbe", "type": "file" }, { - "bom-ref": "cda9fc3c0769d5d8", + "bom-ref": "59a77ab238db161c", "name": "/usr/share/zoneinfo/Asia/Famagusta", "type": "file" }, { - "bom-ref": "1b809c975b424414", + "bom-ref": "57c553553043f5e4", "name": "/usr/share/zoneinfo/Asia/Gaza", "type": "file" }, { - "bom-ref": "7ae22cc6ffe0f260", + "bom-ref": "8702d292ced420d8", "name": "/usr/share/zoneinfo/Asia/Hebron", "type": "file" }, { - "bom-ref": "aec8f907bd7a078c", + "bom-ref": "656968a79905e3f0", "name": "/usr/share/zoneinfo/Asia/Ho_Chi_Minh", "type": "file" }, { - "bom-ref": "8f38138e4c191d44", + "bom-ref": "f41f4b94a48275a4", "name": "/usr/share/zoneinfo/Asia/Hong_Kong", "type": "file" }, { - "bom-ref": "710d9e28cb9a0c2a", + "bom-ref": "fce15f509efeb59e", "name": "/usr/share/zoneinfo/Asia/Hovd", "type": "file" }, { - "bom-ref": "2cf19d86b2eae662", + "bom-ref": "5251c3c3e4f18ece", "name": "/usr/share/zoneinfo/Asia/Irkutsk", "type": "file" }, { - "bom-ref": "7c31aeacb13e7c4c", + "bom-ref": "efdfe8dccd6b73f8", "name": "/usr/share/zoneinfo/Asia/Jakarta", "type": "file" }, { - "bom-ref": "7c39e4e0a6406171", + "bom-ref": "f41de343f9ced9bd", "name": "/usr/share/zoneinfo/Asia/Jayapura", "type": "file" }, { - "bom-ref": "24fdf109d5e9280d", + "bom-ref": "34c3828a9a941635", "name": "/usr/share/zoneinfo/Asia/Jerusalem", "type": "file" }, { - "bom-ref": "44f4121c750c20d4", + "bom-ref": "5d5d1a460bdf1468", "name": "/usr/share/zoneinfo/Asia/Kabul", "type": "file" }, { - "bom-ref": "e39ba5e8a4388996", + "bom-ref": "20dc062454d653aa", "name": "/usr/share/zoneinfo/Asia/Kamchatka", "type": "file" }, { - "bom-ref": "425abd8462e76b40", + "bom-ref": "adbb2cda6a982e4c", "name": "/usr/share/zoneinfo/Asia/Karachi", "type": "file" }, { - "bom-ref": "7ccb13f8099a4e4c", + "bom-ref": "210b565891c8da74", "name": "/usr/share/zoneinfo/Asia/Kathmandu", "type": "file" }, { - "bom-ref": "3596a948e0a4c2eb", + "bom-ref": "7380027ab33034eb", "name": "/usr/share/zoneinfo/Asia/Khandyga", "type": "file" }, { - "bom-ref": "035d440d3278016b", + "bom-ref": "54df7f01ec0498ef", "name": "/usr/share/zoneinfo/Asia/Kolkata", "type": "file" }, { - "bom-ref": "2794e0d71a825381", + "bom-ref": "75e0a751af4dfb19", "name": "/usr/share/zoneinfo/Asia/Krasnoyarsk", "type": "file" }, { - "bom-ref": "b9d6f2214f0001fa", + "bom-ref": "b479609ee5e05f2a", "name": "/usr/share/zoneinfo/Asia/Kuala_Lumpur", "type": "file" }, { - "bom-ref": "caa1641bbc95b6e3", + "bom-ref": "9543f72964357e1b", "name": "/usr/share/zoneinfo/Asia/Kuching", "type": "file" }, { - "bom-ref": "71e645fa9eb07501", + "bom-ref": "142d8fcd8963a211", "name": "/usr/share/zoneinfo/Asia/Kuwait", "type": "file" }, { - "bom-ref": "fc01e8682c3e2bc6", + "bom-ref": "ecb9b2337185ee52", "name": "/usr/share/zoneinfo/Asia/Macau", "type": "file" }, { - "bom-ref": "2b331f43b79f8a6b", + "bom-ref": "c952273a60a1615f", "name": "/usr/share/zoneinfo/Asia/Magadan", "type": "file" }, { - "bom-ref": "5124a9a710acfa13", + "bom-ref": "f500388bd6038957", "name": "/usr/share/zoneinfo/Asia/Makassar", "type": "file" }, { - "bom-ref": "082e13c83d679fdf", + "bom-ref": "0240df1ec5c4d827", "name": "/usr/share/zoneinfo/Asia/Manila", "type": "file" }, { - "bom-ref": "f838c4257f16adcf", + "bom-ref": "d758df6a2035ec07", "name": "/usr/share/zoneinfo/Asia/Muscat", "type": "file" }, { - "bom-ref": "8124ffc8e8a11bd1", + "bom-ref": "469c02a3f06c06fd", "name": "/usr/share/zoneinfo/Asia/Nicosia", "type": "file" }, { - "bom-ref": "2be5df8f759e0e20", + "bom-ref": "85be86388ed65f38", "name": "/usr/share/zoneinfo/Asia/Novokuznetsk", "type": "file" }, { - "bom-ref": "4b5b493ccdceab86", + "bom-ref": "80c7697030dbc14a", "name": "/usr/share/zoneinfo/Asia/Novosibirsk", "type": "file" }, { - "bom-ref": "9c18400b574a692b", + "bom-ref": "d7933a007f95d967", "name": "/usr/share/zoneinfo/Asia/Omsk", "type": "file" }, { - "bom-ref": "480f3197543c2374", + "bom-ref": "62cbb9926000198c", "name": "/usr/share/zoneinfo/Asia/Oral", "type": "file" }, { - "bom-ref": "dcbe3ba3a340f3b5", + "bom-ref": "61ba98324c2146b1", "name": "/usr/share/zoneinfo/Asia/Phnom_Penh", "type": "file" }, { - "bom-ref": "20e0c50dbe641b6f", + "bom-ref": "709b1a6b4dbb03af", "name": "/usr/share/zoneinfo/Asia/Pontianak", "type": "file" }, { - "bom-ref": "93fa761ed5b4d838", + "bom-ref": "0111cc9f571a9d60", "name": "/usr/share/zoneinfo/Asia/Pyongyang", "type": "file" }, { - "bom-ref": "59d72c6c3ead91d5", + "bom-ref": "63a2f235fd5eab85", "name": "/usr/share/zoneinfo/Asia/Qatar", "type": "file" }, { - "bom-ref": "5dcd90dfb4ff4344", + "bom-ref": "b03c179725f1444c", "name": "/usr/share/zoneinfo/Asia/Qostanay", "type": "file" }, { - "bom-ref": "f65d5ebd64ef237f", + "bom-ref": "f4570fc24af3562b", "name": "/usr/share/zoneinfo/Asia/Qyzylorda", "type": "file" }, { - "bom-ref": "227d4b859691f2cc", + "bom-ref": "dd81ae817545f84c", "name": "/usr/share/zoneinfo/Asia/Riyadh", "type": "file" }, { - "bom-ref": "ffcd79664baea328", + "bom-ref": "19042525dcbc287c", "name": "/usr/share/zoneinfo/Asia/Sakhalin", "type": "file" }, { - "bom-ref": "9a4a39124cc1992b", + "bom-ref": "a48a58c382f98cf3", "name": "/usr/share/zoneinfo/Asia/Samarkand", "type": "file" }, { - "bom-ref": "ffecf84cf99cbbec", + "bom-ref": "d4c69ffb2f9e53f0", "name": "/usr/share/zoneinfo/Asia/Seoul", "type": "file" }, { - "bom-ref": "d5fd2d7f9b37ffd9", + "bom-ref": "cfc8c50652bc85dd", "name": "/usr/share/zoneinfo/Asia/Shanghai", "type": "file" }, { - "bom-ref": "2ef5e553a6cbb645", + "bom-ref": "a8e18811065ebd61", "name": "/usr/share/zoneinfo/Asia/Singapore", "type": "file" }, { - "bom-ref": "3089527c5015277a", + "bom-ref": "d97b187e054b6e46", "name": "/usr/share/zoneinfo/Asia/Srednekolymsk", "type": "file" }, { - "bom-ref": "eaed92664b07fd1a", + "bom-ref": "c09c85066f0136ee", "name": "/usr/share/zoneinfo/Asia/Taipei", "type": "file" }, { - "bom-ref": "0cddf95b0d8545f9", + "bom-ref": "0a89af8778a83061", "name": "/usr/share/zoneinfo/Asia/Tashkent", "type": "file" }, { - "bom-ref": "ac4ec6660626d51a", + "bom-ref": "c6b6406d9a6e3356", "name": "/usr/share/zoneinfo/Asia/Tbilisi", "type": "file" }, { - "bom-ref": "4087819ebefe1799", + "bom-ref": "360a395b6690300d", "name": "/usr/share/zoneinfo/Asia/Tehran", "type": "file" }, { - "bom-ref": "4750599373252081", + "bom-ref": "7478b1dd6d7001ed", "name": "/usr/share/zoneinfo/Asia/Thimphu", "type": "file" }, { - "bom-ref": "4fe92db62eb01faa", + "bom-ref": "ce79edbfd45fe456", "name": "/usr/share/zoneinfo/Asia/Tokyo", "type": "file" }, { - "bom-ref": "4ac5b95da4f30b86", + "bom-ref": "5ebc42573b574142", "name": "/usr/share/zoneinfo/Asia/Tomsk", "type": "file" }, { - "bom-ref": "f7cdd52f37272969", + "bom-ref": "1838291e46e739e9", "name": "/usr/share/zoneinfo/Asia/Ulaanbaatar", "type": "file" }, { - "bom-ref": "0b13d38a136347e4", + "bom-ref": "7c42b263866f4450", "name": "/usr/share/zoneinfo/Asia/Urumqi", "type": "file" }, { - "bom-ref": "e390e0399d271822", + "bom-ref": "2ac941b722c211a6", "name": "/usr/share/zoneinfo/Asia/Ust-Nera", "type": "file" }, { - "bom-ref": "2cfeab67e432d913", + "bom-ref": "ee2484b432f13953", "name": "/usr/share/zoneinfo/Asia/Vientiane", "type": "file" }, { - "bom-ref": "c36d9b80c4271f32", + "bom-ref": "e0b96c1b32912632", "name": "/usr/share/zoneinfo/Asia/Vladivostok", "type": "file" }, { - "bom-ref": "2eb24e0db9623eb3", + "bom-ref": "3cec601dae94b677", "name": "/usr/share/zoneinfo/Asia/Yakutsk", "type": "file" }, { - "bom-ref": "e2a8cfa1d370049d", + "bom-ref": "316cacfe252cb47d", "name": "/usr/share/zoneinfo/Asia/Yangon", "type": "file" }, { - "bom-ref": "c180f33e9bbbd49c", + "bom-ref": "bcdc7e9a5063d110", "name": "/usr/share/zoneinfo/Asia/Yekaterinburg", "type": "file" }, { - "bom-ref": "7e42acb5e7aefe6e", + "bom-ref": "467f4b54ee5825ca", "name": "/usr/share/zoneinfo/Asia/Yerevan", "type": "file" }, { - "bom-ref": "987a30de18c88c4b", + "bom-ref": "e28aef3430a0e847", "name": "/usr/share/zoneinfo/Atlantic/Azores", "type": "file" }, { - "bom-ref": "93f80bf2e11faa2e", + "bom-ref": "d9c144089c9edb22", "name": "/usr/share/zoneinfo/Atlantic/Bermuda", "type": "file" }, { - "bom-ref": "58581849ac5afb91", + "bom-ref": "755f951cca43abf9", "name": "/usr/share/zoneinfo/Atlantic/Canary", "type": "file" }, { - "bom-ref": "4ba4d9350b0411e5", + "bom-ref": "45cd7b0150b6ba71", "name": "/usr/share/zoneinfo/Atlantic/Cape_Verde", "type": "file" }, { - "bom-ref": "5d54e3fe6c12f7b4", + "bom-ref": "46d436e0f8babcdc", "name": "/usr/share/zoneinfo/Atlantic/Faroe", "type": "file" }, { - "bom-ref": "2b6588cb7407795d", + "bom-ref": "7a7667db729a13fd", "name": "/usr/share/zoneinfo/Atlantic/Madeira", "type": "file" }, { - "bom-ref": "8099d11fbef5e70d", + "bom-ref": "b71895dcb1d8c22d", "name": "/usr/share/zoneinfo/Atlantic/Reykjavik", "type": "file" }, { - "bom-ref": "bda9018720e6db39", + "bom-ref": "695bf534780341e9", "name": "/usr/share/zoneinfo/Atlantic/South_Georgia", "type": "file" }, { - "bom-ref": "bc14d5d4923e2d11", + "bom-ref": "9a9074fcd59450d5", "name": "/usr/share/zoneinfo/Atlantic/St_Helena", "type": "file" }, { - "bom-ref": "db60f6dee8d6fda5", + "bom-ref": "19dbb63a8e83dfd9", "name": "/usr/share/zoneinfo/Atlantic/Stanley", "type": "file" }, { - "bom-ref": "ae7694ea020a14c9", + "bom-ref": "1e934653036ded71", "name": "/usr/share/zoneinfo/Australia/Adelaide", "type": "file" }, { - "bom-ref": "afdcfcbe22bbab5c", + "bom-ref": "0a1d739390e81a00", "name": "/usr/share/zoneinfo/Australia/Brisbane", "type": "file" }, { - "bom-ref": "7690874b3caec0e2", + "bom-ref": "b9860099391fd4de", "name": "/usr/share/zoneinfo/Australia/Broken_Hill", "type": "file" }, { - "bom-ref": "3246c39f52c72f1b", + "bom-ref": "56912bb743bb3c83", "name": "/usr/share/zoneinfo/Australia/Darwin", "type": "file" }, { - "bom-ref": "ec48d43841fc5791", + "bom-ref": "a220f08dc9c08fc1", "name": "/usr/share/zoneinfo/Australia/Eucla", "type": "file" }, { - "bom-ref": "2483048f61c1d747", + "bom-ref": "aec57add57fe5bff", "name": "/usr/share/zoneinfo/Australia/Hobart", "type": "file" }, { - "bom-ref": "f1ffba84423e9191", + "bom-ref": "486aec2a7c309771", "name": "/usr/share/zoneinfo/Australia/Lindeman", "type": "file" }, { - "bom-ref": "ff119b133470d3f1", + "bom-ref": "7faeffaeded12cf1", "name": "/usr/share/zoneinfo/Australia/Lord_Howe", "type": "file" }, { - "bom-ref": "d156eca923a3cad9", + "bom-ref": "de5e902d1bab1c95", "name": "/usr/share/zoneinfo/Australia/Melbourne", "type": "file" }, { - "bom-ref": "dbc1408dcb574c4e", + "bom-ref": "6bb1ffabe037764a", "name": "/usr/share/zoneinfo/Australia/Perth", "type": "file" }, { - "bom-ref": "26ea9ec6edb0fd72", + "bom-ref": "8136fa5d838b052a", "name": "/usr/share/zoneinfo/Australia/Sydney", "type": "file" }, { - "bom-ref": "9f4945260867e9b8", + "bom-ref": "c82355445e8d27e0", "name": "/usr/share/zoneinfo/CET", "type": "file" }, { - "bom-ref": "bb37734613bbd7ab", + "bom-ref": "924fc8f7906cc437", "name": "/usr/share/zoneinfo/CST6CDT", "type": "file" }, { - "bom-ref": "e2b2a498f0d647fd", + "bom-ref": "9a983b0acccedae9", "name": "/usr/share/zoneinfo/EET", "type": "file" }, { - "bom-ref": "5a4e22fc3bc2fe47", + "bom-ref": "4d640cf685fa2ef3", "name": "/usr/share/zoneinfo/EST", "type": "file" }, { - "bom-ref": "374b91f10f1944c1", + "bom-ref": "386e3c3b533d61ed", "name": "/usr/share/zoneinfo/EST5EDT", "type": "file" }, { - "bom-ref": "fcfc90d036c6a6fd", + "bom-ref": "e27d334a3693e161", "name": "/usr/share/zoneinfo/Etc/GMT", "type": "file" }, { - "bom-ref": "6cd1bb0b1c772a5a", + "bom-ref": "c582d3ba113e76de", "name": "/usr/share/zoneinfo/Etc/GMT+1", "type": "file" }, { - "bom-ref": "866cc646b977a6ae", + "bom-ref": "bbda3132a68cf962", "name": "/usr/share/zoneinfo/Etc/GMT+10", "type": "file" }, { - "bom-ref": "42071de6406a3dcf", + "bom-ref": "3884b1e2faef47ff", "name": "/usr/share/zoneinfo/Etc/GMT+11", "type": "file" }, { - "bom-ref": "2f83a5b2d759cefe", + "bom-ref": "66453650566061da", "name": "/usr/share/zoneinfo/Etc/GMT+12", "type": "file" }, { - "bom-ref": "b0100016ef501425", + "bom-ref": "975bcb6ea797168d", "name": "/usr/share/zoneinfo/Etc/GMT+2", "type": "file" }, { - "bom-ref": "189c71f0cdcc970a", + "bom-ref": "82f03315c9dd2f2a", "name": "/usr/share/zoneinfo/Etc/GMT+3", "type": "file" }, { - "bom-ref": "5ee7523cf06f2a2c", + "bom-ref": "069d7705889d9290", "name": "/usr/share/zoneinfo/Etc/GMT+4", "type": "file" }, { - "bom-ref": "61c9b5e7bec3b91f", + "bom-ref": "43b1457e0fdcd68f", "name": "/usr/share/zoneinfo/Etc/GMT+5", "type": "file" }, { - "bom-ref": "b73a1cbdf46c7b6e", + "bom-ref": "38e46d37b1b1d456", "name": "/usr/share/zoneinfo/Etc/GMT+6", "type": "file" }, { - "bom-ref": "e54fbc1d7ff97544", + "bom-ref": "c45dd0f7f7d42f94", "name": "/usr/share/zoneinfo/Etc/GMT+7", "type": "file" }, { - "bom-ref": "f1125a1193c60ca9", + "bom-ref": "fbdc5688dd1cbccd", "name": "/usr/share/zoneinfo/Etc/GMT+8", "type": "file" }, { - "bom-ref": "27e43f3b76a4178e", + "bom-ref": "bd1bafa8f5e3045e", "name": "/usr/share/zoneinfo/Etc/GMT+9", "type": "file" }, { - "bom-ref": "a4b4b9ce34f48fc8", + "bom-ref": "49747913f3e776c0", "name": "/usr/share/zoneinfo/Etc/GMT-1", "type": "file" }, { - "bom-ref": "4fa1f2b7af420c8f", + "bom-ref": "49918d03969dd37b", "name": "/usr/share/zoneinfo/Etc/GMT-10", "type": "file" }, { - "bom-ref": "58171858fff5f290", + "bom-ref": "04c3a6c4c7c0ff64", "name": "/usr/share/zoneinfo/Etc/GMT-11", "type": "file" }, { - "bom-ref": "34f945c14fa21833", + "bom-ref": "d12430d0243ecfd7", "name": "/usr/share/zoneinfo/Etc/GMT-12", "type": "file" }, { - "bom-ref": "0931bf6a571353a4", + "bom-ref": "72e4af2196aa9248", "name": "/usr/share/zoneinfo/Etc/GMT-13", "type": "file" }, { - "bom-ref": "c60dec3a83901dc5", + "bom-ref": "a1a9af2a63e558bd", "name": "/usr/share/zoneinfo/Etc/GMT-14", "type": "file" }, { - "bom-ref": "dad72d9490e59e51", + "bom-ref": "f06e4a0a342d2335", "name": "/usr/share/zoneinfo/Etc/GMT-2", "type": "file" }, { - "bom-ref": "a72ea2d97d561813", + "bom-ref": "42bf732e7ad8aeaf", "name": "/usr/share/zoneinfo/Etc/GMT-3", "type": "file" }, { - "bom-ref": "13b05daa13ce27f9", + "bom-ref": "b31b436e2eb13009", "name": "/usr/share/zoneinfo/Etc/GMT-4", "type": "file" }, { - "bom-ref": "ee0bfbc1f15c0758", + "bom-ref": "b465517a56d67188", "name": "/usr/share/zoneinfo/Etc/GMT-5", "type": "file" }, { - "bom-ref": "897299706478e8be", + "bom-ref": "8a59a0fd49ea23b2", "name": "/usr/share/zoneinfo/Etc/GMT-6", "type": "file" }, { - "bom-ref": "f7ba9c4bc8ac53e9", + "bom-ref": "e37a8225600dead5", "name": "/usr/share/zoneinfo/Etc/GMT-7", "type": "file" }, { - "bom-ref": "4a5f32820bda6ccf", + "bom-ref": "1569ee01ab2d1fd7", "name": "/usr/share/zoneinfo/Etc/GMT-8", "type": "file" }, { - "bom-ref": "46ada01d768450dc", + "bom-ref": "f6a3c08b890407a0", "name": "/usr/share/zoneinfo/Etc/GMT-9", "type": "file" }, { - "bom-ref": "9e748e134c63635f", + "bom-ref": "dc3b6148a7d20aef", "name": "/usr/share/zoneinfo/Etc/UTC", "type": "file" }, { - "bom-ref": "42f91341169629e1", + "bom-ref": "b9e0f0afa60aeb9d", "name": "/usr/share/zoneinfo/Europe/Amsterdam", "type": "file" }, { - "bom-ref": "3826514d15ba8357", + "bom-ref": "d5c9eb1b2a28142f", "name": "/usr/share/zoneinfo/Europe/Andorra", "type": "file" }, { - "bom-ref": "035c0576a124181e", + "bom-ref": "229c69a189309052", "name": "/usr/share/zoneinfo/Europe/Astrakhan", "type": "file" }, { - "bom-ref": "bc477ddac8203a2d", + "bom-ref": "32c0ceafa0fb1d99", "name": "/usr/share/zoneinfo/Europe/Athens", "type": "file" }, { - "bom-ref": "86abfbf3013c0345", + "bom-ref": "09aaf130862fb5dd", "name": "/usr/share/zoneinfo/Europe/Belgrade", "type": "file" }, { - "bom-ref": "bb037ee994ed9093", + "bom-ref": "da12a592da4e5ff7", "name": "/usr/share/zoneinfo/Europe/Berlin", "type": "file" }, { - "bom-ref": "cecae33b000efd25", + "bom-ref": "e837e1b9af3e2641", "name": "/usr/share/zoneinfo/Europe/Brussels", "type": "file" }, { - "bom-ref": "5f4bf86382c78767", + "bom-ref": "e0c2ab26a5cc028b", "name": "/usr/share/zoneinfo/Europe/Bucharest", "type": "file" }, { - "bom-ref": "4e6fcf3656ce5048", + "bom-ref": "190f1cd55d850fc4", "name": "/usr/share/zoneinfo/Europe/Budapest", "type": "file" }, { - "bom-ref": "0128ccd12b2de486", + "bom-ref": "012cf9df7e140596", "name": "/usr/share/zoneinfo/Europe/Chisinau", "type": "file" }, { - "bom-ref": "d4805738edad8b4c", + "bom-ref": "10a1a6e9122e2d60", "name": "/usr/share/zoneinfo/Europe/Copenhagen", "type": "file" }, { - "bom-ref": "6ec73997bfee4e6f", + "bom-ref": "6ee7eeda9f505c67", "name": "/usr/share/zoneinfo/Europe/Dublin", "type": "file" }, { - "bom-ref": "dd9e4a5967a4d91b", + "bom-ref": "49a64e1f61801ed3", "name": "/usr/share/zoneinfo/Europe/Gibraltar", "type": "file" }, { - "bom-ref": "a1ccd4f2a31c2c7f", + "bom-ref": "c9aded323e8a7b27", "name": "/usr/share/zoneinfo/Europe/Guernsey", "type": "file" }, { - "bom-ref": "a8fe8b97dafefb61", + "bom-ref": "44c6d6bf27e62b15", "name": "/usr/share/zoneinfo/Europe/Helsinki", "type": "file" }, { - "bom-ref": "89f4825f706e9a23", + "bom-ref": "4e59c45825deeeb7", "name": "/usr/share/zoneinfo/Europe/Isle_of_Man", "type": "file" }, { - "bom-ref": "061ff5f93265e9a3", + "bom-ref": "2203ac1a3edbbb9b", "name": "/usr/share/zoneinfo/Europe/Istanbul", "type": "file" }, { - "bom-ref": "368d40a6a3d3806b", + "bom-ref": "bfa26ef5569b9f3b", "name": "/usr/share/zoneinfo/Europe/Jersey", "type": "file" }, { - "bom-ref": "faa5156943fa1093", + "bom-ref": "1f4ae5f7bd17534f", "name": "/usr/share/zoneinfo/Europe/Kaliningrad", "type": "file" }, { - "bom-ref": "de1d8a6c9ecea803", + "bom-ref": "01ecc76863ba7d23", "name": "/usr/share/zoneinfo/Europe/Kirov", "type": "file" }, { - "bom-ref": "2e2511583cfe5c6c", + "bom-ref": "5ece6073ed8779f4", "name": "/usr/share/zoneinfo/Europe/Kyiv", "type": "file" }, { - "bom-ref": "4fd67f067aade3c7", + "bom-ref": "5f37f2fc7fc3f887", "name": "/usr/share/zoneinfo/Europe/Lisbon", "type": "file" }, { - "bom-ref": "f869060540e7fe95", + "bom-ref": "9156416a3be1acbd", "name": "/usr/share/zoneinfo/Europe/Ljubljana", "type": "file" }, { - "bom-ref": "916e5193ee1da990", + "bom-ref": "d5f25f81cef4ae60", "name": "/usr/share/zoneinfo/Europe/London", "type": "file" }, { - "bom-ref": "492811069e7f1983", + "bom-ref": "e2a6d6a4fb875a53", "name": "/usr/share/zoneinfo/Europe/Luxembourg", "type": "file" }, { - "bom-ref": "f33cf000af68b6f0", + "bom-ref": "eb45f1694a6e0948", "name": "/usr/share/zoneinfo/Europe/Madrid", "type": "file" }, { - "bom-ref": "5f0af9cd2021e57c", + "bom-ref": "0dbd45687c65dd70", "name": "/usr/share/zoneinfo/Europe/Malta", "type": "file" }, { - "bom-ref": "713b05dd028cc472", + "bom-ref": "742f9c7eeb84876e", "name": "/usr/share/zoneinfo/Europe/Minsk", "type": "file" }, { - "bom-ref": "5d1b05d11e940eb6", + "bom-ref": "6dbd575dfd8eeb42", "name": "/usr/share/zoneinfo/Europe/Monaco", "type": "file" }, { - "bom-ref": "a7ab72d140955186", + "bom-ref": "772d2a779161ae0e", "name": "/usr/share/zoneinfo/Europe/Moscow", "type": "file" }, { - "bom-ref": "97b5dcec79d37570", + "bom-ref": "31e4250d20dd9bc0", "name": "/usr/share/zoneinfo/Europe/Oslo", "type": "file" }, { - "bom-ref": "a70fe20e6370d1fb", + "bom-ref": "2ea8489c3ace4e27", "name": "/usr/share/zoneinfo/Europe/Paris", "type": "file" }, { - "bom-ref": "e43e6a57572d3a16", + "bom-ref": "db800079153e08fa", "name": "/usr/share/zoneinfo/Europe/Prague", "type": "file" }, { - "bom-ref": "43b2873f488f4d61", + "bom-ref": "2e90f18d757e2d91", "name": "/usr/share/zoneinfo/Europe/Riga", "type": "file" }, { - "bom-ref": "ee758c0b62b2b66c", + "bom-ref": "6430f42e476f029c", "name": "/usr/share/zoneinfo/Europe/Rome", "type": "file" }, { - "bom-ref": "4d5d2c04f5b734a1", + "bom-ref": "533d14f638259d25", "name": "/usr/share/zoneinfo/Europe/Samara", "type": "file" }, { - "bom-ref": "efedfa6eb81f3490", + "bom-ref": "96640c96d5a52528", "name": "/usr/share/zoneinfo/Europe/Sarajevo", "type": "file" }, { - "bom-ref": "362f521e13bd3901", + "bom-ref": "f9e63a923f7e51a9", "name": "/usr/share/zoneinfo/Europe/Saratov", "type": "file" }, { - "bom-ref": "8799c1f14c85032a", + "bom-ref": "9f254ea95090ae76", "name": "/usr/share/zoneinfo/Europe/Simferopol", "type": "file" }, { - "bom-ref": "be0bd74c9213d23e", + "bom-ref": "884386a3534c8432", "name": "/usr/share/zoneinfo/Europe/Skopje", "type": "file" }, { - "bom-ref": "cf6f941ffd3a2823", + "bom-ref": "f43bc114e7890b57", "name": "/usr/share/zoneinfo/Europe/Sofia", "type": "file" }, { - "bom-ref": "0815822e0a14d7f3", + "bom-ref": "7a647321ae1710e3", "name": "/usr/share/zoneinfo/Europe/Stockholm", "type": "file" }, { - "bom-ref": "65657a890dcd4aab", + "bom-ref": "257db58f49edf7cf", "name": "/usr/share/zoneinfo/Europe/Tallinn", "type": "file" }, { - "bom-ref": "c2c84d9560700b93", + "bom-ref": "7bca239c42c4270f", "name": "/usr/share/zoneinfo/Europe/Tirane", "type": "file" }, { - "bom-ref": "5df12840cec8d09b", + "bom-ref": "6d52dbbba0dd71cb", "name": "/usr/share/zoneinfo/Europe/Ulyanovsk", "type": "file" }, { - "bom-ref": "c88e49dc1ef5a127", + "bom-ref": "65391d6393fbf147", "name": "/usr/share/zoneinfo/Europe/Vaduz", "type": "file" }, { - "bom-ref": "350a79599708f408", + "bom-ref": "829fe2dfe087caf8", "name": "/usr/share/zoneinfo/Europe/Vienna", "type": "file" }, { - "bom-ref": "59e0505f81b4bb35", + "bom-ref": "50e0810f4f8f347d", "name": "/usr/share/zoneinfo/Europe/Vilnius", "type": "file" }, { - "bom-ref": "152fda672c7b34cd", + "bom-ref": "21cf504acbd8a2f5", "name": "/usr/share/zoneinfo/Europe/Volgograd", "type": "file" }, { - "bom-ref": "e0fcd0a2c150d5ea", + "bom-ref": "d4153ca9087b6c62", "name": "/usr/share/zoneinfo/Europe/Warsaw", "type": "file" }, { - "bom-ref": "8a23339e8b91b6e3", + "bom-ref": "3e101745e8e744fb", "name": "/usr/share/zoneinfo/Europe/Zagreb", "type": "file" }, { - "bom-ref": "cb81d1d02ed3f05d", + "bom-ref": "de71645c6335147d", "name": "/usr/share/zoneinfo/Europe/Zurich", "type": "file" }, { - "bom-ref": "bdd685ad4653d20f", + "bom-ref": "b28f1ae205680597", "name": "/usr/share/zoneinfo/Factory", "type": "file" }, { - "bom-ref": "0ef0cf049f450296", + "bom-ref": "5cea1fa49b8a9516", "name": "/usr/share/zoneinfo/HST", "type": "file" }, { - "bom-ref": "d1b7bb00d96d1023", + "bom-ref": "7a32c614835ded5b", "name": "/usr/share/zoneinfo/Indian/Antananarivo", "type": "file" }, { - "bom-ref": "9d69dc7e210c13c8", + "bom-ref": "87b0df0095b093bc", "name": "/usr/share/zoneinfo/Indian/Chagos", "type": "file" }, { - "bom-ref": "4c5e94b13543ae12", + "bom-ref": "94e4d480672dcfde", "name": "/usr/share/zoneinfo/Indian/Christmas", "type": "file" }, { - "bom-ref": "ec0c4392225b6488", + "bom-ref": "2df1c61588eaaf88", "name": "/usr/share/zoneinfo/Indian/Cocos", "type": "file" }, { - "bom-ref": "8e5186e99ea5aac8", + "bom-ref": "460b32e2fe57ae0c", "name": "/usr/share/zoneinfo/Indian/Comoro", "type": "file" }, { - "bom-ref": "3330cb66391c3c06", + "bom-ref": "f0c258a15f3e6c2e", "name": "/usr/share/zoneinfo/Indian/Kerguelen", "type": "file" }, { - "bom-ref": "d5d6cc96644bd673", + "bom-ref": "0861e695a48d98ab", "name": "/usr/share/zoneinfo/Indian/Mahe", "type": "file" }, { - "bom-ref": "2daae150637bf1ad", + "bom-ref": "772babc503d683e1", "name": "/usr/share/zoneinfo/Indian/Maldives", "type": "file" }, { - "bom-ref": "558b4fd3a45b734e", + "bom-ref": "d04baf70a446a8f2", "name": "/usr/share/zoneinfo/Indian/Mauritius", "type": "file" }, { - "bom-ref": "8aeed6b6b8de0135", + "bom-ref": "0abf76d512148a79", "name": "/usr/share/zoneinfo/Indian/Mayotte", "type": "file" }, { - "bom-ref": "bc1c76de8071a406", + "bom-ref": "dd54650476e4869e", "name": "/usr/share/zoneinfo/Indian/Reunion", "type": "file" }, { - "bom-ref": "1ad3e80b7436b80b", + "bom-ref": "facb60ba78a2df37", "name": "/usr/share/zoneinfo/MET", "type": "file" }, { - "bom-ref": "38084bb95f226d10", + "bom-ref": "c97503dd432a6954", "name": "/usr/share/zoneinfo/MST", "type": "file" }, { - "bom-ref": "6bca0d00bc6dc804", + "bom-ref": "6b3ee187db4e48e4", "name": "/usr/share/zoneinfo/MST7MDT", "type": "file" }, { - "bom-ref": "4da9d7e4d00d4895", + "bom-ref": "b8520e9023bd88d1", "name": "/usr/share/zoneinfo/PST8PDT", "type": "file" }, { - "bom-ref": "54a062312d762789", + "bom-ref": "de5dc64c0baee68d", "name": "/usr/share/zoneinfo/Pacific/Apia", "type": "file" }, { - "bom-ref": "a3c7a43a8e6add42", + "bom-ref": "4c73b72e981915ca", "name": "/usr/share/zoneinfo/Pacific/Auckland", "type": "file" }, { - "bom-ref": "dfa25f8a5d4d8138", + "bom-ref": "2e7e74407738fa6c", "name": "/usr/share/zoneinfo/Pacific/Bougainville", "type": "file" }, { - "bom-ref": "451be8f012d1da1b", + "bom-ref": "8fab03791fc461b7", "name": "/usr/share/zoneinfo/Pacific/Chatham", "type": "file" }, { - "bom-ref": "d69d5fa44aa4f9fc", + "bom-ref": "62bd612630590698", "name": "/usr/share/zoneinfo/Pacific/Chuuk", "type": "file" }, { - "bom-ref": "49d76058602fdfb1", + "bom-ref": "db04f4d01a9098e9", "name": "/usr/share/zoneinfo/Pacific/Easter", "type": "file" }, { - "bom-ref": "26f72ff9982a7a99", + "bom-ref": "651f3defba7bd19d", "name": "/usr/share/zoneinfo/Pacific/Efate", "type": "file" }, { - "bom-ref": "0ba5d207f1e86585", + "bom-ref": "5a19c81314d033dd", "name": "/usr/share/zoneinfo/Pacific/Fakaofo", "type": "file" }, { - "bom-ref": "dce9784ce5413e29", + "bom-ref": "dfe6cb76323ab475", "name": "/usr/share/zoneinfo/Pacific/Fiji", "type": "file" }, { - "bom-ref": "5af9934a1186beef", + "bom-ref": "871055fdcd31f70b", "name": "/usr/share/zoneinfo/Pacific/Funafuti", "type": "file" }, { - "bom-ref": "6718ed0b32a03b73", + "bom-ref": "59a40006c5304167", "name": "/usr/share/zoneinfo/Pacific/Galapagos", "type": "file" }, { - "bom-ref": "dc3aeed3c925a644", + "bom-ref": "b5fa432982f2dc90", "name": "/usr/share/zoneinfo/Pacific/Gambier", "type": "file" }, { - "bom-ref": "315d67f121b56218", + "bom-ref": "cb8a6599f0cc82fc", "name": "/usr/share/zoneinfo/Pacific/Guadalcanal", "type": "file" }, { - "bom-ref": "11c45e4973aa44b7", + "bom-ref": "dd78d8aad5842b13", "name": "/usr/share/zoneinfo/Pacific/Guam", "type": "file" }, { - "bom-ref": "1e71fc17331a8960", + "bom-ref": "5f9328895a030a68", "name": "/usr/share/zoneinfo/Pacific/Honolulu", "type": "file" }, { - "bom-ref": "8f2a113f37b19814", + "bom-ref": "20ac6f87f5aeda08", "name": "/usr/share/zoneinfo/Pacific/Kanton", "type": "file" }, { - "bom-ref": "73e409b4efa3802e", + "bom-ref": "7792c5556d48358a", "name": "/usr/share/zoneinfo/Pacific/Kiritimati", "type": "file" }, { - "bom-ref": "5c4b5e8a510278dd", + "bom-ref": "7a14456eb0f1252d", "name": "/usr/share/zoneinfo/Pacific/Kosrae", "type": "file" }, { - "bom-ref": "6ca990dfbab0d448", + "bom-ref": "4c8e31b4d00f44e0", "name": "/usr/share/zoneinfo/Pacific/Kwajalein", "type": "file" }, { - "bom-ref": "dec2aba3cb8c3c65", + "bom-ref": "a500c34984faba3d", "name": "/usr/share/zoneinfo/Pacific/Majuro", "type": "file" }, { - "bom-ref": "cc9c60d8ac9778a7", + "bom-ref": "7bce19a5bff2df6b", "name": "/usr/share/zoneinfo/Pacific/Marquesas", "type": "file" }, { - "bom-ref": "f9f0bd8ee56ba07a", + "bom-ref": "f32f50a6931babbe", "name": "/usr/share/zoneinfo/Pacific/Midway", "type": "file" }, { - "bom-ref": "c417802fc31b6075", + "bom-ref": "47532746dbaa58ed", "name": "/usr/share/zoneinfo/Pacific/Nauru", "type": "file" }, { - "bom-ref": "7bf3075f0e0a2f9d", + "bom-ref": "d3b857f7ca960479", "name": "/usr/share/zoneinfo/Pacific/Niue", "type": "file" }, { - "bom-ref": "1ab507472cf2bf0a", + "bom-ref": "869be5290f186dce", "name": "/usr/share/zoneinfo/Pacific/Norfolk", "type": "file" }, { - "bom-ref": "651009dd7a91c714", + "bom-ref": "db328c2c91302824", "name": "/usr/share/zoneinfo/Pacific/Noumea", "type": "file" }, { - "bom-ref": "11ac7b5094895ba1", + "bom-ref": "88759d83a456e4bd", "name": "/usr/share/zoneinfo/Pacific/Pago_Pago", "type": "file" }, { - "bom-ref": "a71363fb6544519e", + "bom-ref": "cc00cce2484cde22", "name": "/usr/share/zoneinfo/Pacific/Palau", "type": "file" }, { - "bom-ref": "6c387c6d210f382a", + "bom-ref": "2832d6a971c3b442", "name": "/usr/share/zoneinfo/Pacific/Pitcairn", "type": "file" }, { - "bom-ref": "9d751252f342a553", + "bom-ref": "f16789c994a45c07", "name": "/usr/share/zoneinfo/Pacific/Pohnpei", "type": "file" }, { - "bom-ref": "c8fcc199fceb3331", + "bom-ref": "e9e3db71c876aa1d", "name": "/usr/share/zoneinfo/Pacific/Port_Moresby", "type": "file" }, { - "bom-ref": "36292e2ccc51224b", + "bom-ref": "c0240925febaf733", "name": "/usr/share/zoneinfo/Pacific/Rarotonga", "type": "file" }, { - "bom-ref": "d752e396dae577f6", + "bom-ref": "31cf0e0112ae6c9e", "name": "/usr/share/zoneinfo/Pacific/Saipan", "type": "file" }, { - "bom-ref": "10d2bcf81e20369d", + "bom-ref": "ae019d05f0d0765d", "name": "/usr/share/zoneinfo/Pacific/Tahiti", "type": "file" }, { - "bom-ref": "ae3a65ccfb95c164", + "bom-ref": "decc6f20cbdf92b4", "name": "/usr/share/zoneinfo/Pacific/Tarawa", "type": "file" }, { - "bom-ref": "197fd9eb568b21f0", + "bom-ref": "9426f1dfdb9fb044", "name": "/usr/share/zoneinfo/Pacific/Tongatapu", "type": "file" }, { - "bom-ref": "eab7f82ffff606de", + "bom-ref": "e36486b0ec02eef2", "name": "/usr/share/zoneinfo/Pacific/Wake", "type": "file" }, { - "bom-ref": "5d8df9e4941347db", + "bom-ref": "8b18d76a40e1394b", "name": "/usr/share/zoneinfo/Pacific/Wallis", "type": "file" }, { - "bom-ref": "31b2cb577021e629", + "bom-ref": "0ac15a75326ba845", "name": "/usr/share/zoneinfo/WET", "type": "file" }, { - "bom-ref": "8c7c6e0e0c3f4a3b", + "bom-ref": "75a39162f7a6b0e7", "name": "/usr/share/zoneinfo/iso3166.tab", "type": "file" }, { - "bom-ref": "7ad8b0c4886d433b", + "bom-ref": "08367b47a82e03bb", "name": "/usr/share/zoneinfo/leap-seconds.list", "type": "file" }, { - "bom-ref": "70d8824132a9906e", + "bom-ref": "a2fb317df968b642", "name": "/usr/share/zoneinfo/leapseconds", "type": "file" }, { - "bom-ref": "58559702aba34158", + "bom-ref": "e7f636bdc74513d4", "name": "/usr/share/zoneinfo/tzdata.zi", "type": "file" }, { - "bom-ref": "8cb74f1dcc9a399c", + "bom-ref": "44449d9fea83866c", "name": "/usr/share/zoneinfo/zone.tab", "type": "file" }, { - "bom-ref": "b4dc81da116f3f57", + "bom-ref": "ba76acf9c4f4b43f", "name": "/usr/share/zoneinfo/zone1970.tab", "type": "file" }, { - "bom-ref": "970447edbca0dede", + "bom-ref": "bfdce7af857753de", "name": "/usr/share/zoneinfo/zonenow.tab", "type": "file" }, { - "bom-ref": "c2d75f46a08420e9", + "bom-ref": "f1d9f96b4dc7350f", "name": "/usr/share/zsh/site-functions/_patchelf", "type": "file" }, { - "bom-ref": "77396bf792e8ca6e", + "bom-ref": "bb0681b5c5e238e4", "name": "/usr/share/zsh/vendor-completions/_curl", "type": "file" }, { - "bom-ref": "8e22d90fe40ec20c", + "bom-ref": "f910bc244dcbc90d", "name": "/usr/share/zsh/vendor-completions/_dpkg-parsechangelog", "type": "file" }, { - "bom-ref": "c492ae4e15166fec", + "bom-ref": "3516bc6c49958672", "name": "/usr/share/zsh/vendor-completions/_ninja", "type": "file" }, { - "bom-ref": "cc4bd210e6b5f1f5", + "bom-ref": "db787a865e287d60", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/CMakeLists.txt", "type": "file" }, { - "bom-ref": "57a69ce701094983", + "bom-ref": "e66dc22d1071db2b", + "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/cmake_config/NVSHMEMCxxStandard.cmake", + "type": "file" + }, + { + "bom-ref": "45ce7e48c2ff13d6", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/common/CMakeLists.txt", "type": "file" }, { - "bom-ref": "6e843e28e2466053", + "bom-ref": "00e3a5a1efc3ba1e", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/common/bootstrap_util.cpp", "type": "file" }, { - "bom-ref": "985a3c185704bf6d", + "bom-ref": "02d08c99e7a2f370", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/common/bootstrap_util.h", "type": "file" }, { - "bom-ref": "da1538bc6af6df87", + "bom-ref": "17cf8800b05090e6", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/common/env_defs.h", "type": "file" }, { - "bom-ref": "eba36ea5ecff5838", + "bom-ref": "33b0b51b88c6c19d", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/include/bootstrap_device_host/nvshmem_uniqueid.h", "type": "file" }, { - "bom-ref": "5bbf5e9e664ee7b0", + "bom-ref": "989863bdc9a501fd", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/include/bootstrap_host_transport/env_defs_internal.h", "type": "file" }, { - "bom-ref": "54b236f0ef906069", + "bom-ref": "12e61e0e8d6f3d8c", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/include/internal/bootstrap_host/nvshmemi_bootstrap.h", "type": "file" }, { - "bom-ref": "214f277d8894d81f", + "bom-ref": "27fad7f00517a53a", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/include/internal/bootstrap_host_transport/nvshmemi_bootstrap_defines.h", "type": "file" }, { - "bom-ref": "82dac23f4f5ed56a", + "bom-ref": "89e186cd55bf29f7", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/include/non_abi/nvshmem_version.h", "type": "file" }, { - "bom-ref": "c986176989e28c58", + "bom-ref": "56acae5a49a56ef1", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/include/non_abi/nvshmemx_error.h", "type": "file" }, { - "bom-ref": "d63717349ce17fa4", + "bom-ref": "03dc3c5df255a665", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/mpi/CMakeLists.txt", "type": "file" }, { - "bom-ref": "f89698a3c5afcf4e", + "bom-ref": "0af818a50357ec2b", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/mpi/bootstrap_mpi.c", "type": "file" }, { - "bom-ref": "7e6e7e62c3aabafb", + "bom-ref": "0dd9fc15598c31e2", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/nvshmem_bootstrap.sym", "type": "file" }, { - "bom-ref": "33e5322aeaa3960d", + "bom-ref": "4fe321e3491d0358", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/pmi/CMakeLists.txt", "type": "file" }, { - "bom-ref": "0ea85e2983d7e91e", + "bom-ref": "8bc4b406995870ab", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/pmi/bootstrap_pmi.cpp", "type": "file" }, { - "bom-ref": "bfb4f8410ac86355", + "bom-ref": "316f3753dc80d0dc", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/pmix/CMakeLists.txt", "type": "file" }, { - "bom-ref": "5872860135adb141", + "bom-ref": "82da6db45cba8b40", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/pmix/bootstrap_pmix.c", "type": "file" }, { - "bom-ref": "0547c359126982e7", + "bom-ref": "919b93d88c162002", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/shmem/CMakeLists.txt", "type": "file" }, { - "bom-ref": "166ee96fde0aa9f5", + "bom-ref": "b5e500d4d76bc410", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/shmem/bootstrap_shmem.c", "type": "file" }, { - "bom-ref": "903bedd1f484ae5a", + "bom-ref": "a106321b6e33f3d7", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/CMakeLists.txt", "type": "file" }, { - "bom-ref": "049032592b05a203", + "bom-ref": "37693e9654a94a72", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/bootstrap_uid.cpp", "type": "file" }, { - "bom-ref": "98bef694d1eac5ff", + "bom-ref": "e52d0cbd5bfbfa86", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/bootstrap_uid_remap.h", "type": "file" }, { - "bom-ref": "9c71f2bb258e67d0", + "bom-ref": "7ee7bee009038a61", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/bootstrap_uid_types.hpp", "type": "file" }, { - "bom-ref": "296ce178c5738e22", + "bom-ref": "81ef96b6327cc3d7", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/ncclSocket/ncclsocket_checks.h", "type": "file" }, { - "bom-ref": "da27263ef707f4f6", + "bom-ref": "3c1f0bb579b01453", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/ncclSocket/ncclsocket_debug.h", "type": "file" }, { - "bom-ref": "3e53cdfed6fea551", + "bom-ref": "f5a4ec6380ccfebc", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/ncclSocket/ncclsocket_nccl.h", "type": "file" }, { - "bom-ref": "1e8d7528a02745dc", + "bom-ref": "74b18060566750bd", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/ncclSocket/ncclsocket_param.h", "type": "file" }, { - "bom-ref": "74930d6423700204", + "bom-ref": "7873934fb2e7efcd", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/ncclSocket/ncclsocket_socket.cpp", "type": "file" }, { - "bom-ref": "ca0b99a5affb8126", + "bom-ref": "230f5f0209e855d3", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/ncclSocket/ncclsocket_socket.hpp", "type": "file" }, { - "bom-ref": "f39649cf21487116", + "bom-ref": "8cd196266fc14e87", "name": "/usr/src/nvshmem/13/src/bootstrap-plugins/uid/ncclSocket/ncclsocket_utils.h", "type": "file" }, { - "bom-ref": "7d9c54815bcd6a1b", + "bom-ref": "998d43e4b7dd9dde", "name": "/usr/src/nvshmem/13/src/examples/CMakeLists.txt", "type": "file" }, { - "bom-ref": "2a27ff3488c57ff4", + "bom-ref": "42ec63833ce7eb79", "name": "/usr/src/nvshmem/13/src/examples/bootstrap_helper.h", "type": "file" }, { - "bom-ref": "a7d59410db351505", + "bom-ref": "70b61a7699fddd6c", "name": "/usr/src/nvshmem/13/src/examples/collective-launch.cu", "type": "file" }, { - "bom-ref": "2fae068744c0908c", + "bom-ref": "35c9765e43a71c29", "name": "/usr/src/nvshmem/13/src/examples/dev-guide-ring-mpi.cu", "type": "file" }, { - "bom-ref": "4c12d685555bada5", + "bom-ref": "82ce15877cc410d0", "name": "/usr/src/nvshmem/13/src/examples/dev-guide-ring.cu", "type": "file" }, { - "bom-ref": "8eb31e2b527d1e95", + "bom-ref": "ec20a15b5287ccc0", "name": "/usr/src/nvshmem/13/src/examples/gemm_allreduce/allreduce_nvls_warpspecialized.hpp", "type": "file" }, { - "bom-ref": "3b5a5d1a15667b68", + "bom-ref": "ea8c2d8b2a5c14a5", "name": "/usr/src/nvshmem/13/src/examples/gemm_allreduce/gemmAR_fusion_blackwell_fp16.cu", "type": "file" }, { - "bom-ref": "506366420ba7584e", + "bom-ref": "559373bd8033b4e7", "name": "/usr/src/nvshmem/13/src/examples/gemm_allreduce/nvshmemAlloc.hpp", "type": "file" }, { - "bom-ref": "640056f434bd6bc8", + "bom-ref": "9cfc79973e40d0f9", "name": "/usr/src/nvshmem/13/src/examples/gemm_allreduce/sm100_gemm_tma_warpspecialized_allreduce.hpp", "type": "file" }, { - "bom-ref": "ec173fac755eb902", + "bom-ref": "3bf7a5782414bddf", "name": "/usr/src/nvshmem/13/src/examples/hello.cpp", "type": "file" }, { - "bom-ref": "418a3d8f99f7bfa6", + "bom-ref": "a7b1b965ae6c7fb7", "name": "/usr/src/nvshmem/13/src/examples/moe_shuffle.cu", "type": "file" }, { - "bom-ref": "8d66dfdbfde11979", + "bom-ref": "2588abb3576fc25c", "name": "/usr/src/nvshmem/13/src/examples/mpi-based-init.cu", "type": "file" }, { - "bom-ref": "d3cc608c0cc2888b", + "bom-ref": "f0246818f6581a9a", "name": "/usr/src/nvshmem/13/src/examples/on-stream.cu", "type": "file" }, { - "bom-ref": "5c81b395d9b8c38a", + "bom-ref": "6b6293c9b2f95a5b", "name": "/usr/src/nvshmem/13/src/examples/put-block.cu", "type": "file" }, { - "bom-ref": "8549f79e62b176d0", + "bom-ref": "7e8f6db1c9c9c31d", "name": "/usr/src/nvshmem/13/src/examples/ring-bcast.cu", "type": "file" }, { - "bom-ref": "676a79cf43590cb2", + "bom-ref": "840aa933fc215057", "name": "/usr/src/nvshmem/13/src/examples/ring-reduce.cu", "type": "file" }, { - "bom-ref": "d106c65a52ff50f5", + "bom-ref": "ab6b35c899a9bb58", "name": "/usr/src/nvshmem/13/src/examples/shmem-based-init.cu", "type": "file" }, { - "bom-ref": "d0662567f594056e", + "bom-ref": "ab966cf97d7a8f97", "name": "/usr/src/nvshmem/13/src/examples/thread-group.cu", "type": "file" }, { - "bom-ref": "559fc5104a3f2cc2", + "bom-ref": "7844ea189ed9c5c8", + "name": "/usr/src/nvshmem/13/src/examples/tma-smem.cu", + "type": "file" + }, + { + "bom-ref": "6a6afc922921aed7", "name": "/usr/src/nvshmem/13/src/examples/uid-based-init.cu", "type": "file" }, { - "bom-ref": "21eee03b228ea29f", + "bom-ref": "a8247d7e5ca26c5a", "name": "/usr/src/nvshmem/13/src/examples/user-buffer.cu", "type": "file" }, { - "bom-ref": "c75f3ee2539aceb6", + "bom-ref": "a9befc42186d5d5b", "name": "/usr/src/nvshmem/13/src/perftest/CMakeLists.txt", "type": "file" }, { - "bom-ref": "c16047528e3487ea", + "bom-ref": "a618533655fb5cc7", "name": "/usr/src/nvshmem/13/src/perftest/README.md", "type": "file" }, { - "bom-ref": "cd063db70abf949a", + "bom-ref": "b8cce6bc5d107b2b", "name": "/usr/src/nvshmem/13/src/perftest/common/CMakeLists.txt", "type": "file" }, { - "bom-ref": "a20acfa5df63e2f0", + "bom-ref": "62bac1225935ed9d", "name": "/usr/src/nvshmem/13/src/perftest/common/atomic_bw_common.h", "type": "file" }, { - "bom-ref": "05ec8e15e69685e5", + "bom-ref": "ba05fa2f936bfee4", "name": "/usr/src/nvshmem/13/src/perftest/common/atomic_one_sided_common.h", "type": "file" }, { - "bom-ref": "96f162161b5e35a7", + "bom-ref": "609ac6be322a288e", "name": "/usr/src/nvshmem/13/src/perftest/common/atomic_ping_pong_common.h", "type": "file" }, { - "bom-ref": "b3b8eabafe87a773", + "bom-ref": "a7c88be35ce0426a", "name": "/usr/src/nvshmem/13/src/perftest/common/utils.cu", "type": "file" }, { - "bom-ref": "c4899e5464144b9a", + "bom-ref": "300acdc6fc390983", "name": "/usr/src/nvshmem/13/src/perftest/common/utils.h", "type": "file" }, { - "bom-ref": "a7b0b9f556bcbf34", + "bom-ref": "9b16d60c48e414e1", "name": "/usr/src/nvshmem/13/src/perftest/device/CMakeLists.txt", "type": "file" }, { - "bom-ref": "45e2298df2a7de90", + "bom-ref": "3378f4843ef14459", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/CMakeLists.txt", "type": "file" }, { - "bom-ref": "c7471c3b19595897", + "bom-ref": "7f943eee54d7400a", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/alltoall_latency.args", "type": "file" }, { - "bom-ref": "82c6c578e26c2814", + "bom-ref": "11ed5d1c4b32e135", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/alltoall_latency.cu", "type": "file" }, { - "bom-ref": "3b1116666fc17503", + "bom-ref": "99e4b1aeeb815b7a", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/barrier_latency.args", "type": "file" }, { - "bom-ref": "ff860f90e59ea170", + "bom-ref": "22255af593ed86c5", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/barrier_latency.cu", "type": "file" }, { - "bom-ref": "56124d8533acd147", + "bom-ref": "b11cb868814fda56", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/bcast_latency.args", "type": "file" }, { - "bom-ref": "4891babad067d66f", + "bom-ref": "cdccdc5205d9f682", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/bcast_latency.cu", "type": "file" }, { - "bom-ref": "397b82ae756b4c5e", + "bom-ref": "a52ee74438048a6b", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/coll_test.h", "type": "file" }, { - "bom-ref": "e1f5fa75359e0584", + "bom-ref": "4b037947bd2e3271", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/fcollect_latency.args", "type": "file" }, { - "bom-ref": "76be167ea5e46b1e", + "bom-ref": "1f92c720924ae9d3", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/fcollect_latency.cu", "type": "file" }, { - "bom-ref": "fe20e6eb0eb18a39", + "bom-ref": "3a3547fbcfa5ed7c", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/redmaxloc_latency.cu", "type": "file" }, { - "bom-ref": "ed4939cddc4bfdde", + "bom-ref": "0399cdf2c360e8ff", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/reducescatter_latency.args", "type": "file" }, { - "bom-ref": "d06b88aaff2c9e31", + "bom-ref": "83cf226aa0c6d808", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/reducescatter_latency.cu", "type": "file" }, { - "bom-ref": "2611e548d36c011a", + "bom-ref": "a07f4b6e56384223", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/reduction_latency.args", "type": "file" }, { - "bom-ref": "13c7d00c026c9466", + "bom-ref": "b7052585f5208cbf", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/reduction_latency.cu", "type": "file" }, { - "bom-ref": "10d975a1ffe9b8f9", + "bom-ref": "125fb6b0c0ffbc68", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/sync_latency.args", "type": "file" }, { - "bom-ref": "43aae3d39d42925d", + "bom-ref": "4d85282252d0a7e4", "name": "/usr/src/nvshmem/13/src/perftest/device/coll/sync_latency.cu", "type": "file" }, { - "bom-ref": "76aece6b18cafb95", + "bom-ref": "c49a716822a03244", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/CMakeLists.txt", "type": "file" }, { - "bom-ref": "c3e88efb968847f1", + "bom-ref": "83b659f0b1c92a4c", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_atomic_bw.args", "type": "file" }, { - "bom-ref": "d2c64f78d6847d75", + "bom-ref": "66f4f595b3bce220", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_atomic_bw.cu", "type": "file" }, { - "bom-ref": "93ca965cb6b4da1c", + "bom-ref": "6faa1407ac4bd221", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_atomic_latency.args", "type": "file" }, { - "bom-ref": "6d17aeb4d379d8a1", + "bom-ref": "718307b4bdd66820", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_atomic_latency.cu", "type": "file" }, { - "bom-ref": "1b0f54984bc24b30", + "bom-ref": "60087c7628d698e9", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_atomic_ping_pong_latency.args", "type": "file" }, { - "bom-ref": "e8dd3657d6c5a7c5", + "bom-ref": "487f35b89ac84da4", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_atomic_ping_pong_latency.cu", "type": "file" }, { - "bom-ref": "36069f3a31c83364", + "bom-ref": "956d7b29f12bba7b", + "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_flush_bench.cu", + "type": "file" + }, + { + "bom-ref": "e1b3310764c89de9", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_g_bw.args", "type": "file" }, { - "bom-ref": "e6e9f40d5becbe88", + "bom-ref": "cbaa06ed4518d521", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_g_bw.cu", "type": "file" }, { - "bom-ref": "c36d41a7f77e801f", + "bom-ref": "b84e7eb583079722", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_g_latency.args", "type": "file" }, { - "bom-ref": "f60335f2e37a741a", + "bom-ref": "5d6c69ed8c68d967", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_g_latency.cu", "type": "file" }, { - "bom-ref": "86c16d331e109d5e", + "bom-ref": "ea7963e887e6b5f7", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_get_bw.args", "type": "file" }, { - "bom-ref": "c01b3b7e66cbe025", + "bom-ref": "4d72277d6ba5bad0", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_get_bw.cu", "type": "file" }, { - "bom-ref": "db665df329653319", + "bom-ref": "77d31a960dc348d4", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_get_latency.args", "type": "file" }, { - "bom-ref": "fcfe761036b9faab", + "bom-ref": "67ab16ccfe3c29ce", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_get_latency.cu", "type": "file" }, { - "bom-ref": "003688dd4bdc2417", + "bom-ref": "a0b8bd4693073fde", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_p_bw.args", "type": "file" }, { - "bom-ref": "05e55220c91576dc", + "bom-ref": "2545ef021a0da911", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_p_bw.cu", "type": "file" }, { - "bom-ref": "7d07c334199cbfe0", + "bom-ref": "e59a5387b696c859", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_p_latency.args", "type": "file" }, { - "bom-ref": "b02e2daa0cfc0c74", + "bom-ref": "f4e8eb5545594c0d", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_p_latency.cu", "type": "file" }, { - "bom-ref": "24e10a01caf1e5a1", + "bom-ref": "420bd37c785fe3c8", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_p_ping_pong_latency.args", "type": "file" }, { - "bom-ref": "ef3bbdf237e7b877", + "bom-ref": "1aa66adeb6a29b42", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_p_ping_pong_latency.cu", "type": "file" }, { - "bom-ref": "48b9e6694a2e05f0", + "bom-ref": "87b928b465b84d19", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_atomic_ping_pong_latency.cu", "type": "file" }, { - "bom-ref": "4d4afbeb55444b70", + "bom-ref": "00eac82cefd38e75", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_bw.args", "type": "file" }, { - "bom-ref": "26fb5d976285ec50", + "bom-ref": "4fb931ebf8843c2d", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_bw.cu", "type": "file" }, { - "bom-ref": "b018fc1cd8d717db", + "bom-ref": "74bcbb765003b032", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_latency.args", "type": "file" }, { - "bom-ref": "a4e49877dde75cd8", + "bom-ref": "58bd5bd0bc310add", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_latency.cu", "type": "file" }, { - "bom-ref": "26bdc25d7a95e7e2", + "bom-ref": "550cf6bcaf0fbb37", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_ping_pong_latency.args", "type": "file" }, { - "bom-ref": "d3c2c2ae0d2a4b9d", + "bom-ref": "ad17597c09071148", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_ping_pong_latency.cu", "type": "file" }, { - "bom-ref": "a998481923ed6980", + "bom-ref": "9ff0db99f364a811", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_signal_ping_pong_latency.args", "type": "file" }, { - "bom-ref": "369484c047970e9d", + "bom-ref": "50c38725e4a3e71c", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_signal_ping_pong_latency.cu", "type": "file" }, { - "bom-ref": "79e00f984b0d3767", + "bom-ref": "c2e52d72aef0ef23", + "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_tma_bw.args", + "type": "file" + }, + { + "bom-ref": "3a86bb054f5f68d4", + "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_put_tma_bw.cu", + "type": "file" + }, + { + "bom-ref": "0e8f6277e2747ae6", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_signal_ping_pong_latency.args", "type": "file" }, { - "bom-ref": "327007a87747f825", + "bom-ref": "db66d97e3d6921fc", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_signal_ping_pong_latency.cu", "type": "file" }, { - "bom-ref": "bdb710ea03bddb72", + "bom-ref": "9ccab066e7629ce7", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_st_bw.args", "type": "file" }, { - "bom-ref": "8be402da41fcbfa5", + "bom-ref": "d13374c3e14b0250", "name": "/usr/src/nvshmem/13/src/perftest/device/pt-to-pt/shmem_st_bw.cu", "type": "file" }, { - "bom-ref": "ea2b8180f8de2c6b", + "bom-ref": "1fc911805c895ad6", "name": "/usr/src/nvshmem/13/src/perftest/device/tile/CMakeLists.txt", "type": "file" }, { - "bom-ref": "791ba6d9a5f76d99", + "bom-ref": "30ee9eee7c989aa0", "name": "/usr/src/nvshmem/13/src/perftest/device/tile/tile_allgather_latency.cu", "type": "file" }, { - "bom-ref": "7f85afdc31dc383e", + "bom-ref": "0210f40cfd3c95a7", "name": "/usr/src/nvshmem/13/src/perftest/device/tile/tile_allreduce_latency.cu", "type": "file" }, { - "bom-ref": "cca335dde19d18fa", + "bom-ref": "4d3b72037cf77977", "name": "/usr/src/nvshmem/13/src/perftest/device/tile/tile_coll_test.h", "type": "file" }, { - "bom-ref": "bea77eedfba175cc", + "bom-ref": "969bd18072b9a99d", "name": "/usr/src/nvshmem/13/src/perftest/host/CMakeLists.txt", "type": "file" }, { - "bom-ref": "fb2c013fdcf1e134", + "bom-ref": "27e2e81af8217f51", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/CMakeLists.txt", "type": "file" }, { - "bom-ref": "7f8e166a8206556c", + "bom-ref": "cc2c64bd3cc8b4ed", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/alltoall_on_stream.args", "type": "file" }, { - "bom-ref": "b99ec173f4d4b732", + "bom-ref": "d56d68f2a3d4f47b", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/alltoall_on_stream.cpp", "type": "file" }, { - "bom-ref": "e1ce1d46944f4652", + "bom-ref": "a07b6021b6641ebb", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/barrier_all_on_stream.cpp", "type": "file" }, { - "bom-ref": "a1a79afc2870ea43", + "bom-ref": "0ff98043783e96ca", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/barrier_on_stream.args", "type": "file" }, { - "bom-ref": "70e45bc2bc26065f", + "bom-ref": "f5c22063c133f31e", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/barrier_on_stream.cpp", "type": "file" }, { - "bom-ref": "820c9b3e1ee62380", + "bom-ref": "321397699f49b779", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/broadcast_on_stream.args", "type": "file" }, { - "bom-ref": "e94474e78ab76478", + "bom-ref": "6e889c590650b63d", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/broadcast_on_stream.cpp", "type": "file" }, { - "bom-ref": "345673169dfd0e31", + "bom-ref": "d5a5e3cb306009c8", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/coll_test.h", "type": "file" }, { - "bom-ref": "65f8f4a159072bc3", + "bom-ref": "2d2b8ea4c7aad5f2", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/fcollect_on_stream.args", "type": "file" }, { - "bom-ref": "7cdee7e018680dce", + "bom-ref": "222935c292bdee93", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/fcollect_on_stream.cpp", "type": "file" }, { - "bom-ref": "c130069730b3a860", + "bom-ref": "d8636382e0158df1", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/reducescatter_on_stream.args", "type": "file" }, { - "bom-ref": "5b1b2d90c84d44db", + "bom-ref": "c4f63ea87ef29116", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/reducescatter_on_stream.cpp", "type": "file" }, { - "bom-ref": "d441809945150236", + "bom-ref": "be7bcd707c68d44f", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/reduction_on_stream.args", "type": "file" }, { - "bom-ref": "4aa5d3aaa54926e3", + "bom-ref": "8589b7722b0c74d2", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/reduction_on_stream.cpp", "type": "file" }, { - "bom-ref": "e097d3077db9feec", + "bom-ref": "afdf5d0fd0d75ec9", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/sync_all_on_stream.cpp", "type": "file" }, { - "bom-ref": "579e82b5ed51ebe4", + "bom-ref": "8629fc6db0757385", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/sync_on_stream.args", "type": "file" }, { - "bom-ref": "b6a40e4fa60886e5", + "bom-ref": "f29e103844fa486c", "name": "/usr/src/nvshmem/13/src/perftest/host/coll/sync_on_stream.cpp", "type": "file" }, { - "bom-ref": "44b96fe132ce5264", + "bom-ref": "1d769d4e549d7df9", "name": "/usr/src/nvshmem/13/src/perftest/host/init/CMakeLists.txt", "type": "file" }, { - "bom-ref": "8f9526064b94003a", + "bom-ref": "9cc451321f118b1b", "name": "/usr/src/nvshmem/13/src/perftest/host/init/malloc.cpp", "type": "file" }, { - "bom-ref": "bdf194e8d885ca8b", + "bom-ref": "1294b5fa7d5803aa", "name": "/usr/src/nvshmem/13/src/perftest/host/pt-to-pt/CMakeLists.txt", "type": "file" }, { - "bom-ref": "4719e16ce42c8948", + "bom-ref": "871ab8c5b237621d", "name": "/usr/src/nvshmem/13/src/perftest/host/pt-to-pt/bw.args", "type": "file" }, { - "bom-ref": "bcae2133e0e3b354", + "bom-ref": "c8455fd5cefedbf1", "name": "/usr/src/nvshmem/13/src/perftest/host/pt-to-pt/bw.cpp", "type": "file" }, { - "bom-ref": "df9c65629db248ec", + "bom-ref": "694c58243ff4d5f5", "name": "/usr/src/nvshmem/13/src/perftest/host/pt-to-pt/latency.args", "type": "file" }, { - "bom-ref": "aee87471e4d604ed", + "bom-ref": "d2840d330ebfb9f4", "name": "/usr/src/nvshmem/13/src/perftest/host/pt-to-pt/latency.cpp", "type": "file" }, { - "bom-ref": "44217fde39cb9a17", + "bom-ref": "a0a125aec3c908ba", "name": "/usr/src/nvshmem/13/src/perftest/host/pt-to-pt/stream_latency.args", "type": "file" }, { - "bom-ref": "4b8672ed60b20fa6", + "bom-ref": "7e9684fc2a10a7b3", "name": "/usr/src/nvshmem/13/src/perftest/host/pt-to-pt/stream_latency.cu", "type": "file" }, { - "bom-ref": "98b44f313b33d489", + "bom-ref": "bed578ec506760b0", "name": "/usr/src/nvshmem/13/src/perftest/perftest-mmap-full.list", "type": "file" }, { - "bom-ref": "a0c24a50e3731d43", + "bom-ref": "acd188e8656b6706", "name": "/usr/src/nvshmem/13/src/perftest/perftest-mmap-sanity.list", "type": "file" }, { - "bom-ref": "401caf3f2a4cae39", + "bom-ref": "b105293c5c548e28", "name": "/usr/src/nvshmem/13/src/perftest/perftest-p2p-cudagraph.list", "type": "file" }, { - "bom-ref": "c7a3cec78e3b1470", + "bom-ref": "11f10ef84da5fa95", "name": "/usr/src/nvshmem/13/src/transport-plugins/CMakeLists.txt", "type": "file" }, { - "bom-ref": "2c1e46ceb0eaee43", + "bom-ref": "4d52ff28981b438b", + "name": "/usr/src/nvshmem/13/src/transport-plugins/cmake_config/NVSHMEMCxxStandard.cmake", + "type": "file" + }, + { + "bom-ref": "e3a6a07b959eb086", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/CMakeLists.txt", "type": "file" }, { - "bom-ref": "7f5149d5fa5b3268", + "bom-ref": "9da8d4dd8928f7e9", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/env_defs.h", "type": "file" }, { - "bom-ref": "8fb46fade1e01df0", + "bom-ref": "be5287101ff1aa69", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/mlx5_ifc.h", "type": "file" }, { - "bom-ref": "dc604e4af6969866", + "bom-ref": "325796475d08c80b", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/mlx5_prm.h", "type": "file" }, { - "bom-ref": "baed6d242f22cea6", + "bom-ref": "c9b9b3c92efc24cf", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/transport_common.cpp", "type": "file" }, { - "bom-ref": "8315551b79bd8844", + "bom-ref": "5555fdf1e006c46d", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/transport_common.h", "type": "file" }, { - "bom-ref": "a823e774ecd4add9", + "bom-ref": "9445b351d9f51924", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/transport_gdr_common.cpp", "type": "file" }, { - "bom-ref": "36417433439fccbd", + "bom-ref": "47fd3f4e786e906c", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/transport_gdr_common.h", "type": "file" }, { - "bom-ref": "87e02caf5164df1f", + "bom-ref": "1ad465c4018dd576", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/transport_ib_common.cpp", "type": "file" }, { - "bom-ref": "6a34eda522fee27d", + "bom-ref": "21fedd852a8d7150", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/transport_ib_common.h", "type": "file" }, { - "bom-ref": "047b23c4c8b7afbd", + "bom-ref": "009aaf95574edb0c", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/transport_mlx5_common.cpp", "type": "file" }, { - "bom-ref": "55270b7085aa4361", + "bom-ref": "fb38cfd0122138b8", "name": "/usr/src/nvshmem/13/src/transport-plugins/common/transport_mlx5_common.h", "type": "file" }, { - "bom-ref": "cb8d446a6aeac255", + "bom-ref": "eb5144056acad2c4", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/CMakeLists.txt", + "type": "file" + }, + { + "bom-ref": "e35079ca51bee7d3", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio.cpp", + "type": "file" + }, + { + "bom-ref": "e52b2c8b375e4397", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/CMakeLists.txt", + "type": "file" + }, + { + "bom-ref": "d57a8e4f05cda99c", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/common/doca_gpunetio_verbs_def.h", + "type": "file" + }, + { + "bom-ref": "f0e3c4d635a28d60", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/common/doca_gpunetio_verbs_dev.h", + "type": "file" + }, + { + "bom-ref": "f4d456a208c700c3", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/device/doca_gpunetio_dev_verbs_common.cuh", + "type": "file" + }, + { + "bom-ref": "e761882c178efd6b", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/device/doca_gpunetio_dev_verbs_counter.cuh", + "type": "file" + }, + { + "bom-ref": "801eefb59bddffaa", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/device/doca_gpunetio_dev_verbs_cq.cuh", + "type": "file" + }, + { + "bom-ref": "46b604398b1fe2ce", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/device/doca_gpunetio_dev_verbs_onesided.cuh", + "type": "file" + }, + { + "bom-ref": "15f26f0e611e38c1", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/device/doca_gpunetio_dev_verbs_qp.cuh", + "type": "file" + }, + { + "bom-ref": "7d1f4966068646f0", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/doca_gpunetio_config.h", + "type": "file" + }, + { + "bom-ref": "3c99f41b59252907", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/doca_gpunetio_device.h", + "type": "file" + }, + { + "bom-ref": "d0d844f8f3fcad66", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/doca_gpunetio_host.h", + "type": "file" + }, + { + "bom-ref": "7c5622ec1460d2f1", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/host/doca_error.h", + "type": "file" + }, + { + "bom-ref": "c6befa44dba89903", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/host/doca_gpunetio.h", + "type": "file" + }, + { + "bom-ref": "36c8080d0643f265", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/host/doca_gpunetio_high_level.h", + "type": "file" + }, + { + "bom-ref": "48f489bba12a8567", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/host/doca_verbs.h", + "type": "file" + }, + { + "bom-ref": "db0f88fdd0a89909", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/host/mlx5_ifc.h", + "type": "file" + }, + { + "bom-ref": "9f4f921d32568fa4", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/include/gpunetio/host/mlx5_prm.h", + "type": "file" + }, + { + "bom-ref": "90794d0883baadf7", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio.cpp", + "type": "file" + }, + { + "bom-ref": "488da3791f5dada6", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio.hpp", + "type": "file" + }, + { + "bom-ref": "b53db31473380e86", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio_cuda_wrapper.cpp", + "type": "file" + }, + { + "bom-ref": "eff8cb61b2c85cb4", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio_cuda_wrapper.h", + "type": "file" + }, + { + "bom-ref": "59461daedd2d9d59", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio_gdrcopy.cpp", + "type": "file" + }, + { + "bom-ref": "5407dbb885ea7eee", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio_gdrcopy.h", + "type": "file" + }, + { + "bom-ref": "5a0d89a4ad42f264", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio_high_level.cpp", + "type": "file" + }, + { + "bom-ref": "3bf6b678b19f214f", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio_log.cpp", + "type": "file" + }, + { + "bom-ref": "a86792371dfde3e2", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio_log.hpp", + "type": "file" + }, + { + "bom-ref": "3effa38aec72cb6e", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio_sdk_wrapper.cpp", + "type": "file" + }, + { + "bom-ref": "7d2237f04b854c21", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_gpunetio_sdk_wrapper.h", + "type": "file" + }, + { + "bom-ref": "114cd01ec0993d14", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_internal.hpp", + "type": "file" + }, + { + "bom-ref": "8b5809e026444e6e", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_sdk_wrapper.h", + "type": "file" + }, + { + "bom-ref": "c7112e9357bda245", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_cq.cpp", + "type": "file" + }, + { + "bom-ref": "40d7d743d0fb9381", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_cq.hpp", + "type": "file" + }, + { + "bom-ref": "faee414b432b4742", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_cq_sdk_wrapper.cpp", + "type": "file" + }, + { + "bom-ref": "2cc50606da90f8bd", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_cq_sdk_wrapper.h", + "type": "file" + }, + { + "bom-ref": "d8ba3e87784cde4f", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_dev.cpp", + "type": "file" + }, + { + "bom-ref": "ec3fdf171df29bca", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_dev.hpp", + "type": "file" + }, + { + "bom-ref": "ed8854a4c00bd0d8", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_dev_sdk_wrapper.cpp", + "type": "file" + }, + { + "bom-ref": "1bbd571b46d83133", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_dev_sdk_wrapper.h", + "type": "file" + }, + { + "bom-ref": "cabcef9cc763399f", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_device_attr.cpp", + "type": "file" + }, + { + "bom-ref": "de5d0fa335769de7", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_device_attr.hpp", + "type": "file" + }, + { + "bom-ref": "254261abac90ab24", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_ibv_wrapper.cpp", + "type": "file" + }, + { + "bom-ref": "7416dfdc45200e73", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_ibv_wrapper.h", + "type": "file" + }, + { + "bom-ref": "a30c48bf1062f63b", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_mlx5dv_wrapper.cpp", + "type": "file" + }, + { + "bom-ref": "c66346207715d8ee", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_mlx5dv_wrapper.h", + "type": "file" + }, + { + "bom-ref": "40039f1e88e5c7d6", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_net_wrapper.h", + "type": "file" + }, + { + "bom-ref": "1c9da99a1e0cd75a", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_qp.cpp", + "type": "file" + }, + { + "bom-ref": "0bf5c27236b46f21", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_qp.hpp", + "type": "file" + }, + { + "bom-ref": "1c100fb9211f894f", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_qp_sdk_wrapper.cpp", + "type": "file" + }, + { + "bom-ref": "7b8bfe42ac0dd155", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_qp_sdk_wrapper.h", + "type": "file" + }, + { + "bom-ref": "9753c4e52b6a9300", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_srq.cpp", + "type": "file" + }, + { + "bom-ref": "4a9b74c0bc25bad9", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_srq.hpp", + "type": "file" + }, + { + "bom-ref": "12392706efb5a2a7", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_uar.cpp", + "type": "file" + }, + { + "bom-ref": "8cd6cfed929d7e88", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_uar.hpp", + "type": "file" + }, + { + "bom-ref": "61615ae7651a439b", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_uar_sdk_wrapper.cpp", + "type": "file" + }, + { + "bom-ref": "d80b04b40c8d525c", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_uar_sdk_wrapper.h", + "type": "file" + }, + { + "bom-ref": "12a31b7833f01f48", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_umem.cpp", + "type": "file" + }, + { + "bom-ref": "d274e3228affab4c", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_umem.hpp", + "type": "file" + }, + { + "bom-ref": "f3c82be9e07bc2ba", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_umem_sdk_wrapper.cpp", + "type": "file" + }, + { + "bom-ref": "d1e754278135de61", + "name": "/usr/src/nvshmem/13/src/transport-plugins/gpunetio/gpunetio_src/src/doca_verbs_umem_sdk_wrapper.h", + "type": "file" + }, + { + "bom-ref": "d9cfbb57a3e4ffe0", "name": "/usr/src/nvshmem/13/src/transport-plugins/ibdevx/CMakeLists.txt", "type": "file" }, { - "bom-ref": "b7baf6a515678958", + "bom-ref": "b354270fb48c112d", "name": "/usr/src/nvshmem/13/src/transport-plugins/ibdevx/ibdevx.cpp", "type": "file" }, { - "bom-ref": "16e9a24d720b6841", + "bom-ref": "4c188956c435c884", "name": "/usr/src/nvshmem/13/src/transport-plugins/ibdevx/ibdevx.h", "type": "file" }, { - "bom-ref": "4bc57e4dbef1a2f0", + "bom-ref": "5db65b0e653ea975", "name": "/usr/src/nvshmem/13/src/transport-plugins/ibgda/CMakeLists.txt", "type": "file" }, { - "bom-ref": "1ff8528e5ee55a76", + "bom-ref": "c3fbb0c9da0498cf", "name": "/usr/src/nvshmem/13/src/transport-plugins/ibgda/ibgda.cpp", "type": "file" }, { - "bom-ref": "e499ae6859764e3e", + "bom-ref": "e1770a3692824b8b", "name": "/usr/src/nvshmem/13/src/transport-plugins/ibrc/CMakeLists.txt", "type": "file" }, { - "bom-ref": "bd51ee903302105b", + "bom-ref": "8a7f574008152efe", "name": "/usr/src/nvshmem/13/src/transport-plugins/ibrc/ibrc.cpp", "type": "file" }, { - "bom-ref": "a52b4fb5807fe548", + "bom-ref": "73804f30137d0f21", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/bootstrap_host_transport/env_defs_internal.h", "type": "file" }, { - "bom-ref": "da9e84f3817d70b7", + "bom-ref": "b0bc3121164c146d", + "name": "/usr/src/nvshmem/13/src/transport-plugins/include/device_host_transport/nvshmem_common_gpunetio.h", + "type": "file" + }, + { + "bom-ref": "13a4ef0fd5720996", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/device_host_transport/nvshmem_common_ibgda.h", "type": "file" }, { - "bom-ref": "5a596d5cc7de11be", + "bom-ref": "aaafb6743b6bb80b", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/device_host_transport/nvshmem_common_transport.h", "type": "file" }, { - "bom-ref": "9e5eb3fb75e132a5", + "bom-ref": "8dda4e33a419bfa0", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/device_host_transport/nvshmem_constants.h", "type": "file" }, { - "bom-ref": "ff9a5330e6b3f3cc", + "bom-ref": "ba0422846a3aa76d", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/internal/bootstrap_host_transport/nvshmemi_bootstrap_defines.h", "type": "file" }, { - "bom-ref": "267f6686e3440820", + "bom-ref": "c3b8238979595af1", + "name": "/usr/src/nvshmem/13/src/transport-plugins/include/internal/host/scope_guard.h", + "type": "file" + }, + { + "bom-ref": "208a5454cea94489", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/internal/host_transport/cudawrap.h", "type": "file" }, { - "bom-ref": "d213b90409bcf9f4", + "bom-ref": "f20f65d7a18def01", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/internal/host_transport/nvshmemi_transport_defines.h", "type": "file" }, { - "bom-ref": "83a59c5977050f4e", + "bom-ref": "8410632c2a16b897", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/internal/host_transport/transport.h", "type": "file" }, { - "bom-ref": "779456c60b932abf", + "bom-ref": "038636eb8384985e", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/non_abi/nvshmem_build_options.h", "type": "file" }, { - "bom-ref": "8bd54c4c3ecb422e", + "bom-ref": "870c62febdb1f56f", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/non_abi/nvshmem_version.h", "type": "file" }, { - "bom-ref": "96523b4435b7ab1a", + "bom-ref": "090a7dfaae9cfb3f", "name": "/usr/src/nvshmem/13/src/transport-plugins/include/non_abi/nvshmemx_error.h", "type": "file" }, { - "bom-ref": "8e314f364f3bdd70", + "bom-ref": "555b5bc55daa0bc9", "name": "/usr/src/nvshmem/13/src/transport-plugins/libfabric/CMakeLists.txt", "type": "file" }, { - "bom-ref": "e044c982cc99e2c2", + "bom-ref": "2b9fcee3b74617ef", "name": "/usr/src/nvshmem/13/src/transport-plugins/libfabric/libfabric.cpp", "type": "file" }, { - "bom-ref": "a835203746490a66", + "bom-ref": "439f379cb1cd826b", "name": "/usr/src/nvshmem/13/src/transport-plugins/libfabric/libfabric.h", "type": "file" }, { - "bom-ref": "ce7128694bcc7aa9", + "bom-ref": "ce65e5b94887d0d8", "name": "/usr/src/nvshmem/13/src/transport-plugins/nvshmem_transport.sym", "type": "file" }, { - "bom-ref": "9146c5a0c7946d5d", + "bom-ref": "e84567738fd3f444", "name": "/usr/src/nvshmem/13/src/transport-plugins/ucx/CMakeLists.txt", "type": "file" }, { - "bom-ref": "c613cc57990c65b8", + "bom-ref": "342bab29951fa9a1", "name": "/usr/src/nvshmem/13/src/transport-plugins/ucx/ucx.cpp", "type": "file" }, { - "bom-ref": "75f32270602adbdc", + "bom-ref": "def12cfcea02cab5", "name": "/usr/src/nvshmem/13/src/transport-plugins/ucx/ucx.h", "type": "file" }, { - "bom-ref": "00db52b866970d63", + "bom-ref": "feb63a948a6905f5", "name": "/usr/src/python3.12/Grammar/python.gram", "type": "file" }, { - "bom-ref": "9421b760e483c2e0", + "bom-ref": "1b05a72e39a1f40a", "name": "/usr/src/python3.12/Parser/Python.asdl", "type": "file" }, { - "bom-ref": "56798d6b957e789b", + "bom-ref": "05b075fb0450708c", "name": "/var/lib/dpkg/info/adduser.conffiles", "type": "file" }, { - "bom-ref": "48f8159601718195", + "bom-ref": "758f705f60f44c2a", "name": "/var/lib/dpkg/info/adduser.list", "type": "file" }, { - "bom-ref": "72386eef28e05ea5", + "bom-ref": "c0dbb1f71393b802", "name": "/var/lib/dpkg/info/adduser.md5sums", "type": "file" }, { - "bom-ref": "98aba83a371ab24a", + "bom-ref": "14bb5cb276eb0fb5", "name": "/var/lib/dpkg/info/adduser.postrm", "type": "file" }, { - "bom-ref": "e157f0fb20a09a1b", + "bom-ref": "df262696567f7924", "name": "/var/lib/dpkg/info/adduser.preinst", "type": "file" }, { - "bom-ref": "71668e605ea64553", + "bom-ref": "941414ff24339762", "name": "/var/lib/dpkg/info/apt-utils.list", "type": "file" }, { - "bom-ref": "645b5c92b233ea23", + "bom-ref": "9b80cc167b8c9b16", "name": "/var/lib/dpkg/info/apt-utils.md5sums", "type": "file" }, { - "bom-ref": "e058f5ab6e3ef107", + "bom-ref": "52dc00731615dcb9", "name": "/var/lib/dpkg/info/apt.conffiles", "type": "file" }, { - "bom-ref": "70c84286dfd6d0a6", + "bom-ref": "3acb0fed75034818", "name": "/var/lib/dpkg/info/apt.list", "type": "file" }, { - "bom-ref": "9518eacf242633c7", + "bom-ref": "7e7a58167fe04fc9", "name": "/var/lib/dpkg/info/apt.md5sums", "type": "file" }, { - "bom-ref": "c70432a56bb8a181", + "bom-ref": "ad28bc0e5d8cbc2b", "name": "/var/lib/dpkg/info/apt.postinst", "type": "file" }, { - "bom-ref": "c8f2fa77552bfb55", + "bom-ref": "9eba1fe4b8a790ef", "name": "/var/lib/dpkg/info/apt.postrm", "type": "file" }, { - "bom-ref": "485171aadac96244", + "bom-ref": "d433c8e6b3eb9fca", "name": "/var/lib/dpkg/info/apt.preinst", "type": "file" }, { - "bom-ref": "73f43a1177ec45ae", + "bom-ref": "5bed6f6f7cd9247c", "name": "/var/lib/dpkg/info/apt.prerm", "type": "file" }, { - "bom-ref": "9c74d6b9514b79e6", + "bom-ref": "1d6045ad5ae216c4", "name": "/var/lib/dpkg/info/apt.shlibs", "type": "file" }, { - "bom-ref": "42a96bccac35183c", + "bom-ref": "f9c5a6396419a716", "name": "/var/lib/dpkg/info/apt.triggers", "type": "file" }, { - "bom-ref": "f3d7a4cd49b8f4a3", + "bom-ref": "3b122959135cdb79", "name": "/var/lib/dpkg/info/autoconf.conffiles", "type": "file" }, { - "bom-ref": "c70bc86b6ca2448e", + "bom-ref": "7e1a7466a7262cdc", "name": "/var/lib/dpkg/info/autoconf.list", "type": "file" }, { - "bom-ref": "70a6563430cfa0bb", + "bom-ref": "649b7108e3e4bd75", "name": "/var/lib/dpkg/info/autoconf.md5sums", "type": "file" }, { - "bom-ref": "3b3f1c0da905433a", + "bom-ref": "918e06e4f568a284", "name": "/var/lib/dpkg/info/automake.list", "type": "file" }, { - "bom-ref": "3037111634d75eb5", + "bom-ref": "4dcdca41ea583b1b", "name": "/var/lib/dpkg/info/automake.md5sums", "type": "file" }, { - "bom-ref": "95c68350a70fd7e2", + "bom-ref": "92dfcc86beb66c5c", "name": "/var/lib/dpkg/info/automake.postinst", "type": "file" }, { - "bom-ref": "43dcda4aaed1f6e7", + "bom-ref": "969e90d89f1ff949", "name": "/var/lib/dpkg/info/automake.preinst", "type": "file" }, { - "bom-ref": "7b63462542fe6e44", + "bom-ref": "c603d8a0e8c9c766", "name": "/var/lib/dpkg/info/automake.prerm", "type": "file" }, { - "bom-ref": "fd1f5cb97d7ded9e", + "bom-ref": "6de5b84da6712338", "name": "/var/lib/dpkg/info/autotools-dev.list", "type": "file" }, { - "bom-ref": "1b401b0d4d60ac34", + "bom-ref": "9b317d6c7a42f172", "name": "/var/lib/dpkg/info/autotools-dev.md5sums", "type": "file" }, { - "bom-ref": "f14ab5dbd825e8ad", + "bom-ref": "55640a0d0ecc2867", "name": "/var/lib/dpkg/info/base-files.conffiles", "type": "file" }, { - "bom-ref": "6b31f148a0df8f36", + "bom-ref": "82134d78872ab298", "name": "/var/lib/dpkg/info/base-files.list", "type": "file" }, { - "bom-ref": "151aad1058981061", + "bom-ref": "855be37482b5019b", "name": "/var/lib/dpkg/info/base-files.md5sums", "type": "file" }, { - "bom-ref": "cdabc6a5fb127685", + "bom-ref": "1ac8daddf62a075f", "name": "/var/lib/dpkg/info/base-files.postinst", "type": "file" }, { - "bom-ref": "5339f5aba358b768", + "bom-ref": "01055836b5ac5cee", "name": "/var/lib/dpkg/info/base-files.postrm", "type": "file" }, { - "bom-ref": "440beddfa800a304", + "bom-ref": "1beb465894dd6d86", "name": "/var/lib/dpkg/info/base-files.preinst", "type": "file" }, { - "bom-ref": "4cf59cec72e74247", + "bom-ref": "36eb957e4b93dd31", "name": "/var/lib/dpkg/info/base-files.prerm", "type": "file" }, { - "bom-ref": "3466863eb38beea3", + "bom-ref": "b0c7592b4c865171", "name": "/var/lib/dpkg/info/base-files.triggers", "type": "file" }, { - "bom-ref": "14d21265e7adcc59", + "bom-ref": "32eb7cac39eec047", "name": "/var/lib/dpkg/info/base-passwd.list", "type": "file" }, { - "bom-ref": "ae6aac28b5927be6", + "bom-ref": "2d1490c7d45193bc", "name": "/var/lib/dpkg/info/base-passwd.md5sums", "type": "file" }, { - "bom-ref": "ac135cc50600bf6e", + "bom-ref": "ba57570d41a8b158", "name": "/var/lib/dpkg/info/base-passwd.postinst", "type": "file" }, { - "bom-ref": "2ee3732544dd25d9", + "bom-ref": "4de16b0445e4c257", "name": "/var/lib/dpkg/info/base-passwd.postrm", "type": "file" }, { - "bom-ref": "20949ba341040b03", + "bom-ref": "6a00fb143254f6e1", "name": "/var/lib/dpkg/info/base-passwd.preinst", "type": "file" }, { - "bom-ref": "e533a8313eb404d3", + "bom-ref": "444f54ee390f1c51", "name": "/var/lib/dpkg/info/base-passwd.templates", "type": "file" }, { - "bom-ref": "a06342a05c3b67e4", + "bom-ref": "39bbbf7ba16d094e", "name": "/var/lib/dpkg/info/bash.conffiles", "type": "file" }, { - "bom-ref": "15df73cf9518d4d9", + "bom-ref": "42e2a9e8fcd6c6cb", "name": "/var/lib/dpkg/info/bash.list", "type": "file" }, { - "bom-ref": "38b675c75b008bed", + "bom-ref": "92869ddcc3cb9103", "name": "/var/lib/dpkg/info/bash.md5sums", "type": "file" }, { - "bom-ref": "088945b9a3540eb8", + "bom-ref": "a1d75c82b9ab3b4e", "name": "/var/lib/dpkg/info/bash.postinst", "type": "file" }, { - "bom-ref": "0e0de8f3a0245542", + "bom-ref": "fdbcdbd18872f58c", "name": "/var/lib/dpkg/info/bash.postrm", "type": "file" }, { - "bom-ref": "22862de839041a59", + "bom-ref": "951c05cdb0a6f80b", "name": "/var/lib/dpkg/info/bash.prerm", "type": "file" }, { - "bom-ref": "d2932079ab4ba836", + "bom-ref": "bda59db15dfb7058", "name": "/var/lib/dpkg/info/binutils-common:amd64.conffiles", "type": "file" }, { - "bom-ref": "4a41c42ca9e97b63", + "bom-ref": "c014cd1585c3ad25", "name": "/var/lib/dpkg/info/binutils-common:amd64.md5sums", "type": "file" }, { - "bom-ref": "f9318ae1eb7348bf", + "bom-ref": "64e9665671bd5e59", "name": "/var/lib/dpkg/info/binutils-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "4281ff5078f39b52", + "bom-ref": "523df2a51846cdd8", "name": "/var/lib/dpkg/info/binutils-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "90a06a18af591ef2", + "bom-ref": "b39f20e68f977e84", "name": "/var/lib/dpkg/info/binutils.list", "type": "file" }, { - "bom-ref": "e1ef7afc9c383019", + "bom-ref": "c8209aeb7c4c078f", "name": "/var/lib/dpkg/info/binutils.md5sums", "type": "file" }, { - "bom-ref": "6c8087d4d81c1eb6", + "bom-ref": "8a1caccec0cae484", "name": "/var/lib/dpkg/info/bsdutils.list", "type": "file" }, { - "bom-ref": "e8935e8d7ae894b9", + "bom-ref": "01f302ada5fe260b", "name": "/var/lib/dpkg/info/bsdutils.md5sums", "type": "file" }, { - "bom-ref": "2d4286b5f764e3cc", + "bom-ref": "cc51924ef969ad01", "name": "/var/lib/dpkg/info/build-essential.list", "type": "file" }, { - "bom-ref": "ecacc561dd1ec32b", + "bom-ref": "58c9986a12933b7a", "name": "/var/lib/dpkg/info/build-essential.md5sums", "type": "file" }, { - "bom-ref": "803e5b97cc168dd4", + "bom-ref": "7e2c4a5325001801", "name": "/var/lib/dpkg/info/bzip2.list", "type": "file" }, { - "bom-ref": "34740b633ef8536b", + "bom-ref": "89fa8cac2ed342b2", "name": "/var/lib/dpkg/info/bzip2.md5sums", "type": "file" }, { - "bom-ref": "dd22415b8c0a6248", + "bom-ref": "e45f0ea77676fe24", "name": "/var/lib/dpkg/info/ca-certificates.config", "type": "file" }, { - "bom-ref": "b705377076a26393", + "bom-ref": "c429bfbc894a8d47", "name": "/var/lib/dpkg/info/ca-certificates.list", "type": "file" }, { - "bom-ref": "a7b945b8b362fa25", + "bom-ref": "f68f3d7e51dab161", "name": "/var/lib/dpkg/info/ca-certificates.md5sums", "type": "file" }, { - "bom-ref": "86f7846763c7b1e0", + "bom-ref": "5eca4a371a0bb398", "name": "/var/lib/dpkg/info/ca-certificates.postinst", "type": "file" }, { - "bom-ref": "6b987d3c26333341", + "bom-ref": "88529ad280b6d6c1", "name": "/var/lib/dpkg/info/ca-certificates.postrm", "type": "file" }, { - "bom-ref": "f68ce8481d848f99", + "bom-ref": "f531c4307b2cd161", "name": "/var/lib/dpkg/info/ca-certificates.templates", "type": "file" }, { - "bom-ref": "a15cbf6c5af22f48", + "bom-ref": "5f3299b86271566c", "name": "/var/lib/dpkg/info/ca-certificates.triggers", "type": "file" }, { - "bom-ref": "40abe4a187328063", + "bom-ref": "6b27226ea3616441", "name": "/var/lib/dpkg/info/ccache.list", "type": "file" }, { - "bom-ref": "4af0de9c4e292f1d", + "bom-ref": "b521e63be5493f5f", "name": "/var/lib/dpkg/info/ccache.md5sums", "type": "file" }, { - "bom-ref": "6ed57c690c03a615", + "bom-ref": "3db0574c13a995df", "name": "/var/lib/dpkg/info/ccache.postinst", "type": "file" }, { - "bom-ref": "d44388f87f7064d0", + "bom-ref": "732f7f17e01348fa", "name": "/var/lib/dpkg/info/ccache.prerm", "type": "file" }, { - "bom-ref": "c6c2fcfb5ba9a9cf", + "bom-ref": "f4304ce2cb7e4171", "name": "/var/lib/dpkg/info/ccache.triggers", "type": "file" }, { - "bom-ref": "030ce5db7a179534", + "bom-ref": "4ec4024d07d32831", + "name": "/var/lib/dpkg/info/cccl-13-4.list", + "type": "file" + }, + { + "bom-ref": "c4a13e8f1ab45d14", + "name": "/var/lib/dpkg/info/cccl-13-4.md5sums", + "type": "file" + }, + { + "bom-ref": "779572bc593b481a", "name": "/var/lib/dpkg/info/clang-18.list", "type": "file" }, { - "bom-ref": "a4d5f06584975f5f", + "bom-ref": "e7bc830b6aa870b9", "name": "/var/lib/dpkg/info/clang-18.md5sums", "type": "file" }, { - "bom-ref": "9961ac8624448086", + "bom-ref": "bfc82d51bfb26264", "name": "/var/lib/dpkg/info/clang.list", "type": "file" }, { - "bom-ref": "5a41552c3f8187b0", + "bom-ref": "44ae1caf5aa90f52", "name": "/var/lib/dpkg/info/clang.md5sums", "type": "file" }, { - "bom-ref": "1b3b9d138b39acf6", + "bom-ref": "ace4eabada0cb3d4", "name": "/var/lib/dpkg/info/clang.postinst", "type": "file" }, { - "bom-ref": "dd4ce122533b7dcb", + "bom-ref": "3aaf3ca695953b21", "name": "/var/lib/dpkg/info/clang.prerm", "type": "file" }, { - "bom-ref": "076eed3df6a3769c", + "bom-ref": "22a2e550a116f876", "name": "/var/lib/dpkg/info/comerr-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "7d481734245150e0", + "bom-ref": "44c98c65ef546312", "name": "/var/lib/dpkg/info/coreutils.list", "type": "file" }, { - "bom-ref": "6d8a1b5b971eaff0", + "bom-ref": "f6883a27ba6c9e96", "name": "/var/lib/dpkg/info/coreutils.md5sums", "type": "file" }, { - "bom-ref": "cc2250a002f5f9df", + "bom-ref": "28a1a028575c93da", "name": "/var/lib/dpkg/info/cpp-13-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "9746509b68c8b1a2", + "bom-ref": "06550a398b81d7f7", "name": "/var/lib/dpkg/info/cpp-13-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "a49f776943f07c0d", + "bom-ref": "74f4fcd708b4da18", "name": "/var/lib/dpkg/info/cpp-13.list", "type": "file" }, { - "bom-ref": "3827ece9aab0f98b", + "bom-ref": "544f7b94a44b0b42", "name": "/var/lib/dpkg/info/cpp-13.md5sums", "type": "file" }, { - "bom-ref": "22012ea83a22f6d7", + "bom-ref": "b19fcc3411dd2cae", "name": "/var/lib/dpkg/info/cpp-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "6d40eefdf50d1158", + "bom-ref": "a56e0a902b118ea1", "name": "/var/lib/dpkg/info/cpp-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "4a1efc5504342b3f", + "bom-ref": "1a71728d12f636e6", "name": "/var/lib/dpkg/info/cpp.list", "type": "file" }, { - "bom-ref": "4cd624325ad91ab8", + "bom-ref": "bd571d5a0a116a05", "name": "/var/lib/dpkg/info/cpp.md5sums", "type": "file" }, { - "bom-ref": "7587c3a17bb4187f", + "bom-ref": "592e8929651ce516", "name": "/var/lib/dpkg/info/cpp.postinst", "type": "file" }, { - "bom-ref": "05c6b47ab72de2d0", + "bom-ref": "3a263108a817310d", "name": "/var/lib/dpkg/info/cpp.postrm", "type": "file" }, { - "bom-ref": "58662dae5ee2787d", + "bom-ref": "01f75c3bdb5271f8", "name": "/var/lib/dpkg/info/cpp.preinst", "type": "file" }, { - "bom-ref": "93c84477b4495ced", + "bom-ref": "855486ce1e1bfcd8", "name": "/var/lib/dpkg/info/cpp.prerm", "type": "file" }, { - "bom-ref": "35efb2bb68f94631", - "name": "/var/lib/dpkg/info/cuda-cccl-13-2.list", + "bom-ref": "11ca18163ba28401", + "name": "/var/lib/dpkg/info/cublasmp-cuda-13.list", "type": "file" }, { - "bom-ref": "2fe4c8b87ef38e27", - "name": "/var/lib/dpkg/info/cuda-cccl-13-2.md5sums", + "bom-ref": "cf28aebb4934f046", + "name": "/var/lib/dpkg/info/cublasmp-cuda-13.md5sums", "type": "file" }, { - "bom-ref": "004593e84486c73c", - "name": "/var/lib/dpkg/info/cuda-compat-13-2.list", + "bom-ref": "0fb27993beadf25b", + "name": "/var/lib/dpkg/info/cublasmp-cuda-13.postinst", "type": "file" }, { - "bom-ref": "2b1f021c73bc4905", - "name": "/var/lib/dpkg/info/cuda-compat-13-2.md5sums", + "bom-ref": "f5c4bf202b9fc207", + "name": "/var/lib/dpkg/info/cublasmp-cuda-13.prerm", "type": "file" }, { - "bom-ref": "4c7bdd4495eb51d4", - "name": "/var/lib/dpkg/info/cuda-compat-13-2.shlibs", + "bom-ref": "8dc2a5936256d6e8", + "name": "/var/lib/dpkg/info/cuda-compat-13-4.list", "type": "file" }, { - "bom-ref": "77a7375dac04bcfd", - "name": "/var/lib/dpkg/info/cuda-compat-13-2.triggers", + "bom-ref": "46f015833d5ef40c", + "name": "/var/lib/dpkg/info/cuda-compat-13-4.md5sums", "type": "file" }, { - "bom-ref": "5d0811d71393b2ab", - "name": "/var/lib/dpkg/info/cuda-crt-13-2.list", + "bom-ref": "b8b1d44778143881", + "name": "/var/lib/dpkg/info/cuda-compat-13-4.shlibs", "type": "file" }, { - "bom-ref": "58bbe88e0ba8f160", - "name": "/var/lib/dpkg/info/cuda-crt-13-2.md5sums", + "bom-ref": "5514dfc64768083d", + "name": "/var/lib/dpkg/info/cuda-compat-13-4.triggers", "type": "file" }, { - "bom-ref": "e5ada5504bb515a0", - "name": "/var/lib/dpkg/info/cuda-cudart-13-2.list", + "bom-ref": "d607d0a4bf014b5f", + "name": "/var/lib/dpkg/info/cuda-crt-13-4.list", "type": "file" }, { - "bom-ref": "0e1aafa00105714a", - "name": "/var/lib/dpkg/info/cuda-cudart-13-2.md5sums", + "bom-ref": "cb8d32f2cb7ab2d0", + "name": "/var/lib/dpkg/info/cuda-crt-13-4.md5sums", "type": "file" }, { - "bom-ref": "81be7509dc93786a", - "name": "/var/lib/dpkg/info/cuda-cudart-dev-13-2.list", + "bom-ref": "4d56f2663d5fbded", + "name": "/var/lib/dpkg/info/cuda-cudart-13-4.list", "type": "file" }, { - "bom-ref": "45c149612656d431", - "name": "/var/lib/dpkg/info/cuda-cudart-dev-13-2.md5sums", + "bom-ref": "5c6d56717f1424a1", + "name": "/var/lib/dpkg/info/cuda-cudart-13-4.md5sums", "type": "file" }, { - "bom-ref": "00d0cc8df0cbc127", - "name": "/var/lib/dpkg/info/cuda-culibos-13-2.list", + "bom-ref": "a2192e16d58912ef", + "name": "/var/lib/dpkg/info/cuda-cudart-dev-13-4.list", "type": "file" }, { - "bom-ref": "1754359789dfb1ed", - "name": "/var/lib/dpkg/info/cuda-culibos-13-2.md5sums", + "bom-ref": "c0d22dbf2863d917", + "name": "/var/lib/dpkg/info/cuda-cudart-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "179a6f6193dda19a", - "name": "/var/lib/dpkg/info/cuda-culibos-dev-13-2.list", + "bom-ref": "d1b39c6a755016fb", + "name": "/var/lib/dpkg/info/cuda-culibos-dev-13-4.list", "type": "file" }, { - "bom-ref": "6681f243364adb3f", - "name": "/var/lib/dpkg/info/cuda-culibos-dev-13-2.md5sums", + "bom-ref": "0af9b9de515fd0ae", + "name": "/var/lib/dpkg/info/cuda-culibos-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "9c708e97982afff8", - "name": "/var/lib/dpkg/info/cuda-cuobjdump-13-2.list", + "bom-ref": "5850c29378c048ad", + "name": "/var/lib/dpkg/info/cuda-cuobjdump-13-4.list", "type": "file" }, { - "bom-ref": "2a489698aabde631", - "name": "/var/lib/dpkg/info/cuda-cuobjdump-13-2.md5sums", + "bom-ref": "4a4f896840ddd1d1", + "name": "/var/lib/dpkg/info/cuda-cuobjdump-13-4.md5sums", "type": "file" }, { - "bom-ref": "36800dde6be7029b", - "name": "/var/lib/dpkg/info/cuda-cupti-13-2.list", + "bom-ref": "f76c6ddba0cf4a41", + "name": "/var/lib/dpkg/info/cuda-cupti-13-4.list", "type": "file" }, { - "bom-ref": "0bdc5bba74a4b6f6", - "name": "/var/lib/dpkg/info/cuda-cupti-13-2.md5sums", + "bom-ref": "4dcb841efb0183c1", + "name": "/var/lib/dpkg/info/cuda-cupti-13-4.md5sums", "type": "file" }, { - "bom-ref": "65f6aa01c1d03bec", - "name": "/var/lib/dpkg/info/cuda-cupti-dev-13-2.list", + "bom-ref": "fda975a462d1d9ef", + "name": "/var/lib/dpkg/info/cuda-cupti-dev-13-4.list", "type": "file" }, { - "bom-ref": "7115c8904f5e9b8e", - "name": "/var/lib/dpkg/info/cuda-cupti-dev-13-2.md5sums", + "bom-ref": "b0a008b8f98799f0", + "name": "/var/lib/dpkg/info/cuda-cupti-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "b45eabaaeaae3451", - "name": "/var/lib/dpkg/info/cuda-driver-dev-13-2.list", + "bom-ref": "b83fa7d866b367ae", + "name": "/var/lib/dpkg/info/cuda-driver-dev-13-4.list", "type": "file" }, { - "bom-ref": "dae6dc64a5662ebc", - "name": "/var/lib/dpkg/info/cuda-driver-dev-13-2.md5sums", + "bom-ref": "bbc3145995d179a4", + "name": "/var/lib/dpkg/info/cuda-driver-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "2ebdb82f3bdc5538", - "name": "/var/lib/dpkg/info/cuda-gdb-13-2.list", + "bom-ref": "da85679f0ac6c8f7", + "name": "/var/lib/dpkg/info/cuda-gdb-13-4.list", "type": "file" }, { - "bom-ref": "a19cc330cb57ceba", - "name": "/var/lib/dpkg/info/cuda-gdb-13-2.md5sums", + "bom-ref": "19a2868b4ce66f32", + "name": "/var/lib/dpkg/info/cuda-gdb-13-4.md5sums", "type": "file" }, { - "bom-ref": "86c5ce4d901d29c3", + "bom-ref": "6ab450aeee184691", "name": "/var/lib/dpkg/info/cuda-keyring.conffiles", "type": "file" }, { - "bom-ref": "731e06b09df155dc", + "bom-ref": "3a0cb141ab8deace", "name": "/var/lib/dpkg/info/cuda-keyring.list", "type": "file" }, { - "bom-ref": "016f92376241de1b", + "bom-ref": "172912e07c091575", "name": "/var/lib/dpkg/info/cuda-keyring.md5sums", "type": "file" }, { - "bom-ref": "82b9d034db34e22c", + "bom-ref": "414c8a9df38124f2", "name": "/var/lib/dpkg/info/cuda-keyring.postinst", "type": "file" }, { - "bom-ref": "4b61ce9c5035f2c5", - "name": "/var/lib/dpkg/info/cuda-nvcc-13-2.list", + "bom-ref": "9b8a35066b929d56", + "name": "/var/lib/dpkg/info/cuda-nvcc-13-4.list", "type": "file" }, { - "bom-ref": "3ed149630f711ebc", - "name": "/var/lib/dpkg/info/cuda-nvcc-13-2.md5sums", + "bom-ref": "2a137fd0533bbcf8", + "name": "/var/lib/dpkg/info/cuda-nvcc-13-4.md5sums", "type": "file" }, { - "bom-ref": "8bfc06bb5a1d4b3e", - "name": "/var/lib/dpkg/info/cuda-nvdisasm-13-2.list", + "bom-ref": "90244ac4e25d8660", + "name": "/var/lib/dpkg/info/cuda-nvdisasm-13-4.list", "type": "file" }, { - "bom-ref": "a147a6b62c7dd88e", - "name": "/var/lib/dpkg/info/cuda-nvdisasm-13-2.md5sums", + "bom-ref": "568e1d17972a8f7d", + "name": "/var/lib/dpkg/info/cuda-nvdisasm-13-4.md5sums", "type": "file" }, { - "bom-ref": "ddecf4da279d46b0", - "name": "/var/lib/dpkg/info/cuda-nvml-dev-13-2.list", + "bom-ref": "1923c40b42192497", + "name": "/var/lib/dpkg/info/cuda-nvml-dev-13-4.list", "type": "file" }, { - "bom-ref": "fbc9f1c1e2a5e906", - "name": "/var/lib/dpkg/info/cuda-nvml-dev-13-2.md5sums", + "bom-ref": "f489b17d082eef0d", + "name": "/var/lib/dpkg/info/cuda-nvml-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "e3539773ff5cf8b4", - "name": "/var/lib/dpkg/info/cuda-nvprune-13-2.list", + "bom-ref": "20be4748c8b5c014", + "name": "/var/lib/dpkg/info/cuda-nvprune-13-4.list", "type": "file" }, { - "bom-ref": "1d02bb439e9cb31f", - "name": "/var/lib/dpkg/info/cuda-nvprune-13-2.md5sums", + "bom-ref": "7e4fee63b2f41018", + "name": "/var/lib/dpkg/info/cuda-nvprune-13-4.md5sums", "type": "file" }, { - "bom-ref": "5948ce7b8153d97c", - "name": "/var/lib/dpkg/info/cuda-nvrtc-13-2.list", + "bom-ref": "b047012a2c450337", + "name": "/var/lib/dpkg/info/cuda-nvrtc-13-4.list", "type": "file" }, { - "bom-ref": "0b2d67d8d23e09c8", - "name": "/var/lib/dpkg/info/cuda-nvrtc-13-2.md5sums", + "bom-ref": "e5d223d1c8deb0c4", + "name": "/var/lib/dpkg/info/cuda-nvrtc-13-4.md5sums", "type": "file" }, { - "bom-ref": "1df895fa7898154a", - "name": "/var/lib/dpkg/info/cuda-nvrtc-dev-13-2.list", + "bom-ref": "5bc169ed526f9a67", + "name": "/var/lib/dpkg/info/cuda-nvrtc-dev-13-4.list", "type": "file" }, { - "bom-ref": "c30ee0b9a549e90c", - "name": "/var/lib/dpkg/info/cuda-nvrtc-dev-13-2.md5sums", + "bom-ref": "7dc5269cc04f99dc", + "name": "/var/lib/dpkg/info/cuda-nvrtc-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "30c0cde38b90d624", - "name": "/var/lib/dpkg/info/cuda-nvtx-13-2.list", + "bom-ref": "535aeda52424c52d", + "name": "/var/lib/dpkg/info/cuda-nvtx-13-4.list", "type": "file" }, { - "bom-ref": "804c22f11639e8e8", - "name": "/var/lib/dpkg/info/cuda-nvtx-13-2.md5sums", + "bom-ref": "d7d2548f81e05284", + "name": "/var/lib/dpkg/info/cuda-nvtx-13-4.md5sums", "type": "file" }, { - "bom-ref": "186cc3131014229f", - "name": "/var/lib/dpkg/info/cuda-profiler-api-13-2.list", + "bom-ref": "483e9092abcf02cb", + "name": "/var/lib/dpkg/info/cuda-profiler-api-13-4.list", "type": "file" }, { - "bom-ref": "b16d03cb51fc2cf2", - "name": "/var/lib/dpkg/info/cuda-profiler-api-13-2.md5sums", + "bom-ref": "1979b76de3145378", + "name": "/var/lib/dpkg/info/cuda-profiler-api-13-4.md5sums", "type": "file" }, { - "bom-ref": "873a35f0498d7e26", - "name": "/var/lib/dpkg/info/cuda-sanitizer-13-2.list", + "bom-ref": "81564fb206537845", + "name": "/var/lib/dpkg/info/cuda-sanitizer-13-4.list", "type": "file" }, { - "bom-ref": "b25386d36bd55d1a", - "name": "/var/lib/dpkg/info/cuda-sanitizer-13-2.md5sums", + "bom-ref": "bbe9da7f5e6082a3", + "name": "/var/lib/dpkg/info/cuda-sanitizer-13-4.md5sums", "type": "file" }, { - "bom-ref": "a661951522e0a01a", - "name": "/var/lib/dpkg/info/cuda-tileiras-13-2.list", + "bom-ref": "cc36584fdfd37ca7", + "name": "/var/lib/dpkg/info/cuda-tileiras-13-4.list", "type": "file" }, { - "bom-ref": "f13185b6cce0a764", - "name": "/var/lib/dpkg/info/cuda-tileiras-13-2.md5sums", + "bom-ref": "cbe8563647ed99db", + "name": "/var/lib/dpkg/info/cuda-tileiras-13-4.md5sums", "type": "file" }, { - "bom-ref": "14562af1194cc3c4", - "name": "/var/lib/dpkg/info/cuda-toolkit-13-2-config-common.list", + "bom-ref": "f4ad82332f6d86f2", + "name": "/var/lib/dpkg/info/cuda-toolkit-13-4-config-common.list", "type": "file" }, { - "bom-ref": "9e323b4011fa2c21", - "name": "/var/lib/dpkg/info/cuda-toolkit-13-2-config-common.md5sums", + "bom-ref": "c1e3b9ffe70c0e77", + "name": "/var/lib/dpkg/info/cuda-toolkit-13-4-config-common.md5sums", "type": "file" }, { - "bom-ref": "b840cf815d055fa8", - "name": "/var/lib/dpkg/info/cuda-toolkit-13-2-config-common.postinst", + "bom-ref": "6f0fde89a1d5721e", + "name": "/var/lib/dpkg/info/cuda-toolkit-13-4-config-common.postinst", "type": "file" }, { - "bom-ref": "286b759d388b39d1", - "name": "/var/lib/dpkg/info/cuda-toolkit-13-2-config-common.postrm", + "bom-ref": "c531b2f09ddc5d2e", + "name": "/var/lib/dpkg/info/cuda-toolkit-13-4-config-common.postrm", "type": "file" }, { - "bom-ref": "99138e923b55bbb4", + "bom-ref": "aa3ee6d894b253d5", "name": "/var/lib/dpkg/info/cuda-toolkit-13-config-common.conffiles", "type": "file" }, { - "bom-ref": "18e49bc55a43e209", + "bom-ref": "be37163eb314b690", "name": "/var/lib/dpkg/info/cuda-toolkit-13-config-common.list", "type": "file" }, { - "bom-ref": "c494d2c88c5c1eb3", + "bom-ref": "976297b9c8a8b00e", "name": "/var/lib/dpkg/info/cuda-toolkit-13-config-common.md5sums", "type": "file" }, { - "bom-ref": "93661ead6d84c711", + "bom-ref": "250c8d24f2241768", "name": "/var/lib/dpkg/info/cuda-toolkit-13-config-common.postinst", "type": "file" }, { - "bom-ref": "eb59a00a34465ce5", + "bom-ref": "6573bd60ba381264", "name": "/var/lib/dpkg/info/cuda-toolkit-13-config-common.postrm", "type": "file" }, { - "bom-ref": "4c31ec7cde244edf", + "bom-ref": "73a69dac890ba86a", "name": "/var/lib/dpkg/info/cuda-toolkit-config-common.conffiles", "type": "file" }, { - "bom-ref": "513b4cb4dd7908dd", + "bom-ref": "30a131fa7d0fc87c", "name": "/var/lib/dpkg/info/cuda-toolkit-config-common.list", "type": "file" }, { - "bom-ref": "57377abfcacdce36", + "bom-ref": "7be75f7b2691c387", "name": "/var/lib/dpkg/info/cuda-toolkit-config-common.md5sums", "type": "file" }, { - "bom-ref": "73082cd2abc19bf0", + "bom-ref": "29ed538f810bb511", "name": "/var/lib/dpkg/info/cuda-toolkit-config-common.postinst", "type": "file" }, { - "bom-ref": "5bea7a90571626e2", + "bom-ref": "de3b7c210973206b", "name": "/var/lib/dpkg/info/cuda-toolkit-config-common.postrm", "type": "file" }, { - "bom-ref": "4e84684fab81b393", + "bom-ref": "a09678a0b2228d3d", "name": "/var/lib/dpkg/info/curl.list", "type": "file" }, { - "bom-ref": "bede29002448b447", + "bom-ref": "ffaee283785a5e39", "name": "/var/lib/dpkg/info/curl.md5sums", "type": "file" }, { - "bom-ref": "5138ea1f050bcf1c", + "bom-ref": "179a99d65b29c142", "name": "/var/lib/dpkg/info/dash.list", "type": "file" }, { - "bom-ref": "3f09d0030c15fe24", + "bom-ref": "83e9dceaf450f2a2", "name": "/var/lib/dpkg/info/dash.md5sums", "type": "file" }, { - "bom-ref": "7d9ec541a3289c52", + "bom-ref": "574cf9c4ff4d6528", "name": "/var/lib/dpkg/info/dash.postinst", "type": "file" }, { - "bom-ref": "61580c606e07b25b", + "bom-ref": "1ab7749550c8a745", "name": "/var/lib/dpkg/info/dash.postrm", "type": "file" }, { - "bom-ref": "f179d878bfd15110", + "bom-ref": "bc6c07f34021f066", "name": "/var/lib/dpkg/info/dash.prerm", "type": "file" }, { - "bom-ref": "95ca039b875bf348", + "bom-ref": "cd79182f0780dc2a", "name": "/var/lib/dpkg/info/debconf.conffiles", "type": "file" }, { - "bom-ref": "5313229f691a6908", + "bom-ref": "e982998c88a41306", "name": "/var/lib/dpkg/info/debconf.config", "type": "file" }, { - "bom-ref": "90296a1f6884125d", + "bom-ref": "5c07b4d037abc2c7", "name": "/var/lib/dpkg/info/debconf.list", "type": "file" }, { - "bom-ref": "7b34aeaa88a7134a", + "bom-ref": "b4f8ed1cfe63aebc", "name": "/var/lib/dpkg/info/debconf.md5sums", "type": "file" }, { - "bom-ref": "4575e2c3b6f5281e", + "bom-ref": "ec2298121ecdcb30", "name": "/var/lib/dpkg/info/debconf.postinst", "type": "file" }, { - "bom-ref": "9f43c4ef4e29c339", + "bom-ref": "c48e304a429963a3", "name": "/var/lib/dpkg/info/debconf.templates", "type": "file" }, { - "bom-ref": "f4c173710e5fb746", + "bom-ref": "7f6f0145a502db3c", "name": "/var/lib/dpkg/info/debianutils.list", "type": "file" }, { - "bom-ref": "4d02d034b2ba3952", + "bom-ref": "ec637540e02d1254", "name": "/var/lib/dpkg/info/debianutils.md5sums", "type": "file" }, { - "bom-ref": "4071ec20e67215d9", + "bom-ref": "0950eb6f30500f3b", "name": "/var/lib/dpkg/info/debianutils.postinst", "type": "file" }, { - "bom-ref": "f00c3705a3007bca", + "bom-ref": "f5ec21dee4249528", "name": "/var/lib/dpkg/info/debianutils.postrm", "type": "file" }, { - "bom-ref": "031f258b857e06ab", + "bom-ref": "c91e6077eecd7999", "name": "/var/lib/dpkg/info/debianutils.prerm", "type": "file" }, { - "bom-ref": "bdabbc5df9441c3a", + "bom-ref": "b883fb0a58c6476c", "name": "/var/lib/dpkg/info/debianutils.triggers", "type": "file" }, { - "bom-ref": "26ff9e443b0e091c", + "bom-ref": "e945ed58e9921bfa", "name": "/var/lib/dpkg/info/diffutils.list", "type": "file" }, { - "bom-ref": "ffc2897a490522ef", + "bom-ref": "9291b3c79ddf0c7d", "name": "/var/lib/dpkg/info/diffutils.md5sums", "type": "file" }, { - "bom-ref": "161e1470ebe867e7", + "bom-ref": "87648592a018f428", "name": "/var/lib/dpkg/info/dirmngr.list", "type": "file" }, { - "bom-ref": "788e6fdc9a35ce8d", + "bom-ref": "da1749bee2134662", "name": "/var/lib/dpkg/info/dirmngr.md5sums", "type": "file" }, { - "bom-ref": "aee9942c405c05e0", + "bom-ref": "0ad40b1a5910799f", "name": "/var/lib/dpkg/info/dirmngr.postinst", "type": "file" }, { - "bom-ref": "9c94487c8d55b24f", + "bom-ref": "c1668ac7caa2abb8", "name": "/var/lib/dpkg/info/dirmngr.postrm", "type": "file" }, { - "bom-ref": "ed8fd86d417caf49", + "bom-ref": "faf9885c1a557de6", "name": "/var/lib/dpkg/info/dirmngr.preinst", "type": "file" }, { - "bom-ref": "ee0da98a6a378af4", + "bom-ref": "cb3522c0fe3adc3b", "name": "/var/lib/dpkg/info/dirmngr.prerm", "type": "file" }, { - "bom-ref": "48e355700e5b3873", + "bom-ref": "e8e84c8b03f653ee", "name": "/var/lib/dpkg/info/dpkg-dev.conffiles", "type": "file" }, { - "bom-ref": "df514d85f25ba7ed", + "bom-ref": "f599d0ec4f9b7a24", "name": "/var/lib/dpkg/info/dpkg-dev.list", "type": "file" }, { - "bom-ref": "6f947a3fec810208", + "bom-ref": "c72d26b2fd838145", "name": "/var/lib/dpkg/info/dpkg-dev.md5sums", "type": "file" }, { - "bom-ref": "cee3095c02db2d1f", + "bom-ref": "11ff2548d89f8594", "name": "/var/lib/dpkg/info/dpkg.conffiles", "type": "file" }, { - "bom-ref": "f7a324209c15c92c", + "bom-ref": "dc3d5171a78fd1a7", "name": "/var/lib/dpkg/info/dpkg.list", "type": "file" }, { - "bom-ref": "dc82139b287b5da2", + "bom-ref": "2af7234f7f7e8619", "name": "/var/lib/dpkg/info/dpkg.md5sums", "type": "file" }, { - "bom-ref": "6ca72eccf19be6d5", + "bom-ref": "a6e56b7a06a88d96", "name": "/var/lib/dpkg/info/dpkg.postinst", "type": "file" }, { - "bom-ref": "a4c51e700033f8d0", + "bom-ref": "3aa9e4b40875bfb7", "name": "/var/lib/dpkg/info/dpkg.postrm", "type": "file" }, { - "bom-ref": "78b85737ed6745b3", + "bom-ref": "e3099249223aa695", "name": "/var/lib/dpkg/info/e2fsprogs.conffiles", "type": "file" }, { - "bom-ref": "2b9d273edeeafd82", + "bom-ref": "f060a0c31c8eb230", "name": "/var/lib/dpkg/info/e2fsprogs.list", "type": "file" }, { - "bom-ref": "8d45280b2f6643d6", + "bom-ref": "855289b0fdeec724", "name": "/var/lib/dpkg/info/e2fsprogs.md5sums", "type": "file" }, { - "bom-ref": "cc8eae5c4945bacf", + "bom-ref": "3ab0f7f537f96e75", "name": "/var/lib/dpkg/info/e2fsprogs.postinst", "type": "file" }, { - "bom-ref": "e90969112c125aa2", + "bom-ref": "91321fae16bfba10", "name": "/var/lib/dpkg/info/e2fsprogs.postrm", "type": "file" }, { - "bom-ref": "38e1b13442b6c15a", + "bom-ref": "c99f3fd1d315c438", "name": "/var/lib/dpkg/info/e2fsprogs.preinst", "type": "file" }, { - "bom-ref": "be7adecfe859a4fd", + "bom-ref": "993dbb0604a70213", "name": "/var/lib/dpkg/info/e2fsprogs.prerm", "type": "file" }, { - "bom-ref": "3eeb122fd76ecc60", + "bom-ref": "fd4a3eeda75b92c2", "name": "/var/lib/dpkg/info/file.list", "type": "file" }, { - "bom-ref": "6c0d9dbb9d354c43", + "bom-ref": "ea3028ba675cde3d", "name": "/var/lib/dpkg/info/file.md5sums", "type": "file" }, { - "bom-ref": "f101aaf47d9132c7", + "bom-ref": "ac137c3c42f6c5dd", "name": "/var/lib/dpkg/info/findutils.list", "type": "file" }, { - "bom-ref": "5027e0cb0c49757f", + "bom-ref": "3d50b75dc43c882d", "name": "/var/lib/dpkg/info/findutils.md5sums", "type": "file" }, { - "bom-ref": "50ff4d4fa13428df", + "bom-ref": "87cc7a5e4d815b6d", "name": "/var/lib/dpkg/info/fontconfig-config.conffiles", "type": "file" }, { - "bom-ref": "454df735234062f6", + "bom-ref": "2e0f0643f4efe3c0", "name": "/var/lib/dpkg/info/fontconfig-config.list", "type": "file" }, { - "bom-ref": "2e62c07d74cecab5", + "bom-ref": "41e8c8883aaf90b7", "name": "/var/lib/dpkg/info/fontconfig-config.md5sums", "type": "file" }, { - "bom-ref": "d89e64590d13eeb1", + "bom-ref": "cfafe4be4698c1bf", "name": "/var/lib/dpkg/info/fontconfig-config.postinst", "type": "file" }, { - "bom-ref": "2b09a0d453b107cc", + "bom-ref": "36ee907ea1eb48ba", "name": "/var/lib/dpkg/info/fontconfig-config.postrm", "type": "file" }, { - "bom-ref": "50997ba0c434d5bb", + "bom-ref": "6c0679c6170c1369", "name": "/var/lib/dpkg/info/fontconfig-config.preinst", "type": "file" }, { - "bom-ref": "feb8ca76fb576b4b", + "bom-ref": "139881fe646987c5", "name": "/var/lib/dpkg/info/fontconfig-config.prerm", "type": "file" }, { - "bom-ref": "ec5f410f4be516ef", + "bom-ref": "4c8951fe2b03a5c5", "name": "/var/lib/dpkg/info/fontconfig.list", "type": "file" }, { - "bom-ref": "c8b0cee06acbec54", + "bom-ref": "05e78ee63369219a", "name": "/var/lib/dpkg/info/fontconfig.md5sums", "type": "file" }, { - "bom-ref": "683415c9f2d86a3d", + "bom-ref": "668f7be11d07ea33", "name": "/var/lib/dpkg/info/fontconfig.postinst", "type": "file" }, { - "bom-ref": "511e748dd1139f29", + "bom-ref": "447f0cd003e99057", "name": "/var/lib/dpkg/info/fontconfig.postrm", "type": "file" }, { - "bom-ref": "2c96836049498922", + "bom-ref": "5afc64793096dbcc", "name": "/var/lib/dpkg/info/fontconfig.triggers", "type": "file" }, { - "bom-ref": "bf674c363c1dda50", + "bom-ref": "ea8469c482f50162", "name": "/var/lib/dpkg/info/fonts-dejavu-core.conffiles", "type": "file" }, { - "bom-ref": "4d6539f4de86a444", + "bom-ref": "1dcc7d7d79c26342", "name": "/var/lib/dpkg/info/fonts-dejavu-core.list", "type": "file" }, { - "bom-ref": "1cba5d41f235b86b", + "bom-ref": "58733281e6165bfd", "name": "/var/lib/dpkg/info/fonts-dejavu-core.md5sums", "type": "file" }, { - "bom-ref": "1872fde18db01e5b", + "bom-ref": "899b57d300ec09fd", "name": "/var/lib/dpkg/info/fonts-dejavu-core.postinst", "type": "file" }, { - "bom-ref": "9e3cb1f907b7f534", + "bom-ref": "c751d18e6313ee6a", "name": "/var/lib/dpkg/info/fonts-dejavu-core.postrm", "type": "file" }, { - "bom-ref": "98b66e6c2139f7d7", + "bom-ref": "b9ee9e725cddb5f1", "name": "/var/lib/dpkg/info/fonts-dejavu-core.preinst", "type": "file" }, { - "bom-ref": "4cce76ac1ca983e1", + "bom-ref": "ccef3e6296a95fe3", "name": "/var/lib/dpkg/info/fonts-dejavu-core.prerm", "type": "file" }, { - "bom-ref": "c9cdd6fc2e832032", + "bom-ref": "e6df98c29b641540", "name": "/var/lib/dpkg/info/fonts-dejavu-mono.conffiles", "type": "file" }, { - "bom-ref": "bfbf0b38d6cf47fb", + "bom-ref": "6e717edad929e019", "name": "/var/lib/dpkg/info/fonts-dejavu-mono.list", "type": "file" }, { - "bom-ref": "4423a7c2c911dc2a", + "bom-ref": "74b2f03f7b08f6b8", "name": "/var/lib/dpkg/info/fonts-dejavu-mono.md5sums", "type": "file" }, { - "bom-ref": "3d8c85b5c0d431e0", + "bom-ref": "c1fc3f1608ced531", "name": "/var/lib/dpkg/info/g++-13-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "2abed0a79bfa3f36", + "bom-ref": "1ddd1f366b890d0f", "name": "/var/lib/dpkg/info/g++-13-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "710909444033fd21", + "bom-ref": "b59a1dbe73e98b4c", "name": "/var/lib/dpkg/info/g++-13.list", "type": "file" }, { - "bom-ref": "a3d61d5095261317", + "bom-ref": "b3f1266cea9edbe6", "name": "/var/lib/dpkg/info/g++-13.md5sums", "type": "file" }, { - "bom-ref": "70478257dd6d7270", + "bom-ref": "04a97c7aa0a74cb5", "name": "/var/lib/dpkg/info/g++-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "0cbf3d2386b8417f", + "bom-ref": "0360071ab0c53e46", "name": "/var/lib/dpkg/info/g++-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "8e8009591ab21cfc", + "bom-ref": "3aaf6e778d462755", "name": "/var/lib/dpkg/info/g++.list", "type": "file" }, { - "bom-ref": "e62d3641ad9f7aab", + "bom-ref": "bf329c34b49df002", "name": "/var/lib/dpkg/info/g++.md5sums", "type": "file" }, { - "bom-ref": "c47ff2d86c1acf8f", + "bom-ref": "5906e55f1565def6", "name": "/var/lib/dpkg/info/g++.postinst", "type": "file" }, { - "bom-ref": "ab7b0b8822445e3a", + "bom-ref": "3df82b69c1aaa507", "name": "/var/lib/dpkg/info/g++.prerm", "type": "file" }, { - "bom-ref": "773fcbbe3c85cef9", + "bom-ref": "ea0146443b167ec8", "name": "/var/lib/dpkg/info/gcc-13-base:amd64.md5sums", "type": "file" }, { - "bom-ref": "76031c52de30590c", + "bom-ref": "6fc38b36e5bb311d", "name": "/var/lib/dpkg/info/gcc-13-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "86d1ef87e58918ef", + "bom-ref": "cbacfd238e7973e2", "name": "/var/lib/dpkg/info/gcc-13-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "23c5651a31136b61", + "bom-ref": "b138508803a091e4", "name": "/var/lib/dpkg/info/gcc-13.list", "type": "file" }, { - "bom-ref": "0052ff25d1730f1e", + "bom-ref": "f826ac960d28ab93", "name": "/var/lib/dpkg/info/gcc-13.md5sums", "type": "file" }, { - "bom-ref": "d363bfd6abf8d88c", + "bom-ref": "6e7c39f155714f06", "name": "/var/lib/dpkg/info/gcc-14-base:amd64.md5sums", "type": "file" }, { - "bom-ref": "db272287e1c0bf6f", + "bom-ref": "18489bd061ca027e", "name": "/var/lib/dpkg/info/gcc-x86-64-linux-gnu.list", "type": "file" }, { - "bom-ref": "803874882112102e", + "bom-ref": "4aea8183676d51a3", "name": "/var/lib/dpkg/info/gcc-x86-64-linux-gnu.md5sums", "type": "file" }, { - "bom-ref": "a4745b71310dd4e2", + "bom-ref": "6dd54851c5331daf", "name": "/var/lib/dpkg/info/gcc.list", "type": "file" }, { - "bom-ref": "8415c0af9bfd6535", + "bom-ref": "50ffc085be6a3c20", "name": "/var/lib/dpkg/info/gcc.md5sums", "type": "file" }, { - "bom-ref": "648fcfd24970eae2", + "bom-ref": "2db7f70c535cb0c7", "name": "/var/lib/dpkg/info/gcc.postinst", "type": "file" }, { - "bom-ref": "429701de101e3d79", + "bom-ref": "79c6e6a5ff8ebaa8", "name": "/var/lib/dpkg/info/gcc.prerm", "type": "file" }, { - "bom-ref": "989d7d2ca6ca691c", + "bom-ref": "9d17e3cd7a29d95e", "name": "/var/lib/dpkg/info/gdb.conffiles", "type": "file" }, { - "bom-ref": "5330f711bbf8cc69", + "bom-ref": "bd6301357ff9f68f", "name": "/var/lib/dpkg/info/gdb.list", "type": "file" }, { - "bom-ref": "8aa8b23de189aa3d", + "bom-ref": "f1e8eb8050f7ccaf", "name": "/var/lib/dpkg/info/gdb.md5sums", "type": "file" }, { - "bom-ref": "0866bcaf3e90680a", + "bom-ref": "11a9edff760ed95c", "name": "/var/lib/dpkg/info/git-lfs.list", "type": "file" }, { - "bom-ref": "ea42ecfec89f3742", + "bom-ref": "be8a4cbe13afae78", "name": "/var/lib/dpkg/info/git-lfs.md5sums", "type": "file" }, { - "bom-ref": "1547a170808dded7", + "bom-ref": "f5e0761f9849e61d", "name": "/var/lib/dpkg/info/git-lfs.postinst", "type": "file" }, { - "bom-ref": "67e4930195ec9dfb", + "bom-ref": "793ae2bde0ee4509", "name": "/var/lib/dpkg/info/git-lfs.prerm", "type": "file" }, { - "bom-ref": "00d11deb735e63f0", + "bom-ref": "841c9b93d72a78dd", "name": "/var/lib/dpkg/info/git-man.list", "type": "file" }, { - "bom-ref": "e78ed93b656f8383", + "bom-ref": "53ae6d8ff6c7b6ba", "name": "/var/lib/dpkg/info/git-man.md5sums", "type": "file" }, { - "bom-ref": "b7811e64ce09316d", + "bom-ref": "7ee944f675ce0f70", "name": "/var/lib/dpkg/info/git.conffiles", "type": "file" }, { - "bom-ref": "3b6dc633e8815e57", + "bom-ref": "57ab087468e18376", "name": "/var/lib/dpkg/info/git.list", "type": "file" }, { - "bom-ref": "a114206cd109c57a", + "bom-ref": "050506d24ada5fc7", "name": "/var/lib/dpkg/info/git.md5sums", "type": "file" }, { - "bom-ref": "13583af13172c0e1", + "bom-ref": "72645c1d7dd94c14", "name": "/var/lib/dpkg/info/git.postinst", "type": "file" }, { - "bom-ref": "ffbedbbdef6630b9", + "bom-ref": "1873ab9db9f2e74c", "name": "/var/lib/dpkg/info/git.postrm", "type": "file" }, { - "bom-ref": "78ae304d941395a7", + "bom-ref": "2504a90cdce5b522", "name": "/var/lib/dpkg/info/git.preinst", "type": "file" }, { - "bom-ref": "d6c6bdf39b955922", + "bom-ref": "6d376f432cd4cd2b", "name": "/var/lib/dpkg/info/git.prerm", "type": "file" }, { - "bom-ref": "749b594c6cfc1718", + "bom-ref": "b321a649b079e11b", "name": "/var/lib/dpkg/info/gnupg-utils.list", "type": "file" }, { - "bom-ref": "6e1596dfb9cbf271", + "bom-ref": "42b167e16716b2a6", "name": "/var/lib/dpkg/info/gnupg-utils.md5sums", "type": "file" }, { - "bom-ref": "2a7093c8e78896b9", + "bom-ref": "35a7cdf2f874f8de", "name": "/var/lib/dpkg/info/gnupg.list", "type": "file" }, { - "bom-ref": "2e0d4d8f23fb06a3", + "bom-ref": "d463d6d368372b84", "name": "/var/lib/dpkg/info/gnupg.md5sums", "type": "file" }, { - "bom-ref": "78f35c740a9a63c8", + "bom-ref": "f44117bfd80c85b6", "name": "/var/lib/dpkg/info/gnupg2.list", "type": "file" }, { - "bom-ref": "c6158eeff7884708", + "bom-ref": "50ffce110b9fde1e", "name": "/var/lib/dpkg/info/gnupg2.md5sums", "type": "file" }, { - "bom-ref": "f271294298083941", + "bom-ref": "dc4a67f6fbeb517e", "name": "/var/lib/dpkg/info/gpg-agent.conffiles", "type": "file" }, { - "bom-ref": "45e0eec03bd26b5b", + "bom-ref": "6c054090a6414ca8", "name": "/var/lib/dpkg/info/gpg-agent.list", "type": "file" }, { - "bom-ref": "1d64e70a31979446", + "bom-ref": "ccfba074914ac1bd", "name": "/var/lib/dpkg/info/gpg-agent.md5sums", "type": "file" }, { - "bom-ref": "7e429252fc74bea1", + "bom-ref": "cc8719c05b99ff22", "name": "/var/lib/dpkg/info/gpg-agent.postinst", "type": "file" }, { - "bom-ref": "1bfe97dec7d365be", + "bom-ref": "861bdcdd0e47ca75", "name": "/var/lib/dpkg/info/gpg-agent.postrm", "type": "file" }, { - "bom-ref": "bdc7b44100e7a3bd", + "bom-ref": "05692ba12a4e48de", "name": "/var/lib/dpkg/info/gpg.list", "type": "file" }, { - "bom-ref": "6b23a3940800315c", + "bom-ref": "de094843503d8163", "name": "/var/lib/dpkg/info/gpg.md5sums", "type": "file" }, { - "bom-ref": "e7bce6d112ac9446", + "bom-ref": "e1f157f9d6d23525", "name": "/var/lib/dpkg/info/gpgconf.list", "type": "file" }, { - "bom-ref": "cfe4dd4029f94c83", + "bom-ref": "82ca827c9e667820", "name": "/var/lib/dpkg/info/gpgconf.md5sums", "type": "file" }, { - "bom-ref": "4d7e5900b6f93e57", + "bom-ref": "81012b161f50b548", "name": "/var/lib/dpkg/info/gpgsm.list", "type": "file" }, { - "bom-ref": "d52b9cc6167af7e4", + "bom-ref": "1566f0eafc2a9fd3", "name": "/var/lib/dpkg/info/gpgsm.md5sums", "type": "file" }, { - "bom-ref": "a0ab20c31a1f8e6c", + "bom-ref": "c29545adbcea2e8a", "name": "/var/lib/dpkg/info/gpgv.list", "type": "file" }, { - "bom-ref": "c55d29958468783c", + "bom-ref": "902ffa7d75f42a5a", "name": "/var/lib/dpkg/info/gpgv.md5sums", "type": "file" }, { - "bom-ref": "786c9676d0f093b9", + "bom-ref": "41f39acd974a9f6b", "name": "/var/lib/dpkg/info/graphviz.list", "type": "file" }, { - "bom-ref": "78438a00aa6a67b4", + "bom-ref": "1f7fbad627c11e0a", "name": "/var/lib/dpkg/info/graphviz.md5sums", "type": "file" }, { - "bom-ref": "97345559c66b2a9f", + "bom-ref": "2ca6b90e8b8d3485", "name": "/var/lib/dpkg/info/graphviz.postinst", "type": "file" }, { - "bom-ref": "58ee3ff30c22b7af", + "bom-ref": "a63764884b957f09", "name": "/var/lib/dpkg/info/graphviz.postrm", "type": "file" }, { - "bom-ref": "273d4b76afb224b2", + "bom-ref": "30a7825a7f6af478", "name": "/var/lib/dpkg/info/grep.list", "type": "file" }, { - "bom-ref": "4114c712907197dd", + "bom-ref": "bf1e683dd3f702df", "name": "/var/lib/dpkg/info/grep.md5sums", "type": "file" }, { - "bom-ref": "f932d1e973a6a41b", + "bom-ref": "c5afc438a276c425", "name": "/var/lib/dpkg/info/gzip.list", "type": "file" }, { - "bom-ref": "5c106d14553eb327", + "bom-ref": "61a98e5a9cd00319", "name": "/var/lib/dpkg/info/gzip.md5sums", "type": "file" }, { - "bom-ref": "b846045a7e4ff2a7", + "bom-ref": "3f70f5312197a219", "name": "/var/lib/dpkg/info/gzip.postinst", "type": "file" }, { - "bom-ref": "17515c90025f17c4", + "bom-ref": "f38340bf5fab1696", "name": "/var/lib/dpkg/info/gzip.preinst", "type": "file" }, { - "bom-ref": "8062e781904d7862", + "bom-ref": "271690a630107ec8", "name": "/var/lib/dpkg/info/hostname.list", "type": "file" }, { - "bom-ref": "abde010ec4d6bc6f", + "bom-ref": "6bfcdd31b7411245", "name": "/var/lib/dpkg/info/hostname.md5sums", "type": "file" }, { - "bom-ref": "4660435ac8da9fa3", + "bom-ref": "02eff6c6a28b7f64", "name": "/var/lib/dpkg/info/hwdata.list", "type": "file" }, { - "bom-ref": "2d416feccb18ca12", + "bom-ref": "feb17536bce21545", "name": "/var/lib/dpkg/info/hwdata.md5sums", "type": "file" }, { - "bom-ref": "884f4b8036b7c4fc", + "bom-ref": "d421374a8116128a", "name": "/var/lib/dpkg/info/ibverbs-providers:amd64.conffiles", "type": "file" }, { - "bom-ref": "e5eee04f77fae824", + "bom-ref": "4c4490810d924322", "name": "/var/lib/dpkg/info/ibverbs-providers:amd64.md5sums", "type": "file" }, { - "bom-ref": "4e0e2c2fa6160f71", + "bom-ref": "272223eee36c1ad7", "name": "/var/lib/dpkg/info/icu-devtools.list", "type": "file" }, { - "bom-ref": "2a9a178246da66cb", + "bom-ref": "55ba00d054e3eed1", "name": "/var/lib/dpkg/info/icu-devtools.md5sums", "type": "file" }, { - "bom-ref": "58f164c5a1a09a8e", + "bom-ref": "3f5d8d0ef02bbeb4", "name": "/var/lib/dpkg/info/init-system-helpers.list", "type": "file" }, { - "bom-ref": "2ed3436d49463594", + "bom-ref": "834c891924cefaaa", "name": "/var/lib/dpkg/info/init-system-helpers.md5sums", "type": "file" }, { - "bom-ref": "d64932abdd051028", + "bom-ref": "9c274a8bf4be60dd", "name": "/var/lib/dpkg/info/jq.list", "type": "file" }, { - "bom-ref": "c8aa7b82ddc81025", + "bom-ref": "bdec4e65c191e440", "name": "/var/lib/dpkg/info/jq.md5sums", "type": "file" }, { - "bom-ref": "6ee727b05b93b6eb", + "bom-ref": "d7f709cb454ea520", "name": "/var/lib/dpkg/info/keyboxd.list", "type": "file" }, { - "bom-ref": "e1b2bfb736a16d8b", + "bom-ref": "0b49b2af8c67dce8", "name": "/var/lib/dpkg/info/keyboxd.md5sums", "type": "file" }, { - "bom-ref": "787ba003cd7cd3d0", + "bom-ref": "e2e6ad726eaaed33", "name": "/var/lib/dpkg/info/keyboxd.postinst", "type": "file" }, { - "bom-ref": "2fd23f4ef3d9d6bb", + "bom-ref": "10b440ed7367c3d0", "name": "/var/lib/dpkg/info/keyboxd.postrm", "type": "file" }, { - "bom-ref": "eda682c94a04c762", + "bom-ref": "f9bd008f7d8670fc", "name": "/var/lib/dpkg/info/krb5-multidev:amd64.md5sums", "type": "file" }, { - "bom-ref": "b7c50ed93c4e5335", + "bom-ref": "2733934e84cafe19", "name": "/var/lib/dpkg/info/less.list", "type": "file" }, { - "bom-ref": "b85daaa832464907", + "bom-ref": "27b33e36c6d1617f", "name": "/var/lib/dpkg/info/less.md5sums", "type": "file" }, { - "bom-ref": "2c400222602520aa", + "bom-ref": "065a4a3ff5de110a", "name": "/var/lib/dpkg/info/less.postinst", "type": "file" }, { - "bom-ref": "5030dc4bfec07d97", + "bom-ref": "877d256b84fb8ea3", "name": "/var/lib/dpkg/info/less.preinst", "type": "file" }, { - "bom-ref": "7726d34b3eb29f28", + "bom-ref": "48256cfc33d44848", "name": "/var/lib/dpkg/info/less.prerm", "type": "file" }, { - "bom-ref": "a721dd21c66a41ea", + "bom-ref": "8a8dc342cbbd5670", "name": "/var/lib/dpkg/info/lib32gcc-s1.list", "type": "file" }, { - "bom-ref": "c25612a5eadd87c3", + "bom-ref": "54b7cb5e34cb6075", "name": "/var/lib/dpkg/info/lib32gcc-s1.md5sums", "type": "file" }, { - "bom-ref": "1780bc3337b44396", + "bom-ref": "006b74323abae468", "name": "/var/lib/dpkg/info/lib32gcc-s1.shlibs", "type": "file" }, { - "bom-ref": "9eefafa40039b23f", + "bom-ref": "a0a3cde28aaf9769", "name": "/var/lib/dpkg/info/lib32gcc-s1.symbols", "type": "file" }, { - "bom-ref": "e7a8974a72c9183b", + "bom-ref": "4bc65ca9d6ddf5b5", "name": "/var/lib/dpkg/info/lib32gcc-s1.triggers", "type": "file" }, { - "bom-ref": "ceedbb4e4283d310", + "bom-ref": "02cc8369265ea3e6", "name": "/var/lib/dpkg/info/lib32stdc++6.list", "type": "file" }, { - "bom-ref": "ae85484861aa1ef5", + "bom-ref": "c614f613e08ebb57", "name": "/var/lib/dpkg/info/lib32stdc++6.md5sums", "type": "file" }, { - "bom-ref": "497c394c90061102", + "bom-ref": "a86536564ea22d34", "name": "/var/lib/dpkg/info/lib32stdc++6.postinst", "type": "file" }, { - "bom-ref": "26197c1e892efa2a", + "bom-ref": "c1c1ce85e61a0604", "name": "/var/lib/dpkg/info/lib32stdc++6.shlibs", "type": "file" }, { - "bom-ref": "4a96535cf4df7a91", + "bom-ref": "3ec43aa23e416787", "name": "/var/lib/dpkg/info/lib32stdc++6.symbols", "type": "file" }, { - "bom-ref": "e9433e7ade121243", + "bom-ref": "b048461268d52d05", "name": "/var/lib/dpkg/info/lib32stdc++6.triggers", "type": "file" }, { - "bom-ref": "933fb230f870c697", + "bom-ref": "983b6e966bc8f3fd", "name": "/var/lib/dpkg/info/libacl1:amd64.md5sums", "type": "file" }, { - "bom-ref": "f0145ed565fc87ad", + "bom-ref": "ec475f7dd42e72ff", "name": "/var/lib/dpkg/info/libann0.list", "type": "file" }, { - "bom-ref": "60c91d212d81c70a", + "bom-ref": "480920e8c6d94474", "name": "/var/lib/dpkg/info/libann0.md5sums", "type": "file" }, { - "bom-ref": "a5ddcd3d8eaa9617", + "bom-ref": "e76eb81d8c732831", "name": "/var/lib/dpkg/info/libann0.shlibs", "type": "file" }, { - "bom-ref": "ab317c1ce84283ce", + "bom-ref": "3cd59a3283b427f4", "name": "/var/lib/dpkg/info/libann0.triggers", "type": "file" }, { - "bom-ref": "f6bbb97f836add91", + "bom-ref": "97155951df58d197", "name": "/var/lib/dpkg/info/libaom3:amd64.md5sums", "type": "file" }, { - "bom-ref": "e7a4bcfe9c8487fd", + "bom-ref": "9b0966d8d1fada03", "name": "/var/lib/dpkg/info/libapt-pkg6.0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "2aeaeb4ec016aee8", + "bom-ref": "0506b0071c5fc6d9", "name": "/var/lib/dpkg/info/libasan8:amd64.md5sums", "type": "file" }, { - "bom-ref": "c479473a3d862c52", + "bom-ref": "1c2259d43d1ae238", "name": "/var/lib/dpkg/info/libasound2-data.list", "type": "file" }, { - "bom-ref": "08291d6ec1db059a", + "bom-ref": "284f0a9f56d6d2b0", "name": "/var/lib/dpkg/info/libasound2-data.md5sums", "type": "file" }, { - "bom-ref": "b1f2a8c581942abf", + "bom-ref": "baf6a3e9434941c5", "name": "/var/lib/dpkg/info/libasound2t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "d010399c441ed923", + "bom-ref": "8080642d3c5aaec5", "name": "/var/lib/dpkg/info/libassuan0:amd64.md5sums", "type": "file" }, { - "bom-ref": "e43424f02eefab3a", + "bom-ref": "77a99c0113984f30", "name": "/var/lib/dpkg/info/libatlas-base-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "e99abe24fe6a6fbc", + "bom-ref": "9a69ff82e19a425a", "name": "/var/lib/dpkg/info/libatlas3-base:amd64.md5sums", "type": "file" }, { - "bom-ref": "88f4515961a851fa", + "bom-ref": "13aa947adf98818b", "name": "/var/lib/dpkg/info/libatomic1:amd64.md5sums", "type": "file" }, { - "bom-ref": "42651b8235e1ba67", + "bom-ref": "033d40daa3045e2d", "name": "/var/lib/dpkg/info/libattr1:amd64.conffiles", "type": "file" }, { - "bom-ref": "33c8d9a1729fa71f", + "bom-ref": "47017f8f3b775aa9", "name": "/var/lib/dpkg/info/libattr1:amd64.md5sums", "type": "file" }, { - "bom-ref": "7f5cd4d619616ba0", + "bom-ref": "70827acc980970ee", "name": "/var/lib/dpkg/info/libaudit-common.conffiles", "type": "file" }, { - "bom-ref": "8d224ab7306b74ca", + "bom-ref": "5b9605c2aaaa58d4", "name": "/var/lib/dpkg/info/libaudit-common.list", "type": "file" }, { - "bom-ref": "9e5f74ed8f7586d7", + "bom-ref": "ba31b263d2827571", "name": "/var/lib/dpkg/info/libaudit-common.md5sums", "type": "file" }, { - "bom-ref": "64372cb7d7234d4e", + "bom-ref": "fc2e2f8844b1b520", "name": "/var/lib/dpkg/info/libaudit1:amd64.md5sums", "type": "file" }, { - "bom-ref": "21d028ec205cc71f", + "bom-ref": "7f40b5e77643b1b9", "name": "/var/lib/dpkg/info/libbabeltrace1:amd64.md5sums", "type": "file" }, { - "bom-ref": "93164870aba09ad6", + "bom-ref": "c88e08ae4ceca11c", "name": "/var/lib/dpkg/info/libbinutils:amd64.md5sums", "type": "file" }, { - "bom-ref": "0443d451b0df94ed", + "bom-ref": "329ef0963efad443", "name": "/var/lib/dpkg/info/libblkid1:amd64.md5sums", "type": "file" }, { - "bom-ref": "739ec326ef8605e4", + "bom-ref": "0684924bb19acab3", "name": "/var/lib/dpkg/info/libbrotli1:amd64.md5sums", "type": "file" }, { - "bom-ref": "85d50d29a2fdefda", + "bom-ref": "9b98a901c732c6e0", "name": "/var/lib/dpkg/info/libbsd-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "148f89593b482ed7", + "bom-ref": "0eae6d541b219eec", "name": "/var/lib/dpkg/info/libbsd0:amd64.md5sums", "type": "file" }, { - "bom-ref": "91eb24bf5c07ab36", + "bom-ref": "36e6ab7556a50a7c", "name": "/var/lib/dpkg/info/libbz2-1.0:amd64.md5sums", "type": "file" }, { - "bom-ref": "59dd18568726d359", + "bom-ref": "29a32ad00874d8b3", "name": "/var/lib/dpkg/info/libbz2-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "a6d9ca60ab771e16", + "bom-ref": "b877d852670d5600", "name": "/var/lib/dpkg/info/libc-bin.conffiles", "type": "file" }, { - "bom-ref": "3899bd7c30b232c9", + "bom-ref": "23fb18b25678ded7", "name": "/var/lib/dpkg/info/libc-bin.list", "type": "file" }, { - "bom-ref": "4b8a090df3edd209", + "bom-ref": "e5464867f0e2d893", "name": "/var/lib/dpkg/info/libc-bin.md5sums", "type": "file" }, { - "bom-ref": "ad68f02cabea5024", + "bom-ref": "3d05cc456a0efe16", "name": "/var/lib/dpkg/info/libc-bin.postinst", "type": "file" }, { - "bom-ref": "5352dd6fab792a1d", + "bom-ref": "9af96911c954d89f", "name": "/var/lib/dpkg/info/libc-bin.triggers", "type": "file" }, { - "bom-ref": "a180ff51cb03b7ce", + "bom-ref": "868ac3ebefd38028", "name": "/var/lib/dpkg/info/libc-dev-bin.list", "type": "file" }, { - "bom-ref": "d58b09a8daa93c38", + "bom-ref": "1a8b8d0a2081284a", "name": "/var/lib/dpkg/info/libc-dev-bin.md5sums", "type": "file" }, { - "bom-ref": "e2cc5905f9ca74c3", + "bom-ref": "dba6c21aacb702c5", "name": "/var/lib/dpkg/info/libc6-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "c30cce746ab60223", + "bom-ref": "19d98e24a7f431fd", "name": "/var/lib/dpkg/info/libc6-i386.conffiles", "type": "file" }, { - "bom-ref": "ed9b2e48c7a0552d", + "bom-ref": "a6f0cf62d943946f", "name": "/var/lib/dpkg/info/libc6-i386.list", "type": "file" }, { - "bom-ref": "7646999d7b5b2960", + "bom-ref": "8a336207ec0108c6", "name": "/var/lib/dpkg/info/libc6-i386.md5sums", "type": "file" }, { - "bom-ref": "0ad71b1e3b7e77be", + "bom-ref": "2a7b70a7755978b8", "name": "/var/lib/dpkg/info/libc6-i386.postinst", "type": "file" }, { - "bom-ref": "6b7abe1a7179f1a4", + "bom-ref": "5f25386c045fa846", "name": "/var/lib/dpkg/info/libc6-i386.postrm", "type": "file" }, { - "bom-ref": "d9d0f4639cdcea76", + "bom-ref": "9f15920845f537b8", "name": "/var/lib/dpkg/info/libc6-i386.preinst", "type": "file" }, { - "bom-ref": "a67a7f7f7238285a", + "bom-ref": "38ccd666373297e0", "name": "/var/lib/dpkg/info/libc6-i386.shlibs", "type": "file" }, { - "bom-ref": "a723e2a01f7c5e37", + "bom-ref": "7598e757026609d1", "name": "/var/lib/dpkg/info/libc6-i386.symbols", "type": "file" }, { - "bom-ref": "b111b3a5aff86a7e", + "bom-ref": "b566c26775068434", "name": "/var/lib/dpkg/info/libc6-i386.triggers", "type": "file" }, { - "bom-ref": "e49d989ada04603f", + "bom-ref": "3c29e2e93b116cf5", "name": "/var/lib/dpkg/info/libc6:amd64.conffiles", "type": "file" }, { - "bom-ref": "77768cc2455ac2dc", + "bom-ref": "f97719f4e7fcb51a", "name": "/var/lib/dpkg/info/libc6:amd64.md5sums", "type": "file" }, { - "bom-ref": "f0284b0095b6a5e1", + "bom-ref": "b53a660c7241818f", "name": "/var/lib/dpkg/info/libcairo2:amd64.md5sums", "type": "file" }, { - "bom-ref": "d24bd69bd83a6c82", + "bom-ref": "978d8b861e46f4b0", "name": "/var/lib/dpkg/info/libcap-ng0:amd64.md5sums", "type": "file" }, { - "bom-ref": "c6e9760efb5532df", + "bom-ref": "113dfe1a2dd6106d", "name": "/var/lib/dpkg/info/libcap2:amd64.md5sums", "type": "file" }, { - "bom-ref": "036c9c67806514ce", + "bom-ref": "2686d479cb5e496c", "name": "/var/lib/dpkg/info/libcares2:amd64.md5sums", "type": "file" }, { - "bom-ref": "6ec9965c0ef0acc4", + "bom-ref": "899fe05e046aafdd", "name": "/var/lib/dpkg/info/libcbor0.10:amd64.md5sums", "type": "file" }, { - "bom-ref": "4c82319f25f56ebd", + "bom-ref": "4c53ececb03fbe4c", "name": "/var/lib/dpkg/info/libcc1-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "77580467c6632381", + "bom-ref": "124486959d18ba7f", "name": "/var/lib/dpkg/info/libcdt5:amd64.md5sums", "type": "file" }, { - "bom-ref": "dd4d1a4edd01c2c8", + "bom-ref": "6bc36da60bc37a46", "name": "/var/lib/dpkg/info/libcgraph6:amd64.md5sums", "type": "file" }, { - "bom-ref": "94b81c9512d5022e", + "bom-ref": "88275fc974f72020", "name": "/var/lib/dpkg/info/libclang-common-18-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "56c821d40ae16f20", + "bom-ref": "037306bc4715d5a2", "name": "/var/lib/dpkg/info/libclang-cpp18.list", "type": "file" }, { - "bom-ref": "fb6526d7a848fd86", + "bom-ref": "25c2ced8c2b51ea8", "name": "/var/lib/dpkg/info/libclang-cpp18.md5sums", "type": "file" }, { - "bom-ref": "2f152c9f48556b05", + "bom-ref": "0d05da38cf7044c3", "name": "/var/lib/dpkg/info/libclang-cpp18.shlibs", "type": "file" }, { - "bom-ref": "8270d1a9621d184e", + "bom-ref": "a5fcf23f4bf235b8", "name": "/var/lib/dpkg/info/libclang-cpp18.triggers", "type": "file" }, { - "bom-ref": "a79da47897d7560b", + "bom-ref": "9fc7ea011ab70ef1", "name": "/var/lib/dpkg/info/libclang-rt-18-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "8fb93ace7bca6459", + "bom-ref": "e9268d091a9974b3", "name": "/var/lib/dpkg/info/libclang-rt-dev.list", "type": "file" }, { - "bom-ref": "f9e6dfb1872dc478", + "bom-ref": "d87214ed101b68c2", "name": "/var/lib/dpkg/info/libclang-rt-dev.md5sums", "type": "file" }, { - "bom-ref": "a30fc0103f9aa9bb", + "bom-ref": "8a12c05ec5b028c1", "name": "/var/lib/dpkg/info/libclang1-18.list", "type": "file" }, { - "bom-ref": "2277cdd8eff5d514", + "bom-ref": "34ca5d51bda2e17e", "name": "/var/lib/dpkg/info/libclang1-18.md5sums", "type": "file" }, { - "bom-ref": "44b9461ec396f835", + "bom-ref": "8bdf506ab00d3e4b", "name": "/var/lib/dpkg/info/libclang1-18.shlibs", "type": "file" }, { - "bom-ref": "923e8c0b2f4e6fc9", + "bom-ref": "b7dd13656877c947", "name": "/var/lib/dpkg/info/libclang1-18.symbols", "type": "file" }, { - "bom-ref": "6a23ef681ba42314", + "bom-ref": "d4af4726fa470772", "name": "/var/lib/dpkg/info/libclang1-18.triggers", "type": "file" }, { - "bom-ref": "29b444d3e8f81f67", + "bom-ref": "0f601aaca53d5a55", "name": "/var/lib/dpkg/info/libcom-err2:amd64.md5sums", "type": "file" }, { - "bom-ref": "f632f022db6d9dcd", + "bom-ref": "9776f655c2b666ae", "name": "/var/lib/dpkg/info/libcrypt-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "a08f505527982c0a", + "bom-ref": "01ee1d9a794c0030", "name": "/var/lib/dpkg/info/libcrypt1:amd64.md5sums", "type": "file" }, { - "bom-ref": "af6dc7af0d200281", + "bom-ref": "b78ce1ebe48ec5d7", "name": "/var/lib/dpkg/info/libctf-nobfd0:amd64.md5sums", "type": "file" }, { - "bom-ref": "ddfa9117df516864", + "bom-ref": "16926016bdfe18c2", "name": "/var/lib/dpkg/info/libctf0:amd64.md5sums", "type": "file" }, { - "bom-ref": "583c30ff82214474", - "name": "/var/lib/dpkg/info/libcublas13-cuda-13.list", + "bom-ref": "f7d27bb1bbea5111", + "name": "/var/lib/dpkg/info/libcublas-13-4.list", + "type": "file" + }, + { + "bom-ref": "23444aa13af83e4b", + "name": "/var/lib/dpkg/info/libcublas-13-4.md5sums", "type": "file" }, { - "bom-ref": "3e5c8e68f6581df1", - "name": "/var/lib/dpkg/info/libcublas13-cuda-13.md5sums", + "bom-ref": "c21b71517bf667e0", + "name": "/var/lib/dpkg/info/libcublas-dev-13-4.list", "type": "file" }, { - "bom-ref": "6c2ce4249764152b", - "name": "/var/lib/dpkg/info/libcublas13-dev-cuda-13.list", + "bom-ref": "f9d59ca6734af41c", + "name": "/var/lib/dpkg/info/libcublas-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "d7997156fc2fbcec", - "name": "/var/lib/dpkg/info/libcublas13-dev-cuda-13.md5sums", + "bom-ref": "ad0e719946931a8c", + "name": "/var/lib/dpkg/info/libcublasmp0-cuda-13.list", "type": "file" }, { - "bom-ref": "099c07204cd8a69b", + "bom-ref": "8526036f8f8e20a9", + "name": "/var/lib/dpkg/info/libcublasmp0-cuda-13.md5sums", + "type": "file" + }, + { + "bom-ref": "91cdc188822252f3", + "name": "/var/lib/dpkg/info/libcublasmp0-dev-cuda-13.list", + "type": "file" + }, + { + "bom-ref": "bf04fce0ce2dfa4d", + "name": "/var/lib/dpkg/info/libcublasmp0-dev-cuda-13.md5sums", + "type": "file" + }, + { + "bom-ref": "5c98184c6c88aec9", "name": "/var/lib/dpkg/info/libcudnn9-cuda-13.list", "type": "file" }, { - "bom-ref": "bf3c504ced920e56", + "bom-ref": "8482e0ccbfb09bba", "name": "/var/lib/dpkg/info/libcudnn9-cuda-13.md5sums", "type": "file" }, { - "bom-ref": "2d22f85b7ab8525c", + "bom-ref": "7a3a55690c153916", "name": "/var/lib/dpkg/info/libcudnn9-dev-cuda-13.list", "type": "file" }, { - "bom-ref": "d578a4e31004834c", + "bom-ref": "17523f6c8783e21b", "name": "/var/lib/dpkg/info/libcudnn9-dev-cuda-13.md5sums", "type": "file" }, { - "bom-ref": "d04759f71a7a2d7d", + "bom-ref": "78057339e51c6672", "name": "/var/lib/dpkg/info/libcudnn9-dev-cuda-13.preinst", "type": "file" }, { - "bom-ref": "e8cade25388fd1ce", + "bom-ref": "a0b5f377714eec88", "name": "/var/lib/dpkg/info/libcudnn9-headers-cuda-13.list", "type": "file" }, { - "bom-ref": "046d9586a2e42124", + "bom-ref": "35c405ec01985d5f", "name": "/var/lib/dpkg/info/libcudnn9-headers-cuda-13.md5sums", "type": "file" }, { - "bom-ref": "3bce39e8b222b0c0", - "name": "/var/lib/dpkg/info/libcufft-13-2.list", + "bom-ref": "e3d307999b42c9fe", + "name": "/var/lib/dpkg/info/libcufft-13-4.list", + "type": "file" + }, + { + "bom-ref": "84b6ebb8d1ca864c", + "name": "/var/lib/dpkg/info/libcufft-13-4.md5sums", + "type": "file" + }, + { + "bom-ref": "aabfed37ef0937b1", + "name": "/var/lib/dpkg/info/libcufft-dev-13-4.list", "type": "file" }, { - "bom-ref": "35b35aaee60a0649", - "name": "/var/lib/dpkg/info/libcufft-13-2.md5sums", + "bom-ref": "53834eb99f9390a7", + "name": "/var/lib/dpkg/info/libcufft-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "57cc8591d104db09", - "name": "/var/lib/dpkg/info/libcufft-dev-13-2.list", + "bom-ref": "26d886f4ce45bcba", + "name": "/var/lib/dpkg/info/libcufile-13-4.conffiles", "type": "file" }, { - "bom-ref": "c6ae62afd047afc7", - "name": "/var/lib/dpkg/info/libcufft-dev-13-2.md5sums", + "bom-ref": "63ab1690d6899fb9", + "name": "/var/lib/dpkg/info/libcufile-13-4.list", "type": "file" }, { - "bom-ref": "c69b50f8b67d5a09", - "name": "/var/lib/dpkg/info/libcufile-13-2.conffiles", + "bom-ref": "7d4c181d8a874125", + "name": "/var/lib/dpkg/info/libcufile-13-4.md5sums", "type": "file" }, { - "bom-ref": "66fb44093629ecb5", - "name": "/var/lib/dpkg/info/libcufile-13-2.list", + "bom-ref": "82beb9c5e49bb530", + "name": "/var/lib/dpkg/info/libcufile-13-4.postinst", "type": "file" }, { - "bom-ref": "ebc20e10fc57aafc", - "name": "/var/lib/dpkg/info/libcufile-13-2.md5sums", + "bom-ref": "4d844bc5c101a483", + "name": "/var/lib/dpkg/info/libcufile-13-4.prerm", "type": "file" }, { - "bom-ref": "1df17a70a3cae380", - "name": "/var/lib/dpkg/info/libcufile-13-2.postinst", + "bom-ref": "1b56130b742de3e9", + "name": "/var/lib/dpkg/info/libcufile-dev-13-4.list", "type": "file" }, { - "bom-ref": "3e79eb1ea5f226cd", - "name": "/var/lib/dpkg/info/libcufile-13-2.prerm", + "bom-ref": "5a3ddb72354bde10", + "name": "/var/lib/dpkg/info/libcufile-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "a99e4d6a740dcf41", - "name": "/var/lib/dpkg/info/libcufile-dev-13-2.list", + "bom-ref": "3689a6dafb3c690f", + "name": "/var/lib/dpkg/info/libcuobjclient-13-4.list", "type": "file" }, { - "bom-ref": "146fd41a895a3866", - "name": "/var/lib/dpkg/info/libcufile-dev-13-2.md5sums", + "bom-ref": "0b994ce38fa9b6ed", + "name": "/var/lib/dpkg/info/libcuobjclient-13-4.md5sums", "type": "file" }, { - "bom-ref": "81b61fa8a49136ef", - "name": "/var/lib/dpkg/info/libcurand-13-2.list", + "bom-ref": "5b8e8fbbb7ef156b", + "name": "/var/lib/dpkg/info/libcurand-13-4.list", "type": "file" }, { - "bom-ref": "dcbaec3d3f2f9e69", - "name": "/var/lib/dpkg/info/libcurand-13-2.md5sums", + "bom-ref": "17fcd5b9af5f400c", + "name": "/var/lib/dpkg/info/libcurand-13-4.md5sums", "type": "file" }, { - "bom-ref": "0907b39f0eff16db", - "name": "/var/lib/dpkg/info/libcurand-dev-13-2.list", + "bom-ref": "a0324d11320f8610", + "name": "/var/lib/dpkg/info/libcurand-dev-13-4.list", "type": "file" }, { - "bom-ref": "61986ba03d726099", - "name": "/var/lib/dpkg/info/libcurand-dev-13-2.md5sums", + "bom-ref": "573732ad13188ded", + "name": "/var/lib/dpkg/info/libcurand-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "7927f41463573c79", + "bom-ref": "dc19f4bf60b3e4cb", "name": "/var/lib/dpkg/info/libcurl3t64-gnutls:amd64.md5sums", "type": "file" }, { - "bom-ref": "db8acbedf9fd044b", + "bom-ref": "d13c32106925359d", "name": "/var/lib/dpkg/info/libcurl4t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "55c6854c82cb2218", - "name": "/var/lib/dpkg/info/libcusolver-13-2.list", + "bom-ref": "788a0868cc235848", + "name": "/var/lib/dpkg/info/libcusolver-13-4.list", "type": "file" }, { - "bom-ref": "4ce098fe029b4242", - "name": "/var/lib/dpkg/info/libcusolver-13-2.md5sums", + "bom-ref": "8c9e9392a4f38dfb", + "name": "/var/lib/dpkg/info/libcusolver-13-4.md5sums", "type": "file" }, { - "bom-ref": "fba909067bddf70b", - "name": "/var/lib/dpkg/info/libcusolver-dev-13-2.list", + "bom-ref": "877ee6e920e6d6d8", + "name": "/var/lib/dpkg/info/libcusolver-dev-13-4.list", "type": "file" }, { - "bom-ref": "674a4cf827e40820", - "name": "/var/lib/dpkg/info/libcusolver-dev-13-2.md5sums", + "bom-ref": "4912efc675ae2884", + "name": "/var/lib/dpkg/info/libcusolver-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "6848a005b98fb301", + "bom-ref": "2fc4f307bd9ccfff", "name": "/var/lib/dpkg/info/libcusolvermp0-cuda-13.list", "type": "file" }, { - "bom-ref": "66240beaf8d263e2", + "bom-ref": "50020240d17bede0", "name": "/var/lib/dpkg/info/libcusolvermp0-cuda-13.md5sums", "type": "file" }, { - "bom-ref": "20ed73ff6ac1100d", - "name": "/var/lib/dpkg/info/libcusparse-13-2.list", + "bom-ref": "de036d1c638c6107", + "name": "/var/lib/dpkg/info/libcusparse-13-4.list", "type": "file" }, { - "bom-ref": "8b23966da6dd7471", - "name": "/var/lib/dpkg/info/libcusparse-13-2.md5sums", + "bom-ref": "d4c3574b0acaac06", + "name": "/var/lib/dpkg/info/libcusparse-13-4.md5sums", "type": "file" }, { - "bom-ref": "cd1a52559a7c0b70", - "name": "/var/lib/dpkg/info/libcusparse-dev-13-2.list", + "bom-ref": "f059673a2a47592c", + "name": "/var/lib/dpkg/info/libcusparse-dev-13-4.list", "type": "file" }, { - "bom-ref": "699e992ff2b3cbb5", - "name": "/var/lib/dpkg/info/libcusparse-dev-13-2.md5sums", + "bom-ref": "addeaf2f98853fb1", + "name": "/var/lib/dpkg/info/libcusparse-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "5d55eb66c41fcbcd", + "bom-ref": "e8daf03a1ba23b10", "name": "/var/lib/dpkg/info/libcusparselt0-cuda-13.list", "type": "file" }, { - "bom-ref": "c168b38da814d88e", + "bom-ref": "382a3d3f37c70df5", "name": "/var/lib/dpkg/info/libcusparselt0-cuda-13.md5sums", "type": "file" }, { - "bom-ref": "2a69add510a4d0c7", + "bom-ref": "758f0d8f0427a1e2", "name": "/var/lib/dpkg/info/libcusparselt0-dev-cuda-13.list", "type": "file" }, { - "bom-ref": "d3fdee3f2b5eda50", + "bom-ref": "3d3ddd7946e7c0bd", "name": "/var/lib/dpkg/info/libcusparselt0-dev-cuda-13.md5sums", "type": "file" }, { - "bom-ref": "04959dd3129dc4bf", + "bom-ref": "4a47eeda91bfaac5", "name": "/var/lib/dpkg/info/libdatrie1:amd64.md5sums", "type": "file" }, { - "bom-ref": "e8f83a043998d193", + "bom-ref": "eb37d9105b24ca6d", "name": "/var/lib/dpkg/info/libdb5.3t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "a951f622a5bbbcea", + "bom-ref": "ccdca6787f594d7d", "name": "/var/lib/dpkg/info/libdbus-1-3:amd64.md5sums", "type": "file" }, { - "bom-ref": "593ef13ec281b01d", - "name": "/var/lib/dpkg/info/libdbus-1-dev:amd64.md5sums", - "type": "file" - }, - { - "bom-ref": "9705acbf80c61674", + "bom-ref": "35b9cef7c2900276", "name": "/var/lib/dpkg/info/libdebconfclient0:amd64.md5sums", "type": "file" }, { - "bom-ref": "ab4b56e1acdb509e", + "bom-ref": "e20c3d26271ba098", "name": "/var/lib/dpkg/info/libdebuginfod-common.conffiles", "type": "file" }, { - "bom-ref": "995d7f7f044c228d", + "bom-ref": "bd01ce52c591f593", "name": "/var/lib/dpkg/info/libdebuginfod-common.config", "type": "file" }, { - "bom-ref": "ba63832f35a5cdeb", + "bom-ref": "d0696cac037ad0b5", "name": "/var/lib/dpkg/info/libdebuginfod-common.list", "type": "file" }, { - "bom-ref": "7ed18d680af3bb37", + "bom-ref": "47bd7bde1a08e7f5", "name": "/var/lib/dpkg/info/libdebuginfod-common.md5sums", "type": "file" }, { - "bom-ref": "45443bdd8da6055e", + "bom-ref": "fe8f039df5bb6988", "name": "/var/lib/dpkg/info/libdebuginfod-common.postinst", "type": "file" }, { - "bom-ref": "418ac78ce3377474", + "bom-ref": "1e766d82344d31d6", "name": "/var/lib/dpkg/info/libdebuginfod-common.postrm", "type": "file" }, { - "bom-ref": "abaed4f654779d36", + "bom-ref": "d3b0085ecdae9374", "name": "/var/lib/dpkg/info/libdebuginfod-common.templates", "type": "file" }, { - "bom-ref": "377a44d1931d15c5", + "bom-ref": "dde53de92fbbb33b", "name": "/var/lib/dpkg/info/libdebuginfod1t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "5da48e41a62e32b6", + "bom-ref": "3f371916452814dc", "name": "/var/lib/dpkg/info/libdeflate0:amd64.md5sums", "type": "file" }, { - "bom-ref": "42c64622872e0680", + "bom-ref": "3b8065b92ffbd5e9", "name": "/var/lib/dpkg/info/libdpkg-perl.list", "type": "file" }, { - "bom-ref": "4e2ba1cd30a17580", + "bom-ref": "8ab7f7c06a5541e5", "name": "/var/lib/dpkg/info/libdpkg-perl.md5sums", "type": "file" }, { - "bom-ref": "a2d82c6dce64934b", + "bom-ref": "e912e9bb0f35651d", "name": "/var/lib/dpkg/info/libdw1t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "09e9e69924914b24", + "bom-ref": "46be15926c12d59e", "name": "/var/lib/dpkg/info/libedit-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "5c5d83bd736257de", + "bom-ref": "26e9d50480202c63", "name": "/var/lib/dpkg/info/libedit2:amd64.md5sums", "type": "file" }, { - "bom-ref": "d2370f8c1e35ee05", + "bom-ref": "eb453c4c54ad95ce", "name": "/var/lib/dpkg/info/libelf1t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "2a3634e5214dc197", + "bom-ref": "91bb088f7405b252", "name": "/var/lib/dpkg/info/liberror-perl.list", "type": "file" }, { - "bom-ref": "93c8d1594a84be18", + "bom-ref": "f23140d92cbf0df1", "name": "/var/lib/dpkg/info/liberror-perl.md5sums", "type": "file" }, { - "bom-ref": "682ae7f10361a680", + "bom-ref": "ebfef03f7958f2a2", "name": "/var/lib/dpkg/info/libexpat1-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "089c9676dd3ce11c", + "bom-ref": "44f30c9f11900f89", "name": "/var/lib/dpkg/info/libexpat1:amd64.md5sums", "type": "file" }, { - "bom-ref": "738aad4d468b9f8c", + "bom-ref": "77a6fbf767b18afe", "name": "/var/lib/dpkg/info/libext2fs2t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "4c312e15c538fb8f", + "bom-ref": "f5e8c768732ab791", "name": "/var/lib/dpkg/info/libffi-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "c8348969d6f47571", + "bom-ref": "26215ae65f0b6593", "name": "/var/lib/dpkg/info/libffi8:amd64.md5sums", "type": "file" }, { - "bom-ref": "27c572f4151d74d6", + "bom-ref": "4ffae5de36f56b17", "name": "/var/lib/dpkg/info/libfido2-1:amd64.md5sums", "type": "file" }, { - "bom-ref": "b4a18d2ae7a07fb4", + "bom-ref": "0d9e734e95e42f16", "name": "/var/lib/dpkg/info/libflac12t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "5e0961b4833a00cc", + "bom-ref": "8dc06796970b5f4e", "name": "/var/lib/dpkg/info/libfontconfig1:amd64.md5sums", "type": "file" }, { - "bom-ref": "1fe19a13e4a97062", + "bom-ref": "f8288097dc0a5f50", "name": "/var/lib/dpkg/info/libfreetype6:amd64.md5sums", "type": "file" }, { - "bom-ref": "64532e491ba77609", + "bom-ref": "ae665b5040a1bd7f", "name": "/var/lib/dpkg/info/libfribidi0:amd64.md5sums", "type": "file" }, { - "bom-ref": "fd5af211c7b603fe", + "bom-ref": "a6ab07cda17dfddc", "name": "/var/lib/dpkg/info/libgc1:amd64.md5sums", "type": "file" }, { - "bom-ref": "dc1dd0be734e8bd5", + "bom-ref": "13d5c0026b2b9f40", "name": "/var/lib/dpkg/info/libgcc-13-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "e6e2d4e57ad0ec3a", + "bom-ref": "4bb243e78c3277cc", "name": "/var/lib/dpkg/info/libgcc-14-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "784265869082abfb", + "bom-ref": "414561adc78c5a55", "name": "/var/lib/dpkg/info/libgcc-s1:amd64.md5sums", "type": "file" }, { - "bom-ref": "6131b7018644f87a", + "bom-ref": "f1073a009ab95068", "name": "/var/lib/dpkg/info/libgcrypt20:amd64.md5sums", "type": "file" }, { - "bom-ref": "e35d9b736c6ad4cb", + "bom-ref": "c2ecb1172655f259", "name": "/var/lib/dpkg/info/libgd3:amd64.md5sums", "type": "file" }, { - "bom-ref": "92969f71fb38356b", + "bom-ref": "9a82481e29dcd506", "name": "/var/lib/dpkg/info/libgdbm-compat4t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "685177caa59c026d", + "bom-ref": "7be19af06501e3d0", "name": "/var/lib/dpkg/info/libgdbm6t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "0c0ae56c3efc69c3", + "bom-ref": "4d4134835a8e59d0", "name": "/var/lib/dpkg/info/libgdrapi:amd64.md5sums", "type": "file" }, { - "bom-ref": "187750f60e8e8564", + "bom-ref": "18c8d65923a7b9f6", "name": "/var/lib/dpkg/info/libgflags-dev.list", "type": "file" }, { - "bom-ref": "a9a3b874d9477ddd", + "bom-ref": "7c1918134a5ad6f7", "name": "/var/lib/dpkg/info/libgflags-dev.md5sums", "type": "file" }, { - "bom-ref": "09491f031210b02c", + "bom-ref": "fc4580cbdb695eaa", "name": "/var/lib/dpkg/info/libgflags2.2.list", "type": "file" }, { - "bom-ref": "5280d8af5ed906dc", + "bom-ref": "de73bda79b0f1772", "name": "/var/lib/dpkg/info/libgflags2.2.md5sums", "type": "file" }, { - "bom-ref": "bd72604c6a437ad1", + "bom-ref": "23b374c58070248b", "name": "/var/lib/dpkg/info/libgflags2.2.shlibs", "type": "file" }, { - "bom-ref": "817c3f6235606ee8", + "bom-ref": "8082333d839fbc6a", "name": "/var/lib/dpkg/info/libgflags2.2.triggers", "type": "file" }, { - "bom-ref": "7aa1ef4377e84335", + "bom-ref": "b77f0c90ec204f4b", "name": "/var/lib/dpkg/info/libgfortran5:amd64.md5sums", "type": "file" }, { - "bom-ref": "e47268c4ec8a9d47", + "bom-ref": "f1411967d6a3d9e2", "name": "/var/lib/dpkg/info/libglib2.0-0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "038a482285f51914", + "bom-ref": "6b35a3023c741096", "name": "/var/lib/dpkg/info/libgmp10:amd64.md5sums", "type": "file" }, { - "bom-ref": "b96aa5cfe247924c", + "bom-ref": "cd608075c6108fae", "name": "/var/lib/dpkg/info/libgnutls30t64:amd64.conffiles", "type": "file" }, { - "bom-ref": "9726778b7d22cee2", + "bom-ref": "eaf6a8540ce48e5c", "name": "/var/lib/dpkg/info/libgnutls30t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "ec82d1369ba8b4f8", + "bom-ref": "fceaad8d109e8b45", "name": "/var/lib/dpkg/info/libgomp1:amd64.md5sums", "type": "file" }, { - "bom-ref": "bf6d6dc73565e252", + "bom-ref": "d4938e1baaf710c4", "name": "/var/lib/dpkg/info/libgoogle-glog-dev.list", "type": "file" }, { - "bom-ref": "e8d4bf4166813327", + "bom-ref": "d8ac8974c8d90611", "name": "/var/lib/dpkg/info/libgoogle-glog-dev.md5sums", "type": "file" }, { - "bom-ref": "49a8bb5fd152bba7", + "bom-ref": "2a68af053f4fab89", "name": "/var/lib/dpkg/info/libgoogle-glog0v6t64.list", "type": "file" }, { - "bom-ref": "0f76d5f758f6f952", + "bom-ref": "702759d69c8393f0", "name": "/var/lib/dpkg/info/libgoogle-glog0v6t64.md5sums", "type": "file" }, { - "bom-ref": "3a5f95da6d307d76", + "bom-ref": "28519c120e97035c", "name": "/var/lib/dpkg/info/libgoogle-glog0v6t64.shlibs", "type": "file" }, { - "bom-ref": "ab792e57786e2e44", + "bom-ref": "83e2ce1a5d62d222", "name": "/var/lib/dpkg/info/libgoogle-glog0v6t64.triggers", "type": "file" }, { - "bom-ref": "df7a0606e511de52", + "bom-ref": "588ec544e77288bc", "name": "/var/lib/dpkg/info/libgpg-error0:amd64.md5sums", "type": "file" }, { - "bom-ref": "ddcd2e9e6f6ec2ae", + "bom-ref": "0161e127843ea5ca", "name": "/var/lib/dpkg/info/libgpm2:amd64.md5sums", "type": "file" }, { - "bom-ref": "ff6abe218aedfac1", + "bom-ref": "d09a2b74cc3ffbc3", "name": "/var/lib/dpkg/info/libgprofng0:amd64.md5sums", "type": "file" }, { - "bom-ref": "689c8c5ff0f1114a", + "bom-ref": "c51b4d135b55b9a8", "name": "/var/lib/dpkg/info/libgraphite2-3:amd64.md5sums", "type": "file" }, { - "bom-ref": "79cdd104f73e01a6", + "bom-ref": "7f46e2f91b0602a4", "name": "/var/lib/dpkg/info/libgsm1:amd64.md5sums", "type": "file" }, { - "bom-ref": "07a5a4e986e1bee6", + "bom-ref": "e8e2af00d06df05d", "name": "/var/lib/dpkg/info/libgssapi-krb5-2:amd64.md5sums", "type": "file" }, { - "bom-ref": "0033728bf669e324", + "bom-ref": "fafcabfc21fad3a2", "name": "/var/lib/dpkg/info/libgssrpc4t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "d1d085198b6cf36f", + "bom-ref": "a3d1bbd67cc8a359", "name": "/var/lib/dpkg/info/libgts-0.7-5t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "d4358e151068f024", + "bom-ref": "09dd195c87447096", "name": "/var/lib/dpkg/info/libgvc6.list", "type": "file" }, { - "bom-ref": "7046e63f14e27c20", + "bom-ref": "2144f82686ec48ee", "name": "/var/lib/dpkg/info/libgvc6.md5sums", "type": "file" }, { - "bom-ref": "ea9955be672fc2c0", + "bom-ref": "48a3ad6c30328bb2", "name": "/var/lib/dpkg/info/libgvc6.postinst", "type": "file" }, { - "bom-ref": "c93b4e1315f7d3ce", + "bom-ref": "2e07e4cb604940ac", "name": "/var/lib/dpkg/info/libgvc6.postrm", "type": "file" }, { - "bom-ref": "90d80c3d12c4a781", + "bom-ref": "9ff325062908b027", "name": "/var/lib/dpkg/info/libgvc6.shlibs", "type": "file" }, { - "bom-ref": "2fc6d4868f954be7", + "bom-ref": "050513b829056539", "name": "/var/lib/dpkg/info/libgvc6.triggers", "type": "file" }, { - "bom-ref": "d64d233231432b31", + "bom-ref": "875896fd45c7fb4f", "name": "/var/lib/dpkg/info/libgvpr2:amd64.md5sums", "type": "file" }, { - "bom-ref": "a0994497c13fe754", + "bom-ref": "53fdc6eb2ee84dbe", "name": "/var/lib/dpkg/info/libharfbuzz0b:amd64.md5sums", "type": "file" }, { - "bom-ref": "307d1b934c17ff68", + "bom-ref": "cfbb5e61e2f86fde", "name": "/var/lib/dpkg/info/libheif-plugin-aomdec:amd64.md5sums", "type": "file" }, { - "bom-ref": "78623d6b1bbfc597", + "bom-ref": "e9e3834964c01b4d", "name": "/var/lib/dpkg/info/libheif1:amd64.md5sums", "type": "file" }, { - "bom-ref": "8e78c084edd099a8", + "bom-ref": "bf78471a2a12fd2e", "name": "/var/lib/dpkg/info/libhiredis1.1.0:amd64.md5sums", "type": "file" }, { - "bom-ref": "f0c3ce6eeee7e20a", + "bom-ref": "8c81c2ea4effe55c", "name": "/var/lib/dpkg/info/libhogweed6t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "4f0bffbf24b675bf", + "bom-ref": "b53be76325c9420a", "name": "/var/lib/dpkg/info/libhwasan0:amd64.md5sums", "type": "file" }, { - "bom-ref": "739ade95e7c3a23d", + "bom-ref": "417aeea2a2c56c6c", "name": "/var/lib/dpkg/info/libhwloc15:amd64.md5sums", "type": "file" }, { - "bom-ref": "73851ad78f916918", + "bom-ref": "45079284ddba267f", "name": "/var/lib/dpkg/info/libibumad-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "7e235179b213f814", + "bom-ref": "0bbcae2572854f9b", "name": "/var/lib/dpkg/info/libibumad3:amd64.md5sums", "type": "file" }, { - "bom-ref": "fd833c469ef91df1", + "bom-ref": "11828075d6e4c383", "name": "/var/lib/dpkg/info/libibverbs-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "c52876ace8b37850", + "bom-ref": "83dc33a55e2491c2", "name": "/var/lib/dpkg/info/libibverbs1:amd64.md5sums", "type": "file" }, { - "bom-ref": "112a819a2e9f01f2", + "bom-ref": "509a5194424eae90", "name": "/var/lib/dpkg/info/libice6:amd64.md5sums", "type": "file" }, { - "bom-ref": "9946fa43fe1014aa", + "bom-ref": "e940ca3c1d87e1dc", "name": "/var/lib/dpkg/info/libicu-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "3284d68b93746e8f", + "bom-ref": "5ef841f72940b241", "name": "/var/lib/dpkg/info/libicu74:amd64.md5sums", "type": "file" }, { - "bom-ref": "30fdecb1a733e9ca", + "bom-ref": "20adf1bf21c7f654", "name": "/var/lib/dpkg/info/libidn2-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "1ce3fc48f97ff89e", + "bom-ref": "3b4849461d3cd004", "name": "/var/lib/dpkg/info/libipt2.list", "type": "file" }, { - "bom-ref": "57154f157c0a893f", + "bom-ref": "e7dfbd69868864d9", "name": "/var/lib/dpkg/info/libipt2.md5sums", "type": "file" }, { - "bom-ref": "78c1b55c69381f9f", + "bom-ref": "54f918654cbf1ec5", "name": "/var/lib/dpkg/info/libipt2.shlibs", "type": "file" }, { - "bom-ref": "e2e4c9840dd65565", + "bom-ref": "3c9cc65b13039ec3", "name": "/var/lib/dpkg/info/libipt2.symbols", "type": "file" }, { - "bom-ref": "7b420d2563a195e8", + "bom-ref": "a604473f35cdfc12", "name": "/var/lib/dpkg/info/libipt2.triggers", "type": "file" }, { - "bom-ref": "65d34a3753b9e7ce", + "bom-ref": "62dba499bc1ca8bb", "name": "/var/lib/dpkg/info/libisl23:amd64.md5sums", "type": "file" }, { - "bom-ref": "fb87ea1131522552", + "bom-ref": "bb0a5a35928cf63b", "name": "/var/lib/dpkg/info/libitm1:amd64.md5sums", "type": "file" }, { - "bom-ref": "68777cbdc02132fe", + "bom-ref": "46ee3e6534ae1e69", "name": "/var/lib/dpkg/info/libjansson4:amd64.md5sums", "type": "file" }, { - "bom-ref": "24f3384b504bc94e", + "bom-ref": "5923d06200195364", "name": "/var/lib/dpkg/info/libjbig0:amd64.md5sums", "type": "file" }, { - "bom-ref": "44610c04d5b0bb40", + "bom-ref": "3f70273acd65333e", "name": "/var/lib/dpkg/info/libjpeg-turbo8:amd64.md5sums", "type": "file" }, { - "bom-ref": "b278777b6e9d899c", + "bom-ref": "d9691b7258f6bfd2", "name": "/var/lib/dpkg/info/libjpeg8:amd64.md5sums", "type": "file" }, { - "bom-ref": "2e9c17429413f967", + "bom-ref": "326f88318c0ddc3a", "name": "/var/lib/dpkg/info/libjq1:amd64.md5sums", "type": "file" }, { - "bom-ref": "f9cbeef00c6de976", + "bom-ref": "08a2329224c28588", "name": "/var/lib/dpkg/info/libjs-jquery.list", "type": "file" }, { - "bom-ref": "5fe99c7bbfdeb2e4", + "bom-ref": "938907274cb7a92e", "name": "/var/lib/dpkg/info/libjs-jquery.md5sums", "type": "file" }, { - "bom-ref": "0b189a159c8c35c5", + "bom-ref": "5214261512301003", "name": "/var/lib/dpkg/info/libjs-jquery.postinst", "type": "file" }, { - "bom-ref": "a3aa65524846a3c0", + "bom-ref": "c2ecf6b790a2b676", "name": "/var/lib/dpkg/info/libjs-jquery.postrm", "type": "file" }, { - "bom-ref": "c122d17e9510f040", + "bom-ref": "41ec1be2f00570c6", "name": "/var/lib/dpkg/info/libjs-jquery.preinst", "type": "file" }, { - "bom-ref": "9d1f136403b10c08", + "bom-ref": "11f009a93f01ec2e", "name": "/var/lib/dpkg/info/libjs-jquery.prerm", "type": "file" }, { - "bom-ref": "3030c291d1b207ca", + "bom-ref": "217e077286e82b54", "name": "/var/lib/dpkg/info/libjs-sphinxdoc.list", "type": "file" }, { - "bom-ref": "922c5333bad0c3bc", + "bom-ref": "45997eb3188a632a", "name": "/var/lib/dpkg/info/libjs-sphinxdoc.md5sums", "type": "file" }, { - "bom-ref": "846d3665e2b9a7dc", + "bom-ref": "9db505b7ecb369b6", "name": "/var/lib/dpkg/info/libjs-underscore.list", "type": "file" }, { - "bom-ref": "e3f43c823e41f75f", + "bom-ref": "03ac0047033382a1", "name": "/var/lib/dpkg/info/libjs-underscore.md5sums", "type": "file" }, { - "bom-ref": "d190aeb89709034d", + "bom-ref": "6ef522993ff5aa8e", "name": "/var/lib/dpkg/info/libk5crypto3:amd64.md5sums", "type": "file" }, { - "bom-ref": "b24b73b5d3e5e7e3", + "bom-ref": "26a2b3bea097721d", "name": "/var/lib/dpkg/info/libkadm5clnt-mit12:amd64.md5sums", "type": "file" }, { - "bom-ref": "41b13e8ae7dcb4ef", + "bom-ref": "4deeab672e86ca09", "name": "/var/lib/dpkg/info/libkadm5srv-mit12:amd64.md5sums", "type": "file" }, { - "bom-ref": "345a534b4fb2a972", + "bom-ref": "44acf3748664f68c", "name": "/var/lib/dpkg/info/libkdb5-10t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "476a280d4464f53b", + "bom-ref": "4c1fef0308c973b4", "name": "/var/lib/dpkg/info/libkeyutils1:amd64.md5sums", "type": "file" }, { - "bom-ref": "433843460f98585a", + "bom-ref": "a494dd7881d929bd", "name": "/var/lib/dpkg/info/libkmod2:amd64.md5sums", "type": "file" }, { - "bom-ref": "2bd2f115379438cc", + "bom-ref": "3c90c9978be28d7f", "name": "/var/lib/dpkg/info/libkrb5-3:amd64.md5sums", "type": "file" }, { - "bom-ref": "7882428eb791c05e", + "bom-ref": "755b82bbd78ca230", "name": "/var/lib/dpkg/info/libkrb5-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "e35f44a8a206c98c", + "bom-ref": "527a21324cc8776f", "name": "/var/lib/dpkg/info/libkrb5support0:amd64.md5sums", "type": "file" }, { - "bom-ref": "7ea96542b2151c3c", + "bom-ref": "0f3a091c82b2f9b1", "name": "/var/lib/dpkg/info/libksba8:amd64.md5sums", "type": "file" }, { - "bom-ref": "b9a4bc0a58943ac2", + "bom-ref": "8fa567bbf652e6a8", "name": "/var/lib/dpkg/info/liblab-gamut1:amd64.md5sums", "type": "file" }, { - "bom-ref": "5e1c2968adc4a507", + "bom-ref": "1006ec482a51ba34", "name": "/var/lib/dpkg/info/libldap2:amd64.md5sums", "type": "file" }, { - "bom-ref": "60ad2d3226e37df4", + "bom-ref": "71917bb50484c12a", "name": "/var/lib/dpkg/info/liblerc4:amd64.md5sums", "type": "file" }, { - "bom-ref": "26750a8381bd2384", + "bom-ref": "49c1f4f0fd588802", "name": "/var/lib/dpkg/info/libleveldb-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "f5713498b55753e3", + "bom-ref": "5ffe7ab674b9f771", "name": "/var/lib/dpkg/info/libleveldb1d:amd64.md5sums", "type": "file" }, { - "bom-ref": "ea47233f0625e057", + "bom-ref": "607ff4b9d713727d", "name": "/var/lib/dpkg/info/libllvm18:amd64.md5sums", "type": "file" }, { - "bom-ref": "8863c10a53150544", + "bom-ref": "c98f87d54d0b3176", "name": "/var/lib/dpkg/info/liblmdb-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "91a3f604486468d2", + "bom-ref": "9c251b26f1be1b48", "name": "/var/lib/dpkg/info/liblmdb0:amd64.md5sums", "type": "file" }, { - "bom-ref": "b66015ec9fe18eab", + "bom-ref": "8c62e7076f2695da", "name": "/var/lib/dpkg/info/liblsan0:amd64.md5sums", "type": "file" }, { - "bom-ref": "290f32dae67b1268", + "bom-ref": "dd98cf4b8d2f11a6", "name": "/var/lib/dpkg/info/libltdl7:amd64.md5sums", "type": "file" }, { - "bom-ref": "8a41f6d758ccb88d", + "bom-ref": "2b63631b776805b7", "name": "/var/lib/dpkg/info/liblz4-1:amd64.md5sums", "type": "file" }, { - "bom-ref": "07c1b139908b472f", + "bom-ref": "6041bc2fd924204d", "name": "/var/lib/dpkg/info/liblzma-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "1ab90b8058d83893", + "bom-ref": "15279c11c82ef301", "name": "/var/lib/dpkg/info/liblzma5:amd64.md5sums", "type": "file" }, { - "bom-ref": "8540a92bf1ec297b", + "bom-ref": "7f067700b9840b49", "name": "/var/lib/dpkg/info/libmagic-mgc.list", "type": "file" }, { - "bom-ref": "906f71099610ce5d", + "bom-ref": "28e9033a1498e1b7", "name": "/var/lib/dpkg/info/libmagic-mgc.md5sums", "type": "file" }, { - "bom-ref": "2a07198abc26f7a3", + "bom-ref": "4f3a94871a913bf1", "name": "/var/lib/dpkg/info/libmagic1t64:amd64.conffiles", "type": "file" }, { - "bom-ref": "13cdd127290c3084", + "bom-ref": "069ed8f614a305ba", "name": "/var/lib/dpkg/info/libmagic1t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "9a75828754bf53cf", + "bom-ref": "52dbed02571e6f71", "name": "/var/lib/dpkg/info/libmd-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "52c751e68abb310f", + "bom-ref": "84438ff94dc145dd", "name": "/var/lib/dpkg/info/libmd0:amd64.md5sums", "type": "file" }, { - "bom-ref": "6cd4acd298807bcc", + "bom-ref": "858c8b0abd4fd156", "name": "/var/lib/dpkg/info/libmount1:amd64.md5sums", "type": "file" }, { - "bom-ref": "c2a2039dbe6578f4", + "bom-ref": "c9e208385dc928ee", "name": "/var/lib/dpkg/info/libmp3lame0:amd64.md5sums", "type": "file" }, { - "bom-ref": "4b6da30f0a3b34d5", + "bom-ref": "47493ceb6fd29728", "name": "/var/lib/dpkg/info/libmpc3:amd64.md5sums", "type": "file" }, { - "bom-ref": "7c84c20a9239607c", + "bom-ref": "f9c4f60496834b09", "name": "/var/lib/dpkg/info/libmpfr6:amd64.md5sums", "type": "file" }, { - "bom-ref": "d9878eaa9e8430f4", + "bom-ref": "5189c823858e3f96", "name": "/var/lib/dpkg/info/libmpg123-0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "412fc5dce176e495", + "bom-ref": "3e3884dec5a982a5", "name": "/var/lib/dpkg/info/libnccl-dev.list", "type": "file" }, { - "bom-ref": "91682311e0cf608b", + "bom-ref": "3b7b8c9d0ec07962", "name": "/var/lib/dpkg/info/libnccl-dev.md5sums", "type": "file" }, { - "bom-ref": "326f99877c9ca3fb", + "bom-ref": "d0782389add322ae", + "name": "/var/lib/dpkg/info/libnccl-ofi-ngc-v3.list", + "type": "file" + }, + { + "bom-ref": "3903b76b5d548c15", + "name": "/var/lib/dpkg/info/libnccl-ofi-ngc-v3.md5sums", + "type": "file" + }, + { + "bom-ref": "70d014b55aaa0db0", "name": "/var/lib/dpkg/info/libnccl2.list", "type": "file" }, { - "bom-ref": "fb10e8a9b9a7c751", + "bom-ref": "b83b672822cb93e2", "name": "/var/lib/dpkg/info/libnccl2.md5sums", "type": "file" }, { - "bom-ref": "5daa4e979a74f530", + "bom-ref": "c6fafcc2a2d99b73", "name": "/var/lib/dpkg/info/libnccl2.triggers", "type": "file" }, { - "bom-ref": "0fc95e7267e858b6", + "bom-ref": "e298ce712d369c08", "name": "/var/lib/dpkg/info/libncurses-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "ef921a0fa98ccd4d", + "bom-ref": "e725634f611ca918", "name": "/var/lib/dpkg/info/libncurses6:amd64.md5sums", "type": "file" }, { - "bom-ref": "6a3b999bfafd139e", + "bom-ref": "6be1787c6cf4e5fc", "name": "/var/lib/dpkg/info/libncursesw6:amd64.md5sums", "type": "file" }, { - "bom-ref": "20496fc6dac04f4d", + "bom-ref": "1daa7961fbf89c5b", "name": "/var/lib/dpkg/info/libnettle8t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "31f200616dc98ee3", + "bom-ref": "e69e48238555421c", "name": "/var/lib/dpkg/info/libnghttp2-14:amd64.md5sums", "type": "file" }, { - "bom-ref": "cd8849bf24868d7d", + "bom-ref": "59d368a1cacd8972", "name": "/var/lib/dpkg/info/libnl-3-200:amd64.conffiles", "type": "file" }, { - "bom-ref": "b3fe5496164bc3d7", + "bom-ref": "e2c4a20af8ddc9c0", "name": "/var/lib/dpkg/info/libnl-3-200:amd64.md5sums", "type": "file" }, { - "bom-ref": "94df04712925f430", + "bom-ref": "92acb3fc5636b223", "name": "/var/lib/dpkg/info/libnl-3-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "5398e489b4124ae7", + "bom-ref": "4c66c96239f4ff8c", "name": "/var/lib/dpkg/info/libnl-route-3-200:amd64.md5sums", "type": "file" }, { - "bom-ref": "1e61d131823326fc", + "bom-ref": "e6d67a6d5600d073", "name": "/var/lib/dpkg/info/libnl-route-3-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "63c4eeab508ba865", + "bom-ref": "83e1b69ed6585937", "name": "/var/lib/dpkg/info/libnorm-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "ac21e1f587161fb8", + "bom-ref": "a6d3e9729b9aaa06", "name": "/var/lib/dpkg/info/libnorm1t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "b755156ca68727a0", - "name": "/var/lib/dpkg/info/libnpp-13-2.list", + "bom-ref": "ced63cc57fd42377", + "name": "/var/lib/dpkg/info/libnpp-13-4.list", "type": "file" }, { - "bom-ref": "fb1f73027a3a70b3", - "name": "/var/lib/dpkg/info/libnpp-13-2.md5sums", + "bom-ref": "ca760bd75201e291", + "name": "/var/lib/dpkg/info/libnpp-13-4.md5sums", "type": "file" }, { - "bom-ref": "c63a8f7ae2ae6470", - "name": "/var/lib/dpkg/info/libnpp-dev-13-2.list", + "bom-ref": "1a0430d38acb95e0", + "name": "/var/lib/dpkg/info/libnpp-dev-13-4.list", "type": "file" }, { - "bom-ref": "7414d4d86c46f2b4", - "name": "/var/lib/dpkg/info/libnpp-dev-13-2.md5sums", + "bom-ref": "1cf297a90b6533b1", + "name": "/var/lib/dpkg/info/libnpp-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "16caeb898247ccf0", + "bom-ref": "1dc71080cb8bc5e2", "name": "/var/lib/dpkg/info/libnpth0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "13d09e606765aef9", + "bom-ref": "58e69cb2f2794580", "name": "/var/lib/dpkg/info/libnuma-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "7b6561ac925f59c7", + "bom-ref": "7f63c628e767d724", "name": "/var/lib/dpkg/info/libnuma1:amd64.md5sums", "type": "file" }, { - "bom-ref": "d4e5d4c55add5a0c", - "name": "/var/lib/dpkg/info/libnvfatbin-13-2.list", + "bom-ref": "0cfd8621f6146c87", + "name": "/var/lib/dpkg/info/libnvfatbin-13-4.list", "type": "file" }, { - "bom-ref": "5f3d0c09cdb5a7a1", - "name": "/var/lib/dpkg/info/libnvfatbin-13-2.md5sums", + "bom-ref": "a8c281afcc313ab3", + "name": "/var/lib/dpkg/info/libnvfatbin-13-4.md5sums", "type": "file" }, { - "bom-ref": "3c35369a475495d4", - "name": "/var/lib/dpkg/info/libnvfatbin-dev-13-2.list", + "bom-ref": "5de708abb0211b03", + "name": "/var/lib/dpkg/info/libnvfatbin-dev-13-4.list", "type": "file" }, { - "bom-ref": "0a7fd1ba1819c7b2", - "name": "/var/lib/dpkg/info/libnvfatbin-dev-13-2.md5sums", + "bom-ref": "c5ce876f861b32a1", + "name": "/var/lib/dpkg/info/libnvfatbin-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "793bc2b073ad906d", - "name": "/var/lib/dpkg/info/libnvjitlink-13-2.list", + "bom-ref": "6e71d2ae0cc727c4", + "name": "/var/lib/dpkg/info/libnvjitlink-13-4.list", "type": "file" }, { - "bom-ref": "a6289bd8aedb08e3", - "name": "/var/lib/dpkg/info/libnvjitlink-13-2.md5sums", + "bom-ref": "1d9ce9e6da55cad3", + "name": "/var/lib/dpkg/info/libnvjitlink-13-4.md5sums", "type": "file" }, { - "bom-ref": "1e8975cc1677ea9a", - "name": "/var/lib/dpkg/info/libnvjitlink-dev-13-2.list", + "bom-ref": "151b3b3a26d878bb", + "name": "/var/lib/dpkg/info/libnvjitlink-dev-13-4.list", "type": "file" }, { - "bom-ref": "6c1d6c51d62cca78", - "name": "/var/lib/dpkg/info/libnvjitlink-dev-13-2.md5sums", + "bom-ref": "f02a696e4801be5b", + "name": "/var/lib/dpkg/info/libnvjitlink-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "98ebfbe7f3f71470", - "name": "/var/lib/dpkg/info/libnvjpeg-13-2.list", + "bom-ref": "bfb125297928f218", + "name": "/var/lib/dpkg/info/libnvjpeg-13-4.list", "type": "file" }, { - "bom-ref": "604886e2c289f3bc", - "name": "/var/lib/dpkg/info/libnvjpeg-13-2.md5sums", + "bom-ref": "d2d0499072d2484e", + "name": "/var/lib/dpkg/info/libnvjpeg-13-4.md5sums", "type": "file" }, { - "bom-ref": "b8fc8c183902b5ae", - "name": "/var/lib/dpkg/info/libnvjpeg-dev-13-2.list", + "bom-ref": "18afc5300dbbb853", + "name": "/var/lib/dpkg/info/libnvjpeg-dev-13-4.list", "type": "file" }, { - "bom-ref": "5c5c8e736f63407f", - "name": "/var/lib/dpkg/info/libnvjpeg-dev-13-2.md5sums", + "bom-ref": "a77863a69f9eb325", + "name": "/var/lib/dpkg/info/libnvjpeg-dev-13-4.md5sums", "type": "file" }, { - "bom-ref": "04064bcfe8521beb", - "name": "/var/lib/dpkg/info/libnvptxcompiler-13-2.list", + "bom-ref": "ac97fb35ee3fb6d1", + "name": "/var/lib/dpkg/info/libnvptxcompiler-13-4.list", "type": "file" }, { - "bom-ref": "0418da8c9a3fdd5e", - "name": "/var/lib/dpkg/info/libnvptxcompiler-13-2.md5sums", + "bom-ref": "ba19595afc8e5c5e", + "name": "/var/lib/dpkg/info/libnvptxcompiler-13-4.md5sums", "type": "file" }, { - "bom-ref": "b142649b53230095", + "bom-ref": "381b5086f90e2bd6", "name": "/var/lib/dpkg/info/libnvshmem3-cuda-13.list", "type": "file" }, { - "bom-ref": "459e790d8a7e37af", + "bom-ref": "a81d58af288bc1f0", "name": "/var/lib/dpkg/info/libnvshmem3-cuda-13.md5sums", "type": "file" }, { - "bom-ref": "6e62bce92676128e", + "bom-ref": "be5fa0f07d91710b", "name": "/var/lib/dpkg/info/libnvshmem3-dev-cuda-13.list", "type": "file" }, { - "bom-ref": "b70d92ff68617684", + "bom-ref": "6dd2b71f2f1a3c95", "name": "/var/lib/dpkg/info/libnvshmem3-dev-cuda-13.md5sums", "type": "file" }, { - "bom-ref": "0e4a61a2d21c0dd7", + "bom-ref": "61598491952cbe56", "name": "/var/lib/dpkg/info/libnvshmem3-static-cuda-13.list", "type": "file" }, { - "bom-ref": "a37e1af9f981877e", + "bom-ref": "b738854be6a16643", "name": "/var/lib/dpkg/info/libnvshmem3-static-cuda-13.md5sums", "type": "file" }, { - "bom-ref": "a9502bc57ee2035b", - "name": "/var/lib/dpkg/info/libnvvm-13-2.list", + "bom-ref": "6b08f1d1a250277d", + "name": "/var/lib/dpkg/info/libnvvm-13-4.list", "type": "file" }, { - "bom-ref": "07da4262486c9c97", - "name": "/var/lib/dpkg/info/libnvvm-13-2.md5sums", + "bom-ref": "78821a443bf245fe", + "name": "/var/lib/dpkg/info/libnvvm-13-4.md5sums", "type": "file" }, { - "bom-ref": "240c48ecd35202be", + "bom-ref": "507f2155bef99db0", "name": "/var/lib/dpkg/info/libobjc-13-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "abb3e87aff733667", + "bom-ref": "633c9d4f41e524b5", "name": "/var/lib/dpkg/info/libobjc4:amd64.md5sums", "type": "file" }, { - "bom-ref": "506d228991844e52", + "bom-ref": "99a55b9e66ec7b78", "name": "/var/lib/dpkg/info/libogg0:amd64.md5sums", "type": "file" }, { - "bom-ref": "064b7b4eab36c125", + "bom-ref": "0c463335740df984", "name": "/var/lib/dpkg/info/libonig5:amd64.md5sums", "type": "file" }, { - "bom-ref": "fbb2c6c979597f59", + "bom-ref": "1e360c189e00192f", "name": "/var/lib/dpkg/info/libopencore-amrnb0:amd64.md5sums", "type": "file" }, { - "bom-ref": "ae7758420f5b15f7", + "bom-ref": "5dced4f8936768f1", "name": "/var/lib/dpkg/info/libopencore-amrwb0:amd64.md5sums", "type": "file" }, { - "bom-ref": "d606133f4060c70c", + "bom-ref": "ec250a1b7459ed26", "name": "/var/lib/dpkg/info/libopus0:amd64.md5sums", "type": "file" }, { - "bom-ref": "619ce15ffddd946c", + "bom-ref": "cd516d33a153011a", "name": "/var/lib/dpkg/info/libp11-kit0:amd64.md5sums", "type": "file" }, { - "bom-ref": "199b65d6c514f5e0", + "bom-ref": "9c5df69397d304ba", "name": "/var/lib/dpkg/info/libpam-modules-bin.list", "type": "file" }, { - "bom-ref": "932971ad4f12fb6a", + "bom-ref": "a057ffc866b0ca68", "name": "/var/lib/dpkg/info/libpam-modules-bin.md5sums", "type": "file" }, { - "bom-ref": "1c7b3a9b2ed66aa3", + "bom-ref": "bb4b45e8bea0a041", "name": "/var/lib/dpkg/info/libpam-modules-bin.postinst", "type": "file" }, { - "bom-ref": "a82a41c739f41086", + "bom-ref": "7f2059d041a006e4", "name": "/var/lib/dpkg/info/libpam-modules-bin.postrm", "type": "file" }, { - "bom-ref": "3801173ef0ef37c4", + "bom-ref": "477c03c9f412d05a", "name": "/var/lib/dpkg/info/libpam-modules-bin.prerm", "type": "file" }, { - "bom-ref": "a0fa53d19cbc838a", + "bom-ref": "2a394519269ec708", "name": "/var/lib/dpkg/info/libpam-modules:amd64.conffiles", "type": "file" }, { - "bom-ref": "1878683aee910214", + "bom-ref": "3a633f30b9c5bbe6", "name": "/var/lib/dpkg/info/libpam-modules:amd64.md5sums", "type": "file" }, { - "bom-ref": "a90325d260f30e26", + "bom-ref": "1eb575e75e533cc0", "name": "/var/lib/dpkg/info/libpam-runtime.conffiles", "type": "file" }, { - "bom-ref": "7312a1d68aba7423", + "bom-ref": "884b6b0344c7b785", "name": "/var/lib/dpkg/info/libpam-runtime.list", "type": "file" }, { - "bom-ref": "2912c2da74129bf2", + "bom-ref": "54f26121451cd7bc", "name": "/var/lib/dpkg/info/libpam-runtime.md5sums", "type": "file" }, { - "bom-ref": "fee593a130bde914", + "bom-ref": "e7585340b1037d9a", "name": "/var/lib/dpkg/info/libpam-runtime.postinst", "type": "file" }, { - "bom-ref": "1cd4af943891ae99", + "bom-ref": "04a26b79cf41be13", "name": "/var/lib/dpkg/info/libpam-runtime.postrm", "type": "file" }, { - "bom-ref": "e7fa97773432adf1", + "bom-ref": "8f61603207922a0b", "name": "/var/lib/dpkg/info/libpam-runtime.prerm", "type": "file" }, { - "bom-ref": "52e44b9df4dcebb1", + "bom-ref": "23a7fd2e526ef9f7", "name": "/var/lib/dpkg/info/libpam-runtime.templates", "type": "file" }, { - "bom-ref": "6509a325473a9848", + "bom-ref": "7a472678d693dd86", "name": "/var/lib/dpkg/info/libpam0g:amd64.md5sums", "type": "file" }, { - "bom-ref": "02fe38885290ea39", + "bom-ref": "98f98d06ceead25f", "name": "/var/lib/dpkg/info/libpango-1.0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "485019d1697602cd", + "bom-ref": "39eacee426179763", "name": "/var/lib/dpkg/info/libpangocairo-1.0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "d3e4112fcd11927b", + "bom-ref": "6f263bcc8d226789", "name": "/var/lib/dpkg/info/libpangoft2-1.0-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "07f44e8f1e2c1116", + "bom-ref": "0df0a9144617aa18", "name": "/var/lib/dpkg/info/libpathplan4:amd64.md5sums", "type": "file" }, { - "bom-ref": "fdb67e4821085297", + "bom-ref": "5afda7633042e9e4", "name": "/var/lib/dpkg/info/libpci3:amd64.md5sums", "type": "file" }, { - "bom-ref": "b459db3e61153334", + "bom-ref": "9dfb975c8e4354c6", "name": "/var/lib/dpkg/info/libpcre2-8-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "ef85dba73ba5d7e5", + "bom-ref": "31acbd0a6c357e18", "name": "/var/lib/dpkg/info/libperl5.38t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "f824471f592006bf", + "bom-ref": "f99e3ddafe7250f1", "name": "/var/lib/dpkg/info/libpfm4:amd64.md5sums", "type": "file" }, { - "bom-ref": "937bc438ae85414a", + "bom-ref": "439d2b543e579a1c", "name": "/var/lib/dpkg/info/libpgm-5.3-0t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "38fa56c5b27690df", + "bom-ref": "97691b7340a6f285", "name": "/var/lib/dpkg/info/libpgm-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "7ae4971d883f07cc", + "bom-ref": "686e440523d0dc9a", "name": "/var/lib/dpkg/info/libpixman-1-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "0a26ba2a703923c0", + "bom-ref": "d24a697cc885bc2c", "name": "/var/lib/dpkg/info/libpkgconf3:amd64.md5sums", "type": "file" }, { - "bom-ref": "595d14e523cba871", + "bom-ref": "fd3f7041a2d18ac0", "name": "/var/lib/dpkg/info/libpmi2-0-dev.list", "type": "file" }, { - "bom-ref": "92b75c9b9f318249", + "bom-ref": "9d577677706442c8", "name": "/var/lib/dpkg/info/libpmi2-0-dev.md5sums", "type": "file" }, { - "bom-ref": "8d85a6477ed035cc", + "bom-ref": "cb60a8ee23efa1d1", "name": "/var/lib/dpkg/info/libpmi2-0t64.list", "type": "file" }, { - "bom-ref": "30d62d341b44ad8b", + "bom-ref": "1f4625b4d9ce97a6", "name": "/var/lib/dpkg/info/libpmi2-0t64.md5sums", "type": "file" }, { - "bom-ref": "fe59b371e3aa77c2", + "bom-ref": "160344ddc740216f", "name": "/var/lib/dpkg/info/libpmi2-0t64.shlibs", "type": "file" }, { - "bom-ref": "16f5b49cbf164c30", + "bom-ref": "f4243bcef9a2eb4d", "name": "/var/lib/dpkg/info/libpmi2-0t64.symbols", "type": "file" }, { - "bom-ref": "1dd81504d430474a", + "bom-ref": "995cfee4979c1503", "name": "/var/lib/dpkg/info/libpmi2-0t64.triggers", "type": "file" }, { - "bom-ref": "745837d739b0ba2d", + "bom-ref": "756515780eeb6633", "name": "/var/lib/dpkg/info/libpng-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "a3f040e910afac0f", + "bom-ref": "2f371474db0a944d", "name": "/var/lib/dpkg/info/libpng16-16t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "b28f63a957bc4a6a", + "bom-ref": "df43fe716e13fa00", "name": "/var/lib/dpkg/info/libproc2-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "5498e52dd06de689", + "bom-ref": "9aa664acec23473b", "name": "/var/lib/dpkg/info/libprotobuf-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "224cb5daf40045b9", + "bom-ref": "0bfe4bc024cc046f", "name": "/var/lib/dpkg/info/libprotobuf-lite32t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "ff08fa408cce1864", + "bom-ref": "2bc2b6be444aef92", "name": "/var/lib/dpkg/info/libprotobuf32t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "41182ae7e7f3b4a2", + "bom-ref": "cc6247ae5ba96bfc", "name": "/var/lib/dpkg/info/libprotoc32t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "1dfd2fedde27a5b9", + "bom-ref": "2c6e68140434f7f2", "name": "/var/lib/dpkg/info/libpsl5t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "a4803db7d34539cc", + "bom-ref": "e94610cedb41de16", "name": "/var/lib/dpkg/info/libpython3-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "76bcedaace4fb4a1", + "bom-ref": "f61db1320644303b", "name": "/var/lib/dpkg/info/libpython3-stdlib:amd64.md5sums", "type": "file" }, { - "bom-ref": "6908418bc62e5883", + "bom-ref": "ac69b69c31d69289", "name": "/var/lib/dpkg/info/libpython3.12-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "51094c7a6377ccde", + "bom-ref": "681e8fc6839578fa", "name": "/var/lib/dpkg/info/libpython3.12-minimal:amd64.conffiles", "type": "file" }, { - "bom-ref": "69631916d321b6d3", + "bom-ref": "0e0ed1a2cb10281b", "name": "/var/lib/dpkg/info/libpython3.12-minimal:amd64.md5sums", "type": "file" }, { - "bom-ref": "d96e00d55796f4b5", + "bom-ref": "c71c88dc5cb3f2c1", "name": "/var/lib/dpkg/info/libpython3.12-stdlib:amd64.md5sums", "type": "file" }, { - "bom-ref": "45c1f8be484a72d4", + "bom-ref": "857473e969d48684", "name": "/var/lib/dpkg/info/libpython3.12t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "c69520f455d8ced0", + "bom-ref": "6e0e73604a133019", "name": "/var/lib/dpkg/info/libquadmath0:amd64.md5sums", "type": "file" }, { - "bom-ref": "f6eb679e57d2c7fc", + "bom-ref": "d608bcb8bf20afe6", "name": "/var/lib/dpkg/info/libre2-10:amd64.md5sums", "type": "file" }, { - "bom-ref": "1d71a62cab64305d", + "bom-ref": "af599b258d164167", "name": "/var/lib/dpkg/info/libre2-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "81b1805a77a75b7c", + "bom-ref": "5ba120e584ad4e09", "name": "/var/lib/dpkg/info/libreadline8t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "66d6167f5dcac5e9", + "bom-ref": "3a94238e442a9d9e", "name": "/var/lib/dpkg/info/librtmp1:amd64.md5sums", "type": "file" }, { - "bom-ref": "bcaffbf1808069b3", + "bom-ref": "f7f8ad40038b4874", "name": "/var/lib/dpkg/info/libsasl2-2:amd64.md5sums", "type": "file" }, { - "bom-ref": "880939cab3fb4c41", + "bom-ref": "c8b73905163ac4ae", "name": "/var/lib/dpkg/info/libsasl2-modules-db:amd64.md5sums", "type": "file" }, { - "bom-ref": "0062a49753fcfbb9", + "bom-ref": "2fdeaa5037e9cf7b", "name": "/var/lib/dpkg/info/libseccomp2:amd64.md5sums", "type": "file" }, { - "bom-ref": "af59a14b87ec25c1", + "bom-ref": "cce829c5f436d09f", "name": "/var/lib/dpkg/info/libselinux1:amd64.md5sums", "type": "file" }, { - "bom-ref": "332e7fd0ccabdbcc", + "bom-ref": "7427cc49b2ed4da6", "name": "/var/lib/dpkg/info/libsemanage-common.conffiles", "type": "file" }, { - "bom-ref": "8e73add819c0698e", + "bom-ref": "1fa49a854489ba40", "name": "/var/lib/dpkg/info/libsemanage-common.list", "type": "file" }, { - "bom-ref": "e9b74305dde8d54f", + "bom-ref": "19de93d1934c59a5", "name": "/var/lib/dpkg/info/libsemanage-common.md5sums", "type": "file" }, { - "bom-ref": "b0ad99b85cdbae41", + "bom-ref": "d61bc84950a0cd17", "name": "/var/lib/dpkg/info/libsemanage2:amd64.md5sums", "type": "file" }, { - "bom-ref": "60a613402d28f2dd", + "bom-ref": "8019131f4800a3df", "name": "/var/lib/dpkg/info/libsepol2:amd64.md5sums", "type": "file" }, { - "bom-ref": "7f0babe2f5b9e93f", + "bom-ref": "53512b8de9c5ad8d", "name": "/var/lib/dpkg/info/libsframe1:amd64.md5sums", "type": "file" }, { - "bom-ref": "5918390c40f77b44", + "bom-ref": "68b608a980d8f116", "name": "/var/lib/dpkg/info/libsharpyuv0:amd64.md5sums", "type": "file" }, { - "bom-ref": "3d824419bce8c151", + "bom-ref": "6814ef252de72a9c", "name": "/var/lib/dpkg/info/libslurm40t64.list", "type": "file" }, { - "bom-ref": "bc913934f99f9e06", + "bom-ref": "796a49c3cd7226af", "name": "/var/lib/dpkg/info/libslurm40t64.md5sums", "type": "file" }, { - "bom-ref": "47f9f6ddb201dfc8", + "bom-ref": "bf01da38bb2db739", "name": "/var/lib/dpkg/info/libslurm40t64.shlibs", "type": "file" }, { - "bom-ref": "ca79a2b22c6743af", + "bom-ref": "afbedfa355fb3d6a", "name": "/var/lib/dpkg/info/libslurm40t64.symbols", "type": "file" }, { - "bom-ref": "1b6b1137d90abc47", + "bom-ref": "0dbe67dc676acaba", "name": "/var/lib/dpkg/info/libslurm40t64.triggers", "type": "file" }, { - "bom-ref": "ccf47d67a34a11fb", + "bom-ref": "5c9f573fcfe8b319", "name": "/var/lib/dpkg/info/libsm6:amd64.md5sums", "type": "file" }, { - "bom-ref": "3fd031dbf72d74aa", + "bom-ref": "128a0eba1ca803a0", "name": "/var/lib/dpkg/info/libsmartcols1:amd64.md5sums", "type": "file" }, { - "bom-ref": "c01f33bb733a7c12", + "bom-ref": "69567824e22293c0", "name": "/var/lib/dpkg/info/libsnappy-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "8ee4325d9f5a2051", + "bom-ref": "5afe1734b5c65a67", "name": "/var/lib/dpkg/info/libsnappy1v5:amd64.md5sums", "type": "file" }, { - "bom-ref": "a60949faa5b658b2", + "bom-ref": "93468690d4c06c74", "name": "/var/lib/dpkg/info/libsndfile1:amd64.md5sums", "type": "file" }, { - "bom-ref": "9d6c668a59a883fe", + "bom-ref": "6b8ed38a02f5d534", "name": "/var/lib/dpkg/info/libsodium-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "c67ecc668473288c", + "bom-ref": "055d853a98b492fc", "name": "/var/lib/dpkg/info/libsodium23:amd64.md5sums", "type": "file" }, { - "bom-ref": "37675a1040f38609", + "bom-ref": "a4726edf884ad823", "name": "/var/lib/dpkg/info/libsource-highlight-common.list", "type": "file" }, { - "bom-ref": "e6e777a31f2ab2bb", + "bom-ref": "bf74509b83361b29", "name": "/var/lib/dpkg/info/libsource-highlight-common.md5sums", "type": "file" }, { - "bom-ref": "d7837d084634ab0e", + "bom-ref": "03975eb54db8e6a8", "name": "/var/lib/dpkg/info/libsource-highlight4t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "12076e1c4bd763ec", + "bom-ref": "2f78b22052f9c95e", "name": "/var/lib/dpkg/info/libsox-fmt-alsa:amd64.md5sums", "type": "file" }, { - "bom-ref": "4cd298aeb5dd8898", + "bom-ref": "1b175dea8c6e4882", "name": "/var/lib/dpkg/info/libsox-fmt-base:amd64.md5sums", "type": "file" }, { - "bom-ref": "c0780b71b6435e28", + "bom-ref": "d3ab4119b98a8086", "name": "/var/lib/dpkg/info/libsox3:amd64.md5sums", "type": "file" }, { - "bom-ref": "29a2ef7577e737f1", + "bom-ref": "cf5f06eccea9511c", "name": "/var/lib/dpkg/info/libsqlite3-0:amd64.md5sums", "type": "file" }, { - "bom-ref": "ec88c1c2bc688e73", + "bom-ref": "8d1204f7f6f7e769", "name": "/var/lib/dpkg/info/libss2:amd64.md5sums", "type": "file" }, { - "bom-ref": "cd61344b3e3249c4", + "bom-ref": "a45866afb26cc49f", "name": "/var/lib/dpkg/info/libssh-4:amd64.md5sums", "type": "file" }, { - "bom-ref": "4e5728c60a0102a7", + "bom-ref": "46c8895872bb0cd5", "name": "/var/lib/dpkg/info/libssl3t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "d13d4943db4b0a09", + "bom-ref": "3877e5e77a8a72a0", "name": "/var/lib/dpkg/info/libstdc++-13-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "17265ec849bc7521", + "bom-ref": "8ffdcf29e6cd4df3", "name": "/var/lib/dpkg/info/libstdc++-14-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "d490546f46ba9b35", + "bom-ref": "b213ae457ca206a7", "name": "/var/lib/dpkg/info/libstdc++6:amd64.md5sums", "type": "file" }, { - "bom-ref": "00d196860d025ffb", + "bom-ref": "26edbd72f026f995", "name": "/var/lib/dpkg/info/libsystemd0:amd64.md5sums", "type": "file" }, { - "bom-ref": "5ef2ac13f980a70c", + "bom-ref": "198cdb9162e607c6", "name": "/var/lib/dpkg/info/libtasn1-6:amd64.md5sums", "type": "file" }, { - "bom-ref": "a11e036db4a5e8ab", + "bom-ref": "c9aaa173c0b00dc2", "name": "/var/lib/dpkg/info/libtcmalloc-minimal4t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "03cbc4fb3674f22b", + "bom-ref": "38a8367b6a1c2e19", "name": "/var/lib/dpkg/info/libthai-data.list", "type": "file" }, { - "bom-ref": "4632e3f8300431e0", + "bom-ref": "7a5d97245794a4f2", "name": "/var/lib/dpkg/info/libthai-data.md5sums", "type": "file" }, { - "bom-ref": "26cb4ff453ea8b96", + "bom-ref": "34bf3d76ddda3684", "name": "/var/lib/dpkg/info/libthai0:amd64.md5sums", "type": "file" }, { - "bom-ref": "cc99ab46379953c6", + "bom-ref": "7e644b7d21c4102c", "name": "/var/lib/dpkg/info/libtiff6:amd64.md5sums", "type": "file" }, { - "bom-ref": "1025d0c818826c58", + "bom-ref": "c12d65031eb79686", "name": "/var/lib/dpkg/info/libtinfo6:amd64.md5sums", "type": "file" }, { - "bom-ref": "a682a8d3d6c258a6", + "bom-ref": "aead6aec78ac4558", "name": "/var/lib/dpkg/info/libtool.list", "type": "file" }, { - "bom-ref": "9e51f97dbc7ba446", + "bom-ref": "6c18f229f5d80688", "name": "/var/lib/dpkg/info/libtool.md5sums", "type": "file" }, { - "bom-ref": "562d872ca358eabf", + "bom-ref": "4488084ff95f86a6", "name": "/var/lib/dpkg/info/libtsan2:amd64.md5sums", "type": "file" }, { - "bom-ref": "2d1f4b7be66fcac7", + "bom-ref": "a17973ebdd5ca116", "name": "/var/lib/dpkg/info/libubsan1:amd64.md5sums", "type": "file" }, { - "bom-ref": "8b762865d3e6a962", + "bom-ref": "3ced188da3ce2a4c", "name": "/var/lib/dpkg/info/libudev1:amd64.md5sums", "type": "file" }, { - "bom-ref": "6793da0af4a9787e", + "bom-ref": "40062f71f9527aec", "name": "/var/lib/dpkg/info/libunistring5:amd64.md5sums", "type": "file" }, { - "bom-ref": "e3afb7188cc4769b", + "bom-ref": "cdfeb20fe53c5425", "name": "/var/lib/dpkg/info/libunwind-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "cf2a90262988daa7", + "bom-ref": "999a42634d8ccbe5", "name": "/var/lib/dpkg/info/libunwind8:amd64.md5sums", "type": "file" }, { - "bom-ref": "4a382b3c7c8c524e", + "bom-ref": "bb8ea476c3681a28", "name": "/var/lib/dpkg/info/libuuid1:amd64.md5sums", "type": "file" }, { - "bom-ref": "be92ee4affae4822", + "bom-ref": "4b5405e12de50840", "name": "/var/lib/dpkg/info/libvorbis0a:amd64.md5sums", "type": "file" }, { - "bom-ref": "ed2e7c4c4f3e0136", + "bom-ref": "a60d20d7f5d502e0", "name": "/var/lib/dpkg/info/libvorbisenc2:amd64.md5sums", "type": "file" }, { - "bom-ref": "eb597c4b39412e21", + "bom-ref": "c9ff3e50c2026e0f", "name": "/var/lib/dpkg/info/libvorbisfile3:amd64.md5sums", "type": "file" }, { - "bom-ref": "7da5015133fc125b", + "bom-ref": "2dd4343c8638fab5", "name": "/var/lib/dpkg/info/libwavpack1:amd64.md5sums", "type": "file" }, { - "bom-ref": "62fb03fc1ecf434f", + "bom-ref": "2c7a0b678ea13925", "name": "/var/lib/dpkg/info/libwebp7:amd64.md5sums", "type": "file" }, { - "bom-ref": "8dd9df63225a9578", + "bom-ref": "402c3c4e1511cd1e", "name": "/var/lib/dpkg/info/libx11-6:amd64.md5sums", "type": "file" }, { - "bom-ref": "e53d04e6138b1909", + "bom-ref": "c1ec2eef35d347a3", "name": "/var/lib/dpkg/info/libx11-data.list", "type": "file" }, { - "bom-ref": "1c7dca618bfa7465", + "bom-ref": "dd80ac39e245d3eb", "name": "/var/lib/dpkg/info/libx11-data.md5sums", "type": "file" }, { - "bom-ref": "04eb712eb1c4d55a", + "bom-ref": "41e91fd257a1e9c4", "name": "/var/lib/dpkg/info/libxau6:amd64.md5sums", "type": "file" }, { - "bom-ref": "e2502a28240edc11", + "bom-ref": "f792bac3e4bcf2e7", "name": "/var/lib/dpkg/info/libxaw7:amd64.md5sums", "type": "file" }, { - "bom-ref": "6c561c52611ebb11", + "bom-ref": "d3c49ea8b4760393", "name": "/var/lib/dpkg/info/libxcb-render0:amd64.md5sums", "type": "file" }, { - "bom-ref": "1f79276ef68dc0aa", + "bom-ref": "63719182f8b37108", "name": "/var/lib/dpkg/info/libxcb-shm0:amd64.md5sums", "type": "file" }, { - "bom-ref": "a4921c4a3e56ab78", + "bom-ref": "8dd1b5a0515170b2", "name": "/var/lib/dpkg/info/libxcb1:amd64.md5sums", "type": "file" }, { - "bom-ref": "07eed06e035977a9", + "bom-ref": "e26d0a94e9d62ca7", "name": "/var/lib/dpkg/info/libxdmcp6:amd64.md5sums", "type": "file" }, { - "bom-ref": "60b409fbc403402a", + "bom-ref": "43118fb07a85e5b8", "name": "/var/lib/dpkg/info/libxext6:amd64.md5sums", "type": "file" }, { - "bom-ref": "409c3e561e8b839e", + "bom-ref": "dc1357f96bcf7b74", "name": "/var/lib/dpkg/info/libxml2-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "c6889671881b11b8", + "bom-ref": "4c113166573178c6", "name": "/var/lib/dpkg/info/libxml2:amd64.md5sums", "type": "file" }, { - "bom-ref": "3ef5b0e36988253c", + "bom-ref": "7e3cbd7b26ec170e", "name": "/var/lib/dpkg/info/libxmu6:amd64.md5sums", "type": "file" }, { - "bom-ref": "b73c082f6e24fdcc", + "bom-ref": "a5d4f10ed32620f6", "name": "/var/lib/dpkg/info/libxpm4:amd64.md5sums", "type": "file" }, { - "bom-ref": "fcfa91f4aeddf045", + "bom-ref": "62a80fe2674e552b", "name": "/var/lib/dpkg/info/libxrender1:amd64.md5sums", "type": "file" }, { - "bom-ref": "7a84603e5ae16c2a", + "bom-ref": "2ccdc9a88ae88084", "name": "/var/lib/dpkg/info/libxt6t64:amd64.md5sums", "type": "file" }, { - "bom-ref": "356864c1dc4685d8", + "bom-ref": "e258d12cf8d2044a", "name": "/var/lib/dpkg/info/libxxhash0:amd64.md5sums", "type": "file" }, { - "bom-ref": "67da40e2dcbb2969", + "bom-ref": "4656213ee5c3db6b", "name": "/var/lib/dpkg/info/libyaml-0-2:amd64.md5sums", "type": "file" }, { - "bom-ref": "0ee459396131f520", + "bom-ref": "f5a91624abc554c2", "name": "/var/lib/dpkg/info/libz3-4:amd64.md5sums", "type": "file" }, { - "bom-ref": "6a4e8b92a6de3c14", + "bom-ref": "227ec508d69f6176", "name": "/var/lib/dpkg/info/libz3-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "e7448924ded853eb", + "bom-ref": "e1959ffe5d7fea11", "name": "/var/lib/dpkg/info/libzmq3-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "2141a37fb8ad27f8", + "bom-ref": "a23661b75c3bcaea", "name": "/var/lib/dpkg/info/libzmq5:amd64.md5sums", "type": "file" }, { - "bom-ref": "5689cdd071bbedd3", + "bom-ref": "bcc56cbc544aaf85", "name": "/var/lib/dpkg/info/libzstd-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "d9a8be9f17184f79", + "bom-ref": "50c9a5fc03f8be37", "name": "/var/lib/dpkg/info/libzstd1:amd64.md5sums", "type": "file" }, { - "bom-ref": "9e3c6561b02e4d38", + "bom-ref": "492240ea4e34a2bf", "name": "/var/lib/dpkg/info/linux-libc-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "bea0b3018153939c", + "bom-ref": "eeadfa50acd47e52", "name": "/var/lib/dpkg/info/lld-18.list", "type": "file" }, { - "bom-ref": "5b88db9db2d7850d", + "bom-ref": "ad66e74b092c9987", "name": "/var/lib/dpkg/info/lld-18.md5sums", "type": "file" }, { - "bom-ref": "c1d27ff02ca0d219", + "bom-ref": "e25a6405ecb59af7", "name": "/var/lib/dpkg/info/lld:amd64.md5sums", "type": "file" }, { - "bom-ref": "3352e71694046db0", + "bom-ref": "78a40d11a8713cc2", "name": "/var/lib/dpkg/info/llvm-18-linker-tools.list", "type": "file" }, { - "bom-ref": "65bac3d8c17b1777", + "bom-ref": "6322f4194fad9219", "name": "/var/lib/dpkg/info/llvm-18-linker-tools.md5sums", "type": "file" }, { - "bom-ref": "8e8b1ca064884a57", + "bom-ref": "2f87878527d6dde9", "name": "/var/lib/dpkg/info/llvm-18-linker-tools.shlibs", "type": "file" }, { - "bom-ref": "8bd62c99c08d7e8a", + "bom-ref": "c35ea34ec2d64eb4", "name": "/var/lib/dpkg/info/llvm-18-linker-tools.triggers", "type": "file" }, { - "bom-ref": "b120f901c8f3033b", + "bom-ref": "6b98b852a4755959", "name": "/var/lib/dpkg/info/llvm-18-runtime.list", "type": "file" }, { - "bom-ref": "035078096f92b23a", + "bom-ref": "d6c8bffa68744cbc", "name": "/var/lib/dpkg/info/llvm-18-runtime.md5sums", "type": "file" }, { - "bom-ref": "3991428b831b5076", + "bom-ref": "d9f95a1940dbed44", "name": "/var/lib/dpkg/info/llvm-18-runtime.postinst", "type": "file" }, { - "bom-ref": "720e36d4c85b828c", + "bom-ref": "32e991ab2dde9c06", "name": "/var/lib/dpkg/info/llvm-18-runtime.prerm", "type": "file" }, { - "bom-ref": "3d41040a95462122", + "bom-ref": "97ece55673e43318", "name": "/var/lib/dpkg/info/llvm-18.list", "type": "file" }, { - "bom-ref": "aea48c182e152c97", + "bom-ref": "9c73579188a6c179", "name": "/var/lib/dpkg/info/llvm-18.md5sums", "type": "file" }, { - "bom-ref": "f6e0493bab02d635", + "bom-ref": "221793126b3a50e3", "name": "/var/lib/dpkg/info/llvm-runtime:amd64.md5sums", "type": "file" }, { - "bom-ref": "146987ecb8857da3", + "bom-ref": "b4c1589caf1cadfd", "name": "/var/lib/dpkg/info/llvm.list", "type": "file" }, { - "bom-ref": "68cf291309dd8d26", + "bom-ref": "b15157dcc725fef0", "name": "/var/lib/dpkg/info/llvm.md5sums", "type": "file" }, { - "bom-ref": "0c473337b2e10d01", + "bom-ref": "23c9afbafd8d0d07", "name": "/var/lib/dpkg/info/llvm.preinst", "type": "file" }, { - "bom-ref": "29cd3d92d80a3ca5", + "bom-ref": "52cd186fa299b6cb", "name": "/var/lib/dpkg/info/login.conffiles", "type": "file" }, { - "bom-ref": "d923d46f5ee508ec", + "bom-ref": "bd7b740e347e3b3e", "name": "/var/lib/dpkg/info/login.list", "type": "file" }, { - "bom-ref": "4fe2f30a1387aae9", + "bom-ref": "8e84de1061fbb053", "name": "/var/lib/dpkg/info/login.md5sums", "type": "file" }, { - "bom-ref": "bb56d5add4c8131c", + "bom-ref": "b795f5d0c57d4ff6", "name": "/var/lib/dpkg/info/login.postinst", "type": "file" }, { - "bom-ref": "fed755009cdca565", + "bom-ref": "cb997c96fc0b64d7", "name": "/var/lib/dpkg/info/login.postrm", "type": "file" }, { - "bom-ref": "a9054a394a444166", + "bom-ref": "6d67dc90c75618b0", "name": "/var/lib/dpkg/info/login.preinst", "type": "file" }, { - "bom-ref": "ec1164756d9d61e5", + "bom-ref": "3960e9f87a2c21e3", "name": "/var/lib/dpkg/info/login.prerm", "type": "file" }, { - "bom-ref": "d18835deaec47d9c", + "bom-ref": "8b802a4c215f4132", "name": "/var/lib/dpkg/info/logsave.list", "type": "file" }, { - "bom-ref": "7b3b48bad31441e3", + "bom-ref": "c6c1df6454ff1049", "name": "/var/lib/dpkg/info/logsave.md5sums", "type": "file" }, { - "bom-ref": "b79bd6d5d822dcb9", + "bom-ref": "eaf97888d9c68314", "name": "/var/lib/dpkg/info/lto-disabled-list.list", "type": "file" }, { - "bom-ref": "ff2495d1c30e5eb3", + "bom-ref": "39779883fc72fc86", "name": "/var/lib/dpkg/info/lto-disabled-list.md5sums", "type": "file" }, { - "bom-ref": "1bb8f31bf8666076", + "bom-ref": "aa9e44a778703cd0", "name": "/var/lib/dpkg/info/m4.list", "type": "file" }, { - "bom-ref": "db8fa39e7dd444f5", + "bom-ref": "2d6e8392d584906f", "name": "/var/lib/dpkg/info/m4.md5sums", "type": "file" }, { - "bom-ref": "66026be8e334f8e6", + "bom-ref": "243ce6e3e40fff53", "name": "/var/lib/dpkg/info/make.list", "type": "file" }, { - "bom-ref": "f6669ff0773658d3", + "bom-ref": "64c5f3028560c64e", "name": "/var/lib/dpkg/info/make.md5sums", "type": "file" }, { - "bom-ref": "6987276554e91713", + "bom-ref": "7493c51846e86ac9", "name": "/var/lib/dpkg/info/mawk.list", "type": "file" }, { - "bom-ref": "6c08ff7e40800335", + "bom-ref": "cd517642599a99eb", "name": "/var/lib/dpkg/info/mawk.md5sums", "type": "file" }, { - "bom-ref": "969a38fe97398939", + "bom-ref": "485ea96968cbd103", "name": "/var/lib/dpkg/info/mawk.postinst", "type": "file" }, { - "bom-ref": "db22393396eff34d", + "bom-ref": "ee877eb33e7ab7bf", "name": "/var/lib/dpkg/info/mawk.prerm", "type": "file" }, { - "bom-ref": "3ea5fdd61382412f", + "bom-ref": "30e0a095890b6a27", "name": "/var/lib/dpkg/info/media-types.conffiles", "type": "file" }, { - "bom-ref": "9a61211efe5f7ea9", + "bom-ref": "2301cd0202e024d9", "name": "/var/lib/dpkg/info/media-types.list", "type": "file" }, { - "bom-ref": "4c6bc8090eb79fc5", + "bom-ref": "fecd72a9ba0a99c1", "name": "/var/lib/dpkg/info/media-types.md5sums", "type": "file" }, { - "bom-ref": "04b0d21fc4799b06", + "bom-ref": "7461db23cb798058", "name": "/var/lib/dpkg/info/mount.list", "type": "file" }, { - "bom-ref": "6b5aabd647076627", + "bom-ref": "8fecaa2b01d2dbd1", "name": "/var/lib/dpkg/info/mount.md5sums", "type": "file" }, { - "bom-ref": "bc04586ba8bc28d4", + "bom-ref": "3a2ae63bd5c687cc", "name": "/var/lib/dpkg/info/nano.conffiles", "type": "file" }, { - "bom-ref": "509dc5c25bc78d81", + "bom-ref": "cf6589a48e56f961", "name": "/var/lib/dpkg/info/nano.list", "type": "file" }, { - "bom-ref": "3b0703ace6b1ff33", + "bom-ref": "b430029465b6b05f", "name": "/var/lib/dpkg/info/nano.md5sums", "type": "file" }, { - "bom-ref": "b06839b608a033f8", + "bom-ref": "044c2a3967536ee8", "name": "/var/lib/dpkg/info/nano.postinst", "type": "file" }, { - "bom-ref": "0ead333ded0d2ab2", + "bom-ref": "1008e418053420f6", "name": "/var/lib/dpkg/info/nano.prerm", "type": "file" }, { - "bom-ref": "2091231fe3c18f8c", + "bom-ref": "b1c5e0885a83a486", "name": "/var/lib/dpkg/info/nasm.list", "type": "file" }, { - "bom-ref": "e3f3bbee7e90d4c3", + "bom-ref": "1719a74a6717f7ed", "name": "/var/lib/dpkg/info/nasm.md5sums", "type": "file" }, { - "bom-ref": "d7438f30e4440f7e", + "bom-ref": "ae098527beca5bab", + "name": "/var/lib/dpkg/info/nccl-gcp-plugins-ngc.list", + "type": "file" + }, + { + "bom-ref": "4f531802e7923793", + "name": "/var/lib/dpkg/info/nccl-gcp-plugins-ngc.md5sums", + "type": "file" + }, + { + "bom-ref": "d37049b2b39448ac", "name": "/var/lib/dpkg/info/ncurses-base.conffiles", "type": "file" }, { - "bom-ref": "34faccd64ee6fefd", + "bom-ref": "47d16f2f89671373", "name": "/var/lib/dpkg/info/ncurses-base.list", "type": "file" }, { - "bom-ref": "86d084aa494958ad", + "bom-ref": "c96bd4e9e4fcf0b7", "name": "/var/lib/dpkg/info/ncurses-base.md5sums", "type": "file" }, { - "bom-ref": "351730ed43a4511e", + "bom-ref": "1beb9a2d61780254", "name": "/var/lib/dpkg/info/ncurses-bin.list", "type": "file" }, { - "bom-ref": "3c61870113e88355", + "bom-ref": "c2fb19e64268950f", "name": "/var/lib/dpkg/info/ncurses-bin.md5sums", "type": "file" }, { - "bom-ref": "9268880c2070ae02", + "bom-ref": "8690b062627b2e7e", "name": "/var/lib/dpkg/info/netbase.conffiles", "type": "file" }, { - "bom-ref": "17a505eb48ce54df", + "bom-ref": "ab6d4718a327f343", "name": "/var/lib/dpkg/info/netbase.list", "type": "file" }, { - "bom-ref": "0668800a002e32ac", + "bom-ref": "ffcbd6bdd17d4af0", "name": "/var/lib/dpkg/info/netbase.md5sums", "type": "file" }, { - "bom-ref": "1c331c9286627023", + "bom-ref": "7126ef2a33f86f6f", "name": "/var/lib/dpkg/info/netbase.postinst", "type": "file" }, { - "bom-ref": "5c9dbf29a1eb24e5", + "bom-ref": "7978388ac3746025", "name": "/var/lib/dpkg/info/netbase.postrm", "type": "file" }, { - "bom-ref": "c4d5a0fcb2af7afb", + "bom-ref": "06a4f81c17734cb5", "name": "/var/lib/dpkg/info/ninja-build.list", "type": "file" }, { - "bom-ref": "fc95423499b1a124", + "bom-ref": "c3c961f9c8e24d5e", "name": "/var/lib/dpkg/info/ninja-build.md5sums", "type": "file" }, { - "bom-ref": "09b9084af188f1ca", - "name": "/var/lib/dpkg/info/nsight-compute-2026.1.1.list", + "bom-ref": "e7b1bca94fb60441", + "name": "/var/lib/dpkg/info/nsight-compute-2026.3.0.list", "type": "file" }, { - "bom-ref": "0e1b32c52b6cac26", - "name": "/var/lib/dpkg/info/nsight-compute-2026.1.1.md5sums", + "bom-ref": "0ace8e10ea133204", + "name": "/var/lib/dpkg/info/nsight-compute-2026.3.0.md5sums", "type": "file" }, { - "bom-ref": "a54a06abb23ff8bc", - "name": "/var/lib/dpkg/info/nsight-systems-cli-2026.2.1.list", + "bom-ref": "ba8f3145ec4d4822", + "name": "/var/lib/dpkg/info/nsight-systems-cli-2026.5.1.list", "type": "file" }, { - "bom-ref": "861ad5556acadb62", - "name": "/var/lib/dpkg/info/nsight-systems-cli-2026.2.1.md5sums", + "bom-ref": "716523f2ec5f8379", + "name": "/var/lib/dpkg/info/nsight-systems-cli-2026.5.1.md5sums", "type": "file" }, { - "bom-ref": "8ea4c56c097286ca", - "name": "/var/lib/dpkg/info/nsight-systems-cli-2026.2.1.postinst", + "bom-ref": "511caba8ba11c178", + "name": "/var/lib/dpkg/info/nsight-systems-cli-2026.5.1.postinst", "type": "file" }, { - "bom-ref": "d0308fb397a0c59d", - "name": "/var/lib/dpkg/info/nsight-systems-cli-2026.2.1.prerm", + "bom-ref": "064b59233d4d14eb", + "name": "/var/lib/dpkg/info/nsight-systems-cli-2026.5.1.prerm", "type": "file" }, { - "bom-ref": "73b4c9a46ae3cf94", + "bom-ref": "a3be14a824fdbbb1", "name": "/var/lib/dpkg/info/numactl.list", "type": "file" }, { - "bom-ref": "857ca4197f6a0814", + "bom-ref": "64896b60de2ea8a5", "name": "/var/lib/dpkg/info/numactl.md5sums", "type": "file" }, { - "bom-ref": "d54087d15075d641", + "bom-ref": "8a113159467417f8", "name": "/var/lib/dpkg/info/openssh-client.conffiles", "type": "file" }, { - "bom-ref": "ba0e88e0ace01b43", + "bom-ref": "f2f3e995438cc322", "name": "/var/lib/dpkg/info/openssh-client.list", "type": "file" }, { - "bom-ref": "1d0ac890c663531b", + "bom-ref": "d800f7343612d2e6", "name": "/var/lib/dpkg/info/openssh-client.md5sums", "type": "file" }, { - "bom-ref": "72f2cd655ad36afe", + "bom-ref": "741eb83cad05c19f", "name": "/var/lib/dpkg/info/openssh-client.postinst", "type": "file" }, { - "bom-ref": "2cb4deac641c63c4", + "bom-ref": "cdc95f31b1669fd5", "name": "/var/lib/dpkg/info/openssh-client.postrm", "type": "file" }, { - "bom-ref": "eb06fbc333bf0191", + "bom-ref": "2e3c66cb322329ac", "name": "/var/lib/dpkg/info/openssh-client.preinst", "type": "file" }, { - "bom-ref": "66a051e0926a8f9f", + "bom-ref": "11f9de12c850eab6", "name": "/var/lib/dpkg/info/openssh-client.prerm", "type": "file" }, { - "bom-ref": "353d97e1e8c07793", + "bom-ref": "a2fde947b02c7761", "name": "/var/lib/dpkg/info/openssl.conffiles", "type": "file" }, { - "bom-ref": "4eb02e79ceba32a4", + "bom-ref": "1f34e89def4298be", "name": "/var/lib/dpkg/info/openssl.list", "type": "file" }, { - "bom-ref": "b74264c0b48c13f4", + "bom-ref": "c8786414b75329de", "name": "/var/lib/dpkg/info/openssl.md5sums", "type": "file" }, { - "bom-ref": "9ef8d2b8f5fdd0a4", + "bom-ref": "4c7c0947de825d9e", "name": "/var/lib/dpkg/info/openssl.postinst", "type": "file" }, { - "bom-ref": "2c69a4711a605318", + "bom-ref": "e8ffb5cab8b555ce", "name": "/var/lib/dpkg/info/passwd.conffiles", "type": "file" }, { - "bom-ref": "5c5e027d24a5fe6f", + "bom-ref": "41220f2cce8826f1", "name": "/var/lib/dpkg/info/passwd.list", "type": "file" }, { - "bom-ref": "8849ee3741fbac63", + "bom-ref": "a3919067672964b9", "name": "/var/lib/dpkg/info/passwd.md5sums", "type": "file" }, { - "bom-ref": "765e3fb19303a39d", + "bom-ref": "ebbfcd59ad539ebf", "name": "/var/lib/dpkg/info/passwd.postinst", "type": "file" }, { - "bom-ref": "40d8db72619222dc", + "bom-ref": "959edca9eed1db26", "name": "/var/lib/dpkg/info/passwd.postrm", "type": "file" }, { - "bom-ref": "05aea279c31c7f85", + "bom-ref": "cc8279fbf3f0a567", "name": "/var/lib/dpkg/info/passwd.preinst", "type": "file" }, { - "bom-ref": "ac7c6570e0625184", + "bom-ref": "5701408f0d58622e", "name": "/var/lib/dpkg/info/passwd.prerm", "type": "file" }, { - "bom-ref": "f752c070e67c4fe9", + "bom-ref": "663769de1aeaa642", "name": "/var/lib/dpkg/info/patch.list", "type": "file" }, { - "bom-ref": "80e162b3349d1199", + "bom-ref": "5a3caf01030b5876", "name": "/var/lib/dpkg/info/patch.md5sums", "type": "file" }, { - "bom-ref": "6757797e49ed7fb8", + "bom-ref": "a0b50cce3364e97e", "name": "/var/lib/dpkg/info/patchelf.list", "type": "file" }, { - "bom-ref": "9e79604ff37a8bff", + "bom-ref": "b18bdcb06bcdb0e1", "name": "/var/lib/dpkg/info/patchelf.md5sums", "type": "file" }, { - "bom-ref": "4b0e115420178e88", + "bom-ref": "45016bcd15f56b17", "name": "/var/lib/dpkg/info/pci.ids.list", "type": "file" }, { - "bom-ref": "c25b0bc26e1ebbea", + "bom-ref": "ee4cba6cfd4c7d11", "name": "/var/lib/dpkg/info/pci.ids.md5sums", "type": "file" }, { - "bom-ref": "09d2373ebab9cac5", + "bom-ref": "9e428a5ba102f2aa", "name": "/var/lib/dpkg/info/pciutils.list", "type": "file" }, { - "bom-ref": "2ee3b6bd1b7f6971", + "bom-ref": "ba6d63c6b6736ed6", "name": "/var/lib/dpkg/info/pciutils.md5sums", "type": "file" }, { - "bom-ref": "b2d4b20fe4a3d74f", + "bom-ref": "b55148a1925e19ec", "name": "/var/lib/dpkg/info/pciutils.postinst", "type": "file" }, { - "bom-ref": "93c4a050b26d7955", + "bom-ref": "4065047ee9fb7fd2", "name": "/var/lib/dpkg/info/pciutils.postrm", "type": "file" }, { - "bom-ref": "7430414fd971276f", + "bom-ref": "8c8d96d05b858b5c", "name": "/var/lib/dpkg/info/pciutils.preinst", "type": "file" }, { - "bom-ref": "3a9319ea8a51ab7e", + "bom-ref": "5d468d6eb8ee8e50", "name": "/var/lib/dpkg/info/perl-base.list", "type": "file" }, { - "bom-ref": "4f21caf3fb7a62c7", + "bom-ref": "676aaf5e097609f1", "name": "/var/lib/dpkg/info/perl-base.md5sums", "type": "file" }, { - "bom-ref": "cac4721c63fd4083", + "bom-ref": "748a4b11e96c81e9", "name": "/var/lib/dpkg/info/perl-base.postinst", "type": "file" }, { - "bom-ref": "04ea31f8aaa92501", + "bom-ref": "3b3e1f7429e759e7", "name": "/var/lib/dpkg/info/perl-base.postrm", "type": "file" }, { - "bom-ref": "77c394776dc158fb", + "bom-ref": "9df823018aae2225", "name": "/var/lib/dpkg/info/perl-base.preinst", "type": "file" }, { - "bom-ref": "0bb50715c300e2ea", + "bom-ref": "2062ef5e9e970ef8", "name": "/var/lib/dpkg/info/perl-base.prerm", "type": "file" }, { - "bom-ref": "10a53a683a513443", + "bom-ref": "7c801a55a2365576", "name": "/var/lib/dpkg/info/perl-modules-5.38.list", "type": "file" }, { - "bom-ref": "f8cb2d77f83b0386", + "bom-ref": "15e3aaa5e0e1470b", "name": "/var/lib/dpkg/info/perl-modules-5.38.md5sums", "type": "file" }, { - "bom-ref": "dff3f4be8b66ead2", + "bom-ref": "c784095df7b5585b", "name": "/var/lib/dpkg/info/perl.conffiles", "type": "file" }, { - "bom-ref": "e194689e892979e8", + "bom-ref": "cd06ab92542ca5b5", "name": "/var/lib/dpkg/info/perl.list", "type": "file" }, { - "bom-ref": "62b7b34094e77a9c", + "bom-ref": "24132b93a3f2beb5", "name": "/var/lib/dpkg/info/perl.md5sums", "type": "file" }, { - "bom-ref": "f0b0904bece90470", + "bom-ref": "1ead97ad82d8f1e1", "name": "/var/lib/dpkg/info/perl.postinst", "type": "file" }, { - "bom-ref": "e433ad67ee09617c", + "bom-ref": "807fcd95a60150d1", "name": "/var/lib/dpkg/info/perl.postrm", "type": "file" }, { - "bom-ref": "ede499fa16eb5e16", + "bom-ref": "746e2985f487fe4b", "name": "/var/lib/dpkg/info/perl.preinst", "type": "file" }, { - "bom-ref": "f6bdd4436af22fd7", + "bom-ref": "c0aaec24cc478bfe", "name": "/var/lib/dpkg/info/perl.prerm", "type": "file" }, { - "bom-ref": "84944322f986fb6e", + "bom-ref": "b18786387b0a440c", "name": "/var/lib/dpkg/info/pigz.list", "type": "file" }, { - "bom-ref": "8c4c55d683159377", + "bom-ref": "951c2c5623f588e1", "name": "/var/lib/dpkg/info/pigz.md5sums", "type": "file" }, { - "bom-ref": "c0d1c0a727784382", + "bom-ref": "b7bfd769cc4af290", "name": "/var/lib/dpkg/info/pigz.prerm", "type": "file" }, { - "bom-ref": "b1dd365d56d8396d", + "bom-ref": "2034a48f657b6c3c", "name": "/var/lib/dpkg/info/pinentry-curses.list", "type": "file" }, { - "bom-ref": "4f34bb6e6cf08527", + "bom-ref": "5491e2c5b85571e6", "name": "/var/lib/dpkg/info/pinentry-curses.md5sums", "type": "file" }, { - "bom-ref": "33663aa4e8e04dc0", + "bom-ref": "9e4e4abe7688b241", "name": "/var/lib/dpkg/info/pinentry-curses.postinst", "type": "file" }, { - "bom-ref": "cf9f870bc3786c64", + "bom-ref": "72d3c0a64cfbe6dd", "name": "/var/lib/dpkg/info/pinentry-curses.prerm", "type": "file" }, { - "bom-ref": "7f5b50ba6e8cbb67", + "bom-ref": "d4850f4f610d743d", "name": "/var/lib/dpkg/info/pkg-config:amd64.conffiles", "type": "file" }, { - "bom-ref": "0ded62f8782914b6", + "bom-ref": "d239460aa700f8d0", "name": "/var/lib/dpkg/info/pkg-config:amd64.md5sums", "type": "file" }, { - "bom-ref": "96c7fbe379c15ae9", + "bom-ref": "ceb9440677476c99", "name": "/var/lib/dpkg/info/pkgconf-bin.list", "type": "file" }, { - "bom-ref": "617c9be52d2ebadd", + "bom-ref": "61b2dde13d03964d", "name": "/var/lib/dpkg/info/pkgconf-bin.md5sums", "type": "file" }, { - "bom-ref": "339c5fcf4a9ada6e", + "bom-ref": "8bf4a732fabf1c32", "name": "/var/lib/dpkg/info/pkgconf:amd64.conffiles", "type": "file" }, { - "bom-ref": "3ad00a9c09bc36bd", + "bom-ref": "666dda64594b8159", "name": "/var/lib/dpkg/info/pkgconf:amd64.md5sums", "type": "file" }, { - "bom-ref": "b78e0190a136ef3e", + "bom-ref": "c8e3ceaf34cd8ab0", "name": "/var/lib/dpkg/info/procps.conffiles", "type": "file" }, { - "bom-ref": "0e4be5e0c472338d", + "bom-ref": "f24344f05f22e9f7", "name": "/var/lib/dpkg/info/procps.list", "type": "file" }, { - "bom-ref": "8c93ab55a40dc1b6", + "bom-ref": "f3aa756d207f8820", "name": "/var/lib/dpkg/info/procps.md5sums", "type": "file" }, { - "bom-ref": "b191c427b211c223", + "bom-ref": "6b721a05472d22a9", "name": "/var/lib/dpkg/info/procps.postinst", "type": "file" }, { - "bom-ref": "a2af80e40ccc5f8a", + "bom-ref": "320aa65c3c1be82c", "name": "/var/lib/dpkg/info/procps.postrm", "type": "file" }, { - "bom-ref": "15dc2155051a7843", + "bom-ref": "a611ccf26f43f945", "name": "/var/lib/dpkg/info/procps.preinst", "type": "file" }, { - "bom-ref": "5c81dd2e9756b51e", + "bom-ref": "3179838c24d1a8ac", "name": "/var/lib/dpkg/info/procps.prerm", "type": "file" }, { - "bom-ref": "413212f4cf619795", + "bom-ref": "d70309850c908e97", "name": "/var/lib/dpkg/info/protobuf-compiler.list", "type": "file" }, { - "bom-ref": "a347f303d764b781", + "bom-ref": "38e09ecf40de6957", "name": "/var/lib/dpkg/info/protobuf-compiler.md5sums", "type": "file" }, { - "bom-ref": "1e14de05a1f894ce", + "bom-ref": "c6d57f8f51e7eb3c", "name": "/var/lib/dpkg/info/python-is-python3.list", "type": "file" }, { - "bom-ref": "1a294c2fa9c55fb5", + "bom-ref": "609e17b37042dff3", "name": "/var/lib/dpkg/info/python-is-python3.md5sums", "type": "file" }, { - "bom-ref": "101dd19e78e2f09a", + "bom-ref": "91fd051fc2cf9898", "name": "/var/lib/dpkg/info/python3-dev.list", "type": "file" }, { - "bom-ref": "8864cef6723a2f5f", + "bom-ref": "987fd5e4491f2571", "name": "/var/lib/dpkg/info/python3-dev.md5sums", "type": "file" }, { - "bom-ref": "70aa3d70091a0091", + "bom-ref": "5bed6b4b8ed80283", "name": "/var/lib/dpkg/info/python3-minimal.list", "type": "file" }, { - "bom-ref": "19756171effc4bc6", + "bom-ref": "d99c5471cfe36150", "name": "/var/lib/dpkg/info/python3-minimal.md5sums", "type": "file" }, { - "bom-ref": "561032cde51d677e", + "bom-ref": "45ade42462a9d6c0", "name": "/var/lib/dpkg/info/python3-minimal.postinst", "type": "file" }, { - "bom-ref": "a431cae8fc1a90c2", + "bom-ref": "685211e09f08af60", "name": "/var/lib/dpkg/info/python3-minimal.prerm", "type": "file" }, { - "bom-ref": "f19ecc28505d5421", + "bom-ref": "520877cf016fc797", "name": "/var/lib/dpkg/info/python3-pip-whl.list", "type": "file" }, { - "bom-ref": "038783f7b02ca055", + "bom-ref": "da114ac9a3922957", "name": "/var/lib/dpkg/info/python3-pip-whl.md5sums", "type": "file" }, { - "bom-ref": "757b55ad2d5fcd12", + "bom-ref": "1f56652e99a1b6c0", "name": "/var/lib/dpkg/info/python3-pip.list", "type": "file" }, { - "bom-ref": "58529eea3a568ca8", + "bom-ref": "66ca120a6d8e2aaa", "name": "/var/lib/dpkg/info/python3-pip.md5sums", "type": "file" }, { - "bom-ref": "4432c39b3ffe879b", + "bom-ref": "86bfc596b406fc85", "name": "/var/lib/dpkg/info/python3-pip.postinst", "type": "file" }, { - "bom-ref": "369c48441761b1d0", + "bom-ref": "1eccb0091734015e", "name": "/var/lib/dpkg/info/python3-pip.prerm", "type": "file" }, { - "bom-ref": "a2561c94e28c34c2", + "bom-ref": "4f70a29e08096878", "name": "/var/lib/dpkg/info/python3-pkg-resources.list", "type": "file" }, { - "bom-ref": "64995b5fd3d1d401", + "bom-ref": "efac4165674a7e93", "name": "/var/lib/dpkg/info/python3-pkg-resources.md5sums", "type": "file" }, { - "bom-ref": "2f599baff8fedc72", + "bom-ref": "3cd5c4dae199fb6c", "name": "/var/lib/dpkg/info/python3-pkg-resources.postinst", "type": "file" }, { - "bom-ref": "c6a03f7241b796af", + "bom-ref": "a8f5605f520213f9", "name": "/var/lib/dpkg/info/python3-pkg-resources.prerm", "type": "file" }, { - "bom-ref": "0606e78d0a59fd51", + "bom-ref": "67d24e0e880a07ef", "name": "/var/lib/dpkg/info/python3-setuptools-whl.list", "type": "file" }, { - "bom-ref": "a24d4dac014940e2", + "bom-ref": "ec649c3b762280b8", "name": "/var/lib/dpkg/info/python3-setuptools-whl.md5sums", "type": "file" }, { - "bom-ref": "ef4b93bb01fc2055", + "bom-ref": "71fba06aa4bbf24b", "name": "/var/lib/dpkg/info/python3-setuptools.list", "type": "file" }, { - "bom-ref": "e73968689c6bd5c1", + "bom-ref": "e03cab7ddc61306b", "name": "/var/lib/dpkg/info/python3-setuptools.md5sums", "type": "file" }, { - "bom-ref": "eb2c74c8f2c0c435", + "bom-ref": "9c6adacdbd8ddbcf", "name": "/var/lib/dpkg/info/python3-setuptools.postinst", "type": "file" }, { - "bom-ref": "d5f07a07ec8b65cc", + "bom-ref": "5c606beb5167c652", "name": "/var/lib/dpkg/info/python3-setuptools.prerm", "type": "file" }, { - "bom-ref": "9d915c77ce752f4f", + "bom-ref": "35d2e604a5fd5ebd", "name": "/var/lib/dpkg/info/python3-venv.list", "type": "file" }, { - "bom-ref": "d9bc3bac24496ae2", + "bom-ref": "c3d22440a79f7618", "name": "/var/lib/dpkg/info/python3-venv.md5sums", "type": "file" }, { - "bom-ref": "a56e2a394a16ee0b", + "bom-ref": "058904ca1635dd55", "name": "/var/lib/dpkg/info/python3-wheel.list", "type": "file" }, { - "bom-ref": "9606502a2b8b3f45", + "bom-ref": "8214629659b3dc13", "name": "/var/lib/dpkg/info/python3-wheel.md5sums", "type": "file" }, { - "bom-ref": "8874828b267aa27e", + "bom-ref": "d597fd23e188b68c", "name": "/var/lib/dpkg/info/python3-wheel.postinst", "type": "file" }, { - "bom-ref": "d26b5d6afb42dfdc", + "bom-ref": "f3fc1078d3db0022", "name": "/var/lib/dpkg/info/python3-wheel.prerm", "type": "file" }, { - "bom-ref": "a6fb67ea79dc0acb", + "bom-ref": "04574c3b50fe3c05", "name": "/var/lib/dpkg/info/python3-yaml.list", "type": "file" }, { - "bom-ref": "62c1c6e2f5f6df59", + "bom-ref": "90e5d1b8ff0619b3", "name": "/var/lib/dpkg/info/python3-yaml.md5sums", "type": "file" }, { - "bom-ref": "842d9584fb315539", + "bom-ref": "5e0f4d82206aa9df", "name": "/var/lib/dpkg/info/python3-yaml.postinst", "type": "file" }, { - "bom-ref": "5e38e14aab6539aa", + "bom-ref": "99190fcd2611bb5c", "name": "/var/lib/dpkg/info/python3-yaml.prerm", "type": "file" }, { - "bom-ref": "ff3dadb2787d2ce1", + "bom-ref": "6f37b029fe7eecdb", "name": "/var/lib/dpkg/info/python3.12-dev.list", "type": "file" }, { - "bom-ref": "8af8820c9fd12e3a", + "bom-ref": "5efdbadfd92b156c", "name": "/var/lib/dpkg/info/python3.12-dev.md5sums", "type": "file" }, { - "bom-ref": "56c8704d39d302f5", + "bom-ref": "08f51d58c0c026f7", "name": "/var/lib/dpkg/info/python3.12-minimal.list", "type": "file" }, { - "bom-ref": "7970d976b9414369", + "bom-ref": "df38717a27b97b77", "name": "/var/lib/dpkg/info/python3.12-minimal.md5sums", "type": "file" }, { - "bom-ref": "bb9e7f9ca3a87a8b", + "bom-ref": "768d4139652fe78d", "name": "/var/lib/dpkg/info/python3.12-minimal.postinst", "type": "file" }, { - "bom-ref": "ade6bc24cd7e3c0b", + "bom-ref": "e0695fece71e01f1", "name": "/var/lib/dpkg/info/python3.12-minimal.postrm", "type": "file" }, { - "bom-ref": "02ca2ec7c2ce1332", + "bom-ref": "a30ca1f5ba40413c", "name": "/var/lib/dpkg/info/python3.12-minimal.preinst", "type": "file" }, { - "bom-ref": "8c6c63cdc149df98", + "bom-ref": "692fa4467b066052", "name": "/var/lib/dpkg/info/python3.12-minimal.prerm", "type": "file" }, { - "bom-ref": "7e71e34d790161c2", + "bom-ref": "42974dabf7e81d54", "name": "/var/lib/dpkg/info/python3.12-venv.list", "type": "file" }, { - "bom-ref": "a7d4bbdf3ac90234", + "bom-ref": "fa972c0abe6c5e62", "name": "/var/lib/dpkg/info/python3.12-venv.md5sums", "type": "file" }, { - "bom-ref": "277e38ed12020bca", + "bom-ref": "89fa3cb58955ffdc", "name": "/var/lib/dpkg/info/python3.12-venv.postinst", "type": "file" }, { - "bom-ref": "483bc307be6e911f", + "bom-ref": "b77ef5e791667129", "name": "/var/lib/dpkg/info/python3.12-venv.postrm", "type": "file" }, { - "bom-ref": "5e67f8eb5580b3a3", + "bom-ref": "46ab5ad561271869", "name": "/var/lib/dpkg/info/python3.12-venv.prerm", "type": "file" }, { - "bom-ref": "97940587ff1d1d51", + "bom-ref": "32fed8ff6e7f85d7", "name": "/var/lib/dpkg/info/python3.12.list", "type": "file" }, { - "bom-ref": "b142a262e5e75c04", + "bom-ref": "b671df93d9d1bff2", "name": "/var/lib/dpkg/info/python3.12.md5sums", "type": "file" }, { - "bom-ref": "59f17f1041d5ce8b", + "bom-ref": "a1cb7a3c7a33d40d", "name": "/var/lib/dpkg/info/python3.12.postinst", "type": "file" }, { - "bom-ref": "9a77d9b4feadd2eb", + "bom-ref": "84b72af40832b001", "name": "/var/lib/dpkg/info/python3.12.prerm", "type": "file" }, { - "bom-ref": "1e6667c44ec4c564", + "bom-ref": "11e045fd76d00a02", "name": "/var/lib/dpkg/info/python3.list", "type": "file" }, { - "bom-ref": "2830fd7a0a024507", + "bom-ref": "463e662899a791a1", "name": "/var/lib/dpkg/info/python3.md5sums", "type": "file" }, { - "bom-ref": "062cd1f14d83510f", + "bom-ref": "32b8205fa93f7635", "name": "/var/lib/dpkg/info/python3.postinst", "type": "file" }, { - "bom-ref": "43e1a101fb80e80a", + "bom-ref": "3b96764dafb98514", "name": "/var/lib/dpkg/info/python3.postrm", "type": "file" }, { - "bom-ref": "262a5bd35a9be1b7", + "bom-ref": "530a1d127f9b3d45", "name": "/var/lib/dpkg/info/python3.preinst", "type": "file" }, { - "bom-ref": "81c7800258c53cbf", + "bom-ref": "2d3a2f67e6125439", "name": "/var/lib/dpkg/info/python3.prerm", "type": "file" }, { - "bom-ref": "39041f6f4bd0d8ab", + "bom-ref": "2826735a74e9d1ed", "name": "/var/lib/dpkg/info/rapidjson-dev.list", "type": "file" }, { - "bom-ref": "cbe186740650ba5b", + "bom-ref": "4781b91925ca4ac5", "name": "/var/lib/dpkg/info/rapidjson-dev.md5sums", "type": "file" }, { - "bom-ref": "4773b5db519ddf40", + "bom-ref": "242c1f4ef75cb341", "name": "/var/lib/dpkg/info/readline-common.list", "type": "file" }, { - "bom-ref": "33c1af195e545904", + "bom-ref": "ea115f716ef1a385", "name": "/var/lib/dpkg/info/readline-common.md5sums", "type": "file" }, { - "bom-ref": "dd21c5a7d5d6094f", + "bom-ref": "fc68296377fec792", "name": "/var/lib/dpkg/info/readline-common.postinst", "type": "file" }, { - "bom-ref": "5501af48632045e5", + "bom-ref": "0c187226f87c35f8", "name": "/var/lib/dpkg/info/readline-common.postrm", "type": "file" }, { - "bom-ref": "793e0ed110dd0c3e", + "bom-ref": "37368b0b369e8d25", "name": "/var/lib/dpkg/info/rpcsvc-proto.list", "type": "file" }, { - "bom-ref": "abe35bc1401767ca", + "bom-ref": "574cabcf05fdb1bd", "name": "/var/lib/dpkg/info/rpcsvc-proto.md5sums", "type": "file" }, { - "bom-ref": "c8aac47452a953df", + "bom-ref": "5d3440242cfbc635", "name": "/var/lib/dpkg/info/sed.list", "type": "file" }, { - "bom-ref": "d9845fba467e68b6", + "bom-ref": "02e29de630429360", "name": "/var/lib/dpkg/info/sed.md5sums", "type": "file" }, { - "bom-ref": "1b053c1349373420", + "bom-ref": "238c516dd039dc9a", "name": "/var/lib/dpkg/info/sensible-utils.list", "type": "file" }, { - "bom-ref": "0fd48465db744702", + "bom-ref": "76486fd7b8454a60", "name": "/var/lib/dpkg/info/sensible-utils.md5sums", "type": "file" }, { - "bom-ref": "576739f25bb09e51", - "name": "/var/lib/dpkg/info/sgml-base.list", - "type": "file" - }, - { - "bom-ref": "9471ab9740e93b37", - "name": "/var/lib/dpkg/info/sgml-base.md5sums", - "type": "file" - }, - { - "bom-ref": "9b2fd3e5947af802", - "name": "/var/lib/dpkg/info/sgml-base.postinst", - "type": "file" - }, - { - "bom-ref": "b1478711af8229a9", - "name": "/var/lib/dpkg/info/sgml-base.postrm", - "type": "file" - }, - { - "bom-ref": "96ac00952eccca01", - "name": "/var/lib/dpkg/info/sgml-base.preinst", - "type": "file" - }, - { - "bom-ref": "4f2e03e8130d3d9e", - "name": "/var/lib/dpkg/info/sgml-base.prerm", - "type": "file" - }, - { - "bom-ref": "cbfb224d8d77cc43", - "name": "/var/lib/dpkg/info/sgml-base.triggers", - "type": "file" - }, - { - "bom-ref": "85d81ede8f504dce", + "bom-ref": "2bf5e61cc7ea8b18", "name": "/var/lib/dpkg/info/sox.list", "type": "file" }, { - "bom-ref": "9eabb637567dd124", + "bom-ref": "9bfd2ae9a30e6f1e", "name": "/var/lib/dpkg/info/sox.md5sums", "type": "file" }, { - "bom-ref": "e05ceea6cf6dea37", + "bom-ref": "d66566e493920a91", "name": "/var/lib/dpkg/info/sysvinit-utils.list", "type": "file" }, { - "bom-ref": "182774d5da6d4d38", + "bom-ref": "eb238d7c79ebccca", "name": "/var/lib/dpkg/info/sysvinit-utils.md5sums", "type": "file" }, { - "bom-ref": "373baf18679b4e59", + "bom-ref": "d4c19803ccbb645b", "name": "/var/lib/dpkg/info/tar.list", "type": "file" }, { - "bom-ref": "c39f567740ae0020", + "bom-ref": "b56af8aeb96f7356", "name": "/var/lib/dpkg/info/tar.md5sums", "type": "file" }, { - "bom-ref": "f71f1d67a68ed801", + "bom-ref": "cacbeb39a80766f3", "name": "/var/lib/dpkg/info/tar.postinst", "type": "file" }, { - "bom-ref": "645cb397c18ea58f", + "bom-ref": "757dfea9007794dd", "name": "/var/lib/dpkg/info/tar.prerm", "type": "file" }, { - "bom-ref": "60a5402d794c92ec", + "bom-ref": "b9e4ac4dffda5f30", "name": "/var/lib/dpkg/info/tzdata.config", "type": "file" }, { - "bom-ref": "540dac8ba7869ea1", + "bom-ref": "99a395b41d8fbe59", "name": "/var/lib/dpkg/info/tzdata.list", "type": "file" }, { - "bom-ref": "84ccd82db629fcdf", + "bom-ref": "d0ba699b063da6e7", "name": "/var/lib/dpkg/info/tzdata.md5sums", "type": "file" }, { - "bom-ref": "24677fdaaa591ed0", + "bom-ref": "dcaf75219a10c7b8", "name": "/var/lib/dpkg/info/tzdata.postinst", "type": "file" }, { - "bom-ref": "1295d18afd073c6e", + "bom-ref": "9de5f6b1243f0ef2", "name": "/var/lib/dpkg/info/tzdata.postrm", "type": "file" }, { - "bom-ref": "16fdae4c3baae2a1", + "bom-ref": "aa45307cfe0767cd", "name": "/var/lib/dpkg/info/tzdata.templates", "type": "file" }, { - "bom-ref": "4a59325fbadc7d7e", + "bom-ref": "3d097d5560ef2108", "name": "/var/lib/dpkg/info/ubuntu-keyring.list", "type": "file" }, { - "bom-ref": "9dcbc8b73853695b", + "bom-ref": "213d7129f68be4ed", "name": "/var/lib/dpkg/info/ubuntu-keyring.md5sums", "type": "file" }, { - "bom-ref": "0940c1ac8380b9e7", + "bom-ref": "538b0ad71e1b04b5", "name": "/var/lib/dpkg/info/ubuntu-keyring.postinst", "type": "file" }, { - "bom-ref": "23ed397d64c39ded", + "bom-ref": "0a123af80a6ae26f", "name": "/var/lib/dpkg/info/ucf.conffiles", "type": "file" }, { - "bom-ref": "56eee9a1e7324875", + "bom-ref": "0dc3bc5eab7ba9cf", "name": "/var/lib/dpkg/info/ucf.list", "type": "file" }, { - "bom-ref": "ac53b3ecf480cf1b", + "bom-ref": "be0f877f39252351", "name": "/var/lib/dpkg/info/ucf.md5sums", "type": "file" }, { - "bom-ref": "756b88241e97fe17", + "bom-ref": "f229981024c08e55", "name": "/var/lib/dpkg/info/ucf.postinst", "type": "file" }, { - "bom-ref": "bc284b08d8d6244b", + "bom-ref": "46f76a4b7cfe6b9d", "name": "/var/lib/dpkg/info/ucf.postrm", "type": "file" }, { - "bom-ref": "8d6827a627f84dc3", + "bom-ref": "faa9ce8968416c99", "name": "/var/lib/dpkg/info/ucf.preinst", "type": "file" }, { - "bom-ref": "27368da9509e448d", + "bom-ref": "0a3d09e20499ee17", "name": "/var/lib/dpkg/info/ucf.templates", "type": "file" }, { - "bom-ref": "2b47402289d05512", + "bom-ref": "ea53049c6c3d8450", "name": "/var/lib/dpkg/info/unminimize.list", "type": "file" }, { - "bom-ref": "c47506b4eb85d226", + "bom-ref": "29e18f1cec1916a0", "name": "/var/lib/dpkg/info/unminimize.md5sums", "type": "file" }, { - "bom-ref": "8b077822802000ba", + "bom-ref": "217411b93f18bc40", "name": "/var/lib/dpkg/info/unminimize.postinst", "type": "file" }, { - "bom-ref": "44eb122966fb6010", + "bom-ref": "ec65ac3d20f51131", "name": "/var/lib/dpkg/info/unzip.list", "type": "file" }, { - "bom-ref": "8308256877f5d8f5", + "bom-ref": "3f85029e35ebed20", "name": "/var/lib/dpkg/info/unzip.md5sums", "type": "file" }, { - "bom-ref": "1ce5d037898c0a29", + "bom-ref": "95045fc0d3e84584", "name": "/var/lib/dpkg/info/unzip.postinst", "type": "file" }, { - "bom-ref": "b33fde0f84ba7bc8", + "bom-ref": "a611dfca89e5c8a1", "name": "/var/lib/dpkg/info/unzip.postrm", "type": "file" }, { - "bom-ref": "9ad72b4d99f892e9", + "bom-ref": "da7831e0ec4068d2", "name": "/var/lib/dpkg/info/usb.ids.list", "type": "file" }, { - "bom-ref": "f4d435accdfbc44f", + "bom-ref": "c17f9245205cdcc8", "name": "/var/lib/dpkg/info/usb.ids.md5sums", "type": "file" }, { - "bom-ref": "1323dd1cc64f5b0e", + "bom-ref": "834749de651cfd34", "name": "/var/lib/dpkg/info/util-linux.conffiles", "type": "file" }, { - "bom-ref": "1d024bc302742675", + "bom-ref": "0209ecdb3fd02037", "name": "/var/lib/dpkg/info/util-linux.list", "type": "file" }, { - "bom-ref": "2733870042fca506", + "bom-ref": "ef22e42b1ba7ba30", "name": "/var/lib/dpkg/info/util-linux.md5sums", "type": "file" }, { - "bom-ref": "feee00de26c32fac", + "bom-ref": "678d4e6f7a56c396", "name": "/var/lib/dpkg/info/util-linux.postinst", "type": "file" }, { - "bom-ref": "300e76ea42aa6cbc", + "bom-ref": "5364334be0c6cdf6", "name": "/var/lib/dpkg/info/util-linux.postrm", "type": "file" }, { - "bom-ref": "a0c30fb65c28977d", + "bom-ref": "7e80a99eb2e060d7", "name": "/var/lib/dpkg/info/util-linux.prerm", "type": "file" }, { - "bom-ref": "0f8bb98bea21aa6a", + "bom-ref": "5941549b33a3c913", "name": "/var/lib/dpkg/info/vim-common.conffiles", "type": "file" }, { - "bom-ref": "06eb63e2fa02c365", + "bom-ref": "696fa0ed9b68cef8", "name": "/var/lib/dpkg/info/vim-common.list", "type": "file" }, { - "bom-ref": "9cd15ba93ec13769", + "bom-ref": "dd9ed590b581fd88", "name": "/var/lib/dpkg/info/vim-common.md5sums", "type": "file" }, { - "bom-ref": "dc50005c379c3b95", + "bom-ref": "fe62cb5a1f48193c", "name": "/var/lib/dpkg/info/vim-common.postinst", "type": "file" }, { - "bom-ref": "9059937c6e1b9c46", + "bom-ref": "5307db9477dbd54f", "name": "/var/lib/dpkg/info/vim-common.postrm", "type": "file" }, { - "bom-ref": "8cd6bb64ec9c94c8", + "bom-ref": "b27f988994656214", "name": "/var/lib/dpkg/info/vim-runtime.list", "type": "file" }, { - "bom-ref": "21cb700f4966281b", + "bom-ref": "c931ecf804cb04fb", "name": "/var/lib/dpkg/info/vim-runtime.md5sums", "type": "file" }, { - "bom-ref": "3daac0ec9f81b2d8", + "bom-ref": "48ff0dc5457baaa4", "name": "/var/lib/dpkg/info/vim-runtime.postinst", "type": "file" }, { - "bom-ref": "8e518f6e7e414e8c", + "bom-ref": "470f4f8ac6e1ac3c", "name": "/var/lib/dpkg/info/vim-runtime.postrm", "type": "file" }, { - "bom-ref": "5049a50b0c053fe9", + "bom-ref": "e309d912f636b27d", "name": "/var/lib/dpkg/info/vim-runtime.preinst", "type": "file" }, { - "bom-ref": "3c0e97d293698472", + "bom-ref": "0456234b66377c3f", "name": "/var/lib/dpkg/info/vim-tiny.conffiles", "type": "file" }, { - "bom-ref": "af29709607ecd77b", + "bom-ref": "e27bd8d7946cbf12", "name": "/var/lib/dpkg/info/vim-tiny.list", "type": "file" }, { - "bom-ref": "ffe740490e224f8a", + "bom-ref": "7097b370bd079e5f", "name": "/var/lib/dpkg/info/vim-tiny.md5sums", "type": "file" }, { - "bom-ref": "d179efedd2958e01", + "bom-ref": "e2b81df76d241230", "name": "/var/lib/dpkg/info/vim-tiny.postinst", "type": "file" }, { - "bom-ref": "fbeff4882ddd78bc", + "bom-ref": "abbd97e079cc17ad", "name": "/var/lib/dpkg/info/vim-tiny.prerm", "type": "file" }, { - "bom-ref": "40a8e4d5ca07b8fe", + "bom-ref": "fd57a54c24abd4be", "name": "/var/lib/dpkg/info/vim.list", "type": "file" }, { - "bom-ref": "7a4f98fc2a1b8614", + "bom-ref": "30bfed7e1637e990", "name": "/var/lib/dpkg/info/vim.md5sums", "type": "file" }, { - "bom-ref": "5a2112ada794ccc3", + "bom-ref": "1f6faea73dee66df", "name": "/var/lib/dpkg/info/vim.postinst", "type": "file" }, { - "bom-ref": "bd9ef35533fad473", + "bom-ref": "088492996e21ee5b", "name": "/var/lib/dpkg/info/vim.prerm", "type": "file" }, { - "bom-ref": "2f73565d94cb4a01", + "bom-ref": "e7661801aa4c65f6", "name": "/var/lib/dpkg/info/wget.conffiles", "type": "file" }, { - "bom-ref": "397c1c8c318b33a9", + "bom-ref": "7f794186e1a95096", "name": "/var/lib/dpkg/info/wget.list", "type": "file" }, { - "bom-ref": "ec92dc4f997457ca", + "bom-ref": "7fd565daa775aa75", "name": "/var/lib/dpkg/info/wget.md5sums", "type": "file" }, { - "bom-ref": "5244d6e800833134", + "bom-ref": "a763eb9aa0693412", "name": "/var/lib/dpkg/info/x11-common.conffiles", "type": "file" }, { - "bom-ref": "c7a1db9b66e60288", + "bom-ref": "c01447f651c72dc6", "name": "/var/lib/dpkg/info/x11-common.list", "type": "file" }, { - "bom-ref": "5215e1e7aff5da49", + "bom-ref": "a988cb553283b273", "name": "/var/lib/dpkg/info/x11-common.md5sums", "type": "file" }, { - "bom-ref": "3918b08b3bf4f0cb", + "bom-ref": "1a698d8ca717bc09", "name": "/var/lib/dpkg/info/x11-common.postinst", "type": "file" }, { - "bom-ref": "da01b0f7ccd1330f", + "bom-ref": "bdf3518d59ad4491", "name": "/var/lib/dpkg/info/x11-common.postrm", "type": "file" }, { - "bom-ref": "785ea392bbf64b81", + "bom-ref": "6b131625d894593f", "name": "/var/lib/dpkg/info/x11-common.preinst", "type": "file" }, { - "bom-ref": "30819c9aebae5a2c", + "bom-ref": "da241344ac48e74e", "name": "/var/lib/dpkg/info/x11-common.prerm", "type": "file" }, { - "bom-ref": "15378950e89cde49", - "name": "/var/lib/dpkg/info/xml-core.conffiles", - "type": "file" - }, - { - "bom-ref": "dfb43939271a34f7", - "name": "/var/lib/dpkg/info/xml-core.list", - "type": "file" - }, - { - "bom-ref": "02a26050220e06a6", - "name": "/var/lib/dpkg/info/xml-core.md5sums", - "type": "file" - }, - { - "bom-ref": "cd046d9d4f387a0e", - "name": "/var/lib/dpkg/info/xml-core.postinst", - "type": "file" - }, - { - "bom-ref": "fbc0abc77a4ed852", - "name": "/var/lib/dpkg/info/xml-core.postrm", - "type": "file" - }, - { - "bom-ref": "29d415c10b1e4bce", - "name": "/var/lib/dpkg/info/xml-core.preinst", - "type": "file" - }, - { - "bom-ref": "6fcc4c75be094e16", - "name": "/var/lib/dpkg/info/xml-core.prerm", - "type": "file" - }, - { - "bom-ref": "f423d3002e296ee0", - "name": "/var/lib/dpkg/info/xml-core.triggers", - "type": "file" - }, - { - "bom-ref": "5fbc9eebb676db80", + "bom-ref": "27f908256a50ee3d", "name": "/var/lib/dpkg/info/xz-utils.list", "type": "file" }, { - "bom-ref": "fec9018d4527677b", + "bom-ref": "aa3c49c18df41f66", "name": "/var/lib/dpkg/info/xz-utils.md5sums", "type": "file" }, { - "bom-ref": "ed047133261c9a95", + "bom-ref": "4b3952683e10e028", "name": "/var/lib/dpkg/info/xz-utils.postinst", "type": "file" }, { - "bom-ref": "022335b2e1a3cee8", + "bom-ref": "2a5c57c3a783aab9", "name": "/var/lib/dpkg/info/xz-utils.prerm", "type": "file" }, { - "bom-ref": "6e01002a8ef81050", + "bom-ref": "95da7a6ee88c5c42", "name": "/var/lib/dpkg/info/zlib1g-dev:amd64.md5sums", "type": "file" }, { - "bom-ref": "037f67ea5e19847c", + "bom-ref": "6ce50de9e425df12", "name": "/var/lib/dpkg/info/zlib1g:amd64.md5sums", "type": "file" }, { - "bom-ref": "a1937fa26b3e7962", + "bom-ref": "52157a1755889adc", "name": "/var/lib/dpkg/status", "type": "file" }, { "author": "Project Jupyter", - "bom-ref": "pkg:npm/%40jupyter-notebook/lab-extension@7.5.6?package-id=a7dcef49b8ee5127", - "cpe": "cpe:2.3:a:\\@jupyter-notebook\\/lab-extension:\\@jupyter-notebook\\/lab-extension:7.5.6:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/%40jupyter-notebook/lab-extension@7.6.2?package-id=67ad80a0a3a53e08", + "cpe": "cpe:2.3:a:\\@jupyter-notebook\\/lab-extension:\\@jupyter-notebook\\/lab-extension:7.6.2:*:*:*:*:*:*:*", "description": "Jupyter Notebook - Lab Extension", "externalReferences": [ { @@ -105045,13 +107200,13 @@ } ], "name": "@jupyter-notebook/lab-extension", - "purl": "pkg:npm/%40jupyter-notebook/lab-extension@7.5.6", + "purl": "pkg:npm/%40jupyter-notebook/lab-extension@7.6.2", "type": "library", - "version": "7.5.6" + "version": "7.6.2" }, { - "bom-ref": "pkg:npm/%40jupyterlab/application-top@4.5.10?package-id=6b5c53d67fa5369d", - "cpe": "cpe:2.3:a:\\@jupyterlab\\/application-top:\\@jupyterlab\\/application-top:4.5.10:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/%40jupyterlab/application-top@4.6.3?package-id=9776660f24005e80", + "cpe": "cpe:2.3:a:\\@jupyterlab\\/application-top:\\@jupyterlab\\/application-top:4.6.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105060,13 +107215,13 @@ } ], "name": "@jupyterlab/application-top", - "purl": "pkg:npm/%40jupyterlab/application-top@4.5.10", + "purl": "pkg:npm/%40jupyterlab/application-top@4.6.3", "type": "library", - "version": "4.5.10" + "version": "4.6.3" }, { - "bom-ref": "pkg:npm/%40jupyterlab/application-top@4.5.10?package-id=9ea955347d1fa600", - "cpe": "cpe:2.3:a:\\@jupyterlab\\/application-top:\\@jupyterlab\\/application-top:4.5.10:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/%40jupyterlab/application-top@4.6.3?package-id=985c6c5b2a881651", + "cpe": "cpe:2.3:a:\\@jupyterlab\\/application-top:\\@jupyterlab\\/application-top:4.6.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105075,13 +107230,13 @@ } ], "name": "@jupyterlab/application-top", - "purl": "pkg:npm/%40jupyterlab/application-top@4.5.10", + "purl": "pkg:npm/%40jupyterlab/application-top@4.6.3", "type": "library", - "version": "4.5.10" + "version": "4.6.3" }, { - "bom-ref": "pkg:npm/%40jupyterlab/application-top@4.5.10?package-id=f15adb626ea3669c", - "cpe": "cpe:2.3:a:\\@jupyterlab\\/application-top:\\@jupyterlab\\/application-top:4.5.10:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/%40jupyterlab/application-top@4.6.3?package-id=efaf9c3d98ba8e1a", + "cpe": "cpe:2.3:a:\\@jupyterlab\\/application-top:\\@jupyterlab\\/application-top:4.6.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105090,14 +107245,14 @@ } ], "name": "@jupyterlab/application-top", - "purl": "pkg:npm/%40jupyterlab/application-top@4.5.10", + "purl": "pkg:npm/%40jupyterlab/application-top@4.6.3", "type": "library", - "version": "4.5.10" + "version": "4.6.3" }, { "author": "Project Jupyter", - "bom-ref": "pkg:npm/%40jupyterlab/galata-extension@5.5.9?package-id=a6437160022ba760", - "cpe": "cpe:2.3:a:\\@jupyterlab\\/galata-extension:\\@jupyterlab\\/galata-extension:5.5.9:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/%40jupyterlab/galata-extension@5.6.2?package-id=51d734ecfd86eb75", + "cpe": "cpe:2.3:a:\\@jupyterlab\\/galata-extension:\\@jupyterlab\\/galata-extension:5.6.2:*:*:*:*:*:*:*", "description": "JupyterLab UI Testing Framework Extension.", "externalReferences": [ { @@ -105117,25 +107272,25 @@ } ], "name": "@jupyterlab/galata-extension", - "purl": "pkg:npm/%40jupyterlab/galata-extension@5.5.9", + "purl": "pkg:npm/%40jupyterlab/galata-extension@5.6.2", "type": "library", - "version": "5.5.9" + "version": "5.6.2" }, { - "bom-ref": "pkg:npm/%40jupyterlab/mock-consumer@4.5.10?package-id=755e9e62f4bac083", - "cpe": "cpe:2.3:a:\\@jupyterlab\\/mock-consumer:\\@jupyterlab\\/mock-consumer:4.5.10:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/%40jupyterlab/mock-consumer@4.6.3?package-id=15bff215ec414dd4", + "cpe": "cpe:2.3:a:\\@jupyterlab\\/mock-consumer:\\@jupyterlab\\/mock-consumer:4.6.3:*:*:*:*:*:*:*", "name": "@jupyterlab/mock-consumer", - "purl": "pkg:npm/%40jupyterlab/mock-consumer@4.5.10", + "purl": "pkg:npm/%40jupyterlab/mock-consumer@4.6.3", "type": "library", - "version": "4.5.10" + "version": "4.6.3" }, { - "bom-ref": "pkg:npm/%40jupyterlab/mock-extension@4.5.10?package-id=71e4aeb41109b096", - "cpe": "cpe:2.3:a:\\@jupyterlab\\/mock-extension:\\@jupyterlab\\/mock-extension:4.5.10:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/%40jupyterlab/mock-extension@4.6.3?package-id=20492888b0dc7389", + "cpe": "cpe:2.3:a:\\@jupyterlab\\/mock-extension:\\@jupyterlab\\/mock-extension:4.6.3:*:*:*:*:*:*:*", "name": "@jupyterlab/mock-extension", - "purl": "pkg:npm/%40jupyterlab/mock-extension@4.5.10", + "purl": "pkg:npm/%40jupyterlab/mock-extension@4.6.3", "type": "library", - "version": "4.5.10" + "version": "4.6.3" }, { "bom-ref": "pkg:npm/%40jupyterlab/mock-incompat@0.1.0?package-id=e8b3e8a789dac04a", @@ -105162,66 +107317,66 @@ "version": "0.1.0" }, { - "bom-ref": "pkg:npm/%40jupyterlab/mock-provider@4.5.10?package-id=f9c9b259b4b0b187", - "cpe": "cpe:2.3:a:\\@jupyterlab\\/mock-provider:\\@jupyterlab\\/mock-provider:4.5.10:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/%40jupyterlab/mock-provider@4.6.3?package-id=705b3f000e224181", + "cpe": "cpe:2.3:a:\\@jupyterlab\\/mock-provider:\\@jupyterlab\\/mock-provider:4.6.3:*:*:*:*:*:*:*", "name": "@jupyterlab/mock-provider", - "purl": "pkg:npm/%40jupyterlab/mock-provider@4.5.10", + "purl": "pkg:npm/%40jupyterlab/mock-provider@4.6.3", "type": "library", - "version": "4.5.10" + "version": "4.6.3" }, { - "bom-ref": "pkg:npm/%40jupyterlab/mock-service-manager-extension@4.5.10?package-id=b10f67928d2591dd", - "cpe": "cpe:2.3:a:\\@jupyterlab\\/mock-service-manager-extension:\\@jupyterlab\\/mock-service-manager-extension:4.5.10:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/%40jupyterlab/mock-service-manager-extension@4.6.3?package-id=fa8080e7ab89e28b", + "cpe": "cpe:2.3:a:\\@jupyterlab\\/mock-service-manager-extension:\\@jupyterlab\\/mock-service-manager-extension:4.6.3:*:*:*:*:*:*:*", "name": "@jupyterlab/mock-service-manager-extension", - "purl": "pkg:npm/%40jupyterlab/mock-service-manager-extension@4.5.10", + "purl": "pkg:npm/%40jupyterlab/mock-service-manager-extension@4.6.3", "type": "library", - "version": "4.5.10" + "version": "4.6.3" }, { - "bom-ref": "pkg:npm/%40jupyterlab/mock-token@4.5.10?package-id=1ba846831a989ab9", - "cpe": "cpe:2.3:a:\\@jupyterlab\\/mock-token:\\@jupyterlab\\/mock-token:4.5.10:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/%40jupyterlab/mock-token@4.6.3?package-id=492273168fd62b4d", + "cpe": "cpe:2.3:a:\\@jupyterlab\\/mock-token:\\@jupyterlab\\/mock-token:4.6.3:*:*:*:*:*:*:*", "name": "@jupyterlab/mock-token", - "purl": "pkg:npm/%40jupyterlab/mock-token@4.5.10", + "purl": "pkg:npm/%40jupyterlab/mock-token@4.6.3", "type": "library", - "version": "4.5.10" + "version": "4.6.3" }, { - "bom-ref": "027d8c1201a84729", + "bom-ref": "002c61401282fa83", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "2ccc82adbf832828", + "bom-ref": "027d8c1201a84729", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "332a1ccb1d3c9f22", + "bom-ref": "2ccc82adbf832828", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "3943e01d921cfccc", + "bom-ref": "32e1cc093a822750", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "46aa6828423e0025", + "bom-ref": "3943e01d921cfccc", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "487a0f6ec84adebd", + "bom-ref": "46aa6828423e0025", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", @@ -105242,28 +107397,28 @@ "version": "1.1.0.14" }, { - "bom-ref": "675b58eb38b52634", + "bom-ref": "81624ed328676ba6", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "85d3ddaf24cde8e4", + "bom-ref": "b72f0f886f9a3e50", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "d99e3d071e977be8", + "bom-ref": "ca7d3eb8e6c3bd23", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", "version": "1.1.0.14" }, { - "bom-ref": "e5a1c7528ddaf7ab", + "bom-ref": "f3a366a27616ff73", "cpe": "cpe:2.3:a:Simple_Launcher:Simple_Launcher:1.1.0.14:*:*:*:*:*:*:*", "name": "Simple Launcher", "type": "application", @@ -105278,8 +107433,8 @@ }, { "author": "The Abseil Authors", - "bom-ref": "pkg:pypi/absl-py@2.4.0?package-id=d2d0ae7b6391b0a8", - "cpe": "cpe:2.3:a:abseil_authors_project:python-absl-py:2.4.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/absl-py@2.5.0?package-id=2d2e3fe7b4e13628", + "cpe": "cpe:2.3:a:abseil_authors_project:python-absl-py:2.5.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105288,14 +107443,14 @@ } ], "name": "absl-py", - "purl": "pkg:pypi/absl-py@2.4.0", + "purl": "pkg:pypi/absl-py@2.5.0", "type": "library", - "version": "2.4.0" + "version": "2.5.0" }, { "author": "The Hugging Face team ", - "bom-ref": "pkg:pypi/accelerate@1.14.0?package-id=6bfbd48c5ab407b7", - "cpe": "cpe:2.3:a:hugging_face_team_project:python-accelerate:1.14.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/accelerate@1.15.0?package-id=d27ec18bc233d4a1", + "cpe": "cpe:2.3:a:hugging_face_team_project:python-accelerate:1.15.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105304,9 +107459,9 @@ } ], "name": "accelerate", - "purl": "pkg:pypi/accelerate@1.14.0", + "purl": "pkg:pypi/accelerate@1.15.0", "type": "library", - "version": "1.14.0" + "version": "1.15.0" }, { "bom-ref": "pkg:deb/ubuntu/adduser@3.137ubuntu1?arch=all&distro=ubuntu-24.04&package-id=1ab618881401f6d6", @@ -105335,8 +107490,8 @@ }, { "author": "J. Nick Koston ", - "bom-ref": "pkg:pypi/aiohappyeyeballs@2.6.1?package-id=9feff7f006db242c", - "cpe": "cpe:2.3:a:python-aiohappyeyeballs:python-aiohappyeyeballs:2.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/aiohappyeyeballs@2.7.1?package-id=00e775cbefbfdff2", + "cpe": "cpe:2.3:a:python-aiohappyeyeballs:python-aiohappyeyeballs:2.7.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105345,22 +107500,22 @@ } ], "name": "aiohappyeyeballs", - "purl": "pkg:pypi/aiohappyeyeballs@2.6.1", + "purl": "pkg:pypi/aiohappyeyeballs@2.7.1", "type": "library", - "version": "2.6.1" + "version": "2.7.1" }, { - "bom-ref": "pkg:pypi/aiohttp@3.13.5?package-id=bc7f15c84af8fd87", - "cpe": "cpe:2.3:a:python-aiohttp:python-aiohttp:3.13.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/aiohttp@3.14.3?package-id=12a967ffd61e164f", + "cpe": "cpe:2.3:a:python-aiohttp:python-aiohttp:3.14.3:*:*:*:*:*:*:*", "licenses": [ { "expression": "Apache-2.0 AND MIT" } ], "name": "aiohttp", - "purl": "pkg:pypi/aiohttp@3.13.5", + "purl": "pkg:pypi/aiohttp@3.14.3", "type": "library", - "version": "3.13.5" + "version": "3.14.3" }, { "bom-ref": "pkg:pypi/aiosignal@1.4.0?package-id=f588ce8df3532475", @@ -105379,8 +107534,8 @@ }, { "author": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "bom-ref": "pkg:pypi/annotated-doc@0.0.4?package-id=c32c425eb73bee0b", - "cpe": "cpe:2.3:a:python-annotated-doc:python-annotated-doc:0.0.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/annotated-doc@0.0.5?package-id=8ec0eb67e9c7ed22", + "cpe": "cpe:2.3:a:python-annotated-doc:python-annotated-doc:0.0.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105389,22 +107544,29 @@ } ], "name": "annotated-doc", - "purl": "pkg:pypi/annotated-doc@0.0.4", + "purl": "pkg:pypi/annotated-doc@0.0.5", "type": "library", - "version": "0.0.4" + "version": "0.0.5" }, { "author": "Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Samuel Colvin , Zac Hatfield-Dodds ", - "bom-ref": "pkg:pypi/annotated-types@0.7.0?package-id=b0ef1a02206e6100", - "cpe": "cpe:2.3:a:adrian_garcia_badaracco_\\<1755071\\+adriangb_project:python-annotated-types:0.7.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/annotated-types@0.8.0?package-id=b07aed3099847979", + "cpe": "cpe:2.3:a:adrian_garcia_badaracco_\\<1755071\\+adriangb_project:python-annotated-types:0.8.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], "name": "annotated-types", - "purl": "pkg:pypi/annotated-types@0.7.0", + "purl": "pkg:pypi/annotated-types@0.8.0", "type": "library", - "version": "0.7.0" + "version": "0.8.0" }, { "author": "Eric Vergnaud, Terence Parr, Sam Harwell ", - "bom-ref": "pkg:pypi/antlr4-python3-runtime@4.9.3?package-id=4d16bd22b3beb2cf", + "bom-ref": "pkg:pypi/antlr4-python3-runtime@4.9.3?package-id=45827425ac9ae96a", "cpe": "cpe:2.3:a:eric_vergnaud\\,_terence_parr\\,_sam_harwell_project:python-antlr4-python3-runtime:4.9.3:*:*:*:*:*:*:*", "licenses": [ { @@ -105420,8 +107582,8 @@ }, { "author": "Alex Gr\u00f6nholm ", - "bom-ref": "pkg:pypi/anyio@4.13.0?package-id=b212fb83c175a84e", - "cpe": "cpe:2.3:a:python-anyio:python-anyio:4.13.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/anyio@4.14.2?package-id=287700103d81bb78", + "cpe": "cpe:2.3:a:python-anyio:python-anyio:4.14.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105430,9 +107592,9 @@ } ], "name": "anyio", - "purl": "pkg:pypi/anyio@4.13.0", + "purl": "pkg:pypi/anyio@4.14.2", "type": "library", - "version": "4.13.0" + "version": "4.14.2" }, { "author": "TVM FFI team", @@ -105451,7 +107613,7 @@ "version": "0.1.13.post2" }, { - "bom-ref": "pkg:pypi/apex@0.1?package-id=c1281f111d8af341", + "bom-ref": "pkg:pypi/apex@0.1?package-id=bc068e7d15d402d8", "cpe": "cpe:2.3:a:python-apex:python-apex:0.1:*:*:*:*:*:*:*", "externalReferences": [ { @@ -105500,8 +107662,8 @@ }, { "author": "Hynek Schlawack ", - "bom-ref": "pkg:pypi/argon2-cffi-bindings@25.1.0?package-id=47f1669311621558", - "cpe": "cpe:2.3:a:hynek_schlawack_\\", @@ -105575,8 +107737,8 @@ }, { "author": "Dmitry Sagalovskiy, Grist Labs ", - "bom-ref": "pkg:pypi/asttokens@3.0.1?package-id=cbfe5be71b39d630", - "cpe": "cpe:2.3:a:dmitry_sagalovskiy\\,_grist_labs_project:python-asttokens:3.0.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/asttokens@3.0.2?package-id=d1d1acd028097910", + "cpe": "cpe:2.3:a:dmitry_sagalovskiy\\,_grist_labs_project:python-asttokens:3.0.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105585,9 +107747,9 @@ } ], "name": "asttokens", - "purl": "pkg:pypi/asttokens@3.0.1", + "purl": "pkg:pypi/asttokens@3.0.2", "type": "library", - "version": "3.0.1" + "version": "3.0.2" }, { "bom-ref": "pkg:pypi/astunparse@1.6.3?package-id=af73551ec76db570", @@ -105712,8 +107874,8 @@ }, { "author": "Microsoft Corporation ", - "bom-ref": "pkg:pypi/azure-storage-blob@12.30.0?package-id=5b4a005e0c0f1f28", - "cpe": "cpe:2.3:a:microsoft_corporation_project:python-azure-storage-blob:12.30.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/azure-storage-blob@12.30.1?package-id=c114f824d855cd1a", + "cpe": "cpe:2.3:a:microsoft_corporation_project:python-azure-storage-blob:12.30.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105722,9 +107884,9 @@ } ], "name": "azure-storage-blob", - "purl": "pkg:pypi/azure-storage-blob@12.30.0", + "purl": "pkg:pypi/azure-storage-blob@12.30.1", "type": "library", - "version": "12.30.0" + "version": "12.30.1" }, { "author": "Armin Ronacher ", @@ -105811,8 +107973,8 @@ }, { "author": "Leonard Richardson ", - "bom-ref": "pkg:pypi/beautifulsoup4@4.14.3?package-id=6369582e49e254f6", - "cpe": "cpe:2.3:a:leonard_richardson_\\, Bern\u00e1t G\u00e1bor , layday , Henry Schreiner ", - "bom-ref": "pkg:pypi/build@1.5.0?package-id=671cd8ef93c8c612", - "cpe": "cpe:2.3:a:python-build:python-build:1.5.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/build@1.6.1?package-id=60f7431813c4c442", + "cpe": "cpe:2.3:a:python-build:python-build:1.6.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105950,9 +108112,9 @@ } ], "name": "build", - "purl": "pkg:pypi/build@1.5.0", + "purl": "pkg:pypi/build@1.6.1", "type": "library", - "version": "1.5.0" + "version": "1.6.1" }, { "bom-ref": "pkg:deb/ubuntu/build-essential@12.10ubuntu1?arch=amd64&distro=ubuntu-24.04&package-id=0951c7e9ea32d5d3", @@ -105973,25 +108135,8 @@ "version": "1.0.8-5.1build0.1" }, { - "bom-ref": "pkg:deb/ubuntu/ca-certificates@20260601~24.04.1?arch=all&distro=ubuntu-24.04&package-id=90dbb1a8b8c2da5c", + "bom-ref": "pkg:deb/ubuntu/ca-certificates@20260601~24.04.1?arch=all&distro=ubuntu-24.04&package-id=eac8314db6031a49", "cpe": "cpe:2.3:a:ca-certificates:ca-certificates:20260601\\~24.04.1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "GPL-2.0-only" - } - }, - { - "license": { - "id": "GPL-2.0-or-later" - } - }, - { - "license": { - "id": "MPL-2.0" - } - } - ], "name": "ca-certificates", "publisher": "Ubuntu Developers ", "purl": "pkg:deb/ubuntu/ca-certificates@20260601~24.04.1?arch=all&distro=ubuntu-24.04", @@ -106000,12 +108145,12 @@ }, { "author": "DefTruth, vipshop.com, etc.", - "bom-ref": "pkg:pypi/cache-dit@1.5.0?package-id=c6ed2f828a25089c", - "cpe": "cpe:2.3:a:deftruth\\,_vipshop_com\\,_etc__project:python-cache-dit:1.5.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/cache-dit@1.5.2?package-id=3ef55f88decc2e54", + "cpe": "cpe:2.3:a:deftruth\\,_vipshop_com\\,_etc__project:python-cache-dit:1.5.2:*:*:*:*:*:*:*", "name": "cache-dit", - "purl": "pkg:pypi/cache-dit@1.5.0", + "purl": "pkg:pypi/cache-dit@1.5.2", "type": "library", - "version": "1.5.0" + "version": "1.5.2" }, { "bom-ref": "029484c60bef2128", @@ -106030,10 +108175,19 @@ "type": "library", "version": "4.9.1-1" }, + { + "bom-ref": "pkg:deb/ubuntu/cccl-13-4@13.3.4.2.1-1?arch=amd64&distro=ubuntu-24.04&package-id=086eeab639fb0d79&upstream=cccl", + "cpe": "cpe:2.3:a:cccl-13-4:cccl-13-4:13.3.4.2.1-1:*:*:*:*:*:*:*", + "name": "cccl-13-4", + "publisher": "cudatools ", + "purl": "pkg:deb/ubuntu/cccl-13-4@13.3.4.2.1-1?arch=amd64&distro=ubuntu-24.04&upstream=cccl", + "type": "library", + "version": "13.3.4.2.1-1" + }, { "author": "Kenneth Reitz ", - "bom-ref": "pkg:pypi/certifi@2026.4.22?package-id=1ef17bd515d577cd", - "cpe": "cpe:2.3:a:certifi:certifi:2026.4.22:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/certifi@2026.7.22?package-id=fddead20352afbaa", + "cpe": "cpe:2.3:a:certifi:certifi:2026.7.22:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -106042,30 +108196,30 @@ } ], "name": "certifi", - "purl": "pkg:pypi/certifi@2026.4.22", + "purl": "pkg:pypi/certifi@2026.7.22", "type": "library", - "version": "2026.4.22" + "version": "2026.7.22" }, { "author": "Armin Rigo, Maciej Fijalkowski", - "bom-ref": "pkg:pypi/cffi@2.0.0?package-id=21163b47d8fe61d2", - "cpe": "cpe:2.3:a:armin_rigo\\,_maciej_fijalkowski_project:python-cffi:2.0.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/cffi@2.1.1?package-id=026c072101152e9c", + "cpe": "cpe:2.3:a:armin_rigo\\,_maciej_fijalkowski_project:python-cffi:2.1.1:*:*:*:*:*:*:*", "licenses": [ { "license": { - "id": "MIT" + "id": "MIT-0" } } ], "name": "cffi", - "purl": "pkg:pypi/cffi@2.0.0", + "purl": "pkg:pypi/cffi@2.1.1", "type": "library", - "version": "2.0.0" + "version": "2.1.1" }, { "author": "\"Ahmed R. TAHRI\" ", - "bom-ref": "pkg:pypi/charset-normalizer@3.4.7?package-id=f810aec60c358a1f", - "cpe": "cpe:2.3:a:\\\"ahmed_r__tahri\\\"_\\", @@ -106155,6 +108309,22 @@ "type": "library", "version": "0.5.9" }, + { + "author": "The cloudpickle developer team ", + "bom-ref": "pkg:pypi/cloudpickle@3.1.2?package-id=5b6f9e2f42b61170", + "cpe": "cpe:2.3:a:cloudpickle_developer_team_project:python-cloudpickle:3.1.2:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ], + "name": "cloudpickle", + "purl": "pkg:pypi/cloudpickle@3.1.2", + "type": "library", + "version": "3.1.2" + }, { "author": "Jean-Christophe Fillion-Robin ", "bom-ref": "pkg:pypi/cmake@3.31.6?package-id=a68ee747deec8db8", @@ -106206,7 +108376,7 @@ "version": "0.2.3" }, { - "bom-ref": "pkg:golang/command-line-arguments?package-id=c5690151cd2c916d", + "bom-ref": "pkg:golang/command-line-arguments?package-id=238e052b4c617c38", "name": "command-line-arguments", "purl": "pkg:golang/command-line-arguments", "type": "library", @@ -106287,42 +108457,42 @@ "type": "library", "version": "50.0.1" }, + { + "bom-ref": "pkg:deb/ubuntu/cublasmp-cuda-13@0.10.0.3695-1?arch=amd64&distro=ubuntu-24.04&package-id=9ec151910e12e5b5&upstream=libcublasmp", + "cpe": "cpe:2.3:a:cublasmp-cuda-13:cublasmp-cuda-13:0.10.0.3695-1:*:*:*:*:*:*:*", + "name": "cublasmp-cuda-13", + "publisher": "cudatools ", + "purl": "pkg:deb/ubuntu/cublasmp-cuda-13@0.10.0.3695-1?arch=amd64&distro=ubuntu-24.04&upstream=libcublasmp", + "type": "library", + "version": "0.10.0.3695-1" + }, { "author": "NVIDIA Corporation ", - "bom-ref": "pkg:pypi/cuda-bindings@13.2.0?package-id=01289b67de8cc7b2", - "cpe": "cpe:2.3:a:nvidia_corporation_\\", - "purl": "pkg:deb/ubuntu/cuda-cccl-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cccl", - "type": "library", - "version": "13.2.75-1" - }, - { - "bom-ref": "pkg:deb/ubuntu/cuda-compat-13-2@595.58.03-1ubuntu1?arch=amd64&distro=ubuntu-24.04&package-id=d34adab3063bf84c&upstream=nvidia-graphics-drivers", - "cpe": "cpe:2.3:a:cuda-compat-13-2:cuda-compat-13-2:595.58.03-1ubuntu1:*:*:*:*:*:*:*", - "name": "cuda-compat-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-compat-13-4@615.65.02-1ubuntu1?arch=amd64&distro=ubuntu-24.04&package-id=24d5f607b0e3e144&upstream=nvidia-graphics-drivers", + "cpe": "cpe:2.3:a:cuda-compat-13-4:cuda-compat-13-4:615.65.02-1ubuntu1:*:*:*:*:*:*:*", + "name": "cuda-compat-13-4", "publisher": "NVIDIA ", - "purl": "pkg:deb/ubuntu/cuda-compat-13-2@595.58.03-1ubuntu1?arch=amd64&distro=ubuntu-24.04&upstream=nvidia-graphics-drivers", + "purl": "pkg:deb/ubuntu/cuda-compat-13-4@615.65.02-1ubuntu1?arch=amd64&distro=ubuntu-24.04&upstream=nvidia-graphics-drivers", "type": "library", - "version": "595.58.03-1ubuntu1" + "version": "615.65.02-1ubuntu1" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/cuda-core@1.1.1?package-id=7c861c4bfa4c0a99", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-cuda-core:1.1.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/cuda-core@1.0.1?package-id=194bec7fc3c536e0", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-cuda-core:1.0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106331,99 +108501,90 @@ } ], "name": "cuda-core", - "purl": "pkg:pypi/cuda-core@1.1.1", - "type": "library", - "version": "1.1.1" - }, - { - "bom-ref": "pkg:deb/ubuntu/cuda-crt-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=86ec1f91e80f324c&upstream=cuda-crt", - "cpe": "cpe:2.3:a:cuda-crt-13-2:cuda-crt-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-crt-13-2", - "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-crt-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-crt", + "purl": "pkg:pypi/cuda-core@1.0.1", "type": "library", - "version": "13.2.78-1" + "version": "1.0.1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-cudart-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&package-id=53a278acb9bdf6ef&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-cudart-13-2:cuda-cudart-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-cudart-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-crt-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&package-id=f49bacab270f6e3f&upstream=cuda-crt", + "cpe": "cpe:2.3:a:cuda-crt-13-4:cuda-crt-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "cuda-crt-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-cudart-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-crt-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-crt", "type": "library", - "version": "13.2.75-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-cudart-dev-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&package-id=28bdb7c93b5a320f&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-cudart-dev-13-2:cuda-cudart-dev-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-cudart-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-cudart-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=7ab546c0e101fb25&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-cudart-13-4:cuda-cudart-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-cudart-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-cudart-dev-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-cudart-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-culibos-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&package-id=faba80572a7a2319&upstream=cuda-culibos", - "cpe": "cpe:2.3:a:cuda-culibos-13-2:cuda-culibos-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-culibos-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-cudart-dev-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=ab20b18b48888eec&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-cudart-dev-13-4:cuda-cudart-dev-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-cudart-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-culibos-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-culibos", + "purl": "pkg:deb/ubuntu/cuda-cudart-dev-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-culibos-dev-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&package-id=d4d0c894e36558ac&upstream=cuda-culibos", - "cpe": "cpe:2.3:a:cuda-culibos-dev-13-2:cuda-culibos-dev-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-culibos-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-culibos-dev-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=94c9a696a1ae96ee&upstream=cuda-culibos", + "cpe": "cpe:2.3:a:cuda-culibos-dev-13-4:cuda-culibos-dev-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-culibos-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-culibos-dev-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-culibos", + "purl": "pkg:deb/ubuntu/cuda-culibos-dev-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-culibos", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-cuobjdump-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=fe708dd92e62fca8&upstream=cuda-cuobjdump", - "cpe": "cpe:2.3:a:cuda-cuobjdump-13-2:cuda-cuobjdump-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-cuobjdump-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-cuobjdump-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=6839461c2c40e336&upstream=cuda-cuobjdump", + "cpe": "cpe:2.3:a:cuda-cuobjdump-13-4:cuda-cuobjdump-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-cuobjdump-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-cuobjdump-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cuobjdump", + "purl": "pkg:deb/ubuntu/cuda-cuobjdump-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cuobjdump", "type": "library", - "version": "13.2.78-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-cupti-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&package-id=e287b13f14f15340&upstream=cuda-cupti", - "cpe": "cpe:2.3:a:cuda-cupti-13-2:cuda-cupti-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-cupti-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-cupti-13-4@13.4.58-1?arch=amd64&distro=ubuntu-24.04&package-id=c0df77fa9f88550d&upstream=cuda-cupti", + "cpe": "cpe:2.3:a:cuda-cupti-13-4:cuda-cupti-13-4:13.4.58-1:*:*:*:*:*:*:*", + "name": "cuda-cupti-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-cupti-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cupti", + "purl": "pkg:deb/ubuntu/cuda-cupti-13-4@13.4.58-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cupti", "type": "library", - "version": "13.2.75-1" + "version": "13.4.58-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-cupti-dev-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&package-id=8c1a3badac186396&upstream=cuda-cupti", - "cpe": "cpe:2.3:a:cuda-cupti-dev-13-2:cuda-cupti-dev-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-cupti-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-cupti-dev-13-4@13.4.58-1?arch=amd64&distro=ubuntu-24.04&package-id=ecd626ba3570a3aa&upstream=cuda-cupti", + "cpe": "cpe:2.3:a:cuda-cupti-dev-13-4:cuda-cupti-dev-13-4:13.4.58-1:*:*:*:*:*:*:*", + "name": "cuda-cupti-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-cupti-dev-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cupti", + "purl": "pkg:deb/ubuntu/cuda-cupti-dev-13-4@13.4.58-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cupti", "type": "library", - "version": "13.2.75-1" + "version": "13.4.58-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-driver-dev-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&package-id=84b68b3c07df515a&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-driver-dev-13-2:cuda-driver-dev-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-driver-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-driver-dev-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=6f298ce6d7837226&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-driver-dev-13-4:cuda-driver-dev-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-driver-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-driver-dev-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-driver-dev-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-gdb-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&package-id=930931428da79d6e&upstream=cuda-gdb", - "cpe": "cpe:2.3:a:cuda-gdb-13-2:cuda-gdb-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-gdb-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-gdb-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=9a0c6de9bc474f8f&upstream=cuda-gdb", + "cpe": "cpe:2.3:a:cuda-gdb-13-4:cuda-gdb-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-gdb-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-gdb-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-gdb", + "purl": "pkg:deb/ubuntu/cuda-gdb-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-gdb", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { "bom-ref": "pkg:deb/ubuntu/cuda-keyring@1.1-1?arch=all&distro=ubuntu-24.04&package-id=c0beacd1064e56af", @@ -106435,79 +108596,72 @@ "version": "1.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvcc-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=96a79ba2814c5f76&upstream=cuda-nvcc", - "cpe": "cpe:2.3:a:cuda-nvcc-13-2:cuda-nvcc-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-nvcc-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvcc-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&package-id=96913d91d6b49857&upstream=cuda-nvcc", + "cpe": "cpe:2.3:a:cuda-nvcc-13-4:cuda-nvcc-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "cuda-nvcc-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvcc-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvcc", + "purl": "pkg:deb/ubuntu/cuda-nvcc-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvcc", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvdisasm-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=f6273e70e042a657&upstream=cuda-nvdisasm", - "cpe": "cpe:2.3:a:cuda-nvdisasm-13-2:cuda-nvdisasm-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-nvdisasm-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvdisasm-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=406e431961c5d660&upstream=cuda-nvdisasm", + "cpe": "cpe:2.3:a:cuda-nvdisasm-13-4:cuda-nvdisasm-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-nvdisasm-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvdisasm-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvdisasm", + "purl": "pkg:deb/ubuntu/cuda-nvdisasm-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvdisasm", "type": "library", - "version": "13.2.78-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvml-dev-13-2@13.2.82-1?arch=amd64&distro=ubuntu-24.04&package-id=693f5c37594b62a9&upstream=cuda-nvml-dev", - "cpe": "cpe:2.3:a:cuda-nvml-dev-13-2:cuda-nvml-dev-13-2:13.2.82-1:*:*:*:*:*:*:*", - "name": "cuda-nvml-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvml-dev-13-4@13.4.61-1?arch=amd64&distro=ubuntu-24.04&package-id=e577765f55503d55&upstream=cuda-nvml-dev", + "cpe": "cpe:2.3:a:cuda-nvml-dev-13-4:cuda-nvml-dev-13-4:13.4.61-1:*:*:*:*:*:*:*", + "name": "cuda-nvml-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvml-dev-13-2@13.2.82-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvml-dev", + "purl": "pkg:deb/ubuntu/cuda-nvml-dev-13-4@13.4.61-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvml-dev", "type": "library", - "version": "13.2.82-1" + "version": "13.4.61-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvprune-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=d51ee5b056236f00&upstream=cuda-nvprune", - "cpe": "cpe:2.3:a:cuda-nvprune-13-2:cuda-nvprune-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-nvprune-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvprune-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=0aa62da43baa1334&upstream=cuda-nvprune", + "cpe": "cpe:2.3:a:cuda-nvprune-13-4:cuda-nvprune-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-nvprune-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvprune-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvprune", + "purl": "pkg:deb/ubuntu/cuda-nvprune-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvprune", "type": "library", - "version": "13.2.78-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvrtc-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=6e47f8ddc54d88d2&upstream=cuda-nvrtc", - "cpe": "cpe:2.3:a:cuda-nvrtc-13-2:cuda-nvrtc-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-nvrtc-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvrtc-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&package-id=bfb2fab55bfc7d34&upstream=cuda-nvrtc", + "cpe": "cpe:2.3:a:cuda-nvrtc-13-4:cuda-nvrtc-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "cuda-nvrtc-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvrtc-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvrtc", + "purl": "pkg:deb/ubuntu/cuda-nvrtc-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvrtc", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvrtc-dev-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=09b9c49c2c31cede&upstream=cuda-nvrtc", - "cpe": "cpe:2.3:a:cuda-nvrtc-dev-13-2:cuda-nvrtc-dev-13-2:13.2.78-1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "sha256:0b7b3f1644af45c0e1279e995e5daa5b465997235c16bc86c83dcdf3c3b88b05" - } - } - ], - "name": "cuda-nvrtc-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvrtc-dev-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&package-id=42f3d085e38973cc&upstream=cuda-nvrtc", + "cpe": "cpe:2.3:a:cuda-nvrtc-dev-13-4:cuda-nvrtc-dev-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "cuda-nvrtc-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvrtc-dev-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvrtc", + "purl": "pkg:deb/ubuntu/cuda-nvrtc-dev-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvrtc", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvtx-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&package-id=fcdf6ba50597c8e3&upstream=cuda-nvtx", - "cpe": "cpe:2.3:a:cuda-nvtx-13-2:cuda-nvtx-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-nvtx-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvtx-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=344f3752f51689ee&upstream=cuda-nvtx", + "cpe": "cpe:2.3:a:cuda-nvtx-13-4:cuda-nvtx-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-nvtx-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvtx-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvtx", + "purl": "pkg:deb/ubuntu/cuda-nvtx-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-nvtx", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { "author": "NVIDIA Corporation ", - "bom-ref": "pkg:pypi/cuda-pathfinder@1.5.4?package-id=779b8da78a9ec783", - "cpe": "cpe:2.3:a:nvidia_corporation_\\", - "purl": "pkg:deb/ubuntu/cuda-profiler-api-13-2@13.2.75-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-profiler-api", + "purl": "pkg:deb/ubuntu/cuda-profiler-api-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-profiler-api", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { "author": "NVIDIA Corporation ", - "bom-ref": "pkg:pypi/cuda-python@13.2.0?package-id=6b72dfefdb25e8ab", - "cpe": "cpe:2.3:a:nvidia_corporation_\\", - "purl": "pkg:deb/ubuntu/cuda-sanitizer-13-2@13.2.76-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-sanitizer-api", + "purl": "pkg:deb/ubuntu/cuda-sanitizer-13-4@13.4.57-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-sanitizer-api", "type": "library", - "version": "13.2.76-1" + "version": "13.4.57-1" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/cuda-tile@1.5.0?package-id=47707ab7d7d91526", + "bom-ref": "pkg:pypi/cuda-tile@1.5.0?package-id=7de3d67f10ba6e1e", "cpe": "cpe:2.3:a:nvidia_corporation_project:python-cuda-tile:1.5.0:*:*:*:*:*:*:*", "licenses": [ { @@ -106569,40 +108723,40 @@ "version": "1.5.0" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-tileiras-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=da177e7806f10751&upstream=cuda-tileiras", - "cpe": "cpe:2.3:a:cuda-tileiras-13-2:cuda-tileiras-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-tileiras-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-tileiras-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&package-id=457c44f3629836e6&upstream=cuda-tileiras", + "cpe": "cpe:2.3:a:cuda-tileiras-13-4:cuda-tileiras-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "cuda-tileiras-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-tileiras-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-tileiras", + "purl": "pkg:deb/ubuntu/cuda-tileiras-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&upstream=cuda-tileiras", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-13-2-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&package-id=d357a903011a562b&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-toolkit-13-2-config-common:cuda-toolkit-13-2-config-common:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-toolkit-13-2-config-common", + "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-13-4-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&package-id=2080a8a07bd4ef08&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-toolkit-13-4-config-common:cuda-toolkit-13-4-config-common:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-toolkit-13-4-config-common", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-toolkit-13-2-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-toolkit-13-4-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-13-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&package-id=d319845a5472b677&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-toolkit-13-config-common:cuda-toolkit-13-config-common:13.2.75-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-13-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&package-id=75ac876a78b496c8&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-toolkit-13-config-common:cuda-toolkit-13-config-common:13.4.49-1:*:*:*:*:*:*:*", "name": "cuda-toolkit-13-config-common", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-toolkit-13-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-toolkit-13-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&package-id=e3c5df75d121fcf9&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-toolkit-config-common:cuda-toolkit-config-common:13.2.75-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&package-id=5408b330e2153487&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-toolkit-config-common:cuda-toolkit-config-common:13.4.49-1:*:*:*:*:*:*:*", "name": "cuda-toolkit-config-common", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-toolkit-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-toolkit-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { "bom-ref": "pkg:deb/ubuntu/curl@8.5.0-2ubuntu10.13?arch=amd64&distro=ubuntu-24.04&package-id=594eac251cca4bde", @@ -106691,8 +108845,8 @@ }, { "author": "Robert Bradshaw, Stefan Behnel, David Woods, Greg Ewing, et al. ", - "bom-ref": "pkg:pypi/cython@3.2.4?package-id=e462f50b5173d613", - "cpe": "cpe:2.3:a:robert_bradshaw\\,_stefan_behnel\\,_david_woods\\,_greg_ewing\\,_et_al__project:python-cython:3.2.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/cython@3.2.9?package-id=f7d817a2515fbda2", + "cpe": "cpe:2.3:a:robert_bradshaw\\,_stefan_behnel\\,_david_woods\\,_greg_ewing\\,_et_al__project:python-cython:3.2.9:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106701,9 +108855,9 @@ } ], "name": "cython", - "purl": "pkg:pypi/cython@3.2.4", + "purl": "pkg:pypi/cython@3.2.9", "type": "library", - "version": "3.2.4" + "version": "3.2.9" }, { "bom-ref": "pkg:deb/ubuntu/dash@0.5.12-6ubuntu5?arch=amd64&distro=ubuntu-24.04&package-id=b89b92823a8e8812", @@ -106750,8 +108904,8 @@ }, { "author": "Microsoft Corporation ", - "bom-ref": "pkg:pypi/debugpy@1.8.20?package-id=280d176bcbbe4560", - "cpe": "cpe:2.3:a:microsoft_corporation_project:python-debugpy:1.8.20:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/debugpy@1.8.21?package-id=79e97ff8d85fbe1d", + "cpe": "cpe:2.3:a:microsoft_corporation_project:python-debugpy:1.8.21:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106760,14 +108914,14 @@ } ], "name": "debugpy", - "purl": "pkg:pypi/debugpy@1.8.20", + "purl": "pkg:pypi/debugpy@1.8.21", "type": "library", - "version": "1.8.20" + "version": "1.8.21" }, { "author": "Michele Simionato ", - "bom-ref": "pkg:pypi/decorator@5.2.1?package-id=c7af6b5f314e1dde", - "cpe": "cpe:2.3:a:python:decorator:5.2.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/decorator@5.3.1?package-id=93f4cf01bc9d0f69", + "cpe": "cpe:2.3:a:python:decorator:5.3.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106776,9 +108930,9 @@ } ], "name": "decorator", - "purl": "pkg:pypi/decorator@5.2.1", + "purl": "pkg:pypi/decorator@5.3.1", "type": "library", - "version": "5.2.1" + "version": "5.3.1" }, { "author": "Christian Heimes ", @@ -106798,8 +108952,8 @@ }, { "author": "The Hugging Face team (past and future) with the help of all our contributors (https://github.com/huggingface/diffusers/graphs/contributors) ", - "bom-ref": "pkg:pypi/diffusers@0.39.0?package-id=bcf7b662c7411fde", - "cpe": "cpe:2.3:a:hugging_face_team_\\(past_and_future\\)_with_the_help_of_all_our_contributors_\\(https\\:\\/\\/github_com\\/huggingface\\/diffusers\\/graphs\\/contributors\\)_project:python-diffusers:0.39.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/diffusers@0.40.0?package-id=bce16e24907d3d79", + "cpe": "cpe:2.3:a:hugging_face_team_\\(past_and_future\\)_with_the_help_of_all_our_contributors_\\(https\\:\\/\\/github_com\\/huggingface\\/diffusers\\/graphs\\/contributors\\)_project:python-diffusers:0.40.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106808,9 +108962,9 @@ } ], "name": "diffusers", - "purl": "pkg:pypi/diffusers@0.39.0", + "purl": "pkg:pypi/diffusers@0.40.0", "type": "library", - "version": "0.39.0" + "version": "0.40.0" }, { "bom-ref": "pkg:deb/ubuntu/diffutils@1%3A3.10-1build1?arch=amd64&distro=ubuntu-24.04&package-id=59976cfae3beb8a7", @@ -106838,13 +108992,85 @@ "version": "0.3.8" }, { - "bom-ref": "pkg:deb/ubuntu/dirmngr@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&package-id=d9801f5b5cb294ee&upstream=gnupg2", - "cpe": "cpe:2.3:a:dirmngr:dirmngr:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/dirmngr@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&package-id=50a5f90955be3d4b&upstream=gnupg2", + "cpe": "cpe:2.3:a:dirmngr:dirmngr:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "dirmngr", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/dirmngr@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/dirmngr@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { "author": "Brian Ward ", @@ -106984,8 +109210,8 @@ }, { "author": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "bom-ref": "pkg:pypi/fastapi@0.121.3?package-id=a939de471190d282", - "cpe": "cpe:2.3:a:python-fastapi:python-fastapi:0.121.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/fastapi@0.141.1?package-id=cc4ee4e76c262b60", + "cpe": "cpe:2.3:a:python-fastapi:python-fastapi:0.141.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106994,28 +109220,28 @@ } ], "name": "fastapi", - "purl": "pkg:pypi/fastapi@0.121.3", + "purl": "pkg:pypi/fastapi@0.141.1", "type": "library", - "version": "0.121.3" + "version": "0.141.1" }, { "author": "Michal Horejsek ", - "bom-ref": "pkg:pypi/fastjsonschema@2.21.2?package-id=877ecd750c397004", - "cpe": "cpe:2.3:a:michal_horejsek_project:python-fastjsonschema:2.21.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/fastjsonschema@2.22.2?package-id=e83d3f49cf4720df", + "cpe": "cpe:2.3:a:michal_horejsek_project:python-fastjsonschema:2.22.2:*:*:*:*:*:*:*", "licenses": [ { "license": { - "name": "BSD" + "id": "BSD-3-Clause" } } ], "name": "fastjsonschema", - "purl": "pkg:pypi/fastjsonschema@2.21.2", + "purl": "pkg:pypi/fastjsonschema@2.22.2", "type": "library", - "version": "2.21.2" + "version": "2.22.2" }, { - "bom-ref": "pkg:generic/ffmpeg@4.4?package-id=f5bfd050463d04b7", + "bom-ref": "pkg:generic/ffmpeg@4.4?package-id=ee09cde319df3c52", "cpe": "cpe:2.3:a:ffmpeg:ffmpeg:4.4:*:*:*:*:*:*:*", "name": "ffmpeg", "purl": "pkg:generic/ffmpeg@4.4", @@ -107023,15 +109249,15 @@ "version": "4.4" }, { - "bom-ref": "pkg:generic/ffmpeg@62.12.100?package-id=ad69df15b8e4bcee", - "cpe": "cpe:2.3:a:ffmpeg:ffmpeg:62.12.100:*:*:*:*:*:*:*", + "bom-ref": "pkg:generic/ffmpeg@62.12.101?package-id=d414beb1ba591c5c", + "cpe": "cpe:2.3:a:ffmpeg:ffmpeg:62.12.101:*:*:*:*:*:*:*", "name": "ffmpeg", - "purl": "pkg:generic/ffmpeg@62.12.100", + "purl": "pkg:generic/ffmpeg@62.12.101", "type": "application", - "version": "62.12.100" + "version": "62.12.101" }, { - "bom-ref": "pkg:generic/ffmpeg@7.0.2?package-id=6b559d0cc7dabdb1", + "bom-ref": "pkg:generic/ffmpeg@7.0.2?package-id=0fa688bd71f488de", "cpe": "cpe:2.3:a:ffmpeg:ffmpeg:7.0.2:*:*:*:*:*:*:*", "name": "ffmpeg", "purl": "pkg:generic/ffmpeg@7.0.2", @@ -107048,8 +109274,8 @@ "version": "1:5.45-3build1" }, { - "bom-ref": "pkg:pypi/filelock@3.29.0?package-id=0095db035e20c200", - "cpe": "cpe:2.3:a:python-filelock:python-filelock:3.29.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/filelock@3.32.3?package-id=7dbee281289e5528", + "cpe": "cpe:2.3:a:python-filelock:python-filelock:3.32.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -107058,9 +109284,9 @@ } ], "name": "filelock", - "purl": "pkg:pypi/filelock@3.29.0", + "purl": "pkg:pypi/filelock@3.32.3", "type": "library", - "version": "3.29.0" + "version": "3.32.3" }, { "bom-ref": "pkg:deb/ubuntu/findutils@4.9.0-5build1?arch=amd64&distro=ubuntu-24.04&package-id=3e86b98d77c7e55e", @@ -107073,18 +109299,18 @@ }, { "author": "Tri Dao ", - "bom-ref": "pkg:pypi/flash-attn@2.7.4.post1%2Bgit5231d95fe1.45164347?package-id=84c4e96061ab756f", - "cpe": "cpe:2.3:a:python-flash-attn:python-flash-attn:2.7.4.post1\\+git5231d95fe1.45164347:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/flash-attn@2.7.4.post1%2Bgit5231d95fe1.54157505?package-id=c1bad51f1a7b9ea3", + "cpe": "cpe:2.3:a:python-flash-attn:python-flash-attn:2.7.4.post1\\+git5231d95fe1.54157505:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///opt/transfer/flash_attn-2.7.4.post1%2Bgit5231d95fe1.45164347-cp312-cp312-linux_x86_64.whl" + "url": "file:///opt/transfer/flash_attn-2.7.4.post1%2Bgit5231d95fe1.54157505-cp312-cp312-linux_x86_64.whl" } ], "name": "flash-attn", - "purl": "pkg:pypi/flash-attn@2.7.4.post1%2Bgit5231d95fe1.45164347", + "purl": "pkg:pypi/flash-attn@2.7.4.post1%2Bgit5231d95fe1.54157505", "type": "library", - "version": "2.7.4.post1+git5231d95fe1.45164347" + "version": "2.7.4.post1+git5231d95fe1.54157505" }, { "author": "Tri Dao", @@ -107104,8 +109330,8 @@ }, { "author": "FlashInfer team", - "bom-ref": "pkg:pypi/flashinfer-python@0.6.16?package-id=526118a2612583a9", - "cpe": "cpe:2.3:a:python-flashinfer-python:python-flashinfer-python:0.6.16:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/flashinfer-python@0.6.18?package-id=3113cc626a8d7bc0", + "cpe": "cpe:2.3:a:python-flashinfer-python:python-flashinfer-python:0.6.18:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -107114,36 +109340,9 @@ } ], "name": "flashinfer-python", - "purl": "pkg:pypi/flashinfer-python@0.6.16", + "purl": "pkg:pypi/flashinfer-python@0.6.18", "type": "library", - "version": "0.6.16" - }, - { - "author": "The FlatBuffers project", - "bom-ref": "pkg:npm/flatbuffers@23.3.3?package-id=d0f2a9e8f035f343", - "cpe": "cpe:2.3:a:flatbuffers:flatbuffers:23.3.3:*:*:*:*:*:*:*", - "description": "Memory Efficient Serialization Library", - "externalReferences": [ - { - "type": "distribution", - "url": "git+https://github.com/google/flatbuffers.git" - }, - { - "type": "website", - "url": "https://google.github.io/flatbuffers/" - } - ], - "licenses": [ - { - "license": { - "name": "SEE LICENSE IN LICENSE.txt" - } - } - ], - "name": "flatbuffers", - "purl": "pkg:npm/flatbuffers@23.3.3", - "type": "library", - "version": "23.3.3" + "version": "0.6.18" }, { "author": "The FlatBuffers project", @@ -107181,15 +109380,6 @@ "type": "library", "version": "1.0.0" }, - { - "author": "mustii@mmk.one", - "bom-ref": "pkg:npm/flatbuffers-js-grpc@1.0.0?package-id=4cf105bceac0b987", - "cpe": "cpe:2.3:a:flatbuffers-js-grpc:flatbuffers-js-grpc:1.0.0:*:*:*:*:*:*:*", - "name": "flatbuffers-js-grpc", - "purl": "pkg:npm/flatbuffers-js-grpc@1.0.0", - "type": "library", - "version": "1.0.0" - }, { "bom-ref": "pkg:deb/ubuntu/fontconfig@2.15.0-1.1ubuntu2?arch=amd64&distro=ubuntu-24.04&package-id=33d6d8e601d2e28f", "cpe": "cpe:2.3:a:fontconfig:fontconfig:2.15.0-1.1ubuntu2:*:*:*:*:*:*:*", @@ -107228,8 +109418,8 @@ }, { "author": "Just van Rossum ", - "bom-ref": "pkg:pypi/fonttools@4.62.1?package-id=1fa127ab080efcd1", - "cpe": "cpe:2.3:a:fonttools:fonttools:4.62.1:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/fonttools@4.63.0?package-id=baf105c04f4c4bfe", + "cpe": "cpe:2.3:a:fonttools:fonttools:4.63.0:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -107238,9 +109428,9 @@ } ], "name": "fonttools", - "purl": "pkg:pypi/fonttools@4.62.1", + "purl": "pkg:pypi/fonttools@4.63.0", "type": "library", - "version": "4.62.1" + "version": "4.63.0" }, { "author": "ypcrts ", @@ -107321,14 +109511,6 @@ "type": "library", "version": "unknown" }, - { - "bom-ref": "pkg:deb/ubuntu/g%2B%2B@unknown?package-id=502119f196593efb", - "cpe": "cpe:2.3:a:g\\+\\+:g\\+\\+:unknown:*:*:*:*:*:*:*", - "name": "g++", - "purl": "pkg:deb/ubuntu/g%2B%2B@unknown", - "type": "library", - "version": "unknown" - }, { "bom-ref": "pkg:deb/ubuntu/g%2B%2B-13@13.3.0-6ubuntu2~24.04.1?arch=amd64&distro=ubuntu-24.04&package-id=d4fb3c62ffedbf16&upstream=gcc-13", "cpe": "cpe:2.3:a:g\\+\\+-13:g\\+\\+-13:13.3.0-6ubuntu2\\~24.04.1:*:*:*:*:*:*:*", @@ -107452,14 +109634,6 @@ "type": "library", "version": "unknown" }, - { - "bom-ref": "pkg:deb/ubuntu/git@unknown?package-id=f0910012411dcb18", - "cpe": "cpe:2.3:a:git:git:unknown:*:*:*:*:*:*:*", - "name": "git", - "purl": "pkg:deb/ubuntu/git@unknown", - "type": "library", - "version": "unknown" - }, { "bom-ref": "pkg:deb/ubuntu/git-lfs@3.4.1-1ubuntu0.4?arch=amd64&distro=ubuntu-24.04&package-id=cf90b8d4538c6fa5", "cpe": "cpe:2.3:a:git-lfs:git-lfs:3.4.1-1ubuntu0.4:*:*:*:*:*:*:*", @@ -108136,8 +110310,8 @@ }, { "author": "Sebastian Thiel, Michael Trier ", - "bom-ref": "pkg:pypi/gitpython@3.1.60?package-id=f14f20fb5c2dfd0b", - "cpe": "cpe:2.3:a:sebastian_thiel\\,_michael_trier_project:python-gitpython:3.1.60:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/gitpython@3.1.62?package-id=89d7a6b4be6229c0", + "cpe": "cpe:2.3:a:sebastian_thiel\\,_michael_trier_project:python-gitpython:3.1.62:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -108146,31 +110320,175 @@ } ], "name": "gitpython", - "purl": "pkg:pypi/gitpython@3.1.60", + "purl": "pkg:pypi/gitpython@3.1.62", "type": "library", - "version": "3.1.60" + "version": "3.1.62" }, { - "bom-ref": "pkg:deb/ubuntu/gnupg@2.4.4-2ubuntu17.4?arch=all&distro=ubuntu-24.04&package-id=22d9c42230eddb9f&upstream=gnupg2", - "cpe": "cpe:2.3:a:gnupg:gnupg:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gnupg@2.4.4-2ubuntu17.6?arch=all&distro=ubuntu-24.04&package-id=a4b63a4bf6a5b600&upstream=gnupg2", + "cpe": "cpe:2.3:a:gnupg:gnupg:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gnupg", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gnupg@2.4.4-2ubuntu17.4?arch=all&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gnupg@2.4.4-2ubuntu17.6?arch=all&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gnupg-utils@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&package-id=de36888b0e15e7c0&upstream=gnupg2", - "cpe": "cpe:2.3:a:gnupg-utils:gnupg-utils:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gnupg-utils@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&package-id=312c3b72c37ce5e0&upstream=gnupg2", + "cpe": "cpe:2.3:a:gnupg-utils:gnupg-utils:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gnupg-utils", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gnupg-utils@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gnupg-utils@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gnupg2@2.4.4-2ubuntu17.4?arch=all&distro=ubuntu-24.04&package-id=e142bd5d4b7b4484", - "cpe": "cpe:2.3:a:gnupg2:gnupg2:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gnupg2@2.4.4-2ubuntu17.6?arch=all&distro=ubuntu-24.04&package-id=2f2693a0f011ed27", + "cpe": "cpe:2.3:a:gnupg2:gnupg2:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -108245,9 +110563,9 @@ ], "name": "gnupg2", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gnupg2@2.4.4-2ubuntu17.4?arch=all&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/gnupg2@2.4.4-2ubuntu17.6?arch=all&distro=ubuntu-24.04", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { "bom-ref": "pkg:golang/go.etcd.io/bbolt@v1.5.0?package-id=49901d042ee5a7db", @@ -108691,8 +111009,8 @@ }, { "author": "Google LLC ", - "bom-ref": "pkg:pypi/google-api-core@2.34.0?package-id=c7e3ea3a4843acb6", - "cpe": "cpe:2.3:a:google_llc_\\", - "bom-ref": "pkg:pypi/google-auth@2.57.0?package-id=b7481dc72e4131b7", - "cpe": "cpe:2.3:a:google_cloud_platform_project:python-google-auth:2.57.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/google-auth@2.58.0?package-id=5b125c83ad44cd44", + "cpe": "cpe:2.3:a:google_cloud_platform_project:python-google-auth:2.58.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -108717,9 +111035,9 @@ } ], "name": "google-auth", - "purl": "pkg:pypi/google-auth@2.57.0", + "purl": "pkg:pypi/google-auth@2.58.0", "type": "library", - "version": "2.57.0" + "version": "2.58.0" }, { "author": "Google LLC ", @@ -108739,8 +111057,8 @@ }, { "author": "Google LLC ", - "bom-ref": "pkg:pypi/google-cloud-storage@3.13.1?package-id=2e00844ff60b43d5", - "cpe": "cpe:2.3:a:googleapis_packages_project:python-google-cloud-storage:3.13.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/google-cloud-storage@3.14.1?package-id=6fb7506f4b1231bc", + "cpe": "cpe:2.3:a:googleapis_packages_project:python-google-cloud-storage:3.14.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -108749,9 +111067,9 @@ } ], "name": "google-cloud-storage", - "purl": "pkg:pypi/google-cloud-storage@3.13.1", + "purl": "pkg:pypi/google-cloud-storage@3.14.1", "type": "library", - "version": "3.13.1" + "version": "3.14.1" }, { "author": "Google LLC ", @@ -108762,29 +111080,6 @@ "type": "library", "version": "1.8.0" }, - { - "author": "Google Protocol Buffers Team", - "bom-ref": "pkg:npm/google-protobuf@3.13.0?package-id=361593f77fd7eb71", - "cpe": "cpe:2.3:a:google-protobuf:google-protobuf:3.13.0:*:*:*:*:*:*:*", - "description": "Protocol Buffers for JavaScript", - "externalReferences": [ - { - "type": "distribution", - "url": "https://github.com/protocolbuffers/protobuf/tree/master/js" - } - ], - "licenses": [ - { - "license": { - "id": "BSD-3-Clause" - } - } - ], - "name": "google-protobuf", - "purl": "pkg:npm/google-protobuf@3.13.0", - "type": "library", - "version": "3.13.0" - }, { "author": "Google Cloud Platform ", "bom-ref": "pkg:pypi/google-resumable-media@2.10.2?package-id=999e65131443238a", @@ -108899,19 +111194,19 @@ }, { "author": "Google LLC ", - "bom-ref": "pkg:pypi/googleapis-common-protos@1.75.2?package-id=d1d5a15e8e4454f0", - "cpe": "cpe:2.3:a:google_llc_\\", - "purl": "pkg:deb/ubuntu/gpg@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpg@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gpg-agent@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&package-id=fa68e837028280d2&upstream=gnupg2", - "cpe": "cpe:2.3:a:gpg-agent:gpg-agent:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gpg-agent@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&package-id=5315a0165ef4e458&upstream=gnupg2", + "cpe": "cpe:2.3:a:gpg-agent:gpg-agent:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gpg-agent", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gpg-agent@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpg-agent@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&package-id=feac541745b95a34&upstream=gnupg2", - "cpe": "cpe:2.3:a:gpgconf:gpgconf:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&package-id=9ff230767a747dbe&upstream=gnupg2", + "cpe": "cpe:2.3:a:gpgconf:gpgconf:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gpgconf", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gpgsm@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&package-id=cead433358b95113&upstream=gnupg2", - "cpe": "cpe:2.3:a:gpgsm:gpgsm:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gpgsm@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&package-id=2062e3cd90405dfe&upstream=gnupg2", + "cpe": "cpe:2.3:a:gpgsm:gpgsm:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gpgsm", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gpgsm@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpgsm@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&package-id=fa376f0e1fbf5ceb&upstream=gnupg2", - "cpe": "cpe:2.3:a:gpgv:gpgv:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&package-id=db9250ad2fb3f819&upstream=gnupg2", + "cpe": "cpe:2.3:a:gpgv:gpgv:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gpgv", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { "bom-ref": "pkg:maven/gradle-wrapper/gradle-wrapper@4.10.3?package-id=bcc3546816a7cad4", @@ -109025,26 +111680,6 @@ "type": "library", "version": "UNKNOWN" }, - { - "bom-ref": "pkg:maven/gradle-wrapper/gradle-wrapper?package-id=5aea471523aa1189", - "cpe": "cpe:2.3:a:gradle-wrapper:gradle-wrapper:*:*:*:*:*:*:*:*", - "externalReferences": [ - { - "hashes": [ - { - "alg": "SHA-1", - "content": "2aa1e772a1dc5a9b15d50443db4731b25180d58e" - } - ], - "type": "build-meta", - "url": "" - } - ], - "name": "gradle-wrapper", - "purl": "pkg:maven/gradle-wrapper/gradle-wrapper", - "type": "library", - "version": "UNKNOWN" - }, { "bom-ref": "pkg:maven/gradle-wrapper/gradle-wrapper?package-id=7f08991ceca4f87a", "cpe": "cpe:2.3:a:gradle-wrapper:gradle-wrapper:*:*:*:*:*:*:*:*", @@ -109065,26 +111700,6 @@ "type": "library", "version": "UNKNOWN" }, - { - "bom-ref": "pkg:maven/gradle-wrapper/gradle-wrapper?package-id=bf71094a406b9440", - "cpe": "cpe:2.3:a:gradle-wrapper:gradle-wrapper:*:*:*:*:*:*:*:*", - "externalReferences": [ - { - "hashes": [ - { - "alg": "SHA-1", - "content": "2aa1e772a1dc5a9b15d50443db4731b25180d58e" - } - ], - "type": "build-meta", - "url": "" - } - ], - "name": "gradle-wrapper", - "purl": "pkg:maven/gradle-wrapper/gradle-wrapper", - "type": "library", - "version": "UNKNOWN" - }, { "author": "Sebastian Bank ", "bom-ref": "pkg:pypi/graphviz@0.21?package-id=9fb5588ad0e033be", @@ -109121,8 +111736,8 @@ }, { "author": "The gRPC Authors ", - "bom-ref": "pkg:pypi/grpcio@1.80.0?package-id=b722cded2a6f546b", - "cpe": "cpe:2.3:a:grpc_authors_\\", + "bom-ref": "pkg:pypi/grpcio-tools@1.81.1?package-id=25c95f5b31479ed4", + "cpe": "cpe:2.3:a:grpc_authors_\\", - "purl": "pkg:deb/ubuntu/gzip@1.12-1ubuntu3.1?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/gzip@1.12-1ubuntu3.2?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "1.12-1ubuntu3.1" + "version": "1.12-1ubuntu3.2" }, { "author": "Nathaniel J. Smith ", @@ -109205,8 +111836,8 @@ "version": "3.12.1" }, { - "bom-ref": "pkg:pypi/hf-xet@1.5.0?package-id=cb4c1a86a55d484f", - "cpe": "cpe:2.3:a:python-hf-xet:python-hf-xet:1.5.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/hf-xet@1.6.0?package-id=4f3509eddbab175c", + "cpe": "cpe:2.3:a:python-hf-xet:python-hf-xet:1.6.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -109215,9 +111846,9 @@ } ], "name": "hf-xet", - "purl": "pkg:pypi/hf-xet@1.5.0", + "purl": "pkg:pypi/hf-xet@1.6.0", "type": "library", - "version": "1.5.0" + "version": "1.6.0" }, { "bom-ref": "pkg:deb/ubuntu/hostname@3.23%2Bnmu2ubuntu2?arch=amd64&distro=ubuntu-24.04&package-id=4d8471c7d669a0ea", @@ -109325,8 +111956,8 @@ }, { "author": "Hugging Face, Inc. ", - "bom-ref": "pkg:pypi/huggingface-hub@1.14.0?package-id=5222bf53656140b1", - "cpe": "cpe:2.3:a:hugging_face\\,_inc__project:python-huggingface-hub:1.14.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/huggingface-hub@1.28.0?package-id=937925eb9b966be3", + "cpe": "cpe:2.3:a:hugging_face\\,_inc__project:python-huggingface-hub:1.28.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -109335,9 +111966,9 @@ } ], "name": "huggingface-hub", - "purl": "pkg:pypi/huggingface-hub@1.14.0", + "purl": "pkg:pypi/huggingface-hub@1.28.0", "type": "library", - "version": "1.14.0" + "version": "1.28.0" }, { "author": "Jason Moiron ", @@ -109365,7 +111996,7 @@ "version": "0.379-1" }, { - "bom-ref": "pkg:deb/ubuntu/ibverbs-providers@50.0-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=face5dc49a12853f&upstream=rdma-core", + "bom-ref": "pkg:deb/ubuntu/ibverbs-providers@50.0-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=298b91b32ad294e6&upstream=rdma-core", "cpe": "cpe:2.3:a:ibverbs-providers:ibverbs-providers:50.0-2ubuntu0.2:*:*:*:*:*:*:*", "name": "ibverbs-providers", "publisher": "Benjamin Drung ", @@ -109505,8 +112136,8 @@ }, { "author": "IPython Development Team ", - "bom-ref": "pkg:pypi/ipykernel@7.2.0?package-id=4f68e3ce698ff161", - "cpe": "cpe:2.3:a:ipython_development_team_\\", - "bom-ref": "pkg:pypi/ipython@9.13.0?package-id=f7ef6b73f6d5f50c", - "cpe": "cpe:2.3:a:ipython_development_team_project:python-ipython:9.13.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/ipython@9.16.1?package-id=0473b4da0a722344", + "cpe": "cpe:2.3:a:ipython_development_team_project:python-ipython:9.16.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -109531,9 +112162,9 @@ } ], "name": "ipython", - "purl": "pkg:pypi/ipython@9.13.0", + "purl": "pkg:pypi/ipython@9.16.1", "type": "library", - "version": "9.13.0" + "version": "9.16.1" }, { "author": "The IPython Development Team ", @@ -109721,8 +112352,8 @@ }, { "author": "Samuel Colvin ", - "bom-ref": "pkg:pypi/jiter@0.16.0?package-id=1a82dffcaa65d2c6", - "cpe": "cpe:2.3:a:samuel_colvin_\\", @@ -109753,8 +112384,8 @@ }, { "author": "Gael Varoquaux ", - "bom-ref": "pkg:pypi/joblib@1.5.3?package-id=26c11f789d86f578", - "cpe": "cpe:2.3:a:gael_varoquaux_\\", - "bom-ref": "pkg:pypi/json5@0.14.0?package-id=84e1495653868082", - "cpe": "cpe:2.3:a:dirk_pranke_\\", @@ -109857,8 +112488,22 @@ }, { "author": "Jupyter Development Team ", - "bom-ref": "pkg:pypi/jupyter-client@8.8.0?package-id=bff5b1782a37aba6", - "cpe": "cpe:2.3:a:jupyter_development_team_\\", + "bom-ref": "pkg:pypi/jupyter-client@8.9.1?package-id=cab420591b1d534a", + "cpe": "cpe:2.3:a:jupyter_development_team_\\", @@ -109921,7 +112566,7 @@ }, { "author": "Jupyter Development Team ", - "bom-ref": "pkg:pypi/jupyter-server@2.20.0?package-id=1ad5f6bf18dd61fb", + "bom-ref": "pkg:pypi/jupyter-server@2.20.0?package-id=79beb747b64f9597", "cpe": "cpe:2.3:a:jupyter_development_team_\\", - "bom-ref": "pkg:pypi/jupyterlab@4.5.10?package-id=1fcc480290732afc", - "cpe": "cpe:2.3:a:jupyter_development_team_\\", - "bom-ref": "pkg:pypi/jupyterlab-code-formatter@3.0.3?package-id=1882d284ba6ecd11", - "cpe": "cpe:2.3:a:python-jupyterlab-code-formatter:python-jupyterlab-code-formatter:3.0.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/jupyterlab-code-formatter@3.1.0?package-id=ed4fb147d4620446", + "cpe": "cpe:2.3:a:python-jupyterlab-code-formatter:python-jupyterlab-code-formatter:3.1.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -109979,23 +112624,23 @@ } ], "name": "jupyterlab-code-formatter", - "purl": "pkg:pypi/jupyterlab-code-formatter@3.0.3", + "purl": "pkg:pypi/jupyterlab-code-formatter@3.1.0", "type": "library", - "version": "3.0.3" + "version": "3.1.0" }, { "author": "Marc Wouts", - "bom-ref": "pkg:npm/jupyterlab-jupytext@1.4.6?package-id=4e3b198710e1c486", + "bom-ref": "pkg:npm/jupyterlab-jupytext@1.4.6?package-id=6a28a4d78a1a8b91", "cpe": "cpe:2.3:a:jupyterlab-jupytext:jupyterlab-jupytext:1.4.6:*:*:*:*:*:*:*", "description": "Save Jupyter Notebooks as Scripts or Markdown files that work well with version control & external text editors", "externalReferences": [ { "type": "distribution", - "url": "https://github.com/mwouts/jupytext.git" + "url": "https://github.com/jupytext/jupytext.git" }, { "type": "website", - "url": "https://github.com/mwouts/jupytext/tree/main/jupyterlab/packages/jupyterlab-jupytext" + "url": "https://github.com/jupytext/jupytext/tree/main/jupyterlab/packages/jupyterlab-jupytext-extension" } ], "licenses": [ @@ -110012,17 +112657,17 @@ }, { "author": "Marc Wouts", - "bom-ref": "pkg:npm/jupyterlab-jupytext@1.4.6?package-id=8128afc2d203d24c", + "bom-ref": "pkg:npm/jupyterlab-jupytext@1.4.6?package-id=ce13fc66dfd2463b", "cpe": "cpe:2.3:a:jupyterlab-jupytext:jupyterlab-jupytext:1.4.6:*:*:*:*:*:*:*", "description": "Save Jupyter Notebooks as Scripts or Markdown files that work well with version control & external text editors", "externalReferences": [ { "type": "distribution", - "url": "https://github.com/mwouts/jupytext.git" + "url": "https://github.com/jupytext/jupytext.git" }, { "type": "website", - "url": "https://github.com/mwouts/jupytext/tree/main/jupyterlab/packages/jupyterlab-jupytext" + "url": "https://github.com/jupytext/jupytext/tree/main/jupyterlab/packages/jupyterlab-jupytext-extension" } ], "licenses": [ @@ -110117,7 +112762,7 @@ }, { "author": "aircloud ", - "bom-ref": "pkg:pypi/jupyterlab-tensorboard-pro@4.0.0?package-id=fd886237063f1f63", + "bom-ref": "pkg:pypi/jupyterlab-tensorboard-pro@4.0.0?package-id=445ee46016d06d6e", "cpe": "cpe:2.3:a:python-jupyterlab-tensorboard-pro:python-jupyterlab-tensorboard-pro:4.0.0:*:*:*:*:*:*:*", "externalReferences": [ { @@ -110139,20 +112784,30 @@ }, { "author": "Ryan Tam ", - "bom-ref": "pkg:npm/jupyterlab_code_formatter@3.0.3?package-id=6224e6d0c5e58cff", - "cpe": "cpe:2.3:a:jupyterlab-code-formatter:jupyterlab-code-formatter:3.0.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/jupyterlab_code_formatter@3.1.0?package-id=69d117b4c35c3229", + "cpe": "cpe:2.3:a:jupyterlab-code-formatter:jupyterlab-code-formatter:3.1.0:*:*:*:*:*:*:*", "description": " A JupyterLab plugin to facilitate invocation of code formatters.", + "externalReferences": [ + { + "type": "distribution", + "url": "https://github.com/jupyterlab-contrib/jupyterlab_code_formatter.git" + }, + { + "type": "website", + "url": "https://github.com/jupyterlab-contrib/jupyterlab_code_formatter" + } + ], "licenses": [ { "license": { - "id": "BSD-3-Clause" + "id": "MIT" } } ], "name": "jupyterlab_code_formatter", - "purl": "pkg:npm/jupyterlab_code_formatter@3.0.3", + "purl": "pkg:npm/jupyterlab_code_formatter@3.1.0", "type": "library", - "version": "3.0.3" + "version": "3.1.0" }, { "author": "Jupyter Development Team ", @@ -110237,8 +112892,8 @@ }, { "author": "Marc Wouts ", - "bom-ref": "pkg:pypi/jupytext@1.19.1?package-id=51216ce4bd343e82", - "cpe": "cpe:2.3:a:marc_wouts_\\", - "purl": "pkg:deb/ubuntu/keyboxd@2.4.4-2ubuntu17.4?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/keyboxd@2.4.4-2ubuntu17.6?arch=amd64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { "author": "The Nucleic Development Team ", @@ -110404,22 +113131,22 @@ "version": "14.2.0-4ubuntu2~24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/libasound2-data@1.2.11-1ubuntu0.2?arch=all&distro=ubuntu-24.04&package-id=b336b82fe1091b4a&upstream=alsa-lib", - "cpe": "cpe:2.3:a:libasound2-data:libasound2-data:1.2.11-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libasound2-data@1.2.11-1ubuntu0.3?arch=all&distro=ubuntu-24.04&package-id=b68afabb5346d1ac&upstream=alsa-lib", + "cpe": "cpe:2.3:a:libasound2-data:libasound2-data:1.2.11-1ubuntu0.3:*:*:*:*:*:*:*", "name": "libasound2-data", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libasound2-data@1.2.11-1ubuntu0.2?arch=all&distro=ubuntu-24.04&upstream=alsa-lib", + "purl": "pkg:deb/ubuntu/libasound2-data@1.2.11-1ubuntu0.3?arch=all&distro=ubuntu-24.04&upstream=alsa-lib", "type": "library", - "version": "1.2.11-1ubuntu0.2" + "version": "1.2.11-1ubuntu0.3" }, { - "bom-ref": "pkg:deb/ubuntu/libasound2t64@1.2.11-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=cc46b7225310c0fa&upstream=alsa-lib", - "cpe": "cpe:2.3:a:libasound2t64:libasound2t64:1.2.11-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libasound2t64@1.2.11-1ubuntu0.3?arch=amd64&distro=ubuntu-24.04&package-id=5ccec18af2699eb5&upstream=alsa-lib", + "cpe": "cpe:2.3:a:libasound2t64:libasound2t64:1.2.11-1ubuntu0.3:*:*:*:*:*:*:*", "name": "libasound2t64", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libasound2t64@1.2.11-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&upstream=alsa-lib", + "purl": "pkg:deb/ubuntu/libasound2t64@1.2.11-1ubuntu0.3?arch=amd64&distro=ubuntu-24.04&upstream=alsa-lib", "type": "library", - "version": "1.2.11-1ubuntu0.2" + "version": "1.2.11-1ubuntu0.3" }, { "bom-ref": "pkg:deb/ubuntu/libassuan0@2.5.6-1build1?arch=amd64&distro=ubuntu-24.04&package-id=516e36ab452f9bb3&upstream=libassuan", @@ -110557,49 +113284,49 @@ "version": "1.0.8-5.1build0.1" }, { - "bom-ref": "pkg:deb/ubuntu/libc-bin@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&package-id=c339efaf4b168e8c&upstream=glibc", - "cpe": "cpe:2.3:a:libc-bin:libc-bin:2.39-0ubuntu8.8:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libc-bin@2.39-0ubuntu8.9?arch=amd64&distro=ubuntu-24.04&package-id=400df08fa67f159e&upstream=glibc", + "cpe": "cpe:2.3:a:libc-bin:libc-bin:2.39-0ubuntu8.9:*:*:*:*:*:*:*", "name": "libc-bin", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libc-bin@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&upstream=glibc", + "purl": "pkg:deb/ubuntu/libc-bin@2.39-0ubuntu8.9?arch=amd64&distro=ubuntu-24.04&upstream=glibc", "type": "library", - "version": "2.39-0ubuntu8.8" + "version": "2.39-0ubuntu8.9" }, { - "bom-ref": "pkg:deb/ubuntu/libc-dev-bin@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&package-id=4bb7e074f2aeff7a&upstream=glibc", - "cpe": "cpe:2.3:a:libc-dev-bin:libc-dev-bin:2.39-0ubuntu8.8:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libc-dev-bin@2.39-0ubuntu8.9?arch=amd64&distro=ubuntu-24.04&package-id=fe851f6664c993bd&upstream=glibc", + "cpe": "cpe:2.3:a:libc-dev-bin:libc-dev-bin:2.39-0ubuntu8.9:*:*:*:*:*:*:*", "name": "libc-dev-bin", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libc-dev-bin@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&upstream=glibc", + "purl": "pkg:deb/ubuntu/libc-dev-bin@2.39-0ubuntu8.9?arch=amd64&distro=ubuntu-24.04&upstream=glibc", "type": "library", - "version": "2.39-0ubuntu8.8" + "version": "2.39-0ubuntu8.9" }, { - "bom-ref": "pkg:deb/ubuntu/libc6@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&package-id=d5f4f2182412278a&upstream=glibc", - "cpe": "cpe:2.3:a:libc6:libc6:2.39-0ubuntu8.8:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libc6@2.39-0ubuntu8.9?arch=amd64&distro=ubuntu-24.04&package-id=1b3bf4a32e493caa&upstream=glibc", + "cpe": "cpe:2.3:a:libc6:libc6:2.39-0ubuntu8.9:*:*:*:*:*:*:*", "name": "libc6", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libc6@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&upstream=glibc", + "purl": "pkg:deb/ubuntu/libc6@2.39-0ubuntu8.9?arch=amd64&distro=ubuntu-24.04&upstream=glibc", "type": "library", - "version": "2.39-0ubuntu8.8" + "version": "2.39-0ubuntu8.9" }, { - "bom-ref": "pkg:deb/ubuntu/libc6-dev@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&package-id=8662d381b50108ed&upstream=glibc", - "cpe": "cpe:2.3:a:libc6-dev:libc6-dev:2.39-0ubuntu8.8:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libc6-dev@2.39-0ubuntu8.9?arch=amd64&distro=ubuntu-24.04&package-id=c4c307c1f22eb4ee&upstream=glibc", + "cpe": "cpe:2.3:a:libc6-dev:libc6-dev:2.39-0ubuntu8.9:*:*:*:*:*:*:*", "name": "libc6-dev", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libc6-dev@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&upstream=glibc", + "purl": "pkg:deb/ubuntu/libc6-dev@2.39-0ubuntu8.9?arch=amd64&distro=ubuntu-24.04&upstream=glibc", "type": "library", - "version": "2.39-0ubuntu8.8" + "version": "2.39-0ubuntu8.9" }, { - "bom-ref": "pkg:deb/ubuntu/libc6-i386@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&package-id=edf310078e3744e3&upstream=glibc", - "cpe": "cpe:2.3:a:libc6-i386:libc6-i386:2.39-0ubuntu8.8:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libc6-i386@2.39-0ubuntu8.9?arch=amd64&distro=ubuntu-24.04&package-id=da6150e2e0807ef1&upstream=glibc", + "cpe": "cpe:2.3:a:libc6-i386:libc6-i386:2.39-0ubuntu8.9:*:*:*:*:*:*:*", "name": "libc6-i386", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libc6-i386@2.39-0ubuntu8.8?arch=amd64&distro=ubuntu-24.04&upstream=glibc", + "purl": "pkg:deb/ubuntu/libc6-i386@2.39-0ubuntu8.9?arch=amd64&distro=ubuntu-24.04&upstream=glibc", "type": "library", - "version": "2.39-0ubuntu8.8" + "version": "2.39-0ubuntu8.9" }, { "bom-ref": "pkg:deb/ubuntu/libcairo2@1.18.0-3build1?arch=amd64&distro=ubuntu-24.04&package-id=5b968bd880a56387&upstream=cairo", @@ -110620,13 +113347,13 @@ "version": "0.8.4-2build2" }, { - "bom-ref": "pkg:deb/ubuntu/libcap2@1%3A2.66-5ubuntu2.2?arch=amd64&distro=ubuntu-24.04&package-id=ae4ebe4d272c45c0", - "cpe": "cpe:2.3:a:libcap2:libcap2:1\\:2.66-5ubuntu2.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcap2@1%3A2.66-5ubuntu2.4?arch=amd64&distro=ubuntu-24.04&package-id=d5d9bbe62fb61310", + "cpe": "cpe:2.3:a:libcap2:libcap2:1\\:2.66-5ubuntu2.4:*:*:*:*:*:*:*", "name": "libcap2", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libcap2@1%3A2.66-5ubuntu2.2?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/libcap2@1%3A2.66-5ubuntu2.4?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "1:2.66-5ubuntu2.2" + "version": "1:2.66-5ubuntu2.4" }, { "bom-ref": "pkg:deb/ubuntu/libcares2@1.27.0-1.0ubuntu1?arch=amd64&distro=ubuntu-24.04&package-id=2de92d0c703ce917&upstream=c-ares", @@ -110745,6 +113472,21 @@ "type": "library", "version": "1:4.4.36-4build1" }, + { + "bom-ref": "pkg:pypi/libcst@1.9.0?package-id=29895573d37c146d", + "cpe": "cpe:2.3:a:python-libcst:python-libcst:1.9.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "sha256:2fd658e5a48badc2999209eb5373c4d2e240b85669c36dace90a797e6becb28d" + } + } + ], + "name": "libcst", + "purl": "pkg:pypi/libcst@1.9.0", + "type": "library", + "version": "1.9.0" + }, { "bom-ref": "pkg:deb/ubuntu/libctf-nobfd0@2.42-4ubuntu2.10?arch=amd64&distro=ubuntu-24.04&package-id=47f964ca03e8cbd0&upstream=binutils", "cpe": "cpe:2.3:a:libctf-nobfd0:libctf-nobfd0:2.42-4ubuntu2.10:*:*:*:*:*:*:*", @@ -110764,40 +113506,44 @@ "version": "2.42-4ubuntu2.10" }, { - "bom-ref": "pkg:deb/ubuntu/libcublas13-cuda-13@13.4.1.2-1?arch=amd64&distro=ubuntu-24.04&package-id=ae2d2de7ddec5c56&upstream=libcublas", - "cpe": "cpe:2.3:a:libcublas13-cuda-13:libcublas13-cuda-13:13.4.1.2-1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "sha256:effcd507b137a8ea489197eb46c01a694a778caf7931ef8ec1e4a602a7a8c4db" - } - } - ], - "name": "libcublas13-cuda-13", + "bom-ref": "pkg:deb/ubuntu/libcublas-13-4@13.7.0.27-1?arch=amd64&distro=ubuntu-24.04&package-id=832f2335e31dc2b3&upstream=libcublas", + "cpe": "cpe:2.3:a:libcublas-13-4:libcublas-13-4:13.7.0.27-1:*:*:*:*:*:*:*", + "name": "libcublas-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcublas13-cuda-13@13.4.1.2-1?arch=amd64&distro=ubuntu-24.04&upstream=libcublas", + "purl": "pkg:deb/ubuntu/libcublas-13-4@13.7.0.27-1?arch=amd64&distro=ubuntu-24.04&upstream=libcublas", "type": "library", - "version": "13.4.1.2-1" + "version": "13.7.0.27-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcublas13-dev-cuda-13@13.4.1.2-1?arch=amd64&distro=ubuntu-24.04&package-id=e9a7dbad6ee8a51b&upstream=libcublas", - "cpe": "cpe:2.3:a:libcublas13-dev-cuda-13:libcublas13-dev-cuda-13:13.4.1.2-1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "sha256:effcd507b137a8ea489197eb46c01a694a778caf7931ef8ec1e4a602a7a8c4db" - } - } - ], - "name": "libcublas13-dev-cuda-13", + "bom-ref": "pkg:deb/ubuntu/libcublas-dev-13-4@13.7.0.27-1?arch=amd64&distro=ubuntu-24.04&package-id=ae5467561509117c&upstream=libcublas", + "cpe": "cpe:2.3:a:libcublas-dev-13-4:libcublas-dev-13-4:13.7.0.27-1:*:*:*:*:*:*:*", + "name": "libcublas-dev-13-4", + "publisher": "cudatools ", + "purl": "pkg:deb/ubuntu/libcublas-dev-13-4@13.7.0.27-1?arch=amd64&distro=ubuntu-24.04&upstream=libcublas", + "type": "library", + "version": "13.7.0.27-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libcublasmp0-cuda-13@0.10.0.3695-1?arch=amd64&distro=ubuntu-24.04&package-id=0ca5a252845e13bb&upstream=libcublasmp", + "cpe": "cpe:2.3:a:libcublasmp0-cuda-13:libcublasmp0-cuda-13:0.10.0.3695-1:*:*:*:*:*:*:*", + "name": "libcublasmp0-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcublas13-dev-cuda-13@13.4.1.2-1?arch=amd64&distro=ubuntu-24.04&upstream=libcublas", + "purl": "pkg:deb/ubuntu/libcublasmp0-cuda-13@0.10.0.3695-1?arch=amd64&distro=ubuntu-24.04&upstream=libcublasmp", "type": "library", - "version": "13.4.1.2-1" + "version": "0.10.0.3695-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcudnn9-cuda-13@9.22.0.52-1?arch=amd64&distro=ubuntu-24.04&package-id=8666761cd66f01bb&upstream=cudnn", - "cpe": "cpe:2.3:a:libcudnn9-cuda-13:libcudnn9-cuda-13:9.22.0.52-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcublasmp0-dev-cuda-13@0.10.0.3695-1?arch=amd64&distro=ubuntu-24.04&package-id=94e9f80460aac793&upstream=libcublasmp", + "cpe": "cpe:2.3:a:libcublasmp0-dev-cuda-13:libcublasmp0-dev-cuda-13:0.10.0.3695-1:*:*:*:*:*:*:*", + "name": "libcublasmp0-dev-cuda-13", + "publisher": "cudatools ", + "purl": "pkg:deb/ubuntu/libcublasmp0-dev-cuda-13@0.10.0.3695-1?arch=amd64&distro=ubuntu-24.04&upstream=libcublasmp", + "type": "library", + "version": "0.10.0.3695-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libcudnn9-cuda-13@9.25.1.1-1?arch=amd64&distro=ubuntu-24.04&package-id=a3be8b796d9d8a21&upstream=cudnn", + "cpe": "cpe:2.3:a:libcudnn9-cuda-13:libcudnn9-cuda-13:9.25.1.1-1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -110807,13 +113553,13 @@ ], "name": "libcudnn9-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcudnn9-cuda-13@9.22.0.52-1?arch=amd64&distro=ubuntu-24.04&upstream=cudnn", + "purl": "pkg:deb/ubuntu/libcudnn9-cuda-13@9.25.1.1-1?arch=amd64&distro=ubuntu-24.04&upstream=cudnn", "type": "library", - "version": "9.22.0.52-1" + "version": "9.25.1.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcudnn9-dev-cuda-13@9.22.0.52-1?arch=amd64&distro=ubuntu-24.04&package-id=24d5e6d16a4532a5&upstream=cudnn", - "cpe": "cpe:2.3:a:libcudnn9-dev-cuda-13:libcudnn9-dev-cuda-13:9.22.0.52-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcudnn9-dev-cuda-13@9.25.1.1-1?arch=amd64&distro=ubuntu-24.04&package-id=04d46c2b29012bf1&upstream=cudnn", + "cpe": "cpe:2.3:a:libcudnn9-dev-cuda-13:libcudnn9-dev-cuda-13:9.25.1.1-1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -110823,13 +113569,13 @@ ], "name": "libcudnn9-dev-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcudnn9-dev-cuda-13@9.22.0.52-1?arch=amd64&distro=ubuntu-24.04&upstream=cudnn", + "purl": "pkg:deb/ubuntu/libcudnn9-dev-cuda-13@9.25.1.1-1?arch=amd64&distro=ubuntu-24.04&upstream=cudnn", "type": "library", - "version": "9.22.0.52-1" + "version": "9.25.1.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcudnn9-headers-cuda-13@9.22.0.52-1?arch=amd64&distro=ubuntu-24.04&package-id=560aa4a5c8c87617&upstream=cudnn", - "cpe": "cpe:2.3:a:libcudnn9-headers-cuda-13:libcudnn9-headers-cuda-13:9.22.0.52-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcudnn9-headers-cuda-13@9.25.1.1-1?arch=amd64&distro=ubuntu-24.04&package-id=9418990351dcde0b&upstream=cudnn", + "cpe": "cpe:2.3:a:libcudnn9-headers-cuda-13:libcudnn9-headers-cuda-13:9.25.1.1-1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -110839,63 +113585,72 @@ ], "name": "libcudnn9-headers-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcudnn9-headers-cuda-13@9.22.0.52-1?arch=amd64&distro=ubuntu-24.04&upstream=cudnn", + "purl": "pkg:deb/ubuntu/libcudnn9-headers-cuda-13@9.25.1.1-1?arch=amd64&distro=ubuntu-24.04&upstream=cudnn", + "type": "library", + "version": "9.25.1.1-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libcufft-13-4@12.4.0.34-1?arch=amd64&distro=ubuntu-24.04&package-id=c516a20496ea0740&upstream=libcufft", + "cpe": "cpe:2.3:a:libcufft-13-4:libcufft-13-4:12.4.0.34-1:*:*:*:*:*:*:*", + "name": "libcufft-13-4", + "publisher": "cudatools ", + "purl": "pkg:deb/ubuntu/libcufft-13-4@12.4.0.34-1?arch=amd64&distro=ubuntu-24.04&upstream=libcufft", "type": "library", - "version": "9.22.0.52-1" + "version": "12.4.0.34-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcufft-13-2@12.2.0.46-1?arch=amd64&distro=ubuntu-24.04&package-id=a03197be02b8b9f4&upstream=libcufft", - "cpe": "cpe:2.3:a:libcufft-13-2:libcufft-13-2:12.2.0.46-1:*:*:*:*:*:*:*", - "name": "libcufft-13-2", + "bom-ref": "pkg:deb/ubuntu/libcufft-dev-13-4@12.4.0.34-1?arch=amd64&distro=ubuntu-24.04&package-id=1e7a79c8fa7991a4&upstream=libcufft", + "cpe": "cpe:2.3:a:libcufft-dev-13-4:libcufft-dev-13-4:12.4.0.34-1:*:*:*:*:*:*:*", + "name": "libcufft-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcufft-13-2@12.2.0.46-1?arch=amd64&distro=ubuntu-24.04&upstream=libcufft", + "purl": "pkg:deb/ubuntu/libcufft-dev-13-4@12.4.0.34-1?arch=amd64&distro=ubuntu-24.04&upstream=libcufft", "type": "library", - "version": "12.2.0.46-1" + "version": "12.4.0.34-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcufft-dev-13-2@12.2.0.46-1?arch=amd64&distro=ubuntu-24.04&package-id=18245dd5573c7173&upstream=libcufft", - "cpe": "cpe:2.3:a:libcufft-dev-13-2:libcufft-dev-13-2:12.2.0.46-1:*:*:*:*:*:*:*", - "name": "libcufft-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libcufile-13-4@1.19.0.109-1?arch=amd64&distro=ubuntu-24.04&package-id=8ec83e11039fd7e0&upstream=libcufile", + "cpe": "cpe:2.3:a:libcufile-13-4:libcufile-13-4:1.19.0.109-1:*:*:*:*:*:*:*", + "name": "libcufile-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcufft-dev-13-2@12.2.0.46-1?arch=amd64&distro=ubuntu-24.04&upstream=libcufft", + "purl": "pkg:deb/ubuntu/libcufile-13-4@1.19.0.109-1?arch=amd64&distro=ubuntu-24.04&upstream=libcufile", "type": "library", - "version": "12.2.0.46-1" + "version": "1.19.0.109-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcufile-13-2@1.17.1.22-1?arch=amd64&distro=ubuntu-24.04&package-id=afc28cbeb11557c0&upstream=libcufile", - "cpe": "cpe:2.3:a:libcufile-13-2:libcufile-13-2:1.17.1.22-1:*:*:*:*:*:*:*", - "name": "libcufile-13-2", + "bom-ref": "pkg:deb/ubuntu/libcufile-dev-13-4@1.19.0.109-1?arch=amd64&distro=ubuntu-24.04&package-id=9084b80f8e6b717f&upstream=libcufile", + "cpe": "cpe:2.3:a:libcufile-dev-13-4:libcufile-dev-13-4:1.19.0.109-1:*:*:*:*:*:*:*", + "name": "libcufile-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcufile-13-2@1.17.1.22-1?arch=amd64&distro=ubuntu-24.04&upstream=libcufile", + "purl": "pkg:deb/ubuntu/libcufile-dev-13-4@1.19.0.109-1?arch=amd64&distro=ubuntu-24.04&upstream=libcufile", "type": "library", - "version": "1.17.1.22-1" + "version": "1.19.0.109-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcufile-dev-13-2@1.17.1.22-1?arch=amd64&distro=ubuntu-24.04&package-id=ca3a062d8aa4488b&upstream=libcufile", - "cpe": "cpe:2.3:a:libcufile-dev-13-2:libcufile-dev-13-2:1.17.1.22-1:*:*:*:*:*:*:*", - "name": "libcufile-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libcuobjclient-13-4@1.3.0.109-1?arch=amd64&distro=ubuntu-24.04&package-id=824d7675f6cf691b&upstream=libcuobjclient", + "cpe": "cpe:2.3:a:libcuobjclient-13-4:libcuobjclient-13-4:1.3.0.109-1:*:*:*:*:*:*:*", + "name": "libcuobjclient-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcufile-dev-13-2@1.17.1.22-1?arch=amd64&distro=ubuntu-24.04&upstream=libcufile", + "purl": "pkg:deb/ubuntu/libcuobjclient-13-4@1.3.0.109-1?arch=amd64&distro=ubuntu-24.04&upstream=libcuobjclient", "type": "library", - "version": "1.17.1.22-1" + "version": "1.3.0.109-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcurand-13-2@10.4.2.55-1?arch=amd64&distro=ubuntu-24.04&package-id=f32061d44e67590b&upstream=libcurand", - "cpe": "cpe:2.3:a:libcurand-13-2:libcurand-13-2:10.4.2.55-1:*:*:*:*:*:*:*", - "name": "libcurand-13-2", + "bom-ref": "pkg:deb/ubuntu/libcurand-13-4@10.4.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=1a5da843d94c5724&upstream=libcurand", + "cpe": "cpe:2.3:a:libcurand-13-4:libcurand-13-4:10.4.4.49-1:*:*:*:*:*:*:*", + "name": "libcurand-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcurand-13-2@10.4.2.55-1?arch=amd64&distro=ubuntu-24.04&upstream=libcurand", + "purl": "pkg:deb/ubuntu/libcurand-13-4@10.4.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=libcurand", "type": "library", - "version": "10.4.2.55-1" + "version": "10.4.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcurand-dev-13-2@10.4.2.55-1?arch=amd64&distro=ubuntu-24.04&package-id=95af66bdf0393bac&upstream=libcurand", - "cpe": "cpe:2.3:a:libcurand-dev-13-2:libcurand-dev-13-2:10.4.2.55-1:*:*:*:*:*:*:*", - "name": "libcurand-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libcurand-dev-13-4@10.4.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=814ea063e393ba5d&upstream=libcurand", + "cpe": "cpe:2.3:a:libcurand-dev-13-4:libcurand-dev-13-4:10.4.4.49-1:*:*:*:*:*:*:*", + "name": "libcurand-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcurand-dev-13-2@10.4.2.55-1?arch=amd64&distro=ubuntu-24.04&upstream=libcurand", + "purl": "pkg:deb/ubuntu/libcurand-dev-13-4@10.4.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=libcurand", "type": "library", - "version": "10.4.2.55-1" + "version": "10.4.4.49-1" }, { "bom-ref": "pkg:deb/ubuntu/libcurl3t64-gnutls@8.5.0-2ubuntu10.13?arch=amd64&distro=ubuntu-24.04&package-id=8fe4f02fb76d35fc&upstream=curl", @@ -111020,49 +113775,49 @@ "version": "8.5.0-2ubuntu10.13" }, { - "bom-ref": "pkg:deb/ubuntu/libcusolver-13-2@12.2.0.1-1?arch=amd64&distro=ubuntu-24.04&package-id=078b54d83c194b1a&upstream=libcusolver", - "cpe": "cpe:2.3:a:libcusolver-13-2:libcusolver-13-2:12.2.0.1-1:*:*:*:*:*:*:*", - "name": "libcusolver-13-2", + "bom-ref": "pkg:deb/ubuntu/libcusolver-13-4@12.3.2.15-1?arch=amd64&distro=ubuntu-24.04&package-id=4a1ce9e0ec6a8537&upstream=libcusolver", + "cpe": "cpe:2.3:a:libcusolver-13-4:libcusolver-13-4:12.3.2.15-1:*:*:*:*:*:*:*", + "name": "libcusolver-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcusolver-13-2@12.2.0.1-1?arch=amd64&distro=ubuntu-24.04&upstream=libcusolver", + "purl": "pkg:deb/ubuntu/libcusolver-13-4@12.3.2.15-1?arch=amd64&distro=ubuntu-24.04&upstream=libcusolver", "type": "library", - "version": "12.2.0.1-1" + "version": "12.3.2.15-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcusolver-dev-13-2@12.2.0.1-1?arch=amd64&distro=ubuntu-24.04&package-id=0c6f558ad323f79e&upstream=libcusolver", - "cpe": "cpe:2.3:a:libcusolver-dev-13-2:libcusolver-dev-13-2:12.2.0.1-1:*:*:*:*:*:*:*", - "name": "libcusolver-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libcusolver-dev-13-4@12.3.2.15-1?arch=amd64&distro=ubuntu-24.04&package-id=e1a9d61f55d693bc&upstream=libcusolver", + "cpe": "cpe:2.3:a:libcusolver-dev-13-4:libcusolver-dev-13-4:12.3.2.15-1:*:*:*:*:*:*:*", + "name": "libcusolver-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcusolver-dev-13-2@12.2.0.1-1?arch=amd64&distro=ubuntu-24.04&upstream=libcusolver", + "purl": "pkg:deb/ubuntu/libcusolver-dev-13-4@12.3.2.15-1?arch=amd64&distro=ubuntu-24.04&upstream=libcusolver", "type": "library", - "version": "12.2.0.1-1" + "version": "12.3.2.15-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcusolvermp0-cuda-13@0.8.0.3126-1?arch=amd64&distro=ubuntu-24.04&package-id=d0c1b3b401f0b8cb&upstream=libcusolvermp", - "cpe": "cpe:2.3:a:libcusolvermp0-cuda-13:libcusolvermp0-cuda-13:0.8.0.3126-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcusolvermp0-cuda-13@0.9.0.6427-1?arch=amd64&distro=ubuntu-24.04&package-id=89804241598154ba&upstream=libcusolvermp", + "cpe": "cpe:2.3:a:libcusolvermp0-cuda-13:libcusolvermp0-cuda-13:0.9.0.6427-1:*:*:*:*:*:*:*", "name": "libcusolvermp0-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcusolvermp0-cuda-13@0.8.0.3126-1?arch=amd64&distro=ubuntu-24.04&upstream=libcusolvermp", + "purl": "pkg:deb/ubuntu/libcusolvermp0-cuda-13@0.9.0.6427-1?arch=amd64&distro=ubuntu-24.04&upstream=libcusolvermp", "type": "library", - "version": "0.8.0.3126-1" + "version": "0.9.0.6427-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcusparse-13-2@12.7.10.1-1?arch=amd64&distro=ubuntu-24.04&package-id=51ecedf8930d5e89&upstream=libcusparse", - "cpe": "cpe:2.3:a:libcusparse-13-2:libcusparse-13-2:12.7.10.1-1:*:*:*:*:*:*:*", - "name": "libcusparse-13-2", + "bom-ref": "pkg:deb/ubuntu/libcusparse-13-4@12.8.6.49-1?arch=amd64&distro=ubuntu-24.04&package-id=ac1ee0bdc0bf03eb&upstream=libcusparse", + "cpe": "cpe:2.3:a:libcusparse-13-4:libcusparse-13-4:12.8.6.49-1:*:*:*:*:*:*:*", + "name": "libcusparse-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcusparse-13-2@12.7.10.1-1?arch=amd64&distro=ubuntu-24.04&upstream=libcusparse", + "purl": "pkg:deb/ubuntu/libcusparse-13-4@12.8.6.49-1?arch=amd64&distro=ubuntu-24.04&upstream=libcusparse", "type": "library", - "version": "12.7.10.1-1" + "version": "12.8.6.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcusparse-dev-13-2@12.7.10.1-1?arch=amd64&distro=ubuntu-24.04&package-id=904dffbe802e7e56&upstream=libcusparse", - "cpe": "cpe:2.3:a:libcusparse-dev-13-2:libcusparse-dev-13-2:12.7.10.1-1:*:*:*:*:*:*:*", - "name": "libcusparse-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libcusparse-dev-13-4@12.8.6.49-1?arch=amd64&distro=ubuntu-24.04&package-id=b874bdf9f4624141&upstream=libcusparse", + "cpe": "cpe:2.3:a:libcusparse-dev-13-4:libcusparse-dev-13-4:12.8.6.49-1:*:*:*:*:*:*:*", + "name": "libcusparse-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcusparse-dev-13-2@12.7.10.1-1?arch=amd64&distro=ubuntu-24.04&upstream=libcusparse", + "purl": "pkg:deb/ubuntu/libcusparse-dev-13-4@12.8.6.49-1?arch=amd64&distro=ubuntu-24.04&upstream=libcusparse", "type": "library", - "version": "12.7.10.1-1" + "version": "12.8.6.49-1" }, { "bom-ref": "pkg:deb/ubuntu/libcusparselt0-cuda-13@0.9.1.1-1?arch=amd64&distro=ubuntu-24.04&package-id=39d1f68be38e153f&upstream=libcusparse-lt", @@ -111109,15 +113864,6 @@ "type": "library", "version": "1.14.10-4ubuntu4.1" }, - { - "bom-ref": "pkg:deb/ubuntu/libdbus-1-dev@1.14.10-4ubuntu4.1?arch=amd64&distro=ubuntu-24.04&package-id=8ecb0b0e6b4e1793&upstream=dbus", - "cpe": "cpe:2.3:a:libdbus-1-dev:libdbus-1-dev:1.14.10-4ubuntu4.1:*:*:*:*:*:*:*", - "name": "libdbus-1-dev", - "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libdbus-1-dev@1.14.10-4ubuntu4.1?arch=amd64&distro=ubuntu-24.04&upstream=dbus", - "type": "library", - "version": "1.14.10-4ubuntu4.1" - }, { "bom-ref": "pkg:deb/ubuntu/libdebconfclient0@0.271ubuntu3?arch=amd64&distro=ubuntu-24.04&package-id=7243f346f8955871&upstream=cdebconf", "cpe": "cpe:2.3:a:libdebconfclient0:libdebconfclient0:0.271ubuntu3:*:*:*:*:*:*:*", @@ -111335,13 +114081,13 @@ "version": "14.2.0-4ubuntu2~24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/libgcrypt20@1.10.3-2build1?arch=amd64&distro=ubuntu-24.04&package-id=e85dbea49e036948", - "cpe": "cpe:2.3:a:libgcrypt20:libgcrypt20:1.10.3-2build1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libgcrypt20@1.10.3-2ubuntu0.1?arch=amd64&distro=ubuntu-24.04&package-id=403482b76d2b5af1", + "cpe": "cpe:2.3:a:libgcrypt20:libgcrypt20:1.10.3-2ubuntu0.1:*:*:*:*:*:*:*", "name": "libgcrypt20", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libgcrypt20@1.10.3-2build1?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/libgcrypt20@1.10.3-2ubuntu0.1?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "1.10.3-2build1" + "version": "1.10.3-2ubuntu0.1" }, { "bom-ref": "pkg:deb/ubuntu/libgd3@2.3.3-9ubuntu5?arch=amd64&distro=ubuntu-24.04&package-id=8eb366226ca3a1ab&upstream=libgd2", @@ -111371,7 +114117,7 @@ "version": "1.23-5.1build1" }, { - "bom-ref": "pkg:deb/ubuntu/libgdrapi@2.5.1?arch=amd64&distro=ubuntu-24.04&package-id=64ce8fbf3a1531ac", + "bom-ref": "pkg:deb/ubuntu/libgdrapi@2.5.1?arch=amd64&distro=ubuntu-24.04&package-id=a33a28398f56a13e", "cpe": "cpe:2.3:a:libgdrapi:libgdrapi:2.5.1:*:*:*:*:*:*:*", "name": "libgdrapi", "publisher": "GPUDirect Team ", @@ -111425,13 +114171,13 @@ "version": "2:6.3.0+dfsg-2ubuntu6.1" }, { - "bom-ref": "pkg:deb/ubuntu/libgnutls30t64@3.8.3-1.1ubuntu3.5?arch=amd64&distro=ubuntu-24.04&package-id=1133dd71f1ea88ba&upstream=gnutls28", - "cpe": "cpe:2.3:a:libgnutls30t64:libgnutls30t64:3.8.3-1.1ubuntu3.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libgnutls30t64@3.8.3-1.1ubuntu3.6?arch=amd64&distro=ubuntu-24.04&package-id=cf48b38a6ae0137b&upstream=gnutls28", + "cpe": "cpe:2.3:a:libgnutls30t64:libgnutls30t64:3.8.3-1.1ubuntu3.6:*:*:*:*:*:*:*", "name": "libgnutls30t64", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libgnutls30t64@3.8.3-1.1ubuntu3.5?arch=amd64&distro=ubuntu-24.04&upstream=gnutls28", + "purl": "pkg:deb/ubuntu/libgnutls30t64@3.8.3-1.1ubuntu3.6?arch=amd64&distro=ubuntu-24.04&upstream=gnutls28", "type": "library", - "version": "3.8.3-1.1ubuntu3.5" + "version": "3.8.3-1.1ubuntu3.6" }, { "bom-ref": "pkg:deb/ubuntu/libgomp1@14.2.0-4ubuntu2~24.04.1?arch=amd64&distro=ubuntu-24.04&package-id=7416e45c7541b646&upstream=gcc-14", @@ -111614,22 +114360,22 @@ "version": "2.10.0-1build1" }, { - "bom-ref": "pkg:deb/ubuntu/libibumad-dev@59.1-1?arch=amd64&distro=ubuntu-24.04&package-id=38fa99ed29b7dbf5&upstream=rdma-core", - "cpe": "cpe:2.3:a:libibumad-dev:libibumad-dev:59.1-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libibumad-dev@63.0-1?arch=amd64&distro=ubuntu-24.04&package-id=935eb0748d49faa5&upstream=rdma-core", + "cpe": "cpe:2.3:a:libibumad-dev:libibumad-dev:63.0-1:*:*:*:*:*:*:*", "name": "libibumad-dev", "publisher": "Linux RDMA Mailing List ", - "purl": "pkg:deb/ubuntu/libibumad-dev@59.1-1?arch=amd64&distro=ubuntu-24.04&upstream=rdma-core", + "purl": "pkg:deb/ubuntu/libibumad-dev@63.0-1?arch=amd64&distro=ubuntu-24.04&upstream=rdma-core", "type": "library", - "version": "59.1-1" + "version": "63.0-1" }, { - "bom-ref": "pkg:deb/ubuntu/libibumad3@59.1-1?arch=amd64&distro=ubuntu-24.04&package-id=40cf489d33463127&upstream=rdma-core", - "cpe": "cpe:2.3:a:libibumad3:libibumad3:59.1-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libibumad3@63.0-1?arch=amd64&distro=ubuntu-24.04&package-id=205a0f7aa4fa347c&upstream=rdma-core", + "cpe": "cpe:2.3:a:libibumad3:libibumad3:63.0-1:*:*:*:*:*:*:*", "name": "libibumad3", "publisher": "Linux RDMA Mailing List ", - "purl": "pkg:deb/ubuntu/libibumad3@59.1-1?arch=amd64&distro=ubuntu-24.04&upstream=rdma-core", + "purl": "pkg:deb/ubuntu/libibumad3@63.0-1?arch=amd64&distro=ubuntu-24.04&upstream=rdma-core", "type": "library", - "version": "59.1-1" + "version": "63.0-1" }, { "bom-ref": "pkg:deb/ubuntu/libibverbs-dev@50.0-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=bfc399842bf6e307&upstream=rdma-core", @@ -111974,22 +114720,22 @@ "version": "1.9.4-1build1.1" }, { - "bom-ref": "pkg:deb/ubuntu/liblzma-dev@5.6.1%2Breally5.4.5-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=5fa009a2027085a8&upstream=xz-utils", - "cpe": "cpe:2.3:a:liblzma-dev:liblzma-dev:5.6.1\\+really5.4.5-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/liblzma-dev@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=amd64&distro=ubuntu-24.04&package-id=2305429a5daaa395&upstream=xz-utils", + "cpe": "cpe:2.3:a:liblzma-dev:liblzma-dev:5.6.1\\+really5.4.5-1ubuntu0.3:*:*:*:*:*:*:*", "name": "liblzma-dev", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/liblzma-dev@5.6.1%2Breally5.4.5-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&upstream=xz-utils", + "purl": "pkg:deb/ubuntu/liblzma-dev@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=amd64&distro=ubuntu-24.04&upstream=xz-utils", "type": "library", - "version": "5.6.1+really5.4.5-1ubuntu0.2" + "version": "5.6.1+really5.4.5-1ubuntu0.3" }, { - "bom-ref": "pkg:deb/ubuntu/liblzma5@5.6.1%2Breally5.4.5-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=a5cf80de10003b19&upstream=xz-utils", - "cpe": "cpe:2.3:a:liblzma5:liblzma5:5.6.1\\+really5.4.5-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/liblzma5@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=amd64&distro=ubuntu-24.04&package-id=c76dde2648ef27c3&upstream=xz-utils", + "cpe": "cpe:2.3:a:liblzma5:liblzma5:5.6.1\\+really5.4.5-1ubuntu0.3:*:*:*:*:*:*:*", "name": "liblzma5", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/liblzma5@5.6.1%2Breally5.4.5-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&upstream=xz-utils", + "purl": "pkg:deb/ubuntu/liblzma5@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=amd64&distro=ubuntu-24.04&upstream=xz-utils", "type": "library", - "version": "5.6.1+really5.4.5-1ubuntu0.2" + "version": "5.6.1+really5.4.5-1ubuntu0.3" }, { "bom-ref": "pkg:deb/ubuntu/libmagic-mgc@1%3A5.45-3build1?arch=amd64&distro=ubuntu-24.04&package-id=4ce4609bc9093848&upstream=file", @@ -112073,73 +114819,58 @@ "version": "1.32.5-1ubuntu1.1" }, { - "bom-ref": "pkg:deb/ubuntu/libnccl-dev@2.30.4-1%2Bcuda13.2?arch=amd64&distro=ubuntu-24.04&package-id=f24a59d50f767a6a&upstream=nccl", - "cpe": "cpe:2.3:a:libnccl-dev:libnccl-dev:2.30.4-1\\+cuda13.2:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "Apache-2.0" - } - }, - { - "license": { - "id": "BSD-3-Clause" - } - } - ], + "bom-ref": "pkg:deb/ubuntu/libnccl-dev@2.30.7-1%2Bcuda13.3?arch=amd64&distro=ubuntu-24.04&package-id=3718180481a4d16b&upstream=nccl", + "cpe": "cpe:2.3:a:libnccl-dev:libnccl-dev:2.30.7-1\\+cuda13.3:*:*:*:*:*:*:*", "name": "libnccl-dev", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnccl-dev@2.30.4-1%2Bcuda13.2?arch=amd64&distro=ubuntu-24.04&upstream=nccl", + "purl": "pkg:deb/ubuntu/libnccl-dev@2.30.7-1%2Bcuda13.3?arch=amd64&distro=ubuntu-24.04&upstream=nccl", "type": "library", - "version": "2.30.4-1+cuda13.2" + "version": "2.30.7-1+cuda13.3" }, { - "bom-ref": "pkg:deb/ubuntu/libnccl2@2.30.4-1%2Bcuda13.2?arch=amd64&distro=ubuntu-24.04&package-id=9ddc6200e54f3bfd&upstream=nccl", - "cpe": "cpe:2.3:a:libnccl2:libnccl2:2.30.4-1\\+cuda13.2:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "Apache-2.0" - } - }, - { - "license": { - "id": "BSD-3-Clause" - } - } - ], + "bom-ref": "pkg:deb/ubuntu/libnccl-ofi-ngc-v3@1.19.0-1?arch=amd64&distro=ubuntu-24.04&package-id=030556c69f1b933f&upstream=aws-ofi-nccl", + "cpe": "cpe:2.3:a:libnccl-ofi-ngc-v3:libnccl-ofi-ngc-v3:1.19.0-1:*:*:*:*:*:*:*", + "name": "libnccl-ofi-ngc-v3", + "publisher": "AWS OFI NCCL Team ", + "purl": "pkg:deb/ubuntu/libnccl-ofi-ngc-v3@1.19.0-1?arch=amd64&distro=ubuntu-24.04&upstream=aws-ofi-nccl", + "type": "library", + "version": "1.19.0-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libnccl2@2.30.7-1%2Bcuda13.3?arch=amd64&distro=ubuntu-24.04&package-id=6f7c1b1f9059f77a&upstream=nccl", + "cpe": "cpe:2.3:a:libnccl2:libnccl2:2.30.7-1\\+cuda13.3:*:*:*:*:*:*:*", "name": "libnccl2", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnccl2@2.30.4-1%2Bcuda13.2?arch=amd64&distro=ubuntu-24.04&upstream=nccl", + "purl": "pkg:deb/ubuntu/libnccl2@2.30.7-1%2Bcuda13.3?arch=amd64&distro=ubuntu-24.04&upstream=nccl", "type": "library", - "version": "2.30.4-1+cuda13.2" + "version": "2.30.7-1+cuda13.3" }, { - "bom-ref": "pkg:deb/ubuntu/libncurses-dev@6.4%2B20240113-1ubuntu2?arch=amd64&distro=ubuntu-24.04&package-id=92d1609fd93c7e3c&upstream=ncurses", - "cpe": "cpe:2.3:a:libncurses-dev:libncurses-dev:6.4\\+20240113-1ubuntu2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libncurses-dev@6.4%2B20240113-1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&package-id=59366fee0d4eac88&upstream=ncurses", + "cpe": "cpe:2.3:a:libncurses-dev:libncurses-dev:6.4\\+20240113-1ubuntu2.1:*:*:*:*:*:*:*", "name": "libncurses-dev", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libncurses-dev@6.4%2B20240113-1ubuntu2?arch=amd64&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/libncurses-dev@6.4%2B20240113-1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libncurses6@6.4%2B20240113-1ubuntu2?arch=amd64&distro=ubuntu-24.04&package-id=c243a3254c3ae7fb&upstream=ncurses", - "cpe": "cpe:2.3:a:libncurses6:libncurses6:6.4\\+20240113-1ubuntu2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libncurses6@6.4%2B20240113-1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&package-id=76aa96b06363b5ec&upstream=ncurses", + "cpe": "cpe:2.3:a:libncurses6:libncurses6:6.4\\+20240113-1ubuntu2.1:*:*:*:*:*:*:*", "name": "libncurses6", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libncurses6@6.4%2B20240113-1ubuntu2?arch=amd64&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/libncurses6@6.4%2B20240113-1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libncursesw6@6.4%2B20240113-1ubuntu2?arch=amd64&distro=ubuntu-24.04&package-id=d2b8f3d1c961e065&upstream=ncurses", - "cpe": "cpe:2.3:a:libncursesw6:libncursesw6:6.4\\+20240113-1ubuntu2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libncursesw6@6.4%2B20240113-1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&package-id=399397db6f869173&upstream=ncurses", + "cpe": "cpe:2.3:a:libncursesw6:libncursesw6:6.4\\+20240113-1ubuntu2.1:*:*:*:*:*:*:*", "name": "libncursesw6", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libncursesw6@6.4%2B20240113-1ubuntu2?arch=amd64&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/libncursesw6@6.4%2B20240113-1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { "bom-ref": "pkg:deb/ubuntu/libnettle8t64@3.9.1-2.2build1.1?arch=amd64&distro=ubuntu-24.04&package-id=e25d1f02c39661c5&upstream=nettle", @@ -112151,13 +114882,13 @@ "version": "3.9.1-2.2build1.1" }, { - "bom-ref": "pkg:deb/ubuntu/libnghttp2-14@1.59.0-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=af88b1c0739292f0&upstream=nghttp2", - "cpe": "cpe:2.3:a:libnghttp2-14:libnghttp2-14:1.59.0-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libnghttp2-14@1.59.0-1ubuntu0.4?arch=amd64&distro=ubuntu-24.04&package-id=06900c9cb59b250c&upstream=nghttp2", + "cpe": "cpe:2.3:a:libnghttp2-14:libnghttp2-14:1.59.0-1ubuntu0.4:*:*:*:*:*:*:*", "name": "libnghttp2-14", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libnghttp2-14@1.59.0-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&upstream=nghttp2", + "purl": "pkg:deb/ubuntu/libnghttp2-14@1.59.0-1ubuntu0.4?arch=amd64&distro=ubuntu-24.04&upstream=nghttp2", "type": "library", - "version": "1.59.0-1ubuntu0.2" + "version": "1.59.0-1ubuntu0.4" }, { "bom-ref": "pkg:deb/ubuntu/libnl-3-200@3.7.0-0.3build1.1?arch=amd64&distro=ubuntu-24.04&package-id=b874972b8dc5c201&upstream=libnl3", @@ -112214,22 +114945,22 @@ "version": "1.5.9+dfsg-3.1build1" }, { - "bom-ref": "pkg:deb/ubuntu/libnpp-13-2@13.1.0.48-1?arch=amd64&distro=ubuntu-24.04&package-id=70aace7d18b52fa0&upstream=libnpp", - "cpe": "cpe:2.3:a:libnpp-13-2:libnpp-13-2:13.1.0.48-1:*:*:*:*:*:*:*", - "name": "libnpp-13-2", + "bom-ref": "pkg:deb/ubuntu/libnpp-13-4@13.2.0.35-1?arch=amd64&distro=ubuntu-24.04&package-id=6f42206ea2426363&upstream=libnpp", + "cpe": "cpe:2.3:a:libnpp-13-4:libnpp-13-4:13.2.0.35-1:*:*:*:*:*:*:*", + "name": "libnpp-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnpp-13-2@13.1.0.48-1?arch=amd64&distro=ubuntu-24.04&upstream=libnpp", + "purl": "pkg:deb/ubuntu/libnpp-13-4@13.2.0.35-1?arch=amd64&distro=ubuntu-24.04&upstream=libnpp", "type": "library", - "version": "13.1.0.48-1" + "version": "13.2.0.35-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnpp-dev-13-2@13.1.0.48-1?arch=amd64&distro=ubuntu-24.04&package-id=1747f990296dc833&upstream=libnpp", - "cpe": "cpe:2.3:a:libnpp-dev-13-2:libnpp-dev-13-2:13.1.0.48-1:*:*:*:*:*:*:*", - "name": "libnpp-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libnpp-dev-13-4@13.2.0.35-1?arch=amd64&distro=ubuntu-24.04&package-id=6a81efc53976b665&upstream=libnpp", + "cpe": "cpe:2.3:a:libnpp-dev-13-4:libnpp-dev-13-4:13.2.0.35-1:*:*:*:*:*:*:*", + "name": "libnpp-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnpp-dev-13-2@13.1.0.48-1?arch=amd64&distro=ubuntu-24.04&upstream=libnpp", + "purl": "pkg:deb/ubuntu/libnpp-dev-13-4@13.2.0.35-1?arch=amd64&distro=ubuntu-24.04&upstream=libnpp", "type": "library", - "version": "13.1.0.48-1" + "version": "13.2.0.35-1" }, { "bom-ref": "pkg:deb/ubuntu/libnpth0t64@1.6-3.1build1?arch=amd64&distro=ubuntu-24.04&package-id=cebec2a75bf259aa&upstream=npth", @@ -112259,103 +114990,103 @@ "version": "2.0.18-1ubuntu0.24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvfatbin-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=ef23820b3ed32df1&upstream=libnvfatbin", - "cpe": "cpe:2.3:a:libnvfatbin-13-2:libnvfatbin-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvfatbin-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvfatbin-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=ec457af72c0d2021&upstream=libnvfatbin", + "cpe": "cpe:2.3:a:libnvfatbin-13-4:libnvfatbin-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "libnvfatbin-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvfatbin-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvfatbin", + "purl": "pkg:deb/ubuntu/libnvfatbin-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvfatbin", "type": "library", - "version": "13.2.78-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvfatbin-dev-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=90b1037fdf291628&upstream=libnvfatbin", - "cpe": "cpe:2.3:a:libnvfatbin-dev-13-2:libnvfatbin-dev-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvfatbin-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvfatbin-dev-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&package-id=4553b9f1f53c7d5f&upstream=libnvfatbin", + "cpe": "cpe:2.3:a:libnvfatbin-dev-13-4:libnvfatbin-dev-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "libnvfatbin-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvfatbin-dev-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvfatbin", + "purl": "pkg:deb/ubuntu/libnvfatbin-dev-13-4@13.4.49-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvfatbin", "type": "library", - "version": "13.2.78-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvjitlink-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=45b8860439ed497a&upstream=libnvjitlink", - "cpe": "cpe:2.3:a:libnvjitlink-13-2:libnvjitlink-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvjitlink-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvjitlink-13-4@13.4.52-1?arch=amd64&distro=ubuntu-24.04&package-id=92c5e0bfb771290e&upstream=libnvjitlink", + "cpe": "cpe:2.3:a:libnvjitlink-13-4:libnvjitlink-13-4:13.4.52-1:*:*:*:*:*:*:*", + "name": "libnvjitlink-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvjitlink-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvjitlink", + "purl": "pkg:deb/ubuntu/libnvjitlink-13-4@13.4.52-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvjitlink", "type": "library", - "version": "13.2.78-1" + "version": "13.4.52-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvjitlink-dev-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=ebb958d5982f6dea&upstream=libnvjitlink", - "cpe": "cpe:2.3:a:libnvjitlink-dev-13-2:libnvjitlink-dev-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvjitlink-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvjitlink-dev-13-4@13.4.52-1?arch=amd64&distro=ubuntu-24.04&package-id=b2506d9c62780238&upstream=libnvjitlink", + "cpe": "cpe:2.3:a:libnvjitlink-dev-13-4:libnvjitlink-dev-13-4:13.4.52-1:*:*:*:*:*:*:*", + "name": "libnvjitlink-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvjitlink-dev-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvjitlink", + "purl": "pkg:deb/ubuntu/libnvjitlink-dev-13-4@13.4.52-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvjitlink", "type": "library", - "version": "13.2.78-1" + "version": "13.4.52-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvjpeg-13-2@13.1.0.48-1?arch=amd64&distro=ubuntu-24.04&package-id=4f7be0dd6cfd80da&upstream=libnvjpeg", - "cpe": "cpe:2.3:a:libnvjpeg-13-2:libnvjpeg-13-2:13.1.0.48-1:*:*:*:*:*:*:*", - "name": "libnvjpeg-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvjpeg-13-4@13.2.2.35-1?arch=amd64&distro=ubuntu-24.04&package-id=084754883f2a2b8a&upstream=libnvjpeg", + "cpe": "cpe:2.3:a:libnvjpeg-13-4:libnvjpeg-13-4:13.2.2.35-1:*:*:*:*:*:*:*", + "name": "libnvjpeg-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvjpeg-13-2@13.1.0.48-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvjpeg", + "purl": "pkg:deb/ubuntu/libnvjpeg-13-4@13.2.2.35-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvjpeg", "type": "library", - "version": "13.1.0.48-1" + "version": "13.2.2.35-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvjpeg-dev-13-2@13.1.0.48-1?arch=amd64&distro=ubuntu-24.04&package-id=9641e058dd20010a&upstream=libnvjpeg", - "cpe": "cpe:2.3:a:libnvjpeg-dev-13-2:libnvjpeg-dev-13-2:13.1.0.48-1:*:*:*:*:*:*:*", - "name": "libnvjpeg-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvjpeg-dev-13-4@13.2.2.35-1?arch=amd64&distro=ubuntu-24.04&package-id=f8bbd76a91339878&upstream=libnvjpeg", + "cpe": "cpe:2.3:a:libnvjpeg-dev-13-4:libnvjpeg-dev-13-4:13.2.2.35-1:*:*:*:*:*:*:*", + "name": "libnvjpeg-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvjpeg-dev-13-2@13.1.0.48-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvjpeg", + "purl": "pkg:deb/ubuntu/libnvjpeg-dev-13-4@13.2.2.35-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvjpeg", "type": "library", - "version": "13.1.0.48-1" + "version": "13.2.2.35-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvptxcompiler-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=9aae1df7a643716c&upstream=libnvptxcompiler", - "cpe": "cpe:2.3:a:libnvptxcompiler-13-2:libnvptxcompiler-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvptxcompiler-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvptxcompiler-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&package-id=1bb71baa222e8daa&upstream=libnvptxcompiler", + "cpe": "cpe:2.3:a:libnvptxcompiler-13-4:libnvptxcompiler-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "libnvptxcompiler-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvptxcompiler-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvptxcompiler", + "purl": "pkg:deb/ubuntu/libnvptxcompiler-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvptxcompiler", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvshmem3-cuda-13@3.6.5-1?arch=amd64&distro=ubuntu-24.04&package-id=d2b0a95467e052d9&upstream=libnvshmem", - "cpe": "cpe:2.3:a:libnvshmem3-cuda-13:libnvshmem3-cuda-13:3.6.5-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libnvshmem3-cuda-13@3.7.1-1?arch=amd64&distro=ubuntu-24.04&package-id=04d44ec3c4e441c7&upstream=libnvshmem", + "cpe": "cpe:2.3:a:libnvshmem3-cuda-13:libnvshmem3-cuda-13:3.7.1-1:*:*:*:*:*:*:*", "name": "libnvshmem3-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvshmem3-cuda-13@3.6.5-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvshmem", + "purl": "pkg:deb/ubuntu/libnvshmem3-cuda-13@3.7.1-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvshmem", "type": "library", - "version": "3.6.5-1" + "version": "3.7.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvshmem3-dev-cuda-13@3.6.5-1?arch=amd64&distro=ubuntu-24.04&package-id=b6311f7189087053&upstream=libnvshmem", - "cpe": "cpe:2.3:a:libnvshmem3-dev-cuda-13:libnvshmem3-dev-cuda-13:3.6.5-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libnvshmem3-dev-cuda-13@3.7.1-1?arch=amd64&distro=ubuntu-24.04&package-id=5c23d7e223ae309c&upstream=libnvshmem", + "cpe": "cpe:2.3:a:libnvshmem3-dev-cuda-13:libnvshmem3-dev-cuda-13:3.7.1-1:*:*:*:*:*:*:*", "name": "libnvshmem3-dev-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvshmem3-dev-cuda-13@3.6.5-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvshmem", + "purl": "pkg:deb/ubuntu/libnvshmem3-dev-cuda-13@3.7.1-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvshmem", "type": "library", - "version": "3.6.5-1" + "version": "3.7.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvshmem3-static-cuda-13@3.6.5-1?arch=amd64&distro=ubuntu-24.04&package-id=56f3468a0a990b06&upstream=libnvshmem", - "cpe": "cpe:2.3:a:libnvshmem3-static-cuda-13:libnvshmem3-static-cuda-13:3.6.5-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libnvshmem3-static-cuda-13@3.7.1-1?arch=amd64&distro=ubuntu-24.04&package-id=383e458ae5f14a08&upstream=libnvshmem", + "cpe": "cpe:2.3:a:libnvshmem3-static-cuda-13:libnvshmem3-static-cuda-13:3.7.1-1:*:*:*:*:*:*:*", "name": "libnvshmem3-static-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvshmem3-static-cuda-13@3.6.5-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvshmem", + "purl": "pkg:deb/ubuntu/libnvshmem3-static-cuda-13@3.7.1-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvshmem", "type": "library", - "version": "3.6.5-1" + "version": "3.7.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvvm-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&package-id=4379bbf7de33b7e0&upstream=libnvvm", - "cpe": "cpe:2.3:a:libnvvm-13-2:libnvvm-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvvm-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvvm-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&package-id=6822eed1dcc1a5c6&upstream=libnvvm", + "cpe": "cpe:2.3:a:libnvvm-13-4:libnvvm-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "libnvvm-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvvm-13-2@13.2.78-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvvm", + "purl": "pkg:deb/ubuntu/libnvvm-13-4@13.4.59-1?arch=amd64&distro=ubuntu-24.04&upstream=libnvvm", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { "bom-ref": "pkg:deb/ubuntu/libobjc-13-dev@13.3.0-6ubuntu2~24.04.1?arch=amd64&distro=ubuntu-24.04&package-id=5e5553ed5dd250fd&upstream=gcc-13", @@ -112430,40 +115161,40 @@ "version": "0.25.3-4ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libpam-modules@1.5.3-5ubuntu5.5?arch=amd64&distro=ubuntu-24.04&package-id=8b6c0ec898675384&upstream=pam", - "cpe": "cpe:2.3:a:libpam-modules:libpam-modules:1.5.3-5ubuntu5.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpam-modules@1.5.3-5ubuntu5.6?arch=amd64&distro=ubuntu-24.04&package-id=aabddfafc5c8b609&upstream=pam", + "cpe": "cpe:2.3:a:libpam-modules:libpam-modules:1.5.3-5ubuntu5.6:*:*:*:*:*:*:*", "name": "libpam-modules", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libpam-modules@1.5.3-5ubuntu5.5?arch=amd64&distro=ubuntu-24.04&upstream=pam", + "purl": "pkg:deb/ubuntu/libpam-modules@1.5.3-5ubuntu5.6?arch=amd64&distro=ubuntu-24.04&upstream=pam", "type": "library", - "version": "1.5.3-5ubuntu5.5" + "version": "1.5.3-5ubuntu5.6" }, { - "bom-ref": "pkg:deb/ubuntu/libpam-modules-bin@1.5.3-5ubuntu5.5?arch=amd64&distro=ubuntu-24.04&package-id=e48a9d507a83b245&upstream=pam", - "cpe": "cpe:2.3:a:libpam-modules-bin:libpam-modules-bin:1.5.3-5ubuntu5.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpam-modules-bin@1.5.3-5ubuntu5.6?arch=amd64&distro=ubuntu-24.04&package-id=60c5e5329553f5f4&upstream=pam", + "cpe": "cpe:2.3:a:libpam-modules-bin:libpam-modules-bin:1.5.3-5ubuntu5.6:*:*:*:*:*:*:*", "name": "libpam-modules-bin", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libpam-modules-bin@1.5.3-5ubuntu5.5?arch=amd64&distro=ubuntu-24.04&upstream=pam", + "purl": "pkg:deb/ubuntu/libpam-modules-bin@1.5.3-5ubuntu5.6?arch=amd64&distro=ubuntu-24.04&upstream=pam", "type": "library", - "version": "1.5.3-5ubuntu5.5" + "version": "1.5.3-5ubuntu5.6" }, { - "bom-ref": "pkg:deb/ubuntu/libpam-runtime@1.5.3-5ubuntu5.5?arch=all&distro=ubuntu-24.04&package-id=7f17b2799ccab7c8&upstream=pam", - "cpe": "cpe:2.3:a:libpam-runtime:libpam-runtime:1.5.3-5ubuntu5.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpam-runtime@1.5.3-5ubuntu5.6?arch=all&distro=ubuntu-24.04&package-id=f706552214689c4b&upstream=pam", + "cpe": "cpe:2.3:a:libpam-runtime:libpam-runtime:1.5.3-5ubuntu5.6:*:*:*:*:*:*:*", "name": "libpam-runtime", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libpam-runtime@1.5.3-5ubuntu5.5?arch=all&distro=ubuntu-24.04&upstream=pam", + "purl": "pkg:deb/ubuntu/libpam-runtime@1.5.3-5ubuntu5.6?arch=all&distro=ubuntu-24.04&upstream=pam", "type": "library", - "version": "1.5.3-5ubuntu5.5" + "version": "1.5.3-5ubuntu5.6" }, { - "bom-ref": "pkg:deb/ubuntu/libpam0g@1.5.3-5ubuntu5.5?arch=amd64&distro=ubuntu-24.04&package-id=798d383ef2a2f7a2&upstream=pam", - "cpe": "cpe:2.3:a:libpam0g:libpam0g:1.5.3-5ubuntu5.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpam0g@1.5.3-5ubuntu5.6?arch=amd64&distro=ubuntu-24.04&package-id=bd810f60860165a5&upstream=pam", + "cpe": "cpe:2.3:a:libpam0g:libpam0g:1.5.3-5ubuntu5.6:*:*:*:*:*:*:*", "name": "libpam0g", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libpam0g@1.5.3-5ubuntu5.5?arch=amd64&distro=ubuntu-24.04&upstream=pam", + "purl": "pkg:deb/ubuntu/libpam0g@1.5.3-5ubuntu5.6?arch=amd64&distro=ubuntu-24.04&upstream=pam", "type": "library", - "version": "1.5.3-5ubuntu5.5" + "version": "1.5.3-5ubuntu5.6" }, { "bom-ref": "pkg:deb/ubuntu/libpango-1.0-0@1.52.1%2Bds-1build1?arch=amd64&distro=ubuntu-24.04&package-id=188108cac40a2d0b&upstream=pango1.0", @@ -112520,13 +115251,13 @@ "version": "10.42-4ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=d6f69413b4086c2c&upstream=perl", - "cpe": "cpe:2.3:a:libperl5.38t64:libperl5.38t64:5.38.2-3.2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04&package-id=3b23da62ec0acb0f&upstream=perl", + "cpe": "cpe:2.3:a:libperl5.38t64:libperl5.38t64:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", "name": "libperl5.38t64", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&upstream=perl", + "purl": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04&upstream=perl", "type": "library", - "version": "5.38.2-3.2ubuntu0.2" + "version": "5.38.2-3.2ubuntu0.3" }, { "bom-ref": "pkg:deb/ubuntu/libpfm4@4.13.0%2Bgit32-g0d4ed0e-1?arch=amd64&distro=ubuntu-24.04&package-id=8d096271882cd50d", @@ -112682,40 +115413,40 @@ "version": "3.12.3-0ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&package-id=355efc415a484459&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12-dev:libpython3.12-dev:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=55c46b0e46753150&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12-dev:libpython3.12-dev:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "libpython3.12-dev", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&package-id=eb76d9961bb3ca08&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12-minimal:libpython3.12-minimal:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=a8321c1a51b3de88&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12-minimal:libpython3.12-minimal:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "libpython3.12-minimal", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&package-id=c3ee2f4f82d41d68&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12-stdlib:libpython3.12-stdlib:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=1bd87d10c8248b19&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12-stdlib:libpython3.12-stdlib:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "libpython3.12-stdlib", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&package-id=7dab6aacf3b595c5&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12t64:libpython3.12t64:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=ae9d81e52dc24ed4&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12t64:libpython3.12t64:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "libpython3.12t64", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { "bom-ref": "pkg:deb/ubuntu/libquadmath0@14.2.0-4ubuntu2~24.04.1?arch=amd64&distro=ubuntu-24.04&package-id=4550830f325b4654&upstream=gcc-14", @@ -112977,13 +115708,13 @@ "version": "14.4.2+git20190427-4build4" }, { - "bom-ref": "pkg:deb/ubuntu/libsqlite3-0@3.45.1-1ubuntu2.5?arch=amd64&distro=ubuntu-24.04&package-id=4fa7e46b59073911&upstream=sqlite3", - "cpe": "cpe:2.3:a:libsqlite3-0:libsqlite3-0:3.45.1-1ubuntu2.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libsqlite3-0@3.45.1-1ubuntu2.7?arch=amd64&distro=ubuntu-24.04&package-id=44c0c15be38313c9&upstream=sqlite3", + "cpe": "cpe:2.3:a:libsqlite3-0:libsqlite3-0:3.45.1-1ubuntu2.7:*:*:*:*:*:*:*", "name": "libsqlite3-0", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libsqlite3-0@3.45.1-1ubuntu2.5?arch=amd64&distro=ubuntu-24.04&upstream=sqlite3", + "purl": "pkg:deb/ubuntu/libsqlite3-0@3.45.1-1ubuntu2.7?arch=amd64&distro=ubuntu-24.04&upstream=sqlite3", "type": "library", - "version": "3.45.1-1ubuntu2.5" + "version": "3.45.1-1ubuntu2.7" }, { "bom-ref": "pkg:deb/ubuntu/libss2@1.47.0-2.4~exp1ubuntu4.1?arch=amd64&distro=ubuntu-24.04&package-id=093dc355a35e767e&upstream=e2fsprogs", @@ -113040,13 +115771,13 @@ "version": "14.2.0-4ubuntu2~24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/libsystemd0@255.4-1ubuntu8.15?arch=amd64&distro=ubuntu-24.04&package-id=52322957d231e0bc&upstream=systemd", - "cpe": "cpe:2.3:a:libsystemd0:libsystemd0:255.4-1ubuntu8.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libsystemd0@255.4-1ubuntu8.17?arch=amd64&distro=ubuntu-24.04&package-id=fd1a0b34747ae921&upstream=systemd", + "cpe": "cpe:2.3:a:libsystemd0:libsystemd0:255.4-1ubuntu8.17:*:*:*:*:*:*:*", "name": "libsystemd0", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libsystemd0@255.4-1ubuntu8.15?arch=amd64&distro=ubuntu-24.04&upstream=systemd", + "purl": "pkg:deb/ubuntu/libsystemd0@255.4-1ubuntu8.17?arch=amd64&distro=ubuntu-24.04&upstream=systemd", "type": "library", - "version": "255.4-1ubuntu8.15" + "version": "255.4-1ubuntu8.17" }, { "bom-ref": "pkg:deb/ubuntu/libtasn1-6@4.19.0-3ubuntu0.24.04.2?arch=amd64&distro=ubuntu-24.04&package-id=6d8411d8b5eb434b", @@ -113094,13 +115825,13 @@ "version": "4.5.1+git230720-4ubuntu2.5" }, { - "bom-ref": "pkg:deb/ubuntu/libtinfo6@6.4%2B20240113-1ubuntu2?arch=amd64&distro=ubuntu-24.04&package-id=2c751cde49d79211&upstream=ncurses", - "cpe": "cpe:2.3:a:libtinfo6:libtinfo6:6.4\\+20240113-1ubuntu2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libtinfo6@6.4%2B20240113-1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&package-id=49636aabdabe6030&upstream=ncurses", + "cpe": "cpe:2.3:a:libtinfo6:libtinfo6:6.4\\+20240113-1ubuntu2.1:*:*:*:*:*:*:*", "name": "libtinfo6", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libtinfo6@6.4%2B20240113-1ubuntu2?arch=amd64&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/libtinfo6@6.4%2B20240113-1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { "bom-ref": "pkg:deb/ubuntu/libtool@2.4.7-7build1?arch=all&distro=ubuntu-24.04&package-id=57843439295b9e8f", @@ -113130,13 +115861,13 @@ "version": "14.2.0-4ubuntu2~24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/libudev1@255.4-1ubuntu8.15?arch=amd64&distro=ubuntu-24.04&package-id=c6510bc940418fdf&upstream=systemd", - "cpe": "cpe:2.3:a:libudev1:libudev1:255.4-1ubuntu8.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libudev1@255.4-1ubuntu8.17?arch=amd64&distro=ubuntu-24.04&package-id=0fab8a5ad9ccb570&upstream=systemd", + "cpe": "cpe:2.3:a:libudev1:libudev1:255.4-1ubuntu8.17:*:*:*:*:*:*:*", "name": "libudev1", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libudev1@255.4-1ubuntu8.15?arch=amd64&distro=ubuntu-24.04&upstream=systemd", + "purl": "pkg:deb/ubuntu/libudev1@255.4-1ubuntu8.17?arch=amd64&distro=ubuntu-24.04&upstream=systemd", "type": "library", - "version": "255.4-1ubuntu8.15" + "version": "255.4-1ubuntu8.17" }, { "bom-ref": "pkg:deb/ubuntu/libunistring5@1.1-2build1.1?arch=amd64&distro=ubuntu-24.04&package-id=09b611f3fa028385&upstream=libunistring", @@ -113301,22 +116032,22 @@ "version": "2:1.3.4-1build2" }, { - "bom-ref": "pkg:deb/ubuntu/libxml2@2.9.14%2Bdfsg-1.3ubuntu3.7?arch=amd64&distro=ubuntu-24.04&package-id=3bf61318dfae0340", - "cpe": "cpe:2.3:a:libxml2:libxml2:2.9.14\\+dfsg-1.3ubuntu3.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libxml2@2.9.14%2Bdfsg-1.3ubuntu3.8?arch=amd64&distro=ubuntu-24.04&package-id=03624a929c7d913f", + "cpe": "cpe:2.3:a:libxml2:libxml2:2.9.14\\+dfsg-1.3ubuntu3.8:*:*:*:*:*:*:*", "name": "libxml2", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libxml2@2.9.14%2Bdfsg-1.3ubuntu3.7?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/libxml2@2.9.14%2Bdfsg-1.3ubuntu3.8?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "2.9.14+dfsg-1.3ubuntu3.7" + "version": "2.9.14+dfsg-1.3ubuntu3.8" }, { - "bom-ref": "pkg:deb/ubuntu/libxml2-dev@2.9.14%2Bdfsg-1.3ubuntu3.7?arch=amd64&distro=ubuntu-24.04&package-id=d55a3afe0a9295a2&upstream=libxml2", - "cpe": "cpe:2.3:a:libxml2-dev:libxml2-dev:2.9.14\\+dfsg-1.3ubuntu3.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libxml2-dev@2.9.14%2Bdfsg-1.3ubuntu3.8?arch=amd64&distro=ubuntu-24.04&package-id=7dd44d74050aa55f&upstream=libxml2", + "cpe": "cpe:2.3:a:libxml2-dev:libxml2-dev:2.9.14\\+dfsg-1.3ubuntu3.8:*:*:*:*:*:*:*", "name": "libxml2-dev", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libxml2-dev@2.9.14%2Bdfsg-1.3ubuntu3.7?arch=amd64&distro=ubuntu-24.04&upstream=libxml2", + "purl": "pkg:deb/ubuntu/libxml2-dev@2.9.14%2Bdfsg-1.3ubuntu3.8?arch=amd64&distro=ubuntu-24.04&upstream=libxml2", "type": "library", - "version": "2.9.14+dfsg-1.3ubuntu3.7" + "version": "2.9.14+dfsg-1.3ubuntu3.8" }, { "bom-ref": "pkg:deb/ubuntu/libxmu6@2%3A1.1.3-3build2?arch=amd64&distro=ubuntu-24.04&package-id=2e439c281d17ad3a&upstream=libxmu", @@ -113427,13 +116158,13 @@ "version": "1.5.5+dfsg2-2build1.1" }, { - "bom-ref": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-111.111?arch=amd64&distro=ubuntu-24.04&package-id=54c4a3d2d08745c3&upstream=linux", - "cpe": "cpe:2.3:a:linux-libc-dev:linux-libc-dev:6.8.0-111.111:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-138.138?arch=amd64&distro=ubuntu-24.04&package-id=6223d01ab25e2c08&upstream=linux", + "cpe": "cpe:2.3:a:linux-libc-dev:linux-libc-dev:6.8.0-138.138:*:*:*:*:*:*:*", "name": "linux-libc-dev", "publisher": "Ubuntu Kernel Team ", - "purl": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-111.111?arch=amd64&distro=ubuntu-24.04&upstream=linux", + "purl": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-138.138?arch=amd64&distro=ubuntu-24.04&upstream=linux", "type": "library", - "version": "6.8.0-111.111" + "version": "6.8.0-138.138" }, { "bom-ref": "pkg:deb/ubuntu/lld@1%3A18.0-59~exp2?arch=amd64&distro=ubuntu-24.04&package-id=b7fecc45bd30ad87&upstream=llvm-defaults%400.59~exp2", @@ -113471,7 +116202,7 @@ }, { "author": "Adam Jakubek, Rafa\u0142 Ga\u0142czy\u0144ski ", - "bom-ref": "pkg:pypi/llist@0.7.1?package-id=95a0b7c74836cbe9", + "bom-ref": "pkg:pypi/llist@0.7.1?package-id=535cab1c92b63879", "cpe": "cpe:2.3:a:ajakubek_project:python-llist:0.7.1:*:*:*:*:*:*:*", "licenses": [ { @@ -113572,8 +116303,8 @@ }, { "author": "lxml dev team ", - "bom-ref": "pkg:pypi/lxml@6.1.2?package-id=422f055ff5f748f8", - "cpe": "cpe:2.3:a:lxml:lxml:6.1.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/lxml@6.1.3?package-id=9d0583e9083fb23a", + "cpe": "cpe:2.3:a:lxml:lxml:6.1.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -113582,9 +116313,9 @@ } ], "name": "lxml", - "purl": "pkg:pypi/lxml@6.1.2", + "purl": "pkg:pypi/lxml@6.1.3", "type": "library", - "version": "6.1.2" + "version": "6.1.3" }, { "bom-ref": "pkg:deb/ubuntu/m4@1.4.19-4build1?arch=amd64&distro=ubuntu-24.04&package-id=744c6ca9672e0624", @@ -113622,8 +116353,8 @@ }, { "author": "Manfred Stienstra, Yuri Takhteyev >", - "bom-ref": "pkg:pypi/markdown@3.10.2?package-id=080c3f60abea2b82", - "cpe": "cpe:2.3:a:manfred_stienstra\\,_yuri_takhteyev_project:python-markdown:3.10.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/markdown@3.10.3?package-id=1a06ee73f9e40725", + "cpe": "cpe:2.3:a:manfred_stienstra\\,_yuri_takhteyev_project:python-markdown:3.10.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -113632,9 +116363,9 @@ } ], "name": "markdown", - "purl": "pkg:pypi/markdown@3.10.2", + "purl": "pkg:pypi/markdown@3.10.3", "type": "library", - "version": "3.10.2" + "version": "3.10.3" }, { "author": "Chris Sewell ", @@ -113662,28 +116393,35 @@ }, { "author": "John D. Hunter, Michael Droettboom >", - "bom-ref": "pkg:pypi/matplotlib@3.10.9?package-id=12089b0ec4d302c4", - "cpe": "cpe:2.3:a:john_d__hunter\\,_michael_droettboom_project:python-matplotlib:3.10.9:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/matplotlib@3.11.1?package-id=7e42b198c12bfc23", + "cpe": "cpe:2.3:a:john_d__hunter\\,_michael_droettboom_project:python-matplotlib:3.11.1:*:*:*:*:*:*:*", "licenses": [ { "license": { - "name": "sha256:3cb2c7aa8ec1f91fe59071d47f0d875cd1381b51d1cbf3ec8e225168c552597a" + "name": "sha256:3596f4f7d52f77bb4ae3b2b11fe14abbae564b43b566f64ea452c46a248b1157" } } ], "name": "matplotlib", - "purl": "pkg:pypi/matplotlib@3.10.9", + "purl": "pkg:pypi/matplotlib@3.11.1", "type": "library", - "version": "3.10.9" + "version": "3.11.1" }, { "author": "IPython Development Team ", - "bom-ref": "pkg:pypi/matplotlib-inline@0.2.1?package-id=800bd76f5fe4aa3c", - "cpe": "cpe:2.3:a:ipython_development_team_\\", - "bom-ref": "pkg:pypi/mdit-py-plugins@0.6.0?package-id=b9901a56eb0c2a2d", - "cpe": "cpe:2.3:a:chris_sewell_\\", @@ -113827,7 +116565,7 @@ }, { "author": "Hsiaoming Yang ", - "bom-ref": "pkg:pypi/mistune@3.3.4?package-id=461083ddcd80abdc", + "bom-ref": "pkg:pypi/mistune@3.3.4?package-id=3628e3e524507822", "cpe": "cpe:2.3:a:hsiaoming_yang_\\", - "bom-ref": "pkg:pypi/ml-dtypes@0.5.4?package-id=8deca0d95da30728", - "cpe": "cpe:2.3:a:ml_dtypes_authors_\\", @@ -113964,12 +116702,12 @@ }, { "author": "Lisandro Dalcin ", - "bom-ref": "pkg:pypi/mpi4py@3.1.5?package-id=7313dc65cb981654", + "bom-ref": "pkg:pypi/mpi4py@3.1.5?package-id=6b58a35134fe6dff", "cpe": "cpe:2.3:a:lisandro_dalcin_project:python-mpi4py:3.1.5:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/tmp.vBX4ZQHeyv/mpi4py-3.1.5" + "url": "file:///tmp/tmp.HkMvjCH3ln/mpi4py-3.1.5" } ], "licenses": [ @@ -114033,8 +116771,8 @@ }, { "author": "Inada Naoki ", - "bom-ref": "pkg:pypi/msgpack@1.2.1?package-id=0826cb346786102c", - "cpe": "cpe:2.3:a:msgpack:messagepack:1.2.1:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/msgpack@1.2.2?package-id=fb946dcdfe85a062", + "cpe": "cpe:2.3:a:msgpack:messagepack:1.2.2:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -114043,9 +116781,9 @@ } ], "name": "msgpack", - "purl": "pkg:pypi/msgpack@1.2.1", + "purl": "pkg:pypi/msgpack@1.2.2", "type": "library", - "version": "1.2.1" + "version": "1.2.2" }, { "bom-ref": "pkg:pypi/msgspec@0.21.1?package-id=3b983a2d8f937636", @@ -114127,18 +116865,18 @@ "version": "1.1.0" }, { - "bom-ref": "pkg:deb/ubuntu/nano@7.2-2ubuntu0.1?arch=amd64&distro=ubuntu-24.04&package-id=aafb1d800e3a50dc", - "cpe": "cpe:2.3:a:nano:nano:7.2-2ubuntu0.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/nano@7.2-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=8ef10ab6f1bab542", + "cpe": "cpe:2.3:a:nano:nano:7.2-2ubuntu0.2:*:*:*:*:*:*:*", "name": "nano", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/nano@7.2-2ubuntu0.1?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/nano@7.2-2ubuntu0.2?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "7.2-2ubuntu0.1" + "version": "7.2-2ubuntu0.2" }, { "author": "Marco Gorelli >", - "bom-ref": "pkg:pypi/narwhals@2.25.0?package-id=7c7c5345f9bb3dcb", - "cpe": "cpe:2.3:a:marco_gorelli_\\", - "bom-ref": "pkg:pypi/nbclient@0.10.4?package-id=ad2f3665c867d879", - "cpe": "cpe:2.3:a:jupyter_development_team_\\", @@ -114194,8 +116932,8 @@ }, { "author": "Jupyter Development Team ", - "bom-ref": "pkg:pypi/nbformat@5.10.4?package-id=4b97cc7c26913b9d", - "cpe": "cpe:2.3:a:jupyter_development_team_\\", - "purl": "pkg:deb/ubuntu/ncurses-base@6.4%2B20240113-1ubuntu2?arch=all&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/ncurses-base@6.4%2B20240113-1ubuntu2.1?arch=all&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/ncurses-bin@6.4%2B20240113-1ubuntu2?arch=amd64&distro=ubuntu-24.04&package-id=7523a4d83065949c&upstream=ncurses", - "cpe": "cpe:2.3:a:ncurses-bin:ncurses-bin:6.4\\+20240113-1ubuntu2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/ncurses-bin@6.4%2B20240113-1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&package-id=e085d12da5b36256&upstream=ncurses", + "cpe": "cpe:2.3:a:ncurses-bin:ncurses-bin:6.4\\+20240113-1ubuntu2.1:*:*:*:*:*:*:*", "name": "ncurses-bin", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/ncurses-bin@6.4%2B20240113-1ubuntu2?arch=amd64&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/ncurses-bin@6.4%2B20240113-1ubuntu2.1?arch=amd64&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { "author": "Ewald R. de Wit ", - "bom-ref": "pkg:pypi/nest-asyncio@1.6.0?package-id=8ef0fce9db07cd71", - "cpe": "cpe:2.3:a:ewald_r__de_wit_project:python-nest-asyncio:1.6.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nest-asyncio2@1.7.2?package-id=9eee00a12e497433", + "cpe": "cpe:2.3:a:ewald_r__de_wit_project:python-nest-asyncio2:1.7.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114253,10 +117000,10 @@ } } ], - "name": "nest-asyncio", - "purl": "pkg:pypi/nest-asyncio@1.6.0", + "name": "nest-asyncio2", + "purl": "pkg:pypi/nest-asyncio2@1.7.2", "type": "library", - "version": "1.6.0" + "version": "1.7.2" }, { "bom-ref": "pkg:deb/ubuntu/netbase@6.4?arch=all&distro=ubuntu-24.04&package-id=dad21fec6e066474", @@ -114285,7 +117032,7 @@ }, { "author": "Jean-Christophe Fillion-Robin , Henry Schreiner ", - "bom-ref": "pkg:pypi/ninja@1.13.0?package-id=215ed55bcfab1fc7", + "bom-ref": "pkg:pypi/ninja@1.13.0?package-id=b0166ec34fe8f30c", "cpe": "cpe:2.3:a:jean_christophe_fillion_robin_\\", - "bom-ref": "pkg:pypi/notebook@7.5.6?package-id=d626a99c08a53aac", - "cpe": "cpe:2.3:a:jupyter_development_team_\\", @@ -114334,22 +117081,22 @@ "version": "0.2.4" }, { - "bom-ref": "pkg:deb/ubuntu/nsight-compute-2026.1.1@2026.1.1.2-1?arch=amd64&distro=ubuntu-24.04&package-id=6cdeff3df12d7158&upstream=nsight-compute", - "cpe": "cpe:2.3:a:nsight-compute-2026.1.1:nsight-compute-2026.1.1:2026.1.1.2-1:*:*:*:*:*:*:*", - "name": "nsight-compute-2026.1.1", + "bom-ref": "pkg:deb/ubuntu/nsight-compute-2026.3.0@2026.3.0.13-1?arch=amd64&distro=ubuntu-24.04&package-id=913dbe56c86e017e&upstream=nsight-compute", + "cpe": "cpe:2.3:a:nsight-compute-2026.3.0:nsight-compute-2026.3.0:2026.3.0.13-1:*:*:*:*:*:*:*", + "name": "nsight-compute-2026.3.0", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/nsight-compute-2026.1.1@2026.1.1.2-1?arch=amd64&distro=ubuntu-24.04&upstream=nsight-compute", + "purl": "pkg:deb/ubuntu/nsight-compute-2026.3.0@2026.3.0.13-1?arch=amd64&distro=ubuntu-24.04&upstream=nsight-compute", "type": "library", - "version": "2026.1.1.2-1" + "version": "2026.3.0.13-1" }, { - "bom-ref": "pkg:deb/ubuntu/nsight-systems-cli-2026.2.1@2026.2.1.210-262137639646v0?arch=amd64&distro=ubuntu-24.04&package-id=ff2a286c933cac82", - "cpe": "cpe:2.3:a:nsight-systems-cli-2026.2.1:nsight-systems-cli-2026.2.1:2026.2.1.210-262137639646v0:*:*:*:*:*:*:*", - "name": "nsight-systems-cli-2026.2.1", + "bom-ref": "pkg:deb/ubuntu/nsight-systems-cli-2026.5.1@2026.5.1.18-265138582488v0?arch=amd64&distro=ubuntu-24.04&package-id=e94f15ce3da789e2", + "cpe": "cpe:2.3:a:nsight-systems-cli-2026.5.1:nsight-systems-cli-2026.5.1:2026.5.1.18-265138582488v0:*:*:*:*:*:*:*", + "name": "nsight-systems-cli-2026.5.1", "publisher": "Feedback ", - "purl": "pkg:deb/ubuntu/nsight-systems-cli-2026.2.1@2026.2.1.210-262137639646v0?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/nsight-systems-cli-2026.5.1@2026.5.1.18-265138582488v0?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "2026.2.1.210-262137639646v0" + "version": "2026.5.1.18-265138582488v0" }, { "bom-ref": "pkg:deb/ubuntu/numactl@2.0.18-1ubuntu0.24.04.1?arch=amd64&distro=ubuntu-24.04&package-id=95482f528c6d991a", @@ -114407,38 +117154,6 @@ "type": "library", "version": "2.3.5" }, - { - "author": "HWInf-MLWFO ", - "bom-ref": "pkg:pypi/nv-one-logger-core@2.3.1?package-id=41dd7ae418914fce", - "cpe": "cpe:2.3:a:hwinf_mlwfo_e2e_dev_project:python-nv-one-logger-core:2.3.1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "Apache-2.0" - } - } - ], - "name": "nv-one-logger-core", - "purl": "pkg:pypi/nv-one-logger-core@2.3.1", - "type": "library", - "version": "2.3.1" - }, - { - "author": "HWInf-MLWFO ", - "bom-ref": "pkg:pypi/nv-one-logger-training-telemetry@2.3.1?package-id=3a3dee78f0f87ca4", - "cpe": "cpe:2.3:a:python-nv-one-logger-training-telemetry:python-nv-one-logger-training-telemetry:2.3.1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "Apache-2.0" - } - } - ], - "name": "nv-one-logger-training-telemetry", - "purl": "pkg:pypi/nv-one-logger-training-telemetry@2.3.1", - "type": "library", - "version": "2.3.1" - }, { "author": "NVIDIA Corporation", "bom-ref": "pkg:pypi/nvdlfw-inspect@0.2.2?package-id=2babffd085db5c29", @@ -114455,42 +117170,6 @@ "type": "library", "version": "0.2.2" }, - { - "bom-ref": "pkg:pypi/nvfuser@0.2.36%2Bgit29f5740?package-id=e40f933f0f17af5b", - "cpe": "cpe:2.3:a:python-nvfuser:python-nvfuser:0.2.36\\+git29f5740:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "BSD-3-Clause" - } - } - ], - "name": "nvfuser", - "purl": "pkg:pypi/nvfuser@0.2.36%2Bgit29f5740", - "type": "library", - "version": "0.2.36+git29f5740" - }, - { - "bom-ref": "pkg:pypi/nvfuser@0.2.36%2Bgit29f5740?package-id=f339a77e41c98c67", - "cpe": "cpe:2.3:a:python-nvfuser:python-nvfuser:0.2.36\\+git29f5740:*:*:*:*:*:*:*", - "externalReferences": [ - { - "type": "vcs", - "url": "file:///opt/pytorch/fuser/python" - } - ], - "licenses": [ - { - "license": { - "id": "BSD-3-Clause" - } - } - ], - "name": "nvfuser", - "purl": "pkg:pypi/nvfuser@0.2.36%2Bgit29f5740", - "type": "library", - "version": "0.2.36+git29f5740" - }, { "author": "Nvidia CUDA Installer Team ", "bom-ref": "pkg:pypi/nvidia-cuda-nvdisasm@13.3.73?package-id=d2b2766752250863", @@ -114507,17 +117186,17 @@ }, { "author": "Nvidia CUDA Installer Team ", - "bom-ref": "pkg:pypi/nvidia-cuda-nvrtc@13.3.33?package-id=f4a4a3daaf8cef0e", - "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-cuda-nvrtc:13.3.33:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cuda-nvrtc@13.4.59?package-id=a6e0cdc15bba1b4b", + "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-cuda-nvrtc:13.4.59:*:*:*:*:*:*:*", "licenses": [ { "expression": "LicenseRef-NVIDIA-Proprietary" } ], "name": "nvidia-cuda-nvrtc", - "purl": "pkg:pypi/nvidia-cuda-nvrtc@13.3.33", + "purl": "pkg:pypi/nvidia-cuda-nvrtc@13.4.59", "type": "library", - "version": "13.3.33" + "version": "13.4.59" }, { "author": "Nvidia CUDA Installer Team ", @@ -114548,53 +117227,53 @@ }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-cutlass-dsl@4.6.1?package-id=a8027c3d307d7758", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-cutlass-dsl:4.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cutlass-dsl@4.8.0.dev0?package-id=4802cad47cab5cd1", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-cutlass-dsl:4.8.0.dev0:*:*:*:*:*:*:*", "name": "nvidia-cutlass-dsl", - "purl": "pkg:pypi/nvidia-cutlass-dsl@4.6.1", + "purl": "pkg:pypi/nvidia-cutlass-dsl@4.8.0.dev0", "type": "library", - "version": "4.6.1" + "version": "4.8.0.dev0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-base@4.6.1?package-id=d41aa0cb4ddfc148", - "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-base:python-nvidia-cutlass-dsl-libs-base:4.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-base@4.8.0.dev0?package-id=7609bdfe14d011ff", + "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-base:python-nvidia-cutlass-dsl-libs-base:4.8.0.dev0:*:*:*:*:*:*:*", "name": "nvidia-cutlass-dsl-libs-base", - "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-base@4.6.1", + "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-base@4.8.0.dev0", "type": "library", - "version": "4.6.1" + "version": "4.8.0.dev0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-core@4.6.1?package-id=4feb5e74091ae881", - "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-core:python-nvidia-cutlass-dsl-libs-core:4.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-core@4.8.0.dev0?package-id=9ee67ede663ec83a", + "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-core:python-nvidia-cutlass-dsl-libs-core:4.8.0.dev0:*:*:*:*:*:*:*", "name": "nvidia-cutlass-dsl-libs-core", - "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-core@4.6.1", + "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-core@4.8.0.dev0", "type": "library", - "version": "4.6.1" + "version": "4.8.0.dev0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-cu12@4.6.1?package-id=59284d73024d8860", - "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-cu12:python-nvidia-cutlass-dsl-libs-cu12:4.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-cu12@4.8.0.dev0?package-id=3e3cddad65bf10d8", + "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-cu12:python-nvidia-cutlass-dsl-libs-cu12:4.8.0.dev0:*:*:*:*:*:*:*", "name": "nvidia-cutlass-dsl-libs-cu12", - "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-cu12@4.6.1", + "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-cu12@4.8.0.dev0", "type": "library", - "version": "4.6.1" + "version": "4.8.0.dev0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-cu13@4.6.1?package-id=c25facd4e7423388", - "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-cu13:python-nvidia-cutlass-dsl-libs-cu13:4.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-cu13@4.8.0.dev0?package-id=ae8a8f32065486bb", + "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-cu13:python-nvidia-cutlass-dsl-libs-cu13:4.8.0.dev0:*:*:*:*:*:*:*", "name": "nvidia-cutlass-dsl-libs-cu13", - "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-cu13@4.6.1", + "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-cu13@4.8.0.dev0", "type": "library", - "version": "4.6.1" + "version": "4.8.0.dev0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-dali-cuda130@2.1.0?package-id=5d822a43c7a0374a", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-dali-cuda130:2.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-dali-cuda130@2.2.0?package-id=206560d6b851dd13", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-dali-cuda130:2.2.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114603,14 +117282,14 @@ } ], "name": "nvidia-dali-cuda130", - "purl": "pkg:pypi/nvidia-dali-cuda130@2.1.0", + "purl": "pkg:pypi/nvidia-dali-cuda130@2.2.0", "type": "library", - "version": "2.1.0" + "version": "2.2.0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-libnvcomp-cu13@5.1.0.21?package-id=7868b680e41fe96e", - "cpe": "cpe:2.3:a:python-nvidia-libnvcomp-cu13:python-nvidia-libnvcomp-cu13:5.1.0.21:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-libnvcomp-cu13@5.2.0.13?package-id=62d49e8b5a373d89", + "cpe": "cpe:2.3:a:python-nvidia-libnvcomp-cu13:python-nvidia-libnvcomp-cu13:5.2.0.13:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114619,13 +117298,13 @@ } ], "name": "nvidia-libnvcomp-cu13", - "purl": "pkg:pypi/nvidia-libnvcomp-cu13@5.1.0.21", + "purl": "pkg:pypi/nvidia-libnvcomp-cu13@5.2.0.13", "type": "library", - "version": "5.1.0.21" + "version": "5.2.0.13" }, { "author": "NVIDIA CUDA Installer Team ", - "bom-ref": "pkg:pypi/nvidia-matmul-heuristics@0.1.0.27?package-id=446f74d349e3e110", + "bom-ref": "pkg:pypi/nvidia-matmul-heuristics@0.1.0.27?package-id=8e7f93fa57e4b844", "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_\\", - "bom-ref": "pkg:pypi/nvidia-ml-py@13.595.45?package-id=cc952d5907ba83a1", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-ml-py:13.595.45:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-ml-py@13.610.43?package-id=c6961d5b9f5bd882", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-ml-py:13.610.43:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114649,18 +117328,18 @@ } ], "name": "nvidia-ml-py", - "purl": "pkg:pypi/nvidia-ml-py@13.595.45", + "purl": "pkg:pypi/nvidia-ml-py@13.610.43", "type": "library", - "version": "13.595.45" + "version": "13.610.43" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-modelopt@0.43.0?package-id=f0987bb859eb2342", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-modelopt:0.43.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-modelopt@0.45.0?package-id=8ba602a8c68a5a23", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-modelopt:0.45.0:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/modelopt/nvidia_modelopt-0.43.0-py3-none-any.whl" + "url": "file:///tmp/modelopt/nvidia_modelopt-0.45.0-py3-none-any.whl" } ], "licenses": [ @@ -114671,28 +117350,28 @@ } ], "name": "nvidia-modelopt", - "purl": "pkg:pypi/nvidia-modelopt@0.43.0", + "purl": "pkg:pypi/nvidia-modelopt@0.45.0", "type": "library", - "version": "0.43.0" + "version": "0.45.0" }, { "author": "Nvidia CUDA Installer Team ", - "bom-ref": "pkg:pypi/nvidia-nccl-cu13@2.30.4?package-id=b8ac015469e02493", - "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-nccl-cu13:2.30.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-nccl-cu13@2.30.7?package-id=1dbc9295466c0f5f", + "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-nccl-cu13:2.30.7:*:*:*:*:*:*:*", "licenses": [ { "expression": "LicenseRef-NVIDIA-Proprietary" } ], "name": "nvidia-nccl-cu13", - "purl": "pkg:pypi/nvidia-nccl-cu13@2.30.4", + "purl": "pkg:pypi/nvidia-nccl-cu13@2.30.7", "type": "library", - "version": "2.30.4" + "version": "2.30.7" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-nvimgcodec-cu13@0.7.0.49?package-id=20fc5f76312edfae", - "cpe": "cpe:2.3:a:python-nvidia-nvimgcodec-cu13:python-nvidia-nvimgcodec-cu13:0.7.0.49:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-nvimgcodec-cu13@0.8.0.1422?package-id=337ae939e0874b32", + "cpe": "cpe:2.3:a:python-nvidia-nvimgcodec-cu13:python-nvidia-nvimgcodec-cu13:0.8.0.1422:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114701,28 +117380,28 @@ } ], "name": "nvidia-nvimgcodec-cu13", - "purl": "pkg:pypi/nvidia-nvimgcodec-cu13@0.7.0.49", + "purl": "pkg:pypi/nvidia-nvimgcodec-cu13@0.8.0.1422", "type": "library", - "version": "0.7.0.49" + "version": "0.8.0.1422" }, { "author": "Nvidia CUDA Installer Team ", - "bom-ref": "pkg:pypi/nvidia-nvjpeg@13.1.0.48?package-id=2a4907636abcdb47", - "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-nvjpeg:13.1.0.48:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-nvjpeg@13.2.1.68?package-id=fc591769f09da310", + "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-nvjpeg:13.2.1.68:*:*:*:*:*:*:*", "licenses": [ { "expression": "LicenseRef-NVIDIA-Proprietary" } ], "name": "nvidia-nvjpeg", - "purl": "pkg:pypi/nvidia-nvjpeg@13.1.0.48", + "purl": "pkg:pypi/nvidia-nvjpeg@13.2.1.68", "type": "library", - "version": "13.1.0.48" + "version": "13.2.1.68" }, { "author": "NVIDIA Corporation ", - "bom-ref": "pkg:pypi/nvidia-nvjpeg2k-cu13@0.10.0.49?package-id=c228e8bca895f24a", - "cpe": "cpe:2.3:a:python-nvidia-nvjpeg2k-cu13:python-nvidia-nvjpeg2k-cu13:0.10.0.49:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-nvjpeg2k-cu13@0.11.0.51?package-id=01cf7bdb78e79a75", + "cpe": "cpe:2.3:a:python-nvidia-nvjpeg2k-cu13:python-nvidia-nvjpeg2k-cu13:0.11.0.51:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114731,14 +117410,14 @@ } ], "name": "nvidia-nvjpeg2k-cu13", - "purl": "pkg:pypi/nvidia-nvjpeg2k-cu13@0.10.0.49", + "purl": "pkg:pypi/nvidia-nvjpeg2k-cu13@0.11.0.51", "type": "library", - "version": "0.10.0.49" + "version": "0.11.0.51" }, { "author": "NVIDIA Corporation ", - "bom-ref": "pkg:pypi/nvidia-nvtiff-cu13@0.7.0.79?package-id=11e99e6ad691ce40", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-nvtiff-cu13:0.7.0.79:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-nvtiff-cu13@0.8.0.82?package-id=53e76d128513a0e0", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-nvtiff-cu13:0.8.0.82:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114747,18 +117426,18 @@ } ], "name": "nvidia-nvtiff-cu13", - "purl": "pkg:pypi/nvidia-nvtiff-cu13@0.7.0.79", + "purl": "pkg:pypi/nvidia-nvtiff-cu13@0.8.0.82", "type": "library", - "version": "0.7.0.79" + "version": "0.8.0.82" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-resiliency-ext@0.5.0?package-id=877dd66f2bc6190e", - "cpe": "cpe:2.3:a:python-nvidia-resiliency-ext:python-nvidia-resiliency-ext:0.5.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-resiliency-ext@0.6.0?package-id=b9c3eee14f8c2f66", + "cpe": "cpe:2.3:a:python-nvidia-resiliency-ext:python-nvidia-resiliency-ext:0.6.0:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/nvrx/nvidia_resiliency_ext-0.5.0-cp312-cp312-manylinux_2_39_x86_64.whl" + "url": "file:///tmp/nvrx/nvidia_resiliency_ext-0.6.0-cp312-cp312-manylinux_2_39_x86_64.whl" } ], "licenses": [ @@ -114769,12 +117448,12 @@ } ], "name": "nvidia-resiliency-ext", - "purl": "pkg:pypi/nvidia-resiliency-ext@0.5.0", + "purl": "pkg:pypi/nvidia-resiliency-ext@0.6.0", "type": "library", - "version": "0.5.0" + "version": "0.6.0" }, { - "bom-ref": "pkg:golang/nvidia.com/nvtx?package-id=e955e6fff23bb8b1", + "bom-ref": "pkg:golang/nvidia.com/nvtx?package-id=af01997d979bc39f", "name": "nvidia.com/nvtx", "purl": "pkg:golang/nvidia.com/nvtx", "type": "library", @@ -114782,33 +117461,26 @@ }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvtx@0.2.15?package-id=52efffeb08435764", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvtx:0.2.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvtx@0.2.16?package-id=eacc0ed1ee568000", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvtx:0.2.16:*:*:*:*:*:*:*", "licenses": [ { "expression": "Apache-2.0 WITH LLVM-exception" } ], "name": "nvtx", - "purl": "pkg:pypi/nvtx@0.2.15", + "purl": "pkg:pypi/nvtx@0.2.16", "type": "library", - "version": "0.2.15" + "version": "0.2.16" }, { "author": "Omry Yadan ", - "bom-ref": "pkg:pypi/omegaconf@2.3.0?package-id=853b3faec43b7911", - "cpe": "cpe:2.3:a:omry_yadan_project:python-omegaconf:2.3.0:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "BSD-3-Clause" - } - } - ], + "bom-ref": "pkg:pypi/omegaconf@2.3.1?package-id=dc413170f1c1b7ed", + "cpe": "cpe:2.3:a:omry_yadan_project:python-omegaconf:2.3.1:*:*:*:*:*:*:*", "name": "omegaconf", - "purl": "pkg:pypi/omegaconf@2.3.0", + "purl": "pkg:pypi/omegaconf@2.3.1", "type": "library", - "version": "2.3.0" + "version": "2.3.1" }, { "author": "ONNX Contributors ", @@ -114850,8 +117522,8 @@ }, { "author": "ONNX Contributors ", - "bom-ref": "pkg:pypi/onnx-ir@0.2.1?package-id=5412fa67ce25fc43", - "cpe": "cpe:2.3:a:onnx_contributors_\\", - "bom-ref": "pkg:pypi/onnxscript@0.7.0?package-id=828725e22e736b4e", - "cpe": "cpe:2.3:a:microsoft_corporation_\\", - "bom-ref": "pkg:pypi/openai@3.5.0?package-id=123dd9b7fc7304de", - "cpe": "cpe:2.3:a:openai_\\", - "purl": "pkg:deb/ubuntu/openssh-client@1%3A9.6p1-3ubuntu13.16?arch=amd64&distro=ubuntu-24.04&upstream=openssh", + "purl": "pkg:deb/ubuntu/openssh-client@1%3A9.6p1-3ubuntu13.18?arch=amd64&distro=ubuntu-24.04&upstream=openssh", "type": "library", - "version": "1:9.6p1-3ubuntu13.16" + "version": "1:9.6p1-3ubuntu13.18" }, { "bom-ref": "pkg:deb/ubuntu/openssl@3.0.13-0ubuntu3.15?arch=amd64&distro=ubuntu-24.04&package-id=fb06d32019ac5823", @@ -114922,6 +117594,22 @@ "type": "library", "version": "3.0.13-0ubuntu3.15" }, + { + "author": "OpenTelemetry Authors ", + "bom-ref": "pkg:pypi/opentelemetry-api@1.44.0?package-id=ec159c142d16207a", + "cpe": "cpe:2.3:a:opentelemetry_authors_\\", "bom-ref": "pkg:pypi/optimum@2.3.0?package-id=8e4e881922fc845f", @@ -114940,8 +117628,8 @@ }, { "author": "OpTree Contributors", - "bom-ref": "pkg:pypi/optree@0.19.1?package-id=4fcaeba701a1b84c", - "cpe": "cpe:2.3:a:optree_contributors_project:python-optree:0.19.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/optree@0.20.0?package-id=89e28ef15c19be6f", + "cpe": "cpe:2.3:a:optree_contributors_project:python-optree:0.20.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114950,9 +117638,9 @@ } ], "name": "optree", - "purl": "pkg:pypi/optree@0.19.1", + "purl": "pkg:pypi/optree@0.20.0", "type": "library", - "version": "0.19.1" + "version": "0.20.0" }, { "author": "Elia Robyn Lake ", @@ -114963,22 +117651,6 @@ "type": "library", "version": "4.1.0" }, - { - "author": "Mikko Korpela ", - "bom-ref": "pkg:pypi/overrides@7.7.0?package-id=f008b8485881cb95", - "cpe": "cpe:2.3:a:mikko_korpela_project:python-overrides:7.7.0:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "Apache License, Version 2.0" - } - } - ], - "name": "overrides", - "purl": "pkg:pypi/overrides@7.7.0", - "type": "library", - "version": "7.7.0" - }, { "author": "Donald Stufft ", "bom-ref": "pkg:pypi/packaging@24.2?package-id=6d70b0d97af377c0", @@ -115021,22 +117693,22 @@ }, { "author": "Donald Stufft ", - "bom-ref": "pkg:pypi/packaging@26.0?package-id=dcb39503f4f836f4", - "cpe": "cpe:2.3:a:donald_stufft_\\", - "bom-ref": "pkg:pypi/pandas@3.0.2?package-id=429b8211eb1e7717", - "cpe": "cpe:2.3:a:pandas_development_team_\\", @@ -115184,31 +117856,31 @@ "version": "0.18.1" }, { - "bom-ref": "pkg:deb/ubuntu/perl@5.38.2-3.2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=489671e89783d98e", - "cpe": "cpe:2.3:a:perl:perl:5.38.2-3.2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/perl@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04&package-id=7dbe904afbd18e2d", + "cpe": "cpe:2.3:a:perl:perl:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", "name": "perl", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/perl@5.38.2-3.2ubuntu0.2?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/perl@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "5.38.2-3.2ubuntu0.2" + "version": "5.38.2-3.2ubuntu0.3" }, { - "bom-ref": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=78e886c09a4ce373&upstream=perl", - "cpe": "cpe:2.3:a:perl-base:perl-base:5.38.2-3.2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04&package-id=e2a8d1c965291834&upstream=perl", + "cpe": "cpe:2.3:a:perl-base:perl-base:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", "name": "perl-base", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.2?arch=amd64&distro=ubuntu-24.04&upstream=perl", + "purl": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.3?arch=amd64&distro=ubuntu-24.04&upstream=perl", "type": "library", - "version": "5.38.2-3.2ubuntu0.2" + "version": "5.38.2-3.2ubuntu0.3" }, { - "bom-ref": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.2?arch=all&distro=ubuntu-24.04&package-id=ca48c757360eecf9&upstream=perl", - "cpe": "cpe:2.3:a:perl-modules-5.38:perl-modules-5.38:5.38.2-3.2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.3?arch=all&distro=ubuntu-24.04&package-id=7e8abd47f7d63b24&upstream=perl", + "cpe": "cpe:2.3:a:perl-modules-5.38:perl-modules-5.38:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", "name": "perl-modules-5.38", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.2?arch=all&distro=ubuntu-24.04&upstream=perl", + "purl": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.3?arch=all&distro=ubuntu-24.04&upstream=perl", "type": "library", - "version": "5.38.2-3.2ubuntu0.2" + "version": "5.38.2-3.2ubuntu0.3" }, { "author": "Noah Spurrier; Thomas Kluyver; Jeff Quast ", @@ -115278,8 +117950,8 @@ }, { "author": "The pip developers ", - "bom-ref": "pkg:pypi/pip@25.0.1?package-id=a21d91e52e67ef6c", - "cpe": "cpe:2.3:a:pip_developers_\\", - "bom-ref": "pkg:pypi/pip@26.1.1?package-id=292c81179f56bdec", - "cpe": "cpe:2.3:a:pip_developers_\\", @@ -115398,8 +118070,8 @@ }, { "author": "NVIDIA ", - "bom-ref": "pkg:pypi/polygraphy@0.49.26?package-id=212e09abaa962a00", - "cpe": "cpe:2.3:a:svc_tensorrt_project:python-polygraphy:0.49.26:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/polygraphy@0.53.4?package-id=91d8cac82fc8cddc", + "cpe": "cpe:2.3:a:nvidia_\\", @@ -115439,22 +118111,22 @@ }, { "author": "The Prometheus Authors ", - "bom-ref": "pkg:pypi/prometheus-client@0.25.0?package-id=558d2337d58e2a82", - "cpe": "cpe:2.3:a:prometheus_authors_\\", - "bom-ref": "pkg:pypi/prometheus-fastapi-instrumentator@7.1.0?package-id=b6de9c502af23d32", - "cpe": "cpe:2.3:a:python-prometheus-fastapi-instrumentator:python-prometheus-fastapi-instrumentator:7.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/prometheus-fastapi-instrumentator@8.1.0?package-id=91b020ea2966f73f", + "cpe": "cpe:2.3:a:python-prometheus-fastapi-instrumentator:python-prometheus-fastapi-instrumentator:8.1.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -115463,23 +118135,23 @@ } ], "name": "prometheus-fastapi-instrumentator", - "purl": "pkg:pypi/prometheus-fastapi-instrumentator@7.1.0", + "purl": "pkg:pypi/prometheus-fastapi-instrumentator@8.1.0", "type": "library", - "version": "7.1.0" + "version": "8.1.0" }, { "author": "Jonathan Slenders", - "bom-ref": "pkg:pypi/prompt-toolkit@3.0.52?package-id=8de9f9bf2d06aa7c", - "cpe": "cpe:2.3:a:jonathan_slenders_project:python-prompt-toolkit:3.0.52:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/prompt-toolkit@3.0.53?package-id=9309aacff6d74f23", + "cpe": "cpe:2.3:a:jonathan_slenders_project:python-prompt-toolkit:3.0.53:*:*:*:*:*:*:*", "name": "prompt-toolkit", - "purl": "pkg:pypi/prompt-toolkit@3.0.52", + "purl": "pkg:pypi/prompt-toolkit@3.0.53", "type": "library", - "version": "3.0.52" + "version": "3.0.53" }, { "author": "Andrew Svetlov ", - "bom-ref": "pkg:pypi/propcache@0.4.1?package-id=a9819d562af125bd", - "cpe": "cpe:2.3:a:andrew_svetlov_project:python-propcache:0.4.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/propcache@0.5.2?package-id=4373e6a6a0843d45", + "cpe": "cpe:2.3:a:andrew_svetlov_project:python-propcache:0.5.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -115488,9 +118160,9 @@ } ], "name": "propcache", - "purl": "pkg:pypi/propcache@0.4.1", + "purl": "pkg:pypi/propcache@0.5.2", "type": "library", - "version": "0.4.1" + "version": "0.5.2" }, { "author": "Google LLC ", @@ -115567,8 +118239,8 @@ }, { "author": "J.S. Roy <\"S.A. Mitchell\" , Franco Peschiera >", - "bom-ref": "pkg:pypi/pulp@3.3.1?package-id=888f505771d946f7", - "cpe": "cpe:2.3:a:\\\"s_a__mitchell\\\"_\\", @@ -115598,8 +118270,8 @@ "version": "0.2.3" }, { - "bom-ref": "pkg:pypi/pyarrow@24.0.0?package-id=443d5ad419202e3c", - "cpe": "cpe:2.3:a:python-pyarrow:python-pyarrow:24.0.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pyarrow@25.0.1?package-id=7ad12c73fbba1dab", + "cpe": "cpe:2.3:a:python-pyarrow:python-pyarrow:25.0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -115608,9 +118280,9 @@ } ], "name": "pyarrow", - "purl": "pkg:pypi/pyarrow@24.0.0", + "purl": "pkg:pypi/pyarrow@25.0.1", "type": "library", - "version": "24.0.0" + "version": "25.0.1" }, { "author": "Ilya Etingof ", @@ -115646,8 +118318,8 @@ }, { "author": "Wenzel Jakob ", - "bom-ref": "pkg:pypi/pybind11@3.0.4?package-id=933875988bb897ed", - "cpe": "cpe:2.3:a:wenzel_jakob_\\", - "bom-ref": "pkg:pypi/pybind11-global@3.0.4?package-id=29f8c9fb742ff8e1", - "cpe": "cpe:2.3:a:wenzel_jakob_\\", - "bom-ref": "pkg:pypi/pyjwt@2.13.0?package-id=f46a7e7ef7efbc16", - "cpe": "cpe:2.3:a:jose_padilla_\\", - "bom-ref": "pkg:pypi/python-hostlist@2.3.0?package-id=ffd418556781df64", + "bom-ref": "pkg:pypi/python-hostlist@2.3.0?package-id=78c4442f2c037893", "cpe": "cpe:2.3:a:python-hostlist:python-hostlist:2.3.0:*:*:*:*:*:*:*", "licenses": [ { @@ -115942,8 +118598,8 @@ }, { "author": "Zakaria Zajac , Nicholas Hairs ", - "bom-ref": "pkg:pypi/python-json-logger@4.1.0?package-id=b65c8ec03aa44074", - "cpe": "cpe:2.3:a:nhairs:python_json_logger:4.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/python-json-logger@4.2.0?package-id=f7cc0545ed442abb", + "cpe": "cpe:2.3:a:nhairs:python_json_logger:4.2.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -115952,9 +118608,9 @@ } ], "name": "python-json-logger", - "purl": "pkg:pypi/python-json-logger@4.1.0", + "purl": "pkg:pypi/python-json-logger@4.2.0", "type": "library", - "version": "4.1.0" + "version": "4.2.0" }, { "author": "Andrew Dunham ", @@ -116072,40 +118728,40 @@ "version": "6.0.1-2build2" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&package-id=f180ea00bf87f242", - "cpe": "cpe:2.3:a:python3.12:python3.12:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=6cf23f1bdf23eab0", + "cpe": "cpe:2.3:a:python3.12:python3.12:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "python3.12", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&package-id=320c7390a8c0ec2b&upstream=python3.12", - "cpe": "cpe:2.3:a:python3.12-dev:python3.12-dev:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=46f3d62d54c4b8f9&upstream=python3.12", + "cpe": "cpe:2.3:a:python3.12-dev:python3.12-dev:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "python3.12-dev", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&package-id=078d70dc8c4d6c05&upstream=python3.12", - "cpe": "cpe:2.3:a:python3.12-minimal:python3.12-minimal:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=1a3b4e6fc89fca7d&upstream=python3.12", + "cpe": "cpe:2.3:a:python3.12-minimal:python3.12-minimal:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "python3.12-minimal", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12-venv@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&package-id=463be5a6c3798acb&upstream=python3.12", - "cpe": "cpe:2.3:a:python3.12-venv:python3.12-venv:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12-venv@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&package-id=7f70be91af9ad2ae&upstream=python3.12", + "cpe": "cpe:2.3:a:python3.12-venv:python3.12-venv:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "python3.12-venv", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12-venv@3.12.3-1ubuntu0.13?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/python3.12-venv@3.12.3-1ubuntu0.15?arch=amd64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { "author": "Tushar Sadhwani ", @@ -116141,8 +118797,8 @@ }, { "author": "Brian E. Granger, Min Ragan-Kelley >", - "bom-ref": "pkg:pypi/pyzmq@27.1.0?package-id=5f0d880eaa3e6f5a", - "cpe": "cpe:2.3:a:brian_e__granger\\,_min_ragan_kelley_project:python-pyzmq:27.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pyzmq@27.2.0?package-id=6746e3094c0f8d19", + "cpe": "cpe:2.3:a:brian_e__granger\\,_min_ragan_kelley_project:python-pyzmq:27.2.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -116151,17 +118807,17 @@ } ], "name": "pyzmq", - "purl": "pkg:pypi/pyzmq@27.1.0", + "purl": "pkg:pypi/pyzmq@27.2.0", "type": "library", - "version": "27.1.0" + "version": "27.2.0" }, { - "bom-ref": "pkg:pypi/quack-kernels@0.6.2?package-id=008f5b4537afa9c5", - "cpe": "cpe:2.3:a:python-quack-kernels:python-quack-kernels:0.6.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/quack-kernels@0.5.0?package-id=a3f9280a3f883daf", + "cpe": "cpe:2.3:a:python-quack-kernels:python-quack-kernels:0.5.0:*:*:*:*:*:*:*", "name": "quack-kernels", - "purl": "pkg:pypi/quack-kernels@0.6.2", + "purl": "pkg:pypi/quack-kernels@0.5.0", "type": "library", - "version": "0.6.2" + "version": "0.5.0" }, { "bom-ref": "pkg:deb/ubuntu/rapidjson-dev@1.1.0%2Bdfsg2-7.2?arch=all&distro=ubuntu-24.04&package-id=06fe6476d662d68c&upstream=rapidjson", @@ -116199,22 +118855,22 @@ }, { "author": "Matthew Barnett ", - "bom-ref": "pkg:pypi/regex@2026.4.4?package-id=77b1c14c918dcc53", - "cpe": "cpe:2.3:a:matthew_barnett_\\", - "bom-ref": "pkg:pypi/requests@2.33.1?package-id=8878ae48a4855e3a", - "cpe": "cpe:2.3:a:python:requests:2.33.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/requests@2.34.2?package-id=0b86c117b27b93c3", + "cpe": "cpe:2.3:a:python:requests:2.34.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -116223,9 +118879,9 @@ } ], "name": "requests", - "purl": "pkg:pypi/requests@2.33.1", + "purl": "pkg:pypi/requests@2.34.2", "type": "library", - "version": "2.33.1" + "version": "2.34.2" }, { "author": "Nicolas Aimetti ", @@ -116302,8 +118958,8 @@ }, { "author": "Julian Berman ", - "bom-ref": "pkg:pypi/rpds-py@0.30.0?package-id=f2aac70691b5ffb1", - "cpe": "cpe:2.3:a:julian_berman_\\", - "purl": "pkg:deb/ubuntu/sed@4.9-2build1?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/sed@4.9-2ubuntu0.24.04.1?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "4.9-2build1" + "version": "4.9-2ubuntu0.24.04.1" }, { "author": "Andrew Senetar ", @@ -116486,8 +119142,8 @@ }, { "author": "Sentry Team and Contributors ", - "bom-ref": "pkg:pypi/sentry-sdk@2.59.0?package-id=52934f20dd9c51c1", - "cpe": "cpe:2.3:a:sentry:sentry_software_development_kit:2.59.0:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/sentry-sdk@2.68.0?package-id=94d00ed93e710aab", + "cpe": "cpe:2.3:a:sentry:sentry_software_development_kit:2.68.0:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -116496,9 +119152,9 @@ } ], "name": "sentry-sdk", - "purl": "pkg:pypi/sentry-sdk@2.59.0", + "purl": "pkg:pypi/sentry-sdk@2.68.0", "type": "library", - "version": "2.59.0" + "version": "2.68.0" }, { "author": "Python Packaging Authority ", @@ -116534,15 +119190,6 @@ "type": "library", "version": "81.0.0" }, - { - "bom-ref": "pkg:deb/ubuntu/sgml-base@1.31?arch=all&distro=ubuntu-24.04&package-id=f3e6346c744c147b", - "cpe": "cpe:2.3:a:sgml-base:sgml-base:1.31:*:*:*:*:*:*:*", - "name": "sgml-base", - "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/sgml-base@1.31?arch=all&distro=ubuntu-24.04", - "type": "library", - "version": "1.31" - }, { "author": "Tzu-ping Chung ", "bom-ref": "pkg:pypi/shellingham@1.5.4?package-id=433ab30b88c4d234", @@ -116630,7 +119277,7 @@ }, { "author": "Isaac Muse ", - "bom-ref": "pkg:pypi/soupsieve@2.9.2?package-id=e12af112686aec14", + "bom-ref": "pkg:pypi/soupsieve@2.9.2?package-id=19461364bf058352", "cpe": "cpe:2.3:a:isaac_muse_\\", - "bom-ref": "pkg:pypi/sse-starlette@3.4.8?package-id=ee46cd8229565415", - "cpe": "cpe:2.3:a:python-sse-starlette:python-sse-starlette:3.4.8:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/sse-starlette@3.4.11?package-id=46cfa6e56513caa1", + "cpe": "cpe:2.3:a:python-sse-starlette:python-sse-starlette:3.4.11:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -116681,9 +119344,9 @@ } ], "name": "sse-starlette", - "purl": "pkg:pypi/sse-starlette@3.4.8", + "purl": "pkg:pypi/sse-starlette@3.4.11", "type": "library", - "version": "3.4.8" + "version": "3.4.11" }, { "author": "Alex Hall ", @@ -116703,8 +119366,8 @@ }, { "author": "Tom Christie ", - "bom-ref": "pkg:pypi/starlette@0.50.0?package-id=7052f6c0b32c448e", - "cpe": "cpe:2.3:a:encode:starlette:0.50.0:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/starlette@1.6.0?package-id=a18d6478bf7e19cd", + "cpe": "cpe:2.3:a:encode:starlette:1.6.0:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -116713,9 +119376,9 @@ } ], "name": "starlette", - "purl": "pkg:pypi/starlette@0.50.0", + "purl": "pkg:pypi/starlette@1.6.0", "type": "library", - "version": "0.50.0" + "version": "1.6.0" }, { "bom-ref": "pkg:golang/stdlib@1.22.2?package-id=1e8342544956a9b9", @@ -116733,7 +119396,7 @@ "version": "go1.22.2" }, { - "bom-ref": "pkg:golang/stdlib@1.26.1?package-id=797cdd95c6dc5ab3", + "bom-ref": "pkg:golang/stdlib@1.26.1?package-id=8324b9c7265dd91c", "cpe": "cpe:2.3:a:golang:go:1.26.1:-:*:*:*:*:*:*", "licenses": [ { @@ -116850,13 +119513,13 @@ "version": "0.10.0" }, { - "bom-ref": "pkg:deb/ubuntu/tar@1.35%2Bdfsg-3build1?arch=amd64&distro=ubuntu-24.04&package-id=51924a19fc801039", - "cpe": "cpe:2.3:a:tar:tar:1.35\\+dfsg-3build1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/tar@1.35%2Bdfsg-3ubuntu0.4?arch=amd64&distro=ubuntu-24.04&package-id=4222f48c9c2824fc", + "cpe": "cpe:2.3:a:tar:tar:1.35\\+dfsg-3ubuntu0.4:*:*:*:*:*:*:*", "name": "tar", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/tar@1.35%2Bdfsg-3build1?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/tar@1.35%2Bdfsg-3ubuntu0.4?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "1.35+dfsg-3build1" + "version": "1.35+dfsg-3ubuntu0.4" }, { "author": "Intel Corporation ", @@ -116908,12 +119571,12 @@ }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/tensorrt-llm@1.3.0rc25?package-id=16e41d8a3598acc1", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-tensorrt-llm:1.3.0rc25:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/tensorrt-llm@1.3.0rc27?package-id=1b78c451df623af1", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-tensorrt-llm:1.3.0rc27:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/wheel/tensorrt_llm-1.3.0rc25-cp312-cp312-linux_x86_64.whl" + "url": "file:///tmp/wheel/tensorrt_llm-1.3.0rc27-cp312-cp312-linux_x86_64.whl" } ], "licenses": [ @@ -116924,9 +119587,9 @@ } ], "name": "tensorrt-llm", - "purl": "pkg:pypi/tensorrt-llm@1.3.0rc25", + "purl": "pkg:pypi/tensorrt-llm@1.3.0rc27", "type": "library", - "version": "1.3.0rc25" + "version": "1.3.0rc27" }, { "author": "Jupyter Development Team ", @@ -117002,19 +119665,12 @@ }, { "author": "Simon Sapin ", - "bom-ref": "pkg:pypi/tinycss2@1.4.0?package-id=ebdca3546c39465e", - "cpe": "cpe:2.3:a:simon_sapin_\\, Anthony Moi ", @@ -117025,22 +119681,6 @@ "type": "library", "version": "0.22.2" }, - { - "author": "William Pearson ", - "bom-ref": "pkg:pypi/toml@0.10.2?package-id=d5b0f60c2549071e", - "cpe": "cpe:2.3:a:william_pearson_project:python-toml:0.10.2:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "name": "toml", - "purl": "pkg:pypi/toml@0.10.2", - "type": "library", - "version": "0.10.2" - }, { "author": "Taneli Hukkinen ", "bom-ref": "pkg:pypi/tomli@2.0.1?package-id=d4f7a0f25cfa618f", @@ -117075,25 +119715,23 @@ }, { "author": "PyTorch Team ", - "bom-ref": "pkg:pypi/torch@2.12.0a0%2B5aff3928d8.nv26.5.50603568?package-id=f5174e35babfc94f", - "cpe": "cpe:2.3:a:pytorch_team_\\", - "bom-ref": "pkg:pypi/torch-tensorrt@2.12.0a0?package-id=3bacc93f69a729df", - "cpe": "cpe:2.3:a:nvidia_corporation_\\", @@ -117159,8 +119797,8 @@ }, { "author": "PyTorch Team ", - "bom-ref": "pkg:pypi/torchtitan@0.2.2%2Bgita00ef7df?package-id=c0593e9ba1980fbc", - "cpe": "cpe:2.3:a:pytorch_team_\\", - "bom-ref": "pkg:pypi/torchtitan@0.2.2%2Bgita00ef7df?package-id=e59de3f172c84791", - "cpe": "cpe:2.3:a:pytorch_team_\\", - "bom-ref": "pkg:pypi/torchvision@0.27.0a0%2B6214cb20.nv26.5.50603568?package-id=b27d5b2357204765", - "cpe": "cpe:2.3:a:pytorch_core_team_project:python-torchvision:0.27.0a0\\+6214cb20.nv26.5.50603568:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/torchvision@0.29.0a0%2B0bc41e67.nv26.8.63802676?package-id=7aec63e27b081586", + "cpe": "cpe:2.3:a:pytorch_core_team_project:python-torchvision:0.29.0a0\\+0bc41e67.nv26.8.63802676:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///opt/transfer/torchvision-0.27.0a0%2B6214cb20.nv26.5.50603568-cp312-cp312-manylinux_2_28_x86_64.whl" + "url": "file:///opt/transfer/torchvision-0.29.0a0%2B0bc41e67.nv26.8.63802676-cp312-cp312-manylinux_2_34_x86_64.whl" } ], "licenses": [ @@ -117213,9 +119851,9 @@ } ], "name": "torchvision", - "purl": "pkg:pypi/torchvision@0.27.0a0%2B6214cb20.nv26.5.50603568", + "purl": "pkg:pypi/torchvision@0.29.0a0%2B0bc41e67.nv26.8.63802676", "type": "library", - "version": "0.27.0a0+6214cb20.nv26.5.50603568" + "version": "0.29.0a0+0bc41e67.nv26.8.63802676" }, { "author": "Facebook ", @@ -117234,22 +119872,22 @@ "version": "6.5.8" }, { - "bom-ref": "pkg:pypi/tqdm@4.67.3?package-id=949fbc480f6c2cd9", - "cpe": "cpe:2.3:a:python-tqdm:python-tqdm:4.67.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/tqdm@4.70.0?package-id=498f4650d60d6c04", + "cpe": "cpe:2.3:a:python-tqdm:python-tqdm:4.70.0:*:*:*:*:*:*:*", "licenses": [ { "expression": "MPL-2.0 AND MIT" } ], "name": "tqdm", - "purl": "pkg:pypi/tqdm@4.67.3", + "purl": "pkg:pypi/tqdm@4.70.0", "type": "library", - "version": "4.67.3" + "version": "4.70.0" }, { "author": "IPython Development Team ", - "bom-ref": "pkg:pypi/traitlets@5.15.0?package-id=f6b13b1f0e48b502", - "cpe": "cpe:2.3:a:ipython_development_team_\\", @@ -117294,12 +119932,12 @@ }, { "author": "Philippe Tillet ", - "bom-ref": "pkg:pypi/triton@3.7.0%2Bgitb4e20bb.nv26.5?package-id=e501daf68cc58e0d", - "cpe": "cpe:2.3:a:philippe_tillet_project:python-triton:3.7.0\\+gitb4e20bb.nv26.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/triton@3.8.0%2Bgit4c7e62b7.nv26.8?package-id=5b375453932e1f2d", + "cpe": "cpe:2.3:a:philippe_tillet_project:python-triton:3.8.0\\+git4c7e62b7.nv26.8:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/dist/triton-3.7.0%2Bgitb4e20bb.nv26.5-cp312-cp312-linux_x86_64.whl" + "url": "file:///tmp/dist/triton-3.8.0%2Bgit4c7e62b7.nv26.8-cp312-cp312-linux_x86_64.whl" } ], "licenses": [ @@ -117310,23 +119948,23 @@ } ], "name": "triton", - "purl": "pkg:pypi/triton@3.7.0%2Bgitb4e20bb.nv26.5", + "purl": "pkg:pypi/triton@3.8.0%2Bgit4c7e62b7.nv26.8", "type": "library", - "version": "3.7.0+gitb4e20bb.nv26.5" + "version": "3.8.0+git4c7e62b7.nv26.8" }, { - "bom-ref": "pkg:pypi/triton-kernels@1.0.0%2Bgitb4e20bb.nv26.5?package-id=07778633e6556e44", - "cpe": "cpe:2.3:a:python-triton-kernels:python-triton-kernels:1.0.0\\+gitb4e20bb.nv26.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/triton-kernels@1.0.0%2Bgit4c7e62b7.nv26.8?package-id=fe609e552d8b5614", + "cpe": "cpe:2.3:a:python-triton-kernels:python-triton-kernels:1.0.0\\+git4c7e62b7.nv26.8:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/dist/triton_kernels-1.0.0%2Bgitb4e20bb.nv26.5-py3-none-any.whl" + "url": "file:///tmp/dist/triton_kernels-1.0.0%2Bgit4c7e62b7.nv26.8-py3-none-any.whl" } ], "name": "triton-kernels", - "purl": "pkg:pypi/triton-kernels@1.0.0%2Bgitb4e20bb.nv26.5", + "purl": "pkg:pypi/triton-kernels@1.0.0%2Bgit4c7e62b7.nv26.8", "type": "library", - "version": "1.0.0+gitb4e20bb.nv26.5" + "version": "1.0.0+git4c7e62b7.nv26.8" }, { "author": "Seth Michael Larson , David Glick ", @@ -117362,8 +120000,8 @@ }, { "author": "Alex Gr\u00f6nholm ", - "bom-ref": "pkg:pypi/typeguard@4.5.1?package-id=98878e96d31eeee3", - "cpe": "cpe:2.3:a:python-typeguard:python-typeguard:4.5.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/typeguard@4.6.0?package-id=8a734599177bbb6b", + "cpe": "cpe:2.3:a:python-typeguard:python-typeguard:4.6.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -117372,14 +120010,14 @@ } ], "name": "typeguard", - "purl": "pkg:pypi/typeguard@4.5.1", + "purl": "pkg:pypi/typeguard@4.6.0", "type": "library", - "version": "4.5.1" + "version": "4.6.0" }, { "author": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "bom-ref": "pkg:pypi/typer@0.25.1?package-id=deb2e4420aa56b80", - "cpe": "cpe:2.3:a:python-typer:python-typer:0.25.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/typer@0.27.2?package-id=6b64c5d4446832f9", + "cpe": "cpe:2.3:a:python-typer:python-typer:0.27.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -117388,9 +120026,9 @@ } ], "name": "typer", - "purl": "pkg:pypi/typer@0.25.1", + "purl": "pkg:pypi/typer@0.27.2", "type": "library", - "version": "0.25.1" + "version": "0.27.2" }, { "author": "\"Guido van Rossum, Jukka Lehtosalo, \u0141ukasz Langa, Michael Lee\" ", @@ -117410,8 +120048,8 @@ }, { "author": "\"Guido van Rossum, Jukka Lehtosalo, \u0141ukasz Langa, Michael Lee\" ", - "bom-ref": "pkg:pypi/typing-extensions@4.15.0?package-id=72b3436982f9750f", - "cpe": "cpe:2.3:a:python-typing-extensions:python-typing-extensions:4.15.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/typing-extensions@4.16.0?package-id=0abce382bad46f63", + "cpe": "cpe:2.3:a:python-typing-extensions:python-typing-extensions:4.16.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -117420,14 +120058,14 @@ } ], "name": "typing-extensions", - "purl": "pkg:pypi/typing-extensions@4.15.0", + "purl": "pkg:pypi/typing-extensions@4.16.0", "type": "library", - "version": "4.15.0" + "version": "4.16.0" }, { "author": "Victorien Plot ", - "bom-ref": "pkg:pypi/typing-inspection@0.4.2?package-id=d0e0d066528bf209", - "cpe": "cpe:2.3:a:victorien_plot_\\", - "bom-ref": "pkg:pypi/tyro@1.0.13?package-id=2ecb50c515f117a6", - "cpe": "cpe:2.3:a:brentyi_\\", - "bom-ref": "pkg:pypi/tzdata@2026.2?package-id=5a9cc20dbae51976", - "cpe": "cpe:2.3:a:python_software_foundation_project:python-tzdata:2026.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/tzdata@2026.3?package-id=72bc0796c4f968d7", + "cpe": "cpe:2.3:a:python_software_foundation_project:python-tzdata:2026.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -117468,18 +120106,18 @@ } ], "name": "tzdata", - "purl": "pkg:pypi/tzdata@2026.2", + "purl": "pkg:pypi/tzdata@2026.3", "type": "library", - "version": "2026.2" + "version": "2026.3" }, { - "bom-ref": "pkg:deb/ubuntu/tzdata@2026a-0ubuntu0.24.04.1?arch=all&distro=ubuntu-24.04&package-id=3e5f4bcca701ec9c", - "cpe": "cpe:2.3:a:tzdata:tzdata:2026a-0ubuntu0.24.04.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/tzdata@2026c-0ubuntu0.24.04.1?arch=all&distro=ubuntu-24.04&package-id=99b373dd6f1b14e5", + "cpe": "cpe:2.3:a:tzdata:tzdata:2026c-0ubuntu0.24.04.1:*:*:*:*:*:*:*", "name": "tzdata", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/tzdata@2026a-0ubuntu0.24.04.1?arch=all&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/tzdata@2026c-0ubuntu0.24.04.1?arch=all&distro=ubuntu-24.04", "type": "library", - "version": "2026a-0ubuntu0.24.04.1" + "version": "2026c-0ubuntu0.24.04.1" }, { "bom-ref": "os:ubuntu@24.04", @@ -117632,45 +120270,45 @@ "version": "0.22.1" }, { - "bom-ref": "pkg:deb/ubuntu/vim@2%3A9.1.0016-1ubuntu7.13?arch=amd64&distro=ubuntu-24.04&package-id=adeef721e73556ec", - "cpe": "cpe:2.3:a:vim:vim:2\\:9.1.0016-1ubuntu7.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/vim@2%3A9.1.0016-1ubuntu7.19?arch=amd64&distro=ubuntu-24.04&package-id=414ec069fcbe61dd", + "cpe": "cpe:2.3:a:vim:vim:2\\:9.1.0016-1ubuntu7.19:*:*:*:*:*:*:*", "name": "vim", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/vim@2%3A9.1.0016-1ubuntu7.13?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/vim@2%3A9.1.0016-1ubuntu7.19?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "2:9.1.0016-1ubuntu7.13" + "version": "2:9.1.0016-1ubuntu7.19" }, { - "bom-ref": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.13?arch=all&distro=ubuntu-24.04&package-id=4652f221b71bf7e8&upstream=vim", - "cpe": "cpe:2.3:a:vim-common:vim-common:2\\:9.1.0016-1ubuntu7.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.19?arch=all&distro=ubuntu-24.04&package-id=2a7ea43b93587468&upstream=vim", + "cpe": "cpe:2.3:a:vim-common:vim-common:2\\:9.1.0016-1ubuntu7.19:*:*:*:*:*:*:*", "name": "vim-common", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.13?arch=all&distro=ubuntu-24.04&upstream=vim", + "purl": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.19?arch=all&distro=ubuntu-24.04&upstream=vim", "type": "library", - "version": "2:9.1.0016-1ubuntu7.13" + "version": "2:9.1.0016-1ubuntu7.19" }, { - "bom-ref": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.13?arch=all&distro=ubuntu-24.04&package-id=37aac5ec90a25f34&upstream=vim", - "cpe": "cpe:2.3:a:vim-runtime:vim-runtime:2\\:9.1.0016-1ubuntu7.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.19?arch=all&distro=ubuntu-24.04&package-id=817979ba7a9a3158&upstream=vim", + "cpe": "cpe:2.3:a:vim-runtime:vim-runtime:2\\:9.1.0016-1ubuntu7.19:*:*:*:*:*:*:*", "name": "vim-runtime", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.13?arch=all&distro=ubuntu-24.04&upstream=vim", + "purl": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.19?arch=all&distro=ubuntu-24.04&upstream=vim", "type": "library", - "version": "2:9.1.0016-1ubuntu7.13" + "version": "2:9.1.0016-1ubuntu7.19" }, { - "bom-ref": "pkg:deb/ubuntu/vim-tiny@2%3A9.1.0016-1ubuntu7.13?arch=amd64&distro=ubuntu-24.04&package-id=586ad8f4ffcab39c&upstream=vim", - "cpe": "cpe:2.3:a:vim-tiny:vim-tiny:2\\:9.1.0016-1ubuntu7.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/vim-tiny@2%3A9.1.0016-1ubuntu7.19?arch=amd64&distro=ubuntu-24.04&package-id=7e49c2bf8123a94d&upstream=vim", + "cpe": "cpe:2.3:a:vim-tiny:vim-tiny:2\\:9.1.0016-1ubuntu7.19:*:*:*:*:*:*:*", "name": "vim-tiny", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/vim-tiny@2%3A9.1.0016-1ubuntu7.13?arch=amd64&distro=ubuntu-24.04&upstream=vim", + "purl": "pkg:deb/ubuntu/vim-tiny@2%3A9.1.0016-1ubuntu7.19?arch=amd64&distro=ubuntu-24.04&upstream=vim", "type": "library", - "version": "2:9.1.0016-1ubuntu7.13" + "version": "2:9.1.0016-1ubuntu7.19" }, { "author": "Jeff Quast ", - "bom-ref": "pkg:pypi/wcwidth@0.7.0?package-id=e2fbec287611a82f", - "cpe": "cpe:2.3:a:jeff_quast_\\", - "bom-ref": "pkg:pypi/webencodings@0.5.1?package-id=7dfd89d22b307a2f", - "cpe": "cpe:2.3:a:geoffrey_sneddon_project:python-webencodings:0.5.1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "BSD" - } - } - ], + "author": "Simon Sapin ", + "bom-ref": "pkg:pypi/webencodings@0.6.1?package-id=2ed9f6b06204cb2a", + "cpe": "cpe:2.3:a:simon_sapin_\\", @@ -117766,8 +120397,8 @@ }, { "author": "Daniel Holth ", - "bom-ref": "pkg:pypi/wheel@0.47.0?package-id=269ecec257e34ef1", - "cpe": "cpe:2.3:a:daniel_holth_\\", - "bom-ref": "pkg:pypi/xdsl@0.69.0?package-id=e986b8f91aa3e184", - "cpe": "cpe:2.3:a:mathieu_fehr_\\", - "purl": "pkg:deb/ubuntu/xml-core@0.19?arch=all&distro=ubuntu-24.04", - "type": "library", - "version": "0.19" - }, { "author": "Yue Du ", - "bom-ref": "pkg:pypi/xxhash@3.7.0?package-id=adb8ad907b478fc0", - "cpe": "cpe:2.3:a:ifduyue_project:python-xxhash:3.7.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/xxhash@4.0.1?package-id=a2d3087c3118ac78", + "cpe": "cpe:2.3:a:ifduyue_project:python-xxhash:4.0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { - "name": "BSD" + "id": "BSD-2-Clause" } } ], "name": "xxhash", - "purl": "pkg:pypi/xxhash@3.7.0", + "purl": "pkg:pypi/xxhash@4.0.1", "type": "library", - "version": "3.7.0" + "version": "4.0.1" }, { - "bom-ref": "pkg:deb/ubuntu/xz-utils@5.6.1%2Breally5.4.5-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04&package-id=3c2787aca055fbfc", - "cpe": "cpe:2.3:a:xz-utils:xz-utils:5.6.1\\+really5.4.5-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/xz-utils@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=amd64&distro=ubuntu-24.04&package-id=f0cc2baf3e20a31c", + "cpe": "cpe:2.3:a:xz-utils:xz-utils:5.6.1\\+really5.4.5-1ubuntu0.3:*:*:*:*:*:*:*", "name": "xz-utils", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/xz-utils@5.6.1%2Breally5.4.5-1ubuntu0.2?arch=amd64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/xz-utils@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=amd64&distro=ubuntu-24.04", "type": "library", - "version": "5.6.1+really5.4.5-1ubuntu0.2" + "version": "5.6.1+really5.4.5-1ubuntu0.3" }, { "author": "Andrew Svetlov ", - "bom-ref": "pkg:pypi/yarl@1.23.0?package-id=326e17b8faf7e464", - "cpe": "cpe:2.3:a:andrew_svetlov_project:python-yarl:1.23.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/yarl@1.24.5?package-id=6f01c8c0bd80e2d2", + "cpe": "cpe:2.3:a:andrew_svetlov_project:python-yarl:1.24.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -117867,9 +120489,9 @@ } ], "name": "yarl", - "purl": "pkg:pypi/yarl@1.23.0", + "purl": "pkg:pypi/yarl@1.24.5", "type": "library", - "version": "1.23.0" + "version": "1.24.5" }, { "author": "\"Jason R. Coombs\" ", @@ -117905,8 +120527,8 @@ }, { "author": "\"Jason R. Coombs\" ", - "bom-ref": "pkg:pypi/zipp@3.23.1?package-id=09e8ec7e7a7ec630", - "cpe": "cpe:2.3:a:\\\"jason_r__coombs\\\"_\\", - "bom-ref": "pkg:pypi/accelerate@1.14.0?package-id=6bfbd48c5ab407b7", - "cpe": "cpe:2.3:a:hugging_face_team_project:python-accelerate:1.14.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/accelerate@1.15.0?package-id=d27ec18bc233d4a1", + "cpe": "cpe:2.3:a:hugging_face_team_project:python-accelerate:1.15.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -102752,9 +104867,9 @@ } ], "name": "accelerate", - "purl": "pkg:pypi/accelerate@1.14.0", + "purl": "pkg:pypi/accelerate@1.15.0", "type": "library", - "version": "1.14.0" + "version": "1.15.0" }, { "bom-ref": "pkg:deb/ubuntu/adduser@3.137ubuntu1?arch=all&distro=ubuntu-24.04&package-id=1ab618881401f6d6", @@ -102783,8 +104898,8 @@ }, { "author": "J. Nick Koston ", - "bom-ref": "pkg:pypi/aiohappyeyeballs@2.6.1?package-id=9feff7f006db242c", - "cpe": "cpe:2.3:a:python-aiohappyeyeballs:python-aiohappyeyeballs:2.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/aiohappyeyeballs@2.7.1?package-id=00e775cbefbfdff2", + "cpe": "cpe:2.3:a:python-aiohappyeyeballs:python-aiohappyeyeballs:2.7.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -102793,22 +104908,22 @@ } ], "name": "aiohappyeyeballs", - "purl": "pkg:pypi/aiohappyeyeballs@2.6.1", + "purl": "pkg:pypi/aiohappyeyeballs@2.7.1", "type": "library", - "version": "2.6.1" + "version": "2.7.1" }, { - "bom-ref": "pkg:pypi/aiohttp@3.13.5?package-id=22593c12ab3f8a01", - "cpe": "cpe:2.3:a:python-aiohttp:python-aiohttp:3.13.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/aiohttp@3.14.3?package-id=1eeed534070b237e", + "cpe": "cpe:2.3:a:python-aiohttp:python-aiohttp:3.14.3:*:*:*:*:*:*:*", "licenses": [ { "expression": "Apache-2.0 AND MIT" } ], "name": "aiohttp", - "purl": "pkg:pypi/aiohttp@3.13.5", + "purl": "pkg:pypi/aiohttp@3.14.3", "type": "library", - "version": "3.13.5" + "version": "3.14.3" }, { "bom-ref": "pkg:pypi/aiosignal@1.4.0?package-id=f588ce8df3532475", @@ -102827,8 +104942,8 @@ }, { "author": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "bom-ref": "pkg:pypi/annotated-doc@0.0.4?package-id=c32c425eb73bee0b", - "cpe": "cpe:2.3:a:python-annotated-doc:python-annotated-doc:0.0.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/annotated-doc@0.0.5?package-id=8ec0eb67e9c7ed22", + "cpe": "cpe:2.3:a:python-annotated-doc:python-annotated-doc:0.0.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -102837,22 +104952,29 @@ } ], "name": "annotated-doc", - "purl": "pkg:pypi/annotated-doc@0.0.4", + "purl": "pkg:pypi/annotated-doc@0.0.5", "type": "library", - "version": "0.0.4" + "version": "0.0.5" }, { "author": "Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Samuel Colvin , Zac Hatfield-Dodds ", - "bom-ref": "pkg:pypi/annotated-types@0.7.0?package-id=b0ef1a02206e6100", - "cpe": "cpe:2.3:a:adrian_garcia_badaracco_\\<1755071\\+adriangb_project:python-annotated-types:0.7.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/annotated-types@0.8.0?package-id=b07aed3099847979", + "cpe": "cpe:2.3:a:adrian_garcia_badaracco_\\<1755071\\+adriangb_project:python-annotated-types:0.8.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ], "name": "annotated-types", - "purl": "pkg:pypi/annotated-types@0.7.0", + "purl": "pkg:pypi/annotated-types@0.8.0", "type": "library", - "version": "0.7.0" + "version": "0.8.0" }, { "author": "Eric Vergnaud, Terence Parr, Sam Harwell ", - "bom-ref": "pkg:pypi/antlr4-python3-runtime@4.9.3?package-id=4d16bd22b3beb2cf", + "bom-ref": "pkg:pypi/antlr4-python3-runtime@4.9.3?package-id=45827425ac9ae96a", "cpe": "cpe:2.3:a:eric_vergnaud\\,_terence_parr\\,_sam_harwell_project:python-antlr4-python3-runtime:4.9.3:*:*:*:*:*:*:*", "licenses": [ { @@ -102868,8 +104990,8 @@ }, { "author": "Alex Gr\u00f6nholm ", - "bom-ref": "pkg:pypi/anyio@4.13.0?package-id=b212fb83c175a84e", - "cpe": "cpe:2.3:a:python-anyio:python-anyio:4.13.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/anyio@4.14.2?package-id=287700103d81bb78", + "cpe": "cpe:2.3:a:python-anyio:python-anyio:4.14.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -102878,9 +105000,9 @@ } ], "name": "anyio", - "purl": "pkg:pypi/anyio@4.13.0", + "purl": "pkg:pypi/anyio@4.14.2", "type": "library", - "version": "4.13.0" + "version": "4.14.2" }, { "author": "TVM FFI team", @@ -102899,7 +105021,7 @@ "version": "0.1.13.post2" }, { - "bom-ref": "pkg:pypi/apex@0.1?package-id=8b67fa9ff443fd84", + "bom-ref": "pkg:pypi/apex@0.1?package-id=58f06e11a8aca8dd", "cpe": "cpe:2.3:a:python-apex:python-apex:0.1:*:*:*:*:*:*:*", "externalReferences": [ { @@ -102948,8 +105070,8 @@ }, { "author": "Hynek Schlawack ", - "bom-ref": "pkg:pypi/argon2-cffi-bindings@25.1.0?package-id=c2a659cda8e7ca16", - "cpe": "cpe:2.3:a:hynek_schlawack_\\", @@ -103023,8 +105145,8 @@ }, { "author": "Dmitry Sagalovskiy, Grist Labs ", - "bom-ref": "pkg:pypi/asttokens@3.0.1?package-id=cbfe5be71b39d630", - "cpe": "cpe:2.3:a:dmitry_sagalovskiy\\,_grist_labs_project:python-asttokens:3.0.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/asttokens@3.0.2?package-id=d1d1acd028097910", + "cpe": "cpe:2.3:a:dmitry_sagalovskiy\\,_grist_labs_project:python-asttokens:3.0.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -103033,9 +105155,9 @@ } ], "name": "asttokens", - "purl": "pkg:pypi/asttokens@3.0.1", + "purl": "pkg:pypi/asttokens@3.0.2", "type": "library", - "version": "3.0.1" + "version": "3.0.2" }, { "bom-ref": "pkg:pypi/astunparse@1.6.3?package-id=af73551ec76db570", @@ -103174,8 +105296,8 @@ }, { "author": "Microsoft Corporation ", - "bom-ref": "pkg:pypi/azure-storage-blob@12.30.0?package-id=5b4a005e0c0f1f28", - "cpe": "cpe:2.3:a:microsoft_corporation_project:python-azure-storage-blob:12.30.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/azure-storage-blob@12.30.1?package-id=c114f824d855cd1a", + "cpe": "cpe:2.3:a:microsoft_corporation_project:python-azure-storage-blob:12.30.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -103184,9 +105306,9 @@ } ], "name": "azure-storage-blob", - "purl": "pkg:pypi/azure-storage-blob@12.30.0", + "purl": "pkg:pypi/azure-storage-blob@12.30.1", "type": "library", - "version": "12.30.0" + "version": "12.30.1" }, { "author": "Armin Ronacher ", @@ -103273,8 +105395,8 @@ }, { "author": "Leonard Richardson ", - "bom-ref": "pkg:pypi/beautifulsoup4@4.14.3?package-id=6369582e49e254f6", - "cpe": "cpe:2.3:a:leonard_richardson_\\, Bern\u00e1t G\u00e1bor , layday , Henry Schreiner ", - "bom-ref": "pkg:pypi/build@1.5.0?package-id=671cd8ef93c8c612", - "cpe": "cpe:2.3:a:python-build:python-build:1.5.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/build@1.6.1?package-id=60f7431813c4c442", + "cpe": "cpe:2.3:a:python-build:python-build:1.6.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -103412,9 +105534,9 @@ } ], "name": "build", - "purl": "pkg:pypi/build@1.5.0", + "purl": "pkg:pypi/build@1.6.1", "type": "library", - "version": "1.5.0" + "version": "1.6.1" }, { "bom-ref": "pkg:deb/ubuntu/build-essential@12.10ubuntu1?arch=arm64&distro=ubuntu-24.04&package-id=adbb875ca134f4cf", @@ -103435,25 +105557,8 @@ "version": "1.0.8-5.1build0.1" }, { - "bom-ref": "pkg:deb/ubuntu/ca-certificates@20260601~24.04.1?arch=all&distro=ubuntu-24.04&package-id=90dbb1a8b8c2da5c", + "bom-ref": "pkg:deb/ubuntu/ca-certificates@20260601~24.04.1?arch=all&distro=ubuntu-24.04&package-id=eac8314db6031a49", "cpe": "cpe:2.3:a:ca-certificates:ca-certificates:20260601\\~24.04.1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "GPL-2.0-only" - } - }, - { - "license": { - "id": "GPL-2.0-or-later" - } - }, - { - "license": { - "id": "MPL-2.0" - } - } - ], "name": "ca-certificates", "publisher": "Ubuntu Developers ", "purl": "pkg:deb/ubuntu/ca-certificates@20260601~24.04.1?arch=all&distro=ubuntu-24.04", @@ -103462,12 +105567,12 @@ }, { "author": "DefTruth, vipshop.com, etc.", - "bom-ref": "pkg:pypi/cache-dit@1.5.0?package-id=c6ed2f828a25089c", - "cpe": "cpe:2.3:a:deftruth\\,_vipshop_com\\,_etc__project:python-cache-dit:1.5.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/cache-dit@1.5.2?package-id=3ef55f88decc2e54", + "cpe": "cpe:2.3:a:deftruth\\,_vipshop_com\\,_etc__project:python-cache-dit:1.5.2:*:*:*:*:*:*:*", "name": "cache-dit", - "purl": "pkg:pypi/cache-dit@1.5.0", + "purl": "pkg:pypi/cache-dit@1.5.2", "type": "library", - "version": "1.5.0" + "version": "1.5.2" }, { "bom-ref": "029484c60bef2128", @@ -103492,10 +105597,19 @@ "type": "library", "version": "4.9.1-1" }, + { + "bom-ref": "pkg:deb/ubuntu/cccl-13-4@13.3.4.2.1-1?arch=arm64&distro=ubuntu-24.04&package-id=e83159cdbce70ea7&upstream=cccl", + "cpe": "cpe:2.3:a:cccl-13-4:cccl-13-4:13.3.4.2.1-1:*:*:*:*:*:*:*", + "name": "cccl-13-4", + "publisher": "cudatools ", + "purl": "pkg:deb/ubuntu/cccl-13-4@13.3.4.2.1-1?arch=arm64&distro=ubuntu-24.04&upstream=cccl", + "type": "library", + "version": "13.3.4.2.1-1" + }, { "author": "Kenneth Reitz ", - "bom-ref": "pkg:pypi/certifi@2026.4.22?package-id=1ef17bd515d577cd", - "cpe": "cpe:2.3:a:certifi:certifi:2026.4.22:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/certifi@2026.7.22?package-id=fddead20352afbaa", + "cpe": "cpe:2.3:a:certifi:certifi:2026.7.22:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -103504,30 +105618,30 @@ } ], "name": "certifi", - "purl": "pkg:pypi/certifi@2026.4.22", + "purl": "pkg:pypi/certifi@2026.7.22", "type": "library", - "version": "2026.4.22" + "version": "2026.7.22" }, { "author": "Armin Rigo, Maciej Fijalkowski", - "bom-ref": "pkg:pypi/cffi@2.0.0?package-id=88baf42587fd02b5", - "cpe": "cpe:2.3:a:armin_rigo\\,_maciej_fijalkowski_project:python-cffi:2.0.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/cffi@2.1.1?package-id=2a06c5a262e6f9ea", + "cpe": "cpe:2.3:a:armin_rigo\\,_maciej_fijalkowski_project:python-cffi:2.1.1:*:*:*:*:*:*:*", "licenses": [ { "license": { - "id": "MIT" + "id": "MIT-0" } } ], "name": "cffi", - "purl": "pkg:pypi/cffi@2.0.0", + "purl": "pkg:pypi/cffi@2.1.1", "type": "library", - "version": "2.0.0" + "version": "2.1.1" }, { "author": "\"Ahmed R. TAHRI\" ", - "bom-ref": "pkg:pypi/charset-normalizer@3.4.7?package-id=deae9362046400c9", - "cpe": "cpe:2.3:a:\\\"ahmed_r__tahri\\\"_\\", @@ -103617,6 +105731,22 @@ "type": "library", "version": "0.5.9" }, + { + "author": "The cloudpickle developer team ", + "bom-ref": "pkg:pypi/cloudpickle@3.1.2?package-id=5b6f9e2f42b61170", + "cpe": "cpe:2.3:a:cloudpickle_developer_team_project:python-cloudpickle:3.1.2:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ], + "name": "cloudpickle", + "purl": "pkg:pypi/cloudpickle@3.1.2", + "type": "library", + "version": "3.1.2" + }, { "author": "Jean-Christophe Fillion-Robin ", "bom-ref": "pkg:pypi/cmake@3.31.6?package-id=a254dffdf51e72a8", @@ -103668,7 +105798,7 @@ "version": "0.2.3" }, { - "bom-ref": "pkg:golang/command-line-arguments?package-id=1b73c1460014d702", + "bom-ref": "pkg:golang/command-line-arguments?package-id=65b6a238d2ef9b6e", "name": "command-line-arguments", "purl": "pkg:golang/command-line-arguments", "type": "library", @@ -103749,51 +105879,51 @@ "type": "library", "version": "50.0.1" }, + { + "bom-ref": "pkg:deb/ubuntu/cublasmp-cuda-13@0.10.0.3695-1?arch=arm64&distro=ubuntu-24.04&package-id=804e0ec67b165ada&upstream=libcublasmp", + "cpe": "cpe:2.3:a:cublasmp-cuda-13:cublasmp-cuda-13:0.10.0.3695-1:*:*:*:*:*:*:*", + "name": "cublasmp-cuda-13", + "publisher": "cudatools ", + "purl": "pkg:deb/ubuntu/cublasmp-cuda-13@0.10.0.3695-1?arch=arm64&distro=ubuntu-24.04&upstream=libcublasmp", + "type": "library", + "version": "0.10.0.3695-1" + }, { "author": "NVIDIA Corporation ", - "bom-ref": "pkg:pypi/cuda-bindings@13.2.0?package-id=d8ba92d92656e6a4", - "cpe": "cpe:2.3:a:nvidia_corporation_\\", - "purl": "pkg:deb/ubuntu/cuda-cccl-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cccl", - "type": "library", - "version": "13.2.75-1" - }, - { - "bom-ref": "pkg:deb/ubuntu/cuda-compat-13-2@595.58.03-1ubuntu1?arch=arm64&distro=ubuntu-24.04&package-id=c74bc1b7ed070df6&upstream=nvidia-graphics-drivers", - "cpe": "cpe:2.3:a:cuda-compat-13-2:cuda-compat-13-2:595.58.03-1ubuntu1:*:*:*:*:*:*:*", - "name": "cuda-compat-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-compat-13-4@615.65.02-1ubuntu1?arch=arm64&distro=ubuntu-24.04&package-id=bffafe01cf6aa0db&upstream=nvidia-graphics-drivers", + "cpe": "cpe:2.3:a:cuda-compat-13-4:cuda-compat-13-4:615.65.02-1ubuntu1:*:*:*:*:*:*:*", + "name": "cuda-compat-13-4", "publisher": "NVIDIA ", - "purl": "pkg:deb/ubuntu/cuda-compat-13-2@595.58.03-1ubuntu1?arch=arm64&distro=ubuntu-24.04&upstream=nvidia-graphics-drivers", + "purl": "pkg:deb/ubuntu/cuda-compat-13-4@615.65.02-1ubuntu1?arch=arm64&distro=ubuntu-24.04&upstream=nvidia-graphics-drivers", "type": "library", - "version": "595.58.03-1ubuntu1" + "version": "615.65.02-1ubuntu1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-compat-orin-13-2@13.2.44429113-1?arch=arm64&distro=ubuntu-24.04&package-id=26bd93b0e5323721&upstream=cuda-compat-orin", - "cpe": "cpe:2.3:a:cuda-compat-orin-13-2:cuda-compat-orin-13-2:13.2.44429113-1:*:*:*:*:*:*:*", - "name": "cuda-compat-orin-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-compat-orin-13-4@13.4.46343957-1?arch=arm64&distro=ubuntu-24.04&package-id=f38aafccc981dfee&upstream=cuda-compat-orin", + "cpe": "cpe:2.3:a:cuda-compat-orin-13-4:cuda-compat-orin-13-4:13.4.46343957-1:*:*:*:*:*:*:*", + "name": "cuda-compat-orin-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-compat-orin-13-2@13.2.44429113-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-compat-orin", + "purl": "pkg:deb/ubuntu/cuda-compat-orin-13-4@13.4.46343957-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-compat-orin", "type": "library", - "version": "13.2.44429113-1" + "version": "13.4.46343957-1" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/cuda-core@1.1.1?package-id=104bb1b3d9770072", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-cuda-core:1.1.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/cuda-core@1.0.1?package-id=c8b0ec1209b12ec1", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-cuda-core:1.0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -103802,99 +105932,90 @@ } ], "name": "cuda-core", - "purl": "pkg:pypi/cuda-core@1.1.1", + "purl": "pkg:pypi/cuda-core@1.0.1", "type": "library", - "version": "1.1.1" + "version": "1.0.1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-crt-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=e9bf18b387a956a4&upstream=cuda-crt", - "cpe": "cpe:2.3:a:cuda-crt-13-2:cuda-crt-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-crt-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-crt-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&package-id=d5eb0c52f8b9b782&upstream=cuda-crt", + "cpe": "cpe:2.3:a:cuda-crt-13-4:cuda-crt-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "cuda-crt-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-crt-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-crt", + "purl": "pkg:deb/ubuntu/cuda-crt-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-crt", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-cudart-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&package-id=d32cb0d87c93a18b&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-cudart-13-2:cuda-cudart-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-cudart-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-cudart-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=475179037325e194&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-cudart-13-4:cuda-cudart-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-cudart-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-cudart-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-cudart-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-cudart-dev-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&package-id=640f86a04fed7e5d&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-cudart-dev-13-2:cuda-cudart-dev-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-cudart-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-cudart-dev-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=46d07ddfe09b2ac3&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-cudart-dev-13-4:cuda-cudart-dev-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-cudart-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-cudart-dev-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-cudart-dev-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-culibos-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&package-id=2dddac590ed8b832&upstream=cuda-culibos", - "cpe": "cpe:2.3:a:cuda-culibos-13-2:cuda-culibos-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-culibos-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-culibos-dev-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=6e3244db55bd09a5&upstream=cuda-culibos", + "cpe": "cpe:2.3:a:cuda-culibos-dev-13-4:cuda-culibos-dev-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-culibos-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-culibos-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-culibos", + "purl": "pkg:deb/ubuntu/cuda-culibos-dev-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-culibos", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-culibos-dev-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&package-id=f473821008d120f7&upstream=cuda-culibos", - "cpe": "cpe:2.3:a:cuda-culibos-dev-13-2:cuda-culibos-dev-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-culibos-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-cuobjdump-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=c4d46899d5ff2762&upstream=cuda-cuobjdump", + "cpe": "cpe:2.3:a:cuda-cuobjdump-13-4:cuda-cuobjdump-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-cuobjdump-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-culibos-dev-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-culibos", + "purl": "pkg:deb/ubuntu/cuda-cuobjdump-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cuobjdump", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-cuobjdump-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=7319b79f84f4b0c9&upstream=cuda-cuobjdump", - "cpe": "cpe:2.3:a:cuda-cuobjdump-13-2:cuda-cuobjdump-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-cuobjdump-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-cupti-13-4@13.4.58-1?arch=arm64&distro=ubuntu-24.04&package-id=694d1f47e1dfd1f5&upstream=cuda-cupti", + "cpe": "cpe:2.3:a:cuda-cupti-13-4:cuda-cupti-13-4:13.4.58-1:*:*:*:*:*:*:*", + "name": "cuda-cupti-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-cuobjdump-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cuobjdump", + "purl": "pkg:deb/ubuntu/cuda-cupti-13-4@13.4.58-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cupti", "type": "library", - "version": "13.2.78-1" + "version": "13.4.58-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-cupti-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&package-id=c163f8bcec40b09d&upstream=cuda-cupti", - "cpe": "cpe:2.3:a:cuda-cupti-13-2:cuda-cupti-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-cupti-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-cupti-dev-13-4@13.4.58-1?arch=arm64&distro=ubuntu-24.04&package-id=a3b9ecc66ebc43a8&upstream=cuda-cupti", + "cpe": "cpe:2.3:a:cuda-cupti-dev-13-4:cuda-cupti-dev-13-4:13.4.58-1:*:*:*:*:*:*:*", + "name": "cuda-cupti-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-cupti-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cupti", + "purl": "pkg:deb/ubuntu/cuda-cupti-dev-13-4@13.4.58-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cupti", "type": "library", - "version": "13.2.75-1" + "version": "13.4.58-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-cupti-dev-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&package-id=8c4a0443e7faa6cc&upstream=cuda-cupti", - "cpe": "cpe:2.3:a:cuda-cupti-dev-13-2:cuda-cupti-dev-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-cupti-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-driver-dev-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=5c7c10dff8cd06d9&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-driver-dev-13-4:cuda-driver-dev-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-driver-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-cupti-dev-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cupti", + "purl": "pkg:deb/ubuntu/cuda-driver-dev-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-driver-dev-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&package-id=1f561274f28053dd&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-driver-dev-13-2:cuda-driver-dev-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-driver-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-gdb-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=e830c73d3baa5501&upstream=cuda-gdb", + "cpe": "cpe:2.3:a:cuda-gdb-13-4:cuda-gdb-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-gdb-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-driver-dev-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-gdb-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-gdb", "type": "library", - "version": "13.2.75-1" - }, - { - "bom-ref": "pkg:deb/ubuntu/cuda-gdb-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&package-id=5331e9692221e1eb&upstream=cuda-gdb", - "cpe": "cpe:2.3:a:cuda-gdb-13-2:cuda-gdb-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-gdb-13-2", - "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-gdb-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-gdb", - "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { "bom-ref": "pkg:deb/ubuntu/cuda-keyring@1.1-1?arch=all&distro=ubuntu-24.04&package-id=d0c84e54456139b9", @@ -103906,79 +106027,72 @@ "version": "1.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvcc-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=cc8e4f09a2b2e35b&upstream=cuda-nvcc", - "cpe": "cpe:2.3:a:cuda-nvcc-13-2:cuda-nvcc-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-nvcc-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvcc-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&package-id=f466e3f13496d5d2&upstream=cuda-nvcc", + "cpe": "cpe:2.3:a:cuda-nvcc-13-4:cuda-nvcc-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "cuda-nvcc-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvcc-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvcc", + "purl": "pkg:deb/ubuntu/cuda-nvcc-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvcc", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvdisasm-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=64c237068ddaa55f&upstream=cuda-nvdisasm", - "cpe": "cpe:2.3:a:cuda-nvdisasm-13-2:cuda-nvdisasm-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-nvdisasm-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvdisasm-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=dc2af5876d319a56&upstream=cuda-nvdisasm", + "cpe": "cpe:2.3:a:cuda-nvdisasm-13-4:cuda-nvdisasm-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-nvdisasm-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvdisasm-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvdisasm", + "purl": "pkg:deb/ubuntu/cuda-nvdisasm-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvdisasm", "type": "library", - "version": "13.2.78-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvml-dev-13-2@13.2.82-1?arch=arm64&distro=ubuntu-24.04&package-id=e132ba323accefd0&upstream=cuda-nvml-dev", - "cpe": "cpe:2.3:a:cuda-nvml-dev-13-2:cuda-nvml-dev-13-2:13.2.82-1:*:*:*:*:*:*:*", - "name": "cuda-nvml-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvml-dev-13-4@13.4.61-1?arch=arm64&distro=ubuntu-24.04&package-id=95bdb9d8e9778eec&upstream=cuda-nvml-dev", + "cpe": "cpe:2.3:a:cuda-nvml-dev-13-4:cuda-nvml-dev-13-4:13.4.61-1:*:*:*:*:*:*:*", + "name": "cuda-nvml-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvml-dev-13-2@13.2.82-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvml-dev", + "purl": "pkg:deb/ubuntu/cuda-nvml-dev-13-4@13.4.61-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvml-dev", "type": "library", - "version": "13.2.82-1" + "version": "13.4.61-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvprune-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=6f9697bf054b1559&upstream=cuda-nvprune", - "cpe": "cpe:2.3:a:cuda-nvprune-13-2:cuda-nvprune-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-nvprune-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvprune-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=6dbda8199a19df44&upstream=cuda-nvprune", + "cpe": "cpe:2.3:a:cuda-nvprune-13-4:cuda-nvprune-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-nvprune-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvprune-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvprune", + "purl": "pkg:deb/ubuntu/cuda-nvprune-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvprune", "type": "library", - "version": "13.2.78-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvrtc-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=feabe190c7131305&upstream=cuda-nvrtc", - "cpe": "cpe:2.3:a:cuda-nvrtc-13-2:cuda-nvrtc-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-nvrtc-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvrtc-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&package-id=36b979c9cc740025&upstream=cuda-nvrtc", + "cpe": "cpe:2.3:a:cuda-nvrtc-13-4:cuda-nvrtc-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "cuda-nvrtc-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvrtc-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvrtc", + "purl": "pkg:deb/ubuntu/cuda-nvrtc-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvrtc", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvrtc-dev-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=257fbe2379748ec2&upstream=cuda-nvrtc", - "cpe": "cpe:2.3:a:cuda-nvrtc-dev-13-2:cuda-nvrtc-dev-13-2:13.2.78-1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "sha256:0b7b3f1644af45c0e1279e995e5daa5b465997235c16bc86c83dcdf3c3b88b05" - } - } - ], - "name": "cuda-nvrtc-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvrtc-dev-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&package-id=68f6780c0a60b01c&upstream=cuda-nvrtc", + "cpe": "cpe:2.3:a:cuda-nvrtc-dev-13-4:cuda-nvrtc-dev-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "cuda-nvrtc-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvrtc-dev-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvrtc", + "purl": "pkg:deb/ubuntu/cuda-nvrtc-dev-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvrtc", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-nvtx-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&package-id=ac75bec151649c55&upstream=cuda-nvtx", - "cpe": "cpe:2.3:a:cuda-nvtx-13-2:cuda-nvtx-13-2:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-nvtx-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-nvtx-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=b280df035cdd0de4&upstream=cuda-nvtx", + "cpe": "cpe:2.3:a:cuda-nvtx-13-4:cuda-nvtx-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-nvtx-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-nvtx-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvtx", + "purl": "pkg:deb/ubuntu/cuda-nvtx-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-nvtx", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { "author": "NVIDIA Corporation ", - "bom-ref": "pkg:pypi/cuda-pathfinder@1.5.4?package-id=779b8da78a9ec783", - "cpe": "cpe:2.3:a:nvidia_corporation_\\", - "purl": "pkg:deb/ubuntu/cuda-profiler-api-13-2@13.2.75-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-profiler-api", + "purl": "pkg:deb/ubuntu/cuda-profiler-api-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-profiler-api", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { "author": "NVIDIA Corporation ", - "bom-ref": "pkg:pypi/cuda-python@13.2.0?package-id=6b72dfefdb25e8ab", - "cpe": "cpe:2.3:a:nvidia_corporation_\\", - "purl": "pkg:deb/ubuntu/cuda-sanitizer-13-2@13.2.76-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-sanitizer-api", + "purl": "pkg:deb/ubuntu/cuda-sanitizer-13-4@13.4.57-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-sanitizer-api", "type": "library", - "version": "13.2.76-1" + "version": "13.4.57-1" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/cuda-tile@1.5.0?package-id=c923f20934a67688", + "bom-ref": "pkg:pypi/cuda-tile@1.5.0?package-id=0e437515c282bf58", "cpe": "cpe:2.3:a:nvidia_corporation_project:python-cuda-tile:1.5.0:*:*:*:*:*:*:*", "licenses": [ { @@ -104040,40 +106154,40 @@ "version": "1.5.0" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-tileiras-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=74e05e665fd0b589&upstream=cuda-tileiras", - "cpe": "cpe:2.3:a:cuda-tileiras-13-2:cuda-tileiras-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "cuda-tileiras-13-2", + "bom-ref": "pkg:deb/ubuntu/cuda-tileiras-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&package-id=461b8685765c89d0&upstream=cuda-tileiras", + "cpe": "cpe:2.3:a:cuda-tileiras-13-4:cuda-tileiras-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "cuda-tileiras-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-tileiras-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-tileiras", + "purl": "pkg:deb/ubuntu/cuda-tileiras-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&upstream=cuda-tileiras", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-13-2-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&package-id=38a1f2a63ed5036b&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-toolkit-13-2-config-common:cuda-toolkit-13-2-config-common:13.2.75-1:*:*:*:*:*:*:*", - "name": "cuda-toolkit-13-2-config-common", + "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-13-4-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&package-id=c48fcd908c48ff4c&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-toolkit-13-4-config-common:cuda-toolkit-13-4-config-common:13.4.49-1:*:*:*:*:*:*:*", + "name": "cuda-toolkit-13-4-config-common", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-toolkit-13-2-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-toolkit-13-4-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-13-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&package-id=c08e1becd92882c9&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-toolkit-13-config-common:cuda-toolkit-13-config-common:13.2.75-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-13-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&package-id=4b6e26dd978edd90&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-toolkit-13-config-common:cuda-toolkit-13-config-common:13.4.49-1:*:*:*:*:*:*:*", "name": "cuda-toolkit-13-config-common", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-toolkit-13-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-toolkit-13-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&package-id=9e7dafe9d45e8b6c&upstream=cuda-cudart", - "cpe": "cpe:2.3:a:cuda-toolkit-config-common:cuda-toolkit-config-common:13.2.75-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/cuda-toolkit-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&package-id=d92c6b6a51172b5d&upstream=cuda-cudart", + "cpe": "cpe:2.3:a:cuda-toolkit-config-common:cuda-toolkit-config-common:13.4.49-1:*:*:*:*:*:*:*", "name": "cuda-toolkit-config-common", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/cuda-toolkit-config-common@13.2.75-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", + "purl": "pkg:deb/ubuntu/cuda-toolkit-config-common@13.4.49-1?arch=all&distro=ubuntu-24.04&upstream=cuda-cudart", "type": "library", - "version": "13.2.75-1" + "version": "13.4.49-1" }, { "bom-ref": "pkg:deb/ubuntu/curl@8.5.0-2ubuntu10.13?arch=arm64&distro=ubuntu-24.04&package-id=cbb19dec5ef1e4f2", @@ -104221,8 +106335,8 @@ }, { "author": "Microsoft Corporation ", - "bom-ref": "pkg:pypi/debugpy@1.8.20?package-id=e2067be284465b55", - "cpe": "cpe:2.3:a:microsoft_corporation_project:python-debugpy:1.8.20:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/debugpy@1.8.21?package-id=07a2e204a2f7efce", + "cpe": "cpe:2.3:a:microsoft_corporation_project:python-debugpy:1.8.21:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -104231,14 +106345,14 @@ } ], "name": "debugpy", - "purl": "pkg:pypi/debugpy@1.8.20", + "purl": "pkg:pypi/debugpy@1.8.21", "type": "library", - "version": "1.8.20" + "version": "1.8.21" }, { "author": "Michele Simionato ", - "bom-ref": "pkg:pypi/decorator@5.2.1?package-id=c7af6b5f314e1dde", - "cpe": "cpe:2.3:a:python:decorator:5.2.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/decorator@5.3.1?package-id=93f4cf01bc9d0f69", + "cpe": "cpe:2.3:a:python:decorator:5.3.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -104247,9 +106361,9 @@ } ], "name": "decorator", - "purl": "pkg:pypi/decorator@5.2.1", + "purl": "pkg:pypi/decorator@5.3.1", "type": "library", - "version": "5.2.1" + "version": "5.3.1" }, { "author": "Christian Heimes ", @@ -104269,8 +106383,8 @@ }, { "author": "The Hugging Face team (past and future) with the help of all our contributors (https://github.com/huggingface/diffusers/graphs/contributors) ", - "bom-ref": "pkg:pypi/diffusers@0.39.0?package-id=bcf7b662c7411fde", - "cpe": "cpe:2.3:a:hugging_face_team_\\(past_and_future\\)_with_the_help_of_all_our_contributors_\\(https\\:\\/\\/github_com\\/huggingface\\/diffusers\\/graphs\\/contributors\\)_project:python-diffusers:0.39.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/diffusers@0.40.0?package-id=bce16e24907d3d79", + "cpe": "cpe:2.3:a:hugging_face_team_\\(past_and_future\\)_with_the_help_of_all_our_contributors_\\(https\\:\\/\\/github_com\\/huggingface\\/diffusers\\/graphs\\/contributors\\)_project:python-diffusers:0.40.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -104279,9 +106393,9 @@ } ], "name": "diffusers", - "purl": "pkg:pypi/diffusers@0.39.0", + "purl": "pkg:pypi/diffusers@0.40.0", "type": "library", - "version": "0.39.0" + "version": "0.40.0" }, { "bom-ref": "pkg:deb/ubuntu/diffutils@1%3A3.10-1build1?arch=arm64&distro=ubuntu-24.04&package-id=2fceb719b9c3a42a", @@ -104309,13 +106423,85 @@ "version": "0.3.8" }, { - "bom-ref": "pkg:deb/ubuntu/dirmngr@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&package-id=842b8d09ed9186bd&upstream=gnupg2", - "cpe": "cpe:2.3:a:dirmngr:dirmngr:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/dirmngr@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&package-id=dd3b3ecb7387f229&upstream=gnupg2", + "cpe": "cpe:2.3:a:dirmngr:dirmngr:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "dirmngr", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/dirmngr@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/dirmngr@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { "author": "Brian Ward ", @@ -104455,8 +106641,8 @@ }, { "author": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "bom-ref": "pkg:pypi/fastapi@0.121.3?package-id=a939de471190d282", - "cpe": "cpe:2.3:a:python-fastapi:python-fastapi:0.121.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/fastapi@0.141.1?package-id=cc4ee4e76c262b60", + "cpe": "cpe:2.3:a:python-fastapi:python-fastapi:0.141.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -104465,36 +106651,36 @@ } ], "name": "fastapi", - "purl": "pkg:pypi/fastapi@0.121.3", + "purl": "pkg:pypi/fastapi@0.141.1", "type": "library", - "version": "0.121.3" + "version": "0.141.1" }, { "author": "Michal Horejsek ", - "bom-ref": "pkg:pypi/fastjsonschema@2.21.2?package-id=877ecd750c397004", - "cpe": "cpe:2.3:a:michal_horejsek_project:python-fastjsonschema:2.21.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/fastjsonschema@2.22.2?package-id=e83d3f49cf4720df", + "cpe": "cpe:2.3:a:michal_horejsek_project:python-fastjsonschema:2.22.2:*:*:*:*:*:*:*", "licenses": [ { "license": { - "name": "BSD" + "id": "BSD-3-Clause" } } ], "name": "fastjsonschema", - "purl": "pkg:pypi/fastjsonschema@2.21.2", + "purl": "pkg:pypi/fastjsonschema@2.22.2", "type": "library", - "version": "2.21.2" + "version": "2.22.2" }, { - "bom-ref": "pkg:generic/ffmpeg@62.12.100?package-id=3f106669acf58503", - "cpe": "cpe:2.3:a:ffmpeg:ffmpeg:62.12.100:*:*:*:*:*:*:*", + "bom-ref": "pkg:generic/ffmpeg@62.12.101?package-id=d71b8b03893dfd28", + "cpe": "cpe:2.3:a:ffmpeg:ffmpeg:62.12.101:*:*:*:*:*:*:*", "name": "ffmpeg", - "purl": "pkg:generic/ffmpeg@62.12.100", + "purl": "pkg:generic/ffmpeg@62.12.101", "type": "application", - "version": "62.12.100" + "version": "62.12.101" }, { - "bom-ref": "pkg:generic/ffmpeg@7.1?package-id=b8705f84b9eef814", + "bom-ref": "pkg:generic/ffmpeg@7.1?package-id=01c534687b4cef22", "cpe": "cpe:2.3:a:ffmpeg:ffmpeg:7.1:*:*:*:*:*:*:*", "name": "ffmpeg", "purl": "pkg:generic/ffmpeg@7.1", @@ -104511,8 +106697,8 @@ "version": "1:5.45-3build1" }, { - "bom-ref": "pkg:pypi/filelock@3.29.0?package-id=0095db035e20c200", - "cpe": "cpe:2.3:a:python-filelock:python-filelock:3.29.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/filelock@3.32.3?package-id=7dbee281289e5528", + "cpe": "cpe:2.3:a:python-filelock:python-filelock:3.32.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -104521,9 +106707,9 @@ } ], "name": "filelock", - "purl": "pkg:pypi/filelock@3.29.0", + "purl": "pkg:pypi/filelock@3.32.3", "type": "library", - "version": "3.29.0" + "version": "3.32.3" }, { "bom-ref": "pkg:deb/ubuntu/findutils@4.9.0-5build1?arch=arm64&distro=ubuntu-24.04&package-id=26ecea5103d7d55c", @@ -104536,18 +106722,18 @@ }, { "author": "Tri Dao ", - "bom-ref": "pkg:pypi/flash-attn@2.7.4.post1%2Bgit5231d95fe1.45164347?package-id=779c9d8557d3ee89", - "cpe": "cpe:2.3:a:python-flash-attn:python-flash-attn:2.7.4.post1\\+git5231d95fe1.45164347:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/flash-attn@2.7.4.post1%2Bgit5231d95fe1.54157505?package-id=947086c456daaecc", + "cpe": "cpe:2.3:a:python-flash-attn:python-flash-attn:2.7.4.post1\\+git5231d95fe1.54157505:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///opt/transfer/flash_attn-2.7.4.post1%2Bgit5231d95fe1.45164347-cp312-cp312-linux_aarch64.whl" + "url": "file:///opt/transfer/flash_attn-2.7.4.post1%2Bgit5231d95fe1.54157505-cp312-cp312-linux_aarch64.whl" } ], "name": "flash-attn", - "purl": "pkg:pypi/flash-attn@2.7.4.post1%2Bgit5231d95fe1.45164347", + "purl": "pkg:pypi/flash-attn@2.7.4.post1%2Bgit5231d95fe1.54157505", "type": "library", - "version": "2.7.4.post1+git5231d95fe1.45164347" + "version": "2.7.4.post1+git5231d95fe1.54157505" }, { "author": "Tri Dao", @@ -104567,8 +106753,8 @@ }, { "author": "FlashInfer team", - "bom-ref": "pkg:pypi/flashinfer-python@0.6.16?package-id=526118a2612583a9", - "cpe": "cpe:2.3:a:python-flashinfer-python:python-flashinfer-python:0.6.16:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/flashinfer-python@0.6.18?package-id=3113cc626a8d7bc0", + "cpe": "cpe:2.3:a:python-flashinfer-python:python-flashinfer-python:0.6.18:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -104577,36 +106763,9 @@ } ], "name": "flashinfer-python", - "purl": "pkg:pypi/flashinfer-python@0.6.16", + "purl": "pkg:pypi/flashinfer-python@0.6.18", "type": "library", - "version": "0.6.16" - }, - { - "author": "The FlatBuffers project", - "bom-ref": "pkg:npm/flatbuffers@23.3.3?package-id=d0f2a9e8f035f343", - "cpe": "cpe:2.3:a:flatbuffers:flatbuffers:23.3.3:*:*:*:*:*:*:*", - "description": "Memory Efficient Serialization Library", - "externalReferences": [ - { - "type": "distribution", - "url": "git+https://github.com/google/flatbuffers.git" - }, - { - "type": "website", - "url": "https://google.github.io/flatbuffers/" - } - ], - "licenses": [ - { - "license": { - "name": "SEE LICENSE IN LICENSE.txt" - } - } - ], - "name": "flatbuffers", - "purl": "pkg:npm/flatbuffers@23.3.3", - "type": "library", - "version": "23.3.3" + "version": "0.6.18" }, { "author": "The FlatBuffers project", @@ -104644,15 +106803,6 @@ "type": "library", "version": "1.0.0" }, - { - "author": "mustii@mmk.one", - "bom-ref": "pkg:npm/flatbuffers-js-grpc@1.0.0?package-id=4cf105bceac0b987", - "cpe": "cpe:2.3:a:flatbuffers-js-grpc:flatbuffers-js-grpc:1.0.0:*:*:*:*:*:*:*", - "name": "flatbuffers-js-grpc", - "purl": "pkg:npm/flatbuffers-js-grpc@1.0.0", - "type": "library", - "version": "1.0.0" - }, { "bom-ref": "pkg:deb/ubuntu/fontconfig@2.15.0-1.1ubuntu2?arch=arm64&distro=ubuntu-24.04&package-id=54945d0ab95b1dc4", "cpe": "cpe:2.3:a:fontconfig:fontconfig:2.15.0-1.1ubuntu2:*:*:*:*:*:*:*", @@ -104691,8 +106841,8 @@ }, { "author": "Just van Rossum ", - "bom-ref": "pkg:pypi/fonttools@4.62.1?package-id=5dc7c0f6c3888ff9", - "cpe": "cpe:2.3:a:fonttools:fonttools:4.62.1:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/fonttools@4.63.0?package-id=9dd2f65203e1252f", + "cpe": "cpe:2.3:a:fonttools:fonttools:4.63.0:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -104701,9 +106851,9 @@ } ], "name": "fonttools", - "purl": "pkg:pypi/fonttools@4.62.1", + "purl": "pkg:pypi/fonttools@4.63.0", "type": "library", - "version": "4.62.1" + "version": "4.63.0" }, { "author": "ypcrts ", @@ -104784,14 +106934,6 @@ "type": "library", "version": "unknown" }, - { - "bom-ref": "pkg:deb/ubuntu/g%2B%2B@unknown?package-id=502119f196593efb", - "cpe": "cpe:2.3:a:g\\+\\+:g\\+\\+:unknown:*:*:*:*:*:*:*", - "name": "g++", - "purl": "pkg:deb/ubuntu/g%2B%2B@unknown", - "type": "library", - "version": "unknown" - }, { "bom-ref": "pkg:deb/ubuntu/g%2B%2B-13@13.3.0-6ubuntu2~24.04.1?arch=arm64&distro=ubuntu-24.04&package-id=0910e0c74a851bb7&upstream=gcc-13", "cpe": "cpe:2.3:a:g\\+\\+-13:g\\+\\+-13:13.3.0-6ubuntu2\\~24.04.1:*:*:*:*:*:*:*", @@ -104915,14 +107057,6 @@ "type": "library", "version": "unknown" }, - { - "bom-ref": "pkg:deb/ubuntu/git@unknown?package-id=f0910012411dcb18", - "cpe": "cpe:2.3:a:git:git:unknown:*:*:*:*:*:*:*", - "name": "git", - "purl": "pkg:deb/ubuntu/git@unknown", - "type": "library", - "version": "unknown" - }, { "bom-ref": "pkg:deb/ubuntu/git-lfs@3.4.1-1ubuntu0.4?arch=arm64&distro=ubuntu-24.04&package-id=db852a3b3eb49630", "cpe": "cpe:2.3:a:git-lfs:git-lfs:3.4.1-1ubuntu0.4:*:*:*:*:*:*:*", @@ -105599,8 +107733,8 @@ }, { "author": "Sebastian Thiel, Michael Trier ", - "bom-ref": "pkg:pypi/gitpython@3.1.60?package-id=f14f20fb5c2dfd0b", - "cpe": "cpe:2.3:a:sebastian_thiel\\,_michael_trier_project:python-gitpython:3.1.60:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/gitpython@3.1.62?package-id=89d7a6b4be6229c0", + "cpe": "cpe:2.3:a:sebastian_thiel\\,_michael_trier_project:python-gitpython:3.1.62:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105609,31 +107743,175 @@ } ], "name": "gitpython", - "purl": "pkg:pypi/gitpython@3.1.60", + "purl": "pkg:pypi/gitpython@3.1.62", "type": "library", - "version": "3.1.60" + "version": "3.1.62" }, { - "bom-ref": "pkg:deb/ubuntu/gnupg@2.4.4-2ubuntu17.4?arch=all&distro=ubuntu-24.04&package-id=22d9c42230eddb9f&upstream=gnupg2", - "cpe": "cpe:2.3:a:gnupg:gnupg:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gnupg@2.4.4-2ubuntu17.6?arch=all&distro=ubuntu-24.04&package-id=a4b63a4bf6a5b600&upstream=gnupg2", + "cpe": "cpe:2.3:a:gnupg:gnupg:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gnupg", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gnupg@2.4.4-2ubuntu17.4?arch=all&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gnupg@2.4.4-2ubuntu17.6?arch=all&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gnupg-utils@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&package-id=f3daf0c3688558f7&upstream=gnupg2", - "cpe": "cpe:2.3:a:gnupg-utils:gnupg-utils:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gnupg-utils@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&package-id=24221f4379442ce3&upstream=gnupg2", + "cpe": "cpe:2.3:a:gnupg-utils:gnupg-utils:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gnupg-utils", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gnupg-utils@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gnupg-utils@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gnupg2@2.4.4-2ubuntu17.4?arch=all&distro=ubuntu-24.04&package-id=e142bd5d4b7b4484", - "cpe": "cpe:2.3:a:gnupg2:gnupg2:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gnupg2@2.4.4-2ubuntu17.6?arch=all&distro=ubuntu-24.04&package-id=2f2693a0f011ed27", + "cpe": "cpe:2.3:a:gnupg2:gnupg2:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -105708,9 +107986,9 @@ ], "name": "gnupg2", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gnupg2@2.4.4-2ubuntu17.4?arch=all&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/gnupg2@2.4.4-2ubuntu17.6?arch=all&distro=ubuntu-24.04", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { "bom-ref": "pkg:golang/go.etcd.io/bbolt@v1.5.0?package-id=4c8b9e2793236dae", @@ -106154,8 +108432,8 @@ }, { "author": "Google LLC ", - "bom-ref": "pkg:pypi/google-api-core@2.34.0?package-id=c7e3ea3a4843acb6", - "cpe": "cpe:2.3:a:google_llc_\\", - "bom-ref": "pkg:pypi/google-auth@2.57.0?package-id=b7481dc72e4131b7", - "cpe": "cpe:2.3:a:google_cloud_platform_project:python-google-auth:2.57.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/google-auth@2.58.0?package-id=5b125c83ad44cd44", + "cpe": "cpe:2.3:a:google_cloud_platform_project:python-google-auth:2.58.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106180,9 +108458,9 @@ } ], "name": "google-auth", - "purl": "pkg:pypi/google-auth@2.57.0", + "purl": "pkg:pypi/google-auth@2.58.0", "type": "library", - "version": "2.57.0" + "version": "2.58.0" }, { "author": "Google LLC ", @@ -106202,8 +108480,8 @@ }, { "author": "Google LLC ", - "bom-ref": "pkg:pypi/google-cloud-storage@3.13.1?package-id=2e00844ff60b43d5", - "cpe": "cpe:2.3:a:googleapis_packages_project:python-google-cloud-storage:3.13.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/google-cloud-storage@3.14.1?package-id=6fb7506f4b1231bc", + "cpe": "cpe:2.3:a:googleapis_packages_project:python-google-cloud-storage:3.14.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106212,9 +108490,9 @@ } ], "name": "google-cloud-storage", - "purl": "pkg:pypi/google-cloud-storage@3.13.1", + "purl": "pkg:pypi/google-cloud-storage@3.14.1", "type": "library", - "version": "3.13.1" + "version": "3.14.1" }, { "author": "Google LLC ", @@ -106225,29 +108503,6 @@ "type": "library", "version": "1.8.0" }, - { - "author": "Google Protocol Buffers Team", - "bom-ref": "pkg:npm/google-protobuf@3.13.0?package-id=361593f77fd7eb71", - "cpe": "cpe:2.3:a:google-protobuf:google-protobuf:3.13.0:*:*:*:*:*:*:*", - "description": "Protocol Buffers for JavaScript", - "externalReferences": [ - { - "type": "distribution", - "url": "https://github.com/protocolbuffers/protobuf/tree/master/js" - } - ], - "licenses": [ - { - "license": { - "id": "BSD-3-Clause" - } - } - ], - "name": "google-protobuf", - "purl": "pkg:npm/google-protobuf@3.13.0", - "type": "library", - "version": "3.13.0" - }, { "author": "Google Cloud Platform ", "bom-ref": "pkg:pypi/google-resumable-media@2.10.2?package-id=999e65131443238a", @@ -106362,19 +108617,19 @@ }, { "author": "Google LLC ", - "bom-ref": "pkg:pypi/googleapis-common-protos@1.75.2?package-id=d1d5a15e8e4454f0", - "cpe": "cpe:2.3:a:google_llc_\\", - "purl": "pkg:deb/ubuntu/gpg@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpg@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gpg-agent@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&package-id=45fe9bf618cf2e8d&upstream=gnupg2", - "cpe": "cpe:2.3:a:gpg-agent:gpg-agent:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gpg-agent@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&package-id=83077b093e1da55b&upstream=gnupg2", + "cpe": "cpe:2.3:a:gpg-agent:gpg-agent:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gpg-agent", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gpg-agent@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpg-agent@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&package-id=2609854edc7ee092&upstream=gnupg2", - "cpe": "cpe:2.3:a:gpgconf:gpgconf:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&package-id=9642db6e02cf7570&upstream=gnupg2", + "cpe": "cpe:2.3:a:gpgconf:gpgconf:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gpgconf", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpgconf@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gpgsm@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&package-id=9af807701e1896d8&upstream=gnupg2", - "cpe": "cpe:2.3:a:gpgsm:gpgsm:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gpgsm@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&package-id=2fb17ef84c375b45&upstream=gnupg2", + "cpe": "cpe:2.3:a:gpgsm:gpgsm:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gpgsm", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gpgsm@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpgsm@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { - "bom-ref": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&package-id=4d7510b216509e27&upstream=gnupg2", - "cpe": "cpe:2.3:a:gpgv:gpgv:2.4.4-2ubuntu17.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&package-id=d87c051d07de62b6&upstream=gnupg2", + "cpe": "cpe:2.3:a:gpgv:gpgv:2.4.4-2ubuntu17.6:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + }, + { + "license": { + "id": "CC0-1.0" + } + }, + { + "license": { + "id": "GPL-2.0-or-later" + } + }, + { + "license": { + "id": "GPL-2.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-only" + } + }, + { + "license": { + "id": "GPL-3.0-or-later" + } + }, + { + "license": { + "id": "LGPL-2.1-only" + } + }, + { + "license": { + "id": "LGPL-2.1-or-later" + } + }, + { + "license": { + "id": "LGPL-3.0-only" + } + }, + { + "license": { + "id": "LGPL-3.0-or-later" + } + }, + { + "license": { + "name": "Expat" + } + }, + { + "license": { + "name": "RFC-Reference" + } + }, + { + "license": { + "name": "TinySCHEME" + } + }, + { + "license": { + "name": "permissive" + } + } + ], "name": "gpgv", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/gpgv@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { "bom-ref": "pkg:maven/gradle-wrapper/gradle-wrapper@4.10.3?package-id=bcc3546816a7cad4", @@ -106488,26 +109103,6 @@ "type": "library", "version": "UNKNOWN" }, - { - "bom-ref": "pkg:maven/gradle-wrapper/gradle-wrapper?package-id=5aea471523aa1189", - "cpe": "cpe:2.3:a:gradle-wrapper:gradle-wrapper:*:*:*:*:*:*:*:*", - "externalReferences": [ - { - "hashes": [ - { - "alg": "SHA-1", - "content": "2aa1e772a1dc5a9b15d50443db4731b25180d58e" - } - ], - "type": "build-meta", - "url": "" - } - ], - "name": "gradle-wrapper", - "purl": "pkg:maven/gradle-wrapper/gradle-wrapper", - "type": "library", - "version": "UNKNOWN" - }, { "bom-ref": "pkg:maven/gradle-wrapper/gradle-wrapper?package-id=7f08991ceca4f87a", "cpe": "cpe:2.3:a:gradle-wrapper:gradle-wrapper:*:*:*:*:*:*:*:*", @@ -106528,26 +109123,6 @@ "type": "library", "version": "UNKNOWN" }, - { - "bom-ref": "pkg:maven/gradle-wrapper/gradle-wrapper?package-id=bf71094a406b9440", - "cpe": "cpe:2.3:a:gradle-wrapper:gradle-wrapper:*:*:*:*:*:*:*:*", - "externalReferences": [ - { - "hashes": [ - { - "alg": "SHA-1", - "content": "2aa1e772a1dc5a9b15d50443db4731b25180d58e" - } - ], - "type": "build-meta", - "url": "" - } - ], - "name": "gradle-wrapper", - "purl": "pkg:maven/gradle-wrapper/gradle-wrapper", - "type": "library", - "version": "UNKNOWN" - }, { "author": "Sebastian Bank ", "bom-ref": "pkg:pypi/graphviz@0.21?package-id=9fb5588ad0e033be", @@ -106584,8 +109159,8 @@ }, { "author": "The gRPC Authors ", - "bom-ref": "pkg:pypi/grpcio@1.80.0?package-id=a121394d8e66a526", - "cpe": "cpe:2.3:a:grpc_authors_\\", + "bom-ref": "pkg:pypi/grpcio-tools@1.81.1?package-id=06d0e1bfda5b1a4e", + "cpe": "cpe:2.3:a:grpc_authors_\\", - "purl": "pkg:deb/ubuntu/gzip@1.12-1ubuntu3.1?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/gzip@1.12-1ubuntu3.2?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "1.12-1ubuntu3.1" + "version": "1.12-1ubuntu3.2" }, { "author": "Nathaniel J. Smith ", @@ -106668,8 +109259,8 @@ "version": "3.12.1" }, { - "bom-ref": "pkg:pypi/hf-xet@1.5.0?package-id=483a6c17506412ff", - "cpe": "cpe:2.3:a:python-hf-xet:python-hf-xet:1.5.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/hf-xet@1.6.0?package-id=de85004f76dd1e68", + "cpe": "cpe:2.3:a:python-hf-xet:python-hf-xet:1.6.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106678,9 +109269,9 @@ } ], "name": "hf-xet", - "purl": "pkg:pypi/hf-xet@1.5.0", + "purl": "pkg:pypi/hf-xet@1.6.0", "type": "library", - "version": "1.5.0" + "version": "1.6.0" }, { "bom-ref": "pkg:deb/ubuntu/hostname@3.23%2Bnmu2ubuntu2?arch=arm64&distro=ubuntu-24.04&package-id=de850b4e6bacd8ab", @@ -106788,8 +109379,8 @@ }, { "author": "Hugging Face, Inc. ", - "bom-ref": "pkg:pypi/huggingface-hub@1.14.0?package-id=5222bf53656140b1", - "cpe": "cpe:2.3:a:hugging_face\\,_inc__project:python-huggingface-hub:1.14.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/huggingface-hub@1.28.0?package-id=937925eb9b966be3", + "cpe": "cpe:2.3:a:hugging_face\\,_inc__project:python-huggingface-hub:1.28.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106798,9 +109389,9 @@ } ], "name": "huggingface-hub", - "purl": "pkg:pypi/huggingface-hub@1.14.0", + "purl": "pkg:pypi/huggingface-hub@1.28.0", "type": "library", - "version": "1.14.0" + "version": "1.28.0" }, { "author": "Jason Moiron ", @@ -106828,7 +109419,7 @@ "version": "0.379-1" }, { - "bom-ref": "pkg:deb/ubuntu/ibverbs-providers@50.0-2ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=0ca9110d9a8a9f46&upstream=rdma-core", + "bom-ref": "pkg:deb/ubuntu/ibverbs-providers@50.0-2ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=8679132a743145d5&upstream=rdma-core", "cpe": "cpe:2.3:a:ibverbs-providers:ibverbs-providers:50.0-2ubuntu0.2:*:*:*:*:*:*:*", "name": "ibverbs-providers", "publisher": "Benjamin Drung ", @@ -106966,8 +109557,8 @@ }, { "author": "IPython Development Team ", - "bom-ref": "pkg:pypi/ipykernel@7.2.0?package-id=4f68e3ce698ff161", - "cpe": "cpe:2.3:a:ipython_development_team_\\", - "bom-ref": "pkg:pypi/ipython@9.13.0?package-id=f7ef6b73f6d5f50c", - "cpe": "cpe:2.3:a:ipython_development_team_project:python-ipython:9.13.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/ipython@9.16.1?package-id=0473b4da0a722344", + "cpe": "cpe:2.3:a:ipython_development_team_project:python-ipython:9.16.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -106992,9 +109583,9 @@ } ], "name": "ipython", - "purl": "pkg:pypi/ipython@9.13.0", + "purl": "pkg:pypi/ipython@9.16.1", "type": "library", - "version": "9.13.0" + "version": "9.16.1" }, { "author": "The IPython Development Team ", @@ -107182,8 +109773,8 @@ }, { "author": "Samuel Colvin ", - "bom-ref": "pkg:pypi/jiter@0.16.0?package-id=85d3222e2e58a6d4", - "cpe": "cpe:2.3:a:samuel_colvin_\\", @@ -107214,8 +109805,8 @@ }, { "author": "Gael Varoquaux ", - "bom-ref": "pkg:pypi/joblib@1.5.3?package-id=26c11f789d86f578", - "cpe": "cpe:2.3:a:gael_varoquaux_\\", - "bom-ref": "pkg:pypi/json5@0.14.0?package-id=84e1495653868082", - "cpe": "cpe:2.3:a:dirk_pranke_\\", @@ -107318,8 +109909,22 @@ }, { "author": "Jupyter Development Team ", - "bom-ref": "pkg:pypi/jupyter-client@8.8.0?package-id=bff5b1782a37aba6", - "cpe": "cpe:2.3:a:jupyter_development_team_\\", + "bom-ref": "pkg:pypi/jupyter-client@8.9.1?package-id=cab420591b1d534a", + "cpe": "cpe:2.3:a:jupyter_development_team_\\", @@ -107382,7 +109987,7 @@ }, { "author": "Jupyter Development Team ", - "bom-ref": "pkg:pypi/jupyter-server@2.20.0?package-id=1ad5f6bf18dd61fb", + "bom-ref": "pkg:pypi/jupyter-server@2.20.0?package-id=79beb747b64f9597", "cpe": "cpe:2.3:a:jupyter_development_team_\\", - "bom-ref": "pkg:pypi/jupyterlab@4.5.10?package-id=1fcc480290732afc", - "cpe": "cpe:2.3:a:jupyter_development_team_\\", - "bom-ref": "pkg:pypi/jupyterlab-code-formatter@3.0.3?package-id=1882d284ba6ecd11", - "cpe": "cpe:2.3:a:python-jupyterlab-code-formatter:python-jupyterlab-code-formatter:3.0.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/jupyterlab-code-formatter@3.1.0?package-id=ed4fb147d4620446", + "cpe": "cpe:2.3:a:python-jupyterlab-code-formatter:python-jupyterlab-code-formatter:3.1.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -107440,23 +110045,23 @@ } ], "name": "jupyterlab-code-formatter", - "purl": "pkg:pypi/jupyterlab-code-formatter@3.0.3", + "purl": "pkg:pypi/jupyterlab-code-formatter@3.1.0", "type": "library", - "version": "3.0.3" + "version": "3.1.0" }, { "author": "Marc Wouts", - "bom-ref": "pkg:npm/jupyterlab-jupytext@1.4.6?package-id=4e3b198710e1c486", + "bom-ref": "pkg:npm/jupyterlab-jupytext@1.4.6?package-id=6a28a4d78a1a8b91", "cpe": "cpe:2.3:a:jupyterlab-jupytext:jupyterlab-jupytext:1.4.6:*:*:*:*:*:*:*", "description": "Save Jupyter Notebooks as Scripts or Markdown files that work well with version control & external text editors", "externalReferences": [ { "type": "distribution", - "url": "https://github.com/mwouts/jupytext.git" + "url": "https://github.com/jupytext/jupytext.git" }, { "type": "website", - "url": "https://github.com/mwouts/jupytext/tree/main/jupyterlab/packages/jupyterlab-jupytext" + "url": "https://github.com/jupytext/jupytext/tree/main/jupyterlab/packages/jupyterlab-jupytext-extension" } ], "licenses": [ @@ -107473,17 +110078,17 @@ }, { "author": "Marc Wouts", - "bom-ref": "pkg:npm/jupyterlab-jupytext@1.4.6?package-id=8128afc2d203d24c", + "bom-ref": "pkg:npm/jupyterlab-jupytext@1.4.6?package-id=ce13fc66dfd2463b", "cpe": "cpe:2.3:a:jupyterlab-jupytext:jupyterlab-jupytext:1.4.6:*:*:*:*:*:*:*", "description": "Save Jupyter Notebooks as Scripts or Markdown files that work well with version control & external text editors", "externalReferences": [ { "type": "distribution", - "url": "https://github.com/mwouts/jupytext.git" + "url": "https://github.com/jupytext/jupytext.git" }, { "type": "website", - "url": "https://github.com/mwouts/jupytext/tree/main/jupyterlab/packages/jupyterlab-jupytext" + "url": "https://github.com/jupytext/jupytext/tree/main/jupyterlab/packages/jupyterlab-jupytext-extension" } ], "licenses": [ @@ -107578,7 +110183,7 @@ }, { "author": "aircloud ", - "bom-ref": "pkg:pypi/jupyterlab-tensorboard-pro@4.0.0?package-id=4104baa4dbbf1e6f", + "bom-ref": "pkg:pypi/jupyterlab-tensorboard-pro@4.0.0?package-id=ca9e37b9141560f5", "cpe": "cpe:2.3:a:python-jupyterlab-tensorboard-pro:python-jupyterlab-tensorboard-pro:4.0.0:*:*:*:*:*:*:*", "externalReferences": [ { @@ -107600,20 +110205,30 @@ }, { "author": "Ryan Tam ", - "bom-ref": "pkg:npm/jupyterlab_code_formatter@3.0.3?package-id=6224e6d0c5e58cff", - "cpe": "cpe:2.3:a:jupyterlab-code-formatter:jupyterlab-code-formatter:3.0.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:npm/jupyterlab_code_formatter@3.1.0?package-id=69d117b4c35c3229", + "cpe": "cpe:2.3:a:jupyterlab-code-formatter:jupyterlab-code-formatter:3.1.0:*:*:*:*:*:*:*", "description": " A JupyterLab plugin to facilitate invocation of code formatters.", + "externalReferences": [ + { + "type": "distribution", + "url": "https://github.com/jupyterlab-contrib/jupyterlab_code_formatter.git" + }, + { + "type": "website", + "url": "https://github.com/jupyterlab-contrib/jupyterlab_code_formatter" + } + ], "licenses": [ { "license": { - "id": "BSD-3-Clause" + "id": "MIT" } } ], "name": "jupyterlab_code_formatter", - "purl": "pkg:npm/jupyterlab_code_formatter@3.0.3", + "purl": "pkg:npm/jupyterlab_code_formatter@3.1.0", "type": "library", - "version": "3.0.3" + "version": "3.1.0" }, { "author": "Jupyter Development Team ", @@ -107698,8 +110313,8 @@ }, { "author": "Marc Wouts ", - "bom-ref": "pkg:pypi/jupytext@1.19.1?package-id=51216ce4bd343e82", - "cpe": "cpe:2.3:a:marc_wouts_\\", - "purl": "pkg:deb/ubuntu/keyboxd@2.4.4-2ubuntu17.4?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", + "purl": "pkg:deb/ubuntu/keyboxd@2.4.4-2ubuntu17.6?arch=arm64&distro=ubuntu-24.04&upstream=gnupg2", "type": "library", - "version": "2.4.4-2ubuntu17.4" + "version": "2.4.4-2ubuntu17.6" }, { "author": "The Nucleic Development Team ", @@ -107847,22 +110534,22 @@ "version": "14.2.0-4ubuntu2~24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/libasound2-data@1.2.11-1ubuntu0.2?arch=all&distro=ubuntu-24.04&package-id=b336b82fe1091b4a&upstream=alsa-lib", - "cpe": "cpe:2.3:a:libasound2-data:libasound2-data:1.2.11-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libasound2-data@1.2.11-1ubuntu0.3?arch=all&distro=ubuntu-24.04&package-id=b68afabb5346d1ac&upstream=alsa-lib", + "cpe": "cpe:2.3:a:libasound2-data:libasound2-data:1.2.11-1ubuntu0.3:*:*:*:*:*:*:*", "name": "libasound2-data", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libasound2-data@1.2.11-1ubuntu0.2?arch=all&distro=ubuntu-24.04&upstream=alsa-lib", + "purl": "pkg:deb/ubuntu/libasound2-data@1.2.11-1ubuntu0.3?arch=all&distro=ubuntu-24.04&upstream=alsa-lib", "type": "library", - "version": "1.2.11-1ubuntu0.2" + "version": "1.2.11-1ubuntu0.3" }, { - "bom-ref": "pkg:deb/ubuntu/libasound2t64@1.2.11-1ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=252027f090633861&upstream=alsa-lib", - "cpe": "cpe:2.3:a:libasound2t64:libasound2t64:1.2.11-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libasound2t64@1.2.11-1ubuntu0.3?arch=arm64&distro=ubuntu-24.04&package-id=3b3b99f2ca3e63f3&upstream=alsa-lib", + "cpe": "cpe:2.3:a:libasound2t64:libasound2t64:1.2.11-1ubuntu0.3:*:*:*:*:*:*:*", "name": "libasound2t64", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libasound2t64@1.2.11-1ubuntu0.2?arch=arm64&distro=ubuntu-24.04&upstream=alsa-lib", + "purl": "pkg:deb/ubuntu/libasound2t64@1.2.11-1ubuntu0.3?arch=arm64&distro=ubuntu-24.04&upstream=alsa-lib", "type": "library", - "version": "1.2.11-1ubuntu0.2" + "version": "1.2.11-1ubuntu0.3" }, { "bom-ref": "pkg:deb/ubuntu/libassuan0@2.5.6-1build1?arch=arm64&distro=ubuntu-24.04&package-id=23db51795bbc4a64&upstream=libassuan", @@ -108000,40 +110687,40 @@ "version": "1.0.8-5.1build0.1" }, { - "bom-ref": "pkg:deb/ubuntu/libc-bin@2.39-0ubuntu8.7?arch=arm64&distro=ubuntu-24.04&package-id=bb9ff0ca2181d80f&upstream=glibc", - "cpe": "cpe:2.3:a:libc-bin:libc-bin:2.39-0ubuntu8.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libc-bin@2.39-0ubuntu8.8?arch=arm64&distro=ubuntu-24.04&package-id=8127da60e978e816&upstream=glibc", + "cpe": "cpe:2.3:a:libc-bin:libc-bin:2.39-0ubuntu8.8:*:*:*:*:*:*:*", "name": "libc-bin", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libc-bin@2.39-0ubuntu8.7?arch=arm64&distro=ubuntu-24.04&upstream=glibc", + "purl": "pkg:deb/ubuntu/libc-bin@2.39-0ubuntu8.8?arch=arm64&distro=ubuntu-24.04&upstream=glibc", "type": "library", - "version": "2.39-0ubuntu8.7" + "version": "2.39-0ubuntu8.8" }, { - "bom-ref": "pkg:deb/ubuntu/libc-dev-bin@2.39-0ubuntu8.7?arch=arm64&distro=ubuntu-24.04&package-id=3245a29b49ba0a07&upstream=glibc", - "cpe": "cpe:2.3:a:libc-dev-bin:libc-dev-bin:2.39-0ubuntu8.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libc-dev-bin@2.39-0ubuntu8.8?arch=arm64&distro=ubuntu-24.04&package-id=1b296ac39cfefb63&upstream=glibc", + "cpe": "cpe:2.3:a:libc-dev-bin:libc-dev-bin:2.39-0ubuntu8.8:*:*:*:*:*:*:*", "name": "libc-dev-bin", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libc-dev-bin@2.39-0ubuntu8.7?arch=arm64&distro=ubuntu-24.04&upstream=glibc", + "purl": "pkg:deb/ubuntu/libc-dev-bin@2.39-0ubuntu8.8?arch=arm64&distro=ubuntu-24.04&upstream=glibc", "type": "library", - "version": "2.39-0ubuntu8.7" + "version": "2.39-0ubuntu8.8" }, { - "bom-ref": "pkg:deb/ubuntu/libc6@2.39-0ubuntu8.7?arch=arm64&distro=ubuntu-24.04&package-id=8737121fc3dda072&upstream=glibc", - "cpe": "cpe:2.3:a:libc6:libc6:2.39-0ubuntu8.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libc6@2.39-0ubuntu8.8?arch=arm64&distro=ubuntu-24.04&package-id=1dd3755ac73eed76&upstream=glibc", + "cpe": "cpe:2.3:a:libc6:libc6:2.39-0ubuntu8.8:*:*:*:*:*:*:*", "name": "libc6", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libc6@2.39-0ubuntu8.7?arch=arm64&distro=ubuntu-24.04&upstream=glibc", + "purl": "pkg:deb/ubuntu/libc6@2.39-0ubuntu8.8?arch=arm64&distro=ubuntu-24.04&upstream=glibc", "type": "library", - "version": "2.39-0ubuntu8.7" + "version": "2.39-0ubuntu8.8" }, { - "bom-ref": "pkg:deb/ubuntu/libc6-dev@2.39-0ubuntu8.7?arch=arm64&distro=ubuntu-24.04&package-id=85429fc158735f66&upstream=glibc", - "cpe": "cpe:2.3:a:libc6-dev:libc6-dev:2.39-0ubuntu8.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libc6-dev@2.39-0ubuntu8.8?arch=arm64&distro=ubuntu-24.04&package-id=61bf677f4161fba2&upstream=glibc", + "cpe": "cpe:2.3:a:libc6-dev:libc6-dev:2.39-0ubuntu8.8:*:*:*:*:*:*:*", "name": "libc6-dev", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libc6-dev@2.39-0ubuntu8.7?arch=arm64&distro=ubuntu-24.04&upstream=glibc", + "purl": "pkg:deb/ubuntu/libc6-dev@2.39-0ubuntu8.8?arch=arm64&distro=ubuntu-24.04&upstream=glibc", "type": "library", - "version": "2.39-0ubuntu8.7" + "version": "2.39-0ubuntu8.8" }, { "bom-ref": "pkg:deb/ubuntu/libcairo2@1.18.0-3build1?arch=arm64&distro=ubuntu-24.04&package-id=79bfa296dee26b5e&upstream=cairo", @@ -108054,13 +110741,13 @@ "version": "0.8.4-2build2" }, { - "bom-ref": "pkg:deb/ubuntu/libcap2@1%3A2.66-5ubuntu2.2?arch=arm64&distro=ubuntu-24.04&package-id=afd68fd8b05b8853", - "cpe": "cpe:2.3:a:libcap2:libcap2:1\\:2.66-5ubuntu2.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcap2@1%3A2.66-5ubuntu2.4?arch=arm64&distro=ubuntu-24.04&package-id=efdca41f1e7b6611", + "cpe": "cpe:2.3:a:libcap2:libcap2:1\\:2.66-5ubuntu2.4:*:*:*:*:*:*:*", "name": "libcap2", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libcap2@1%3A2.66-5ubuntu2.2?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/libcap2@1%3A2.66-5ubuntu2.4?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "1:2.66-5ubuntu2.2" + "version": "1:2.66-5ubuntu2.4" }, { "bom-ref": "pkg:deb/ubuntu/libcares2@1.27.0-1.0ubuntu1?arch=arm64&distro=ubuntu-24.04&package-id=9f885755347b917a&upstream=c-ares", @@ -108179,6 +110866,21 @@ "type": "library", "version": "1:4.4.36-4build1" }, + { + "bom-ref": "pkg:pypi/libcst@1.9.0?package-id=39ea83b95b870fc7", + "cpe": "cpe:2.3:a:python-libcst:python-libcst:1.9.0:*:*:*:*:*:*:*", + "licenses": [ + { + "license": { + "name": "sha256:2fd658e5a48badc2999209eb5373c4d2e240b85669c36dace90a797e6becb28d" + } + } + ], + "name": "libcst", + "purl": "pkg:pypi/libcst@1.9.0", + "type": "library", + "version": "1.9.0" + }, { "bom-ref": "pkg:deb/ubuntu/libctf-nobfd0@2.42-4ubuntu2.10?arch=arm64&distro=ubuntu-24.04&package-id=03ff54ec939da0a1&upstream=binutils", "cpe": "cpe:2.3:a:libctf-nobfd0:libctf-nobfd0:2.42-4ubuntu2.10:*:*:*:*:*:*:*", @@ -108198,40 +110900,44 @@ "version": "2.42-4ubuntu2.10" }, { - "bom-ref": "pkg:deb/ubuntu/libcublas13-cuda-13@13.4.1.2-1?arch=arm64&distro=ubuntu-24.04&package-id=a7011c6cb29c69eb&upstream=libcublas", - "cpe": "cpe:2.3:a:libcublas13-cuda-13:libcublas13-cuda-13:13.4.1.2-1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "sha256:effcd507b137a8ea489197eb46c01a694a778caf7931ef8ec1e4a602a7a8c4db" - } - } - ], - "name": "libcublas13-cuda-13", + "bom-ref": "pkg:deb/ubuntu/libcublas-13-4@13.7.0.27-1?arch=arm64&distro=ubuntu-24.04&package-id=186c4b67c0a92037&upstream=libcublas", + "cpe": "cpe:2.3:a:libcublas-13-4:libcublas-13-4:13.7.0.27-1:*:*:*:*:*:*:*", + "name": "libcublas-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcublas13-cuda-13@13.4.1.2-1?arch=arm64&distro=ubuntu-24.04&upstream=libcublas", + "purl": "pkg:deb/ubuntu/libcublas-13-4@13.7.0.27-1?arch=arm64&distro=ubuntu-24.04&upstream=libcublas", "type": "library", - "version": "13.4.1.2-1" + "version": "13.7.0.27-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcublas13-dev-cuda-13@13.4.1.2-1?arch=arm64&distro=ubuntu-24.04&package-id=ef833cb18eb183a3&upstream=libcublas", - "cpe": "cpe:2.3:a:libcublas13-dev-cuda-13:libcublas13-dev-cuda-13:13.4.1.2-1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "sha256:effcd507b137a8ea489197eb46c01a694a778caf7931ef8ec1e4a602a7a8c4db" - } - } - ], - "name": "libcublas13-dev-cuda-13", + "bom-ref": "pkg:deb/ubuntu/libcublas-dev-13-4@13.7.0.27-1?arch=arm64&distro=ubuntu-24.04&package-id=f22f7279c0f4142d&upstream=libcublas", + "cpe": "cpe:2.3:a:libcublas-dev-13-4:libcublas-dev-13-4:13.7.0.27-1:*:*:*:*:*:*:*", + "name": "libcublas-dev-13-4", + "publisher": "cudatools ", + "purl": "pkg:deb/ubuntu/libcublas-dev-13-4@13.7.0.27-1?arch=arm64&distro=ubuntu-24.04&upstream=libcublas", + "type": "library", + "version": "13.7.0.27-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libcublasmp0-cuda-13@0.10.0.3695-1?arch=arm64&distro=ubuntu-24.04&package-id=93ab9efc62a8dcb9&upstream=libcublasmp", + "cpe": "cpe:2.3:a:libcublasmp0-cuda-13:libcublasmp0-cuda-13:0.10.0.3695-1:*:*:*:*:*:*:*", + "name": "libcublasmp0-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcublas13-dev-cuda-13@13.4.1.2-1?arch=arm64&distro=ubuntu-24.04&upstream=libcublas", + "purl": "pkg:deb/ubuntu/libcublasmp0-cuda-13@0.10.0.3695-1?arch=arm64&distro=ubuntu-24.04&upstream=libcublasmp", "type": "library", - "version": "13.4.1.2-1" + "version": "0.10.0.3695-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcudnn9-cuda-13@9.22.0.52-1?arch=arm64&distro=ubuntu-24.04&package-id=7f088e9e6bfc34ad&upstream=cudnn", - "cpe": "cpe:2.3:a:libcudnn9-cuda-13:libcudnn9-cuda-13:9.22.0.52-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcublasmp0-dev-cuda-13@0.10.0.3695-1?arch=arm64&distro=ubuntu-24.04&package-id=a2f0b785ae3f393f&upstream=libcublasmp", + "cpe": "cpe:2.3:a:libcublasmp0-dev-cuda-13:libcublasmp0-dev-cuda-13:0.10.0.3695-1:*:*:*:*:*:*:*", + "name": "libcublasmp0-dev-cuda-13", + "publisher": "cudatools ", + "purl": "pkg:deb/ubuntu/libcublasmp0-dev-cuda-13@0.10.0.3695-1?arch=arm64&distro=ubuntu-24.04&upstream=libcublasmp", + "type": "library", + "version": "0.10.0.3695-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libcudnn9-cuda-13@9.25.1.1-1?arch=arm64&distro=ubuntu-24.04&package-id=84b739706400cf0e&upstream=cudnn", + "cpe": "cpe:2.3:a:libcudnn9-cuda-13:libcudnn9-cuda-13:9.25.1.1-1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -108241,13 +110947,13 @@ ], "name": "libcudnn9-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcudnn9-cuda-13@9.22.0.52-1?arch=arm64&distro=ubuntu-24.04&upstream=cudnn", + "purl": "pkg:deb/ubuntu/libcudnn9-cuda-13@9.25.1.1-1?arch=arm64&distro=ubuntu-24.04&upstream=cudnn", "type": "library", - "version": "9.22.0.52-1" + "version": "9.25.1.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcudnn9-dev-cuda-13@9.22.0.52-1?arch=arm64&distro=ubuntu-24.04&package-id=d91d8f55d303ebc3&upstream=cudnn", - "cpe": "cpe:2.3:a:libcudnn9-dev-cuda-13:libcudnn9-dev-cuda-13:9.22.0.52-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcudnn9-dev-cuda-13@9.25.1.1-1?arch=arm64&distro=ubuntu-24.04&package-id=522899328bd5dafa&upstream=cudnn", + "cpe": "cpe:2.3:a:libcudnn9-dev-cuda-13:libcudnn9-dev-cuda-13:9.25.1.1-1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -108257,13 +110963,13 @@ ], "name": "libcudnn9-dev-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcudnn9-dev-cuda-13@9.22.0.52-1?arch=arm64&distro=ubuntu-24.04&upstream=cudnn", + "purl": "pkg:deb/ubuntu/libcudnn9-dev-cuda-13@9.25.1.1-1?arch=arm64&distro=ubuntu-24.04&upstream=cudnn", "type": "library", - "version": "9.22.0.52-1" + "version": "9.25.1.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcudnn9-headers-cuda-13@9.22.0.52-1?arch=arm64&distro=ubuntu-24.04&package-id=820902970fece485&upstream=cudnn", - "cpe": "cpe:2.3:a:libcudnn9-headers-cuda-13:libcudnn9-headers-cuda-13:9.22.0.52-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcudnn9-headers-cuda-13@9.25.1.1-1?arch=arm64&distro=ubuntu-24.04&package-id=543e67b3da951772&upstream=cudnn", + "cpe": "cpe:2.3:a:libcudnn9-headers-cuda-13:libcudnn9-headers-cuda-13:9.25.1.1-1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -108273,63 +110979,72 @@ ], "name": "libcudnn9-headers-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcudnn9-headers-cuda-13@9.22.0.52-1?arch=arm64&distro=ubuntu-24.04&upstream=cudnn", + "purl": "pkg:deb/ubuntu/libcudnn9-headers-cuda-13@9.25.1.1-1?arch=arm64&distro=ubuntu-24.04&upstream=cudnn", + "type": "library", + "version": "9.25.1.1-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libcufft-13-4@12.4.0.34-1?arch=arm64&distro=ubuntu-24.04&package-id=d882533edc3e7d43&upstream=libcufft", + "cpe": "cpe:2.3:a:libcufft-13-4:libcufft-13-4:12.4.0.34-1:*:*:*:*:*:*:*", + "name": "libcufft-13-4", + "publisher": "cudatools ", + "purl": "pkg:deb/ubuntu/libcufft-13-4@12.4.0.34-1?arch=arm64&distro=ubuntu-24.04&upstream=libcufft", "type": "library", - "version": "9.22.0.52-1" + "version": "12.4.0.34-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcufft-13-2@12.2.0.46-1?arch=arm64&distro=ubuntu-24.04&package-id=b51b4b6b75a55da1&upstream=libcufft", - "cpe": "cpe:2.3:a:libcufft-13-2:libcufft-13-2:12.2.0.46-1:*:*:*:*:*:*:*", - "name": "libcufft-13-2", + "bom-ref": "pkg:deb/ubuntu/libcufft-dev-13-4@12.4.0.34-1?arch=arm64&distro=ubuntu-24.04&package-id=3d0eaf3c4b4c2f37&upstream=libcufft", + "cpe": "cpe:2.3:a:libcufft-dev-13-4:libcufft-dev-13-4:12.4.0.34-1:*:*:*:*:*:*:*", + "name": "libcufft-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcufft-13-2@12.2.0.46-1?arch=arm64&distro=ubuntu-24.04&upstream=libcufft", + "purl": "pkg:deb/ubuntu/libcufft-dev-13-4@12.4.0.34-1?arch=arm64&distro=ubuntu-24.04&upstream=libcufft", "type": "library", - "version": "12.2.0.46-1" + "version": "12.4.0.34-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcufft-dev-13-2@12.2.0.46-1?arch=arm64&distro=ubuntu-24.04&package-id=454605ab1453f337&upstream=libcufft", - "cpe": "cpe:2.3:a:libcufft-dev-13-2:libcufft-dev-13-2:12.2.0.46-1:*:*:*:*:*:*:*", - "name": "libcufft-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libcufile-13-4@1.19.0.109-1?arch=arm64&distro=ubuntu-24.04&package-id=21862cfe649620e7&upstream=libcufile", + "cpe": "cpe:2.3:a:libcufile-13-4:libcufile-13-4:1.19.0.109-1:*:*:*:*:*:*:*", + "name": "libcufile-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcufft-dev-13-2@12.2.0.46-1?arch=arm64&distro=ubuntu-24.04&upstream=libcufft", + "purl": "pkg:deb/ubuntu/libcufile-13-4@1.19.0.109-1?arch=arm64&distro=ubuntu-24.04&upstream=libcufile", "type": "library", - "version": "12.2.0.46-1" + "version": "1.19.0.109-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcufile-13-2@1.17.1.22-1?arch=arm64&distro=ubuntu-24.04&package-id=e7bf9a7bfa4776bc&upstream=libcufile", - "cpe": "cpe:2.3:a:libcufile-13-2:libcufile-13-2:1.17.1.22-1:*:*:*:*:*:*:*", - "name": "libcufile-13-2", + "bom-ref": "pkg:deb/ubuntu/libcufile-dev-13-4@1.19.0.109-1?arch=arm64&distro=ubuntu-24.04&package-id=a730be5532afe4d7&upstream=libcufile", + "cpe": "cpe:2.3:a:libcufile-dev-13-4:libcufile-dev-13-4:1.19.0.109-1:*:*:*:*:*:*:*", + "name": "libcufile-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcufile-13-2@1.17.1.22-1?arch=arm64&distro=ubuntu-24.04&upstream=libcufile", + "purl": "pkg:deb/ubuntu/libcufile-dev-13-4@1.19.0.109-1?arch=arm64&distro=ubuntu-24.04&upstream=libcufile", "type": "library", - "version": "1.17.1.22-1" + "version": "1.19.0.109-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcufile-dev-13-2@1.17.1.22-1?arch=arm64&distro=ubuntu-24.04&package-id=9c02021cf1f0baeb&upstream=libcufile", - "cpe": "cpe:2.3:a:libcufile-dev-13-2:libcufile-dev-13-2:1.17.1.22-1:*:*:*:*:*:*:*", - "name": "libcufile-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libcuobjclient-13-4@1.3.0.109-1?arch=arm64&distro=ubuntu-24.04&package-id=517517fca1ab3e24&upstream=libcuobjclient", + "cpe": "cpe:2.3:a:libcuobjclient-13-4:libcuobjclient-13-4:1.3.0.109-1:*:*:*:*:*:*:*", + "name": "libcuobjclient-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcufile-dev-13-2@1.17.1.22-1?arch=arm64&distro=ubuntu-24.04&upstream=libcufile", + "purl": "pkg:deb/ubuntu/libcuobjclient-13-4@1.3.0.109-1?arch=arm64&distro=ubuntu-24.04&upstream=libcuobjclient", "type": "library", - "version": "1.17.1.22-1" + "version": "1.3.0.109-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcurand-13-2@10.4.2.55-1?arch=arm64&distro=ubuntu-24.04&package-id=42ddfc80cadafc3d&upstream=libcurand", - "cpe": "cpe:2.3:a:libcurand-13-2:libcurand-13-2:10.4.2.55-1:*:*:*:*:*:*:*", - "name": "libcurand-13-2", + "bom-ref": "pkg:deb/ubuntu/libcurand-13-4@10.4.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=96aaa2f4407292a1&upstream=libcurand", + "cpe": "cpe:2.3:a:libcurand-13-4:libcurand-13-4:10.4.4.49-1:*:*:*:*:*:*:*", + "name": "libcurand-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcurand-13-2@10.4.2.55-1?arch=arm64&distro=ubuntu-24.04&upstream=libcurand", + "purl": "pkg:deb/ubuntu/libcurand-13-4@10.4.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=libcurand", "type": "library", - "version": "10.4.2.55-1" + "version": "10.4.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcurand-dev-13-2@10.4.2.55-1?arch=arm64&distro=ubuntu-24.04&package-id=a8b1ee01e4a2066d&upstream=libcurand", - "cpe": "cpe:2.3:a:libcurand-dev-13-2:libcurand-dev-13-2:10.4.2.55-1:*:*:*:*:*:*:*", - "name": "libcurand-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libcurand-dev-13-4@10.4.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=005903359f6ec13a&upstream=libcurand", + "cpe": "cpe:2.3:a:libcurand-dev-13-4:libcurand-dev-13-4:10.4.4.49-1:*:*:*:*:*:*:*", + "name": "libcurand-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcurand-dev-13-2@10.4.2.55-1?arch=arm64&distro=ubuntu-24.04&upstream=libcurand", + "purl": "pkg:deb/ubuntu/libcurand-dev-13-4@10.4.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=libcurand", "type": "library", - "version": "10.4.2.55-1" + "version": "10.4.4.49-1" }, { "bom-ref": "pkg:deb/ubuntu/libcurl3t64-gnutls@8.5.0-2ubuntu10.13?arch=arm64&distro=ubuntu-24.04&package-id=211ece8ff44d3d29&upstream=curl", @@ -108454,49 +111169,49 @@ "version": "8.5.0-2ubuntu10.13" }, { - "bom-ref": "pkg:deb/ubuntu/libcusolver-13-2@12.2.0.1-1?arch=arm64&distro=ubuntu-24.04&package-id=3f0ebc7e91b1c342&upstream=libcusolver", - "cpe": "cpe:2.3:a:libcusolver-13-2:libcusolver-13-2:12.2.0.1-1:*:*:*:*:*:*:*", - "name": "libcusolver-13-2", + "bom-ref": "pkg:deb/ubuntu/libcusolver-13-4@12.3.2.15-1?arch=arm64&distro=ubuntu-24.04&package-id=b19c30b659e7eafa&upstream=libcusolver", + "cpe": "cpe:2.3:a:libcusolver-13-4:libcusolver-13-4:12.3.2.15-1:*:*:*:*:*:*:*", + "name": "libcusolver-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcusolver-13-2@12.2.0.1-1?arch=arm64&distro=ubuntu-24.04&upstream=libcusolver", + "purl": "pkg:deb/ubuntu/libcusolver-13-4@12.3.2.15-1?arch=arm64&distro=ubuntu-24.04&upstream=libcusolver", "type": "library", - "version": "12.2.0.1-1" + "version": "12.3.2.15-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcusolver-dev-13-2@12.2.0.1-1?arch=arm64&distro=ubuntu-24.04&package-id=3076c2747012bb3f&upstream=libcusolver", - "cpe": "cpe:2.3:a:libcusolver-dev-13-2:libcusolver-dev-13-2:12.2.0.1-1:*:*:*:*:*:*:*", - "name": "libcusolver-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libcusolver-dev-13-4@12.3.2.15-1?arch=arm64&distro=ubuntu-24.04&package-id=a7dc19be8f9dbc2f&upstream=libcusolver", + "cpe": "cpe:2.3:a:libcusolver-dev-13-4:libcusolver-dev-13-4:12.3.2.15-1:*:*:*:*:*:*:*", + "name": "libcusolver-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcusolver-dev-13-2@12.2.0.1-1?arch=arm64&distro=ubuntu-24.04&upstream=libcusolver", + "purl": "pkg:deb/ubuntu/libcusolver-dev-13-4@12.3.2.15-1?arch=arm64&distro=ubuntu-24.04&upstream=libcusolver", "type": "library", - "version": "12.2.0.1-1" + "version": "12.3.2.15-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcusolvermp0-cuda-13@0.8.0.3126-1?arch=arm64&distro=ubuntu-24.04&package-id=6b64598b189d775e&upstream=libcusolvermp", - "cpe": "cpe:2.3:a:libcusolvermp0-cuda-13:libcusolvermp0-cuda-13:0.8.0.3126-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libcusolvermp0-cuda-13@0.9.0.6427-1?arch=arm64&distro=ubuntu-24.04&package-id=4cf83da0af6b9ca7&upstream=libcusolvermp", + "cpe": "cpe:2.3:a:libcusolvermp0-cuda-13:libcusolvermp0-cuda-13:0.9.0.6427-1:*:*:*:*:*:*:*", "name": "libcusolvermp0-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcusolvermp0-cuda-13@0.8.0.3126-1?arch=arm64&distro=ubuntu-24.04&upstream=libcusolvermp", + "purl": "pkg:deb/ubuntu/libcusolvermp0-cuda-13@0.9.0.6427-1?arch=arm64&distro=ubuntu-24.04&upstream=libcusolvermp", "type": "library", - "version": "0.8.0.3126-1" + "version": "0.9.0.6427-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcusparse-13-2@12.7.10.1-1?arch=arm64&distro=ubuntu-24.04&package-id=0369db6750c341b1&upstream=libcusparse", - "cpe": "cpe:2.3:a:libcusparse-13-2:libcusparse-13-2:12.7.10.1-1:*:*:*:*:*:*:*", - "name": "libcusparse-13-2", + "bom-ref": "pkg:deb/ubuntu/libcusparse-13-4@12.8.6.49-1?arch=arm64&distro=ubuntu-24.04&package-id=7812f33e4f13bb85&upstream=libcusparse", + "cpe": "cpe:2.3:a:libcusparse-13-4:libcusparse-13-4:12.8.6.49-1:*:*:*:*:*:*:*", + "name": "libcusparse-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcusparse-13-2@12.7.10.1-1?arch=arm64&distro=ubuntu-24.04&upstream=libcusparse", + "purl": "pkg:deb/ubuntu/libcusparse-13-4@12.8.6.49-1?arch=arm64&distro=ubuntu-24.04&upstream=libcusparse", "type": "library", - "version": "12.7.10.1-1" + "version": "12.8.6.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/libcusparse-dev-13-2@12.7.10.1-1?arch=arm64&distro=ubuntu-24.04&package-id=d1dccef9921ea216&upstream=libcusparse", - "cpe": "cpe:2.3:a:libcusparse-dev-13-2:libcusparse-dev-13-2:12.7.10.1-1:*:*:*:*:*:*:*", - "name": "libcusparse-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libcusparse-dev-13-4@12.8.6.49-1?arch=arm64&distro=ubuntu-24.04&package-id=99fa8565cf43d89b&upstream=libcusparse", + "cpe": "cpe:2.3:a:libcusparse-dev-13-4:libcusparse-dev-13-4:12.8.6.49-1:*:*:*:*:*:*:*", + "name": "libcusparse-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libcusparse-dev-13-2@12.7.10.1-1?arch=arm64&distro=ubuntu-24.04&upstream=libcusparse", + "purl": "pkg:deb/ubuntu/libcusparse-dev-13-4@12.8.6.49-1?arch=arm64&distro=ubuntu-24.04&upstream=libcusparse", "type": "library", - "version": "12.7.10.1-1" + "version": "12.8.6.49-1" }, { "bom-ref": "pkg:deb/ubuntu/libcusparselt0-cuda-13@0.9.1.1-1?arch=arm64&distro=ubuntu-24.04&package-id=69f6e470bbf547df&upstream=libcusparse-lt", @@ -108543,15 +111258,6 @@ "type": "library", "version": "1.14.10-4ubuntu4.1" }, - { - "bom-ref": "pkg:deb/ubuntu/libdbus-1-dev@1.14.10-4ubuntu4.1?arch=arm64&distro=ubuntu-24.04&package-id=4473405b081bd5bd&upstream=dbus", - "cpe": "cpe:2.3:a:libdbus-1-dev:libdbus-1-dev:1.14.10-4ubuntu4.1:*:*:*:*:*:*:*", - "name": "libdbus-1-dev", - "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libdbus-1-dev@1.14.10-4ubuntu4.1?arch=arm64&distro=ubuntu-24.04&upstream=dbus", - "type": "library", - "version": "1.14.10-4ubuntu4.1" - }, { "bom-ref": "pkg:deb/ubuntu/libdebconfclient0@0.271ubuntu3?arch=arm64&distro=ubuntu-24.04&package-id=2c163dde9266772f&upstream=cdebconf", "cpe": "cpe:2.3:a:libdebconfclient0:libdebconfclient0:0.271ubuntu3:*:*:*:*:*:*:*", @@ -108769,13 +111475,13 @@ "version": "14.2.0-4ubuntu2~24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/libgcrypt20@1.10.3-2build1?arch=arm64&distro=ubuntu-24.04&package-id=4a31d391abea9e80", - "cpe": "cpe:2.3:a:libgcrypt20:libgcrypt20:1.10.3-2build1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libgcrypt20@1.10.3-2ubuntu0.1?arch=arm64&distro=ubuntu-24.04&package-id=1356c663d77ab495", + "cpe": "cpe:2.3:a:libgcrypt20:libgcrypt20:1.10.3-2ubuntu0.1:*:*:*:*:*:*:*", "name": "libgcrypt20", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libgcrypt20@1.10.3-2build1?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/libgcrypt20@1.10.3-2ubuntu0.1?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "1.10.3-2build1" + "version": "1.10.3-2ubuntu0.1" }, { "bom-ref": "pkg:deb/ubuntu/libgd3@2.3.3-9ubuntu5?arch=arm64&distro=ubuntu-24.04&package-id=7c61ffafdf575b2d&upstream=libgd2", @@ -108805,7 +111511,7 @@ "version": "1.23-5.1build1" }, { - "bom-ref": "pkg:deb/ubuntu/libgdrapi@2.5.1?arch=arm64&distro=ubuntu-24.04&package-id=04e7742c2c0f5393", + "bom-ref": "pkg:deb/ubuntu/libgdrapi@2.5.1?arch=arm64&distro=ubuntu-24.04&package-id=bd7e06cd8ff86b20", "cpe": "cpe:2.3:a:libgdrapi:libgdrapi:2.5.1:*:*:*:*:*:*:*", "name": "libgdrapi", "publisher": "GPUDirect Team ", @@ -108859,13 +111565,13 @@ "version": "2:6.3.0+dfsg-2ubuntu6.1" }, { - "bom-ref": "pkg:deb/ubuntu/libgnutls30t64@3.8.3-1.1ubuntu3.5?arch=arm64&distro=ubuntu-24.04&package-id=31c388b7a504e5e6&upstream=gnutls28", - "cpe": "cpe:2.3:a:libgnutls30t64:libgnutls30t64:3.8.3-1.1ubuntu3.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libgnutls30t64@3.8.3-1.1ubuntu3.6?arch=arm64&distro=ubuntu-24.04&package-id=dec581c78cd361c8&upstream=gnutls28", + "cpe": "cpe:2.3:a:libgnutls30t64:libgnutls30t64:3.8.3-1.1ubuntu3.6:*:*:*:*:*:*:*", "name": "libgnutls30t64", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libgnutls30t64@3.8.3-1.1ubuntu3.5?arch=arm64&distro=ubuntu-24.04&upstream=gnutls28", + "purl": "pkg:deb/ubuntu/libgnutls30t64@3.8.3-1.1ubuntu3.6?arch=arm64&distro=ubuntu-24.04&upstream=gnutls28", "type": "library", - "version": "3.8.3-1.1ubuntu3.5" + "version": "3.8.3-1.1ubuntu3.6" }, { "bom-ref": "pkg:deb/ubuntu/libgomp1@14.2.0-4ubuntu2~24.04.1?arch=arm64&distro=ubuntu-24.04&package-id=80a1a3e25be96ef8&upstream=gcc-14", @@ -109048,22 +111754,22 @@ "version": "2.10.0-1build1" }, { - "bom-ref": "pkg:deb/ubuntu/libibumad-dev@59.1-1?arch=arm64&distro=ubuntu-24.04&package-id=bea625e6521fa3b1&upstream=rdma-core", - "cpe": "cpe:2.3:a:libibumad-dev:libibumad-dev:59.1-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libibumad-dev@63.0-1?arch=arm64&distro=ubuntu-24.04&package-id=afe3bc66f61809f4&upstream=rdma-core", + "cpe": "cpe:2.3:a:libibumad-dev:libibumad-dev:63.0-1:*:*:*:*:*:*:*", "name": "libibumad-dev", "publisher": "Linux RDMA Mailing List ", - "purl": "pkg:deb/ubuntu/libibumad-dev@59.1-1?arch=arm64&distro=ubuntu-24.04&upstream=rdma-core", + "purl": "pkg:deb/ubuntu/libibumad-dev@63.0-1?arch=arm64&distro=ubuntu-24.04&upstream=rdma-core", "type": "library", - "version": "59.1-1" + "version": "63.0-1" }, { - "bom-ref": "pkg:deb/ubuntu/libibumad3@59.1-1?arch=arm64&distro=ubuntu-24.04&package-id=fadc4078c8ed24ea&upstream=rdma-core", - "cpe": "cpe:2.3:a:libibumad3:libibumad3:59.1-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libibumad3@63.0-1?arch=arm64&distro=ubuntu-24.04&package-id=40bcaad9e12f5b8c&upstream=rdma-core", + "cpe": "cpe:2.3:a:libibumad3:libibumad3:63.0-1:*:*:*:*:*:*:*", "name": "libibumad3", "publisher": "Linux RDMA Mailing List ", - "purl": "pkg:deb/ubuntu/libibumad3@59.1-1?arch=arm64&distro=ubuntu-24.04&upstream=rdma-core", + "purl": "pkg:deb/ubuntu/libibumad3@63.0-1?arch=arm64&distro=ubuntu-24.04&upstream=rdma-core", "type": "library", - "version": "59.1-1" + "version": "63.0-1" }, { "bom-ref": "pkg:deb/ubuntu/libibverbs-dev@50.0-2ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=97f943b21ad971c4&upstream=rdma-core", @@ -109399,13 +112105,13 @@ "version": "1.9.4-1build1.1" }, { - "bom-ref": "pkg:deb/ubuntu/liblzma5@5.6.1%2Breally5.4.5-1ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=265b614543918f1d&upstream=xz-utils", - "cpe": "cpe:2.3:a:liblzma5:liblzma5:5.6.1\\+really5.4.5-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/liblzma5@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=arm64&distro=ubuntu-24.04&package-id=8b7a90d92f796d77&upstream=xz-utils", + "cpe": "cpe:2.3:a:liblzma5:liblzma5:5.6.1\\+really5.4.5-1ubuntu0.3:*:*:*:*:*:*:*", "name": "liblzma5", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/liblzma5@5.6.1%2Breally5.4.5-1ubuntu0.2?arch=arm64&distro=ubuntu-24.04&upstream=xz-utils", + "purl": "pkg:deb/ubuntu/liblzma5@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=arm64&distro=ubuntu-24.04&upstream=xz-utils", "type": "library", - "version": "5.6.1+really5.4.5-1ubuntu0.2" + "version": "5.6.1+really5.4.5-1ubuntu0.3" }, { "bom-ref": "pkg:deb/ubuntu/libmagic-mgc@1%3A5.45-3build1?arch=arm64&distro=ubuntu-24.04&package-id=2ac603e229c69768&upstream=file", @@ -109489,73 +112195,58 @@ "version": "1.32.5-1ubuntu1.1" }, { - "bom-ref": "pkg:deb/ubuntu/libnccl-dev@2.30.4-1%2Bcuda13.2?arch=arm64&distro=ubuntu-24.04&package-id=9f9c7afce49196e1&upstream=nccl", - "cpe": "cpe:2.3:a:libnccl-dev:libnccl-dev:2.30.4-1\\+cuda13.2:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "Apache-2.0" - } - }, - { - "license": { - "id": "BSD-3-Clause" - } - } - ], + "bom-ref": "pkg:deb/ubuntu/libnccl-dev@2.30.7-1%2Bcuda13.3?arch=arm64&distro=ubuntu-24.04&package-id=067071a5ce2fb937&upstream=nccl", + "cpe": "cpe:2.3:a:libnccl-dev:libnccl-dev:2.30.7-1\\+cuda13.3:*:*:*:*:*:*:*", "name": "libnccl-dev", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnccl-dev@2.30.4-1%2Bcuda13.2?arch=arm64&distro=ubuntu-24.04&upstream=nccl", + "purl": "pkg:deb/ubuntu/libnccl-dev@2.30.7-1%2Bcuda13.3?arch=arm64&distro=ubuntu-24.04&upstream=nccl", "type": "library", - "version": "2.30.4-1+cuda13.2" + "version": "2.30.7-1+cuda13.3" }, { - "bom-ref": "pkg:deb/ubuntu/libnccl2@2.30.4-1%2Bcuda13.2?arch=arm64&distro=ubuntu-24.04&package-id=7adfcdf382f4aae1&upstream=nccl", - "cpe": "cpe:2.3:a:libnccl2:libnccl2:2.30.4-1\\+cuda13.2:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "Apache-2.0" - } - }, - { - "license": { - "id": "BSD-3-Clause" - } - } - ], + "bom-ref": "pkg:deb/ubuntu/libnccl-ofi-ngc-v3@1.19.0-1?arch=arm64&distro=ubuntu-24.04&package-id=854447f2e9a8d9fb&upstream=aws-ofi-nccl", + "cpe": "cpe:2.3:a:libnccl-ofi-ngc-v3:libnccl-ofi-ngc-v3:1.19.0-1:*:*:*:*:*:*:*", + "name": "libnccl-ofi-ngc-v3", + "publisher": "AWS OFI NCCL Team ", + "purl": "pkg:deb/ubuntu/libnccl-ofi-ngc-v3@1.19.0-1?arch=arm64&distro=ubuntu-24.04&upstream=aws-ofi-nccl", + "type": "library", + "version": "1.19.0-1" + }, + { + "bom-ref": "pkg:deb/ubuntu/libnccl2@2.30.7-1%2Bcuda13.3?arch=arm64&distro=ubuntu-24.04&package-id=6d6d89e331bec357&upstream=nccl", + "cpe": "cpe:2.3:a:libnccl2:libnccl2:2.30.7-1\\+cuda13.3:*:*:*:*:*:*:*", "name": "libnccl2", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnccl2@2.30.4-1%2Bcuda13.2?arch=arm64&distro=ubuntu-24.04&upstream=nccl", + "purl": "pkg:deb/ubuntu/libnccl2@2.30.7-1%2Bcuda13.3?arch=arm64&distro=ubuntu-24.04&upstream=nccl", "type": "library", - "version": "2.30.4-1+cuda13.2" + "version": "2.30.7-1+cuda13.3" }, { - "bom-ref": "pkg:deb/ubuntu/libncurses-dev@6.4%2B20240113-1ubuntu2?arch=arm64&distro=ubuntu-24.04&package-id=1f57a60a9bf83fed&upstream=ncurses", - "cpe": "cpe:2.3:a:libncurses-dev:libncurses-dev:6.4\\+20240113-1ubuntu2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libncurses-dev@6.4%2B20240113-1ubuntu2.1?arch=arm64&distro=ubuntu-24.04&package-id=331943745e88867c&upstream=ncurses", + "cpe": "cpe:2.3:a:libncurses-dev:libncurses-dev:6.4\\+20240113-1ubuntu2.1:*:*:*:*:*:*:*", "name": "libncurses-dev", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libncurses-dev@6.4%2B20240113-1ubuntu2?arch=arm64&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/libncurses-dev@6.4%2B20240113-1ubuntu2.1?arch=arm64&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libncurses6@6.4%2B20240113-1ubuntu2?arch=arm64&distro=ubuntu-24.04&package-id=022e14d21588c1b1&upstream=ncurses", - "cpe": "cpe:2.3:a:libncurses6:libncurses6:6.4\\+20240113-1ubuntu2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libncurses6@6.4%2B20240113-1ubuntu2.1?arch=arm64&distro=ubuntu-24.04&package-id=a288bead6e0a3e44&upstream=ncurses", + "cpe": "cpe:2.3:a:libncurses6:libncurses6:6.4\\+20240113-1ubuntu2.1:*:*:*:*:*:*:*", "name": "libncurses6", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libncurses6@6.4%2B20240113-1ubuntu2?arch=arm64&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/libncurses6@6.4%2B20240113-1ubuntu2.1?arch=arm64&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libncursesw6@6.4%2B20240113-1ubuntu2?arch=arm64&distro=ubuntu-24.04&package-id=4921ed5429e8ab4b&upstream=ncurses", - "cpe": "cpe:2.3:a:libncursesw6:libncursesw6:6.4\\+20240113-1ubuntu2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libncursesw6@6.4%2B20240113-1ubuntu2.1?arch=arm64&distro=ubuntu-24.04&package-id=79781ed418d1d165&upstream=ncurses", + "cpe": "cpe:2.3:a:libncursesw6:libncursesw6:6.4\\+20240113-1ubuntu2.1:*:*:*:*:*:*:*", "name": "libncursesw6", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libncursesw6@6.4%2B20240113-1ubuntu2?arch=arm64&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/libncursesw6@6.4%2B20240113-1ubuntu2.1?arch=arm64&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { "bom-ref": "pkg:deb/ubuntu/libnettle8t64@3.9.1-2.2build1.1?arch=arm64&distro=ubuntu-24.04&package-id=011ad3328248ea25&upstream=nettle", @@ -109567,13 +112258,13 @@ "version": "3.9.1-2.2build1.1" }, { - "bom-ref": "pkg:deb/ubuntu/libnghttp2-14@1.59.0-1ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=bf51b8695c308199&upstream=nghttp2", - "cpe": "cpe:2.3:a:libnghttp2-14:libnghttp2-14:1.59.0-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libnghttp2-14@1.59.0-1ubuntu0.4?arch=arm64&distro=ubuntu-24.04&package-id=d9918f4d6fdd88da&upstream=nghttp2", + "cpe": "cpe:2.3:a:libnghttp2-14:libnghttp2-14:1.59.0-1ubuntu0.4:*:*:*:*:*:*:*", "name": "libnghttp2-14", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libnghttp2-14@1.59.0-1ubuntu0.2?arch=arm64&distro=ubuntu-24.04&upstream=nghttp2", + "purl": "pkg:deb/ubuntu/libnghttp2-14@1.59.0-1ubuntu0.4?arch=arm64&distro=ubuntu-24.04&upstream=nghttp2", "type": "library", - "version": "1.59.0-1ubuntu0.2" + "version": "1.59.0-1ubuntu0.4" }, { "bom-ref": "pkg:deb/ubuntu/libnl-3-200@3.7.0-0.3build1.1?arch=arm64&distro=ubuntu-24.04&package-id=d4e310349b1acec9&upstream=libnl3", @@ -109630,22 +112321,22 @@ "version": "1.5.9+dfsg-3.1build1" }, { - "bom-ref": "pkg:deb/ubuntu/libnpp-13-2@13.1.0.48-1?arch=arm64&distro=ubuntu-24.04&package-id=708c84682b7c4224&upstream=libnpp", - "cpe": "cpe:2.3:a:libnpp-13-2:libnpp-13-2:13.1.0.48-1:*:*:*:*:*:*:*", - "name": "libnpp-13-2", + "bom-ref": "pkg:deb/ubuntu/libnpp-13-4@13.2.0.35-1?arch=arm64&distro=ubuntu-24.04&package-id=f900b4c154a62e59&upstream=libnpp", + "cpe": "cpe:2.3:a:libnpp-13-4:libnpp-13-4:13.2.0.35-1:*:*:*:*:*:*:*", + "name": "libnpp-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnpp-13-2@13.1.0.48-1?arch=arm64&distro=ubuntu-24.04&upstream=libnpp", + "purl": "pkg:deb/ubuntu/libnpp-13-4@13.2.0.35-1?arch=arm64&distro=ubuntu-24.04&upstream=libnpp", "type": "library", - "version": "13.1.0.48-1" + "version": "13.2.0.35-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnpp-dev-13-2@13.1.0.48-1?arch=arm64&distro=ubuntu-24.04&package-id=471219f638a2c24f&upstream=libnpp", - "cpe": "cpe:2.3:a:libnpp-dev-13-2:libnpp-dev-13-2:13.1.0.48-1:*:*:*:*:*:*:*", - "name": "libnpp-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libnpp-dev-13-4@13.2.0.35-1?arch=arm64&distro=ubuntu-24.04&package-id=ba1a7fd5a7e3bc3f&upstream=libnpp", + "cpe": "cpe:2.3:a:libnpp-dev-13-4:libnpp-dev-13-4:13.2.0.35-1:*:*:*:*:*:*:*", + "name": "libnpp-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnpp-dev-13-2@13.1.0.48-1?arch=arm64&distro=ubuntu-24.04&upstream=libnpp", + "purl": "pkg:deb/ubuntu/libnpp-dev-13-4@13.2.0.35-1?arch=arm64&distro=ubuntu-24.04&upstream=libnpp", "type": "library", - "version": "13.1.0.48-1" + "version": "13.2.0.35-1" }, { "bom-ref": "pkg:deb/ubuntu/libnpth0t64@1.6-3.1build1?arch=arm64&distro=ubuntu-24.04&package-id=060d9228d5272395&upstream=npth", @@ -109675,103 +112366,103 @@ "version": "2.0.18-1ubuntu0.24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvfatbin-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=12afb7f331d399b5&upstream=libnvfatbin", - "cpe": "cpe:2.3:a:libnvfatbin-13-2:libnvfatbin-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvfatbin-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvfatbin-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=f446fbff4e29311a&upstream=libnvfatbin", + "cpe": "cpe:2.3:a:libnvfatbin-13-4:libnvfatbin-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "libnvfatbin-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvfatbin-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvfatbin", + "purl": "pkg:deb/ubuntu/libnvfatbin-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvfatbin", "type": "library", - "version": "13.2.78-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvfatbin-dev-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=408f7308a4e1149a&upstream=libnvfatbin", - "cpe": "cpe:2.3:a:libnvfatbin-dev-13-2:libnvfatbin-dev-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvfatbin-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvfatbin-dev-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&package-id=06e01a9aef8f195b&upstream=libnvfatbin", + "cpe": "cpe:2.3:a:libnvfatbin-dev-13-4:libnvfatbin-dev-13-4:13.4.49-1:*:*:*:*:*:*:*", + "name": "libnvfatbin-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvfatbin-dev-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvfatbin", + "purl": "pkg:deb/ubuntu/libnvfatbin-dev-13-4@13.4.49-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvfatbin", "type": "library", - "version": "13.2.78-1" + "version": "13.4.49-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvjitlink-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=dce09315885b0728&upstream=libnvjitlink", - "cpe": "cpe:2.3:a:libnvjitlink-13-2:libnvjitlink-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvjitlink-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvjitlink-13-4@13.4.52-1?arch=arm64&distro=ubuntu-24.04&package-id=78e63e8801462125&upstream=libnvjitlink", + "cpe": "cpe:2.3:a:libnvjitlink-13-4:libnvjitlink-13-4:13.4.52-1:*:*:*:*:*:*:*", + "name": "libnvjitlink-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvjitlink-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvjitlink", + "purl": "pkg:deb/ubuntu/libnvjitlink-13-4@13.4.52-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvjitlink", "type": "library", - "version": "13.2.78-1" + "version": "13.4.52-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvjitlink-dev-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=cf1d2a5c3f917ac9&upstream=libnvjitlink", - "cpe": "cpe:2.3:a:libnvjitlink-dev-13-2:libnvjitlink-dev-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvjitlink-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvjitlink-dev-13-4@13.4.52-1?arch=arm64&distro=ubuntu-24.04&package-id=7461e9d191eeaaa8&upstream=libnvjitlink", + "cpe": "cpe:2.3:a:libnvjitlink-dev-13-4:libnvjitlink-dev-13-4:13.4.52-1:*:*:*:*:*:*:*", + "name": "libnvjitlink-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvjitlink-dev-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvjitlink", + "purl": "pkg:deb/ubuntu/libnvjitlink-dev-13-4@13.4.52-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvjitlink", "type": "library", - "version": "13.2.78-1" + "version": "13.4.52-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvjpeg-13-2@13.1.0.48-1?arch=arm64&distro=ubuntu-24.04&package-id=1da7aad93dfb4593&upstream=libnvjpeg", - "cpe": "cpe:2.3:a:libnvjpeg-13-2:libnvjpeg-13-2:13.1.0.48-1:*:*:*:*:*:*:*", - "name": "libnvjpeg-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvjpeg-13-4@13.2.2.35-1?arch=arm64&distro=ubuntu-24.04&package-id=4573c9f44788c9c7&upstream=libnvjpeg", + "cpe": "cpe:2.3:a:libnvjpeg-13-4:libnvjpeg-13-4:13.2.2.35-1:*:*:*:*:*:*:*", + "name": "libnvjpeg-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvjpeg-13-2@13.1.0.48-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvjpeg", + "purl": "pkg:deb/ubuntu/libnvjpeg-13-4@13.2.2.35-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvjpeg", "type": "library", - "version": "13.1.0.48-1" + "version": "13.2.2.35-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvjpeg-dev-13-2@13.1.0.48-1?arch=arm64&distro=ubuntu-24.04&package-id=405648bfa16612ad&upstream=libnvjpeg", - "cpe": "cpe:2.3:a:libnvjpeg-dev-13-2:libnvjpeg-dev-13-2:13.1.0.48-1:*:*:*:*:*:*:*", - "name": "libnvjpeg-dev-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvjpeg-dev-13-4@13.2.2.35-1?arch=arm64&distro=ubuntu-24.04&package-id=1ded5ddf35f400cc&upstream=libnvjpeg", + "cpe": "cpe:2.3:a:libnvjpeg-dev-13-4:libnvjpeg-dev-13-4:13.2.2.35-1:*:*:*:*:*:*:*", + "name": "libnvjpeg-dev-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvjpeg-dev-13-2@13.1.0.48-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvjpeg", + "purl": "pkg:deb/ubuntu/libnvjpeg-dev-13-4@13.2.2.35-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvjpeg", "type": "library", - "version": "13.1.0.48-1" + "version": "13.2.2.35-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvptxcompiler-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=46506c876b4a7a4b&upstream=libnvptxcompiler", - "cpe": "cpe:2.3:a:libnvptxcompiler-13-2:libnvptxcompiler-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvptxcompiler-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvptxcompiler-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&package-id=dfd33b61eaaaee3a&upstream=libnvptxcompiler", + "cpe": "cpe:2.3:a:libnvptxcompiler-13-4:libnvptxcompiler-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "libnvptxcompiler-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvptxcompiler-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvptxcompiler", + "purl": "pkg:deb/ubuntu/libnvptxcompiler-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvptxcompiler", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvshmem3-cuda-13@3.6.5-1?arch=arm64&distro=ubuntu-24.04&package-id=9b1f8c92f5ff1934&upstream=libnvshmem", - "cpe": "cpe:2.3:a:libnvshmem3-cuda-13:libnvshmem3-cuda-13:3.6.5-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libnvshmem3-cuda-13@3.7.1-1?arch=arm64&distro=ubuntu-24.04&package-id=c342e80b0858c048&upstream=libnvshmem", + "cpe": "cpe:2.3:a:libnvshmem3-cuda-13:libnvshmem3-cuda-13:3.7.1-1:*:*:*:*:*:*:*", "name": "libnvshmem3-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvshmem3-cuda-13@3.6.5-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvshmem", + "purl": "pkg:deb/ubuntu/libnvshmem3-cuda-13@3.7.1-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvshmem", "type": "library", - "version": "3.6.5-1" + "version": "3.7.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvshmem3-dev-cuda-13@3.6.5-1?arch=arm64&distro=ubuntu-24.04&package-id=4a6ba1d260103915&upstream=libnvshmem", - "cpe": "cpe:2.3:a:libnvshmem3-dev-cuda-13:libnvshmem3-dev-cuda-13:3.6.5-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libnvshmem3-dev-cuda-13@3.7.1-1?arch=arm64&distro=ubuntu-24.04&package-id=8b60d1b17bc0d320&upstream=libnvshmem", + "cpe": "cpe:2.3:a:libnvshmem3-dev-cuda-13:libnvshmem3-dev-cuda-13:3.7.1-1:*:*:*:*:*:*:*", "name": "libnvshmem3-dev-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvshmem3-dev-cuda-13@3.6.5-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvshmem", + "purl": "pkg:deb/ubuntu/libnvshmem3-dev-cuda-13@3.7.1-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvshmem", "type": "library", - "version": "3.6.5-1" + "version": "3.7.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvshmem3-static-cuda-13@3.6.5-1?arch=arm64&distro=ubuntu-24.04&package-id=869b71c299e7de74&upstream=libnvshmem", - "cpe": "cpe:2.3:a:libnvshmem3-static-cuda-13:libnvshmem3-static-cuda-13:3.6.5-1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libnvshmem3-static-cuda-13@3.7.1-1?arch=arm64&distro=ubuntu-24.04&package-id=2bdd786ce9f8ed2e&upstream=libnvshmem", + "cpe": "cpe:2.3:a:libnvshmem3-static-cuda-13:libnvshmem3-static-cuda-13:3.7.1-1:*:*:*:*:*:*:*", "name": "libnvshmem3-static-cuda-13", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvshmem3-static-cuda-13@3.6.5-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvshmem", + "purl": "pkg:deb/ubuntu/libnvshmem3-static-cuda-13@3.7.1-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvshmem", "type": "library", - "version": "3.6.5-1" + "version": "3.7.1-1" }, { - "bom-ref": "pkg:deb/ubuntu/libnvvm-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&package-id=ea8029c91c4067bb&upstream=libnvvm", - "cpe": "cpe:2.3:a:libnvvm-13-2:libnvvm-13-2:13.2.78-1:*:*:*:*:*:*:*", - "name": "libnvvm-13-2", + "bom-ref": "pkg:deb/ubuntu/libnvvm-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&package-id=aff576b7bda43919&upstream=libnvvm", + "cpe": "cpe:2.3:a:libnvvm-13-4:libnvvm-13-4:13.4.59-1:*:*:*:*:*:*:*", + "name": "libnvvm-13-4", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/libnvvm-13-2@13.2.78-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvvm", + "purl": "pkg:deb/ubuntu/libnvvm-13-4@13.4.59-1?arch=arm64&distro=ubuntu-24.04&upstream=libnvvm", "type": "library", - "version": "13.2.78-1" + "version": "13.4.59-1" }, { "bom-ref": "pkg:deb/ubuntu/libobjc-13-dev@13.3.0-6ubuntu2~24.04.1?arch=arm64&distro=ubuntu-24.04&package-id=775376334110a78d&upstream=gcc-13", @@ -109846,40 +112537,40 @@ "version": "0.25.3-4ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libpam-modules@1.5.3-5ubuntu5.5?arch=arm64&distro=ubuntu-24.04&package-id=b1609811c6ef1b84&upstream=pam", - "cpe": "cpe:2.3:a:libpam-modules:libpam-modules:1.5.3-5ubuntu5.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpam-modules@1.5.3-5ubuntu5.6?arch=arm64&distro=ubuntu-24.04&package-id=89c6d367e169988e&upstream=pam", + "cpe": "cpe:2.3:a:libpam-modules:libpam-modules:1.5.3-5ubuntu5.6:*:*:*:*:*:*:*", "name": "libpam-modules", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libpam-modules@1.5.3-5ubuntu5.5?arch=arm64&distro=ubuntu-24.04&upstream=pam", + "purl": "pkg:deb/ubuntu/libpam-modules@1.5.3-5ubuntu5.6?arch=arm64&distro=ubuntu-24.04&upstream=pam", "type": "library", - "version": "1.5.3-5ubuntu5.5" + "version": "1.5.3-5ubuntu5.6" }, { - "bom-ref": "pkg:deb/ubuntu/libpam-modules-bin@1.5.3-5ubuntu5.5?arch=arm64&distro=ubuntu-24.04&package-id=b5254f2908d10c65&upstream=pam", - "cpe": "cpe:2.3:a:libpam-modules-bin:libpam-modules-bin:1.5.3-5ubuntu5.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpam-modules-bin@1.5.3-5ubuntu5.6?arch=arm64&distro=ubuntu-24.04&package-id=0518357a8297a46a&upstream=pam", + "cpe": "cpe:2.3:a:libpam-modules-bin:libpam-modules-bin:1.5.3-5ubuntu5.6:*:*:*:*:*:*:*", "name": "libpam-modules-bin", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libpam-modules-bin@1.5.3-5ubuntu5.5?arch=arm64&distro=ubuntu-24.04&upstream=pam", + "purl": "pkg:deb/ubuntu/libpam-modules-bin@1.5.3-5ubuntu5.6?arch=arm64&distro=ubuntu-24.04&upstream=pam", "type": "library", - "version": "1.5.3-5ubuntu5.5" + "version": "1.5.3-5ubuntu5.6" }, { - "bom-ref": "pkg:deb/ubuntu/libpam-runtime@1.5.3-5ubuntu5.5?arch=all&distro=ubuntu-24.04&package-id=7f17b2799ccab7c8&upstream=pam", - "cpe": "cpe:2.3:a:libpam-runtime:libpam-runtime:1.5.3-5ubuntu5.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpam-runtime@1.5.3-5ubuntu5.6?arch=all&distro=ubuntu-24.04&package-id=f706552214689c4b&upstream=pam", + "cpe": "cpe:2.3:a:libpam-runtime:libpam-runtime:1.5.3-5ubuntu5.6:*:*:*:*:*:*:*", "name": "libpam-runtime", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libpam-runtime@1.5.3-5ubuntu5.5?arch=all&distro=ubuntu-24.04&upstream=pam", + "purl": "pkg:deb/ubuntu/libpam-runtime@1.5.3-5ubuntu5.6?arch=all&distro=ubuntu-24.04&upstream=pam", "type": "library", - "version": "1.5.3-5ubuntu5.5" + "version": "1.5.3-5ubuntu5.6" }, { - "bom-ref": "pkg:deb/ubuntu/libpam0g@1.5.3-5ubuntu5.5?arch=arm64&distro=ubuntu-24.04&package-id=93d1e7fbad3dada4&upstream=pam", - "cpe": "cpe:2.3:a:libpam0g:libpam0g:1.5.3-5ubuntu5.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpam0g@1.5.3-5ubuntu5.6?arch=arm64&distro=ubuntu-24.04&package-id=b1a3bc830c461e8e&upstream=pam", + "cpe": "cpe:2.3:a:libpam0g:libpam0g:1.5.3-5ubuntu5.6:*:*:*:*:*:*:*", "name": "libpam0g", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libpam0g@1.5.3-5ubuntu5.5?arch=arm64&distro=ubuntu-24.04&upstream=pam", + "purl": "pkg:deb/ubuntu/libpam0g@1.5.3-5ubuntu5.6?arch=arm64&distro=ubuntu-24.04&upstream=pam", "type": "library", - "version": "1.5.3-5ubuntu5.5" + "version": "1.5.3-5ubuntu5.6" }, { "bom-ref": "pkg:deb/ubuntu/libpango-1.0-0@1.52.1%2Bds-1build1?arch=arm64&distro=ubuntu-24.04&package-id=edd25f498ef2d69a&upstream=pango1.0", @@ -109936,13 +112627,13 @@ "version": "10.42-4ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=1cdf85f83cff671b&upstream=perl", - "cpe": "cpe:2.3:a:libperl5.38t64:libperl5.38t64:5.38.2-3.2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.3?arch=arm64&distro=ubuntu-24.04&package-id=a2ad31507ceb2311&upstream=perl", + "cpe": "cpe:2.3:a:libperl5.38t64:libperl5.38t64:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", "name": "libperl5.38t64", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.2?arch=arm64&distro=ubuntu-24.04&upstream=perl", + "purl": "pkg:deb/ubuntu/libperl5.38t64@5.38.2-3.2ubuntu0.3?arch=arm64&distro=ubuntu-24.04&upstream=perl", "type": "library", - "version": "5.38.2-3.2ubuntu0.2" + "version": "5.38.2-3.2ubuntu0.3" }, { "bom-ref": "pkg:deb/ubuntu/libpfm4@4.13.0%2Bgit32-g0d4ed0e-1?arch=arm64&distro=ubuntu-24.04&package-id=a0a9087151e65d80", @@ -110098,40 +112789,40 @@ "version": "3.12.3-0ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&package-id=aab05c529eaf187e&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12-dev:libpython3.12-dev:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&package-id=8fa8aeebb55de026&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12-dev:libpython3.12-dev:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "libpython3.12-dev", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12-dev@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&package-id=b295ae4251dfbe94&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12-minimal:libpython3.12-minimal:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&package-id=ced87cc265661d6a&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12-minimal:libpython3.12-minimal:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "libpython3.12-minimal", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12-minimal@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&package-id=9f94616b752b0a41&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12-stdlib:libpython3.12-stdlib:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&package-id=f10d67988df2fa92&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12-stdlib:libpython3.12-stdlib:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "libpython3.12-stdlib", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12-stdlib@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&package-id=1ee092c1cb935b8b&upstream=python3.12", - "cpe": "cpe:2.3:a:libpython3.12t64:libpython3.12t64:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&package-id=ee4fe66262953f8a&upstream=python3.12", + "cpe": "cpe:2.3:a:libpython3.12t64:libpython3.12t64:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "libpython3.12t64", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/libpython3.12t64@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { "bom-ref": "pkg:deb/ubuntu/libre2-10@20230301-3build1?arch=arm64&distro=ubuntu-24.04&package-id=4b0987bfa88a6d2a&upstream=re2", @@ -110384,13 +113075,13 @@ "version": "14.4.2+git20190427-4build4" }, { - "bom-ref": "pkg:deb/ubuntu/libsqlite3-0@3.45.1-1ubuntu2.5?arch=arm64&distro=ubuntu-24.04&package-id=2f5ead7e80bee2e2&upstream=sqlite3", - "cpe": "cpe:2.3:a:libsqlite3-0:libsqlite3-0:3.45.1-1ubuntu2.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libsqlite3-0@3.45.1-1ubuntu2.7?arch=arm64&distro=ubuntu-24.04&package-id=59b2a4ca0ea1646b&upstream=sqlite3", + "cpe": "cpe:2.3:a:libsqlite3-0:libsqlite3-0:3.45.1-1ubuntu2.7:*:*:*:*:*:*:*", "name": "libsqlite3-0", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libsqlite3-0@3.45.1-1ubuntu2.5?arch=arm64&distro=ubuntu-24.04&upstream=sqlite3", + "purl": "pkg:deb/ubuntu/libsqlite3-0@3.45.1-1ubuntu2.7?arch=arm64&distro=ubuntu-24.04&upstream=sqlite3", "type": "library", - "version": "3.45.1-1ubuntu2.5" + "version": "3.45.1-1ubuntu2.7" }, { "bom-ref": "pkg:deb/ubuntu/libss2@1.47.0-2.4~exp1ubuntu4.1?arch=arm64&distro=ubuntu-24.04&package-id=cb984c53d6326c28&upstream=e2fsprogs", @@ -110447,13 +113138,13 @@ "version": "14.2.0-4ubuntu2~24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/libsystemd0@255.4-1ubuntu8.15?arch=arm64&distro=ubuntu-24.04&package-id=2bcaf26dd03b98c7&upstream=systemd", - "cpe": "cpe:2.3:a:libsystemd0:libsystemd0:255.4-1ubuntu8.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libsystemd0@255.4-1ubuntu8.17?arch=arm64&distro=ubuntu-24.04&package-id=95ff39ed0583748c&upstream=systemd", + "cpe": "cpe:2.3:a:libsystemd0:libsystemd0:255.4-1ubuntu8.17:*:*:*:*:*:*:*", "name": "libsystemd0", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libsystemd0@255.4-1ubuntu8.15?arch=arm64&distro=ubuntu-24.04&upstream=systemd", + "purl": "pkg:deb/ubuntu/libsystemd0@255.4-1ubuntu8.17?arch=arm64&distro=ubuntu-24.04&upstream=systemd", "type": "library", - "version": "255.4-1ubuntu8.15" + "version": "255.4-1ubuntu8.17" }, { "bom-ref": "pkg:deb/ubuntu/libtasn1-6@4.19.0-3ubuntu0.24.04.2?arch=arm64&distro=ubuntu-24.04&package-id=b9518bbb828029ac", @@ -110501,13 +113192,13 @@ "version": "4.5.1+git230720-4ubuntu2.5" }, { - "bom-ref": "pkg:deb/ubuntu/libtinfo6@6.4%2B20240113-1ubuntu2?arch=arm64&distro=ubuntu-24.04&package-id=192ddeccd709b163&upstream=ncurses", - "cpe": "cpe:2.3:a:libtinfo6:libtinfo6:6.4\\+20240113-1ubuntu2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libtinfo6@6.4%2B20240113-1ubuntu2.1?arch=arm64&distro=ubuntu-24.04&package-id=bd0019e66d3aa4bc&upstream=ncurses", + "cpe": "cpe:2.3:a:libtinfo6:libtinfo6:6.4\\+20240113-1ubuntu2.1:*:*:*:*:*:*:*", "name": "libtinfo6", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libtinfo6@6.4%2B20240113-1ubuntu2?arch=arm64&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/libtinfo6@6.4%2B20240113-1ubuntu2.1?arch=arm64&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { "bom-ref": "pkg:deb/ubuntu/libtool@2.4.7-7build1?arch=all&distro=ubuntu-24.04&package-id=57843439295b9e8f", @@ -110537,13 +113228,13 @@ "version": "14.2.0-4ubuntu2~24.04.1" }, { - "bom-ref": "pkg:deb/ubuntu/libudev1@255.4-1ubuntu8.15?arch=arm64&distro=ubuntu-24.04&package-id=122b77e7991243ce&upstream=systemd", - "cpe": "cpe:2.3:a:libudev1:libudev1:255.4-1ubuntu8.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libudev1@255.4-1ubuntu8.17?arch=arm64&distro=ubuntu-24.04&package-id=40a30767975a5927&upstream=systemd", + "cpe": "cpe:2.3:a:libudev1:libudev1:255.4-1ubuntu8.17:*:*:*:*:*:*:*", "name": "libudev1", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libudev1@255.4-1ubuntu8.15?arch=arm64&distro=ubuntu-24.04&upstream=systemd", + "purl": "pkg:deb/ubuntu/libudev1@255.4-1ubuntu8.17?arch=arm64&distro=ubuntu-24.04&upstream=systemd", "type": "library", - "version": "255.4-1ubuntu8.15" + "version": "255.4-1ubuntu8.17" }, { "bom-ref": "pkg:deb/ubuntu/libunistring5@1.1-2build1.1?arch=arm64&distro=ubuntu-24.04&package-id=029fdde59f12e8f7&upstream=libunistring", @@ -110690,22 +113381,22 @@ "version": "2:1.3.4-1build2" }, { - "bom-ref": "pkg:deb/ubuntu/libxml2@2.9.14%2Bdfsg-1.3ubuntu3.7?arch=arm64&distro=ubuntu-24.04&package-id=fd6b226e6ae7cffc", - "cpe": "cpe:2.3:a:libxml2:libxml2:2.9.14\\+dfsg-1.3ubuntu3.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libxml2@2.9.14%2Bdfsg-1.3ubuntu3.8?arch=arm64&distro=ubuntu-24.04&package-id=51688cda8c6cc71f", + "cpe": "cpe:2.3:a:libxml2:libxml2:2.9.14\\+dfsg-1.3ubuntu3.8:*:*:*:*:*:*:*", "name": "libxml2", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libxml2@2.9.14%2Bdfsg-1.3ubuntu3.7?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/libxml2@2.9.14%2Bdfsg-1.3ubuntu3.8?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "2.9.14+dfsg-1.3ubuntu3.7" + "version": "2.9.14+dfsg-1.3ubuntu3.8" }, { - "bom-ref": "pkg:deb/ubuntu/libxml2-dev@2.9.14%2Bdfsg-1.3ubuntu3.7?arch=arm64&distro=ubuntu-24.04&package-id=2bad03c8fd40586a&upstream=libxml2", - "cpe": "cpe:2.3:a:libxml2-dev:libxml2-dev:2.9.14\\+dfsg-1.3ubuntu3.7:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/libxml2-dev@2.9.14%2Bdfsg-1.3ubuntu3.8?arch=arm64&distro=ubuntu-24.04&package-id=f7d8894c8ad94a2f&upstream=libxml2", + "cpe": "cpe:2.3:a:libxml2-dev:libxml2-dev:2.9.14\\+dfsg-1.3ubuntu3.8:*:*:*:*:*:*:*", "name": "libxml2-dev", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/libxml2-dev@2.9.14%2Bdfsg-1.3ubuntu3.7?arch=arm64&distro=ubuntu-24.04&upstream=libxml2", + "purl": "pkg:deb/ubuntu/libxml2-dev@2.9.14%2Bdfsg-1.3ubuntu3.8?arch=arm64&distro=ubuntu-24.04&upstream=libxml2", "type": "library", - "version": "2.9.14+dfsg-1.3ubuntu3.7" + "version": "2.9.14+dfsg-1.3ubuntu3.8" }, { "bom-ref": "pkg:deb/ubuntu/libxmu6@2%3A1.1.3-3build2?arch=arm64&distro=ubuntu-24.04&package-id=199c9ce414676657&upstream=libxmu", @@ -110816,13 +113507,13 @@ "version": "1.5.5+dfsg2-2build1.1" }, { - "bom-ref": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-111.111?arch=arm64&distro=ubuntu-24.04&package-id=f0c1cff33dd420d3&upstream=linux", - "cpe": "cpe:2.3:a:linux-libc-dev:linux-libc-dev:6.8.0-111.111:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-138.138?arch=arm64&distro=ubuntu-24.04&package-id=a8acd7cf5008b338&upstream=linux", + "cpe": "cpe:2.3:a:linux-libc-dev:linux-libc-dev:6.8.0-138.138:*:*:*:*:*:*:*", "name": "linux-libc-dev", "publisher": "Ubuntu Kernel Team ", - "purl": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-111.111?arch=arm64&distro=ubuntu-24.04&upstream=linux", + "purl": "pkg:deb/ubuntu/linux-libc-dev@6.8.0-138.138?arch=arm64&distro=ubuntu-24.04&upstream=linux", "type": "library", - "version": "6.8.0-111.111" + "version": "6.8.0-138.138" }, { "bom-ref": "pkg:deb/ubuntu/lld@1%3A18.0-59~exp2?arch=arm64&distro=ubuntu-24.04&package-id=dd573c51dcafb36d&upstream=llvm-defaults%400.59~exp2", @@ -110860,7 +113551,7 @@ }, { "author": "Adam Jakubek, Rafa\u0142 Ga\u0142czy\u0144ski ", - "bom-ref": "pkg:pypi/llist@0.7.1?package-id=c982e55e8f66f373", + "bom-ref": "pkg:pypi/llist@0.7.1?package-id=9c726f9ea96d11ff", "cpe": "cpe:2.3:a:ajakubek_project:python-llist:0.7.1:*:*:*:*:*:*:*", "licenses": [ { @@ -110961,8 +113652,8 @@ }, { "author": "lxml dev team ", - "bom-ref": "pkg:pypi/lxml@6.1.2?package-id=a7551b8e06a5c732", - "cpe": "cpe:2.3:a:lxml:lxml:6.1.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/lxml@6.1.3?package-id=9886cf29aed6334d", + "cpe": "cpe:2.3:a:lxml:lxml:6.1.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -110971,9 +113662,9 @@ } ], "name": "lxml", - "purl": "pkg:pypi/lxml@6.1.2", + "purl": "pkg:pypi/lxml@6.1.3", "type": "library", - "version": "6.1.2" + "version": "6.1.3" }, { "bom-ref": "pkg:deb/ubuntu/m4@1.4.19-4build1?arch=arm64&distro=ubuntu-24.04&package-id=a34594113e920794", @@ -111011,8 +113702,8 @@ }, { "author": "Manfred Stienstra, Yuri Takhteyev >", - "bom-ref": "pkg:pypi/markdown@3.10.2?package-id=080c3f60abea2b82", - "cpe": "cpe:2.3:a:manfred_stienstra\\,_yuri_takhteyev_project:python-markdown:3.10.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/markdown@3.10.3?package-id=1a06ee73f9e40725", + "cpe": "cpe:2.3:a:manfred_stienstra\\,_yuri_takhteyev_project:python-markdown:3.10.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -111021,9 +113712,9 @@ } ], "name": "markdown", - "purl": "pkg:pypi/markdown@3.10.2", + "purl": "pkg:pypi/markdown@3.10.3", "type": "library", - "version": "3.10.2" + "version": "3.10.3" }, { "author": "Chris Sewell ", @@ -111051,28 +113742,35 @@ }, { "author": "John D. Hunter, Michael Droettboom >", - "bom-ref": "pkg:pypi/matplotlib@3.10.9?package-id=c3c14fb7eb17cc01", - "cpe": "cpe:2.3:a:john_d__hunter\\,_michael_droettboom_project:python-matplotlib:3.10.9:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/matplotlib@3.11.1?package-id=03528ea61e206ba1", + "cpe": "cpe:2.3:a:john_d__hunter\\,_michael_droettboom_project:python-matplotlib:3.11.1:*:*:*:*:*:*:*", "licenses": [ { "license": { - "name": "sha256:3cb2c7aa8ec1f91fe59071d47f0d875cd1381b51d1cbf3ec8e225168c552597a" + "name": "sha256:3596f4f7d52f77bb4ae3b2b11fe14abbae564b43b566f64ea452c46a248b1157" } } ], "name": "matplotlib", - "purl": "pkg:pypi/matplotlib@3.10.9", + "purl": "pkg:pypi/matplotlib@3.11.1", "type": "library", - "version": "3.10.9" + "version": "3.11.1" }, { "author": "IPython Development Team ", - "bom-ref": "pkg:pypi/matplotlib-inline@0.2.1?package-id=800bd76f5fe4aa3c", - "cpe": "cpe:2.3:a:ipython_development_team_\\", - "bom-ref": "pkg:pypi/mdit-py-plugins@0.6.0?package-id=b9901a56eb0c2a2d", - "cpe": "cpe:2.3:a:chris_sewell_\\", @@ -111216,7 +113914,7 @@ }, { "author": "Hsiaoming Yang ", - "bom-ref": "pkg:pypi/mistune@3.3.4?package-id=461083ddcd80abdc", + "bom-ref": "pkg:pypi/mistune@3.3.4?package-id=3628e3e524507822", "cpe": "cpe:2.3:a:hsiaoming_yang_\\", - "bom-ref": "pkg:pypi/ml-dtypes@0.5.4?package-id=f1deae74f4ba6ab8", - "cpe": "cpe:2.3:a:ml_dtypes_authors_\\", @@ -111305,12 +114003,12 @@ }, { "author": "Lisandro Dalcin ", - "bom-ref": "pkg:pypi/mpi4py@3.1.5?package-id=8c01c7c6c5622f9b", + "bom-ref": "pkg:pypi/mpi4py@3.1.5?package-id=6e0a2773f3107aad", "cpe": "cpe:2.3:a:lisandro_dalcin_project:python-mpi4py:3.1.5:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/tmp.fcvYxj85Oe/mpi4py-3.1.5" + "url": "file:///tmp/tmp.cL1Du0hiKm/mpi4py-3.1.5" } ], "licenses": [ @@ -111374,8 +114072,8 @@ }, { "author": "Inada Naoki ", - "bom-ref": "pkg:pypi/msgpack@1.2.1?package-id=c2a5a9aadc296a3c", - "cpe": "cpe:2.3:a:msgpack:messagepack:1.2.1:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/msgpack@1.2.2?package-id=b89f351789ef9913", + "cpe": "cpe:2.3:a:msgpack:messagepack:1.2.2:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -111384,9 +114082,9 @@ } ], "name": "msgpack", - "purl": "pkg:pypi/msgpack@1.2.1", + "purl": "pkg:pypi/msgpack@1.2.2", "type": "library", - "version": "1.2.1" + "version": "1.2.2" }, { "bom-ref": "pkg:pypi/msgspec@0.21.1?package-id=3fd19332b1d767f9", @@ -111468,18 +114166,18 @@ "version": "1.1.0" }, { - "bom-ref": "pkg:deb/ubuntu/nano@7.2-2ubuntu0.1?arch=arm64&distro=ubuntu-24.04&package-id=f280a17f30022ba9", - "cpe": "cpe:2.3:a:nano:nano:7.2-2ubuntu0.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/nano@7.2-2ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=3fb4b07cbc38889b", + "cpe": "cpe:2.3:a:nano:nano:7.2-2ubuntu0.2:*:*:*:*:*:*:*", "name": "nano", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/nano@7.2-2ubuntu0.1?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/nano@7.2-2ubuntu0.2?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "7.2-2ubuntu0.1" + "version": "7.2-2ubuntu0.2" }, { "author": "Marco Gorelli >", - "bom-ref": "pkg:pypi/narwhals@2.25.0?package-id=7c7c5345f9bb3dcb", - "cpe": "cpe:2.3:a:marco_gorelli_\\", - "bom-ref": "pkg:pypi/nbclient@0.10.4?package-id=ad2f3665c867d879", - "cpe": "cpe:2.3:a:jupyter_development_team_\\", @@ -111535,8 +114233,8 @@ }, { "author": "Jupyter Development Team ", - "bom-ref": "pkg:pypi/nbformat@5.10.4?package-id=4b97cc7c26913b9d", - "cpe": "cpe:2.3:a:jupyter_development_team_\\", - "purl": "pkg:deb/ubuntu/ncurses-base@6.4%2B20240113-1ubuntu2?arch=all&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/ncurses-base@6.4%2B20240113-1ubuntu2.1?arch=all&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { - "bom-ref": "pkg:deb/ubuntu/ncurses-bin@6.4%2B20240113-1ubuntu2?arch=arm64&distro=ubuntu-24.04&package-id=1d38413b1d1b4b81&upstream=ncurses", - "cpe": "cpe:2.3:a:ncurses-bin:ncurses-bin:6.4\\+20240113-1ubuntu2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/ncurses-bin@6.4%2B20240113-1ubuntu2.1?arch=arm64&distro=ubuntu-24.04&package-id=dc5f64670a36046f&upstream=ncurses", + "cpe": "cpe:2.3:a:ncurses-bin:ncurses-bin:6.4\\+20240113-1ubuntu2.1:*:*:*:*:*:*:*", "name": "ncurses-bin", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/ncurses-bin@6.4%2B20240113-1ubuntu2?arch=arm64&distro=ubuntu-24.04&upstream=ncurses", + "purl": "pkg:deb/ubuntu/ncurses-bin@6.4%2B20240113-1ubuntu2.1?arch=arm64&distro=ubuntu-24.04&upstream=ncurses", "type": "library", - "version": "6.4+20240113-1ubuntu2" + "version": "6.4+20240113-1ubuntu2.1" }, { "author": "Ewald R. de Wit ", - "bom-ref": "pkg:pypi/nest-asyncio@1.6.0?package-id=8ef0fce9db07cd71", - "cpe": "cpe:2.3:a:ewald_r__de_wit_project:python-nest-asyncio:1.6.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nest-asyncio2@1.7.2?package-id=9eee00a12e497433", + "cpe": "cpe:2.3:a:ewald_r__de_wit_project:python-nest-asyncio2:1.7.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -111594,10 +114301,10 @@ } } ], - "name": "nest-asyncio", - "purl": "pkg:pypi/nest-asyncio@1.6.0", + "name": "nest-asyncio2", + "purl": "pkg:pypi/nest-asyncio2@1.7.2", "type": "library", - "version": "1.6.0" + "version": "1.7.2" }, { "bom-ref": "pkg:deb/ubuntu/netbase@6.4?arch=all&distro=ubuntu-24.04&package-id=dad21fec6e066474", @@ -111626,7 +114333,7 @@ }, { "author": "Jean-Christophe Fillion-Robin , Henry Schreiner ", - "bom-ref": "pkg:pypi/ninja@1.13.0?package-id=0e06b36650f8e27f", + "bom-ref": "pkg:pypi/ninja@1.13.0?package-id=fea93725e323c962", "cpe": "cpe:2.3:a:jean_christophe_fillion_robin_\\", - "bom-ref": "pkg:pypi/notebook@7.5.6?package-id=d626a99c08a53aac", - "cpe": "cpe:2.3:a:jupyter_development_team_\\", @@ -111675,22 +114382,22 @@ "version": "0.2.4" }, { - "bom-ref": "pkg:deb/ubuntu/nsight-compute-2026.1.1@2026.1.1.2-1?arch=arm64&distro=ubuntu-24.04&package-id=55623e21b5eac025&upstream=nsight-compute", - "cpe": "cpe:2.3:a:nsight-compute-2026.1.1:nsight-compute-2026.1.1:2026.1.1.2-1:*:*:*:*:*:*:*", - "name": "nsight-compute-2026.1.1", + "bom-ref": "pkg:deb/ubuntu/nsight-compute-2026.3.0@2026.3.0.13-1?arch=arm64&distro=ubuntu-24.04&package-id=a0af1da6adb5496c&upstream=nsight-compute", + "cpe": "cpe:2.3:a:nsight-compute-2026.3.0:nsight-compute-2026.3.0:2026.3.0.13-1:*:*:*:*:*:*:*", + "name": "nsight-compute-2026.3.0", "publisher": "cudatools ", - "purl": "pkg:deb/ubuntu/nsight-compute-2026.1.1@2026.1.1.2-1?arch=arm64&distro=ubuntu-24.04&upstream=nsight-compute", + "purl": "pkg:deb/ubuntu/nsight-compute-2026.3.0@2026.3.0.13-1?arch=arm64&distro=ubuntu-24.04&upstream=nsight-compute", "type": "library", - "version": "2026.1.1.2-1" + "version": "2026.3.0.13-1" }, { - "bom-ref": "pkg:deb/ubuntu/nsight-systems-cli-2026.2.1@2026.2.1.210-262137639646v0?arch=arm64&distro=ubuntu-24.04&package-id=51b7a7bee021a5a9", - "cpe": "cpe:2.3:a:nsight-systems-cli-2026.2.1:nsight-systems-cli-2026.2.1:2026.2.1.210-262137639646v0:*:*:*:*:*:*:*", - "name": "nsight-systems-cli-2026.2.1", + "bom-ref": "pkg:deb/ubuntu/nsight-systems-cli-2026.5.1@2026.5.1.18-265138582488v0?arch=arm64&distro=ubuntu-24.04&package-id=e1cc948b410bdf64", + "cpe": "cpe:2.3:a:nsight-systems-cli-2026.5.1:nsight-systems-cli-2026.5.1:2026.5.1.18-265138582488v0:*:*:*:*:*:*:*", + "name": "nsight-systems-cli-2026.5.1", "publisher": "Feedback ", - "purl": "pkg:deb/ubuntu/nsight-systems-cli-2026.2.1@2026.2.1.210-262137639646v0?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/nsight-systems-cli-2026.5.1@2026.5.1.18-265138582488v0?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "2026.2.1.210-262137639646v0" + "version": "2026.5.1.18-265138582488v0" }, { "bom-ref": "pkg:deb/ubuntu/numactl@2.0.18-1ubuntu0.24.04.1?arch=arm64&distro=ubuntu-24.04&package-id=39a30be30dad7722", @@ -111748,38 +114455,6 @@ "type": "library", "version": "2.3.5" }, - { - "author": "HWInf-MLWFO ", - "bom-ref": "pkg:pypi/nv-one-logger-core@2.3.1?package-id=41dd7ae418914fce", - "cpe": "cpe:2.3:a:hwinf_mlwfo_e2e_dev_project:python-nv-one-logger-core:2.3.1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "Apache-2.0" - } - } - ], - "name": "nv-one-logger-core", - "purl": "pkg:pypi/nv-one-logger-core@2.3.1", - "type": "library", - "version": "2.3.1" - }, - { - "author": "HWInf-MLWFO ", - "bom-ref": "pkg:pypi/nv-one-logger-training-telemetry@2.3.1?package-id=3a3dee78f0f87ca4", - "cpe": "cpe:2.3:a:python-nv-one-logger-training-telemetry:python-nv-one-logger-training-telemetry:2.3.1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "Apache-2.0" - } - } - ], - "name": "nv-one-logger-training-telemetry", - "purl": "pkg:pypi/nv-one-logger-training-telemetry@2.3.1", - "type": "library", - "version": "2.3.1" - }, { "author": "NVIDIA Corporation", "bom-ref": "pkg:pypi/nvdlfw-inspect@0.2.2?package-id=2babffd085db5c29", @@ -111796,42 +114471,6 @@ "type": "library", "version": "0.2.2" }, - { - "bom-ref": "pkg:pypi/nvfuser@0.2.36%2Bgit29f5740?package-id=ce4d1f72cdf35ccc", - "cpe": "cpe:2.3:a:python-nvfuser:python-nvfuser:0.2.36\\+git29f5740:*:*:*:*:*:*:*", - "externalReferences": [ - { - "type": "vcs", - "url": "file:///opt/pytorch/fuser/python" - } - ], - "licenses": [ - { - "license": { - "id": "BSD-3-Clause" - } - } - ], - "name": "nvfuser", - "purl": "pkg:pypi/nvfuser@0.2.36%2Bgit29f5740", - "type": "library", - "version": "0.2.36+git29f5740" - }, - { - "bom-ref": "pkg:pypi/nvfuser@0.2.36%2Bgit29f5740?package-id=e40f933f0f17af5b", - "cpe": "cpe:2.3:a:python-nvfuser:python-nvfuser:0.2.36\\+git29f5740:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "BSD-3-Clause" - } - } - ], - "name": "nvfuser", - "purl": "pkg:pypi/nvfuser@0.2.36%2Bgit29f5740", - "type": "library", - "version": "0.2.36+git29f5740" - }, { "author": "Nvidia CUDA Installer Team ", "bom-ref": "pkg:pypi/nvidia-cuda-nvdisasm@13.3.73?package-id=f040063113edf2c9", @@ -111848,17 +114487,17 @@ }, { "author": "Nvidia CUDA Installer Team ", - "bom-ref": "pkg:pypi/nvidia-cuda-nvrtc@13.3.33?package-id=82b319cf20ca4260", - "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-cuda-nvrtc:13.3.33:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cuda-nvrtc@13.4.59?package-id=33633985cf886876", + "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-cuda-nvrtc:13.4.59:*:*:*:*:*:*:*", "licenses": [ { "expression": "LicenseRef-NVIDIA-Proprietary" } ], "name": "nvidia-cuda-nvrtc", - "purl": "pkg:pypi/nvidia-cuda-nvrtc@13.3.33", + "purl": "pkg:pypi/nvidia-cuda-nvrtc@13.4.59", "type": "library", - "version": "13.3.33" + "version": "13.4.59" }, { "author": "Nvidia CUDA Installer Team ", @@ -111889,53 +114528,53 @@ }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-cutlass-dsl@4.6.1?package-id=a8027c3d307d7758", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-cutlass-dsl:4.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cutlass-dsl@4.8.0.dev0?package-id=4802cad47cab5cd1", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-cutlass-dsl:4.8.0.dev0:*:*:*:*:*:*:*", "name": "nvidia-cutlass-dsl", - "purl": "pkg:pypi/nvidia-cutlass-dsl@4.6.1", + "purl": "pkg:pypi/nvidia-cutlass-dsl@4.8.0.dev0", "type": "library", - "version": "4.6.1" + "version": "4.8.0.dev0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-base@4.6.1?package-id=e7940c97bef08abc", - "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-base:python-nvidia-cutlass-dsl-libs-base:4.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-base@4.8.0.dev0?package-id=cf2a94f42d8036aa", + "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-base:python-nvidia-cutlass-dsl-libs-base:4.8.0.dev0:*:*:*:*:*:*:*", "name": "nvidia-cutlass-dsl-libs-base", - "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-base@4.6.1", + "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-base@4.8.0.dev0", "type": "library", - "version": "4.6.1" + "version": "4.8.0.dev0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-core@4.6.1?package-id=4feb5e74091ae881", - "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-core:python-nvidia-cutlass-dsl-libs-core:4.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-core@4.8.0.dev0?package-id=9ee67ede663ec83a", + "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-core:python-nvidia-cutlass-dsl-libs-core:4.8.0.dev0:*:*:*:*:*:*:*", "name": "nvidia-cutlass-dsl-libs-core", - "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-core@4.6.1", + "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-core@4.8.0.dev0", "type": "library", - "version": "4.6.1" + "version": "4.8.0.dev0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-cu12@4.6.1?package-id=f5ac54a1e10b872c", - "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-cu12:python-nvidia-cutlass-dsl-libs-cu12:4.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-cu12@4.8.0.dev0?package-id=0efccd79399cca85", + "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-cu12:python-nvidia-cutlass-dsl-libs-cu12:4.8.0.dev0:*:*:*:*:*:*:*", "name": "nvidia-cutlass-dsl-libs-cu12", - "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-cu12@4.6.1", + "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-cu12@4.8.0.dev0", "type": "library", - "version": "4.6.1" + "version": "4.8.0.dev0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-cu13@4.6.1?package-id=f8672fb5903a730a", - "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-cu13:python-nvidia-cutlass-dsl-libs-cu13:4.6.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-cutlass-dsl-libs-cu13@4.8.0.dev0?package-id=bd8343b9c69f9b3f", + "cpe": "cpe:2.3:a:python-nvidia-cutlass-dsl-libs-cu13:python-nvidia-cutlass-dsl-libs-cu13:4.8.0.dev0:*:*:*:*:*:*:*", "name": "nvidia-cutlass-dsl-libs-cu13", - "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-cu13@4.6.1", + "purl": "pkg:pypi/nvidia-cutlass-dsl-libs-cu13@4.8.0.dev0", "type": "library", - "version": "4.6.1" + "version": "4.8.0.dev0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-dali-cuda130@2.1.0?package-id=9d86a9550d1f7f70", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-dali-cuda130:2.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-dali-cuda130@2.2.0?package-id=b8b15417cd83b9c1", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-dali-cuda130:2.2.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -111944,14 +114583,14 @@ } ], "name": "nvidia-dali-cuda130", - "purl": "pkg:pypi/nvidia-dali-cuda130@2.1.0", + "purl": "pkg:pypi/nvidia-dali-cuda130@2.2.0", "type": "library", - "version": "2.1.0" + "version": "2.2.0" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-libnvcomp-cu13@5.1.0.21?package-id=4c3d75b9632eb44d", - "cpe": "cpe:2.3:a:python-nvidia-libnvcomp-cu13:python-nvidia-libnvcomp-cu13:5.1.0.21:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-libnvcomp-cu13@5.2.0.13?package-id=5c6f3940e1ca9f79", + "cpe": "cpe:2.3:a:python-nvidia-libnvcomp-cu13:python-nvidia-libnvcomp-cu13:5.2.0.13:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -111960,13 +114599,13 @@ } ], "name": "nvidia-libnvcomp-cu13", - "purl": "pkg:pypi/nvidia-libnvcomp-cu13@5.1.0.21", + "purl": "pkg:pypi/nvidia-libnvcomp-cu13@5.2.0.13", "type": "library", - "version": "5.1.0.21" + "version": "5.2.0.13" }, { "author": "NVIDIA CUDA Installer Team ", - "bom-ref": "pkg:pypi/nvidia-matmul-heuristics@0.1.0.27?package-id=fed59efff97eef3a", + "bom-ref": "pkg:pypi/nvidia-matmul-heuristics@0.1.0.27?package-id=64d43c309501cf10", "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_\\", - "bom-ref": "pkg:pypi/nvidia-ml-py@13.595.45?package-id=cc952d5907ba83a1", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-ml-py:13.595.45:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-ml-py@13.610.43?package-id=c6961d5b9f5bd882", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-ml-py:13.610.43:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -111990,18 +114629,18 @@ } ], "name": "nvidia-ml-py", - "purl": "pkg:pypi/nvidia-ml-py@13.595.45", + "purl": "pkg:pypi/nvidia-ml-py@13.610.43", "type": "library", - "version": "13.595.45" + "version": "13.610.43" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-modelopt@0.43.0?package-id=f0987bb859eb2342", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-modelopt:0.43.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-modelopt@0.45.0?package-id=8ba602a8c68a5a23", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-modelopt:0.45.0:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/modelopt/nvidia_modelopt-0.43.0-py3-none-any.whl" + "url": "file:///tmp/modelopt/nvidia_modelopt-0.45.0-py3-none-any.whl" } ], "licenses": [ @@ -112012,28 +114651,28 @@ } ], "name": "nvidia-modelopt", - "purl": "pkg:pypi/nvidia-modelopt@0.43.0", + "purl": "pkg:pypi/nvidia-modelopt@0.45.0", "type": "library", - "version": "0.43.0" + "version": "0.45.0" }, { "author": "Nvidia CUDA Installer Team ", - "bom-ref": "pkg:pypi/nvidia-nccl-cu13@2.30.4?package-id=a306e98ed63b7e4a", - "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-nccl-cu13:2.30.4:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-nccl-cu13@2.30.7?package-id=49c3ee18bdb13b99", + "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-nccl-cu13:2.30.7:*:*:*:*:*:*:*", "licenses": [ { "expression": "LicenseRef-NVIDIA-Proprietary" } ], "name": "nvidia-nccl-cu13", - "purl": "pkg:pypi/nvidia-nccl-cu13@2.30.4", + "purl": "pkg:pypi/nvidia-nccl-cu13@2.30.7", "type": "library", - "version": "2.30.4" + "version": "2.30.7" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-nvimgcodec-cu13@0.7.0.49?package-id=2a02d12c6e8e359c", - "cpe": "cpe:2.3:a:python-nvidia-nvimgcodec-cu13:python-nvidia-nvimgcodec-cu13:0.7.0.49:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-nvimgcodec-cu13@0.8.0.1422?package-id=ca046dce371cbe79", + "cpe": "cpe:2.3:a:python-nvidia-nvimgcodec-cu13:python-nvidia-nvimgcodec-cu13:0.8.0.1422:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -112042,28 +114681,28 @@ } ], "name": "nvidia-nvimgcodec-cu13", - "purl": "pkg:pypi/nvidia-nvimgcodec-cu13@0.7.0.49", + "purl": "pkg:pypi/nvidia-nvimgcodec-cu13@0.8.0.1422", "type": "library", - "version": "0.7.0.49" + "version": "0.8.0.1422" }, { "author": "Nvidia CUDA Installer Team ", - "bom-ref": "pkg:pypi/nvidia-nvjpeg@13.1.0.48?package-id=6c6de598f0c364db", - "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-nvjpeg:13.1.0.48:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-nvjpeg@13.2.1.68?package-id=5ff056b3112f404f", + "cpe": "cpe:2.3:a:nvidia_cuda_installer_team_project:python-nvidia-nvjpeg:13.2.1.68:*:*:*:*:*:*:*", "licenses": [ { "expression": "LicenseRef-NVIDIA-Proprietary" } ], "name": "nvidia-nvjpeg", - "purl": "pkg:pypi/nvidia-nvjpeg@13.1.0.48", + "purl": "pkg:pypi/nvidia-nvjpeg@13.2.1.68", "type": "library", - "version": "13.1.0.48" + "version": "13.2.1.68" }, { "author": "NVIDIA Corporation ", - "bom-ref": "pkg:pypi/nvidia-nvjpeg2k-cu13@0.10.0.49?package-id=51c921ba1d417dde", - "cpe": "cpe:2.3:a:python-nvidia-nvjpeg2k-cu13:python-nvidia-nvjpeg2k-cu13:0.10.0.49:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-nvjpeg2k-cu13@0.11.0.51?package-id=b3947c86375abdab", + "cpe": "cpe:2.3:a:python-nvidia-nvjpeg2k-cu13:python-nvidia-nvjpeg2k-cu13:0.11.0.51:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -112072,14 +114711,14 @@ } ], "name": "nvidia-nvjpeg2k-cu13", - "purl": "pkg:pypi/nvidia-nvjpeg2k-cu13@0.10.0.49", + "purl": "pkg:pypi/nvidia-nvjpeg2k-cu13@0.11.0.51", "type": "library", - "version": "0.10.0.49" + "version": "0.11.0.51" }, { "author": "NVIDIA Corporation ", - "bom-ref": "pkg:pypi/nvidia-nvtiff-cu13@0.7.0.79?package-id=4355fda5a782e419", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-nvtiff-cu13:0.7.0.79:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-nvtiff-cu13@0.8.0.82?package-id=02efd633af53a87a", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvidia-nvtiff-cu13:0.8.0.82:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -112088,18 +114727,18 @@ } ], "name": "nvidia-nvtiff-cu13", - "purl": "pkg:pypi/nvidia-nvtiff-cu13@0.7.0.79", + "purl": "pkg:pypi/nvidia-nvtiff-cu13@0.8.0.82", "type": "library", - "version": "0.7.0.79" + "version": "0.8.0.82" }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvidia-resiliency-ext@0.5.0?package-id=2b99ca4d1185b401", - "cpe": "cpe:2.3:a:python-nvidia-resiliency-ext:python-nvidia-resiliency-ext:0.5.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvidia-resiliency-ext@0.6.0?package-id=8ecf6e2a5071f50c", + "cpe": "cpe:2.3:a:python-nvidia-resiliency-ext:python-nvidia-resiliency-ext:0.6.0:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/nvrx/nvidia_resiliency_ext-0.5.0-cp312-cp312-manylinux_2_39_aarch64.whl" + "url": "file:///tmp/nvrx/nvidia_resiliency_ext-0.6.0-cp312-cp312-manylinux_2_39_aarch64.whl" } ], "licenses": [ @@ -112110,12 +114749,12 @@ } ], "name": "nvidia-resiliency-ext", - "purl": "pkg:pypi/nvidia-resiliency-ext@0.5.0", + "purl": "pkg:pypi/nvidia-resiliency-ext@0.6.0", "type": "library", - "version": "0.5.0" + "version": "0.6.0" }, { - "bom-ref": "pkg:golang/nvidia.com/nvtx?package-id=9d7f730791c23827", + "bom-ref": "pkg:golang/nvidia.com/nvtx?package-id=03ebc003bf75f58d", "name": "nvidia.com/nvtx", "purl": "pkg:golang/nvidia.com/nvtx", "type": "library", @@ -112123,33 +114762,26 @@ }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/nvtx@0.2.15?package-id=97aeaa83e012a379", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvtx:0.2.15:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/nvtx@0.2.16?package-id=0f1428b0b9c55248", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-nvtx:0.2.16:*:*:*:*:*:*:*", "licenses": [ { "expression": "Apache-2.0 WITH LLVM-exception" } ], "name": "nvtx", - "purl": "pkg:pypi/nvtx@0.2.15", + "purl": "pkg:pypi/nvtx@0.2.16", "type": "library", - "version": "0.2.15" + "version": "0.2.16" }, { "author": "Omry Yadan ", - "bom-ref": "pkg:pypi/omegaconf@2.3.0?package-id=853b3faec43b7911", - "cpe": "cpe:2.3:a:omry_yadan_project:python-omegaconf:2.3.0:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "BSD-3-Clause" - } - } - ], + "bom-ref": "pkg:pypi/omegaconf@2.3.1?package-id=dc413170f1c1b7ed", + "cpe": "cpe:2.3:a:omry_yadan_project:python-omegaconf:2.3.1:*:*:*:*:*:*:*", "name": "omegaconf", - "purl": "pkg:pypi/omegaconf@2.3.0", + "purl": "pkg:pypi/omegaconf@2.3.1", "type": "library", - "version": "2.3.0" + "version": "2.3.1" }, { "author": "ONNX Contributors ", @@ -112191,8 +114823,8 @@ }, { "author": "ONNX Contributors ", - "bom-ref": "pkg:pypi/onnx-ir@0.2.1?package-id=5412fa67ce25fc43", - "cpe": "cpe:2.3:a:onnx_contributors_\\", - "bom-ref": "pkg:pypi/onnxscript@0.7.0?package-id=828725e22e736b4e", - "cpe": "cpe:2.3:a:microsoft_corporation_\\", - "bom-ref": "pkg:pypi/openai@3.5.0?package-id=123dd9b7fc7304de", - "cpe": "cpe:2.3:a:openai_\\", - "purl": "pkg:deb/ubuntu/openssh-client@1%3A9.6p1-3ubuntu13.16?arch=arm64&distro=ubuntu-24.04&upstream=openssh", + "purl": "pkg:deb/ubuntu/openssh-client@1%3A9.6p1-3ubuntu13.18?arch=arm64&distro=ubuntu-24.04&upstream=openssh", "type": "library", - "version": "1:9.6p1-3ubuntu13.16" + "version": "1:9.6p1-3ubuntu13.18" }, { "bom-ref": "pkg:deb/ubuntu/openssl@3.0.13-0ubuntu3.15?arch=arm64&distro=ubuntu-24.04&package-id=c55f924edcdabd30", @@ -112263,6 +114895,22 @@ "type": "library", "version": "3.0.13-0ubuntu3.15" }, + { + "author": "OpenTelemetry Authors ", + "bom-ref": "pkg:pypi/opentelemetry-api@1.44.0?package-id=ec159c142d16207a", + "cpe": "cpe:2.3:a:opentelemetry_authors_\\", "bom-ref": "pkg:pypi/optimum@2.3.0?package-id=8e4e881922fc845f", @@ -112281,8 +114929,8 @@ }, { "author": "OpTree Contributors", - "bom-ref": "pkg:pypi/optree@0.19.1?package-id=aca57afaee916b31", - "cpe": "cpe:2.3:a:optree_contributors_project:python-optree:0.19.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/optree@0.20.0?package-id=c65c88b7c6d3131c", + "cpe": "cpe:2.3:a:optree_contributors_project:python-optree:0.20.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -112291,9 +114939,9 @@ } ], "name": "optree", - "purl": "pkg:pypi/optree@0.19.1", + "purl": "pkg:pypi/optree@0.20.0", "type": "library", - "version": "0.19.1" + "version": "0.20.0" }, { "author": "Elia Robyn Lake ", @@ -112304,22 +114952,6 @@ "type": "library", "version": "4.1.0" }, - { - "author": "Mikko Korpela ", - "bom-ref": "pkg:pypi/overrides@7.7.0?package-id=f008b8485881cb95", - "cpe": "cpe:2.3:a:mikko_korpela_project:python-overrides:7.7.0:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "Apache License, Version 2.0" - } - } - ], - "name": "overrides", - "purl": "pkg:pypi/overrides@7.7.0", - "type": "library", - "version": "7.7.0" - }, { "author": "Donald Stufft ", "bom-ref": "pkg:pypi/packaging@24.2?package-id=6d70b0d97af377c0", @@ -112362,22 +114994,22 @@ }, { "author": "Donald Stufft ", - "bom-ref": "pkg:pypi/packaging@26.0?package-id=dcb39503f4f836f4", - "cpe": "cpe:2.3:a:donald_stufft_\\", - "bom-ref": "pkg:pypi/pandas@3.0.2?package-id=886b6f02623979da", - "cpe": "cpe:2.3:a:pandas_development_team_\\", @@ -112525,31 +115157,31 @@ "version": "0.18.1" }, { - "bom-ref": "pkg:deb/ubuntu/perl@5.38.2-3.2ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=04020b7f6d3ffe12", - "cpe": "cpe:2.3:a:perl:perl:5.38.2-3.2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/perl@5.38.2-3.2ubuntu0.3?arch=arm64&distro=ubuntu-24.04&package-id=28597dfb7a4fa32e", + "cpe": "cpe:2.3:a:perl:perl:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", "name": "perl", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/perl@5.38.2-3.2ubuntu0.2?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/perl@5.38.2-3.2ubuntu0.3?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "5.38.2-3.2ubuntu0.2" + "version": "5.38.2-3.2ubuntu0.3" }, { - "bom-ref": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=3b87c957e4ceb93c&upstream=perl", - "cpe": "cpe:2.3:a:perl-base:perl-base:5.38.2-3.2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.3?arch=arm64&distro=ubuntu-24.04&package-id=26886eb980089f4a&upstream=perl", + "cpe": "cpe:2.3:a:perl-base:perl-base:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", "name": "perl-base", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.2?arch=arm64&distro=ubuntu-24.04&upstream=perl", + "purl": "pkg:deb/ubuntu/perl-base@5.38.2-3.2ubuntu0.3?arch=arm64&distro=ubuntu-24.04&upstream=perl", "type": "library", - "version": "5.38.2-3.2ubuntu0.2" + "version": "5.38.2-3.2ubuntu0.3" }, { - "bom-ref": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.2?arch=all&distro=ubuntu-24.04&package-id=ca48c757360eecf9&upstream=perl", - "cpe": "cpe:2.3:a:perl-modules-5.38:perl-modules-5.38:5.38.2-3.2ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.3?arch=all&distro=ubuntu-24.04&package-id=7e8abd47f7d63b24&upstream=perl", + "cpe": "cpe:2.3:a:perl-modules-5.38:perl-modules-5.38:5.38.2-3.2ubuntu0.3:*:*:*:*:*:*:*", "name": "perl-modules-5.38", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.2?arch=all&distro=ubuntu-24.04&upstream=perl", + "purl": "pkg:deb/ubuntu/perl-modules-5.38@5.38.2-3.2ubuntu0.3?arch=all&distro=ubuntu-24.04&upstream=perl", "type": "library", - "version": "5.38.2-3.2ubuntu0.2" + "version": "5.38.2-3.2ubuntu0.3" }, { "author": "Noah Spurrier; Thomas Kluyver; Jeff Quast ", @@ -112619,8 +115251,8 @@ }, { "author": "The pip developers ", - "bom-ref": "pkg:pypi/pip@26.1.1?package-id=292c81179f56bdec", - "cpe": "cpe:2.3:a:pip_developers_\\", @@ -112723,8 +115355,8 @@ }, { "author": "NVIDIA ", - "bom-ref": "pkg:pypi/polygraphy@0.49.26?package-id=212e09abaa962a00", - "cpe": "cpe:2.3:a:svc_tensorrt_project:python-polygraphy:0.49.26:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/polygraphy@0.53.4?package-id=91d8cac82fc8cddc", + "cpe": "cpe:2.3:a:nvidia_\\", @@ -112764,22 +115396,22 @@ }, { "author": "The Prometheus Authors ", - "bom-ref": "pkg:pypi/prometheus-client@0.25.0?package-id=558d2337d58e2a82", - "cpe": "cpe:2.3:a:prometheus_authors_\\", - "bom-ref": "pkg:pypi/prometheus-fastapi-instrumentator@7.1.0?package-id=b6de9c502af23d32", - "cpe": "cpe:2.3:a:python-prometheus-fastapi-instrumentator:python-prometheus-fastapi-instrumentator:7.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/prometheus-fastapi-instrumentator@8.1.0?package-id=91b020ea2966f73f", + "cpe": "cpe:2.3:a:python-prometheus-fastapi-instrumentator:python-prometheus-fastapi-instrumentator:8.1.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -112788,23 +115420,23 @@ } ], "name": "prometheus-fastapi-instrumentator", - "purl": "pkg:pypi/prometheus-fastapi-instrumentator@7.1.0", + "purl": "pkg:pypi/prometheus-fastapi-instrumentator@8.1.0", "type": "library", - "version": "7.1.0" + "version": "8.1.0" }, { "author": "Jonathan Slenders", - "bom-ref": "pkg:pypi/prompt-toolkit@3.0.52?package-id=8de9f9bf2d06aa7c", - "cpe": "cpe:2.3:a:jonathan_slenders_project:python-prompt-toolkit:3.0.52:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/prompt-toolkit@3.0.53?package-id=9309aacff6d74f23", + "cpe": "cpe:2.3:a:jonathan_slenders_project:python-prompt-toolkit:3.0.53:*:*:*:*:*:*:*", "name": "prompt-toolkit", - "purl": "pkg:pypi/prompt-toolkit@3.0.52", + "purl": "pkg:pypi/prompt-toolkit@3.0.53", "type": "library", - "version": "3.0.52" + "version": "3.0.53" }, { "author": "Andrew Svetlov ", - "bom-ref": "pkg:pypi/propcache@0.4.1?package-id=bdf236b2a842934a", - "cpe": "cpe:2.3:a:andrew_svetlov_project:python-propcache:0.4.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/propcache@0.5.2?package-id=7600561a09a04f34", + "cpe": "cpe:2.3:a:andrew_svetlov_project:python-propcache:0.5.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -112813,9 +115445,9 @@ } ], "name": "propcache", - "purl": "pkg:pypi/propcache@0.4.1", + "purl": "pkg:pypi/propcache@0.5.2", "type": "library", - "version": "0.4.1" + "version": "0.5.2" }, { "author": "Google LLC ", @@ -112892,8 +115524,8 @@ }, { "author": "J.S. Roy <\"S.A. Mitchell\" , Franco Peschiera >", - "bom-ref": "pkg:pypi/pulp@3.3.1?package-id=888f505771d946f7", - "cpe": "cpe:2.3:a:\\\"s_a__mitchell\\\"_\\", @@ -112923,8 +115555,8 @@ "version": "0.2.3" }, { - "bom-ref": "pkg:pypi/pyarrow@24.0.0?package-id=d616f50554dece28", - "cpe": "cpe:2.3:a:python-pyarrow:python-pyarrow:24.0.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pyarrow@25.0.1?package-id=0f26734e6f0c1133", + "cpe": "cpe:2.3:a:python-pyarrow:python-pyarrow:25.0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -112933,9 +115565,9 @@ } ], "name": "pyarrow", - "purl": "pkg:pypi/pyarrow@24.0.0", + "purl": "pkg:pypi/pyarrow@25.0.1", "type": "library", - "version": "24.0.0" + "version": "25.0.1" }, { "author": "Ilya Etingof ", @@ -112971,8 +115603,8 @@ }, { "author": "Wenzel Jakob ", - "bom-ref": "pkg:pypi/pybind11@3.0.4?package-id=933875988bb897ed", - "cpe": "cpe:2.3:a:wenzel_jakob_\\", - "bom-ref": "pkg:pypi/pybind11-global@3.0.4?package-id=29f8c9fb742ff8e1", - "cpe": "cpe:2.3:a:wenzel_jakob_\\", - "bom-ref": "pkg:pypi/pyjwt@2.13.0?package-id=f46a7e7ef7efbc16", - "cpe": "cpe:2.3:a:jose_padilla_\\", - "bom-ref": "pkg:pypi/python-hostlist@2.3.0?package-id=ffd418556781df64", + "bom-ref": "pkg:pypi/python-hostlist@2.3.0?package-id=78c4442f2c037893", "cpe": "cpe:2.3:a:python-hostlist:python-hostlist:2.3.0:*:*:*:*:*:*:*", "licenses": [ { @@ -113267,8 +115883,8 @@ }, { "author": "Zakaria Zajac , Nicholas Hairs ", - "bom-ref": "pkg:pypi/python-json-logger@4.1.0?package-id=b65c8ec03aa44074", - "cpe": "cpe:2.3:a:nhairs:python_json_logger:4.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/python-json-logger@4.2.0?package-id=f7cc0545ed442abb", + "cpe": "cpe:2.3:a:nhairs:python_json_logger:4.2.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -113277,9 +115893,9 @@ } ], "name": "python-json-logger", - "purl": "pkg:pypi/python-json-logger@4.1.0", + "purl": "pkg:pypi/python-json-logger@4.2.0", "type": "library", - "version": "4.1.0" + "version": "4.2.0" }, { "author": "Andrew Dunham ", @@ -113397,40 +116013,40 @@ "version": "6.0.1-2build2" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&package-id=17d4812c90519ad6", - "cpe": "cpe:2.3:a:python3.12:python3.12:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&package-id=fc3954f7f78bd175", + "cpe": "cpe:2.3:a:python3.12:python3.12:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "python3.12", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/python3.12@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&package-id=016d9c573eab3918&upstream=python3.12", - "cpe": "cpe:2.3:a:python3.12-dev:python3.12-dev:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&package-id=c7081a9aae11603d&upstream=python3.12", + "cpe": "cpe:2.3:a:python3.12-dev:python3.12-dev:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "python3.12-dev", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/python3.12-dev@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&package-id=b0df75061cd9bb5c&upstream=python3.12", - "cpe": "cpe:2.3:a:python3.12-minimal:python3.12-minimal:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&package-id=69c7429633be97ca&upstream=python3.12", + "cpe": "cpe:2.3:a:python3.12-minimal:python3.12-minimal:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "python3.12-minimal", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/python3.12-minimal@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { - "bom-ref": "pkg:deb/ubuntu/python3.12-venv@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&package-id=e4349cfef6daa892&upstream=python3.12", - "cpe": "cpe:2.3:a:python3.12-venv:python3.12-venv:3.12.3-1ubuntu0.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/python3.12-venv@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&package-id=02990b0867f9f468&upstream=python3.12", + "cpe": "cpe:2.3:a:python3.12-venv:python3.12-venv:3.12.3-1ubuntu0.15:*:*:*:*:*:*:*", "name": "python3.12-venv", "publisher": "Ubuntu Core Developers ", - "purl": "pkg:deb/ubuntu/python3.12-venv@3.12.3-1ubuntu0.13?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", + "purl": "pkg:deb/ubuntu/python3.12-venv@3.12.3-1ubuntu0.15?arch=arm64&distro=ubuntu-24.04&upstream=python3.12", "type": "library", - "version": "3.12.3-1ubuntu0.13" + "version": "3.12.3-1ubuntu0.15" }, { "author": "Tushar Sadhwani ", @@ -113466,8 +116082,8 @@ }, { "author": "Brian E. Granger, Min Ragan-Kelley >", - "bom-ref": "pkg:pypi/pyzmq@27.1.0?package-id=eadc95ce6b99966e", - "cpe": "cpe:2.3:a:brian_e__granger\\,_min_ragan_kelley_project:python-pyzmq:27.1.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/pyzmq@27.2.0?package-id=aa8c95d2ed7e7a93", + "cpe": "cpe:2.3:a:brian_e__granger\\,_min_ragan_kelley_project:python-pyzmq:27.2.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -113476,17 +116092,17 @@ } ], "name": "pyzmq", - "purl": "pkg:pypi/pyzmq@27.1.0", + "purl": "pkg:pypi/pyzmq@27.2.0", "type": "library", - "version": "27.1.0" + "version": "27.2.0" }, { - "bom-ref": "pkg:pypi/quack-kernels@0.6.2?package-id=008f5b4537afa9c5", - "cpe": "cpe:2.3:a:python-quack-kernels:python-quack-kernels:0.6.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/quack-kernels@0.5.0?package-id=a3f9280a3f883daf", + "cpe": "cpe:2.3:a:python-quack-kernels:python-quack-kernels:0.5.0:*:*:*:*:*:*:*", "name": "quack-kernels", - "purl": "pkg:pypi/quack-kernels@0.6.2", + "purl": "pkg:pypi/quack-kernels@0.5.0", "type": "library", - "version": "0.6.2" + "version": "0.5.0" }, { "bom-ref": "pkg:deb/ubuntu/rapidjson-dev@1.1.0%2Bdfsg2-7.2?arch=all&distro=ubuntu-24.04&package-id=06fe6476d662d68c&upstream=rapidjson", @@ -113524,22 +116140,22 @@ }, { "author": "Matthew Barnett ", - "bom-ref": "pkg:pypi/regex@2026.4.4?package-id=f3e3bbfb88f7f1d8", - "cpe": "cpe:2.3:a:matthew_barnett_\\", - "bom-ref": "pkg:pypi/requests@2.33.1?package-id=8878ae48a4855e3a", - "cpe": "cpe:2.3:a:python:requests:2.33.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/requests@2.34.2?package-id=0b86c117b27b93c3", + "cpe": "cpe:2.3:a:python:requests:2.34.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -113548,9 +116164,9 @@ } ], "name": "requests", - "purl": "pkg:pypi/requests@2.33.1", + "purl": "pkg:pypi/requests@2.34.2", "type": "library", - "version": "2.33.1" + "version": "2.34.2" }, { "author": "Nicolas Aimetti ", @@ -113627,8 +116243,8 @@ }, { "author": "Julian Berman ", - "bom-ref": "pkg:pypi/rpds-py@0.30.0?package-id=8d69434e709d5fa1", - "cpe": "cpe:2.3:a:julian_berman_\\", - "purl": "pkg:deb/ubuntu/sed@4.9-2build1?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/sed@4.9-2ubuntu0.24.04.1?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "4.9-2build1" + "version": "4.9-2ubuntu0.24.04.1" }, { "author": "Andrew Senetar ", @@ -113825,8 +116441,8 @@ }, { "author": "Sentry Team and Contributors ", - "bom-ref": "pkg:pypi/sentry-sdk@2.59.0?package-id=52934f20dd9c51c1", - "cpe": "cpe:2.3:a:sentry:sentry_software_development_kit:2.59.0:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/sentry-sdk@2.68.0?package-id=94d00ed93e710aab", + "cpe": "cpe:2.3:a:sentry:sentry_software_development_kit:2.68.0:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -113835,9 +116451,9 @@ } ], "name": "sentry-sdk", - "purl": "pkg:pypi/sentry-sdk@2.59.0", + "purl": "pkg:pypi/sentry-sdk@2.68.0", "type": "library", - "version": "2.59.0" + "version": "2.68.0" }, { "author": "Python Packaging Authority ", @@ -113873,15 +116489,6 @@ "type": "library", "version": "81.0.0" }, - { - "bom-ref": "pkg:deb/ubuntu/sgml-base@1.31?arch=all&distro=ubuntu-24.04&package-id=f3e6346c744c147b", - "cpe": "cpe:2.3:a:sgml-base:sgml-base:1.31:*:*:*:*:*:*:*", - "name": "sgml-base", - "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/sgml-base@1.31?arch=all&distro=ubuntu-24.04", - "type": "library", - "version": "1.31" - }, { "author": "Tzu-ping Chung ", "bom-ref": "pkg:pypi/shellingham@1.5.4?package-id=433ab30b88c4d234", @@ -113969,7 +116576,7 @@ }, { "author": "Isaac Muse ", - "bom-ref": "pkg:pypi/soupsieve@2.9.2?package-id=e12af112686aec14", + "bom-ref": "pkg:pypi/soupsieve@2.9.2?package-id=19461364bf058352", "cpe": "cpe:2.3:a:isaac_muse_\\", - "bom-ref": "pkg:pypi/sse-starlette@3.4.8?package-id=ee46cd8229565415", - "cpe": "cpe:2.3:a:python-sse-starlette:python-sse-starlette:3.4.8:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/sse-starlette@3.4.11?package-id=46cfa6e56513caa1", + "cpe": "cpe:2.3:a:python-sse-starlette:python-sse-starlette:3.4.11:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114020,9 +116643,9 @@ } ], "name": "sse-starlette", - "purl": "pkg:pypi/sse-starlette@3.4.8", + "purl": "pkg:pypi/sse-starlette@3.4.11", "type": "library", - "version": "3.4.8" + "version": "3.4.11" }, { "author": "Alex Hall ", @@ -114042,8 +116665,8 @@ }, { "author": "Tom Christie ", - "bom-ref": "pkg:pypi/starlette@0.50.0?package-id=7052f6c0b32c448e", - "cpe": "cpe:2.3:a:encode:starlette:0.50.0:*:*:*:*:python:*:*", + "bom-ref": "pkg:pypi/starlette@1.6.0?package-id=a18d6478bf7e19cd", + "cpe": "cpe:2.3:a:encode:starlette:1.6.0:*:*:*:*:python:*:*", "licenses": [ { "license": { @@ -114052,9 +116675,9 @@ } ], "name": "starlette", - "purl": "pkg:pypi/starlette@0.50.0", + "purl": "pkg:pypi/starlette@1.6.0", "type": "library", - "version": "0.50.0" + "version": "1.6.0" }, { "bom-ref": "pkg:golang/stdlib@1.22.2?package-id=1e8342544956a9b9", @@ -114072,7 +116695,7 @@ "version": "go1.22.2" }, { - "bom-ref": "pkg:golang/stdlib@1.26.1?package-id=ea52cdcb3c9285a2", + "bom-ref": "pkg:golang/stdlib@1.26.1?package-id=dcebd14ddc78fa8e", "cpe": "cpe:2.3:a:golang:go:1.26.1:-:*:*:*:*:*:*", "licenses": [ { @@ -114189,13 +116812,13 @@ "version": "0.10.0" }, { - "bom-ref": "pkg:deb/ubuntu/tar@1.35%2Bdfsg-3build1?arch=arm64&distro=ubuntu-24.04&package-id=53b070b5070e6b3f", - "cpe": "cpe:2.3:a:tar:tar:1.35\\+dfsg-3build1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/tar@1.35%2Bdfsg-3ubuntu0.4?arch=arm64&distro=ubuntu-24.04&package-id=f943748b4be60b8c", + "cpe": "cpe:2.3:a:tar:tar:1.35\\+dfsg-3ubuntu0.4:*:*:*:*:*:*:*", "name": "tar", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/tar@1.35%2Bdfsg-3build1?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/tar@1.35%2Bdfsg-3ubuntu0.4?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "1.35+dfsg-3build1" + "version": "1.35+dfsg-3ubuntu0.4" }, { "author": "Google Inc. ", @@ -114231,12 +116854,12 @@ }, { "author": "NVIDIA Corporation", - "bom-ref": "pkg:pypi/tensorrt-llm@1.3.0rc25?package-id=a1a55f71a708adc0", - "cpe": "cpe:2.3:a:nvidia_corporation_project:python-tensorrt-llm:1.3.0rc25:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/tensorrt-llm@1.3.0rc27?package-id=7719e866ccb36a1a", + "cpe": "cpe:2.3:a:nvidia_corporation_project:python-tensorrt-llm:1.3.0rc27:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/wheel/tensorrt_llm-1.3.0rc25-cp312-cp312-linux_aarch64.whl" + "url": "file:///tmp/wheel/tensorrt_llm-1.3.0rc27-cp312-cp312-linux_aarch64.whl" } ], "licenses": [ @@ -114247,9 +116870,9 @@ } ], "name": "tensorrt-llm", - "purl": "pkg:pypi/tensorrt-llm@1.3.0rc25", + "purl": "pkg:pypi/tensorrt-llm@1.3.0rc27", "type": "library", - "version": "1.3.0rc25" + "version": "1.3.0rc27" }, { "author": "Jupyter Development Team ", @@ -114325,19 +116948,12 @@ }, { "author": "Simon Sapin ", - "bom-ref": "pkg:pypi/tinycss2@1.4.0?package-id=ebdca3546c39465e", - "cpe": "cpe:2.3:a:simon_sapin_\\, Anthony Moi ", @@ -114348,22 +116964,6 @@ "type": "library", "version": "0.22.2" }, - { - "author": "William Pearson ", - "bom-ref": "pkg:pypi/toml@0.10.2?package-id=d5b0f60c2549071e", - "cpe": "cpe:2.3:a:william_pearson_project:python-toml:0.10.2:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "name": "toml", - "purl": "pkg:pypi/toml@0.10.2", - "type": "library", - "version": "0.10.2" - }, { "author": "Taneli Hukkinen ", "bom-ref": "pkg:pypi/tomli@2.0.1?package-id=d4f7a0f25cfa618f", @@ -114398,25 +116998,23 @@ }, { "author": "PyTorch Team ", - "bom-ref": "pkg:pypi/torch@2.12.0a0%2B5aff3928d8.nv26.5.50603568?package-id=5a4f5fa2c4ef6c72", - "cpe": "cpe:2.3:a:pytorch_team_\\", - "bom-ref": "pkg:pypi/torch-tensorrt@2.12.0a0?package-id=cc35c6dfb36eb4dd", - "cpe": "cpe:2.3:a:nvidia_corporation_\\", @@ -114482,8 +117080,8 @@ }, { "author": "PyTorch Team ", - "bom-ref": "pkg:pypi/torchtitan@0.2.2%2Bgita00ef7df?package-id=c0593e9ba1980fbc", - "cpe": "cpe:2.3:a:pytorch_team_\\", - "bom-ref": "pkg:pypi/torchtitan@0.2.2%2Bgita00ef7df?package-id=e59de3f172c84791", - "cpe": "cpe:2.3:a:pytorch_team_\\", - "bom-ref": "pkg:pypi/torchvision@0.27.0a0%2B6214cb20.nv26.5.50603568?package-id=a6fd72c580ac9a0f", - "cpe": "cpe:2.3:a:pytorch_core_team_project:python-torchvision:0.27.0a0\\+6214cb20.nv26.5.50603568:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/torchvision@0.29.0a0%2B0bc41e67.nv26.8.63802676?package-id=56ae9ec29cc0a6dc", + "cpe": "cpe:2.3:a:pytorch_core_team_project:python-torchvision:0.29.0a0\\+0bc41e67.nv26.8.63802676:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///opt/transfer/torchvision-0.27.0a0%2B6214cb20.nv26.5.50603568-cp312-cp312-manylinux_2_28_aarch64.whl" + "url": "file:///opt/transfer/torchvision-0.29.0a0%2B0bc41e67.nv26.8.63802676-cp312-cp312-manylinux_2_34_aarch64.whl" } ], "licenses": [ @@ -114536,9 +117134,9 @@ } ], "name": "torchvision", - "purl": "pkg:pypi/torchvision@0.27.0a0%2B6214cb20.nv26.5.50603568", + "purl": "pkg:pypi/torchvision@0.29.0a0%2B0bc41e67.nv26.8.63802676", "type": "library", - "version": "0.27.0a0+6214cb20.nv26.5.50603568" + "version": "0.29.0a0+0bc41e67.nv26.8.63802676" }, { "author": "Facebook ", @@ -114557,22 +117155,22 @@ "version": "6.5.8" }, { - "bom-ref": "pkg:pypi/tqdm@4.67.3?package-id=949fbc480f6c2cd9", - "cpe": "cpe:2.3:a:python-tqdm:python-tqdm:4.67.3:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/tqdm@4.70.0?package-id=498f4650d60d6c04", + "cpe": "cpe:2.3:a:python-tqdm:python-tqdm:4.70.0:*:*:*:*:*:*:*", "licenses": [ { "expression": "MPL-2.0 AND MIT" } ], "name": "tqdm", - "purl": "pkg:pypi/tqdm@4.67.3", + "purl": "pkg:pypi/tqdm@4.70.0", "type": "library", - "version": "4.67.3" + "version": "4.70.0" }, { "author": "IPython Development Team ", - "bom-ref": "pkg:pypi/traitlets@5.15.0?package-id=f6b13b1f0e48b502", - "cpe": "cpe:2.3:a:ipython_development_team_\\", @@ -114617,12 +117215,12 @@ }, { "author": "Philippe Tillet ", - "bom-ref": "pkg:pypi/triton@3.7.0%2Bgitb4e20bb.nv26.5?package-id=c7d489ef1072bf27", - "cpe": "cpe:2.3:a:philippe_tillet_project:python-triton:3.7.0\\+gitb4e20bb.nv26.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/triton@3.8.0%2Bgit4c7e62b7.nv26.8?package-id=ed0a0af78826c651", + "cpe": "cpe:2.3:a:philippe_tillet_project:python-triton:3.8.0\\+git4c7e62b7.nv26.8:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/dist/triton-3.7.0%2Bgitb4e20bb.nv26.5-cp312-cp312-linux_aarch64.whl" + "url": "file:///tmp/dist/triton-3.8.0%2Bgit4c7e62b7.nv26.8-cp312-cp312-linux_aarch64.whl" } ], "licenses": [ @@ -114633,23 +117231,23 @@ } ], "name": "triton", - "purl": "pkg:pypi/triton@3.7.0%2Bgitb4e20bb.nv26.5", + "purl": "pkg:pypi/triton@3.8.0%2Bgit4c7e62b7.nv26.8", "type": "library", - "version": "3.7.0+gitb4e20bb.nv26.5" + "version": "3.8.0+git4c7e62b7.nv26.8" }, { - "bom-ref": "pkg:pypi/triton-kernels@1.0.0%2Bgitb4e20bb.nv26.5?package-id=07778633e6556e44", - "cpe": "cpe:2.3:a:python-triton-kernels:python-triton-kernels:1.0.0\\+gitb4e20bb.nv26.5:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/triton-kernels@1.0.0%2Bgit4c7e62b7.nv26.8?package-id=fe609e552d8b5614", + "cpe": "cpe:2.3:a:python-triton-kernels:python-triton-kernels:1.0.0\\+git4c7e62b7.nv26.8:*:*:*:*:*:*:*", "externalReferences": [ { "type": "vcs", - "url": "file:///tmp/dist/triton_kernels-1.0.0%2Bgitb4e20bb.nv26.5-py3-none-any.whl" + "url": "file:///tmp/dist/triton_kernels-1.0.0%2Bgit4c7e62b7.nv26.8-py3-none-any.whl" } ], "name": "triton-kernels", - "purl": "pkg:pypi/triton-kernels@1.0.0%2Bgitb4e20bb.nv26.5", + "purl": "pkg:pypi/triton-kernels@1.0.0%2Bgit4c7e62b7.nv26.8", "type": "library", - "version": "1.0.0+gitb4e20bb.nv26.5" + "version": "1.0.0+git4c7e62b7.nv26.8" }, { "author": "Seth Michael Larson , David Glick ", @@ -114685,8 +117283,8 @@ }, { "author": "Alex Gr\u00f6nholm ", - "bom-ref": "pkg:pypi/typeguard@4.5.1?package-id=98878e96d31eeee3", - "cpe": "cpe:2.3:a:python-typeguard:python-typeguard:4.5.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/typeguard@4.6.0?package-id=8a734599177bbb6b", + "cpe": "cpe:2.3:a:python-typeguard:python-typeguard:4.6.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114695,14 +117293,14 @@ } ], "name": "typeguard", - "purl": "pkg:pypi/typeguard@4.5.1", + "purl": "pkg:pypi/typeguard@4.6.0", "type": "library", - "version": "4.5.1" + "version": "4.6.0" }, { "author": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "bom-ref": "pkg:pypi/typer@0.25.1?package-id=deb2e4420aa56b80", - "cpe": "cpe:2.3:a:python-typer:python-typer:0.25.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/typer@0.27.2?package-id=6b64c5d4446832f9", + "cpe": "cpe:2.3:a:python-typer:python-typer:0.27.2:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114711,9 +117309,9 @@ } ], "name": "typer", - "purl": "pkg:pypi/typer@0.25.1", + "purl": "pkg:pypi/typer@0.27.2", "type": "library", - "version": "0.25.1" + "version": "0.27.2" }, { "author": "\"Guido van Rossum, Jukka Lehtosalo, \u0141ukasz Langa, Michael Lee\" ", @@ -114733,8 +117331,8 @@ }, { "author": "\"Guido van Rossum, Jukka Lehtosalo, \u0141ukasz Langa, Michael Lee\" ", - "bom-ref": "pkg:pypi/typing-extensions@4.15.0?package-id=72b3436982f9750f", - "cpe": "cpe:2.3:a:python-typing-extensions:python-typing-extensions:4.15.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/typing-extensions@4.16.0?package-id=0abce382bad46f63", + "cpe": "cpe:2.3:a:python-typing-extensions:python-typing-extensions:4.16.0:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114743,14 +117341,14 @@ } ], "name": "typing-extensions", - "purl": "pkg:pypi/typing-extensions@4.15.0", + "purl": "pkg:pypi/typing-extensions@4.16.0", "type": "library", - "version": "4.15.0" + "version": "4.16.0" }, { "author": "Victorien Plot ", - "bom-ref": "pkg:pypi/typing-inspection@0.4.2?package-id=d0e0d066528bf209", - "cpe": "cpe:2.3:a:victorien_plot_\\", - "bom-ref": "pkg:pypi/tyro@1.0.13?package-id=2ecb50c515f117a6", - "cpe": "cpe:2.3:a:brentyi_\\", - "bom-ref": "pkg:pypi/tzdata@2026.2?package-id=5a9cc20dbae51976", - "cpe": "cpe:2.3:a:python_software_foundation_project:python-tzdata:2026.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/tzdata@2026.3?package-id=72bc0796c4f968d7", + "cpe": "cpe:2.3:a:python_software_foundation_project:python-tzdata:2026.3:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -114791,18 +117389,18 @@ } ], "name": "tzdata", - "purl": "pkg:pypi/tzdata@2026.2", + "purl": "pkg:pypi/tzdata@2026.3", "type": "library", - "version": "2026.2" + "version": "2026.3" }, { - "bom-ref": "pkg:deb/ubuntu/tzdata@2026a-0ubuntu0.24.04.1?arch=all&distro=ubuntu-24.04&package-id=3e5f4bcca701ec9c", - "cpe": "cpe:2.3:a:tzdata:tzdata:2026a-0ubuntu0.24.04.1:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/tzdata@2026c-0ubuntu0.24.04.1?arch=all&distro=ubuntu-24.04&package-id=99b373dd6f1b14e5", + "cpe": "cpe:2.3:a:tzdata:tzdata:2026c-0ubuntu0.24.04.1:*:*:*:*:*:*:*", "name": "tzdata", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/tzdata@2026a-0ubuntu0.24.04.1?arch=all&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/tzdata@2026c-0ubuntu0.24.04.1?arch=all&distro=ubuntu-24.04", "type": "library", - "version": "2026a-0ubuntu0.24.04.1" + "version": "2026c-0ubuntu0.24.04.1" }, { "bom-ref": "os:ubuntu@24.04", @@ -114955,45 +117553,45 @@ "version": "0.22.1" }, { - "bom-ref": "pkg:deb/ubuntu/vim@2%3A9.1.0016-1ubuntu7.13?arch=arm64&distro=ubuntu-24.04&package-id=381c951474f0718d", - "cpe": "cpe:2.3:a:vim:vim:2\\:9.1.0016-1ubuntu7.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/vim@2%3A9.1.0016-1ubuntu7.19?arch=arm64&distro=ubuntu-24.04&package-id=e29ed5e14933209a", + "cpe": "cpe:2.3:a:vim:vim:2\\:9.1.0016-1ubuntu7.19:*:*:*:*:*:*:*", "name": "vim", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/vim@2%3A9.1.0016-1ubuntu7.13?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/vim@2%3A9.1.0016-1ubuntu7.19?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "2:9.1.0016-1ubuntu7.13" + "version": "2:9.1.0016-1ubuntu7.19" }, { - "bom-ref": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.13?arch=all&distro=ubuntu-24.04&package-id=4652f221b71bf7e8&upstream=vim", - "cpe": "cpe:2.3:a:vim-common:vim-common:2\\:9.1.0016-1ubuntu7.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.19?arch=all&distro=ubuntu-24.04&package-id=2a7ea43b93587468&upstream=vim", + "cpe": "cpe:2.3:a:vim-common:vim-common:2\\:9.1.0016-1ubuntu7.19:*:*:*:*:*:*:*", "name": "vim-common", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.13?arch=all&distro=ubuntu-24.04&upstream=vim", + "purl": "pkg:deb/ubuntu/vim-common@2%3A9.1.0016-1ubuntu7.19?arch=all&distro=ubuntu-24.04&upstream=vim", "type": "library", - "version": "2:9.1.0016-1ubuntu7.13" + "version": "2:9.1.0016-1ubuntu7.19" }, { - "bom-ref": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.13?arch=all&distro=ubuntu-24.04&package-id=37aac5ec90a25f34&upstream=vim", - "cpe": "cpe:2.3:a:vim-runtime:vim-runtime:2\\:9.1.0016-1ubuntu7.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.19?arch=all&distro=ubuntu-24.04&package-id=817979ba7a9a3158&upstream=vim", + "cpe": "cpe:2.3:a:vim-runtime:vim-runtime:2\\:9.1.0016-1ubuntu7.19:*:*:*:*:*:*:*", "name": "vim-runtime", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.13?arch=all&distro=ubuntu-24.04&upstream=vim", + "purl": "pkg:deb/ubuntu/vim-runtime@2%3A9.1.0016-1ubuntu7.19?arch=all&distro=ubuntu-24.04&upstream=vim", "type": "library", - "version": "2:9.1.0016-1ubuntu7.13" + "version": "2:9.1.0016-1ubuntu7.19" }, { - "bom-ref": "pkg:deb/ubuntu/vim-tiny@2%3A9.1.0016-1ubuntu7.13?arch=arm64&distro=ubuntu-24.04&package-id=34a2ff533a83974c&upstream=vim", - "cpe": "cpe:2.3:a:vim-tiny:vim-tiny:2\\:9.1.0016-1ubuntu7.13:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/vim-tiny@2%3A9.1.0016-1ubuntu7.19?arch=arm64&distro=ubuntu-24.04&package-id=202b04f60ed1b1b7&upstream=vim", + "cpe": "cpe:2.3:a:vim-tiny:vim-tiny:2\\:9.1.0016-1ubuntu7.19:*:*:*:*:*:*:*", "name": "vim-tiny", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/vim-tiny@2%3A9.1.0016-1ubuntu7.13?arch=arm64&distro=ubuntu-24.04&upstream=vim", + "purl": "pkg:deb/ubuntu/vim-tiny@2%3A9.1.0016-1ubuntu7.19?arch=arm64&distro=ubuntu-24.04&upstream=vim", "type": "library", - "version": "2:9.1.0016-1ubuntu7.13" + "version": "2:9.1.0016-1ubuntu7.19" }, { "author": "Jeff Quast ", - "bom-ref": "pkg:pypi/wcwidth@0.7.0?package-id=e2fbec287611a82f", - "cpe": "cpe:2.3:a:jeff_quast_\\", - "bom-ref": "pkg:pypi/webencodings@0.5.1?package-id=7dfd89d22b307a2f", - "cpe": "cpe:2.3:a:geoffrey_sneddon_project:python-webencodings:0.5.1:*:*:*:*:*:*:*", - "licenses": [ - { - "license": { - "name": "BSD" - } - } - ], + "author": "Simon Sapin ", + "bom-ref": "pkg:pypi/webencodings@0.6.1?package-id=2ed9f6b06204cb2a", + "cpe": "cpe:2.3:a:simon_sapin_\\", @@ -115089,8 +117680,8 @@ }, { "author": "Daniel Holth ", - "bom-ref": "pkg:pypi/wheel@0.47.0?package-id=269ecec257e34ef1", - "cpe": "cpe:2.3:a:daniel_holth_\\", - "bom-ref": "pkg:pypi/xdsl@0.69.0?package-id=e986b8f91aa3e184", - "cpe": "cpe:2.3:a:mathieu_fehr_\\", - "purl": "pkg:deb/ubuntu/xml-core@0.19?arch=all&distro=ubuntu-24.04", - "type": "library", - "version": "0.19" - }, { "author": "Yue Du ", - "bom-ref": "pkg:pypi/xxhash@3.7.0?package-id=cd8149c61af44656", - "cpe": "cpe:2.3:a:ifduyue_project:python-xxhash:3.7.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/xxhash@4.0.1?package-id=5217c65f0be0f36a", + "cpe": "cpe:2.3:a:ifduyue_project:python-xxhash:4.0.1:*:*:*:*:*:*:*", "licenses": [ { "license": { - "name": "BSD" + "id": "BSD-2-Clause" } } ], "name": "xxhash", - "purl": "pkg:pypi/xxhash@3.7.0", + "purl": "pkg:pypi/xxhash@4.0.1", "type": "library", - "version": "3.7.0" + "version": "4.0.1" }, { - "bom-ref": "pkg:deb/ubuntu/xz-utils@5.6.1%2Breally5.4.5-1ubuntu0.2?arch=arm64&distro=ubuntu-24.04&package-id=c5cb5e9443a3139b", - "cpe": "cpe:2.3:a:xz-utils:xz-utils:5.6.1\\+really5.4.5-1ubuntu0.2:*:*:*:*:*:*:*", + "bom-ref": "pkg:deb/ubuntu/xz-utils@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=arm64&distro=ubuntu-24.04&package-id=c503aee7e3af2d0c", + "cpe": "cpe:2.3:a:xz-utils:xz-utils:5.6.1\\+really5.4.5-1ubuntu0.3:*:*:*:*:*:*:*", "name": "xz-utils", "publisher": "Ubuntu Developers ", - "purl": "pkg:deb/ubuntu/xz-utils@5.6.1%2Breally5.4.5-1ubuntu0.2?arch=arm64&distro=ubuntu-24.04", + "purl": "pkg:deb/ubuntu/xz-utils@5.6.1%2Breally5.4.5-1ubuntu0.3?arch=arm64&distro=ubuntu-24.04", "type": "library", - "version": "5.6.1+really5.4.5-1ubuntu0.2" + "version": "5.6.1+really5.4.5-1ubuntu0.3" }, { "author": "Andrew Svetlov ", - "bom-ref": "pkg:pypi/yarl@1.23.0?package-id=48858a898f07f97e", - "cpe": "cpe:2.3:a:andrew_svetlov_project:python-yarl:1.23.0:*:*:*:*:*:*:*", + "bom-ref": "pkg:pypi/yarl@1.24.5?package-id=e0f3b5b3dda1f25e", + "cpe": "cpe:2.3:a:andrew_svetlov_project:python-yarl:1.24.5:*:*:*:*:*:*:*", "licenses": [ { "license": { @@ -115190,9 +117772,9 @@ } ], "name": "yarl", - "purl": "pkg:pypi/yarl@1.23.0", + "purl": "pkg:pypi/yarl@1.24.5", "type": "library", - "version": "1.23.0" + "version": "1.24.5" }, { "author": "\"Jason R. Coombs\" ", @@ -115228,8 +117810,8 @@ }, { "author": "\"Jason R. Coombs\" ", - "bom-ref": "pkg:pypi/zipp@3.23.1?package-id=09e8ec7e7a7ec630", - "cpe": "cpe:2.3:a:\\\"jason_r__coombs\\\"_\\/copyright` file. +by parsing each package's `/usr/share/doc//copyright` file. A removed +package stays in the inventory while any conffile it left is on disk; see +_conffiles_on_disk. Two parsers: - DEP-5 (machine-readable copyright format): structured `License:` fields @@ -23,6 +25,7 @@ from __future__ import annotations import logging +import os import re import subprocess from pathlib import Path @@ -36,6 +39,22 @@ _COPYRIGHT_DIR = Path("usr/share/doc") +# dpkg states that do not mean "installed". In `not-installed`, no file of the +# package is on disk. `config-files` means removed but not purged: dpkg deleted +# the package's files and kept its conffiles, and those still ship in the image. +# The TensorRT-LLM base images leave doca-sdk-common (a script under +# /etc/profile.d and an ld.so.conf.d entry) and dpdk-community (an ld.so.conf.d +# entry) this way. So a `config-files` package is skipped only when none of its +# conffiles is left, and otherwise needs a license like any other package; the +# copyright file went with the removal, so that is usually an override. Every +# other state (installed, unpacked, half-configured, half-installed, triggers-*) +# leaves the unpacked files in place, so those stay in the inventory. +_NOT_INSTALLED = "not-installed" +_CONFFILES_ONLY = "config-files" + +# One line of dpkg's Conffiles field: " [flags]". +_CONFFILE_LINE = re.compile(r"^\s*(/.+?)\s+(?:[0-9a-f]{32}|newconffile)(?:\s+\S+)*\s*$") + # ---- Debian short-name → SPDX ID mapping ---------------------------------------- @@ -398,6 +417,38 @@ def _resolve_license(pkg_name: str, version: str = "", root: Path = Path("/")) - # ---- Distribution scan --------------------------------------------------------- +def _dpkg_query_cmd(root: Path, *args: str) -> list[str]: + cmd = ["dpkg-query", *args] + if root != Path("/"): + cmd.insert(1, f"--admindir={root / 'var/lib/dpkg'}") + return cmd + + +def _conffiles_on_disk(name: str, root: Path) -> list[str] | None: + """Return the conffiles of a removed package that are still under `root`. + + None when dpkg-query lists no conffile for it, or fails: the package is + then kept, because only a listed conffile that is gone proves the removal + left nothing behind. + """ + result = subprocess.run( + _dpkg_query_cmd(root, "-W", "-f=${Conffiles}\\n", name), + capture_output=True, + text=True, + check=False, + ) + if result.returncode != 0: + return None + listed = [ + match.group(1) + for match in map(_CONFFILE_LINE.match, result.stdout.splitlines()) + if match + ] + if not listed: + return None + return [path for path in listed if os.path.lexists(root / path.lstrip("/"))] + + def collect_components(root: Path = Path("/")) -> list[Component]: """Run dpkg-query, resolve licenses, return Components. @@ -406,9 +457,9 @@ def collect_components(root: Path = Path("/")) -> list[Component]: (e.g. macOS dev shells, Alpine builders, distroless images). Inside the runtime images we ship, dpkg-query is always present. """ - cmd = ["dpkg-query", "-W", "-f=${Package}\\t${Version}\\n"] - if root != Path("/"): - cmd.insert(1, f"--admindir={root / 'var/lib/dpkg'}") + cmd = _dpkg_query_cmd( + root, "-W", "-f=${Package}\\t${Version}\\t${db:Status-Status}\\n" + ) try: result = subprocess.run(cmd, capture_output=True, text=True, check=True) @@ -422,14 +473,30 @@ def collect_components(root: Path = Path("/")) -> list[Component]: components: list[Component] = [] unresolved = 0 + skipped: list[str] = [] + leftovers: list[str] = [] for line in result.stdout.splitlines(): if "\t" not in line: continue - name, version = line.split("\t", 1) - name = name.strip() - version = version.strip() + fields = line.split("\t", 2) + name = fields[0].strip() + version = fields[1].strip() + # Empty when dpkg-query does not know the field: it prints nothing and + # still exits 0, so an unsupported field must not empty the inventory. + status = fields[2].strip() if len(fields) > 2 else "" if not name or not version: continue + if status == _NOT_INSTALLED: + skipped.append(f"{name}@{version} ({status})") + continue + if status == _CONFFILES_ONLY: + left = _conffiles_on_disk(name, root) + if left == []: + skipped.append(f"{name}@{version} ({status}, no conffile left)") + continue + leftovers.append( + f"{name}@{version} ({', '.join(left or ['conffiles not listed'])})" + ) spdx = _resolve_license(name, version, root) if spdx == UNKNOWN: unresolved += 1 @@ -444,11 +511,22 @@ def collect_components(root: Path = Path("/")) -> list[Component]: ) logger.info( - "Collected %d dpkg packages from %s (%d unresolved → UNKNOWN)", + "Collected %d dpkg packages from %s (%d unresolved → UNKNOWN, " + "%d skipped with no files left)", len(components), root, unresolved, + len(skipped), ) + if skipped: + logger.info("Skipped dpkg entries: %s", ", ".join(sorted(skipped))) + if leftovers: + # Name the files: these packages are removed, and what the NOTICES + # entry covers is only the conffiles listed here. + logger.info( + "Removed dpkg packages kept for their conffiles: %s", + "; ".join(sorted(leftovers)), + ) return components diff --git a/container/compliance/license_overrides.yaml b/container/compliance/license_overrides.yaml index 8c0114a6b4fe..2f5a4ce6ebff 100644 --- a/container/compliance/license_overrides.yaml +++ b/container/compliance/license_overrides.yaml @@ -304,6 +304,9 @@ overrides: - { ecosystem: dpkg, name: libnvptxcompiler-13-0, license: LicenseRef-NVIDIA-Proprietary, source: "NVIDIA CUDA Toolkit EULA" } - { ecosystem: dpkg, name: libnvvm-13-0, license: LicenseRef-NVIDIA-Proprietary, source: "NVIDIA CUDA Toolkit EULA" } - { ecosystem: dpkg, name: mlnx-dpdk, license: "BSD-3-Clause", source: "Mellanox build of upstream DPDK — https://www.dpdk.org/about/legal/" } + # TRT-LLM 1.3.0rc27's base removes this package and keeps its ld.so.conf.d conffile. + # The .deb (DOCA 3.5.0 repo) ships no copyright file; its only SPDX tags are BSD-3-Clause. + - { ecosystem: dpkg, name: dpdk-community, license: "BSD-3-Clause", source: "NVIDIA DOCA build of upstream DPDK — https://www.dpdk.org/about/legal/" } # --- NVIDIA DOCA SDK (cuda-dl-base 25.11 ships these) --- - { ecosystem: dpkg, name: doca-sdk-common, license: LicenseRef-NVIDIA-Proprietary, source: "NVIDIA DOCA SDK License — https://developer.nvidia.com/doca" } diff --git a/container/compliance/policy/codec_policy.yaml b/container/compliance/policy/codec_policy.yaml index fe2193967f2f..b914f494d8fb 100644 --- a/container/compliance/policy/codec_policy.yaml +++ b/container/compliance/policy/codec_policy.yaml @@ -103,26 +103,33 @@ exceptions: libraries on their own breaks `import nvidia.dali` outright. The vendored set is all-or-nothing with the package. - The entry stays even so. trtllm_runtime.Dockerfile now pins - nvidia-dali-cuda130>=2.1.1, so the vendored libraries no longer register - those decoders -- but they are still on disk and still match the deny globs - above, which gate on presence rather than content. What changed is the - reason for the waiver: it now covers a vendored ffmpeg that carries no - software h264/hevc/aac, rather than one that does. + The entry stays even so. trtllm_runtime.Dockerfile pins + nvidia-dali-cuda130==2.2.0, which is the version the 1.3.0rc27 base image + already carries, so the pin now holds a version rather than moving one. The + vendored libraries do not register those decoders -- but they are still on + disk and still match the deny globs above, which gate on presence rather + than content. What changed is the reason for the waiver: it now covers a + vendored ffmpeg that carries no software h264/hevc/aac, rather than one + that does. Enforcement lives at build time, not here. Two guards in - trtllm_runtime.Dockerfile enumerate every bundled libavcodec -- one after - the upgrade, and one after the overlay COPY, which is the only stage where - a missed whiteout can leave the base image's older copy sitting beside the - upgraded one -- and tests/dependencies/test_no_software_video_codecs.py - repeats the check against the shipped image. + trtllm_runtime.Dockerfile enumerate every bundled libavcodec -- one in + runtime_full after the pinned install, and one after the overlay COPY, + which is the only stage where a missed whiteout can leave the base image's + older copy sitting beside the upgraded one -- and + tests/dependencies/test_no_software_video_codecs.py repeats the check + against the shipped image. Both guards fail when their glob matches + nothing, because a loop over an empty glob checks nothing and exits 0. Deliberately NOT expressed as a deny_components version floor: nvidia-dali-cuda130 appears in the base-image SBOM and is therefore subtracted from the generated delta, so such an entry would never match anything and would read as a check while doing nothing. - Re-measure when the vendored version moves. + Re-measure when the vendored version moves. Last measured against + nvcr.io/nvidia/tensorrt-llm/release:1.3.0rc27, whose base carries 2.2.0: + 440 decoders, h264, hevc, aac, aac_fixed and aac_latm absent, vp8, vp9, + mjpeg and av1 present. owner: DALI # PyNvVideoCodec (added for NVDEC hardware video decode) vendors libavutil and # libavformat under its package dir to demux input containers before handing the diff --git a/container/compliance/tests/test_dpkg_generator.py b/container/compliance/tests/test_dpkg_generator.py new file mode 100644 index 000000000000..34b3b3c9651e --- /dev/null +++ b/container/compliance/tests/test_dpkg_generator.py @@ -0,0 +1,230 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +"""Tests for the dpkg inventory scan. + +Run from the repo root with the compliance package on the path: + + PYTHONPATH=container python -m pytest container/compliance/tests/test_dpkg_generator.py +""" + +from __future__ import annotations + +import shutil +import subprocess +from pathlib import Path + +import pytest +from compliance.generators import dpkg + +# CPU-only unit tests; markers are required by .ai/pytest-guidelines.md +# (lifecycle / test-type / hardware categories). +pytestmark = [pytest.mark.pre_merge, pytest.mark.unit, pytest.mark.gpu_0] + + +def _fake_dpkg_query( + monkeypatch: pytest.MonkeyPatch, + listing: str, + conffiles: dict[str, str] | None = None, + conffiles_returncode: int = 0, +) -> None: + """Make dpkg.collect_components read `listing` instead of the real tool. + + The per-package `${Conffiles}` query answers from `conffiles`, keyed by the + package name the generator asks about. + """ + conffiles = conffiles or {} + + def _run(cmd, **kwargs): # noqa: ANN001 - mirrors subprocess.run's signature + if "-f=${Conffiles}\\n" in cmd: + stdout = conffiles.get(cmd[-1], "") + return subprocess.CompletedProcess( + cmd, conffiles_returncode, stdout=stdout, stderr="" + ) + return subprocess.CompletedProcess(cmd, 0, stdout=listing, stderr="") + + monkeypatch.setattr(dpkg.subprocess, "run", _run) + + +def _names(components) -> set[str]: # noqa: ANN001 - list[Component] + return {c.name for c in components} + + +def _touch(root: Path, path: str) -> None: + target = root / path.lstrip("/") + target.parent.mkdir(parents=True, exist_ok=True) + target.write_text("x\n") + + +# The conffile paths the TensorRT-LLM 1.3.0rc27 base image lists for the two +# packages it removes, in dpkg's Conffiles field shape (placeholder md5 sums). +_DPDK_CONFFILES = ( + " /etc/ld.so.conf.d/dpdk-x86_64-linux-gnu.conf 0123456789abcdef0123456789abcdef\n" +) +_DOCA_CONFFILES = ( + " /etc/ld.so.conf.d/doca-runtime-x86_64-linux-gnu.conf 0123456789abcdef0123456789abcdef\n" + " /etc/profile.d/doca-runtime.sh fedcba9876543210fedcba9876543210\n" +) +_REMOVED_LISTING = ( + "bash\t5.2.21-2ubuntu4\tinstalled\n" + "dpdk-community\t26.03.0.5-1\tconfig-files\n" + "doca-sdk-common\t3.5.0095-1\tconfig-files\n" +) + + +def test_keeps_removed_packages_whose_conffiles_remain( + monkeypatch: pytest.MonkeyPatch, tmp_path: Path +) -> None: + """A `config-files` package still ships the conffiles it left, so it stays. + + The TensorRT-LLM base images install DOCA packages and remove them again: + dpdk-community keeps an ld.so.conf.d entry, and doca-sdk-common keeps a + script under /etc/profile.d. One surviving conffile is enough. + """ + _touch(tmp_path, "/etc/ld.so.conf.d/dpdk-x86_64-linux-gnu.conf") + _touch(tmp_path, "/etc/profile.d/doca-runtime.sh") + _fake_dpkg_query( + monkeypatch, + _REMOVED_LISTING, + conffiles={ + "dpdk-community": _DPDK_CONFFILES, + "doca-sdk-common": _DOCA_CONFFILES, + }, + ) + + names = _names(dpkg.collect_components(tmp_path)) + + assert names == {"bash", "dpdk-community", "doca-sdk-common"} + + +def test_skips_removed_packages_with_no_conffile_left( + monkeypatch: pytest.MonkeyPatch, tmp_path: Path +) -> None: + """Listed conffiles that are all gone prove the removal left nothing behind.""" + _fake_dpkg_query( + monkeypatch, + _REMOVED_LISTING + "somepkg\t1.0-1\tnot-installed\n", + conffiles={ + "dpdk-community": _DPDK_CONFFILES, + "doca-sdk-common": _DOCA_CONFFILES, + }, + ) + + names = _names(dpkg.collect_components(tmp_path)) + + assert names == {"bash"} + + +@pytest.mark.parametrize( + ("conffiles", "returncode"), + [({}, 0), ({"dpdk-community": _DPDK_CONFFILES}, 1)], + ids=["nothing-listed", "query-failed"], +) +def test_keeps_a_removed_package_whose_conffiles_are_not_listed( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + conffiles: dict[str, str], + returncode: int, +) -> None: + """Without a conffile list there is no proof that nothing was left, so keep it.""" + _fake_dpkg_query( + monkeypatch, + "dpdk-community\t26.03.0.5-1\tconfig-files\n", + conffiles=conffiles, + conffiles_returncode=returncode, + ) + + names = _names(dpkg.collect_components(tmp_path)) + + assert names == {"dpdk-community"} + + +def test_keeps_unpacked_and_half_configured_packages( + monkeypatch: pytest.MonkeyPatch, tmp_path: Path +) -> None: + """Every state other than not-installed and config-files leaves the files in place.""" + _fake_dpkg_query( + monkeypatch, + "a\t1\tinstalled\n" + "b\t2\tunpacked\n" + "c\t3\thalf-configured\n" + "d\t4\thalf-installed\n" + "e\t5\ttriggers-pending\n" + "f\t6\ttriggers-awaited\n", + ) + + names = _names(dpkg.collect_components(tmp_path)) + + assert names == {"a", "b", "c", "d", "e", "f"} + + +def test_keeps_everything_when_the_status_field_is_empty( + monkeypatch: pytest.MonkeyPatch, tmp_path: Path +) -> None: + """dpkg-query prints an empty value for a field it does not know, and exits 0. + + An unrecognized field must leave the inventory complete rather than empty: + an over-complete inventory is noise, an empty one passes the policy gate + while declaring nothing. + """ + _fake_dpkg_query(monkeypatch, "bash\t5.2.21-2ubuntu4\t\nzlib1g\t1:1.3.dfsg-3.1\t\n") + + names = _names(dpkg.collect_components(tmp_path)) + + assert names == {"bash", "zlib1g"} + + +@pytest.mark.skipif( + shutil.which("dpkg-query") is None, reason="needs a Debian/Ubuntu environment" +) +def test_real_dpkg_query_reports_the_status_field() -> None: + """Pin the field name against the real tool. + + `${db:Status-Status}` is what the filter reads. dpkg-query prints an empty + string for an unknown field and exits 0, so a typo here would disable the + filter silently on every image. + """ + result = subprocess.run( + ["dpkg-query", "-W", "-f=${Package}\\t${db:Status-Status}\\n"], + capture_output=True, + text=True, + check=True, + ) + statuses = { + line.split("\t", 1)[1] for line in result.stdout.splitlines() if "\t" in line + } + + assert statuses, "no packages reported; cannot tell whether the field resolved" + assert "" not in statuses, f"dpkg-query did not resolve the field: {statuses}" + assert statuses <= { + "not-installed", + "config-files", + "half-installed", + "unpacked", + "half-configured", + "triggers-awaited", + "triggers-pending", + "installed", + }, f"unexpected dpkg state: {statuses}" + + +@pytest.mark.skipif( + shutil.which("dpkg-query") is None, reason="needs a Debian/Ubuntu environment" +) +def test_real_dpkg_query_reports_conffiles_in_the_parsed_shape() -> None: + """Pin `${Conffiles}` and its line shape against the real tool. + + An unknown field prints nothing, and a line the pattern does not match is + dropped. Either one keeps every removed package, which fails safe but hides + the drift, so check that real conffile lines all parse. + """ + result = subprocess.run( + ["dpkg-query", "-W", "-f=${Conffiles}\\n"], + capture_output=True, + text=True, + check=True, + ) + lines = [line for line in result.stdout.splitlines() if line.strip()] + + assert lines, "no conffiles reported; cannot tell whether the field resolved" + unparsed = [line for line in lines if not dpkg._CONFFILE_LINE.match(line)] + assert not unparsed, f"conffile lines the pattern does not match: {unparsed[:5]}" diff --git a/container/context.yaml b/container/context.yaml index d5ae3e3c28a6..a4340f570f52 100644 --- a/container/context.yaml +++ b/container/context.yaml @@ -157,9 +157,9 @@ trtllm: base_image: nvcr.io/nvidia/cuda-dl-base runtime_image: nvcr.io/nvidia/tensorrt-llm/release base_image_tag: 26.02-cuda13.1-devel-ubuntu24.04 - runtime_image_tag: 1.3.0rc26 + runtime_image_tag: 1.3.0rc27 # Per-arch baseline stem (re-captured against tensorrt-llm/release, both arches). - baseline_sbom: release@2366e4b4 + baseline_sbom: release@2af29022 nixl_ref: v1.3.1 enable_media_ffmpeg: "false" enable_gpu_memory_service: "true" diff --git a/container/deps/trtllm/_dynamo_pmix_hostname.py b/container/deps/trtllm/_dynamo_pmix_hostname.py new file mode 100644 index 000000000000..9034d9a96d27 --- /dev/null +++ b/container/deps/trtllm/_dynamo_pmix_hostname.py @@ -0,0 +1,58 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +"""Give an Open MPI 5 singleton a hostname short enough for MPI_Comm_spawn. + +trtllm_runtime.Dockerfile installs this module, and a .pth line that imports +it when the interpreter starts, only where it selects Open MPI 5 (arm64). + +Open MPI 5.0.10rc2 cannot spawn from a singleton when the hostname length +plus the number of digits in the process ID exceeds 37. Open MPI passes the +singleton's name, "singleton...0", to the prte daemon through a +50-byte print buffer. A longer name is cut short, prte registers the wrong +name, and MPI.COMM_SELF.Spawn raises MPI_ERR_UNKNOWN. TRT-LLM starts its +workers that way, and Kubernetes pod names are often longer than that. + +PMIx takes the hostname from PMIX_HOSTNAME when that is set. So a process that +no MPI launcher started, on a host whose name is longer than 30 characters, +gets a short name derived from the real one: 30 plus the 7 digits of the +largest process ID is 37. A process that mpirun or prte started carries +PMIX_NAMESPACE and a PMIX_HOSTNAME of its own, and is left alone, so ranks that +mpirun or prte start keep their real hostnames. + +A PMIX_HOSTNAME that is already set is left alone, even when it is too long. + +This runs in every Python process, so it imports nothing beyond os unless it +has to set the name. + +Remove this module, its install step in trtllm_runtime.Dockerfile and its +tests in tests/dependencies/test_trtllm_mpi.py when the image's Open MPI has +the upstream fix, open-mpi/ompi#14398 (v5.0.x backport: open-mpi/ompi#14409). +Open MPI 5.0.11 and HPC-X v2.50 do not have it. Tracked in +NVIDIA/TensorRT-LLM#19607. +""" + +import os + +_MAX_SAFE_HOSTNAME = 30 + + +def short_pmix_hostname(hostname: str, *, launched: bool, preset: bool) -> str | None: + """Return the PMIX_HOSTNAME to set, or None to leave the environment alone. + + launched: an MPI launcher started this process (PMIX_NAMESPACE is set). + preset: PMIX_HOSTNAME is already set. + """ + if launched or preset or len(hostname) <= _MAX_SAFE_HOSTNAME: + return None + import zlib + + return f"pmix-{zlib.crc32(hostname.encode()):08x}" + + +_name = short_pmix_hostname( + os.uname().nodename, + launched="PMIX_NAMESPACE" in os.environ, + preset="PMIX_HOSTNAME" in os.environ, +) +if _name is not None: + os.environ["PMIX_HOSTNAME"] = _name diff --git a/container/dev/50-framework-paths.sh b/container/dev/50-framework-paths.sh index eba7223d2802..cda90216e306 100755 --- a/container/dev/50-framework-paths.sh +++ b/container/dev/50-framework-paths.sh @@ -11,12 +11,23 @@ if [ -d /usr/local/tensorrt/targets ]; then [ -d "$TENSORRT_LIB_DIR" ] && export LD_LIBRARY_PATH="${TENSORRT_LIB_DIR}:${LD_LIBRARY_PATH}" fi -if [ -d /opt/hpcx/ompi ]; then - export OPAL_PREFIX=/opt/hpcx/ompi +# /opt/dynamo/mpi is the Open MPI that trtllm_runtime.Dockerfile selects per +# architecture, and its ENV already points there. Prefer it, so that a login +# shell does not switch back to the base image's default at /opt/hpcx/ompi. +if [ -d /opt/dynamo/mpi ]; then + _mpi_prefix=/opt/dynamo/mpi +elif [ -d /opt/hpcx/ompi ]; then + _mpi_prefix=/opt/hpcx/ompi +else + _mpi_prefix= +fi +if [ -n "${_mpi_prefix}" ]; then + export OPAL_PREFIX="${_mpi_prefix}" export OMPI_MCA_coll_ucc_enable=0 - export PATH="/opt/hpcx/ompi/bin:${PATH}" - export LD_LIBRARY_PATH="/opt/hpcx/ompi/lib:${LD_LIBRARY_PATH}" + export PATH="${_mpi_prefix}/bin:${PATH}" + export LD_LIBRARY_PATH="${_mpi_prefix}/lib:${LD_LIBRARY_PATH}" fi +unset _mpi_prefix [ -d /opt/hpcx/ucc/lib ] && export LD_LIBRARY_PATH="/opt/hpcx/ucc/lib:${LD_LIBRARY_PATH}" [ -f /etc/shinit_v2 ] && export ENV="${ENV:-/etc/shinit_v2}" diff --git a/container/templates/trtllm_runtime.Dockerfile b/container/templates/trtllm_runtime.Dockerfile index 732c0d7d4713..86916966d70b 100644 --- a/container/templates/trtllm_runtime.Dockerfile +++ b/container/templates/trtllm_runtime.Dockerfile @@ -42,13 +42,140 @@ ARG ENABLE_GPU_MEMORY_SERVICE ARG TARGETARCH ARG NIXL_REF +# Create the LD_PRELOAD target before the ENV below names it. ENV applies to +# every RUN after it, so a preload path that does not exist yet costs one +# `ld.so: object ... cannot be preloaded ... ignored` line per process for the +# rest of the stage: 432 of them from the apt layer alone, measured by building +# this stage against 1.3.0rc27. The lines are noise, and the preload the ENV +# exists to apply is absent from exactly the steps that follow it. +# +# The symlink gives system libstdc++ a stable path, which keeps +# PyInstaller-bundled tools (specifically `jet`, NVIDIA's internal +# PyInstaller-packaged CI runner) from shadowing it with an older copy. The +# `test -f` keeps the build honest if the base image moves the library. +RUN ARCH_ALT=$([ "${TARGETARCH}" = "amd64" ] && echo "x86_64" || echo "aarch64") && \ + mkdir -p /opt/dynamo && \ + LIBSTDCPP=/usr/lib/${ARCH_ALT}-linux-gnu/libstdc++.so.6 && \ + test -f "$LIBSTDCPP" && ln -sf "$LIBSTDCPP" /opt/dynamo/libstdc++.so.6 + +# One fixed path for the MPI the worker runs on, resolved per architecture, so a +# single ENV block below can name it. +# +# TRT-LLM spawns its executor ranks with MPI.COMM_SELF.Spawn through mpi4py's +# MpiPoolSession. 1.3.0rc27 repointed /opt/hpcx/ompi and /usr/local/mpi from +# ompi4 to ompi5, and on amd64 that spawn does not work: the child reaches +# mpi4py's barrier and dies there, so the worker never binds its gRPC port and +# every serving test waits out its deadline. Measured in the built image on an +# amd64 GPU host, running as the image's own uid 1000: VRAM stays at 456 MiB and +# nothing registers, and the log carries `ucp_ep_create(proc=0) failed: +# Destination is unreachable` followed by MPI_ERR_OTHER and MPI_ABORT. CI agrees +# from the other side: at f3fe60fe, where ompi4 reached the shipped image, both +# tests that hang elsewhere passed, 232s and 184s, and the 2-GPU amd64 job went +# green for the only time on this branch. +# +# arm64 keeps ompi5, and that is not a preference. ompi4 there lacks +# ompi_mpi_short_float, which the base image's libtorch_cpu.so needs, so the +# arm64 runtime sanity check fails on `import torch` the moment ompi4 wins. +# +# The symlink alone does not do it: with the ENV still naming ompi5's bin and +# prefix, Open MPI 4 cannot launch its own runtime and the spawn fails at +# dpm.c:1997. The three ENV entries below are what make it work, measured in the +# same image: VRAM 456 MiB to 6.7 GB to 41.6 GB, `Registered endpoint` once, and +# zero MPI errors. +# +# Selecting ompi4 also means taking on its etc/openmpi-mca-params.conf. The base +# image edits two lines of that file, and only in the Open MPI it selects itself: +# `hwloc_base_binding_policy = core` becomes `none`, and `btl = self` is +# commented out. In 1.3.0rc27 that is ompi5, so ompi4 keeps the HPC-X defaults. +# rc26's ompi4 file and rc27's ompi5 file are byte-identical, and rc27's ompi4 +# file differs from them at those two lines and nowhere else. +# +# The binding line is not cosmetic. `import tensorrt_llm` runs MPI_Init +# (tensorrt_llm/_utils.py imports mpi4py.MPI), and with `core` that singleton +# MPI_Init binds the calling process to CPUs 0-1. Every thread and child it +# starts inherits the mask. Measured on an amd64 GPU host in the image as +# shipped before this edit: a bare `import tensorrt_llm` went from 32 CPUs to +# [0, 1], and a running `python3 -m dynamo.trtllm` worker reported +# Cpus_allowed_list 0-1. The `btl = self` line leaves Open MPI's ob1 PML no +# transport between ranks: in the same image, `mpirun --mca pml ob1 -n 2` fails +# in MPI_INIT with "at least one MPI process is unreachable from another". The +# multi-node launch path passes that flag +# (deploy/operator/internal/dynamo/backend_trtllm.go). +# +# So apply the same two edits to whichever Open MPI is selected, and fail the +# build if either setting survives. The edits are idempotent: on a file that +# already has them, sed changes nothing and the guards pass. +# +# tests/dependencies/test_trtllm_mpi.py checks all of this in the built image: +# the link's target per architecture, the library mpi4py loads, a +# MPI.COMM_SELF.Spawn, a two-rank ob1 launch, the CPU affinity after MPI_Init, +# and the PMIX_HOSTNAME hook below. container/dev/50-framework-paths.sh prefers +# the same link in login shells. +# +# ompi5 has two spawn defects, and the amd64 choice avoids both. arm64 cannot +# avoid them that way, because of the libtorch symbol above. +# +# First, a singleton cannot MPI_Comm_spawn when the hostname length plus the +# digits of its pid exceeds 37. Open MPI passes the singleton's name, +# "singleton...0", to the prte daemon through a 50-byte print +# buffer. A longer name is cut short, prte registers the wrong name, and Spawn +# raises MPI_ERR_UNKNOWN. Measured on arm64 with a 2-digit pid, a 35-character +# hostname spawns and a 36-character one fails. CI's pod names are longer: ompi5 +# fails with the arm64 runner's 46-character name and with the amd64 runner's +# 50-character name, while ompi4 spawns with the 50-character one. A short +# PMIX_HOSTNAME fixes it, so where ompi5 is selected, a .pth line imports +# container/deps/trtllm/_dynamo_pmix_hostname.py when Python starts. It sets +# PMIX_HOSTNAME only for processes that no MPI launcher started, on hosts whose +# names are longer than 30 characters (30 plus the 7 digits of the largest pid +# is 37), so launched ranks keep the real hostname. A PMIX_HOSTNAME that is +# already set is left alone, even a long one. .dockerignore drops *.pth files, +# so the RUN writes that line itself. +# +# Second, on the amd64 GPU host above, spawn also depends on the network: UCX +# tries an address of another host interface (10.42.0.0, a k3s flannel address) +# and fails while the host's interfaces are visible. In a bridge network (eth0 +# and lo only), or with OMPI_MCA_pml=ob1, ompi5 spawns there. +# +# Transitional, in two parts. Re-measure each part rather than assume. +# - The hook. open-mpi/ompi#14398 fixes the first defect (v5.0.x backport: +# open-mpi/ompi#14409), and Mellanox/ompi's v5.0.x_hpcx branch has had it +# since Mellanox/ompi#61. No release had it yet: Open MPI 5.0.11 does not, and +# TRT-LLM 1.3.0rc27 and 1.3.0rc28 ship HPC-X v2.50 with Open MPI 5.0.10rc2. +# When the base image's /opt/hpcx/VERSION names a later HPC-X, run a spawn +# with a 46-character hostname (docker run --hostname) in an image without +# the hook. If it passes, delete the hook, its install step here, and its +# tests in tests/dependencies/test_trtllm_mpi.py. Tracked in +# NVIDIA/TensorRT-LLM#19607. +# - The amd64 ompi4 selection, the ENV entries and the test's per-architecture +# expectation. Delete them only when ompi5 spawns on amd64 without the hook, +# both in CI and on a host with the extra interfaces above. +RUN --mount=type=bind,source=./container/deps/trtllm/_dynamo_pmix_hostname.py,target=/tmp/_dynamo_pmix_hostname.py \ + if [ "${TARGETARCH}" = "amd64" ]; then t=/opt/hpcx/ompi4; else t=/opt/hpcx/ompi5; fi && \ + test -d "$t" && \ + conf="$t/etc/openmpi-mca-params.conf" && \ + test -f "$conf" && \ + sed -i -e 's/^\(hwloc_base_binding_policy\) = core$/\1 = none/' \ + -e 's/^\(btl = self\)$/#\1/' "$conf" && \ + ! grep -qE '^[[:space:]]*hwloc_base_binding_policy[[:space:]]*=[[:space:]]*core' "$conf" && \ + ! grep -qE '^[[:space:]]*btl[[:space:]]*=[[:space:]]*self[[:space:]]*$' "$conf" && \ + if [ "$t" = /opt/hpcx/ompi5 ]; then \ + site=/usr/local/lib/python3.12/dist-packages && \ + test -d "$site" && \ + cp /tmp/_dynamo_pmix_hostname.py "$site/" && \ + echo 'import _dynamo_pmix_hostname' > "$site/dynamo-pmix-hostname.pth"; \ + fi && \ + mkdir -p /opt/dynamo && ln -sfn "$t" /opt/dynamo/mpi && \ + echo "MPI for ${TARGETARCH}: $(readlink -f /opt/dynamo/mpi)" + # LD_PRELOAD pins TRT-LLM's bundled libnixl to dodge ai-dynamo/nixl#1668 # (nixl-cu13's UCX 1.20.0 hangs with two agents/host); drop it when fixed. # NIXL_VERSION= clears the base image's stale value (see nixl-versions.txt). ENV DYNAMO_HOME=/workspace \ HOME=/home/dynamo \ - PATH=/usr/local/bin/etcd:${PATH} \ + PATH=/opt/dynamo/mpi/bin:/usr/local/bin/etcd:${PATH} \ LD_PRELOAD=/opt/dynamo/libstdc++.so.6:/usr/local/lib/python3.12/dist-packages/tensorrt_llm/libs/nixl/libnixl.so \ + LD_LIBRARY_PATH=/opt/dynamo/mpi/lib:${LD_LIBRARY_PATH} \ + OPAL_PREFIX=/opt/dynamo/mpi \ NIXL_PLUGIN_DIR=/usr/local/lib/python3.12/dist-packages/tensorrt_llm/libs/nixl/plugins \ NIXL_VERSION= @@ -58,12 +185,9 @@ WORKDIR /workspace # TRT-LLM lib paths with ldconfig (upstream's /etc/shinit_v2 only sets them # for shells, not K8s python3 launches), swap upstream's standalone etcd # tooling (etcd, etcdctl, etcdutl) for dynamo_base's directory so the image -# carries a single copy of each tool, drop the unused wandb developer tooling -# the DLFW base carries (upstream removes it on main, Dockerfile.multi), and -# symlink system libstdc++ to a stable -# path for LD_PRELOAD — keeps PyInstaller-bundled tools (specifically `jet`, -# NVIDIA's internal PyInstaller-packaged CI runner) from shadowing it with an -# older copy. +# carries a single copy of each tool, and drop the unused wandb developer +# tooling the DLFW base carries (upstream removes it on main, +# Dockerfile.multi). RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ apt-get update && \ @@ -91,10 +215,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ /usr/local/bin/etcdutl && \ /usr/bin/python3 -m pip uninstall -y --break-system-packages wandb && \ ! /usr/bin/python3 -c "import wandb" 2>/dev/null && \ - [ ! -e /usr/local/lib/python3.12/dist-packages/wandb ] && \ - mkdir -p /opt/dynamo && \ - LIBSTDCPP=/usr/lib/${ARCH_ALT}-linux-gnu/libstdc++.so.6 && \ - test -f "$LIBSTDCPP" && ln -sf "$LIBSTDCPP" /opt/dynamo/libstdc++.so.6 + [ ! -e /usr/local/lib/python3.12/dist-packages/wandb ] # Restore Triton's default CUDA header/tool paths for SSH-launched ranks that # lack the image ENV (GH-14864). Use per-file links inside real directories so @@ -256,12 +377,15 @@ RUN /usr/bin/python3 -m pip uninstall -y --break-system-packages opencv-python-h ! /usr/bin/python3 -c "import cv2" 2>/dev/null && \ [ ! -e /usr/local/lib/python3.12/dist-packages/opencv_python_headless.libs ] -# Upgrade DALI past its own media-codec cleanup. Upstream restricted DALI's -# vendored ffmpeg build to drop the software h264/hevc/aac decoders -# (NVIDIA/DALI_deps#162, NVIDIA/DALI#6352), first released in 2.1.1; the base -# image here carries 2.1.0, which predates it. +# Hold DALI at a version that carries its own media-codec cleanup. Upstream +# restricted DALI's vendored ffmpeg build to drop the software h264/hevc/aac +# decoders (NVIDIA/DALI_deps#162, NVIDIA/DALI#6352), first released in 2.1.1. +# The base image carried 2.1.0 through 1.3.0rc26, which predates it, and carries +# 2.2.0 from 1.3.0rc27, which does not. So on this base the install below is a +# no-op and what the block still buys is the two checks around it: the version +# tripwire and the decoder enumeration. # -# Upgrade rather than remove. The vendored libav*/libsw* set cannot be trimmed +# Pin rather than remove. The vendored libav*/libsw* set cannot be trimmed # on its own -- every one of them is DT_NEEDED by libdali.so and its siblings, so # deleting the codec libraries breaks `import nvidia.dali` outright -- and while # nothing in this image imports DALI today, it belongs to TensorRT-LLM rather @@ -270,21 +394,25 @@ RUN /usr/bin/python3 -m pip uninstall -y --break-system-packages opencv-python-h # # Measured on the shipped image: 2.1.0 registers 446 decoders including h264, # hevc, aac, aac_fixed and aac_latm; 2.1.1 and 2.2.0 each register 440 with all -# five absent and vp8/vp9/mjpeg/av1 retained. +# five absent and vp8/vp9/mjpeg/av1 retained. 2.2.0 measured again on +# tensorrt-llm/release:1.3.0rc27 itself, now that DALI arrives with the base. # -# Pinned exactly, not a floor. `>=2.1.1` resolves to whatever is newest -- 2.2.0 -# at the time of writing -- which is a minor-version jump into a component this -# repo does not own, taken silently at build time. 2.1.1 is the smallest change -# that removes the decoders, so it is the one to take. +# Pinned exactly, not a floor. `>=2.1.1` resolves to whatever is newest, which is +# a jump into a component this repo does not own, taken silently at build time. +# The pin names the version that was measured, so moving it means measuring the +# new one. # -# A pin can go stale in the one direction that matters: if TensorRT-LLM later -# ships a base image with a newer DALI, installing 2.1.1 over it is a downgrade. +# The pin can go stale in the one direction that matters: if TensorRT-LLM later +# ships a base image with a newer DALI, installing 2.2.0 over it is a downgrade. # The check below turns that into a build failure with instructions rather than a -# silent regression, which also makes this block self-retiring -- when upstream -# catches up, the build tells whoever is looking to delete it. -# -# THIS BLOCK IS TRANSITIONAL. It exists because the base image predates upstream's -# own cleanup. The guards after it and the bundled-libavcodec assertion in +# silent regression. The pin now equals the base version, so the next base image +# that moves DALI past 2.2.0 stops the build, which is the point: a human +# re-measures and moves the pin, or deletes this RUN and lets the base version +# stand. A base that moves DALI back below 2.2.0 passes that check and the +# install below puts the measured version back, which is what it is there for. +# +# THIS BLOCK IS TRANSITIONAL, and on this base it is already down to its checks. +# The guards after it and the bundled-libavcodec assertion in # tests/dependencies/test_no_software_video_codecs.py are NOT transitional: they # are the permanent statement of what this image may contain, and they must # outlive the workaround. @@ -293,17 +421,22 @@ RUN /usr/bin/python3 -m pip uninstall -y --break-system-packages opencv-python-h # VIRTUAL_ENV set, plain pip targets the venv and leaves the system-site copy in # place. The guard enumerates what the library actually registers rather than # trusting the version string, so a wheel that reintroduces a decoder fails the -# build. Mirrored by the pre_runtime whiteout below, which matters more here than -# for a deletion: DALI's libraries are hash-named, so an upgrade RENAMES them and -# the squash COPY would otherwise leave the old codec-carrying copy in place -# beside the new one. +# build. It finds that library by filename, and a loop over an empty glob checks +# nothing and exits 0, so it fails on an empty match as well: a release that +# links the codec into a differently named library has to be looked at, not +# waved through. +# +# Mirrored by the pre_runtime whiteout below, which is inert while the install is +# a no-op and load-bearing again the moment it is not: DALI's libraries are +# hash-named, so an upgrade RENAMES them and the squash COPY would otherwise +# leave the old codec-carrying copy in place beside the new one. RUN --mount=type=bind,source=./container/compliance/enumerate_bundled_decoders.py,target=/tmp/enumerate_bundled_decoders.py \ set -eu; \ before=$(/usr/bin/python3 -c 'import importlib.metadata as m; print(m.version("nvidia-dali-cuda130"))'); \ echo "DALI in base image: $before"; \ - newest=$(printf '%s\n2.1.1\n' "$before" | sort -V | tail -1); \ - if [ "$newest" != "2.1.1" ]; then \ - echo "ERROR: base image already carries DALI $before, so pinning 2.1.1 would" >&2; \ + newest=$(printf '%s\n2.2.0\n' "$before" | sort -V | tail -1); \ + if [ "$newest" != "2.2.0" ]; then \ + echo "ERROR: base image already carries DALI $before, so pinning 2.2.0 would" >&2; \ echo " downgrade it. Upstream has caught up -- delete this RUN and let" >&2; \ echo " the base version stand. Keep the guards below and the bundled-" >&2; \ echo " libavcodec assertion in tests/dependencies/, which are what stop" >&2; \ @@ -311,11 +444,20 @@ RUN --mount=type=bind,source=./container/compliance/enumerate_bundled_decoders.p exit 1; \ fi; \ /usr/bin/python3 -m pip install --break-system-packages --no-cache-dir \ - --extra-index-url https://pypi.nvidia.com 'nvidia-dali-cuda130==2.1.1'; \ + --extra-index-url https://pypi.nvidia.com 'nvidia-dali-cuda130==2.2.0'; \ v=$(/usr/bin/python3 -c 'import importlib.metadata as m; print(m.version("nvidia-dali-cuda130"))'); \ echo "DALI version: $v"; \ - [ "$v" = "2.1.1" ] || { echo "ERROR: wanted DALI 2.1.1, got $v" >&2; exit 1; }; \ - for lib in $(find /usr/local/lib/python3.12/dist-packages/nvidia/dali/.libs -name 'libavcodec*.so*'); do \ + [ "$v" = "2.2.0" ] || { echo "ERROR: wanted DALI 2.2.0, got $v" >&2; exit 1; }; \ + libs=$(find /usr/local/lib/python3.12/dist-packages/nvidia/dali/.libs -name 'libavcodec*.so*'); \ + if [ -z "$libs" ]; then \ + echo "ERROR: DALI $v ships no libavcodec under .libs, so the enumeration" >&2; \ + echo " below would check nothing and pass. Either the vendored ffmpeg" >&2; \ + echo " moved, or the codec is now linked into another library, the way" >&2; \ + echo " PyNvVideoCodec 2.2.0 links it into libavformat. Look before this" >&2; \ + echo " ships: widen the glob to the library that carries it." >&2; \ + exit 1; \ + fi; \ + for lib in $libs; do \ /usr/bin/python3 /tmp/enumerate_bundled_decoders.py "$lib"; \ done; \ /usr/bin/python3 -c 'import nvidia.dali' @@ -404,16 +546,20 @@ RUN --mount=type=bind,source=./container/compliance/enumerate_bundled_decoders.p # This deliberately overrides a dependency of TensorRT-LLM's, which is why the # build log carries a pip resolver complaint here: # -# tensorrt-llm 1.3.0rc24 requires PyNvVideoCodec~=2.1.0, -# but you have pynvvideocodec 2.2.0 which is incompatible +# tensorrt-llm 1.3.0rc27 requires PyNvVideoCodec~=2.1.0, +# but you have pynvvideocodec 2.2.3 which is incompatible # # The complaint is expected and the override is deliberate. `~=2.1.0` excludes -# 2.2.0 by construction, and 2.1.0 is the version that bundles the libavcodec. +# everything above 2.1.x by construction, and 2.1.0 is the version that bundles +# the libavcodec. The floor here takes the newest release on purpose, which is +# 2.2.3 at this build, so read the second version in that quote as whatever the +# build resolved rather than as a fixed number. # tensorrt_llm/media/decoding.py is the only consumer; it uses CreateDemuxer, -# CreateDecoder, PyNvVCException and OutputColorType, all of which 2.2.0 still +# CreateDecoder, PyNvVCException and OutputColorType, all of which 2.2.x still # exports, and it imports PyNvVideoCodec function-locally so `import # tensorrt_llm` does not touch it. Re-check that list when this base image moves: -# if upstream relaxes the pin to allow 2.2.0, this note is the thing to delete. +# if upstream relaxes its own specifier to admit 2.2.x, this note is the thing +# to delete. # # System interpreter for the same reason as the opencv removal and the DALI # upgrade above: with VIRTUAL_ENV set, plain pip targets the venv and leaves the @@ -634,6 +780,16 @@ RUN rm -rf /workspace /home/ubuntu \ ! /usr/bin/python3 -c "import wandb" 2>/dev/null COPY --from=runtime_full / / +# Post-overlay guard for the Open MPI settings edit in runtime_full. This stage +# starts from the base image again, where the selected Open MPI's +# etc/openmpi-mca-params.conf is the base image's copy, so the edit ships only +# if the overlay above carried it across. Check the file the shipped ENV points +# at. +RUN conf=/opt/dynamo/mpi/etc/openmpi-mca-params.conf && \ + test -f "$conf" && \ + ! grep -qE '^[[:space:]]*hwloc_base_binding_policy[[:space:]]*=[[:space:]]*core' "$conf" && \ + ! grep -qE '^[[:space:]]*btl[[:space:]]*=[[:space:]]*self[[:space:]]*$' "$conf" + # Post-overlay guard for the DALI whiteout above. This is the only stage where # the failure can appear: runtime_full holds exactly one DALI, and the whiteout # is what keeps the overlay from re-adding the base image's copy beside it. @@ -644,10 +800,20 @@ COPY --from=runtime_full / / # back; with it, one copy and clean. # # Every match is checked, not just the first: the whole point is catching the -# case where more than one exists. +# case where more than one exists. Zero matches is a failure too, for the reason +# the DALI block above gives: a loop over an empty glob checks nothing and exits +# 0, so an empty match here means DALI's vendored library moved or changed name, +# and a human has to say whether the new shape is clean. RUN --mount=type=bind,source=./container/compliance/enumerate_bundled_decoders.py,target=/tmp/enumerate_bundled_decoders.py \ set -eu; \ - for lib in $(find /usr/local/lib/python3.12/dist-packages/nvidia/dali/.libs -name 'libavcodec*.so*' 2>/dev/null); do \ + libs=$(find /usr/local/lib/python3.12/dist-packages/nvidia/dali/.libs -name 'libavcodec*.so*' 2>/dev/null); \ + if [ -z "$libs" ]; then \ + echo "ERROR: post-overlay DALI carries no libavcodec under .libs, so this" >&2; \ + echo " guard checked nothing. Match what the runtime_full block says" >&2; \ + echo " about the same glob before changing either one." >&2; \ + exit 1; \ + fi; \ + for lib in $libs; do \ /usr/bin/python3 /tmp/enumerate_bundled_decoders.py "$lib"; \ done; \ if find /usr/local/lib/python3.12/dist-packages/PyNvVideoCodec -name 'libavcodec*' 2>/dev/null | grep -q .; then \ @@ -658,10 +824,15 @@ RUN --mount=type=bind,source=./container/compliance/enumerate_bundled_decoders.p find /usr/local/lib/python3.12/dist-packages/PyNvVideoCodec -name 'libavcodec*' >&2; \ exit 1; \ fi; \ + examined=0; \ for lib in $(find /usr/local/lib/python3.12/dist-packages/PyNvVideoCodec \ -name 'libavcodec*.so*' -o -name 'libavformat*.so*' 2>/dev/null); do \ + examined=$((examined + 1)); \ /usr/bin/python3 /tmp/enumerate_bundled_decoders.py "$lib"; \ done; \ + [ "$examined" -gt 0 ] \ + || { echo "ERROR: found no FFmpeg libraries under PyNvVideoCodec to examine;" >&2; \ + echo " the package layout changed and this check went blind." >&2; exit 1; }; \ tarballs=$(find /usr/local/external/ffmpeg -name 'ffmpeg-*.tar.*' 2>/dev/null | wc -l); \ if [ "$tarballs" -gt 1 ]; then \ echo "ERROR: more than one FFmpeg source tarball survived the overlay, so the" >&2; \ @@ -718,18 +889,22 @@ RUN set -eu; \ {% if target in ("dev", "local-dev") %} ENV DYNAMO_HOME=/workspace \ HOME=/home/dynamo \ - PATH=/opt/uv/bin:/usr/local/bin/etcd:${PATH} \ + PATH=/opt/dynamo/mpi/bin:/opt/uv/bin:/usr/local/bin/etcd:${PATH} \ IMAGEIO_FFMPEG_EXE=/usr/local/bin/ffmpeg \ LD_PRELOAD=/opt/dynamo/libstdc++.so.6:/usr/local/lib/python3.12/dist-packages/tensorrt_llm/libs/nixl/libnixl.so \ + LD_LIBRARY_PATH=/opt/dynamo/mpi/lib:${LD_LIBRARY_PATH} \ + OPAL_PREFIX=/opt/dynamo/mpi \ NIXL_PLUGIN_DIR=/usr/local/lib/python3.12/dist-packages/tensorrt_llm/libs/nixl/plugins \ NIXL_VERSION= {% else %} ENV DYNAMO_HOME=/workspace \ HOME=/home/dynamo \ VIRTUAL_ENV=/opt/dynamo/venv \ - PATH=/opt/dynamo/venv/bin:/opt/uv/bin:/usr/local/bin/etcd:${PATH} \ + PATH=/opt/dynamo/venv/bin:/opt/dynamo/mpi/bin:/opt/uv/bin:/usr/local/bin/etcd:${PATH} \ IMAGEIO_FFMPEG_EXE=/usr/local/bin/ffmpeg \ LD_PRELOAD=/opt/dynamo/libstdc++.so.6:/usr/local/lib/python3.12/dist-packages/tensorrt_llm/libs/nixl/libnixl.so \ + LD_LIBRARY_PATH=/opt/dynamo/mpi/lib:${LD_LIBRARY_PATH} \ + OPAL_PREFIX=/opt/dynamo/mpi \ NIXL_PLUGIN_DIR=/usr/local/lib/python3.12/dist-packages/tensorrt_llm/libs/nixl/plugins \ NIXL_VERSION= {% endif %} diff --git a/docs/fern/components/releases.data.ts b/docs/fern/components/releases.data.ts index a932858e9457..f0c552b8abd2 100644 --- a/docs/fern/components/releases.data.ts +++ b/docs/fern/components/releases.data.ts @@ -72,7 +72,7 @@ export const CURRENT_WHEEL = "1.5.0"; export const MAIN_TOT: BackendPins = { sglang: "0.5.19", - trtllm: "1.3.0rc26", + trtllm: "1.3.0rc27", vllm: "0.29.0", nixlSglang: "1.4.0", nixlTrtllm: "1.3.1", diff --git a/docs/fern/pages/reference/general/compatibility.mdx b/docs/fern/pages/reference/general/compatibility.mdx index 2f4a72d7fc68..59acff56be95 100644 --- a/docs/fern/pages/reference/general/compatibility.mdx +++ b/docs/fern/pages/reference/general/compatibility.mdx @@ -172,7 +172,7 @@ Current stable release: v1.5.0 (container tag `1.5.0`, wheel version `1.5.0`). | Dynamo | Type | SGLang | TensorRT-LLM | vLLM | NIXL (SGL / TRT / vLLM) | UCX | | --- | --- | --- | --- | --- | --- | --- | -| main (ToT) | development head | 0.5.19 | 1.3.0rc26 | 0.29.0 | 1.4.0 / 1.3.1 / 1.3.2 | - | +| main (ToT) | development head | 0.5.19 | 1.3.0rc27 | 0.29.0 | 1.4.0 / 1.3.1 / 1.3.2 | - | | v1.5.0 | stable | 0.5.18 | 1.3.0rc25 | 0.28.0 | 1.4.0 / 1.3.1 / 1.3.2 | 1.21.x | | v1.4.2 | patch | 0.5.16 | 1.3.0rc22 | 0.26.0 | 1.3.0 / 1.3.1 / 1.3.2 | 1.21.x | | v1.4.1 | patch | 0.5.16 | 1.3.0rc22 | 0.26.0 | 1.3.0 / 1.3.1 / 1.3.2 | 1.21.x | diff --git a/docs/fern/pages/reference/general/releases-machine-readable.mdx b/docs/fern/pages/reference/general/releases-machine-readable.mdx index 7ccc6d5e2368..6e7ec8fcd302 100644 --- a/docs/fern/pages/reference/general/releases-machine-readable.mdx +++ b/docs/fern/pages/reference/general/releases-machine-readable.mdx @@ -15,7 +15,7 @@ Current stable release: v1.5.0 (Sep 18, 2026; container tag `1.5.0`, wheel versi | Version | Kind | Date | SGLang | TensorRT-LLM | vLLM | NIXL (SGL / TRT / vLLM) | UCX | Notes | Delta | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| main (ToT) | development head | - | 0.5.19 | 1.3.0rc26 | 0.29.0 | 1.4.0 / 1.3.1 / 1.3.2 | - | - | - | +| main (ToT) | development head | - | 0.5.19 | 1.3.0rc27 | 0.29.0 | 1.4.0 / 1.3.1 / 1.3.2 | - | - | - | | v1.5.0 | stable | Sep 18, 2026 | 0.5.18 | 1.3.0rc25 | 0.28.0 | 1.4.0 / 1.3.1 / 1.3.2 | 1.21.x | [release notes](https://docs.nvidia.com/dynamo/dev/reference/releases/v1-5-0) | KVBM deprecated with removal targeted for v1.6.0; CRD storage version promoted to v1beta1 and the v1alpha1 admission webhook endpoints removed; Go EPP removed in favor of the Rust EPP shipped inside the Frontend image; Dynamo Snapshot moved to a standalone operator and chart, dropping the bundled snapshot chart, snapshot-agent image and DynamoCheckpoint CRD; AIConfigurator renamed to AISimulate; unified-backend entry point removed from the vLLM and SGLang workers; UCX 1.21.x. | | v1.4.2 | patch | Aug 28, 2026 | 0.5.16 | 1.3.0rc22 | 0.26.0 | 1.3.0 / 1.3.1 / 1.3.2 | 1.21.x | [release notes](https://docs.nvidia.com/dynamo/dev/reference/releases/v1-4-0#v142) | Patch release and the first Dynamo Enterprise Support release: a curated set of release artifacts publishes under the -enterprise suffix on NGC, eligible for enterprise support, with no functional or binary differences from the open-source artifacts. Fixes NIXL loader-path resolution in the Frontend and SGLang Runtime images, removes the unused Nsight EFA metrics plugin, and tightens dependency pins (pillow v12.3.0 floor, plotext below v6, EFA Installer v1.50). Backend pins are unchanged from v1.4.0. | | v1.4.1 | patch | Aug 21, 2026 | 0.5.16 | 1.3.0rc22 | 0.26.0 | 1.3.0 / 1.3.1 / 1.3.2 | 1.21.x | [release notes](https://docs.nvidia.com/dynamo/dev/reference/releases/v1-4-0#v141) | Patch release. Adds the classify and pooling endpoints, forwards logprob_token_ids through the OpenAI frontend, reconciles request-path overload marks in the Router, and fixes NIXL writable buffers for vLLM. All three Go modules move to Go 1.26.6 with aligned x/net and grpc. Backend pins are unchanged from v1.4.0. | diff --git a/pyproject.toml b/pyproject.toml index e5c5cfa9bff1..06bc867afe2d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,7 @@ Repository = "https://github.com/ai-dynamo/dynamo.git" [project.optional-dependencies] trtllm =[ "uvloop", - "tensorrt-llm==1.3.0rc26", + "tensorrt-llm==1.3.0rc27", # tensorrt-llm declares an uncapped `mpmath>=1.3.0`; under `--pre` the resolver # picks mpmath 1.5.0a0 (mpmath.libmp.bitcount removed) and backtracks sympy to # the uncapped 1.14.0rc1, which still imports bitcount -> torch._dynamo dies at @@ -252,6 +252,14 @@ filterwarnings = [ # cuda.cudart/cuda.nvrtc deprecated in favor of cuda.bindings.* (cuda-python >=13) # Triggered by flashinfer 0.6.7+ during import of comm/mnnvl.py "ignore:The cuda\\..*module is deprecated:FutureWarning", + # nvidia-cutlass-dsl 4.8.0.dev0 moved names out of cutlass.utils and cutlass.arch. + # The TensorRT-LLM 1.3.0rc27 base image ships it where rc26 shipped 4.6.2, while + # flashinfer 0.6.18 is the same in both images and still reads the old locations, + # some of them in class-body annotations that run at import time. Those four + # warnings are every one that `import tensorrt_llm._torch.models` gains between + # the two images, and they fail the import under -W error. + "ignore:cutlass\\.utils\\..* is deprecated:DeprecationWarning", + "ignore:Arch from arch\\.py is deprecated:DeprecationWarning", # SGLang GGUF quantization emits UserWarning on non-CUDA platforms (arm64 CPU-only CI) "ignore:Only CUDA.*support GGUF quantization:UserWarning", # protobuf C extension warning diff --git a/tests/dependencies/test_trtllm_mpi.py b/tests/dependencies/test_trtllm_mpi.py new file mode 100644 index 000000000000..de8e87f900cd --- /dev/null +++ b/tests/dependencies/test_trtllm_mpi.py @@ -0,0 +1,230 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Regression guards for the Open MPI that TRT-LLM images run on. + +trtllm_runtime.Dockerfile links /opt/dynamo/mpi to Open MPI 4 on amd64, where +Open MPI 5 failed to spawn TRT-LLM's workers in CI, and to Open MPI 5 on arm64, +where the base image's libtorch needs a symbol only Open MPI 5 defines. It points +PATH, LD_LIBRARY_PATH and OPAL_PREFIX at the link and edits the selected tree's +etc/openmpi-mca-params.conf. Where it selects Open MPI 5, it also installs a +startup hook (_dynamo_pmix_hostname) that shortens PMIX_HOSTNAME on hosts whose +names are too long for an Open MPI 5 singleton to spawn. Each test checks one +part of that in the built image, so no part can regress while the others stay +green. +""" + +import contextlib +import importlib.util +import os +import platform +import shutil +import signal +import subprocess +import sys + +import pytest + +pytestmark = [ + # Let the 60s subprocess timeouts report their failure before pytest interrupts. + pytest.mark.timeout(90), + pytest.mark.trtllm, + pytest.mark.pre_merge, + pytest.mark.post_merge, + pytest.mark.gpu_0, + pytest.mark.unit, + pytest.mark.skipif( + importlib.util.find_spec("tensorrt_llm") is None + or importlib.util.find_spec("mpi4py") is None, + reason="TRT-LLM images only (the selection is in trtllm_runtime.Dockerfile)", + ), + pytest.mark.skipif(not sys.platform.startswith("linux"), reason="Linux only"), +] + +_MPI_LINK = "/opt/dynamo/mpi" + +# Keep in step with the /opt/dynamo/mpi RUN in trtllm_runtime.Dockerfile. +_EXPECTED_MPI = {"x86_64": "/opt/hpcx/ompi4", "aarch64": "/opt/hpcx/ompi5"} + +# Installed with a .pth line only where the image selects Open MPI 5. Delete the +# hook tests together with the hook (see trtllm_runtime.Dockerfile). +_HOSTNAME_HOOK = "_dynamo_pmix_hostname" + +# Variables a running MPI singleton exports to its environment. A child that +# inherits them joins the parent's MPI job instead of starting its own. +_RUNTIME_PREFIXES = ("PMIX_", "OMPI_MCA_orte_", "OMPI_MCA_ess", "OMPI_COMM_WORLD_") + +_LOADED_LIBMPI = ( + "from mpi4py import MPI\n" + "print(next(line.split()[-1] for line in open('/proc/self/maps')" + " if 'libmpi.so' in line))\n" +) + +# How TRT-LLM's MpiPoolSession starts its workers: a singleton MPI.COMM_SELF.Spawn. +_SPAWN = ( + "import sys\n" + "from mpi4py import MPI\n" + "child = ('from mpi4py import MPI; parent = MPI.Comm.Get_parent(); '\n" + " 'parent.send(7, dest=0); parent.Disconnect()')\n" + "comm = MPI.COMM_SELF.Spawn(sys.executable, args=['-c', child], maxprocs=1)\n" + "print('spawned child sent', comm.recv(source=0))\n" + "comm.Disconnect()\n" +) + +_ALLREDUCE = "from mpi4py import MPI; print('allreduce', MPI.COMM_WORLD.allreduce(1))" + +# Start from every CPU the cgroup allows, so a caller that is already pinned +# (for example a pytest worker that imported tensorrt_llm) cannot hide the bind. +_AFFINITY = ( + "import os\n" + "os.sched_setaffinity(0, range(os.cpu_count()))\n" + "before = len(os.sched_getaffinity(0))\n" + "from mpi4py import MPI\n" + "after = sorted(os.sched_getaffinity(0))\n" + "print(before, len(after), after[:8])\n" +) + + +def _run(args: list[str], timeout: int = 60) -> subprocess.CompletedProcess: + """Run `args` in its own session, and kill the whole group on timeout. + + Killing the group, not only `args[0]`, keeps a hung spawn from leaving its + child or Open MPI's helper processes running after the test. + """ + env = {k: v for k, v in os.environ.items() if not k.startswith(_RUNTIME_PREFIXES)} + proc = subprocess.Popen( + args, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + env=env, + start_new_session=True, + ) + try: + stdout, stderr = proc.communicate(timeout=timeout) + except subprocess.TimeoutExpired: + with contextlib.suppress(ProcessLookupError): + os.killpg(proc.pid, signal.SIGKILL) + try: + _, stderr = proc.communicate(timeout=10) + except subprocess.TimeoutExpired: + stderr = "(unavailable: a process outside the group still holds the pipe)" + pytest.fail( + f"{args[0]} did not finish in {timeout}s; stderr tail:\n{stderr[-2000:]}" + ) + return subprocess.CompletedProcess(args, proc.returncode, stdout, stderr) + + +def test_selected_mpi_matches_the_architecture(): + expected = _EXPECTED_MPI.get(platform.machine()) + if expected is None: + pytest.skip(f"no Open MPI selection is defined for {platform.machine()}") + assert os.path.realpath(_MPI_LINK) == expected, ( + f"{_MPI_LINK} resolves to {os.path.realpath(_MPI_LINK)}, " + f"expected {expected} on {platform.machine()}" + ) + mpirun = shutil.which("mpirun") + assert mpirun and os.path.realpath(mpirun).startswith(expected + "/"), ( + f"mpirun on PATH is {mpirun} -> {mpirun and os.path.realpath(mpirun)}, " + f"not from {expected}" + ) + + +def test_mpi4py_loads_the_selected_mpi(): + proc = _run([sys.executable, "-c", _LOADED_LIBMPI]) + assert proc.returncode == 0, proc.stderr[-2000:] + loaded = os.path.realpath(proc.stdout.strip().splitlines()[-1]) + selected = os.path.realpath(_MPI_LINK) + assert loaded.startswith(selected + "/"), ( + f"mpi4py loaded {loaded}, not the Open MPI under {_MPI_LINK} ({selected}); " + "check LD_LIBRARY_PATH in trtllm_runtime.Dockerfile" + ) + + +def test_comm_self_spawn_reaches_its_child(): + """A singleton spawn, the way TRT-LLM starts its workers. + + `_run` drops PMIX_* from the child's environment, and the child's own + interpreter applies the PMIX_HOSTNAME hook again at startup. So on a host + whose name is too long for Open MPI 5, this also checks the hook. + """ + proc = _run([sys.executable, "-c", _SPAWN]) + assert proc.returncode == 0 and "spawned child sent 7" in proc.stdout, ( + f"MPI.COMM_SELF.Spawn failed (exit {proc.returncode}), so TRT-LLM " + f"cannot start its workers; stderr tail:\n{proc.stderr[-2000:]}" + ) + + +def test_pmix_hostname_hook_follows_the_selection(): + installed = importlib.util.find_spec(_HOSTNAME_HOOK) is not None + selected = os.path.realpath(_MPI_LINK) + assert installed == selected.endswith("/ompi5"), ( + f"{_HOSTNAME_HOOK} installed={installed}, but {_MPI_LINK} is {selected}; " + "the hook belongs exactly where trtllm_runtime.Dockerfile selects Open MPI 5" + ) + + +@pytest.mark.parametrize( + ("hostname", "launched", "preset", "shortened"), + [ + ("h" * 46, False, False, True), + ("h" * 31, False, False, True), + ("h" * 30, False, False, False), + ("h" * 46, True, False, False), + ("h" * 46, False, True, False), + ], + ids=["long", "just-over", "at-limit", "launched-rank", "already-set"], +) +def test_pmix_hostname_hook_rule(hostname, launched, preset, shortened): + hook = pytest.importorskip(_HOSTNAME_HOOK, reason="installed with Open MPI 5 only") + name = hook.short_pmix_hostname(hostname, launched=launched, preset=preset) + if not shortened: + assert name is None + return + # 13 characters plus the 7 digits of the largest pid stays within 37. + assert name is not None and name.startswith("pmix-") and len(name) == 13 + again = hook.short_pmix_hostname(hostname, launched=False, preset=False) + other = hook.short_pmix_hostname(hostname + "x", launched=False, preset=False) + assert name == again, "not deterministic" + assert name != other, "two hostnames map to one name" + + +def test_two_ranks_connect_over_ob1(): + """The operator's multi-node launch forces the ob1 PML. + + ob1 needs a byte transport besides `self` to reach another rank, which + `btl = self` in etc/openmpi-mca-params.conf takes away. + """ + mpirun = shutil.which("mpirun") + assert mpirun, "mpirun is not on PATH" + root = ["--allow-run-as-root"] if os.geteuid() == 0 else [] + args = [mpirun, *root, "--oversubscribe", "--mca", "pml", "ob1", "-n", "2"] + proc = _run([*args, sys.executable, "-c", _ALLREDUCE]) + assert proc.stdout.count("allreduce 2") == 2, ( + f"two ob1 ranks did not connect (exit {proc.returncode}); " + f"stderr tail:\n{proc.stderr[-2000:]}" + ) + + +@pytest.mark.skipif( + not hasattr(os, "sched_getaffinity"), reason="needs sched_getaffinity" +) +def test_mpi_init_keeps_cpu_affinity(): + """MPI_Init must not pin the process to one core. + + `import tensorrt_llm` runs MPI_Init (tensorrt_llm/_utils.py imports + mpi4py.MPI). With `hwloc_base_binding_policy = core`, that singleton + MPI_Init binds the process to one core, and every thread and child process + it starts inherits the mask. + """ + proc = _run([sys.executable, "-c", _AFFINITY]) + assert proc.returncode == 0, proc.stderr[-2000:] + # MPI can print warnings to stdout; the probe's own line is the last one. + before, after, cpus = proc.stdout.strip().splitlines()[-1].split(maxsplit=2) + if int(before) < 4: + pytest.skip(f"only {before} CPUs available; a one-core bind is not observable") + assert int(after) == int(before), ( + f"MPI_Init narrowed CPU affinity from {before} to {after} CPUs {cpus}; " + f"check hwloc_base_binding_policy in {_MPI_LINK}/etc/openmpi-mca-params.conf " + "(see trtllm_runtime.Dockerfile)" + ) From 158458835e8fb9805ffc8596ab9ba567718730c5 Mon Sep 17 00:00:00 2001 From: Kan Wu Date: Wed, 23 Sep 2026 19:59:14 -0700 Subject: [PATCH 187/191] fix(sglang): gate auto tool-call grammars on reasoning (#15227) Signed-off-by: Kan Wu --- .../src/dynamo/frontend/sglang_prepost.py | 10 ++- .../src/dynamo/frontend/sglang_processor.py | 7 +- .../tests/test_sglang_processor_unit.py | 67 +++++++++++++++++++ 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/components/src/dynamo/frontend/sglang_prepost.py b/components/src/dynamo/frontend/sglang_prepost.py index f43d0a6e235e..b04beadfe833 100644 --- a/components/src/dynamo/frontend/sglang_prepost.py +++ b/components/src/dynamo/frontend/sglang_prepost.py @@ -351,6 +351,7 @@ def _guided_output_requires_reasoning( request: dict[str, Any], force_reasoning: bool, reasoning_parser_name: str | None = None, + guided_decoding: dict[str, Any] | None = None, ) -> bool: """Return whether SGLang should reason before guided output.""" if not force_reasoning: @@ -365,9 +366,12 @@ def _guided_output_requires_reasoning( return False response_format = request.get("response_format") - if not isinstance(response_format, dict) or reasoning_parser_name == "gpt-oss": - return False - return response_format.get("type") != "text" + if isinstance(response_format, dict) and response_format.get("type") != "text": + return reasoning_parser_name != "gpt-oss" + + # An auto tool-call grammar forbids the end-of-thinking marker, so it must + # also wait for thinking to finish. + return guided_decoding is not None and "structural_tag" in guided_decoding def _normalize_deepseek_v4_hint(value: Any) -> str: diff --git a/components/src/dynamo/frontend/sglang_processor.py b/components/src/dynamo/frontend/sglang_processor.py index ae534784615f..726c66272e15 100644 --- a/components/src/dynamo/frontend/sglang_processor.py +++ b/components/src/dynamo/frontend/sglang_processor.py @@ -359,7 +359,7 @@ def _preprocess_worker( pre.tool_call_parser, pre.reasoning_parser, require_reasoning=_guided_output_requires_reasoning( - request, pre.force_reasoning, _w_reasoning_parser_name + request, pre.force_reasoning, _w_reasoning_parser_name, pre.guided_decoding ), ) @@ -617,7 +617,10 @@ async def _generator_inner( pre.tool_call_parser, pre.reasoning_parser, require_reasoning=_guided_output_requires_reasoning( - request, pre.force_reasoning, self.reasoning_parser_name + request, + pre.force_reasoning, + self.reasoning_parser_name, + pre.guided_decoding, ), ) except PreprocessError as exc: diff --git a/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py b/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py index cef49732c21e..f9bc8a1ea128 100644 --- a/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py +++ b/components/src/dynamo/frontend/tests/test_sglang_processor_unit.py @@ -1153,6 +1153,73 @@ def test_structured_response_requires_effective_reasoning(): ) +@pytest.mark.parametrize( + ("request_fields", "force_reasoning", "expected"), + [ + ({}, True, True), + ({"response_format": {"type": "text"}}, True, True), + # A structural_tag response_format keeps the gpt-oss exception. + ({"response_format": {"type": "structural_tag"}}, True, False), + ], +) +def test_auto_tool_structural_tag_requires_effective_reasoning( + request_fields, force_reasoning, expected +): + request = {"tool_choice": "auto", **request_fields} + guided_decoding = {"structural_tag": {}} + assert ( + _guided_output_requires_reasoning( + request, force_reasoning, "gpt-oss", guided_decoding + ) + is expected + ) + + +@pytest.mark.parametrize("thinking", [True, False]) +def test_kimi_k3_auto_tool_sets_reasoning_gate_pool(thinking, monkeypatch): + """Kimi K3's auto tool grammar forbids <|close|>think<|sep|>, so it must + only apply after thinking ends.""" + + class StubTokenizer: + chat_template = "template" + + def apply_chat_template(self, messages, **kwargs): + return [1, 2, 3] + + monkeypatch.setattr(sglang_processor_module, "_w_tokenizer", StubTokenizer()) + monkeypatch.setattr(sglang_processor_module, "_w_tool_call_parser_name", "kimi_k3") + monkeypatch.setattr(sglang_processor_module, "_w_reasoning_parser_name", "kimi_k3") + monkeypatch.setattr( + sglang_processor_module, "_w_exclude_tools_when_tool_choice_none", True + ) + monkeypatch.setattr(sglang_processor_module, "_w_template_force_reasoning", False) + + request = { + "model": "moonshotai/Kimi-K3", + "messages": [{"role": "user", "content": "Weather in San Francisco?"}], + "chat_template_kwargs": {"thinking": thinking}, + "tool_choice": "auto", + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "parameters": { + "type": "object", + "properties": {"city": {"type": "string"}}, + "required": ["city"], + }, + }, + } + ], + } + result = _preprocess_worker(request, MODEL, eos_token_ids=None) + + guided_decoding = result.dynamo_preproc["sampling_options"]["guided_decoding"] + assert "structural_tag" in guided_decoding + assert result.dynamo_preproc["require_reasoning"] is thinking + + @pytest.mark.core @pytest.mark.parametrize( ("legacy_constraint", "expected"), From 2be370d1510979953e7447796ffafc3f87fed3a0 Mon Sep 17 00:00:00 2001 From: Ace Eldeib Date: Wed, 23 Sep 2026 23:08:31 -0400 Subject: [PATCH 188/191] fix(frontend): align DeepSeek V4.1 tool image order (#15097) Signed-off-by: Ace Eldeib Signed-off-by: thuanpham582002 Co-authored-by: thuanpham582002 --- Cargo.lock | 44 ++++++++--------- Cargo.toml | 6 +-- lib/bindings/kvbm/Cargo.lock | 12 ++--- lib/bindings/python/Cargo.lock | 12 ++--- lib/llm/src/preprocessor.rs | 66 +++++++++++++++++++++++++- lib/llm/tests/deepseek_v41_renderer.rs | 45 ++++++++++++++++++ 6 files changed, 147 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d65485ec2701..6ea9c4f9795f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1563,7 +1563,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -2336,7 +2336,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2905,9 +2905,9 @@ dependencies = [ [[package]] name = "dynamo-protocols" -version = "6.0.1" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa8a16e9007c954f01ac9b4e48cb9eacd43e890edf747c92f7bbbddbb6fee4d" +checksum = "9ef02e31ca224ca8db24b88a990b7db3eb2b99c77697b0d8ae44feaa32709e38" dependencies = [ "async-openai", "derive_builder", @@ -2922,9 +2922,9 @@ dependencies = [ [[package]] name = "dynamo-renderer" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "821803eae0bcf87a9dc0ecdf9ff8a146a5de18ccfe39f341365676abbc747e61" +checksum = "06464b1deb9b6e185476e2e4280cbbbc5f16d0d6fd8732ff8b5732d43ec0567b" dependencies = [ "anyhow", "chrono", @@ -3101,9 +3101,9 @@ dependencies = [ [[package]] name = "dynamo-tokenizers" -version = "1.8.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa6031ec0ca72092e6469ff659ddf9dbf5034110aa9de387ffbfb17e24a4d5d7" +checksum = "cd9116db4a17d4ac186a13719b1eea8b41669cec2d95c8c93363869c9163c8aa" dependencies = [ "aho-corasick", "anyhow", @@ -3381,7 +3381,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -4945,7 +4945,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -6415,7 +6415,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -7582,8 +7582,8 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ - "heck 0.4.1", - "itertools 0.10.5", + "heck 0.5.0", + "itertools 0.14.0", "log", "multimap", "once_cell", @@ -7602,8 +7602,8 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ - "heck 0.4.1", - "itertools 0.10.5", + "heck 0.5.0", + "itertools 0.14.0", "log", "multimap", "petgraph 0.8.3", @@ -7624,7 +7624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.117", @@ -7637,7 +7637,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.117", @@ -7855,7 +7855,7 @@ dependencies = [ "once_cell", "socket2 0.6.4", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -8575,7 +8575,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.12.1", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -8643,7 +8643,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -9754,7 +9754,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix 1.1.4", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -11357,7 +11357,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index d80acd9a930a..721f8de1beb8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,8 +63,8 @@ aisimulate-core = { version = "=0.12.0" } dynamo-runtime = { path = "lib/runtime", version = "1.6.0" } dynamo-llm = { path = "lib/llm", version = "1.6.0" } dynamo-rl = { path = "lib/rl", version = "1.6.0" } -dynamo-tokenizers = { version = "=1.8.2" } -dynamo-renderer = { version = "=5.3.1" } +dynamo-tokenizers = { version = "=1.9.1" } +dynamo-renderer = { version = "=5.4.0" } dynamo-tokens = { path = "lib/tokens", version = "1.6.0" } dynamo-truthy = { path = "lib/truthy", version = "1.6.0" } dynamo-data-gen = { path = "lib/data-gen", version = "1.6.0" } @@ -72,7 +72,7 @@ dynamo-kv-hashing = { path = "lib/kv-hashing", version = "1.6.0" } dynamo-memory = { path = "lib/memory", version = "1.6.0" } dynamo-mocker = { path = "lib/mocker", version = "1.6.0" } dynamo-kv-router = { path = "lib/kv-router", version = "1.6.0" } -dynamo-protocols = { version = "=6.0.1" } +dynamo-protocols = { version = "=6.1.0" } dynamo-parsers = { version = "9.0.0" } # Published on crates.io. To see all available versions: diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index e465d7f74796..b14f2eba6eb5 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -2328,9 +2328,9 @@ dependencies = [ [[package]] name = "dynamo-protocols" -version = "6.0.1" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa8a16e9007c954f01ac9b4e48cb9eacd43e890edf747c92f7bbbddbb6fee4d" +checksum = "9ef02e31ca224ca8db24b88a990b7db3eb2b99c77697b0d8ae44feaa32709e38" dependencies = [ "async-openai", "derive_builder", @@ -2345,9 +2345,9 @@ dependencies = [ [[package]] name = "dynamo-renderer" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "821803eae0bcf87a9dc0ecdf9ff8a146a5de18ccfe39f341365676abbc747e61" +checksum = "06464b1deb9b6e185476e2e4280cbbbc5f16d0d6fd8732ff8b5732d43ec0567b" dependencies = [ "anyhow", "chrono", @@ -2456,9 +2456,9 @@ dependencies = [ [[package]] name = "dynamo-tokenizers" -version = "1.8.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa6031ec0ca72092e6469ff659ddf9dbf5034110aa9de387ffbfb17e24a4d5d7" +checksum = "cd9116db4a17d4ac186a13719b1eea8b41669cec2d95c8c93363869c9163c8aa" dependencies = [ "aho-corasick", "anyhow", diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index 0382a7609981..8d3298f1a8cf 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -2380,9 +2380,9 @@ dependencies = [ [[package]] name = "dynamo-protocols" -version = "6.0.1" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa8a16e9007c954f01ac9b4e48cb9eacd43e890edf747c92f7bbbddbb6fee4d" +checksum = "9ef02e31ca224ca8db24b88a990b7db3eb2b99c77697b0d8ae44feaa32709e38" dependencies = [ "async-openai", "derive_builder", @@ -2443,9 +2443,9 @@ dependencies = [ [[package]] name = "dynamo-renderer" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "821803eae0bcf87a9dc0ecdf9ff8a146a5de18ccfe39f341365676abbc747e61" +checksum = "06464b1deb9b6e185476e2e4280cbbbc5f16d0d6fd8732ff8b5732d43ec0567b" dependencies = [ "anyhow", "chrono", @@ -2593,9 +2593,9 @@ dependencies = [ [[package]] name = "dynamo-tokenizers" -version = "1.8.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa6031ec0ca72092e6469ff659ddf9dbf5034110aa9de387ffbfb17e24a4d5d7" +checksum = "cd9116db4a17d4ac186a13719b1eea8b41669cec2d95c8c93363869c9163c8aa" dependencies = [ "aho-corasick", "anyhow", diff --git a/lib/llm/src/preprocessor.rs b/lib/llm/src/preprocessor.rs index 6c0a5072a21e..23734c6eb9fe 100644 --- a/lib/llm/src/preprocessor.rs +++ b/lib/llm/src/preprocessor.rs @@ -3397,7 +3397,9 @@ impl OpenAIPreprocessor { }; let has_media_loader = self.media_loader.is_some(); - for message in messages.iter() { + let message_order = self.formatter.media_message_order(request); + for index in 0..messages.len() { + let message = &messages[message_order.as_ref().map_or(index, |order| order[index])]; let Some(content_parts) = multimodal_content_parts(message) else { continue; }; @@ -7618,6 +7620,68 @@ mod extra_args_media_copy_tests { .to_string() } + #[tokio::test] + async fn deepseek_v41_display_name_fallback_orders_tool_media() { + use crate::common::checked_file::CheckedFile; + use crate::model_card::ModelInfoType; + + let mut mdc = ModelDeploymentCard::load_from_disk( + "tests/data/sample-models/mock-llama-3.1-8b-instruct", + None, + ) + .unwrap(); + let dir = tempfile::tempdir().unwrap(); + let config = dir.path().join("config.json"); + std::fs::write( + &config, + r#"{"architectures":[],"model_type":"","eos_token_id":128009}"#, + ) + .unwrap(); + mdc.model_info = Some(ModelInfoType::HfConfigJson( + CheckedFile::from_disk(&config).unwrap(), + )); + mdc.display_name = "DeepSeek-V4.1-Flash".into(); + let preprocessor = OpenAIPreprocessor::new(mdc).unwrap(); + let first = inline_data_url().replacen("image/png", "image/png;name=a", 1); + let second = inline_data_url().replacen("image/png", "image/png;name=b", 1); + let request: NvCreateChatCompletionRequest = serde_json::from_value(serde_json::json!({ + "model":"alias", "messages":[ + {"role":"assistant","tool_calls":[ + {"id":"a","type":"function","function":{"name":"image","arguments":"{}"}}, + {"id":"b","type":"function","function":{"name":"image","arguments":"{}"}} + ]}, + {"role":"tool","tool_call_id":"b","content":[ + {"type":"image_url","image_url":{"url":second}} + ]}, + {"role":"tool","tool_call_id":"a","content":[ + {"type":"image_url","image_url":{"url":first}} + ]} + ] + })) + .unwrap(); + let mut builder = PreprocessedRequestBuilder::default(); + builder + .model("alias".into()) + .token_ids(Vec::new()) + .stop_conditions(Default::default()) + .sampling_options(Default::default()) + .output_options(Default::default()); + preprocessor + .gather_multi_modal_data_with_image_tokens(&request, &mut builder, None, &[]) + .await + .unwrap(); + let result = builder.build().unwrap(); + let media = &result.multi_modal_data.unwrap()["image_url"]; + let urls: Vec<_> = media + .iter() + .map(|image| match image { + MultimodalData::Url(url) => url.as_str(), + other => panic!("expected URL, got {other:?}"), + }) + .collect(); + assert_eq!(urls, [first.as_str(), second.as_str()]); + } + #[tokio::test] async fn extra_args_messages_omit_inline_data_when_multi_modal_data_present() { let preprocessor = test_preprocessor(); diff --git a/lib/llm/tests/deepseek_v41_renderer.rs b/lib/llm/tests/deepseek_v41_renderer.rs index fef325831eaa..51e97af62e9f 100644 --- a/lib/llm/tests/deepseek_v41_renderer.rs +++ b/lib/llm/tests/deepseek_v41_renderer.rs @@ -62,3 +62,48 @@ fn normalized_effort_matches_the_reference_encoder_for_both_request_fields() { } } } + +#[test] +fn image_blocks_preserve_text_order_and_reasoning_mode() { + for effort in ["high", "none"] { + let output = render(json!({ + "reasoning_effort": effort, + "messages": [{"role": "user", "content": [ + {"type": "text", "text": "first:"}, + {"type": "image_url", "image_url": {"url": "https://example.com/first.png"}}, + {"type": "text", "text": "second:"}, + {"type": "image_url", "image_url": {"url": "data:image/png;base64,AAAA"}}, + {"type": "text", "text": "compare"} + ]}] + })) + .unwrap(); + assert!(output.contains( + "first:\n\n<|deepseek_image|>\n\nsecond:\n\n<|deepseek_image|>\n\ncompare" + )); + assert_eq!(output.matches("<|deepseek_image|>").count(), 2); + assert!(!output.contains("https://example.com/first.png")); + assert!(!output.contains("data:image/png;base64,AAAA")); + assert!(output.ends_with(if effort == "none" { + "" + } else { + "" + })); + } +} + +#[test] +fn cached_images_render_in_user_and_tool_messages() { + for role in ["user", "tool"] { + let output = render(json!({ + "reasoning_effort": "none", + "messages": [{"role": role, "tool_call_id": "screenshot", "content": [ + {"type": "text", "text": "cached:"}, + {"type": "image_url", "image_url": null, "uuid": "cached-screenshot"} + ]}] + })) + .unwrap(); + assert!(output.contains("cached:\n\n<|deepseek_image|>")); + assert_eq!(output.matches("<|deepseek_image|>").count(), 1); + assert!(!output.contains("cached-screenshot")); + } +} From db998b527e9942635bb1843dcc52fdf58cd4b666 Mon Sep 17 00:00:00 2001 From: Pei Li Date: Wed, 23 Sep 2026 21:49:49 -0700 Subject: [PATCH 189/191] fix(sglang): pass the prefill dp rank to sglang decode (#15246) --- components/src/dynamo/sglang/_compat.py | 15 ++++ .../src/dynamo/sglang/engine_generate.py | 6 ++ .../request_handlers/llm/decode_handler.py | 3 + .../tests/test_sglang_decode_handler.py | 74 +++++++++++++++++++ lib/llm/src/kv_router/prefill_router/mod.rs | 26 ++++++- 5 files changed, 120 insertions(+), 4 deletions(-) diff --git a/components/src/dynamo/sglang/_compat.py b/components/src/dynamo/sglang/_compat.py index 2393ac2eadf0..fec412cb7f5a 100644 --- a/components/src/dynamo/sglang/_compat.py +++ b/components/src/dynamo/sglang/_compat.py @@ -366,6 +366,21 @@ def cache_salt_kwargs(engine: Any, cache_salt: str | None) -> dict[str, Any]: return kwargs +def prefill_dp_rank_kwargs(engine: Any, prefill_dp_rank: Any) -> dict[str, Any]: + """Hand SGLang's decode the prefill DP rank the router already chose. + + Without ``disagg_prefill_dp_rank`` the decode scheduler parks the request + and resolves the rank over HTTP against the prefill bootstrap server, which + only learns the room once the prefill scheduler has created its KV sender; + the prefill forward cannot start before that round trip completes. + """ + if prefill_dp_rank is None: + return {} + return filter_supported_async_generate_kwargs( + engine, {"disagg_prefill_dp_rank": int(prefill_dp_rank)} + ) + + def require_reasoning_kwargs(engine: Any, request: Mapping[str, Any]) -> dict[str, Any]: """Build the optional SGLang per-request reasoning-gate argument.""" require_reasoning = bool(request.get("require_reasoning", False)) diff --git a/components/src/dynamo/sglang/engine_generate.py b/components/src/dynamo/sglang/engine_generate.py index 0d37a487e99c..a3bff59b3b8d 100644 --- a/components/src/dynamo/sglang/engine_generate.py +++ b/components/src/dynamo/sglang/engine_generate.py @@ -48,6 +48,7 @@ def build_native_generate_request( bootstrap_room: int | None = None, external_trace_header: dict[str, str] | None = None, routed_dp_rank: int | None = None, + prefill_dp_rank: int | None = None, lora_path: str | None = None, cache_salt: str | None = None, ) -> GenerateReqInput: @@ -105,6 +106,11 @@ def build_native_generate_request( ): if value is not None: payload[name] = value + if ( + prefill_dp_rank is not None + and "disagg_prefill_dp_rank" in GenerateReqInput.__dataclass_fields__ + ): + payload["disagg_prefill_dp_rank"] = prefill_dp_rank native_request = _GENERATE_REQUEST_ADAPTER.validate_python(payload) _shared_logprobs.validate_sglang_top_logprobs( diff --git a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py index abd2573ee9d4..63a3d6871c50 100644 --- a/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py +++ b/components/src/dynamo/sglang/request_handlers/llm/decode_handler.py @@ -27,6 +27,7 @@ from dynamo.sglang._compat import ( cache_salt_kwargs, filter_supported_async_generate_kwargs, + prefill_dp_rank_kwargs, require_reasoning_kwargs, ) from dynamo.sglang._disagg import validate_disagg_parallel_sampling @@ -586,6 +587,7 @@ def _native_generate_stream( context.trace_headers() if self.enable_trace else None ), routed_dp_rank=routing.get("dp_rank"), + prefill_dp_rank=routing.get("prefill_dp_rank"), lora_path=self._resolve_lora(request), cache_salt=request_cache_salt(request), ) @@ -719,6 +721,7 @@ async def generate( bootstrap_host=bootstrap_info["bootstrap_host"], bootstrap_port=bootstrap_info["bootstrap_port"], bootstrap_room=bootstrap_info["bootstrap_room"], + **prefill_dp_rank_kwargs(self.engine, routing.get("prefill_dp_rank")), external_trace_header=trace_header, rid=sglang_request_id, data_parallel_rank=dp_rank, diff --git a/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py b/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py index 65580354b167..676c71976359 100644 --- a/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py +++ b/components/src/dynamo/sglang/tests/test_sglang_decode_handler.py @@ -2301,3 +2301,77 @@ async def test_supported_sampling_reaches_engine(mode, n): assert [output["index"] for output in outputs] == list(range(n)) assert handler.engine.async_generate.await_args.kwargs["sampling_params"]["n"] == n assert all(output["finish_reason"] for output in outputs) + + +def test_prefill_dp_rank_kwargs_follows_engine_signature(): + from dynamo.sglang._compat import prefill_dp_rank_kwargs + + class Engine: + async def async_generate( + self, *, bootstrap_room=None, disagg_prefill_dp_rank=None + ): + pass + + class OlderEngine: + async def async_generate(self, *, bootstrap_room=None): + pass + + assert prefill_dp_rank_kwargs(Engine(), 3) == {"disagg_prefill_dp_rank": 3} + assert prefill_dp_rank_kwargs(Engine(), None) == {} + assert prefill_dp_rank_kwargs(OlderEngine(), 3) == {} + + +@pytest.mark.asyncio +async def test_disagg_decode_passes_prefill_dp_rank_to_engine(): + handler = _new_decode_handler() + handler.serving_mode = DisaggregationMode.DECODE + handler._enable_frontend_decoding = False + handler._mm_hashes_supported = False + handler._engine_supports_priority = False + handler._routed_experts_kwargs = {} + handler.enable_trace = False + handler._get_input_param = lambda request: {"input_ids": [1, 2]} + handler._resolve_lora = lambda request: None + chunk = { + "index": 0, + "output_ids": [42], + "meta_info": {"id": "sample-0", "finish_reason": {"type": "length"}}, + } + handler.engine = SimpleNamespace( + async_generate=AsyncMock(return_value=_stream([chunk])) + ) + context = SimpleNamespace( + id=lambda: "request-id", + trace_id="trace-id", + is_stopped=lambda: False, + notify_first_token=lambda: None, + ) + request = { + "sampling_options": {"n": 1}, + "stop_conditions": {"max_tokens": 1}, + "routing": {"dp_rank": 1, "prefill_dp_rank": 3}, + "bootstrap_info": { + "bootstrap_host": "prefill.invalid", + "bootstrap_port": 1234, + "bootstrap_room": 23, + }, + } + [output async for output in handler.generate(request, context)] + kwargs = handler.engine.async_generate.await_args.kwargs + assert kwargs["disagg_prefill_dp_rank"] == 3 + assert kwargs["data_parallel_rank"] == 1 + + +def test_build_native_generate_request_forwards_prefill_dp_rank(): + native = build_native_generate_request( + {"sampling_params": {"max_new_tokens": 1}}, + input_ids=[7, 8], + request_id="internal-request-id", + priority=None, + bootstrap_host="prefill.internal", + bootstrap_port=1234, + bootstrap_room=23, + routed_dp_rank=1, + prefill_dp_rank=3, + ) + assert native.disagg_prefill_dp_rank == 3 diff --git a/lib/llm/src/kv_router/prefill_router/mod.rs b/lib/llm/src/kv_router/prefill_router/mod.rs index e0a4977bad8f..2569cd7edb93 100644 --- a/lib/llm/src/kv_router/prefill_router/mod.rs +++ b/lib/llm/src/kv_router/prefill_router/mod.rs @@ -95,6 +95,10 @@ enum PrefillOutcome { Bootstrap { bootstrap_info: BootstrapInfo, worker_id: u64, + /// The decode engine's KV receiver needs the prefill DP rank up front; + /// without it SGLang parks the request and asks the prefill bootstrap + /// server over HTTP, and the prefill forward waits on that round trip. + prefill_dp_rank: Option, }, Completed { result: PrefillResult, @@ -120,9 +124,12 @@ fn into_decode_request( PrefillOutcome::Bootstrap { bootstrap_info, worker_id, + prefill_dp_rank, } => { req.bootstrap_info = Some(bootstrap_info); - req.routing_mut().prefill_worker_id = Some(worker_id); + let routing = req.routing_mut(); + routing.prefill_worker_id = Some(worker_id); + routing.prefill_dp_rank = prefill_dp_rank; } PrefillOutcome::Completed { result, @@ -155,6 +162,7 @@ fn extract_bootstrap_info(params: &serde_json::Value) -> Option { struct PreparedPrefill { worker_id: u64, + prefill_dp_rank: Option, bootstrap_info: Option, topology_constraints: Option, } @@ -447,6 +455,7 @@ impl PrefillOutcome::Bootstrap { bootstrap_info, worker_id: prepared.worker_id, + prefill_dp_rank: prepared.prefill_dp_rank, } } else { drop(prefill_phase_barrier); @@ -467,6 +476,7 @@ impl PrefillOutcome::Bootstrap { bootstrap_info, worker_id: prepared.worker_id, + prefill_dp_rank: prepared.prefill_dp_rank, } } else { PrefillOutcome::Completed { @@ -633,6 +643,7 @@ impl PrefillRouter { Ok(PreparedPrefill { worker_id, + prefill_dp_rank: dp_rank, bootstrap_info, topology_constraints, }) @@ -862,6 +873,7 @@ mod tests { handoff_id: None, }, worker_id: 11, + prefill_dp_rank: Some(3), }; let completed = PrefillOutcome::Completed { result: PrefillResult { @@ -872,10 +884,16 @@ mod tests { worker_link: None, }; - for (label, outcome, expected_worker) in - [("bootstrap", bootstrap, 11), ("completed", completed, 12)] - { + for (label, outcome, expected_worker, expected_dp_rank) in [ + ("bootstrap", bootstrap, 11, Some(3)), + ("completed", completed, 12, None), + ] { let decode = into_decode_request(query_only_request(), outcome); + assert_eq!( + decode.routing.as_ref().and_then(|r| r.prefill_dp_rank), + expected_dp_rank, + "{label}: the bootstrap leg must tell decode which prefill DP rank owns the KV" + ); assert!( decode.staged_kv_cleanup, "{label}: prefill staged KV for one decode worker, so the leg must be marked for cleanup dispatch" From 563d3d06650d4c3573148b073d5a2df32acb3054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Ant=C3=B3nio?= Date: Thu, 24 Sep 2026 01:19:08 -0400 Subject: [PATCH 190/191] fix(trtllm): enable forward-pass metrics via the shared FPM opt-in (#14181) Signed-off-by: Jorge Antonio Co-authored-by: Ryan McCormick --- components/src/dynamo/trtllm/args.py | 18 +++++ components/src/dynamo/trtllm/backend_args.py | 11 ++- components/src/dynamo/trtllm/publisher.py | 24 +++++-- .../trtllm/tests/test_trtllm_fpm_publisher.py | 68 +++++++++++++++---- .../dynamo/trtllm/tests/test_trtllm_unit.py | 51 ++++++++++++-- .../src/dynamo/trtllm/workers/llm_worker.py | 13 +++- .../tensorrt-llm-details/dp-rank-routing.md | 11 +-- .../backends/tensorrt-llm/observability.md | 23 +++++-- .../modular-components/planner/overview.md | 2 +- .../backends/tensorrt-llm-configuration.mdx | 4 +- .../forward-pass-metrics-traces.mdx | 6 +- tests/utils/payloads.py | 52 +++++++++++++- 12 files changed, 237 insertions(+), 46 deletions(-) diff --git a/components/src/dynamo/trtllm/args.py b/components/src/dynamo/trtllm/args.py index e362eec96fdb..8f464d7b1017 100644 --- a/components/src/dynamo/trtllm/args.py +++ b/components/src/dynamo/trtllm/args.py @@ -40,12 +40,27 @@ def _warn_deprecated(message: str) -> None: VALID_TRTLLM_CONNECTORS = {"none", "kvbm"} +def _forward_pass_metrics_enabled(config: DynamoRuntimeConfig) -> bool: + """Resolve the forward-pass metrics opt-in shared with vLLM and SGLang. + + TRT-LLM publishes in-process, so the port in DYN_FORWARDPASS_METRIC_PORT + is unused; setting it still opts in, matching the other backends. + """ + if os.environ.get("DYN_FORWARDPASS_METRIC_PORT"): + return True + return config.fpm_trace + + class Config(DynamoRuntimeConfig, DynamoTrtllmConfig): component: str # Whether this worker publishes KV events. Distinct from the router-side # `use_kv_events` on `router_advertisement`, which means the router # subscribes to them -- the reason the two live on separate objects. use_kv_events: bool + # Whether this worker streams forward-pass metrics to the Planner. The + # cross-backend opt-in turns it on; `--publish-metrics` implies it, since + # that already pays for the iteration statistics both read. + publish_forward_pass_metrics: bool # Routing this worker set advertises in its model card; None inherits the # frontend's configuration. router_advertisement: Optional[WorkerRouterConfig] = None @@ -55,6 +70,9 @@ def validate(self) -> None: DynamoRuntimeConfig.validate(self) DynamoTrtllmConfig.validate(self) self.use_kv_events = self.publish_kv_events + self.publish_forward_pass_metrics = ( + self.publish_metrics or _forward_pass_metrics_enabled(self) + ) # fix the connector as trtllm accepts only one connector and it should be in VALID_TRTLLM_CONNECTORS # while the runtime args accepts a list of connectors diff --git a/components/src/dynamo/trtllm/backend_args.py b/components/src/dynamo/trtllm/backend_args.py index 381b499927a5..c38ed3ec5322 100644 --- a/components/src/dynamo/trtllm/backend_args.py +++ b/components/src/dynamo/trtllm/backend_args.py @@ -183,7 +183,9 @@ def add_arguments(self, parser: argparse.ArgumentParser) -> None: default=False, help=( "Publish KV cache events to the KV router. This does not enable " - "TensorRT-LLM metric reporting; use --publish-metrics for that." + "TensorRT-LLM iteration statistics: use --publish-metrics for " + "Prometheus metrics, and --fpm-trace or DYN_FORWARDPASS_METRIC_PORT " + "for the Planner's forward-pass metrics." ), dest="publish_kv_events", ) @@ -193,8 +195,11 @@ def add_arguments(self, parser: argparse.ArgumentParser) -> None: env_var="DYN_TRTLLM_PUBLISH_METRICS", default=False, help=( - "Publish TensorRT-LLM iteration and Prometheus metrics. This does " - "not publish KV cache events; use --publish-kv-events for that." + "Expose TensorRT-LLM iteration and request metrics on this " + "worker's Prometheus endpoint, and publish the Planner's " + "forward-pass metrics, which read the same iteration " + "statistics. This does not publish KV cache events; use " + "--publish-kv-events for that." ), dest="publish_metrics", ) diff --git a/components/src/dynamo/trtllm/publisher.py b/components/src/dynamo/trtllm/publisher.py index 06d660c35001..66d9fa543c2e 100644 --- a/components/src/dynamo/trtllm/publisher.py +++ b/components/src/dynamo/trtllm/publisher.py @@ -494,7 +494,9 @@ class Publisher: Retrieves KV cache events and stats from TensorRT-LLM engine and publishes them: - KV Events: Routes to either ZMQ (if consolidator enabled) or NATS (if no consolidator) - - Metrics: Always publishes to NATS via WorkerMetricsPublisher + - Metrics: Worker-load samples via WorkerMetricsPublisher and, when opted in, + forward-pass metrics via FpmDirectPublisher; both read the engine's + iteration stats, which KV events never need Publisher Selection Logic: - If zmq_endpoint provided: Uses ZmqKvEventPublisher (ZMQ PUB) → Consolidator → NATS @@ -525,6 +527,7 @@ def __init__( kv_state_endpoint: Optional[str] = None, image_token_id: Optional[int] = None, publish_metrics: bool = True, + publish_forward_pass_metrics: bool = False, kv_event_publication_mode: KvEventPublicationMode = KvEventPublicationMode.DISABLED, streaming_kv_events_config: Optional[dict[str, Any]] = None, streaming_kv_events_gpus_per_node: Optional[int] = None, @@ -544,6 +547,7 @@ def __init__( self.kv_state_endpoint = kv_state_endpoint self.image_token_id = image_token_id self.publish_metrics = publish_metrics + self.publish_forward_pass_metrics = publish_forward_pass_metrics self.kv_event_publication_mode = kv_event_publication_mode self.streaming_kv_events_config = streaming_kv_events_config self.streaming_kv_events_gpus_per_node = streaming_kv_events_gpus_per_node @@ -604,7 +608,13 @@ async def _create_metrics_publisher_endpoint(self): await self.metrics_publisher.create_endpoint(self.endpoint) def initialize(self) -> None: - if self.publish_metrics: + # One stats stream feeds the Prometheus gauges, the metrics collector, + # the router's worker-load sample and the Planner's forward-pass + # metrics, so it runs when either opt-in is set. KV events never need + # it: the engine only produces iteration stats under + # enable_iter_perf_stats, at a per-iteration cost a KV-router benchmark + # should not pay. + if self.publish_metrics or self.publish_forward_pass_metrics: self.metrics_publisher = WorkerMetricsPublisher() self._init_publish_metrics_thread() task = asyncio.create_task(self._create_metrics_publisher_endpoint()) @@ -616,7 +626,7 @@ def initialize(self) -> None: # attention-DP rank. Non-attention-DP engines report size 1. Under # attention-DP, TRT-LLM emits one IterationStats row per rank and # Dynamo forwards attentionDpRank as the FPM dp_rank. - if self.publish_metrics: + if self.publish_forward_pass_metrics: try: fpm_dp_size = max(1, int(self.attention_dp_size or 1)) self.fpm_publisher = FpmDirectPublisher( @@ -849,9 +859,9 @@ def _disable_fpm_publisher(self) -> None: self.fpm_publisher = None async def _publish_stats_task(self): - """ - Publish stats to the metrics publisher. - """ + """Poll engine iteration stats into the Prometheus gauges, the metrics + collector, the worker-load publisher and, when opted in, the Planner's + forward-pass publisher.""" if self.engine is None: logging.error("LLM engine not initialized!") return @@ -1327,6 +1337,7 @@ async def get_publisher( kv_state_endpoint: Optional[str] = None, image_token_id: Optional[int] = None, publish_metrics: bool = True, + publish_forward_pass_metrics: bool = False, kv_event_publication_mode: KvEventPublicationMode = KvEventPublicationMode.DISABLED, streaming_kv_events_config: Optional[dict[str, Any]] = None, streaming_kv_events_gpus_per_node: Optional[int] = None, @@ -1346,6 +1357,7 @@ async def get_publisher( kv_state_endpoint=kv_state_endpoint, image_token_id=image_token_id, publish_metrics=publish_metrics, + publish_forward_pass_metrics=publish_forward_pass_metrics, kv_event_publication_mode=kv_event_publication_mode, streaming_kv_events_config=streaming_kv_events_config, streaming_kv_events_gpus_per_node=streaming_kv_events_gpus_per_node, diff --git a/components/src/dynamo/trtllm/tests/test_trtllm_fpm_publisher.py b/components/src/dynamo/trtllm/tests/test_trtllm_fpm_publisher.py index 801a0bca91ee..33ea7f682e80 100644 --- a/components/src/dynamo/trtllm/tests/test_trtllm_fpm_publisher.py +++ b/components/src/dynamo/trtllm/tests/test_trtllm_fpm_publisher.py @@ -295,7 +295,7 @@ def _build_publisher_stub( monkeypatch, *, attention_dp_size: int, - fpm_enabled: bool, + publish_forward_pass_metrics: bool, publish_metrics: bool = True, kv_event_publication_mode: publisher_mod.KvEventPublicationMode = publisher_mod.KvEventPublicationMode.POLLING, ): @@ -320,11 +320,11 @@ def _build_publisher_stub( pub.kv_state_endpoint = None pub.image_token_id = None pub.publish_metrics = publish_metrics + pub.publish_forward_pass_metrics = publish_forward_pass_metrics pub.kv_event_publication_mode = kv_event_publication_mode pub.streaming_kv_events_config = None pub.streaming_kv_events_gpus_per_node = None pub.attention_dp_size = attention_dp_size - pub.fpm_enabled = fpm_enabled pub.processing_initial_created_events = True pub.metrics_publisher = None pub.fpm_publisher = None @@ -372,7 +372,7 @@ def test_streaming_kv_events_create_direct_subscribers_without_engine_polling( pub, module, _ = _build_publisher_stub( monkeypatch, attention_dp_size=2, - fpm_enabled=True, + publish_forward_pass_metrics=True, ) pub.kv_event_publication_mode = publisher_mod.KvEventPublicationMode.STREAMING pub.streaming_kv_events_config = { @@ -419,10 +419,11 @@ def test_streaming_kv_event_endpoint_offset_matches_trtllm_streaming_manager( def test_publisher_initialize_constructs_fpm_direct_publisher_when_fpm_enabled( monkeypatch, ): - """Under non-attention-DP (attention_dp_size == 1, fpm_enabled == True), - Publisher.initialize() constructs FpmDirectPublisher with dp_size=1.""" + """Under non-attention-DP (attention_dp_size == 1), the forward-pass + metrics opt-in makes Publisher.initialize() construct FpmDirectPublisher + with dp_size=1.""" pub, _publisher_mod, fake_fpm_cls = _build_publisher_stub( - monkeypatch, attention_dp_size=1, fpm_enabled=True + monkeypatch, attention_dp_size=1, publish_forward_pass_metrics=True ) pub.initialize() fake_fpm_cls.assert_called_once() @@ -432,35 +433,78 @@ def test_publisher_initialize_constructs_fpm_direct_publisher_when_fpm_enabled( assert pub.fpm_publisher is not None -def test_publisher_initialize_metrics_only_does_not_start_kv_events(monkeypatch): +def test_publisher_initialize_metrics_only_starts_stats_without_fpm(monkeypatch): + """The Publisher's two gates stay independent: the stats thread follows + either opt-in, the Planner publisher only the forward-pass one. Resolving + `--publish-metrics` into both is the config layer's job, covered by + test_trtllm_unit.py.""" pub, _publisher_mod, fake_fpm_cls = _build_publisher_stub( monkeypatch, attention_dp_size=1, - fpm_enabled=True, + publish_forward_pass_metrics=False, publish_metrics=True, kv_event_publication_mode=publisher_mod.KvEventPublicationMode.DISABLED, ) pub.initialize() - fake_fpm_cls.assert_called_once() + fake_fpm_cls.assert_not_called() + assert pub.metrics_publisher is not None + assert pub.fpm_publisher is None pub._init_publish_metrics_thread.assert_called_once() pub._init_publish_kv_cache_events_thread.assert_not_called() -def test_publisher_initialize_kv_events_only_does_not_start_metrics(monkeypatch): +def test_publisher_initialize_kv_events_only_does_not_start_stats(monkeypatch): + """KV events never need iteration stats, so neither stats-fed publisher + nor the stats thread comes up.""" pub, _publisher_mod, fake_fpm_cls = _build_publisher_stub( monkeypatch, attention_dp_size=1, - fpm_enabled=True, + publish_forward_pass_metrics=False, publish_metrics=False, ) pub.initialize() fake_fpm_cls.assert_not_called() + assert pub.metrics_publisher is None pub._init_publish_metrics_thread.assert_not_called() pub._init_publish_kv_cache_events_thread.assert_called_once() +def test_publisher_initialize_fpm_only_starts_stats_and_planner_publisher( + monkeypatch, +): + pub, _publisher_mod, fake_fpm_cls = _build_publisher_stub( + monkeypatch, + attention_dp_size=1, + publish_forward_pass_metrics=True, + publish_metrics=False, + kv_event_publication_mode=publisher_mod.KvEventPublicationMode.DISABLED, + ) + pub.initialize() + + fake_fpm_cls.assert_called_once() + assert pub.metrics_publisher is not None + pub._init_publish_metrics_thread.assert_called_once() + pub._init_publish_kv_cache_events_thread.assert_not_called() + + +def test_publisher_initialize_without_any_opt_in_starts_no_threads(monkeypatch): + pub, _publisher_mod, fake_fpm_cls = _build_publisher_stub( + monkeypatch, + attention_dp_size=1, + publish_forward_pass_metrics=False, + publish_metrics=False, + kv_event_publication_mode=publisher_mod.KvEventPublicationMode.DISABLED, + ) + pub.initialize() + + fake_fpm_cls.assert_not_called() + assert pub.metrics_publisher is None + pub._init_publish_metrics_thread.assert_not_called() + pub._init_publish_kv_cache_events_thread.assert_not_called() + + def _publisher_for_kv_event_test(): pub = publisher_mod.Publisher.__new__(publisher_mod.Publisher) pub.additional_metrics = None @@ -600,7 +644,7 @@ def test_publisher_initializes_fpm_publisher_under_attention_dp(monkeypatch): """Under attention-DP (attention_dp_size > 1), Publisher.initialize() constructs one FpmDirectPublisher channel per attention-DP rank.""" pub, _publisher_mod, fake_fpm_cls = _build_publisher_stub( - monkeypatch, attention_dp_size=4, fpm_enabled=False + monkeypatch, attention_dp_size=4, publish_forward_pass_metrics=True ) pub.initialize() fake_fpm_cls.assert_called_once() diff --git a/components/src/dynamo/trtllm/tests/test_trtllm_unit.py b/components/src/dynamo/trtllm/tests/test_trtllm_unit.py index 24e1fb59fecb..6a8e7ef45314 100644 --- a/components/src/dynamo/trtllm/tests/test_trtllm_unit.py +++ b/components/src/dynamo/trtllm/tests/test_trtllm_unit.py @@ -513,19 +513,52 @@ def test_streaming_kv_events_accept_python_v2_cache_manager(monkeypatch): @pytest.mark.parametrize( - ("publish_flags", "expected_iter_perf_stats"), + ("cli_args", "fpm_port_env", "expected"), [ - (["--publish-kv-events"], False), - (["--publish-metrics"], True), - (["--publish-kv-events", "--publish-metrics"], True), - (["--publish-events-and-metrics"], True), + ([], None, False), + (["--fpm-trace"], None, True), + ([], "20380", True), + (["--publish-kv-events"], None, False), + (["--publish-metrics"], None, True), + (["--publish-kv-events", "--publish-metrics"], None, True), + ], +) +def test_config_publish_forward_pass_metrics_opt_in( + monkeypatch, cli_args, fpm_port_env, expected +): + """The Planner's forward-pass metrics follow the opt-in shared with vLLM + and SGLang, plus --publish-metrics, which already pays for the iteration + statistics both read. --publish-kv-events alone never enables them.""" + monkeypatch.delenv("DYN_FORWARDPASS_METRIC_PORT", raising=False) + # Config.validate writes DYN_FPM_TRACE back; setenv restores it on teardown. + monkeypatch.setenv("DYN_FPM_TRACE", "0") + if fpm_port_env is not None: + monkeypatch.setenv("DYN_FORWARDPASS_METRIC_PORT", fpm_port_env) + + config = parse_args(["--model", "fake-model", *cli_args]) + + assert config.publish_forward_pass_metrics is expected + + +@pytest.mark.parametrize( + ("publish_flags", "fpm_port_env", "expected_iter_perf_stats"), + [ + (["--publish-kv-events"], None, False), + (["--publish-metrics"], None, True), + (["--fpm-trace"], None, True), + ([], "20380", True), + ([], None, False), + (["--publish-kv-events", "--publish-metrics"], None, True), + (["--publish-events-and-metrics"], None, True), ], ) @pytest.mark.asyncio async def test_init_llm_worker_engine_args_without_overrides( - monkeypatch, publish_flags, expected_iter_perf_stats + monkeypatch, publish_flags, fpm_port_env, expected_iter_perf_stats ): - """KV events and metrics control their respective engine paths independently.""" + """Iteration stats follow --publish-metrics and the forward-pass metrics + opt-in, never --publish-kv-events alone; the engine-level + return_perf_metrics default stays off regardless.""" monkeypatch.delenv("DYN_TRTLLM_MAX_NUM_TOKENS", raising=False) monkeypatch.delenv("DYN_TRTLLM_MAX_BATCH_SIZE", raising=False) monkeypatch.delenv("DYN_TRTLLM_EXTRA_ENGINE_ARGS", raising=False) @@ -533,6 +566,10 @@ async def test_init_llm_worker_engine_args_without_overrides( monkeypatch.delenv("DYN_TRTLLM_PUBLISH_KV_EVENTS", raising=False) monkeypatch.delenv("DYN_TRTLLM_PUBLISH_METRICS", raising=False) monkeypatch.delenv("DYN_TRTLLM_PUBLISH_EVENTS_AND_METRICS", raising=False) + monkeypatch.delenv("DYN_FORWARDPASS_METRIC_PORT", raising=False) + monkeypatch.setenv("DYN_FPM_TRACE", "0") + if fpm_port_env is not None: + monkeypatch.setenv("DYN_FORWARDPASS_METRIC_PORT", fpm_port_env) if publish_flags == ["--publish-events-and-metrics"]: with pytest.warns( diff --git a/components/src/dynamo/trtllm/workers/llm_worker.py b/components/src/dynamo/trtllm/workers/llm_worker.py index cdd442275e00..f247cd5dcd1b 100644 --- a/components/src/dynamo/trtllm/workers/llm_worker.py +++ b/components/src/dynamo/trtllm/workers/llm_worker.py @@ -425,9 +425,14 @@ async def init_llm_worker( # and `--override-engine-args` are merged over `arg_map` below and can set # it back to true for custom instrumentation. "return_perf_metrics": False, - # Iteration stats drive the metrics-publishing path but are independent - # of KV-event publication. TensorRT backend always has this enabled. - "enable_iter_perf_stats": config.publish_metrics, + # Iteration stats feed the Prometheus surface and the Planner's + # forward-pass metrics, so either opt-in needs them. KV events do not: + # the engine only produces iteration stats under this flag, at a + # measurable per-iteration throughput cost. TensorRT backend always + # has this enabled. + "enable_iter_perf_stats": ( + config.publish_metrics or config.publish_forward_pass_metrics + ), "kv_connector_config": kv_connector_config, } @@ -989,6 +994,7 @@ async def init_llm_worker( if ( kv_event_publication_mode is not KvEventPublicationMode.DISABLED or config.publish_metrics + or config.publish_forward_pass_metrics ): # Initialize the independently gated KV-event and metrics publishers. # Use model as fallback if served_model_name is not provided @@ -1041,6 +1047,7 @@ async def init_llm_worker( kv_state_endpoint=config.kv_state_endpoint, image_token_id=image_token_id, publish_metrics=config.publish_metrics, + publish_forward_pass_metrics=config.publish_forward_pass_metrics, kv_event_publication_mode=kv_event_publication_mode, streaming_kv_events_config=streaming_kv_events_config, streaming_kv_events_gpus_per_node=gpus_per_node, diff --git a/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/dp-rank-routing.md b/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/dp-rank-routing.md index 72b76f7bad77..472dfb8063aa 100644 --- a/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/dp-rank-routing.md +++ b/docs/fern/pages/developer-guide/additional-resources/tensorrt-llm-details/dp-rank-routing.md @@ -70,10 +70,13 @@ python3 -m dynamo.frontend --router-mode kv The `--enable-attention-dp` flag sets `attention_dp_size = tensor_parallel_size` and configures Dynamo to publish KV events per DP rank. The router automatically creates routing targets for each `(worker_id, dp_rank)` combination. -`--publish-kv-events` enables KV-event generation and publication. Add -`--publish-metrics` when the worker should also publish TensorRT-LLM iteration -and Prometheus metrics. The deprecated `--publish-events-and-metrics` flag -enables both controls for one compatibility release. +`--publish-kv-events` enables KV-event generation and publication and nothing +else. Add `--publish-metrics` when the worker should also expose TensorRT-LLM +metrics on its own Prometheus endpoint and publish the Planner's forward-pass +metrics, or `--fpm-trace` or `DYN_FORWARDPASS_METRIC_PORT` when the Planner +needs those metrics without the Prometheus surface. The deprecated +`--publish-events-and-metrics` flag enables both publishing controls for one +compatibility release. > [!NOTE] > Attention DP requires TRT-LLM's PyTorch backend. AutoDeploy does not support attention DP. diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/tensorrt-llm/observability.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/tensorrt-llm/observability.md index c03fe1a02c58..6a40653a0783 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/tensorrt-llm/observability.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/tensorrt-llm/observability.md @@ -51,10 +51,23 @@ $ DYN_SYSTEM_PORT=8081 python -m dynamo.trtllm --model \ **Note:** The `backend` must be set to `"pytorch"` for metrics collection (enforced in `components/src/dynamo/trtllm/main.py`). TensorRT-LLM's `MetricsCollector` integration has only been tested/validated with the PyTorch backend. -KV-event publication is configured independently with `--publish-kv-events`. -Use both flags when a worker must publish both event and metric telemetry. For -backward compatibility, the deprecated `--publish-events-and-metrics` flag -continues to enable both controls for one release. +`--publish-metrics` exposes metrics on this worker's own endpoint. It also +publishes the per-rank used-block count that the frontend's optional +`--active-decode-blocks-threshold` reads. The KV router's per-worker scoring +(`worker_logit`) never reads that sample — it takes overlap from KV events and +load from its own active-sequence tracking — so enabling `--publish-metrics` +does not change KV-aware ranking. It is not inert, though: with that threshold +set, the published count is OR-ed with the router's own decode-block estimate, +and a worker marked overloaded leaves the candidate set until it recovers. + +Because the Planner's forward-pass metrics read the same iteration statistics, +`--publish-metrics` publishes those too; `--fpm-trace` and +`DYN_FORWARDPASS_METRIC_PORT`, the opt-in the other backends use, enable them +without the Prometheus surface. KV-event publication is configured +independently with `--publish-kv-events`. Use both publishing flags when a +worker must publish both event and metric telemetry. For backward +compatibility, the deprecated `--publish-events-and-metrics` flag continues to +enable both controls for one release. Wait for the TensorRT-LLM worker to start, then send requests and check metrics: @@ -217,7 +230,7 @@ TensorRT-LLM provides extensive performance data beyond the basic Prometheus met - **Prometheus Integration**: Uses the `MetricsCollector` class from `tensorrt_llm.metrics` (see [collector.py](https://github.com/NVIDIA/TensorRT-LLM/blob/main/tensorrt_llm/metrics/collector.py)) - **Dynamo Integration**: Uses `register_engine_metrics_callback()` function with `metric_prefix_filter=["trtllm_"]` -- **Engine Configuration**: `LlmArgs.return_perf_metrics` remains `False`. It enables TensorRT-LLM's detailed per-step timing collector, whose `time_breakdown_metrics` payload Dynamo never reads and which costs measurable throughput. `--publish-metrics` enables only `enable_iter_perf_stats`, which Dynamo needs for iteration and Prometheus metrics. +- **Engine Configuration**: `LlmArgs.return_perf_metrics` remains `False`. It enables TensorRT-LLM's detailed per-step timing collector, whose `time_breakdown_metrics` payload Dynamo never reads and which costs measurable throughput. `--publish-metrics` and the forward-pass metrics opt-in each enable `enable_iter_perf_stats`: one stats stream feeds the Prometheus gauges, the worker-load publisher and the Planner's forward-pass metrics alike. `--publish-kv-events` alone leaves it off, because KV events do not need iteration statistics and collecting them costs per-iteration throughput. - **Per-request Metrics**: `SamplingParams.return_perf_metrics` is a separate switch that follows `--publish-metrics`. Token usage reporting, including `usage.prompt_tokens_details.cached_tokens`, is unaffected either way: it comes from the engine's own cached-token count, not from `request_perf_metrics`. - **Request Arrival Timestamp**: When engine-level metrics are off, TensorRT-LLM stamps request arrival during C++ request construction rather than at Python submission, so E2E latency, TTFT, and queue time exclude some submission and IPC time. Other request timing fields keep their existing anchors. - **Initialization**: Metrics appear after TensorRT-LLM engine initialization completes diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/planner/overview.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/planner/overview.md index 363925545890..3e05efb1355b 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/planner/overview.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/planner/overview.md @@ -159,7 +159,7 @@ Load-based scaling has the following known limitations. Throughput-based scaling **Requires ForwardPassMetrics (FPM).** Load-based scaling uses per-engine per-iteration metrics delivered via the Dynamo event plane (ForwardPassMetrics). The KV Router is **not** required for load-based scaling. FPM availability by backend: - **vLLM** — supported. Automatically enabled when the engine uses `InstrumentedScheduler` and `DYN_FORWARDPASS_METRIC_PORT` is set. -- **TensorRT-LLM** — supported, including attention-DP when the runtime emits the required iteration statistics. Dynamo publishes one FPM channel per attention-DP rank and disables FPM emission if the runtime schema is missing required fields. +- **TensorRT-LLM** — supported, including attention-DP. Enabled with `--fpm-trace`, `DYN_FORWARDPASS_METRIC_PORT` or `--publish-metrics`, each of which also turns on the engine's `enable_iter_perf_stats`; `--publish-kv-events` does not enable it. Dynamo publishes one FPM channel per attention-DP rank and disables FPM emission if the runtime schema is missing required fields. - **SGLang** — supported. Enabled when `DYN_FORWARDPASS_METRIC_PORT` is set; requires the upstream FPM module, which ships in the SGLang runtime as of `sglang==0.5.13.post1` (SGLang >= v0.5.13). See the [SGLang FPM section](../backends/sglang/observability.md#forward-pass-metrics-fpm). ### General diff --git a/docs/fern/pages/reference/backends/tensorrt-llm-configuration.mdx b/docs/fern/pages/reference/backends/tensorrt-llm-configuration.mdx index c2f0c5de7cd9..7298f21ccb30 100644 --- a/docs/fern/pages/reference/backends/tensorrt-llm-configuration.mdx +++ b/docs/fern/pages/reference/backends/tensorrt-llm-configuration.mdx @@ -155,13 +155,13 @@ Each field is both a CLI flag and an environment variable. The CLI flag takes pr - Publish KV cache events to the Dynamo KV router, enabling KV-aware routing and disaggregated KV transfer. This flag does not enable TensorRT-LLM metric reporting. The deprecated `--publish-events-and-metrics` flag enables both this flag and `--publish-metrics`. + Publish KV cache events to the Dynamo KV router, enabling KV-aware routing and disaggregated KV transfer. This flag does not enable TensorRT-LLM iteration statistics: use `--publish-metrics` for Prometheus metrics, and `--fpm-trace` or `DYN_FORWARDPASS_METRIC_PORT` for the Planner's forward-pass metrics. The deprecated `--publish-events-and-metrics` flag enables both this flag and `--publish-metrics`. Environment variable: `DYN_TRTLLM_PUBLISH_KV_EVENTS` - Publish TensorRT-LLM iteration and Prometheus metrics. This flag does not publish KV cache events. It enables `enable_iter_perf_stats` but keeps the engine's `return_perf_metrics` disabled. + Expose TensorRT-LLM iteration and request metrics on this worker's Prometheus endpoint, and publish the Planner's forward-pass metrics, which read the same iteration statistics. This flag does not publish KV cache events. It enables `enable_iter_perf_stats` and the per-request `SamplingParams.return_perf_metrics`, but keeps the engine's `return_perf_metrics` disabled. The same iteration statistics carry the per-rank used-block count read by the frontend's optional `--active-decode-blocks-threshold`. The KV router's per-worker scoring never reads that sample, so this flag does not change KV-aware ranking; with that threshold set, the count is OR-ed with the router's own decode-block estimate and can mark a worker overloaded, which removes it from the candidate set until it recovers. Environment variable: `DYN_TRTLLM_PUBLISH_METRICS` diff --git a/docs/fern/pages/reference/observability/forward-pass-metrics-traces.mdx b/docs/fern/pages/reference/observability/forward-pass-metrics-traces.mdx index 44ff82f684d7..7d2fdc854040 100644 --- a/docs/fern/pages/reference/observability/forward-pass-metrics-traces.mdx +++ b/docs/fern/pages/reference/observability/forward-pass-metrics-traces.mdx @@ -37,10 +37,12 @@ precedence when set. It cannot add a missing Dynamo relay to an unsupported topo | SGLang (`python -m dynamo.sglang`) | Aggregated, prefill, decode, or LLM diffusion, including `--enable-multimodal` without a dedicated encoder | Supported | | SGLang (`python -m dynamo.sglang`) | Embedding or dedicated multimodal encoder | Not supported; Dynamo warns and does not auto-enable FPM | | SGLang (`python -m dynamo.sglang`) | Image diffusion, video generation, or snapshot mode | Not supported | -| TensorRT-LLM and mocker | Direct-publisher paths | Persistence supported; no Python relay activation is required | +| TensorRT-LLM (`python -m dynamo.trtllm`) | Aggregated, prefill, or decode | Supported; also enables the engine's `enable_iter_perf_stats`. `--publish-metrics` enables FPM too, since it turns the same statistics on | +| Mocker | Direct-publisher path | Persistence supported; forward-pass metrics are always published | For vLLM, an explicit `DYN_FORWARDPASS_METRIC_PORT` wins; otherwise trace activation uses port -`20380`. SGLang uses its existing per-worker IPC endpoint. +`20380`. SGLang uses its existing per-worker IPC endpoint. TensorRT-LLM publishes in-process, so +the port value is unused, but setting the variable still opts the worker in. ## Capture Modes diff --git a/tests/utils/payloads.py b/tests/utils/payloads.py index 4919cd5966cc..363bb1e63835 100644 --- a/tests/utils/payloads.py +++ b/tests/utils/payloads.py @@ -2248,6 +2248,9 @@ class TRTLLMMetricsPayload(MetricsPayload): def _get_backend_specific_checks(self) -> list[MetricCheck]: """TRT-LLM-specific metric checks""" + component_prefix = prometheus_names.name_prefix.COMPONENT + total_blocks = f"{component_prefix}_{prometheus_names.kvstats.TOTAL_BLOCKS}" + checks = [ MetricCheck( # Check: Minimum count of unique trtllm_* metrics @@ -2263,7 +2266,54 @@ def _get_backend_specific_checks(self) -> list[MetricCheck]: f"SUCCESS: Found {len(set(value))} unique trtllm_* metrics (minimum required: 4)" ), multiline=True, - ) + ), + # The checks above and in the base class count metric *names* and + # accept a zero block count. Prometheus registers names when the + # collector is constructed, so both pass on a worker whose stats + # thread never published a sample and whose engine never recorded + # a request. The two checks below require an observation on each + # path, so one going dead cannot pass as the other still working. + MetricCheck( + # Stats path: the per-rank gauges are seeded at 0 by + # _init_publish_metrics_thread and only move when iteration + # stats arrive from the engine. Any rank reporting a positive + # block count proves the polling thread published. + name=f"{total_blocks} (positive on some rank)", + pattern=lambda name: ( + rf"{total_blocks}(?:\{{[^}}]*\}})?\s+([\d.eE+-]+)" + ), + validator=lambda value: any(float(v) > 0 for v in value), + error_msg=lambda name, value: ( + f"{name}: every rank reported a non-positive block count " + f"(values: {value}). The stats polling thread never " + f"published iteration stats." + ), + success_msg=lambda name, value: (f"SUCCESS: {name} (values: {value})"), + multiline=True, + ), + MetricCheck( + # Request path: TRT-LLM's own per-request series, recorded by + # MetricsCollector as requests finish. Several names are + # matched because they come from tensorrt_llm.metrics and one + # upstream rename should not silently void the check. + name="trtllm_* per-request observations", + pattern=lambda name: ( + r"trtllm_(?:request_success_total" + r"|e2e_request_latency_seconds_count" + r"|time_to_first_token_seconds_count" + r"|time_per_output_token_seconds_count" + r"|request_queue_time_seconds_count)" + r"(?:\{[^}]*\})?\s+([\d.eE+-]+)" + ), + validator=lambda value: any(float(v) > 0 for v in value), + error_msg=lambda name, value: ( + f"{name}: TRT-LLM recorded no per-request observations " + f"(values: {value}). The engine's request metrics are not " + f"reaching the collector." + ), + success_msg=lambda name, value: (f"SUCCESS: {name} (values: {value})"), + multiline=True, + ), ] # Check required labels: auto-injected (from prometheus_names.labels) + injected by backend From cfbd80c38efd5d208196005c4d2d0de1895bad39 Mon Sep 17 00:00:00 2001 From: Jasim Kareem <219012065+Prudctual@users.noreply.github.com> Date: Thu, 24 Sep 2026 05:42:03 +0000 Subject: [PATCH 191/191] fix(runtime): carry typed pre-stream errors on QUIC response plane QUIC Error frames were still raw UTF-8, so a worker ErrorType was dropped. Tag typed payloads with dynamo.quic.typed_error and leave untagged JSON as the legacy message. Co-authored-by: Prudctual Signed-off-by: Jasim Kareem <219012065+Prudctual@users.noreply.github.com> --- .../pipeline/network/ingress/push_handler.rs | 15 +- .../src/pipeline/network/quic_response.rs | 175 +++++++++++++++++- 2 files changed, 180 insertions(+), 10 deletions(-) diff --git a/lib/runtime/src/pipeline/network/ingress/push_handler.rs b/lib/runtime/src/pipeline/network/ingress/push_handler.rs index b962e78c7009..6b2cb875144c 100644 --- a/lib/runtime/src/pipeline/network/ingress/push_handler.rs +++ b/lib/runtime/src/pipeline/network/ingress/push_handler.rs @@ -155,10 +155,8 @@ trait ResponsePublisher { /// Send a failure prologue keeping the worker's [`crate::error::ErrorType`] /// where the transport can carry it. /// - /// The default drops the type and sends the text alone. That is what the - /// QUIC response plane does: its error frame is a raw byte payload with no - /// field to put a typed error in, so a typed refusal over QUIC classifies - /// exactly as it did before this method existed. + /// The default drops the type and sends the text alone. TCP and QUIC + /// override this so a typed refusal survives the response plane. async fn send_prologue_typed( &mut self, error: Option, @@ -188,6 +186,15 @@ impl ResponsePublisher for quic_response::QuicResponseSender { .map_err(anyhow::Error::msg) } + async fn send_prologue_typed( + &mut self, + error: Option, + ) -> anyhow::Result<()> { + quic_response::QuicResponseSender::send_prologue_typed(self, error) + .await + .map_err(anyhow::Error::msg) + } + async fn finish(&mut self) -> anyhow::Result<()> { quic_response::QuicResponseSender::finish(self).await } diff --git a/lib/runtime/src/pipeline/network/quic_response.rs b/lib/runtime/src/pipeline/network/quic_response.rs index a7c31035917c..7e8c859d73a2 100644 --- a/lib/runtime/src/pipeline/network/quic_response.rs +++ b/lib/runtime/src/pipeline/network/quic_response.rs @@ -44,7 +44,9 @@ use tokio_util::sync::CancellationToken; use uuid::Uuid; use xxhash_rust::xxh3::xxh3_64; -use super::{ConnectionInfo, RegisteredStream, StreamPrologueError, StreamReceiver}; +use super::{ + ConnectionInfo, RegisteredStream, ResponseStreamPrologue, StreamPrologueError, StreamReceiver, +}; use crate::{ config::environment_names::quic_response, discovery::EndpointInstanceId, engine::AsyncEngineContext, pipeline::PipelineError, @@ -178,6 +180,7 @@ impl TryFrom for QuicResponseConnectionInfo { enum FrameKind { Prologue = 1, Data = 2, + /// Terminal pre-stream failure. Payload layout is [`QUIC_TYPED_ERROR_KIND`]. Error = 3, End = 4, Stop = 5, @@ -237,6 +240,65 @@ impl Frame { } } +/// Typed [`FrameKind::Error`] payloads are JSON tagged with this `kind`. +/// +/// Untyped errors stay raw UTF-8 so a mixed-version frontend still sees the +/// worker's text. A current frontend accepts only this discriminant and +/// recovers [`ResponseStreamPrologue`]. An older frontend reads the payload as +/// UTF-8 and treats the object as the message. Untagged JSON, including a +/// decoy `{"error","code"}` object, stays that message. The protocol version +/// stays 3 because those bytes are already valid UTF-8 for an old decoder. +const QUIC_TYPED_ERROR_KIND: &str = "dynamo.quic.typed_error"; + +/// JSON object carrying [`QUIC_TYPED_ERROR_KIND`] and a [`ResponseStreamPrologue`]. +#[derive(Serialize, Deserialize)] +struct QuicTypedErrorWire { + kind: String, + #[serde(flatten)] + prologue: ResponseStreamPrologue, +} + +/// Encode a pre-stream error for [`FrameKind::Error`]. +fn encode_error_payload(error: StreamPrologueError) -> Bytes { + let Some(typed_error) = error.typed_error else { + return Bytes::from(error.message); + }; + let wire = QuicTypedErrorWire { + kind: QUIC_TYPED_ERROR_KIND.to_string(), + prologue: ResponseStreamPrologue { + error: Some(error.message), + typed_error: Some(typed_error), + }, + }; + match serde_json::to_vec(&wire) { + Ok(bytes) => Bytes::from(bytes), + Err(err) => { + tracing::error!( + error = %err, + "QUIC error prologue did not serialize; sending untyped text" + ); + Bytes::from(wire.prologue.error.unwrap_or_default()) + } + } +} + +/// Decode a [`FrameKind::Error`] payload. +fn decode_error_payload(payload: &[u8]) -> Result { + if payload.first() == Some(&b'{') + && let Ok(wire) = serde_json::from_slice::(payload) + && wire.kind == QUIC_TYPED_ERROR_KIND + && let Some(message) = wire.prologue.error + { + return Ok(StreamPrologueError { + message, + typed_error: wire.prologue.typed_error, + }); + } + let message = String::from_utf8(payload.to_vec()) + .context("QUIC response terminal error was not UTF-8")?; + Ok(StreamPrologueError::from_message(message)) +} + async fn read_frame(recv: &mut R) -> Result where R: AsyncRead + Unpin, @@ -1204,8 +1266,7 @@ async fn process_server_frame( } } FrameKind::Error => { - let error = String::from_utf8(frame.payload.to_vec()) - .context("QUIC response terminal error was not UTF-8")?; + let error = decode_error_payload(&frame.payload)?; let pending = state .registration(frame.registration_id) .lock() @@ -1222,7 +1283,7 @@ async fn process_server_frame( bundle_id ); } - let _ = pending.connection.send(Err(error.into())); + let _ = pending.connection.send(Err(error)); remove_registration(state, frame.registration_id); } else { send_control(control_tx, FrameKind::Reset, frame.registration_id)?; @@ -2038,11 +2099,19 @@ impl QuicResponseSender { } pub async fn send_prologue(&mut self, error: Option) -> Result<(), String> { + self.send_prologue_typed(error.map(StreamPrologueError::from_message)) + .await + } + + pub async fn send_prologue_typed( + &mut self, + error: Option, + ) -> Result<(), String> { if self.prologue_sent { return Err("QUIC response prologue already sent".to_string()); } let (kind, payload, terminal) = match error { - Some(error) => (FrameKind::Error, Bytes::from(error), true), + Some(error) => (FrameKind::Error, encode_error_payload(error), true), None => (FrameKind::Prologue, Bytes::new(), false), }; self.enqueue_on( @@ -2284,7 +2353,11 @@ fn decode_hex_digit(value: u8) -> Result { #[cfg(test)] mod tests { use super::*; - use crate::{engine::AsyncEngineContextProvider, pipeline::Context as PipelineContext}; + use crate::{ + engine::AsyncEngineContextProvider, + error::{BackendError, DynamoError, ErrorType}, + pipeline::Context as PipelineContext, + }; fn frame(index: usize) -> Frame { Frame::new(FrameKind::Data, Uuid::nil(), Bytes::from(index.to_string())) @@ -2785,6 +2858,96 @@ mod tests { shutdown.cancel(); } + #[test] + fn error_payload_legacy_utf8_stays_untyped() { + let decoded = decode_error_payload(b"generate failed").unwrap(); + assert_eq!(&*decoded, "generate failed"); + assert!(decoded.typed_error.is_none()); + } + + #[test] + fn error_payload_round_trips_typed_refusal() { + let original = StreamPrologueError::new( + "Generate Error: multimodal input is not supported by this backend", + DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::InvalidArgument)) + .message("multimodal input is not supported by this backend") + .build(), + ); + let payload = encode_error_payload(original.clone()); + assert_eq!(payload.first(), Some(&b'{')); + let encoded = std::str::from_utf8(&payload).expect("typed payload is JSON UTF-8"); + assert!( + encoded.contains(QUIC_TYPED_ERROR_KIND), + "typed payload must carry the wire discriminant; got {encoded}" + ); + + let decoded = decode_error_payload(&payload).unwrap(); + assert_eq!(decoded, original); + assert_eq!( + decoded.typed_error.map(|e| e.error_type()), + Some(ErrorType::Backend(BackendError::InvalidArgument)) + ); + } + + #[test] + fn error_payload_python_envelope_is_not_a_prologue() { + let envelope = br#"{"message":"unsupported media type","code":415}"#; + let decoded = decode_error_payload(envelope).unwrap(); + assert_eq!(decoded.message.as_bytes(), envelope); + assert!( + decoded.typed_error.is_none(), + "a Python HTTP envelope must stay the untyped message, not a prologue" + ); + } + + #[test] + fn error_payload_legacy_json_with_decoy_error_field_is_preserved() { + let envelope = br#"{"error":"failed","code":500}"#; + let decoded = decode_error_payload(envelope).unwrap(); + assert_eq!( + decoded.message.as_bytes(), + envelope, + "untagged legacy JSON must be preserved byte-for-byte" + ); + assert!( + decoded.typed_error.is_none(), + "a decoy error field must not be classified as a typed prologue" + ); + } + + #[tokio::test] + async fn typed_generate_error_survives_the_quic_error_frame() { + let (shutdown, server) = test_server(RESPONSE_BUFFER_CAPACITY); + let pool = test_pool(); + let context = PipelineContext::new(()); + let registered = server.register_response(context.context()); + let (info, provider) = registered.into_parts(); + let mut sender = pool.sender(context.context(), info).await.unwrap(); + sender + .send_prologue_typed(Some(StreamPrologueError::new( + "Generate Error: multimodal input is not supported by this backend", + DynamoError::builder() + .error_type(ErrorType::Backend(BackendError::InvalidArgument)) + .message("multimodal input is not supported by this backend") + .build(), + ))) + .await + .unwrap(); + match provider.await.unwrap() { + Err(error) => { + assert!(error.contains("multimodal input is not supported")); + assert_eq!( + error.typed_error.as_ref().map(|e| e.error_type()), + Some(ErrorType::Backend(BackendError::InvalidArgument)), + "the worker's error type must survive the QUIC error frame" + ); + } + Ok(_) => panic!("terminal error unexpectedly opened a response stream"), + } + shutdown.cancel(); + } + #[tokio::test] async fn cancelled_sender_closes_only_its_logical_response() { let (shutdown, server) = test_server(RESPONSE_BUFFER_CAPACITY);